TowardsDataScience-博客中文翻译-2021-八十六-

news/2024/10/23 9:33:13

TowardsDataScience 博客中文翻译 2021(八十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

内部对齐问题

原文:https://towardsdatascience.com/the-inner-alignment-problem-9eb5f234226b?source=collection_archive---------38-----------------------

播客

埃文·胡宾格谈建立安全和诚实的人工智能

苹果 | 谷歌 | SPOTIFY | 其他

编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。

你怎么知道一个超级智能的 AI 正在努力做你要求它做的事情?

事实证明,答案是:不容易。不幸的是,越来越多的人工智能安全研究人员警告说,如果我们想避免糟糕的结果,这是一个我们必须尽快解决的问题——这可能包括一场物种层面的灾难。

在人工智能安全的背景下,人工智能针对我们要求之外的事情进行优化的故障模式类型被称为内部对齐故障。这与外部对齐失败截然不同,外部对齐失败是指当你要求你的人工智能做一些结果证明是危险的事情时发生的情况,它只是在 2019 年被人工智能安全研究人员视为其自身的风险类别。领导这项工作的研究人员是我本期播客的嘉宾,埃文·胡宾格。

Evan 是一名人工智能安全资深人士,他在 OpenAI 等领先的人工智能实验室进行过研究,他的经验还包括在 Google、Ripple 和 Yelp 工作过。他目前在机器智能研究所(MIRI)担任研究员,并和我一起谈论他对人工智能安全、对齐问题以及人类是否有可能在超智能人工智能出现后生存下来的看法。

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

  • Evan 分享了他的内部对齐失败的玩具示例:他让我们想象一个解决迷宫的人工智能,它在迷宫数据集上训练,以到达给定迷宫的中心。在训练期间,中间的瓷砖被标上了绿色箭头,所以 AI 开发者不知道的是,AI 实际上最终认为它的目标是定位绿色箭头,而不是解决迷宫。因此,当人工智能被置于一个新的设置中时——绿色箭头被移动到一个完全不同的位置,与迷宫的解决方案无关,人工智能无法解决这个新问题。虽然这似乎是一个相当无害的问题,但不难想象在其他情况下,即使开发者认为人工智能正在优化的内容与它实际正在做的事情之间存在轻微的不匹配,也可能变得非常危险。
  • 我们讨论了人工智能安全实际上是否需要更多的研究人员,或者更多的资金。虽然 Evan 认为它通常是这样的——而且有充分的理由认为这是任何人都可以解决的最重要的问题——但我们也讨论了一个小型、紧密聚焦、高信号、低噪音社区的价值。很明显,这是一种权衡:人工智能安全研究需要大量非常仔细的思考,如果该领域被兴趣淹没,并最终根深蒂固的学术激励导致复制危机和其他领域低质量研究的泛滥,这将变得更加困难。
  • 我们从内在一致性的角度探索了许多过程——从进化到养育孩子,再到公司的形成,我发现这部分对话特别有趣。简而言之,宇宙“试图”将人类与基因繁殖的目标联系起来,但失败了(人类发明了避孕药具,并且没有把醒着的每一秒钟都用来研究如何生育),父母试图将他们的孩子与他们的价值观联系起来,但失败了(孩子制定了自己的目标,并欺骗他们的父母试图实现这些目标),社会试图将公司与生产商品的目标联系起来,这些商品为每个人的网络生活增加了更多的价值。 但失败了(公司追求自己的目标,并且很像孩子一样,发展出欺骗周围社会的激励机制,以实现利润最大化)。
  • 埃文认为对齐是一个比智能更难解决的问题。因此,他对我们在建造超级智能系统之前就能找到完整的人工智能校准问题的解决方案持悲观态度。虽然他非常不确定——并强调这一点——但他认为,由于高级人工智能系统带来的风险,人类面临灭绝的可能性超过 50%。尽管如此,风险如此之高,以至于他认为尽管面临挑战,这个问题还是值得正面解决的。

你可以在 Twitter 上关注埃文,或者我在这里。

章节:

  • 0:00 介绍
  • 1:45 AGI 安全研究
  • 8:20 人工智能的能力
  • 14:40 内部对齐
  • 25:12 拟人化这些人工智能系统
  • 29:15 平淡
  • 37:36 透过内在校准的透镜进化
  • 49 时 06 分内部校准失败
  • 54:32 内心校准和养育
  • 1:00:35 初创公司和市场需求
  • 1:03:30 对人工智能调整持乐观态度
  • 1:09:20 总结

非线性回归的有趣世界

原文:https://towardsdatascience.com/the-interesting-world-of-non-linear-regressions-eb0c405fdc97?source=collection_archive---------11-----------------------

或者勒文伯格和马夸特是如何超越最小二乘法的

M. B. M. 在 Unsplash 上拍摄的照片

有时我想,我是否是唯一一个在看到一堆点后试图画出一条不知何故跟随趋势的曲线的人。我想我并不孤单。每个人都有这种直觉。当只有几个点,我画的曲线只是一条直线时,这很容易。但是,每当我添加更多的点,或者当我寻找的曲线不同于直线时,它就变得越来越难。在这种情况下,一个曲线拟合过程就能解决我所有的问题。我承认输入一堆点,找到一条与趋势“完美”匹配的曲线,这是令人兴奋的。但是这是如何工作的呢?为什么拟合直线不同于拟合形状奇怪的曲线。每个人都熟悉线性最小二乘法,但是,当我们试图匹配的表达式不是线性时,会发生什么呢?我问了自己这些问题,这让我踏上了数学文章、堆栈溢出帖子[1]和一些深奥的数学表达式(至少对我来说是这样)的旅程。),还有一个关于发现一种算法的有趣故事。这是我试图用最简单而有效的方式来解释这一切…

问题是

在某些情况下,线性回归是不够的。有时有必要将一系列数据调整为非线性表达式。在这些情况下,普通的最小二乘法对我们不起作用,我们需要求助于不同的方法。我第一次遇到这种情况是在我试图将 2D 数据拟合到一个如下所示的函数时:

等式 1。非线性函数的示例

幸运的是,我有很多方法可以自动找到 Beta 的最佳值。任何熟悉 MATLAB 的 nlinfit 或 SciPy 的 curve_fit 函数的人都知道,一旦有了模型的数学表达式,这个非线性回归过程就很简单了。所有这些库的工作方式都类似,它们使用迭代算法,试图找到使观测数据和模型响应之间的差异最小化的参数或参数组合。让我们用一些等式来表达这个。

假设我们有一个函数 f ,它依赖于一个独立变量 x 和一组参数 a 。这就是 y= f(x,a) 。这个函数正在对一个我们已经知道输出 ŷ 的过程建模。目标是找到一组参数 a ,其导致最接近 y 的可能 ŷ 。测量我们有多接近ŷ的一种方法是计算残差的平方和。残差被定义为每一点上 yŷ 之间的差值。这可以表示为:

等式 2。残留的;剩余的

在这种情况下,下标 i 是指我们正在分析的数据点。如果我们试图调整一条有 100 个数据点的曲线,那么我们需要计算每个点的残差。最后,我们将有一个 r1、r2、r3 等等,直到我们在这个特定的例子中到达 r100 。残差的平方和对应于:

等式 3。残差的平方和

找到产生最低可能值 S 的参数 a 的组合意味着参数 a 是从我们的模型计算的 yŷ 值之间的最佳可能匹配。

显示问题的图解方式

下图用红色显示了一些数据点,用紫色显示了模型响应。如果我们想测量该模型如何调整数据点,我们可以计算数据点( ŷ )和模型响应( y )之间的差异,然后对这些差异的平方和(残差)求和。这个想法可以外推到包含多个独立变量的函数( x1,x2,…xn )。

残差的图形表示(作者使用 Desmos 制作的图形)

解决方案(衍生品)

寻找一个函数的最小值的一个普通方法是计算它对一个特定变量的导数。在这种情况下,我们希望找到使函数 S 最小化的 a 的值。这可以写成:

等式 4。残差平方和关于参数 a 的导数

下标 j 意味着 a 可能有多个值,因为函数 f 取决于独立变量 x 和一个或多个参数 a1,a2,…,aM 。在这种情况下,我们需要对每个参数进行部分求导。一个函数的最小值是在它的导数等于零的地方找到的。所以,我们之前的等式会变成这样:

等式 5。导数等于零以找到最小值/最大值

注意我是如何展开 ri 的,只是为了提醒你这个残差是计算值和真实值之间的差。在这一点上,重要的是有一个导数的图形解释,以及为什么当它们等于零时,我们可以说我们找到了最小值(或最大值)。

用导数最小化函数的图解说明

一个导数可以被定义为一个函数相对于它的自变量如何变化的度量。我们能找到的最简单的例子之一是类型为 y=mx 的函数。这个函数相对于 x ( dy/dx )的导数是 m 。这意味着 x 的每一个微小变化,输出( y )都会变化 m 次。所以这个函数的导数代表在 x 变化后 y 变化了多少。从视觉上看,这可以看作是函数中特定点处切线的斜率。

下图显示了一个与我们之前提到的直线完全不同的函数。在类型为 y=mx,函数中, y 相对于 x 的变化比率总是相同的,而与 x 的值无关。在这种情况下,该比率根据 x 变化。您可以看到图中所示的每个点对于切线具有不同的斜率( m )。这个斜率代表在特定点上计算的函数的导数。寻找函数的最小值和最大值的一种方法是寻找斜率为零的地方。在这种情况下,24.5 的 x 将给出最小值,而 10 的 x 将给出最大值。

衍生产品的图示(作者使用 Desmos 制作的图表)

可能感觉事情开始变得复杂了,但是请耐心听我说。这并不像看起来那么难!如果你熟悉微积分和导数,你会知道推导最后一个方程的结果是:

等式 6。衍生产品的评估结果

df(xi,aj)/daj 对应于函数 f 相对于每个参数 a 的导数。在这一点上,值得记住的是,我们的模型可以包含多个参数 a ,我们需要找到函数 f 相对于这些参数的导数。

请注意,这个计算是针对数据中的每个点进行的。这就是为什么我们的函数 f 依赖于 xiaj :我们有 xi 值和 aj 值。我们可以将所有这些导数汇集成一个术语,称为雅可比。多么奇怪的名字!雅可比矩阵是一个矩阵,它包含一个函数相对于它的每个参数的所有一阶偏导数。

记住下标 i 代表一个特定的数据点。如果我们的数据由 100 个点组成,那么这个雅可比矩阵将有 100 行和 3 列,因为我们有 3 个参数。

如果我们使用雅可比矩阵的概念来重写我们为 dS/da 找到的上一个等式。我们将拥有:

方程式 7。前一个方程的矩阵形式

注意我是如何用矩阵来表达这个方程的。我去掉了和,现在雅可比矩阵和残差都用矩阵表示了。请记住,所有这些方程都是针对所有数据点同时求解的,因此使用矩阵非常方便。在这一点上,我将向您展示两种方法,我们可以用这两种方法来求解这个方程,并找到更好地调整初始方程 f 的参数。

多一点数学知识

梯度下降

你可能听说过这个名字。梯度下降是一种优化算法,用于寻找函数的局部最小值。背后的想法不难理解。因为我们试图最小化的函数是可微的,所以我们知道任意点的梯度。这意味着我们知道我们需要走哪个方向才能继续走下去。在每次迭代中,我们都向函数的最小值靠近一点。梯度下降法的两个重要方面是初始猜测和每次迭代的步长。这种方法的效率高度依赖于这两点。

这和非线性回归有什么关系?嗯,我们可以用梯度下降法找到函数 S 的最小值。在这种情况下,我们朝着最小点采取的每一步都可以表示为:

等式 8。梯度下降步骤

这个 hGD 被添加到参数的初始估计中,并且这个过程被重复,直到我们找到最小值或者我们超过最大迭代次数。出现在最后一个等式中的α用于增加或减少我们正在采取的步骤的大小。正如我之前提到的,梯度下降法的性能与步长以及初始猜测有很大关系。

高斯-牛顿法

梯度下降法是广为人知并被广泛使用的方法,但是根据参数的数量,它可能相当慢。另一种方法是高斯-牛顿法,类似于梯度下降法,这是一个迭代过程,在这个过程中,我们采取多个步骤,直到我们接近正确的解决方案。在这种情况下,我们通过以下方式获得新的参数组合:

等式 9。高斯-牛顿步

其中 hGN 代表我们在高斯-牛顿法中所采取的步骤。如何才能知道每次迭代时 hGN 的值?

在高斯-牛顿法中,函数 f 使用一阶泰勒展开式进行近似,这意味着

方程式 10。泰勒展开

还记得我们说过,项 dfi(a)/daj 也被称为雅可比,所以前面的等式也可以写成:

方程式 11。用雅可比矩阵表示的泰勒展开

如果我们用这个表达式将 f(an) 替换为 f(an+1) ,我们最终得到:

方程式 12。用 f(an+1)代替 f(an)

可以重新组织为:

方程式 13。方程式 12 重新组织

并且使用以下等式来计算该步长:

方程式 14。高斯-牛顿步

下图适用于这两种方法。在这两种情况下,都需要指定参数的初始猜测以及停止标准。在这种情况下,停止标准由最大迭代次数或平方误差的最小值组成。

梯度下降和高斯-牛顿算法流程图

Levenberg-Marquardt 方法或阻尼最小二乘法

注意 hGDhGN 方程非常相似,这与 Levenberg-Marquardt 方法有很大关系。这种方法在梯度下降法和高斯-牛顿法之间切换,取决于我们离解决方案有多近。Levenberg-Marquardt 方法表示为:

方程式 15。勒文伯格-马夸特步骤

在上式中, I 表示单位矩阵,λ称为阻尼因子。该参数允许高斯-牛顿或梯度下降更新之间的变化。当λ较小时,该方法采用高斯-牛顿步骤,当λ较大时,该步骤遵循梯度下降法。一般来说,λ的第一个值很大,因此第一步是在梯度下降方向[2]。这背后的逻辑是高斯-牛顿法对最后的迭代更有效,而梯度下降法在算法离理想解还很远的过程开始时是有用的。

如您所见,Levenberg-Marquardt 算法是梯度下降和高斯-牛顿算法的结合。因此,Levenberg-Marquardt 算法的效率也高度依赖于初始猜测以及阻尼因子的选择[3]。此外,阻尼因子的增减也会影响算法的性能。在每次迭代中,阻尼因子乘以或除以一个因子,该因子取决于前一次迭代的好坏。一般来说,λ增加 2 倍,减少 3 倍。

Levenberg-Marquardt 算法流程图

作为一个有趣的历史旁注,Levenberg 在 1944 年提出了这种方法,但直到 19 年后,他的方法才部分由于引用了 Marquardt 的一篇论文而声名狼藉。Levenberg 在陆军弹药厂 Frankford Arsenal 工作时发表了该算法。在某种程度上,可以说马夸特重新发现了阻尼最小二乘法,这就是为什么今天这两个名字都被用作参考。Pujol [4]完整地描述了 Levenberg 和 Marquardt 所做的工作,以及他们每个人如何分别对我们今天所知的算法做出贡献。

代码

Levenberg-Marquardt 算法可以以多种形式实现[5]。在这种情况下,我用 Python 笔记本向展示了一种使用这种算法的非常简单的方法。我还将我的结果与 Scipy 的 curve_fit 函数的结果进行了比较。这个函数有一个更健壮的算法实现,它将胜过我将向您展示的那个。然而,我认为这段代码是一个很好的起点,可以用来理解任何更复杂的东西,以及理解“引擎盖下”正在发生的事情。虽然本笔记本中显示的示例是指二维问题,但算法背后的逻辑可以应用于多种情况。

本笔记本中包含的示例被称为偏角曲线分析(DCA ),这是石油工程领域常用的方法。笔记本包含 DCA 的简要说明和一些示例。你可以在我的 GitHub 库的这里访问这个笔记本。

结论

几年前可能要花很长时间才能完成的计算现在每天都变得更容易了。然而,理解所有这些计算来自哪里总是很重要的。进行线性和非线性回归是数据分析和机器学习中许多其他事情的基础。今天,当每个人都在关注这些领域,试图找到答案或更有效的执行过程的方法时,了解基础是如何工作的就很重要了。

参考

  1. leven Berg–Marquardt 算法是如何以一种可理解的方式详细工作的?。堆栈溢出 post。07/15/09
  2. 加文,H. (2020)。非线性最小二乘曲线拟合问题的 Levenberg-Marquardt 算法土木与环境工程系。杜克大学。
  3. 关于如何使用 Levenberg-Marquardt 算法改进摄像机校准参数的备忘录。机器人视觉实验室。普渡大学。
  4. Pujol,J. (2007)非线性逆问题的解决方案和 Levenberg-Marquardt 方法。地球物理学,第 72 卷,第 4 期
  5. 豪尔赫·莫里。(1977).Levenberg-Marquardt 算法:实现和理论。苏格兰大学第 7 届邓迪数值分析双年展。

模型监控背后的直觉

原文:https://towardsdatascience.com/the-intuition-behind-model-monitoring-bd8b5d8e540b?source=collection_archive---------34-----------------------

让你的机器学习系统能够适应世界的变化

在 Unsplash 上耿玲拍照

世界本质上是动态和不稳定的——不断变化。

机器学习模型的性能随着时间的推移而下降是很常见的。这随着数据分布和目标标签(“地面实况”)的发展而发生。与人相关的模型更是如此。

因此,机器学习系统的一个重要组成部分是监控和适应这些变化。

在本文中,我将介绍这种概念漂移政权变更的想法,然后讨论处理它的三种方式以及您应该考虑的事项。

用于模型监控的新工具正在出现,但是理解您想要如何维护模型仍然很重要

概念漂移定义

概念漂移体制变化是生成数据的过程中的变化。我们只关心这种改变是否会损害你的模型的性能。

从状态 A 到状态 b 的真实概念漂移。在状态 A 期间学习的函数将错误分类在状态 b 中观察到的一些数据点。

如上图所示,“概念”(红色和绿色数据点之间的区别)已经旋转并改变了形状。在方案 A 中学习了概念的模型在方案 b 中表现不佳。

如何检测和解决漂移问题?

模型监控中,跟踪数据和模型结果以检测漂移。一旦检测到漂移,可以手动或自动解决。

解决概念漂移的一般方法是监控您的模型以检测漂移,重新训练模型,并部署新的模型版本。

有三种常见的方法来监控概念漂移:

  • 监控模型性能
  • 监控模型预测中置信度的统计测量
  • 在线模型更新或定期模型再培训

监控模型性能

这是直截了当的:如果模型度量下降到某个设定的水平之下,重新评估模型。要监控模型指标,您需要做出几个决定,这些决定将影响漂移检测的灵敏度和频率。

1.在计算模型性能时,您使用了多少新的预测?

2.您评估哪些绩效指标,应用哪些阈值?

3.您多久监测一次漂移?

4.你的模型的用户有多容错?这将有助于你对(1)-(3)的回答。

5.你如何应对漂移?对你的模型进行人工评估和再培训?自动更新?

监控模型预测中置信度的统计测量

另一种方法是监控模型预测或残差值的分布或这些值的置信度。

与潜在的高维输入数据相比,监控模型产生的值的分布变化要容易得多。统计监视器的具体形式取决于要监视的预测的速度和数量。

除了上一节中的问题之外,要做出的一些相关决策包括:

  • Kolmogorov–Smirnov(KS)测试是否表明您的预测或残差值的分布发生了变化?为了用 KS 检验准确地比较两个分布是否相同,需要一些最小数量的例子。
  • 给定的预测/残差是否落在训练期间观察到的预测/残差分布的给定置信区间内?

在线更新

另一个选择是定期用新的观察值更新模型权重。更新的周期可以是每天、每周或每次收到新数据时。如果你在每次收到新的标记观测值时更新你的模型,你的模型就会在线更新

如果您预期增量概念漂移或不稳定的概念,这个解决方案是理想的。

这种选择并不是万无一失的,因为尽管在线更新,仍然存在模型偏离真实目标的风险。发生这种情况的原因有很多。

  • 一个离群值可能对在线训练中的模型产生过大的影响,使学习到的模型进一步远离目标概念。这种风险可以通过使用成批的观察数据而不是单个数据点进行在线更新来降低。
  • 学习率可能太小,从而在存在大漂移的情况下阻止模型足够快地更新。
  • 学习率也可能太大,导致模型超出目标概念并继续表现不佳。

由于这些原因,监视在线更新的模型仍然很重要。

结论

理解和检测漂移是一项艰巨的任务。最终,选择检测和应对漂移的最佳方法通常需要对数据、模型和应用有深入的了解。

漂移检测和模型再训练的理想频率是主观的,取决于您的数据和应用。

最后,在任何解决方案中,重要的是要考虑模型性能指标的变化是否是由于样本偏差,或者感知的漂移是否是由于随机性或异常值,而不是数据分布或目标概念的变化。

进一步阅读

要更深入地了解概念漂移,请查看我的相关文章:

强化学习背后的直觉

原文:https://towardsdatascience.com/the-intuition-behind-reinforcement-learning-d88fccbb145b?source=collection_archive---------23-----------------------

强化学习的简短介绍

视频由作者通过 vimeo 提供。这段视频显示了一名训练有素的特工试图通过改变车道和控制速度来避免迎面而来的车辆。这是用 DQN 算法实现的。

乍一看,强化学习似乎令人难以置信地势不可挡。状态、行动、环境、奖励、价值函数、Q 和过多的其他这样的术语和定义对初学者来说可能是相当大的负担;如果我告诉你,我们一生都在贯彻这个概念,真的,会怎么样?是的。你没看错!在日常生活中,我们几乎每天都在使用 RL 技术。通过这篇文章,我希望向你展示直觉强化学习是多么的真实,它在我们的生活中是多么的平常。也许这种方法有助于解开这个概念的神秘面纱。我希望专注于直觉而不是实现,所以我尽量少用数学公式。

举个例子

在我们谈论术语和定义之前,让我们分析几个例子。

考试 :假设你明天有一场考试。由于一些紧急情况,你无法准备考试;所以,作为最后的手段,你可以查阅前一年的课程试卷。现在,在看完其中的几个之后,你开始注意到一个模式——超过 60%的分数分配给了前三章的问题,而剩下的 40 %平均分配给了其余五章。由于时间不够,你可以学习前三章,也可以学习后五章。你需要至少得 40 分才能通过这门课程。

图片由 Unsplash 提供

现在我要问你的问题是--你会把剩余的时间花在哪些章节上?

当然是前三章!根据你对以前数据的分析,你计算出前三章很有可能会被分配相当多的分数,因此如果你有喘息的机会,你有更大的机会获得 40%的分数,所以即使你可能会犯一些错误,你也能通过这门课程。然而,如果你选择了剩下的 5 章,即使是一个简单的错误也会让你的生活变得困难。

术语

让我们更深入地研究这个算法提供的术语。

环境:

顾名思义,这就是环境,代理与之交互的空间。对我们来说,考试就是我们的环境。我们,代理人,与考试环境互动。这是我们需要我们的代理以特定方式进行交互的空间。我们使用算法来定义代理的行为。在开始给出的视频中,我们可以看到智能体(绿色汽车)与其环境(充满蓝色汽车的高速公路)进行交互。

代理人:

代理用于定义与环境交互的程序本身。在我们的检查示例中,我们是代理。在高速公路视频中,绿色汽车是与高速公路环境互动的主体

动作:

这是代理需要执行的特定操作。在我们的案例中,是在前三章还是后五章这两个选项之间做出选择。在汽车驾驶的例子中,如何引导交通是代理的责任,是减速、变道还是加速。

奖励:

最大化的概念是这个概念如此激动人心的原因。如果仔细观察考试例题,可以注意到我们得出了自己选择前三章的结论。与监督学习不同的是,在监督学习中,我们只有很少的几种情况,在这些情况下,我们有具体严格的指导,我们只知道这些情况(去年的试卷),我们必须得出自己的结论。促使我们做出最终选择的是分数。我们的主要目标是最大化我们的分数或者说是奖励。正是这种最大化回报的激励是代理人的核心动机。正是这种动机允许代理人得出结论,几乎所有强化学习的算法都是围绕着以最有效的方式最大化回报。我们可以以某种方式定义奖励,以便向代理传达我们的意图。在考试示例中,我们的奖励被定义为考试中获得的分数,我们的目标是最大化它。我们所有的决定都受到这个主要动机的影响。在高速公路示例视频中,我以这样一种方式定义了奖励,即每当汽车学会转弯并提高速度时,奖励就会大幅增加。每当它崩溃或减速时,就会给出一个巨大的负奖励。通过以这种方式定义参数,我们实现了这样一种直觉,即汽车越能学会在高速下操纵而不撞车或减速,就越好,就像我们教代理人鲁莽驾驶一样。这就是奖励这个概念的强大之处。

状态和历史:

这是强化学习的另一个非常重要的概念。每当我们(代理人)与环境互动,执行一些操作(行动)时,我们观察环境中的反应,作为回报,我们从环境中获得奖励。就像根据我们选择学习的章节,我们会得到相应的分数,或者根据汽车选择做的事情(减速、加速、转弯等等)。)它得到了回报,我们看到它在高速公路上巡航,或者与另一辆车相撞。现在我们需要一种方法来记录这些观察,行动和在每一步得到的回报。这就是历史的由来。这是一系列的行动、奖励和观察,直到时间 t。

t 时刻的历史[图片由作者提供]

代理将如何与环境交互取决于历史。它将分析历史,并根据其优先级决定下一步行动。在这一点上,很明显,保持所有观察、行动和奖励的顺序变得非常耗费空间和不切实际。我们需要的是对历史的简明概述。告诉我们代理需要知道的所有重要细节,但不要太不切实际。这正是国家所做的。国家本质上只是历史的一个函数。

国家是历史的函数。[图片由作者提供]

我们使用一个非常特殊的假设,马尔可夫状态,来定义函数。马尔可夫假设主要是这样的:

马尔可夫状态定义。[图片由作者提供]

这意味着,鉴于现在,未来独立于过去。因此,鉴于目前的状态,我们可以准确地预测未来,从而使历史变得多余。这就是革命性的马尔可夫假设。例如在高速公路汽车的例子中,过去发生了什么并不重要。只要我们能够正确地分析当前的情况,即蓝色汽车的位置和速度,我们就没事(我们也可以将其视为一个序列模型,但这是一个不同的问题)。

政策与价值函数:

策略是描述代理行为的函数,而价值函数是告诉我们处于特定状态的好坏程度的度量。它有助于预测我们在特定状态下可以获得的回报。

pi 所代表的策略。它基本上将一个状态映射到一个特定的动作。[图片由作者提供]

这是给定政策π和状态 s 在 t 时刻的价值函数,是我们希望在未来得到的回报的预期(t+1,t+2 …等等)。贴现因子 γ 用于在估算我们的期望值时,维持我们对未来回报的重视程度。它介于 0 和 1 之间。0 意味着我们只关心在时间步 t 返回的回报,而 0.99 的贴现因子意味着未来的所有后续步骤都很重要。[图片由作者提供]

如果我们观察这个方程,我们就能知道价值函数到底是什么。它估计在给定政策的情况下未来获得的回报。价值函数的公式有许多不同的变体,它可以以各种不同的方式应用,但事实是它的主要功能是为我们提供一种方法来估计我们希望获得的未来回报;本质上就是我们用数学公式来预测未来。很漂亮不是吗?

结论

希望这个简短的介绍能让你对强化学习的直觉有所了解。这确实是一个美丽的概念,它可以用于许多不同的领域,包括机器人,游戏,股票市场等。我强烈推荐查看大卫·西尔弗关于强化学习的播放列表,以了解强化学习的数学和实现。如果你想看强化学习的实践,请访问我的 repo ,在那里我使用 Deep Q Network 训练了一个代理来玩谷歌 chrome dino 游戏。

逻辑回归的直观解释

原文:https://towardsdatascience.com/the-intuitive-explanation-of-logistic-regression-a0375b1bee54?source=collection_archive---------35-----------------------

深刻的基本理解是正确使用的关键

图片由皮查拜的杰拉德拍摄

介绍

逻辑回归可能很难理解!因此,我对逻辑回归的原因、内容和方式做了一个非常直观的解释。我们将从一些有助于更清晰理解的构件开始,所以坚持住!通过这篇文章,我希望能引导你理解、构建和解释逻辑回归模型。尽情享受吧!

什么是逻辑回归?

逻辑回归是一种非常流行的预测或理解二元变量(热或冷,大或小,这个或那个——你懂的)的方法。逻辑回归属于分类的机器学习范畴。

再举一个例子来区分线性回归和逻辑回归:而不是预测某样东西会卖多少钱..你也可以预测它是否会被卖掉。不多说了,让我们开始吧!

将线性回归理解为前兆

让我们来讨论一个线性回归的输出。对于那些不熟悉线性回归的人来说,最好从这里开始。你可以访问这个帖子来了解一下简单线性回归 &这个为多元线性回归。

现在知道一点线性回归;您会知道线性回归输出相当于一条直线的方程。很简单..这就是我们想要的一切;只是一种重新解释一个变量的方法,借以洞察另一个变量。

知道了这些,让我们对一个二元变量进行线性回归。二进制是或否,1 或 0。这个变量将是我们逻辑回归的候选变量,但我们很快就会知道。

构建线性回归以理解逻辑回归

今天我们将使用mtcars数据集。这是一个用于数据科学学习的经典数据集,详细描述了各种汽车的油耗、发动机详细信息以及其他详细信息。

快速浏览数据集:

glimpse(mtcars)

head(mtcars)

二元变量的线性回归

在这个数据集中,我们有一个二元变量… vs。由于对汽车了解不多,我无法给你详细解释vs是什么意思,但高水平是它是发动机配置的代表..我也知道配置会对功率、效率等产生影响。这是我们能够通过模型梳理出来的。因此,希望这将很容易确定的差异!

让我们建立回归模型吧!我们将试图把vs理解为每加仑英里数的函数。

fit <- lm(vs ~ mpg,data = mtcars)
summary(fit)

请随意查看下面的回归输出:

你可以看到 R 的平方是 0.44,这意味着我们可以解释 44%的 y 的变化,x 的变化。不错。我们还看到 p 值小于 0.05。竖起两个大拇指。

现在事情变得棘手了..让我们来看看 y 轴截距。我们的 y 轴截距是 0.67。看起来很奇怪,因为 vs 不是可以变负的东西…事实上,它只能是 0 或 1。这将构成对二元变量使用线性回归的一个主要问题,但稍后会有更多的讨论。首先,我们将寻求更好地理解我们正在处理的数据。

可视化我们的输出

让我们用散点图快速地将这两个变量形象化,并添加回归线,给我们一些额外的见解。

mtcars %>%ggplot(aes(x = mpg, y = vs))+geom_point()+geom_smooth(method = 'lm', se = FALSE)

首先,你可以看到 y 轴是一个连续变量,所以你会看到所有的点都在 0 或 1 上。

至于 x 轴,我们可以看到,根据因变量是 1 还是 0,分别向右和向左集中。这与我之前提到的vs为 1 的汽车比vs为 0 的汽车油耗更低是一致的。

从图表中可以非常直观地看到,直线以线性方式穿过两组。

明显的问题?

这里显而易见的问题是,这条线在两个方向上永远都在延伸。任何一个极端的输出都是没有意义的。

为此,我们不能原样使用线性回归。这并不意味着它是无用的,我们只是必须修改它,使我们的预测极限不是无限的。

“一般化”线性回归

我们得到逻辑回归的方法是通过所谓的“广义线性模型”。你可以想想我们刚刚通过简单的线性回归,创建的一条线的函数或方程。通过线性模型,我们可以根据与 x 相关的函数来理解 y。对于逻辑回归,我们将该函数有效地包装在一个负责“概括”模型的附加函数中。

概化或概化函数的目的是什么?

我们要做的是对给定的数据点进行分类,或者换句话说,将给定 mpg 的车辆分配到两个组中的一个,v (0)或 straight (1)。

从概率的角度来考虑这个问题是有帮助的。对于任何给定的mpg数据点,汽车有一个给定的概率或者是 v 或者是直线。因此,一个旨在阐明这种关系的模型的输出有可能是有意义的。

总结这个想法,我们想以一种代表概率的方式来概括线性输出。

如何概括

我前面提到的一般化过程是将我们的线性函数包装成另一个函数。这个函数就是所谓的链接函数。正如我刚才提到的,链接函数将线性输出缩放为 0 到 1 之间的概率。对于广义线性模型的子类逻辑回归,使用了逻辑链接函数。

可视化逻辑回归

让我们看一下与之前相同的图,但这次拟合的是逻辑 曲线

mtcars %>%ggplot(aes(x = mpg, y = vs))+geom_point()+
geom_smooth(method = "glm", se = FALSE, method.args = list(family = "binomial"))

我们包含了和以前一样的代码,只是现在我们的方法是“glm ”,它指定我们想要一个通用的线性模型;其次,我们指定家庭=“二项式”。这就是调用哪个链接函数的原因。在这种情况下,“二项式”使用 logit 函数。

让我们解释一下我们的新图表。正如你所看到的,我们线的两端都变平了,所以这条线永远不会达到 0 或 1。

我们可以看到,朝向中间的线非常直,与我们的线性模型相似。

构建我们的第一个逻辑回归模型

让我们开始构建我们自己的逻辑回归模型。这与线性回归调用非常相似,但有两个关键区别。第一个是呼叫是glm,第二个是家庭是类似于你在geom_smooth呼叫中看到的“二项式”。这里使用它的基本原理是一样的。

fit <- glm(vs ~ mpg,data = mtcars,family = 'binomial')
summary(fit)

我想用 glm 函数指出的第一件事是,你必须首先将因变量编码为 1 或 0。其他分类算法可能不需要所述编码,但是在逻辑回归的情况下,重申一下,它是线性输出的包装。因此,位于我们的链接函数内部的线性模型不会对角色或因素起作用。

逻辑回归解释

现在该说说解读了。这也不是一个非常简单的话题,但我们会尽可能直观地探讨它。

考虑逻辑回归解释有三种方式:

  • 可能性
  • 可能性
  • 对数概率

就可解释性而言,每一种都有不同的取舍。但是首先…定义

可能性

很简单,概率是用 0 到 1 表示的可能性的度量。

可能性

另一方面,Odds 用来表示某件事发生的频率(概率)相对于不发生的频率(1-概率)。

这个公式看起来像这样。

这里要考虑的一件事是它是指数级的。

让我们写一点快速代码,使指数标度的原因更加直观。我们将在 0 . 05 之前创建一个 0 到 1 的序列。然后,我们将根据上述公式创建一个赔率字段。最后,我们将绘制线!

probs_vs_odds <- data.frame(prob = seq(0, 1, by = 0.05))
probs_vs_odds <- probs_vs_odds %>% mutate(inverse_prob = 1-prob,odds = prob / inverse_prob)
probs_vs_odds %>%ggplot(aes(x = prob, y = odds))+geom_line()

我还将在下面添加数据帧,以提供额外的说明。希望这能让我们清楚地思考。当概率为 5%时,你的赔率是 1/20,相反,当概率为 95%时,你的赔率是 19 比 1,而不是线性变化。

对数赔率

非常类似于一个变化的几率。我们采用对数来缓和指数曲线。一旦我们得到了对数几率,我们就能够再次将我们的模型可视化为一条线。这对于函数解释来说很好,但是对于输出解释来说就很糟糕了

权衡取舍

我下面的视觉效果旨在传达功能和输出的可解释性。概率的输出很容易解释,但是它的函数是非线性的。赔率是有道理的,但是并不是最容易在心里理解的事情&它是指数级的..作为一个函数,不太有意义。最后,对数概率几乎不可能解释,但是它的函数是线性的,这对于解释是很好的。

没有一个是绝对最好的。而对于输出,概率是最容易解释的,概率函数本身是非线性的。你可能会发现自己在用某种组合来交流预测和函数等等。

性能赋值

在这最后一部分,我将为您提供一些工具,这些工具将是模型性能评估的关键。

我们将使用所谓的交叉验证。所有这一切意味着,不是用你所有的数据点来训练一个模型,而是你将抽取一些数据点,等到模型被训练好,然后为它们生成预测,然后在预测和实际之间进行比较。

下面我们分解训练和测试组,并生成模型。

n <- nrow(mtcars)
n_train <- round(0.8 * n) 
set.seed(123)
train_indices <- sample(1:n, n_train)
train <- mtcars[train_indices,]  
test <- mtcars[-train_indices,]fit <- glm(vs ~ mpg,data = train,family = "binomial")

从这里,我们将为我们的测试组生成一个预测。如果你看一下pred字段,你实际上会看到是 1 的概率。

这留给我们的挑战是,不是说这些车可能有配置 1,这些有 0;我们只剩下概率了。

你会在下面代码的第二行看到我绕过了预测。. 5 及以上为 1,以下为 0。

. 5 被用作一个相当标准的分类阈值——尽管肯定存在需要更高或更低阈值的情况。

最后,我们使用caretconfusionMatrix函数来可视化混淆矩阵,并提供一些性能评估指标。诸如准确性、p 值、敏感性、特异性等等。

test$pred <- predict(fit, test, type = 'response')
test$pred <- as.factor(round(test$pred))
test$vs <- as.factor(test$vs)
confusionMatrix(test$pred, test$vs)

在我们的例子中,p 值很高,准确性中等。

结论

如果你已经做到了这一步,那么希望你已经了解了一两件关于逻辑回归的事情,并且会对构建、解释和交流你自己的逻辑回归模型感到舒服。

在这篇文章中,我们讨论了以下内容:

  • 定义
  • 模型结构
  • 解释
  • 性能赋值

我希望这证明有用!查看我在 datasciencelessons.com的其他数据科学课程,或者在 Twitter @data_lessons 上关注我。祝数据科学快乐!

大型项目的铁律

原文:https://towardsdatascience.com/the-iron-law-of-megaprojects-18b886590f0b?source=collection_archive---------14-----------------------

超出预算,随着时间的推移,收益不足,一次又一次

照片由 Nico Callens 拍摄,https://pix abay . com/photos/train-train-tracks-railways-station-5439799/

大型项目的绩效数据用他们自己的语言表达

大型项目的业绩数据用他们自己的语言表达。这类项目十有八九成本超支。实际上超过 50%是常见的,超过 50%并不罕见。英吉利海峡隧道是欧洲最长的水下铁路隧道,连接英国和法国,实际成本超支 80%。丹佛国际机场,200%。波士顿的大挖掘,220%。加拿大枪支登记处,百分之 590。悉尼歌剧院,1400%(更多例子见下表)。*

来源:作者, SSRN

超支在私人和公共项目中都是一个问题,而且情况没有改善;在有可比数据的 70 年间,超支一直居高不下。地理位置似乎也无关紧要;有数据可查的所有国家和大洲都遭受超支之苦。同样,高达 50%的福利缺口也很常见,超过 50%也不罕见,而且随着时间和地域的推移,也没有改善的迹象。

将大量的成本超支和收益不足与商业案例、成本收益分析以及社会和环境影响评估这一事实结合起来,我们发现这类分析通常是不可信的。

一个大型项目很可能是技术上的成功,但却是财务上的失败,很多都是如此

例如,对于铁路项目,44.7%的平均成本超支与 51.4%的平均需求短缺相结合,对于公路项目,20.4%的平均成本超支与 50%的需求误差风险相结合。在构成商业案例、成本效益分析以及社会和环境影响评估基础的预测中存在如此大的误差和偏差,这种分析在很大程度上也会产生严重的误导。俗话说“垃圾进,垃圾出”。

作为一个恰当的例子,更详细地考虑海峡隧道。这个项目最初被宣传为在经济上和财政上都非常有利。在首次公开募股时,隧道的私人所有者欧洲隧道公司(Eurotunnel)诱惑投资者,告诉他们 10%“对于不可预见的情况对建设成本的可能影响来说是一个合理的余量。”事实上,如上所述,建设成本超出预算 80%,融资成本超出预算 140%。收入只有预测的一半,在新冠肺炎疫情之后甚至更低。

因此,该项目已被证明是不可行的,投资的内部收益率为负,为负 14.5%,给英国经济造成的总损失为 178 亿美元。也就是说,英吉利海峡隧道不但没有增加经济,反而降低了经济。

如果英吉利海峡隧道没有建成,英国经济会更好

当你使用这项服务时,你很难相信这一点,因为它快捷、方便,而且与其他出行方式相比具有竞争力。但事实上每位乘客都得到大量补贴。这次不是由纳税人,而是由许多私人投资者承担,当欧洲隧道破产和财务重组时,他们损失了钱。2021 年,由于新冠肺炎,第二次破产的威胁。

这说明了重要的一点:一个大型项目很可能是技术上的成功,但却是财务上的失败,而且很多都是这样。

对英吉利海峡隧道的经济和财务事后评估系统地比较了实际成本和收益,得出的结论是“如果隧道从未修建,英国经济会更好。”其他不可行的大型项目包括悉尼的莱恩科夫隧道、斯德哥尔摩和奥斯陆机场的高速铁路连接、哥本哈根地铁和丹麦的大贝尔特隧道,这是仅次于英吉利海峡隧道的欧洲第二长的水下铁路隧道。

延误每天将花费 330 万美元

大型信息和通信技术项目风险更大。六分之一的此类项目在成本超支方面成为统计异常值,实际异常值的平均超支为 200%。与正常情况相比,这是异常值发生率的 2000 %,与大型建筑项目相比,这是异常值发生率的 200 %,大型建筑项目也受到成本异常值的困扰。仅在美国,每年因失败和表现不佳的 ICT 项目而造成的项目浪费总额估计为 550 亿美元。

对于大型项目来说,延误是一个单独的问题,延误会导致成本超支和收益不足。例如,牛津大学基于同类最大的数据库进行的一项研究结果显示,大坝的延误率平均为 44%。因此,如果一座大坝计划用 10 年时间建造,从决定建造到大坝投入使用,实际上平均需要 14.4 年。我和我的同事基于大型建设项目的大型数据集,对成本超支和实施阶段长度之间的关系进行了建模。我们发现,平均而言,实施阶段的一年延迟或其他延长与 4.64%的百分比成本超支的增加相关。

举例来说,对于伦敦 260 亿美元的 Crossrail 项目来说,一年的延迟将额外花费 12 亿美元,即每天 330 万美元。这里的关键教训是,为了降低成本,实施阶段应该保持较短,延迟应该较小。这不应该被视为快速跟踪项目的借口,也就是说,为了尽早开始施工而匆忙做出决策。在决定是否给一个项目开绿灯或停止它之前,前端规划需要彻底。但通常情况恰恰相反。缺乏前端规划,糟糕的项目没有停止,实施阶段和延迟时间很长,成本飙升,收益和收入实现遥遥无期。

列出一长串失败的项目比列出一长串成功的项目要容易得多

对于债务融资的项目来说,这是一个灾难的处方,因为项目债务增长,而没有收入流来支付利息,利息随后被添加到债务中,等等。因此,许多项目最终陷入了所谓的“债务陷阱”,即建设成本不断上升、工程延期和利息支付不断增加,使得项目收入无法覆盖成本,从而导致项目不可行。这就是发生在海峡隧道和悉尼的莱恩湾隧道,以及其他项目上的事情。

这并不是说不存在那些建立在预算和时间基础上并交付了承诺收益的项目。毕尔巴鄂古根海姆博物馆是这种罕见项目的一个例子。类似地,马德里最近的地铁支线和许多工业项目一样,都是按时按预算建成的。特别重要的是研究这些项目,以了解成功的原因,并测试成功是否可以在其他地方复制。

然而,就成本超支和收益不足而言,列出一长串失败的项目要比列出一长串成功的项目容易得多。举例来说,作为正在进行的大型项目管理成功研究的一部分,作者和他的同事正试图建立一个足够大的成功项目样本,以允许统计有效的答案。但到目前为止,他们失败了。为什么?因为成功在大型项目管理中是如此罕见,以至于目前它只能作为小样本研究来研究,而失败可以通过大样本项目来研究。

最佳实践是离群值,一般实践是灾难

大型项目管理的成功通常被定义为按照预算、时间和承诺的收益交付项目。如证据所示,如果十个大型项目中大约有一个在预算内,十个中有一个在进度上,十个中有一个在收益上,那么大约一千个项目中有一个是成功的,定义为三个项目都达到目标。即使这些数字错了两倍——因此十个项目中有两个而不是一个分别达到了成本、进度和收益的目标——成功率仍然很低,现在是千分之八。这就说明了我们所说的“特大项目铁律”:超预算,超时间,超效益,周而复始

在这个有趣且成本高昂的管理领域,最佳实践是一个离群值,平均实践是一场灾难。

…………………

*)铁律见来源及解决方案此处。

k-prototype 作为混合数据类型(分类和数值)的聚类算法

原文:https://towardsdatascience.com/the-k-prototype-as-clustering-algorithm-for-mixed-data-type-categorical-and-numerical-fe7c50538ebb?source=collection_archive---------1-----------------------

照片由 Nareeta Martin 在 Unsplash 上拍摄

动手教程

理论解释及其在实际问题中的应用

K 原型的基本理论

OK-Means 算法是聚类技术中常用的一种传统聚类方法,可有效用于大数据。但是,它的方法不好,不适合包含分类变量的数据。当使用仅适用于数值数据的欧几里德距离来计算 K-Means 中的成本函数时,会出现这个问题。而 K-Mode 只适合分类数据,不适合混合数据类型。

面对这些问题,黄提出了 K-Prototype 算法来处理混合数据类型(数值型和分类型)的聚类算法。K-Prototype 是一种基于划分的聚类方法。该算法是对 K-Means 和 K-Mode 聚类算法的改进,用于处理混合数据类型的聚类。

阅读完整的 K-Prototype 聚类算法 此处

从数据中充分了解秤的测量非常重要。

注意: K-Prototype 具有优势,因为它不太复杂,能够处理大量数据,并且比基于层次的算法更好

K 原型聚类算法的数学公式(图片由作者提供)

K 原型的应用

在这一部分,我们将使用 Python 演示 K-Prototype 的实现。在此之前,首先使用终端或 Anaconda 提示符安装**kmodes**模块是很重要的。

有几个模块用于演示。分别是用于数据操作的**pandas**,用于线性代数计算的**numpy**,用于数据可视化的**plotnine**,以及用于 K 原型聚类算法的**kmodes**

# Import module for data manipulation
import pandas as pd
# Import module for linear algebra
import numpy as np
# Import module for data visualization
from plotnine import *
import plotnine
# Import module for k-protoype cluster
from kmodes.kprototypes import KPrototypes
# Ignore warnings
import warnings
warnings.filterwarnings('ignore', category = FutureWarning)
# Format scientific notation from Pandas
pd.set_option('display.float_format', lambda x: '%.3f' % x)

数据可以在这里下载https://raw.githubusercontent.com/audhiaprilliant/audhiaprilliant.github.io/master/assets/docs/10000 Sales Records.csv或者你可以通过访问 这个网站 轻松生成这个数据。完全免费。尽情享受吧!

**# Load the data
df = pd.read_csv('data/10000 Sales Records.csv')
# The dimension of data
print('Dimension data: {} rows and {} columns'.format(len(df), len(df.columns)))
# Print the first 5 rows
df.head()**

该数据实际上是 国家销售数据 该数据有 10,000 行和 14 列,具有混合数据类型(数字和分类)。它记录了世界各国的销售交易。

MS Excel 为 K-Prototype 生成的国家销售数据(图片由作者提供)

为了确保每一列的数据类型被正确映射,我们必须使用**df.info()**命令手动检查它们的类型。如果我们发现有错误的映射,我们应该将其更正为正确的数据类型。

**# Inspect the data type
df.info()**

国家销售数据列的数据类型(按作者分类的图像)

幸运的是,所有的列都有正确的数据类型。请忽略**Order ID**,因为我们不会使用它,稍后会将其删除。

数据集中有七个分类变量。具有 185 个唯一值的**Country**、具有 2691 个唯一值的**Order Date**和具有 2719 个唯一值的**Ship Date**将从聚类分析中移除,因为它们具有大量的唯一值。其余的列将被保留。它们是具有 7 个唯一值的**Region**、具有 12 个唯一值的**Item Type**、具有 2 个唯一值的**Sales Channel**和具有 4 个唯一值的**Order Priority**

**# Inspect the categorical variables
df.select_dtypes('object').nunique()**

销售国家数据中的分类变量(作者图片)

其余的列是数字变量。它们是**Order ID****Units Sold****Unit Price****Units Cost****Total Revenue****Total Cost****Total Profit**

**# Inspect the numerical variables
df.describe()**

国家销售数据的数字数据的汇总统计(图片由作者提供)

进行数据探索和分析之前的最后一项任务是确保数据不包含缺失值。

**# Check missing value
df.isna().sum()**

国内销售数据缺失值的数量(图片由作者提供)

在进行聚类分析之前,我们应该做描述性分析的数据探索。它旨在找出一个有趣的点,该点对于报告生成和捕捉数据中的现象是有用的。

我们假设每个地区的购买数量与总利润有很强的线性相关性。为了总结这一点,我们有两个选择,描述性分析和推理分析。对于这一部分,我们将选择第一个选项。让我们看看!

**# The distribution of sales each region
df_region = pd.DataFrame(df['Region'].value_counts()).reset_index()
df_region['Percentage'] = df_region['Region'] / df['Region'].value_counts().sum()
df_region.rename(columns = {'index':'Region', 'Region':'Total'}, inplace = True)
df_region = df_region.sort_values('Total', ascending = True).reset_index(drop = True)
# The dataframe
df_region = df.groupby('Region').agg({'Region': 'count','Units Sold': 'mean','Total Revenue': 'mean','Total Cost': 'mean','Total Profit': 'mean'}
).rename(columns = {'Region': 'Total'}).reset_index().sort_values('Total', ascending = True)**

销售国家数据中每个地区的销售分布情况(按作者分类的图片)

从上述结果中,我们可以得出结论,北美是销量最低的地区,但在某些栏目中,如**Units Sold****Total Revenue****Total Cost****Total Profit**,他们的表现优于所有地区。与其他地区不同,北美同时进行多项采购。而购买次数最多的欧洲对总利润的贡献并不大。这意味着购买次数与总利润没有很强的线性相关性。

**# Data viz
plotnine.options.figure_size = (8, 4.8)
(ggplot(data = df_region)+geom_bar(aes(x = 'Region',y = 'Total'),fill = np.where(df_region['Region'] == 'Asia', '#981220', '#80797c'),stat = 'identity')+geom_text(aes(x = 'Region',y = 'Total',label = 'Total'),size = 10,nudge_y = 120)+labs(title = 'Region that has the highest purchases')+xlab('Region')+ylab('Frequency')+scale_x_discrete(limits = df_region['Region'].tolist())+theme_minimal()+coord_flip()
)**

销售国家数据中每个地区的销售数量(图片由作者提供)

对于数据探索,我们将在**Region****Item Type**之间创建一个交叉列表,以查找任何模式。

**# Order the index of cross tabulation
order_region = df_region['Region'].to_list()
order_region.append('All')
# distribution of item type
df_item = pd.crosstab(df['Region'], df['Item Type'], margins = True).reindex(order_region, axis = 0).reset_index()
# Remove index name
df_item.columns.name = None**

各地区购买的商品类型分布(图片由作者提供)

数据预处理的目的是去除不使用的列**Country****Order Date****Order ID****Ship Date**。它们与 K 原型聚类算法无关。我们需要删除这些列有两个原因,如下所示:

  • **Country** —它有很多独特的值,增加了计算量。信息太多,无法处理,变得毫无意义
  • **Order Date****Ship Date** —聚类算法需要假设数据中的行代表在某个时间段观察到的唯一观察值
  • **Order ID** —对聚类分析没有意义的信息
**# Data pre-processing
df.drop(['Country', 'Order Date', 'Order ID', 'Ship Date'], axis = 1, inplace = True)
# Show the data after pre-processing
print('Dimension data: {} rows and {} columns'.format(len(df), len(df.columns)))
df.head()**

没有特定列的国家销售数据(图片由作者提供)

**kmodes**模块中的 K 原型聚类算法需要分类变量或列在数据中的位置。该任务旨在保存那些在给定变量**catColumnsPos**中的数据。它将被添加到聚类分析的下一个任务中。分类列位置在数据的前四列中。

**# Get the position of categorical columns
catColumnsPos = [df.columns.get_loc(col) for col in list(df.select_dtypes('object').columns)]
print('Categorical columns           : {}'.format(list(df.select_dtypes('object').columns)))
print('Categorical columns position  : {}'.format(catColumnsPos))**

国家销售数据中分类变量或列的位置(作者图片)

****重要!在实际情况下,数字列将具有不同的刻度,因此您必须使用适当的技术对其进行归一化,例如最小-最大归一化、Z 分数归一化等

接下来,将数据框中的数据转换为矩阵。它帮助**kmodes**模块运行 K-Prototype 聚类算法。将数据矩阵保存到变量**dfMatrix**

**# Convert dataframe to matrix
dfMatrix = df.to_numpy()**

K-Prototype 聚类算法的国家销售数据矩阵(图片由作者提供)

我们使用肘方法来确定 K 原型集群的最佳集群数量。K-Prototype 没有使用欧几里德距离计算平方和误差(WSSE ),而是提供了一个成本函数,该函数结合了数值变量和分类变量的计算。我们可以研究肘部来确定集群的最佳数量。

**# Choose optimal K using Elbow method
cost = []
for cluster in range(1, 10):try:kprototype = KPrototypes(n_jobs = -1, n_clusters = cluster, init = 'Huang', random_state = 0)kprototype.fit_predict(dfMatrix, categorical = catColumnsPos)cost.append(kprototype.cost_)print('Cluster initiation: {}'.format(cluster))except:break
# Converting the results into a dataframe and plotting them
df_cost = pd.DataFrame({'Cluster':range(1, 6), 'Cost':cost})
# Data viz
plotnine.options.figure_size = (8, 4.8)
(ggplot(data = df_cost)+geom_line(aes(x = 'Cluster',y = 'Cost'))+geom_point(aes(x = 'Cluster',y = 'Cost'))+geom_label(aes(x = 'Cluster',y = 'Cost',label = 'Cluster'),size = 10,nudge_y = 1000) +labs(title = 'Optimal number of cluster with Elbow Method')+xlab('Number of Clusters k')+ylab('Cost')+theme_minimal()
)**

使用肘方法的成本函数的 scree 图(图片由作者提供)

重要!更多阅读 此处

根据上面成本函数的 scree 图,我们考虑选择集群的数量**k = 3**。这将是 K-原型聚类分析的最佳聚类数。更多肘法 在这里 阅读。

**# Fit the cluster
kprototype = KPrototypes(n_jobs = -1, n_clusters = 3, init = 'Huang', random_state = 0)
kprototype.fit_predict(dfMatrix, categorical = catColumnsPos)**

该算法有 7 次迭代来收敛,它的成本为 4,960,713,581,025,175.0(这是一个相当大的权利?!).我们可以使用**kprototype.cluster_centroids_**打印星团的质心。对于数值变量,将使用平均值,而分类变量使用众数。

**# Cluster centorid
kprototype.cluster_centroids_
# Check the iteration of the clusters created
kprototype.n_iter_
# Check the cost of the clusters created
kprototype.cost_**

通过 K 原型聚类质心(图片由作者提供)

需要对集群进行解释。解释是使用每个聚类中的质心。为此,我们需要将聚类标签附加到原始数据上。对聚类标签进行排序将有助于安排基于聚类标签的解释。

**# Add the cluster to the dataframe
df['Cluster Labels'] = kprototype.labels_
df['Segment'] = df['Cluster Labels'].map({0:'First', 1:'Second', 2:'Third'})
# Order the cluster
df['Segment'] = df['Segment'].astype('category')
df['Segment'] = df['Segment'].cat.reorder_categories(['First','Second','Third'])**

包含分类信息的国家销售数据(按作者分类的图片)

为了解释聚类,对于数值变量,将使用平均值,而分类变量使用众数。但是也有其他方法可以实现,例如对分类变量使用中位数、百分位数或值组合。

**# Cluster interpretation
df.rename(columns = {'Cluster Labels':'Total'}, inplace = True)
df.groupby('Segment').agg({'Total':'count','Region': lambda x: x.value_counts().index[0],'Item Type': lambda x: x.value_counts().index[0],'Sales Channel': lambda x: x.value_counts().index[0],'Order Priority': lambda x: x.value_counts().index[0],'Units Sold': 'mean','Unit Price': 'mean','Total Revenue': 'mean','Total Cost': 'mean','Total Profit': 'mean'}
).reset_index()**

国家销售数据中聚类的质心(图片由作者提供)

下面列出了完整的示例。

K 原型聚类算法的完整 Python 脚本

结论

K-Prototype 是黄提出的 K-Means 和 K-Mode 相结合的聚类算法。为了实现它的算法,研究者需要仔细地过滤列,特别是分类变量。分类变量必须与分析相关,并且不是无意义的信息。此外,输入(数据)的质量会影响聚类结果(聚类初始化)以及算法如何处理数据以获得收敛结果。作为研究者,对于最后的任务,解释,我们需要考虑用于数字和分类变量的度量。

参考

[1]黄政道。对聚类的 k-Means 算法的扩展
具有分类值的大型数据集
(1998)。数据挖掘和知识发现。2(3): 283–304.

工业成功的关键?学会有效地交流结果

原文:https://towardsdatascience.com/the-key-to-success-in-industry-learn-to-communicate-results-effectively-2e68d83b2c74?source=collection_archive---------26-----------------------

作者聚焦

对于 Vicky Yu 来说,一些关键技能让她从金融到编程再到数据分析的转变更加顺利。

在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与大家分享 于薇 的对话。

Vicky 曾担任过数据工程师、数据科学家,最近成为了数据分析师。她开始写作,讨论她的经历,并提供她在数据之旅中发现缺乏的职业建议。

你的数据分析之旅是怎样的?

我是偶然进入数据科学领域的。我是一家咨询公司的数据工程师。我的一个项目涉及与一家电子商务公司的数据科学团队合作,开发一个分析数据库,成为训练数据的主要来源。团队欣赏我在这个项目上的工作,当一个数据科学家的空缺出现时,他们给了我这个职位,尽管我以前没有数据科学的经验。

在做了几年数据科学家后,我觉得我没有学到任何新东西,于是决定尝试一个不同的数据角色,最终得到了一个数据分析师的职位。

数据分析师角色在数据科学家和数据工程师之间的典型划分中如何定位?

在拥有成熟分析基础设施的公司中,数据分析师、数据科学家和数据工程师的职责非常明确。数据工程师引入分析和建模所需的数据。数据分析师使用数据来展现趋势和见解,而数据科学家则构建模型来细分用户并对未来做出预测。

开始构建分析基础架构的公司可能会将数据科学家视为一个混合角色。当他们主要需要数据分析师来寻找见解和构建仪表板时,或者当他们实际上需要数据工程师在构建模型之前首先构建 ETL(提取、转换、加载)管道时,他们可能会雇用数据科学家。在这种环境中工作的数据分析师可以充当数据分析师/数据科学家,根据需要生成见解、评估 A/B 测试、构建仪表板和开发模型。

在角色定义如此多变的情况下,在这一领域中面临的主要挑战是什么?

我的企业生涯始于一名财务分析师,但我接受了一份编程工作,没有任何学术培训或先前的经验。我的新雇主给了我这份工作,并相信我最终会学到所需的技能。我一开始很纠结,因为学编程和学金融完全不一样。我的想法是把一次失败的尝试视为学习一种行不通的方法。如果我几次都不能解决问题,我会修改我的方法,再试一次。随着时间的推移,我学会了如何更快地调试我的编程错误,因为我找出了所有不起作用的方法。

从金融到编程的转变帮助我很早就学会了如何适应和获得完全不同的角色所需的新技能。我从数据工程师到数据科学家,再到数据分析师的转变并非没有挑战,但由于我在职业生涯早期学到的东西,这变得更加容易。

数据相关领域的早期职业人士应该做些什么才能让自己走上成功之路?

在职业生涯的早期学习如何有效地交流数据结果。如果你不以利益相关者能理解的方式解释,他们就不会欣赏你的贡献。我的可靠公式是提出问题,显示数据结果,提供解决方案,并显示潜在的好处(如果适用)。

这些天你发现自己被什么样的数据分析项目所吸引?

我喜欢从事数据分析项目,但不知道如何解决。例如,我被要求计算一个新用户的终身价值,如果用户变成付费会员,要考虑广告收入和订阅收入。以前从来没有人这样做过,我不知道如何解决这个问题。这个项目让我想出了计算生命价值的新方法,并帮助我开发了新的方法,我已经能够应用到其他项目中。

除了你的数据分析工作,你还是一个多产的作者。是什么激励你开始公开写作?

如果没有其他人写下他们的经历和 T2 如何解决他们的问题,我就不可能学到这么多关于数据科学的知识,也不可能回答我的问题。写作是我回馈社区的方式,我在数据之旅中受益匪浅。我也想为别人提供建议,帮助他们避免我早期犯的错误。

你的许多帖子关注的是课程和大学教授的数据科学与它在现实生活和行业环境中的实际表现之间的差距。为什么谈论这些话题对你很重要?

学术界教学生如何做某事,但不一定告诉他们如何在现实生活中应用这些教导。例如,学生学习 A/B 测试的原理以及如何测量结果。在现实生活中,数据分析师或数据科学家需要确保实验设置正确,并在测量结果之前验证数据。坏数据在学校里是不期望的——这是一个例子,我觉得在现实生活应用中指出这个差距是很重要的。

展望未来,您希望在更广泛的数据科学社区中看到什么样的变化?

我希望看到一个导师社区,帮助初级数据科学家和分析师在职业生涯中成长。有许多资源可以帮助人们通过技术面试,一些新兵训练营提供导师作为项目的一部分。但是在数据科学家获得第一份工作后,很少有资源可以帮助他们。经理不一定是初级数据科学家的最佳导师,如果他们可以向一个社区寻求职业建议,那就太好了。

想了解更多关于 Vicky 的工作和项目吗?在媒体和 LinkedIn 上关注她。以下是 Vicky 关于走向数据科学的文章深度档案中我们最喜欢的一些,她在这里分享了关于数据故事和职业建议等主题的见解。

  • 数据分析职业:为了体验 Vicky 关于数据分析师角色的文章,从基础知识开始:“我如何成为一名数据分析师?”回答您可能会有的一些最常见的问题。“我转行成为数据分析师的经历”涵盖了向这一新职业道路过渡的主题,而“如果你找不到数据科学工作,接下来会怎样?”表明数据分析职位可能非常适合一些数据科学家,即使这个职位会让你相信并非如此。为了体验招聘过程,请查看最近的帖子,Vicky 去了"数据分析师招聘过程的幕后"并解释了"如何成为一名出色的数据分析员工"
  • 数据故事:对于 Vicky 来说,将数据转化为可操作的见解是任何以数据为中心的角色取得成功的关键,她已经就如何应对这一有时棘手的挑战写了大量的文章。总的来说,没有比“如何用数据讲故事”更好的起点了当你准备好分享你的发现时,你会想读一读 Vicky 关于创造和传递成功数据展示的建议。如果想获得更专业、更实用的建议,请阅读她的帖子,关于将机器学习成果转化为商业影响以及向非技术利益相关者展示这些成果。

请继续关注我们即将推出的下一位专题作者。如果你对你想在这个空间看到的人有建议,请在评论中给我们留言!

传统软件开发的主要方式正被人工智能和基于 ML 的开发所取代

原文:https://towardsdatascience.com/the-keyways-conventional-software-development-is-being-replaced-by-ai-and-ml-based-development-438c9198f62a?source=collection_archive---------47-----------------------

渗透了整个数字空间的机器学习(ML)和人工智能(AI)现在正被用于软件开发过程。显然,随着人工智能和其他机器学习技术在最新软件应用中的作用越来越重要,这些技术在软件开发过程中的运用是不可避免的。

就在开发过程中使用这些技术的各种努力而言,两者都被证明在某些方面非常有效地替代了手工开发任务。未来,它们将使开发过程的自动化比以往任何时候都更容易。

照片由在 Unsplash 上拍摄

评估 AI 和 ML 的影响

大多数专家研究表明,人工智能很可能在软件设计、开发和测试中扮演一个划时代的角色。

正如弗雷斯特研究公司 2016 年的一份报告所表明的那样,人工智能和机器学习很可能在生成代码方面发挥重要作用。根据研究人员的说法,在未来, AI 和 ML 也将能够根据自然语言中针对它们的指令和要求来编写软件程序。

与此同时,也有预测称,由于人工智能和人工智能对开发过程的影响,开发时间将继续缩短,从而为创造力、设计和应用测试提供更多空间。印度的软件应用开发者已经开始感受到,在许多项目和开发实验室中,人工智能是由自动化驱动的。

让我们快速看一下基于人工智能和人工智能的软件开发取代传统软件开发的一些最有效的方法。

为学习增加更多价值

有抱负的年轻开发人员总是给开发人员社区带来新鲜的活力和创意。相比之下,经验丰富的人继续用他们的经验和专业知识为开发语言和最佳实践提供基础。

随着人工智能和机器学习的使用,新的和有抱负的程序员可以获得关于构建良好软件程序的方法和最佳实践的实践培训。人工智能工具可以在帮助开发人员合作和分享新软件项目的实践和专业知识方面发挥重要作用。

优化编码

制作者 UX 设计工作室在 Unsplash 上拍摄的照片

我们知道编译器是如何修复旧代码中的问题的,而不仅仅是查看原始代码作为参考。

编译器可以处理用编程语言编写的代码并将其转换为机器可以理解的语言的方式表明了人工智能和基于 ML 的开发工具如何进一步扩展这种能力。

Adobe 和麻省理工学院计算机科学和人工智能实验室技术开发了氦软件程序,能够修复旧代码,而不需要参考任何原始代码。

测试和错误修复变得更加容易

多亏了人工智能和 ML,软件开发人员不仅能写出更好的代码,还能更容易地检测和修复错误。找到装载了 bug 的部署就绪文件的担心终于消失了。在软件测试中使用机器学习算法将有助于促进更多的自动化。

随着人工智能取得显著进步,软件开发人员和 QA 测试人员将使用人工智能驱动的测试和错误修复工具,这使得软件开发过程更加自动化,同时确保编程输出的最佳质量。

就在几年前,负责许多未来科技项目的组织国防高级计划局(DARPA)成立了一个研讨会,以建立一个可以自动检测和修复错误的智能解决方案。为了加强网络安全措施,研讨会揭示了如何在未来的软件开发中使用基于人工智能和人工智能的系统。

改善数据管理和数据基础设施

活动创建者在 Unsplash 上的照片

我们已经遇到了许多迹象,告诉我们机器学习可以超越传统使用的数据库索引。基于 ML 的程序可以比传统的数据库索引系统更有效、更快速地快速谈论数据的存在和位置。

更低的内存消耗和更快的输出是使用 ML 程序进行数据库索引的主要好处。在全球范围内,多种类型的研究正在进行,以使 ML 程序具备学习多维索引、优化查询等能力。

除了数据索引,机器学习已经渗透到数据基础设施的几个方面。

数据工程师已经开始使用机器学习程序来处理 Hadoop 等数据基础设施,并在 Hadoop 集群耗尽内存空间的情况下确保更快的响应时间。机器学习技能和专业知识在数据工程师和数据基础设施中越来越常见,以更有效地管理工作负载和数据响应。

由于管理困难和复杂的问题始终是数据科学的重点领域,自动化有助于管理数据管道,帮助数据工程师专注于复杂的问题。得益于机器学习,持续监控数据管道和检测问题变得比以往任何时候都更容易。

更高效地控制软件部署

照片由卢克·皮特斯在 Unsplash 拍摄

软件开发中的 AI 和 ML 程序也确保了与软件开发和部署的所有方面相对应的更有效的部署和健壮的控制。升级程序和应用程序是软件开发世界的一个关键方面,它在版本控制中起着重要的作用。如果在部署中没有适当的控制,软件程序及其可信度可能会被破坏。

通过使用 ML 和 AI 程序的能力,开发人员可以运行新的软件版本,而不用担心部署失败。这些程序还能够扫描有关部署的问题。

结论

让我们在某些方面变得现实一些。只是因为人工智能和人工智能程序被证明在缓解软件开发过程中的许多压力方面非常有效和高效,这并不能保证很快取代软件开发人员和其他专业人员。

AI 和 ML 程序只是陪伴开发人员,为他们的项目增加价值,而不是取代人力资本。技术编码技能仍然是任何软件开发项目中不可替代的,不管是什么领域。

运送数据科学项目的最后一公里

原文:https://towardsdatascience.com/the-last-mile-in-shipping-data-science-projects-well-c4fb73c35af3?source=collection_archive---------30-----------------------

参考书目

数据科学文档的最佳实践是什么?

照片由西格蒙德在 Unsplash 上拍摄

数据科学项目越来越多地使用复杂的技术堆栈,当项目转手时,省略重要信息的文档可能会成为失败点。我在数据科学实习期间亲身经历了这一点。我们的团队在生产中改进和扩展了现有的机器学习模型。我们负责大量的数据清理工作,因为数据集很脏,而且缺少数据字典。我们从前一个团队继承了一个重要的代码库——没有他们的过程或假设的任何文档。

我们最终从零开始。这比努力找出每一行代码要容易得多。对于我们这些当时对数据科学相对陌生的人来说,这是一次有益的经历,我们把自己保存详细的文档作为优先事项。诚然,随着我们的代码库变得越来越复杂,保持在文档之上是令人厌烦的,但是这是我们能够确保项目的结果对于继承我们项目的下一个团队来说是可重复的和清晰的唯一方法。

文档通常不是我们在课程中学到的东西,而是通过工作实践或在导师的指导下获得的。这可能会让学生意识不到适当和广泛的文件的重要性。然而,当我梳理 TDS 档案时,我发现几个 TDS 作者花时间来分享这个行业的最佳实践。这些帖子教您如何创建清晰准确的文档,为您的项目在团队过渡和移交期间的持续成功提供坚实的基础。

你如何建立一种“文档优先的文化”? Prukalpa 分享 Atlan 的数据团队如何应对这一挑战。这不是一个一夜之间的过程;团队集思广益,设定目标,不断迭代,并实现对文档框架的修复。他们成功地将文档整合到日常工作流程中,这表明其他数据团队也有可能采用他们的方法。

当您探索一个新的开源工具或希望了解一个项目如何工作时,自述文件通常是您首先要看的东西。Navendu Pottekkat 撰写 kickass 自述文件的指南将关键部分分解为有用的自述文件。他认为,“如果人们不知道你的软件是做什么的,那么他们就不会使用它或为它做贡献,他们很可能会在开源软件的海洋中找到更清晰和简洁的东西。”Navendu 的文章非常详细,这对于 README 指南来说是不寻常的;他还注意加入一些技巧,让它们看起来更有吸引力。

亚当·加伊特科夫斯基分享了使用 R Markdown 和 LaTeX 编写专业数据科学文档的简短指南。对于那些不经常使用它的人来说,LaTeX 可能会有一个陡峭的学习曲线。尽管如此,学习 LaTeX 是一项值得的投资,因为它提供了文本和数学公式的一致格式。

如果你仍然不相信文档是必不可少的,阿德蒙德·李为数据科学家证明了它的重要性。他认为文档确保了可再现性和项目的完成,并建议同行为了可读性而仔细阅读它总是一个好主意。

在编写更好的文档方面,你有最喜欢的资源吗?你的团队使用的一些最佳实践是什么?删除一些链接,我想在评论中了解更多!

“后来者居上,先者居后”……来自 M5 竞赛的感悟

原文:https://towardsdatascience.com/the-last-will-be-first-and-the-first-last-insights-from-the-m5-competition-f0b9290dc45?source=collection_archive---------35-----------------------

在大多数供应链中,预测准确性规则。这也是你的北极星度量吗?那么,这篇文章很可能会改变你的观点…

GR Stocks 在 Unsplash 上拍照

在之前的一篇文章中,我大力支持由 Vekia 开发的新一代指标,该指标关注预测的业务影响,而不是其准确性/精确度。

对于那些错过这篇介绍性文章的人来说,这里是“决策影响”的执行摘要:实现新一代面向业务的指标的 10 个理由 [1]。

  • 预测的目的不是(也从来不是)提供有史以来最好的预测!其目的是做出最佳决策。
  • 然而,现有的指标只能衡量预测的内在准确性。没有一个考虑到它的实际用途和它所带来的价值。
  • 通过利用“以成本为导向”的数字双胞胎,从业者可以从一系列关注预测的“决策影响”的新指标中受益。
  • 这组新的所谓“决策影响”(DI)指标开辟了新的视角,不仅有利于需求规划者,也有利于整个公司。

这篇介绍性的文章收到了从业者、学者和软件供应商的大量反馈、支持和建设性的批评。我真的要感谢他们所有人!

几乎每个人都对应用程序的例子非常感兴趣——我称之为概念验证(POC)。开始了!

这篇新文章是系列文章的第一篇,旨在通过真实世界的用例来展示这种方法的价值。

这一系列是从不同的角度审视现有实践的机会。所以,请随意分享,评论和批评!我总是把这种接触看作是减少错误和不断改进的机会。

对我有什么好处?[剧透警报]

  • 这篇文章提供了许多关于有效实施“决策影响”(DI)指标的细节
  • DI 指标的第一个用例证明了准确性指标会导致选择从业务角度来看绝对不合适的预测方法。事实上,“最好的”方法可能会引发最糟糕的决策!

作为游乐场的“沃尔玛”M5 竞争数据集

由法比奥·布雷特在 Unsplash 上拍摄的照片

在 Vekia ,我们利用“决策影响”指标为各行业(电信、制药、零售、能源、维护等)的客户造福。).但是很容易理解,我们重视他们的隐私,不会分享任何关于这些内容的信息(至少在没有事先授权的情况下)。

然后让我们切换到一个既相关又公开的数据集。我很确定我们选择的这个会让这个系列更加有见地!

在潜在的面向预测的数据集当中,最令人兴奋的一个数据集于 2020 年发布,以支持第五届 Madrikakis 竞赛。

我很肯定你已经听说过这个由马克里达基斯开放预测中心 (MOFC)组织并在Kaggle.com举办的全球预测竞赛。这项竞赛以尼科西亚大学教授斯皮罗斯·马克里达基斯博士的名字命名,他对预测实践做出了(并且一直在做出)令人印象深刻的贡献。如果你想更多地了解 M5 竞赛,这里是了解它的地方:https://www.kaggle.com/c/m5-forecasting-accuracy

让我们回到数据集。

这个数据集中有什么?

照片由 Myriam Jessier 在 Unsplash 上拍摄

这个数据集是由世界上收入最大的公司沃尔玛提供的,用来预测未来 28 天的日销售额。该数据涵盖了美国三个州(加利福尼亚、德克萨斯和威斯康星)的 10 家商店,包括商品、部门、类别和商店的详细信息。此外,它还包含解释变量,如价格、促销、星期几和特殊事件。

拥有 30,490 家产品 x 商店的情侣,这个数据集是我们实验的绝佳场所。

蛋糕上的樱桃是:来自世界各地的数百名预测者利用这个数据集生成了可能的最佳预测。竞赛结束后,商务部宣布了竞赛结果,发布了“待预测”销售额,以及 24 个“基准”预测和前 50 名“提交”。

因此,通常情况下,我们不仅有描述商店、产品和销售的数据,而且还有 74 个预测,我们可以利用这些预测来基准测试我们的“决策影响”指标。

就其完整性而言,该数据集包含不少于 6300 万个每日预测。牛逼!

10 家店
x 3049 产品
x 28 天
x 74 预测
= 63175280 日预测

这个数据集中没有什么?

Madrikakis 竞赛就是关于预测的。不出所料,它没有为这些预测旨在支持的决策提供线索。

但是,如您所知,“决策影响”指标需要考虑消耗预测的决策过程。因此,我们需要一些额外的数据来模拟一个现实的补货过程和一个成本函数。

接下来让我们做一些假设!如果您对这些细节不感兴趣,可以随意跳到下一节“让我们开始使用这个数据集”。

补给策略

  • 交付周期
    我们不知道创建补货订单和有效商店补货之间所需的交付周期。让我们假设 3 天是必要的。
    给定订单在第 1 天触发,我们将只考虑从第 4 天开始的需求。
  • 订货周期
    你也知道,零售店不是一个月才补货一次。订单周期通常因产品类型、销售速度、存储容量等而异。但是为了简单起见,让我们选择每周订单周期。我们的补货流程旨在覆盖一周的销售。第 1 天触发的决策涵盖第 4 天到第 10 天的销售。第 8 天触发的决策涵盖第 11 天到第 17 天的销售。在第 15 天触发的决策涵盖第 18 天到第 24 天的销售。
  • 补货政策
    让我们实施一个动态(T,S)【定期审查,逐级订购】补货政策。
    该政策考虑了预测、初始库存、安全库存和包装尺寸。由于包装尺寸允许不同的订单数量(取决于应用的舍入函数),我们的政策将评估每个场景的经济成本(如下所述),以最终选择利润最高的一个。
  • 安全库存
    让我们配置安全库存,以达到 95%的服务水平。

价值函数

成本函数用于根据每个补充决策的真实业务影响对其进行评分。尽管成本可以用不同的单位来表示,但是用货币值来表示给定决策的成本还是很方便的。

为了评估这些成本,我们将再次丰富现有的数据集并做出一些假设:

  • 订购、运输和处理成本
    履行订单会产生订购、准备、考察、运输等成本。这些通常被称为“固定成本”。让我们假设这些成本代表每 1000 美元购买价值范围的 40 美元。
  • 持有成本
    持有成本与未售出存货的存储相关联。让我们假设年持有成本是存货价值的 10%(按购买价格估价),即。每周 0.19%。
  • 短缺成本
    当需求超过可用库存时,需求和客户商誉都可能丧失。这个成本通常被称为短缺成本。随着零售商推出大量类似产品,一部分需求被转移到其他产品上。让我们假设实际上只有一半的销售额会流失。短缺成本可以用每笔销售毛利损失的 50%来衡量。

然后,总决策成本被计算为这三个基本成本的总和。

附加产品描述

  • 毛利率
    数据集提供每种产品的销售价格,但毛利率未知。由于需要这些数据,因此根据 Statista.com 基准[2]假设了以下值:食物:56.77% /爱好:50.37% /家庭:43.29%。
  • 包装尺寸 显然,在杂货零售中,很少有产品是单独补充的。然而,包装尺寸不是这个数据集的一部分。然后,我们将根据描述杂货零售中常用包装尺寸的专有数据集,为每种产品指定一个定制包装尺寸。

作者图片

  • 初始库存
    补货发生时,货架希望不是空的。显然,剩余库存仍在,应予以说明。
    由于我们的补货政策旨在保证覆盖期结束时的安全库存,我们将此数量作为初始库存。

让我们开始研究这个数据集

照片由动力赖在 Unsplash

基于上述假设,数据集能够分析由 74 种不同预测方法支持的 6,860,250 个补充决策。现在让我们看看我们能从他们身上学到什么。

作为第一个分析,我建议集中计算每种方法的成本,并将它们与它们的准确度等级进行比较

如果传统的预测准确性指标本身就能提升最佳方法,那么就没有必要在此基础上添加新的指标。但是,如果不是这样,“决策影响”指标就有意义了……

74 种预测方法

该数据集提出了 74 种不同的预测方法,由 24 种“基准”方法和 M5 竞争者“提交”的前 50 种方法组成。这些方法从最简单的“天真的方法”到最先进的基于人工智能的方法。

评估成本

这些方法中的每一种都会触发自己的决策。之前定义的 digital twin 支持模拟这些补货决策和测量成本。

我们得到的结果显示了各种各样的成本,从 77.2k 美元到 116.5k 美元不等!3.92 万美元的差额并非轶事,因为它代表不少于 1.4%的期间营业额。

下图显示了每种方法及其相关成本。方法按从最便宜到最贵的顺序排列。

作者图片

这里是我们可以得到的第一个见解:最便宜的解决方案碰巧大多是竞争对手的“提交”。但是……并不是所有的提交都优于基本基准,即使它们在超过 5,507 个团队的“前 50”方法中。事实上,超过三分之一的公司(17 家)的表现低于“F_ESX”基准!

M5-竞赛排行榜

现在让我们将这些成本与 M5 官方排行榜[3]进行比较。

M5 组织根据一种称为加权均方根标度误差(WRMSSE)的预测准确性指标对每种方法进行评分[4]。

更新 27/05/2021:正如Nicolas vande put所指出的那样(非常感谢),M5 官方排行榜是建立在每种方法的平均 WRMSSE 的基础上,在各个级别(从 L1“全球”到 L12“项目 x 站点”)计算得出的。

下图将每种方法的准确度等级添加到之前的显示中。

作者图片

提交等级平均低于基准等级。但很明显,M5 竞争排名与商业成本关联不大。最差的例子是 Matthias 的方法,它在竞争中排名第二,而从商业角度来看,它是仅次于 Naive benchmark 的第二昂贵的方法。

竞赛排行榜与成本的相关性很差。这是事实。但是其他准确性指标呢?它们会有更强的相关性吗?让我们对此进行评估!

其他指标排行榜

为了评估其他指标在捕捉业务成本方面有多好,我们计算了 MAPE、wMAPE、sMAPE、MSLE、MAE、MSE、RMSE、WRMSSE、bias、NFM (最后两个是 BIAS 指标)以及它们各自的方法排名。

下图显示了这些排名。这些方法总是按照从最便宜到最贵的顺序排列。

作者图片

尽管大多数指标认为上半年的排名低于下半年,但从业务角度来看,这种相关性还远远不够好。一些表现不佳的方法仍然会被分配到很低的级别!

决策影响指标

现在,让我们把新引入的指标放入测试平台。

我们的新指标包括迪奥、迪诺和迪娜。***衡量的是错误预测的财务成本。然后,它可以很好地与准确性指标相比较。

那么它与成本有什么关系呢?下图显示了各种方法的成本及其相关的 DIao 等级。

作者图片

根据设计,决策影响指标在计算时会考虑成本。因此,毫不奇怪,***指标与成本密切相关。

这一指标在确定最合适的业务预测方法方面表现出色!

决策影响排行榜

哎呀…我正要结束这篇文章,却没有分享“业务”排行榜!在这里!

“后来者居上,先者居后”……我们祝贺:

  • 之前排名第 21 位的希腊雅典
  • Hiromitsh Kigure (日本),之前排名 45
  • 莱奥克莱门特(法国巴黎),之前排名 18

完整的 DIao“业务”排行榜在这里,包括新的 DIao 排名和原来的 M5 竞赛排名:

作者图片

话虽如此,人们可能仍然会问:“为什么我们应该关注 DIao(它需要模拟实际和 oracle 决策成本),而预测决策成本可能是一个更简单和最直接的指标?”

简短的回答是:“因为 DI 指标比预测决策成本有更多的用途。”

我们将在本系列的下一篇文章中逐一介绍它们。

本文旨在阐明当前的实践、局限性和可能的改进。它肯定不是完美的,并且受到限制。

如果你觉得这很有见地,请分享和评论…但是,也请随时挑战和批评。如果你想进一步讨论这个问题,请联系我!

无论如何,敬请关注下一篇文章!同时,请访问我们的网站www . vekia . fr了解我们在为供应链提供高价值方面的专业知识和经验。

Linkedin:www.linkedin.com/in/johann-robette/
Web:www . vekia . fr

参考及更多

[1] Vekia,J. Robette,“决策影响”:实施新一代面向业务的指标的 10 个理由,2021

[2]Statista.com,截至 2018 年全球零售商店平均毛利率,按零售部门划分,2018 年

[3]Kaggle.com, M5 预测——准确率,排行榜,2020

[4]商务部, M5 参与者指南,2020 年

[+]弗蒂奥斯·彼得罗保罗斯,王迅,斯蒂芬·m·迪斯尼,预测方法的库存绩效:来自 M3 的证据-竞争数据,2018

[+] Nikolaos Kourentzes,Juan R. Trapero,Devon K. Barrow,优化库存规划预测模型,2019 年

高效数据科学家的懒惰心态:自动化如何有所帮助

原文:https://towardsdatascience.com/the-lazy-mindset-of-effective-data-scientists-how-automation-can-help-fbb48a9c9212?source=collection_archive---------48-----------------------

在数据科学中利用 CI/CD 和自动化

照片来自 Unsplash 上的普里西拉·杜·普里兹

让代码和自动化为你工作。如果您经常发现自己一遍又一遍地编写类似的代码,那么是时候考虑自动化任务或分析了。也许你正在开始一夜之间运行类似的分析,或者在每次运行时用不同的输入参数比较模型结果,但是你在有效地完成这些任务吗?我通常希望在我的日常工作中改进两个方面:(1)使用 CI/CD 的标准代码检查,以及(2)使用自动化作业执行分析。

在数据科学领域工作时,我发现我经常在许多不同的笔记本上编写代码,并与团队中不同的数据科学家共享。如果我正在做的任务开始变得重复,或者其他人做一些非常相似的事情,那么我就后退一步,看看这个过程。我看看能不能利用 CI/CD 管道、脚本或自动化作业来帮助工作,这样我就可以做到事半功倍。

用于代码检查的 CI/CD 管道

CI/CD 管道是我在工作流程中经常使用的东西。您可以设计这些管道来执行日常任务,并与数据科学家共享结果。除了单元测试之外,您还可以使用 CI/CD 管道。您可以从中开始工作,在分析变更期间执行性能指标,开始库的部署,等等。

作为一名开发人员和数据科学家,我寻找方法来简化我的团队的流程,并使这些标准检查更容易运行。当我打开一个 pull 请求时,管道开始运行验证、例行检查等等,以验证代码是否按预期运行并产生正确的结果。这些管道加速了验证代码变更和分析变更有效性的过程。因此,当在同行评审中检查分析概念时,主要检查已经自动完成。剩下我要做的就是检查代码中的逻辑错误、低效和文档。

在考虑新管道时,我经常问自己的问题是:

- Can the task be run in less than 6 hours, which is our pipeline's requirement? - Can the result of the pipeline be easily shared during a pull request? How will the outcome be used to validate the code during a pull request? - Does the task aid in deciding the pull request or release of the artifacts after the pull request is merged? Such as deploying documentation, a website, or a library. - Do you have common artifacts that you need to release during or after a pull request or merge? How can you automate those releases using pipelines?

常见任务的作业自动化

如果我不创建一个管道来帮助我的任务自动化,我会在创建和自动化标准笔记本电脑和工作中寻找效率。我每小时、每晚或每周为我的团队运行许多作业,并且只在我需要更新或者某个作业警告我失败时才检查代码。自动化这些任务使我能够在后台单独运行时专注于其他工作。当您查看本周的任务时,是否有任何领域可以纳入自动化作业?

我创建的一些作业没有按计划运行。这些作业要么等待某人按下按钮,要么等待另一个进程来触发它们。代码将在我需要时运行任务,并且我可以根据需要单击一个按钮来重新运行它。例如,每月一次,我需要为另一个团队生成分析工件。在不同的时间,我可能需要也可能不需要代码,所以我创建了一个作业,只需单击一个按钮就可以根据需要运行。制作我需要的工件并打包它们只需要 5 分钟,而不是每次都重写代码。

如果一个人没有开始工作,那么另一个进程正在开始它。通常,我的团队将这些作业设置为由另一个作业或管道启动。触发后,作业将运行并创建结果。

当我创造就业机会时,我倾向于考虑的事情是:

- Is the task run every so often and can live in a notebook, unscheduled job, or manual pipeline when you need to rerun it? - Is the task run on a schedule and placed into an automated job with that schedule? If yes, then create an automated job that takes in the necessary input. - What inputs are needed for that job or could be changed by the user? These inputs you can pass into the job when it is started. When you include inputs, consider items that you may want to change later even if you are not changing the input value now. For example, the number of files to read in. You may want to keep it at 200 now but change it later, so it should be input. - Is the task, something that is run after another action has been completed? You could create a job that is started when the previous item has been completed, such as having a CI/CD pipeline that kicks off an automated job, such as using Azure Pipelines to kick off jobs in Databricks.

最后的想法

让代码和自动化为你工作。如果您发现自己重复运行类似的任务和分析,确定是否有一种方法可以建立一个管道或自动化作业来处理这些工作。自动化程度越高,流程中出现人为错误的机会就越少。

您如何使用管道或工作来帮助您的流程?

如果你想阅读更多,看看我下面的其他文章吧!

</4-things-i-didnt-know-about-being-a-team-lead-in-data-science-1f96293cb8aa>

Shopee Singapore 的数据科学面试流程

原文:https://towardsdatascience.com/the-lessons-i-learned-from-failing-the-job-interviews-at-shopee-singapore-dd24b9f2bf3d?source=collection_archive---------5-----------------------

办公时间

经过两次失败的尝试,我成功了。以下是为下一次数据科学面试做准备的一些提示。

商店总部。作者由the greats ' rean根据Creative CommonsAttribution-Share like 4.0 International许可。

这篇文章包括了我从新加坡 Shopee 公司的求职面试失败中吸取的教训。三次面试之后,我开始了一份新工作,在 Shopee Singapore 担任数据科学家。

你能从这篇文章中期待什么?

您会发现关于如何申请 Shopee Singapore 数据科学家职位的最全面的概述。我将提到一些资源,您可能会发现这些资源有助于准备任何公司的数据科学家面试。

什么样的读者应该读这篇文章?

学生或没有经验的数据科学家将能够从这篇文章中受益,因为他们准备参加 Shopee Singapore 数据科学职位的面试。如果你已经是一名数据科学家,你将会学到在面试中会遇到什么,如何准备技术面试,以及如何给面试官留下深刻印象。

写这篇文章的目的是什么?

2019 年以来,我参加了许多 Shopee Singapore 数据科学家职位的面试。每一次失败的面试都迫使我认清自己的弱点。为了增加我获得面试的机会,我尝试了各种媒体来收集别人的经验,并寻找有经验的人来帮助我做准备。第一轮,让简历通过很容易;你在接下来的面试中犯的任何错误都可能让你失去最后一份工作。为了不经历我过去代价高昂的失败,我希望你能避免它。

虽然我不能保证你会遇到和我一样的情况,但你可以用我做的事情来检验你的知识,让你的面试朝着正确的方向准备,以提高你的接受率。

事不宜迟,我先解释一下我申请 Shopee 的原因。

为什么 Shopee 这么受欢迎,为什么我选择加入这家公司?

当您考虑数据科学时,Shopee 是新加坡少数几家顶级上市公司之一。在我看来,它如此出名有三个原因:

  • Shopee 是东南亚家喻户晓的电子商务平台。
  • Shopee Code League 是一项地区性竞赛,涵盖数据分析、数据科学和算法问题,是该地区最大的学生和专业人士技术竞赛之一。这场比赛无疑提高了 Shopee 在数据科学领域的声誉。

来源:https://www.youtube.com/watch?v=3IZAspRMRsY

  • Shopee 是 Sea 集团的一部分。如果你持有 Sea 股票,你就知道它们有多值钱。自去年病毒爆发以来,该公司的股价飙升超过 300 美元。Shopee 最近击败 MercadoLibre,成为巴西月用户数排名第一的购物应用,这证明了 Shopee 的股价将比现在更有价值。股东肯定会从如此高的增长中受益。因此,如果你作为一名数据科学家获得股票期权,对你来说可能是一笔可观的收入。

作者图片

是什么让 Shopee 成为我想为之工作的公司?

来源:https://www.youtube.com/watch?v=wgQUkza0vSM

由于 Shopee 的快速增长,你可以期待事情发展得非常快。换句话说,如果你喜欢挑战自己,这绝对是一家你应该为之工作的公司。与其他购物应用不同,Shopee 不仅仅让你购物。如果你喜欢在 Shopee 上购物,你会注意到该应用程序有许多功能,包括 Shopee Live、Shopee Live Chat、Shopee Feed 等等。因此,您将有机会了解如何将数据科学应用于这些您经常使用的功能,以提高公司的盈利能力。这些都是宝贵的经验,可以帮助你发展成为一个具有商业思维的技术思想领袖。最后但同样重要的是,公司文化是充满活力和年轻的。在你职业生涯的早期阶段,你不会想呆在一个被那些满脑子都是过去的人包围的公司里。置身于正确的文化中肯定会激励你走进办公室,享受你的工作。作为 Shopee 的前实习生,我仍然很欣赏那里的文化。

所以现在就说说我的面试经历吧。

我的第一次面试尝试

我的职业生涯始于一名机械工程师。我决定将我的职业生涯转向软件开发。在我完成深度学习 Coursera 专业化后,我爱上了数据科学。我为一家跨国公司做过几个数据科学项目。在 LinkedIn 上看到一个空缺后,我申请了 Shopee Singapore 的数据科学家职位。

作者图片

在第一轮中,你将接受 Shopee 招聘人员的面试。为了确定我是否是合适的候选人,她审查了我在数据科学方面的背景和经验。之后,她把我的简历发给了招聘经理,他们会决定你是否适合数据科学团队。

作者图片

然后,我收到了进入下一轮的 offer,这是一个由 Glider 在线进行的编程测试。我准备考试的时间太少了,只有时间在考试前通读 LeetCode 的一些简单问题。结果我第一次面试尝试失败了。

作者图片

我发现我仍然缺乏编程基础。为了准备我的下一轮申请,我做了以下事情:

  1. 经历了尽可能多的 Leetcode 问题。话虽如此,只是盲目地通读所有的问题是非常徒劳的。提高我的弱项的更有效的方法是花更多的时间练习它们。例如,递归不是我的强项。所以我试着理解所有和递归话题相关的技巧和中等问题。
  2. 利用他人的经验。你可以谷歌搜索一下,看看面试中问了哪些问题。举个例子,这个网站对懂中文的人来说会很有用。之前考过的,在这里分享一下遇到的问题。当我阅读帖子时,我了解到 Glider 的大多数问题都是中等水平的。为此我在备考的时候比较关注中级 Leetcode 题。如果你是说英语的人,那么 Glassdoor 网站是一个从其他面试官那里获得建议的好地方。即使大多数在 Glassdoor 上留下评论的人最终都没有被录用,我仍然知道如果我成功通过在线测试,剩下的面试将会如何进行。这有助于我提前准备技术面试。
  3. 跟师傅学的。我是一名视频学习者,我发现当我看视频教程时,我学得很快。所以我去了 YouTube,搜索我想了解更多的话题。使用下面的 YouTube 视频作为例子,我能够学习递归的基础。此外,它还展示了各种例子,在这些例子中,您可以以一种实用的方式使用所学的概念。看了两遍视频,我能够自信地回答 Leetcode 上的递归问题。虽然我无法回答所有的问题,但在看到答案后,我能够向自己解释其中的诀窍。在哔哩哔哩上也有很多免费资源供中国读者使用,包括最常见的 Leetcode 面试问题指南,以及如何学习这些问题的视频教程。他们解决问题的方法真的对我很有启发。一旦你学会了这些方法,我就能轻松地将它们应用到类似的问题中。

编程中的递归。来源:https://www.youtube.com/watch?v=IJDJ0kBx2LM

由于这次失败的尝试,我认识到我需要彻底理解基本的编程概念,并在下一次申请相同的角色之前练习至少 100 个 Leetcode 问题。

我的第二次面试尝试

Shopee 正在招聘,我再次申请了同样的数据科学家职位。

作者图片

一位招聘经理接受了我的简历,给了我一个滑翔机测试的链接。这次我更有信心,设法在规定时间的一半内完成了考试。在完成测试后的一天内,我收到了同一位招聘人员的电子邮件,邀请我参加第一轮技术面试。

作者图片

当我接受采访时,面试官问我关于我的项目经历,我可以从他的反应中看出,他对我的项目非常感兴趣,因为这些项目对他来说很新。为了口头解释它们,我花了大约 30 分钟。之后,他问了我两个 Leetcode 问题(一个简单,一个中等),我被要求在我自己喜欢的编辑器中对它们进行编码。以下是我从这次技术访谈中获得的收获:

  • 两个问题取自 Leetcode,我必须为每个数据结构构建自己的类。举个例子,我被要求解决反转链表的问题。他让我构建一个链表类,并通过处理 2 -> 4 -> 6 这样的序列来解决反转问题。过去,我曾经使用我的编辑器解决过类似的问题,所以我非常熟悉如何创建 ListNode 类。此外,他希望将链表打印成一个字符串(例如 6 -> 4 -> 2),这样他就可以检查结果。我强烈建议任何准备技术面试的人都应该了解如何编写数据结构,如何回答问题,以及如何展示他们的结果。
  • 我的面试官允许我在开始编码之前询问所有可能的限制。要构建一个数据科学项目,我们总是需要在构建产品之前考虑用户的需求。因此,这是您展示数据科学产品经验的绝佳机会。通过提问,你也可以获得更多的时间去思考解决编码问题的算法。
  • 当我在编码答案时,面试官让我阐明我的思维过程。他这样做的原因是为了测试我的沟通能力和编程效率。如果你想让面试官明白你的思路,有两个办法:一是你可以一边编码一边告诉他你的做法;第二,你可以先写你的代码,收集你的想法,然后解释你的推理。就我而言,我更喜欢第二种方法,以防任何中间谈话打断我的思考过程。第二种方法的优点是,在编码之后,你可以检查你的代码,并在与面试官讨论之前以更全面的形式构建你的思维过程。无论您选择哪种方法,让他们能够理解您的代码是至关重要的。

问题在限定时间内完成(2 个问题 30 分钟)。整个技术面试花了大约 1 个小时完成。

面试 3 个小时后(Shopee HR 团队真的很有效率),通知我通过了第一次技术面试,三天后会有第二次技术面试。

作者图片

在我的第二次技术面试中,我讨论了我的项目经验的技术方面。面试官问我对过去项目所做工作的理解,以及我对项目成功的贡献。例如,在解释我的图像字幕项目时,他问我如何评估我的模型的准确性。我在回复中告诉他我用 BLEU 做评测。然后他继续问我为什么不使用 Meteor 或苹果酒进行评估。然而,我告诉他,我对 Meteor 和 CiDER 很熟悉,但我无法回忆起它们的算法。这会对他对我的学科知识的看法产生负面影响。

最后,他似乎对我的工作感到有点困惑,但他不想花太多时间,因为在结束一个小时的技术面试之前,他有许多问题需要问。接下来,他问我的制作经验。例如,我如何扩展我的数据科学项目,我使用了什么工具,以及一般流程是什么样子的。由于我过去的大部分项目都专注于模型构建,所以我没有参与产品代码的部署。所以,我无法回应。在这个阶段,我被拒绝了,正如你所料。

作者图片

我只差一次面试就能拿到最后的工作机会了。因此,我在第二次技术面试中的表现让我很沮丧,但我很快站起来,做了如下反省:

  • 当我解释我的数据科学项目时,准备演示幻灯片至关重要。由于面试官可能不熟悉我解释的项目,我注意到他很容易在解释过程中迷失方向。因此,整个管道应该在流程图中显示出来,让他确切地知道正在发生什么。
  • 如果我进行了广泛的研究,情况会更好,即使我没有考虑项目中的一些指标。必须理解项目中的每一个术语不是一件容易的事情,但是至少我应该能够记住那些常见的术语。为此,我列出了我之前参与的所有重要项目,并阅读了几篇文章(包括不同公司的数据科学案例研究)和论文,以了解其他人是如何完成相同任务的。写下我错过的任何术语,并确保我很好地理解它们,这将是一个好主意。
  • 我的重点应该是整个过程,包括如何将项目生产化。除了上 Udemy 的课程,我还和制作组聊了聊,向他们学习。此外,我还问了一些有生产环境工作经验的朋友,他们曾经面临过什么问题,以及他们是如何克服这些问题的。最后,我开发了一个自己的小项目,并将其公开。在我的演示中,我展示了 Kubernetes 如何自动处理负载,以及 Redis 和 Celery 如何高效地批处理传入的推理请求。

有些人可能很难理解为什么数据科学家需要学习如何部署应用程序。我相信大多数公司会希望你自己管理整个数据科学产品管道,除非你在一个专门的团队中工作,在那里你会被给予一个特定的管道来关注。此外,了解一切是如何工作的有助于我们快速识别流程中的任何问题。因此,如果你想保持竞争力,你应该熟悉整个数据科学管道。

我的最后一次面试尝试

大约六个月后,我接到了 Shopee 招聘人员的电话,邀请我参加数据科学家职位的面试。当我接到电话时,我很惊讶。然而,我记得招聘人员在我第二次面试失败后告诉我,我的简历会被保存在系统中,如果未来有任何符合我的简历的职位空缺,我会收到通知。换句话说,如果你申请一份工作,你应该在每一次面试中都表现良好。即使面试失败,你的表现也会决定你将来是否被考虑。

作者图片

在电话中,招聘人员检查了我的现状,还回顾了我之前面试中的类似问题。幸运的是,我的简历被一位招聘经理接受了。距离上次面试已经过去了六个月,我被要求再次经历整个过程。

作者图片

这次滑翔机的测试有点不同。这些问题难度适中。第一个问题可以在 Leetcode 上找到。然而,第二个问题有点棘手。他们提出了一个动态编程问题,作为发生在 Shopee 的一个问题。因此,当时的情况感觉很真实,但实际上相当于 Leetcode 上的一个中等水平的问题。我的建议是,备考的时候不要过度记忆编码题,但是要保证把概念理解透彻。

作者图片

在我成功通过 Glider 的测试后,我的下一次面试是由一个数据科学项目负责人进行的。在这些问题中,他问我过去的项目是如何完成的,以及我为什么对 Shopee 感兴趣。我最后的 20 分钟是用来回答 leetcode 上的一个中级问题的。与我上次采访不同,我被问了两个 Leetcode 问题,由于时间限制,他决定不问第二个问题。尽管我担心这会影响我的表现,但面试官向我保证不会。考虑到他想评估我的编码能力,他认为一个问题就足够了。幸运的是,我被邀请进入下一轮。

作者图片

正如我之前提到的,我准备了幻灯片来演示我的项目流程。只有 40 分钟来展示我的项目,我只选择了我最喜欢的两个。当我介绍项目时,有人问了以下问题:

  • 我如何收集和使用数据
  • 我所做的数据预处理
  • 我试验过哪些型号,为什么我选择这些型号用于最终生产
  • 我如何选择指标,为什么
  • 我做了什么来部署模型
  • 我如何进行错误分析,如何改进模型
  • 最终用户的反馈是什么样的
  • 我做了什么来设计我的 MLOps

当面试官看到我的幻灯片时,她非常感动。她问我为什么项目管道是这样设计的,我是如何解决边缘案例的。在准备你的技术面试时,我强烈建议你仔细看看你的项目,了解每一个相关的元素。解释为什么每个流程都包含在管道中是很重要的。举个例子,面试官问我,如果预测中出现一个低俗的词会怎么样,流程的哪一部分是为了防止这种情况的发生。

在接下来的采访中,她给了我两个与 Shopee 数据科学团队相关的业务场景。我被要求概述如果由我来处理这项任务,我将如何解决这个问题。可以肯定的是,每个受访者都会有不同的业务问题。为了做好适当的准备,你必须知道 Shopee 是如何工作的,以及你在 Shopee 可能会遇到什么类型的问题。偶尔看一些国内最大的电商分享的篇文章,让我更容易回答这些问题。因此,我知道他们处理某个问题的方式,并给出了一些可能的解决方案。此外,你必须有很强的这方面的知识。假设你申请的是 NLP 数据科学家。至少,您需要了解如何使用不同的增强技术来增强您的训练数据。

作者图片

完成第二轮技术面试后,30 分钟后人力资源部通知我,我已经成功通过了。再过不到一个小时,我就要进行最后一次面试了。(招聘人员在同一天为我安排了 2 次面试。如果我通过了第二次面试,我将被允许进行最后一次面试。我真的很感谢这样的安排,因为我不必再为了参加面试而申请一天的假期。)

在我等待最后一次面试的时候,我在想会被问到什么样的问题。我找到了一篇文章,讨论了最终面试将会如何进行。一般来说,最后一次面试只是形式上的。如果你到了这个阶段,这个机会很可能会找上你。然而,对我来说却不是这样。

在最后一次面试中,部门主管要求我做一个简单的自我介绍。然后他质疑我的工作经验和技能。在面试的第二部分,他给了我两个需要解决的商业问题。它们与前一轮面试的不同之处在于,它们是一组完全不同的业务问题。然而,所有的商业问题都与 Shopee 的日常运营有关。由于我没想到会出现这样的问题,我有点不知所措。尽管我设法提出了一些简单的解决办法,但我并不满意。

面试总共花了 15 分钟,比预定时间短了很多。面试一结束,我就让招聘人员给部门领导发一条信息,让他知道有几个比提供的解决方案更好的解决方案。希望这至少会给我的表现增加一些价值。

提供

来源:https://tenor.com/view/yes-happy-excited-gif-13936939

我认为我在上次面试中的表现不足以获得这份工作。令我惊讶的是,我第二天就拿到了工作邀请(还是那句话,Shopee HR 的效率高得令人难以置信)。

准备第一次技术面试的附加材料

当我准备我的第一次技术面试时,我在网上搜索,看看是否有人有机会分享他们的经历。结果,我发现这个媒体帖子非常有帮助,因为它慷慨地分享了整个面试过程和他在面试中遇到的问题。根据我对编码问题的搜索,我为自己的准备准备了以下问题:

  1. 蒙特卡洛模拟
  2. 高级蒙特卡罗模拟(Bytedance 的问题)
  3. 霍夫曼编码

给学生的建议

对于正在最后几年学习并考虑毕业后从事数据科学职业的学生,或者正在寻找数据科学实习机会的三年级学生,我强烈建议为您的学校项目准备一份演示文稿。理想情况下,这些项目最好是与数据科学相关的。

当你使用一个算法时,了解它的工作原理和整个项目是如何组合在一起的是很重要的。一定要准备好告诉面试官你是如何做实验的,你用了什么方法。例如,如果您在项目中使用朴素贝叶斯算法,它的约束是什么?有时,数据科学问题可能需要您使用神经网络来解决。如果你决定展示你在深度学习方面的知识,你需要知道激活功能是什么,以及如何区分它们。

来源:https://sef iks . com/2020/02/02/dance-moves-of-deep-learning-activation-functions/(CC BY 4.0)

为了获得最好的结果,请在面试前重温你的基本知识并彻底了解你的项目。

结论

我知道这篇文章很长。然而,我希望你能从我的错误中吸取教训,并有足够的信心准备你的工作面试。

如果你能把这篇文章分享给你的朋友,并给我一个赞,如果你觉得这篇文章对你的求职有帮助的话,我将不胜感激。如果您对学习如何构建数据科学项目感兴趣,请关注我!在接下来的文章中,我一定会分享更多关于我的数据科学经验。

如果您有兴趣申请 Shopee 数据科学家的职位,请不要犹豫,通过 alotofdata0000@gmail.com联系我。我很乐意给你准备面试所需的任何建议,并推荐你去应聘这个职位。

关于作者

Woen Yon 是新加坡的一名数据科学家。他的经验包括为几家跨国企业开发先进的人工智能产品。

他喜欢交朋友!欢迎在 LinkedIn 和 Medium 上与他联系

https://laiwoenyon.medium.com/

数据分析师的生活

原文:https://towardsdatascience.com/the-life-of-a-data-analyst-263050370272?source=collection_archive---------0-----------------------

如图纸所示

这些天来,edium 是我的创意出口。作为一名数据分析师,我可以有点创造力,比如当我设计一个仪表板或解决一个有趣的问题时,但这并不是我工作的大部分。

因此,我没有对成为数据分析师的艰难部分感到沮丧,而是决定用文字来说明它们。

数据可用性和数据质量的挑战

作者图片

对于大多数处理大量数据的项目来说,这绝对是最大的难题:每个人想要的数据都不容易获得。这是数据工程师和数据分析师存在的部分原因,然而,有时如果一个简单的查询— select * from… —就可以获得项目的数据,那就好了!

我对大学毕业后统计学的看法…

老实说,我把学过的大部分统计学都忘了。(我甚至差点辅修了 stats!)出于某种原因,除非我每天都在使用这些概念,就像在课堂上一样,否则它就不适用。因此,下面是我作为一名数据分析师工作了一年多之后,大概掌握了多少统计知识。

作者图片

尽管如此,我永远不会说“我接受零假设”出于某种原因,这真的让我难以忘怀。

政治和协作挑战

作者图片

这在所有类型的公司工作中可能更常见,但当它被外包时,感觉就像是在他们自己的岛上。他们可能很难共事,通常在很远的地方,他们的目标似乎和我的完全不同。

为什么我们不能只做朋友??

不同层次的项目享受

作者图片

对我来说,构建仪表板最有趣的部分是头脑风暴和设计视觉效果,然后让它看起来很漂亮。其他所有方面都不那么令人兴奋(虽然非常重要)。如果我在 Power BI 工作,构建 DAX 指标是最难的部分,需要大量的谷歌搜索。

最后

不要误解我,我喜欢做数据分析师。我认为这是一份我非常适合的工作,我喜欢不断学习新的概念、技术和策略。

对于工作中我不喜欢的部分,制作图表和可视化来表达我的厌恶难道不合适吗?😃

p.s .我把这个变成了一个系列!请查看下面的第 2 部分:

数据分析师的生活—第二部分

原文:https://towardsdatascience.com/the-life-of-a-data-analyst-part-2-2c5a8e9ecc1f?source=collection_archive---------5-----------------------

如(更多)图纸所示

朋友们好!我把我的“数据分析师的生活”故事做成一个系列,因为:

  1. 我喜欢画画
  2. 我的经历产生了许多想法
  3. 第一篇文章很受欢迎

因此,请坐好,放松,滚动浏览以找到相关的内容——无论您是数据分析师、数据科学家,还是其他广泛使用数据和代码的人。

关于编码和堆栈溢出

如果你正在编码并且没有使用栈溢出,那么你要么是一个天才,要么真的错过了……老实说,这就是我要说的。

作者图片

此外,完成一个项目或一段代码并结束所有这些标签的感觉不是很好吗?

为什么我的数据集没有加入

不正确的数据连接经常发生,并且是正常数据处理工作流的一部分。然而,当您不能快速找出为什么两个或更多数据集没有按照您预期的方式连接在一起时,情况就变得很糟糕了。

作者图片

我敢说最令人沮丧的情况是文本字段相似但不完全相同——在这种情况下,需要进行模糊匹配。

在黑暗模式下

这可能只是个人喜好,但我会尽可能在电脑上的每个应用程序中打开暗(视图)模式。然后,当一个同事分享他们刺眼的白色屏幕时,这有点像对眼睛的鞭打。

作者图片

论数据质量

作为数据分析师,我的经验越多,我就越意识到数据质量的重要性。如果您不能始终如一地依赖您的源数据的准确性,您如何能够获得任何有价值的见解呢?你不能。

作者图片

与 IT 和/或数据工程师的联系改变了我的游戏规则。非常感谢他们帮助我在数据分析过程中减少了眼泪。

论处理能力

除了让你的笔记本电脑更大或更重,我不明白为什么任何处理数据的人不想要一台更强大的电脑。如果你想到一个理由,让我知道。

作者图片

我也很抱歉,我显然不会画圈圈——好在这不在我的工作范围内。

感谢阅读!如果您没有看到我在这个系列中的第一篇文章,您可以在这里找到它:

如果您不想错过本系列的下一篇文章,请注册我的电子邮件列表!

如果你转贴我的任何图片,请引用这篇文章作为你的来源。

数据分析师的生活——第三部分

原文:https://towardsdatascience.com/the-life-of-a-data-analyst-part-3-8ee4d573d21c?source=collection_archive---------14-----------------------

如(甚至更多)图纸所示

你认为我用完了关于数据分析/数据科学的插图了吗?不可能。下面是我的“数据分析师的生活”系列的第 3 部分。如果你错过了,以下是第 1 部分& 2:

我如何学习数据分析/数据科学

我大学学的是工业工程专业,所以从一些课堂和项目中学到了一点数据分析的知识。大学毕业后,我参加了一个为期 6 个月的在线数据科学项目(即 Thinkful 数据科学训练营)。现在,正如我反思的那样,我在项目中学习和实现的一切至少有一半要归功于谷歌搜索技能。

作者图片

数据科学时间管理:期望与现实

当我在研究数据科学时,我一遍又一遍地听说我大约 80%的时间将花在收集和清理数据上。虽然关于是否有这么高还存在争议,但对我来说,它一直是这个项目的至少一半。当我开始做数据分析师时,我也严重低估了验证数据所需的时间。

作者图片

此外,我知道小睡从技术上来说不是数据科学活动……但是我觉得强力小睡应该得到一些认可,因为它帮助我在大项目中生存下来。

我为什么会沮丧?

不确定这个需要更多的解释…让我们说这是由真实事件激发的。

作者图片

现在,我使用 Alteryx 来自动化或至少加速数据清理,当我不得不打开 Excel(我亲切地称之为exhell)来手动浏览数据时,这是一个很大的遗憾。我也倾向于在 Excel 中犯很多错误,因为我不经常使用它。

谁在我的 LinkedIn DM 里?

写关于数据科学的文章和活跃于 LinkedIn 会带来一些副作用,包括在平台上获得更多的 DM。但不知何故,它们从来都不是我想要的样子(也就是说,来自朋友或同事)。

作者图片

我终于有了在这个上使用圆形模板的想法,因为否则,它会太混乱。

一如既往,感谢阅读:)如果你不想错过我的下一篇文章,请注册我的电子邮件列表!

如果你转贴我的任何图片,请引用这篇文章作为你的来源。

数据分析师的生活—第 4 部分

原文:https://towardsdatascience.com/the-life-of-a-data-analyst-part-4-1bba34e69737?source=collection_archive---------8-----------------------

正如梅根·迪布尔在她的涂鸦中所描述的

你好!自从开始我的数据分析师系列*生活以来,我已经获得了许多新的关注者,所以我想简单介绍一下我自己。我叫 Megan Dibble,是一名高级数据分析师。当我第一次开始从事数据工作时,我的目标是成为一名数据科学家。但是说实话,我喜欢做一名数据分析师(尽管我的一些画可能暗示了什么)。

我感谢每一个对我在这份工作中遇到的某些困难做出回应的人。我只想花一分钟时间说,如果你正在挣扎,处理冒名顶替综合症,困惑,或对数据分析感到沮丧,你并不孤单!这是写这个系列教会我的最重要的事情之一。

*点击此处阅读 第一部分 第二部分 ,或 第三部分

好了,现在进入第四部分!给你提个醒——这些插图中的大部分都与我现在的感受有关,那就是

当人们寻找数据时

作者图片

联系我获取数据的同事有一个共同点,那就是他们现在都想要这些数据。(或者他们“昨天就需要”,这是我最不喜欢的短语,除了语法上的混乱。)

我会说,我很感激当人们都 1。知道他们想要的确切数据。确信我们的组织拥有这些数据。

当我在 Excel 中工作时

作者图片

欢迎来到命名不当的 Excel 文件的丛林!我越忙,事情就越乱。哦,还有一个建议:永远不要用后缀“_final”来命名东西我认为可能有一个 Excel 仙女对所有这样的命名分析下了诅咒,因为它永远不会是最后一个。

当我的工作变得更好的时候

作者图片

至少,技能和项目的增加(通常)也会带来收入的增加。没什么可抱怨的!如果我能画 3D 图,我会把薪水作为我的 z 轴。

当我有“空闲时间”时

作者图片

所以。很多。故障排除。

如今,当事情第一次进展顺利时,我甚至不知道该怎么办,因为我不相信自己。我再次检查我的工作,以确保我没有遗漏任何东西。如果我以某种方式爬出了故障排除的炼狱,那么我喜欢学习一些新的东西或着手改进已经平庸了太久的流程。

一如既往,感谢您的阅读——特别是如果您也是一位忙碌的数据分析师:)如果您不想错过我的下一篇文章,请注册我的电子邮件列表!

如果你转贴我的任何图片,请引用这篇文章作为你的来源。

图形因果发现的局限性

原文:https://towardsdatascience.com/the-limits-of-graphical-causal-discovery-92d92aed54d6?source=collection_archive---------22-----------------------

入门

我花了六个月的时间研究因果发现,希望找到可行的见解,可以转移到其他领域(特别是计量经济学和医学),以改善我们的观察研究方法。

我的推理如下:

  • 从观察数据进行因果推断对于许多不同的领域来说是一个非常重要的课题;更好的因果推理概念和工具可以帮助我们理清诸如经济增长的长期因素或什么样的生物学指标是生物学年龄的准确追踪者等主题
  • 在过去的 20 年里,已经有很多关于用因果图来表示因果关系的原创性研究,这在其他领域显然还没有太多的应用
  • 从远处看,因果图的想法很吸引人,因为它是简化因果关系研究的新视角
  • 尽管人们对因果图议论纷纷,而且“为什么之书”成功地普及了这个概念,但我遇到的人中似乎很少有人对因果图有清晰的理解
  • 鉴于我的数学和计算机科学背景,因果图的数学相对简单易懂
  • 思想的阐述有差距,一头是非常基础的、不完整的通俗读物,一头是学术研究论文;很少有介绍性的教程和教科书给那些想赶上艺术发展水平的人

因此,通过因果图进行的因果推理具有一个主题的吸引力,这个主题很重要,显然容易处理,但相对来说被忽视了。我让自己扮演普罗米修斯的角色,沿着因果关系往上跑,窃取已完成的研究成果,并把它交给世界各地的应用科学家。

然而,在对这个话题进行了六个月的研究后,我认定我最初的方法是一条死胡同。在这里,我解释了这个方法到底是什么,我遇到的死胡同是什么,以及这个研究项目可能的延续。

什么是因果图?

首先简单介绍因果图/结构因果模型。

结构因果模型是变量 X1,…,Xn 和与这些变量相关的随机方程的集合,其形式为 Xi = fi(X,Ui),其中 Ui 是随机变量,通常假设是相互独立的。

作者图片

这些方程隐含地定义了一个有向图,将每个变量与它们直接依赖的其他变量联系起来。这个因果图通常被认为不包含任何循环。

结构因果模型隐含地指定了其变量的联合概率分布;在这个意义上,我们可以把它们理解为一个[贝叶斯网络](https://en.wikipedia.org/wiki/Bayesian_network#:~:text=A Bayesian network (also known,directed acyclic graph (DAG).)。

结构因果模型支持三个关键操作:观察、干预和反事实。

观测值是典型的贝叶斯更新;我们知道一个节点的值,我们需要通过网络将该信息传播给它的后代和它的父母。在上面的例子中,如果我了解到患者已经接受了某种药物的治疗,这将影响他们可能表现出的症状以及最终的健康结果。

干预是我从外部影响系统时发生的事情。如果我决定自己用一种药物来治疗病人,那就会改变最终健康结果以某种方式出现的可能性。但关键的是,它不会改变患者症状的概率。更新向下流动,但不向上流动。

我们可以通过我们的结构因果模型的局部修改来表示这一点,这删除了变量 WET 的所有依赖性。为了正式表示这一点,图形因果模型上的标准符号是使用语法 P(y | do(x))来表示设置 X=x 后 Y=y 的概率。

作者图片

反事实在概念上更难理解。他们的主要思想是代表在特定的情况下,干预足以实现改变的机会有多大。

例如,假设有一个发高烧的病人来找我们,我们用 GetWellEnol 治疗他们,病人不幸出现过敏反应,病情恶化。如果我们给病人服用康复液,会发生什么?嗯,它的结果可能已经改变,因为它是治疗的因果下游。但是它的症状,以及我们不能直接观察到的背景变量的值,如病人的疾病,不能有反事实的改变,因为那些是在治疗之前发生的。所以我们不能仅仅用一个干预来表现这一点。为了确保背景变量保持不变,我们需要一种新型的反事实操作。

作者使用的符号如 pℭ|过敏,T = GetWellEnolS =发烧;do(RecoverEnol) (o)参考结果的反事实概率分布如果我们用 RecoverEnol 治疗患者,而不是实际上我们用 GetWellEnol 治疗他们,我们观察到发烧并且患者有过敏反应。

作者图片

学习因果图

到目前为止,我们已经看到因果图作为一种工具,代表三种类型的推理:观察,干预和反事实。

但是,这些图表是从哪里来的呢?我们如何从数据中学习它们?

这就是事情变得混乱的地方,因为这个过程有两个部分:学习图形本身和学习图形的参数。

对于可行的系统,我们可以进行随机控制实验来了解变量对之间的直接因果关系。但是我们经常不能做这样的实验(例如,随机选择一种治疗可能是不道德的,或者我们可能正在研究一个我们不能复制的历史事件)。

事实证明,我们可以学习,如果不是所有的东西,至少是一些关于因果模型的东西,而根本不需要进行干预。

我对这一点很困惑,因为关于这一主题的流行读物对我们能从因果模型中学到什么以及如何学习非常不清楚。

理解题目的关键是,过程可以理解为先学习因果图(我见过的叫因果发现),然后学习结构因果模型的参数(我见过的叫因果识别)。

因果鉴定

我们先把重点放在因果识别上,因为后面会介绍因果发现需要的概念。

这两个过程的关键在于综合控制的概念和我称之为的信息路径。我将依次解释这两个问题。

首先,综合控制是关于我们如何模拟一个观察,就好像一个给定的变量保持不变。这不是一个新的想法,但它将有助于这个概念的基础。

假设我们想研究运动对胆固醇的影响。我们召集了一些受试者,调查他们的日常锻炼,并测量他们的胆固醇水平。我们看到了这个:

使用虚构的数据,假设胆固醇和运动之间的相关性。图片作者。

根据这张图表,我们可能会得出结论:运动导致胆固醇;毕竟,它们看起来是高度正相关的。

但没那么快,因为可能有一个混杂因素——第三个变量既影响胆固醇又影响锻炼,并使我们对一个变量对另一个变量的因果影响的估计产生偏差。

事实上,如果我们将不同年龄组的受试者分组,我们会看到:

胆固醇和运动之间的假设相关性,其中颜色代表年龄组。图片作者。

在每个年龄组中,锻炼和胆固醇之间的相关性是负相关的。我们可以通过控制的年龄来表达运动对胆固醇的总体因果影响。

控制一个变量听起来很神秘,但这意味着你需要通过保持变量不变来研究每个群体内的相关性,例如将研究限制在 20-24 岁的人群。

如果你不能物理地操纵变量来保持它不变,或者我们想使用所有病人的数据,那该怎么办?然后我们可以分别研究不同的年龄段,最后汇总结果。这被称为综合控制

例如,为了研究胆固醇 c 和控制年龄 a 的锻炼 e 之间的因果关系,我们研究了平均条件相关性⍴C,E|A =σa p(a = a)⍴C,E|A=a。如果我们假设该系统可以通过高斯线性结构模型精确建模,那么⍴c,e|a=a 等于独立于 a 的条件值的固定偏相关⍴c,e|a,我们可以使用多元线性回归来测量。

对上述例子的标准解释是,在从观察数据中得出因果结论之前,你需要控制所有的混杂因素。

很容易得出这样的结论:你控制的变量越多越好。控制更多的事情不会让事情变得更糟,对吗?

不对!

假设我们正在研究年龄和疾病易感性之间的关系。我们随机给人们打电话,询问他们的年龄以及是否感染了这种疾病。这种设置的问题是,也许年轻人更可能拿起电话,而病人不太可能拿起电话。这会使我们的样本产生偏差。这种偏差通常被称为“选择偏差”,但我们可以将其视为人们在拿起电话时的无意控制。控制一个额外的变量会使我们的结果有偏差。

你可能想知道因果图与所有这些有什么关系,因为它们已经有一段时间没有出现了。联系在于因果图提供了一个非常方便的抽象概念来推理在观察分析中应该控制哪些变量。

让我们假设我们知道与一个系统相关的因果图,并且我们想要测量一种新的治疗(T)对患者结果(O)的因果效应。有一些背景变量,包括患者是否有心律失常(A),他们的血压(B)和患者的疾病类型(S)。

医生检查患者是否有心律失常和患者的血压,建议治疗并测量结果。他们的实际疾病会影响血压和结果。我们可以用图表来表示这些因果关系:

作者图片

我们想找到对哪些变量进行综合控制来衡量 T 对 o 的因果影响。

第一步:我们枚举两个变量之间的路径。在上面的例子中,我们有直接(因果)路径 T→O 和间接(因果)路径 T←B→O,T←A→B→O,T←B←S→O,T←A→B←S→O。我把这些信息路径称为——这些是纠缠链,可以导致 O 的值响应于观察到的 T 值的变化而更新

根据我们控制的变量,我们可以认为这些路径是开放的、部分开放的或封闭的。开放路径让信息沿边缘流动,并有助于 T 和 o 之间的总相关性。部分开放(也称为部分开放)路径仍有助于总相关性,但会发生失真。闭合路径对最终关联没有贡献。

并且检查路径是否被阻塞是相对容易的。我们需要查看问题路径上三个连续节点(子路径)的每个序列,并确定它们是开放的、部分阻塞的还是阻塞的。如果每个子路径都是开放的,则路径将是开放的;如果每个子路径都被部分阻塞或开放,则路径将被部分阻塞;如果至少一个子路径被阻塞,则路径将被阻塞。

为了判断子路径是开放的、部分开放的还是封闭的,我们应用两个标准:

  1. 只要中间节点不受控制,具有非冲突箭头的子路径就不会被阻塞。例如,当且仅当 B 被控制时,子路径 T←B→O 和 A→B→O 将被阻塞。如果我们控制 B 的后代,这将导致 B 被部分控制,因此子路径将被部分阻塞。如果两种情况都没有发生,则子路径是打开的。
  2. 当控制中间节点时,信息只能通过相互冲突的箭头流动。例如,当且仅当 B 被控制时,子路径 A→B←S 打开。如果 B 的后代被控制,那么这将导致子路径部分打开。如果两种情况都没有发生,子路径就关闭了。

请记住,控制一个变量意味着分别研究该变量具有相似值的组,然后汇总结果。

第一个标准非常直观。因为季节= >雨= >湿,在得知是否下过雨后,季节与地板是否潮湿没有关系。

第二个标准更奇怪;不明显的是,控制一个共同的结果应该在原因之间建立一种关联。这里的直觉是,排除一件证据的一种解释应该会增加我们对其他可能性的信任。例如,如果血压高,那么它可能是因为病人有心律不齐或因为他们的疾病。如果我们后来知道病人没有心律不齐,那么疾病的解释就更有可能了。这种现象被称为文学上的“解释”效应。

信息路径概念的一个直接应用:两个变量是条件独立的当且仅当它们之间的所有信息路径都是封闭的。这通常被称为 d 分离属性。

这很好,但是我们不想让治疗(T)和结果(O)相互独立。我们想分离出一个对另一个的因果影响。事实证明,我们可以扩展这条线的推理来做到这一点。

我们将把所有的因果信息路径放在一边(如 T→O),把非因果信息路径放在另一边(如 T←B→O)。

现在的目标是找到一组控制,关闭所有因果信息路径,同时让因果信息路径完全打开。比如,仅仅为了 B 而控制是不够的;虽然它阻断了路径 T←B→O,但信息仍然可以必然地流经路径 T←A→B←S→O。但是控制 eg A 和 B 确实足以隔离 T 对 O 的因果影响。

于是我们得出结论:P(O = O | do(T = T))=σA,b P(A=a,B=b | do(T=t)) P(O=o | do(T=t),A=a,B=b)=σA,b P(A=a,B=b) P(O=o | T=t,A=a,B = B)

使上述公式有效的关键技巧是认识到 P(O=o | do(T=t),A=a,B=b) = P(A=a,B=b) P(O=o | T=t,A=a,B=b),这是因为 A,B 阻塞了 T 和 O 之间的所有因果路径。

请注意,虽然公式的左边部分涉及干预,但右边部分只涉及条件——我们已经成功地将因果效应的估计减少到测量条件相关性。

对观察数据中哪些干预是可模拟的进行了更仔细的研究,这给了我们 do-calculus :一种尽可能找到如上身份的系统方法。

对于因果识别的适当介绍,读者可能会对统计学中的因果推断:初级读本 (Pearl 2016) 感兴趣,我在那里举了胆固醇锻炼的例子。如果你想从图表中识别因果关系,微软的库 DoWhy 用 python (Sharma 和 Kiciman 2020) 实现了整个 do-calculus。

因果发现

如果你和我一样,现在你会想知道这些图表是从哪里来的。

简而言之:是我们编造的。

在某些时候,我们需要指定我们的模型。do-calculus 允许我们不指定模型的一些参数,而是可以从数据中学习。但是建立因果关系网是留给读者的一个练习。

我们能做得更好吗?特别是,我们能从观察数据中学习因果图吗?

民间智慧说没有——“没有操纵就没有因果关系”。

事实证明,常识本质上是正确的,但他们的推理是有缺陷的。在某些情况下,我们可以从观察数据中学习(部分)因果图。但是还不清楚这些条件是如何满足的,目前已知的程序可能比询问专家的最佳猜测更加嘈杂。

我一头扎进去,试图更好地理解这一点。对于感兴趣的读者来说,这是一个很好的起点基于图模型的因果发现方法综述、【Glymour、Zhang 和 Spirtes 2019】,它描述了从数据中学习因果图的三种主要方法:

  1. 利用 d-分离隐含的条件独立性
  2. 寻找优化损失函数的贝叶斯网络类(通常是 BIC)
  3. 利用异方差性(即预测误差和独立变量之间的相关性)通常只发生在回归一个原因的影响时,而不是相反

我重点研究的是基于条件独立的方法,因为它们是更好研究的方法。

基于条件独立性的因果发现有着丰富的学术历史,其顶峰是张的因果发现算法,即使我们不能假设不存在我们未能测量的隐藏的共同原因,该算法也保证有效。

这一系列方法的问题在于,它们依赖于大量的条件独立性测试——这在概念上是困难的,在统计上也是有噪声的。

从这里,有两条路可以走:a)试图量化从这些嘈杂的条件独立性测试中得出的不确定性,或者 b)试图减少任何给定推断中包含的嘈杂的条件独立性测试的数量

前者的一个例子由 Claansen 和 Heskes(cla assen 和 Heskes 2012) 给出,他们开发了一种算法,能够量化他们对算法输出中出现的每条边的置信度。

和强毅 (高和纪 2015) 给出了后者的一个例子,他们研究局部因果推断,以推断目标变量与其直接因果邻近的变量之间的因果关系,这减少了几个数量级所需的条件独立性测试的数量。

我的同事亚历山德拉·梅恩和我选择了两种抽象方法的结合。在我们即将发表的论文中,我们描述了一种将统计估计转化为贝叶斯因子的启发式方法,试图验证给定的控制集是否足以隔离给定暴露对给定结果的因果影响。这种方法将因果发现和因果识别步骤合二为一,试图在不需要绘制因果图的情况下,将条件独立性测试的数量减少到最低限度。

具体来说,我们建立在y-结构 (Mani,Spirtes,和 Cooper 2012) 的概念之上,这是一个无需假设任何隐藏变量的因果发现原则。y 型结构在可能找到潜在原因的两个条件独立原因的情况下识别因果关系。我们的贡献是提出一个启发,放松这种条件独立性的要求。然而,在具有线性关系和高斯噪声的环境之外,启发式算法是不可靠的。

不管这个小小的贡献,我仍然对因果发现感到失望;我期望找到一个已经精炼的产品,锁在一堵学术术语的墙后面。现在,我开始相信,在基于图形模型的因果发现变得实际有用(如果曾经有用的话)之前,在这个领域还有很多工作要做。

这方面研究的未来步骤可包括:

  • 通过在事先已经知道因果关系的数据上进行试验,对不同的因果发现算法何时可能起作用有更细致的理解
  • 开发贝叶斯条件独立性测试,这可以帮助我们量化在一个给定的因果推断中涉及的所有条件独立性测试都是正确的概率
  • 试图在当前的因果发现算法和其他领域(如计量经济学或医学)常用的著名因果推断方法之间进行类比
  • 扩展结构因果模型和相应的因果发现算法,以适应更一般的一类因果模型,如循环模型

鉴于我的情况和专业知识,我对这两者都不太感兴趣——如果出现一种情况,我可以在真实数据上尝试更多的当前算法,我可能会接受,但我认为我的努力可能会更好地花在其他地方。

因果图的利弊

至此,我们可以了解因果图有什么用处,以及它们的局限性。我认为这将帮助我们认识到什么时候使用这个概念是合适的,以及它在什么地方与我们想要的有差距。

对我来说,从因果图中得到的关键信息是,它们围绕因果推理提出了三个清晰的核心问题:

  • 观察和干预的区别
  • 因果可识别性的概念
  • 从观察结果进行因果推断的限度

他们明确区分被动观察系统和作用于系统。这突出了因果推理的关键问题:创建灵活的推理抽象,可以适应干预性的变化。这是 AI 的一个关键问题。它甚至是分布变化问题的超集,其中“干预”正从训练数据变为部署数据。

信息路径的概念为控制一组变量是合适的(或不合适的)情况提供了一个生动而清晰的例证。因果图中的因果可识别性很好地统一了混杂偏倚和选择偏倚等问题。在研究因果图之前,我不会想到有“控制太多”这种事情——现在我知道得更多了。为了说明这种方法的威力,我引用了《好坏控制速成班》 (西内利、福尼和珀尔 2019) ,用玩具例子说明了其中一些见解。

最后,因果发现的进展挑战了我天真的理解,即我们不能从纯粹的观察数据中获得任何因果信息。在某些条件下,在一些玩具模型中,我们可以从原始观察数据中做出一些因果推断,而无需任何因果假设。

在这里,我们需要进入我所看到的因果图概念的极限。

简而言之,这些是:

  • 因果发现的局限
  • 因果图的本体约束
  • 惨痛的教训

首先,尽管从观察数据中学习因果关系在理论上是可能的,但我发现实践是不发达和缺乏的。我不清楚这是一个基本问题(例如,观察数据噪音太大,或者潜在的因果系统不够稀疏,无法进行清晰的推断)还是一个缺乏完善和实践的问题。

接下来,因果图给我的印象是,它对它们要建模的系统有一些硬编码的假设,这些假设似乎经常被违反。

研究界已经成功地放宽了其中的一些限制。例如,因果充分性假设(即不存在隐藏的共同原因)已经通过引入祖先因果图和相关算法而被成功导航(张 2008) 。

其他一些制约因素似乎有望得到更好的理解和放松;周期性想到 (Bongers et al. 2020) 。

但是还有其他一些我没有深入讨论过的限制,这些限制在我看来是根本性的。

首先,因果图任意地将可能性空间分割成具有清晰定义值的变量——鉴于人类模糊、灵活的思维,这让我感到非常奇怪。

第二,因果图不能用来表达上下文无关性——例如,只有当律师没有被分配到案件中时,它们才不能表达审判的结果与律师的性情无关。

解决这两个问题的形式主义是链事件图 (Thwaites,Smith 和 Riccomagno 2010);这可能是该领域概念未来的前兆。

第三,围绕因果图的实践隐含地假设了所处理的模型的绝对稀疏性——变量之间有许多硬条件独立性。然而,现实似乎更多的是关于相对稀疏性——少量的联系解释了变量之间的大部分关系,但其余的联系并不是字面上的零。

我看到一些稀疏的工作试图解决这第三个限制,但没有什么特别深刻的印象。

最后,对于基于因果图的理论如何利用增加的计算能力来提高性能,我没有一个清晰的理论。

这意味着,根据惨痛的教训 (Sutton 2019) ,基于因果图的因果发现系统不太可能具有竞争力。

这对我来说并不意外;我进入这个领域时,完全期望因果网络从长远来看不会成为 ML 方法的竞争性替代方案,就像贝叶斯网络不如它们的深度学习表兄弟那样强大一样。但这值得一提。

也就是说,他们不一定要有竞争力才是有用的;可以说,与深度学习相比,线性回归没有竞争力,但它仍然是有用的,有助于传达一些关于学习和从数据推断的核心见解。

简而言之,关键的一点是,我已经将因果图作为因果发现的潜在工具的观点转变为因果图作为一种语言的观点,以通过一些引人注目的玩具模型来说明关于因果关系的一些问题。

我确实认为还有许多进步要做。但是我不再有这样的印象,即在图形因果发现领域已经有许多见解在其他地方会非常有用(除了我上面提到的例外)。

致谢

感谢我的上司 Nava Tintarev 和 Ehud Reiter 的深刻反馈。我还要感谢我的同事 Sumit Srivastava 和 Ettore Mariotti 通读了草案并分享了他们的印象。

本文作者 Jaime Sevilla 是 NL4XAI 项目的早期研究员,也是阿伯丁大学的博士生。

参考书目

邦格斯、斯蒂芬、帕特里克·福雷、乔纳斯·皮特斯、伯恩哈德·舍尔科夫和乔里斯·穆伊杰。2020.有周期和潜在变量的结构因果模型的基础。 ArXiv:1611.06221 [Cs,Stat] ,10 月。http://arxiv.org/abs/1611.06221.

西内利、卡洛斯、安德鲁·福尼和朱迪亚·珀尔。2019.“理论与实践中的因果分析:好与坏控制速成班”。2019 年 8 月 14 日。http://causality . cs . UCLA . edu/blog/index . PHP/2019/08/14/a-crash-course-in-good-and-bad-control/。

克拉森、汤姆和汤姆·赫斯克斯。2012.基于约束的因果推理的贝叶斯方法。ArXiv:1210.4866【Cs,Stat】,10 月。http://arxiv.org/abs/1210.4866.

高、田、强姬。2015.直接原因和结果的局部因果发现。《神经信息处理系统进展》28 ,C. Cortes、N. D. Lawrence、D. D. Lee、M. Sugiyama 和 R. Garnett 编辑,2512–20。Curran Associates,Inc . http://papers . nips . cc/paper/5974-local-causal-discovery-of-direct-cause-and-effects . pdf

格雷穆尔、克拉克、张坤和彼得·斯皮特斯。2019.基于图模型的因果发现方法综述。遗传学的前沿。https://doi.org/10.3389/fgene.2019.00524.

马尼、苏布拉马尼、彼得·l·斯皮特斯和格雷戈里·f·库珀。2012.因果发现 Y 结构的理论研究。ArXiv:1206.6853【Cs,Stat】,6 月。http://arxiv.org/abs/1206.6853.

珠儿,朱迪亚。2016.统计学中的因果推断:入门。西萨塞克斯郡奇切斯特:威利。

夏尔马、阿米特和埃姆雷·基西曼。2020.DoWhy:因果推理的端到端库。ArXiv:2011.04216【Cs,Econ,Stat】,11 月。http://arxiv.org/abs/2011.04216.

理查德·萨顿。2019.痛苦的教训。2019 年 3 月 13 日。http://www.incompleteideas.net/IncIdeas/BitterLesson.html.

斯韦茨、彼得、吉姆·史密斯和伊娃·里科马格诺。2010.用连锁事件图进行因果分析。人工智能174(12):889–909。https://doi.org/10.1016/j.artint.2010.05.004.

张,姬姬。2008.存在潜在混杂因素和选择偏差时因果发现定向规则的完整性。人工智能172(16):1873–96。https://doi.org/10.1016/j.artint.2008.08.001.

位置分析的“思维过程”

原文:https://towardsdatascience.com/the-location-analytics-thought-process-a05720a9ba3f?source=collection_archive---------21-----------------------

进行位置分析时,您需要如何思考

由 Unsplash 上的 Element5 数码拍摄

想象你是一个“生死”鱿鱼游戏(网飞秀)风格游戏的一部分。你只需要选择我们周围大部分数据中存在的两个数据字段。我可以肯定地说,位置数据的两个字段——纬度和经度——可以拯救你。

好了,现在你已经幸存下来了,让我们继续位置分析这个非常有趣的话题。在这个故事中,我将描述您在使用位置分析时需要的思维过程。

通常情况下,作者会以漂亮的视觉效果来吸引读者的注意力。但是,请原谅,因为我是从一个混乱的想象开始的。

Airbnb 在纽约的位置(图片由作者使用谷歌地图提供)

所以你可能会问,这到底是什么可视化?我先来回答这个问题。这个可视化显示了 Airbnb 在纽约的所有位置。目的是分析 Airbnb 地点在纽约市的分布情况。

即使这种分析的目的是合理的,并且已经涉及了许多编程技术,如 Google Map API/Javascript/Node-JS,结果看起来仍然很混乱。更糟糕的是,加载这个可视化需要很长时间,并且可能会使浏览器崩溃。

让我们看看位置分析如何帮助避免混乱。提醒一下,我们的目标是分析 Airbnb 地点在纽约市的分布情况。这是一个思维过程,在进行位置分析时非常有用。

懂地理

使用位置分析时,理解地理很重要。这有助于你理解上下文。这可能还需要在互联网或其他来源上一堂地理课。

在我们的例子中,我们想要分析的地理位置是纽约。这里有一个关于纽约的速成班。从地理上看,纽约是一个拥有 5 个区、59 个社区和数百个街区的城市。

来源—https://www1 . NYC . gov/site/planning/data-maps/city-neighborhoods . page

可以去纽约市网站,了解一下这个城市的地理。这次投资学习地理将有助于你以有效和吸引人的方式展示你的成果。

用数学术语思考地理

现在你对地理有了大致的了解,你需要开始从数学的角度来看待它。如果你仔细看上面的地图,你会看到数学形状,称为多边形。在所有的数学形状中——正方形、长方形、三角形等等——多边形是神奇的。因为它们实际上可以用来表示地球上的任何地理区域。

让我们以晨边高地为例。在下图的左边,你可以在谷歌地图上看到这个社区。在右手边,你会看到一个数学多边形,它与邻居 Morningside Heights 的形状相同。

多边形的地理区域(来源谷歌地图)

现在,您可以将多边形定义转换为纬度和经度。邻区晨边高地的多边形定义应该是这样的。

邻近晨边高地的多边形定义(图片由作者提供)

有各种来源可以让你得到地球上任何地理的多边形定义。例如,纽约市所有社区的多边形定义都可以在市政府网站上找到。一旦你有了所有的多边形信息,你就可以在谷歌地图上绘制多边形。

下图是纽约每个街区的多边形地图。

纽约市多边形地图(来源谷歌地图+作者)

一旦你实现了任何地理的多边形地图,你将开始感觉在任何位置分析问题的控制。

应用位置分析算法

好了,到现在为止,你已经理解了地理,掌握了它的数学定义。所以,你现在才处于可以想到位置分析算法的阶段。

这也是倒回并回忆我们的目标的恰当时机,我们的目标是分析 Airbnb 的位置在纽约市是如何分布的。分解一下,就是哪个部分(或街区)的 AirBnB 位置比其他地方多。在分析术语中,这意味着哪个面与其他面相比具有更多的经纬度点。这将需要为多边形指定一个经纬度点。

多边形中点法是一种非常有用的位置分析算法。它将找到包含经纬度点的多边形。这是一个不同经纬度点如何分配给不同多边形的动画

点多边形算法(图片来源—作者)

选择正确的可视化

几乎所有的位置分析最终都表现为地图可视化。然而,它们不仅仅是我们在等待优步之旅时看到的简单地图。它们更加复杂,因为它们需要包含由位置分析算法计算出的所有智能。

在我们的例子中,多边形中的点算法的输出是邻域多边形定义和多边形中 Airbnb 位置的数量。这些数据可以帮助我们在地理地图上叠加一个热图。好吧,这不是文字游戏,但两种可视化(热图和地理图)都有“地图”这个词。

这就是地理地图上叠加的热图的样子。

地理地图上的热图(来源谷歌地图+作者)

漂亮!比我们开始时混乱的视觉化要好得多。这样,我们就可以清楚地看到哪些社区的 AirBnB 位置(红色)比其他社区(绿色)多。举个例子,你可以看到曼哈顿的 Airbnb 位置更少。这可能是因为该地区有更多的办公楼,而不是住宅区。

所以总而言之,

  • 位置分析不只是使用纬度和经度,而是将它们与一些智能算法一起使用。
  • 为了有效地使用位置分析,花时间了解相关的地理是很重要的。
  • 将地理转化为数学术语需要您搜寻多边形定义数据。
  • 只有在掌握了地理学及其数学定义之后,才应该选择位置分析算法。
  • 大多数位置分析都需要可视化,而不仅仅是简单的地图显示。

额外资源

网站(全球资讯网的主机站)

你可以访问我的网站进行零编码分析。https://experiencedatascience.com

订阅每当我发布一个新的故事时,请及时通知我。

https://pranay-dave9.medium.com/subscribe

你也可以通过我的推荐链接加入 Medium。

https://pranay-dave9.medium.com/membership

https://www.youtube.com/c/DataScienceDemonstrated 的 YouTube 频道
这里是我的 Youtube 频道
的链接

期待已久的 JupyterLab 3.0 终于来了

原文:https://towardsdatascience.com/the-long-awaited-jupyterlab-3-0-is-finally-here-3b6648b3a860?source=collection_archive---------15-----------------------

Jupyter 项目发布了 JupyterLab 版本3.0,作为给数据科学家的圣诞礼物

雪莉·胡利在 Unsplash 拍摄的照片

Jupyter 笔记本一直是软件思想增量开发的工具。数据科学家使用笔记本记录他们的工作,探索和试验新算法,快速勾画新方法,并立即观察结果。

把一个程序当作一篇文学作品,写给人类而不是计算机。

唐纳德·克努特

JupyterLab 是为了解决 Jupyter 笔记本的一些缺点而开发的,是该项目的下一代用户界面。除了终端、简单的文本编辑器和新的文件浏览器之外,它还提供了熟悉的笔记本体验,这是最受欢迎的笔记本功能。JupyterLab 最终将取代经典的 Jupyter 笔记本。

为此,圣诞节前一天,2020 年 12 月 24 日,Jupyter 发布了 JupyterLab 的版本3.0,作为送给数据科学家和机器学习工程师的礼物。这个故事研究了这个版本中的新特性,并探索了如何将它用作您的主要开发环境。

学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。在这里订阅!

新功能亮点

现在让我们浏览一下3.0版本的新特性。有几个面向用户的变化,以及一些改进或为开发人员量身定制的新功能。

国际化:新的 JupyterLab 接口支持多种语言。例如,按照官方文档中的教程将显示语言更改为简体中文。

可视化调试器:调试器前端在三月份作为一个独立的扩展推出,现在默认为支持新调试协议的内核提供。阅读下面关于如何使用它的故事。

简单界面模式:关注单个文档或活动而不关闭主工作区中的其他选项卡通常很有用。简单界面模式(以前的单文档模式)使您能够做到这一点。

简单界面模式——作者图片

目录: ToC 是最有用的 JupyterLab 扩展之一。几乎每个人都安装了它,并且它出现在每个 Jupyter 扩展列表中。因此,该团队将其作为核心 Jupyter 的一部分。

文件浏览器过滤器:在 JupyterLab 中浏览的文件现在更加有用,因为它现在集成了用于命令面板的相同模糊匹配机制。

文件浏览器过滤器-按作者分类的图像

命令面板:命令面板遵循 VS 代码的设计语言,现在它是一个浮动窗口,出现在您的 JupyterLab 工作区的顶部。现在,您可以在保持侧边栏关闭或切换侧边栏面板的同时快速调用命令。

命令调板-按作者排序的图像

扩展:一种新的发布 Jupyter 扩展的方式,即pipconda包,现在可以使用了。安装这样的扩展不需要重新构建 JupyterLab,也不需要安装 NodeJS。

Jupyter server:Jupyter lab3.0现在依赖于 Jupyter Server,这是一个基于经典笔记本服务器的新 Jupyter 项目。有关更多信息,请浏览 Jupyter 服务器的文档。

结论

故事呈现了 JupyterLab 3.0的新功能亮点。新版本关注于国际化,向 Jupyter 服务器和预建扩展的过渡,新的可视化调试器和 ToC 扩展的集成,以及消除一系列错误。更多细节,请看变更日志。

想了解如何生产您的笔记本电脑,或者如何将它们用作您的主要开发环境?阅读下面的故事。

学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。订阅这里!

关于作者

我的名字是迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

从数据科学到商业价值的漫长旅程

原文:https://towardsdatascience.com/the-long-walk-from-data-science-to-business-value-d97f57f1a7fb?source=collection_archive---------33-----------------------

为什么从业务角度来看数据科学项目是其成功的关键。

照片由伊斯拉姆·哈桑在 Unsplash 上拍摄

在竞争激烈的市场中,企业必须积极探索差异化体验如何丰富其最终用户和生态系统合作伙伴。数据被视为企业的“自然资源”。通过使用企业数据来识别和理解趋势、模式甚至行为,可以实现差异化。机器学习(ML)模型可以被设计为从这些宝贵的企业数据中生成预测,这可以为向最终用户提供差异化提供见解。

这是我从现场学到的:大多数数据科学项目失败是因为他们忽视了业务需求。专家们经常陷入数据科学的虫洞,忽视了共同的目标。如果我们不能从商业的角度建立我们的 ML 模型,我们就丧失了推动业务增长的潜力。让我们考虑一些有助于解决这个问题的关键问题。

理解业务问题。

  • 商业框架工作坊 : 作为一个值得骄傲的IBM 人和 CSMer ,我可以说我们在 IBM 做到了这一点。壁画是远程做这个练习的好工具。业务框架研讨会的唯一目的是定义一个适合业务需求的用例。
  • 行业研究:你的业务是在银行业、零售业还是电信业?了解你所在的行业可以让你根据行业背景来识别关键的业务驱动因素。
  • 业务案例:用例是否得到了业务案例的支持和资助?如果成功,我们的努力会推动收入增长吗?

照片由哈迪·穆拉德在 Unsplash 上拍摄

从商业角度看这个项目。

这里有三个问题可以帮助我们把握数据项目的脉搏。

  1. 我能清楚地向他人阐述业务问题吗?
  2. 我是否拥有理解问题所需的所有信息?
  3. 我的 ML 模型如何解决这个问题?

确保模型解决了业务问题。

有专门研究这个问题的书籍和职业,所以把这个作为模特选择的入门。在这一点上值得一提的是,数据准备和清理不在这里的讨论范围之内——那是另外一天……或者一年,取决于你清理数据需要多长时间。

  1. ML 模型测试:测试将数据分成训练、验证和测试集。然后,我们在训练集上拟合候选模型,在验证集上评估和选择,并在测试集上报告最终模型的性能。保持训练、验证和测试集完全分离对于一个公平的评估是至关重要的。
  2. ML 模型评估:哪种模型最能满足业务需求?我们能转向更有效的模式吗?我们是否以合理的方式分割可用数据?

没有完美的模型,我们的目标是找到一个足以解决业务问题的模型。

结论

巨大的数据带来巨大的力量。从业务的角度出发锚定数据项目对其成功至关重要。当选择一个 ML 模型时,质疑这个模型是否真正解决了业务问题。

Joshua Sortino 在 Unsplash 上拍摄的照片

参考

  1. 福斯特·普罗沃斯特和汤姆·福塞特的《商业数据科学》
  2. 数据挖掘的跨行业标准流程( CRISP-DM ) — 什么是 CRISP-DM?
  3. 将数据转化为行动—Lee sch lenker 撰写的《走向数据科学》一文。

脚注

实际上,可能没有足够的数据来进行训练、验证和测试。在这种情况下,有两种技术用于近似模型选择:

  • 概率测度 :通过样本内误差和复杂度选择模型。
  • 重采样方法 :通过估计的样本外误差选择模型。

智力的丧失功能

原文:https://towardsdatascience.com/the-loss-function-of-intelligence-44bf9913733e?source=collection_archive---------27-----------------------

思想和理论

这篇文章建议如何模拟一般智力。有人认为进化方法是一种可能的选择。

作者图片

这篇文章提出了一种模拟类似一般智力的事物的新方法。有人认为,一个固定的自然框架住房代理人与固定弱物理属性和灵活的'大脑'架构可以演变与遗传算法遵循简单的规则。此外,嵌入在智能体基因中的是决定它们自己的奖惩功能的网络,这些功能被单独用来学习。写入和读取的分形记忆系统被结合到代理的大脑架构中,其中大脑设计还模仿长短期记忆循环神经网络的一些特征。

目录

  1. 简介
  2. 定义
  3. 模拟
  4. 框架
  5. 物理属性
  6. 模拟约束
  7. 大脑
  8. 结束语

1 导言

模拟人工智能似乎比以前想象的更困难:机器学习领域的进展已被证明不足以完成这一挑战。这篇文章提出了一种模拟“智力”的方法,认为进化方法至少是一种选择。

2 定义

我们人类对智力的定义很难用语言来表达。如果你四处询问,看看人们是如何定义这个术语的,逻辑上他们会得到不同的答案,可能所有的概念都是如此。不过,与其他概念相比,“智力”这个词是一个相对宽泛的概念。如果没有一个统一的定义,人们就很难人工模拟智力,让所有的观众都同意这一点:通常,我们都认为人类行为的不同方面可以归因于“智力”,尽管它们可能是相似的[ 2 ]。然而,请注意,是人类的行为嵌入了一些我们通常与智力联系在一起的东西。当我们称其他生物为智慧生物时,比如大象或海豚,通常是因为我们认为它们有类似人类的行为。因此,似乎人们通常把“智力”这个词归因于人类所拥有的,而其他生物所拥有的要少得多。很明显,没有非凡体能的人类能够生存下来,很大程度上是因为他们的智力[ 3,第 23 页 ]。

3 模拟

如果考虑这个定义,那么逻辑上可以得出这样的结论:通过反过来模拟数字生物来模拟智能也是可能的。也就是说,在自然界中,生物具有某些特征的原因可能是自然选择和性选择中的一种或两种,这些过程很容易人工复制。为了生成这样的代理,原则上可以从头开始对这些代理进行编码。然而,这相当于试图从头开始构建智能,这意味着您应该理解它是如何工作的(这在某种程度上违背了试图模拟它的目的)。

接下来,人们可以让进化来做这项工作,并使用自然模拟来尝试开发智能数字“生命”。对于这一选择,也有复杂之处。也就是说,在复制我们的自然系统中以数字方式进化智能生命首先在科学上是不可能的,因为这需要对自然有一个完整的了解,而人类目前还没有做到这一点。其次,要达到智能生命能够发展的模拟状态,将需要大量的时间步骤,因此需要惊人的计算能力,即使使用我们理解并可以用代码表达的自然部分的轻微抽象,这无疑是一个计算上不可行的任务。

虽然人们可以尝试使用一种相对高级的自然表示,其目的在计算上是可行的,但似乎不可能开发出本文中定义的智能生命,因为其根本的神经过程只能从低级模拟中专门找到的小积木中构建。除非对模拟过程的某些部分进行某些调整,否则这种实验可能没有可接受的成功概率。

这篇文章提出的一个调整是将人工神经进化从存在于智能体周围的自然框架的进化中分离出来,同时也固定智能体的物理属性。让围绕代理的自然框架进化也没有用,至少不足以使其与计算成本的权衡变得值得。药剂的物理性质也是如此,但后面会有更多的解释。

4 框架

如前所述,由于计算负担相关的原因,能够模拟这种情况的框架应该首先包含现实中自然的相对高级的表示。第二,它应该允许用精神属性代替对生存重要的物理属性。为了节省时间,进行拟议实验的人可以利用现有的实验。

一个符合这些先决条件的环境就是游戏《《我的世界》》。从游戏的运作来看,这两个条件都满足了。也就是说,《我的世界》的一个重要部分是玩家通过制作某些工具、建造庇护所和收集食物来增强他们在游戏中的基础能力,从而提高他们原本很低的生存机会,只要身体属性支持他们[ 4 ]。标准的游戏模式字面上叫做‘生存’模式。有更多的候选人也符合要求,比如游戏 Rust,但《我的世界》被推荐,因为这款游戏有太多的方面可以促进玩家行为的相当大的创造力和复杂性。

5 个物理属性

因此,代理应该能够在精神上进化,但从一开始就有它们虚弱的固定物理属性,因为实验的目的不是观察受约束函数约束的物理组合在局部最优,这需要计算成本。由于这些属性是固定的,现在必须为所有与代理的物理特性相关的事情建立一个框架(暂时不考虑常规的玩家控制和他们的结果)。

关于生殖,我们可以说,选择这个选项是为了保持模型最接近人类物种,因为生殖会有一个相反性别的先决条件。请注意,这不一定是最佳选择。例如,也可以说存在任意 n 个性别,并且需要通过某种遗传繁殖规则来繁殖自己。不清楚这些选项的效果如何,或者不同规则的无限集合的效果如何,所以应该考虑使用哪个规则。

关于药剂的外观,可以通过给予每个药剂一个由亲代基因确定的 RGB 颜色的皮肤,并在肢体周围带有对应于年龄和性别的一些色带(带有轮廓的色带是明显的要求,其中轮廓具有标准颜色以阻止这些色带与药剂的皮肤颜色混合),来结合诸如外观遗传以及可见的年龄和性别线索之类的特征。希望这些能引起更深层次的社会互动和由代理人形成的结构。

6 模拟约束

顾名思义,这篇文章主要讲的是智力的丧失功能。关于这一点还会有更多的讨论,但是现在,一个好的总结是,智力的损失函数是由模拟中的代理人自己决定的。通过选择,模拟被选择在代理物种灭绝之前它们已经运行了多长时间。由于特工们的体能很弱,精神体能对生存至关重要。这些心理能力越好,模拟运行的时间就越长,因此,开始的基因越有可能被用于下一批模拟。然而,当涉及到基因繁殖的这个方面时,应该有灵活性,所以这个选择规则可以改变。如果大多数模拟没有在运行时间内以灭绝结束,模拟环境本身也可以调整为对代理更苛刻。然后,一个选择是在香草《我的世界》中释放代理,但是这可能会导致问题,因为它可能足以让代理生存而不形成前面提到的复杂的精神能力。因此,它应该被强加在环境上,对于没有心智能力帮助你的代理人来说,生存几乎是不可能的。

毕竟,如果没有他们的心智能力,人类也不会走这么远[ 3,第 23 页 ]。人们还认为,尼安德特人,一个来自人类基因树另一分支的身体更强壮的物种,灭绝了,因为他们有更好的身体特征,这意味着自然选择没有推动他们发展智人发展的精神结构。人类甚至可能利用了这一优势,迫使他们灭绝。因此,数字物种应该变得越来越虚弱、饥饿,并有更多的暴民来保护自己。此外,为了限制计算负担,可以使用一个旧的、相对简单的游戏版本,可能会删除或添加一些方面(以刺激某些行为)。一个合乎逻辑的折衷方法是将世界的大小限制在相对较少的游戏块中。

在每次模拟中,在开始时应该产生固定数量的代理,这个数量限制了计算负担,但仍然允许自然和性别选择以及社会互动。这篇文章的一个建议是,代理也有一个固定的有限寿命,当种群灭绝时,模拟将重新开始。如前所述,皮肤上环绕肢体的带子会动态显示显示年龄的颜色图案,以便代理可以检索这些信息。

7 大脑

7.1 模块化架构

对于代理的“大脑”,一种可能性是在模拟开始时没有单一的设计,而是由几个人工神经网络组件组成的随机结构,并符合一些约束条件,如它有一个输入和输出向量。例如,可以采用 CNN、LSTM RNN 和变压器中也使用的某些组件。如果进化可以决定(通过自然选择和遗传算法)这些模块应该如何组合和排序,那就太好了,但这并不是一个用代码表达的简单任务。当然,随机生成任何特定代理人的大脑都是可能的,但如何将父母的两个“大脑”结合起来,以创建孩子的神经网络呢?此外,这种方法可能会花费很长时间,因为明显弱的组合也会试图接近局部最小值,并且有许多可能的组合。因此,这种方法需要大量的计算能力,所以本文建议使用人性化设计的模型。这可能会影响模拟的成功,因为模块化实现是产生惊人结果的重要因素之一。

7.2 感官

这篇文章提出了一种新颖的结构,精确地反映了人脑的一些特征。首先,必须确定人脑有哪些特征可能需要整合。首先,我们从大脑接收的输入开始。通常,视觉、听觉、味觉、嗅觉和触觉等五种基本感觉会很快浮现在脑海中。

在《我的世界》,前两个肯定合二为一才有意义。为了节省计算成本,可以观察到的世界可以做得比常规游戏中的不那么清晰。听觉可以以立体声的形式传送给代理人,也可能因为与视觉相同的原因而被压缩。

在现实生活中,味觉和嗅觉通常是必要的,它们可以提供关于所吃食物是否健康的线索。在《我的世界》,随便吃点东西不健康的可能性很小。除了少数几个项目之外,精确度和计算负担之间的权衡可以在这样一个点上进行,即当吃或喝健康的东西时给出一个信号,而当吃或喝不健康的东西时给出另一个信号,而不是所有项目都具有独特的“味道”。也许甚至没有必要做出这样的权衡,因为没有明显的理由认为为什么这一方面对心智能力的发展至关重要。

关于触摸,在《我的世界》,似乎很难实现类似我们人类接收触摸信号的东西。然而,一个计算和节省时间的折衷方案是,在最接近代理的 4 x-y 块坐标区域中,给代理关于块表面在它们周围的位置的信息。这一方面也可能被排除在外,原因与味觉和嗅觉相同。内部信号,如疼痛、饥饿、温度和快乐的感觉也可以在很大程度上被整合。

在接收输入的两个实例之间,健康状况的变化可以用来将疼痛信号前馈到大脑。对于饥饿来说,情况也是如此,但是这个水平本身也包含了重要的信息,就像它对于健康一样。因此,这些也应该用作模型的输入。其次,温度似乎很难实施,因为在《我的世界》没有这种东西,而且似乎对智力的发展也不是必要的。

最后,分别与运动和身体位置相关的前庭感觉和本体感觉可以通过使用网络的输出作为输入而被合并,但是现在在模型输出的讨论中对此有更多的讨论。

7.3 产出

该模型的输出应该包括所有常规的玩家控制,但也包括声音,这或许有助于声波通信的发展。此外,它应该包括选择交配的代理人看着和接近。如果另一个代理在看着另一个代理的时候也输出信号一段时间,那么再现应该发生,但是不是“免费的”。由于代理将在一段固定的时间后死亡,所有其他条件相同,根据手头的规则,最好的模拟将简单地是所有代理发送复制“按钮”的模拟。因此,繁殖后代应该要花费类似饥饿棒的一部分,后代开始时没有足够的饥饿来繁殖。

最后,由模型决定的幸福水平应该既是一个输入,也用于学习。假设有一个网络使用输出和另一个输入向量来确定与时间步长相关的奖励或惩罚,例如使用双曲正切激活函数。不过,请注意,反向传播这种奖励将导致从输出节点到奖励和惩罚节点的网络的权重和偏差接近无穷大,而不会以有意义的方式调整大脑中的其他权重和偏差,以优化生存机会。因此,建议该奖惩节点的值仍然通过网络馈送输入和输出向量来确定,但是该网络的权重和偏差根本不能被轻推。相反,在输出节点被随机梯度下降推动之前,只有网络中的权重和偏差。

灭绝前按时间分别模拟的遗传算法将有助于优化这个网络,以提高生存机会。如前所述,主体的任何时间步长的快乐或奖励或惩罚也应被视为输入,因为人类似乎也有这种能力,在一定程度上感受快乐或悲伤。这就是智力丧失功能的要旨。在许多模拟和选择之后,人们期望幸福的决定将被构建成通过培养强大的心智能力来最大化生存的机会。

7.4 内存

既然已经讨论了输入和输出,那么在讨论它们之间的联系之前,这里可以看作是最后的一部分,那就是存储器。这篇文章提出,由神经网络读取和写入的分形树状存储器包括短期、长期存储系统以及两者之间的所有能力。对于每个关节的一个示例性的 m 层的分形和大小为 n 的分割将是从入口点开始,并且可以到达任何一个 n^m 存储的存储向量。在分形的每一步,也可以选择一条空路径,返回一个空向量。这种分形树状记忆系统的原因是因为它类似于一个类别系统,在这个系统中查找特定的项目是快速和结构化的。例如,在罗马单词词典中,查找单词也可以以类似分形树的方式显示,其中每一层有 26 个字母,一条路线指示所形成单词的结束路径。这个网络的层数将对应最长的罗马字。直觉上,字典是以这种方式构建的,因为单词的随机排序在查找相关单词时效率会大大降低。类似地,一个巨大的神经网络用于从许多存储的向量中挑选一个,实际使用时将需要更多的计算能力。类似的结构可能也适用于大脑。所建议的记忆系统将输入向量提交给在到达的给定交叉点处的唯一神经网络(权重&偏向),然后该神经网络将通过输出所有 n+1 类别的数字来对向量进行分类。然后,要走的路将由所有选项中的最高输出值和空路径来确定。最后,系统将到达将被读取的指定存储器向量。

现在,当模型的奖励或惩罚被反向传播时,与记忆向量的所有元素相关的奖励或惩罚将被累加,以帮助确定用于挑选记忆的所有权重和偏差的真实梯度的替代,因为该记忆构造是不可微分的。对于所有未使用的权重和偏差,使用的梯度将简单地为零。假设平均来说,记忆分形中较高的每一层都要经过大约 n 次以上(如果不经常采用空路径),那么对于树中较高的每一层,来自向量的奖励或惩罚将除以 n ,从而确定相关权重和偏差的“梯度”。
这些内存是前面讨论的分形内存读取网络能够读取的内存。请注意,内存系统也可以选择不将任何向量写入系统或从系统中读取任何向量。

很明显,分形内存读取树中的一些端点可能会被更频繁地用来写入。对于人类来说,这可以比作我们长时间记住一些事情(这些端点很少被写入)和一些较短的时间(端点更经常被覆盖)。由于书写网络不是通过反向传播而是通过遗传算法来调整的,所以经常被回忆起的记忆不一定经常改变。

7.5 神经架构

接下来是大脑网络的图示,但首先介绍使用的图标及其含义:

图 1(按作者):图标

建立这些网络后,总的代理网络如下所示:

图 2(作者):人工神经架构

At 1, the current input vector is concatenated with the output vector of the previous time step and a vector that will be named the interpretation vector, so that all external signals comparable to those that a human brain receives are fed through the network along with something that sort of serves as a cell state that can be found in LSTM RNNs. After this concatenation, the vector is copied and sent two ways.

At 2, one of those copies arrives at the fractal memory reading system, where at each joint a separate simple neural network classifies the direction the vector is to be propagated. ReLU could be chosen as the activation function because of lower computational costs, but the sigmoid function is chosen here. As the highest output is to be used in the determination of which direction to continue the propagation of the memory reading system, a sigmoid or hyperbolic tangent activation function will more likely have a strictly ordered list of preferences and not have to choose randomly between all elements if all are attributed an activation of 0 returned by the ReLU. The position that the memory system ultimately arrives at will contain a stored vector of equal size to the concatenated vector at 1.

At 3, the memory vector is concatenated to the input signals vector that then first converts this long vector into one vector of equal size to senses vector and output vector together. This vector is called the interpretation vector and will be copied to be used in the next time step.

The hope of using this interpretation vector is that the network will interpret the input signals and memory vector in a way like we humans do, too. When one is concentrated on a particular task like watching a circus performer breathing fire, much of the neural information coming from our senses feel to be prominent in the determination of our outputs. When one is closing their eyes, though, and trying to sleep, memories of the man breathing fire might arise. Although less spectacular than in real life, memories can be very vivid, allowing you sometimes to recall what somebody looks like you met and visualising them in your mind. Occasions in between, occur too, probably a lot more often. Suppose you are drawing a person breathing fire. You probably will think back to the man that spit fire for some moments, then continue drawing. While you are memorising the man, your eyes still feed your brain all signals relating to the environment around you, because you never closed your eyes. But were you really aware at the moment of memorisation of your surroundings? Was it not as if a man spitting fire had blended in with your periphery and took up some of the neural space that relates to your brain’s visual perception? Many more examples like this can be given relating to sound, smell, feeling and taste, but the point of this explanation is that we do not directly react to the literal external signals our brains receive, but to its interpretation of those signals.

Thus, at step 3, before the determination of outputs, an interpretation of all external signals is constructed by means of the sigmoid activation function. The outputs of the model will also be determined with the sigmoid activation function.

At step 4, the input, output and interpretation vector at the current time step are concatenated. This vector is then used to determine the total reward or punishment of the network, denoted here as E for evaluation. The weights and biases of this network can not be nudged, for reasons mentioned before. This network will thus also be optimised by the genetic algorithm of the simulations.

At 5, before this vector is fed forward in the memory writing network, a neural network will select the properties that it thinks are helpful to save. The memory vector is then saved or not, depending on if it is kicked out or not at any joint of the fractal tree to not be saved at all and discarded like previously explained. The reason why this fractal memory tree is outside of the green box is that it is not subject to optimisation by reward or punishment of the network. All networks inside of it though, are.

Why it is chosen that this network is not subject to optimisation was previously highlighted but one can also elaborate on this explanation by supposing for a moment it was. If the agent puts out a reward signal that is backpropagated the same route through both the fractal memory reading and writing network, not only will the particular path be chosen more often when retrieving memories, it will also be chosen more often to save memories in. Now, it can be the case that the memory vector saved at that position is perfect for helping the agent make decisions in certain situations, so retrieving the memory more often when it has been beneficial to the output values seems fine. However, when a vector is more likely to be saved in that particular position, that precious memory might get lost. A similar argument can be made for the case when there is a punishment that is backpropagated through the memory network.

Thus, it is chosen that the fractal memory writing network is optimised subject to the genetic algorithm of the simulation. It should be noticed, though, that the fractal memory network used for writing could also include a network that decides how to combine the submitted vector with the vector previously saved in the endpoint in question, so this should be considered.

As a visual aid, the recurrent form of this network could be displayed like this:

图 3(作者):循环形式的架构

为了说明为什么有人认为这种类型的网络能够发展智能行为,我们举了几个例子,说明这种模型在理论上如何执行以下任务。

1。常规言语交流:假设模拟中的一个智能体接收到输入信号,它感到有说些什么的冲动。这种冲动将如何产生相应的输出序列,组成一个其他代理人可以理解的声音信息?要回答这个问题,最好从传达这个信息的冲动开始。当一个智能体处理输入信号时,它的大脑可能以这样一种方式构造,通过创建一个代表要执行的动作的心理地图来做出响应。作为一个例子,一个简单的抽象是,代理人可以用一个白色像素来显示黑色网格,网络通过输出音频来响应。这可以作为信息包含在体系结构中使用的解释向量中。在下一个时间步骤中,由于先前的输出向量和解释向量被用于确定新的解释向量,所以这个具有一个白色像素的黑色网格可能被转换成完全黑色的网格,代理通过输出另一个声音频率来响应该网格。尽管在这个例子中使用了两种音调来交流,但是很容易想象更高级的解释向量可以使代理做什么。嵌入在解释向量中的思维导图的概念有许多用途。接下来,将讨论执行算术。

2.算术:假设一个智能体觉得有必要计算如果它有两倍的食物它会有多少。可以将思维导图嵌入到所构建的对应于多个垂直条的解释向量中。下一个时间步骤(具有前馈的非激励的新输入和输出向量),处理解释向量的网络可能识别出该模式被复制,从而现在在解释向量中有两倍多的棒被可视化。然后,该向量可用于下一个时间步或写入分形记忆网络。有人可能认为代理不可能知道它是否完成了动作,但是这个信息也可能包含在思维导图中。例如,可能有这样的情况,在棒的心理地图转换为它的双重表示时,有一个红色像素将变成绿色。

尽管如此,这种架构不应被视为唯一可能的架构。例如,也可以进行试验,将在特定时间步骤使用的内存向量连接到提交给内存写入网络的向量,因为这可能包含有用的信息,或者可以进行实验,以查看 attention 和其他实现与本文中提出的实现相比如何。

8 结束语

最后,需要进行实验,以便能够显示本文建议的一些结果是否能够实现。在本文提出的完整实验将被选择进行之前,也许最好在需要较少计算能力的环境中用分形存储系统或者甚至全脑架构和遗传算法进行实验。由于本文中提出的想法并不是一成不变的,这些实验可能会在这些基础上进行改进,以便最终获得更好的结果。

尼克·博斯特罗姆。超智能。牛津大学出版社,2014 年 19 日至 20 日。
【2】肖恩莱格和马库斯哈特。智力定义集锦。17–24, 2007.
[ 3 ]尤瓦尔·诺亚·哈拉里。智人:人类简史。复古图书伦敦,2014。
【4】乔希·米勒-瓦特。《我的世界》初学者指南。游戏雷达,2012。

失去潜力的超自动咖啡

原文:https://towardsdatascience.com/the-lost-potential-for-super-automatic-coffee-3d3376e6038?source=collection_archive---------36-----------------------

咖啡数据科学

对便利效率的一次短途旅行

十年前,我得到了我的第一台超级自动咖啡机。它有助于生产非常好的咖啡,而且它一直是一键解决方案的价值所在。然而,我一直很好奇它在咖啡提取方面的效率如何,所以我收集了一些数据。

我使用了一种叫做研磨总溶解固体(gTDS) 的指标来评估拉球前后的效率。这个度量是使用折射仪测量的,但是将研磨物直接放在折射仪上并加水。

这一指标表明了在土壤中有多少是易溶的,这是衡量提取效果的一个指标。我测量了一个镜头的 TDS,然后计算提取率,结果是 12%左右。地面 TDS 是另一种方式来看待它。

数据

我特别好奇的是,如果提取率低的话,这些粉末中的一些是否可以以某种方式重新利用。看着研磨分布,我知道 Odea 有许多粗颗粒。

我曾试图修改 Odea 中的研磨机,把它拆开,把最好的设置改为最粗糙的。然后我可以做得更好一点,但是如果我做得再好一点,机器就会堵塞。

所以我拿了一个用过的冰球,用 400 微米和 500 微米的筛子筛选。

然后我测量了每个人的 GTD。

我测量了未举起的球和新鲜地面的 gTDS。作为参考,当我从我的杠杆机拉一杆,一个典型的 gTDS 读数低于 0.5。所有这些读数都非常高。

所有这些读数都表明大量的咖啡将被浪费掉,尤其是对于较大的颗粒(> 500 微米)。为了方便起见,我喜欢超级自动的,但我想确保我的下一个在煮浓缩咖啡时不会这么低效。不过,我怀疑让一台机器自动制作真正好的浓缩咖啡是下一个层次的挑战。

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

我的进一步阅读:

浓缩咖啡系列文章

工作和学校故事集

个人故事和关注点

乐高故事启动页面

摄影启动页面

使用图像处理测量咖啡研磨颗粒分布

改进浓缩咖啡

断奏生活方式概述

测量咖啡磨粒分布

咖啡萃取

咖啡烘焙

咖啡豆

浓缩咖啡滤纸

浓缩咖啡篮及相关主题

意式咖啡观点

透明 Portafilter 实验

杠杆机维修

咖啡评论和想法

咖啡实验

机器和深度学习纲要开卷

原文:https://towardsdatascience.com/the-machine-deep-learning-compendium-open-book-7e7bd77fbc4f?source=collection_archive---------7-----------------------

来自机器和深度学习纲要的部分主题列表

数据科学家和 ML 工程师的综合资源。

大约一年前,我公布了《机器与深度学习概要》,这是一份在谷歌私人文档中整理的个人资源列表。为了支持这个新的接口,这个文档现在被废弃了。我决定把它作为一种教育工具来分享,以便让人们学习和联系我总结、引用和参考的所有伟大的作者。ML 概要包含 500 多个主题,在它的文档版本中,有 400 多页长。

请注意:我正在重组概要。我之所以做出如此巨大的努力,是因为该简编最初是我个人的资源列表,供我个人使用,没有任何标准化,也没有向公众开放的意图,目的是让读者轻松找到主题,并让参考作者从社区获得支持。如果你觉得某些内容需要改变,请联系我,我们会一起努力实现。我的意图是支持社区和作者,并教育人们。

Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是《ML & DL 纲要》和《StateOfMLOps.com》的作者。他是 TLV 新遗迹公司的首席数据科学家,在 AIOps & MLOps 领域进行机器和深度学习研究。

联系人:领英 | 中|OriCohen.com|book.mlcompendium.com

2021 年的机器学习生命周期

原文:https://towardsdatascience.com/the-machine-learning-lifecycle-in-2021-473717c633bc?source=collection_archive---------5-----------------------

你实际上如何完成一个机器学习项目,有哪些工具可以帮助你完成每一步?

托尔加·乌尔坎在 Unsplash 上拍摄的照片

在这个时代,每个人和他们的母亲都在研究机器学习。似乎每个正在收集数据的公司都在试图找出一些方法来使用人工智能和人工智能来分析他们的业务,并提供自动化的解决方案。

到 2027 年,机器学习的市场价值预计将达到 1170 亿美元— 财富商业观察

这种在 ML 中流行的涌入导致许多没有正式背景的新人进入这个领域。虽然越来越多的人对这个领域感到兴奋和学习是件好事,但需要清楚的是,在生产环境中整合一个 ML 项目并不是一件容易的事情。

图片来自基于 750 家企业的算法 ia 得出的 2020 年企业 ML 状态

55%从事 ML 模型工作的企业尚未将其投入生产— Algorithmia

许多人似乎认为,如果您拥有训练模型所必需的数据和计算资源,那么 ML 项目是相当简单的。他们大错特错了。这种假设似乎会导致大量的时间和金钱成本,而无需部署模型。

ML 生命周期的天真假设(图片由作者提供)

在这篇文章中,我们将讨论 ML 项目的生命周期实际上是什么样子,以及一些帮助解决它的工具。

机器学习生命周期

事实上,机器学习项目并不简单,它们是在改进数据、模型和评估之间的循环迭代,永远不会真正完成。这一循环在开发 ML 模型中至关重要,因为它侧重于使用模型结果和评估来优化数据集。高质量的数据集是训练高质量模型的最可靠的方法。这个循环迭代的速度决定了你的成本,幸运的是有一些工具可以帮助你在不牺牲质量的情况下加速这个循环。

ML 生命周期的现实例子(图片由作者提供)

就像任何系统一样,即使部署的 ML 模型也需要监控、维护和更新。你不能只是部署一个 ML 模型,然后忘记它,期望它在余下的时间里像在真实世界的测试集上一样工作良好。部署在生产环境中的 ML 模型将需要更新,因为您会发现模型中的偏差,添加新的数据源,需要额外的功能,等等。这将您带回到数据、模型和评估周期。

截至 2021 年,深度学习已经突出了十多年,并帮助将 ML 带到了市场的前沿和中心。ML 行业经历了一个繁荣期,无数的产品被开发出来帮助创建 ML 模型。ML 生命周期的每一步都有一些工具,你可以使用它们来加速这个过程,而不会像那些 ML 项目永远见不到天日的公司一样结束。

接下来的部分将深入 ML 生命周期的每个阶段,并强调流行的工具。

阶段 1:数据

ML 生命周期中的数据(图片由作者提供)

虽然最终目标是一个高质量的模型,但训练一个好模型的命脉在于传递给它的数据的数量,更重要的是数据的质量。

ML 生命周期中与数据相关的主要步骤有:

数据收集 —不管质量如何,尽可能多地收集原始数据。最终,只有一小部分数据会被标注,这也是大部分成本的来源。当模型性能出现问题时,根据需要添加大量数据是非常有用的。

  • 公共数据集列表

定义你的注释模式——这是生命周期中数据阶段最重要的部分之一,但经常被忽视。构造不良的注释模式将导致不明确的类和边缘情况,这使得训练模型更加困难。

例如,对象检测模型的性能很大程度上取决于大小、定位、方向和截断等属性。因此,在注记过程中包含对象大小、密度和遮挡等属性可以提供创建模型可以学习的高质量训练数据集所需的关键元数据。

  • Matplotlib , Plotly —您的数据的绘图属性
  • Tableu —分析平台,更好地了解您的数据

数据注释—注释是一个单调乏味的过程,需要连续几个小时执行相同的任务,这就是注释服务蓬勃发展的原因。结果是注释者可能会犯很多错误。虽然大多数注释公司保证最大误差百分比(例如 2%最大误差),更大的问题是定义不良的注释模式导致注释者决定不同地标记样本。注释公司的 QA 团队很难发现这一点,这是你需要自己检查的事情。

  • 秤、标签盒、神童 —流行的注释服务
  • 土耳其机器人 —众包注释
  • CVAT — DIY 计算机视觉标注
  • Doccano — NLP 专用注释工具
  • Centaur Labs —医疗数据标签服务

改进数据集和注释 —在尝试改进模型性能时,您可能会将大部分时间花在这里。如果你的模型正在学习但表现不好,罪魁祸首几乎总是一个包含偏见和错误的训练数据集,这些偏见和错误为你的模型创造了一个性能上限。改进您的模型通常涉及类似于硬样本挖掘(添加与模型失败的其他样本相似的新训练数据)的事情,基于您的模型学习到的偏差重新平衡您的数据集,以及更新您的注释和模式以添加新标签并改进现有标签。

  • DAGsHub —数据集版本化
  • 第五十一 —可视化数据集并发现错误

第二阶段:模型

ML 生命周期中的模型(图片由作者提供)

尽管这个过程的输出是一个模型,但理想情况下,您在这个循环中花费的时间最少。

在工业界,花在数据集上的时间比花在模型上的时间多。感谢安德烈·卡帕西(来源,原话)

探索现有的预训练模型 —这里的目标是重用尽可能多的可用资源,为您的模型生产提供最佳开端。迁移学习是当今时代深度学习的核心租户。您很可能不会从头开始创建模型,而是对一个已经在相关任务中进行过预训练的现有模型进行微调。例如,如果您想创建一个面具检测模型,您可能会从 GitHub 下载一个预训练的人脸检测模型,因为这是一个更受欢迎的主题,有更多的前期工作。

  • 51 个模型动物园——在一行代码中下载并运行模型
  • TensorFlow Hub —已训练的 ML 模型的存储库
  • modelzoo.co—针对各种任务和库预训练深度学习模型

构建训练循环 —您的数据可能在某些方面与用于预训练模型的数据不同。对于影像数据集,在为模型设置训练管道时,需要考虑输入分辨率和对象大小等因素。您还需要修改模型的输出结构,以匹配标签的类和结构。 PyTorch lightning 用有限的代码提供了一种扩大模型训练的简单方法。

  • Scikit Learn —构建并可视化经典的 ML 系统
  • PyTorch , PyTorch Lightning , TensorFlow , TRAX —热门深度学习 Python 库
  • Sagemaker —在 Sagemaker IDE 中构建和训练 ML 系统

实验跟踪——整个循环可能需要多次迭代。你将最终训练许多不同的模型,所以在你跟踪模型的不同版本和超参数以及它所训练的数据时要小心谨慎,这将极大地有助于保持事物的条理性。

  • 张量板,权重&偏差, MLFlow —可视化并跟踪模型超参数

边注:即使你认为你的任务是完全独特的,这里也有一些训练前的技巧可以考虑。我建议寻找方法,以无监督或半监督的方式预训练你的模型,仍然只使用总原始数据的一小部分进行微调。根据您的任务,您还可以查看合成数据来预训练您的模型。我们的目标只是获得一个已经学习了数据的良好表示的模型,以便您的微调数据集只需要用于训练几层模型参数。

第三阶段:评估

ML 生命周期中的评估(图片由作者提供)

一旦你设法得到一个已经学习了你的训练数据的模型,是时候深入研究一下,看看它在新数据上的表现如何。

评估 ML 模型的关键步骤:

可视化模型输出 —一旦你有了一个训练好的模型,你需要立即在几个样本上运行它,并查看输出。在对整个测试集运行评估之前,这是发现您的培训/评估管道中是否有任何 bug 的最好方法。它还会显示是否有明显的错误,比如你的两个类是否被贴错了标签。

  • OpenCV , Numpy , Matplotlib —编写自定义可视化脚本
  • 第五十一 —将计算机视觉任务的输出可视化在图像和视频上

选择正确的指标 —提出一个或几个指标有助于比较模型的整体性能。为了确保您为您的任务选择了最好的模型,您应该根据您的最终目标开发度量标准。当您发现想要跟踪的其他重要品质时,您也应该更新指标。例如,如果您想开始跟踪您的对象检测模型在小对象上的表现,请使用带有边界框< 0.05 的对象贴图作为您的度量之一。

虽然这些总数据集指标在比较多个模型的性能时很有用,但它们很少帮助理解如何提高模型的性能。

  • Scikit Learn —提供通用指标
  • Python , Numpy —开发定制指标

看看失败案例——你的模型所做的一切都是基于它被训练的数据。因此,假设它能够学习一些东西,如果它的表现比你预期的更差,你需要看一看数据。查看模型运行良好的情况可能会很有用,但查看模型预测错误的假阳性和假阴性也很重要。在浏览了足够多的样本后,你会开始发现你的模型中的失败模式。

例如,下图显示了来自开放图像数据集的样本,其中一个误报显示为后轮。这个误报被证明是一个丢失的注释。验证数据集中的所有车轮标注并修复其他类似错误有助于提高模型在车轮上的性能。

泰勒·甘特(来源)的图片

  • 五十一、水族馆、秤核 —数据集调试找错误

制定解决方案 —识别失败案例是找出改进模型性能的方法的第一步。在大多数情况下,它会返回到添加训练数据,类似于您的模型失败的地方,但它也可以包括像更改管道中的预处理或后处理步骤或修复注释这样的事情。不管解决方案是什么,你只能通过理解模型的失败之处来解决问题。

第 4 阶段:生产

部署模型(图片由作者提供)

终于!您已经得到了一个在您的评估指标上表现良好的模型,在各种边缘情况下没有重大错误。

现在,您需要:

监控模型 —测试您的部署,以确保您的模型在测试数据上仍然按照您的评估指标和推理速度等方面的预期执行。

  • 厚皮动物,算法 ia ,数据机器人, Kubeflow , MLFlow —部署和监控模型和管道
  • 亚马逊网络服务、谷歌 AutoML 、微软 Azure —基于云的 ML 模型解决方案

评估新数据 —在生产中使用模型意味着您将频繁地通过从未测试过的模型传递全新的数据。执行评估和深入研究特定样本以查看模型在遇到任何新数据时的表现非常重要。

继续理解模型 —您的模型中的一些错误和偏见可能根深蒂固,需要很长时间才能发现。您需要不断地测试和探测您的模型,寻找各种边缘情况和趋势,如果它们被客户发现,可能会导致问题。

扩展能力——即使一切运行完美,也有可能这种模式并没有像你希望的那样增加利润。从添加新的类、开发新的数据流,到使模型更有效,有无数种方法可以扩展您当前模型的功能,使它变得更好。任何时候你想改进你的系统,你都需要重启 ML 生命周期来更新你的数据,模型,并评估它以确保你的新特性如预期的那样工作。

五十一

以上是相当普遍和公正的,但我想告诉你一点点关于我一直在工作的工具。

许多工具存在于 ML 生命周期的不同部分。然而,有一个非常明显的工具缺乏帮助我在这篇文章中强调的一些要点。诸如可视化复杂数据(如图像或视频)和标签或编写查询来查找模型性能不佳的具体情况等工作通常通过手动脚本来完成。

我一直在 Voxel51 工作,开发 FiftyOne ,这是一款开源数据可视化工具,旨在帮助调试数据集和模型,填补这一空白。FiftyOne 允许您在本地或远程的 GUI 中可视化您的图像和视频数据集以及模型预测。它还提供了强大的功能来评估模型,并为数据集或模型输出的任何方面编写高级查询。

FiftyOne 可以在笔记本上运行,所以请使用这款 Colab 笔记本在您的浏览器中尝试一下。或者,您可以使用 pip 轻松安装它。

pip install fiftyone

来自五十一中对象检测模型和数据集的样本(图片由作者提供)

总结

在所有试图将机器学习(ML)融入其业务的公司中,只有一小部分能够将模型实际部署到生产中。ML 模型的生命周期并不是一帆风顺的,而是需要在数据和注释改进、模型和训练管道构建以及样本级评估之间不断迭代。如果你知道自己在做什么,这个循环最终会导致一个生产就绪的模型,但它也需要随着时间的推移进行维护和更新。幸运的是,在这个过程的每一步都有无数的工具可以帮助你。

机器学习足球专家

原文:https://towardsdatascience.com/the-machine-learning-soccer-pundit-b154c910f7eb?source=collection_archive---------60-----------------------

基于 PCA 和 K-Means 的大联盟球员聚类

Feo con Ganas 在 Unsplash 上拍摄的照片。

最近,在 12 月,美国职业足球大联盟 2020 赛季在经历了艰难的一年后结束了。尽管如今我与这项运动有着遥远的关系,但作为一名巴西人,这个话题对我来说是非常自然的。自从我回到美国生活,我开始对这个国家的足球发展感兴趣,看到了作为一项运动和商业的巨大潜力。

读了关于总决赛的报道,我意识到我对球员们知之甚少,并决定探索一些,以了解更多关于联盟、球队、球迷和球员的信息。然而,我的目标不是肤浅的分析,只是熟悉基本的统计数据。为了更广泛地覆盖这个主题,我想创建一个模型来分析玩家并开发集群,同时基于几个标准,根据他们的游戏特征对他们进行分组。

我开始这个项目是从 sports-reference.com 那里获取数据,这个网站有很多可用的统计数据,并且允许非商业用途的抓取。我手动选择必要的 URL 并迭代它们,通过请求捕获,并用 BeautifulSoup 进行分析。虽然这些表不在页面的“正文”中,但是很容易在“评论”中找到它们,从而开始清理过程。使用 pandas,我为每个表创建了一个 dataframe,并将其全部合并为一个,涵盖了所有 680 名参加冠军赛的球员的数据。

标准统计、射门、传球、传球类型、射门、进球和射门创造、防守动作、控球、守门员表格中获取数据。

起初,我忽略了守门员数据,因为这些表不包含其他球员的数据,这与“射门”表不同,后者也包含守门员的数据。经过清理工作,包括删除也出现在表格中间的标题行,删除重复的列(例如,姓名、国家、位置、球队出现在所有原始表格中),并固定位置列(具有双重位置的球员,如“MF,FM”留在列表中的第一个位置,在这种情况下是“MF”),我添加了守门员数据。这些数据对于聚类阶段是必不可少的,提供了必要的材料来区分守门员和其他人。

之后,我选择了必要的列。我选择只选择与技能相关的统计数据,去掉诸如预测值、平均值或完全基于对手行动的数字等统计数据。我也没有使用年龄和出生地数据。我感兴趣的是最后一个赛季,而不是球员的未来。我选择分析他们在球场上的表现。

总的来说,我选择了 97 个特征,一些是明显的进球,助攻和传球完成,其他的则较少分析,如中场三分之一的传球和进攻传球的总距离。

累积方差和分量数。

累积解释方差:几乎 100%只有 50 个特征

在数据框架完成之后,主要是清理之后,我开始了集群阶段。我选择了两种方法:都使用 PCA(主成分分析)和 K-Means。我想执行可视化分析,并利用 Plotly 的悬停功能,该功能允许您将鼠标光标放在标记上,并获得图表上的点数据(我没有在这里上传文件,因为它们太大了)。我的想法是旅行的点,了解每个球员的主要特点。有 93 个特征,那是不可能的。这时候 PCA 就能帮上忙了。

由于每个要素都有自己的取值范围,因此有必要对这些要素进行缩放。由于数据是正态分布的,所以我使用了 StandardScaler。我还使用 sci-kit learn 的传统过程,创建一个管道来简化这个过程。

穿紫色的守门员;橙色的辩护人;身穿黑衣的中场队员;米色向前。

我检查了累计解释方差。通过将 93 个特征压缩成两个,有可能获得 69%的方差。有三个成分的,73%。对于我提出的想法,这就足够了。首先,我绘制了组件,用播放器数据中指示的标准字段位置来分隔颜色。有趣的是看到这三个组成部分的公式是如何考虑不同的特征,给与攻击、防御和决定性移动相关的特征赋予不同的值。

20 个特征及其在每个操作系统中的权重。

我还绘制了包含三个元素的 PCA。

从 K-means 开始,要做的第一件事是定义要构建的理想聚类数。“肘”和“轮廓得分”方法都显示了最小值,如 2 个集群(正如预期的那样,指示是在守门员和其他球员之间进行区分)。我对四个位置(守门员、后卫、中场和前锋)不感兴趣。于是,我再深入一点,选了六组。

形成的集群有:

  1. 前锋——他们负责大部分进球,偷几个球,踢很多。他们的向前传球量相对较小,因为他们经常在靠近球门的地方接球,几乎没有前进的空间。他们很果断,很少触球就能取得很好的进攻效果。

例如:格亚西·扎尔德斯、劳尔·鲁伊迪亚斯、罗伯特·贝里

2。伟大的防守者——是玩得最多的一组,在所有组中累积最高分钟数。他们在前三分之一给对手施加压力,赢得许多铲球,使用空中游戏和头球——这些球员非常重要。

例如:弗朗西斯科·卡尔沃,贾德森,埃迪·塞古拉

3。有一定攻击力的后卫——一个包括很多边后卫,很少前锋的群体。他们利用场地的两侧,防守,也制造进攻动作。他们在大多数统计数据中表现平平,仅在助攻次数上表现突出。总的来说,这个小组非常同质,有几个亮点球员。

前:亚历山大·比特纳,迭戈·帕拉西奥斯,阮

4。不是伟大的防守者——另一个很少有前锋的群体,他们经常触球,并且有宁静以小速度比赛。从他们在防守场地接球开始,累积良好的前进距离。他们进了几个球。然而,他们不是很突出,有离散的统计数据。

例如:伦佐·詹布拉诺、盖迪翁·泽拉勒姆、伊富纳亚奇·阿查拉

5。替补球员——替补多的群体,主要是门将。他们在现场只积累了几分钟,由于参与有限,统计数据很差。

6。普通组——一个集合了各个位置球员的组,有很多不太突出的中场。在这个集群中,规则是不要突出。球员甚至进了几个球,但丢球多,收益少。

这项工作很有趣,因为它考虑到了球员的几个素质。只看偶像化统计中的领导人可能会扭曲解释。在各个领域表现出色的球员对于打造一支有竞争力的球队至关重要。例如,这种类型的工作可以扩大,考虑到更有经验的球员的工资和年轻球员的潜力。

访问我的 Github repo,获取使用的代码。 你也可以看到我是如何使用层次聚类开发出同样的聚类过程的。

机器学习网络——姿态和动作估计器——第 1 部分

原文:https://towardsdatascience.com/the-machine-learning-web-pose-and-actions-estimator-3203a0cf5f60?source=collection_archive---------9-----------------------

实时姿态估计 web 应用程序

我想我们都同意 2020 年是疯狂的一年。为了保持头脑清醒,我决定恢复一个老项目,这个项目是我很久以前和 Omer Mintz 一起使用 PoseNet 进行姿态估计的。

在恢复这个项目时,我想实现的目标变得很清楚:一个姿势和动作估计 web 应用程序,它依赖于机器学习能力来“学习”新动作,而不牺牲性能。

结果呢?嗯,你可以看到自己。

代码也在这个 Git 仓库上共享。

TL;速度三角形定位法(dead reckoning)

我们使用由 PoseNet 预训练模型提供的数据输出,并应用一些数据工程。借助于一些数据探索,我们发现 KNN 机器算法可以很好地对结果进行分类。最终结果——一个评估参与者正在进行的锻炼的系统。

目标

  • 一个 web 应用程序,知道如何估计参与者发现什么姿势(站,蹲,俯卧撑)。
  • 计算参与者重复做了多少次。
  • 高性能-渲染周期之间的延迟应该最小。
    应用程序的交互性不应受到影响。
  • 易于扩展——可以学习新的动作,只需很少的改动
  • 文本到语音转换—附加功能

堆栈

  • 使用 TensorFlow 和 NumPy 的 Python 我们需要一种应用 ed a 和训练模型的方法。
  • React —用于渲染和交互式 web 应用程序。
  • 张量流。JS—在浏览器上运行训练好的模型和 ML 算法。
  • 画布—图像渲染和修改。
  • Web Workers—为了提高性能,以免主线程过载。

为了进行姿态检测,我使用了基于 RestNet50 架构的预训练模型 PoseNet 。

这个预先训练好的模型允许我们从图像中捕捉人的部分,稍后,它将被用于估计动作。

波塞尼特

PoseNet 是在计算机视觉下建立的用于姿势估计的预训练模型。
pose net 模型检测图像和视频中的人物,并提供确定在帧中发现的人的不同部分的能力。

PoseNet 库处理以下内容:

  • 数据预处理(裁剪和调整大小,缩放像素值)
  • 使用 TensorFlow 对给定数据应用模型。
  • 从结果中解码关键点。
  • 计算每个部分和整个姿势的置信度得分。

输入

PoseNet 模型将经过处理的摄像机图像作为输入。
为了更好的性能,我们将使用 224 X 224 像素的帧,这将允许我们处理和处理更少的数据。

提醒 PoseNet 库将应用另一个大小调整(如前一节所述)。

输出

具有以下内容的对象:

  1. 分数——姿势的总体置信度分数
  2. 关键点—17 个元素的列表,每个元素确定不同关键点(零件)的结果,这些关键点由 x 和 y 位置、零件名称和分数标识
{score: float;keypoints: Array<{ // Array of the 17 keypoints identifiedposition: {x: float, y: float};part: EBodyParts; // the keys of the enumscore: float;}>
}enum EBodyParts {nose,leftEye,rightEye,leftEar,rightEar,leftShoulder,rightShoulder,leftElbow,rightElbow,leftWrist,rightWrist,leftHip,rightHip,leftKnee,rightKnee,leftAnkle,rightAnkle
}

配置

我为 PoseNet 使用的配置是

architecture: 'ResNet50'
outputStride: 16
quantBytes: 4
inputResolution: {width: 224, height: 224}
  • 架构— ResNet50 或 MobileNet v1
  • 输出步幅—输出步幅决定了我们相对于输入图像大小缩小输出的程度。它影响层的大小和模型输出。输出跨度越大,网络和输出中各层的分辨率越小,相应地其精度也越低。在该实现中,输出步幅可以具有 8、16 或 32 的值。换句话说,输出步幅为 32 时,性能最快,但精度最低;输出步幅为 8 时,精度最高,但性能最慢。我的配置中的
    Resolution = ((InputImageSize - 1) / OutputStride) + 1 Resolution = ((224- 1) / 16) + 1 = 14.9375

ResNet50

PoseNet 允许我们使用两种模型架构之一:

  1. Mobilenet v1
  2. ResNet50

PoseNet 官方文档提到,Mobilenet v1 比 ResNet50 架构更小更快,精度更低,resnet 50 架构更大更慢,但精度更高。

为了更好地理解这两篇文章之间的区别,我强烈建议回顾这两篇文章:

  • 移动互联网 V1 架构
  • ResNet50 架构

从姿势到动作

为了将这些关键点(X 和 Y 坐标)转化为行动,我们将需要在这里应用更多的统计能力,因此,我决定使用聚类算法。更准确地说,是 KNN 算法

数据

“信息是 21 世纪的石油,分析是内燃机。”SVP 高德纳公司的彼得·桑德加德在 2011 年说道。

我们被数据平台所包围。
数据就躺在那里,等着我们去拾起、清理和使用。

当然,这个“捡起来”和“清理掉”的任务并不那么简单,工程师和数据科学努力获取好的数据来训练他们的模型。
我喜欢把它比作使用金属探测器的沙滩寻宝;你周围有许多金属物品,但在极少数情况下,你会发现一个真正的宝藏。

我的海滩是 youtube。更具体地说,youtube 上的个人训练视频,你可以和教练一起用同样的姿势训练。如此多的姿势,现在所需要的就是将视频分解成帧,并将它们分类成正确的姿势(例如,站立、蹲下、俯卧撑、下推)

为了将视频分解成帧,我使用了以下简单的 python 代码:

import os
import cv2def video_to_frames(video_path: str, destination: str):if not os.path.exists(os.path.join(os.getcwd(),'output')):os.mkdir(os.path.join(os.getcwd(),'output'))if not os.path.exists(destination):os.mkdir(destination) vid = cv2.VideoCapture(file_path)success,image = vid.read() # read the first imagecount = 0while success: # in case there are more images - proceedcv2.imwrite(os.path.join(destination,f'frame{count}.jpg'), image) # write the image to the destination directorysuccess,image = vid.read() # read the next imagecount += 1

在我们提取帧之后,我们可以做一些分类工作。这项工作主要要求我们将文件移动到姿势的正确目录中——是“蹲”还是“站”的姿势。

现在我们已经完全准备好了我们的训练集,是时候训练我们的模型了。

对图像进行分类后,我们现在可以继续进行模型训练阶段。但是首先,我们需要考虑如何处理这些数据。

我们知道我们有一个分类问题,我们有一组想要输出到单个类的要素。

这些选项包括:

  1. 深度学习分类:
    使用深度学习进行分类是现在的趋势,我们可以设置训练-测试集来识别姿势。像 YOLO 模型这样的东西可以帮助我们识别图像是蹲下、站立、俯卧撑,例如
    这里的主要问题是,它需要我们大量的图像来训练,非常高的计算能力,并且可能会导致我们的预测置信度较低(对于 F1 &的准确性分数)。
  2. PoseNet 结果之上的机器学习聚类算法:
    我们已经有了一个非常坚实的模型来识别参与者的不同身体部位。在这种情况下,我们可以获取一个图像,并将其转换为表格模型,但身体部位的 X 和 Y 位置并不那么有用,但它仍然是一个开始。

我们将进行第二种选择。
现在我们需要为聚类算法准备我们的特征。这意味着,我们需要角度,而不是用不同身体部位的 X 和 Y 位置。
这需要将基本的三角学公式从我的脑海中唤醒:

  • 将 x 和 y 点转换为线条

  • 计算线的顶角:

左腋窝角 —利用左肩、左肘、左臀
右腋窝角 —利用右肩、右肘、右臀
左肩角 —利用左肩、右肩、左臀
右肩角 —利用右肩、左肩、右臀
左肘角 —利用左肘、左肩、 和左腕
右肘角度 —利用右肘、右肩、右腕
左臀角度 —利用左臀、右臀、左肩
右臀角度 —利用右臀、左臀、右肩
左腹股沟角度 —利用左臀、左膝、左脚踝
右腹股沟角度 —利用右臀、右 右脚踝
左膝盖角度 —使用左膝盖、左脚踝和左臀部,
右脚踝角度 —使用右膝盖、右脚踝和右臀部

  • 以弧度计算一个人姿势的斜率,这将有助于我们识别这个人是处于垂直位置还是水平位置。

最小斜率(斜率 1,斜率 2)被发现可以识别人的真实状态——整个身体的斜率,而不仅仅是身体的一部分

这使得我们能够得到这个数据集。

培训

在我们准备好数据集后,我们可以使用 PCA 进行一些分析,以获得主成分的可视化,这将有助于我们更加确定分类过程的成功率,并确定哪种算法最适合。

这里是 PCA 的 google colab 项目,感谢 Ethel V 帮助设置和微调功能。

正如我们所看到的,集群是非常明显的分类(除了蹲和站在有一些工作要做的地方)。
我决定和 KNN 一起去应用分类。

KNN-k-最近邻,一种适用于分类和回归问题的监督统计算法,用于机器学习。

KNN 流

  1. 加载数据并初始化 K 个邻居
  2. 对于数据中的每个示例:
  • 计算数据集中的当前记录与查询示例之间的距离。
  • 将示例的距离和索引添加到集合中

3.按距离从小到大对距离和索引集合进行排序。

4.从排序的集合中挑选前 K 个条目

6.获取所选 K 个条目的标签

7.结果:

  • 在回归的情况下—返回 K 个标签的平均值。
  • 在分类的情况下—返回 K 标签的模式。

KNN 符合我们的感谢:

  • 清晰的类别分组——在大多数情况下,我们可以很容易地识别类别组。
  • 一些异常值需要更复杂的处理——KNN 比其他分类算法(如 SVM)更好地处理更复杂的数据结构,尤其是非线性的数据结构。
  • 我们数据集中的少量记录—基于神经网络的解决方案将需要
  • 计算复杂性——与神经网络相比,KNN 在训练/评估时间上需要更少的计算能力。
    此外,由于我们可以选择的类数量很少,数据集中只有几百条记录,因此我们的性能不会大幅下降。

使用案例

使用 KNN,我们将使用角度和斜率对正确的动作进行分类。
稍后,通过 web 应用程序,我们将使用不同的动作组合来确定参与者进行的练习。

我们将在下一章回顾这一点以及更多。

希望你喜欢这篇文章,敬请关注😊

链接

  • 演示应用
  • Git 仓库

机器学习工作流程

原文:https://towardsdatascience.com/the-machine-learning-workflow-1d168cf93dea?source=collection_archive---------27-----------------------

从开始到生产

活动发起人在 Unsplash 上的照片

介绍

第一次独自接近一个机器学习项目可能会非常困难。当你已经参加并通过了大量的在线评估时,你可能会很困惑,为什么在你开始解决问题的那一刻,你仍然觉得好像还缺少什么——这往往会导致一个恶性循环,一门又一门课程,却没有获得多少实际经验。

课程很棒,当我想提高某个领域的技能时,我喜欢参加课程,但随着时间的推移,我意识到课程只能做很多事情。我个人的看法是,机器学习领域的大多数课程都不能让你在现实世界中工作。这并不是因为这些课程不好,而仅仅是因为在实践环境中复制真实世界的场景非常困难。

学习环境和真实世界之间的内在差异通常是阻碍许多初学者学习机器的原因。出于这个原因,我非常强调在项目中工作,但在这个过程中努力复制行业的期望,因为这可以让你更好地准备好迎接行业的发展。

机器学习工作流

也就是说,我将向您介绍机器学习工作流,您可以使用它来处理您的项目。一定要注意,机器学习的工作流程可能会各不相同,因此,我将使用来自成为机器学习工程师 Nanodegree 【见下图】的一个,它受到了亚马逊、谷歌和微软等大公司的启发。

来源:成为机器学习工程师 Nanodegree

上图显示了我们将在本文中探索的机器学习工作流由 3 个组件组成;1)数据探索和处理 2)建模 3)部署。让我们介绍一下每个组件,以便更好地了解正在发生的事情。

数据探索和处理

如果你给一个机器学习模型喂垃圾,你应该期待收到垃圾作为回报。因此,需要做大量的工作来确保数据的高质量,因为这将为建模提供一个良好的起点。在机器学习工作流程中,这个过程往往会占用最多的时间。

数据检索

在我们开始任何类型的机器学习项目之前,我们首先需要获得高质量的数据。有几种方法可以获取数据,如利用公共数据集、数据搜集、产品干预、不同获取策略的组合等。

数据清理 &探索

数据很少处于干净的状态,例如,一些要素可能有很大一部分缺失值,或者可能存在应该处理的异常值。与这一过程相结合的是数据探索,它用于获得对数据的更深入的理解。

https://medium.datadriveninvestor.com/what-do-data-scientists-even-do-fb5d3bef30fc

数据准备/特征工程

准备数据集以使用机器学习模型是困难的,因为它需要直觉、数据操作技能和领域专业知识。此外,没有两个数据集是完全相同的,这意味着可能在一个项目中有效的技术不一定在另一个项目中有效(尽管它可以用作参考点)。

</5-best-practices-for-feature-engineering-in-machine-learning-projects-e0a4e74fc4fa> [## 机器学习项目中特征工程的 5 个最佳实践

towardsdatascience.com](/5-best-practices-for-feature-engineering-in-machine-learning-projects-e0a4e74fc4fa)

建模

这可能是 ML 工作流程中最令人兴奋的部分,如果我们参加了 Kaggle 竞赛或类似的活动,我们中的许多人都会接触到它。

模型开发/培训

模型开发/训练阶段涵盖了向机器学习模型输入其可以学习的数据的任务。机器学习模型处理大量数据的能力使企业能够为过去一度无法解决的问题提出解决方案。

https://github.com/kurtispykes/ml-from-scratch

模型验证/评估

我们使用一个实数来评估我们的机器学习模型的性能(即 RMSE、MAE、准确度)。一旦完成这些,我们就可以决定模型是否如我们所愿地执行,或者它是否需要更多的工作来从模型中获得期望的行为-这个过程将包括查看模型所犯的错误,并判断如何改进它们。

部署

出于这样或那样的原因,我参加的许多课程都没有涉及到部署——我不得不明确地参加非常关注这个主题的课程来学习它。我参加的课程有:

  • 成为机器学习工程师(Udacity)
  • 部署机器学习模型(Udemy)

模型部署

部署仅仅是让用户可以访问机器学习模型。在生产环境中,模型可以接收输入,然后将输出返回给使用系统的最终用户。例如,用户可能会传入他们看到的某处房产的详细信息,模型会处理这些输入并返回价格估计。

模型监控&更新模型和数据

模型监控包括密切跟踪机器学习模型在生产中的表现。这样做是为了让人工智能团队能够在潜在问题对业务造成影响之前发现并处理它们。

此外,模型和数据在整个生产过程中都需要更新。这是在数据模式突然改变的情况下完成的,这可能损害模型的性能。

https://blog.datatron.com/model-management-for-machine-learning/

包裹

行业标准与课程中所教授的内容之间存在巨大差距,这是完全可以理解的,因为在实践中复制真实世界的环境可能非常具有挑战性。然而,这并不意味着你的发展应该受到影响。我鼓励每个从业者投身于他们感兴趣的项目,但也要了解工作环境中到底发生了什么,这样他们就可以复制在行业内工作的感觉。

感谢您的阅读!

如果你喜欢这篇文章,请通过订阅我的免费 每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。

相关文章

[## 如何创建引人注目的 Github 产品组合

towardsdatascience.com](/how-to-create-a-compelling-github-portfolio-a229e7472a92)

机器学习工作流程解释(以及你现在如何实践它)

原文:https://towardsdatascience.com/the-machine-learning-workflow-explained-557abf882079?source=collection_archive---------9-----------------------

这三个组成部分,包括大多数 ML 课程遗漏的部分

茱莉亚·M·卡梅隆摄于 Pexels

大部分新手在闯入 AI 行业的时候都很纠结。为什么?在那之前,他们所学的一切都来自于旨在教授理论和一些玩具项目的机器学习课程。

这场斗争主要是因为现实世界中的期望与他们所学到的东西之间的差距。可悲,但却是事实。

不要误会我的意思,那些课程很重要,而且当我还是初学者的时候,我已经完成了我的一份工作。但更重要的是尽早与行业预期保持一致。

机器学习工作流程可能因公司而异,因此为了获得最准确的工作流程,让我们看看几家科技巨头是如何定义它们供自己使用的。

借用这三家科技巨头的专业知识

亚马逊、谷歌和微软是三大科技巨头,它们在其产品中率先推出了机器学习。这三家公司都有云平台,可以帮助其他公司和个人用户充分利用机器学习。

在我目前的工作中,我们使用微软 Azure 作为我们的生产环境。类似地,大多数公司使用这些平台中的任何一个。他们的平台是最接近真实生产环境的可用资源。

为了了解这些公司的典型工作流程,让我们来看看他们自己的文档:

  1. 亚马逊网络服务讨论了其对机器学习工作流程的定义:它概述了从获取、清理、准备数据、训练模型到最终部署模型的步骤。
  2. 谷歌云平台讨论他们对机器学习工作流程的定义。Google,除了上面的步骤,还谈到了管理模型的版本。
  3. 微软 Azure 讨论了他们对机器学习工作流程的定义。微软虽然类似于亚马逊和谷歌的典型工作流程,但强调 ML 生命周期管理。

我们可以得出结论,对于这三家公司来说,典型的工作流或多或少是相同的,因此我们使用他们的工作流的组合来派生我们的工作流。

让我们深入研究这些组件,好吗?

作者创作的插图

1.数据处理

你可能听说过,如果你有正确的数据,80%的战斗就胜利了。

我可以证实那是真的。

在我们处理的大多数初学者问题中,数据是放在银盘上交给我们的(阅读 Kaggle 数据集)。因此,我们从来没有经历过获取它们的麻烦。

有时候你很幸运,客户一直维护着一个高效的数据库系统。抱歉戳破了泡沫;我还没遇到过这样的客户。

该组件可进一步分为:

  • 检索数据 —数据不断流入业务;数据工程师将设计数据库,并建立一个有效的系统来存储和检索用于建模目的的数据。
  • 清理和探索数据 —原始数据需要清理。探索数据中的模式可以帮助数据科学家确定模型的特征。必须从数据中剔除异常值和异常值。
  • 准备数据— 大多数 ML 模型都需要标准格式的数据,因此必须对数据进行转换,然后拆分成训练、验证和测试数据集。

你现在可以如何练习:

您已经从课程和其他博客帖子中听到了这些步骤。差距仅在于检索数据。跳过这一步很有诱惑力,但如果你从事这项工作,你会很快在所有有抱负的数据科学家和机器学习工程师中脱颖而出。

  • 至少尝试一次数据网络搜集。这个网页抓取课程会给你一个好的开始。浏览 Twitter、Reddit、Wikipedia 或任何可能的网站的经历可以给你获取数据所急需的信心。
  • 学会给图像做注解。录制视频或通过 YouTube 获取它们相当容易。然后视频可以转换成一系列图像,但是每个人都应该至少经历一次图像注释过程。每当轮到你做计算机视觉项目时,它都会很有帮助。
  • 调查收集数据。下次你的朋友让你填写调查问卷时,注意一下问卷是如何设计的。你需要了解如何用更少的问题收集最重要的数据点,照顾受访者的隐私。

其中一些是令人沮丧和乏味的经历,但是,嘿,如果你自己从来没有做过,你怎么能从别人那里得到呢?

这些是我为熟悉数据组件而采取的一些步骤,但是您永远不会局限于这些建议;我知道你明白了。

2.系统模型化

这不是你的强项吗?

大多数人认为工作流程的这个阶段最有趣,我也不例外。我喜欢训练、调整和验证模型。即使在谷歌、亚马逊和微软,这些仍然是工作流程的重要组成部分,这并不奇怪。

建模组件可以进一步分为:

  • 开发和训练模型— 我们使用各种算法,在训练数据集上建立多个模型。scikit-learn、TensorFlow 和 PyTorch 等常见库几乎为每种算法都构建了函数,但这不应该阻止您了解幕后发生的事情。
  • 验证和评估模型— 我们使用验证数据集来验证和调整我们构建的模型。同样,我们使用测试数据集来评估和选择手头问题的最佳模型。

你可能已经完成的课程为你进入这个行业做了很好的准备,我甚至没有看到差距。

你现在可以如何练习:

如果你学过一些课程,我相信你会很清楚这些。老实说,除了吴恩达在他的课程里教的东西,我没有什么可补充的。

这里没有绒毛;让我们继续讨论大部分课程遗漏的部分。

3.部署

我曾经认为作为一名新生,我不需要知道这些概念,但结果是我的老板让我在新工作几周内就开始部署工作。

事实是,95%的课程都忽略了这一部分。也许教授部署并不容易,但我们应该付出额外的努力来理解和学习这些概念。

你建立的高度精确的模型——没有人会使用它,除非你部署它们。这应该激励你学习和掌握机器学习工作流程的最后一个组成部分。

这一部分可以进一步细分为:

  • 部署到生产 —部署就是通过 web 或软件应用程序向用户提供模型。
  • 监控和更新数据 —久而久之,数据中的模式可能会出现季节性或突发性变化,从而导致模型性能下降。在这种情况下,需要更新模型,回到检索数据阶段,从而完成工作流的循环。

你现在可以如何练习:

大多数初学者,包括我过去的自己,都很难接触到部署,因为我们无法在家里复制业务生产环境。

唯一的出路是采用云计算。大多数公司使用云,这是我整个工作流程背后的动机。

  • 学习使用像 streamlit 这样的简单库来构建最终用户友好的机器学习应用。这几乎不会花你一天的时间。
  • 随便挑个云平台。如果没有什么偏好,就挑 Google 云平台。我使用它们是因为除了免费等级之外,它们还提供 300 美元的免费积分。使用这些来让自己熟悉这个平台。
  • 在云中重做一些旧项目。特别要尝试通过云部署让您的项目对最终用户可用。
  • 从平台上提供的课程和文档中获取基于云的部署技能。如果你选择了谷歌云,这里有一个贯穿整个平台的数据工程和机器学习的优秀专业。

最后的想法

当我最终进入数据科学领域时,我努力跟上行业的期望。甚至几年后,我看到大多数初学者都在类似地挣扎。

出现这种情况的主要原因是课程中教授的内容和行业中使用的内容之间的差距。因此,我们研究了谷歌、亚马逊和微软等科技巨头的工作流,以得出行业中实践的典型机器学习工作流。

这些组件是:

  • 检索数据
  • 浏览和清理数据
  • 准备数据
  • 开发和训练模型
  • 验证和评估模型
  • 部署到生产环境
  • 监控和更新模型

我们进一步深入研究了如何练习这些步骤。当你经历工作流程时,你可能已经意识到你的弱点;我唯一的要求是尽快开始研究它们。

我希望这篇文章对你有用。我希望你喜欢读这篇文章,就像我喜欢为你写这篇文章一样。我很感谢 LinkedIn 上的各种反馈,所以请在这里随意打招呼或关注我。

我迫不及待地想看到你成功!

作为披露的提示,这篇文章可能会有一些附属链接来分享我用过的最好的资源,而不会给你带来额外的费用。感谢您的支持!

如果你想获得更多关于数据科学、真实体验和学习的有用见解,可以考虑 加入我的电子邮件好友私人名单

合成数据的魔力

原文:https://towardsdatascience.com/the-magic-of-synthetic-data-using-artificial-intelligence-to-train-artificial-intelligence-with-cebe0d50a411?source=collection_archive---------20-----------------------

用人工智能训练人工智能用 GPT-2

马库斯·沃利斯在 Unsplash 上的照片

最近在做一个 NLP 项目时,我遇到了一个问题。我没有足够的数据。分类模型使用输入数据来预测后续输入数据落入预定类别的可能性。为了执行有效的分类,这些模型需要大数据集进行训练。因此,我创造了一种使用人工智能生成相关合成数据的方法,这将提高我的分类模型的性能。这种方法使得我的基线模型的精度提高了 9.49%精度提高了 7.63%。

合成数据背景

利用合成数据来提高机器学习模型的性能正在成为一种常见的做法。据报道,壳牌正在使用合成数据建立模型,以检测很少发生的问题;例如,壳牌公司创造了合成数据来帮助模型识别恶化的石油管道。(Higginbotham,2020)机器学习实践者的常见做法是通过旋转、翻转和裁剪图像来生成合成数据,以增加图像数据量来训练卷积神经网络。

合成数据的商业价值

2018 年,美国公司在数据采集和管理、处理和分析这些数据的解决方案上花费了近 192 亿美元。(Sweeney,2019)本文讨论的技术可以通过减少训练高性能 NLP 分类模型所需的数据量来降低数据采集的成本。这种技术也可以用于通过扩展训练数据集来改进当前的模型。这些好处可以使公司和组织更有效地实现他们的目标,同时最大限度地降低成本。

GPT-2

我决定使用 OpenAI 的 GPT-2 模型来生成我的合成数据。GPT-2 模型是一个大规模的基于转换器的语言模型,它是在一个大型文本语料库(800 万个高质量网页)上预先训练的。GPT-2 的目标是在给定某个文本中所有先前单词的情况下预测下一个单词。(拉德福德,2020 年)

Yelp 开放数据集

图 Yelp 披萨点评数据子集样本/来源:“作者图片”

我决定使用 Yelp 开放数据集来获取我的数据。Yelp 开放数据集包含各种商业和服务的匿名评论。我创建了披萨店评论的两个数据子集。在这个数据子集内,我将评级分为“正面”数据子集和“负面”数据子集。4 星或 5 星的评级被归类为“积极”。1 星或 2 星的评级被归类为“负面”。我的阴性数据集包含 225 个观察值,阳性数据集也包含 225 个观察值。

生成综合审查数据

图 2: 综合评论生成及数据流/来源:图片作者

我的第一个任务是创建两个 GPT-2 模型,用真正负面的 Yelp 披萨评论数据训练其中一个,用真正正面的 Yelp 披萨评论数据训练另一个。然后,我让这些模型生成合成的负面和正面评论数据,这些数据被合并成一个单一的数据集。

微调 GPT-2

GPT-2 模型设置/来源:作者图片

我选择用 3.55 亿参数的 GPT-2 模型生成综合评论。我使用了 GPT-2 生成方法来定制将要生成的合成数据的类型。

gpt2.generate(sess, run_name = "low-1", length=150, temperature=.9, prefix="The crust was really tasty", nsamples=500, batch_size=5)

我用 GPT-2 生成方法调整了以下参数来创建我的响应:

长度 =该设置合成审查的长度。

温度 =设定合成评论的创意程度。温度越高,综合评论越有创造性。

前缀 =前缀是新 GPT 协议模型将用于生成审查的提示

nsamples =设置特定运行将生成的审核数量。

图 3:GPT-2 生成的提示样本/来源:图片作者

生成 GPT-2 提示的艺术

表 1:GPT-2 即时援助工具样本/来源:作者图片

在生成综合评论时,我希望确保这些回答是在真实数据的基础上展开的,并且生成的回答是真实数据的有力代表。所以当我写前缀提示时,我使用了真实数据集中大量出现的单词。我编写了一个 Python 函数,将真正的数据集语料库组织成三元模型(3 个单词的连续组合)、二元模型(2 个单词的组合)和单词。该函数还提供计数,并对这些单词和组合的出现次数进行数字排序。

将合成数据与真实数据相结合

图 4: 合成数据与真实数据串联/来源:图片作者

在我创建了合成的正数据集和负数据集之后,我使用 Python Pandas 来连接真正的负数据集和正数据集。

性能试验

图 5: 基线模型测试/来源:图片作者

为了确保对性能指标进行公平和平等的分析,我使用 scikit-learn train_test_split 方法建立了一个由 198 个观察值组成的单一基础事实测试集,这些观察值来自 Yelp 开放数据集的一个完全独立的数据集。然后,我使用多项式朴素贝叶斯分类算法在两个数据集上建立了两个基线模型。这两个数据集是:真正的 Yelp 比萨饼评论数据集(450 个观察值)和组合的真正的和合成的 Yelp 评论数据集(11,380 个观察值)。

性能测试结果

表 2:基线模型性能指标/来源:作者图片

我选择 Precision、Accuracy、Recall 和 F1 作为三个基线模型的性能指标。总体而言,组合(合成和真实)模型在所有性能指标上都优于真实模型。例如,组合(合成和真实)模型中的精度从真实模型中的精度分数 0.8281 上升到 0.8913。

图 6: 基线模型混淆模型分析结果/来源:图片作者

我还进行了混淆矩阵分析。与合成的和真实的模型相比,真实的模型有更多的真实肯定,但更少的真实否定。与真实模型相比,合成和真实模型具有更多的假阳性,但更少的假阴性。

经验教训

更多的合成数据并不总是好的

正如您在我的测试中看到的,我添加了近 11,000 个合成数据观察来实现我的最佳性能模型。当我超过 11,000 次合成观察时,性能实际上下降了。因此,请务必找到合成数据与真实数据的最佳比例,以确保您拥有性能最佳的模型。

小心测试中的数据泄露

当我最初用 sklearn train_test_split 创建我的测试数据集时,我使用的是真正的数据集。我的组合模型(合成的和真实的)达到了 0.97 或更高的分数。然后,我发现这些模型是通过 GPT-2 模型根据测试数据无意中训练出来的。这是因为在应用 train_test_split 方法之前,GPT-2 模型可以访问整个数据集。为了解决这个问题,我回到 Yelp Pizza 评论数据集,建立了一个与我的训练数据集完全不相关的观察数据集。分数做了相应的调整,这个问题得到了解决。

试验 GPT-2 提示创建参数

新 GPT 协议生成方法允许您调整生成的综合评论。在我以前的一些建模工作中,我注意到,如果我将温度参数设置为小于 0.3,合成评论会过于接近真实数据。但是如果我用 0.9 或更高的版本,有时会太有创造性,这需要更多的监控。我还发现 150 字是我的综合评论的最佳长度。

结束语

总之,组合(合成和真实)模型在所有性能指标上都优于真实模型。该技术有可能允许组织和企业建立高性能的 NLP 分类模型,而没有与大规模数据获取相关的高成本。有机会在具有较大观察计数的数据集上探索这种技术。也有机会探索 GPT 新协议的提示设计,以更好地指导 GPT 新协议模式生成相关文本。这是一种令人兴奋的机器学习技术,我觉得值得进一步探索。

资源:

Yelp 打开数据集

T5【GPT-2】提示辅助工具

Github

来源:

  1. 希金波坦,S. (2020 年 6 月 29 日)。就机器学习而言,假数据是非常好的数据。检索于 2020 年 12 月 20 日,来自https://staceyoniot . com/fake-data-is-great-data-when-it-to-machine-learning/
  2. 阿拉斯加州拉德福德(2020 年 9 月 3 日)。更好的语言模型及其含义。检索于 2020 年 12 月 31 日,来自https://openai.com/blog/better-language-models/
  3. 斯威尼,E. (2019 年 03 月 06 日)。IAB: 78%的营销人员将在 2019 年增加数据支出。2020 年 12 月 31 日检索,来自https://www . marketing dive . com/news/iab-78-of-markets-will-spend-more-on-data-in-2019/549811/

神奇的变焦绿色屏幕

原文:https://towardsdatascience.com/the-magic-zoom-green-screen-a-harbinger-of-the-wave-of-change-2b5c1a57142?source=collection_archive---------34-----------------------

变革浪潮的先兆

现在是 2021 年,在没有绿色屏幕的情况下,现在可以很容易地在变焦通话中自动模糊我的背景。

这减少了分心——没有人能看到我凌乱的工作空间!它提高了平等性——消除了背景偏见——让我更容易关注我要见的人。

我在打电话。来自 zoom 的更多例子。

这是对我在地下室画的绿色屏风的巨大改进。即使这样,自定义照明(软盒)和更多,我记得它需要几个小时的 Adobe After Effects 工作才能得到一个单独的视频剪辑。⁰真讨厌!现在任何人都可以在我的手机上做了?哇!

这并非孤例。我可以对着手机说话,而且谷歌非常理解我。像我们的丰田 Rav4 或特斯拉这样的高级驾驶辅助系统可以轻松跟踪车道,等等。

这怎么可能呢?这一切的背后是什么?

你可能已经听说过机器学习——也称为人工智能——根据训练数据集自动创建计算机应用程序。

这是而不是唯一关于机器学习的。

是关于训练数据的。训练数据是机器学习之前(和之后)的数据。

什么是真正的训练数据?

其核心是训练数据是将人类理解编码到机器中的一种更简单的方法。结合机器学习,“复制”人类狭隘理解的成本趋近于零。

安德鲁·伍尔夫拍摄的照片

等等,拿着电话——你刚才是不是说“复制人类狭隘的理解几乎是免费的?”。

是的。

我会涵盖所有这些,但首先,让我们谈谈理解意味着什么。

我用“理解”这个词来区分可以写在书上的东西和迄今为止只能存在于人的头脑中的东西。

现在机器也能形成“理解”。这开启了以前不可能的用例。

狭义理解——劳动分工

这种技术在这里随处可见,并被广泛使用——这就是我为什么说“狭义”理解的原因。

请记住,这里的理解并不意味着人类水平的智力。计算机可以“理解”杂货店里的橙子是什么,足以自动结账。这并不意味着而不是计算机知道任何其他事情。这是一种狭隘的理解。

作为类比,考虑一下亚当·斯密的劳动分工——基本上是一样的——至少在生产力的意义上是这样。

有什么影响?

这在未来 50 年的影响将和计算机的影响一样巨大。我们正处在一个非常陡峭的斜坡的起点。

我用“理解”这个词来区分可以写在书上的东西和迄今为止只能存在于人的头脑中的东西。

以前不可能的用例变得可能

具体来说,能够以几乎零边际成本复制人类理解的影响是,以前不可能的用例变得可能。

例如,这是智能手机的自动癌症检测。以前只有去看皮肤科医生才能得到的东西。

“口袋里的皮肤科医生”的例子。来自公共领域论文。

绿屏免费背景移除,高级驾驶辅助功能,难以置信的体育分析,一个“口袋里的牙医”,不胜枚举。

作为一个思维实验:想象坐着看视频通话。你被要求实时绘制背景和前景的像素完美边界。听起来很难,对吧?

但是——我们可以把我们对“背景”的理解传递给一台机器,在更放松的环境下,它可以重复它。

这与先前基于规则驱动逻辑的自动化方法有着根本的不同。

稀缺资源将变得更加丰富

第二,以前稀缺的资源,如放射科医生的时间变得丰富,使曾经是奢侈的资源变得像查看社交媒体一样普遍。想象一下,任何一个拥有智能手机的人都能接触到世界上最好的医学专家。⁴

更一般地说,使用现有知识的频率可以提高几个数量级。尽管实时无绿屏背景消除无论如何都是不可能的,但许多人还是做了医学成像。但是现在,现有知识的频率增加了几个数量级。这不只是针对任何一个领域,而是完全跨领域的。

照片由白俊仁拍摄

频率增加的二阶效应

考虑对金门大桥进行人工全面目视检查可能一年或十年才发生一次。很快,每隔几秒钟就能进行一次类似级别的分析。获得这种级别的数据将会解开二阶效应,例如跟踪衰变率,天气事件如何影响它,等等。

训练数据的有影响力的新用例的列表正在快速增长。人类监督的训练数据是将不可能变为可能的方法。

机器学习方面有自己的挑战,但在某种意义上,它的主要目标只是准确反映类似情况下的训练数据。

换句话说,控制,真正的人类监督是训练数据,机器学习是重复。

有什么好处?

训练数据不是万能的。我在这里提到的一些用例需要几年才能实现。

现在,假设您有一个用例,它是训练数据的一个很好的候选对象——这几乎是任何涉及专家或领域特定知识的东西——进行初始构建有一些成本,还有维护成本。

最大的问题是最初和持续的人工监督,也称为数据注释或数据标签。

像收集、发送和接收数据这样的管理问题。一直到哲学上的关注,比如模式(本体论)应该是什么。然后是任务管理,实际上让专家将他们的知识转移到注释工具中,如 Diffgram。

随着时间的推移,总会需要某种程度的人类监督——因为如果有人真的解决了这个问题,他们基本上已经发明了人工通用智能(甚至可能是超级智能)。

也就是说有很多趋势,比如机器学习的改进,每次使用成本的降低,自动化比如用户脚本等等。指出从数据集到数据越来越少的工作系统变得越来越容易。

更多关于 Userscript 数据注释自动化的信息。

我们的开源注释和数据科学项目 Diffgram 是我们漫长旅程的第一步。我们正在积极推进和发展这一领域。让这项技术更容易使用。

例如,新的导入向导使任何可以填写表单的人都可以完成以前“仅软件工程师”的步骤,即将现有的机器学习应用程序连接到 Diffgram,以进行进一步的人工监督。

教育和在职培训的仪式和时间一样古老。然而,我们很少有关于训练机器的仪式。这就是我们 Diffgram 公司围绕训练机器这一新仪式制造产品的地方。人类管理机器,教会机器理解世界。

安东尼

附录

本文包含前瞻性陈述和观点。

⁰指出,专业级绿屏包括与视频通话不同的概念(如颜色匹配、方向、质量等)。).随着时间的推移,我怀疑这种专业水平的东西将以类似的方式自动化。

从技术上讲,这是“更高维度的空间”,在这个空间中,我们无法合理地用视觉来表现。许多机器学习模型具有数百个维度,而我们只能合理地绘制 4(空间(x,y,z)和时间(t))。

高维空间==理解吗?我的观点是,这是我们目前能做到的最接近的了。什么是理解,如果不是我们不能在四维空间中表现的东西?

机器学习的许多部分非常困难。这并不是要带走那里的任何东西。简单地说,随着方法的改进,培训和验证的许多方面变得更加标准化和自动化,控制将转移到许多领域的主题专家身上。就像“编程”和“计算机用户”的定义随着时间的推移而改变一样。

作为反驳,像这样的论文对一些“手机检测皮肤癌”的样本量持怀疑态度。虽然其中一些确实非常新,并且有许多困难要克服,但同样清楚的是,基础技术是存在的,正在进入有用的应用程序,并且有许多趋势可能会汇聚到克服问题和障碍上。最近的福布斯走过的路

艾蛇油的制作

原文:https://towardsdatascience.com/the-making-of-ai-snake-oil-8c75f4f7a710?source=collection_archive---------12-----------------------

办公时间

角落办公室是如何助长炒作机器的——以及我们能做些什么

图片由 Unsplash 上的 @kellysikkema 提供

在曼哈顿的一家智库,一家日渐衰老的科技公司的首席执行官站在由银行家、外交官和投资者组成的精英观众面前,宣布:“我希望你们把数据视为下一个自然资源。”这就像油和蒸汽,但“唯一的限制是你自己。”

这是在 2013 年,数据的比喻是新的石油已经开始显示其年龄。从英国企业家克莱夫·亨比(Clive Humby)在 2006 年创造的这个词,到各种各样的营销人员和分析师对它的热情接受,管理咨询公司毕马威(KPMG)或许最能捕捉到这种令人窒息的炒作:“数据是新的石油——价格正在上涨。”

弥漫在董事会会议室的人工智能狂热,从首席执行官到步兵,是一个更大的炒作周期的一部分。大众的想象。

到 2020 年,我们将拥有让数百万人失业的无人驾驶汽车,模拟人类智能的计算硬件,以及逆向工程大脑的软件模型。这些不起眼的里程碑仅仅是迈向奇点的一个小站,奇点是人工智能获得意识并远远超过人类智能的神圣点。

在科幻巨作《T4》中,一位拥有埃隆·马斯克夸张天赋的亿万富翁沉思道:

“总有一天,人工智能会像我们看待非洲平原上的骨骼化石一样看待我们。一只直立猿猴,生活在尘土中,语言粗糙,工具简陋,注定要灭绝。”

这种超现实的未来,迫在眉睫且不可避免,超越了流行文化。没多久就到了会议室,更适合薪酬委员会和销售业务的高管们突然想“认知一切”。艾蛇油是治疗这种疾病的完美药膏。

起源故事

支撑现代人工智能的数学可以追溯到不起眼的米。对,没错——单位。公制诞生于法国大革命之后,因此人们可以免受当地贵族随意改变的任意测量。但是一米的长度应该是多少呢?法国人认为它是从北极到赤道距离的千万分之一。

然而,有一个小问题。如何去测量它呢?

这正是 Adrien-Marrie Legendre 在发现一些奇怪的东西时试图解决的问题。你可以通过许多方程来描述这个世界,但是这些方程并不总是与真实的观察相匹配。这在当时是众所周知的事实。勒让德的见解是,从数据开始,通过最小化误差的平方,从数据中推导出一个方程,会更优雅。这一突破——我们称之为人工智能的预测机器的数学先驱——被归入他 1806 年的书《确定彗星轨道的新方法》的附录中。

让我们在这里暂停一下。大多数商业人工智能的数学已经存在了 200 年,如果你包括托马斯·贝叶斯在条件概率方面的工作,时间会更长。为什么会突然有这种困扰?

为了理解这一点,我们需要快进几个世纪。

人工智能一词是 1955 年由达特茅斯学院的一个研讨会创造的。与会者中有马文·明斯基,他是图灵奖的未来获得者,该奖通常被称为计算领域的诺贝尔奖。明斯基提倡自上而下的人工智能方法,其中专业知识被编码为符号规则。如果一个人能够编写足够多的规则,智能就会出现。这种方法后来被称为符号人工智能。

康奈尔航空实验室正在形成一种与之竞争的方法。由研究心理学家弗兰克·罗森布拉特领导,这种方法是基于神经元在大脑中的相互作用。罗森布拉特称他的模型为感知器。1958 年,他在 IBM 704 上证明了它的可行性,这是一台 5 吨重的计算机,大小相当于一个房间。

感知机让公众着迷,纽约客称其为“新的电子大脑”和“能够思考”的机器

明斯基不以为然。他在 60 年代的大部分时间里都在与罗森布拉特辩论,并在 1969 年出版了一本充满定理的书,认为感知机的效用非常有限。他的批评一直存在,并逐渐扼杀了对人工神经网络这一新兴领域的研究资助。人工智能的冬天开始了。

随着计算能力的提高,2000 年代的严寒开始融化。

2012 年,多伦多大学的 Geoffrey Hinton 教授领导了一个团队,该团队应用神经网络对图像进行分类,准确率在人类水平的 10%以内。大约在同一时间,IBM 的沃森在《危险边缘》中击败了人类冠军。几年后,谷歌开始翻译欧内斯特·海明威的文章。

突破是真实的。这被称为深度学习。

炒作机器

“它们就像蟑螂,”拉尔夫·维德曼说,他在一家相当大的上市公司经营技术。如果高管们有一种精神动物,拉尔夫的将是夜猫子:有先见之明且尖刻。拉尔夫来自更早的时代。在这个时代,领导者擅长的不仅仅是喧嚣及其相关的伪装和管理。

我要和拉尔夫在纽约市中心一家意大利餐馆吃饭。他在抱怨接管董事会的管理顾问。在他们的影响下,公司引进了一名高管,通过人工智能和物联网解锁数十亿美元。有些幻灯片描述了在两个财政季度内实现前一亿美元的价值之路。如果是在董事会层面的演示上,那么一定是对的。

企业家和 Next 人工智能校友 Farrukh Jadoon 呼应了拉尔夫对董事会和他们追逐短期回报的高管圈子自上而下的人工智能授权的怀疑态度。Farrukh 将公司分为两类:需要人工智能来解决以前无法解决的问题的公司和需要人工智能的公司,因为他们的董事会(通常由战略顾问鼓动)已经向他们提出了要求。第一类是开创性的公司,如 Recursion Pharma,将深度学习应用于药物发现。后者包括大部分北美公司。

人工智能已经成为大生意。

根据市场情报提供商 CB Insights 的数据,人工智能的风险投资从 2013 年的 5.59 亿美元增加到 2019 年的 260 亿美元。这在 6 年内增加了 50 倍。艾仙粉成了一种有价值的商品,而且供应充足。稍加点缀,你就能让来自世界各地的投资者手里拿着支票簿排队。

要了解精灵尘的真实例子,只需看看 Engineer.ai。

这家初创企业成立于 2016 年,旨在通过创建一条“人工智能驱动的装配线”,让定制软件开发变得“毫不费力”,从投资者那里筹集了 2950 万美元,投资者包括孙正义的软银(SoftBank)。虽然大多数公司的目标是为人工智能辅助人类工作开发技术,但 Engineer.ai 的魔力在于颠倒逻辑。他们的平台是开创人工智能时代。AI 现在几乎有了一种代理的感觉,仅仅在人类的帮助下构建软件。

然而,在这个精心制作的纱线中有一个小小的褶皱。没有人工智能。他们接手的软件项目完全是由印度的外包开发者构建的。

假装直到你成功。直到你做不到。

当企业高管和营销人员想到人工智能时,他们通常会看到一台提款机。数据输入。钱出来了。不幸的是,科学不遵守财政季度。

酒肉朋友

AI 炒作机器的阴影中还潜伏着另一个难以忽视的事实:深度神经网络投下的长长的物质阴影。

就像你在 Instagram 上的无限滚动,连接到一个远程集群有一种缥缈的品质。感觉失重,干净。直到,也就是说,你看着庞大、肮脏的供应链被遮住了视线。这并不是说灰尘、污垢和有毒气体不存在。只是排气扇在别的地方。

在 2019 年的一篇论文中,麻省大学的研究人员量化了训练复杂的深度学习系统进行自然语言处理的碳排放。结果令人担忧。训练一个复杂的神经网络在它的生命周期中可以排放 5 倍于典型汽车的二氧化碳。让它深入人心。所有的钢铁和铝来制造。所有这些气体,闲置和多年使用后耗尽。使五倍可视化的环境成本训练一个单一的国家最先进的模型。

事实上,根据麻省理工学院计算机科学与人工智能实验室的尼尔·汤姆森的研究,要提高精确度,需要投入大量的计算。深度学习对计算能力的渴望远远超过了硬件性能的进步,特别是考虑到“摩尔定律最后一丝痕迹的微弱进步”。

是的,正在进行的研究从可能指数级增加计算能力的新范式到使训练和预测更有效的深度学习算法。然而,这些努力要取得成果还需要时间。与此同时,根据政府间气候变化专门委员会的说法,我们只有九年的时间来减少 45%的碳排放,以保持地球的可居住性。我们的计算基础设施的物质阴影,其中机器学习是一个越来越大的组成部分,不能再被忽视。

寻找你的声音

"我觉得自己完全被困住了,成了自己身体里的囚犯。"

这是来自伦敦的电影制作人乔·莫里斯的话。在他舌头上的一个痛处无法愈合后,乔决定去看医生。他 31 岁,不吸烟。这应该没什么,但是核磁共振显示了一个需要切除的肿瘤,同时也影响了乔的说话能力。

在《T2 卫报》的一篇文章中,乔丹·基斯纳讲述了乔的故事,以及波士顿的初创公司 VocalID 如何帮助像他这样的人保留他们的声音。VocalID 由东北大学的语言病理学家兼研究员鲁帕尔·帕特尔(Rupal Patel)创建,使用机器学习来合成每个人独特的声音。

我们的声音是我们不可或缺的一部分。我们用它来定位、歌唱、对抗和安慰。这是我们身份的印记。即使是最简短的片段也是我们气质、出身甚至阶级的窗口。这就是为什么一个人失去声音是一种不安,一种立刻就变得悲惨和无形的残疾。有了 VocalID,那些被剥夺了发言权的人现在可以找到自己的声音了。

这是人工智能的真正奇迹:赋予无声者声音的潜力,给盲人带来视觉,给瘫痪者带来行动能力。

就在这里,隐藏在众目睽睽之下的,是艾蛇油解药的线索。

普林斯顿大学教授 Arvid Narayanan 在他的演讲“如何识别人工智能蛇油”中介绍了一个案例,其中一个简单的线性回归和几个容易理解的变量几乎和具有数千个特征的高级机器学习算法一样准确。这项技术已经存在了一百多年,几乎和人工智能领域的最新技术一样出色。

那么,也许人工智能蛇油的无聊解药是爱上问题——而不是解决方案。虽然深度学习可能是预测糖尿病是否会导致失明的最佳模型,但它可能不是预测犯罪累犯或过滤简历的正确解决方案。

爱上这个问题让我们能够以开放的心态探索,而不会被宣传机器或角落办公室空洞的管理咒语所阻碍。这项工作变得自下而上和科学驱动。这需要耐心和毅力。它是以有意义的结果来衡量的,而不是季度财务指标。

从这种世俗的坚韧,这种不懈的努力来构建意义,出现了非凡的。

承认

法里德,谢谢你用编辑的眼光来评论这篇文章。Maryam、Aaron、Ali & Mehryar,感谢你们深刻的反馈。

注释和参考

在写这篇文章的时候,我求助于最权威的人类经验来源。

“嘿 Siri,你有自知之明吗?”

“我想我是,因此,我可能是。”

女士们先生们,这是纯粹的智慧。

现在,我们来看看更具体的参考资料:

起源故事

正如许多科学突破一样,有着高度的戏剧性。德国数学家卡尔·弗里德里希·高斯声称这一发现具有优先权,随后引发了一场智力论战,其松散的提法是“…在我祖先的骨灰上撒尿。“关于‘敏感的学者’的刻板印象似乎由来已久。

  • 法国大革命如何创造公制,国家地理
  • 最小二乘法:阿德里安-玛丽勒让德,鲍勃罗森菲尔德,佛蒙特州数学倡议。

酒肉朋友

  • NLP 中深度学习的能源和政策考虑,Emma Strubell 等人,马萨诸塞大学阿姆赫斯特分校。
  • 深度学习的计算极限,Neil C. Thompson 等人,麻省理工学院。
  • 全球变暖 1.5 摄氏度的特别报告,政府间气候变化专门委员会。
  • 2020 年梅西讲座“重置:为公民社会回收互联网”,罗纳德·迪伯特。

炒作机器

  • 拉尔夫·威德曼不是这位高管的真名。
  • 人工智能创业热潮引发了对夸大科技知识的质疑,,【华尔街日报】

寻找你的声音

  • 新技术如何改变不会说话的人的生活,乔丹·基斯纳,《卫报》。
  • 如何识别 AI 蛇油,Arvid Narayanan,普林斯顿副教授。

本文所表达的观点仅是我个人的观点。

人工智能说书人的制作

原文:https://towardsdatascience.com/the-making-of-an-ai-storyteller-c3b8d5a983f5?source=collection_archive---------8-----------------------

实践教程

如何在 Google AI 平台上为故事生成准备数据和微调 T5 模型

照片由弗雷迪婚姻在 Unsplash

你还记得上一次学习一门新语言是什么时候吗?你有一长串的单词需要记忆,有时你并没有完全理解这些单词是如何使用的。你想读书,但大多数书都超出了你的水平,课本让你昏昏欲睡。

现在,想象一下,你有一个工具,可以在你的水平上制作无限数量的例句,甚至一口大小的故事。你玩不同的单词组合,学习它们是如何相互作用的。这些故事读起来也很有趣!

这是我对人工智能故事生成如何帮助语言学习者的看法。

在过去的几周里,我一直在做一个概念验证项目,从给定的单词列表中造出句子和故事。下面的屏幕记录显示了它的样子,使用实际训练的模型:

使用基于 T5 的微调模型,根据单词列表制作故事的演示

这个项目是受报纸的启发

  • 计划和写作:实现更好的自动讲故事
  • 利用统一的文本到文本转换器探索迁移学习的局限性

在本文的剩余部分,我将分享我为这个 POC 项目准备深度学习模型的经验。我将谈论模型训练的高级方法和一些技术方面,这是未来迭代的基础。我将特别介绍:

  • 方法论
  • 如何准备培训数据
  • 如何使用拥抱脸的变形金刚库和谷歌人工智能平台微调一个预先训练好的 T5 模型
  • 如何在一个(免费的)Google Colab 笔记本上监控进度
  • 一旦有了模型,如何生成文本
  • 由人(我)进行的模型评估🙋‍♂️)

剧透:像拥抱脸的变形金刚这样的库已经变得如此成熟和方便,以至于你甚至不需要知道 PyTorch 或 Tensorflow 或任何深度学习理论,就可以训练和使用最先进的深度学习模型,如 GPT,T5,BERT 等。相反,最耗时和最容易出错的步骤是正确设置培训管道。

继续读下去,这并不像预期的那么容易

如果你想了解更多关于谷歌人工智能平台、深度学习语言模型或人工智能故事生成的信息,你可能会在文章末尾找到一些额外的资源。

免责声明:我不隶属于谷歌。我正在探索谷歌的云服务,因为我在工作中主要使用 AWS,所以尝试其他平台进行辅助项目似乎很有趣。

方法学

我们的任务是制作一个模型:

**Me:** Hi Model, tell me a story about "Friday evening". The story must contain the words "Tom" and "dinner".**Model:** Tom was walking to his favourite restaurant on a Friday evening. He would have dinner with his family. When he arrived he found the door was closed.

我们可以将此表述为文本到文本的转换问题,其中输入源包含标题和所需的单词:

"<title> Friday evening <words> Tom, dinner"

输出目标是故事:

"<story> Tom was walking... was closed."

为了实现这一点,我们可能会创建和训练我们自己的深度学习模型架构,就像在的规划和撰写论文中那样。虽然这很有趣,并可能实现最佳性能,但对于 POC 项目来说,这需要太多的工作和成本(GPU 的使用)。

或者,我们可以微调一个预先训练好的最先进的语言模型,如变形金刚或 GPT-2 。在拥抱脸的网站上,有数以千计的预先训练好的模特,有英语的也有非英语的。如果我们选择这条路径,我们将故事标题和要使用的单词作为写作提示,模型将继续完成故事。

顺便说一下,如果你对通用文本生成器会产生什么感到好奇,你可以试试这个和这个。

在这个项目中,我选择了谷歌的 T5 型号,它是为任何文本到文本的转换任务而设计的。

https://ai . Google blog . com/2020/02/exploring-transfer-learning-with-t5 . html

无论如何,如果在这个概念验证项目中,Transformer、GPT-2 或 T5 之间在输出质量方面存在巨大差异,我会感到惊讶。数据集和解码方法的选择在这里可能会发挥更大的作用。

数据准备

在线词典、语言学习网站和儿童书籍可能是这项工作的理想来源:句子和故事将是最相关和最准确的语言学习。缺点是实现爬虫的额外工作和潜在的版权问题。

因此,在这个项目中,我使用了故事完形填空和 ROCStories 语料库来训练模型。这个数据集由 98,159 个五句话的故事组成:

ROCStories 数据集示例。来源:https://cs.rochester.edu/nlp/rocstories/

我选择这个数据集是因为它很小,故事也很有趣。请记住,我们的目标是为语言学习者制作一个故事生成器来掌握词汇和基本语法结构。像这样的小故事听起来很完美。

但是等等。

我们只有故事,我们希望我们训练过的模型能产生故事。培训的输入(提示)在哪里?

Miguel A. Amutio 在 Unsplash 上拍摄的照片

幸运的是,我们可以使用另外两种 NLP 技术:自动文本摘要和关键词提取。这个想法是,

  1. 我们从原文中提取一个摘要或几个关键短语。
  2. 在训练期间,模型学习扩展摘要或关键短语以恢复原始文本。

正如计划和撰写论文的作者所提议的,为了准备训练数据集,从故事的每个句子中提取一个单词;输入提示将是故事标题和五个单词(作者称之为故事情节)。例如,这个故事:

**Pizzeria**My friend and I walked into the **pizza** store.
The server greeted us and offered **specials** to choose from.
We decided to order a large pizza with **coke**.
After a few minutes, the server placed the **food** on the table.
We slowly **ate** it.

会有输入提示:

Storyline: pizza -> special -> coke -> food -> eat
Title: Pizzeria

以下是训练数据集的示例:

训练数据集(示例)

我使用 T5 的特殊标记<extra_id_0><extra_id_1>作为分隔符,但这不是严格要求的。

RAKE 和 TextRank 等算法常用于从文章中提取关键词。然而,由于我们的故事很短,这些依赖于词频和共现的算法经常给大多数单词分配相同的分数。例如,在上面的比萨饼店故事中,RAKE 为所有这些单词返回 score=1:

walked, table, order, minutes, friend, food, decided, coke, choose

因此,为了从故事中提取关键词(故事线),我使用库 KeyBERT ,它利用 BERT 嵌入来评估每个单词的重要性。这里我们可以看到所有的单词都有不同的分数:

('pizza', 0.6226), ('coke', 0.3874), ('food', 0.332),
('ate', 0.3044), ('decided', 0.2379), ('specials', 0.236),
('store', 0.2174), ('order', 0.2131), ('greeted', 0.212),
('friend', 0.1753), ('walked', 0.1696), ('minutes', 0.166), ('table', 0.1624), ('offered', 0.1551), ('large', 0.1443),
('server', 0.1185), ('choose', 0.1057), ('placed', 0.0816),
('slowly', 0.0454)

当然,这并不一定意味着分数更正确或者提取的顶部单词更适合训练我们的故事生成模型。也许如果我们在训练中随机选择单词,我们会有一个更好的模型?但至少现在,我不需要担心关系破裂。😅

不管怎样,下面是 Python 的源代码:

请注意,故事情节中的单词是词汇化的(例如,“游泳”变成了“游泳”)。这可能会给模型更多的自由来决定故事发生的时间。用户可以使用“昨天”或“明天”这样的词来控制时间。

模特培训

一旦我们准备好数据集,我们就可以训练我们的模型。您可以在这里查看我的 Python 脚本和其他相关的设置文件:

https://github.com/kenilc/finetune4textgen

剧本很直白;它本质上是用于训练和参数解析的拥抱脸函数的包装器,以及一些下载和上传数据文件和模型检查点的辅助函数。

当你决定在谷歌人工智能平台上训练你的模型时,乐趣就开始了。

当然,不可能在一个中帖里提供一步一步使用平台的指南。我要分享的是在我为我的故事生成模型建立培训工作的过程中遇到的阻碍。如果你对这个平台完全陌生,我强烈建议你遵循 Google 的官方快速入门指南,理解标准的项目结构和命令是如何工作的。

https://github.com/GoogleCloudPlatform/ai-platform-samples/tree/master/quickstart

在 Unsplash 上由micha Mancewicz拍摄的照片

墨菲定律

这是我第一次在人工智能平台上训练模型。当我在谷歌托管的 Jupyter 笔记本电脑上进行本地测试时,它开始得很好,但是当我转移到 GPU 时,这里那里都有障碍。

以下是一些可能出错的事情:

  • 错误的存储桶权限。您需要为 ML 引擎设置一个服务帐户,并授予它读写您的 GCS bucket 的权限。bucket 将存储临时包,以及日志和您的模型检查点。
  • 无法安装必要的软件包。我用setup.up尝试了默认的打包方式,但是库pyarrowdatasets有错误。经过多次尝试,我用一个定制的 docker 容器解决了这个问题(见下文)。

如果你知道如何解决这个问题,请留下评论。

  • 即使作业在本地或 CPU 实例上运行良好,当您在 GPU 上运行它时,它仍然可能会失败。
  • 并非所有 GPU 在所有地区都可用。查看 GPU 区域和分区的可用性。
  • 一些地区的 GPU 资源比其他地区少。您可能会得到一个超时错误,说明当前没有可用的资源。
  • 在训练期间,所有文件都存储在本地,除非它们被显式上传到 GCS bucket(或其他地方)。永远不要忘记这一点。
  • 根据 docker 容器的创建方式,每当您更改训练脚本时,您可能需要创建一个新的映像。一个更好的解决方案是创建一个包含所有包依赖项的 docker 映像,然后使用setup.py打包您的源代码。

Dockerfile 文件

设置很简单,除了我需要在 docker 容器中使用一个虚拟 Python 环境来避免一些警告。

同样,这可以通过仅将包依赖关系编译到 docker 映像中并使用setup.py打包训练脚本来优化。

使用定制 docker 容器的一个优点是,包安装错误会在编译时被发现。

Docker 映像构建脚本

在使用之前,我们需要将自定义 docker 图像推送到 Google 容器注册表。为了减少成本,不要忘记从注册表中删除不再需要的图像。

作业提交脚本

没有比在 GPU 上花费数小时,却发现我们忘记保存模型文件更令人沮丧的了。所以永远记得正确上传模型检查点和日志定期到 GCS 桶。每个文件,包括日志和输出目录,只存在于容器中,并且必须明确上传到远程作业目录中进行永久存储。

在我的脚本中,我用抱抱脸的训练器回调类实现了常规上传(点击查看源代码)。

为了用 TensorBoard 监控训练进度,我们需要添加参数--report_to tensorboard。TensorBoard 格式的登录由 Hugging Face 的 TensorBoardCallback 类处理。它对 Tensorflow 和 PyTorch 都有效。

实现所有这些命令行参数似乎很乏味。幸运的是,拥抱脸为此专门提供了两个类: TrainingArguments 和 HfArgumentParser 。更好的是,参数解析器是通用的,您可以将它用于任何需要命令行界面的 Python 程序。

**https://python.plainenglish.io/how-to-automatically-generate-command-line-interface-for-python-programs-e9fd9b6a99ca

最后的步骤

经过所有的努力,我们终于可以开始工作了!💪

# Step 1: Upload data to Google Cloud Storage
> gsutil cp -r ./data gs://storygen-bucket# Step 2: Build docker image and push to Google Container Registry
> ./build.sh# Step 3: Start the training process
> ./run.sh

作业监控

系统利用

用一个有几个训练步骤的作业来测试运行,并检查计算和内存利用率,这总是一个好主意。例如,您可以通过增加批处理大小来加速训练,直到 GPU 的内存得到充分利用。

在作业详细信息选项卡上检查 GPU 利用率

模型训练进度

我们可能会启动一个免费的 Google Colab 笔记本来监控培训进度。关于单元格 1、2 和 3 的进一步解释,请参见如何从 Colab 笔记本的 Google 云存储中访问文件。TensorBoard 会自动下载日志文件,但我们仍然需要刷新以获得最新结果。

# Cell 1
from google.colab import auth
auth.authenticate_user()# Cell 2
!curl https://sdk.cloud.google.com | bash# Cell 3
!gcloud init# Cell 4
%reload_ext tensorboard
%tensorboard --logdir gs://bucket_name/job_dir/logs

在 Colab 笔记本上运行 TensorBoard 以监控训练进度

使用训练模型的文本生成

多么漫长的旅程啊!

最终模型检查点

给定一个经过训练的模型,我们仍然需要实验并决定如何使用它来生成文本。这就是所谓的解码,不同的解码方法和参数产生的结果大相径庭。

https://huggingface.co/blog/how-to-generate

这是文本生成的函数。**kwargs包含所有可选参数,如温度、top-p、是否进行采样或光束搜索等。默认是贪婪解码:概率最高的单词一个一个输出。当语句结束标记或最大。已达到长度。

模型评估

文本生成模型和系统的评估是困难的,仍然是一个开放的研究问题。已经提出了度量标准,但是人类的判断仍然被广泛使用并被认为是黄金标准。有趣的是,最近有一篇论文指出,即使是人类的评价也经常是不一致和矛盾的。🤦🏼‍♂️

我将在未来发布其他配方、模型及其评估的更新。同时,以下是一些生成的故事(标题和故事情节作为输入):

Title: Joey's First Snowman
Storyline: snow, snowman, snowball, smile, JoeyJoey was excited to get his first snowman.
He decided to make a **snowman** for his birthday.
He sat down and watched the **snowballs**.
He **smiled** and screamed.
**Joey's** first snow man was a great day.* * *Title: Back in Class
Storyline: Lucy, basement, teacher, hour, laugh**Lucy** was back in class.
She was in the **basement**.
The **teacher** was a bit nervous.
Lucy had to wait for **hours**.
She **laughed** and sat down to watch the show.* * *Title: The Rock
Storyline: yard, stone, heavy, chisel, rockI was walking in my **yard**.
I saw a large **stone**.
It was too **heavy**.
I **chiseled** it.
I realized that the **rock** was too big.* * *Title: Playing video games
Storyline: Calvin, play, hard, start, beat**Calvin** was playing video games.
He wanted to **play** it.
He tried very **hard**.
He **started** playing it.
Eventually, he **beat** himself.* * *Title: Chicken Nuggets
Storyline: Lily, chicken, fry, cool, delicious**Lily** was cooking dinner.
She decided to make **chicken** nuggets.
She **fried** them in the oven.
When she **cooled** it, it was a good idea.
It was **delicious**!

你怎么想呢?

额外资源

我希望你喜欢这篇文章。以下是我发现对这个项目有用的一些文档、博客文章或论文。如果你也在做一些故事生成项目,请留下评论,分享你的作品。或者如果你对使用文本生成进行语言学习有任何想法,也请分享你的想法。😀

在谷歌人工智能平台上

  1. GPU 定价
  2. GPU 区域和分区可用性
  3. 在 AI 平台上使用容器培训
  4. 【PyTorch 入门
  5. 培训概述
  6. 如何在 Colab 笔记本上访问谷歌云存储中的文件
  7. 在 GCP AI 平台上训练 PyTorch 变形金刚

论故事与开放式文本生成

  1. 人工智能故事生成简介
  2. 计划和写作:实现更好的自动讲故事
  3. 可控神经文本生成
  4. 如何生成文本:使用不同的解码方法通过变形金刚生成语言
  5. 文本生成评估:一项调查
  6. 人不一定是金子:评估人对生成文本的评估

在数据集上

  1. Story 完形填空和 ROCStories 语料库
  2. 机器学习关键数据集 BookCorpus 的肮脏秘密

深度学习语言模型研究

  1. 用统一的文本到文本转换器探索迁移学习的极限
  2. 图示变压器
  3. 图文并茂的 GPT-2(可视化变压器语言模型)

关键词抽取研究

  1. 使用 BERT 进行最小关键词提取
  2. 自然语言处理中 10 种流行的关键词提取算法**

“数据协调”的许多奇妙意义

原文:https://towardsdatascience.com/the-many-marvelous-meanings-of-data-harmonization-a07473feb93?source=collection_archive---------15-----------------------

我的行业最喜欢的新流行语——调和!—可以描述数据系统的许多不同的、令人向往的属性。这个新的神奇术语意味着什么,对谁来说呢?

由丹尼尔·肖斯塔克在 Unsplash 上拍摄的照片

答从数据工程、数据应用、数据科学和数据分析,到我的公司关注的垂直行业——医疗保健和生命科学——有大量的首字母缩写词、行话术语和流行语。

这些代码短语通常对以下情况非常有用:

  • 命名事物—例如 SQL 。
  • 说话或打字时节省时间—例如 公平数据
  • 通过抽象来描述复杂性——例如抽象工厂模式
  • 明确区分相似的、复杂的事物——例如ELTvsETL
  • 将人们分为内部群体和外部群体——也就是说,如果你理解这个术语,你就是这个俱乐部的一部分——例如 KISS
  • 使用一个流行的术语参与对话,例如见解——即使你不能准确解释见解到底是什么或者它们是如何产生的。
  • 好吧,最后一个有点卑鄙……但是每个人都知道至少有一个典型的商人依赖于流行词汇,却不理解它们,对吗?如果你足够油嘴滑舌,这是一个有用的策略。

不幸的是,使用这些术语和缩略词会疏远和迷惑那些不是你行话俱乐部成员的人。它会阻碍多学科团队之间的合作。当然,这些术语可能会被荒谬地过度使用——https://en.wikipedia.org/wiki/Buzzword_bingo**流行语,有人知道吗?**

社区之间也存在许多术语的含义冲突。最近一些对话的例子:

  • EMR… 你说的是电子病历,还是弹性图缩小?
  • 变量…编程含义还是数学/统计含义?
  • 规范化数据… 跨数据源的关联实体,或者数值/连续数据的变换分布?
  • Spark… 一个分布式数据/计算引擎,还是旧金山的大麻经销商?

还有一种情况是,多个社区对潜在的同一事物有自己的术语,例如:

  • 坐标尺寸(数学)**
  • 功能(机器学习)
  • 变量协变(统计)**
  • 字段属性(数据建模)**
  • (MS Excel)

综上所述——语言很重要——尤其是对于多学科团队。

我提名的 2021 年年度流行语——“协调数据”

这是一个强有力的词——试一试吧!对于一个组织中的不同角色来说,这也意味着完全不同的、同样棒的事情。在下一节中,我将列出想到的数据协调的各个方面。

Annelieke Bosdijk 在 Unsplash 上拍摄的照片

F 或者某些人——比如上面提到的刻板的商人——调和本质上相当于当年曾经的流行语:协同流线。但是让我们忽略这种令人瞠目结舌的情况,讨论一下协调意味着更具体、更有用的东西的无数情况。

在我开始列举之前,重要的是要注意到协调既适用于动词也适用于名词。动作可以在过程中协调,就像事情可以在形式协调一样。

同样值得思考的是,为什么协调正以如此快的速度进入白话文。我有三个理论:

  1. 由于英国退出欧盟,围绕欧盟的协调贸易法有了重大的讨论,人们已经意识到协调是一个很酷很有用的词。
  2. 大数据的 36 个 v 中的一些给公司内部的 IT/基础架构/软件团队制造了困难,即数据多样性、数据质量和数据治理
  3. 围绕数据,尤其是与云相关的技术,出现了大规模的重组。因此,新的、多样的、颠覆性的技术大量涌现,这开始让人们对数据感到头疼。

O k,事不宜迟,让我们深吸一口气,喝一口咖啡,调和一切

嗯,再多一个 ado……这个单子是有顺序的,但是不认真。如果你强烈倾向于将 Y 项放在 X 项之前——也许你坚持在餐馆点 BTL 而不是 BLT没关系, 我完全同意你的观点

1 —原始数据收集/生成的协调

关心数据质量的人— 这是我们所有人,对吗? —知道质量问题最容易在收集/生成阶段解决。但这并不总是在我们的控制之下。届时,我们将努力使协调——即标准化——数据收集流程/技术、质量保证流程以及模式/存储格式。

从数据治理的角度来看,我们努力协调记录数据捐赠者的同意。

2 —原始数据存储的协调

原始数据量可能非常大。例如,一个人的原始的、测序的全基因组范围为万亿字节的数据。然后将它与同一患者的 MRI 图像、数字传感器数据和完整病史结合起来,再乘以数百万患者群体。大量复杂的数据。

在这个阶段,我们努力协调原始数据的模式/存储格式/位置以及用于存储和安全的技术。治理和数据授权必须协调以符合法规和道德义务(如 HIPAA/GDPR)。

注意——我并不是建议不同类型的原始数据需要协调在一起。在这个阶段,最好将苹果(例如 DNA 序列)和橙子(例如医疗记录)分开,并将 和它们自己协调起来——尽管有协调的链接(例如病人 id)用于以后将数据连接在一起。

3 —数据处理的协调

原始数据几乎总是需要处理才能有用,数据处理基础设施可能会变得复杂。例如,DNA 测序数据的处理方式与数字传感器数据或自由文本医生笔记截然不同。

尽管如此,对于每种数据类型,我们可以努力将数据处理管道协调成一致的代码库、编程框架和编排/质量保证系统,例如 Apache Airflow 、 Galaxy 。

也许更重要的是,数据处理可以相对于https://en.wikipedia.org/wiki/Provenance#Computer_science协调——即精确、可复制地记录数据发生了什么以及何时发生的。**

4 —处理数据存储的协调

这大约是从数据中获取价值的中间点,也是组织中多个应用程序/利益相关者开始重复使用结构良好的数据的点,因此协调变得格外重要。

良好协调的数据使软件应用程序能够以更低的成本更快地开发,维护成本更低,并且更有效地扩展。

在这个阶段,我们努力协调处理过的数据存储模式、格式、技术和位置。治理/授权/去识别系统也应协调,以确保从存储中提取数据时的安全性和合规性。

5 —数据集成的协调

现在,数据存储的协调并不一定要求整个组织中的每一个不同的数据集都需要存储在完全相同的单一系统中,如数据湖,这通常很难设计、扩展和利用。然而,存储在不同位置、模式和技术的不同数据源仍然可以通过标准化的 API 和服务进行协调

这提供了一个“拥有并吃掉蛋糕”的场景,其中分散的数据产品可以由以领域为中心的团队独立开发,这些团队最了解他们自己的数据。即使一个集中的 IT 团队保持对所有数据的管理,每个以领域为中心的团队保留对其数据的所有权,并通过在其上实现协调的API,将其开发成一个有用的、可集成的产品。

例如,在精准医疗的情况下,DNA 测序核心可以开发并拥有与 DNA/RNA 测序相关的数据产品,病历团队可以开发并拥有与患者病历相关的数据产品。独立开发和拥有的数据产品可以通过其协调的API 集成在一起,产生高价值的数据应用,同时消除集中式 IT 团队理解 DNA/RNA 测序和患者病历的所有复杂性的挑战。

6 —数据提取的协调

这在上面已经讨论过了,也就是说,数据提取是通过协调的API 来执行的,如果没有,则通过协调的模式来执行 SQL 查询,但是值得重申的是,数据提取还必须与数据治理和合规系统(例如 HIPAA/GDPR)一起协调

7 —业务逻辑/算法的协调

我认为这是协调最困难的数据流程,因为业务逻辑——也就是对数据的计算操作——出于如此多不同的原因发生在如此多不同的情况下。

例如,如果数据量或计算性能是一个问题,那么算法需要尽可能靠近数据存储层运行,甚至可能将它们移动到存储系统本身中,例如 Apache Spark 。此外,如果算法高度特定于数据领域,那么它们可以在特定于领域的数据产品的上下文中实现,并通过协调的 API(例如 Tag.bio )来访问(那是我的公司)。

在其他情况下,仅举几个例子,业务逻辑和算法需要更接近终端用户体验—例如 Tableau 、 R/Shiny —或者在特定数据科学的环境中—例如 Jupyter 。

最后,作为业务逻辑协调的高级形式,Tag.bio(我的公司)自动存储对数据运行的查询/算法的每个实例的详细记录,产生数据分析结果的协调来源,即udat。

8 —数据应用的统一

利用数据的软件应用程序多种多样,从平凡到激动人心,从原型到业务关键。举几个例子:

  • 财务报告的汇总
  • 单一实体查询—例如单一患者报告
  • 训练/测试预测模型
  • 数据科学家的数据研究
  • 终端用户的数据研究—例如交互式仪表盘、工作流系统。

这里,在技术栈中提供抽象的、多用途的模块是很有用的,这样数据应用就可以尽可能地协调-例如SDK、库、框架、图形设计模板、接口模块、数据提取服务、业务逻辑服务和认证/数据治理服务。

因此,每个数据应用程序将只需要它自己的功能/代码库,用于与其他应用程序不同的特定目的。

9 —数据工程师体验的统一

最后四个部分将讨论人们在开发和使用协调系统时的体验。这些经验也可以/应该协调

数据工程师处理从原始数据阶段到已处理数据集成层的数据,需要管理的内容很多。

为了协调一个团队内和跨多个团队的数据工程师的产出,应该努力通过以下方式协调他们的经验:代码库、编码约定、开发环境、编程语言、SDK 和共享库、编程框架、测试/质量保证工具、认证密钥、沟通和产品管理方法学——例如敏捷。

10 —数据应用程序开发人员体验的统一

数据应用程序开发人员构建系统来提取数据、执行业务逻辑和算法,并向最终用户提供交互式软件。

数据应用程序开发人员体验可以协调类似于上面的数据工程师体验,增加了:前端框架、前端开发环境、用户体验/设计标准、公共界面元素以及用于业务逻辑、数据提取、身份验证和治理的 SDK/API/服务。

11 —最终用户个人数据体验的统一

最后,我们接触到了协调数据堆栈的消费者…正如您可能担心的那样,最终用户体验也可以协调

最终用户体验的协调可以通过图形设计、界面元素、交互、工作流、算法、可视化、报告、认证、数据管理和可再现性的标准化来实现。

12 —统一集体数据体验

从数据中获取价值通常涉及多个用户/组之间的协作,而协作要求用户对分析和结果有一定程度的共同理解。

跨不同数据应用程序的个人用户体验的协调也应与跨同一数据应用程序的多个用户体验的协调相匹配。**

众所周知,使用交互式仪表板很难做到这一点,交互式仪表板通常提供主观的、特定于用户的、不可复制的体验。与仪表板相比,基于工作流的应用程序为终端用户群体提供了客观、协调的体验,并为执行的每项分析提供了完整的来源/再现性。

结论

你怎么想呢?我做得过分了吗?你是否也看到协调开始侵入你的组织/行业的每一个对话?有用吗?

记住——如果你不熟悉其他人正在使用的术语/缩写,或者如果意思/上下文不明确——你有权大声说出来。允许某人误用一个流行词对任何人都没有帮助。

另一方面,harmony是如此普遍地积极——具体的和不具体的——这是一个很难误用的术语。每个人都知道协调总是一个好主意。

感谢阅读。

照片由 Pouya Jabbarisani 在 Unsplash 拍摄

Python 中的地图函数

原文:https://towardsdatascience.com/the-map-function-in-python-eb9a90707d17?source=collection_archive---------8-----------------------

了解如何使用 Python 中的地图功能

照片由福蒂斯·福托普洛斯在 Unsplash 拍摄

尽管 Python 是一种面向对象的语言,但它仍然提供了提供函数式编程风格的函数。其中一个函数是内置的 map 函数,知道这个函数会非常有用。

在本教程中,我们将学习 Python 中的 map 函数是什么以及如何使用。

地图功能

假设您想要使用我们已经拥有的列表创建一个列表。这意味着我们希望使用现有的列表,对每个元素应用某种操作或函数,并使用这些输出来创建一个新的列表。

例如,如果我们有一个数字列表,我们想创建一个包含它们的方块的新列表。一种方法是使用 for 循环遍历数字列表,并应用一个函数返回每个数字或元素的平方。当我们遍历列表时,我们可以在新列表中添加或附加平方值。

让我们看看如何在代码中做到这一点:

我们有一个数字列表, num_list ,我们想要创建一个新列表, num_list_squared ,它包含了 num_list 的平方。我们使用 for 循环遍历 num_list ,并将每个数字的平方或 num 添加到我们的 num_list_squared 列表中。

另一种实现方式是使用名为 map 的内置 Python 函数。

map 函数接受两个参数:我们想要应用的函数和我们想要应用它的 iterable 对象或序列(比如本例中的 list)。换句话说, 映射 函数将这个函数映射或应用到我们传入的序列的每个元素。

映射(函数,可迭代)

这个 map 函数将返回一个map object,它是一个迭代器。如果我们想从这个 map 对象创建一个列表,我们需要将 map 对象传递给内置的 list 函数,如下所示:

list(map(function,iterable))

因此,如果 iterable 是一个由元素 xyz 组成的列表,那么 map 函数将完成以下任务:

list(map(f,[x,y,z])→[f(x),f(y),f(z)]

函数 f ,是作为参数传递给映射函数的函数。

让我们看看如何使用内置的 map 函数来完成上面的代码:

记住,我们可以将 映射 函数应用于任何可迭代对象或序列中的每个元素,而不仅仅是一个列表。

我们来分解一下这行代码发生了什么:

num_list_squared = list(map(squared, **num_list**))

map 函数从 num_list 中获取第一个元素,即 1,并将其作为参数传递给平方函数(因为我们将该函数作为第一个参数传递给了 map 函数)。平方函数然后返回 1 的平方,也就是 1,它被添加到我们的地图对象中。然后 map 函数从 num_list 中取出第二个元素,即 2,并将其作为参数传递给平方函数。平方函数返回 2 的平方,也就是 4,然后被添加到我们的地图对象中。在它完成了对 num_list 元素的遍历,并将我们剩余的平方数添加到 map 对象中之后, list 函数将这个 map 对象投射到一个列表中,该列表被分配给变量 num_list_squared

使用 lambda 表达式

我们可以通过传入一个 lambda 表达式 作为我们的函数来进一步缩短我们的代码:

关于 lambda 函数的更多信息:

我们传入 map 的函数也可以是 Python 中的内置函数。例如,如果我们有一个字符串列表,并且我们想要创建一个包含这些字符串长度的新列表,我们只需传入内置的 len 函数,如下所示:

list(map(len, **list_of_strings**))

学习更多关于可迭代、迭代器和迭代的知识:

密码学:凯撒密码

让我们尝试一个稍微有趣一点的涉及密码学的例子,特别是凯撒密码。caesar 密码通过将消息中的每个字母替换为移位的字母或字母表中相隔指定数量空格的字母来加密消息。因此,如果我们选择空格数为 1,那么字母表中的每个字母将被替换为相隔 1 个空格的字母。所以字母 a 会被字母 b 代替,字母 b 会被字母 c 代替,以此类推。如果我们选择空格数为 2,那么 a 就用 c 代替,b 就用 d 代替。

如果我们在计算空格的时候到达了字母表的末尾,那么我们就回到字母表的开头。换句话说,字母 z 将被替换为字母 a(如果我们移动 1 个空格),或者被替换为字母 b(如果我们移动 2 个空格)。

例如,如果我们要加密的消息是“abc”,我们选择空格数为 1,那么加密的消息将是“bcd”。如果消息是“xyz”,那么加密的消息将是“yza”。

使用地图功能

嗯,我们对一个可迭代对象的每个元素都应用了一些东西。在这种情况下,iterable 对象是一个字符串,我们希望用不同的字母/元素替换字符串中的每个字母/元素。而 地图 功能恰恰可以做到这一点!

让我们假设所有的消息都是小写字母。空格数将是 0-26 之间的一个数。请记住,我们只想用其他字母替换字母。因此,任何非字母元素,如空格或符号,将保持不变。

我们首先需要接触小写字母。我们可以写出一个全是小写字母的字符串,也可以使用如下的字符串模块:

**abc** = 'abcdefghijklmnopqrstuvwxyz'orimport string**abc** = string.ascii_lowercaseprint(**abc**)
# 'abcdefghijklmnopqrstuvwxyz'

然后,我们可以编写我们的 加密 函数如下:

def encrypt(**msg**, n):return ''.join(map(lambda x:abc[(abc.index(x)+n)%26] if x in abc else x, **msg**))encrypt('how are you?',2)
# 'jqy ctg aqw?'

我们用两个参数创建函数 encrypt :我们想要加密的消息, msg ,以及我们想要移动字母的空格数 n 。我们传递给映射函数的 iterable 是消息 msg 。我们传递给 map 函数的函数将是一个 lambda 函数,它从 msg 字符串中获取每个元素,如果元素是字母表中的一个字母,它将根据我们传递的 n 值用移位的字母替换它。它通过获取字母表中该字母的当前索引或 abc.index(x ),加上 n 值,然后获取该和的模。如果我们到达了末尾(如果 abc.index(x)+n 是一个大于 25 的数),模数运算符用于从字母表的开头开始返回。换句话说,如果原来的字母是 z(它在我们上面创建的 abc 字符串中的索引是 25),并且 n 的值是 2,那么(abc.index(x)+n)%26 最后将是 27%26,这将产生余数 1。从而将字母 z 替换为字母表中索引 1 的字母,即 b。

map(lambda x:abc[(abc.index(x)+n)%26] if x in abc else x, **msg**)

记住 贴图 函数会返回一个 贴图 对象。因此,我们可以使用字符串方法 join,它接受一个 iterable(map对象就是这样,因为它是迭代器,并且所有迭代器都是 iterable),然后将它连接成一个字符串。然后,该函数返回该字符串。

要解密消息,我们可以使用下面的 decrypt 函数(注意我们是如何从 abc.index(x)中减去 n 而不是将其相加的):

def decrypt(**coded**, n):return ''.join(map(lambda x:abc[(abc.index(x)-n)%26] if x in abc else x, **coded**))decrypt('jqy ctg aqw?',2)
# 'how are you?'

如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的 链接 注册,我会赚一小笔佣金。

https://lmatalka90.medium.com/membership

希望你喜欢这个关于 Python 中map函数的教程。感谢您的阅读!

Python 3.10 中的匹配情况没有那么简单

原文:https://towardsdatascience.com/the-match-case-in-python-3-10-is-not-that-simple-f65b350bb025?source=collection_archive---------1-----------------------

图片来自 Pixabay

7 个示例说明“匹配大小写”不是“切换大小写”

在我的上一篇文章中,我已经介绍了 Python 3.10 中所有主要的新特性,它在两周前刚刚发布。最重要的特性之一是大小写匹配语法。

一些人仍然认为 Python 不需要“切换用例”语法。甚至 Guido 本人也不支持在 Python 中添加这种语法。但是,为什么还是在这个新版本中发布呢?在我看来,原因可以从名字中找到。它被称为“匹配大小写”,而不是像大多数编程语言那样的“切换大小写”。

在本文中,我将使用 7 个例子来展示新语法是多么灵活和“pythonic 化”。希望它能帮助你更容易地理解它。

如果你对 Python 3.10 中的其他特性感兴趣,可以参考我之前的帖子。

1.基础

图片由来自 Pixabay 的 Larisa Koshkina 拍摄

在任何有趣的东西之前,让我们从这个新语法的基本用例开始。假设我们正在编写一些代码来将 HTTP 状态代码转换成错误消息,我们可以使用如下的大小写匹配语法。

def http_status(status):match status:case 400:return "Bad request"case 401:return "Unauthorized"case 403:return "Forbidden"case 404:return "Not found"

实际上,对于这个特殊的例子,匹配用例并没有比 if-else 语法带来任何好处,如下所示。

def http_error(status):if status == 400:return "Bad request"elif status == 401:return "Unauthorized"elif status == 403:return "Forbidden"elif status == 404:return "Not found"else:return "Unknown status code"

如果它只能做这样的事情,我想它不会被添加。让我们继续用更多的例子来看看它能有什么样的灵活性。

2.默认情况

图片来自 Pixabay 的贝西

这意味着它类似于大多数其他语言中的 switch-case 语法,因此它必须具有“默认大小写”。当没有定义的案例可以匹配时,将执行“默认案例”中的代码。

Python 的风格达到了这个要求。它使用代表匿名变量的下划线“_”。基本原理是匿名变量可以“匹配”任何东西。

让我们看看下面的例子。

def http_status(status):match status:case 400:return "Bad request"case 401:return "Unauthorized"case 403:return "Forbidden"case 404:return "Not found"case _:return "Other error"

在上面的代码中,我们添加了默认情况并显示“其他错误”。

3.合并案例

图片来自皮克斯巴伊

如果有时我们有多个应该合并的案例呢?换句话说,这些是不同的情况,但我们处理它们的方式应该是相同的。

在 Python 中,我们可以使用管道“|”将这些案例组合成一个案例。它也被认为是一种“或”关系。

def http_status(status):match status:case 400:return "Bad request"case 401 | 403:return "Authentication error"case 404:return "Not found"case _:return "Other error"

在上面的代码中,我们将 401 和 403 错误都视为身份验证问题,因此我们可以在匹配的情况下将它们合并。

4.列表中的通配符

图片来自弗兰克·温克勒来自 Pixabay

更有趣的东西来了。假设我们正在使用大小写匹配语法编写一个警报逻辑。它接受一个列表作为参数。第一个元素是一天中的时间。让我们保持简单,所以我们有“早上”、“下午”和“晚上”。第二个元素是我们需要闹钟提醒我们做的动作。

然而,我们可能希望闹钟提醒我们同时做多件事情。因此,我们希望在列表中传递多个动作,以便警报可以提醒我们逐一完成所有动作。

下面是实现这一要求的代码。

def alarm(item):match item:case [time, action]:print(f'Good {time}! It is time to {action}!')case [time, *actions]:print('Good morning!')for action in actions:print(f'It is time to {action}!')

在这个例子中,我们只有两种情况。第一种情况不需要解释太多,因为它只是试图匹配单个动作的情况。在第二种情况下,我们在变量“actions”前面加了一个星号,这样它可以匹配列表中的一个或多个动作!

让我们试一试。

alarm(['afternoon', 'work'])
alarm(('morning', 'have breakfast', 'brush teeth', 'work'))

5.子模式

图片来自 Pixabay

有时,我们可能希望模式中有模式。具体来说,我们希望匹配案例将流分类到一个特定的“案例”中。然而,在这个模式中,我们想要添加更多的限制。

还记得我们已经定义了一天中的“时间”必须是“早晨”、“下午”或“晚上”吗?让我们将这个限制添加到匹配大小写代码中。如果“时间”与这三个中的一个不匹配,告诉用户时间无效。

def alarm(item):match item:case [('morning' | 'afternoon' | 'evening'), action]:print(f'Good (?)! It is time to {action}!')case _:print('The time is invalid.')

在上面的代码中,它显示了我们可以使用一对括号将我们想要匹配的“模式”括起来,并使用管道来分隔这些模式。

如果它与给定的 3 个“时间”中的一个不匹配,将执行默认情况。

为什么那里有一个问号?我故意添加它,因为我想强调解决方案。通常,匹配其中一个子模式,然后引用它精确匹配的模式并不容易。但是,我们可以在 Python 中有这个“引用”。

让我们添加一个“as”关键字,后跟一个变量,这个变量将是引用。

def alarm(item):match item:case [('morning' | 'afternoon' | 'evening') as time, action]:print(f'Good {time}! It is time to {action}!')case _:print('The time is invalid.')

6.条件模式

图片由来自 Pixabay 的 Michael Mürling 拍摄

我们需要让这个闹钟更加“智能”。到了晚上,让我们显示一些消息来感谢用户完成了一天的工作。

def alarm(item):match item:case ['evening', action]:print(f'You almost finished the day! Now {action}!')case [time, action]:print(f'Good {time}! It is time to {action}!')case _:print('The time is invalid.')

因此,我们在上面的代码中增加了一个 case,只匹配“evening”。

嗯……第二个好像有点沮丧。让我们让这个闹钟更加智能,以鼓励用户“工作生活平衡”。因此,当用户想要在晚上工作或学习时,闹钟建议用户休息一下。(我希望:D 能有这样的警报)

def alarm(item):match item:case ['evening', action] if action not in ['work', 'study']:print(f'You almost finished the day! Now {action}!')case ['evening', _]:print('Come on, you deserve some rest!')case [time, action]:print(f'Good {time}! It is time to {action}!')case _:print('The time is invalid.')

为了实现这一点,我们在顶部添加了另一个案例。这是有条件的。也就是说,当动作是“工作”或“学习”时,显示一些不同的消息。

7.匹配对象

图片来自 pasja1000 来自 Pixabay

到目前为止,我们已经探索了很多。我猜你可能会有这样的感觉,它是一个“匹配盒”而不是一个“开关盒”,因为“模式”永远是关键。

让我们来看一个更复杂的例子——一个类实例。是的,让我们用大小写匹配一个对象。

我就编一个简单的用例。创建了一个名为“Direction”的类,用于保存水平(东或西)和垂直(北或南)轴上的方向。

class Direction:def __init__(self, horizontal=None, vertical=None):self.horizontal = horizontalself.vertical = vertical

现在,我们想使用 match-case 语法来匹配这个类中的一个实例,并根据属性显示一条消息。

def direction(loc):match loc:case Direction(horizontal='east', vertical='north'):print('You towards northeast')case Direction(horizontal='east', vertical='south'):print('You towards southeast')case Direction(horizontal='west', vertical='north'):print('You towards northwest')case Direction(horizontal='west', vertical='south'):print('You towards southwest')case Direction(horizontal=None):print(f'You towards {loc.vertical}')case Direction(vertical=None):print(f'You towards {loc.horizontal}')case _:print('Invalid Direction')

然后,让我们从类中创建一些对象进行测试。

d1 = Direction('east', 'south')
d2 = Direction(vertical='north')
d3 = Direction('centre', 'centre')

结果表明,match-case 可以根据这些对象的属性轻松地匹配它们!

direction(d1)
direction(d2)
direction(d3)

摘要

图片由来自 Pixabay 的 Markus Kammermann 提供

在本文中,我介绍了 Python 3.10 中引入的新语法“match-case”,以及它是多么灵活和强大。我相信钉住这个新语法将帮助我们在可读性方面写更好的代码。

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

如果你觉得我的文章有帮助,请考虑加入灵媒会员来支持我和成千上万的其他作家!(点击上面的链接)

生存函数和风险函数之间的数学关系

原文:https://towardsdatascience.com/the-mathematical-relationship-between-the-survival-function-and-hazard-function-74559bb6cc34?source=collection_archive---------10-----------------------

谁是这篇文章的预期读者?

这篇文章是为那些至少已经熟悉生存(事件发生时间)分析和 Cox 比例风险模型的人准备的。强烈建议那些不熟悉生存分析和/或 Cox 比例风险的人在掌握基本知识之前跳过这篇文章,否则很可能是在浪费你的时间。我还认为,为了有效地模拟生存数据,你不需要知道生存和风险函数之间关系的高级数学证明。因此,简而言之,这篇文章适合那些想深入研究数学的好奇者,但这绝不是生存分析的先决条件。

介绍

写这篇文章的动机是,我曾经花大量时间使用卡普兰-迈耶生存分析(KM 分析)和考克斯比例风险模型(CPHM)等方法对生存数据(事件发生时间数据)建模,但这两者之间的确切联系引起了我的兴趣。无论使用何种方法,存活分析中感兴趣的因变量是存活时间。然而,在 KM 分析(可能是最常用的方法)中,我们估计的是生存概率,而在 CPHM,估计是围绕着风险率和风险比的概念进行的。我对这两个相似但概念上和数学上不同的估计之间的确切联系并不十分好奇,但好奇心逐渐增加,因此试图从纯数学的角度深入挖掘这种联系。直觉是,如果 CPHM 是在估计风险率,而 KM 分析是在估计生存概率(存活率),两者都是基于生存数据,那么这两个估计之间一定有明确的联系,对吗?我们将推导出生存函数和风险函数之间的基本数学关系,并表明这两者密切相关。

走进数学……

事不宜迟,我将从符号开始…

T 是代表生存时间的随机变量,生存时间就是事件发生的时间

S(t) 为生存概率,一个事件直到时间‘t’才发生的概率。

F(t) 为故障概率,即事件在时间‘t’发生的概率

S(t)F(t) 因此在数学上可以表示为:

注意,“T”是随机变量“T”感兴趣的特定值。

S(t)只不过是生存函数(也称为幸存者函数)

S(t)的一些性质

  • S(t=0) = 1(每个人在时间开始时存活,通常是流行病学研究中的研究开始时间或索引日期)
  • S(t = Inf) = 0(没有人在无限时间存活)
  • 0 ≤ S(t) ≤ 1
  • S(t)是非增函数。即 t1 ≤ t2 时 S(t1) ≥ S(t2)

在知识管理分析中,目标是估计 S(t)。这里的记录了通过 KM 分析非参数化估计 S(t)的最好的文章之一。CPHM 模型用在你有兴趣调整协变量的地方,就像多元回归模型一样。

危险率和危险比

CPHM 的目的是估算危害比,即两个危害率之比。这里的“二”不在本文的讨论范围之内。危险率是在 t 和 t 之间的非常短的时间间隔 t 内发生事件的概率,假定个人在‘t’之前没有发生事件。

因此,h(t)是一个“瞬时”率或概率。现在出现了另一个相关概念,即累积风险函数,通常用 H(t)表示。h(t)和 H(t)都可以用极限和积分学的概念用数学表示如下。

等式(1)是危险率 h(t)定义的简单数学转换。它是一个事件在 t 和 that 之间的小时间间隔内发生的条件概率(注意“|”符号),假设个体存活到“t”。因此,将 h(t)对‘t’进行积分,就得到累积风险函数 H(t)。

我们的目标是找到 h(t),H(t)和 S(t)之间的数学关系

从(1)中,让我们忘记极限部分,专注于下面显示的分子

这个条件概率可以根据熟悉的条件概率定理进行转换

应用上述相同的变换,等式(1)变成

等式 4 确实是从两个基本事实中推导出来的。危险发生的概率 P(t t)实际上是 P(t t)只不过是我们之前定义的 S(t)!现在我们可以看到,当我们设法将 S(t)代入 h(t)的数学表达式时,有些东西已经被解开了,如等式 4 所示。

我们现在要把等式 4 重新整理成更有用的东西…

每个方程都是从前面的方程推导出来的,我们还使用了之前定义的失效概率的概念。等式 8 给出了危险率和存活率之间一个美丽而简单的关系!但是我们还没有完成!我们能把方程 8 转换成只包含 h(t)和 S(t)的方程吗?是的,我们可以。为此,我们需要应用微分链法则。

将上述规则应用于对数函数上的复合函数..

在自然对数函数上使用复合函数的链式法则示例

让我们暂时搁置方程 9 和 10,重写只有 S(t)的方程 8

如果你看看等式 12 和等式 10,它们似乎很相似,对吗?确实!因此,我们可以将等式 12 简化为:

危险率与存活率的关系

就是这样。我们现在可以从等式 13 中得知风险率就是存活率(生存概率)的负自然对数对时间的微分。哇!

还没完呢!我们还可以找到累积风险函数 H(t)和 S(t)之间的关系。根据等式 2,H(t)就是 h(t)对时间的积分。所以我们需要做的就是对方程 13 进行积分,这样我们就得到了一个漂亮简洁的方程:

累积风险函数与生存函数的关系

是的,t 时刻的累积风险率(累积风险函数)是 t 时刻存活率的负对数!这不是很美吗?我记得沃尔特·列文曾经说过‘这个等式太美了,它让你流泪。’

粉碎盒状图的 Matplotlib 线图

原文:https://towardsdatascience.com/the-matplotlib-line-plot-that-crushes-the-box-plot-912f8d2acd49?source=collection_archive---------15-----------------------

直观地显示统计数据、误差线或自定义函数

作者图片

T 盒状图是一种快速便捷的方式来感受你的数据集——它可以给你一个范围、平均值、四分位数和异常值的快照。当然,它不像直方图或 kde 那样具有描述性,但是它对于观察我们的分布如何随着我们的变量而变化是很棒的。

虽然数据科学家和大多数技术人员对盒状图很熟悉,但对于非工程或统计领域的人来说,它们可能很陌生。这就是问题所在: 你需要一种方法来显示你的数据趋势及其分布是如何以一种任何人都能理解的格式变化的。

我将一步一步地向您展示如何制作一个折线图,以传达您想要分享的来自箱线图的尽可能多或尽可能少的信息——均值、中位数、范围、四分位数、标准差误差线或任何自定义值。

数据导入

我们将从导入函数和从 Kaggle 获取印度房价数据集开始,ka ggle 探索待售房屋的信息。我们将使用内置的熊猫功能read_csv()加载它,或者从本地保存的副本,或者为了方便起见,从我的 github ( 'https://tinyurl.com/4yx6p8hs')的网络链接。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from functools import reduce
import matplotlib as mpl### LOAD DATA ####
df = pd.read_csv('data/Bangalore.csv')
df.rename(columns={"No. of Bedrooms": "Rooms"}, inplace=True)
df.head()

快速浏览一下数据(df.head())就能发现大量可供我们摆弄的变量。对于这个例子,我们只是要调查房价的分布与一个家庭的房间数量的关系。为了使我们的数据帧尽可能小(有助于计算速度和总体组织),我们将首先创建一个仅包含这两列的子集数据帧:

dfsub = df[['Rooms', 'Price']]

方框图

首先,免责声明—如果您使用 pandas box plot 函数(而不是 matplotlib 函数),非常非常容易做出 box plot 来评估房价与房间数量的关系。这里的区别是 pandas 版本提供了一个非常方便的by参数来定义我们如何在 x 轴上分割数据。在 matplotlib 中,我们必须拆分和合并数据,创建一个新的数据框架,每个房间的数量都是数据框架中不同的列。以下是我们在熊猫身上的做法:

df.boxplot(column=['Price'], by=['Rooms'])
plt.title("")
plt.xlabel("Rooms")
plt.ylabel("Price")
plt.yscale("log")
plt.show()

一个标准的熊猫方块图

同样,作为一名数据科学家,它是说明性的,并告诉我们许多关于我们的数据分布的信息——均值、四分位数、范围和异常值。这需要做一些工作,但我们需要以一种任何人都能理解的方式传达这一信息。

带分布的线形图

这里的主要目标是将各种级别(均值、范围等)作为线条叠加在一个图上。我们将从提取每个“房间”值的这些值开始。这正是熊猫的拿手好戏。现在,我们将执行一次groupby(),然后从那里调用这些方法,而不是多次调用这个groupby()并使用像.mean().quantile()这样的内置方法询问不同的参数值——节省了一些繁重的计算,并节省了我们大约 25%的计算时间。

另一个技巧是,当我们用任何方法调用groupby()时,默认输出将是一个以‘Rooms’为索引的 dataframe 和一个名为‘Price’的列。您可以开始明白为什么这可能是一个问题——我们用.mean().quantile()或任何其他参数创建的每个新列都将被命名为‘Price’。呀!现在让我们用.rename()函数来解决这个问题。

使用 Groupby()设置我们的指标

很明显,我们可以继续下去,追求我们感兴趣的任何其他指标——标准差、四分位数范围、中位数,甚至是自定义函数。这就是这种方法的主要好处之一— 可调性!

接下来,我们需要将这些新的微型数据框架合并在一起,这样我们就可以将所有数据保存在一起。这并不是 100%必要的,但是强烈建议在数据组织中使用,以防我们以后需要使用这些数据。首先,我们将列出数据帧,然后用concat()将它们连接起来。

合并微型数据框架

我们的合并数据框架

太好了!“房间”是我们的索引,我们的每个数学函数为“房间”的每个值提供了一个值。这正是线图喜欢使用的数据类型。

测绘

这里的一般概念是将单个的数学值作为线相加,然后在上下界之间填充。对于此图,我将仅使用平均值、第 25 个百分点、第 75 个百分点、第 5 个百分点和第 95 个百分点,但是,我鼓励您尝试使用此方法,并使用最大值/最小值或您想要创建的任何其他指标自定义您的图。

同样值得注意的是,为了代码和我们的绘图的可读性,我将为“x”和“y”变量赋值,并除以 1,000,000 以使我们的 y 轴可读性更好。

在制作图表时,我们首先为我们想要添加的每一行调用ax.plot()。我在这里保持简单,只是自定义颜色和线条样式,但还有许多其他方式来自定义这些。另外,增加了一个label=,它将直接馈入我们的legend()。这是 matplotlib 胜过 R 的 plot() 的一个地方——图例几乎是自动生成的。

接下来,我们使用ax.fill_between()填充线组之间,以帮助眼睛看到定义范围的每组线。接下来,我们添加一个带有ax.grid()的背景网格,alpha 设置透明度,which='both'给长轴和短轴都添加线条。我们还会给 x 轴和 y 轴起一个描述性的名字。

最后,由于房屋价值的绝对范围,该图在对数标度中使用 y 轴时可读性更好,否则较小的值会因为标度太大而看不到。不幸的是,matplotlib 默认将 y 轴值放在对数轴的科学符号中,这通常很难快速阅读(特别是对于我们的非技术读者)。为了克服这个问题,我们格式化数字并使用set_major_formatter()方法,这样我们的 y 轴将显示为简单的数字。

构建我们的线图

对于那些还不熟悉面向对象版本的 matplotlib 的人来说,基于状态的绘图代码(使用plt.plot())在我的 github 这里。

啊,好多了!

其结果是一个更具视觉吸引力和普遍理解的基本箱线图。更好的是,它是完全可定制的——它可以显示我们想要的任何线条或范围,这允许我们调整它的使用来衡量我们的观众熟悉的指标。

额外学分

知道四分位数和平均值是一回事,但知道这些值是否有分量总是很重要的——我们通常想知道这些计算中有多少数据点。显然,如果只有少数房屋售出,噪音可能会使我们的图表变得不那么有用。

看看我们的图,有点意外的是,一旦我们在一个房子里有 6 个房间,价格就开始下降……我们应该检查一下,以确保我们有足够的数据来知道这个趋势是否真实。之前我们用.count()生成了一个groupby()就是为了这种情况。虽然我们可以在数据框架上查看各自的列,但是直观地传递这些数据会有用得多。

为了实现这一点,我们可以创建一个带有条形图的子图,显示每个“房间”计数的数据点数量,镜像与之前相同的 x 轴,以帮助眼睛进行关联。

创建支线剧情

我们的箱线图带有数量细目表

我在这里绘制了一个对数标度,以帮助我们了解“房间”=6 和 7 组中只有两个住宅。与此同时,我们了解到,对于 4 个房间或更少的房子,我们受到 100 多个房屋列表的驱动,所以这些趋势和范围可能是可信的。

结论

你有它——心爱的箱线图可以被击败!我们使其更易于可视化,并且可以自定义数据。这里我们复制了通常在箱线图中看到的四分位数,但是我们也可以使用这种方法来绘制自定义函数的误差线或值。这需要更多的工作,但是最终的结果以一种非技术人员可以容易理解的方式传达了我们的结果。我已经把我所有的代码贴在这里,这样你就可以玩并定制你自己的方块剧情杀手。编码快乐!

“+=”可能不会像您在 Python 中期望的那样

原文:https://towardsdatascience.com/the-may-not-do-what-you-expected-in-python-d46991992974?source=collection_archive---------14-----------------------

图片来自 Pixabay 的Steve buiss NNE

讨论和比较 3 种不同的“添加”功能

你以为a = a + b和 Python 里的a += b总是一样的吗?答案是否定的。像大多数其他 Python 开发者一样,我以前也在想同样的事情,直到我意识到 Python 中有 3 个不同的“加法”函数。

  • __add__()
  • __radd__()
  • __iadd__()

不认识他们?别担心。如果您知道双下划线包围的函数是“神奇”函数,您应该已经意识到这些函数应该以更直观的方式调用。确切的说,当我们有a + b的时候,函数a.__add__(b)在幕后被调用。

在这篇文章中,我将介绍这三个函数以及它们之间的区别。更重要的是,我会告诉你在哪个场景中a = a + b会和a += b不一样,以及为什么。

1.调用 add 时。

图片来自 Pixabay 的 Ulrike Leone

正如简介中提到的,每当我们进行求和计算时,都会调用函数__add__()。因此,我们可以说下面两个表达式总是相同的。

a + b
a.__add__(b)

我们可以通过定义一个自定义类来验证这一点。姑且称之为“X”类。然后,类“X”将接受一个数字进行初始化。同样,我们需要定义神奇的函数__add__()。为了方便起见,还定义了__repr__()函数,以便我们可以轻松地打印结果。

class X:def __init__(self, num):self.num = numdef __add__(self, other_X):print('I am called!')return X(self.num + other_X.num)def __repr__(self):return str(self.num)

现在,让我们从这个类“X”中实例化两个数字,并执行求和计算。

a = X(1)
b = X(2)print('a + b =', a + b)

__add__()函数中,我添加了一个打印函数来打印一些东西。然后,当我们运行a + b时,它被打印出来。因此,这证明了我们已经成功地为这个定制类重写了+操作符。

2.raddadd 有什么不同?

图片来自 Pixabay

这个功能有点特别。它将颠倒两个组件的顺序,然后将它们相加。嗯,我们都知道a + b = b + a如果两者都是标量。因此,用除法比用加法来演示要容易得多。

好在有两个对应的功能__truediv__()__rturediv()。参见下面的例子。

x = 10
y = 2x.__truediv__(y)
x.__rtruediv__(y)

因此,

  • x.__truediv__(y) = x/y
  • x.__rtruediv__(y) = y/x

同样的,

  • x.__add__(y) = x + y
  • x.__radd__(y) = y + x

如果你想知道有多少其他的运算符或计算具有这些特性,这里有一个官方文档的链接。

3.调用 radd 时。

图片由 Circ OD 发自 Pixabay

现在我们明白了,表达式a.__radd__(b)等同于b + a。但是等等,当我们有表达式b + a时,它肯定会运行b.__add__(a)而不是前者。那么,什么时候会调用函数__radd__()

还记得我们已经定义了一个定制的类“X ”,我们必须实现__add__()函数,以使运算符“+”能够在“X”实例之间使用吗?这意味着,有时我们可能在课堂上没有它。

让我们定义另一个类“Y ”,使它与“X”相同,但不覆盖函数__add__()

class Y:def __init__(self, num):self.num = numdef __repr__(self):return str(self.num)

现在,我们再次定义ab,但是分别使用 X 和 Y。然后,我们试着运行b + a

a = X(1)
b = Y(2)print('b + a =', b + a)

因为b是 Y 的一种类型,但是没有实现__add__(),所以不存在b.__add__(a)

我希望到目前为止你仍然明白。然后,让我们在类 X 中实现__radd__()函数,然后再次运行它。

在类 X 中,添加以下函数:

def __radd__(self, other_num):print('Reversed adding!')return X(self.num + other_num.num)

是的,你的想法是正确的。当一个对象没有__add__()但求和计算中的另一个对象实现了__radd__()函数时,该函数将被调用。

4.调用 iadd 时。

图片来自 Pixabay

岸上的回答是,当我们使用+=操作符时会调用__iadd__()函数。然而,与__radd__()函数不同的是,即使我们不实现__iadd__()函数,运算符“+=”仍然可以工作。如果有功能的话,它将返回到__add__()功能。

让我们继续使用第 1 节中定义的例子。

class X:def __init__(self, num):self.num = numdef __add__(self, other_X):print('I am called!')return X(self.num + other_X.num)def __repr__(self):return str(self.num)a = X(1)
b = X(2)a += b
print('new a =', a)

当然,如果我们已经实现了函数__iadd__()并使用了“+=”操作符,它就会被调用。

让我们通过实现__iadd__()函数来证明这一点。

class X:def __init__(self, num):self.num = numdef __add__(self, other_X):print('I am called!')return X(self.num + other_X.num)def __iadd__(self, other_X):print('return myself')self.num = self.num + other_X.numreturn selfdef __repr__(self):return str(self.num)

5.“a=a+b”和“a+=b”的区别

在前面的例子中,您是否注意到了我实现__iadd__()函数的不同之处?是的,我让它返回self,而不是像__add__()那样返回一个新对象。换句话说,在这个操作中没有创建新的对象。

这也是官方对__iadd__()的定义。

object.**__iadd__** ( 自我其他)

这些方法应该尝试就地执行操作 (修改自身)并返回结果。

这将在函数__add__()__iadd__()之间产生差异,从而在某些情况下使运算符“+”和“+=”不同。

不要忘记,我们可以在任何 Python 列表上使用“+”操作符,所以让我们在列表上进行实验。

首先,让我们定义两个简单的列表ab

a = [1, 2]
b = [3, 4]

然后,让我们定义另一个变量c,给它赋值a

c = a

再简单不过了,对吧?😃

现在,让我们添加ab,并将其赋回a

a = a + b
print("a =", a)
print("c =", c)

结果显示ac不同。列表c仍然等于“原始”a

现在,让我们试试“+=”操作符。

a = [1, 2]
b = [3, 4]
c = aa += b
print("a =", a)
print("c =", c)

这一次,因为a被修改,所以对象c被改变!

这正是因为功能__iadd__()的特性。它将就地修改对象,而不是新建一个对象,这将导致对象c的修改。

事实上,只有可变对象会受到这个“特性”的影响。如果我们试图求和的对象是不可变的,那么“+”和“+=”可以认为是相同的。

我们可以在元组上进行实验,因为 Python 元组被认为是不可变的对象。

a = (1, 2)
b = (3, 4)
c = aa += b
print("a", a)
print("c", c)

这一次,对象c没有改变。

也许再举一个整数的例子,因为我们可能总是认为“+”和“+=”是相同的,这是由于我们更经常地添加数字而不是列表。例如,Python 中的整数也是不可变的。

因此,在数字上使用“+=”是足够安全的,不要担心:)

摘要

图片来自 Pixabay 的 Gerd Altmann

在本文中,我介绍了在 Python 中添加对象的三种方式。它们是“神奇的函数”,当我们使用操作符时就会被调用。现在你应该明白它们什么时候会被调用,它们会提供什么特性。

最重要的是,要知道a = a + ba += b的区别。当对象是可变的时,它们会产生不同的结果。

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

如果你觉得我的文章有帮助,请考虑加入灵媒会员来支持我和成千上万的其他作家!(点击上面的链接)

均值漂移算法和运动控制

原文:https://towardsdatascience.com/the-mean-shift-algorithm-and-motion-controls-ee0005155943?source=collection_archive---------24-----------------------

或者,我如何用网球玩吃豆人

亚历克斯·埃斯库在 Unsplash 上的照片

在之前,我已经写过均值漂移算法,但是我从来没有给出它的实际应用。我最终对这篇文章感到不满意,所以我想重温这个话题,并将其应用到现实世界中。

均值漂移算法可以利用颜色实时跟踪物体。颜色与背景越明显,效果越好。虽然物体跟踪是计算机视觉中的一个大话题,但我想把重点放在游戏上。

运动控制,一种追踪玩家身体运动并将其转化为计算机输入的技术,已经在游戏中使用了好几次。虽然任天堂的 Wii 进入了大多数人的脑海,但它使用红外传感器与主机进行通信。相比之下,Xbox 的 Kinect 和 Playstation 的 Move 使用实际的摄像头来跟踪运动。

虽然控制台采用专门的硬件,但普通的消费级计算机或带摄像头的笔记本电脑也可以利用相同的原理。

均值漂移算法背后的理论

像所有聚类算法一样, mean shift 试图在数据集中找到密集的区域。与更流行的 K-Means 聚类不同,mean shift 不需要估计聚类的数量。

相反,它为数据集创建一个核密度估计(KDE) 。该算法将迭代地将每个数据点移动到更靠近最近的 KDE 峰值一小段距离,直到满足终止标准。最终结果将产生一组定义明确的分类。

显然,均值漂移算法对无监督学习很有效,但它在计算机视觉中的应用并不清楚。

本质上,图像中的每个像素都可以被认为是一个数据点。默认情况下,每个像素传达三条颜色信息:红色、绿色和蓝色通道,统称为 RGB 颜色空间(尽管大多数计算机视觉专家更喜欢使用 HSV 或 CIELAB ,因为它们在不同的光照条件下变化不大)。

当均值偏移算法应用于图像时,得到的聚类表示存在的主要颜色。例如,考虑下图:

在 Unsplash 上paweczerwiński拍摄的照片

当应用时,均值偏移将产生红色、黄色、绿色、蓝色、紫色和白色的聚类。这个过程被称为图像分割。

然而,为了将它用于对象跟踪,需要获取初始图像的颜色配置文件,然后将其与聚类进行比较。感兴趣的区域被定义为最接近的匹配聚类中的点。

优势、劣势和其他考虑因素

如前所述,在视频帧内选择并跟踪与预定义颜色最接近的聚类。这就提出了如何选择预定义颜色的问题。

通常,在视频的第一帧中,围绕要跟踪的对象绘制感兴趣的区域。这种方法允许在视频的精确光照条件下获得对象的确切颜色。不幸的是,这意味着物体的位置和大小是预先知道的。

要跟踪的对象也需要是一种独特的颜色。例如,均值漂移算法将能够跟踪白色背景上的普通红球;然而,如果红球在红色背景上,算法将跟踪它。

最后,感兴趣区域的大小永远不会改变。当跟踪一个对象时,不管它离摄像机有多远和多近,跟踪框都保持相同的大小。

对运动控制器使用均值漂移

Giorgio Trovato 在 Unsplash 上拍摄的照片

对象跟踪有许多应用,但在这种情况下,它将用于将运动转化为计算机输入。均值漂移算法将跟踪一个网球,选择它是因为它无处不在,是单色的,并且有独特的颜色,并将它的位置转换为模拟的箭头键按压。

最终用户必须将网球放在摄像机附近来校准算法。一旦完成,用户应该能够上下左右移动网球来控制屏幕。

虽然箭头键可以用来在任何程序中输入命令,但这次演示将玩吃豆人。

代码实现

import numpy as np
import cv2

在进行任何计算机视觉之前,需要导入两个库:处理高效计算的 NumPy 和处理计算机视觉任务的 OpenCV。

# Capture the current frame from the webcam
video = cv2.VideoCapture(0)
_, init_image = video.read()

VideoCapture 方法打开默认的网络摄像头,read 方法读取它捕获的第一帧。此时,用户应该将网球靠近摄像机。

# set up initial coordinates for the tracking window
x, y = 100, 100
# Set up initial size of the tracking window
height, width = 100, 100
track_window = (x,y,width,height)# set up region of interest (roi)
roi = init_image[y:y + height, x:x + width]

定义了 x 和 y 坐标对以及高度和宽度变量来创建感兴趣区域(ROI ),它只是网球的位置。

在这种情况下,ROI 从点(100,100)开始,向下和向右延伸 100 个像素。由于终端用户被要求将网球放在靠近摄像机的地方,这个 ROI 可能会捕获它的一个子部分。然而,如果用户没有适当地放置球,ROI 将捕获背景中某个物体的颜色,例如手或墙。

请注意,因为在均值偏移算法中跟踪窗口的大小不变,所以 ROI 将始终是一个 100 像素宽的正方形。根据相机的分辨率或用户与相机的距离,可能需要进行调整。

# Convert to HSV color space
hsv_frame =  cv2.cvtColor(init_image, cv2.COLOR_BGR2HSV)# Apply mask to make sure pixels are within range
mask = cv2.inRange(hsv_frame, np.array((0, 20, 20)), np.array((180, 250, 250)))

这个部分只是将图像转换到 HSV 颜色空间,并确保所有像素都在合理的范围内。任何欠饱和或过饱和的像素值都被排除。

# Calculate HSV histogram
hist_frame = cv2.calcHist([hsv_frame], [0], mask, [180], [0,180])
cv2.normalize(hist_frame, hist_frame, 0, 255, cv2.NORM_MINMAX)

为 ROI 计算直方图并进行归一化。该值将用于跟踪每个后续视频帧中最近的簇。

# terminate at either 10 iterations or move by atleast 1 pt
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

如前所述,均值漂移算法反复筛选点,直到满足终止标准。这一行中定义的元组为算法停止并声明新的 ROI 创建了两个条件。如果 ROI 的质心没有移动,或者完成了 10 次迭代,均值偏移将完成。

前一个条件是直观的。如果网球不动,就不需要计算新的位置。后一种情况与处理时间有关。均值偏移的更多迭代将以时间为代价创建更准确的 ROI。将这个值设置得太高可能会产生滞后的结果,但是设置得太低可能会偏离 ROI。

最终,设置一个合适的终止条件就是金发女孩问题。

# Get the dimensions of the video 
frame_height = init_image.shape[0]
frame_width = init_image.shape[1]

这几行只是检索视频帧的宽度和高度。这些以后会用到。

from pynput.keyboard import Key, Controller# initialize keyboard controller
keyboard = Controller()# Alt + Tab over to another window
with keyboard.pressed(Key.alt):keyboard.press(Key.tab)keyboard.release(Key.tab)

运动控制器需要为设备创建输入。因此,模拟按键的 Pynput 库被导入并初始化。使用 with 语句时,在按下 tab 键的同时按下 alt 键。这模拟了激活另一个窗口的 alt + tab 快捷键。

在这个例子中,另一个窗口是 Pacman 的在线版本,它必须在运行代码之前打开。虽然更好的方法可能涉及打开浏览器的代码或运行打开可执行文件的命令,但这提供了一些使用 Pynput 的额外实践。

# Initialize background subtractor
subtraction = cv2.createBackgroundSubtractorKNN()

当背景噪音最小时,均值漂移效果最好。这一行初始化 OpenCV 的背景减法。虽然实现的细节可能需要另一篇文章,但基本思想是该算法将任何静止的东西视为背景,将任何移动的东西视为前景。假设运动控制器只需要观察移动的输入,这是理想的工作方式。

while True:ret, frame = video.read() if ret:

初始化一个无限循环,并读取视频馈送。ret 变量是一个布尔值,它指示摄像机是否正确地进行了流式处理。该帧是流中的当前视频帧。

如果 ret 变量为真,则代码继续执行。

 # Apply background substractionmask = subtraction.apply(frame)# Create 3-channel alpha maskmask_stack = np.dstack([mask]*3) # Ensures data types match upmask_stack = mask_stack.astype('float32') / 255.0           frame = frame.astype('float32') / 255.0 # Blend the image and the maskmasked = (mask_stack * frame) + ((1-mask_stack) * (0.0,0.0,0.0))frame = (masked * 255).astype('uint8')

第一行将背景减法应用于视频帧,并创建一个简单的二进制蒙版。由于二进制掩码是一个二维矩阵,而视频帧是一个三维矩阵,因此在它们的维度一致之前,它们不能进行有意义的交互。

mask_stacked 变量只是将掩码乘以 3,并将掩码的三个实例“堆叠”在彼此的顶部。结果是可以与视频帧交互的三维矩阵。接下来,遮罩和视频帧都要进行一些必要的类型转换,然后将它们混合在一起。

如果显示生成的图像,它看起来会像这样:

 # Convert to HSVhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # Apply back projectiondst = cv2.calcBackProject([hsv],[0],hist_frame,[0,180],1) # apply mean shift to get the new locationtrack_window = cv2.meanShift(dst, track_window, term_crit)[1]

移除背景后,视频帧被转换为 HSV。对该帧应用反投影,然后应用实际的均值偏移算法。track_window 变量现在是跟踪窗口右上角的 x 和 y 坐标,以及它的宽度和高度。

 # Calculate the center pointcenter = (track_widnow[0] + width/2, track_window[1] + height/2)

此行不使用右上角,而是计算跟踪窗口的中心。如果 mean shift 可以找到网球,并正确地以它为中心,这将允许程序根据球的中间移动的位置给出输入。这对最终用户来说更直观。

 if center[1] > (frame_height * 0.5):keyboard.press(Key.down)keyboard.release(Key.down)print("down")elif center[1] < (frame_height * 0.20):keyboard.press(Key.up)keyboard.release(Key.up)print("up")if center[0] > (frame_width * 0.5):keyboard.press(Key.left)keyboard.release(Key.left)print("left")elif center[0] < (frame_width * 0.2):keyboard.press(Key.right)keyboard.release(Key.right)print("right")

现在球被跟踪了,它的运动和位置可以被翻译成计算机输入。如果球的中心位于屏幕的上半部分,将按下向上箭头的模拟。同样,如果球的中心在屏幕的底部五分之一,将按下向下箭头的模拟。同样的逻辑也适用于左和右。

这些比例可能看起来很奇怪,但它们通常会比保持完美的比例带来更好的结果。不过,这些比例可能会根据特定的用户体验进行调整。

 else:breakvideo.release()

最后几行清理了代码。else 连接回 ret 变量,如果摄像机不能正确读取视频,它将中断循环。最后一行将简单地关闭相机。

结果和结论

这段代码的最终目标是用网球玩吃豆人游戏。这听起来像是一个有趣的、愚蠢的、听起来不可能的挑战,但事实证明是可行的。下面展示了我的演奏经验。

运行中的运动控制器。作者制作的视频

虽然没有明显的视觉线索,但均值漂移算法成功跟踪了网球的位置。通过 Pacman 相应移动的证据,该程序还将球的位置和移动转化为输入。因此,可以玩吃豆人游戏。

不幸的是,缺乏经验。在视频中有点明显,有时球的移动和屏幕上的输入之间有滞后。对于任何类型的游戏,滞后应该接近于零。同样,球的运动轨迹也不完美。好几次 ROI 会卡在一个角落里,Pacman 会卡在那里,直到一个幽灵结束游戏。

虽然这个程序提供了一个成功的概念证明,但在作为最终产品提供之前,它需要更多的改进。

我们发出的信息:反对“部署”机器学习的案例

原文:https://towardsdatascience.com/the-messages-we-send-the-case-against-deploying-machine-learning-3d123a18f13d?source=collection_archive---------45-----------------------

为什么改变我们的语言能让人工智能更负责任

吉列尔莫·费拉在 Unsplash 上拍摄的照片

在机器学习模型生命周期中,我们通常将实现模型到产品中称为“部署”模型。虽然被广泛接受,但部署一词在权力和军事化中根深蒂固。

我们用来谈论人工智能的语言非常重要,包括我们的技术术语。关于机器学习和人工智能的讨论的最大缺点之一是我们迄今为止用来描述它的术语。例如,看一下实现与部署:哪个词最能描述您正在使用生产机器学习模型做什么?虽然从业者可能认为这两个词有相同的意思,但是在 ML 的上下文中,在这篇文章中,我将讨论为什么实现和合并可能比部署更好。(我个人比较喜欢实现)。我还将深入探讨使用不同的词语如何帮助我们建立一个跨越学科和行业的负责任的人工智能运动。

部署这个词合适吗?

在英语中,出于军事目的使用“deploy”一词可以追溯到 1786 年,意思是将(军队)排成一行,和/或扩大(以纵队形式组成的单位)。自 1829 年以来,该术语一直被用作比喻,这不仅在讨论人工智能时没有帮助,而且还与我们现代词汇中的其他词产生了共鸣,例如殖民(经常用于描述人类前往火星的旅行)。

此外,它还意味着基于历史语言了解针对哪个或哪些群体可能会部署什么。如果去掉这个含义,这听起来可能很天真,但是,我们必须围绕实现 ML 模型来重新构建我们的语言。我希望你能理解为什么使用 deploy 会与社会中的公平伤害和不公平系统产生交集。

这种关于将部署什么的假设知识是一个巨大的问题。数据科学家和 ML 工程师知道将部署一个决策系统,但我们并不总是知道这将对部署的模型产生什么样的影响。鉴于 65%的公司无法解释人工智能模型决策或预测是如何做出的,我们应该担心我们在不知道团队可能面临的潜在后果的情况下部署东西。

使用部署来描述一个技术动作,尤其是考虑到数据科学和人工智能工作的影响和规模,这是不准确的。在谈论人工智能时缺乏特异性无助于减轻这些系统的危害,这些系统往往强化刻板印象,贬低用户,并且在几乎没有监督的情况下运行..术语部署加强了创造技术的组织和他们的用户之间的权力结构。部署是一边倒的,很少咨询用户,对这些系统的决策也没有反驳或争论。这些都不符合人工智能中伦理学的目标。

ML/AI 话语与后果

我们缺乏对准确词汇选择的特异性和关注,这与导致我们产生完全不同的 ML 模式的实践相呼应。缺乏来自社会科学家、可能受到影响的下游人群以及公平性研究者的指导;工程师现在所做的是部署模型,很少考虑模型部署在谁的身上。这也是为什么 90%的 ML 型号从一开始就没有生产出产品的部分原因。

由于人工智能模型在生产中的部署存在道德问题,没有足够的透明度或输入机会,这也通过隐私泄露为进入我们的工作场所和个人生活提供了便利。我们需要从使用部署这样的术语转向扩大这些对话的范围,如果它们植根于关于包容性和移情驱动的人工智能开发的社会科学研究。

随着人工智能的发展和我们对它的理解的改变,我们用来描述它的语言也必须改变。这对你意味着什么?

大量的 Ctrl+F 和 Ctrl+V

根据新信息更新我们的语言并不新鲜。语言通常会随着时间的推移而变化。随着人工智能的发展和我们对它的理解的改变,我们用来描述它的语言也必须改变。对于我们这些在人工智能领域工作的研究人员、工程师、商业领袖、政策制定者和教育工作者来说,理解语言如何塑造关于这项技术的观点非常重要。

我们不需要等待一场革命或新的世界秩序,然后采取可行的步骤来改进我们的建模过程;你可以从你在团队中使用的语言开始。更新幻灯片和内部文档。

到目前为止,关于 ML 的讨论使用了一些术语,这些术语可能编码了使用它们的人的信仰、价值观和观点,甚至是无意的。当我们展望人工智能的未来时,重要的是我们要注意和有意地使用我们的语言。我们应该使用语言来传达我们正在做的事情,以捕捉机器智能的细微差别和复杂性,同时尊重我们选择的单词的词源和内涵。

你怎么想呢?

您更喜欢用哪个词来描述您将模型投入生产的工作?请在下面的评论中告诉我!

公制:如何正确测量你的模型

原文:https://towardsdatascience.com/the-metric-system-how-to-correctly-measure-your-model-17d3feaed6ab?source=collection_archive---------19-----------------------

深入到模型评估指标的世界,你不知道你需要知道——直到现在

本帖中用于生成图形和曲线间 KS 面积计算的代码是 [dython](http://shakedzy.xyz/dython/) 的一部分

图片来自 Pixabay

这是一个你作为数据科学家可能遇到的经典场景——你需要在一个相当小且不平衡的数据上训练一个二元分类器,比如一个简单的逻辑回归——例如:CTR 预测(点击率,意思是——用户是否会点击广告)。所以再一次,你没有很多数据,而且它是高度不平衡的,大约在 1000:1 的负/正比率附近。

那么,你的目标是在给定二进制标签的情况下预测点击发生的概率——换句话说,你将预测一个连续的数,而真正的标签是二进制类。没什么不寻常的——你可能已经知道你将如何实现它。但是你打算如何衡量你的分类器有多成功呢?您将使用哪个指标?我刚刚发现,这并不像我想象的那么简单。让我给你介绍一下我刚刚学到的东西。

取自 Giphy.com

明显的“不”

每当我们需要提出一个度量标准时,考虑准确性是我们人类的天性,准确性是由整个数据集中正确分类的样本总数来定义的。由于我们的数据集高度不平衡,该指标偏向于多数类,因此即使模型预测总是 0,准确性仍然非常高。

这里值得一提的是,不建议对这个特定数据集进行 1:1 的负/正比率的二次采样,因为我们已经说过数据集很小,这意味着我们无法承受丢失这么多有价值的数据。另一方面,对正类进行过采样是没有意义的,因为它与我们试图检查的东西——模型的概括能力——正好相反。因此,我们必须接受我们的数据是有偏差的这一事实,并找到一个可以处理它的度量标准。

精确度和召回率也不是我们要找的,因为它们只关注积极的一类,只能描绘出部分的画面。虽然有一些用例非常适合我们,但情况并非总是如此——如在 CTR 预测中——我们实际上关心这两个类,并希望对它们进行准确分类。F1 分数也是不可行的,因为它基本上是这两个指标的混合。

曲线下面积,以及为什么它不起作用

我上面提到的指标有一个隐含的问题,我们忽略了。所有基于混淆矩阵的指标都是针对二进制标签输出的,也就是说,真正的标签是 0 和 1,输出也是如此。但是我们的模型预测的是概率,而不是二元类。为了将概率转换为二进制类,我们需要决定一个阈值,其中所有高于它的概率将被分类为 1,其余的为 0。首选阈值是 0.5,但这不一定是最佳选择(如果你不确定为什么,可以看看我写的这篇博文)。这意味着上述度量不仅偏向多数类,它们也可能因我们的阈值决定而有所偏差。不好。

这就是为什么 ML 世界中最常见的指标之一是 ROC AUC(曲线下受试者操作特征面积)。我假设你对它很熟悉,但如果你不熟悉的话,可以查看上面段落中的链接。现在,ROC 曲线帮助我们找到将概率转换为二进制类别的最佳阈值。但是,等等,我们说我们想要预测概率,为什么我们需要一个度量来帮助我们找到一种方法将其转换为二进制标签?

ROC 曲线。虚线标记了简单分类器的曲线,并且 eOpT 标记了估计的最佳阈值

答案是我们没有。但是我们还可以从 ROC 曲线中学到另一件事——分离。你看,模型越好——正样本围绕 1 的概率越多,负样本越接近 0。所以模型越好,就越能区分正负概率分布。我们实际上可以在 ROC 曲线中看到这一点——分离越好,曲线下的面积越大。因此,我们可以使用曲线下面积,或 AUC,作为帮助我们评估模型的指标。太好了!—但也不尽然。

正如 Jason Brownlee 的博客文章所清楚解释的,ROC 曲线实际上也受到数据不平衡的影响,因为两个轴上的指标混合了两个类别。因此,他建议使用另一条曲线:精确度-回忆曲线,我们在 y 轴上画出精确度,在 x 轴上画出所有阈值的回忆。

一条公关曲线。虚线标记了一个简单的(未训练的)模型的曲线

等一下。几段前我解释了为什么这两个指标在我们的案例中没有用。我改变主意了吗?不。我不是建议使用这两个指标,而是使用它们创建的曲线。因为,就像在 ROC 曲线中一样,这条曲线的 AUC 是对模型的类别分离的度量——越高越好,最大值为 1。所以我们可以用 PR AUC 来代替?嗯,是的——但是有一个问题。

当考虑 ROC AUC 时,我们可以肯定地知道一个简单的分类器,意思是一个没有学到任何东西的分类器,将总是有一个 AUC = 0.5。这意味着我们有一个固定的基线,这使我们能够随着时间的推移跟踪模型的 ROC AUC 得分,因为它定期在不同的数据集上进行训练。只要所有数据集都来自相似的分布,模型的 ROC AUC 得分应该大致相同。

但是对于 PR AUC,事情有点不同,因为一个简单模型的精度-召回曲线是一条固定精度的水平直线。价值是什么?它是整个数据集中阳性样本的比例。这意味着我们用来比较模型的基线是不固定的,取决于我们使用的数据集。如果我们总是使用相同的测试集,这不应该是一个问题,但在现实生活中从来不是这样。

我们如何解决这个问题?一种方法是使用模型的 PR AUC 和天真模型的 PR AUC 之间的比率(在完全相同的数据上测试)作为衡量标准,但随着时间的推移,这可能变得太不稳定,很难用于比较。因此,虽然有可能使用它,但我相信我们都想要一个不那么嘈杂的指标。

比较分布

最后一节的关键词是分离。想一想——我们在这里真正追求的是类别分离——或者换句话说,我们在寻找一个模型来预测两个类别的两种完全不同的概率分布。比较两个分布几乎等同于计算这两个分布的 KL 散度:

离散 KL-散度。摘自维基百科

但是,虽然 KL-Divergence 通常是这种情况下的首选指标,但在我们的情况下,它实际上不是一个好的指标,原因有两个:

  1. KL 散度的输入顺序很重要。如果 PN 是正负概率分布,那么 KL(P,N)KL(N,P)。这是导致灾难和错误比较的原因。
  2. 从技术上讲,我们并不真正知道分布,因为我们只持有从这些分布中抽取的值的列表。这意味着我们使用离散的 KL 散度。为什么这很重要?因为我们正在运行从 0 到 1 变化的概率预测值。碰到一个没有样本的空桶的可能性非常高,尤其是对于小数据集——当这种情况发生时,KL-Divergence 会爆炸(每当 PQ 为 0 时,见上面的公式)。虽然我们可以通过添加一些足够小的常数 εPQ 来从技术上解决这个问题,但是度量变得高度依赖于该常数的值,这使得它对手动配置过于敏感。

为了解决这两个问题,我们可以使用一个不太为人所知的分布比较指标:海灵格距离:

离散海灵格距离。摘自维基百科

分立外壳既对称又不会在撞击空桶时爆炸。但是这个标准显然也有问题。下面描述的两个分布具有相同的海灵格距离,满分为 1,这显然不是我们想要的。我们需要别的东西。

两种不同的分布,一种具有完全分离,另一种没有,都具有相同的海灵格距离 1

你只需要分离?

这整个分布比较的事情开始在我的头脑中制造混乱,所以我再次问自己——我真正想要衡量的是什么?再次,分离。所以我决定给相关比率一个机会。我在寻找分类相关中简要讨论过它,所以让我跳到它做什么的底线:给定一组由连续数和类别组成的元组,它回答了这个问题:我们能多好地知道某个连续数与哪个类别相关联?这正是我们在这里寻求的——给定一个预测的概率,它与正确的类别相关联的可能性有多大?相关比率正好回答了这个问题,因此它似乎是我们的完美衡量标准。差不多了。**

还有另一件我们关心的事情,我们无法从这个度量中得到——那就是这两个分布是如何分布的,而不仅仅是它们被分开的有多好。在第一段中,我提到最佳模型将有两个独立的分布,正分布和负分布的质心分别尽可能接近 1 和 0。换句话说,我们不仅要寻找分离,还要寻找校准——也就是说,预测与实际标签有多接近。这条信息很重要,正如我们在下图中看到的那样,然而相关比率以及我们迄今为止遇到的所有其他指标都没有考虑到这一点。

两组完全分离的正负分布。我们更喜欢右边的模型,因为质心是 0 和 1(即使方差是左边模型的两倍)。尽管如此,左侧和右侧模型的相关比率分别为 0.97 和 0.98,因此在这种情况下,这不是一个非常有用的指标

事实证明,我真正追求的度量标准是我必须在另一个分布比较测试(称为 Kolmogorov-Smirnov 测试)的基础上自己创建的。我将跳过 KS 测试的一般用途,而把重点放在我们如何用它来估计一个二元分类器上。与我们目前遇到的所有其他曲线不同,对于 KS 测试,我们在同一个图上绘制两条曲线。对于每个可能的阈值(就像在 ROC 中一样),我们从正例的总数中,画出正确分类低于该阈值的正例的分数。然后我们做同样的事情,但是对于反面的例子。我们得到一个类似这样的图:

阈值下正负比值的 KS 检验曲线。估计的最佳阈值被绘制为灰色垂直线

上面的图告诉我们,例如,对于阈值 0.8,大约 20%的正面例子接收到低于该阈值的预测,并且大约 90%的负面例子也被发现低于该阈值。与 ROC 曲线一样,KS 曲线也允许我们找到分离的最佳阈值(由垂直线表示),但与 ROC 曲线不同,KS 检验对数据不平衡具有弹性,因为它将阳性和阴性样本分离为两条不同的标准化曲线。

这看起来像是优化阈值的另一个指标,但这里还隐藏着其他东西。考虑一个完美的分类器——当标签为 1 时,它准确地预测概率为 1,当标签为 0 时,它准确地预测概率为 0。这些曲线会是什么样的呢?你答对了——正曲线将立即下降到 0,并保持在那里(至于任何恰好低于 1 的阈值,将没有正样本)。另一方面,负曲线将持续停留在 1(对于任何高于 0 的阈值,将找到所有负样本)。这将在两条曲线之间创建一个完美的正方形,任何偏离这个完美分类器的地方都会缩小曲线之间锁定的区域。因此,曲线之间的 KS 面积是我们寻求的度量,对于完美的分类器,最佳值为 1,对于任何其他情况,值都较低。是啊!这是我们非常需要的指标,它甚至有一个超级酷的缩写:ABC。完美!

想自己用?这很简单,因为:

from dython.model_utils import ks_abc
ks_abc(y_true, y_pred)

万岁!

取自 Giphy.com

在你走之前还有一个指标

KS ABC 指标在我们的特定情况下处理离散校准(即在秤的两个边缘发现真实标签的情况),但在更一般的情况下,我们需要另一个指标进行离散校准。我遇到了这个我个人喜欢的指标,所以我想在这里提一下。它叫做欧石南乐谱,看起来像这样:

Brier 分数,其中 f 标记预测(预报),o 标记真实标签(结果)。摘自维基百科

它与 MSE 的相似性使得它非常直观,并且由于它的平方性质,它自动对非常偏离的预测进行更严重的惩罚,而不是接近的预测。如果数据集是不平衡的,你可能会想使用一个加权 Brier 分数,给予少数民族类更多的重视。这也可以用 4 行代码来完成:

from sklearn.metrics import brier_score_loss
positive_weight = (len(y_true) - sum(y_true)) / sum(y_true)
sample_weight = [positive_weight if i == 1 else 1 for i in y_true]
brier_score_loss(y_true, y_pred, sample_weight=sample_weight)

现在,你可能已经注意到我明确提到我们处理了离散校准,这意味着模型的预测围绕真正的标签有多好。另一个同样重要的校准是连续校准,或概率校准。在这种情况下,校准意味着对于模型预测概率为 0.8 的所有样本,80%确实来自阳性类别。但是这篇博文已经有点太长了,所以我们将在以后详细讨论这个问题。

最后的话

我们有时倾向于忽视,或者根本没有投入足够的精力去考虑如何度量我们的模型。就像 ML 世界中的每个问题需要不同的方法和算法一样,度量标准也是一样的——它们必须匹配数据和模型,以及你真正寻求模型实现的。没有选择正确的度量标准会蒙住你的眼睛,让你意识不到模型中的问题,或者提醒你注意噪音。我只能希望你发现这篇文章对你有用,无论你决定用什么尺度或标准来衡量它:-)

取自 Giphy.com

价值百万的问题:何时停止训练你的深度学习模型

原文:https://towardsdatascience.com/the-million-dollar-question-when-to-stop-training-deep-learning-models-fa9b488ac04d?source=collection_archive---------7-----------------------

关于早期停止,或者如何通过知道训练你的神经网络多长时间来避免过拟合或欠拟合

Icons8 团队在 Unsplash 上的照片

当训练深度神经网络时,首先要做出的决定之一是选择停止的时期。这并不容易。

如果训练在最佳时间之前停止,模型将没有时间从训练集中学习最重要的特征,因此为训练集和测试集提供不太适合的解决方案。

另一方面,如果在最佳时期之后停止训练,则在训练集中将实现高性能,但是当查看测试结果时,该模型将不会正确地概括,因为它已经过度调整到训练集。

幸运的是,有一种简单且广泛使用的方法可以避免这两个问题。它被称为早期停止,大多数深度学习框架都提供了一个开箱即用的接口来使用它。

几乎普遍应该使用早期停止。

— Ian Goodfellow 等人,深度学习。

提前停止

这种方法背后的思想在于训练集和测试集之间的比较,或者为了得到更可靠的结果,训练集和验证集之间的比较。

通过分析随着时代的过去,训练和验证分裂中的错误或损失图,我们将看到最初两者都减少了。然而,验证误差将在某个时间开始变平或增加,而训练误差将继续减小。

说明欠拟合和过拟合区域以及最佳停止时期的训练示例。

验证集的目的是让我们了解我们的模型如何处理未经训练的数据。因此,当验证误差开始增加时,正好是模型过度适应训练集并且没有正确地概括新数据的时候。这是我们需要停止训练的时候。

观察哪个指标?

虽然验证损失是对模型应用提前停止时广泛使用的指标,但它并不总是最相关的。

有时候,根据用例选择一个代表模型性能的指标可能会更好。例如,它可以是准确度、精确度、召回率或度量的组合。

具体什么时候停止?

现在,我们知道了应该观察哪些指标,以及当验证指标不再随着培训指标一起提高或者开始表现得更差时,我们应该停止。

但是,观察到的指标可能会有多次起伏(由于神经网络的随机性),这意味着在验证指标第一次变坏时就停止可能不是最佳解决方案(尽管这是最简单的方案)。

一些更复杂的停止训练的触发器如下(注意,它们也可以组合应用):

  • 观察到的度量在给定数量的时期内没有改善(称为提前停止 耐心)。
  • 观察到的度量没有改善超过给定的被认为是改善的最小变化(称为 min_delta )。

请注意,当使用提前停止耐心时,当监控的精度没有超过在过去 X 个时期获得的最佳结果时,将执行触发。如果它提高了,但没有超过最好的结果,那就不算数。

如何在 TensorFlow 上使用?

Keras API 在 model.fit() 上提供了一个回调函数,用于在受监控的指标停止改善时停止训练。

指标参数接收您想要观察的指标的名称。在引用验证度量的情况下(更真实的结果,因为它近似于您的模型在生产中的行为),名称必须以前缀“val_”开头。请注意,验证集必须传递给 model.fit() ,以便包含验证指标。

此外,您可以指定耐心min_delta ,如前一节所述。最后,模式参数指定所需结果是从高到低(最小模式)还是从低到高(最大模式)。例如,监控精度时,模式应为最大。

callback = [tf.keras.callbacks.EarlyStopping](https://keras.io/api/callbacks/early_stopping/)(monitor="val_loss",min_delta=0,patience=0,verbose=0,mode="auto",baseline=None,restore_best_weights=False,
)

这个回调还提供了一个参数restore_best_weights,用在性能最好的时期获得的模型权重来恢复结果模型。

要使用提前停止回调,我们只需将对象传递给 model.fit()中的 callbacks 参数,如下所示:

model.fit(train_images, train_labels, epochs=10, batch_size=1, callbacks=[callback], verbose=0)

如何观察多个指标?

根据您的使用情况,提前停止回调可能是不够的。例如,如果有一个带有多个输出的模型,并且想要监控一组指标而不是一个指标。或者诸如给定精度和召回率的 F-beta 分数的组合度量。

为了解决这个问题,你可以找到一个我基于 Keras 文档中的可用实现和一个 StackOverflow 问题开发的自定义回调。它接收一个指标名称参数,在这里,您可以指定一组指标,而不是单个指标。为了组合这些指标,调和平均值的计算通常用于比率。

自定义提前停止回调,通过使用调和平均值计算将多个指标组合起来来监控它们。

在代码的最后,您可以找到一个示例,说明如何使用验证 f1 分数作为监控指标(即验证精度和召回率之间的调和平均值)来创建提前停止的回调。

有什么值得推荐的耐心

大多数情况下,这个问题的答案在很大程度上取决于您使用的模型和数据集。

从我的经验来看,我建议首先运行一个具有大量历元的训练阶段,并从结果中直观地观察所监控的指标何时开始下降以及下降的速率。在那之后,我会用一些额外的时期运行下面的实验,直到它开始饱和,随着时期数量的减少,耐心会显著减少,同时记住,如果结果非常随机,耐心应该更大。

结论

在本文中,开发机器学习模型时最常见的挑战之一已经得到解决:何时停止训练。本文详细介绍了广泛使用的解决方案提前停止,解释了更高级的技术,如复杂的提前停止触发器以获得最佳结果,以及如何通过实现自定义回调来监控多个指标。

如果你想发现更多像这样的帖子,你可以在下面找到我:

  • GitHub
  • 领英
  • 个人网站

SQL 中视图的误解

原文:https://towardsdatascience.com/the-misconception-of-views-in-sql-92fa9fe8b89b?source=collection_archive---------16-----------------------

不是每个人都知道的 SQL 表的隐藏伪装

图片来自 Pixabay 由奇莫诺(https://pix abay . com/illustrations/question-mark-important-sign-1872665/)

I magine 您的团队领导告诉您,数据库管理员授予您从关系数据库(MySQL)访问特定表的权限,您可以使用这些表来执行数据分析或构建机器学习模型。后来,您意识到一些记录需要数据清理,您被分配了一个简单的任务,帮助您的团队领导直接在 SQL 上修改这些记录。当您使用像 UPDATE 和 SET 这样的关键字来执行简单的 SQL 更新操作时,您会遇到这个奇怪的错误,“错误代码:1288。更新的目标表< table_name >不可更新

接下来您可能要做的事情是使用以下 MySQL 命令检查目标表是否不可更新:

SELECT table_name, is_updatable
FROM **information_schema.views**

当您发现该表不接受来自您这一端的更新操作时,您联系您的数据库管理员,请求更新该特定表的权限。稍后,数据库管理员回复如下:“您的更新操作似乎不成功,因为您访问的表是一个不可更新的视图,这是由用于生成视图的后端查询决定的。

图片来自 Sammy-Sander 的 pix abay()https://pix abay . com/photos/man-hearther-affective-flowered-5531026/)

如果您在与 SQL 数据库交互时第一次听到“view”这个词,那么这个响应可能会给您带来更多的困惑。作为一个在 SQL 中使用视图的初学者,我需要为您澄清一些误解,以便您在将来遇到视图时能够掌握使用视图进行数据分析。

误解 1:“视图”和“表格”术语是可以互换的。

SQL 中的视图和表不都意味着这些查询的输出是结构化的表格格式吗?虽然从最终用户的角度来看,这是不可否认的事实,但这两个术语之间存在微妙的差异,非 SQL 专家容易混淆。SQL 中的表是以结构化方式包含数据本身的数据库对象,而 SQL 中的视图是表示“虚拟”表中保存的选择查询的数据库对象。

你注意到这两个术语之间的重要区别了吗?视图与 SQL 中的表不同,因为视图不像表那样在内存中存储任何现有数据。每当您在 SQL 中与视图进行交互时,您实际上是在运行一个未知的后端查询,该查询获取存储在您可能无法直接访问的表中的相关信息。

图片来自 Pixabay 由 openclippart-Vectors(【https://pixabay.com/vectors/deceive-deception-lies-1299043/】)

大多数数据分析师和数据科学家在从 RDBMS(关系数据库管理系统)接收内部或外部数据时,应该意识到术语上的这种差异。有时,当您认为从 RDBMS 接收的数据源是真实的来源时,出于隐私或安全原因,该底层数据源可能有一些隐藏的真实情况。

SQL 中的视图可以方便地隐藏敏感信息或复杂的查询,这些查询用于生成其他利益相关者经常使用的结果。有时,对于进一步的数据分析或机器学习任务至关重要的属性存储在 RDBMS 的表中,但无意中被排除在视图之外。拥有从 SQL 视图中查询数据的附加信息,可以节省您与数据库管理员沟通以获取进一步数据分析工作所需信息的大量时间。

那么,您如何知道您查询的是视图中的数据而不是表中的数据呢?以下命令非常简单,您可以快速检查是否正在使用 SQL 表或视图:

SHOW FULL TABLES -- For MySQL only

请注意,不同的 SQL 工具可能使用不同的语法来检查数据库的表或视图的详细信息。快速的谷歌搜索会给你各种 SQL 工具使用的确切语法的答案。

误解 2: SQL 视图不可更新,因为数据库管理员不提供更新权限

图片来自 Alpha Stock Images 的 Nick Youngson(https://www . thebluediamonggallery . com/typewriter/d/database-administrator . html)

与视图交互的 SQL 用户可能会误解视图不可更新,因为数据库管理员没有为他们提供更新记录的权限。这种说法是一种误解,需要进一步澄清。尽管数据库管理员允许您更新 SQL 中的记录,但是对于不可更新的视图,您无能为力。

由于视图通常会屏蔽后端的 SQL 查询,某些 SQL 视图规范是不可更新的,这是使用视图的一个缺点。关于最新 MySQL 版本中可更新的视图,您可以参考下面的 MySQL 官方文档:

https://dev . MySQL . com/doc/ref man/8.0/en/view-updatability . html

不同的 SQL 软件可能有不同的限制,这些限制与随时间变化的视图有关,所以我强烈建议您查看您选择的 SQL 工具的官方文档,以了解更多详细信息。

误解 3:如果我的 SQL 查询运行非常慢,提高查询性能的解决方案是使用视图。

图片来自 pix abay by 422737()https://pix abay . com/photos/Google-www-search-online-seek-485611/)

这种情况在谷歌上是一个很常见的问题,尤其是在基于我自己的谷歌搜索的 StackOverflow 社区上。也许,这是我们需要讨论的关于 SQL 视图的最大误解之一。一些论坛已经从理论上澄清了这种误解,所以我想通过自己在 Stack Exchange 的“比特币”相关主题的数据转储源中进行测试来揭穿这一点。

感谢 Stack Exchange 社区为各种讨论主题编译了广泛的数据集。使用的以下数据集可以从下面的主页获得:https://archive.org/details/stackexchange

包含将数据导入 MySQL 所需的 XML 文件的确切 zip 文件来自下面的直接链接:

https://archive . org/download/stack exchange/bit coin . stack exchange . com . 7z

为了将数据从 XML 导入 MySQL,需要使用下面的代码预定义实际数据库模式的子集:

**CREATE DATABASE bitcoin;
USE bitcoin;****CREATE TABLE Users**(Id int primary key,Reputation int,CreationDate datetime,DisplayName varchar(100),LastAccessDate datetime,WebsiteUrl text,Location varchar(100),AboutMe longtext,Views int,UpVotes int,DownVotes int,AccountId int
);**CREATE TABLE badges**(Id int primary key,UserId int,foreign key (UserId) references users(Id),Name varchar(100),Date datetime,Class varchar(10),TagBased varchar(100)
);**CREATE TABLE comments**(Id int primary key,PostId int,foreign key (PostId) references posts(Id),Score int,Text longtext,CreationDate datetime,UserId int,foreign key (UserId) references users(Id),ContentLicense text
);

使用 Windows 命令行界面,以下代码在登录后直接将 XML 文件导入 MySQL:

**LOAD DATA LOCAL INFILE ‘<file path>’ INTO TABLE <table name>**

假设下面的查询获得了图 1 所示的结果:

SELECT users.Id, users.Reputation, users.DisplayName, users.Location, users.Views, badges.Name, 
badges.Class, comments.Text, comments.Score, comments.CreationDate
**FROM users**
**LEFT JOIN badges** ON users.Id = badges.UserId
**LEFT JOIN comments** ON users.Id = comments.UserId

图 1:上述 SQL 查询的结果(图片由作者提供)

下面的图 2 显示了不使用视图的查询执行统计。

图 2:不使用视图的查询执行统计(作者图片)

为了验证视图提高 SQL 查询性能的神话,下面的 SQL 操作使用相同的查询创建名为 user_info 的视图,以获得上面图 1 所示的结果:

**CREATE VIEW user_info** AS
SELECT users.Id, users.Reputation, users.DisplayName, users.Location, users.Views, badges.Name, 
badges.Class, comments.Text, comments.Score, comments.CreationDate
FROM users
LEFT JOIN badges ON users.Id = badges.UserId
LEFT JOIN comments ON users.Id = comments.UserId;**SELECT * FROM user_info;**

下面的图 3 显示了对同一个问题语句使用视图的查询执行统计。

图 3:使用视图的查询执行统计(按作者分类的图片)

通过比较图 2 和图 3,执行这个 SQL 查询所用的时间非常相似(2 分 25 秒),只有毫秒的微小差异。通过这两个示例,使用 SQL 视图并不能提高 SQL 查询的性能,因为 SQL 视图只存储已保存的 SQL 查询,而不存储执行前生成的任何结果。您可以通过比较带有视图的 SQL 查询和不带视图的 SQL 查询来测试一下性能差异。

希望我已经澄清了一些您听说过的关于 SQL 视图的常见误解。视图是数据分析师和数据科学家在使用关系数据库时应该了解的一个基本概念。虽然视图是一种方便的工具,可以通过简单、频繁的查询提供更容易的数据读取访问,但是不应该在所有 SQL 查询中误用视图,因为它有其局限性。

下次再见,查询愉快!

请随意查看我的其他一些关于在 SQL 中使用关系数据库的文章。

https://selectfrom.dev/sql-performance-of-window-functions-vs-subqueries-on-big-data-3fa533fc64bf

深度多时相卫星图像超分辨率中缺失的成分

原文:https://towardsdatascience.com/the-missing-ingredient-in-deep-multi-temporal-satellite-image-super-resolution-78cac0f063d9?source=collection_archive---------19-----------------------

思想和理论

置换不变性在单个模型中利用了集成的力量

多时相卫星图像实现超分辨率。修改欧空局哥白尼哨兵 2 数据,根据 CC BY-SA 3.0 IGO 许可。

由卫星获取的图像的空间分辨率永远不够,对于能够显示越来越精细的细节的图像,全球各地的精准农业、灾害监测和可持续发展等应用都有着持续的需求。

多时相图像是一个场景的快照,它是通过多次重访卫星获得的,可能需要几天或几个月的时间。正如我们在上一篇文章中解释的那样,多时相图像是提高图像分辨率的关键,但它们必须由复杂的深度学习模型仔细处理,以充分利用它们的信息,同时管理精确配准、场景内容变化等挑战。

受欧洲航天局 Proba-V 超分辨率挑战的刺激,卫星图像的多图像超分辨率(MISR)主题经历了一系列的研究活动,导致了几种有趣的深度学习方法,如 DeepSUM 、 HighRes-net 和 RAMS 。

丢失的一块

时间顺序在卫星 MISR 中并不重要。我们需要对时间排列不变的模型。

然而,现有技术缺少有效深度模型的一个关键要素:对时间置换的不变性。动机是输入低分辨率多时相图像的特定顺序对于模型产生超分辨率产品并不重要。时间排序不携带相关信息,因为不存在作为时间函数的相关模式,该相关模式可以在一些训练数据上学习,然后在测试中发现和利用。事实上,时间变化更不可预测,因为它有许多来源(云、光照、季节变化、人类活动等)。)和多时态集合的收集中涉及的时间尺度,通常以天为单位。这与视频序列形成了鲜明的对比,在视频序列中,由于从一帧到下一帧的运动的因果演变,排序确实很重要,这是由于所涉及的时间尺度短得多(毫秒分隔连续的帧)。

当 RAMS 的作者通过随机改变输入图像的时间顺序,然后对超分辨率输出进行平均来测试他们的方法时,这种现象的暗示已经出现在文献中。据观察,这个时间集合提高了性能!然而,运行模型几次并希望一些随机抽取的排列能帮助你,这显然是非常昂贵的。

PIUnet:完全不变的模型

问题的解决方案已经在最近一部名为 PIUnet (排列不变性和不确定性网络)的作品中介绍。

皮乌内建筑。图来自https://arxiv.org/abs/2105.12409。

PIUnet 为 MISR 重新定义了神经网络体系结构的构建块,从而通过设计使其对时间置换完全不变。这允许 PIUnet 保证对于输入的任何时间排列都返回相同的精确输出。PIUnet 的主要设计原理是通过使用等变层实现置换不变性,即当输入被暂时置换时,其输出仍然相同但被置换的层。如图所示,然后通过用平均操作折叠时间维度,将等方差转化为不变性。

更详细地,该架构在精神上类似于单图像超分辨率中使用的注意力网络,以及用于卫星 MISR 的 DeepSUM 和 RAMS 作品,但是在主要构建块中具有等变操作,这些是 TEFA (时变特征注意力),以及 TERN (时变配准网络)。这些模块的核心是如何以等变方式提取时空特征。这是通过分离空间和时间维度来实现的。空间特征通过卷积来提取,卷积的核在时间上是共享的。然后,多个时刻的空间特征与自我注意操作相混合。因《变形金刚》而流行的自我关注,在设计上是置换等变的,因为它依赖于计算所有瞬间的成对互相关。顺便提一下,自我关注的等方差也是变形金刚需要某种位置编码的原因,如果他们想利用排序的话。

TEFA 街区。图来自https://arxiv.org/abs/2105.12409。

TEFA 然后修改经典的特征注意范式,以利用这种等变时空特征提取。

燕鸥街区。图来自https://arxiv.org/abs/2105.12409。

TERN 另一方面是 RegNet 的等变版本,在 DeepSUM 中提出,这是一种计算自适应滤波器的方法,即其内核作为输入函数计算的滤波器,可以执行图像之间的插值和微调配准。请注意,TERN 不依赖于选择参考图像来注册其他图像,而是允许所有图像同时彼此注册。

不错!有什么好的吗?

PIUnet 已经在现在经典的 Proba-V 数据集上进行了测试,并显示了一些令人印象深刻的结果,改善了最先进的技术。特别有趣的是,它如何在质量方面优于使用时态集成的其他方法的版本。这很有趣,因为这意味着 PIUnet 已经设法捕捉到了其模型中集合的丰富性。

这也意味着它可以比以前的模型在计算上更加高效,并且在利用可用的训练数据方面更加有效,因为它不会浪费数据来学习如何处理排序,而事实上,排序并不重要。

PIUnet 比运行临时集合模型要快得多。

PIUnet 处理训练数据的效率更高,仅用 25%的数据就达到了挑战赛冠军 DeepSUM 的质量。

除了在 Proba-V 挑战数据集上达到最先进水平,PIUnet 还在最近的 AI4EO 挑战中展示了其在增强 Sentinel 2 农业方面的实力。在这一挑战中,来自 Sentinel 2 的多时相图像可用于制作耕作区域的超分辨率分割图。虽然 Sentinel 2 的最大分辨率为每像素 10 米,但它被要求以每像素 2.5 米的分辨率制作分割地图。对 PIUnet 做了一个小小的修改,增加了一个分段头,使得赢得了挑战

在 AI4EO 增强型农业挑战赛中,PIUnet 用于预测来自多个 1000 万 Sentinel2 图像的 2.5 米分割图。

结论和进一步阅读

置换不变性似乎是多时相图像超分辨率中的一个基本概念,利用它可以为该任务建立新一代深度学习模型。PIUnet 论文包含更多值得阅读的细节,例如量化任意不确定性(PIUnet 中的“U ”)对于可解释的人工智能模型的重要性,以及它与图像中时间变化的关系,但这可能是另一个时代的故事。

皮乌内纸:【https://arxiv.org/abs/2105.12409

皮内代码:https://github.com/diegovalsesia/piunet

数据发现和可观测性平台的缺失部分:元数据的开放标准

原文:https://towardsdatascience.com/the-missing-piece-of-data-discovery-and-observability-platforms-open-standard-for-metadata-37dac2d0503?source=collection_archive---------9-----------------------

行业笔记

什么可以实现真正的大规模数据民主化?

图片由来自 unsplash.com的迈克尔·泽兹奇

数据是企业最重要但仍被低估的资产。公司如何决定他们的数据基础设施,决定了在未来的几十年里,谁将存活,谁将失败。

我们最近的文章“ 功能存储作为机器学习的基础 ”涵盖了大数据工具领域的最新变化。作为传统数据目录的继承者数据可观测性平台和内部全球数据目录的出现是最深刻的转变之一。

在本文中,我们将讨论为什么传统数据目录越来越难以满足数据驱动型企业及其数据运营的关键需求,现代数据平台缺少哪些关键部分,以及现代下一代数据平台可能会是什么样子。

介绍

2010 年标志着数据目录的全盛时期。尽管如此,对数据驱动型企业的采访显示,90%的数据专业人员对数据发现不满意,他们报告说数据发现占用了他们多达 50%的工作时间(T21)。原因是什么?

大数据的爆炸式增长重塑了数据专业人员的需求以及他们对工具的期望。数据量、解决方案的数量以及数据管道的复杂性都在飞速增长。再加上组织中与他们打交道的人越来越多,这带来了一系列前所未有的全新基础架构挑战。

尽管在过去十年中付出了很多努力,但用于交换元数据和构建可扩展开放数据平台的基础设施仍处于起步阶段。孤立的元数据格式和工具无法通信,成为阻碍数据民主化和真正的端到端、企业范围的数据发现和可观察性的主要瓶颈。

虽然公司急于为其功能购买数据目录,而不关注他们如何收集、存储和管理数据,但集成解决方案的缺乏导致了复杂的数据管道,迫使组织跳过许多环节来整合一切,而不是获得可操作的见解。

缺乏统一和简化元数据收集的坚实基础层阻碍了许多重要的开发和可伸缩性。此外,为了使数据民主化并使其更加开放和可观察,我们转向倾向于锁定元数据的解决方案,这难道不是一个悖论吗?

数据目录的优势

数据优先的组织一直在寻求改善对其数据的理解和管理,数据是推动业务价值的关键资源。

在数据编目之前的很长一段时间里,知道数据在哪里并获得适当的上下文来评估数据一直是一个挑战。人们每次都得四处打听。因此,数据发现和评估花费了太多时间。公司需要将多个孤立的数据源置于公司范围内可访问的单一用户界面下,以实现数据民主化。

数据目录的出现解决了这一挑战,并成为更好的数据发现的重要一步。它们成为公司中任何人查找数据、评估数据以及了解谁在以何种方式使用数据的中心点。

如今,数据目录为数据驱动型公司提供了重要优势:

  1. 收集和集中公司的所有元数据
  2. 了解数据的相关性,谁以及如何使用数据
  3. 提供信息以评估数据并决定它是否重要
  4. 提供数据管理工具,如搜索、网络、社交功能
  5. 更快的发现时间和价值实现时间

数据目录让数据优先组织的生活变得更加轻松。如果您需要组织数据,可以采用像 Amundsen 这样的开源数据目录,或者购买 SaaS 解决方案,使您的数据可以立即被发现。

当前趋势

数据发现解决方案领域目前正在发生三大转变:

  1. 从一般的数据目录到特意制作的。数据目录正变得越来越专业化,越来越适合各种数据团队和用户组(数据科学、数据工程等)的需求。
  2. 从数据目录到数据可观测平台。在过去几年中,数据质量和可观察性已经成为数据发现体验中不可或缺的一部分。光靠数据发现已经不够了,而且缺少很多重要的上下文。
  3. 从每个工具构建自己的元数据抓取器到一个共享的元数据标准。孤立的元数据收集成为主要瓶颈,降低了集成速度,并使数据管道和平台变得不必要的复杂。每个工具都编写自己的解析器集,而这些工作可以为了更大的利益而优化。

这些并行发生的转变可以帮助我们了解大数据生态系统的发展方向,以及现有解决方案中存在哪些差距阻碍我们实现这一目标。

缺少哪些数据目录?

数据目录很难跟上这一新的现实,也很难满足现代对更好集成、更快和更透明的工具集的要求,这些工具集将有助于解决数据停机问题。

根据对现有数据发现和可观察性工具的研究,这些似乎是数据目录难以跟上步伐的原因:

  1. 非标准化元数据集合
  2. 数据目录不兼容(需要重新收集数据)
  3. 有限,不是真正的公司范围的端到端数据谱系
  4. 数据质量和可观察性缺失或不足
  5. 不可发现的 ML 世界

现有数据目录和可观测性平台的常见高级缺点。图片作者。

缺乏一个通用的元数据标准阻碍了其他问题的解决。这个房间里的大象破坏了整个数据生态系统的集成可能性,并使数据发现效率低下。

让我们深入研究每个问题,然后看看如何解决它。

1.平台不兼容

在快速发展的数据和 ML 市场的热潮中,企业经常开始获取新的数据工具以保持领先。他们成熟了数据发现解决方案,部署了像 Amundsen 这样的数据目录,然后决定是时候提高可观察性,购买像 Monte Carlo 这样的产品,然后为他们的 MLOps 团队添加一个功能商店。

这种发光物体综合症可能非常适合立即灭火或做实验。但是,它会迅速扩大您的基础架构,并产生大量(通常是隐藏的)开销。当一家公司选择简单的短期解决方案,而不是长期的战略投资时,它就产生了技术债务——返工的成本。您将不得不花费大量资源来部署这些工具,但是无法有效地使用它们,因为它们集成得不够好,并且需要继续重建,直到您有一个可持续的解决方案。

数据目录以及可观测性工具和要素存储分别收集数据。他们中的大多数使用不兼容的数据格式,并且倾向于供应商锁定元数据。当您想要切换到另一个目录或向现有基础架构添加一个目录时,您必须从头开始收集所有元数据。

向公司现有的数据网格中添加新的数据工具也是一件痛苦的事情。没有简单直接的方法可以做到这一点。您不能将一个数据目录作为数据源插入到另一个数据目录中,并在同一个 UI 中使用它们。

从数据网格的角度来看,大型科技公司越来越需要联合解决方案。中小型组织的自然增长不可避免地会让他们很快面临同样的问题。

随着大数据和 ML 行业的工具环境与日俱增,需要工作数据平台和真正数据民主化的数据驱动型企业不能将兼容性问题放在次要位置。

2.有限的数据血统

数据沿袭是数据可观察性的重要支柱。它提供数据管道事件的上下文,并通过显示相关的下游和上游资产来帮助定位问题。

数据目录在其特性中列出了端到端的数据谱系,这意味着公司管道的所有部分都存在于单个发现工具中。然而,随着现代数据环境复杂性的爆炸式增长,情况越来越不一样了。

真正的端到端血统只能存在于一个系统中,该系统包含一个组织在其所有发现解决方案中使用的所有数据实体。否则,它不能映射所有关键资产之间的依赖关系来提供可观察性。

现有数据目录提供的数据沿袭存在三个主要问题,阻碍了公司范围的可观察性和数据民主化:

  1. 没有数据联合= 所有数据资产没有公司范围的沿袭
  2. 只包括有限范围的数据实体,而没有 ML 实体
  3. 元数据没有增加数据质量信息

OpenLineage 规范对数据沿袭发现过程进行了标准化。然而,它没有涵盖数据湖和数据仓库世界之外的实体,如仪表板、ML 管道、ML 模型、特性存储,并且没有用关于数据剖析和数据质量测试的信息来丰富接收到的元数据。

3.无形的 ML/AI 世界

随着 ML(机器学习)的出现,相关实体(ML 管道、ML 实验、特征存储)已经成为数据领域不可或缺的一部分。然而,在现有的数据发现解决方案中,ML/AI 世界仍然不存在,也不可见。目前没有一个数据目录和可观测性平台将 ML 实体作为第一公民。

ML 世界完全不在当前的数据发现/可观察性生态系统中。图片作者。

不可发现的机器学习实体阻止了组织中的 ML 扩展到其全部潜力。他们的数据科学和数据工程团队不知道其他团队在做什么。

在 2021 年,数据驱动的公司在其数据发现生态系统中不能忽视 ML 世界。管理或扩展您无法发现和评估的东西是不可能的,并且在您的数据发现工作流中忽视 ML 是一个滑坡。

4.缺乏数据质量工具

如果您没有工具来监控您的数据管道中已知和不可预测的问题,那么您既不能控制数据停机时间,也不能进行伟大的数据发现。糟糕的数据会让机会远离你,即使你的渠道是完美的。

目前,大多数数据发现平台要么没有数据单元测试工具,要么难以正确实现。根据我们的研究,截至 2021 年,%55%的数据专业人员遇到数据质量问题的频率超过了他们认为可以接受的水平。

在两种类型的数据质量问题中,数据质量测试只能解决第一种问题:

  1. 已知的可预测问题可以预测和测试
  2. 难以预测和检测的未知“黑匣子”问题

使用像 Great Expectations 和 Deequ 这样的工具进行数据单元测试有助于捕捉可预测的、众所周知的数据问题。同时,数据管道和团队日益增加的复杂性使得数据停机管理成为数据操作中的核心问题。焦点迅速转移到数据质量的新领域,这是为了处理黑盒数据问题——数据可观察性。

5.数据可观察性不足

可观察性的出现有助于开发团队管理应用程序停机时间。现在,它在数据运营领域巧妙复出,帮助数据运营团队应对数据宕机。

虽然数据质量测试说明了已知的可预测问题,但可观察性需要涵盖未知问题。它不仅可以帮助您发现已经发生的问题,还可以主动预防其中的许多问题。

这是一个黑盒问题有多危险的例子。

黑盒数据问题的例子:未被注意的时间偏移

在跨越几个部门或/和涉及 ML 的管道中出现的一个典型的黑箱问题是,由于缺乏跨部门协作和数据转移的微妙性质,错误的数据会被忽视数周。

比方说,一家公司使用 ML 模型向其在线商店的客户推荐衣服。当用户浏览该网站时,它会根据用户资料和购物车数据提供相关产品列表。这是他们的数据和 ML 管道:

用于推荐 ML 模型的数据准备和 ML 模型训练管道。图片作者。

管道的主要步骤:

  1. 购物车上的数据、点击流和购买数据都在数据湖中
  2. 数据工程团队使用气流来 ETL 和发布数据到功能存储
  3. 数据科学团队使用来自功能商店的数据支持 Kubeflow 中的培训渠道
  4. 生产 ML 模型为电子商务网站提供建议

事件:数据迟到

比方说,数据工程团队将一个新版本的气流 ETL 管道部署到生产中。它计划在每天上午 12:00 运行。ML 培训管道每天凌晨 1:00 运行。算法发生变化,气流管道执行时间从 1 小时增加到 1.5 小时。现在气流管道在 ML 管道启动后终止,并且滞后。模型最终会持续运行前一天的过时数据。因此,推荐引擎不再考虑客户购物车的相关状态以及他们在一天中所做的购买。

像这样的事件很难被发现,因为负责管道不同部分的团队通常对彼此的工作没有足够的了解。数据工程团队不知道 ML 模型使用什么特性,数据科学团队不知道数据部分。结果,该模型无声无息地失败了,企业以不正确的推荐和失去信任和收入而告终。通常,像这样的案件需要很多天才能弄清楚发生了什么/在哪里/为什么会发生。

下一代元数据平台=发现+可观察性+开放标准?

我们认为,为了解决我们所描述的问题,下一代数据平台应该检查以下选项:

  1. 基于开放元数据标准
  2. 采用联盟策略来构建元目录
  3. 包括 ML 生态系统的一等公民
  4. 提供公司范围的数据发现和可观察性
  5. 与其他开放标准集成

努力应该从标准化元数据操作开始。与其将所有的工作分开处理,不得不像现在这样处理每一个新软件版本的中断,不如共同努力构建缺失的统一层。

该标准将确保由各种数据源产生的元数据的兼容性和一致性,允许快速和容易地集成任何源或目录。最重要的是,它将使整合工作共享,减轻所有利益相关者的负担,并加速整个大数据行业。

让我们设想这样一个开放的元数据标准。

1.综合数据质量

开放元数据标准可以利用与任何数据质量工具的集成,包括其他开放标准。例如,它可以使用 OpenTelemetry 作为数据质量监控和可观察性工具。

OpenTelemetry 将使用元数据来收集指标,监控它们的异常情况,并提醒数据资产所有者出现的问题。与此同时,开放元数据将使用元数据来建立端到端的血统,并以其他实体受影响的数据信息来丰富警报。

两个开放标准的集成:OpenTelemetry 和 Open Metadata。图片作者。

2.数据可观察性

下面是开放元数据+ OpenTelemetry 集成如何解决我们前面描述的推荐引擎的情况。

建议 ML 管道使用集成的 OpenMetadata 和 OpenTelemetry 标准来提供端到端的可观察性、数据质量和警报。图片作者。

OpenTelemetry 系统将向开放元数据传递警报。后者检查相关作业的计划,并用受问题影响的数据消费者的信息丰富警报。然后,OpenTelemetry 在第一次执行 ETL 之后——在新模型有机会对错误数据进行训练之前——将丰富的警报传递给受影响实体的所有者。

或者,管理员可以为开放元数据系统中的实体设置 SLA。它将提供端到端的沿袭,并从 OpenTelemetry 系统获取执行指标。受影响实体的所有者将收到 SLA 警报,其中包含管道执行的跟踪信息。有了它,他们将很容易确定他们的 SLA 发生了什么情况。

3.真正的端到端血统

为了促进数据产品上的端到端协作,沿袭需要是全公司范围的。只有这样,数据所有者才能全面了解数据如何在他们和其他所有者的资产之间流动,以及他们如何受到管道中其他地方的变化的影响。

我们认为,端到端的关系应该:

  1. 包括组织的所有数据资产
  2. 涵盖广泛的实体,包括 ML
  3. 使用数据分析和数据质量信息丰富元数据
  4. 显示数据资产从接收到最终产品(报告、模型等)的完整历史。)

这种沿袭将提供所有资产之间的连接和流动的完整上下文,并允许您知道当其他所有者的资产发生变化或中断时,您的资产会受到怎样的影响。

4.可发现的人工智能世界

在数据发现生态系统中包含 ML 基础设施是早就应该的。开放元数据标准将有助于在公司的数据目录和 ML 解决方案之间建立连接器,开始将用于训练 ML 模型的数据推入上游目录。

开放元数据标准允许从其他数据目录和 ML 解决方案(如功能存储)构建联合元目录。

开放元数据标准可以将 ML 实体作为数据发现基础设施的一等公民,使它们通过数据目录可见和可发现。

可发现的 ML 实体将极大地改善数据科学团队和它需要与之交换数据以构建 ML 模型的其他团队之间的协作。这将带来跨部门协作的新水平、数据发现的效率、质量以及数据产品的上市时间,这是很难高估的。

5.开放元数据标准

开放元数据是用于数据发现的开源行业标准。它提供了一套从云原生应用程序和基础架构中收集和导出元数据的技术,以供发现。该标准定义了元数据收集的模式,并通过端点与数据工具集成,以从它们接收元数据。

参考实现

开放元数据标准将允许构建具有分层或水平联合的全球联合数据目录。下面是这种元目录的参考架构示例。

实施开放元数据标准的参考体系结构联合了两个数据目录,并通过推和拉策略收集元数据。图片作者。

示例全局目录为每个数据源采用分层联合、推拉策略和 API 来提供元发现体验。它所包含的所有数据目录和数据源都集中在一个具有细粒度访问权限的用户界面下。该解决方案可以通过适配器或 API 端点插入任意数量的数据目录或数据源来轻松扩展。它使用推送策略从已经发现的实体中收集元数据。

这样的元目录将使用户在每次需要使用另一个数据目录时不必重新收集元数据。与让您使用 AWS 服务复杂环境的其他解决方案不同,该解决方案只需要部署 PostgreSQL。

基于开放元数据标准构建的全局数据目录,在单一用户界面下联合组织各部门使用的数据目录,以受益于真正的端到端沿袭、可观察性、数据健康监控和 ML 数据资产的包含。图片作者。

基于开放元数据标准构建的元目录可以包含我们在这篇文章中谈到的所有重要机会:联合、真正的端到端血统、数据质量保证、公司范围的可观察性,并带来可发现的 ML 资产。

结论

旧数据方法和架构的遗产仍然影响着现代数据发现和可观察性。虽然数据管道比十年前超前了好几光年,但数据团队仍然不得不处理孤岛式解决方案,这使得他们将大部分时间花在数据发现或消除数据停机上,而不是构建数据产品。数据工具之间低效的元数据交换是如此平常,以至于被认为是不可避免的。

但不一定要这样。

我们分享了如何通过共同努力解决这一问题的愿景。像 OpenTelemetry 这样的成功先例表明,这种方法非常成功,对所有参与者都有巨大的好处。

收集元数据的开放标准可能成为缺乏有效发现和可观察性的合理解决方案,并为下一代数据平台奠定坚实的基础。

您在缺乏跨公司数据发现和可观察性方面的体验如何?如果您的组织正在考虑构建一个内部元目录,我们想听听您在这个过程中遇到的挑战。

如何用数据撒谎

原文:https://towardsdatascience.com/the-misuse-of-data-and-statistics-3282a594d508?source=collection_archive---------33-----------------------

数据并不总能说明全部情况

吉列尔莫·贝拉尔德在 Unsplash 上拍摄的照片

统计学是一个非常强大的工具。它允许我们通过从数据中得出模式来更好地理解我们周围的世界。在当今世界,几乎每个行业都在应用统计学——医学调查、广告、销售,甚至法律。

但是,统计和数字是可以用来骗人的。它们可以被用来夸大、夸大事件,并推动政治议程。

在我们今天生活的世界中,滥用统计数据的后果可能是灾难性的。错误信息可以像野火一样在互联网上传播,声称它们是由“科学证据”支持的。

你所需要做的就是挑选一张支持你的议程的图表,用一个误导性的标题发布到互联网上,这将立刻引发公众的愤怒。

在这篇文章中,我将向你展示一些统计数据如何被用来误导人们的例子。这些病例的严重程度各不相同。

他们中的一些人很傻,几天后被一笑置之并被遗忘。其他的后果很严重——让人们失去工作、名誉,在某些情况下甚至失去生命。

案例 1:操纵数据以适应叙述

数据可以用来向人们展示你想让他们看到的东西。它可以被操纵来讲述完整故事的不同版本。与事实相差甚远的版本。

在 Unsplash 上 Dainis Graveris 的照片

1973 年,加州大学伯克利分校因性别歧视被起诉。这背后的原因是他们的录取过程,这表明他们对女性考生的录取率比男性考生低很多。

男性考生的录取率为 44%,而女性考生仅为 35%。

这显示了明显的性别差异,伯克利成为首批因性别歧视被起诉的大学之一

然后统计学家通过检查每个系的学生录取率来研究这个问题。

经过检查,他们发现了一些有趣的东西。似乎伯克利的录取系统存在偏见。

然而,这种偏见似乎有利于女性,而不利于男性。

这与最初指控伯克利偏向男性候选人而不是女性候选人的说法正好相反。

诉讼自然不了了之。

这是怎么发生的?

为了更好地理解这种情况,让我们来看看这两种说法背后的一些数据:

权利要求 1

伯克利的总体录取率是男性考生比女性考生高得多。有一种偏向男性的性别偏见。

权利要求 2

伯克利不同院系的录取率女性考生比男性考生高得多。有一种偏向女性的性别偏见。

这是支持第一种说法的数据。这是所有部门男女候选人的总体接受率:

作者图片

事实上,可以看出,男性候选人的接受率远远高于女性。

现在,让我们来分解这些数据。我们将看看伯克利每个系的男女考生的录取率。

(在本例中,我只介绍了部门 A、B、C 和 d)。

A 部

作者图片

当看一看部门 A 时,我们看到与上面的主张完全相反的情况。

女性的接受率比男性高得多。另外,请记住,在 A 部门,女性申请人远远少于男性申请人。

B 部门

作者图片

观察 B 系,男女录取率无显著差异。

此外,请注意,该部门的女性申请人要少得多。

C 部门

作者图片

在 C 部,男女录取率没有显著差异。

注意,申请这个部门的女性比男性多得多。此外,注意到 C 系与之前的系相比,男女生的录取率都较低。

D 部门

作者图片

再次注意,D 部门的接受率相当低。本系男女录取率无显著差异。

结论

当看一看每个部门的数据时,你可以看到男性和女性的接受率没有显著差异。

事实上,在一些部门,女性候选人的录取率比男性候选人高得多——这与一开始的说法正好相反。

男性的总体录取率更高,因为女性倾向于申请竞争更激烈的部门。

女性更多申请 C 和 D 等录取率较低的部门。

男性更多地申请像 A 和 B 这样的部门,它们的录取率更高。

因此,男性候选人的总体接受率高于女性。

有数据支持这两种说法:

  • 声明 1:录取过程中存在有利于男性的性别偏见。
  • 声明 2:录取过程存在有利于女性的性别偏见

用数据来验证这两种说法是可能的。通过向人们展示整个故事的一部分,你可以让他们看到你想让他们看到的东西。

这种现象被称为辛普森悖论

您可以观察单个数据组中的趋势,当这些组合并在一起时,趋势就会消失。

案例 2:相关性与因果性

图片来自 xkcd.com

你可能已经听过很多次了,相关性并不意味着因果关系。仅仅因为两个事件相互关联,并不意味着一个事件导致另一个事件。

让我们看几个例子来更好地理解相关性和因果关系。

示例 1

长发和一个人用洗发水的量是正相关的。

这是否意味着使用更多的洗发水会导致头发变长?

当然不是。

这意味着头发越长的人越倾向于使用更多的洗发水。

这是一个相当明显的例子,两个变量之间的因果关系对我们来说是显而易见的。

然而,情况并非总是如此。有时,变量 A 和 B 可能看起来相互关联。然而,还有第三个变量(变量 C)导致了这两者。

这被称为第三因谬误,下面举个例子来解释。

示例 2

照片由帕特里克·福尔在 Unsplash 拍摄

冰淇淋销售量的增加和森林火灾之间存在着正相关关系。

这是否意味着:

a)冰淇淋引发森林火灾?

运筹学

b)森林火灾导致冰淇淋销量增加?

这两种说法似乎都不正确。

事实上,还有第三个变量导致冰淇淋销量和森林火灾的增加。

加热

当外面很热的时候,更多的人出去买冰淇淋。因此,冰淇淋的销量增加了。

当气温高的时候,森林火灾的数量就会增加。

因此,我们看到冰淇淋销售和森林火灾之间存在关联的原因是,它们都是由第三个变量——热量——引起的。

借助于统计检验,很容易找到两个变量之间的相关性。

然而,更重要的是要明白,当两个变量相关时,一个不一定会导致另一个。

有可能是第三个变量导致了这两种情况,或者这种相关性只是巧合。

以下是分析师和统计学家发现的一些奇怪相关性的例子:

  • 食用人造黄油的夫妇往往离婚率更高。
  • 美国小姐的年龄和使用蒸汽或热物体的谋杀数量。
  • 尼古拉斯·凯奇在电影中的出现以及溺死在泳池中的人数。

如果你想了解更多关于虚假相关性的内容,我建议你访问这个网站。

案例 3:在法庭上滥用统计数据

由大卫·维克斯列尔在 Unsplash 上拍摄的照片

莎莉·克拉克案是一个臭名昭著的刑事案件,它说明了统计数据在法庭上的滥用。

1996 年 12 月,莎莉·克拉克独自在家带着她两个月大的婴儿。这个孩子似乎没有任何明显的健康问题。然而,一天晚上,人们发现他没有反应。她打电话叫了救护车,在多次抢救无效后,孩子被宣布死亡。

不到两年后,莎莉的第二个孩子在几乎相同的情况下被宣布死亡。

两个看似健康的婴儿在相似的情况下出生几个月后就去世了。因此,莎莉·克拉克因谋杀自己的婴儿而受到审判。

一位统计学家被召集到审判中,提供两个无法解释的婴儿死亡的可能性。

同一家庭中两个婴儿不明原因死亡的概率是 7300 万分之一。由于这种情况发生的可能性极小,萨莉·克拉克因谋杀她的两个孩子而被捕。

然而,在监狱度过三年后,克拉克的第二次上诉被维持。在审查证据时,她的新律师发现了一份病理学报告,显示她的第二个孩子感染了金黄色葡萄球菌。

此外,这两个事件(她两个孩子的死亡)不一定是独立的事件。

2002 年,数学教授雷·希尔得出结论,鉴于第一个婴儿死于婴儿猝死,第二个婴儿死于不明原因的概率可能高达 60 分之一。

莎莉·克拉克在监狱度过三年后被释放,但不久后被发现死在家中。

莎莉·克拉克案是误判的一个例子,是由法庭上滥用统计数据造成的。一位母亲被错判谋杀了她的婴儿,很快被发现死于酒精中毒。

统计是强大的,是帮助我们理解模式和更好地理解我们周围世界的工具。

然而,这些数字可以被操纵,可以用来误导和欺骗人们相信谎言。

由于这个原因,当你看到基于数字和图表的报告时,在下结论之前做适当的研究是很重要的。

最后,如果你想做一些关于这个主题的额外阅读,这里有一些资源:

  1. 统计数据的误用
  2. 关联 vs 因果
  3. 莎莉·克拉克案
  4. 统计定罪
  5. 辛普森悖论

感谢阅读!

米托 JupyterLab 扩展—生成 Python 的电子表格

原文:https://towardsdatascience.com/the-mito-jupyterlab-extension-a-spreadsheet-that-generates-python-b25d2c447d48?source=collection_archive---------7-----------------------

您可以将米托调用到您的 Jupyter 环境中,您所做的每个编辑都会在下面的代码单元格中生成等效的 Python。

约书亚·索蒂诺在 Unsplash 上拍摄的照片

米托是 Python 的电子表格接口

米托允许您将数据帧或 CSV 文件传递到电子表格界面。它有 Excel 的感觉,但是每次编辑都会在下面的代码单元格中生成等效的 Python。在最好的情况下,这可能是一个真正快速完成数据分析的方法。

用米托进行探索性数据分析(可视化由作者制作)

如果你错过了我关于米托的其他文章:

  • 米托——生成 Python 的电子表格

米托入门

这里是完整的安装说明。

要安装米托软件包,请在终端中运行以下命令:

python -m pip install mitoinstaller
python -m mitoinstaller install

然后在 Jupyter 实验室打开一个笔记本,调用一个 mitosheet:

import mitosheet
mitosheet.sheet()

在您的分析中,可以在任何时候调用 Mitosheet。您可以将数据帧作为工作表调用中的参数传递给 mitosheet。

mitosheet.sheet(df)

您可以使用“导入”按钮安装本地文件中的传入数据。

米托数据分析功能

米托提供了一系列功能,允许用户清理、争论和探索他们的数据。这些功能中的每一个都会在下面的代码单元中生成等效的 Python。

在米托,您可以:

  • 过滤器
  • 在枢轴上转动
  • 合并
  • 图表
  • 查看汇总统计数据
  • 使用电子表格公式
  • 还有更多…

对于每一次编辑,米托在下面的代码单元中生成熊猫代码,用户可以在他们的分析中继续或发送给同事。

下面是用米托制作数据透视表的样子:

带有米托的数据透视表(可视化由作者制作)

示例生成的数据透视表代码如下所示(代码是自动记录的):

# Pivoted ramen_ratings_csv into df3
unused_columns = ramen_ratings_csv.columns.difference(set(['Style']).union(set(['Brand'])).union(set({'Style'})))
tmp_df = ramen_ratings_csv.drop(unused_columns, axis=1)
pivot_table = tmp_df.pivot_table(index=['Style'],columns=['Brand'],values=['Style'],aggfunc={'Style': ['count']}
)# Flatten the column headers
pivot_table.columns = [flatten_column_header(col) for col in pivot_table.columns.values]

下面是查看列的汇总统计信息的过程:

米托统计摘要(作者可视化)

生成可视化代码

为 python 数据可视化获取正确的语法可能是一个耗时的过程。米托允许你在一个点击环境中生成图形,然后给你这些图形的等价代码。

创建图表后,单击复制图表代码按钮:

用米托制作图表(图片由作者制作)

然后将代码粘贴到任何代码单元格中。米托允许再现可视化过程。

米托生成代码(图片由作者制作)

结论

米托是一种快速生成 Python 代码的方法,尤其是对于那些熟悉 Excel 的人来说。它节省了大量的时间去堆栈溢出或谷歌的正确语法。

米托绝对值得一试,尽管它更有价值,因为它引入了更多的图形类型和更好的批量编辑能力(批量删除列、重命名等)。).

在你走之前

如果你喜欢看这些故事,为什么不成为 中等付费会员 ?每月 5 美元,你可以无限制地阅读 10000 个故事和作家。如果你用我的链接注册,我会赚一小笔佣金。**

照片由Courtney hedge在 Unsplash 上拍摄

MLOps 工程师角色:一个温和的介绍

原文:https://towardsdatascience.com/the-mlops-engineer-role-a-gentle-introduction-8d94cdc73904?source=collection_archive---------10-----------------------

你的工作不仅仅是建立模型

克里斯蒂安·维利奇科夫在 Unsplash 上拍摄的照片

一年前,当我自学数据科学时,我遇到了“MLOps 工程师”这个术语。我看了很多数据科学家的博文,他们强烈建议学习 MLOps 技巧。他们表示,如果这些模型不能用于生产,仅仅构建和训练模型是不够的。

在数据行业工作了将近两年后,我意识到这是完全正确的。如果不能部署数据科学模型并不断从新数据中学习,那么这些模型就毫无用处。

作为一名数据科学家,至少对 MLOps 有一个基本的了解是很重要的。在大多数公司,数据科学团队不仅负责构建和训练机器学习模型,还必须将它们投入生产。

数据科学家的工作范围通常包括整个数据科学生命周期——从收集数据到将 ML 模型部署到公司的服务器上。

不幸的是,大多数数据科学训练营和在线课程只教授学生模型培训。有太多的重点放在创建和评估机器学习模型上,这些课程几乎都没有涵盖模型建立后会发生什么。

在这篇文章中,我将试图澄清一些关于 MLOps 的误解,分解 MLOps 工程师的角色。

什么是 MLOps?

MLOps 是一套用于在生产中部署和维护机器学习模型的实践。

通俗地说,MLOps 涵盖了建模之后的所有内容。模型经过训练和评估后,就可以供最终用户使用了。然后,它可以对进入系统的新用户数据进行预测。

让我们以一个音乐流媒体网站上的简单推荐系统为例。

一旦基于过去的用户数据建立了模型,并且能够做出准确的预测,它就被部署在站点上。该模型将从网站上获取新数据,并为每个用户推荐歌曲。

我们为什么需要 MLOps?

在过去,机器学习工作流的模型构建方面非常重要。模型训练和评估被认为是数据科学生命周期中最耗时的方面,这项工作通常到此结束。

在经过训练的 ML 模型被部署之后,发生的所有事情都没有什么重要性。

然而,随着时间的推移,越来越明显的是,部署的机器学习模型开始表现不佳。在验证期间达到高准确度的模型仍然不能对进入系统的新用户数据做出正确的预测。

这归因于许多因素:

首先,根据旧数据训练的模型可能无法适应流入系统的新数据。

我们再拿推荐系统举例。随着用户开始扩大他们的歌曲选择,他们对音乐的品味发生变化,这种模式需要更新。

根据数据的性质,这些更新可能需要每月、每周甚至每小时进行一次。

b) 接下来,该模型可能无法归纳出它从未见过的数据。如果训练数据和真实世界的数据之间存在差异,ML 模型将无法在它被训练的领域之外很好地执行。如果不修复,这将导致预测不准确和性能不佳。

c) MLOps 工程师还需要确保训练数据使用与进入系统的真实数据相同的技术进行处理。需要对新数据应用相同的数据清理/预处理技术,以确保模型预测中没有差异。

d) 此外,由于所有这些都将实时完成,MLOps 工程师需要确保系统性能不会受到负面影响。这意味着他们需要重新分解数据科学家编写的代码,并对其进行优化,以确保高性能。

大多数公司使用云平台来部署和维护他们的机器学习模型。

作为一名数据科学家,探索这些平台及其 MLOps 解决方案是一个好主意。

如果您以前从事过数据科学项目,并且在您的 Jupyter 笔记本中有一些代码,尝试在线部署它可能是一个好主意。

像 Microsoft Azure 这样的平台甚至为您提供了一个 MLOps 管道,您可以修改它以适应您自己的用例。

你也可以尝试只使用云服务实现一个全栈机器学习项目,以便更好地了解从数据收集到部署/维护的端到端 ML 工作流。

如果您有兴趣学习更多关于模型部署的知识,我有两个教程可以帮助您入门:

  • 用 Flask 构建机器学习 web-app,用 GCP 部署
  • 使用 Heroku 部署机器学习网络应用

本文到此为止,感谢阅读!

本文原载此处。

模型已经装船了。会出什么问题呢?

原文:https://towardsdatascience.com/the-models-shipped-what-could-possibly-go-wrong-a657ad919868?source=collection_archive---------33-----------------------

ML 可观测性系列

第 2 部分:模型故障模式

Staples 按钮,但使其成为机器学习,作者图片

在我们的上一篇文章中,我们大致了解了模型的可观察性及其在机器学习工作流程中的作用。特别是,我们讨论了模型可观察性和模型监控工具在检测、诊断和解释已经部署到生产中的回归模型方面的前景。

这就引出了一个自然的问题:我应该在生产中监控什么?答案当然要看能出什么问题

在本文中,我们将提供一些更具体的潜在故障模式示例,以及它们在您的生产模型性能中表现出的最常见症状。

模型/概念漂移

与世界上大多数事情一样,模型的任务可能会随着时间的推移而改变。概念漂移模型漂移是一种模型故障模式,由模型执行的底层任务的变化引起,这可能会逐渐或突然导致模型性能的退化。

概念漂移,作者图片

概念漂移示例

换句话说,你的模型被训练去解决的任务可能不能准确地反映它现在在生产中所面临的任务。

例如,假设您正在尝试预测特定电影评论的情绪,并且您的模型是根据 20 世纪 70 年代早期的评论训练的。如果你的模型是好的,它可能已经了解到评论,“哇,那部电影是”带有负面情绪;然而,快进到 20 世纪 80 年代俚语的世界,完全相同的评论可能意味着这部电影太棒了。

所以模型的输入没有改变,但是结果改变了——发生了什么?自模型被训练以来,将自然语言映射到情感的基本任务已经发生了变化,导致模型开始在它过去预测正确的地方出错。

随着时间的推移,这种转变可能会逐渐发生,但正如这些天我们经常被提醒的那样,世界并不总是逐渐变化的。这种关于概念漂移何时会发生的根本不可预测性需要一套好的模型监控工具。

如果您注意到您的模型输入的分布没有太大变化,但是您的模型性能在退步,那么概念漂移可能是一个促成因素。

数据/特征漂移

数据是模型创建的核心,数据实践可以决定模型在生产中的表现。在现实世界中,您的模型输入的分布几乎肯定会随着时间的推移而改变,这导致了我们的下一个模型故障模式:数据漂移特征漂移

特征漂移,按作者分类的图像

特征偏离训练

让我们假设您刚刚部署了一个模型,该模型预测一张专辑在 Spotify 或 Apple Music 上的第一天将获得多少流量。既然您的模型已经部署到生产环境中有一段时间了,并且已经正确地预测了 Drake 的巨大成功,您开始注意到您的模型开始出现一些戏剧性的错误。

功能漂移对性能的影响,图片由作者提供

导致模型性能问题的特征漂移

*经过一些检查,你注意到一些新的艺术家和时尚流派吸引了大多数的流,你的模型在这些专辑上犯了很大的错误。
那么,到底哪里出了问题呢?

模型输入中的分布在统计上不同于它被训练时的分布。换句话说,你的数据已经漂移,你的模型现在已经过时了。就像概念漂移一样,数据漂移可能会慢慢地爬上你的模型,也可能会很快地撞上它。*

值得一提的重要一点是,将数据漂移与训练-生产偏斜混淆是很常见的。训练-生产偏差是指训练数据的分布与生产数据的分布有意义的不同。回到我们之前的例子,如果你只是用乡村音乐来训练你的专辑模型,当它看到一个新的爵士专辑点击发现标签时,它可能表现不好。

培训与生产绩效,作者形象

培训-生产偏差

在数据漂移和训练-生产偏斜的情况下,模型正在经历训练时没有看到的生产中的模型输入分布,这可能导致比验证模型时更差的性能。那么,我们如何区分这两者呢?

如果您的模型在部署后无法达到接近其验证性能,您可能会面临训练-生产偏斜,并且您可能需要重新考虑您的数据采样技术,以挑选更具代表性的数据集;但是,如果您的模型匹配在过去表现出良好的生产结果,并且您看到性能缓慢或突然下降,那么您很可能正在处理数据漂移的影响。

级联模型故障

随着机器学习模型席卷全球,产品包含大量机器学习组件变得越来越常见。在许多情况下,一个模型的输出甚至被直接或间接地用作另一个模型的输入。

由于这些模型通常是在它们自己的数据集上单独训练和验证的,因此必然会出现令人头疼的故障模式。虽然这两个模型的离线验证性能都有所提高,但是在一起部署时,它们会使产品整体退化。

*为了演示这个概念,让我们假设你在 Alexa 上工作。你的团队负责一个语音识别模型,将用户的语音转录成文本,而合作伙伴团队负责将这些转录的查询分类成 Alexa 可以为用户执行的动作。

有一天,你发现了一个突破,在验证数据集上,你的团队的语音识别结果提高了 10%;然而,当你在部署更新的模型后第二天回到办公桌时,你会看到 Alexa 在选择用户请求的动作的准确性方面出现了巨大的回归。*

发生了什么事?在对语音识别模型进行这种改变时,转录的话语的输出分布以统计上显著的方式改变了。由于这些输出是动作分类模型的输入,这导致了动作预测的回归,导致你的用户在他们只是想设置一个定时器的时候,坐着听完一首糟糕的歌曲。

为了诊断这些级联模型故障,模型可观测性工具必须能够跟踪每个模型的输入和输出分布的变化,以便能够查明哪个模型引入了整体性能的回归。

离群值

在前面的章节中,我们主要关注的是围绕模型性能的组统计数据;然而,有时你的模型在几个例子上的表现更令人担忧。

在理想的情况下,当您将模型部署到生产中时,不会有任何意外。不幸的是,我们并不是生活在一个理想的世界里。您的模型可能会面临异常输入,偶尔会产生异常结果。

有时候找到这些例子就像大海捞针。如果你找不到模型中的潜在问题,你就无法解决它。

离群值,按作者分类的图像

异常值:低维映射

了解异常值通常被视为对所有输入要素进行多变量分析,以找到异常值的单个预测。与上面的漂移描述形成对比,漂移描述实际上是一组预测中单个特征的一般统计。

漂移:预测组——特征或模型输出的单变量统计

异常值:单个预测或小组预测-跨特征的多元分析

模型所有者需要一道防线来检测和防范这些讨厌的输入。实现这一点的一种技术是采用无监督学习方法对模型输入和预测进行分类,从而允许您发现异常示例和预测的群组。

这就是模型可观察性工具在帮助您加强培训、评估、部署和监控循环方面的优势所在。

ML 工程师生命周期,作者图片

如果您看到一些不适合更典型的例子组的例子,这可能是您的模型从未见过的一些边缘情况的证据。在任何一种情况下,这些例子都可能是你在培训中包括和补充的很好的选择,以弥补这些差距。

对手

异常的例子可能只是偶然发生的,但也可能是试图欺骗您的模型的对手产生的。在许多业务关键应用程序中,尤其是在金融领域,模型所有者必须保持高度警惕,以监控旨在使模型以特定方式运行的敌对输入。

2018 年,谷歌引起了人们对机器学习图像分类模型的敌对攻击的关注,展示了人眼察觉不到的少量噪声如何添加到图像中,可能导致模型严重错误分类。

在每时每刻都很重要的应用程序中,您识别新攻击、修补漏洞和重新部署模型的速度可能会对您的业务成功产生重大影响。

总结

总之,有许多模型故障模式需要注意,它们很少孤立地影响你的模型。要拼凑出为什么您的模型的性能可能会下降,或者为什么您的模型在特定情况下表现不稳定,您必须有适当的测量来拼凑出正在发生的事情。模型监控工具填补了机器学习工作流中的这一角色,并使团队能够在模型发布后不断改进您的模型。

联系我们

如果这个博客引起了你的注意,并且你渴望了解更多关于机器学习可观察性和模型监控,请查看我们其他的博客和 ML 监控上的资源!如果您有兴趣加入一个有趣的 rockstar 工程团队,帮助模型成功生产,请随时联系我们,并在此处找到我们的空缺职位!

当我意识到数据科学证书不会推动我的职业发展时

原文:https://towardsdatascience.com/the-moment-i-realized-data-science-certificates-wont-push-my-career-forward-efe2d404ab72?source=collection_archive---------4-----------------------

成为数据科学家时,不要优先考虑证书

弗兰·霍根在 Unsplash 上的照片

我现在喜欢把自己当成一个企业家。我不再向直线经理或老板汇报工作,也没有规定我必须报告办公室的时间——尽管我为自己设定了一个时间来加强自律。

从 8 个月前下岗开始,我就一直在不断的寻找让自己进化,变得更好的方法;我再也不想觉得我必须把我的信念放在一份安全的工作上。

另外,我重视我的自由!

因此,我在不断地投资于自己,学习新的东西,无论是通过书籍、会议、MOOCs 等。

https://medium.com/analytics-vidhya/courses-to-learn-data-science-in-2021-a52e64344e5c

最近,我完成了一门关于投资股票市场的课程——当你把钱放在某个地方,它会帮你赚得更多,这总是好的。完成后,我获得了一份证书,祝贺我完成了课程。太好了!

我盯着它看了几秒钟…然后我合上了笔记本电脑。没什么大不了的。

但这让我开始思考。

我有没有想过把它分享给 LinkedIn?

绝对的!

想了想,我意识到这毫无意义——“分享这些对我、我的事业或者让我更接近我的目标有什么作用吗?”坦白地说,答案是否定的,所以我没有分享。

如果自我搔痒是你所寻找的,那么尽一切办法与世界分享你的证书

我们实话实说吧…

当我们与世界分享我们的荣誉和成功时,通常是为了我们的自我,但由于一些奇怪的原因,有人给我发消息说他们刚刚完成了一门课程,当他们在 LinkedIn 上分享时,没有人给他们发消息找工作,所以我应该把他们介绍给公司——这本身就是一个完全不同的问题(我下次再谈)。

听着,我不是说不分享你的成功。我一直在 Twitter 和 LinkedIn 上分享我在数据科学方面的成功,但我的意图有很大不同。当我分享我的致谢时,我不是在寻求任何新的机会,我知道我在寻求认可——我知道我的帖子会收到很多“祝贺”和“继续前进”。

我的观点是,为你已经取得的成就寻求外部认可绝对没有错,只要你意识到这样做的唯一结果将是自我提升。不是工作!

如果你正在寻求进入数据科学领域,那么我推荐任何人都可以做的三件事;

#1 创建博客/虚拟博客

数据科学博客对我的发展非常有帮助。我不仅每周花 20-30 个小时写新内容,而且我还消耗大量内容来帮助我做三件事;

  • 创意产生
  • 教育
  • 指导/导师

如果做得正确,在寻找数据科学工作时,没有理由不能将你的 Vlog/Blog 内容作为你投资组合的一部分。

#2 创建项目

参加一门课程而不学所学的知识,就像给汽车油箱加满油却从来不开一样。

完全是浪费钱!

通过创建深思熟虑的项目,然后与世界分享你的发现(例如,在 Github 上分享,在 LinkedIn 上分享,写博客等),确保你的知识得到检验。).

</5-ideas-for-your-next-nlp-project-c6bf5b86935c>

#3 参加竞赛和黑客马拉松

数据科学竞赛经常受到从业者的指责,因为他们没有抓住数据科学家的真实情况。在我看来,参加比赛仍然有很多价值可以汲取——当然,目标不是成为一个竞争但无法提供现实世界价值的人。

从竞赛和黑客马拉松中,你让自己接触到许多不同的解决问题的方法,你可以从这些想法中吸取经验,并在未来类似的问题中将其应用到你自己的解决方案中。

我的一个朋友 Vetrivel_PS 最近写了一篇文章,详细介绍了25 大机器学习& AI 黑客马拉松,供任何人转向数据科学。

最后的想法

从活动列表中,你只需要选择一项,每天花几个小时去做。最重要的是,你积极地运用你从课程中学到的东西,同时寻找新的方法来提高你的技能和解决问题的方法。

另外,我并不是说参加课程毫无意义——你需要参加课程来提升你的技能——我也不是说你不应该在网上与你的社交追随者分享它们。你绝对可以!我想说明的一点是,仅仅依靠证书来获得机会是完全荒谬的。如果你想看到结果,你必须把你学到的东西付诸行动。

感谢阅读!

如果你喜欢这篇文章,请通过订阅我的免费 每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。

相关文章

蒙蒂·霍尔问题

原文:https://towardsdatascience.com/the-monty-hall-problem-388f71a73e1?source=collection_archive---------29-----------------------

频率主义者模拟和贝叶斯计算

蒙蒂霍尔游戏的两种策略的获胜概率。请继续阅读,寻找最佳策略。

项目存储库

GitHub

介绍

最近,在一堂贝叶斯统计课上,我被要求编写一个 Monty Hall 游戏的模拟程序。我觉得有趣的是,我被要求使用一种频繁主义的方法来研究概率,以洞察被解释为贝叶斯问题的东西。我决定进一步调查,并提出我自己对正在发生的事情的贝叶斯理解。

对于那些不熟悉这个著名智力难题的人,请允许我列出这个游戏的规则和关键假设。蒙蒂·霍尔问题是以“让我们做笔交易”游戏节目的主持人命名的,遵循与该游戏相似的规则。一名参赛者面前有三扇相同的门,其中两扇是山羊,另一扇是汽车。然后要求参赛者宣布他们选择了哪扇门,另一扇门就会打开。它的内容会显示给玩家,然后主机会询问玩家是否愿意在车显示之前切换他们选择的车门。无论玩家此时做出何种选择,如果车在他们选择的门后面,他们就赢了。你应该花点时间想想在这种情况下你会怎么做,并记下来。在文章结束时,你可能会感到惊讶,或者对你的一些假设提出质疑。

随机选择

根据维基百科,虽然蒙蒂霍尔问题最初是在 1975 年提出的,但它在 1990 年作为一个问题被《游行》杂志的专栏作家提出后声名狼藉。这位专栏作家的正确解决方案引发了严厉的(而且很大程度上是不正确的)反弹。在深入研究模拟代码和数学解决方案之前,让我们先列出游戏的一些关键假设:

  • 车是随意摆放的。
  • 玩家随机选择他们的门。
  • 主持人总是打开玩家没有选择的一扇门(里面有一只山羊)。此外,如果玩家在游戏开始时选择了包含汽车的门,主机会随机进行选择。
  • 在装有山羊的门打开后,玩家总是可以选择更换门。

这些随机选择的假设在模拟代码中被大量使用,也是本文后面的数学计算的基础。如果这些假设发生变化,要么计算将采取不同的形式,要么潜在的概率将发生变化。维基百科的文章蒙蒂霍尔问题深入讨论了这些场景,供那些希望更深入探索它们的人参考。

模拟蒙蒂·霍尔:一种频繁主义的方法

频率主义者对事件概率的定义是该事件在多次试验中的相对频率的极限。我们将使用这个定义来模拟使用 python 的 Monty Hall 游戏的获胜概率。本文假设了一些 python 编码的基础知识,但是旨在引导初学者完成制作模拟器的步骤。

代码和解释

代码是为在 juypter 笔记本中使用而编写的,首先导入必要的库并将matplotlib设置为内联绘图:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

初始化我们的for循环中使用的空列表:

keep_count = [] # count of simulated wins if door is kept
change_count = [] # count of simulated wins if door is changed
P_keep = [] # proportion of keep wins after each game 
P_change = [] # proportion of a change wins after each game

for回路(这将在下面一条一条解释):

for i in range(number_of_games):doors = [1, 2, 3] # door labels# set the car doorcar_door = np.random.choice(range(1,4))# set the player doorplayer_door = np.random.choice(range(1,4)) # set the goats' doors given car door and player doorgoat_doors = [door for door in doors if\door != car_door and door != player_door]# set the door Monty reveals given the goat doorsrevealed_door = np.random.choice(goat_doors)# set the change door given player door and revealed doorchanged_door = [door for door in doors if\door != player_door and door\!= revealed_door]if player_door == car_door:  #  add one to keep winskeep_count.append(1)else:                        # keep one to losseskeep_count.append(0)if changed_door == car_door: # add one to change winschange_count.append(1)else:                        # add one to change losseschange_count.append(0)# proportion of keep wins in i gamesP_k_i = np.mean(keep_count[:i]) P_keep.append(P_k_i)# proportion of change wins i gamesP_c_i = np.mean(change_count[:i]) P_change.append(P_c_i)

在这个循环中有一些事情要做,所以为了清楚起见,我们将把它一部分一部分地分解。number_of_games将是一个整数,设置我们想要运行的模拟次数。对于每个游戏模拟,我们首先使用 numpy 的random.choice()将车门值随机设置为 1、2 或 3。

for i in range(number_of_games):doors = [1, 2, 3] # door labels# set the car doorcar_door = np.random.choice(range(1,4))

接下来,我们用同样的方法设置玩家门值。

# set the player door
player_door = np.random.choice(range(1,4))

我们现在使用一个列表理解前面两个步骤中的值来设置两个 goat door 值。我们正在形成一个包含两个值的列表,这两个值既不是汽车门值,也不是玩家门值。

# set the goat doors given car door and player door
goat_doors = [door for door in doors if\door != car_door and door != player_door]

现在,我们通过从两个山羊门值中随机选择来设置显示门值。

# set the door Monty reveals given the goat doors
revealed_door = np.random.choice(goat_doors)

接下来,我们根据玩家门值和显示门值设置更改门值。

# set the change door given player door and revealed door
changed_door = [door for door in doors if\door != player_door and door\!= revealed_door]

我们的下一步是根据上面选择的值计算赢和输的次数。我们只是检查玩家门的值是否与汽车门的值匹配,或者改变门的值是否与汽车门的值匹配。从上面单元格中的代码我们看到,这些是互斥的数字,因此其中一个数字必须匹配车门值并获胜,而另一个数字则失败。

if player_door == car_door:  #  add one to keep winskeep_count.append(1)
else:                        # add one to keep losseskeep_count.append(0)
if changed_door == car_door: # add one to change winschange_count.append(1)
else:                        # add one to change losseschange_count.append(0)

最后,在我们玩的游戏的每一次迭代中,我们计算保持和改变的相对获胜频率。回想一下,频率主义者对概率的定义是一个事件在多次试验中的相对频率的极限。

# proportion of keep wins in i games
P_k_i = np.mean(keep_count[:i]) 
P_keep.append(P_k_i)
# proportion of change wins i games
P_c_i = np.mean(change_count[:i]) 
P_change.append(P_c_i)

结果

运行 5000 个游戏的代码揭示了以下内容:

为胜利而改变大门!!!

Simulated Probabilities:
Probability of Winning if Door is Kept:	 	          0.34
Probability of Winning if Door is Changed:	          0.66

我们可以从可视化中看到,相对频率相当快地达到一个极限值(大约 1000 场),并保持稳定。这些是保持和改变策略的概率。在文章的最后,我将上面的代码封装在一个函数monty_hall(number_of_games)中,您可以复制它来运行您自己的模拟并方便地测试结果。

在文章的介绍中,当我问在天魔堂游戏中你的选择会是什么,你选择了什么?结果让你吃惊吗?如果他们这样做了,你是受人尊敬的公司。在 1990 年的争论中,许多博士级别的数学家和统计学家错误地计算了保持和改变的获胜概率为 0.5。在这个看似简单的游戏中,让业余爱好者和专家都感到困惑的幕后发生了什么?要解开这个谜团,需要一种贝叶斯概率方法。

计算蒙蒂·霍尔:贝叶斯方法

对贝叶斯概率的非正式理解是,事件的概率不是某个固定的、客观的量。对于贝叶斯来说,如果你从一个关于事件概率的先验假设开始,随后收到与该事件相关的新信息,你应该更新你对事件概率的理解。这个概念在贝叶斯定理中被形式化了:

P(A|B) = P(B|A)P(A)/P(B)

给定事件 A 的先验概率[P(A) ],后验概率(由新信息 B 更新)[ P(A|B)]是先验概率[P(A)]乘以新信息 B 的可能性,给定事件 A 发生[P(B|A)/P(B)]。

从直觉上来说,这种方法是有意义的,我们每天都在进行这种类型的推理,同时在生活中导航。当走在拥挤的街道上或驾驶汽车时,我们下意识地根据一系列不断更新的信息评估和重新评估事件的可能性。我们将采用这种强大的推理技术,并将其应用于 Monty Hall 问题,看看我们是否能弄清楚正在发生的事情。

计算蒙蒂·霍尔问题的概率

鉴于蒙蒂霍尔问题的条件:

让我们的事件如下:

A =汽车在玩家选择的门后面的事件。

B =山羊出现在非玩家选择的门后的事件。

然后,

P(A) = 1/3,因为有三个门,一个门包含汽车。

P(A') = 2/3,因为 P(A) + P(A') = 1 由事件的补的定义。

P(B|A) = P(B|A') = 1,因为玩家没有选择的门后面的山羊总是会出现。

因此形式上,

P(B)= P(B | A)P(A)+P(B | A ')P(A ')= 1(1/3)+1(2/3)= 1

所以,

根据贝叶斯定理,P(A | B)= P(B | A)P(A)/P(B)= 1(1/3)/1 = 1/3。

因为,

P(A|B) + P(A'|B) = 1 根据事件的补的定义,

我们有 P(A'|B) = 1 — P(A|B) = 1 — (1/3) = 2/3。

结果

我们刚刚已经表明,汽车不在玩家原来的门后面的概率是 2/3,所以在蒙蒂大厅游戏中的最优策略是总是换门。这一发现与我们上面运行的模拟是一致的。在游戏中剩下两扇门的情况下,任何一扇门的概率都不会是 50–50,这似乎有悖常理,但我们必须考虑到当主人打开门并展示山羊时我们获得的信息。

由于 P(A|B) = P(A),我们看到事件 B 的发生并没有更新事件 A 的概率。P(A)保持 1/3,A '的概率也保持 2/3 不变。然而,事件 A '已经被简化为玩家在游戏开始时没有选择的剩余门后面的汽车。因此,由于事件 b 提供的新信息,备用门包含汽车的概率从游戏开始时的 1/3 增加到 2/3。

结论

希望这篇文章能帮助你对 Monty Hall 问题及其背后的数学有所了解。我将模拟代码包装在一个函数中,以便快速运行多个测试。不过要预先警告,对于非常多的游戏,这个函数可能需要相当长的时间才能返回结果。

蒙蒂霍尔模拟器功能

def monty_hall(number_of_games):"""A simulation of the monty hall game.Args: number_of_games: An integer n specifying the number of games  to be simulated.Returns: Prints the simulated probabilities of winningfor each strategy after n games, and a graph of the simulated probabilities of winning for each strategyover n games."""keep_count = [] # count of simutated wins if door is keptchange_count = [] # count of simulated wins if door is changedP_keep = [] # proportion of keep wins after each game P_change = [] # proportion of a change wins after each gamefor i in range(number_of_games):doors = [1, 2, 3] # door labels# set the car doorcar_door = np.random.choice(range(1,4))# set the player doorplayer_door = np.random.choice(range(1,4)) # set the goats' doors given car door and player doorgoat_doors = [door for door in doors if\door != car_door and door != player_door]# set the door Monty reveals given the goat doorsrevealed_door = np.random.choice(goat_doors)# set the change door given player door and revealed doorchanged_door = [door for door in doors if\door != player_door and door\!= revealed_door]if player_door == car_door:  #  add one to keep winskeep_count.append(1)else:                        # keep one to losseskeep_count.append(0)if changed_door == car_door: # add one to change winschange_count.append(1)else:                        # add one to change losseschange_count.append(0)# proportion of keep wins in i gamesP_k_i = np.mean(keep_count[:i]) P_keep.append(P_k_i)# proportion of change wins i gamesP_c_i = np.mean(change_count[:i]) P_change.append(P_c_i) # graphing the resultsfig, ax = plt.subplots(figsize=(10,5))plt.plot(range(number_of_games), P_keep, label='Keep Door')plt.plot(range(number_of_games), P_change, label='Change Door')plt.ylabel('Probability of Winning', size=15)plt.xlabel('Number of Simulations', size=15)plt.title('Simulated Probabilities of Winning', size=15)plt.xticks(size = 12)plt.yticks(size = 12)plt.legend(prop={'size': 12})# printing resultsprint('Simulated Probabilities:')print(f'Probability of Winning if Door is Kept’:\t \t\{round(np.mean(keep_count), 2)}')print(f'Probability of Winning if Door is Changed:\t\{round(np.mean(change_count), 2)}')

最惊艳的图表!

原文:https://towardsdatascience.com/the-most-amazing-chart-a5d101119e81?source=collection_archive---------25-----------------------

为什么密度图表让一切更清晰

我在之前的一篇文章中写道,我们试图解释大量数据的努力注定要失败:理想情况下,我们想要探索整个数据集,理解每一个数据点,但这当然是不可能的任务。因此,我们转而使用摘要描述符(平均值、百分位数、方差等)或图表来综合和理解大型数据集。我认为这总是一种不完美的努力——而且在平均值的情况下经常误导人:这就像试图用 300 字的摘要来总结一部伟大的文学作品,比如《战争与和平》:这可能会给人一种错觉,以为他们已经读过这本书,但当然,这只是一种错觉…

密度图

然而,有一个特殊的图表,接近于查看整个数据集,几乎就像阅读整部小说而不会在摘要中混淆:密度图表。事实上,密度图有效地显示了所有的数据点,因此没有信息损失。虽然肉眼在技术上无法看到每个单独的点,但该图表通过使用颜色阴影暗示了它们集中的位置(例如,较高浓度的较暖色和较稀疏数据集的较冷色,如下所示)。)

这适用于任何数量的大型数据集,有一个连续的衡量标准,无论是零售商店每个篮子的平均销售额,每个用户在网站上花费的时间,每个县每天的降雨量,每个标题售出的书籍数量,等等。

这是一个图表示例,展示了呼叫中心的大量呼叫。每个点代表呼叫中心的呼叫时间。

密度图表的图示—每个“点”代表一次呼叫,因此该图表有效地代表了所有数据点(图片由作者提供)

我喜欢说,我们看到的任何东西从技术上来说都是一种分布,密度图表的美妙之处在于它们向我们展示了分布的实际形状。颜色/密度取代了第三个维度(高度),第三个维度将使这成为一个实际的概率密度图。

如何创建此图表:

这很容易在 Tableau 这样的工具中通过…

  • 选择“密度”标记,
  • 确保您实际上绘制了所有单独的数据点(在这种情况下是单独的调用)
  • 添加您想要的度量(在这种情况下,通话时间以分钟为单位)
  • 选择合适的色标(我喜欢“温度”色标,因为我发现它的解释更通用)
  • 注意 y 轴上的对数刻度。它通过散布点来提高可见性:在有大量离群值的大型数据集中,有一种风险是在规则的尺度上“挤压”底部的大多数数据点。对数刻度允许您扩展数据并获得更好的可见性。不过这也伴随着一个警告:距离不是线性的——两倍的距离实际上是 10 倍的增长——所以未经训练的眼睛可能会被欺骗

还要注意,密度图本质上是直方图上的一个不同旋转——或者顾名思义,是表示概率密度函数的另一种方式,如下图所示

显示每个“桶”中呼叫计数的等效直方图。我在这里排除了极端值(> 50 分钟),以避免扭曲数据(图片由作者提供)

我喜欢将第一个图表与直方图结合起来,因为它让我了解每种颜色所代表的体积。

在 Tableau 中创建直方图可以很容易地完成,方法是在所需的度量(本例中为呼叫时间)上创建“箱”,并计算每个箱中的点数。

II —介绍描述符

我们现在当然可以添加所需的摘要描述符:中值、平均值、百分位数(从 10%到 90%)、最小值和最大值。有了这种背景下的可视化,这些描述符现在比在真空中给出的描述符更能有力地表明正在发生的事情。有趣的是注意到:

  • 像所有大型数据集一样,离群值是存在的,也是有意义的。这张图表把他们放在一个角度,因为你可以看到 90%的位置和最小值/最大值在比较中的位置。请记住,所有数据点都属于一个分布,根据数据中的分布,异常值可能有也可能没有更大的影响(例如,在以厚尾为特征的幂律/帕累托风格分布中,极值有显著影响)
  • 中位数反映了人口“中心”的行为。记住平均值和中值之间的重要区别:平均值会受到异常值的强烈影响,而中值不会——这解释了图表中的差异。

向密度图表添加描述符(图片由作者提供)

您可以通过在轴上添加“参考线”来在 Tableau 中添加这些描述符。您需要为中间值添加一条参考线,为平均值添加一条参考线,为百分点添加一条参考线。

III —尺寸简介

现在,当您引入一个您想要比较数据的维度时,事情变得更加有趣:这可以是一个时间元素(例如,每月呼叫时间的趋势)或任何其他类别(例如,西班牙语呼叫是否比英语呼叫更长)或按代理(某些代理是否比其他代理花费更长时间?)

添加比较维度(图片由作者提供)

要在 Tableau 中添加维度,只需将所需的维度拖到列中。

结论

将这些密度图与只看平均值提供的“差”信息进行比较

作者图片

没有任何迹象表明:

  • 所涉及的数据点数量(上图显示一月和二月的观察值较少)
  • 极端的行为(七月和辩论)实际上看到了底层 10%的改善——平均值是误导
  • 平均值会受到高异常值的强烈影响…它绝不会反映“典型”/最频繁呼叫的行为—中值是一个更好的指标

密度图比直方图更方便,因为它更简洁:想象一下,必须每个月绘制一个直方图来比较不同的月份!

这方面的用例可以是任何一种分布,在这种分布中,您倾向于使用平均值来比较选项,或者您希望在不运行回归模型的情况下探索特定输入对您正在测量的结果的影响。请记住,这个图表的一个主要优点是,它们可以很容易地快速向您显示异常值,并且可以透视平均值和中间值,这是模型并不总是擅长的。这里仅举几个例子:

  • 处理一项任务所需的时间(客户呼叫、网站加载时间、API 调用、制造小部件等)。然后你可以比较不同时间(几个月),不同人(某些人天生比其他人快吗?),一天中的不同时间(我们是否在特定时间超载>)
  • 在零售中,每个顾客的平均购物篮价值:在这种情况下,每个数据点是例如超市中顾客的总购物篮价值。您可以与已知维度(一天中的时间、客户类型等)进行比较
  • 销售人员效率:每个数据点都是销售代表为特定客户完成的单笔销售。然后,您可以在销售代表之间或客户之间进行比较。例如,您可以很快看到特定销售代表的高价值是否是由一些异常销售推动的。

解释最常见的身份验证系统

原文:https://towardsdatascience.com/the-most-common-authentication-systems-explained-512cddc432ea?source=collection_archive---------16-----------------------

人工智能应用

将语音识别集成到认证系统中的新方法(1)

照片由雷·轩尼诗从 Unsplash 拍摄

在过去的几十年里,密码和认证系统的解决方案有了长足的发展;然而,目前的解决方案已被定期黑客攻击,并证明在某些方面是脆弱的。最普遍的认证方法是基于文本的,基于图形的,和基于生物特征的,每种都有其优点和缺点。作为一个机器学习研究者,我要讲的是如何把 AI 和认证系统结合起来。在此之前,让我们更多地了解现有的认证系统,以便为未来的研究提供更多的思路。

你可以把这一系列的文章看作是对身份验证系统的文献综述,重点是脑电图和声纹。在本系列的最后一部分,我还提出了一个新颖的想法,在认证系统中使用语音识别来实现更高的安全性和抵御攻击。对于任何有兴趣在这个主题上做更多的研究或者将这个想法变成一篇研究论文的人,请随意使用这个想法,但是请提到它的起源并告诉我它是如何进行的:)

说了这么多,让我们开始吧!

这一系列的博客将集中在三个部分:

  1. 比较上述三种常见的身份验证类别。
  2. 详细分析了基于脑电的生物认证系统。
  3. 详细分析了基于语音的生物认证系统,提出了一种基于机器学习的语音认证系统的新思路。

1.基于文本的密码

最常用的身份验证方法是文本密码;然而,最大的缺点是在可记忆性和可用性之间的权衡。难以猜测或攻击的密码通常很难记住。

文本密码可以由用户创建,也可以由系统分配。对于用户创建的密码,用户倾向于使用他们熟悉的词,如他们的宠物、超级英雄或城市的名字,以及他们的出生日期。然而,如果攻击者能够获得相关信息,这些类型的密码很容易被攻击者攻击。对于系统分配的密码,例如,当你使用 Chrome 并登录,试图在一个平台上创建一个帐户时,你通常可以选择 Google 为你创建的密码;然而,这个密码太难记了,因为它包含随机字符、符号和数字。好消息是谷歌会为你保存它以备后用。糟糕的是,只要攻击者能黑你的电脑,他们就能进入你的账户。

2.基于图形的密码

图形密码已经开始用于认证系统,因为人们可以更好地记住图像而不是文本。然而,它们很容易被他人窃取,因此对肩窥攻击的防御很差,肩窥攻击是指通过越过受害者的肩膀获取密码等机密数据。抗肩窥的图形密码方案有了突破。例如,用户可以按照特定的顺序在密码图像上画一条曲线,而不是直接点击它们。在认证过程中,向用户显示降级的图像;开始和结束图像是随机的,以迷惑攻击者。

3。基于生物特征的密码

与其他密码相比,基于生物特征的密码更难复制,并且对个人来说是唯一的。在过去的几十年中,传统的生物特征认证模式已经得到了广泛的研究,但是每种模式都有其局限性。指纹和面部识别可以使用简单的欺骗攻击轻松伪造[2];由于昂贵的实施成本,虹膜扫描没有在工业中广泛使用。因此,认知生物识别因其固有的低成本而备受关注。它们对个人来说也是机密和秘密的;对手不能窃取或伪造,欺骗和肩膀冲浪攻击更健壮。

3.1 认知生物识别

传统的认证方案[3]依赖于 EEG、心电图(ECG)和皮肤电反应(EDR)作为输入。由于生物医学仪器的进步,使用带有干电极的便携式设备可以很容易地测量 EEG 信号;因此,它们更适合商业和实验用途。EEG 信号通常用于医疗环境。尽管如此,在最近的时代,它们已经在其他领域得到了广泛的研究,包括脑机接口[ 4 ]、生物认证[ 5 ]和脑机接口[ 6 ]。

3.2 语音识别

语音识别在行业中已经比较普及。谷歌助手、苹果 Siri 等应用可以解读人类的话语,与人交流;有些平台甚至可以用来识别个人,比如微软的 Speaker recognition[7]、Bob [ 8 ]、Dejavu [ 9 ]。

在本系列的下一部分,我将深入研究基于 EEG 的身份验证和基于语音的身份验证系统的文献。在最后一部分,我将提出一个新颖的方法来结合语音识别和认证。

敬请关注,欢迎在 Linkedin 上留下评论和我联系。

https://www.linkedin.com/in/fangyiyu/

参考资料:

[1] S. Wiedenbeck、J. Waters、J.-C. Birget、A. Brodskiy 和 N. Memon,“使用图形密码的身份验证:容忍度和图像选择的影响”,载于 2005 年可用隐私和安全研讨会会议录,2005 年,第 1-12 页。

[2] K. A. Nixon,V. Aimale 和 R. K. Rowe,“欺骗检测方案”,载于《生物统计学手册》。斯普林格,2008 年,第 403-423 页。

[3] K. Revett 和 S. T. de Magalhaes,认知生物统计学:未来的挑战,全球安全、保障和可持续性国际会议。斯普林格,2010 年,第 79-86 页。

[4] T. O. Zander 和 C. Kothe,“走向被动脑机接口:将脑机接口技术应用于一般人机系统,”神经工程杂志,第 8 卷,第 2 期,第 025005 页,2011 年。

[5] S. Marcel 和 j . d . r . Mill an,“使用脑电波(EEG)和最大后验模型自适应的个人认证”,IEEE 模式分析和机器智能汇刊,第 29 卷,第 4 期,第 743–752 页,2007 年。

[6] R. A. Andersen、S. Musallam 和 B. Pesaran,“为脑机接口选择信号,《神经生物学最新观点》,第 14 卷,第 6 期,第 720-726 页,2004 年。

[7] W. Xiong,L. Wu,F. Alleva,J. Droppo,X. Huang,A. Stolcke,“微软 2017 对话式语音识别系统,”2018 年 IEEE 国际声学、语音和信号处理会议(ICASSP)。IEEE,2018 年,第 5934–5938 页。

[8]“Spear:基于 bob 的说话人识别工具包。”【上线】。

[9]“Dejavu:用 python 实现的音频指纹识别和识别算法。”【上线】。

NLP 中最常见的评估指标

原文:https://towardsdatascience.com/the-most-common-evaluation-metrics-in-nlp-ced6a763ac8b?source=collection_archive---------5-----------------------

自然语言处理笔记

了解这些指标

由弗勒在 Unsplash 上拍摄

介绍

每当我们建立机器学习模型时,我们都需要某种形式的度量来衡量模型的好坏。请记住,模型的“好”可能有多种解释,但通常当我们在机器学习上下文中谈论它时,我们谈论的是模型在不属于训练数据的新实例上的性能度量。

确定用于特定任务的模型是否成功取决于两个关键因素:

  1. 对于我们的问题,我们选择的评估标准是否正确
  2. 如果我们遵循正确的评估流程

在本文中,我将只关注第一个因素——选择正确的评估指标。

不同类型的评估指标

我们决定使用的评估标准取决于我们正在进行的 NLP 任务的类型。进一步补充,项目所处的阶段也会影响我们使用的评估标准。例如,在模型构建和部署阶段,我们通常会使用不同的评估标准来评估产品中的模型。在前两个场景中,ML 指标就足够了,但是在生产中,我们关心业务影响,因此我们更愿意使用业务指标来衡量我们模型的好坏。

也就是说,我们可以将评估指标分为两类。

  • 内在评估—关注中间目标(即 NLP 组件在定义的子任务上的性能)
  • 外部评估—关注最终目标的性能(即组件在整个应用中的性能)

利益相关者通常关心外在的评估,因为他们想知道模型在解决手边的业务问题方面有多好。然而,为了让人工智能团队衡量他们做得如何,拥有内在的评估指标仍然很重要。在本文的剩余部分,我们将更加关注内在指标。

定义指标

评估 NLP 系统的一些常见内在指标如下:

精度

无论何时使用精度指标,我们的目标都是了解测量值与已知值的接近程度。因此,它通常用于输出变量为分类变量或离散变量的情况,即分类任务。

精度

在我们关心模型预测有多精确的情况下,我们会使用 Precision。精度度量将告知我们对应于分类器标记为阳性的情况,实际标记为阳性的标记的数量。

回忆

召回衡量模型能够召回阳性类别的程度(即,模型识别为阳性的阳性标签的数量)。

F1 比分

精确度和召回率是具有相反关系的互补指标。如果两者都是我们感兴趣的,那么我们将使用 F1 分数将精确度和召回率结合成一个单一的指标。

要更深入地研究这 4 个指标,请阅读 混淆矩阵【未混淆】

曲线下面积(AUC)

AUC 通过捕捉在不同阈值下正确的阳性预测数和不正确的阳性预测数,帮助我们量化模型的分类能力。

要更深入地了解这一指标,请查看对 AUC-ROC 曲线 的理解

平均倒数排名(MRR)

平均倒数排名(MRR)评估检索到的响应,对应于一个查询,给定其正确的概率。这种评估标准通常经常在信息检索任务中使用。

阅读更多关于平均倒数排名的信息。

平均精度(MAP)

与 MRR 相似,平均精度(MAP)计算每个检索结果的平均精度。它还被大量用于信息检索,以对检索结果进行排序。

谭写了一篇名为 分解平均精度(图) 的非常好的文章,推荐阅读。

均方根误差(RMSE)

当预测结果是真实值时,我们使用 RMSE。这通常与 MAPE(我们将在接下来介绍)结合使用,用于从温度预测到股票市场价格预测等任务的回归问题。

阅读更多关于均方根误差的信息

平均绝对百分比误差(MAPE)

当预测结果是连续的时,MAPE 是每个数据点的平均绝对百分比误差。因此,我们用它来测试评估一个回归模型的性能。

阅读更多关于 MAPE 的信息。

双语评估替角(BLEU)

BLEU 评分评估由机器从一种自然语言翻译成另一种自然语言的文本的质量。因此,它通常用于机器翻译任务,但是,它也用于其他任务,如文本生成、释义生成和文本摘要。

Jason Brownlee(机器学习大师)写了一篇关于 BLEU 分数的很棒的文章,标题是 用 Python 计算文本 BLEU 分数的温和介绍

流星

使用显式排序评估翻译的指标 (METEOR)是基于精度的机器翻译输出评估指标。它克服了 BLEU 评分的一些缺陷,例如在计算精度的同时进行精确的单词匹配 METEOR 评分允许同义词和词干词与参考单词匹配。该指标通常用于机器翻译任务。

阅读更多关于流星的内容。

胭脂

与 BLEU 评分相反,面向回忆的替角用于 Gisting 评估 (ROUGE)评估指标测量回忆。它通常用于评估生成文本的质量和机器翻译任务,但是,由于它测量召回率,因此它主要用于摘要任务,因为评估模型在这些类型的任务中能够召回的单词数更重要。

阅读更多关于胭脂的内容。

困惑

有时我们的 NLP 模型会混淆。困惑是一个很好的概率度量,用来评估我们的模型到底有多困惑。它通常用于评估语言模型,但也可以用于对话生成任务。

Chiara Campagnola 写了一篇非常好的关于困惑评估指标的文章,我推荐阅读。它被命名为 语言模型 中的困惑。

最后的想法

在本文中,我提供了许多在自然语言处理任务中使用的常见评估指标。这绝不是一个详尽的指标列表,因为在解决 NLP 任务时还会用到更多的指标和可视化。如果你想让我更深入地研究任何一个指标,请留下你的评论,我会努力做到这一点。

感谢您的阅读!通过 LinkedIn 和 Twitter 与我联系,了解我关于数据科学、人工智能和自由职业的最新帖子。

相关文章

</5-ideas-for-your-next-nlp-project-c6bf5b86935c>

对数据科学家来说,最有效但最隐蔽的生产力工具

原文:https://towardsdatascience.com/the-most-effective-but-hidden-productivity-tool-for-a-data-scientist-e2f65d98b7e7?source=collection_archive---------11-----------------------

艾通过作者创造艺术。更多例子上https://www.instagram.com/art_and_ai/**;受法比奥哈关于的启发https://unsplash.com/photos/oyXis2kALVg

我已经做了一段时间的开发人员了。几乎所有的职位和专业都在讨论什么是最好的工具。它与软件工具如 IDEs (VSCode,Webstorm,Vim 等)或硬件工具(mac,pc,linux)一起使用。讨论总是好的,然而,最终每个人都会发现自己的风格最适合自己的工作流程。因为每个人做的事情都有一点不同,所以这很有意义。有一个工具我到目前为止还没有讨论过,但是对我的工作有很大的帮助。

目录

  • 生产力的关键方面
  • 问题
  • 工作研究
  • 解决方案
  • 标签聚类
  • 悬浮标签/窗口
  • 保存选项卡/窗口
  • 为什么我认为这很重要
  • 免责声明
  • 关于

生产力的关键方面

首先,我想说明为什么这个工具很重要。我正在做的主要工作是解决问题。作为一名数据科学家,我有一大堆问题要处理。它从理论和规划方法开始,经过实施过程,并以演示或部署结束。

从来没有什么都知道的完美的人。在一直处理不同的问题时尤其如此。每个数据集都有点不同。有自己的怪癖需要解决。机器学习(ML)实现也是如此。你总是有你喜欢的 ML 算法,但是你经常测试不同的方法以确保你得到最好的结果度量。

因此,每个问题都需要一种方法来以省时的方式解决,同时产生可靠的结果。

首选工具几乎总是浏览器(chrome)和谷歌。

我喜欢谈论谷歌搜索是程序员唯一真正技能的迷因。

作者图片

然而,随着年龄的增长,我越来越珍视它。事实上,我甚至在面试时把它视为一种技能。我不喜欢记忆算法。其实是反过来的。我重视快速和最好的实现,而不是死记硬背。

我不想谈论如何用谷歌搜索东西。大家过一段时间就对行业有感觉了。(但也有那方面的文章)。

我谈论浏览器和标签。

问题是

如果我检查 TODOs 或研究某个问题,这并不重要。我总是以打开多个标签结束。

看起来是这样的:

多个标签打开;作者图片

在这个例子中,我想在 cryptoart 世界中继续工作。如你所见,它很快变得凌乱不堪。如你所见,我有各种各样的想法需要详细阐述。比如,出售你的作品的最佳平台是什么,如何获得更多的关注者,关于 crypto 开发的文章等等。这些都是在研究一个话题时需要考虑的必要因素。

关于工作的研究

研究 ML 实现也是如此。我决定了一个算法,在研究过程中,出现了新的想法甚至更好的方法。

例如,这里我从实现决策树分类器的想法开始。在研究过程中,还有许多其他方面需要考虑。正如你在左边最后一页看到的。有一个问题是,如果需要进行太多的插补,不同的算法是否会更好。

用 Smartdraw 完成;作者图片

解决方案

标签的聚集

是用一个叫做集群——窗口&标签管理器的 chrome 扩展来管理标签。

它允许您将选项卡和浏览器窗口聚集在自己的选项卡中。

标签的聚集;作者图片

这可以让你对所有的标签页和窗口有一个完美的概览。

您可以将选项卡分类到相关选项卡聚集的域中。

集群标签;作者图片

在这种情况下,它被聚集到 google、medium 和 other。

这非常有帮助,尤其是当您在 Stackoverflow 上查找各种实现问题时。我经常发现我已经有了类似的问题。这种聚类帮助了我。

还有我读的文章。我经常阅读一些东西,在阅读的时候我会研究一个想法。这有助于我将阐述保持在相应文章的轨道上。

暂停标签/窗口

这是一个巨大的好处。你可能已经意识到,当大量的标签被打开时,chrome 会占用相当多的内存。

Chrome 上的 Meme 需要内存;作者图片

这是一个性能问题。

不仅速度变慢,有时还会崩溃。在我的数据科学工作中,我会遇到这种情况,因为我研究内容,还打开了 jupyter 笔记本/实验室。或者谷歌 colab。所有这些都是在 chrome 中完成的,这导致了性能问题。

一个窗口研究,一个窗口笔记本;作者图片

如您所见,window 1 打开了与执行相关的笔记本。

为了有所帮助,你可以暂停不用的标签。

您可以使用单个选项卡或组来完成此操作。

暂停选项卡以提高性能;作者图片

保存选项卡/窗口

最后一个很酷的功能是保存窗口和标签。如果你从事多项跨学科的工作,你将有多个窗口用于不同的工作组。这个工具可以帮助你保存标签页,并在不需要的时候关闭它们。如果您以后还需要它们,恢复既快速又简单。

保存标签;作者图片

为什么我认为这很重要

我认为正确使用浏览器和谷歌是当今数据科学家最重要的技能之一。它经常被忽视,我已经看到在这方面出现了奇怪的问题。人们打开了数百个标签和窗口。浏览器多次崩溃。失去了宝贵的进步。

到目前为止,我发现这对我的工作很有帮助,希望对你也有帮助。

我还认为,生产力相关工作的未来会围绕这样的事情发展。

有价值的不是信息量,而是质量。从重要的信息中分离出无意义的信息是目前你能拥有的最重要的技能。

在这方面还有很多要讨论的。让我知道你对此的想法。

放弃

我与本文中使用的任何服务都没有关联。

我不认为自己是专家。我不是博主什么的。除了做其他事情,我只是记录事情。因此,这些内容并不代表我任何作品的质量,也不完全反映我对事物的看法。如果你觉得我错过了重要的步骤或者忽略了什么,可以考虑在评论区指出来或者联系我。

我总是乐于听取建设性的意见以及如何改进。

这写于 2021 年 2 月 12 日。我无法监控我的所有文章。当你阅读这篇文章时,提示很可能已经过时,过程已经改变。

如果你需要更多关于某些部分的信息,请在评论中指出来。

关于

丹尼尔是一名艺术家、企业家、软件开发人员和商业法毕业生。他曾在各种 IT 公司、税务咨询、管理咨询和奥地利法院工作。

他的知识和兴趣目前围绕着编程机器学习应用程序及其所有相关方面。从本质上说,他认为自己是复杂环境的问题解决者,这在他的各种项目中都有所体现。

如果您有想法、项目或问题,请不要犹豫与我们联系。

作者图片

连接到:

  • Allmylinks

直接:

  • 领英
  • Github
  • 中等
  • 推特
  • Instagram
  • createdd.com

艺术相关:

  • 中等/最先进的
  • Instagram/art_and_ai
  • 稀有
  • 开阔的海面
  • 已知产地
  • 魔鬼艺术

熊猫中效率最高的 if-elif-else

原文:https://towardsdatascience.com/the-most-efficient-if-elif-else-in-pandas-d4a7d4502d50?source=collection_archive---------4-----------------------

以及为什么我(和你一样)可能一直写得很低效

克里斯里德在 Unsplash 上的照片

简单的 if else 语句是每种编程语言的主要特点。Numpy 和 Pandas 为 Python 爱好者带来了无与伦比的速度,很明显,人们需要创建一个 if-elif-else 特性,该特性可以矢量化并有效地应用于数据集中的任何特定列。然而,即使看起来是这样,如果你真的在谷歌上搜索做这件事的最佳方法…真的没有明确的答案。有些用户声称使用 loc 和 iloc 最快,有些用户声称 pandas.where()最快,有些用户甚至声称列表理解是最简单高效的方法。这些说法没有证据,只是用户分享了他们用来完成这个看似简单的任务的方法。正因为如此,我在互联网上搜寻了每一种可以完成任务的方法,最终的赢家完全出乎我的意料。

设置问题

为了测试这些方法,我想找到一个大小适中、易于使用的数据集。我选择了 Kaggle 的这个数据集,它包含 30,000 名信用卡客户及其相关的账单和支付。在那里,我将账单列重命名为“COL_1 ”,将付款列重命名为“COL_2 ”,这样我创建的这些函数就可以很容易地应用于任何问题。

对于这个数据集,我想创建一个新列“RESULT”,它基于一个简单的 if-elif-else 概念。

def new_column(row):if row['COL_1'] <= row['COL_2']:return 1elif row['COL_2'] == 0:return -1else:return 0

我们比较这两行,看看付款是否大于账单,如果是这样,返回 1。如果他们没有支付任何费用,则返回-1,而在任何其他情况下(他们支付的费用不足以支付账单),则返回 0。

然后,我发现了将 if-elif-else 问题应用于我的数据集的 6 种不同方法。对于其中的每一个,我运行操作 100 次,存储结果,执行 3 次,并使用最低的分数作为我们的官方比较标准。

方法 1(最简单):将函数直接应用于数据帧

df['RESULT'] = df.apply(new_column, axis=1)28.503215789794922
28.901722192764282
29.452171087265015
---MIN---
28.503215789794922

Pandas 自带了一个内置方法(dataframe.apply ),直接将我们上面写的函数应用于每一列。对于不熟悉 Pandas 的人来说,这是迄今为止可读性最强、最容易理解的方法,尽管众所周知这种方法效率较低,但对于较小的数据集(少于 100,000 行),您不太可能注意到速度下降,因为我能够在 28 秒内运行 100 次该函数的迭代,或者对于 30,000 行来说大约 0.3 秒。

方法 2:使用 lambda 和嵌套 if 语句进行应用

df['RESULT'] = df.apply(lambda x: 1 if x['COL_1'] <= x['COL_2'] else (-1 if x['COL_2'] == 0 else 0), axis=1)28.910192251205444
29.083810329437256
28.666099071502686
---MIN---
28.666099071502686

这个测试背后的目标是看看使用 lambda 和嵌套 if 语句是否比只写出函数有任何显著的速度提升。如果这个测试证明了什么的话,那就是 Python 的编译器非常高效,写出完整的函数与 lambda 相比并没有真正的优势。因此,如果你打算使用 apply,只需写一个可读性函数。

方法 3(最简单有效的方法):使用 loc

df.loc[df['COL_1'] <= df['COL_2'], 'RESULT'] = 1
df.loc[df['COL_2'] == 0, 'RESULT'] = -1
df.loc[df['COL_1'] > df['COL_2'], 'RESULT'] = 00.267972469329834
0.24548792839050293
0.23981308937072754
---MIN---
0.23981308937072754

这是我一直用的方法。它简单、干净,比使用 apply 快 100 多倍。这种方法的唯一缺点是您可能会覆盖已经写好的值。例如,如果我交换第二个和第三个语句,全 1 将被替换为 0,因为两个条件都满足。我满以为这个方法是最有效的,然而,我错了。

方法 4(复杂但高效):链式 dataframe.where()

df["RESULT"] = 0
df["RESULT"] = df["RESULT"].where(df['COL_1'] > df['COL_2'], 1).where(df['COL_2'] != 0, -1)0.19342803955078125
0.2046663761138916
0.2063906192779541
---MIN---
0.19342803955078125

当这比使用 loc 快 24%时,我很惊讶。使用 dataframe.where 显然是最快的方法之一,但是,由于它的语法很难学,所以很少使用。这是因为(from numpy . Where docs)“其中 cond 为真,保持原来的值。如果为 False,则替换为 other 中的相应值。在前面的所有例子中,我们都是在 True 时进行替换,所以本质上每个 where 条件都需要进行反转,以产生与使用 lambda 时相同的结果。在本例中,结果列也需要初始化为“else”条件才能正常工作。

方法 5(令人惊讶的赢家):Numpy.select

df[“RESULT”] = 0
df[“RESULT”] = np.select(condlist=[df[‘COL_1’] <= df[‘COL_2’],df[‘COL_2’] == 0],choicelist=[1,-1],default=0)0.12417435646057129
0.12804388999938965
0.12969422340393066
---MIN---
0.12417435646057129

没错。令人惊讶的最快结果来自 Numpy.select,它不仅快,而且比 where 快 56%,比 apply 快 230 倍。Numpy.select 也比我认为的 where 更直观一些。像 where 一样,我们将所有内容都设置为 else 条件,然后在 condlist 中为每个 if 提供一个列表,在 choicelist 中提供操作/结果。在写这篇文章之前,我甚至不知道这个功能的存在,现在,它是我的新工具,也应该是你的!

方法 6(失败者):用 iterrows()列出理解

df["RESULT"] = [1 if x[1]['COL_1'] <= x[1]['COL_2'] else (-1 if x[1]['COL_2'] == 0 else 0) for x in df.iterrows()]124.71909689903259
124.28108930587769
123.89728021621704
---MIN---
123.89728021621704

请不要这样做。即使是一次迭代,它的速度也要慢 1 秒以上,而且不如 apply 直观,但速度却慢了 4 倍以上。在阅读了这篇文章后,我研究了这种方法,这篇文章声称列表理解比 where 快 50%。

公平地说,他们只是在寻找一个 if-else 命令,其中的数据只来自一个单独的列。这消除了使用 iterrows 的需要,因为当选择单个列时,默认的 python 行为是简单地迭代该列。为了测试这一点,我将问题简化为只在 COL_2 中查找 0,如果有 0,则设置为-1,否则设置为 0。

df["RESULT"] = [-1 if x == 0 else 0 for x in df['COL_2']]0.662632942199707
0.6409032344818115
0.6460835933685303
---MIN---
0.6409032344818115

这个函数看起来很简洁,比使用 iterrows 快 200 倍,但即使如此,在一个更困难的问题上使用 where 仍然快 3 倍以上,这意味着从来没有一个理解列表的好地方。

但是如果我只需要一个简单的 if-else 呢?

为了彻底起见,我在所有最快的方法(loc、where 和 select)上测试了简化的 if-else 问题,看看是否有相同的结果。我还在 Numpy.where 中添加了一个额外的竞争者(因为它只能用于 2 个选项问题)

#Dataframe.loc assignment
df['RESULT'] = 0
df.loc[df['COL_2'] == 0, 'RESULT'] = -10.08055353164672852
0.08478784561157227
0.08516192436218262
---MIN---
0.08055353164672852#Dataframe.where
df["RESULT"] = 0
df["RESULT"] = df["RESULT"].where(df['COL_2'] != 0, -1)0.11904525756835938
0.11285901069641113
0.13939785957336426
---MIN---
0.11285901069641113#Numpy.select
df["RESULT"] = 0
df["RESULT"] = np.select(condlist=[df['COL_2'] == 0],choicelist=[-1],default=0)0.07214689254760742
0.07320952415466309
0.07971072196960449
---MIN---
0.07214689254760742#Numpy.where
df["RESULT"] = 0
df["RESULT"] = np.where(df['COL_2'] == 0, 0, -1)0.06414675712585449
0.06172466278076172
0.06483030319213867
---MIN---
0.06172466278076172

这表明 np.select 和 np.where 都处于领先地位,在这种情况下,np.where 在可读性和性能方面都超过了 select。注意 Numpy 和 Pandas“where”命令是不同的,需要不同的参数。Numpy 的 where 是 np.where(条件,真时取值,假时取值),比熊猫版直观多了。

结论

我仍然对这个测试的结果感到惊讶。我从来没有想到 numpy.select 会比一些主要的 Pandas 函数表现得更好,而 np.where 是简单 if-else 函数的最佳选择。

对于所有的数据科学家和熊猫爱好者,我希望你学到了一些东西,这有助于让你的熊猫之旅变得轻松一些。

如果你喜欢这篇文章,并想阅读我写的更多内容,请将你认为还会需要的文章加入书签,并考虑跟随的[或查看下面的其他文章!如果你正在寻找 Python/Pandas 的完整课程,我推荐](http://follow me)这些家伙!

组织 Dbt 模型的最有效方式

原文:https://towardsdatascience.com/the-most-efficient-way-to-organize-dbt-models-244e23c17072?source=collection_archive---------5-----------------------

命名约定、yml 文件和文件夹结构

@shawnanggg 在 Unsplash 上的照片

Dbt 是分析界的热门工具,而且只会越来越受欢迎。分析师和分析工程师都使用它来以更快、更可靠的方式运行模块化代码。

组织是以对团队有效的方式使用 dbt 的关键组成部分。它的用处取决于您的 dbt 项目结构的组织程度。

对于那些从未使用过 dbt 的人来说,这可能是相当吓人的。幸运的是,这个工具背后的团队已经彻底地记录了他们用于个人客户的结构。

虽然我使用他们的结构作为建立我的模型的指南,但是组织的很多部分依赖于你自己的用例以及你所支持的团队。

一种制度不适合所有人。这在很大程度上是一门艺术,要弄清楚什么最适合你的分析团队。

文件夹结构

dbt 的团队建议将你的模型组织到两个不同的文件夹中- stagingmarts

暂存模型是那些从原始数据文件中读取并涉及数据清理的模型。有时需要连接和更复杂的转换。

Dbt 建议在组织您的模型时,将阶段模型和基础模型包含在这个类别中。基本模型也从源数据中读取数据,但要简单得多,包括对列的转换和重命名。

集市模型是包含聚合、连接和复杂逻辑的更高级的模型。这实际上是包含最终产品的文件夹。

作者图片

当我使用这个文件夹结构作为设置模型的指南时,我添加了一些其他的文件夹来帮助保持事情更加有条理。我们的模型非常复杂,所以有许多中间模型组成了每个核心模型。如果没有额外的文件夹,文件会在风暴中丢失。

我为这些中间模型创建了一个单独的文件夹,这样当我需要它们时,我可以很容易地找到最重要的模型。在这个中间文件夹中是每个核心模型的文件夹(那些存在于 marts 文件夹中的),所以我可以跟踪哪些模型与每个核心模型相关。

作者图片

您还可以遵循 dbt 文档中的建议,在 staging 文件夹下包含一个嵌套的中间模型文件夹。

staging/<source>/intermediate/

此外,我们只有一个用于基本模型的文件夹,而不是暂存文件夹。它们都相当简单,只需要转换和重命名,所以不需要阶段模型。

在基本文件夹中,每个数据源都有一个文件夹,其中包含每个数据表的 SQL 文件。这些 SQL 文件中的每一个都从不同的数据源和表中读取。

作者图片

此外,每个文件夹都有自己的 yml 文件,所以没有一个大的 yml 文件用于所有的基础模型。我想让东西尽可能地容易阅读和理解。有时候一个地方的信息太多会让人不知所措。

作者图片

下面是我遵循的结构的快速概述:

  • 基础
  • 媒介的
  • 市场/核心

在基本文件夹中,它看起来像:

  • (文件夹)
  • (文件)

在中间文件夹中,它看起来像:

  • (文件夹)
  • (文件)

最后,在 mart 文件夹中,它看起来像:

  • (档案)

命名规格

既然我们已经讨论了文件夹结构,让我们深入实际模型的命名约定。

dbt 团队建议在您的模型名称中使用前缀。根据模型的类型,您应该遵循以下格式:

_

暂存/基本型号

Dbt 建议遵循格式 stg_ <源> _ <对象>。用于所有暂存模型的 sql 。就我个人而言,我发现在我们的基本模型中,给每个模型添加一个 base 前缀是非常多余的,并且会使模型名变得很长。

而是按照格式 <来源> _ <对象>。基本模型的 sql 。因为它们都被组织在基本文件夹下,所以从来没有混淆过。

在这种情况下,Source 是数据源,如脸书、Shopify、谷歌广告或 Snapchat。对象是 SQL 文件从中读取的数据表的名称。

中介模式

虽然 dbt 对于中间模型没有任何明确的命名约定,但这是我如何命名我的模型的。我发现这些是最重要的组织模型,因为它们太多了(至少当你有很多数据的时候)。

我有每个核心模型的简短版本,我用它作为中间模型的前缀。然后,按照 dbt 的建议,我将这些模型基于它们的功能。

_ 。结构化查询语言

例如,我的一个核心模型名为 order_details ,因此它的一个中间模型名为order _ margins _ calculated . SQLorder_details 的简称是 order,模型的功能是计算产品利润。

集市型号

Dbt 对 mart 模型有一些不同的建议。他们建议在这些模型中使用两种前缀选项:

  • fct _ <动词>
  • dim_ <名词>

dbt 文档将 fct 表定义为“一个又高又窄的表,表示已经发生或正在发生的真实世界的流程。这些模型的核心通常是不可变的事件流:会话、交易、订单、故事、投票”。

相比之下,他们将 dim tables 定义为,“一张又宽又短的桌子,每一行都是一个人、一个地方或一件东西;在识别和描述组织的实体时,这是事实的最终来源。它们是可变的,尽管在慢慢变化:客户、产品、候选人、建筑、员工”。

我们没有太多关于 fct 表格的应用,但是我们确实使用 dim 表格。然而,并非我们所有的型号都属于这一类别。我们只将 dim 表用于将几个不同的表连接在一起的更基本的模型。

例如,我们有一个模型 dim_products ,它将所有与产品相关的表连接在一起。这些类型的模型使我们的分析师的工作变得容易得多,因为他们不必担心每次需要编写分析时将所有的表连接在一起。

我们的其他核心模型是根据它们包含的数据命名的。我发现以它们所提供的功能命名它们,并使用后缀 details 很好地解释了模型但这都是个人喜好!

Yml 源文件

保持 dbt 模型有组织的最后一个关键部分是编写 yml 源文件。这些包含所有与您的模型相关的文档。它们详细描述了模型名称、描述和列。

这些文件中的完整文档是理解您的数据和传达您构建的每个模型的价值的关键。这将成为您所有 dbt 模型的数据字典(字面上的意思)。确保你正确使用它!

使用命令 dbt docs serve 将这些 yml 文件作为 dbt 文档提供。 Dbt 将以创建一个完整网站的方式组织这些文件,您的文档可以在该网站上保存,并且组织中的任何人都可以轻松访问。

我建议用它们所在的文件夹来命名这些 yml 文件。例如,如果文件位于核心文件夹中,它将被命名为 core.yml 。这个 yml 文件将包含核心模型的所有描述和列。

当您在每个 yml 文件中构建模型时,请确保完整地记录您的模型。构建时包含的细节越多,将来就越容易理解模型。

结论

请记住,您的 dbt 项目是按照您制定的约定来组织的。随着您的数据团队的成长以及多人开始访问您的模型,命名约定和文件夹结构变得越来越重要。

我强烈建议整理一份风格指南,详细介绍我们刚刚讨论过的所有信息。这不仅便于你将来参考,也便于你的团队参考。

请记住,如果您发现某些东西不工作,您可以随时更改这些东西。只是要确保在深入构建模型之前尽早这样做。当你认识到问题的时候,在问题开始的时候解决问题要比在问题已经造成太多损害的时候解决问题容易得多。

快乐大厦!

通过订阅我的电子邮件列表,了解更多关于其他流行的现代数据堆栈工具的信息。

机器学习最令人兴奋的方面

原文:https://towardsdatascience.com/the-most-exciting-aspect-of-machine-learning-94bbd874e65a?source=collection_archive---------34-----------------------

JD Mason 在 Unsplash 上的照片

是的,是计算机视觉

这篇文章是对机器学习(ML)这个奇妙领域中的一个特定部分的探索。你应该从这篇文章中获得以下之一:探索对你来说可能是新的机器学习领域的新热情,或者与你有相似兴趣的新朋友。

大约在 5 亿年前,第一个有机体开始通过视觉感知观察它的环境。今天,我们有人造机器和照相机能够从输入到它们的光学或远程传感器的输入数据中获得对风景的理解。可以肯定地说,我们已经走了很长一段路。

尽管智能的定义模糊不清,但智能的一个公认的重要组成部分是智能体创建其环境模型的能力。了解我们的环境和其中的物体(或其他代理)允许进一步的活动,如预测,决策,分类,建议等。

Robina Weermeijer 在 Unsplash 上拍摄的照片

当你阅读这篇文章时,进入你眼睛的光线转化为电信号,被视神经接收并发送到大脑。反过来,大脑提供这些信号的可视化,以模拟其环境。人类生物学令人着迷,极其复杂。

然而,我们已经承担起在几百年内复制自然界花了几十万年才形成的东西。

关心的领域

如果你读过我以前的一些文章,你可能会猜到计算机视觉领域对我来说是目前最令人兴奋的机器学习领域。

计算机视觉(CV)是机器或系统如何通过调用一个或多个作用于所提供信息的算法来生成对视觉信息的理解。这些理解被转化为决策、分类、模式观察等等。

左图:西蒙·贝克在 Unsplash 上拍摄的照片。右图:布拉姆·范·奥斯特在 Unsplash 拍摄的照片

计算机视觉技术是我们日常使用的大多数人工智能应用的背后,从智能手机的面部识别功能到即将到来的无收银零售店,让我们不要忘记每个人最喜欢的汽车品牌的自动驾驶汽车功能。想想在 60 年代,解决计算机视觉曾经是一所大学的学生暑期项目,或者故事是这样的,这几乎是疯狂的。

在 CV 领域内,有许多问题需要解决;常见的有物体检测、物体识别、姿态估计、手势识别、人脸检测、深度估计等。我不会深究常见的简历问题的细节,但你可以看到简历领域有很多事情让你忙碌。

回首往事

照片由 Nana Dua 在 Unsplash 上拍摄

计算机视觉和深度学习使得 GPU(图形处理单元)在机器学习中变得司空见惯。

GPU 是机器学习研究人员和工程师的标准硬件,这种硬件使 Nvidia 成为当今最有价值的科技公司之一。

GPU 旨在加速图形渲染和纹理映射等处理任务。GPU 与机器学习应用相关的关键属性是它们同时处理和执行数据计算的能力,以及它们快速的内存变更。

研究人员使用 GPU 来训练和测试机器学习技术,以解决视觉处理和图像识别等计算机视觉任务。2006 年,微软的研究人员发表了一篇论文,介绍了使用 GPU 来训练和测试用于文档处理的卷积神经网络。研究人员受到了 D. Steinkraus 等人的早期工作的启发。

使用卷积神经网络(CNN)解决计算机视觉相关任务也是机器学习领域的一个转折点。CNN 利用数学卷积运算并使用二维滤波器,其中滤波器的值在训练期间通过反向传播进行修改,反向传播是一种能够在神经网络内学习的技术。CNN 非常适合图像识别和分类等计算机视觉任务,但在标准 CPU 上训练起来非常慢。因此,早期的 ML 研究人员开始探索使用 GPU 来训练和测试 CNN。

GPU、深度学习以及高度准确和高性能的模型开始年复一年地出现,特别是在 2012 年推出 Alex net之后。AlexNet 在 NVIDIA GTX 580 3GB GPU 上进行训练,由 8 层组成,包括 5 个 conv 层和 3 个全连接层。当时,它在图像分类方面达到了最先进的水平。

这里的关键要点是,在试图优化神经网络的训练和测试以解决计算机视觉任务时,研究人员探索了 GPU 和不同神经网络架构的使用。

各种应用

我觉得计算机视觉有趣的另一个原因是它对不同问题的广泛适用性。还有大量的工业应用解决方案以某种形式或方式利用了 CV 技术。

我从未想象过在开发 iOS 移动游戏应用的游戏工作室工作,但事实证明,智能手机上的摄像头打开了一个可能性的世界。想象一个增强的虚拟现实。

UNIBOA 在 Unsplash 上拍摄的照片

我使用构建和训练的模型来解决姿势估计、对象检测和手势识别。这些型号为 2–5MB(兆字节);有比这些模型更大的 mp3 歌曲可以实时预测 17 个人体关节的位置。简直惊艳!

你必须承认,机器学习模型的研究和商业应用之间的差距正在缩小,这主要是由于寻找开发和交付机器学习模型的优化方法的持续工作。英特尔(Intel)、苹果(Apple)和英伟达(Nvidia)发布的优化人工智能芯片提供了平台,移动优化的人工智能模型可以在没有计算限制的情况下运行。

照片由欧文比尔德在 Unsplash 上拍摄

就行业相关性而言,如果你有计算机视觉专业知识,你就可以接触到广泛的行业选择。医疗机构需要计算机视觉专家来开发算法,以改善 x 射线图像的图像处理,并简化从分析到诊断的医学成像流程。国防和安全机构需要计算机视觉专家来构建检测和跟踪算法。汽车制造商和科技公司正在招聘 CV 工程师,以帮助实现自动驾驶汽车。

如果你是杰出的,对计算机视觉充满热情,你的技能的未来相关性是无限的(警告 : 只要你保持它们是最新的)。

你可能会发现大多数管理学科在现代公司中都有一席之地,尤其是现在社会依靠技术和数据运作。

未来

令人兴奋的是,看到机器拥有类似的感知能力和对风景的理解能力,而这些能力是大自然花了几百万年才开发出来的。

商业市场和媒体的注意力都集中在引入自动驾驶汽车上。特斯拉是这一领域的领先公司,充分利用摄像头作为其车队中唯一的视觉传感器。

戴维·冯迪马尔在 Unsplash 上拍摄的照片

特斯拉最新的演示展示了他们的进展,例如从视频输入中获取时间数据,并创建一种新的神经网络架构,该架构接受向量空间中的输入数据,而不是标准的 2D 向量表示图像。

大数据和人工智能技术在社会上越来越普遍。同时,消费者已经将隐私作为首要关注的问题,尤其是在使用连接到互联网的应用程序时。在一个个人数据构成个人数字身份的世界里,隐私问题变得至关重要。计算机视觉应用是人工智能监管讨论的前沿。一个例子是在公共场所使用人脸检测和识别系统。

至于我,我目前正在使用计算机视觉解决方案开发一个移动应用程序,该应用程序可以实时监控远程和办公室工作人员的姿势变化并提出建议。我参与的另一个令人兴奋的项目是使用笔记本电脑摄像头跟踪眼睛来检测读者中的读写障碍。毫无疑问,这些都是令人兴奋和有趣的项目。

如果你想了解更多关于计算机视觉和深度学习的知识,你可以在我即将到来的 O'Reilly live 培训课上和我一起学习。

https://www.oreilly.com/live-events/practical-introduction-to-the-world-of-computer-vision-and-deep-learning-with-tensorflow-keras/0636920060577/0636920060576/

想要更多吗?

  1. 订阅 在我发布文章时获得通知
  2. 成为推荐媒介会员,支持我的写作
  3. 通过 LinkedIn 联系我
  4. 跟我学学 奥赖利

亚马逊 RDS 让您物超所值

原文:https://towardsdatascience.com/the-most-for-your-money-from-amazon-rds-51784064da1f?source=collection_archive---------22-----------------------

绩效评估和成本节约方案

亚马逊 RDS 最物有所值—通过 Shutterstock 获取图片(标准许可)

Amazon RDS 是一个强大的托管数据库服务,可以根据您的需要轻松创建、扩展和配置。
然而,亚马逊 RDS,像大多数 AWS 服务一样,如果没有正确的设置和监控,会很快产生高额(更重要的是浪费)成本。
作为一名数据库维护人员,这份服务概述将为您提供如何让您的资金发挥最大价值的高级原则和工具。

*在本文中,我将重点介绍 PostgreSQL 数据库类型,但是其他 DB 引擎也有相同或非常相似的配置和指标。只有 Amazon Aurora —无服务器会有很大不同。

亚马逊 RDS 的主要成本来源

在创建或更新 Amazon RDS 实例时,您需要考虑 4 个主要的成本相关配置:实例类、多 AZ 配置、硬盘存储和供应的 IOPS,然后是支持服务:快照和到 S3 的快照导出。让我们深入探讨每一个问题。

实例类 ( 成本影响:高 )

实例类(作者图片)

这是成本的主要驱动因素。它定义了硬件类型用途、vCPU、CPU 信用、内存和网络性能。它是按小时计费的(和/或胸围积分,如果适用的话), RDS 有大量的实例选项供您选择。
实例类型列表及其用途此处和定价此处。

多 AZ 配置(成本影响:高)

多 AZ 配置(图片由作者提供)

它为您的实例增加了冗余,以防出现故障。对于生产数据库来说,这是必须的,但对于开发和试运行来说就不那么重要了。如果主实例出现问题,warm 实例将始终处于备用模式,因此成本几乎会翻倍。确保除非在生产环境中,否则不要使用它。

启用多 AZ 配置还会增加实例类型、硬盘存储和 IOPS 的成本。

硬盘存储(成本影响:中低)

存储自动缩放(图片由作者提供)

它可以是磁性、固态硬盘、+/-调配的 IOPS。这里的选项在成本方面没有太大的问题,即使磁性将比 SSD 便宜。它是按 GB 计费的,而且非常低。当然,如果你在几十万 GB 的数据库中,你可能要多注意这一点。调配的 IOPS 也会变得非常昂贵。

Pro 提示:当你设置存储时,选中“存储自动缩放”,它可以自动缩放(使用的额外存储之外),如果数据发生任何重大波动,它将防止你的数据库下降。造成这种情况的原因不仅仅是数据的增长,还可能是因为读取副本滞后、数据未被清空,或者在请求大量涌入时索引未被重构(仅举几个例子)。当然,你不应该依赖于这种长期的和调整“分配的存储”,一旦它被注意到和永久的。

快照(RDS 备份)(成本影响:低)

这是非常低的,对整个账单几乎无足轻重。您可能需要注意的是保留期,因为您需要支付备份、存储和数据传输的费用。对于非生产数据库,您可以将保留期设置为 3 -7 天,以消除长期存储成本。

供应 IOPS(成本影响:中到高)

IOPS 是一种额外的配置,默认情况下不会应用,但如果使用它们,您应该小心,因为它们会显著影响成本。

快照出口到 S3 (成本影响:低)

这不是大多数人使用的常见选项,但尽管如此,还是要意识到与此相关的成本。随着数据库规模的增长,it 成本也会增加。

性能测量&实例调整

既然您已经运行了数据库,那么您需要将重点放在监控和优化上。我已经确定了评估的主要指标:

  • 网络流通量
  • CPU 利用率和/或 CPU 信用使用
  • 可释放内存
  • 读 IOPS,写 IOPS
  • 突发余额和/或 CPU 信用使用

Amazon RDS-->(特定的)数据库实例-->监控(图片由作者提供)

这不是一个完整的列表,而是几个你应该注意的基本列表。这些特定的指标将决定是否需要改变。当我们在这里讨论节省时,您正在寻找浪费的资源或低于实例类允许的 50%的资源利用率。
理想的规则是,平均来说,您希望利用 75%的允许资源。是的,你甚至可以达到 85%-90%,但这真的会推动极限,如果意外的激增发生,你会走投无路。
让我们深入了解每项指标。

网络吞吐量

这里的用法将指示实例类类型的变化,特别是网络性能规范的变化。

CPU 利用率和/或 CPU 信用使用

评估 CPU 使用情况。如果您使用的太少,您可以缩减到具有不同的内核数量和 vCPU 单元的实例。

可释放内存

评估您使用了多少内存,尤其是在您的高峰期,75%左右的利用率是正常的。如果你用得太少,你可以缩减到一个更低内存容量的实例。

读 IOPS,写 IOPS

它决定了访问你硬盘的速度。此处的任何更改都将决定您的硬盘类型和/或配置/取消配置额外的 IOPS 的更改。
关于 IOPS 的更多信息和确定您的基本上限

突发余额和/或 CPU 信用使用

*仅适用于“可突发的性能实例”
如果您的实例类型属于此类别,请密切注意,因为可突发的实例可能会超出实例容量,这将产生成本。
另一方面,如果您没有使用这个选项,您可能希望获得一个具有较低 CPU 信用/小时的实例。为了评估最适合您的方案,您必须监控两个指标——“突发平衡”和“CPU 信用使用”。

警告:这些指标都不是独立工作的,因为实例类不是每个指标都可以配置的,但是它们是一组预定义的配置。您需要确定哪一对最适合您的用例。

专业提示:如果不永久投入生产,至少在最初几个月启用性能洞察。使用该工具,您将能够在您的堆栈上或直接在使用数据库的应用程序上微调查询、连接和许多其他事情。
通过这些内部的优化可以导致更广泛的实例优化,并潜在地降低实例类型的规模和更多的节省。
关于性能洞察的更多信息

节约成本的附加方式

保留实例

AWS 控制台- >亚马逊 RDS - >预约实例(图片由作者提供)

如果您打算长时间运行同一个实例,那么保留实例(RI)是一个不错的选择。如果您承诺一年或更长时间,它可以为您节省大约 30%到 50%。
一个有趣的细节是,您正在为一个特定的实例类类型所使用的单元付费。这种承诺允许您通过仍然利用预留来扩大或缩小同一个实例类。
关于保留实例的更多信息

建立账户/服务预算

最后,如果您不确定您需要什么样的配置属性,您至少应该建立一个预算并相应地进行监控。您可以在“我的计费仪表板”->“预算”下完成此操作。这不会直接帮你省钱,但这是监控成本的主动方式。

结论

这是一个非常简短的介绍,介绍了如何在高层次上评估您的 Amazon RDS 实例,但是它应该让您朝着正确的方向开始。如果您需要更深入的研究,您将必须彻底阅读 Amazon RDS 文档,通过 CloudWatch 和 Performance Insights 保持监控,并检查什么最适合您的用例。

另外,阅读

亚马逊 S3 最划算

联系人

我是一名软件、数据和机器学习顾问,通过了 AWS 机器学习 & AWS 解决方案架构师认证——专业。如果您的下一个机器学习项目需要帮助,请联系我们。
关注我的最新文章和项目,关注我的媒体。

其他联系人:

  • 领英
  • 中等轮廓
  • GitHub

亚马逊 S3 最物有所值

原文:https://towardsdatascience.com/the-most-for-your-money-from-amazon-s3-6536c78189da?source=collection_archive---------24-----------------------

在节约的前提下利用云存储的强大功能

亚马逊 S3 的最物有所值——图片来自 Shutterstock(标准许可)

亚马逊 S3 是 AWS 旗下的文件基础云存储。它可以用于任何类型和大小的文件。它具有无限的可扩展性、持久性和行业标准安全性(正确配置时为**)。它可以作为一个网站资产主机,一个实际的网站,或一个数据湖,它的即插即用与任何 AWS 服务。*

对于大多数零件来说,亚马逊 S3 非常便宜。但是,当数据不断堆积时,这可能具有欺骗性,并且没有针对最佳预算进行监控。无论您是数据工程师、数据科学家还是网站管理员,您都可能会陷入不必要成本的陷阱。在这篇概述中,我将向你展示在亚马逊 S3 上超支最常犯的错误,以及如何从一开始就避免它们。

*亚马逊 S3 是一个非常严格的系统,有许多用例。在我的概述中,我将介绍最常见的方法以及在其中需要寻找的内容。

存储类

存储类是 S3 的核心,也是最容易被忽视的选项,因为人们会选择默认的——S3 标准通用类。将数据放入(或移动到)正确的位置将是成本的一个驱动因素。在选择存储类别时,需要考虑的是数据的生命周期和更长时期的访问频率

存储类别快速概述:

S3 标准—通用 这是最常见的一种,也是您默认启动的一种。它用于经常使用的数据。

S3 智能分层
该层用于未知或不断变化的访问模式。它会自动确定哪些数据不经常被访问,并为您移动这些数据。您可能会为监控支付额外的费用,但是如果您真的不知道您的数据,并且没有设置生命周期规则,这是值得的。您还需要为每 1000 个生命周期事务请求付费,因此,如果您有大量数据,您不希望在存储类别之间来回移动太多,这样可能不是您的最佳选择。

S3 标准-IA-频繁访问:用于检索频率较低但需要快速传输的数据。这是一种较低的存储成本,但您需要为数据检索付费。

S3 一区-IA: 数据访问不太频繁的地方。顾名思义,它不是由第二个区域备份的,所以它应该只用于可复制的数据,类似于第二个备份。

S3 冰川:不常用的访问层。可以在几分钟到几小时内检索数据。这是存储备份或旧版本的地方。存储很便宜,但是你要为数据传输付费。

S3 冰川深层档案馆:专为极不频繁的访问而设计,一年大约 1-2 次。数据检索可能需要几个小时。存储是所有选项中最便宜的,但你要为数据传输付费。

S3 前哨:用于本地存储,与 S3 API 交互以获取数据。当您有内部数据存储需求时,这是理想之选。

关于 存储类 存储类定价 的更多信息

生命周期规则

“创建生命周期规则”位于“管理”选项卡下(按作者分类的图像)

生命周期规则的主要思想是在存储类之间自动移动数据,删除旧数据或版本。功能非常强大,超级好用。从我的经验来看,它通常根本不被使用。生命周期规则是一劳永逸的,是一种“无服务器”的方式来抽象您的数据管理,并通过设计保持低成本。

版本控制

亚马逊 S3 版本设置(作者图片)

这是一个非常简洁的特性。适合审计需求。如果您需要使用此选项,您在这里可以做的最好的事情是将旧版本过渡到更便宜的长期存储类别,或者通过生命周期规则在几天内删除旧版本。

版本控制的生命周期规则示例

您将为多次存储数据付出代价,这就是为什么我建议以生命周期规则为例:

版本控制的生命周期规则示例(按作者分类的图像)

1.从 S3 标准(假设它是默认的)在 1 天内将旧版本移动到 S3 标准-IA。从 S3 斯坦达尔-IA 在 4 天内将文件转移到 S3 冰川
现在,请注意与转移到 S3 冰川相关的每个文件的转移成本。

关于版本控制的更多信息

加密类型&成本

亚马逊 S3 加密设置(作者图片)

在 S3,您可以选择加密静态数据。您可以加密整个桶或单个文件夹/后缀。您可以选择使用亚马逊 S3 密钥(SS3-S3)或 AWS 密钥管理服务密钥(SSE-LMS)。如果你使用一个自定义的(你自己的)KMS 键,它的工作方式是每次你从 S3 读取一个对象时,它也会调用 KMS API,这会产生成本。例如,如果您使用 S3 作为数据湖,或者使用 Athena,那么每次读取文件都会增加不必要的成本。您确实可以选择 Bucket Key,通过最大限度地减少对 KMS 的 API 调用来降低成本,但您最终还是要支付一笔竞价。

我建议你去 SS3-S3,除非你有其他要求。

*加密可能是一个特定的项目要求,在这种情况下,您需要选择最佳架构,并向利益相关方说明成本。

关于亚马逊密钥管理服务(KMS)的更多信息

S3 为数据湖

在 S3 上为数据湖存储数据时,p artitioning文件格式是这里的主要关键字。您希望以一种需要对更多文档进行更少扫描的结构来组织文件。会更快更便宜。这也是生命周期规则再次发挥作用的地方,它可以帮助您自动清除任何陈旧数据或将其归档到长期存储中。

此外,确保以尽可能小的格式存储数据。例如, Parquet 或 Orc 将是从 AWS Athena 查询数据和从 AWS Glue 爬行的理想选择。默认情况下,大多数 AWS 服务都支持这两种格式。这不仅是最佳实践,而且可以最小化存储大小。

网络服务的 S3

这里最常见的用例是托管网站图像或其他资产,如 javascript、样式表(CSS)、缩略图等。你甚至可以在 S3 上建立一个静态网站。在所有这些使用案例中,您将为数据传输到互联网付费。如果这是您的预期用例,您肯定应该使用 Amazon CloudFront 来缓存任何长期永久资产,并从那里为它们提供服务。这还将大大提高资产加载的速度,并降低直接从 S3 读取数据的成本。是的,你需要为 CloudFront 付费,但这比直接使用 S3 要少得多。

结论

S3 的大部分零件都非常便宜。前 50 TB 的标准存储仅为每 GB 0.023 美元(撰写本文时的价格)如果您是一家大型或小型企业,这对您来说可能不是一个大数目。我个人不喜欢口袋漏水,为什么不从我的项目一开始就防止任何损失。对于基于 AWS 的构建,我总是遵循 AWS 良好架构框架的5 Pillers,成本在其中扮演了重要角色。希望我给了你一些好的见解,告诉你如何在亚马逊 S3 上从几块钱到几个猎人。*

另外,阅读

亚马逊 RDS 最划算

联系人

我是一名软件、数据和机器学习顾问,通过了 AWS 机器学习 & AWS 解决方案架构师认证——专业。如果您的下一个机器学习项目需要帮助,请联系我们。
关注我的最新文章和项目,关注我的媒体。

  • 领英
  • 中等轮廓
  • GitHub

你在学校学不到的最重要的数据课程

原文:https://towardsdatascience.com/the-most-important-lesson-on-data-that-you-dont-learn-in-school-2a09b96465f0?source=collection_archive---------24-----------------------

以及为什么它如此重要

当我回想起我在大学和数据科学训练营做的项目时,我回忆起获得好的、干净的数据是多么容易。只需从 Kaggle 点击“下载”,你就有了可用的数据和一个整洁的小数据字典。或者,也许你收集了你自己的数据,所以你可以完全控制你的样本量,你对数据了如指掌。

啊,那些日子。

由马特·拉格兰在 Unsplash 上拍摄的照片

我的大部分数据科学课程始于数据科学项目周期的第 2 步,这是我在进入职场后真正学到的。第一步是获取和清理数据。那么我认为关于数据最重要的一课是什么?归结起来就是这句老生常谈:垃圾进,垃圾出。

在开始获得业务洞察力之前,在建立模型之前,在进行探索性数据分析之前,您需要良好、干净的数据。这是一个显而易见的说法,但我认为它在教育中被忽视得太快了。然后,你开始找工作,专业人士会抛出类似“一个数据科学家 80%的时间都花在清理数据上”的统计数据。[ 1

…但那真正的是什么意思呢

这意味着如果没有高质量的数据,你的分析就没有洞察力。这意味着没有正确格式的数据,您的模型将无法工作。这意味着如果你从错误的数据开始,不解决或者至少不理解数据集中的问题,你的项目从一开始就注定失败。我并不想悲观,只是更现实地看待数据收集和数据清理过程的重要性。

有许多问题会导致数据领域中的“垃圾”项目结果。人们厌倦了清理数据,因为这可能非常乏味。或者可能是因为公司缺乏适当的数据治理,所以进来的数据质量很差。也许分析师有一些数据,但是因为数据收集成本很高,所以没有足够的数据来建立模型。

不管是什么原因,匆忙完成——甚至跳过——数据清理过程可能对您的分析有害。

那么,一个有抱负的数据分析师应该做些什么呢?以下是我的一些建议:

1。为学校(或个人)项目练习使用真实、杂乱的数据。

这可能包括学习更多的技能,比如网络抓取。这将比挑选一个完美整洁的数据集更难,但建立这些批判性思维和编码技能可能对你未来的职业生涯非常有价值。

另外,如果你正在找工作,这是建立你的项目组合的好方法。

2。对如何收集数据以及任何已知或潜在的差距保持透明。

当我开始一个项目时,我发现列出我的假设和数据中的潜在差距很有帮助。透明可能会让同学(或同事)发现盲点或错误的假设,从而使结果无效。此外,明确你的发现的局限性是合乎道德的,尤其是当你在做规定性分析的时候。

3。在进入分析模式之前,请确保您真正理解了数据。

有时候我在项目中最难理解数据。一旦我获得了数据,我必须花一些时间与公司的主题专家或我的好朋友谷歌一起更好地了解数据的背景。

了解源数据有助于您了解如何在数据清理期间处理某些字段。例如,了解数据集中记录的唯一性有助于了解如何将它们连接在一起。了解字段的含义有助于您确定应该将它们更改为什么数据类型。最后,了解您的数据字段如何相互关联可以为您在为建模预处理数据时需要进行的转换提供信息。

照片由在 Unsplash 上绘制

数据清理还有许多其他的成功策略,但是这些是我根据自己的经验想到的最好的策略。我希望你能从我所犯的错误中有所收获,不要采用上述三种策略。

简而言之,数据清理很难,但对数据分析师或数据科学家的成功至关重要。虽然学校的课程通常侧重于分析方法,但数据清理总是必须放在第一位。

感谢阅读!如果你想在收件箱里看到我的新故事,你可以订阅我的个人资料。

最重要的编程课

原文:https://towardsdatascience.com/the-most-important-programming-lesson-62467a9a4150?source=collection_archive---------44-----------------------

意见

学习编程的趣闻和调试技巧

布雷特·乔丹

2012 年秋天,我走进研究生导师的办公室,问她推荐我报读哪个计算机科学班。我解释说我完全是编程新手。她建议介绍 C 编程。听了几次讲座后,我发现在这个入门课程中,我交谈过的大多数学生都有一些编程的经验。六周 80 小时的工作后,我放弃了这门课程。

进入 2013 年春季学期。我参加了一个更简单的计算机科学课程,通过网络的计算机编程入门。我轻松地通过了课程的前四分之一,轻松地执行 HTML 和 CSS。然后,我们开始了 Javascript (JS)。我之前的计算机科学课程带给我的那种持续的焦虑和压力感又回来了。学期太晚了,不能放弃这门课,所以我向一个朋友求助。

一天下午,他向我介绍了我的 JS 代码,并解释了如何在这里和那里添加一些代码来测试您的函数是否按预期工作。他向我展示的是一种非常基本的调试形式,即识别和消除计算机硬件或软件错误的过程。他和我都不明白这 60 分钟的辅导课可能会对我的职业轨迹产生的影响。回顾过去,毫不夸张地说,这是我在计算机科学和技术方面学到的最重要的一课。

如果你以前从未写过任何代码,想象你的任务是画一只完美的鸟。每次你完成画并把它交给老师,老师会立即决定它是正确的还是不正确的(即二元结果)。每当试卷有瑕疵时,老师就会把它撕掉。如果你问老师出了什么问题,他们会用外语(即计算机错误语言)向你解释这个问题。最终,在老师尝试了几十次后,他们可能会接受你的画,你的分数会从错误变为正确。读完这个故事,你可能不会认为我的下一个声明是如此大胆(双关语)。

在学术界,没有什么比学习写代码更能考验你的耐心和承受不断拒绝的能力了。

在学习编码时,唯一能给你安慰的是你是否理解了调试的基础。现在,当我画一只鸟时,老师会提供反馈,看鸟喙是否好看,颜色是否合适,大小是否合理。有了这些反馈,你的提交就更有可能是正确的,而不会被拒绝。

无论您是否定期编写代码,调试的基础知识在您的生活中都会非常有用。每当你需要使用任何种类的软件应用程序或工具时,它们都适用。根据我个人在技术方面的经验,这里列出了我最喜欢的各种软件应用程序和工具的调试技巧和诀窍。

使用 Web 应用程序

Web 应用程序是用户通过 web 浏览器访问的计算机程序。常见的网络应用程序有脸书、Gmail 和 Salesforce。如果您在使用 web 应用程序时遇到问题,通常可以通过以下方法之一解决问题:

  • 尝试不同的浏览器。在某些浏览器中,各种功能可能无法工作
  • 关闭插件。插件可以影响浏览器中的 web 应用程序
  • 清除 web 浏览器中的缓存
  • 重新启动 web 应用程序
  • 检查该问题是否特定于您的应用程序版本。
  • 确认您拥有哪些安全角色。某些功能可能不可见,因为您没有权限。
  • 重新启动计算机

导入数据文件

导入数据文件(如 xls、CSV、pdf 等。)到 web 应用程序或一段代码中是一项常见的任务。常见问题往往与以下内容有关:

  • 检查列名引用是否正确。它们可能区分大小写。
  • 删除任何无法识别的字符。尝试用 UTF 8、UTF-16 或 ASCII 编码文件。
  • 注意前导零和/或前导零被去除。检查数据类型,是字符串、浮点还是整数。
  • 从数据中删除前导和尾随空白
  • 检查文件是否为正确的文件类型(例如 xls、csv、pdf、jpg)
  • 确认列中的所有值都在可接受的规则范围内。有些列需要特定的数据类型(如字符串、整数等)。)和/或它们可能要求该值存在于受控列表中(例如,在颜色列下仅接受“红色”和“蓝色”)
  • 导入前删除所有空白行
  • 导入后的电子邮件通知可能会发送到您的垃圾邮件文件夹

所有编程语言

  • 检查整个脚本中的变量值,查看它们是如何变化的
  • 打印出函数中的文本,以测试它们是否以及何时被执行
  • 使用集成开发环境
  • 在代码中使用大量的注释
  • Stackoverflow 和 Google 是你的朋友
  • 检查您正在使用的编程语言或库的版本。不同版本之间的事情可能会发生巨大的变化。
  • 将冗长的代码片段分解成较短的片段。例如,不要用一个巨大的 JSON 字符串测试代码,试着在一个小的子集上测试它。更好的是,创建自己的 mini-JSON 字符串来进行测试。
  • 为每一行代码一步一步写下计算机的动作。 Python Tutor 提供了一个很棒的视觉效果,带你一行一行地执行代码。web 工具适用于 Python、Javascript、Java、C 和 C++。
  • 检查是否有人为您的特定用例创建了一个可以让生活变得更简单的包。例如,在 Pandas 中操作数据要比使用原生 Python 容易得多。

Javascript 编程

  • 在函数中使用 console.log()打印文本或变量值,以测试它们是否以及何时在脚本中执行
  • 经常清理你的浏览器缓存
  • 尝试不同的网络浏览器——插件会干扰代码
  • 升级您的 web 浏览器—旧版本可能不受支持

Python 编程

  • 对象名称区分大小写(例如,“变量名称”与“变量名称”不同)
  • 请密切注意错误消息。他们通常会解释问题是从哪一行开始的。
  • 检查这是否是 Python v2 相对于 Python v3 的变化
  • Python 有很棒的文档

SQL 编程

  • 测试脚本时,利用限制来提高性能
  • 检查是否由于您使用的 SQL 数据库而存在特殊的语法规则或限制。例如,MySQL 使用#作为注释行的开头,而 PostgreSQL 使用--作为注释
  • 不要用保留字来命名表格或变量
  • 通过在 Excel 中复制对数据子集的预期操作,确认输出表是正确的。

最重要的调试建议

说到学习计算机科学和编程,我希望我的教授们强调学习调试代码的重要性。希望我的提示和技巧能减少你写代码时的焦虑和挫败感。哦,我把最好的建议留到了最后。

如果你不能解决一个问题,先睡一觉,稍后再回来。

说真的。带着更少的压力和全新的视角来帮助你在几分钟内找到解决方案,而不是前一天花几个小时。这个建议一次又一次给我带来了好处。前几天,我花了 5 个小时写一个 JS 脚本,但毫无进展。几天后我又回到了这个问题,当我重新打开浏览器时,我很快发现这是一个缓存问题。这个建议唯一不起作用的时候是没有时间的时候。小心点,拖延者们!
数据通才

数据工程师最重要的工具

原文:https://towardsdatascience.com/the-most-important-tool-for-data-engineers-f06a05f19ee1?source=collection_archive---------14-----------------------

与 Python 或 SQL 无关

由艾米丽·莫特在 Unsplash 上拍摄的照片

解决错误问题的最好的技术专家注定会沮丧和失败。然而,我们经常看到伟大的 Python 开发人员和 SQL 专家开发出不可思议的技术,却没有给企业增加多少价值。在某些情况下,情况更糟。这些解决方案消耗了资源,扰乱了业务流程,而不是有争议的价值。作为数据工程师,我们有责任充分理解我们的解决方案所支持的业务流程。

作为高级数据工程师,我们应该非常了解业务,我们建议提高工作效率和改进工作方式。一个大胆的声明,但我会舒服地死在这把剑上,和任何不同意的人战斗。当然是象征性的,因为我没有剑,我更像一个情人而不是战士。关键是,我们需要了解业务,有一个重要的工具可以帮助我们实现这一目标。

在我们开始之前,请阅读 Julien Kervizic 的精彩语录,它简洁地指出了问题所在:

“如今,通过了解底层数据和随之而来的业务流程来塑造数据,似乎没有移动数据的能力那么重要。”

他在这里说的是,我们如此专注于将数据从那里移动到这里,以及我们可以用来做这件事的所有酷工具,我们已经忘记了我们最初做这些事情的原因。数据工程师从多个来源收集原始数据,并创建可消费的包,使人类和机器能够有效地使用。对于我们的消费者来说,介于两者之间的一切都是一个黑匣子。为什么我们把大部分时间和精力花在黑盒上,而不是耗材包上?

愤世嫉俗的观点会说这是因为黑盒是有趣的部分。虽然这可能是等式中的一个因素,但我相信我们中的许多人只是没有足够好地理解业务流程,以有效地将时间花在改进可消费包上。让我说清楚。更好地理解业务是你的工作和责任。不容易。在一个完美的世界里,我们有很好的文档可以依赖,但是…嗯…你知道。这是我们数据工程工具箱中最重要的工具。

这是什么必备工具?

问题。就在那里。问题。很多人。好的。不好的。尴尬的。所有的问题!这对你来说足够重要了吗?你想从优秀走向伟大吗?提出问题,充分理解你所支持的业务流程。与一个只关心技术的数据工程师交谈是多么令人沮丧,我怎么强调都不为过,而我就是一名数据工程师。想象自己是一名财务分析师、人力资源主管或销售人员。他们需要可消费的数据包,但可能不懂技术术语。除了他们使用的特定工具之外,他们可能对技术知之甚少。

所以,仅仅提问是不够好的。相反,我们需要用企业理解的语言提出正确的问题。忘记表、数据源和主键。这些事情随后发生,并且通常由更多人的更多问题来决定。相反,问问人们在日常工作中做些什么。询问业务目标是什么。工作如何在不同的系统中流动。问,直到你完全理解该公司使用的业务流程。然后记录下来。

撰写业务文档。当然,这是他们的工作,但你是需要它的人。创建流程图,包括企业使用的任何工具。包括人们与过程交互的地方。然后和业务一起回顾,多问问题。您可能会发现没有一个人了解所有的事情,所以您会与几个人交谈,最终统一业务流程。您编写的文档将成为企业的一个有价值的工件。嘭!你刚刚成为公司的无价之宝。我敢说,你刚刚成为一名高级数据工程师?

已经包好了

作为数据工程师,理解我们的解决方案所支持的业务流程是我们的责任。如果不完全理解这些过程,我们注定会沮丧和失败。我们生活的这个不完美的世界通常没有得到很好的记录,而我们这些数据工程师就是需要弄清楚这一切的人。通过问很多很多问题,我们更好地了解了我们的解决方案所支持的业务流程,这使我们能够不断提高我们工作的影响力。所以,开始吧。质疑一切!

要了解这些问题如何导致商业文件,请阅读苏在 Krispy Krabcakes 的冒险经历。她非常有趣,并为商业分析和架构提供了很好的基础。

伟大的数据工程师最重要的特质

原文:https://towardsdatascience.com/the-most-important-trait-of-great-data-engineers-8badc589c88e?source=collection_archive---------24-----------------------

你很想知道吗?

马尔科·布拉泽维奇在 Unsplash 上的照片

我接触过或读到过的所有伟大的数据工程师都有一个共同的特点。相反,所有不太好的数据工程师都缺少这一关键要素。不是某种特定工具的技能或知识,而是一种内在的固有品质。数据工程师每天都在解决新的问题,如果没有这个最重要的特征,我们可能无法交付任何有价值的东西。

现在,我们已经谈到了对数据工程师来说最重要的技能,这个特质是相关的。如果没有这个关键因素,你可能会在学习新工具和流程时遇到困难。先说个例子。我需要将文件从 FTP 服务器转移到 Snowflake。这些文件是 zip 格式的,有些文件的大小约为 1G。雪花不支持 zip 格式,喜欢 100m 或更小的文件。这创造了一个有趣的小挑战。

FTP 到雪花工作流的数据流

我需要从 FTP 下载 zip 文件,解压,分割成更小的文件,然后上传到雪花阶段。每天都有新文件创建,所以这需要自动化。由于我们没有使用气流,我不能使用现有的运营商和 Fivetran 似乎是一个小问题的昂贵解决方案。对于我的首选脚本语言 Python 来说,这似乎是一项伟大的任务。但是我的经理向我挑战。

思维不同

不写新的应用程序能做到吗?嗯,我不这么认为。对于脚本来说,这似乎是一个简单的例子。这让我很好奇。这不是一个简单的 Python 脚本。我必须查询 FTP 服务器,看看有什么文件存在。下载它们,解压,然后分割成更小的文件。考虑到过程中可能出现的所有问题,这似乎是相当多的编码。也许有更好的方法。我的好奇心被激起了。

一定有人已经解决了我面临的许多问题。我发现 LFTP 有一个镜像命令,可以从 FTP 服务器下载任何新文件。Linux 有一个为将文本文件分割成更小的块而定制的 split 命令。也许 Python 不是正确的解决方案。最重要的是,我们已经在 Kubernetes 集群中配置了 ARGO,因此工作流管理已经存在。长话短说,我把自己换成了一个很小的 shell 脚本。实际上,有几个。那么,这和数据工程师最重要的特质有什么关系呢?

已经是什么了!

我想你知道我们在说什么。是好奇。你天生好奇吗?你喜欢弄清楚事物是如何工作的吗?想出巧妙的方法来解决难题?什么事?太好了,你会成为一名优秀的数据工程师,因为好奇心是所有伟大的数据工程师的基本特质。我们不能依靠现有的模式来解决每个问题,所以我们必须拿出自己的模式。要做到这一点,我们需要好奇。我们需要不断地接触新的工具和流程。做事的新方法。

数据工程师每天都在解决新问题,如果没有好奇心,我们可能无法交付任何有价值的东西。好奇的数据工程师阅读了博客,观看了视频,并使用了新工具。他们重新评估了旧技术,并找到了利用它们的新方法。当挑战出现时,他们会研究并利用现有的知识来寻找聪明的解决方案。这就是为什么我认识的所有伟大的数据工程师都天生好奇。但是,他们不杀猫。

2021 年数据科学家最需要的技能

原文:https://towardsdatascience.com/the-most-in-demand-skills-for-data-scientists-in-2021-4b2a808f4005?source=collection_archive---------7-----------------------

来自 15,000 多个数据科学家职位发布的网络搜索结果

作者创建的图像

对 15,000 多个数据科学家职位发布的最受欢迎技能的深入分析。

简介

请务必点击 订阅此处 或我的 个人简讯 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!

我只想说,这在很大程度上受到了杰夫·黑尔在 2018/2019 年写的文章的启发。我写这篇文章只是因为我想获得对当今需求技能的最新分析,我分享这篇文章是因为我假设有人也希望看到 2021 年数据科学家最需要的技能的更新版本。

从这个分析中得到你想要的-很明显,从网络搜集的招聘信息中收集的见解与实际上最需要的数据科学技能并不完全相关。然而,我认为这给了你一个很好的提示,告诉你应该更关注什么样的一般技能,同样的,也应该远离这些技能。

也就是说,我希望你喜欢这个,让我们开始吧!

方法论

为了这个分析,我从 Indeed、Monster 和 SimplyHired 网站搜集并积累了超过 15000 条招聘信息。我没有抓取 LinkedIn,因为我在抓取时遇到了验证码问题。

然后,我查看有多少招聘信息包含了我正在搜索的每个词。我搜索的术语列表如下( )如果你想看其他技能,请在评论中提出,这样我可以添加到明年的分析中! ):

  • Python,SQL,R,Java,Git,C,MATLAB,Excel,C++,JavaScript,C#,Julia,Scala,SAS
  • scikit-学习,熊猫,NumPy,SciPy
  • Matplotlib,Looker,Tableau
  • TensorFlow,PyTorch,Keras
  • Spark,Hadoop,AWS,GCP,Hive,Azure,Google Cloud,MongoDB,BigQuery
  • Docker,Kubernetes,气流
  • NoSQL、MySQL、PostgreSQL
  • Caffe,Alteryx,Perl,Cassandra,Linux

从每个来源获得计数后,我将它们相加,然后除以数据科学家职位发布的总数,得到一个百分比。例如,Python 的值 0.77 意味着 77%的职位发布中包含 Python。

最后,我将结果与杰夫·黑尔在 2019 年所做的分析进行了比较,以获得 2019 年至 2021 年的百分比变化。

请务必在此 订阅 或我的 个人简讯 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!

结果

顶级技能

以下是 2021 年最受欢迎的 25 项数据科学技能,从高到低排列如下:

作者创建的图像

顶级编程语言

为了获得更详细的信息,下面的图表显示了供数据科学家使用的顶级编程语言:

作者创建的图像

Python、SQL 和 R 是排名前三的编程语言并不奇怪。

就我个人而言,我也袖手旁观这样的事实,你应该知道 Python 或 R 以及 SQL。我是从 Python 开始的,我可能会一辈子都坚持使用 Python。就开源贡献而言,它遥遥领先,而且学习起来很简单。SQL 可以说是任何与数据相关的职业类型中最重要的技能,无论你是数据科学家、数据工程师、数据分析师还是业务分析师,这个清单还可以继续列下去。

顶级 Python 库

同样,下图显示了数据科学家的顶级 Python 库:

作者创建的图像

TensorFlow 排名第一,因为它是最受欢迎的深度学习 Python 库之一。PyTorch 是一个强有力的选择,因此它的排名不会落后太多。

Scikit-learn 可以说是 Python 中最重要的机器学习库。在使用 Pandas 和/或 NumPy 清理和处理您的数据后,scikit-learn 用于构建机器学习模型,因为它有大量用于预测建模和分析的工具。

在我看来,熊猫、NumPy 和 SciPy 对数据科学家来说也是必不可少的,尽管它们有上述的表现。

增长最快和下降最快的技能

下面的图表显示了从 2019 年到 2021 年增长和下降最快的技能:

作者创建的图像

作者创建的图像

以下是上面两张图表中的一些要点:

  1. 与云相关的技能有了巨大的增长,比如 AWS 和 GCP。
  2. 类似地,与深度学习相关的技能也有很大增长,如 PyTorch 和 TensorFlow。
  3. SQL 和 Python 的重要性持续增长,而 R 仍然停滞不前。
  4. Apache 产品,如 Hadoop、Hive 和 Spark,重要性继续下降。

感谢阅读!

请务必在此 订阅 或我的 个人简讯 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!

我希望这个分析对你有用。我不会完全证明仅仅基于这种资源选择学习一种技能而不是另一种技能的决定是正确的,但是正如我之前所说的,我认为这给出了一个很好的主意,关于什么在重要性上增加和减少。

如果你喜欢这个,请一定要关注我的 Medium,一如既往,我祝你在学习中一切顺利!

不确定接下来要读什么?我为你挑选了另一篇文章:

又一个!

特伦斯·申

  • 如果你喜欢这个, 跟我上媒 了解更多
  • 有兴趣合作吗?让我们连线上LinkedIn
  • 报名我的邮箱列表 这里

罗马到整数问题的最现成的代码

原文:https://towardsdatascience.com/the-most-out-of-the-box-code-for-roman-to-integer-problem-4291132091e9?source=collection_archive---------38-----------------------

学习机

这绝对是我遇到的最聪明的解决方案之一

Erda Estremera 在 Unsplash 上拍摄的照片

你是软件工程师还是数据科学家?你为编码面试做好准备了吗?如果你对这两个问题的回答都是肯定的,那么你很可能听说过 LeetCode 。

对于那些不熟悉 LeetCode 的人来说,这是一个充满了数千个编码问题的网站,人们可以用它来训练自己的编码技能。在撰写本文时,它有 1835 个问题,并且还在增加。

我强烈建议大家不管你的专业是什么,都要坚持练习自己的解题技巧。以我的经验,几乎所有职位,从后端、前端、机器学习工程师,到数据科学家,通常在面试过程中都有一轮或更多的编码。

如果你进入问题页面,你会看到问题列在一个表格里,就像这样。

作者 LeetCode 问题截图

大多数问题都有 LeetCode 提供的解决方案,但其中一些需要您以每月 35 美元或每年 159 美元的价格订阅 LeetCode。我只是说,人们几乎总是会在讨论页面上发布他们自己的解决方案,所以你可以利用这些信息做你想做的事情。

不过说真的,我经常在讨论页面而不是解决方案页面找到最佳解决方案。

这是我在 LeetCode 中遇到的最喜欢的解决方案之一。

罗马到整数问题

第一页列出的一个问题是罗马数字到整数的问题,任务是将罗马数字转换成整数。比如“VIII”变成 8,“MCMXCVII”变成 1997。

幸运的是,罗马数字被限制在 1-3999 的范围内,所以我们将使用的最大数字是代表 1000 的 M。

问题最难的是处理像“IV”、“IX”、“XL”等案件。其中较小的数在较大的数之前,并导致该数被减去而不是相加。

所以我在那里,在让解决方案工作并通过所有测试用例之前,尝试编码 10 分钟。

和往常一样,我查看了讨论页面,了解其他人对这个问题的看法。然后,我遇到了这个解决方案,声称它比 99.78%的要好。当然,我很好奇,不得不点击它。这是解决方案。

通过 hgrsd 解决

罗马人很可能会被它如何屠杀他们的数字系统所激怒。抱歉,伙计们。- hgrsd

我完全同意他的观点。

该解决方案没有为“IV”、“IX”等创建特殊的逻辑,而是用更容易处理的“IIII”、“VIIII”等形式来替换它们。

这将使问题更简单,因为代码只需要在罗马数字中添加每个字符。

这个解决方案是多么巧妙,我大吃一惊。的确,它违反了正确罗马数字的规则,但考虑到问题的限制,它可以给出正确的答案。

这是我比较后想出的解决方案。

原则上,它检查下一个罗马字符是否比当前字符大。如果答案是肯定的,那么它会减去这个数字,而不是相加。

考虑到问题的局限性,两种解决方案都会很有效。然而,第一个解决方案让我开怀大笑,而相比之下,我的解决方案有点无聊。

结论

当我面对同样的问题时,看到别人的方法和我的有多么不同,这让我着迷。我想感谢 LeetCode 为每个问题提供了解决方案和讨论页面。

我总是在讨论页面中找到最好和最有创意的解决方案。

我记不清有多少次我对自己说,“为什么我没有早点想到这个?”在看到像这样的现成解决方案后。

许多其他问题的解决方案也同样非常规,但这一个很容易就能解决问题。

即使您没有准备面试,我也强烈建议您偶尔练习一下 LeetCode。它将帮助你保持你的编码技能,并保持在你的游戏的顶端。

谁知道您可能会在问题中想到或发现什么?

学习机是一系列关于我所学的东西的故事,我认为很有趣,可以分享。有时也是关于机器学习的基础。 定期更新 新故事,并 成为 中级会员,阅读无限故事。

https://chandraseta.medium.com/membership

分析约 100 万条评论后,Reddit 上最受欢迎的语言

原文:https://towardsdatascience.com/the-most-popular-languages-on-reddit-analyzed-with-snowflake-and-a-java-udtf-4e58c8ba473c?source=collection_archive---------9-----------------------

Reddit 上最流行的语言(除了英语)会让你大吃一惊。为了构建这个图表,我用雪花和 Java UDTF 分析了将近一百万条 Reddit 评论(不到两分钟)。

Reddit 上最受欢迎的语言,分析了 1M 评论后:英语,德语(!),西班牙语,葡萄牙语,法语,意大利语,罗马尼亚语(!),荷兰语(!)…

与母语为英语的人数相比,结果令人惊讶:

Reddit 上的热门语言— 全图 + 更新 Tableau 互动(作者)

德语是 Reddit 上第二受欢迎的语言——这可能是本周 Reddit 在柏林开设办事处的一大原因:

每天都有数百万德国用户涌向 Reddit,与那些有相似兴趣的人一起寻找社区和归属感,随着 47%的用户年增长率,德国现在是我们第五大用户群的所在地。今天,我们正式向我们在欧洲中心的朋友们问好,并通过地面上的专门团队打开我们在柏林的大门。

在本帖中,我们将在 Snowflake 中用 Java UDF 分析近百万条 reddit 评论的结果——不到两分钟。还有哪些语言、地区、话题在 Reddit 上有很高的代表性?

分析

我从前 40 个子编辑之外的将近一百万条 Reddit 评论开始(在下面找到构建这个样本的确切规则)。一旦分析完成,就会发现只有约 3%的评论是用英语以外的语言写的:

约 97%的 Reddit 分析评论是英文的

最受欢迎语言的排名令人惊讶:Reddit 上第二受欢迎的语言是德语。第三个是西班牙语(没那么令人惊讶),接下来是葡萄牙语、法语、意大利语、罗马尼亚语和荷兰语:

Reddit 上除英语之外最受欢迎的语言(图片由作者提供)

这些结果令人惊讶,因为德语是世界上第 12 大流行语言。作为一种语言,法语甚至比德语更受欢迎,但德语社区在 Reddit 上发现了更多的吸引力。

根据维基百科,这些是世界上使用最多的语言——这个列表与 Reddit 在其用户中看到的完全不同:

维基百科:按使用者总数排列的语言列表

一种语言,许多子编辑

德语 subreddits: 大多数德语注释位于/r/de 中,即德国的 subreddit,其次是/r/Austria,然后是/r/Finanzen 中的金融对话。其次是德语版的/r/me_irl: /r/ich_iel/ 。

(图片由作者提供)

西班牙语 subreddit:西班牙语中最大的 subred dit 是/r/argentina。这很令人惊讶,因为墨西哥的人口是他们的 3 倍,但是/r/mexico 只有他们评论的 1/3。

(图片由作者提供)

葡萄牙语 subreddit:葡萄牙语中最大的 subred dit 是/r/brasil,其次是/r/portugal。这很令人惊讶,因为巴西的人口是他们的 20 倍,但/r/brasil 的评论只有他们的 1.5 倍。他们最受欢迎的话题是告白、未经审查的内容、足球、投资和性。

(图片由作者提供)

法语 subreddits: 令人惊讶的是/r/Quebec 是仅次于/r/france 的第二大法语 sub。

(图片由作者提供)

以此类推:列表继续

代表多种语言的子编辑(图片由作者提供)

一个子编辑,多种语言

一些子编辑处理多种语言的内容。常见的组合是英语加上另一种语言,然后是/r/塞尔维亚,它将其注释分为波斯尼亚语、克罗地亚语和塞尔维亚语:

带有多语言注释的子编辑(图片由作者提供)

操作方法

获取 100 万条 reddit 评论并在 Snowflake 中用 Java UDF 分析他们的语言并不困难,之前的帖子解释了这一点:

https://medium.com/snowflake/loading-reddit-comments-into-snowflake-44b9f2072a84 https://medium.com/snowflake/new-in-snowflake-java-udfs-with-a-kotlin-nlp-example-e52d94d33468

疑问和注释

用 Java UDTF 检测语言

由于雪花最近宣布支持 Java 表 UDF,我决定尝试一下。令人惊讶的是,表格 UDF 比我以前的 Java UDF 表现得更好。在下面的部分中可以找到关于这个的细节。

https://www.snowflake.com/blog/bringing-more-to-the-table-azure-and-udtf-support-with-snowpark/

UDTFs 能够读取表并将表输出回来。这是产生本文结果的 UDTF 实现:

create or replace function detect_lang_udtf(v varchar)
returns table(output_value varchar)
language java
imports = ('@~/lingua-1.1.0-with-dependencies.jar')
handler='MyClass'
target_path='@~/202110xx3.jar'
as
$$
import java.util.stream.Stream;import com.github.pemistahl.lingua.api.*;
import static com.github.pemistahl.lingua.api.Language.*;class OutputRow {public String output_value; public OutputRow(String output_value) {this.output_value = output_value;}
}class MyClass { static LanguageDetector detector = LanguageDetectorBuilder.fromAllLanguages().withPreloadedLanguageModels().build(); public MyClass()  {} public static Class getOutputClass() {return OutputRow.class;} public Stream<OutputRow> process(String input_value) {String x = detector.detectLanguageOf(input_value).toString();return Stream.of(new OutputRow(x));} public Stream<OutputRow> endPartition() {return Stream.empty();}
}$$;

~百万条评论样本

规则:

  • 从 2020 年 12 月 1 日至 2021 年 12 月 14 日之间的 14 天 reddit 评论开始(参见如何在雪花上加载 reddit 评论)。
  • 丢弃前 40 个子编辑中的评论(不需要分析每个语言,主要是英语)。
  • 从评论中删除特殊字符、URL 和链接。
  • 只允许超过 200 个字符的评论。
  • 丢弃 90%的剩余评论,保留 10%的随机样本。
  • 应用前面的规则后,只保留子编辑中超过 50 条注释的注释(采样前为 500 条)。
  • 有待分析的评论总数:3,860 个子评论中的 938,131 条。
create or replace temp table reddit_sample as with top_subs as (select count(*), v:subreddit subredditfrom reddit_comments_samplegroup by 2 order by 1 desclimit 40
)select *
from (select *, v:subreddit subreddit, regexp_replace(v:body, 'http[^ ]*', '') body_clean1, regexp_replace(body_clean1, '&[a-z][a-z]+;', '') body_clean2, regexp_replace(body_clean2, '\\[[^\\]]*\\]', '') body_clean, count(*) over(partition by subreddit) c_sub from reddit_comments_samplewhere v:author not in ('[deleted]', 'AutoModerator')and subreddit not in (select subreddit from top_subs)and length(body_clean) > 200and uniform(0::float, 1::float, random()) < 0.1
)
where c_sub > 50
;

用 UDTF 分析每个评论的语言

为了优化,我们只给函数一个清理过的注释的前 200 个字符进行分析:

create table reddit_sample_languages_udtf
as
select *, output_value lang
from reddit_sample a, table(detect_lang_udtf(substr(body_clean, 0, 200)))  x
;

算英语 vs 不算

97%经过分析的 reddit 评论是英文的

select count(*) comments, ratio_to_report(comments) over() percent, iff(lang='ENGLISH', 'English', 'Not English') language
from reddit_sample_languages_udtf
group by 3
order by 1 desc

UDF 对 UDTF 的表演

我以前的 UDF 用 XL 雪花仓库花了 4 分钟分析了 100 万条评论,而新的 UDTF 用了不到一半的时间就能做到。

当查看细节时,发现 UDF 和 UDTF 消耗的资源量相似——UDTF 更快,因为雪花并行化更好地执行了这些调用。

不要对此过于担心,因为雪花工程师目前正在努力改进这些情况。Java UDFs 和 UDTFs 目前在 Snowflake 中处于预览模式,您很快就能体验到这些改进。

XL warehouse 上 Java UDF 与 UDTF 的性能对比——UDTF 在当前实现下执行了更好的并行化(改进正在进行中)

select lang, count(*)
from (select *, detect_langs(substr(body_clean, 0, 200)) langfrom reddit_sample a
)
group by 1
order by 2 desc
--4:06 UDF xl
;select lang, count(*)
from (select *, output_value langfrom reddit_sample a, table(detect_lang_udtf(substr(body_clean, 0, 200)))  x
)
group by 1
order by 2 desc- 1m58s UDTF xl 
;

过滤和格式化结果

此查询查看以前的结果,格式化标签,查看子编辑中检测到的语言之间的比率,并排除每个子编辑中表示少于 2%的语言:

select 'r/'||subreddit sub, initcap(lang) language, count(*) c, ratio_to_report(c) over(partition by sub) ratio, sum(iff(language!='English', c, 0)) over(partition by sub) total_not_english, sum(c) over(partition by sub) total
from reddit_sample_languages_udtf
group by 1, 2
qualify ratio > .02
order by total_not_english desc, c desc, 1, ratio desc

信用

  • 杰森·鲍姆加特纳负责收集和分享 Reddit 的评论。
  • Peter M. Stahl 为 Lingua 项目检测 Java 中的语言。
  • 雪花使在 UDF 中运行 Java 代码变得容易。

更新和评论

关于 reddit 的讨论

  • 查看 reddit 上的评论,即:/r/dataisbeautiful/[…]/the _ most _ popular _ languages _ on _ Reddit
  • 更新了 Tableau 上的交互式仪表盘。

想要更多吗?

  • 用一个雪花免费试用账户试试吧——你只需要一个电子邮件地址就可以开始了。

我是 Felipe Hoffa,雪花的数据云倡导者。谢谢你和我一起冒险。可以在 Twitter 和 LinkedIn 关注我。查看reddit.com/r/snowflake最有趣的雪花新闻。

数据科学和 Python 的 GitHub Repos

原文:https://towardsdatascience.com/the-most-starred-forked-github-repos-for-python-and-data-science-f8bb3de47e96?source=collection_archive---------22-----------------------

发现许多数据专业人员和 Python 程序员正在关注的非常受欢迎的回购

史蒂夫·哈维在 Unsplash 上拍照

GitHub 库的星★叉ψ是项目受欢迎程度和质量的一个很好的指示器。

主演一个回购除了作为书签功能,相当于在社交媒体上点击‘喜欢’按钮。

分叉回购创建内容的副本,表明某人对试验或贡献项目的兴趣。

在本文中,我们来看看 GitHub 上最流行的基于 Python 的数据相关repos。

[10] 牛逼的机器学习

50757
ψ12575

令人敬畏的机器学习 repo 提供了一个针对 Python 和其他编程语言的机器学习框架、库和软件的精选列表。

如果你正在寻找 Python 和机器学习的交叉点,你应该看看这个。

[9] keras

51954
ψ18752

Keras是一个基于 Python 的深度学习 API ,运行在高度流行的开源机器学习平台 Tensorflow 之上。

Keras 专注于快速实验,允许用户尽可能快地从想法到结果。

截图来自 Keras GitHub 页面|图片在 Apache 许可下使用

烧瓶

56095
ψ14461

Flask 也是最流行的 Python web 应用程序框架之一(也是我个人最喜欢的),这是由于它在定制方面的易用性和灵活性。

Flask 也常用于在数据科学项目中部署机器学习(ML)模型。这一点很重要,因为 ML 车型的值只有在投入生产时才能实现。

姜戈

58644
ψ25067

Django 是一个流行的高级 Python Web 框架,它鼓励快速开发以及干净、实用的设计。

Django 以其速度、安全性和可伸缩性而闻名,是 web 开发的一个流行的开源框架选项,也可以用于机器学习模型的部署。

型号

70683
ψ44539

车型 回购是 Tensorflow 车型园的所在地。它包括最新模型和建模解决方案的不同实现。

它旨在展示建模的最佳实践,以便用户可以充分利用 TensorFlow 进行研究和产品开发。

截图来自模型 GitHub 页面|图片在 Apache 许可下使用

【5】YouTube-dl

97905
ψ5514

youtube-dl 项目(顾名思义)是一个命令行程序,供用户从 YouTube 下载视频。如果你想为视频分析检索数据,这个回购无疑会很有帮助。

诺德伍德主题公司在 Unsplash 上拍摄的照片

[4] 牛逼——巨蟒

101024
ψ19535

awesome-pythonrepo 提供了一个 Python 框架、库、软件和资源的精选列表。

它整理了广泛主题的广泛列表,如数据可视化、数据库驱动、网络爬行和深度学习。

[3] Python-100 天

106206
ψ42079

Python-100 天 回购因为内容是用普通话写的,所以迎合了华语观众。它包括一个在 100 天内学习 Python 的结构化课程。

如果你懂普通话,并且热衷于开始 Python 学习之旅,这个回购当然适合你。

Python

113189
ψ30836

这个 Python repo 包含大量示例代码,用于众多算法的 Python 实现。

它包括像计算机视觉和神经网络这样的热门主题,一直到像区块链和动态编程这样的专业主题。

马里乌斯·马萨拉尔在 Unsplash 上的照片

[1] 公共-API

★(星星):141984
ψ(叉子):16596

这是基于受欢迎程度的顶级回购。public-APIrepo 提供了一个用于软件和 web 开发以及数据科学的免费 API的合并列表。

我发现与数据专业人员高度相关的几类 API 包括开放数据、数据验证、测试数据和机器学习。

在麻省理工学院许可下使用的开放数据类别|图像中可用的 API 示例

结论

GitHub 拥有丰富的令人惊叹的开源内容,所以我希望这给了你一些灵感,让你知道应该关注哪些 repos。

以上列表是基于 EvanLi 的 Github 排名回购 参考的,我强烈推荐你也去看看。

欢迎您加入我的数据科学学习之旅!关注此媒体页面以了解更多数据科学内容,或者在 LinkedIn 上联系我。尽情探索流行的 GitHub repos 吧!

* *

Spark 中最有用的数据操作函数

原文:https://towardsdatascience.com/the-most-useful-date-manipulation-functions-in-spark-7d827f790b?source=collection_archive---------1-----------------------

用清晰的例子深入探究最有趣的日期函数

在 Unsplash 上 NeONBRAND 拍摄的照片

Pyspark 和 Spark SQL 提供了许多内置函数。当使用存储日期和时间类型值的 DataFrame 时,日期和时间函数等函数非常有用。有时,您可能想写一个 UDF(用户定义的函数),但后来意识到最好还是查看一下文档,因为它已经存在了。在本文中,我们将通过一些例子来检查哪些是最重要的 Spark SQL 日期函数。

Spark SQL 日期函数

Spark SQL 内置日期函数对用户和性能都很友好。Spark SQL 支持 Apache Hive 中支持的几乎所有日期函数。下表列出了 Spark SQL 日期函数,这些函数可用于操作包含数据类型值的数据框列。这个列表包含了 Apache Spark 支持的几乎所有日期函数。

日期函数及其描述的摘要(图片由作者提供)

对于本教程,我使用的是机场数据集,该数据集是开源的,可以在 Kaggle 上找到。

**Reading CSV File**
>>> df = spark.read.csv("Airports2.csv", header=True, inferSchema=True)***Visualizing the first 5 rows of the dataset***
>>> df.show(5)

(图片由作者提供)

**Checking the Schema**
>>> df.printSchema()

(图片由作者提供)

如你所见,上面包含日期的“Fly_Date”列是字符串类型。

  1. To_date(col)将包含日期值的字符串类型转换为日期格式
**Example:*****Converting the string type "Fly_date" column containing dates value to date type/format.***>>> df = df.withColumn(‘Fly_date’, **to_date**("Fly_date"))
>>> df.printSchema()

(图片由作者提供)

2。Date_format(date,format)将日期/时间戳/字符串转换为由第二个参数给出的日期格式指定的格式的字符串值。

**Example:*****Format "Fly_date" column with the "dd/MM/yyyy" format*** >>> df.select("Fly_date", **date_format**("Fly_date", "dd/MM/yyyy").alias("Formatted_date")).show(3)

(图片由作者提供)

3)日期 _ 添加(开始,天数) →向日期添加天数

**Example:*****Adding two days to the Fly_date columns***>>> df.select("Fly_date", **date_add**("Fly_date",2).alias("date_added")).show(5)

(图片由作者提供)

4)添加月数(开始,月数)→添加月数

**Example:*****Adding two months to the date columns and saving into a new dataframe***>>> test_df=df.select('Fly_date', **add_months**(df.Fly_date,2).alias("months_added"))>>> test_df.show(5)

(图片由作者提供)

5) Datediff(end,start) →返回两个日期之间的天数差。

**Example:*****Returns the difference between two dates in days***>>> test_df.select("Fly_date","months_added", **datediff**("months_added", "Fly_date").alias("date_diff")).show(3)

(图片由作者提供)

6)提取单个“日期”元素

  • Year(Col) →提取给定日期对应的年份为整数。
  • Quarter(Col) →提取给定日期对应的季度为整数。
  • Month(Col) →提取给定日期对应的月份为整数。
  • Dayofmonth(Col) →提取给定日期的月份中相应的一天作为整数。
  • Weekofyear(Col) →提取给定日期对应的周数为整数。
  • Hour(Col) →提取给定日期对应的小时数为整数。
  • 分钟(Col) →提取给定日期对应的分钟数为整数。
**Examples:** **# Year**
>>> test_df.select("date_days", **year**( "date_days").alias("year")).show(3)**# Month**
>>> test_df.select("date_days", **Month**( "date_days").alias("Month")).show(3)**# Dayofmonth**
>>> test_df.select("date_days", **Dayofmonth**( "date_days").alias("Day of the Month")).show(3)**# Weekoftheyear** >>> test_df.select("date_days", **Weekofyear**( "date_days").alias("Week of the year")).show(3)

提取年、月、日和周(图片由作者提供)

7) Date_sub(开始,天数)→ 从日期字段中减去天数。

**Example:*****Subtract three days to the current date***>>> df.select('Fly_date', **date_sub**(df.Fly_date,3).alias("date_sub")).show(3)

日期子结果(作者图片)

8) Last_day(date) → 返回给定日期所属月份的最后一天。

**Example:*****Get the last day of the month using "last_day" function***>>> df.select("Fly_date", **last_day**( "Fly_date").alias("last_date")).show(4)

(图片由作者提供)

9) Months_between(date 1,date 2) → 得出两个日期之间的月数。

**Example:*****Identify the months between "Month Added"  and "Fly date" using months_between function***>>> new_df=test_df.select("Fly_date","month_added", **months_between**("month_added", "Fly_date").alias("months")).show(3)

(图片由作者提供)

10) Next_day(date,dayOfWeek) → 返回晚于日期列值的第一个日期。

**Example:*****Getting next Tuesday date using the "next_day" function***>>> df.select("Fly_date", **next_day**("Fly_date", "tue").alias("Next_Tuesday")).show(3)

(图片由作者提供)

11)按‘日期’排序→ 按日期排序数据帧

**Example:*****Sorting the selected columns by "Fly date" column in descending order***>>> df.select("Passengers","Fly_date")./**sort**(df.Fly_date.desc()).show(3)

(图片由作者提供)

12)当前时间戳→ 返回当前时间戳作为时间戳列

**Example:*****Returns the current timestamp as a timestamp column***>>> df.select(**current_timestamp()**.alias( "current_timestamp")).show(1)

(图片由作者提供)

当前日期→ 以日期列的形式返回当前日期。

**Example:
** 
***Returns the current date as a date column***>>> df.select(**current_date**().alias(“current_date”)).show(1)

(图片由作者提供)

结束注释

在这篇文章中,我试图用一个相关的例子来展示不同的日期函数。这些函数在日期类型列的操作以及为机器学习提供有趣的功能和从数据中创建有趣的见解方面提供了很大的灵活性。尽可能使用这些函数,而不是 Spark SQL 用户定义的函数。感谢您的阅读:)

更多阅读:

特征缩放的秘密终于被解开了

原文:https://towardsdatascience.com/the-mystery-of-feature-scaling-is-finally-solved-29a7bb58efc2?source=collection_archive---------6-----------------------

照片由 Danist Soh 在 Unsplash 上拍摄

思想与理论

首席研究员:Dave Guggenheim /合作研究员:Utsav Vachhani

摘要

对于一些机器学习模型,特征缩放是数据预处理的重要步骤。正则化算法(例如,lasso 和 ridge 惩罚)、基于距离的模型(例如,k-最近邻、聚类、支持向量机等)。),以及人工神经网络在预测器处于相同尺度或相同边界内时都表现得更好。但是特征缩放不仅仅是诱导一致性;它可以成为您预测建模工具箱的强大补充。

我们通过对 60 个分类数据集进行 800 多次实验来研究特征缩放,我们所了解到的将会是惊喜的。一方面,你看到的关于选择缩放方法的规则对于预测模型是没有意义的。另一方面,曾经被认为是数据预处理的一个卑微的方面,一种新的特征缩放方法可以从我们的模型中释放出更高的性能。

本文假设您熟悉分类模型、特性缩放原因和方法、支持向量机以及偏差和方差。

简介

你可能会问什么时候应该使用规范化,什么时候应该使用标准化。这个问题没有确定的答案”(Burkov,2019,pg。46).

距离 k-最近邻算法的发明已经过去了 50 年,这可能是第一个需要预测器一致性的监督模型,而特征缩放仍然是一个谜。尽管缺乏一个明确的答案,但关于何时应该使用标准化或规范化,有几个规则在广泛和重复的分布中。一些规则以数据为中心,而另一些则侧重于选择特征缩放方法的学习模型。我们将测试这些规则,努力强化或改进它们的用法,也许会开发出一个更确定的特性缩放答案。

以数据为中心的启发式包括以下:

1.如果您的数据有异常值,请使用标准化或稳健缩放。

2.如果您的数据具有高斯分布,请使用标准化。

3.如果您的数据具有非正态分布,请使用归一化。

以模型为中心的规则包括这些:

1.如果您的建模算法假设(但不要求)残差为正态分布(即正则化线性回归、正则化逻辑回归或线性判别分析),请使用标准化。

2.如果您的建模算法对数据的分布没有任何假设(例如,k-最近邻、支持向量机和人工神经网络),则使用归一化。

在每个用例中,规则都提出了与数据或学习模型的数学拟合。我们的目标是测试这些规则,以发现它们的有用性,并确定是否可以开发一个更全面的集合来指示特征缩放方法的完美选择。

模型定义

由于其对缩放数据的要求,我们选择了支持向量分类器,因为除了以数据为中心的规则之外,它还可以帮助确认那些不假设数据或残差正态分布的算法的以模型为中心的规则。

本研究中的所有模型都是使用 sci-kit 学习库中的支持向量分类器(SVC)包进行的。每个模型通过分层抽样进行 10 倍交叉验证,所有模型都使用以下超参数值:

a.kernel = 'rbf ',

b.gamma = '自动',

c.随机状态= 1

所有其他超参数保留各自的默认值。所有模型都是使用这些缩放算法(sci-kit 学习包在括号中命名)用特征缩放数据构建的:

a.标准化(标准缩放器)

b.L2 归一化(归一化器;norm='l2 ')

c.鲁棒(RobustScalerquantile_range=(25.0,75.0),with_centering=True,with_scaling=True)

d.规范化(最小最大缩放器;feature_range =多个值(见下文))

d1。特征 _ 范围= (-1,1)

d2。特征 _ 范围= (0,1)

d3。feature_range = (0,2)

d4。feature_range = (0,3)

d5。feature_range = (0,4)

d6。feature_range = (0,5)

d7。feature_range = (0,6)

d8。feature_range = (0,7)

d9。feature_range = (0,8)

d10。特征 _ 范围= (0,9)

应该注意的是,根据“支持向量分类实用指南”(Hsu,Chang,Lin 等人,2003),应该使用范数(-1,1)或范数(0,1)来获得最佳结果。这与以下观点一致:因为径向基核函数在其数学中使用特征向量之间的平方欧几里得距离,所以 SVC 模型在归一化时应该表现得更好,因为它为距离度量保留了更准确的信息。sci-kit learn 中的 SVC 文档将标准化作为另一个选项(Scikit-learn_developers,未注明)。

在每个预测因子少于 12 个样本的情况下,我们将测试分区限制为不少于总体的 10%。如果有足够的样本达到合理的预测精度(由样本复杂性泛化误差确定),我们使用统一的 50%测试分区大小。在这两个界限之间,我们调整了测试规模,以限制泛化测试误差,与训练样本规模进行权衡(Abu-Mostafa,Magdon-Ismail,& Lin,2012,第。57).

任何缺失值都使用 MissForest 算法进行估算,因为该算法在多重共线性、异常值和噪声面前具有很强的鲁棒性。分类预测因子是使用 pandas get_dummies 函数一次性编码的,没有丢弃的子类型(drop_first=False)。低信息变量(如身份证号码等。)在训练/测试分区之前被丢弃。

构建这些模型的目的是比较特征缩放算法,而不是调整模型以获得最佳结果。出于这个原因,我们在模型中引入了尽可能多的默认值,为上述比较创造了一个平台。此外,伽马值可以通过交叉验证进行调整,因此该模型不会像之前的研究(Pandey & Jain,2017 年)所证明的那样,偏爱一种缩放方法。所有性能指标都是作为对测试数据的预测的总体准确性来计算的,并且通过两个阈值来检查该指标:1)作为概化的度量,在最佳性能的 3%以内,以及 2)作为预测准确性的度量,在最佳性能的 0.5%以内。

本分析中使用的 60 个数据集如表 1 所示,具有广泛的预测器类型和类(二元和多元类)。大多数数据集可以在 UCI 索引( UCI 机器学习库:数据集)找到。不在 UCI 索引中的数据集都是开源的,可以在 Kaggle:

波士顿房屋:波士顿房屋| Kaggle;HR 员工流失:员工流失| Kaggle;借贷俱乐部:借贷俱乐部| Kaggle;电信客户流失:电信客户流失| Kaggle;丰田卡罗拉:丰田卡罗拉| Kaggle

38 个数据集是二项式的,22 个是多项式分类模型。所有模型都是根据所有数据集创建和检查的。表中列出的预测数是未编码的(分类的)和所有原始变量,包括排除前的非信息变量。

表 1:数据集(按作者分类的图片)

尝试开发启发式数据中心

异常值分析—异常分值

我们检查的第一个以数据为中心的规则涉及数据范围内异常值的存在,并建议了两种不同的方法:1)标准化,和 2)稳健缩放。为了测试这一规则,我们构建了一个隔离森林模型,专门用于根据整个数据集中的异常值密度生成异常值。然后,我们将原始得分转换为调整后的平均绝对异常得分(MAAS ),以便在数据集的交叉样本之间进行比较。图 1 显示了数据的子集,包括准确度、最佳特征缩放方法和 MAAS 评分(星号表示相对于预测值计数样本数量较少的数据)。

图 1: MAAS(异常密度)对比图(图片由作者提供)

标准化或稳健缩放与较高的异常值密度之间没有一致的关系。这可能很难检测到,因为当以数据为中心的规则与以模型为中心的规则冲突时,结果是未知的,例如当数据要求标准化而模型寻求规范化时。规则的第一个严重缺陷…

统一与定制特征缩放

我们在数据集的一个子集上检查了单独缩放与统一缩放,测试了以数据为中心的规则是否通过预测器离散地应用。用于此分析的数据集包括:

澳大利亚信贷,银行,波士顿住房,国会,圆筒乐队,生育,德国信贷,哈伯曼生存,肝炎,希格斯,希尔 _ 山谷(无噪音),希尔 _ 山谷(噪音),和马绞痛。

个体或“自定义”特征缩放对所有数值变量使用标准化,对所有明显的分类变量使用默认标准化(feature_range = (0,1))。这种方法在任何时候都不会超过最佳单一特征缩放方法在任何数据集上的精度,这可能是因为变量不再按照学习模型的要求进行统一缩放。

分布分析

测试以数据为中心的规则还需要创建一个单一的“超级”预测器,该预测器只包含重要的信息,以便进行分布分析。

这个过程从使用超参数的默认值构建一个简单的随机森林模型开始,以揭示由信息增益确定的可变重要性。从中,我们选择了总计超过 50%的信息增益的预测因子;这个限制对于图形显示的简约性至关重要。如果没有对预测因子的这种限制,检测模式可能会困难得多。这些变量被命名为“Top50”,它们被连接成一个单独的列,一个超级预测值,可以检查其分布特征和描述性统计数据(有关更多信息,请参考图 2 和图 3)。

图 2:波士顿住房 50 强直方图(图片由作者提供)

图 3:波士顿住房 50 强描述性统计(图片由作者提供)

使用前 50 个直方图,我们测试了关于高斯和非高斯分布的以数据为中心的规则。标准化在 60 个测试数据集的 30 个数据集上表现最佳,但在其中只有 4 个案例中,Top50 的双尾分布符合最广泛的“正常”定义(参见图 2 中的示例)。因此,关于高斯分布和标准化的规则在各种数据集之间缺乏一致性。让事情变得更加混乱的是那些标准化和默认规范化表现同样出色的例子。有关这些匹配的更多信息,请参考图 4 和图 5。

图 4:肝炎 50 强直方图(图片由作者提供)

图 4 是肝炎数据集,标准化和规范化的总体准确率达到 81.25%。

图 5:生育率前 50 名直方图(图片由作者提供)

图 5 是生育力数据集,标准化和规范化的总体准确率达到 90.00%。

两个非常不同的发行版,但具有相同的功能扩展性能!但是我们还没有完成发行。使用前 50 个预测值,我们进行了一个分布分析,看看是否有任何超级预测值符合 89 个分布模式中的一个,从中可以得出更好的启发(见图 6)。

图 6:分布模式列表(图片由作者提供)

在我们的分布分析中找不到快乐。唯一匹配任何数据集的模式是 Von Mises,它只在两种情况下匹配——这对于开发新规则来说是不够的。在特征尺度选择方面,分布和分布模式显得很弱。

有一条以数据为中心的“规则”似乎是常识。国会投票数据由只有 0 和 1 两个值的预测值组成。在这种情况下,特征范围从 0 到 1 的归一化应该是最好的特征缩放方法(参见图 7)。是的,但是除此之外,标准化、稳健缩放、norm(0,2)、norm(0,3)和 norm(-1,1)在顶级性能方面都是相同的。其余的标准化方法在测试准确性方面落后超过 7%。这提出了一个有趣的问题,“为什么 Norm(0,3)的精确度最高,而 Norm(0,4)的精确度最低?”答案可能会让你大吃一惊。

图 7:国会投票 50 强直方图(图片由作者提供)

经过这一级别的调查,我们可以断言,以数据为中心的规则充其量是有缺陷和令人困惑的,它们应该被避免。

试图开发一种启发式模型中心性

以模型为中心的规则只在对数据分布不做任何假设的算法方面进行了测试,如 k-最近邻、支持向量机和人工神经网络。因为具有径向基核的支持向量机使用欧几里德距离,所以我们的测试被限制在这个区域。需要做进一步的测试来扩展它,以包括人工神经网络和那些假设残差为正态分布的建模算法。

在对照 60 个数据集检查了列出的特征缩放方法后,我们发现标准化比任何版本的归一化更好地概括和预测,这与距离测量和归一化之间的数学对齐相反。图 8 显示了数据集的数量以及每种要素缩放方法达到最佳精度性能 3%以内的数据集占总数的百分比,以表示概化;图 9 显示了数据集的数量以及这些方法达到接近最佳或最佳性能(最佳精度 0.5%以内)的数据集占总数的百分比,以表示预测精度。以强度显示的条形展示了两种最常见的支持向量特征缩放方法和最佳表现方法标准化之间的差异。

图 8:功能将性能调整到最佳情况的 3.0%以内(图片由作者提供)

图 9:功能将性能调整到最佳情况的 0.5%以内(图片由作者提供)

偏差-方差障碍

基于从以数据为中心和以模型为中心的结果中收集的证据,我们假设与数据或模型一致的特征缩放可能是过度拟合的原因,就像超参数一样,需要对其进行“去谐”以获得最佳性能。这就是 Z 分数标准化(一种扭曲距离测量的缩放方法)在距离敏感学习模型中表现最佳的原因,它抑制了对训练数据的过度拟合。以及为什么 Norm3 和 Norm4 在国会投票数据集上如此不同;预测误差曲面中的各种极小值。

这些规则寻求与数据或模型的匹配,但对齐会导致低偏差和差的预测性能。简而言之,这些规则似乎与其预期效果背道而驰。

因为一旦数据被划分为训练集和测试集,我们就面临方差的影响,方差是一种随机函数,它将创建精确选择启发式算法的过程变成了 NP-hard 问题。在 Python 语言中,从“fit_transform”到“transform”的看似简单的转换不仅仅是列度量中的不匹配。它嵌入了额外的方差复杂性。在对训练数据应用 fit_transform 时,会产生密切相关的偏差。这是机器学习的新观点,在为需要规模数据的学习算法建模之前,先接受偏差和方差。

为了测试特征缩放和偏差-方差权衡之间的关系,我们构建了相同的归一化模型,从 feature_range = (0,1)到 feature_range = (0,9)依次循环。每个阶段的训练和测试集精度被捕获并标绘,训练用蓝色,测试用橙色。当我们在不改变数据或模型的任何其他方面的情况下增加特征范围时,结果是更低的偏差。在大多数情况下,较低的偏差伴随着较高的方差和较差的测试结果。参考图 10-12,了解六十个数据集中三个数据集的详细情况。

图 10:澳大利亚信贷标准化图(图片由作者提供)

图 11:电离层归一化图(图片由作者提供)

图 12: Pima 印度标准化图(图片由作者提供)

偏倚、方差和特征缩放之间的关系得到了明确的证实。当然,这只是六十个数据集中的三个,所以这里是我们提供的一些额外的图表作为证据(按字母顺序,不多不少):

这种偏差-方差性能可能是特定于支持向量分类器的;需要做更多的工作来确定情况是否如此。无论如何,在训练数据上在 Norm(0,9)处达到的最大准确度值进一步证实了归一化更适合于距离度量,并且因此产生较差的预测性能。

但是那些没有查看偏差和方差范围的缩放方法呢?关于点值,如标准化,方差本身可被视为“学习模型中的不稳定性”(Abu-Mostafa 等人,2012),我们通过创建 200 个不同的训练/测试分裂来诱导这种不稳定性,如通过从 1 到 200 按一个单位顺序递增 random_state 值所定义的。这些点表示测试与训练准确性的比率,该图通过数据的随机划分显示了这两个指标之间的波动性。

使用具有相同 SVC 模型的波士顿住房数据集,图 13 显示了使用标准化的随机方差分布,而图 14 显示了相同的输出,但具有稳健的缩放。这些图中的每个数据点(即,底部的刻度指示分区的随机状态值)使用相同的分区数据进行训练和测试。

图 13:波士顿住宅的 200 个 SVC 模型与 StandardScaler 的差异(图片由作者提供)

图 14:波士顿住宅的 200 个 SVC 模型与 RobustScaler 的差异(图片由作者提供)

注:方差均值几乎相同(0.892 对 0.907),但考虑到 StandardScaler 和 RobustScaler 是本研究中仅有的两种缩放算法,意味着将变量集中在零。在鲁棒定标器的情况下,中值也是以零为中心的。

每个图展示了其各自的缩放方法和学习算法的不稳定性或方差函数,正如预期的那样,当使用相同的数据和相同的模型时,它们提供了明显不同的分布。

方差和特征缩放相互作用,方差是一个随机函数。考虑到随机性如何混淆特征缩放的正确选择,我们提出了以下推测:

猜想 1:由于方差,无法开发出以数据为中心或以模型为中心的规则来指导预测模型中特征缩放的完美选择。

布尔科夫的断言(2019)得到了对其机制的理解的充分支持。我们没有制定规则,而是选择了一条“模糊”的前进道路。

分类模型的广义特征缩放算法

考虑到随机函数是不可预测的,而是广义的,我们的下一个方法是建立一个集成特征缩放算法,以提高 3%阈值的泛化能力和 0.5%阈值的预测精度。

由于共享的零均值和适用性的潜在收益,我们建立了两个集成特征缩放算法,结合标准化和鲁棒缩放,并针对 60 个数据集测试它们。这与图 8(概化)和图 9(预测准确性)中描述的前两种缩放方法相一致。

图 15 显示了两种集成算法,第一种使用堆叠分类器,第二种使用软阈值(概率而不是类成员)实现投票分类器。这两个集合都是使用 Python 中 sci-kit learn 库的标准包实现的。

图 15:集合特征缩放过程流程(图片由作者提供)

在图 16 中可以找到比较结果,该结果对照最佳 solo 方法(标准化)检查了这些集合的性能。

图 16:与最佳 Solo 算法的集合特征缩放比较(图片由作者提供)

在图 14 中,堆叠分类器似乎并没有改进标准化,但这并不是全部。在 STACK 获得最佳准确度的 30 个案例中,17 个模型创造了新的记录(即超级表现者)。STACK 的概括能力比标准化稍差,但准确性更高。详情参见图 17。

就投票而言,在达到最佳准确率的 31 个案例中,有 14 个创造了新的记录。投票集合在普遍性和准确性方面都优于标准化。

图 17:集合特征缩放性能(图片由作者提供)

为了进一步改善结果,在参考图 8 及其概化描述后,我们构建了一个三管道模型,除了标准化和稳健缩放之外,还增加了归一化(0,6)。详情参见图 18。

图 18:三重管道特征缩放集合(图片由作者提供)

这种集成在六个数据集上进行测试,对于这六个数据集,稳健缩放和标准化都表现不佳,但 Norm(0,6)表现优异,并且在每种情况下,测试精度都因为较低的偏差而受到影响。这让我们想到了另一个猜想:

猜想 2:预测模型的特征尺度集成的可推广性受到减少偏差的限制。

结论

如果你必须有规则,那么作为一个粗略的猜测,选择与学习模型的拟合相反的特征缩放方法。首先,与分布无关或对距离敏感的模型应该使用标准化。进一步的工作是必要的,以确认归一化是否是与分布相关的模型的最佳拟合。

我们通过一类新的模型——特征尺度集成,实现了更高的泛化能力和准确性。但是这种性能的提高是以计算成本为代价的。使用 SVC 模型生成类别概率而不是类别成员资格(软阈值对硬阈值)需要额外的 5 重交叉验证,并且需要更多的时间和计算资源。

如果您有这些资源,那么不管未来数据引起的扰动如何,投票集合作为一种通用算法应该工作得很好。如果时间和计算过程不可用,标准化本身就可以很好地处理这些基于距离的模型。但是,如果您需要最高的精度,可能需要采用试错法来找到“完美”的缩放算法。

参考文献

Abu-Mostafa,Y. S .、Magdon-Ismail,m .、和 Lin,H.-T. (2012 年)。从数据中学习(第四卷)。美国纽约 AMLBook:

布尔科夫,A. (2019)。一百页的机器学习书。

许春伟,张春春,林春军,等。(2003).支持向量分类实用指南。台北。

Mohamad,I. Bin 和 Usman,D. (2013 年)。标准化及其对 K 均值聚类算法的影响。应用科学、工程与技术研究杂志6 (17),3299–3303。https://doi.org/10.19026/rjaset.6.3638

潘迪和贾恩(2017 年)。使用不同归一化技术的 KNN 算法的比较分析。国际计算机网络与信息安全杂志11 (11),36。

Scikit-learn_developers。(未注明)。sklearn.svm.SVC 文档。检索自https://sci kit-learn . org/stable/modules/generated/sk learn . SVM . SVC . html?highlight = SVC # sk learn . SVM . SVC

联系方式:

戴夫·古根汉姆:参见作者简介和简历,dguggen@gmail.com

乌特萨维·瓦赫哈尼:领英简历,uk.vachhani@gmail.com

关于数据科学的神话,不那么神话,和真理

原文:https://towardsdatascience.com/the-myths-not-so-myths-and-truths-about-data-science-dc6f77d54ecc?source=collection_archive---------27-----------------------

照片由 Dollar Gill @ Unsplash 拍摄

在您的数据科学学习之旅中,应该置身事外并注意什么

作为一名学生,当我开始认真考虑将数据科学(DS)作为职业选择时,我首先想到的是我应该从哪里开始,甚至在此之前,我应该首先学习什么!像许多其他人一样,我也是从约翰·霍普斯金大学的在线课程开始的。这门课程让我第一次接触到 R。然后,我开始学习大学开设的分析课程。最终,我的学习路径包括面对面的、在线的大学课程,以及一大堆个人项目。此外,我还涉足了一段时间 Kaggle。为什么我没有做得更多,这可能是另一天的讨论,但简而言之,我发现很难从 Kaggle 身上获得任何切实的好处。渐渐地,我对制作对用户有用的预测模型产生了兴趣。我接触到了 web 应用程序的世界!

现在回顾我的 DS 学习历程,我看到我对 DS 的理解是如何随着时间的推移而形成的。在这篇文章中,我将带你了解我在旅程不同阶段的想法,并分享我现在对它们的看法。

放弃

在继续之前,我认为有必要澄清一个重要的假设。在我看来,大体上有三种数据科学家角色:

研究:发明新算法并打包,

已申请:

  • 主要从事可视化、统计和预测建模的数据科学家,
  • 主要专注于深度学习、构建人工智能系统等的数据科学家。

这些角色绝不是相互排斥的,意味着一个人做一套工作并不意味着他/她不能执行另一套。这主要是基于他们作为数据科学家的大部分时间花在哪里。

在本文中,我将讨论的内容与第一种类型的应用数据科学家角色密切相关。此外,和其他观点一样,这些大多来自我的个人经历,所以不应该被认为是的真理。

免责声明说够了现在让我们一起走一走我的过去吧!

数据科学=编码

在我学习 DS 的早期,我认为 DS 就是学习一个编程工具。你学会了编程,你就成为了数据科学家!这有多真实?

不完全正确。

作为一名数据科学家,知道如何编码是一件幸事,但当谈到“多少”这个问题时那就要讨论了。如果你被聘用,作为真正的数据科学家,而不是软件工程师兼数据科学家,你将被期望成为数据分析和洞察力提取方面的专家。这样做的话,像 R/Python 这样的编码语言是你最好的朋友。所以要学会编码!

但是当你学习的时候,你必须记住你的目标;也就是用工具分析数据而不是学习工具,然后用它做 DS

例如,Python 是一种通用编程语言,恰好拥有非常丰富的 ML 和 DL 库。如果你的 Python 学习之旅以学习 Python A-Z 为目标,那么用它来解决 DS 问题,我会说这不是最聪明的想法。与其获取数据集,不如开始使用 Python 来探索和分析它。在这个过程中,学习你需要学习的东西探索数据建立模型,而探索并呈现结果

数据科学=研究

当我开始学习那些大学分析课程时,我逐渐开始看到定量社会科学研究和我们所知的数据科学之间的重叠。我开始越来越相信,数据科学只是研究和统计的一个花哨的重新命名。

差不多是真的。

作为一名数据科学家,当你致力于测试假设时,你应用你的统计和研究知识来设计实验和运行分析。理解统计概念会让你从痴迷代码的数据科学家中脱颖而出。但是,这里有一点需要注意的是,你经常会被限制在可用数据的范围内。所以实验的范围并不像你作为社会科学研究者所期望的那样广泛。此外,一旦你的项目是预测建模,你就不能从传统的统计学或计量经济学课程中学到很多东西,因为它们通常不会让你为预测建模做好准备。

那怎么办呢?

尽可能彻底地学习统计概念,但不要从应用程序和解释部分转移注意力。

为了学习应用,当你学习任何统计学/计量经济学课程时,确保你使用 R/Python 做项目。为了解释,考虑如何用外行人的术语交流统计术语,并将你的因果推理理解与预测性能联系起来。这里有一个我经常看到的令人困惑的话题供你思考:“较低的 p 值是否意味着变量也具有预测能力?”。想想你会如何用你的统计学知识向没有多少统计学知识的人解释这一点。答案对你来说可能是显而易见的,但对那些不太关心统计学的人来说很可能不是。

数据科学=从头开始编写算法的能力

这个阶段非常有趣。随着我开始深入挖掘数据科学,我开始觉得我需要能够自己编写 ML 算法来作为一名数据科学家工作!

****不真实;除非你的目标是研究岗位或者限制高的专门行业。

在应用数据科学领域,不期望数据科学候选人知道如何编写他/她的 ML 算法包。老实说,即使你可以,除非你在 ML 和编码方面有多年的专业知识,否则使用已经建立和验证的包可能是一个更好的主意,因为它们会给你一个更快和更有效的算法实现。但是如果你真的对编码感兴趣,无论如何,为一个算法写你的包,这样做会教你很多关于算法的内部功能,但是作为一个新手,把它作为一个优先事项可能不是一个好主意。

DS 项目从数据开始

从我参加的所有课程中,我看到一个数据科学项目的最终成果是一份报告。我们获取/收集数据,探索数据,训练模型,调整模型,验证它们,测试模型,预测,然后通过记录它来结束我们的项目。但是真正的数据科学项目是这样的吗?

不完全是。

这个项目在你得到数据之前很久就开始了。

它通常从了解业务用户的需求开始。与 Kaggle 问题或班级项目不同,现实生活中的数据科学问题是一个业务问题。业务用户不知道如何将业务问题转化为数据科学问题。例如,如果你幸运的话,你可能会与他们进行简单的讨论,他们可能会告诉你,他们正在试图了解为什么一些客户没有回来,或者他们应该期待谁是潜在客户。然后你的工作就是把这个问题转化成一个测试假设或者建立一个预测模型项目。然而,更棘手的部分通常是决定哪些数据已经可用,可以用来解决问题,或者如果不可用,如何获得解决方案所需的数据。令人惊讶的是,您经常会发现自己试图找到多个 SQL 表的数据定义,然后试图找出如何连接它们,或者调用 API 并努力分析数据,或者浏览网站以获得必要的数据。在拥有成熟数据科学团队的大型公司中,这些是数据工程师工作职责的一部分。但是在较小的组织和项目中,您应该能够执行这些功能。在这种情况下,您的编码技能将会拯救您!

那么,除非你有专门针对数据库查询或数据工程的课程,否则如何学习这些技能呢?尝试个人项目,在这些项目中,您需要浏览网站或调用 API 和解析来获取您需要的数据。如果没有对已建立的数据库的一些访问权限,学习超过一些基础水平的 SQL 是很困难的。但是首先要尝试像 T2 W3 学校 T3 这样的网站。

DS 项目以报告/预测结束

在教育机构中,DS 项目以最终报告或预测结束。现实世界也是这样吗?

非常非常不太可能。

在大多数情况下,一旦你完成了一个项目,你就必须以一种将来可以重复的方式记录你的发现。这些报告和分析通常不是一次性的。

你将不得不在将来重新浏览和复制你创建的分析和报告。这使得使用像 R/Python 这样的脚本语言成了救命稻草。

一旦你有了一个脚本,你就能更好地复制你的结果。这使得像 Jupter Notebook 和 RMarkdown 这样的笔记本成为 DS 中最常用的报告工具。

此外,越来越需要将预测模型“生产化”。这里,我们所说的“生产化”是指通过将模型作为 REST API 或 web 应用程序,或者作为简单模型的简单脚本,来制作适合某种自动化的预测模型。

数据科学家≠故事讲述者

我一直认为数据科学家是告诉你数据揭示的事实的人。她/她不需要讲故事。通常,在我们培养学生的素质时,数据科学的这一面也完全被忽略了。

如果你是一个讲故事的人,培养它;如果没有,有意识地努力成为一个。

事实上,数据科学家是一个从数据中发现故事的讲故事者。这听起来可能有点戏剧性,但不管你作为一名数据科学家在技术上有多好,最终你如何叙述你的发现可能会成就或毁掉你的声誉。如果你想看看一个高度技术化的人如何成为一个讲故事的人,我建议跟随凯西·科济尔科夫。

这些都是今天关于 DS 的神话,但不是那么神话。数据科学对我来说是一个迷人的旅程,我希望它也能成为你的旅程!希望,我已经揭穿了一些神话,并使它变得更加清晰,当你开始成为一名数据科学家的旅程时,你应该期待什么而不是什么。

感谢阅读!

不确定如何开始你的 DS 之旅?试试这个教程:

**

阿拉法特·侯赛因

  • 如果你喜欢这个, 跟我上媒 了解更多
  • 让我们连线上 领英**

建模的神话:证伪

原文:https://towardsdatascience.com/the-myths-of-modelling-falsification-d2e4df98807c?source=collection_archive---------41-----------------------

照片由陈嘉里在 Unsplash 上拍摄

我们不会通过反复尝试去证伪来验证模型,也不应该去尝试;有了因果关系和贝叶斯概率,我们可以做得更好。

神话

伪造的神话有两个版本

  • 科学通过反复尝试去证伪理论、推测或假设而进步。这是描述性的神话。
  • 科学应该通过反复尝试去证伪理论、推测或假设而进步。这就是规范的神话。

证伪的规范性神话是广泛宣扬的科学实践学说的一半,还有数据的首要性和客观性的实证主义神话——数据是所有分析的起点,我们通过公正地收集数据并“让数据说话”来确保模型的客观性。

根据这种双重学说,一旦数据“说话”,我们就通过一个反复尝试证明这些假设错误的过程来检验它们预言的假设。只有这样,我们才能渐进地迭代到客观真理。

这种信念非常普遍,考虑到实证主义作为一种哲学运动在 60 年代几乎已经死亡,而证伪主义,正如我们将看到的,在它被引入之前 20 年就被有效地驳斥了。但是后现代的过度,社会建构主义似乎已经把科学实践吓回到一个狭窄的归纳盒子里。

这篇文章和我之前关于实证主义的文章认为,这种学说往好里说是被误导了,往坏里说是直接造成了损害。当然,在它的影响下,现代统计学在某些领域的实践已经萎缩了,这种实践带有一种对假设检验的强迫性先入为主和对解释性因果模型的歇斯底里的反感。但是,通过揭穿这些神话,让因果关系和概率论在科学实践中占据自然、正当的位置,确保数据分析和机器学习在这些领域的实践不会遭受同样的命运可能还不算太晚。

伪造的起源

卡尔·波普尔(LSE 图书馆—https://www . Flickr . com/photos/LSE Library/3833724834/in/set-72157623156680255/)

这两个神话是不可能的合作者,因为证伪的伟大普及者不是别人,正是实证主义的复仇女神卡尔·波普尔。

波普尔提出证伪作为休谟归纳问题的解决方案。休谟关于归纳法的问题是,我们认为重复观察证实了我们的信念的唯一依据是,我们被证实的信念被重复观察了。也就是说,归纳法的问题在于,我们对归纳法的信仰是归纳法。

波普尔认为,虽然我们不能归纳地证实我们的信念,但我们可以通过简单地观察它们与预测结果的偏差,来推断地证明它们是错误的。

然后他建议科学应该进行一个他称之为推测和反驳的过程。

知识进步的方式,尤其是我们的科学知识,是通过不合理的(和不合理的)预期,猜测,对我们的问题的尝试性解决方案,推测。这些猜想被批评所控制;也就是说,试图反驳,其中包括严重的关键测试。他们可能经受住这些考验;但是它们永远不能被肯定地证明是正当的:它们既不能被确定为真实的,也不能被确定为“可能的”(在概率演算的意义上)

对波普尔来说,正是在理论之间的裁决中,我们力求客观和公正,他的目标是通过这些理论的主角之间的对抗过程来实现。

大胆的想法、不合理的预期和思辨的思想是我们解释自然的唯一手段:我们唯一的工具,我们抓住自然的唯一工具。我们必须冒险让他们赢得我们的奖品。我们当中那些不愿意让自己的观点面临被反驳的危险的人,是不会参与科学游戏的。

为什么我们继续坚持这个神话

波普尔与其说是把归纳的铁罐扔进垃圾箱,不如说是把它踢到街上更远的地方,暂时把归纳的怀疑换成演绎的偶然性。此外,正如我们将看到的,事实证明,反驳假说或设计批判性测试毕竟不是那么容易。

但是猜想和反驳的过程有着巨大的实际的,坦率地说是道德的吸引力。通过抛弃数据“说话”的概念——它们自己产生意义或提供理论——并通过将客观性的审查从数据转移到对立理论之间的竞争,波普尔的方案解放了我们的想象力,并将假设放回其应有的位置,与数据对话,而不是屈从于数据。数据暗示假设,但假设引导我们回到数据,更好的是,在试图反驳我们的假设时,暗示我们寻找新的数据。

为什么证伪是一个神话

不幸的是,科学通过演绎证伪并不比通过天真的归纳发展得更快,也不可能,因为我们永远无法脱离大量额外的辅助假设来检验一个假设,这些额外的辅助假设解释了要检验的假设是如何与应该反驳它的观察联系在一起的。这个反对波普尔“严格批判检验”的可能性的论点,是皮埃尔·迪昂在他的《物理理论的目的和结构》(1906 年,当时波普尔四岁)中非常优雅地提出的。

在他的许多例子中,迪昂讨论了在 19 世纪中期观察到的天王星轨道的偏差。这些偏差绝不会以任何方式破坏牛顿的万有引力定律,而预测的轨道就是从万有引力定律中推导出来的,这些偏差只是被假设为挑战一个辅助假设——即天王星没有受到任何其他大质量附近物体的影响。这一点,以及西方数学史上一些最英勇的手工计算,最终导致了海王星的发现。科学的进步归功于证伪的失败。

迪昂的例子尤其令人心酸,因为水星轨道的偏离在当时促使人们试图发现一颗行星,这颗行星的存在是如此确定,以至于它已经有了一个名字:瓦肯。在《目标与结构》出版十多年后,爱因斯坦证明了在水星的情况下,问题确实出在牛顿的理论上。但是牛顿的理论从未受到任何失败的严重挑战,直到水星轨道的偏差被广义相对论解释——一个源于灵感猜想的理论,如果曾经有过的话。

迪昂反对科学实践中证伪的现实性或可能性的论点,在奎因对大约半个世纪后的讨论做出贡献后,被称为迪昂-奎因问题。但是奎因的主张更为有力。

奎因认为,任何理论都可以适应经验观察,这更多的是一种诗意的灵感,而不是来自任何特别详细记录的理性过程。这是一个更加可疑和危险的说法,因为如果理论总是可以调整以适应观察,那么理论的构建就真的没有限制。这就是疯狂,或者至少是社会建构主义。我们不会去那里。迪昂会为我们做的。

为什么这是个问题

除了宣扬一种既未实践也不可能实践的实践的认知失调之外,唯一真正的缺点是,有了我们现在所拥有的工具,我们可以做得更好,而不是在竞争对手的猜测之间的竞争中约束自己进行证伪。

我们应该做什么?

因果关系和概率是波普尔难题中缺失的部分,因为它们共同为解释性猜想提供了一种自然语言,并为广泛使用数据(证实性的和矛盾的)提供了一个内置框架,以告知公开竞赛中猜想的可能性。

受到休谟的困扰,波普尔对因果关系很冷静,他在假设性猜想的熔炉中评估因果模型所需的概率框架还处于萌芽状态。此外,流行的频率主义概率框架已经是归纳主义的好朋友(因此不是波普尔的朋友)。

后来对休谟的解读表明,休谟认为缺乏相信因果关系的逻辑基础是逻辑的问题,而不是因果关系的问题,他愿意接受自然界中存在真正的原因,但我们对它们的认识必然是偶然的和假设的。

本着这种精神,鉴于波普尔方案中知识的内在偶然性,坚持反驳的演绎确定性似乎是不可支持的。摆脱了这种约束,我们就可以利用推理机器的全部武器,在我们必须解决的问题的因果解释模型和我们必须指导我们这样做的数据之间进行激烈的竞争。

朴素贝叶斯分类器

原文:https://towardsdatascience.com/the-naive-bayes-classifier-how-it-works-e229e7970b84?source=collection_archive---------7-----------------------

通过简单的例子解释了朴素贝叶斯算法。

作者图片

内容:

简介

1。贝叶斯定理

2。朴素贝叶斯分类器

3。一个简单的二元分类问题

3.1 先验概率计算

3.2 类条件概率计算

3.3 预测后验概率

3.4 用连续数据处理特征

3.5 处理不完整数据集

4。使用 Scikit Learn 的朴素贝叶斯

4.1 处理混合特征

5。结论

6。参考文献

简介:

分类算法试图预测分类目标变量的类别或标签。分类变量通常代表具有离散值的定性数据,如通过/失败或低/中/高等。在许多分类算法中,朴素贝叶斯分类器是最简单的分类算法之一。在其他应用程序中,朴素贝叶斯分类器通常用于大型文本数据集。本文的目的是解释朴素贝叶斯算法是如何工作的。朴素贝叶斯分类器基于贝叶斯定理,这将在下面讨论。

1.0 贝叶斯定理:

假设进行了一项关于购买超高清电视的客户调查。调查结果以列联表的形式呈现如下:

表 1:列联表

为简单起见,列联表中的类别用字母表示如下:

答:计划购买

b:实际购买

答`:不打算购买

b `:实际上没有购买

基于上述符号,列联表中的信息也可以用文氏图的形式表示。

作者图片

P(A)计划购买的概率= 350/1100。

P(B)实际购买的概率= 450/1100

P(A∩B)计划购买和实际购买的概率= 300/1100

请注意,在计算 P(B)时,我们没有考虑客户是否打算购买。顾客计划购买的先验知识改变了顾客实际购买的可能性。这也被称为假设顾客计划购买的实际购买的条件概率。它被表示为 P(B|A)。

P(B|A) = 𝑃(𝐴∩𝐵)/𝑃(𝐴) = 300/350,即在计划购买的总实例中,实际购买了多少。

这个等式可以改写为

𝑃(𝐴 ∩ 𝐵) = 𝑃(𝐵|𝐴)∗𝑃(𝐴)

我们也可以写出假设客户实际购买了 P(A|B) = 𝑃(𝐵∩𝐴)/ 𝑃(𝐵)= 300/450 的计划购买的条件概率。

我们可以将此改写为:

𝑃(𝐵 ∩ 𝐴) = P(A|B)*P(B)

由于 P(A∩B) = P(B∩A ),我们可以使上述两个方程的右边相等,从而得到:

𝑃(𝐵|𝐴)∗𝑃(𝐴)=𝑃(A|B)∗𝑃(B)

这个等式可以改写成贝叶斯定理:

如果 a 和 b 是独立事件,那么𝑃(𝐴∩𝐵)=𝑃(𝐴)÷𝑃(𝐵).

因此,当 A 和 B 是独立事件时,P(A|B) = P(A)

2.0 朴素贝叶斯分类器:

让我们数据集中的特征向量由𝑨 = (𝐴₁,𝐴₂,…,𝐴ₙ).目标向量是具有值𝐵ᵢ,i= 1,2,…k 的分类向量,其中 k 是目标向量的类别/标签总数。

给定一个新的特征向量𝐴₁,𝐴₂,…,𝐴ₙ,朴素贝叶斯分类器预测概率 P(𝐵ᵢ| (𝐴₁,𝐴₂,…,𝐴ₙ),i=1,2,…。k,即给定特征向量的目标向量的每个类别/标签的条件概率。这种条件概率也称为后验概率,可以用简洁的形式写成𝑃(𝐵ᵢ| 𝑨,i=1,2,…k。然后,朴素贝叶斯分类器将后验概率最高的类/标签 I 选为最可能的结果。

使用贝叶斯定理计算类别的后验概率:

在上面的等式中,分母 P(𝐴₁,𝐴₂,…,𝐴ₙ)对于所有类别𝐵ᵢ都是相同的,i= 1,2,…k。因此,为了计算类别的后验概率,我们可以忽略它,只需计算分子 P( A | 𝐵ᵢ)和 p(𝐵ᵢ)I = 1,2…k 中的各项。下面将解释这些项的计算方法。

术语 P(𝐵ᵢ)也称为类别 I 的先验概率。设 m 是数据集中数据点的总数,𝑁Bⱼ是数据集中类别𝐵ⱼ的实例数,则对于第 j 个类别:

因此,为了计算先验概率,我们需要计算数据集中每个类的实例数,并将其除以数据集中的数据点总数。

为了计算项 P( A | 𝐵ⱼ),朴素贝叶斯分类器假设特征彼此独立,即特征𝐴ₛ的出现不受特征𝐴ᵣ.的出现的影响这个假设并不适用于所有情况,因此这个分类器被命名为朴素贝叶斯分类器。

特征独立性的假设产生:

P(𝐴ₛ|𝐵ᵢ)也称为类条件概率。计算和存储类别条件概率是任何朴素贝叶斯分类器执行的关键任务之一。

假设在一个数据集中有三个分类特征𝐴₁,𝐴₂和 A₃。𝐴₁要素有 2 个等级/标签,𝐴₂要素有 3 个等级/标签,A₃要素也有 2 个等级/标签。总的特征标号是 2+3+2=7。数据集中的目标变量是一个二元分类变量,即只有 2 个类别。对于这样的数据集,我们需要计算和存储 7*2=14 个类别条件概率。在预测阶段查找这些概率。在下一节中,将使用一个简单的示例来解释先验和类别条件概率以及后验概率的计算。

3.0 一个简单的二元分类问题:

这个虚构的示例数据集包含与事故相关的不同情况的示例。目标变量 accident 是一个带有是/否值的二元分类变量。有 4 个分类特征:天气状况、道路状况、交通状况和发动机问题。

下面列出了与每个功能相关的类别/标签:

表 2:要素类

表 3:示例数据

3.1 先验概率计算:

有 10 个数据点(m = 10)。有 5 个分类/标签“是”(𝑁Accidentᵧₑₛ = 5),5 个分类/标签“否”(𝑁Accidentₙₒ = 5)。可以使用第 2.0 节中的先验概率公式计算先验概率:

𝑃(Accidentᵧₑₛ) = 5/10

𝑃(Accidentₙₒ) = 5/10

3.2 类条件概率计算:

首先根据目标标签(是/否)分割数据集。因为目标变量有 2 个类,所以我们得到 2 个子表。如果目标变量有 3 个类,我们将得到 3 个子表,每个类一个。

以下两个表分别显示了目标类/标签“否”和“是”的数据集:

表 4:目标标签“否”的子表

表 5:目标标签“是”的子表

类别条件概率𝑃(𝑨 |𝐵ₙₒ和𝑃(𝑨 |𝐵ᵧₑₛ可以使用如下所示的表 4 和表 5 来计算:

表 6:天气条件的分类条件概率

表 7:路况的等级条件概率

表 8:交通状况的类别条件概率

表 9:引擎问题的类条件概率

虽然类条件概率的计算很简单,但是条件概率应该被系统地组织,因为在预测阶段需要查找这些概率。

3.3 预测后验概率:

假设我们现在有了一个新的特征向量:

天气状况:下雨

路况:良好

交通状况:正常

发动机问题:没有

任务是预测事故是否会发生?

使用第 2.0 节中的后验概率公式计算每个目标类别的后验概率。

注意,如第 2.0 节所述,分母的计算被省略。代入上表 6、7、8 和 9 中的先验概率和类别条件概率的值,我们得到:

自𝑃(accidentₙₒ|𝐴ₙₑ𝓌)> 𝑃(accidentᵧₑₛ|𝐴ₙₑ𝓌)的预言是偶然的= '不'。

概率可以通过归一化后验概率来获得:

3.4 用连续数据处理特征:

这个玩具示例中的数据集只有分类变量。如果数据集具有不断变化的要素会怎样?例如,假设我们有一个记录事故发生时温度的特征温度。这种特征的类条件概率的计算不能再基于上面解释的计数方法来计算。通常假设连续特征变量是正态分布的。对于正态分布,随机变量(x)在 x 和 x+dx 之间的概率由下式给出:

上式中的𝜇和𝜎是给定正态分布的均值和标准差。

基于目标变量类的子表的创建类似于上面所解释的。计算子表(表 4 和表 5)后,我们计算并存储平均温度𝜇ₜₑₘₚₑᵣₐₜᵤᵣₑ|Accidentₙₒ、𝜇ₜₑₘₚₑᵣₐₜᵤᵣₑ|Accidentᵧₑₛ,以及来自 2 个子表的温度特征变量的标准偏差𝜎ₜₑₘₚₑᵣₐₜᵤᵣₑ|Accidentₙₒ和𝜎ₜₑₘₚₑᵣₐₜᵤᵣₑ|Accidentᵧₑₛ。

在预测阶段,给定一个新的温度值,使用如上所示的正态分布曲线的分析形式计算类别条件概率:

3.5 处理不完整数据集:

在上述示例数据集中,存在足够的数据来计算所有类别条件概率。如果训练数据集中的目标类缺少特定的要素标注,该怎么办?例如,在我们的例子中,𝑃(𝑊eatherconditionᵣₐᵢₙ|accidentᵧₑₛ= 0。这将导致后验概率𝑃(accidentᵧₑₛ|𝐴ₙₑ𝓌= 0,即使其他类别的条件概率不为零。拉普拉斯校正用于处理这种情况。具有拉普拉斯校正的类条件概率的一般形式是:

对于第 3.0 节中讨论的示例,n = 1 是事故=是时的要素类计数(即雨)。𝑁Accidentᵧₑₛ= 5 号。

NFeature = 4(数据集中有 4 个要素)。

α是拉普拉斯校正因子。

拉普拉斯校正应用于所有类别的条件概率计算。从上式可以看出,对于特定的特征类,如果 n = 0,则类条件概率非零。

对先验概率的拉普拉斯校正的形式是

同样对于 3.0 节中讨论的例子

m = 10(数据点的总数)。

k = 2(目标变量类数量)。

为了理解校正因子α的影响,考虑一种假设情况,其中:n = 1,NFeature = 4,𝑁Accidentᵧₑₛ= 60,m = 100,k = 2。

图 1

图 2

图 1 和图 2 分别显示了上述假设情况下类别条件概率和先验概率的变化。从图 1 中,我们可以看到,随着α的增加,类别条件概率趋向于 1/4 = 0.25。同样,从图 2 中,我们可以看到,随着α的增加,先验概率趋于 1/2 = 0.5。

通过让α趋于无穷大,这些极限值也可以从拉普拉斯校正方程中看出:

因此,随着校正因子的值增加,类别条件概率趋向于均匀的概率分布,每个特征具有相同的类别条件概率 1/NFeature。

类似地,每个目标类别的先验概率趋向于均匀概率,每个类别具有相同的 1/k 的先验概率。对于大多数问题,值α通常选择为 1。

4.0 使用 Scikit 学习的朴素贝叶斯:

sklearn 中的 nave _ Bayes 模块支持不同版本的 nave Bayes 分类,例如高斯 nave Bayes(在 3.4 节中讨论)、用于分类特征的多项式 nave Bayes 以及其他版本。

本节使用 iris 数据集来说明 Scikit learn 中可用的高斯朴素贝叶斯分类器的用法。数据集可以在这里找到:【https://www.kaggle.com/uciml/iris?select=Iris.csv】

虹膜数据集是一个微小的数据集,由 4 个连续的特征向量组成,描述了鸢尾花家族的不同特征。有 3 个目标类别涉及三种鸢尾花。目的是为一组新的特征向量正确地预测花卉种类。

对于这个简单的数据集,高斯朴素贝叶斯分类器在预测花卉种类时达到了 0.96 的准确度分数。

4.1 处理混合功能:

如果数据集同时具有连续和分类特征。sklearn 的一个简单方法是使用宁滨将连续变量转换为分类变量。例如,通过定义冷、温和、热温度类别的温度范围,可以将温度等特征转换为分类变量。将所有要素转换为分类要素后,可以使用 sklearn 中 nave _ Bayes 模块中的多项式算法进行拟合和预测。

5.0 结论:

朴素贝叶斯分类器是一个简单而通用的分类器。由于计算成本低,朴素贝叶斯分类器对于大型数据集非常有效。在性能方面,朴素贝叶斯分类器比许多其他分类器具有更好的性能。朴素贝叶斯分类器的一个主要缺点是固有的特征独立性假设。实际上,真实数据集中的要素很少是独立的。尽管有这个缺点,朴素贝叶斯分类器在初步理解数据时非常有用。

6.0 参考文献:

  1. 基本商业统计概念和应用,M.L. Berenson,D.M. Levine,T.C. Krehbiel。
  2. https://scikit-learn.org/stable/modules/naive_bayes.html

受审的 Ndrangheta

原文:https://towardsdatascience.com/the-ndrangheta-on-trial-733027c3982c?source=collection_archive---------16-----------------------

利用 NetworkX 分析欧洲最强大的黑手党

Ndrangheta 的嫌疑成员(来源:意大利宪兵)

意大利自 20 世纪 80 年代以来最大的黑手党审判刚刚开始。900 多名证人将在卡拉布里亚一个特别建造的高安全性法院里为 350 名被告作证。被告席上的男子被指控是世界上最危险的犯罪组织之一 Ndrangheta 的成员。几十年来,它一直是西西里的科萨·诺斯特拉和那不勒斯的卡莫拉的穷亲戚。被好莱坞忽视的 Ndrangheta 在它的家乡——位于意大利“靴子”的“脚趾”处的卡拉布里亚偏远崎岖的山坡上——之外鲜为人知。其核心业务是勒索和绑架。它的结构是一个松散的家庭或宗族联盟,他们的血缘关系使他们几乎不可能渗透。

随着 Ndrangheta 近年来的发展,这种结构似乎已经发生了变化。当该组织与南美卡特尔建立联系并控制了欧洲可卡因市场后,其收入迅速增长。2013 年,Demoskopia 研究所的一份报告称,Ndrangheta 的营业额为 440 亿英镑,超过德意志银行和麦当劳的总和。CNN 估计,它控制了进入欧洲的高达 80%的可卡因。随着这种增长,Ndrangheta 也扩大了它的势力范围,开始统治意大利北部伦巴第区的地下世界。这种扩张伴随着更集中的控制和更高的公众形象。

Ndrangheta 的传播在 2007 年变得清晰,当时两个家族之间的世仇导致六名成员在德国西部小镇杜伊斯堡的一家披萨店外被枪杀。第二年,伦巴第区 Ndrangheta 的首领 Carmelo Novella 在米兰外的一个小镇 San Vittore Olona 的一家酒吧被谋杀。他对更多自治权的要求激怒了卡拉布里亚的老板们。

这个项目的数据集来自这段动荡时期。为了应对不利的头条新闻,伦巴第当局发起了 Infinito 行动,在两年的时间里跟踪 100 多个黑手党成员的行动和互动。2009 年 10 月录制了《达格纳诺峰会》( Summit di Paderno Dugnano ),高级黑帮成员在会上选举了卡梅洛·诺维拉(Carmelo Novella)的继任者。2010 年,在 Infinito 行动中收集的证据构成了几十项起诉的基础,大多数指控是参加黑手党类型的组织——定义为沉默的 omerta 和作为一个团体进行恐吓的权力。

这些案件结案后,当局公布了在 Infinito 行动中收集的信息。十年后,当 Ndrangheta 再次发现自己站在被告席上时,这种监视可能提供了对其领导层结构的最佳洞察。那么,关于欧洲最强大的黑手党,数据科学能告诉我们什么呢?

数据可以在这里下载。

Infinito 数据集引用了两年期间发生的 48 次会议。超过 150 名黑手党成员参与其中,但通常只有少数人参加任何特定的会议,每个黑手党成员通常只参加一两次。结果是一个相当稀疏的矩阵。NetworkX 库允许我们通过创建一个“二分”网络来可视化这一点——在下图中,每个蓝色节点代表一个黑手党,链接到特定的红色节点或会议。少数蓝色节点与多个红色节点相连,但大多数网络并不密集。

(图片由作者提供)

下一步是通过创建一个无向图来了解黑手党之间的关系。要做到这一点,Itertools 的 Combinations 类可以用于每个会议的出席者名单,以产生一个“边缘”列表,将构成新网络节点的黑手党分子联系起来。该网络包含 151 个节点或黑手党,1619 条边(黑手党之间的联系),每个黑手党平均与 21 个其他黑手党相连。那么这个网络告诉了我们什么关于 Ndrangheta 的结构,以及它最重要的成员是谁?

显而易见的起点是看每个黑手党组织的联系有多紧密,或者每个节点有多少“度”。这揭示了整个网络中的显著不平等。六个黑手党有超过五十个联系人,是网络平均人数的两倍多。

另一个要考虑的指标是聚类系数,它衡量节点倾向于聚集在一起的程度——如果一个黑手党的亲密同伙都有联系,那么他将具有高聚类系数。连接较好的节点很可能具有较低的聚类系数,因为连接越多,所有连接相互链接的可能性就越小。我们可以看到大多数节点的系数都很高,但也有少数节点的系数不高。聚类系数最低的六个人也是拥有最多联系的人。看起来这六个人都与许多其他黑手党有联系,而这些黑手党又彼此之间没有联系——这六个人是这个网络的主要枢纽

(图片由作者提供)

第三个要考虑的指标是“中间中心性”。这是根据其他节点之间有多少条“最短路径”通过它来考察每个节点的中心位置。大多数黑手党在这个指标上得分很低,但前七名包括我们在其他两个指标上看到的六个名字,外加一个人。那这七个人是谁?

  • 亚历山德罗·曼诺是米兰皮奥特洛区 Ndrangheta 的老板。在 Infinito 行动之后,他将被判 16 年徒刑。
  • Cosimo Barranca 是米兰市中心 Ndrangheta 的老板,在 Infinito 行动后被判 14 年徒刑。
  • 安东尼诺·拉马尔莫是米兰林比亚区的老大。
  • Pietro Francesco Panetta 是 Cormano 区的老板,也是 Provincia 执政委员会的成员。
  • 科西莫·拉斐尔·马格诺里是帕内塔在科曼诺的副手。
  • Francesco Muia 是爱奥尼亚海岸的老板,于 2016 年被判 24 年。
  • Francesco Cristello 因参与 2010 年谋杀一名叫 Rocco Stagno 的罪犯而于 2019 年被判终身监禁。

当我们把这个网络想象成一个整体时,弗朗西斯科·克里斯特罗似乎是个异类。其他六个都有大量的连接,低聚类系数,和高介数中心性。Cristello 纯粹基于中间中心性列出了这个名单,这本身可能夸大了他的重要性。当然,从表面上看,他在网络中似乎远没有那么突出,也没有公开的信息表明他是一个重要人物。

(图片由作者提供)

那么 NetworkX 对理解 Ndgrangheta 的结构有多大帮助呢?学位、聚类系数和中间中心性的组合似乎已经确定了六个老板,但是还有多少,在挑选他们方面它能做得多好?

在 Infinito 行动之后,米兰的检察官评估了几十名黑手党成员的身份,并将其中一些人归类为老大,但是他们的报告似乎从来没有用英语发表过。但要判断网络分析的效果如何,我们需要给每个黑手党分配阶级标签(即‘boss’或‘not _ boss’)。幸运的是,即使没有来自检察官的明确名单,也可能有一个解决办法。

事实证明,并非所有的 Ndrangheta 会议都同样重要。最后一次被称为帕德诺·达格纳诺峰会,在米兰郊外一个小镇的会议厅举行。该大厅位于 Piazza Falcone Borsellino,讽刺的是,该大厅是以两名反黑手党法官的名字命名的,他们因参与 1986 年至 1987 年的“大审判”而在 20 世纪 90 年代被谋杀。

Paderno Dugnano Ndrangheta 会议的监控录像(来源:米兰检察官办公室)

峰会于 2009 年 10 月 31 日举行,标志着帕斯夸莱·萨皮亚当选为新的 Mastro Generale,负责维护伦巴第的 Ndrangheta 人和他们在卡拉布里亚的家乡之间的关系。在没有一份确定的老板名单的情况下,我们大概可以假设这次峰会的与会者是伦巴第的 Ndrangheta 的最高级成员。

这不是一个完美的解决方案,因为有几个与会者身份不明。然而,这似乎是一个合理的假设,即这些身份不明的男子不来自监控数据集内(或者可能不会有识别他们的麻烦)——他们很可能不是来自伦巴第的本地 Ndrangheta,而是来自卡拉布里亚的游客。

当我们查看参加峰会的已确认姓名时,他们肯定是网络中的重要人物。他们似乎是中央集权结构的一部分,而不是像恩格兰赫塔那样的松散的家族或宗族联盟。网络分析似乎证实了意大利首席反黑手党检察官皮埃特罗·格拉索的评估,即 Ndrangheta 已经变得“分等级、联合和金字塔式”。

峰会与会者以红色显示(图片由作者提供)

接下来的问题是,我们是否可以在会议召开之前预测到谁会被邀请参加会议——以及 NetworkX 在多大程度上增强了我们的这种能力?在我们回答这个问题之前,我们首先需要创建一个新的网络图,它不包含来自峰会的数据(或者目标变量将帮助预测它自己)。网络中的边数从 1619 条下降到 1443 条,平均度数从 21 度下降到 19 度。

检查调整后的新网络,我们的基线为 85.9%。这是由多数阶级(非老板)组成的比例,因此如果一个模型可以说有任何预测价值,它就需要比这个得分更高。

为了理解 NetworkX 分析增加了什么价值,我们首先需要看看没有它我们能做得多好。仅在出勤数据上训练逻辑回归模型(没有 NetworkX 特征,如度、聚类系数和中间中心性),我们得到交叉验证的准确度分数为 0.866,略高于基线。测试集上的准确度分数是相同的,但该模型在测试集上的回忆和 f1 分数为 0,这表明它很难挑出少数类的成员——当存在类不平衡时,分类问题中的一个常见问题。

当我们允许模型与来自 NetworkX 的数据一起工作时,情况会显著改善。交叉验证的训练分数上升到 0.891,并且测试集的回忆和 F1 分数都上升到 0.500。通过调整模型的阈值,我们可以得到进一步的改进,在 0.900 的准确率、0.750 的召回率和 0.667 的 f1 测试集上的性能最好。使用 SMOTE 对 minority 类进行过采样不会提供任何额外的改进,尽管相对于使用模型的默认阈值来说,它确实有所帮助。

(图片由作者提供)

在各种其他模型(RandomForest、KNN、GradientBoostingClassifier、SVC)中,最佳性能来自支持向量分类器——交叉验证的训练集精度为 0.891,测试集精度为 0.933,测试集召回率为 0.750,测试集 f1 为 0.750。

最成功的 SVC 模型的混淆矩阵(图片由作者提供)

当类别不平衡时,分类问题总是具有挑战性,NetworkX 分析生成的特征对允许模型得分显著高于基线有很大帮助。

这个项目的代码可以在这里查看。

Jupyter 小工具的新时代

原文:https://towardsdatascience.com/the-new-age-of-jupyter-widgets-cc622bee2c4b?source=collection_archive---------11-----------------------

如果您可以使用 NPM 的好东西用 Python 来构建 Jupyter 小部件会怎么样?

米利安·耶西耶在 Unsplash 上拍摄的照片

笔记本一直是软件思想增量开发的工具。数据科学家使用 Jupyter 来记录他们的工作,探索和实验新的算法,快速勾画新的方法,并立即观察结果。

这种互动性是 Jupyter 如此吸引人的原因。为了更进一步,数据科学家使用 Jupyter 小工具来可视化他们的结果或创建迷你网络应用程序,以方便浏览内容或鼓励用户互动。

然而, IPyWidgets 并不总是容易共事。它们不遵循前端开发人员开创的声明式设计原则,并且生成的组件不能像在浏览器环境中那样进行传输。此外,开发人员创建这些库主要是为了满足数据科学家的可视化需求。因此,它们缺少像 React 和 Vue 这样的流行前端框架带来的特性。

是时候迈出下一步了;这个故事介绍了 IDOM:一套用于定义和控制交互式网页或创建可视化 Jupyter 组件的库。我们将讨论后者。

Learning Rate 是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。订阅这里!

IDOM:用 Python 反应设计模式

那么,让我们从 IDOM 开始。对于那些熟悉 React 的人来说,你会发现 IDOM 做事的方式有很多相似之处。

我们将在 Jupyter 中创建一个简单的 TODO 应用程序。是的,我不知道这对数据科学家有什么帮助,但我想做的是展示 IDOM 的能力。如果你发现任何数据科学用例,请在评论中留下!

首先是代码。然后,我们将一次浏览一行,了解它是如何工作的。

idom.component装饰器创建一个组件构造器。该组件使用其下方的函数(如todo())呈现在屏幕上。然后,为了显示它,我们需要调用这个函数并在最后创建这个组件的一个实例。

现在,让我们来看看这个函数是做什么的。首先,[use_state()](https://idom-docs.herokuapp.com/docs/package-api.html#idom.core.hooks.use_state)功能是一个挂钩。调用这个方法返回两件事:一个当前状态值和一个我们可以用来更新这个状态的函数。在我们的例子中,当前状态只是一个空列表。

然后,我们可以在一个add_new_task()方法中使用 update 函数来做我们想做的任何事情。该函数获取一个事件,并检查该事件是否是由敲击键盘的Enter键产生的。如果是这样,它将检索事件的值,并将其附加到任务列表中。

为了存储用户创建的任务,我们将它们的名称附加到一个单独的tasks Python 列表中,旁边是一个简单的删除按钮。当按下 delete 按钮时,调用remove_task()函数,该函数像add_new_task()函数一样更新状态。但是,它不是向当前状态添加新项目,而是删除选定的项目。

最后,我们创建一个 input 元素来创建 TODO 任务,并创建一个 HTML table 元素来保存它们。在最后一步,我们使用一个div HTML 标签来呈现它们。

越来越好了

到目前为止,一切顺利。然而,IDOM 给我们的力量不仅限于显示 HTML 元素。IDOM 的真正力量来自它无缝安装和使用任何 React 生态系统组件的能力。

在这个例子中,让我们使用[victory](https://www.npmjs.com/package/victory),这是一组用于模块化图表和数据可视化的 React 组件。要安装 victory,我们可以使用 IDOM 命令行界面:

!idom install victory

然后,让我们在代码中使用它:

恭喜你。您刚刚在 Jupyter 笔记本中创建了一个带有victory的饼图!当然,导入和使用现有的 JavaScript 模块也很简单。参见文档。

结论

数据科学家使用 Jupyter 小工具来可视化他们的结果或创建迷你网络应用程序,以方便浏览内容或鼓励用户互动。

然而, IPyWidgets 并不总是容易共事。它们也有一些缺点:它们不遵循声明式设计原则,并且产生的组件不能像在浏览器环境中那样被转移。

是时候迈出下一步了;这个故事研究了 IDOM:一组用于定义和控制交互式网页或创建可视 Jupyter 组件的库。

IDOM API 在文档中有更详尽的描述。此外,在安装前,您可以在活页夹上玩idom-jupyter

关于作者

我叫 Dimitris Poulopoulos ,我是为 Arrikto 工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。此外,请访问我网站上的资源页面,那里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!

新数据经济学

原文:https://towardsdatascience.com/the-new-data-economics-30fa81603c6b?source=collection_archive---------27-----------------------

作者图片

如今,大多数组织都认识到数据是他们最有价值的资产。跨数据管理和分析所有领域的数据解决方案市场是巨大的,推动数据公司激增的大量风险投资资金并不令人惊讶。然而,令人惊讶的是,我们整个行业并没有整体地看待数据管理和分析问题;从数据生产到分发,再到导致洞察的消费。换句话说,我认为今天的数据经济学是有缺陷的。

与经济学处理商品生产、分配和消费的方式类似,数据经济学处理数据的生产、分配和消费。数据生产是指生成数据的格式、数据的来源和存储位置。数据分发的重点是谁可以访问数据,如何将数据货币化,以及如何进行访问。数据消费涉及数据处理、分析和可视化的方式,以获得进一步的见解。

看看大多数数据公司,从数据库、数据仓库、数据湖、湖屋,到所有众多不同的机器学习和特定于数据的领域解决方案。他们中的大多数都专注于数据消费,并且主要围绕如何使 SQL 查询运行得更快更便宜,如何训练和服务 ML 模型,或者如何执行特定领域的计算和可视化。一些公司已经做了一些初步的尝试,使数据能够在单个组织之外分发,但是有很多限制。绝对没有一家公司解决了生产方面的问题。整个行业理所当然地认为数据会以特定的格式出现,并且花费在 ETL 和数据争论上的时间是不可避免的。不应该。事实上,我认为倾向于以原始的低效格式保存数据的非 ETL 趋势正在使我们的行业倒退——而不是前进。

数据经济学的这三个方面的分割和隔离导致了人力时间和资源的巨大浪费,因此对组织来说成本非常高。但最重要的是,这完全是一种干扰;企业和科研机构将资源和时间投入到非核心产品或科研工作上。因此,商业受到阻碍,技术和科学进步不必要地减缓。

在这篇博文中,我详细阐述了数据经济学各个方面的问题和后果,从生产、分配到消费。然后,我概述了一个基本方法,它可以作为“解决方案模板”,任何设想构建数据系统和塑造数据经济学未来的人都可以遵循。最后,我将展示我们使用 TileDB 按照建议的方法构建的解决方案,以证明有可能彻底转变数据空间并显著加快业务、科学和技术的发展。

这篇博文是我最近在 PyData Global 2021 上演讲的扩展版,下面是那次演讲的视频记录:

数据生产问题

我以一个大胆而明显的声明开始:所有应用程序中的数据都以错误的格式生成。以下是一些例子:

  • 历史财务数据:数据存储在效率低下的文本文件中(最好的情况下是 CSV,最坏的情况下是一些晦涩的规范),缺少压缩和快速访问。
  • 人口基因组学:数据存储在复杂的 VCF 文件中,只有少数工具可以读取。
  • 激光雷达:数据存储在 LAS 文件中,需要进一步的索引和元数据处理。
  • 卫星成像:数据存储在 COG 文件中,需要进一步的索引和元数据处理。
  • 海上交通(AIS): 数据存储在效率低下的 CSV 文件中,无法压缩和快速访问。
  • 通用表:数据存储在 CSV 或 Parquet 文件中,缺少索引、元数据和版本控制等重要功能,留给了更高级别的应用程序。

我可以继续下去。明显的问题当然是性能。这些数据不是以一种分析就绪的方式存储的,可以被使用它们的工具有效地使用。因此,消费者求助于非常昂贵的争论和 ETL 过程。此外,每个消费者都必须构建自己的基础架构来分析大规模数据,这通常会与其他组织出于相同目的构建的基础架构类型重叠。最终结果是大量的重复劳动,次优的实现,以及人力时间和金钱的完全浪费。

这个问题当然始于这些数据的来源,它们根本没有与分发和分析这些数据的组织进行沟通。我们已经到达了这样一个点,数据消费者认为争论和 ETL 是必要的罪恶,因此,他们没有足够地推动数据生产者改变他们的方法。另一方面,数据消费者没有为数据生产者提出令人信服的替代方案,因此,后者对改变现状没有什么兴趣。这是一个僵局。

数据分布问题

传统的数据库和特定领域的解决方案长期以来忽略了将它们管理的数据分布扩大到组织之外的可能性。那是旧时代单一方法的残余。最近,组织开始意识到在全球范围内与外部方共享数据是有价值的。但是目前的方法在许多方面都存在不足。在这一节中,我将谈到三种这样的方法。

第一种方法相当幼稚,但也是最常见的一种:将数据以平面文件的形式转储到某个云存储桶中,并通过管理云提供商的文件策略或委托某种第三方“市场”解决方案来授予对文件的访问权限。无论哪种方式,消费者都被授予对文件的访问权限。下载数据、以更好的数据格式保存数据副本,以及构建庞大的基础设施来管理和分析大规模数据,这些任务完全落在了消费者的肩上。这个过程是由所有相同数据的消费者遵循的。1000 个相同数据的消费者?1000 次下载、复制和基础架构变化实际上做着同样的事情:以某种合理的方式管理、分析和可视化数据。

第二种方式在数据生产者方面更慷慨一些:建立基础设施,并以更好的方式向消费者提供数据。在这种情况下,建造和维护基础设施的成本由生产商承担。然而,与我们交谈过的大多数数据生产者都不希望花费资源来构建和维护这样的基础设施。那完全超出了他们的业务范围。

第三种解决方案是利用现成的数据库解决方案,并使用它们的数据共享功能(例如,参见雪花和红移)。在这种情况下,访问数据的成本转移到消费者身上,这是正确的方向。然而,有一些重要的限制。例如,不支持写访问,日志和审计很棘手,访问驻留在不同云区域或不同云提供商的生产者数据会变得非常复杂。对于跨区域访问,消费者可能被迫以额外的麻烦和成本在多个区域加速运行数据库集群,或者承受额外的出口成本。另一方面,跨云数据共享对于现有的解决方案来说是不可能的。但最重要的是,房间里的大象:所有这些数据库解决方案只处理表格数据。剩下的大量数据类型(图像、视频、基因组学、激光雷达等)以及简单的平面文件(如 pdf)又如何呢?您需要非常有创意地将所有这些数据放入关系数据库中,或者仅仅求助于上面提到的另外两种方法。

数据消费问题

有人可能会说,这是当前市场表现良好的方面。有许多数据解决方案,具有出色的性能和各种有用的功能。如果您的应用程序需要单一的数据解决方案(例如,事务数据库或数据仓库),那么您可能已经准备好了。

然而,在我们处理的大多数用例中,这远不是标准。在大多数情况下,一个组织除了表之外,还有各种各样的数据类型和平面文件。此外,组织中不同的个人和小组运行着用不同语言编写的不同工作负载,使用不同的工具,这些工具远远超出了 SQL 的范围。

通常发生的事情令人难以置信。例如,一些大型表格数据存储在一个强大的仓库中,但是一个组需要运行仓库不支持的大规模 ML 或定制操作。该小组创建了一个庞大的 SQL 查询来导出仓库中的数据,并将其导入 Spark 或 Dask 等工具中。身份验证、访问控制和日志记录在仓库内正常进行,但一旦数据流出,就成了西部荒野。没有控制,没有记录,没有责任。我还可以提供许多其他例子,涉及多种不同的数据类型、多种语言和工具以及大量争论。

消费问题的根源实际上是生产和分配问题,这些问题被忽视或被当作事后的想法。数据是以低效、不可互操作的方式产生或争论的。还没有适当地解决数据分发,以考虑任何类型的数据,以及来自产生数据的组织内部或外部的任何一方的数据。

基本方法

总结到目前为止,数据经济学是有缺陷的,因为没有人从整体上解决数据问题,因为每个人似乎都被困在高效和有效的数据消费的回音室中。我们对这个问题有了更全面的了解,以下是我们认为可行的解决方案,涵盖了数据经济学的所有方面。

生产

需要一种通用的格式,它可以与任何语言和工具以及任何存储后端进行互操作(自然地使它也是“云优化的”)。历史表明,不灵活的格式规范在所有领域都一再失败。此外,特定于领域的格式通常只能由特定于领域的工具解析和读取,这极大地限制了快速增长的数据科学和分析工具生态系统的使用。

格式应该是开放规范的,应该有一个快速的开源存储库可以读取和发展它。这个库应该用一种快速的、可互操作的语言(比如 C/C++)来构建,使众多的语言 API 包装器和工具集成能够在其上构建。重点不应该放在格式上,而应该放在存储库及其 API 上。这种形式不应缺乏灵活性,也不应经历“委员会批准”的大循环;相反,它应该能够快速发展,同时努力保持 API 的稳定性和向后兼容性。

通用性和互操作性将为合理的、规范化的、受控制的数据分发以及越来越多的工具的轻松使用打开大门。

分配

分配问题有四个方面:

存储:无论谁在访问数据,如何访问,数据都需要存储在某个地方。由于我们大部分时间都在谈论大量的数据,存储必须尽可能便宜。此外,数据是一种非常有价值的资产,因此生产商应该可以选择拥有数据,这意味着一种自带存储的能力。最后,存储必须与计算分开,以将总运营成本保持在合理的范围内,尤其是在计算需求波动且与存储容量不对称的情况下。所有这些考虑都指向将数据存储在某种符合上述所有条件的云对象存储解决方案中。

访问:这又回到了生产方面。如果数据格式是通用的和可互操作的,那么任何工具都应该能够直接从存储中访问它,而不需要局限于 SQL 或某个特定领域的库,也不需要任何繁琐和昂贵的下载。此外,如果数据在通用格式下被标准化,那么可以建立单一的认证、访问控制和记录机制来安全地管理各方的访问。通用性和互操作性是你的朋友。

计算:一旦解决了基本的存储和访问考虑事项,最关键的方面就变成了计算,或者更准确地说,是如何以及在哪里进行访问。这一点至关重要,因为它将决定谁来买单。这就是事情变得混乱的原因。

数据生产者应该拥有数据,并可以选择将数据存储在任何云对象存储中,甚至跨不同的地区和云提供商。此外,生产者不应该为消费者的任何访问支付一分钱。最后,消费者不应该被迫在生产者的云提供商或选择的区域建立基础设施,因为这永远不会随着生产者的数量而扩展,并且消费者总是不愿意维护多个集群。

那么我们如何解决这个问题呢?无服务器是你的朋友。应该有第三方为生产者和消费者管理基础设施。生产者应该将他们的数据存储在云对象存储中(在任何地区和云提供商上),并且只收取存储费用。消费者应该维护基础设施。第三方应负责管理每个云提供商和每个地区的计算集群。消费者应该只从任何工具发出查询,第三方应该自动将计算发送到数据所在的位置,以提高性能并消除不必要的出口成本。消费者应该只为他们使用的资源付费,第三方应该负责监控这些成本。这是个三赢的局面

货币化:这是指从分享数据(甚至代码)中获利的能力。根据上面的讨论,管理基础设施的第三方拥有促进从生产者到消费者的数据(甚至代码)分发的所有手段,包括关于使用的所有指标(因为遵循了随用随付模型)。因此,可以轻松构建市场功能来支持货币化,消除了生产者和消费者与两个不同供应商签约的需要(一个用于市场,另一个用于分析)。此外(也许也是最重要的),这消除了对数据移动的需求,而数据移动既麻烦又昂贵。第三方真正需要的是与 Stripe 之类的服务集成。然后每个人都得到分发、分析和货币化数据(甚至代码)的最终解决方案。

消费

与主要关注数据消费的整个市场相反,找到一种健壮的方法来解决数据生产和分发问题使我能够在这里花最少的时间来描述消费解决方案。这是因为,一旦您以通用和可互操作的格式获得数据(使用存储引擎来高效地存储和访问数据,并与所有工具集成),那么您几乎可以使用您已经在使用的任何工具,只需对您的日常实践进行很小的修改。例如,您将能够在相同的数据上使用 SQL、Python pandas、R data.table 或其他任何东西,而无需下载和争论,并且在我在发行版一节中描述的基础设施中以无服务器的方式进行。此外,您将能够在任何应用程序域(甚至跨应用程序域)中安全轻松地与任何人协作,因为分发基础结构支持开箱即用的数据共享等功能。换句话说,一旦您仔细解决了数据生产和分发方面的问题,消费方面也就自然而然了。

但最重要的是,单个通用格式和管理平台允许您在单个解决方案中存储和管理所有不同的数据类型和文件(以及统一的身份验证、访问控制和日志记录机制),而不是必须处理大量解决方案、数据移动和转换,以及在不必要的数据工程中浪费大量时间。

可行的解决方案

还有一个问题:上述通用方法可行吗?我们有证据证明确实如此。下面是我们如何在 TileDB 解决这个问题的。

我们发明了一种通用的数据格式和一个强大的开源存储引擎来支持它,叫做 TileDB Embedded 。这种格式基于多维数组,它足够通用,可以存储我们遇到的任何数据类型,从表格、基因组、图像、ML 模型,甚至平面文件。我们在最近的网上研讨会中详细解释了它的内部机制。

为了解决分发问题,我们构建了 TileDB Cloud ,这是一个基于通用 TileDB 格式的平台,因此允许存储、共享、货币化和记录一切:表格、平面文件、仪表板、Jupyter 笔记本、用户定义函数和 ML 模型。TileDB 云是完全无服务器,允许访问与任何云区域的任何提供商共享的数据,并对其进行大规模分析。它会自动将每个查询分派到数据所在的提供者和区域内的集群。最后,TileDB 云与 Stripe 集成,不仅可以轻松实现数据货币化,还可以轻松实现代码货币化(例如,UDF、笔记本、ML 模型和仪表盘)。欲了解更多信息,您可以观看本次网络研讨会。

最后,在消费方面,由于 TileDB 格式和存储引擎是通用的和可互操作的,人们可以从任何语言 API 和工具访问数据,同时继承 TileDB 云的所有访问控制、货币化和日志记录功能。

结论

数据经济学需要彻底重塑。数据管理和分析领域一如既往地炙手可热,但组织仍在基础数据管理方面苦苦挣扎。在这篇博文中,我证明了作为一个数据社区,我们可以做得更好。我解释说,有一个新的框架从整体上考虑数据问题,从数据生产、分配到消费,对数据经济学有一个全景的看法。我认为有证据表明这样的框架是可行的。今天的证据是我们在 TileDB 所做的,但我希望我们能激励其他人去构建类似的解决方案。市场上的风险远不止数据炒作和风险投资消防水管。严肃的组织和科学机构正在依靠我们加速商业、科学和技术,为了每个人!

演讲幻灯片

这是我在演讲中使用的幻灯片。

作者在甲板上的图像

最后说几句:

  • 我们在招人!如果你喜欢你读到的内容,并且你觉得你很适合,请今天就申请。
  • 请在 Twitter 上关注我们,加入我们的 Slack 社区或参加我们的论坛。我们希望收到您的来信,以便我们能够做得更好。

最后但同样重要的是,非常感谢整个团队所做的出色工作。我只是一个纯粹的代表和投诉的唯一接受者。所有的荣誉总是归于我们令人敬畏的团队!

新一代数据湖

原文:https://towardsdatascience.com/the-new-generation-data-lake-54e10e02b757?source=collection_archive---------5-----------------------

千万亿字节架构,不容错过!

图片由休伯特·纽菲尔德拍摄:https://unsplash.com/photos/7S21XSxKxVk

用于机器学习项目的数据量持续增长。数据科学家和数据工程师已经转向数据湖来存储海量数据并寻找有意义的见解。多年来,数据湖体系结构已经发展到以可接受的读/写速度大规模扩展到数百 TB。但是大多数数据湖,无论是开源的还是私有的,都已经达到了 Pb 级的性能/成本墙。

快速查询扩展到 Pb 级需要新的架构。幸运的是,新的开源 Pb 架构已经出现。关键要素来自开源解决方案提供的新表格格式,如【胡迪】****三角洲湖阿帕奇冰山。这些组件使数据湖能够以惊人的速度扩展到 Pb 级。********

为了更好地认识这些新的表格格式是如何帮助我们的,我们需要了解当前数据湖架构的哪些组件伸缩性好,哪些组件伸缩性不好。不幸的是,当单个部分无法扩展时,它就会成为瓶颈,并阻止整个数据湖高效地扩展到 Pb。

我们将重点关注开源数据湖生态系统,以更好地了解哪些组件可以很好地扩展,哪些组件可以防止数据湖扩展到 Pb。然后我们将看到冰山如何帮助我们大规模扩展。这里学到的经验可以应用于专有数据湖。

数据湖架构

如下图所示,典型的数据湖体系结构有两个主要层。存储层是数据所在的位置,计算层是执行计算和分析操作的位置。

作者图片

对象存储和文件格式—可扩展

数据湖存储由对象存储处理。我们可以通过简单地添加更多的服务器来大规模扩展对象存储。这些容器跨越不同的服务器,使得对象存储具有极大的可伸缩性、弹性以及(几乎)故障安全性。

如今,最受欢迎的对象存储是亚马逊 Web Services 提供的https://aws.amazon.com/pm/serv-s3/?trk=ps_a134p000004f2aOAAQ&trkCampaign=acq_paid_search_brand&sc_channel=PS&sc_campaign=acquisition_US&sc_publisher=Google&sc_category=Storage&sc_country=US&sc_geo=NAMER&sc_outcome=acq&sc_detail=amazon s3&sc_content=S3_e&sc_matchtype=e&sc_segment=488982706716&sc_medium=ACQ-P|PS-GO|Brand|Desktop|SU|Storage|S3|US|EN|Text&s_kwcid=AL!4422!3!488982706716!e!!g!!amazon s3&ef_id=CjwKCAjwyvaJBhBpEiwA8d38vGc_Lr0hi5Jkxq3g1hUxTNsf3NiB8GnWg86miqh-W-xJ0a7rjyl7lhoCssoQAvD_BwE:G:s&s_kwcid=AL!4422!3!488982706716!e!!g!!amazon s3(简单存储服务)和 Hadoop 分布式文件系统【HDFS】。一个扁平的、大规模可扩展的分布式水平架构被用于本地化这些容器和其中的对象。当然,你可以在 GCP、Azure 上找到非常相似的服务。********

阿帕奇拼花阿帕奇 ORC都是常用的文件格式。他们使用列存储文件格式,在分析使用方面,这比基于行的文件格式可伸缩性好得多。这些文件管理系统在读/写操作期间只读取所需的列,这大大加快了读/写速度。****

具有上述对象存储和文件格式系统的存储层如下所示。

作者图片

数据处理—可扩展

计算层管理所有执行命令,包括创建读取更新删除(CRUD)以及执行高级查询和分析计算。它还包含元存储,元存储包含并管理元数据和文件位置等信息,以及需要以事务方式更新的其他信息。

Apache Spark是比较流行的开源数据处理框架之一,因为它可以轻松处理大规模数据集。实验表明 Spark 的处理速度比 Hadoop 快 100 倍。speed 通过缓存数据、在内存中运行计算和执行多线程并行操作来实现其可伸缩性和速度。Spark APIs 允许开源数据湖的许多组件与 Spark 一起工作。

presto SQL,现在更名为Trino,是一个分布式 SQL 查询引擎,旨在对大型数据集进行快速分析。Trino 最初是由脸书在 2013 年开发的。它可以通过单个查询访问和查询来自多个不同数据源的数据,并执行来自 Hadoop 和 S3 等独立存储系统中的表的连接。它使用一个协调器来管理在一个机器集群上运行的一群工人。********

Presto 没有自己的元商店。Presto 协调器需要调用一个元存储来知道文件存储在哪个容器中。在对不同的节点执行查询计划之前,它会生成一个查询计划。尽管 Presto 协调器很有效,但由于其架构,它代表了单点故障和瓶颈。

尽管 Spark 和 Presto 都被用作数据湖的 SQL 接口,但它们的用途不同。Presto 旨在创建和处理大型数据集的大型查询。数据科学家和数据分析师使用它来探索大量数据。另一方面,Spark 主要由数据工程师用于数据准备、处理和转换。由于它们的目的不同,所以它们通常都共存于数据湖环境中。

元商店—不太可扩展

元商店管理系统在大规模扩展时会遇到问题。让我们看看如何。

在开源数据湖中常用的Apache HiveMeta Store 是脸书在 2010 年开发的。Hive 使用关系数据库管理系统(RDBMS)来跟踪表的元数据,比如位置、索引和模式。“RDBMS”不容易扩展到 Pb 级,因此可能成为巨大数据湖的速度瓶颈。Hive 使用 map-reduce,这涉及到在将 SQL 查询发送到正确的容器之前对其进行翻译。当访问大量数据存储时,这会大大降低查询速度。Hive 的另一个缺点是它没有版本控制管理系统。

Nessie比 Hive 更新,规模更大。它使用一个可扩展的后端数据存储,如Amazon DynamoDB来存储元数据。Nessie 提供了一个设计良好的受 Git 启发的数据版本控制系统。它的 API 使它很容易与 Spark、Hive 或 Iceberg 集成。然而,Nessie 数据存储驻留在计算层,它不能像对象存储那样扩展,因此可能成为瓶颈。********

具有上述数据处理、元数据管理和表格格式的数据湖体系结构如下所示。

作者图片

现在,让我们看看 Iceberg 如何克服这些元存储瓶颈。

冰山的关键

Apache Iceberg 是网飞创建的一种表格式规范,用于提高大型数据湖查询的性能。它是 Pb 级数据湖的重要组成部分。Ryan Blue,网飞的 Iceberg 的创造者,解释了他们如何能够将 Atlas 系统的查询规划性能时间从使用 Hive 和 Parquet 的 9.6 分钟减少到使用 Iceberg 的 42 秒。

Iceberg 管理位于对象存储桶中数据旁边的文件中的表定义和信息(文件元数据)。可伸缩性的关键是 Iceberg 元存储可以分布在对象存储中的多个资源上。这为数据湖提供了巨大的元存储可伸缩性,避免了上述驻留在计算级别的其他元存储所造成的瓶颈。冰山表架构的详细描述可以在这里找到。

Iceberg 附带了一组数据处理引擎可以使用的 API 和库。文件仍然使用 Avro、Parquet 或 ORC 等文件格式存储。

Iceberg 不使用传统的基于日期的分片来管理存储桶,而是使用自己的优化规则来提高灵活性和速度。使用 Iceberg 的分片方法极大地优化了历史查询速度。Iceberg 可以与 Nessie 集成进行版本控制管理,并回滚到以前的表、分区和模式布局实例。

Iceberg 提供了 Java 和 Python 两种语言的 SDK。这个 SDK 可以通过 Spark、Presto Flink 和 Hive 访问。即使您选择使用 Iceberg 作为您的表格式,您仍然需要使用 Spark 和/或 Presto 这样的工具来查询 Iceberg。在撰写本文时,Iceberg Python SDK 仅限于读取操作,但是如果您不想直接将应用程序与 Iceberg 集成,您可以随时使用 Spark 甚至 Presto,这可能是一个挑战。

带有冰山文件格式管理组件的新的 Pb 级开源数据湖如下所示。

作者图片

在不久的将来,机器学习平台将在其架构中包括基于 Iceberg 等技术的新数据湖,为数据科学家提供大规模可扩展的数据湖,以实现他们最雄心勃勃的项目。

新的 GitHub 在这里

原文:https://towardsdatascience.com/the-new-github-is-here-d7eb7f3b3cf4?source=collection_archive---------14-----------------------

你应该从 GitHub 宇宙 2020 保留什么

图片由来自 Pixabay 的 Markus Winkler 拍摄

GitHub 拉开了其年度会议虚拟版 GitHub Universe 2020 的序幕。在开场主题演讲中,团队向我们展示了他们如何在内部使用 GitHub 来发布新功能以及即将推出的伟大新产品功能。

这个故事突出了大会最精彩的瞬间。我希望大多数新功能能够提升您在 GitHub 上的个人体验,并且您会在日常工作流程中为它们找到一席之地。所以,事不宜迟,让我们开始吧。

学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!

GitHub 可以说是最受欢迎的 Git 库托管服务。一个代码托管平台,使您能够对您的软件进行版本控制并与其他开发人员协作。

在他们的年度会议上,GitHub 团队展示了他们如何使用该产品和新功能,这些新功能将改变您与团队成员的沟通方式、打开问题、创建拉式请求、监控部署过程等等。让我们一步一步来。

GitHub 讨论

几个月前,GitHub 宣布了讨论,它很快成为一个很好的地方,可以问你问题或与维护你最喜欢的项目的社区聊天。直到最近,它还不是对每个人都可用,但是现在,每个开源社区都可以尝试与新的公共测试版进行讨论。要启用它,请进入您的回购设置并勾选讨论复选框。此外,您可以获得对移动应用程序和许多新的酷功能的原生支持,如可定制的类别。

此外,将讨论转换到 GitHub 问题只需点击一下鼠标。你现在可以建立一个工作流程,在这里你可以在讨论中集思广益,然后计划和跟踪 GitHub 问题中必须完成的工作,这样你就不会切换上下文。

GitHub CLI

GitHub CLI 是在命令行上使用 GitHub 的工具。它将 pull 请求、问题和其他 GitHub 概念带到您已经在使用git和代码的终端旁边。

使用新的 CLI,您可以从命令行起草您的 Pull 请求,就像您编写 Git 提交消息一样。一个新的向导将指导您完成整个过程,比如您想使用哪个分支、标题和拉请求体。然后,您可以讨论该草案,以形成符合社区标准的有效拉请求。

此外,您可以克隆和派生存储库、创建发布、创建和关闭问题、创建 Gists 等等。详细信息,请通读文档。

依赖性审查

假设您已经创建了一个新的 Pull 请求,它需要一系列新的依赖项来支持您的新特性。但是,如果这些依赖关系存在安全问题,会发生什么呢?

为此,GitHub 创建了一个新的依赖审查工具,它被嵌入到拉请求中。该工具自动显示安全漏洞和其他关于添加的依赖项的有用信息。

GitHub 赞助商

如果你的项目很大程度上依赖于一个特定的库,赞助维护它的开发人员会很有好处。

有了 GitHub 赞助商,你可以资助你欣赏和依赖的开源项目,以及做所有工作的开发者。GitHub 赞助商是开源社区的游戏规则改变者,许多开发人员已经能够辞掉工作,将全部时间投入到他们所贡献和热爱的项目中。

为了促进这一过程,公司现在可以通过他们与 GitHub 已经建立的付费关系来赞助项目和开发者。亚马逊和微软等领先公司已经加入 GitHub,支持著名的开源项目。

GitHub 操作

GitHub Actions 是 GitHub 提出的 CI/CD 提案。你几乎可以自动化任何你想要的东西,有了行动市场,你的选择是无限的。

现在,您可以使用新的操作可视化工具来查看操作工作流的进度。在新的 UI 中,您可以确切地看到正在发生什么,哪些步骤并行运行,以及每个步骤的状态。此外,您可以要求对操作工作流进行手动批准,并为受特定规则保护的操作创建环境,并拥有专用机密。

新黑暗主题

最后但同样重要的是,GitHub 不支持黑暗主题,这可能是每个开发者最想要的浅层 UI 特性。关于这个没什么好说的,除了你可以在你的设置菜单里的外观下找到。

GitHub 坚持自己的目标;无论你是开源开发者,在大公司工作,还是刚入门的学生,GitHub 都会帮助你构建令人惊叹的新软件。

关于作者

我叫 Dimitris Poulopoulos ,我是一名为 Arrikto 工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请在 Twitter 上关注我的 Medium 、 LinkedIn 或 @james2pl 。此外,请访问我的网站上的资源页面,这里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

新型车床刨床及其使用方法

原文:https://towardsdatascience.com/the-new-lathe-router-and-how-to-use-it-a39591355d15?source=collection_archive---------26-----------------------

车床 0.2 中实现的新路由器类型的快速教程。

(src =https://pixabay.com/images/id-414415/

介绍

一个谈到机器学习,自动化是一个特别有趣的话题。机器学习本身在很多方面都是一种非常智能的方式,可以利用统计数据来自动化某些计算任务,所以每当我们谈论自动化机器学习时,我们都在谈论自动化。每当我们使用机器学习时,我们都在自动化编写软件来操纵数据。然而,模型总是需要接收数据,并且这些数据通常需要在命中模型之前进行处理,以使其按预期工作。

为了在提供数据作为模型输入之前处理数据,通常使用管道来处理数据并对数据建模。然而,数据的可怕之处在于,它可能是不可预测的,而且往往是肮脏的。为此,除了他们编写的代码之外,数据科学家在任何地方都没有任何方便的工具,而且这项任务通常不是自动完成的。请允许我向您介绍 Lathe.jl 中的新路由器类型,该类型用于处理数据并通过管道路由数据,并且其实现相当酷。

笔记本

路由器基础

仅仅通过分析车床刨床背后的想法,就很容易看出这个问题的解决方案是多么的难以确定。将数据导入适当模型的想法非常抽象。抽象是自动化的杀手,因为一些输入数据可能越抽象,量化输入的所有可能性就越困难。

车床路由器类型通过利用返回和传递的函数来执行将数据定向到其各自模型的行为。这个函数的返回结果按顺序作为参数提供给它下面的对象。就像管线或车床模型是车床对象类型一样,路由器也是。这意味着我们可以将路由器放在管道中,将路由器放入路由器中。这为用不同的数据算法将数据链接在一起并沿链向下传递它们创造了无限的可能性。

这真的很酷,因为它可以让我们从一些输入数据开始,通过路由器管道和后续管道发送数据,这些管道一起工作,以提供一系列预测。因此,随着所有的概念解释的方式,让我们现在尝试路由器类型,并设想它做什么。

建模

为了利用我们的车床路由器,我们将首先需要建立一些车床模型。今天,我将创建两个线性回归模型,这两个模型都将采用不同类型的输入数据。让我们导入这个模型 DataFrames.jl,最后创建一个 dataframe 来保存模型的一些输入数据:

using Lathe.models: LinearRegression
using DataFrames
df = DataFrame(:A => [5, 10, 15, 20, 23, 17, 13, 15], :B => [10, 15, 20, 25, 27, 21, 20, 25],:C => [5, 10, 15, 20, 22, 19, 12, 13])

接下来,我将把我们的目标提取出来作为一个数组。

y = Array(df[!, :A])

现在我们将使用 select!从 x 中删除该列。()和 Not()方法一起放在下面的代码中:

x = select!(df, Not(:A))

现在我们将拟合一个新的线性回归模型,以 x 为特征:

m = LinearRegression(x, y)

现在让我们试着用它来预测:

m.predict(df)

(图片由作者提供)

现在,我们将做完全相同的事情,只是这一次,我们将仅使用数据帧中的单个数组来拟合我们的模型:

m2 = LinearRegression(Array(df[!, :B]), y)

现在我们有了两个模型,重要的是要注意它们之间的区别。由于我们为第一个模型提供了一个 dataframe 作为输入,因此它不能使用数组进行预测。相反的情况适用于第二个模型,它不能使用数据框架进行预测:

(图片由作者提供)

现在,我们将编写一个新的函数,它采用一个可迭代的参数来将数据分成多个返回。请注意,这些返回位置将对应于我们的模型在路由器中的位置。记住,这里可以传递无限多的项,唯一的限制是硬件方面的。从我们的函数开始,在这个实例中,我将为我们的输出定义两个变量:

function filter_X(x)df = nothingarray = nothing

现在,我将简单地循环遍历 x,并使用一个简单的条件语句检查我们正在迭代的值的类型:

for data in xif typeof(data) == DataFramedf = dataelsearray = dataendend

最后一步,我将返回我们的数据并结束函数:

return(array, df)
end

最终结果如下所示:

function filter_X(x)df = nothingarray = nothingfor data in xif typeof(data) == DataFramedf = dataelsearray = dataendendreturn(array, df)
end

请注意返回的位置,这对路由器至关重要,因为路由器使用返回中的位置来知道在运行此函数后将数据放在哪里。我们现在将创建一个新的路由器,使用 fn 关键字参数来表示我们的过滤函数,并传递我们的车床对象。

router = Router(m2, m, fn = filter_X)

现在,我们可以通过路由器的 predict()函数以任意顺序传递这两个模型的可迭代数据。看看这个:

result = router.predict([df[!, :B], x])

这产生了一个包含两个预测数组的新数组,每个预测来自一个模型,请看:

println("First model's prediction (Array): ", result[1], "\n\n")
println("Second model's prediction (DataFrame): ", result[2])

(图片由作者提供)

只是为了好玩,我还评估了两个模型的准确性:

using Lathe.stats: mae, r2
println("First model's mae: ", mae(y, result[1]))
println("Second model's mae: ", mae(y, result[2]))

(图片由作者提供)

println("First model's r2: ", r2(y, result[1]))
println("Second model's r2: ", r2(y, result[2]))

(图片由作者提供)

我还用 Hone.jl 可视化了模型。由于 Hone.jl 停产了这么长时间,这出奇地困难,可能不值得付出努力。不管怎样,我决定参与并做到这一点。由于函数的 dataframe 版本已经分解为时间,我决定只分散一个预测,然后由于 Hone.jl 的模块化方法,我们可以为另一个预测和我们预测的原始 y 添加点。

using Hone: Points, Circle, Scatter
plt = Scatter(df[!, :B], result[1])secondpredpoints = Points(df[!, :B], result[2], shape = Circle(.5, .5, 24, :purple))
plt.add(secondpredpoints)original = Points(df[!, :B], y, shape = Circle(.5, .5, 24, :magenta))
plt.add(original)
plt.show()

(图片由作者提供,洋红色是原始值集,橙色是第一个模型的预测,紫色是第二个模型的预测)

结论

在我看来,这种类型肯定会派上用场的!我认为自动化管理数据和预测建模的整个过程的概念非常棒!我想添加的一个非常重要的特性是能够只传递一条必要的数据,并且仍然将它路由到适当的车床对象。然而,由于路由器概念的抽象,我真的认为这几乎是不可能的。然而,如果可能的话,我可以保证我会在即将发布的车床姜饼之前实现它。如果你想了解我在本文中使用的三个软件包(车床、Hone、DataFrames)中的任何一个,我也会在下面留下它们的 Github 链接。非常感谢您阅读我的文章,我希望您和我一样对此感兴趣!

https://github.com/ChifiSource/Lathe.jl https://github.com/JuliaData/DataFrames.jl https://github.com/ChifiSource/Hone.jl

R 中的新管道和匿名函数语法

原文:https://towardsdatascience.com/the-new-pipe-and-anonymous-function-syntax-in-r-54d98861014c?source=collection_archive---------15-----------------------

它是什么,为什么是现在,它真的重要吗?

照片由米哈尔·马特隆在 Unsplash 拍摄

从 R 版本 4.1.0 开始,发布了一个新的匿名函数语法,它在精神上类似于 Python 众所周知的 Lambda 语法。

匿名函数?什么?

概括地说,在 Python 中有两种编写函数的常用方法。一种方法是定义一个命名函数,如果您需要在许多上下文中重用该函数,这将非常有用。比方说,我想宣布,许多人在许多不同的情况下都很棒。这是一个简单的定义函数。

# define a named function
def is_awesome(name: str) -> str:return name + " is awesome!"# test
is_awesome("Keith")'Keith is awesome!'

自从——实际上是 1994 年,但在数据科学中那是永远——在 Python(和许多其他语言)中也有可能在代码中“一次性”使用的速记函数中写这个——称为 Lambda 函数。λ函数对输入进行运算,而不将函数存储在存储器中,

# lambda function
(lambda x: x + ' is awesome!')('Keith')'Keith is awesome!'

好了,现在这是 R 调了?

是的,以前你只能用完整的函数语法在 R 中编写函数,命名如下:

# named function
is_awesome <- function(x) {paste(x, 'is awesome!')
}# test
is_awesome('Keith')[1] "Keith is awesome!"

或者像这样匿名:

(function (x) {paste(x, 'is awesome!')})('Keith')[1] "Keith is awesome!"

但是现在,从 R 4.1.0 开始,您有了一个新的简写选项:

# new alternative shorthand
(\(x) paste(x, 'is awesome!'))('Keith')[1] "Keith is awesome!"

基本上这可以节省你一点打字的时间。我不确定它是否真的那么重要,但是我想对于一些程序员来说,它可能会节省很多时间。反正我估计也伤不了!

为什么现在发布这个?

更重要的是,既然它在 Python 中一直存在,为什么现在在 R 中发布呢?嗯,这都与 R 4.1.0 中另一个更有新闻价值的发展有关,它是本地管道操作符。

大多数 R 用户都知道管道操作符%>%,它是整洁风格编程的同义词,允许您避免复杂的函数嵌套,并以更线性的操作顺序安排渐进的步骤。例如,代替:

gsub('esome', 'ful', paste('Keith', 'is awesome!'))[1] "Keith is awful!"

您可以使用管道编写等效的操作,如下所示:

library(magrittr)paste('Keith', 'is awesome!') %>%gsub('esome', 'ful', .)[1] "Keith is awful!"

注意,管道在 base R 中不存在,需要通过一个包(通常是magrittrdplyr)来加载。管道在 R 中如此受欢迎,以至于社区长期以来一直呼吁让它成为 base R 中的原生管道。因此,在 R 4.1.0 中引入了一个新的原生管道,与原来的管道共存。

# as of R 4.1.0
tolower('KEITH') |> paste('is grammatically incorrect!')[1] "keith is grammatically incorrect!"

然而原生管道与原始管道不是同一个操作者。一个主要的不同之处在于,本地管道将总是通过管道进入前一个函数的第一个未命名参数。它不接受.语法来允许管道进入任何参数。

# this won't work
paste('Keith', 'is awesome!') |>gsub('esome', 'ful', .)Error in gsub(paste("Keith", "is awesome!"), "esome", "ful", .) : object '.' not found

在这方面,让原生管道以与原始管道相同的方式工作的唯一方法是编写一个函数,其中所需的参数成为第一个(或唯一一个)未命名的参数。预料到这可能意味着开发人员要编写更多的函数,这就是为什么同时发布了匿名函数速记。

paste('Keith', 'is awesome!') |>(\(x) gsub('esome', 'ful', x))()[1] "Keith is awful!"

这真的重要吗?

所有这些都没有真正迫使你改变以前的编程习惯——你仍然可以使用旧的管道和语法。让我们面对现实吧,与仅仅使用完整语法编写匿名函数相比,这种匿名函数语法看起来很混乱。我不相信这会带来巨大的效率或时间节约。鉴于一些人已经声明,他们期望原生管道最终取代 R 中的原始管道,我不确定我是否明白为什么这一定会导致这种情况。

我最近在 Twitter 上做了一个为期一天的快速民意调查,看看自几个月前这个版本发布以来,有多少人真正改变了他们的习惯。结果如下:

最近的推特投票结果

我们都知道习惯的改变需要一段时间。所以也许这就是为什么不到十分之一的人在使用 R 中的这个新功能?或者可能是因为功能没有提供足够的好处来鼓励人们改变?你怎么想呢?

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn 或 Twitter 上找到我。也可以看看我关于drkeithmcnulty.com的博客或者我关于人物分析的 教科书

数据质量的新规则

原文:https://towardsdatascience.com/the-new-rules-of-data-quality-5e4fdecb9618?source=collection_archive---------9-----------------------

引入一种更好的方法,通过测试和可观察性来大规模管理数据质量。

图片由 提供见拍吃重复Shutterstock,可通过作者购买的标准许可证获得。**

这个世界上有两种数据质量问题:你能预测的()和你不能预测的( 未知的 )。以下是一些最优秀的数据团队如何采取更全面的方法来大规模解决这两个问题。**

在过去的几年里,数据团队利用相当于 的单元测试 来检测数据质量问题。2021 年,随着公司接收越来越多的数据,管道变得越来越复杂,这种单点故障方法不再适用。

不要误会我的意思:你应该测试你最重要的数据。 数据测试是捕捉数据管道中出现的特定已知问题的必备工具,有很棒的工具可以帮你做到这一点。由 Fivetran 支持的细分应用程序源和 Salesforce 数据流入您的雪花仓库,然后由 dbt 转换,并最终支持您的首席执行官用于季度财务报告的 Looker 仪表板?测试吧。

尽管如此,即使有了自动化测试,随着数据生态系统的增长和数据的演变,继续更新现有的测试和阈值、编写新的测试和阈值,以及放弃旧的测试和阈值,仍然需要大量的提升。随着时间的推移,这个过程变得乏味、耗时,并导致更多的技术债务需要你以后偿还。

一家电子商务公司的客户——我们称她为 Rebecca——告诉我们,她的数据工程团队过去完全依赖自定义测试来发现最关键管道中的数据问题……直到他们没有这样做。

丽贝卡和她的团队通过测试让他们的管道经受了考验,但这一切只需要一个未知的未知(在这种情况下,是一个分布异常)就能让公司陷入混乱。他们在无法处理的交易上损失了收入,她的主管也失去了对数据的信任。

她的团队可以追踪已知的未知情况(例如,我们知道这可能是一个问题,所以让我们测试一下),但是他们没有一个全面的方法来说明未知的未知情况。

你的数据管道中未知的未知

未知的未知(即,你无法预测的数据质量问题)通常不会暴露出来,直到它们影响到下游系统——而那时,对你的业务的损害可能已经造成了。图片由 万众耶稣会士

未知的未知是指 数据停机 即使是最全面的测试也无法解释的问题,这些问题出现在整个数据管道中,而不仅仅是特定测试所涵盖的部分。未知的未知可能包括:

  • ****一个关键领域的分布异常导致你的 Tableau 仪表盘失灵
  • ****另一个团队进行的 JSON 模式更改将 6 列变成了 600 列
  • 对 ETL (或者反向 ETL ,如果你喜欢的话)的一个非预期的改变导致测试不能运行和错误数据丢失
  • 不完整或陈旧的数据直到几周后才被发现,影响了关键的营销指标
  • ****导致 API 停止收集数据的代码更改为重要的新产品提供数据
  • ****数据随时间漂移可能很难捕捉,特别是如果您的测试只关注 ETL 作业时写入的数据,这通常不会考虑已经在给定表中的数据

这仅仅触及了表面。那么,团队如何防止这些未知的未知破坏他们原本完美的管道呢?对大多数人来说,把这些问题分成两个截然不同的类别会有所帮助。

两种类型的数据质量问题

如果数据测试可以涵盖你知道的可能会发生在我们数据上的事情,我们需要一种方法来监控和警告我们不知道的可能会发生在你数据上的事情(我们未知的未知)。

  • ****容易预测的数据质量问题。对于这些已知的未知,自动化数据测试和手动阈值设置应该覆盖您的基础。
  • ****不容易预测的数据质量问题。这些都是你未知的未知。随着数据管道变得越来越复杂,这个数字只会越来越大。

同样,应用工程团队并不专门使用单元和集成测试来捕捉有问题的代码,数据工程团队需要采取类似的方法,将 数据可观察性 作为他们堆栈的关键组件。

简介:数据质量的新方法

就像软件一样,数据需要测试和可观察性来确保一致的可靠性。事实上,现代数据团队必须将数据视为一个动态的、不断变化的实体,并且不仅应用于严格的测试,还应用于持续的可观察性。考虑到数百万种可能破坏数据的方式(或者,未知的未知),我们可以使用相同的 DevOps 原则来涵盖这些边缘情况。

数据可观察性通过自动监控和 ML 生成的规则帮助您捕捉未知的未知,扩展数据堆栈的 QA 覆盖范围,并消除手动阈值设置的需要。图片由作者提供。

对大多数人来说,一个强大而全面的数据可观测性方法包括:

  • ****元数据聚合&编目。如果你不知道你有什么数据,你当然不会知道它是否有用。数据目录通常被整合到最佳的数据可观察性平台中,为您的数据生态系统提供了一个集中的、透明的视角,在一个视图中展示丰富的谱系、模式、历史更改、新鲜度、数量、用户、查询等。
  • ****自动监控&数据问题报警。出色的数据可观察性方法将确保您是第一个知道并解决数据问题的人,使您能够在数据停机发生时立即解决其影响,而不是几个月后。最重要的是,这种解决方案需要最少的配置,而且几乎不需要设置阈值。
  • ****沿袭追踪上下游的从属关系。强大的端到端沿袭使数据团队能够跟踪从 A(接收)到 Z(分析)的数据流,并在流程中纳入转换、建模和其他步骤。
  • ****既自定义&自动生成规则。大多数数据团队需要一种两全其美的方法:使用机器学习来根据历史行为识别数据中的异常,并能够根据数据的规格设置独特的规则。与编码到建模工作流或 SQL 包装器中的特殊查询不同,这种监控不会停留在“表 R 中的字段 T 的值今天低于 S”上
  • 数据分析师、数据工程师和数据科学家之间的协作。 数据团队应该能够轻松快速地协作解决问题,制定新规则,并更好地了解数据的健康状况。

每个数据团队都是不同的,但我们发现这种测试和可观察性的方法既能处理您最可能的数据问题,也能处理数百万其他导致数据管道中断的原因。

说到底,我们能抓住的已知未知未知未知越多越好。

我们很想知道这种方法是否能引起你的共鸣!伸出手去 弗朗西斯科斯科特 以及蒙特卡洛团队的其他人。

本文由 Francisco Alberini 和 Scott O’Leary 共同撰写。

合成数据的新进展

原文:https://towardsdatascience.com/the-new-step-forward-in-synthetic-data-dc854319166d?source=collection_archive---------28-----------------------

如何使用 GANs 改进您的数据

照片由 Unsplash 上的西提·拉赫马纳·马特·达乌德拍摄

在您的数据科学职业生涯中,您迟早会遇到一个问题,其中一个事件(通常是您试图预测的事件)比另一个或其他事件发生的频率低。

毕竟现实就是这样——车祸或者有疾病的人更稀缺(谢天谢地!)比汽车或健康人完成的轨迹。

这类问题被归类为不平衡数据。而且,虽然没有一个数字来定义它,但是当你的类分布是偏斜的时候,你知道你的数据是不平衡的。

此时你可能会想,如果我的数据代表现实,那么这是一件好事。嗯,你的机器学习(ML)算法不敢苟同。

我不打算深究与不平衡分类相关的问题的细节(如果你想了解更多这个特定的主题,你可以在这里阅读)但是请耐心听我说一会儿:

想象一下,你的 ML 算法需要“看到”健康患者 1000 次才能识别出什么是健康患者,不健康患者和健康患者的比例是 1:1000。但是你希望它也能识别疾病患者,所以你也需要“喂”他 1000 个不健康的患者。这意味着您实际上需要有一个包含 1000000 名患者的数据库,以便您的 ML 算法有足够的信息来识别这两种类型的患者。

旁注:这仅仅是一个例子,在引擎盖下事情并不完全是那样发生的。

我敢打赌,现在你已经开始明白这个问题是如何迅速扩大的了。

值得庆幸的是,我们最亲爱的统计学家朋友们已经找到了帮助我们解决这个问题的方法。

事实上,自 20 世纪 30 年代以来,已经出现了几种方法,每种方法都有自己的用例,从排列测试到 bootstrap,有很多选项。

如果你不是数据科学的新手,你可能已经在模型训练过程中应用了一些重采样技术,比如交叉验证。

自举是当今最常见的方式之一,它包括:

bootstrap 背后的想法很简单:如果我们用替换数据中的重新采样点,我们可以将重新采样的数据集视为我们在平行宇宙中收集的新数据集。

— 马诺吉特·南迪

为此,我们需要:

假设每个观察值都是从总体中随机选取的。换句话说,任何观察都同样可能被选择,并且它的选择是独立的。

— 影响点

这取决于特定的自举方法。

然而,这可能会导致重复的值,这在这个视频中有所解释。

由于我们正在尝试添加更多少数类的示例,毕竟我们已经有了足够多的多数类,重复值不会给模型带来额外的信息。

那么如果我们能合成新的例子呢?

这正是 SMOTE,合成少数过采样技术的首字母缩写,所做的。

SMOTE 可能是最广泛使用的合成新示例的方法,它利用 KNN 聚类算法来:

选择特征空间中接近的示例,在特征空间中的示例之间画一条线,并在沿着该线的一点处画一个新的样本。

— 杰森·布朗利

然而,在生成新数据时,我们只查看少数类,这意味着我们否决了多数类可能产生的影响,如果存在类的重叠,最终可能会产生模糊的示例。

不仅如此,由于我们正在使用聚类,维度和变量类型可能会成为一个问题,这增加了准备步骤的难度,以实现良好的结果。

可以找到以某种方式解决这些问题的几种变体(我建议看一看 scikit-learn 文档以更好地理解如何处理这些问题),但是它们都有一个共同点,它们都做出假设。

如果您可以在没有任何假设的情况下生成新数据,会怎么样?

这就是最新技术发挥作用的地方:生成对抗网络,或简称 GANs。

如果你从未听说过它们,请花时间在这里查看它们是什么。

但是如果你时间不够,或者只是想简单地自己看看 GANs 能做什么(如果你只是停下来看视频:是的,你刚刚看到了不存在的人)。

令人震惊吧。

但是,我在这里要告诉你的不是 GANs 是什么,而是它们如何为你产生新的数据(毕竟图像只是数据)!

因为它们抽象了假设部分,因为它们是不受监督的,所以它们能够检测新的看不见的模式,从而在生成的数据中增加了更大的可变性。同时能够处理更大的规模。

不仅如此,它们还允许在数据准备步骤中有更大的自由度,因为它们有相当多的不同架构可以适应您自己的用例。

好了,现在你可能会问自己,我该如何使用它们呢?

好吧,让我们从:

pip install ydata-synthetic

没错,我们来自 Ydata 的亲爱的朋友在 Github 上发布了一个开源工具来帮助你实现这一点。

不仅如此,他们还在 Slack 上添加了一个合成数据社区,在那里你可以谈论这个话题,并提出关于这个工具的问题。

安装后,您可以选择更适合您的数据的架构,并开始享受乐趣:

使用定时器的示例创建要点

瞧,你有了新的数据可以处理,最终有了一个平衡的数据集可以“输入”到你的 ML 算法中。

因此,每当你面临数据不平衡的情况时,停下来想一想哪种解决方案更适合你的需求,然后着手平衡它。

您必须记住,生成合成数据并不是不平衡数据的神奇解决方案:

如果目标类不平衡,但仍有足够的代表性,重采样可以提高模型性能。在这种情况下,问题真的是缺乏数据。重采样随后会导致过拟合或欠拟合,而不是更好的模型性能。

— 玛莉亚·威德曼

最后,要知道它的极限和用途,小心负责地使用它。

如果你想讨论或了解更多关于这个话题,我强烈推荐你加入合成数据社区。

页(page 的缩写)S: Ydata 所有者允许我在本文中使用他们的例子。

其他来源:

  1. 重采样方法。

分析数据建模回顾中的新“统一星型模式”范例

原文:https://towardsdatascience.com/the-new-unified-star-schema-paradigm-in-analytics-data-modeling-review-a245b2641dc8?source=collection_archive---------3-----------------------

意见

由 F. Puppini 发明,B. Inmon 推广,它自称是自助式商务智能的一次革命

介绍

最近我偶然看到了比尔·恩门和弗朗切斯科·普皮尼的新书,书名是《统一星形模式》(以下简称 USS downstream)。数据仓库之父的新书《2020》绝对吸引了我的注意力,我买了它,并在接下来的 3 天里满怀热情地阅读了它。原来这个概念的作者是弗朗切斯科·普皮尼,比尔·恩门是它的支持者和推动者,但这并没有真正削弱一种建模和组织数据的新方法的价值。

一开始,我真的很怀疑。替代传统的维度模型,被几十年证明并没有让我感觉良好。但是这本书向我打开了数据模型视图的新视角。现在,我相信它不是传统维度建模的替代品(尽管作者声称它是),而是对它的丰富。所以我们简单回顾一下。

美国军舰进场审查

关系哲学的转变

在高层次上,作者提出了用于管理分析数据库中实体之间的连接(关系)的巧妙简单的方法:代替具有相互关系的网络,引入超级交换机并通过它管理所有连接:

图片来源于美国军舰书。底部的链接

如果我们将这种说法转化为数据仓库数据模型,这将意味着用一个超级星来代替 galaxy 模式(通过一致的维度连接的一组星型模式),其中所有的表(事实和维度)都通过一个称为 Bridge(由作者命名)或 Puppini Bridge(由 Inmon 命名;我比较喜欢,所以会用:)喜欢上下图:

作者图片

Puppini 桥严格用于连接彼此之间的表,它没有商业价值,建议对最终客户隐藏。

普皮尼桥是如何建造的

神奇的桌子是如何建造的?这不是一件小事,让我们来看看。

有一个先决条件:数据仓库中的每个表都应该有一个建立在单个列上的主键。建议遵循命名约定:使用前缀_KEY_ 后跟表名。

Puppini 桥表是一个类似矩阵的表,其中

  • —每个数据仓库表(事实或维度)的主键列表,外加一个名为Stage的额外列。所以列数等于数据仓库中的表数(维度和事实)加 1。
  • —所有数据仓库表的union all操作的结果,这些数据仓库表只包含键列。因此,桥表中的行数是数据仓库中所有记录的总和(事实和维度)。

为了填充桥接表,我们需要将流程分成几个阶段,每个阶段从一个数据仓库表中加载数据。对于每个表,我们需要将 Stage 列值设置为等于数据仓库表名和 load:

  • 数据仓库表的主键
  • 所有外键到其他数据仓库表;直接外键和派生外键

对于上面的示例,事实表和维度表之间的初始关系将导致以下 Puppini 桥实现(暗红色单元格包含派生的外键):

作者图片

有了这样一个中间桥表,我们就可以使用适当的键列连接任意两个数据仓库表。例如,要按产品类别对销售订单和销售预测金额进行分组并合并结果,我们需要使用 Puppini 桥表进行左连接,如下所示:

**select** pc.CategoryName,sum(so.SalesAmount),sum(sf.ForecastedAmount) **from** _PuppiniBridge pb**left join** SalesOrders so **on** pb._KEY_SalesOrders = so._KEY_SalesOrders**left join** SalesForecast sf **on** pb._KEY_SalesForecast = sf._KEY_SalesForecast**left join** ProductCategory pc**on** pc._KEY_ProductCategory = pc._KEY_ProductCategory**group** **by**pc.CategoryName

USS 的主要优势

整本“统一星型模式”书都是围绕自助 BI 中 USS 的好处展开的。自助 BI 意味着数据分析师和业务代表可以在任何现代 BI 平台(如 Tableau、Qlik View/Qlik Sense、Tibco SpotFire、MS PowerBI)中探索和发现数据。

galaxy 模式总是包含循环连接(除非它不是一个微不足道的连接),这会导致歧义。这就是为什么 BI 平台限制了表之间相互连接的可能性,以避免循环,这导致了数据探索可能性的限制或数据模型方面工作区的必要性。

将 galaxy 模式转换成 USS 模式,这是一个简单的 star 模式,消除了 BI 平台带来的一系列限制。

USS 模式有助于解决以下挑战:

  • 循环
  • 风扇疏水阀
  • 深渊陷阱
  • 不一致的粒度联接

对这些挑战的详细解释,以及书中的详细描述和示例。

美国军舰的另一边

除了自助 BI,还有数据仓库数据消费场景的其他方面,所以让我们试着从另一个角度来看 USS。

非功能性问题

可量测性

我对 USS 的主要关注是连接操作的效率和方法的可伸缩性。

由于 Puppini 桥表是所有数据仓库表(包括事实表)的超集,所以它将是一个大表。因此,在查询至少一个事实表的情况下,我们将总是在两个大表之间连接(与事实表桥接),这对关系数据库来说总是一个挑战。我们可以考虑用 merge join 来优化它,但是很可能这是不可能的,因为一个事实表的排序不适用于另一个事实表,等等。

类似的挑战与集群部署的数据分布有关。如果我们根据某个规则分布一个大的事实表,我们将不能对 Puppini 桥表应用相同的规则。即使我们可以对一个事实表这样做,我们也不能对另一个事实表这样做。因此,这导致了对 _Puppini_Bridge 和数据库集群上的其他大型事实表之间的连接效率的关注。

模式扩展

模式扩展一直是数据仓库解决方案中非常具有挑战性的一个方面。

当我们在数据仓库中引入一个新的主题领域或者一组新的业务流程时,以传统的方式——我们引入一组新的表(一组新的星型模式)。

就美国军舰而言,除此之外,我们还需要在驾驶台上执行非常沉重的提升操作:

  • 通过添加一个带有适当键列的新列列表来修改
  • 用正确的连接信息回填

因此,在大型数据仓库的情况下,这往往是一个非常繁重的操作。

功能问题

如果要跳出自助 BI,考虑预定义的报告或数据科学家的数据探索活动,使用内部连接将事实表直接连接到相关维度表会更自然、更合理、更容易,从而避免了到桥表的左(或右)连接。

即使需要将两个事实表相互连接,一个有经验的数据工程师会比通过桥接表更有效地完成这项工作。在这种情况下,将是 2 个大表连接,而不是 3 个大表连接。

美国军舰的位置

在我看来,USS 确实是自助 BI 的一个出色的解决方案。一旦构建了 Puppini 桥表,数据分析师和业务用户就可以在 BI 平台上工作,专注于洞察力而不是数据连接挑战,从而避免许多可能的陷阱。

在数据消费的其他领域,这似乎不是那么有益,并且增加了维护工作。

免费选项

在我看来,除了传统的维度数据模型之外,还可以使用 USS 方法及其 Puppini 桥,作为自助 BI 的一大优势。

只要所有事实和维度表都有一个基于一列的主键,这实际上是维度建模中的最佳实践之一,就可以实现 Puppini 桥表并将其用于自助 BI。

结论

我尽最大努力简要回顾了这一方法。USS 是一种真正新的、有趣的、尚未被业界证明的构建分析的方式。整个想法非常有趣,真的值得评价。如果您构建了一个自助式 BI 解决方案,它绝对值得一试。

它受到比尔·恩门的祝福,所以它应该活下来:)

参考

这本书和播客的链接可以在下面找到:

机器学习进化的下一步:图形神经网络

原文:https://towardsdatascience.com/the-next-step-in-machine-learnings-evolution-graph-neural-networks-fdf16b8df85a?source=collection_archive---------27-----------------------

鲍勃·奥西阿斯在 Unsplash 上拍摄的照片

如果你有多维网络数据集,考虑一个图形神经网络

从任务关键型机器学习部署中持续获得企业价值的能力取决于以下三种应用中的至少一种:分类实体、预测事件和理解事件发生的原因。

无论使用哪种技术,无论是包括监督、非监督还是强化学习,或者如果涉及深度学习的规模和计算,传统的机器学习在解决这些业务问题方面都有局限性。

它适用于许多类型的数据,但在应用于高维网络数据集时会遇到困难和彻底失败。这些限制要求社交网络研究、推荐引擎、生物学、化学、计算机视觉和自然语言处理部署采用一种新的方法,其中上下文至关重要。

图形神经网络擅长预测事件,解释事件,并对实体进行大规模分类,从而为这些和其他实用部署提供惊人的准确性。将他们的推理与语义推理相结合,创建了额外的知识,用于基于高维度数据中的多方面、情境化的关系来预测事件。

无论是用于反洗钱、疾病预测还是电子商务产品推荐,它都大大提高了机器学习执行前面提到的任务的能力,因此企业用户可以利用这项技术。

机器学习的问题

典型的机器学习部署的问题是,它们只能在欧几里德数据集或容易转换为数字的低维数据上工作良好。这些数字(称为向量)描述了一系列情况的特征,从消费者行为到用于面部识别的眼睛和鼻子之间的距离。例如,特征向量通知完成准确检测对象的预测,而不管它们在屏幕上的什么位置,使用什么类型的照明,或者它们的大小。

然而,这种方法的有效性在具有两个以上维度的非欧几里德数据集上迅速下降,在这些数据集上,底层上下文对于表示用于计算的真实世界的实体是至关重要的。例如,对于金融中的“了解你的客户”用例,很难根据客户在网络中的朋友和敌人(以及这些人的朋友和敌人)对客户进行分类,因为这些数据不容易矢量化。向量中的每个数字都依赖于图形的其他部分,这使得这种方法过于复杂——但对于图形神经网络来说并非如此。

图形神经网络

在前面的例子或任何其他情况下,情况的背景——如开发药物时化学品之间的关系——影响机器学习模型中表示的数据,图形神经网络完成三项任务。它们通过确定一个实体是否应该与另一个实体(人、业务对象等)有另一个链接来预测关系。),他们迅速对节点的类型进行分类,并在复杂的图形中精确定位形状或聚类以检测子图。

这些神经网络的大多数应用都结合了所有这三种能力,尽管它们的预测能力很容易在推荐产品、服务甚至回答客户服务问题等用例中给人留下最深刻的印象。他们还擅长预测与反洗钱和其他金融服务法规相关的行动,或预测人们对社交网络中不同事件或行动的反应。

可扩展的上下文化

这些用例中的最后一个最令人印象深刻,不仅因为图形神经网络的预测准确性,还因为它们实现这些结果的环境规模。这里描述了的一个有趣的应用领域:根据报纸上记录的一年内的所有世界事件来训练这些模型。这一特定任务包括关于 23,000 个不同实体(包括国家、政府、机构等)的 400,000 个事实和超过 250 种事件类型,如发表声明、发起攻击、威胁或杀人等。

图形神经网络可以分析大规模新闻数据的背景,识别实体及其相互之间的多方面关系,例如,根据过去 10 个月发生的一切,发布关于总统将威胁谁以及他将向谁寻求帮助的准确预测。预测基于以前的事件和所需的时间戳。

令人印象深刻的含义

这种方法的含义可以为关键任务流程的机器学习的企业应用带来革命性的变化。几乎任何事情都是可能的,从通过分析患者的医疗过去(和现在)来快速评估他或她的医疗未来,到为一批资产预测工业互联网中设备故障的准确时间和地点。例如,在市场营销中,图形神经网络可以准确地揭示哪些策略可能在特定的客户群中产生最多的转换,同时为销售和电子商务应用程序带来同样的优势。

图形神经网络对事件之间的上下文的无与伦比的理解是揭示未来将发生什么的蓝图,其上下文化和准确性超越了传统的机器学习。

NFL 模拟:蒙特卡罗方法

原文:https://towardsdatascience.com/the-nfl-simulation-monte-carlo-methods-2f110424b1dd?source=collection_archive---------10-----------------------

MATLAB 中蒙特卡罗方法在 2021 年 NFL 赛季中的应用

简介:

随着 2021 年 NFL 赛季的开始,我认为没有比现在更好的时间来设计一个模拟 2021 赛季的程序了。

我选择使用蒙特卡罗方法,以允许在模拟过程中游戏之间的一些变化。如果球队的排名在一个赛季中保持不变,它不会让球队在几场大胜中获得动力。它也不允许收视率根据淡季因素进行调整,因为淡季因素无法在两季之间量化。也就是说,接下来是我如何制作程序,以及模拟的结果。

工作原理:

每个队都有上个赛季的评分,这些评分可以用来确定一个队在某场比赛中获胜、失败或打平的机会。下面的代码是如何确定这些概率的,只使用两个队的评分,还有一个额外的主场优势。

Ha = 1/(1+10^((team_data(home_schedule(i),1) - team_data(away_schedule(i),1) + 2.5) * -1/400)); % approx home team chance of winningAa = 1/(1+10^((-1 * team_data(home_schedule(i),1) + team_data(away_schedule(i),1)) * -1/400)); % approx away team chance of winningT = Ha + Aa - 1; % chance of a tieH = Ha - T; % adjusted home team winning chancesA = Aa - T; % adjusted away team winning chances

在每一场比赛后,球队的评级会根据他们获胜的几率和实际结果进行调整。如果一个胜算大的队伍输了,那么他们的评分会比胜算小的队伍降的多。下面是实现这一点的代码:

team_data(home_schedule(i),1) = team_data(home_schedule(i),1) + 20 * (HW - H); % adjusts home team's ranking based on resultteam_data(away_schedule(i),1) = team_data(away_schedule(i),1) + 20 * (AW - A); % adjusts away team's ranking based on result

赛季中的每场比赛都是模拟的,所有 32 支球队的记录都被跟踪。在 272 场比赛之后(每队 17 场),季后赛必须开始了。NFL 季后赛从每个联盟中抽取 7 支球队,头号种子在第一轮比赛中胜出。每个会议中所有 4 个组别的获胜者由最高获胜百分比决定,然后最后 3 个是由接下来 3 个最高获胜百分比决定的通配符。从那里开始,每轮比赛结束后,进行补种。头号种子在超级碗之前获得主场优势,因为那场比赛是在中立地点进行的。下面是让季后赛发生的一部分代码:

index = 0; % used to jump between divisions (index = 0,4,8,12)nfc_leaders = zeros(1,4); % initializes nfc division leaders arraynfc_scores = zeros(1,4); % initializes nfc division leader ratings arrayfor i = 1:4 % for all 4 needed division winnersfor j = 1:4 % for all 4 teams in each divisionif max(team_data(1 + index:4 + index, 5)) == team_data(j + index,5) % if that team has the max win percentage in the divisionteam_data(j + index, 6) = 2; % set the indicator equal to "2"nfc_leaders(i) = j + index; % add team to nfc_leader arraynfc_scores(i) = team_data(j + index,5); % add it's rating into this arrayindex = index + 4; % jumps to next set of 4 teams in next divisionbreakendendend

进入季后赛、赢得分区赛、赢得联盟半决赛、赢得联盟冠军或赢得超级碗的球队在重复赛季的过程中被跟踪,以找到每个球队进入季后赛一定长度的几率。下面是实现这一部分的部分代码:

for i = 1:7 % for all 7 conference teams in the playoffsfor j = 1:32 % check all 32 teamsif nfc_playoffs(i) == j % if that team made the playoffssuccess_data(j,1) = success_data(j,1) + 1; % add 1 to that data point in team matrixendif afc_playoffs(i) == j % same for afcsuccess_data(j,1) = success_data(j,1) + 1; % same for afcendendend

结果:

在模拟了 2021 年 NFL 赛季 100,000 次后,我发现了每个球队进入季后赛、赢得分区冠军、赢得季后赛第一轮、赢得联盟半决赛、赢得联盟冠军和赢得超级碗的比率。队伍按当前评分从高到低的顺序排列在左侧。

图片由作者提供

当想知道一支球队赢得了多少次超级碗时,使用一个像 100,000 这样的好整数来表示模拟量会有所帮助。海盗队赢得了所有 100,000 场超级碗的 19.898%,或 100,000 场模拟中的 19,898 次。另一方面,底特律雄狮队在 10 万场超级碗比赛中只赢了 3 场(0.003%)。

在“赢得部门”一栏中,有趣的是,除了 4 个主要异常值之外,较低的评级意味着赢得部门的机会较低。NFC 东区的这 4 支球队都有接近的评级,这意味着他们都有很好的机会赢得该部门。说到部门,下面是每个部门的分类。

图片由作者提供

绿色突出显示的团队最有可能赢得该部门,而蓝色突出显示的团队最有可能是通配符。总的来说,NFC 西区和 AFC 北区似乎是最强的赛区,每个赛区都有 3 个通配符中的 2 个。

我当时对一个球队的胜率如何影响他们在季后赛中的表现很感兴趣,所以下面显示了 3 个不同的散点图。蓝点是 NFC 中的球队,红点是 AFC 中的球队。

图片由作者提供

图的右上角显示了 NFC 和 AFC 之间的微小差异。在那个区域,胜率大致相同的蓝点比红点有更高的季后赛机会,这表明 NFC 比 AFC 更容易进入季后赛。

图片由作者提供

这张图显示了每支队伍赢得分组的机会。在图的左下角有 4 个蓝点属于 NFC 东部团队。这些球队可以有更低的胜率,但仍然有很大的机会赢得分区冠军,因为所有 4 支球队的排名都很接近。

图片由作者提供

对于这最后的情节,每个队赢得超级碗的机会被显示。它表明,常规赛胜率在 0.700 以上的球队在看待超级碗胜率时具有显著优势。

结论:

2021 年 NFL 赛季模拟发现了一些有趣的结果。它揭示了本赛季的分区最爱,也提供了一些关于哪些球队更容易进入超级碗的见解。这种模拟可以在每周更新,以积极反映每支球队新的季后赛机会,所以我接下来可能会采取的一些措施是每周查看个人比赛,以找到最大的冷门,或者可能哪些比赛对改变季后赛席位机会最重要。

使用 Docker 部署 ML 模型的好方法

原文:https://towardsdatascience.com/the-nice-way-to-deploy-an-ml-model-using-docker-91995f072fe8?source=collection_archive---------3-----------------------

使用 FastAPI 部署 ML 模型并在 VSCode 中轻松封装它的快速指南。

在 Unsplash 上由 Toa Heftiba 拍摄的照片

当由团队中的不同开发人员构建和运行 ML 项目时,存在与 ML 项目相关的挑战。有时,依赖项可能会不匹配,给同一个项目中的其他依赖库带来麻烦。此外,如果你提供一个必须以特定方式执行的项目,你还需要有一个清晰的每一步的文档。

通过使用 Docker,所有这些都可以变得更加容易和快捷。有了容器化,你可以节省很多时间,有助于从长远来看平滑你的应用程序的部署过程。

如果您正在寻找一个包含为您的项目手动构建和运行 docker 映像的完整步骤的指南,您可以在本文中找到它:

https://pub.towardsai.net/how-to-dockerize-your-data-science-project-a-quick-guide-b6fa2d6a8ba1

然而,在本教程中,我将介绍一个更简单的过程来简化 Docker 开发,这个过程完全可以在 VSCode 本身的帮助下完成。

让我们回顾一下构建模型的每一步,然后是 API,最后是 dockerizing。👇

构建我们的 ML 模型

我们将使用 Spacy 来构建一个简单的情感分类器,它为传递给它的任何一段文本输出两个结果:

极性 —它是一个位于[-1,1]范围内的浮点数,其中 1 表示完全肯定的陈述,而-1 表示完全否定的陈述。

主观性主观句一般指个人观点、情感或判断,而客观则指事实信息。它是一个位于[0,1]范围内的浮点数。

现在,让我们安装一些包来开始我们的开发:

pipenv shell # make a new virtual environmentpipenv install pydantic fastapi uvicorn spacy spacytextblob # the packages to install

现在,将 cd 放到项目中,并制作一个名为“model.py”的新文件。

让我们填写该文件的代码:

import spacyfrom spacytextblob.spacytextblob import SpacyTextBlobfrom pydantic import BaseModel class SentimentQueryModel(BaseModel): text : strclass SentimentModel:def get_sentiment(self, text): nlp = spacy.load('en_core_web_sm') nlp.add_pipe("spacytextblob") doc = nlp(text) polarity = doc._.polarity subjectivity = doc._.subjectivity return polarity, subjectivity

我们使用sentitenquerymodel来包含我们对这个模型的唯一查询——我们将为其预测情感的文本,以及sentitenmodel作为加载 spacy tokeniser 和 spacytextblob 库并为我们的给定文本执行情感预测的类。

我们现在将进入下一步,构建我们的 API。

制作 API

FastAPI 是一种更新、更好的方法,可以将您的机器学习模型部署为 REST API,以便在您的 web 应用程序中使用。

让我们在一个名为“main.py”的新文件中使用我们的“model.py ”,并用它构建一个 REST API:

import uvicornfrom fastapi import FastAPIfrom model import SentimentModel, SentimentQueryModelapp = FastAPI()model = SentimentModel() @app.post('/predict') def predict(data: SentimentQueryModel): data = data.dict() polarity, subjectivity = model.get_sentiment(data['text']) return { 'polarity': polarity, 'subjectivity': subjectivity }if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=8000)

这个 API 现在将在本地主机端口 8000 上运行,我们将通过在终端中运行来验证这一点:

python main.py

您将看到输出:

按作者排序的图像—运行 FastAPI 的终端输出

如果您导航到 localhost:8000/docs ,您将能够在浏览器本身中查看和测试 API!这不是很棒吗?

但是现在我们有了模型和 API,我们终于可以继续用它来制作 Docker 容器了!

用码头工人集装箱化

确保您的 VSCode 中安装了 Docker by Microsoft 扩展。接下来,在你的机器上启动 Docker Desktop。

现在,进入 VSCode,输入:Command + Shift + P,调出命令面板。输入“添加 Docker 文件”,你将得到一个选项来添加 Docker 文件到你的项目中。这一流程大大简化了我们的整个工作流程。

按照说明操作,保持端口号为 8080 。不要忘记端口 8000 是用于我们的 API 本身,所以我们需要一个不同的 Docker 来运行!

现在,只需右键单击侧边栏中的 Dockerfile 并选择“构建图像”。

按作者分类的图像——构建 docker 图像

在构建映像时,您将开始在终端中看到输出。

接下来,您可以切换到 VSCode 侧栏上的 Docker 选项卡。

在这里,您将看到系统中已有的图像列表。我们刚刚构建的新图像也将在这里显示如下:

按作者分类的图像—展示构建的 docker 图像

现在你只需要右击图像名称下的“最新,选择运行选项。

您可以通过右键单击构建的容器并单击“查看日志”选项来查看启动日志。

现在,当您导航到 localhost:8000/docs 时,您将看到以下屏幕:

按作者排序的图片— API docs +在浏览器中执行!

您只需单击“Execute ”,这将产生如下输出:

按作者分类的图像— API 输出响应

几句临别赠言…

所以,现在你有了它——从 ML 模型制作一个 API 并使用 Docker 将其容器化的完整管道!

正如您现在可能已经理解的那样,VSCode 使得任何对 Docker 了解不多的人都可以非常容易地在一个容器中快速启动他们的项目。我希望这篇初学者教程有助于您熟悉使用 Docker 部署 ML 模型。

也请查看这篇关于在模型部署过程中要避免的常见错误的文章!

将来,我会回来制作一些更复杂的模型,并用 Docker 将它们打包。所以跟我来留在圈子里!

成为一名中等会员,从不错过我每周发表的任何一篇数据科学文章。 在此加入👇

https://ipom.medium.com/membership/

和我联系吧!

在推特上关注我。
订阅我的数据科学刊物。
查看我所有数据科学文章的完整代码库!

我的另外几篇文章你可能会感兴趣:

管理数据科学工作流的好方法

原文:https://towardsdatascience.com/the-nice-way-to-manage-your-data-science-workflow-7fb92a2ee4a2?source=collection_archive---------18-----------------------

在初学者示例中学习使用 Prefect 构建 ETL 管道

简·帕拉什在 Unsplash 上的照片

作为数据科学家,我们对自己的工作深感自豪。我们试图编写良好的模块化代码,并进行日志记录和测试,以确保我们的代码按预期工作。但不幸的是,数据的提取转换加载的完美流水线并不存在,无论我们投入了多少精力去设计它。

其实写好代码有时候和它运行不流畅没有关系。有些因素甚至是我们训练有素的眼睛看不见的,要花相当多的时间和精力去捕捉它们。

那么,如果我告诉你有一种方法可以确保你能看到哪里出错了,万一出错了呢?有一个完美的工具,当你的代码运行良好时,它是不可见的,只有当你的代码不能按预期运行时,它才是可见的。

如果我说有一个工具可以帮助你确保你的代码成功失败呢?

欢迎来到 提督 世界。

完美帮助你熟练和透明地处理工作流程管理。它是一个结合了各种特性的工具,以确保您的代码拥有成功执行或失败所需的一切。

在这篇文章中,我讨论了学习如何使用 Prefect 和构建一个简单的 ETL 管道的一些基本概念。

我们开始吧👇

安装提督和一些简单的定义

提督可以简单地用 pip 安装:

pip install prefect # please do it inside a virtual environment

我们还需要这个教程的请求熊猫库。安装简单:

pip install requests pandas # also inside a virtual environment

从其完整的文档中可以看出:

任务 本质上是:

完美任务是对何时运行有特殊规则的函数:它们可选地接受输入,执行一些工作,并可选地返回一个输出。

所以它们被用来做一些工作,或者工作的某一部分。

在提督中,工作流被定义为“ 流程 ”和

工作流(或“流程”)是任务的容器。流表示任务之间的依赖结构,但是不执行任何逻辑。

所以有了,你可以将一些任务集合起来执行一组特定的期望功能。它更像是一个任务流水线。

好了,现在我们已经完成了,让我们看看如何建立一个。

构建我们的任务

我们在本教程中的目标很简单——在随机用户免费 API 的帮助下获取用户列表,并在每次运行我们的工作流时将它们保存到一个新的 csv 文件中。

听起来够简单吧?

太好了。让我们看看我们需要在其中构建哪些组件。

让我们先导入我们的库,不要太多,我向你保证:

import requestsimport pandas as pdfrom prefect import task, Flowimport json

现在,首先,我们决定将我们的工作流分成三个任务(功能):

提取

我们将在这个函数中从 API 中获取一个特定数量的 用户

我们使用 requests get 函数来获取随机用户的列表。

@taskdef extract(url_from): response = requests.get(url_from) if response: return json.loads(response.content)["results"] else: print("No response gotten.") 

注意到那里的***@task***装饰者了吗?这就是将函数变成任务所需的全部内容。

接下来是我们将用来把我们的用户 json 转换成数据帧的函数。

改变

在这里,我们将用户的 JSON 字段转换成包含每个人的数据的个人字典列表T21【people _ list】列表

我们将从所有**person** 响应中提取三个特征:

  1. 姓名=名+姓
  2. 性别,以及
  3. 国籍
@taskdef transform(data_dict): people_list = [] for person in data_dict: single_item = { 'gender': person["gender"], "name": person["name"]["title"] + person["name"]["first"]  + person["name"]["last"],"nat": "AU", } people_list.append(single_item) # return dataframe from list of dicts return pd.DataFrame(people_list)

最后,我们有我们的加载功能。

负荷

这个函数执行简单的任务,将 csv 保存到我们的本地目录。

我们指定“ data_df ”作为这个函数的参数,它是我们在转换步骤中构建的数据帧,以及文件名作为我们保存的 csv 的参数。

@taskdef load(data_df, filename): data_df.to_csv(f"{filename}.csv", index=False)

现在,让我们继续构建一个完整的工作流程。

制造流动

在这一点上,我们已经定义了自己执行一点任务的独立函数。现在,我们想把他们聚集在一起,建立一个管道。特别是 ETL 管道。

我们和**Flow**一起这么做。

def start_data_collection(num_people_to_fetch): with Flow("Random User API ETL:") as flow: # get specific number of people profiles upon each request people = extract(f'https://randomuser.me/api/?inc=gender,name,nat&results={num_people_to_fetch}') # make a dataframe out of the response user_df = transform(people) # save the dataframe formed to disk load(user_df, f'{num_people_to_fetch}_people') return flow

下面是我们在这个函数中做的事情:

  • 我们创建一个新的带有名称的流对象。
  • 我们用提取方法启动管道,并获取一些用户
  • 然后我们把这些用户转化成熊猫的数据框架
  • 最后,我们将数据帧保存为 csv 文件,文件名作为参数指定

我们逐一完成所有这些任务,然后返回我们的流对象。

只有一个简单的步骤不同于简单地按顺序调用我们的函数——我们做同样的事情,但是在我们的流对象内部。

测试我们的 ETL 工作流程

最后一步是测试我们构建的内容。这里有一个简单的主函数来运行我们的流对象:

if __name__ == "__main__": flow = start_data_collection(3) flow.run()

仅此而已。你完了。

以下是您在命令行中使用以下命令运行它时得到的输出:

python main.py

显示我们管道成功的终端输出

这是保存到磁盘的 csv:

通过 API 调用保存了人员详细信息的 csv

结束…

这就是——一个简单的 ETL 工作流,帮助你开始使用 Prefect。我建议您尝试自己复制这个示例,并在其中加入一些额外的概念,如故障检测、重试支持等。

如果你想参考全部代码,这里是我的 GitHub repo,包含我在文章中使用的所有资源。明星⭐️它和书签。

https://github.com/yashprakash13/data-another-day

最后一件事

我希望这篇文章是一篇简单而有帮助的文章。我定期撰写关于数据科学和编程的文章,并尽我所能让它变得有趣并吸引你。

所以,保持联系,和我一起踏上旅程。😃

👉这里是获取我经常与 100 多个订阅者分享的所有文章、顶级资源和见解的最佳方式。

👉跟随我在媒体上,永远在循环中。

将 Docker 与 VSCode 结合使用的好方法

原文:https://towardsdatascience.com/the-nice-way-to-use-docker-with-vscode-f475c49aab1b?source=collection_archive---------3-----------------------

在 VSCode 框架下使用 Docker 设置数据科学项目的快速指南。

由 Curology 在 Unsplash 拍摄的照片

您的下一个项目可能包含许多复杂的机器学习代码,其中包含许多不同的库,它们的版本可能会对您的机器造成严重破坏。接下来是确保您的同事也可以运行安装了正确依赖项的应用程序的过程。这带来了新一轮的头痛。

不一定非要这样。

在 docker 容器内开发可以节省你很多时间,有助于从长远来看平滑你的应用程序的部署过程。在另一篇文章中,我讨论了为您的项目手动构建和运行 docker 映像的完整步骤。这里可以找到。

但是有一个更简单的方法来为你的下一个项目自动设置 Docker,它内置在 VSCode 中。

在这个故事中,让我向您展示我是如何通过几个简单的步骤在一个容器中开始一个新的开发环境的。

我们开始吧👇

获取有用的扩展!

VSCode Docker 扩展是所有 Docker 工作流的主干。确保你已经通过访问扩展市场安装了它,或者直接访问这个 URL: Docker 扩展。

现在,在你的机器上启动 Docker 桌面

这个扩展使得构建、运行和部署容器化的应用程序变得很简单,所有这些都不需要离开代码编辑器!

在进入下一步之前,请确保 Docker Desktop 正在运行。

写一个简单的应用程序

本教程的目的是展示以 dockerised 方式开发一个应用程序是多么容易。记住这一点,我将展示一个使用 FastApi 构建 HelloWorld 应用程序的简单示例。

首先,创建一个名为**helloworld.py**的新文件,并将这段代码粘贴到其中:

*from* fastapi *import* FastAPIapp = FastAPI()@app.get("/")async def root(): *return* {"message": "Hello World"}

这将确保我们有一个简单的 API,在暴露的 URL 显示“Hello World”消息。

现在到了我们和 Docker 一起玩的部分。

塑造新的码头工人形象

首先,您需要创建一个**requirements.txt**文件,其中包含我们正在构建的应用程序的所有依赖项。

由于这个测试应用程序的简单性,我们现在只有这两个:

fastapi[all]==0.63.0uvicorn[standard]==0.13.4

最后按 CMD + Shift + P 或者 CTRL + Shift + P 打开 VSCode 的命令 pallete。输入并选择“添加 Docker 文件…”

将弹出下面的窗口,选择 FastApi 选项。

从 dockerfile 选项中选择 fastapi

这一流程大大简化了我们的工作流程。

因此,即使我们没有将 FastApi 依赖项放在 **requirements.txt** 文件中,它也会添加它。那不是很整洁吗?

现在,继续选择端口选项,如下图所示。默认设置应该就可以了。如果您愿意,可以根据您的要求进行更改。

码头工人的港口选择

最后,建立你的 Docker 形象的步骤到了。在生成的 Dockerfile 上点击右键,选择**Build Image**

现在,您应该在编辑器中获得以下文件:

生成 Docker 文件后的文件夹结构

太棒了。为了测试我们的 API,我们现在可以进入最后一步了!

运行 Docker 容器

现在我们已经准备好了图像,您可以切换到 VSCode 侧边栏左侧的 Docker 选项卡。

在这里,您将看到系统中已有的图像列表。我们刚刚构建的新图像也将在这里显示如下:

形象已经建好了!

这太棒了。现在你只需要右击你的图像名称下的**latest**,选择运行选项。

您可以通过右键单击构建的容器并单击“查看日志”选项来查看启动日志。这将产生如下输出:

你的 api 是活的!

这意味着我们的 API 正在运行。

最后几句话…

打开你的网络浏览器,导航到上面的网址或者简单地: 0.0.0.0:8000。您现在应该看到 Hello World 消息了!

太好了!现在,您应该能够围绕这个过程构建自己的项目了。

我希望这篇文章能够作为一个很好的起点,让您快速了解使用 Docker 开发 Python 应用程序的便捷方式。我建议你通过阅读官方文档来体验 VSCode 中 Docker 的其他特性。我知道我会的。😃

如果你觉得这篇文章有帮助,跟随我这里因为我每周都写,确保你永远不会错过另一篇文章。

此外,我所有数据科学文章的代码库和资源都在这里的中。快乐学习!

我还有几个故事,你可能会感兴趣:

北美区域碳通量模式:用神经网络反向估算目标数据预测碳通量

原文:https://towardsdatascience.com/the-north-american-regional-carbon-flux-model-predicting-carbon-flux-using-inversely-estimated-918bf31ea7dd?source=collection_archive---------35-----------------------

变更数据

根据区域变量和反向估算的目标数据创建一个更有效的北美 CO2 通量模型

我们能否创建一个碳通量模型,使用碳通量的逆模型估计来训练神经网络?我们可以不使用按比例放大的碳通量数据,而是使用捕捉大规模碳通量特征的逆模型估计,因为它们与大气 CO2 数据直接相关。这与其他模型不同,因为我们的模型不是使用站点级别的碳通量数据,而是使用区域范围的平均值来提供更广泛区域内碳通量活动的更好想法。但与现场水平的估计不同,反向通量缺乏一些详细的信息,如时间分辨率。通过使用区域环境变量,我们可以利用逆模型方法为北美建立一个 CO2 通量模型,从而为一个大区域建立数据驱动的碳通量估计。

Github 资源库
Google Colab

数据是如何选择的

我们选择数据集的依据是,我们认为哪些特征能给我们提供北美碳通量的最佳指示,以及哪些因素促成了这一数字。我们首先研究了自然碳通量的主要驱动因素光合作用的指标,最终使用辐射、土壤水分、湿度、降水,然后使用逆模型估计碳通量数据来训练模型。我们还关注了北美地区每月 1x1 度分辨率的可用数据。这是因为较高分辨率下的数据不够精确,可能会使我们的模型难以在整个目标区域内表现良好。

提炼数据

图 1

通过在一个名为 pairplot 的工具中查看我们的数据,我们看到了哪些变量具有相似的数据,这些数据可能会通过引入冗余信息来误导模型。例如,precip 和 percip30d 变量在 pairplot 上彼此密切相关,但是在测试时,我们发现移除该变量不会以可测量的方式影响模型。

数据图

图 2

这张图表向我们展示了 2007 年北美目标数据集中的月平均碳通量,并让我们看到了季节性碳通量的模式

图 3

该散点图显示了目标数据中所有年份的月平均通量值,我们稍后将使用这些数据来评估我们的模型。

自上而下与自下而上

在估算碳通量时,有两种主要方法。一种是自下而上的方法,在大约 1 公里的范围内进行碳通量测量,然后用大量的测量数据构建一个数据阵列。然而,对于模拟整个北美的碳通量的问题,这种方法是无效的,因为它依赖于外推和按比例放大到更大区域的关系,这可能是有问题的。自上而下建模的一个好处是,它可以根据大气 CO2 观测模式提供大面积净通量的估计值。一个缺点是,因为我们只有大面积的估计,我们不知道哪些来源可能造成更多的大气二氧化碳。

其他信息

对于我们选择的数据集,数据跨度从 2007 年到 2015 年。为了训练模型,我们将使用前 6 年的可用数据,其余时间用于测试。为了训练模型,我们使用 20%的验证分割,这意味着模型将在 20%的训练数据上进行连续评估。仅针对北美创建模型的主要原因主要是因为可以获得同一时间段和同一分辨率的训练数据。

背景资料

为了准确预测北美的碳通量值,我们使用神经网络来估计碳通量。神经网络是一种机器学习过程,它被建模为神经元的互连网络,从训练数据中“学习”,然后在给定一组特征或训练数据的情况下预测结果。这是通过使用输入数据,通过称为隐藏层的神经元层检查数据中的某些模式,然后产生预期与数据的真实值匹配的结果的过程来实现的。在我们的实验过程中可以观察到,隐藏层的数量和每个隐藏层中神经元的数量可以极大地影响模型的有效性。该模型中使用的特征是之前讨论的环境变量以及作为目标数据集的原始碳通量数据,或者该模型试图预测的内容。我们使用神经网络来估计碳通量,因为神经网络能够对碳通量数据中存在的复杂非线性关系进行建模。

该结构

对于我们模型的结构,我们首先查看了 WECANN 模型,它提出了一个类似的问题,但却估计了总碳通量(GPP)。然而,他们模型的结构在我们的测试中被证明是无效的,所以我们不得不使用一个更复杂的模型。

图 4

上面是来自具有 15 个神经元的单个隐藏层的模型的预测散点图,显示了简单模型如何不足以有效地提供有用的估计。

发展

在我们决定使用一个更复杂的模型后,我们开始添加另一层,并为该层迭代测试不同数量的神经元。

在单个隐藏层中的 25 个神经元处,我们观察到改进的模型性能,与实际值相比,估计值达到 0.92 相关值。

图 5

该散点图显示了模型的估计值与真实值的对比,并且与之前的简单模型相比,有效地估计了碳通量值。

问题

虽然我们上面展示的模型表现很好,但我们意识到该模型表现很好主要是因为我们包括的特征具有太多的信息,因此问题太简单了。这是因为我们包括了经度、纬度和月份,模型过于依赖这些数据来预测碳通量,而不是使用我们打算使用的环境变量。为了继续开发我们的模型,我们被迫删除所有空间和时间数据,只使用模型中的环境数据变量。

在这一点上,没有时间和空间变量,模型性能下降到 0.60 相关值以下。我们还决定需要一个更复杂的模型来改进基于我们地区数据的模型性能估计。

为了重新开始模型开发,我们首先查看模型实际预测的值与真实值的对比,以便更好地了解我们具体需要改进的地方。

图 6

图 7

我们可以看到,模型通常了解哪些区域显示较高和较低的碳通量值,如北美西海岸附近较高的通量值,但在通量尺度的边缘补偿严重不足,特别是在美国东北部。这向我们表明,我们需要关注两种不同的策略:创建一个更复杂的模型,同时进行更长时间的训练。

同样,经过大量的实验,这是我们为我们的模型决定的结构。

model = Sequential() model.add(Dense(50,input_dim=X_full.shape[1], activation='relu')) model.add(Dense(100,input_dim=X_full.shape[1], activation='relu')) model.add(Dense(100,input_dim=X_full.shape[1], activation='relu')) model.add(Dense(100,input_dim=X_full.shape[1], activation='relu')) model.add(Dense(50,input_dim=X_full.shape[1], activation='relu')) model.add(Dense(50,input_dim=X_full.shape[1], activation='relu')) model.add(Dense(1,input_dim=X_full.shape[1], activation='linear'))

随着我们增加了四个隐藏层,并按比例增加了所有隐藏层节点,最大层的神经元从 20 个增加到 100 个,我们模型的准确性大大提高了。

图 8

我们还对我们训练模型的方式做了一些改变。我们开始训练 100 个时期的模型,而不是仅仅 20 个时期。我们还为 Keras 使用了 shuffle 选项,这改变了数据通过每个历元的方式,并使我们的验证数据与我们的测试数据相同,这改变了模型在训练时评估自身的方式。

现在,我们的相关值大约是 0.83。在此之后,我们为模型引入了一个新功能,以 id 的形式为北美 18 个不同的生物群落提供 data⁵的土地覆盖。一个生物群落的例子如下所示:

图 9

我们决定把它包括进来,因为我们认为它可能填补了模型不能完全预测特定地区碳通量的一些空白。我们的相关值跃升至约 0.90,其散点图如下所示。

图 10

评估我们的结果

如上所示,我们的模型可以准确地估计每月的碳通量,尽管在某些地区仍然略有低估,但它仍然可以仅基于区域变量模拟北美的碳通量。在我们的散点图上,我们可以看到我们的模型仍然在夏季左右挣扎,因为北美的平均碳通量大大增加,但在一年中的其他时间更准确。我们的月度碳通量散点图也证明了为什么我们的模型被低估了。

图 11

图 12

为了进一步评估我们的模型,我们希望将我们的结果与另一个碳通量模型进行比较,特别是使用自下而上方法建模碳通量的模型。为此,我们选择了 model⁵.的 Fluxcom 下图展示了我们的模型与 Fluxcom 模型在预测碳通量方面的对比:

图 13

蓝色的 Fluxcom 模型实际上低估了冬季月份的碳通量,但与我们的模型和夏季月份的真实值保持一致,这是北美发生更多光合作用和碳通量输出的时间。这不仅显示了碳通量自下而上和逆向建模之间的差异,还显示了将逆向建模方法用于其他环境应用的可行性和潜在好处。

未来方向

在完成模型的创建之后,我想探索几个领域,这些领域可能会改进模型或将其投入某种用途。我可以做的一个补充是使用其他环境数据,如某些地区的森林覆盖率,以及某些生物群落如何比较和影响碳通量。我还想将我的模型扩展到一个更大的区域,并探索我可能需要做出哪些改变来适应世界的一部分。

参考

[1] Yoichi P Shiga,森林主导北美碳汇的年际变化(2018),https://iopscience.iop.org/article/10.1088/1748-9326/aad505

[2] Mesinger,f .,G. DiMego,E. Kalnay,K. Mitchell 和合著者,北美区域再分析。美国气象学会公报(2006 年),https://www . ncdc . NOAA . gov/data-access/model-data/model-datasets/north-American-regional-re analysis-narr

[3] Alemohammad,Hamed & Fang,Bin & Konings,Alexandra & Green,Julia & Kolassa,Jana & Prigent,Catherine & Aires,Filipe & Miralles,Diego & Gentine,Pierre,Water,Energy,and Carbon with Artificial Neural Networks(we cann):使用太阳诱导荧光对全球地表湍流通量进行基于统计的估计,https://BG . Copernicus . org/articles/14/4101/2017/BG-14-4101-2017

[4] Martin Jung,从涡旋协方差站点到全球的碳通量:FLUXCOM 方法的综合和评估,https://BG . Copernicus . org/articles/17/1343/2020/BG-17-1343-2020-discussion . html

[5]弗里德尔、M.A .、A.H .斯特拉勒、j .霍奇斯、F.G .霍尔、G.J .克拉茨、B.W .米森、S.O .洛斯、E .布朗·德·科尔斯顿和 D.R .兰迪斯。2010.ISLSCP II MODIS(收集 4) IGBP 土地覆盖,2000–2001。美国田纳西州橡树岭 ORNL·DAAC。【https://doi.org/10.3334/ORNLDAAC/968

北面和无尽的夏天

原文:https://towardsdatascience.com/the-north-face-and-the-endless-summer-a6c8a27c67a6?source=collection_archive---------40-----------------------

脸书预言家网站的搜索量趋势和季节性分析

由本杰明·沃罗斯在 Unsplash 上拍摄的照片

在过去的几年里,North Face 一直是全球时尚和户外行业最大的品牌之一。从 1968 年开始作为一个针对核心爱好者的小品牌,到今天与一些最大的炒作品牌合作,如 Supreme,该品牌的知名度有了巨大的增长。

这个机器学习和预测建模项目分析了 North Face 的全球谷歌搜索流量,以了解该品牌最近的成功是否会持续,以及最近的全球事件如何影响其数字足迹。

数据来源于 Google Trends,涵盖了从 2015 年 7 月到 2020 年 7 月的五年时间,数据量是从 0 到 100 的标度值。

搜索量是衡量该品牌整体财务表现的一个很好的指标。该品牌很大一部分销售额将来自数字平台。由于最近的全球事件和商店无限期关闭,这一点变得越来越重要。

已经利用了五年的数据,这个时间框架提供了一个很好的窗口,在这个窗口中,品牌身份和户外行业的地位是一致的——这允许应用统计技术。

5 年间的搜索量

该品牌在深秋经历了最大的搜索流量。这将受到为冬季寻找设备的核心市场和为圣诞节购买产品的消费者市场的推动。夏季是搜索流量最低的季节,因为保暖和防水衣物已经过时。

季节性是一致的,数据呈上升趋势,峰值与总体增长成比例增加。从建模的角度来看,值得注意的是,数据是成倍增长的,搜索流量正以越来越快的速度增长。

实际上,这意味着该品牌正以指数速度增长,然而 2020 年的春天可能会改变这一点。由于新冠肺炎,2020 年初交通流量的下降比预期的更为极端,流量下降到 2018 年夏季的水平。

脸书先知

使用脸书先知库,我将数据分为训练集和测试集,并建立了一个模型来预测数据集的最后一年,以便我们可以分析模型在已知值上的性能。

m = Prophet(seasonality_mode='multiplicative')
m.fit(train)
future = m.make_future_dataframe(periods=52,freq='W')
forecast = m.predict(future)

该模型很好地预测了下图所示的真实值。随着方差的减少,预测是真实曲线的更平滑的代表。

预测与测试集

均方根误差表明,我们的模型平均离真实值有 12.6%的差距,不算很好,但确实有一些预测能力。

from statsmodels.tools.eval_measures import rmse
predictions = forecast.iloc[-52:]['yhat']
rmse(predictions,test['y']) / test.mean()y    0.125569 
dtype: float64

对整个数据集进行再训练

对模型的强度感到满意,它在整个数据集上进行了重新训练,以便我们可以展望未来。

建立另一个模型预测了未来的 52 个周期-数据是每周的,因此这将预测持续到 2021 年 7 月。

m = Prophet(seasonality_mode='multiplicative')
m.fit(df)
future = m.make_future_dataframe(periods=52,freq='W')
forecast = m.predict(future)

由于信息的季节性,至少需要预测一年,以便评估趋势和季节性。

预测未来一年

这表明,该模型认为,搜索量的积极趋势将会延续,复合倍增性质将继续下去。

展望 2021 年夏季,似乎低谷已经扩大,因此表明未来该品牌的淡季将比往常更长。很难说这是新冠肺炎的结果还是数据中的自然趋势,因为冬季对该品牌越来越重要。

这是查看数据中异常值的好时机;每年都有一周搜索流量明显高于其他数据点,这就是黑色星期五周。

在 2020 年春季开始时也有一群异常值,由于疫情和经济不确定性的结果,这些点低于趋势。

移除这些异常值将提高模型的准确性,但是,这些是解释品牌搜索量表现的关键事件,并且已经包含在建模中。模型的准确性被牺牲了,取而代之的是一种更基本、更原始的预测工具,我们可以用信息周围事件的知识来解释它。

趋势变化

对数据洞察应用变点功能可以获得趋势如何随时间变化的信息。

from fbprophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(),m,forecast)

季节变化点

从 2016 年底到 2018 年初,North Face 的搜索量处于高速增长期。自那时以来,趋势是积极的,但速度在下降。这表明该品牌的增长在放缓。

下面的图表很好地展示了品牌的趋势和每年的季节性。从五年期间趋势的百分比变化来看,该品牌经历了高增长率,然后是较低的增长率。

时间序列组件

第二个差异证实了这一点,增长率增加后增长率下降。

趋势的第一个差异

根据对 North Face 的全球谷歌搜索流量进行的预测建模,结果表明该品牌将继续增加其数字量,但速度会放缓。

该品牌产品的市场过度饱和以及消费者行为的改变可能是其结果,而最近的全球冲击将产生重大影响。

这可能会给该品牌带来更严酷的冬天和商业上无尽的夏天。

我希望你喜欢阅读这篇文章,如果想了解更多信息,请随时通过 LinkedIn 与我联系。

GitHub repo 获取代码和数据。

不那么天真的贝叶斯

原文:https://towardsdatascience.com/the-not-so-naive-bayes-b795eaa0f69b?source=collection_archive---------21-----------------------

采用简单的方法构建垃圾邮件分类器

你有没有想过,当你收到一封邮件后,你的电子邮件服务提供商是如何立即将它归类为垃圾邮件的?或者,你有没有想过,在线电子商务平台的推荐是如何根据实时用户行为快速变化的?这些是朴素贝叶斯分类器投入使用的一些用例。

朴素贝叶斯是一种监督分类算法,主要用于处理二元和多类分类问题,尽管经过一些修改,它也可用于解决回归问题。这是用于处理分类问题的最简单的算法之一,尤其是当数据集具有较少的数据点时。

在这篇文章中,我们将首先看看朴素贝叶斯背后的数学概念,然后我们将看看不同类型的贝叶斯分类器,一旦我们有了朴素贝叶斯分类器实际上是什么的要点,然后我们将尝试建立我们自己的分类器。也请阅读我以前的文章来了解不同的分类算法。

朴素贝叶斯简介

朴素贝叶斯是用于处理分类问题的最简单和广泛使用的监督分类算法之一。这是一种直观的分类算法,基于贝叶斯定理的原理,以统计学家托马斯·贝叶斯牧师的名字命名。

图片由皮尔·保罗提供

朴素贝叶斯模型易于构建,对于处理较小的数据集尤其有用。除了简单之外,朴素贝叶斯还因其速度和准确性而胜过甚至高度复杂的预测模型。该算法在文本数据项目中表现异常出色,包括情感数据分析、垃圾邮件检测和文档分类等。三种主要类型的朴素贝叶斯算法:

  1. 高斯朴素贝叶斯:特征服从高斯或正态分布时常用。这也需要计算数据的平均值和标准差。
  2. 多项朴素贝叶斯:用于多项分布数据。这适用于具有离散特征的分类。
  3. 伯努利朴素贝叶斯:用于多元伯努利分布。它要求将数据点视为二进制值的特征向量。

朴素贝叶斯的另一种变体是互补的朴素贝叶斯或 CNB,当训练集中的类不平衡时,它往往比它的对应物工作得更好。互补朴素贝叶斯(CNB)分类器通过估计除了我们正在评估的类之外的所有类中的数据的参数,改进了朴素贝叶斯分类器的弱点。

图片来自 StackOverflow

与它的姐妹算法相比,朴素贝叶斯分类器可以更快地被训练,并且它也做出更快的预测。可以用新的训练数据对其进行修改,而不必从头开始重建模型。

朴素贝叶斯的引擎盖下

如前所述,该算法基于描述事件概率的贝叶斯定理的原理,基于已经发生并以某种方式与事件相关的条件的先验知识。贝叶斯定理的等式为:

在哪里,

  • P(A|B) 是给定 B 的概率,这叫做后验概率。
  • P(B|A) 是数据 B 给定 A 的概率。
  • P(A) 是 A 的概率,这叫做 A 的先验概率。
  • P(B) 是数据的概率。

图片来自 Sem Spirit

这里 P(A|B)和 P(B|A)是条件概率。这给出了事件 A 发生的概率,假设 B 已经发生,反之亦然。在可能有一个以上结果的情况下,使用的公式是:

训练朴素贝叶斯分类器比它的大多数姐妹算法都要快。这是因为只需要计算每个类别的概率和给定不同输入值的每个类别的概率。

朴素贝叶斯有什么好幼稚的?

这种算法被称为“幼稚”,因为它假设每个属性独立于其他属性。然而,在现实生活中这可能不是真的。简而言之,朴素贝叶斯分类器假定一个类的特定属性(也称为特征)的存在与否与该类的任何其他属性的存在与否无关。

图片来自外星人

通过一个例子可以很容易理解这个假设。如果一朵花是粉红色的,生长在水中,水平伸展 3 英尺,它可以被认为是莲花。当使用朴素贝叶斯时,所有这些特征独立地贡献了花是莲花的概率,即使它们依赖于彼此的存在和不存在。

尽管如此,分类器在许多真实世界的情况下工作得非常好,尤其是在处理小数据集时。在大多数使用案例中,它的性能与神经网络和 SVM 的不相上下。然而,如果数据集由独立的属性组成,那么它甚至可以产生比逻辑回归算法更优化的结果。

图片来自 Mathworks

现在您已经熟悉了朴素贝叶斯的概念,我们可以尝试构建我们自己的朴素贝叶斯分类器。用于构建这个模型的代码和其他资源可以在我的 GitHub 资源库中找到。

步骤 1:导入所需的库和数据集

为了构建模型,我们的第一步将是导入所需的库。Jupyter notebook 和 Python 给了我们在代码的任何地方导入这些库的灵活性。我们需要导入 PandasNumpy 库来开始构建模型。

***#Import the Libraries and read the data into a Pandas DataFrame***import pandas as pd
import numpy as npdf = pd.read_csv("framingham_heart_disease.csv")
df.head()

Pandas 是一个快速易用的工具,构建在核心 python 库 Matplotlib 和 Numpy 之上,用于执行数据分析和操作。 read_csv 函数用于将数据集作为 pandas dataframe(一种二维数据结构)加载到我们的笔记本中。

图片来自量子计算

在本例中,我们将尝试构建一个垃圾邮件分类器,能够将给定的电子邮件分类为垃圾邮件或非垃圾邮件。建立模型的数据集可以从这里下载。

第二步:探索数据集和文本分析

加载数据集后,我们的下一步是探索隐藏的预知。我们使用的数据集充满了洞察力。可以使用 isnull 函数检测数据集的缺失值。这些缺少值的记录要么被删除,要么用记录的平均值填充。

***#Exploring the Dataset***count1 = Counter(" ".join(data[data['v1']=='ham']["v2"]).split()).most_common(20)
df1 = pd.DataFrame.from_dict(count1)
df1 = df1.rename(columns={0: "words in non-spam", 1 : "count"})count2 = Counter(" ".join(data[data['v1']=='spam']["v2"]).split()).most_common(20)
df2 = pd.DataFrame.from_dict(count2)
df2 = df2.rename(columns={0: "words in spam", 1 : "count_"})

可以使用各种图表(如饼图和条形图)来可视化数据。这些都在 Matplotlib 包中。数据的好坏取决于它试图回答的问题。在这里,因为我们试图建立一个垃圾邮件分类器,文本分析有一个重要的作用。

作者图片

在这种情况下,由于我们正在将邮件分类为垃圾邮件,因此我们将把邮件中出现的单词作为模型特征。

第三步。数据预处理和特征工程

既然我们已经从数据集获得了洞察力,接下来我们需要做的就是选择构建模型时要包含的要素,并对数据进行预处理。文本预处理分词过滤停用词在此步骤完成。

***#Feature Engineering***f = feature_extraction.text.CountVectorizer(stop_words = 'english')
X = f.fit_transform(data["v2"])
np.shape(X)

停用词是最常被软件忽略的常用词。一些最常见的停用词包括——“the”、“a”、“an”、“is”、“are”、“was”、“was”、“be”、“have”、“has”、“had”和“in”。这些单词没有意义,但是占用了数据库的空间。移除停用词是改善分析的关键步骤。

图片由桑文德拉·辛格

使用feature _ extraction . text . count vectorizer(stop _ words = ' English ')将文档转换为令牌计数矩阵。如果使用 stop_words = english,则使用内置的英语停用词表。在这之后,下一步将是把变量转换成二进制变量。

第四步:预测分析和建立模型

现在,我们已经选择了所需的特征并清理了数据集,构建分类器的下一个任务是将数据集分成训练数据和测试数据。我们将把数据集分成 77%的训练数据和 23%的测试数据,随机状态为 42。

***#Split the dataset into training and testing data***data["v1"]=data["v1"].map({'spam':1,'ham':0})X_train, X_test, y_train, y_test = model_selection.train_test_split(X, data['v1'], test_size=0.33, random_state=42)

图片由谷歌开发者

在这之后,我们的最后一步将是在我们的训练数据上安装分类器。对于这个例子,我们将使用多项式朴素贝叶斯分类器。

***#Fitting the Model***bayes = naive_bayes.MultinomialNB(alpha=list_alpha[best_index])
bayes.fit(X_train, y_train)
models.iloc[best_index, :]***#Generating the Confusion Matrix for our model***m_confusion_test = metrics.confusion_matrix(y_test, bayes.predict(X_test))pd.DataFrame(data = m_confusion_test, columns = ['Predicted 0', 'Predicted 1'],index = ['Actual 0', 'Actual 1'])

在这里,我们的模型有 100%的测试精度,也不会产生任何假阳性。从混淆矩阵中,我们发现我们的分类器模型将 56 条垃圾邮件错误分类为非垃圾邮件。

改进分类器

这个简单的算法表现得出奇的好。尽管我们的分类器有相当高的准确度,但仍然有改进的空间。如果连续特征不是正态分布的,那么我们应该首先使用合适的变换技术对特征进行变换。

图片来自gifs.com

这样,分类器的性能可以大大提高。集成技术(如 bagging 和 boosting)不会对朴素贝叶斯分类器产生太大影响,因为没有要最小化的方差。

朴素贝叶斯的优势

朴素贝叶斯是应用最广泛的分类算法之一。使该算法如此流行的一些特征如下所述:

  1. 朴素贝叶斯分类器可以快速训练,并且可以比其他分类器更快地生成预测。
  2. 在处理多类问题时效果很好。
  3. 与大多数分类器相比,它需要的训练数据少得多,并且在特征独立性假设成立或数据集成立的情况下,可以表现得非常好。

图片来自 Pinterest

朴素贝叶斯的局限性

尽管被广泛使用,但是算法的性能还是有一定的限制。其中一些如下所述:

  1. 所有功能相互独立的假设在现实生活中很少成立。
  2. 如果单个类别标签丢失,那么基于频率的概率估计将为零。这就是所谓的零频率问题。然而,这可以通过使用平滑技术来避免。
  3. 数据稀缺可能导致算法的数值不稳定,从而导致分类器模型的模糊预测。

总结你所学的知识

为了总结我们在本文中学到的内容,首先我们讨论了朴素贝叶斯背后的数学概念,以及如何使用它来构建分类模型。然后,我们讨论了不同类型的贝叶斯分类器,以及为什么这样命名该算法。

图片来自数据文件夹

然后,我们通过建立自己的分类模型继续学习。为了支持我们的学习,我们讨论了这种分类技术的优点和局限性,以及如何改进算法的性能以做出更好的预测。

至此,我们已经到了这篇文章的结尾。我希望这篇文章能帮助你了解朴素贝叶斯分类器的工作原理。如果你有任何问题,或者如果你认为我犯了任何错误,请随时与我联系!通过邮箱或 LinkedIn 与我联系。快乐学习!

核捕鼠器

原文:https://towardsdatascience.com/the-nuclear-mousetrap-e189236d7c51?source=collection_archive---------29-----------------------

图片由来自 Pixabay 的 Marco Schroeder 拍摄

人工智能很难

在拿出大枪之前,先尝试简单的小解决方案

科学家们现在正在建立万亿个参数模型。像 GPT-3 这样的大型系统和像武道 2.0 这样更大的型号正在下线。这些真正巨大的模型,它们更小的基于变形金刚的小兄弟,甚至从零开始的好的旧神经网络在媒体和实际应用中非常受欢迎。有些场景中,这些火箭筒非常有用,但许多其他情况可以通过极其简单的机器学习模型来解决。

核捕鼠器是我在工程学院第一年教我的一个思想实验。这个想法是热核爆炸能有效杀死老鼠,但也是制造捕鼠器的一种非常昂贵的方式。太过分了。出于某种原因,物理学家也喜欢谈论核捕鼠器,但在这种情况下,我们谈论的是与更简单的“可接受”解决方案相比,一个解决方案的过度工程化。人工智能充满了对微小问题的巨大解决方案。您需要小心,不要被愚弄而采用机器学习指标中的“最佳”执行模型(例如,精确度、召回率、f1 分数等)。)然后意识到你将为硬件支付更多的钱,并且你的推理的吞吐量将会更低。在现实生活中,从工程角度来看,一个大小合适的解决方案比从你的机器学习指标中榨取最后一滴更重要。

让我们用一两个例子来说明这一点。这些例子的代码可以在这里找到。

示例 1:识别手写数字“0”

MNIST 数据集是众所周知的手写数字的小灰度图像的集合。该数据集是一个用于测量和比较机器视觉解决方案有效性的示例。MNIST 性能最好的机器学习模型可以在这里找到。不幸的是,性能最好的解决方案在计算上也很昂贵,并且有令人讨厌的长延迟,我们很快就会看到这一点。我们能做什么来得到一个快速和便宜的识别数字 0 的方法?

首先,让我们回忆一下维度缩减在推理时有计算成本,并影响我们的模型性能。然而,简单地删除和缩减采样维度是没有这些成本的。让我们使用一系列技术来删除 MNIST 图像的部分,并疯狂地对其进行下采样,以最小化我们的成本。

该数据集分为 60,000 幅图像的训练集和 10,000 幅图像的测试集。每个 MNIST 图像由 784 个像素组成,每个像素包含 0(黑色)到 255(白色)之间的整数值。下面是这些图像的三个例子。

为了开始简化我们的数据,我们可以简单地将每个图像展平成一长串数字,完全忽略数据是一幅图片。接下来,我们将数字 0,1,2,… 9 的标签转换成一个标签,当数字是 0 时,该标签为“1”,否则为“0”。

在这一点上,我们应该检查一些非常简单的模型(如决策树)是否适合我们的数据集。该模型很好地拟合了训练数据,决策树捕获了测试数据中 94%的零。以下是这种“不费力”模式的分类报告的一部分:

NO EFFORTprecision    recall  f1-score   support
Not 0       0.99         0.99    0.99       9020
Was 0       0.92         0.94    0.93       980
accuracy                         0.99       10000

这个初始模型在每张图片中使用所有 784 个无符号 8 位数字(字节)。接下来,让我们取图片中的每隔一列,然后砍掉前 10 个像素和后 10 个像素,因为我们真的不需要它们来识别零。我们也把每个像素压缩成 1 或 0。以前,像素是灰度的,可以是 0 到 255 范围内的任何值。现在一个像素不是黑就是白。经过这些改变后,我们最终得到每张图片剩余 372 像素。接下来,我们可以检查图像的训练数据集,以删除其中样本很少的数组索引(无论写入的数字是多少,大部分都是 0 或 1)。我们只能查看训练数据,然后当我们决定删除哪些图像像素时,我们只需将相同的删除应用于测试图像。

经过下采样并移除低多样性像素后,我们现在检查哪些像素与我们创建的标签具有低相关性。与答案不相关的像素我们可以直接删除。经过这一改变,我们最终得到每张图片 281 像素。

下一步是识别彼此高度相关的像素,并从图像中移除两个相关像素中的一个。这样做之后,我们最终得到每幅图像 255 个二进制像素。我们的整个图像现在适合 32 字节,而不是原来的 784 字节。我们不仅节省了存储空间。我们在这个压缩的图像数据集上拟合了一个决策树,以下是这个较小的“中等努力”模型的分类报告的一部分:

MEDIUM EFFORTprecision  recall  f1-score   support         
Not 0       0.99       0.99    0.99       9020        
Was 0       0.92       0.95    0.94       980      
accuracy                       0.99       10000

等等……什么?我们删除了每张图片 784 字节数据中的 752 字节!该模型如何在完全相同的性能水平下工作?仔细看的话其实好一点。

嗯,这就是为什么我们在变复杂之前先尝试简单…而且我们还没有完成。我们可以进一步删除 127 个特征,基本上没有任何后果。在 255 个剩余像素中只有 128 个像素的情况下,我们将决策树模型拟合到训练数据,并获得这个“微小”模型的以下测试结果:

TINYprecision    recall  f1-score   support         
Not 0    1.00         0.99    0.99       9020        
Was 0    0.92         0.97    0.94       980

还是…不…崩溃!

现在让我们看看我们从这项工作中得到了什么:

我们应该总结一下我们现在的情况。我们找到了一种更快、存储效率更高的方法来检测手写 0 字符。但是这个技巧对其他东西也有效吗?

示例 2:识别凉鞋

已经表明我们的哑方法在手写数字上工作得很好,同样的方法在更复杂的数据上工作吗?一段时间以来,科学家们一直担心 MNIST 是一个过于简单的数据集,因此有一个更复杂的数据集,名为时尚 MNIST ,比手写数字更具挑战性。虽然时尚 MNIST 仍然有相同的尺寸(784 个无符号的 8 位 T4 数字代表一张 28x28 的灰度图片),但它比 MNIST 有更复杂的物体,比如衬衫和钱包。数据集中的对象有:'T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'

顺便说一句,我对时尚 MNIST 的形象嵌入非常感兴趣:

来自https://github.com/zalandoresearch/fashion-mnist的时尚 MNIST 数据集的嵌入

在我们将 MNIST 的方法重新应用到时尚 MNIST 之前,让我们先来看几张图片:

时尚 MNIST 数据集中的一条裙子和两只凉鞋

我们可以看到这些物体确实比手写数字复杂得多。

那么,我们的技巧在这个数据集上表现如何呢?结果如下:

看起来棒极了!质量指标如何?这个模型“工作”得够好吗?

NO EFFORT FASHIONprecision  recall  f1-score   support    
Not Sandal 0.99       0.99    0.99       9000       
Sandal     0.89       0.89    0.89       1000      
accuracy                      0.98       10000MEDIUM EFFORT FASHIONprecision  recall  f1-score   support    
Not Sandal 0.99       0.98    0.99       9000       
Sandal     0.87       0.88    0.87       1000      
accuracy                      0.97       10000TINY FASHIONprecision  recall  f1-score   support    
Not Sandal 0.98       0.99    0.98       9000       
Sandal     0.87       0.85    0.86       1000      
accuracy                      0.97       10000

从上面的结果中我们可以看到,即使在更高级的环境中,这些技巧也能很好地工作。在我们的方法没有改变的情况下,我们生成了非常简单的决策树,正确地捕获了测试集中 89%、88%和 85%的凉鞋。我们没有真正探索设计空间。这整个事情是一个相当低的努力第一次看。在许多使用案例中,我们可以对模型的输出进行去抖,以便同一对象的一行中的几个预测增加我们对观察的信心,从而使精确度和召回率高于此处报告的单帧水平。

结论

我们在本文中看到,简单的低工作量和低复杂性方法可以在模型质量、延迟和存储需求方面实现合理的性能。如果您试图最大化您的解决方案的速度,最小化模型参数的数量(以适应小型设备或嵌入式平台),或最小化推理成本(例如,您的带有保留 GPU 的 REST API 比基于 CPU 的保留计算能力花费更多)。巨大的预训练模型对于你关心的问题来说可能是多余的。记得检查你的“大”解决方案是否是核捕鼠器。

这篇文章的代码是,可以在这里找到。

如果你喜欢这篇文章,那么看看我过去最常读的一些文章,比如“如何给一个人工智能项目定价”和“如何聘请人工智能顾问”还有嘿,加入快讯!

下次见!

——丹尼尔
linkedin.com/in/dcshapiro
丹尼尔@lemay.ai

大数据的障碍

原文:https://towardsdatascience.com/the-obstacle-of-big-data-4ceae5956039?source=collection_archive---------31-----------------------

理解大数据

克服 1 亿多个数据点的技术

奥古斯都·伯纳姆·舒特,公共领域,通过维基共享

在浏览纽约市、旧金山、西雅图和西雅图 T10 的开放数据平台,寻找一个令我着迷的时间序列项目时,我无意中发现了一个庞然大物——一个如此庞大的数据集,以至于我怀疑自己(和我的电脑)处理它的能力。

一点背景知识:自然地,作为我的朋友讽刺地称之为书头的人,我被图书馆的数据所吸引,我开始想我是否可以建立一个预测未来图书馆活动的项目,即整个图书馆系统的借阅数量。令我沮丧的是,纽约公共图书馆(NYPL)和三藩市公共图书馆(SFPL)都没有任何关于借阅的数据;但是数据嚯!西雅图公共图书馆(SPL)有。并且做到了。

NOAA 在 Unsplash 上拍摄的照片

进入庞然大物

标题为按标题检验(物理项目)的数据集描述如下:

该数据集包括西雅图公共图书馆的所有物理项目结帐的日志。该数据集从 2005 年 4 月的结账开始。不包括续费。

虽然感觉是很久以前的事了(但是时间到底是什么?),我似乎想起了一种故意的无知,没有真正考虑这个数据集从 2005 年就开始了意味着什么。但是在那个决定命运的日子——2020 年 12 月 15 日——我点击了DownloadCSV,发现自己等了几个小时才下载了一个 26.93 GB 的文件。这是一个令人大开眼界的数字,当然也是我见过的最大的数据集。

由格雷格·拉科齐在 Unsplash 上拍摄的照片

我可以看看吗?

不完全确定我会找到什么,我把 CSV 文件放到我项目的Data文件夹中,并试着把它加载到一个熊猫数据帧中。我给我的电脑开了一张安非他命的处方,然后走开了,以为它需要一段时间来加载。一会儿是轻描淡写;一段不确定的时间后(至少一个小时,也许两个小时,也许更久?),当我的电脑风扇间歇地开到最大时,这个文件仍然没有加载。啊,那时我年轻多了;我甚至没有想过要记录我是从什么时候开始运行这个单元的。

此后,我构建了一个名为status_update的函数,它以字符串形式接收一条消息,并打印出带有当前时间戳的状态更新(您猜对了)。对于任何运行时间不可忽略的代码来说,这都是救命稻草。在处理大型数据集或复杂代码时,没有比不确定性更糟糕的感觉了。到目前为止,将时间跟踪器和质量检查整合到我的管道中对于这个项目来说是至关重要的,并且是我在未来项目中将永远保持的习惯。

用我的状态更新器武装起来,我让我的电脑整夜运行,到了早上,我仍然在黑暗中,看不到熊猫的数据帧。

照片由 Dmitry Ratushny 在 Unsplash 上拍摄

创造一个窥视孔

在我最终意识到我正在处理的野兽的本质之后,我意识到我需要查看一小部分数据,并围绕这些数据建立一个数据转换管道。我查阅了 Pandas 文档,看看是否有任何方法可以限制我从原始 CSV 加载的行数和列数。当然有!鉴于这个数据集最终比我以前处理过的任何数据集都大整整三个数量级,我过去并不真的需要使用nrowsusecolsskiprows参数。下面是我第一次用来窥视数据的代码示例。

# load data
df = pd.read_csv('data/Checkouts_By_Title__Physical_Items_.csv', # file pathnrows=1000000 # number of rows to load
)

因为我还没有看到数据,所以我不确定哪些列我可以考虑加载;然而,最终我会使用usecols参数,它允许您选择从数据源加载哪些列。还有一个skiprows参数,如果您想要加载特定的数据块,可以使用它。在这种情况下,我只想看到一些东西!所以前一百万行,包括所有的列,就可以了。

幸运的是,我立即注意到了大量多余的列,并且知道通过不加载这些列,我可以大大减少所有行的加载时间。我没有加载的列包括:

  • ID —生成的标识号,元数据存在于数据的其他地方。
  • CheckoutYear —已经包含在更需要的列CheckoutDateTime中的信息。
  • BibNumberCallNumberItemBarcode——每个项目都有唯一的数字,这有助于确定项目的哪个版本最受欢迎,但我更简单地想看看最受欢迎的书籍/电影/项目总体情况,而不考虑版本。为此,我可以使用ItemTitle列。
  • ItemType —与数据字典配对时可能有用的列,但它包含的信息比Collection列少。

因此,从最初的 10 个专栏中,我只选择了 4 个— CollectionItemTitleSubjectsCheckoutDateTime。然后,我可以在构建管道的其余部分之前修改我以前的代码。

# list of columns to load
usecols = ['Collection', 'ItemTitle', 'Subjects', 'CheckoutDateTime']# load data
df = pd.read_csv('data/Checkouts_By_Title__Physical_Items_.csv', # file pathnrows=1000000, # number of rows to loadusecols=usecols # specify columns to load
)

剧透警告:通过指定这 4 列,我的所有 106,581,725 行的加载时间从数小时减少到了 15 分钟,这是一个巨大的改进,尽管对于加载原始数据来说仍然有相当多的时间。

照片由约格什·佩达姆卡尔在 Unsplash 上拍摄

用管道绕过这个庞然大物

在实际加载所有数据之前,有必要使用这个较小的百万次观测数据块来为所有必要的数据转换构建一个管道。以下是我的管道流程的简要概述:

  • 检查任何 NaN 值
  • CheckoutDateTime列从字符串转换为 datetime 对象(对于任何时序项目都是必要的)
  • 从数据字典中合并项目信息
  • 删除任何不必要的列
  • 将任何可以合并到更合适类别中的值进行转换
  • 保存清理后的数据集

我知道最大的任务之一是合并数据字典中的数据,数据字典包含主要用于探索数据(EDA)的重要信息,例如:

  • Format Group —项目是PrintMediaEquipment还是Other
  • Format Subgroup —更具体的分类,有 15 个类别,前三个是BookVideo DiscAudio Disc
  • Category Group —通常是指项目是Fiction还是Nonfiction,尽管也包括其他类别
  • Age Group —一个项目是否被视为AdultTeenJuvenile

所有这些列都包含 string 对象,解析这些对象会占用大量内存和时间。经过一些研究,我找到了一个通过转换为熊猫分类对象的解决方案。

丹尼尔·法齐奥在 Unsplash 上拍摄的照片

将字符串转换为分类

为了在数据操作和子集化过程中节省内存和时间,我在 Pandas 中使用了分类类。要阅读更多关于分类类如何提高内存使用(以及其他好处),请参考文档。基本思想是,我可以有n个类别,而不是一个包含 1 亿多个字符串的列。在我的例子中,上面的列的值从 3 到 15 不等,明显少于 1 亿+百万。

剧透警告:我已经计算了分类数据和字符串数据的每一列的大小,发现分类数据正好是字符串数据大小的八分之一(12.5%)!考虑到所有这四列,在合并过程中,以及在数据转换过程和随后的 EDA 过程中,我节省了超过 3GB 的内存和大量时间。

一切都被 i̶l̶l̶u̶m̶i̶n̶a̶t̶e̶d̶拉长了

随着我的管道或多或少地完成(必须始终为进一步的优化和改进留出空间),我准备好加载所有必要的数据并通过管道发送它。很快就清楚了,处理大数据不仅仅取决于加载原始数据需要多长时间;对于这种量级的数据集,一切都需要更长的时间。甚至检查 NaN 值也花了我将近四分钟。将日期列从字符串转换为 datetime 对象需要六分多钟。

从数据字典中合并数据的速度惊人地快,只需 4 分钟,但是删除合并所需的列(但之后就没用了)却花了 45 分钟。我无法在熊猫身上找到一种更快的方式来完成这项工作,尽管可能有一些优化的方法,我将在下面讨论。多亏了 NumPy,所有其他数据转换几乎都是瞬间完成的。

这让我想到了最后一个障碍…

伊万·拉季奇,由 2.0 抄送,经由维基共享

储蓄的问题是

也许我面临的最大的障碍,也是我需要做更多工作的事情,实际上是保存我最终清理和转换的数据集。出于各种原因,包括稳定性和内存节省,我决定将数据集保存为压缩文件。尽管如此,即使我的管道在所有其他步骤上都工作得很好,我还是遇到了将数据保存在一个包中的问题。内存使用仍然被超过,我的内核在最后一个关键步骤上一直崩溃。

我现在的解决方案是分批保存 1000 万行,总共 11 个文件。非常大的缺点是这个过程需要大约 8 个小时!好的一面是,我以前大约 27GB 的数据现在是干净的,总共只有 3GB。加载现在干净的数据仍然需要一段时间(大约 20 分钟),但我认为这是煮咖啡和吃早餐的时间。

重要的一点

我应该注意,这个非常大的数据集需要很长时间保存和加载,从某种意义上说,它是可选的。它只对项目的探索性数据分析部分重要,对我来说,这确实非常重要。然而,实际的时间序列数据可以通过对您想要的任何类别列以及最重要的目标变量total_checkouts进行虚拟化和求和来几乎即时地创建(在上述数据转换之后)。这些数据可以放入一个总计 277KB 的 Pickle 文件中。

总是有更多需要优化

根据您的用例,执行通常快速的任务(当处理较小的数据时)所花费的大量时间可能是不可接受的。对于我的个人项目,在构建了包含前 100 万行的数据转换管道之后,整夜在整个原始数据集上运行脚本并保存一个现在可以轻松访问的干净的数据帧并没有什么大不了的。

这种“多余的时间”很大程度上可以归因于熊猫在处理数据时只使用一个单核。我对一个名为摩丁的库很感兴趣,它可以并行化你的数据,并利用你计算机的所有内核。不幸的是,它目前在熊猫的最新版本中无法使用,所以降级是必要的。 Dask 和 PySpark 是我正在考虑的其他工具,尽管 Dask 的早期实验表明,在数据转换过程中,性能的提高可以忽略不计(有时甚至为零)。例如,检查 NaN 值也需要同样长的时间。

到目前为止,我已经有了可以运行的清理过的数据,但是在将来,让我的管道更加高效仍然是有益的。到目前为止,通过解决这些问题,我明白了总是有更多的工作要做,而且不是所有的野兽都能被驯服(或杀死)。

Gustave Doré ,公共领域,通过维基共享

访问我的项目存储库

虽然我仍然处于早期(ish)阶段,但这篇文章中详细描述的过程,以及我迄今为止的 EDA,可以在我的项目的库中看到。作为奖励,我最近执行了该项目的第一次 API 调用,以便获得 2020 年的剩余数据,然后我在管道中运行并轻松清理这些数据。

文献搜索技巧将帮助你成为一名更有效的数据科学家

原文:https://towardsdatascience.com/the-often-missed-step-on-your-journey-to-becoming-a-data-scientist-287f1ef1c5f1?source=collection_archive---------26-----------------------

开始数据科学职业生涯时经常错过的一步

许多数据科学领域的新人经常寻找现成的方法来遵循,这些方法可以应用于任何机器学习任务。像这样的问题并不少见:我应该选择或提取什么特征?应该尝试哪些机型?模型的可接受精度水平是多少?

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

没有什么比听到典型的“视情况而定”的回答更令人沮丧的了。如果规则如此灵活,我如何成为一名有效的数据科学家?对于这个领域的新手来说,粗略的指导方针可能很难遵循,因为它们往往会导致更多的问题而不是答案。对于刚起步的人来说,缺乏自信是很自然的,这很典型,而且会让事情变得更糟。

我已经可以听到我的一些同行的声音,他们说每个问题都是独特的,你不能以预定的方式处理一项任务——事情就是这样。毕竟,答案取决于可用的数据和特定的背景,这个方法迟早会失效。更糟糕的是,盲目地遵循一套规则肯定会导致做傻事或彻底错误的不良后果。

我完全同意。随着时间的推移,那些在该领域起步的人将能够通过特定背景的透镜来思考他们的问题,并灵活地应用不同的方法。但是要建立这些知识和经验,他们需要一个起点。市场上无数的数据科学课程往往缺少一点,那就是学习探索研究文献的重要性。

是的——培养文献搜索技能将有助于你成为一名更高效的数据科学家。

很难找到一个别人没有解决过的问题。最有可能的是,至少已经有一些研究论文解决了你正在研究的问题。从专家获得的结果中,您可以找出哪些特征最具预测性,哪些模型可以产生最佳性能,以及您正在处理的问题的预期准确性。

是的,你的数据集将会不同。是的,您可能无法访问类似的功能。是的,在这个阶段,如果您使用的库中没有本文提到的模型,您可能无法实现它们。这都是真的。

但是这些研究可以为你提供开始和回答你的一些问题所需的支架,通常会限制可供选择的选项。此外,他们通常会提供做出某些决定的原因。您可以使用这些理由来检查它们是否适用于您的数据集,并做出相应的决策。很快你就会发展出一种直觉(和理解!)什么在特定的环境下有效,什么应该避免。

照片由表面在未溅上

即使你是第一个应用数据科学技术解决问题的人,数据科学领域之外的研究无疑会为你提供特征选择和提取的思路。你想预测学生在一门课程上的表现吗?调查教育研究,找出什么样的学生特征或环境通常与高分有关。你想确定有患肺癌风险的病人吗?查看流行病学研究,找出风险因素。

你明白了。

当然,数据科学技术已经被应用到上面的例子中,但是这只是为了说明研究文献是使你的模型更有效的一个惊人的资源。许多专家认为领域知识是数据科学中最重要的技能之一,这并不是巧合。

伟大的是,你不需要阅读数百项研究,就可以对问题有一个基本的了解。文献综述是快速了解相关问题的好方法。当然,你不会立即成为该主题的专家,不言而喻,有些领域比其他领域更难,但这足以让你起步。

因此,在你直接进入数据之前,阅读一下其他人是如何处理类似问题的,或者花几个小时阅读一下这个话题。熟练掌握文献搜索并加以利用。您会发现,由领域知识提供信息的模型通常表现更好,而且往往不太复杂(尤其是当您的数据科学技能有限时)。

一些精心挑选的特征对构建一个成功的模型大有帮助。

如果你已经知道你计划应用数据科学技术的领域,那太好了!别忘了把这些知识用上。人们很容易过度关注新获得的技能,而忘记自己已经拥有的知识和技能。

如果你是那种认为你的学位是在浪费时间,你应该学习数据科学的人,请三思。你很可能拥有一个独特的优势——对该领域的了解和对数据的熟悉——这让你有机会释放数据科学技术背后的力量。

2022 年您应该掌握的一个数据科学工具

原文:https://towardsdatascience.com/the-one-data-science-tool-you-should-master-in-2022-c088bb4371b2?source=collection_archive---------11-----------------------

张秀坤·兰格在号航天飞机上拍摄的照片

这个工具已经为我节省了很多时间,现在它正在占领市场!

开门见山:如果您不了解 Dataiku DSS,那您应该了解。说真的。它将为您节省数小时、多重头痛,并让您更享受数据科学!

什么是数据仓库决策支持系统

DSS(数据科学工作室的简称)是由一家名为 Dataiku 的公司创建的端到端机器学习平台。有时,您会看到人们将平台本身称为 Dataiku。

它的界面允许你将 SQL、R、Python、Jupyter 笔记本和可视化配方(无代码)结合到一个工作流程中。这意味着您可以将其用于数据准备、分析和建模。它还可以读写不同的数据源,

为什么你现在就应该学

DSS 正在接管世界:它最初是一家法国初创公司,现在总部位于纽约州,价值 46 亿美元,拥有大约 600 名员工。客户名单:通用电气、丝芙兰、育碧、思科。

DSS 允许无代码、低代码和 100%代码的混合。有一种“低代码”趋势,公司正在慢慢走向让每个人都能更容易地访问数据。决策支持系统完全符合这一逻辑,同时仍然设法为那些想要 100%代码化的人保留这一选择。

就市场开发而言,决策支持系统仍远未充分发挥潜力。许多公司仍在纯代码环境下工作,这使得工具本身成为一种竞争优势,但从个人角度来看也很重要:因为工具仍在摸索中,所以在每个人都掌握它之前,先掌握它,会让你获得很大的优势。

我的个人账户

就我个人而言,我认为对于这样一个可视化工具来说,当您为整个数据科学项目编写代码时,很难实现所有的功能。然而,进入决策支持系统几个月之后,我就已经着迷了:它易于使用的界面让我节省了数百个小时的工作,从数据提取到模型评估。

这就是决策支持系统流的样子

在进行数据预处理时,如果您愿意,您可以单独运行其中的一些步骤,并依次查看它们之间的交互方式。如果你不会编码,你可以用 SQL、R、Python 甚至是可视化的方法来实现。

模型训练界面

建模时,您可以尝试许多不同的算法和超参数的组合,对它们进行比较,并实时看到训练的进行。您还可以访问多个情节,展示模型的即时表现(不再与 ggplot 作斗争)。

一旦您的模型准备好了,您就可以通过将整个流程导出到 DSS Automation Node 来将它交付给生产,这允许您以您需要的任何频率安排作业,在最后发送报告,等等。

很明显,你不需要仅仅为了建模而使用它,它还允许特别分析仪表板数据预处理(你最终还是需要一个仪表板工具,DSS 并不是要取代它们)。

我看到越来越多的公司成功迁移到 DSS,并逐渐允许其他部门访问他们需要的数据,给他们更多的自主权进行简单的数据提取特别分析,并给数据科学部门更多的时间处理其他任务

此外,我已经看到 DSS 使协作变得更加容易:它不仅与 Git 集成,您还可以看到是否有其他人与您处理同一段代码,或者甚至是同一个项目。你可以为流程的每个部分留下注释和评论,甚至可以使用 markdown 编写一个完整的 Wiki 来记录你的项目。

一些缺点

当然,没有任何工具是完美的,Dataiku 也不例外。

从公司的角度来看,它的一个主要缺点是拥有专有技术,这意味着你的公司必须为此付费。此外,它的流程逻辑使得很难将您的项目迁移到其他工具,您可能会发现自己被困在一个昂贵的解决方案中。

从个人的角度来看,即使 Dataiku 在网上提供了详尽的文档,如果你需要非常具体的帮助,你也不会在像 Stack Overflow 这样的网站上找到任何东西(让我们面对现实吧,如果没有 Stack Overflow,你不可能通过 Python 中的前 10 行代码)。

最后,可视化工具非常基础,只适用于简单的绘图,如直方图和散点图,所以如果您需要做一些稍微复杂的事情,您将需要使用 Python(或者 R,如果您喜欢这类东西的话)。

怎么学呢

学习如何使用 DSS 的最好方法是实践:在你的电脑上安装免费版,然后开始用你的个人数据科学项目。如果没有,也可以试试他们的教程,或者上几门课程。

我建议你至少给它一个月的时间,直到你习惯了 DSS 组织工作流程的方式,同时你在一个 Kaggle 项目中使用它。你会看到它将允许你更快地实验,同时跟踪你的模型的变化和进展。

如果你喜欢这篇文章,你可能也会喜欢这些:

联系我,这将是我的荣幸(老实说)。

作为一名数据科学家,一条建议改变了我的生活

原文:https://towardsdatascience.com/the-one-piece-of-advice-that-changed-my-life-as-a-data-scientist-4bb0d3e67b88?source=collection_archive---------15-----------------------

编程如果不能创造价值就毫无价值

由阿伦·范德波尔在 Unsplash 上拍摄的照片

我花了三年时间学习数据科学职业发展所需的核心高端技能——机器学习、SQL、Python 和数据可视化。由于专业人员需要跟上编程和计算方面的最新进步,因此获得数据科学方面的必要技能的重要性怎么强调都不为过。

所有这些严格的学习和对新技能的理解得到了回报,我在认证后立即获得了工作机会。去年的某个时候,我在一家金融科技初创公司担任咨询数据分析师,这是一个非常棒的职位,因为它为创造力和个人发展创造了空间,以获得更多技能。在数据科学中,你永远也学不会所有的东西。

三个月后,我们的办公室迎来了来自顶尖科技公司的客人。旨在分享关于计算、数据可视化和优化的想法和观点的会议。

我与其中一位数据科学家进行了简短的交谈,并请他在我的笔记本电脑上签名。

他签了名,说道:“用你所拥有的去建造一些有价值的东西。”

老实说,我没想到会这样。我期待着类似这样的话,“好吧,本,这是我的名片,过来吧,我会让你得到指导和更好的工作机会。”我的意思是这是 90%的数据科学家的梦想,对吗?—获得更好的工作机会,这将增加你的经验和投资组合。

然而,我意识到他对我说的那几句话是基于可靠的建议。关于职业建议有很多误解。人们通常认为,要让建议被认为是有价值的,它需要一个长达三小时的演讲,或者基于或支持无数年的研究。事实是,一句话可能是你将事业推向更高境界的动力。

利用你所拥有的去创造一些有价值的东西

你有没有想过辞去现在的工作去创造一些有价值的东西?据研究显示,大多数数据科学家从未想过辞职。他们喜欢躲在数据库的阴影下。这背后有两个主要原因:

  • 他们不知道要建什么。
  • 他们害怕失败。
  • 他们有想法,但他们只是懒于付诸行动。

许多有才华的数据科学家没有利用他们的真正潜力,可能是因为工作所附带的奖金和津贴。如果我们不能将机器学习、数据挖掘、数据可视化、SQL、Python、人际技能、建模等领域的先进经验和专业知识应用到能够为社会带来积极变化的项目中,这些经验和专业知识都将付诸东流。

从小处着手。这可能需要时间,但这完全取决于你拯救人类的奉献精神、想法和心态。数据科学不仅仅是分析统计数据和交易数据,还不止这些。降低开支,提高生产力,创造更好的生活,才是 impact 作为数据科学家的真谛。用你所拥有的一点点,建造一些东西,然后简单地执行。

转换矩阵的一站式指南

原文:https://towardsdatascience.com/the-one-stop-guide-for-transformation-matrices-cea8f609bdb1?source=collection_archive---------3-----------------------

在 Unsplash 上由 eskay lim 拍摄的照片

我最近一直在学习三维 2D 投影和反投影。我发现的最令人困惑的事情之一是使用欧拉角构建从相机到世界的变换矩阵。尽管旋转作为一个概念很容易理解,但是构建变换矩阵并使用它们可能会非常令人困惑。在本文中,我将解释如何创建变换矩阵,并使用它们从一个参考系转换到另一个参考系。我们还将通过绘制它们来可视化转换和几个样本点。

介绍

在计算机视觉、机器人、航空航天等领域。我们需要使用变换矩阵(旋转和平移)从一个参照系到另一个参照系。这是一个非常重要的概念,如果你想用几何计算机视觉和立体视觉(核几何)。然而,就像我最近的经历一样,理解如何使用这些变换并从一个参照系转到另一个参照系可能是一个挑战。首先,我想区分一下参照系和惯例。

参考框架:

它是一种在三维(或多维)空间中测量点的坐标系。它可以相对于其他参考系以任何方式定向和平移任何量。举个例子,对于自动驾驶汽车,我们可以有汽车参照系、摄像机参照系、IMU 参照系等。但是重要的是要注意,无论数字在不同的帧中如何变化,该点在物理上保持在相同的位置。在不同参照系之间移动的动机是,在一个局部参照系中,你可以测量相对于该参照系的原点和方向的点,这更容易管理。比方说,在机器人前方 1 米、右侧 2 米、上方 3 米的位置,比在一个全球参考系中定义相同的空间,并移动和旋转这些坐标要容易得多。

惯例:

这只是 x、y 和 z 值的顺序以及它们与实际物理方向的关系。它不是一个参照系,不应与之混淆。尽管我们需要确保遵循你正在使用的库/应用/方程的惯例,但这与参照系本身没有任何关系。约定的一个例子可以是 NED(北距、东距、下距),这意味着 x 是向前的,y 是向右的,z 是向下的。另一个是 ENU(东,北,上),这意味着 x 是正确的,y 是向前的,z 是向上的。OpenCV 使用 EDN(东距、下距、北距)约定,这意味着 x 是右,y 是下,z 是前。因此,ENU 系统中有人说(1,2,3)将意味着向右 1 米,向前 2 米,向上 3 米。但是,如果这些数字被插入到 EDN 约定中,而没有适当的旋转,我们最终会得到 1m 右,2m 下和 3m 前,这不是这些数字的意图。如果可能的话,请在你的代码中只使用一种约定,让事情更清楚。否则,要有清晰的文档来说明遵循了哪些不同的约定,以及在这些约定之间进行转换时采用了哪些特定的轮换。

右手系统 v/s 左手系统

这也是一个需要理解的重要概念。系统的旋向性无非是我们用哪只手从 x 轴和 y 轴的叉积得到 z 轴的方向。

右手系统:

x x y = z,其中 x,y,z 为坐标轴的正交单位向量。将右手手指从 xy 方向弯曲,拇指指向 z 方向,即可得到 z 方向。将我们弯曲的右手沿着 z 方向放置,将获得正旋转方向。如果从本系统旋转轴的+ve 方向的顶部看,正旋转是逆时针方向。

旋度和方向的右手法则(来源:右手法则维基百科)

左撇子系统:

x x y = -z(右手约定符号),其中 x,y,z 是坐标轴的正交单位向量。xy 方向弯曲左手手指,拇指指向+ve z 方向,即可得到 z 方向。通过将我们弯曲的左手沿着 z 方向放置,可以获得正向旋转的方向。在本系统中,从旋转轴的+ve 方向的顶部看,正旋转为顺时针方向。

左手坐标在左边,
右手坐标在右边。来源:CC BY-SA 3.0,文件:笛卡尔坐标系 handledness . SVG—Wikimedia Commons

变换矩阵

我将坚持用齐次坐标来构造变换矩阵。解释这些坐标超出了本文的范围。但主要的一点是,这些坐标允许射影变换表示为 4x4 矩阵。此外,在这个系统中,点和向量(方向)有很好的区分。你可以在这里了解更多:齐次坐标

在本文中,我们不会使用这些来执行 3D 到 2D 的投影,而只是在不同的参考框架之间进行转换。

在开始构造矩阵之前,我将简要地谈谈行和列向量符号以及它们对如何使用变换矩阵的影响。nx1 矩阵称为列向量,1xn 矩阵称为行向量。根据你如何定义你的 x,y,z 点,它可以是列向量或行向量。

对于列向量,我们将旋转/变换矩阵进行预乘,该矩阵采用列主格式。结果是旋转矩阵的列的线性组合。

来源:作者

对于行向量,我们后乘旋转/变换矩阵,它是以行为主的格式。结果是旋转矩阵的行的线性组合。

来源:来自作者

因此,如果你以列主格式构造矩阵,你需要在与行向量相乘之前对旋转矩阵进行转置。

r 是一个 3×3 的旋转矩阵。v 是一个[3x1]列向量。来源:作者

对于本文,我将坚持使用列向量。接下来,我们看看如何构造转换矩阵。我将使用 scipy 库来制作欧拉角的旋转矩阵。你可以在这里阅读这些角度是如何工作的:T2·德米特里·科斯佳耶夫的更好的旋转表示用于精确的姿态估计并观看这个视频:欧拉角和欧拉旋转序列【精彩的解释!].所以假设你知道你的 B 帧 w . r . t . A 帧的三个欧拉角值,以及 B 帧原点在 A 帧坐标下从 A 帧的平移(tx,ty,tz)。用于从参考系 B 转换到 A 的变换矩阵由下式给出:

来源:作者

注意变换矩阵名称中的 AB 顺序。这是因为这些矩阵是从右向左相乘的。因此,如果我们级联其中的一些,我们就可以从这个约定中知道我们是否遵循了正确的转换顺序。在以下示例中,我们级联三个变换矩阵,将点 p0 从参照系 D 带到参照系 a。请注意,齐次坐标中的点表示为x,y,z,1。

来源:作者

现在让我们看一下用 python 做这件事所需的代码。我将使用 scipy 构建旋转矩阵,使用 pytransform3d [7]可视化各种变换。首先让我们看看需要导入哪些库。

接下来,我们为几个不同的帧定义变换矩阵。请注意,代码中的名称不遵循书面约定。我用 A2B 来表示,我从参考系 A 到 b,我们用的关键函数是 Rotation,from_euler,它需要一串有效的欧拉角旋转和一列旋转角。您可以用角度或弧度来指定旋转。如果要使用弧度,请设置 degrees=False。我在这段代码中使用了“XYZ”旋转序列。我定义了四个参照系,A,B,C 和 D,它们互相参照。最后,我还定义了几个点,在参考系 A 和 b 中绘制。

我们从这些变换矩阵中构造一个变换管理器,然后绘制点和帧 w.r.t 参考帧 B 和 a。轴的颜色编码是 RGB,分别对应于 XYZ。

结果图如下所示。我们看到框架相互之间的方向是正确的。我们成功地将点从一个参照系转换到另一个参照系,要么使用直接转换矩阵,要么级联两个矩阵。

标绘在“B”参照系中的框架。请注意,原点翻译正确。我们看到点 P [2,0,0]正确地沿着 x 轴在 2 个单位处。注:RGB 对应于 XYZ 轴。(图片来源:作者)

标绘在“A”参照系中的框架。请注意,原点翻译正确。我们看到点 P [2,0,0]正确地沿着 x 轴,在“A”参照系的 2 个单位处。注:RGB 对应于 XYZ 轴。(图片来源:作者)

如果你想看看变换矩阵的实际应用,请查看:由 Daryl Tan 撰写的单应性的实际应用。

结论

处理变换矩阵是机器人、航空航天、自动驾驶、核几何等领域的基本步骤。在这篇文章中,我们看到了几个概念,即参考系,惯例,右 v/s 左手系统。我们看到了如何在转换矩阵中处理列和行向量。最后,如何在 Python 中创建这些矩阵,并在图形中可视化它们。我希望你喜欢读这篇文章,就像我喜欢写它一样。如果你发现任何错误,或者有任何其他问题或建议,请随时在这里评论或在 LinkedIn 上给我发消息。

参考

  1. 右手法则
  2. SciPy . spatial . transform . rotation—SciPy v 1 . 7 . 0 手册
  3. 欧拉角
  4. 旋转矩阵
  5. https://phas . UBC . ca/~ ber ciu/TEACHING/phys 206/lections/FILES/Euler . pdf
  6. http://www.cse.psu.edu/~rtc12/CSE486/lecture12.pdf
  7. pytransform 3d—pytransform 3d 1.9 文档

能让你在数据工程领域找到工作的在线认证

原文:https://towardsdatascience.com/the-online-certification-that-will-get-you-a-job-in-data-engineering-83540a01a225?source=collection_archive---------10-----------------------

招聘人员会找你

路易斯·基根在 Unsplash 上的照片

要得到一份工作,你需要经验。要获得经验,你需要一份工作。

无论你是一名即将进入就业市场的应届毕业生,还是一名希望转行的在职专业人士,你可能都听过或见过上面的说法。这是一个先有鸡还是先有蛋的问题,我们很多人在人生的某个阶段都经历过。

来源:Reddit

对于新毕业生来说,获得第一份工作是他们职业生涯中面临的最大挑战之一。他们渴望、充满活力、充满好奇心,但他们缺乏行业经验,这使得招聘者聘用他们的风险更大,因为招聘者正在寻找更有经验、能够完成工作的候选人。

一些学生指望无薪实习来获得他们感兴趣领域的经验,另一些学生可能会绕道而行,寻找与他们梦想的角色无关的工作,只是为了进入市场(例如,辅导你主修的科目)。

无论你处于什么职位,你可能都考虑过在空闲时间参加在线课程和认证,以更多地研究你感兴趣的领域,无论是数字营销课程、学习 python 基础知识还是机器学习入门。

你观看所有的视频,完成作业,通过测试,获得证书,并将其添加到你的 LinkedIn 个人资料中。听起来熟悉吗?要是有那么容易脱颖而出就好了。

不要误会我的意思,这些都是获得该领域基本知识的绝佳开端,但不足以让你在该领域找到一份工作。原因是这些在线课程不难完成,而且大多数挑战和任务都是有指导的。

没有人会因为你完成了吴恩达在 Coursera 上的机器学习课程而聘用你担任数据科学的角色。将近 400 万人注册了这门课程!(除此之外,我向所有对 ML 感兴趣的人推荐这门课程)。

为了更上一层楼,你需要应用这些在线课程中的技能,并开始一个辅助项目来练习和展示你所学到的东西。

然而,如果我告诉你招聘人员正在积极寻找一些证书呢?这些资格将帮助你在开始工作前获得行业知识,并使你的简历对招聘公司的吸引力增加十倍。

让我们来看看。

谷歌云专业证书

谷歌云认证是一系列专业认证,涵盖关键技术工作职能,评估设计、实施和管理方面的高级技能。他们的目标是对在谷歌云平台上获得技术技能和专业知识感兴趣的个人。

截至发稿,谷歌提供了 8 个专业证书:云架构师云开发员数据工程师云开发员工程师云安全云网络工程师协作工程师机器学习工程师

云技能需求量很大。谷歌云技能的需求尤其大,在过去一年里,职位列表中的需求增加了 66.7%。据 Gartner 称,云计算预计到 2021 年将成为价值 3000 亿美元的业务,因此招聘人员正在寻找具备这些云技能的个人也就不足为奇了。

对于每个证书,谷歌建议个人拥有 3 年以上的行业经验,包括 1 年以上的谷歌云经验。要获得认证,你需要通过在线监考考试,考试费用为 200 美元。

毫无疑问,有实践经验是一个优势,但是像我刚从大学毕业一样,没有行业经验也有可能获得认证。我在这里写了一份详细的指南,介绍我是如何准备和通过考试的。

总的来说,认证是您向更大的 IT 市场展示技能以及向招聘人员验证您的云技能和经验的绝佳方式。

这有什么大不了的?

公司希望他们的新员工获得谷歌云认证的原因是,这使他们有资格获得合作伙伴身份。

作为合作伙伴计划的一部分,谷歌投资于他们的合作公司,展示他们的专业知识,并为他们提供资源,使他们在解决方案、垂直行业、认证、专业化等方面脱颖而出。

对于提供服务(如咨询)的组织来说,这有助于在一个非常拥挤的市场中将其业务与竞争对手区分开来,并将自己标榜为该领域的专家。拥有合作伙伴身份的公司更有可能吸引新客户,因为它们被谷歌视为展示了技术能力和客户成功的公司。

换句话说,他们是谷歌云平台值得信赖的大使。

你可以在这里查看合作公司的名单。

作为这一旅程的一部分,寻求合作伙伴地位的雇主要求一些员工获得专业认证(下面的绿色圆圈),然后他们才能开始积累专业知识并达到专业化。

我的经历

当我申请数据工程师职位时,我遇到了许多需要谷歌云认证的招聘信息。现在在 LinkedIn 上快速浏览一下,你会发现许多公司和招聘机构仍然在寻找经过认证的个人。

招聘人员经常通过关键词搜索候选人,所以我收到的职位描述信息完全超出了我的经验和能力,只是因为我勾选了认证。从公司的角度来看,这是一个数字游戏,所以不管经验如何,雇佣任何有资格的人都有助于提高他们的资格。它也不必是一个特定的认证,只要是上面列表中的一个即可。

考的时候全球有 2000 个认证数据工程师,现在有 5000 多个。

我收到的一些信息和工作描述(图片由作者提供)

获得谷歌云认证不仅帮助我在 GCP 建立了数据工程的相关技能,而且作为一名应届毕业生,帮助我的申请在竞争激烈的领域脱颖而出。

最后,我加入了一家专注于数据和分析的咨询公司,后来我发现他们也在与谷歌建立合作关系,我是他们的第一名认证员工。

然而事情并没有就此结束。

入职一个月后,我被要求获得微软 Azure 认证,这样公司才有资格获得金牌合作伙伴资格。因此,我也是微软认证的 Azure 数据工程师,该公司是黄金合作伙伴。

不仅仅是谷歌,其他主要的云竞争对手如微软也有自己的合作伙伴计划,这些公司都在积极寻求加入。微软的合作伙伴还带来了一大堆其他好处,比如资源折扣和介绍新客户。微软也提供比谷歌更多的认证,你可以在这里查看。

许多公司瞄准黄金(图片由作者提供)

直到今天,我还不断收到招聘人员发来的消息,他们在寻找谷歌或微软认证的个人,或者我是否认识我网络中的人。

希望我已经让你相信需求仍然很高,如果在你开始找工作之前有一个在线认证你应该参加,那就是上面列出的那些。

这是你扭转局面,让招聘人员寻找你的机会。

如果你喜欢这篇文章,何不注册 medium,通过这个链接阅读更多精彩内容。

https://medium.com/@jonathan.moszuti/membership

我已经使用了上面列出的所有资源,并且只推荐帮助我提高技能的产品**

您唯一需要的 3 毫升工具

原文:https://towardsdatascience.com/the-only-3-ml-tools-you-need-1aa750778d33?source=collection_archive---------4-----------------------

作者图片

许多机器学习技术已经从概念验证快速发展到为人们日常依赖的关键技术提供动力。在试图捕捉这一新发现的价值时,许多团队发现自己陷入了在产品中生产机器学习的狂热中,而没有正确的工具来成功地做到这一点。

事实是,我们正处于定义构建、部署和迭代机器学习模型的正确工具套件的早期阶段。在这篇文章中,我们将讨论让您的团队在您的产品中成功应用机器学习所需的 3 ML 工具。

让我们从过去吸取教训

在我们进入 ML 堆栈推荐之前,让我们快速地将注意力转向软件工程行业是如何确定工具的。一个关键的观察是,没有一个解决方案用于在生产中构建、部署和监控您的代码。

换句话说,端到端的工具平台并不存在。相反,有一套工具,专注于软件工程生命周期的特定部分。

作者图片

为了简化软件的创建,必须创建工具来跟踪问题、管理版本历史、监督构建,并在生产中出现问题时提供监控和警报。

尽管并不是每个工具都适合这些类别中的一个,但是这些工具类别中的每一个都代表了创建软件过程中不同的摩擦点,这使得创建工具成为必要。

我以为这是关于机器学习的?

正如开发软件的过程一样,开发机器学习模型的过程有一组广泛的类别,这些类别与研究、构建、部署和监控模型所需的内容相一致。

在这篇文章中,我们将重点关注在解决实验室外应用机器学习的一些最大障碍的过程中出现的基本 ML 工具类别。

要创建一个有效的机器学习工具箱,你真的只需要这三个基本工具:

  1. 特征库:处理离线和在线特征转换
  2. 模型库:作为中心模型注册和跟踪实验
  3. 评估商店:监控和改善模型性能

作者图片

功能商店

首先,让我们深入了解一下 功能商店 。为了定义什么是特性库,让我们从特性库应该为您的团队提供什么开始。

功能存储应该支持什么:

  1. 充当功能转换的中心来源
  2. 允许在离线培训和在线服务中使用相同的功能转换
  3. 使团队成员能够分享他们的实验转换
  4. 为功能转换代码提供强大的版本控制

除了功能商店应该如何为您的团队提供支持之外,这里还有一个必备功能列表,可以帮助您决定哪个功能商店最适合您和您的团队。

你的特色商店应该有的东西:

  1. 与您的数据存储/湖泊集成
  2. 为模型的在线部署提供要素转换的快速方法
  3. 将功能转换代码快速轻松地部署到生产环境中
  4. 与评估库集成,支持数据和要素质量检查

推荐:

泰克顿

模特店

现在您有了一个存储要素变换的要素存储库,您需要一个工具来对团队的模型创建历史进行分类和跟踪。这就是模型店发挥作用的地方。

模型商店应该支持什么:

  1. 充当所有模型和模型版本的中央存储库
  2. 允许每个模型版本的再现性
  3. 跟踪模型历史的沿袭

除了这些核心功能之外,还有许多模型存储特性,您可能会发现它们对构建和部署您的模型非常有帮助。

你的模型店应该有的东西:

  1. 应该能够跟踪模型的每个版本的引用数据集,git 提交,模型的工件(pickle 文件)
  2. 应提供要提供的任何型号的最新版本,例如(2.1 版)
  3. 维护一致的沿袭,以便在需要时回滚版本
  4. 与您的评估库集成,以跟踪模型每个版本的评估,从而精确定位模型回归
  5. 与您的服务基础设施集成,以便于模型部署和回滚

推荐:

权重&偏差 / MLFlow

评测店

既然您已经将您的模型跟踪并存储在您的模型存储中,那么您需要能够选择一个模型来发布并监控它在生产中的表现。这就是评测店能帮上忙的地方。

评估商店应该支持什么:

  1. 为任何环境中的任何模型(生产、验证、培训)提供聚合(或切片)性能指标
  2. 使用基线监控和识别漂移、数据质量问题或异常性能下降
  3. 使团队能够将绩效变化与其发生的原因联系起来
  4. 提供一个平台,帮助持续交付高质量的模型和改进反馈循环—将生产与培训进行比较
  5. 为 A/B 测试模型版本提供一个实验平台

现在将我们的注意力转向评估商店的必备功能,这里有一些使特定评估商店值得考虑的事情。

你的评价店应该具备的东西:

  1. 存储模型评估:输入、每个模型版本的 SHAP 值和输出,跨环境:生产、验证和培训
  2. 基于从评估库获得的基准,自动监控以轻松发现问题
  3. 为任何类型的性能分析创建灵活的仪表板—适用于 ML 的 DataDog
  4. 与您的要素存储集成以追踪要素漂移
  5. 与您的模型存储集成,以获得每个模型版本的模型性能的历史记录

推荐:

阿里斯

可能适合您的其他工具

数据标注平台:

让我们退一步说,你刚刚收集了你的数据,这些数据可能有也可能没有地面真相标签。现代统计机器学习模型通常需要大量的训练数据才能表现良好,而用基本事实标签注释足够多的数据以使模型有效的能力可能是一个相当大的挑战。

不要担心,数据注释平台将你的数据批量分发到一组分布式的分类器,每个分类器将根据你提供的指令标记你的数据。

推荐:

  1. 阿彭
  2. 全自动数据标注服务的规模

模型服务平台:

在许多应用机器学习的情况下,你将需要某种形式的服务平台来将你的模型部署给你的用户。简单来说,这里有一些服务平台应该为你的团队提供的核心特性。

模型服务平台应该具备什么:

  1. 关于模型服务的访问控制,只有经过选择的一组人才有权更改部署的模型。
  2. 如果需要,可以快速回滚到以前部署的模型版本
  3. 灵活支持不同的 ML 应用类型。例如,在预测延迟不是问题的情况下,您的服务平台应该允许批量推断来优化计算
  4. 与模型商店很好地集成,便于模型推广
  5. 与评估存储很好地集成,以实现生产中的模型可观察性。

推荐:

kube flow&algorithm ia

人工智能编排平台:

在许多情况下,一个跨端到端生命周期工作并使团队能够编排整个工作流的平台是必要的。这些平台帮助团队从各种来源引入数据,管理培训工作流,存储模型,为模型服务,并连接到监控平台。管理所有这些不同工具的基础设施可能是复杂的,人工智能编排层有助于数据科学家和 ML 工程师专注于交付模型。

建议:

结论

为工作寻找合适的工具有时会让人感到不知所措,尤其是对于一个新兴的领域。就像今天赋予软件工程师权力的工具一样,将没有端到端的平台来构建、部署和监控生产中的机器学习模型;然而,只需这几个工具,你就能快速有效地将你的模型带出实验室,送到你的客户手中。

鸣谢:
感谢 Josh Tobin 创建了术语评估商店!

联系我们

如果这篇博客引起了你的注意,并且你渴望了解更多关于机器学习可观察性和模型监控,请查看我们的其他博客和关于 ML 监控的资源!如果您有兴趣加入一个有趣的 rockstar 工程团队来帮助模型成功生产,请随时联系我们,并在此找到我们的空缺职位!

您的 Jupyter 笔记本需要的唯一自动完成扩展

原文:https://towardsdatascience.com/the-only-auto-completion-extension-youll-ever-need-for-your-jupyter-notebooks-87bbaecb7126?source=collection_archive---------9-----------------------

这是我推荐使用的一款。探索几个简单的步骤来设置它!

内森·杜姆劳在 Unsplash 上的照片

Python 中最受欢迎的编程接口之一是 Jupyter Notebook 环境,想要在其中启用代码自动完成感觉很自然。

我知道我喜欢经常在 VSCode 中工作,我在笔记本中经常错过的一件事是自动完成我的长 import 语句,这些语句包含我经常忘记的库名(😛)和我的项目中非常重要的变量名!

进入 : 腹地 扩展!

这个扩展是我用过的最有用的nb 扩展之一,它完全按照建议的那样工作。

让我们在笔记本上看看启动和运行的步骤,好吗?

用 pip 安装它

nbextensions 包的一行安装是第一步。下面是在您的终端中(希望在您的虚拟环境中)执行此操作的代码:

pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install

就是这样。现在打开你的 jupyter 笔记本吧!

对于所有的 pipenv 用户,请记住您需要做:

pipenv run jupyter notebook

不仅仅是:

jupyter notebook

如果您没有在系统中全局安装 Jupyter,那么第二个命令应该不起作用。

好了,我们进入下一步。

启用腹地

是的,它不会在您的环境中自动启用。您需要到这里并在 nbextensions 选项卡上启用它,该选项卡位于 Files 选项卡旁边:

在这里启用腹地!

一旦你完成了,打开一个新的笔记本,让我们来测试它!

结束…测试扩展

你现在应该可以正常使用它了,当你写的时候,自动完成提示会一直弹出来。

类似于这样的东西:

你都准备好了!😄

感谢您的阅读!

喜欢我的文章吗?成为 中等会员 继续无限制学习。如果你使用那个链接,我会收取你一部分会员费,不需要你额外付费。这将帮助我支持我的写作努力:)

此外,这是我所有数据科学文章的代码+资源库。如果你愿意的话,一定要去看看!

我的另一篇基于 jupyter 的文章你可能想读一读,它与这篇文章有关:

https://pub.towardsai.net/7-awesome-jupyter-utilities-that-you-should-be-aware-of-f3afdb75c2b

想要确保您在终端中更高效,同时美化终端吗?这是给你的文章:

你需要的唯一一本书是高级机器学习策略

原文:https://towardsdatascience.com/the-only-book-you-need-to-ace-advanced-machine-learning-strategy-8d48ddbbe73d?source=collection_archive---------3-----------------------

剧透:这是吴恩达的杰作,而且是免费的。

图片由 Pchvector 在 Freepik 上提供

“如果你只看别人都在看的书,你只能想别人都在想的事。”—村上春树。

如果您刚开始接触数据科学,这篇文章可能不适合您。我仍然爱你,并写了你应该阅读的 3 本适合初学者的数据科学书籍,许多初学者都很喜欢。我建议你把这个故事留到以后再说。

但是如果你在这个领域已经呆了足够长的时间会怎么样呢?如果你在初级水平之外寻求更多的知识呢?如果你想快速提升自己成为人工智能领域的领导者,该怎么办?

我听到了。我也有类似的愿望。当我最终在获得数据科学的高级职位时,我的任务是掌控项目的方向。执行项目是一回事,但制定战略和为问题创造解决方案是另一回事。

“技术策略”是人工智能中讨论最少的话题之一。大概是因为业内很少有人有足够的经验和公信力来谈吧。

如果我们想脱颖而出,我们需要超越人群。换句话说,当我们看到像吴恩达这样的人教授“人工智能工程师的技术策略”时,我们应该学习它。

吴恩达的机器学习向往

来源: Goodreads

吴恩达开创了人工智能和机器学习的世界。从推出 Coursera 和他著名的机器学习课程,到 Deeplearning.ai 和各种 ai 课程,他教育了很多像我一样自学成才的机器学习工程师。

在所有这些受欢迎的资源中,这本书仍然是一个难得的发现。尚未出版,这本书的草稿已经在他的网站上放了好几年了。

不过你不必等待,在他的网站上注册就可以免费下载 pdf 版本。如果这还不够令人信服,有几个理由让你应该读这本书。

它不是你在任何地方都能找到的典型的技术机器学习书籍。

蒂姆·丹宁(Tim Denning)筛选了我的个人资料,告诉我可以在几周内用我已经拥有的所有内容写一本机器学习书。

我从未想过这个问题,但他可能是对的。但我永远也写不出像《机器学习的渴望》这样的东西。见鬼,世界上只有少数人能传递这种智慧。

这本书不是你遇到的典型的教程或动手操作书。这本书更多。它包含了在其他地方很难找到的实用见解。大多数书会教你算法如何工作,但这本书告诉你如何(以及何时)使用它们。

Andrew 写的是技术性的东西,没有太多的理论或编码,更侧重于实用的建议和方法。无论他的写作是多么简单和简洁,这本书是先进的,抓住所有的内容;你需要有这方面的经验。

如果你正在读这篇文章,但是觉得自己还没有到那一步,不要担心。不用急,你可以留着以后用。

你被置于每个高级机器学习工程师面临的最实际的情况中。

这本书以一个相关的故事开始。你会觉得安德鲁在直接和你说话。

你想建立一个系统,为爱猫人士提供源源不断的猫图片。你原型化一个神经网络,从任何图片中检测出猫的图片。但是,有一个问题——系统的性能似乎并不令人满意。

离你的用户想要的“世界级”还差得很远。你的神奇团队想出了一打主意。你不知道该遵循哪个想法,该忽略哪个。

有两种情况可能发生——要么你建立了世界一流的 cat 检测平台,要么你走错了方向,浪费了几个月甚至几年的时间。

去年我在建造一个合成数据生成器,一个错误的方向会让我浪费几个月的时间。上个月,我正在构建一个个性化引擎,也遇到了类似的情况。这本书基本上回答了每个首席 ML 工程师都会有的紧迫问题。

不是每个团队成员都会理解你的推理背后的基本原理,这没关系。我建议你与你的初级团队成员分享这本书的部分内容,并在会议期间带领他们阅读简短的章节。

如果只要看一遍这本书就能借用多年的资深经验,为什么不呢?

读完这本书后,我领导和设计项目的能力大大提高了。

我的同事们(以一种好的方式)提到,我的经历似乎与我的年轻时代不符——我的秘密就是这样的书。

你有勇气指导这个项目,就好像你以前做过一样。事实上,你的自信来自于你只是在执行从安德鲁那里获得的智慧。

还有谁有他那样的经验和信誉?如果不是他,我可能一开始就不会开始从事数据科学。

换句话说,你只是通过看一遍书来借用多年的资深经验。我读了两遍。现在它已经牢牢印在我的脑海里了。

帮你自己一个忙,只读第一章。你就知道我在说什么了。

要获得更多关于进入数据科学、真实体验和学习的有用见解,请考虑 加入我的电子邮件好友私人列表

如果你很看重这类文章,想支持我这个作家,可以考虑 报名成为中会员 。每月 5 美元,你可以无限制地阅读媒体上的故事。

https://arunnthevapalan.medium.com/membership

您需要的唯一 VS 代码扩展

原文:https://towardsdatascience.com/the-only-vs-code-extension-you-will-ever-need-e095a6d09f24?source=collection_archive---------10-----------------------

如果您必须安装一个 Visual Code Studio 扩展,这就是它

图片来自 Pixabay

Visual Studio Code 是一个免费的、轻量级的、跨平台的代码编辑器。它可能不像 IntelliJ Idea 或 PyCharm 那样是一个成熟的 IDE,但它是一个强大的、不受干扰的工具,拥有专门的粉丝群和蓬勃发展的生态系统。

VS 代码自带对 JavaScript、TypeScript、Node.js 的内置支持,但是你可以扩展它来支持很多其他语言(Python、C++、Go);大量功能强大的附加组件可以让 VS 代码成为最终的开发环境。

然而,在这个故事中,我认为你只需要一个 VS 代码扩展。它将保持您的环境整洁,并且您的项目是隔离的和可维护的。它可以让你在任何地方从事任何项目。一个可以让你与团队中的任何人毫无争议地合作的平台。欢迎来到远程开发的美丽世界。

学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!

VS 代码的远程开发

Visual Studio 代码的远程开发扩展是您在本地 VS 代码设置中需要安装的唯一扩展。该扩展将允许您:

  • 在您想要的开发环境中工作;需要更多资源吗?一个特定的 Linux 发行版?专门的硬件?没问题。
  • 在隔离的空间中用沙箱保护您的项目,这样项目 x 的依赖项就不会干扰项目 y 的依赖项。
  • 与您的团队成员协作或帮助新员工完成入职流程。

实际上,远程开发扩展是不同工具的包装器,您可以根据需要单独安装这些工具:

  • 远程容器 : 通过打开安装在或位于容器内的文件夹,使用基于沙盒容器的应用程序。
  • 远程 SSH :通过使用 SSH 打开远程机器上的文件夹,在任何位置处理源代码。*
  • 远程 WSL :连接到 WSL 1.0 或 2.0,在 Linux 驱动的开发环境中舒适地使用 Windows。

注意:远程 SSH 扩展支持 x86_64、ARMv7l (AArch32)和 ARMv8l (AArch64)基于 glibc 的 Linux、Windows 10/Server (1803+)和 macOS 10.14+ (Mojave) SSH 主机。

这个故事将主要描述如何使用远程容器,保持您的开发环境在本地。使用远程 SSH 非常相似,我将跳过远程 WSL,因为它只对 Windows 用户可用。如果你想了解更多关于 Windows 和 WSL 2.0 的内容,请看下面的故事。

使用容器

不要让不同的编程语言、包及其依赖项污染您的本地环境,您可以将您的项目分离到不同的容器中。

这个故事将使用一个简单的 Ubuntu 20.04图像,它可能是一个项目的基础图像。用于创建该图像的 docker 文件可以像下面这样简单:

在这个 Dockerfile 中,我们从官方的 Ubuntu 20.04镜像开始,安装我们可能需要的常用 Linux 包,比如vimwgetcurl添加几个环境变量,就万事俱备了。用docker build建立这个形象:

docker build -t <tag-name> .

接下来,要使用这个映像启动一个容器,输入下面的命令,假设您已经将它标记为ubuntu-base:latest:

docker run -it --name ubuntu ubuntu-base bash

--it参数指示 Docker 以交互模式启动容器并运行bash命令。这很重要。否则,由于 docker 文件中没有指定CMDENTRYPOINT,容器将立即启动和终止。

另一方面,如果你退出容器内的bash单元格,容器将再次停止。但这不是问题。我们将看到 VS 代码可以启动停止的容器并连接到它们。

您可以随意使用此基本图像;您可以将它作为您构建的其他 Docker 映像的基础映像,或者直接运行它并手动安装您需要的任何映像。有待观察的是你如何通过 VS 代码连接到它并开始工作。

连接到容器

要通过 VS 代码连接到一个正在运行的容器,首先,安装远程开发扩展。这真的很简单;从左侧面板(ctrl+shift+x)中选择Extensions选项卡,并搜索远程开发。通常,这是第一个结果,所以选择它并单击安装。几秒钟后,远程开发将作为一个新的选项卡出现在左侧面板中。

远程开发选项卡—按作者分类的图像

要连接到容器,选择它,从顶部的下拉列表中选择containers,右键单击您选择的容器,然后单击Attach to Container

附加到容器-作者提供的图像

就这么简单!现在你可以打开集成终端,开始黑了:安装你选择的编程语言,git clone你的项目,安装它的依赖项,开发新特性。此外,您现在可以安装更多对这个项目有用的 VS 代码扩展。这些扩展只安装在这个环境中,保持您的本地安装干净。

然而,这通常只适用于本地开发;如果你想要更强大的东西呢?更多内存、CPU 能力还是 GPU?如果你以某种方式构建了 Docker 映像,主要的云提供商,如 GCP,允许你从 Docker 映像启动虚拟机。因此,您可以启动一台与您的本地环境完全相似但功能更强大的远程机器。然后,您可以使用远程 SSH 连接到它,并从您离开的地方继续!

Visual Studio 代码是一个免费的、轻量级的、跨平台的代码编辑器。大量功能强大的附加组件可以将它变成一个成熟的 IDE,但是安装那些可能只使用一次的扩展是没有意义的。

因此,远程开发可能是您可能需要的唯一扩展。它将保持您的环境清洁和您的项目孤立。它将允许你在任何地方从事任何项目,并允许你与团队中的任何人合作,没有任何麻烦。

关于作者

我叫迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。此外,请访问我的网站上的资源页面,这里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!

openclean 开源数据清理库

原文:https://towardsdatascience.com/the-openclean-open-source-data-cleaning-library-9c6b8540794f?source=collection_archive---------34-----------------------

将数据清理工具集成到一个环境中,对于数据科学家来说,该环境简单直观

Heiko müller、Sonia Castelo、Munaf Qazi 和 Juliana Freire 的联合作品

数据准备仍然是许多数据科学项目的主要瓶颈。2016 年一项被频繁引用的调查发现,数据科学家将 60%的时间花在数据清理和组织数据上。在同一调查中,57%的数据科学家还表示,他们认为数据清理和组织数据是他们工作中最不愉快的任务。

多年来,学术界和工业界开发了许多用于分析、准备和清理数据的工具(见[1,2]中的概述)。这些方法是孤立地、用不同的编程语言开发的,没有标准化的接口。因此,数据科学家很难结合现有的工具并在他们的数据处理管道中重用它们。

受通用机器学习框架(如 scikit-learn 、 TensorFlow 和 PyTorch 的广泛采用的启发,我们目前正在开发 openclean ,这是一个用于数据分析和数据清理的开源 Python 库。 openclean 的源代码可以在 GitHub 上获得。

我们的 openclean 目标有两个。首先,我们旨在为从业者提供一个统一的框架,将开源数据分析和数据清理工具整合到一个易于使用的环境中。通过向大型用户社区提供现有工具,并通过与丰富的 Python 生态系统集成, openclean 有可能简化数据清理任务。第二,通过提供一个结构化的、可扩展的框架, openclean 可以作为一个平台,研究者和开发者可以贡献他们的技术。我们希望通过将用户、开发人员和研究人员聚集在一起,我们将能够更好地应对处理数据质量的诸多挑战。

openclean 有许多特性可以让数据争论变得简单明了。它尤其在以下领域大放异彩:

  • 数据剖析 : openclean 附带一个剖析器,为用户提供关于数据质量的可操作指标。它允许用户通过提供从最小-最大频率到唯一性和熵计算的各种数据统计测量,及早发现可能的问题。
  • 数据清理&扯皮 : openclean 的操作员是专门为处理数据监管任务而创建的。它们有助于识别和呈现统计异常,修复函数依赖违规,定位和更新拼写错误,并妥善处理丢失的值。
  • 数据丰富 : openclean 与 Socrata 开放数据 API 和参考数据存储库无缝集成,使用户能够轻松访问可纳入数据清理流程的标准数据集。
  • 数据来源 : openclean 带有一个迷你版本控制引擎,允许用户维护其数据集的版本,并在任何时候提交、签出或回滚更改。

纽约市停车违规-数据剖析和数据清理示例

在下文中,我们将使用一个运行示例概述 openclean 中的基本操作符和概念。在 openclean 资源库中包含了一个 Jupyter 笔记本,其中包含了该示例的扩展和更详细的版本(安装说明参见自述文件)。

用于所有示例的数据集是纽约市停车违规发布—2014 财年,其中包含 2014 财年发布的违规。该数据集包含几个数据质量问题,是演示数据分析和数据清理步骤的绝佳示例。数据集包含 900 多万行,压缩后的数据文件大小约为 380 MB(未压缩时约为 1.7 GB)。

数据集和流

数据集可通过 Socrata 开放数据 API (SODA) 下载。为了下载数据集, openclean 包含了一个 SODA 包装器,通过 API 使用它们的唯一标识符提供对所有可用数据集的访问。例如,停车违规数据集具有唯一标识符jt7v-77mi。该标识符是数据集 Urlhttps://data . cityofnewyork . us/City-Government/Parking-Violations-Issued-Fiscal-Year-2014/jt7v-77mi的一部分。下面的代码以制表符分隔的 CSV 格式下载数据集,并将其存储在名为jt7v-77mi.tsv.gz的本地文件中。

openclean 主要用于表格数据集,表示为 pandas 数据框。下载数据集文件后,我们可以使用pandas.read_csv()功能将其作为数据框打开。这需要将整个数据集读入主存。对于大型数据集,这可能是不可行的,在某些情况下,我们不需要所有的数据。对于这些场景, openclean 的数据流操作符允许我们直接对从文件中读取的行流应用数据分析、过滤和转换操作。例如,创建的数据流有一个head()操作符,默认情况下,它将从数据集文件中返回前十行作为 pandas.DataFrame。

数据剖析

数据概要分析是许多数据分析工作中重要的第一步。分析有助于用户了解数据属性,并发现数据质量缺陷。 openclean 支持各种不同的数据分析操作符,这些操作符也可以用来生成关于手头数据的元数据。

我们可以使用默认的列分析器来计算基本的统计数据,例如不同值的数量、缺失值等。对于数据集中的每一列。在下面的例子中,我们使用 1000 行随机样本进行分析。结果是一个分析结果列表(字典)。然后可以使用stats()方法将结果摘要作为数据框进行访问。

openclean 被设计成可扩展的,以便于添加新的功能,以及定制数据分析和清理操作符。在前面的例子中,我们可以使用任何实现了open clean . profiling . base . data profiler类的分析器,而不是默认的分析器。一个例子是数据集市分析器(由 openclean 的笔记本扩展使用),与默认的列分析器相比,它提供了更丰富的元数据和更强大的数据类型检测(参见 GUI 中的讨论—与 Jupyter 笔记本集成)。

数据集列中的异常值和异常值

一个常见的分析任务是检测数据集中的异常值(异常)。在我们的例子中,我们关注单个列中的异常值。此示例查看列注册状态中的不同值。它显示该列总共包含 69 个值,这比美国的 50 个州还多,甚至比纽约市财政部发布的州代码列表多两个。

1\.  NY  7,029,804
2\.  NJ    878,677
3\.  PA    225,760
4\.  CT    136,973
...
66\.  YT        14
67\.  FO         9
68\.  NT         6
69\.  NF         1

识别无效值的一个解决方案是使用车牌州代码的管理列表。参考数据是数据清理的重要工具,而 openclean 支持使用不同的参考数据集。为此,我们创建了开源库 refdata 来提供对网上可用参考数据集的访问。单个数据集由数据维护者托管在他们选择的平台上。用户可以下载数据集的副本供本地访问。

官方的车牌州列表有 67 个值(包括美国的 50 个州,加拿大的省和地区,墨西哥,美国政府的车辆)。在下文中,我们将展示如何使用 openclean 的参考数据存储库来帮助识别参考列表中没有出现的注册状态列中的两个值。我们首先加载包含注册状态代码正式列表的数据集(auto_download标志确保如果数据集不存在于本地存储库中,它将被下载)。您可以使用refdata.repository().find()获得可用数据集的完整列表。加载数据集后,我们在 code 列中得到一个不同值的列表。如果您想获得包含整个数据集的数据框,可以使用df()。结果显示 99PR 是引用数据集中没有出现的两个值。

11\. 99     38,080
60\. PR        211

完整笔记本包含额外示例,展示如何使用 scikit-learn 中的统计异常值检测方法识别异常,这些方法可在 openclean 中访问。

数据标准化

数据标准化是另一项重要的数据准备工作。相同值的不同表示在许多数据集中是常见的,例如,由手动数据输入期间的拼写错误引起的。在下文中,我们展示了识别这种不同表示的两种方法:(1)聚类,以及(2)违反函数依赖。

关键冲突聚类

openclean 提供基于相似性对值进行分组的功能。该功能改编自 OpenRefine 集群。主要思想是识别不同但可能是同一实体的替代表示的值的集群。

openclean 中包含的一种聚类算法是关键冲突聚类。键冲突方法的主要思想是为每个值(即一个键)创建一个替代表示,然后根据它们的键对值进行分组。 openclean 上的默认密钥生成器是从 OpenRefine 采用的指纹。

在这个例子中,我们来看一下街道列,它包含发生停车违规的街道名称。由于不同的缩写、街道号码的不同表示等,街道地址列可能非常嘈杂。(例如 5 大道vs第五大道vs第五大道)。我们首先考虑由于不同的大写字母而导致的值的差异。然后,我们使用默认的键冲突聚类来生成街道名称的聚类,这些街道名称可能是同一条街道的不同表示。

下面我们展示了包含在生成的关键碰撞簇集中的一个簇。括号中的数字表示数据集中值的出现频率。

W 125 ST (x 3365)
W 125    ST (x 1)
W. 125 ST. (x 1)
W .125 ST (x 5)
W  125 ST (x 2)
W 125  ST (x 1)
W. 125 ST (x 3)

这个例子表明,默认的指纹密钥生成器已经提供了一些有希望的结果。然而,该方法遗漏了我们在美国街道地址列中发现的许多常见情况。几个例子是:

  • 街道类型的不同缩写,例如125 Stvs125 Strvs125 Street
  • 街道编号和街道类型之间缺少空格,例如 125St125 St
  • 街道编号的文本表示,例如第五大街第五大街第五大街

为了解决这些问题,openclean 的地理空间扩展包包含一个专门的密钥生成器和值标准化器,如下所示。例如,如果您想创建自己定制的密钥生成器,可以看看open clean . function . token . base . tokens类。

下面的代码使用定制的USStreetNameKey键生成器,并显示了为 West 125 Street 生成的集群中的一些值。总的来说,该分类包含 36 种不同的街道名称表示。该分类明显大于只有七个值的前一分类。这显示了 openclean 在使用领域特定功能进行定制方面的优势之一。

W 125 ST (x 3365)
W 125    ST (x 1)
W 125 STREET (x 451)
WEST 125 ST (x 522)
WEST 125TH ST (x 81)
W 125TH ST (x 11611)
WEST 125 STREET (x 354)
W 125 TH ST (x 18)
WEST 125TH STREET (x 73)
W 125TH STREET (x 169)

违反函数依赖关系

识别可能的不同表示的另一种方法是检测违反数据约束的值集。例如,车牌 ID登记状态的组合应该唯一地识别一辆车。对于每辆车,我们假设车辆颜色在一个财政年度内不会改变。因此,【车牌 ID登记状态决定车辆颜色的功能相关性应该成立。这种依赖性的违反指向相同颜色值的不同表示。请注意,即使这种依赖性并不是在所有情况下都成立,我们发现的大多数违规行为确实指向同一颜色的不同表示,而不是车辆颜色发生变化的情况。

下面是违反函数依赖的元组组的三个例子。在两种情况下,似乎(白色WH )和(棕色BR )代表相同的颜色,也就是说,给我们一个可能的映射指示,以标准化车辆颜色。第三个例子显示了这种方法的局限性,蓝色和棕色不太可能是同一种颜色。

Plate ID State Vehicle Color
85134MC  NY    WHITE
85134MC  NY    WH
85134MC  NY    WH
85134MC  NY    WHITEPlate ID State Vehicle Color
93310JT  NY    BROWN
93310JT  NY    BROWN
93310JT  NY    BR
93310JT  NY    BROWN
93310JT  NY    BROWNPlate ID State Vehicle Color
49744JG  NY    BLUE
49744JG  NY    BROWN
49744JG  NY    BROWN

GUI —与 Jupyter 笔记本的集成

数据分析和清理本质上是探索性的任务。在许多情况下,用户需要可视化数据和分析结果(统计数据),以更好地了解数据属性和现有的质量问题,或者可以通过检查机器学习模型的预测来识别数据质量问题。许多现有的清理工具,如 OpenRefine 或 Trifacta Data Wrangler 都带有图形用户界面(GUI ),使用户更容易浏览和清理他们的数据。

openclean 可以在许多不同的环境中使用,包括 Jupyter 笔记本电脑,而不是依赖于一个专用的 GUI。在 Python 或笔记本环境中工作允许用户更容易地将数据清理任务与其数据科学管道集成。除了利用现有库的能力, openclean 还提供了一个类似电子表格的 GUI,使用户能够可视化 Jupyter 笔记本中的数据并与之交互。

为了利用电子表格 GUI,被操作的数据集需要在open clean . engine . base . open clean engine对象的控制下。该对象协调 Javascript 前端和 openclean 后端之间的通信。它还维护所有应用的操作符的出处信息,并允许用户查看数据集以前的快照和回滚操作。

在这个例子中,我们来看看在街道清扫期间一天中什么时候更有可能收到停车罚单(违章代码 21 ),以及纽约市的五个区之间是否存在差异。我们首先选择感兴趣的数据,然后将数据框加载到数据库引擎对象中,该对象将所有数据集快照具体化为本地文件系统上的文件夹中的文件。数据库中的每个数据集都由唯一的名称标识(在我们的示例中为street _ cleaning _ violations)。

县代码和区名之间有 1:1 的映射关系,我们可以用它来修改数据,以便为区列获得更有意义的值。详情请看全笔记本。我们还将违规时间转换为 24 小时值。这可以使用下面的用户定义的time_to_hour24函数来完成。在这个例子中,我们还展示了如何向数据库对象注册函数。然后,用户可以在电子表格视图中使用所有注册的函数,并且可以将这些函数应用于数据集列。 openclean 还支持注册功能的具体化,这使得在不同的笔记本电脑中重复使用这些功能或在受信任的用户之间共享这些功能成为可能。

电子表格视图为数据分析和探索提供了易于使用的可视化效果。它显示每个列的分析结果,包括推断的数据类型和统计信息,如平均值、标准偏差和唯一值,以及不同的详细信息级别(紧凑视图、详细视图和列视图),以及列值和推断的列类型的直方图。

GUI 允许用户使用注册的函数在电子表格上应用变换运算符。应用函数的历史显示为电子表格视图的一部分,即配方。在这个例子中,我们使用了一个样本。配方一旦完成,就可以应用于整个数据集,或者使用应用按钮,或者在用户完成电子表格视图后检查整个数据集时。

为了结束我们的示例,我们演示了如何使用现有的 Python 可视化包(例如,本例中的 seaborn )来创建一个图表,显示在纽约市五个区中的每一个区,在一天的不同时间收到停车罚单(违章代码 21)的可能性。正如人们所料,这些罚单经常在上午发出,尽管在所有行政区,这种情况在上午 10 点发出的可能性似乎要小得多,这需要进一步调查,以了解这是否是由数据质量问题引起的。

摘要

这篇文章概述了 openclean 中的思想和基本操作符,这是一个用于数据清理和分析的开源 Python 库。 openclean 在一个简单直观的环境中集成了数据分析和清理工具。我们将 openclean 设计成可扩展的,并使其易于添加新功能。通过这样做,用户不仅可以更容易地访问最先进的算法来处理数据,还可以让研究人员整合他们的工作并评估其在实践中的有效性。在未来的帖子中,我们将讨论感兴趣的开发人员和研究人员如何将他们的数据分析和清理算法集成到 openclean 中。

要试用 openclean ,请查看 GitHub 库和示例笔记本。

承认

这项工作得到了 DARPA D3M 计划、国家科学基金会 OAC 奖-1640864 和 OAC 奖-1841471 以及 NYU·摩尔·斯隆数据科学环境的部分支持。

参考

[1] Ziawasch Abedjan、Lukasz Golab 和 Felix Naumann。剖析关系数据:一项调查(2015)。VLDB 日报,24,4。

[2]马兹哈尔·哈米德和费利克斯·瑙曼。数据准备:商业工具调查(2020)。西格蒙德记录。49, 3.

最初发表于【http://github.com】

美铁内部的机会:美国的铁路

原文:https://towardsdatascience.com/the-opportunity-within-amtrak-americas-railroad-b9c38ee9b8b8?source=collection_archive---------26-----------------------

使用交互式 Tableau 地图定位美国国家铁路客运公司的未来客户

迈克·彼得鲁奇在 Unsplash 上的照片

互动并探索本文中的动态地图

这个项目是如何开始的

每年节假日前后,我都会买一张从丹佛到中西部的往返机票回家。今年,怀着对气候焦虑的愉快心情,我试图找到限制我的航空旅行的方法,并决定登上 19 个小时的美国国家铁路客运公司火车回家过圣诞节。这让我想到:我一定不是唯一一个愿意增加旅行时间以减少环境影响的人。Grist 发现,在过去的 12 个月里,谷歌对“气候焦虑”的搜索量上升了 565%,对“我能为气候变化做些什么”的搜索量也出现了类似的飙升。最近一项针对全球 10,000 名年轻人的研究发现,三分之二的人对气候变化感到悲伤、害怕或焦虑。

在这种背景下,事实上,我不是唯一一个,我决定将我的第三个数据科学训练营项目集中在美国国家铁路客运公司——一个具有丰富潜力的低碳旅行选择。

美国国家铁路客运公司的挑战

这个来自 METIS bootcamp 业务模块的项目促使我们选择一个现实的业务问题,用数据驱动的解决方案来解决。美国国家铁路客运公司在很大程度上依赖政府补贴,尤其是自从 COVID 事件以来,乘客数量下降了 95%。该公司的预算非常紧张,每年都不可预测。该预算被分配给各种紧急问题—陈旧和不稳定的基础设施、人员配备、COVID 预防措施,当然还有财务支持和业务发展。考虑到这一点,我格外注意让我的方法变得现实——没有多余的花里胡哨,只有一个以低成本执行的可靠的数据驱动的策略。

为了在他们从 COVID 恢复后发展业务,美国国家铁路客运公司表示近期目标是吸引更多的骑手,尤其是年轻骑手。我相信他们有办法做到这一点,尽管他们财政紧张,通过向新的受众展示全新的信息。

为什么是美国国家铁路客运公司?

就能源效率而言,美国国家铁路客运公司比航空和汽车旅行更有优势。在他们的五年计划中,美国国家铁路客运公司声称他们比汽车旅行节能 47%,比飞机旅行节能 36%。他们继续设定减少排放的目标,并推出了新的“Acela”列车,其排放比车队中的其他列车更少。美国国家铁路客运公司还有许多便利设施,可以帮助说服潜在的年轻骑手选择更长的旅行时间——Wifi、食物、充足的空间、移动路线跟踪和最小的安全障碍。

那么,为什么美国的年轻人不涌向火车站呢?我只能推测一个普遍的答案,但我可以将我个人延迟使用美国国家铁路客运公司归因于缺乏意识。此外,在访问美国国家铁路客运公司的网站时,我并不清楚这是一个环境可持续的选择。

策略是这样的。

我的假设是,针对有气候意识的年轻航空旅客的环保广告将增加美国国家铁路客运公司的乘客量和收入。利用美国航空旅行、美国气候观点和学院/大学详细信息的各种数据集,我能够深入到一个小的特定人群,并以此为基础进行以气候为重点的广告宣传。

第一步:确定受欢迎的航线

(只是注意——接下来的几节附有交互式 Tableau 地图,不能在此嵌入。要动态地探索它们,请访问这个链接。)

首先,我关注的是美国国家铁路客运公司有明显潜力从航空公司抢走用户的航线。使用 2017 年至 2019 年的运输统计局航空市场数据集,该数据集每年对 10%的航班进行采样,我根据乘客数量确定了最受欢迎的美国航空目的地对,而不考虑路线的方向。然后,我筛选了这些路线——要考虑试点,它们必须短于 1000 英里,并且由现有的美国国家铁路客运公司站在 24 小时或更短的时间内提供服务。以下是符合这些标准的 32 条热门航线:

由现有美国国家铁路客运公司基础设施提供服务的受欢迎的航空旅行路线。图片作者。点击查看互动地图。

有趣的是,这些线路中的大部分是由美国国家铁路客运公司的“长途”线路提供服务的,这是在 COVID 期间被降低优先级的业务部门。随着它们继续复苏,这些长途线路可能会带来比以前想象的更大的机会。

第二步:找到容易接受的听众

随着高潜力路线的确定,重要的是要确保我们的广告将针对容易接受以气候为重点的信息的人群。美国各地对气候变化的看法大相径庭,我能够利用 2020 年气候观点研究来衡量我所经过的地区的人口心态。我把注意力集中在研究中三个同意/不同意的陈述上:全球变暖正在发生,我担心全球变暖,公民应该为解决全球变暖做更多的事情。对于每一个地理区域,我将人口与这些陈述的相应国家平均值的距离加在一起。例如,“全球变暖正在发生”的全国平均支持率为 72%。芝加哥地区显示了几乎 77%的一致性,我将他们额外的百分点合并为离陈述平均值的距离总和(对于芝加哥,三个选择的陈述的总和为+13.27%)。下图中较暗的区域显示了高于平均水平的一致性。要了解这一点,请在这里与地图互动。

然后我覆盖了仍在运行的美国国家铁路客运公司路线。我们可以看到,对于我们的一些航线,如芝加哥到丹佛,这两个目的地更有可能有接受气候信息的人口。而其他路线,如芝加哥到达拉斯,有一个目的地报告不太担心气候变化,可能更好地服务于一个不同焦点的广告活动。在这一点上,我也排除了一些长度的额外路线,只保留了 22 小时以下的路线。被排除的路线在下面用灰色标出。

气候变化意见数据显示,一些受众可能更容易接受关注气候的美国国家铁路客运公司广告。图片作者。在此与地图互动。

步骤 3:深入到试点人群

虽然所有的橙色路线可能都很有前途,但请记住,我们的预算非常紧张且不可预测。开始时,我们的广告难以置信地瞄准一小部分人,这将是最有利的。为了找到这些人,我调出了我们选择的每个地区的住宿学院&大学数据。外州的大学生一般每年至少需要离开校园两次,我们有机会说服他们乘火车回家。在我们路线目的地的潜在学校中,我只选择了那些新生中至少有 5%是美国国家铁路客运公司路线另一端的州居民的学校。例如,伊利诺伊州有许多潜在的学校,但仔细观察后,很少有伊利诺伊州的大学生是科罗拉多州的居民,因此不需要美国国家铁路客运公司到丹佛的服务。

当我们只考虑学生需要选择美国国家铁路客运公司路线的学校时,我们总共有 49 个校园可以在假期前进行广告宣传。如果人数太多,我们可以通过筛选学生人数超过 5000 人的学校来提高投资回报率——总共 23 个校区。以下是我们对试点路线和校园的最终建议,其中校园用正方形表示。

试点气候广告活动的最终路线和学校建议。图片作者。在这里与这张地图互动。

为了进行快速的案例研究,以波士顿市为例。波士顿有许多学校,其中至少有 5%的新生居住在新泽西、DC 和宾夕法尼亚——我们选择的路线的目的地州。这些学生可能会开车或乘飞机回家,随着对美国国家铁路客运公司的环境影响和便利设施的更多了解,他们可能会被说服改乘铁路。

推荐试点校园的波士顿市。这些学校至少有 5%的新生来自我们路线终点的地方(新泽西州、DC、宾夕法尼亚州)。图片作者。在此与此地图互动。

接下来呢?

为了衡量这个项目的成功,我希望在我们选择的地区,18-35 岁的乘客增加 5%。鉴于试点和潜在的 A/B 测试的成功和失败,我们可以重新评估、重复和继续前进。然而,这里也有一个更复杂的解决方案的大好机会。

为了获得关于谁可能接受该信息的额外信心,美国国家铁路客运公司可以在预订购买时收集人口统计和以前的旅行模式数据(例如,年龄、新/老客户,如果这是你第一次来美国国家铁路客运公司,是什么促使你转向铁路旅行?).利用这些数据,我们可以建立一个预测模型,以了解哪些特征更有可能让人们转向铁路旅行。以这些数据为基础,我们可以改进上面的过程,以更准确地定位试点人群。

外卖食品

美国国家铁路客运公司正处于复苏和增长的关键时刻。无论是预测建模还是更基本的数据映射,美国国家铁路客运公司都有很大的潜力来增加乘客量,同时将美国的旅行习惯转向低碳未来。

感谢Maxen Haveles对本文的反馈。要浏览我的项目资源库, 请访问此链接。

视频编码技术综述

原文:https://towardsdatascience.com/the-overview-of-video-coding-technique-f650aed6c6a4?source=collection_archive---------16-----------------------

关键词-视频编码,视频压缩,图像压缩

视频编码是一种用于压缩和解压缩数字视频信号的技术。在视频压缩中,对摄像机记录的原始视频进行处理。通过压缩处理,视频大小显著减小。为了评估压缩过程的效率,选择了压缩比(CR)值。CR 值越高,压缩过程的效率越好。此外,同样重要的过程是解压缩视频数据。对压缩的结果执行解压缩。为了评估该解压缩过程的质量,选择了峰值信噪比(PSNR)值。该度量表示原始视频和解压缩视频之间的比较。PSNR 指数与解压缩视频的质量成比例。本文详细研究和评估了视频压缩技术。

图 1。视频编码技术概述流程图

图 1 是视频编码技术的概述流程图。在各种视频编码技术中,有一些压缩算法(离散余弦变换(DCT) /逆离散余弦变换(IDCT);量化(Q) /逆量化(IQ)运动估计(ME) /运动补偿(MC);熵编码(EC))被大多数视频编码标准所共享。

遵循图 1 中的结构,本文回顾了每一个压缩函数,它们是变换函数(DCT/IDCT 和其他相关算法)、量化函数(Q/IQ)、熵编码函数(游程长度、霍夫曼编码和其他相关方法)。

1.变换函数

变换功能用于将图像/帧数据从空间域转换到频域。本论文集中于已经讨论了五年的最新和最热门的技术。因此,选择 H.264 和 HEVC 进行深入分析。在一般的视频编码技术和 H.264,特别是 HEVC 中,变换基函数是从 DCT [1]中导出的。

定义:离散余弦变换是对空间域中的图像像素应用一种技术,将它们变换到可以识别冗余的频域[2]。

在视频压缩中,帧被分成大小从 44 到 6464 的块。一种图像压缩技术— JPEG [3]将图像分成 8*8 个块。然后,对每个 8×8 块应用二维离散余弦变换(DCT)。等式(1)是离散余弦变换函数。

在视频解压缩中,对 DCT 系数块应用逆离散余弦变换(IDCT)。等式(2)是 IDCT 函数。

其中 f_k 和 F_k 分别是像素值和 DCT 系数,是块索引,并且

未压缩/原始以及无损压缩数字图像需要高存储器和带宽。DCT 大大减少了内存和带宽的数量。图 2 是 DCT 系数的一个例子。

图二。DCT 系数示例[4]

在图 2 中,左边的图像——明显是一个字母——是像素值。右边的图像——模糊的图像——是 DCT 系数。

在 HEVC 标准的视频编码 H.264 中,对每一帧应用 DCT。在视频帧内编码中,DCT 应用于像素值。此外,在帧间编码中,DCT 是根据残差值计算的。而且,IDCT 是将 DCT 系数逆变换为图像像素值。在图 8 中,对帧像素值的每个块使用 DCT 函数;IDCT 在 IQ 函数之后应用。

2.量化函数

定义:量化是将一个值表示为一个小数位数固定的数的必然结果[5]。

在视频编码中,根据 DCT 系数,量化标度码被量化矩阵逐元素分割,并对每个结果元素进行舍入。量化参数( )决定了将变换后的系数与有限的一组步长相关联的步长。在视频编码中,该值与 CR 成正比,与 PSNR 值成反比。对于 DC 值——在两个维度上具有零频率的值,等式(3)和(4)是量化,并且逆量化公式被应用于变换的信号。另一方面,等式(5)和(6)是利用 AC 值进行帧内和帧间编码的量化公式,剩余的值具有非零频率。等式(7)是标准中使用的逆量化公式。

其中δ是量化参数,F_k_(x,y)是 DCT 变换后的信号,并且是块索引。在视频编码中,DC 是值 x=y=0,AC 是{(0,1),…,(n,n)}的值(x,y)成员,n 是块大小。

图 3 显示了应用于灰度图像的 DCT/Q/IQ/IDCT 流的示例。原始图像被分成 8×8 的块。每个块通过一个接一个的步骤进行编码:第一步是 DCT 变换;然后,用 Q 函数对 DCT 系数进行量化。图形底部块由 IQ 和 IDCT 函数重建。

图 3。DCT 和 Q 流的例子[6]

在视频编码中,图 3 中的流程应用于帧内编码过程的每一帧。此外,对于帧间编码处理,运动估计处理应用于 P 帧。

3.运动估计和运动补偿

本小节介绍运动估计(ME)和运动补偿(MC)功能,它们是帧间编码的最重要部分。视频编码使用运动来根据一帧对另一帧进行编码。运动估计使用块运动估计技术的概念,其通过其它帧的修改形式来编码帧数据。图 4 显示了运动估计概念。概念目标是找到两个帧中区域之间的最佳匹配。

图 4。运动估计的概念[7]

运动估计的输入是宏块和搜索区域。ME 执行使用搜索算法计算运动矢量的块运动估计。

对我来说,视频序列中的当前帧(I_t)被分成不重叠的像素块。对于当前帧中的每个块,确定前一帧(I_t-1)中尺寸的搜索窗口(S)内的最佳匹配块,其中是最大允许位移。当前帧中的模板块和前一帧中的最佳匹配块之间的位置差称为运动矢量(MV)。

最简单和最基本的搜索方法是使用全搜索(FS)算法。FS 包括处理搜索范围内的所有像素,以通过成本函数找到最佳块匹配。在 H.264 和 HEVC 中,选择 SAD 是因为它比其他成本函数使用更少的资源,同时还具有较低的失真,因此是可接受的[8][9]。等式(8)考虑当前帧中位置(x,y)处的模板块和前一帧(I_t-1)中位置(x+u,y+v)处的候选块。

其中 g_t(。)是当前帧 I_t 中的像素值,g_t-1(。)是前一帧 I_t-1 中的像素值。

(u,v)中的运动向量(MV)被定义为等式(9)。

4.熵编码

定义:熵编码是一种与介质具体特性无关的无损数据压缩方案。熵编码为输入中的每个唯一符号创建并分配一个唯一的前缀码[10]。

图 5。图像/视频压缩中的熵编码[10]

图 5 显示了图像/视频压缩过程中的熵编码,这是编码器中的最后一步,也是解码器中的第一步。对来自每个宏块的量化结果执行熵编码。因此,熵编码是对 CR 和 PSNR 值产生显著影响的重要步骤。

参考资料:

[1] D. R. Bull,“视频编码标准”,载于通信图片,爱思唯尔,2014 年,第 411–449 页。

[2] B .(编辑).(2006).D. C. T. (DCT) B.-E. of M .(第 203-205 页)。美国 https://doi.org/10. 1007/。-387–30038–4 _ 61 Furht,“离散余弦变换(DCT) BT —多媒体百科全书”,B. Furht,编辑。马萨诸塞州波士顿:斯普林格美国出版社,2006 年,第 203-205 页。

[3] I.-T. R. T.81,“ISO/IEC 10918-1:信息技术-连续色调静态图像的数字压缩和编码-要求和指南。”第 186 页,1994 年,访问日期:2021 年 1 月 30 日。【在线】。可用城市:https://www.iso.org/standard/18902.html.

[4]“文件:Letter-a-8x8.png —维基共享。”https://commons.wikimedia.org/wiki/File:Letter-a-8x8.png(2021 年 7 月 12 日访问)。

[5] R. A. Cottis,“用于腐蚀监测的电化学噪声”,技术。科罗斯。莫尼特。,第 86–110 页,2008 年 1 月,doi: 10.1533/9781845694050.1.86。

[6] D. R. Bull,“视频编码简介”,第 5 卷,第 3–26 页,2014 年 1 月,doi:10.1016/B978–0–12–420149–1.00001–6。

[7] M. Wolf,“网络和多处理器”, Comput。作为组件,第 409–457 页,2012 年 1 月,doi:10.1016/B978–0–12–388436–7.00008–8。

[8]郑俊杰,赵力宇,郭杰峰,陈,董东辉,“超高清视频编码中可变块大小运动估计的硬件高效块匹配算法及其硬件设计”, ACM Trans .德斯。Autom。电子。系统。,第 24 卷,第 2 期,第 1–21 页,2019 年 1 月,doi: 10.1145/3290408。

[9] M. Nagaraju、S. K. Gupta、V. Bhadauria 和 D. Shukla,“用于 HEVC 运动估计的高效混合并行流水线 SAD 架构的设计和实现”,载于电气工程讲义,2021 年,第 683 卷,第 605–621 页,doi:10.1007/978–981–15–6840–4 _ 50。

[10]陆志明、郭世志,“简介”,载于图像中的无损信息隐藏,新进展,2017 年,第 1–68 页。

论文:《客户终身价值预测的深度概率模型》

原文:https://towardsdatascience.com/the-paper-a-deep-probabilistic-model-for-customer-lifetime-value-prediction-eb5d61a83ecd?source=collection_archive---------3-----------------------

贯穿论文的神经网络结构和损失函数

内容

  • 关于
  • 论文概述
  • 深潜:架构-输出层
  • 深潜:ZILN 损失
  • 总结

关于

预测客户的终身价值(LTV)可能是一项相当具有挑战性的任务。王、刘和苗建议使用一个混合损失的神经网络来处理新客户流失和终身价值建模的复杂性。

在这篇博文中,我们将看看他们提出的解决方案,并探讨他们想法背后的推理过程。第一部分简要总结了生命周期价值建模的重要性和挑战。它还着眼于王,刘和苗如何处理这些问题,并快速浏览他们的论文的结果。然后,第二部分深入研究他们选择的架构,特别是输出层。最后,最后一节更详细地介绍了建议的损失函数。

这篇文章无意做深入的数学解释;而是旨在为论文提供一个更高层次、更容易理解的解释。

论文概述

为什么终身价值和流失很重要?对客户未来购买行为的准确洞察可以支持各种运营和战略业务活动。例如,它可以根据客户的 LTV 对客户进行细分,并针对特定的客户群提供不同的优惠和忠诚度计划,从而提高资源使用效率,从而帮助公司留住客户。

图 1 显示了一个典型的偏斜 LTV 分布。LTV=0 的大量统计数据表明,有很大比例的顾客曾有过不愉快经历(他们购买了一种产品,然后就再也没有回来过)。为了更好地显示回头客,x 轴显示为(LTV+1)的对数。这表明,回头客的终身消费之间的范围变化很大。一小部分高消费人群有时可以占据大量的业务收入。这种一次性消费人群占很大比例、少数消费群体相当庞大的分布对传统的均方误差方法提出了挑战。你会在下面深入他们的损失函数的章节中看到更多的细节。

图 1 |作者图片,灵感来自论文中的图 1

通常,LTV 和流失建模是分开进行的(图 2,左)。然而,王、刘和苗的方法允许他们同时处理客户流失和 LTV 预测(图 2,右)。

图 2 |作者图片

他们建议使用“零点质量和对数正态分布的混合物”,称之为零膨胀对数正态分布(ZILN),而不是分别研究 LTV 和流失分布。然后,他们通过取 ZILN 分布的负对数似然来导出混合损失,然后用它来训练他们的神经网络同时完成这两项任务。信息太多?别担心。我们将在下面更详细地了解什么是损失函数以及 ZILN 是如何工作的。你现在应该做的是,你可以用一个模型来预测两个任务:客户流失和 LTV。

王、刘和苗测量他们的方法在两个子任务上的性能。虽然流失预测实现了与经典二元分类损失相当的性能,但他们的 LTV 预测任务在三个不同的评估指标上优于传统的均方误差(MSE)方法。我们不会在这篇文章中剖析他们的评估指标,但是如果你想更多地了解他们的结果,你可以看看他们的论文。

深入探讨:架构—输出层

如上所述,王、刘和苗在他们的模型中使用了神经网络。他们选择了一个简单的前馈神经网络,第一个隐藏层有 64 个单元,第二个隐藏层有 32 个单元。参见下面的图 3。这些隐藏单元使用 ReLu 激活功能。数字输入被直接输入,而分类输入被编码为嵌入。我们将集中在输出层,因为这些单元对我们将在下面讨论的损失函数是有意义的。

图 3 |作者图片

输出层有一个单元 p 来预测某人是否搅拌的概率。用于表示该概率的激活函数是 sigmoid 函数。该函数适用于输出概率,因为其输出值的范围在 0 到 1 之间。典型的阈值是 0.5。低于 0.5 的预测将是仍然活着的客户,而高于 0.5 的预测将被预测为被搅动。请参见下面的图 4。

图 4 |作者图片

另一方面,LTV 需要两个单位。一个单元预测一个 位置参数 μ ,另一个单元预测一个 比例参数 σ 。然后,我们使用这两个参数来定义一个完整的预测分布,这反过来为我们提供了一个与我们的预测相关的不确定性度量(不确定性可以通过使用我们的预测分布的分位数来估计)。这两个输出μ和σ 不应被误认为 与更熟悉的平均值和正态分布的标准偏差。

μ单位在范围或符号方面没有限制。因此,王、刘和苗选择对μ使用恒等函数。这意味着它只是输出神经网络μ单位的预测值,而不通过激活函数运行它。

比例参数σ应该只能返回正输出。像指数这样的普通函数可以解决这种正约束,但由于其急剧增长,很容易导致爆炸梯度。王、刘和苗选择了一个没有指数函数那样急剧增长的 softplus 激活函数。然而,当训练他们的模型时,单独的 softplus 似乎不足以避免这种不稳定性,所以他们还应用了渐变剪辑。

图 5 |作者图片

输出层最终看起来如图 6 所示。流失只需要一个概率值 p ,而 LTV 既有 μ 又有 σ 。通过学习使用一个模型来表示多个任务(客户流失和 LTV ),这个网络的中间层学习更好地概括每个子任务。如果你想了解更多这方面的内容,请阅读这里的多任务学习。

图 6 |作者图片

深潜:零损失

为了训练这个网络,我们最小化神经网络的预测和来自数据的实际目标值之间的误差。在我们的例子中,这意味着我们将预测的流失概率与实际流失值进行比较。这种性能测量被称为损失。

根据你想要达到的目标,你使用不同的损失函数来优化你的神经网络。假设上面的架构结合了两个任务,我们将需要一个为每个子任务定制的损失函数。

两种常见的损失函数是二元交叉熵(BCE)损失和均方误差(MSE)损失。BCE 用于二元分类任务,在这种任务中,您试图预测某事是真还是假;意味着只有两种状态。在我们的情况下,这将是是否有人搅拌或没有。然后是 MSE,这是回归问题中常用的损失,在这种情况下,你试图预测一个连续的值,如工资,股票或在我们的情况下,LTV。

二元交叉熵损失——流失

对于神经网络的搅动任务,王、刘和苗使用 BCE 损失:

yᵢ是真正的目标值(1 代表客户流失,0 代表无客户流失),pᵢ是 yᵢ=客户流失的预测概率,而(1-pᵢ)正好相反(无客户流失)

在我们的例子中,目标是正确地分类客户流失(类别 1)和无客户流失(类别 0)。我们需要一种方法在一个函数中处理这两个类,并对错误的预测施加更高的惩罚。这是通过仅激活损失函数的一部分,同时保持另一部分去激活来实现的。使用对数可以使错误的预测产生更大的误差。让我们看一个例子来阐明这一点。

为了简单起见,我们只看一个观察值,其中我们有属于类 1 的真实观察值(搅动,y₁=1),这移除了求和,我们剩下:

现在让我们假设我们的模型预测这个观察结果以 0.95 的概率被搅动(p₁=0.95).这意味着我们的观察会产生以下误差:

这表明只有等式的第一部分被激活,另一部分(乘以 0)被抵消。因此,我们只剩下概率的 log()了,当 pᵢ接近 1 时,它给出了很小的损失值,当我们的概率越接近 0 时,损失值就越大(就像我们预测错误的类别一样),见下图 8(左)。在我们的例子中,我们的概率为 0.95,因此我们的观察结果的误差值为 0.051。相反,如果我们的真实值现在是 0 而不是 1,那么损失函数的另一部分激活,如果我们仍然预测它是以 0.95 的概率流失(=1),那么我们最终会有 2.966 的大误差,见下面的图 9(右)。

图 7 |作者图片

下面的表 1 的前两行总结了这个例子。此外,该表还显示了损失函数在预测值为 0 且 pᵢ=0.01.为 0 的相反情况下的表现

表 1 |作者图片

这个例子应该给你一个大概的概念,为什么 BCE 在你预测一个类或者另一个类的任务中工作得很好。错误预测的误差如此之大,将迫使模型学习更好的表示方法,从而将模型预测性能的总体误差降至最低。

对数正态损失— LTV

如上所述,不是预测网络的 LTV 任务的单点估计,而是优选具有完整的预测分布。该分布可以让我们了解观测点在我们预测的 LTV 值周围的分布情况。王、刘和苗建议采用对数正态分布。上述两个参数μ和σ描述了分布的概率密度函数(PDF):

请参见下面的图 8。这种对数正态分布与典型的 LTV 数据非常相似:它是右偏的,从零开始,一直到正无穷大。因此,神经网络学习对数正态分布的参数是有意义的。

图 8 |作者图片

我们可以通过取对数正态分布的负对数似然来获得对数正态损失,见下面的损失函数。我们不会经历推导损失的步骤。主要思想是简单地将对数正态损失与经典的 MSE 损失进行比较,看看它与 MSE 有何不同。

xᵢ是我们的实际真值,μ & σ是对数正态概率分布的估计参数,n 是样本数

相对于 MSE 损失:

xᵢ是我们的实际真值,xᵢ是预测值,n 是样本数

我们来看几个例子。第一个例子将向我们展示这些损失在小预测值和大预测值上的差异。第二个例子将向我们展示当预测被高估或低估时它们是如何不同的。

【对数正态】看起来更像是相对的

我们有一种情况,对数正态分布的真实中值是 20,另一种情况,真实值是 20,000。下表比较了 MSE 损失和对数正态损失(具有两个不同的σ值)。我们可以看到, MSE 惩罚高消费人群(案例 2,损失:16,000,000) 比低消费人群(案例 1,损失:16)更严厉****。尽管与真实值的相对偏差相同,但情况 2 中的损失是情况 1 的 1,000,000 倍。

表 2 |作者图片

鉴于高价值客户通常比普通客户花费更多的数量级,MSE 不太适合这个问题。这将对我们的高价值客户的预测误差造成过度惩罚。另一方面,对数正态分布将普通消费客户的小差异视为高价值客户预测的大差异。

对数正态分布低估多于高估

这里,两种情况的真实值都是 20,但是在情况 1 中,我们低估了 6,而在情况 2 中,我们高估了 6。下表再次比较了两种情况下的不同损失。我们可以看到,MSE 对低估和高估的惩罚是一样的,而对数正态损失对低估的惩罚多于高估。

表 3 |作者图片

下面的图 9显示了这种不对称行为。虽然 MSE 在最小值附近是对称的,但它表明对数正态损耗随着σ的增加而变得更加不对称。****

图 9 |作者图片,灵感来自文中图 2

到目前为止,我们已经根据损失函数的中值对其进行了研究。中位数被定义为 exp(μ),这意味着我们在损失函数中使用μ=log(x)。然而,王、刘和苗建议将作为对数正态分布的平均值进行预测,即:

这意味着我们在损失函数中用 log(x)-σ /2 代替μ。损失仍然以与上述相同的方式表现。这造成的唯一区别是我们的预测偏向一个更高的数字。σ越大,我们预测的 LTV 就越高。例如,如果我们的真实值是 20,我们完美地预测了μ单位,但σ为 0.3,那么我们预测的 LTV 将大约为 23.2。σ仅为 0.01 的相同值将为我们提供大约 20.1 的 LTV 预测值(非常接近我们的真实值)。我们可以在下面的图 10中看到最小预测值的变化。

图 10 |作者图片,灵感来自论文中的图 2

使用对数正态分布时,均值和中值都是可行的方法。但是我们什么时候用对数正态代替 MSE 呢?当我们的真实值(LTV)的范围很大时,对数正态损失应被视为对 MSE 更有利,因为我们不希望大值受到更多惩罚。

零膨胀对数正态(ZILN)损失—流失和 LTV 一起

既然我们已经分别研究了不同的任务,那么得到 ZILN 混合物损失的最后一步是简单明了的。它只是上面两个损失的线性组合。参见下面的图 11。

图 11 |作者图片

王、刘和苗假设每个子任务的权重相等,因此损失函数最终看起来如下:

这意味着我们最终通过简单地最小化两个损失函数(BCE 和对数正态损失)的和来训练神经网络。

摘要

在这篇博文中,你已经看过了这篇文章:客户终身价值预测的深度概率模型,它提出了 LTV 建模的多任务方法。您研究了他们建议的输出单位以及相关的 BCE 和对数正态损失函数,这些函数结合起来会导致他们建议的 ZILN 损失。这种方法的好处是:**

  • 拥有 LTV 预测分布,而不是单点预测(这使您能够洞察预测的不确定性)
  • 由于多任务学习方法,对客户流失和 LTV 建模有更好的概括
  • 减少围绕构建、培训和维护两个独立模型的工程工作

这篇文章没有涉及的是如何将结果与其他模型进行比较,或者如何将这个模型应用到用例中。鉴于他们的代码可以在线获得,您应该能够使用它来模拟新客户的期望,或者使用 RNN 或 LSTM 等顺序神经网络架构来修改它以模拟随着时间推移的生命周期

参考

[1] X 王,T 刘,J 苗,客户终身价值预测的深度概率模型 (2019),谷歌研究出版物

脚注

对于从相同的最小 y 值开始的所有损失,减去每个损失本身的最小值,这就是 y 轴值不同于上表中直接损失计算的原因。

个人信息保护中的悖论

原文:https://towardsdatascience.com/the-paradox-in-protecting-personal-information-80fb2ebfa57?source=collection_archive---------54-----------------------

这是一个关于我们在数字世界中如何不同于在现实世界中保持相同标准的故事

上周末,当我和父亲走在马斯特里赫特的街道上时,他注意到了名牌是如何从房子里消失的。以前,大多数人都把自己的名字挂在门上。这一定让他很困扰,因为这是他第二次提到它。两周前我们在城里散步时,他也说过同样的话。你认为这是为什么?“我问。”我想是隐私问题,”他回答道。这让我开始思考。如果是关于隐私问题,这是一个相当有趣的悖论。

没有名字的数字—作者图片

为什么名牌正在消失?

名牌有时还是会出现。当他们这样做的时候,通常是闭门造车。就像有双扇门和一个门厅的公寓。这些主要是帮助邮递员和访客按正确的门铃,因为门铃太多了。在公寓大楼里,由大楼的管理人员安排一个名字标志通常是强制性的。

在网上搜索名牌会找到许多出售名牌的商店。考虑到供应量,这意味着它们肯定还有市场。人们喜欢他们为自己的家提供的个人风格,这有助于访问者更好地找到你,也有助于邮件发送者更好地处理不完整的地址。

进一步挖掘,我偶然发现一个论坛,有人在论坛上提出(2016 年)没有名牌的人一定有所隐瞒。考虑到近年来它们消失的速度,这种情况不能再继续下去了。除非每个人都有所隐瞒?

买名牌不是一次性的。它们可能会随着时间而改变。当你结婚,或者当你有了孩子,你可能想改变你的姓或名字牌上提到的名字。也许成本和麻烦对于附加值来说太大了?

在我遇到的所有论坛中,人们确实会回到隐私问题上来。就像名牌显示你是一个独居的女人所带来的风险。或者任何一个陌生人都有可能来到你的门前并知道你的名字。或者有不良企图的人可能会使用您的个人信息来欺骗您…

在物理世界里谨慎,但是数字世界呢?—作者图片

考虑隐私风险

我想知道的是,为什么我们在物理世界中善于保护我们的个人信息,但在数字世界中却不坚持同样的标准。

大多数网站让你接受他们的 cookies,反过来在互联网上跟踪你。尽管法律法规要求网站必须征得访问者的许可才能存储隐私敏感的 cookies,但他们设计的许可屏幕让你在意识到之前就点击“全部接受”。在不知道自己接受了什么的情况下。

当网站或应用程序提供“免费”服务时,我们似乎很乐意分享他们的个人信息:包括我们的姓名和地址。虽然我们不知道他们用我们的信息做什么。它将落在谁的手中。更不用说使用我们的个人信息创建的客户档案、大数据分析和算法了。

更糟糕的是,在很多情况下我们甚至没有选择。我们不得不与组织分享我们的个人信息,但我们并不能真正保证这些信息会被谨慎对待。以荷属 GGD 为例。为了进行 COVID 测试,他们收集了包括社会安全号码在内的个人信息。然后,他们发生了数据泄露。接受过 COVID 检测的人的个人信息在互联网上以很低的价格出售。不仅仅是他们的名字和地址,还有社会保险号。

那个陌生人可能无法通过走过你的家来获得你的个人信息,但很可能在互联网上获得。不仅仅是你的地址和名字。

结论

姓名标志正在从家庭中消失。即使在小村庄,它们也变得越来越不常见。如果隐私问题是它们消失的原因,那么为什么物理和数字世界会有这样的双重标准?下次你在网上被问到你的个人信息时,问问你自己,如果有人到你家来问你,你是否会轻易分享。如果你继续在网上分享个人信息,也许可以考虑把名字牌带回你家。这可能对你所在社区的社区建设有好处。

参考

rijksoverheid(2021 年 2 月 2 日),数据泄露 GGDhttps://www . rijksoverheid . nl/documenten/kamerstukken/2021/02/02/kamerbrief-in zake-stand-van-zaken-datalek-GGD

帕累托原则—作为一名数据科学家,有效地花费时间和精力

原文:https://towardsdatascience.com/the-pareto-principle-spending-time-and-energy-effectively-as-a-data-scientist-8d48f7cc2b0f?source=collection_archive---------22-----------------------

一小部分努力会带来大部分回报

帕累托原则指出,对于各种各样的情况,大约 80%的结果是由大约 20%的原因造成的。

事实证明这是广泛适用的,无论是你如何看待数据,还是你如何思考项目。

在 Unsplash 上由 Austin Distel 拍摄的照片

例子包括:

  • 大约 80%的错误报告通常是由大约 20%的错误引起的
  • 约 80%的医疗保健成本通常是由约 20%的患者造成的
  • 约 80%的用户交互通常来自约 20%的用户
  • 大约 80%的项目价值通常来自前 20%的努力

确切的百分比最终实际上是 80%还是 20%并不重要——存在差异或多或少极端的情况。要记住的重要一点是,很常见的情况是,一小部分原因导致了大部分影响。这应该是一个指导原则,无论是在考虑你如何建立你的机器学习模型的时候,还是在考虑你如何花费时间的时候。

一个权力分布,展示了分布的顶端有多大的影响力。图片由 Hay Kranen / PD 在维基媒体

帕累托原理与建立机器学习模型

机器学习模型的大部分性能通常来自于少量的努力。如果你想最大化你作为数据科学家的影响力,最好是创造许多最低可行的产品,而不是试图制造一个完美的产品。如果你用 20%的努力获得了大部分的价值,那么把前 20%的努力花在一堆不同的项目上,并产生更广泛的影响,可能会比花所有的时间去完善一个项目更好。让我们看看这可能出现的几个具体地方。

特征

通常很少有特征完成模型的大部分工作。有一种倾向,特别是在经验较少的人当中,寻找任何可能相关的数据,并将其投入机器学习模型。虽然包含数据是一个好主意,但是如果争论和添加额外的功能需要花费时间,你应该质疑它是否值得。你可能已经添加了最有影响力的功能,现在已经到了收益递减的时候了。

通常是几个最直接相关的特性完全决定了模型的性能。

以预测谁最有可能将图书馆的书过期为例。您可以使用关于图书类型的各种信息,也许是借阅者居住的社区,并根据借阅的图书提出一些创造性的功能来添加到模型中。但几乎可以肯定的是,主要特征都涉及一件事:借书人的还书历史。如果他们过去曾按时还书,他们就不太可能保留一本过期的书。如果他们曾经归还过过期的东西,他们下次更有可能过期。

这一点很重要,因为通常最简单、最容易使用的功能才是最有影响力的。根据不同的用例,花费大量时间访问创建其他功能所需的数据可能不会提高多少商业价值。

调整模型

超参数调优非常好——借助一点计算能力,您通常可以从模型中获得一些“免费”的额外性能。

但是,很容易花太多时间在上面。每当我看到一个学生学习超参数调优,他们通常会感到失望,在所有的时间和精力之后,它只对性能产生了微小的影响。通常,这是因为模型非常智能——在这一点上,大多数包为大多数应用程序使用合理的默认超参数,开箱即用也相当好。

超参数调优可能会提高一点性能(或者,如果缺省值恰好对您的特定问题非常不利的话,可能会提高很多)。但是你很快就达到了收益递减点。再次强调帕累托原则——你的第一点努力通常会让你成功。

您可以通过简单的超参数扫描快速建立并运行模型。如果你有一个管道可以运行一个大的超参数扫描并为你解决问题,这很好,但如果你缺乏计算资源来轻松设置并忘记网格搜索,这可能是值得的。如果模型非常重要,或者如果您稍后有一些停机时间,您可以随时返回并尝试针对问题进行更多的超参数调整。但是,当您可以转到下一个项目时,花费数周或数月来调整简单模型的超参数通常是没有意义的。

结论

帕累托原则是一个重要的指导原则:通常,在数据科学和生活中,少数人的努力将获得大多数的结果。作为一名数据科学家,你的时间是宝贵的,确保你明智地使用它。有时候,一种聪明的懒惰是完成事情的最好方式。

您可能感兴趣的其他文章

深度学习的过去、现在和未来

原文:https://towardsdatascience.com/the-past-present-and-future-of-deep-learning-adb4d60eaf24?source=collection_archive---------35-----------------------

一个关于深度学习从研究人脑到构建复杂算法的演变的小故事

弗兰克·罗森布拉特正在研究感知器(来源:康奈尔纪事报,稀有和手稿收藏部门)

TLDR;在这篇博客中,你将学习深度学习(DL)的理论方面以及它是如何发展的,从对人脑的研究到构建复杂的算法。接下来,您将看到一些由著名的深度学习人员进行的研究,他们当时在 DL 的领域播下了树苗,现在它已经长成一棵巨大的树。最后,将向您介绍深度学习已经站稳脚跟的应用和领域。

深度学习:简史

在过去的十年里,没有其他技术比人工智能更重要。斯坦福大学的 Andrew NG 称之为 【新电】 ,包括谷歌、微软和苹果在内的几家科技巨头已经改变了他们的商业战略,成为“人工智能优先”的公司。我们应该感谢深度学习带来的这一切。在开始之前,我们先了解一下 DL 是什么,以及其炒作背后的原因。

深度学习是人工智能的一个子集,是一种使用多个人工神经网络层提取和转换数据的计算机技术。这些层包含一组以特定状态存在的人工神经元。当数据被发送到这些层中时,每一层都从前面的层中获取输入,并逐步完善它们。然后,这些层通过算法进行训练,不断减少误差并提高预测的准确性。通过这种方式,网络学会执行特定的任务。

人工智能的类别(图片由作者提供)

与传统的人工智能和机器学习(ML)算法相比,DL 速度较慢,但更直接、更强大。因此,它们被用于不同的领域,从医学、科学、社会、制造、供应链、机器人等等,并且基于一种创新的模型:神经网络。如果你想知道 DL 可以追溯到什么时候,让我告诉你,它毕竟不是新的;它从 20 世纪 40 年代就存在了。让我们挖掘历史,看看这些是如何不时演变的。

麦卡洛克-皮茨模式

神经网络是由芝加哥大学的两位研究人员沃伦·麦卡洛和沃尔特·皮茨在 1944 年首次提出的,他们在 1952 年作为第一个认知科学系的创始成员搬到了麻省理工学院。他们的研究名为“神经活动内在思想的逻辑演算”,目的是了解大脑如何通过使用许多相互连接的细胞产生高度复杂的模式。同样的理论已经帮助他们使用电子电路模拟了一个简单的神经网络,这个神经网络是由一个真实的神经元激发的。根据学者们的说法,这篇论文被认为是人工神经网络的开端,尽管存在不同的意见和问题。

沃伦·麦卡洛克和沃尔特·皮茨(维基共享)

神经元的结构以它们命名为“MCP(麦卡洛克皮茨)神经元”MCP 神经元通常被称为 线性阈值门 ,因为它将输入分为两个不同的类别。数学上,线性阶跃函数定义为:

线性阈值门的数学定义(图片由作者提供)

  • y 表示输出
  • xi 代表输入信号
  • wi 代表一个神经元对应的权重
  • Zj 代表抑制输入
  • θ代表阈值

该函数被设计成任何抑制性输入的活动在任何时间点都完全阻止神经元的兴奋。

下图是伊藤·川口的线性门槛门。

伊藤·川口的线性门槛门的象征性插图

赫布边学习法则

1949 年,在 MCP 模型发明 6 年后,Donald O. Hebb 在他名为“的研究中强化了神经元的概念。由于他对深度学习的重大贡献,他也被称为神经网络之父。

唐纳德·赫布(SRC: UBC 开放收藏)

现在让我们看看赫布边规则是关于什么的;它指出,两个单元之间的联系应该随着这两个单元同时出现的频率的增加而加强。

为了理解这个规则,这里有一段摘自他的书的摘录,

“当细胞 A 的轴突足够接近以激发细胞 B,并重复或持续地参与激发它时,在一个或两个细胞中发生一些生长过程或代谢变化,从而作为激发 B 的细胞之一的效率增加。”

上述陈述描述了神经元活动如何影响神经元之间的连接,即突触可塑性。它提供了一种算法来更新神经网络中神经元连接的权重。总结他的研究,以下是从希伯恩学习机制中得出的三个主要结论:

  1. 神经网络中神经元连接之间的信息以权重的形式存储。
  2. 权重的更新与神经元的激活值的乘积成正比。
  3. 随着学习的进行,弱连接神经元的同时或重复激活逐渐改变强度和模式,导致更强的连接。

感知器

1957 年,在 MCP 模型和 Hebbian 规则成功后,心理学家 Frank Rosenblatt 提出了第一个可训练的神经网络,称为感知器。后来,他用感知器构造了一个电子装置,显示出根据联想主义进行学习的能力。

感知器的设计类似于现代神经网络,只是它只有一层,在输入层和输出层之间,用可调的权重和阈值将输入分为两种可能的输出类别。

罗森布拉特和感知机(维基共享资源)

他的大部分研究主要受到人类视觉环境的启发;让我们看看如何!

左:在(罗森布拉特,1958 年)中的感知器的组织图,右:现代机器学习文献中的典型感知器(Src: 关于 DL 的起源)

左边的图像解释了罗森布拉特感知机。它有四个单元,分别是感觉单元、投射单元、联想单元和反应单元。当输入被发送到视网膜时,信息被发送到投射区,然后投射区前进到感觉单元,然后传递到联想单元。该结构类似于现在神经网络中感知器的结构,如右图所示。

可以假设感知器与 MCP 模型非常相似;但是,主要区别如下:

在感知器中,神经元接受一个与突触权重相关的额外常数,称为偏差(b)。可以认为是对激活阈值的否定。

  • 突触权重不局限于一或正。因此,一些输入可能具有抑制性影响,从而允许一些输入比其他输入更多地影响神经元的输出。

在数学上,感知器所依赖的人工神经元的非线性由下式给出:

作者图片

不管公式是什么,感知器(和许多其他线性分类器)的判定边界由下式给出:

作者图片

或者,我们可以给出如下简洁的数学符号:

作者图片

这里有一个感知器的现代插图,解释了权重和偏见是如何与神经元联系在一起的:

作者图片

反向传播

反向传播学习技术是深度学习领域的重大突破之一。这种算法是在 20 世纪 70 年代引入的。然而,直到 1986 年大卫·鲁梅尔哈特、杰弗里·辛顿和罗纳德·威廉姆斯发表了著名的研究论文《通过反向传播错误学习表征》,它的重要性才被充分认识。

从左到右:大卫·鲁梅尔哈特·杰弗里·辛顿,国家队,前后传球(维基共享资源)

如果没有有效的神经网络反向传播技术,将深度学习网络训练到我们今天看到的深度将是不切实际的。反向传播可以被认为是现代神经网络和深度学习的基础。

该算法用于使用称为链规则的方法有效地训练神经网络。简而言之,在通过网络的每次正向传递之后,反向传播执行一次反向传递,同时调整模型的参数(权重和偏差)。反向传播的核心是关于网络中任何权重 w(或偏差 b)的成本函数 c 的偏导数∂C/∂w 的表达式。

"为什么对反向传播算法使用导数?"。

  1. 特定输入 x 的成本函数 C 的梯度是 C 的偏导数的向量。
  2. 利用这个成本函数的梯度,我们可以测量关于投入量变化的输出值的敏感性。换句话说,利用这个导数,我们可以理解成本函数的方向。
  3. 总之,梯度显示了参数 w(或 b)需要改变多少(正向或负向)来最小化 c。

显示如何计算渐变的图像(src)**

到目前为止,我们已经看到了深度学习先驱们做出的一些重要贡献。下图让我们对这个领域自 20 世纪 40 年代以来的发展有了一个总体的了解。正如我们所看到的,时间表非常紧凑,在一篇博文中涵盖所有这些内容是完全不现实的。如果你仍然有兴趣详细了解这一点,我建议你阅读这篇名为“关于深度学习的起源”的非凡研究,作者是王和比丘拉吉。

感谢 法维奥·巴斯克斯 这张令人敬畏的照片!

现在,让我们看看深度学习是如何发展到不同领域的,以及它们迄今为止各自的应用。

深度学习的领域和应用

现在的技术进步在很久以前是无法比拟的。我们从未想象过人性化的计算机、自动驾驶汽车以及医疗程序的改进。但是今天,随着深度学习的力量,这些成为了我们日常生活的一部分。现在让我们进一步了解深度学习跨领域的应用。

计算机视觉 : CV,简而言之就是提供帮助计算机“看”和理解图像、视频等数字内容的技术。下面是 DL 在计算机视觉中的一些应用。

  • 面部识别和鉴定
  • 卫星和无人机图像
  • 图像搜索优化
  • 图像超分辨率和着色
  • 引导自主车辆识别道路、行人、信号灯等。

自然语言处理(NLP): NLP 有助于理解与语言相关的复杂性,可能是句法、语义、音调差异、表达,甚至是讽刺。随着计算能力的提高,深度学习现在也能够识别和理解人类语言。像 Siri,Google Voice 这样的 AI 助手主要依靠 NLP 来处理信息。下面是它的几个应用。

  • 语音识别
  • 命名实体识别(识别名称、位置、地址和可能移动的文本)
  • 聊天机器人(问答)
  • 社交媒体上的情绪和情感检测

医学和生物学: 医学和生物学的进步,提供了海量的数据,如医学图像、基因信息、蛋白质序列等等。利用这些数据,正在开发几种基于深度学习的算法,这些算法被广泛用于生产,帮助医生、科学家和放射科医生。下面是一些通过 DL 取得突破的应用程序:

  • 医学图像分类(CT、MRI、X 射线图像)
  • 肿瘤分割
  • 蛋白质折叠和药物发现
  • 临床文本处理

游戏: DL 彻底改变了以前的游戏方式。DL 算法现在可以通过适应玩家的情绪和心理状态来与人类对战。感谢强化学习带来了试错学习的概念。

OpenAI 模型对战人类(来源:open ai)**

下面是一些广泛使用的应用程序:

  • 玩 NPC 的(不可玩角色)-机器人
  • 模拟复杂的相互作用
  • 视频图形处理
  • 游戏宇宙创造

参考资料:

  • 解释:神经网络
  • 用于反向传播的多线程软件模型
  • 感知器:大脑中信息存储和组织的概率模型
  • 关于深度学习的起源
  • 罗森布拉特的感知机,第一个现代神经网络|作者 Jean-Christophe B. Loiseau

感谢阅读!

利用机器学习理解英雄联盟

原文:https://towardsdatascience.com/the-path-to-a-victorious-league-of-legends-match-40d51a1a089e?source=collection_archive---------12-----------------------

特征系数和重要性分析

照片由艾拉唐在 Unsplash 拍摄

现在,我已经进入了数据科学训练营的第四个也是最后一个模块,我终于掌握了足够的知识,能够创建各种机器学习分类器。作为一个狂热的游戏玩家,我自然选择专注于我的第一个机器学习项目的电子竞技主题数据集。我选择的特定数据集是我在 Kaggle 上找到的一个英雄联盟比赛结果预测分类数据集。

规划我的方法

用于我们分析的数据集包含 9,879 个 10 分钟标记的快照,具有冠军杀戮、小黄人、龙、传令官等特征。从高排名(钻石级到大师级)竞技英雄联盟比赛。

发现这个数据集后,我最初的目标是创建一个现场下注预测器,它可以根据任何职业比赛前 10 分钟的数据预测职业英雄联盟比赛的结果。然而,因为我们的数据集是从单人队列比赛中收集的,这不会是职业比赛如何进行的最理想的指标。

尽管如此,由于钻石以上的等级通常被认为是高水平的游戏,如果我可以创建一个具有良好预测能力的模型,就有可能提取对游戏结果最有影响的特征的洞察力,目的是为任何寻求提高他/她的表现的英雄联盟玩家提供具体的建议。虽然我认为我已经知道了游戏的哪些方面是重要的,但我从未超过银牌肯定是有原因的…我想,“至少,也许通过这种数据驱动的方法,我可以发展自己对游戏的理解,最终达到更高的等级?”

在我的建模和分析结束时,使用逻辑回归预测比赛前 10 分钟的结果,我能够达到接近 73%的准确率,而使用 XGBoost 随机森林模型预测结果的准确率不到 72%。这很好,并且表明从职业比赛中收集数据可能是值得的,以潜在地获得一些对现场下注场景有意义的预测。更重要的是,因为我能够创建一个具有良好预测能力的模型,所以有可能提取关键的洞察力,了解游戏的每个元素对比赛结果的影响程度。

在我的 GitHub 页面上,您可以随意跟随完整的深度代码和分析。

分析

准备数据

由于数据集没有任何空值或重复值需要处理,清理过程相对容易。此外,大约 50%的观察结果是成功的,剩下的 50%是失败的。这完全消除了必须解决阶级不平衡的问题。现在,尽管在几个列中有异常值,我们将在我们的分析中保留它们,以便检查某些特征中的极端爆发如何对比赛的结果产生影响。

为了保持我们的机器学习模型的可解释性,我们将通过移除总黄金和经验等聚合特征,并仅包括玩家可以直接改进的游戏方面的个别特征,从原始特征的子集创建数据框架。

现在,让我们来看一下要素的关联热图,在使用逻辑回归模型之前,我们目前必须检查是否存在任何可能需要解决的多重共线性。

我们可以看到,尽管我们在创建此热点图之前从数据框中移除了聚合要素,但在 redFirstBlood、redKills 和 redDeaths 中仍然存在高度多重共线性。我们可以通过完全删除这些列来解决这个问题,因为直观上这些特性分别由 blueFirstBlood、blueDeaths 和 blueKills 封装。另外,请注意,我们的目标变量是 blueWins,这意味着我们关注的是通过摧毁红队的基地来影响蓝队获胜可能性的特征。

一旦我们删除这些列,我们会得到:

好多了。尽管 redAssists 和 blueAssists 确实与 blueDeaths 和 blueKills 有较高的相关性,但我们将把这些特征留在我们的数据框中,因为相关系数不是太高,而且助攻对比赛结果的影响对我们的整体分析仍然很重要。

建模

对于建模过程,我们通过一系列网格搜索进行迭代,以微调每个模型的超参数,同时解决可能存在的任何欠拟合或过拟合问题。现在,让我们看看逻辑回归模型的结果:

对于逻辑回归来说还不错!我们可以看到,在训练数据上,我们的宏观召回分数是 0.7215,在我们的测试数据上,我们的宏观召回分数是 0.7275,这意味着对于真正的胜利和失败,我们的模型正确预测了 72.75%。我们也不存在合身不足或合身过度的问题。

让我们将这些结果与 GridSearched XGBoost 随机森林模型的结果进行比较:

尽管我们使用了多个网格搜索来提高我们的召回分数,但我们可以看到分数的提高很小,我们在测试数据上的分数仍然略低。然而,由于我们确实有一个与我们的逻辑回归相似的分数,我们现在可以检查我们的 XGBoost 模型的特征重要性如何与我们的逻辑回归模型的特征系数相比较。

因为我们显示的单位是赔率的变化,所以我们可以将上述每个特征的标准差增加解释为 1,从而导致获胜赔率相应的百分比增加或减少。

解释结果

从上面的柱状图我们可以看出,我们的两个模型都将杀戮、死亡和助攻列为对比赛结果影响最大的因素。当我们创建一个杀死数与胜率的条形图时,我们可以看到 10 分钟标记的杀死数与最终胜率之间有明显的相关性。杀死的标准偏差是 3,所以我们可以将此解释为增加 3 次杀死导致胜算增加超过 100%。

在杀戮之后,我们看到这两个模型都认为龙的重要性明显高于传令官。因为龙的标准差是 0.48,所以我们可以把这理解为一次杀龙导致胜算增加 20%。

从这个条形图中,很容易看出,取决于团队是否在前 10 分钟内保护好龙,胜率有大约 22%的差异。

最后但同样重要的一点是,让我们来看看平均客户满意度的胜败对比:

任何休闲或竞技的英雄联盟玩家都应该知道,不需要像我们这里一样进行深入的数据分析,CS 是游戏中至关重要的一部分。我们的特征重要性和系数明确地将杀死小兵列为对比赛结果有很大影响的等级,但是我们的数据也显示在 10 分钟内杀死的小兵总数有大约 10 的差异。如果我们把它分成三个车道,每 10 分钟只有 3 个小黄人的差别。考虑到在比赛的前 10 分钟,每条通道总共有 107 只小黄人产卵,每条通道 3 只小黄人似乎没有太大的区别。一个被杀死的小兵的标准差接近 22 个小兵的事实进一步加强了这一概念,这意味着 CS 的增加将增加大约 25%的获胜几率。因此,我们可以看到,尽管我们的模型将 CS 列为在预测结果中具有高度重要性,但在这一特征中存在许多变化,因此很难准确地说出当我们增加一定数量的被杀死的小兵时,获胜的几率会增加多少。

最后

值得注意的是,这两个模型的准确率都没有超过 73%,我们所拥有的还远远不是比赛结果的完美预测。这意味着不可能肯定地得出上述发现是 100%真实的结论。

我们的发现表明,类似的分析也可以应用于从职业比赛中收集的数据,并且关于特定球队及其球员的额外信息可能会潜在地导致更好地执行预测分类器。

也就是说,我们的逻辑回归和 XGBoost 随机森林模型从这个分析中确实为任何寻求攀登排名的英雄联盟玩家提供了可操作的见解。通过使用逻辑回归模型中的特征系数,我们可以大致了解当我们增加每个特征时,获胜的几率会发生多大的变化。

虽然我被困在白银的原因可能纯粹是由于诅咒控制机制,但我相信我对游戏元素的理解的提高至少会让我更好地理解我的比赛结果。

对数据客观性的理解

原文:https://towardsdatascience.com/the-perception-of-objectivity-in-data-1abacf195b29?source=collection_archive---------32-----------------------

意见

我们应该如何利用数据做出决策

“我们相信上帝,所有其他人都必须带来数据。”
——爱德华·戴明博士

长期以来,数据被视为真理的来源。我们看到许多组织非常关注他们的数据战略,并渴望近年来更加“数据驱动”,但数据驱动到底意味着什么?当我们考虑基于数据做出决策时,我们假设数据将提供一定程度的客观性,并向我们展示正确的答案。但事实真的是这样吗?

让我们看看下面的数据点,

  • 高级数据科学家的平均收入比数据科学家高 50%

有资历和经验的人应该获得更高的薪酬,这似乎是显而易见和合乎逻辑的,市场对高级数据科学家给组织带来的价值给予了 50%的溢价。在此基础上,企业可能会开始在晋升方面做出薪酬决定。

但是这个数据点呢?

  • 男性的平均收入比女性高 16%

这告诉你什么?与其用同样的逻辑来推断男性比女性多带来 16%的价值,我们看到 16%是衡量职场性别差距的指标。任何体面的组织都应该分析他们现有的薪酬,确保这种不平等不存在,并找出任何潜在的问题。

布兰登·洛佩兹在 Unsplash 上的照片

客观数据,主观解读

这个例子强调,虽然数据点可能是客观的,但它们的解释远非如此。这个例子在几十年前可能会有不同的解释,不幸的是,我们还远远没有实现性别平等。这就引出了一个问题,当解释“数据驱动”的人远离客观、理性甚至逻辑时,“数据驱动”是否真的像我们希望的那样好。使用数据做出决策依赖于两个非常重要的假设,我们使用的数据代表我们做出决策所需的信息,我们可以做出更好的决策,因为我们可以从数据中发现确定的解决方案。我质疑这两个假设的有效性,因为这根本不是数据工作的方式,也不是我们做决定的方式。

我们不知道我们不知道什么

问任何一个以前处理过数据的人,他们都会告诉你数据是杂乱的。那么,一个人如何从认识到数据是杂乱的,到足够信任它们来构建完全依赖它们来决策的算法呢?我们希望相信,通过一点聪明的数据工程和数据科学,我们可以解开混乱,在统计的帮助下,我们可以概括出错误,一切又会好起来。虽然这可能是解决我们已知的数据问题的可行方法,但它不能解决我们不知道的问题,而这些问题才是真正危险的。

甚至在我们有数据可分析之前,数据就被收集了,但是很少有人质疑这些系统和过程的客观性,数据清理和汇总过程也是如此。每当我们与数据交互时,我们都会或隐或显地在数据中加入我们的主观性。我们决定哪些数据是重要的,哪些是不重要的,因为数据是现实的简化表示。被省略的内容即使不比包含的内容多,也同样重要,因为这种省略会转化为代表性的丧失。有多少社会问题仅仅因为没有收集到少数民族的数据而被忽视?有多少问题因为没有收集指标而被忽视?我们只是不知道自己不知道什么。

虽然几乎不可能确保绝对客观,但这不是实际问题。真正的危险在于它给决策者带来的客观性和虚假的自信感。由于数据可以有许多不同的解释方式,人们可以用它们来给他们的主观主张注入一种客观性的感觉。他们最多是诚实的错误,而且更多的时候,人们利用这种“客观性”来延续他们自己的议程。

数据中没有解决方案

我们似乎相信,只要有足够多的智能数据科学家、技术和数据,我们就能找到任何问题的解决方案。这种说法有很多细微差别,我想强调的两个是问题的本质和解决方案应该做什么。不是所有的问题都可以用数据来解决,因为数据只描述了过去,而解决方案是我们未来想要的。

我们以一个推荐问题为例。如果我们认为问题在于缺乏收视率或销量,那么一个解决方案就是向那些有相似品味的人推荐其他人喜欢的内容或项目。社交媒体和电子商务平台已经多次这样做了,但我们现在看到了人们浪费时间和金钱的问题,因为这些算法正在尽最大努力让我们观看另一个视频,滚动另一个页面,购买另一件商品。有人可能会说,这正是一家企业应该做的,或许确实如此(尽管这将是一种耻辱)。但我们必须认识到,这些数据并没有说明人们应该花更多的时间和金钱,也没有说明个性化推荐就是解决方案。数据只是说这些人过去看过或买过这些,仅此而已。是人们决定,解决方案应该以牺牲人们的时间和金钱为代价,最大限度地提高收视率、参与度和利润。

数据驱动的解决方案使人们能够将数据作为借口,因为人们认为数据在告诉我们应该做什么。数据的作用是提升人们需要做出的决定。我们不再需要考虑较低层次的实现细节,因为数据结合算法可以比我们做得更好,但这绝不是我们做出更重要的高层次决策的借口。我们在解决什么问题?好的解决方案是什么样的?我们需要使用哪些数据?我们在优化哪些指标?这些是我们现在需要问的问题,决定这些问题的责任完全在于我们,没有多少数据可以给我们出路。

那么我们该怎么办呢?

这并不是说使用数据来帮助决策是无用的,但这确实意味着我们需要重新思考数据在决策过程中的作用。这适用于个人做出的决定,但更适用于组织做出的决定,因为我们经常假设组织正在做出理性的决定,这些决定通常具有重大影响。数据能告诉我们一些关于过去的事情,但是我们为未来做决定。数据在处理低层决策方面做得很好,现在轮到我们有勇气做出高层决策,更重要的是承担决策的后果。我们看到决策者隐藏在这种错误的客观性背后,我们需要让他们承担责任,因为他们是决策者。在生活的某些方面,我们都是决策者,我们都受制于他人的决定,所以我们在一起。为了改善我们的社会,我们需要开始承担更多的责任,我们可以从认识到数据能做什么和我们需要做什么开始。

如果您喜欢我的内容,请在 https://jchoi.solutions/subscribehttps://jchoi.solutions/subscribe注册更多内容

初学者的完美 Python 备忘单

原文:https://towardsdatascience.com/the-perfect-python-cheatsheet-for-beginners-c7c16799de5?source=collection_archive---------19-----------------------

备忘单是有抱负的早期职业数据科学家的救命稻草。

照片由蔡文旭在 Unsplash 上拍摄

Python 是成为数据科学家可以学习的最简单的编程语言之一(另一种语言是 R),有大量免费的在线资源可以帮助您入门。学习 Python 成为数据科学家的过程可以大致分为三个科目:学习编程语言(通常是 Python)、数据分析(数据可视化、数学和统计)和机器学习(通过经验自动改进的算法)。

然而,第一步,学习如何编程可能需要太长时间,一些有抱负的数据科学家可能会对实现他们的专业目标感到气馁。为什么?他们希望通过数据分析和洞察来解决问题。你不想花几百个小时在重复的 Python 练习上来达到完美;你想直接投入行动。那么,如何在不完善每一个 Python 命令的情况下推进和解决现实生活中的数据问题呢?

嗯,最常见的方法是依靠堆栈溢出。但是,在数据科学之旅的开始,人们可能并不总能找到他们期望的答案。这是因为 Stack Overflow 上发布的大多数解决方案都是由专家或经验丰富的数据科学家提供的,他们忘记了从头开始是什么样子。不幸的是,这是一种被称为知识诅咒的认知偏见,在试图与不同背景的人交流的专家中很常见。我经常看到一些简单问题的不必要的高级编程答案。因此,数据科学专业的学生将花费大量时间寻找一个初学者友好的解决方案,而不是致力于最重要的事情;解决问题。

因此,为了帮助你变得更有效率和花更少的时间寻找简单的答案,我决定为数据科学学生和早期职业数据专业人员分享一份全面的 Python 备忘单。我希望下面的备忘单能让你把时间投入到解决问题和产生数据洞察力上。

内容:

  1. 集合(列表、字典、范围&列举)
  2. 类型(字符串、正则表达式、数字、日期时间)
  3. 语法 (Lambda,Comprehension,Map Filter & Reduce,If-Else)
  4. 图书馆(熊猫)
  5. 下一步去哪里?

1。收藏

列表

列表是一个有序可变容器;它可以说是 Python 中最常见的数据结构。当您处理数据清理和创建 for 循环时,理解列表的工作方式变得更加重要。

字典

字典是 Python 中的一种数据结构,它使用键进行索引。字典是一个无序的条目序列(键值对),对于数据科学家来说至关重要,尤其是那些对网络搜集感兴趣的人。例如:从 YouTube 频道中提取数据。

范围&枚举

Range 函数返回一系列数字,默认情况下递增 1,并在指定的数字前停止。enumerate 函数接受一个集合(一个元组),并向枚举对象添加一个计数器。这两个函数在 for 循环中都很有用。

2。类型

字符串

字符串是包含一系列字符的对象。字符串方法总是返回新值,并且而不是会改变原始字符串。

不要忘记使用一些其他的基本方法,如lower()upper()capitalize()title()

正则表达式(Regex)

正则表达式是描述搜索模式的字符序列。在 Pandas 中,正则表达式与矢量化字符串方法集成在一起,使得查找和提取字符模式变得更加容易。学习如何使用 Regex 让数据科学家减少数据清理的耗时。

除非使用**flags=re.ASCII**参数,否则默认情况下,任何字母表中的空格、数字和字母数字字符都将匹配。同样,用大写字母表示否定。

数字

数学&基础统计

Python 有一个内置模块,数据科学家可以将其用于数学任务和基本统计。然而,**describe()**函数计算 DataFrame 列的统计信息的汇总。

日期时间

模块日期时间提供日期**d**、时间**t**、日期时间**dt**和时间增量**td**类。这些类是不可变的和可散列的。这意味着它的值不会改变。因此,它允许 Python 创建一个惟一的哈希值,并被字典用来跟踪惟一的键。Datetime 模块对于经常遇到显示“购买时间”或“用户在特定页面上花了多长时间”的数据集的数据分析师来说至关重要

3。语法

λ

Python lambda 函数是一个匿名函数,其工作方式就像普通的带参数的函数一样。当数据科学家只需要使用一次函数**而不想编写整个 Python 函数**def** 时,它们非常方便。**

理解

理解是一行代码,允许数据专业人员从可重复的源(如列表)创建列表。它们非常适合于简化 for 循环和**map()**,同时解决数据科学中的一个基本前提:“可读性很重要。”所以,尽量不要让你的清单/字典理解过于复杂。

如果-否则

数据科学家使用 if-else 语句,仅在满足特定条件时执行代码。

4。库

图书馆是数据科学家的救星。其中一些库非常庞大,是专门为满足数据专业人员的需求而创建的。因为 Numpy 和 Pandas 都允许数据科学家使用多种基本功能,下面,您会发现一些对初学者和早期职业数据科学家有用的基本功能。

迈克尔·D·贝克与在 Unsplash 上的合影

NumPy

Python 是一种高级语言,因为不需要手动分配内存或指定 CPU 如何执行某些操作。一种低级语言,如 C 为我们提供了这种控制,并提高了特定代码的性能(在处理大数据时至关重要)。NumPy 让 Python 变得高效的原因之一是因为矢量化,它利用了单指令多数据** ( SIMD )来更快速地处理数据。当您将线性代数应用到您的机器学习项目时,NumPy 将变得非常有用。**

请记住,NumPy 中的列表被称为 1D Ndarray,而 2D Ndarray 是列表的列表。NumPy ndarrays 使用行和列的索引,这是选择和分割值的方式。

熊猫

尽管 NumPy 提供了重要的结构和工具,使数据处理变得更加容易,但它也有一些限制:

  • 因为不支持列名,NumPy 强迫你框架问题,这样你的答案永远是多维数组操作。
  • 如果每个 ndarray 只支持一种数据类型,那么处理既包含数字数据又包含字符串数据的数据就更具挑战性了。
  • 有许多低级的方法——然而,有许多普通的分析模式没有预先构建的方法。

幸运的是,熊猫图书馆提供了上述每个问题的解决方案。熊猫不是 NumPy 的替代品,而是 NumPy 的大规模延伸。我不想陈述显而易见的东西,但是为了完整起见:pandas 中的主要对象是系列数据帧。前者相当于 1D 恩达拉雷,而后者相当于 2D 恩达拉雷。Pandas 对于数据清理和分析至关重要。

系列

Pandas 系列是一个一维数组,可以保存任何类型的数据(整数、浮点、字符串、python 对象)。轴标签称为索引。

数据帧

熊猫数据帧是一个二维标签数据结构,其中每一列都有一个唯一的名称。您可以将 Pandas 数据帧看作一个 SQL 表或一个简单的电子表格。

合并,加入&串联

这些方法使数据科学家能够通过将多个数据集合并到单个数据框架中来扩展他们的分析。

分组依据

**groupby()**方法对于研究根据给定标准分组的数据集很有用。

那么,接下来去哪里?

寻求关于基本 Python 特性、库和语法的帮助是数据科学家学习曲线的一部分。然而,不幸的是,你会发现有些答案并不像你想象的那么简单。你可以在我的 GitHub 中找到完整的‘备忘单’。此外,DataCamp 还为 Python 数据科学家发布了一份长长的清单。我希望你的一些直截了当的问题能很快得到回答,现在你已经准备好开始数据科学有趣的部分了:解决问题和产生见解。

感谢阅读。以下是你可能喜欢的其他文章:

** https://medium.com/better-programming/save-time-using-the-command-line-glob-patterns-and-wildcards-17befd6a02c8

参考文献:

知识的诅咒https://en.wikipedia.org/wiki/Curse_of_knowledge

【2】data camp**网站https://www . data camp . com/community/data-science-cheat sheets?page=2****

完美洗牌

原文:https://towardsdatascience.com/the-perfect-shuffle-aa388ad1ffd1?source=collection_archive---------16-----------------------

思想和理论

调查 faro 洗牌背后的数学,同时回答以下问题:将一副牌恢复到原始顺序需要多少次完美的洗牌?

作者图片

两年前,我偶然发现了一副工匠扑克牌。看起来光滑的霓虹灯红色口音,我买了它没有太多的想法。我从来没有特别擅长处理卡片,扇动卡片或做法罗洗牌对我来说是一个有点挣扎。但那副全新的牌给了我足够的虚假信心,让我再次尝试掌握它。

进步是渐进的,但我越来越被一副简单纸牌的神秘所吸引。这是我经历了一个r/shower thoughts的时刻。

我要完美地洗牌多少次才能让它回到原来的顺序?

正如你可能预测的那样,我没有达到可以轻松地将 52 张牌完美地洗牌 8 次的水平,无法计算出需要洗牌的次数才能将它恢复到原来的顺序。最后,我写了一个简单的脚本来帮我洗牌。

我将这些发现绘制在线图上(图 1)* ,立即引起我注意的是出现的模式。*

图 1 恢复一副牌所需的洗牌次数(图片由作者提供)

我无法解释为什么一副 384 张牌只需要 14 次洗牌,而一副 54 张牌需要 52 次洗牌。另一个有趣的图案是图形的“峰值”,完美地形成一条直线。事情开始变得有点复杂了…

我走上 r/math 希望找到答案。它收到了一些冗长的解释(对此我很感激),提到了模函数二进制幂。有了基本的高中数学知识,我努力理解答案背后的直觉,慢慢地就听其自然了。**

快进到今天,当我在 代码 降临的最后一天工作时,我在那里遇到了 【离散对数问题】 。**欧拉的全等函数φ(n)**在我试图求解 DLP 的时候,出现了一个重要的概念。

全宿函数φ(n),也称为欧拉全宿函数,定义为与 n 互质(即不包含任何共同因子)的正整数< =n 的个数。

在搜索 totient 函数时,我弹出了一个解释页面,上面有一个针对正整数范围的 totient 函数的线图(图 2)* 。一种似曾相识的感觉压倒了我,我认出了熟悉的模式。*

图 2 图片来自维基共享

这个函数有点类似于恢复一副 n 牌所需的洗牌次数之间的关系。我的脑海里立即开始形成假设,确信完美洗牌的秘密与离散对数全能函数有关。

法罗洗牌

在我开始计算之前,让我们来看看“完美”/faro 洗牌意味着什么。

要进行法罗洗牌,你首先要把这副牌分成两等份,然后一次交织一张牌,再把它们组合起来。

许多人不需要太多的思考就可以表演法罗洗牌,而且做起来也相对容易(两年后,我还是和以前一样糟糕),然而,许多人不会注意到实际上有两种不同类型的法罗洗牌。

洗牌出局

向外洗牌会将原来的顶牌和底牌保持在原来的位置。

无序播放(图片由作者提供)

混洗

内洗牌会将原来最上面的牌移到第二张,将原来最下面的牌移到倒数第二张。

无序播放(图片由作者提供)

我猜你现在会意识到,直觉上不同类型的法罗洗牌将需要不同次数的洗牌来恢复牌组的原始顺序。

为了巩固这种直觉,我们必须用数学的方式来表达法罗洗牌。

洗牌之后会发生什么?

让我们先来看看洗牌的结果,以及在一次洗牌后每张牌的位置会如何变化。

洗牌出局

我们首先用一个零索引编号系统标记每张卡片的位置。该副牌中的第一张牌将位于位置 0 ,而该牌的最后一张牌将位于位置 N-1 ,其中 N 代表该副牌中的牌总数。**

零索引数字系统(作者图片)

由于我们需要将这副牌分成 2 等份,如果我们使用 n 修改符号会更有用,其中 n 表示每个等份中的牌的数量。

作者图片

位置0, 1,..., n-2, n-1属于前半部分,第一张牌的位置值为 0 ,最后一张牌的位置值为 n-1 。类似地,位置n, n+1,..., 2n-1, 2n-1属于后半部分,其第一张牌的位置值为 n ,而其最后一张牌的位置值为 2n-1。

这种修改后的符号允许我们将牌分成两个不同的部分,为我们在模拟洗牌时提供了更自然的表达。

由于该副牌的顶牌和底牌的位置不变,在一次洗牌后,只有该副牌的内侧部分的位置会改变。

我们可以这样想象一次洗牌后每张牌的最终位置:

作者图片

现在牌已经交织在一起了,对于每一次洗牌,我们可以用这个模式来决定每张牌的位置(稍后会有更多的介绍)。

混洗

按照相同的零索引编号系统,我们可以像对出洗牌一样表达一副牌的入洗牌的结果。

在一次洗牌后,所有的牌都将经历一次位置的改变,这与洗牌不同。

in-shuffle 的结果可以表示如下:

作者图片

原来最上面的牌变成从上面数的第二张牌,原来最下面的牌变成从下面数的第二张牌。

我们能把这浓缩成一个优雅的方程式吗?

洗牌有一个明确的模式,毕竟,直觉告诉我们,它只是把一半的一张牌放在另一半的一张牌上面。

两种洗牌方式的交织运动肯定可以浓缩成一个优雅的方程式。

洗牌出局

为了简单起见,让我们用一副 6 张牌来形象化地表示出洗牌。

作者图片

经过一次洗牌后,**位置的原牌 1 移动到位置2T5,而位置的原牌 2 移动到位置 4 。如果你马上注意到这个模式,那么说也许在一次洗牌后,位置随着一个函数2×原始位置而改变是不会错的。然而,当你检查其他卡片时,你意识到它并不适用于所有的卡片,尤其是后半部分的卡片。**

作者图片

函数2×原始位置在前半段运行良好的原因是,结果直接等于出洗牌后前半段中单张牌之前的牌数。**

事实上,我们可以认为后半部分的卡片也是如此,只是不太明显。一次洗牌的交织运动对牌的两半都是一样的,因此,如果2×原始位置的函数足以确定前半部分牌的最终位置,也许我们正好处于一个一般等式的顶点。

同样的交织运动发生在卡片的后半部分,但是函数2×原始位置给了我们一个超过最大位置的最终位置。如果我们只是把它“包”起来会怎么样?

通过应用模运算符,我们将函数2×原始位置的结果“包装”起来,这样我们就能够在后半部分得出纸牌的正确位置。**

将额外的模运算符添加到函数2×原始位置中,得到了我们一直在寻找的通用(并且相当优雅)方程。

其中 j 是卡片的原始位置

混洗

我们也可以采用同样的 6 张牌实验来形象化洗牌。

作者图片

在一次洗牌后,我们看到顶牌和底牌的位置发生了变化。**位置 0 的原卡移动到1位置,而**位置 1 的原卡已经移动到3*位置。*****

在这一点上,你意识到我们刚刚发现的等式显然不适用于 in-shuffle。但是如果我们简单地在它后面加一个 +1 会怎么样呢?

你又兴奋了,所以你开始在卡片的后半部分测试它…

作者图片

失望之余,你意识到2j mod (2n-1) + 1对卡的后半部分不会一概而论。但是如此坚定之后,你发现2j-1 mod (2n-1)在后半段有效。用一个条件函数来表示单一的混洗操作开始变得混乱了。

出洗牌的交织动作和入洗牌的交织动作之间的唯一区别是一半的牌“走在”另一半的上面。在外洗牌中,牌的前半部分放在后半部分的上面,反之亦然。

直觉上,内洗牌和外洗牌的一般等式应该没有太大区别。

我们知道,在外洗牌中,等式2j mod (2n-1)将给出洗牌后某张牌之前的牌数。它也方便地等于卡片的最终位置。这部分是因为零索引编号系统的良好特性。

按照同样的思路,我们需要一个包含这些属性的等式来进行混洗。零基索引系统效果不佳,但一基索引系统呢?

使用基于一的索引系统:

作者图片

作者图片

仅仅改变索引系统还不够。我们需要重新考虑如何修改我们的“包装”逻辑/模操作数。

因为我们使用的是以 1 为基础的索引系统,所以我们的通用等式不应该产生零值。做一个简单的测试,如果我们将我们的模操作数指定为 6 ,如果我们使用等式2j mod (2n)其中 2n 是最后一张牌的位置,那么位置 4 处的原始牌将具有最终值 0

因此,为了维护基于 1 的索引,我们的模操作数应该改为 2n+1

把所有的东西拼凑在一起,我们现在得到了一个通用的(同样优雅的)内混洗方程。

其中 j 是一张卡从 1 开始的原始位置

多次洗牌

现在我们有了表示内洗牌和外洗牌的等式,让我们找出在 n 洗牌后一张特定的牌将被放置在哪里。

本质上,这是我们正在解决的一个简单的递归问题。

编写一个简单的 python 脚本来运行这个递归将是一个简单的任务(简单地增加 large n 的堆栈大小),然而,通常理解正确的数学概念而不是强力递归会给我们带来无与伦比的性能提升。

模运算

当我们手动写出递归时,我们可以感觉到我们的脚本将会做什么

其中 j 是卡片的起始位置

前一个操作的结果将被输入到下一个操作中,重复这个循环,直到该副牌已经完成 n 次洗牌。执行时间肯定不会很长,但是让我们试着简化一下,给它一点提升。

让我们把范围缩小到仅仅是 2 出洗牌:

其中 J 是一次洗牌后牌的位置

通过应用模运算 的 模乘性质 ,我们可以将上面的等式展开为下面的形式。

通过对 k混洗进行求解,我们将得到一个具有非常方便的性质的方程。**

在 k 洗出后,获得原始位置为 j 的牌的最终位置的功能

我们刚刚击败了递归!

上面的例子利用了外混洗,但是由于内混洗只是在模操作数方面有所不同,我们可以用同样的方式简化它的等式。

在 k 之后得到原始位置为 j 的牌的最终位置的功能-洗牌

回到原来的问题…

既然我们已经对 faro-shuffle 进行了相当多的分析,让我们将注意力转移回我们要解决的问题上。

将一副牌洗回原来的顺序需要多少次法罗洗牌?

我们探索了用数学方法表达两种不同类型的 faro 洗牌的方法,并查看了帮助我们计算出在 n 次洗牌后一张牌会在什么位置的等式。到目前为止,我们已经从一个单独的卡片层面看了这个问题,下一步是把它推广到整个卡片组。

当每张牌都回到原来的位置时,一副牌就回到原来的顺序。

将这种直觉转化为数学术语,我们得到以下结果:

将一副牌恢复到原始顺序所需的洗牌次数(用 k 表示)

通过进一步应用模算术的相同模乘特性,我们看到了一个**离散对数问题的最初迹象。****

我们看到,我们现在能够独立于牌的原始位置来处理洗牌操作。更棒的是,洗牌操作模型经过了离散对数问题*。*

我们终于找到了!

只关注洗牌操作将给出一个略显简洁的方程来求解:

现在,这个等式似乎很难解决,暴力似乎是唯一可行的方法。我不想做那些试错的工作,所以我心中的愤世嫉俗者决定不洗牌。

k = 1 时,我们不用做任何繁琐的工作就能完美地满足方程。

毕竟,即使是人工智能算法有时也认为这是赢得游戏的最佳方式。虽然从技术上来说,这是一个完全可以接受且符合逻辑的答案,但它对这个问题没有任何价值。

这假设我们可能需要设置一个重要的约束, k 必须至少为 1。

求解 DLP

我们可以进一步简化方程,将其推广为一般的离散对数问题。简单回顾一下,2n-1&2n+1的模操作数与我们选择的索引系统非常接近,分别用于模拟出混和入混。然而,当试图将手头的问题简化为一般的 DLP 时,形式2n-1&2n+1没有数学上的重要性。我们可以简单地用一个正整数 X 来表示它们。

**

其中 X 可以代表 2n+1 或 2n-1

有很多方法可以解决 DLP,无论是使用蛮力还是小步快走(BSGS)算法。你也可以通过实现poh lig–Hellman 算法来加快速度。

我不会详细讨论 DLP 或解决它的各种方法,因为它本身值得另一篇文章来讨论。但是为了完整起见,我包含了一个用 python 写的 BSGS 的简单实现,我用它来求解这个方程。

回到图表

作者图片

这个线图是通过手动模拟洗牌操作生成的。在将 faro 洗牌浓缩成一个“简单的”DLP 之后,我们现在可以验证我们的新方法是否对应并且工作良好。

我将解决 DLP(橙色线)的结果叠加在手动模拟(蓝色色调)的结果之上。

作者图片

我们可以看到它排列得非常完美,并且它充当了我们已经成功地将该问题建模为离散对数问题的视觉和定量证明。

你可能已经意识到的另一件事是,从观察绘制的图表来看,进出洗牌所需的洗牌次数似乎是相同的。这可能有点违背我们的直觉,因为它们实际上仍然是不同种类的洗牌。

当我们比较这两个线图时,我们发现实际上有一个很小的有趣的区别。

作者图片

红线标记了需要相同次数洗牌才能将一副牌恢复到原来位置的点。有趣的是,所需的内洗次数的线图似乎“落后于”外洗次数的线图。仔细观察,我们可以看到 N 张牌所需的外洗牌次数与 N-2 张牌所需的内洗牌次数相同,有效地使内洗牌比外洗牌落后“一步”。

关键的直觉来自我们之前检查过的一个重要细节。出洗牌并不影响该副牌的顶牌和底牌,它只是改变它们之间的位置,而不是所有的牌在入洗牌中改变它们的位置。**

但是在洗牌过程中,顶牌和底牌中间的牌是如何被洗牌的呢?

回到我们使用的 6 张牌的例子,让我们进一步分解出洗牌。

作者图片

忽略顶部和底部没有改变位置的卡片,我们看到中间部分以一种奇怪的熟悉的方式洗牌。

作者图片

分离出牌的中间部分,我们意识到在洗牌后,它的所有位置都会改变。这类似于内洗牌,当我们仔细观察它的位置如何变化时,它与内洗牌相同

每次出牌本质上都是在顶牌和底牌之间的一次入牌。

我想说出洗牌基本上是由入洗牌组成的,只是在末尾增加了两张在这个过程中不会被洗牌的额外的牌,这样说不会不恰当。

但是等等……那些山峰呢?

作者图片

在我展示的图表中,一个引人注目的细节是当我们洗牌到一定数量的牌时会出现“峰值”。“峰”和“谷”是为什么一副 54 张牌需要 52 次洗牌才能恢复其顺序,而一副 384 张牌只需要 14 次洗牌的原因。至少可以说,这是不直观的,但是也许研究一下**欧拉的全能函数φ(n)**可以给我们一个起点。

当我们画出这个函数时,我们看到了相同的“峰值”模式。另一个要注意的有趣的点是“峰值”形成一条直线。

图片来自维基共享

to entint 函数给出了给定整数 n 之前的正整数的数目,这些正整数是*https://en.wikipedia.org/wiki/Coprime_integers到 n 的互质数【峰值】对应的质数为【φ(n)= n-1*因此,直线遵循一条 y = x -1 线的形状。**

也许这和我们的洗牌问题有关。

我们知道我们可以把洗牌问题浓缩成一个 DLP,事实上,一个非常特殊的 DLP。

碰巧的是 欧拉定理 有着相对相似的形式,并且给了我们一个更好的概念,即全能函数如何与我们的洗牌问题相联系。

欧拉定理

让我们来看看为什么一副 54 张牌需要 52 次洗牌。

很明显,当我们输入数字时,我们的模就变成了一个质数。根据欧拉定理,指数是模的渐近函数的结果。由于 53 是质数,所以会有53–1个正整数与其互质,导致指数为 52。****

这也扩展到内混洗,只要模是质数并且符合欧拉定理,我们得到一个指数,它对应于所需的混洗次数,即模 1。

作为一个总的结论,因此“峰值”是在一副牌中的牌的数量产生一个素数模的点上,无论是在洗牌中还是在洗牌中。

作者图片

我们现在已经破解了完美洗牌的内部运作

这是我写第一篇文章的一次有趣尝试,它确实有助于巩固我对手头主题的理解。你也会很高兴地知道,红色的霓虹灯牌现在在我的桌子上占据了一个永久的位置,既是一个坐立不安的玩具,也是花一些时间深入挖掘简单事物的灵感来源。

调色板转移的危险

原文:https://towardsdatascience.com/the-perils-of-palette-transfer-f2739b5e4d2c?source=collection_archive---------42-----------------------

实践教程

探索 Python 中算法重新着色的深度

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

几个周末前,我想重温一下我的聚类技术。我记得——在大学的图像处理课上——你可以将图像中独特颜色的数量减少到几个颜色,同时保留重要的颜色。这是通过对图像中像素的 RGB 值进行 k 均值聚类来实现的。简化调色板中需要的颜色数量是 k 均值聚类中的 k 值;换句话说,就是你的图像在 RGB 空间中的聚类中心的数量。

在视频游戏图形的旧时代,如果需要在内存有限的设备上渲染图像,这一点尤其有用。通过减少调色板,可以符合 PAL 或 SECAM 等有限的调色板。由于整个调色板只分配了 8 位或 16 位(对比现在普遍存在的 24 位 RGB)。今天的使用?嗯,如果你特别怀念低位图形的艺术性,或者构建一些在 LED 矩阵上显示的东西,这可能是一个用例。

在玩的时候,我漫不经心地想:“如果我们把一个图像的简化调色板转移到另一个图像上,会怎么样?”这是一个看似无关紧要的问题,扩展了我对颜色和并行处理工具箱的知识。在本文中,我将解释如何完成调色板转移这一人工任务,以及如何更进一步。准备使用numpyscikit-learndask的工具。在一个准备好的 Colab 笔记本上寻找代码,它包含了本文中解释的所有内容。

基于 k 均值聚类的调色板简化

因此,在做任何事情之前,让我们先确定一些定义。我所说的调色板指的是图像中的一组 RGB 像素值。对于一幅小的摄影图像来说,这个数字通常是数万。调色板减少是图像的原始调色板的子集的算法选择,并将原始调色板中的所有像素值映射到减少的调色板中最接近的值。

代码相对简单:对图像的所有像素运行 k-means 聚类,得到的聚类中心就是你简化的调色板。我们必须小心,因为聚类中心不是np.uint8类型,而是np.float64类型。当我们调用kmn.predict(src)时,输出值都是浮点数。对此的简单解决方案是将这些值四舍五入为最接近的整数,并在显示之前将其转换为np.uint8类型。下面是一个简化的调色板类的样子:

这个类的定义非常简单:它包含简化调色板中的颜色数量和一个sklearn.clustering.KMeans实例。首先,我们有一个预处理函数,确保图像为KMeans操作整形(双关语)。整形将三维矩阵W×H×C改造成二维矩阵 WH × C ,其中 W 是图像的宽度, H 是图像的高度, C 是三个 RGB 颜色通道。然后,KMeansReducedPalette.fit()函数作为KMeans.fit()函数的包装器,在 RGB 空间中创建聚类中心。最后,recolor()函数将图像的原始调色板转换为适合图像的缩小调色板。让我们看一些调色板减少的例子:

一朵花的不同层次的调色板减少。 Olia Gozha 在 Unsplash 上的原始照片

很漂亮,对吧?即使减少了调色板,图像仍然有很多魅力。我得说,这很能说明摄影师的水平。可视化这些集群的一种方法是将它们散点图出来。我们这里的数据是三维图像的唯一 RGB 值:每个颜色通道一个维度。这非常适合 3D 散点图:

Gozha 的花在 RGB 空间中的 1000 种随机颜色的散点图,其中 8 个质心标有红色十字

在 8 种颜色中,有相对松散的聚类,但是将质心着色的聚类与原始颜色进行比较,我认为这些聚类非常好。虽然有一些浅绿色被染成灰绿色,但是颜色不会相差太远。点越多,聚类就越能代表突出的颜色。

减少调色板转移

现在,让我们解决第二个问题:将一个图像的简化调色板转移到另一个图像中。事实证明,这相对容易,除了将目标图像传递到调色板recolor()函数中,我们不需要任何进一步的编程。让我们来看看一些转移:

将 Gozha 的花的简化调色板转移到其他图像上。从左至右,原图由MIO·伊藤、丹尼尔·罗、卡莱斯·拉巴达在 Unsplash 上

这里所发生的是,新图像中每个像素的距离是针对缩减的调色板(即聚类中心)来测量的。然后,传输像素的 RGB 值与调色板中最近的聚类中心进行交换。这就是为什么在源图像没有很多颜色,或者减少的调色板太小的情况下,我们会在整个图像中获得一些卡通般的效果。这是因为传输图像中的颜色没有得到足够好的颜色来交换,而是采用最近的聚类中心,尽管它距离传输像素值非常远。

调色板转移实验

在继续之前,让我们对此进行一点试验。我们基于图像中的所有像素进行聚类,但实际上,并非所有像素都是唯一的。在图像的特定区域周围,可能有数十或数百个相同的像素 RGB 值(特别是对于静态背景、天空等)。自然地,这将使图像中更丰富的颜色周围的聚类中心倾斜;这些颜色会立即出现在原始图像中,使它们在视觉上突出。有趣的是,让我们只对图像中的独特像素(而不是所有像素)进行聚类,并给它们平等的机会。我们将创建一个新的类来实现这一点:

新类继承了KMeansReducedPalette类,这使得事情变得更加简单:我们添加到KMeansReducedPalette的任何进一步的功能都将包含在UniqueKMeansReducedPalette类中。fit()函数被覆盖,以使调色板适合图像中的一组唯一像素。这并没有给整体计算增加太多,因为 k-means 聚类花费了 O (nk)时间,这比寻找唯一像素更昂贵,对于具有 n 个像素的图像,寻找唯一像素仅花费 O (n)。让我们比较一下结果:

不同图像上整体图像调色板缩小和独特像素调色板缩小的比较

从远处看,有非常小的差异:在简化的调色板中似乎有大约相同的颜色分布,这可以归因于 k-means 聚类算法的初始条件。

在我看来,颜色的质量有细微的差别。与更加柔和的独特像素的聚类相比,在整个图像上的聚类导致略微更加饱和的减少的调色板。与底部的行相比,顶部的行有更微妙的对比。我将此归因于独特颜色空间中的聚类结果:本质上是对某个轨迹周围的像素值进行平均,而不对更普遍的颜色进行加权。

我们可以对颜色度量进行数值分析来验证这一点(我已经这样做了,没完没了地做了),但这将偏离本文的初衷太远,因为本文只是对调色板转换进行实验,所以我将把这作为一个练习留给你们当中有勇气的人。下面是我通读的一些资源:色觉,色度计算。

多彩的随机漫步

让我们再来看看 k-means 聚类的结果。在聚类之后,为我们提供了 k 个聚类中心,这些聚类中心确定了它周围的其他像素的标签。如果一个点与所有其他质心相比靠近一个质心,则该点被分组到该质心中。本质上,这在数据空间中创建了 k 个分区;其边界可以使用 Voronoi 图可视化。在前面的散点图中,我们可以部分看到 3D 空间中分区的边界。由于绘制 3D Voronoi 图是困难的,让我们转向主成分分析,减少空间到 2D 和绘制 Voronoi 镶嵌。

基于 PCA 分解的 2D 果扎花 8 簇 RGB 像素 Voronoi 镶嵌

从图中可以清楚地看出,分区是 2D 几何多边形。在原始的 3D 空间中,这些分区将是 3D 多面体。此外,PCA 对一些点“撒谎”,尤其是在边界处,因为这些点已经被向下投影到较低的维度(因此丢失了信息)。尽量不要仔细查看 2D 芙诺以图

知道了边界,我们可以在分区内随机选择 RGB 值作为新图像的重新着色,而不是仅仅依赖质心的 RGB 值。这给了我们更多的改变图像颜色的方法。因为我们已经有了质心,我们可以从那里开始,一小步一小步地达到随机的 RGB 值。这个过程被称为随机行走

随机漫步变体 1:到处漫步

让我们来理解随机游走的一种变化,它在任何 RGB 方向上移动 1 个强度单位。这种随机漫步有可能探索全部 16,777,216 种颜色(如果你走足够多的步)。让我们把这个编码起来:

从 k-means 形心开始的无处不在的随机游走重新着色

random_walk_recolor()函数获取一幅图像和离开聚类中心的最大步数。首先,我们对像素重新着色,就像我们在recolor()函数中所做的那样,它被存储为起始点(start)。然后,我们初始化一个差异数组(diff),它将确定每个颜色通道与起始点的距离。

然后,我们循环到我们想要走的最大步数,并在单个通道中随机行走 1 个单位。这存储在walk中:我们使用np.eye()np.random.randint()为每个像素随机索引一个 3x3 的单位矩阵。例如,具有 9 个像素的图像:

walk = [[ 0, 0, 1],         [ 0, 0, 1],         [ 1, 0, 0],[ 0, 1, 0],[ 0, 0, 1],[ 0, 1, 0],[ 1, 0, 0],[ 1, 0, 0],[ 1, 0, 0]]

然后,我们需要使用集合{-1, 1}上的np.random.choice()随机选择行走的符号(正向或负向),然后将行走数组转换为:

walk = [[ 0, 0, 1],[ 0, 0,-1],[-1, 0, 0],[ 0,-1, 0],[ 0, 0, 1],[ 0,-1, 0],[ 1, 0, 0],[-1, 0, 0],[-1, 0, 0]]

最后,我们将行走添加到diff数组中。如果我们重复这个过程足够多次,我们会得到一些随机分布的步数,这些步数最多是我们想要的最大步数。最后的随机行走diff可能是这样的,最大步长为 3:

walk = [[ 0, 0, 1],[ 0, 0,-2],[-1, 1, 0],[ 0,-1,-1],[ 0, 0, 3],[ 0,-1, 0],[ 2, 0, 1],[ 0, 0, 0],[-1,-1, 1]]

由于随机行走的随机性,我们甚至可能不会离开群集中心;然而,这对于大的步长来说是极不可能的。最终的重新着色只是 k-means 重新着色的起点加上行走。在不同的转印图像上使用 32 色调色板对不同的步长值重新着色会是什么样子?对于这个例子,我将把拉巴达海边的调色板转移到戈扎的花上。

不同最大行走距离下的噪声随机行走

好吧,看起来我们只是对它应用了一些噪声,但是我们保持了一般的传输。在非常高的距离上,噪音确实变得相当大。但还是很酷。

随机漫步变体 2:邻域漫步

第一个随机游走变体不能保证访问原始图像中的唯一像素。事实上,它甚至可能超越我们前面提到的划分的界限。如果我们只想绕过邻近的像素到达聚类中心呢?此外,我们希望留在一个分区内;我们现在不想在错误的街区游荡,是吗?

为了找到与质心相邻的随机像素,我们需要计算聚类中每个像素到质心的距离,并随机选取最接近的邻居,直到某个最大行走步数。在这个特定的场景中,我们可以做的一个优化是预先计算这些距离,因为一旦聚类完成,它们将永远不会改变。

这里的策略是在fit()阶段对每个聚类中的所有像素到其最近质心的距离进行计算,根据像素到质心的距离以升序对像素进行排序,并存储它以便以后使用。下面是代码:

这样做的目的是遍历调色板中的聚类数,并存储每个像素到聚类中心的距离。首先,我们从原始图像中获取当前聚类中的所有像素(pixels_ci),并计算到聚类中心的欧几里德距离(distances_ci)。然后我们使用np.argsort()来获得距离的排序索引,然后用它来索引pixels_ci。现在我们只剩下一个像素矩阵,按照距离的升序排列。

要进行随机行走,我们只需选择一个最大索引值的随机数(该随机数代表步数)。我们还需要确保索引不超过集群的大小。下面是用邻域随机游走重新着色的代码:

代码相对简单:我们首先像对其他随机漫步一样重新着色,然后遍历每个聚类并选择一个随机的最近邻居。我们使用np.random.randint()生成随机索引来选择最近的邻居。由于随机函数在max_steps达到最大值,我们不会探索排名在max_steps值以下的邻居。此外,将最大随机数设置为n_neighborsmax_steps之间的最小值,可以确保您在邻域范围内。产生的随机游走如下所示:

不同最大步行距离的嘈杂街区步行

在较低的距离上,噪音要细微得多,不易察觉。噪声的“语义”也更合理:它不会偏离原始像素所要表现的太远。这几乎就像你从一个坏传感器或一些高 ISO 值的 DSLR 得到一张照片。不错!

整个调色板转移

我们看到的所有技术都是在转移之前减少调色板。可以说,这是一个更容易进行的转换,因为我们只需要将 n 个像素与 k 个聚类中心进行比较。如果相反,我们想做一个所有独特的像素调色板转移?嗯,如果我们假设源图像和传输图像中的调色板大小相等,我们将需要进行 O ( n )比较,以找到传输图像和源图像中最近的像素。

这是有问题的:我们 320×480 像素的工作图像具有 10⁵独特像素的数量级。在计算期间,成对比较将产生数量级为(10⁵)或 10 ⁰的矩阵。很明显,除非你有大容量的内存(而大多数商用电脑都没有),否则这是不适合内存的。我们可以使用循环,但是 Python 循环是出了名的慢。

如果我们部署某种形式的矢量化计算(比循环更快)和数组分块,就可以实现理想的折中。分块将一个大的矢量化计算划分成更小的可管理的计算,并收集这些部分以形成最终的输出数组。库dask是 Python 中一个流行的实现,它允许我们这样做,同时保持代码中的numpy语法风格。dask也支持并行化,这意味着我们可以将这些计算潜在地推迟到不同的机器上,或者完全利用计算机的所有内核。代码如下所示:

整个调色板传输类都有一个非常基本的构造函数。构造函数需要一个块大小值(默认为 1024)。这在小型计算机中权衡了计算内存和并行化,但是如果您有更多的内存,您可以调整到更大的值。拟合步骤只是存储图像中所有唯一的像素。我们只取源图像中的唯一像素来最小化计算,因为我们可以将传输图像中的所有像素映射到源像素的子集。这个映射将在我们执行recolor()时创建。

该类的核心是recolor()函数。首先,我们对传输图像进行预处理,并收集所有独特的像素。然后我们为源图像和传输图像中的独特像素创建一个dask.array.core.Array对象。转移图像被整形为 3D 阵列,用于成对差异计算的矢量化。

计算负担

让我们在这里停下来,理解我们正在承受的计算负担。dask具有在笔记本环境中可视化分配给计算步骤的内存的特征。如果您为源和传输图像放置以下代码:

我们在笔记本输出单元格中显示了以下图像:

Dask 可视化的成对差分计算和分配 77GB 的过程!

显然,源和转移独特像素的dask阵列占用很少的内存。然而,当我们执行成对差异时,我们需要分配 77.29 GB 的内存。在传统的 NumPy 设置中,这要么会崩溃,要么 NumPy 会产生一个错误消息,说它不能分配那么多内存。此时dask因其分块能力而大放异彩,能够在不实际分配所有内存的情况下计算如此庞大的数组。

减轻负担

最终,我们不需要成对的距离,我们只需要到源像素距离最小的传输像素。回到代码,我们执行欧几里德距离计算,并且仅保留与源像素具有最小距离的传输像素的索引,从而留下小得多的输出数组。

为了实际运行计算,我们必须调用idxs_da.compute(),我们将利用dask自带的内置ProgressBar()来显示计算的进度。一旦我们计算了索引,我们就创建了从一个 RGB 源像素到最近的 RGB 传输像素的字典映射。Python 字典使用散列法,这意味着查找非常快(理论上,它需要恒定的时间)。最后,为了传递像素,我们循环传递图像中的所有像素,并使用像素映射来交换 RGB 像素值。

让我们来看一些转移!这一次我将使用伊藤的花,并将调色板转移到其余的图像。

整个调色板从一个图像转移到其他三个图像

漂亮的输出。传输的图像具有更自然的色彩,更少的块状,看起来与原始图像非常相似。在做这个转移的时候,我不禁注意到 Gozha 的花真的可以有一些更好的转移。伊藤的花中肯定有一些粉红色或红色,这对于转移来说会更好,但可能太远了。我没有意识到的是我们方法的弱点:欧几里德距离。

更好的色彩距离

问题是:欧几里德距离假设颜色均匀分布在 255×255×255 的 3D 立方体周围。这些点之间的距离将决定颜色之间的距离。然而,感知,我们感知的距离不同。“一种红色到另一种红色有多远?”这是一个非常深奥的问题,但它足以说欧几里得距离不做我们不同的感知正义。

所以我在网上寻找一个距离测量的答案,这个距离测量计算简单,但在某种程度上还是可行的。本网站详细介绍了使用 RGB 空间计算更“正确”的感知色彩距离。我将把论述留给网站本身,但总之,作者在转换到另一个色彩空间(如 YUV 或 CIELAB)和考虑影响距离测量的修正因素之间进行了妥协。此外,就算法得出的距离值而言,它“更稳定”。距离计算如下(根据现场改编):

颜色距离方程改编自本站

在等式中, C 是像素的 RGB 向量,下标数字表示我们指的是哪个像素(比较像素 1 和像素 2),下标字母是像素的颜色通道。该计算首先对两个像素之间的红色值进行平均。然后,我们计算像素的每个颜色分量之间的差异。最终距离基本上是加权欧几里德距离,对于每个颜色分量,权重被不同地确定。

我们可以将利用一些位运算技巧的网站代码改编成 Python。作为参考,下面是网站上的 C++函数定义:

关于计算的评论

为了保持计算快速,我将放弃平方根在最后不中断距离计算。这是因为平方根是所有正数的单调递增函数。因为δC的平方根中的值总是正的,所以我们需要比较来获得最接近的像素就是平方根中的求和项。此外,由于我们使用了dask,我们也需要对矢量化进行编码。注意,我们将类型转换为np.long类型,这样我们就可以处理δRδG、δB的平方。

如果你能把上面的 C++代码和原始方程联系起来,我希望代码是不言自明的。其要点是,我们对每个颜色通道之间的差异计算进行了矢量化,并且还实现了每个原始代码的位运算。输出是什么样的?

使用颜色距离的整体调色板转移

这为 Gozha 的花创造了一个奇迹,一个更红的色调现在被转移,而不是欧几里得距离给出的温和的棕褐色。除此之外,拉巴达的海边和罗伊的山的颜色是差不多的,在色调上有非常细微的差别,但没有什么突出的。我把这个留给你:我们对颜色的视觉感知肯定不同于我们选择来体现它们的数据结构。

结论

这就是我在调色板转移。我喜欢做像这样有趣的周末项目,并把它们完整地记录下来。这个调色板转移练习给了我一个机会,让我以编程的方式探索我的古怪想法,并且发现新工具和学习新技能。

我未来的主要探索是颜色的数字表现有多复杂。色彩空间非常有趣,有很多我还没有完全理解。然而,我希望你能像我写这篇文章一样喜欢阅读它。下次见!

数据科学的好处:我如何在都柏林找到我的新家

原文:https://towardsdatascience.com/the-perks-of-data-science-how-i-found-my-new-home-in-dublin-5ff84fc97ec4?source=collection_archive---------0-----------------------

实践教程

一名数据科学家寻求在高需求/低报价市场中找到一处房产

我一直很羡慕一些专业人士,他们的专业知识可能会对日常生活产生影响。想想水管工、牙医或厨师:他们的技能和资格是不错的额外津贴,不仅仅是在工作中。

作为数据科学家和软件工程师,优势通常不太明显;是的,我知道如何与技术打交道,但我的工作通常倾向于业务部门,所以要找到有趣的家庭规模的用例有点困难。

当我和妻子决定在都柏林购买我们的新家时,我立刻看到了让自己变得有用的机会!

· [High Demand, Low Offer](#9259)
· [Data Cravings](#592b)
· [From the Idea to the Tool](#4376)∘ [Basic Data](#26ec)∘ [Enhancing the Data](#dd5f)∘ [Google Data Studio](#e437)
· [Some Implementation Details (Before the Fun Stuff)](#4466)∘ [Address Geocoding](#465a)∘ [Estimating the Time-on-Market](#0873)
· [The analysis](#ec9f)∘ [Insights](#1e86)
· [Conclusion](#9d4c)
· [Follow me on LinkedIn and Medium](#410e)

下面的数据不是刮取而来,是使用 这个脚本 生成的。

高需求,低报价

为了理解我需要搬家的理由,回顾一下我在都柏林房地产市场的个人经历是很有用的。我必须承认,作为买家,解决这个问题并不容易:市场需求超高(得益于近年来爱尔兰经济的良好表现),房价高得令人难以置信;欧盟统计局的一份报告显示,与欧盟相比爱尔兰在 2019 年的住房成本最高(比欧盟平均水平高出 77)

这个图表的后果?

  1. 符合我们预算的房子很少,在城市的高需求区就更少了(即不完全脏乱的通勤)。
  2. 二手房的质量有时很差,因为业主在出售之前对装修没有什么经济利益。待售的房屋通常能源等级低,管道差,电力系统差——翻译:买家需要在已经很高的购买价格上再增加一些装修费用。
  3. 销售基于竞价系统,几乎每次竞价都超过最初的要价。据我所知,这对于新建筑来说是不正确的,但它们远远超过了预算,所以我们根本没有探索这一部分。

我可以想象世界各地的许多人都会对此感同身受,因为许多大城市的情况可能都是类似的

像所有找房子的人一样,我们想在完美的地方找到价格合理的完美房子。让我们看看数据科学如何帮助我们的搜索!

对数据的渴望

任何数据科学项目都需要一些数据收集步骤,对于这个特定的应用程序,我正在寻找某种包含市场上所有可用属性的资源。对爱尔兰来说,这意味着两种类型的网站:

  1. 每一家房地产中介公司
  2. 聚合器

两者都是非常有用的工具,它们让卖家和买家的生活变得更加容易。不幸的是,UI 及其提供的过滤功能并不总是提取信息和进行属性比较的最有效方法;一些用类似谷歌的搜索引擎很难回答的问题:

  • 我的通勤需要多长时间?
  • 特定区域内有多少房产?— 在经典网站上,可以比较不同的城市区域,但这些区域通常覆盖数平方公里,不够细致,难以理解,例如,某条特定路* 的报价高得难以接受。大多数网站都提供地图,但这些地图的信息量并没有想象中的大。*
  • 房子周围有多少便利设施?
  • 给定一套房产,平均要价是多少?
  • 物业上市多久了?此信息(如果有)可能不可靠,因为地产代理可能已经删除并重新创建了房源。

以一种对买家更友好的方式重新组织用户界面(加上一些数据增强),使我们的整体找房子体验更加流畅,并允许我们发现一些非常有趣的见解*。*

从想法到工具

原始数据

第一步是编写一个 scraper 来收集一些基本信息:

  • 物业原始地址
  • 当前要价
  • 链接到酒店的网页
  • 基本特征,比如房间数量、浴室数量、能源等级
  • 房屋列表的浏览次数(如果有)
  • 房子的类型 —房子?公寓?新建筑?

这差不多是我能从网上得到的所有数据。为了提取更多有见地的知识,我需要增强这个数据集。

增强数据

谈到的房子,我的主要卖点是通勤方便,对我来说“通勤方便意味着上门时间小于或等于 50 分钟。为了进行计算,我决定使用谷歌云平台:

  1. 使用地理编码 API ,我使用属性 address 检索纬度和经度坐标。
  2. 有了方向 API ,我计算了房子位置和工作地点之间的步行和公交门到门距离。(注:骑车的时间大约是步行时间的 1/3)**
  3. 使用 Places API ,我检索了每个酒店周围的便利设施(特别是我们感兴趣的药店、超市和餐馆)。 注意:地方 API 很贵;对于一个包含 4000 栋房屋的数据库,您需要处理 12000 个请求才能获得三种类型的便利设施。出于这个原因,我将这些数据从我的最终仪表板中删除。

除了地理信息,我的另一个有趣的问题是:该房产上市多久了?如果业主试图出售房产的时间太长,这不是一个积极的信号:该地区或房子本身可能有问题,或者要价可能太高
另一方面,如果一处房产刚刚被出售,你需要考虑到
业主不会按照他们得到的第一个报价去出售。不幸的是,这些信息很容易隐藏或“伪造”。通过一些基本的机器学习,我通过简单地使用具有一些其他功能的列表的视图来估计这个数量。****

最后,我用一些实用字段增强了数据集,以使过滤更容易(例如,添加一个价格范围列)。

谷歌数据工作室

一旦我对我的增强数据集感到满意,我想创建一个强大的仪表板。我为任务选择的数据可视化工具是 Google Data Studio 。这个软件有一些缺点(例如,它的功能非常有限),但也有一些优点,它是免费的,基于网络的,可以读取来自谷歌工作表的数据。下面的图表总结了整个工作流程。

一些实现细节(在有趣的东西之前)

老实说,实现非常容易,真的没有什么新的或特别的:只是一堆收集数据的脚本和一些基本的 Pandas 转换。唯一值得强调的部分是与谷歌 API的交互,以及对房产上市时间的估计

下面的数据不是刮取来的,是使用 这个脚本 生成的。

让我们看看原始数据:

正如我所料,该文件包含以下几列:

  • **id**:列表的标识符
  • **_address**:物业的地址
  • **_d_code**:都柏林区号。每个都柏林地区由一个格式为D<number>的代码标识。当** **<number>** 为偶数时,地址位于利菲(切割城市的河流)的南边,如果为奇数,地址位于河流的北边。**
  • **_link**:链接到已检索列表的原始页面。
  • **_price**:房产要价欧元。
  • **type**:属性类型(HOUSESAPARTMENTSNEW HOUSES)。
  • **_bedrooms**:卧室数量。
  • **_bathrooms**:卫生间数量。
  • **_ber_code**:标识能量等级的代码,越接近字母 A,能量等级越好。
  • **_views**:列表获取的视图(如果有)。
  • **_latest_update**:更新或创建列表时(如果可用)。
  • **days_listed**:这是一个计算字段,是我收集数据的日期与_last_update列之间的差值。

地址地理编码

这个想法是把这些东西放在地图上,并启用地理定位数据的力量。为此,让我们看看如何使用 Google API 获得纬度和经度

如果你想尝试这一点,你需要一个谷歌云平台帐户,你可能想按照指南获取一个 API 密钥,并启用适当的 API 。正如我之前所写的,对于这个项目,我使用了地理编码 API s、方向 API 和地点 API (因此,当您创建 API 键时,您需要启用这些特定的 API)。下面的代码片段来与云平台进行交互。

估计上市时间

让我们关注下面的数据:

正如您在这个示例中看到的,与属性相关联的查看次数并没有反映在列表已经存在的天数中:例如,带有** **id=47** 的房子有大约 25k 次查看,但是显然已经列出了我下载数据的确切日期。**

然而,并不是所有的属性都存在这个问题;在下面的示例中,查看次数与列出的天数更加一致:

我们如何利用上面的知识?简单:我们可以使用第二个数据集作为模型的训练集,然后我们可以应用到第一个数据集!****

我尝试了两种方法:

  1. ****获取“一致的”数据集,并计算每天的平均浏览量,然后我将该平均值应用于“未知的”数据集。这种解决方案并非完全不合理,但它有一个问题,所有的房子都放在同一个桶里:很可能一个价值 1000 万欧元的房子每天的浏览量会更少,因为这个预算是为一小部分人保留的
  2. ****在第二个数据集上训练随机森林模型,并将其应用于第一个数据集

需要非常仔细地阅读结果,因为知道新列将是真实值的粗略近似值:** 我将它们用作一个起点,以便更深入地挖掘一些看起来有些奇怪的属性。**

分析

女士们先生们:最后的仪表板。如果你想玩这个 就点击这个链接

注意:Google Data Studio 将允许在介质上嵌入报告(正如你在我写的另一篇文章中看到的)。不幸的是,谷歌地图模块在嵌入文章时无法工作,所以我需要使用截图。

https://datastudio.google.com/s/qKDxt8i2ezE

****地图是仪表盘最重要的元素。气泡的颜色取决于房屋/公寓的价格,并且颜色仅考虑可见属性(与右上角的过滤器匹配的属性);大小表示上班距离:气泡越小通勤距离最短

****图表旨在分析要价如何根据某些特征(如建筑类型或房间数量)而变化;散点图,试把通勤与要价联系起来。

最后,用原始数据做一个表格(DL RF代表“天列出的随机森林”)。

洞察力

让我们深入实际分析,看看我们能从仪表板中获得什么样的见解。

该数据集包含大约 4000 所房屋和公寓:当然,我们无法组织对每一所房屋和公寓的查看,因此我们的任务是确定一个记录子集,其中必须包含一个或多个我们想要竞标的房产。****

首先,我们需要细化我们的搜索标准。例如,假设我们想要匹配这些特征:

  1. 房产类型:房屋****
  2. 卧室数量: 3
  3. 工作时间:不到 60 分钟****
  4. 误码率等级: A,B,C,D
  5. 价格:从 25 万到 54 万欧元

让我们应用所有的过滤器,除了价格上的那个,让我们看看地图(只过滤掉价值超过 100 万,低于 20 万欧元的)。

一般来说,伦敦国际电影节南部的要价比北部的要价高得多,除了西南部的一些例外。即使在生活费用以上,“外部地区”,即东北和西北,似乎也比“纯北方”便宜。其中一个原因是,都柏林的主要有轨电车线路(LUAS)在一条直线上从北到南穿过城市(还有一条从西到东的 LUAS,但它没有到达所有的商业区)。

请注意,我是通过简单的目视检查来考虑这些问题的;更严格的方法需要验证房价与公共交通路线距离之间的相关性,但我们对证明这种关系不感兴趣。

如果我们根据我们的预算进行过滤,情况会变得更加有趣(回想一下,下面的地图显示了 3 间卧室的房子,允许不到 60 分钟的通勤,下面的地图只增加了对询问价格的过滤)😗***

让我们后退一步。我们大概知道我们能负担的范围,但是我们仍然需要处理最困难的部分:妥协!我们想做一个更经济实惠的搜索吗?或者我们想看看用辛苦赚来的积蓄可能买到的最好的房子?不幸的是,这不是数据科学分析的一部分,但这是一个实际的商业(非常个人化)决策

假设我们选择后者:我们希望更喜欢房子或面积质量,而不是更低的价格

如果这是目标,我要说我们需要考虑以下几点:

  • 不在集群中的房屋 —在地图上孤立的房屋,可能表明该地区没有太多报价,因此业主可能不愿意轻易出售。
  • 位于“昂贵”区域的房子 —如果房子周围的所有其他房产都很昂贵,这可能表明该位置的需求很高。我将把它作为旁注留在这里,但我们可以通过使用空间自相关来量化这一现象(例如计算 莫兰的 I )。

即使第一个选项看起来很有吸引力,我们也需要考虑到,如果一处房产的价格与周边地区相比非常低,那么该房产本身可能存在某种问题(例如,房间小,装修成本非常高)。因此,我们将继续关注第二个类别的分析,我认为考虑到我们的“业务目标”,这是最有希望的。****

让我们更深入地分析一下以下领域所提供的内容:

我们已经将选项从 4000 个元素减少到 200 个以下,我们现在需要做的是更好地划分点,并比较集群

自动化集群搜索不会给这个分析增加太多,但是让我们应用DBS can;我们选择 DBSCAN 是因为一些分组可能是非球状的(例如,k-means 在这个数据库上不能正常工作)。理论上,我们需要计算点之间的地理距离,但我们将使用欧几里得距离,因为它是一个很好的近似值:

该算法做得相当好,但我会修改集群如下(与一些“商业知识”对都柏林):

我们希望降低要价较低的地区的优先级,因为我们希望利用我们的预算最大限度地提高房屋和通勤质量;出于这个原因,我们可以过滤掉集群 2、3、4、6 和 9。请注意,集群 2、3 和 4 是北都柏林最经济的地区之一(这可能是由于公共交通覆盖率低)。第 11 类既昂贵又遥远,因此我们可以删除这一类。

看看更贵的总量,数字 7 在通勤方面是最好的之一。这是 Drumcondra ,都柏林北部的一个不错的住宅区;尽管 Drumcondra 的 LUAS(有轨电车线)服务不好,但它与公共汽车联系很好;集群 8 的成本和通勤情况与 Drumcondra** 相似。另一个值得分析的分组是第 10 个:这个分组似乎位于一个供应较低的地区,**这意味着它可能是一个人们不太可能出售的地方,并且由于铁路的存在,它仍然连接得很好(我们假设所有地区都有相似的人口密度)。****

最后但同样重要的是,集群 1 和集群 5** 非常靠近凤凰公园 这是欧洲任何首都城市中最大的封闭式公园 **

集群 7

第八集群

集群 10

集群 1

集群 5

太好了!我们确定了 26 处我们认为最值得一看的房产。我们现在可以开始深入每一栋房子,并最终与房地产经纪人一起组织看房!

结论

我们开始对都柏林几乎一无所知,最终我们对购房者最需要的城市区域有了一些了解。

只要注意到我们甚至没有看照片,也没有读过关于这些房子的任何东西!通过简单地查看一个组织有序的仪表板我们发现了一堆我们在旅程开始时不知道的见解!****

****这些数据不能进一步帮助,一些整合可以改善分析。一些想法:

  • ****我们没有集成便利设施数据集(我们可以通过 Places APIs 检索的数据集)。有了更多的云服务预算,我们可以轻松地将这些信息添加到仪表板中。
  • 爱尔兰在该国的 统计网站 发布了很多有趣的数据:例如,可以下载每个季度和犯罪类型打给每个警察局(爱尔兰警方)的电话数量;这样,我们就可以知道哪些地区的盗窃案数量最多。由于检索每个选区的人口普查信息是可能的,我们也可以考虑根据人口加权来计算犯罪率注意,对于这样的高级功能,我们需要一个合适的地理信息系统(如【QGIS】),或者一个可以处理地理数据的数据库(如【PostGIS】)**。**
  • 爱尔兰有一个包含以前房价的数据库,名为 住宅物业登记册 来自他们的网站:【住宅物业登记册】包括自 2010 年 1 月 1 日以来在爱尔兰购买的所有住宅物业的销售日期、价格和地址。拥有房屋的历史价格可能有助于理解需求是如何随时间变化的。**
  • ****房屋保险强烈依赖房屋位置来获得报价。通过一些努力,我们可以将保险网站整合到我们的仪表板中,集成他们的“风险模型”。

在都柏林这样的市场上,寻找新家可能是一种压倒性的体验,尤其是对那些刚刚搬到这里、对这座城市的每一条路都不熟悉的人来说。

有了这个工具,我和妻子最终减少了我们浪费的时间(和代理人的时间):我们参加了 4 次看房,投标了 3 栋房子,赢得了 1 栋。****

在 LinkedIn 和 Medium 上关注我

如果你喜欢这篇文章,可以随时联系 LinkedInhttps://www.linkedin.com/feed/****(我欢迎个性化的连接请求)并关注我的** 媒体 ******

****** ******

基于能量模型的物理学

原文:https://towardsdatascience.com/the-physics-of-energy-based-models-1121122d0d9?source=collection_archive---------6-----------------------

思想和理论

用物理学来理解基于能量的模型

作者:帕特里克·胡姆贝利(EPFL)、胡安·米盖尔·阿拉佐拉(世外桃源)、内森·基洛兰(世外桃源)、马苏德·莫塞尼(谷歌量子人工智能)、彼得·魏特克

纪念彼得·魏特克

当我们想到彼得时,他积极的天性和他敢做敢为的态度不可避免地浮现在脑海中。他有能力激励和带动周围的人,让他们相信几乎一切皆有可能。早在 2018 年,他就想出了一个关于基于能源的模型主题的互动博客帖子的想法,并向我们推荐了它。抗拒他热情的态度几乎是不可能的,当然我们和他一起开始了这次冒险。带着我们在物理学和机器学习方面的知识,以及几乎没有任何关于 Javascript 的线索,我们开始了我们的旅程。经过许多艰苦的工作,我们终于能够完成这个项目。我们对最终的结果欣喜若狂,我们希望他能看到。我们想念你,彼得。我们想念你,你是我们的同事,是我们的灵感,更是我们的朋友。
由于 Medium 不支持用 Latex 编写的 Javascript 和方程,我们建议也看看我们的互动帖子。

介绍

我们从一个相当简单的物理角度概述了基于能量的模型,这是一类历史上重要的生成机器学习模型。我们假设没有机器学习的先验知识。我们通过联系相互作用粒子的物理行为来激发基于能量的模型,而不是主要概念的纯数学公式。我们从不同的角度解释熟悉的概念,并揭示基于能量的模型的理论和实践背后的关键物理概念。这包括 Hopfield 网络[1]和 Boltzmann 机器[2]的设计、实现和训练,强调物理原理如何解释与这些模型相关的成功和挑战。我们关注这些模型是因为它们的历史意义——为该领域未来的革命铺平了道路——以及它们与基本物理原理的直接联系。此外,注意力放在使用物理学来理解重要的概念,如能量函数,玻尔兹曼分布和对比发散[3]。最后,我们根据最近的进展思考了机器智能未来可能的趋势,揭示了物理学和机器学习界面上的前沿研究。

基于能源的模型

基于能量的模型是由描述特定状态概率的能量函数控制的概率模型。基于能量的模型出现在 20 世纪 80 年代的机器学习文献中[1,2]。经过几十年的工作,它们得到了进一步的发展、扩展和改进[4]。最近,一些基于能量的模型已经被“移植”到物理学中,并被用来模拟量子系统的波函数[5,6,7,8]。此外,他们仍在其他领域工作[9,10,11,12],在特定任务中,他们已经开始与 GANs 竞争[13]。许多类型的基于能量的模型是可生成的,保证采样一个有效的概率分布,并且可以经常被堆叠以创建深层次的表示[14]。最近的发展包括它们在强化学习中的应用[15,16,17],作为 GANs 中鉴别器的潜在替代物[18],以及基于量子能量的模型的出现[19,20]。

为了理解基于能量的模型的起源,想象一个科学家的目标是设计一个能够学习和记忆模式的物理系统。最初的策略选择是使用粒子的随机行为来模拟应该学习的一些数据的概率分布。目标是设计概率系统,利用随机性来概括记忆的模式。在数学上,概率系统的特征在于确定系统可能状态的概率分布。挑战在于设计足够复杂的系统以产生丰富的行为,但也足够简单以使它们可以被有效地训练和表征。

对于大型系统,跟踪所有快速波动的内部自由度是极其困难的。通常只能访问粗粒度的信息,这意味着我们只能跟踪系统的宏观属性,而不是所有的自由度。这种粗粒度信息的一个例子是总能量[21],它可以从理论上确定系统的任何给定状态。

更准确地说,一个系统的总能量是根据一个能量函数 E ( x )来定义的,这个函数将能量值分配给所有可能的状态。一个 n 粒子系统的状态可以描述为 x =( x ₁, x ₂,…, x ₙ),其中 x ᵢ表示第 i 粒子的相关自由度。

玻尔兹曼分布

能量为 E ( x )的一个状态 x 可以分配到什么概率分布 P ( x )?如果我们没有任何关于特定自由度的信息——因此没有约束——我们应该在选择模型时保持最大的灵活性,同时与受约束的数量保持一致。因此,选择具有最大熵的分布是合理的,因为最大熵模型减少了构建到模型中的潜在有偏差或未经证实的先验信息的量。这种策略被称为杰恩斯的最大熵原理【22】。它指出,在根据部分可用信息分配模型时,应选择具有最大可能熵的分布。得到的分布 P ( x )就是优化问题的解

给予[22]

其中 T 是自由参数,z=∑ₓexp[e(x/t)是归一化常数,称为配分函数。这种概率分布最早出现在统计物理中,现在广泛应用于其他领域。在其最初的物理解释中,玻尔兹曼分布描述了当系统与温度为 T 的热浴处于热平衡时,找到处于状态 x 的系统的概率。玻尔兹曼分布在能量和概率之间建立了一种具体的关系:低能态最有可能被观察到。

物理系统的能量函数可以表示为每个粒子的内能和它们之间的相互作用所产生的贡献的总和。在这种情况下,能量函数可以写成

对于合适的参数 θ ᵢ和函数 f ᵢ ( x )。在温度 T 下得到的玻尔兹曼分布由参数 θ ᵢ唯一确定,或者等效地,由期望值⟨ f ᵢ ( x )⟩唯一确定,它们是分布【24】的充分统计量。期望值⟨ f ᵢ ( x )⟩)的知识确定了参数 θ ᵢ,因此也确定了所得玻尔兹曼分布的性质。参数 θ ᵢ决定了这些期望值在最小化能量中的相关性。当一个特定的 θ ᵢ很小时,相应的充分统计量,即粒子的状态或相互作用项,在很大程度上与其对能量的贡献无关。

认识到温度的作用很重要:它决定了观察到高能态的相对概率,而不仅仅是最低能态。在零温极限下,只能观察到对应于能量函数全局极小值的那些状态。在无限温度的极限下,所有状态的可能性都是相等的。在物理上,温度量化了系统和环境之间相互作用的平均能量。这种交换导致向更高能量状态的零星“跳跃”。温度越高,这种跳跃就越普遍、越普遍。下图显示了温度在玻尔兹曼分布中的作用,您可以从中研究不同温度和能量函数参数的影响。

随相互作用和温度变化的玻尔兹曼分布(此图的交互版本可在此处找到http://physicsofebm.github.io/)😗*温度 T T 和相互作用强度 w w 对两粒子系统玻尔兹曼分布的影响。左边的直方图显示了每个可能配置的概率,其中 xᵢ∈{−1,+1}(红色/灰色)。能量函数为 E ( x ₁,x₂)=w xx₂.相互作用的符号决定了哪些配置更有可能:如果 w<0w0,相反的配置x₁=x₂具有较低的能量(较高的概率)。如果 w > 0,等构型 x ₁= x ₂能量较低(概率较高)。提高温度 T 使得高能配置更有可能。在非常高的温度极限下,不管相互作用强度如何,态都变得近似等概率。**

结构

设计基于能量的模型的下一步是选择能量函数。我们从可以说是最简单有趣的模型开始:具有两个自由度的粒子集合,其能量函数取决于粒子的单个状态以及它们之间的成对相互作用。用向量
=(σ₁, σ ₂,…, σ ₙ)来描述这 n 个粒子的状态,其中σᵢ∈{-1,1}是第 i 个粒子的状态。由此产生的能量函数为

这个能量函数被称为伊辛模型【25】。参数 b ᵢ设定了粒子的个体能量,这取决于状态 bσ ᵢ = b ᵢ。参数 w ᵢⱼ 对于 w ᵢⱼ > 0,相反的状态( σ ᵢ=− σ ⱼ)导致更高的能量。这种基于能量的模型被称为 Hopfield 网络。能量函数中的参数ᵢⱼ可以被视为图中的加权边,因此该模型可以由网络表示——神经网络,当粒子本身被视为神经元时。**

使用该模型可以执行哪些任务?考虑零温度的情况。在平衡状态下,只能观察到最低能态。如果系统被设置为具有较高能量的状态,并被允许平衡回到零温度,则它回复到具有最低能量的基态之一。如果数据被编码到系统的基态中,该模型有能力从不完整或损坏的输入中检索数据实例,这些输入是非平衡状态。该模型可以作为一个自动联想记忆【1】,当相似的模式作为输入时,能够“记住”模式。**

Hopfield 网络的能量函数只考虑成对的相互作用。将范围扩展到更复杂的模型是可能的,但代价很大:它们通常更难训练,也更难对它们进行推理。相反,新的粒子可以被添加到网络中,这些粒子不用于表示数据,但是它们的作用是增加模型的整体复杂性。它们被称为隐藏节点(如网络中的节点),充当其余可见节点之间的中介,对数据进行编码。每个隐藏或可见节点的集合被称为一个**

在物理上,隐藏节点能够实现可见节点之间的有效高阶交互,从而为可见节点产生新的有效能量函数[26,27]。由此产生的网络被称为玻尔兹曼机器,意指控制其行为的玻尔兹曼分布。它们是 Hopfield 网络的推广,在某种意义上,它们是作为一种特殊情况而包含的:当隐藏和可见节点之间的相互作用 w ᵢⱼ设置为零时,玻尔兹曼机器简化为 Hopfield 网络。重要的是,玻尔兹曼机器不仅比 Hopfield 网络更强大,而且在某种意义上也是最强大的:它们是通用的近似器,原则上能够以任意精度复制任何离散的概率分布[28]。**

模拟和训练波尔兹曼机器可能具有挑战性。为了促进进展,可以研究一些连接被设置为零的模型。在最极端的情况下,所有层内连接都被移除,只留下可见和隐藏节点之间的连接。由此产生的模型被称为受限玻尔兹曼机器 (RBMs)。通常,RBM 的状态用可见( v )和隐藏( h )节点、
=(v
h )来表示,其能量函数由下式给出****

与全连接玻尔兹曼机相比,RBM 更缺乏表现力,因为它的参数更少。然而,在模拟和训练这些模型中获得的优势超过了表达能力的损失,特别是因为不太复杂的模型往往概括得更好[29]。我们在本文中研究的三个基本的基于能量的模型,Hopfield networks、Boltzmann machines 和 RBMs,如下图所示,我们介绍了不同的架构,并说明了隐藏节点如何使模型变得更加复杂。

当能量函数不包含偏置项时,Hopfield 网络和 Boltzmann 机具有所谓的翻转对称性:如果我们翻转所有节点的值,翻转前后的状态具有相同的能量。因此,在所有节点上因翻转而不同的模式是无法区分的。添加隐藏节点可以通过向每个可见模式分配非对称的隐藏节点状态来打破这种对称性。下图说明了这种行为(查看 互动版 获得更多直觉)

Hopfield 网络(左):节点的数量等于输入数据的大小。没有隐藏节点(虚线)贡献能量,这限制了该模型的表达能力。在这篇文章的互动版本中,你可以点击节点来翻转它们所有的值,但是对于没有偏置项的 Hopfield 网络,这两个状态具有相同的能量。您可以将鼠标悬停在节点和连接上以获取更多信息。玻尔兹曼机(中):玻尔兹曼机网络完全连通。可见节点(黑色或白色)被钳制到输入数据,隐藏节点(红色或灰色)是自由参数。我们在整篇文章中使用这种配色方案来区分隐藏节点和可见节点。我们为翻转的可见配置分配不同的隐藏模式,因此翻转的可见节点在翻转前后具有不同的能量。受限玻尔兹曼机(右):RBM 使用隐藏和可见节点,但同一层内不允许连接,即网络是二分的。这种限制大大简化了训练。(本图的互动版可以在这里找到http://physicsofebm.github.io/****)********

抽样

从物理角度来看,从玻尔兹曼分布中取样在概念上很简单:只需将系统与所需温度的环境接触,并记录系统在不同时间的状态。但是建造这些系统并设计它们的能源功能在实践中极具挑战性。然而,最近有人提议建立概率计算机,采用与热噪声相互作用随机磁隧道结来物理实现概率位(p 位)[59]或其基于 FPGA 的模拟[60]。今天,在实践中,人们使用标准计算基础设施模拟这种概率机器,基于具有 von Numann 架构的图灵机,因此与它们在不久的将来可能发生的直接物理实现相比,需要额外的能量和时间开销[59]。

首先考虑零温度情况。玻尔兹曼分布背后的关键物理原理是能量和概率之间的联系。模拟波尔兹曼分布采样的策略是识别低能态,并根据温度偶尔选择高能态。一个简单的方法是局部改变每个粒子的状态,从而降低系统的总能量。对于伊辛能量函数,通过将第 i 粒子的状态从 σ ᵢ变为 σ ᵢ而引入的能量变化(δe)为**

为了寻找平衡状态,我们迭代地应用更新规则

只有当这种变化降低了能量时,才会翻转节点的值。从随机初始化开始,通过重复更新单个粒子的状态,系统的状态收敛到局部最小值[30]。这种方法不能保证找到真正的基态,即能量函数的全局最小值。对于有限的温度,策略是相似的,除了现在有可能偶尔跳到更高的能量状态。在这种情况下,更新规则是:

其中p= exp((1/teᵢ).在物理上,这些向更高能态的跳跃模拟了在有限温度下与环境交换能量时产生的随机热波动。这种采样算法是 Metropolis-Hastings 算法[31,32]的一个具体实例,当分布已知达到一个归一化常数时,这种算法特别方便,例如玻尔兹曼分布。下图说明了运行中的算法。******

从玻尔兹曼分布中取样(此图的交互式版本可在 这里找到 )。该图显示了一个简化的能量景观,其中能量函数的最小值对应于编码一个 MNIST 数字的状态。相邻状态是随着能量增加而变得越来越嘈杂的变体。采样算法从随机选择的状态开始,您可以通过单击相应的黄色点来选择该状态。在非常低的温度下,算法的每一步都将状态更新为具有较低能量的状态,直到我们达到并停留在局部最小值。当前状态以红色突出显示。在更高的温度下,算法的每一步都可能跳到更高的能量状态,并且最终的采样状态不一定是局部最小值。

吉布斯采样

对该算法的一个可能的改进是找到局部更新规则在寻找低能量状态方面甚至更好的模型。本地更新的问题是能量的变化

对于节点,i 依赖于所有其他节点的状态。因此,每次状态σi σi 被更新时,影响会扩散到所有其他节点,改变它们的本地更新规则。但对于 RBM 来说,情况并非如此。可见节点中的能量变化,**

不依赖于任何其他可见节点:当其中一个节点翻转时,其他可见节点不受影响。这使得本地更新规则更加有效,因为可见节点的整个集合可以被视为单个实体。当可见节点固定时,类似的语句适用于更新隐藏节点。事实上,RBM 中缺乏层内相互作用意味着条件概率 P ( v|h )和 P ( h|v )分解为:

此外,由于同一层中节点之间的独立性,单个条件概率可以通过分析计算得出,如下所示:[33]

剩余的概率p(hⱼ= 1 |v)和p(vᵢ= 1 |h)遵循这些等式。RBM 的这些特性允许一种新的采样策略:******

  1. 修复隐藏的节点。从条件分布p(v | h)=∏ᵢp(vᵢ|h)中通过从其分布p(v| h)中独立采样每个节点的状态来从条件分布p(中采样可见节点。******
  2. 根据上一步的示例修复可见节点。从条件分布p(h | v)=∏ᵢp(hᵢ|v)中抽取隐藏节点,从其分布
    p(hᵢ|v中独立抽取每个节点的状态。******
  3. 重复上述步骤 N 次,选择合适的 N

由此产生的状态( vh )将从系统的波尔兹曼分布中近似采样。这种算法被称为吉布斯采样,它是实践中对 RBM 进行采样的典型方法【3】。**

培养

我们已经知道,概率模型可以根据与热平衡的物理系统相同的原理来构建。我们还确定了有用的架构,并开发了从它们的玻尔兹曼分布中取样的算法。最后一个挑战仍然存在:如何训练这些系统来执行特定的任务?在这种情况下,训练等价于逆伊辛问题;即识别产生期望概率分布的能量函数的参数。

为了便于说明,考虑一个简单的物理系统:一个质量 m 与一个弹簧相连。弹簧的特征在于常数 k 并且质量经受位置相关的力F(y)=ky,其中 y 是质量的位移。如果将质量置于重力场中,它会受到一个恒定的外力 F ᴳ= mg ,其中 g 为重力加速度。只有在这两个力平衡的精确位置,即当fᴳ+f(y)= 0 时,质量才处于平衡状态。******

训练与平衡(此图互动版可在 此处 )。与训练耦合节点相比,弹簧-质量系统中的平衡力。质量是固定的,重力 F ᴳ是恒定的。如果弹簧伸展到一个位置,使得f(y)=fᴳ,即,使得合力 F 为零,则力处于平衡状态。在一个简单的基于能量的模型中,外部“力” F ᴰ,即节点对数据的期望值,是恒定的。培训包括识别联轴器 θ ,以使虚拟力 F ( θ )与 F(θ)=Fᴰ的数据“力”平衡。

对于具有单参数能量函数e(x)=θf(x)的模型,期望值⟨ f ( x )⟩是玻尔兹曼分布的充分统计量——知道这个期望值唯一地固定了参数 θ ,因此也固定了分布p(x)= 1/目标是训练一个基于能量的模型来重现数据集的统计数据,指定为一组状态( x ⁽ ⁾, x ⁽ ⁾,…, x ⁽ᵐ⁾).)训练模型相当于辨识参数 θ ,使得模型的充分统计量与数据的充分统计量一致,即⟨f(x)⟩ᵐᵒᵈᵉᴵ=⟨f(x)⟩ᵈᵃᵗᵃ。由于对模型分布的期望取决于 θ ,对于合适的函数 F ( θ ),我们可以写成⟨f(x)⟩ᵐᵒᵈᵉᴵ=:f(θ)。对数据的期望是不变的,所以我们可以写成
f(x)⟩ᵈᵃᵗᵃ=:fᴰ。将这些解释为作用在相反方向上的广义力,并将参数 θ 解释为广义位置,当位置 θ 使得力处于平衡状态时训练模型:fᴰ+f(θ)= 0。******

当力不平衡时,例如如果重力的拉力超过了弹簧的恢复力,物体就会加速并改变位置。对于静止开始的物体,由于力的不平衡引起的初始位移为

其中 η > 0 是一个常数,取决于物体的质量和力作用的时间。第一个力 F ᴰ可以解释为由外部系统产生的外力,比如地球引力场。对于基于能量的模型,外部系统实际上是一组训练数据,其向数据集中出现的优选状态提供恒定的“拉力”。第二个力 F ( θ )代表系统对某些状态的自然偏好。这提供了一个内部提升,对抗训练数据的向下拉力。至关重要的是,在两个不同方向的竞争力量存在的情况下,由此产生的位移导致物体移动到一个减少力量不平衡的位置。例如,在弹簧-质量系统中,如果fᴳ>ky,质量被向下拉到一个新的位置y′>t14】y,这增加了弹簧产生的力,使两个力更接近平衡。通过对足够小的步长重复应用上述更新规则,可以找到平衡两个虚拟力的参数值,从而得到训练模型。我们现在将这种物理直觉发展成基于能量模型的具体训练策略。****

训练 Hopfield 网络

训练 Hopfield 网络等同于识别参数,使得能量函数的基态是输入数据的状态。假设给我们一个单一的 n 维数据向量σ⁽⁾.有一个简单的方法来确保它是一个基态:设置所有的 b ᵢ=0 并固定wᵢⱼ=σᵢ⁽⁾σⱼ⁽⁾。于是,能量函数是e(σ)=−⟨σ⁽⁾, σ ⟩,当内积⟨ σ ⁽ ⁾,σ⟩=σᵢσᵢ⁽⁾, σ ᵢ最大化时,即当σ=时,能量函数达到最小值对于更多的数据点 σ ⁽ ⁾、 σ ⁽ ⁾,…、 σ ⁽ᵐ⁾,我们遵循类似的规则,这次将交互参数设置为******

注意我们之前研究的虚构力的出现。这种策略被称为 Hebbian 学习,当所有数据向量几乎相互正交时效果最佳,在这种情况下,所有数据点都是能量函数的局部最小值【34,35】。否则,可能会出现与数据向量不对应的所谓伪最小值,从而导致错误的内存检索[36]。

为了解决伪最小值的问题,引入了“不学习”的概念来提高 Hopfield 网络的性能[37]。对于不学习,根据以下条件设置参数

其中ϵt40】0 是一个小参数。模型平衡状态**

通过选择一个随机的初始状态并使用前面描述的采样算法找到平衡状态来获得。在采样过程中,模型的权重根据赫比规则设置。在模型状态上增加这个期望值导致所有最小值的能量增加,包括虚假的。通过适当选择 ϵ 的值,这种能量的增加可以导致虚假最小值的消失,从而导致“不学习”。

训练波尔兹曼机器

训练一个 RBM(此图的交互版可以在这里找到http://physicsofebm.github.io/****):偏置可以通过移动“偏置域”内的节点来调整。可以使用 2D 滑块来调整权重。右边的直方图显示了某个状态变得有多可能。我们鼓励读者尝试调整 RBM 的参数,以便它学习某种数据模式,即最有可能产生特定的可见状态。****

当应用于 Boltzmann 机器时,Hebbian 学习和去学习技术是有问题的:因为只有可见节点编码数据,所以不清楚如何给隐藏节点赋值。Hebbian 学习规则可以提升为一个更新规则,该规则通过每一步迭代地提高权重。通过这样做,我们允许隐藏的节点与可见的节点一起“移动”,从而训练完整的模型。从初始值 w ᵢⱼ开始,权重被更新为**

其中η0 为小学习率。每当 σσ ⱼ包含隐藏节点时,通过将可见单位固定到数据上,然后使用 Gibbs 采样来获得隐藏节点的值,从而获得数据的平均值。在 RBM 的特定情况下,当设置 ϵ =1 时,更新规则采用以下形式****

这一规则被称为用于培训 RBM 的对比差异公式。希伯来学习术语⟨ vh ⱼ ⟩ᵈᵃᵗᵃ,通常被称为正相位,降低了训练数据的状态能量。未学习项⟨vhⱼ⟩ᵐᵒᵈᵉᴵ(负相)增加了所有接近平衡态的能量。下图说明了竞争的 Hebbian 学习项和 unlearning 项如何帮助学习一个模式,同时避免局部伪最小值。******

学习与遗忘(该图的交互式版本可以在这里找到http://physicsofebm.github.io/****):一个随机初始化的系统有一个能量景观(这里用一条简化的曲线表示),它有许多不同的局部极小值。在物理学中,这通常被称为自旋玻璃相[34]。在基于能量的模型中,学习某个状态(红点)意味着它们的能量需要减少。这可以通过局部更新模型权重的“学习步骤”来实现,以降低数据状态的能量,我们称之为 Hebbian 学习项(正阶段)。你可以点击“不遗忘”按钮来尝试一下。这种策略的缺点是,依赖于系统的初始化,其他点的能量可能是局部最小值。相反,通过在学习和遗忘步骤之间交替,你可以通过点击“有遗忘”按钮来做到这一点,虚假最小值的出现可以通过遗忘项(负相位)来减少。将鼠标悬停在橙色和红色的点上可以显示它们代表的图案。在左边,我们从一个更全球化的视角展示了某些状态的能量会发生什么。****

对比发散的作用是逐渐塑造模型的能量函数,直到模型的所有低能态对应数据点。将权重视为广义位置,我们将术语
δ
w
ᵢⱼ:=⟨
v
h
ⱼ⟩ᵈᵃᵗᵃ−⟨vhⱼ⟩ᵐᵒᵈᵉᴵ解释为源自两个竞争力的净力:由数据产生的固定外力,以及由系统的特定广义位置产生的内力。当力不平衡时,会导致位置向力更接近平衡的方向移动。权重的每一次移动都在影响所有力的整个模型中传播,因此对比发散训练算法的策略是设置一个小的学习率 η ,直到所有力都平衡并且模型被训练。******

下图收集了我们到目前为止所涉及的概念,展示了一个训练有素的 RBM 如何从损坏的输入中恢复数据实例。一旦模型被训练,能量函数的最小值对应于编码数据。具有大能量的受损输入可以通过允许系统平衡回到低能量状态来修复。

使用 RBM 恢复受损图像(此图互动版可在 此处 )。在这个例子中,用部分损坏的 MNIST 数字初始化训练模型的可见单元。经过训练的模型的低能量状态对应于真实的 MNIST 数字,因此可以通过更新网络的节点来修复输入,直到它们对应于平衡状态。这可以通过吉布斯采样来实现。第一步,可见节点固定,隐藏节点通过从条件分布 P ( h|v )中采样其新状态进行更新。下一步是修复隐藏节点并对可见节点进行采样。重复这一过程,每一步都降低能量(用人工曲线可视化),直到恢复平衡状态。

展望:物理学和机器学习的未来研究

基于能量的模型正经历着兴趣的复苏:它们训练稳定,需要很少的参数,表现出高样本质量,泛化能力,并服从组合性[13]。这些都是其他生成模型,如变分自动编码器或生成敌对网络难以应对的特征。在提高培训规模方面也取得了进展[13,38]。随着这些发展,有迹象表明这一系列模型继续与机器学习相关。然而,基于能源的模型还需要在几个前沿领域进行改进。由于状态空间的组合爆炸,对离散数据的学习和推理仍然极具挑战性,这通常被称为维数灾难。特别是,基于能量的模型中的训练和概率推断仍然是低效的。这是由于计算或采样配分函数的困难,从计算复杂性的角度来看,这是一项困难的任务,这源于最坏情况下离散优化问题的 NP 难度。开发基于物理的模型来解决这些困难是一个重要的机会,特别是从我们下面讨论的非平衡统计物理或量子模型的前景来看。在机器学习、量子计算、多体物理学和最优化的界面上有令人兴奋的新兴研究领域。这种融合提供了一个独特的机会,在这些主要学科之间的相互接口作出贡献。

在量子力学中,一个系统的可能状态被扩展到还包括不同状态上的线性组合,称为叠加态。例如,n 个 n 个粒子的状态先前由向量
x =( x ₁、 x ₂、…、 x ₙ).表示在量子设置中,更一般的状态 ψ 是可能的,具有以下形式
**

其中复系数 c ( x )满足∑ₓ | c ( x )| =1。这个性质产生了干涉和纠缠等概念。第二个变化是能量函数,通常在这种情况下称为哈密顿量,被算子所取代。它们通常采取以下形式

其中帽子用来表示这些是操作符。这一变化具有深远的影响:运营商通常不通勤,即它可能持有

这一特性是不确定性原理和不可克隆定理等概念的基础。

作为一个具体的例子,我们可以用一个哈密顿量来描述量子玻尔兹曼机

单个运算符 σ ᵢ⁽ᶻ⁾,当表示为矩阵时,采用以下形式

上标用来表示算子是对角的特定基。通过使用非交换操作符,这个模型可以变得更有趣

在哪里

请注意, σ ᵢ⁽ˣ⁾不与 σ ⱼ⁽ᶻ⁾一起通勤。这被称为横向场伊辛模型。量子玻尔兹曼机是一个由任何这样的哈密顿量描述的系统,它至多涉及粒子间的成对相互作用。从理论上理解这些模型,推导出有效训练它们的方法,并在实践中实现它们,这些都是目前正在进行的任务[19,40,41]。**

除了量子模型,我们还可以考虑自旋玻璃——伊辛哈密顿量的推广——它为表示离散优化问题提供了一种计算通用语言[42,54]。这种系统的能量函数包含以下形式的项

值得注意的是,这种广义自旋玻璃系统的低能态的物理复杂性和找到所有这种态的巨大困难与计算机科学中许多重要问题的计算复杂性有着根本的联系。例如,这在数学上等价于在给定的近似比内对 NP-hard 组合优化问题的高质量解进行计数[43],或者在图形模型中对概率推断进行采样配分函数[44]。因此,探索广义自旋玻璃复合体的结构和动力学及其相变可以导致对非平衡复杂动力学系统中涌现的多体现象的更深入理解,这些现象是几十年来跨越许多不同学科的主要公开问题,包括凝聚态物理、物理化学、生物学、理论神经科学、经济学和社会科学。

对这类问题的解空间进行采样的一类受概率物理学启发的方法是基于马尔可夫链蒙特卡罗技术,例如 Metropolis-Hastings 算法、模拟退火[45]和并行回火[46]。更先进的方法是在马尔可夫链蒙特卡罗家族的主干算法上结合概率聚类更新策略[47,48,49,50,51,52]。然而,这些方法要么对受抑自旋玻璃系统失效[48],对大于 2 的维度进行过滤[49],要么假设随机的树状子图[50,51,52],这些子图不一定与潜在自旋玻璃问题的实际低能激发“液滴”相关。

不幸的是,自旋玻璃系统的离散性质及其包含大量无序和挫折的固有能力,使得将现成的基于梯度的机器学习算法应用于这种复杂系统成为可能。最近,已经进行了一些尝试,在生成模型中应用先进的技术,例如通过基于 MCMC 的工具(如平行回火)和某些弛豫技术来表征自旋玻璃复合物[54]来组合归一化流。

已经证明可以成功地学习自旋玻璃相的某些物理和计算性质,包括多模态稳态分布和亚稳态之间的拓扑结构。值得注意的是,学习本身可以对应于经过训练的归一化流层内自旋玻璃的相变[54]。总的来说,有机会采用机器学习和统计力学技术的这种组合,以针对困难问题的某些子集的实例方式有效地采样高质量的解决方案。[61]

物理学和机器学习的进步将受益于这两个领域之间的相互作用。机器学习与量子计算、量子控制和多体系统的接口正在出现。机器学习工具可以帮助理解物理数据[55,56],设计新的实验[57],用新的方法解决老问题[58]。类似地,来自物理学的见解可以激发新的模型,并导致新的硬件。物理学和机器学习相结合,继续扩展视角,增加理解,并推动技术的前沿。

本帖互动版可以在 这里 找到。由于 Medium 不支持用 Latex 编写的 Javascript 和方程,我们建议也查看一下我们的交互式帖子。

参考

  1. 具有突发集体计算能力的神经网络和物理系统
    霍普菲尔德,J.J .,1982。美国国家科学院院刊,第 79 卷(8),第 2554-2558 页。国家科学院。
  2. 玻尔兹曼机器的学习算法
    Ackley,D.H .,Hinton,G.E .和 Sejnowski,T.J .,1985。认知科学,第 9 卷(1),第 147-169 页。爱思唯尔。
  3. 论对比差异学习。卡雷拉-佩皮南,硕士和辛顿,通用电气公司,2005 年。《美国统计》,第 10 卷,第 33-40 页。
  4. 基于能量的学习指南
    LeCun,y .,Chopra,s .和 Hadsell,r .,2006。
  5. 用人工神经网络解决量子多体问题
    Carleo,g .和 Troyer,m .,2017。科学,第 355 卷(6325),第 602-606 页。美国科学促进协会。
  6. 用深度神经网络高效表示量子多体态
    高,x .和段,l . 2017。《自然通讯》,第 8 卷第 1 期,第 662 页。自然出版集团。
  7. 神经网络量子状态层析成像
    Torlai,g .,Mazzola,g .,Carrasquilla,j .,Troyer,m .,Melko,r .和 Carleo,g .,2018。自然物理学,第 14 卷第 5 期,第 447 页。自然出版集团。
  8. 量子物理中的受限玻尔兹曼机器
    Melko,R.G .,Carleo,g .,Carrasquilla,j .和 Cirac,J.I .,2019。自然物理学,第 15 卷(9),第 887-892 页。自然出版集团。
  9. 用于协同过滤的受限波尔兹曼机器
    Salakhutdinov,r .,Mnih,a .和 Hinton,g .,2007。第 24 届机器学习国际会议论文集,第 791–798 页。
  10. 基于深层结构能量的异常检测模型
    翟,s,程,y,陆,w,张,z,2016。arXiv:1605.07717。
  11. 使用均值协方差受限玻尔兹曼机进行电话识别
    Dahl,g .,Ranzato,m .,Mohamed,a .和 Hinton,G.E .,2010。神经信息处理系统进展,第 469-477 页。
  12. 关于基于能量的模型的自动编码器和分数匹配
    Swersky,k .,Buchman,d .,Freitas,N.D .,Marlin,B.M .等人,2011 年。第 28 届机器学习国际会议录(ICML-11),第 1201–1208 页。
  13. 基于能源的模型中的隐式生成和推广
    Du,y .和 Mordatch,I .,2019。arXiv:1903.08689。
  14. 深度信念网络是紧凑的通用近似器
    勒鲁和本吉奥,纽约,2010 年。神经计算,第 22 卷(8),第 2192–2207 页。麻省理工出版社。
  15. 生成性对抗网络、逆向强化学习和基于能量的模型之间的联系
    Finn,c .,Christiano,p .,Abbeel,p .和 Levine,s .,2016。arXiv 预印本 arXiv:1611.03852。
  16. 基于深度能源政策的强化学习
    Haarnoja,t .,Tang,h .,Abbeel,p .和 Levine,s .,2017。第 34 届机器学习国际会议论文集-第 70 卷,第 1352-1361 页。
  17. 基于能源模型的模型规划
    Du,y .,Lin,t .和 Mordatch,I .,2019。arXiv:1909.06878。
  18. 基于能量的生成对抗网络
    赵,j . Mathieu,m .和 LeCun,y . 2016。arXiv:1609.03126。
  19. 量子玻尔兹曼机器
    Amin,M.H .,Andriyash,e .,Rolfe,j .,Kulchytskyy,b .和 Melko,r .,2018。物理评论 X,第 8 卷(2),第 021050 页。APS。
  20. 连续问题的量子近似优化算法
    Verdon,g .,Arrazola,J.M .,Bradler,k .和基洛兰,n .,2019。arXiv 预印本 arXiv:1902.00409
  21. 经典力学
    戈尔茨坦,h,2002。{培生教育}。
  22. 信息论和统计力学
    杰恩斯,E.T .,1957。物理评论,第 106 卷(4),第 620 页。APS。
  23. 学习用于分类的判别充分统计得分空间
    李,x,王,b,刘,y,李铁生,2013。数据库中的机器学习和知识发现欧洲联合会议,第 49-64 页。
  24. 使用所有数据的逆伊辛推理
    Aurell,e .和 Ekeberg,m .,2012。物理评论快报,第 108 卷(9),第 090-201 页。APS。
  25. 伊辛模型简介
    Cipra,文学学士,1987 年。美国数学月刊,第 94 卷(10),第 937-959 页。泰勒和弗朗西斯。
  26. 非微扰 k 体到两体交换转换哈密顿量并将问题实例嵌入伊辛自旋
    Biamonte,j .,2008。物理评论 A,第 77 卷(5),第 052331 页。APS。
  27. 用于编译绝热量子优化问题的资源高效小工具
    Babbush,r .,O'Gorman,b .和 Aspuru-Guzik,a .,2013 年。《物理学年鉴》,第 525 卷(10-11 期),第 877-888 页。威利在线图书馆。
  28. 受限玻尔兹曼机器和深度信念网络的代表性力量
    Le Roux,n .和 Bengio,y .,2008。神经计算,第 20 卷第 6 期,第 1631-1649 页。麻省理工出版社。
  29. 探索深度学习中的泛化
    Neyshabur,b .,Bhojanapalli,s .,McAllester,d .和 Srebro,n .,2017。神经信息处理系统进展,第 5947–5956 页。
  30. 神经网络:系统介绍。施普林格出版社。
  31. 使用马尔可夫链的蒙特卡罗抽样方法及其应用
    黑斯廷斯,W.K .,1970。牛津大学出版社。
  32. 大都会—黑斯廷斯算法
    罗伯特,C.P .和卡塞拉,g .,1999 年。蒙特卡罗统计方法,第 231-283 页。斯普林格。
  33. 受限玻尔兹曼机器介绍
    Fischer,a .和 Igel,c .,2012。伊比利亚美洲模式识别大会,第 14-36 页。
  34. 神经网络的自旋玻璃模型
    Amit,D.J .,Gutfreund,h .和 Sompolinsky,h .,1985 年。物理评论 A,第 32 卷(2),第 1007 页。APS。
  35. 神经网络的自旋玻璃模型【链接】
    范·赫蒙,法学博士,1986 年 10 月 1 日。,第 34 卷(4),第 3435-3445 页。DOI:10.1103/physreva . 34.3435
  36. 神经网络:系统介绍
    罗哈斯,r .,2013 年。施普林格科学\ &商业媒体。
  37. “忘却”在集体记忆中有稳定作用【链接】
    霍普菲尔德,J.J .,范斯坦,D.I .和帕尔默,R.G .,1983–07。,第 304 卷(5922),第 158 页。 DOI: 10.1038/304158a0
  38. 基于 MCMC 的基于能量模型的最大似然学习剖析
    Nijkamp,e .,Hill,m .,Han,t .,Zhu,s .和 Wu,Y.N .,2019。
  39. 量子计算与量子信息
    尼尔森,硕士,庄,2002。AAPT。
  40. 量子变分自动编码器【链接】
    Khoshaman,a .,Vinci,w .,Denis,b .,Andriyash,e .,萨德吉,h .和 Amin,M.H .,2018。量子科学与技术,第 4 卷(1),第 014001 页。{IOP}发布。DOI:10.1088/2058–9565/aada1f
  41. 用量子玻尔兹曼机器进行断层成像和生成训练
    Kieferova,m .和 Wiebe,n .,2017。物理评论 A,第 96 卷第 6 期,第 062327 页。APS。
  42. 旋转眼镜与复杂性【链接】
    Stein,D.L .和 Newman,C.M .,2013。普林斯顿大学出版社。
  43. 信息、物理和计算。牛津大学出版社。
  44. 计算的本质【链接】
    Moore,c .和 Mertens,s .,2011。牛津大学出版社。
  45. 模拟退火优化【链接】
    柯克帕特里克,s .,格拉特,C.D .和韦奇,M.P .,1983。科学,第 220 卷(4598),第 671-680 页。美国科学促进协会。DOI:10.1126/science . 220 . 4598 . 671
  46. 平行回火:理论、应用和新观点【链接】
    Earl,D.J .和 Deem,M.W .,2005 年。物理化学。化学。物理学,第 7 卷(23),第 3910-3916 页。皇家化学学会。 DOI: 10.1039/B509983H
  47. 蒙特卡罗模拟中的非普适临界动力学。物理牧师列特。,第 58 卷(2),第 86-88 页。美国物理学会。DOI:10.1103/physrevlett . 58.86
  48. 自旋系统的集体蒙特卡罗更新【链接】
    沃尔夫,美国,1989。物理牧师列特。,第 62 卷(4),第 361-364 页。美国物理学会。DOI:10.1103/physrevlett . 62.361
  49. 二维自旋玻璃的一种团簇蒙特卡罗算法【链接】
    侯代尔,j .,2001。欧元。《物理学报》,第 22 卷第 4 期,第 479-484 页。 DOI: 10.1007/PL00011151
  50. 从田地到树木,Hamze,f .和 de Freitas,n .,2004 年。第 20 届人工智能不确定性会议论文集,第 243-250 页。AUAI 出版社。
  51. 带挫折的{Ising-type}模型的高效子图采样
    Selby,a .,2014。
  52. 用聚类自旋的优化树求解自旋眼镜【链接】
    Hen,I . 2017。物理评论 E,第 96 卷(2),第 022105 页。美国物理学会。DOI:10.1103/phys reve . 96.022105
  53. 自旋玻璃系统的概率密度理论
    Hartnett,G.S .和 Mohseni,m .,2020 年。
  54. 具有归一化流的生成自旋玻璃的自我监督学习
    Hartnett,G.S .和 Mohseni,m .,2020。
  55. 相变的无监督学习:从主成分分析到变分自动编码器
    Wetzel,S.J .,2017。物理评论 E,第 96 卷(2),第 022140 页。APS。
  56. 多体定位中相变特征的自动发现
    Huembeli,p .,Dauphin,a .,魏特克,p .和 Gogolin,c .,2019。物理评论 B,第 99 卷(10),第 104-106 页。APS。
  57. 主动学习机学习创造新的量子实验
    Melnikov,A.A .,Nautrup,H.P .,Krenn,m .,Dunjko,v .,Tiersch,m .,Zeilinger,a .和布里格尔,H.J .,2018。美国国家科学院院刊,第 115 卷(6),第 1221-1226 页。国家科学院。
  58. 用神经网络发现物理概念
    Iten,r .,Metger,t .,Wilming,h .,Del Rio,l .和 Renner,r .,2018。arXiv 预印本 arXiv:1807.10300。
  59. 使用随机磁性隧道结的整数因子分解
    Borders,W.A .,Pervaiz,A.Z .,Fukami,s .,Camsari,K.Y .,Ohno,h .和达塔,s .,2019。《自然》,第 573 卷(7774 期),第 390-393 页。自然出版集团。
  60. 每秒千万亿次运算的自主概率协同处理
    萨顿,b .,法利亚,r .,甘塔萨拉,L.A .,贾斯瓦尔,r .,卡姆萨里,K.Y .和达塔,s .,2020。IEEE 访问,第 8 卷,第 157238–157252 页。IEEE。
  61. 米(meter 的缩写))Mohseni 等人(2021 年),正在编写中

成功数据科学的支柱

原文:https://towardsdatascience.com/the-pillars-of-successful-data-science-af4efe14b006?source=collection_archive---------36-----------------------

设计良好的分析数据仓库,利用自动化和自助分析

作者图片

数据科学(或可互换的分析)的目的是使业务用户能够根据数据做出更好的决策。定量数据通常比基于“猜测”或“直觉”的决策更好,但人们不应该盲目地遵循数据,因为——尤其是在商业环境中——必须在某些商业背景下和数据的限制范围内理解数据。在商业中,数据永远不会像在物理、化学、工程或其他硬科学中那样原始。我们没有运行高度受控实验的奢侈,也没有不变物理定律的优势!因此,当应用于业务时,从硬科学中借鉴的数据科学技术的使用应遵循以下一般理解:

  1. 数据永远不会是原始的,并且几乎永远不会支持超过一个小数位的精确度(例如,不计算到 5 个小数位的转换率)。商业不是物理。
  2. 数据科学家(或可互换的分析师)的主要目的是提供所需的主题专业知识,以判断数据有多好,应该使用什么数据科学技术,并了解我们对数据告诉我们的事情有多大信心。
  3. 不能被业务用户理解的数据科学(或分析)是没有意义的;其他数据科学家的主要目的是知道如何以业务用户可以理解的方式传达分析结果。与营销总监谈论数据的一阶矩(即平均值)就像用粤语与只会说英语的人交谈一样有用。数据科学家必须有丰富的数学经验,但同样重要的是能够用简单的英语与非专家交流。
  4. 报告不等于数据科学。报告的唯一目的是计数(例如,我们本周收到了多少订单?我们上个月卖了多少美元的小配件?).如果你付钱给一个数据科学家只是为了计数,你是在浪费他们的大脑和你的钱。数据科学是通过借用物理科学中长期使用的数学技术,获取原始的、基本的数据,并做出更高级的、不太明显的推论。然而,不要忘记上面那一点的重要性(第三点)。
  5. 当应用于商业数据时,花哨的数学技术不会比简单的技术产生更好的结果。参见第 1 点。当应用于大多数业务数据时,使用简单的线性模型可能会产生与神经网络一样好的答案。更高级的方法是有时间和空间的,但是在尝试更复杂的方法之前,先尝试简单的方法并运用判断力。参见第 2 点。

而且数据越多不一定越好!这是一个根本性的误解。添加坏数据就像给音乐添加更多的“随机噪音”……它的数据,而不是能帮助你更好地欣赏这首歌的数据。

三大支柱

任何企业中运行良好、高效且有用的数据科学部门都有三大支柱:

  1. 结构合理的分析数据仓库,将业务分解为一系列事实、维度和用户表。理解这三种类型的表之间的根本区别是很重要的。使用这种方法的主要挑战之一是不能清楚地描述事实表、维度表和用户表之间的区别!一个事实表正是它在简单英语中的意思:围绕单个实体(例如,订单)的事实集合。用户表通常包含跨实体的事实的特定组合(例如,出于财务计划与运营计划的目的的订单的特定定义——运营计划用户表可以包括对问题订单的修复,因为其工作必须完成,而财务用户表可以排除修复,因为它们不产生收入)。在英语中,尺寸是单词“by”之后的任何东西。例如,按渠道的订单数量(即,渠道是一个维度);各州的订单数量(即地理位置是一个渠道)。维度是为了理解数据而对数据进行“分段”的方式。
  2. 自动化使数据自动从数据源流入分析数据仓库,再从分析数据仓库流向用户。基本的标准分析应该在尽可能靠近数据仓库的地方自动应用,以避免浪费数据科学家的宝贵时间。他们拿工资是为了思考…而不是在电子表格间复制数据和应用简单的计算。
  3. 使用自助式分析,通过 QlikView 或 Tableau 等商业智能工具向业务用户推送精选信息。业务用户应该拥有并理解他们自己的数据,以便他们能够做出快速的信息驱动的决策。请注意,我们故意说“精选信息”,因为大量缺乏理解或结构化的数据是无用且有害的;数据越多并不总是越好。

这三件事对于一个运行良好的数据科学功能是必要的,因为任何数据科学项目中的大部分时间(或努力)都是而不是数据科学本身!它是您需要的数据的获取,有用的数据科学的重复 执行,以及数据科学的发布给业务用户,以便他们可以采取行动。我们将在以后的文章中详细阐述这些。

基于 EEG 的身份认证系统的流程和局限性

原文:https://towardsdatascience.com/the-pipeline-and-limitations-of-the-eeg-based-authentication-systems-df9f0a05d9ff?source=collection_archive---------13-----------------------

人工智能应用

将语音识别集成到认证系统中的新方法(2)

照片由马修·休姆从 Unsplash 拍摄

在前一部分中,我们回顾了现存的最常见的认证系统。我们意识到文本和图形密码以及生物识别方法的局限性,包括虹膜、指纹和面部识别。因此,在这一部分中,我们将深入探讨生物认证领域中更可行的方法之一:基于 EEG 的认证系统。

1.四个步骤

脑电在工业和科研中有着广泛的应用。它们涉及游戏交互的娱乐、机器人控制、情感识别、疲劳检测、睡眠质量评估和临床领域,如异常脑疾病检测和预测,包括帕金森病和阿尔茨海默病[ 10 ]。使用脑电信号进行身份认证是由 Thorpe et al. [ 11 ]首先提出的;作者提出了一个新的想法,使用脑电波进行用户认证,称为 Pass-think。基于脑电信号的认证系统主要由四个步骤组成:数据采集、预处理、特征提取和分类,如下图所示。

脑电生物认证系统的四个主要模块。图片来自研究论文[ 10

1.1 数据采集

脑电采集协议可分为睁眼或闭眼放松、视觉刺激、精神任务(做特定任务的想象)和情绪刺激[ 12 ]。

1.2 数据预处理

预处理阶段涉及不同的信号处理技术,为特征提取做好准备。一些方法是:不同时期长度中的信号分段或分帧,信号滤波以提取某些 EEG 频带、噪声和伪像,以及去除伪像。alo mari et al .[13]将通带为 0.1hz—40hz 的 Butterworth 滤波器应用于 EEG 数据,然后对数据进行分段、分类和伪迹检测,以研究在呈现密码期间测量的 EEG 信号之间的相关性,以及用户如何感知密码的可记忆性。他们的项目表明,有可能根据密码演示期间的脑电图活动来预测随后的密码回忆。

1.3 特征提取

特征提取是脑电信号处理的关键部分。这些技术已经在不同的领域得到应用,例如频率特征、时频特征、统计特征、基于熵的特征和高阶交叉(HOC)特征。Zeynali 等人[ 14 ]提出了一种通过使用离散傅立叶变换、离散小波变换、自回归建模、能量熵和样本熵来减少基于 EEG 的密钥生成过程的误差的模式。Petrantonakis [ 15 ]对 EEG 数据应用了特别的特征提取分析来识别情绪。

EEGLAB 是用于 EEG 数据处理的最广泛的 Matlab 工具箱,它提供了一个交互式图形用户界面,供用户将独立分量分析(ICA)、时间/频率分析(TFA)和标准平均方法应用于记录的脑信号;开源实时 EEG 源映射工具箱(REST)是另一个在线伪影拒绝和特征提取的有用工具[10]。

1.4 分类

目前大多数基于 EEG 的脑机接口(BCI)都是基于机器学习算法,最近设计的基于 EEG 的 BCI 的分类算法可以分为四大类:自适应分类器、矩阵和张量分类器、迁移学习和深度学习,加上少数其他杂项分类器 16 。神经网络(NN)和支持向量机(SVM)已经被 Alomari 等人用于检查密码可记忆性和回忆的相关性[ 17 ] [ 13 ]。杨18提出了一种采用一键编码技术的多项分类法来识别用户的大脑密码。

2.限制

2.1 脑电图数据库的规模

大多数脑电图分析任务使用一个小数据集。Alomari 等人[ 13 ]通过电子邮件广告从 77 名大学志愿者那里获得了使用 Muse 头带记录的脑电图数据;在他们的另一项研究工作[ 17 ]中,他们通过对 19 名大学生进行实验室研究,在学生面前出示两套密码时记录数据,从而获得数据。样本量特别有限。

一些脑电图数据库可公开用于人类识别目的,例如 UCI KDD 脑电图数据库,脑电图运动/想象数据集,以及澳大利亚数据库。尽管如此,数据集的规模不能决定所提出的系统可以推广到大规模的脑电图数据的表现。因此,需要在不同的数据采集场景下收集和测试更显著的群体,以证明 EEG 信号对于被视为每个人的标识的个体是唯一的。

2.2 心理健康的影响

在大多数实验中,健康人的大脑信号作为样本进行测试;然而,精神障碍存在于现实生活中,它可能会改变脑电波形状,从而改变分类模型的结果。关于精神障碍对脑波信号的影响以及脑电图鉴定结果的表现,还需要做更多的研究。

2.3 脑电图设备

大多数精确的脑电图设备需要在头皮上放置多个电极,不便于商业使用。随着技术的发展,越来越多的干电极便携式设备被发明并应用于日常生活中。下表列出了脑电图设备的概况;它规定了传感器类型(无论是干的还是湿的)、通道数量、采样率、重量以及与每种产品相对应的更多特性。干式设备的主要缺点是其精确度不如医疗领域中使用的其他 BCI 设备。因此,带有干电极的便携式设备是否是记录用于识别个人的 EEG 数据的合适选择,值得更多的研究。

所有脑电图设备。图片来自报纸[10]

在本系列的下一部分,我将更多地讨论基于语音的认证系统及其局限性,然后提出一个集成了语音识别的新型认证系统。

敬请关注,欢迎在 Linkedin 上留下评论和我联系。

https://www.linkedin.com/in/fangyiyu/

第 1 部分后的参考资料:

[10] X. Gu,Z. Cao,A. Jolfaei,P. Xu,D. Wu,T.-P. Jung 和 C.-T. Lin,“基于 Eeg 的脑-机接口(bcis): 信号传感技术和计算智能方法及其应用的近期研究综述,《IEEE/ACM 计算生物学和生物信息学汇刊》,2021 年。

[11] J. Thorpe,P. C. Van Oorschot 和 A. Somayaji,“Pass-thoughts:authenticating with our minds”,载于《2005 年新安全范例研讨会会议录》,2005 年,第 45-56 页。

[12] M. Abo-Zahhad、S. M. Ahmed 和 S. N. Abbas,“基于脑电图信号的个人识别的最新方法和未来前景”,《IET 生物识别》,第 4 卷,第 3 期,第 179-190 页,2015 年。

[13] R. Alomari 和 M. V. Martin,“利用神经网络预测密码记忆性的脑电信号分类,”,2018 年第 17 届 IEEE 机器学习与应用国际会议(ICMLA)。IEEE,2018 年,第 791–796 页。

[14] M. Zeynali、H. Seyedarabi 和 b .莫扎法里·塔泽坎德,“使用大脑信号开发具有可重复性的基于生物特征的唯一加密密钥生成,《人工智能和数据挖掘杂志》,第 8 卷第 3 期,第 343–356 页,2020 年。

[15] P. C. Petrantonakis 和 L. J. Hadjileontiadis,“使用高阶交叉点从脑电图中识别情绪”, IEEE 生物医学信息技术汇刊,第 14 卷,第 2 期,第 186-197 页,2009 年。

[16] F. Lotte,L. Bougrain,A. Cichocki,M. Clerc,M. Congedo,A .拉科-commonly,和 F. Yger,"基于 EEG 的脑机接口分类算法综述:10 年更新,《神经工程杂志》,第 15 卷,第 3 期,第 031005 页,2018 年。

[17] R. Alomari,M. V. Martin,S. MacDonald 和 C. Bellman,“使用脑电图预测和分析密码记忆性,”2019 年 IEEE 认知计算国际会议(ICCC)。IEEE,2019 年,第 42–49 页。

[18] G.-C. Yang,“基于脑电信号和深度学习的下一代个人认证方案”,信息处理系统杂志,第 16 卷第 5 期,第 1034–1047 页,2020 年。

成为人工智能领跑者的披萨连锁店

原文:https://towardsdatascience.com/the-pizza-chain-that-became-an-ai-front-runner-a0e297320cf6?source=collection_archive---------11-----------------------

达美乐比萨采用了几种人工智能策略

本文所有插图均由作者制作。

当你听到人工智能这个词时,你首先想到的是哪家公司?DeepMind?OpenAI?波士顿动力公司?不管是什么,很可能不是达美乐披萨。但这家国际披萨连锁店是人工智能的一个有趣案例。

达美乐对人工智能的采用相当引人注目,主要是因为该公司是 T2 最不可能采用人工智能的公司之一。是的,它是一家跨国非科技公司,成立于 20 世纪 60 年代,拥有精简的价值链和市场主导地位。如果你明白我的意思,具有这些特征的公司往往会在数字化派对上迟到。

对于拥有优化价值链的大公司来说,采用人工智能可能是一个巨大的挑战,因为流程往往需要从根本上重新设计。这就是为什么逐步采用人工智能解决方案并为每个活动使用合适的人工智能策略至关重要。

我最近发表了一篇关于人工智能商业策略的文章。如果你还没有读过,我会推荐去看看,但是不管怎样,让我给你一个执行摘要。

人工智能可以通过自动化或增强来改善任何活动。自动化是从一项活动中去除人类,而增强是在一项活动中赋予人类权力。自动化和增强是一个包含四种人工智能策略的规模。世界上的每一个人工智能解决方案都可以放在以下四个人工智能战略中的一个或多个战略中:

  1. 效率策略,通过自动化优化活动。
  2. 有效性策略,在这种策略中,活动是无缝的,使得沟通更加容易。
  3. 专家战略,人工智能赋予决策能力。
  4. 创新战略,人工智能使创造力成为可能。

我们会发现,达美乐至少采用了这四种人工智能策略中的三种。让我带你看一下该公司的三个人工智能实现,然后在最后,我们将看一下更大的图片。

用自动驾驶车辆送披萨

众所周知,出租车、公交车和卡车司机将受到自动驾驶汽车的影响,但自动驾驶汽车也会影响许多其他行业。对于达美乐来说,这可能会影响披萨的配送方式。

这就是为什么达美乐在 2019 年开始了一项自动驾驶披萨外卖试点计划。该公司与自动驾驶汽车初创公司 Nuro 合作,后者提供自动驾驶电动汽车,这些汽车配备有锁在 PIN 码后面的车门。PIN 码只提供给订购披萨的人,因此潜在的披萨窃贼无法窃取不属于他们的披萨。该项目始于休斯顿,尽管达美乐比萨打算在未来几年全面推广。

通过人工智能助手订购披萨

你如何订购比萨饼?嗯,现在,如果你想接触一家比萨饼店,你有相当多的选择。举几个例子,你可以:

  1. 给餐馆打电话。
  2. 下载一个专门的送餐应用程序到你的手机上,然后在那里下单。
  3. 在你的网络浏览器上访问一个送餐网站(或者,如果他们有,比萨饼店自己的网站)。
  4. 亲自去比萨店,在那里下订单。
  5. 使用人工智能聊天机器人。

在这五个选项中,第五个是最近发明的。而且,这是最快的。

你看,通过在你已经下载的应用程序(比如脸书或推特)上发信息或与一家公司的聊天机器人交谈,你只需几句话就可以点一份披萨,比如“把我最喜欢的发给我”用户可以比以往更快地订购产品,而无需下载任何额外的应用程序。在一些聊天机器人中,机器人可以记住你住在哪里,甚至你的信用卡信息,所以你也不需要提供这些信息。

你大概可以看到这是怎么回事。达美乐的确已经实现了人工智能聊天机器人来订购披萨。相当令人惊讶的是,该公司已经将其人工智能订购助手放在几乎所有可以想象的平台上。用户可以通过 Google Home、亚马逊 Alexa、Slack、Twitter、Facebook Messenger、短信、智能手表,甚至福特 Sync 和三星智能电视订购披萨。顾客下单时不需要与任何人互动,因为人工智能完全自主地接受订单。用户可以保存他们喜欢的订单,这样只需说出两三个单词就可以完成整个订单。

用人工智能专家确保披萨的质量

达美乐还在使用人工智能来增强厨师的能力,以持续烹饪美味的披萨。达美乐注意到顾客在社交媒体上分享不好看的披萨照片,上面的配料不一致甚至不正确。

为了解决这个问题,该公司开始使用一种机器学习人工智能,他们称之为 DOM Pizza Checker 。人工智能会拍摄餐厅厨师烹饪的每一张披萨的照片,并对其进行分析,根据各种标准对披萨进行分级。例如,DOM Pizza Checker 检查浇头和奶酪是否均匀分布,以及选择的配料是否适合比萨饼类型。

如果披萨不符合标准,人工智能会要求厨师重新制作。制作出令人满意的披萨后,照片会发送给顾客。通过这种方式,达美乐可以确保比萨饼送到时不会给顾客带来不必要的惊喜。

达美乐与 Dragontail Systems 合作开发人工智能。该系统的第一个版本花了两年时间才推出,现在正在自我完善,因为它每天都扫描披萨,并从每一个披萨中学习。

Domino 的三个 AI 实现应用于一个 AI 策略框架。

整个组织的人工智能

这三种不同的人工智能应用是三种不同的人工智能策略的例子。

效率战略:用无人驾驶汽车运送披萨是价值链中一项活动完全自动化的例子。

效果策略:使用 AI 助手接单,让一个活动无缝衔接。它简化了沟通并自动化了流程。

专家战略:通过扫描每一块披萨的图像识别人工智能来增强厨师是利用专业知识的一个完美例子。

他们价值链中的三个不同流程已经通过人工智能进行了改进,采用了三种不同的策略,每种策略都针对活动的目的进行了优化。

  1. 一位顾客通过人工智能助手订购比萨饼。
  2. 比萨饼是通过人-人工智能合作烹饪的。
  3. 它最终由自动人工智能驾驶的车辆交付。

达美乐已经推出了人工智能计划和试验,而没有完全取代旧的流程。他们在不同地区的各种业务活动中采用了人工智能,在整个企业中工作,并意识到为正确的业务流程选择正确的人工智能策略的价值。

实现人工智能的一个优秀方法是查看价值链中的流程,分析人工智能如何改进每个特定的活动,然后一次一个活动地逐步实现人工智能。

嘿,如果一家 60 年的披萨连锁店能做到,那你也能。

感谢阅读!如果你想找到更详细的人工智能策略介绍,以及 100 种人工智能的现实世界实现,请查看我的关于人工智能的非技术书籍https://thisisrealaibook.com/

*https://thisisrealaibook.com/ *

监控您的模型在生产中的性能的行动手册

原文:https://towardsdatascience.com/the-playbook-to-monitor-your-models-performance-in-production-ec06c1cc3245?source=collection_archive---------5-----------------------

ML 可观测性系列

机器学习模型的性能监控

随着机器学习基础设施的成熟,对模型监控的需求激增。不幸的是,这种不断增长的需求并没有导致一个简单的剧本,向团队解释如何测量他们模型的性能。

生产模型的性能分析可能很复杂,每种情况都有其自身的挑战。不幸的是,并不是每一个模型应用场景都有一个像学校里教的玩具问题那样的测量性能的明显途径。

在这篇文章中,我们将讨论与地面实况的可用性相关的许多挑战,并讨论在每个场景中可用于测量模型的性能指标。

案例一:实时地面实况

理想的 ML 部署场景,通常是他们在课堂上教给你的,是当你将你的模型部署到生产环境中时,你可以很快地从模型中获得可操作的和快速的性能信息。

这个理想的视图看起来像这样:

与预测相关联的实时地面实况,图片由作者提供

在这个例子中,每一个预测的基本事实都浮现在你面前,并且在预测和基本事实之间有一个直接的联系,允许你直接分析你的模型在生产中的表现。

有很多行业有幸面对这种理想场景。数字广告就是这种情况,模型试图预测消费者最有可能参与的广告。几乎在预测做出后,地面真相,无论他们是否点击,都是确定的。

对于这种理想情况的另一个例子,我们可以看看预测粮食交付估计。当比萨饼到达饥饿的顾客家时,你就知道你的模型做得有多好。

一旦您将这一潜在的基础事实链接回您的预测事件,就可以很容易地计算和跟踪模型性能指标。要使用的最佳模型度量主要取决于模型的类型以及它所预测的数据的分布。以下是一些常见的模型性能指标:

准确度:总体准确度是一个常用的统计数据,在平衡等级时非常有用。

回忆:对不平衡类有用。我答对了多少积极因素。

精度 :对不平衡类有用。有多少肯定的识别是正确的。

F1: 对不平衡类有用,允许分析 精度召回 之间的权衡。

MAE 或 MAPE :回归或数字度量性能分析。当你离 MAPE 有多远的百分比很重要的时候,它可能是好的。

一旦确定了模型指标,通过每天或每周跟踪该指标,您可以确保性能从培训时或最初提升到生产时起没有急剧下降。

然而,正如你现在肯定已经预测到的,这种理想的情况是例外,而不是规则。在许多真实世界环境中,对基础事实的访问可能会有很大的不同,随之而来的是您所拥有的监控模型的工具的方式。

案例 2:延迟的地面实况

虽然许多应用程序享受模型预测的实时真相,但许多模型应用程序场景必须等待一段时间才能知道他们的模型在生产中应该如何表现。

想象一下,你正试图预测你的哪些客户是值得信赖的,哪些客户可能会拖欠贷款。在贷款还清或客户违约之前,你可能不会知道自己是否做了一个好的决定。这使得确保您的模型按预期运行变得很棘手。

接收地面实况的这种延迟也可以没有固定的时间尺度。例如,尝试对哪些信用卡交易是欺诈性的进行分类。你可能不会知道一笔交易是否是真正的欺诈,直到你收到一份声称他们的卡被盗的客户报告。这可能发生在交易清算后的几天、几周甚至几个月。

在这些情况下,以及许多其他情况下,模型所有者有很长的时间来接收他们的模型预测的真实结果。

延迟的真相,作者图片

在上面的图表中,虽然我们确实看到模型的基础事实最终被确定,但模型在过去一个月的预测并没有得到相应的结果。

当这个基本事实延迟足够小时,这个场景与实时基本事实没有太大的不同,因为模型所有者仍然有合理的节奏来测量性能度量并相应地更新模型,就像在实时基本事实场景中所做的那样。

然而,在系统中,接收基本事实有很大的延迟,团队可能需要求助于代理指标。代理指标是与您试图接近的基本事实相关的替代信号。

例如,想象你使用一个模型,消费者最有可能拖欠他们的信用卡债务。在这种情况下,成功的一个潜在的代理指标可能是您已经贷出的逾期付款的消费者的百分比。

因此,虽然您还无法获得基本事实,但您可以开始了解您可以同时计算的代理指标如何随着时间的推移而变化,以衡量您的模型的表现。

面对延迟的基本事实,代理指标是一个强有力的工具,因为它们提供了一个关于你的模型执行情况的最新指标。

案例 3:对基本事实的因果影响(有偏见的基本事实)

需要注意的一件重要事情是,并非所有的基本真理都是生而平等的。有些情况下,团队会收到实时的地面实况;然而,模型的决策会极大地影响结果。

预测会产生地面真实偏差,作者图片

在这个例子中,我们试图预测谁有足够的信用来获得贷款。这变得很棘手,因为当你拒绝某人的贷款时,你不再知道他们是否会还你钱。

换句话说,只有你决定贷款给的人会导致你可以用来训练未来模型的结果。因此,我们永远也不会知道模型预测会违约的人是否真的全额偿还了贷款。

这可能会让你把手举到空中,接受你的地面真相只是会有偏差;但是,您确实有一些工具可以使用。

您可以创建一个不遵循模型预测的拒绝集,并比较该拒绝集与使用模型预测的集之间的预测性能差异。

你可以使用这两组接受了不同处理的人来验证你的模型预测,在我们的例子中,确保你没有潜在地错过你的模型所错过的一组潜在的有信用的人。

作为处理数据的人,您很可能会经常看到这张图片。如果不提及数据偏差,那么关于数据偏差的讨论就是不完整的。

幸存者偏见,图片来自维基百科

正如故事所述,二战中的工程师们绘制了一张子弹孔穿透从战场归来的飞机的位置热图,目的是确定在哪里加固装甲。一天,一位名叫 Ahbrahm Wald 的统计学家指出,这份热图仅仅是由完成任务返回的飞机绘制的。所以,事实上,最好的放置装甲的地方可能是有空的地方,比如引擎,因为在这些地方被击中的飞机永远不会回家。

TLDR:永远要意识到你地面真实数据的偏差

案例四:没有地面真相

这给我们带来了建模团队最糟糕的情况:没有真实的反馈来连接回模型性能。

在上面的例子中,我们在我们的验证和训练集中有基础事实来链接回我们的模型预测;然而,在生产中,我们几乎没有关于我们的模型表现如何的反馈。

同样,在这种情况下,地面实况的代理指标非常有用。在缺乏基本事实的情况下,如果您可以找到与基本事实相关的其他东西,您仍然可以了解您的模型随着时间的推移是如何表现的。

除了代理基本事实指标之外,即使基本事实很难收集,团队找到收集基本事实数据样本的方法也是很重要的。

获取这些基本事实数据的一种方法是雇佣人类注释者或标注者来提供关于他们模型性能的反馈。这种方法既昂贵又耗时;然而,拥有一套高质量的地面真实数据的回报是巨大的。

在基本事实可用或已通过人工注释收集的时期,可以使用绩效或滞后绩效指标。尽管这些滞后的性能度量在实时应用程序中不太擅长发出突然的模型性能回归的信号,但是它们仍然提供了有意义的反馈,以确保模型性能随着时间的推移朝着正确的方向发展。

漂移是性能的代表

虽然这些滞后的性能指标不能立即表明模型性能的变化,但测量预测输出分布的变化可能可以。输出预测中出现的漂移可用于警告团队异常的模型行为,即使不存在真实情况。

预测漂移没有地面真相,由作者图像

一些可以用来量化预测漂移的指标是分布距离指标,例如:Kullback-Leibler 散度、种群稳定性指数(PSI)、Jensen-Shannon 散度等。

关于使用统计距离进行漂移监测的更多详情,请点击此处 查看我的详细文章

其他性能监控注意事项

按群组划分的模型指标

尽管数据科学家喜欢处理聚合优化统计数据,但现实是模型对不同的人、客户群和业务决策有不同的影响。

具有相同精确度的两个候选模型可能会对特定人群产生显著不同的影响,这些差异对您的业务非常重要。

团队通常将他们的数据分成“切片”或“群组”。随着时间的推移,可以发现这些群组,或者在模型出现大量错误的情况下,动态构建这些群组以进行调试。

群组预测,作者图片

在上面的示例中,我们看到基于高净值、低 FICO 分数和最近违约的存在等特征的分组数据提供了关于模型对于这些特定群组的表现的重要信息。

高于 90%的总体准确率实际上掩盖了一个事实,即该模型在预测最近违约的人的信用价值方面表现糟糕。

监控群组预测,图片由作者提供

跨群组测量模型性能类似于总体测量模型性能。应对对业务很重要的每个群组的绩效进行衡量,当绩效下降到培训或初始模型发布定义的阈值以下时,应发出警报。

衡量业务成果

既然我们已经讨论了通过为您的应用程序场景选择正确的模型度量来度量模型性能,那么让我们简单地讨论一下度量业务度量。

业务度量标准与模型度量标准密切相关,如果定义得当,它们应该相互联系。在一天结束的时候,你没有给你的客户发送 F1 分数,因此,了解你的模型如何影响每个客户体验你的产品是很重要的。

业务度量往往不太适合传统的优化,但是它们提供了对业务目标的关键洞察。由于这些指标对于一个模型来说不容易优化,因此优化问题将使用并行指标来解决。

再次回到信用价值的例子,虽然你的模型可能会优化传统的模型指标,如准确性或 F1,但你可能希望监控的一个业务指标是你拒绝贷款的人的百分比。

归根结底,你团队中的产品经理可能不关心 MAPE,但他们会关心你的用户如何体验你的产品。衡量模型评估指标通常不会捕捉到你可能有多少愤怒的客户。

正如您可能已经意识到的,识别和度量业务度量是一个极其重要的过程,可以确保您的努力在改进您的产品方面得到充分利用,我将在以后的文章中对此进行更深入的探讨!

总结

总之,测量模型性能并不是一刀切的,您的业务应用程序可能需要我们在中讨论的部分或全部测量技术。

虽然衡量模型性能的方法并不总是一目了然,但可以确定的是,正确衡量模型性能对于确保向客户交付一致且有效的产品至关重要。

联系我们

如果这篇博客引起了你的注意,并且你渴望了解更多关于机器学习可观察性和模型监控的信息,请查看我们的其他博客和关于 ML 监控的资源!如果您有兴趣加入一个有趣的 rockstar 工程团队,帮助模型成功生产,请随时联系我们,并在此处找到我们的空缺职位!

时间序列回归的泊松隐马尔可夫模型

原文:https://towardsdatascience.com/the-poisson-hidden-markov-model-for-time-series-regression-236c269914dd?source=collection_archive---------4-----------------------

如何混合使用两个强大的随机过程来模拟时间序列数据

一个泊松隐马尔可夫模型使用两个随机过程的混合,一个泊松过程和一个离散马尔可夫过程,来表示基于计数的时间序列数据。

基于计数的时间序列数据仅包含整数数值,如 0、1、2、3 等。这种数据的例子是电子商务网站上的每日点击数、百货商店中每天购买的肥皂的数量等等。

使用诸如线性模型或 ARIMA 模型之类的模型不能充分地表示这样的数据,因为在那些模型中,因变量( y )被假定为允许正值和负值的实值。基于计数的时间序列数据需要使用模型,这些模型假定因变量是 1)离散的,和 2)非负的,换句话说,是整数的。

泊松或类泊松模型,如广义泊松和负二项式模型通常适用于对整个编号的数据集进行建模。

不幸的是,泊松系列模型没有明确说明,因此无法充分捕捉数据中的自相关,而这恰好是时间序列数据集的一个标志。

多年来,研究人员对基本泊松模型进行了一些修改,使其能够解释时间序列数据中的自相关性。其中值得注意的是 泊松自回归模型泊松整数 ARIMA 模型 ,其中泊松条件均值不仅表示为回归变量 X 的线性组合,还表示为因变量 y 的滞后副本。

泊松隐马尔可夫模型更进了一步,混合了离散的 k 状态马尔可夫模型,该模型是“隐”的,因为在时间序列的每个时间步,人们不能确切知道马尔可夫过程处于哪个马尔可夫状态。取而代之的是,在每个时间步,人们估计每个区域可能存在的对泊松模型预测的平均值的影响。这使得泊松过程意味着一个随机变量,其期望值是基础马尔可夫模型处于特定状态的概率的函数。

在本文中,我们将精确地描述可见泊松模型和隐马尔可夫模型预测的平均值之间的关系。

如果你是马尔可夫过程或隐马尔可夫模型的新手,请浏览下面两篇文章:

我还建议回顾下面这篇关于马尔可夫转换动态回归模型的文章,以详细了解 MSDR 模型是如何构建的。泊松 HMM 是一种 MSDR 模型,其中模型的“可见”部分服从泊松过程。

泊松隐马尔可夫模型的详细说明

我们将首先阐述“可见的”泊松过程,然后展示马尔可夫过程如何“混合”到泊松过程中。

考虑以下包含附加误差成分的模型方程:

y_t 表示为平均值和误差项之和(图片由作者提供)

在上面的模型中,观测值 y_t 是预测值 μ_cap_t a 和残差 ε_t 之和。我们进一步假设 ε_t 是一个均值为零的同方差(常方差)正态分布随机变量,表示为 N(0,σ )

y_t【n×1】观测值向量 y 的第 t- 个元素:

因变量 y (图片作者提供)

我们假设 y 服从泊松过程。因此,[1…n] 中的 t 的 y_tn 个独立的泊松分布随机变量,每个变量都具有可能不同的均值 μ_t ,如下所示:

服从泊松过程的时间序列 y (图片由作者提供)

P 概率MassFfunction(PMF),也就是观察到 y_t 的概率的另一种说法,由下式给出:

泊松分布的 PMFy均值μt(图片由作者提供)**

在一个训练好的回归模型中,我们用“拟合”平均值 μ_cap_t. 代替 μ_t

X 为一个【n X(m+1)】大小的回归变量矩阵如下图。这个矩阵的第一列是截取 x_ t的占位符,是这个矩阵的一行。

回归变量矩阵 X (图片来自作者)

β_cap 为回归系数的 [(m+1) X 1] 向量。**β上的“cap”表示它是模型训练产生的系数的拟合值。**

拟合回归系数β_cap 的向量(图片由作者提供)

我们将平均值 μ_cap_t 表示为 x _t 和 β_cap 的指数线性组合如下:

泊松回归模型的指数均值(图片由作者提供)

其中,x**_ tβ_cap 之间的点积可以展开表示如下:**

回归变量和拟合回归系数的线性组合(图片由作者提供)

点积的指数运算确保了平均值以及模型的预测永远不会为负。这是对整数计数数据集建模的关键要求。

这就完成了泊松 HMM 的泊松部分的规范。现在,让我们把注意力转向马尔可夫部分。

隐马尔可夫模型中的混合

我们将看到如何将离散马尔可夫模型“混合”到泊松回归模型中。

考虑一个 k 状态的马尔可夫过程,假设它处于某个状态 j ϵ [1,2,3,…k] 。我们不知道马尔可夫过程在时间 t 处于哪种状态。我们仅假设它以下列方式影响泊松过程模型:

用预测均值 μ_cap_t_j 和残差 ε_t 之和表示的观测值 y_t(图片由作者提供)

注意,拟合的平均值 μ_cap_t_j 现在用马尔可夫状态 j 来索引。μ_cap_t_j 表示如下:

当基础马尔可夫过程处于状态 j 时泊松 HMM 的指数均值(图片由作者提供)

注意,我们现在使用的是与第个第 j 个马尔可夫状态相对应的马尔可夫状态特定回归系数向量 β_cap _j

如果马尔可夫模型在' k' 状态【1,2,…,j,…,k】上运算,回归系数采用大小为 [(m+1) X k]矩阵的形式,如下所示:

大小为[k x (m+1)]的系数矩阵(图片由作者提供)

这里的直觉是,根据哪个马尔可夫状态或“体制”,回归模型系数将从 β_cap_s 切换到适当的体制特定的向量β_ cap_ j

k-状态马尔可夫过程由以下状态转移矩阵 P 控制,其中每个元素 p_ij 是在时间 t 转移到 j 的概率,假定该过程在时间 (t-1) 处于状态 i :

马尔可夫过程的状态转移矩阵 P (图片作者提供)

马尔可夫过程在时间步 t 也有如下状态概率分布π_**t😗*

k 状态马尔可夫过程的状态概率分布向量(图片由作者提供)

**Quick tip: Some texts call the state vector ***δ****_t* instead of ***π_****t*, and they call the Markov state transition probabilities *γ_ij* instead of *p_ij*.**

已知/假设 π_0t=0 时的某个值,我们计算π_**t如下:**

给定 t=0 时的概率分布和转移矩阵 P (图片由作者提供),马尔可夫过程在 t 时的状态概率分布公式

让我们回到泊松平均值的州特定公式:

当基础马尔可夫过程处于状态 j 时,泊松 HMM 在时间 t 的指数均值(图片由作者提供)

μ_cap_t_j 是假设基础马尔可夫过程处于状态 j 时泊松回归模型在时间 t 的预测均值。由于我们实际上不知道马尔可夫过程在时间 t 时处于哪个状态,在每个时间步,对于一个 k 状态的马尔可夫过程,我们必须使用 k 这样的预测方法,如下所示:

k 个预测的向量意味着来自泊松回归模型,对应于马尔可夫过程可能处于的 k 个可能状态(图片由作者提供)

在每个时间步为 y_t 生成 k 预测是荒谬的。因此,我们使用预期的公式将这些 k 预测合并成一个预测 μ_cap_t 。诀窍在于认识到μ_ cap**_ t是一个随机变量,有 k 个可能值,每个值都与一个发生概率相关联。这个概率就是 π_tj 这是潜在马尔可夫过程在时间 t 处于状态 j 的无条件概率。**

因此:

泊松 HMM 的预测均值是所有可能马尔可夫状态的期望值,如下所示:

用随机变量μ_ cap**_ t(图片由作者提供)的期望值表示的预测均值**

概率 π_tj向量π_t. 在每个时间步 t 的分量值,我们使用以下公式计算 π_t :

给定 t=0 时的概率分布和转移矩阵 P (图片由作者提供),马尔可夫过程在 t 时的状态概率分布公式

训练和评估

泊松隐马尔可夫模型的训练包括估计系数矩阵 β_cap_s 和马尔可夫转移概率矩阵 P 。估计过程通常是最大似然估计 (MLE)或期望最大化。

我们将描述如何使用 MLE 来找到 Pβ_cap_s 的最优值,这将最大化观察整个训练数据集 y 的联合概率密度。换句话说,我们希望最大化以下产品:

观察数据集的可能性(图片由作者提供)

在上面的乘积中,概率P(y= y _ t)就是泊松过程的 P 概率MassFfunction(PMF):

泊松条件 PMF(作者图片)

在给定拟合平均速率 μ_cap_t 的情况下,L.H.S .上的概率被解读为在时间 t 观察到 y_t 的条件概率。μ_cap_t 是使用我们之前看到的期望值公式计算的所有可能状态的预测平均值的期望值。

还有第二种方法来计算泊松 PMF。

让我们再来看看观测 y_t 的预测泊松概率的公式,假设底层马尔可夫过程处于状态 j :

预测泊松概率观察 y_t ,假设底层马尔可夫过程处于状态 j (图片由作者提供)

其中:

当基础马尔可夫过程处于状态 j 时,泊松 HMM 在时间 t 的指数均值(图片由作者提供)

马尔可夫状态特定线性组合表示如下:

回归变量 vector x _t 和状态特定回归系数β_ cap_j 的马尔可夫状态特定线性组合(图片由作者提供)

使用泊松 PMF,并假设一个 k- 状态马尔可夫过程,在每个时间步 t,我们将得到观察 y_tk 概率,每一个都以马尔可夫过程处于状态 j. 为条件。以下向量捕获这些 k 概率:

*观察到的 k 个*泊松概率 y_t ,每一个都以马尔可夫过程在时间 t 处于状态 j 为条件

和以前一样,对于每个时间步,我们希望将这些 k 概率合并成一个概率。为此,我们求助于 全概率 定律,该定律指出,如果事件 A 可以与事件 A1、事件 A2 或事件 A3 等一起发生,那么 A 的无条件概率可以表示如下:

全概率定律(图片由作者提供)

使用该定律,我们将计算泊松 HMM 预测的在时间 t 观察到 y_t 的概率如下:

k 状态马尔可夫模型影响下的 y 的概率密度(图片由作者提供)

在上面的求和中, P(s_t=1),P(s_t=2),…等等。是马尔可夫过程在时间 t. 的状态概率,我们从前面的讨论中知道,这些只是简单的π_ TJ*——向量的不同分量 π_t.*

实际上,我们已经想出了两种不同的方法来计算泊松概率P(y= y _ t)。**

让我们回到可能性等式:

观察数据集的可能性(图片由作者提供)

最大化乘积的自然对数通常是迅速的,因为它有将乘积转换成和的好处,并且后者在微积分中更容易处理(我们很快就会知道为什么)。因此,我们将最大化下面的 对数——由程式化的ℓ:表示的可能性

观察数据集的对数似然性(图片由作者提供)

对数似然的最大化通过使用以下程序来完成:

  1. 我们将取对数似然 w . r . t .中每个转移概率 p_ij 和系数矩阵β_ cap _ s中每个状态特定系数 β_cap_q_j 其中 q 位于【0,1,…,m】****
  2. 我们将把每个偏导数设为零,
  3. 我们将使用诸如 Newton-Raphson 、 Nelder-Mead 或 Powell 等优化算法来求解与 β_cap_s 中的(k+(m+1) k】个方程(实际上比这个数少得多)对应的 k 马尔可夫转移概率、 (m+1)k 个系数

有一个小问题我们需要解决。在整个优化过程中,马尔可夫状态转移概率 p_ij 需要位于【0.0,1.0】区间内,并且任意一行 P 的概率总和需要为 1.0。在方程形式中,这两个约束表示如下:

所有马尔可夫状态转移概率遵守的约束(图片由作者提供)

当注意到如果马尔可夫过程在时间 (t-1) 处于状态 i ,那么在下一个时间步 t ,它必须处于可用状态【1,2,3,…,k】之一时,1.0 约束的求和变得明显。

在优化期间,我们通过定义大小为 (k x k) 的矩阵 Q 来处理这些约束,如下所示:

代理矩阵 Q (图片作者提供)

Q 充当的代理 P** 。我们不是优化 P ,而是通过允许 q_ij 在-∞到+∞之间自由变化来优化。在每次优化迭代中,我们通过将局部优化的值标准化到区间【0.0,1.0】来获得 p_ij ,如下:****

标准化 Q 矩阵以获得 P 矩阵(图片由作者提供)

在我下周的文章中,我们将 使用 Python 和 statsmodels 构建并训练一个泊松隐马尔可夫模型。所以下周请继续关注这个话题。快乐造型!

参考文献和版权

卡梅伦和特里维迪出版社(2013 年)。 计数数据的回归分析 (第 2 版。,计量经济学会专论)。剑桥:剑桥大学出版社。doi:10.1017/CBO 9781139013901567

詹姆斯·d·汉密尔顿, 时间序列分析 ,普林斯顿大学出版社,2020 年。ISBN: 0691218633

形象

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

相关阅读

**

感谢阅读!如果您喜欢这篇文章,请 关注我 获取关于回归和时间序列分析的技巧、操作方法和编程建议。**

后现代堆栈

原文:https://towardsdatascience.com/the-post-modern-stack-993ec3b044c1?source=collection_archive---------21-----------------------

在启动阶段有效地进行 ML

连接现代数据堆栈和现代 ML 堆栈

概述

随着天下没有不散的宴席,我们已经到了这个系列的最后一集,一个全新的开源回购汇集了我们在前几集讨论的许多主题,在开始之前我们在这里回顾一下:

  1. m lops without more Ops:我们引入了关注重要事物的原则;
  2. 合理规模的 ML 和 m lops:这里我们解释“合理规模”。在科技巨头的行星级基础设施和无代码场景之间,有一个复杂的从业者的令人兴奋的工作世界:我们称之为“合理的规模”,它确实是大多数数据操作和 MLOps 发生的地方;
  3. Hagakure for MLOps :在这里,我们讨论现代 MLOps 的原则,以及小型团队如何得益于蓬勃发展的开放生态系统而富有成效;
  4. 现代数据模式:我们提出了(包括电池、数据和开源代码)一个实用的解决方案,来解决大规模接收、转换和查询数据的问题。

如果你密切关注我们,第 4 集将我们带到了数据领域的极限,在 ML 领域的开始:现在是时候结束这个循环了,将那些经过良好转换的数据行纳入机器学习模型,为用户提供预测服务。

TL;博士:在这个岗位上,我们将再次把技术含量和组织智慧结合起来:

  • 我们引入“后现代堆栈”,也就是一种解构(看到现在的双关语了吧?我们之前共享的现代数据堆栈。我们重新利用第 4 集(雪花+ dbt)中的数据操作工具来支持我们最喜欢的 MLOps 设置,这是一个元流管道,无缝结合了本地和云计算,并以无服务器的方式弥合了数据、训练和推理之间的差距。
  • 我们回到开始的地方,根据我们所学的知识,再次讨论没有 Ops 的 MLOps,的基本原则,以及它如何形成(或应该形成)许多关于软件组织的传统讨论:人员配备、构建与购买,等等。

克隆回购,查看视频,扣好安全带,和我们一起做最后一次旅行。

将现代数据堆栈与现代 ML 堆栈结合起来

现代数据堆栈 (MDS)已经整合了大量关于数据收集、存储和转换的最佳实践。对于结构化或半结构化数据,MDS 尤其有效,它通常依赖于三个关键部分:

  • 通过工具或基础设施的可扩展摄取机制;
  • 一个用于存储和计算的数据仓库(在合理的规模下,查询性能令人印象深刻);
  • 一个对原始数据进行类似 DAG 操作的转换工具,可能基于 SQL 作为不同角色(数据工程师、分析师、ML 人员)的通用语言。

网络上到处都是例子(包括我们自己的!)如何建立 MDS。然而,它们可能会让你想知道“在 ML 方面”会发生什么:一旦数据被预先聚合,特性被预先计算,它是如何被下游消费以产生商业价值的?这篇文章通过提出一个轻量级工具链来回答这个问题,该工具链利用 Metaflow 作为 ML 操作的主干:社区对“更大的船”回购的反应非常积极,但是我们认为我们也应该为希望更快开始的团队提出一个低接触的替代方案。

后现代堆栈

由于流程图胜过一千个自述,我们的后现代堆栈(PMS)看起来是这样的:

后现代堆栈一览【图片由我们的朋友在outbounds,ll 商标,所有标识均为其各自所有者的财产】

我们有四个主要的“功能”阶段,两个在数据领域,两个在 ML 领域:

  1. 存储:我们使用雪花存储原始数据——我们重新使用 Coveo 去年发布的神奇的电子商务开放数据集,其中包含数百万个真实世界的匿名购物事件。
  2. 转换:我们使用 dbt 作为我们的转换框架——我们在雪花中运行一系列类似 DAG 的 SQL 查询,并准备好我们的原始数据供 Python 代码使用。
  3. 训练:我们使用深度学习框架 Keras 来训练购物推荐的顺序模型——给定购物者互动过的产品列表,最有可能的下一次互动是什么?
  4. 服务:我们使用 Sagemaker 作为我们的 PaaS 服务平台,这样一来,I)我们可以使用 Python 代码来触发部署,ii)通过使用 AWS,我们可以获得与 Metaflow 的良好互操作性(即模型工件已经在 s3 中)。

PMS 并不比你的普通元流管道更复杂:通过将聚合委托给雪花,分布式计算被抽象为合理的规模;通过引入对 dbt 的支持,端到端的科学家可以准备好自己的特性,并一步到位地对数据集进行版本化;通过使用 Metaflow,我们可以运行我们想要的所有 Python 代码,在我们想要的地方:我们可以以统一的、有原则的方式加入 dataOps 和 MLOps,我们可以挑选需要硬件加速的地方。

PDP 是一个零脂肪、严肃但完全现实的管道,开始将原始数据转化为实时预测。

更好的是,你有一个管道大量使用开源软件,而很少占用人们的时间:开发、培训和部署可以由一个 ML 工程师完成,不需要任何基础设施知识,也不需要 devOps 的支持。

在探索这种设置对您的组织(而不仅仅是您的代码)的全面影响之前,可能是一个好时机来为对书呆子细节感兴趣的读者提及一些隐藏的瑰宝:

  • dbt cloud : dbt 为团队内部和团队之间的协作提供了一个 SaaS 版本的工具。为了支持这一场景,我们包括了通过连接到 dbt 云实例来运行相同流的可能性:虽然从流的角度来看这有点不太直观,但我们确实相信云产品是有价值的,特别是在数据堆栈涉及的人员更加多样化的大型组织中。
  • 模型测试:我们在部署前加入了一个测试步骤,以提高对部署前全面测试重要性的认识。我们将 RecList 与 Metaflow cards 的力量结合起来,展示开源软件如何帮助开发更值得信赖的模型和更具包容性的文档。敬请期待不久的将来更深入的集成!

在蓬勃发展的时刻,但也是空间令人困惑的增长时刻,我们希望我们的开放堆栈将为测试 MLOps 水域的团队提供可靠的第一步,展示几个简单的部分如何在大规模构建 ML 系统方面走得非常远。

这可能不是你旅程的终点,但我们相信这是一个很好的开始。

MLOps 和 peopleOps

如果你还记得我们的景观概述,以合理规模运营的团队要么是小型的快速成长的创业公司,要么是在大型但传统的公司中开始 ML 实践的团队(如果你愿意的话,是企业中的创业公司):他们想要的是关闭反馈回路的速度,所以 NoOps 是他们所需要的。特别是,我们对 ML 生命周期的方法强调了不花费前期工程时间来支持在第一天(甚至可能在第 1000 天)肯定不需要的规模和复杂性的重要性。

与“玩具世界”教程相比,我们的设计具有与您一起成长的优势:如果您确实需要在第 1000 天将 X 换成 Y,其余的工具仍然可以完美地相互配合。

我们想要结束我们的系列,强调这种方法对组织如何工作和概念化数据以及他们产品的 ML 开发的一些影响。

  • 超越人数的效率。考虑传统指标,如研发人数:现代 MLOps 方法可能会质疑围绕这一点的一些既定原则。例如,采用现代 MLOps 方法意味着你的商品销售成本(COGS)可能会构成一个更大的 AWS 账单——然而商品和服务生产中涉及的直接人工可能会更低。此外,这也意味着可能需要重新考虑传统指标,如研发人数或申请的专利数量,并且可能需要不同的基准因此,随着科技世界的快速变化,我们的衡量方法应该考虑到这一点。
  • 灵活的垂直度。ML 正在成为许多公司的重要产品组件(Coveo 当然是其中之一)。关于能够在产品中嵌入 ML 功能的令人不安的事实是,ML 工程师需要在业务问题方面接受培训,就像他们在超参数优化方面一样。考虑到这一点,在一个横向独立的单位中拥有 10 多名数据科学家可能不是正确的方式,因为这将他们从现场分离出来,并减缓数据和决策之间的反馈循环。或者,人们可能希望将 ML ninjas 直接嵌入到业务单元中,这样他们可以直接了解业务问题。唯一的问题是,如果业务部门没有准备好吸收 ML 工程师,他们很容易就会失去预期的影响力。采用强大的 MLOps 实践是使 ML 团队的垂直化更加亲切的一种方式,因为业务部门可以更有效地吸收数据科学家。“合理规模”拓扑中的 MLOps 看起来像垂直和水平之间的中间点——如果你愿意,可以说是一个 T 形:一些水平组件已经到位,以使每个人都具有生产力并重用知识和专业技能(例如,广泛采用元流);但是考虑到用例的特殊性,特性是在业务线内垂直开发的。
  • 留住人才:远离基础设施。可以说,这种方法最重要的结果是,MLOps 可以作为吸引和留住关键人才的一部分。用更少的人力换取更多的计算将会产生一个小的、快乐的 ML 团队,这个团队比一个更大的、不那么专注的团队要好得多。大多数技术人才对使用最好的工具做前沿工作感到兴奋,关注具有挑战性的问题,并看到他们的工作在生产中的影响。如果没有正确的 MLOps 实践,顶级人才将很快因从事事务性任务而感到沮丧,并且看不到他们的工作有切实的业务影响。因此,更高的留存率和更高的 ML 生产率通常可以抵消可能更高的 AWS 账单。正如麦肯锡在一篇关于“大损耗”的文章中所说,“公司想要最好的,保留最差的,ML 从业者更替的主要原因之一是将相当大一部分时间投入到低影响的任务中,如数据准备和基础设施维护。

最后,采用我们的 MLOps 方法也将明显影响首席财务官做出的战略决策,并让他们更开心。

有一种流行的观点认为,管理 R&D 支出的有效方式需要降低基础设施成本。但这通常是一种误导性的看待事物的方式。购买而非建设可以带来更准确的 COGS 估计和预测,尤其是对于不太成熟、更具实验性的行业——众所周知,时间就是金钱,考虑到缓慢勘探的机会成本,基础设施可能看起来更便宜。此外,我们经常发现,随着时间的推移,在初创企业中构建和维护基础设施的实际成本比大多数人想象的更难预测。不仅很容易低估长期所需的全部努力,而且每次你为了构建一个基础设施而创建一个团队时,你都引入了人的因素的典型的不可预测性。

想多聊聊 ML“合理规模”的未来?

我们的系列报道到此为止,但是我们很乐意收到您的来信:联系我们,在 Medium 和 Linkedin 上关注我们(这里、这里和这里),看看我们的下一个“合理项目”是什么。

再见,牛仔们!

致谢

特别感谢 dbt Labs 的 Sung Won Chung、Hugo Bowne-Anderson、Gaurav Bhushan、Outerbounds 的 Savin Goyal、Valay Dave 以及 Coveo 的 Luca Bigon 和 Patrick John Chia 对草案和回购提出的有益意见。

色彩的力量

原文:https://towardsdatascience.com/the-power-of-color-be3bbe9f6bc1?source=collection_archive---------36-----------------------

将您选择的颜色与您的视觉价值联系起来

版权所有 [Benjavisa Ruangvaree](https://www.123rf.com/profile_benjavisa'>Benjavisa Ruangvaree)

我们的视觉是我们感官中最发达、最重要、最复杂的,这是一个被广泛接受的观点。不是每个人都认识到这个事实是基于生理学的。一些人认为这可能是有文化和历史基础的。然而,这并不能改变人类严重依赖视觉来探索、分析和理解世界的事实。

介绍

视觉对象的主要特征之一是它的颜色。这不是偶然的。颜色可以帮助区分背景和前景中的东西,它可以对比差异,将我们的注意力吸引到一个物体上,甚至让我们更好地记住物体。

心理学中有一个子领域——被恰当地称为色彩心理学——其发现被企业广泛用于营销和品牌推广。根据维基百科:

色彩心理学是将色彩作为人类行为的决定因素的研究。颜色影响不明显的感知,比如食物的味道。颜色具有能引起人们某些情绪的特质…颜色对个人的影响可能因年龄、性别和文化而异…尽管颜色联想可能因文化背景而异,但颜色偏好在性别和种族之间相对一致。

营销和品牌专家不应该是唯一关心色彩心理学研究的发现和建议的人;数据科学家也应该知道。

影响观众的情绪

你希望你的观众兴奋还是无聊?沮丧还是冷静友好?色彩心理学的一个理论是色彩会影响我们的心情。对颜色的感知是不一致的;这是一种模式,而不是绝对的常数。然而,可以肯定的是,你的大多数潜在受众都属于模态价值范畴。

2012 年,埃利奥特和迈尔认为颜色会影响我们的心理功能。这一理论被称为情境中的颜色理论。该理论的中心观点是,颜色承载着意义,可以直接影响我们的认知过程,包括我们的注意力。颜色的影响力与我们对颜色“友好”或“敌对”的感知有关人们可能会认为“敌对”的颜色会吸引注意力,而“友好”的颜色会让我们感到安全和困倦。红色是“敌对”颜色的典型代表。这并不意味着红色会让人产生负面情绪。意思是吸引眼球。在自然界中,红色可以有几种含义,其中包括危险和恐惧。与此同时,在包括人类在内的许多物种中,红色可以作为性吸引力的信号。红色不会让我们感觉冷漠。

红色是一种恰当的颜色,可以把你的观众的注意力吸引到你演讲的要点上。红色情绪影响的一个有益的副作用是,当红色被用来说明数据时,观众会更好地记住正在呈现的材料。然而,重要的是要记住适度是关键。如果你所有的视觉效果都使用红色调色板,你的观众可能会开始感到不安甚至恼怒。他们可能会记住你的演示,但可能不是以你希望他们记住的方式。

颜色应该用来集中注意力,突出元素组,对比数据元素的相关性和关系。

用红色突出显示集群;作者图片

突出红色的相关性;作者图片

用颜色表达意义

2008 年,Castelhano 和 Henderson 进行了实验,以确定颜色是否会影响人们收集视觉场景信息的能力和速度。他们发现,如果图片是彩色的,并且颜色与上下文相关,人类理解图片的速度会快得多。换句话说,颜色“正确”的物体图像更容易被人们理解。

这一理论与林等于 2013 年提出的语义共振色彩理论有着密切的联系。这不是第一次语义和颜色之间的密切联系被证明,但斯坦福大学的研究人员将它有益地放入数据可视化的背景中。

在美国,大多数人的反应是,金钱是绿色的,爱情是红色的,海洋是蓝色的。许多概念唤起了相关的颜色——无论是由于物理外观、常见的隐喻还是文化习俗。当颜色与唤起它们的概念配对时,我们称之为“语义共鸣的颜色选择”——摘自《哈佛商业评论》(2014),林莎伦和杰弗里·赫尔。

林和他的合作者发现,与随机配色方案相比,当数据以语义合适的颜色呈现时,人们在条形图上执行比较任务的速度要快 10%。下面,你可以看到一对条形图。它们每一个都代表水果销售,与林实验中使用的方法相似。左边的使用默认的 matplotlib 配色方案,而右边的使用由谷歌图像搜索算法分配的语义共振颜色。

哪个条形图更容易用来回答“苹果和橘子的销售额更高?”蓝莓对桃子呢?语义共鸣调色板的编译方式本身就是一个迷人的主题,但它与本文的主题并不完全相关,所以我们将把它留到以后再说。

使用语义共鸣的颜色;作者图片

林的研究结论是,语义共鸣的调色板有助于人们视觉化的整体效果,因此匹配数据内容和选择的颜色至关重要。

色彩的和谐

2011 年,托马斯·萨诺基和诺亚·sulman⁵进行了一项实验,研究颜色搭配如何影响短期记忆(我们记住刚刚看到的东西的能力)。

在实验中,参与者被提供两套调色板,并被要求评价每套调色板的和谐程度。一小段时间后,参与者被要求回忆这些场景。研究中使用的器械包与下图中的器械包相似。这个实验的结果导致了以下结论:

  • 人们认为相似的调色板更和谐、更令人愉快。
  • 和谐的颜色比不和谐的颜色更容易在我们的短期记忆中保留下来。高颜色相似度的调色板导致了显著更高的回忆表现,产生了 26%到 45%的估计记忆容量的增加
  • 人们对只有三种或更少颜色组合的调色板的记忆比有四种或更多颜色的调色板更好。
  • 相邻颜色的对比度会影响人们对配色方案的记忆..

Sanocki 和 Sulman 的研究结论引出了一个想法,即可以通过选择和谐愉悦的颜色来影响受众对数据的记忆。然而,保持相邻颜色之间的强烈对比也很重要。值得记住的是,除了基于相似性的颜色和谐之外,颜色之间还有其他几种类型的和谐。

Sanoki/Sulman 实验中使用的不和谐与和谐色彩模式,图片由作者提供

结论

这篇文章只涵盖了最近色彩心理学研究的一小部分。但是即使是这种有限的回顾也能为你提供有用的工具,你可以用它来影响你的听众对你所展示的信息的注意、理解和记忆。最后,但同样重要的是,记住要注意你的观众中的色盲成员。Tableau 和 matplotlib 都有适合色盲用户的调色板。在你的讲义材料中增加针对色觉障碍观众的可视化效果,至少可以让你赢得观众的感激和友好。

参考资料:

[1] Fabian Hutmacher (2019),为什么对视觉的研究比任何其他感官形式的研究都多?《心理学前沿》, 10,2246。

[2] Elliot,A. J .和 Maier,M. A. (2012),语境中的颜色理论。高级进出口。社会主义者心理学。 45,61–125。

[3] Monica S Castelhano 和 John M Henderson (2008),颜色对场景要点感知的影响。 J Exp 心理人类感知执行。34(3),660–75。

[4]林莎伦、朱莉·福尔图娜、钦梅·库尔卡尼、莫琳·斯通、杰弗里·赫尔(2013),为数据可视化选择语义共鸣的颜色。euro vis’13:第 15 届欧洲可视化图形会议论文集,2013 年 6 月,401–410 页

[5] Thomas Sanocki,Noah Sulman (2011),颜色关系增加了视觉短期记忆的容量。感知,第 40 卷,635–648 页

数据可视化中颜色的力量

原文:https://towardsdatascience.com/the-power-of-color-in-data-visualizations-9868d661f2a0?source=collection_archive---------12-----------------------

仅仅改变图表的颜色会导致完全不同的解释

马里奥·高在 Unsplash 上的照片

每天,我们每个人看到、分析和分享的图片、图表和信息图表的数量是巨大的。例如,Domo 估计脸书用户每天每分钟都会在平台上上传 47 万张照片(数据从不睡觉,2020 )。即使我们认为这些图像中只有一小部分与数据可视化相对应,当图表呈现在您面前时,您是否曾经花时间分析过您解读图表的方式?

我最近花时间分析了我的大脑是如何被我自己的背景——我的信仰,我的文化,甚至我的偏见——有意无意地影响的。由于我们生活在一个持续信息流的世界,越来越多地基于图片、视频和其他视觉刺激,更好地理解颜色如何影响同一图表产生不同解释的方式会很有趣。在这篇文章中,我想证明,一个相同的图表,呈现完全相同的数据,可以导致不同的解释的基础上,颜色的选择,其作者。

为了说明我的观点,让我们根据名义 GDP(国内生产总值)创建一个图表,显示 2009 年至 2019 年间十大经济体的生育率演变。为了做到这一点,我使用了基于联合国提供的公开数据的数据集。这种分析的一个目标可能是检验生育率和经济财富相关的假设。然而,我们将会看到,根据作者对颜色的选择,一幅图所传达的主要思想可能会有所不同。

从中性色开始

为了使颜色对读者的影响尽可能小,我首先选择了相对中性的颜色,简单地改变两种灰色之间的对比度来显示两个时间段。这样,作为一个作者,我在展示数字的同时,并没有传达一个强烈的解释信息:作为读者,你被邀请去做你自己的思考,从这个图形中寻找意义。

图表 1 —中性—玛丽·勒费夫尔

那么,你为什么需要添加颜色呢?

将颜色添加到图表中有以下效果:

  • 通过建议某种解释,它给了读者线索快速解释你图表中显示的数据
  • 从美学角度来看,更有吸引力,因此能更好地吸引读者的注意力
  • 视觉元素在记忆中保留的时间更长 —你的图表包括它的颜色应该是令人难忘的

用颜色标记反对意见

图表 2——反对意见——玛丽·勒菲弗尔

有时候最明显的解决方案会变成最好的解决方案。在这种情况下,我想突出两个系列的积极和消极的内涵,我会选择基本的颜色,如绿色和红色。例如,我想标记 2009 年至 2019 年间生育率正演变的国家与生育率负演变的国家之间的对立。不超过三种颜色和一个容易理解的颜色代码是支持这样一个简单想法的关键。这里传达的主要隐含信息是:

“生育率上升的国家往往在十大经济体中排名较高”。

请注意使用带有隐含解释的颜色会误导读者。在这里,常识会让我们明白,生育率的下降(红色国家)意味着这些国家面临困难,这种趋势对它们是有害的。然而,这是一个基于社会、文化和政治考虑的预设想法:根据具体情况,生育率下降可能对一些国家有害,而对另一些国家则可能是一个积极的机会。

如果你想传达一个更微妙的信息呢?

用颜色来突出进化的进步性

图表 3——细微差别——玛丽·勒菲弗尔

为了给图带来细微差别,建议使用色标。如果进化朝着一个方向进行,你可以在颜色饱和度上做文章(例如,从浅蓝色到深蓝色)。这里的演变有两个方向:向负值方向,蓝色变得越来越暗,向正值方向,黄色变得越来越接近棕色。

与前面的图表相反,这里选择的颜色没有表达任何判断:绿色和红色显然分别与积极和消极的方面有关,而蓝色和黄色尽管在视觉上是很好的颜色,但在意义上是相当中性的。这里传达的主要隐含信息是:

生育率演变的强度和方向似乎对一个国家在最大经济体中的排名都没有明显的影响。

图表中的特定亮点是什么?

使用颜色突出显示图表的特定部分

图表 4 —亮点—玛丽·勒菲弗尔

正如你在图 3 中看到的,使用一系列的颜色有助于比较和展示不同国家的不同发展水平。然而,你需要确保读者不会被信息淹没。当你向你的观众展示图表时,通常会有一个完整的上下文。因此,你应该能够确定你的图表中最重要的是什么。

在我们的例子中,假设我们只想强调欧洲国家生育率的变化。这就是为什么我选择在图 4 中给欧洲国家添加颜色,而用灰色显示其他国家的数据。通过这样做,注意力被吸引到感兴趣的主题(最大的欧洲国家),同时保持图表的详尽性(显示十大经济体)。这里传达的信息是:

“在过去的十年里,欧洲国家要么面临生育率的稳定,要么面临生育率的上升”。

结论

我最后的建议是要意识到颜色对我们大脑的影响。

作为读者,在解读任何数据可视化的时候,都要三思。不管是有意还是无意,我们做出了一些决定来创建你面前的图表。现在轮到你退一步,用最相关的方式解释它了。

作为一名作家或分析师,系统地考虑至少三种方式来展示你将呈现给观众的数据。当选择你的图表的最终版本时,问问你自己或其他人:当别人看我的图表时,他们会在最初的 5 秒内解释什么?

你喜欢读这篇文章吗? 成为 的一员,加入一个不断成长的充满好奇心的社区吧!

受约束语言模型的力量

原文:https://towardsdatascience.com/the-power-of-constrained-language-models-cf63b65a035d?source=collection_archive---------12-----------------------

为什么以及如何用自定义的波束搜索算法构建约束语言模型。一个拥抱脸代码的指南。

迈克尔·泽兹奇在 Unsplash 上的照片

概观

  1. 介绍
  2. 为什么要关心受约束的语言模型?
  3. 波束搜索算法是什么?
  4. 如何用自定义的波束搜索算法约束任何语言模型?
  5. 拥抱脸的实现
  6. 结果呢
  7. 结论

介绍

预先训练好的生成语言模型(如 OpenAI 的 GPT2 和 GPT3 )或 seq2seq 模型(如 T5 或最近发布的 T0 )生成自由流动的自然语言。这意味着他们输出的句子可以是任何形状。为了从这些模型中获得最大价值,我们有时希望输出遵循某种结构——这被称为受限语言模型。在这篇文章中,我将解释:

  • 为什么你想要一个受约束的语言模型。
  • 波束搜索算法的用途。
  • 如何用自定义的波束搜索算法轻松约束任何语言模型?
  • 如何使用拥抱脸来实现这一点?

读完这篇文章后,你将能够通过控制语言模型输出的形状,从语言模型中获得更多的价值。

这篇文章与我的上一篇文章有关,在这篇文章中,我解释了如何通过操纵输入的形状来释放 GPT3 的真正潜力(参见提示工程)。

包含示例代码的笔记本可从这里获得。

为什么要关心受约束的语言模型?

如前所述,我们有时希望模型的输出遵循某种结构。例如,如果我们想要进一步处理输出,如果我们对它们的结构和属性有一些保证就好了。

在一个案例研究中,我在这里描述了和,一个模型的输出需要被一个额外的组件解析。通过实施适当的结构,我可以保证输出易于解析。

我们可以确保给定的模型永远不会输出两个特定单词同时出现的句子,或者我们可以确保这些单词总是同时出现。可能性是无限的。

或者,我们可能希望生成每个标记只有偶数个字符的句子,只是为了好玩。

波束搜索算法是什么?

我们可以通过使用定制的波束搜索算法来实现这种效果。

简而言之,波束搜索算法(有时称为维特比算法)用于生成一个句子的极有可能的延续。

生成语言模型被训练来预测给定输入序列的下一个最可能的标记。如果我们想要生成 10 个新令牌,我们可以将此视为 10 次生成 1 个新令牌。我们获取原始句子,生成第一个标记,并使用结果句子生成第二个标记,等等。这叫做贪婪解码

(图片由作者提供)贪婪解码——连续几次取最优的下一个记号并不能得到句子的最优延续。

如果我们想要生成 10 个记号的最可能延续,这并不等于连续 10 次选择最可能的记号——贪婪解码不是最佳的。有时,在给定的步骤中不选择最有可能的下一个标记是有意义的,以便后面的标记可以通过更有可能来补偿这一点。

波束搜索算法试图通过在每一步考虑 K 个最可能的下一个记号来减轻贪婪解码的问题。通过考虑更多的记号,我们可以发现这样的情况,在给定的步骤中选择一个不太可能的记号会在随后的步骤中产生更可能的记号。

(图片由作者提供)波束搜索—波束搜索算法如何通过考虑提示的多种可能的延续来获得更好的延续。

举个例子,如果我们把句子‘我可爱的狗是 a’延续为 1 token,最有可能的延续就变成‘我可爱的狗是 a little’。然而,如果我们使用波束搜索来找到 3 个令牌的最有可能的延续,“我可爱的狗有点 a”成为最有可能的句子。如果我们只考虑 1 个标记,那么与“little”相比,“bit”是不太可能的延续,而 3 个标记的最终结果更可能是“bit”。

这个算法是一个启发式算法,这意味着它并不完美。如果 K 变得更大,并且我们在每一步考虑更多可能的下一个记号,我们将最终得到更可能的最终延续。然而,我们也通过增加算法的计算成本来为此付出代价。

如果你有兴趣了解更多关于语言模型的不同生成技术,我建议这篇博客。

如何用自定义的波束搜索算法约束任何语言模型?

通过操纵这种波束搜索算法,我们可以获得符合特定结构的输出。我们可以在特定的步骤动态地将一些下一个令牌的概率设置为零,以确保这些令牌永远不会生成。通过在适当的时候禁止某些令牌,我们可以强制输出遵循任何模式。

假设我们想要生成一个输出,其中第一个单词以字母“a”开头,第二个以字母“b”开头,第三个以字母“c”开头,第四个又以字母“a”开头,等等。在波束搜索算法的每个步骤中,我们需要检查前一个单词的第一个字母,然后将所有具有错误起始字母的下一个单词的概率设置为零。该模型现在将生成符合这种格式的最可能的句子。

(图片由作者提供)受约束的束搜索—通过在束搜索算法期间移除我们不需要的标记,我们可以将语言模型的输出约束到预定义的结构。

虽然前面的例子相当简单,但我们可以使用这种技术对生成的句子实施任意约束。

拥抱脸的实现

为了节省我们的大量工作,我们将利用拥抱脸做许多繁重的工作。实现上述“a - > b - > c”模式的文档代码(使用 GPT2)可从这里获得。

结果呢

受限于“a -> b -> c”模式的 GPT2 以如下方式继续提示“我可爱的狗是 a ”:

beam 0: My cute dog is a bit confused about being called a bitch
beam 1: My cute dog is a bit confused about being called a baby
beam 2: My cute dog is a big cat and big cats are big
beam 3: My cute dog is a bit confused about being called a bunny
beam 4: My cute dog is a bit confused about being called a big
beam 5: My cute dog is a bit confused about being called a boy
beam 6: My cute dog is a bit confused about being called a b
beam 7: My cute dog is a bit confused about being called a bad
beam 8: My cute dog is a bit confused about being confused about being
beam 9: My cute dog is a bit confused about being called a black

请注意,模型的输出是如何遵循这种“a -> b -> c”结构的,而我们不必在输入中为模型提供这种模式的任何示例。我特别喜欢该模型仍然设法产生一些连贯的句子——尽管有这种(相当严格的)限制,但如果你是一只狗,被称为兔子是有意义的。

结论

通过编写我们自己版本的波束搜索算法,我们能够约束预训练语言模型的输出。这可以应用于生成型模型,如 GPT2 和 GPT3,甚至 seq2seq 模型,如 T5 和 T0。当我们希望模型的输出遵循某个预定义的结构或遵循一组规则时,这特别有用。

通过使用拥抱人脸库,我们可以轻松地自己实现这个自定义的波束搜索算法。代码可以在这里找到。

如果你对从你的语言模型中获得更多价值感兴趣,看看这篇关于提示工程如何帮助你释放你的生成语言模型的真正价值的帖子。

装饰者的力量

原文:https://towardsdatascience.com/the-power-of-decorators-fef4dc97020e?source=collection_archive---------25-----------------------

让我们从头开始用 Python 构建一个严格的类型检查器和一个强大的日志记录工具

图片由维基共享资源的 Rushenb 提供

假设你是某个项目的首席开发人员。一天,您的老板告诉您,您和您的团队必须确保所有的函数和方法都实现了日志记录和类型检查协议,并且需要在周末之前进行测试。

您知道该项目由 100 个可调用对象组成:函数、类、生成器等。,而你却在这里,被你的老板问你什么时候能完成这个巨大的任务。

你喝了一口咖啡,看着你的老板,说:“几个小时后”…

你为什么这么自信?

因为你知道装修工。如果这个任务被交给一个更初级的程序员/数据科学家,他们不知道 Python 中这个相当高级的特性,可能要花上几周甚至几个月的时间才能获得必要的灵活性。

但是你懂高级 Python,你就把事情搞定了。

在接下来的几节中,我们将一起模拟这种情况,我将向您展示装饰者到底是什么,以及我们如何使用他们来完成这样的任务。

我甚至会构建一个小模块,您可以根据自己的项目需要进行复制和调整。

功能

Python 的函数非常强大,因为作为一等公民,它们可以存储在变量中并在以后调用,它们可以传递给其他函数,它们可以创建一个环境(称为局部范围),人们可以用它来进行中间计算。也就是说,您可以在其他函数中定义函数。

在 Python 中,我们也有称为 lambda 的匿名函数,我们可以在诸如 map、filter 等表达式中将其用作函数工具。

今天,我们将看看如何使用这些概念来动态地改变代码,并改进您已经编写的代码,而不必重写项目中的每个函数。

为了理解 decorators,我们需要理解 Python 中的函数。

请注意,这些不是数学函数,因为在某些情况下,对于给定的函数,相同的输入并不总是确保相同的输出,也就是说,函数可能有副作用,即函数可能依赖于外部范围。

让我们用 Python 创建一个基本函数,以便以后修改它。

函数 mul_times 返回 msg 字符串的 num 自连接。

所以比如说 mul_times("HA ",10) 会返回“哈哈哈哈哈哈哈哈哈”

这实际上是动态类型问题的一个很好的例子。如果输入正确的参数,这个函数将运行并产生期望的输出。然而,如果不小心输入了一个整数或浮点数作为 msg 参数,那么一切都乱套了。

显然,在生产中,这样的漏洞是不可接受的。

我们的老板刚刚告诉我们,通过记录和类型检查代码库中的每个函数来消除这些潜在的炸弹。

装修工

装饰器的想法是创建一个以可控方式操作函数或类的范围。在实践中,我们通过在一个函数中定义另一个函数来实现这一点。

考虑下面这段代码。

当我们运行这个文件时,我们得到输出:

**************************************************

这里到底发生了什么?

在第 22 行,我们通过将函数对象 mul_times 传递给函数 logging 来定义一个名为 wrapped 的新函数。

好吧,但是记录能做什么呢?

很高兴你问了!日志记录创建了一个作用域,它内部有一个嵌套函数,叫做包装器。在包装器中,我们执行作为参数传入的函数并存储结果。本例中, mul_times

我们寻找类型错误,在程序向我们抛出这种错误的不太可能的情况下,我们将函数名及其参数记录在一个文件中。

我们可以选择忽略这个错误,但是因为我们是类型检查的狂热分子,我们故意抛出 TypeError 并使我们的程序崩溃。

如果包装器没有崩溃,那么它返回我们传入的函数的结果。

棘手的地方来了:外部函数日志返回包装器函数对象,而而不是包装器返回。

现在,当我们将日志记录(mul_times) 分配给对象包装的并且我们在第 24 行调用包装的时,实际发生的情况如下:

  • 由于包装的通过赋值确实等于日志中的包装器,我们将“”和 50 存储在 args 元组中,并将其作为参数传递给函数包装器*。
  • 然后我们将这些参数传递给 mul_times ,返回值存储在变量 result 中。
  • 由于没有类型错误,包装的的返回值就是上面的字符串,我们称之为结果,然后打印到控制台。

上面的代码可以用下面的代码写得更优雅一点:

' @ '符号是上面等价代码的语法糖,我们称这样的函数为像日志,一个装饰

但是有一个问题,我们不能确定 Python 中的函数在每次传递错误类型时都会抛出类型错误。事实上,Python 的动态类型系统确保我们只有在试图对一个对象做一些非法的事情时才会得到一个错误,比如调用一个它并不存在的方法。

这是 Python 的一个非常灵活的特性,对于一些项目和脚本来说,这非常好,但是如果你想构建一些可靠的、经过良好测试的和可维护的东西,你需要做一些类型检查。

幸运的是,在 Python 的后续版本中,它附带了一个类型推理系统。让我们看看如何用这个实现编写上面的代码。

令我们失望的是,当我们运行这段代码时,我们得到… 100 !!!

Python 拒绝放弃这种动态灵活性。当然,我们可以尝试手动让它崩溃。

这实际上是可行的,但是我们不想在所有的函数中,考虑到每个函数的每个参数的类型,来写这个。简直太重复太蠢了。

相反,我们希望通过在装饰器中实现 Python 的类型推理系统来自动捕获它。

让我们创建一个类型检查器装饰器。

让我们在我们的 mul_times 函数上测试一下。

这将导致一个类型的错误崩溃。

有用!现在我们只需要将它与日志装饰器结合起来,但是在这一点上我们还可以做一些改进。如果一个日志记录函数只有一个实例,然后就崩溃了,那么记录函数就没有什么意义了。

既然我们已经处理了类型检查,我们可以简单地改变日志装饰器来记录所有的函数,然后让 type_checker 装饰器完成剩下的工作。

我们将通过改变日志装饰器来做到这一点,然后通过将它们写在彼此之上来嵌套装饰器。

尽管如此,我们仍然希望记录失败的函数。考虑下面的代码。

程序当然会抛出一个类型错误,而 log.txt 文件看起来是这样的:

Function: wrapper succeeded with args: ('3', 50, {})
Function: wrapper succeeded with args: ('Kasper', 10, {})
Function: wrapper succeeded with args: ('0', 0, {})
Function: wrapper succeeded with args: ('Medium', 1, {})
Function: wrapper failed with args: (-1, 100, {})

嗯,不完全是我们所希望的,是吧?

我们可以把装饰者放在彼此的上面来链接他们,这很好,但是为什么他们不能识别函数名呢?

我将把答案留给读者作为练习,但是我将在这里用一些最佳实践 Python 来解决这个问题。

原来库 functools 已经预见到了这一点,我们可以从 functools 借用一个名为wrapps的装饰器。

我们再来看看 log.txt 文件。

Function: mul_times succeeded with args: ('3', 50, {})
Function: mul_times succeeded with args: ('Kasper', 10, {})
Function: mul_times succeeded with args: ('0', 0, {})
Function: mul_times succeeded with args: ('Medium', 1, {})
Function: mul_times failed with args: (-1, 100, {})

非常好。

但是我们可以对我们的日志装饰器做另一个改进。现在,如果错误是类型错误,它只记录失败的功能,而不记录时间。

我们希望它更加灵活。

最后,让我们在 type_checker decorator 中提出一个更容易理解的错误。

这将抛出一个 ZeroDivisionError,如果我们检查日志文件,我们会看到以下输出。

酷,但是我们的代码中主要是方法而不是函数。我们如何装饰它们?

Python 中的装饰方法

嗯,这个差不多。其实对于装修者的大部分应用来说,你不需要改变什么。然而,我们操作的是可调用的参数,在一个方法中,我们总是有一个类实例的引用作为参数(除非它是一个静态方法)。

这有点烦人,但不会阻止我们。在类型检查器装饰器中,我们将简单地而不是检查自身参数。我们需要写一个免责声明,但是这只有在我们将实例参数命名为“self”时才有效。这在 Python 中是不需要的,尽管我还没见过它被命名为其他什么。

所以我认为这是一个很好的假设。

此时,我们注意到代码中的一个小漏洞。在 type_checker decorator 中,我们在字典中进行查找。如果我们想用部分或者没有类型声明来修饰一个函数,我们会得到一个 KeyError

我不想要一个按键错误...

你不想要一个错误...

没人想要一个按键错误!!!

让我们解决这个问题,这样我们就可以修饰任何函数或方法,而不用考虑类型声明,然后让我们测试它。

实现上述修复后的完整代码:

这段代码的输出是:

这太棒了。但是,如果您有一个包含 100 多个需要进行类型检查和记录的方法的巨型类,该怎么办呢?

这里是班级装饰者真正发光的地方!

我们将创建一个名为 togging (我猜是类型检查日志的截断)的类装饰器,它将用类型检查器日志来装饰一个类并自动装饰所有方法。

也是时候对代码进行一些拆分了。让我们把它做成一个模块,可以在另一个文件或项目中使用。

我们名为 decorators 的模块现在变成了下面的模块:

现在,在另一个文件中,我们导入 togging 类 decorator 并测试它。注意,当我们导入模块 decorators,时,首先发生的是文件 decorators.py 实际上被执行了,所以日志文件被删除了。这是一件好事,因为您不希望多次运行使您的日志文件变得杂乱。

log.txt 中该文件的输出:

甚至 init 方法也得到了修饰!

最后要改进的是日志装饰器。你看,每次调用一个函数或方法时保存日志,在某些情况下是没问题的,但是,如果你在一个循环中调用一个函数或方法,或者一个应用方法,它会大大降低程序的速度。

如果我们可以选择保存日志或者只是将它打印到控制台上,那就太好了。打印的 I/O 操作实际上也降低了程序的速度,但远不及打开-写入-关闭文件的 FS I/O。

我们需要能够向日志装饰器传递一个参数,指定我们是想要保存日志还是只是打印它。

我们通过三重嵌套函数做到这一点。一开始看起来可能有点复杂,但是您应该把函数定义看作是为内部逻辑创建一个场景或范围。

作为收尾工作,我们还将记录函数的时间,并将其放入日志中。

下面的模块是最后一个。请随意复制它,修改它以适应您的需要,并在您自己的工作或项目中使用它。

我们这里有一个轻量级模块,它给我们提供了严格的类型检查,如果你用类型检查器装饰器来装饰你的函数或方法,而这个函数被输入了一个冲突类型的参数,那么程序就会崩溃,这是我们想要的,记得吗?

如果您想保留部分或全部参数不检查,那也没问题。您只需在函数定义中不指定类型。装潢师会自己解决这个问题。

如果你愿意,你可以把日志装饰器放在上面,但是你也可以单独使用它。它自己完全没问题。

让我们在另一个文件中再次测试这一点。

这个程序的输出如下,由于切换装饰器,它被打印到终端/控制台。

log.txt 文件中我们有:

现在回到我们的故事:

我们的老板告诉我们记录和类型检查(如果可能的话)我们庞大项目中的任何函数或方法。现在你有一个模块可以做到这一点。你只需用 togging 来修饰任何类,用日志类型检查器修饰器来修饰任何函数定义。请注意,装饰顺序无关。

我希望这篇文章对您有用,并且您可以看到装饰者是多么强大。我们甚至没有谈到缓存有状态装饰器以及与元类的连接。我将在以后的文章中这样做。

装饰器在标准库中随处可见,我认为这是 Python 最有趣和有用的特性之一。

如果您有任何问题、评论、更正或担忧,请在 LinkedIn 上给我写信。

https://www.linkedin.com/in/kasper-müller-96ba95169/

穿衣服快乐。

民主在特征选择中的力量

原文:https://towardsdatascience.com/the-power-of-democracy-in-feature-selection-dfb75f970b6e?source=collection_archive---------40-----------------------

实践教程

使用孔多塞方法来聚集特征选择排名

由迈克·彼得鲁奇在 Unsplash 上拍摄的照片

根据维基百科,特征选择,也称为变量选择属性选择、变量子集选择,是选择相关特征(变量、预测器)的子集用于模型构建的过程。

使用特征选择技术有几个原因:

  • 简化模型,使其更容易被研究人员/用户解释。
  • 更短的训练时间,
  • 为了避免维数灾难,
  • 通过减少过拟合 g 来增强通用性

我们研究了先例故事中的一类特征选择方法:排序方法。

分级方法是根据质量度量对数据集的要素进行分级并选择第一个要素的方法。

它们是五种度量:距离、信息、一致性、依赖性和分类准确性,我们看到,根据我们采取的度量类型,我们可以获得非常不同的排名,这导致各种排名对于一些数据集是有效的,而对于其他数据集则完全无效,因此需要使用许多度量。

假设我们把每个度量看作一个选择者,把每个属性看作一个候选者。在这种情况下,排名可以被视为偏好的顺序,因此,我们可以应用选举方法来计算汇总排名。

这篇文章将首先给出计算社会选择的背景;之后,我们将看到如何用 Kemeny 方法从多种特征选择方法中汇总排名。最后,我们将评估排名汇总相对于每个排名的性能。

计算社会选择背景

偏好配置文件

假设你有 n 个候选人,m 个选举人。每个选举人以这种形式给我们一个对候选人的偏好顺序 a ≥ b ≥ … ≥ z,我们称之为“偏好简档”

如果你想选举一个候选人,你应该使用哪种协议?你想拥有什么财产?就复杂程度而言,代价是什么?

多数图

多数图是其中每个候选者是顶点的图;

如果多数人严格地偏好 x 而不是 y,即,如果偏好 x 而不是 y 的选举人数量:k(x)严格地大于偏好 y 而不是 x: k(y)的选举人数量,我们就画出从候选人 x 到候选人 y 的有向边。

我们通过加权多数图中的差值 k (x)-k(y)来加权候选 x 和候选 y 之间的每个有向边。

孔多塞奖获得者

孔多塞方法是一种总是选出孔多塞获胜者的选举方法;如果一个候选人在一场势均力敌的投票中击败了所有其他候选人,他就是孔多塞奖得主;例如,两轮选举不是孔多塞方法,让我们举一个例子来说明:

假设你有 8 个选民有这样的偏好

  • 3 选举人:a ≥ c ≥ b
  • 3 选举人:b ≥ c ≥ a
  • 2 选举人:c ≥ b ≥ a

两轮选举是选民为他们喜欢的候选人投一票的选举。只有在没有候选人在第一轮投票中获得简单多数票(超过 50%)的情况下,选举才会进入第二轮。

在这个例子中,a 和 b 进入第二轮,b 获胜;让我们来看看多数图。

作者图片

我们可以看到,c 在任何一场对决中获胜,但仍然是,他在第一轮就被淘汰;这就是众所周知的孔多塞悖论。

孔多塞方法

孔多塞方法是一种总是选出孔多塞奖获得者(如果有的话)的方法。

许多孔多塞方法可能需要不同层次的多数图知识。

博尔达法

一些方法不需要任何关于多数图的知识,比如 Borda 计数,它可以在线性时间(O(n*m))内计算

假设我们有 n 个选举人,为了用 Borda 计数计算总排名,我们给每个候选人 n 分,每次他在一个选举人偏好的第一个位置,n-1,每次他在第二个位置,等等。

在上面的例子中,“a”将有 14 分,“b”将有 16 分,而“c”,孔多塞奖得主,有 18 分。

科普兰方法

其他一些方法也是基于计数,但需要未加权多数图,我们可以在二次时间 O(m*n)内计算,因为我们必须比较每对候选。每次比较都涉及所有的选举人。

如果我们有未加权多数图,那么转换 Copeland 排名就很简单了。

为了计算科普兰总数的综合排名,我们给每位候选人 2 分,如果他以多数票击败另一位候选人,给 1 分,如果他与他持平。

在前面的例子中,“a”得 0 分,“b”得 2 分,“c”当然以 4 分获胜。

斯莱特方法

斯莱特方法也需要未加权多数图,但是用斯莱特方法计算聚合排名是一个 NP-Hard 问题,更准确地说是一个NP-Complete问题。

这意味着我们无法找到一个在多项式时间内运行的算法来用 Slater 方法计算聚合排名,除非 P=NP ,这是极不可能的。

使用 Slater 方法的综合排名是最小化不一致数量的排名;在排名 R 中,每当一名候选人以多数击败另一名候选人,但在 R 中排名在他之后时,我们就计算 1 次异议。

对于上面的例子,c ≥ b≥ a 不一致的次数最少;我们很容易找到它,因为多数图是非循环的,所以任何拓扑排序都是最小化不一致数量的排序。

根据维基百科的定义,有向图的拓扑排序拓扑排序是其顶点的线性排序,使得对于从顶点 u 到顶点 v 的每条有向边 uv ,在排序中 uv 之前。

让我们假设事实并非如此,假设我们有一个偏好配置文件,给出了下面的图表:

作者图片

首先,因为我们有一个循环(A,B,C),我们将不得不至少反转一个弧,这意味着我们能找到的最佳排名将至少有一个分歧,这取决于哪一个将是三个 A,B,C 中的最后一个。

例如,我们可以颠倒(B,C)和(C,A ),从而得到这个图。

作者图片

并且有这个排序 A ≥ D ≥ C ≥ B 有 2 个不一致,因为 B 多数打败 C,A 多数打败 C。

这不是 Slater 排名,因为我们可以通过不反转(B,C)做得更好,我们将有:

作者图片

并由此,推导出这个排序:A ≥ D ≥ B ≥ C 有 1 个不同意,是一个斯莱特的排序(因为我们不能少做)。

克梅尼方法

这种方法与斯莱特排名非常相似:

使用 Kemeny 方法的综合排名是最小化不一致数量的排名;在排名 R 中,每当一名候选人被选举人优先考虑,但在 R 中排名在他之后时,我们计算 1 次异议。

因此,Kemeny 的排名是一种使称为 Kendall Tau 距离的距离最小化的排名,因此,直观地说,如果选举人的初始排名彼此接近,则获得汇总排名是容易的。

谈到复杂性,计算 Kemeny 的排名也是一个 NP-完全问题,这意味着我们无法找到一个算法,它的运行时间是实例大小(n*m)的多项式函数。

事实上,动态编程方法将采用 O(m n2ᵐ)运算(查看这篇文章了解更多细节)。

然而,我们仍然有一个有趣的属性,为我们提供了一个有效的预处理,大大减少了计算时间。

为了引入这一性质,我们必须引入适当候选者的概念。

如果一个候选人对另一个候选人 b 来说,至少有 3/4 的选举人认为 b 比他好,或者至少有 3/4 的选举人认为 b 比他差,那么这个候选人就被认为是合适的。

让我们用一个应用案例来说明这一点。

假设四个老师在一个科研团队,他们正在寻求实习生,但他们事先不知道他们将被允许带多少实习生;每个老师可以根据学生在课程中获得的分数,为申请实习的学生提供一个优先顺序,因此我们将为每个老师提供一个优先顺序。

让我们考虑四个候选人和以下简介:

  • a ≥ c ≥ b ≥ d
  • a ≥ c ≥ b≥ d
  • d ≥ b ≥ a ≥ c
  • c ≥ a ≥ b≥ d

一个合适的候选人的例子是 a,因为他在四门课程中的三门中击败了所有其他候选人,所以他将是综合排名中的第一名。因此,无论选择多少实习生,他都会被录取。

基于这种直觉,这篇文章指出,我们可以将候选人的数量减少到 11δ,其中δ是排名之间的平均距离。

这个过程被称为内核化。

内核化是一种预处理分析,它允许我们将问题简化为一个更小的问题,称为内核;这里,核的大小是排名之间的平均距离的多项式函数。

方法的实施

全球框架

在的前一篇文章中,我解释了我们如何设计一个可扩展的框架来分组许多特征选择排序方法;现在,这是一个极好的机会来看看我们如何扩展它。

其思想是,每种特征选择方法在用评价函数对特征进行排序后选择要保留的特征;现在,我们必须向框架添加一类特征选择方法,这些方法基于来自多个评估函数的许多排名的聚合来设置特征。

我们还必须记住,我们可以用任何评估函数的子集来聚合它们,并用任何前面的方法来聚合它们。

一个快速的模型化给了我们这个图表,我们将使用它作为接下来的地图。

类图(作者)

在本教程中,我将解释 Kemeny 聚合器的实现,但是我们可以用同样的方式快速实现其他的。

加权多数图

首先,我们必须实现一个加权多数图生成器;为此,我们将考虑邻接矩阵表示并使用 NumPy。

def build_weighted_majority_graph(self, rankings, n_candidates):graph = np.zeros((n_candidates, n_candidates))rankings = np.array(rankings)candidates = list(np.unique(rankings))for i in range(len(candidates)):for k in range(i+1,len(candidates)):r = 0for ranking in rankings:p1 = np.where(ranking == candidates[i])[0][0]p2 = np.where(ranking == candidates[k])[0][0]if (p1 < p2):r += 1else:r -= 1if(r > 0):graph[i,k] = relif(r < 0):graph[k,i] = -rreturn graph

之后,我们必须考虑如何从多数图中获得 Kemeny 排序。为此,我们将使用线性编程范式。

如果你不熟悉这个范例,我建议你看看我在 Julia 上写的关于它的文章,但是,你会注意到,它非常相似。

线性规划的 Kemeny 排序

要构建 Kemeny 排序问题的线性程序,我们必须首先使用变量和一组相关约束来描述解空间。

排名是候选人的偏好顺序,因此要用一组变量来表示它,我们必须使用 m 个布尔变量,每对候选人一个。

如果在最终排名中候选人 j 优于候选人 I,则每个变量 xᵢⱼ被设置为 1。

如果一个排名是一个偏好顺序,不是任何偏好顺序都是一个排名。首先,排名是一个总数的顺序,这意味着对于任何一对候选人,我们要么选择一个,要么选择另一个。此外,排序是一种优先顺序传递的顺序,因为如果我们将 x 排在 y 之前,y 排在 z 之前,我们必然将 x 排在 z 之前。

这可以用以下约束来表示:

第一个不等式的意思是:“我们在排名中有 ijji 之后”,而第二个就是违反了如果“我们在jj

现在,我们必须确定要优化的目标函数。

正如我们之前所说的,我们必须最小化不一致的数量,因此,为了得到排序的不一致的数量,我们建立变量的加权和,其中每个变量 xᵢⱼ由弧(I,j)的权重加权。

我们可以用下面的代码做到这一点:

import numpy as np
import pulp as pldef aggregate_kemeny(graph):prob = pl.LpProblem("Kemeny Ranking Problem", pl.LpMinimize)nodes = range(graph.shape[0])x = pl.LpVariable.dicts("X", (nodes, nodes), cat='Binary')e = 0for i in range(graph.shape[0]):for j in range(graph.shape[0]):if (i == j):continueprob += (x[i][j] + x[j][i] == 1)for k in range(graph.shape[0]):if(k == j):continueprob += (x[i][j] + x[j][k] + x[k][i] >= 1)e += graph[i,j] * x[i][j]prob += eprob.solve()rates = np.zeros(graph.shape[0])for i in nodes:for j in nodes:if(i == j):continueif(pl.value(x[i][j]) == 1):rates[j] += 1return rates.argsort()[::-1]

实验结果

在这个实验中,我首先调查了不同特征选择方法的排序之间的差异。

为了做到这一点,我绘制了一张肯德尔-陶距离的热图,这些距离是来自不同特征选择度量的排名以及它们与 Kemeny 方法的聚合。

肯德尔τ距离是两个等级之间对应性的度量。接近 1 的值表示强烈同意,接近-1 的值表示强烈不同意。

考虑的措施是我在这篇文章中实施的:

  • 两个相关性度量(C1、C2)。
  • 两种分类方法(CL1,CL2)。
  • 通过 CHI2 测试测量的依赖性。
  • 互信息。

所使用的数据集是增加了不相关特征的虹膜数据集。

作者图片

正如我们可以注意到的,度量的集合为我们提供了一个尽可能接近每个等级的等级。

我想研究的第二件事是聚合排名的性能。

为此,我使用了随机采样的数据集,并比较了每个度量的最佳特征子集和不同度量的多个聚合所达到的精度。

作者图片

我们可以注意到许多事情:

  • 一些特征选择方法对于一些数据集非常有效,而对于其他数据集非常无效,但是聚集总是具有良好的整体性能。
  • 第一个聚合向我们展示了,有时将许多度量结合起来会得到一个聚合排名,它比用于聚合的每个度量都更有效。
  • 第二个聚合向我们展示了向聚合添加一个弱度量可以提高性能,但情况并非总是如此,如第三个聚合所示。

结论

使用来自不同特征选择方法的排序的集合是非常有用的,因为它为我们提供了一个通用协议来获得更健壮并且通常更有效的集合器。

这项研究向我们展示了建立一个集合的组合方面,因为一些措施似乎协同积极和其他没有。此外,一些度量选择对一些分类器有用而对其他分类器无用的特征。

所以,最后,把分类器想象成一个决策者,他会选择一组特权措施,不是更好吗?可以积极或消极互动的措施。但是我们如何建立这样一个模型并训练它,同时限制对分类器非常昂贵的调用呢?

敬请关注,了解更多相关信息:)

集成学习和数据扩充的力量(使用 MNIST 数据集)

原文:https://towardsdatascience.com/the-power-of-ensemble-learning-and-data-augmentation-435c62e13c57?source=collection_archive---------30-----------------------

MNIST 数据集上的完整代码示例,VGG16 | ResNet50 | FG-UNET |多数投票|单次可转移投票|即时决胜投票

目录

  1. 简介(MNIST 数据集和目标)
  2. 合奏中包含的模特
    一、 VGG16
    二。 ResNet50
    iii。 FG-UNET
  3. 数据扩充
  4. 集成学习方法
    一、多数表决
    二。岭回归合奏
    iii。单一可转让票(STV)
    iv。即时决胜投票(IRV)
  5. 关键外卖

介绍

作为这篇博客的第一篇文章,我决定从一些简单的东西开始——写一个我早期在 Kaggle 上做的关于数字识别的老项目。这个任务很简单(手写数字上的数字[0–9]识别)并且已经被 ML 社区很好地解决了,但是它是一个很好的玩具数据集来启动我的 Kaggle 投资组合。

要了解更多关于 MNIST 数据集的信息,您可以访问它在 TensorFlow 数据集上的页面,这里是。简而言之,MNIST 数据集包含需要被分别分类成 10 个数字的手写数字的图像。

Kaggle 有一个永久运行的玩具竞赛,它为任何人提供了一个方便的平台,通过设置好的编程环境和模型评估来测试他们的数据科学技能。使用的度量是分类准确度,即正确图像预测的百分比。

下面是数据描述:

数据文件 train.csv 和 test.csv 包含手绘数字的灰度图像,从 0 到 9。

每幅图像高 28 像素,宽 28 像素,总共 784 像素。每个像素都有一个与之关联的像素值,表示该像素的亮度或暗度,数字越大表示越暗。该像素值是 0 到 255 之间的整数,包括 0 和 255。

手写数字仅供参考(照片由 Pop &斑马在 Unsplash 上拍摄)

请注意,图像尺寸仅为 28×28 像素,这对于 tf.keras.applications 中的许多模型来说太小了。在本文的其余部分,我们将假设数据已经被预处理成形状为(样本大小,32,32,1) 的数组,方法是在图像的每一侧填充 2 行 2 列零。Kaggle 上的 MNIST 数据集有 42,000 个训练样本和 28,000 个测试样本。

这套服装中的模特

一、VGG16(准确率 98.80%)

这是在 MNIST 数据集上实现 VGG16 (增加了数据)的完整的 Kaggle 笔记本。

VGG16 是由 Simonyan 和 Zisserman (2014) 作为提交给 ILSVRC2014 的,在 ImageNet 中实现了 92.7%的 top-5 测试准确率。数字 16 代表网络的层数。这个模型还有一个变种, VGG19 ,它的网络改为 19 层。

Tensorflow 的 Keras API 有一个预训练的 VGG16 模型,它只接受 224x224 的输入大小。对于 MNIST 数据集,我们将使用 Keras API 创建一个输入大小为 32x32 的 VGG16 网络,并从头开始训练,如以下代码所示。

from tf.keras.applications import VGG16
from tf.keras import Model
from tf.keras.layers import Densevgg  = VGG16(include_top=False, weights=None, input_shape=(32,32,3), pooling="max")x = vgg.layers[-1].output
x = Dense(10, activation='softmax', name='predictions')(x)
model = Model(inputs=vgg.layers[0].output,outputs=x)

10%的样品留作验证之用。该模型使用 Adam 优化器对分类交叉熵进行 100 个时期的训练,使用提前停止标准,即验证损失的耐心为 10。

除了将在下面描述的数据扩充,VGG16 在测试集上实现了 98.80%的分类准确率。

二。ResNet50 (99.17%的准确率)

这是在 MNIST 数据集上实现 ResNet50 (带有数据扩充)的完整 Kaggle 笔记本。

ResNet 由何等(2016) 提出,其一个变种在 ILSVRC2015 获得第一名。ResNet 的特点是跳过连接,网络中跳过几层的捷径,旨在解决消失梯度的问题。数字 50 再次表示网络的层数。

Tensorflow 的 Keras API 也有一个预训练的 ResNet50 模型,它同样只接受 224x224 的输入大小。与 VGG16 类似,我们将使用下面的代码在 MNIST 数据集上从头开始训练模型。

from tf.keras.applications import ResNet50res  = ResNet50(include_top=False, weights=None, input_shape=(32,32,3), pooling="max")x = res.layers[-1].output
x = Dense(10, activation='softmax', name='predictions')(x)
model = Model(inputs=res.layers[0].output,outputs=x)]

使用上述相同的训练参数,ResNet50 在测试集上实现了 99.17%的分类准确率。

三。FG-UNET (97.93%的准确率)

这是在 MNIST 数据集上实现 FG-UNET 的完整的 Kaggle 笔记本。

我在为一个客户的卫星图像项目工作时遇到了 FG-UNET,并发现它特别有趣。该模型基于 [U-Net](https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/#:~:text=The u-net is convolutional,and precise segmentation of images.&text=U-net architecture (example for,on top of the box.) 架构,该架构由几个下采样和上采样路径组成,用于对生物医学图像进行逐像素分类。FG-UNET 试图借用这种架构,同时通过添加完全连接的路径而不进行任何下采样或上采样来保留细粒度信息。

修改 FG-UNET 对 MNIST 数据集进行分类真的只是一个有趣的实验。特别是,我们不再需要按像素分类,因此修改了最终图层以展平 2D 影像并输出到 10 个类别的密集图层。具体的内核大小和使用的层可以在下面的代码中找到。

在没有数据扩充的情况下,FG-UNET 在测试集上实现了 97.93%的分类准确率。

数据扩充

数据扩充是一种在有限数据集下增强模型性能的成熟技术。通过旋转、移动和剪切输入图像,网络将能够学习手写数字的更好的内部表示,而不是过度适应训练图像。

Keras API 有一个 ImageDataGenerator ,它可以方便地提供一个生成器,为模型生成增强的输入图像。

from tf.keras.preprocessing.image import ImageDataGeneratorgen = ImageDataGenerator(rotation_range=30, width_shift_range=2, height_shift_range=2, shear_range=30, validation_split=val_rate)

集成学习方法

为什么要集成学习?嗯,三个臭皮匠胜过一个(这里是三个臭皮匠)。

假设我们有上面的三个模型,它们的误差率分别为 1.20%、0.83%和 2.07%。他们未能正确预测的图像集可能不会完全重叠。一个模型可能难以区分 1 和 7,而另一个模型可能难以区分 3 和 8。如果我们能够以某种方式将所有三个模型的学习结合起来,我们应该会得到一个比这三个单独的模型更好的模型!

我们如何组合这些模型?事实证明,有许多方法可以使用集成学习,我们将在下面讨论其中的几种。这里是 Kaggle 上的全合奏学习笔记本。

一、多数表决(准确率 99.35%)

最直接的合奏方法就是让模特们“投票”。如果三个模型中的两个或更多个预测了相同的数字,则它们是正确的可能性很高。

当没有多数时,多数表决的问题就出现了,特别是考虑到我们有 10 路分类。当没有多数时,有许多可能的解决方案,但这里我们使用一个简单的解决方案,如果没有多数,我们使用 ResNet50,因为它具有最高的单一模型精度。

在 28,000 个测试样本中,只有 842 个(3.01%)没有一致的预测,需要投票。在 842 次“选举”中,只有 37 次(0.13%)没有获得多数票。这意味着该例外仅适用于极少数样本。

通过多数投票,MNIST 数据集上的分类准确率提高到 99.35%,高于三个模型中的任何一个。

二。岭回归集成(99.33%的准确率)

岭回归通常被称为一种正则化普通线性回归的技术。但是,也可以通过将单个模型预测作为输入,将分类标签作为输出,使用岭回归来创建集成。

这三种模型的输出都是 10 位数的概率分布。通过连接 3x10 个概率,我们得到一个 30 维的向量 X 。对于输出向量 y ,我们简单地将类标签编码成单热点向量。通过对输入 X 和输出 y 进行岭回归拟合,回归器将预测 10 个类别的-概率向量(,因为该向量可能未被归一化)。

岭回归集成将 MNIST 数据集上的分类准确率提高到 99.33%。

四。单一可转移投票(STV,99.36%的准确率)

对于接下来的两种集成方法,我们将使用一个叫做 PyRankVote 的便捷模块。PyRankVote 由 Jon Tingvold 于 2019 年 6 月创建,实施单一可转让投票(STV)、即时决胜投票(IRV)和优先集团投票(PBV)。

在 STV,每个模型按照预测概率的降序排列,为他们排序的选择投下一张“选票”。在每一轮,最不受欢迎的“候选人”被淘汰。只要有可能,投票会投给模型的首选,但是如果他们的首选被排除,那么投票会投给他们的第二、第三、第四选择,等等。该过程递归运行,直到剩下一个获胜者。

使用 PyRankVote,我们可以用几行代码实现 STV:

import pyrankvote
from pyrankvote import Candidate, Ballotcandidates = [Candidate(i) for i **in** range(10)]
ballots = []
for j **in** range(3):ballot = np.argsort(X_pred[i,:,j]) #input is the predicted probability distributionballot = np.flip(ballot) #flipping to descending orderballots.append(Ballot(ranked_candidates=[candidates[i] for i **in** ballot]))election_result = pyrankvote.single_transferable_vote(candidates, ballots, number_of_seats=1)winners = election_result.get_winners()

STV 在 MNIST 数据集的 Kaggle 测试集上取得了 99.36%的分类准确率。

动词 (verb 的缩写)即时决胜投票(IRV,99.35%的准确率)

与 STV 相似,每个模特也为 IRV 的一个排名列表投票。如果一名“候选人”在第一轮投票中获得简单多数(超过半数),该候选人获胜。否则,最不受欢迎的“候选人”将被淘汰,而那些首先投票给最不受欢迎的候选人的人的选票将被计入他们的下一个选择。

根据我们使用多数投票方法的经验,我们知道 28,000 个测试样本中只有 37 个没有简单多数胜出者。因此,只有这 37 个样本会受到 IRV 的影响。

IRV 获得了与多数投票法相同的 99.35%的分类准确率。

关键外卖

下表总结了所有型号的性能:

我们观察到集合模型性能都是相似的,范围在 99.3%到 99.4%之间。这篇文章的关键要点不是一种集成方法是否比另一种更好,而是所有的集成模型都可以比三个单独的模型中的任何一个达到更高的精度。

在学术研究中,由于发表的压力,我们经常专注于为特定的机器学习任务找到最佳模型,而独立的最佳表现模型的优雅更容易被期刊接受。在行业中,没有最终部署在最终产品中的模型的先前迭代通常被认为是沉没成本。如果资源允许,部署几个表现良好的模型的组合可能会比单个表现最好的模型产生更好的性能,并帮助公司更好地实现其业务目标。

参考

VGG16 :西蒙扬,k .,&齐塞曼,A. (2014)。用于大规模图像识别的非常深的卷积网络。 arXiv 预印本 arXiv:1409.1556

何,王,张,徐,任,孙,孙(2016)。用于图像识别的深度残差学习。IEEE 计算机视觉和模式识别会议论文集(第 770–778 页)。

FG-UNET :斯托伊安,a .,普莱恩,v .,英格拉达,j .,普贡,v .,&德克森,D. (2019)。用高分辨率卫星图像时间序列和卷积神经网络制作土地覆盖图:业务系统的适应和限制。遥感11 (17),1986 年。

数据扩充 : Shorten,c .,& Khoshgoftaar,T. M. (2019)。面向深度学习的图像数据增强综述。大数据杂志6 (1),1–48。

关于作者:我是一名自由数据科学家和 ML 工程师。我为贵公司的数据科学和机器学习需求提供定制解决方案。更多信息请访问 www.CathieSo.comhttps://www.CathieSo.com

Python 中 Lambda 表达式的威力

原文:https://towardsdatascience.com/the-power-of-lambda-expressions-in-python-c5a1dcea9837?source=collection_archive---------15-----------------------

附有示例的实用指南

莎拉·多维勒在 Unsplash 上的照片

函数是一个代码块,它接受零个或多个输入,执行一些操作,然后返回值。函数是创建高效和强大程序的基本工具。

在本文中,我们将介绍 Python 中一种特殊形式的函数:lambda 表达式。我们需要强调的首要一点是,lambda 表达式是一个函数。

square = lambda x: x**2type(square)
functionsquare(5)
25

square 是一个返回数字平方的函数。在 Python 中定义函数的传统形式中,square 函数如下所示。

def square(x):return x**2

为什么我们需要一种不同的定义函数的方式?lambda 表达式背后的主要动机是简单和实用。

考虑一个需要做一次或很少几次的操作。此外,我们对这个操作进行了许多修改,与原来的略有不同。在这种情况下,为每个操作定义一个单独的函数是不理想的。相反,lambda 表达式提供了一种更有效的方式来完成任务。

lambda 表达式的一个关键特征是它们是无名函数。你可能会争辩说,我们实际上已经给 lambda 表达式指定了一个名称(正方形),但这只是为了演示的目的。一般来说,lambda 表达式是不带名字的。

lambda 表达式的一个常见用例是它们可以作为参数传递给另一个函数。Python 中的 map、reduce 和 filter 函数是高阶函数,可以接受其他函数作为参数。

让我们分别做一个例子,看看 lambda 表达式是如何派上用场的。我们有下面的列表 a。

a = [1, 3, 2, 6, 7, 4]

reduce 函数通过将一个函数应用于元素来缩减列表。我们可以编写一个 reduce 函数,将列表中的元素相乘。

from functools import reducereduce(lambda x, y: x*y, a)
1008

map 函数创建一个映射来转换列表中的每个元素。例如,下面的 map 函数根据给定的 lambda 表达式计算列表中每个元素的平方。

list(map(lambda x: x*x, a))
[1, 9, 4, 36, 49, 16]

过滤功能的操作类似于映射功能。它不是转换元素,而是根据给定的条件过滤元素。

list(filter(lambda x: x > 4, a))
[6, 7]

filter 函数中的 lambda 表达式用作大于 4 的元素的过滤器。

Lambda 表达式也用于 Pandas 数据操作和转换函数。考虑下面的数据帧。

(图片由作者提供)

例如,我们可以使用 apply 函数和 lambda 表达式获取列的日志。

import numpy as np
import pandas as pddf.apply(lambda x: np.log(x))

(图片由作者提供)

我们可以使用下面的 lambda 表达式和 apply 函数找到每行中的最大值。

df.apply(lambda x: x.max(), axis=1)0    15.0
1    19.0
2    15.0
3    19.0
4    12.0
dtype: float64

如果我们将轴参数更改为 0,该函数将返回每列中的最大值。

df.apply(lambda x: x.max(), axis=0)cola     9.00
colb    19.00
colc     0.76
dtype: float64

pandas 的 apply 函数根据指定的轴按列或按行执行给定的操作。

Pandas 还提供了 applymap 函数,允许对数据帧中的所有元素应用给定的操作。我们还可以将 lambda 表达式传递给 applymap 函数。

考虑下面的数据帧。

(图片由作者提供)

通过使用带有 applymap 函数的 lambda 表达式,我们可以找到每个单元格中字符串的长度。

df.applymap(lambda x: len(x))

(图片由作者提供)

结论

Lambda 表达式非常适合用来替代简单函数。它们还简化了语法。但是,一直使用 lambda 表达式并不理想。

Lambda 表达式不应用于执行复杂的运算。否则,我们将违背宗旨。

Lambda 表达式非常适合只做一次或很少几次任务。如果我们需要在整个代码中多次执行一个操作,最好是显式定义一个函数。

感谢您的阅读。如果您有任何反馈,请告诉我。

线性规划的力量,真实生活案例研究

原文:https://towardsdatascience.com/the-power-of-linear-programming-a-real-life-case-study-6198b2cdb611?source=collection_archive---------14-----------------------

使用 Python 中的线性编程方法优雅地解决优化问题

(图片作者)

L 线性规划是一种广泛用于解决优化问题的强大工具,但从开发者的角度来看,这种方法仍然相对不为人知。

在这篇文章中,我将解释线性编程的基本原理,然后将这些原理应用到一个具体的日常生活问题中。

线性规划包括将数学模型应用于线性问题,以便最大化或最小化关于某些约束的目标函数。因此,它可以用来解决任何问题,可以表示为一个线性函数与一些参数和约束。例如,著名的背包和旅行推销员问题是可以使用线性规划解决的优化问题。

基本上,算法的目标将是确定函数 f 的所有参数的最优值,以便得到对我们的问题的最佳拟合。希望我们已经有了解决这个问题的算法(例如:单纯形算法),作为开发者,我们甚至可以使用特别优化的解算器来解决这类问题。大多数编程语言都提供了带有易用解算器的库。

困难的部分不是使用将解决我们问题的算法,而是找到一种方法将我们的初始问题转化为一个带有参数和约束的函数。

现实生活中的问题

在一些理论之后,让我们将线性规划应用到现实生活的案例研究中。

让我们假设我们是一个著名的电子商务平台,希望在一个城市引入中继站来运送其产品。我们仅有的数据是该公司所有客户在那个城市的位置(坐标)。我们的目标是根据客户的位置优化放置一些中继点。也就是说,我们要把城市里每个中继点和每个客户端之间的距离降到最低。

步骤 1 —翻译问题

首先,让我们把这个规范转换成一个可用的数学表达式。我们知道,在坐标在一个城市的情况下,我们可以用曼哈顿距离来近似两点的距离。

两点 A 和 B 之间的距离可以写成每个坐标之间距离的绝对值之和:

现在我们知道了如何计算两点之间的距离,让我们将其推广到客户端和所有中继点:

其中 p 为我们要放置的中继点数量, l 为全市客户端总数,()为想要放置的中继点的 p 坐标,( albl )为全市所有客户端的 m 坐标。

因为我们想要最小化该表达式,所以我们添加最小化函数 min(),这意味着我们想要找到表达式的结果将接近最小值的最佳(xi,易)对:

第二步——找到约束条件

下一步是定义关于方程的良好约束。约束将被写成不等式,如松弛表所示。这些约束将通过给出一些规则来避免方程求解的不可行性。在我们的例子中,对于给定的变量,我们想要遵守的唯一规则是距离计算中使用的绝对值。在线性规划中,我们不能直接在方程上使用绝对值函数来最小化,所以处理绝对值的一种方法是通过约束来。基于以下规则,我们可以将绝对值转换为一对不等式:

当对两个客户端(A1 和 A2)和一个中继点(x,y)之间的曼哈顿距离应用这些规则时,我们得到:

****

其中:

值得注意的是,我们需要为输入中收到的每对坐标编写约束。希望我们能在下一部分中自动生成每个点的不等式。

步骤 3-求解器

为了方便起见,我选择 Python 来实现这个解决方案。

好了,现在让我们暂时忘记数学,考虑一下实现。我们有要最小化的方程,我们有要应用的所有约束,现在做什么?如开头所说,我们一般使用求解器来求解线性程序,所以这里也不例外,让我们使用 Python 中的一个求解器:

scipy.optimize.linprog(C, A_ub, b_ub, A_eq, b_eq)

其中 C 是我们的方程, A_ub 是不等式的左手边, b_ub 是不等式的右手边,分别对于 A_eqb_eq 是相同的,但是方程不同。

为什么只有 4 个变量来定义所有的约束?因为约束将被表示为巨大的系数矩阵。矩阵的每一列代表一个变量,每一行代表一个方程。

例如, 2x1 + 3x2 ≥ 1004x1 + 6x2 ≥ 0 被转化为:

A_ub = [[-2,-3],[-4,-6]]; b_ub = [-100,0]

在松弛形式中,不等式应该使用≤所以我们对不等式进行逆运算。

对于每对坐标,约束(行)的数量将保持不变,如步骤 2 所示。但是变量(列)的数量将随着客户端/中继的数量而增长。

例如,这些是用于 1 个中继(x,y)和 2 个客户端(a1,b1),(a2,b2)的变量:

我们将在接下来的步骤中使用这个例子。

1  var x >= 0;
2  var y >= 0;
3  var a1 >= 0;
4  var b1 >= 0;
5  var a2 >= 0;
6  var b2 >= 0;
7  var d1 >= 0;
8  var d2 >= 0;
9  var dx1 >= 0;
10 var dy1 >= 0;
11 var dx2 >= 0;
12 var dy2 >= 0;

如果我们将所有这些变量视为一个向量,我们可以定义第一个参数 C,等式:

C = [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0]

因为我们希望最小化 d1+d2 ,所以我们告诉设计 d1 和 d2 的列应该用 d1 和 d2 之前的系数(此处为 1)激活。如上面的变量列表所示,索引 6 和 7 实际上是 d1 和 d2。

然后,让我们计算代表在步骤 2 中定义的约束的不等式矩阵的左侧:

A_ub = [
[0, 0, 0, 0, 0, 0, -1, 0, 1, 1, 0, 0],
[1, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0], 
[-1, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0], 
[0, 1, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0], 
[0, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1], 
[1, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0], 
[-1, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0], 
[0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1], 
[0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1]
]

参照向量 C,我们必须用变量在向量中的索引来代替变量。在上面的例子中,我将不等式转换成 x1+x2 ≤0 的形式,以便右手边总是只有一个 0。这是一个实现细节,但我发现它在我的例子中很有用,因为 b_ub 将是一个零向量。

注意 A_ub 有 10 行,因为一个中继点只有 2 个客户端,2*5 个约束= 10。

现在,最简单的部分,不等式的右边应该是一个零向量,如上所述:

b_ub = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

说实话,最难的部分已经过去了;),我们现在将填充方程矩阵。基本上,不等式是针对约束的,现在方程矩阵表示给定的数据,在我们的例子中,这个数据是客户的坐标列表。因此,矩阵的左侧在每一行为所有客户端枚举一个坐标(ai,bi ),然后在右侧定义该值。

A_eq = [
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
]

不出所料,矩阵中所有客户端坐标(a1,b1),(a2,b2)的位置都出现了一条对角线。

b_eq = [10.0, 20.0, 15.0, 45.0]

这些值是客户坐标的例子。

第四步——编码!

是时候开始编码了!(最后)

为了计算 5 个先前的矩阵/向量,最好将其分成 5 种方法:1 种用于等式,2 种用于不等式 rhs/lhs,2 种用于等式 rhs/lhs。以下方法采用两个参数:

M :客户端坐标对(ai,bi)列表。

p :需要放置的中继点数。

最后,使用上述所有方法调用求解器。

让我们用前面给出的例子进行测试:

**Input**:M = [(10, 20.), (15, 45.)]p = 1**Output**:[(12, 28)]

给定一个中继只有两个点,这两个点之间的直线上有无限多个最优解(例如:(13,44)在这种情况下也是最优解),但它返回两个客户端坐标中间附近的一个点,这是一个相干解。

第 4 步——处理大量客户/中继

如果我们在多个客户机上使用当前的实现会怎么样?该算法将总是返回一个点的最佳近似值。但是如果我们设置 p > 1,我们需要放置不止一个继电器。因此,我们需要找到一种解决方案,将客户群体 M 划分到应用线性规划的一些组中。可以使用不同的方法,但是,我将展示一个使用 k-means 聚类算法的示例,该算法允许根据客户的坐标将我们的客户群划分为 p 个集群(最近的客户将聚集在集群中)。

**Input**:M=[(0, 50.), (100, 25.), (100, 40.), (50, 85.)]p=3**Output**: [[(0, 50)], [(100, 25), (100, 40)], [50, 85]]

在上面的例子中,我们将人口 M 分成包含最近点的三个子阵列。使用 Python,可以使用 numpyscipy 来完成,如下所示:

最后,通过连接所有的片段,我们来编写 solve(M,p) 方法。

现在享受大数据集上的算法:)

**Input**:n = 10000M = [(float(random.randrange(0, n)), float(random.randrange(0, n))) *for* i *in* range(1000)]p = 5**Output**:[(3521, 8323), (1923, 5113), (2545, 1486), (7495, 2267), (7600, 7528)]

第 5 步——奖励:UI 可视化

基于随机生成的坐标,在城市地图上模拟该算法可能会很有趣。

我们可以观察到继电器的重新分配分布得相当好。现在您可以自由使用自己的实现了。

还在读书?干得好!

感谢您的阅读,如果您有进一步的问题或本文中的错误,请随时联系我,这将是一种乐趣!

如果你在这篇文章中学到了什么,你也可以留下掌声:)

项目完整源代码:我的 GitHub repo 。

长尾分布的极限能力

原文:https://towardsdatascience.com/the-power-of-long-tailed-distributions-bd46f8856039?source=collection_archive---------18-----------------------

学会区分长尾分布和正态分布

数据科学家识别长尾分布至关重要

美国国家海洋和大气管理局在 Unsplash 拍摄的照片

介绍

如果你处理数据,但你不知道你的钟形曲线的长尾理论,这篇文章是给你的。最重要的是,你能认识到长尾分布及其含义,我希望你能在这篇文章结束时认识到。

长尾分布出现在许多领域,产生了让世界震惊和敬畏的巨大事件。有知识的人利用它们并从中获益,而无知的人则在它们手中受苦。

在这篇短文中,我想直观地描述一下长尾分布。首先,我将简要介绍您可能熟悉的另一种分布类型,即正态分布(或钟形曲线)。

在任何关于长尾分布的讨论中,马修原理都是一个合适的开场白…

“富人越来越富,穷人越来越穷”

直观呈现正态分布

如果正态分布是一个人,他们将是公平和温和的。想想哈利·波特

我们大多数人最熟悉的概念是正态分布。如果我将一些现象描述为“正态分布”,你可能会立即描绘出一条漂亮的钟形曲线。该指标的平均值将正好位于中心,随着远离中心点向极端移动,其两侧都有斜率。

正态分布可以通过其均值( )和标准差(σ)方便地定义。平均值给出了分布的中心点,标准偏差是距平均值(或中心)的距离的度量。

作者图片:正态分布= 0 且σ = 1

正态分布现象出现在许多领域。有些你可能比较熟悉的是智商,身高,考试成绩。由于它们的对称性,它们很友好,容易管理。让我们看一个裁剪服务,看看这在实践中是如何进行的。

一个知道身高是正态分布的裁缝将只需要考虑满足人们平均身高的 3 个标准偏差。她的服务将适合大约 99.7%的人口。

为了获得对正态分布现象的进一步直觉,理解它们是如何产生的很重要。首先,我们将介绍中心极限定理。

T

以《自然》杂志为例,让我们看看成年人的身高。众所周知,遗传和环境决定一个人的身高。只关注基因,我们知道大约有 180 个基因影响身高[2]。一种特殊的基因可能会导致脊椎变长或胫骨变短等。在很大程度上,我们可以假设每个基因独立发挥作用。

因此,如果一个人的身高是这 180 个基因贡献的总和,那么整个人群的身高将按照中心极限定理呈正态分布。

我希望你现在已经对正态分布有了一些直觉。如果有足够的领域知识,你现在甚至可以推测现象什么时候是正态分布的。

那么,长尾理论呢?

长尾分布的力量

如果长尾分布是一个人,他们可能是反社会和不稳定的。想想不可思议的绿巨人

长尾分布的其他名称是幂律分布和帕累托分布。

正态分布很直观,但我认为长尾分布同样不直观。这就是问题所在,长尾分布无处不在,难以识别;这应该与你有关。

在自然界中,它们出现在财富分布、图书销售、森林火灾规模、地震震级、数字媒体流等等。

P 幂律关系:长尾分布由幂律关系定义。它们可以用指数α,常数 c 来表示。

p(x)在区间[min,∞]上表示。α > 1,决定故事的长度。

作者图片:幂律关系

作者图片:指数α=2 的帕累托分布

对不理解它们的人来说,它们表现为“不公平”,事实也的确如此。与正态分布不同,长尾现象不以中点为中心。它们是完全不对称的,极端事件是罕见的,不可预测的,但当它们最终发生时,会产生巨大的影响。

长尾分布是如何产生的?

我们可以用两个模型来描绘这些长尾分布是如何发生的。

P 一个节点连接的越多,就越有可能收到新的链接[3]。

偏好依附经常在社会领域发生。以 Instagram 为例,如果你把账号看成节点,把关注者看成连接;一个账户的关注者越多,就越有可能获得更多的关注者。社交媒体账户的关注者分布可能是长尾的。

S 自组织临界:想象一个空的 N 乘 N 网格。在网格上随机选择一个地点,如果是空的,该地点生长一棵树的概率为 g。如果一个地点包含一棵树,闪电击中该地点的概率为(1-g)。被闪电击中的树着火,火势蔓延到所有相连的树[1]。

简单地说,大多数森林火灾都很小,但是有一个点,森林变得如此密集,火灾可能会很大。

在森林火灾模型中,有一个很酷的自组织临界模拟。

我们为什么要关注长尾分布?

以地震这种大致遵循指数为 2 的幂律分布的现象为例[1]。

一场 9 级地震的规模相当于 2011 年日本本州的地震。据估计,这场地震已经导致大约 29,000 人死亡,并损坏了核反应堆。根据我们对地震分布的假设,这种震级的地震每天发生的概率约为百万分之一。在 1 个世纪中,这种百万分之一的事件发生的概率约为 3.5%。

考虑到它可能造成的破坏,这突然变得非常令人担忧。当你意识到大多数地震都在里氏 5-5.9 级[6]之间,比我们百万分之一的地震弱一千到一万倍时,情况就更是如此了。

缺乏对长尾现象的认识将导致政府对这些导致大规模破坏的极端事件准备不足。

作者纳西姆·尼古拉斯·塔勒布将这类事件称为“黑天鹅事件”。我将用其他一些长尾事件的真实例子来结束这一部分…

2004 年印度洋海啸,2008 年全球金融危机,新冠肺炎。

最后的想法

作为数据科学家、统计学家或建模者,我们应该把混淆长尾现象和正态分布现象视为一大罪过。我们必须致力于理解我们工作领域中事件的驱动因素,以便我们能够正确地管理它们。无论是管理自然灾害,还是利用自然灾害发展营销渠道,我们都必须能够做到与众不同。

第一步是理解两者之间的主要区别。我希望这篇文章对你有所帮助。

https://www.linkedin.com/in/john-adeojo/

引文

[1]斯科特·e·佩奇,2018 年。《模范思想家》,第 62、74 页

[2] Lango,Allen H .等人,2010 年。"聚集在基因组位点和生物途径中的数百种变异影响着人类的身高."自然 467,编号 7317:832–838

[3]https://en . Wikipedia . org/wiki/Barab % C3 % A1si % E2 % 80% 93 Albert _ model #:~:text = Preferential % 20 attachment % 20 means % 20 that % 20 the,of % 20 social % 20 networks % 20 connecting % 20 people。

[5]https://www . live science . com/30320-worlds-biggestions-110412 . html

[6]https://www . USGS . gov/natural-hazards/seismic-hazards/lists-maps-and-statistics

Python 中记忆化的力量

原文:https://towardsdatascience.com/the-power-of-memoization-in-python-9fd6d284e9e7?source=collection_archive---------39-----------------------

了解如何用内存换取速度——让您的代码更快

由 Unsplash 上的 CHUTTERSNAP 拍摄

不,这不是拼写错误……记忆是一个东西。

当我第一次了解这项技术时,我被一种极致的美感所震撼。这种感觉我只在数学领域有过,在那里你会感受到更高层次的结构美。

记忆化对我产生了影响,因为我很快意识到这是计算中更普遍现象的一个特例。最大的秘密是内存和执行速度是一个硬币的两面。

我不仅能够更快地运行我的代码,而且从整体上让我对编程有了更细致的了解。

在本文中,我们将把它作为一个简单的 Python 解决方案来实现。

速度与内存

拿起一杯咖啡和你的笔记本电脑,哦,你可能想坐下来看看这个!

在编程中,有三种速度。

编程语言的原始能力与程序的设计无关,而是语言本身固有的特性。例如,Go 比 Java 快,比 Python 快得多,而 C++和 Rust 比 Go 快。

然后我们有了另一种速度。算法的有效性。也称为“复杂性”。Go 和 Rust 的速度很快,但是如果你选择了错误的算法,那么你的编程语言有多快真的无关紧要——它会很慢。

一会儿我们会看到一个例子。

第三,我们有“发展速度”。在许多情况下,这比语言速度的小幅提升更重要。例如,Go 和它的快速编译器在这个指标上击败了 Rust,尽管 Rust 在上述意义上更快,而 Python 击败了几乎所有其他语言,因为 Python 有大量的库和围绕它的巨大社区。

有时候语言的原始性能是最重要的,然后我们不应该(必须)选择 Python,但是如果你在 Python 中使用正确的算法,在 Rust 中使用错误的算法,纯 Python 会比 Rust 快得多。

一般来说,记忆和速度的关系有点像物理学中能量和质量的关系。它们是同一枚硬币的两面,从某种意义上说,你可以将其中一面转换成另一面。

也就是说,您可以通过“正确的方式”增加内存使用来提高速度(或者等效地,减少时间)。这叫做记忆

记忆化是一种降低功能的时间成本以换取空间成本的方法。也就是说,内存化的函数在速度上得到优化,以换取更高的计算机内存空间利用率。

算法的时间/空间“成本”在计算中有一个特定的名称:计算复杂度。所有函数在时间和空间上都有计算复杂度。

维基百科。

因此,让我们看看如何利用 Python 中用内存换取速度的思想来优化代码。

Python 中的记忆化

假设我们想计算斐波那契数。谁不会呢?此外,我们想用 Python 实现一个优雅的递归算法。

让我们试试那个。

我们瞬间得到 610 。你知道什么?有用!

然而,当我们拿着一杯新咖啡回到椅子上,然后试图计算第 100 个斐波纳契数时,什么也没发生!!!

很长一段时间都没有输出。这里出了什么问题?我们之前刚刚看到了一个快如闪电的结果。

这个算法实际上具有指数复杂性,这意味着运行时间随着输入成指数增长。

这可不好。

原因是对函数fib 的每个调用都需要在所有数字上运行自己,直到 1 - 每个函数!我们多次调用fib。这意味着我们疯狂地计算fib(2)很多次。

这当然可以优化。

考虑下面的代码,其中我们使用一个字典来保存兑现的输出值。

我们得到输出 354224848179261915075 。它工作了。

但是,我们不希望变量出现在全局范围内,对吗?如果在函数执行完毕时清除了memory字典,那就更好了。

嗯,我们需要在某个局部范围内有一个随函数一起消失的 cashing 字典。这听起来像是装修问题。

考虑一下这个。

这同样快速地打印出上面的数字,但是这一次所有的数据都在函数返回后被清除。可以这么说,我们已经将兑现包裹在函数周围,这使得 Python 运行这个计算的速度快了数百万倍!

我们当然可以不用记忆技术来构建一个快速的 Fibonacci 函数,但是这需要一个循环来代替递归,从逻辑的角度来看,递归真的很好。

递归可以简单得多,可读性更好,事实上也很漂亮...而谁不想要简单、美观、快捷的结合呢?也就是说,我们应该小心 Python 中的递归,因为我们很容易遇到堆栈溢出,这意味着调用堆栈变得太大。

Python 有一个相对较低的堆栈限制,尽管你可以修改它。

一般来说,递归更像是一种函数式的方法,因为在(真正的)函数式语言中,你没有循环,因为循环需要你改变变量,而函数式语言没有这种功能。

Python 是一种面向对象的语言,如果你需要深入研究,那么就使用循环吧!尤其是你不知道自己要去多深的地方。也许递归的债务将是用户定义的(例如,如果你正在构建一个递归文件爬虫)。

得到一个您没有预料到的堆栈溢出错误是很烦人的,因为您在一个比用户更浅的文件系统/文件夹上测试了它。

顺便问一下,如何使用循环创建这个fib函数?

好吧…我想我已经折磨你够久了。记忆化这个词来源于拉丁语备忘录,意思是:“被记住”

幸运的是,您不需要为了使用它而记住它!

喜欢在 Medium 上阅读像这样的文章? 获得会员资格 获得完全权限。

在 R 中 mutate()处理数据争论的能力

原文:https://towardsdatascience.com/the-power-of-mutate-for-data-wrangling-in-r-172dd2b0be73?source=collection_archive---------7-----------------------

一系列代码片段,将帮助您使用 R 语言转换数据。

罗斯·芬登在 Unsplash 上的照片

我周围看到的大部分数据角力和转换相关的帖子都在用熊猫。我,作为一个熊猫爱好者,已经写了一些。但是很高兴知道还有其他伟大的工具可以帮助你进行同样的转变。有时候这更容易,有时候没那么容易。

Tidyverse

当我几年前学习 R 语言时,我必须导入许多库来处理数据,比如dplyrtidyr等。现在,在 tidyverse 包出现后,你只需添加那行library(tydiverse),你就可以很好地完成本文中显示的所有转换。

提醒:在 R 中安装库只需要install.packages("lib name")

让我们开始编码吧。首先,我将创建这个简单的数据集作为我们的示例。

# creating a dataframe
df <- data.frame(col1=c(1,2,3,4,5,7,6,8,9,7),col2=c(2,3,4,5,6,5,5,4,6,3),col3=c(5,7,8,9,9,3,5,3,8,9),col4=c(43,54,6,3,8,5,6,4,4,3)) col1 col2 col3 col4
1     1    2    5   43     
2     2    3    7   54      
3     3    4    8    6      
4     4    5    9    3      
5     5    6    9    8      
6     7    5    3    5      
7     6    5    5    6      
8     8    4    3    4       
9     9    6    8    4      
10    7    3    9    3 

变异( )

mutate()是一个添加新变量并保留现有变量的 dplyr 函数。那是文档说的。因此,当您想要添加新变量或更改数据集中已有的变量时,这是您的好帮手。

给定我们的数据集df,我们可以很容易地添加带有计算的列。

# Add mean, std and median of columnsmutate(df, mean_col1 = mean(col1),std_col2 = sd(col2), median_col3 = median(col3)) col1 col2 col3 col4 mean_col1 std_col2 median_col3
1     1    2    5   43       5.2 1.337494         7.5
2     2    3    7   54       5.2 1.337494         7.5
3     3    4    8    6       5.2 1.337494         7.5
4     4    5    9    3       5.2 1.337494         7.5
5     5    6    9    8       5.2 1.337494         7.5
6     7    5    3    5       5.2 1.337494         7.5
7     6    5    5    6       5.2 1.337494         7.5
8     8    4    3    4       5.2 1.337494         7.5
9     9    6    8    4       5.2 1.337494         7.5
10    7    3    9    3       5.2 1.337494         7.5

添加一个新变量。

# Create new Variable
new_var <- c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j')# Add it to the dataset
mutate(df, new_var)

用更改的数据替换变量。

# Change column 1 to proportions
mutate(df, col1=proportions(col1)col2 = col2*100) col1     col2 col3 col4
1  0.01923077  200    5   43
2  0.03846154  300    7   54
3  0.05769231  400    8    6
4  0.07692308  500    9    3
5  0.09615385  600    9    8
6  0.13461538  500    3    5
7  0.11538462  500    5    6
8  0.15384615  400    3    4
9  0.17307692  600    8    4
10 0.13461538  300    9    3

将 mutate 与其他函数结合使用

Mutate 可以和其他伟大的功能结合使用。让我们看几个例子。

变异和重新编码

recode()是一种改变变量内观察值的方法。可以和mutate()一起使用。

# Change letters from 'new_var' to numbersmutate(df, new_var = recode(new_var,'a' = 1, 'b' = 2, 'c' = 3, 'd' = 4, 'e' = 5,'f' = 6, 'g' = 7, 'h' = 8, 'i' = 9, 'j' = 10)) col1 col2 col3 col4 new_var
1     1    2    5   43       1
2     2    3    7   54       2
3     3    4    8    6       3
4     4    5    9    3       4
5     5    6    9    8       5
6     7    5    3    5       6
7     6    5    5    6       7
8     8    4    3    4       8
9     9    6    8    4       9
10    7    3    9    3      10

变异和替换

replace()类似于 recode,但是它是来自 base R 的一个包,您可以使用它来基于一列值或逐个地更改观察值。

replace函数接收变量列、要更改的索引列表和值列表。另一个选择是指向你想要改变的某个值和替换值。

# replace using index list
mutate(df,new_var = replace(new_var, c(1,2,3,4,5,6,7,8,9,10), c(1,2,3,4,5,6,7,8,9,10)))# replace using value to be changed
mutate(df,new_var = replace(new_var, new_var=='a', 1)

变异和切割

cut()是以 R 为基数的函数,用于转换数值范围内的观察值,并将这些值放入箱中。

在下面的例子中,我使用cut为第 1 列创建两个库[ 从最小值到平均值和从平均值到最大值 ]。那么第一个容器中的每个值将收到标签“低于平均值”,而第二个容器得到“高于平均值”。

# Labeling with cut
mutate(df, col1_label_avg = cut(col1, c(-Inf, mean(col1), max(col1)),c('lower than avg', 'above the avg') )) col1 col2 col3 col4    col1_label_avg
1     1    2    5   43      lower than avg
2     2    3    7   54      lower than avg
3     3    4    8    6      lower than avg
4     4    5    9    3      lower than avg
5     5    6    9    8      lower than avg
6     7    5    3    5      above the avg
7     6    5    5    6      above the avg
8     8    4    3    4      above the avg
9     9    6    8    4      above the avg
10    7    3    9    3      above the avg

变异和转化

transmute()是 dplyr 包中的另一个函数。它增加新的变量,同时减少其他变量。我们可以使用它来添加 col1 标签,并删除练习中其他不必要的列。

mutate(df, col1_label_avg = cut(col1, c(-Inf, mean(col1), max(col1)),c('lower than avg', 'above the avg'))
) %>% transmute(col1, col1_label_avg) #drops other cols col1   col1_label_avg
1     1     lower than avg
2     2     lower than avg
3     3     lower than avg
4     4     lower than avg
5     5     lower than avg
6     7     above the avg
7     6     above the avg
8     8     above the avg
9     9     above the avg
10    7     above the avg

由 vitamina poleznova 在 Unsplash 上拍摄的照片

变异和选择

select()是 dplyr 中的一个函数,工作方式很像 SQL 语句。它选择您需要的列,并按照它们列出的顺序排列它们。

# Performing a transformation and selecting columns
df %>% mutate( col1_pct = proportions(col1) ) %>% select (col1, col1_pct)

我们可以创建一些转换,并使用 select 按照我们想要的方式对列进行排序。

df %>% **# add new column and calc proportion of col1**mutate( new_var, col1_pct = proportions(col1) ) %>% ** # change values in new_var from letters to numbers, add as new col**mutate( new_var_numbers = replace(new_var,  1:10, 1:10) ) %>%** # select the transformed columns in the desired order**select (col1_pct, col1, new_var_numbers, new_var,) col1_pct    col1    new_var_numbers   new_var
1  0.01923077    1               1         a
2  0.03846154    2               2         b
3  0.05769231    3               3         c
4  0.07692308    4               4         d
5  0.09615385    5               5         e
6  0.13461538    7               6         f
7  0.11538462    6               7         g
8  0.15384615    8               8         h
9  0.17307692    9               9         i
10 0.13461538    7              10         j

在你走之前

你可以用mutate()做很多事情。这是 R 语言中一个强大的方法,当与其他方法结合时,它增加了可能性。

通过实践并应用到您的数据探索中来利用它。将它与本帖中介绍的其他一些功能一起使用。

  • mutate():增加或改变变量。对变量进行计算。
  • recode():改变变量内的观察值。
  • replace():类似于 recode,但是您可以使用列表来更改值。
  • cut():将观察值放入数值范围。
  • transmute():添加新变量并丢弃其他未列出的变量。
  • select():用于选择或重新定位变量。

如果你对这些内容感兴趣,别忘了关注我。

https://medium.com/gustavorsantos

排列测试的威力

原文:https://towardsdatascience.com/the-power-of-permutation-testing-c2ac66f2d166?source=collection_archive---------6-----------------------

如何让你的假设测试更有创意

假设检验已经存在了几十年,有了确定观察到的结果是否有意义的成熟方法。然而,有时很容易忘记使用哪种测试方法,或者它是否能可靠地应用于您的情况。

真实世界的用例

公司经常使用调查来跟踪他们的 NPS (净推广者分数),这是一种旨在反映客户忠诚度和增长潜力的措施。

计算很简单,问客户他们推荐你的企业的可能性有多大(0-10 分),然后从肯定的百分比中减去否定的百分比。

NPS 计算。图片作者。

然而,更不简单的是知道两个分数何时显著不同。传统的假设检验通常是回答两个均值、比例或方差是否有意义不同的问题。NPS 并不完全符合这些测试,因为它实际上是在测量两个相关比例的差异。

你用什么测试统计来做这个?

回归基础

需要某种解决方案。如果我们正在进行一项实验,随机抽样的客户接受一种新类型的服务,仅仅关注我们的调查结果是不够的,我们想知道它是否对他们的 NPS 产生了真正的影响。

进入排列检验,这是一项非常有用的技术,因为它可以应用于我们定义的任何检验统计量,并且不假设基础分布是正态的。

排列测试从零假设开始,即我们测量的两组之间没有差异。如果这个假设是真的,我们应该能够在两组之间随机改变所有的观察值,而不影响它们的总体统计数据。

由科迪·诺丁汉在 Unsplash 上拍摄

冲洗并重复

为了检查是否可以拒绝零假设,数据被一次又一次地随机打乱,并且每次记录两个随机创建的组之间的差异。最后,两组之间观察到的实际差异可以与数千次模拟进行比较,以了解在零假设下有多令人惊讶/不太可能。

在使用这种方法时,我们可以省去任何复杂的公式,而是遵循一个直观的过程来捕捉零假设和 p 值的真正含义。

把你的代码放到你该说的地方

让我们看看如何在 Python 中实现这一点。

首先,假设我们有一个数据集,其中包括两个不同组的客户的 NPS 调查回复:

import pandas as pddf = pd.read_csv('nps_data.csv')
df.head()*| group   | response |
| ------- | -------- |
| control |        7 |
| test    |        3 |
| ...     |      ... |
| test    |        5 |*

我从 Displayr 借来的一个方便的技术表明,我们不必每次都计算支持者和反对者的百分比,以便将一个从另一个中减去。我们可以用 100 代替推广者分数,用-100 代替贬低者分数,用 0 代替中立者分数,这样取平均值就代表了总的 NPS 分数。

df.loc[df['response'].between(0, 6), 'recoded'] = -100  # Detractors
df.loc[df['response'].between(7, 8), 'recoded'] = 0  # Neutrals
df.loc[df['response'].between(9, 10), 'recoded'] = 100  # Promoters

接下来,我们需要一个可以随机洗牌并记录 NPS 差异的过程。

import numpy as npdef simulate_difference_in_nps(nps_data: pd.DataFrame) -> float:*"""Shuffle all of the responses and reassign them to each group, before calculating the absolute difference in NPS between the two groups in this simulated scenario.Parameters----------nps_data : pandas DataFrameDataset containing the NPS scores of survey respondents from two different groups.Returns-------floatThe absolute difference in NPS scores between the two groups once all of the responses had been shuffled and reassigned to each group."""* responses_in_single_group = nps_data.value_counts('group')[0]randomly_shuffled = np.random.permutation(nps_data['recoded'].values)nps_1 = randomly_shuffled[:responses_in_single_group].mean()nps_2 = randomly_shuffled[responses_in_single_group:].mean()return abs(nps_2 - nps_1)

考虑到即使对于一台强大的计算机来说,探索结果的每一种可能的排列通常也是不切实际的,这个过程将被一次又一次地重复,以建立一个健壮的模拟样本。这种采用固定数量的样本而不是所有可能的排列的方法被称为蒙特卡罗方法。

num_simulations = 100000simulated_results = []for _ in range(num_simulations): simulated_results.append(simulate_difference_in_nps(nps_data=df))simulated_results = np.array(simulated_results)

最后一步是,在将我们观察到的数据与数千个随机排列的数据进行模拟比较后,确定我们是否可以拒绝零假设。

**# This would be calculated from the original data, but let's 
# hard-code a value for simplicity**
observed_difference_in_nps = 1.6**# Use 5% level of significance**
significance_level = 0.05**# How often did we see a difference as extreme, or more extreme, 
# than what was observed** simulations_as_or_more_extreme = sum(simulated_results >= observed_difference_in_nps
)**# The observed result is statistically significant if its p-value is 
# less than the pre-defined significance level 
# i.e. it was very unlikely to occur under the null hypothesis** num_simulations = simulated_results.shape[0]
p_value = simulations_greater_than_observed / num_simulations**# Boolean which is True if significant, False otherwise**
significant_or_not = p_value < significance_level

作为一个很好的奖励,通过执行所有这些随机模拟,我们甚至可以想象在零假设下我们观察到的结果会有多不寻常。

import matplotlib.pyplot as plt
import seaborn as sns **# Plot permutation simulations**
density_plot = sns.kdeplot(simulated_results, shade=True)density_plot.set(xlabel='Absolute Difference in NPS Scores Between Groups',ylabel='Proportion of Simulations',title='How Surprising Is Our Observed Result?'
)**# Add a line to show the actual difference observed in the data**
density_plot.axvline(x=observed_difference_in_nps, color='red', linestyle='--'
)plt.legend(labels=['Observed Difference', 'Simulated'], loc='upper right'
)plt.show()

观察差异与随机排列的比较。图片作者。

就这样吧!

我们现在有了一个对 NPS 分数进行双尾检验的模板。对于单尾测试来说,重构代码不会花费太多精力;只需记录每个排列的差异,而不是绝对差异。

放在一起

上面的实现有助于解释所需的步骤,但是有点笨拙和低效。

查看我的 GitHub repo ,看看如何将这个过程放置在一个更高效的、经过单元测试的 helper 类中,当重复排列过程时,这个类可以在多个内核上并行化。

同一个回购协议还包含如何使用代码的演示如下。

在 NPS 分数上使用排列测试的演示笔记本,以确定它们是否显著不同。

三思而后行

为了便于说明,本文主要关注 NPS,但是置换测试可以应用于任何领域,尤其是那些我们不确定我们测量的变量的分布是什么样子的领域。

然而,与任何统计方法一样,在使用排列测试之前,有一些事情需要考虑。

  1. 我们仍然需要从合适的样本量开始。如果每组只有 3 名受访者,任何形式的假设检验都可能是毫无意义的。
  2. 零假设表明每组的值是可交换的,因此我们在技术上测试第 1 组的值是否来自与第 2 组相同的分布。因此,置换测试仍然假设两组具有相同的潜在方差,这可能并不总是有效的。
  3. 知道要执行多少排列可能很困难。简而言之,最好谨慎行事,在我们愿意等待的时间内,尽可能多地选择我们的机器能够处理的数量。有很多关于提前选择号码的进一步阅读。

记住这些注意事项,您将安全地为您的数据科学工具包添加一种全新的测试方法。

当你在这里的时候

请随意查看我的其他文章:

  • 避免内存不足的简单窍门
  • 如何找到合适的簇数
  • 如何管理初级数据科学家
  • 计算您的损失函数

参考

[1] Rand R. Wilcox,8-比较两个独立组,编辑:Rand R. Wilcox,应用当代统计技术,学术出版社,2003,第 237-284 页,ISBN 9780127515410,https://doi.org/10.1016/B978-012751541-0/50029-8。
(https://www . sciences direct . com/science/article/pii/b 9780127515410500298)

[2]http://教职工. Washington . edu/ken rice/sisg/sisg-lie 11-05 . pdf

[3]https://www . evaluation onresearch . com/WP-content/uploads/kb/SpecialReport _ montecarlosimulationrials . pdf

应用交叉验证的岭回归

原文:https://towardsdatascience.com/the-power-of-ridge-regression-4281852a64d6?source=collection_archive---------10-----------------------

汉斯·M 在 Unsplash 拍摄的照片

一个回归问题的演练,包括预处理、特征选择和超参数调整

数据科学家经常被要求在没有给出特定指令的情况下预测商业环境中的目标变量。这是一项具有挑战性的任务,有多种方法可以到达终点线。这个博客是一个如何利用岭回归进行端到端多元分析的例子。举例来说,众所周知的住房数据被挑选出来,其中房屋销售价格将是目标变量。

预处理

首先,我从消除因缺乏舒适设施而导致的缺失数据开始。像 area 这样的数字缺失值被替换为零,因为用零表示不存在的区域更有意义。带有有序分类值的列中缺少的值将被替换为字符串,以指示该观察中没有数据点。在这里,用一个字符串代替np.nan是很重要的,因为它们将按顺序被赋予代表它们等级的数值。对于其余的分类值,缺失的数据将替换为最常用的值。

第二,每个分类值都被转换成一个数值。有序分类值被替换为数字表示,并按照以下代码的顺序保留它们的等级:

# creating the dictonary including the replacement values
bsmt_zip = {'Ex':6,'Gd':5,'TA':4,'Fa':3,'Po':2,'NA':1}# using the map function to complete the replacement
housing_data.BsmtQual = housing_data.BsmtQual.map(bsmt_zip)

年份列被转换成三个箱:新的、旧的和年中的。1978 年以前的房屋被贴上老旧的标签,因为那时的房屋被涂上了含铅油漆,这在 1978 年是被禁止的。1999 年以后建造的房屋被标为新的。

housing_data.YearBuilt.map(lambda x: 'new' if x>1999 else ('mid' if x>1978 else 'old'))

稍后,其余的分类值将替换为数值:

# columns containing string values
string_columns = df_types[df_types[0]=='object']['index']# columns with only numeric values
non_string_columns = df_types[df_types[0]!='object']['index']# creating dummy columns for string columns
dummy_df = pd.get_dummies(housing_data[string_columns])# dummy and numeric columns are concatenated
df = pd.concat([dummy_df,housing_data[non_string_columns]], axis=1)

在这一点上,预测器的数量是 247,需要减少,并且有多种方法可以实现。我将尝试通过检查预测值与目标值的相关性来手动减少预测值的数量。然后利用岭回归调整它们在模型中的系数。与常规多元线性回归相比,我更喜欢岭型回归,因为我的数据有共线列。就正则化偏好而言,我选择山脊而不是套索,因为我已经选择了最相关的预测因子,并且不需要强制预测因子系数为零的苛刻正则化。换句话说,我不需要特征选择技术,我只需要调整我的模型分配给不同预测器的权重。

# correlations between sale price and other fields
df_corr = abs(df.corr()).sort_values(by='SalePrice', ascending=False)[['SalePrice']]# a new dataframe including only the relevant predictors
df_small = df[df_corr[df_corr['SalePrice']>0.4].index.tolist()]

到目前为止,还剩下 23 个与销售价格的相关系数高于 0.4 的预测值。下一步是将数据集分为训练和测试。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 42)

这不是必须的,但是在这一点上,我想对多个列应用 log-transform,在这些列中有多个异常值,并且分布有一个正偏差。下面是地面生活区对数变换前后的情况。第一个直方图具有由异常值引起的正偏斜,并且第一个概率图显示了它不是正态分布的良好代表的事实。

图像的左侧和右侧分别代表地面生活区对数变换前后的情况

预处理的最后一步是标准化。有必要将每个预测值调整到相似的范围。否则,一些列将支配其他列。在这种情况下,StandardScaler用于根据方差对列进行缩放。这是应用岭回归前必不可少的一步。

from sklearn.preprocessing import StandardScaler
# initiate the standard scaler
ss = StandardScaler()
# fit 
Z_train = ss.fit_transform(X_train)
# transform the df
Z_train = pd.DataFrame(ss.transform(X_train), columns=X_train.columns)

应用岭回归

当应用脊正则化时,我们需要找到用α表示的最优惩罚系数。阿尔法值越高,系数的惩罚就越强。

让我们检查一下 alpha 对系数的影响。这里,标度是α的对数,因为它具有平方误差值。(对于 Lasso,它将是 alpha 本身,因为它使用误差的绝对值而不是误差的平方。)

当α增加时,观察到系数变小是有意义的,但下一个问题是,我们需要选择哪个α来获得最优解?为此,我将使用交叉验证。

# list of alphas to check: 100 values from 0 to 5 with
r_alphas = np.logspace(0, 5, 100)# initiate the cross validation over alphas
ridge_model = RidgeCV(alphas=r_alphas, scoring='r2')# fit the model with the best alpha
ridge_model = ridge_model.fit(Z_train, y_train)

在意识到使用哪个 alpha 和ridge_model.alpha_之后,我们可以利用优化的超参数并拟合新的模型。在我的例子中,测试的 R 值为 85.99%,训练的 R 值为 83.92%。

训练分数还不错,但如果能通过测试数据获得更高的分数就更好了。在可能遭受过拟合的数据集中,我们实现了避免这种情况,并使模型适应信号而不是噪声。

我的方法的下一步可能是比较手动特征选择之上的岭回归和套索回归的结果。毕竟,Lasso 本身将涵盖特征选择和建模。

在上文中,我尝试总结了如何在将数据集输入模型之前对其进行预处理的方法,包括处理缺失值和分类值、挑选相关字段以及标准化。在决定了要使用的算法之后,我决定了最佳的超参数,并将其应用到我的测试数据中。

感谢阅读到最后,你可以在这里找到我的笔记本。如有任何问题或意见,请联系。

[1] M. Brems,J. Pounders,K. Katovich,正则化(2019),大会数据科学沉浸式
[2] P .马塞利诺,用 Python 进行全面的数据探索 (2017),Kaggle

健康数据分析的力量

原文:https://towardsdatascience.com/the-power-of-your-health-data-analysis-d48bd61f72ea?source=collection_archive---------51-----------------------

个人幸福分析的巨大可能性

国家癌症研究所在 Unsplash 上拍摄的照片

个人健康数据。

你测量它吗?你分析一下吗?它真的有助于改善你的健康吗?

我思考过这个问题。

我在我的村子里见过一些健康的 80+甚至 90+的人,他们可能甚至没有想过跟踪他们的健康数据。他们只是遵循一些好的惯例和习惯。专注于数据分析而不是简单地生活和享受生活会不会太过分了?为什么要做这样的分析?这一切不会太过分吗?

但是,事实是,我们改进了我们测量和分析的东西。

对于那些没有测量和分析数据的人来说,潜意识里,他们关心自己的健康。他们不需要工具来提醒他们需要控制饮食来保持体重。他们不需要数步骤来验证,以确保他们继续前进。或者他们不需要睡眠时间的数据来提醒他们睡眠对每天获得充足睡眠的重要性。他们下意识地做了所有这些。

但是,现在,当我们有工具和方法来有效地做到这一点时,为什么不利用它而不是做得太多呢?

你知道,我们在系统、现实世界的问题、业务增长等方面做了如此多的计划、测量和复杂的数据分析,为什么不在个人健康方面也做一些努力呢?

在我们 20 多岁的时候,我们没有意识到它的重要性,因为你甚至不觉得这些事情有什么关系。你的身体几乎可以应付任何事情。但是当你进入 30 多岁时,你意识到你应该好好照顾自己的健康。我也不例外。

在这篇文章中,我分享了我测量和分析的一些数据是如何帮助我改善健康的。我还想到了一个概念或想法,我想在文章的结尾分享,这只是一个想法,但可能有巨大的可能性。

1.重量数据

你能测量这些年来你的体重是如何变化的吗,因为这是衡量长寿和健康生活的重要因素之一。

我认为我们不应该仅仅强调体重,还应该强调其他参数,比如测量腰围,这可以显示腹部脂肪和肥胖的风险,但简单地测量体重数据并进行分析也有助于我提高。

35 之前,我只是偶尔测一下。我是一个瘦的家伙,我的体重是 55 公斤,接近体重不足。从 27 岁开始,我的体重增加了。

从 27 到 33,我上了 72 公斤。暴饮暴食、缺乏良好的睡眠习惯、缺乏锻炼和巨大的压力导致了体重增加。因为我没有持续地测量它,所以我既没有意识到这些变化的发生,也没有做任何事情来控制它。

我随后将体重降低到 55-56,直到 2016 年我 36 岁。自 2016 年以来,我在过去 5 年中定期测量我的体重以及我和我家人的健康数据。我分析了这些年来体重的变化。这是数据看起来的样子。

随着时间的推移,以千克为单位的个人体重数据(图片由作者提供)

  1. 在这 5 年里,我的体重从 55 公斤到 65 公斤不等。
  2. 大部分时间保持在 60 到 62 公斤的范围内。对于我 5 英尺 5 英寸的身高和年龄来说,这似乎是最理想的。因为我测量并分析了它,所以我有意识地始终保持在这个范围内。

2.锻炼数据

你和你的日常锻炼有多一致?你可以记录你每天走的步数。你可以追踪移动花费的时间。

我发现我在工作日一直坐在一个地方。我的 IT 工作的性质就是这样,也许在过去不是这样。如果我没有保持运动的提醒,我甚至不会一天完成 2000 步,而通常我最终能做到的平均水平是 6500 步/天。

当我开始在 Strava 上跟踪我的晨间散步数据时,类似的事情发生了。我越来越多地跟踪我的日常散步、跑步和测量进展,它显示我在哪里,我可以在哪里改进。

我有规律地晨跑了 70 天。

今年我坚持走了 208 天。

如果我没有测量和分析数据,这一切都是不可能的。它实际上会激励你做更多的事情。

3.年度体检数据

我曾经在一本书上读到过,在日本,大多数人每年做一次体检是很正常的,而且他们通常活得更长。他们及时发现了任何急性疾病。

然而,我也有另一种观点,我们不应该去检查,除非身体出现症状。我们的身体是一台比人类能创造的任何其他系统都要聪明得多的机器。

有相反的观点,为什么不在它们之间取得平衡,在你过了 30 岁后每年做一次体检。

结果数据,如你的胆固醇水平、甘油三酯水平、血糖、甲状腺水平、血压等,可以显示多年来的模式。我发现每次做体检的时候,我也开始通过锻炼等方式做更多的事情来增进健康。这是一个提醒。

此外,我们可以测量和分析许多其他参数。再举几个例子:

  • 一年中你身体不适的周数。当我多年来测量它时,这个数字开始下降。
  • 你一天喝多少水?这个我是吃了苦头才知道的。我没有喝足够的水,这成为了患肾结石的主要原因之一。现在我在桌子上放了两瓶水,这样我就能保证每天喝两次。

我们后来才意识到健康的重要性。这就是为什么从来不运动的人在 30 多岁时开始跑步和锻炼。你可能已经注意到了。测量和分析你的健康数据可以给你带来健康生活所需的洞察力。毕竟,这几乎不需要任何时间,分析也不复杂,也不需要复杂的工具。

这让我进一步思考一个有趣的想法。

个人幸福分析

你知道,当我每周追踪我的体重数据时,我也输入了一些评论。我不分享这些细节,因为这是个人资料,但我写了我生活中发生的事情。

这些数据有助于分析我减肥的时间与我生活中发生的事件以及我的健康状况之间的相关性。

自从我开始工作以来,我还记录了过去 19 年的个人财务数据。我知道我的净值是如何增长的,因为我每个月底都会更新它。我能在我的健康和财务数据之间建立任何关联吗?当我挣得更多或存得更多时,我更快乐吗?或者说,当我的净资产增长时,我的身体和精神健康吗?或者反之亦然?你明白了。

进一步延伸,可以把我们所有的健康、财务、精神、职业、情感、社会数据等等。这将提供一个关于个人幸福的指数。

以及一个预测分析解决方案,它将分析所有这些数据,并建议您可以做些什么来增加您健康中缺少的一个领域。也许你在经济上做得很好,但是在情感上你做得不太好,或者你缺乏社会交往。该解决方案可以分析这些事情,并提供具有人工智能功能的日常建议。

很少有例子像—

  • 如果它知道你身体状况不佳,也许会建议你进行体育活动
  • 也许建议从事一项爱好(精神)
  • 或者,如果数据显示你感到疲劳,需要休息(情绪上的),建议一个度假的地方
  • 或者建议和一个你喜欢的很久没说话的人进行一次有趣的对话(社交)
  • 或提供赚钱或消费的机会(金融)
  • 或者建议读一本书或一篇文章或看一部电影(心理)
  • 或者建议捐赠给离你最近的需要帮助的人,或者做一些可以帮助他人的好事(精神上的)

类似这样的事情。

选择是无穷无尽的。该应用程序可能过于个人化,无法为每个人定制某个功能,因此结果可能尽可能地因人而异。它可以从各种应用程序中获取数据,如果数据已经存在于这些应用程序中(比如 Strava、Apple Health、您的财务规划师等),并提供智能以提供洞察力。

这是目前的想法。我不知道已经有这样的解决方案。我可以想象,这可能是,但如果不是,我可以想象这是如何个性化的,对一个人来说是独一无二的,并尽可能全面地利用人工智能能力。

这个解决方案,我称之为 PWA(个人幸福分析),只是我想出来的一个名字。它能有助于提高幸福感,而不会给生活带来太多人为的味道或干扰吗?

我认为有巨大的可能性,它可以提高生活的幸福和长寿。你怎么想呢?

(你可能也喜欢 数据分析在解题中的重要性 关于走向数据科学。)

提供有效技术演示的实用策略

原文:https://towardsdatascience.com/the-practical-strategies-to-deliver-an-effective-technical-presentation-53a48b11c74c?source=collection_archive---------19-----------------------

有效进行技术演示的技巧

马修·奥斯本在 Unsplash 上拍摄的照片

技术演示是不可避免的,尤其是在围绕快速发展的技术堆栈、算法和工作流传递知识时。

技术演示跨越不同的背景,例如

  • 技术销售演讲
  • 示范
  • 技术支持
  • 知识传授会议。

其中每一个都需要不同的粒度来传递关于技术概念的想法,或者向特定的观众群演示技术现场演练。

我第一次糟糕的技术分享激发了我对有效交付方式的探索。对我来说,解释 LSTM 和建筑结构似乎是一项不可能完成的任务。不用说,观众没有从两个小时的会议中带走任何东西。

从那以后,我努力寻找不同的方法来有效地传递内容。我应用这些方法,观察它在各种场合下的效果,一路修补技术。

作者照片

下面是清单上最重要的 3 个诀窍,它们会让一个糟糕的会议变得有意义。唯一的目的是最大限度地理解主题,使会议有价值。

内容的要旨:

  1. 从大图到细节。而不是相反。
  2. 理解观众。
  3. 视觉化就是一切。

1.从大图到细节。而不是相反。

背景:

演讲者选择演讲顺序的一个常见做法是使用时间顺序来解释某个主题的某个流程。

在技术世界里,这通常意味着它从解释基本块或基本模块开始,这些基本块或基本模块构成了更大的东西。它也可以指从步骤 1 到步骤 N 的工作流程的演练,以实现目标。

由 Lucrezia Carnelos 在 Unsplash 上拍摄的照片

虽然这是完全正常的,但技术模块需要曲折才能完成某个里程碑。可能只有当观众到达旅程的终点时,他们才可能在理解所有的咕哝时刻导致什么的顿悟时刻到来。

这里有一个问题,幸运的是观众们还在关注,大多数人在那之前都没有成功。对于那些开始理解最终目标并打算更彻底地理解这个过程的人来说,这个会议可能已经接近尾声了。

相反,应该这样做:

由欧洲航天局 ESA 在 Giphy 上拍摄的照片

在课程开始时描绘出大的蓝图,详细说明在终点线上的目标是什么样的,并将其分解为实现该目标所需要的条件。这也间接地增强了观众跟随你完成潜在挑战性步骤的毅力,比如通过代码行的解释,或者算法的分解。

照片由亚历克斯·金在 Unsplash 上拍摄

建立基础只是旅程的开始。在演示过程中,定期与观众进行里程碑检查。清楚地说明我们所处的步骤,我们的前进方向,以及这一步如何映射到全局。

2.理解观众。

作者照片

几乎每当我准备演讲时,我都会围绕听众提出以下问题。

  • 观众是谁?
  • 他们有什么背景?
  • 人群有多少?

这有助于在考虑听众的情况下塑造整个演讲的基调。从本质上来说,一场演讲的成功取决于每个接受者能拿走多少。因此,清楚地知道谁是接收者,就可以直接决定演示的内容。这包括

  • 衡量要涵盖的主题的复杂性
  • 确定要包含的背景上下文
  • 围绕技术概念形成行话

取决于听众的背景,演讲者通常不得不缩小范围,简化内容,并以听众能够理解的方式来呈现。

简化并不意味着你遮蔽或不解释关键概念,而是强调和关注一些最重要的关键点。人类的注意力是有限的,关注他们最容易忘记的 1000 件事情是没有意义的。相反,把注意力集中在 3 个最重要的关键点上,观众会机智地自己去填补缺失的谜题。

3.视觉化就是一切。

在 Unsplash 上由halance拍摄的照片

虽然技术内容本质上很复杂,但交付方法不一定如此。无论讨论的话题是什么,重新思考呈现方式总是可以的。

有多种可视化方法,从图表、图形、信息图、表格等等开始。

以下是一些非常适用于大多数场景的可视化方法:

  • 流程图

大多数工程解决方案由一系列步骤和过程组成,每个步骤都有特定的输入和输出。以图形方式展示有助于一目了然地描绘出整个工作流程,并有助于参照流程图一步一步地解释细节。

作者照片

工程界的决策是一系列的权衡,权衡利弊,选择最适合情况的一个。

作者照片

  • XY 图形

XY 图形是一个二维图形,显示 x 元素(水平轴)和 y 元素(垂直轴)之间的关系。这是一个直观的方法来说明输入元素的变化如何影响输出元素。

作者照片

总是从解释 X 轴和 Y 轴的含义开始。比如当 X ,Y ,而这个可以翻译成。这将最大限度地解释收件人对表。

技术想法、算法、编程有时可能会令人痛苦,但演示不一定会如此。把听众放在心上,并打算有效地传达你的想法,你的演讲将会很棒。

下次见!

自动化和编排数据管道的完美方式

原文:https://towardsdatascience.com/the-prefect-way-to-automate-orchestrate-data-pipelines-d4465638bac2?source=collection_archive---------9-----------------------

我正在将我所有的 ETL 工作从 Airflow 迁移到这个超级酷的框架中

从展开的插图

我是阿帕奇气流的忠实粉丝。即使在今天,我也没有太多抱怨。但是新的技术提督在许多方面让我感到惊讶,我忍不住将一切都迁移到它身上。

提督(和气流)是一个工作流程自动化工具。您可以编排单个任务来完成更复杂的工作。您可以管理任务相关性,在任务失败时重试任务,调度任务等。

我相信工作流管理是每个数据科学项目的支柱。即使是小项目也可以通过像 Prefect 这样的工具获得显著的好处。它消除了大量重复性任务。更不用说,它还消除了复杂项目中的思维混乱。

这篇文章涵盖了一些关于提督的常见问题。它包括,

  • 一个简短介绍提督的核心理念;
  • 为什么我决定从气流迁移;
  • 提督令人难以置信的特性和与其他技术的集成,以及;
  • 如何在其云和内部部署选项之间做出决定。

快速入门级。

完美是一个最小的和完整的工作流管理工具。设置起来非常简单。然而,它可以做一切工具,如气流可以和更多。

你可以使用 PyPI,Conda,或者 Pipenv 来安装它,它已经准备好了。关于这一点,请参见气流部分。

pip install prefect
# conda install -c conda-forge prefect
# pipenv install --pre prefect

在我们开始使用 Prefect 之前,让我们先来看一个非托管工作流。它使得理解完美在工作流管理中的角色变得容易。

下面的脚本查询一个 API (Extract — E),从中挑选相关字段(Transform — T),并将它们附加到一个文件(Load — L)。它包含三个功能,分别执行提到的每项任务。这是工作流管理工具的一个简单而日常的用例——ETL。

代码由作者编写。

该脚本从 OpenWeatherMap API 下载天气数据,并将风速值存储在一个文件中。现实生活中的 ETL 应用程序可能很复杂。但是这个示例应用程序很好地涵盖了基本方面。

注意:请用一个真实的 API 密钥替换它。你可以从 https://openweathermap.org/api 得到一个。

您可以使用命令python app.py运行这个脚本,其中 app.py 是您的脚本文件的名称。这将在当前目录中用一个值创建一个名为 windspeed.txt 的新文件。这是你到达空气污染指数时马萨诸塞州波士顿的风速。如果您重新运行该脚本,它将向同一个文件追加另一个值。

您的第一个完美的 ETL 工作流。

上面的脚本运行良好。然而,它缺少完整 ETL 的一些关键特性,比如重试和调度。此外,如前所述,现实生活中的 ETL 在单个工作流中可能有数百个任务。其中一些可以并行运行,而一些依赖于一个或多个其他任务。

想象一下,如果有一个临时的网络问题阻止您调用 API。该脚本将立即失败,无需进一步尝试。在实时应用中,这样的停机时间并不是奇迹。它们的发生有几个原因—服务器停机、网络停机、服务器查询超出限制。

此外,每次更新 windspeed.txt 文件时,您都必须手动执行上述脚本。然而,在 ETL 工作流中,调度工作流在预定义的时间间隔内在特定的时间运行是很常见的。

这就是诸如 Prefect 和 Airflow 等工具的作用。以下是如何调整上述代码,使其成为一个完美的工作流程。

代码由作者编写。

@task装饰器将一个常规的 python 函数转换成一个完美的任务。可选参数允许您指定其重试行为。在上面的例子中,我们已经将该函数配置为在失败之前尝试三次。我们还将其配置为每次重试延迟三分钟。

有了这个新的设置,我们的 ETL 对我们前面讨论的网络问题具有弹性。

要测试它的功能,断开你的计算机与网络的连接,用python app.py运行脚本。您将看到一条消息,提示第一次尝试失败,下一次尝试将在接下来的 3 分钟内开始。在三分钟内,将您的计算机重新连接到互联网。已经运行的脚本现在将完成,没有任何错误。

使用提督计划工作流。

重试只是 ETL 故事的一部分。许多工作流应用程序面临的另一个挑战是按照预定的时间间隔运行它们。对于任何 Python 程序员来说,Prefect 的调度 API 都很简单。它是这样工作的。

代码由作者编写。

我们已经创建了一个 IntervalSchedule 对象,它在脚本执行五秒钟后启动。我们还将其配置为以一分钟为间隔运行。

如果您使用python app.py运行脚本并监控 windspeed.txt 文件,您将每分钟在其中看到新的值。

除了这种简单的调度,提督的调度 API 提供了更多的控制。您可以用类似 cron 的方法安排工作流,使用带时区的时钟时间,或者做一些更有趣的事情,比如只在周末执行工作流。我没有在这里一一介绍,但是关于这一点,提督的官方文件是完美的。

完美的用户界面。

像 Airflow(和许多其他产品)一样,Prefect 也配备了一个具有漂亮用户界面的服务器。它允许您控制和可视化您的工作流执行。

插图由作者。

要运行这个,你需要在你的电脑上安装 docker 和 docker-compose。但令人惊讶的是,启动它只是一个命令。

**$** prefect server start

作者插图。

这个命令将启动完美服务器,您可以通过您的 web 浏览器:[http://localhost:8080/](http://localhost:8080/.) 访问它。

然而,仅仅依靠完美服务器无法执行您的工作流。它的作用只是为你所有的完美活动提供一个控制面板。因为这个仪表板与应用程序的其余部分是分离的,所以您可以使用 Prefect cloud 来做同样的事情。我们稍后将详细讨论这一点。

为了执行任务,我们还需要一些东西。好消息是,它们也不复杂。

因为服务器只是一个控制面板,我们需要一个代理来执行工作流。以下命令将启动一个本地代理。如果你的项目需要的话,你可以选择 docker 代理或者 Kubernetes 代理,而不是本地代理。

**$** prefect agent local start

插图作者。

一旦服务器和代理正在运行,您就必须创建一个项目并向该项目注册您的工作流。为此,将执行该流的代码行更改为如下所示。

代码由作者编写。

现在,在终端中,您可以使用prefect create project <project name>命令创建一个项目。然后重新运行脚本会将它注册到项目中,而不是立即运行它。

**$** prefect create project 'Tutorial'
**$** python app.py

作者插图。

在网络用户界面中,你可以看到新项目“教程”在下拉列表中,我们的风速追踪器在流量列表中。该流已经计划并正在运行。如果您愿意,也可以手动运行它们。

作者插图。

使用参数运行工作流。

我们在上一个练习中创建的工作流是严格的。它只查询马萨诸塞州的波士顿,我们不能更改它。这是我们可以使用参数的地方。下面是我们如何调整代码以在运行时接受参数。

代码由作者编写。

我们已经更改了函数以接受 city 参数,并在 API 查询中动态设置它。在流内部,我们创建一个参数对象,默认值为' Boston ',并将其传递给提取任务。

如果您在 UI 中手动运行风速跟踪器工作流,您会看到一个名为“输入”的部分。您可以在这里设置每次执行的城市值。

插图由作者提供。

这是运行工作流的一种便捷方式。在许多情况下,ETL 和任何其他工作流都带有运行时参数。

为什么我决定从气流迁移到提督?

Airflow 是一个非常棒的工作流管理平台。它在许多项目上为我节省了大量时间。然而,我们需要欣赏接管旧技术的新技术。气流和提督就是这种情况。

Airflow 做对了很多事情,但是它的核心假设从未预见到已经出现的丰富多样的数据应用程序。

—完善的文档。

如果你更喜欢气流,我在这里描述的不是死胡同。我们有解决大多数问题的方法。然而,它在 Prefect 中很方便,因为该工具本身就支持它们。

与气流相比,提督的装置格外简单。对于训练有素的眼睛来说,可能不是问题。然而,对于任何想要开始工作流编排和自动化的人来说,这是一个麻烦。

Airflow 需要一个运行在后端的服务器来执行任何任务。然而,在 Prefect 中,服务器是可选的。这是使用 Prefect 的巨大好处。我有许多喜欢的项目作为服务在我的电脑上运行。早些时候,我必须在启动时就有一个气流服务器。因为提督可以独立运行,我不必再打开这个额外的服务器。

Airflow 不具备使用参数运行工作流(或 Dag)的灵活性。我使用的解决方法是让应用程序从数据库中读取它们。对于如此简单的任务来说,这不是一种优秀的编程技术。提督的参数概念是在这方面的例外。

提督允许同一工作流有不同的版本。每次将工作流注册到项目时,都会创建一个新版本。如果您需要运行以前的版本,您可以在下拉列表中轻松选择它。这在气流中是不可能的。

提督还允许我们创建团队和基于角色的访问控制。每个团队都可以管理自己的配置。授权是每一个现代应用程序的关键部分,Prefect 尽可能以最好的方式处理它。

最后,我发现提督的 UI 更加直观和吸引人。Airflow 的 UI,尤其是它的任务执行可视化,一开始很难理解。

提督的生态系统以及与其他技术的整合。

Prefect 内置了与许多其他技术的集成。它消除了大量的开销,使使用它们变得非常容易。

实时项目经常需要处理几种技术。例如,当您的 ETL 失败时,您可能希望向维护人员发送一封电子邮件或一个 Slack 通知。

在提督,发送这样的通知是毫不费力的。您可以使用级长任务库中的电子邮件任务,设置凭证,然后开始发送电子邮件。

你可以在他们的官方文档中了解更多关于 Prefect 丰富的生态系统。在本文中,我们将了解如何发送电子邮件通知。

要发送电子邮件,我们需要让完美代理可以访问凭证。你可以通过在$HOME/.prefect/config.toml中创建下面的文件来实现。

代码由作者编写。

你的应用现在可以发送电子邮件了。下面是我们成功捕获风速测量值时发送通知的方式。

代码由作者编写。

在上面的代码中,我们创建了 EmailTask 类的一个实例。在启动过程中,我们已经使用了电子邮件配置的所有静态元素。然后在流内部,我们使用它来传递可变内容。

上面的配置将发送一封包含捕获的风速测量值的电子邮件。但它的主题将永远是“捕捉到新的风速”

完美的云与本地服务器部署。

我们已经了解了如何启动本地服务器。因为这个服务器只是一个控制面板,你可以很容易地使用云版本。要做到这一点,我们几乎没有额外的步骤。

  1. 创建一个提督云账号。
  2. 从 API 密钥页生成一个密钥。
  3. 在您的终端中,将后端设置为 cloud: prefect backend cloud
  4. 同样使用生成的密钥登录:prefect auth login --key YOUR_API_KEY
  5. 现在,像往常一样启动代理。prefect agent local start

在云仪表板中,您可以管理之前在本地服务器上所做的一切。

在云版本和服务器版本之间选择的一个大问题是安全性。根据 Prefect 的文档,服务器只存储与工作流执行相关的数据和用户提供的自愿信息。由于本地计算机中的代理执行逻辑,因此您可以控制存储数据的位置。

云选项也是适合性能的原因。使用一个云服务器,您可以管理多个代理。因此,您可以毫不费力地扩展您的应用程序。

最后的想法

Airflow 是我构建 ETL 和其他工作流管理应用程序的最终选择。然而,提督改变了我的想法,现在我把一切从气流迁移到提督。

Prefect 是一个简单的工具,可以灵活地扩展到超出气流所能做的范围。你甚至可以在 Jupyter 笔记本上运行它。此外,您可以将其作为一个完整的任务管理解决方案。

除了工作流管理的核心问题之外,Prefect 还解决了您在实际系统中可能经常遇到的其他几个问题。使用授权控制管理团队,发送通知就是其中的一些。

在本文中,我们讨论了如何创建一个 ETL

  • 根据配置重试一些任务;
  • 按计划运行工作流;
  • 接受运行时参数,并且。
  • 完成后发送电子邮件通知。

我们只是触及了级长能力的皮毛。我推荐阅读官方的文档以获取更多信息。

感谢阅读,朋友!看来你和我有许多共同的兴趣。我很乐意在 LinkedIn 、 Twitter 和 Medium 上与你联系。

还不是中等会员?请使用此链接 成为 会员。你可以享受成千上万的有见地的文章,并支持我,因为我赚了一点佣金介绍你。

数据中断的先决条件

原文:https://towardsdatascience.com/the-prerequisites-for-data-disruption-801ed5541c43?source=collection_archive---------35-----------------------

如何构建最强大的数据章节

安德烈·萨金塞夫在 Unsplash 上拍照

我们生活在一个世界以闪电般的速度前进的时代。有一天,我们在谈论那些收入数十亿、拥有全球专利和分销渠道的老牌公司,它们“大到不能倒”。接下来,世界上价值最高的 10 家公司中有 9 家都是数字公司,它们的前登月照片都是在登月前不到 10 年拍摄的。因此,今天我们都真正知道,要取得成功,关键是数字创新和数据颠覆。是的,我们也知道数据是“新的石油”。但是,关闭 BS 生成器,转而关注如何真正实现这一点,如何在这种数据中断中真正取得成功呢?不那么神奇的答案是,先决条件之一是数据本身的质量,以及能够管理、处理和开发数据产品的架构和平台。更动态的答案是,在机器完全取代人类之前(这不必太远),需要最合适的人的设置来充分实现这一潜力。在本文中,我们将详细介绍如何构建这样一个最强大的数据章节,它们应该基于什么,需要什么角色,需要知道什么,应该如何获取和组织它们以实现真正的数据中断。祝你好运。

1.战略目标

1.1.数字趋势

几年前,数据被宣布为世界上的新石油,然后是最重要的,也许是 T2 的 KSF,过去十年的全球独角兽,十个玉米和百年玉米,数字颠覆了所有传统公司——在所有旧行业中运营,现在被一些公司创造性地摧毁了,AdTech,MarTech,AgriTech,FoodTech,FinTech,InsurTech,EdTech,CleanTech,BioTech,MedTech 等等。这种颠覆的条件总是与新兴技术有关,如 AR 和元宇宙、区块链,最重要的是 AI 和 ML。

照片由本工程图在 Unsplash 上拍摄

所有这些都是由数据的质量和实时快速处理控制的。自 2020 年以来,这一切已经导致了一个高潮,即世界上增长最快的(迄今为止)第二强的数字国家的领导人金平总统去年宣布数据为“第五生产要素”——等同于劳动力、土地、资本和技术。

1.2.枢转价值

与此相一致,今天许多人所在的公司从将其他几个生产要素作为公司最重要的核心,到以最严肃的方式发展公司,其目标是,如果不是今天,那么至少明天将数据作为核心资产。

实现这一目标的战略关键之一是,我们开始将数据作为产品 (DaaP)来处理。即,不是作为众多其他功能的副作用,而是作为本身具有价值的产品,在极端情况下,不仅作为数据驱动的决策、服务和产品的推动者,而且作为纯粹具体的内在价值,甚至商业价值。

拥有一个能够为公司创造将数据作为核心资产(或至少是 DaaP)所需的所有条件的数字部门,是公司不仅能够在由创造性破坏重启的未来市场中生存,而且能够通过成为破坏而不是被破坏的一方而占据领先地位的前提条件。

在本文中,我们将解决数据破坏成功的先决条件,首先我们将了解公司的数字战略如何转化为数据战略、数据架构和合适的数据平台,然后是相关的数据团队来管理这些平台,并充分实现所开发战略的潜力。

2.战略手段

要取得成功,需要几件事情,不仅 a)组织良好的数据设置,具有 decom 传统、安全的数据源和干净的数据,而且 b)具有一致架构的现代数据策略,以及适合该架构的合适的技术和组织平台,以及 c)既能生成正确的数据、确保数据质量,又能将生成的数据转化为更多数据驱动的业务结果的数据团队。下面,我们将假设实际的清理工作已经完成,并更战略性地处理后两个问题。

2.1.数字战略

在一家公司就其愿景和将实现该愿景的战略达成一致后,数据战略、数据架构和数据流以数字语言构成了将战略转化为数据蓝图的数字相关翻译。

旧的 5 年战略计划或更具进化性的方法在今天的大多数行业中都不可行,在这些行业中,通常需要更具颠覆性的愿景,以实现其核心业务从模拟技术离线到数字技术在线的全面转型。我曾与四大洲三位数的公司在数字战略和创新方面合作过,我很少看到董事会和高管团队不知道,在一年左右的时间里,他们将失去数十亿美元的照常营业收入(BAU)。这个 BAU 需要被新的商业创新所取代,但很少有人真正认识到它是关于什么的——只是如果你不在这个完整的领域占据一席之地,别人会的。

为了帮助实现这个未来的、往往未知的数字香格里拉,这只不过是一个同样引人注目的成功战略。大多数旧的传统市场所面临的不进则退的局面,绝不能停留在数字发展上,以利用现有资产,但也必须创造全新业务的增长——在更戏剧性的情况下,要彻底改造整个行业,从而调整整个战略并重新启动运营。

很简单,基于一个更具创新性的战略,不仅着眼于如何与今天的竞争对手作战,也着眼于如何与明天的竞争对手作战,确保敢于发明真正的登月计划,不仅满足现有客户的现有需求,也满足明天客户的潜在需求。

作者图片

从积极的方面来看,除了一般的数字化之外,还有几种新兴技术——例如人工智能、增强现实和区块链等。,又名 EmTech),有可能帮助该公司应对这种更具攻击性的中断。如果这转化为一家公司的数字战略,这将意味着积极专注于应对外部压力和内部条件带来的挑战,包括客户战略、内容战略、渠道战略和数据战略。下面我们将讨论后者,我认为,在 2020 年,这是最致命的关键时刻。

2.2.数据架构

如果数字战略要转化为如何构建公司的架构以应对挑战,那么它至少是数字架构、平台阵容和组织中适应这一特定战略的戏剧性支点。

由于不知道您和您的公司在未来将拥有什么样的确切架构,通常至少会有一些关于数字战略的指导——在数字颠覆性市场中,这通常会转化为基于 DaaP 的数据战略以取得成功。

稍微取决于你的上下文条件,在架构上,这样的 DaaP 策略至少应该考虑到任何模块化构建的混合体,它们位于分散的数据网和单片数据湖【即。朝着领域驱动架构的方向发展,以实现最高的数据质量和创新,同时通过联合治理确保不同渠道之间的协同,等等。

就技术平台而言,这将意味着一个动态系统,既提供本地 ELT 管道作为自助服务系统,这由确保互操作性的标准中央平台来确保,又辅以各种 AI/ML 数据科学工具。

适合这种解决方案的组织将是本地管理与数据所有者之间的平衡,为了标准化、互操作性和创新,由集中管理但在本地分配的数据工程师和数据科学家来确保。下面将详细介绍这一点。

3.数据小组——三个最重要的角色

正如我们在上面看到的,数据中断的一个基本先决条件是数据本身的质量,而另一个先决条件是能够接收、存储、管理和处理这些数据的架构和平台。我们在上面得出的主要轮廓只能构成从数字战略中推导出的一个试验性假设——在向数据架构和组织模型的更细粒度版本发展的过程中被验证、证伪或调整。

但话虽如此,鉴于一家公司正在通过上述战略推导以及架构、平台阵容和组织的发展,往往最适合这样一种战略,我们不可避免地会遇到这样一个问题,即我们在一个数字化颠覆的行业中应该如何充分实现架构、平台和组织模式提供的数据条件。因为在机器完全取代人类之前(这不一定离人类有多远),最合适的人员设置将始终被要求充分实现累积的潜力。

下面,这些问题分为需要什么角色,他们的任务是什么,他们应该具备什么技能,然后是关于数量和成本的问题,以及如何以最佳方式管理和分配这样的团队。这些问题将在下面依次讨论。

但首先是角色,在一家公司中,至少需要三个与数据相关的角色,才能将数据发展到一定水平,这意味着数据可以真正成为公司的“核心资产”。

由阿斯德鲁巴卢娜在 Unsplash 上拍摄的照片

3.1.数据工程师

第一类是纯技术人员,即确保可以检索到正确数据的数据工程师。这可能是关于构建和管理公司可用的数据基础架构,包括选择数据库、硬件或云提供商,计算服务器的类型和数量,以及数据库和服务器需要什么软件。他们管理数据存储、使用,并监控数据如何工作以及谁在使用数据。作为指挥棒,可以提取数据或发布对某些数据的访问,这些数据将被传递到价值流的下一阶段进行分析或处理。

为了在这方面取得成功,数据工程师需要对计算机相关的基础设施有广泛的了解,一部分是关于存储和使用的硬件,一部分是关于数据库、计算、安装、可扩展性等的软件。背景通常是计算机科学或计算机技术或其他与基础设施相关的 IT 主题

3.2.数据科学家

第二个角色是纯粹的“分析”角色,其形式是数据科学家,他们将数据从原材料转换为成品,传统上是通过运行实验、提取和清理数据、分析数据,并将结果传达给组织内外的各种利益相关方。

这只是部分关于 历史 分析,稍微简单一些的部分以描述性数据(“报告”和仪表板)的形式出现,而纯粹的诊断性分析(探索性的)则是更多的数据驱动的决策洞察(可以由数据科学家处理,也可以由分析师处理,有时甚至是相对初级的分析师)。对于这家有 DaaP 雄心的公司来说,挑战主要是更具 未来感 性质的两个不同部分:

1)更加自动地预测客户、员工、供应商、经销商等各方的可能行为,以及规定的数据,这些数据的行动往往会产生各方对公司最有利的响应(例如,带有 NBA/NBO/NBC 等个性化预测的“大规模定制”。).

2)也许最先进的努力将是在数据方面实现公司的创新和产品开发,以及生成本身具有价值的丰富数据,它本身应该能够为公司产生具体的收入。

作者图片

后两个部分是真正的数据科学家之星的工作,为了取得成功,你必须不仅能够处理统计推断,而且能够处理高级预测模型——前者最好有统计学学位,但另外辅以在线课程,后者最好有适合 ML 的编程学位(例如 R/Python ),如果没有在线课程的话。

因此,您必须掌握高级数据分析,同时具备足够的技术知识,能够从数据库(如 SQL)中提取数据、清理数据、对数据进行统计分析和预测,并传达结果(包括可视化以及与管理层和“普通”人员的沟通)。这同样适用于流程的最开始阶段,能够进行对话,将利益相关方的挑战转化为具体的统计模型和实验。

由于数据科学仍然是一个相对“年轻的领域”,在学术方面没有完全的严谨性(在特定的“数据科学”方面,严格的教育相对较少,但至少数量在不断增加,但最重要的是,它们太新了,还没有时间培养出数量可观的毕业生),通常有两种不同类型的背景。

1)扎实的统计学家,学过一些编程。

2)扎实的程序员,学过一些统计学。

我个人在这两个类别中都遇到过令人敬畏的数据科学家,而我自己——作为前一组的一员,我可能有点偏见——可能会发现前者比后者(我更经常经历的是,后者需要分析师或策略师的指导,以避免陷阱,并能够为利益相关者建立良好的桥梁)中更多的明星例子。不过,我在后一个领域也发现了一大群真正的明星(当他们有更可靠的推论或补充了一些 MBA 内容时,这种情况并不少见)。尽管与今天的需求相比,供给很少(见下文),但我们必须庆幸两者都存在😊

丹尼尔·林肯在 Unsplash 上的照片

3.3.数据所有者

第三个角色可能是最“有趣”的,在这种情况下,预测的颠覆性市场中的数字战略表明需要混合数据架构,即在联邦级别将最佳与整体稳定性相结合,在域级别将数据网状动态性相结合,这就产生了对实际域中数据质量责任的完全不同的需求。

这意味着推出一种与领域相关的“数据所有者”,这在离线公司中很少见到,这很可能意味着向 DaaP 发展的飞跃。也就是说,他除了在各个领域的日常工作之外,还要确保我们符合监管要求和公司关于 GDPR/CCPA 等的政策。以动态的方式—对不同类型的数据进行不同安全值的信息分类,并基于该分类采取不同的措施。

但最重要的是,作为数据所有者,您要对域内生成的数据的质量承担起责任,一部分是在域中获取和存储的数据所需的清理和任何 DQM 方面,另一部分是在本地的任何 ELT 模式中正确处理数据,以及在最合格的模式中,作为公司利益相关者和数据团队的各种专家之间的桥梁,共同创建“数据支持产品”的角色。

就时间而言,这仅适用于特殊情况——即,在具有大领域的真正大的组织中——全职工作,但是职责被分配给领域中的某个角色。就能力而言,也没有必要——或者甚至不需要——让一名统计学家或工程师来承担这一职能,而是让一个了解每个领域的业务,并在分析方面有足够天赋的人来处理数据。

相反,主要优势将是了解数据如何与业务相关,什么时候不相关,什么时候有问题。最重要的是,除了对业务的理解之外,还可能是关于职责,对数据重要性的理解,以及确保其相关性和每种数据类型的质量。

4.您的新数据章节 2022 —招聘和领导流程

当谈到一家公司在三种不同的角色中需要多少人时,这取决于公司的成熟度,但我想说的是,在开始时,三件事是最重要的,即灵活的任命、开放的招聘和二维组织。

4.1.敏捷约会

首先,很少有理由采取大规模行动,而不是从一个较小的数字开始,这不是不可能的,包括一些亚军领导,然后做好准备,当你开始听到第一次抱怨他们的议程有多满时,就要改变。即使最终游戏的目标是一个成熟的数据团队,它也不是不可能的,它可能首先是几个数据工程师和一个集中的联合基础架构的队长,同时在他们的第一次迭代中将一些兼职角色分配给一个较小的域集。

与此同时,数据工程师的角色更多的是关于基础设施及其作为支持功能的角色(即,一旦基本需求到位,您不会因为采用 10 而获得比采用 3 更多的商业价值)。相反,在商业上最重要的是数据科学家的数量和质量。但在这里,无论最终结果如何,您也可以先小规模起步,然后针对不同的职能逐步增加,其中有人可能会将一半时间分配给几个领域,而另一半时间则专门用于更集中的数据创新。但这里的等式在商业上更简单。有了 10 名出色的数据科学家,您将(当基础设施和数据质量真正到位时)贡献 10 倍以上的价值。

4.2.开放获取

图片由 Burtch Works LLC 提供

第二个需要理解的重要事情是,这是一个不同类型的品种。你不是世界上唯一一个明白数据需要成为公司核心资产的人,高质量的数据专家是从这些资产中获取真正利益的炼金术士。

这当然是一个普遍的问题。总的来说,90%的高管正在他们的组织中经历技能差距,最主要的是我们在数字角色中看到的,在未来十年中,如果不能满足未来的技能需求,G20 国家可能会错过智能技术承诺的高达 11.5 万亿美元的累计增长。当然,这体现在我们的数字技术干将的工资和需求上。此外,除了健康、清洁技术和信息安全,对统计学家和数据科学家的最大需求将是 T2。

因此,在招聘数字明星时,不仅要记住一些具体的事情,尤其是对数据科学家来说,这显然是卖方市场,而且这个角色是如此的性感,价格甚至在海外爆炸。数据科学家,在某种程度上也包括数据工程师,是市场上非常抢手的关键资源。

这意味着几件事。部分原因是,你需要为他们或我们提供一些“性感”的东西,不仅作为一家公司,而且作为一个数据驱动的雄心和数据创新挑战。部分原因是它们确实需要成本——我有一些刚从科技大学毕业的明星,他们没有任何经验,与有经验的数字能力的平均工资相比,我不得不支付+ $40K +奖金。

部分原因是,不仅出于经济原因,而且出于质量原因,你经常不得不在西方世界的数字中心之外寻找——除了新毕业生,我所有的明星(有经验的)都是来自中国、越南、韩国或伊朗的移民专家(+20-40K v/s digitals)。部分原因是你可以或者应该考虑离岸(这些年来,除了印度,我在越南也有过,完全-!——上帝保佑,就结果而言,甚至比我在岸上的时候还要好一点。

图片由 Burtch Works LLC 提供

这也意味着一个人不一定,特别是在去元宇宙的途中没有后 covid 的情况下可能需要“办公室工作”。相反,这项工作通常是在独立于地方的情况下完成的,如果你想成功招募到真正的明星(也许没有太多空间支付真正明星的薪水),那么你在这里也必须有点自由。在一个密切的案例中,大约有 10 名陆上数据科学家,没有一个是在当地招聘的,甚至大多数陆上数据科学家偶尔在巴西、克罗地亚、西班牙或在家工作。

最后,这意味着基于以上所述,人们必须接受公司语言,至少对于数据来说,必须是英语(如果还不是的话)。你得到一个完全匹配的进口明星的时间比任何退休的研究行业的本地分析师都长,这是你以同样的价格最多能得到的。而且,即使你提高价格,就竞争优势而言,你与三个离岸明星的距离比你以同样的价格从一个昂贵的当地西方顾问那里得到的要远得多。

4.3.二维组织

第三件重要的事情是所有这些角色应该如何组织。这也是公司中产生的数据主架构的自然结果。将上述连续体作为一家公司主动或被动迈出颠覆性第一步的工作假设,我会说,一方面,该公司很有可能会或应该继续遵循 DDD 模式,在那里,该公司的数据科学家将在各个领域尽最大努力。

另一方面,同样真实的是,数据科学家通常是能够并且需要与众不同的人(有些人可能会称他们/我们为“怪人”),组织中并不总是有很多其他人理解他们或者对喝咖啡休息时谈论的相同事情感兴趣。这意味着,在我的世界里,将数据科学家组织在一起,有明显的社会和认知价值,有了解他们的领导和互动,可以帮助挑战和发展他们,但分配和“虚线”延伸到与业务理解相互促进的领域,产生“真正”改变数据的机会。

5.总结摘要

从整体上看,在一个颠覆性的市场中,除了引人注目的创新之外,不允许有任何其他东西,出于同样的原因,数字战略也需要将数据颠覆作为其核心,因此本文的主题对于在这样一个行业中活动的任何公司的未来来说,都是至关重要的。

在不知道贵公司的确切数据架构的情况下,参考在这样一个颠覆性市场中运营的公司所需的数字战略,至少给出了这种架构应该采取的方向的一些指示。稍加简化,更确切地说,是所有 DaaP 启发的混合体之一,可以在领域驱动的数据网格可能带来的动态性与联合数据基础架构可以提供的稳定性和确保的互操作性之间的连续体中找到。

这不仅关系到最合适的技术数据平台,还关系到哪种组织模式是成功实施这种颠覆性数字战略的最佳工具。简而言之,这将涉及一个二维的组织模式,在这种模式下,你一方面支持公司朝着 DDD 的方向发展,另一方面在当地进行管理,以确保知识和工作满意度方面的协同作用。

这种组织模型应该满足的三个角色是由一小队数据工程师组成的,他们在联邦级别上确保正确的数据标准的出现。除此之外,我们还增加了数量稍多的数据科学家,他们负责将标准化数据的原材料提炼为数据驱动的见解、数据支持的创新和产品,以及数据本身作为一项业务。最后,我们将这一点与数据所有者结合起来,他们在领域级别上确保业务相关的数据质量。

为了在前两者的招聘中取得成功,基于市场对人才的极度渴求,可以认为——除了上述二维组织模式之外——非常值得考虑灵活任命而不是大爆炸的可能性,以及在离岸、移民和远程工作可能性方面更开放的招聘。

完成所有这些后,你就成功地构建了一个模块,这个模块可能是在未来大多数市场中构成最重要的先决条件的最后一个模块,即:数据中断。

所以,祝你好运,另一边见😊

鲁弗斯·利德曼,电影。Lic。

图片由 Janne Naess 提供

Lidman 是著名的数字创新者和数据颠覆者,连续社会企业家和顶级技术影响者,拥有 50,000 名追随者。他拥有双学位和博士学位,并以数据科学为平台,是 IAB 的创始人,WFA 的数字顾问,拥有 300 多场讲座的知名演讲者,并在 100 多家公司担任数字战略和创新方面的任务,如三星、宜家、梅赛德斯、伊莱克斯、普华永道等。作为一名数字企业家,他已经经营了 6 家企业,拥有 2-3 个 ok 出口,包括访问量达数百万的网站和一些下载量超过 1500 万的全球最大应用。作为他的最新投资,他在瑞典联合创建了领先的数字人才收购公司 Digitalenta,并在新加坡创建了 EdTech PTE Ltd,利用领先的技术为新兴市场的贫困人口重新创造学习机会。除此之外,他还出版了 4 本书和世界上最大的数字战略学习应用,受到 165 个国家 20 万人的喜爱。

人工智能监管的现状和未来

原文:https://towardsdatascience.com/the-present-and-future-of-ai-regulation-afb889a562b7?source=collection_archive---------22-----------------------

播客

安东尼·哈巴耶布谈企业人工智能治理

苹果 | 谷歌 | SPOTIFY | 其他

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

人工智能的公司治理听起来不像是一个性感的话题,但对于依赖机器学习模型为客户提供价值的大公司来说,它正迅速成为最重要的挑战之一。人们越来越期望他们开发和实现治理策略,以减少偏见的发生,并增加他们的人工智能系统和开发过程的透明度。这些期望历来来自消费者,但政府也开始施加硬性要求。

因此,在今天的节目中,我采访了 Anthony Habayeb, Monitaur 的创始人兼首席执行官,这是一家专注于帮助企业预测和遵守新的和即将到来的人工智能法规和治理要求的初创公司。在过去的几年里,安东尼一直在密切关注人工智能监管的世界,并非常友好地分享了他对该领域目前状况和未来方向的见解。

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

  • 当谈到人工智能治理的最佳实践时,政府和公司不必从头开始想办法。已经有大量现有的监管和商业原则,大公司预计将应用于他们的运营,这些原则通常可以直接扩展到人工智能。例如,安东尼引用了 SOC 2,该认证要求公司证明他们拥有正确的人员、流程和技术控制,以降低关键系统被破坏(例如,数据泄露或网络攻击)的风险。围绕过程责任的规范,包括确保系统由不同的人构建和评估,也很容易推广到人工智能的情况。安东尼预计,在人工智能的背景下,这些类型的框架将对公司有用,可能还会得到政府的授权。
  • 安东尼认为正在出现的一个最重要的趋势是,政府期望公司开发人工智能的方式会留下证据,证明开发人员做出某些设计选择的原因,这些选择会影响他们系统的公平和偏见。安东尼不指望政府为此提出自己的偏见和公平定义(出于许多原因,政府没有这方面的专业知识),但他们希望公司能够证明,他们已经投入了一定的努力,用道德考量来换取绩效。
  • 所有的人工智能系统都有偏见。事实上,人工智能系统必须有偏见才能有用:根据定义,有用的模型是一种倾向于以不受随机机会支配的方式将某些输入与某些输出相关联的模型。真正的问题是我们将允许什么样的偏见——虽然这看起来像是吹毛求疵,但实际上最有趣的伦理问题存在于“我们想要的偏见”和“我们不想要的偏见”之间的模糊界限中。
  • 当算法中存在不必要的偏差时,很自然地得出结论,该算法不应该被部署。但重要的是要考虑账本的两边——如果我们决定不部署算法,我们可能会保留什么价值。这一价值可能很大,甚至对那些算法偏差和故障模式错误的人来说,这也是值得权衡的。

你可以点击这里在 LinkedIn 上关注安东尼,或者点击这里在 Twitter 上关注我。

章节:

  • 0:00 介绍
  • 1:45 安东尼的背景
  • 围绕监管的 6:20 理念
  • 14:50 政府的作用
  • 17:30 理解公平
  • 25:35 艾的公关问题
  • 35:20 政府监管
  • 42:25 对数据科学团队有用的技术
  • 46:10 人工智能治理的未来
  • 49:20 总结

电力的价格,第 1 部分

原文:https://towardsdatascience.com/the-price-of-power-part-1-805f512d4c94?source=collection_archive---------35-----------------------

得克萨斯州的零售电价:当“平均”歪曲

我饶有兴趣地阅读了《华尔街日报》今年 2 月 24 日的头版文章“在解除管制的情况下,德州电力账单增加了 280 亿美元。它承诺对德州零售电价进行“分析”。标题图及其标题(复制于此)似乎提供了一个明确的结论:放松管制的零售客户支付过高。

昂贵的电力

大约 60%的德州人必须选择零售电力供应商,他们支付的费用始终高于该州从传统电力公司购买电力的客户。

来源:《华尔街日报》对美国能源情报署数据的分析

然后,文章在该图中取差价(在其他地方定义为仅住宅用户的“平均”价格差),乘以通过零售提供商出售的能源量,然后 : 28 亿美元 (这听起来比同等价值的 26 美元/用户/月【192 个月平均 560 万用户】更令人印象深刻)。

嗯,作为一个经常在德克萨斯州以零售消费者的身份购买电力供应商产品的人,这些数字似乎… 高得令人怀疑 。例如,在我的记录中,我发现:

2018 年 8 月德州电力事实标签

而且,我有一堆从 2010 年开始的类似或更低价的唱片。我的 2018 年续约合同和其他合同似乎都大大低于文章中提供的“零售供应商”和“传统公用事业公司”的数字。这并不是说我利用了某种模糊的营销方案——每年,当我的合同到期时,我都会去 powertochoose.org 的 PUC 赞助网站,选择“12 个月,固定价格,已排序”,然后选择价格最低的供应商。这并不需要太多的脑力(虽然偶尔我会看到一些计划根据使用情况有不同的价格,所以不需要一些数学知识)。在任何情况下,我有一堆过去 10 年的这些'EFL'的类似结果,都低于这张图的 T10 两条线 T11。而且,我发现这个过程比购买其他家庭服务要容易得多,比如互联网服务提供商、保险、手机和流媒体服务。

我们将回答的问题分为两部分:

  1. 那么这些数据在哪里呢?我自己怎么分析?
  2. 谁是“传统公用事业”和“零售供应商”?从价格对比中可以了解到什么?这种比较的局限性是什么?
  3. “平均”价格是什么意思?文章在图表下方澄清道:“《华尔街日报》计算了全州公用事业和零售商的单独年度费率,方法是将每种类型的供应商收到的所有收入相加,然后除以其销售的千瓦时电。”所以这就是加权平均价格(零售商总收入除以零售商总销售额)。中的 加权集中趋势测量对典型客户体验的概括程度如何?为什么我的结果如此不同?
  4. 商业和工业客户市场(大约 2/3)发生了什么?为什么不是这个故事的一部分?
  5. 我该如何看待这 280 亿美元呢?从这些数据中还可以获得什么其他见解?

本文将重点讨论问题 1-3,后续文章将重点讨论问题 4-5。

揭秘:我是谁,我为什么要写这个?

因此,这在很大程度上是一个关于数据和使用一个汇总统计数据来代表一个动态和变化的市场的问题的故事。你不需要有能源方面的背景就能从这个分析中有所收获;尽管如此,这就是我的背景。过去十年左右,我一直是一名独立的能源顾问。之前,我从事批发电力交易和风险管理。作为一名顾问,我为零售电力客户做过项目[但也为银行、炼油商、石油交易商等做过项目]。但我的观点是:这里的观点完全是我自己的,这项工作与我的任何客户都没有关系,无论是过去的还是现在的。我写这篇文章是因为

  1. 我认为这些数据讲述了一个比描述的更有趣的故事,
  2. 这篇文章的作者没有公开他们分析的细节或[清理的]数据集,
  3. 这是一个使用 python、pandas 和 matplotlib 提取、清理和分析数据集的有趣练习。
  4. 我对促进公共数据的准确传播和分析感兴趣——这是一个很好的例子。

代码、格式、约定

支持本文的所有数据和代码都可以在 github [https://github.com/dkfurrow/eia-retail-analysis 1]上找到。如果你发现一个错误,或者有一个扩展,我会很乐意接受拉请求。所有代码都是 python(我用的是 3.83 版本,特别是 winpython 发行版)。python 文件是普通的*。py 格式(即它们不是 jupyter 笔记本)。我已经将代码分成了与 Spyder IDE 一致的“代码单元”。为了复制任何引用的分析,只需执行该块中的所有代码。最后,我在本文中有相当多的表格,我将它们作为 github 上的 gists 嵌入——点击嵌入的对象查看完整视图。

数据

这里的数据来源于能源信息署的表格 EIA-861 数据文件这里,为了方便起见复制到 github【1】。这些数据文件存在于一系列嵌入 zipfiles 的电子表格中,每年一个文件。在 zip 文件中,有一些电子表格,每个电子表格代表一个客户部门,如下所示:

记录的数据元素如下:

转换和清洗

提取 EIA 数据的脚本【2】太长,无法有效地摘录,所以我将简单地说明清理该脚本处理的数据的问题:

  1. 从 2007 年及之前,EIA 颠倒了收入和销售的顺序,如上表所示。
  2. 根据年份的不同,电子表格数据在不同的行上开始,但对于所有部门的情况,总是从阿拉斯加开始除了运输,从阿肯色州开始。
  3. 一些早期的电子表格有一个额外的第 8 列(“数据检查”),这里不包括。
  4. 一些州值显示为 Null,在这里被排除,同样所有收入、销售和客户都为零的行也被排除。

因此,一旦数据从压缩文件中提取出来,并按照上面的步骤进行修复…

  1. 我检查了 Rev/Sales = AvgPrc,这是真的,除了在某些情况下Ownership是‘其他’或‘在仪表后面’(还有Entity是‘调整’),在这种情况下AvgPrc是空的。我们这里的重点不是调整或仪表后的销售,所以我让数据保持原样。
  2. 根据Ownership还是【电力营销商】【零售供应商】添加了特征OwneshipType【Reg】或【DeReg】...看来这些年来术语发生了变化。
  3. 添加了特性YearCustClass(即'commercial', 'industrial', 'residential', 'transportation', 'all'),将整个数据集转换为“记录”格式,其中列'ValueType'表示收入、销售、客户或 AvgPrc,列Value表示数量,然后将整个内容保存到 parquet,以便在其他脚本中使用。

因此,在这一点上,我们有一个单独的Rev, Sales, Customers AvgPrc元素的记录表,650,900 行乘 8 列,Year 2004-2019:

这里能学到什么?

这是一套全面的收入、成本和客户数据,因此人们当然可以对销量、客户数量和收入(含隐含单价)进行分类(跨客户类别、所有权类型、实体、州)和时间(跨年度)比较。例如,你可以看看市场集中度或客户群的增长情况;这些数据有很多潜在的发展方向。

有哪些局限性?

与评论文章中引用的“全州价格相对于全国平均水平较高”必须归因于得克萨斯州解除管制的部门”相比,您最肯定的是不能仅从这些数据中明确评估监管制度或市场机制的有效性。最具体地说,这里没有关于以下方面的数据:

  1. 批发价格:你不能用通过(解除管制)批发电力市场获得的价格来标准化结果——这里没有这些信息。
  2. 分销或“电汇”费用:零售客户支付(规定的)费用来访问他们的(独特的)分销系统——该价值因客户而异,但在此捆绑在总价结果中。
  3. 发电和负荷特性(与上面有些关系)这里没有数据
  • 天气/负荷特性[无论监管选择或市场设计方案如何,更平坦、更容易预测的负荷应该更便宜]
  • 当地发电资产组合,例如当地公用事业公司是否拥有(廉价)水力发电?还是天然气发电[一种在 2004 年至 2019 年间价格会发生巨大变化的燃料]?电力公司的燃煤电厂是否经过擦洗,或者是否配备了SCR,如果是,该设施何时进入费率基础?是否有(非市场竞争的)资产仅仅是为了可靠性而维护的?
  • 客户是否可以选择(更昂贵的)可再生能源发电来代替化石能源,或者选择一个比平均成本更有利于稳定计费的计划。在德克萨斯州,这两种选择都意味着成本与收益的选择。

因此,重要的是要认识到数据的局限性,以及它能显示什么和不能显示什么。简单的价格分析是必要的,但不足以确定零售电力放松管制的影响。当我们回顾这一分析时,请记住这些警告。

那么,这些数据有哪些有用的初步发现呢?

我们将介绍一些基础知识:我们已经从 total 中提取了 Texas 记录,总共有 42,616 行。着眼于Customer值类型,我们有以下跨年度的计数【3】:

在本文中,我们将重点关注住宅组—稍后我们将讨论其他类。

“零售提供商”集团(我们的说法是“DeReg”)包括 158 个独特的名称…但在任何一年都是一个小得多的子集。这些数据不包括所有权,或任何唯一的标识符,所以我们无法跟踪名称的变化或通过所有权识别市场集中度。但是在任何情况下,我们都可以看到客户所观察到的供应商数量的增长。下面是随时间的计数【3】。

对于 2019 年(最新数据),我们可以根据客户规模对 68 家零售商进行分类,我选择的分类规模如下【3】:

客户总数:6,451,123

零售商总数:68

我们可以看到客户高度不对称地集中在几个大型供应商中。我们将回到下面主题。

随着时间的推移,“传统公用事业”群体当然更加稳定,但它们彼此之间几乎没有共同点;他们为 27 万平方英里的德克萨斯州的客户提供服务,他们是受监管的垄断供应商。它们跨越多种所有权类型、所有三大北美互联、多种气候以及资产所有权的类型/级别。2019 年,共有 139 个此类实体,分为以下类别【3】:

那么,我们来看看价格。

好吧,这个“平均”价格是多少?

所以我们可以直接从文章的 html 中复制文章数据(实际上我们之前已经这样做了——它是嵌入在文章源代码中的 json 数据)。
我们从简单开始:利用 pandas 数据透视表功能获得传统公用事业和零售提供商的简单平均值和中位数,并将文章数据与这些计算值进行比较。结果是:

所以马上,我们可以看到:

  1. 粗体显示的商品价值(加权平均值)显著高于(1)一般供应商的价格或(2)中等供应商的价格。
  2. 因此,零售供应商的销售价格分布必然明显倾斜。最近一年,加权平均价格比供应商价格中值高出 24%。相比之下,对于“传统公用事业”来说,这种差异是很小的。
  3. 我上面详述的 2018-2019 年固定价格合同现在更有意义了……低于中位数,但比文章的加权平均值更接近中位数。

我们肯定应该在这里做一个可视化…所有 6 行会有点忙,所以我们将放弃“简单平均值”值:【4】。

所以这让我们能更好地看到趋势。因此,我们在这里看到(1)零售供应商的中值价格在 2011 年左右跌破了“传统公用事业”的中值价格,并一直保持在该价格以下。(2)零售供应商的中值价格总是低于“加权平均值”,但对于最近的数据,这一差距有所增加。

我会断言,考虑到这些数据在集中趋势方面的显著差异,基本的数据透明度决定了前面的图表是应该出现在文章中的那张。当然,这样的陈述会让一个简单的叙述变得不那么清晰——出现不同的(我认为更有趣的)问题。

确认加权平均值

由于我们还没有确认我们正在审查相同的数据,良好的分析实践将是确认文章的加权平均值。利用 pandas pivot_table 和多索引功能,我们计算一个加权平均值,并与文章的值进行比较【4】。

我们基本上以加权平均值为基础…当然会降低到 0.1/kwh 的水平(1 mill )。

为什么我的结果与“平均水平”相差如此之大?

嗯,我们已经从目前完成的工作中明确地得到了一个线索…这个分布是高度倾斜的。为什么?时间一个条形图,我们来看看 2018 年的成绩【4】。

因此,拥有最多顾客的零售商也收取最高的价格。但是这里有 66 家零售供应商,其中大多数的定价都比加权平均价格好得多。(其中许多公司提供的价格远远优于市政、合作或投资者所有的公用事业公司的平均价格)。

顺便说一句,公平地重复一遍:在一个不受监管的市场中,简单的价格可能不是唯一的问题…例如,客户可能重视绿色能源,并愿意为此付费。例如,公司提供“稳定账单”计划,即 12 个月的绝对账单总额保持不变——这是一种保险形式。最后,消费信贷是捆绑的——在我上面的 EFL 案例中,有隐性融资——我在淡季借钱给我的供应商,我的供应商在旺季借钱给我。

那么,图表右侧的那些大型供应商是谁【4】?我们将按客户规模排序:

这并不奇怪…最大的两家是达拉斯和休斯顿地区的传统监管零售提供商的零售部门,它们推动了价格分布的倾斜。(另请注意 Green Mountain —不一定与其他公司具有可比性,因为他们的产品是绿色能源,而不是其他地方的大部分系统销售)

总结一下,我们从商业媒体上的一篇文章开始,在这篇文章中,作者使用电力市场的子部分加权平均价格图来描绘一个巨大的、引人注目的美元成本,归因于“去监管化”。在这里,我演示了如何提取数据,并提供了更详细的分析。我希望这一分析表明,用简单的加权平均计算来概括市场状况是不恰当的,这种市场状况在很大程度上只是传统提供商留住客户的一个假象具体来说,根据条形图【4】,我们有一大群客户以更高的价格(2.7 毫米,平均 12.8/千瓦时)继续使用现有产品,还有一大群客户选择了价格更低的替代供应商(3.6 毫米,平均 9.9/千瓦时)。德州住宅零售电力数据的一个更现实的视图表明,从传统提供商(尤其是最近几年)转换的客户获得了明显的好处,与那些传统提供商相比与“传统公用事业”相比(如上所述的比较注意事项)。总之,那些选择基于价格购物的人有机会这样做并省钱——数据清楚地证明了这一点。数据还显示了选择继续使用传统提供商的成本。这里可能有重要的政策教训,积极的或消极的(例如,客户教育、限制传统提供商市场支配地位的措施等)。但是,从该分析中可以清楚地看出,仅使用加权平均值来汇总这些数据并不能真实反映市场现实,因为市场中供应商的选择是多种多样的,并且会随着时间的推移而不断变化。

最后,数据和代码被发布,因此您有机会自己决定这个分析的适当性,创建一个扩展或替代。我希望这篇文章和相关的 github repo 提供一些有用的示例代码,这些代码是关于如何使用 python、pandas 和 matplotlib 来清理、处理、分析和可视化这些数据的。

在下一篇文章中,我们将考虑德州电力零售市场的其他行业,并对这里讨论的住宅零售市场做一些更深入的分析。

参考文献

  1. 主代码库:github.com/dkfurrow/eia-retail-analysis
  2. EIA 数据的提取/清理: eia_retail_extract.py
  3. 受管制/解除管制客户的特征: article_scratchpad.py
  4. 主要分析,可视化: eia_retail_analysis1.py

电力的价格,第二部分

原文:https://towardsdatascience.com/the-price-of-power-part-2-ebbe22b0ce07?source=collection_archive---------34-----------------------

德克萨斯州的零售电价:在上下文中分析整个市场

这是第二篇对德州零售电价进行评论和分析的文章,以回应《华尔街日报》最近的文章“解除管制后德州电费上涨了 280 亿美元”在的第一篇文章中,我们讨论了与使用集中趋势的“加权平均”度量来表示住宅电价的高度偏斜分布相关的问题。在本文中,我们将讨论前面提出的最后两个问题。

  1. 《华尔街日报》的文章只报道了住宅价格。商业和工业客户市场(大约 2/3)发生了什么?为什么不是这个故事的一部分?
  2. 我该如何看待这 280 亿美元呢?从这些数据中还可以获得什么其他见解?

代码、格式、约定

和以前一样,支持本文的所有数据和代码都可以在 github 1 上找到。如果你发现一个错误,或者有一个扩展,我会很乐意接受拉请求。所有代码都在 python is 中,我们大量使用了 pandas 多索引功能以及 matplotlib 。

为什么只关注住宅市场?

回想文章的标题图[ 2 ],转载如下:

昂贵的电力

大约 60%的德州人必须选择零售电力供应商,他们支付的费用始终高于该州从传统电力公司购买电力的客户。

所以这是住宅价格的加权平均。我们在上一篇文章中讨论了统计谬误使用加权平均值来代表高度扭曲的价格分布中的典型消费者。给你。我们将要谈论摘樱桃。住宅市场肯定不是零售市场的主要部分,其他市场也不是与普通消费者的关注无关。能源信息机构将市场分为住宅、商业、工业和交通部分。运输部门相对较小且专业化,因此我们在此将重点关注前三个部门,这三个部门的销售额记录如下[ 3 ](注意零售供应商的简写DeReg,传统公用事业的简写Reg)。

值得注意的是:

  1. 尽管业内的一般经验法则是每个细分市场的销售额的 1/3,但您可以观察到,对于“传统公用事业”(市政公用事业、合作社和受监管的投资者所有的公用事业),住宅细分市场主导着它们的服务负载
  2. 对于“零售供应商”而言,负荷增长更快,与“传统公用事业”提供的负荷相比,商业和工业负荷在“零售供应商”负荷中所占份额更大。

为什么消费者应该关心商业和工业定价?

我们列出三个主要原因:

  1. 当地商业电价是消费者为当地商品和服务(如干洗店、牙医诊所、杂货店、政府服务)支付的每笔账单的组成部分。
  2. 有竞争力的商业和工业电价是当地经济健康发展、就业增长和服务质量的重要组成部分。
  3. 最后,如果开始比较“传统”公用事业和“解除管制”市场之间的价格差异,重要的是包括所有部分,因为管制模式有交叉补贴的趋势。在缺乏市场力量(通常也缺乏透明度)的情况下,受监管的电价至少在某种程度上变成了的政治问题。只考虑一个细分市场会忽略交叉补贴的潜在影响。

如果我们分析整个市场,而不仅仅是住宅市场,会发生什么?

分析:我们重复上一篇文章中的图表,显示其他两个细分市场的加权平均供应商价格中位数;因此,该面板中有 3 个图表,固定窗口大小为 7/kwh,但选择了不同的端点来反映数据范围。这种可视化设计产生了以下[ 3 ]:

我们的评论首先指出,住宅价格通常高于商业价格,而商业价格又通常高于工业价格,这是我们所预期的,原因在于:

  1. 客户负荷的波动性、形状和天气敏感性。
  2. 管理、结算和计费成本。
  3. 消费者或企业信贷成本(这些成本对于固定价格合同尤为重要)。

如果我们检查加权平均与中间供应商价格的关系,我们也注意到零售供应商价格与“传统效用”的关系,我们观察到以下情况。

  1. 在数据集的时间跨度内,零售供应商价格不会低于“传统公用事业”价格的唯一价格系列是住宅部分的加权平均价格。所有其他领域,无论是比较供应商中值还是加权平均价格,随着时间的推移,零售供应商的价格都低于“传统公用事业”的价格,住宅领域供应商中值价格也是如此
  2. 仅关注零售供应商领域[‘DeReg’图形标签】我们观察到加权平均价格和供应商价格中值之间存在显著差异的唯一领域是住宅领域——对于其他两个领域,这两个指标的追踪更加紧密。
  3. 我们在“传统公用事业”商业客户中发现了显著的价格偏差,但与“零售供应商”住宅价格分布相比,这种价格偏差指向了相反的方向。因此,虽然中值住宅零售供应商的客户支付的费用远低于加权平均值,但中值商业供应商的客户支付的费用却要高得多。

我们在上一篇文章中研究了住宅客户的价格分布;在这里,我们将深入探讨商业客户的价格分布。让我们看看 2010 年的分布,在此期间,我们看到解除管制的商业价格开始急剧下降[ 3 ]:

对于零售供应商(上图),我们看到两个主要的传统供应商(TXU 和 Reliant),价格也远高于中值或加权平均价格。对于受监管的实体,我们看到少数大型公用事业公司(如圣安东尼奥市、西南公共服务、奥斯汀市、Entergy Texas)的价格较低。但这 144 家公用事业公司中的中等供应商的客户在价格方面表现不佳:举两个例子,德克萨斯州泰勒[距离奥斯汀 35 英里]的平均价格为 11.28 美元,而奥斯汀能源公司的客户支付 8.98 美元。自由城从 Entergy Texas 系统获得电力,但其价格为 11.15 英镑,而 Entergy 自己的客户为 6.94 英镑。同样,在比较这两种监管制度时,使用加权平均值进行比较会产生失真的结果,并遗漏了许多价格与加权平均值相差很大的客户。

但是这个图表提出了一个很好的问题——看看上面的图表:零售供应商的加权平均值是怎么回事?传统提供商的大量高价客户似乎没有像我们预期的那样增加加权平均值。答案当然是,按销量计算的加权平均值是,这张图表显示的是按客户计算的定价但是与住宅相比,商业客户在数量上的差异要大得多;因此,如果我们按量来看价格,我们可以看到正在发生的事情:

将此图与之前的图进行比较:

  1. 在零售提供商领域,我们看到数量相对较少的大客户群转向了非传统提供商,从而使数量加权平均价格和供应商价格中值相对接近,尽管传统提供商保持了大量小客户。**
  2. 在传统的公用事业领域,我们看到价格较高的公用事业拥有相对大量的小客户

这个练习的目的是强化中的信息:电力的价格,第一部分;对零售供应商和传统公用事业公司之间价格差异的分析的结果高度依赖于所选择的集中趋势的度量。我们已经讨论并展示了使用数量加权平均价格和供应商价格中位数的影响,但还有其他潜在的衡量标准;例如,可以通过客户数量而不是数量来加权平均值,或者使用客户的中间价格(与中间价格提供商相对)。我们在此认为,供应商价格中值是比数量加权平均值更好的选择,因为价格分布(无论如何加权)存在显著的偏斜,并且因为分析的目的仅仅是比较高度不同情况下的监管模型:

  1. 快速增长的零售提供商空间,客户可以在传统提供商和新进入者之间进行选择,所有这些提供商都在一个共同的批发市场中运营,以及
  2. 增长较慢的传统公用事业空间,在位置、气候、批发市场、实体类型(市政、合作、投资者拥有的公用事业)和规模方面高度多样化。

因此,这种情况需要一个中间值,但是哪个中间值?在这里,供应商价格中值更具代表性——在上面的图表中,TXU 的零售供应商价格中值为 13.19,奥斯汀能源公司的传统公用事业价格中值为 8.98。因此,对于零售提供商领域,在新进入者获得足够的市场份额之前,传统提供商服务于中间客户。因此,我们再一次回到了供应商中位数,它是我们的最佳(但仍不完美)衡量标准。这里重要的部分是权衡的讨论:任何对中心趋势(或其他统计度量)的选择都应该伴随着有力的讨论和分析。

我们通过隔离精选住宅部分的影响来结束这一部分,以比较定价:使用评论文章的加权平均方法——如果将整个市场考虑在内,上面的标题图会如何出现?[ 3

因此,总而言之,获得评论文章引人注目的标题图和 280 亿美元标题数字的唯一方法是(1)使用加权平均价格衡量标准 (2)仅选择住宅市场,以便获得零售提供商似乎提供持续较差替代方案的价格系列。

如果我们分析整个市场并使用供应商价格中位数会得到什么结果?

比较如上所述的中间价格差乘以零售商销售量,得出以下以美元计价的条形图(记住这里的惯例是传统公用事业价格减去零售商价格 ) 3 :

因此,这篇评论文章使用了相同的过程来计算标题中的“280 亿美元”价值(价格差异乘以销量),但在这里,我们的结果有很大不同。在上图中对时间求和得出:

因此,通过使用供应商中值价格对比整个零售市场,我们计算出一个几乎与文章中断言的完全相反的结果,我们发现一个趋势,表明在该分析的时间跨度内,解除管制的住宅和商业客户的收益不断增加。更重要的是,在这里我们改进了文章标准,清楚地陈述了我们的假设及其背后的含义,并公开了我们的分析和数据集

我们分析完了吗?

我们在这里(以及在评论文章中)的分析缺乏上下文。十亿美元可能会成为一个不错的标题,但就对普通消费者的影响而言,这个数字没有任何意义。因此,让我们添加上下文!首先,在此研究期间,典型的月账单是什么样的?对于零售供应商领域的客户,我们对多年的平均月消费总量、总账单和单价进行汇总,得出以下结果 3 :

这张图表给出了上述单价图的背景。将条形图(以十亿美元计,如上)重新绘制成一个计算每月账单影响的条形图,得出以下结果[ 3 ]:

现在我们有了一个有意义的结果;我们知道中间价格差对每月客户账单的价格影响,以及这些客户的平均账单——简而言之,上下文。

从这些数据中还可以获得什么其他见解?

在消费者教育和潜在的其他政策影响方面,最有趣的见解可能是消费者与传统供应商合作的成本。我们在本文和之前的中多次提到这一点;在这一部分,我们将量化成本。

谁是遗产提供商?

我们的第一个任务是识别数据中的遗留公司,我们马上会遇到一个实际问题,即我们的数据缺少通用的公司名称和母公司标识。天真地在Entity字段中搜索“TXU”和“信心”,我们找到[ 3 ]:

检查这些实体的销售和持续时间,我们发现一些似乎是有限持续时间的特殊目的提供者。除去这些,我们将遗留提供商定义为以下任何一种,以每年获得一个信赖实体和一个 TXU 实体[ 3 ]:

因此,现在我们希望将这些提供商的价格与众多非传统提供商的价格进行比较。一个有趣的方法是用盒须图(每个图底部的金色非遗提供者的数量)[ 3 :

我们在传统提供商的这些销售量的背景下检查这些单价:

我们看到:

  1. 传统提供商的价格几乎总是超过提供商的中间值,并且始终超过第 75 百分位提供商。
  2. 令人不安的是,在过去几年中,住宅传统供应商的价差相对于中位数有所增长(尽管传统市场份额有所下降)。

这可以说是这个数据集中最重要的故事:与上面讨论的“传统公用事业”的反事实不同,这里我们有证据表明一群客户持续处于价格劣势,但他们完全有能力做出不同的选择。我们可以像以前一样量化这个选择的影响;从传统销量乘以中间差价开始(传统-非传统)[ 3 ]:

跨年度汇总,我们有以下以十亿美元计的总影响:

和以前一样,我们根据美元/客户月来估计计费影响:

摘要:在这个由两篇文章组成的系列文章中,我们研究了德克萨斯州的零售电价,这是对流行商业报刊上一篇研究相同数据的文章的评论的一部分。我们发现使用加权平均值作为该数据集中趋势的衡量标准存在问题,使用零售市场(住宅)的子集而不是分析整个市场也存在问题。我们提出了一种替代分析来纠正这些缺陷,并扩展该分析来检查数据揭示的一个可操作的问题,即拒绝从传统提供商转换的客户所支付的持续高价格。

下一步:我写这些文章的目的是(1)展示比我在评论文章中看到的更好的分析实践,(2)提供与数据一致的替代分析,以我自己作为德克萨斯电力市场 12 年住宅零售客户的个人经验为例,以及(3)强调能源信息管理局零售价格数据集用于消费者和政策用途。我计划通过给德克萨斯公共事业委员会写信来跟进这个分析,敦促他们在他们面向消费者的网站 powertochoose.org 上使用这个数据集。PowertoChoose.org 已经发布了零售供应商的消费者评论,而市场参与者的历史价格表现的发布将是互补和直接的。我鼓励身为德克萨斯州居民的读者加入到我的倡议中来——这个数据集影响着消费者的决策,它是由纳税人出资维护的公共数据集,而且数据似乎没有得到充分利用——解决方案是更广泛地发布它,让消费者受到更好的教育。我希望其他感兴趣的读者可以利用这些数据在其他地区进行适当的分析。

参考

  1. 主代码库:github.com/dkfurrow/eia-retail-analysis
  2. 文章图转载:wsj _ graph _ reproduction . py
  3. 主要分析,可视化: eia_retail_analysis1.py

概率 Deutsch-Jozsa 量子算法

原文:https://towardsdatascience.com/the-probabilistic-deutsch-jozsa-quantum-algorithm-b01a6c7c4b31?source=collection_archive---------29-----------------------

利用量子位的概率性质

量子机器学习要不要入门?看看用 Python 动手量子机器学习。

在之前的一系列帖子(“量子优势的例证”和“改进 Deutsch 和 Jozsa 量子算法”)中,我们看到了第一批量子算法中的一个,它被证明比其经典算法快得多。大卫·多伊奇开发了这种算法,后来和理查德·乔萨一起推广了这种算法。

这些算法都是关于确定输入函数是常数还是平衡的。首先想到的类比是硬币。

作者图片

硬币可能被欺骗,因此总是落在一边。或者,这可能是公平的,降落在任何一方的可能性相等。

Deutsch 的第一个算法只包括两次投掷。后一种概括考虑任意次数的投掷。但是大 但是 来了:它假设平衡函数在一个特定的边界内是平衡的。例如,如果边界是两个(如在 Deutsch 的第一个算法中),那么该算法假设一次投掷导致正面朝上,另一次导致反面朝上。

这个假设是不现实的。因此,Deutsch 和 Jozsa 将该算法推广到任何投掷次数。

那么,如果我们说边界是四呢?一枚公平的硬币会恰好两面落地两次吗?也许是的。也许不是。如果你看到四次同一边呢?你能确定这枚硬币是被骗的吗?

八次投掷怎么样?一百次投掷怎么样?一枚公平的硬币能连续一百次落在同一边吗?

不管你说什么数字,你都不能肯定地说硬币被骗了。如果一枚被骗的硬币总是产生相同的结果,而一枚公平的硬币以相同的概率落在两边,你永远不能确定这枚硬币是被骗的。当你看到双方至少一次,你就知道这是公平的。但当你反复看到同一面时,只会强化你对一枚被骗硬币的信念。但这并不确定。

这个问题很主观。就看你自己决定什么时候不折腾了。

那么,我们为什么不创建一个量子电路,产生一个硬币是公平还是欺骗的客观评估?

与 Deutsch 和 Jozsa 的算法相似,我们的算法由四部分组成:叠加态量子位、预言、分离算法和测量。

作者图片

我们从第一个简单的量子比特开始,叠加态的量子比特。每次抛硬币我们使用一个量子位。假设我们有三次投掷,因此三个量子位代表这些投掷。

我们用哈达玛门把它们叠加起来。因为奇斯基特在|0⟩状态初始化量子位,哈达玛门把它们放在|+⟩.状态在这种状态下,量子位被测量为 0 或 1 的概率相等。

在我们的电路中,我们使用一个辅助量子位。我们把它放在|−⟩.我们通过应用一个 X 门和一个哈达玛门来实现这一点。在这种状态下,量子位被测量为 0 或 1 的概率是相等的。但是这个州在相位上与|+⟩不同。虽然相位并不影响我们测量量子位的值,但当我们对量子位应用门时,它确实很重要。例如,哈达玛门将|+⟩态的一个量子位变回|0⟩态,将|−⟩态的一个量子位变回|1⟩.态

考虑到这一点,我们来看看神谕。量子先知不是一个提供预言的神秘人。它是转换门的占位符。

与前一篇文章类似,我们没有为一枚公平的硬币使用一个整体的神谕,而为一枚被欺骗的硬币使用另一个。虽然这甚至会使剩下的工作变得非常简单,但我们需要知道当我们选择正确的甲骨文时,硬币是公平的还是被欺骗的。但这是我们还不知道的。对硬币进行分类是我们量子电路的首要目的。我们不希望算法依赖于只有在我们已经知道解决方案的情况下才能创建的先知。

因此,我们分别处理每一次投掷的硬币。从 Deutsch 和 Jozsa 的算法中,我们知道如何使用受控非门将量子位从|+⟩翻转到|−⟩.当受控非门对处于|1⟩状态的控制量子位的目标量子位应用 x 门时,它也对控制量子位应用目标量子位的相位。我们把这种现象称为相位反冲。

因此,对于每一次正面朝上的投掷,我们应用一个受控的非门,将辅助量子位作为目标。因为这是在|−⟩,它不改变它的状态。X 门通过 X 轴反映量子位状态。但是由于|−⟩位于这个轴上,x 门对目标量子位没有影响。

但是受控非门影响代表投掷的控制量子位。它改变了它的相位,因此,它变成了|−⟩.状态

对于每一次正面朝上的投掷,我们应用哈达玛门。

我们创建一个助手函数来为我们创建 oracle。

例如,下面的电路描述了头-尾-头的初始化和预言。

作者图片

下一幅图表示迄今为止连续三个头的电路。

作者图片

与最初的算法相反,我们没有使用另一系列的哈达玛门将量子位带回基态。取而代之的是,我们将辅助量子位带回到|0⟩态,我们应用一个三重受控非门,用抛量子位作为控制,辅助量子位作为目标。

作者图片

如果所有的量子位都代表正面朝上(它们处于|−⟩状态),当所有其他量子位也处于|1⟩状态时,我们将辅助量子位翻转到|1⟩。当我们运行电路时,我们看到这种状态的概率是 1/2 =1/8=0.125。这是硬币公平的确切概率,给出了连续三个头的证据。

作者图片

不准确是由于我们使用的模拟的经验性质。

当一次投掷显示为反面时,三重受控非门不适用,因为我们应用哈达玛门的量子位处于|0⟩.态然后,辅助量子位停留在代表公平硬币的|0⟩状态。因此,我们总是将辅助量子位测量为 0。

作者图片

挑战 :我们要辅助量子位的状态 |1⟩ 来代表硬币公平的概率。我们需要如何改变电路?

然而,我们的电路并不完整。如果所有三个量子位元都代表向上抛,我们目前测量的辅助量子位元也是 0。这将意味着一枚公平的硬币。但它更有可能是一枚被骗的硬币。

因此,我们在电路中增加了一个元件。在这一部分的最后,我们还想应用一个三控制非门,用三个抛量子位作为控制,辅助量子位作为目标。

因此,我们需要将处于|0⟩状态的量子位(代表尾数向上)放入|+⟩状态,因为我们测量|+⟩状态的量子位为 1/2 的情况。如果所有三个量子位都处于这种状态,三控制非门适用于 1/2 的情况。

同时,我们需要将处于|−⟩状态(代表抬头)的量子位放入|0⟩状态,这样,如果单个量子位处于该状态,三重受控非门就完全不适用。

我们通过对每个量子位应用一个 Z 门和一个哈达玛门来实现这些转换。

Z-gate 将抬头量子位从|−⟩转回|+⟩,但它对|0⟩.状态的尾数量子位没有影响接下来的哈达玛门将|+⟩的抬头量子位变成了|0⟩,将|0⟩的尾数量子位变成了|+⟩.结果,我们把代表朝上抛的量子位变成了|+⟩,把代表朝上抛的量子位变成了|0⟩.当所有三个量子位都代表尾朝上状态时,三重受控非门在 1/2 的情况下将辅助量子位置于|1⟩状态。这是给出连续三条尾巴的证据的公平硬币的概率。

作者图片

让我们用一个连续代表三条尾巴的神谕来运行电路,看看结果。

作者图片

同样,我们看到公平硬币的概率约为 0.1250.125。

但是,一旦在电路中有一个单挑投掷,三重控制非门不适用一个控制是在|0⟩.

作者图片

当有正面朝上和反面朝上的投掷时,我们知道我们有一枚公平的硬币。

结论

Deutsch 和 Josza 的算法告诉我们如何使用相位反冲来翻转量子位,使其从|+⟩变成|−⟩.

然后,他们巧妙地创建了一个电路,利用这个微小的差异来确定一个函数是平衡的(公平硬币)还是恒定的(欺骗硬币)。

然而,他们假设平衡函数在特定的边界内是平衡的。但这是一种不必要的简化。量子位本质上是概率性的。正如我们所见,我们可以用它们来表示在给定证据的情况下,公平硬币的概率。

当我们经典地思考时,我们希望我们的程序是确定性的。我们提供一些清晰的输入,并期待一个明确的输出。然而,我们生活的世界并不是决定论的。我们的量子电路也不是。

因此,量子电路自然适合我们处理的日常问题。但是我们太习惯于把我们的问题放在一个确定性的框架中,以至于错过了这项令人兴奋的新技术提供的机会。

最后,还有改进的空间。当我们的电路包括正面朝上和反面朝上的投掷时,我们确信硬币是公平的。然后,我们总是把辅助量子位测量为 0。

但是当我们的电路只包括一次投掷时,测量量子位为 1 表示硬币是公平的。当然,我们希望用相同的测量值来代表硬币的公平性。

你能相应地编辑电路吗?

量子机器学习要不要入门?看看 用 Python 动手量子机器学习。

免费获取前三章点击这里。

对称矩阵性质及其应用

原文:https://towardsdatascience.com/the-properties-and-application-of-symmetric-matrice-1dc3f183de5a?source=collection_archive---------2-----------------------

带几何解释

对称矩阵是沿对角线对称的矩阵,这意味着 aᵀ= a-矩阵的转置等于其自身。是一个具有自伴性质的算子(把一个矩阵想成一个算子,研究它的性质,确实是一件大事)。虽然我们不能直接从对称性中读出几何性质,但我们可以从对称矩阵的特征向量中找到对对称矩阵最直观的解释,这将使我们对对称矩阵有更深刻的理解。

图片来自 Unsplash

一个简单的例子是单位矩阵。一个重要的例子可能是这样的:

对称矩阵的一个例子

然而,尽管定义如此简单,但它们有很大的概率,并且意味着很多事情。在本帖中,我们将看看重要的属性,直观地解释它们,并介绍它们的应用。

埃尔米特矩阵是对称矩阵的复数扩展,这意味着在埃尔米特矩阵中,所有元素都满足

定义 0.1

对称矩阵就是厄米矩阵,其共轭转置与自身相同。因此,它具有对称矩阵的所有性质。

埃尔米特矩阵的一个例子

在这篇文章中,我们将主要讨论真实的情况,对称矩阵,为了使事情变得简单一点,在数据科学中,我们主要遇到具有真实条目的矩阵,因为我们正在处理真实世界的问题。

对称矩阵最重要的性质

本节将介绍对称矩阵的三个性质。它们被认为是最重要的,因为它们涉及这些矩阵的特征值和特征向量的行为,这是区分对称矩阵和非对称矩阵的基本特征。

物业 1。对称矩阵有实特征值。

这可以很容易地用代数方法证明(一种正式的、直接的证明,与归纳、矛盾等相反)。).首先,快速获取特征值和特征向量。矩阵 A 的特征向量是应用 A 后方向不变的向量。方向不变,但矢量可以缩放。这表明了这一性质的非平凡性——实特征值给了我们线性变换中拉伸或缩放的信息,不像复特征值没有的“大小”。

向量缩放的比例是特征值,我们用λ表示。因此,我们有关系式 Ax = λx(方程式 1.1)。证明相当简单,但是有一些线性代数的重要知识,所以我们还是会一步步来

从这里开始,我们通过 x、xᴴ的共轭转置得到方程 1.1

等式 1.2

我们如何继续前进?需要注意的一点是,λ是标量,这意味着涉及λ的乘法是可换的。因此,我们可以把它移到 xᴴ的左边

等式 1.3

xᴴx 是欧几里德范数(或 2-范数),它被定义为

等式 1.4 2-标准

在二维欧几里得空间中,它是带有坐标(x₁,…,xₙ).)的向量的长度我们可以将等式 1.3 写成

等式 1.5

由于共轭转置(算符 h)的工作方式就像普通转置(算符 t)一样,我们可以利用 xᴴA = (Ax)ᴴ.)的性质

等式 1.6

(Ax)ᴴ等于什么?这里我们将再次使用关系式 Ax = λx,但这一次(Ax)ᴴ将留给我们λ的复共轭,我们用杠表示它λ。

等式 1.7

我们以前在等式 1.3 中见过 xᴴx,在 2-范数中代入后(我们可以这样做,因为λ_bar 和 xᴴx 都是标量),我们得到

等式 1.8

这导致λ和它的复共轭相等

情商。1.9

只有在一种情况下,方程 1.9 才有效,即λ为实数。这样我们就完成了证明。

房产 2。对应于特征值的特征向量是正交的。

证明也是直接的形式证明,但是很简单。首先,我们需要认识到我们的目标,这是如下

等式 1.10

考虑一个对称矩阵 a,其中 x₁和 x₂是对应于不同特征向量的 a 的特征向量(我们需要这个条件的原因将在稍后解释)。通过特征值和对称矩阵的定义,我们可以得到以下方程

等式 1.11、等式 1.12

现在我们需要逼近方程 1.10。让我们试着把 x₁和 x₂放在一起——我们乘以(Ax₁)ᵀ乘以左边的 x₁ᵀ:

等式 1.13

在等式 1.13 中,除了对称矩阵的性质之外,还使用了另外两个事实:(1)矩阵乘法是结合的(向量是 n 乘 1 的矩阵)(2)矩阵标量乘法是可交换的——我们可以自由移动标量。因为点乘是可交换的,这意味着 x₁ᵀx₂和 x₂ᵀx₁是一样的东西,我们有

等式 1.14

其中 x₁∙x₂ 表示点积。如果λ₁ ≠ λ₂,那么必然是 x₁∙x₂ = 0,这意味着这两个特征向量是正交的。如果λ₁ = λ₂,有两个不同的特征向量对应于同一个特征值(这是可能发生的,想想对手的例子——单位矩阵)。由于特征向量在(A-λI)(记为 N(A-λI))的零空间中,当一个特征向量对应多个特征向量时,N(A-λI)具有大于 1 的维数。在这种情况下,对于这些特征向量,我们有无限多的选择,我们总是可以选择它们是正交的。

显然,存在实矩阵具有复特征值的情况。这发生在旋转矩阵中。为什么会这样呢?设 Q 是一个旋转矩阵。我们知道特征向量被 Q 应用后不改变方向,但是如果 Q 是旋转矩阵,x 怎么可能不改变方向,如果 x 是非零向量?结论是特征向量一定是复数。

二维空间中的旋转矩阵 R(θ)如下所示。

旋转矩阵

R(θ)将向量逆时针旋转θ角。它是具有复数特征值和特征向量的实矩阵。

房产 3。对称矩阵总是可对角化的。(谱定理)。

这也和对称矩阵的另外两个性质有关。这个定理的名字可能会令人困惑。事实上,矩阵的所有特征值的集合称为谱。同样,我们可以这样想:

特征值-特征向量对告诉我们,在给定的线性变换之后,向量在哪个方向上是失真的。

如下图所示,经过变换后,在 v₁方向上,这个数字被拉长了很多,但在 v₂方向上并不太多。

图 1.15

可对角化的矩阵意味着存在对角矩阵 d(对角线之外的所有元素都是零)使得 P⁻ AP = D ,其中 p 是可逆矩阵。如果一个矩阵可以写成 A = PDP⁻的形式,我们也可以说这个矩阵是可对角化的。

分解通常不是唯一的,但是直到 D 中对角线上的元素的排列和 p 中特征向量的标量乘法才是唯一的。我们还需要注意,对角化等价于寻找特征向量和特征值,不管矩阵是否对称。然而,对于非对称矩阵,D 不必是正交矩阵,

这两个定义是等价的,但是可以有不同的解释(这种分解使得矩阵的幂非常方便)。第二个,A = PDP⁻,告诉我们如何分解 a,同时,第一个,P⁻ AP = D,告诉我们 a 可以对角化。它告诉我们,可以将标准基(由单位矩阵给出)与特征向量对齐。这是通过特征向量的正交性实现的,如属性二所示。

这种“将标准基与特征向量对齐”听起来非常抽象。我们需要思考这个:矩阵变换对基做了什么?由基α = {v₁,…,vₙ}(那些向量在列中)组成的矩阵将向量 x 从标准基变换到由基α形成的坐标系,我们用 Aα表示这个矩阵。所以在对角化 P⁻ AP = D 的过程中,p 从标准基向特征向量发送一个向量,a 对其进行缩放,然后 P⁻将向量发送回标准基。从矢量的角度看,坐标系与具有特征矢量的标准基对齐。

图 1.16 基础的对齐

这种排列如图 1.16 所示,本例中使用的矩阵为

等式 1.17

其中 V 是以长度为 1 的特征向量为列的矩阵,每个特征向量对应于对角矩阵中的特征值。至于计算,我们可以让 Matlab 中的eig来做。

这个性质直接遵循谱定理,它说

如果 A 是厄米的,则存在由 A 的特征向量组成的 V 的标准正交基,每个特征向量都是实数。

该定理直接指出了对称矩阵对角化的一种方法。为了直接证明该性质,我们可以在矩阵的大小(维数)上使用归纳法。详细的证明可以在这里找到。

这个证明的最基本的想法是:基本情况,其中 A 是一个接一个的矩阵,是微不足道的。假设 n-1 乘 n-1 矩阵是可对角化的(有 n-1 个独立的特征向量),我们可以在 n 维空间中找到另一个与那 n-1 维特征向量正交的特征向量。因此,n 乘 n 矩阵也是可对角化的。

矩阵的定性

那些属性什么时候有用?甚至在矩阵的正式研究之前,它们已经被用于求解线性方程组很长时间了。将矩阵视为运算符,线性方程的信息存储在这些运算符中,矩阵可用于研究函数的行为。

除了对称,矩阵更好的特性是正定性。如果一个对称(或埃尔米特)矩阵是正定的,那么它的所有特征值都是正的。如果它的所有特征值都是非负的,那么它就是一个半定矩阵。对于一个正定的矩阵来说,由于性质 1,要求它是对称的是显而易见的,因为只有当它是实数时,询问一个数是正还是负或者它有多大才有意义,如前所述。

特征值、特征向量和函数行为

一个很好的应用是海森矩阵,我们将以此为例演示如何使用矩阵来分析函数行为。当我们试图寻找一个局部极值时,发现 Hessian 是正定的总是好消息。海森矩阵是由一个实函数的二阶偏导数组成的矩阵。形式上,让 f: ℝⁿ ➝ℝ是一个函数,黑森定义为

Def 2.1Hessian(紧凑表示)

我们称 H(x)为 f 的 Hessian,它是一个 n 乘 n 的矩阵。在 Def 1.18 中,黑森被写得非常简洁,这和

Def 2.2 黑森

这对函数行为有什么影响?我们将看一个超级简单的例子。考虑函数 f(x,y)= y-x。Hessian 计算如下

等式 2.3

也可以使用 Matlab 中的函数hessian来计算。因为它是一个对角矩阵,迹(对角线上的元素之和)等于特征向量之和,我们可以立即看到其中一个特征值是 2,另一个是-2。它们对应于特征向量 v₁ = [1,0]ᵀ和 v₂ = [0,1]ᵀ.这个矩阵是对称的,但不是正定的。因此,在整个ℝ上不存在局部极值,我们只能在点 x=0,y=0 上找到一个鞍点。这意味着在 v₁方向,特征值为正,函数增加,但在 v₂方向,特征值为负,函数减少。该函数的图像如下所示

图 2.4

该图像是使用 Matlab 生成的,代码如下

clc; clear; close allxx = -5: 0.2: 5;
yy = -5: 0.2: 5;[x, y] = meshgrid(xx, yy);zz = x.^2 - y.^2;figure
mesh(x, y, zz)
view(-10, 10)

现在我们翻转符号,把函数改成 f(x,y) = x + y,特征向量不变,但所有特征向量都变成正的。这意味着,在 v₁方向和 v₂方向,函数都在增长。因此,可以找到局部最小值—在 x=0,y=0,f(x,y) = 0。这也是全球最小值。图表看起来像

图 2.5

总结

矩阵在许多领域都有广泛的用途。在处理矩阵时,经常会遇到正定、特征向量、特征值、对称矩阵等概念。在这篇文章中,介绍了对称(厄米)矩阵的三个最重要的性质,它们与矩阵的特征向量和特征值有关。这些性质解释了几何,但一些代数证明也包括在内。最后,介绍了一个用矩阵分析函数行为的例子。

资源:

[1] Weisstein,Eric w . .埃尔米特矩阵。来自 MathWorld——一个 Wolfram 网络资源。

[2] 对称矩阵,访问 2021 年 9 月 19 日

[3]霍恩,R. A .,&约翰逊,C. R. (2012 年)。 矩阵分析 。剑桥大学出版社。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72130.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

TowardsDataScience-博客中文翻译-2021-八十-

TowardsDataScience 博客中文翻译 2021(八十)原文:TowardsDataScience Blog 协议:CC BY-NC-SA 4.0AWS 胶水上的火花 MLlib原文:https://towardsdatascience.com/spark-mllib-in-aws-glue-1416b3b5ffe6?source=collection_archive---------23-----------------------机器学…

牛逼!5K star! 推荐一款集监控和埋点于一体的前端性能监控工具!开源、简单易用、功能强大!

在互联网的快速发展下,网站已成为企业和个人展示信息、提供服务的重要平台。然而,随之而来的网站性能问题也日益凸显,如加载速度慢、频繁出错、服务器故障、数据异常、网络攻击等。如何确保用户能够快速稳定地访问网站成为了一个亟待解决的问题。 为了帮助大家解决这一问题,…

TowardsDataScience-博客中文翻译-2020-一百二十九-

TowardsDataScience 博客中文翻译 2020(一百二十九)原文:TowardsDataScience Blog 协议:CC BY-NC-SA 4.0什么是机器学习?—直观的解释。原文:https://towardsdatascience.com/what-is-machine-learning-a-visual-explanation-14642b90429f?source=collection_archive---…

什么是泰森多边形?

世界各地的雨量分布存在着巨大的差异,即使是方圆百米内也可能出现东边日出西边雨的情况。那么科学家们是如何根据气象站的降雨数据计算各个地区的平均降雨量的呢?让我们一起来了解在计算平均降雨量中运用到的泰森多边形吧! 1911年,荷兰气候学家Thiessen根据离散分布的气象…

忘记网站密码,该怎么办呢?一招教你解决

忘记网站密码时,通常可以按照以下步骤来尝试找回或重置密码:访问登录页面:前往您需要登录的网站,并找到登录界面。查找“忘记密码”链接:在登录界面通常会有一个“忘记密码”、“找回密码”或类似的链接。输入注册邮箱或手机号:点击“忘记密码”后,系统会要求您输入注册…

C#-新增一列删除按钮

实现: 给查询出来的数据添加一列"删除按钮(delete Button)" 查询接口新增deleteButton:// 创建一个按钮列DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();btnColumn.Name = "deleteButton";btnColumn.Text = "删除";b…