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

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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

我们到底为什么要关心量子计算机?

原文:https://towardsdatascience.com/why-do-we-care-about-quantum-computers-at-all-403dd6191c2b?source=collection_archive---------5-----------------------

量子优势的秘密证据

量子机器学习要不要入门?看看 动手量子机器学习用 Python

据称,量子计算机可以做经典计算机做不到的事情。我们称之为量子优势的现象。然而,即使是科技巨头也对追求它感到绝望。为什么谷歌、IBM、微软和其他公司像驴子一样,鼻子前挂着一根胡萝卜?

作者图片

这都是他的错!好吧,不全是。但是很多。1994 年,彼得·肖尔提出了他著名的量子算法,该算法比任何已知的经典算法都要快。它引起了学术界以外的许多兴奋,因为现代加密建立在这样一个事实上,即需要数千年才能找到一个任意大数的质因数。如果我们能在几分钟内分解出这样的数字,基于质因数的加密就像纸牌搭的房子一样倒塌了。

作者图片

显然,我们还没有经历过这种天启。肖尔的算法不适合在今天的实践中证明量子优势。请确保没有人可以阅读您的加密邮件。也许除了国家安全局。原因很简单,Shor 的算法需要数以百万计的纠错量子位来分解我们正在讨论的数字。最先进的量子计算机大约有 100 个量子比特。而且,这些也容易出错。

作者图片

所以,我们的秘密暂时还是安全的。然而,在实践中证明量子优势的竞争已经白热化。2019 年,谷歌报告他们的 53 量子位量子设备“Sycamore”在几分钟内解决了一项任务,这项任务需要今天最强大的超级计算机数千年才能完成。

量子计算机开发的主要竞争对手 IBM立即提出反对。他们认为他们的经典超级计算机可以在 2.5 天内完成同样的任务。如果你问我,在几分钟内解决一个超级计算机需要几天的任务仍然是非常令人印象深刻的。然而,这不是我们所说的量子优势。

如此超乎寻常的期待从何而来?

量子优势并不意味着微弱优势。相反,这意味着量子计算机的速度远远超过了经典计算机。但是,我们为什么会这样期望呢?换句话说,为什么量子计算机要比经典计算机快?

对量子计算机优于经典计算机的主要解释是,我们可以在指数数量的状态叠加中制备量子比特。然后,量子算法同时计算所有可能的输入。

听起来不错。然而,这看起来很有趣。而且,不幸的是,描述往往到此为止。如果量子计算机可以并发计算指数数量的状态,为什么我们没有到处看到它们?我的意思是,有了 53 个量子比特,我们可以一次性计算出 2^53=9,007,199,254,740,992 态。

好了,我们可以看到期望从何而来。但是,问题出在哪里呢?

为什么他们都在努力利用量子计算机的优势?

另一个流行的解释是基于计算复杂性理论的机制来确定量子计算机的优势。复杂性理论是对运行算法所需的计算工作的研究。让量子计算如此强大的是它所实现的算法。量子算法可能表现出与经典算法不同的复杂性特征。

例如,加法的计算量是 O(n)。这意味着两个数相加的工作量随着数的大小(位数)线性增加。乘法的计算量是 O(n)。努力随着数量大小的平方而增加。据说这些算法在多项式时间内是可解的。所以,属于 P 类问题。

但是这些问题相对简单。相比之下,解决因式分解问题(寻找一个 n 位数的质因数)的最佳经典算法是 O(e{n{1/3}}).算法这意味着努力随着位数的增加而呈指数增长。

你想尝一下吗?太好了!试着不用计算机解决下面的因式分解问题。

  • 找出数字 21 的质因数。
  • 找出数字 221 的质因数。
  • 找出数字 2231 的质因数。
  • 找出数字 22523 的质因数。

我很肯定你会很容易地解决第一个任务。也许,你马上就想出了解决办法。当你处理第二个问题时,试着数一数尝试的次数。

你可以从 11x13=143 开始。那太低了。然后,你算出 17x19=323。那太高了。那么,13x17 怎么样?这就是 221——解决方案。试了三次。

你可能需要更多的尝试来找到 2231 的因子。而且,我相信你根本找不到 22523 的那些。

让我们改变一下,考虑一个多项式任务。

  • 将 3 乘以 7。
  • 用 17 乘以 13。
  • 将 23 乘以 97。
  • 用 223 乘以 101。

同样,你会发现每个任务都比前一个难。但是你甚至可以用纸和笔解决最后一个问题。

这就是 O(e{n{1/3}}(因式分解)和 O(n)(乘法)复杂度的区别。不可小觑。虽然你的智能手机可以在几秒钟内将 800 位数字相乘,但在超级计算机上,这种数字的因式分解需要大约 2000 年。

这种复杂性生动地说明了我们对量子计算机的期望。量子霸权的竞赛仍在继续。

最近,在 2021 年,一个中国团队声称他们的量子计算机“祖冲之”在一个小时内解决了一个传统上需要八年才能解决的问题。相当惊人。

然而,我们在日常生活中并没有体验到量子优势的影响。那是因为有一个圈套!“无花果树”和“祖冲之”解决的任务是为了展示量子计算机的优越性。除此之外,这些问题没有什么实际意义。我们仍在等待有人演示用量子计算机解决相关问题。

但是为什么用量子计算机解决相关问题如此困难呢?

如果你不厌其烦地计算上面的例子,你会注意到乘法是因式分解问题的结果。因此,有趣的是,因式分解的复杂性呈指数增长。但是如果你知道解,你可以在多项式时间内验证它是正确的。然后,我们说整个问题具有非确定性多项式(NP)复杂性。

因此,虽然对候选人的评估简单明了,但复杂性源于从呈指数增长的候选人中选择正确的答案。这就是量子优势的第一个解释发挥作用的地方。请记住,量子计算机可以同时评估的状态数量随着量子位的数量呈指数增长。

通俗地说,我们把非确定性多项式复杂度中的“非确定性”去掉。而且,多项式复杂的任务很容易解决。但这种移除并不像听起来那么容易。这是一项具有挑战性的任务。

作者图片

有许多已知的 NP-hard 问题,如布尔可满足性问题、旅行推销员问题或最大割问题。开发一种利用潜在量子优势的算法需要对问题及其特定复杂性的来源有深刻的理解。

例如,彼得·肖尔知道傅立叶变换运算是一种寻找频率的好工具,它对解决因式分解很有用。他真正的成就是发现了量子傅立叶变换。

但是我们不能用同样的技术去解决其他 NP 难的问题。我们需要精明的领域专家,他们对问题和量子算法的特殊性有足够的理解,以发现如何解决它们。

显然,这是一个复杂的问题。

量子机器学习要不要入门?看看 动手量子机器学习用 Python

在这里免费获得前三章。

为什么 Power BI 有四个安全级别?

原文:https://towardsdatascience.com/why-do-we-have-four-levels-of-security-in-power-bi-7bc53e7d5729?source=collection_archive---------1-----------------------

当您开始使用 Power BI 时,数据安全可能不是第一个话题。但是,当你开始钻研这个话题时,它就变得非常令人困惑。让我们来了解一下 Power BI 中的安全特性。

照片由 Klugzy WugzyUnsplash 上拍摄

介绍

Power BI 是收集数据并呈现给受众的一个很好的工具。但是,当您开始考虑数据安全性时,您会发现 Power BI 提供了四种不同的安全功能来保护您的数据。

但是为什么我们需要四个地方来改变设置以控制数据安全呢?

事实证明,每种设置都针对不同的区域。

我们有:

  • 超级查询中的隐私级别
  • Power BI 中的行级安全性(RLS)
  • Office 365 敏感性标签
  • Power BI 工作空间安全性

这些设置中的每一项都有助于以不同的方式保护您的数据。这些主题有大量的网络资源。我将添加这些资源的链接,而不是重写或复制那里的内容。

那么,让我们来看看每一个。

超级查询中的隐私级别

在这四种机制中,这是权力查询中最难理解的机制之一。

这个特性是关于管理从一个系统到另一个系统传递数据的可能性。

当您从关系数据库加载数据时,可能会发生查询折叠。这意味着可以将 Power Query 转换翻译成 SQL 代码并传递给源数据库。

现在假设您从两个数据库中获取数据。一个数据库包含敏感数据,例如,关于雇员或客户的个人数据。

假设您希望根据包含敏感数据的数据库中的数据来过滤不包含敏感数据的数据库中的数据。您可能希望避免将敏感数据从一个数据库传递到另一个数据库。

隐私级别有助于您管理这种情况。

当您在源上设置正确的隐私级别时,您可以禁用查询折叠,并且不同的源之间不会共享敏感数据。

您可以在首次使用源时设置隐私级别,例如,当您想要合并两个源时:

图 1 —第一次使用时的隐私级别(图片由作者提供)

您可以随时在“数据源设置”对话框中更改隐私级别:

图 2 —更改隐私级别(作者提供的图片)

以下是关于此主题的更多详细信息的链接:

微软关于隐私级别的文档

alpha bold 对隐私级别的简短解释

克里斯·韦伯的完整描述(查看他的系列文章,在这篇博文中链接了详细的隐私等级)

我强烈建议查看可用的级别,并根据数据源进行设置:

  • 公共,为来自互联网的数据
  • 组织,用于内部数据源
  • 私有,用于带有敏感数据的数据

不要使用 None 来避免不必要的副作用,比如在数据源之间传递数据。

Power BI 模型中的行级安全性(RLS)

行级安全性(RLS)控制谁有权访问数据模型中的哪些数据。

Power BI 的这一特性在社区中得到很好的记录和理解。

此功能有三种形式:

  1. 带有电子邮件地址的查找表
  2. 父子关系
  3. 动态 RLS

带有查找表的最简单的形式如下例所示:

1.您的模型包含一个带有用户列表的表。该列表包括每个用户的电子邮件地址:

图 3 —带有电子邮件地址的查找表(图片由作者提供)

在本例中,每个用户都有一个对实体的引用,以控制对现有实体的访问。

2.您必须启用查找表来过滤由数据模型中的列 EntityId 引用的表:

图 4 —数据模型(作者提供的图片)

我们需要双向交叉筛选,以便 EmployeEntity 表能够对 DimEntity 表进行筛选。
此外,关系必须启用“双向应用安全过滤器”选项。该选项激活 RLS 过滤器到事实表的传输。

3.配置 RLS 角色

图 5 —配置 RLS 角色和表达式(图片由作者提供)

您可以单击建模功能区中的“管理角色”按钮来获得对话并设置角色。然后,您需要创建一个角色,并给它一个有意义的名称。

之后,您必须选择要在其上编写过滤条件的表,并将该条件作为 DAX 表达式输入。

我们使用 USERPRINCIPALNAME()函数将实际用户的电子邮件地址与表中的用户列表进行比较。

4.测试 RLS 角色

现在,您可以通过单击“作为角色查看”按钮来测试角色:

图 6 —测试 RLS 角色(图片由作者提供)

您可以选择角色以查看 RLS 角色对您的影响,或者输入另一个用户的邮件地址以查看 RLS 角色对该用户的影响:

图 RLS 权限的影响(图片由作者提供)

您可以通过单击报告右上角的“停止查看”按钮来停止 RLS 测试模式。

使用父子层次结构,您可以为可以查看其下属的所有数据的上级以及具有父子层次结构的类似方案设置访问权限。您可以通过使用 PATH() DAX 函数和 RLS 过滤器来实现这一点,该过滤器使用 LOOUPVALUE()或 PATHCONTAINS()函数来授予适当的访问权限。

您可以阅读文章动态行级安全性与组织层次结构权力 BI 了解更多详情。

或者你可以从“伦敦商业分析集团”YouTube 频道观看这个 YouTube 视频,它解释了同样的方法:

动态 RLS 最难理解,对性能的影响也最大。

查看这些参考资料,了解更多详细信息:

当上面显示的两种方法都不足以满足需求时,您需要动态 RLS。
例如,您的用户需要访问基于其他表的数据,例如地理区域或业务单位的分配。

但是,RLS 的设置并不止于此。

将报告发布到 Power BI 服务后,您需要配置对 Power BI RLS 角色的访问。

您可以在数据集的上下文菜单中访问此设置:

图 8 —设置数据集安全性(图片由作者提供)

在那里,您可以将用户添加到 RLS 角色:

图 9 —向 RLS 角色添加成员(作者提供的图片)

此步骤将用户分配到特定的 RLS 角色。

在用户未被分配 RLS 角色之前,用户无权访问具有 RLS 的 Power BI 报告中的数据。

你可以观看 YouTube 频道“立方体中的家伙”的视频,了解更多关于这个话题的信息:

敏感性标签

敏感标签是由 Azure 和微软 365 admins 控制的功能。

管理员可以在您的组织中启用数据保护并创建敏感性标签,以控制强制加密并限制在租户内外分发信息的能力。

此功能可能会产生额外费用,具体取决于您的 Microsoft 365 订阅级别。

管理员配置标签和策略后,您可以在 Power BI 报告上添加敏感度标签。

例如,敏感性标签可以限制 Power BI 报告中的分发能力。

敏感度标签的一个重要功能是,当您用标签标记 Power BI 报告时,相同的标签会应用到使用 Power BI 中的导出功能创建的 Office 文件。

敏感标签是一个巨大的话题。我不能在本文中更详细地讨论这个主题,因为我没有访问管理门户的权限。因此,我不能配置这个特性并彻底测试它。

我鼓励你看下面这个来自“立方体中的家伙”的关于这个话题的视频:

请访问微软关于 Power BI 中灵敏度标签的文档,了解更多信息。

工作区安全性

最后但同样重要的是,您可以在 Power BI 服务中配置对工作区的访问。

您可以在 Power BI 服务中创建工作区。默认情况下,几个月前在 MS Teams 中创建团队时,微软已经禁用了 Power BI 工作区的自动创建。

你可以在这里阅读微软关于创建工作空间和授予成员访问权限的文章:在 Power BI 中创建新的工作空间。

每个工作区有四个角色:

  • 管理员
    管理员可以在工作区做任何事情
  • 成员
    每个成员都可以在工作区中添加任何内容并更改大多数设置。成员可以添加具有成员角色的其他用户,并且可以添加贡献者和查看者。
  • Contributor
    该角色的成员可以向具有 Contributor 角色的工作区添加报告和数据集。但是,只要管理员没有将此权限委托给用户,他们就不允许更改 Power BI 应用程序。
  • 查看器
    查看器存在于你有高级能力的时候。观众可以访问任何内容,即使没有专业许可证。但是他们不能改变任何事情。

在微软文档中,您可以在 Power BI 的新工作区中的角色列表中查看完整的权限列表。

您需要将角色分配给用户、Windows 组甚至微软 365 组,包括微软团队中的团队。

有权访问工作区的每个用户都可以与不是工作区成员的其他用户共享工件。可能的权限包括数据集的构建权限和报告共享权限。

Power BI 应用程序在某种程度上处于工作空间之外,不受工作空间安全性的控制。如这里的所述,你可以配置对你的 Power 应用程序的访问,这超出了用户对你的工作空间的访问权限。

结论

Power BI 中的每个安全级别涵盖一个特定的领域。

  • 工作区安全性控制对已发布工件(如数据集和报告)的访问。
  • RLS 控制用户对报表中数据的访问。
  • 超级查询源的隐私级别保护敏感数据在数据源之间的传输。
  • 当在公司内外移动数据时,敏感级别控制着可以对机密数据做什么。

我们所有人都需要知道如何处理工作空间的安全性。这是第一层保护。

一旦我们需要控制哪个用户可以访问报告中的哪些数据,我们就需要知道如何使用 RLS。

当避免在数据源之间共享潜在的敏感数据时,Power Query 中的隐私级别通常被低估。您需要了解查询折叠的后果,以及如何使用隐私级别来保护您的数据。

管理员通常控制敏感标签,您需要知道在什么情况下可以使用哪个标签。如果您不知道标签的用途,请向您的安全官索取有关可用标签的文档。如果敏感度标签按钮被禁用,则您可以忽略此功能,因为您的组织中没有设置此功能。

我希望这篇文章有助于理解 Power BI 中可用的安全特性以及如何使用它们。我建议通过上面提到的链接来了解每个特性的更多信息。

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

为什么增加 k 会减少 kNN 中的方差?

原文:https://towardsdatascience.com/why-does-increasing-k-decrease-variance-in-knn-9ed6de2f5061?source=collection_archive---------4-----------------------

思想和理论

直觉、证据和经验结果

我不想写一篇关于 kNN 如何工作的一般性文章,而是想清楚地解释为什么增加 k 会减少方差。这是因为我自己也在网上苦苦寻找过令人信服的答案,也见过很多人问这个问题。尽管这些知识对于使用模型来说并不必要,但我相信,对于模型如何处理不同数据的基本理解对于解释它们的结果是至关重要的。我希望这篇文章能传达这个信息,最重要的是,激发你并鼓励你将这种思维方式应用到其他问题上!

kNN 和符号的快速复习

kNN 是一个分类算法(也可以用于回归!稍后将详细介绍),它通过查看给定点 x_testk 最近的邻居(即最接近它的点)来学习预测给定点【】x_test 是否属于 C 类。该点被分类为在最近邻集中出现最频繁的类别。下图直观地展示了这一点:

kNN 算法采用 n 个 d 维训练数据点(我们的 X 矩阵),每个数据点都有一个相应的 y,并带有离散输出(即类)。在上面的例子中,我们有 n=8 d=2 个训练示例。其中 4 个是红色的,另外 4 个是蓝色的。kNN 算法使用该信息根据给定的 k 来预测测试点的类别(橙色)

只是为了快速澄清,在二进制分类器的情况下(所以当我们只有 2 个类要预测时),k 必须是奇数以避免有未定义的点。如上述 k=4 的最后一个示例所示,您可能会遇到类数量相等的情况,因此无法对您的点进行分类。当然,有办法解决这个问题。一个简单的解决方案是从两个类中随机选择一个。在多类分类器中,如果要为每个测试点定义一个结果,k 只能是 1 ,如下所示:

这里我们有 n=11 个 d 维训练点,我们的 y 现在是 3 维的,y = { '绿色','蓝色','红色' }。任何偶数 k 将具有与之前二进制分类情况相同的问题。除此之外,现在除了一个以外的所有奇数 k 都可能导致不确定的结果。

kNN 算法可以正式写成:

我们的函数 f 接收一个向量 x(用下划线表示),并将其归类为属于类别 c。这是通过在 x 的最近邻居中找到最频繁出现的类别来完成的

其中:

I 表示 x 的最近邻居的指数。k)找到最近邻居的集合

kNN 是一个非参数模型,这意味着没有任何“学习”发生。这意味着使用优化问题不需要找到任何参数。我们只指定一个超参数 k,它指定了我们的模型的行为方式。

如果你对这些不熟悉,我强烈建议你重新学习 kNN 知识。网上有很多很好的文章解释了算法是如何工作的。Onel Harrison 的文章相当受欢迎,也很容易获得。如果你对更深入的东西感兴趣,那么我会推荐凯文·扎克卡的文章

关于误差的快速复习:偏差、方差和贝叶斯率

任何给定的机器学习模型都会有以下 3 个错误。

偏差:这是我们因模型假设而产生的误差

我们得到这个错误是因为我们在模型中做了假设来简化分析,因此我们可能会错过数据中的实际潜在趋势。下图清楚地显示了这一点:

我们在左边看到,线性模型产生的错误最多,因为它没有捕捉到数据的非线性行为。其他两个模型不会出错,因为它们会出错。然而,我们看到最后一个模型几乎完美地捕捉到了蓝色决策边界。它有效地“记忆”了蓝色数据。这也不好,因为我们会看到它增加了方差!

通常,模型复杂性的增加会减少这种类型的错误。这是因为如果趋势更复杂,简单的模型会忽略趋势。

方差:是我们因不同数据集的预测不同而产生的误差

我们之所以会有这个误差,是因为我们的数据从来没有代表过真实的总体。因此,根据我们获得的训练/测试数据的类型,我们的预测会有所不同。我对这个错误的理解是:我们在多大程度上学习了训练数据中的噪音?也就是说,我们记住了多少数据?

我们可以看到右边的图将点误分类为红色,尽管它看起来像是蓝色的一部分。我们得到这个的原因是因为复杂的边界已经记住了蓝色数据集中的噪声。它更喜欢关注地方特色,而不是总体趋势。在左边,我们看到一条直线。正如我们之前所讨论的,这具有很高的偏差,因为它没有学习趋势,但是因为它没有记忆数据集中的“噪声”,它实际上正确地对新点进行了分类。在这种情况下,简单多项式是偏差和方差之间的最佳平衡,因为:它学习数据的一般趋势,而不记忆任何噪声!

通常,模型复杂性的增加会增加这种类型的误差,因为更复杂的模型在记忆局部特征/噪声方面更好。

不可减少的错误率:这是您拥有的实际数据的固有错误。如果不更改您的数据,就无法进一步减少。

这种类型的错误通常是因为我们的数据集中的固有噪声,即固有的随机性。这在下图中得到最好的展示:

这和上面的例子是一样的,采用我们最好的模型,简单多项式。但是,数据比以前多了,噪音也多了。即使有“理想”边界,由于数据中固有的噪声,模型也会产生误差。

如果你还是不明白,就去找个硬币。我们知道得到正面的概率是 0.5。然而,尝试投掷硬币 4 次,并重复这个实验 4 次。你会像你期望的那样总是得到两个尾巴(T)和两个头(H)吗?

我就这么做了,得到了:

  • 实验一: TTHT
  • 实验二: THHT
  • 实验三: TTHH
  • 实验四: TTHT

这并不是因为硬币有偏差,而是因为扔硬币有内在的随机性。当我们投掷硬币的次数接近无穷大时,正面的概率只收敛到 0.5。这同样适用于我们拥有的任何训练数据。

在分类中,我们有一种方法来估计任何分类问题的最小误差(类似于不可约误差)。这是贝叶斯错误率

贝叶斯错误率:随机结果的任何分类器的最低可能错误

它由下式给出:

p*是在给定数据的情况下使用贝叶斯分类器预测类的最大概率(即确定具有最高条件概率的类的概率)

这些误差的总和给出了模型的总误差率。

直觉:为什么增加 k 会减少模型方差,但会增加模型偏差?

为了说明这一点,让我们考虑一个分类问题,到目前为止,你们可能都已经看到了:

用圆形分布正确分类红色和蓝色。这里的橙色线表示两个类别之间的理想分离边界

让我们考虑同样的问题,但是有噪声。让我们看看,如果我们尝试对 k=1 的新点进行分类,会发生什么。

我们可以看到,k=1 的点错分了大部分的点。这是因为碰巧这些点的最近邻点没有反映数据的趋势,即圆圈,而是简单的噪声样本。k=1 算法有效地“记忆”了数据中的噪声,因此它不能很好地概括。这意味着它有很高的方差。然而,偏差非常低,因为它完美地捕捉了数据中存在的所有波动。

现在让我们考虑一个例子,k=3,k=9

我们可以看到,对于 k=3,所有的决策都非常合理。偏差和方差都很低。对于 k=9,虽然我们仍然得到正确的答案,但是一些用于对我们的点进行分类的最近邻开始从两种分布中获取信息。在这一点上,我们的方差很低,但偏差很大,因为我们的模型没有了解到有两个不同的圆圈代表不同的类别。

如果我们在 k 接近数据集大小时取极限,我们会得到一个模型,这个模型只是预测在数据集中出现频率更高的类(实际上是贝叶斯误差)。这是具有最高偏差的模型,但是方差是 0(因为我们的误差对于测试数据是不变的)。高偏差,因为它未能捕获关于模型的任何局部信息,但 0 方差,因为它预测任何新数据点的完全相同的事情。

kNN 作为回归模型的数学证明

如果我们将 kNN 视为一个回归问题,我们实际上可以从数学上表明,增加 k 会导致我们模型的方差减少。这样,我们的预测器就变成了一个决定连续变量的函数:

实际上,我们为 x_test 预测的值是其所有最近邻居的平均值

与任何模型一样,我们对最小化预期误差 E 感兴趣,其中:

这里我们使用均方差作为我们的损失函数,因为它是一个回归问题

我们可以将其扩展,得到偏差-方差分解,如下所示:

平方损失(MSE)的偏差方差分解。这个结果来自维基百科页面。如果证明不清楚,请在这里留下评论,我会考虑写关于分解证明的文章。

偏差和方差由下式给出:

偏置方程,其中 f_t 是定义 y 的确定性函数,因此 y = f _ t+ε(ε是均值为 0 的随机误差)。期望 E 是 x 的所有可能实现,记住偏差是我们因为模型的假设而产生的误差。这个等式应该是:考虑到我们的预测值在 x 的所有可能值上看起来像什么(因此是期望值),与函数的真实形式相比,我们产生的误差是什么。

方差方程。根据我们的定义,方差是由于不同数据集之间的差异而产生的误差。第一个期望中的术语是:在所有可能的 x 值上,与我们的预测值相比,我们对函数 f 的单个实现产生的误差是多少。然后,我们考虑在所有可能的 f 值上的这个误差(因此是期望)。

最后一项是误差的固定标准差:

这是我们不可减少的错误。由于误差的变化,我们的模型会产生多大的变化?值得提醒您的是,为了实现这一点,我们假设误差的平均值为 0。这意味着我们的误差不应该是输入 x 的函数,它们应该是随机的。

如果我们现在考虑我们的 kNN 回归模型,我们实际上可以确定偏差和方差的表达式。我们将分析限制在一个给定点 x_test

对于偏差,我们有:

对于方差,我们有:

总的来说,我们得到我们的预期损失如下:

我们可以非常清楚地看到,随着 k 的增加,当它接近无穷大(即数据集的大小)时,模型的方差趋于 0。不可约误差保持不变。虽然直觉上我们预期偏差会增加,但要用数学方法显示这一点并不容易。然而,取 k 的极限到我们覆盖整个数据集的程度意味着我们的 kNN 回归仅仅给出平均值的恒定值(具体地,除了我们正在查看的点之外的所有点的平均值)。因此,我们只是预测一个常数值,因此我们没有捕捉到有关数据基础结构的内在信息,因此我们的偏差会很大。

实证结果:k 如何影响泛化误差?

我做了一些实验,看看 k 的选择如何影响泛化误差。这是我得到的情节:

这是在 m=500 和 test_size 为 20%的 circle 数据集上进行的实验。

如果我们看上面的图,k 值低于 150,我们得到经典的总误差曲线。对于小 k 值,方差占主导地位,这就是为什么我们得到高误差率。对于较大的 k 值,我们的偏差是高误差率的主要原因。

我们可以看到,给出最小误差的 k 的最佳值约为 27(注意,我们可以使用交叉验证找到更好的近似值!).

该图中真正有趣的是,当 k>150 至 370 左右时,误差几乎保持稳定。虽然看起来后台可能发生了一些可疑的事情,但这个结果实际上是有意义的!由于我们有一个二进制分类问题,并且每个类别的样本相等,我们预计对于非常高的 k 值,我们将有效地在两个类别之间随机猜测,因此错误率为 0.5!

奇怪的是,在 370 左右,我们的错误率增加了。对此也有一个解释,由 Karolis 提供。

这是因为 train_test_split() 函数随机分割数据,结果测试集和训练集中的类平衡都不相等。当我们的分类器处于非常高的 k 值时,它将学习预测在训练集中更频繁出现的类别。在我们的测试集中,我们将有一个相反方向的类不平衡,即在训练集中不太频繁的类将是在我们的测试集中最频繁的类。这种偏差导致误差增大,变得比随机猜测还要糟糕!

为了说明这一点,可以通过模拟来确定不平衡测试集的平均频率:

平均频率为 0.540,如图所示!

为了验证这个理论,我用分层的 train_test_split() (也就是确保拆分后的类是平衡的)重复了这个实验,瞧!结果如我们所料!

实证结果:k 如何影响决策边界?

为了感受模型“记忆”噪声(即高方差)的意义,我绘制了不同 k 值下的 kNN 模型的等值线图。这些图清楚地显示了决策边界。

我们可以看到,随着我们从低 k 到高 k,决策边界变得更加平滑。这意味着,我们并没有过多关注局部特征(即噪声),而是试图捕捉一些潜在的趋势。当然,我们看到,当我们对 k 的值走得太远时,我们只是得到一个几乎 100%一致的边界。在这种情况下,我们完全忽略了潜在的趋势和任何局部特征,而只关注全局特征,即训练数据集中类的频率

我们可以将上述模型与实际的训练数据集进行比较。

我们看到 k=25 的模型最好地解释了数据。

实证结果:m 如何影响 k 的最优值?

我做了一些实验来确定改变数据集 m 的大小对 k 的最优值的影响。

结果有些耐人寻味,所以我想与你分享:

我们可以看到,对于 make_circles() 数据集,m 的增加几乎是线性的。由于数据的参数(噪声= 0.3,因子= 0.5)随着样本数量的增加会有很大程度的重叠,因此 m 的增加导致 k 的增加是有道理的。

因此,对于较小的样本,我们需要依靠局部特征进行精确预测,因此 k 值较小,但对于较大的样本,我们需要更平滑的决策边界,以确保我们捕捉到趋势,而不是重叠产生的噪声。

至于为什么这个关系是线性的,我只能猜测是因为我们在线性增加数据。但是,我对这种推理不够自信。

关键要点

  • kNN 模型是一个具有超参数 k 的非参数模型
  • 其性能基于总误差,即偏差方差不可约误差之和
  • 小值的 k 记忆噪声,从而导致非平滑判定边界。这增加了总误差,其中主要是高方差
  • k 的大值忽略了数据(局部特征)中的潜在 趋势,从而导致平滑决策边界。这增加了总误差,其中主要是高偏置
  • 将 kNN 视为一个回归问题,可以让您以数学方式显示上述结果
  • k 的最佳值是方差和偏差之间的平衡值。这可以通过交叉验证找到。如果不确定从哪个 k 值开始分析数据, k = sqrt(m)k = log(m) 是一个好的开始

显示任何 ML 问题中不同类型错误的图表,总结上述信息

再现性

如果你想重现结果,请查看 GitHub 的页面。如果您对它的任何方面有任何问题,请联系我!

如果你真的喜欢我的工作并愿意支持我,请考虑使用我的推荐链接来获得一个中等订阅。

除非另有说明,所有图片均由作者创作。

为什么伤害这么大:数据迁移的基本策略

原文:https://towardsdatascience.com/why-does-it-hurt-so-much-basic-strategies-for-data-migrations-2e8fdd7def9c?source=collection_archive---------44-----------------------

认识并克服移动数据的挑战

弗兰基·查马基在 Unsplash 上拍摄的照片

恭喜你,你刚买了一套新的 IT 系统。除非它将被用来支持一个全新的业务流程,否则您现在面临的任务是将您的数据从一个遗留系统转移到您新获得的工具中。数据迁移充满了挑战、陷阱和危险。同时,它们也是我们处理的最常见的数据项目之一。然而,迁移数据通常是事后的想法,或者被大大低估了。因此,这些举措经常出错也就不足为奇了。在这篇文章中,我将讨论一些绊脚石和降低风险的策略。

基本策略:之后你可能不会清理它

你妈妈已经不住在这里了(图片由LunailonFreepik)

虽然将数据从一个系统复制到另一个系统在技术上并不难,但数据迁移的核心问题是如何在不降低目标系统数据质量的情况下执行迁移。您至少会遇到 4 个基本问题:

  • 数据丢失:由于没有将某些数据元素映射到目标系统,这些数据元素将不会存在于目标系统中。它们实际上已经丢失了。
  • 数据重复:一些数据元素可能已经存在于目标系统中,如果没有有效地进行匹配,就会导致重复。
  • 有效性问题:源系统中的数据可能与目标系统中的数据格式不同。如果没有转换,您可能会将格式不良的数据加载到目标系统中。在某些情况下,您可能根本无法加载数据,例如,如果目标系统有验证规则。
  • 一致性问题:这与我前面提到的重复问题有关。如果源系统和目标系统中相同的数据元素有不同的值,会发生什么情况?哪个值准确?他们都是吗?字段真的有相同的语义吗?

在迁移的上下文中,有三种处理遗留数据的方法:首先,您可以丢弃它,从不影响目标系统中数据质量的角度来看,这可能是最好的方法。你没有的也不可能是错的或格式不良的。

这种方法带来了巨大的代价:企业实际上将失去与遗留数据进行交互甚至咨询的途径。虽然有一些方法在遵守法律要求的同时允许使用这种策略(例如,您可以将数据以原始形式存储在驱动器上),但如果企业在日常运营中需要这些数据,这种方法对企业没有帮助,因为情况几乎总是如此。

第二种方法是在源位置或迁移过程中清理数据。虽然这是一种优越的方法,但它需要时间、金钱和资源。此外,遗留系统通常不支持这种清理操作。

第三种方法是按原样迁移数据,并利用新的应用程序清理目标中的数据。通常,这是我们结束的地方,减去实际的净化。数据迁移项目已经结束,资源被重新分配,如果我们正在进行这种讨论,围绕数据质量进行明确治理的可能性实际上微乎其微。

这将导致两件事:第一,新系统中的体验将被涌入的低质量数据所破坏。所有展示给你的漂亮的新应用程序的演示都是由供应商使用特制的高质量数据完成的。还记得在系统中快速查找联系人的过程吗?现在,系统开箱后运行缓慢,遗留系统中有 7 个同名联系人的问题仍然存在。然而,他们向您承诺,所有这些都可以通过实施新工具来解决。

第二,如果你迁移到一个共享的平台,你不仅会遇到你在遗留系统中曾经遇到的同样的问题,你还会把你的问题插入到使用相同系统的同事的生活中。也许他们已经把他们的复制品削减到一个可以接受的水平,却发现有人一下子就毁掉了他们所有的努力。

我参与过一些项目,在这些项目中,我们成功地选择了混合方法,丢弃了一些数据(您真的需要二十年的发票数据吗?),在传输中或在源处清洗一些,然后在目标处清洗。使最后一步有效的唯一方法是有一个批准的项目,有预算和锁定的资源,以在商定的时间范围内完成清理工作。如果你没有所有这些,简单地假设你迁移的混乱将永远存在。

无迁移意味着您从一个空数据库开始

我最喜欢的数据迁移策略之一(照片由 乔奎因·科普兰atFreepik)

我想花一点时间谈谈根本不进行数据迁移的概念。我实话实说:就像最好的代码是未编写的代码一样,最好的数据迁移是未执行的。然而,不迁移可以有非常不同的含义,取决于谁使用这个词。

让我先说:当我说不迁移时,我的意思是您将从一个空数据库开始。你的历史:消失了。你的账户:没了。你的联系人:拜拜。正如我之前提到的,出于合规性的原因,我们可以将这些东西存储在某个地方,但是出于所有实际目的,您将无法在操作上使用任何东西。如果你正在转移到一个共享平台,你也许可以重用那里的一些数据。如果您想使用外部购买的数据,我们也可以做到这一点。

但是,当企业说不进行迁移时,他们可能完全是另有所指:也许他们不想花费任何金钱或时间来正确地进行迁移,所以他们更愿意将遗留系统中的所有东西原封不动地放入新的应用程序中。这实际上也是一种数据迁移,只是做得不好。

我在多个组织中见过这种情况,它总是导致悲剧。在某种程度上,当不迁移的后果变得明显时,有一种逐渐改变目标的趋势:也许我们应该尝试迁移一些主数据,对吗?账户数据,没那么难。

在第一轮测试之后,企业真的希望能够看到他们在过去为客户做了什么,所以也许我们也应该尝试加载一些历史记录。诸如此类。你猜怎么着?您现在正在进行数据迁移,只是没有进行任何分析,也没有获得批准的预算或资源。

快速加载,快速失败

照片由 纪尧姆小牢

说到分析,在预先分析和规划与进行实际迁移之间,什么是正确的平衡?

根据我的经验,当您真正尝试将数据加载到目标系统中时,问题通常会浮出水面。我并不是说你不应该花时间在分析上,恰恰相反。但是,即使您找到了既了解源系统又了解目标系统并且非常了解业务环境的人,在您提取、转换和加载数据之前,也很难完全分析情况。

从产品的角度考虑是有帮助的:实际进行迁移需要什么?您是否在寻找成套 CSV?如果有,他们有哪些领域?它们将映射到目标应用程序中的什么位置?遗留系统中的所有东西在新系统的数据模型中都有位置吗?我们有映射关系的键吗?如果没有,我们能创建这些键吗?如果您正在考虑使用 API 调用来加载数据,这些问题是相似的。

你可能会说,这些事情应该在分析过程中解决,你是对的。我要说的是,我很少遇到这样的情况,在将数据加载到目标之前,所有这些问题都得到了妥善解决。

通常,我们不需要同时加载所有对象,所以一次测试一个对象可能会暴露出您没有计划到的问题。

当然,在某些时候你会想要尝试多个对象的序列,特别是当它们是不同对象之间的关系时。就测试而言,如果可行的话,我非常希望在测试阶段至少运行一次整个迁移。显然,如果您正在考虑为期一周的迁移,这可能会很困难。另一方面,迁移花费的时间越长,遇到不可预见的问题的可能性就越大。当使用较小的样本时,这些问题中的一些可能不会被梳理出来。

也许在实际迁移之前可以加载一些对象,但是需要预见从遗留系统推送更新的一些方法,因为遗留系统仍然会获得某些数据元素的更新。虽然有理由对特定的数据元素进行预迁移,但请记住,这给迁移增加了额外的复杂性,并带来了巨大的数据质量风险。

您的整体数据成熟度会直接影响数据迁移的成本

最后,我想强调的是,没有免费的午餐,也绝对没有免费的数据迁移。也就是说,您在做这些事情时遇到的许多问题都是数据相关事务整体成熟度较低的直接后果。在数据成熟度较高的组织中,在购买或实施新系统之前,会询问有关数据迁移的问题。类似地,当您在组织中创建新类型的数据时,您应该考虑未来不可避免的数据迁移。这意味着要考虑粒度(需要时总是可以聚合更粒度的数据,反之则不然)、通用数据模型和共享分类法。

当这些问题在整个数据生命周期中得到解决,而不是在时间紧迫的情况下移动数据时,成本往往会大大降低。

此外,拥有更高的数据成熟度意味着您的业务用户将能够以更结构化的方式推理他们的数据,还会导致更清晰的需求和更现实的期望,这两者都是成功的数据迁移的关键成功因素。

为什么马尔可夫决策过程在强化学习中很重要?

原文:https://towardsdatascience.com/why-does-malkov-decision-process-matter-in-reinforcement-learning-b111b46b41bd?source=collection_archive---------18-----------------------

比较 MDP 和 k-武装土匪的问题,看看 MDP 如何更适合在现实世界中

贾南·拉格沃尔在 Unsplash 上拍摄的照片

对于大多数学习者来说,马尔可夫决策过程(MDP)框架是第一个了解强化学习(RL)的框架。然而,你能解释为什么它如此重要吗?为什么不是另一个框架?在这篇文章中,我将解释 MDP 相对于另一个流行的 RL 框架 k-armed bandit 问题的优势。

这个帖子的灵感来自于由阿尔伯塔大学和阿尔伯塔机器智能研究所在 Coursera 上提供的 RL 专业。我写这篇文章是为了总结一些视频,并对专业化有更深入的了解。

强化学习的目标

在深入我们的主要问题之前,我想提一下 RL 的主要目标,因为当我们选择一个框架来构建一个模型时,它很重要。在 RL 问题中,我们希望随着时间的推移采取行动,使我们获得的总回报最大化。没有人告诉我们什么行为会带来更高的回报。相反,我们从经验中学习。我们重复试错的尝试,观察哪种行为给我们更高的回报,哪种行为给我们更低的回报。此外,我们甚至不知道什么时候开始给予奖励。它们可能会立即给出,也可能在我们采取行动后的几个时间步骤后给出。因此,我们需要一个动态框架来捕捉这两个特征,“试错搜索”和“延迟回报”

例子:兔子探索食物

我们考虑一个简单的情况。有一只饥饿的兔子正在寻找食物来满足她的食欲。它的右边有一个胡萝卜,左边有一个花椰菜。兔子更喜欢胡萝卜而不是西兰花,所以当她吃一根胡萝卜时,她会得到+10 奖励。另一方面,花椰菜只能产生+3 的回报。每次,兔子都会选择一根胡萝卜,因为她知道选择一根胡萝卜是一个最优行动。

图 1:兔子右侧的胡萝卜(图片由作者提供)

如果胡萝卜和西兰花的位置互换了呢?兔子也会再次选择胡萝卜,因为食物的位置不会影响兔子得到的奖励。这其实是一个简单的“k 臂土匪”问题的例子。

图 2:兔子左侧的胡萝卜(图片由作者提供)

k 武装匪徒

k 臂土匪问题是 RL 中最简单但功能强大的框架之一。它被命名为“独臂强盗”(=老丨虎丨机),虽然框架有 k 杠杆,而不是一个。在这个问题中,你面临着在 k 个不同选项中做出选择。每次选择后,你会收到一份奖励,它是从与你选择的选项相对应的固定概率分布中选出的。你重复这样的选择,目的是最大化你获得的奖励总额。要做到这一点,你需要找到一个最有可能产生最佳回报的杠杆(或期权),并把你的选择集中在它上面。

兔子的例子可以被视为一个“双臂强盗”问题,因为兔子总是有两种选择,胡萝卜和花椰菜。选择胡萝卜有 100%的概率产生+10,选择西兰花有 100%的概率产生+3。因为兔子想让奖励总量最大化,所以总是选择胡萝卜。

下面这篇文章将有助于更详细地理解 k 臂土匪问题。

例子续:胡萝卜后面的老虎

虽然 k-armed bandit 框架很好地捕捉了前面的简单情况,但它有一个限制,这将在下一个情况中显示。

在这里,我们想象一只老虎躲在胡萝卜后面猎食兔子。当兔子吃了胡萝卜,兔子和老虎之间不再有任何障碍。老虎比兔子跑得快,所以她跑不掉。兔子最终被猎杀并获得-100 奖励。

图 3:兔子去抓胡萝卜,老虎在后面(图片由作者提供)

图 4:兔子在吃完胡萝卜后被追捕(图片由作者提供)

如果兔子选择吃西兰花,兔子会得到+3 并且保持安全。

图 5:兔子只要选择西兰花就是安全的(图片由作者提供)

在 k 臂土匪问题中,兔子即使知道胡萝卜后面有老虎,也继续选择胡萝卜,因为变化的情况不影响它的最优行动。然而,继续选择胡萝卜不会永远帮助兔子。我们应该如何在我们的问题定义中考虑情况的变化?

马尔可夫决策过程

最后,我们引入马尔可夫决策过程(MDP) 来解决这样一个问题。MDP 由两个元素组成:代理环境。代理是学习者或决策者。在上面的例子中,代理是兔子。环境是代理周围的一切。在这个例子中,环境包括兔子和老虎在田野里的一切。在代理采取行动后,我们面临一个不同的情况。我们称这些不同的情况为状态。比如兔子还没动的情况被认为是一种状态,兔子吃了胡萝卜之后在西兰花和老虎之间的情况被认为是另一种状态。

在 MDP,病原体与环境“互动”。代理选择一个动作,并观察采取该动作后环境中发生了什么。然后,它会收到与动作和她转换到的状态相对应的奖励。代理多次重复交互,并学习在每个状态下什么动作是最佳的。

下图是 MDP 的形式化。在时间 t 处,处于状态 St 的代理从动作空间中选择处于处的动作,并且环境从状态空间返回新的状态 S_t+1 。然后,代理根据开始状态、采取的行动和后续状态接收奖励 R_t+1

图 6:代理和环境之间的交互(图片由萨顿和巴尔托提供,由 CC BY-NC-ND 2.0 授权)

在兔子的例子中,动作空间由左右移动组成。状态空间包括所有四种可能的情况,1)兔子在初始位置,2)兔子在西兰花和老虎之间,3)兔子吃完西兰花后在最左边,4)兔子被老虎吃掉。可能的奖励是+3(情况 2),+10(情况 3),和-100(情况 4)。下图描述了详细信息。

图 7:可能状态和相关奖励的可视化(图片由作者提供)

考虑到 MDP 框架和图表,兔子知道最佳行动是向右移动,因为吃胡萝卜最终会产生负的总回报。

从技术上讲,MDP 通过定义 MDP 的动态函数来捕捉 RL 问题的动态性,这是一个状态和后续奖励对的概率分布,取决于其先前的状态和在那里采取的行动。不过,我会把这个解释留到以后写的另一篇文章中。

摘要

  • MDP 框架很重要,因为它考虑了可能导致最优行动改变的情况变化,而这在 k 臂土匪框架中是没有考虑的
  • 一个 MDP 由它的主体和环境组成。代理与环境交互,观察状态转换并接收奖励,以在每个状态下找到最佳行动

参考

为什么圆周率呈现正态分布?

原文:https://towardsdatascience.com/why-does-pi-show-up-in-the-normal-distribution-a10baf4a71f1?source=collection_archive---------4-----------------------

提示和技巧

理解钟形曲线是如何形成的,以及它们与圆周率的反直觉关系

作者图片

最近在翻阅一本旧的统计学教科书时,我发现了熟悉的正态分布方程:

任何在大学上过统计学课程的人都会遇到这个等式。我自己已经看过很多次了,但这次看着它,两个问题立即浮现在脑海中:

  1. 这个东西到底是怎么形成正态分布的?
  2. π在里面做什么?

第一个问题似乎很简单:我只需要追溯这个方程的历史,然后把它一点一点拼凑起来。但第二个问题绝对难倒了我:钟形曲线到底和圆有什么关系?

我通读了所有的数学堆栈交换解决方案,四处搜索,并在 Twitter 上提问,但从未感觉到任何答案给了我一直在寻找的直觉。他们过于依赖分析解决方案,或者当使用视觉技术时,我觉得这些连接是手动波动的。在做了一些我自己的研究后,这里是我在不求助于任何高等数学的情况下解释这种联系的尝试。

首先,什么是钟形曲线?

在讨论π部分之前,了解一下钟形曲线是如何形成的会有所帮助。让我们从指数函数开始,你可以在上面的等式中看到。这里它是独立的:

作者图片

如果我们对 x 的值求平方,它看起来有点像二次型,但不是一次型。相反,它是一个比二次函数增长更快的函数,但具有一些类似的属性,如关于最低点对称。将其添加到上面的图中进行比较,可以看到它们在 x=0x=1 处具有相同的值:

作者图片

最后,让指数为负,像变魔术一样,我们得到下面红色显示的钟形曲线:

作者图片

这个函数, f(x) = e^{-x } ,只是无数可能性中的一个特殊的钟形曲线。一般来说,你可以将 e 提升到任何你喜欢的二次型。然而,只有当二次曲线是凹的(也就是说,它向下“打开”)时,你才能得到一条钟形曲线。上面那个二次是 -x ,确实是向下开的。

例如,下面用蓝色绘制的方程 f(x) = x + x + 2 不凹,当 e 上升到它时,你得到的是绿色曲线,显然不是钟形曲线:

作者图片

但是,如果我们将等式转换为 f(x) = -2x + 3x + 2 ,我们会得到一个凹函数,并且 e 被提升到,从而形成钟形曲线形状:

作者图片

为此,钟形曲线方程的一般方程被提升为二次方程:

为了有助于将其约束为仅凹二次曲面,可以执行以下替换:

将这些代入并重新排列后,你会发现你得到了下面的等式,它几乎与我们从顶部开始的等式完全相同,只是在它前面有一个 a :

在右边的等式中选择 a ,这样无论钟形曲线的形状如何,它下面的面积总是正好为 1。这是因为对于统计分布来说,1 相当于 100%的可能结果,面积总和应该总是该值。

换句话说,钟形曲线和π项之间的联系,一定和曲线本身的面积有关。但是这到底有什么联系呢?

圆周率与钟形曲线的关系

让我们来评估一下刚刚发生了什么。我们取了一个先验数, e ,并将其提升到二次幂。当我们计算曲线下的面积时,我们得到另一个超越数π。

原来,这两个数字在几个方面是有联系的,包括它们在复数系统中的关系经由数学中最优美的方程之一: e^{iπ} + 1 = 0 。但是这个等式在这里不起作用。

相反,正如我们将会看到的,π不需要我们去计算面积。迂回地用【e^{-x】的平方,再求平方根,就可以得到这个面积。换句话说:

我们必须这么做的原因是,我们需要用到微积分技术来得到面积。网上有很多例子说明如何做到这一点,但我想提供这些分析解决方案不一定传达的视觉直觉。

由于我们用来计算面积的变量是任意的,我们可以简单地用下面的等式来表示上面的等式,其中我们用一个 y 代替了第二个 x :

现在,您可以将这些钟形曲线中的一条放在 x 轴上,另一条放在 y 轴上,然后获取它们高度的所有组合,并绘制成三维图:

作者图片

要得到其中一条曲线的面积,你只需要得到形成的“山”的体积,然后求这个值的平方根。与此类似,维度更少的情况是知道一个正方形的面积,然后通过平方根得到它的边长。

注意: 此招并非对所有类型的函数都有效。如果你用一个二次型(比如说, -x + 9 )来尝试这个,你不会得到正确答案。原因是这只适用于平方后旋转对称的函数。虽然高斯曲线是这样,但从下面类似的二次曲线图中可以看出,它是“方形”的,并且不像上面的曲线那样通过旋转对称。

一个“平方二次”的图表明它不是旋转对称的。图片作者。

但是,我们如何得到体积呢?一种方法是将山分成如上的方块,然后得到每个方块中间的高度。然后你可以计算这些方形柱子的体积为(每个正方形的面积)**(高度),然后将所有这些较小的体积相加。你做的方块越小,近似值就越好。

然而,这隐藏了π的来源。所以相反,想象一下,不使用正方形,我们把它径向分开。在这张图中,我们从顶部向下看,可以看到山丘的等高线:

作者图片

在这里,您将上山划分为由黑色虚线表示的“片”。这些切片被进一步分成以蓝色突出显示的部分。如上所述,你将这些蓝色小块的面积乘以该点的山的高度,得到体积:

不过,在这种情况下,您可以沿着“切片”重复此操作,以获得整个切片的体积,然后乘以切片的总数,以获得整个山体的体积。

如果你把𝜃角做得足够小,以至于它几乎是一个长条,那么实际上,你可以把一个切片的体积乘以 2π弧度,弧度是一个圆的弧度数。

如果你真的做了这道算术题(同样,微积分在这里讨论过给那些想看的人看)你会发现每个切片的面积正好是 0.5。将它乘以 2π弧度,你得到的体积正好等于 π

现在你知道了:圆周率来源于这样一个事实:我们通过制作径向切片,然后将它们围绕一个圆缝合在一起,从而得到体积。

事实证明,任何通过旋转对称的东西都可以被认为包含圆,自然地,圆意味着 π 潜伏在数学中的某个地方。

虽然这不是一个严格的证明,并且我跳过了许多细节(例如,跳转到两条钟形曲线的 3D 图通常并不适用于所有函数,但它适用于我们使用的函数),但我希望这能给读者一个直觉,为什么 π 似乎突然出现在一条似乎没有什么关系的曲线中。

原载于【WhackData.com】。关注莱恩在推特上的@布里多

为什么可靠性和稳定性在数据科学中很重要?

原文:https://towardsdatascience.com/why-does-reliability-and-stability-matter-in-data-science-3040ffb64b1?source=collection_archive---------42-----------------------

理解糟糕的软件可靠性的含义

照片来自 Unsplash 上的 Nikko Macaspac

这是紧张的一周,痛苦的主要来源是理解代码的可靠性和稳定性如何决定一个过程,甚至在数据科学中。上周末,我们的一个内部工具开始遇到困难。问题开始一个接一个地堆积,形成连锁反应。一旦我修复了一个 bug,其他几个就会接踵而至,感觉就像是永无止境的打地鼠游戏。

可靠性和稳定性

在软件和数据科学中,我们编写的代码经常会出现在一些应用程序中。随着代码的开发,它应该是可靠和稳定的,以确保它不会破坏应用程序。可靠性是能够信任持续执行的过程,而稳定性是抵制变化,并且在变化发生时不太可能让步。但是为什么这两个概念对我们的代码至关重要呢?据 CISQ :

可靠性衡量潜在应用程序故障的风险以及应用程序在遇到意外情况时的稳定性。

在上周末启动该工具时,人们期望它会按预期运行并产生所需的输出。但不幸的是,随着错误开始出现,应用程序开始失败。用户不再相信该工具的输出会产生预期的结果,不得不求助于其他更耗时的方法来获得他们需要的结果。随着工具的可靠性下降,其运行的稳定性也开始下降。我们开始经历中断,这最终会使工具处于混乱状态。

识别潜在问题

当我坐在椅背上,看着工具退化,它变得清晰的领域是缺乏的。代码中有错误吗?是的。这些是我们唯一的问题吗?不。我们的主要问题来自代码库的过程。我们的代码应该在不同的条件下执行其必要的功能而不会失败,但是我们没有检查这些条件。

通过额外的测试和同行评审来检查代码的可靠性有助于防止任何可能降低应用程序稳定性的重大失误。我的团队知道这一点,因为我们已经在其他工具中做到了,但为什么不在这个工具中呢?这个问题有不同的答案,但问这个问题的重要性在于了解我们哪里出了问题,以及如何改进。我们知道测试和同行评审有助于减少应用程序停机、中断和错误,这些都会直接影响您的用户或客户,现在是时候专注于制定变更计划了。

制定前进的道路

面对我们的工具的健康和有用性迅速下降的问题,很明显我们需要定义一条前进的道路。这条道路将提高可靠性,从而提高代码的稳定性,以确保此类问题不会再次出现,使应用程序变得无用。我们希望改进的主要领域是测试。

当我开始在这个团队工作时,单元测试的想法对于大多数数据科学家来说是陌生的。单元测试是软件库常用的一种测试类型。创建这些测试是为了测试库的单个函数或组件,以验证代码是否如编写它的人所期望的那样执行。通常,数据科学家在编写代码时会添加单元测试,作为他们执行此类检查的一种方式。对于团队中的大多数人来说,这是一个陌生的概念,所以我并不奇怪这是我们最缺乏稳定代码库的领域。相反,数据科学家通过只使用能给出他们想要的结果的输入来运行代码,从而测试输出是否正确。他们没有测试可能会破坏代码以防止此类问题发生的输入。

因为我们已经对代码库进行了同行评审,所以主要的变化是增加了更多的测试。随着我们向前发展,我们希望:

  • 添加单元测试,以验证所有组件都按预期执行,没有错误。
  • 当打开一个 pull 请求来验证所做的任何更改时,运行单元测试来检查函数是否产生了预期的结果,并且没有出现意外的错误。
  • 当打开一个 pull 请求时,继续对代码进行同行评审讨论,以找到任何可能不会产生实际单元测试错误的逻辑错误。
  • 在合并生产变更之前,利用该工具的开发和生产版本的多种环境,通过用户测试来大规模测试变更。

将健康的软件实践整合到您的数据科学代码中,将有助于确保您的工作向前发展的稳定性和可靠性。防止可能导致整个应用程序崩溃数天的泄漏。

最后的想法

从一个数据科学家到下一个数据科学家,不要只关注结果,还要关注你产生的过程。确保您了解如何测试您正在使用的代码、分析和工具的可靠性和稳定性。如果你开始面临一个大问题,找出根本原因,并理解它可能不仅仅是修复一个错误,而是一个过程。通过不同形式的测试和同行评审来检查代码的可靠性有助于防止任何可能降低应用程序稳定性的重大失误。如果你在一个软件库中编写代码,学会开发和利用不同的测试形式来验证你的代码在不同的条件下的变化。单元测试只是软件测试的一种形式,可以用来检查组件功能是否正确。

你是如何将软件技术融入到你的过程中的?你学到了什么教训?

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

</7-lessons-learned-from-7-months-of-remote-mentoring-b9cebf0cf222>

为什么你的 MLOps 感觉不够用?

原文:https://towardsdatascience.com/why-does-your-machine-learning-ops-feel-inadequate-430fdee7d687?source=collection_archive---------34-----------------------

意见

机器学习过程碎片化的原因以及为什么许多实践仍然是定制的。

E 每次我设计一个新的微服务,都会有一个待办事项清单供我核对。这个列表中的一个早期项目是关于为新服务设置 CI/CD。我思考这些人工制品是什么,以及它们在不同阶段是如何形成的。我考虑它如何最终部署到生产环境中,以及如何在部署后对其进行监控。

这种情况不是我一个人的。现代软件工程实践将经过深思熟虑的 CI/CD 原则作为一种规范来实施。然而,当我开始我们公司的 MLOps 之旅时,我意识到软件工程中实践的那种 CI/CD 不是数据科学实践中的标准。

MLOps 非常定制(照片由杰斯温·托马斯Unsplash 上拍摄)

这几乎难以置信。因为我认为人为错误导致的模型质量问题在行业中普遍存在。是因为在典型的 ML 过程中没有足够的质量和自动化考虑吗?或者它是否需要一种尚未真正弄清楚的全新类型的 ops 工具包?后来我发现,这是两者的结合。和许多其他人。

以下是这些发现的摘要。

  • 许多数据科学操作显然是不成熟的— 我们不能忽视显而易见的事实。几个数据科学运营的规模不足以将必要的想法纳入运营。我遇到的一家公司将数据科学家本地 Jupyter 笔记本上的每个新模型通过 slack 发送给数据工程团队,他们会将其复制到他们的生产环境中。虽然这是一个忽略了几个质量方面的难以置信的天真的实践,但该公司软件运营的其余部分是可靠的。这个实践告诉我 MLOps 是多么被忽视。
  • 在陷入 MLOps 之前,新模型需要喘息的空间— 新的 ML 模型通常是为了处理全新的问题而构建的,这需要围绕推理的新框架在生产中运行。构建过程经历了大量的实验&评估——只有在证明该模型的商业成功后,才能围绕它构建一个推理框架。因此,部署过程通常是事后才想到的。无论这个框架何时形成,它都是一个非常定制的过程。
  • 太多的框架没有一个明确的赢家— 数据科学实践太定制化了,把几个 ML 框架串在一起用于管道的不同部分。顶级 ML 框架中还没有一个赢家(例如,考虑深度学习——py torch、MXNet、Tensorflow)。几个框架的存在使得过程标准化对于外部供应商来说具有难以置信的挑战性。
  • 先进的 ML 管道有时无法实现 —这包括监控生产中模型的漂移、使用实时数据进行自动再训练、实现集中式数据清理和功能工程等功能。尽管这些对于任何运行在产品中的模型来说都是有价值的工具,但是它们背后的工程工作是如此之大,以至于许多组织并不简单地投入这些工作。
  • Cloud AutoML- 支持 AutoML 的云服务( SagemakerCloud AutoMLDatarobot )已经具备 it 固有的强大 CI/CD 功能。我说的不仅仅是自动算法选择。任何可以自动化数据科学管道(特征工程、数据处理、算法选择、推理等)的软件。)背后必须有合理水平的 CI/CD 和工程。
    操作该模型的软件通常是围绕一个标准化的推理模板构建的,该模板通常由同一个 AutoML 框架提供。事实上,如果你正在使用某种形式的 AutoML,你已经有了一种 CI/CD。但通常,这是不够的。CI/CD 只是可靠的 MLOps 流程的一部分。在这种情况下,您仍然依赖个人来获得正确的部署。没有足够的制衡。

另外,数据科学家不是软件工程师。

软件工程之所以有几个护栏,是因为人类会犯错误的潜在假设。这是很好理解,理论化和多年价值的过程已经围绕这一点。然而,机器学习行业仍然在追赶这一基本思想。

数据科学家的思维过程与软件工程师不同。开发人员每天都关心他们代码的操作方面。他们在生产过程中建立质量关卡和检查。

另一方面,数据科学家钻研复杂的数学和数据分析。在构建新模型时,代码质量、管道和自动化测试并不是他们最关心的事情。大多数时候,向他们提出这样的要求是不公平的。

然而,为了使 MLOps 正确,我们需要混合经典的软件工程。这个头衔经常被伪装成数据工程师。但随着 MLOps 越来越受欢迎,这个角色需要更多的细微差别。该角色通常用于扩展进入管道的数据(ETL、Spark 等),而不是 ML 模型相关的问题。例如,这个人必须思考,

  • 如何在模型训练和模型推理之间创建可重复的数据清理和特征工程管道
  • 如何跟踪实验,哪些指标需要汇总到仪表板中
  • 如何通过跟踪漂移来监控生产中的模型?以及如何使用新数据实现实时再培训

这些都是需要数据科学和软件工程思维过程的挑战性问题。需要将大规模研究这些问题的各种专业角色纳入“数据工程师”或其同等职位。

后来添加的东西

我谈到的所有问题的解决方案似乎都很明显——为您的机器学习过程提供一个可靠的 MLOps 管道。当这种情况发生在我们身上时,我们开始寻找一个能够开箱即用的提供商。经过几个月徒劳无功的调查,我们不得不自己构建它来适应这个用例。就像我提到的其他人一样。

它做它被设计做的事。但是我们会达到开源的程度吗?大概不会。

ML 实践的 CI/CD(图片由作者提供)

参考

</7-mlops-smells-that-tells-that-your-ml-process-stinks-2f389c3ebd11> https://aws.amazon.com/solutions/implementations/aws-mlops-framework/ https://cloud.google.com/solutions/machine-learning/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning https://azure.microsoft.com/en-ca/services/machine-learning/mlops/

为什么我们不像测试软件一样测试机器学习?

原文:https://towardsdatascience.com/why-dont-we-test-machine-learning-as-we-test-software-43f5720903d?source=collection_archive---------22-----------------------

行业笔记

让我们从现代软件测试中获得灵感,使 ML 模型更加健壮!自信地改进模型的新方法。

机器学习系统现在在我们的日常生活中无处不在,因此它们行为的正确性绝对至关重要。当一个 ML 系统出错时,它不仅会导致令人讨厌的在线体验,还会限制你的社会经济活动能力,甚至更糟的是,在你的车里进行危及生命的操作。那么,你有多确定一个已部署的 ML 系统经过了彻底的测试,并且你不是一个有效的测试用户呢?另一方面,您如何知道您开发的系统足够可靠,可以在现实世界中部署呢?而且即使当前版本在现实世界中经过了严格的测试,在更新了模型的一部分之后,你又怎么能确定它的整体性能没有退步呢?这些都是棘手的问题,根源在于我们试图以数据驱动的方式解决的问题的纯粹复杂性,以及我们如今正在构建的机器学习模型的规模。

在这篇博客文章中,我们将仔细研究面临类似问题的另一个领域——软件工程——那里采用的测试方法以及它们如何应用于 ML 测试。最终,在那篇文章结束时,我希望你会认真地问自己“为什么我们不像测试软件那样彻底地测试机器学习?”。并了解如何使用先进的软件测试方法来广泛测试模型,捕捉回归,并成为您的 ML 质量保证过程的一部分。下面你可以看到我和我的团队正在构建的持续改进管道图,它展示了如何在 MLOps 领域使用高级软件 QA 技术。

利用现有的模型和数据,我们可以将它们与预期的操作域配对,并在其中测试它们的稳健性。这将生成一个域覆盖估计和任何已经发现的失败数据样本。(图片由作者提供)

测试机器学习模型

迄今为止,用于评估 ML 模型的最广泛采用的策略依赖于已经收集的固定数据集,并且很少探索超过准确度、混淆矩阵和 F1 分数或其代理。更成熟的 ML 团队通常拥有更先进的测试管道,包括广泛的数据切片、不确定性估计和在线监控。

但是,众所周知,这些方法容易遗漏一些特殊情况,并且存在域转移和陈旧数据等问题。在访问几乎无限量的数据的限制下,这些广泛采用的方法将提供可靠的结果,但是当解决现实世界的问题和构建现实世界的系统时,情况就不是这样了。尽管测试和迭代会占用 ML 系统开发时间的 60-70 %,评估 ML 模型目前更多的是一门艺术,而不是标准的工程解决方案。

严格测试的问题在从软件工程到过程控制的其他领域都得到了很好的研究。那么我们能借什么呢?

极其关键的代码片段不仅仅被测试,而且被正式验证是正确的。这意味着该系统在理论上被证明在所有考虑的情况下都表现出正确的行为。虽然用于正式验证深度神经网络的算法正在积极开发中,但它们尚未扩展到现实世界的应用。然而,实际上,世界上只有极小一部分软件经过了正式验证。

然而,可能在生产中部署的每一个软件都使用从手工测试到单元和端到端测试的技术进行了测试。虽然最大化测试代码覆盖率是一种常见的方法,但对于数据驱动的系统,如基于 ML 的系统,需要更先进的测试技术。

软件质量保证和基于属性的测试

代码覆盖率可能是软件行业中最广泛采用的衡量一段代码测试好坏的方法。然而,很有可能实现 100%的代码覆盖率,但仍有特定的数据输入会破坏您的代码。

例如,假设我们已经编写了自己的除法函数“div(a,b)”来计算“a / b”。我们可以编写几个测试来确保“div(8,2)”和“div(7,6)”正确工作,并快速获得 100%的代码覆盖率。然而,我们急着写函数,完全忘记了除以 0 的情况。尽管如此,我们仍然实现了 100%的代码覆盖率!感觉有些不对劲。关键问题是代码覆盖率对于数据驱动的解决方案来说是不够的。现在几乎每一个软件都是数据驱动的!

这就是为什么更先进的技术已经在软件质量保证中使用了很长一段时间。一种流行的技术叫做基于属性的测试。关键思想是,您指定的规则必须在整个可能的数据输入集合(“数据域”)中始终保持正确(“属性”)。一旦你指定了这些规则,计算机会自动寻找违反指定属性的数据输入,从而违反你的假设。

如果我们要以基于属性的方式测试我们的“div(a,b)”函数,我们应该指定

  1. a ',' b '和结果' c '是实数(数据域)
  2. a = b * c '必须为真(属性)+

这些信息足以让计算机搜索极限情况,而且你可以肯定,现代的基于属性的测试框架,如假设或快速检查,在“b = 0”时几乎会立即找到极限情况。当这种情况发生时,由我们来决定是修复代码还是限制可能的输入集。重要的是,无论我们选择什么行动,我们都将把隐含的假设转化为明确的假设。

到现在为止,你一定想知道计算机是如何找到这些极限情况的。许多现代框架采用纯粹随机的数据生成,也许还带有一些启发来提高性能。虽然这对于测试很少接受超过 7-8 个输入参数的单个源代码函数很有效,但它肯定不适用于测试通常在高维空间中操作的整个机器学习模型。那么,我们如何将基于属性的测试引入机器学习呢?

+为了保持示例简单,我们省略了与数值精度相关的问题。

将基于属性的测试引入 ML

在讨论“如何”之前,让我们花点时间想想“为什么”。为什么要以基于属性的方式测试他们的 ML 模型?当前围绕固定支持数据集和数据切片的 ML 测试方法相当于基于覆盖的软件测试。但是正如我们在前面的“div()”函数示例中看到的,代码覆盖率对于基于数据的系统来说是不够的。因此,需要采用更先进的策略来测试我们的 ML 系统。

乍一看,由于输入数据的维度非常大,任何将基于属性的测试引入 ML 的努力似乎都是徒劳的。即使是玩具般的数据集 MNIST 的图像也存在于 576 维空间中。有 2576 个可能的图像,所以从实际角度来看,随机击中一个实际上代表一个数字的图像并打破你的模型是根本不可能的。但是有一些简洁的方法来描述数据集的图像。

运营领域与数据领域

想象一下,你的一个朋友或同事问你 MNIST 数据集包含哪种图像。你不会把它们描述成——“每张图像都是一个 576 维的二进制向量,属于一个覆盖手写数字的流形。”。你更可能会说一些类似“每张图片都包含一个随机旋转、大小和样式的手写数字”的话。

第一个答案描述了原始数据域,第二个描述了模型的操作域。当人们构建和测试 ML 模型来解决现实世界中的问题时,我们最终关心的是操作领域,而不是数据领域。想象一下,您必须通过描述您已经探索的原始数据空间的部分来说服监管机构您的 ML 解决方案已经过充分测试……虽然这可能是安全关键型应用所需要的,但分析应该始终从操作领域的角度出发。

事实证明,考虑操作域而不是原始数据域是将基于属性的测试引入 ML 的重要一步。操作域要小得多,推理起来也很直观。使用操作领域的语言来提出需求是非常容易的,比如“我的模型应该能够识别数字,而不管它的方向”或者“我的模型应该能够处理小的和大的数字”。

识别黑色背景上的手写数字是一个相对容易的问题,操作范围有点小。然而,对于我们倾向于用 ML 解决的许多现实世界的问题来说,情况并非如此。自动驾驶汽车的操作范围有多大?

搜索与随机抽样

自动驾驶汽车的操作域的大小,加上遵循长尾分布的罕见事件,使得随机抽样完全不切实际。因此,将基于属性的测试引入 ML 的第二步是将随机生成失败案例的问题转化为搜索问题。因此,基于目标属性的测试的想法恰好也是一种新兴的软件质量保证方法。为了实现这种转换,指定不仅仅是二进制假或真的属性,而是遵循从 0 到 1 的范围是很重要的。这一步对于各种 ML 问题是非常直观的,即使是离散的问题,比如分类,我们可以很容易地测量激活和它们与决策边界的接近程度。

在抽象级别上下移动

(图片由作者提供)

上图说明了操作数据域和原始数据域之间的差异,以及如何从一个域转移到另一个域,以便对 ML 系统执行基于属性的测试。重要的是,从给定的原始数据样本 x 到新的原始数据样本 x’有两条路径。第一条路径经过一个数据样本 x->measure->search->synthese->备选样本 x’功能极其强大。它允许在精确定义的操作域中进行搜索,而不用担心无效的数据样本将被用于模型的评估。然而,这些能力需要重要的步骤,例如‘测量’原始数据样本的各个方面,以便将其翻译成操作领域的语言,以及执行从操作领域中的点合成新的原始数据样本的逆步骤。

随着模拟器和深度生成模型的发展,合成在越来越多的现实世界问题中变得切实可行,但仍有一些问题尚未实现。这就是第二条路径 x - >域感知转换->x’发挥作用的地方。它类似于标准的增强技术,但是重要的方面是认识到转换通常在操作领域的级别上被参数化。例如,添加像素噪声是在低数据级别的变换,但是将运动模糊添加到由相机到场景的相对速度参数化的图像是在操作域级别的变换。因此,即使测量和综合不可行,也可以搜索整个操作域。

基于属性的 ML 测试的优势

以基于属性的方式测试 ML 模型不仅仅提供关于它是否破裂的信息,还可以提供对系统故障模式的深刻见解,以及提供可操作的人工产物,例如破坏您模型的新的看不见的数据样本的新数据集。

精确的鲁棒性评估

在确保不违反任何规范的同时,积极地在操作域中搜索故障区域,这不可避免地会对您的模型在操作域中的健壮性产生准确的评估。因为操作域是以人类可以理解的方式指定的,所以您可以快速了解失败案例背后的原因,并确定解决问题的措施。

新的看不见的故障数据样本

基于属性的测试的核心思想是生成违反测试的数据输入,这样你最终会得到新的数据样本,这些数据样本实际上会导致你的模型失败。这是一个非常有用的资源,因为您不仅可以近距离检查故障,还可以增强您的训练数据集,这将不可避免地提高模型的鲁棒性。它甚至可以监控新的输入数据,并通过与大量故障案例数据集进行比较,自动标记有问题的样本。然而,还有许多其他有用且有趣的用例!

迭代地构建一个 ML 系统,同时配备真正有代表性的健壮性分数和新颖的失败数据样本,不再是打地鼠问题,因为你可以仔细地跟踪回归并识别改进。最终,基于属性的测试框架使您和您的团队能够以前所未有的信心构建 ML 解决方案。

如果你对我们即将发布的关于将基于属性的测试应用于计算机视觉 ML 问题的博文感兴趣,记得订阅

关于作者

我是 Efemarai 的首席技术官兼联合创始人,这是一家早期初创公司,为测试和调试 ML 模型和数据搭建了一个平台。通过我们的平台,机器学习团队可以跟踪回归,监控改进,并满怀信心地交付他们的 ML 解决方案。

在硅谷和欧盟投资者的支持下,我们正在为人工智能世界带来质量保证,并释放出新的 ML 应用程序的寒武纪大爆发!

如果你想联系我们,请发邮件至 team@efemarai.com

为什么 DST 是数据工程噩梦?

原文:https://towardsdatascience.com/why-dst-is-a-data-engineering-nightmare-605a6044ce75?source=collection_archive---------8-----------------------

数据/管道所需的钻杆测试和处理概述

亚历山大·里恩在 Unsplash 上的照片

嘿伙计们!

所以,DST 或夏令时最近结束了,2021 年 11 月 7 日,那天我格外警惕,一直祈祷不要出什么事!在验证 DST 影响时,我想到了写一篇关于 DST 考虑事项的文章,这需要一年两次关注 wrt 管道、数据和作业。

另外,如果你不知道什么是夏令时,不要担心,我会在下面解释,相信我,这将是一个有趣的阅读:)

到底什么是夏令时或 DST?

夏令时是一种通过改变标准时间来确保白天有更多阳光的做法。

在初春的某一天(通常在三月),美国、加拿大和澳大利亚的时区开始采用夏令时。

也就是说,时钟向前拨一小时,一天中跳过一小时。到了那一天,一天将只有 23 个小时而不是 24 个小时,而这就是我的朋友,作为一名数据工程师的麻烦开始了,事实上,除了我以外的任何管道所有者都会遇到这一点。

今年,夏令时从 3 月 14 日开始。

DST 日的美国东部时间 wrt UTC 示例(时区,伙计!):

演职员表:【https://www.worldtimebuddy.com/

如果您仔细观察,会发现第 2 小时被跳过,时钟被向前拨。所以在三月,一天会有 23 个小时。在春季和夏季,夏令时导致白天更多的光照,当冬季到来时,时间需要再次标准化。(因为冬天我们晚上很早,夏令时有什么意义呢?)

冬天开始时,DST 结束,时钟被重置为标准时间,这发生在今年的 11 月 7 日,这一天将有 25 个小时:

演职员表:https://www.worldtimebuddy.com/

如果你仔细观察,夏令时结束时,凌晨 1 点发生了两次,所以一天有 25 个小时,但仍然有 24 个小时(再读一遍)。

好了,已经非常详细地解释了什么是夏令时,让我们来谈谈为什么它很糟糕!(是的,我说了)

夏令时如何影响数据?

当夏令时开始(3 月)和结束(11 月)时,在那些日子里,一天不会有标准的 24 小时。因此,在那些日子里,任何标准的处理、检查或比较都可能不起作用。下面列出了一些影响场景:

让我们从数据质量检查开始,假设您对原始数据进行检查,每天应该有 24 小时,否则数据被认为是“坏”的,即如果一天只有 24 小时的数据,那么它将被处理/质量良好/完整。

现在,当 DST 开始时,如上所述,一天将有 23 个小时,这样的 24 小时数据检查将失败。为了处理这个问题,可能需要进行特殊处理。

数据质量故障的另一个例子是“丢失数据警报”,或者当某个小时的数据丢失时发送警报。在 DST 开始的那一天,警报可以发送 2 小时(跳过这一小时),可能需要特殊处理。

阈值检查通常是在数据量超过某个值时发送的警报,现在,在 DST 结束的当天,凌晨 1 点的数据实际上将包含两个小时的数据(为了清楚起见,请再次参见上图),全天将包含 25 个小时的数据,因此再次对计数/数据量等进行阈值检查。可能会失败,需要特殊处理。

我想我已经把你吓得够呛了,现在让我们讨论一些可能需要的逻辑和报告处理。

如果您的逻辑需要前一个/后一个小时的数据来进行任何计算,则需要对 DST 开始和结束日进行特殊处理,以便在凌晨 1 点后的 3 月份,凌晨 3 点是下一个小时,而不是凌晨 2 点。同样,在 11 月,凌晨 1 点也是凌晨 1 点后的下一个小时。

此外,对于 11 月的这 25 个小时,您在任何报告中进行的任何比较,如一小时一小时的比较、一天一天的比较,都可能会显示更高的数字(,除非您决定放弃一个小时的数据,但不建议这样做

另一个影响领域是时间安排影响。如果您计划特定时区的作业/管道,则 DST 计划或 SLA 时间可能会受到影响。一定要仔细检查。

我的建议是,如果不需要,不要在特定的时区运行管道,而要在 UTC 运行。对于最终的可交付数据,当然要进行时区转换,但至少在所有地方,UTC 总是一致的。

嗯,就这样吧!这是我现在能想到的所有影响。如果您有任何其他我没有注意到的考虑因素或影响,我很乐意知道。请留下你的评论。

希望这有所帮助!

快乐编码,
JD

为什么边缘计算对人工智能如此重要

原文:https://towardsdatascience.com/why-edge-computing-is-so-important-for-ai-e4695d4e7960?source=collection_archive---------36-----------------------

每个人都在谈论人工智能。当你在手机上问 Siri 今天天气如何时,你会看到它;当你需要到达目的地的最佳路线时,你会在谷歌地图上看到它;当你在为你推荐的产品之间滚动时,你会在亚马逊上看到它。

照片由 Unsplash 上的尼克·费因斯拍摄

然而,人工智能并不是独立存在的。我们通常使用底层技术来实现它。就在这些天,范式正在离开一种进化,这种进化将把人工智能带到一个更安全、更便宜的地方。让我们看看是关于什么的。

并非所有闪光的都是金子

虽然人工智能的势头越来越大,但云计算已经成为其发展的核心部分。然而,这种方法具有挑战性,因为基于云的人工智能系统在数据中心运行其核心人工智能算法。设备和数据中心之间持续的信息传输是一种可行的方法,但对于一个强大的人工智能系统的集成来说,它固有地涉及一些问题。

照片由 Denys NevozhaiUnsplash 上拍摄

延迟是下一个问题。使用远程数据中心的产品必须发送数据,并在接收结果之前等待数据被处理。由于互联网连接不是即时的,因此总会有最小的延迟,这种延迟会因流量而异。此外,随着网络上用户数量的增加,系统的延迟也会增加。这个问题可能会导致产品无法正常响应。

云计算的中心地位带来了另一个问题。敏感信息被发送到一个未知位置,该位置可能会被未授权人员访问。亚马逊的 Alexa 可能会在客户不知情或不同意的情况下记录对话并存档,从而使许多有权访问数据或人工智能系统的亚马逊员工能够访问它们。

我想在边缘上做!

边缘计算是正义的捍卫者,穿着闪亮盔甲的骑士。凭借其超能力,Edge 解决了人工智能在云上产生的所有问题。

边缘计算将 AI 的执行从数据中心转移到设备上。虽然训练通常不在本地执行(因为这是一项复杂且昂贵的任务,并且仍然需要使用云资源),但是模型的推理可以在本地执行

这也立即解决了延迟问题。AI 模型在数据可用时被处理,这可以显著减少执行时间。边缘计算无需等待设备建立互联网连接、发送数据、等待数据中心处理数据并将结果返回给设备以获得响应,而是在本地执行整个过程,减少了互联网连接需求,从而减少了延迟。

边缘计算的使用也将潜在的敏感信息保存在本地设备上,因为数据中心并不用于处理信息。

埃斯特万·洛佩兹在 Unsplash 上的照片

然而,所有的超级英雄都有弱点。虽然氪星石削弱了超人和超女,但边缘设备的计算能力惊人地有限。

幸运的是,大玩家已经在构建具有良好计算能力的边缘设备方面做了大量工作,而这仅仅是个开始!

单身但从不孤独

Vagelis LnzUnsplash 上拍摄的照片

让我通过提及一些具有巨大人工智能潜力的小型计算机来结束这场讨论。NVIDIA Jetson Nano 和 Raspberry Pi 4 是两款功能极其相似的单板电脑(SBC)。虽然它们采用 ARM 处理器,分别采用四核 ARM Cortex-A72 64 位@ 1.5 GHz 和四核 ARM Cortex-A57 64 位@ 1.42 GHz,但这两种主板之间的最大区别是 NVIDIA Jetson Nano 包括更高性能、更强大的 GPU。NVIDIA 主板包括一个 Maxwell 微体系结构,具有 128 个 CUDA 内核@ 921 Mhz。CUDA(Compute Unified Device Architecture 的缩写)是英伟达创建的并行处理硬件架构,软件开发人员可以在其上编写能够在英伟达显卡的 GPU 上执行并行计算的应用。这被证明是人工智能计算的一个巨大优势,尤其是在进行推理方面。

光明的未来

边缘计算正迅速成为人工智能的颠覆性工具,几乎成为事实上的标准。因此,由于可穿戴计算的推动,单板计算机每天都有新的惊人功能诞生。这种变化会把我们带向何方?TinyML 就在眼前,用不了多久它就会变得更加普及。

为什么消除人工智能系统中的偏见如此困难

原文:https://towardsdatascience.com/why-eliminating-bias-in-ai-systems-is-so-hard-97e4f60ffe93?source=collection_archive---------25-----------------------

每当我们决定使用什么数据集,选择什么特征,或者如何微调我们的模型时,我们的偏见就会发挥作用。其中一些是中立的,甚至可能是良性的——专业知识也是一种偏见。另一些则具有潜在的歧视性和有害性;我们如何确保这些人置身事外?

简而言之,这非常非常困难。在本周的变量中,我们从这个问题上的三个杰出贡献开始——让我们开始吧。(寻找其他,更技术性的话题?请继续阅读:我们也为您提供保险。)

  • 了解在 ML/AI 管道中引入偏差的风险 。正如 Sheenal Srivastava 在这个全景概览中解释的那样,当我们谈论偏见时,我们实际上想到了多种偏见 es ,每种偏见都以不同的方式影响着我们的项目、工作流程和结果。Sheenal 为我们提供了一个全面的路线图,用于识别、解决,并随着时间的推移,从一开始就防止它们发挥作用。
  • 探索最有效的方法,确保你的模型是可解释的 。许多偏见对话的核心是可解释性的问题——或者说缺乏可解释性:如此多的人工智能模型和人工智能系统之所以能够工作,仅仅是因为有一个不透明的过程将输入和输出分开。Divya Gopinath 分享了一个可解释技术的分类法,可以帮助实践者根据上下文和他们的特定需求选择正确的方法。

Mick Haupt 在 Unsplash 上拍摄的照片

除了这些关于偏见及其后果的重要讨论之外,在过去的一周里,我们还发布了几十个指南和教程。这很难选择(总是如此),但这里有三个我们认为你可能会特别喜欢的。

  • 利用您的数据和 Python 技能解决供应链问题 。这些天来,关于产品短缺和运输延迟的讨论无处不在。然而,正如 Will Keefe 所展示的,当涉及到建模需求和约束、准备和安排生产周期以及可视化和交流计划时,您的 Python 知识可以成为一个重要的差异制造者。
  • 让同事和利益相关者能够充分利用他们自己掌握的数据 。许多在行业中工作的数据科学家发现,他们花了太多时间为不太懂数据的同行提供基本的数据见解。姚文玲坚持认为有一个更好的方法:培训内部用户成为有效的数据消费者,甚至是数据创造者。
  • 对过度拟合(及其重要性)有了更细致的了解。 Klas Leino 的帖子对过度拟合提供了清晰而有用的指导,特别是在深度学习的背景下。Klas 向我们介绍了 TruLens 库,并展示了它如何帮助我们避免不健全功能的缺陷,并增加我们对模型在未来未知数据上的性能的信任。

我们希望你喜欢这个星期和我们一起度过的时光!如果你想支持我们作者(和我们)的工作,今天就考虑成为一名中级会员

直到下一个变量,
TDS 编辑器

我们策划主题的最新内容:

入门

实践教程

深潜

思想和理论

为什么 ETL 需要开源来解决集成的长尾问题

原文:https://towardsdatascience.com/why-etl-needs-open-source-to-address-the-long-tail-of-integrations-5394c058c326?source=collection_archive---------23-----------------------

去年,我们的团队采访了 200 多家公司,了解他们的数据集成用例。我们发现的是,2021 年的数据整合还是一塌糊涂。

不可逾越的现状

在 200 次采访中,至少有 80 次采访了现有 ETL 技术的用户,如 Fivetran、StitchData 和 Matillion。我们发现他们每个人都在构建和维护他们自己的连接器,即使他们使用的是 ETL 解决方案(或者 ELT 解决方案——为了简单起见,我只使用术语 ETL)。为什么?

我们发现了两个原因:

  1. 连接器的不完全覆盖
  2. 围绕数据库复制的重大摩擦

无法满足所有连接器需求

许多用户的 ETL 解决方案不支持他们想要的连接器,或者支持但不是以他们需要的方式。

举个例子:Fivetran 已经存在了八年,支持 150 个连接器。然而,仅在 martech 和 adtech 这两个领域,就有超过 10,000 种潜在连接器。

ETL 最难的部分不是构建连接器,而是维护它们。这是昂贵的,并且任何闭源解决方案都受到 ROI(投资回报)考虑的限制。因此,ETL 供应商关注最流行的集成,然而公司每个月使用越来越多的工具,连接器的长尾被忽略了。

因此,即使使用 ETL 工具,数据团队仍然要投入大量的金钱和时间来构建和维护内部连接器。

无法解决数据库复制用例

大多数公司将数据存储在数据库中。我们的采访揭示了现有 ETL 提供的数据库连接器的两个重要问题。

  1. 基于容量的定价:数据库非常庞大,并且服务于不断增长的数据量。拥有数百万行的数据库,目标是服务于数亿行,这是常见的情况。当前 ETL 解决方案的问题是基于数量的定价。员工只需点击一下鼠标,就可以轻松复制一个数百万行的数据库。而这个简单的点击可能要花费几千美元!
  2. 数据隐私:随着当今对隐私和安全的关注,公司越来越重视对数据的控制。现有 ETL 解决方案的架构通常会将数据从公司的私有云中提取出来。闭源产品阻止公司仔细检查底层 ETL 代码/系统。能见度降低意味着信任度降低。

这两点解释了为什么公司最终要建立额外的内部数据库复制管道。

无法随数据扩展

上面提到的关于基于数量的定价和数据隐私的两点也适用于公司规模。对于公司来说,拥有一个内部的数据工程师团队来构建 ETL 解决方案中维护的完全相同的管道变得更加便宜。

为什么开源是唯一的出路

开源解决了上面提到的许多问题。这就是开源带给我们的。

  • 定制的权利:访问并能够根据自己的需要编辑代码是开源软件带来的一项特权。例如,如果 Salesforce 连接器缺少您需要的一些数据,该怎么办?有了开源,这样的改变就像提交代码改变一样简单。支持票上不再有长线程!
  • 解决连接器的长尾问题:您不再需要说服一个专有的 ETL 提供者您需要的连接器是值得构建的。如果您需要一个比平台开发速度更快的连接器,您可以自己构建它,并在大型用户社区的帮助下维护它。
  • 与数据工具和工作流更广泛的集成:因为开源产品必须支持各种各样的堆栈和工作流,用于编排、部署、托管等。,您更有可能找到对您的数据堆栈和工作流的现成支持(基于 UI、基于 API、基于 CLI 等。)和一个开源社区。其中一些,如 Airbyte 的开源气流运营商,是由社区贡献的。公平地说,理论上你可以用闭源方法做到这一点,但是你可能需要从头开始构建很多工具。
  • 调试自治:如果您遇到任何连接器问题,您不需要等待客户支持团队回复您,也不需要等待第三方公司优先考虑您的修复。您可以自己解决问题。
  • 现成的安全性和隐私合规性。如果开源项目足够开放(MIT,Apache 2.0 等。),任何团队都可以通过在其基础设施中部署开源代码来直接解决他们的集成需求。

连接器开发套件的必要性

但是,开源本身不足以解决数据集成问题。这是因为创建一个强大且功能齐全的连接器的门槛太高了。

例如,考虑一个从 REST API 提取数据的脚本。

从概念上讲,这是对数据库中的一些数据进行简单的“SELECT * FROM entity”查询,可能带有“WHERE”子句,以便根据某些标准进行过滤。但是任何编写过脚本或连接器来持续可靠地执行这项任务的人都知道这要复杂得多。

首先是身份验证,它可以像用户名/密码一样简单,也可以像实现整个 OAuth 流程一样复杂(并安全地存储和管理这些凭证)。

我们还需要维护脚本运行之间的状态,这样我们就不会一遍又一遍地重读相同的数据。

之后,我们需要处理速率限制并重试间歇性错误,确保不要将它们与无法重试的真正的错误混淆。

然后,我们希望将数据转换成适合下游消费者的格式,同时执行足够的日志记录,以便在事情不可避免地出错时修复问题。

哦,所有这些都需要经过良好的测试,易于部署…当然,昨天就完成了。

总而言之,目前构建一个新的 REST API 源连接器需要几天的时间。这种进入壁垒不仅意味着社区创建的连接器更少,而且通常意味着连接器质量更低。

然而,我们认为 80%的困难是偶然的,并且大部分可以自动消除。缩短实现时间将极大地帮助社区做出贡献,并解决连接器的长尾问题。如果这种自动化以一种聪明的方式完成,我们也可能能够提高标准化,从而对所有连接器的维护做出贡献。

连接器开发工具包是什么样子的

让我们从一个不同的角度再次看看构建连接器所涉及的工作。

附带复杂性:

  • 设置包装结构
  • 将连接器封装在 Docker 容器中并建立释放管道

大量重复的逻辑:

  • 为每种连接器类型(REST APIs、数据库、仓库、Lakes 等)重新设计相同的设计模式和代码结构。)
  • 编写相同的帮助器,用于将数据转换为标准格式、实现增量同步、日志记录、输入验证等。
  • 测试连接器是否正确遵守协议。

测试快乐流和边缘案例。

你可以看到很多都可以自动化,并且你会很高兴知道 Airbyte 已经提供了一个开源连接器开发工具包(CDK)来完成所有这些。

我们相信,最终,打造数以千计高质量连接器的方法是在洋葱层中思考。为了与 devo PS/基础设施中众所周知的宠物/牛概念进行比较,连接器是牛代码,您希望在它上面花费尽可能少的时间。这将极大地提高生产率。

抽象为洋葱层

最大限度地利用高杠杆工作会引导您构建具有洋葱式结构的架构:

来源:作者

该中心定义了 API 的最低级别。在那个级别实现一个连接器需要大量的工程时间。但它是非常复杂的连接器的逃生出口,需要大量的控制。

然后,构建新的抽象层,帮助快速处理连接器系列。例如,源具有特定的接口,而目的地具有不同种类的接口。

  1. 用于编写源连接器的 Python 框架
  2. 快速开发 HTTP APIs 连接器的通用实现
  3. 一个测试套件,用于测试是否符合 Airbyte 协议和 happy 代码路径
  4. 用于引导开发和打包连接器的代码生成器

然后,对于源,您有不同的种类,如基于 HTTP-API 的连接器和数据库。HTTP 连接器可以分为 REST、GraphQL 和 SOAP,而数据库可以分为关系数据库、NoSQL 数据库和图形数据库。目的地可以分成仓库、数据湖和 API(用于反向 ELT)。

CDK 是这些抽象的框架!

什么是已经可用的

Airbyte 的 CDK 仍处于早期阶段,因此预计随着时间的推移会有很多改进。如今,该框架具有以下特性:

最终,CDK 能够在两个小时内构建强大的全功能连接器,而以前需要两天。

Airbyte 团队一直在内部使用该框架开发连接器,这是我们开发 70 多个连接器的经验的顶峰(我们的目标是在用户社区的帮助下,到今年年底开发 200 个连接器!).我们从自身经验和用户社区中学到的一切都将用于改进 CDK。

结论——未来

将构建一个新连接器所需的时间缩短到 10 分钟,并扩展到越来越多的可能集成系列,这不是很好吗?这是怎样的一个登月计划!

如果我们能够和我们的用户社区一起做到这一点,那么最终集成的长尾问题将会很快得到解决!更不用说数据集成管道将通过开源被商品化

如果你想参与进来,我们希望你加入我们的 Slack 社区——围绕数据集成最活跃的社区——因为我们为了所有人的利益连接到开源的未来!

最初发布于https://airbyte . io

为什么欧洲的数字经济将很快脱离数据池

原文:https://towardsdatascience.com/why-europes-digital-economy-will-soon-swim-without-data-pools-37d0776b3b3b?source=collection_archive---------38-----------------------

未来我们希望如何规范数据的开放获取?

亨特·哈里特在 Unsplash 上的照片

欧洲的多样性是一种巨大的力量。另一方面,非洲大陆的分裂是其最大的弱点,这种分裂往往仍然普遍存在。在数字化时代,这成为一个巨大的负担。毕竟,美国和中国的科技巨头有什么共同点呢?仅仅因为他们庞大的规模和国内市场的人口,他们就拥有一个几乎取之不尽的数据库。所有这些都在一个统一的法律、文化和语言领域。在一个“万物互联”的世界里,一切都是相互联系的,这些优势被进一步放大。

这些天我们讨论了很多人工智能的用途和潜力。凭借其人工智能战略,德国政府希望为德国和欧洲成为世界领导者铺平道路。人们在谈论人工智能时代的数字基础设施、研究网络和合格员工。给人的印象往往是,人工智能的发展要想成功,掌握算法就够了。然而,在现实中,人工智能随着高质量数据的可用性而起伏不定——而这正是目前所缺乏的。

囤积数据还不是一种商业模式

数据集在各种各样的公司和组织的筒仓中处于休眠状态,我们在全国和各地区存储它们,我们甚至还没有充分利用其中的许多数据。例如,在德国,这适用于机器数据。问题的关键在于,囤积数据不会产生商业模式。与此同时,在这个古老的大陆上,许多创新的商业模式没有发挥出它们的潜力,因为要么缺乏数据,要么无法获得数据。

“在特拉维夫的另一次谈话中,一名前谷歌员工告诉我们,他原本想在加州开创自己的事业。然而,他决定在中国建立自己的创业公司,因为在那里,例如,他可以毫不费力地获得数据来输入他的人工智能。因此,他可以访问来自中央卫生系统的超过 1 亿份病历。这在美国是不可想象的,在欧洲是不可能的。”
出自我的书《数字化主义——数字化时代新社会形态的乌托邦》。

欧洲的数字经济不断受到欧洲地图碎片化的威胁,而不是受益于其多样性。跨境和跨行业的开放数据池可能是一条出路,通过这种方式,政府、组织和公司可以相互提供数据。通过通用数据保护条例(GDPR) ,我们欧洲人给自己制定了一套清晰的规则,并定义了我们希望如何处理和保护数据。但我们还没有就数据如何成为我们未来价值创造不可或缺的一部分达成一致。因此,我们建立了一套不使用的规则,但没有使用的规则。

照片由约书亚·索蒂诺Unsplash 上拍摄

欧盟委员会已经认识到对欧洲数据池的需求及其数字战略。然而,这种计划缺乏具体的执行,如果没有所有参与者的鼓励和信任,这些计划从一开始就注定要失败。在我看来,在许多公司,共享数据和开放数据孤岛并不是理所当然的事情,这也与数据是 21 世纪的石油这一普遍观点有关。但是这种形象,不管用得多频繁,都是误导性的,甚至根本就是错误的。数据不是有限的资源;数据不会被用完,更不用说被消费了。不缺少数据,但缺少访问和可用性。相反,数据是新商业模式的沃土。但欧盟最肥沃的土地仍被封锁或闲置。由数据受托人管理的数据池可以在这里发挥作用。

柏林、布鲁塞尔——请便!

当然,对彼此的相互信任和对这一理念的相互信任是不能被支配的。这就是为什么政治家应该树立一个好榜样。毕竟,很少有其他组织像我们所有的政府机构和办公室,或它们的各种国家机构和团体那样拥有如此广泛的数据。公共交通、水和能源公司也可以向公众公开他们的数据。这同样适用于医疗机构,甚至是公共研究机构。政治家们已经将开放数据的政策强加给自己,但是缺乏一致性。

克里斯多夫·伯恩斯在 Unsplash 上拍摄的照片

我相信,如果我们使用所有这些数据集,并成功打破公司和人们头脑中的孤岛,我们将能够开发出与人工智能时代相关的技术解决方案。许多人可以通过合作一起创造一些一个人无法单独完成的事情,这种想法是一种深深的欧洲观念。这是欧盟的创始理念之一。在 AI 时代,我们应该记住这一点。通过联合力量和联合数据,欧洲的数字经济可以成长为一个巨人。如果我们都学会相互信任,把机会放在我们创业和政治行动的中心,那就没什么好害怕的。所以,让我们成为巨人吧!

为什么每个数据科学家都应该有冒名顶替的想法

原文:https://towardsdatascience.com/why-every-data-scientist-should-have-imposter-thoughts-bdcbdb0e5578?source=collection_archive---------49-----------------------

自我怀疑会有一些好处

冒名顶替综合征是指尽管取得了成功或成就,但有人一直怀疑自己的能力。与之相反的是邓宁-克鲁格效应,在这种效应中,能力低下的人对自己的能力过于自信。找到自信和技能之间的平衡很重要,但有时有很好的理由产生冒名顶替的想法(而不是完全的冒名顶替综合症)。 Basima Tewfik 对医生、投资分析师和 ROTC 学员进行了研究,发现冒名顶替的想法有助于激励人们掌握技能,并改善工作中的人际关系表现。总体结果喜忧参半,但发现了这些冒名顶替思想的积极用例。

由作者用 R. Image 中的 networkD3 包创建

对于数据科学家来说,很容易将自己与他人进行比较,并认为尽管你学习了编程、统计等更多知识,但你不配拥有这个头衔,因为其他人做得更多。如果你有这些想法,你可能是正确的。

作者截图

(截至 2021 年 3 月)媒体上有 119,000 篇带有数据科学标签的文章。之前的分析显示,平均每篇文章 3.3 分钟,仅在介质上就产生了大约 272 天的数据科学阅读材料。这有点奇怪,因为在他们的工作领域没有人会阅读所有的文章,但数据科学有些不同,因为专业化不一定对一个人的数据科学职业生涯有利。

你应该时不时地对自己的知识广度产生错觉;否则你的知识可能会过时。

在过去的一年里,我专注于模型可解释性技术和模型偏差分析。大多数相关研究不到 5 年,大多数有用的开源包不到 3 年,并且每年更新多次。因此,尽管我在 2017 年参加了研究生课程,但除了线性回归系数和总体变量重要性图之外,我对模型解释能力的了解有限,因为当时文献很少。为了抵消我的冒名顶替的想法和疑虑,我做了以下事情:

  • 花时间阅读文章,享受学习新概念的过程(亚当·格兰特在他的书中讨论了犯错的快乐
  • 开始与其他同事讨论数据科学,并定期召开会议讨论与特定项目无关的数据科学
  • 一旦完成对一个模型偏差的分析,我们得出结论,该报告尽我们目前的能力评估偏差,但随着新的文献出现和我们能力的提高,我们将继续评估偏差

数据科学的知识库快速增长,数据科学的工具库快速增长。许多有抱负的数据科学家问“我应该为数据科学学习什么编程语言?”虽然 python、R 和 SQL 在过去的十年里仍然是顶级编程语言,但是还有许多其他语言可能需要成为你的工具包的一部分。你可能需要学习 ETL 工具、管道工具、机器学习特定编程语法、大数据工具,或者可视化软件。一些公司是“谷歌商店”、“微软商店”、“AWS 商店”,或者另一种类型的“商店”,其中使用的大多数工具和产品来自一家公司。

你应该对你的数据科学技能有冒名顶替的想法;否则,您可能会掌握过时工具的技能。

在一家公司,当我听说我们要采用 Hadoop 时,我主动要求用它做额外的项目。我的动机一部分是出于真正的兴趣,另一部分是出于恐惧。我知道,如果我不具备这种技能,我未来的晋升或其他工作的前景都会受到限制。当我们采用 Teradata Aster 时,也发生了同样的过程。冒名顶替的想法激发了我学习新技能的动力,最终帮助我找到了一份数据科学家的工作。最近,我担心我没有做足够的工作来学习新的技能,这些技能可能会在未来与我的工作相关。

冒名顶替思想可以用于激励,可以用于自我和整体评价。一个冒名顶替者认为“我的工作无关紧要”的想法可以转化为“什么工作重要?”或者“我怎样才能最好地利用我的时间?”

你应该对你工作的重要性有错误的想法;否则,你可能不会优先考虑最重要的工作。

我喜欢听到图像处理神经网络的最新进展,但我的大部分工作都没有涉及任何图像。有时我觉得自己是一个失败的数据科学家,不擅长图像处理的机器学习和学习最新的发展。当我想到这些想法时,我会做以下事情:

  • 我承认这不是我目前工作的重点
  • 我定义了我在图像处理之前优先考虑的其他工作
  • 我不排除将来继续这样做的可能性

我没有学习图像处理,而是专注于以下几个方面:

  • 能够向没有数据科学背景的人解释数据科学工作
  • 展示数据科学项目的投资回报率,以及如何将它们与备选基准进行比较

判断改进可能会令人沮丧,因为这些是软技能,但它们对当前业务更重要。

如果你曾经觉得自己是数据科学领域的骗子,你并不孤单。试着用这些想法作为动力,同时保持平衡,不让冒名顶替的想法伤害你的生产力和精神健康。

这篇文章的灵感来源于:
扶手椅专家播客插曲与亚当·格兰特
心态作者卡罗尔·德韦克

脚注:
一个替代方案是零怀疑地学习 COBOL,并且相信系统变化缓慢。这个策略可能会奏效

为什么每个数据科学家都应该关注加密

原文:https://towardsdatascience.com/why-every-data-scientist-should-pay-attention-to-crypto-39b4c25ff319?source=collection_archive---------6-----------------------

提示:事情不是你想的那样

Zoltan·塔斯Unsplash 上的照片

与你可能会想的相反,我在这里不是要告诉你,你可以使用机器学习来找出哪个由迷因启发的加密令牌即将爆发,或者你可以使用基于深度学习的交易策略来生成大量的阿尔法。这些事情可能是真的,但这不是我个人对 crypto 感到兴奋的原因,也不是我认为你也应该兴奋的原因。我的兴奋源于三个事实:

  1. 加密正成为消费产品越来越重要的平台
  2. 分散的加密应用程序创建了大量精细的、可验证的和公开可用的数据
  3. 有效利用这一数据资产是实现加密潜力的关键

我相信这将为加密社区的数据科学专业知识创造一个巨大的机会。

术语的快速注释

本文中的 Crypto 特指分散的、支持智能合约的区块链,以及建立在这些区块链之上的应用程序。以太坊和索拉纳·区块链就是这种加密生态系统的著名例子。值得注意的是,比特币区块链并非如此,因为在构建智能合约应用时,它的功能有限。如果这听起来对你来说很陌生,我所指的简单心智模型是一个生态系统,其中区块链充当分布式计算后端,其状态由网络上参与者的共识驱动,这些后端通过智能合约用于构建面向用户的应用程序。

加密正成为消费产品越来越重要的平台

当观察加密空间时,很难不把令牌价格的剧烈波动和无数由迷因激发的项目视为一个没有实际价值的巨大投机赌场。在某种程度上,这是真的。然而,这分散了我们对底层技术的注意力,而底层技术具有巨大的潜力来实现下一代消费者应用。正如许多人比我更雄辩地指出的那样,区块链支持的去中心化应用程序可能为我们今天拥有的消费应用程序相关的许多问题提供有效的解决方案。特别是,少数强大的平台,如脸书和谷歌,对消费者的数字生活拥有有效的垄断控制。他们可以选择以相当任意的方式进行审查,为自己的利益服务——甚至损害用户的利益。他们还从生态系统中攫取了几乎所有的经济价值,牺牲了创造大部分价值的参与者的利益。

分散式区块链网络提供了一个分布式计算框架,任何人都可以使用它来构建面向消费者的分散式应用程序,从而实现了一个不同的范例。这些应用程序,也称为 dApps 或智能合同,在区块链上透明地运行和执行,并提供框架来消除中间人,并将治理和经济价值放回参与生态系统的消费者和生产者手中。

如果这听起来像是一个遥不可及的理想,那它在今天基本上就是了。仍然有许多性能、治理和简单的实现问题需要解决。这个网站提供了一个有趣的视角,展示了构建加密应用的各种失败尝试。然而,它也不可否认地获得了牵引力,许多 dApps 实现了真正令人印象深刻的规模和在各种消费领域的采用。例如

  1. Uniswap ,以太坊区块链的一个分散式交易所,允许用户在没有集中做市商或集中平台托管资产的情况下交易加密货币。截至本文撰写之时,它每天的交易额约为 15 亿美元,约为比特币基地中央加密货币交易所[4]的 40%,该交易所可以说是美国最受欢迎的加密货币交易所。
  2. Opensea ,一个主要在以太坊和多边形区块链上运营的市场,允许用户发现和交易 NFT(独特数字资产的所有权)。2021 年 8 月,约 22 万用户交易了总价值约为 35 亿美元的 NFTs。为了提供一个相对的规模感,Etsy 和 EBay 在整个 Q2 2021 年分别完成了约 10 亿美元 3B 和 2 20 亿美元总交易额[6]。单看 8 月份,Opensea 已经超过 Etsy,规模大约是 EBay 的一半,这对任何市场来说都是令人印象深刻的,不管是不是去中心化的。

这些应用程序,以及许多其他应用程序,如音乐领域的 Audius 和游戏领域的 Axie Infinity ,显然正在拓展消费产品的界限。我甚至认为,它们中的许多已经是重要的消费产品,拥有大量忠实的用户基础,尽管它们有许多粗糙的边缘。我们仍处于采用和增长曲线的起点,随着区块链技术的不断改进,我相信我们会看到越来越多的这种分散式消费产品出现并蓬勃发展。

分散的加密应用程序创建了大量精细的、可验证的和公开可用的数据

与传统应用程序相比,分散式应用程序的一个非常显著的特征是它们的数据耗尽。由于区块链技术的性质,许多最重要的用户操作都被透明地记录在区块链账本上。以 Uniswap 为例,人们可以很容易地看到每一笔加密货币交易的细节,就像这样

一笔 uniswap 交易,在 Etherscan 上用约 0.386 以太币兑换了 1,199 枚 NWC 代币

…人们还可以看到何时创建了特定的交易对,以及有多少流动性可用于交易。

在 Etherscan 上创建 Eth-NWC 交易对库

实际上,Uniswap 产品中的每一项创造价值的活动都是公开和透明的,因为它们正在发生,对于任何知道在哪里和如何寻找的人来说都是如此。这些记录也是可独立验证的,并且在块确认之后不能(或者难以置信地难以)被任何人更改。这适用于构建在区块链上的所有分散式应用程序,不管经济活动的单位是什么。可以是一笔交易,也可以是一首歌的流,甚至可以是游戏中某个头像的一击。这代表了一种与我们今天所知的产品截然不同的范式,在我们今天所知的产品中,你最多只能从上市公司获得汇总指标,在后的四分之一价值创造活动已经发生。而在私人公司的情况下,通常根本没有可见性。

随着越来越多的加密消费者应用程序获得牵引力,越来越多的公开数据将从根本上改变下一代产品的竞争和运营方式。

有效利用这一数据资产是实现加密潜力的关键

想象一下,如果 Robinhood 的所有粒度交易数据都是公开的。那意味着什么?这将损害罗宾汉的订单流付费商业模式,该模式占其收入的绝大部分。同样,对于脸书的消费者数据来说,如果它是公开的,他们将无法像今天这样赚钱。

如果我们认真思考这个问题,我们今天使用的许多平台公司通过消费者和生产者对数据和分销渠道的专有访问权从中渔利。一个透明的数据生态系统,就像 dApps 在区块链建立的那样,几乎不可能以这种方式进行寻租。这仅仅是因为任何拥有适当专业知识的人都可以访问这些数据,使用这些数据来发现这样一个事实,即一些产品或服务提取的价值超过了它提供的价值,并建立一个更好的替代方案来获取这些价值并消除低效率。这类似于股票市场中的套利概念,在股票市场中,由于相当透明和标准化的数据,每一个免费赚钱的机会都将被利用和消除。我认为,如果在消费者应用领域这是真的,我们实际上会有更大的责任,更公平的竞争,更好的产品,以及对消费者和生产者更公平的价值分享。

如果所有这些听起来很抽象,请允许我提供一个更具体的例子。NFT 加密交易所 OpenSea 的首席产品官最近被要求辞职,因为 OpenSea 的一个用户发现,在 OpenSea 在其网站上推广 NFT 之前,他通过购买 NFT 不公平地获利[7]。对于 OpenSea 和更广泛的加密应用生态系统来说,这无疑是一个成长的烦恼。然而,这也是一个深刻的,尽管很小的例子,说明了数据透明如何导致对坏人的问责,否则他们就会逍遥法外。一个有事业心的人,不管她是否意识到,做了一些出色的数据科学来弄清楚发生了什么,并敲响了警钟。这些数据的用途不仅限于发现坏演员。由于对每一个 NFT、Opensea 平台上的每一笔交易以及交易机制在区块链上是如何实现的有了充分的了解,如果 Opensea 不能为其收取的费用提供足够的价值,就很有可能创造出竞争对手的产品。这就产生了一种问责机制,确保消费者的利益得到照顾。当然,这一切都取决于对数据资产的有效理解和利用。

作为一名数据科学家,这感觉非常令人兴奋,就像某种潜在范式转变的开始。很明显,数据透明是羽翼未丰的加密生态系统的一个关键特征,也是帮助平台真正更好地为消费者服务的一个重要工具。数据科学从业者将有机会甚至有责任创造这种新的透明度和问责制范例。只有让加密数据变得更容易访问和标准化,我们才能利用这些见解来帮助构建未来。

在接下来的几篇文章中,我将分享更多关于如何使用智能合同数据的细节,包括数据结构概述、如何获取数据、使用数据的工具以及一些深入分析示例。如果你想了解更多,请关注我的https://yifei-huang.medium.com/*和* 推特 ,这样你就可以在我发表下一篇文章时获得最新消息。

如果您有任何意见或问题,请随时联系我们。 推特 | 领英 |

参考

[1] 从 Web 1.0 到 Web3:这些年来互联网是如何发展的

[2] 开放元宇宙的价值链

[3] 互联网 3.0 和(科技)历史的开端

[4]https://www . the block crypto . com/data/decentralized-finance/dex-non-dependency

https://dune.xyz/yifeihuang/Opensea

[6]https://decrypt . co/79789/opensea-3b-month-ether eum-NFT-sales-Amazon-ebay-etsy

https://twitter.com/ZuwuTV/status/1437921263394115584

为什么今天每个社交网络都会禁止莎士比亚&报告他是危险的颠覆分子!

原文:https://towardsdatascience.com/why-every-social-network-today-would-ban-shakespeare-report-him-as-a-dangerous-subversive-3e86d1774ec3?source=collection_archive---------43-----------------------

浅析情感分析和情感识别

版权 2021,作者保留所有权利

想象

想象一下,当一位名叫威廉·莎士比亚的新剧作家写的以下帖子进入他们的系统时,基于当今社交网络中使用的基于情绪和情感的人工智能算法会发生什么:

“我们要做的第一件事,就是杀掉所有的律师。”#法律#律师#杀手律师

善良的老威尔正试图为他的新剧《亨利六世》制造轰动,(当然是自己出版的,因为没有出版商或文学代理人会回复他的询问信。)

各种各样的社交网络算法会首先选择“杀死”这个词,然后分析整个陈述。算法会得出结论,这是一种明显的仇恨“情绪”,莎士比亚在传播危险的言论。毫无疑问,他将被禁止,并可能因鼓吹谋杀而向警方报案。

情感分析和情感识别

T 对于那些没有沉浸或不熟悉情感分析科学的人来说,必须考虑三个基本的子因素&情感识别(SAER)。我不打算对机器学习(ML)、自然语言处理(NLP)、模式识别(PR)、深度学习(DL)或现代人工智能(AI)的任何其他无数结构进行广泛的描述——所有这些都影响着 SAER。这些主题需要清晰的学术写作和研究,而媒体不是这类文章的地方。

当接近 SAER 时,我将在一段时间内处理的三个基本子类别分成短文(并基于本文末尾列出的我的学术文章)如下:

  1. 分析在上下文中所写和张贴的内容。
  2. 对背景的深入探究
  3. 需要分析的不仅仅是“文本”,因为我们的世界已经采用了许多沟通模式,包括表情符号、视频、故事、图片和语音。

这篇文章旨在阐明第一部分的难点——分析文章内容。人们需要理解数据科学家、由此产生的算法以及试图分析被评估帖子的含义的公司所面临的问题。

获得精确定义的困难

对许多人来说,“情感分析”(SA)和“情感识别”(ER)——SAER——这两个术语听起来似乎与一些当代心理学理论有关,而不是 NLP 旗下的一种对话和表情分析方法。然而,让这一技术探索领域如此迷人的是,它试图设计的基于规则的系统是基于心理反应的。

使用数据科学将人类互动和行为的心理转化为比特和字节不是一项简单的任务——语气的任何波动或使用补充词或其他形式的交流来描述情绪或情感都可能导致意义的剧烈变化。

大多数陈述、声明或对话通常会涉及一些情感或情绪表达,无论交付方式如何。解释这些表达式,以便分析数据系统可以通过它们的字典、规则和定理吸收这些信息,这对任何有组织的系统的成功都是至关重要的。

SAER 的实际定义仍然存在争议,尽管对这种数据的计算分析已经存在了几年。根据维基百科,SA 也被称为“观点挖掘或情感人工智能”这个定义是误导性的,因为它混淆了情绪和情感——这是一个重要的细节,因为 SA 和 ER 需要截然不同的分析形式。许多学术文章提出了数学公式和决策树,得出了 SA 的一个基本的,可能是原始的性质。

将 ER 视为 SA 的一个组成部分将导致基于相同参数和算法的所呈现的分析包含情感和情绪。但是,SA 和 er 应该 而不是 合并成一个实体。相反,SA 和 ER 是离散模型,在数据分析中使用时必须加以区分。忽略两者之间的差异,任何分析通常会导致误导或错误的解释。

进退两难

为了更好地理解“情感”和“情绪”之间的区别,快速浏览一下它们各自的定义是很有见地的。“情绪”的定义是:

“一种情感的意识状态,在这种状态中体验到快乐、悲伤、恐惧、仇恨等,区别于意识的认知和意志状态。”
或:
“一种有意识的心理反应(如愤怒或恐惧),主观感受为通常针对特定对象的强烈感觉,通常伴有身体的生理和行为变化。”⁴

与此同时,“情绪”更难定义:

对某事的态度;关注;观点;精神上的感觉;情感:怜悯的情绪;优雅或温柔的情感;更高或更精致的感情的表现;在文学、艺术或音乐中表现或表达感情或情感,或唤起温柔的情感;受感觉或情感影响或源于感觉或情感的思想;意图通过语言、行为或手势传达的思想或感情,区别于语言、行为或手势本身。⁵

‘由感觉引发的态度、想法或判断:偏好……特定的观点或观念:意见’。⁶

在一篇关于这个话题的有说服力的文章中,Nada Allouch 对情绪和情感之间的区别定义如下:

第一种[情感分析]使用简化的二元分类,而第二种[情感识别]依赖于对人类情感和敏感性的更深入分析。这种方法突出了读者表达的不同感情之间的细微差别。[它]是对与每种情绪偏差相关的程度和强度的更细致、更彻底的研究……与情绪分析不同,情绪分析[又名情绪识别]包含并考虑到人类心理主观的不同变化。][它]通常基于广泛的情绪,而不是几个静态的类别。在积极方面,它检测特定的情绪,如快乐、满足或兴奋——这取决于它是如何配置的。情感分析对观众的动机和冲动更进了一步。它提供了有价值的准确见解,很容易转化为行动。'⁷

从出生起,ER 就比 SA 在我们的头脑中更明显,我们的训练包括情感识别和表达。SAER 不是一门有绝对分类的精确科学。许多定义将包括 ML、NLP、DL、PR 以及经常使用和滥用的人工智能术语。如果这还不够,还必须包括词干分析、词汇化、分类、蕴涵、语义相关、语义文本相似性和释义检测,这只是 NLP 和 ML 保护伞下的一些科学。

虽然上述定义是合法的,值得包含在任何彻底的描述或试图为 SAER 建立一个精确的描述中,但数据科学家,理论家和社交网络大师们仍然在 SAER 可以利用任何分析的内容和方式上存在分歧。

许多已发表的工作集中在 Twitter 上,试图评估积极或消极的方面和推文的语气。虽然这是一个起点,但在任何情况下,它都没有涵盖 s a 的基本元素,也没有涵盖它在理解其客户和成员方面能够为几乎任何企业、组织或社交网络提供的实际能力。

在数据科学家中,对于 SAER 的确切定义仍然明显缺乏共识。事实上,花几天时间查看期刊、书籍和互联网文章,找到 SA 和 ER 的不同和分层的描述是可能的。

为什么情感和情绪的区别很重要?

这有什么关系?谁在乎呢。将术语或对话归类为情绪或情感对数据分析、营销或任何技术的未来会有什么不同?

如果有人发布“我爱我的孩子”,SAER 的算法很简单。这种说法不需要大量的科学知识就能知道信息表达了父母对孩子的情感。

然而,区分情绪和情感可能是营销中最重要的区别之一。当客户表达“我讨厌你的产品”这样的情绪时,改变这种情绪不仅具有挑战性,而且往往是浪费精力和资金。投资回报率(ROI)会让这种努力成为泡影。情绪是微妙而不可预测的,但却是人类本性的一部分。他们不容易通过直接呼吁或营销活动来改变自己。一个人所能期望的最好结果是解释为什么产品会成为讨厌的对象,帮助计划改进产品。

像“顾客服务很糟糕”这样的情绪,不同于直接的情绪,会有反应和改变。理解这句话出现的上下文并不是一项挑战性的任务。客户面临的问题需要注意使用适当的营销来改变客户的情绪。

在实现 SAER 时,上下文变得决定性,SA 与 ER 的分离至关重要。构成分析系统的计算机算法、数学公式和决策树必须理解一个陈述的表达是什么、为什么、如何以及在什么情况下发生的。当听实时人类对话时,人们的大脑也会考虑这些问题。

一个使用 Twitter 的例子是相关的,因为公司以近乎痴迷的冲动挖掘推文。因此,如果一个用户在推特上说:“我讨厌这个产品”,从首席执行官到初级营销人员都会崩溃。诸如“为什么?”之类的问题以及“这个人是谁?”电子邮件和短信会以令人眩晕的速度飞来飞去,要求员工找到推文的潜在原因。

为什么?因为一旦推文飞入电子媒体的以太网,算法、数据存储和公式就会接管,创建一个分析,无疑会将该帖子标记为“高度有害”。用营销术语来说,这意味着不可接受的失败。

与此同时,系统可能会看到推文:“问题解决了,但真是一团糟!”或者“我喜欢这个产品,但是他们把上一个版本搞砸了”,但是不要把他们看作是对现有问题的标记。系统将看到的是“问题已解决”的决定因素——所有其他的都变成了噪音。或者,产品的“爱”有一个明确的表达,我们都知道爱是最终的情感。

什么乱七八糟的?发生了什么事?它没有上下文,所以谁知道呢?谁在乎?上一个版本发生了什么让客户表达了否定?最新版本的哪个部分有问题?什么不起作用?(最好的例子之一是浏览谷歌 Play 商店上的用户评论,因为公司经常竭尽全力回应不满意的客户,并将他们的负面评论放在某种背景下。)

当系统看到积极情绪时,它可能会在分析过程中忽略潜在的消极情绪和上述问题。然而,“混乱”和“消极”确实很重要。尽管环境仍然至关重要,但同一客户现在对产品和公司有着复杂的情感。

对于营销人员来说,这恰恰是公司应该担心的客户类别。已经决定讨厌该产品的顾客(明显的情绪反应)会去找它的竞争对手。然而,表达负面情绪的顾客有潜在的情绪反应,这是可以改变的。这个客户是市场营销应该瞄准的目标,以创造一个积极的产品认知。

区分情绪和情感对于其市场营销、客户维系和与客户保持一致的员工队伍的持续生存至关重要。几乎每个部门都会感受到 SAER 的影响,明白在应对不同情况时,他们是在处理情绪还是情感。

威廉·莎士比亚真的是颠覆者吗?

T 何行,“我们做的第一件事,让我们杀光所有的律师”,是莎士比亚的经典。虽然它不包含“仇恨”一词及其任何同义词,但它似乎通过呼吁观众杀死律师来表达对律师的厌恶情绪和仇恨情绪。随着这个“杀死”的呼叫,我们的 SAER 算法将分析情绪,并得出结论,这是源于仇恨的情绪。莎士比亚的情感被解释为一种会被认为是对谋杀和可能是仇恨犯罪的呼唤的情感!

然而,在总结莎士比亚这句话的真正含义之前,请考虑以下几点:

我们都听说过这句话:“我们要做的第一件事,就是杀掉所有的律师”。莎士比亚写于 1598 年(亨利六世,第二部分),今天人们仍在说这句话……杀死所有的律师无疑是一句挑衅的话。除了那些研究这类事情的人,这条线一点也不令人震惊。事实上,这是一个很好的老式笑话。蒙特利尔约翰·阿博特学院的英语教授詹妮弗·麦克德莫特博士写了一篇关于莎士比亚的论文,她说:“在今天的世界里,许多人可以从吟游诗人口中说出一两句话来赢得社会声誉,但很少有人意识到这句话本身的全部含义。”。其中最臭名昭著的是“我们要做的第一件事,让我们杀了所有的律师。”'⁸

等着瞧——通过理解莎翁写这句台词时针对的是谁,意思是 flips⁹;语境把仇恨变成笑话。如果有人把这条线穿过 SAER,ER 可能会把它贴上仇恨的标签。SA 可能会更亲切一点,称之为深度厌恶。

一家律师事务所的公共关系部门会将这位潜在客户标记为不成功的客户。但是,如果它像最初打算的那样,被当作一个笑话来使用,那会怎么样呢?甚至有可能是另一个律师写的谦逊的信?谁会知道呢?该算法如何对这一陈述进行分类?急诊室是什么?SA 是什么?

算法中的多数共识和词汇可能导致错误的结论。想象一下,这句话来自一条推特(而不是莎士比亚),然后出现在全球成千上万的转发中——每个接收者会如何理解它?一个笑话还是反对法律体系的号召?语境为王。不考虑上下文,有人可能会发动军队杀死所有的律师。

其他关键因素

现在我们可以松一口气,让自己继续阅读,用莎士比亚的天才教育我们自己和我们的孩子,并在上下文中理解他的幽默。没必要报警,也没必要给他贴上伟大剧作家的标签。

正如开始时提到的,在接下来的两篇文章中,我将通过以下内容来处理 SAER 的更深层次的复杂性:

  • 对背景的深入探究
  • 需要分析的不仅仅是“文本”,因为我们的世界已经采用了许多沟通模式,包括表情符号、视频、故事、图片和语音。

如果你想阅读讨论 SAER 所有这些领域的学术文章,请阅读下面关于如何下载或索取的内容。

与此同时,小心你发布的内容!

Rasheedhrasheed, CC BY-SA 4.0 ,通过维基共享

参考资料:

  1. SAER 是作者创造的首字母缩略词。它还没有被 AI 社区接受。
  2. Alaoui,IE,Gahi,y .、Messoussi,r .、Chaabi,y .、Todoskoff,A .和 Kobi,A. (2019)“大社会数据情感分析的新型适应性方法”,《大数据杂志》,第 5 卷,可在https://doi.org/10.1186/s40537-018-0120-0查阅
  3. Dictionary.com(挪威)‘情感’在 https://www.dictionary.com/browse/emotion可用
  4. https://www.merriam-webster.com/dictionary/emotion有韦氏词典(挪威)【情感】
  5. Dictionary.com(未标明)‘感悟’可在:https://www.dictionary.com/browse/sentiment获得
  6. https://www.merriam-webster.com/dictionary/sentiment有韦氏词典(挪威)【感悟】
  7. Allouch,N. (2018 年)“情绪和情感分析:绝对差异”,可在https://www . emojics . com/blog/emotional-analysis-vs-情操分析/ 查阅
  8. Chisling,A. (2017)“我们要做的第一件事,就是杀掉所有的律师。”等等……什么?为了纪念莎士比亚 453 岁生日(或多或少),我们来看看他最著名的——也是最常被误解的——语录,网址是https://medium . com/@ avajoy/the-first-thing-the-this-we-do-let-kill-all-the-lawyers-wait what-B2 CBD 34 c8 f1 f
  9. 芬克尔斯坦,S. (1997)“我们做的第一件事,让我们杀了所有的律师——这是一个律师的笑话”,可在http://www.spectacle.org/797/finkel.html买到

上面的文章是我的原始学术文章的编辑和压缩版本,“情感分析和情感识别:在数据分类中发展沟通的范式,,它首次发表在“应用营销分析”第 6 卷第 1 号,亨利·斯图尔特出版的期刊。整篇文章的 PDF,可以使用 ResearchGate谷歌学术figshare ,或者直接在 LinkedIn 上联系作者。在所有情况下,如果您引用这篇文章或整篇文章,需要完全归功于原作者。

关于作者: Ted Gross 担任 R & D 的 CTO & VP 多年,擅长数据库技术,专注于 NoSQL 系统、NodeJS、MongoDB、加密、AI、创新&混沌理论。他也擅长虚拟世界技术&增强现实。Ted 已经并将继续在专业期刊和在线@ Medium & LinkedIn 上撰写许多关于技术主题的文章。 他也是文学小说、儿童书籍和各种非小说类文章的作者 。他的短篇小说集,、【古代故事、现代传说】、获得了极好的评价。

可以通过电子邮件联系 Ted推特(@ tedw gross);LinkedIn中等

为什么他们的术语不适用于分析

原文:https://towardsdatascience.com/why-fhir-terminologies-dont-work-for-analytics-d462103204c1?source=collection_archive---------22-----------------------

行业笔记

以及该怎么做

我想谈谈任何医疗保健分析系统的一个重要组成部分——术语。这些是医疗保健数据中普遍使用的诊断、药物、程序、设备和其他医疗保健服务的基础代码。在 ClosedLoop,我们在数据科学平台中维护和利用许多术语。我们发现快速医疗保健互操作性资源(FHIR)——一种描述数据格式和元素的标准,以及一种用于交换健康数据的应用程序编程接口——对于这项任务来说既非常有用,又非常令人沮丧。FHIR 为这些术语提供了一致的结构,这些术语以前通常作为具有不同格式和约定的文件和数据库表来管理。FHIR 擅长管理数据,但不是为分析而设计的。在这篇文章中,我将谈论我们在试图构建一个纯粹基于 FHIR 的术语服务时所面临的一些问题,以及我们如何最终迁移到一种使用 FHIR 来维护和管理源数据的方法,然后在此基础上构建我们自己的术语图来支持分析查询。

什么是 FHIR?

FHIR 彻底改变了医疗保健数据互操作性。单纯为了促进医疗数据交换而存在的应用程序需要一种通用语言,而 FHIR 就是这种通用语言。它使苹果健康工具包、CMS BlueButton 等应用程序获得了成功。FHIR 规范的一个完整的小节涉及术语服务,并描述了在整个医疗记录中使用的无数诊断、程序和其他代码如何在 FHIR 中使用。你可能会认为,对于那些对医疗保健数据进行分析的人来说,FHIR 术语会非常有用。使所有代码标准化并可从单个 FHIR 服务器访问可以使构建和维护分析查询更加容易。不幸的是,FHIR 是为互操作性而构建的,它有两个严重的缺点,这使得它很难用于分析。

图 1: FHIR 术语资源概述。转载自http://hl7.org/fhir/2021Mar/terminology-module.html】

为了理解这些缺点,了解一下术语在 FHIR 中的工作原理是很有用的。如图 1 所示,FHIR 定义了 3 个管理术语的关键资源:代码系统、值集和概念图。毫不奇怪,代码系统是一组独特的代码,是一些受控术语的一部分。ICD-10 诊断代码是一个代码系统,就像 SNOMED 一样,甚至是 FHIR 语言的官方列表。代码系统可以是分层的,因此代码系统中的单个代码可以有子代码。代表“哮喘”的 ICD-10 代码 J45 有一个代表“轻度间歇性哮喘”的 J45.2 的孩子。代码系统本身有一个标识符,所以如果你在 FHIR 中看到一个代码,你就知道它来自哪里。

除了代码系统,FHIR 还定义了另外两种资源,值集和概念图。值集定义了可以在特定地方使用的代码组。例如,您可能有一个特定的字段,可以是 CPT 代码或 ICD-10 程序代码。该字段的值集将是这两个代码的组合。概念图定义了代码之间的关系。例如,概念图可以将 RxNorm 概念代码与同该概念相关的 NDC 列表联系起来。

使用 FHIR 进行分析的挑战

使用 FHIR 进行分析的第一个主要问题是,代码系统、值集和概念图都定义了代码之间的关系,但用不同的规则和不同的查询函数以不同的方式定义。这使得即使是涉及将来自多个代码系统的代码聚合到更高级分组中的基本分析查询也变得非常困难。

在一个简单的例子中,假设您想要查找带有某组传染病诊断的医疗索赔。您有这些诊断的高级代码列表。其中之一是针对“结核病”的 CCS 类别 1.1.1。该 CCS 分组包括 ICD-10 代码 A15。A15 对不同种类的结核病有几个子码,A15.0,A15.4 等。您希望能够获得您的初始代码列表,并确定与您的查询匹配的所有 ICD-10 代码。也就是说,您希望获得 CCS 1.1.1 的所有子代码,这需要包括 ICD-10 A15.0 和 ICD-10 A15.4。要在 FHIR 中获取这些代码,您需要一个定义初始代码列表的值集,其中包括 CCS 1.1.1。CCS 到诊断代码的映射将通过概念图来完成,A15 及其子代码之间的关系将存储在 ICD-10 代码系统的层次结构中。

作者图片

当您尝试将初始列表解析为一组诊断代码时,FHIR 的局限性就变得很明显;您需要运行 3 个单独的 FHIR 查询。您必须首先扩展值集,然后遍历概念图,最后获得 ICD-10 代码的所有子代码。更糟糕的是,FHIR 查询的这种组合是特定于这种特定的数据结构的。如果概念图或代码系统层次结构的结构不同,您可能需要执行一组不同的查询。

如果您发现前面的例子令人困惑,不要担心。这个例子的目的是展示使用 FHIR 查询进行分析是多么困难。对于分析,一个更自然的术语视图是一个有向图,其中每个代码是一个节点,它们之间的关系是边。任何一种聚合都是一种简单的图遍历。

第二个主要问题是,FHIR 的版本化方法使得处理可能跨越多个先前术语版本的历史数据变得困难。在分析中,我们通常会查看包含历史数据的数据集,有时是几年前的数据。一个特定的代码可能在今天已经过时了,但是它在几年前使用的时候是有效的,你不希望在做分析的时候扔掉所有这些代码。对于分析,您需要术语的历史视图,包括当前和过期的代码,并无缝地使用它们。在 FHIR 中,您要么需要指定一个特定的版本,要么只选择最新的版本。您不能合并不同版本的搜索。

救援术语图表

为了解决这两个问题,我们开发了一种混合术语方法,即闭环术语图。ClosedLoop 术语图是一个高性能的术语图,可以快速解析代码关系。它位于我们的 FHIR 服务器的前面,并提供了一个基于图形的查询 API,用于分析比标准的 FHIR 端点更快、更简单。通过使用仅存储节点和边结构的高度压缩的格式将图形结构存储在存储器中来实现性能,并且根据需要从 FHIR 服务器检索关于每个代码的底层信息。这个图能够合并多个版本的 FHIR 资源,因此它可以包含一个完整的历史代码集。默认情况下,图形会返回任何代码的最新版本,但如果某个代码已被删除,它会从该代码处于活动状态的最新版本中检索该代码。

作者图片

闭环术语图为我们提供了两个世界的精华。FHIR 是存储和维护代码系统、概念图和值集的一种很好的方式,我们用它来达到这个目的。在 FHIR 之上,我们提供了一个基于图表的术语视图,可以跨越多个历史版本,以实现快速方便的分析查询。虽然构建我们自己的图表并找到与我们的 FHIR 服务器保持同步的方法是一个挑战,但最终的好处超过了成本。它使我们能够保持标准合规性,但仍能提供出色的分析体验。FHIR 可能会在某个时候纳入更多的分析工作流,并解决这些问题。在那之前我们有一个解决方案。

为什么浮动不准确

原文:https://towardsdatascience.com/why-floats-are-inaccurate-2a785649c73d?source=collection_archive---------23-----------------------

关于浮点值为何不准确的详细对话。

(https://pixabay.com/images/id-3456722/

介绍

在计算中,小数值的概念相当普遍。在科学计算中更是如此,数据通常存储在浮点数据类型的小数值中。有很多关于浮点操作错误的讨论,以及对于计算机来说,浮点是否天生难以处理。即使具有科学和数字能力的语言也有浮点问题,有时会计算不准确。考虑以下两个浮点数的简单加法:

0.1 + 0.2

这真的很简单,你在第一阶段思考的头脑大概马上就想出了答案。一加二等于三,所以十分之一加十分之二必须加起来是十分之三。当然这是正确的,我们可以用下面的数学表达式来证明:

0.1 + 0.2 == .3

所以这种数学毫无疑问是正确的,但有趣的是当我们在 Python 中使用 float 数据类型做同样的事情时会发生什么。以下是 Python REPL 中使用相同数学方法:

(图片由作者提供)

0.1 + 0.20.30000000000000004

当然,我们毫无疑问地知道这不是真的。我们的大脑很容易区分这一点

0.1 + 0.2 == .3
0.1 + 0.2 != 0.30000000000000004

但很明显,电脑似乎认为它有。我们看到,如果我们把这两个语句放入我们的 Python REPL,我们会看到两个都是假的。

(图片由作者提供)

这到底是怎么回事?为什么 Python 不如我们的大脑准确?

为了理解为什么我们的计算机可能对这个简单的计算有问题,我们需要考虑计算机是如何存储浮点数的。根据您的系统和安装,Python 可能为您的浮点数存储 32 位或 64 位签名。我们会假设大部分阅读器的系统架构很可能不是 i386,我认为这是一个有效的假设,大部分阅读器很可能是 64 位系统。

有一种方法可以让我们实际看到在 Python 中用来存储数据的位,这就是我要用的方法,来演示到底是什么导致了我们的操作错误。我将使用 struct 模块来实现这一点。struct 模块有一个采用两个参数的 pack()方法。第一个论点是要解释我们想要包装什么样的类型。为此,我将使用“>d”。大于号用来表示人类书写数学的方式,大端。d 代表双精度浮点数 64。让我们看一下我们刚才看到的所有数字的打印输出:

>>> o1 = struct.pack(">d", .1)
>>> o2 = struct.pack(">d", .2)
>>> o3 = struct.pack(">d", .3)
>>> print("".join(f"{w:08b}" for w in o1))
0011111110111001100110011001100110011001100110011001100110011010
>>> print("".join(f"{w:08b}" for w in o2))
0011111111001001100110011001100110011001100110011001100110011010
>>> print("".join(f"{w:08b}" for w in o3))
0011111111010011001100110011001100110011001100110011001100110011
>>>

现在,让我们以 0.1 为例,将这几组位稍微分解一下。第一位是一个符号位,这意味着它决定了我们数字的正性,0 代表正,1 代表负。接下来是 11 位,在计算机用来表示浮点数的公式中用作指数。这很像科学记数法。让我们使用一个快速 for 循环来分解这两个值。

>>> bits = "".join(f"{w:08b}" for w in o1)
>>> count = 0
>>> signbit = []
>>> exponenetbits = []
>>> fractionalbits = []
>>> for bit in bits:
...     count += 1
...     if count == 1:
...         signbit.append(bit)
...     if count > 1 and count < 13:
...         exponenetbits.append(bit)
...     if count > 12:
...         fractionalbits.append(bit)

现在让我们按顺序把每个部分打印出来。不要问我为什么不小心输入了“Expo net…”我也不知道发生了什么。

>>> print(signbit)
['0']
>>> print(exponentbits)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'exponentbits' is not defined
>>> print(exponenetbits)
['0', '1', '1', '1', '1', '1', '1', '1', '0', '1', '1']
>>> print(fractionalbits)
['1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '1', '0']
>>>

是的,我确实尝试过键入指数位。我们将这些值代入以下公式:

(-1) ^符号* 2^e-1023 * 1 .分数

在这个公式中,每当我们将十分之一和十分之二相加时,我们的小数会被截掉,并在某一点四舍五入。这解释了为什么会出现这种现象,因为一个简单的舍入误差。

结论

我们喜欢认为计算机非常聪明,非常精确,但事实并非如此。在一天结束时,理解计算机如何在这种水平上工作真的会证明为什么计算机会犯这样的简单错误。归根结底,它仍然是一个复杂的 unicode 和 bits 系统,共同创建我们编写的表达式。感谢你阅读这篇文章,我希望你学到了一些关于双打的新知识!

为什么堡垒之夜成为历史上最令人上瘾的游戏

原文:https://towardsdatascience.com/why-fortnite-became-the-most-addicting-game-in-history-5e827754f76a?source=collection_archive---------16-----------------------

用人工智能和 K-最近邻模型分析球员的状态。

照片由 Unsplash 上的标记十分位数拍摄

孩子们越来越沉迷于堡垒之夜,这引起了家长们的恐慌。全球玩家超过 2.5 亿,月收入 2 亿美元,如今似乎每个人都在玩堡垒之夜。根据一些研究,堡垒之夜正变得比海洛因更容易上瘾。像脸书这样的科技巨头正在元宇宙——我们设想的未来虚拟世界——投入大量资源。

通过利用一些简单的心理现象,堡垒之夜不断给年轻玩家一个重返游戏的理由,即使他们不想这样做。在这篇文章中,我研究了上场时间和球员得分之间的关系。

数据

我使用了 5 种游戏模式(单人、双人、三人、小队和 LTM)中 1400 多名 Forntine PC 玩家的终生统计数据。这些数据是由 Kaggle.com 的Iyadali(免费访问)在第六季第二章(2021 年 4 月)期间使用 t racker.gg. 的公共排行榜数据收集的,其中包括以下信息:

  • 分数:总分,
  • top1:获胜总数,
  • kd:杀伤/死亡比,
  • WinRatio:胜率,
  • 比赛:比赛次数,
  • 杀戮:被消灭的次数,
  • minutesPlayed:花费的总分钟数。

统计数据表明,应该有一种非常特殊的快乐来自于玩家永远不想结束的游戏。在堡垒之夜的例子中,获胜者是 Idk_Pi,他花了相当于 396'565 分钟(275 天)玩这个游戏。

堡垒之夜大力鼓励人们继续玩游戏,因为他们有信心赢得下一次比赛,当他们赢了,他们想突破下一个水平。随着比赛时间的迅速增加,分数缓慢而稳定地增长,这暗示了这种假设。

K-最近邻模型

研究表明,像堡垒之夜这样的游戏使用最先进的行为心理学来故意让你上瘾。我感兴趣的是检查游戏中的上瘾是否是故意的,通过观察两个指标:玩游戏花费的时间和获得的分数。当达到特定分数时,玩家会停止游戏吗?如果会,什么时候会发生?

k-最近邻(kNN)模型是一种直观的方式来预测量化的响应变量,如分数,使用上场时间作为预测因子。

对于固定的 k 值,第 n 分钟的预测得分是最接近的 k 分钟的观察得分的平均值:

下面我将我们的数据分成训练和测试集,并训练各种 kNN 模型。

这些图说明了每个模型在测试数据集上进行预测时的表现。R2 度量反映了模型的适合度,并表明 k=10 将提供对玩家分数的最佳预测。

使用具有 10 个最近邻居的最佳模型,我们可以对花费在玩堡垒之夜游戏上的时间做出 1 天到 3 年的分数预测。

结果表明,至少需要 32 天才能获得足够的分数登上堡垒之夜排行榜。经过 252 天的游戏,分数的提高是非常不可能的。

结论

堡垒之夜是一款游戏,它定义了小小的成功,例如,击中两颗子弹就能决定排行榜上的第 10 名或第 99 名。人们继续比赛是因为有太多的希望。该模型表明,252 个游戏日才意识到为什么它如此令人上瘾。

在堡垒之夜失败后,几乎每个玩家都相信这两颗子弹会在下一场游戏中掉落。玩家认为他或她只需要熬过头 32 天。在这段时间之后,分数的稳定增长提供了玩家需要的奖励和心理鼓励。

分数有很多位数,永远会增加,不管你输得多惨。我相信,这种积极的反馈机制是堡垒之夜变得如此上瘾的一个重要原因,特别是对于那些在生活中没有从其他地方获得太多积极反馈的年轻人来说。

感谢阅读!

感谢《走向数据科学》的本·胡伯尔曼和埃利奥特·冈恩。

为什么自由和开源软件应该是负责任的人工智能的未来

原文:https://towardsdatascience.com/why-free-and-open-source-software-foss-should-be-the-future-of-responsible-ai-a3691b47fd79?source=collection_archive---------41-----------------------

麦克斯韦·尼尔森在 T2 的照片

在《麻省理工科技评论》最近一篇题为“担心你公司的人工智能伦理?这些初创公司是来帮助的。,技术生态系统中的一些初创公司受到了关注,这些公司正在开发工具和服务,以帮助其他公司在其组织内实施人工智能道德。

我坚信,当我们没有内部专家来开发某些东西时,我们应该承认这一点,并引入在该领域拥有丰富经验的外部专家,帮助我们解决我们面临的挑战。

但是,在规范必须依赖具有封闭知识产权实践的组织来弥合这一差距的做法时,特别是在负责任的人工智能的情况下,每个问题都有许多方面,我们有可能让自己面临有限审查、可用性碎片化和基于商业可行性的集中利益的问题。

我认为一个更好的模型,一个已经在我们今天使用的一些最有前途的软件中取得成功的模型,是开源模型。开源模式依赖于将知识产权保留在公共领域,因此提供了一种对正在开发的解决方案进行更严格审查的潜在途径,同时使这些解决方案对那些可能不总是有资源购买昂贵的解决方案来满足客户新兴的负责任的人工智能要求的组织开放和可访问。特别是对于社会部门的组织来说,有许多事情限制了我们购买昂贵软件的能力。这可能会成为一个限制因素,因为我们将进入一个负责任的人工智能要求成为规范的未来,无法遵守将严重限制该组织筹集资金和继续支持其任务的能力。

社会部门的组织也不得不努力争夺技术人才,特别是面对技术公司的丰厚报酬,因此必须找到简单、廉价和可靠的解决方案,这可以通过自由/开源软件模式来实现。

支持开源模型有几个好处。开源软件通常更透明、更具成本效益、更健壮,并允许通过开源社区协作快速改进。我们可以通过我们的关注和财政资源来支持这一模式,这将为负责任的人工智能领域创造更好的整体成果。

最后,负责任的人工智能意味着公共利益,公共利益不能也不应该在没有公众积极参与的情况下产生。自由和开放源码软件提供了有效做到这一点的途径。

目前该领域正在发生什么,为什么这很重要?

2020 年呈现了对负责任的人工智能(https://trends.google.com/trends/explore?date=today%205-y&q = Responsible % 20ai)的兴趣爆发,这导致许多初创公司和其他组织涌现出来,提供解决方案来“修复”这些问题。有一种风险是,我们可能会成为那些以实际解决问题为代价、旨在快速赚钱的解决方案的牺牲品。这是社会企业空间在过去看到的事情,焦点领域在公众意识中淡入淡出,当它们“热门”时引起兴趣,但当兴趣消退时很快就被搁置。

鉴于整个生态系统目前仍处于萌芽阶段,我们有机会制定更多符合社会的规范,为该领域的未来努力奠定基础。这一点尤为重要,因为政府和联合国等国际多边组织也将负责任的人工智能作为其任务的一部分。强调我们首先支持自由/开源软件解决方案将为该领域定下基调,并推动研究和开发工作朝着最终产生更多有利于社会的成果的方向发展。我们也有机会从自由/开源软件运动中吸取经验教训,从这一经验中汲取最佳元素,并将其应用于当前阶段。透明度、问责制、可访问性和协作的理念将是我们前进的关键。

最后,这种自由/开源软件的方法也将给予人们更多的发言权,有助于解决“谁的道德规范?”这个长期存在的问题当我们寻求开发和部署双重用途的解决方案时。打破封闭的知识产权孤岛的解决方案将有助于我们代表比通常情况下更大、更多样化的观点和伦理考虑,从而使自由/开源软件方法变得更加重要。

为什么开源模式更好?

1.更严格的审查

那些熟悉网络安全领域格言的人会同意,对软件的一部分进行更多的监控有助于发现它可能故意或无意出错的方式。

在这种特殊情况下,开源模型非常好,因为它们将代码开放给来自世界各地的研究人员和开发人员进行更严格的审查,每个人都可以带来自己的专业知识。这对于拥有封闭知识产权实践的组织所创建的工具来说是不可能的。

此外,在开源领域拥有这种技术还有另外两个目的:

  • 唤起那些要求采用该软件的人的更多信任,因为他们可以自己检查代码(取决于他们理解代码做什么的能力,这可能并不总是如此)
  • 利用你自己网络之外的专业知识,这些专业知识有时会在思维、方法和技能方面存在群体偏见。

最终,采用软件开发的集市模型(来自 Eric Raymond,他将其描述为 agora 方法,其中许多软件提供商聚集在一个市场中,没有中央协调,根据客户表达的需求竞争提供最佳可能的解决方案)可以导致更“负责任”的结果,这是我们明确希望从我们负责任的人工智能部署中获得的东西。

2.普遍可用性

责任人工智能领域的核心原则之一是确保公平访问,同时从技术或社会学的角度赋予尽可能多的个人权力。由组织秘密开发的工具对生态系统构成了真正的威胁,因为它们只对那些有资源支付它们的人开放。尽管部署这些工具要花钱,但这种自由/开源软件工具的好处是,它们首先减少了开发和测试这些工具的大量前期费用,这对于那些希望尽可能扩大资金的资源有限的组织来说是一个可喜的变化。

此外,如果我们继续将我们的努力投入到具有封闭的知识产权实践的组织中,特别是如果这占用了可以用于开源开发的投资(并且我在本文的结尾建议了一些这样做的策略),那么我们将陷入这样的泥潭,我们只为那些有钱的人配备将负责任的人工智能集成到他们的系统中的能力,而不是授权每个人这样做。

当我们谈论垄断力量的集中时,想想它的后果:

  • 我们正在降低低资源公司的竞争力,以争夺合同和客户,而这些合同和客户需要(可能由立法强制要求)具有负责任的人工智能
  • 我们正在建立等级制度,并阻止那些没有资源来获得这种工具的人将创新带入市场,因为他们无法满足负责任的人工智能需求

民主化是负责任的人工智能社区的号角之一,只有当我们积极努力使之成为现实,而不是仅仅口头上说说,才能实现。

3.满足社会的实际需要,而不是只为商业利益服务

我当然承认,如果没有财务可行性,将很难将许多创新引入市场(我确实提出了一些可以让我们两全其美的模型),但随着生态系统的动态以盈利为中心,我们有可能非常严重地倾向于商业化利益,这可能会缩小通过专注于那些事情来解决的问题的范围,例如,吸引寻求投资回报的风险资本家(VC)的目光。

为了真正具有前瞻性并服务于社区,我们需要与社区合作。

这意味着将资源投入到增强社区能力和提升社区技能上,而不是将 R&D 锁定在商业利益之后,比如在一家由风险投资利益和时间表推动的初创公司中,这可能会使发展路线图偏向于解决那些具有最高短期潜力的问题(这是生态系统结构的不幸结果)。

这种方法有利于满足社区的需求和解决系统性问题。

但是,有几个开放的问题可能会在我们的集体良知中燃烧,这可能会让你犹豫是否接受这个模型,而不是麻省理工学院技术评论文章中强调的那个模型(在文章的开头)。

有一些未解决的问题…

我目前的看法是,我们需要解决融资模式和实际能力的问题,以使开源模式取得成功。但是,这些都不是不可克服的问题。有几种融资模式可以帮助实现开源愿景:

大型科技公司的支持

大型科技公司对开源软件的支持并不像你想象的那样遥不可及。有很多开源项目像 React,PyTorch,Tensorflow,ART 等。它们非常成功,开发人员受雇于大型科技公司。他们把大部分时间花在维护和开发开源软件上。

这至少为我们提供了一些希望,这些组织可以通过他们的开发人员投入他们的努力,开发和维护负责任的 AI 工具的开源版本。

对独立开发者的资助

类似于 No Starch 基金会的小额赠款和其他公开赠款,可以为独立开发者提供在开源领域开发此类工具的财政手段。此外,这种机会还能使创建这种工具的投入多样化,而不仅仅局限于那些居住在企业家密集区的人,他们更有可能获得资金,以创业模式追求创意。

资助学术实验室的工作

世界上有许多像 DSSL 这样的实验室,他们通过研究生的研究工作开发出了工具 Aequitas。虽然这些有点受限,因为至少在早期构思阶段,它们只对学术生态系统的一部分开放,但一旦它们以开源方式公开,就有可能邀请外部开发人员来构建这项工作。

这是一种隐性资助的方式,与支付给作为这些实验室一部分从事这项工作的研究人员的津贴相关,因此是进行这种创新的一种有用的途径。

非营利和其他组织创造工具供每个人使用

虽然没有太多这样的例子,但像 Markup 这样的组织已经调查了创建在生态系统中使用的流行工具的替代方案所需的资金,例如可以以保护隐私的方式进行的网络跟踪。现在有一种趋向于基于公共资源的对等制作的趋势,像知识共享和通用公共许可证这样的组织引领着这种趋势。他们的工作可以通过他们已经建立的筹资机制得到支持,为得到资助的工作增加民主化的因素,让普通人也能从中受益。

但是,仍然有人担心那些没有技术知识的人如何使用这些开源工具。

发布这种开源工具的一个未解决的问题是,对于那些可能没有足够的内部技术专长来利用这些工具的组织来说,他们可能无法利用这些免费提供的工具。还有人担心这种解决方案的财务可行性,以及如果它们在生命周期的后期被公司接管会发生什么,使它们成为专利,并使依赖自由/开源软件运作的组织陷入困境。

这个问题没有一个非常明确的答案,但绝对有可能创建志愿者团队,分享他们的技术专长,使这些工具的使用成为可能。此外,它还激励我们提高这些工具的用户友好性,让更多的人可以使用它们。

我绝不支持封闭的知识产权实践的组织不能成为有效机制的观点;远非如此,我认为他们当然有自己的角色。但是,如果我们用心去做,我们有足够的机会来实现一个基于开源思维的负责任的人工智能工具生态系统,而不是不得不将这种责任推给那些不以开源方式分享这些知识产权的人。

在这里注册以获得关于可操作的人工智能伦理书的更新!你可以在这里了解更多关于我的作品

你可以通过订阅人工智能伦理简报蒙特利尔人工智能伦理研究所了解更多这样的见解!

用数据找出为什么《权力的游戏》8.3 如此糟糕

原文:https://towardsdatascience.com/why-game-of-thrones-8-3-was-objectively-bad-6f558d4d63e7?source=collection_archive---------29-----------------------

我给《权力的游戏》7/8 的数据科学情书

不幸的是,昨晚我看了《权力的游戏》第八季第三集。

作者注:虽然原始资料已经从当代新闻中消失,但我对《权力的游戏》的热情以及对该剧第八季惨败的愤怒并没有消退。这是我写给一个节目的情书,这个节目我爱了 7 年,但此后又恨之入骨。

标注上标数字的引文

【得到剧透警告】

在《权力的游戏》的粉丝中,我想我属于中上水平。我看过这部剧,也读过书,但除此之外,我对维斯特洛没有百科全书般的了解。

但当我看《权力的游戏》最新一集《第八季第三集:漫漫长夜》时,我内心深处有一种东西冒了出来。

那是愤怒。

纯粹的粉丝狂怒。

我讨厌电视的这一集。

也许是糟糕的写作,或者是一部关于战争的电视剧中糟糕的军事策略,或者是聪明的角色变笨了,或者是太黑暗了,或者是这部剧应该比《赫尔姆斯-deep⁴…》更好

我非常不喜欢这一集,这让我很生气。现在只是把原因打出来就很让人沮丧。

照片由 ReiseuhuUnsplash 上拍摄

但奇怪的是,我的抱怨无人理睬。我在观看聚会上的朋友似乎并不介意我所看到的缺点。可爱的夏天的孩子们…

我需要找到一些“真实”的东西一些客观的东西来反驳这一集;以数据为基础,毫无疑问地证明这一集是糟糕的。

但是什么是“客观”品质呢?然后我突然想到:

《权力的游戏》一直是一部关于颠覆幻想修辞的剧。更具体地说,它因在关键时刻杀死重要人物而受到称赞:好人并不总是赢家。

这让我想到了这篇文章的假设:

临冬城战役中发生的死亡事件对观众的影响不如前几集重要,也低于预期。

我花了整个周末来探索和验证这个假设👨‍🔬

我无法分析在弧线结束或开始时杀死一个角色的优点(如乔拉·莫尔蒙对米森代)或一个角色被杀死的方式(也就是一个无意义的死亡如何破坏了一个伟大的弧线,反之亦然),因为这些仍然是主观的。

弄清楚的是角色的重要性,因为工作室显然会把更多的屏幕时间奉献给更重要的角色。

决定死亡重要性

首先,我收集了《权力的游戏》中所有角色在《8⁵.》一季中的屏幕时间这将是我分析的一个很好的起点:

一个很长的图表的顶部,列出了 GoT 字符的屏幕时间。来源:https://www.theatlas.com/charts/HJrdxDNKW

我增加了几个专栏让我的生活更容易,然后从精彩的网站https://deathtimeline.com/刮出所有死亡加上增加的第七季死亡产生了开始数据表。我去参加比赛了🐴

剧集栏显示某角色是否出现在该剧集中。上面的图表很好,但是让我们只看死人,因为那是我们正在探索的。对于死去的人,我添加了一个死亡剧集栏,显示他们死于哪一集,以及 MinPerEp ,这是他们在所有剧集中的屏幕时间。

作者图片

起初,我简单地绘制了一集里所有被杀角色的总屏幕时间:

作者图片

很高兴看到主要的情节点+死亡可以用这种方式捕捉。我们还可以看到第六季的结局是多么的疯狂——杀死了大量的主要角色。这远远超出了其他主要死亡事件的范围,它们都徘徊在 130-180 之间。

(一个可能会认为这个分数表明在这一集里有太多的死亡,在这个系列的这个点上,这个疯狂的死亡集只是用来结束一些零散的事情和颠覆预期…不过我跑题了)

但是有几件事不能让我对通过死亡时间来决定剧集质量感到满意:

  1. 奈德+韦赛里斯在第一季的死亡可以说是这个系列中最关键的时刻。在这里,它没有野人入侵重要,我个人不同意。
  2. 使用原始屏幕时间作为衡量标准高估了在节目后期发生的死亡。即使你是一个中等角色,如果你活到最后,你的死亡可能会像《红色婚礼上的罗柏·史塔克》一样意义重大

那么,如果我们不把重要性看做总的绝对屏幕时间,而是每集的屏幕时间,会怎么样呢?有理由认为,一个重要的人物会在整部剧中延长屏幕时间。在第 10 集里,一个总屏幕时间为 100 分钟的角色死亡应该比在第 50 集里一个总屏幕时间为 100 分钟的角色死亡更有意义。每集 10 分钟可以捕捉到这种关系.那个图表看起来像这样:

作者图片

这产生了相反的效果——过早死亡更受青睐,使得重大的后期死亡更难实现。在上图中几乎可以看到死亡值的指数衰减线。

你可以说这是对《权力的游戏》的一种不公平的喜剧表现,因为内德、T2、韦赛里斯和第四、五、六、七季中死去的所有人加起来都值钱…

显然,需要有一种更聪明的方法来计算死亡价值。

在我的 Min/Ep 公式中,我添加了一个生存奖励参数——基本上保持了 Min/Ep 的值,但通过软化衰减增加了后来的系列死亡。每集获得 2 分钟屏幕时间奖励的每个角色都存活了下来。虽然这起初感觉是手工制作的,不太客观,但我认为这也可以被视为增加了死亡的重量,因为角色通过自己的弧线和故事弧线前进:即使他们的屏幕时间没有增加,他们的长期参与自然会增加他们的意义。下面是我的生存死亡值公式:

这产生了下面的图表:

改变颜色让你的读者保持兴趣!!作者图片

这看起来太棒了——奈德的死刑和提利尔一家是这部剧最重要的死亡事件,紧随其后的是《红色婚礼》。它贬低了小指头的审判,我认为这是一件好事,因为一个单一的半体面的角色的死亡远不如其他人的关键时刻。

我们越来越接近,但还没有完全达到:

  1. 红色婚礼被低估了。没有办法,它只是作为一个关键的野生入侵,并相形见绌奈德的执行,许多人会认为应该接近在一起
  2. 意志困境

意志困境

要理解的意志困境,看一看死亡名单,按死亡值排序:

作者图片

首先,我们有奈德·史塔克——电影史上最意外、最重大的死亡事件之一。它引发了《权力的游戏》的所有事件,并转化了数百万 GoT 粉丝——当然值得登上榜首。接下来是凯特琳·史塔克,她是《红色婚礼》第一季大部分时间的女主角,然后是劳勃·拜拉席恩,这位鲁莽的国王的死开启了《权力的游戏》。

然后,还有

他甚至没有姓。

这是他的粉丝页面:https://gameofthrones.fandom.com/wiki/Will

他出现在 1.1 的前 6 分钟,然后被一个白行者杀死。

尽管在一个场景中扮演了这个小角色,但他的排名比史坦尼斯、提利尔甚至罗柏·史塔克都要高。显然有些事情需要解决。

简而言之,意志困境是我们的模型倾向于高估不受欢迎的角色。没错,连《权力的游戏》都是人气比拼。

但是你如何衡量受欢迎程度呢?很明显,我不能对每个角色的重要性进行排名,这是不客观的。

相反,我们可以用一个角色在《权力的游戏》的维基页面上的链接数量作为受欢迎程度的衡量标准。一个角色和其他人的联系和关系越多,他们就越受欢迎和重要。当我们对链接进行计数并对它们进行归一化(在 0 和 1 之间进行缩放)时,我们会得到类似于图表链接的东西。任何高于 0.34 的都被认为是流行的。

《权力的游戏》人气排行榜。作者图片

像瓦德·佛雷和韦赛里斯·坦格利安这样的重要人物?受欢迎。不,像希尔瓦·桑塔加这样的名字几乎不受欢迎。

我们现在可以将死亡价值函数改写为:

或者,如果你想让这看起来像一个公式,假装这是一个数学上严格的练习:

使用这个修改的死亡值,我们得到:

作者图片

这个看起来很有希望。奈德/韦赛里斯是最强有力的一集,紧随泰里尔大屠杀之后。红色婚礼虽然仍被低估,但与史坦尼斯和野人入侵相比,它显然是独一无二的。

旁注:我用了书中人物的人物页而不是节目来计算人气。如果你担心这使数据有所偏差,或者创造不正当的价值,我会认为维基这本书抓住了维斯特洛内部人物的真正内部受欢迎程度,而不是 HBO 内部的外部受欢迎程度。书中每个人物背景故事的丰富性和被点名人物的绝对数量保证了重要人物几乎不受人气放大器的影响,没有人受到重罚。

边注 2: 以上数据集不包括约翰·斯诺的第一次死亡,因为他实际上并没有死。在我的死亡计算中不允许假死!

死亡中的无形资产

这里有几个概念是我们无法用死亡值来解释的:

  • 阿多效应:一个拥有强大而有意义的死亡的次要角色。阿多虽然在《权力的游戏》的宏大计划中扮演了一个相对次要的角色,但他有一个绝对令人震惊的死亡镜头,这肯定比他可怜的 0.621 分更有价值。然而,对死亡序列的“伟大”程度进行排名对于这项分析来说过于主观。
  • 小指头的困惑:一个主要角色可怕的或者非角色的死亡结束了他们的叙述。这与阿多效应相反,因此代表了降低角色死亡分数的需要。对我们的分析来说也太主观了。
  • 耶哥蕊特假设:一个赛季中期加入球队的角色不应该被贬低。显然耶哥蕊特只出现在第二季,但她的死亡分数应该从那里开始吗?从技术上来说,她还活着,只是在第一季中没有任何露面的时间,但她在那些剧集中获得了生存奖金。我选择从第一集开始考虑所有的角色,但是也接受生存奖励。
  • 耳语大师(银幕外)额外收获:原始屏幕时间不一定反映故事的影响力。《指环王》中的索隆在三部电影中只有 4 分钟的实际屏幕时间,但他的影响力来自于故事中所有对他的提及。也许下一步将是计算一个角色出现在屏幕上的时间长度。

现在,我们用这个来说说 8.3。

临冬城之战

下面是《漫漫长夜》中每个人的潜在死亡值,在这一集里真正死去的人用红色粗体显示:

作者图片

将这些突出显示的值相加,我们可以生成临冬城之战的死亡值(蓝色):

作者图片

乍一看,似乎该集的客观死亡值尚可。它没有《红色婚礼》和《泰里尔大屠杀》那样震撼人心,但也足够重要。

但是一旦你看到表面之下,你就会开始看到裂缝。

选择的角色并不重要。其中只有一个人——席恩·葛雷乔伊——以价值计算排在人物榜的上半部,两个人物——莱安娜·莫尔蒙和埃德森·托莱特——以价值计算排在最后。简而言之,死亡评分分数并不是像之前重要剧集那样来自于关键死亡,而是来自于次要角色的清除。

此外,21.6%的死亡分数出现在战斗之后,当时梅丽珊卓认定她与艾莉亚的鼓舞士气的谈话是她生命的目的,并继续活到 100 岁死去。它没有增加战斗本身的戏剧性,而是人为地夸大了这一集。

旁注:夜王不在其中,因为根据作者的说法,他是一个“元素”和纯粹邪恶的化身,所以正常的人类事物并不适用于他。比如死亡。和性格发展。

你现在可能会问自己:“如果这一价值低于其他重要剧集,并因次要角色和战后死亡而被夸大,那又会怎样?人们在期待什么?”

我们可以弄清楚。

首先,一个明显的问题:

如果所有人都死了会怎样?

作者图片

杀死所有人——基本上提前结束这场演出——在维斯特洛会是一场大灾难,在现实世界也可能如此。想象一下,如果夜王和他的不死族邪恶地消灭了所有的丹妮和北方军队。剩下的就是瑟曦和夜王的对决了。邪恶对邪恶。这绝对会改变整部剧的基调,这一点可以从上面高得吓人的死亡分数中反映出来。

(平心而论,夜王大战瑟曦“野火”兰尼斯特会是一首冰与火之歌……)

我们以为谁会死?

转到一个更现实的预期,我找到一篇文章,列出了它对漫漫长夜的预测:

格雷沃姆、席恩·葛雷乔伊、埃迪逊·托雷特、塔斯的布蕾妮、乔拉·莫尔蒙、詹德利和波德瑞克·派恩

作者图片

我也问自己,“在这一集之前,我预计谁会死?”以下是我的选择:

G 雷伊沃姆,贝里·唐德利恩,席恩·葛雷乔伊,塔斯的布蕾妮,乔拉·莫尔蒙,&詹德利

我可以滔滔不绝地解释为什么我会期待这些…但是现在不是时候…有图表要绘制!

作者图片

令人惊讶的是,我的预测和大众媒体的预测只相差 0.02(又名 1/4 吉利)

很明显,每个人都期望死亡值在 12.75 左右,而战斗值为 10.48

总之:

临冬城之战客观上比大家预期的差了 17.99%

这似乎不是很多,但两位数的百分比下降是一个重大的下降。如果这部剧缩短 17.99%,就只有六季半了(我多么希望这是真的……)。

如果你不算 Missendei,因为她在战斗后去世了,你只剩下可怜的 8.25 分,比 exceptions 低 35%。呀。

尾声:结束游戏

U 唱完上面的死亡评分等式,最后清理一下我的一些图表,这里是第八季的剩余部分。由于我在最后一季中没有接触屏幕的时间,所以在第八季之前,我只是根据每个角色每集的时间给了他们额外的屏幕时间:

作者图片

如果出于任何原因,你对剩下几集的表现不满意,这也是最后一集的死亡值。随意计算你自己想象的情节中死亡的重要性:

  • 琼恩·雪诺:6.948
  • 提利昂·兰尼斯特:6.934
  • 丹妮莉丝·坦格利安:6.036
  • 珊莎·史塔克:5.491
  • 瑟曦·兰尼斯特:5.447
  • 艾莉亚·史塔克:5.270
  • 詹姆·兰尼斯特:4.902
  • 山姆威尔·塔利:3.969
  • 戴佛斯·席渥斯:3.484
  • 布兰·史塔克:3.430
  • 塔斯的布蕾妮:3.415
  • 瓦里斯:3.020
  • 桑铎·克里冈:2.345
  • 格雷果·克里冈:1.945
  • 攸伦·葛雷乔伊:1.643
  • 艾德慕·徒利:1.467
  • 波隆:1.451
  • Qyburn: 1.253
  • 杰诺斯·史林特:1.224
  • 詹德利:1.116
  • 吉利:0.800
  • 波德瑞克·派恩:0.767
  • 梅拉·黎德:0.650
  • 托蒙德:0.596
  • 达里奥·纳哈里斯:0.585
  • 米桑代伊:0.502
  • 贾昆·哈加尔:0.476
  • 热馅饼:0.403
  • 萨拉多·萨恩:0.386
  • 鞣花砂:0.373
  • 灰色蠕虫:0.366
  • 约翰·罗伊斯:0.357
  • 西利欧·佛瑞尔:0.250

非常感谢你的阅读。

瓦拉·莫古里斯

引用的作品

  1. https://www.youtube.com/watch?v=EA5mJRFaI8c
  2. https://www . the verge . com/2019/4/30/18522060/权力的游戏-got-season-8-HBO-final-meli sandre-Tyrion-lanni ster-long-night-prophetions-tactics
  3. https://www.youtube.com/watch?v=EB_y1Hp36Js
  4. https://comic book . com/TV-shows/2019/03/04/game-of-thrones-final-battle-bigger-than-helms-deep-Lord-of-the-rings/
  5. https://www.theatlas.com/charts/HJrdxDNKW
  6. https://deathtimeline.com/
  7. https://en . Wikipedia . org/wiki/List _ of _ Game _ of _ Thrones _ episodes
  8. https://data.world/data-society/game-of-thrones
  9. https://www . vulture . com/2019/04/game-of-thrones-battle-of-winter fell-who-will-die . html说对了吗?
  10. 我自己
  11. https://Mashable . com/article/game-of-thrones-white-walker-night-king-long-night/
  12. https://www . wired . com/story/game-of-thrones-ploters-vs-pants ers/

为什么 Git 对于数据科学是不够的

原文:https://towardsdatascience.com/why-git-is-not-enough-for-data-science-7002995d9e16?source=collection_archive---------20-----------------------

一个数据科学家该不该学 Git?

TL;几乎每个软件开发项目都使用 Git 来跟踪代码和文件的变化。基于这种跟踪每一个变化的能力,数据科学项目对 Gits 的采用也有了巨大的增长。在本帖中,我们讨论:

  1. Git 给数据科学带来的好处
  2. Git 的差距和局限性
  3. 将 Git 用于数据科学项目的最佳实践

对于熟悉 Git 的人,请跳到“为什么学习 Git 对数据科学很重要”一节

什么是 Git,它是如何工作的?

“Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小到大的所有项目。”— 饭桶

正如描述所说,Git 是一个版本控制系统。它有助于记录、跟踪和保存对源代码所做的任何更改,并快速、轻松地恢复任何以前的状态。

Git 使用分布式版本控制模型。这意味着存储库可以有许多副本(或者 GitHub 世界中的分支/远程)。当在本地工作时,Git 是您将用来跟踪您的存储库的变更的程序。

GitHub.com是互联网上的一个位置,作为您的存储库的远程位置。GitHub 为您的作品提供了备份,如果您的本地副本丢失(例如,如果您的计算机从码头上掉了下来),可以找回这些备份。GitHub 还允许你分享你的工作,并在一个项目上与其他人合作。

与 GitHub 类似的工具有 GitLabBitbucket

来源:斯科特·沙孔和本·施特劳布的 Pro Git。

Git 和 Github、GitLab 或 Bitbucket 如何帮助您更好地工作

Git 有几种帮助开发项目的实用方法。

  • 使用 git 跟踪本地代码的变化。
  • 在不同版本之间同步代码(即您自己的版本或他人的版本)。
  • 在不丢失原始代码的情况下测试对代码的更改。
  • 如果需要,恢复到旧版本的代码。
  • 在云上备份你的文件(GitHub/GitLab/Bitbucket)。
  • 在 GitHub/GitLab/Bitbucket 上共享您的文件并与其他人协作。

到目前为止,很清楚为什么 Git 是一个强大的工具,它将帮助你记录、跟踪和存储对项目中几乎任何文件的任何更改。我们知道 Git 如何帮助你在团队中更好地工作,这也是 Git 在软件开发项目中如此广泛使用的主要原因之一。

这些优势也与数据科学项目相关,用于管理支持其工作的代码,但这并不是一对一的。

学习 Git 对数据科学很重要吗?

如果你想作为合作者加入一个数据科学项目,你将不得不面对一些挑战,例如;

  • 回顾所有正在进行的关于特定主题的研究和存储库,并选择最有希望的一个。(如果你正在做一个开源项目)
  • 您需要了解该项目的当前状态,以及它是如何随着时间的推移而发展的。
  • 确定哪些方向是有前景的,仍然值得探索。在这一步,回顾尝试过并放弃的想法和方法也很重要,因为你不想重复别人尝试过但没有成功的工作。通常,这些失败的方法不会被记录和遗忘,这是一个巨大的挑战。
  • 你需要收集项目的所有部分(数据、代码等。)可能分布在多个平台上,有时并不完全可访问。
  • 最后但同样重要的是,一旦你做出了一些改进或探索了一个新的方向,就没有简单的方法将你的成果反馈到项目中。

总的来说,现在有多种挑战无法用今天的工具很好地解决。

现在让我们看看 Git 如何帮助我们填补一些缺失的部分。

有了 Git 跟踪我们对文件所做的每一个更改的能力,我们就可以显示所有的方向,它们是何时被谁执行的!可以将整个 Git 历史看作一个真实的故事,理解每一步都做了什么(提交)并有一些文档(提交消息)。您还可以使用前面提到的平台之一与其他合作者共享它。

通过使用更传统的软件开发工作流程,您开始将您的模型更像是一个应用程序,而不是一个脚本,这使得它更容易管理,并导致更高质量的结果。

尽管如此,Git 也有局限性

尽管使用 Git 这样的版本控制工具有很大的好处,但是它们也带来了很高的开销。

开销来自于需要确保每个更改都经过“提交”过程,这通常意味着使用命令行和终端。既然终端对于大多数分析师(甚至数据科学家)来说是如此陌生,那么你不仅仅需要学习 Git,你还需要学习终端!这并不迅速,而且在努力记住要写什么命令的同时让你的效率受到影响是一个巨大的障碍。如果这是你的情况,你可以查看这篇博客文章有效的 Linux & Bash 给数据科学家

此外,Git 不能独自承担所有的重担。我这么说是什么意思?

使用 Git 构建数据科学项目的最佳实践。

照片由丹妮尔·麦金尼斯Unsplash 上拍摄

综上所述,我提出了一个将 Git 思维整合到您的 DS 项目中的解决方案。它由几个部分组成:实验跟踪、版本控制和使用数据作为源代码。

实验跟踪

您可以通过两种方法实现实验跟踪,要么使用专用工具,要么使用 Git。您还可以在适合您的数据科学工作流程的 ML 实验跟踪工具上找到更多相关信息

外部跟踪

你必须在外部系统上记录你所有的实验信息。

这种方法有一些优点:

  • 已经开发了许多优秀的工具
  • 这是一种直观的方法。在采取新的方向在 git 项目上创建新的提交之前,没有必要停下来

但是,有利也有弊:

  • 代码和实验结果之间没有明确的联系
  • 很难复习
  • 再现性。重现导致实验结果的东西并不容易

带有 Git 跟踪的版本控制

您认为每个实验都是 git 提交,这意味着对项目的任何更改都会创建一个新版本,因为代码、数据和参数都是源代码的一部分

一些优点是:

  • 复制很容易,只要做一个 git 检验,你就有了代码、参数、数据和模型。
  • 你得到了与实验相关的所有背景
  • 协作。正如本文所提到的,Git 与其他一些平台的结合为您提供了并行化工作的可能性
  • 如果与数据版本工具结合使用,您还可以接受数据贡献
  • GitOps、CI/CD——更容易与 CI/CD、PRs 的现有 git 生态系统集成

它也有一些缺点:

  • 当有很多实验时,意味着有很多提交,可能会很混乱
  • 改变心态,开始考虑任何新的方向

当然,你可以把这两种想法混合起来。

数据作为源代码

正如我之前提到的,开发 Git 是为了跟踪文本文件中的变化,而不是大型二进制文件。因此,跟踪项目数据集不是一个选项。这就是为什么我推荐使用两个选项:

  1. 对于不变的数据集,您可以将其上传到服务器并通过 URL 进行访问
  2. 如果您有一个可能会改变的数据集,您应该考虑使用一个工具对其进行版本控制。你可以在这里找到一个很棒的对比对比数据版本控制工具

你还可以在这篇博文中找到更多关于为什么对数据集进行版本化是个好主意的信息数据集应该像 Git 存储库一样运行

结论

为 Git 实现这些建议的实践有几个好处:

  • 将所有项目文件、数据和模型整合到一个地方
  • 审查工具,使其更容易为正在进行的项目做出贡献,并更容易检查这些贡献。
  • 更容易复制和重用以前项目中的工作
  • CI/CD,如果您对所做的贡献感到满意,您可以有一种自动的方式来合并它们,获取代码和数据,测试它们,并将其交付给生产。

日复一日,Git 被用于更多的数据科学项目。我希望通过阅读这篇文章,你能更好地理解它的局限性和优点,以及如何与你的同事一起使用它。祝你好运!

如果你喜欢这篇文章,请在 TwitterLinkedIn 上联系我。谢谢,下次再见!😃

原载于 2021 年 4 月 29 日 https://dagshub.com**的

线性回归:梯度下降与解析解

原文:https://towardsdatascience.com/why-gradient-descent-is-so-common-in-data-science-def3e6515c5c?source=collection_archive---------6-----------------------

解释为什么梯度下降在数据科学中经常使用,并用 C 语言实现

照片由trần ngọc·万Unsplash 上拍摄

介绍

梯度下降 是一种无处不在的优化算法,在数据科学中广泛应用于神经网络、线性回归和梯度推进机等算法中。但是,为什么用的这么频繁呢?

梯度下降直觉

让我们从解释梯度下降开始。这将是一个简短的描述,因为这个主题已经被彻底覆盖,所以如果你想要一个更密集的解释,请参考其他博客或教程。

梯度下降是一种一阶迭代法求一个可微函数的最小值。我们从初始猜测开始,并在当前猜测的计算梯度的相反方向缓慢下降。然后更新初始猜测,产生新的改进值。这个过程依次执行,直到我们收敛到最小值

在机器学习中,这个微分函数就是损失函数,它告诉我们当前模型与数据的拟合程度。然后使用梯度下降来更新模型的当前参数,以使损失函数最小化。

简单线性回归的梯度下降

也许证明梯度下降最简单的例子是一个简单的线性回归模型。在这种情况下,我们的假设函数,依赖于一个单一特征变量、:

作者对我们模型的假设

其中 θ_0θ_1 为模型的参数。这个问题的损失函数是误差平方和(SSE)** 😗*

作者的和或平方损失函数

因此,我们将使用梯度下降法来寻找使上述损失函数最小的参数值。

正如你所看到的,损失函数是可微的,并且有一个抛物线形状,因此它有一个最小值。如前所述,梯度下降通过在梯度的相反方向迈出小步来更新模型的参数。因此,我们需要计算损失函数相对于两个参数的梯度:

作者截取的渐变

作者绘制的坡度

这些参数随后更新为:

按作者截取更新

按作者更新坡度

其中 η学习率,决定了每个参数更新的步长。学习率在零和一之间,指定我们多快收敛到最小值。如果太大,我们可能超过最小值,但是太小会导致更长的计算时间。因此,需要找到一个快乐的媒介。这就是超参数调整通过网格和随机搜索甚至贝叶斯方法使用的地方。

给定足够的迭代,在数据科学中这被称为训练时期,梯度将趋向于零。因此,参数的当前值已经最小化损失函数并且已经收敛。

解析

然而,简单线性回归模型确实存在解析解。不使用数值技术,我们可以简单地将偏导数方程设置为零:

作者方程式

作者方程式

这是一个由两个线性方程组成的系统,其中两个未知数可以解析求解。通过数学推导和重新排列,满足上述方程的参数值为:

作者截距公式

作者的斜率方程

其中 ȳ 分别是数据的平均值和目标变量的平均值。因此,通过计算这些平均值,我们可以找到使损失函数最小化的参数,而无需使用迭代方法!

以上方程是简单线性回归模型解析解。这只是针对线性回归模型一般解决方案的简化版本,其中我们可以有两个以上的未知参数:

一般解决方案,作者方程

其中 X 为数据矩阵, Y 为目标变量矩阵,θ为参数矩阵。

那为什么是梯度下降呢?

那么,当存在解析解时,我们为什么要使用梯度下降法呢?这个答案完全基于计算时间和空间成本。

梯度下降的时间复杂度为 O(kn ) 其中 k 为特征个数, n 为数据点总数。这种复杂性可以通过矢量化实现进一步提高。这就是今天大多数机器学习算法的实现方式。

然而,线性回归的一般解析解的时间复杂度为 O (𝑛)。因此,对于小数据集,差异可以忽略不计,但计算时间差会随着数据大小的增加而呈指数增长。实际上,大多数数据集大约有 100 个要素,100 万行。因此,对于这些情况,解析解是不可行的。

此外,对于某些模型,如泊松回归逻辑回归,将导数设置为零会导致一组非线性方程 没有闭合形式的解析解,因此,我们被迫使用数值方法,如梯度下降。

结论

梯度下降优于解析解,因为它的计算速度和一些回归模型缺乏封闭形式的解决方案。这使得迭代数值方法的实现成为必要。

我希望你们喜欢这篇文章,并学到了一些新东西!有很多其他的文章对我在这篇文章中浓缩的一些推导进行了更深入的探讨,所以我建议大家去看看!

和我联系!

(所有表情符号都是由 OpenMoji 设计的——开源的表情符号和图标项目。许可证: CC BY-SA 4.0

额外的东西!

下面显示的是我用 C 编写的示例代码,展示了如何对梯度下降进行编程!

**#include <stdio.h>
#include <stdlib.h>
#include <math.h>double dydx(double x);int main(){ int epochs, i; 
  double learning_rate, x, x_new; printf("Enter your intial guess integer: ");
  scanf("%lf", &x);      

  printf("Enter how many epochs: ");
  scanf("%d", &epochs); printf("Enter your learning rate: ");
  scanf("%lf", &learning_rate); for (i=1;i<epochs+1;++i){

    x_new = x;
    x_new = x_new - learning_rate*dydx(x_new); if ((x - x_new) < 0.000001){
      printf("number of epochs to coverge %d\n", i);
      break;  

    } x = x_new; } printf("The value of x that minimises is %lf", x);}double dydx(double x){
  return 2*x - 5;
}**

完整代码可以在我的 GitHub 上找到:

**https://github.com/egorhowell/Medium-Articles/blob/main/Data Science Basics/gradient_descent.c **

为什么梯度下降有效?

原文:https://towardsdatascience.com/why-gradient-descent-works-4e487d3c84c1?source=collection_archive---------15-----------------------

每个人都知道什么是梯度下降,以及它是如何工作的。有没有想过它为什么有效?这里有一个数学解释

塞维多夫·切梅里斯Unsplash 上拍摄的照片

什么是梯度下降?

梯度下降是一种迭代优化算法,用于优化机器学习模型(线性回归、神经网络等)的权重。)通过最小化该模型的成本函数。

梯度下降背后的直觉是这样的:把代价函数(用f(θ̅)其中θ̅=[θ₁、……θₙ)标绘在 n 维度上)画成一个碗。想象在那个碗上随机放置一个点,用 n 坐标表示(这是你的代价函数的初始值)。这个“函数”的最小值将是碗的底部。

目标是通过在碗上逐渐向下移动到达碗的底部(或最小化成本)。为了实现这一点,我们应该知道碗在不同方向上相对于当前点的斜率,这样我们就可以决定向哪个方向移动以获得最快的收敛。为了确定这一点,我们计算函数在该点的梯度。通过迭代,我们将最终到达某个最小值点,该点的坐标将是模型的最优权重。

梯度下降是如何工作的

下面是梯度下降的更正式的定义:

从输入矩阵×t35开始,n 维输入向量和一个初始值给权重【θ̅】,我们知道,在线性回归方程中给出:【y̅=【θ̅ᵗ】×现在,如果成本函数由f(θ̅),** 给出,这就是我们如何制定梯度下降:******

梯度下降算法公式(图片由作者提供)

这里, t 是迭代计数器,【tₘₐₓ】是我们运行循环的最大迭代次数。

为什么有效

这里的第一个问题应该是:二阶导数测试以及任何函数f(【θ̅】)等于零时的二阶导数告诉你θ̅是该函数的局部最大值还是局部最小值。现在,既然我们对最小化感兴趣,我们可以逆向工程这个概念,求解θ̅给定**t13】f(θ̅)的二阶导数为负。**

那么,为什么我们不这样做,而是迭代地解决最小化问题(如梯度下降)?答案在于,首先,也是最重要的,二阶导数不能保证永远存在。第二,求解θ̅ₘᵢₙ的二阶导数方程的计算复杂度非常高。事实上,有时不可能用微积分来解决,而必须用数值来解决。**

最小化问题

因此,在数字上指定一般的最小化问题(并因此迭代),我们说θ̅ₜ₊₁=θ̅ₜ+dₜ其中 dₜ 是在时间的最小化的一些一般方向(回头看碗的例子)**

最小化算法通用格式的规范(图片由作者提供)

现在,来选择合适的dₜθ̅ₜ₊₁<θ̅ₜ**——然后我们走向最小化。****

泰勒级数

为了解决上述最小化问题,我们利用泰勒级数来表示 n 维度。我们用以f(θ̅ₜ)为中心的泰勒级数来计算f(θ̅ₜ₊₁)。*** 这是它的样子:***

n 维泰勒级数及其在 1 维泰勒级数中的对应项(图片由作者提供)

海森矩阵(图片由作者提供)

这里的矩阵是海森矩阵,代表函数f()的二阶偏导数

接下来,我们从最小化的定义中代入方程:θ̅ₜ₊₁=θ̅ₜ+*dₜ*****

求解泰勒级数(图片由作者提供)

在上图中,我们在渐近项本身中加入了三次项,因为我们只想处理前两项,我们得到了【o(||dₜ||】)。 接下来,如前所述我们尝试选择最小化的方向这将给我们f(【θ̅ₜ₊₁】<f(【θ̅ₜ】)并因此引导我们在 t 时间步长上朝向最小化。**

我们选择 dₜ 作为时间的代价函数的梯度的负值,并且开始出现与梯度下降的相似性,并且我们获得最后一条线。注意,在上面最后一行的等式中,第一项和第二项是相似的,最终结果可以是正的,也可以是负的。这实际上取决于包含在渐近界限内的高阶项。为了确保我们最终在右边得到一个负值,并且随着时间的推移得到一个递减的值,我们引入了一个新术语 α

…还有维奥拉!

介绍最小化中的学习率(图片由作者提供)

你猜对了! α 就是我们平常看到的梯度下降的学习率。引入 α 并确保很少保证上述最终等式中的第二项总是小于第一项,因此,我们在右侧得到一个负的结果。这反过来确保了我们最小化函数f()随时间

本文灵感来源于 Rutgers 大学 Cowan 博士的系列讲座。

你可以在这里找到方程式的 Latex 文件。我很乐意在 Linkedin 上联系!

为什么图论比你想象的要酷

原文:https://towardsdatascience.com/why-graph-theory-is-cooler-than-you-thought-4df73e2a4950?source=collection_archive---------17-----------------------

思想和理论

机器学习中的图论,以及它是如何改变游戏的

这是关于图论和图形神经网络的四部分系列的第一篇文章。

照片由纳斯蒂亚·杜尔希尔Unsplash 拍摄

什么是图?

与任何学科的科学家交谈,并根据他们的学科问他们这样一个问题:“at 材料的第和第是如何工作的?”你可能会发现,在你能够真正理解任何给定事物如何工作之前,你必须考虑一些系统和网络:无论是人体、生态系统中的食物链、化学反应还是整个社会。在不了解一个生态系统中两个动物之间的关系,一个分子中的两个原子,或者我们身体中的细胞和组织之间的关系的情况下,你只是拥有一堆数据:细胞的列表,动物的读数以及它们吃什么等等。

传统的机器学习模型通常以这种方式获取数据:它们获取数据列表或表格,并做一些事情(细节取决于所使用的算法以及其他一些参数)来预测一件事情。但是对于某些问题,有更好的方法。

图形是表示它们所包含的数据的网络或关系的数据结构。通常,它们被表示为“节点”和线,或者“边”。

图 1:用图表示的社交媒体网络的示例,虚线或实线表示关系的强度。图片由戈登·约翰逊拍摄,来自 Pixabay

上面的图 1 是一个“无向图”的例子,或者说,一个数据与其他数据有双向关系的图。这意味着我们图中的每个节点,每个代表一个社交网络中的一个人,都与其他节点相连接。这可能代表一个像 LinkedIn 这样的社交网站,在那里一旦你和某人联系上了,你就和其他人联系上了。有向社交网络图的一个例子可能是 Twitter,其中用户互相关注(并不总是互相关注)。

代表数据(用户)的图像被称为节点顶点,连接它们的线被称为边。这些线表示顶点之间的关系,可以表示为“全有或全无关系”(即:你跟随某人或你不跟随),或者表示为“加权”关系(即:实线可以表示两个用户之间的较高参与度,而虚线可以表示较弱的关系或较低的参与度)。

在这一点上,很可能你正在感受我第一次在计算机科学课上接触到图形和图论时的感受:无聊并且可能有点困惑。好消息是,既然我们已经涵盖了理解好东西所必需的一些术语,我们可以开始进入为什么图表很重要,是什么让它们如此酷。

那又怎样?

在计算机科学中,图形已经被用于一些非常好的东西:例如,你的地图应用程序正在幕后使用图形来存储关于位置和连接它们的街道的数据,并且正在使用最短距离算法来为你找到到达目的地的最短路线。

但是当我们开始使用图表进行机器学习时,情况会变得更好。因为图表展示了数据片段之间的综合关系(与数据的有序列表或张量相比,后者本身很少告诉我们数据点或特征之间的关系),我们可以使用它们来执行深入的分析,并基于这些关系做出预测。

图论和机器学习——但是怎么做?

在我们开始收获将我们一直谈论的这些图表或网络与机器学习相结合的好处之前,我们必须以某种方式用计算机——然后是机器学习算法——可以理解的方式来表示我们的图表。

传统上,图表可以用三种基本方式之一来表示:

  1. 邻接矩阵

邻接矩阵确实…就像它们听起来要做的那样。它们使用矩阵表示不同节点之间的连接,或。我们可以看一个例子来说明这可能是什么样子:

图 2:简单的图及其邻接矩阵,由 Safet Penji 通过来源提供。

在这里,我们可以通过找到它们的标签在矩阵中的交叉点来找到两个音符之间的边。例如,我们可以看到,节点 1 没有连接到自身,而是连接到节点 2。

2。边缘列表

边列表是以一种计算上可理解的方式来表示我们的网络或图形的另一种方式。这里,我们在一个列表中表示成对的连接节点。你可以看到下面的例子:

图 3:边列表包含相互连接的顶点或节点对。图片作者自己的。

3。邻接表

邻接表结合了上述两种方法,表示一个节点列表,连接到所有直接连接的节点列表。为了说明这一点,我们来看一个例子:

图 4:图 2 中𝝘₅的邻接表的可视化表示。这表明对于节点 1,我们有一个连接节点的列表,等等。图片作者自己的。

通过以上三种方法,我们能够解决在代码中计算表示图形的困难。然而,当向机器学习模型馈送图形时,仍然存在一些挑战。传统上,深度学习模型擅长处理占用固定空间量且单向的数据。无论我们如何表示它们,图都不会占用固定的内存空间,也不是连续的,而是每个节点都有一个对它直接连接的节点的引用。

有一些非常棒的方法来应对这些挑战,我将在以后的文章中深入探讨。现在,如果你感兴趣,我会给你留下一些资源供你自己研究,这些资源为我们提供了新的方法来扩展机器学习能够解决的问题。

图论和机器学习——我们能用它做什么?

真空中不存在任何东西,理解构成我们许多科学学科的相互关联的数据网络为回答如此多的问题提供了令人兴奋的潜力——超出了我在本文中所能涵盖的范围。

如果我们能更好地理解人脑会怎么样?如果我们可以预测一些刺激或变化对生态系统的影响,会怎么样?或者,预测哪种化合物最有可能创造出有效的药物?

我们刚刚学到的最好的部分是我们可以——这不仅仅是理论上的可能性,而是我们现在正在做的事情!

图论已经被用于:

  1. 诊断建模(在一定程度上预测患者是否有特定诊断)
  2. 帮助癌症患者进行诊断和治疗
  3. 开发药品(药物)

4.寻求发展生态学和进化论之间的理论综合

图论如何让这一切发生

让我们更深入地研究一下这些应用程序,这样我们就可以更详细地了解图论在其中的应用。

让我们以诊断模型为例。具体来说,我想看看这个网络分析用于诊断和识别患者中可能的精神分裂症的例子:

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3782171/

使用图表来表示大脑的网络分析,神经科学家能够绘制与精神分裂症诊断相关的关键发现。鉴于精神分裂症的发病有某些标志:

  • 效率较低的有线网络
  • 较少局部聚类
  • 较少层级的组织

我们可能会用机器学习算法来评估这些网络,并根据这些标记来预测患者患有或将会患精神分裂症的概率。

MART PRODUCTIONS像素上拍摄的照片

在这个例子中,如果没有这些网络的知识,这种分析就变成了对病人的完全不同的神经学分析。对精神分裂症的这些发现的有希望的发现对这种疾病的诊断和治疗具有有希望的意义——可能的早期诊断和干预远远超过简单的评估症状。

这只是一个例子,但完全说明了图论在机器学习中的好处,因为它与其他学科交叉。

事实是,我们的数据往往比我们单独用列表、数据框或张量所能表示的要多得多。虽然有很多方法可以探索我们的数据,并以我们可以假设关系的方式呈现它,甚至使我们的算法能够预测这些关系,但当我们能够以不同的方式表示我们数据之间的联系时,我们就能够对我们拥有的数据做更多的事情。

当我们理解了事物相互关联的方式,我们就能更好地理解它们:我们能做出更全面的预测,回答更难的问题,带来一些改变生活的美好结果。

想了解更多?查看该系列的其余部分:

属性:

  1. 关于图论和机器学习你需要知道的一切
  2. 图论&神经科学中的机器学习
  3. 了解你的邻居——图上的机器学习
  4. 用于精确肿瘤学的基于网络的机器学习和图论算法

为什么强化学习还没有征服世界(至今)?

原文:https://towardsdatascience.com/why-hasnt-reinforcement-learning-conquered-the-world-yet-459ae99982c6?source=collection_archive---------17-----------------------

优化已经存在了几十年,机器学习实现了一个又一个突破。以强化学习的形式将两者结合起来,应该是解决问题的圣杯。为什么不是呢?

Artem Beliaikin 在 Unsplash 上拍摄的照片

登机时你可能没有意识到这一点,但起飞时间、燃料水平、维修人员和起飞航线很可能都是由数学优化模型决定的。无论是精确解如线性规划还是强大的启发式算法如遗传算法,优化模型是许多调度和资源分配问题背后的无声力量。在不断增长的计算能力和求解器进步的推动下,特别是在 20 世纪 90 年代,优化技术在所有行业都得到了广泛应用。虽然不一定是今天的“热门”话题,但计算机仍然在努力解决几乎每个领域中难以想象的大型优化问题。

机器学习和人工智能的进步更加突出。很少有一周没有关于新突破的令人愉快的头条新闻。检测假新闻,面部识别,给一首难以捉摸的歌曲命名——无监督和有监督的学习在现实世界中都获得了巨大的成功。特别是神经网络非常善于发现模式;如今丰富的数据提供了源源不断的新测试用例。

信奉这两个领域会产生一些非常强大的后代,这似乎是很自然的。这个后代被更好地称为强化学习。通过从环境中学习来不断改进决策,我们理论上有了一个非常强大的自我学习框架,能够同时做出明智的决定,并从中学习以做出更好的决定。但事实上,我们并不在那里,一点也不在。

当然,AlphaGo 令人印象深刻,训练马里奥导航蘑菇王国也是如此。也有一些现实世界的成功值得庆祝。RL 好像挺适合 A/B 测试的。RL 可能会学习裁剪你看到的广告。 Optimal Dynamics 在运输领域做着非常有趣的工作。简而言之,毫无疑问,有成功的 RL 应用在流通。但是声称 RL 目前被广泛部署来解决现实世界的问题——绝对不是。

是什么让强化学习如此艰难?

考虑一个拥有 10,000 种产品类型的仓库。每个产品的预期销售额是已知的。问题是每种类型每天订购多少(比如 10 天的时间跨度),考虑到交货时间、存储容量、销售损失成本等。这是一个巨大而复杂的问题,但可以通过当代优化技术很好地解决。

预期这个词在这里至关重要。实际上,某一天可能会卖出无数种产品组合,每种组合都代表一种独特的场景,导致一种新的库存状态。对于每个州,我们都希望有能力做出正确的决定。决策是按顺序做出的:我们订购产品组合,观察售出的产品,在一天结束时,我们必须能够为可能出现的每一种可能的情况做出重新订购的决定。

换句话说:确定性优化提供决策随机性优化提供决策策略。确定性优化解决单一问题,随机优化解决所有可能出现的问题。RL 没有告诉我们要做什么决定,而是如何做出决定。这是一个完全不同的游戏。

JJ 英Unsplash 上拍照

监督学习和 RL 之间的差异也很大。技术可能是相似的,例如,神经网络在两个领域中都是常见的。在监督学习中,神经网络可以将图像作为输入,并预测正确的标签。在 RL 中,考虑一个 Q 网络,它将问题状态作为输入,并返回对应于该状态的值。两者都可以被视为监督学习的样本。

然而,在前一种情况下,图像标签是静态的。相比之下,对应于状态的 Q 值是依赖于策略的——随着每次策略更新,该值也应该改变。因此,这个问题实质上更具有动态性。此外,RL 中的行为通常只对累积奖励有部分影响,随机性也起着很大的作用。神经网络在检测模式方面非常出色,但也容易产生拟合噪声。即使对于玩具大小的 RL 问题,神经网络也常常难以学习准确的值。

逆向物流实践中的瓶颈

我们已经讨论了为什么 RL 在某些方面比确定性优化和监督学习更难(尽管这些领域自然有它们自己的挑战)。然而,人类以前曾攻克过难题,这还不是全部。

其实 RL 文学的理论体还是挺可观的。许多对于动态或随机规划来说完全难以解决的问题已经被 RL 解决了,并且经常有令人印象深刻的结果。计算机科学的例子可能是最著名的,然而工程界也提出了许多聪明的算法。

那么,为什么我们在实践中很少看到这种情况呢?

分散的社区

尽管许多研究团体处理 RL 问题,但是工具和术语有很大不同。照片由凯蒂·哈普Unsplash 拍摄

无需过多钻研历史;RL 起源于不同的领域,并沿着道路经历了分支和转化。因此,有许多不同的社区,都有自己的应用程序、符号风格、术语和建模约定。部分由于这种分散性,也没有通用和成熟的 RL 算法工具箱,就像有监督学习和确定性问题一样。

也可能有人认为,学术界和实践界作为一个群体被隔离得太多了。RL 可以分为四个政策等级。学术界倾向于关注数学上优雅的解决方案,而工业界更依赖于直接采样和确定性模型的扩展。政策的可解释性在学术著作中也经常被忽视。因此,RL 研究很少付诸实践。

[## 强化学习的四个策略类别

towardsdatascience.com](/the-four-policy-classes-of-reinforcement-learning-38185daa6c8a)

问题建模

在考虑解决方案之前,我们必须首先确定问题所在。马尔可夫决策过程在规范形式上看起来足够简单,然而的实际实现可能包含数千行代码。

在不深入理论的情况下,以下几个方面是相关的:

状态 →决策需要哪些数据?这不仅需要物质资源,还需要信息甚至信念。

动作 →给定状态下允许哪些动作?在模拟中可行的行动在现实中可能是非常不可取的。行动空间的大小也经常被证明是一个瓶颈。

转移函数 →通常隐藏为一个简单的概率,这个函数捕捉所有的系统动态。对管理一个真实系统的动力学建模是一项非常复杂的任务,即使只是近似地捕捉它的行为。

奖励 →定义合适的 KPI 很难。在实践中,可能有多个标准和模糊的目标,但没有任何机器学习算法可以在没有明确指令的情况下学习。

将世界视为服从顺序决策的随机系统不一定是自然的或直观的,这导致了许多不适定的问题。

数据可用性

RL 在游戏中表现如此出色的原因是它们可以无限多次重复。在代理经过适当的训练之前,可能会播放数十亿集。

当从现实生活中进行观察时,不可能在任何接近的地方收集到一个重放缓冲区。根据问题的性质,在现实中测试一个策略可能需要几个小时、几天或几个月。此外,在现实世界中失败是昂贵的——想想安全措施,想想财政限制。这样,探索的空间就少了。时间和成本阻碍了建立一个丰富的观察集。重要的是,现实生活中的数据只反映了现实生活中使用的策略,而我们想要测试许多策略。

一个代表现实的仿真模型就避开了这样的问题。然而,说起来容易做起来难。为了逼真地模拟现实,模拟环境需要大量的实时数据。直到最近,数据还没有以这样的规模收集和存储。

如果没有一个非常好的模拟环境,几乎不可能获得足够高质量的观察结果和学习策略。

未来展望

数据科学家和学术研究者喜欢新奇,只要他们能驾驭机器学习浪潮,不断取得突破,就会有源源不断的新发展。承诺即插即用 RL 算法的项目也在增加,不可避免地最终会产生更多的标准化解决方案。对于机器学习任务来说,测试一系列算法并选择最合适的算法是很容易的,毫无疑问 RL 会随之而来。

受物联网技术的兴起及其提供的大量实时系统数据的刺激,构建丰富的、数据驱动的模拟环境变得更加容易,这种环境被称为数字双胞胎。这项技术能够模拟现实的详细虚拟代理,从而能够进行比现实世界允许的更多的实验。未来的 RL 实现可以在这种替代现实中进行培训,从而极大地增加了学习适用于现实世界的策略的机会。

最后,对机器学习的理解将随着时间的推移而提高。仍然有太多的公司将机器学习视为一个神奇的黑盒子。成功的 RL 需要对顺序决策问题、随机环境和部署的技术有深刻的理解。构建模块就在那里,但通常仍然需要点击。可解释人工智能的进展也加深了对 RL 内部机制的理解。

简而言之,我不认为 RL 是一条死路,一点也不。如果说有什么不同的话,那就是我们正处在现实世界巨大进步的边缘。就在五年前,数据科学的世界看起来与今天大不相同。这场革命不会很快停止,许多实际障碍的解决方案似乎触手可及。

RL 是否真的会‘征服世界’,我不确定。然而,成功的实际实施似乎只是时间问题。

外卖食品

  • RL 的目标是找到一个在任何情况下都有效的政策,而不仅仅是一个决定。这使得它比确定性优化困难得多。
  • RL 通常应用于噪声随机环境;机器学习算法倾向于适应噪声,而不是可控模式。
  • RL 面临的挑战是许多不同的子领域(没有统一的语言或工具箱),以数学形式表示问题,以及依赖有限的真实世界观察来学习策略。
  • 数据科学和研究的进步将在不久的将来克服某些 RL 挑战。特别是,数字孪生环境似乎非常有希望使用现实的虚拟代理来学习政策。

进一步阅读

凯捷(2020 年)。强化学习值得大肆宣传吗?https://www . capgemini . com/g b-en/2020/05/is-reinforcement-learning-worth-the-hype/

Dulac-Arnold,g .,Mankowitz,d .和 Hester,T. (2019)。现实世界强化学习的挑战。https://arxiv.org/pdf/1904.12901.pdf

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

鲍威尔。世界银行(2020)。卡车运输行业的顺序决策分析。最优动态。

为什么以及如何将自己推销为一名数据工程师

原文:https://towardsdatascience.com/why-how-to-market-yourself-as-a-data-engineer-98633371ea7b?source=collection_archive---------31-----------------------

理解营销的价值,这将有助于突出你的优势

卖水果的男人【数码图片】https://unsplash.com/@timmossholder

以下是我从 Swyx 在 DataTalks.Club. DataTalks 的伟大的播客中获得的信息。Club 是一个伟大的数据爱好者社区,每周都有活动,并有来自业界的顶级演讲者。在这篇博客文章中,你会明白营销本身的附加价值,你会得到一些关于如何开始的见解。当我踏上在公共场合更好地营销和学习的旅程时,我觉得分享一些让我产生共鸣的演讲要点会很有趣。

为什么你应该能够推销(自己)

作为一名数据工程师和技术人员,市场营销似乎远离我们的领域。当我们想到营销时,我们要么看到一个卖东西的西装男的陈词滥调,要么看到一个蹩脚的电视商业广告。然而,有大量的理由让你能够推销和推销自己。以下是其中的几个例子:

  • 得到认可,拿到应得的薪水。
  • 能够推销你对技术解决方案的看法。

得到认可

从找工作到升职,你的技能得到认可显然会让你赚更多的钱。一个惊人的事实是,当你是一个年轻的毕业生时,第一份工资的差别。在这一点上我们都是不平等的,这是因为有些人比其他人更好地推销自己。大三学生经常害怕协商薪水,但事实上,这样做没有坏处,招聘人员也习惯了。你需要学习如何去做。

数据工程师每天都在销售。

今天,解决一个给定的技术问题有大量的选择。大量的编程语言、前端框架、设计模式和库。你如何同意推进一个特定的解决方案?是的,有一些技术事实你可以评估,但最终,这也是一个销售的问题。向您的同事、团队或经理销售。最终,我们是在向雇主推销我们的服务/时间。

找到你的个人品牌。

如果你做得过分,推销自己可能听起来像一个骗局,但实际上这是关于找到你擅长什么以及你能带来什么价值。当你这样做时,你需要退后一步,反思你的工作。在你想做的事情、你擅长的事情和人们感兴趣的事情之间找到一个平衡点。

人们能把你当成迷因吗?有什么你喜欢经常谈论的事情吗?

无论你决定关注什么,或者你打算在社交媒体上选择哪张个人资料照片,都要保持一致。一致性和重复会帮助你一步一步地扩大你的受众(或网络)。

选择一个你想分享的域名

由于你需要证明一定的专业知识并点燃兴趣,所以范围越窄越好。成为利基专家更容易。有多少人面临着和你一样的问题?

如果你看看黑客新闻、YouTube 或播客上的现有内容,你可以看到是什么引发了兴趣并得到了启发。

在公共场合学习

这听起来可能很可怕,因为我们需要克服他人潜在的负面评价。事实是,只要你诚实和谦虚,很多人会跟随你的旅程并给你反馈。你做错了什么?你做得好吗?

专家是在一个狭窄的领域里犯了所有可能犯的错误的人。——尼尔斯·玻尔

公开做这件事最酷的一点是,与雇主和标准评估流程相比,你可以获得更多的反馈数据。专业没有捷径。你“只是”必须学习并赢得它。

在网上挑选一些导师,和他们交流。你也可以对公司做同样的事情。

为别人写东西更具挑战性,但回报也更大。你需要尽可能地掌握它,之后你可能会更好地记住它。

找到你梦想中的工作

根据你的专长,你可能想专注于某一类型的公司。预过滤公司可能是一个不错的选择。我在我的博客这里谈到了这一点。

不要害怕做免费的工作,拥抱机会。当你表现出奉献和承诺时,机会往往会出现。

如果你没有得到你梦想中的工作/职位,那就考虑长远。这至少会让你在这个行业有一席之地吗?以后有没有可能在公司内部调动?值得一提的是,对于某些职位来说,通过前门进入某家公司可能比内部调动更具挑战性。

内部营销

这是同样的事情,但是观众少了,人们不得不听,因为你和他们一起工作😏。Swyx 给了我们一些提示。

吹牛文档

建立一份自吹自擂的文件,一份 1-2 页的你在公司所取得成就的总结。每当你想要求晋升时,你通常必须向你的经理推销,他可能会把你的晋升机会推销给别人。有一个明确的书面起点是一个好主意,以确保信息得到正确传播。这也有助于你反思你一直在做的事情。

使用公开渠道

站立会议、演示会议、黑客马拉松和内部协会都是你可以参与、分享、展示和鼓舞他人的地方。

采取主动

发挥创造力,从小处着手,获得反馈和成长。如果你为别人创造兴趣,人们会给你更多的责任。

练习公开演讲

纸上推销自己和口头推销自己完全是两码事。你的语气、态度、肢体语言都会增加或减少你的信息的影响力。

掌握所有这些都需要时间,将这视为一项独立的技能很有趣,它将有助于组织你的思想,更好地沟通。

结论

学习如何推销自己,并在公共场合学习,这对你的职业生涯有着疯狂的附加值。这需要时间和勇气,但你不应该害怕开始和做婴儿步!

额外资源:

https://www.swyx.io/marketing-yourself/

https://www.swyx.io/learn-in-public/

迈赫迪·瓦扎又名迈赫迪欧·🧢

感谢阅读!🤗 🙌如果你喜欢这个,跟随我上🎥 Youtube ,✍️ 中型 ,或者🔗 LinkedIn 了解更多数据/代码内容!

支持我写作 ✍️通过加入媒介通过这个链接

为什么我成为了一名数据科学家而不是数据工程师

原文:https://towardsdatascience.com/why-i-became-a-data-scientist-over-a-data-engineer-968e750acf7?source=collection_archive---------5-----------------------

意见

帮助你决定你的职业

照片由un splash【1】上的 Nick Fewings 拍摄。

目录

  1. 介绍
  2. 产品利益相关者协作
  3. Python 优于 SQL
  4. 面向实验
  5. 摘要
  6. 参考

介绍

长话短说,当然,比起数据工程师,我更喜欢做数据科学家,但是为什么呢?也许我将分享的这些来自我个人经历的原因可以与你的想法联系起来,或者至少可以帮助你决定是否要追求其中的一条道路,或者重新考虑转换到另一个角色。虽然这两个角色有着相同的第一个单词,但是这两个位置之间有着巨大的差异。

很容易将数据工程视为之前,将数据科学视为之后。我们将深入探讨这一说法,但从本质上讲,数据工程师提供了数据科学赖以发展并从中获益的基础和结构。需要注意的是,有些职位的要求是重叠的,有些公司甚至将这两种角色结合在一起。然而,我认为最好假设这些是独立的角色,因为它们的关注点有很大的不同。话虽如此,让我们看看数据科学优于数据工程的原因。

产品利益相关者协作

杰森·古德曼Unsplash【2】上拍摄的照片。

在某种程度上,数据科学家有点像产品经理,这在您的决策或推理中可能是赞成或反对的。我喜欢定义问题陈述、确定数据在哪里以及如何获取数据(通常由数据工程师协助)、特征工程、模型比较、最终模型部署以及对产品用户影响的分析。

以下是一些数据科学家关于产品利益相关者协作的经验,你可能喜欢,也可能不喜欢:

  • 识别用户面临的产品缺陷
  • 用算法开发解决方案
  • 在应用程序的前端和中心查看您的产品变化
  • 分析你对企业及其用户的影响,并以此为荣
  • 更多地与产品团队合作
  • 更多地关注产品战略

当然,这些角色之间总是会有一些重叠,即使有上面讨论的这些经历。然而,数据工程师更关注数据本身,而数据科学家往往更关注产品项目。

数据工程师的用户往往也是工作场所的雇员,因为数据科学家可能是数据工程产品 pr 项目的用户。对于数据科学家来说,情况通常相反,产品倾向于面对更多的外部用户,即客户,但数据科学家仍然可以使用内部工具。

Python 优于 SQL

戴维·克洛德在 Unsplash 上拍摄的照片。

这些编码语言非常不同,大多数公司通常希望你精通这两种语言,不管你是数据科学家还是数据工程师。但是,对于数据工程师来说,重点通常是 SQL,而对于数据科学家来说,则是 Python ( 或 R )。也就是说,如果您不喜欢 SQL 或查询,但仍然喜欢数据本身并使用它,那么您很可能属于数据科学的阵营。

以下是数据科学家如何使用 Python 以及何时使用 SQL 的一些示例:

  • Python 在流行的库中使用
  • 包含大部分数据科学部分的 Python 库——机器学习算法
  • Python 也可以用于部署
  • SQL 通常用于预先查询数据集,或者 SQL 用于查询模型的结果,但是,有些查询可以在 Python pandas 查询库模块中完成

同样,你可能会在两种职业中都用到这两种语言,但不同的是在日常工作中你更喜欢用哪一种。如果您只关注模型本身,有时您可能会两周不使用 SQL,而其他时候您可以每小时使用一次 SQL。

面向实验

少女在Unsplash【4】上带着红色帽子的照片。

作为一名数据工程师,你当然可以进行关于时间消耗、内存、成本等方面的实验。,但我所讨论的实验是传统的想法。

作为一名数据科学家,以下是您可能会做的一些实验:

  • 具有重要意义的传统 AB 测试
  • 特征/重要性的比较
  • 模型比较
  • 准确性或误差度量的比较
  • 业务指标比较(KPI—关键绩效指标
  • 以图形/视觉方式比较以上所有内容
  • 比较非常适合与利益相关者和非数据科学家用户进行讨论

这些实验是数据科学工作的核心,实验和比较可以应用于几乎任何工作,但对于算法和静力学来说,实验是关键。

摘要

无论你更喜欢产品方面而不是严格的工程方面,更喜欢 Python 而不是 SQL,并且喜欢测试实验情况,那么数据科学可能比数据工程更适合你。

总而言之,以下是我更喜欢数据科学而不是数据工程的一些原因,也许这些与您的想法不谋而合,或者对您来说可能是新的:

* Product Stakeholder Collaboration* Preference for Python over SQL* Experimentation Oriented

我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些选择数据科学的理由,请在下面随意评论。为什么或为什么不?你认为我们还可以讨论哪些重要的原因或情况?这些当然可以进一步澄清,但我希望我能够阐明一些更独特和具体的为什么我选择数据科学而不是数据工程。感谢您的阅读!

我不属于这些公司中的任何一家。

请随时查看我的个人资料、 Matt Przybyla和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 点击关注图标 的订阅图标,如果您有任何问题或意见,请在 LinkedIn 上联系我。

订阅链接:https://datascience2.medium.com/subscribe

参考

[1]照片由缺口编号防溅板上拍摄,(2018)

[2]Jason Goodman 在 Unsplash 上拍摄的照片,(2019)

[3]照片由大卫·克洛德Unsplash(2018)上拍摄

[4]照片由带着红色帽子的女孩un splash(2021)上拍摄

为什么我选择全栈数据分析作为我的职业道路

原文:https://towardsdatascience.com/why-i-choose-full-stack-data-analytics-as-my-career-path-d7b3986e0285?source=collection_archive---------17-----------------------

埃斯特万·洛佩兹在 Unsplash 上的照片

不是数据科学家,不是 ML 工程师,也不是统计学家。只是一个普通的白色分析扭曲。

类似于寻找伴侣,我认为职业道路是非常私人的事情。没有唯一完美的答案,这完全取决于你的特点、需求、偏好、目标和使命。但是你可以做研究,向其他已经找到配偶的人学习——合适伴侣的特征,并思考这些是否是你自己想要的。

作为数据领域的新人,我最初是一名分析师,与产品经理、业务开发/战略团队以及其他数据英雄一起工作:数据工程师、数据科学家、统计学家、机器学习工程师和数据产品经理。

在观察和体验了几年数据角色的实际工作和行业最佳实践后,我决定追求 (全栈)数据分析 路径。不是作为一名数据科学家(尽管被大肆宣传为 21 世纪最性感的工作),也不是作为一名 ML 工程师(尽管报酬更高),也不是任何其他与数据相关的角色。

我所指的全栈数据分析师是指能够利用数据处理、统计和机器学习方法来提供战术见解并解决产品或业务问题的人。他知道各种数据处理技术,从查询和数据可视化到高级推理统计和机器学习,并且能够利用适当的 T21 来处理某些数据集。他还对业务环境有着广泛的理解,因此能够识别相关的数据点和要提供的见解。

它超越了回答像“我们上个月的销售额是多少”这样的直接描述性问题。"对于类似于"诊断性、预测性和规范性问题,客户满意度的驱动因素是什么?"和"我们如何立即识别滥用/欺诈客户?”。

作为一名全栈数据分析师,我喜欢的 4 件事

1.广泛曝光和动态

数据分析是一个广阔的领域,不同的组织对此角色有不同的期望,他们也有不同的角色命名。它们可以出于不同的目的存在于组织中的不同部门。一般来说,这项工作包括以下内容:

  • 识别与业务问题相关的数据(领域知识)
  • 收集、操作、综合和总结数据(技术知识:查询、统计、数据建模等
  • 向利益相关者展示见解(数据可视化、讲故事和沟通技巧)
  • 将洞察作为数据产品实施——数据工具、启发式、模型部署(技术:工程和机器学习)

考虑到工作的广泛性,很自然地,你需要掌握许多不同的技能来学习和探索。我一直很享受这条职业道路提供的商业和技术知识、硬技能和软技能的混合。

数据分析技能集(作者提供图片)

商业敏锐度和领域知识因你所工作的团队而异。作为一名数据分析师,你与众多利益相关者密切合作解决问题。你的利益相关者会有所不同,从产品团队、工程团队,到战略、营销或设计团队。为了理解他们的问题,你需要了解他们的背景。当你是产品增长的数据分析师时,你可能会熟悉营销渠道、数字营销,甚至不同的产品促销方案。当您是运营团队的数据分析师时,您可能会熟悉业务流程和效率指标。有趣的是,因为利益相关者需要数据来进行重大决策,你将获得利益相关者方面发生的事情的第一手资料

数据分析师的技术暴露差异很大。它肯定涵盖了基本的数据库、查询、描述性统计和数据可视化。当你进行全栈时,你可以一直进行推理统计、机器学习和产品集成。作为一名数据分析师,除了创建报告/仪表板和生成见解,我还一直在开发自己的技术知识,以进行启发式规则集和简单的预测建模这并不仅限于书面见解,我还有机会将它们应用到产品实现中!

2.走进未知,获得灵感!

在某些方面,数据分析工作就像侦探工作。可能会有一些犯罪现场、演员或证据等待检查和审问,但你永远不知道你是否会得到那个谜的“答案”。同样,在数据分析中,有大量的数据有待发现,而在你探索这些数据之前,你不知道你会从中获得什么。

(众多的)利益相关者会带着不同的问题来找你。即使在同一个领域,随着市场的发展,业务问题也是动态的。我总是对研究新问题感到兴奋,一头扎进数据中,探索转换单个数据集的无限方法。一旦开始,好奇号将开始继续探索,并在途中揭开洞见。

图片来源:https://image . free pik . com/free-vector/cat-monster-realistic-composition _ 1284-23966 . jpg;有修改

你最有可能期待的是对利益相关者来说非常鼓舞人心的见解,一些以前没有想过的有趣的东西。不是所有的数据分析结果都是这样的,不管你用的是哪种技术。这完全没问题,因为洞察力可以以多种形式出现。洞察可以是新信息,可以拒绝/验证假设的事实,甚至只是一个非结论性的结果,证实你没有正确的数据来回答问题。当我得到最后一个数据时,我将考虑一个数据代理,并研究如何为我的下一次数据探索获得正确的数据:)

3.速度和实用性

引用凯西·科济尔科夫 这里最好的分析师是闪电般快速的程序员,他们能快速浏览大量数据集,比其他专家说的“白板”更快地遇到并展现潜在的见解。与数据科学中的其他角色相比,数据分析项目的生命周期要快得多。统计学家将需要不同的统计测试来达到一定的置信水平,而 ML 工程师将需要多个过程和培训来提供一个健壮的数据模型。另一方面,数据分析师可以快速浏览当前数据并获得见解,而不会影响质量,因为他们实际上只是强调事实。

我曾在一家超高速发展的初创公司工作过,那里的事情变化非常快,问题需要马上得到回答。

作为一名数据分析师,我能够始终如一地产生影响,即使市场在发展

当然,这只能通过我在过程中确定的一些策略来实现:有更多的战术分析块(而不是宏大的基础分析),并且总是使分析可重复——保存查询并记录下来,或者更好的是,您可以使用 Python/R Notebook 快速重新运行。

我还对分析结果带来的直接和无形影响着迷。在大多数情况下,数据分析师的交付成果是一组可操作的见解,用于利益相关方的决策。一些关键的决策可以改变一个组织的整体方向,想象一下它来自于你的探索!

也有可能可交付成果是一组启发性的规则,用于改进当前的系统。实施变更后,您可以直接看到您的工作以及工程和运营工作对组织的影响。

4.做桥梁和翻译

我开始意识到技术人员(主要是工程师)和非技术人员(商业、管理、创意等)之间存在偏见。通常这些技术人员生活在他们自己的世界里,很难沟通。作为一名对技术感兴趣的工科毕业生,我正在通过成为一名数据分析师来消除这些偏见。

如上所述,数据分析师需要具备多种技术专长。他们需要知道如何使用数据库(PostgreSQL、MySQL、BigQuery,随便你怎么说!)、统计编程语言和库(Python/R)、数学和计算术语、多种数据处理软件(从老好人 Stata 到 Tableau)。可以肯定地说他们是技术人员,但是他们也被期望以一种易于理解的方式向非技术利益相关者交付他们的工作。

为了能够以正确的方式交付,您需要很好地了解您的利益相关者——他们是谁,他们的需求是什么,他们已经知道了什么。通过这种方式,你对他们和他们的问题感同身受,让你对组织的现实问题有所了解。最终,你可以通过数据故事来实现 洞察。

图片来源:https://image . free pik . com/free-vector/statistics-concept-illustration _ 114360-172 . jpg

在某些情况下,可以使用数据模型或其他工程工作进一步扩展洞察交付,作为数据分析师,您可以成为促成协作的推动者。您可以用“人类”语言向业务涉众解释问题和潜在收益,用“技术”语言与数据工程师和/或数据科学家讨论架构解决方案。

结束语

我想再次重申,职业道路的选择确实是个人偏好和决定。而且有时候角色名相同的人在不同的组织里可以做非常不同的事情(好吧,片头戏可不是闹着玩的!).在我的职业生涯中,我一直在一家高速增长的初创公司和一家科技巨头中从事全栈数据分析,这是我真正喜欢的事情。

令我沮丧的是,数据分析的作用被大大低估了,而且还有一些情况下分析被视为二等公民,这肯定会伤害组织和整个行业。这可能是由于组织没有能力很好地利用他们的分析功能,以及不想发展自己的数据分析师 —学习更多数据建模和工程方面的知识。

我分享这些东西是因为我觉得分析(做得好)与我的个性产生了难以置信的共鸣,我非常确定它也可以与其他人相匹配。我建议每个进入数据科学领域的人考虑自己的个人适合度,不要被某些数据科学角色的宣传所拖累。毕竟,你将不得不长期坚持和发展你的工作,所以不妨做一些让你兴奋的事情,对吗?😃

为什么我选择了数据科学硕士学位而不是训练营

原文:https://towardsdatascience.com/why-i-chose-a-data-science-masters-degree-over-a-bootcamp-e538bb305962?source=collection_archive---------32-----------------------

如何驾驭决策过程

维多利亚诺·伊斯基耶多在 Unsplash 上的照片

在我意识到我想转向一个更加以数据为中心的职业之前,我在本科毕业后的专业领域工作了两年。我当时是一名 IT 风险顾问,就前景和发展而言,这是一份很棒的工作,但这不是我的长期激情所在。

我当时的角色有点技术性,但我没有接触到我想要的那么多数据和编程。因此,我做出了艰难的决定,去寻找其他机会,让我在数据科学和分析领域打下坚实的技术基础。让我告诉你,我当时从培养这些技能的渠道方面考虑了一切,包括数据科学训练营、硕士课程和免费在线课程(MOOCs)。最终,我参加了一个我认为最适合我的情况和目标的认证硕士项目,但在这个决定过程中,我花了很多时间来权衡我的不同选择。

为了理解我的决策,我将分享我采取的步骤和考虑。我的希望不是为那些考虑从事数据职业的人指定一条特定的道路,而是分享我的经验以及可以补充或帮助你自己做出决定的东西。

不要重新发明轮子——去寻找那些经历过的人

首先要做的是——尽可能多地了解潜在的训练营,并从其他人那里获得硕士学位。当你没有那么多选择或信息需要筛选时,做决定是容易的,但这并不总是意味着你做出了最好的决定。

通过一个项目的网站在网上寻找信息是很容易的,但是你的研究不应该就此停止。如果一个训练营或大学有一个开放参观或信息会议,试着去参加,准备好几个问题。最好的问题是那些能给你新信息或让你听到个人观点的问题,这些观点是你在阅读小册子或网站时无法找到的。例如,我在纽约市参加了许多训练营的开放会议,在那里当前的成员向未来的雇主、网络和像我一样的未来候选人展示他们的最终项目。这让我对学生们完成的工作和他们的背景有了一种感觉。这也让我可以直接联系他们,并在最后问他们一些具体的问题,比如:

“你在寻找什么样的工作机会,这个项目具体如何帮助你与招聘公司取得联系?”

现在——不是每个人都能轻松参加这样的现场活动(尤其是在全球疫情期间),但幸运的是,我们生活在一个日益数字化和虚拟化的世界。尝试参加任何提供的虚拟会议,或者至少参加一次——在 LinkedIn 上联系你感兴趣的项目的前校友或现学生。具体来说,我每天的目标是在 LinkedIn 上联系至少 3 个我正在关注的项目中的人,他们目前在我感兴趣的公司工作或担任我感兴趣的角色。我甚至在我的日历上安排了一个每日事件来让我掌握它。一开始,在网上接触陌生人似乎有点冷漠和不真诚,大多数时候你会被拒绝,但你会惊讶地发现,如果被适当地询问,有很多人愿意分享他们的经验或联系。

这是我在 LinkedIn 上发给某人的一条真实信息:

作者图片

幸运的是,这一信息导致了与校友成员的直接对话,在那里我解释了我的背景和考虑该项目的兴趣,并了解了他们的经验。最后,那个人强烈反对我参加这个项目。很多时候,像这样的负面消息实际上比支持你确认偏见的正面消息更有帮助。

比较选项,找到那些壕沟

在过去的 10 年中,数据科学和以数据为中心的职业越来越受欢迎,随之而来的是迎合这一领域的新学术项目和训练营的数量增加。实际上,这也使得人们越来越难以根据各种项目提供的好处来区分它们。然而,在看了足够多的这些之后,就每一个提供的优点和缺点而言,有一些共同的主题:

作者创建的表格

这个列表并不详尽,我遇到的每一个都有很多其他的好处,但是这真的取决于你正在看的具体项目。例如,许多训练营似乎非常适合已经拥有行业经验和强大的工程师技术背景的专业候选人,或者拥有相关博士学位并希望补充技能以适应特定职业的专业候选人。然而,也有训练营,在那里你可以学到初级技能,它们可以适合任何人,不管你以前有什么经验。

也就是说,我所做的(也是我所建议的)是看一看所有的利弊,确定哪些好处对我来说是最有价值的,然后仔细比较两条路径,以了解哪些确实有突出的好处,而如果我选择另一条路径,则无法轻松实现或根本无法实现。我的意思是每一个的护城河是什么。护城河是由非常成功的投资者沃伦·巴菲特推广的一个术语,指的是一家公司(或本案例中的数据科学机构)相对于竞争对手的明显竞争优势。

举例来说,虽然训练营可以在项目和与行业专家一起工作方面提供更多实践经验,但我在参加硕士课程时,难道不能多花一点努力来培养这种能力吗?如果是这样的话,我真的不认为这是训练营独有的护城河。通过为我的顶点选择一个特定的项目,与一位教授合作研究应用程序,或者完成实习,我也可以获得实际的现实生活中的数据科学应用。

评估什么最适合你

一旦你很好的理解了不同的优点和缺点,根据你的首要任务来确定什么是最适合你的。对我来说,我最优先考虑的事情,没有特定的顺序,是:

a)获得真实和实用的行业经验

b)能够同时工作并维持财政支持

c)在数学和技术上挑战自我

对于 A-boot camps 是高度激励的,让我在最后得到一份工作,但没有一个是有保证的,再加上工作是在我的经历结束时得到的,我可能喜欢也可能不喜欢。另一方面,提前在研究生项目实习来试驾特定角色的想法非常有吸引力。对 B 来说——读研是一件很容易的事,因为我看到的大多数训练营每天都有紧张的日程安排,很少或根本没有时间工作或承担其他真正的责任。对 C 来说,它实际上只是提供更多理论和统计课程的学术项目,这是我在旅程中的薄弱领域。

最后几轮决定

一旦你决定了你想走什么样的渠道,剩下要做的就是找到你最感兴趣的学校并申请。成本、时间表、课程设置、声望和地点都是需要考虑的重要因素。请记住,在旅程结束时,没有一种方法可以让你成为数据科学家、机器学习工程师或“插入你想要的头衔”。希望这能帮助你更好地找到最适合你的方法。

参考

[1]勇敢,克里斯。(2019 年 7 月 7 日)。什么是经济护城河?收自 http:http://www . investopedia . com/articles/investing/022415/ten-worst-missons-beginner-investors-make . ASP

为什么我选择 AI 和数据科学的硕士而不是博士

原文:https://towardsdatascience.com/why-i-chose-masters-instead-of-ph-d-for-ai-data-science-b59f78b04661?source=collection_archive---------26-----------------------

选择硕士和博士学位的三大因素

瓦西里·科洛达在 Unsplash 上的照片

介绍

在我之前的帖子中,我描述了我获得计算机科学本科学位的经历。我也保证过我会让你们知道我接下来要做什么。所以… 【鼓声】……我将前往卡内基梅隆大学攻读计算数据科学硕士学位!

对我来说,读硕士的决定并不容易。事实上,我一直认为我要去读博士。在这篇文章中,我希望分享两个项目和之间的关键差异,以及最终导致我申请硕士项目的原因。

当我刚开始的时候,我有一个想法,我想成为人工智能和人工智能领域的顶尖人物。这意味着为自动驾驶创造最好的图像识别模型、最具互动性的聊天机器人或最高效的神经网络。换句话说,我希望能够深入学习某个特定领域,这样我就能够成为该领域的专家,并提出能够以最先进的方式执行的全新算法。我认为,博士学位是一条出路,因为它涉及研究。

嗯,我没有错,因为如果你想一想,研究是提出新的模型或算法的过程,这些模型或算法要么改进现有的工作,要么处理全球研究界尚未积极研究的有趣问题

然而,在本科期间经过近两年的探索,我意识到博士可能并不是我的理想道路。在这两个选项之间做出决定时,我考虑了 3 个主要因素。

工程师 vs 研究

虽然博士侧重于在特定领域进行深入研究,但大多数(专业)硕士项目强调让你具备实用技能,为你进入职场做准备。在对 AI & ML 上的众多项目进行研究后,我逐渐意识到我可能不会像喜欢构建产品那样喜欢研究。我从提高 1%的技术水平中获得的满足感,无法与看到一个有用的功能性产品出现时的完全兴奋相提并论。简而言之,我想比起研究,我更喜欢工程。

人与知识

在我看来,我相信建筑产品对人有更大的贡献,而进行研究则有助于相应领域的知识。虽然可以说研究也对人类和社会有贡献,但我认为产品和应用程序是为日常消费者提供帮助和便利的更直接的方式。看你更喜欢影响人还是知识,可以适当选择硕士或者博士。对我来说,我一直梦想建立一家科技创业公司,解决现实世界的问题,帮助那些需要帮助的人。对我来说,硕士似乎是一个更好的计划,因为我可以学到构建既快速又可扩展的产品所需的实用技能。

宽与窄

我想每个人都会同意,攻读博士学位需要定义一个特定的研究领域来做研究工作。另一方面,如果你完成硕士学位并开始在该行业工作,你会注意到你将能够从事各种不同的产品,从设计数据管道到构建推荐系统到评估垃圾邮件检测的不同分类方法。总的来说,你将能够在更多样化的领域工作,而不是一个特定的研究课题。因为我相信未来有很多 AI 趋势,像自然语言生成,对话式系统,多模态深度学习等。我发现很难准确找到我最感兴趣的一个。如果可以的话,我当然希望能够灵活地与所有这些人合作。因此,我认为硕士对我来说是一个更好的选择。

结论

在这篇简短的帖子中,我列出了三个主要因素,如果你决定在人工智能或数据科学领域攻读硕士或博士学位,你可以考虑这些因素。

  • 工程师 vs 研究:你更喜欢建筑产品还是做研究
  • 人 vs 知识:你更关心直接影响人还是贡献知识
  • 宽泛与狭隘:你是喜欢做不同事情的灵活性还是喜欢专注于一个主题

就这些了,希望你从这篇文章中有所收获。请随时关注我的最新文章,干杯!

作为一名数据科学家,我为什么选择 MacBook Air 而不是 MacBook Pro

原文:https://towardsdatascience.com/why-i-chose-the-macbook-air-over-the-macbook-pro-as-a-data-scientist-9207f309db0c?source=collection_archive---------0-----------------------

基准测试和其他考虑因素,帮助您在最新和最好的苹果笔记本电脑之间做出选择

Unsplash 上由 Iewek Gnos 拍摄的照片

目前是升级到新 Mac 的好时机,因为苹果正在推出他们改变游戏规则的苹果硅(M1)芯片。我最近想买一台新笔记本电脑,主要竞争对手是 2020 MacBook Air2021 MacBook Pro。

在本文中,您将从数据科学家的角度找到 MacBook Air 和 MacBook Pro 的详细比较,包括一些常见数据相关任务的基准测试。这篇文章的标题破坏了结尾(我选择了空气),但我会提供如何决定哪个选项适合你的建议。

我的背景

为了建立背景,这里有一些关于我的信息,以及我对个人笔记本电脑的期望。

  • 我喜欢在空闲时间从事与数据相关的项目(有时候我会写一些关于它们的东西!)。这通常意味着大量的数据处理、数据分析,有时还需要复杂的机器学习模型。
  • 我的项目通常涉及足够小以适合内存的数据集。我很少会在我的个人项目中使用真正庞大的数据集。
  • 我不经常使用深度学习模型。偶尔我会训练一个深度神经网络,但我通常使用更传统的建模技术。稍后我会解释为什么这会影响你的决定。
  • 除了业余爱好数据项目,我还做大量的照片编辑,偶尔做一些小的视频编辑。我不会用我的笔记本电脑玩任何严肃的游戏或者其他太费事的事情。
  • 我使用苹果生态系统已经很多年了,所以我没有认真考虑过任何其他选择。抱歉,所有的 Windows 或 Linux 爱好者。

注意:我也是一名专业的数据科学家,但我是在购买一台个人笔记本电脑,而不是为了工作。你是购买个人电脑还是专业电脑也会影响你的决定。

竞争者

苹果在过去一年左右发布了两款出色的笔记本电脑:采用 M1 芯片的 2020 MacBook Air 和采用 M1 Pro 或 M1 Max 芯片的 2021 MacBook Pro 。与前几代 MacBook 使用的英特尔芯片相比,苹果硅芯片已经表现出巨大的性能和效率改进。

这些机器有大量可能的配置选项,我不会一一列举(前往苹果网站亲自探索)。相反,我将它缩小到四个选项,我认为这四个选项将满足大多数人的需求,包括大多数数据科学家。以下是这四个选项及其相关的技术规格:

这四个选择之一很可能是你理想的笔记本电脑。图片作者。储存来自 Pixabay 的笔记本电脑图片。

注意:Air 和 Pro 之间还有其他的区别,我没有包括在上表中。其中一些可能会影响你的决定。我将在本文后面讨论这些差异。

MacBook Air 总结:苹果阵容中最便宜的笔记本电脑(虽然起价 999 美元,但还是挺贵的)。它也是最小最轻的 MacBook。但不要认为它很弱——由于 M1 芯片,它的性能优于前几代的高端 MacBooks。我列出的“升级”选项是内存、CPU 和 GPU 的最高配置。

MacBook Pro 总结:苹果最强大的笔记本电脑,但是哇它太贵了…它起价1999 美元。如果你愿意,你可以将规格(和价格)推得更高,尤其是如果你选择 M1 Max 芯片的话。它有 14 英寸和 16 英寸两种尺寸,可用的规格和价格都非常相似——你是喜欢便携性还是更大的屏幕,这取决于你。

缺什么?如果你熟悉苹果的产品系列,你会注意到我没有提到 M1 Max MacBook Pro。如果你主要使用笔记本电脑进行数据科学/工程任务,你可能不需要 M1 Max 芯片的所有功能。或者,如果你这样做了,你花在 M1 最大的额外的钱可能花在其他地方更好。我还忽略了 2020 年的 M1 MacBook Pro,因为我认为它对任何人来说都不是一个好的选择——它的规格与 MacBook Air 非常相似,但价格要高出几百美元。

基准测试

让我们带着每台笔记本电脑转一圈,看看这些规格如何转化为性能。我购买了所有四种配置,并对它们进行了一系列基准测试。(然后我把不想要的退了——感谢你的轻松退货流程,苹果!)

由于我计划将我的笔记本电脑用于数据科学项目,所以我在设计基准测试时考虑了数据科学任务。具体来说,我测试了三个常用于数据科学任务的 Python 库:

  • 熊猫:测试一些基本的数据操作。具体来说,将一些大型数据框架连接在一起,然后旋转一个大型数据框架。测量每个操作需要多长时间。 这主要是一项记忆密集型任务。
  • LightGBM: 使用 LightGBM 库在大型数据集上训练多类分类模型。测量模型训练时间。 这主要是一个 CPU 密集型的任务。
  • TensorFlow: 使用 TensorFlow 库拟合神经网络,该库允许在 MAC 上进行 GPU 加速。具体来说,在知名的 MNIST 数据集上训练一个卷积神经网络(CNN),在 horse2zebra 数据集上训练 CycleGAN 模型。测量每个时期的平均时间。 这主要是一个 GPU 密集型的任务。

你可以在 GitHub 上找到测试的全部细节,包括你自己运行测试的所有源代码和指令。

结果

下面的图表显示了我测试的五台笔记本电脑的性能。以下是轴标签的关键字:

  • 基础 MBA:M1 基础型号 MacBook Air(见上图)
  • 升级版 MBA:M1 升级版 MacBook Air(见图)
  • 底座 MBP:M1 Pro 底座型号 MacBook Pro(见图示)
  • 升级版 MBP:M1 Pro 升级版 MacBook Pro(见图)
  • 2019 年 MBP:16 英寸 MacBook Pro,配有 16 GB 内存和英特尔 i7 6 核 CPU 和 AMD 镭龙 Pro 5300m GPU——这是上一代英特尔的一款相当高性能的 MacBook(这是我的工作笔记本电脑)

让我们一个一个地检查每个测试的结果。

注释显示 RAM 的数量。图片作者。

Pandas 基准测试要求在内存中存储和操作大型数据帧。三台 16 GB 内存的 M1 机器(升级版 MBA、基本版 MBP 和升级版 MBP)的性能比 8 GB 内存的机器(基本版 MBA)高出约 50%。不要太在意确切的数字——由于 RAM 被机器上的其他任务使用,所以会有一些差异。你应该认为这三种中间型号的性能是一样的。

一个非常有希望的结果是,base M1 MacBook Air 在这次测试中的表现优于 2019 年的 16 英寸 MacBook Pro,即使旧机器的内存是旧机器的两倍。似乎 8 GB 内存的 M1 芯片将击败 16 GB 内存的英特尔芯片。太神奇了。

要点提示:加倍你的记忆使记忆密集型任务的速度(大约)比预期的快两倍。如果 Air 和 Pro 具有相同的内存容量,它们的性能将相同。M1 踢了英特尔的屁股。

注释显示 CPU 核心的数量。图片作者。

LightGBM 适合大型数据集上的梯度增强树分类模型。这是一项 CPU 密集型任务——在运行测试时,所有 CPU 内核都达到了极限。

让我们从 M1 Pro MacBook Pro 的测试结果开始。升级后的 MBP 内核数量增加了 25%,性能提升了 15%。有些收益递减,但是增加 CPU 内核对性能有非常好的线性影响。

现在让我们来看看 MacBook Air 的测试结果。虽然 Air 和 base Pro 都有 8 核 CPU,但它们并不相同-Air 有 4 个性能和 4 个效率核心,而 Pro 有 6 个性能和 2 个效率核心。这有多大的区别呢?嗯,基准测试表明,差异是可测量的,但并不巨大。base Pro 的性能比 Air 高出约 8%。换句话说,两款 Pro 机型的差距是 Air 和 base Pro 机型差距的两倍。

要点:增加 CPU 内核以可预测的方式提高性能。尽管有效率和性能核心分布,MacBook Air 的性能仍在 MacBook Pro 的 8%以内。再说一次,即使是最弱的 M1 芯片也比英特尔芯片强。

注释显示了 GPU 核心的数量。图片作者。

我将两个 TensorFlow 测试合并到同一个总结中,因为它们讲述了相同的故事。在这两个测试中,神经网络模型都是在数据集上训练的。TensorFlow 能够在 MAC 电脑(M1 和英特尔)上使用 GPU 加速,因此这主要是对 GPU 的测试。

同样,这些结果与我们从规格中得到的预期非常接近。升级后的 MBP GPU 比基本的 MBP 多 14%的内核,而基本型号慢 10%。基础 MBP 的内核是基础 MBA 的两倍,MBA 慢 75%(两次测试的平均结果)。虽然回报有所减少,但正如预期的那样,增加 GPU 核心的数量可以提高基准测试的性能。

这是我们看到的 M1 和英特尔机器之间的最大区别。所有的 M1 机器主宰了 2019 年的英特尔 MacBook Pro。(我预计随着时间的推移,这种差异会变得更加明显——tensor flow在 M1 的 GPU 上工作,但它可能还没有优化。我期待 TensorFlow 库的一些改进,这将在未来几年内逐步提高 M1 机器的性能。)

我没有在任何 M1 Max 机器上测试,但它们显然会实现更好的性能。你可以指定 M1 最大 32 GB 的 GPU 核心(如果你愿意花超过 3100 美元)。您可以从 TensorFlow 基准测试图表中推断出该芯片的性能。

这里值得注意的另一点是,MacBook Air 没有风扇。这通常没有关系,因为 M1 芯片的效率使温度得到控制,但在长期工作负载下(如训练深度神经网络),计算机会变热。很有可能你会在某个时候看到一些热节流,这将在某种程度上减慢速度。我的基准测试运行的时间不够长,没有注意到任何节流,所以我无法评论影响会有多大。MacBook Pro 有一个风扇,所以它受节流的影响较小。

关键要点:增加 GPU 核心以可预测的方式提高 TensorFlow 性能,因此这是 MacBook Pro 的一大胜利,与 MacBook Air 相比,它的 GPU 更大。与旧款 MAC 电脑相比,所有芯片的性能都非常好。

相关说明:并不是所有流行的库都集成了 M1 GPU。例如,PyTorch 目前不支持 Mac (M1 或英特尔)上的 GPU 集成,也不清楚他们未来是否会添加支持。如果你是 PyTorch 用户,这是你必须解决的问题,要么使用 TensorFlow,要么购买云计算资源,要么购买单独的 Linux 机器和 GPU 进行机器学习。

技术规格之外的其他考虑

在提出建议之前,我想确认一些可能会影响你选择笔记本电脑的其他因素,因为我们大多数人并不使用笔记本电脑只是来处理数据。

很明显,苹果为从事密集图形设计、3D 渲染、视频工作等的人设计了最新的 MacBook Pro。他们将从 M1 Pro 和 M1 Max 芯片的强大功能中获益最多。这些用户应该为升级型号付费,因为市场上没有更好的替代产品。如果你除了数据科学之外还做(很多)这类工作,你会想要一台 MacBook Pro。否则,很有可能你并不真的需要那些权力。

MacBook Pro 上的 Liquid Retina XDR 屏幕比 MacBook Air 上的 LED 屏幕大了一英寸,远远好于后者。对于从事照片和视频工作的人来说,这是一个巨大的卖点,但对于看电影等日常任务来说也很好。Pro 的网络摄像头分辨率也更高(1080p 对 720p),这对参加大量视频通话的用户来说可能很重要。

MacBook Pro 有一个 HDMI 端口、一个 SD 卡插槽和一个 MagSafe 充电端口,因此连接永远不是问题 MacBook Air 仅限于两个 Thunderbolt/USB-C 端口。Pro 可以连接多个外部显示器,而 Air 只能连接一个。可能不是交易破坏者,但这些功能有价值。

记住 MacBook Air 也有一些优点。它的电池续航时间更长,而且比 Pro 更轻(2.8 磅,而 14 英寸 Pro 为 3.5 磅)。而且这是个人喜好,不过我觉得 MacBook Air 的楔形设计比新款 MacBook Pro 好看多了。

MacBook Air 没有风扇既有利也有弊——一方面,你可能偶尔会遇到一些热量节流,但另一方面,你永远不会被嘈杂的笔记本电脑风扇所困扰。

当然还有价格!所有这些笔记本电脑都很贵,但 MacBook Pro 真的很贵。你必须决定是真的花那么多钱买一台笔记本电脑,还是把钱花在别的地方更好。

图片作者。

MacBook Air 已经有一年的历史了,所以你现在可以在 T2 找到从苹果翻新而来的产品,这是一笔更划算的交易。我买了我的翻新,我很高兴我这样做了。而且有时候不直接从苹果买也能找到交易(比如从亚马逊)。

推荐

终于到了推荐几款笔记本电脑的时候了!下面的建议考虑了基准测试的结果和我描述的其他考虑因素。

选择 MacBook Air (M1 芯片),如果…

您有轻度到中度的数据科学工作负载。如果你的大部分工作是数据操作和清理,基本的数据分析,和/或拟合非深度学习模型,你很可能就是这种类型的用户。我属于这一类(如果你想了解更多细节,请重读“我的背景”一节)。

MacBook Air 将为您提供充足的动力,并且可能比您升级的任何笔记本电脑都要快。7 核或 8 核 GPU 对于一些深度学习工作来说已经足够强大了——如果你正在做大量这种类型的工作,并且决定你真的需要你的模型训练得更快,你只需要考虑升级到 MacBook Pro。

轻度用户可以使用基本型号和 8 GB 内存,但对于大多数数据科学家来说,升级到 16 GB 内存可能是值得的。您最常执行的任务,如转换大型数据集,将会更快,您的工作效率也会更高。

如果你同意 256 GB 的硬盘,我会继续使用基本的 7 核 GPU 选项。如果你想要 512 GB 或更大的硬盘,那么我会建议升级到 8 核 GPU 选项,这只会多花 50 美元。

选择 MacBook Pro (M1 Pro 芯片),如果…

您有非常繁重的数据科学工作负载,并且/或者您有非数据科学需求,这些需求将受益于更强大的 GPU。如果你始终如一地利用 M1 Pro 芯片中强大的 GPU,你将获得足够的回报。在数据科学中,这可能意味着你要进行大量的深度学习。在数据科学之外,如果你做大量需要强大 GPU 的设计或视频工作,你可以证明这一购买是合理的。

10 核 CPU,16 核 GPU 的机型是否值得升级,就看你自己了。它比基本型号增加了 200 美元,并且在性能上有了微小但可测量的提高(参考基准测试)。你还可以对这台机器进行更多的升级,但是价格也会相应提高。

选择 MacBook Pro (M1 Max 芯片)如果…

您有需要强大 GPU 的非数据科学需求,例如设计或视频工作。我不认为 M1 Max 是大多数数据科学家的正确选择。

你可能会认为,如果你做了大量的深度学习,M1 Max 将是一个伟大的选择,你会是正确的…某种程度上。显然,M1 Max 是最适合 GPU 优化模型训练的 MacBook。但是这将花费你很多钱——24 核 GPU 选项的最低价格为 2899 美元,如果你进行任何其他升级,价格会更高。

对于繁重的深度学习工作负载,我建议你购买更便宜的 Mac 电脑(Air 或 M1 Pro),并在需要时使用节省下来的资金购买云计算资源。您的笔记本电脑仍然能够胜任较小规模的工作,当您确实需要额外的功能时,您可以支付资源费用,并且仍然可能在成本方面领先。记住,有些东西,比如 PyTorch,不能在任何 Mac 上很好地工作,即使是 M1 Max,所以你无论如何都要把工作卸载到其他地方。或者,考虑买一个 Linux 盒子和 Nvidia GPU,用于机器学习。

(如果你想了解更多关于深度学习硬件的信息,请查看来自 Nir Ben-Zvi 的这份令人敬畏的指南。他说的一件事是“深度学习笔记本电脑已经不存在了”——你最好使用云资源或建立一个桌面。)

如果出现以下情况,请选择较旧的 MacBook Pro(英特尔芯片)

您确实希望避免对现有环境、工作流或数据管道造成中断。如果您正在从英特尔 Mac 迁移,这种转变不会是一帆风顺的。由于新 MAC 的 ARM64 和旧 Intel 型号的 x86 架构之间的差异,你将不得不重新安装许多东西。例如,您需要安装新版本的 Python、Conda 和其他工具,并且需要将软件包重新安装到您的环境中。期望做一些故障排除。

也就是说,对于大多数人来说,这种改变是值得的。在过渡阶段之后,你将拥有一台更好、更快的机器。对于中断可能会中断生产代码的专业用例来说,兼容性问题可能更值得关注。您可以在短期内使用 Rosetta 来运行专为英特尔处理器/x86 架构设计的应用和程序。

选择其他东西(非苹果笔记本电脑),如果…

你想要更差的操作系统和用户体验。(开个玩笑!)

不要太在意个人对操作系统的偏好,在数据科学用例中,MAC 有一些缺点。比如 PyTorch 就没有对 MAC 的 GPU 支持。如果你做了大量的深度学习,特别是如果你使用 PyTorch,你可能会更好地服务于 Windows 或 Linux 机器与 Nvidia GPU。(或者反正弄个 Mac,花钱买云计算资源!)

结论

我希望这次讨论可以帮助您决定哪种笔记本电脑适合您,或者至少让您更好地了解您应该寻找什么样的笔记本电脑。综上所述,这是之前的同一张图,但添加了一些建议:

图片作者。储存来自 Pixabay 的笔记本电脑图片。

到目前为止,我对自己选择的 MacBook Air 非常满意。是的,MacBook Pro 在性能方面确实更好,但我宁愿多花 1000 美元(或更多!)别处。老实说,我多年来一直期待这款 MacBook Pro 的发布,但它最终并不是我的正确选择。这是一台很棒的电脑,但 Air 更能满足我的需求。我想很多人会得出和我一样的结论,但是你会对这个系列中的任何一台电脑感到满意。

【2022 年 4 月更新:苹果翻新的 MacBook Pro 现已上市。你可以在原价的基础上节省 200 美元,这可能会让它更有吸引力。如果你想要 MacBook Pro,我肯定会买翻新的。然而,我认为更便宜的 M1 MacBook Air 对大多数人来说仍然是更好的选择。

成为媒体会员访问成千上万作家的故事!

为什么我停止申请数据科学的工作

原文:https://towardsdatascience.com/why-i-stopped-applying-for-data-science-jobs-7b93b3b8153b?source=collection_archive---------3-----------------------

以及为什么你应该考虑效仿

本·怀特在 Unsplash 上的照片

九月已经来临,现在是 2020 年;新冠肺炎疫情仍然完全有效。雇主的自由休假期即将结束。从 10 月份开始,所有公司都必须为所有被解雇的员工支付全薪的 20%到 80%——如果他们想留住这些员工的话。

我是一名无薪工人。

我记得 HR 联系过我……”不幸的是,Kurtis,我们得出了一个结论,你作为机器学习工程师的角色将被解雇——“从那时起,我完全迷失了方向。

该死!

我在那里度过了过去的 18 个月,却没有任何表现。我可以指责,因为从来没有任何计划将数据驱动的决策引入公司的工作流程,但我很愿意为我的失误负责。此外,新冠肺炎严重打击了公司。他们没有豪华员工的空间。我是一名奢侈品员工。

够疯狂的是,我早就在考虑离开。我知道我在那里的日子屈指可数,但我只是没想到会这么快,或者以这种方式。

我想我可以多拿几张薪水支票,同时为我即将做出的决定做好准备。老实说,我觉得我的直线经理打卡了。在办公室的最后几天里,他情不自禁地注意到了我时尚感的转变。

"哇,KP…好漂亮的鞋子。那就不再买高级运动鞋了?他会脸上带着假笑说。

不管怎样,这是最终决定。我不可能匆忙回到一份新工作中。就好像我刚从一段有害的关系中走出来——我还没准备好再次做出承诺。

深度学习和自然语言处理在我 2020 年的“学习”清单上排在前列。也许这是上天给我们的一个信号,让我们认真对待,不要再拖拖拉拉了——我的 LinkedIn 收件箱正被自由职业者的机会所困扰,这可能证实了这一点。

我跟着直觉走。

自从我上次做全职工作以来,已经过去了几个月。我添加了一些很酷的新项目来美化我的 Github 组合,利用我在 Coursera 上参加深度学习专业化和自然语言处理专业化所学到的新技能。

我记得我告诉我的朋友“在我的一生中,我从来没有像现在这样觉得自己已经做好了工作的准备”。终于是回到全职工作的时候了。

那不会持续很久…

我只花了 15 份申请就开始了我的下一次冒险,然后我突然意识到…

"也许申请工作不一定是成为数据科学家的最佳方式"

我知道这听起来适得其反。听我说完。

为了得到一份工作,得到关注

毫无疑问,数据科学工作的需求很大——看看一个工作角色上传到 LinkedIn 上时收到的申请数量。我曾经和一位招聘人员交谈过,他们告诉我他们每天收到 150-250 份工作申请

这让我大致了解了我所面临的情况,但同时,这也让我想知道我如何才能在所有这些申请人中脱颖而出。

有些人选择不同的配色方案,而不是传统的黑白简历。有些人会向他们认为可能对招聘过程有影响的人发送一堆冷冰冰的电子邮件和电子邮件(LinkedIn)——有趣的是,我也遇到过这样的情况。要是他们知道就好了。

一般来说,人们有很多方法试图让他们的应用程序脱颖而出。

在我看来,我相信获得一份数据科学的工作就是让你在招聘人员面前脱颖而出。

你是否是这份工作的合适人选取决于看你申请的人的理解——少谈影响他们当天决策的各种其他因素。

当我说一份简历永远不能真实地反映一个人能带来什么时,我不相信我是唯一的一个。然而,我意识到让公司去见每一个递交申请的人会适得其反。

那你怎么让自己脱颖而出呢?

如果我回想我做过的每一份自由职业,我会发现一个非常有趣的模式正在形成…

我从来没有申请过任何一个!

我只是做我的生意,在 LinkedIn 上与人交流,分享我出于个人兴趣而不是希望找到工作而创作的内容和项目。在我知道之前,人们来敲我的门要求我的服务。

一开始,我并没有刻意采用这种策略,因此它导致了许多随机的工作机会。当我意识到人们只是根据他们对我的看法来接近我,而我根据我分享的内容来决定人们在网上对我的看法时,我创造了一种策略,这种策略更专注于我实际想要解决的问题类型。

这个故事的寓意是,分享你正在做的令人兴奋的事情,人们就会来找你。此外,对你分享的内容尽可能深思熟虑总是好的。

:下面这篇文章深入探讨了这种方法。它最初是出于自由职业的考虑而创建的,但通过实施这一策略,我也收到了相当一部分永久性的邀请(我没有接受,因为这不是我想要的)。

https://medium.datadriveninvestor.com/5-ways-to-attract-freelance-data-science-clients-to-you-b79fdb76eab

自由职业的兴起

自由职业已经存在很长时间了,但是今天,它在工作中变得越来越普遍。人们决定做自由职业者的原因有很多,从创造自己的工作时间的灵活性,赚取额外现金的能力,在某些情况下比全职工作赚得多得多,以及决定你希望从事的项目类型的能力。

雇主们也见证了雇佣自由职业者而不是全职员工的诸多好处。因此,市场上这类机会稳步上升。

最初,自由职业只是我在没有全职工作的那几个月里为了经济上过得去而做的事情。我从未申请过自由职业,也不知道如何申请,因此我不禁对自己的未来感到不安。

“如果他们终止合同怎么办?”

“如果我做不了这份工作怎么办?”

“我得到差评怎么办?”

“那我的员工福利呢?”

一开始,我没有当员工时一半的安全感——当然,现在我知道这只是一种幻觉——但随着时间的推移,我在 LinkedIn 的收件箱里继续收到越来越多的自由职业邀请。

一个在 LinkedIn 上联系我的人的例子——Idententy 因为保密而被模糊化了;作者图片

我知道我非常幸运有人带着工作来找我,我永远感激我在这个位置上。然而,不言而喻,我已经做了大量的工作,把自己放在这个位置上,即使是现在,我也一直在想办法提高自己,以吸引更好的机会。

有了这样的选择,我究竟为什么要决定通过申请工作来给自己施加压力呢?

哦,我忘了补充…我现在做自由职业者比做全职工作时挣得多… 我少工作了 20 个小时。

逆向法则

这个原因给这个混合体注入了一点哲理…

反向定律,或称反向努力定律,是由哲学家艾伦·瓦茨提出的。它传达了一个想法,你越是追求感觉更好,你就越不满足,因为追求一些东西只会强化你首先缺乏它的事实。例如,如果你极度渴望变得富有,那么不管你目前挣多少钱,你都可能会感到更加贫穷和不值得。

“当你试图停留在水面上时,你会下沉;但是当你试图下沉时,你会浮起来”——艾伦·沃茨

话虽如此,但毫无疑问,我想成为一名数据科学家。想到与真正聪明的人一起从事令人兴奋的数据科学项目,他们分享了我让世界变得更美好、更安全的热情,这足以让我去健身房锻炼。

落后定律强调,由于过于关注结果,我们最终会把结果放在一个基座上;从本质上说,专注于你渴望的东西只会强化你的潜意识,让你知道你目前正缺少那个东西。

相反,我们应该更加关注实现目标所需的行动。这在我们的脑海中建立了一个潜意识的自我形象,与实现目标的人相对应,因此,我们会像我们想成为的人一样思考和行动——这意味着它在现实世界中出现只是时间问题。

把它放在上下文中…

通过将我的注意力集中在数据科学家执行的动作上,并持续执行相应的动作,我将为我的潜意识提供足够的证据,以形成我已经成为我希望成为的数据科学家的信念——与希望让世界变得更好、更安全的真正聪明的人一起从事令人兴奋的项目——这将影响我的行动以及思维模式,从而采取相应的行动,直到它在现实世界中真正实现。

最终想法

我知道我的情况与其他可能阅读这篇文章的人不同。我并不是说每个人在构建自己的职业生涯时都应该遵循我的策略。一天结束时,这一切都归结为什么策略最适合你,什么让你感觉最平静。

对一些人来说,向大量的职位空缺提交大量的申请可能是一件令人愉快的事情——尽管我还没有遇到真正喜欢这个过程的人。对我来说,这种方法不太受欢迎。如果你喜欢以你一直在做的方式成功,那么你也可以继续,但如果不是,那么也许是时候改变了。

感谢您的阅读!

在 LinkedIn 和 T2 Twitter 上与我保持联系,了解我关于数据科学、人工智能和自由职业的最新消息。

相关文章

https://medium.datadriveninvestor.com/how-freelance-data-science-has-changed-my-life-4c387aa6164d </5-tips-for-beginner-freelance-data-scientists-e2b421f239d> 💔-traits-all-great-data-scientist-have-c43ab2de6e64>

我为什么写数据科学

原文:https://towardsdatascience.com/why-i-write-about-data-science-75667a5ef0ae?source=collection_archive---------39-----------------------

撰写数据科学文章的 6 大好处

今天是我在 Medium 上发表第一篇数据科学文章的一周年。它做得出乎意料的好,最初的成功给了我很大的动力。从那以后,我又发表了 11 篇文章。不幸的是,很明显,当其他人做得不好的时候,我成了新手运气的牺牲品。即便如此,我还是坚持不懈地撰写和发布文章。这是因为我不仅受到观点的激励,也受到写作的许多其他好处的激励。

来源: flaticon

学习和提高技术技能

第一个好处是,它帮助我了解了更多关于数据科学的知识。当你离开大学时,你失去了所有的结构,你必须把你的教育掌握在自己手中。写文章是我做这件事的方式。无论我想学习一些新的理论还是如何应用 python 框架,我都把一篇文章作为一种目标。在学习新概念时,它给了我一些急需的指导。

我是说真正的学习!阅读和应用概念是一回事;解释它们是另一回事。当你试图把你的想法写下来时,你会意识到你理解中的所有漏洞。我经常发现,在我能把一个概念用语言表达出来之前,我不得不回过头去试着正确地理解它。最终,文章提供了学习的方向和对我理解的检验。

提高沟通技巧

当你进入职场,你首先会意识到的一件事就是沟通技巧非常重要。他们在 STEM 学位中经常被忽视。你可以学习编码,但不知道如何解释代码是如何工作的。在现实中,你必须一直这样做。更糟糕的是,你试图向其解释的人通常没有技术背景。显示编码或给出数学函数不会削减它。

同样,当我写作的时候,我想接触尽可能多的读者。这些人不一定是机器学习方面的专家,但他们仍在学习。无论是使用可视化还是书面解释,我必须找到直观的方式来解释事情。这是在我的日常工作中解释技术概念的很好的练习。老实说,我认为这些改进的沟通技巧比我获得的任何技术技能都更有价值。

沟通和技术技能的交集是编写干净、可读的代码。编写有效的代码是一回事,但编写人类能够理解的代码是另一回事。我的几篇文章是编码教程。我花了很多精力让代码变得容易理解,每一次教程,我都觉得自己在进步。这再次帮助了我的日常工作。当你在团队中工作时,能自我解释的代码会节省你很多努力。

建立工作关系网

我不只是在 medium 上发文章。我也在推特和 Instagram 上分享它们。我已经慢慢发展了一批追随者,并与同样对数据科学感兴趣的人建立了联系。这已经带来了一些机会。就我的写作而言,他们给了我一些有价值的反馈,我经常能得到新文章的好主意。比如下面 Instagram 上的问题,很多人用“情绪分析”回复。于是,我以为题写了一篇教程。

来源:作者

建立你的声誉

写作可以帮助你脱颖而出。通过写关于一个主题的文章,你正在确立自己作为专家的地位。文章是你知道某件事并能解释它的证据。这些技术和沟通技能在你的简历上看起来不错。这一点,加上上面提到的更大的关系网,可以帮助你打开许多机会。

你可以赚钱

更多的机会可以带来更高收入的工作,但也有直接的经济利益。特别是,在媒体上,你可以通过写作赚钱。在你兴奋之前,它不是很多。我想如果我必须计算每小时写作的收入,我的收入会远远低于最低工资。这仍然是一笔不错的奖金,而且是被动收入。一旦你写了一篇文章,它就可以永远继续赚钱。希望随着我的观众人数的增长,这个数字会变得更大。

创意出路

到目前为止,提到的好处可能并不那么令人惊讶。我没想到的一点是,我真的很喜欢写作本身。开始的时候,很难,我的话感觉很笨拙。通过练习,我发现我的想法更容易地在指尖流动。我觉得我还有很长的路要走,但我已经发现表达自己更容易了。将来,我想写一些我的其他兴趣。甚至可能是一点虚构。

回想起来,我很高兴我开始写作。我从中学到了很多东西,我觉得它让我成为了一名更全面的数据科学家。重读我的第一篇文章,我觉得去年我进步了很多。希望一年后我会有同样的感觉。如果你对那篇文章感兴趣,你可以在下面阅读它。

图像来源

所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。

为什么我要花一年时间来讲故事

原文:https://towardsdatascience.com/why-im-devoting-a-year-of-my-life-to-storytelling-ed5cd2349cff?source=collection_archive---------61-----------------------

当我让人们知道我一周有一半的工作时间都沉浸在数据科学课程中时,我不确定他们首先想到的是讲故事。但这是我应得的。

Gif via Giphy

让我们倒回去一点。当我 19 岁搬到华盛顿特区,开始在一个被《纽约时报》称为“数字精英大学之外的另一种选择”的项目中当学徒时,我的技术技能非常有限。我不知道命令行是什么,除了最基本的 HTML 之外,我看不懂任何代码。

当我看到我的第一个命令行时的确切感觉

Gif 通过 Giphy ,音频通过作者

然而,我得到的是一份运用战略帮助营销活动发展的简短背景,以及成为一家公司不可或缺的一部分的强烈渴望。

我的学徒生涯让我进入了一家名为 Brazen 的初创公司。可能值得一提的是,在那里驻扎了一年后,该公司增长了 5 倍以上,筹集了另一轮资金,更改了名称,并在 DC 的初创企业中获得了一个又一个认可。在这个角色中,我获得了一个家庭。就像任何一个家庭一样,尤其是在我最易受影响的几年里,一个植根于快速发展的科技初创企业的家庭,他们留下了相当深的印记。

这个印记的一个方面是一项新技能,它完全改变了我的思维方式和我未来的轨迹——编程语言 MySQL。现在,MySQL(发音为 My-Ess-Que-Ell)允许人们查询数据库,本质上是询问和回答不同复杂程度的问题。

我不确定我们的 CTO Jason 是否知道他通过 Brazen 的软件即服务(SaaS)在在线课程和现实应用之间架起了一座桥梁,但我对公司的价值提升了。我成了我的非技术同事的资源,给我们的开发人员更多的工作时间,这对我们公司的健康发展是不可或缺的。我很快就扮演了一个真正独一无二的角色,为各部门的同事提供支持,帮助我们的客户定义成功是什么样的,并通过发现我们平台用户的新信息来支持我们的资金筹集。当我利用数据的力量时,这种感觉一直伴随着我。这改变了我对世界的看法,也改变了我如何处理出现的问题。

一个同事画的实际白板,宣称我是候选人报告中的女王

快进到今天。我过去两年的工作让我接触到了我们国家一些最伟大的故事讲述者——他们中的许多人都专注于为我们世界上一些最昏暗的地方带来光明。

其中一位特立独行的人,艾娃·杜瓦内和她的公司 Array ,与参与者媒体合作,通过学习伙伴带你越过屡获殊荣的网飞系列,深入探讨围绕刑事定罪和不平等问题的核心,从而更深入地了解像这样的故事。

片段来自当他们看到我们学习同伴,感谢 Array

另一个有影响力的故事讲述者斯科特·布尼克和他的公司 One Community ,之前推出了电影 Just Mercy 并曝光了被错误监禁的已故沃尔特·“约翰尼·d·”麦克米兰。尽管有几十个人可以证明他的不在场证明,包括一名警察,陪审团还是建议判他无期徒刑。沃尔特的故事以及后来由于布莱恩·斯蒂文森的努力而上映,主要是通过演员迈克尔·B·乔丹、杰米·福克斯和布丽·拉尔森来传达的。Just Mercy 在全球筹集了超过 5000 万美元,并为史蒂文森的平等正义倡议赢得了新的支持。

一个社区说它的使命是“利用讲故事的力量来激励和鼓励世界发生积极的变化”。现在,跟我做一个快速练习,用 数据 代替讲故事。这些格式真的可以以创新的方式携手并进,开始弯曲数据结束的地方和故事开始的地方。跟着我。

我们的世界正变得越来越多样化,我们要求故事更好地反映我们的现实。正如传媒公司 MACRO 的第一卷《新世界》https://uprising.staymacro.com/thenewworld所言,“与现状不合,与文化同在。与过去的方式不同,与未来的方式相同。”

同样,我相信我们会看到创新的使用案例,真实世界的数据为引人注目的叙事和独特的真相讲述和传播结构提供信息。随着技术继续呈指数级发展,我们的技术人员越来越多样化,谁说数据科学家不应该在 Array 或 One Community 这样的组织中拥有一席之地。我们将有机会根据数据来讲述故事,并对叙事方向提出建议。能够决定一个角色如何穿越,这是基于一个意图,即揭露以前在阴影中的、被认为没有市场的故事。产生共鸣的能力给了我们一个案例和财务手段来收集越来越清晰的数据,并创造出为我们服务的算法。我们将扮演一个不可或缺的角色,使系统向我们展示社会需求的真实所在,并引导我们不仅想象一个不同的未来,还可能证明我们将如何到达那里。

我看到了数据和真相之间的正相关关系,即如何增加揭露我们权力体系现实的叙事,可以直接带来意识和积极的变化,从而更好地满足我们的需求,成为一个值得我们拥有的体系。我相信数据科学和讲故事之间的距离还没有完全确定,我们还有很多工作要做。我还看到人们将这些点连接起来,并在今天建设基础设施。想象一下,我们世界上最伟大的故事讲述者在一位授权和多才多艺的数据科学家面前可以做些什么。

所以,是的,我会花一年时间(至少)讲故事,因为我们作为数据科学家有能力进一步揭露目前影响我们世界的格局和权力体系。还有许许多多的故事有待发掘和探索。

“摆脱现状,融入文化。与过去的方式不同,与未来的方式相同。”

想加入我吗?点击此处获取电子邮件更新或直接发消息给我。

为什么我在 Jupyter 笔记本上使用 VSCode

原文:https://towardsdatascience.com/why-im-using-vscode-for-jupyter-notebooks-abd2a6a157b9?source=collection_archive---------4-----------------------

VSCode 是一个很棒的 Python 编辑器,而且正如我意外发现的那样,对于 Jupyter 笔记本也很有用

朱庇特笔记本——作者图片

我第一次使用 VSCode 打开 Jupyter 笔记本完全是一个意外。

我使用 VSCode 编写独立的 Python 脚本和 Flask 应用程序,但我一直使用标准的浏览器界面来运行 Jupyter 笔记本。坦白地说,我从来没有想过要做别的事情。

但是有一天,我在浏览我的文件管理器,寻找一个特别的笔记本,不知何故,我在组成我的 D: drive 的项目文件夹的迷宫中丢失了它。我最终找到了它,出于某种原因——我想是默认行为——我双击了它。现在,正如我所说的,VSCode 是我的默认 Python 编辑器,所以双击 Python 文件会在编辑器中显示该文件。我是不是也把它设为了 ipynb 文件的默认设置?我不记得了,但我想我一定有,因为 VSCode 立即行动起来,打开了笔记本。

哦不!那不是我想要做的。

我打算打开一个命令行窗口,导航到我的笔记本文件夹,输入jupyter notebook,等待 Jupyter 服务器启动,浏览器运行,打开我想要的笔记本,最后开始编辑它。

我基本上通过简单的双击做了完全相同的事情。也许我发现了什么。至少,使用 VSCode 打开笔记本的简单性让我觉得它应该值得一看。

事实证明确实如此。

实际上,在 VSCode 中编写和运行笔记本与在浏览器中做同样的事情没有什么不同。您仍然需要安装 Python 和 Jupyter,可用的功能基本相同。但是对 VSCode 的熟悉,打开笔记本的方便,以及我经常打开它的事实意味着它已经迅速成为我默认的 Jupyter 编辑器。

还有智能感知和变量窗口——稍后会详细介绍。

VSCode 接口

您可以在文章顶部的主图像中看到 VSCode 窗口。这是常见的 VSCode 界面,但在编辑器窗口上方是 Jupyter 笔记本功能的菜单栏,除了打开新文件或保存当前文件等文件功能外,您不需要太多其他功能。

这是一个典型的代码单元格和主 Jupyter 菜单选项的特写。

像往常一样,通过选择一个单元格并键入 ctrl-Enter 来运行它(在单元格的左侧应该还有一个运行符号,您可以单击它)。

降价单元也是相似的。

按 ctrl-Enter 键,您将得到这个:

请注意,在最后一个图像中,工具栏已经移动到右侧。这没有什么神奇的;我通过选择选项并从下拉菜单中选择一个选项来切换它的位置,如下图所示。

单元格工具栏选项—按作者排序的图像

这也允许你插入新的单元格,合并它们,分割它们…你可以在截图中看到这些选项。

智能感知

我很喜欢这个。有时我会忘记如何使用一些不常使用的函数:那个函数叫什么名字,我使用什么参数?智能感知来拯救我们。

正如你在下面看到的,如果你开始输入一个对象的名称(这里是一个熊猫数据框),当你点击.时,智能感知会提示你有哪些可用的选项以及如何使用它们。

变量

变量窗口是另一个好处。Variables是 Jupyter 主工具栏中的一个选项,可打开如下窗口:

我们可以看到,它给出了到目前为止已经定义的每个变量的名称、类型、大小和值。

出口

导出功能与标准 Jupyter 界面中的相同(导出到 Python、HTML 或 PDF ),但您也可以直接从图像右侧的图标保存图像,这在您创建文档时会很有用。

结论

老实说,我并不总是使用 VSCode,我也喜欢基于浏览器的 Jupyter 编辑器(它似乎在我的小平板电脑上的触摸屏上工作得更好一些——但这可能只是这种特定硬件的一个缺点)。

但是我从中得到的是,VSCode 很方便,可以做你想用 Jupyter 笔记本做的任何事情。为什么不试一试呢!

一如既往,感谢阅读。如果你想知道我什么时候发表新文章,请考虑在这里注册一个电子邮件提醒

如果你不是一个媒体订阅者,那就注册吧,这样你就可以每月花 5 美元阅读尽可能多的文章。在这里注册,我将赚取一小笔佣金。

此外,如果你碰巧对熊猫的数据可视化感兴趣,可以看看我的可下载书籍这里

为什么 Bandcamp 盈利而 Spotify 不盈利?

原文:https://towardsdatascience.com/why-is-bandcamp-profitable-and-spotify-isnt-3444ad63e7fb?source=collection_archive---------5-----------------------

实践教程

作者图片

这篇报道最初发表于 组件

2022 年 3 月 9 日:我的 对史诗般收购 Bandcamp 的反应

8/16/2022: A 小分析看收入分配 关于 Bandcamp。

总结

这份报告认为,Bandcamp 的基本商业模式是增强人们购买物品的各种冲动,并允许这些冲动自由地相互作用、调节和混合,这种模式已经将该公司变成了硅谷最荒诞的公司之一:一家依靠过时技术运营的盈利创业公司。它认为,这与 Spotify 形成了鲜明对比,Spotify 经常亏损,因为该公司最终的长期目标是垄断和完全移除人类音乐家。最后,它认为 Bandcamp 的营销和软件开发努力,尽管意图良好或至少是中立的,但仍有巨大的增长潜力尚未开发。

简介

在 2008 年推出时,Bandcamp 的创始人设想该网站是一个“音乐人的发布平台”,它将为唱片艺术家做 WordPress 和 Blogspot 为作家所做的事情:为他们提供保持可靠、完全可定制的网络存在的方法。但在让音乐人能够将歌曲和专辑上传到他们的页面时,Bandcamp 的工程师很快意识到,他们无意中发现了一种草根在线市场的架构,这种架构代表了当时占主导地位的 iTunes 商店的一种有吸引力的替代方案。Bandcamp 没有效仿苹果,设定一个标准化的价格结构,而是参考了电台司令在一年前树立的榜样,当时的选择是允许粉丝支付任何他们想下载的 In Rainbows 的费用,这使得这张专辑在全球引起轰动。“也许你的专辑有 200 首歌,而你花了 10 年的时间,”Bandcamp 的创始人之一伊桑·戴蒙德(Ethan Diamond)在最近的一次采访中说。“但你应该能够自己定价,因为你比我们更了解你的观众,如果有人愿意出比你设定的最低价格更高的价格,那就太好了。”

Bandcamp 通过主页上的直播发布每件商品的销售情况。我们通过每分钟一次驱动这个销售提要的端点来检索数据,因为更频繁地点击端点不会产生更多的结果。然后,我们将这些数据与单独检索的单个相册中的数据结合起来。总的来说,大约有 670 万张销售记录在案,成功检索了 120 多万张专辑。

分析

作者图片

以下是 2020 年 9 月初至 12 月底平台活动的简要概述。随着我们的继续,我们将对其中的许多数字进行更详细的分解,我们将在整个图表中使用大量的语言和符号,其中一些可能不会立即清楚,所以让我们分解两个可能不言自明的术语:

支付价格与挂牌价格的“平均比率”是苹果与苹果之间的货币比较。例如,如果一件物品的价格为 1000 挪威克朗,而买方支付 3000 挪威克朗,则比率为 3。在整个 Bandcamp,人们为他们的商品支付的价格平均是卖家标价的 1.24 倍。(Bandcamp 的销售反馈数据既包括以卖家本国货币支付的金额,也包括以美元支付的金额——据我们所知,后者遵循 PayPal 的转换率。如果一件商品来自挪威,买家花费的金额会同时以克朗和美元列出。)

“$0 商品”是指没有底价的商品,并且是纯按需付费的商品(PWYW)。请记住,即使在购买“0 美元商品”时,买家通常仍然需要支付一些东西来支付加工费,据我们所知,为这些商品支付的价格总是大于 0 美元。

作者图片

周五通常是网站最大的日子,也是艺术家更有可能发行专辑的时候,尽管可能性有多大超出了这项研究的范围。

超过 300,000 的数字是周五狂欢日(我们称之为 BCF),在这一天,公司放弃通常从每笔交易中抽取的 15%的提成。自从 BCF 推出以来,艺术家们开始相应地调整发行,BCF 现在不仅是人们购买最多的一天,也是发行最多音乐的一天。

11 月 13 日的非 BCF 销售超过 100,000 辆怎么办?那一天,菲比·布里杰斯发行了咕咕娃娃的《蝴蝶花》的封面,她卖出了 43942 张,总价 178735 美元。该曲目在有限的时间内可用,并且项目页面不再在 Bandcamp 上。碰巧的是,Bridgers 出售这首歌非常重要,我们将在最后回到这个话题。

作者图片

这是销售如何按商品类型细分的。简而言之,“捆绑”指的是数字唱片,其中艺术家以折扣价出售他们的全部或许多专辑。这里的比率只包括标价大于 0 美元的项目。

Bandcamp 现在是世界上最大的实体音乐销售商之一,包括黑胶唱片、CD、盒式磁带。实物商品占所有销售额的 22.9%,但占支出的 49.1%。这一巨大份额主要来自实体专辑,仅实体专辑就占总支出的 36.7%。

成本可能会在某种程度上调节慷慨程度,因为人们为低价歌曲支付的费用要高于数字专辑。尽管艺术家们对他们的专辑收取的费用比商品和实体专辑更高,但人们仍然选择为他们支付比实体专辑更高的价格。此外,人们在购买通常更贵的商品时,并不比购买实体专辑更慷慨。移除异常值会改变每个产品类别的平均比率,但不会改变整体关系。

作者图片

确定一个买家是否表现慷慨——也就是说,他们是否支付了比他们应该支付的更多的钱——是一项模糊的任务。对他们是否支付了高于最低标准的费用的基本比较会遇到几个问题。如果有人把一个 3.99 美元的东西四舍五入到 4 美元,他们慷慨吗?如果有人为纯 PWYW 产品支付任何高于 0 美元的费用呢?既然买家必须支付一些东西来支付加工费(通常计算出来大约是 0.40 美元),你如何确定他们什么时候只是支付最低限度的费用?

出于本研究的目的,包括本图表和所有其他我们探讨该术语的图表,“慷慨”是指至少支付 2 美分/便士等。高于商品价格。理想情况下,这可以控制那些只取整便士(或者卖方所在国家的任何便士)的人,并表明某种慷慨的意图。此外,我们只研究有价格下限的商品,因为设立门槛将是一项注定失败的事业,因为不可能设定一个对所有货币都有意义的单一标准。

这里的比率仅适用于至少支付了 2 美分/便士等慷慨门槛的人。高于最小值。这意味着,与第一个图表中的常规付款比率不同,平均值和中值不包括销售价格和商品价格相同的销售额。我们在其他图表中使用了这两个指标,并且会指出何时使用它们。

作者图片

2020 年 3 月,该公司在周五推出了第一个乐队营,这是一项通过放弃通常在销售额中抽取的 15%来支持艺术家的举措。这项活动非常受欢迎,以至于该公司一直在此后每个月的第一个星期五举办这项活动。

当你对比观察 BCF 日和正常日的买家行为时,会发现一些有趣的现象。比平时多了不到 3%的人在 BCF 上支付或超过了慷慨阈值,这可能很重要,但也可能不重要。但是,尽管对于有价格下限的商品,慷慨程度是一样的,人们在 BCF 上花在零价格商品上的钱比他们在其他所有日子里花的都多。

这可能是因为行为经济学家所谓的框架,即买家根据他们得到的信号行事。在 BCF 上,购买的背景是一个特殊的日子,意在支持艺术家——这种行为通常被认为是利他的。对于价格为 0 美元的商品,这种信号可能比有价格的商品更明显,因为有价格的商品本身就是竞争信号。

作者图片

从地理上看,Bandcamp 主要是一个美国平台。它的大部分销售额来自美国,超过 75%的销售额来自排名前五的国家,其中只有一个国家——德国——不是英语国家。

与此同时,Bandcamp 的架构已被证明足够灵活,足以让该平台获得惊人的影响力:用户几乎从地球上的任何地方被吸引到该网站,代表了不同地区、语言和全球收入阶层。

Bandcamp 上的活动与乡村人口相关的确切程度没有被探究。乍一看,这两个变量之间没有明显的关系可以完全解释这份名单的构成,这意味着差异来自其他地方——人均收入、使用其他方式收听和购买音乐、文化偏好等等。

作者图片

这是排名前 50 位国家的慷慨度计算结果。这里的平均值和中位数是衡量慷慨度的比率——也就是说,对于那些花了2 美分/便士/T2 的人来说。高于物品价格,他们这样做的幅度。⁴

在确定慷慨购买者的比例时,没有任何因素被控制,包括货币、人均收入等。如果这些控制措施被包括在内,这些国家可能会转变,也可能不会。然而,极不可能的是,这一指标捕捉到的差异完全变平,结果至少表明,地理是决定人们为什么为自己所做的事情付费的一个变量。

作者图片

每个国家旁边是一个衡量该国买家支付给本国艺术家的价格,与他们支付给其他国家艺术家的价格相比。为了说明这一点,让我们假设你有一个尼日利亚艺术家和一个尼日利亚买家。艺术家在₦800 为他们的作品定价,买家向₦1600.付款比例是 2。现在让我们说,同一个买家从一位法国艺术家那里购买了一张定价为€1 英镑的专辑,他们向€支付了 1.5 英镑。比例为 1.5。如果那个买家是尼日利亚唯一的买家,并且他们只购买了这些东西,那么尼日利亚在这个图表中的比率就是 2 / 1.5 = 1.33。大于 1 的比率表明该国用户在国内购买的支出多于国际购买,而小于 1 的比率则意味着相反。

一般来说,买家对本国艺术家更加慷慨。这并非特定于某些国家或地区,似乎与相对货币实力无关。对被研究的前 50 个国家中的每一个国家来说都是如此,对前 50 名以外的国家来说也可能是如此。

充分阐明这个图表的意义需要几卷;在这个项目的早期构想中,它是报告的主要焦点。但是我们还没完成一半,所以我们会尽量简短:人们被迫花钱买他们认同的东西。⁵

对这张图表最合理的解释是,它捕捉到了共同自我认同的多个时刻:认识每个 other,⁶人的人对当地地理环境感到有亲和力,共同的文化更有可能在一个国家出现,甚至艺术家的经历导致音乐更有可能与听众产生共鸣的可能性。

重要的是,身份的许多突触和以不同方式燃烧的感觉,以及共同的国籍撒下了一张足够宽的网,足以同时捕捉其中的许多人——尽管 Bandcamp 是一个促进音乐全球化的平台。

作者图片

在这张图表中,我们只分析了价格在 1 美元到$10,⁷之间的专辑(而不是歌曲),以及出现在至少 500 次销售中的流派标签。我们探索了分析 Bandcamp 流派标签的挑战之前,因为艺术家可以自由添加他们喜欢的任何标签。更深入地挖掘每一种类型实际上指的是什么,既肯定了上图中出现的联系和身份的假设,又使之复杂化了。

比如,“、Brony 、【BLM】、【LGBT】/【LGBTQ】都是比较明确的以身份为中心的标签实例。“慈善”和“募捐”本身不是。事实证明,这些标签实际上反映了两种类型的联系。

风格标签“阿拉米达”是指海湾地区的城市。这个数据集中唯一带有“阿拉米达”标签的专辑是 【斯卡曲风反对种族主义】 ,这是一张收入归反种族主义组织所有的专辑。同样,“一个羽绒的系统”指的是该乐队发行的两首曲目 EP,为亚美尼亚-阿塞拜疆冲突的受害者筹集资金。⁸“硬摇滚”标签不成比例地与同一个 EP 相关联,同现类似于“Brony”和“Pony”。甚至“LGBT”/“LGBTQ”也不是严格意义上的身份认同,因为其销量最高、比例最高的专辑之一与慈善事业有关。⁹“棒球”/“棒球”这两种与西雅图乐队 The Garages 有关的流派的高比例,主要是在一张专辑中捕捉到的,这张专辑的收入捐给了一个儿童慈善机构。

讨论

这给我们留下了什么?什么重要,什么不重要?

关键是这一切都很重要。项目类型很重要,交易双方当事人的所在地也很重要。出售的慈善性质很重要,出售者的身份也很重要。重要的是买方和卖方是否见过面,或者他们是否是陌生人。无论一件物品的价格是 0 美元还是 20 美元,无论是在艺术家收获全部还是大部分销售的日子,这些都很重要。数据中的一切都很重要,数据之外的几乎一切也可能很重要,从项目在页面上的描述方式到专辑中的曲目数量,到它是否是限量版的专辑封面。

一旦你从 Bandcamp 的数据中找到了所有可以直接测量的东西,你就必须考虑所有你不能测量的东西。买家在购买时是坠入爱河还是正处于狂躁期?他们是在音乐氛围中长大的吗?他们生活在 100 万人以上的大都市吗?他们是长期尼古丁使用者吗?

这份报告我们已经完成了一半,希望你能读到最后。但是如果你没有,那就带着这个离开: Bandcamp 已经成为一种极其罕见的公司类型,一家盈利的初创公司,它只不过是为人类经验的混乱变量在经济交易中的互动提供了一个陈旧的平台。这个基本模型是如此的有效,以至于不管网站的其他缺点是什么,它都能工作。

作者图片

事实上,乐队营是有利可图的,一家初创企业可能会让一些人感到意外。2010 年,Bandcamp 获得了两笔首轮投资:一笔来自位于门洛帕克的风险投资公司 True Ventures,另一笔来自投资者布拉德·加林豪斯(Brad Garlinghouse)。True Ventures 的成功退出包括 Peloton 和 Fitbit,它们都上市了,还有被亚马逊收购的 Ring。自 2017 年以来,加林豪斯一直是 Ripple 的首席执行官,截至本文撰写之日,Ripple 是市值第七大的加密货币,在 2017 年的繁荣时期,其价值飙升了 3600%以上。

做一点餐巾纸数学,这是我们估计该公司去年的总收入,包括 BCF 销售额,并考虑了一些基于项目价格的支付的更高层次的差异等等。我们没有考虑专辑和曲目之外的项目类型的差异。

作者图片

这是我们估计该公司去年从 15%的费用中得到的。该数字不包括 BCF 销售额,同样也考虑了基于正常天数与 BCF 的价格差异,以及项目价格。

Bandcamp 首席执行官戴蒙德表示,他的公司自 2012 年以来一直盈利。如果我们除了这个估计之外没有其他信息,我们会相信他。2100 万美元足以支付公司的运营成本,包括员工工资、服务器成本以及办公室和奥克兰实体唱片店的租金。

但是我们不仅仅只有这个估计。我们知道,自 2010 年 A 轮融资以来,该公司没有再进行投资,而且灯还亮着。我们知道,它还没有被一家在不良资产中看到了机会的私人股本公司蚕食。没有理由怀疑戴蒙德的说法。

记住这一点,让我们看最后一个图表。

作者图片

尽管人们可能不知道 Bandcamp 是盈利的,也是一家初创公司,但他们通常也不知道 Spotify 根本没有盈利。在很大程度上,Spotify 除了赔钱什么都不做。购买播客的独家版权,支付大量唱片公司许可费,同时向用户收取不超过 9.99 美元(该公司可能会提高的月订阅费),其中大多数人选择不付费,这是很昂贵的。

这是因为 Spotify 对人类作为经济行为者的理解几乎是最大限度的简化、过时和有根本缺陷的。

它的误解始于一个简单的音乐误解:考虑到听众的情绪,Spotify 应该为他们提供与这种情绪相匹配的音乐。这是首席执行官丹尼尔·埃克从一开始就明确的使命宣言,也是其“适合每种情绪的音乐”广告活动背后的理念,该活动一直持续到去年。如果有人要在秋天去公园散步,应该给他们提供秋游音乐。如果他们已经和某人分手了,应该给他们提供分手音乐。如果你曾经遇到过一个名字可笑的 Spotify 管理的播放列表,比如白日梦者、背景中的钢琴电影放松,你已经瞥见了这个野心。

这里的结局并不难理解:如果秋天的散步和白日做梦最好伴随着某种音乐,并且我们可以弄清楚那些声音是什么,为什么艺术家们还要制造它们呢?该公司对这一未来的暗示如此强烈,以至于几乎要发布一份新闻稿。与此同时,该公司通过与 Joe Rogan 等明星播客的独家交易以及收购 Gimlet Media 等公司来寻求主导地位,实际上购买了播客的市场份额,试图垄断市场并控制相当于音频广告的谷歌广告。

在这两个方面,Spotify 都在追求标准硅谷商业模式的两个方面,即一家公司烧钱,直到人类完全消失(就像优步的无人驾驶汽车一样)和/或直到消费者几乎没有其他地方可以去购买他们之前从各种来源购买的东西(就像亚马逊一样)。拼车公司发现,做第一件事并不总是成功。做第二件事需要很长时间,而且之所以可能,是因为美国薄弱的反垄断机构几十年来一直允许掠夺性定价(即以低于成本的价格排挤竞争对手)和不问问题的并购,而这一机构正在迅速纠正方向。

但 Spotify 的业务不仅仅建立在错觉和非法性之上——这也是一个明显愚蠢的模式,它无视过去几十年的行为经济学研究,坚持将用户视为理性行为者,他们只是以最低的价格寻求最多的商品。

克里斯·古林斯基在加州大学圣地亚哥分校的博士论文研究了 Bandcamp 用户,他向我们指出,Spotify 的模式甚至忽略了一个基本原则,即 20%的买家通常会购买 80%的商品。相反,每个 Spotify 用户的价值以每月订阅价格为上限。⁰通过拒绝买家与卖家建立直接经济关系的可能性,Spotify 别无选择,只能继续追求其妄想的、非法的、愚蠢的商业模式,这种模式对寻找人们为音乐付费的方式不太感兴趣,而是对推广一种人们只是勉强付费的收听模式更感兴趣。

所以 Bandcamp 是盈利的,Spotify 不是。一个建立在价值创造的基础上,另一个建立在投机热情的基础上。Bandcamp 建立了一个现代商业模式,而 Spotify 建立了一个过时的商业模式。

为什么投资人把钱都往一个里倒,而不是另一个?True Ventures 和 Garlinghouse 作为该公司唯一的上市投资者,很可能是 Bandcamp 的董事会成员,为什么不推动该公司实现架构现代化,积极推销自己,并要求风险投资者采取各种措施,有效地将枪对准首席执行官的脑袋,告诉他们要么成长,要么死亡?

这是一个完全错误的推测,但仍然是一种可能性:

具有讽刺意味的是,这可能是因为该公司的盈利能力。风险投资的理念是,在一个由 10 家公司组成的投资组合中,9 家公司失败了,其中一家 100 倍。乐队既没有失败,也没有壮大。相反,它已经成为一家利润适中的公司,没有任何接管世界的明确意图。在这种情况下,它变得不像硅谷投资者追逐的超高增长股票,而更像 90 年代的公司债券或 IBM 股票,它们可靠地支付股息,但不会让任何人像 Peloton 或 Ripple 那样富有。进一步投资成为不必要的风险,危及安全的收入来源。

如果这是真的,有两个发展可以动摇这种自满。

首先,投资者押注一家初创企业最终可能 100 倍于至少部分依赖于市场中不受监管者质疑的非法活动。像脸书、亚马逊和谷歌这样的公司发展到今天的规模,靠的是一些策略,即使是政治上温和的政策制定者现在也认为这些策略是犯罪。随着他们的规模越来越大,他们也从风险公司手中收购投资组合公司,允许投资者退出。随着监管机构审查拆分科技巨头的可能性,以及他们更密切地审查收购,这两种退出途径——成为垄断企业或被垄断企业收购——都可能会缩小。

其次,在 Bandcamp 于 2008 年成立十多年后,其他投资者、创始人和卖家已经发现,那些确实能促进卖家和客户之间经济关系的企业——让无数变量随心所欲地互动——实际上启动和投资成本更低,成功的速度也更快。Spotify 大约 70%的成本用于唱片公司的授权费。Patreon、OnlyFans 和 Substack 没有这样的成本,同时也利用了各种经济经验,允许人们满足他们必须支付的大量冲动。

就在我们结束这篇报道的时候,Twitter 和 Square 首席执行官杰克·多西宣布,Square 将收购长期陷入困境的挪威音乐流媒体服务 Tidal——这一宣布是在 Twitter 收购时事通讯平台 Revue 之后。“Square 为卖家和个人创造了工具生态系统,我们也将为艺术家做同样的事情,”多尔西在他关于 Tidal 收购的推特帖子中说。“我们将致力于全新的聆听体验,以拉近粉丝之间的距离,为 merch 销售提供简单的集成,现代协作工具,以及新的补充收入流。”

不清楚杰克对 Tidal 和 Revue 的热情到底是什么。最坏的情况可能涉及到 NFTs。一个不太复杂也可能更有可能的情况是,这只是创新平台的新惯例。买家想直接付钱给创作者,创作者想得到报酬。除了统治世界,成为一个允许这种基本交易发生的平台比拒绝它更有利可图。

如果这些是市场实际上发出的信号,这可能意味着 Bandcamp 不再是公司债券或蓝筹股,而是更接近于 True Ventures 和 Garlinghouse 十年前首次投资时所希望的成长型公司。

考虑到这一点,以下是 Bandcamp 应该做的事情的一个非常不完整的列表。

作者图片

首先,该公司应该从技术和品牌惯性状态中解脱出来。尽管 Bandcamp 深受艺术家和听众的喜爱(在这一点上,不言而喻,对我们来说也是如此),但这个平台在创建后就感觉自己已经钙化了。网站很慢。它的布局元素怪异地违反直觉。你不能在应用程序中下载音乐,应用程序只允许低质量的流媒体。API 没有提供有意义的方法来将平台与外部服务集成。

与此同时,除了该网站的内部音乐出版物《Bandcamp Daily》和奥克兰市中心的一家大多数人永远不会遇到的实体唱片店之外,该公司似乎没有营销,主要依靠艺术家自己来营销他们自己的工作平台。如果我们描述我们的研究在多大程度上引导我们接触到了那些甚至没有听说过 Bandcamp 的人(有点令人沮丧的是,这个群体中包括一些知名唱片公司的决策者),该公司的管理人员会感到不安。

该公司还应该进入一个更具实验性的运作模式,一个完全以行为为导向的商业模式需要充分发挥作用。如果人们在与他们共享一个城市的艺术家身上花费更多,看看直接在他们的城市推广工作是否会导致更多的花费。如果出现像 Buy Music Club 这样的网站,一个独立创建的分享 Bandcamp 播放列表和推荐的网站,收购该网站并将其整合到应用程序中。构建 API,例如,NTS RadioDJ 可以轻松地将专辑/曲目页面集成到曲目列表中。诸如此类。

第二,该公司应该积极吸引更多大型艺术家在平台上发布音乐,不仅带来更多收入,还能使平台超越其利基地位。说服一些较大的艺术家发布一张在⁴流媒体平台上没有的 EP,看看会发生什么。根据 Spotify 的人气评分,菲比·布里杰斯(Phoebe Bridgers)与查莉 XCX 不相上下,她在 Bandcamp 上独家发布的一首限量版歌曲为慈善机构筹集了超过 17.8 万美元的资金。如果这些钱都不捐给慈善机构会怎么样?⁵10%吗?如果是整张专辑而不是一首曲目呢?

同样,我们不知道,但这首歌的销售确实开始证明这样的说法是错误的,即大艺术家的粉丝被动地吸收了艺术家发出的任何声音——事实上这其中有关系,因此,这是一种经济学。虽然人气如何影响付费意愿的数据尚不清楚,但古林斯基的研究得出结论,至少,喜欢更受欢迎的艺术家的人不会因此减少使用 Bandcamp 本身的可能性。然而,值得一提的是,电台司令粉丝自愿向乐队付费的意愿是该公司的基本观察结果。

作者图片

第三,由于我们所有的命运都是交织在一起的,宇宙中的事物都是相连的等等,Bandcamp 应该认识到,在某些有利于它的市场条件下,它可以增长最多。对 Bandcamp 最有利的条件是那些有利于价值创造和不赞成空洞的投机和犯罪的条件。为此,该公司应该考虑与其他有望从严格的反垄断执法中获益的公司会面,如 DuckDuckGo、Affinity 和其他许多公司,组建一个贸易团体,并聘请一些游说者。

目前,唯一存在的相关团体是应用公平联盟,这是一个由 Basecamp 和 Epic Games 组成的贸易团体,主要兴趣是降低苹果 30%的应用商店费用。从长远来看,降低这些费用可能对 Bandcamp 达到一定的增长水平很重要:Bandcamp 不允许应用内购买的全部原因是,它可以保留与艺术家的收入分成,而不必同时削减一家万亿美元的公司。在撰写本文时,该联盟已经成功地让亚利桑那州众议院通过了一项法案,该法案将迫使苹果和谷歌允许替代支付方式来绕过他们的把关。

Bandcamp 或许应该加入,但应该不止于此。该联盟的成员之一是 Spotify,该公司多年来一直讽刺性地指责苹果和谷歌的垄断行为。这可能是 Spotify 唯一能从解决反垄断问题中获益的了。在这种情况下,Spotify 和 Bandcamp 的利益异乎寻常地一致。但有利于 Bandcamp、DuckDuckGo、Affinity 和其他公司的市场条件远远超出了 app store 的范围,深入到了我们经济的核心。据我们所知,目前没有贸易团体在这一领域进行宣传。乐队营应该帮助启动它。如果事实证明有一个存在,它应该加入。

但是,尽管美国立法者最近做出了反垄断努力——其中许多将直接影响今天的音乐产业——band camp 的最佳举措可能超出了北美。UCL 伦敦最近提交的一份报告描述了英国创意产业内部的广泛危机,描述了所有新兴和已建立的创意部门的代理和收入的重大损失。除了当地的经济政策,该报告认为垄断的科技平台是这场危机的主要驱动力。Bandcamp 在反对这种形式的反垄断方面立场独特,其专业知识可以为知识产权改革、数字发行立法、定价阈值、所有权等提供信息,是更大战略地位的一部分。

作者图片

最后,如果这些建议对公司过去的投资者来说太难接受(推测/假设/等等)。),创始人和/或员工应该看看是否有办法买断它们。希望事实正好相反,投资者实际上明白,创办一家新的 Spotify 并不明智,政治潮流已经发生了变化,Bandcamp 通过创造价值而不是违反反垄断法规,成为他们最初希望的投资组合巨鲸的可能性现在比十年前更大。

结论

我们将以这个音符结束:

我们认为这份报告中有足够的信息让不同的读者带走他们认为有价值的东西,忽略或摒弃他们不认为有价值的东西,只要他们记住最重要的一点:Bandcamp 的模式是反脆弱的,而 Spotify 的不是,这就是 Bandcamp 盈利而 Spotify 不盈利的原因。我们将增加一个不可谈判的要点,即 Bandcamp 是由尊重音乐的人创立的公司,而 Spotify 不是。这是两者之间的区别,其他一切都源于此。

Spotify 永远不会提供其艺术家们无休止地呼吁的东西:公平的报酬和不涉及贿赂或类似音乐 SEO 的艺术家发展的诚信途径。它不会这样做,因为超出基本荷尔蒙调节的音乐的存在不会引起它的兴趣,因此,音乐家的存在也不会引起它的兴趣。Apple Music(第二大流媒体平台)和 Amazon Music(第三大流媒体平台)在多大程度上也是如此还有待商榷,但在大多数情况下,它们并没有在相反的方向做出明显的姿态。

也许所有这些都夸大了两个生态系统之间的竞争;在许多方面,它们可以被视为互补的,因为流媒体提供了音乐发现的途径,而 Bandcamp 提供了经济关系的途径——戴蒙德曾经将 Spotify 比作收音机,一个发现新艺术家的地方。除了虽然 Bandcamp 可能会将流媒体平台视为补充,但亚马逊、苹果和 Spotify 在过去十年里吞噬了整个市场,很少将自己视为任何东西的补充。

在这项研究的过程中,我们中的一个人向在流媒体平台上独家发布艺术家音乐的唱片公司的某人建议,他们应该在 Bandcamp 上放几首歌,看看会发生什么。这位人士说,他们会向公司的其他人提出这个想法,“作为任何想要追求‘地下’外观的艺术家的一个想法。”

这里提出的每一个建议都是一个忠告的一个方面:乐队营竭尽所能,这样就不会有人再发这样的电子邮件了。

致谢

特别感谢凯德·迪姆(新设计大会)、克里斯·古林斯基(惠普)、阿伊莱特·格尼兹(加州大学圣地亚哥分校拉迪管理学院)、方敏雅·钟(NYU 斯特恩商学院)和马特·斯托勒(美国经济自由项目)在整个项目中的交流和反馈。

如果你喜欢这篇报道,你可以在这里订阅我们的时事通讯

如果您没有,并且想要投诉,请联系 mail@components.one

脚注

由于 Spotify 在流媒体市场中的地位、对其他参与者的巨大影响以及我们对编辑简洁的兴趣,Spotify 是本报告中唯一一个与 Bandcamp 进行认真研究的流媒体服务。值得承认的是,Spotify、亚马逊、Tidal、苹果、SoundCloud(尤其是)等等之间确实存在差异。

在分析过程中,公司的声明和我们的结果之间出现了一些差异。例如,《卫报》报道说,在周五的第一次乐队营上,“乐迷们在 24 小时内在乐队营上购买了 80 万张唱片,总计价值 430 万美元的音乐和商品。”这一原始数据比我们在四个星期五的乐队营中捕获的任何一个都要高。然而,各自的销售数字大致相同——我们记录的上周五的乐队营收入约为 470 万美元,但仅包含约一半的销售额。目前还不清楚为什么会存在这样的局部差异,但这是值得指出的。来源。⇗

也就是说,没有对此进行显著性测试。

⁴平均数和中位数比率都排除了支付价格超出每个国家平均数三个标准差以上的异常值。

⁵用另一种方式说,“人们增加了与陌生人合作的程度,他们认为这些陌生人是即使是最少触发的团结团体的一部分。”来源。⇗

⁶很难不认为这解释了卢森堡这个微型国家的特别大的比率。

⁷:我们根据 Bandcamp 的换算来衡量美元价格。

⁸这个相册页面已经不可用了。

⁹:这张专辑的页面也不再可用,确切的慈善机构也无法回忆起来,所以与慈善机构的关联来自记忆(以及特定专辑的> 9 比率)。

⁰用另一种方式(这可能会让一些人翻白眼,但无论如何),Bandcamp 是抗脆弱的,因为通过利用其用户行为的多样性,它捕捉了多个局部最优定价,而不是寻求单一的全局最优。创业界最有趣的讽刺之一是,其成员声称对抗脆弱性等概念感兴趣,同时却在最脆弱的模型上建立公司。收益/成本也是双向的:正如安德鲁·威尔金森(Andrew Wilkinson)令人信服地指出的那样,即使是乔·罗根(Joe Rogan)也可能通过拒绝 Spotify 的交易并直接从他的听众身上赚钱来赚更多的钱。

虽然 Bandcamp 移动应用程序的功能并不丰富,但它提供的功能几乎完全可以正常工作。

这与公司购买市场份额或竞争对手的非法收购不同。事实上,这就是合法收购的意义所在。

或任何东西,只是用 API 做任何事情。

⁴:这又不同于 Spotify 与罗根等人的排他性交易。在那种情况下,该公司将以前开放的文件标准限制为封闭的标准。在这个假设中,艺术家仍然可以自由地出售文件、磁带等等。此外,即使艺术家在 Bandcamp 上独家发布,这里建议的策略是,公司只是吸引艺术家在平台上发布,而不是在合同中约束他们。

⁵:她以前在这个平台上发行过专辑,但是 a)我们的数据中没有所有的销量,b)它们并不是在那里独家发行的。

为什么数据治理被打破了?

原文:https://towardsdatascience.com/why-is-data-governance-broken-5a9c0275120b?source=collection_archive---------33-----------------------

我们一直缺少一些重要的东西来使它变得有效和适应性强

杰克逊在上煨un splash

本文更多的是一种明智的观点,而不仅仅是对数据治理的描述。我已经在数据治理领域工作了很长时间。在某种程度上,我们自私地试图澄清我们的信息,并把影响组织的问题归结为其基本的、令人痛苦的组成部分。但在某种程度上,我们也揭露了我们都知道的事实:数据治理存在于大多数组织中,但它未能实现高管们期望的价值。

它有助于识别问题及其根源。这是找到持久解决办法的第一步。

这篇文章旨在激发高层领导的对话,让他们更好地理解问题出在哪里,并研究我们如何解决这些问题。

我们是怎么到这里的?

传统的数据治理是多年前设计的,当时 IT 需要让业务部门参与数据决策。它从系统访问、数据质量和数据定义开始。从那时起,它已经发展到管理更多的事情。

但是相当多的压力迫使我们重新考虑如何管理数据。让领导特别为难的是,我们习惯于观察一个问题,然后解决它。但是更多需要解决的问题正在慢慢地向我们袭来。我们只是没看到他们过来!

如果我们稍微退后一步,这些趋势的结合创造了完美风暴:

  • 我们正在管理和生成越来越多的数据。
  • 云有无限的性能,但是把所有东西都搬到那里需要时间。因此,我们发现有越来越多的环境存放数据或保存数据的副本。
  • 人工智能、分析和自动化意味着我们需要在更多的用例中使用这些数据。
  • 也许这与用例的激增有关,但可以肯定的是,没有人会认为更多的人需要数据来完成他们的工作。
  • 隐私监管现在在政治上很时髦,而且理由很充分。规则越来越严格,尤其是在 B2C 领域。
  • 既然我们可以自动化决策,我们需要担心偏见、道德,并负责任地这样做,否则会将组织置于风险之中。

这场风暴的影响是还有很多事情要做。在以下领域,需要新的流程来创造价值并防范数据风险:

  1. 理解数据。
  2. 处理数据。
  3. 确保数据质量。
  4. 使用和共享数据。
  5. 安全数据。

从历史上看,数据治理在处理或使用/共享数据方面做得并不多。数据隐私和自动化决策正在改变这一点。但我们想要的是增强数据治理,而不是制造更多的孤岛,例如,数据隐私是通过一套完全不同的流程来管理的。

数据治理能为组织带来什么?

正如梅尔文·尤德尔(杰克·尼克尔森饰演的角色)在电影《尽善尽美》中所说的,“我在这里溺水,而你却在描述水!”。我们无法控制那些让我们陷入困境的外部因素。幸运的是,我们可以从这种情况中获得有用的和可操作的信息。

数据隐私是每个人的工作

现在,信息泄露和黑客攻击成了新闻,公司必须认真注意保护机密信息,更不用说大多数公司遵守的法律了。问题是保护数据和遵守规则要求我们管理流程和数据,而不仅仅是数据。

在过去,数据仓库中的数据质量可能是 IT 部门的责任,由项目或领域数据管理员提供一些指导。如果你仔细想想,确保信息的隐私远不止这些。只要想想数据是如何被使用或共享的,它的范围就会迅速扩大。你如何控制每个人都遵守规则?

我们必须认识到,就像我们必须制定数据质量 KPI 来管理数据质量一样,围绕数据安全和数据隐私制定 KPI 需要协调和统一所有利益相关方的参与方式。法规变得越来越具体和规范。根据数据的生命周期阶段、位置、聚合方式或使用方式,相同的数据可能需要不同的方法来符合规则。

通过管理管理数据的流程,我们可以

  • 检查流程是否到位;
  • 流程是否足以支持合规性;
  • 如果某人或某个团体有责任执行流程;
  • 如果过程已经完成并提供了预期的结果。

很明显,我们可以创建 KPI 来跟踪这些内容。

太大了,手动做不了

许多组织仍在通过临时、手动或过时的工具实施数据治理策略和标准。数据团队尝试和审查报告和数据集,在所有地方设置自定义规则,并比较预期的数字。技术堆栈和数据爆炸意味着这种旧方式效率低下且无法扩展。

即使问题变大了,还是要管。我们将把工作分配给合法的所有者,并自动确认其完成。无论流程所有者在价值链中带来什么价值,他们都将通过技术自动化来优化他们负责的一些流程,这可能会使用人工智能来完成一些繁重的工作。

这些是我们已经习惯的技术,包括沿袭和映射、数据质量监控等。但是由于这个问题的巨大规模(参见上一节关于我们如何走到这一步的内容),我们不能把它留给各种利益相关者或数据管理员去解决。我们需要在每个人需要如何参与的“编排”中加入纪律;我们需要管理数据或操纵数据的过程。

管理管理数据的流程

我们多年来为数据治理开发的实践主体仍然很好。但是还有更多的事情要做。我们留给数据管理员去解决的问题将不再有效。我们必须详细规划流程,因为无论如何审计都需要这些流程。好消息是,它将推动数据操作。

随着隐私法的改变,管理数据而不仅仅是数据的过程也会有所帮助。我们需要敏捷性来了解运营影响并快速做出反应。

增加一个流程管理层将为组织中的每个人提供更多的可见性,对于那些不知情或不得不相信某人在防止数据泄露方面做得很好的高管来说也是如此。

为什么数据建模这么难?

原文:https://towardsdatascience.com/why-is-data-modeling-so-difficult-bc03b661cad0?source=collection_archive---------25-----------------------

数据库规范化入门

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

数据建模是所有数据工程师工具集中的一项基本技能。然而,在我职业生涯的早期,我发现数据建模极其困难:一部分是因为没有一种公式化的方法来建模数据,另一部分是因为可用的信息是基于集合论的,这是我从来没有过的乐趣(不悦?)的学习。然而,随着经验的积累,我发现数据建模变得越来越容易。虽然它永远不可能是一门精确的科学,但考虑到业务的相互依赖性,我发现了一种多年来一直对我有效的方法。

让我们设计一个关系数据模型…我该怎么做呢?

设计数据模型不是一件容易的事情。在创建模型之前,数据工程师必须考虑许多因素,例如业务需求、单个业务流程、读/写比率等。然而,由于许多这些都是视情况而定的,所以让我们假设我们已经做了必要的准备工作,并准备开始数据模型设计。设计步骤如下:

第一步:选择主要实体,或者表格

第二步:确定实体关系类型。

第三步:确定哪些属性属于哪些实体。

第四步:确定主键和外键约束。

第五步:根据业务逻辑设置属性约束。

第六步:正常化

很简单,对吧?创建几个表格,用几个键把它们连接起来,瞧!数据建模完毕,准备就绪!

可惜,事情没这么简单。您可能能够快速完成步骤 1-5,但是步骤 6 可能是一个挑战,它通常需要大量的迭代。让我们关注第 6 步。

标准化数据

简单地说,规范化数据意味着采用一个结构不良的表集,易于创建、更新和删除异常,并将其塑造成一个定义良好的表集。要做到这一点,您需要完成上面的步骤 1-5,根据标准形式测试模型,如果通过,您就成功地定义了您的数据模型!否则,修改现有的数据模型并重复。但是什么是范式呢?

范式

范式可以被认为是规范化的“层次”;也就是说,每个表单都有一个定义,如果数据模型通过,您就可以进入下一个级别。这就像一个电子游戏:你不能跳到第二级而不先在第一级打败老板。三种主要范式是:

第一范式(1NF) :如果一个关系有唯一的属性名,属性值不是多值的,属性在整个关系中不变,关系有主键属性,数据的排序无关紧要,则该关系在 1NF 中。

第二范式(2NF) :一个关系在 2NF 中如果它在 1NF 中 每个非主键属性在功能上都依赖于主键。例如,如果我们有一个具有三个属性(id、car_make、price)的实体,其中 id 是主键属性,那么属性 car_make 和 price 应该只依赖于属性 id。如果价格取决于汽车制造商(很可能是这样),那么这将违反 2NF。2NF 的目的是去除部分依赖,减少冗余。

第三范式(3NF) :一个关系在 3NF 中若在 2NF 中所有非素数属性都不具有传递依赖。这一点比较难理解(至少对我来说)。假设我们有三个属性(A,B,C ),其中 A 是主键属性。从数学的角度来看,如果 A-B 和 B-C 为真,则关系式 3NF 不成立,因为 C 传递地依赖于 A (A-C)。在现实世界的例子中,如果在一个具有附加属性的实体中有“State”和“Country”属性,您可能会看到这种情况,因为“Country”在传递上依赖于主键属性。

如果一个数据模型通过了 3NF,那么它就被认为是充分规范化的。有更多的正常形式,但那些最好是在非常特殊的情况下使用。在大多数应用中,一旦你的模型达到 3NF,你就可以停下来庆祝了!

最后的想法

标准化通常需要相当多的迭代。对数据模型的某些更改会破坏您可能已经准备好的其他修复。规范化一个数据库并不容易,但是如果你想要有弹性的数据结构,那就没有办法了。

在我职业生涯的早期,我发现规范化相当困难,可能是因为我缺乏经验。要完全理解正常化,练习,练习,再练习。它最终成为第二天性,随着您避免常见的陷阱并认识到具有某些类型属性的模式,迭代的数量会减少。

祝你好运!

DAX 为什么难学?

原文:https://towardsdatascience.com/why-is-dax-difficult-to-learn-4fc792d6f801?source=collection_archive---------22-----------------------

每个 Power BI 开发人员的眼中钉

汉斯-彼得·高斯特在 Unsplash 上拍摄的照片

您打开 Power BI Desktop,连接到一个 excel 文件,并将您的第一个可视化拖到画布上。你的眼睛会因为从这个强大的工具中创造出有用的东西而兴奋得发亮。现在你选择为你的下一个图表计算一些东西。您添加的前几个公式与 excel 公式没有太大区别,您会兴奋得毛骨悚然。世界是你的。

然后你注意到了。等等!数字是错误的。也许不同的计算方法会有用?让我谷歌一下。在网上找到有同样问题的人,你点击链接找到他们的解决方案。突然你掉进了一个兔子洞,感觉有点像爱丽丝梦游仙境。你找到的解决方法很难理解。享受没有了。眩晕消失了。你的头很痛,制作你所设想的有洞察力的图表的前景似乎很暗淡。

欢迎来到达克斯。

数据分析表达式(DAX)是微软在 2009 年发布的,是其多维表达式(MDX)语言在数据立方体方面的发展。从那时起,它开始渗透到它的数据平台中,包括 PowerPivot、Power BI 和 SQL Server Analysis Services。虽然有些 DAX 公式的工作方式就像我们熟悉和喜爱的 Excel 公式一样,但有些却不是。它的功能目的是处理关系数据并动态地执行聚合。它应该是易学易用的。但事实并非如此。

*

如果你熟悉结构化查询语言 SQL,你就会知道有些查询会给你带来挑战。但是一般来说,你理解数据模型,你知道语言本身在做什么。所以这只是解决一个非常切实的问题。如何用已知的命令集让底层数据以特定的方式显示出来?这很简单,即使有时很复杂。

SQL 和关系数据库在精神层面上非常具体。通过我们在 SQL 查询中使用的命令,很少猜测数据或数据经历的过程。但是达克斯不是那样的。

达克斯将这些概念隐藏在幕后。这使得 DAX 在底层数据结构、查询上下文以及它到底在做什么方面变得非常抽象。如果 SQL 90%具体,10%抽象,那么 DAX 就是 5%具体,95%抽象。

它的抽象本质使得学习 DAX 更具挑战性。

如果你是一名程序员,你可能已经面临过类似的经历:

  • 还记得你第一次从函数式编程转换到面向对象编程的时候吗?令人眩晕。你确信你的开发生涯已经结束了。
  • 或者,也许,当您第一次使用 Angular 并不得不将数据绑定到它的前端元素时。生活似乎结束了。
  • 或者说,你第一次遇到 Hadoop 怎么样?很明显,一个疯子发明了 Hadoop。

然而,DAX 比上面的例子更难。拉开窗帘,以一种看得见摸得着的方式看到后台发生的事情几乎是不可能的。这就像在拼图游戏中,没有完整的图片作为参考。不过,好消息是,这也像《多希和巫师》。一旦你看到窗帘后面,你会意识到那只是一个小老头。无害,但以他自己的方式强大。

DAX 适合抽象的学习者。

有些人天生是更具体的学习者。这就是从看别人的代码样本中捡起 C#或者 Python 的人。其他人是更好的抽象学习者。数学家、天文学家或在细胞或亚原子水平上研究事物的人。这些人往往更擅长抽象学习。

具体的学习者需要更加努力地学习 DAX,而抽象的学习者会更自然地成功。但是,对于少数既抽象又具体的学习者来说,DAX 根本不是问题。然而,我们其他人不应该放弃希望。只要有足够的时间和努力,几乎任何人都可以学会 DAX。

掌握 DAX 的秘诀是先学习理论。

公式很简单,但是过程很慢。从研究 DAX 如何看待底层数据模型开始。然后理解 DAX 对上下文的使用。最后,研究 DAX 函数,了解它们在幕后实际上在做什么。刚开始你会觉得脑子小,头疼。你可能会想放弃。但是,随着时间和练习,它会变成第二天性。*

杆蓖麻 帮助企业获得分析权!他帮助国际组织和小型企业改善他们的数据分析、数据科学、技术战略和技术领导力。除了咨询,Rod 还喜欢公开演讲、教学和写作。你可以在 rodcastor.com**和通过他的 邮件列表 了解更多关于 Rod 和他的工作。

为什么三角洲湖越来越受欢迎?

原文:https://towardsdatascience.com/why-is-delta-lake-becoming-increasingly-popular-1e45c29cc7d2?source=collection_archive---------14-----------------------

行业笔记

讨论数据湖- 带来的益处超过传统挑战,ACID 合规性、版本化拼花文件等。

📷由加斯顿Unsplash

对于初学者来说,理解三角洲湖和数据湖之间的区别可能会令人困惑。与以前的存储层一起工作了一年多,现在我分享了 delta lake 的特殊优势,以及它如何通过一些示例克服传统数据湖体系结构的挑战。

这些例子是为了使它更加直观和非技术性。我相信这将作为一个很好的策展,从不同的来源,三角洲湖可以带来什么。

根据定义,delta lake 不是一个独立的存储容器,而是一个运行在现有数据湖和对象存储之上的开源存储层。让我们把它看作是现有数据湖之上的附加功能,如下所示。

它由一个 delta 引擎驱动,而 delta 引擎又由一个名为 Photon 的本地执行引擎驱动。这是一个用 C++从头开始编写的矢量化查询引擎。在撰写本文时,它正在公开预览中。

三角洲湖建筑(图片由作者根据[ 原文 ]创作)

数据湖——是什么让它充满挑战?

它是一个存储原始数据的容器。把它看作是一个尚待处理的纯原始数据的垃圾场。

数据湖的一些重要特性包括——它的扁平架构,只有当你做读操作时,模式才被执行(读模式)。因此,它可以以低延迟轻松存储非结构化数据。

然而,原始数据给🧱带来了严峻挑战

挑战 1:可靠性和质量——原子性

数据湖不能很好地处理损坏的数据。当我们在数据加载过程中发现故障时,将需要完全重新处理。

delta lake 在这个场景中提供的解决方案是通过引入原子性。这意味着要么有一个完整的写/提交(或)没有写(又名原子可见性)。

在执行提交操作时,它是二进制的。因此,在作业完成之前,我们会知道数据中何时出现问题。

有一个单一的真理来源被用来服务于这个目的。它被称为事务日志(增量日志文件),,它跟踪所有被写入增量表的原子事务。Spark 然后在每次交易后更新用户端的表格。

增量日志文件是 JSON 文件(00000000000000000000.json, 00000000000000000001.json等)。)与临时的检查点文件一起放在_delta_log子目录中。

在增量日志文件中,还有 commitInfo、partitionValues 和 stats 信息,它们是不同的元数据属性,用于跟踪数据更改,有助于提高查询效率。

三角洲湖中的原子性(图片由作者提供)

考虑以下简单的信用交易,一旦数据被写入,在服务启动并运行后,它应该用正确的值 110 更新(或者)保持为 100,而交易日志不捕获提交信息。这就是原子提交的样子。

只有一个客户端可以通过一次原子提交来实现对象的创建。

部分执行可能导致非原子提交,这在服务器故障(或)其他问题期间发生在数据湖中。

挑战#2:缺少数据一致性

当涉及到丢失数据时,有两种情况会产生问题:

  • 批处理和流处理数据需要使用 lambda 架构风格,将数据写入两个不同的容器。在数据湖中,这两种工作负载类型的统一是不可能的。
  • 覆盖操作期间(基本上是删除和写入),有一个时间点表中没有数据,如果在此瞬间发生任何故障,我们在查询时将看不到任何数据。

在 Delta lake 中,这种数据不一致性是使用称为乐观并发控制的概念来处理的,通过这个概念,由多个用户同时(或)由不同类型(批处理/流)写入的数据是以序列化的方式完成的。我们可以将源用作批处理表,将流表用作接收器。

在一些特殊的场景中,并发操作无法乐观地执行,在此期间,增量引擎会抛出一个错误。

三角洲湖的一致性(图片由作者提供)

当出现连接丢失(或)某种形式的失败(或)多次写入时,要提交的数据不应丢失,而是在事务日志中捕获,并以序列化方式执行提交。

挑战#3:并发操作-隔离

如一致性一节所述,并行发生的操作需要串行隔离,以避免冲突。这允许数据模型(批处理和流)的统一,这在数据湖的情况下是不可能的。

这就是隔离机制应对挑战的方式:尚未完成的提交被互斥规则隔离。只有当提交成功时,它才允许对 delta lake 进行写/合并/删除操作。

这还带来了对 delta lake 数据使用标准(删除、更新、合并)命令的功能,这有助于使您的数据符合 CCPA/GDPR 法案。

有一些特殊的场景,其中两个操作会导致增量表中的冲突,这里的https://docs.delta.io/latest/concurrency-control.html#avoid-conflicts-using-partitioning-and-disjoint-command-conditions捕获这些冲突以供进一步参考。简而言之,通过对 filter 命令中使用的列进行分区,可以避免这些冲突。

三角洲湖中的隔离(图片由作者提供)

这里,事务 T1T2 被隔离,并使用事务日志信息顺序执行。因此,在任何给定的时刻,它们都不会与数据相矛盾。

挑战#4:消失的数据-持久性

考虑在操作过程中出现故障和服务器端的情况。这又会导致数据丢失(或)大量损坏的记录。这在典型的数据湖中是无法避免的。

然而,由于事务日志磁盘存储持久性,即使在系统(或)服务器端出现故障时,数据也将持续存在。因此,非易失性存储器在三角洲湖中起着至关重要的作用。

三角洲湖的耐久性(图片由作者提供)

这里,当服务器停机时,更新操作可能失败和/或读取可能失败。因为事务存储在磁盘上,所以可以从增量表中读取最新值,直到最后一次提交。

挑战#5:真实性-模式检查

就真实性而言,当我们试图改变写入数据湖的数据类型时,会导致损坏和丢失记录。因此,需要对模式的有效性进行检查。

在 delta lake 中,在任何提交之前都会执行模式验证。默认情况下,不同的模式无法执行覆盖。这样,写入数据的模式格式应该总是与最初定义的模式相匹配(也称为写模式)。

如果需要重写,模式进化可以拯救。这可以通过在执行写操作时设置配置选项来实现。

三角洲湖的模式实施(图片由作者提供)

这里,对于简单的插入操作:当mergeSchema被设置为true时,有一个从 Float 类型到 Long 类型的类型转换。还有一个名为overwriteSchema的选项,将其设置为true将完全忽略旧数据,并在其位置创建一个新表。

挑战#6:数据时间旅行的版本化

现代大数据系统在进行频繁的大容量数据更改方面是一致的。需要有一个审计系统(或)回滚机制来监控正在发生的变化。数据湖中没有这种支持。

但是,在增量表中,数据的当前状态是表内事务日志(_delta_log/)子目录中记录的所有提交的总和。

它充当了从零开始构建数据到其当前形式的方法。这种通过遍历事务日志来创建数据的能力称为时间旅行(或)数据版本控制。

增量表中数据的先前版本可以通过时间戳(或)版本号来访问。增量表中的数据最终存储为版本化拼花文件

这允许用户执行更简单的回滚操作,返回到数据正确的时刻,并撤销错误的提交。

增量表中的时间旅行(图片由作者提供)

每个表都有一个版本号(或)时间戳,可以从一个DESCRIBE HISTORY <table_name>命令中获取。无论是使用子句VERSION AS OF (or) TIMESTAMP AS OF,我们都可以获得该时刻的表的快照。

挑战#7:数据的数据-元数据管理

元数据是数据的数据。它由表的模式、列名、类型和事务信息组成。

随着原子提交被记录在增量日志中,元数据被连续生成。这可用于跟踪由于所有来源而发生的所有变化。

这种元数据管理在 Spark 中是可伸缩的,它的处理就像数据一样分布在各个节点上。这将捕获模式、原子提交的创建时间、GUID ( 全局唯一标识符)、文件格式和其他配置选项。

在本机对象存储中,读取/列表操作的开销很大,而在增量湖的情况下,元数据读取是从集群上的日志并行进行的。

这可以使用DESCRIBE HISTORYDESCRIBE DETAIL SQL 命令来完成。它运行在并行处理引擎上,并提供底层元数据信息。进一步参考,你可以在这里看到文档

*-- get the full history
**DESCRIBE** HISTORY '/data/balanceTable/'        
**DESCRIBE** HISTORY delta.'/data/balanceTable/'-- get the metadata of delta table
**DESCRIBE** DETAIL '/data/balanceTable/'
**DESCRIBE** DETAIL delta.'/data/balanceTable/'*

结束语

总之,数据湖带来的所有这些挑战都通过使用 delta 湖得到了解决。它通过保持数据流的一致性和持久性,大大降低了原始数据处理的复杂性。

关键要点是,当有大量原始数据时,使用 Delta lake,重点是提高查询性能、数据一致性和持久性。

请提供您的建设性想法、意见(或)建议。

另外,请随时在 LinkedIn 上与我联系。下次见!

为什么 Kaggle 的所有人都痴迷于 Optuna 进行超参数调优?

原文:https://towardsdatascience.com/why-is-everyone-at-kaggle-obsessed-with-optuna-for-hyperparameter-tuning-7608fdca337c?source=collection_archive---------1-----------------------

让我们通过试用来了解一下…

照片由 博美 Pixabay。 除特别注明外,所有图片均为作者所有。

介绍

原来我一直生活在岩石下。

虽然每一个 MOOC 都教我使用 GridSearch 进行超参数调整,但 Kagglers 几乎已经专门使用 Optuna 两年了。这甚至早于我开始学习数据科学的时间。

Kaggle 社区以其残酷的竞争而闻名,对于一个达到这种统治水平的包来说,它需要该死的好。在平台上活跃了一个月之后(并且获得了两级专家资格,我看到 Optuna 几乎在任何地方都被每个人使用。

那么,是什么让 Optuna 被最大的机器学习社区如此广泛地接受呢?在本帖中,我们将通过动手操作这个框架来回答这个问题。我们将了解它是如何工作的,以及它如何从任何模型中挤出每一点性能,包括神经网络。

https://ibexorigin.medium.com/membership

获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:

https://alphasignal.ai/?referrer=Bex

什么是 Optuna?

Optuna 标志

Optuna 是完全用 Python 编写的下一代自动超参数调优框架。

它最突出的特点是:

  • 使用循环和条件来定义 Pythonic 搜索空间的能力。
  • 与平台无关的 API——您可以调优几乎任何 ML、DL 包/框架的估算器,包括 Sklearn、PyTorch、TensorFlow、Keras、XGBoost、LightGBM、CatBoost 等。
  • 内置了大量具有提前停止和修剪功能的优化算法。
  • 简单的并行化,只需很少或不需要修改代码。
  • 内置对搜索结果可视化探索的支持。

在接下来的章节中,我们将尝试验证 Optuna 文档中的这些过于乐观的说法。

Optuna 基础

让我们通过调优一个类似 (x-1) + (y+3) 的简单函数来熟悉 Optuna API。我们知道该函数在 x=1y=-3 时达到最小值。

你可以在这里找到这篇文章的笔记本。

让我们看看 Optuna 是否能找到这些:

导入optuna后,我们定义一个目标,返回我们想要最小化的函数。

在目标的主体中,我们定义了要优化的参数,在本例中,是简单的xy。参数trial是 optuna 的一个特殊的试验对象,它为每个超参数做优化。

其中,它有一个suggest_float方法,采用超参数的名称和范围来寻找其最佳值。换句话说,

x = trial.suggest_float("x", -7, 7)

和做 GridSearch 时的{"x": np.arange(-7, 7)}差不多。

为了开始优化,我们从 Optuna 创建一个study对象,并将objective函数传递给它的optimize方法:

相当接近,但没有你想要的那么接近。这里,我们只做了 100 次试验,可以看到:

>>> len(study.trials)100

现在,我将介绍 Optuna 附带的第一个魔法。如果我们对结果不满意,我们可以在优化完成后继续优化!

与其他类似工具相比,这是一个明显的优势,因为搜索完成后,他们会完全忘记之前的试验历史。Optuna 没有!

要继续搜索,用所需参数再次调用optimize。在这里,我们将再运行 100 次试验:

这一次,结果更接近最佳参数。

关于 Optuna 术语和约定的说明

在 Optuna 中,整个优化过程被称为研究。例如,以日志损失为度量来调优 XGBoost 参数是一项研究:

研究需要一个可以优化的函数。通常,该函数由用户定义,应命名为objective,并应具有以下签名:

它应该接受一个optuna.Trial对象作为参数,并返回我们想要优化的指标。

正如我们在第一个例子中看到的,研究是一组试验的集合,其中每个试验,我们使用来自给定搜索空间的一组超参数来评估目标函数。

研究中的每个试验都被表示为optuna.Trial类。这个类是 Optuna 如何找到参数的最佳值的关键。

为了开始一项研究,我们用direction创建一个研究对象:

如果我们想要优化的指标是像 ROC AUC 或准确性这样的绩效分数,我们将方向设置为maximize。否则,我们最小化损失函数,如 RMSE、RMSLE、对数损失等。通过将方向设置为minimize

然后,我们将调用研究的optimize方法,传递目标函数名称和我们想要的试验次数:

接下来,我们将进一步研究如何创建这些目标函数。

定义搜索空间

通常,您在目标函数中做的第一件事是使用内置的 Optuna 方法创建搜索空间:

在上面的目标函数中,我们创建了一个随机森林超参数的小搜索空间。

搜索空间是一本普通的字典。要创建可能的值进行搜索,您必须使用试验对象的suggest_*函数。

这些函数至少需要超参数名称、最小和最大范围,以搜索分类超参数的可能类别。

为了使空间更小,suggest_floatsuggest_int有额外的steplog参数:

上图中,我们将n_estimators的分布宁滨了 200 个区间,使其更加稀疏。另外,learning_rate是以对数标度定义的。

如何对可能的参数进行采样?

在底层,Optuna 有几个负责参数采样的类。这些是:

  • GridSampler:同 Sklearn 的GridSearch。不要用于大搜索空间!
  • RandomSampler:同 Sklearn 的RandomizedGridSearch
  • TPESampler:树形结构 Parzen 估计器采样器——使用核拟合的贝叶斯优化
  • CmaEsSampler:基于 CMA ES 算法的采样器(不允许分类超参数)。

我不知道最后两个采样器是如何工作的,我不希望这会影响我与 Optuna 的任何交互。

默认情况下使用 TPE 采样器——它试图通过提高上一次试验的分数来对超参数候选者进行采样。换句话说,您可以期待使用这个采样器从一次试验到另一次试验的增量(也许是边际)改进。

如果你想切换采样器,你可以这样做:

使用梯度推进回归器的端到端示例

让我们把学到的一切都变成有形的东西。我们将使用一些数字和分类特征来预测企鹅的体重。

我们将使用 Sklearn GradientBoostingRegressor建立一个基本分数,并通过使用 Optuna 进行调整来提高它:

现在,我们将创建objective函数并定义搜索空间:

我们构建了一个包含 5 个不同范围的超参数和一些静态超参数的网格,用于随机种子和早期停止。

上面的目标函数略有不同——它接受数据集、得分和cv的附加参数。这就是为什么我们必须将它包装在另一个函数中。一般来说,您可以使用如下的lambda函数来实现:

如果您想传递接受多个参数的objective函数,这是推荐的语法。

在不到一分钟的时间里,我们实现了显著的分数提升(就日志错误而言,0.004 是相当不错的)。我们只做了 100 次试验。让我们大胆地再跑 200 圈,看看会发生什么:

分数确实提高了,但幅度不大。看起来我们在第一次运行中达到了最大值!

最重要的是,我们使用常规网格搜索可能需要几个小时的搜索空间,仅用了 2 分多钟就获得了这个分数。

我不知道你怎么想,但是我被说服了!

使用视觉效果获得更多见解和更智能的调整

Optuna 在其visualization子包下提供了广泛的地块。这里我们只讨论 2 个,我认为是最有用的。

首先,让我们绘制最后一个study的优化历史:

这个剧情告诉我们,Optuna 只经过几次尝试就让分数收敛到了最小值。

接下来,让我们绘制超参数重要性:

这个情节非常有用!它告诉我们几件事,包括:

  • max_depthlearning_rate最重要
  • subsamplemax_features对最小化损失没有用

当调整具有许多超参数的模型时,这样的图很方便。例如,您可以进行 40–50 次试验,并绘制参数重要性。

根据情节,您可能会决定丢弃一些不太重要的参数,并为其他参数提供更大的搜索空间,这可能会减少搜索时间和空间。

有关 Optuna 支持的绘图类型的更多信息,您可以查看文档的本页。

摘要

我想我们都同意 Optuna 没有辜负我在介绍中对 T2 的大肆宣传。太棒了。

本文只给出了使用 Optuna 可以做的基本工作。事实上,Optuna 有更大的能力。我们今天没有谈到的一些关键话题:

最酷的是:

请务必查看相关文档页面的链接。

您可能也会感兴趣…

为什么可解释性现在如此重要?

原文:https://towardsdatascience.com/why-is-explainability-so-important-right-now-60f1b850023a?source=collection_archive---------22-----------------------

随着人工智能系统和机器学习驱动的工具在我们的日常生活中激增,从业者和批评者都越来越强烈地要求知道他们如何产生他们所做的结果。不知道的代价——经济的、社会的、技术的——已经变得太高了。本周,我们邀请你阅读三篇将可解释性放在最前面和中心的优秀文章。(如果你的兴趣不在这里,不要担心:我们还会拓展到自动泊车、棋盘游戏和其他主题——所以请继续阅读……)

  • 获得可交代的基本权利 。在 ML 的上下文中,可解释性可以有不同的含义,这取决于你所关注的产品生命周期的特定时刻。幸运的是, Aparna Dhinakaran 带来了一本既通俗易懂又全面的入门书,为进一步的学习和更深入的理解奠定了基础。
  • 围绕 XAI 重构你的思维。在花费数年时间研究可解释的人工智能之后,布莱斯·默里邀请我们少考虑算法,多考虑终端用户。为什么?正如 Bryce 在他的文章中所说,“设计的可解释性给了人工智能工程师最大的自由来开发相关的解释,以增强算法用户的能力。”
  • 学习如何用 Python 解释你的 ML 模型。对于可解释性问题的更实际的方法,看看 Khuyen Tran 关于 SHAP 和 Shapely 价值观的一步一步的可视化教程就知道了。这是一个耐心的演练,涵盖了从基本定义到详细实现的许多内容。

照片由安德鲁·尼尔Unsplash 上拍摄

如果你正在寻找其他深入的话题,本周你会有所收获——TDS 的贡献者们最近讨论了很多。

感谢您本周加入我们!如果你喜欢这些阅读推荐的主题过山车,我们希望你能考虑通过成为媒体成员来支持我们和我们的作者。

直到下一个变量,
TDS 编辑器

我们策划主题的最新内容:

入门

实践教程

深潜

思想和理论

为什么标注非结构化数据仍然很难?

原文:https://towardsdatascience.com/why-is-labeling-unstructured-data-still-hard-56b5eb4152a3?source=collection_archive---------29-----------------------

两只被标记的负鼠,图像来自像素

D 数据标记是机器学习项目生命周期中最关键的任务之一,也是目前最难管理、扩展和监控的任务之一——而且原因也不对

人工智能先驱吴恩达的使命是改变人工智能生态系统,使其更加以数据为中心。Ng 将他的研究建立在多年来收集的数据(嗯,你应该已经看到了)的基础上,这些数据是关于 ML 从业者如何提高他们的模型性能的。正如 Ng 所说,数据是改善率的最重要因素,而良好的标签是首要原因。

基于心智模型的改善率表——来源: deeplearning.ai ,图片作者

此外,将模型的成功建立在数据点的数量上,而不是数据点的质量上,会降低潜在的改进率。准确和一致的标记数据增加了我们的模型学习模式的可能性,这将有助于它成功地预测事件。

基于给定数据的改善率图表,来源: deeplearning.ai ,图片作者

标记非结构化数据的挑战是什么

知道标签是项目生命周期中的一个重要因素,为什么管理、扩展和监控仍然是一项如此艰巨的任务?在 DagsHub,我们采访了来自数百家公司的 ML 专业人士,试图弄清他们工作流程中的问题。在检查贴标阶段时,我们遇到了 5 个主要挑战:

  • 管理数据标签。
  • 批注版本控制。
  • 在整个贴标过程中进行沟通。
  • 劳动力管理。
  • 需要领域知识。

管理数据标签

绝大多数标注工具都需要将数据移动到其工作空间。如果我们有一个 DevOps 团队,他们可能会帮助我们传输或提取数据的一个版本,而在大多数情况下,我们将不得不复制它。当我们逐渐添加新的原始数据或对其进行修改时,我们还需要更新标注工具工作空间中的数据。为此,我们需要整理丢失的内容,创建一个副本并将其移动到标签工作区,这本身就是一项繁琐的任务。但是,当我们有多个互不相同的数据版本时,会发生什么呢?这将需要更多的工作来编写自动化程序,以同步存储和标记工具。

最重要的是,当将数据移动到工作区时,我们会丢失它在项目环境中的结构。它将只保留文件的名称,而不保留其在原始项目中的路径。有些工具甚至需要修改数据结构,以至于我们不得不放弃目录结构,使用平面目录。丢失或修改数据结构使得管理标注任务和控制数据版本变得更加复杂。

批注版本控制

标记是一项很难掌握的任务。它取决于各种难以预定义的参数,并且在大多数情况下,将需要多次迭代。与我们在数据科学项目中的任何实验一样,我们希望有一种方法可以轻松地修改注释、测试、分析,在某些情况下,还可以检索和重现以前的结果。然而,大多数标注工具不支持数据血统,使得迭代过程不明确,这将可能导致石器时代版本化(data_annotation1,data _ annotation-11–02–2020,data_annotation_backup 等。).

在整个贴标过程中进行沟通

贴标签是一项抽象的任务,没有一个可以轻松测试的黄金标准。例如,“使用边界框来指示负鼠的位置。”

外面有两只负鼠,图像来自像素

会导致以下任何一种结果:

两只被标记的负鼠,图片来自像素

正如吴恩达指出的,影响模型性能的最重要因素之一是数据的噪音,或者换句话说,标签的一致性。将任务的模糊性与其准确结果的重要性结合起来,可以得出这样的结论:评审过程应该是细致的。然而,大多数工具不支持评论者和贴标签者之间关于标签上下文的交流渠道。因此,许多组织在第三方平台上完成审查过程,或者更糟糕的是,在电话中完成审查过程,这使得很难随着时间的推移跟踪和管理变化。

劳动力管理

因为贴标签可能是一项繁琐而耗时的任务,许多公司试图通过使用外包解决方案或雇佣指定的内部专家团队来扩大规模。这两种选择都是有效的,可以帮助我们更快地移动,但它们确实有一些盲点。

外包贴标任务的挑战

  • 利益冲突-通常,数据标注者根据他们提供的标注数据的数量获得报酬。因此,在尽可能短的时间内标记尽可能多的数据符合他们的最大利益,不管这些数据有多嘈杂。然而,作为数据消费者,我们希望收到最好质量的数据标签,知道它如何影响模型的性能。由于很难监控贴标机的工作质量,当考虑外包任务时,这种冲突会成为一个真正的问题。
  • 高前期投资-培训数据贴标机可能是一个艰巨的旅程,特别是如果需要独特的领域知识。它需要大量的前期投资,其结果是未知的,可能实际上不值得。

雇用指定内部贴标团队的挑战

  • 缩小规模—在许多情况下,贴标签不是一项持续的任务。我们将在项目开始时投入大量精力来标记所需的数据,然后缩小规模,仅致力于改善有噪声的样本。当雇佣一个内部团队时,伸缩幅度会急剧缩小,我们必须为他们提供一致的工作。
  • 资源——雇佣和培训内部贴标团队需要大量的资源,包括财务、时间和人员。此外,它将需要我们更多的日常注意力来管理团队和控制产品的质量。

需要领域知识

许多项目需要先验知识来标记它们的数据。例如,标记 x 光胸部图像并对其进行肺炎分类将需要很少标记者具有的医学背景。因此,由于贴标机数量少、成本高或需要长时间的培训,许多项目被叫停或需要大量资金。

摘要

近年来,由于大量的数据在人工智能从业者的能力范围之内,人工智能领域迅速发展和演变。然而,以数据为中心的范式已经证明,拥有大量数据是不够的;我们需要高质量的标记数据来实现 SOTA 结果。掌握标记任务仍然是一项正在进行的工作,一旦我们能够轻松地扩展和管理它,实现这些结果将不再是一个 MI。

如果你正面临我在这里没有提到的挑战,或者你能想到什么可以帮助我们克服这些挑战,我很乐意听听!

为什么给事物命名这么难?

原文:https://towardsdatascience.com/why-is-naming-things-so-hard-a2cbee1d39c9?source=collection_archive---------42-----------------------

构建产生最佳实践的框架

Unsplash 上由heylogostechie拍摄的照片

一旦你意识到你写的代码是给人类阅读的,而不仅仅是给机器执行的,一个有趣的转变就发生了。

一个很大的变化是,编写代码显然比正确的代码优先。

阅读代码包括建立一个心智模型,知道每件事情应该做什么,以及这些事情如何相互作用。然而,最好的代码会缩短读取所有内容的时间。您不用阅读实现,而是使用变量和函数名、注释和其他线索来解决问题。

这是组块。你把事物结合在一起,并一起记住它们。举个例子,一个国际象棋的开局,像皇后的走法,就是一大块。一个forEach循环也是如此:仅仅通过名字,你就可以知道它将对数组的每个元素做些什么。

一旦你为一个forEach循环构建了一个程序块,你就不必阅读forEach的实现来理解它将做什么。这是非常强大的,因为它允许您返回到代码,而不必再次阅读所有的实现。

因此,一个好的名字就是一大块编码了重要信息的东西。

我们把信息压缩到名字里。这几乎总是有损压缩。此外,压缩的行数越多,损失就越大,因为您希望自己的名字不超过 80 个字符。

好的命名的目标是最小化这种损失。

由于这种压缩,给事物命名很困难。英语不像 C++那样精确,所以从精确的语言压缩成模糊的语言会增加损失。另一个重要原因是很难选择最重要的内容。你会注意到大多数关于命名的分歧都集中在这两个轴上:要么这个名字不适合你想做的事情(是assign还是setup还是link还是mangle?).或者名字没有抓住功能的重要部分。

我认为这是我听说过的大多数最佳实践的生成函数,因此比一个具体的指南更有价值。

生成最佳实践

让函数做一件事

当一个函数做多件事情时,它的名字需要编码更多的信息,比如link_user_to_trial_and_enable_downloads_and_set_charge_date()。这是一个很长的名字,也是丢失太多信息的一个标志:这个名字应该公开关于充电日期和允许下载的什么语义?

这些副作用很难在名字中体现出来。

保持功能小

长函数,比如做很多事情的函数,需要在名字中编码很多信息。由于名称长度是有限的,在压缩这个长名称时,您会丢失更多的信息,从而导致名称质量更差。

避免无意义的名字

因为我们编写的代码是供人类阅读的,所以不压缩任何信息的名字不会帮助我们构建程序块。这使得阅读更加困难,因为你必须向下一层抽象。您需要解析实现来理解这段代码做了什么。

避免太抽象的名字

对于任何函数来说,do_things()都是一个合适的名字,但是压缩的损失太大了——你几乎丢失了所有的信息,并且需要解析主体来弄清楚它做了什么。不太好。这几乎是一个毫无意义的名字。

保持一致

当您在整个代码库中构建类似的块时,通过分块,更容易进入另一个抽象层。例如,继续以试验管理系统为例,您将有 3 件事情要做:

  1. link_user_to_trial_agreement_given_email()
  2. enable_research_downloads_for_user()
  3. set_charge_date_for_user()

因为它们在同一个域中运行,所以你可以上升一级到setup_user_for_trial()来完成这三个任务。

扰乱最佳实践

最佳实践的生成器允许您对最佳实践不是最佳前进方式的情况进行推理。

例如,考虑到一致性,使用 camelCase 命名变量。您的整个代码库都使用 camelCase。你正在编写一个非常不标准的新函数。它做一些不适合你现有模型的神秘事情。您需要它,因为遗留集成/业务需求等。实际上,你不希望任何人在阅读时忽略它。

所以,你保持一致,并保持在骆驼的情况下?或者,你切换到 snake_case?

目标是让事情变得清晰。我将切换到 snake_case 来展示它与其他产品的不同之处,并提供一些注释来解释它所做的神秘事情。

用词精确

口语是非常不精确的。有很多歧义,双重含义,以及没有任何意义的句子。

然而,代码需要精确。正如我们在上面看到的,这是一个麻烦的来源,因为我们试图将一种精确的语言压缩成一种不精确的语言,这使得寻找正确的英语单词更加困难。

这些想法也适用于命名代码之外的东西!当你有了一个东西的名字,它突然变得清晰可辨。

考虑一下:你看到你周围的一些人测试他们是否可以做一次事情,如果失败就放弃。其他一些人不断尝试,直到他们学会如何做。第一组珍视其智力,而第二组珍视其勤奋。然后,当你听到固定与增长心态时,事情马上就明朗了。

在这里选择正确的名字也很难。随着时间的推移,每一个失去其细微差别的最佳实践都可以归因于一个没有编码必要信息的名称。人们传递了这些想法,却没有解释其中的细微差别。

或者,考虑把两个名字等同起来。“堕胎就是谋杀”——将两个不同的名字等同起来,在情感和事实之间创造了一种有趣的动态。每个名字都有不同的含义,把它们组合在一起,你就把一个名字的含义传递给了另一个。这未必是一件好事。你必须非常小心不精确语言中的等式操作符。

结论

优化清晰、易于理解的代码。读取它的成本高于执行它的成本。

要做到这一点,利用组块:写出有意义的名字,并在名字中编码尽可能多的信息。

但是,写有意义的名字是有损压缩。每一个命名准则都源于最小化这种损失。

最后,同样的想法也适用于命名现实世界中的事物。只不过,这更难,因为它是从一种不精确的语言编码到另一种不精确的语言。至少代码在执行时是明确的。

  1. 你可能会质疑这一点,正确性是第一位的,但是如果阅读起来很清楚,PR 评论会很快发现正确性错误。或者,如果没有人发现错误,然后出现问题,如果您的同事能够清楚地阅读您的代码,他们就更容易解决问题。
    脚注对脚注:这是认真对待创意的一个例子。
  2. 有时,糟糕的命名会妨碍工作,产生一个不正确的工作模式。在这里,你别无选择,只能阅读实现。
  3. 理想情况下,您应该正确地解决问题,这样就不需要这样的事情了。但是,默认情况下,这样的事情会分散在一个巨大的代码库中。

Python 为什么这么慢,如何加速

原文:https://towardsdatascience.com/why-is-python-so-slow-and-how-to-speed-it-up-485b5a84154e?source=collection_archive---------2-----------------------

看看 Python 的瓶颈在哪里

让我们看看 Python 引擎是如何工作的,这样我们就可以走得更快(图片由 Unsplash 上的凯文·布茨提供)

在这篇文章中,我们会发现 Python 并不是一门糟糕的语言,只是非常慢。它针对其构建目的进行了优化:简单的语法、可读的代码和开发人员的大量自由。然而,这些设计选择确实使 Python 代码比其他语言如 C 和 Java 慢。

理解 Python 在幕后是如何工作的将向我们展示它为什么慢的原因。一旦原因清楚了,我们就能解决它。读完这篇文章后,你会清楚地了解:

  • Python 是如何设计和工作的
  • 为什么这些设计选择会影响执行速度
  • 我们如何解决这些瓶颈,从而显著提高代码的速度

这篇文章分为三个部分。在第一部分中,我们来看看 Python 是如何设计的。然后,在B 部分中,看看这些设计选择如何以及为什么会影响速度。最后,在C 部分中,我们将学习如何解决 Python 设计中产生的瓶颈,以及如何显著提高代码速度。
走吧!

A 部分——Python 的设计

让我们从定义开始。维基百科将 Python 描述为:

Python 是一种解释型高级通用编程语言。它是动态类型化和垃圾回收的。

信不信由你,读完这篇文章后,你就会明白上面的两句话了。这个定义很好地展示了 Python 的设计。高级的、解释的、通用的、动态类型和垃圾收集的方式为开发人员减少了很多麻烦。

在接下来的部分中,我们将讨论这些设计元素,解释它对 Python 性能的意义,并以一个实际例子结束。

Python 就像一只风筝;容易使用并且不是超级快。c 就像战斗机;速度超快,但不太容易操作(图片由 ShyamUnsplash 上提供)

缓慢与等待

首先,让我们谈谈当我们说“慢”时,我们试图测量什么。你的代码可能会因为很多原因而变慢,但并不是所有原因都是 Python 的错。假设有两种类型的任务:

  1. 输入/输出任务
  2. CPU-任务

输入输出任务的例子是写一个文件,从一个 API 请求一些数据,打印一个页面;它们涉及等待。尽管它们会导致你的程序花费更多的时间来执行,但这不是 Python 的错。它只是在等待回应;更快的语言不能等待更快。这种缓慢是而不是我们在本文中试图解决的问题。正如我们稍后将看到的,我们可以线程化这些类型的任务(在本文 的 中也有描述)。

在本文中,我们解释了为什么 Python 执行 CPU 任务比其他语言慢。

动态类型与静态类型

Python 是动态类型的。在像 C、Java 或 C++这样的语言中,所有的变量都是静态类型的,这意味着你要写下像int my_var = 1;这样的变量的具体类型。在 Python 中,我们只需输入my_var = 1。然后我们甚至可以分配一个完全不同类型的新值,比如my_var = “a string"。我们将在下一章看到它是如何工作的。

尽管动态类型对于开发人员来说非常容易,但是它有一些主要的缺点,我们将在接下来的部分中看到。

编译与解释

编译代码意味着将一种语言的程序转换成另一种语言,通常是比源代码更低级的语言。当你编译一个用 C 语言写的程序时,你把源代码转换成机器码(CPU 的实际指令),然后你就可以运行你的程序了。

Python 的工作方式略有不同:

  1. 源代码不是编译成机器码,而是编译成平台无关的字节码。像机器码一样,字节码也是指令,但是它们不是由 CPU 执行,而是由解释器执行。
  2. 源代码在运行时被编译。Python 根据需要编译文件,而不是在运行程序前编译所有东西。
  3. 解释器分析字节码并将其翻译成机器码。

Python 必须编译成字节码,因为它是动态类型的。因为我们没有预先指定变量的类型,所以我们必须等待实际的值,以便在转换为机器代码之前确定我们试图做的事情实际上是否合法(比如将两个整数相加)。这就是解释器所做的事情。在静态类型的编译语言中,编译和解释发生在运行代码之前。

总之:代码会因为运行时发生的编译和解释而变慢。相比之下,静态类型的编译语言编译后只运行 CPU 指令。

用 C 语言编写的编译模块来扩展 Python 实际上是可能的。 这篇文章 这篇文章 演示了如何用 C 语言编写自己的扩展来加速代码 x100

垃圾收集和内存管理

当你在 Python 中创建一个变量时,解释器会自动在内存中挑选一个足够大的地方来存放变量值,并将它存储在那里。然后,当不再需要该变量时,内存槽再次被释放,以便其他进程可以再次使用它。

在编写 Python 的语言 C 中,这个过程根本不是自动化的。当你声明一个变量时,你需要指定它的类型,这样才能分配正确的内存量。垃圾收集也是手动的。

那么 Python 如何跟踪哪个变量要进行垃圾收集呢?对于每个对象,Python 会跟踪有多少对象引用了该对象。如果一个变量的引用计数是 0,那么我们可以断定这个变量没有被使用,它可以在内存中被释放。我们将在下一章看到这一点。

单线程与多线程

一些语言,比如 Java,允许你在多个 CPU 上并行运行代码。然而,Python 被设计成在单个 CPU 上是单线程的。确保这一点的机制被称为 GIL:全局解释器锁。GIL 确保解释器在任何给定时间只执行一个线程。

GIL 解决的问题是 Python 使用引用计数进行内存管理的方式。需要保护变量的引用计数,防止两个线程同时增加或减少计数。这可能会导致各种奇怪的内存泄漏错误(当一个对象不再需要但没有被删除时),或者更糟糕的是,错误地释放内存。在最后一种情况下,一个变量被从内存中删除,而其他变量仍然需要它。

简而言之:由于垃圾收集的设计方式,Python 不得不实现一个 GIL 来确保它在单线程上运行。尽管有办法避开 GIL,阅读 这篇文章 ,线程化或多重处理你的代码并显著加速

B 部分——引擎盖下的一瞥:实践中的 Pythons 设计

理论讲够了,让我们来看看实际行动吧!现在我们知道了 Python 是如何设计的,让我们看看它是如何工作的。我们将比较 C 和 Python 中变量的简单声明。通过这种方式,我们可以看到 Python 如何管理它的内存,以及为什么它的设计选择会导致执行时间比 c 慢。

现在我们已经完全解构了 Python,让我们把它放回一起,看看它是如何运行的(图片由 Jordan BebekUnsplash 上提供)

在 C 中声明变量

让我们从在 C 中声明一个名为 c_num 的整数开始。

*int c_num = 42;*

当我们执行这行代码时,我们的机器会执行以下操作:

  1. 在某个地址(内存中的位置)为整数分配足够的内存
  2. 将值 42 分配给上一步分配的内存位置
  3. c_num 指向该值

现在内存中有一个对象,看起来像这样:

一个名为 c_num 的整型变量的表示,值为 42(图片由作者提供)

如果我们给 c_num 分配一个新号码,我们就把这个新号码写到同一个地址; 覆盖 ,以前的值。这意味着变量是可变的。

我们给 c_num(作者图片)赋值 404

请注意,地址(或内存中的位置)没有改变。想象一下,c_num 拥有一块足够容纳一个整数的内存。您将在下一部分看到这与 Python 的工作方式不同。

在 Python 中声明变量

我们将做与前一部分完全相同的事情;声明一个整数。

*py_num = 42*

这一行代码在执行过程中触发以下步骤:

  1. 创建一个对象;给一个地址分配足够的内存
  2. 将 PyObject 的 typecode 设置为整数(由解释器决定)
  3. 将 PyObject 的值设置为 42
  4. 创建一个名字叫做 py_num
  5. py_num 指向对象
  6. 将 PyObject 的 refcount 增加 1

在引擎盖下,首先要做的是创建一个对象。这就是“Python 中的一切都是对象”这句话的含义。Python 可能有intstrfloat类型,但是在幕后,每个 Python 变量只是一个对象。这就是为什么动态类型是可能的。

注意 PyObject 是而不是Python 中的对象。它是 C 语言中的一个结构,表示所有 Python 对象。如果你对这个 PyObject 在 C 中的工作方式感兴趣,可以看看这篇文章,在这篇文章中,我们用 Python 编写了自己的 C 扩展,提高了执行速度 x100!

上述步骤在下面的内存中创建(简化的)对象:

内存中的 Python 整数(简化版)(图片由作者提供)

您会立即注意到,我们执行了更多的步骤,需要更多的内存来存储一个整数。除了类型和值之外,我们还存储 refcount 用于垃圾收集。您还会注意到,我们创建的变量 py_num 没有内存块。该内存由新创建的 py_num 指向的对象所拥有。

从技术上讲,Python 没有像 C 语言那样的变量;Python 有名字。变量拥有内存并可以被覆盖,名字是变量的指针。

那么当我们想给 py_num 赋一个不同的值时会发生什么呢?

  1. 在某个地址创建一个新的对象,分配足够的内存
  2. 将对象的类型码设置为整数
  3. 将 PyObject 的值设置为 404(新值)
  4. 指向对象的指针
  5. 将新的 PyObject 的 refcount 增加 1
  6. 将旧对象的引用计数减少 1

这些步骤会改变记忆,如下图所示:

给 py_num(作者图片)赋值后的内存

上图将展示我们没有给 py_num 赋值,而是将名称 py_num 绑定到一个新对象。这样我们也可以分配一个不同类型的值,因为每次都会创建一个新的对象。Py_num 只是指向一个不同的 PyObject。我们不像在 C 中那样覆盖,我们只是指向另一个对象。

还要注意旧对象上的 refcount 是 0;这将确保它被垃圾收集器清理掉。

C 部分——如何加快速度

在前面的部分中,我们已经深入挖掘了 Pythons 的设计,并且已经看到了实际效果。我们可以得出结论,执行速度的主要问题是:

  • 解释:由于变量的动态类型化,编译和解释发生在运行时。出于同样的原因,我们必须创建一个新的 PyObject,在内存中选择一个地址,并分配足够的内存。每次我们创建或“覆盖”一个“变量”时,我们都会创建一个新的 PyObject,并为其分配内存。
  • 单线程:垃圾收集的设计方式强制 GIL:将所有执行限制在单个 CPU 上的单线程上

是时候用这款喷气发动机加速我们的热腐了(图片由 Kaspars EglitisUnsplash 上拍摄)

那么,有了这篇文章的所有知识,我们如何补救这些问题呢?以下是一些提示:

  1. range()一样使用 Python 中的内置 C 模块
  2. I/O 任务释放 GIL,因此它们可以被线程化;您可以等待许多任务同时完成(更多信息* 这里 这里 )***
  3. 通过多重处理并行运行 CPU 任务( 更多信息 )
  4. 创建自己的 C 模块并导入 Python 你可以用比 Python 快 100 倍的编译 C 代码来扩展 Python。( 信息 )
  5. 不是有经验的 C 程序员?编写类似 Python 的代码,由 Cython 编译成 C,然后整齐地打包成 Python 包。它以 C 语言的速度提供了 Python 的可读性和简单语法( 更多信息 )

这才叫快!(图片由 SpaceXUnsplash 上拍摄)

结论

如果你还在读这篇文章,那么这篇文章的复杂性和篇幅并没有吓退你。向你致敬!我希望已经阐明了 Python 如何在幕后工作以及如何解决其瓶颈。

如果你有建议/澄清,请评论,以便我可以改进这篇文章。与此同时,请查看我的其他关于各种编程相关主题的文章,比如:

编码快乐!

—迈克

页(page 的缩写)学生:比如我正在做的事情?跟我来!

为什么重新训练 ML 模型很重要?

原文:https://towardsdatascience.com/why-is-re-training-ml-models-important-a-product-managers-perspective-91d906d1ebe0?source=collection_archive---------30-----------------------

产品经理的视角

作为产品经理,你有责任衡量你的产品的持续成功。这可能包括启动前的验证、启动时测量 A/B 测试中的提升,以及跟踪核心 KPI。如果你正在管理一个机器学习产品,你的产品的长期成功将取决于保持你的模型是最新的。在这篇文章中,我将解释为什么这是一个重要的问题,以及如何通过模型再训练来确保持续的成功。

如果你不训练你的 ML 模型,它会恶化到你再也不知道发生了什么的地步!(作者未命名的拼贴画,2020 年)

为什么您应该重新培训您的 ML 模型

ML 模型依赖于数据来“理解”特定的问题,并生成期望的输出。在大多数情况下,您的模型所依赖的数据会逐渐改变;例如,由于用户偏好的变化,也由于产品的性质而发生巨大变化;例如,由于黑色星期五这样的销售活动,或与 COVID 相关的旅行限制。由于系统中不可预见的变化,数据也可能发生变化,例如在没有预先通知的情况下,货币从美元兑换为美分的方式发生了变化。

在这篇文章中,我将使用两个你可能熟悉的例子。一个推荐歌曲的产品,一个从照片中检测植物种类的产品。我将解释这两个例子对于模型重新训练的不同之处。

你不知道你不知道什么

你应该知道你的模型是如何执行的,所以在投资模型再训练之前,确保你的 ML 系统(不仅仅是模型)有监控,使你能够看到性能是否随着时间的推移而下降。没有这些关键信息,你根本不知道你可能会遇到多大的问题——这应该是非常可怕的!👻

  • 因为大多数模型依赖于这样一个前提,即他们在训练期间看到的数据的分布与他们将来会看到的数据相同,所以监控特征漂移对于何时重新训练是一个很好的指示。
  • 监控预测漂移预测精度可能是重新训练需求的一些最佳指标,因为这些指标衡量了模型的输出如何随着时间的推移而变化和执行。
  • ML 模型并不是孤立存在的,因此从用户体验的角度来衡量模型的输出非常重要——如果您想了解更多关于这个主题的信息,我强烈推荐来自 ACM RecSys'18 会议的 Lina Weichbrot “衡量建议的运营质量”的这个非常有趣的演讲。

决定多长时间重新培训一次您的 ML 模型

一些模型可以处理看不见的值并做出很好的预测,而一些模型在这方面有很大的麻烦。如果您的数据变化非常快,您可能希望构建一个能够很好地处理未知值的模型,并比数据变化缓慢时更频繁地重新训练。这对于推荐系统来说尤其重要。

从照片中检测植物物种的应用程序可能会使用颜色和形状检测器作为区分植物的特征。因为~ 每年有 2000 种新的植物物种被发现和命名你应该确保你的系统能够识别最新的植物物种,方法是用这些植物的图像重新训练 ML 模型,并在新物种进入市场时更新你的模型。然而,如果你的产品是为研究人员设计的,它应该总是与最新的发现保持同步,以支持他们的研究。

对于有人类互动的系统,一个非常有趣的问题是行为的改变,以及理解你的模型如何处理它。我们称之为“漂移”。如前所述,行为改变可以是缓慢的、稳定的、可预测的,也可以是急剧的、意想不到的。例如,音乐品味随着人们的成长而改变,每年都有新的流派出现和流行,但有时一首歌会像病毒一样传播开来,每个人都在听它,或者又到了圣诞节,人们在世界的一些地方听圣诞颂歌;推荐音乐时,应该考虑这两种情况。

如果模型很容易更新,甚至完全更新其参数,并且与重新训练模型相关的成本很低;你可能会决定定期安排再培训,然后忘记这篇文章的其余部分。然而,当问题是一个高风险的问题,或者重新培训一个模型的成本非常高( GPT-3 重新培训可能花费 460 万美元),优化你应该重新培训的频率可以让你赚很多钱或者为你节省很多钱!

同样,您可能希望进行参数网格搜索来为您的机器学习模型找到最佳参数集,您应该对模型进行时间感知评估,以在离线评估设置中定义重新训练频率参数(我在之前的中帖的中谈到了离线评估)

  • 模型需要多少数据样本才能达到最佳性能?众所周知,对于大多数算法来说,拥有更多训练样本的投资回报会在某个点达到峰值。其他人可能需要数据。
  • 旧数据怎么处理?你可以忽略它,或者让算法给它“较低的重要性”
  • 当然,当模型已经 N 天没有被重新训练时会发生什么。

如何让你的模型保持最新?

根据您的需要,有三种主要方法可以使您的模型保持最新。

  • 轻度更新,模型被重新训练,看到新数据,可能忘记一些旧数据。
  • 当问题发生很大变化时,需要进行大量更新,因此需要再次重新计算模型参数。
  • 有时数据变化相当大,所以是时候完全重新考虑你的模型,甚至创建一个新的;想想新冠肺炎式的改变。

通过自动化来避免人为错误

当然,让某人查看监视器并手动决定何时重新训练模型会非常昂贵,并且也容易出现人为错误。您应该为您的模型投资一个自动化管道,根据一个事件(一个指标的恶化)或者定期地重新训练它。我将在以后的文章中更详细地讨论这个话题。

当再培训不够时

我们希望重新训练一个模型能够解决所有与模型性能损失相关的问题。然而,情况可能并非如此,有时事情会出错。很多时候事情会出错,并可能引发错误警报。例如,由于跟踪中断,数据的分布可能会改变。可能会出现新的特性值,因为另一个团队更改了价格格式,并且忘记告诉您。在这些情况下,重新培训可能不是解决问题的正确方法,但适当的监控将帮助您快速发现问题。

总之,在这篇博客中,我强调了一些问题,在决定如何在周围的世界发生变化时保持模型的性能之前,你应该回答这些问题,你应该监控哪些指标来自动化或标记模型重新训练的需求,以及你可以做些什么来跟上变化。

由您决定 ML 模型应如何适应变化,并考虑(1)这样做的技术复杂性,(2)与保持更新相关的成本,当然还有(3)投资回报。我强烈建议投资监控作为起点,不要去了解你的问题是否存在,而是了解问题有多大,然后继续跟进。哦,安全第一

为什么自学这么难?

原文:https://towardsdatascience.com/why-is-self-learning-so-difficult-1f2d594c3d7?source=collection_archive---------7-----------------------

以及你能做些什么来使它变得更容易

Unsplash 上的窗口拍摄

几天前,我的朋友找到我,让我帮她编辑一个她正在制作的视频。那是为了一项大学作业。

她告诉我,她的免费视频编辑服务将在两天后到期,她需要尽快完成。

我问她为什么不购买订阅,因为它只有几美元。

她的回答让我吃惊。

她说两天的期限是她尽快完成视频的动力。

否则,她会花数周时间来完成它。

我们都需要一个好的理由来完成一件事。在学校,我们必须完成作业,这样我们就不会受到惩罚。

在大学里,如果我们想通过这门课,就必须按时交作业。

在工作中,每项任务都需要在截止日期前完成。

我们做这些事情是因为我们必须这样做。因为如果不这样,我们知道后果会很可怕。

我曾经在考试的前一天在学校开夜车,在一个晚上把所有的材料都塞进去。

我那样做的唯一原因是为了取得好成绩。

如果我们没有考试或作业评分,我根本不会花那么多精力去学习这些材料。我可能整个学年都不会翻开我的课本。

我们几乎一生都在做事,因为我们不得不这样做。我们完成事情是因为我们有截止日期,我们想要好成绩。

这就是自学之路如此艰难的原因。

当你自学时,没有竞争,也没有截止日期。

保持主动完成事情的动力是很难的,因为如果你没有完成事情就不会有任何后果。

然而,如果做得好,自学可以说是最有效的学习方式之一。

可能没有老师或指导,但你只是出于兴趣在学习一些东西。你在学习你真正想理解的材料,而不是被迫在最后期限前死记硬背。

我之前的文章里也提到过,我走的是自学路线,自学编程和数据科学。

我的学习还远未完成,但我想分享一些我用来保持动力的技巧。

在这篇文章中,我会给你一些让自学更有效的建议。只要你保持专注,随着时间的推移,学习新技能并提高它们是可能的。

长期目标

安特·汉默斯米特在 Unsplash 上的照片

长期目标是你想在几年内实现的事情。可能是这样的:

  • 成为数据科学家
  • 掌握编程语言
  • 成为机器学习专家

我上面列出的一切都是长期目标。它们是你踏上自学之旅的原因,也是你继续前进的主要动力来源。

然而,长期目标还有几年的时间。它们太大了。如果你不正确地分解它们,你可能永远也到不了那里。

短期目标

este 扬森斯Unsplash 上拍摄

我喜欢把长期目标分成短期目标(大约 2-5 个月)。例如,如果我的长期目标是真正精通一门编程语言,那么我的短期目标就是用这门语言完成一个项目。

以下是短期目标的样子:

  • 在 Python 中创建疾病分类的端到端机器学习模型,并在仪表板上可视化该模型。
  • 读完一本关于情感分析的教科书
  • 完成统计学课程,为数据科学打下良好的基础

所有这些都是短期目标。它们是将你的短期目标分解成更小的任务。

当做一个像上面这样的项目时,你会对数据科学的不同领域有更好的理解。学完本课程后,您将会对 Python 有更好的了解,并理解数据可视化工具。

短期目标和长期目标是相辅相成的,你可以把短期目标看作是朝着长期目标努力的一种方式。

衡量进展

照片由 Isaac SmithUnsplash 上拍摄

你需要一种方法来记录你的长期和短期目标。我建议把你的短期目标分成每周任务,这样你的工作就可以平均分配了。

为了衡量进展,我建议使用以下一项(或全部):

  • 待办事项应用
  • 保留一份清单
  • 愿景板
  • 时间表

你可以使用待办事项列表或清单来确保在截止日期前完成每一项任务。愿景板通常用于长期目标。你可以在你的墙上贴一个愿景板,这样你每天早上醒来都可以看着它。

时间表对你从起床开始计划一天中的每一件事很有用。

埃隆·马斯克通常会提前计划好自己的一天。

从早上醒来到晚上睡觉,所有他想完成的任务都是前一天计划好的。

这是我强烈建议你尝试的事情。你不需要浪费任何时间来决定下一步做什么。相反,你可以专注于手头的任务。

激情和纪律

伊恩·施耐德在 Unsplash 上拍摄的照片

麻省理工学院人工智能研究员莱克斯·弗里德曼(Lex Fridman)表示,激情和纪律是相辅相成的。

我们通常出于激情开始做事,比如学习如何编码,或者构建新的东西。

虽然激情帮助你开始,但它有时会消失。

有时,你可能会在早上醒来时感到没有动力,对继续下去完全没有兴趣。可能有时候你会觉得你几乎什么都没学到,而且你不想继续下去。

正是在这些时候——激情让我们失望的时候,纪律成了我们的救命恩人。

你需要有纪律来制定一个每日时间表(例如:每天学习五个小时)。

即使你不喜欢,你也需要遵守时间表。

纪律会带你走过困难的部分,确保你坚持你开始做的事情,即使激情让你失望。

持续对学习某样东西充满热情是不可能的。当处理一个特别困难的问题时,很容易放弃,不想再看它。很容易变得消极。

如果你正在做大学作业,或者准备考试,你会坚持通过困难的部分,因为你不得不这样做。你必须这样做,否则你可能会失败。

自学的时候,放弃是没有后果的。然而,度过这些困难的部分也同样重要。做到这一点的唯一方法是自律,并对自己负责。

培养一种习惯

上学时,我总是在考试前一周开始学习。那时,这些材料一直萦绕在我的脑海中,我不会忘记。

然而,我花了一些时间才意识到,学习一个新概念和为考试而学习是完全不同的两回事。

如果你的目标是学习如何编码,或者学习数据科学,你需要养成学习的习惯。

你应该每天都这样做,至少要坚持几年,直到你达到一个能力水平,让它成为你的第二天性。

每天花一分钟做一件事比每年花一整天做一件事要好。

如果你想学习如何编程,但有一份全职工作,那么你可能会在周末花时间学习。

我的建议是,下班后多花一个小时编程。

如果你不能花整整一个小时,试着做 20 分钟。

这可能看起来不多,但它会帮助你培养每天编程的习惯。

一旦你发现自己养成了这个习惯,20 分钟可能会变得更长,编程会慢慢开始成为你的第二天性。

最小化所有干扰

照片由 Unsplash 上的 dole777 拍摄

学习桌上不能有手机。

每次我的手机带在身边,我都会有每十分钟连续查看我所有社交媒体账户的冲动。

你的手机是你最大的干扰,不同的人采取不同的方法来处理这个问题。

有些人根本不使用社交媒体,因为它容易上瘾,而且耗费时间。其他人对他们每天的屏幕时间设置了限制,不要超过这个限制。

就我而言,我更喜欢在学习时不带手机。

学习或工作时需要相当长的时间来获得动力,但当出现干扰时,很容易分心。

如果你计划学习五个小时,那么在整个五个小时里最好不要把手机放在房间里。您也可以将手机保持在“请勿打扰”状态,或将您的帐户状态设置为“忙碌”,这样您就不会在这段时间收到电话或信息。

做你感兴趣的事情

照片由珍·西奥多Unsplash 拍摄

不断地从教科书中学习材料并试图理解新概念可能是困难的。

连续几个月做相同的 Coursera 专业可能会变得枯燥乏味,你可能会开始变得不感兴趣。

在我的学习中,我总是加入一些我感兴趣的东西,这给了我继续学习的理由。

如果我开始研究神经网络背后的基本概念,我会给自己一个令人兴奋的目标,比如

  • 创建一个 GAN(生成对抗网络)来生成真实的名人面孔,并让人们猜猜他们认为是谁

当学习变得无聊时,这些小的、令人兴奋的目标会让我坚持下去。我知道一旦我完成了,我将能够从我学到的概念中获得乐趣,并用它来建造一些很酷的东西。

我喜欢把这看作是基于奖励的学习。每次我学到新的东西,我都会从中获得一个有趣的项目。

独自开始一件新的事情并坚持下去会很困难,尤其是当事情变得困难的时候。

然而,如果你每天朝着你的目标努力,并有纪律来带领你度过困难时期,你将能够轻松掌握新技能。

真正擅长数据科学和编程等领域需要时间和努力。如果你愿意自己投入时间和努力,没有最后期限或外部动机,你将能够走得很远。

我是一个努力学习的普通人。没有奇迹般的人。碰巧他们对这个东西感兴趣,他们学习所有这些东西,但他们只是人。—理查德·费曼

为什么斐波纳契数列的封闭形式没有在竞技编程中使用?

原文:https://towardsdatascience.com/why-is-the-closed-form-of-the-fibonacci-sequence-not-used-in-competitive-programming-674b805da341?source=collection_archive---------3-----------------------

著名的斐波那契数列具有这样的性质:每一项都是前两项之和。我们从基本情况的 f(0)=0,f(1)=1 开始。然后, f(2) 成为前两项之和:f(2)= f(1)+f(0)= 1;f(3)=f(2)+f(1)=2 以此类推。总的来说,我们得到:

等式(1):定义斐波那契数列的中心递归。

以下是该系列中的前几个术语:

0,1,1,2,3,5,8,13,21,34,55,89,144,…

编写一个程序来计算第 n 个项可能是最简单的动态规划问题,也是技术面试中的主要问题。它在 Leetcode 上被标记为 easy(这增加了你在数据科学面试中遇到它的机会)。标准的动态编程解决方案是 O(n)时间。通过一些数学,我们也可以得到一个封闭的表达式(这涉及到黄金分割比例、 ϕ )。这个问题也出现在需要非常大的斐波那契数的竞争性编程中。你会认为封闭形式的解决方案及其所有的优点是自然的选择。但是人们倾向于接受第三种选择,这种选择不那么优雅。为什么会这样?如果你想跳过细节,只要浏览到最后一节(5)就知道了。

1 简单的技术面试问题

解决这个问题最简单的方法可能就是递归。我将在下面添加 Python 代码,你应该能够理解,因为它非常类似于伪代码。

斐波纳契的简单递归实现。

一个简单的递归函数。这个函数的运行时间随着 n 以一种被计算机科学家讨厌的方式指数增长。这是因为对该函数的每个调用都会产生两个额外的调用。

调用堆栈可以在树中可视化。我计划在图 1 中画出 f(10)的整个树,但是我的手累了,空间不够了,所以没有完成就放弃了,进一步强调了这一点。树的高度是 O(n ),我们每向下一层,树叶的数量就会增加一倍。所以,我们大概翻了 n 倍,使得时间复杂度为~O(2^n).

图 1:来自简单递归算法的 f(10)的调用栈,可视化为一棵树。

您将看到调用堆栈中有许多值被反复计算(您计算了多少个 4)。如果我们将第 I 个斐波那契数存储在一个数组中,我们可以在计算后从那里读取它,不需要每次都分支整个调用树。这将使得时间复杂度为 O(n)而不是指数,并且由于所需的存储(存储所有 n 个数)而增加了空间复杂度 O(n)。但是仔细想想,在计算任何特定的数字时,我们只需要前两个数字。因此,我们甚至不需要存储整个数组,只需要存储任意给定时间的前两个元素。这导致了以下的锐化版本,即 O(n)时间和 O(1)空间(仅存储前两个元素)。

但是我们可以做得更好。

2 具有生成函数的封闭形式

我最喜欢的获得递归的封闭形式的方法是使用母函数。参见第 2.2 节此处的相同技术的应用,以计算从循环开始的二分搜索法树的数量。

对于自然数 n 上的任意序列 f(n) ,生成函数定义为(求和从 0 到∞):

等式(2)斐波纳契数列的生成函数。

接下来,我们插入已知为真的递归关系。我们将求和中的前两项分开,以避免处理 f(-1)f(-2)。这个避免碰到 f(-1)f(-2) 的简单小技巧,是我很久以后回过头来想重新推导的时候一直忘记的东西。

等式(3)斐波纳契数列的母函数的表达式。

如果您不能立即看到这一点,请不要担心,但是请注意几何级数, 1/(1-a) = a+a +a +… 上面的表达式告诉我们,第 n 个斐波那契数(它是表达式中 z^n 的系数)是我们仅使用 1 和 2 得到 n 的不同方式的数量。很明显,该序列将满足签名递归(等式(1))。 因为要用这种方法得到 n \(你可以先得到( *n-2)\)* 并添加一张 2 美元的钞票或者得到 (n-1)$ 并添加一张 1 美元的钞票。

但是我们现在如何得到 f(n) ?首先,你找到分母的两个根(它是一个二次多项式,所以有两个根),ϕ和ψ,其中ϕ是黄金分割比:

ψ = 1-ϕ.因此,等式(3)中的表达式可以等价地写成:

简化生成函数

我忽略了上面方程式中的许多细节。本页有更详细的演练。但是从这里开始,斐波纳契数列的封闭形式就在眼前了,因为 f(n) 只是 z^nF(z)中的系数。

等式(4):斐波那契数列的封闭形式

3 快速取幂

注意 ϕ > 1 的大小,而 ψ < 1 的大小。所以当 n 变大时,我们可以忽略 ψ^n 项,因为它会迅速变小。但是我们还是要把 ϕ 提升到 n 次方(用它自己乘以 n-1 倍)。这是否意味着我们没有从第 1 节的动态编程解决方案中获得任何好处(运行时间仍然是 O(n))。不完全是,因为有一个计算指数的有效算法。我们要找 ϕ^n. 如果 n 是偶数,我们可以说:

现在 ϕ^(n/2) 可以计算一次,然后与自身相乘。这将使我们的计算成为 (n/2+1) 而不是( n-1) 。但是我们也可以对【ϕ^(n/2】项做同样的事情,一路递归下去。使用这种分治算法,所需的乘法次数将从 O(n)减少到 O(log n)。

关于这一点的维基百科文章强调了一般的洞察力:

因此,我们现在有了一个优雅的封闭形式的表达式,可以在 O(log n)时间内计算。但是当寻找大的斐波那契数的问题出现在竞争性编程中时,人们就忽略了它。为什么会这样呢?

4 使用矩阵

首先,让我们来看一个策略,即在竞争性编程中用于寻找大的斐波那契数。我们可以将等式(1)中的递归写成方程组:

然后,我们可以用矩阵形式表示这些方程:

继续延伸到 f(0)f(1) ,我们将得到:

等式(5)作为矩阵的斐波那契数

现在,第 2 节中的快速取幂技巧对矩阵和标量同样有效。这样,我们可以在 O(log n)时间内完成 A^n 的取幂运算,而不是 O(n)时间。然后在此基础上进行 O(1)次运算,得到 f(n) 。对于斐波那契数的这种想法的实现,见这里

即使在复杂性方面,这种涉及矩阵快速取幂的方法与封闭形式的解决方案相同,但它涉及的乘法比封闭形式多得多,因为每次 A 与其自身的乘法需要八次乘法,而不是当我们提高 ϕ^n 时的一次乘法。那么为什么它比封闭形式更受欢迎呢?

5 数值考虑

等式(4)中的封闭形式包括多次将无理数 ϕ 与自身相乘。ϕ是无理数,不能完全用计算机用来存储实数的浮点数来表达;只是近似的(十进制展开永远继续,我们必须在某处停止)。随着我们将ϕ提升到一个更大的幂,这种精度损失的重要性也在增加。这导致产生的 ϕ^n 在很大程度上关闭。 n 变得越大,由于精度损失导致的误差越大。事实证明,当 n 超过 100 时,这种因精度损失而产生的误差就成了一个真正的问题,我们开始得到明显偏离的结果。

另一方面,对于等式(5)的矩阵表达式,矩阵中的所有元素都是整数。所以,我们最后做的所有乘法都不会离开整数域。因此我们永远不会失去精度。因此,尽管等式(5)需要的乘法次数是等式(4)的八倍以上,但我们为了数值精度付出了这一代价,最终仍然得到了 O(log n)算法。

除了将浮点数(尤其是无理数)提升到大指数,数值分析中的另一大禁忌是减去两个大数。乍一看,这可能是等式(4)中的一个危险。然而,第二个 ψ^n 项实际上非常小,因为 |ψ| < 1 实际上可以忽略。因此,在这一特定案例中,这不是一个问题。

顺便说一句,方程(5)中的矩阵 A 可以进行特征分解,乘法甚至可以更有效地完成(详见维基百科文章的“矩阵形式”)。但是,唉,本征分解将再次给我们 ϕψ 项,我们将回到数值不稳定性的问题。事实上,我们也可以通过特征分解方法从方程(4)中获得闭合形式(参见维基百科文章)。事实上,如果矩阵 A 的任何元素都只有一个浮点数,那么在大多数情况下而不是进行特征分解并对其执行快速取幂运算是没有意义的(参见本文 stackoverflow 帖子)。


如果你喜欢这个故事,成为推荐会员:)

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

为什么训练数据是 NLP 的瓶颈?多语言 BERT 示例。

原文:https://towardsdatascience.com/why-is-training-data-the-bottleneck-for-nlp-a-multilingual-bert-example-44b86c11f5a?source=collection_archive---------51-----------------------

迁移学习已经改变了自然语言处理领域的范式,但它在更广泛的应用方面的鲁棒性仍然有限。

当你看到那些“人工智能(AI)将对人类构成危险”的讨论时,这些讨论如今无处不在,你是否也问过“为什么会这样”?根据谷歌的VP 之一,当你向一个最复杂的语言模型(LM)问‘内布拉斯加州以南是什么州’时,它的答案是‘南内布拉斯加州’。那么,这种水平的艺术真的会比我们所知的宇宙中最聪明的物种,即智人,更聪明吗?好吧,我们已经从青铜时代走到了现在,所以答案可能是“是”,指的是未来的某个时间。然而,有这么多的箍,我们需要跳过,以提高目前的人工智能能力。

我不得不承认,当我第一次读到迁移学习时,我真的很激动。我认为,当有人看到 ImageNet 和 BERT 等模型,并阅读一些关于这些模型的“炒作”文章时,他们可以认为我们实际上已经非常接近电影“她”这样的东西。然后,当我开始在企业环境中作为数据科学家工作,并接触到医疗保健行业的一些关键业务问题时,我意识到现实世界的应用程序涉及一些不同于标准任务的问题,如 SOTA 或胶水。我见过不同迁移学习包、初创公司和潜在供应商公司报告的不同任务的+95%准确率值,当我在一些不同的数据集上应用他们的模型时,所有这些花哨的模型都在某个角度和/或某个级别上失败了。所以这幅图对我来说更清晰了,我从自然语言处理领域的迁移学习中得出了一个更实际的结论;大多数这些迷人的人工智能结果只在非常特定的测试集上有效,这些测试集可能是在训练集附近精心选择的。因此,在一个语言学相关的例子中(我的知识主要是自然语言处理(NLP),我对计算机视觉不是很熟悉,所以我将继续只给出这个领域的例子),人们可以认为 AI 并不真正理解人类语言,因为它已经在一些来源中得到推广,例如一些新闻文章,作为一个例子,它只理解它以前看到的语料库的某些方面,并试图将其理解推断到一个新的数据点。这个论点对你们中的一些人来说可能听起来是多余的,因为我们不应该等待人工智能对一些与训练集非常不同的数据给出神奇的答案。我当然同意这一点,但如果我们想向更广泛和实际的人工智能应用进军,并在迁移学习方面作为一个社区表现出色,我们最好有一个坚实的路线图,也有这个目标的坚实问题。

马库斯·斯皮斯克在 Unsplash 上的照片

随着迁移学习应用的激增,训练数据的关键性,尤其是在自然语言处理领域,已经成为近几个月的热门话题。你也可以通过观察市场上越来越多的众包或数据标签创业公司来把握这一趋势。在 ACL 2020 上发表的最近的一篇论文中阐述了一个非常有趣的解决这个障碍的方法,我发现这是一个非常不同的观点。虽然这项研究可以被认为是对科学哲学和一些严格定义的术语(如语言学范围内的“意义”、“形式”和“交际意图”)的巨大关注,但它提出了一个非常清晰的结论:在 BERTology 论文中有证据表明,大规模的 LMs 可以学习语言形式结构的各个方面,并利用训练数据中的人工产物,但他们不理解人类如何交流,或者他们不记得事实知识或理解文章中指出的问题背后的意图。关于这种说法的一些快速失败的例子(用 GPT2 生成)可能会在另一个有趣的博客中找到,作者在博客中提出了一种叫做“心智模型”的想法,这种想法有点模仿人脑在迁移学习协议中消化语言的方式。这个想法基于这样一个事实,即我们可以根据非常不同的因素赋予句子和短语非常不同的含义。让我们来看看这个非常随意的句子,例如:“…迈克尔·乔丹现在如果他得到布莱顿·拉塞尔对拜伦·拉塞尔的快速交叉传球,迈克尔停了下来,把球埋了起来…”。我假设铃声已经响起,让一些人想起了 1998 年的 NBA 总决赛,即使你没有共鸣,“Bryon Russel”和“Micheal Jordan”,“cross-over”和“shot”一起可能会告诉你,这句话实际上是在描述一个发生在过去的事件,在一个挤满了数千人的体育场里,在犹他州或芝加哥。尽管迁移学习模型通过从不同角度查看整个句子的每个单词和模式,对语义有一定程度的理解,但它们不知道这些显而易见的(对人类而言)细节和联系,这就是为什么“心智模型”提供了一些初步的障碍解决方案。不过,我希望在另一篇文章中讨论这个新想法。

另一个非常有趣的概念叫做“压力测试”,在这篇文章中已经讨论过,其思想是除了标准验证和测试集之外,对模型进行更广泛的测试。我知道这听起来很荒谬,但是我个人很喜欢能够从现实世界的应用角度来评估模型的想法。我认为,如果我们有一份关于每种迁移学习模式的详细的真实世界效果报告,那就太好了。这个想法听起来非常数据饥饿,但只是一个想法,我将在本文中尝试运行一种压力测试,希望它会很有趣。

我喜欢通过相对简单和容易理解的模型来讨论不同的想法、观点和人工智能的潜在未来影响,但这可能是足够多的介绍,所以让我们开始讨论模型。M 迄今为止,我的观点是展示和讨论训练集的重要性,以及这一基础组件的各个方面如何在当前迁移学习研究和潜在的更广泛应用之间引入差距。在我阅读并思考了上述问题后,我想在一些 LM 上做一个非常快速、突出的压力测试(感谢 mighty HuggingFace,如果只有 Tensorflow 或 PyTorch,生活会更加耗时),以确定同一 LM 架构的不同训练集的效果。我在这篇文章中试图演示的是对一些基于 BERT 的屏蔽语言模型(MLM)之间的差异的直观解释,这是不同语言的微调集之间的差异的结果。我的希望是通过探索不同的语言 LMs 来巩固训练集的效果。

因为我需要在不同的训练集上训练的 BERT 模型的数量,所以我考虑了不同的语言。我的目标是用一些主观问题对这些不同的 LM(不同的语言)进行压力测试,同时利用非常易于使用的 transformer 管道。BERT 已经在各种不同的任务上进行了微调,包括但不限于掩码标记预测、文本分类、命名实体识别以及问题回答;然而,由于问题抽取需要上下文输入,我决定对 MLM 采用类似的过程。因此,我通过屏蔽其中一个标记(理想地将主观性引入到句子中的标记)生成了 15 个相对较短的句子,并将所有这些屏蔽的句子分别输入到经过英语、德语、法语和土耳其语训练的基于 BERT 的 MLM 中。我相信展示代码将是描述这个工作流的最好方式,所以我将通过展示包和句子来深入研究:

正如你可能看到的,我试图指定或多或少主观的或正在进行的辩论问题(以上大部分,如果不是全部),可以用一个词来回答。想法是观察不同的 LM(在不同的语言学语言上训练)将如何预测这些记号。我最初的期望之一是,我是否能看到任何文化、习惯或社会相关的差异,这些差异通过训练语料库反映到模型输出中。因为这将是训练集如何影响迁移学习预测的一个显著的例子。我不能 100%确定我是否做到了这一点,但我希望你能做出决定并让我知道!

我只把变形金刚用于迁移学习部分,而 google-translator 只用于将预测的单词翻译成英语。第一次翻译是用变形金刚管道在句子层面完成的,除了我的母语土耳其语,手动翻译对我来说更容易。这里一个重要的警告是,我和我的前同事和朋友 Emir Kocer 和 Umut Soysal 一起运行了德语和法语翻译,并试图最小化翻译引起的对屏蔽令牌的错误预测。

下一步是将这些句子输入到各自的 MLM 中,提取屏蔽的标记预测并将其转换为英语,以便我们可以更容易和全面地评估结果。由于这最后一个翻译阶段是在单词级别,我使用了谷歌翻译。你知道,有时你只是想测试一个新的软件包,即使它做同样的工作…

朋友们,是时候拿起你们的零食了,如果你们想吃的话,我们就要看有趣的部分了。我不能说结果看起来是开创性的,但相当有争议,我很喜欢进一步的集思广益和建设性的批评。这是结果和我的观察,试图围绕这张看起来很奇怪的桌子形成一个故事。由于这篇博客已经比我预期的要长,我只涉及一些数据点。我没有忘记,这是的完整代码

“here”标记只以法语出现在第 0 行的食物上,这似乎非常有趣,我找不到快速突出显示数据,所以我无法在这里进行数据驱动(真可耻),但甚至有一个 quora 问题:“为什么法国人认为他们有地球上最好的美食?”。

对于德国,假设‘意大利’token 在这句话的范围内指的是意大利菜,根据这次调查,我发现意大利菜在德国比德国菜更受欢迎。你认为社会中的这些趋势会投射到迁移学习上吗?或许,或许,或许…

根据统计数据,我对英语中“巧克力”的唯一解释是美国在零食消费中占主导地位,但这可能是一种微弱的关系,所以我实际上只是大声说出这一点…

对于第一行的度假句子,英语、法语和土耳其语中都出现了“这里”这个词,根据世界旅游晴雨表,这些国家是世界上最受欢迎的 6 个地方中的 3 个。因此,另一条线索表明,这些国家的一些特征差异可能已经从训练语料转移到了模型预测中。

土耳其的伯特在第二排预测了“医生”的标记,这立刻引起了我的共鸣,因为我的经验也告诉我,在这个国家对医生职业有多么痴迷。我不是随口说的,也不是因为我在土耳其长大,这是一项调查。

对于第 9 行的宗教相关句子,“坏的”和“危险的”标记仅在德语和法语中输出,这两个国家在宗教重要性排名中远远低于美国和土耳其。另一个潜在的信息流可能通过训练数据和迁移学习从社会心态流向机器学习预测。

在这个结果数据框架中仍然有很多东西需要解开,还有一些我现在还无法解释的非常奇怪的预测。例如,黄色不仅在土耳其语中是最令人愉快的颜色,Iphone 也仅在德语中被预测为最佳智能手机,尽管英国人伯特似乎对冷战的获胜者非常有信心,美国不是其预测的最强大的国家,只有法国人 LM 对大麻有强烈的仇恨。当然,更不用说可能由于语法或翻译错误而对屏蔽标记进行的一些停用词预测了。

我相信,我们也可以通过比较不同语言的语料库来讨论这些结果的数据偏差,事实上,训练数据中的偏差是另一个要讨论的大主题,但我不会超出这一点,我只是想现在向你们介绍这一相关的观点(不确定我是否会在另一个博客中提到这一点,也许…)。

你可能会提出与我这里不同的解释,请记住,我也希望听到更多。所以让我总结一下最终让这架飞机着陆的一些要点:

  • NLP 是人工智能的一个快速发展的领域,最近有了显著的改进,支持研究和企业级别的不同应用。然而,对于现有技术的大量夸大,忽略了训练语料选择的重要性、依赖性和后果。
  • 对于有监督的 NLP 工作的训练语料库方面,如压力测试,有不同的想法和讨论,本文背后的动机是在相同的迁移学习架构上应用一种非常短的压力测试,以识别训练数据导致的预测差异。
  • 我想展示一个引人注目的迁移学习的例子,重点是由于训练集的差异而产生的差异。通过输入不同的主观掩蔽句,选择并测试了不同语言的 LMs。
  • 不同语言对同一句子的标记预测存在很大差异。我已经为这些差异找到了一些补充数据,但并不是全部,希望本文中提供的数据能够引发您的思考,得出这样一个结论:训练数据限制了迁移学习模型在广泛应用中的有效性和正确性

正如我常说的,请随时在 Linkedin 上与我联系,进一步讨论这篇文章,反馈是我们成长的关键。

https://www.linkedin.com/in/tolga-akiner/

为什么选择 Python 或 R 进行数据分析并不重要

原文:https://towardsdatascience.com/why-it-does-matter-to-choose-python-or-r-for-data-analysis-c251ba2aa6c8?source=collection_archive---------9-----------------------

比较实践指南

哈维尔·阿莱格·巴罗斯在 Unsplash 上的照片

Python 和 R 是数据科学生态系统中的主流编程语言。两者都提供了各种库来执行有效的数据争论和分析。

有抱负的数据科学家或分析师面临的最常见问题之一是选择哪种编程语言来学习数据科学。

有许多文章从不同的角度比较了 Python 和 R。这篇文章也是一个对比。然而,重点或目标不是宣布一个优于另一个。

我在本文中想要展示的是强调 Python 和 R 库都能够进行有效的数据争论和分析。我将介绍几个使用 Python 和 r 完成相同操作的例子。

我们将使用的库是 Python 的 Pandas 和 r 的“data.table”和“stringr”。我们将使用 Kaggle 上的网飞数据集来做示例。我们从导入库和读取数据集开始。

# Pandas
import pandas as pd
netflix = pd.read_csv("/content/netflix_titles.csv") # data.table
library(data.table)
netflix <- fread("Downloads/netflix_titles.csv")

该数据集包含 7787 种图书的详细信息。以下是功能列表(即列)。

['show_id', 'type', 'title', 'director', 'cast', 'country', 'date_added', 'release_year', 'rating', 'duration', 'listed_in', 'description']

标题可以是电影或电视节目。我们先来看看每个类别的标题数量。在 Pandas 中,我们可以使用 groupby 或 value_counts 函数。

netflix['type'].value_counts()
Movie      5377 
TV Show    2410 netflix.groupby('type').agg(number_of_titles = ('show_id','count')) number_of_titles
type    
Movie                5377
TV Show              2410

在 data.table 中,我们可以按如下方式完成这项任务:

netflix[, .(number_of_titles = .N), by=type] type number_of_titles
1: TV Show             2410
2:   Movie             5377

by 参数的作用类似于 Pandas 的 groupby 函数。N 计算每个类别中的行数。

我们可能想计算网飞电影的平均长度。持续时间列的当前格式不适于计算。它包含数量和单位:

netflix.duration[:5] # Pandas
0    4 Seasons 
1       93 min 
2       78 min 
3       80 min 
4      123 min

我们将创建两个新列,分别包括持续时间数量和单位。

# Pandas
netflix['duration_qty']=netflix.duration.str.split(" ").str.get(0).astype('int')netflix['duration_unit']=netflix.duration.str.split(" ").str.get(1)# stringr and data.table
netflix[, duration_qty := as.numeric(str_split_fixed(netflix$duration, " ", 2)[,1])]netflix[, duration_unit := str_split_fixed(netflix$duration, " ", 2)[,2]]

我们所做的基本相同,但语法不同。我们在空格字符处拆分 duration 列,然后使用第一部分作为数量,第二部分作为单位。

数量部分需要转换为数字数据类型。在熊猫中,我们使用 astype 函数。同样的操作可以用 r 中的“as.numeric”函数来完成。

让我们看看派生列和原始列。

# data.table
head(netflix[, c("duration", "duration_qty", "duration_unit")]) 

(图片由作者提供)

我们现在可以用分钟来计算电影的平均长度。

# Pandas
netflix[netflix['type'] == 'Movie']['duration_qty'].mean()
99.30798# data.table
netflix[type == "Movie", mean(duration_qty)]
99.30798

电影平均时长 100 分钟左右。我认为电影长度在不同的国家变化很大。我想看看平均电影长度排名前五的国家。

# data.table
netflix[type == 'Movie', .(avg_length = mean(duration_qty)), by='country'][order(avg_length, decreasing = TRUE)][1:5]# Pandas
netflix[netflix['type'] == 'Movie'].groupby('country')\
.agg(avg_length = ('duration_qty', 'mean'))\
.sort_values(by='avg_length', ascending=False)[:5]

(图片由作者提供)

我们来详细说明一下语法。我们按国家对行进行分组,并在国家列中计算每个组的平均电影长度。然后我们将计算出的平均值按降序排序,选择前 5 名。

最大的 5 个值大约是 200 分钟,比 99 分钟的总平均值大得多。上面截图中显示的前 5 个值可能是极端情况。他们可能包含很少的电影,所以我们不能真正谈论一个平均值。

确认我们的怀疑的一种方法是,也添加每个类别中的电影数量,或者过滤电影数量超过一定数量的类别。

# Pandas
netflix[netflix['type'] == 'Movie'].groupby('country')\
.agg(avg_length = ('duration_qty', 'mean'), 
     qty = ('duration_qty', 'count'))\
.query('qty > 10').sort_values(by='avg_length', ascending=False)[:5] # data.table
netflix[type == 'Movie', .(avg_length = mean(duration_qty), .N), by='country'][N > 10][order(avg_length, decreasing = TRUE)][1:5]

(图片由作者提供)

我们添加了一个列来显示每一列中的电影数量。然后,在对值进行排序之前,我们根据该列过滤行。

最长的电影在巴基斯坦、印度和韩国。

结论

我们已经做了一些展示数据争论和分析的典型案例的例子。这里的要点是 Python 和 R 库都提供了完成这些任务的高效方法。

无论你选择哪种编程语言来学习数据科学,你都不会有问题。一旦你用其中一种学习或练习,习惯另一种就相对容易了。大多数任务的逻辑和实现方式非常相似。

感谢您的阅读。如果您有任何反馈,请告诉我。

为什么 Julia 代码如此难以正确记录

原文:https://towardsdatascience.com/why-julia-code-is-so-hard-to-document-properly-abccec3a42a?source=collection_archive---------33-----------------------

Julia 包没有被很好地记录的真正原因。

(src =https://pixabay.com/images/id-1149962/

介绍

虽然大多数数据科学家最喜欢使用的语言可能是 Python,或者不太可能是 R,但我最喜欢的编程语言是 Julia。Julia 语言是一种相当年轻的、实时(JIT)编译的编程语言,它的范例围绕着通用编程概念多重分派。他们不仅使用这种泛型,而且在语言的任何地方都使用它,结果非常惊人。如果你想阅读我写的关于 Julia 和该语言中的 genius multiple dispatch 用法的整篇文章,你可以在这里查看这篇文章:

几天前,我写了一篇关于我认为 Julia 作为编程语言所面临的问题的文章。正如一些人可能预料的那样,这些问题中第一个也是最重要的一个是,朱莉娅需要一个更好的生态系统来合作。最后一点是,该语言的开发者没有明确表达该语言在行业中的定位,尽管他们明确说明了该语言的发展方向。然而,这种事情背后是否有更多的隐含意义——我真的不能说,因为我不是他们团队的成员。无论如何,在这两个问题之间是我想集中讨论的一整篇文章:

文档。

另外,如果你对那篇文章感兴趣,你可以在这里单独阅读:

成因

在上面提到的文章中,我讨论了在我看来,Julia 的文档的问题是如何根源于 Documenter.jl 的。软件工程师是懒惰的,当涉及到软件工程文档时更是如此。完成开发一个包的整个任务可能会非常有压力。在软件包开发完成后,然后对其进行严格的测试,制作一些文件,选择一个许可——最后是一个发布版本……但是随后意识到您仍然必须担心文档。

幸运的是,Documenter.jl 可以用来自动化这个过程。此外,Julia Hub 网站会自动生成一致的软件包文档。不用说,这是一个非常棒的方法,但是,这是不是太简单了?让我们也记住,你必须做的是用 Julia 编写软件文档,只需调用一个 autodoc 宏。也就是说,许多主流软件包选择在文档管理器文件中编写完整的描述,这是一件好事。

也就是说,我认为这也使得文档变得如此简单,以至于很容易浏览一遍。不用说,当一个人唯一可以处理的东西是文档字符串时,这可能是有问题的,文档字符串可能很少包含示例或复杂的类型描述。不用说,在 HTML 文档中拥有比简单的自动生成的文档字符串更好的文档当然是最佳的。那个人说,做后者太容易了,我认为这已经损坏了文档。

另一件损害 Julia 文档的事情是,许多用户甚至不知道如何记录他们的软件。这是为什么呢?因为信不信由你,

文档管理器. jl,并且文档化 Julia 通常很少被文档化。

对我来说,这真是个可笑的讽刺。想象一下。

我无法记录我的包,因为我需要用来记录包的包的文档不完整然而,事实并非如此,只是没有很多全面的关于 Julia 的文章解释如何做到这一切——这肯定会令人沮丧!有些 Julia 程序员甚至不知道 Documenter.jl 的存在!

最大的原因

当我写上一篇文章的时候,我甚至没有想到 Julia software 经常没有文档记录或者文档记录很差的最大原因。直到后来,我从另一位 Julia 程序员和 fan 那里得到回复,谈到他们也遇到了许多文档方面的问题。事实上,他们写道,我是他们关于朱莉娅的最大信息来源——这也是我写朱莉娅的目的,就是不断地教授这门语言。话虽如此,我觉得自己很有成就,但也思考了为什么那些甚至没有 Documenter.jl 这样的工具的语言往往有更好的文档。我甚至研究了 C、Ruby、JavaScript、F#、Vala 等语言的其他包。

通过所有这些研究,我得出的结论是,朱莉娅很少被记录下来,而且也很难被记录下来,这是有一个非常坚实的原因的。原因深植于编程语言中,存在于编程范例本身:

多重派遣。

等等,所以多重派遣是问题所在!?虽然本文中讨论的问题都不是决定性的问题,但是很容易理解为什么多重分派会对工程师记录 Julia 代码的能力产生重大影响。

为什么多重派遣?

为了理解为什么多重分派对于文档来说是一个问题,让我们首先考虑 Julia 中多重分派的一个例子。考虑以下两种类型:

tru = "true"
fls = 0

这里我们有 fls,false,它是一个表示布尔值的整数。在上面声明的,我们有 tru,true,另一个布尔值,但是这个包含在一个字符串中。这两者需要以不同的方式处理。我们可以通过简单地将 bool 类型转换为整数 0 来处理整数。然而,如果我们试图对我们的字符串这样做,我们将得到一个方法错误。在我们进入字符串之前,让我们为这个整数写一个函数:

turn_bool(x::Int64) = Bool(x)

虽然这是一个相当简单的例子,但现在让我们来做字符串。需要使用 parse()方法将字符串解析为其各自的数据类型 bool:

turn_bool(x::String) = parse(Bool, x)

现在让我们考虑为这些函数编写一个文档字符串。

"""Turns an integer between 0:1 to a boolean type."""turn_bool(x::Int64) = Bool(x)"""Turns a string, true, false, or 1, 0, into a boolean type."""turn_bool(x::String) = parse(Bool, x)

每当我们使用。()语法,我们将按预期的顺序得到这两个,这是完美的!

?(turn_bool)

(图片由作者提供)

然而,当只有一个版本的函数是 doc-string 的,或者更常见的是,doc-string 不提供输入参数时,问题就来了。这是有问题的,因为它使得确定什么函数将对特定类型起作用变得不可能。例如,如果您研究索引 DataFrames.jl 数据帧,您最终会遇到一个使用 filter()方法的示例—这就是应该如何做的。如果你要调用 filter()方法。(),你会看到这个函数在 Base 和 DataFrames.jl 中的每一次使用都是完全没有记录的!!!从而展示了这些基本函数在整个语言中使用的根本缺陷——用户觉得没有必要记录它们的用法!

结论

我真的很高兴有一个关于朱利安软件文档的小对话。就个人而言,我必须承认我在记录我的软件方面也不是最好的。然而,我的主要软件包,车床和 OddFrames,有两个大的稳定版本即将在这里发布——这两个版本都将有很好的文档记录,并且易于理解,我可以保证!非常感谢您的阅读。我认为这些问题是可以解决的,社区只需要认同这个问题,并尝试从整体上改善它。希望作为朱利安,我们能走到一起,给这种语言它应得的包和各自的文档。祝你在 Medium 度过美好的时光!

为什么 Julia 是迭代开发的绝佳语言

原文:https://towardsdatascience.com/why-julia-is-an-awesome-language-for-iterative-development-67cea5f93c3e?source=collection_archive---------32-----------------------

意见

扔掉旧的大开发解决方案,因为这个更好

https://pixabay.com/images/id-516559/

介绍

TJulia 编程语言是一种相当新的语言,它已经在软件工程和科学计算社区掀起了一场风暴。这有很多不同的原因,因为 Julia 编程语言是可用的最快的语言之一,当然也是如此高水平的最快语言。这种语言编码像一种脚本语言,语法非常类似于 Python 或 MATLAB 的语法,同时还保持令人难以置信的速度。这是古老的格言“像 Python 一样行走,像 c 一样运行”的地方。然而,尽管 Julia 是一种编译速度相当快的语言,但这肯定不是该语言唯一的吸引力。

该语言使用多重分派作为范例。这可以用编程创造出一些你在其他地方根本找不到的非常显著的结果。多调度往往被当作语言的主干,在语言的多个方面展现着自己的美丽。多重分派极大地影响了 Julia 编程语言的一个方面是在整个 Julian 生态系统中扩展模块的能力。这很酷,因为它创建了您可以添加的包,并且您已经知道一些方法,而无需查看文档。

多重派遣—概述

为了理解多重分派如何促进一些非常棒的迭代开发,我们首先需要理解多重分派到底是什么。多重分派是 Julia 编程语言的核心,没有多重分派的 Julia 根本就不是 Julia。这个概念允许我们接受多种类型,并通过相同的函数调用传递它们。这些函数调用可以限制在一个类型的父类的任何部分,这意味着该函数的多个版本可以仅使用一个类型来调度。如果你想进一步了解我为什么如此喜欢多重分派,我最近写了一篇文章,你可能会感兴趣:

虽然在我看来,多重分派是一种很好的编程方式,而且比使用其他编程概念生成的代码结构更自然,但我认为它在 Julia 语言中真正与众不同的地方是它几乎可以在任何地方使用。通常在编程中,我们在正常的全局范围之外编写两种不同类型的东西:

  • 构造器
  • 功能

这两者如何协同工作通常由我们正在使用的语言的范例决定。在 Julia 中,这两件事都遵循完全相同的编程概念,即多重分派。这使得 Julia 成为一种非常独特的语言,因为我们既有创建类型的 dispatch,也有创建方法的 dispatch。考虑下面的例子:

mutable struct CoolKid
    cool_status::Int64
    function CoolKid(height::Int64, weight::Int64, n_friends::Int64)
        cool_status = height - weight * -n_friends
        new(cool_status)
    end
end

上面的构造函数使用 dispatch 来创建 CoolKid 类型。获取 CoolKid 类型的第一种方法是直接调用外部构造函数。外部构造函数是中间没有函数的部分。如果我们使用一个整数作为参数来调用这个函数,我们将直接得到一个 CoolKid(integer)返回。

然而,如果我们用三个都是整数的参数调用这个构造函数,我们仍然会得到相同的一致的返回,但是我们会运行函数中提供的算法。为了方便起见,使用了 new()方法。我认为这是 Julian 编程的一个非常酷的方面,因为典型的全功能编程语言不能有类型的初始化函数,使用这种形式的分派,我们可以选择最终用户是否调用这个初始化函数。

积木

那么是什么让 Julia 和它的多重分派概念对迭代开发如此重要呢?多分派范例有许多优点,但是我认为有一点被严重忽视了,那就是方法的扩展。使用多重分派,语言内部的任何方法都可以扩展到新类型。这包括来自 Julia 的基本模块的方法,以及来自 Julia 的整个生态系统中的其他模块的方法。

考虑到这一点,我们很快意识到 Julia 的生态系统可以非常有效地迭代开发。向已经存在的代码中添加内容可以像向这些方法分派新类型一样简单。考虑下面的例子,其中我分派加法运算符来处理一个字典和一对。

import Base: +
+(d::Dict, p::Pair) = push!(d, pair)

这只是一行代码,通过这一行代码,二进制加法运算符对字典和 pair 类型变得非常有用。当然,这也可以从我们自己的模块和环境中有效地用于我们自己的类型,我可能在一篇文章中详细介绍了如何做到这一点,您可以在这里查看:

这篇文章实际上是我最近写的最喜欢的文章之一,因为它真正展示了 Julia 编程语言的伟大之处。

现在,使用我们的一行分派和一行显式导入,我们实际上对这种方法有了一个全新的用途,这种方法通常对这种类型基本上是无用的:

d = Dict(:A => [5, 10, 15], :B => [10, 15, 20])
d + :C => [25, 30, 35]

结论

Julia 编程语言非常适合做很多不可思议的事情。这些概念中有很多可能更符合科学,但是我认为大多数人都同意多分派范例对软件工程来说是一个巨大的优势。它的一种应用方式是在迭代开发中。这是因为 Julia 中的大多数东西都可以建立在一个方法之上,例如 Base.push 或 Base.filter,它贯穿于整个语言,用于从多个模块中分派多种类型——我认为这非常巧妙!非常感谢您阅读我的文章,我希望它至少对展示在 Julia 中编写自己的代码并与他人的代码一起工作有所帮助。

为什么 Jupyter 笔记本没有那么差!

原文:https://towardsdatascience.com/why-jupyter-notebooks-arent-all-that-bad-d75e90d02c3a?source=collection_archive---------25-----------------------

图片由作者提供。由 Vectors MarketFreepikFlaticon 制作的图标。

入门

以及如何给它们增压。

在过去的几年里,我注意到越来越多的人不喜欢 Jupyter 笔记本,很多人说你应该从 Jupyter 转向 scripts(这里是这里是,这里是这里是,这里是这里是,这里是这里是等等)。).

事实上,使用 Jupyter 笔记本有一些缺点,但这并不意味着你应该忽略它的优势,它可以帮助你成为一名更高效的数据科学家!

Jupyter 笔记本可以补充您的工作流程

与大多数工具一样,这是一个将工具用于其预期目的的问题。当然,有一些简单的方法可以让 Jupyter 笔记本在生产中使用,但它的真正潜力在不同的领域大放异彩。

我认为你不应该将切换到脚本,而是使用 Jupyter 笔记本,一个与脚本一起使用的工具。

使用 Jupyter 笔记本和脚本可以产生协同效应

在这篇文章中,我将通过几个原因来解释为什么 Jupyter 笔记本电脑没有一些人想象的那么糟糕。在这里,我将重点介绍它的优势、用例以及在您的技术堆栈中的潜在作用。

1.它们非常适合探险

Jupyter 笔记本是一个神奇的探险工具。它允许您快速,最重要的是,交互式地浏览您的数据,创建一些可视化,并计算结果都一气呵成。

熊猫概况 这样的工具可以帮助你增加 Jupyter 笔记本作为探索工具的实用性,因为它可以快速创建数据中可以发现的内容的概览。

熊猫-侧写示例。图片由作者提供。

由于它的交互性,您可以继续深入研究数据,并创建自己的可视化效果来补充个人资料。

为 Jupyter 创造了大量的探索工具,如 【小平面】【D-Tale】bq plot。对我来说,这证明了 Jupyter 对于探索的用途。

2.它们可以用于开发代码

我听到的关于 Jupyter 的一个主要担忧是它鼓励了糟糕的编码实践。事实上,如果您不小心,Jupyter 笔记本可能会导致污染全局名称空间,难以控制源代码,并且如果您不以线性方式运行笔记本,还会出现可再现性问题。

如果使用不当,这些都是主要问题。然而,这仅仅意味着您在使用 Jupyter 笔记本时应该更加小心,并了解如何改进您的工作流程。

为了改进工作流程并防止这些问题,有一件事通常可以解决大多数问题:打包您的代码

在适当的地方以线性方式使用函数和类

如果你把你的代码打包在一个中。py 文件或者甚至是一个 pip 可安装包,你就可以把这些代码加载到你的 Jupyter 笔记本上并继续开发。

%load_ext autoreload  # Load the extension
%autoreload 2  # Autoreload all modules

允许你在执行代码前重新加载模块。把它放在你的笔记本的开头,每次你执行一个单元,所有载入的函数和类都会更新。

而且,随着 Jupyter Lab ,笔记本越来越类似于合适的 ide。

Jupyter 实验室示例。图片由作者提供。

您甚至可以使用扩展来增强您的 Jupyter 环境,如 nbdevnbdimenbviewernbstripout****,这些扩展允许更多的可再现性和更丰富的功能。

3.它们是完美的交流工具

对我来说,Jupyter 笔记本非常适合用于交流目的,如教程、演示和解释算法。用户可以使用它来隐藏代码,显示可视化,嵌入视频,交互式演示结果,等等!

例如,每当我创建一个包时,我都会确保包含一套 Jupyter 笔记本,其中包含几个关于如何使用该包的教程。这使得同事之间共享笔记本变得容易,特别是如果你已经花时间使它成为一个很好理解的文档。

您可以使用诸如https://github.com/bqplot/bqplotipyleaflet 等扩展来提高 Jupyter 笔记本的可视化能力。这些工具在扩展绘图功能方面非常出色。

我个人是VoilaFastpages 的忠实粉丝。瞧,你可以用交互式小工具渲染 Jupyter 笔记本的实时版本。Fastpages 是一个支持 Jupyter Notebook 的博客平台,可以用作文档。

4.他们的准入门槛很低

Jupyter 笔记本的准入门槛极低。它们的交互性与简单易用的界面相结合,使用户可以快速开始编程。它们使探索和可视化您的数据变得轻而易举。

这对于那些主要不是程序员,但确实需要额外执行一些分析的人,例如不同领域的科学家,特别有帮助。

正如所料,有一堆扩展可以进一步降低这个障碍!

Jupyterhub 开始,这个工具可以创建单用户 Jupyter 笔记本服务器的多个实例。在实践中,您可以向一班学生提供笔记本电脑服务器。我自己在学习期间也用过它,并且用得很开心!

与学术环境保持一致,nbgradier可以让老师轻松分配和评分 Jupyter 笔记本。

5.插件/扩展/工具可以增压 Jupyter

从上面的段落中你可能已经注意到,有大量的扩展可以改进你的 Jupyter 笔记本工作流程。

这些扩展让您可以弥补 Jupyter 笔记本的任何缺点,并将其转化为优势!

下面,我将列出我之前提到的扩展的概述,但我也会添加一些我认为可能对您有很大好处的扩展。

内核是执行笔记本中代码的计算引擎。可用的有很多,比如【R】Scalac++,甚至 GO 内核都可以在 Jupyter 内使用。

可能的 Jupyter 内核。图片由作者提供。

还可以使用https://github.com/nteract/hydrogenVscode-jupyter**分别在 Atom 和 vs code 中运行 Jupyter 笔记本。**********

小部件和可视化

使用小部件和可视化扩展可以轻松快速地可视化和浏览您的数据。pandas-profilingD-Tale是创建数据概览的绝佳工具,而ipywidgetsipyvolume使进一步扩展这些功能成为可能。************

有很多这样的扩展可以创造更好的视觉体验。几个值得注意的扩展是interactQgridLuxmpld3

发展

对于开发来说,像paper millnbdevNBD ime这样的工具允许更多的再现性和更丰富的特性。它们包括在 Jupyter 笔记本中开发包的可能性,甚至在必要时应用单元测试。

尽管 Jupyter 笔记本并不是用来创建产品级代码的,但这些扩展肯定能帮助用户实现这一点。

出版

我们可以发布类似Voilafast pages这样的扩展名的 Jupyter 笔记本来渲染 live 版本。这使得我们可以交流研究结果,同时允许同事们进行实验。********

我们甚至可以更进一步,将 Jupyter 笔记本转换成更适合您的使用案例的格式。以 nbconvert 为例,它将 Jupyter 笔记本转换成 pdf,HTML,甚至 LaTeX!

类似的扩展还有jupytextjupyter-book ,它们允许有趣的选项来发布或转换您的 jupyter 笔记本。

感谢您的阅读!

Jupyter 笔记本不仅仅是他们做得不好的事情。通过专注于他们做得好的事情,你肯定可以提高你的工作流程!

如果你和我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。

为什么在递归神经网络中“学会遗忘”

原文:https://towardsdatascience.com/why-learn-to-forget-in-recurrent-neural-networks-ddf89df3f0ab?source=collection_archive---------45-----------------------

用一个简单的例子来说明

照片由妮可·罗德里格兹Unsplash 拍摄

考虑下面的二进制分类问题。输入是任意长度的二进制序列。当且仅当输入中出现 1 但不是最近才出现 1 时,我们希望输出为 1。具体来说,最后的 n 位必须为 0。

我们也可以把这个问题写成语言识别问题。对于 n = 4,描述为正则表达式的语言是(0 or 1)*10000*

以下是案例 n = 3 的一些标记实例。

000 → 0, 101 → 0, 0100100000 → 1, 1000 → 1

为什么会出现这个看似奇怪的问题?它需要记住(I)1 出现在输入中,以及(ii)不是最近。正如我们将很快看到的,这个例子有助于解释为什么简单的递归神经网络是不够的,以及注入一个学习遗忘的机制如何有所帮助。

简单递归神经网络

让我们从一个基本的递归神经网络(RNN)开始。 x ( t )是在输入中的时间 t 到达的位,0 或 1。这个 RNN 保持一种状态 h ( t ),试图记住它是否在过去某个时候看到了 1。经过适当的转换后,输出将从该状态中读出。

更正式地说,我们有

*h*(*t*) = tanh(*a***h*(*t*-1) + *b***x*(*t*) + *c*)
*y*(*t*) = sigmoid(*d***h*(*t*))

接下来,我们考虑以下(输入序列输出序列)对,假设 n = 3。

x 10000000
y 00011111

讨论这对 RNN 的行为和学习,将有助于像通常所做的那样及时展开网络。

简单的 RNN 在时间中展开

把这想象成一个有阶段的管道。状态从左向右移动,并在过程中由某一阶段的输入进行修改。

让我们更详细地了解一下阶段内部发生的情况。考虑第三阶段。它输入状态 h 2 和下一个输入符号 x 3。 h 2 可以被认为是从 x 1 和 x 2 导出的用于预测 y 3 的特征。该框首先从这两个输入计算下一个状态 h 3。 h 3 然后被结转到下一阶段。 h 3 也决定了工作台的输出 y 3。

考虑当看到输入 1000 时会发生什么。y 4 是 1,因为 y ^4 小于 1(总是这样),所以有一些误差。遵循通过时间反向传播的学习策略,我们将通过时间使误差波动回到更新各种参数所需的程度。

考虑参数 b 。它有 4 个实例,分别连接到 x 1 到 x 4。附加到 x 2 到 x 4 的实例不会改变,因为 x 2 到 x 4 都是 0。所以这些 b 实例对 y^没有任何影响。当进行这种改变使 y^ 4 更接近 1 时,连接到 x1 的 b 的实例增加。

随着我们继续看到 x 5、 x 6、 x 7、 x 8,以及它们对应的目标 y 5、 y 6、 y 7、 y 8,同样的学习行为也会发生。 b 会一直增加。(尽管如此,因为我们需要更早地反向传播误差,以到达 x 1。)

现在想象一下 x 9 是 1。 y 9 必须为 0。然而,^9 很大。这是因为参数 b 已经得知 x i = 1 预测 y j = 1 对于j=Ib 无法强制要求 x i = 1 后面必须只跟 0,编号至少为 3。

简而言之,这个 RNN 无法捕捉到 x i = 1 的联合交互作用,并且它后面的所有位都是 0,编号至少为 3,以预测 y j。还要注意,这不是一个长期影响。 n 只有 3。因此,这个例子中 RNN 的弱点不能用时间反向传播时误差梯度的消失来解释[2]。这里还发生了别的事情。

一个学会遗忘的 RNN

现在考虑这个版本

z(*t*)    = sigmoid(*a***x*(*t*) + *b*)
*h*new(*t*) = tanh(*c***x*(*t*) +*d*)
*h*(*t*)    = (1-*z*(*t*))**h*(*t*-1) + *z*(*t*)**h*new(*t*)
*y*(*t*)    = sigmoid(*e***h*(*t*))

我们不是凭空想象出来的。它是流行的门控递归神经网络 GRU 中的一个关键方程。我们从[1]中对它的描述中得到这个方程。

这个 RNN 有一个显式的遗忘机制!它是 z ( t ),一个介于 0 和 1 之间的值,表示遗忘的程度。当 z ( t )趋近于 1 时,状态 h ( t -1)被完全遗忘。

h ( t -1)被完全遗忘的时候, h ( t )应该是什么?我们将它封装在一个表示“新状态”的显式函数 h new( t )中。 h new( t )仅来自当前输入。这是有道理的,因为如果要忘记 h ( t -1),我们面前只有新的输入 x ( t )。

更一般的是,下一个状态 h ( t )是前一个状态 h ( t -1)和一个新状态 h new( t )的混合,由 z ( t )调制。

这个 RNN 有能力在这个问题上做得更好吗?我们将通过开出一个可行的解决方案来肯定地回答这个问题。随附的解释将揭示各种神经元在使该解决方案工作中所扮演的角色。

考虑 x ( t )为 1。 y ( t )必须为零。所以我们要将 y ^( t 向 0 驱动。我们可以通过将 e 设置为一个足够大的负数(比如-1)并迫使 h ( t )接近 1 来实现这一点。获得期望的 h ( t )的一种方法是强制 z ( t )接近 1,并将 c 设置为足够大的正数,并将 d 设置为足够大的正数,使得 c + d 足够大。我们可以通过将 a 设置为足够大的正数,将 b 设置为足够大的正数,使得 a + b 足够大,从而强制 z ( t )接近 1。

这个处方的作用就好像

If *x*(*t*) is 1
   Set *h*new(*t*) to close to 1.
   Reset *h*(*t*) to *h*new(*t*)
   Drive *y*^(*t*) towards 0 by setting *e* sufficiently negative

由于 y ( t )依赖于 x 的最近过去值,因此 x ( t )为 0 的情况更复杂。让我们以下面的设定来解释一下:

Time … *t*    *t*+1     *t*+2      *t*+3
*x*    … 1     0       0        0
*y*    … 0     0       0        1
*h*new … 1 D=tanh(*d*)   D        D
*z*    … 1     ½       ½        ½
*h*    … 1  ½(1+D) ½(*h*(*t*+1)+D) ½(*h*(*t*+2)+D)*h*^   … >>0  >>0      >>0     <<0y^   … → 0  → 0      → 0     → 1

这里有很多!所以让我们一行一行地走一遍。

我们正在查看顺序处理输入 x = …1000 的最后 4 位时的情况。对应的目标是 y = …0001。我们假设 RNN 的参数已经以某种方式被选择得恰到好处(或被学习),如下所示。(当然,这些必须与我们在 x (t)为 1 时使用的设置一致。)简而言之,我们描述的是固定网络在这种情况下的行为。

现在看 h new。当 x ( t )为 1 时,我们已经讨论过 h new( t )应该趋近于 1。当 x ( t )为 0 时, h new( t )等于 tanh(CX(t)+d)= tanh(d)。我们称之为 d。

接下来看 z 。当 x ( t )为 1 时,我们已经讨论过 z ( t )应该趋近于 1。当 x ( t )为 0 时,既然要记住过去,我们就把 z ( t )设为近似值。为此,我们只需将 b 设置为 0。这可以在不忘记当 x ( t )为 1 时工作的 z ( t )的情况下实现。

对于剩余的行,让我们从最后一行开始,一步一步来。在 y ^行中,给定 y 目标,我们描述我们想要什么。假设我们已经把 e 固定在一个足够大的负数上,这就给出了我们想要的状态。我们称他们为^.

因此,现在剩下的就是展示如何制造出与^.相匹配的产品首先让我们放大这两行,同时也将 h 转换成更方便的形式

h  … 1        ½ + ½D        ¼ + ¼D + ½D          ⅛ + ⅛ D + ¼ D + ½ D
h^ … >> 0     >> 0          >> 0                 << 0

可以看出,选择 d 使得-⅓ < D < -1/7 will meet the desiderata. It's easy to find d 使得 tanh( d )在这个范围内。

案例 x ( t ) = 0 的处方可以总结为

If *x*(*t*) is 0
   Set *h*new(*t*) to be slightly negative.
   Set *h*(*t*) as average of *h*(*t*-1) and *h*new(*t*)

所以只要看到 1 后面的 0, h ( t )就一直下降。如果看到足够多的 0, h ( t )变为负值。

总结

在这篇文章中,我们讨论了有和没有显式“遗忘”机制的递归神经网络。我们在一个简单描述的预测问题的背景下讨论了这个问题,而更简单的 RNN 无法解决这个问题。具有“忘记”机制的 RNN 能够解决这个问题。

这篇文章将对那些想了解简单 RNNs 如何工作,带有遗忘机制的增强版本如何工作(特别是 GRU),以及后者如何改进前者的读者有用。

延伸阅读

  1. https://colah.github.io/posts/2015-08-Understanding-LSTMs/
  2. https://www . superdata science . com/blogs/recurrent-neural-networks-rnn-the-vanishing-gradient-problem

为什么最小二乘这么特别?

原文:https://towardsdatascience.com/why-least-squares-regression-whats-with-the-l1-norm-criterion-51e8b7f905eb?source=collection_archive---------27-----------------------

为什么没人谈‘绝对损失’?

在这个故事中,我们将解决为什么我们通常更喜欢最小化偏移的平方而不是它们的绝对值的问题,至于简短的回答,这主要是因为它更容易,它更稳定,它更强大****

回想一下,对于 OLS(普通最小二乘法),我们寻求最小化

问题是,为什么我们不把

先说我们简答的第一点。最小化前者更容易。特别是,最小化涉及平方偏移的成本函数的系数向量θ是通过一个封闭形式的表达式找到的,这也是我最近一篇文章的主题(你可以在这里查看)。)相反,对于最小化涉及绝对偏移的成本函数的系数,没有“封闭形式”。我们能做的最好的事情也许是达成一个迭代方案,它能帮助我们最终在数值上收敛到属于最佳拟合超平面的系数。

最小化前一个成本函数更容易的事实源于这样一个事实,即 y = f (x) 有一个很好的导数,即 y' = 2f(x)。f '(x)y' = |f(x)|f '(x) /f(x) 那是因为 y = |f(x)|。对于后者,绝对值在微分后保持不变,这使得求和表达式等于零(尤其是涉及求和的情况下)变得非常重要。

吉菲的扎克·加利费安纳基斯反应

我们简短回答的第二点是稳定。两个成本函数都承诺存在一个系数向量θ,该向量在全局上最小化从超平面到数据集的偏移。这是两个函数都是凸的直接结果(有自己的证明)。

问题在于,涉及绝对失调的成本函数可能有点过了,因为它实际上可以提供无限数量的不同系数向量θ,所有这些向量都可以最小化成本函数。同时,对于 OLS 方法,总是有一个唯一的系数向量θ使成本函数最小化(除非数据集非常小,在这种情况下两个问题都简化为插值)。)这两个事实是从 L1 范数的
非严格凸性和 L2 范数的严格凸性中推导出来的,两者也都有自己的证明。

如果你想看到与我们的论点一致的东西,考虑为一些随机数据集绘制两个成本函数(你可以考虑拟合类似于 y=ax 的东西来使它变得简单),然后根据你的数据集,你可能会看到类似这样的东西。

L1 vs L2 损失-作者图片。

最小值明显不同,对于平方损耗,最小值是一个唯一点,而对于 L1 损耗,最小值是无穷多个点。

我们简短回答中的最后一点是关于 L2 损失的回归比 L1 损失的回归在统计上更有说服力。让我们首先强调这样一个事实,即在某种意义上,两种选择都可能是真正最优的,特别是,如果我们假设误差(偏移)遵循正态分布,那么最小化 L2 损失与寻找最大似然估计 ( )相一致,这主要用于统计推断。)另一方面,如果我们假设误差遵循拉普拉斯分布,那么最小化 L1 损失与找到最大似然估计相符。当然,这两个事实都有自己的证明。

下图显示了两种分布的曲线图(在 2D)。红色和蓝色分别对应正态和拉普拉斯分布。

正态分布与拉普拉斯分布-作者图片。

现在的问题是,我们应该相信误差服从哪个分布,即使是近似的。答案是,这通常是正态分布,因为我们通常认为误差是独立的(不以任何方式相互影响),这使得它们随着数据集的增长而接近正态分布,这要归功于中心极限定理。事实上,你可能只听说过正态分布,因为它在现实生活中出现的频率更高。

原来如此?使用 L1 标准是没有意义的?答案肯定是没有。事实上,使用 L1 范数准则进行回归是一件真实的事情,也可以按需使用。如果你不知道,它通常也被称为最小绝对偏差(缩写为 LAD)。在一种情况下,LAD 似乎优于 OLS,特别是当数据集包含许多异常或异常值时,因为 OLS 会在尽量减少损失的同时大肆渲染这些异常或异常值,因为对它们的偏移量求平方会产生很大一部分误差,结果是一个位于实际数据集和异常值之间的超平面,如果你没有理解我在这里试图说的话,请仔细观察****

小伙子对 OLS-GIF 和作者的项目。

此处的数据集包括左侧表格中的 8 个点,黄线(yₐ)is 归因于 LAD,白线归因于 OLS。数据集不包含任何异常值,这两条线似乎是合理的。当然除了我们每次计算时,LAD 的意见略有不同(迭代格式每次从不同的初始点开始,LAD 不保证有唯一的极小值)。

现在,如果我们把点(9,6)换成(9,50)会发生什么

小伙子对 OLS-GIF 和作者的项目。

对于 LAD 线来说没什么大不了的,同时 OLS 很容易被诱惑牺牲整个数据集,只为了离群值,这证实了 LAD 比 OLS 更健壮的事实。

如果您想自己尝试一下,请访问:

**[## 最小绝对偏差

mathemati.herokuapp.com](http://mathemati.herokuapp.com/LeastAbsoluteErrors)**

希望这有助于你理解为什么我们通常选择 OLS,下次再见。

参考资料:

[1]:吉菲。https://giphy.com/gifs/reaction-BmmfETghGOPrW扎克·加利费安纳基斯反应

[2]:维基百科。最大似然估计 https://en.wikipedia.org/wiki/Maximum_likelihood_estimationT4

[3]:维基百科,最小一乘偏差https://en.wikipedia.org/wiki/Least_absolute_deviations

[4]:维基百科,正态分布https://en.wikipedia.org/wiki/Normal_distribution

为什么数据越少越好

原文:https://towardsdatascience.com/why-less-is-more-when-it-comes-to-data-8b90619fdeaf?source=collection_archive---------43-----------------------

意见

大数据可能是一种趋势,但更多并不一定更好

“少即是多”,自称英国人。德国人说,“在德国首都时代”。

说到数据的有用性,我们应该记住这些说法。在不断发展的数据驱动型经济中,这些对于成功甚至生存都至关重要。

对许多组织来说,有效利用数据是一项艰巨的任务。多年来,IT 结构已经发展成为一个复杂的系统集合。几乎不支持流程。更不用说满足信息需求了。这是许多组织无法为算法和决策提供可靠数据的重要原因。

数据管理方案旨在解决这一问题。尽管有时结果令人失望。这些项目往往归结为事后的修复,因此有可能成为一次性的。创建和维护高质量的数据需要更多的工作,而不仅仅是修补。当基础不正确时,就像装满一个满是洞的桶。

佩德罗·达·席尔瓦Unsplash 上的照片

尽管在数据管理方面取得成功很难,但在这方面还有另一个经常被忽视的因素:超过 80%的组织信息是以非结构化形式存储的。这些海量的数据堆积起来,并且还在不断增长。

这是洞察的重要来源,但对所有这些数据的控制仍然非常有限。这些数据中的大部分事实上——简单地说——是垃圾。挑战在于清除垃圾,只保留相关的数据。因为少实际上就是多。

商业领袖不能不接受这一挑战。首先,因为托管、维护和备份这些数据的成本过高,而且只会继续增长。另一个因素是因为法律法规(合规)需要删除旧数据。但到目前为止,最重要的论点是,被污染的非结构化数据会导致糟糕的决策。****

想象一下根据错误的简历雇佣某人。然后不小心给那个新员工发了一份永久合同而不是临时合同。在数据驱动的经济中,这是不可接受的。

好消息是什么?

有一个解决方案可以以可控和负责任的方式清理旧数据。利用现代技术—索引和分类技术— 删除冗余、过时和琐碎的(ROT)并识别有价值的数据。这些见解作为元数据添加进来,在曾经庞大的、难以管理的数据堆中创建结构。这些年来,我开发并测试了一个 5 级数据保留漏斗,它提供了一个行之有效的方法。在漏斗的每一层中,多一点的 ROT 数据被移除。

照片由安东Unsplash 上拍摄

应对囤积心理

组织害怕丢失有价值的数据并不罕见。克服这个问题的一个好方法是在有限的时间内以隐藏的形式存储数据。最终用户可以在宽限期内请求特定数据。如果出于适当的业务原因需要,他们可以使用这些信息。记录原因并用于丰富数据保留策略。通过数据保留漏斗的各个步骤使数据可用是很重要的,以确保数据被正确地添加了元数据。在漏斗的末端,只剩下有价值的数据。

坏消息呢?

这是艰苦的工作。毫无疑问,结构化数据清理方法有助于组织改善非结构化数据的管理,从而做出更好的决策。但是,解决这个问题的数据专家才是最重要的。清理比特和万亿字节是一项艰苦而乏味的工作。没有多少人喜欢做数码清洁女工。但是总得有人去做。我认为见证它对新机会的贡献是非常有益的。这是兑现一句流行的荷兰谚语的承诺的绝佳方式:“Opgeruimd statat netjes”

脚注

1 元数据是关于数据的数据,它提供关于特定数据对象内容的信息。例如作者、创建日期或文档类别(如简历或合同)。

为什么线性回归是你所需要的

原文:https://towardsdatascience.com/why-linear-regression-is-all-you-need-afb1304f8f8e?source=collection_archive---------11-----------------------

理解它,进入深度学习将变得不那么困难(仍然是困难,但更少)

图一。从地面真相到使用深度学习的预测。图片由作者提供。

这篇短文是为那些开始学习线性回归,并且正在进入深度学习领域的初学者写的。但是我不会在本文中深入讨论这些话题。

我的意图只是给出一个概念,为什么线性回归可以促进进入更深水域的路径。我以前写过线性回归。这里可以看,这里可以看

“哦,线性回归真的是机器学习吗?!.."

这是我的想法。

我听到人们开玩笑(或半开玩笑)说线性回归不是机器学习。我懂了。如果你决定进入这个领域来建造你的自动驾驶汽车或机器人来清理你的房子,就像电影中一样,线性回归可能会令人失望。

但是相信我,线性回归对于获得其他更复杂主题的直觉是必不可少的。而理解逻辑回归就更好了。不要因为它的简单(相对而言)而失去动力。继续学习。

权重、偏见、乐观主义者——无处不在!

这条线的公式也一样!y-hat =重量*x +偏差

我开始研究神经网络和深度学习,我很庆幸我先学会了线性回归。了解基础知识真的很有帮助。

  • 权重(线的斜率)
  • 偏差(直线的 y 截距)
  • 一个优化器预测某个值,与实际数据(地面真实值)进行比较,并计算误差(预测值与实际数据之间的距离)。然后,算法调整权重和偏差以最小化误差。

图二。各种线的旋转表示。图片由作者提供。

所有这些概念也是深度学习的一部分。同样的事情也发生在神经网络中。

简而言之,一个问题需要深度学习,因为直线可能无法覆盖,或者更好地说,很好地代表数据。一条直线不能符合下面右边的例子。

图 3。线性和非线性表示。图片由作者提供。

但核心逻辑是一样的。在神经网络中,简单地说,每个节点代表一条线。它们组合起来形成表示数据点所需的线。

图 4。从地面真相到使用深度学习的预测。图片由作者提供。

最后的想法

我读过关于节点、隐藏层、权重和偏差的内容,但我并不清楚所有这些东西是什么或做什么。得益于学习线性回归,我有了更清晰的认识。

神经网络还有更多的东西,它们的内部工作可能会变得非常复杂。

有没有尝试过跟随语言翻译器(encoder-decoder/seq2seq)或者 word2vec 算法的实现?试一试,你就知道了。

我的目标是在深度学习主题上覆盖更多内容。不同的激活功能,RNNs 到 LSTM 和 GRUs 到 seq2seq 到 seq2seq 的演变,注意变压器。用于图像识别的卷积网络等等。

暂时就这样。感谢阅读。

为什么负载测试对于将您的 ML 应用程序投入生产至关重要

原文:https://towardsdatascience.com/why-load-testing-is-essential-to-take-your-ml-app-to-production-faab0df1c4e1?source=collection_archive---------25-----------------------

行业笔记

使用 Locust 对 Flask ML 应用程序进行负载测试

图片来自 Unsplash

随着我继续在数据科学、人工智能、人工智能的世界里航行,无论你想叫它什么,我继续发现越来越多的术语,这些术语最初是我害怕涉足的。正如我在之前的一篇文章中提到的,我来自一个非技术背景的人,经常把关键的软件术语,比如“测试”藏在心底。在获得了更多构建由 ML 驱动的应用程序的经验后,我明白了一种特殊形式的测试的必要性,这种测试被称为 【负载测试】 ,也被称为性能测试。负载测试是一种模拟或测试应用程序预期流量的方式。在 Flask 服务器上抛出一个端点并期望它保持运行是很容易的,但是在现实中,顺序测试一个端点并不能显示关于端点性能的真实情况。这就是为什么我们将使用一个名为Locust的开源 Python 工具来模拟我们的端点的多个并发用户,看看它如何保持明智的性能。这种类型的测试对于理解您可能需要对您的项目/软件进行的优化所带来的变化以及关于成本节约以正确利用您正在使用的服务器是至关重要的。

在本文中,我们将构建一个基本的 ML powered Flask 应用程序,但我们不会太关注这些步骤,因为它主要是测试我们用应用程序创建的端点。

目录

  1. 构建烧瓶应用程序和 ML 模型
  2. 创建蝗虫脚本
  3. 模拟用户
  4. 整个代码和结论

构建烧瓶应用程序和 ML 模型

在我们开始负载测试之前,我们必须创建我们的模型,并在一个简单的 Flask 应用程序上进行推理。对于我们的模型,我们将使用一个回归数据集,使用随机森林模型来预测汽油消耗量。下面的代码有助于将我们的模型训练和部署成一种 Flask 可以加载和处理的推断格式。

模型结构

现在我们已经建立了模型,我们可以使用 Flask 服务器来使这个模型可用于推理。

Flask 服务器

我们的模型现在可以在我们的服务器上的/预测路径下进行推理。为了确保我们的端点正常工作,我们创建了另一个文件,并使用请求库来测试推断。在这种情况下,使用另一个工具如 Postman 也是可行的。

测试 API

要测试这个脚本,请确保您的 flask 服务器已经安装了 flask,运行并执行 API 测试脚本来查看模型结果。

API 测试结果(作者截图)

现在,我们已经有了为推理加载的模型的 API,并且我们准备好开始用 Locust 进行负载测试。如果您想了解更多关于在 Flask 上部署 ML 模型的知识,请查看这篇很棒的文章,它专门围绕这个主题。

创建蝗虫脚本

如前所述,Locust 帮助模拟同时拥有许多用户,您可以在您的 locustfile.py 中定义一个任务来执行这个模拟。任务是 locust 中的关键特性,每次我们开始负载测试时,都会为用户创建一个我们创建的类的实例,它们执行 Python 脚本中定义的任务。

导入和设置

首先,我们从 Locust 导入必要的模块,然后创建一个类,该类将包含我们用于模拟的主要功能。继承 HttpUser 使用户能够处理我们想要加载测试的 HTTP 请求,比如我们例子中的端点。

在我们班里

在执行任何 Locust 任务之前调用 On_Start,当用户停止执行任务时调用 On_Stop。现在我们创建一个任务,将模拟数据发布到我们的 API。

发布模拟数据进行模拟

我们现在已经准备好测试我们的简单的 Locust 脚本,为了学习更多关于 Locust 的知识并开始使用您自己的脚本,请查看他们的文档这里

模拟用户

随着我们所有的资源准备就绪,我们现在终于可以看到蝗虫在行动,并查看它提供的一些指标。确保您的 flask 服务器已经启动,要运行我们的 locust 文件,只需在终端中键入 locust 。如果您的 locust 脚本没有命名为 locustfile.py,确保使用 locust -f filename.py 指向它。

作者截图

您应该到达如下屏幕,对于主机,您通常应该输入您正在使用的实际 IP。点击开始,你会看到蝗虫在行动。

作者截图

RPS(作者截图)

响应时间(作者截图)

在您的终端中单击 stop 之后,您应该会看到一些通用的统计数据,您也可以将其下载为 csv 文件,以运行进一步的分析或可视化。

综合统计(作者截图)

我们看到,Locust 跟踪各种指标,如请求/秒平均吞吐量响应时间,以及端到端延迟百分点。在浏览文档时,您可以使用更高级的 Locust 功能,下载这些统计数据来运行您自己的函数或服务,以确定您的应用程序的限制,或者当您接近某个延迟或吞吐量阈值时,您不希望越过该阈值。

整个代码和结论

**https://github.com/RamVegiraju/Locust-ML

要访问该应用程序的完整代码,请查看上面的链接。Locust 是一种非常干净的方法,可以帮助您以高效而简单的方式对应用程序进行负载测试。关于负载/性能测试,还有许多其他的软件或方法,但是我只想强调负载测试在将你的应用提升到生产水平时的普遍重要性。从节约成本优化您的资源,负载测试对于了解您的端点实际上如何应对您在实时场景中预期的流量至关重要。

我希望这篇文章是对蝗虫和负载测试的一个很好的介绍。请随时在 LinkedIn 上与我联系,或者在 Medium 上关注我,了解我更多的写作内容。分享任何想法或反馈,谢谢阅读!**

为什么 Matplotlib 不能安装在 Visual Studio 代码中

原文:https://towardsdatascience.com/why-matplotlib-cant-be-installed-in-visual-studio-code-cb1261c822ad?source=collection_archive---------4-----------------------

因为有了 MVC++构建工具

作者制作的图片

我们知道“Matplotlib 是一个用于在 Python 中创建静态、动画和交互式可视化的综合库”。如果允许安装 Anaconda,通常使用 Matplotlib 没有问题。但是最近 Anaconda 为商业用户更新了服务条款。详细信息解释如下:

“为了应对过去几年商业用户对 Python 和 Anaconda 的使用和采用的急剧增加,我们更新了我们的服务条款。展望未来,我们要求依赖我们的包装&分销工作到商业用户购买我们的商业产品之一。”—https://www . anaconda . com/blog/anaconda-commercial-edition-FAQ

如果公司还没有准备好为 Anaconda 付费,一些工程师可能会转向 VS Code。

在 python 可以在 VSC 正常运行之前,有一些设置会困扰用户。大部分都是要求你安装库的错误,像“导入错误:没有名为 numpy 的模块”,可以通过“pip”或“pip3”或“python pip”或“python3 -m pip”等命令解决。来解决。

但是今天,我想把重点放在 Matplotlib 问题上,这个问题可能不能仅仅通过 pip 命令来解决。

万一:

  1. 你有一个视窗系统
  2. 您的电脑上没有安装 Anaconda
  3. Python 扩展已在 VSC 安装
  4. 解释器(在 VSC 的左下角)选择正确
  5. 没有安装 visual studio 构建工具(你可能也不知道为什么你需要它,直到问题发生,一个工程师(比如机械工程师)写 python 代码。

现在我们来举个例子。

尝试测试以下 py 文件:standardplot.py:

import numpy as np
import matplotlib.pyplot as pltx = np.linspace(0, 20, 100)  # Create a list of evenly-spaced numbers over the rangeplt.plot(x, np.sin(x))       # Plot the sine of each x pointplt.show()                   # Display the plot

你是否得到了下图的美丽身材:

还是你得到了错误?像下面:

Import Error: No module named numpy

谷歌一下,解决方案可能是:

pip install numpy
or 
pip3 install numpy
or
python3 -m pip install numpy
or
python3 -m pip install numpy

类似的问题如“没有 sklean 的模块”可以用类似的解决方案来解决。

再次运行它,现在 NumPy,没有问题,但是可能会有一个错误,如:

ERROR: Command errored out with exit status 1:
...... error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": [https://visualstudio.microsoft.com/visual-cpp-build-tools/](https://visualstudio.microsoft.com/visual-cpp-build-tools/)

这是因为您的计算机上没有安装 Microsoft C++Build Tools。为了在 Microsoft for Python 中运行 matplotlib 或类似的交互式界面,需要构建工具,而不仅仅是 Microsoft C++可再发行版。

如何:

单击链接,它会将您带到下面的窗口:

下载构建工具,运行。exe 文件,在安装过程中使用如下的 C++编译工具。一定要选择正确的物品。

图片来自这个网站

这需要一点时间,在这个过程中喝水或走动。😃

如果构建工具安装正确,现在以正常方式安装 Matplotlib。

运行 py 文件,你会得到如上的美丽图形。

外卖:

  1. 我写这个故事是因为当我搜索解决方案时,大多数人提到安装它,但很少有人提到这个案例。是的,这可能是一种罕见的情况(想想 Anaconda 无法安装…),但当它发生时,可能需要您花时间来解决它。希望这能让你想起这个案子。
  2. Microsoft Visual C++ build tool 是在 VSC 用 python 运行 Matplotlib 的先决条件的可能原因,我在下面找到了一个解释,但如果我错了,请随时纠正我。

Windows Python 需要通过 SDK 安装 Visual C++库来构建代码,比如通过setuptools.extension.Extensionnumpy.distutils.core.Extension。例如,使用 Python 在 Windows 中构建[f2py](https://www.scivision.dev/tags/f2py)模块需要安装如上所述的 Visual C++ SDK。在 Linux 和 Mac 上,C++库随编译器一起安装。-https://www . scivision . dev/python-windows-visual-c-14-required/

谢谢你的时间。希望有助于解决你在 VSC 的 Matplotlib 问题。

为什么 ML 应该从一开始就写成管道

原文:https://towardsdatascience.com/why-ml-should-be-written-as-pipelines-from-the-get-go-b2d95003f998?source=collection_archive---------14-----------------------

MLOps

通过迭代、可复制的管道消除技术债务

照片由EJ·斯特拉特Unsplash 上拍摄

今天,机器学习为世界上最有价值的 1%的组织(FB、ALPH、AMZ 等)提供动力。然而,99%的企业努力生产 ML,即使拥有超特定数据集和卓越的数据科学部门。

更深入地研究 ML 如何在组织中传播会更深入地揭示这个问题。下图显示了机器学习的典型设置的公认简化表示:

图 1:为什么很难复制 ML 模型

上述过程有三个阶段:

实验和概念验证:

  • 技术 : Jupyter 笔记本、Python 脚本、实验跟踪工具、数据探索工具
  • 角色:数据科学家
  • 描述:快速科学的实验定义了这个阶段。该团队希望尽快增加他们对数据和机器学习目标的理解。

转换:

  • 技术 : ETL 流水线工具,如 Airflow
  • 角色:数据工程师
  • 描述:将最终实验转化为自动化的、可重复的过程是本规范的目的。有时这在下一阶段之前开始,有时在下一阶段之后,但本质是相同的——从数据科学家那里获取代码,并尝试将它们放入某种形式的自动化框架中。

生产和维护:

  • 技术 : Flask/FastAPI,Kubernetes,Docker, CortexSeldon
  • 角色 : ML 工程师/运营
  • 描述:这是从模型部署开始的阶段,跨越监控、再培训和维护。这一阶段的核心重点是保持模型健康,并在任何规模下提供服务,同时考虑漂移。

每个阶段都需要不同的技能、工具和组织。所以,一个组织一路走来能碰到的坑坑洼洼也是理所当然的。不可避免的是,下游重要的东西在早期阶段没有被考虑。例如,如果培训与部署策略相分离,那么这在生产场景中就永远不会有好的表现——导致不一致、无声的失败以及最终失败的模型部署。

解决方案

查看上面图 1 中的多阶段过程,简单地减少所涉及的步骤并因此消除它们之间存在的摩擦似乎是显而易见的。然而,考虑到每个步骤的不同需求和技能,这说起来容易做起来难。数据科学家没有被训练或装备来勤奋地关心生产概念,如再现性——他们被训练来迭代和实验。他们并不真正关心代码质量,考虑到速度和开销之间的权衡,在早期过分努力地执行这些标准可能不符合公司的最佳利益。

因此,我们需要的是一个框架的实现,它是灵活的,但是从一开始就执行生产标准。实现这一点的一种非常自然的方式是通过某种形式的管道框架,该框架公开了一种在受控环境中运行 ML 实验的自动化、标准化的方式。ML 本质上是一个过程,可以分解为单独的具体步骤(如预处理、训练、评估等),因此管道是一个很好的解决方案。至关重要的是,通过在早期阶段标准化这些管道的开发,组织可以通过多种工具和步骤减少 ML 模型的破坏/重建周期,并加快从研究到部署的速度。

如果一个组织能够激励他们的数据科学家购买这样一个框架,,那么他们就已经赢得了生产化之战的一半。然而,真正的问题在于细节——如何在一个足够健壮的框架中为数据科学家提供他们进行实验所需的灵活性,以便一直应用到生产中?

寻找正确抽象的练习

从一开始就有了在管道中写作的动机,公平地说,我给出了关于如何实现这一点的框架的更具体的例子。然而,在我看来,目前的工具领域被分割成了许多框架,这些框架要么是为 ML 人员设计的 ML 工具,要么是为 Ops 人员设计的 Ops 工具,并没有真正满足我在上一节提到的所有要求。缺少的是一个面向 ML 人员的 Ops(读取管道)工具,带有适合数据科学家的高阶抽象。

为了理解这一点的重要性,我们可以看看 web 开发是如何从基于 PHP/JQuery 的原始脚本(web 开发的 Jupyter 笔记本)和 LAMP 堆栈发展到今天强大的基于 React/Angular/Vue 的现代 web 开发堆栈的。看看这些现代框架,它们的成功是由提供更高阶的抽象决定的,这些抽象更容易被更多的受众消费和消化。它们没有改变底层 web 技术工作的基本原理。他们只是以一种更容易被更多的观众理解和接受的方式改变了它的用途。具体来说,通过将组件作为一等公民提供,这些框架引入了一种分解、利用和重新共享为现代网络提供动力的 HTML 和 Javascript 的新机制。然而,ML(Ops)并没有相应的动作来找出正确的抽象顺序,以达到类似的效果。

为了展示我上面更抽象的想法的一个更具体的例子,我将使用 ZenML ,一个开源的 MLOps 框架来创建迭代的、可复制的管道。

声明:我是 ZenML 的核心维护者之一。

ZenML 是一个为 ML 寻找正确抽象层的练习。在这里,我们将管道视为一等公民。这意味着数据科学家直接接触框架中的管道,但与来自 ETL 空间的数据管道的方式不同( PrefectAirflow 等)。管道被视为实验— 意味着它们可以被直接比较和分析。只有到了转向生产化的时候,它们才能转换成经典的数据管道。

图 2: ZenML 用熟悉的语言抽象管道来增加模型部署的所有权。

管道中有步骤,这些步骤是用数据科学家熟悉的 ML 语言抽象出来的。例如有TokenizerStepTrainerStepEvaluatorStep等等。比将脚本插入某种形式的 orchestrator 包装器更容易理解的范例。

每个管道运行都会跟踪元数据和参数,并且可以与其他运行进行比较。每个管道的数据在流经时都会自动进行版本控制和跟踪。每次运行都链接到 git 提交,并编译成一个易于阅读的 YAML 文件,该文件可以选择性地编译成其他 DSL,例如 Airflow 或 Kubeflow 管道。这对于满足价值链中的数据工程师和 ML 工程师等其他利益相关者是必要的。

此外,为各个步骤公开的接口大多是以一种易于以幂等方式扩展的方式设置的,因此也是一种分布式方式。因此,当数据科学家处理更大的数据集时,他们可以使用不同的处理后端(如数据流/火花)进行横向扩展。

总而言之,ZenML 试图达到以下场景:

图 3: ZenML 统一了 ML 过程。

当然,ZenML 并不是实现上述目标的唯一机制——许多公司构建了自己的抽象框架来解决他们的特定需求。通常这些都是建立在我上面提到的一些其他工具之上的。不管如何实现,目标应该是明确的:让数据科学家尽可能接近生产并尽可能减少摩擦,激励他们在部署后增加对模型的所有权。

这是一个双赢的局面,对于任何一个将 ML 作为业务增长核心驱动力的组织来说都是一个巨大的胜利。

插头

如果你喜欢这里的想法,我们很乐意听到你对 ZenML 的反馈。这是开源,我们正在寻找早期采用者和贡献者!如果您发现这是适合您/您的数据科学家的抽象顺序,那么也请通过我们的 Slack 告诉我们,期待您的回复!

为什么大多数 A/B 测试效率不高

原文:https://towardsdatascience.com/why-most-a-b-tests-are-not-efficient-11b289414191?source=collection_archive---------19-----------------------

行业笔记

揭开纯粹探索的神秘面纱(第 0 部分)

A/B 测试有许多应用领域,例如药物测试。(图片由 Unsplash 上拍摄)

几十年来,A/B 测试一直是统计学的支柱,成为整个受控随机测试体系的基石,这是最神圣的科学确证技术。鉴于这个网站上关于这个主题的文章太多了,我认为没有必要让读者相信 A/B 测试的重要性,或者就此而言,参考这种技术似乎找到了自己的方式的不断扩展的应用领域列表。然而,A/B 测试的一个重要方面
却很少受到关注,这篇文章的目的就是填补这个空白。

快速总结 A/B 测试。

目前执行的基本程序本身非常简单。
以网站优化为例。一家公司希望推出其网站的新版本,希望新版本能比旧版本更好地影响用户注册该公司的服务。用户被分成两组,控制组(A 组)和测试组(B 组),分别展示新旧版本。每个用户,无论注册与否,都被假定提供一些关于他们所看到的网页版本质量的嘈杂反馈。通过两个概率密度(或质量函数,视情况而定)fA 和 fB,用平均值 A 和 b 对这种有噪声的反馈进行建模。然后,每组中的注册百分比指示哪个版本是优选的。从统计学上来说,这可以归结为使用噪声样本来测试以下哪个假设是正确的

(图片作者)

也可以通过用τ代替上面不等式中的 0 来测试所选的容差τ > 0。如下图所示,行业中最常用的方法包括

  • 利用经典统计学预先求出用户的数量 nA 和 nB(我从现在开始用通称“样本”代替“用户”),
  • 进行测试,以及
  • 做决定。

进行 A/B 测试的传统方式。(图片由作者提供)

听起来不错,不是吗?嗯,不完全是。虽然这个过程在科学上是正确的,但这不是本文的重点。如标题所示,其目的是通过向读者介绍更现代、更复杂的测试假设的方法来帮助提高 A/B 测试的效率。

什么意义上的高效?考虑测试消耗的样本数,即 N = (nA + nB)项。这个数字称为样本大小,由几个因素决定,如噪声方差和设计者认为可接受的【I 型,II 型】误差范围。请注意,在上面的过程中,所有与采样相关的决定都是在实验开始之前做出的。具体来说,没有利用输入数据提供的越来越清晰来帮助决策的概念。即使使用了可能的最佳样本量估计,我现在也将论证为什么在许多情况下,可以证明这是次优的。自然,另一种选择是让数据本身决定取多少样本。换句话说,把 A/B 测试转到在线

顺序统计

允许基于输入数据做出决策的数学方法,因此,其样本大小不是预先固定的,被称为序列统计学。取而代之的是,对输入的数据进行逐个样本的分析,当收集到“足够”的证据支持某个假设时,预定义的停止规则会停止进一步的数据收集。因此,通常的网页优化 A/B 测试的顺序版本对进入的用户流起作用,并且包括

  • 一个采样规则将一个进入的用户分配到控制组或测试组(这里是网页版本),
  • 一个停止规则,以及
  • 基于可用证据接受/拒绝 H0 的决策规则

顺序测试可以提供高达 4 倍的速度!(图片由作者提供)

说明性示例

在进一步讨论之前,让我们先用一个简单的例子来证明顺序测试的优越性。对于给定水平的 I 型和 II 型错误,最有效的序贯检验之一是亚伯拉罕·瓦尔德的序贯概率比检验 (SPRT)。与我们的网页示例保持一致,这个测试如下进行。

为简单起见,假设 A < µB and that we know fA and fB up to a permutation, i.e., we are only trying to find which of the two webpages generates sign up samples from fA and which from fB: Let f0 = fA ⊗ fB
代表对照网页并不比测试网页更好的情况,f1 = fB ⊗ fA,相反的情况。预先选择两个阈值 L0 和 L1 (0 < L0 < 1 < L1 ),并使用以下

1.采样规则:

  • 进入的用户流被分成成对的流,并且每对中的用户被随机分配到两个网页中的一个。
  • 第 n 对的反应被记录为样本二元组

(图片作者)

  • 定义 Zn = Xn — Yn,设 g0,g1 分别是 Zn 在 f0 和 f1 下的分布。

2.停止规则:

直到时间 n 的累积似然比,由下式给出

(图片作者)

并与阈值进行比较。如果任一λn < L0 or λn > L1,测试停止。否则,对 n + 1 对重复测试。

3.决策规则:

如果λn < L0 accept H0 and if λn > L1 拒绝 H0。

当 fA N(A;σ)和 fB≡N(B;σ),这在许多自然应用中是正确的,可以表明 SPRT 的平均样本量约为(2σ )/( A- B)。另一方面,普通的 A/B 测试需要大约(8σ )/( A- B)个样本。因此,顺序程序代表着效率提高了 4 倍!

上面的例子虽然很能说明问题,但并不完全符合实际情况,因为一般来说,平均值 A 和 B 是未知的。在文献中,这个例子是一个更一般的(序列)统计结构的特例,称为双臂土匪。具体来说,它属于一类被称为“最佳手臂识别”的问题,或称纯探索。这篇文章的目的是激起读者的兴趣,在本系列的后续部分,我们将更详细地讨论
当前背景下的多股武装匪徒。

从多臂强盗(MAB)的角度进行 A/B 测试有几个优点。

  • 纯探索的 MAB 算法不需要手段的知识。
  • 如果需要同时测试多个(3 个或更多)假设,该怎么办?在我们的例子中,公司可能想在几个网页版本中找到最好的。MAB 算法可以轻松处理这种
    情况。
  • 正如我们将要看到的,纯探索分析对样本量有非常严格的限制,因此,可以显著地提高这种检验的效率。

结束语

我希望我已经说服了读者需要更详细地理解最佳 Arm 标识。在本系列的下一部分,我们将设计并分析一个非常简单的纯探索算法(不,是不是汤普森采样)。我们将一点一点地检查这个算法的样本大小的表达式,并看到它包含了与自然现象相关的重要因素,这些自然现象是随机过程理论的核心。

值得注意的是,在过去的三十年里,纯探索领域的许多研究都受到了这些因素的影响。因此,对它们的含义以及它们是否可以避免的讨论将构成本系列的结论部分。

(注:参考资料将在第 2 部分末尾提供。)

为什么多重共线性不是机器学习中的问题

原文:https://towardsdatascience.com/why-multicollinearity-isnt-an-issue-in-machine-learning-5c9aa2f1a83a?source=collection_archive---------12-----------------------

多重共线性的处理取决于分析的目的。学会区分模型解释和预测将影响数据准备步骤。

由作者编辑的 Unsplash 上的 Austin Chan 照片

H 阿文在哥本哈根商学院教了三年统计学,我已经非常习惯于解释多元线性回归的模型假设(如果你需要重述的话,)。简单线性回归和多元线性回归在假设上的唯一区别是多重共线性的问题。

我教我的学生如何检查这个假设,如何处理它,但是突然一个教授告诉我忽略它。本文将概述他的回答,并通知您何时注意多重共线性的可能性。

什么是多重共线性?

当特征之间高度相关时,我们通常说存在多重共线性或相互关联的问题。有多种方法可以检测多重共线性。一种方法是使用如下所示的相关矩阵:

作者图片

该矩阵清楚地显示了花瓣长度(cm)和花瓣宽度(cm)之间的高度相关性。发现多重共线性的另一种方法是计算方差膨胀因子(VIF ),经验法则是 VIF 不应高于 10:

作者图片

我们显然发现了数据集中的多重共线性,但是我们应该处理它吗?看情况!

模型解释

向学生介绍统计学目标通常是模型解释。换句话说,目标是了解当自变量(也称为特征)之一发生变化时,目标变量(也称为因变量)的影响或变化。例如,我们有下面的等式(为了简单起见,忽略误差分量):

我们可以通过假设我们正在计算一所房子的价格来使它更加相关,我假设这取决于房间的数量、平方、基底面积和楼层的数量:

通过计算参数估计值(β系数),我们可以了解房价和独立变量之间的关系。假设正方形的数量独立于其他变量,增加将意味着房子的价格将增加β2。

假设我们有由房间数和楼层数之间的强相关性引起的多重共线性,不调整或处理多重共线性将导致错误的参数估计,并破坏要素的统计显著性。在这种情况下,我将不得不移除一个独立变量,以便获得更可靠的估计值(为了更直观地展示效果,请单击此处)。

多重共线性的一个典型示例是某个要素的所有名义类别都包含在回归模型中。通过排除一个类,我可以用它作为解释参数估计的基线,同时避免多重共线性。

模型预测法

当数据准备的目标是预测而不是解释时,我们会发现自己处于另一种情况。这一点在考特纳(2005)的《应用线性统计模型一书中有所概述:

事实上,一些或所有的预测变量之间是相互关联的,这通常不会抑制我们获得良好拟合的能力,也不会影响对新观察结果的平均反应或预测的推断。

要了解为什么会出现这种情况,让我们假设有以下数据集:

作者图片

两个独立变量 X1 和 X2 完全相关。这通常意味着不可靠的参数估计,但是让我们从给定的数据着手,并拟合一个多元线性回归模型。第一个等式可能如下:

该方程完全符合数据,但另一个很好的拟合将是下面的(尝试插入表格中的数字并自己查看):

第一个等式表示 X2 对目标变量有很大影响,而第二个等式则讲述了一个完全不同的故事。这意味着,只要我们不开始解释参数估计,我们就可以很容易地拥有完全符合数据的模型,甚至可以用它们进行预测。

换句话说,在为以预测为目标的机器学习上下文准备数据集时,您不必删除任何列。

文章中图表的代码:

我希望你像我喜欢写这篇文章一样喜欢它。如果你理解我的代码有任何困难,请留下评论。数据科学社区给了我很多,所以我总是乐于回馈。

请随时在 Linkedin 上与我联系,并在 Medium 上关注我以接收更多文章。

为什么多重分派是我最喜欢的编程方式

原文:https://towardsdatascience.com/why-multiple-dispatch-is-my-favorite-way-to-program-786bf78f4878?source=collection_archive---------10-----------------------

多种调度的优势概述,以及我为什么这么喜欢它。

(https://unsplash.com/photos/cvBBO4PzWPg

简介—一些历史

Julia 语言是一项令人难以置信的技术壮举,自 2008 年以来一直在进行中,并在过去几年中真正取得了进展。这种语言以其独特的范式和编程风格令人兴奋、面向科学,并且使用起来很有趣。要理解 Julia 编程语言,您需要理解多重分派。

多重分派是一个基于参数多态性的通用编程概念。一般来说,多态性有趣的地方在于,它通常是声明式和函数式编程的一种品质,但是这种品质本身似乎在其他编程范例中有更好的描述。多重分派是 Julia 编程语言的支柱,但这肯定不是编程概念的起源。多重分派的编程概念实际上最早是在 48 年前的 1973 年提出的!第一个实现是用一种叫做 ML 的小语言实现的,这种语言是由爱丁堡大学的 Robert Milner 和其他同事发明的。

这种语言与我们今天使用的许多高级编程和脚本语言非常相似。ML 和许多更具声明性的现代语言之间的最大区别是 ML 也是一种非常命令式的语言,当你考虑到这种语言也是函数式的时,这似乎有点奇怪。从 70 年代中期开始,许多语言实际上都遵循这种语调,我认为这是一个有趣的观察。我们总是称赞 C++真正发明了泛型的概念,但是在 70 年代出现了如此多的多范例语言,以至于几乎不可能跟踪它们。

什么是多重派遣?

多重分派是一个编程概念,它允许程序员多次编写一个函数来处理不同的类型。许多程序员倾向于远离函数式编程范式,因为它具有全局范围。这是可以理解的,让一切全球化,尤其是像 Julia 这样的出口,可能会很成问题。这主要是因为命名。实际上,很久以前我写过一篇关于 Julia 语言中的名称空间的文章,在那里我讨论了为什么一个类似于 C++的名称空间的实现可以减轻这个问题。我认为这是一个有趣的阅读,如果你想看看你可以在这里:

这个问题在函数中尤其普遍。这是因为 Julia 不是一种面向对象的语言,因此没有一个真正的类作用域,我们可以使用它来使函数私有,以便处理特定的类型,我们只是编写方法来将我们的类型放入全局作用域中。这意味着很多时候我们可能有名字完全不同的方法,却做着完全相同的事情。当然,在朱丽亚身上完全不是这样,之所以不是这样,是因为多次派遣。

多重分派是一种我们可以将函数调用作为类型属性来应用的方式。换句话说,我们可以一次又一次地重新定义同一个函数,但只是计划不同的类型通过它,以便从本质上重新创建方法来处理新的类型。考虑下面的例子。

x = [1, 2, 3, 4, 5]
y = 5
function add_5(x)
    x + 5end

上面的函数给作为 x 传递的参数加了 5,对于这个例子,我们只能通过这个函数传递 y。如果我们试图通过这个函数传递 x,我们会很快意识到没有匹配+(Array,Int64)的方法。这当然是因为我们没有办法把一个整数加到数组中。我们也不想草率地用另一个名字写另一个函数,就像这样:

function add_5_array(x)
     [x += 5 for x in array]
end

那太荒谬了。幸运的是,多重分派正是为了解决这个问题而产生的。使用 dispatch,我们可以将一个类型转换为这两个函数的参数,当该类型通过函数传递时,只有该特定类型的函数才会运行。

function add_5(x::Array)
     [x += 5 for x in array]
endfunction add_5(x::Int64)
    x + 5end

现在我们可以毫无顾虑地让 x 和 y 通过这里。

朱莉娅的现代调度

multiple 的 Julian 实现类似于典型的 multiple dispatch,但是使用了类固醇。我们不仅获得了能够在一行中非常快速地调用多个分派的额外好处,就像我们在用 Python 编写 lambda 表达式一样,我们还可以选择以两种方式交替编写函数。此外,朱莉娅有更多的锦囊妙计,使多重调度更好。

给 Julia 的调度增加美感的第一件事是创建子类型的能力。在 Julia 中,大多数类型都属于一种叫做超类型层次结构的东西。超类型层次结构只允许我们跨具有相似类型的方法创建继承,并且可以由这些函数以相同的方式处理。例如,假设我们有一个可以接受无理数、整数或浮点数的函数。我们可以通过简单地从我们的函数中分派实类型来限制这将到达树的哪一部分。

add5(x::Real) = x + 5

我们也可以在这个函数的使用中包括复杂类型,取而代之的是沿着树向上并调用所有的数字:

add5(x::Number) = x + 5

这意味着我们不仅可以分派我们的类型,还可以让其他类型继承我们分派给抽象类型的那些函数。如果你想了解更多关于我刚刚提到的数字层级的知识,我有一整篇文章,你可以在这里阅读:

Julia 令人敬畏的内部构造函数为 dispatch 增添了美感。内部构造函数允许您创建多个输入来实现相同的输出。这些基本上是初始化函数,可以接受任意数量的参数,然后从提供的参数中构造应用它们的类型。真正酷的是,dispatch 会注意是否有人在调用内部或外部构造函数,所以您仍然可以使用普通参数创建类型,但您也可以使用新参数创建它。考虑下面的例子:

mutable struct broken_array
    dim1
    dim2
end

这里我们有一个新的类型叫做 broken_array。为了从两元素数组中构造这种类型,我们需要填充 dim1 和 dim2 数据值。我们当然可以这样做:

array = [5, 2]
broken = broken_array(array[1], array[2])

然而,这对于终端用户来说有些不方便。我们可以用内部构造函数来解决这个问题,就像这样:

mutable struct broken_array
    dim1::Int64
    dim2::Int64 function broken_array(x::Array)
        new(x[1], x[2]) end
end

我们之前执行的旧调用仍然会被调度来通过调用外部构造函数直接创建类型,但是现在我们有了扩展的功能,可以像这样用我们的数组调用内部构造函数。

broken = broken_array(array)

很酷,对吧?

另一个很棒的事情是,它还使得语言中的所有类型和方法都具有难以置信的可扩展性。我们可以从任何包中取出任何类型或任何方法,直接导入,并扩展它做我们想做的任何事情。类型的内部构造函数甚至也不需要在构造函数中,所以我们可以真正利用和编写函数来创建其他包中已经存在的类型,并在任何地方使用它们。此外,我们甚至可以用自己的类型扩展其他方法。一个非常酷的结果是,Julia 中的所有包经常使用相同的一组基方法,而你可能习惯于使用完全不同的类型。

结论

在我工作和涉足的所有编程语言中,Julia 很容易成为我最喜欢的编程语言。这是多次调度的直接结果。Julia 语言中的多重分派概念不仅允许一些非常激进和富于表现力的编程,而且允许对该语言中使用的任何方法或类型进行扩展。不用说,这是一个非常强大的概念。此外,这也是科学编程的一个好方法,因为方法调用和函数定义经常看起来就像在论文中一样。非常感谢您阅读我的文章,并希望它可能会使您倾向于检查出美妙的礼物是多派遣!

我的认知科学学位如何为数据科学和机器学习奠定了坚实的基础

原文:https://towardsdatascience.com/why-my-cognitive-science-degree-was-a-great-foundation-for-data-science-and-machine-learning-f5838b527d40?source=collection_archive---------14-----------------------

数据科学中的个人故事

从认知科学背景进入机器学习和数据科学领域令人生畏——但最终提供了一个有益的基础。

Bret Kavanaugh 拍摄的 Unsplash 图像

我进入了数据科学和机器学习的领域,其中隐藏着许多不确定性和不安全性。我有无尽的好奇和兴奋——天真而乐观。但是萦绕在我脑海深处的是一种不安全感,我不是来自任何传统背景,例如,计算机科学、统计学或商业。相反,我毕业时获得了认知科学学士学位。然而,随着时间的推移和我经验的增长,一个想法开始慢慢解开——也许,我的背景提供了比我最初预期的更坚实的基础。

首先,什么是认知科学?

每当有人问起我的专业,我往往会背诵:

"认知科学是神经科学、人工智能、计算机科学、哲学、心理学、语言学和人类学的交叉领域."

这并不能解释太多,通常会得到缓慢的点头和不确定的“…好的。”

因此,我想花一点时间来表达我所学到的东西,以及为什么我会对它提供给我的框架心存感激。

心灵的神秘

我怀着强烈的愿望开始了我的研究,想了解心灵;发现的最有力途径之一是通过认知失败的案例。

照片由 E ngin AkyurtUnsplash 上拍摄

我了解到有些人不能识别面孔。其他人通过颜色来看声音。有些人在看到痛苦的人时会感到痛苦。其他人强烈渴望截肢,因为他们认为这是一个入侵的实体。有些人醒来时会不由自主地被自己的手掐住脖子。最重要的是,我已经意识到每种疾病都伴随着一种生物损伤。这些生物损伤有治疗方法。

在我们对这些疾病的存在有所了解之前,我们会把任何偏离常态的人归类为“疯子”。例如,那些患有面孔失认症的人可能在识别他们的孩子或同事方面有困难。这意味着如果他们走过一个他们认识但不认识的人身边,却没有和他们打招呼,他们可能会显得很粗鲁。

或者一些患有身体完整性认同障碍的人想要截肢,因为他们觉得这是一种阻碍。因此,旁观者会认为他们“疯了”,而不是考虑造成这种情况的潜在身体缺陷。

那么什么是认知科学,为什么它是跨学科的?

然而,精神障碍只是我研究的一个方面。我的专业,简而言之就是围绕【理解认知】。换句话说,这种神秘的能力我们必须去思考、推理和获取知识。

在这门学科中,我获得了一种新的自我意识,以及思考人类经历所包含的东西的途径。在认知科学领域之前,我们使用严格的内省和心理学,或者严格的神经科学和生物学来研究这个主题。

但是认知科学提出,为了理解大脑的复杂性,我们不能依赖一个单一的学科来获得所有的答案。我们需要理解思维的内部状态以及大脑的解剖结构——但这还不够。我们需要了解社会、文化、语言、现代技术以及其他一切可能有助于发展我们思考能力的事物。

更准确地说,我的研究使我能够深入研究意识、梦、记忆、注意力、存在、神经系统、社会、文化、药物对大脑的影响、开发略微模拟大脑神经网络的计算机系统的过程,以及不断发展的技术的其他方面。

那么数据科学和机器学习在哪里呢?

我在下面列出了我看到的认知科学世界和数据科学/机器学习世界碰撞的几种方式。

国家癌症研究所拍摄的 Unsplash 照片

  1. 神经网络和神经科学:神经网络的灵感来源于人脑的神经回路。在 了解这种生物现象的数学表示之前,研究神经元、连通性以及信息如何向前传播 是很有见地的。尽管深度学习领域引入了新奇的术语,但这些数学模型所启发的潜在生物过程要复杂得多;网络架构是简化的数学表示。此外,深度学习架构中的许多变体也是受生物副本的组件或模仿人类认知的想法的启发。有了更复杂的生物学灵感的基础后,概念化这些模型和概念就容易多了。**
  2. 人机交互和数据可视化/讲故事:理解思维的一个关键部分是理解人类如何捕捉和保留信息。在认知科学中,我们研究记忆和注意力的基本过程。我们研究注意力是如何被捕捉的,人们可能会关注什么,以及我们如何自然地将视觉线索分组以理解一个总体故事。此外,我们调查了不同文化之间的认知差异,以及生活方式和传统如何影响我们的思维方式。这一背景使我能够批判性地思考可视化。谁是观众,这些颜色对这个群体来说代表什么?我的视觉化能把观众的注意力引向我想要传达的东西吗?是否有太多的杂乱会分散我的听众快速直观地理解信息的注意力?人类一次能理解多少信息?
  3. 统计分析:任何科学努力都会带来统计分析。科学研究数据检查、概率评估和预测分析。从我完成的统计学课程中,我对我遇到的每一条新信息或统计数据都抱着健康的怀疑态度。我喜欢问这样的问题:“谁是研究的对象?取样是如何进行的?实验设计符合最初的问题吗?实验设计是否让我们有信心做出更广泛的结论?我们能利用这些信息做些什么,这符合道德吗?”这种怀疑同样适用于机器学习问题。重要的是要采取一种方法和全面的方法,特别是如果我们的模型的部署具有社会影响。
  4. 计算社会科学和网络分析:认知科学中有一个探索分布式认知的框架,根据维基百科,“指的是一个认知资源在中被社会共享以扩展个体认知资源的过程”。目标是分析认知是如何在个体范围之外产生的,包括探索个体之间的相互作用。我的计算社会科学课相当直接地翻译成了网络分析。我的班级通过模拟和建模调查了社会互动和行为互动。为了分析连接度,我们应用了网络分析技术。这些技术在数据科学领域中无处不在。
  5. 神经信号处理与一般时间序列分析:神经信号处理的目标是对神经信号进行分解,以提取大脑如何表征和传递信息的信息。由于这些神经信号具有时间成分,我们可以将它们表示为时间序列数据。因此,我能够将该课程中使用的相同技术应用于其他时间序列数据集。

虽然我只阐述了我的认知科学和机器学习研究之间的 5 个联系,但这个列表并没有结束。其他一些共享主题包括微积分、线性代数、A/B 测试、数据伦理等。慢慢地发现我以前的学习并没有让我处于劣势,这让我感到很温暖;相反,它提供了一个坚实的基础框架。

冒名顶替综合症

我带着一种强烈的冒名顶替综合症的感觉开始了向数据科学和机器学习的过渡。尽管我不确定,但我从未对研究心灵感到后悔。对思维的研究让我产生了一种愿望,那就是为那些遭受神经损伤或与精神健康问题作斗争的人服务。与此同时,对数据科学和机器学习的研究激发了人们利用我们所拥有的计算能力来为社区服务的热情。

卢卡斯·法夫尔拍摄的 Unsplash 照片

最后,值得注意的是,虽然冒名顶替综合症可能会让人麻痹,但在许多情况下,它促使我更快、更有意识地学习。我开始害怕这些话题会从我的头上飞过,却发现我的背景出人意料地让我有了直观的联系。现在我有了一个“缩小”的镜头,不是来自“传统背景”的恐惧和不确定性被纯粹的感激所取代。

建议

如果任何读到这篇文章的人也感受到来自非传统背景的不确定性,要知道你并不孤单。许多数据科学家和机器学习实践者并没有传统背景。请记住,这项研究涉及到我们可以应用于任何领域的工具,您的道路将使您能够建立独特的联系,帮助您巩固新概念。

最后,不要让冒名顶替综合症的感觉压倒你。相反,让它为你提供必要的动力和意图,以跟上数据科学和机器学习不断变化的格局。

为什么我 90%准确率的模型不工作

原文:https://towardsdatascience.com/why-my-model-with-90-accuracy-doesnt-work-685817a2b0e?source=collection_archive---------9-----------------------

不平衡数据集的模型性能度量

阿菲夫·库苏马在 Unsplash 上拍摄的照片

当您处理客户流失(当客户在一定时间内停止使用公司的产品)预测等营销问题时,原始数据集通常是不平衡的,这意味着类别本质上是不平衡的。基本上,这意味着你的客户流失的百分比可能比那些没有流失的要低得多。在本例中,二进制分类问题可能有 80–20%的分裂,只有 20%的客户停止与该公司的合作,80%的客户继续购买。

问题是,这 20%可能对企业的底线非常重要。

想想看,一家礼品公司有 100,000 名客户,平均每人价值 50 美元。这些客户给了你 500 万美元,但是如果有 20%的人不再购买该公司的产品,你就损失了 100 万美元!在几年的时间里,即使是最大的电子商务公司或实体店,这一数字也会增加。因此,公司营销部门的一个主要目标是预测客户何时会流失,并实施某种干预措施来防止这种情况发生。

用于流失预测的机器学习

现在,如果你的公司有一个好的数据科学/数据分析团队,你可能会很幸运。有了一个好的客户流失预测模型,你可以在客户放弃你的业务之前进行干预,并有可能让他们回到他们的忠诚状态。现在,我们进入下一个问题——当我们使用二元分类模型时,不平衡的类往往会使事情变得有点混乱。主要是,许多分析师转向的核心性能指标是准确性,但准确性只能告诉你这么多…

什么是准确性?

在另一篇关于走向数据科学的文章中, Koo Ping Shung 评论了不同的性能指标来评估你的 ML 模型。在本文中,我们将回顾其中的一些选项,以及为什么它们可能比准确性更适合不平衡的数据。

准确度 =正确预测总数/预测总数

直觉上,准确性是有意义的——你想知道你有多少预测是正确的。不幸的是,有了不平衡的数据,事情就没那么简单了。让我们看一个例子…

您有来自营销部门的去年客户流失数据,总共有 100,000 名客户和 20,000 名流失客户。现在,如果我们预测所有 100,000 个都不会流失,这意味着我们有 80,000/100,000 个正确(80%的准确率)。在这个例子中,您实际上没有识别出任何问题案例。如果你更进一步,你的数据更加不平衡(90-10 分裂),如果你预测每个人都不会流失,你的模型实际上会有 90%的准确率,尽管没有识别出一个问题案例。

最终,准确率为 90%的模型可能无法工作。

那么,我们该如何解决这个问题呢?

正如前面提到的文章中所讨论的,还有模型性能的其他度量。出于我们的目的,我们将回顾三种这样的措施:

  • 精确
  • 回忆
  • 子一代

精度

精度=真阳性/(真阳性+假阳性)

这可能看起来不像精确度那么清晰,但是本质上,精确度告诉你离你的目标有多近。也就是说,如果你预测正确,你会得到更多的“分数”,但是如果你错误地分类,你也会失去一些分数。因此,如果我们要抓住所有 20,000 名流失的客户,这是 20,000 个真正的阳性,但如果我们还包括另外 20,000 名没有真正流失的客户,我们的精确度就会下降,如下所示。

无误报:20,000/(20,000+0)= 100%

误报率:20,000/(20,000+20,000)= 50%

当您有一个不平衡的数据集,并且您想要防止误报(或者在 stats 中称为类型 1 错误)时,Precision 就很方便了。例如,如果你正在诊断癌症并实施有风险的治疗,你要确保你只治疗那些病人。如果你对大部分没有真正生病的人使用这种治疗(假阳性),你可能会有一些非常负面的影响。

回忆

回忆=真阳性/(真阳性+假阴性)

如果使用精确度来防止假阳性,那么召回是防止假阴性(也称为“遗漏”或 2 型错误)的等效措施。看同类型的例子,如果我们正确地分类我们所有的搅拌,我们不会错过任何一个,我们将有完美的回忆,如下所示:

无漏报:20,000/(20,000+0)= 100%

现在,如果我们错过了 5,000 个目标案例,我们的召回率就会下降,包括分子和分母,如下所示:

有假阴性:15000/(15000+5000)= 75%

如果你的班级不平衡,回忆是一个很好的选择,最重要的是你找到所有的问题案例。在前面的客户流失预测示例中,假设分析的目标是找出谁最有可能流失,并向这些客户发送非侵入性消息,提醒他们再次购买。

如果出现误报的唯一风险是发出一些额外的通知,那么召回可能是一个很好的性能指标选择。你可能不在乎把 500 张明信片寄给那些不太可能流失的人,从而浪费了它们——你在乎的是你抓住了所有真正的正面案例。(您识别了每一次点击)。

F1 得分

F1 分数可能是最不直观的性能指标,但它可能是解决您的问题的正确方法。

F1= 2 X(精度*召回)/(精度+召回)

基本上,F1 分数是精确度和召回率的组合,它允许您在确定模型性能时权衡您的误报和漏报。

如果你想更好地理解你计算中的原始数字,维基百科在分解数学方面做得很好。

来源:https://en.wikipedia.org/wiki/F-score

如果您识别了 20,000 个目标案例中的 15,000 个,但是您也错误地识别了 5,000 个(并且遗漏了 5,000 个),您的 F1 分数将如下所示:

f1:15000/(15000+. 5(5000+5000))=75%

F1 分数的顶点是精确度和召回指标的调和平均值

后续步骤

现在我们已经看了一个如何分析不平衡数据集的例子,很明显,准确性可能并不总是最好的衡量标准。底线是,你可以有一个准确率为 90%的模型,但召回率或精确度为 0%。如果您在 python 中运行逻辑回归,您可能需要考虑一些选项来处理这些类型的问题:

  • SMOTE —这个包允许你过采样或欠采样来平衡你的类
  • 加权逻辑回归 —通过选择每个类别的权重(或简单地选择根据类别分布平衡权重),您可以设置 TP、FP 和 FN 的重要性级别,从而对结果进行更多控制。

摘要

不平衡的分类问题可能很难处理,即使使用 R 和 python 作为机器学习算法。然而,本文的目标是防止您基于不完整的数据分析而犯逻辑错误。关键要点如下:

  • 准确性并不总是最好的
  • 定义你的商业目标
  • 查看用于平衡数据的包

我希望你喜欢这篇文章,如果你有任何问题,请随时联系我们!

为什么神经网络有激活功能

原文:https://towardsdatascience.com/why-neural-networks-have-activation-functions-9732e5405d4e?source=collection_archive---------25-----------------------

入门

它们是强制性的。

作者图片

有一次面试,有人问我“为什么神经网络有激活功能?”那一刻,我坚信没有激活功能的神经网络只是线性模型,因为我在某本书上读到过,但我不确定为什么是这样。不过我自信地回应道,“因为一个没有任何非线性激活函数的神经网络只是一个线性模型。”面试官回答,“嗯,有意思,我不确定这是不是真的,我想知道的是‘它们让计算梯度变得更容易’。”这立刻成了我新宠的面试问题。

会后,我翻遍了我的书,试图找出我是在哪里第一次了解到这个事实的。我是在伊恩·古德菲勒、约舒亚·本吉奥和亚伦·库维尔的《深度学习》 中找到它的。第 168 页,关于前馈神经网络的主题[1]:

f⁽ ⁾应该计算什么函数?到目前为止,线性模型为我们提供了很好的服务,让 f⁽ ⁾成为线性模型也很有吸引力。不幸的是,如果 f⁽ ⁾是线性的,那么前馈网络作为一个整体将保持其输入的线性函数。暂时忽略截距项,假设 f⁽ ⁾ ( x ) = Wᵀx,f⁽ ⁾ (h) = hᵀw.,那么 f(x) = xᵀWw.我们可以把这个函数表示为 f(x) = xᵀw',其中 w' = Ww。

随着近年来对人工智能和机器学习的兴趣激增,我觉得以几种替代形式写一篇文章来说明这一事实似乎是有价值的。我希望其中的一种表示能引起你的共鸣,在这篇文章中,我将提供大量的视觉效果和代码片段供你自己观察和使用。为本文编写的所有代码都是开源的,可以在我的 GitHub 上获得。如果在本文中出现的代码片段的上下文不清楚,请参考本文的伙伴 GitHub repo 以获得完整的上下文。

在我们讨论神经网络之前

我认为,首先概念化一个具有数百万参数的巨大神经网络如何可能是一个线性模型,如果我们没有向它添加任何非线性激活函数,这有点势不可挡,所以在我们开始将我们的讨论与神经网络联系起来之前,让我们谈谈单变量模型。假设我有一个单变量模型,其中我将一个输入( x )乘以某个数量( n )的系数( β ),并添加相同数量( n) 的偏差(偏差):

相乘后:

上述内容可以重新表述如下:

从这里,我们可以将公式的各个部分分配给变量:

然后最后替换为:

最终,尽管我们做了所有的乘法和加法,我们只剩下一个线性模型。这是有意义的,因为 β偏置都是简单的常数。一个代表一串随机实数的乘积,一个代表一串随机实数的乘积之和。因此,如果我们选择用实际值替换等式中的 β(s)偏差,我们会发现自己留下了一个非常熟悉的公式,其中我们将变量 x 乘以某个斜率 β ,然后添加一些截距偏差。为了用一些代码形象化这个事实,我们将首先编写一个随机模型类:

这个类从我们的原始公式中初始化 β(s)、bias(es)和 n 。当被调用时,这个模型执行上面详述的相同过程来计算 f(x) 。最后,我们需要一个单变量线性回归,代表我们的最终方程:

从这里,我们可以初始化一个随机模型,并拟合我们的 OLS 回归。

完整的脚本,点击这里。作者图片

正如你所看到的,由这种方法生成的每个随机模型都可以用一个简单的单变量 OLS 来表示。我选择强调这个过程,因为迭代地将一个输入乘以一个系数,然后添加一个偏差项,这与神经网络的前向传播步骤中发生的过程没有太大的不同。也许现在感觉,如果没有任何非线性激活函数的神经网络仅仅是一个线性模型,这应该是正确的,但是在我们接受这种直觉作为事实之前,让我们说明一个平凡的小神经网络。

一个玩具神经网络

假设我们有一个简单的神经网络,它有两个输入,一个具有两个节点的隐藏层(具有线性激活函数),和一个输出。

为了便于阅读,对权重和偏差进行了标注。作者图片

从这里我们可以得出结论:

我们应该已经注意到,这些方程都是一个简单的线性模型。接下来,我们可以为等式的各个部分分配新的变量(在这个例子中,我选择替换,以使我们接下来的每一步更具可读性,我们可以轻松地避开这种替换):

因此:

从这里开始,让我们将 h₁ 代入一个等式,然后乘以:

现在让我们用 h₂ 和我们的 c 等式做同样的事情:

从这里开始,让我们将 ac 代入我们的方程 y :

分组相似术语:

将新变量分配到等式的各个部分:

最后,将这些代入我们的公式:

我们又一次只剩下一个线性模型。事实上,如果我们选择增加神经网络的大小和深度,不管有多剧烈,我们都可以执行相同的简化,并最终从中导出一个线性模型。

正如我们之前所做的,让我们编写一些代码来测试这个发现,方法是生成非平凡大小的神经网络,并对它们的输入和输出进行线性回归拟合。首先,创建随机前馈神经网络的函数:

我正在覆盖默认的偏差初始化“零”,以确保偏差对输出有影响,因为我们不会改变任何初始化的权重

接下来,让我们使用随机神经网络生成一些输入和输出,我们可以使用它们来训练线性回归(这次我们将使用 scikit-learn 的线性回归实现,而不是扩展我们的实现以包括多个输入和输出):

运行完整脚本会返回:

$ python3 ff_example.pyr2 score: 0.999999999999102
mse: 1.7702930123167377e-14

在这一点上,我们可以非常肯定伊恩·古德费勒、约舒阿·本吉奥和亚伦·库维尔是正确的(我的意思是,通常可以非常安全地假设这些人是正确的)。然而,你们中的一些人可能会想,“到目前为止,我们只做了简单的前馈神经网络,那么具有卷积层或递归层的神经网络呢?”好了,现在我们有了一个比较神经网络和线性函数的框架,我们可以简单地修改我们的函数来测试其他层类型:

$ python3 cnn_example.pyr2 score: 0.9999999999793131
mse: 7.416074040925858e-16
$ python3 rnn_example.pyr2 score: 0.9999999999749045
mse: 5.490464324395404e-08

如你所见,如果你所有的激活函数都是线性的,那么递归层、卷积层、甚至池层都不会产生任何非线性。

异或线性与异或非线性

作为最后一个例子,我觉得这是最快速地说明具有所有线性激活函数的神经网络和具有非线性激活函数的神经网络之间的差异,让我们检查不同的神经网络如何在 XOr 上执行。

异或运算

XOr 读作“异或”是一个著名的逻辑连接词。[2]

逻辑上称为“异或”或“异或”的连接词。如果两个条件中恰好有一个(但不是两个)为真,则产生 true。—https://mathworld.wolfram.com/XOR.html

我们将关注二进制异或方程。二进制异或有如下真值表:

作者图片

模型

在本练习中,我们唯一要参数化的是激活函数,关于架构的其他一切都将保持一致:

我们的神经网络,可视化后,看起来像这样:

作者图片

线性模型

基于我们现在所知道的,我们如何期望完全线性激活的神经网络运行?

完整的脚本,点击这里。作者图片

正如预期的那样,我们的神经网络具有所有线性激活函数,其表现与线性回归模型完全一样。

非线性模型

现在,如果我们改变隐藏层的激活函数为 sigmoid 而不是线性的呢?

完整的脚本,点击这里。作者图片

通过简单地将隐单元的激活函数改变为非线性 sigmoid 方程,神经网络可以适当地解决 XOr 问题。这是相同的神经网络,但是使用 ReLU(校正线性单元)激活:

完整的脚本,点击这里。图片作者

结论

对于神经网络来说,没有所谓的“最重要”组件,然而,激活函数为第一个获得该头衔提供了有力的论据。在本文中,我们了解到,没有任何非线性激活函数的前馈神经网络(无论是包含递归层、卷积层还是池层)都只是线性模型。我们通过数学符号、实验和大量的可视化展示了这一事实。

参考

[1] I .古德费勒,y .本吉奥和 a .库维尔,深度学习 (2016),https://www.deeplearningbook.org/

[2] 杰蒙德松,罗杰魏斯泰因,埃里克 W. “异或”来自 数学世界——一个 Wolfram 网络资源。https://mathworld.wolfram.com/XOR.html

为什么非营利组织应该关注合成数据

原文:https://towardsdatascience.com/why-nonprofits-should-care-about-synthetic-data-ab1d327908dc?source=collection_archive---------15-----------------------

合成数据如何帮助非营利组织改善其业务运营及其对服务对象的影响

版权所有 2021 Gretel.ai

TL;速度三角形定位法(dead reckoning)

我是 Gretel 公司的机器学习研究员,这是一家为开发者开发隐私工程工具的公司。11 月,我参加了一个小组,讨论为什么合成数据对非营利组织很重要,以及他们如何使用它。用例是无止境的,跨越医疗保健、教育、经济发展等行业。很多创新取决于正在成熟的技术创新以及这些创新如何解决非营利组织的各种痛点。非常感谢 DataKind 邀请 Gretel 在 NetHope 峰会上与 Medic 谈论这些问题。

介绍

合成数据被认为是最重要、最激动人心的新兴技术创新之一。它将使营利性公司能够共享数据,特别是在使用有差异的私人合成数据时,因为它消除了隐私相关许可问题的摩擦,并允许在预生产管道中进行更快速的技术开发。此外,合成数据可用于支持太小或数据集严重失衡的数据集。这将帮助组织建立更复杂的机器学习能力,这些能力通常非常渴求数据。然而,这些好处不仅有助于营利性部门,也能极大地影响公共部门。

我很高兴受到 DataKind 的邀请,在 NetHope 峰会上与 Medic 一起在一个关于合成数据的小组上发言。这是一个完美的机会来展示合成数据的力量,以及为什么非营利组织也开始思考它是重要的。营利性组织经历的每一个痛点都会被非营利性组织放大。以下是三个主要挑战以及合成数据如何应对这些挑战:

(1)保护数据隐私

许多非营利组织和非政府组织与弱势群体打交道,在这些群体中,隐私风险更高。这些人口面临着技术滥用,如监控系统累犯算法政府福利系统。非营利组织明白,这种滥用可能发生在他们服务的人群身上,因此必须对他们收集的任何数据加以保护。

有区别的私人合成数据是非营利组织可以减轻这种风险的一种方式,释放了一些以前被认为风险太大的创新和实践,例如合作打击人口贩运(在我们的小组讨论中,一名观众分享了一个用例!).尽管这不一定能防止模型开发中数据的不完美使用,但它确实能保护弱势群体的信息不被泄露和用于其他邪恶目的。

(2)收集和利用有限的数据集

但是,即使我们能够共享数据来改进分析、洞察和模型构建,公共部门也不从事收集数据的工作。致力于加强公民社区纽带的研究团体公民社会法律家庭委员会(Law Family Commission on Civil Society)于 2021 年 10 月发布了一份报告,描述了公共部门如何因糟糕的数据做法而落后于私营部门,例如使用 pdf 等“不可读格式”来存储数据。

收集数据既费钱又辛苦,做对更是难上加难。定义收集的信息的粒度、节奏和类型本身就是一项全职工作。很少有非营利组织有预算或员工带宽来致力于强大的内部数据收集和管理系统。不可避免的是,更接近非营利组织核心使命的其他活动几乎总是优先于这些困难的任务,尤其是当投资回报难以计算的时候。

这就是合成数据大放异彩的地方。如果一个非营利组织已经收集了足够的数据(数量未知,但少于一次完整的数据收集),那么他们可能能够训练一个合成模型来增加一个相对较小的样本。因为如果有足够的真实数据来源,那么即使只有一点点也可以转化为无限量的合成数据!随着数据集的扩大,非营利组织对其战略计划和每个计划的绩效有了更全面的了解,他们可以做出更明智的选择,将稀缺资源分配到哪里,从而最大限度地提高效益。

我在会上讨论的一个真实世界的例子是与 Microcred 合作建立的模型 DataKind。这种模式本可以帮助 Microcred 在贷款方面做出更好的决策,因此它变得更加高效和包容。然而,Microcred 只收集获得贷款的人的数据。因此,该模型只能用于那些获得贷款的人,而不能用于那些被拒绝的人。这限制了该模式的效力和影响。收集这些被拒贷款的数据需要几个月甚至几年时间。但如果 Microcred 在未来利用合成数据,他们将能够在更短的时间跨度内收集数据,并在更好的隐私保证下构建其数据集的其余部分。

(3)共享数据

隐私保护数据带来的最大好处之一是能够安全地共享数据集。将孤立的私人信息转化为团队可以合作的匿名工件可以引发新的讨论和发现,从而为所服务的弱势群体带来更好的结果。

英国的一些公务员已经开始倡导使用合成数据来改善政府对数据的使用。例如,在最近由几个公共机构主办的公务员竞赛期间提出的 200 多个想法中,合成数据被评为最佳之一,作为一种工具,它可以在公共部门中用于,除其他外,“通过工作和养老金部、英国税务海关总署以及英国签证和移民局之间更丰富的数据交换,提高对福利和税务欺诈的检测。”通过赋予公共部门团体与数据合作的权力,可以发现新的见解,弥合差距,并为所服务的人群建立更好的系统。

结论

非营利部门对任何健康社会的运作都至关重要。它有助于确保贫困的弱势群体得到照顾,并改善全世界数百万人的生活质量。为了继续向个人提供这些基本服务,并在更大范围内成为一股向善的力量,非营利组织必须有效地利用数据。通过使用像格雷特这样的合成数据工具,他们可以打破隐私瓶颈,开启以前似乎难以置信的创新。

现在的关键是确保各地的非营利组织都知道这些高效、廉价(在某些情况下甚至免费)的工具已经可以为他们所用。我希望你能和我一起传播这个好消息!

你可以免费开始合成数据。

为什么不使用 Thompson 采样进行最佳 Arm 识别。

原文:https://towardsdatascience.com/why-not-to-use-thompson-sampling-for-best-arm-identification-8ed458428126?source=collection_archive---------27-----------------------

思想和理论

如何使用多臂 bandit 分配方法在最少次数的试验中找到最佳臂?

内森·杜姆劳Unsplash 上拍摄的照片

在本帖中,我们展示了当目标是识别最佳手臂时,为什么不应该使用汤普森采样。特别是,我们将比较 Thompson 抽样和最近引入的名为 Top-two Thompson 抽样的分配方法,并展示它们的使用案例。在我们的实验中,前两名汤普森需要少 35%的试验来确定最佳手臂。Thompson 抽样是近年来越来越流行的多臂土匪问题中的一种分配方法。多臂 bandit 方法以一种平衡的方式顺序做出决策,探索可能提高未来性能的新信息,并利用已知信息最大化性能。这通常被称为勘探开发权衡。在多武器强盗问题中,我们的目标是最小化累积遗憾,这是最优武器的平均奖励和所玩武器的奖励之间的差异。最常用的方法之一是汤普森抽样(有时也称为贝叶斯土匪)。Thompson sampling 从获得的奖励中构建一个概率模型,并从中抽取样本来选择一只手臂进行游戏。Thompson 抽样在工业中被广泛使用,因为就最小化累积遗憾而言,它是分配臂的最佳方法之一[1]。

从业者有时使用多臂土匪的方法来确定最好的手臂。在这种情况下,Thompson 采样在有限的时间范围内运行(即勘探阶段),并从那时开始发挥最佳作用(即开采阶段)。开发阶段的这种性能保证被称为简单后悔。简单的遗憾可以解释为在探索阶段结束后一定要打出最好的手臂。Russo 最近的一篇文章[2]表明,Thompson 抽样是一种远非最佳的分配方法,无法决定开采期的最佳策略。在这篇博客中,我们讨论了 Top-two Thompson 采样,并提供了一个 Python 代码示例来复制和比较最佳 arm 识别情况下的方法。

前两名汤普森抽样。

Thompson 抽样是多臂土匪问题的一种流行的分配方法。这个博客主要关注伯努利分布案例。在伯努利分布中,奖励只能有两种可能的结果,1 和 0。更多关于汤普森取样的信息,请阅读这篇精彩的文章。

当奖励具有伯努利分布时,Thompson sampling 从贝塔分布中取样,并播放具有最高返回值的手臂。在实验开始时,所有的分布都很宽,并且在所玩的武器之间存在相对均匀的分配。随着实验中试验次数的增加,概率分布变得更窄,汤普森抽样将更频繁地使用更高概率的奖励。因此,勘探减少,开采增加。在识别最佳臂的情况下,这种行为远非最佳。

Top-two Thompson 采样是对标准 Thompson 采样的简单修改,增加了一个重采样步骤[2]。与 Thompson 抽样相似,在每个试验中,从所有的组中提取一个样本。与 Thompson 采样相反,不是使用具有最高样本奖励的手臂,而是在最高和第二高返回值之间抛硬币。这种抛硬币的方式可以防止只玩样本奖励最高的牌。这导致更多地探索第二个表现最好的武器,而不是发挥最好的武器。硬币翻转的量可以通过超参数β来改变,但通常是。这意味着最好的和第二好的手臂被打的概率相等。

汤普森抽样实现。

我们将首先创建一个名为 ThompsonSampling 的类,在 ThompsonSampling 中的参数标准(如成功次数( a )和失败次数( b )旁边,我们添加了参数 top_arms 。该参数允许在标准 Thompson 抽样和 Top-two Thompson 抽样之间变化。

import numpy as np
import pandas as pd
from datetime import datetimeclass ThompsonSampling():
    """Class to implement a Thompson sampling policy 
    for a multi-armed bandit problem.

    Args:
        a (list): The alpha parameter of a Beta 
        distribution. For multiple arms, this will be a list of
        float values.
        b(list): The beta parameter of a Beta 
        distribution. For multiple arms, this will be a list of
        float values.
        top (int): Either 1 to use a standard Thompson sampling
        or 2 to use Top-two Thompson.
    """

    def __init__(self, a, b, top_arms=1):
        self.top_arms = top_arms

        # Beta parameters
        self.a = a
        self.b = b
        return

    def initialise(self, num_arms):
        """Initialises the arms.

        Args:
            num_arms (positive int): The number of arms.
        """
        self.num_arms = num_arms

        # Use Uniform distribution as prior for all the arms
        self.a = [1 for arm in range(self.num_arms)]
        self.b = [1 for arm in range(self.num_arms)]
        return

    def select_arm(self, random_seed):
        """Selects an arm for each round.

        Args:
            random_seed (int): The seed for random number generator.

        Returns:
            An integer corresponding to the index of the selected 
            arm.
        """
        # Select each arm at least once
        arms = []
        for i in range(self.num_arms):
            if self.a[i] == self.b[i] == 1:
                arms.append(i)
        if arms:
            np.random.seed(seed=random_seed)
            return np.random.choice(arms)

        # Perform random draw for all arms based on their parameters
        np.random.seed(seed=random_seed)
        all_draws = np.random.beta(self.a, self.b, 
                                   size=(1, self.num_arms))
        all_draws = np.concatenate(all_draws, axis=0)

        # Return index of arm with the highest reward for Thompson
        # Return index of any top-two arm for top-two Thompson 
        np.random.seed(random_seed)
        return np.random.choice(all_draws.argsort()[::-1]
                                [:self.top_arms])

    def update(self, chosen_arm, reward):
        """Updates the parameters of the chosen arm.

        Args:
            chosen_arm (int): The index of the selected arm. 
            reward (int): The reward obtained. Either 0 or 1.
        """
        # a is based on total counts of successes of an arm
        self.a[chosen_arm] = self.a[chosen_arm] + reward

        # b is based on total counts of failures of an arm
        self.b[chosen_arm] = self.b[chosen_arm] + (1 - reward)

        return

为了比较,我们还创建了类 BalancedPolicy。这个职业完全随机选择一只手臂。我们用这个类来比较 Thompson 和前两名 Thompson 的均衡分配。平衡分配与传统 A/B 测试一样,随机分配一个臂。该类需要成功次数( a )和失败次数( b )来更新 arm,以便我们可以执行最佳 arm 识别。

class BalancedPolicy():
    """Class to implement a Balanced policy 
    for a multi-armed bandit problem.
    It selects an arm completely at random.

    Args:
        a (list): The alpha parameter of a Beta 
        distribution. For multiple arms, this will be a list of
        float values.
        b(list): The beta parameter of a Beta 
        distribution. For multiple arms, this will be a list of
        float values.
    """

    def __init__(self, a, b):
        self.arms = []

        # Beta parameters
        self.a = a
        self.b = b
        return

    def initialise(self, num_arms):
        """Initialises the arms.

        Args:
            num_arms (positive int): The number of arms.
        """
        self.arms = [arm for arm in range(num_arms)]
        self.num_arms = num_arms # Use Uniform distribution as prior for all the arms
        self.a = [1 for arm in range(self.num_arms)]
        self.b = [1 for arm in range(self.num_arms)]
        return

    def select_arm(self, random_seed):
        """Selects an arm for each round.

        Args:
            random_seed (int): The seed for random number generator.

        Returns:
            An integer corresponding to the index of the selected 
            arm.
        """
        # Select each arm at least once
        arms = []
        for i in range(self.num_arms):
            if self.a[i] == self.b[i] == 1:
                arms.append(i)
        if arms:
            np.random.seed(seed=random_seed)
            return np.random.choice(arms)

        # Perform random selection of arms
        np.random.seed(seed=random_seed)
        return np.random.choice(self.arms)

    def update(self, chosen_arm, reward):
        """Updates the parameters of the chosen arm.

        Args:
            chosen_arm (int): The index of the selected arm. 
            reward (int): The reward obtained. Either 0 or 1.
        """
        # a is based on total counts of successes of an arm
        self.a[chosen_arm] = self.a[chosen_arm] + reward

        # b is based on total counts of failures of an arm
        self.b[chosen_arm] = self.b[chosen_arm] + (1 - reward)

        return

为了模拟使用每种分配方法选择手臂的结果(奖励),我们实现了一个 BernoulliArm 类,其中奖励只能有两种可能的结果,1 和 0,这取决于每只手臂的预期奖励。

class BernoulliArm():
    """Class to simulate a Bernoulli arm.

    Args:
        p (float): The probability of success.
    """
    def __init__(self, p):
        self.p = p

    def get_reward(self, random_seed):
        """Obtains a reward based on Bernoulli.

        Args:
            random_seed (int): The seed for random number generator.

        Returns:
            1 for success, 0 otherwise.
        """
        np.random.seed(seed=random_seed)
        if np.random.random() > self.p:
            return 0.0
        else:
            return 1.0

由于目标是识别最佳手臂,我们需要计算找到最佳手臂的概率。在这样做的时候,我们利用了一个模拟,其中我们从带有参数的 beta 分布中抽取成功次数( a )和失败次数( b ) N 次。

def calculate_bayesian_probability(num_arms, N, random_seed, a, b):
    """
     Calculated the bayesian probabilities by performing 
     sampling N trials according to the provided inputs.

    Args:
        num_arms (int): The number of variations to sample from.
        N: The number of sampling trials.
        random_seed: The seed for random number generator.
        a (list): The alpha parameter of a Beta 
        distribution. For multiple arms, this will be a list of
        float values.
        b(list): The beta parameter of a Beta 
        distribution. For multiple arms, this will be a list of
        float values.

    Returns:
        Ordered list of floating values indicating the success 
        rate of each arm in the sampling procedure.
        Success rate is the number of times that the sampling 
        returned the maximum value divided by the total number 
        of trials.
    """
    np.random.seed(seed=random_seed)
    sim = np.random.beta(a, b, size=(N, num_arms))
    sim_counts = sim.argmax(axis=1)
    unique_elements, counts_elements = np.unique(sim_counts, 
                                                 return_counts=True)
    unique_elements = list(unique_elements)
    counts_elements = list(counts_elements) for arm in range(num_arms):
        if arm not in unique_elements:
            counts_elements.insert(arm, 0) return counts_elements / sum(counts_elements)

为了将前两个 Thompson 采样与标准 Thompson 采样和平衡策略进行比较,我们进行了模拟。在这些模拟中,我们对每个策略进行分配 num_sims 次,以消除随机性。在仿真中,我们计算了(1)识别最佳 arm 的贝叶斯概率,以比较最佳 arm 识别的分配方法。(2)累积遗憾:打出的手臂和打出最好的手臂之间的奖励差异。(3)选择最佳手臂的比率,因此所有分配方法使用定义为最佳(即成功概率最高)的手臂的频率。

def simulate(policy, arms, best_arm, num_sims, trials, N):
    """Simulates a multi-armed bandit process.

    Args:
        policy: The policy class.
        arms (list): A list of arm classes. 
        The leght of the list equals the number of arms.
        best_arm (int): The index of arm with the highest reward.
        num_sims (int): The number os simulations.
        trials (int): The numbe of trials in each simulation.
        N: The number of sampling trials to calculate the 
        bayesian probabilities.
        balanced (bool): If True, a uniform distribution is used 
        to calculate the bayesian probabilites, if False, then a 
        beta distribution.

    Returns:
        A dataframe with information such as the select arm, 
        reward and regret per simulation per trial.
    """
    # Initialise a dataframe to store the results of the simulations
    columns = ['num_sims', 
               'trials', 
               'chosen_arms', 
               'rewards', 
               'rewards_best_arm', 
               'prob_best_arm']
    for a in range (len(arms)):
        columns.append('prob_arm_{}'.format(a))
    for a in range (len(arms)):
        columns.append('alpha_arm_{}'.format(a))
    for a in range (len(arms)):
        columns.append('beta_arm_{}'.format(a))
    results = pd.DataFrame(index=range(0,num_sims*trials),
                           columns=columns, dtype='float') for sim in range(num_sims):
        sim = sim + 1
        policy.initialise(len(arms))        
        for t in range(trials):
            t = t + 1
            index = (sim - 1) * trials + (t - 1)
            # Selection of best arm
            chosen_arm = policy.select_arm(random_seed=index)
            # Obtain reward information from the chosen arm
            reward = arms[chosen_arm].get_reward(random_seed=index)
            bayesian_probabilities = \
                calculate_bayesian_probability(num_arms=len(arms),
                                               N=N,
                                               random_seed=index,
                                               a=policy.a,
                                               b=policy.b)
            # Obtain reward information from the best arm 
            # to calculate regret later
            reward_best_arm = \
                arms[best_arm].get_reward(random_seed=index)
            results.loc[index] = \
                [*[sim, t, chosen_arm, reward, reward_best_arm, 
                   bayesian_probabilities[best_arm]],
                 *bayesian_probabilities, *policy.a, *policy.b]
            policy.update(chosen_arm, reward) # Calculate the cumulative reward
    results['cumulative_rewards'] = \
        results.groupby('num_sims')['rewards'].cumsum()
    results['cumulative_rewards_best_arm'] = \
        results.groupby('num_sims')['rewards_best_arm'].cumsum()

    # Calculate the average reward
    results['average_rewards'] = \
        (results['cumulative_rewards'] / results['trials'])

    # Calculate the regret
    results['regrets'] = \
        results['rewards_best_arm'] - results['rewards']
    results['cumulative_regrets'] = \
        results['cumulative_rewards_best_arm'] - \
        results['cumulative_rewards'] # Calculate the rate of choosing the best arm
    results['is_best_arm'] = \
        (results['chosen_arms'] == best_arm).astype(int)
    results['is_best_arm_count'] = \
        results.groupby('num_sims')['is_best_arm'].cumsum()
    results['rate_of_choosing_best_arm'] = \
        (results['is_best_arm_count'] / results['trials'])

    return results

为了展示 Thompson 与 Top-two Thompson 采样的不同用例,我们创建了一个具有五个分支的模拟,每个分支的预期回报为【0.1,0.2,0.3,0.4,0.5】。我们做出 1500 个分配决策(即试验)并运行模拟 500 次以创建稳健的结果(即 num_sims )。

在这个模拟中,arm 4 是最好的 arm。均衡策略随机分配臂,因此最佳臂的分配率约为 20%。假定超参数β设置为,前两个 Thompson 采样将接近 50%的最佳臂选择率。最后,Thompson 抽样将逐渐提高在接近 100%的试验次数中选择最佳臂的比率。

在最佳 arm 识别方面,Top-Two Thompson 在识别最佳 arm 方面优于其他分配方法。例如,在 200 次试验后,识别最佳手臂的贝叶斯概率约为 77%。相比之下,汤普森抽样有 73%的概率识别最佳手臂。就最佳武器识别而言,武器的均衡分配低于汤普森和排名前两位的汤普森抽样。为了达到识别最佳手臂的 95%贝叶斯概率,前两名汤普森平均需要 689 次试验,而汤普森平均需要 1073 次试验。在 1500 次试验后,汤普森和平衡分配都有 96%的概率识别最佳臂,而前两个汤普森在识别最佳臂时达到 99.6%的贝叶斯概率。

对贝叶斯概率的深入研究解释了为什么汤普森采样在最佳臂识别上表现不佳。例如,在 100 次尝试后,Thompson 对第 4 手牌的概率密度相对较高,但对第 1-3 手牌的概率密度相对较低,因为他不经常使用这些手牌。换句话说,Thompson sampling 播放 1-3 号手臂的频率不足以区分 4 号手臂。相比之下,平衡策略对于 arm 0 具有相对较高的概率密度,尽管这对于最佳 arm 识别来说是不必要的,因为 arm 0 和 arm 4 之间的概率分布已经彼此可区分。

在累积后悔方面,汤普森抽样的累积后悔最低。累积遗憾是在所有回合中使用的武器和使用最佳武器之间的奖励差异。正如预期的那样,Thompson 采样优于排名前两位的 Thompson 采样,因为排名前两位的采样选择最佳臂的频率较低。武器的平衡分配导致最高的累积遗憾,因为随着时间的推移,它不会开始玩性能最差的武器。

何时使用哪种策略?

在这篇博客中,我们证明了在最佳 arm 识别中,Top-two Thompson 采样优于 Thompson 采样和平衡分配。因此,在寻找最佳臂的情况下,数据科学家应该使用像 Top-two Thompson 采样这样的方法。这样做时,数据科学家应该监控最佳 arm 的贝叶斯概率,并将其用作自适应停止规则,以最小化勘探阶段的成本。如果业务涉众不打算停止实验(即连续测试),则应使用 Thompson 抽样,因为它会导致更低的累积遗憾。本博客提供了 Python 示例代码来实现和比较这两种方法,以便数据科学家可以向他们的业务利益相关者演示这些分配方法的用例。通过使用面向对象的方法,读者能够很容易地为他们在日常工作中遇到的用例修改代码。

参考文献。

[1] Russo,d .,Van Roy,b .,Kazerouni,a .,Osband,I .和 Wen,z .(2017 年)。汤普森采样教程。arXiv 预印本 arXiv:1707.02038。

[2] Russo,d .,“最佳武器识别的简单贝叶斯算法”运筹学 68,6(2020):1625–1647。

以正确的方式轻松提升您基于数字的分析

原文:https://towardsdatascience.com/why-numba-sometime-way-slower-than-numpy-15d077390287?source=collection_archive---------5-----------------------

理解并使用 Numba——Numpy 的掺杂版本

我最近遇到了[Numba](https://numba.pydata.org/),这是一个针对 python 的开源实时(JIT)编译器,可以将 python 和Numpy函数的子集翻译成优化的机器代码。原则上,带有低级虚拟机(LLVM)编译的 JIT 会使 python 代码更快,如 numba 官方网站所示。当我尝试我的例子时,起初看起来并不那么明显。

函数的 Numba 版本比 Numpy 版本长得多,为什么

如图所示,我得到的**N**umba运行时间比 **Numpy**长 600 倍!我可能做错了什么?

在进行详细的诊断之前,让我们后退一步,回顾一些核心概念,以便更好地理解Numba是如何工作的,并希望能更好地使用它。如果您熟悉这些概念,请直接进入诊断部分。

Python,字节码和 PVM?

Python 作为一种高级编程语言,需要被翻译成本机语言,以便硬件(例如 CPU)能够理解并执行这些指令。

对于像 C 或 Haskell 这样的语言,翻译是直接从人类可读语言到本地二进制可执行指令。这是在代码执行之前完成的,因此通常被称为提前(AOT)。其他语言,如 JavaScript,在运行时被一条一条地翻译。

预编译代码的运行速度比解释后的代码快几个数量级,但是需要权衡平台特定性(特定于编译代码的硬件)和预编译的义务,因此是非交互式的。

Python,像 Java 一样,使用这两种翻译策略的混合:高级代码被编译成一种中间语言,称为Bytecode,它是进程虚拟机可以理解的,它包含所有必要的例程来将Bytecode转换成 CPU 可以理解的指令。在 Python 中,进程虚拟机被称为Python virtual Machine (PVM)

不同实现中的 Python 编译—图片由作者提供

与纯解释语言相比,这种策略有助于 Python 的可移植性和更快的速度。然而,由于解释高度复杂的CPython Bytecode需要时间,所以PVM上的运行时间Bytecode与本机代码的运行时间相比仍然很慢。出于这个原因,新的 python 实现通过优化Bytecode来提高运行速度,以直接在Java virtual Machine (JVM)上运行,就像对于Jython一样,或者甚至在[Pypy](https://www.pypy.org/)中使用JIT编译器更有效。JIT-compiler基于低级虚拟机(LLVM)是Numba背后的主要引擎,这通常会使其比Numpy功能更有效。

那么 Python 中的 JIT 是什么呢?

实时(JIT)编译器是运行时解释器的一个特性。而不是像在CPython解释器中那样,每次调用一个方法就解释字节码。JIT 将分析代码以找到将被多次执行的hot-spot,例如循环中的指令,并将该部分编译成本机语言。这允许在需要时动态编译代码;与bytecode解释相比,减少编译整个代码的开销,同时显著提高速度,因为常用指令现在是底层机器的本地指令。JIT 编译器还提供了其他优化,比如更有效的垃圾收集。

Numba 如何工作?

简单地说,一个 python 函数可以简单地通过使用装饰器"@jit"转换成Numba函数。当编译这个函数时,Numba会查看它的Bytecode来找到操作符,同时也拆箱函数的参数来找出变量的类型。这两个信息帮助Numba知道代码需要哪些操作数以及它将修改哪些数据类型。然后沿着分析管道向下,创建函数的中间代表(IR)。之后,它在后端将此处理给后端低级虚拟机LLVM,以进行低级优化并使用JIT生成机器码。一旦生成了机器码,它就可以被缓存并执行。缓存允许我们下次需要运行相同的函数时跳过重新编译。如需更多详细信息,请查看此技术说明。

Numba 的工作模式——作者提供的图片——改编自 Stan Seibert (Numba 的合著者)

对 Numba 明显迟钝的诊断

  1. 研究案例的设定

有了所有这些先决知识,我们现在准备诊断我们的Numba代码的缓慢性能。

首先让我们安装Numba : pip install numba

我们的测试功能如下。

def calc_numpy(x, y, n):
    res = np.zeros(len(x))
    for i in range(n):
        for j in range(n):
            res += np.add(i*x, j*y)
    return res

**@jit(nopython=True, cache=True)**
def calc_numba(x, y, n):
    res = np.zeros(len(x))
    for i in range(n):
        for j in range(n):
            res += np.add(i*x, j*y)
    return res

正如你可能注意到的,在这个测试函数中,有两个循环被引入,因为Numba文件表明loop是其中一种情况,这时JIT的好处将会很明显。除了装饰器"@jit"之外,calc_numbacalc_numpy几乎相同。我们将使用大小为nobsn的循环来检查每个函数在模拟数据上的运行时间。

args = parse_args()
nobs = args.nobs
n = args.n
x = np.random.randn(nobs)
y = np.random.randn(nobs)res_numpy = calc_numpy(x, y, n)
res_numba = calc_numba(x, y, n)

这产生了

check res_numpy == res_numba: True
run time Numpy / Numba [ms]: 1.34 / 839.37
  1. Numba 开销

很明显,在这种情况下,Numba版本比Numpy版本长得多。由于代码完全相同,唯一的解释就是NumbaJIT编译底层函数时增加了开销。如果是这样的话,如果我们再次调用Numba函数(在同一个会话中),我们应该会看到改进。

Numba 函数在编译后速度更快——Numpy 运行时不是不变的

如图,第一次调用后,Numba版本的函数比Numpy版本快。同时,如果我们再次调用Numpy版本,它需要相似的运行时间。这很好的展示了Numba中编译的效果。

问题是:我们想用Numba来加速我们的计算,然而,如果编译时间那么长,那么运行一个函数的总时间会不会比 cannonical Numpy函数的时间太长了?

Numba 哪里可以发光?

1。交互式 Jupyter 笔记本

作为构建您的 Jupiter 笔记本的一种常见方式,一些函数可以在顶部单元格上定义和编译。然后,这些函数可以在后面的单元格中多次使用。在这种情况下,编译时间的损失可以通过以后使用时的时间增益来补偿。

作者在 Jupyter 笔记本中重用快速编译的数字函数

2.缓存功能

现在,如果您没有使用交互式方法,如Jupyter Notebook,而是在editor中运行Python或直接从terminal运行。我们如何从一个函数的编译版本中获益?事实上,这是装饰器jit中的选项cached的直接结果。

@jit(nopython=True, **cache=True**)
def calc_numba(x, y, n):
    res = np.zeros(len(x))
    for i in range(n):
        for j in range(n):
            res += np.add(i*x, j*y)
    return res

Numba 中的缓存选项允许避免重新编译

如图所示,当我们第二次重新运行相同的脚本时,测试函数的第一次运行所用的时间比第一次少得多。这是因为它利用了缓存的版本。还要注意,即使使用了缓存,函数的第一次调用仍然比随后的调用花费更多的时间,这是因为检查和加载缓存函数的时间。

事实上,如果我们现在签入 python 脚本的同一个文件夹,我们会看到一个包含缓存函数的__pycache__文件夹。

当使用' cache '选项时,编译的函数将被缓存到 pycache

3.循环次数

你可能会注意到,在上面讨论的例子中,我故意改变了循环数n。实际上,NumbaNumpy版本之间运行时间的增加取决于循环的数量。让我们试着比较一下测试函数中大量循环的运行时间。

Numba 在高循环数时表现出色

更普遍的是,在我们的函数中,循环的次数非常多,编译一个内部函数的成本,比如 np。add(x, y)将在很大程度上由每次循环迭代重新解释bytecode的时间增益来重新补偿。

在高循环数(nobs=1000)下,“Numba”运行时间低于“numpy ”-图片由作者提供

4.大数据

与循环次数类似,您可能也会注意到数据大小的影响,在本例中是由nobs调制的。我们可以测试将输入向量的大小从x, y增加到100000

Numba 也因大量输入数据而大放异彩

对于较大的输入数据,Numba版本的函数必须比Numpy版本快,即使考虑到编译时间。

对于大输入(nloop=100),运行时间“Numba”低于“Numpy 图片由作者提供

事实上,NumpyNumba运行时间的比率将取决于数据大小和循环次数,或者更一般的函数性质(要编译)。下面是这两个参数的Numpy/Numba运行时比率的一个例子。

比率 Numpy/Numba 运行时间与循环次数和输入数据大小的函数关系—图片由作者提供

最终注释

我发现Numba是优化计算时间的一个很好的解决方案,使用jit decorator 对代码的改动很小。包中还有更多令人兴奋的东西有待发现:并行化、矢量化、GPU 加速等,这些超出了本文的范围。好奇的读者可以从 Numba 网站找到更多有用的信息。

通过这个简单的模拟问题,我希望讨论一些我觉得有趣的NumbaJIT-compiler背后的工作原理,希望这些信息对其他人有用。像往常一样,如果你有任何意见和建议,请不要犹豫让我知道。

参考

[1] 编译语言 vs 解释语言
【2】JIT vs 非 JIT 的比较
【3】Numba 架构
【4】pypypy 字节码

为什么开源软件击败了 MLOps 的专有软件

原文:https://towardsdatascience.com/why-open-source-beats-proprietary-software-for-mlops-b30e52f70f5b?source=collection_archive---------34-----------------------

为了灵活性和控制力,拥有自己的 ML 管道是很重要的

来源:作者

机器学习团队可以使用 Knime 或 SageMaker 等专有平台,或者使用开源工具构建自己的平台。公司通常将专有平台标榜为更强大、更高效、更易于使用。但实际上,它们通常比开源替代方案更复杂,功能更弱。

我们从纯粹的开源基础上构建自己的 MLOps 架构。这就是为什么你的平台的所有权是重要的。

开源质量更高

人们有时会怀疑免费工具,但是开源软件通常比付费软件质量更高。像谷歌和微软这样的大公司严重依赖开源软件,并经常让他们最好的工程师从事这些项目。

开源项目也受益于比闭源项目更多的关注。如果开发人员发现了一个 bug,他们可以贡献一个对所有人都有益的补丁。

最后,开源软件通常不上市,这意味着激励更好,因为质量是决定成功的关键因素。相比之下,商业项目的成功更多地取决于营销、合作和品牌。这意味着公司经常被激励在这些领域花费比工程更多的时间和精力。

因此,当谈到开源软件时,“你得到你所支付的”是一个真正的用词不当。

开源带来了可转移的技能,这使得招聘变得更加容易

工程师们想要学习开源工具,因为他们也可以在其他公司使用这些知识。没有人希望被困在目前的工作中,因为他们花了十年时间学习一些内部平台的细节。

培训你的团队使用对其他公司有价值的工具,比如 TensorFlow 和 Kubernetes,可能会让一些人紧张,但这确实是吸引顶级工程人才的唯一可持续方式。

你的团队也可以通过其他方式受益于这些可转移的技能:如果你和其他人使用相同的工具,找到专家顾问甚至简单的社区来源的帮助要容易得多。

开源解决方案更加模块化

“包罗万象”是企业平台试图脱颖而出的一个关键方式。他们不是只构建一个培训平台,或只构建一个部署工具,而是将自己推销为“一体化”解决方案或“您的团队将需要的最后一个工具”。

但是事事都做到最好是不现实的。这些解决方案的整体性使得更换单个组件变得更加困难。如果您的团队想要使用最好的模型注册中心,通常他们不能将它插入到他们现有的平台中。

相比之下,开源软件通常更加精细,并且非常注重与其他平台的集成。这意味着开源解决方案更像是在玩乐高:如果它的一部分给你带来了麻烦,你可以简单地把它拆下来换一个。

专有平台存在隐性成本

专有平台被鼓励不断向现有客户出售升级和新功能。在许多情况下,这意味着他们不坦率地承认自己的局限性。

在销售过程中,他们可能会让你相信一个低级或中级的计划非常适合你的需求。只有在购买之后,你才意识到他们已经战略性地删除了关键功能,或者添加了旨在削弱你工作流程的特定限制,直到你为下一次升级付费。

这些平台还可以在几乎没有通知的情况下提高价格,所以你的团队要么匆忙重写一切,要么支付比你预算更多的费用。

什么时候使用专有平台有意义?

如果您的团队没有太多的工程专业知识,特别是在开发运维以及创建和管理基础设施方面,那么设置和维护开源解决方案可能会很有挑战性。

开源工具往往是“由开发人员为开发人员”构建的,因此在某些情况下,像营销这样的非技术团队也可能更喜欢专有平台。

最后,如果您正在处理小型内部项目或概念验证应用程序,通常很少需要基础架构。如果人们不把你的解决方案作为产品来使用,一个现成的工具,比如快速可视化,通常就足够了。

您的团队在采用开源 MLOps 时需要帮助吗?

我们是一家机器学习机构,喜欢帮助研究团队建立开源 MLOps 基础设施。如果您想讨论 MLOps 工具,请随时联系我们

为什么运筹学很棒——简介

原文:https://towardsdatascience.com/why-operations-research-is-awesome-an-introduction-7a0b9e62b405?source=collection_archive---------1-----------------------

数学是宇宙的语言,根据定义,它是逻辑的。但是做数学不仅仅是逻辑——它是一个利用数学给我们的工具的高度创造性的过程。在运筹学中,你可以用数学工具创造性地解决一些令人兴奋的问题!

运筹学(OR)是一个应用数学领域,其中数学工具和运算符不是用于进一步研究数学,而是通过设计创新的解决方法来分析和解决 OR 领域内的问题。

图一。美国宇航局在 Unsplash 拍摄的照片

理解运筹学的动机

未来的决策将尽可能接近完全自动化(想想“托尼·斯塔克”级别的自动化)。研究和促进这种转变的一个研究领域是 OR。其核心是一个应用数学领域,将高级分析方法集成到决策支持/决策中。

随着问题和决策环境变得越来越复杂,推进强调人机界面的研究以避免误解是至关重要的。未来的一个经典恐怖例子是,如果决策者寻求最大化客户幸福,那么(人工智能)系统会将这一点转化为将每个人置于类似于“黑客帝国”中的多巴胺昏迷状态(我们可能已经进入,也可能没有进入)..).

但是,我们今天还面临着更多的实际问题。例如包裹递送的路线安排,其中路线的总距离应该最小化,同时仍然使递送的包裹的数量最大化。在极端情况下,这两个目标要么不让司机递送任何包裹,要么不让他们有任何空闲时间,但在这两者之间也有许多次优实例。这些问题只是冰山一角,杰克。因此,未来的决策者能够恰当地整合他们的偏好以避免这些情况是至关重要的——而运筹学恰恰研究了这一点!

图 2:无限长手套说明了或者(当然!),因为 OR 带来的工具包将会抹去未来问题的一半。照片由晨酿破浪

我还是研究生的时候偶然发现了数学和经济学,这两个方向都有可能研究;要么还是金融工程。相比较而言,后者处理金融、交易和风险/投资方面的决策,而运筹学更广泛地处理工业和商业领域的决策。虽然,一些术语将金融工程作为一个更专业的子类别放到了当时更广泛的 OR 领域。

什么是运筹学?

一般来说,或涉及获得一些现实世界目标函数的极值;最大值(利润、性能、效用或收益),最小值(损失、风险、距离或成本)。它结合了数学建模、优化和统计分析的技术,同时强调了人机界面。然而,回答这个问题的一个困难是,科学术语中有很多重叠——有时术语变得非常流行,影响了术语的前景。例如,人工智能和大数据等模糊而宽泛的术语的流行,这两个术语对营销都很有用,但对研究的讨论毫无帮助。因此,我试图用 ORs 相关的字段、子字段和图 3 中解决的问题来说明它。

图 3:运筹学相关学科和问题的整体说明。注意,我很大程度上受限于 2D 的表述,因为除了这里显示的,学科之间还有许多其他的联系。例如概率论和统计学是机器学习的固有部分。Alex El kjr Vasegaard 的插图。

运筹学起源于 17 世纪,当时博弈论方法和期望值被用来解决问题。现代版的 OR 起源于第二次世界大战期间,当时很明显,军方需要解决战争中出现的一些重要的后勤和供应链问题。

当时,它被定义为“一种为行政部门提供有关其控制下的业务决策的定量基础的科学方法”,并被创造为“运营分析”(仍在丹麦),或“定量管理”。

运筹学的未来?

OR 的一个吸引人的特点是知识、技能和工具在各个行业的适用性。如今,OR 在大多数企业和行业中以或多或少的专业化版本应用,从农业、能源交易、生产和销售到航天工业、资产定价、军事行动和需求预测,无所不包。最显著的用例可能是:

  • 供应链管理
  • 物流和库存管理
  • 路由和寻路问题
  • 预测性维护
  • 调度和分配问题
  • 评估问题(多标准决策)
  • 系统工程
  • 预测

工具的共同点是以下四项技能,使您能够:

  • 利用数学优化方法,如线性规划、动态规划、随机规划等。
  • 开发求解算法。通常需要近乎实时的解决方案。也就是说,最优解不是必须的。人们“只是”想要一个足够好的解决方案。对于具有高复杂性的大问题(例如,NP-Hard 问题),诸如专家启发的启发式算法或生物启发的遗传算法、蚁群优化、甚至神经网络或决策树启发的梯度推进方法的解决算法。这取决于问题的框架,以及它是基于模型还是基于数据的解决方法。
  • 进行广泛的模拟,以调查衍生解决方案的稳健性和灵活性。或者通过蒙特卡罗模拟、灵敏度分析等。
  • 对问题进行广泛的分析,例如确定网络中的关键路径。为了举例说明正确分析的重要性,在网络分析中,更具体地说,在交通网络中,已经观察到通过移除道路,可以增加交通流量。这是布赖斯悖论,它也被发现欺骗其他系统,如电网,生物学和团队运动策略。因此,正确分析自己的解决方案至关重要。

我希望这是非正式的,让你知道什么是运筹学——我的家人、朋友和其他研究领域的同事一直在问我这个问题,所以我希望这澄清了你的兴趣。

为什么组织需要数据驱动

原文:https://towardsdatascience.com/why-organizations-need-to-be-data-driven-98ade3ca53a?source=collection_archive---------6-----------------------

这个新职位面向不同领域、服务产品或垂直行业的企业家和大、中、小型企业主。通读之后,您将理解数据驱动意味着什么,以及为什么组织需要数据驱动。

介绍

作者图片

W 为什么数据是必要的?为什么组织应该寻求数据驱动?数据驱动的文化有什么好处?组织如何成为数据驱动型组织?这些以及更多的相关问题是我在会议、研讨会和知识分享活动中听到企业主、高管和员工提出的。

思考了上面提到的一些问题后,写作的灵感自然而然地来了,我决定用最好的方式来分享我的想法。如果您希望了解数据驱动意味着什么,以及为什么数据对每个企业都至关重要,那么您来对地方了。

我把这篇文章分成了两个独立的系列。在这第一个版本中,我将帮助您理解数据驱动的含义,以及为什么数据对每个组织都至关重要。随后,我将发表另一篇文章,讨论成为数据驱动的一些挑战,以及组织应该如何真正应对这些挑战。

关于“为什么组织需要被驱动”的整个出版物是企业主、企业家、公司企业以及任何想要了解数据对组织的重要性以及如何成为数据驱动的人的必读之作。

数据驱动到底是什么意思?

作者图片

术语“数据驱动”意味着一个实体倾向于根据数据而不是直觉、个人意见、一般观察或纯粹的希望来做出战术和战略决策。换句话说,数据驱动也意味着一个实体拥有做出决策所需的数据,从而产生出色的结果。

B ecoming 数据驱动不仅仅是安装合适的应用程序和工具、雇用专门的数据专业人员团队、承诺进行重大的数据基础设施投资或运行一次性数据扫盲计划— 它更多的是让数据和分析成为您的业务战略、组织文化、流程以及所有层级的基础部分。

数据驱动型组织不仅认识到收集原始数据的重要性,而且明白他们不应该仅仅使用原始数据来制定业务决策。相反,他们收集、分析并从数据中获得洞察力,以解决业务问题、发现新的增长机会并提高盈利能力。本质上,数据驱动型组织将数据用于多种用例,如分析客户调查反馈和人口统计数据、观察客户行为、购买模式等。这类企业已经建立了一种渗透到整个组织的数据文化,而不仅仅是在某些职能部门或管理层。

根据我作为一名数据科学家的经验,我相信每个组织都会产生数据,并且可以成为数据驱动的组织,无论他们的业务规模、领域和服务提供如何(,只要他们采用正确的策略并正确地做事)。如果你不相信你的组织正在产生数据,一个好的开始是检查和思考你的业务的每个方面,你的客户类型,他们在不同的社交媒体平台上对你的评论,等等。我打赌你最终会发现可能的数据源和有价值的信息,你可以开始提取,汇总和分析,以推动你的业务向前发展。

我相信你现在明白“数据驱动是什么意思了。如果您仍然不明白,请花一分钟时间再次阅读前面的段落,然后继续阅读下面的部分,您将了解为什么数据对企业至关重要,以及如果不使用您的企业每天产生(或可能产生)的数据,您会错过什么。

为什么数据对每个企业都很重要

数据是每个组织最有价值的资产之一。这是一座金矿,也是一种极具战略意义的无价资源,有可能改变世界,改善我们的生活方式,发展业务,并实现更便宜、更快、更好的业务流程。

与传统公司不同,数据驱动的企业不会线性增长,我认为谷歌和亚马逊这样的大公司总是保持指数增长的原因之一是因为他们的商业模式从根本上讲是围绕数据构建的:

在你被令人震惊的数字冲昏头脑之前,你需要始终记住的一件关键事情是,数据“就像未开发的黄金”在其原始形式下可能不会提供很多信息或立即有所帮助。为了充分利用您的数据,您需要收集适当的数据,并将其转换为可重用的形式。也就是说,以下是每个组织都应该开始有效使用其业务数据的一些重要原因。

了解客户行为,改善品牌客户体验

我们生活在一个产品和/或服务数不胜数的世界里,你的现有/潜在客户有几个选择来投资。此外,产品供应商之间的竞争从未如此紧张。

提高品牌认知度并与你的业务相关的一个非常战略性的方法是了解你的客户对你的评价以及他们对你的品牌的看法。但是,如果没有数据,即使知道谁是你的客户,他们是否喜欢你的产品和服务,或者你的营销策略/活动是否有效,也变得相当具有挑战性。相比之下,你可以通过开展客户调查、阅读关于你的品牌的社交媒体评论/在线评论来轻松实现所有这些

一旦从客户那里收集到数据,您就可以分析这些数据点,以了解他们的痛点、他们对您的业务的看法、他们希望您提供什么产品或服务、您的组织需要改进什么,以及更重要的是,他们选择您而不是竞争对手的意愿。最终,从客户反馈中产生的见解将有利于客户关怀、交叉销售和追加销售服务,和/或产品创新。在大多数情况下,我认为商业利润与数据驱动、以客户为中心的战略性业务流程和决策密切相关。

例如,etflix 收集并分析客户数据,以了解哪种电影和节目受欢迎。之后,该公司利用获得的见解购买类似的脚本,假设订户也会根据他们以前的偏好喜欢新的脚本。该公司使用这种数据驱动的战略,在 2020 年疫情高峰期将其商业价值增加了超过500 亿美元。亚马逊还利用浏览历史、客户购买和偏好等消费者数据来推动其产品推荐引擎。这种数据驱动的战略产生了大约 35%的公司收入

做出更好、更明智的业务决策

决策是每个企业的一个重要方面,通常涉及几个企业高管、股东和企业主无法承受的数百万美元损失。有了正确的数据供您支配,您的组织将不必根据直觉、最佳猜测、错误假设、轶事判断、或不确定的消耗做出重大业务决策,即使在危机或压力时期。然而,您的业务数据将提供您做出明智的计算决策或了解绩效所需的事实、趋势、统计数字和见解。

我相信,一般组织中的每个部门都会产生(或能够产生)有价值的数据,这些数据可用于制定业务战略、推动增长和盈利。例如:

  • 企业高管需要数据来了解其市场中更重要的趋势,如制造、运输或客户价格敏感度的变化。
  • 产品团队需要数据来了解产品发布后最终用户的感受。
  • 销售团队需要销售业绩数据来了解和区分畅销产品和难卖产品。
  • 营销部门需要市场细分数据来识别更愿意从他们那里购买的客户,并加快销售结束过程。
  • 人力资源部门需要人员数据来更好地管理人才,并建立更有效的全球远程团队。
  • 不胜枚举。

通过不断地收集、监控和分析业务数据,组织可以更好地做出更明智的执行决策,并开发出影响底线的成功想法,从而实现更多增长或更有效的战略。从本质上说,数据驱动的决策能让你更好地有效管理风险,提高品牌成功的几率。

衡量业务绩效并了解员工参与度

除了帮助您了解客户行为、提高品牌认知度和做出更好的业务决策之外,分析业务数据还使您能够衡量业务绩效、建立更可靠的长期假设和充满活力的员工队伍。您可以深入业务数据,了解您是否达到了最重要的业务指标。例如,如今大多数职业球队都雇佣了一个数据分析师和收集者团队,利用数据来帮助支持和提高 球员在 赛场上的表现。

通过分析业务绩效数据,您还可以了解过去行之有效和行之无效的策略、带来最大回报的业务决策和/或政策、可以优化的业务运营和成本,以及业务的其他驱动因素。最终,您的组织可以利用所有的见解来重新制定战略、降低成本、改进您的服务、产品或您如何培养和吸引潜在客户。对于假设验证,一些企业考虑随机实验,如 A/B 测试,以测试业务决策的几种变化,分析并找出产生更好结果的替代方案或方法。

任何组织都如此执着于“客户为王”的信条,以至于他们只优先考虑让他们的客户保持独特和满意。这很容易理解,因为顾客是企业命运的核心。然而,我唯一的建议是,你永远不要忽视你的员工,因为他们和你的品牌一样重要:

  • 你的员工乐意和你一起工作吗?
  • 他们如何适应新的工作方法
  • 他们是否拥有高效工作所需的所有工具?
  • 他们是乐于在家工作还是苦苦挣扎?
  • 你的员工还和队友保持良好的工作关系吗?

事实是,虽然这些问题看起来非常简单,有些直接,但只有正确的数据才能提供答案,帮助您确定您的员工在工作场所是否面临影响他们的动力、快乐、士气或生产力的特定挑战/限制。

“当你的员工快乐时,他们更有可能建立更好的关系,让你的客户快乐—我相信你对这句名言很熟悉,对吧?嗯,更快乐的员工队伍与您的组织提供更好的客户满意度和品牌增长的能力密切相关。通过收集和分析正确的员工数据,并将他们的体验放在与客户体验相同的基座上,你会变得更加积极主动,并更好地克服员工的不愉快或脱离— ,不幸的是,这是企业界最顽固的问题之一。

结论

毫无疑问,数据是任何企业的核心。随着大数据的大规模增长以及好数据提供的可能性,它在业务各个方面的重要性与日俱增。我认为,在未来十年,组织定位自己、超越竞争、推动创新计划并取得市场领先地位的最佳方式之一是创新和创造性地使用数据。当然,为了实现这一目标,组织还需要培养一种支持数据驱动决策的文化。

在我的下一篇文章(即即将发布的本出版物的第二部分)中,我将讨论阻碍组织成为数据驱动的一些因素,以及组织如何克服这些挑战以成为真正的数据驱动。

为什么组织需要数据驱动(第二部分)

原文:https://towardsdatascience.com/why-organizations-need-to-be-data-driven-part-two-3808645a40d0?source=collection_archive---------27-----------------------

阻碍组织成为数据驱动型组织的障碍,以及克服这些挑战的建议

这是关于“为什么组织需要数据驱动”的第二篇文章,揭示了成为数据驱动的一些挑战,以及组织如何克服这些挑战以成为真正的数据驱动。这是企业主、企业家、公司企业以及任何想了解组织如何成为数据驱动的人的必读之作。

介绍

作者图片

欢迎阅读我关于“为什么组织需要数据驱动”的文章的第二部分。如果您还没有阅读我在第一篇文章中谈到的数据驱动意味着什么以及为什么数据对每个企业都至关重要,请在继续之前点击此链接阅读文章。

当我起草这份出版物的第一部分时,我认为谈论一些成为数据驱动的挑战而不仅仅是讨论组织如何成为数据驱动的会很好。我发现这一点特别重要,因为除非组织发现并解决我将在本文中提到的一些障碍,否则可能很难真正实现数据驱动或做出有效的数据驱动决策。

在这篇新帖中,我将触及一些阻碍组织成为数据驱动的障碍,并提供一些关于克服挑战以真正成为数据驱动的建议(无论业务类型、利基或行业)。

成为数据驱动型的挑战以及如何真正成为数据驱动型

虽然数据是一种宝贵的资源,如果有效使用,可能会对您的组织有益,但成为数据驱动型企业说起来容易做起来难,而且通常会带来一些令人头疼的问题。根据 TechCrunch 的这份最新调查,72%的大型组织未能创造出一种数据驱动的文化— 这些组织中的大多数都面临着一些挑战,这些挑战往往会干扰数据驱动战略的成功实施。

在回顾了几份研究材料、思考了我的经历并回顾了数据领域中有思想的领导者的观点后,我确定了以下一些组织遇到并需要克服或避免的常见挑战,以确保他们的数据驱动的决策工作和能力不会受到损害或阻碍。

PS:我还包括了克服每个挑战的可能方法。

缺乏数据基础设施、工具和技能组合

过去,大多数公司只存储和分析非常少量的数据,如法律文档、财务记录以及来自其业务的更多数据。但是,随着当今数字化和数据生成速度的急剧加快,现代组织通常会被大量数据流淹没,使用过去适用于小数据量的传统数据库系统和基础架构,不可能有效地存储如此庞大的数据量。可以想象,数据生成的速度和数量将会继续增长。在本帖中,国际数据公司(IDC)甚至预测,到 2025 年,世界数据将增长到 175 万亿千兆字节。

我愿意被纠正,但我坚信现代组织不缺乏数据。然而,大多数组织缺乏的是有效存储/管理不断增长的数据速度、数量、种类和复杂性所需的基础设施和底层工具,以提高业务利用率。有时,一些组织最终会在他们几乎不需要的工具/基础架构上投入大量资金,仅仅是因为他们没有正确的经验来选择适合其业务的适当工具。我在这里试图传递的主要观点是,即使数据是每个组织的业务金矿,如果没有正确的数据基础架构、工具、解决方案、技能集、治理框架和流程,您也无法真正释放其全部潜力。

因此,每个组织都需要正确的专业知识或技能来评估其数据就绪性,设置数据治理策略,从当今市场上存在的无数工具和基础架构中选择适合其组织需求的适当的商业智能(BI)工具、数据存储和管理工具、云解决方案和服务等。在每个组织中有两种培养数据相关能力的主要途径:您可以建立一个专门的数据团队或雇用一名数据专家来正确地指导您的组织走向数据驱动并建立正确的基础架构(我莫,选择完全取决于您,因组织而异)。

例如,如果您的组织没有足够的预算来建立数据团队,一个好的开始方式是与数据顾问合作,并最终随着时间的推移而扩展。一旦您聘请了合适的数据专家或投资组建了数据团队,您的组织就可以更轻松地确保数据的完整性和质量,培训其他团队成员了解利用数据进行业务决策的重要性、可能的可用数据点、数据的存储位置、如何使用数据、可以使用哪些工具等。在某种程度上,这也有助于在您的组织中培养良好的数据文化并提高数据素养。

缺乏数据驱动的文化和全组织的认同

组织和数据驱动型组织之间的另一个挑战是缺乏以数据为中心的文化,这通常以不同的形式表现在新的小公司和较大的组织中。通常,缺乏组织范围内的认同可能是由于利益相关者的漠不关心、对基于数据做出决策的公然抵制、个人偏见、偏见等等。在 EY 的调查中,47%的受访者提到调整组织文化以整合大数据具有挑战性。

这种挑战通常在大型和相对较老的组织中更为明显,这些组织已经有了组织文化和实践,领导者认为他们拥有推动业务增长所需的业务知识和洞察力,即使不看数据也是如此。在某些情况下,这些较大的组织甚至投资并建立了数据基础设施和团队,即使他们不确定如何适当地适应并整合“数据驱动”的心态到他们的公司,数据驱动方法的能力,或解决业务问题的数据团队。初创公司和新公司更有活力,但它们也不会在斗争中被遗忘。哈佛商业评论的 2021 年统计数据显示,一些组织正在努力取得进展,并在打造数据驱动的文化、使用数据推动创新以及将数据作为宝贵资产进行管理方面失去了优势。

采用数据驱动型文化的斗争是真实的成为数据驱动型组织需要的不仅仅是正确的业务战略和技术。我相信它总是从最高层开始,每个公司都需要杰出的领导者和利益相关者,他们可以通过在公司、他们自己和员工中宣扬、实践和倡导数据驱动的文化来改变组织的文化。通常,这些数据倡导者应该始终引领潮流,将数据驱动的方法传播到组织的每个角落,付出更多努力来展示数据的价值,并让企业主了解数据驱动决策的好处和深远影响。 如果没有数据驱动方法的领导,一个组织及其员工真正采用数据驱动的文化可能会很有挑战性(如果不是不可能的话)。

为了更进一步,组织应该鼓励各级员工试验数据,提出数据驱动的业务问题,并根据他们的见解采取行动。你应该让每个人都保持好奇心并分享他们的见解,而不是要求员工低着头,以通常的方式开展业务。此外,您组织中的关键决策者应该总是愿意接受员工的建议,因为这在使每个人都非常自觉并鼓励人们将数据融入日常工作和生活中起着重要作用。我喜欢 Gartner 在他们的帖子:数据只能让企业走到这一步——真正的驱动力是人。”

总之,你不应该建立一个只有业务领导或员工支持数据驱动文化的组织。虽然建立和采用数据驱动的文化和战略需要大量的时间、努力和承诺,但我相信创建数据驱动的文化是一个非常集体和包容的过程,应该让公司的每个人都参与进来。这样,就更容易推动公司范围内规范的实质性转变,加强数据在组织中的有用性、重要性和力量。

数据收集和使用前没有策略

成为数据驱动型并非偶然或巧合,因为数据无处不在,组织更有可能陷入收集数据的网络,而没有真正考虑他们想要对所有数据做什么。这是一种极具挑战性的方法,通常会导致数据债务,从而阻止组织真正成为数据驱动型组织,并阻碍其真正使用数据来满足特定业务需求、产生实际价值或实现战略目标的能力。在某些情况下,企业领导人和高管往往低估数据债务的影响,主要是因为他们没有意识到它会影响数据相关的计划,并在某种程度上拖累更广泛的关键投资和业务运营。

组织可以通过事先制定清晰的数据收集和使用策略来避免淹没在数据中,而不仅仅是收集数据而不知道如何处理数据。虽然创建数据和分析战略没有放之四海而皆准的方法,但我认为一个好的战略应该以为中心,定义需要回答的业务关键型问题并确定需要应对的挑战,评估您的数据需求和准备情况,定义如何获取、收集、保护数据并将其转化为可操作的见解,评估您的技术基础架构要求、数据能力和治理

如今,互联网上有大量可用信息,如果没有正确的策略,可能不容易识别和获取对您的组织有益的具体、准确的数据。在数据收集之前有一个策略的总体思想是一个基本元素,适用于人类生活的几乎每个方面。例如,建造一个新公寓需要一个合适的计划和架构来指导项目的执行。

此外,组织还需要通过理解和采用 GDPR 机构指定的正确的隐私法规和规则来创建一个更加透明的世界。这有助于消除企业和客户之间日益增加的不信任差距、市场操纵风险、侵犯隐私、垄断等。通过合规,组织还可以避免制裁、高额罚款以及失去运营许可证的可能性。

我想用这种联系来总结这一部分—“组织需要定义良好的数据和分析策略来获取正确的数据,拥有正确的数据是成为数据驱动型组织并在这个新的数据驱动型世界中取得成功的最基本的先决条件之一

结论

通常情况下,业务数据提供了有价值的见解,你需要了解你的公司是否在进步,你的竞争对手比你做得更多,你的客户如何看待你的品牌,等等。如果您的组织不是真正的数据驱动型组织,那么您很可能会输给已经将数据作为战略资源和业务流程不可或缺的一部分的数据驱动型组织。

在今天的数字世界中,取得进步并让自己成为赢家的一个极好的方法是检查本文中提到的挑战,解决您的组织目前可能面临的任何限制,然后应用我在本文中建议的原则和技术。尽管如此,请始终记住,成为一个数据驱动的组织不会一夜之间发生— 这是一个深思熟虑的持续旅程,随着时间的推移会带来更好的结果。

我想用这句话来结束我的演讲:“在没有数据的情况下经营企业或做出商业决策,就像在街上瞎跑一样没有一个现代组织希望永远盲目地运营——现在是时候开始掌握和使用数据来推动您的组织向前发展了。我祝你在成为数据驱动的旅程中一切顺利。

人工智能项目可以受益于多重云

原文:https://towardsdatascience.com/why-organizations-should-consider-multi-cloud-for-ai-and-how-to-make-it-happen-d9849757b09c?source=collection_archive---------41-----------------------

为什么组织应该为他们的 AI/ ML 项目考虑多云化策略,以及如何实现它

图像由保罗·西奈拍摄,灵感来自于克劳迪奥·泰斯塔social.cut卢卡·巴乔

随着组织将其人工智能(AI)解决方案迁移到云,其他组织已经开始实施人工智能或机器学习(ML)多云战略。从以更低的成本推动人工智能驱动的业务解决方案到获得灵活性,采用多云策略(使用几家公共云提供商来管理您的基础设施和应用程序)具有显著的优势。但是采用多云策略是一项复杂的任务。

让我们更详细地看看为您的 AI 和 ML 项目采用多云化策略的一些优势;指出一些挑战,并强调旨在克服这些挑战并推动成功的方法。

多云人工智能战略的优势

采用多云策略的公司可以避免被单一云服务提供商所束缚。一个组织开发的所有知识产权(AI 或 ML 模型、分析、流程、规则、应用程序,甚至数据库)都被锁定并依赖于云提供商的基础设施和产品。这使得将您的知识产权从一个服务提供商迁移到另一个服务提供商变得极其困难。

一旦您构建了一个利用云提供商的许多产品的应用程序,重新配置该应用程序以在另一个云上本机运行可能会非常昂贵和困难。例如,AWS 提供的一些特定产品无法在微软 Azure 或谷歌云平台上开箱即用。因此,迁移到另一个服务提供商可能需要使用另一个服务提供商的等效产品、集成类似的第三方付费产品或使用开源软件来重建您的应用程序的功能;或者完全取消这种功能。将数据从一个云转移到另一个云也极具挑战性。

多重云允许组织将每个云服务提供商的特定产品与其特定的人工智能数据需求和应用程序流程要求相匹配。例如,一个组织的数据科学家可以轻松地扩大或缩小他们的存储容量,并优化计算能力,以使用特定的云服务提供商运行他们的 ML 算法。另一方面,应用程序开发人员可能会选择将他们的应用程序部署在另一个云上,该云托管他们喜欢的数据库,或者更适合处理特定的消费者活动工作负载。

在选择云策略时,带宽和延迟是需要考虑的重要因素。这对于快速响应时间对业务成功至关重要的用例尤为重要。例如,一个在几秒钟内分析成千上万个车牌的车牌识别应用程序无法承受任何延迟。同样,使用 AI 图像识别进行产品质量控制的制造生产线也需要快速的响应时间,以避免产品缺陷。对于此类用例,访问地理上分散的云提供商为企业提供了利用邻近性来减少延迟和降低带宽成本的可能性。

在多云服务提供商上运行您的 AI 项目可提供额外的可靠性,进一步降低停机风险,并为组织提供其业务用例所需的业务连续性。虽然云服务提供商提供不同级别的恢复和冗余,并且这些天很少遇到基础设施崩溃,但事故仍然会发生。组织的业务运营仍然可能因云中断而受到严重损害,尤其是在任务关键型组织中。假设您的一个云提供商遭遇了中断。在几个不同的云上运行你的人工智能应用程序可以让你快速(在某些情况下自动)将你的人工智能应用程序切换到另一个云提供商,并且完全没有市区的体验。

多云策略可以通过多种方式为您提供这种额外的灵活性。您可以选择在同一地区(或附近)拥有不同的云提供商,或者在几个地区拥有不同的云提供商。公平地说,公司也可以使用其他不基于多云供应商的拓扑来解决这些高可用性问题。他们可以选择在单个地理区域使用单个云提供商,但使用不同的可用性区域(一般来说,可用性区域被视为单个数据中心),或者使用分布在不同地理区域的单个云提供商。

多云人工智能战略的挑战

然而,运营多云人工智能项目会带来多种运营和管理挑战。在单一云平台上快速发展需要专门的资源和大量培训。管理多个云上的人工智能操作会增加十倍的复杂性。这需要雇佣云计算专家,并在培训上投入更多。它还要求组织良好的跨职能团队跨多个云设置、监控、优化和保护他们的人工智能应用。

每个云服务提供商都有不同的基础架构、要求、规范和安全设置程序,这使得管理这些不同的云基础架构成为一项艰巨的任务。当发生变化时,需要在每个云上手动更新设置。

很少有组织能够负担得起管理云计算环境所需的专业知识和费用。即使他们可以,他们也会遇到下一个障碍:普遍缺乏机器学习和云基础设施专家。因此,许多组织不具备创建和管理多云计算人工智能解决方案所需的内部专业知识,并发现自己在努力追赶邻居。

为特定工作匹配价格最低的云提供商也是一个优势。但是,管理多个云提供商定价模式、服务水平协议(SLA)和合同很快就会变成一场噩梦。

更简单的多云解决方案

面临这些挑战的企业应该考虑基于云的数据运营平台,该平台具有 MLOps 功能,可在多个云基础设施上管理其 AI 和 ML 项目。这些平台中的大多数都提供了一个中心框架和界面,通过它可以设置、部署、监控、供应和保护组织的 ML、AI 和分析应用程序,同时管理多云、互操作性和可扩展性,从而为组织的 AI 项目提供最终和急需的敏捷性。培训和采用也高度简化。

如今,市场上有许多具有 MLOps 功能的 DataOps 平台。更好的方法支持统一的 ML 方法(MLOps 部分),该方法可以在任何云环境(无论是公共云环境还是私有云环境)中无缝运行,并为您完成大量云基础架构管理工作(DataOps 部分)。它们在不同的云中自动设置、调配和维护您自己的环境,使组织能够轻松采用多云战略,并随着业务和应用需求的变化对其进行微调。

更先进的平台在整个云中保持一致的数据、流程、业务规则和应用实例,使组织能够在异构云平台之间实现完全的敏捷性和工作负载移动性。随着数据的增长,这些平台会在需要的地方适当地存储数据,保护数据,并确保数据始终为组织可能拥有的多个人工智能甚至分析项目做好准备。

正如我们在上面看到的,确保为每个云提供商、项目和数据类型正确设置安全设置是一项艰巨的任务。一种更简单的方法是在一个中心位置管理您的安全设置。您选择的平台应该会自动反映这些设置以及整个云基础架构的变化。

这些平台可以帮助组织节省云开支。组织不应该为了获得最佳可用价格而货比三家,了解不同的定价选项,并担心灵活的合同、支付灵活性和服务,以确保基于其特定需求的最佳交易。寻找一个平台,为您的所有云基础架构提供清晰一致的低价。这种定价结构将反映您组织的需求,并且只会随着这些需求的增加而变化。

然而,需要注意一个权衡。尽管您从服务提供商基础架构中获得的灵活性越大,但这是以失去功能为代价的。这些平台提供的产品和功能少于服务提供商本身。

当选择多云还是单云或多云 MLOps 策略时,组织应仔细权衡每种方法的优势和劣势,并考虑他们的需求可能会随着时间的推移而变化,以避免令人头疼的迁移费用,并为未来做好更好的准备。

在本文中,我们关注的是公共多云,而不是包括公共云和私有云的混合云。公司采用混合云战略的原因不同于单一的公共云。然而,混合云提出了许多与公共云相似的问题;它们通常更加复杂。

为什么并行培训可能不适合您

原文:https://towardsdatascience.com/why-parallelized-training-might-not-be-working-for-you-4c01f606ef2c?source=collection_archive---------15-----------------------

理解大数据

神经网络并行训练的动机、益处和注意事项指南

介绍

有几种并行训练神经网络的方法。

  1. 模型间并行性,也称为并行化超参数搜索
  2. 数据并行性
  3. 模型内并行性,又称模型并行性
  4. 流水线并行

在这篇文章中,我们将探讨两种最常见的并行方法,模型间并行和数据并行。我们将在 CIFAR10 数据集上使用一个简单的 CNN 模型来演示这些技术。我们将在运行 AWS 深度学习 AMI 和 Pytorch (1.7.1)的 4 GPU 机器上训练这个模型

并行培训的优势

并行训练最明显的优势是速度。在超参数搜索的情况下,同时评估多个配置允许我们快速缩小最有希望的选项。

通过分布式数据并行(DDP)训练,模型参数的副本被放置在每个可用的 GPU 上,并且每个副本被提供给整个数据集的不同子集。

每次批量评估后,副本的梯度将被同步和平均。基于这些同步的梯度来更新模型副本的权重。

这增加了模型使用的有效批处理大小,允许它在比单个 GPU 的内存容量更大的批处理上进行训练。随着训练数据集大小的增加,DDP 成为一种保持训练时间合理的方法。

批量的重要性

使用较大的批量会导致更快的训练,因为网络能够以更少的步骤迭代整个数据集。然而,经验证据表明,更大的批量倾向于收敛到损失面的尖锐最小值,这导致泛化能力差[ 1 ]。相比之下,批量越小,最小值越宽、越平,具有良好的泛化能力。

让我们通过对一组候选批量运行超参数搜索来测试这一点。我们将使用恒定的学习速率 0.001 在 CIFAR10 上训练我们的 CNN10 个时期

我们将并行运行 Comet Optimizer ,并作为命令行参数输入一个 Optimizer 配置文件。

comet optimize -j 4 comet-pytorch-parallel-hpo.py optim.config

并行化超参数优化的源代码

这里的j是我们想要启动的并行进程的数量。你可以在这里找到更多关于彗星优化器的细节

optim.config文件只是一个 JSON 对象,包含我们的参数搜索网格。

{
   # We pick the Bayes algorithm:
   "algorithm": "random",
   # Declare your hyperparameters in the Vizier-inspired format:
   "parameters": {
      "batch_size": {
         "type": "discrete", 
         "values": [8, 32, 128, 512]
      },
   },
   # Declare what we will be optimizing, and how:
   "spec": {
     "metric": "val_loss",
     "objective": "minimize",
   },
}

左:每个批量配置的运行时间(秒),右:每个批量配置的相应测试准确度。来源:comet . ml

当查看折线图时,我们看到批量越大,训练运行时间越短。然而,较大的批量也会导致更差的训练误差和测试精度。事实上,批量越小,测试准确度越好。这是一个问题,因为最小批量的完成需要将近8 倍的时间

完成最小批量需要将近8 倍于的时间。

提高学习速度

使用大批量的一个关键方面是调整学习速度。一般的经验法则是遵循线性缩放规则【2】。这意味着当批量增加 K 倍时,学习率也必须增加 K 倍。

让我们在超参数搜索中对此进行研究。让我们根据批量大小来线性调整我们的学习速度。我们将使用批次大小 8 作为我们的缩放常数。

这些比例学习率实验的源代码

左图:具有成比例学习率的不同批量的训练损失曲线,右图:具有成比例学习率的配置的测试精度。来源:comet . ml

这似乎起了作用。根据批量调整学习速度可以缩小泛化差距!让我们将这个想法与我们的分布式数据并行方法结合起来。

使用更大的有效批量

通过 DDP 训练,数据集在多个可用的 GPU 之间进行划分。

让我们使用 Pytorch 分布式数据并行模块运行一组实验。该模块处理将模型复制到每个 GPU,以及跨 GPU 进程同步梯度和更新权重。

使用 ddp 模块非常简单。将您的现有模型包装在 DDP 模块中,并将其分配给 GPU

model = Net()
model.cuda(gpu_id)
ddp_model = DDP(model, device_ids=[gpu_id])

我们将使用 DistributedSampler 对象来确保数据正确地分布在每个 GPU 进程中

# Load training data
    trainset, testset = load_data()
    test_abs = int(len(trainset) * 0.8)
    train_subset, val_subset = random_split(
        trainset, [test_abs, len(trainset) - test_abs]
    )

    train_sampler = torch.utils.data.distributed.DistributedSampler(
        train_subset, num_replicas=world_size, rank=global_process_rank
    )

    trainloader = torch.utils.data.DataLoader(
        train_subset,
        batch_size=PER_REPLICA_BATCH_SIZE,
        sampler=train_sampler,
        num_workers=8,
    )
    valloader = torch.utils.data.DataLoader(
        val_subset, batch_size=PER_REPLICA_BATCH_SIZE, shuffle=True, num_workers=8
    )

最后,使用 DDP 包装的模型运行训练循环

for epoch in range(args.epochs):
   train_loss = train(ddp_model, optimizer, criterion, trainloader,       epoch, gpu_id)
   val_loss, val_acc = evaluate(ddp_model, criterion, valloader, epoch, gpu_id)

DDP 示例源代码

在我们的例子中,每个 GPU 接收四分之一的数据集。当我们以这种方式运行训练时,我们的有效批量大小是 GPU 数量和每个 GPU 的批量大小的乘积。因此,当我们将每个 GPU 的批处理大小设置为 8 时,我们的有效批处理大小实际上是 32。我们可以通过将 DDP 训练运行与批处理大小为 32 的单个 GPU 训练运行进行比较来验证这一点。注意曲线看起来是多么的相似,并且跑相似的训练步数。这些曲线表明,即使我们在每个 GPU 进程中使用较小的批量,我们的模型性能仍然依赖于的有效批量

把所有的放在一起

让我们结合我们所学的学习率调整,重新运行 DDP 培训。

左图:使用比例学习率和 DDP 训练的训练损失,右图:使用比例学习率和 DDP 训练的测试 Acc。来源: Comet.ml

看起来,即使是学习率缩放也有其局限性。当我们将批量增加到某个值时,训练得到了改善,在此之后,我们看到我们的测试精度开始下降。

警告

理论上,将训练分布在多个 GPU 上应该会加快训练模型所需的总时间。实际上,情况并非总是如此。跨多个 GPU 进程同步梯度会导致通信开销,这对于最小化是不可忽视的。

在下面的面板中,我们将批量为 32 的单个流程培训运行的运行时间与具有相同有效批量的 DDP 培训运行的运行时间进行了比较。单个流程运行需要 73 秒才能完成,而 DDP 培训运行几乎比慢八倍,需要 443 秒才能完成。

这可能是因为每次我们在训练代码中调用loss.backward()时,梯度都是同步的。进程之间的持续通信导致总体运行时间增加。这是设置 DDP 培训时需要注意的一点。如果您在多机器设置中运行您的实验,请确保网络带宽足以处理发送和接收整个模型的检查点数据的每个进程。

加速这个过程的另一个方法是改变梯度的同步时间表,但是这超出了本报告的范围。

单一流程培训与分布式培训的培训损失曲线。来源: Comet.ml

结论

我们希望这份并行培训入门指南对您有所帮助。在随后的文章中,我们将讨论如何优化您的分布式培训代码,以充分利用您的计算基础设施。

点击此处阅读完整的交互式可视化报告

Comet.ml —轻松跟踪、比较和调试您的模型!

如果你还没有试用过 Comet,它是一个很棒的工具,可以让你跟踪、比较和调试你的 ML 模型!

它可以与 Colab、Jupyter 笔记本和脚本一起使用,最重要的是它是 100%免费的!

入门 实验跟踪 今天!

今天免费试用彗星!

参考

[1] Keskar,Nitish Shirish 等,“关于深度学习的大批量训练:泛化差距和尖锐极小值。” arXiv 预印本 arXiv:1609.04836 (2016)。

[2] Goyal,Priya 等,“精确的大型迷你批次 sgd:在 1 小时内训练 ImageNet。” arXiv 预印本 arXiv:1706.02677 (2017)。

为什么需要游戏玩家

原文:https://towardsdatascience.com/why-player-of-games-is-needed-a01505c4bad7?source=collection_archive---------5-----------------------

游戏玩家(PoG)和 AlphaZero 的比较

国际象棋和扑克图片|作者图片

大家好,今天我们将比较游戏玩家 (PoG)和 AlphaZero 。PoG 是 DeepMind 开发的新 AI 智能体,是同类产品中第一个在完美和不完美信息游戏中都实现高水平性能的智能体。

在完美信息博弈中,每个参与者都知道博弈中的所有信息。对于国际象棋和围棋来说,了解游戏中的所有信息意味着玩家可以看到自己和对手的棋子。

在不完善的信息博弈中,玩家无法看到所有的信息。对于扑克,玩家看不到对手的牌,这增加了难度,因为你并不总是知道玩家是否在说实话。对于这样的游戏,人工智能很难学习,因为它没有可靠的信息来源,只能依靠自己的判断。

传统上完美信息和不完美信息游戏机器人使用不同的方法。完美信息游戏 ai 如 AlphaZero 使用蒙特卡罗树搜索 (MCTS)。然而成功的不完全信息博弈人工智能使用博弈论推理。这种方法上的差异是因为算法不适合另一种类型的游戏。AlphaZero 在众多完美信息游戏中实现了最先进的游戏性。然而,对 AlphaZero 最大的批评之一是它无法在不完美的信息游戏中表现良好,这使得 PoG 成为广义人工智能的又一次飞跃。

AlphaZero 描述

首先,我将简要介绍一下什么是 AlphaZero 以及它是如何工作的。关于 AlphaZero 的更深入的解释,请查看我的另一篇博文这里,在那里我将 AlphaZero 和变形金刚结合在一起。

AlphaZero 是一种强化学习算法,学习玩完美信息游戏。AlphaZero 之所以如此引人注目,是因为它完全通过自我游戏实现了最先进的游戏。这一特性让许多人将 AlphaZero 视为长期规划端到端学习能力的证明点。

AlphaZero 和不完美博弈

AlphaZero 在计划采取何种行动时,结合使用了神经网络(NN)和 MCTS。这种方法对于完美信息游戏非常成功,因为在给定足够计算能力的情况下,对于这种类型的游戏,MCTS 理论上与 MiniMax 搜索算法收敛。MiniMax 是一种贪婪的搜索算法,它搜索博弈树的所有可能的移动,理论上可以在给定足够计算能力的情况下“解决”所有完美信息博弈。AlphaZero 使用 MCTS 而不是极大极小,因为现代的计算限制使得极大极小对于像国际象棋和围棋这样的高复杂度游戏来说是不可行的。然而,MCTS 在不完美信息博弈中表现不佳,因为它无法保证收敛于 T2 纳什均衡。

博弈树对于完美信息博弈非常有用,因为理论上你可以知道每一个行动的反应,因为这类博弈处于纳什均衡。然而,对于不完美的游戏,这种逻辑是不成立的。为了更好地理解这个逻辑失败的原因,让我们以扑克为例。在扑克游戏中,玩家可以虚张声势,即使他们的牌不比对手好,他们也有能力获胜,这给游戏增加了很大的不确定性。由于这种额外的不确定性,除非你在游戏中有最好的牌,否则你永远无法确定自己是否会赢,这使得正确遍历游戏树变得非常困难。正因为如此,AlphaZero 不适合不完美信息博弈,因为在使用 MCTS 时结果不一致。

PoG 描述

PoG 使用神经网络和生长树反事实后悔最小化(GT-CFR)来规划要采取的行动。GT-CFR 是反事实后悔最小化 (CFR)算法的变体。GT-CFR 是一个两步算法,使用 CFR+ 来优化其策略,以最小化遗憾,随后是一个扩展阶段,在该阶段中,它扩展游戏树,类似于 MCTS。

更新策略阶段

为了更好地理解这个算法,我们先来看看策略优化阶段。CFR 算法家族使用最小化遗憾的思想作为最优策略。GT-CFR 使用 CFR+来最小化遗憾,因为它是普通 CFR 算法的前身,并且具有更快的纳什均衡收敛。CFR+算法对后悔的定义是;

“事后来看,通过遵循一些替代策略可以获得多少额外效用的衡量”【9】

也就是说,它寻找平均来说可能会产生更好结果的行动。

为了最小化遗憾,CFR+使用遗憾匹配+搜索完整的公共树。后悔匹配+是 CFR+对普通 CFR 算法的一个实质性升级。在后悔匹配+中,我们归一化累积后悔值 Q 来更新策略。通过以这种方式更新策略,我们有效地解释了不完美信息博弈中的不确定性。

后悔匹配+政策方程式|作者图片

Q 值是对遗憾匹配+的改进之一,因为它允许在向前传递期间计算累积遗憾,而不需要存储遗憾。为了确定累积遗憾,我们使用下面的等式。

累积后悔方程式|作者图片

通过查看所有其他选项,看看是否存在任何更好的举措,可以发现瞬间后悔。为了确定瞬间后悔,我们使用下面的等式。

瞬间后悔方程式|作者图片

PoG AI 使用价值和政策网络(CVPN)来预测反事实的价值和政策。在叶节点上,我们对 CVPN 进行查询,允许它充当 oracle。以这种方式使用 CVPN,使得扩展阶段成为可能,因为如果没有 CVPN,我们将无法预测之前未见过的节点的反事实价值和策略。

CVPN 方程|作者图片

CVPN 图|图片来自https://arxiv.org/pdf/2112.03178.pdf

在 CFR+算法中,线性加权策略平均通过基于迭代次数向遗憾添加自然衰减来帮助在迭代过程中平滑策略。为了帮助说明线性加权策略平均对策略更新阶段的积极影响,这里有两个图表,以便您可以比较使用策略和不使用策略的情况。

无线性加权保单平均值的保单|作者图片

采用线性加权策略平均值的策略| |作者图片

正如您在上面的图表中所看到的,在更新阶段使用线性加权策略平均值时,策略变化更加稳定。线性加权策略平均使用以下等式。

线性加权策略平均方程|作者图片

GT-CFR 政策更新阶段

树扩展阶段

既然我们已经了解了 CFR+是如何在这个算法中用来优化策略的,我们就来看看树扩展阶段。如果您熟悉 MCTS,树扩展阶段应该与您非常相似。当遍历游戏树时,使用下面的等式来确定最佳路径。

扩展节点选择方程|作者图片

pUCT 方程式|作者图片

当遍历游戏树时,当遇到一个叶子节点时,我们扩展 k 个子节点。一旦树被展开,我们的节点访问计数被更新以用于 pUCT 等式。

GT-CFR 扩展流程图|图片由作者提供

扩展游戏树的想法对 GT-CFR 来说是新的,并提供了与 MCTS 类似的好处,在那里我们可以通过用神经网络指导树搜索来玩高复杂度的游戏。

GT-CFR 扩展阶段

谢谢

现在你知道了。希望你现在能更好地理解 PoG 和 AlphaZero 之间的区别,以及为什么 PoG 是广义人工智能的又一进步。

感谢阅读。如果你喜欢这样,可以考虑订阅我的账户,以便在我最近发帖时得到通知。

参考

为什么生产机器学习会失败——以及如何修复它

原文:https://towardsdatascience.com/why-production-machine-learning-fails-and-how-to-fix-it-b59616184604?source=collection_archive---------19-----------------------

通过避免这些常见的陷阱,成功部署您的 ML 模型

图片由 Unsplash 上的雅各布·基索提供。

机器学习已经成为任何严肃的数据团队的必备工具:增强流程,生成更智能、更准确的预测,并普遍提高我们利用数据的能力。然而,在理论上讨论 ML 的应用与在生产中实际应用 ML 模型大相径庭。

巴尔摩西 、CEO 蒙地卡罗、 马努慕克吉 、工程副总裁— AI、数据和分析、8x8、 走过 共同挑战*对应解决方案 让 ML 成为你的力量倍增器*

从在谷歌地图上生成你的周末自行车路线,到帮助你在网飞发现下一个值得狂欢的节目,机器学习(ML)已经远远超出了理论上的时髦词汇,成为我们大多数人每天都在使用的强大技术。

对于现代企业来说,对 ML 的需求从未如此强烈。但是,尽管某些行业已经被人工智能带来的自动化所改变——想想金融领域的 欺诈检测 和电子商务领域的 个性化产品推荐——残酷的事实是,许多人工智能项目还没有公开就失败了。

2020 年 10 月, Gartner 报告称只有 53%的项目从原型阶段进入生产阶段——而且是在具有一定人工智能经验的组织中。对于仍在努力发展数据驱动文化的公司来说,这个数字可能要高得多,据估计的一些失败率飙升至近 90%。

谷歌、脸书和亚马逊等数据优先的科技公司正在用 ML 改变我们的日常生活,而其他许多资金雄厚、才华横溢的团队仍在努力实现他们的计划。但是为什么会这样呢?我们如何解决这个问题?

我们分享现代数据团队在大规模采用 ML 时面临的四个最大挑战,以及如何克服它们。

实际业务需求和 ML 目标不一致

当你的商业目标和 ML 目标不一致时,你所有最好的计划都注定会失败,就像你用陈旧数据训练的模型一样。图片由 Unsplash 上的 Charles Deluvio 提供。

第一个挑战是战略性的,而不是技术性的:从解决方案开始,而不是从明确定义的问题开始。

随着公司竞相将 ML 纳入他们的组织,领导者可能会雇用数据科学家和 ML 实践者来自动化或改进流程,而没有对哪些问题实际上适合 ML 解决的https://developers.google.com/machine-learning/problem-framing/good有成熟的理解。即使业务问题非常适合 ML,如果没有一个共享的成功定义,项目可能会在实验模式中被搁置数月,而利益相关者等待一个理想化的机器般的完美水平,这是永远无法达到的。

机器学习不是魔术,它不会完美地解决每个问题,本质上应该随着时间的推移继续进化。有时,一个模型仅仅达到与人类相同的结果,这是一个有价值的项目——错误和所有。

在开始任何项目之前,询问你的团队或利益相关者:我们正在试图解决什么业务问题?为什么我们相信 ML 是正确的道路?这个项目试图达到的商业价值的可测量的阈值是什么?“足够好”是什么样子的?**

如果没有这些清晰的、共享的定义,许多有价值的 ML 项目将永远无法进入生产,宝贵的资源将被浪费。使用 ML 解决一个商业问题,而不仅仅是开始一个 ML 项目来检查 ML 框。

不一般化的模型训练

有了清晰定义的业务问题和目标成功度量,您的潜在陷阱变得更加技术性。在模型训练阶段,与您的训练数据或模型拟合相关的问题是未来失败的最大可能原因。

模型训练 的目标是开发一个模型,该模型可以进行归纳,或者在给定新数据时做出准确的预测,因为它了解数据点之间的关系,并且可以识别趋势。您的训练数据集应该干净、大小合适,并且能够代表模型在生产中需要处理的实时数据。没有人在生产环境中见过干净的数据。仅仅为了准备好数据,就要花费大量的时间进行清理、标记和特征工程。

代表性的训练数据也很关键:如果训练数据没有反映模型将遇到的实际数据集,那么一旦进入测试或生产阶段,模型可能就无法运行了。

训练期间可能发生的另一个问题是过度适应和适应不足。当一个模型学习太多并且产生与你的训练数据太接近的输出时,过度拟合就发生了。**

拟合不足恰恰相反-您的模型没有学到足够的知识,甚至不能对训练数据本身做出有用的预测,更不用说它在测试或生产中会遇到的新数据了。

测试和验证问题

当您测试和验证您的模型时,合并多个数据流并进行更新以提高性能可能会带来新的挑战。数据源、模型参数和 特征工程 的变化都会引入误差。

这也可能是您在模型中检测到过度拟合或欠拟合的阶段——在训练期间表现出色但在测试期间未能产生有用结果的模型可能是过度拟合的。

即使在像谷歌这样有大量人工智能工程师的公司,你的产品模型中的惊喜也会出现。

部署和服务障碍

部署 ML 项目很少是简单的,团队通常不能使用一致的工作流来做到这一点——因为 ML 项目解决了广泛的业务问题,所以有类似的广泛的方法来托管和部署它们。例如,一些项目需要定期进行批量预测,而其他项目则需要在应用程序发出使用模型进行预测的 API 请求时按需生成和交付预测。(这是为什么使模型适用于不同用例具有挑战性的部分原因,无论它对那些认为 ML 模型比狭隘的功能更有魔力的高管来说听起来多么有吸引力。)

此外,一些 ML 项目可能需要大量资源,跨职能团队需要就部署的优先级达成一致。工程师们只能生产这么多东西,正如我们已经讨论过的,ML 项目不仅仅是模型和算法:大多数项目需要基础设施、警报、维护等等来成功部署。

这就是为什么在一开始就清楚地阐明业务问题,就成功的样子达成一致,设计端到端的解决方案,并对您的 ML 项目相对于其他优先事项的价值有一个共同的理解是如此重要。没有这个战略计划,您的项目可能永远得不到最终投入生产所需的工程资源。

仅举一个例子,网飞从未将其百万美元大奖的推荐算法投入生产,因为获奖模型实现起来很复杂——而是选择了另一个更容易集成的提交。

生产中可扩展 ML 的策略

机器学习不是魔法,但它很强大——而且经常被误解。有点像这个纸简笔画。图片由 Unsplash 上的 Kobu 机构提供。

除了战略规划和人员配备,你还可以采取一些具体的步骤来帮助扩大你的 ML 生产规模。

倚入云端

如果你的团队在本地工作而不是在云中工作,是时候改变了。在云中工作是保持模型培训和部署工作流程同步的“粘合剂”。大多数供应商和开源工具都是为云开发的,一旦有了云,自动化过程就容易多了。测试、培训、验证和模型部署需要是一个可重复的过程,它不应该从本地 Python 代码进入生产环境。

利用开发运维方法

正如我们已经讨论过将 DevOps 实践应用于数据,像 设置数据 SLA和沿着可观察性支柱测量数据健康,ML 团队可以跟随 DevOps 的脚步,通过实现 持续集成(CI)和持续交付(CD) 模型,同时引入持续培训(CT) 。通过设置敏捷构建周期和工具,ML 团队可以更快地将变更交付到代码库中,并提高整体性能。

类似于 DevOps 最佳实践,ML 团队应该使用容器化来一致地在任何类型的设备上运行软件,并使工程师的工作生产化更简单。保持一致和可见的构建过程,更频繁地部署较小的更改,可以让团队更顺利地工作,并更深入地了解什么工作得好,什么不好。可见性还有助于潜在的代码“看门人”信任构建过程,并加速 ML 团队的工作流程。

投入时间建立战略 MLOps 团队和流程将有助于降低项目在生产前停滞的可能性,并使持续改进变得可行,从而为每个项目的长期成功奠定基础。

投资于可观察性和监控

最后,机器学习的首要规则是,你的输出只会和你的输入一样好。健康的数据对 ML 来说是绝对必要的。如果没有干净的数据和有效的管道,模型将无法充分发挥其潜力,并且可能无法做出准确的预测。

当您依赖 ML 来做出重要的商业决策时,您不会希望在那些输出已经交付之后才发现管道破裂或数据不准确。

这就是为什么 数据可观察性 提供了对数据健康状况的全面了解和全面监控,并且可以首先防止坏数据到达您的 ML 模型,这是非常值得投资的。

实现大规模生产

你不需要设计下一个动作激活的安全摄像头来影响你的 ML。图片由马太·亨利Unsplash 上提供。

机器学习不是魔法,但它很强大——而且经常被误解。

尽管如此,通过战略、流程和技术的正确组合,ML 项目可以提供竞争优势并推动每个行业的发展。

即使您没有构建下一代欺诈检测算法或虚拟个人助理,我们也希望这些最佳实践能够帮助您迈向(成功!)大规模部署 ML。

你最大的 ML 或数据痛点是什么?我们希望收到您的来信!伸出手去 巴尔摩西 或者 摩奴慕克吉

Lior GAVI sh,蒙特卡洛 CTO,对本文有贡献。******

为什么 Python 如此喜欢下划线

原文:https://towardsdatascience.com/why-python-loves-underscores-so-much-de03cf7bdcdd?source=collection_archive---------19-----------------------

图片由 Manuel Enriquez 来自 Pixabay

使用下划线的一些技巧可以改进您的 Python 代码

很多编程语言在很多场景下使用下划线“_”,Python 也是如此。如果你曾经使用 Python 进行过面向对象的编程,你一定知道 Python 对象的构造函数是__init__()。这可能是我们在 Python 中需要使用下划线的最常见场景。

然而,在更多的情况下,我们可以使用一个或多个下划线来玩一些把戏。这可以提高我们代码的可靠性,甚至带来一些新的特性。在本文中,我将列出下划线的一些技巧。希望他们能帮忙。

1.临时变量

图片来自 PixabayTonda Tran

我要介绍的第一个技巧与临时变量有关。当我们不知道变量名或者不想给变量命名时,下划线可以帮助我们。

REPL 的最后结果

REPL 指的是“阅读评估印刷循环”。当我们在 Python 控制台中运行一些东西时,结果将作为变量缓存在 REPL 中。这个变量没有名字,但是我们可以用下划线得到它。

最典型的例子就是 Jupyter 笔记本。假设我们在一个单元格中运行一些东西,那么我们可以在下一个单元格中使用下划线得到结果。

但是,需要强调的是,“无”值不会被缓冲。因此,下划线的值不会被替换,如下例所示。

匿名变量

作为一个经验法则,当我们不需要命名变量时,我们也可以用下划线来命名它。通常,这只是因为我们以后不需要使用这个变量,但是它必须被放在某个地方。

for _ in range(10000):
    # Do something 10000 times
    pass

在上面的例子中,我们只需要一个 for 循环来运行一些代码片段 10k 次。然而,循环并不重要。因此,我们可以使用下划线作为 for 循环的索引。

同样值得一提的是,大多数 IDE 都知道这条“经验法则”,这样就不会在以后检查下划线的用法。相反,如果我们在这个 for 循环中使用一个命名变量,一些 IDE 工具可能会警告我们“定义了一个变量却没有使用它”。

占位符

下划线作为临时变量的另一个常见用法是作为占位符。当我们想从一个元组中提取值时,通常使用这种方法。请参见下面的示例。

my_tuple = (1, 2)x, _ = my_tuple
print(x)

如图所示,我们从元组中获取第一个值,并将其赋给变量x。第二个被忽略,因为我们使用下划线作为“占位符”。

另一个您可能不知道的技巧是,我们可以使用带下划线的星号作为多个值的“占位符”。假设我们有一个包含多个值的元组,我们想从中获取第一个和最后一个值。

my_long_tuple = (1, 2, 3, 4, 5)x, *_, z = my_long_tuple
print('x =', x)
print('z =', z)

不管中间有多少个值,x, *_, z总会得到第一个和最后一个值。

2.提高可读性

图片来自 PixabayPexels

这个大概很多开发者都知道,但我还是想放在这里。这个小技巧在很大程度上提高了程序中数字的可读性。

num = 1_000_000
print(num)

我们通常用逗号来分隔一个数字中的每 3 个数字,这样我们就可以很容易地阅读这个数字。在 Python 中,我们不能使用逗号,但是我们可以使用下划线来做同样的事情。

此外,对于一些文化和习俗,不要担心,我们可以把下划线放在任何地方。也不会影响结果。

num = 100_0000
print(num)

3.解决名称冲突

图片来自 Pixabay

下划线通常也用于避免名称空间中的冲突。请注意,在解释者层面没有关于这个的定义。所以,这又是下划线的另一个“经验法则”。

例如,我们想定义一个函数来获取某些产品的“类”。如果我们按如下方式编写代码,它将引发一个错误。

def print_class(class):
    print('Class:', class)

这是因为术语class是 Python 中的保留关键字之一。具体来说,Python 认为我们在定义一类对象,但语法显然是错误的。

在这种情况下,经验法则是在变量后面加上下划线,如下所示。

def print_class(class_):
    print('Class:', class_)print_class('Premium')

当然,我们不必使用“class”作为变量名,因为它只是一个变量名。然而,有时不避免保留关键字会提高代码的可读性。

4.私有/受保护的属性和功能

很不幸,此时此地的图片结束了我在 Pixabay 的旅程

下划线也可以用来保护一些我们不希望下游引用的属性和函数,或者是不必要让它们被导入或调用。

保护进口

例如,在一个.py文件中,我们可以定义一些常量和函数。然后,这个 Python 文件的意思就是被别人作为库导入。然而,我们可能在这个文件中有一些不应该被导入的本地帮助函数。

在这种情况下,我们可以在常量或函数前加一个下划线,这样它们就不会被from ... import *导入。

让我们创建一个文件lib.py并将以下两个函数放入其中。

def test_func():
    print("I'm a test")def _test_func():
    print("I'm a _test")

然后,让我们从这个文件中导入所有内容。

from lib import *

之后,我们可以验证test_func()是进口的,而_test_func()不是。

但是,请注意,这是一个相当“方便”的方法,可以防止我们导入不必要的函数。它不会阻止用户显式导入它。

如果我们显式导入该函数,它将工作。

from lib import _test_func

5.保护类属性/功能

图片来自 Pixabay自由照片

不仅仅是导入,我们还可以使用下划线来保护类中的属性和函数不被外部调用。

这可以通过在需要保护的属性或函数前面添加双下划线__来实现。

让我们定义一个名为Person的类,然后实例化它。

class Person():
    def __init__(self, name, age):
        self.name = name
        self.__age = age def show(self):
        print(f"My name is {self.name} and I'm {self.__age} years old.") def __show(self):
        print(f"Hey {self.name}, you shouldn't call this function.")p1 = Person('Chris', 33)

所以,我们可以调用show()函数来打印预定义的字符串。

然而,如果我们试图调用受双下划线“保护”的属性__name和函数__show(),就会抛出错误。

同样,这种“保护”不限于解释器级别。如果我们想在一个类中隐藏一些东西不让它被调用,这是很方便的。但是有一种方法可以显式调用。只是在他们前面加上_<class_name>

6.神奇的功能

Image by 萩原 浩一 from Pixabay

嗯,每个人都知道魔法功能,但它非常重要,所以我不想跳过它。在前面的例子中使用的__init__()函数是一种神奇的函数。除此之外,最重要的一个是类中的__repr__()函数。它定义了当我们打印一个对象时要输出什么。如果你熟悉 Java,这几乎等同于toString()方法。

让我们定义一个没有__repr__()函数的类,并尝试打印对象。

class Person():
    def __init__(self, name, age):
        self.name = name
        self.age = agep1 = Person('Chris', 33)
print(p1)

它只是告诉我们类名和内存地址,帮助不大。现在,让我们定义__repr__()函数,再试一次。

def __repr__(self):
        return f"My name is {self.name} and I'm {self.age} years old."

摘要

图片由 Franz Bachinger 提供,来自 Pixabay

在本文中,我介绍了几个与 Python 编程语言中的下划线相关的技巧。有时,它使我们能够拥有某些能力,有时它提高可读性和可靠性。此外,它为保护导入和类属性/函数提供了一些便利。

这些技巧值得了解,有时对于理解他人的代码也很重要。希望这些建议会有所帮助。

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

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)

为什么理解 Python 中的队列和堆至关重要

原文:https://towardsdatascience.com/why-queues-and-heaps-in-python-are-critical-to-understand-ac56fc17e3ee?source=collection_archive---------28-----------------------

队列和堆是编程中开发序列的基本构件

Melanie Pongratz 在 Unsplash 上的照片

队列是人类与生俱来的东西,因为当我们需要做一些事情并且很忙的时候,你通常不得不排队等候。在 Python 和其他编程语言中,队列和堆是构建对象顺序列表的一种方式,也是保持它们有序的一种整洁方式。对于依赖于时间或序列的程序,队列和堆是捕获这种类型的信息以流过程序所需进程的理想方式。

什么是优先级队列?

在 Python 中,优先级队列是一种特殊类型的数据结构,它包含一个项目集合,每个项目都有一个指定的优先级。优先级决定了它在队列中所属的顺序,并有助于保持项目在结构中的顺序。Python 中的术语是 pqueue。

操作优先级队列的操作

关于优先级队列的两个基本概念是关于如何将对象添加到队列中,有两种主要方法可以做到这一点,它们是:

  • Stack — (LIFO)或后进先出,顾名思义,思考堆栈工作原理的一种更简单的方式。如果您在堆叠块的“队列”中将一个块堆叠在另一个块的顶部,那么当从该堆叠中移除块时,它将总是最后一个进入。

堆叠的视觉表现展示了如何通过插入和移除来构建和解构堆叠。图片作者。

  • 队列— (FIFO)先进先出更符合我们人类更习惯的队列概念。基本上,当建立队列时,队列中的下一个人走到队列的后面,第一个位置的人被处理并从队列中删除。

照片由 Charles DeluvioUnsplash 上拍摄

有几个不同的操作用于操纵项目在优先级队列中被捕获、移除和排序的方式。三个主要操作是 Insert、delMax/Min 和 findMax/Min。实际上,有 5 个操作,但是 del 和 find 操作的行为方式是相同的,它们分别在范围的两端执行操作。

插入 —这是一个简单的操作,它主要是在优先级队列中插入项目

delMax/Min —该操作还试图从位于范围一端的队列中删除一个项目,这取决于队列的结构(如上所示的堆栈或队列)。

findMax/Min —为了理解队列中的项目,可能有必要知道队列的 bookend 对象是什么,findMax/Min 将完成这项工作。

Unsplash科普高清照片

优先级队列的用例:

事件驱动的模拟 —如前所述,如果时间是一个您想要在一个序列中捕获的变量,那么使用一个队列来表示事物的归属是以编程方式构建它的理想方式。

数值计算— 编码的一个更“枯燥”的方面,但是研究如何最小化与舍入相关的误差可以利用优先级队列来完成。理解给定测量值的有效数字并减少由舍入误差引入的误差可以被最小化。

数据压缩— 另一个用例是尝试寻找方法对数据进行排序并将其存储在合适的分区中。搜索霍夫曼代码了解更多细节。

图搜索— 在图论操作中遍历图是利用优先级队列的理想用例,因为您可以了解图中哪些节点已经被访问过,以及访问的顺序。

操作系统——调查和理解系统的负载平衡和中断处理有助于以系统的顺序和方法确定系统的输入和输出。

额外的用例是数论、人工智能、统计学、计算机网络、垃圾邮件过滤、离散优化。

塞萨尔·卡里瓦里诺·阿拉贡在 Unsplash 上的照片

有序与无序:

有序和无序队列之间的主要概念基本上是某些操作的复杂性和速度之间的平衡。

无序数组——这些数组很容易插入,因为顺序不是问题,但另一方面,在这种类型的数组中查找 max 或 min 对象可能会耗费大量时间和资源,

有序数组——与无序数组相比,这有完全相反的问题。如果数组已经是一个结构,那么在正确的位置插入一些东西可能会占用大量资源,但是找到数组的书挡总是很容易的。

与图书馆或干净的房间相比,使用有序数组可能是一种更理想的构建和利用方式,如果东西被放置在它们需要去的地方,那么之后找到物品通常会容易得多。

完全二叉树

为了将优先级队列的概念带到下一个实现层次,您可以将它想象成一棵二叉树。二叉树是一个层次树的概念,每个父节点只有两个子分支(最多)来自它。完整树的概念是,在构建树时,通过将第一个子节点放在左边,将后续节点放在右边,对放置在树中的后续项目进行排序和构建。此外,在添加后续子层之前,需要完成每一层节点。

完全树和不完全树之间差异的表示。请注意,在下一个级别开始之前,父节点(节点#1)下没有两个子节点。作者图片

堆如树木

堆是一种特定类型的数据结构,它的根是由优先级队列形成的。正如 Wikipedia 所言,堆是一种称为优先级队列的抽象数据类型的最高效实现,事实上,优先级队列通常被称为“堆”。如你所见,优先级队列和堆这两个词通常是可以互换的,但是它们之间有明显的区别。在堆内,总是将最大(或最小)优先级的元素(取决于实现)存储为根节点,并从那里构建树。例如,如果父节点总是比子节点大,那么这被称为最大堆,反之,它们被称为最小堆。

基本堆操作:

有一些基本的堆操作与上面提到的优先级队列非常相似。第一个是删除堆的根,这可能是出于多种原因。维护操作(通常称为维护操作)是下沉或游动元素的插入命令。如果元素具有较大的值,并且需要提升一个级别,则它们可以在优先级队列中向上移动,相反,如果与同一级别中的其他项目相比,它们具有较低的优先级,则项目被沉入。最后,可以再次 delMax/Min 来从树中删除项目,然后维护树以保持其完整性。

将二叉树转化为数组:

以编程方式存储树,如数组,允许计算机将图形表示转换为自己更容易操作的表示。下表基本解释了如何根据树的工作原理构建数组,以及如何根据相同的逻辑进行扩展。

CBT 中节点的位置及其数组表示的示例。图片作者。

包裹

在本文中,我们研究了如何从概念上以编程方式捕获优先级队列和堆,以及如何实现它们的一些其他用例。对这些核心概念的深刻理解可以通过一种系统的、更加优化的方法来构建现实世界问题的模型和模拟。

一如既往地评论,回复,和/或让我知道你想阅读的其他话题。

为什么在深度学习中使用校正线性单元(ReLU ),以及在 TensorFlow 中使用它的最佳实践

原文:https://towardsdatascience.com/why-rectified-linear-unit-relu-in-deep-learning-and-the-best-practice-to-use-it-with-tensorflow-e9880933b7ef?source=collection_archive---------17-----------------------

入门

Keras 和 TensorFlow 2 的 ReLU 实用介绍

为什么 ReLU 在深度学习(图片由作者使用【canva.com】T2)

激活功能是深度学习的核心。它们决定了模型的输出、精度和计算效率。在某些情况下,激活函数对模型的收敛能力和收敛速度有很大的影响。

在本文中,您将了解为什么在深度学习中使用 ReLU,以及在 Keras 和 TensorFlow 2 中使用它的最佳实践。

  1. Sigmoid 和 Tanh 激活函数的问题
  2. 什么是整流线性单位(ReLU)
  3. 使用 ReLU 训练深度神经网络
  4. 将 ReLU 用于 He 初始化的最佳实践
  5. 与具有 Sigmoid 和 Tanh 的模型相比
  6. ReLU 的局限性

源代码请查看笔记本。更多教程可以从 Github repo 中找到。

1.Sigmoid 和 Tanh 激活函数的问题

历史上,最广泛使用的两种非线性激活是 Sigmoid双曲线正切 ( Tanh )激活函数。

Sigmoid 和 Tanh 激活函数的绘图(图片由作者提供)

Sigmoid 激活函数(也称为逻辑函数),传统上是神经网络非常流行的激活函数。该函数的输入被转换为 0 到 1 之间的值。在很长一段时间里,直到 20 世纪 90 年代初,这是神经网络上使用的默认激活。

双曲正切,也称为双曲正切,是一个形状相似的非线性激活函数,输出值范围从-1.0 到 1.0(而不是 Sigmoid 函数的 0 到 1)。在 20 世纪 90 年代后期和 21 世纪初, Tanh 函数比 Sigmoid 激活函数更受欢迎,因为使用它的模型更容易训练,并且通常具有更好的预测性能。

消失梯度问题

函数及其导数的绘图(图片由作者提供)

SigmoidTanh 函数的一个普遍问题是渐变消失。查看函数图,可以看到当输入变小时或变大时,s 形函数01 处饱和, Tanh 函数在 -11 处饱和,导数非常接近 0。因此,它几乎没有梯度通过网络传播回来,所以几乎没有什么留给低层[2]。该问题阻碍了网络模型有效地学习,尤其是在深度网络中,

计算开销大的问题

SigmoidTanh 函数的另一个问题是它们有一个指数运算,这在计算上是很昂贵的。在我们的例子中,使用 ReLU 训练的模型在收敛速度方面获得了 25%的改进(与使用 Sigmoid 和 Tanh 的模型相比,请查看部分的结果)。

2.什么是整流线性单位(ReLU)?

整流线性单元(ReLU) 是深度学习中最常用的激活函数。如果输入是负的,函数返回 0,但是对于任何正的输入,它返回该值。该函数定义为:

函数及其导数的绘图:

ReLU 及其导数的图

我们可以看到:

  • 从图形上看,ReLU 函数由两个线性部分组成,以解决非线性问题。如果斜率不是常数,函数就是非线性的。因此,ReLU 函数在 0 附近是非线性的,但斜率总是为 0(负输入)或 1(正输入)。
  • ReLU 函数是连续的,但是它是而不是 可微的,因为它的导数对于任何负输入都是 0。
  • ReLU 的输出没有最大值(它是未饱和,这有助于梯度下降
  • 该函数计算速度非常快(与 Sigmoid 和 Tanh 相比)

令人惊讶的是,这样一个简单的函数在深度神经网络中工作得非常好。

3.使用 ReLU 构建深度神经网络

出于演示目的,我们将构建一个图像分类器来处理时尚 MNIST,这是一个具有 10 个类的 70,000 个 28×28 像素的灰度图像的数据集。

使用 Keras 加载数据集

Keras 提供了一些实用函数来获取和加载公共数据集,包括时尚 MNIST。让我们装载时尚 MNIST

fashion_mnist = keras.datasets.fashion_mnist
**(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()**

数据集已经分为训练集和测试集。以下是定型集的形状和数据类型:

>>> X_train_full.shape
**(60000, 28, 28)**
>>> X_train_full.dtype
**dtype('uint8')**

我们将使用梯度下降来训练神经网络,我们必须将输入特征缩小到 0-1 范围。

创建一个深度网络

现在让我们建立一个深度神经网络!用 Keras 和 TensorFlow 2.0 创建机器学习模型有 3 种方法。由于我们正在构建一个简单的全连接神经网络,为了简单起见,让我们使用最简单的方法:带有Sequential()的顺序模型。让我们为时尚 MNIST 创建一个具有 50 个隐藏层的深度神经网络:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flattendef **create_model**(activation): 
    model = keras.models.Sequential()
    model.add(Flatten(input_shape=[28, 28]))
    **model.add(Dense(300, activation=activation))**
    **for layer in range(49):
        model.add(Dense(100, activation=activation))**
    model.add(Dense(10, activation="softmax"))

    model.compile(
        optimizer='sgd', 
        loss='sparse_categorical_crossentropy', 
        metrics=['accuracy']
    )
    return model

我们的型号有以下规格:

  • 第一层(也称为输入层)有input_shape来设置匹配训练数据的输入大小(28, 28)。输入层是一个Flatten层,它的作用只是将每个输入图像转换成一个 1D 数组。
  • 然后是 50 个Dense层,一个 300 个单位,另一个 49 个 100 个单位。
  • 输出Dense层有10单元和softmax激活功能。

让我们用 ReLU 创建一个模型:

model_relu = create_model(**activation = 'relu'**)

若要使模型符合训练数据:

history_relu = **model_relu.fit**(
    X_train, 
    y_train, 
    epochs=10,
    validation_data=(X_valid, y_valid),
)

如果一切顺利,我们应该得到如下输出。

Train on 55000 samples, validate on 5000 samples
Epoch 1/10
55000/55000 [==============================] - 41s 751us/sample - loss: 2.3027 - **accuracy: 0.0991** - val_loss: 2.3028 - **val_accuracy: 0.0914**
Epoch 2/10
55000/55000 [==============================] - 42s 771us/sample - loss: 2.3027 - **accuracy: 0.0979** - val_loss: 2.3029 - **val_accuracy: 0.0914**
......
......
Epoch 10/10
55000/55000 [==============================] - 39s 715us/sample - loss: 2.3027 - **accuracy: 0.0993** - val_loss: 2.3028 - **val_accuracy: 0.0914**

在这种情况下,我们可以看到训练集和验证集的性能都很差,达到了大约 10%的准确率。这表明所配置的模型不能学习问题,也不能归纳出解决方案。

在训练期间,训练集和验证集上的模型准确度的线图讲述了类似的故事。

准确度图(图片由作者提供)

ReLU 不是深度学习中默认的激活函数吗?还有什么导致了这个问题?

4.降低学习率和使用 He 初始化的最佳实践

训练深度神经网络的超参数之一是权重初始化器。一般来说,有 3 种常见的初始化器:

  • 随机初始化
  • Glorot (又名 Xavier )初始化
  • 初始化

如果你稍微搜索一下,你可能还会发现,如果激活函数是一个 Tanh ,那么应该使用 Glorot (Xavier)初始化,如果激活函数是一个 ReLU ,那么建议使用 He 初始化。默认情况下,Keras 使用 Glorot 初始化,这是以前模型的问题。

此外,在以前的模型中,学习率太高,因为我们已经看到训练和验证集的精度在训练期间都达到了 10%左右。让我们使用一个较小的学习率。

为了用 He 初始化来构建层,我们可以简单地将参数kernel_initializer设置为'he_normal'。要使用自定义学习率,我们可以将参数optimizer设置为keras.optimizers.SGD(lr=1e-3)

def **create_model**(activation, **k_init**): 
    model = keras.models.Sequential()
    model.add(Flatten(input_shape=[28, 28]))
    model.add(Dense(300, activation=activation, **kernel_initializer=k_init**))
    for layer in range(49):
        model.add(Dense(100, activation=activation, **kernel_initializer=k_init**))
    model.add(Dense(10, activation="softmax"))

    model.compile(
        optimizer=**keras.optimizers.SGD(lr=1e-3)**, 
        loss='sparse_categorical_crossentropy', 
        metrics=['accuracy']
    )

    return model**model_with_he** = create_model(
    **activation = 'relu',** 
    **k_init='he_normal'**
)

现在,让我们再次将模型拟合到训练数据:

history_relu_he = **model_with_he.fit**(
    X_train, 
    y_train, 
    epochs=10,
    validation_data=(X_valid, y_valid),
)

这一次,您应该会获得更好的输出:

Train on 55000 samples, validate on 5000 samples
Epoch 1/10
55000/55000 [==============================] - 38s 687us/sample - loss: 1.3974 - **accuracy: 0.4666** - val_loss: 1.3329 - **val_accuracy: 0.5898**
Epoch 2/10
55000/55000 [==============================] - 38s 693us/sample - loss: 0.7728 - **accuracy: 0.7079** - val_loss: 0.7561 - **val_accuracy: 0.7154**
......
......
Epoch 10/10
55000/55000 [==============================] - 38s 687us/sample - loss: 0.4063 - **accuracy: 0.8545** - val_loss: 0.4198 - **val_accuracy: 0.8552**

通过绘制模型精度图,我们可以看到初始化后的模型比我们之前看到的有了巨大的改进。

准确度图(图片由作者提供)

5.与具有 Sigmoid 和 Tanh 的模型相比

现在,让我们建立两个模型,一个用 Sigmoid,另一个用 Tanh,用训练数据拟合它们。

**model_sigmoid** = create_model(**activation = 'sigmoid'**)**model_tanh** = create_model(**activation = 'tanh'**)

之后,让我们比较一下我们讨论过的所有模型的准确性:

  • 在这种情况下,用 ReLU 和 he 初始化训练的模型性能最好,其次是用 Tanh 训练的模型。
  • 我们可以看到,具有 ReLU 和 Sigmoid 的模型在训练集和验证集上都很差,达到了大约 10%的准确性。这表明配置的两个模型不能了解问题,也不能归纳出解决方案。
  • 此外,我们发现使用 ReLU 训练的模型的平均执行时间约为每个时段 33 秒,而使用 Sigmoid 或 Tanh 训练的模型的平均执行时间为每个时段 40 秒。在收敛速度方面提高了 25%。(请从笔记本查看日志详情)

比较模型(图片由作者提供)

用 ReLU 和 he 训练的模型的日志(图片由作者提供)

用 Tanh 训练的模型的日志(图片由作者提供)

6.ReLU 的局限性

ReLU 在大多数应用程序中运行良好,但并不完美。它遇到了一个被称为将死的问题。

在训练过程中,一些神经元实际上已经死亡,这意味着它们不再输出除 0 以外的任何信号。在某些情况下,你可能会发现你的网络中有一半的神经元已经死亡,尤其是当你使用大的学习速率时。当神经元的权重被调整为训练集中所有实例的输入加权和都为负值时,神经元就会死亡。当这种情况发生时,它只是保持输出 0,梯度下降不再影响它,因为当 ReLU 函数的输入为负时,它的梯度为 0。

动手机器学习[1],第 329 页

为了解决这个问题,你可能想使用 ReLU 函数的一个变体,比如 Leaky ReLUParametric Leaky ReLU(PReLU)、指数线性单元 ( ELU ),或者比例指数线性单元 ( SELU )。请查看以下文章中对它们的介绍:

</7-popular-activation-functions-you-should-know-in-deep-learning-and-how-to-use-them-with-keras-and-27b4d838dfe6>

结论

在本文中,我们讨论了在深度学习中使用 ReLU 激活函数的原因,以及如何在 Keras 和 TensorFlow 中使用它。

我希望这篇文章能帮助你节省建立和调整你自己的深度学习模型的时间。我建议你查看 Keras 文档中的激活功能,并了解你可以做的其他事情。

感谢阅读。请查看笔记本获取源代码,如果您对机器学习的实用方面感兴趣,请继续关注。

您可能对我的其他 TensorFlow 文章感兴趣:

更多可以从我的 Github 中找到

参考

  • [1]使用 Scikit-Learn 和 TensorFlow 进行机器实践学习:构建智能系统的概念、工具和技术

为什么可靠的元数据变得如此重要?

原文:https://towardsdatascience.com/why-reliable-metadata-is-becoming-important-f29e01b01d4d?source=collection_archive---------21-----------------------

需要全面考虑数据操作中的元数据

企业内部并不缺乏数据,但是使用数据来解决业务问题是当今的一个主要挑战。在构建元数据管理框架方面有一个日益增长的焦点:网飞的 Metacat ,优步的 Databook ,Airbnb 的 Dataportal ,LinkedIn 的 Datahub ,Lyft 的 Amundsen ,WeWork 的 Marquez ,Spotify 的 Lexikon ,Apache 的

为什么元数据变得重要?

在大数据时代之前,数据在添加到中央仓库之前是经过筛选的,包括模式、谱系、所有者、业务分类等在内的元数据细节首先被编目。这被称为写模式

作者图片

如今,处理数据湖的方法是首先聚合数据,然后推断消费时的数据细节。这被称为读取模式。因此,没有可供数据用户使用的有组织的元数据目录。

作者图片

复杂性的另一个方面是给定数据集的元数据的孤岛性质。例如,考虑驻留在 MySQL 事务数据库上的销售数据集。为了在湖中获取这些数据,用 Spark 编写了一个 ETL 作业,并安排在 Airflow 上。张量流 ML 模型使用转换后的数据。

数据管道中的每个框架都有自己的端到端元数据的局部视图。考虑到数据持久化、调度、查询处理、服务数据库、ML 框架等等技术的多样性,缺乏端到端元数据的单一规范化表示使得数据用户的消费更加困难。

元数据的作用

元数据的作用是帮助理解数据。理解数据集有几个方面:

  • 数据在逻辑上代表了什么?属性的含义是什么?它是真理的来源,还是从另一个数据集推导出来的?
  • 数据的模式是什么?谁管理它?是怎么改造的?
  • 最后一次更新是什么时候?数据是分层的吗?以前的版本在哪里?我能相信这些数据吗?数据质量有多可靠?
  • 谁和/或哪个团队是所有者?哪些是普通用户?
  • 使用什么查询引擎来访问数据?数据集版本化了吗?
  • 数据在哪里?复制到哪里,格式是什么?
  • 数据在物理上是如何表示的,能否被访问?
  • 是否存在具有共同相似或相同内容的相似数据集,无论是整体还是单个列?

即使数据集最终确定用于构建 ML 模型,仍有个操作用例需要理解元数据:

  • 有许多查询引擎可用于分析数据集。单个数据集可以由多个查询引擎交替使用,例如 Pig、Spark、Presto、Hive 等。例如,从 Hive 读取数据的 Pig 脚本需要读取 Pig 类型中带有 Hive 列类型的表。类似地,处理可能需要跨数据存储移动数据。在此过程中,目标数据存储中的表使用目标表数据类型。为了能够使用多种查询处理框架,需要将规范的数据类型映射到各自的数据存储和查询引擎类型。
  • 部署模型或仪表板时,需要主动监控相关的数据集问题,因为它们会影响洞察力的正确性和可用性。与数据集运行状况相关的元数据用于对数据集架构的任何更改或其他团队已经发现的任何错误进行影响分析。这些信息有助于快速调试数据管道中的中断,针对延迟的数据可用性、数据质量问题以及其他部署后的操作问题发出违反 SLA 的警报。

元数据的三大支柱

数据集的元数据细节可以分为三类:技术、操作和团队元数据/部落知识。

作者图片

技术元数据 由数据集的逻辑和物理元数据细节组成。物理元数据涵盖与物理布局和持久性相关的细节,例如创建和修改时间戳、物理位置和格式、存储层以及保留细节。逻辑元数据包括数据集架构、数据源细节、生成数据集的过程以及数据集的所有者和用户。技术元数据通常是通过爬行单个数据源来提取的,而不必跨多个数据源进行关联。

操作元数据由两个关键桶组成:沿袭和数据分析统计。沿袭包括追溯数据集是如何生成的以及它对其他数据集的依赖性。对于给定的数据集,沿袭包括所有依赖的输入表、派生表以及输出模型和仪表板。它包括实现转换逻辑以获得最终输出的作业。例如,如果作业 J 读取数据集 D1 并产生数据集 D2 ,那么 D1 的沿袭元数据包含 D2 作为其下游数据集之一,反之亦然。数据分析统计包括货架可用性和质量统计。它捕获数据集的列级和集合级特征。它还包括捕获完成时间、处理的数据以及与管道相关的错误的执行统计信息。

团队元数据:当数据科学家为他们的项目使用不同的数据集时,他们会发现关于属性含义、业务词汇、数据质量等等的更多细节。这些知识被称为部落知识。目标是通过丰富数据集的元数据细节,在数据用户之间积极地共享团队知识。

收集技术元数据的挑战

  • 格式的不同:每个数据平台存储元数据的方式不同。例如,Hadoop 分布式文件系统(HDFS)元数据以文件和目录的形式存储,而 Kafka 元数据以主题的形式存储。创建一个适用于所有平台的单一规范化元数据模型并不容易。典型的策略是应用最小公分母,这将导致抽象泄漏。数据集以多种不同的数据格式和存储方式存在。提取元数据需要不同的驱动程序来连接和提取不同的系统。
  • 模式推断:需要不自描述的数据集来推断模式。数据集的架构难以提取;半结构化数据集很难推断结构。没有通用的方法来支持对数据源的访问并生成 DDL。
  • 变化跟踪:元数据是不断变化的。鉴于高流失率和不断增长的数据集数量,保持元数据更新是一项挑战。

收集运营元数据的挑战

操作元数据不是通过连接到数据源生成的,而是通过将跨多个系统的元数据状态拼接在一起生成的。例如,在网飞,数据仓库由存储在亚马逊 S3(通过 Hive)、Druid、Elasticsearch、Redshift、Snowflake 和 MySQL 中的大量数据集组成。查询引擎,即 Spark、Presto、Pig 和 Hive,用于消费、处理和生成数据集。

给定多种不同类型的数据库、调度器、查询引擎和商业智能(BI)工具,理解跨不同处理框架、数据平台和调度系统的整体数据流和谱系是一项挑战。鉴于处理框架的多样性,挑战在于将细节缝合在一起。从代码中推断血统并不简单,尤其是对于 UDF、外部参数等等。

复杂性的另一个方面是获得完整的血统。日志中数据访问事件的数量可能非常多,传递闭包的大小也可能非常大。通常,通过仅处理来自日志的数据访问事件的样本,以及通过仅在几跳内具体化下游和上游关系,与计算真正的传递闭包相反,在沿袭关联的完整性和效率之间存在折衷。

收集团队元数据的挑战

团队知识是元数据的一个重要方面。随着数据科学团队的成长,保留这些细节以供他人利用非常重要。有四个类别:

  • 注释、文档和属性描述形式的用户定义的元数据。这些信息是通过社区参与和协作创建的,通过鼓励对话和对所有权的自豪感,可以创建一个自我维护的文档库。
  • 业务分类法或词汇表,用于在业务直观的层次结构中关联和组织数据对象和指标。此外,还有与数据集相关联的业务规则,如测试帐户、战略帐户等。
  • 数据集在合规性、个人身份信息(PII)数据字段、数据加密要求等方面的状态。
  • ML——以最流行的表格、查询等形式扩充的元数据。,并检查源代码和提取任何附加的注释。这些注释通常是高质量的,它们的词法分析可以提供捕捉模式语义的简短短语。

团队知识元数据面临三大挑战:

  • 很难让数据用户简单直观地分享他们的团队知识。
  • 元数据是自由格式的,但必须经过验证以确保正确性。
  • 信息的质量很难核实,尤其是如果它是矛盾的。

构建元数据服务

元数据服务是数据湖/数据网格/数据湖库的关键构建块,并且通常是后特设的,即,它在数据集已经由各种管道创建或更新之后收集元数据,而不干扰数据集所有者或用户。

构建元数据服务并使其为数据用户提供自助服务涉及实现三种模式(如下图所示),定义为马斯洛需求层次:

  • 特定于源的连接器模式:简化了到不同数据源的连接和提取与数据相关的元数据信息。
  • 沿袭相关模式:自动提取与源表和目标表相关的转换的沿袭。
  • 团队知识模式:简化了数据用户之间的业务上下文聚合和知识共享。

作者图片

关于这个话题的更多讨论,请随意参考我的 O'Reilly 的书 《自助式数据路线图

为什么机器学习中鲁棒性不足以保证安全性和安全性

原文:https://towardsdatascience.com/why-robustness-is-not-enough-for-safety-and-security-in-machine-learning-1a35f6706601?source=collection_archive---------24-----------------------

人工智能校准和安全

多个社区(机器学习、形式化方法、编程语言、安全、软件工程)的研究人员已经接受了对模型健壮性的研究,通常被称为安全性或安全性验证。他们朝着更好、更可扩展或更精确的技术不断取得令人印象深刻的进展,以评估鲁棒性和证明定理,但我在该领域阅读的许多论文基本上从未谈到如何利用这一点实际上使系统更安全。我认为这是街灯效应的一个例子:我们专注于鲁棒性验证的研究,因为它有明确定义的评估论文的措施,而实际的安全和安保问题要困难得多,需要考虑整个系统,而不仅仅是模型的属性。当考虑生产机器学习系统的测试、安全和保障时,我们需要超越狭隘的健壮性指标。

从对立的例子到稳健

我们可能都见过这样的例子,机器学习模型很容易被愚弄,通过向人类可能察觉不到的输入添加轻微的噪音来做出错误的预测,例如当添加一些人类几乎看不见的轻微噪音时,这只熊猫(非常自信地)识别出它是一只长臂猿:

来自 OpenAI 的反例

简而言之,问题出现了,因为我们学习和使用模型,却不了解它们内部是如何工作的,也不知道它们是否真正学到了反映人类认知的概念。这些模型一般都能正常工作(正如我们在模型评估过程中的准确性度量所表明的),但是我们通常真的不知道为什么以及如何工作——也许只要它们大部分都能正常工作,我们就不在乎。然而,由于我们不知道也无法具体说明这些模型是如何工作的,我们总是可以找到错误预测的例子,其中模型根本不会产生预期的结果。更糟糕的是,通过适当的搜索,通常有可能发现特定输入的微小变化,从而改变模型的预测。这就是所谓的对立的例子,有大量的研究是关于如何找到它们,有没有访问模型的内部。

虽然熊猫和长臂猿的例子看起来很有趣,但很容易将对立的例子重新定义为安全问题。例如,研究人员已经表明,贴在停车标志上的小贴纸可以欺骗视觉系统,将该标志识别为“限速 45”标志,这意味着这可能会导致自动驾驶汽车采取错误和危险的行动:

来自 CVPR 2018 论文的物理对抗示例

除了通过操纵输入的故意攻击之外,输入的自然变化也可能导致具有安全后果的错误预测。最常见的例子是自动驾驶汽车在雾天行驶,或者相机稍微倾斜或模糊,都会导致输入的小修改。例如,研究人员已经展示了图像的简单变换(反映现实世界中可能存在的问题)如何导致对汽车转向角度的错误预测:

来自 DeepTest ICSE 2018 年论文的可能输入转换示例,反映了自动驾驶系统在现实世界中的潜在条件,导致对转向角度的错误预测

在这种情况下, robustness 是指模型的预测对输入的微小变化是稳定的,希望是因为它的预测是基于真实任务的可靠抽象,反映了人类如何执行任务。也就是说,小的看不见的噪声不应该将预测从熊猫翻转到长臂猿,图像的小添加不应该阻止模型识别停止标志,天气条件或轻微倾斜相机不应该影响自动驾驶汽车的转向角度。

来自 Goodfellow 等人(2018)。使机器学习对敌对输入具有鲁棒性ACM 的通信61 (7)、56–66。

边注:我喜欢 Goodfellow 等人对对抗性例子的可视化解释,即实际决策边界(基础事实/规范)和模型学习到的决策边界之间的不匹配。不幸的是,我们使用机器学习正是因为我们没有明确的规范,不知道实际的决策边界(参见我在机器学习是需求工程中对规范的讨论)。因此,这种解释是一种很好的概念性观点,但在我们关心预测是否正确的实际环境中没有太大帮助。稳健性只与我们是否接近模型的决策边界的问题有关,而不知道任何关于实际决策边界的事情。

定义稳健性

鲁棒性是一个吸引人的研究属性,因为它很容易定义为两个输入之间关系的不变量(技术上称为变形关系),而不必依赖于规范和实际正确预测的基础事实。

所有的局部鲁棒性属性或多或少遵循这种形式:给定一个输入 x 和一个感兴趣的模型 f ,我们希望模型的预测对于在 x 的邻域中的所有输入x’保持相同,其中邻域由某个距离函数 δ 和某个最大距离δ定义:

x'δ ( x,x ')≤δf(x)=f(x ')

根据问题的不同,定义距离的方式可能会有很大不同。典型的例子允许对所有输入特征(例如,所有像素)的低噪声量,对少数输入特征的任意改变(例如,改变任意三个像素),或更复杂的变换(例如,倾斜图片或添加“雾”)。无论可能的变换或相应的距离函数和最大距离如何,我们总是对原始输入周围的一些邻域进行推理。

注意,这个定义不需要任何关于对 f ( x )或f(x’)的正确预测是什么的信息,我们简单地推理预测在邻域内应该保持一致(无论正确与否)的事实。

稳健性或者被建立为二元属性,即模型的输入被验证为稳健或不稳健(通常是保守的过度逼近,但也提出了具有置信水平的概率判断),或者被建立为某种形式的相对度量,例如到最近的对立实例的距离或邻域中稳健输入的百分比。

研究人员现在开发了许多不同的搜索和验证策略,以评估深度神经网络的这种鲁棒性。这可以通过在邻域内搜索对立的例子,通过简单地采样和测试邻域中的大量数据点,或者通过正式证明邻域中没有点可以改变预测结果的不同形式的正式验证来完成。

请注意,鲁棒性研究基本上只关注深度神经网络,因为这是难以扩展验证技术的地方。相比之下,我不知道有关于决策树或线性模型的鲁棒性论文,鲁棒性评估似乎很容易实现,并且对于许多这样的模型来说也很容易扩展——我怀疑这就是为什么我没有看到这样的论文。

除了局部稳健性,一些研究人员还讨论了模型的全局稳健性,通常是所有可能输入的某种形式的平均稳健性。例如,可以测量可以验证的输入鲁棒性的百分比,或者从每个输入到最近的对立示例的平均距离。

边注:Borg 等人的研究:健壮性是一个从业者经常使用的术语,但通常只是模糊地指模型预测的正确性可信度,而不是研究文献中研究和这里讨论的健壮性的正式概念。

鲁棒性有用吗?

我读过几十篇分析机器学习模型鲁棒性的论文,其中大多数都以安全和安保问题为动机进行分析——然而这些论文中没有一篇讨论或评估鲁棒性在实际设置中如何真正使用。

首先,鲁棒性很难解读。对所有输入完全稳健的唯一模型是对所有输出返回相同预测的平凡模型。对于所有其他模型,有一个决策边界,一些输入将接近模型的决策边界,因此不稳定:决策边界附近的输入邻域的一些部分将位于决策边界的每一侧。

没有一个模型是完全鲁棒的:黑线显示了 +- 预测之间的决策边界。一些输入接近决策边界,它们的邻域(圆)延伸超过决策边界。

用例 1:在推理时评估健壮性

最合理的使用场景似乎是在推理时间评估鲁棒性,也就是说,检查系统在运行期间做出的给定预测是否鲁棒。例如,当标记图像时,我们可以只标记那些我们有证据或信心该标记对微小扰动是鲁棒的图像(独立于模型可能已经提供的置信度分数),因此决定不放弃标记上面图像中的熊猫。类似地,我们可以识别停车标志没有被强有力地识别为停车标志,因此不相信它是自动驾驶汽车做出决策的任何标志。

这看起来很有吸引力,鲁棒性可能是一个强大的工具,但要将其用于系统的安全,工程师需要解决多个额外的问题:

  • 成本高昂的分析:深度神经网络的鲁棒性分析是非常昂贵的。即使技术变得更好,它们目前只适用于小型和中型的神经网络(有人知道手写数字识别吗?)由于形式分析、SMT 求解或所需大量样本的成本,他们通常需要分钟来分析单个输入的鲁棒性。我们当然可以希望研究进展继续降低成本,但我很难想象任何人会在推理时间很快使用健壮性评估;不适用于像在脸书标记照片这样的大容量系统,当然也不适用于自动驾驶汽车这样的实时应用。
  • 定义最大距离:为邻域的大小和形状定义合适的距离函数和阈值是一个不小的工程问题。邻域越大,分类为不稳定的预测就越多。如果邻域太小,攻击和意外的错误分类就更容易逃脱。此外,在实践中,由于事故或攻击,什么样的扰动是可能发生的,以及如何定义正确的邻域?我们想要防范的最糟糕的情况是什么?确定正确的距离函数和最大距离阈值是不小的工程挑战。
  • 稳健安全:如果我们在推理时分析稳健性,并且我们已经找到了一个合理的最大距离,那么我们如何处理被确定为不稳健的模型预测呢?我们可以简单地决定不标记图像,但我们不能停止驾驶自动驾驶汽车。此外,我们是否假设一个预测将是正确的,仅仅因为它是稳健的?我们显然需要考虑模型之外的安全机制,仍然预期模型可能做出错误的预测,或者只是更经常地表明它不确定。

请注意,成本论证可能不适用于更简单的 ML 模型,如决策树,尽管我也没有看到任何人讨论在推理时使用健壮性。我真的很有兴趣看到试图设计安全系统的项目,并讨论他们如何应对这些挑战。

用例 2:全球模型评估

可以评估模型对于任意输入的平均稳健性,以某种全局稳健性来衡量。除了预测准确性(ROC、召回/精度、lift、MAPE,等等),我们可以将此视为模型质量的额外度量,其中稳健性和准确性度量非常不同的质量。请注意,评估可以完全离线完成;成本可能很高,但这种策略不会降低生产中模型推理的速度。

平均来说更健壮的模型可能是优选的,因为它可以被假定为学习更多的实际概念,被限制到更少的更简单的决策边界,或者可以较少地受噪声或攻击的影响。

现在的挑战来自如何衡量和有意义地解释全球稳健性。我们真的同等地关心所有的输入吗,或者健壮性应该集中在更常见的输入上吗?例如,许多方法被用来产生不稳定的合成“测试”输入,但是我们真的关心不像任何真实世界输入的随机输入吗?与准确性度量类似,什么级别的稳健性被认为是好的?应该使用什么样的邻域大小?我们如何在准确性和健壮性之间进行权衡?总的来说,全局模型健壮性很容易定义为一个度量,但是如何利用这个度量还不清楚。

最后,假设我们已经建立了较高的平均稳健性,这如何帮助我们做出任何安全声明?我们希望模型犯更少的错误或者更难被攻击,但是我们不知道任何关于推理时的特定预测。在实际环境中,攻击者很可能能够找到许多实际输入的对立例子。

用例 3:调试模型

我们可以评估一组实际输入的健壮性,而不是评估全局的健壮性(用例 2)。例如,我们可以评估验证数据集(希望代表生产中的实际输入)甚至训练集中的每个输入的健壮性。我们还可以分析生产系统中接收到的输入样本的健壮性,比如说,随机输入或通过系统遥测标记为有问题的输入(例如,用户报告预测不正确)。

了解对样本输入的某些预测是否稳健可能有助于我们进行调试。我们可能会识别出许多预测不可靠的输入区域,要么是因为它们确实接近真实的决策边界,要么更有可能是因为模型不太擅长理解这些输入。我们可能会发现危险的情况,例如我们的模型无法处理雾——希望在测试期间发现,而不是在生产中。

如果我们理解了模型的问题,我们就可以尝试改进模型。最常见的策略似乎是数据扩充,即将来自训练输入邻域的输入添加到训练数据中。对模型架构或特征工程的改变也可能有助于推动模型学习更多相关的概念。许多论文探讨了不同的方法。

总的来说,这似乎是一个很有前途的调试、强化和改进模型的策略。一个关键的挑战是哪些输入应该用于健壮性分析的问题(导致关于决定一个好的测试集的难题),以及,如上所述,如何定义要考虑的最大距离。同样类似于用例 2,我们对模型在生产中的行为没有任何健壮性保证。这些都不能提高系统本身的安全性。

超越模型:安全是系统属性

安全是系统属性,而不是软件或机器学习模型的属性。正如安全研究员南希·莱韦森(麻省理工学院)在她的ICSE 20 日主题演讲中反复提到的:

“软件不是不安全的。它会造成危险,但不会爆炸、着火、涉及有毒物质等。如果它不是关于危险,它就不是关于安全。[……]软件不是不安全的;它产生的控制信号可以是。[……]
不可能只看软件就确定安全性[……]几乎所有与软件相关的事故都是由不安全的要求造成的,而不是软件设计/实施错误。”

安全就是构建安全的系统,通常使用不可靠的组件,包括软件和硬件组件。它是关于确保系统整体是安全的,即使一个组件出现故障(例如,硬件故障,模型做出错误的预测)或多个组件之间出现意外的交互。

鉴于我们无法指定机器学习模型的预期行为,也无法验证它的功能正确性,安全问题必须关注系统如何根据通常不可靠的机器学习模型的输出与环境进行交互。我们必须考虑模型之外的安全措施,例如智能烤面包机中的热保险丝或最大烘烤时间,以确保烤面包机不会着火,无论其内部模型预测的烘烤时间是多少。

工程安全系统需要理解系统级的需求,分析世界和机器之间的交互,以及理解各种(可能不可靠的)组件的交互。决定模型是否安全的是如何使用模型的上下文。

模型的稳健性既不保证安全性也不保证本身的安全性。稳健不能保证模型的“正确性”:稳健的预测仍然可能是错误的;一个非常健壮的模型可能完全没有用。在更大的安全故事中,鲁棒性可能是一个有用的构建块(上面讨论了所有开放的工程挑战),因为当我们考虑与系统的其他部分和环境的交互时,它改变了我们可以对 ML 组件做出的假设。但是仅仅让一个模型健壮并不能让系统安全。

有研究工作是利用机器学习模型构建安全系统,特别是围绕航空电子设备和自动驾驶汽车——这都是关于需求、系统设计和系统级测试的,而确保正式的鲁棒性通常似乎不是一个很大的问题。

路灯效果:寻找光在哪里

回到街灯效应,(以一个男人在街灯下寻找钱包的故事命名,当被问及“这是你丢钱包的地方吗”时,他回答说他在别处丢了钱包,但在有光的地方寻找更容易):深度神经网络的鲁棒性是一个令人欣慰的研究主题,因为它被很好地定义,具有挑战性,并有超过艺术水平的明显可测量的改进空间。许多研究人员做出了令人难以置信的贡献。然而,如果我们真的关心具有机器学习组件的生产系统的安全性,我们应该超越简单和明确定义的问题,看看现实世界系统的真实和丑陋的工程挑战。

进一步阅读:

我为什么要为量子机器学习费心呢?

原文:https://towardsdatascience.com/why-should-i-even-bother-with-quantum-machine-learning-f3ffbb776684?source=collection_archive---------44-----------------------

量子机器学习有望颠覆传统

本帖是本书的一部分: 用 Python 动手做量子机器学习

在最近的过去,我们目睹了算法如何学会驾驶汽车,并在国际象棋和围棋中击败世界冠军。

图片由作者 www.pyqml.com·弗兰克·齐克特提供

从军事到航空航天,从农业到制造业,从金融到医疗保健,机器学习几乎被应用到所有可以想象的领域。

但是机器学习算法已经变得越来越难以训练。所以当我们看到这种表示时,当前的机器学习算法,如 2020 年发表的生成式预训练变压器 3 (GPT-3)网络,浮现在脑海中。GPT 3 号产生了类似人类的文本。

训练 GPT-3 需要在单个 GPU(图形处理单元)上花费 355 年时间,耗资 460 万美元。通过并行化,训练速度大大加快。然而,这需要大量的计算资源。

训练目标是为模型所包含的参数找到一组工作值。不幸的是,训练模型的复杂性随着参数的数量呈指数增长。

比方说,一个模型由四个布尔(真或假)参数组成。然后,有 2⁴=16 可能的配置。如果参数采用一位数(0–9)作为值,将有 10⁴=10,000 可能的配置。相应地,如果我们有 86 个而不是 4 个参数,那么这个模型将会有 10⁸⁶可能的构型。对了,这是可见宇宙中原子的数量左右!

GPT-3 模型包含 1750 亿个参数。我甚至不敢去想有多少种可能的构型。

当然,有精明的算法和启发来改善训练,并最终导致一个工作系统。然而,当前机器学习模型的复杂性成为一个问题。一些人甚至认为,我们正在走向下一个人工智能冬天,因为用当前的计算技术来训练我们正在寻找的模型是难以处理的。

量子计算机有望解决这类问题。它们同时计算多个状态的能力使它们能够并行执行几乎无限多的任务。这种能力有望改善和加速机器学习技术。与基于顺序信息处理的经典计算机不同,量子计算利用了量子物理的特性。

让量子计算如此强大的不是它的处理速度。其实挺慢的。让量子计算如此强大的也不是它的内存。事实上,它小得荒谬。所以我们谈论的是一些量子比特。

让量子计算如此强大的是它所实现的算法。此外,这些算法表现出不同于经典算法的复杂性特征。

为了理解这意味着什么,让我们简单看一下复杂性理论。复杂性理论是对运行算法所需的计算工作的研究。

作者弗兰克·齐克特的图片

例如,加法的计算量是 O(n)。这意味着两个数相加的工作量随着数的大小(位数)线性增加。乘法的计算量是 O(n)。努力随着数量大小的平方而增加。据说这些算法在多项式时间内是可解的。

但是这些问题相对简单。例如,解决因式分解问题的最佳算法是寻找一个 n 位数的质因数:O (e(n1/3).不幸的是,这意味着随着位数的增加,工作量呈指数增长。

O(n)和 o(的区别我们一定不能低估 e^ (n /3)复杂度。虽然你的智能手机可以在几秒钟内将 800 位数字相乘,但在超级计算机上,这种数字的因式分解需要大约 2000 年。

但是量子计算是一种不同形式的计算。它利用了量子物理的三个基本性质:叠加、干涉和纠缠。

这些就是叠加纠缠干涉。但是量子计算并没有增加可用的计算能力,而是减少了解决问题所需的能力。

叠加是指一个量子系统可以同时存在多个态的量子现象。

Actually, the quantum system does not exist in multiple
states concurrently. It exists in a complex linear combination
of a state 0 and a state 1\. It is a different kind
of combination that is neither "or" nor is it "and".

作者弗兰克·齐克特的图片

量子干涉是允许我们将量子系统偏向期望状态的东西。这个想法是要创造一种干扰模式,其中导致错误答案的路径会破坏性地干扰和抵消,但导致正确答案的路径会相互加强。

作者弗兰克·齐克特的图片

纠缠是量子粒子之间极强的关联。此外,即使相隔很远,纠缠的粒子仍然保持完美的关联。

作者弗兰克·齐克特的图片

阿尔伯特·爱因斯坦生动地拒绝了量子纠缠的概念,称之为“超距作用”。

量子计算要求我们改变对计算机的看法。它需要一套全新的算法。编码和使用量子信息的算法。这包括机器学习算法。我们不能简单地把我们目前的算法放在量子计算机上运行。我们需要开发新的算法。

我们需要一批新的开发人员来开发这些算法——理解机器学习和量子计算的开发人员。开发者有能力解决以前没有解决的实际问题。一种罕见的显影剂。今天解决量子机器学习问题的能力已经让你与众不同了。

结论

量子机器学习有望成为颠覆性的。虽然机器学习和量子计算这两个活跃的研究领域的合并主要是在概念领域,但已经有一些应用于解决现实生活问题的例子。谷歌、亚马逊、IBM、微软和一大批高科技创业公司都在努力成为第一批制造和销售量子机器学习系统的公司。

当一项技术即将证明其优势时,研究这项技术的机会是一个独特的机会。不要错过它。

本帖是本书的一部分: 用 Python 动手做量子机器学习

在这里免费获得前三章。

我为什么要为异常检测付费?自己打造自己不是很容易吗?

原文:https://towardsdatascience.com/why-should-i-pay-for-anomaly-detection-isnt-it-easy-to-build-it-ourselves-c0f8627542ce?source=collection_archive---------22-----------------------

使用业务绩效数据构建成功的异常检测系统的三个关键方法

Josue Isai Ramos Figueroa 在 Unsplash 上的照片

构建异常检测系统可能看起来很简单,但这不仅仅是要求您的数据科学团队实施现成的算法,所有支持基础架构对于最终用户来说都是系统成功的关键。

在本指南中,我将列出构建成功的异常检测系统的 3 种关键方法,以及需要哪些核心组件。

不同的笔画,适合不同的人

有很多方法可以处理业务指标的时序异常检测。根据您的团队及其需求,您可能已经考虑了以下方法之一:

  • 自我构建 —您在自己的基础设施上托管异常检测算法&逻辑,并构建所有周围的设备来运行检测,以及使用内部人员配置&资源来维护系统。通常,这需要最长的时间来实现价值,最高的前期成本,以及对团队时间的最高需求。
  • 自行构建,通过 API 服务进行检测 —与自行构建相同,但使用 API 服务进行异常检测逻辑,接收时序数据并返回结果。除此之外,您还需要构建和维护所有相关的基础设施。
  • 托管服务 —所有方面都由您的提供商托管和管理。使用他们的 SaaS 产品,你只需提供数据并选择要跟踪的内容。这通常是最快实现价值的,产生适度的持续成本,由团队花费在维护上的很少时间来抵消。

就成本、实现价值的时间和技术难度而言,每种方法都有自己的优缺点:

异常检测方法——利弊权衡。图片作者。

除了算法,我还需要什么?

无论您采用哪种方法,这些都是成功部署基本异常检测系统所涉及的元素和任务——我还提供了每个组件可能需要多长时间开发的实际指示,以及所需的技能:

成功的异常检测系统的关键组件。图片作者。

1。数据准备&转换

团队:数据工程、软件工程
价值实现时间:6-9 个月

存储的业务绩效数据需要转换为适合异常检测的时间序列格式,这涉及到:

  • 将数据输入到数据存储系统中,并直接耦合到异常检测算法中,无论该算法位于何处
  • 定义要跟踪的指标&基于这些指标以期望的频率生成时间序列
  • 说明并删除任何不完整的期间、缺失值和其他数据卫生注意事项
  • 重复数百/数千次,详细反映用户对跟踪内容的偏好

2。调度异常检测运行

团队 : DevOps,软件工程
价值实现时间:3-6 个月

必须构建和维护基础架构,以定期触发后续的异常检测流程—新数据预计会定期到达。为了实现最高效率,应该以不同的频率跟踪不同的指标(例如,每小时监控一次销售额,但每天只检查新客户注册情况)

3。异常检测

团队:数据科学、软件工程
价值实现时间:12–18 个月

这是大多数人在考虑异常检测时想到的组件,即识别业务指标中异常行为的智能算法。核心任务包括:

  • 从数据准备阶段无缝接受来自各种时间序列的输入,无论频率、噪声和形状如何,并进行扩展以处理同时跟踪的数百/数千个指标。
  • 优化设置,最大限度地提高检测准确性,同时最大限度地减少误报和漏报,几乎不需要人工干预— 并非所有算法都能提供相同的性能
  • 要达到高水平的性能,并具有可接受的假阳性/假阴性水平,可能需要 12 个月以上的时间!
  • 清楚地输出检测到的异常,以便采取后续措施

4。通知交付&任务分配
团队 : DevOps、软件工程、UX
价值实现时间:3-6 个月

一旦检测到异常,就需要通知业务用户。如果没有这一步,异常情况就会隐藏在系统中,看不到。常见的集成渠道包括:

  • 应用程序内弹出窗口
  • 电子邮件
  • 工作场所聊天工具(例如 Slack、微软团队)
  • Webhooks(用于交付给 OpsGenie、PagerDuty 等事故管理系统)

同样重要的是,能够与企业中可能没有收到相同警报的其他个人共享通知,并为他们分配任务以解决手头的问题。

5。可视化&结果存储

团队:软件工程,UX
时间价值:6–9 个月

虽然有一个通知是有用的,但是业务用户可能希望以一种更自由的方式探索其他已经被识别的异常。最好通过图形格式可视化检测到的异常,允许用户:

  • 对照历史背景交叉引用他们被告知的异常情况
  • 找到其他类似的异常,或者调查其他可能受到影响的指标
  • 开始理解绩效变化背后的根本原因
  • 为了获得可接受的访问速度,这需要将异常检测算法的结果存储在数据湖/数据仓库中。

6。根本原因分析和问题解决

团队:数据科学、软件工程、UX、DevOps
价值实现时间:12–18 个月

一旦发现异常情况,很自然会尝试找出它发生的原因。如果没有此功能,业务用户对检测到的异常情况快速采取行动的能力就会受到限制。虽然对数据集进行手动分析是可能的,但这需要的技能不是业务用户关注的重点,可能需要几个小时或几天才能完成。

使用机器学习的自动化根本原因分析系统有助于发现性能变化的最相关原因,如异常所识别的。这通常在几秒钟内完成,包括:

  • 开发底层根本原因分析算法,足够灵活地回答任何基于指标和已识别异常的问题,并与正常行为进行比较。
  • 解释趋势的变化。
  • 最大限度地减少绩效变化背后的不相关原因,例如巧合的相关性
  • 以一种易于理解的方式显示这些信息,业务用户可以探索其他原因,并快速与他人分享这些见解以解决问题。

总结一下:

业务绩效指标的异常检测不仅仅是检测算法,所有的支持组件都有助于使系统及其洞察力对业务用户可用且有用,方法的选择对成本和价值实现时间有实际影响!

我希望这在您为您的企业实施异常检测的过程中是一个有用的指南——如果您想了解 Avora 的方法,请访问我们的www.avora.com

为什么要用 Viziball 来分析比较篮球运动员的表现?

原文:https://towardsdatascience.com/why-should-we-use-viziball-to-analyze-and-compare-basketball-players-performance-f03fbf498dd8?source=collection_archive---------41-----------------------

看一眼图表可以帮助我们得出结论。这就是数据可视化的美妙之处。

在之前的一篇文章中,我讨论了我们如何在篮球分析网站的 Viziball 中使用 PIE ( 球员影响力评估)。这种通用的测量方法旨在汇总统计结果,以便快速总结玩家对游戏的影响。

尽管这给了我们很多,但这一指标也有局限性(和其他指标一样)。首先,我们只有可见的游戏事实,除了产生统计数据,还有其他方法可以影响游戏。第二个限制是给出了一个总体的评估,因此,很难追踪受影响的游戏方面。

这是我们试图解决的第二个限制。为了提供更详细的见解,我们建议围绕 8 个轴对饼图进行细分:投篮、得分、进攻侵略性、防守侵略性、抢断、接球得分&、进攻和配合

对于这些轴中的每一个,我们根据我接下来将讨论的各种公式来计算分数(在 0 到 100 之间)。但是在我继续之前,我想介绍一下我们的视觉特征,这就是为什么我们必须把所有的轴放在同一个刻度上:蜘蛛图。

达米恩·利拉德的职业表现概述。图表由 Viziball 绘制。

蜘蛛图(或雷达图)对于以一种吸引人的方式比较数据是有用的。它们对于查看数据集中哪些变量得分高或低非常有效,这使它们成为显示性能统计数据的理想选择。此外,蜘蛛图很容易被大量受众理解,并且已经相当普遍(并非所有数据可视化图形都是如此)。然后,图表几乎没有注释,可以很容易地共享。

分析人士表示,这很快带来了许多见解。球员如何控制和分配球(得分球指示器)?他在团队层级中处于什么位置(关键人物指示器)?他在赚钱时间(离合指示器)好不好?他的进攻特点是什么?他如何影响防守(防守侵略性)?他是在创造自己的水桶,还是更像一个接球手(接球得分)?

为了让你更详细地了解 Viziball 如何试图提供一些答案,这里是如何建立指标。一些是基于基本的统计数据,而另一些是基于更高级的公式或逐场分析。

为了让你更详细地了解 Viziball 如何试图提供一些答案,这里是如何建立指标。有些是基于基本的统计数据,有些是基于更高级的公式或详细的分析。

  1. 造球:基于助攻失误率。该指标衡量控球和创造高效比赛的能力。
  2. 投篮:混合有效投篮命中率 (EFG%)和真实投篮命中率 (TS%)来衡量从任何距离射门得分的能力。
  3. 计分:点数
  4. Go-to guy :基于出场分钟数使用指标(球员在场上结束时手中财产的百分比)。
  5. 接球&得分:跟随一次助攻得分的能力(基于助攻得分%)* 。得分低并不意味着球员错过了他的接球&投篮,而是意味着他的大部分投篮都来自个人动作(没有队友的助攻)。*
  6. 进攻侵略性 : 平局犯规进攻篮板
  7. 防守侵略性 : 抢断盖帽,个人犯规。**
  8. Clutchness :这结合了几个基本的统计数据来产生一个单一的值。与游戏分数不同,这里我们为每个属性添加一个系数,这取决于剩余的游戏时间和动作发生时的点数差异。

如你所见,所有指标都是基于比赛期间记录的统计数据。我没有给出将所有指标放在同一尺度上的标准化过程。我同意这个过程听起来可能有些武断。但是,我们必须记住的是,我们正在尝试比较球员的表现。所以在这个过程的最后,当所有的表现都在蜘蛛图上时,这就是我们得到的。

同样重要的是要注意,在我们的计算中没有引入主观意见。比如说,看完比赛后,鲁迪·戈贝尔在防守方面度过了一个美好的夜晚。当然,如果有一个我们可以配置和调节值的仪表板,那就太好了。这样做,人们可以想象更多的轴。但这不是 Viziball 的哲学。我们避免在工作流程中引入偏见。我们做的是给分析师和内部人士带来工具,而不是相反。然后他们就可以自由下结论了。

做最后一个评论,我们也可以说这不应该代表玩家的内在价值,就像电子游戏试图做的那样。出于任何原因,球员的表现可能会被环境改变:教练的选择,裁判的决定,甚至是受伤。

我们的定位可以讨论很长时间(我也鼓励你给我反馈,帮助我们丰富我们的模型),但我认为是时候看看我们如何使用蜘蛛图了。

赛后报道

每天,对于所有可用的游戏,Viziball 建立一个赛后报告,其中每个玩家的蜘蛛图都是可用的。

例如,下面是巴姆·阿德巴约在 2021 年 1 月 23 日对阵布鲁克林篮网的比赛后的蜘蛛图。很快,在知道他在那场比赛中的统计数据之前,我们可以理解他在各个方面都度过了一个伟大的夜晚。

*

巴姆·阿德巴约 2021 年 1 月 23 日的表现概述。维兹鲍尔赛后报道。*

与此同时,凯里·欧文度过了一个关键的夜晚:三分球,突破上篮,关键罚球帮助篮网在第四节取得胜利。这可以通过他的蜘蛛图看出来,图中投篮离合指标都很高。

*

凯里·欧文 2021 年 1 月 23 日的表现概述。维兹鲍尔赛后报告。*

Viziball 还在同一个赛后报告中提供了一个热图,显示了球员在每个序列中的影响。在这里,这种影响用砖块的强度来表示。颜色越深,影响越高。下面,与最后一节相关的最后 4 个砖块看起来是垂怜经游戏中最激烈的。我们还可以看到这与他的积分线(蓝色)的关系,积分线在游戏结束时会增加。

*

凯里·欧文在对阵迈阿密的比赛中的表现。维兹鲍尔赛后报告。*

玩家的个人资料页面

Viziball 数据库中记录的每个球员都有自己的球员个人资料页面,其中有一个蜘蛛图和其他各种小部件。使用这个功能,我们可以观察一个球员在特定时期的表现,可以是他们的整个职业生涯,一个特定的赛季,或者任何个性化的持续时间。

这个网页可以高度定制(比如显示或隐藏蜘蛛图的轴),并且可以使用个性化的 URL 或嵌入式模式轻松共享。

图像底部是日期选择器模块。我们可以看到黄线显示了总体绩效(PIE)如何随着时间的推移而变化。

*

勒布朗詹姆斯职业表现概述。图表由 Viziball 绘制。*

该页面还包括一个名为职业道路的时间线模块,显示了玩家职业生涯的最高记录和他在所有球队的第一场比赛。

*

勒布朗詹姆斯的职业道路。时间线由维兹鲍尔。*

比较玩家

在我看来,蜘蛛图带来最重要的洞察力的地方是当我们覆盖几个玩家的时候。Viziball 的比较功能使得同时可视化两个玩家成为可能。这带来了各种各样的场景:比较对手,比较来自同一支球队的球员以了解他们如何才能适应,或者也比较同一名球员在职业生涯的不同时刻。

例如,下面是当前赛季(2020–2021)前几场比赛杰森·塔图姆(绿色)和布拉德利·比尔(红色)的对比蜘蛛图。我们可以看到他们在接球&得分组织进攻和投篮指标上的相似之处,但在其他方面也有一些明显的差距,在得分进攻&防守侵略性上比布拉德利·比尔有优势。**

另一方面,塔图姆似乎在所选期间的第四季度表现出色,他获得了 84 的离合器性能指标(布拉德利·比尔为 49)。

*

杰森·塔图姆(绿色)与布拉德利·比尔(红色)在 2020-2021 赛季首场比赛中的表现。 Viziball 蜘蛛图。*

比尔似乎是进攻中的第一选择,他的指标等于 93(杰森·塔图姆是 78)。为了了解这与传统数字的关系,让我们更深入一点。Beal 记录了每场比赛 35.6 分钟和 37.8% 的使用率。塔图姆 34.3 分钟,31.2% 使用率。**

**

杰森·塔图姆和布拉德利·比尔的平均数字。图表由 Viziball 绘制。**

这意味着杰森·塔图姆正在更多地分享球权。为了更进一步,我们可以观察的使用是如何在两个团队中分配的。我们可以在下面看到,与所有队友相比,比尔的使用率很高(除了拉塞尔·维斯特布鲁克,他有 31.42%),而凯尔特人似乎在三个关键人物之间分享进攻阶段:杰森·塔图姆、杰伦·布朗和肯巴·沃克,分别有 31.2%、35.75%和 32.35%

**

两队使用分布:奇才 vs 凯尔特人。图表由 Viziball 绘制。**

观察性能演变

寻找未来进步最多的玩家(或者也是最衰退的玩家)辨别玩家换队时的进化,或者只是观察玩家在游戏某个方面的进化:所有这些都可以通过这个功能来完成。

就我个人而言,我选择用尼古拉·约基奇的比较蜘蛛图来说明这个特征:

  1. 蓝色的是他 2019-2020 赛季的统计数据(包括泡沫和季后赛)。
  2. 黄色部分是他本赛季第一场比赛的数据。

**

尼古拉·约基奇在两个时期的比较蜘蛛图:2019 年至 2020 年(深蓝色)与 2020 年至 2021 年的第一场比赛(黄色)。 Viziball 的蜘蛛图。**

这使得更好地反映他令人印象深刻的演变成为可能。我们可以看到,他几乎在所有方面都有所提高,但不一定会延长他的关键人物指标(与上个赛季相比,该指标仅从 68 分钟增加到 72 分钟,即每场比赛+2.7 分钟,使用率+1.8%)。

深入一点细节,我们可以理解小丑是如何在不玩太久的情况下设法增加他的影响的。首先,他改进了射击轴,这使他可以直接增加他的得分(几乎每场+5 分)。他也制造了更多的犯规,这让他更经常地站在罚球线上。最后,他似乎扩大了他的控球和分配技能,一个制造比赛的指标从 75 增加到 88(即每场比赛+2.5 助攻和-1.1 失误)。**

最后,我们可以观察他在第四节的巨大影响。他的离合ness 指标本赛季初是 100!而且上个赛季已经很高了。每个人(从爵士和快船开始)都记得去年的季后赛和丹佛在赚钱时间的表现。

更进一步

正如您所看到的,这个特性是高度可配置的。显然,有些事情还不可能(例如,在同一个蜘蛛图上比较两个以上的球员),但该工具已经能够适应大量的组合,这可能会使球迷、分析师、赌徒甚至篮球专业人士优化他们的调查过程。因此,你可以通过这个工具自由地表达你的分析!

我想指出的是,Viziball 是一项 100%免费的服务,任何人都可以不受任何限制地使用。该研究项目于 2019 年底启动,由法国公司 Data Nostra 领导,该公司是 R&D 数据分析领域的专家(不仅限于体育),旨在确定体育数据处理的创新方法。该网站在不同的层面上不断发展。我们必须处理一个网站的经典问题(UX 设计,搜索引擎优化),但也对篮球分析方面。这就是我们尽量沟通工作的原因。更进一步说,我们特别喜欢来自专业体育分析家的信息反馈。

如今,该项目完全依靠公司自有资金运行,旨在延续 Viziball 服务。为此,我们对任何合作提议都持开放态度,无论是俱乐部、联盟还是专业媒体。

我们刚刚推出了一个 Twitter 账户,在那里我们定期分享基于 Viziball 的内容。这使得用不同的统计轴跟踪篮球新闻成为可能。因此,我邀请您跟随我们,分享我们的内容并亲自体验这一工具!

为什么要在图像分类实验中标注自己的数据?

原文:https://towardsdatascience.com/why-should-you-label-your-own-data-in-image-classification-experiments-6b499c68773e?source=collection_archive---------17-----------------------

尽管单调乏味,给你的图片贴标签可以提供有价值的见解。使用 tkteach 在 5 分钟内设置好您的贴标管道

凯利·西克玛在 Unsplash 上的照片

获取高质量的影像分类标签决定了您的项目是否有机会取得成功。互联网上有几乎无限的图像资源,但如果你的任务比猫狗分类器更复杂,往往很难找到适合解决你的特定问题的标记图像。

让事情变得更复杂的是,定义你的问题并提出正确的问题本身就是一个挑战。当您处理结构化数据时,您可以使用平均值、最大值或中值等聚合来轻松汇总数千条记录,使您在半小时内对整个样本有一些基本的了解。

当处理图像时,这变得复杂得多,因为你所能做的只是快速检查几十个图像,并希望你收集的任何见解将很好地推广到整个数据集。

影像数据的这一特征使得为您的模型定义正确数量的类或快速验证您尝试使用影像分类解决的问题的可行性变得非常棘手。

1.为什么手动标注数据集的子样本是个好主意?

从标记几千张图像开始实验听起来并不是最先进或最有趣的方法,但这种大胆的方法有几个优点:

  • 标注样本数据集是探索图像的最佳方式,因为它要求您为每一幅检查的图像做出决定,从而使您比浏览数据集时更加集中注意力
  • 对一个图像类做出数百个决定是验证您选择的类是否正确的快速方法,通常您需要添加一个新的类,因为您发现一些意外的图像类型比预期的更常见
  • 您可能会发现,您正在尝试解决的任务的大部分信息包含在图像的一小部分中,在这种情况下,可能值得添加一些成帧算法来增强重要部分并减少噪声,然后再将其提供给分类器
  • 自己对图像进行分类可以让你很好地洞察人类的表现以及你的模型可能面临的障碍。在错误分析过程中,这种经验是必不可少的,因为你经常会发现模型产生的错误类似于你花了最长时间来分类的图像
  • 如果你发现自己很难对图像进行分类,它们可能不是你试图解决的问题的答案。在这种情况下,您只是为自己节省了几个小时无价值的编码,因为您的模型可能不会超过人类的性能。后退一步,想想你是否问对了问题,这是一个好主意

好吧,以上所有观点听起来都很有说服力,但是谁有时间给成千上万的图片贴标签呢?好消息是,你可以在 3 个小时的工作时间内获得这些好处——比你花在调整模型上的时间要短得多。

虽然为了获得最佳的图像分类性能,您可能需要数万或数十万张图像,但从大约 5000 张手动标记的图像开始是验证您的分类器是否有机会的快速方法。5k 图像听起来很多,但是经过几分钟的练习,你可以每小时标记大约 1.5k-2k 图像。这几个乏味的小时可以快速验证项目的可行性,如果初始实验成功,您将拥有一个值得信赖的数据样本,可以将其用作测试集,以查看在更广泛的数据集上训练的模型与人类相比表现如何。

2.如何在 5 分钟内建立一个图像标注管道?

从我的经验来看, tkteach 正是建立一个简单而有效的标签管道的合适工具。这三个步骤是你开始标记你的图像所需要的,我将使用我自己的图像分类项目,在这里我试着以平面室内标准为例进行分类:

  1. 将 tkteach 资源库克隆到您的项目中
git clone [**https://github.com/Serhiy-Shekhovtsov/tkteach.git**](https://github.com/Serhiy-Shekhovtsov/tkteach.git)

2.在克隆的 tkteach 存储库中创建一个 ds 文件夹,并在 ds 文件夹中创建一个包含要标记的图像的文件夹

3.打开已存在于克隆 tkteach 存储库中的 categories.txt,并按照({keyboard key}) {class name}格式创建您自己的类。

现在你已经准备好开始你项目中最无聊的几个小时了,但是相信我,你的勇气会在以后得到回报的。将目录切换到您的 tkteach 文件夹并运行 tkteach.py。这将触发一个弹出窗口,要求您找到包含您要标记的图像的文件夹。选择好准备好的文件夹后,你就可以开始享受标签了——只需点击选择的键(在我的例子中是 q,w,e ),然后进入下一张图片。

3.访问标记的图像

您的图像标签存储在 tkteach 文件夹中名为 storage.db 的 sqlite 数据库中。您可以使用 dbeaver 或类似的 sqlite 数据库工具轻松访问它,只需选择 storage.db 路径。您的数据库应该如下所示:

图片标签表是查询图片及其标签的关键表,而类别表将 category_id 映射到实际的标签名称。如果您有多个包含图像的文件夹,您将只需要数据集表,因为它将允许您按文件夹过滤标记的图像。您可以通过一个简单的查询提取带标签的图像数据,该查询输出图像名称、位置及其类别。

SELECT imageName, imagePath, categoryNameFROM images aJOIN labels bON a.id = b.image_idJOIN categories cON b.category_id = c.id

4.一次乏味却有益的经历

我知道了艰难地标记自己的图像数据的好处——花费数小时试图改进计算机视觉模型,这些模型注定会失败,原因有两个:

  • 图像和/或其标签的质量太低
  • 图像中的信息与解决我的特定任务无关,我自己也没有很好地标记它们

在这两种情况下,几个小时无聊的图像标记让我实现了十几个小时的花式编码。

我不建议标记成千上万的图像——一旦你在自己的数据上取得了一些初步的成功,你可以找到其他方法来扩大你的数据集或找人来为你做标记。

然而,我鼓励你在开始你的计算机视觉项目时,试着花几个小时来标记几千张图像中值得信赖的子集。它允许您快速验证您的想法,是探索您的数据的一种很好的方式,可以节省您大量的时间。

自然语言处理中迁移学习的新进展

原文:https://towardsdatascience.com/why-should-you-leverage-transfer-learning-14d08a60f616?source=collection_archive---------19-----------------------

思想和理论

自然语言处理中迁移学习技术的发展综述

以下是我新发布的《自然语言处理的迁移学习》一书的节选。摘要总结了一些最近的 NLP 模型架构依赖于迁移学习的概念。

人工智能已经戏剧性地改变了现代社会。以前由人类完成的任务现在可以由机器来完成,速度更快,成本更低,在某些情况下效率更高。这方面的流行例子包括计算机视觉应用——涉及教计算机如何理解图像和视频——例如,用于在闭路电视摄像中检测罪犯。其他计算机视觉应用包括从患者器官的图像中检测疾病,以及从植物叶子中检测植物种类。人工智能的另一个重要分支,特别处理人类自然语言数据的分析和处理,被称为自然语言处理 (NLP)。NLP 应用的例子包括语音到文本的转录和各种语言之间的翻译,等等。在图 1 中,AI 和 NLP 在维恩图中与相邻的场并列。

图一。维恩图是自然语言处理(NLP)、人工智能(AI)、机器学习和深度学习等术语相对于彼此的可视化。也显示了符号 AI。(图片作者,来自 《自然语言处理的迁移学习》 )

人工智能、机器人和自动化领域技术革命的最新体现,被一些人称为第四次工业革命的,是由训练大型神经网络的算法进步、通过互联网获得的大量数据以及通过最初为个人游戏市场开发的图形处理单元(GPU)获得的大规模并行能力的交叉引发的。更具体地说,最近依赖于人类感知的任务自动化的快速发展,特别是计算机视觉和 NLP,要求神经网络理论和实践取得这些进展。这使得输入数据和期望的输出信号之间的复杂表示能够被学习,以处理这些困难的问题。

与此同时,对人工智能在不久的将来能够完成的事情的预测已经大大超过了在实践中已经取得的成就。我们被警告一个世界末日的未来,它将抹去大多数人类工作,取代我们所有人,甚至可能对我们的生存构成威胁。自然地,自然语言处理也不排除在这种推测之外,并且它是今天人工智能中最活跃的研究领域之一。

迁移学习旨在利用不同背景下的现有知识——无论是不同的任务、语言还是领域——来帮助解决手头的问题。它受到人类学习方式的启发,因为我们通常不会针对任何给定的问题从零开始学习,而是建立在可能相关的先验知识上。例如,当一个人已经知道如何演奏另一种乐器时,学习演奏一种乐器被认为更容易。显然,乐器越相似,例如风琴和钢琴,先前的知识就越有用,学习新乐器就越容易。然而,即使乐器大不相同,比如鼓和钢琴,一些先前的知识仍然是有用的,即使不那么有用。在这个思维实验中,部分原因可能是因为坚持一个节奏是两种乐器共有的技能。

大型研究实验室,如 Lawrence Livermore 国家实验室或 Sandia 国家实验室,以及大型互联网公司,如谷歌和脸书,能够通过对数十亿个单词和数百万张图像训练非常深度的神经网络来学习非常大型的复杂模型。例如,谷歌的自然语言处理模型 BERT】接受了来自英语维基百科(25 亿个单词)和图书语料库(8 亿个单词)的超过 30 亿个单词的预训练。同样,深度卷积神经网络(CNN)已经在 ImageNet 数据集的超过 1400 万张图像上进行了训练,学习到的参数已经被许多组织广泛外包。今天,从零开始训练这种模型所需的资源量对于神经网络的普通从业者来说通常是不可用的,例如在较小企业工作的 NLP 工程师、较小学校的学生等。这是否意味着较小的参与者无法在他们的问题上取得最先进的成果?令人欣慰的是,如果应用正确,迁移学习的概念有望减轻这种担忧。

迁移学习为什么重要?

迁移学习使您能够将从一组任务和/或领域获得的知识调整或转移到另一组任务和/或领域。这意味着,一个用海量资源训练出来的模型——包括数据、计算能力、时间、成本等。—一旦开源,更广泛的工程社区就可以对其进行微调,并在新的环境中重新使用,而所需资源只是原始资源的一小部分。这是 NLP 民主化的一大步,更广泛地说,是 AI 民主化的一大步。图 2 展示了这个范例,以学习如何演奏乐器为例。从图中可以看出,不同任务/域之间的信息共享可以导致后面的或下游任务 b 实现相同性能所需的数据减少

图二。转让好处的说明。收入模式,显示在底部面板中,其中信息在为不同任务/领域训练的系统之间共享,而传统模式,显示在顶部面板中,其中训练在任务/领域之间并行发生。在迁移学习范式中,通过信息/知识共享可以减少数据和计算需求。例如,如果一个人先知道如何弹钢琴,我们期望他更容易学会打鼓。(图片作者,来自 《自然语言处理的迁移学习》 ,灵感来自图 3 本文)

NLP 迁移学习的最新进展

传统上,对于任何给定的问题设置(任务、领域和语言的特定组合),学习都是在完全监督或完全无监督的方式下从零开始进行的。早在 1999 年,在支持向量机 (SVMs)的背景下,半监督学习就被认为是一种解决潜在的有限标记数据可用性的方法。对较大的未标记数据集合的初始无监督预训练步骤使得下游监督学习更容易。这种方法的变体研究如何处理潜在的噪音,即可能不正确的标签——这种方法有时被称为弱监督学习。然而,通常假设标记和未标记数据集具有相同的采样分布。

迁移学习放松了这些假设。迁移学习的需要在 1995 年被公认为是“学会学习”的需要。NeurIPS 可能是机器学习领域最大的会议。本质上,它规定智能机器需要拥有终身学习的能力,将学到的知识重新用于新的任务。它后来被冠以几个不同的名称进行研究,包括学会学习知识转移归纳偏差多任务学习等。在多任务学习中,算法被训练成同时在多个任务上表现良好,从而揭示可能更普遍有用的特征。然而,直到 2018 年左右,人们才开发出实用且可扩展的方法,在 NLP 中实现最难的感知问题。

2018 年见证了自然语言处理领域的一场革命。对如何最好地将文本集合表示为向量的理解发生了巨大的变化。此外,开源模型可以被微调或转移到不同的任务、语言和领域,这一点得到了广泛的认可。与此同时,几个大的互联网公司发布了更多更大的 NLP 模型来计算这种表示,他们还指定了定义良好的程序来微调它们。突然之间,普通的从业者,甚至是一个独立的从业者,都有能力在 NLP 中获得最先进的结果。它甚至被广泛称为 NLP 的“ImageNet 时刻”,指的是 2012 年后计算机视觉应用的爆炸,当时一个经过 GPU 训练的神经网络赢得了 ImageNet 计算机视觉竞赛。就像最初的 ImageNet moment 一样,预训练模型库第一次可以用于任意 NLP 数据的大型子集,以及定义良好的技术,用于微调它们以适应手头的特定任务,其标注数据集的大小远远小于其他情况下所需的大小。这本书的目的是描述、阐明、评估、论证性地应用、比较和对比属于这一类别的各种技术。接下来我们简要概述这些技术。

对自然语言处理的迁移学习的早期探索集中在对计算机视觉的类比上,它已经成功地应用了十多年。一个这样的模型— 本体建模的语义推理(SIMOn) — SIMOn 采用字符级 CNN 结合双向长短期记忆网络 (LSTMs)进行结构化语义文本分类。它展示了 NLP 迁移学习方法,与计算机视觉中使用的方法直接类似。大量关于计算机视觉应用的迁移学习的知识推动了这种方法。通过该模型学习的特征被证明对于无监督的学习任务也是有用的,并且在社交媒体语言数据上工作得很好,这些数据可能有些特殊,并且与维基百科和其他基于书籍的大型数据集上的语言非常不同。

word2vec 最初表述的一个显著缺点是歧义。没有办法区分一个词的各种用法,这些用法根据上下文可能有不同的含义,即同形异义词:例如,鸭子(姿势)对鸭子(鸟),公平(聚会)对公平(公正)。在某种意义上,原始 word2vec 公式通过表示单应词的这些不同含义的向量的平均向量来表示每个这样的词。 来自语言模型的嵌入——在流行的芝麻街角色后缩写为 ELMo 是使用双向 LSTMs 开发单词的语境化嵌入的尝试。ELMo 模型的高级架构图如图 3 所示。

图 3。在文档分类示例的上下文中可视化 ELMo 架构。(图片作者,来自 【自然语言处理的迁移学习】 )

单词在该模型中的嵌入在很大程度上取决于其上下文,对于每个这样的上下文,相应的数字表示是不同的。ELMo 通过训练来预测单词序列中的下一个单词,这是语言建模领域的一项重要任务。巨大的数据集,例如维基百科和各种书籍的数据集,在这个框架中很容易用于训练。

https://arxiv.org/abs/1801.06146(ULM-FiT)通用语言模型微调(Universal Language Model Fine-tuning)是一种被提出来为任何特定任务微调任何基于神经网络的语言模型的方法,最初在文本分类的上下文中被演示。这种方法背后的一个关键概念是区别性微调,其中网络的不同层以不同的速率进行训练。OpenAI 生成预训练转换器 (GPT)修改了转换器的编码器-解码器架构,以实现 NLP 的可微调语言模型。这个模型架构如图 4 所示。

图 4。GPT 架构的高级表示,显示了堆栈解码器、输入嵌入和位置编码。来自顶部的输出可以用于文本预测/生成和分类。(图片作者,来自 《自然语言处理的迁移学习》 )

GPT 丢弃了编码器,保留了解码器和它们的自我关注子层。 来自变压器 (BERT)的双向编码器表示可以说是相反的,通过保留编码器和丢弃解码器来修改变压器架构,还依赖于屏蔽单词,这些单词随后需要作为训练度量来准确预测。BERT 如图 5 所示。

图 5。BERT 架构的高级表示,显示了堆栈编码器、输入嵌入和位置编码。在训练期间,来自 top 的输出被用于下一句预测和填空屏蔽语言建模目标。(图片作者,来自 《自然语言处理的迁移学习》 )

这些概念在书中进行了详细的讨论,在实践中的例子问题,如垃圾邮件检测,假新闻分类,列类型分类,聊天机器人,等等。

在所有这些基于语言模型的方法中——ELMo、ULM-FiT、GPT 和 BERT——都表明,生成的嵌入可以针对特定的下游 NLP 任务进行微调,只需要相对较少的标记数据点。对语言模型的关注是有意的;假设由它们诱导的假设集通常是有用的,并且已知大规模训练的数据是容易获得的。

从那时起,在前面描述的思想的基础上开发了各种新的模型——从旨在减少 BERT 的大小同时实现几乎相同的性能的模型,如 ALBERT 和 DistilBERT,到旨在处理长文档的模型,如 LongFormer 和 BigBird。

NLP 迁移学习领域目前是一个非常活跃和令人兴奋的领域,现在是学习如何利用它的好时机!

要了解更多,请查看 Sebastian Ruder 的优秀博客和拥抱脸的优秀变形金刚库。也请查看我在 GitHub 和 Kaggle 上的代表性代码示例报告。

《自然语言处理的迁移学习》的硬拷贝和电子书版本可从manning.com亚马逊巴恩斯&诺布尔塔吉特获得。

为什么您应该重新考虑您的查询

原文:https://towardsdatascience.com/why-should-you-rethink-your-queries-aca569560638?source=collection_archive---------36-----------------------

了解什么是隐式连接、显式连接及其区别

托拜厄斯·菲舍尔在 Unsplash 上的照片

作为一名数据科学家,查询数据库是我日常生活的一部分。

因此,以精确的方式提供信息并构建查询以使它们易于被重新访问是至关重要的,因为这不仅减少了可能的错误,还节省了维护过程中的大量时间。

然而,为了达到这个理想的查询级别,有必要理解它们行为中的细微差别。

然而,没有人天生就是专家,我们试图一次理解一个人的细微差别,不管是出于需要,还是出于好奇,至少这是我的哲学。

介绍完毕,让我们继续挑战,考虑以下场景:

你的老板向你要一份 a 公司所有员工的名单。

您打开数据库,看到以下表格:

雇员

“作者截图”

角色

“作者截图”

很简单,不是吗?(我希望真正的查询在这个层次上,但是我们将关注一个简单的例子)。

您立即开始编写,得到的查询是:

SELECT Employees.ID, name, enterprise, role_ID, roles 
FROM Employees
INNER JOIN  Roles
ON Employees.role_ID = Roles.ID
WHERE Employees.enterprise = "A";

“作者截图”

你导出名单,交给你的老板,任务完成。恭喜你。

你的老板没有提到的是,他也把同样的任务交给了另一个同事,唯一的目的就是取笑你(毕竟谁不喜欢好的恶作剧呢!).

5 分钟后,你的老板打电话给你,向你展示你同事的解决方案,并问你:下面的问题和你的有什么不同?

SELECT Employees.ID, name, enterprise, role_ID, roles
FROM Employees, Roles
WHERE Employees.role_ID = Roles.ID
AND Employees.enterprise = "A";

没错,你的老板在跟你胡闹。

两个查询产生相同的结果!

然而,它们并不平等。

尽管如此,如果你想改变你的查询,我会试着永远驱除这种想法。

为此,让我们把它分成几个部分,你刚才看到的只是隐式连接(第二个版本)和显式连接(第一个版本)之间的区别。

这让我想到了第一点:

#1。通过使用隐式版本,您可以委托表合并选择

当你试图弄清楚信息是从哪里来的以及如何来的时,一个简单的事实是,你正在委托那个选择,这可能会导致将来的麻烦(下面有更多关于这个的信息)。

因此,如果可以选择的话,采用显式路径,这样可以保证在构造查询时选择的清晰性。

实际上,默认情况下,当使用条件(其中 Employees.role_ID = Roles)请求隐式连接时。ID 和 Employees.company = 'A ')执行内部联接。

这让我想到了第二点:

#2。如果你忘记了条件呢?

在只有两个表的场景中,这种情况不会发生,但是当我们讨论复杂的查询时,我们很容易调用多个表,因此忘记一个关系条件的可能性增加了。

当我们使用隐式连接时,默认情况下,如果没有指定条件,就会执行交叉连接,对于大多数健忘的人来说,这是表之间的笛卡尔积。

在我们的场景中,这将是一个包含按 n 个角色排列的 n 个雇员行的表。

SELECT Employees.ID, name, enterprise, role_ID, Roles.ID, roles 
FROM Employees, Roles
WHERE  Employees.enterprise = "A";

“作者截图”

(你有没有注意到我们从 3 排的桌子跳到了 9 排?!)

不同的是,当使用显式连接时,如果没有指定条件,查询只会返回一个错误。

#3。维护

自从你的老板对你恶作剧以来,两年过去了,他现在要求你对你的同事(现在在另一家公司)在同一时期所做的查询进行调整。

您打开查询,面对无限多的隐式连接,当您开始分析关系条件时,您注意到有一个条件没有声明。

当这样一个问题出现时:是我的前同事忘记了关系条件,还是查询实际上是正确的,他想进行交叉连接?

然而,没有人记录该查询的目标,并且您正在推断它的目标。由于你已经在公司工作了两年,你可以看到两种情况(有或没有条件)都有道理的现实,此外,现在甚至你的前同事可能都不记得你是正确的版本。

使用显式连接,因为没有条件查询将无法工作,如果确实存在交叉连接,则必须声明它,因此不会出现此问题。

此外,通过显式连接,查询变得更具可读性(谁不喜欢更愉快的阅读呢?).这样你就可以一点一点地浏览正在发生的事情。

还记得模块化代码的原理吗?

这是非常相似的,每个显式连接代表一个模块,所以如果您已经知道问题所在,您可以直接转到一个模块并更改它,而不是遍历每个条件来解开表之间的关系。

如果你仍然不相信,我有几个额外的要点:

#4。通过显式连接,您可以控制执行的顺序

#5。自从 1992 年显式连接被确立为标准以来(没错,将近 30 年前!!!)

特别是在 SQL-92 语言的第三个版本中。

(如果你的战士想要额外的挑战,你可以在这里查阅修订版)。

总而言之,在一天结束的时候,由你来质疑你自己的查询:它们是否带来了你需要的结果,是否有不准确的倾向?但最重要的是,你的目标够清楚吗??如果没有,你能说得更清楚吗,或者你需要在过程中记录任何东西吗?

请记住,第二天,你将在另一端试图解决留下的烂摊子。

所以,在这一切之后,我问你:

您将使用哪种类型的查询?

附注:你有没有想到任何其他的观点,或者你不同意以上提到的任何观点?在 Linkedin 上与我评论或交谈,让我们一起改进这篇文章。

信息来源:

1.维基百科| SQL

2.维基百科| SQL-92

  1. SQL-92

4.Stackoverflow | SQL 左连接 vs 多个表 on FROM 行?

为什么智能数据科学家总是在基础数据科学面试中失败

原文:https://towardsdatascience.com/why-smart-data-scientists-keep-failing-basic-data-science-interviews-3a0f70f1fad8?source=collection_archive---------18-----------------------

如何抓住每一个工作机会

Unsplash 上由 Austin Distel 拍摄的照片

数据科学家的头衔不仅仅是放在盘子里交给纯粹的技术极客,而是实至名归的。从参加编程课程到科技盛会再到实习,成为本世纪最性感工作的专业人士并不是一件容易实现的壮举。你会同意,获得数据科学家的职业需要大量的申请、意向书、面试和考试,这些都有可能被不同的机构拒绝。

该领域的大多数专业人士都在不断寻找新的更好的机会来增加他们的经验,并在他们的银行账户上添加更多的零。有这么多合格但有限的职位,要找到那份理想的工作相当具有挑战性。IBM 最近发布的一项研究表明,全球还需要另外 28%的数据科学家来满足日益增长的需求。然而,大多数公司都倾向于在重要职位上雇佣有丰富经验的专业人士。

面试和你的技能一样重要。在面试中尽你最大的努力是你获得工作的首要条件。你花了几个月的时间准备你的作品集和申请,但是你带着焦虑的心情去参加面试,结果你把一切都搞砸了。根据我三年来进行数据科学工作面试的经验,以及顶级公司其他专业人士的研究,以下是大多数数据科学家面试失败的核心原因以及如何避免这些原因。

作者创造的形象。

默默工作

你喜欢在工作时保持安静吗?当你一个人的时候,它可能对你有用,但是当你在你潜在的雇主面前练习的时候,它肯定不会有用。大部分人编码的时候都不会大声说出来,我也懂。有点压力。但是你需要为你的面试说话和支撑你的步伐。大多数面试通常很简短,你的面试官希望实时了解你的技术、进步和行为特征。因此,如果你在这些方面有所欠缺,你的分数会大幅下降。

当被要求解决一个问题时,重复问题,以清楚地了解问题。通过这样做,你让面试官看到了解决问题时的同理心和准确性。积极地与面试官交流也为你赢得了思考的时间,并刷新了你解决问题所需技巧的记忆。

这是一个协调数据分析访谈的例子——展示工作时的互动:

“所以如果我答对了问题,你要我(重复问题)。我们在同一页上吗?

“在我继续之前,我会查看我正在处理的数字和统计数据,以防止在我进行过程中出现任何不必要的错误。

“首先,我启动我的 Jupyter 笔记本并导入依赖项,然后运行以检查错误。同时,预览数据的文件位置。这可以接受吗?

“我已经通过输入data.isnull()检查了空值,但是我可以看到它运行缓慢并且充满了一些错误。为了不浪费任何时间,我将运行一个不同的命令,看看是否也能提高速度和效率……”

从这个例子中,你可以看到要点是如何分解的,面试官是如何随着每一步的进展而进行的。这只是技术性和交互性完美和谐工作的一个例子。更好更直接的改进方法是与你的教练、客户和同事进行多次模拟面试——熟能生巧。反馈至关重要;它们是你需要知道的最好的方法。

在准备阶段忽略面试的重要方面

为了赢得面试,你已经严格学习了编程、数据科学和/或机器学习的基础知识。你扮演了你的角色,尽你最大的努力尝试了这些问题。如果一切都那么“完美”,你为什么没有得到这份工作?我见过很多人哀叹,因为他们的质量和专业精神,他们被欺骗或被敲竹杠。不要误解我,这些人是技术天才,拥有健康的投资组合,但他们缺乏必要的技能。这些技能决定了数据科学家在压力下与团队和管理层一起工作时的效率。

找对职业技能堪比玩 俄罗斯方块设置为隐形 。因此,除了统计和算法,你还需要展示一些积极的技能来打动你的听众。

67%的人力资源专业人士表示,由于缺乏软技能,他们拒绝了一位有才华的 IT 候选人的工作邀请,原因如下。让我们面对它;没有人想雇佣一个不知道如何与该领域其他专业人士恰当互动的科技机器人。数据科学不像许多人认为的那样仅仅与数字有关。一旦你的项目完成,你需要向你的团队或上级展示你的工作。因此,一旦你的读者发现了这些基本但重要的技能中的漏洞,他们就会把你的简历从他们的办公桌上拿走——你就失去了这份工作。

大多数数据科学家未能开发和实践技能,如基本的沟通,带有一点幽默、协作、互动、无私、多才多艺和依赖。这些听起来可能没有技术诀窍重要,但它们对你的成功至关重要。在面试的前一天,读一些专业人士写的书,集中在发展专业交流上——像 TED 一样说话:卡门·盖洛 写的 9 个公开演讲的秘密是一个守护者。向你自己或最好是有共同兴趣的同事解释你对某个项目的解决方案和观察结果,也是提高沟通技巧的一个很好的练习。

未能跟上行业的最新趋势

越来越多的行业正在使用数据科学来满足他们各种复杂的业务需求-在瞬间提取和分析数据是所有公司都希望实现的现代进步。随着更多的参与和自动化技术,我们所知道的数据科学正在经历快速发展;因此,从发布之日起,及时了解最新变化是至关重要的。

物联网(IoT) 、机器学习、统计学只是数据科学的几个方面。数据无疑是一个广阔的领域,跟上最新的趋势和变化通常具有挑战性。跟上时代对我来说也很难适应——你并不孤单——这是压倒性的,每个人,不管知识如何,都在努力跟上。

准备面试时,你必须掌握与你申请的职位和整个数据科学相关的最新趋势信息。面试官会很好奇,想获得关于行业发展和其他前景的新观点。

为了加快您的旅程,以下是数据科学家如何保持自我更新的列表:

  • 参加会议:会议和技术聚会是向其他专业人士学习和获取对当前话题的看法的好方法。如果你需要最新的科技发展,那就开始参加会议吧。
  • 推特:如今每个人都有智能手机;信息的移动性是好处之一。行业内的公司和顶级科学家使用微博平台将信息快速传递给更广泛的受众。如果你是新手,你会对你错过的大量有趣的数据科学更新感到惊讶。@GoogleAI、@OpenAI、@AndrewYNg、@KDNuggets、@Goodfellow_Ian 和其他人是我在旅途中获取更新的首选来源。

谷歌人工智能展示数据集的更新。作者截图

  • 时事通讯:你可能会因为你的“电子邮件隐私政策”而对此不以为然,但是订阅几份时事通讯总是个好主意。你可以从网上博客和出版物中找到好的时事通讯。如果你和我一样,不喜欢每日时事通讯,那么像走向数据科学这样的出版物每周都会让我了解最新消息。

最终想法

完成一项认证或四年的课程会让你成为一名数据科学家,但不是一名称职的数据科学家。公司需要不仅仅会编程的应聘者。数据科学、数据工程、DevOps 工程、人工智能领域的职业生涯都是基于棘手的面试。但好消息是,通过适量的练习、积极的态度和不断学习的动力,这些问题很容易克服。如果你正在为下一次面试做准备,或者正在寻找磨练和掌握这种技能的方法,这里有一些小贴士可以指导你:

1.事先对你申请的公司和职位进行调查。

2.互动。互动酝酿伟大的关系。

3.你的语言要精确而广博。我认为所有的数据科学家都必须具备 Python、R 和 SQL 方面的高深知识。

4.面试时,边练习边解释你的模型。带着你的听众——包括技术性和非技术性的。

5.最重要的是,要诚实。不要用你不完全熟悉的技术、语言或工具填充你的应用程序。

为什么坚实的原则不是软件设计的坚实的解决方案

原文:https://towardsdatascience.com/why-solid-principles-are-not-a-solid-solution-for-software-design-fa71b6017ed6?source=collection_archive---------5-----------------------

软件世界

应用坚实的原则是一个目标,而不是命运

迈克尔·泽兹奇Unsplash 上拍摄的照片

obert J. Martin 在 2000 年介绍了坚实的原则,当时面向对象编程是程序员的艺术。每个人都想设计一些持久的东西,可以尽可能地重复使用,在未来只需要最小的改变。固体是它的完美名字。

事实上,当我们能够区分什么将会保留,什么将会改变时,面向对象编程工作得最好。坚实的原则有助于倡导这一点。

我个人喜欢坚实的原则背后的想法,并从中学到了很多。

然而…

有一个主要的挑战,所有的软件都意味着改变。要预测变化真的很难,如果不是不可能的话。因此,对我们来说,很难明确界定什么会保持不变,什么会改变。

为了说明这个挑战如何影响坚实的原则,让我们来看看每一个原则。

单一责任原则

"一个的改变不应该有一个以上的原因."换句话说,每个类应该只有一个责任。

让我们假设,我们的程序需要一个计算函数。这个班的唯一职责就是计算。

class Calculate {
   fun add(a, b) = a + b
   fun sub(a, b) = a - b
   fun mul(a, b) = a * b
   fun div(a, b) = a / b
}

对某些人来说,这是完美的,因为它只有一个责任,即计算。

但有人可能会反驳说:“嘿!它做 4 件事!加减乘除!”

谁是对的?我会说视情况而定。

如果你的程序只使用Calculate来执行计算,那么一切都好。进一步抽象化将会过度工程化。

但是谁知道呢,将来可能有人只想做加法运算而不需要通过Calculate类。那么上面需要改!

单一责任的定义取决于程序的上下文,并且会随着时间的推移而改变。我们现在可以实现这个原则,但不能永远实现。

开闭原理

"软件实体…应该对扩展开放,但对修改关闭."

这个原则是一个理想主义的原则。它假设一旦一个类被编码,如果编码正确,就不需要再修改了。

让我们看看下面的代码

interface Operation {
   fun compute(v1: Int, v2: Int): Int
}class Add:Operation {
   override fun compute(v1: Int, v2: Int) = v1 + v2
}class Sub:Operation {
   override fun compute(v1: Int, v2: Int) = v1 - v2
}class Calculator {
   fun calculate(op: Operation, v1: Int, v2: Int): Int {
      return op.compute(v1, v2)
   } 
}

上面有一个接受操作对象进行计算的Calculator类。我们可以轻松地用 Mul 和 Div 操作进行扩展,而无需修改Calculator类。

class Mul:Operation {
   override fun compute(v1: Int, v2: Int) = v1 * v2
}class Div:Operation {
   override fun compute(v1: Int, v2: Int) = v1 / v2
}

很好,我们实现了开闭原则!

但是有一天,一个新的需求进来了,说他们需要一个叫逆的新操作。它只需要一个操作符,比如 X,然后返回 1/X 的结果。

到底谁能想到这个会进来?我们已经将操作界面的计算功能固定为 2 个参数。现在我们需要一个只有 1 个参数的新操作。

现在怎样才能避免修改计算器类?如果我们事先知道这一点,我们可能就不会这样编写计算器类和操作接口了。

变化永远不可能完全计划好。如果只能完全计划好,我们可能就不再需要软件了:)

利斯科夫替代原理

"使用指向基类的指针或引用的函数必须能够在不知道的情况下使用派生类的对象."

当我们小的时候,我们学习动物的基本属性。他们是可移动的。

interface Animal {
   fun move()
}class Mammal: Animal {
   override move() = "walk"
}class Bird: Animal {
   override move() = "fly"
}class Fish: Animal {
   override move() = "swim"
}fun howItMove(animal: Animal) {
   animal.move()
}

这符合利斯科夫替代原理。

但是我们知道上面所说的并不正确。一些哺乳动物游泳,一些飞行,一些鸟类行走。所以我们改成

class WalkingAnimal: Animal {
   override move() = "walk"
}class FlyingAnimal: Animal {
   override move() = "fly"
}class SwimmingAnimal: Animal {
   override move() = "swim"
}

酷,一切还好,因为我们下面的功能还可以用动物。

fun howItMove(animal: Animal) {
   animal.move()
}

今天,我发现了一些事情。有些动物根本不动。它们被称为无柄的。也许我们应该换成

interface Animal interface MovingAnimal: Animal {
   move()
}class Sessile: Animal {}

现在,这将打破下面的代码。

fun howItMove(animal: Animal) {
   animal.move()
}

我们没有办法保证永远不会改变howItMove的功能。基于我们在那个时间点所了解的情况,我们可以做到这一点。但是当我们意识到新的需求时,我们需要改变。

即使在现实世界中,也已经有如此多的例外。软件世界不是真实的世界。一切皆有可能。

界面分离原理

“许多特定于客户端的接口比一个通用接口要好。”

再来看看动物界。我们有一个动物界面如下。

interface Animal {
   fun move()
   fun eat()
   fun grow()
   fun reproduction()
}

但是,正如我们上面意识到的,有一些动物是不动的,这种动物叫做无柄动物。所以我们应该把move功能分离出来作为另一个接口

interface Animal {
   fun eat()
   fun grow()
   fun reproduction()
}interface MovingObject {
   fun move()
}class Sessile : Animal {
   //...
}class NonSessile : Animal, MovingObject {
   //...
}

然后我们也想有植物。也许我们应该把growreproduction分开

interface LivingObject {
   fun grow()
   fun reproduction()
}interface Plant: LivingObject {
   fun makeFood()
}interface Animal: LivingObject {
   fun eat()
}interface MovingObject {
   fun move()
}class Sessile : Animal {
   //...
}class NonSessile : Animal, MovingObject {
   //...
}

我们很高兴,因为我们尽可能多地分离出特定于客户端的接口。这看起来是一个理想的解决方案。

然而,有一天,有人哭了,“歧视!有些动物不育,并不意味着它们不再是有生命的物体!”。

看来我们现在必须将reproductionLivingObject接口中分离出来。

如果我们这样做,我们实际上每个接口都有一个功能!它非常灵活,但如果我们不需要如此精细的分离,它可能会过于灵活。

我们应该把我们的接口分离得多好,取决于我们程序的上下文。不幸的是,我们节目的背景会不时改变。因此,我们也应该继续重构或分离我们的接口,以确保它仍然有意义。

依赖性倒置原则

"依靠抽象,而不是具体."

这个原则是我喜欢的,因为它是相对普遍正确的。它应用了独立依赖解决方案概念的思想,其中软件实体虽然依赖于一个类,但仍然独立于它。

如果我们要严格地实践这一点,任何东西都不应该直接依赖于一个类。

让我们看看下面的例子。它确实应用了依赖性倒置原则。

interface Operation {
   fun compute(v1: Int, v2: Int): Int
   fun name(): String
}class Add:Operation {
   override fun compute(v1: Int, v2: Int) = v1 + v2
   override fun name() = "Add"
}class Sub:Operation {
   override fun compute(v1: Int, v2: Int) = v1 - v2
   override fun name() = "Subtract"
}class Calculator {
   fun calculate(op: Operation, v1: Int, v2: Int): Int {
      println("Running ${op.name()}")
      return op.compute(v1, v2)
   } 
}

Calculator不依赖于AddSub。但这使得AddSub反而依赖于Operation。看起来不错。

然而,如果有人从 Android 开发组使用它,它有一个问题。println在安卓系统中不工作。我们将需要Lod.d来代替。

要解决这个问题,我们还应该让Calculator不直接依赖于println。相反,我们应该注入一个打印接口

interface Printer {
   fun print(msg: String)
}class AndroidPrinter: Printer {
   override fun print(msg: String) = Log.d("TAG", msg)
}class NormalPrinter: Printer {
   override fun print(msg: String) = println(msg)
}class Calculator(**val printer: Printer**) {
   fun calculate(op: Operation, v1: Int, v2: Int): Int {
      **printer.print("Running ${op.name()}")**
      return op.compute(v1, v2)
   } 
}

这解决了问题,同时满足依赖性反转原则。

但是如果 Android 永远不需要使用这个Calculator,而我们提前创建了这样一个界面,我们可能已经违反了 YAGNI

TL;DR;

让我重申,对我来说,坚实的原则是软件设计解决方案的好原则,值得我们去追求。当我们在那个时间点很好地知道什么是固定的,什么可能会改变时,这尤其有用。

然而,变化的发生超出了我们的预料。当这种情况发生时,新的需求将使我们最初的设计不再坚持坚实的原则。

这是正常的。会发生的。我们只需要应用新的需求,并在时间点上再次改变它,重新巩固它。

软件的本质是软的,把它做实才是硬的。对于软件来说,应用坚实的原则是一个目标,而不是命运。

为什么开始使用 sktime 进行预测?

原文:https://towardsdatascience.com/why-start-using-sktime-for-forecasting-8d6881c0a518?source=collection_archive---------2-----------------------

实践教程

sktime 区别于其他预测框架的特性概述

照片由 Aron 视觉效果Unsplash 上拍摄

预测的作用

企业主面临的挑战之一是预测未来的市场状况。预测有助于做出明智的决策,并形成对结果的现实预期。这种对预测的需求导致了预测工具的不断发展。它们能够通过从过去的观察中获取有用的信息来预测未来的事件。最近的一些预测框架包括脸书的 Prophet ,优步的 Orbit ,或者 Linkedin 的 Greykite 。然而,大多数 Python 预测包关注于特定的模型族,例如,广义加法模型或统计模型。Sktime 旨在填补这些预测工具之间的空白。

什么是 sktime?

Sktime 是一个用于时间序列建模的开源工具箱。它结合了分布在许多 Python 库中的功能。它还增加了自己独特的预测功能。它允许我们为时间序列训练、微调和评估模型。它与 scikit-learn 兼容。该框架还支持例如时间序列分类、特征提取和时间序列聚类。要获得完整的特性列表,请查看 sktime 的文档。本文主要关注预测以及 sktime 如何让整个过程变得更简单。这是 sktime 预测功能的实际演练。但是首先,让我们快速浏览一下本文中使用的数据。

数据概述

所有代码示例都基于 statsmodels 库中的公共数据集。它包含了 1959 年至 2009 年间美国季度宏观经济数据。数据集的完整描述可在此处获得。我们将重点预测实际国内生产总值。

数据概述

一段时间内的宏观经济指标。作者图片

Sktime 对用于存储时间序列的数据结构施加了某些限制。您可以在下面找到宏观经济数据导入和转换。

但是重点是…

为什么要用 sktime 做预测?

1)它在一个统一的 API 下结合了许多预测工具

Sktime 汇集了许多预测库的功能。在此基础上,它提供了一个统一的 API,与 scikit-learn 兼容。

在这种情况下,统一 API 的优势是什么?以下是一些主要原因:

  • 它允许用户轻松实现、分析和比较新模型。
  • 由于预测者的明确分类,它有助于避免在选择适当的算法时出现混乱。
  • 它使工作流程可读性和可理解性,因为所有预测者共享一个公共界面。它们在单独的类中实现,就像在其他工具箱中一样,包括 scikit-learn。
  • 它可以改变工作流程中的预测者。这使我们不必在每次改变模型时调整代码的结构。

Sktime 的预测者分享了至关重要的 scikit-learn 的方法,比如 fit()predict() 。下面的代码显示了一个基本的预测工作流。

**Output:**
2002Q2    11477.868

上面的代码生成一步预测。这就是我们将其中一个分配给预测范围的原因。现在让我们关注指定地平线的不同可能性。

预测范围可以是一组相对值或绝对值。绝对值是我们想要生成预测的特定数据点。相对值包括将进行预测的步骤列表。如果我们使用 update_predict() 方法进行滚动预测,相对预测范围尤其有用。这使我们不必在每次生成预测时更新绝对范围。当我们添加新数据时,相对范围保持不变。

我们也可以将相对地平线转换成绝对地平线,反之亦然。从绝对值到相对值的转换尤其值得一提。它不仅仅产生一个步骤编号列表。这些值与培训系列的最后日期相关。这意味着如果值为负,则它们是样本内预测。这一功能非常重要,因为预测者可以为每一步设定不同的参数。下面的代码显示了预测范围之间的差异。

**Output:**
Absolute FH: ForecastingHorizon(['2002Q2', '2002Q3', '2002Q4', '2003Q1', '2003Q2', '2003Q3','2003Q4', '2004Q1', '2004Q2', '2004Q3', '2004Q4', '2005Q1', '2005Q2', '2005Q3', '2005Q4', '2006Q1', '2006Q2', '2006Q3', '2006Q4', '2007Q1', '2007Q2', '2007Q3', '2007Q4', '2008Q1', '2008Q2', '2008Q3', '2008Q4', '2009Q1', '2009Q2', '2009Q3'], dtype='period[Q-DEC]', name='date', is_relative=False)

Relative FH ahead: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

Relative FH in-sample: [-29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0]

预测层位对比。作者图片

现在让我们深入了解一下 sktime 提供的一些常见接口功能。首先,指定和训练模型的过程被拆分为单独的步骤。在拟合模型之前,我们指定预测者的参数。在单变量时间序列的情况下, fit() 方法接受训练序列。对于一些预测者,例如directtabularregressionpredictordirecttimeseriesregressionpredictor,它还包括预测范围。对于其他人,预测范围可以在 predict() 方法中互换。下面是一个使用 AutoARIMA 预测单变量时间序列的示例。

用单变量序列进行预测。作者图片

Sktime 还允许使用外生变量进行预测。有了多元外生时间序列,拟合参数范围更广。它包括一个训练序列和一个带有外生变量的数据帧。与单变量时间序列一样,一些预测者需要参数中的预测范围。在下面的代码中,我们使用外生变量 realinv 的滞后值来预测 realgdp 的值。

用外生变量进行预测。图片作者。

除了拟合,sktime 还使能够用新数据更新预测者。这允许我们自动更新预测的截止时间,因此我们不需要在每次添加新数据时自己改变范围。截止值设置为新训练系列中的最后一个数据点。这种方法允许我们更新预测器的拟合参数。

通用接口适用于所有型号系列。Sktime 包括一系列易于使用、集成良好的预测工具。以下是目前在 sktime 中实现的预测器列表:

  • Holt-Winter 的指数平滑,Theta 预测器,和 ETS(来自 statsmodels),
  • ARIMA 和 AutoARIMA(来自 pmdarima),
  • 蝙蝠和 tbats(来自 TBATS),
  • 先知预报员(来自 fbprophet),
  • 多项式趋势预测器,
  • 克罗斯顿的方法。

Sktime 还允许使用 scikit-learn 的机器学习模型来建模时间序列。这就引出了 sktime 的下一大优势。

2)它提供了针对时间序列问题调整的机器学习模型

我前面提到过,sktime 的 API 兼容 scikit-learn。这意味着有可能采用许多 scikit-learn 的功能。Sktime 允许我们使用 scikit-learn 的机器学习模型来解决预测问题。

但是为什么我们不能使用 scikit-learn 中可用的标准回归模型呢?事实上,我们可以,但是这个过程需要大量的手写代码,并且容易出错。主要原因是这两种学习任务之间的概念差异。

表格 回归中,我们有两种类型的变量——目标和特征变量。我们基于特征变量预测目标变量。换句话说,模型从一组列中学习,以预测不同列的值。这些行是可以互换的,因为它们是相互独立的。

预测中,我们只需要有一个单变量。我们根据它的过去值来预测它的未来值。也就是说,模型预测同一列的新行。这些行不可互换,因为未来值取决于过去值。因此,即使我们用一个外生变量进行预测,这仍然不是一个回归问题。

表格回归与预测。作者图片

这两个问题之间的区别非常明显。但是在预测问题时使用回归模型有什么风险呢?以下是一些原因:

  • 它产生了评估预测模型的问题。使用 scikit-learn 的训练测试分割会导致数据泄漏。在预测问题中,行是相互依赖的,所以我们不能随意打乱它们。
  • 转换数据进行预测的过程容易出错。在预测任务中,我们经常从多个数据点汇总数据或创建滞后变量。这种转换需要大量的手写代码。
  • 时序参数难以调整。像滞后大小或窗口长度这样的值不作为 scikit-learn 估计器的参数公开。这意味着我们需要编写额外的代码来调整它们以适应我们的问题。
  • 生成多步预测很棘手。让我们考虑生成未来 14 天的预测。scikit-learn 的回归变量根据最后一次观察值进行 14 次预测。这不是我们想要做的。我们希望我们的预测者在每次生成预测时更新最近的已知值。也就是说,每个预测应该基于不同的数据点。

Sktime 允许使用回归模型作为预测器的组成部分。由于 T21 的缩减,这是可能的。

归约是用一个算法来解决一个学习任务的概念,这个学习任务不是为它设计的。它是从复杂的学习任务到简单的学习任务的过程。

我们可以使用归约将预测任务转化为表格回归问题。这意味着我们可以使用 scikit-learn 的估计器来解决预测任务,例如随机森林。

还原过程中的关键步骤是:

  • 使用滑动窗口方法将训练集分成固定长度的窗口。

举个例子,如果窗口长度等于 11,则过程如下:第一个窗口包含第 0-10 天的数据(其中第 0-9 天成为特征变量,第 10 天成为目标变量)。第二个窗口包含第 1-11 天的数据(其中第 1-10 天成为特征变量,第 11 天成为目标变量),等等。

  • 把那些窗户一个接一个的排列起来。这为我们提供了表格形式的数据,特征变量和目标变量之间有明显的区别。
  • 使用以下策略之一-递归、直接或多输出,来生成预测。

使用回归模型进行预测。图片来自 sktime 的文档

现在让我们看一些代码,用回归器组件执行预测。

在我们的例子中,sktime 的方法 make_reduction() 使用 scikit-learn 的模型创建了一个基于 reduction 的预测器。它接受一个回归变量,预测策略的名称和窗口长度。它输出一个可以像任何其他预测器一样拟合的预测器。您也可以使用directtabularregressionpredictor对象将预测问题简化为表格回归任务。然而,这位预测者使用直接策略进行缩减。

值得一提的是,缩减的参数可以像任何其他超参数一样进行调整。这就把我们带到了 sktime 的下一个优势,就是评估模型。

3)它能够快速、无痛苦地评估预测模型

评估预测模型不是一项简单的任务。它需要跟踪与标准回归问题不同的指标。它们并不总是容易实现,例如平均绝对标度误差(MASE)。这些模型的验证也很棘手,因为我们无法将数据分成随机的子集。最后,调整预测器的参数,例如窗口长度,需要大量的手写代码,并且容易出错。Sktime 解决了与评估预测模型相关的三个主要问题。

Sktime 允许通过 回测对预测者进行评估。这个过程包括将我们的数据分成时间训练集和测试集。重要的是,测试集包含训练集之前的数据点。剩下的过程就是我们从 scikit-learn 了解到的。我们在测试集上生成预测,并计算度量。然后我们将预测值与实际值进行比较。

Sktime 提供了几个特定于预测模型的性能指标。例如,它们包括平均绝对标度误差(MASE)或平均绝对百分比误差(MAPE)。您可以通过两种方式调用这些指标——或者通过调用一个函数,或者调用一个类。使用类接口提供了更多的灵活性。例如,它允许您更改指标的参数。更棒的是, sktime 还提供了使用make _ forecasting _ scorer()函数轻松实现自定义计分器。定义自定义指标和评估模型的示例如下所示。

**Output:**
custom MAPE: 0.05751249071487726
custom MAPE per row:
date
2002Q2    0.001020
2002Q3    0.003918
2002Q4    0.002054
2003Q1    0.004020
2003Q2    0.009772
Freq: Q-DEC, dtype: float64

在测试集上评估我们的模型并不总是最优的解决方案。有没有办法让交叉验证适应预测问题?答案是肯定的,而且 sktime 做得相当不错。提供基于时间的交叉验证

它支持使用两种方法分割数据进行交叉验证。它们包括扩展窗口和滑动窗口。在扩展窗口中,我们在每次运行中将训练集扩展固定数量的数据点。这样,我们就创建了多个训练测试子集。这个过程一直进行到训练集达到指定的最大大小。在滑动窗口中,我们保持训练集的固定大小,并在数据中移动它。

我们可以在 evaluate() 方法中指定时态交叉验证拆分器。除了选择窗口类型,我们还可以指定添加新数据的策略。我们可以通过改装或更新我们的模型来做到这一点。下面是一个使用扩展窗口执行交叉验证的示例。

扩展窗口交叉验证。作者图片

最后,sktime 提供了几种调优模型超参数的方法。它还支持调整特定于时间序列的参数。目前,sktime 提供了两个调优元预测器: ForecastingGridSearchForecastingRandomizedSearch。像在 scikit-learn 中一样,它们通过用一组不同的参数训练和评估指定的模型来工作。ForecastingGridSearch 评估超参数的所有组合。预测随机搜索只测试其中固定大小的随机子样本。Sktime 为各类预报员提供参数调谐。这也包括带有回归成分的预测。

什么是伟大的,我们还可以 调整嵌套组件的参数。它的工作方式与 scikit-learn 的管道完全一样。我们通过访问由 get_params() 方法生成的字典中的键来做到这一点。它包含与预测者的超参数相关的特定键值对。键名由两个元素组成,由双下划线连接,例如*estimator__max_depth*。第一部分是组件的名称。第二部分是参数的名称。

在下面的示例中,我们使用 ForecastingRandomizedSearchCV 调整随机森林回归器的参数。

**Output:**
{'window_length': 2, 'estimator__max_depth': 14}
0.014131551041160335

优化嵌套参数是 sktime 提供的复杂用例之一。现在让我们深入到 sktime 解决的其他复杂问题。

4)它为复杂的预测问题提供了新的功能

复杂的预测问题也有 sktime 支持。它提供了各种各样的转换器,可以在拟合模型之前改变我们的时间序列。它还允许我们建立管道,连接变压器和预报员。此外,它还提供了自动化的模型选择。它比较了整个模型族和转换类型。最后,它使集合预报成为可能。

我们现在将分别关注每个功能。先说变形金刚。为什么我们甚至需要预测中的转换?首先,主要目标是去除过去时间序列中观察到的复杂性。此外,一些预测器,尤其是统计模型,在拟合之前需要特定的转换。一个例子是 ARIMA 模型,它要求时间序列是平稳的。 Sktime 提供种类繁多的变形金刚。其中一些是:

  • Detrender —从时间序列中去除趋势,
  • 去季节化器 —从时间序列中去除季节模式,
  • BoxCoxTransformer —将时间序列转换为类似正态分布,
  • HampelFilter —检测时间序列中的异常值,
  • tabulartoseriesadapter—将表格转换适配到序列(例如,适配 scikit-learn 的预处理功能)。

请务必检查所有这些,因为可用的变压器列表仍在增长。Sktime 提供了与 scikit-learn 中类似的方法。它们包括 fit()、transform()fit_transform() 。一些转换器也共享 inverse_transform() 方法。它能够访问与初始时间序列相同规模的预测。

下面的代码显示了一个转换时间序列和反转操作的示例。

反向转换后的预测。图片作者。

Sktime 允许将变压器与预测器链接起来,以获得单个预测器对象。这可以使用管道来完成。Sktime 提供了一个转型的 TargetForecaster 类。它是一个管道对象,旨在结合任意数量的转换器和预测器。它可以将多步操作减少到一步。您可以在管道中使用任何类型的预测器。

Sktime 还允许为带有外生变量的时间序列构建管道。它提供了另一个管道对象,预测管道。这种管道能够实现外生变量和目标时间序列的转换。

下面你可以找到一个用外源数据构建管道的例子。

既然您有几个要测试的转换和预测器,您可能想知道它们中的哪一个最适合您的问题。Sktime 提供了一个简单的方法来回答这个问题。启用 autoML ,即自动选择型号。这可以通过使用多重预测器类来完成。这个类的对象接受一个预测列表作为参数。你可以用它来找到一个表现最好的预测者。它可以与 ForecastingGridSearch 和 ForecastingRandomizedSearch 一起使用。你可以在下面找到一个例子。

**Output:**
{'selected_forecaster': 'ets'}

Sktime 还支持自动选择管道中使用的转换。它提供了一个可选直通变压器。它接受另一个 transformer 对象作为参数。这使我们能够验证所选择的转换是否提高了模型的性能。然后,OptionalPassthrough 对象作为管道中的一个步骤进行传递。我们现在可以将这些传递超参数添加到网格中,并应用交叉验证技术。我们还可以评估变压器的参数。

最后, sktime 支持 集合预报。您可以将一个预测者列表传递给ensemble predictor,然后使用它们来生成预测。如果您选择不同系列的型号,此功能尤其有用。预测者是平行的。他们每个人都有自己的预测。之后,默认情况下对它们进行平均。您可以通过指定 aggfunc 参数来更改聚合技术。

下面你可以找到一个集合预报的例子。

**Output:**
[TBATS(), AutoARIMA()]

复杂功能的列表仍在增长。这就引出了我想提到的最后一个优势。

5)它是由一个活跃的社区开发的

对于成熟的图书馆来说重要的是,一个多元化的社区已经积极地致力于这个项目。最新版本(v. 0.7.0)于 2021 年 7 月发布。它引入了一些特性,如带有外生变量的管道或克罗斯顿方法。预测目前被标记为一个稳定的功能。但是仍然有一个未来步骤的列表。它们包括预测区间和概率预测。此外,未来还将增加多变量预测。也有计划包括测试模型性能之间的显著差异。

Sktime 很容易扩展。它提供扩展模板来简化添加新功能的过程。还有一个预测者的扩展模板。它使得本地实施新的预测和对 sktime 的贡献变得容易。如果你有兴趣参加这个项目,我们非常欢迎你参加。你可以在这里找到关于贡献的所有信息。

奥利弗·帕斯克在 Unsplash 上拍摄的照片

最终注释

在我看来, sktime 是一个全面的工具包,在很大程度上改善了 Python 中的预测体验。它简化了训练模型、生成预测和评估预测者的过程。它还能够解决复杂的预测问题。此外,它采用 scikit-learn 接口模式来预测问题。该软件包仍在开发中,但即使是现在,它也是一个很好的预测选择。

资源

感谢您的阅读!我非常感谢你对这篇文章的反馈——你可以通过 Linkedin 联系我。此外,请使用参考资料中链接的我的示例笔记本随意体验一下 sktime 的特性。

为什么故事点对于软件工程师来说是一个可怕的度量

原文:https://towardsdatascience.com/why-story-points-are-a-horrible-metric-for-software-engineers-421bc8971f11?source=collection_archive---------29-----------------------

以及用什么来衡量绩效

照片由 Cookie 在 Unsplash 上的 Pom 拍摄

让我们面对现实吧,我们的行业痴迷于“越多越好”的理念——一心多用,长时间工作,忙碌,完成很多事情。

然而,随着我们拥抱一种新的工作方式,远程工作,分布式环境,我们,工程经理,需要放下过去不再有用的东西。这包括使用虚荣指标和老式的方法来衡量生产率。

因为越多并不总是越好,尤其是在衡量一个软件工程师的表现时。

不要:用完成的故事点来衡量软件工程师的表现

Josh Appel 在 Unsplash 上拍摄的照片

故事点的使用一直是一个巨大的争论话题。有人说它对敏捷软件开发团队有用,也有人说它对商业毫无用处。他们两个都是正确的。但是在我职业生涯的最后二十年里,作为一名软件开发人员和工程经理,我在许多软件开发团队中工作过,所以我有一个强烈的观点。故事点对于软件开发者的表现来说是一个糟糕的衡量标准。

为什么故事点不是一个好的绩效指标?

并非所有的故事点都是相同的

故事点是相对于给出评估的人或团队的知识的复杂性的度量。因此,一个团队的故事点 3 可能不等于另一个团队的故事点 3。因此,当你比较来自不同团队的多名工程师的交付时,故事点不是正确的衡量标准。

更大的故事点并不意味着更大的影响

在软件开发中,简单就是美。通常,大故事点是复杂代码路径的结果,奖励大故事点间接鼓励软件开发人员考虑复杂和过度设计他们的解决方案。对于一个工程师来说,了解他们工作效率的最好方法是看他们交付了什么样的成果,以及他们对客户产生了什么样的影响。而不是他们写了多少代码或者他们的代码有多复杂。

故事点给出了太多的灵活性,并鼓励更少的责任

故事点并没有告诉我们一个软件工程师有多负责和可靠。当然,他们可能从事最复杂(相对)的故事,但这并不意味着他们尽了最大努力,按时交付,并体现了正确的行为。关于故事点最糟糕的事情是,它使软件工程师避免承诺任何日期。我知道许多软件工程师通常不希望承诺一个截止日期,以防他们发现任何未知,但是不对什么时候完成某件事情设定预期,或者没有任何里程碑是完全不负责任的。

高级工程师可能编码时间更少

随着工程师职业生涯的进展,他们可能会发现实际的编码/开发工作越来越少,因为他们将做其他需要更多资历的事情,如计划、故事分解、指导、入职、代码审查等。如果他们为大型科技公司工作,这一点尤其正确,因为需要更多的协调和知识共享。从百分比来说,会接近或者超过 50%,这取决于公司的规模,项目的复杂程度,以及资历。

Do:根据他们所在级别的预期能力来衡量绩效

杰斯·贝利Unsplash 上拍摄

首先,让我澄清一下:一个工程师的表现永远不应该用工作的小时数或编写的代码行数来衡量。应该用产生的结果来衡量它们。

然而,这听起来有点抽象,所以让我进一步解释。

科技公司倾向于根据对工程师和软件开发人员的级别和角色的预期能力来衡量他们的表现。像 FAANG(脸书、亚马逊、苹果、网飞和谷歌)这样的大型科技公司已经记录了关于这种预期的信息,所以在某种程度上,这是非常客观的。

常见的能力(按初级->高级的期望顺序排列)有:

  • 专门技能
  • 规划工作技能(将一个大问题分解成可管理的任务)
  • 评估技能
  • 沟通技巧
  • 利益相关者管理技能
  • 影响技能
  • 指导技能

初级开发人员不一定需要具备利益相关者管理技能和影响力技能,但随着他们在职业阶梯上的攀升,他们将需要展示更多来自底层的技能。

Do:获得软件工程师的定性反馈,例如:360 度反馈

Raymond T.Unsplash 上的照片

作为一名软件工程师,在当今这个软件开发日益复杂的时代,仅仅埋头编码是不够的。能够与他人合作交付成果是软件开发人员角色的重要组成部分。因此,从与他们合作的人那里获得对软件工程师的 360 度反馈是很重要的,以了解他们作为团队的一部分在交付成果方面有多有效。在今天的工作环境中,聪明的混蛋没有立足之地。

衡量什么是重要的

查尔斯·德鲁维奥在 Unsplash 上拍摄的照片

简而言之,在考虑软件开发人员的表现时,有定性和定量的衡量标准。像 360 度反馈这样的定性指标和像发布功能的影响这样的定量指标经常被关注,但是看看其他虚荣的指标,比如代码行,完成的故事点应该被避开。

  • 不要:用完成的故事点来衡量软件工程师的表现
  • Do:根据他们所在级别的预期能力来衡量绩效
  • Do:获得软件工程师的定性反馈,例如:360 度反馈

📩注册订阅作者的时事通讯,定期获得关于你科技职业的建议和资源。您还将立即收到一个链接和密码,为您的职业发展下载免费赠品。

首席技术官工具包——面向技术领导者的工具和资源

为什么记录你的成就会有助于你的职业生涯

原文:https://towardsdatascience.com/why-taking-notes-on-your-accomplishments-can-help-your-career-770cfda070b1?source=collection_archive---------27-----------------------

你应该问自己的 5 个问题

照片来自马克-奥利维尔·乔多因Unsplash

如果说 2020 没有教会我什么,那就是它教会了我什么时候该后退一步,反思我职业生涯中发生的事情。今年年初,我打开了 OneNote,记录了每个项目、重大决策和结果。当我是这个项目的首席数据科学家和开发人员时,我尤其会这样做。这个笔记本让我每个月都有针对性的反思会议,以更好地了解我自己和我的位置。我也可以把这些笔记带到与我的经理的一对一谈话中,更好地讨论我的成就。在这些反思过程中,我问了自己几个问题。当你回顾自己的成就时,以下是我最想问的五个问题:

1.你喜欢什么?

2.你学到了什么?

3.还有什么比这更好的呢?

4.我收到了什么反馈?

5.你的成长机会是什么?

你喜欢什么?

当我记笔记并反思我所做的工作时,我喜欢问自己:我最喜欢那份工作的什么?我发现这是一个很有帮助的问题,因为它让我更深入地了解了我的工作中我喜欢做什么,不喜欢做什么。利用这些信息,我可以和我的老板讨论如何着手更符合我职业目标的项目。

当我开始我现在的职位时,我不确定我会在哪里结束,但我知道我喜欢在数据科学领域工作并与其他人合作。当我开始记录我的工作并反思我所做的项目时,那些与老板的对话帮助我塑造了现在的角色。我向我的老板表示,我喜欢在领导岗位上工作,并且有兴趣在这个领域承担更多的工作。强调这一点,我能够在加入几个月后进入团队领导的角色。

随着我在这个职位上的继续,我继续讨论什么进展顺利,什么不顺利,以及我的兴趣所在,他可以帮助指导我的职业生涯朝着正确的方向发展。

你学到了什么?

当我在看一个我已经完成的大项目时,我想记下我从这次经历中学到的东西。无论多小,突出工作中的任何收获都是必不可少的。由于数据科学还包含许多软技能,我经常发现自己在与同事的交流中记录了改进或了解了业务的一个新方面。即使这项成就现在对你来说可能看起来微不足道,你也会有一份详尽的清单用于你的年度回顾。

我领导的第一批大项目中,有一个项目让我与我的团队,一个国际团队,以及我们雇佣的承包商互动。该项目的最初目标是领导承包商开展工作,并在需要时提供帮助。不幸的是,直到为期两个月的项目工作的最后一周,他们才得以进入我们的工作区。当我评估情况时,我从这个项目中学到了一些有价值的经验。我学会了如何:

  • 制定一个计划,当事情出错时能够重新评估和计划,
  • 根据每个部分的能力将工作分配给不同的团队,
  • 开发 CI/CD 管道,利用计算集群在 3 小时内运行大量工作负载,
  • 以及如何确保在项目结束时达到重要的里程碑。

这个项目并不完美,如果我们早点让承包商进入,结果可能会更好。我从那项工作中学到的经验帮助我理解了如何成为一名更好的团队领导,以及如何与不同的个人合作来实现共同的目标。

无论规模有多大或有多小,总有一些教训可以从你的项目中吸取。记下这些教训供以后参考。即使是不按计划进行的项目也能教会你很多东西。需要克服最大挑战的项目是那些会让你在如何处理这种情况上与众不同的项目。这些课程将有助于你解释你作为一名数据科学家、开发人员和领导者的成长。

还有什么比这更好的呢?

现在,我已经检查了所学到的经验教训,这是一个很好的时间来看看什么可以做得更好。认识到你哪里犯了错误或表现不好,可以告诉你以后需要改进的地方。在我与任何人交谈之前,我首先反思我自己的工作。

回想一下我之前解释的那个项目,第一件可以做得更好的事情是确保我们可以快速进入承包商的工作区。由于这个问题,其他人需要离开他们的工作,项目被推迟,以重新安排本应由承包商完成的工作的优先级。然而不幸的是,我们环境的访问问题不是我能控制的。

我能控制的一件事是他们如何实施工作。承包商写了很大一部分工作是用纯 SQL 写的,但是团队主要使用 Python。这个设计决策是基于这样一个事实,即承包商主要使用 SQL。还有什么比这更好的呢?我本可以向承包商表达这一事实,并要求将代码翻译成 Python,但当时,我没有想到这一点。

记下这些情况可以让你重新评估你是如何处理问题的,以及你可以在哪里改变你的方法。

我收到了什么反馈?

另一种确定需要改进的地方的方法是提问。我经常向我的亲密同事、老板或曾协助过某个项目的导师询问他们对工作具体方面的反馈。我这样做是因为他们可能看到了不同的事情,我认为没问题,但从他们的角度来看,他们可以做得不同。

另一个要求反馈的好理由是了解更多。通常,我收到的反馈不是关于我的领导决策,而是基于我的准则。这个反馈让我思考我的设计决策,了解哪些方面可以改进,并了解用于获得相同结果的不同技术。

获得反馈是一次很好的学习经历,尤其是在数据科学领域。讨论你的同事的技术并获得他们的意见可以给你新的想法来继续你的分析或调整它。但请记住,反馈不需要被视为 100%的事实。有时反馈是建设性的和有用的。其他时候,反馈只是一个建议。理解必须实施的反馈和属于建议类别的反馈之间的区别。你收到的反馈越多,就越容易看出区别。

例如,当我的团队进行代码审查时,我们在拉请求中留下注释。注释说明了要批准拉取请求需要进行哪些更改。如果评论是一个不需要执行的建议,但是你可能想要考虑它,我们声明。

“这是一个建议…”

“你可以考虑……”

“只是一个想法,但是,你试过…?”

你的成长机会在哪里?

现在我反思了我的工作,我知道:

  • 我喜欢的,
  • 我学到的是,
  • 还有什么比这更好的,
  • 还有,我收到了什么反馈。

考虑到所有这些信息,最后一步是了解我的成长领域。正如我前面提到的,记录你的成就可以帮助你的职业生涯。现在你对下一步有了一个好的起点。从这份详尽的笔记列表中,你可以确定是否有一系列你想提高的技能,提高这些技能的最佳方法,以及如何利用这些技能前进。

继续之前的同一个项目例子,我记下了我想要提高的有价值的领导技能。通过这项工作,我意识到了与不同团队有效合作的重要性。这些技能在那个项目中发挥了很好的作用,我看到了它们如何应用到更广泛的团队中。

我们有一个数据工程团队,我们知道这个团队,但当时并没有与之密切互动。每当我们遇到数据问题时,我们要么制定一个变通办法,要么在有人通过小道消息得知后等待解决方案的出现。相反,我们需要团队之间强有力的合作来有效地解决我们的数据质量问题。

我没有忽视这个问题,而是将我在那个项目中开始学习的技能应用到了实践中。到年底,我已经让两个团队紧密合作,一起解决问题。如果我没有评估我以前的项目并继续提高我在这方面的技能,这是一个重要的增长领域,我可能会错过。

最后的想法

无论项目是大是小,从你所做的工作中总有东西可以学习。利用这些项目来反思你所做的事情,确定你可以改进的地方,并推动自己成长。与你的经理、导师和同事一起工作,你可以进一步了解如何在不同的情况下运用你的技能。记住,你的技能不仅仅是技术,还有软技能!

同样,在评估我的工作时,我的五个问题是:

  1. 你喜欢什么?
  2. 你学到了什么?
  3. 还有什么比这更好的呢?
  4. 我收到了什么反馈?
  5. 你的成长机会是什么?

在评估自己的工作时,你通常会问自己什么问题?

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

为什么数据测试不能防止数据管道损坏

原文:https://towardsdatascience.com/why-testing-your-data-is-insufficient-6914275a9762?source=collection_archive---------35-----------------------

数据是一个动态的、通常是非结构化的实体,当涉及到确保数据质量时,仅仅测试并不能拯救您的管道。

图片由 Unsplash 上的迈克尔·谢弗提供。

2021 年,仅靠数据测试不足以确保数据准确可靠。正如软件工程团队利用 New Relic、DataDog 和 AppDynamics 等解决方案来监控其应用程序的健康状况一样,现代数据团队也需要类似的监控和可观察性方法。以下是如何利用测试和监控来 防止数据管道 损坏,并实现高数据可靠性。

对大多数公司来说,数据是新的软件。

像软件一样,数据是企业成功的基础。它需要“永不停机”,数据停机时间https://www.montecarlodata.com/the-rise-of-data-downtime/要像应用程序停机时间五个九一样认真对待,有人吗?).就像您的软件一样,遵守您团队的数据 SLA 对于保持您公司的竞争优势至关重要。

虽然许多团队会使用他们应用于测试软件的准确性和可靠性的相同的可靠方法来测试他们的数据是有道理的,但是我们的行业正处于一个转折点:仅仅进行数据测试是不够的。****

在运行分析之前,依靠数据测试来发现数据管道中的问题,相当于在部署新软件之前,相信单元和集成测试能够识别有问题的代码,但这在现代数据环境中是不够的。同样,如果没有跨整个代码库的应用程序监控和可观察性,就不可能有真正可靠的软件,如果没有跨整个数据基础设施的数据监控和可观察性,就不可能实现完全的数据可靠性。

最好的数据团队不是完全依赖测试,而是利用双重方法,将数据测试与整个管道的持续 监控和可观察性 相结合。

让我们仔细看看这意味着什么,以及如何开始对您自己的堆栈应用数据监控。

什么是数据测试?

图片由西格蒙德Unsplash 上提供。

数据测试是在管道的不同阶段验证您对数据的假设的过程。基本的数据测试方法包括使用固定数据的模式测试或定制数据测试,这有助于确保 ETL 顺利运行,确认您的代码在一小组众所周知的场景中正常工作,并防止代码更改时出现倒退。

数据测试通过对空值、唯一性、引用完整性和其他常见的数据问题指示器进行静态测试来提供帮助。这些工具允许您设置手动阈值,并对您关于数据的基本假设的知识进行编码,这些知识应该在管道的每次运行中保持不变。

事实上,数据测试对于特定的、众所周知的问题是一个很好的解决方案,当新数据或新代码打破了您最初的假设时,它会向您发出警告。您甚至可以使用测试来确定您的数据是否满足有效性标准,例如保持在预期范围内或具有唯一值。这在精神上非常类似于软件工程师使用测试来警告他们预期可能发生的众所周知的问题的方式。

但是,就像单元测试本身不足以保证软件的可靠性一样,数据测试本身也不能防止数据管道的损坏。

以下是 3 个理由为什么需要结合测试和监控的混合方法来为现代数据堆栈铺平道路。

数据变化很大

在软件工程中,我们大量使用测试来发现代码中的预期问题。然而,每个软件工程师都知道,如果她希望交付一个高度可靠的应用程序,这是不够的。生产环境的可变性比任何工程师在开发过程中预期的都要多。

无论是业务逻辑中的边缘情况,软件组件之间难以预测的交互,还是系统的意外输入,软件问题都不可避免地会发生。因此,一个稳健的可靠性策略将把测试作为健全性检查与监控和可观察性结合起来,以验证实际生产环境中的正确性和性能。

数据也不例外。虽然测试可以检测和预防许多问题,但是数据工程师不可能预测开发过程中的所有可能性,即使她能够预测,也需要大量的时间和精力。

在某些方面,数据甚至比传统软件更难测试。即使是中等规模的数据集,其可变性和复杂性也是巨大的。让事情变得更复杂的是,数据还经常来自“外部”来源,这些来源注定会在没有通知的情况下发生变化。考虑到规模和合规性限制,一些数据团队甚至很难找到一个可以轻松用于开发和测试目的的代表性数据集。

监控和可观察性填补了这些空白,为这些不可避免的(也可能是有问题的)管道变更提供了额外的可见性。

端到端覆盖至关重要

对于许多数据团队来说,创建一个健壮的、高覆盖率的测试套件是极其费力的,并且在许多情况下可能是不可能的或者不可取的——尤其是如果已经存在几个未覆盖的管道的话。虽然数据测试可以用于较小的管道,但它不能很好地扩展到现代数据堆栈。

大多数现代数据环境都极其复杂,数据从几十个来源流入数据仓库或数据湖,然后传播到 BI/ML 供最终用户使用,或者传播到其他运营数据库以供使用。在从源到消费的过程中,数据将经历大量的转换,有时要转换数百次。

现实情况是,数据在其生命周期的任何阶段都可能中断,无论是由于源位置的更改或问题、对管道中某个步骤的调整,还是多个管道之间的复杂交互。为了保证高数据可靠性,我们必须能够端到端地了解管道中的破损情况。至少,当数据在系统中传播时,我们必须有足够的可观察性,以便能够对问题进行故障诊断和调试。

考虑到以下几个原因,数据测试变得非常有限,包括:

  • 您的管道可能会利用几个 ETL 引擎和代码框架,这使得在您的组织中保持一致的测试策略非常具有挑战性。
  • 转换和测试之间的强耦合给系统带来了不可靠性——任何对 ETL 的有意变更(或者,在某些情况下,意外的失败)都将导致测试无法运行和遗漏问题。
  • 流水线阶段的复杂性和绝对数量使得达到良好的测试覆盖率变得非常困难。

这仅仅触及了数据测试在确保完全数据可靠性方面的局限性。

数据测试债务

虽然我们都渴望有很大的测试覆盖率,但是数据团队会发现他们的部分管道没有被覆盖。对于许多数据团队来说,根本不存在覆盖率,因为在管道开发的早期,可靠性常常让位于速度。

在这一点上,回过头来为现有管道添加测试覆盖可能是一项巨大的投资。如果关于现有管道的关键知识掌握在您的数据团队中的几个精选的(通常是非常早期的)成员手中,追溯性地解决您的测试债务将会,在最好的情况下,转移资源和精力,否则这些资源和精力可能会花费在为您的团队移动针头的项目上。在最糟糕的情况下,如果你团队中的许多早期成员已经不在公司了,并且文档不是最新的,那么解决测试债务几乎是不可能的。

可靠的监控和可观察性方法可以帮助减轻数据测试债务带来的一些挑战。通过使用基于 ML 的方法,从过去的数据中学习并监控新的输入数据,团队能够在很少或没有投资和民俗知识的情况下创建对现有管道的可见性,并减少数据工程师和分析师的负担,以减轻测试债务的增加。

下一步:数据监控和可观察性

2021 年,数据工程师正处于一个关键时刻,要么跟上我们不断增长、不断发展的数据需求,要么满足于不可靠的数据。对大多数人来说,没有选择。

就像软件一样,数据需要测试和监控,以确保一致的可靠性。现代数据团队必须将数据视为一个动态的、不断变化的实体,并采用不同的方法,不仅关注严格的测试,还关注持续的 监控和可观察性

通过像对待软件可靠性一样对待数据可靠性,数据团队可以确保他们的数据在任何时候都处于健康状态,并跨越数据健康的几个关键支柱,包括卷、模式、新鲜度、沿袭和分发,以免影响您的业务。

有兴趣了解更多关于数据监控和可观察性的知识吗?伸出手去 巴尔摩西利奥加维什 ,还有 蒙特卡洛团队

本文由 Lior Gavish 合著。

为什么机器学习的未来很小

原文:https://towardsdatascience.com/why-the-big-future-of-machine-learning-is-tiny-ebf794f2d81a?source=collection_archive---------38-----------------------

IOT 机器学习

微型智能机器有很大的可能性

来自 Pexels尼克·伍德的照片

TinyML 是一项新兴的人工智能技术,前景广阔——其多功能性、成本效益和微小的外形使其成为一系列应用的令人信服的选择。

在亚洲部分地区,财产损失、农作物遭劫、伤害、死亡和报复性杀戮正在上升。

为什么?由于人类和大象之间的冲突不断升级——人象冲突(HEC)——在人口密集的地区。

据 WILDLABS 统计,仅在印度,每年就有 400 人和 100 头大象因 HEC 而丧生。

降低 HEC 的一个方法是为居住在大象栖息地附近的社区建立早期预警系统。但这并不容易——这些栖息地通常很难进入,无线连接有限,而且没有电。

然而,一种新兴的人工智能 (AI)技术正在帮助寻找解决方案——tiny ml

tinyML 是什么?

TinyML,或微型机器学习 通过将微型机器部署到需要它们的区域来工作。

TinyML 的特点是:

  • 小型且便宜的机器(微控制器)
  • 超低功耗消耗
  • 小内存容量
  • 低延迟(几乎即时)分析
  • 嵌入式机器学习算法

让我们更仔细地考虑一下。

tinyML 中使用的微型机器是微控制器——为特定任务设计的紧凑集成电路——由于嵌入式机器学习而智能工作。它们在非常低的功率下运行,提供即时结果,并且便宜。事实证明,它们在诸如 HEC 早期预警系统等一系列应用中具有不可估量的价值。

微控制器本身并不新鲜——今天估计有 2500 亿个微控制器在使用中(T1)——它们是 T2 物联网(T3)不断增长的足迹不可或缺的一部分。

但是 tinyML 中使用的微控制器非常小,有时大约为几毫米,并且消耗超低功率,大约为几毫瓦。它们的内存容量也非常小,通常不到几百千字节。

使 tinyML 微控制器“智能”的机器学习和深度学习算法通常被称为嵌入式机器学习嵌入式深度学习系统。这是因为运行算法的微控制器被认为是嵌入到它们所属的专用系统中的

由于 tinyML 系统中的大多数分析都是直接在微控制器上进行的,即现场边缘,结果是即时。这在低延迟很重要的情况下——例如在快速移动的预警系统中——以及访问云服务器的潜在延迟是个问题的情况下非常有用。

tinyML 的挑战

在一个机器学习算法变得越来越大、资源越来越密集的世界,tinyML 如何融入其中?

将事情放在背景中,考虑近年来机器学习模型呈指数增长——在截至 2020 年的三年内,从不到 1 亿百万个参数到 1750 亿个参数!

更重要的是,他们使用的能源比以往任何时候都多——根据一项估计,BERT (一种最近开发的自然语言处理模型)的单次训练的碳足迹足以在纽约和旧金山之间往返飞行。

训练和部署现代机器学习算法显然需要大量资源。因此,大多数现代机器学习算法部署在相对强大的设备上,并且通常可以访问云,在那里进行大量资源密集型计算。

但是更大并不总是更好,tinyML 在较小的一端扮演着重要的角色。

tinyML 如何工作

为了在 tinyML 强加的显著资源约束内工作,嵌入式 tinyML 算法采用以下策略:

  • 只部署了预训练模型推断(其资源密集度较低),而不是模型训练(其资源密集度较高)——注意,随着技术的发展,未来的努力将尝试将一定程度的训练整合到 tinyML 系统中
  • 通过移除一些突触(连接)和神经元(节点),tinyML 模型下的神经网络被修剪
  • 量化用于减少存储数值所需的内存,例如通过将浮点数(每个 4 字节)转换为 8 位整数(每个 1 字节)
  • 知识提炼用于帮助识别和保留模型中最重要的特征

这些策略中的一些会导致降低模型精度

例如,修剪和量化神经网络会降低网络捕获关系和推断结果的粒度。因此,在 tinyML 中,模型大小和准确性之间有一个必要的权衡,实现这些策略的方式是 tinyML 系统设计的一个重要部分。

小方法收获大收益

尽管受到限制,tinyML 仍在帮助寻找传统人工智能技术不起作用的情况下的解决方案。

例如,在前面描述的 HEC 环境中,tinyML 成本低、功耗低(单个纽扣电池可以为微控制器供电多年)且数据传输要求低,因此是理想的选择。嵌入式 ML 为每个微控制器提供足够的智能来识别现场的大象威胁,而无需频繁地向云服务器传输数据来做出决策。这相当于节省了大量电能,并大大降低了对带宽和连接性的依赖。

更一般地说,tinyML 的关键特性——低成本、延迟、功耗和数据传输要求——扩展到各种用例,在这些用例中,考虑到现实世界的实际限制,这些特性非常重要。

tinyML 的应用

让我们看看 tinyML 发挥巨大作用的其他几个例子:

1.工业预测维护

现代工业系统需要持续监控,但在许多情况下,这对于传统系统来说并不容易。

例如,考虑位于远处的风力涡轮机。这些很难访问,并且连接性有限。

TinyML 可以通过部署具有低带宽和连接需求的智能微控制器来提供帮助。这正是澳大利亚一家名为 Ping 的初创公司在其风力涡轮机监控服务中引入的内容。

Ping 的 tinyML 微控制器(物联网框架的一部分)使用嵌入式算法持续自主地监控涡轮机性能。只有在必要时,才会访问云以获取汇总数据。

这提高了 Ping 在潜在问题变得严重之前提醒涡轮机操作员的能力。

2.农业

在非洲,木薯是每年数亿人的重要食物来源。然而,它不断受到各种疾病的侵袭。

为了帮助解决这一问题,宾夕法尼亚州立大学运营的开源项目 PlantVillage 开发了一款名为 Nuru 的人工智能驱动应用,可以在没有互联网接入的手机上工作——这是偏远非洲农民的一个重要考虑因素。

Nuru 应用程序通过分析田间的感官数据,成功减轻了对卡萨瓦作物的威胁。

作为 Nuru 开发的下一步,PlantVillage 计划更广泛地使用 tinyML,在远程农场部署微控制器传感器,以提供更好的跟踪数据进行分析。

TinyML 还在农产品的生产链中找到了新的用途,比如咖啡豆。例如,两家挪威公司 RoestSoundsensing 开发了一种在咖啡豆烘焙过程中自动识别“第一裂纹” 的方法。

识别第一个裂纹是至关重要的——在第一个裂纹出现后的烘烤时间对加工过的咖啡豆的质量和味道有很大的影响。这些公司在他们的咖啡豆烘焙机中加入了一个 tinyML 驱动的微控制器来完成这项工作,这提高了咖啡烘焙过程的效率、准确性和可扩展性。

3.卫生保健

开源硬件合作组织 Hackaday 一直在利用其太阳能驱蚊系统对抗蚊子传播的疾病,如疟疾、登革热和寨卡病毒。

该系统的工作原理是搅动水箱和沼泽中的死水,剥夺蚊子幼虫生长的机会(幼虫需要死水才能存活)。

使用小型机器人平台搅动水,这些平台仅在必要时运行(节能),使用雨水和声学传感数据分析。使用低功耗和低带宽协议发送汇总统计数据和警报(警告蚊子大量繁殖事件)。

4.保护

除了前面描述的 HEC 示例之外,tinyML 在保护工作中的一些其他应用包括:

  • 加泰罗尼亚理工大学的研究人员一直在使用 tinyML 来帮助减少印度西里古里-贾拉拉巴德铁路线上与大象的致命碰撞。在过去的 10 年里,已经发生了 200 多起这样的碰撞。研究人员设计了一个太阳能声学和热传感器系统,带有嵌入式机器学习,作为早期预警系统。
  • TinyML 正被用于西雅图和温哥华附近的水域,以帮助减少繁忙航道上的鲸鱼袭击风险。嵌入机器学习的传感器阵列执行连续实时监控,并在鲸鱼靠近时向船只发出警告。

tinyML 的未来是光明的

TinyML 为已经建立的边缘计算(现场计算)和物联网系统带来了增强的功能。

重要的是,它以低成本、低延迟、低功耗和最低连接要求的方式实现了这一点——这使得 tinyML 系统易于在各种应用中部署。

这就是为什么有些人将 tinyML 的扩展称为走向“无处不在的边缘计算”的一步。

因此,当传统的机器学习继续向更复杂和资源密集型系统发展时,tinyML 将满足光谱另一端更小的日益增长的需求。

随着物联网的不断发展,微控制器设备的数量已经达到数千亿,tinyML 将扮演一个重要的角色。

这就是为什么哈佛副教授 Vijay Janapa Reddi,tinyML 的领先研究员和实践者,将机器学习的未来描述为“微小而明亮”

Reddi 相信 tinyML 将在未来的几年里深入到日常生活中,因此,对于任何想了解它并参与其中的人来说,这是一个真正的机会。

同样热心的还有皮特·沃登,谷歌研究工程师和 TensorFlow Lite 的技术负责人,tensor flow Lite 是一个实现 tinyML 模型的软件框架。

Warden 认为 tinyML 将在未来影响几乎每个行业,零售、医疗保健、农业、健身和制造业等等。

概括起来

  • TinyML 是机器学习的一个新兴领域,其特点是 成本、延迟、功率、内存和连接要求,并且正在为一系列应用增加价值
  • 鉴于其资源限制和现场部署,tinyML 系统通常用于预训练机器学习模型的推理
  • 机器学习算法被嵌入到 tinyML 系统中,它们通过常规算法的修剪、量化和知识提炼来适应资源约束
  • TinyML 的应用范围从工业预测性维护、农业、医疗保健和保护到未来更多潜在的应用
  • tinyML 的未来似乎光明,tinyML 系统的多功能性成本效益表明机器学习的最大足迹可能是在未来几年通过 tiny ml

原载:https://highdemandskills.com/blog/

https://highdemandskills.com/blog/

为什么 CLI 对数据科学家至关重要

原文:https://towardsdatascience.com/why-the-cli-is-essential-for-data-scientists-cd7016f86d49?source=collection_archive---------21-----------------------

创建更高效的机器学习工作流的 CLI 示例和使用案例

图片来自 Unsplash

当我第一次学习数据科学时,我并没有特别强调理解诸如 Unix/Linux 和 Bash 之类的术语。对于一个没有计算机科学背景的人来说,这似乎很陌生,很难理解,但我很快意识到命令行界面(CLI) 在管理您的数据科学工作负载中是多么重要。要成为一名强大的数据科学家/MLE 或仅仅使用一般的软件,您需要能够在您的机器上轻松地导航和使用 CLI。除了舒适的 Jupyter 笔记本设置之外,数据科学中还有很多使用 CLI 的用例。例如,当运行计算机视觉工作负载时,人们经常使用名为 argparse 的 Python CLI 接口库向 ML 脚本传递参数。如果您正在迁移到 AWS、Azure 或其他 ML 云提供商,则需要 CLI 来适当地供应和移动您的资源。甚至在我们熟悉的 Jupyter 笔记本的数据科学狩猎场中,也有可能编写包含 Bash 脚本的单元格,我们将深入研究这些脚本。在这篇文章中,我将从整体上介绍如何开始使用 CLI、Bash 的常见用例/技巧以及数据科学和编程。

注意:我用的是 Mac,所以我所有的命令都是基于 Unix/Linux 的,对于 Windows 机器上的命令,我还附上了一些额外的资源,你可以跟着看。

目录

  1. 基本 Bash 命令
  2. 编写您的第一个 Bash 脚本
  3. Jupyter 笔记本中的 Shell 脚本
  4. Argparse
  5. 结论

1.基本 Bash 命令

在我们开始创建实际的 Bash/shell 脚本之前,我们将介绍一些日常使用的更基本的命令。

印刷工作目录

你几乎要把你的机器当成一个目的地。CLI 是您导航目的地的地图,您向它发出命令/指示,告诉它您想去哪里。 pwd 命令 有助于告诉您当前在地图上的位置,或者您是否想知道您在机器中的位置。

作者截图

如你所见,我们得到了当前的位置。

创建目录

作为一名开发人员,文件夹和目录这个词在你的字典中应该是同义词。设置项目时,您可能需要创建各种目录来管理数据或将文件移动到适当的位置。要通过 CLI 创建目录,我们使用 mkdir 命令

创建名为 MediumExample 的目录

执行这个命令后,我现在可以在桌面上看到一个目录。

作者截图

光盘(更改目录)

现在您已经创建了一个目录,您可能希望在该目录中工作,以便能够完成项目所需的工作。要更改目录,我们使用 cd 命令 ,它现在会将你的机器指向你想要的目录。

作者截图

如您所知,我现在位于我们创建的 MediumExample 目录中。

触控

现在假设我们在我们的工作目录中,我们想要创建一个 python 文件,我们可以开始工作了。 触摸命令 允许我们创建所需类型的新文件。如果我们运行 touch test.py ,那么我们会在我们的目录中看到一个 python 文件。

作者截图

ls(列表文件)

如果我们想要一个我们正在处理的所有文件或目录的列表,使用 ls 命令 可以让你看到目录的内容。如果我们在我们创建的目录中运行 ls,我们将看到我们刚刚创建的 python 文件。

作者截图

这些只是帮助您开始使用 CLI 的一些基本命令。如需更多导航 CLI 的基本命令,请点击此链接

2.编写您的第一个 Bash 脚本

既然我们已经介绍了一些基本的 shell 命令,那么通常可以将其中的几个命令结合在一起,在 CLI 中编排更复杂的操作来管理您的工作流。一个 Bash 脚本允许我们创建一个文件,该文件将执行您试图构建的命令和逻辑。Bash 有自己的语法,我们不会深入研究,但是如果你想快速入门,点击下面的链接。Bash 脚本由。我们将使用触摸命令创建一个 example.sh 文件,在我们到目前为止一直使用的目录中创建这个文件。每个 bash 文件都以下面一行开始。

在所有 bash 脚本中

现在,我们可以添加我们想要的任何命令,并根据工作流的需要操作我们的文件。我们可以首先添加一个命令来创建一个新的子目录,并向我们的终端返回一条消息“Hello World”。

创建目录并返回“Hello World”

Echo 是一个命令,本质上相当于 Python 中的 print 语句。现在要运行 bash 脚本,运行 bash example.sh ,example 是您为文件命名的任何内容。如果您在之后运行 ls 命令,您应该会看到一条“Hello World”消息和一个创建的子目录。

作者截图

这个例子很简单,但是在将来,bash 脚本经常被用来与各种服务/工具(如 Docker 或云提供商,如 AWS)协调工作流,以便能够与您的本地机器和资源进行交互/对话。

3.Jupyter 笔记本中的 Shell 脚本

对于所有的 Jupyter Notebook stans 来说,也有一个很好的特性,可以创建 Bash 单元来执行。

在朱庇特笔记本里狂欢

通过在单元顶部添加 %%sh ,您已经将该单元变成了一个可以执行传统 bash 脚本的代码块。如果您不在 Jupyter 实验室类型的环境中,无法启动终端来处理您的资源,那么使用这个特性非常方便。

作者截图

4.Argparse

在 ML、Cloud 和一般编程中,你会看到一个常见的 Python 库是 Argparse。Argparse 允许你在命令行 传递参数给你的脚本。当你为云中的服务提供 ML 脚本时,你会看到它在计算机视觉项目以及 AWS 中被频繁使用。为了理解 argparse,我们可以制作一个简单的计算器应用程序,我们可以从 CLI 使用它。

导入解析器

首先,我们导入 argparse 并创建一个解析器。下一步是添加我们可以从 CLI 传入的参数。

计算器的参数:Num1,Num2,Operation

现在我们已经添加了数字参数和一个操作符,我们需要能够处理这些操作符并应用必要的逻辑来创建一个基本的计算器应用程序。

传递的解析参数

现在参数已经被解析并传递到我们创建的基本计算器逻辑中。要查看 argparse 提供的计算器的运行情况,我们可以进入 CLI。

作者截图

我们将该结构中的 python filename.py args 以及我们创建的任何参数传递给我们的 CLI,并看到我们的应用程序正在工作。Argparse 非常容易使用,并且有很棒的文档,可以帮助你创建非常强大的应用程序,并通过 CLI 将项目中的各种服务缝合在一起。

结论

我希望这篇文章能够很好地介绍如何使用 CLI。在学习数据科学的过程中,非 CS 或技术背景的人常常会跳过掌握 CLI 等步骤。我不能强调 CLI 在管理您的资源以及与其他服务和提供商进行交互时是多么重要,因为您只需从 Jupyter 笔记本电脑升级您的应用程序。

请随时在 LinkedIn 上与我联系,或者在 Medium 上关注我。分享任何想法或反馈,谢谢阅读!

为什么美国食品和药物管理局监管医疗人工智能产品对每个人都有好处

原文:https://towardsdatascience.com/why-the-fda-regulating-medical-ai-products-would-be-good-for-everyone-47a269a754ae?source=collection_archive---------49-----------------------

医疗人工智能技术可能会随着明确的审批流程而飙升

尽管 FDA 没有维护已批准人工智能产品的公共数据库,但两项研究已经确定了在 160225 之间已批准的产品。

在 STAT 发现 FDA 批准的 161 种产品中,只有 73 种在公开文件中披露了用于验证的患者数据的数量 ,其中:

  • 观察到的患者从 0 到 15,000 不等
  • 只有 7 种产品提供其数据集的种族构成
  • 只有 13 个产品提供其数据集的性别构成

数据标准的不一致破坏了对医疗人工智能产品的信任,并危及其未来的增长。一些公司声称与 FDA 有关于使用多样化数据集的通信,例如人工智能乳腺成像检测提供商 iCAD。但是这些很少被写进他们的 FDA 文件。

这种方法不同于 FDA 对新药的长期严格审查。为什么这很重要?将新的救命人工智能产品推向市场至关重要。统一这么做保护了患者获得了对这些新工具的信任,为更安全、更广泛地使用人工智能打开了市场

FDA 为产品提供一致、清晰的审批流程有哪些主要好处?

新产品

在我从事医学人工智能的工作中,我看到了研究人员竭尽全力创建一流的模型。然而,不明确的监管框架限制了应用深度学习解决医疗问题的数量,更少的人将这些技术商业化。

我们看到深度学习的使用正在爆炸。模型可以拯救生命,提高可及性,降低成本,改善病人护理。一条清晰的市场路径鼓励医疗人工智能的创新。

照片由拉蒙·萨利内罗Unsplash 上拍摄

更好的型号

医学文献中充满了不同的数据集如何产生更好的模型的例子。机器学习之前的经典医疗方法就是如此,AI 有潜力改善或减少医疗偏差。

我已经写了关于多样化的数据集如何能够提高跨种族、收入和教育水平的预测。在其他人口统计中也是如此——例如,最近的一项斯坦福研究显示,基于图像的人工智能模型的数据主要来自加利福尼亚州、马萨诸塞州和纽约州。这些州的患者并不能代表美国的所有人。确保工程师在各地培训模型将创造出适用于每一位患者的模型。

基于顶级研究人员输入的一组最佳实践也会改进模型。例如,如果工程师在测试前的模型创建的任何步骤中使用测试数据,模型就不太可能超出其初始数据集。

一套清晰的指导方针将确保所有进入市场的人工智能产品产生的模型不仅仅是纸上谈兵——它们实际上是可行的。

广泛使用

如果没有监管提供一个框架来建立对有效性和安全性的信任,医疗人工智能产品的使用就会受到限制。

欧文·比尔德在 Unsplash 上的照片

上次生病为什么要吃抗生素?或者你的医生开的最后一张处方?

监管机构的目标是确保产品安全有效。这样做意味着更多的人会对人工智能感到舒适,无论是癌症检测算法还是医生的手术助理。

性能监控

目前,没有标准来监控人工智能产品的批准后。对于非人工智能医疗器械,存在上市后安全性监测。FDA 不能对人工智能产品使用同样的标准,人工智能产品适应得更快。但是,需要有一个标准。

这将有助于回答以下问题:

  • 如果你的人工智能产品在现实世界的设置中无效怎么办?
  • 当你继续更新和训练它时,你的模型仍然有效吗?
  • 在什么情况下需要重新申请批准(例如,如果您的产品从为放射科医生突出显示 X 射线切换到识别条件会怎样)?

明确地说,深度学习模型比许多药物和传统技术适应和发展得更快。但是我们需要了解批准后的变更过程是什么样的。我们需要创建一个流程来监控性能和安全性。

患者隐私

许多医疗提供商在不通知患者的情况下,使用人工智能系统来辅助决策。一个常见的理由是,他们使用这些工具进行操作,而不是进行研究。然而,在传统环境中,未经证实的药物需要患者同意才能参与经批准的受监控的研究。

现在,运营和研究的定义是主观的。对收集患者数据的担忧似乎也在增加,像阿森松岛涉嫌向谷歌出售可识别的患者数据。围绕什么定义研究以及如何收集患者数据来定义协议将降低患者和公司的风险。

降低成本

现在,公司没有多少动力去收集和多样化他们的数据,保护模型,并采取其他措施来改进他们的产品。为什么?没有框架。如果 FDA 发布一个所有公司都必须遵守的框架,它们将承担这样做的费用——并在长期内降低成本。

审批的不确定性增加了成本。如果公司通过正式程序申请,可能比与 FDA 的团队进行非正式沟通更便宜。要求和时间表会更清楚。这降低了公司和 FDA 的成本。最终是病人。

稳定性

在特朗普政府的最后几天,它提交了一项提案,要求将许多医学人工智能类别永久豁免于 FDA 审查。几周后,拜登政府搁置了这项提议。医学 AI 的命运不应该随着国家政治的变化而改变。

虽然适应性是这个新领域的关键,但我们应该为人工智能医疗产品建立一个稳定的标准——就像我们对非人工智能医疗产品一样。

照片由亚历山大·奈特Unsplash 上拍摄

结论

虽然我们不想让医疗人工智能这样一个快速变化的新领域陷入困境,但为审批和上市后表现提供一个基本的监管框架将:

  • 增加公众对人工智能的信任
  • 改进市场上的医疗人工智能
  • 扩大人工智能的使用
  • 保护病人

这些好处将加速人工智能在应用 中的使用,改善患者护理、医疗结果和可及性他们还将确保上市产品的正常运行。因此,我们可以有一个未来,医学人工智能使医学更好造福我们所有人

注:截至 2021 年 1 月,FDA 在此提出了基于 AI 的软件行动计划

为什么 IDE 不是基于 SQL 的分析的未来

原文:https://towardsdatascience.com/why-the-ide-is-not-the-future-of-sql-based-analytics-291d34955d8a?source=collection_archive---------9-----------------------

查询需要 ide 中没有的上下文。【在 hyperquery 中你会有更好的写作时间。]

这看起来像一个 IDE,是吗?所以,不是这个。[图片来自 Freepik]

我只想说:传统的 IDE 格式不太适合为分析工作编写查询。我会先解释原因,然后告诉你能做些什么。

首先,我的解释——当您编写或阅读查询时,有两件事您真的需要知道,而 ide 在这方面确实做得不够:

  • 🗃数据上下文: 这些表和列是什么?查询对表和列进行操作。不了解这些基本成分代表什么,你将在黑暗中飞行。
  • 📈业务上下文: 这个查询的目的是什么?SQL 的产品通常不是代码本身——而是你从中获得的洞察力,它通常存在于你的.sql文件之外。

让我们更深入地考虑这些,然后考虑一些解决方案。

IDE 是为代码上下文而构建的,而不是数据上下文 🗃

开始编写查询时,您做的第一件事是什么?

select ... from ...

您写下selectfrom,然后寻找表格和列(以及关于这些表格和列的信息)来填充空白。

然而,传统的 ide 被构造成提供代码上下文,而不是这种类型的数据上下文。如果您曾经使用过现代的 IDE,您知道您可以立即跳转到对象定义。太棒了。这使得获取编程所需的上下文变得更加容易——这种上下文是在代码库中的一个单独文件中定义的。除了文件结构视图为您指明方向之外,IDE 还使您能够管理包含数百个相互交织的文件的代码库。

但这并不是 SQL 所需要的。

你不需要跳转来理解你的查询——你需要深入的文档。

需要铲子的时候不要用锤子。♠️[图片来自 Freepik]

与代码库不同,SQL 文件[通常]是独立的文件,只依赖于表,意味着 ide 中引用跳转所带来的好处大大减少了。您的依赖关系只有一层。另一方面,你需要的那种表格和列信息通常需要深度。例如,我会花时间寻找关于表的附加文档,还有谁使用过它们,在 Github 中引用它们的管道以理解它们的出处,等等。简单地说,现在的任何 SQL IDEs 都缺乏对这种深度信息的访问。

IDE 没有业务上下文的位置📈

假设您已经知道如何获得足够的数据上下文来编写查询。接下来你会做什么?通常情况下,你会想要写下你的工作(至少如果你想有任何希望理解你所做的决定或在未来获得的洞察力)。

代码不是产品。你的洞察力是。💡[图片来自 Freepik]

"但是罗伯特,那么的自文档代码注释呢?"你可能会说。

根据我的经验,单独的松散的 SQL 文件,无论组织得多么好或者注释得多么好,都不足以跟踪您的工作。我总是发现自己要么让他们跟着降价走,要么把他们放在一个单独的笔记工具里。为什么?

因为 SQL 是你和你的数据之间的一个接口,而不是传统的编程语言。

换句话说,SQL 几乎总是达到目的的手段,而不是目的本身。因此,这意味着代码本身并不是故事的全部。代码、动机、结果——这些都是理解查询目的所必需的,而 IDE 中几乎没有空间来放置这种形式的上下文。

解决方法

好吧。所以我已经告诉你,ide 没有数据上下文或业务上下文的空间,但我没有提供任何解决方案。事实上,没有太多的选择。

  • 汇总数据发现+查询 IDE/SQL 笔记本+ doc app 数据发现工具修复数据上下文问题,单独的 doc app 将解决业务上下文问题。这是我们向早期客户推荐的,但这有一个严重的问题:一切都是脱节的,很难管理和保持同步。此外,想到在一个应该只需要一个应用程序的工作流程中使用 3 个应用程序,我就头疼。
  • Whale
    如果您正在寻找一个准系统解决方案,请查看 whale ,它使您能够使用命令行数据发现和 markdown 文件中的可执行 SQL 将数据上下文和业务上下文结合起来。也存在一些基于开源笔记本的解决方案,但我们通常发现它们笨重或不发达(plain Jupyter notebooks+Knowledge-repo专营权Querybook )。

如果您正在寻找一个更优雅的解决方案,我们可以为您的数据环境、业务环境和查询提供一个和谐共处的地方。

概念,满足 SQL 笔记本,具有深度集成的数据发现。

我们称之为:Hyperquery——数据分析师的协作工作空间

我们正在构建一个 SQL 优先的工作区,它优雅地将查询编辑器转变为一个令人愉快的文档工具(想想概念),具有易于访问和深度集成的数据发现功能。我们一直在与一些早期客户合作,考虑到他们的反应,我们相信这是编写 SQL 的最佳方式。我们保证你从未用过这样的东西。在 hyperquery.ai 注册加入等候名单——我们将在接下来的几周内推出我们的邀请专用平台。

结束语

我们在编写查询时搜索的上下文信息不仅仅是为了方便。 SQL 查询及其组成组件需要上下文才有意义。没有上下文,你不仅是在浪费时间,而且是在鲁莽行事!😉

下次编写查询时请记住这一点——获取上下文,编写文档,您将拥有一个更加可持续的工作流。如果你想要一个工具让这变得更容易管理,在这里注册 Hyperquery。

Tweet@ imrobertyi/@ hy perquery打招呼。👋
关注我们
LinkedIn。🙂

为什么彩虹色地图有问题

原文:https://towardsdatascience.com/why-the-rainbow-color-map-is-problematic-23293d0937d5?source=collection_archive---------22-----------------------

彩色地图效果的比较。彩色地图,从左到右,彩虹,冷-暖。修改自 Moreland (2009)。

在科学可视化中,将标量值映射到颜色是一个基本过程。尽管无效,彩虹彩色地图仍然被大多数科学可视化工具使用。这种彩色地图因模糊数据、引入假象和迷惑用户而臭名昭著(Moreland,2009)。

甚至华尔街日报在“天气预报应该越过彩虹”中警告我们,Matlab 在“彩虹的烦恼”中写了博客。

Moreland (2009 年)探索了发散彩色地图在科学可视化中的应用,并提供了在科学可视化应用中通常表现良好的发散彩色地图,如图 1 所示。与发散彩色地图相比,图 2 显示彩虹彩色地图无法捕捉数据变化。

彩虹彩色地图的主要问题是它在感知上不一致。这意味着数据值中的等阶并不映射到感知颜色中的等阶。结果,数据中的细微细节被掩盖了,用户会发现很难比较数值。

彩虹颜色图也有问题,因为它不是单调的。这意味着随着数据值的增加,颜色并不总是变得更亮或更暗。这可能会在可视化中引入假象,从而难以看到趋势。

最后,彩虹色图经常被用来显示具有大动态范围的数据。这意味着最小和最大数据值之间有很大的差异。彩虹色图不太适合显示动态范围较大的数据,因为它会压缩数据,很难看到微小的变化。

科学家们已经提出了许多彩虹彩色地图的替代品,如喷射彩色地图。然而,jet 彩色地图由于许多相同的原因也有问题。一个更好的选择是冷暖色图,这在许多科学可视化工具中都有。冷色调的颜色图在感觉上是一致和单调的,并且在可视化具有大动态范围的数据时表现良好。

图一。冷暖色图,一种连续发散的色图,非常适合在科学可视化应用中使用。

图二。彩色地图效果的比较。彩色地图从左到右依次是彩虹色、冷暖色。修改自 Moreland (2009)。

参考

K. Moreland,“用于科学可视化的发散彩色地图”,《视觉计算进展》,第 5876 卷,柏林,海德堡:施普林格柏林海德堡,2009 年,第 92–103 页。doi:10.1007/978–3–642–10520–3 _ 9。

为什么 S.T.A.R 方法在数据科学面试中不起作用,该怎么办

原文:https://towardsdatascience.com/why-the-s-t-a-r-method-does-not-work-in-data-science-interviews-and-what-to-do-instead-f82982d55ce8?source=collection_archive---------6-----------------------

办公时间数据科学面试

使用 G.I.C.F .方法给出一个清晰而有吸引力的答案

活动创作者Unsplash 上拍摄的照片

数据科学面试中最常见的问题之一是被要求谈论以前的数据科学项目。面试官要求你从你过去的经历中描述一个有影响力或有趣的项目。

这个问题可以出现在数据科学面试过程的任何一个环节。你可能会在技术电话筛选或现场面试中被问到这个问题,但底线是,如果你想在数据科学领域工作,你应该预料到这个问题。每个公司都这么问。

然而,尽管这很常见,许多人并没有为这个问题做准备。他们认为这是非技术性的,因此不需要提前准备。

但是,没有准备这个关于过去数据科学项目的问题是一个错误!许多人对这类问题没有很好的回答,他们甚至可能因此而面试失败。

当你回答一个关于以前项目的问题时,做好准备至关重要。你的回答需要有条理,这样你就可以轻松地提出必要的观点,吸引面试官。

许多人用来回答这类问题的结构是 S.T.A.R 方法。虽然 S.T.A.R 方法确实提供了结构,但它不是在数据科学面试中描述以前项目的最佳方法。

在本文中,我们将概述为什么 S.T.A.R 方法在面试中不起作用,并介绍一个替代框架,它将帮助您在下次面试官要求您描述过去的数据科学项目时给出清晰而有吸引力的答案。

让我们开始吧。

目录

什么是 S.T.A.R 方法?

为了理解为什么 S.T.A.R 方法不起作用,让我们首先确定我们理解什么是 S.T.A.R 方法。

S.T.A.R 方法是人们在面试中用来回答行为问题的框架。它是这样分解的:

  • 状况:从设定场景开始,为你的故事提供任何必要的背景或细节。
  • 提问:继续描述在那种情况下你的任务或职责是什么。
  • T21 行动:解释你采取了什么行动来完成这项任务。
  • 结果:分享你行动的结果。

作为一种讲故事的方式,S.T.A.R 方法非常有意义。你从设定场景开始,然后把你自己介绍到那个场景中,描述你做了什么,最后以你行为的影响结束。它依靠一种最自然的方式来安排故事:按时间顺序。你从你必须做的事情开始,然后以你做的事情结束。

为什么 S.T.A.R 方法在面试中不起作用?

虽然 S.T.A.R 方法非常自然,并且确实提供了结构,但它不是回答有关以前数据科学项目的问题的理想框架,原因有两个:时间限制和灵活性。

订单没有时间限制

照片由 NeONBRANDUnsplash 上拍摄

先说时间限制的问题。S . t . a . r 方法把结果放在最后。虽然从事情实际发生的顺序来看,这是合乎逻辑的,但这意味着直到最后你才会讨论你的工作和项目的影响,但结果是你答案中最重要的部分!

记住,从面试官的角度来看,这个问题的总体目标是什么。他们想知道你是否是这个职位的合适人选。他们想看看你是否能成为一名潜在的员工,这意味着面试官更关心项目的结果而不是背景。

像你在 S.T.A.R 方法中所做的那样,把这一重要部分放在最后是有风险的。如果你没有时间了,你将错过讨论你答案中最重要部分的机会。

在面试中,时间不够是很有可能的。当面试官问你以前的数据科学项目时,他们可能在寻找一个 2 分钟或 20 分钟的答案。不能保证你有足够的时间来完成你想说的一切,所以把结果留到最后不是一个好主意。

缺乏灵活性

S.T.A.R 方法的另一个问题是灵活性,或者说缺乏灵活性。S.T.A.R 方法在某些方面过于结构化。这是一个循序渐进的计划,没有给面试官留下参与的空间。

如果面试官对情况不感兴趣,而是想了解更多你的行动怎么办?如果面试官花了很多时间询问情况的更多细节,而你没有时间了解行动和结果,该怎么办?

一个更好的结构将会为你提供与面试官互动的空间,并根据他们的兴趣和面试流程修改你的答案。S.T.A.R 方法很适合讲故事,但是面试不应该是故事。这应该是一次对话,而这正是 S.T.A.R 方法的不足之处。

有什么比 S.T.A.R 方法更好的替代方法?

照片由 Cytonn 摄影Unsplash 上拍摄

知道什么在面试中不起作用只会让你到此为止。现在我们知道了 S.T.A.R 方法的问题,让我们检查一个替代框架,它允许你在给你必要的灵活性的同时组织你的答案。

我推荐的框架也有四个步骤:

  • 目标
  • 影响
  • 挑战
  • 发现

让我们检查这四个步骤,以及这个框架如何解决 S.T.A.R 方法出现的问题。

目标

我的框架的第一步是总结项目的目标。你的公司当初为什么选择做这个项目?该项目旨在解决什么业务问题?

虽然这一步类似于 S.T.A.R 方法中的情景部分,但一个重要的区别是长度。你应该只用一句话来解释你项目的目标。你不是在设置场景,而是简单地解释项目的目的是什么。

如果需要提供更多项目目标之外的语境让面试官理解,可以在这里再加一句。在这里你可以提供一些信息,比如你什么时候做的这个项目,你和什么公司一起做的,它持续了多长时间,等等。

总的来说,你的答案的目标部分应该不要超过两句话。虽然一些初始的背景很重要,但是你应该尽量简短,这样你就可以快速进入你的回答的各个部分,向面试官展示为什么你是一个好的候选人

影响

解释完项目的目标后,现在你可以进入项目最重要的部分:影响。S.T.A.R 方法把这一部分留到了最后(结果),但通过把这作为你框架的第二部分,你确保了你有时间讨论你能够实现的目标,这显示了你作为候选人的能力。

当解释你的项目的影响时,说出数字是至关重要的。例如,这是一个关于过去数据科学项目的面试问题答案的第一部分。

我去年做过的最有趣的数据科学项目是一个旨在通过在我们的应用程序上提供新功能来提高客户保留率的项目。新功能是提供货物预计到达时间的预测。这是一个为期六个月的项目,我们能够将客户保持率提高 20%。

在这个例子中,您可以看到我解释项目目标的速度,以及我提供的度量标准如何清楚地显示影响。这么快就说出结果会引起面试官的兴趣,这在面试中至关重要。如果你让他们听你的,你所有的答案都将有更好的机会脱颖而出,引起你的注意。

当你完成了目标和影响,这一切加起来应该只有几句话,你已经给出了项目的基本概况。正是在这一点上,你应该抓住机会与面试官互动。

问面试官他们是想让你提供更多的背景还是深入项目的细节?让面试官选择你接下来要走的方向。这再次让面试官参与进来,让你的回答更像是一次谈话而不是一份报告。

如果面试官要求更多的背景信息,给出更多的背景信息,但是尽量简短。背景看起来很重要,但是对你的面试没有什么帮助。项目的背景并不能解释为什么你是一个好的候选人,所以避免花太多时间在背景信息上。

挑战

面试官可能会对你对项目的基本概述感到满意,但大多数时候他们会想要更多的细节。当面试官让你继续描述项目时,你可以进入回答框架的第三部分:挑战

我建议讨论项目的 2 到 3 个挑战。在选择要讨论的挑战时,目标是混合使用技术和非技术示例。

技术挑战是您在项目中可能遇到的与数据科学相关的实际问题。以下是一些您可以用来思考技术挑战的问题:

  • 在定义成功指标时有问题吗?
  • 获取数据很难吗?
  • 数据集很大吗?你是怎么处理的?
  • 数据质量高吗?
  • 你是如何处理这些数据的?
  • 在模型培训和部署方面有什么挑战吗?

非技术挑战包括一系列与数据科学没有直接关系的问题。这可能是在项目管理和与其他团队和领导的协调等领域。以下是一些可能引发非技术性挑战的问题,供您讨论:

  • 你有没有遇到其他车队的反对或阻碍?
  • 你是如何让其他人接受你的想法的?
  • 截止日期有什么困难吗?
  • 你做了什么来解除你自己或你的团队的封锁?

为什么要用挑战作为描述项目的方式?为什么不描述一下这个项目呢?

永远记住这次面试的目的,甚至这个特定问题的目的也是让面试官决定你是否是这份工作的合适人选。通过描述一个项目你所面临的一些挑战,你展示了你可以交付成果。

从挑战的角度来看待事物可以让你谈论自己。如果你只是描述项目的整体,面试官会不清楚你具体做了什么来推动这个项目。

这实际上不是讨论挑战。相反,你应该着重展示你是如何介入并解决挑战的。这是一个很好的方式来表明你有资格并且能够对你工作的地方产生真正的影响。

虽然你可能有很多很好的观点要说,但是记得要继续和面试官交流。在你讨论完每个挑战后,问面试官他们是否想听更多的细节,或者他们是否想让你继续描述这个项目。你希望面试官保持专注。

发现

斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上拍摄的照片

在你谈完挑战后,如果你还有时间,你需要一个方法来总结你的答案。

与 S.T.A.R 方法不同,我们不想把最重要的信息留到最后,但我们也想在与面试官的谈话中以高潮结束。为了做到这一点,我建议分享一个来自这个项目的有趣发现。

有很多不同的东西可以被视为有趣的发现。您可以分享:

  • 数据出乎意料的一面
  • 你从工作中获得的洞察力
  • 有趣的观察

这看起来好像你只是在分享有趣的事实,那么这对你的面试有什么帮助呢?在答案的挑战部分,你向面试官展示了你能完成这个项目。通过分享一个有趣的发现,你向面试官展示了你也喜欢这个项目

表现出你对自己的工作有天生的兴趣是向面试官保证你关注细节和成长能力的好方法。你在乎,因此更有可能将你的注意力和努力投入到工作中。在激烈地讨论挑战后,它还会温柔地结束你的回答。

记住这是你回答的结尾。你希望这一部分保持简短,这样你的回答就不会拖拖拉拉,让面试官厌烦。把自己限制在项目中的一件事情上。

结论

虽然 S.T.A.R 方法是组织故事的有效方式,但它不是向面试官解释过去的数据科学项目的最有效方式。

相反,我推荐目标、影响、挑战、发现模型。这种模式将基本信息放在第一位,并使用一种让您专注于自己对项目的贡献的结构。

当使用这种模式时,要记得给面试官留下交流的空间,就像我在整篇文章中讨论的那样。你不希望你的回答感觉像一份报告。当你完成框架的各个步骤时,让面试官指导你他们想要多少细节。

描述一个先前的数据科学项目肯定会出现在几乎所有的数据科学面试中。因此,没有做好准备是一个非常可以避免的错误。使用我的框架,你可以计划和组织你的回答,给出一个清晰的、信息丰富的、有效的答案,给面试官留下深刻印象,并充分利用你的时间。

感谢阅读!

如果你喜欢这个帖子,想支持我…

为什么世界需要数据企业家

原文:https://towardsdatascience.com/why-the-world-needs-datapreneurs-b2864d2d50b5?source=collection_archive---------24-----------------------

从一个个人故事中了解为什么数据计划在过去十年中失败了,但在今天仍然充满挑战。从数据产品管理到数据创业,作为整体应对未来数字化的方法。

在数据科学领域工作了近十年后,在商业分析、商业智能、高级分析、机器学习以及人工智能等各个领域,我最终不得不接受从数据中创造价值是一个挑战,而且可能永远是一个挑战。虽然我在职业生涯的最初几年提供实践数据科学解决方案,但在后来的阶段,我与人共同创立了一家名为 Mindfuel 的公司,并开始从更具战略性的角度研究和分析组织生态系统和环境,所谓的数据计划就诞生于其中。这是我目前发现的情况。

2010 年代的数据科学浪潮

十年前,欧洲市场掌握在商业智能解决方案及其提供商手中。在大多数情况下,数据在关系数据库中被历史化,SQL 是处理它们的首选编程语言。在一天结束时,会生成一个业务报告,或者在业务用户可以访问的服务器上部署一个仪表板。多亏了一些大玩家,一门新的学科即将从美国飘洋过海来到欧洲,它的名字叫“数据科学”。

这是一场炒作的开始。人们希望使用先进的方法从数据中获得更多——更多信息、更多见解、更好的行动——简单地说:更多价值。新的需求出现了。我们分析师学会了开发模型、创建展示、构建原型,甚至部署首批飞行员。我们非常自豪地向高管们展示了公司的下一个大型灯塔项目,他们同时感到兴奋和高兴。此外,他们为我们提供了进一步的财政资助和预算,使我们能够继续下去。

他们的期望非常明确:请从这些计划中传递价值。其中一些利益相关者投入了大量资金。他们资助了能力中心、数据实验室、人工智能中心、数据单元,当然,还有所有必要的技术来构建最先进的“数据宇宙”。CDO 被雇来挖金子。市场一直在无限增长,直到有一天,第一个利益相关者问了一个神奇的问题:“我大概什么时候能获得投资回报?”从这一刻起情绪倾斜了。

在意识到只有有限数量的数据计划真正回报了所有的努力或有一天达到收支平衡后,知名研究机构跳了出来,并解释说 ~90%的数据计划不会进入生产。我们都不得不承认,开发技术解决方案在某种程度上起了作用,但不足以交付‘价值’

最后,这种炒作在十年结束时慢慢变平,今天的决策者开始在批准预算和投资之前首先要求 ROI 概念。

我对我们为何失败的观察

是的,我们失败了。我们共同失败了:专家、供应商、用户和客户,以及他们的员工和利益相关者。

以下是预览:技术不是唯一的责任。在过去的十年里,我们在设计和开发更好的模型、更好的基础设施以及更好的平台方面取得了进步,或者总结为:更好的解决方案。由于现有的和新的提供商和开源社区的努力,在数据集上执行回归模型或扩展模型变得前所未有的简单,这需要通过简单的点击获得更多的计算能力。

然而,不知何故,一个适当的组织环境的相应转变被错过了。我的主要观察总结如下:

  • 人们假装敏捷,但仍然以瀑布模式思考,或者至少努力将敏捷方法付诸实践
  • 组织仍然缺乏适当的数据操作模型来开发数据产品,以及如何将这些数据产品集成到目标生态系统中的相应过程
  • 总的来说,数据世界很少考虑用户的需求。直到今天——主要的焦点是可行性
  • 文化和思维方式的挑战:我们如何在业务部门之间进行合作——尤其是在数据方面
  • 关注产出,而不是结果:产出和结果的区别是什么?我们一直在执行项目,而不是开发产品,不是吗?
  • 没有人对商业案例负责,也没有人确保投资会有适当的回报

所有这些观察都与数据科学中众所周知的挑战无关,例如有多少数据是可访问的、可用的或准备好进行分析的,但远远超出了数据空间。

从数字产品管理中学到的东西

出于对现状的某种沮丧,2019 年,我将我的发现提交给了我的一个最好的朋友,也是今天 Mindfuel Max 的联合创始人,他当时是一名数字产品经理。他立刻遇到了一些站不住脚的假设:

  • 你开发的不是产品,而是项目。
  • 在制定解决方案时,你没有考虑可取性。
  • 您没有考虑适销性,因为您的解决方案将在市场上与其他解决方案竞争。
  • 谁拥有您的解决方案的可行性?然而,它不能是数据产品的所有者。

我的情绪从沮丧到愤怒再到动力。他说得有道理!当他更详细地向我解释产品管理的核心以及产品经理的具体角色和职责时,这敲响了警钟,并提出了一些合理的问题:这对数据科学项目来说意味着什么?数据科学项目的产品负责人或项目负责人可以负责 ROI 吗?或者由典型的业务所有者来承担责任,他向项目提供需求和领域知识?但是,她/他是否有资格拥有整个解决方案?难道她/他不是最终以用户的角色成为解决方案的接受者吗?如果是,谁最终拥有数据产品?为什么在数据空间中没有合适的产品经理角色?

Mindfuel 的数据产品管理方法

牢记对利益相关者的价值创造承诺,Max 和我很快就进入了这个旅程的下一步 数据产品管理 。适应(数字)产品管理的方法和框架为未来如何实现和交付数据计划打开了一个全新的视角。我们将敏捷框架、执行引擎和产品管理工具的方法和概念与 CRISP-DM、ML- & DataOps 的产品相结合,并在所有这些基础上融入了数据战略领域的原则。这导致了一种整体的方法,这种方法大于其各部分的总和。

为什么世界需要数据企业家

然而,我们所有的努力导致了这样一个事实:除了数据产品管理之外,这个故事还可以添加更多内容。我们意识到数据产品管理是规程的一部分,称为https://mindfuel.ai/

data reneur就是这种“下蛋的长毛奶羊”十年前曾经是数据科学家。当船以全速航行时,每个项目中的船长保持航向。一个接受风险并渴望交付承诺的投资回报。她/他是拥有比 ML 模型更大的产品愿景的人。他/她时刻牢记用户的愿望,并相应地创造业务关键型成功,同时在实践中理解和应对数据世界的挑战。****

数据企业家的定义

但从更全面的角度来看,还不止于此:

这是一个人物有勇气失败,迅速从中吸取教训,并在这个旅程中创造了一个不断增长的生命周期。创新和价值创造齐头并进的循环。这种人尊重这样一个事实:投资者的钱不是免费的午餐,而是需要以合理的倍数回报,不仅要考虑商业利益,还要考虑道德和伦理,尤其是在涉及数据及其被滥用的潜在危险时。一个数据创业者总是真正关心数据在今天的产品中是如何使用的——以及将来会如何使用——同时考虑产品的更大目标。数据企业家用人们喜爱的创新和可持续的数据产品取悦世界。他/她设计和制造的每一件产品都让环境变得更好——一步一步,一个想法一个想法,一个产品一个产品。**

总有一天,data reneur将成为每个数据计划的一部分,确保价值和数字化的成功。****

你对此有什么想法?就我们而言,我们将继续我们的旅程,最终降低数据计划失败的百分比,我们期待着一路上的任何同伴。

为什么深度强化学习中的策略梯度定理有问题

原文:https://towardsdatascience.com/why-there-is-a-problem-with-the-policy-gradient-theorem-in-deep-reinforcement-learning-958d845218f1?source=collection_archive---------25-----------------------

或者,我喜欢称之为“折扣因子的魔法”

伊卡洛斯号的飞行,b y 雅各布·彼得·戈威——【https://commons.wikimedia.org/w/index.php?curid=27493281】T2

多亏了我的导师 Proutiere 教授,我第一次发现这个问题,是在检查我去年 2020 年秋季在 KTH 举办的强化学习(EL2805)课程第二次实验室会议的提案时。

这个问题严重到足以影响大多数深度强化学习算法,包括 A3C [7]、SAC [8]、ACKTR 算法[9]等。

大致上,这是我的主管发给我的电子邮件:

嘿,阿莱西奥,我有一个关于政策梯度定理的问题。平均值是关于μ的,μ是一个贴现态分布。但是,一般来说,人们如何证明我们使用由政策π诱导的静态政策分布产生的经验,而不是贴现分布μ?

为了充分理解他的意思,我和我的主管之间来回发送了几封电子邮件是必要的(在我的辩护中,他的第一封电子邮件含糊不清,前面引用的句子是那封电子邮件的“澄清”版本:))。

如果你还不知道我在说什么,让我简单地提醒你一下政策梯度定理[1]是如何工作的。

政策梯度定理

尽管 PG 定理很简单,但它已经实现了我们目前看到的深度强化学习的许多成就。

基本想法如下:

我们是否可以通过使用某个目标函数 J(θ)相对于θ的梯度来改善由θ参数化的策略π的性能?然后,通过简单地使用随机梯度上升方法,我们可以根据该梯度改善策略的性能。

为了定义目标函数 J(θ),通常使用期望总折扣报酬标准

由θ参数化的政策π的期望报酬标准。

简要描述:

  1. 第一个期望就是保单的贴现值π, ,而第二个期望是第一个期望的对偶形式(第一个考虑时间,第二个考虑状态-行为空间查看遍历定理更好的理解这种对偶性)。
  2. 在第二个期望中,我们对策略π诱导的贴现状态分布μ取一个期望。

π诱导的贴现态分布;p0 指初始状态分布;P(s_t=s|s_0=z)是使用策略π时,在时间 t 达到状态 s 的概率(假设初始状态为 z)。

PG 定理是如何发挥作用的?对于贴现准则,PG 定理规定 J(θ)的梯度简单地为

政策梯度定理(另见[1]);为简洁起见,我省略了归一化因子 1/1-γ(在论文中经常被省略,因为它与贴现态分布中的 1-γ因子相抵消)

注意期望是如何类似于 J(θ)的对偶形式的。该公式可能看起来微不足道,但事实并非如此,原因如下:

在 PG 定理中,J(θ)的梯度不依赖于贴现态分布μ的梯度,即使μ依赖于策略π。

这个结果在强化学习博客中经常被忽略,但它特别重要,因为它说明了 J(θ)的梯度是相对于贴现状态分布μ取的平均值,当θ变化时,我们不需要考虑这个分布如何相对于θ变化。

然而,贴现态分布是所有问题的根源。

那么,现代深度强化学习算法有什么问题呢?

沙哈达特拉赫曼Unsplash 上拍摄的照片

现在,几乎所有的强化学习算法都使用一个折扣因子。因此,如前所述,总期望贴现回报的梯度取决于贴现状态分布μ。

因此,用于更新策略的样本应按照贴现态分布μ进行分布。

然而,在几乎所有的论文中,如果不是全部的话,策略是使用在执行策略π时收集的状态样本来更新的。换句话说,为了更新策略,我们使用根据π诱导的策略上分布分布的样本,而不是折扣分布μ。

有什么区别?简而言之,这类似于从状态分布中去掉贴现因子。

  • 策略梯度计算不正确,因为我们使用的样本不是按照μ分布的。
  • 因此,我们没有优化原始目标函数 J(θ)。
  • 很明显,这个问题对深度强化学习领域中获得的所有经验结果的有效性提出了质疑,并且可能会损害现代深度强化学习算法在现实世界应用中的适用性。

以前没有人讨论过这个问题吗?

当我第一次和我的主管讨论这个问题时,它看起来像是一个没有人考虑过的新事物。但快速搜索发现,作者在[2],“政策梯度是梯度吗?(Nota 和 Thomas),最近对同一问题提出了担忧(它于去年,2020 年发表)。

  • 在【2】中 Nota 和 Thomas 声称这样计算的梯度不是任何函数的梯度。使用这种梯度的算法不能保证收敛到一个“好的”参数θ。
  • 此外,总是在[2]中,他们表明有可能构造"一个反例,其中不动点相对于贴现和未贴现目标"[2]都是全局相似的。
  • 再深入一点,我们会注意到,类似的问题以前也在[3]和[4]中提出过(这两篇论文中托马斯都是作者之一)。

非常令人惊讶的是,没有多少研究人员意识到这个问题。这可能是由于缺乏对强化学习和马尔可夫决策过程的理论理解。

怎么才能解决呢?

有修复。

很脏,但很简单。

在马尔可夫决策过程中,使用折扣因子和达到最终状态是等价的(另见 puter man【10】,第 5.3 节,他讨论了使用折扣因子和拥有最终状态之间的相似性)。

贴现相当于在马尔可夫决策过程中引入一个终态。这也相当于拥有一个几何分布的视界长度。

因此,我们只需要人工引入以某个概率 1-γ终止轨迹的可能性。

这显然是一个疯狂的想法。强化学习算法已经受到高样本复杂性的困扰,因此这一变化可能会使它变得更糟。此外,这种变化并不真正适用于现实世界的情况。

…也许我们应该降低折扣系数?

或者,另一个想法是简单地贬低贴现因子。萨顿和巴尔托已经在[6]中讨论过,贴现因子在持续的环境中毫无意义。

对于连续设置,没有剧集的概念,优化平均奖励更有意义。此外,这是最接近真实应用程序的持续设置。

不幸的是,这方面的研究很少,因为大部分努力都放在创建新的基于折扣的算法上。

同样,在[5]中,作者讨论了当使用函数逼近时,折扣强化学习如何不是优化问题,以及我们应该求助于平均奖励强化学习。然而,请注意,作者在[5]中讨论的问题与我在本文中强调的问题不同

结论

伊卡洛斯的飞行,b y 雅各布·彼得·戈威——https://commons.wikimedia.org/w/index.php?curid=27493281

这篇文章的目的是提高正确使用贴现版本的政策梯度定理的意识。绝大多数论文不正确地使用了这一梯度,并给出了几乎没有理论依据的结果。

深度强化学习的经验进展与我们对该领域的理论理解不匹配。

“深入研究政策梯度”[11]的作者研究了这个问题,发现梯度估计值与“真实”梯度相关性很差。此外,他们注意到优化景观往往不能反映潜在 MDP 的回报景观。

简而言之,他们声称

总的来说,我们的结果表明,深层强化学习算法的理论框架通常无法预测实践中出现的现象。这表明,构建可靠的深度 RL 算法需要超越以基准为中心的评估,转而从多方面理解它们通常不直观的行为[11]。

相反,我们正在见证一场战斗,以创建尖端的深度强化学习算法来提高 Atari 游戏或 MuJoCo 环境中的分数,尽管这是以减少理论理解为代价的。

我们应该更多地思考这些问题,避免重蹈伊卡洛斯的覆辙。

感谢您的阅读!

参考

  1. 用函数逼近强化学习的政策梯度方法。辊隙。第 99 卷。1999.
  2. 克里斯·诺塔和菲利普·托马斯。2020.政策梯度是梯度吗?。AAMAS (2020)。
  3. 托马斯菲利普。“自然演员-评论家算法中的偏见。”机器学习国际会议。PMLR,2014 年。
  4. 经典政策梯度:保持贝尔曼的最优原则。 arXiv 预印本 arXiv:1906.03063 (2019)。
  5. 纳伊克,阿布舍克等人。“折扣强化学习不是一个优化问题。” arXiv 预印本 arXiv:1910.02140 (2019)。
  6. 萨顿,理查德 s 和安德鲁 g 巴尔托。强化学习:介绍。麻省理工学院出版社,2018。
  7. 深度强化学习的异步方法。机器学习国际会议。PMLR,2016。
  8. 软演员-评论家算法和应用。 arXiv 预印本 arXiv:1812.05905 (2018)。
  9. 吴,,等,“基于 kronecker 分解近似的深度强化学习的可扩展信赖域方法” arXiv 预印本 arXiv:1708.05144 (2017)。
  10. 马尔可夫决策过程:离散随机动态规划。约翰威利&之子,2014。
  11. 安德鲁·易勒雅斯等人,《深入研究政策梯度》学习代表国际会议(ICLR) 。2020.

为什么用 16 位图像训练 CNN 不起作用

原文:https://towardsdatascience.com/why-training-your-cnn-with-16-bit-images-isnt-working-e91da350c49d?source=collection_archive---------17-----------------------

在 Keras 和 Tensorflow 中使用 Uint16 图像实现 CNN 时的注意事项

的照片的 Unsplash

最近我在做一个项目,训练 CNN 识别卫星图像中的开阔海洋现象,我很难得到结果。这些图像是 GeoTIFF 格式,这是科学界基于 TIFF 格式的一种流行文件类型,尤其适用于使用 GIS 的应用程序。根据来源,“高精度值(16 位)以及地理信息被保留,用于基于机器学习的方法的开发……”以及图像的检查

暗示它们是三个通道的图像,尽管图像在视觉上是灰度的。嗯,训练还是不顺利,我也不知道为什么。经过几个小时的谷歌搜索,阅读 github 问题线程,浏览 StackOverflow,我终于找到了一个解决方案,我希望它可以节省你的时间。

如果你已经在大量数据上训练了神经网络,特别是图像,你会知道你必须成批地将图像传递给你的网络进行训练,因为总数据量大于你的计算机一次可以加载到它的工作存储器中的数据量。这种技术在 TensorFlow 中的实现是从他们的Image Data Generator类中调用的flow_from_directory()。我的项目中的代码,创建策略学习中使用的测试、训练和验证图像集,最初看起来像

其中color_mode被设置为‘rgb’,因为根据 TensorFlow 的文档

我知道我的图像有三个通道。然而,我最终能够在一些 github 问题线程中追踪到 TensorFlow 当前未设置为处理 16 位 RBG 图像,它会尝试将我的图像的第一个通道中包含的像素值压缩到 0 到 255 之间,这是 8 位图像的允许值,而不是保留 0 到 65535 之间的准备好的高分辨率 16 位像素值。通过快速检查生成器加载的一个图像像素数组,我验证了这是真的:

我所有的图像都是单调的白色图像!难怪它学不到任何东西..总之,经过进一步的检查,我发现我的图像中的像素值都包含在第一个通道中,是灰度合成孔径雷达图像,而其他通道包含其他信息。这些信息可能在其他机器学习应用中有用,但对于 CNN 的训练,我只对像素数据感到满意,更重要的是 Tensorflow 可以处理 16 位灰度图像。因此,只需将上面生成器代码中的参数color_mode改为‘grayscale’,就像这样

让我开始得到结果!为了验证这一点,我们可以再次查看一个图像数组:

现在我们有了一些 CNN 可以适当借鉴的数据。虽然我希望这对你们中的一些人有所帮助,并在我和其他人遇到的特定问题上为你们节省一些时间,但我们也可以从解决问题的步骤中学习。当谈到 CNN 和一般的神经网络时,它们可能是一种黑箱,这意味着无论它们是否工作,都很难确定原因。就像这个问题一样,它们不工作的原因通常与提供给网络的数据质量有关。因此,开始故障排除的一个好地方是仔细检查您的数据源,并确保传递的信息是您的神经网络类型能够消化的形式。如果还是不行,就多加几层(开玩笑…大部分)。感谢阅读!

为什么先用 SQL 再用熊猫?

原文:https://towardsdatascience.com/why-use-sql-before-using-pandas-c0be893e7774?source=collection_archive---------20-----------------------

大西洋海岸线,石头,数据,更多石头。葡萄牙 2019。(作者供图)

我想把这项工作扩展成一系列教程视频。如果你感兴趣,请订阅我的时事通讯保持联系。

介绍

数据分析是任何数据相关项目中最重要的步骤之一。不考虑上下文(例如,商业、机器学习、物理等。),有很多种方法可以弄对…或者弄错。毕竟,决策往往取决于实际发现。同时,在你找到之前,没有人能告诉你要找什么。

由于这些原因,尽可能保持过程平稳是很重要的。一方面,我们想快速进入本质。另一方面,我们不想让代码变得复杂。如果清理代码的时间比清理数据的时间长,您就知道有些事情不对劲。

在本文中,我们主要关注获取数据。更准确地说,我们展示了如何使用 Python 的两个关键分析库,即 PandasSQL ,获得相同的结果。使用一个示例数据集(见后面),我们描述一些与准备和数据分析相关的常见模式。然后我们解释如何用它们中的任何一个得到相同的结果,并讨论哪一个可能是优选的。因此,不管你是否知道一种方法,但不知道另一种,或者你对两种方法都很熟悉,我们都邀请你阅读这篇文章。

示例数据集

来自 Kaggle 的“NIPS Papers”将作为一个示例数据集。出于以下原因,我们特意选择了这个数据集:

  • 它以 SQLite 文件的形式提供,因此我们可以模拟一个常见的场景,其中数据是从关系数据库(例如数据仓库)中获得的。
  • 它包含不止一个表,所以我们还可以展示如何组合数据,这是一个经常遇到的问题。
  • 它是不完美的:会有 nulls、NaNs 和其他一些常见的问题……生活;)
  • 它很容易理解,只包含两个数据表(“作者”和“论文”),加上第三个来建立它们之间的多对多关系。由于这一点,我们可以专注于方法而不是实际内容。
  • 最后,数据集也以 CSV 文件的形式出现。

欢迎你自己去探索。然而,由于我们关注的是方法,我们将讨论的内容限制在最低限度。让我们开始吧。

获取数据

选择数据的方式取决于数据的格式和存储方式。如果格式是固定的,我们在如何选择上就没有什么选择了。然而,如果数据位于某个数据库中,我们有更多的选择。

最简单也可能是最天真的方法是一个接一个地获取它,并将它们作为 CSV 文件存储在本地。这不是最好的方法,主要有两个原因:

  • 总数据量不必要地变大。你必须处理不是信息的多余数据(索引、辅助列等)。).
  • 根据数据的不同,笔记本电脑将包含大量的清理和处理代码开销,从而影响实际的分析。

这些你都不想要。然而,如果您对数据毫无头绪,那么获取所有数据是最安全的选择。

让我们看看“NIPS”有哪些表和列。

表格authors

import pandas as pddf_authors = pd.read_csv("data/authors.csv")
df_auhtors.info()# returns
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9784 entries, 0 to 9783
Data columns (total 2 columns):
#   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   id      9784 non-null   int64 
 1   name    9784 non-null   object
dtypes: int64(1), object(1)
 memory usage: 153.0+ KB

papers

df_papers = pd.read_csv("data/papers.csv")
df_papers.info()# returns
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7241 entries, 0 to 7240
Data columns (total 7 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   id          7241 non-null   int64 
 1   year        7241 non-null   int64 
 2   title       7241 non-null   object
 3   event_type  2422 non-null   object
 4   pdf_name    7241 non-null   object
 5   abstract    7241 non-null   object
 6   paper_text  7241 non-null   object
dtypes: int64(2), object(5)
memory usage: 396.1+ KB

paper_authors

如前所述,该表使用author_idpaper_id外键链接前两者。另外,它有自己的主键id

图一。显示“论文”表中数据的前 5 行。(图片由作者提供)。

正如我们从图像中看到的(当我们更深入地分析时也是如此),考虑到title列,pdf_name列多少有些多余。此外,通过调用df_papers["event_type"].unique(),我们知道该列有四个不同的值:'Oral', 'Spotlight', 'Poster'NaN(这表示出版物实际上是一篇论文)。

比方说,我们想要过滤掉pdf_name以及任何代表非普通报纸的出版物的条目。在 Pandas 中这样做的代码看起来像这样:

df = df_papers[~df_papers["event_type"] \
            .isin(["Oral", "Spotlight", "Poster"])] \
        [["year", "title", "abstract", "paper_text"]]

这条线由三部分组成。首先,我们传递df_papers["event_type"].isin(...),这是一个条件给我们一个二进制掩码,然后我们将它传递给df_papers[...],本质上是过滤行。最后,我们将一个列列表["year", "title", "abstract", "paper_text"]附加到剩下的部分(再次使用[...]),从而指出我们想要保留的列。或者,我们也可以使用.drop(columns=[...])来指示不需要的列。

实现相同结果的更好的方法是使用 Pandas 的.query方法,而不是使用二进制掩码。

df = df_papers \
      .query("event_type not in ('Oral', 'Spotlight', 'Poster')") \
      .drop(columns=["id", "event_type", "abstract"])

代码看起来更干净,关于.query的一件好事是,我们可以使用@-符号来引用另一个对象,例如.query("column_a > @ass and column_b not in @bees")。另一方面,这种方法有点慢,所以当不得不过度重复时,您可能希望坚持使用二进制掩码方法。

使用 SQL 获取数据

熊猫完成了任务。然而,我们有数据库是有原因的。它们经过优化,可以高效地搜索表并根据需要提供数据。

回到我们的问题,我们在这里实现的只是对列和行的简单过滤。让我们将任务委托给数据库本身,并使用 Pandas 来获取准备好的表。

Pandas 提供了三个可以帮助我们的函数:pd.read_sql_tablepd.read_sql_querypd.read_sql,它们既可以接受查询,也可以接受表名。不支持 For SQLite pd.read_sql_table。这不是问题,因为我们对查询数据库级别的数据感兴趣。

import sqlite3  # or sqlalchemy.create_engine for e.g. Postgrescon = sqlite3.connect(DB_FILEPATH)
query = """
select
    year,
    title,
    abstract,
    paper_text
from papers
where trim(event_type) != ''
"""df_papers_sql = pd.read_sql(query, con=con)

我们来分解一下。

首先,我们需要连接到数据库。对于 SQLite,这很容易,因为我们只提供了一个数据库文件的路径。对于其他数据库,还有其他的库(例如,Postgres 的psycopg2或者更通用的:sqlalchemy)。重点是创建数据库连接对象,该对象将熊猫指向正确的方向并对认证进行排序。

一旦解决了这个问题,剩下的唯一事情就是构造正确的 SQL 查询。SQL 通过select语句过滤列。类似地,用where子句过滤行。这里我们使用trim函数从空格中删除条目,留下所有内容,只留下一个空字符串。我们使用trim的原因是针对这个例子的数据内容,但一般来说where是放置条件的地方。

使用read_sql时,数据会自动DataFrame过滤,所有行和列都会进行预过滤,如上所述。

很好,不是吗?

让我们继续前进…

加入,合并,收集,组合…

数据通常存储在多个表中。在这些情况下,拼接数据集成为分析之前的附加步骤。

这里的关系相当简单:在authorspapers之间有一个多对多关系,两个表通过第三个,即papers_authors链接。让我们来看看熊猫是如何处理案件的。为了便于讨论,让我们假设我们希望找到发表论文最多的“多产”作者。

df_authors \
    .merge(
        df_papers_authors.drop(columns=["id"]),
        left_on="id",
        right_on="author_id",
        how="inner") \
    .drop(columns=["id"]) \
    .merge(
        df_papers \
          .query("event_type in ('Oral', 'Spotlight', 'Poster')") \
          [["id", "year", "title", "abstract", "paper_text"]],
        left_on="paper_id",
        right_on="id",
        how="left") \
    .drop(columns=["id", "paper_id", "author_id"]) \
    .sort_values(by=["name", "year"], ascending=True)

…对于 Python 来说,这只是一行代码,但这里为了清楚起见,我们将其分成了几行。

我们从表authors开始,想要分配papers。Pandas 为“组合”数据提供了三个功能。

  • pd.concat -按行或列连接表格。类似于 SQL 的union
  • pd.join -就像 SQL 的join一样连接两个表,但是要求索引是实际的 DataFrame 索引。
  • pd.merge -相同,但更灵活:可以使用索引和列进行连接。

为了“得到”到papers,我们首先需要将连接到papers_authors表中。但是,两个表都有一个id列。为了避免冲突(或自动前缀),我们在加入之前删除了papers_authors.id列。然后,我们在authors.id == papers_authors.author_id上连接,之后我们也从结果表中删除id。进入papers_id,我们再次执行连接。这一次,是一位左派——加入为我们不想消灭的“无纸化”作者。我们也借此机会过滤前面描述的df_papers。然而,保持papers.id是必要的,否则熊猫会拒绝加入他们。最后,我们删除所有索引:id, paper_id, author_id,因为它们没有带来任何信息,并且为了方便起见对记录进行排序。

使用 SQL 进行组合

现在,使用 SQL 也有同样的效果。

query = """
    select
        a.name,
        p.year,
        p.title,
        p.abstract,
        p.paper_text
    from authors a
    inner join paper_authors pa on pa.author_id = a.id
    left join papers p on p.id = pa.paper_id
        and p.event_type not in ('Oral', 'Spotlight', 'Poster')
    order by name, year asc
"""
pd.read_sql(query, con=con)

这里,我们从线8.开始“向外”构建它,随后连接其他表,第二个表使用线11.修剪。剩下的只是使用a, p, pa作为别名进行排序和过滤。

效果是一样的,但是使用 SQL,我们避免了必须管理索引,这与分析无关。

数据清理

让我们来看看结果数据集。

图二。组合表的前五行。(图片由作者提供)

新创建的表包含缺失值和编码问题。这里,我们跳过修复编码,因为这个问题是特定于数据内容的。但是,缺少值是一个非常常见的问题。Pandas 提供了.fillna(...).dropna(...)等,根据约定,我们可以用不同的值填充 nan。

使用 SQL 进行数据清理

数据库也有自己的方式来处理这个问题。这里,fillnadropna的对应词分别是coalesceis not null

使用coalesce,我们的查询处理数据集,注入任何值以防丢失。

"""
select
    a.name,
    coalesce(p.year, 0) as year,
    coalesce(p.title, 'untitled') as title,
    coalesce(p.abstract, 'Abstract Missing') as abstract,
    coalesce(p.paper_text, '') as text,
from authors a
join paper_authors pa on pa.author_id = a.id
left join papers p on p.id = pa.paper_id
    and p.event_type not in ('Oral', 'Spotlight', 'Poster')
order by name, year asc
"""

聚集

我们的数据集是使用 SQL 准备、“修复”和获取的。现在,让我们假设我们想根据作者每年写的论文数量对他们进行排名。此外,我们还想计算每个作者每年“产出”的总字数。

同样,这是另一个标准的数据转换问题。让我们来看看熊猫是如何处理的。起点是关节和干净的桌子。

df["paper_length"] = df["paper_text"].str.count()df[["name", "year", "title", "paper_length"]] \
    .groupby(by=["name", "year"]) \
    .aggregate({"title": "count", "paper_length": "sum"}) \
    .reset_index() \
    .rename(columns={"title": "n_papers", "paper_length": "n_words"}) \
    .query("n_words > 0") \
    .sort_values(by=["n_papers"], ascending=False)

我们通过计算空格来计算文章的长度。虽然认为论文中的每个单词都被一个空格分隔是幼稚的,但它确实给了我们一些估计。第1.行通过.str属性实现,同时引入一个新列。

稍后,我们通过应用一系列操作来形成一个新表:

  1. 我们将表缩小到感兴趣的列。
  2. 我们使用nameyear列聚合该表。
  3. 当我们对剩下的两列应用不同的聚合函数时,我们使用接受带有指令的字典的.aggregate方法。
  4. 这种聚集导致了双重索引。行6.nameyear恢复到列。
  5. 其余列的名称保持不变,但不再反映数字的含义。我们在第7.行进行了修改。
  6. 对于以前缺失的值,可以安全地假设它们的字数等于零。为了建立排名,我们使用.query来消除它们。
  7. 最后,为了方便起见,我们对表格进行了排序。

总表如图 3 所示。

图 3。排名是一个汇总表格。(图片由作者提供)

使用 SQL 进行聚合

现在,让我们再一次使用 SQL 实现相同的结果。

"""
select
    d.name,
    d.year,
    count(title) as n_papers,
    sum(paper_length) as n_words
from (
    select
        a.name,
        coalesce(p.year, 0) as year,
        coalesce(p.title, 'untitled') as title,
        length(coalesce(p.paper_text, ''))
            - length(replace(coalesce(p.paper_text, ''), ' ', '')
            as paper_length
    from authors a
    join papers_authors pa on pa.author_id = a.id
    left join papers p on p.id = pa.paper_id
        and p.event_type not in ('Oral', 'Spotlight', 'Poster')
    ) as d
    group by name, year
    having n_words > 0
    order by n_papers desc
"""

这个查询可能看起来比 Pandas 代码更麻烦,但事实并非如此。我们将所有的工作和聚合结合在一个步骤中。多亏了子查询和函数,在我们的特定示例中,我们甚至可以在开始分析之前得到结果。

该查询包含一个子查询(第8.-18.行),除了删除abstract和引入paper_length列之外,几乎所有内容都保持不变。SQLite 没有与str.count()等价的词,所以我们使用lengthreplace来计算空格和所有其他单词之间的差异。稍后,在第19.行,我们将d指定为引用子查询表的别名。

接下来,结合了countsumgroupby语句是我们使用 Pandas 的.aggregate方法所做的。这里,我们也使用having应用第21.行的条件。having语句的工作方式与where相似,只是它在聚合的“内部”操作,而where则应用于一个表,该表是为了删除它的一些记录而制定的。

同样,结果表是完全相同的。

结论

熊猫和 SQL 可能看起来很像,但本质是很不一样的。Python 是一种面向对象的语言,Pandas 将数据存储为类似表格的对象。此外,它提供了多种方法来以任何可能的方式转换它们,这使它成为一个优秀的数据分析工具。

另一方面,Pandas 制定数据集的方法只是 SQL 的另一个“化身”。SQL 是一种声明性语言,自然适合于获取、转换和准备数据集。如果数据驻留在关系数据库中,让数据库引擎执行这些步骤是更好的选择。这些引擎不仅针对这一点进行了优化,而且让数据库准备一个干净方便的数据集有助于分析过程。

SQL 的缺点是,在创建数据集之前,可能很难阅读和确定要丢弃的数据和要保留的数据。运行在 Python 上的 Pandas 允许我们将数据集的一部分分配给变量,检查它们,然后做出进一步的决定。

尽管如此,这些临时变量经常会使工作空间变得拥挤不堪…因此,除非您有疑问,否则有充分的理由使用 SQL。

你如何分析你的数据?;)

还会有更多…

我计划把文章提升到一个新的水平,并提供简短的视频教程。

如果您想了解关于视频和未来文章的更新,订阅我的 简讯 。你也可以通过填写表格让我知道你的期望。回头见!

为什么使用虚拟分类器是明智之举

原文:https://towardsdatascience.com/why-using-a-dummy-classifier-is-a-smart-move-4a55080e3549?source=collection_archive---------11-----------------------

建立基线,将您的模型性能与虚拟模型进行比较

Y 你早上醒来,点燃你最喜欢的香味蜡烛,煮些咖啡和早餐,打开 Spotify 听些果酱,开始新的一天。在享受早晨的例行公事时,你突然有了一个想法:如果有一种方法可以在一首流行歌曲真正流行起来之前准确预测它,会怎么样?

拍摄的罗兰·德内斯Unsplash

因此,像任何其他数据科学家一样,你打开笔记本电脑,从 Spotify 找到一些数据,在预处理数据后,建立一个随机森林模型。你很快扫了一眼你的初始模型的准确度分数,并不期望它很高——因为,让我们面对它,你什么时候第一次就有过一个伟大的模型——但是,那是什么?

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score#building Random Forest model
clf_rf = RandomForestClassifier(random_state=42)
clf_rf.fit(X_train, y_train)#making predictions and printing accuracy score
y_pred = clf_rf.predict(X_test)
print(accuracy_score(y_test, y_pred)) #0.9371

哇,准确率高达 93.7%!牛逼!嗯…也许不是。当我们查看该模型的混淆矩阵(更多信息见下文)时,我们看到了我们最初期望看到的情况:我们的模型的预测能力没有那么强。该模型只在 56%的情况下正确预测了一首流行歌曲,但它正确识别了 99%的不受欢迎的歌曲。这就是为什么我们的准确性分数是倾斜的!

让我们倒回去一分钟……

混淆矩阵是什么?它的目的是什么?还有,我们怎么知道 56%的人气预测对我们掌握的数据不好?

输入虚拟分类器(dun dunnnn…)

为了能够真正理解并改进我们模型的性能,我们首先需要为我们拥有的数据建立一个基线。毕竟,如果我们不知道我们的模型相对于基线表现如何,我们如何改进它呢?

“如果你不能衡量它,你就不能改进它”——开尔文爵士

这就是为什么建立一个基线模型,我们可以比较我们的模型的性能是如此重要,这就是虚拟分类器发挥作用的地方。

什么是虚拟分类器?

伪分类器就像它听起来的那样!它是一个分类器模型,无需尝试在数据中寻找模式即可做出预测。默认模型本质上是查看哪个标签在训练数据集中出现频率最高,并基于该标签进行预测。但是,在我们继续构建虚拟分类器之前,我们需要知道如何将手头的模型与虚拟分类器进行比较。

那么,我如何比较我的模型和虚拟分类器呢?

我们可以查看许多指标和图像来比较我们的模型与基线模型的性能。其中一个指标是准确性得分,这是我们之前兴奋不已的 93.7%。

精度= TP+TN / (TP+FP+TN+FN)

其他指标包括精确度、召回率和 f1 分数:

精度= TP/(TP+FP)

回忆= TP/(TP+FN)

F1 = 2(召回率精度)/(召回率+精度)

一般来说,您使用哪个分数取决于您试图回答的问题和您正在处理的数据类型。在这个预测歌曲流行度的例子中,我们主要关心正确识别流行歌曲,因此回忆分数变得更加重要。有关指标的更多信息,请参考此文章。所有这些指标及其组合平均值可从 sklearn 的分类报告中获得:

from sklearn.metrics import classification_report

等等,你提到了视觉效果,但我看到的都是分数。你说的是混淆矩阵吗?

是的。你可以使用的最容易理解的视觉效果之一(我推荐你使用)是混淆矩阵。

图片由 memegenerator.net 提供

混淆矩阵显示矩阵上模型预测的真阳性(TPs)、假阳性(FPs)、真阴性(TNs)和假阴性(FNs)的原始计数或百分比(您可以根据自己的喜好更改下面的 normalize 参数)。你可以使用 scikit-learn 的 plot_confusion_matrix 来创建这个视觉效果。这是我们初始模型的混淆矩阵:

正如我上面提到的,在这里我们可以看到,模型在 99%的时间里正确预测了不受欢迎的歌曲(TNs,左上象限),但对流行歌曲(TPs,右下象限)的预测为 56%。

现在我们知道了如何通过使用不同的度量和混淆矩阵来比较我们的模型和虚拟分类器,让我们构建一个虚拟分类器。

from sklearn.dummy import DummyClassifier
from sklearn.metrics import plot_confusion_matrixclf_dummy = DummyClassifier(random_state=42) 
#establishing random_state for reproducibilityclf_dummy.fit(X_train, y_train)
y_pred = clf_dummy.predict(X_test)
plot_confusion_matrix(estimator=clf_dummy, X=X_test, y_true=y_test,
                      normalize=’true’, cmap=’Blues’)

好吧,我们的虚拟分类器似乎把我们的大部分数据归类为不受欢迎的。让我们看一下我们的数据的 value_counts,看看我们是否能找出为什么会出现这种情况。

y_train.value_counts(normalize=True)#0 0.885503
#1 0.114497
#Name: is_popular, dtype: float64

啊哈!在我们的数据集中,冷门歌曲比流行歌曲多得多,所以虚拟分类器预测冷门歌曲比流行歌曲多。

这解释了为什么我们的随机森林分类器在正确识别不受欢迎的歌曲方面如此出色,但在识别流行歌曲方面却不太成功,而这正是我们最终要做的。

那么,我们能做些什么来解决这个问题呢?

Elena Mozhvilo 在 Unsplash 上的照片

出击救援!这个问题被称为“类不平衡问题”,解决这个问题的一种方法是使用 SMOTE 进行过采样。本质上,我们使用 SMOTE 创建与实际数据相似的合成样本来均衡我们的类。但是,因为我们的数据集中有分类列,所以使用 SMOTENC 会产生更好的结果。

from imblearn.over_sampling import SMOTE, SMOTENCsm = SMOTENC(categorical_features=cat_cols, random_state=42)
X_train_sm, y_train_sm = sm.fit_resample(X_train, y_train)
y_train_sm.value_counts(normalize=True)#1 0.5
#0 0.5
#Name: is_popular, dtype: float64

阶级失衡根除了,现在怎么办?

完美!既然我们已经解决了类不平衡问题,让我们更新我们的虚拟分类器和随机森林分类器。更新虚拟分类器是必要的,因为我们使用它作为基线;它需要基于与我们所有其他模型相同的精确数据。

#updating Dummy Classifier with SMOTE’d data
clf_dummy_sm = DummyClassifier(random_state=42)
clf_dummy_sm.fit(X_train_sm, y_train_sm)
y_pred = clf_dummy_sm.predict(X_test)#fitting RF Classifier to SMOTE’d data
clf_rf = RandomForestClassifier(random_state=42)
clf_rf.fit(X_train_sm, y_train_sm)
y_pred = clf_rf.predict(X_test)

现在,由于虚拟分类器,我们可以真正解释我们的模型的性能。这是并排的新混淆矩阵(左:虚拟分类器,右:随机森林)。

类别不平衡后虚拟分类器(左)和随机森林(右)的混淆矩阵用 SMOTENC 解决。

我们可以看到,与虚拟分类器相比,随机森林模型在预测不受欢迎的歌曲方面表现出 48%的优势,在预测流行歌曲方面表现出 8%的优势。似乎我们的随机森林模型过度拟合了(哈!有什么新鲜事?).

但是,嘿,回去享受你的早晨吧;您可以调整您的随机森林模型,并在以后尝试一些其他模型!

如果你想查看我在这里作为例子使用的歌曲人气预测项目,你可以在GitHub上查看。

为什么要用 Docker 容器进行机器学习?

原文:https://towardsdatascience.com/why-using-docker-for-machine-learning-74c927ceb6c4?source=collection_archive---------6-----------------------

解决“Tt 在我的机器上工作”的问题

Annamária Borsos 摄影

首先:微服务

在谈论容器化之前,首先要理解微服务的概念。如果一个大的应用程序被分解成更小的服务,那么这些服务或小进程中的每一个都可以被称为微服务,它们通过网络相互通信。微服务方法与难以扩展的整体方法相反。如果一个特定的特性出现了一些问题或崩溃,所有其他的特性也会遇到同样的问题。另一个例子是,当对特定功能的需求严重增加时,我们被迫增加资源,例如不仅用于该特定功能而且用于整个应用程序的硬件,从而产生不必要的额外成本。如果采用微服务方法,将应用程序分解成一组更小的服务,那么这个成本可以降到最低。应用程序的每项服务或功能都是以某种方式隔离的,我们可以在不影响其他应用程序功能的情况下进行扩展或更新。为了将机器学习投入生产,让我们考虑应用程序需要分解为更小的微服务,如摄取、准备、组合、分离、训练、评估、推理、后处理和监控。

集装箱化

微服务架构也有它的缺点。当您在一台服务器上开发您的机器学习应用程序时,您将需要与包含依赖关系的微服务相同数量的虚拟机(VM)。每个虚拟机将需要一个操作系统、库和二进制文件,并消耗更多的硬件资源,如处理器、内存和磁盘空间,即使微服务没有真正运行。这就是码头工人进来的原因。如果一个容器没有运行,剩余的资源将成为共享资源,可供其他容器访问。您不需要在容器中添加操作系统。让我们考虑一个由应用程序 1 和应用程序 2(分别为。APP 1 和 APP 2)。如果您想要横向扩展 APP 1 或添加其他应用程序,如下面的方案所示,您可能会受到可用资源的限制,只能使用虚拟机而不是容器。如果你决定向外扩展,只有 APP1 而不是 APP 2(只保留一个),APP 2 将成为所有容器进程的共享。

虚拟机与容器化(作者图片)

Docker 和机器学习:解决“它在我的机器上工作。”

创建一个在我们的计算机上工作的机器学习模型并不复杂。但是,当您与想要大规模使用该模型的客户合作时,这种模型可以在全球所有类型的服务器上扩展和运行,这就更具挑战性了。开发完模型后,它可能在您的笔记本电脑或服务器上运行得很好,但在其他系统上就不太好了,比如当您将模型转移到生产阶段或其他服务器时。许多事情都可能发生,如性能问题、应用程序崩溃或没有得到很好的优化。另一个具有挑战性的情况是,我们的机器学习模型当然可以用 python 等单一编程语言编写,但应用程序肯定需要与用其他编程语言编写的其他应用程序进行交互,以进行数据摄取、数据准备、前端等。Docker 允许更好地管理所有这些交互,因为每个微服务可以用不同的语言编写,允许可伸缩性和独立服务的轻松添加或删除。Docker 带来了可复制性、可移植性、易部署性、粒度更新性、轻便性和简单性。

当一个模型准备好了,数据科学家的焦虑是这个模型不能再现真实生活的结果,或者当工作与队友分享时。有时,这不是因为模型,而是因为需要复制整个堆栈。Docker 允许在任何地方轻松复制用于训练和运行机器学习模型的工作环境。Docker 允许将代码和依赖项打包到容器中,这些容器可以移植到不同的服务器上,即使是不同的硬件或操作系统。训练模型可以在本地机器上开发,并且可以通过额外的资源(如 GPU、更多内存或强大的 CPU)轻松移植到外部集群。通过将模型封装到容器中的 API 中,并使用 OpenShift(一个 Kubernetes 发行版)之类的技术部署容器,可以很容易地将模型部署到全球。这种简单性也是支持机器学习应用容器化的一个很好的论据,因为我们可以使用模板自动创建容器,并访问包含现有用户贡献容器的开源注册表。Docker 允许开发人员跟踪容器映像的不同版本,检查谁用什么构建了一个版本,并回滚到以前的版本。最后,另一个论点是,即使它的一个服务正在更新、修复或关闭,你的机器学习应用程序也可以继续运行。例如,如果您需要更新嵌入在整个解决方案中的输出消息,就没有必要更新整个应用程序并干扰其他服务。

来源

https://www.ibm.com/cloud/learn/docker

为什么数据工程在数据科学之前不流行?

原文:https://towardsdatascience.com/why-wasnt-data-engineering-popular-before-data-science-f4b7ba5ab67a?source=collection_archive---------8-----------------------

推动数据工程成为焦点的力量分析

当我在研究数据科学的前景时,我发现了一个有趣的发现:数据工程现在比数据科学发展得更快,这可能会造成数据工程师的大量短缺。这让我开始思考。这对整个 data domain 意味着什么?这是好事吗?为什么现在发生了?

大卫·拉古萨Unsplash 上拍摄

在很大程度上,数据工程是数据科学的上游。数据工程师构建数据仓库和数据管道的工作使数据分析师、数据科学家和机器学习工程师能够构建模型并从数据中获得洞察力。为什么这个应该先于数据科学的领域在数据科学越来越受欢迎之后变得越来越受欢迎?

在这篇文章中,我提供了我对这些问题的看法,并给出了我对在可预见的未来你应该成为数据工程师还是数据科学家的想法。如果你认为数据工程是适合你的职业,我也给你一些数据工程资源(来自真正的专家)。

如果您喜欢视频格式,请在此观看:

问题

不管是好是坏,世界并不总是线性运转的。数据科学变得很性感,因为许多顶尖的科技公司都在用它赚钱。非科技公司看到了数据科学和机器学习提供的价值,他们很快跟进。

不幸的是,对于许多追随这一趋势的公司来说,他们没有数据基础设施来恰当地利用数据科学家。他们招聘的许多数据科学职位最终都涉及到数据工程工作,而他们并不一定是这方面的专家。我个人认为这个错误给这些公司造成了数百万甚至数十亿美元的损失。这也导致了市场上关于数据科学家做什么的许多困惑(这是另一篇文章的主题)。

顶级科技公司在描述他们的机器学习模型的成功时忽略了一点,他们已经建立了支持数据科学的基础设施。多年来,他们的员工中一直有数据工程师或类似的角色,有时甚至从公司成立之初就有,以确保数据可以被复杂的工具利用。

这并不是说顶级科技公司只是在更早的时候雇佣了这些角色,他们也是在考虑数据和可扩展性的情况下建立业务的。他们花了大量时间预先考虑如何存储他们的数据,并使其长期对他们有用。这是许多大型科技公司普遍存在的一个主题。他们建立系统在他们特定的商业环境中为他们工作。

例如,脸书、谷歌、微软和相当多的其他巨头都有自己的内部使用的机器学习工具套件。你认为他们没有独特的方法来管理他们收集的大量数据吗?对于这些技术公司中的大多数来说,如果他们不能一致地监控他们的数据,他们的业务根本就不会运转。

校正

这些大型科技企业很早就雇佣了数据工程师,但他们那些不太懂技术的同行呢?

我认为,数据工程的受欢迎程度大幅上升,是因为这些不太注重技术的公司意识到他们犯了一个巨大的错误。在雇用所有这些数据科学家之前,他们需要雇人来修复他们的数据。与尖端科技公司和初创公司不同,大多数其他公司都没有明确设计成规模化。他们需要大量的帮助来升级他们的数据基础设施,使其可用于分析、机器学习,并最终用于人工智能。

可以想象,这不是一个小任务。数据工程的繁荣是对公司在意识到他们还没有准备好之前就直接加入数据科学潮流的一种纠正(如果你对你的公司是否准备好数据科学感兴趣,你可以看看我的视频,数据科学采用的 5 个阶段)。

这是什么意思?

那么,我对此的看法是积极的、消极的还是矛盾的呢?

我个人认为这对数据科学和 AI 的未来非常好。拥有更好数据的公司可以构建清晰的基础设施,专注于构建有用的模型,而不是临时任务。在我看来,这可能是真正的数据科学或人工智能革命的跳板。

这也有助于进一步明确该领域的角色。数据科学家是该领域许多角色的统称。更清晰地区分他们的工作和数据工程师的工作,为公司和求职者消除了模糊性。

最重要的是,这向我表明,在可预见的未来,数据科学将变得更加流行。同样,如果公司在数据科学家的上游管道上投入如此巨大,当他们最终将现有的数据基础设施置于一个好位置时,对数据科学家、机器学习工程师和人工智能研究人员的需求会有多大?

为什么是现在?

需要说明的是,对于许多公司来说,数据工程师并不是一个全新的角色。他们被称为数据架构师、ETL 开发人员、数据库开发人员,甚至 SQL 开发人员。那么,为什么现在会特别流行呢?

老实说,这些都只是猜测,但我认为有几个因素相当重要:

  1. 数据科学已经腾飞了这么多。许多公司已经有足够的时间来组建完整的数据科学团队。公司也有足够的时间意识到,这些团队没有创造出预期的价值,因为他们缺乏高质量的数据。
  2. 雪花和其他几家大公司已经公开了重点明确的数据项目。其他公司正在意识到市场对数据相关项目的重视程度。
  3. 很难不自私地对待最后一个问题,但我认为数据社区正在强调高质量数据的重要性。我在 LinkedIn 上看到过很棒的谈论这个的帖子,我看到过信息化的视频和文章(比如这篇叫做,为什么数据工程现在很流行?,还有这个类似主题的 Reddit 帖子,我也有不少伟大的嘉宾在我的播客上讨论这些事情。我认为,疫情鼓励人们在 LinkedIn 这样的平台上发表更多意见,这真的有助于传播关于数据质量的观点。

你应该成为一名数据工程师吗?

既然我在这篇文章中谈论了这么多数据工程的价值,那么一个问题可能会自然而然地出现,你应该成为一名数据工程师吗?你甚至应该考虑这一点,而不是作为一名数据科学家吗?

老实说,这真的取决于你的兴趣和能力。首先,您应该探索 data domain 中不同角色之间的差异。我的视频(由一位数据科学家讲解的)不同的数据科学角色,应该会给你一些这方面的额外信息。

毫无疑问,我认为对大多数人来说,现在获得一个数据工程的职位比获得一个数据科学的职位更容易。如果你觉得你会喜欢它,那么尽一切办法去做吧。从我的角度来看,大多数数据工程角色比其他数据角色有更多的结构和更清晰的期望。数据工程仍然有许多分析成分,但是,顾名思义,与软件工程相比,数据分析和数据科学确实有更多的相似之处。

尽管如此,从数据工程师到数据科学家肯定是可行的,特别是如果你发现你更喜欢模型构建和探索活动。这是我的朋友 Sundas Khalid 在她的旅程中做的一个视频,名为为什么我离开数据工程进入数据科学

我不是数据工程师,所以对我的想法有所保留。对于那些有兴趣了解这个职业的人,这里有一个来自西雅图数据工程师的视频,关于如何进入数据工程,名为数据工程路线图——如何快速学习数据工程(由 FAANG 数据工程师制作)

我希望这篇文章能帮助您更好地理解数据环境,尤其是当它与数据工程相关时。如果您喜欢这篇文章,记得在 Medium 上关注我以获取更多类似的内容,并且注册我的简讯以获得我的内容创作和数据科学行业其他学习资源的每周更新!

下次再见,祝您的数据科学之旅好运!

为什么我们永远发展不了 AGI

原文:https://towardsdatascience.com/why-we-may-never-develop-strong-ai-e49c805480f?source=collection_archive---------20-----------------------

以及为什么我们仍然会

约书亚·索蒂诺在 Unsplash 上拍摄的照片

如果你还没有听说人类对实现强大人工智能(或最近被称为 AGI)的巨大追求,你一定是生活在岩石下。每天,我们都被宣布人工智能研究取得最新突破的新闻轰炸,我们被告知超级智能机器的时代即将到来。像 DeepMind 和 OpenAI 这样的公司正在努力使这一追求成为现实,像 Elon Musk 或 Max Tegmark 这样的人担心人工智能会使人类灭绝(幸运的是,到那时我们可能会逃到火星)。

有些人甚至不同意强人工智能在理论上的可实现性。有些人甚至说,人类和我们能制造的任何机器之间有一个根本的区别,无论我们如何努力,总会有一些领域人类会更胜一筹。

在这篇文章中,我将提出这些人用来破坏 AGI 发展的五个主要论点,并对这些论点提出反驳。

由于哥德尔的不完全性定理,人工智能可能从根本上受到限制

我们的第一个论点是一个老论点:事实上,它最早是在 1961 年由已故哲学家 J. R .卢卡斯提出的。潜在地,它甚至比那更古老,可能起源于杰出的奥地利数学家库尔特·哥德尔。

这一论点最重要的部分是哥德尔的不完全性定理,这就是为什么我将尝试解释它们。原则上,通过公理化数学思维,哥德尔表明,在任何足够强大的形式(公理化)算术系统 F 中,F 中有不能在 F 中被证明或被证伪的陈述,即该系统是不完整的。这意味着给定数论和命题逻辑(形式系统 F)的任何公理,都不可能构造一台输出 F 的所有定理的计算机。哥德尔展示这一点的方式基本上是首先假定一个算术形式系统,然后在这个形式系统中构造一个特殊的句子(恰当地称为哥德尔句子 G )来表达 F 中的这个陈述:

哥德尔句 G:“我不是 f 的定理”

这是一个自我指称的陈述,感觉有些自相矛盾:这个句子暗示了它自己的非定理性。它显然不可能是 F 的一个定理,因为如果它是,它将导致一个矛盾。不幸的是,如果它不是一个定理,那么 F 就是不完全的,因为完全性要求对于 F 的所有陈述,要么陈述本身要么它的否定是一个定理。如果 G 不是 F 的一个定理,那么它表达了一个不能用 F 证明的真陈述。

不完备性定理也是以下述方式循环的:我们可能把 G 作为附加公理加到 F 上,试图“塞住漏洞”,使系统完备。不幸的是,由于与之前完全相同的论证,这一点失败了:我们再次构造了另一个哥德尔句子 G’:

哥德尔句 G ':“我不是 F+G 的定理。”

即使我们能够在一个单一的句法表达式中捕获所有这些哥德尔句子,比如说来自一类表达式 Gω的任何 G,我们仍然能够构造另一个哥德尔句子 Gω+1 等等。等等。可以想象,序数中的下一个将是 2Gω,然后是 Gω ** 2 等等。因此,无论我们如何努力,这个系统将永远是不完整的。而且,没有算法可以进行这种“哥德化”。

这样一来,我们现在可以提出卢卡斯论点了。大致是这样的:

既然 AGI 必须能够完成人类能完成的任何智力任务,它也必须能像我们一样完成哥德尔魔术。然而,如果一台机器是纯计算性的,它必须在某种正式的系统中运行,因此它不能检测自己的不完整性。另一方面,我们人类可以“在系统之外”思考,并像哥德尔一样认识到它的缺陷。所以,头脑简直比任何机器都强大,无论多快多强。

虽然这一论点主要适用于昨天的人工智能系统,这些系统基于一阶逻辑,大致像定理证明器一样工作,但它也可以同样适用于当前的神经网络式人工智能,因为它必须嵌入到某种图灵机中,因此必须像任何计算系统一样受到限制。

另一方面,我认为同样的论点也适用于人类!虽然乍一看我们似乎能够逃脱哥德式的陷阱,但我强烈怀疑我们能否无限期地这样做。毕竟,即使是序数命名系统在有限的步骤之后也会崩溃。如上所述,我们有ω,2ω,ω2,ωω,ωωω,…,但在某些时候,我们没有进一步的命名方案,我们遇到了问题。没有一个单一的方案来命名所有的序数。

没有递归相关的符号系统给每一个建设性的序数命名。

-阿隆佐·邱奇&斯蒂芬·克莱尼

作为一个更实际的说明,我认为我们每天都无法走出我们的“正式系统”,例如我们思考出生和死亡的方式。既然我们被困在这个空间和这个时间,我们就不可能想象自己已经死了。直觉上,我们可能意识到宇宙即使在我们死后也会存在,但我们很难想象。

我们更难想象没有任何空间或时间。在这种情况下,我们的直觉完全失灵了。也许这就是为什么我们不能到达物质现实的底部的原因。既然我们根植于其中,我们就没有办法从外部感知它。然而,这并没有对 AGI 的发展构成重大威胁,因为如果 AGI 有和我们一样的基础(物理现实),它最终会受到同样机制的限制。因此,如果没有其他证据表明我们的思想具有超凡脱俗的力量,我想我们可以放心地驳回这个论点。

人类意识不是算法

https://www.amazon.com/Emperors-New-Mind-Concerning-Computers/dp/0192861980

这个论点基本上是前一个论点的延续,扩展到适应我们最近的发现,并通过关于我们意识机制和假设物理学的假设得到加强。它最初是由最近的诺贝尔奖获得者罗杰·彭罗斯表达的。在他的书《皇帝的新思想》中,他认为人类意识不能被任何图灵机建模,因此也不能被今天已知的任何计算机建模,因为它从根本上是基于量子力学,更具体地说是量子引力。假设是真核细胞中被称为微管的微小结构小到足以展示量子行为,因此它们可能是大脑推理能力的来源。例如,微管可以处于不同状态的量子叠加状态,它们甚至可以与其他微管纠缠在一起,可能将量子状态传播到整个人脑。这并不意味着大脑是一台量子计算机。实际上,彭罗斯声称大脑不仅仅是量子计算机。为什么?因为即使量子计算机能够在多项式时间内解决 NP 完全问题(顺便说一句,该假设似乎是错误的,尽管它尚未被证明),它也永远无法解决无法计算的问题,而这正是彭罗斯声称大脑能够做到的。

术语“不可计算的函数”源自 Alan Turing,他将哥德尔的数学理论应用于计算,并提出了著名的停止问题。停机问题询问给定的计算机程序在给定特定输入的情况下是否最终会停止或无限期运行。图灵已经表明,一般来说,没有算法可以解决这个问题或任何可简化为停机问题的问题。这个论点是循环的,就像哥德尔的论点一样:即使你有一个解决停机问题的神谕(一个可以免费为你解决问题的神奇机器),总会有另一个与你的有神谕的新机器有关的停机问题。

因此,彭罗斯的论点甚至比乍看起来更有力:由于不可计算性的循环性质,根据该理论,大脑不仅优于任何图灵机,而且优于任何图灵机和任何可能存在的神谕。

所有这一切都意味着,我们永远不能指望建立一个像人类思维一样有能力的人工智能,因为我们知道的机器只能通过算法解决问题。

老实说,作为一个人,知道我们有办法克服甚至无法计算的问题,因此我们的思维在某种程度上是在系统之外的,这种感觉会很好。然而不幸的是,我认为不可计算性的论点适用于人类,就像卢卡斯的论点一样:在某个时刻,我们的理解会崩溃。对于我们这些凡人来说,这一点可能来得更早,对于彭罗斯或哥德尔这样的天才来说,这一点可能来得更晚,但它不可避免地会出现。

让我也提一下微管的理论有一个固有的缺陷:物理学家 Max Tegmark 指出微管太大了,以至于不能展示量子力学效应:它们在仅仅 10e-13s 后就会发生退相干(量子信息的丢失)。虽然这些时间后来被其他人修正为 10 到 100 微秒,但仍然太快了。当然,这并没有完全排除彭罗斯的理论:大脑中可能还有其他更小的结构能够进行量子计算。

对彭罗斯理论的另一个批评是争论性的:使用物理学、神经科学或生物学尚不知道的效应有点太模糊,无助于证伪主张。这些主张似乎是人为构建的,因此目前我们无法指望用经验来证明或反驳它们。从科学的角度来看,不可证伪的理论是无用的。

人工智能必须在世界上行动,以获得人类拥有的知识和思维

一个流行的理论认为,我们人类由于所处的特定环境而进化出了高级思维能力。根据哲学家 Hubert Dreyfus 的说法,没有身体的计算机根本无法获得智能,因为人类的大部分知识都是隐性的。它不能通过读书来学习,而必须通过模仿擅长某项技能的老师来获得。对德雷福斯来说,遵循规则(无论是编程的还是学习的)是最低级的能力。最高层次,专家表现,是隐性知识,即使是经常练习的专家也不能轻易解释。例如,你当然知道如何走路。然而,如果你试图向某人解释你是如何做的,那将是非常困难的。

与此相关的另一个问题是,因为计算机没有身体,也不与世界互动,它们不理解因果关系,也没有简单的方法让它们获得因果关系。处理反事实和回答因果问题是我们人类拥有一般智能的先决条件。

对我来说,这个论点似乎有一定的正确性,因为与世界互动是我们人类学习的主要方式之一。另一方面,我不确定这样说是否公平,因为我们不能解释我们获得的隐性知识,它不能被计算机学习。在我看来,这更多的是关于有意识和无意识知识的争论。虽然有意识的知识位于层次的“顶端”并使我们感知它,但无意识的知识是自动的,不能被体验。因此,我们也很难解释它。

举个例子,再考虑一下步行。当你小的时候,你试着走路,那是非常困难的。你必须有意识地思考你脚的每一个小动作。然而,随着你的技能增加,你慢慢忘记了个别的小动作,因为知识慢慢变得无意识。这是一件好事,因为有意识的感知能力肯定非常有限。同样的过程也可能发生在 AGI。首先,AGI 将获得技能,它将不得不“思考”每一小步。随后,这种技能将被添加到“无意识记忆”中,或者被硬编码到子神经网络中,调整这种硬编码程序的能力将变得更加有限,而执行能力将会提高。

关于因果关系,人们普遍承认它是人工智能所必需的(例如,见https://spectrum . IEEE . org/tech-talk/artificial-intelligence/machine-learning/understanding-causality-is-the next-challenge-for-machine-learning),并且有人试图将其纳入当前的模型中(https://syncedreview . com/2020/10/29/deep mind-introduces-algorithms-for-causage-reason-in-probability-trees/)。

人工智能可能永远不会达到自我提高的程度

最近,AGI 的大部分讨论都围绕着一个观点,即奇点类型的事件导致自我发展的人工智能系统在没有任何进一步人类干预的情况下以失控的方式发展,导致它在几天甚至几小时内变得超级智能,达到人类水平的智能。这个理论是基于指数增长的概念:一旦有一个人工智能具有人类水平的智能,并且这个人工智能可以稍微改进自己,进化的人工智能将再次稍微改进自己,以此类推,直到我们拥有远远优于任何人类的超级智能。在某种程度上,自我完善的人工智能假说模拟了我们自己的生物进化,只是在更小的时间范围内。因为与我们不同,人工智能应该也有能力改进它的硬件(我们还不能通过技术显著地改进我们的大脑),这个过程将更加强大。

然而,这个故事的问题是,我们实际上并没有成功构建任何自我改进的人工智能。今天的机器学习算法能够在一定程度上修改自己,例如一次性学习算法,但它远没有达到人类发展的水平。遗传算法可能能够通过类似于生物生命的机制进行自我改进,但它们通常需要人类进行大量的微调才能正确工作。另一方面,自我改进的人工智能最初只需要新生儿的智力,并可以从那时起发展到任何需要的智力水平。

然而,已经有了一种理论上的方法来开发自我完善的人工智能。它被称为哥德尔机器(哥德尔又来了),由于尔根·施密德胡伯发明。哥德尔机器是一个假设的计算机程序,每当它为当前任务找到一个更好的策略时,它就使用一个递归策略来自我改进。机器具有定义的输入和输出,并试图最大化效用函数,这可能取决于机器的状态和输入(环境)。这台机器被证明是最优的,尽管它受到限制,即它需要设定非常具体的目标,不像人类那样,在生活中似乎没有任何大的预定义目标。

我们可能永远不会承认人工智能是智能的

最后但同样重要的是,我向你们提出一个论点,不是反对发展 AGI 的可能性,而是反对我们认识这一伟大壮举的能力。

这场争论与人工智能定义的模糊性密切相关。因为我们并不真正知道我们在寻找什么,所以可能我们永远无法实现它,或者更糟糕的是,我们永远无法意识到我们已经实现了。

如果我们能精确地定义智力,我们也许能发现更多关于我们自己的智力,我们不仅能量化其他生物的智力,也能量化无生命物体的智力。那样的话,在某个确定的时刻,我们可以说我们已经构建了一个和我们的智能大致相当的人工智能。现在,我们正在来回讨论智力的本质,我们还没有真正得出一个明确的答案。

由于定义如此不精确,我们会遇到“移动门柱”的危险。让我引用一篇来自 MindHacks 的关于马文·明斯基的批评文章:

[马文·明斯基]对人工智能认知中的“移动门柱”问题做了一个简单的评论,这掩盖了人们如何看待人工智能的大部分问题。

就人工智能的历史发展而言,我当然觉得这是一个有效的论点。让我给你举几个例子,人们期望从人工智能中得到的东西,最终都被开发出来了,但是从来没有让社区满意过:

“机器永远不会下棋。”(IBM 深蓝在 1997 年击败了加里·卡斯帕罗夫)。

"机器可以下棋,但它完全是机械的."(DeepMind AlphaZero 不仅击败了人类棋手,还击败了使用直观方法下棋的最佳国际象棋引擎)。

“机器永远不会翻译。”(Google Translate 支持 109 种语言,可以在它们之间进行高准确率的翻译)。

"机器永远也不可能驱动汽车。"(尽管就全自动驾驶汽车而言,我们仍未达到这一水平,但人工智能可以说在通常的道路场景中比人类驾驶得更好)。

当然,仍然有一些领域人类比机器更好,但它们越来越少了。我们人类似乎还剩下两个主要优势:

  1. 我们可以同时完成所有这些任务。人工智能可以完成一些特定的任务,但它还不能适应一个全新的任务。
  2. 我们知道自己在做什么。可以说,就智力而言,这算不上什么优势,但它赋予了我们机器还不具备的品质,比如移情和情感。

我想说,如果第一个问题解决了,我们可以确信我们已经实现了 AGI,因为一个能够适应新任务并有效解决它们的智能机器不一定也需要完成第二个问题。此外,我觉得第二点(意识)是一个更难解决的问题,甚至在我们开发出 AGI 后的一段时间内也可能无法解决。

结论

最终,我认为我们将能够开发出强大的人工智能,尽管这可能不是在我们有生之年。此外,我们甚至可能不知道我们实现了这一非凡的壮举,要么是因为人工智能的本质与我们太不一样,要么是因为人工智能可能真的太聪明了,以至于我们不知道。据我们所知,这可能已经发生了…

无论如何,即使我们对实现 AGI 没有那么大的把握,我们仍然应该花一些精力研究和评估这种可能性会带来的风险,并思考我们如何处理任何潜在的负面后果。它可能会拯救我们的文明。

为什么我们可能以错误的方式看待大脑

原文:https://towardsdatascience.com/why-we-might-be-looking-at-the-brain-in-the-wrong-way-7c17fb11c259?source=collection_archive---------14-----------------------

…对人工智能有重要影响

大脑试图从概念的角度来理解世界,其中大部分是用语言,在某些情况下是用数学来表达的。

但我们对世界的概念理解遭遇了一个先有鸡还是先有蛋的问题:这种理解所依据的概念首先来自哪里?你如何用旧的术语建立一个新的理论,并确保它不会受到术语中固有的隐含假设的影响?

洛克、休谟和贝克莱周围的 18 世纪经验主义者仍然对现代科学的思维方式和思考方式施加着强大的影响。根据经验主义,世界是一个等待被发现的客观地方。我们的传感器找到这种客观现实的真实描述,并用概念和抽象的语言表达出来。但是这真的抓住了我们大脑的运作方式吗?

哲学是通过语言与我们智力的蛊惑进行的战斗。

路德维希·维特斯坦根

公共领域。

认知神经科学是一个相对年轻的领域,但它所依赖的许多术语都非常古老,其中一些可以追溯到古希腊。19 世纪的伪科学学派 颅相学 表明了类似的研究大脑的方法是多么危险。 颅相学 描述了不同的大脑区域负责不同的专门任务的想法,因此左上方的一部分负责编织,而右下方的一部分写诗(见图)。

这听起来像是伪科学,但有些人认为现代认知神经科学是在一个不同的、更微妙的层面上实践“新颅相学”,该领域中许多最受欢迎的概念,如注意力、记忆、推理或想象,可以追溯到 19 世纪有影响力的美国心理学家威廉·詹姆斯,如果不是在他之前的思想家的话。我们仍然在寻找大脑中概念的特定功能和算法实现 在任何人对大脑实际上如何工作有丝毫线索之前很久就被发明出来了

大卫·马尔的范式 概括了这一点,即我们首先从信息处理的角度考虑一个函数,然后寻找一个算法,然后找到完成该工作的算法的神经实现 (然而,我不想在这里误导任何人,因此必须指出,计算神经科学之父之一的马尔一直强调所有三个组成部分之间的相互作用,并从解剖学层面开始了他的职业生涯)。

尽管如此,这种观点在该领域仍然具有广泛的影响力,相应地,我们仍然大多认为大脑是从 外到 的:这与 冯·诺依曼的 隐喻大脑是一个信息处理器密切相关。我们认为大脑是一台计算机,它处理感官输入,并根据计算后获得的洞察力采取行动。

但是正如神经学家 捷尔吉·布扎基 在他的巨著 中所主张的,大脑从里到外 ,这一观点至少可以说是有局限性的。本文的其余部分将基于s书中的观点,探索这种观点如何影响神经科学和人工智能,当前的观点如何不足以捕捉大脑实际在做什么,以及远离它如何可以帮助我们更好地了解大脑。**

赢的事情都做了;快乐的灵魂在于行动。
特洛伊罗斯和克瑞西达,第一幕,第一场

输入对我们来说是如何获得意义的?我们如何确定我们感知的事物对我们是否重要?

buzáki 的答案非常简单:以对有机体有意义的方式将输入结合在一起的唯一方法是通过行动。 行动在意义上奠基我们的感官 。生物体对感觉输入做出反应的能力是这种生物体首先发展出传感器的唯一原因。大脑不关心客观世界的真相,只关心帮助它满足需求的信息。大脑不仅处理和权衡证据,而且积极探索。没有行动就没有感知,感知往往是一个主动的过程,无论是嗅嗅、头部运动、回声定位还是微扫视。

儿童最初通过随意踢来了解他们身体的物理特性,并通过无意义的牙牙学语开始了解他们说话的运动技能,这些无意义的牙牙学语包含了人类嘴巴能够发出的所有音节。他们采取行动,当他们的行为通过父母的鼓励性反馈或踢椅子的痛苦反馈与世界上的结果联系在一起时,他们的行动就会以一种有意义的方式扎根。

甚至可以说,科学只是随着实验者的进步,扮演了世界的主动操纵者的角色,才真正开始的。伽利略就是一个很好的例子,他从比萨斜塔投掷物体来探索重力的奥秘。

亚历克斯·瓦西在 Unsplash 上的照片

相应地,一个有机体能够行动的 速度 决定了其感知的 相关时标 :当你不能足够快地行动时,了解某事是没有意义的,这正是我们在自然界观察到的。树木不能移动,所以用扫视的眼睛实时捕捉周围环境是没有意义的。我们的肌肉速度与我们的认知速度密切相关,有一个进化的论点认为肌肉速度是限制因素。

Buzsáki 声称,这里可以为神经科学得出一些基本结论,挑战所谓的以表征为中心的范式:不要问某个神经元或神经元组合计算什么以及这种计算代表什么,我们应该问它做什么。

从务实的角度来看,解决这个问题也很重要。当前的神经科学范式塑造了每天设计和进行实验的方式。在许多研究中,例如在记忆研究中,通常给受试者提供刺激,并在处理这些刺激时记录他们的神经活动。然而,从由内而外的角度来看,仅仅记录这种神经活动是不够的,因为它没有任何依据。

这就像记录一种失落的语言的文字,而罗塞塔石碑并不存在。

根据 buzáki 的说法,大脑的词汇库是由 内部生成的动力序列组成的。单词 可以被认为是神经元集合水平上的序列。 学习不是在暴露于外部刺激的过程中创造新的序列,而是选择哪些预先存在的内部序列需要被补充,以最匹配新的体验 。大脑不是一开始就像一张白纸,而是具有预先存在的、稳定的动力。这些动态序列组成了一个字典,里面充满了最初没有意义的单词, 学习意味着为这些单词创建一个开始有意义的上下文。

在不深入研究神经科学细节的情况下,一个例子是海马体和前额叶皮层之间新记忆的形成(海马体在记忆形成中的强烈参与令人印象深刻表现为海马体损伤的患者显示出完全无法形成新记忆):这里海马体充当序列生成器,新皮层学习挑选出那些与经历相关联的序列的子集,将短期序列(海马体)转化为长期记忆(皮层)。

马库斯·温克勒Unsplash 上拍摄

这里有一个有趣的类似于人工智能中的一些概念。

在人工智能的早期,社区专注于基于符号的方法来构建智能系统:世界的抽象符号表示被硬编码到计算机中,教它们获得关于世界的常识和抽象推理。这是一种非常优秀的由外而内的方法,但事实证明,这根本行不通,部分原因是不可能从抽象的推理表得出任何真实世界的行为。

上面写着:“最初是一个字!”现在我犹豫了!谁来帮我达成一致?
不可能,
这么高的奖,
我必须翻译出来,否则(……)
天助我!我现在明白了我所需要的
并写下保证:在开始是
契约!* ——歌德、浮士德***

同样,很有可能从抽象开始,向下移动到行动,最终无法解释大脑。

人工智能和由内向外方法之间的另一个有趣的相似之处是以一种称为 储层计算 的神经网络架构的形式存在。油藏计算机由一个输入层、一个隐藏层和一个输出层组成,很像普通的递归神经网络。但是,由于所谓的丢失和爆炸梯度问题,递归神经网络很难通过反向传播进行训练。

规避这些梯度问题的一个聪明的方法是简单地 根本不训练隐藏层,在随机初始化之后保持它固定 。模型 的 库于是构成了一个固定的、非线性的动力系统,包含了大量不同的预先连线的动力序列(你可以把它想象成一群相互交流的神经元)。然后 学习的目的不是从零开始 学习动态,而只是教会网络的输出层 巧妙地将油藏中已经存在的动态匹配到数据中的相关序列

请注意与 buzáki 观点的相似之处:根据他的说法,大脑已经通过其预先布线和数十亿神经元在数百万亿个连接中耦合在一起的疯狂组合财富,将大量复杂的非线性动力学带到了桌面上。当我们学习行动时,我们不需要从零开始,而是通过将它们与现实世界中有用的结果相匹配,让它们获得意义。

这也是一种规避神经网络中经常面临的 灾难性遗忘 问题的方法:当学习新的东西时,他们倾向于破坏他们以前学习的能力,即使新任务原则上与旧任务相对相似。从由内而外的大脑的角度来看,如果学习新的东西意味着学习全新的动态,这将破坏旧的动态,但如果这意味着将新学到的东西整合到预先存在的动态模式中,灾难性的遗忘就会自然避免得多。

深度学习中另一个指向类似方向的有趣的最新发展是边缘弹出算法:这种算法不是通过调整权重,而是通过简单地删除对网络性能没有任何意义的连接来训练一个足够大的随机初始化的网络(类似于彩票假设),有效地 发现一个预先配置的子网执行网络任务,而不需要任何训练。

必须指出的是,储层计算近年来已经过时,LSTMs 和 GRUs 等架构是建模顺序数据的更受欢迎的选择。然而,我认为由内向外方法的想法仍然可以为人工智能和机器学习社区提供一些灵感。谁知道呢:类似的架构可能会在未来的某个时候卷土重来。

"强有力的理由产生强有力的行动。"
约翰王,第三幕,第四场

胡安·鲁米姆普努在 Unsplash 上的照片

buzáki 走得更远,认为我们的许多高级推理能力,如思维和认知,最终可以被视为内化的行为。

记忆可以通过世界上的事件被映射到预先存在的动态模式来建立,这些动态模式构成了与其内容最接近的匹配。未来的计划甚至可能被理解为 对反向 行动的片断记忆。

内化行为给人类带来了巨大的进化优势 想象一个假想的未来 我们想象中的计划是 假设的行动序列,不需要在现实中表演,而是可以在模拟的世界内部表征中尝试。这允许足够复杂的大脑根据对其后果的 预测 来选择行动,整合过去的经验以及来自环境的感官输入。行动的可能结果变得越复杂,大脑增加的循环和复杂程度就越多,但最终目的是一样的。

抽象思维可能进一步作为空间思维的副产品出现(正如我在关于思维的几何学的文章中更深入地讨论的那样,以及芭芭拉·特沃斯基在她的书《运动中的思维》中论证的那样),并且与海马体和内嗅皮层中物理位置和导航的空间处理有关。

这一点得到了以下事实的支持:前额叶皮层(通常被认为负责所有使我们成为人类的东西)是建立在与运动皮层相似的神经架构上的。虽然初级运动皮层直接投射到脊髓和肌肉,但前额叶皮层却间接投射到边缘系统的大脑区域,如下丘脑、杏仁核和海马,从而作用于我们负责情绪调节的高级大脑区域,而不是直接作用于我们的肌肉。

"我一直认为人们的行为是他们思想的最好诠释者."
约翰洛克

大脑已经变得非常擅长思考和理解现实。但是,如果大脑存在的主要原因是计算积分或炫耀他们的一般知识,他们就不会在这里了。

这就是为什么我认为 Buzsáki 提出了这样一个令人信服的案例:如果我们将大脑视为一个巨大的动态库,其主要目标是通过行动与有意义的经验相匹配,这直接使得大脑在实践中实际上是有用的,这使他的理论植根于进化论。

我们对行动和智力的超脱可能被视为一个世纪以来身体和精神之间笛卡尔式分裂的副产品。现在是时候克服这一概念分歧了,因为行动可能真的是智力的核心。观察神经科学和人工智能的下一次突破是否真的会是行动驱动的,将更强的由内而外的方法整合到它们的中心概念中,这仍然是更加令人兴奋的。

最后一点,我必须强调,在本文的范围内,我不得不省略许多有趣的细节,我只能建议更深入地阅读 buzáki 的书或在 Youtube 上看到他的一个演讲(例如这里这里)。我最近还在我的播客上和他交谈过,更详细地探讨了他的许多想法(和一些神经科学)。

为什么我们不再将转换率作为主要指标

原文:https://towardsdatascience.com/why-we-moved-away-from-conversion-rate-as-a-primary-metric-14b2d6cb5996?source=collection_archive---------29-----------------------

违反 AB 测试的独立性假设和改变贵公司的主要度量标准的影响

乔纳森·彼得森在 Unsplash 上拍摄的照片

改变任何公司的主要指标都不是一件简单的事情。为什么你会问?原因有很多,但我想到了其中的一些:

  • 该公司长期以来一直使用这一指标
  • 预测是根据历史值做出的
  • 团队 okr 包括反对它的目标
  • 人们理解指标和推动指标的杠杆
  • 很容易发现与期望值的偏差
  • 可以快速确定指标变化的原因

单是这份候选名单就足以让任何人大汗淋漓了!所以想象一下,当我在 Gousto 的第一个月,我们菜单部落的产品负责人建议我们的主要指标,菜单转换率(MCVR)可能是我们在实验中使用的错误指标,因为它违反了统计独立性的假设时,我有多惊讶。

现在用什么侵犯了谁???

当你使用转化率作为实验的衡量标准时,你会有意识地或下意识地这样做,假设你有一个独立观察的样本。

这基本上意味着一个事件的结果对另一个事件的结果没有影响。

例子:想象掷骰子两次。第一轮的结果不会影响第二轮的结果,因此我们可以说这些事件是独立的。

任何一家拥有“粘性”产品的公司,如果其商业模式依赖于客户每周的回访,都有违背这一假设的风险。这不是您可以选择忽略的“最佳实践”类型的决策。用于分析 AB 检验结果的大多数推断性统计检验(如 2 样本 t 检验)的基础是假设观察值相互独立。

也许这还不清楚,或者你认为这对你的测试没有影响。让我向你保证,即使是最轻微的依赖也会导致严重的结果偏差

为什么我们违反了独立的假设(AOI)

我们是一项基于订阅的服务,客户每周都会回来订餐,因此我们很自然地将每周 MCVR 作为我们的主要 KPI。我们没有考虑每日或基于时段的 MCVR,因为大多数客户一周订购一次,所以即使这发生在多个时段,也可以在该周只统计一次。接下来的一周,顾客(有些是新顾客,有些是前一周的顾客)会回来下订单,我们会再次把他们视为独特的顾客。在整个实验过程中,我们会一遍又一遍地这样做,通常是 3-5 周。在实验结束时,我们将对每周独立访客和订单的总数求和,然后除以其他,得出我们的 MCVR*。

*注意:计算 MCVR 的另一种方法是,只取整个实验期间的唯一用户和唯一订单,并将前者除以后者。这种方法也不是没有局限性。虽然观察是独立的,但你忽略了订单频率,但这超出了本文的范围。

起初这似乎是一个合理的方法,如果我们没有一个粘性的产品,并且从第 1 周、第 2 周开始的用户再也看不到(至少在测试期间),这可能是一个合理的方法。但是随着用户一周又一周的回来,我们的观察并不是独立的。为什么你会问?

好吧,想想看——如果我们开发了一个功能或降低了我们的价格或做了其他事情,说服你购买,我们做的那件事,它已经在你身上起作用了,所以一次又一次地计算你将意味着我们对你作为一个数据点的观察是不独立的,我们正在偏向我们的结果。换句话说,客户在某一周做的事情会影响他们在下一周做的事情。我们在 MCVR 的主要 KPI 无效。

照片由乔丹·罗兰Unsplash 上拍摄

这有什么影响,实际上严重吗?

它增加了你的假阳性率,FPR(或 1 型错误率),所以是的,它是严重的!Frequentist 统计已经依赖于接受基于你设置的显著性水平,所有获胜结果的某个百分比将是假的——通常是 5% (α=0.05)。用不独立的观察来运行测试会导致你的 1 型错误率的膨胀。

假阳性率是假设无效(对照)假设为真时拒绝该假设的概率。如果你运行了 100 个显著性水平为 5%的实验,并且有 10 个获胜者。其中 5 个可能是假阳性*。问题是,哪 5 个。概率不是婊子吗!

我知道我们的假阳性率高于我们根据我在别处读到的论文研究而设定的阈值。我只是不知道差了多少。

这是对世界的一种简化的看法,实际上,它们可能都是假阳性,或者都不是,或者介于两者之间。

发现我们真正的假阳性率

如果我们要改变实验的主要指标,我们需要证明这是错误的指标,并且我们正在做出错误的决定。

我们证明这一点的方法是获取一些历史数据,并对其进行 A/A 测试模拟,以显示我们真正的假阳性率是多少。使用一个随机的和最近的数据集,我模拟了 30,000 个 A/A 测试,用于 1,3 和 5 周的“实验”。

对于 1 周的模拟,我预计误报率为 5%,因为我们只计算一次用户(独立的),我将显著性水平设置为 5%。除此之外,我唯一的期望是,我们会看到超过 5%的“成功测试”,因为我们在一次又一次地计算回来的用户。

结果

正如我预期的那样,我们 1 周的假阳性率是 5%,但是我发现我们 3 周测试的假阳性率高达 9%,5 周测试的假阳性率接近 12%(如下图 1 所示)。

把这个放在上下文中。成功测试的行业平均水平在 20–25%之间,这意味着可能有高达 50%的成功测试有可能是假成功,而不是只有 20%。

下面的图 1 开始时有点“起伏不定”,但随着模拟次数的增加,假阳性率开始稳定,我们可以看到,在我们的随机数据集上,即使没有进行任何实验,我们也将找到“赢家”。

图 1:1、3 和 5 周 A/A 测试的假阳性率

有了这个新的世界观,我们开始寻找新的度量标准。

新指标——每用户平均订单数(AOPU)

我之前提到过,我们忽略了订单频率,只关注转化率(不正确的从属版本),所以我们的目标是找到某种类型的混合(复合)指标,来考察独特的转化率和订单频率。我知道这个标准是什么,奥普,我只是需要帮助每个人理解它。接下来是痛苦的几个月,我写了一些关于我们为什么远离皈依的内部文章。新的衡量标准是什么?是怎么算出来的?为什么会更好?TL;我论文的博士版本是:

AOPU =总订单数/独立用户数=转化率 x 订单频率
这一提议的指标允许我们监控转化率订单频率的灵敏度和变化,而不会违反独立性假设,从而为我们提供一个更全面、统计上更合理的指标。

我们已经成功地使用了 AOPU 将近 8 个月了。会议中的对话、OKRs、分析和实验都是基于这个新的标准。围绕菜单转换的讨论已经成为过去。

这很可能是我一生中做过的最恐怖的作品之一,但我必须承认,这是最有收获的作品之一。

最后的想法

我们不是世界上唯一一家依靠用户一次又一次回来的基于订阅的企业。你甚至不需要订阅模式就能拥有“粘性”产品。超市、亚马逊、Spotify、Slack、网飞等都有定期回头客。无论你的商业模式是什么,如果你有定期回头客,并且你像我们一样关注每日/每周的转换率,对你自己的数据进行一些 A/A 测试,看看你自己的 FPR 是什么样的。谁知道呢,你甚至可能需要改变你自己的主要指标。

你可以在 Twitter 上关注我,或者用最少的努力在 Medium 上关注我和 废话连篇

为什么我们必须选择 Kubernetes 气流执行器

原文:https://towardsdatascience.com/why-we-must-choose-kubernetes-executor-for-airflow-28176062a91b?source=collection_archive---------2-----------------------

在生产环境中部署气流的技巧

尼科沃尔波尔皮克斯拜

首先,我说的是一个坚实的、可扩展的气流基础设施。

如果你需要一点气流,最多 50 个 Dag,最多 2 个开发者建造 Dag。你不需要在意我会说什么,只要用 docker-compose,ec2,或者局部用芹菜来调配你的气流,你就开心了。

以下是我在生产中部署气流的黄金法则:

  • 使用头盔进行气流展开
  • 创建外部数据库。不要使用 PostgreSQL 容器。
  • 在托管云中部署 Kubernetes。
  • 使用 Kubernetes 执行程序

在这篇文章中,我将集中在最后一个。

我关心的哪些问题有解决方案:

1 —控制 Kubernetes 集群上的资源(内存、CPU)。
2 —许多开发人员从事不同的项目,并有不同的认可级别。所以他们使用不同的运营商和方式来建立数据管道。
3 —等幂和一致性 Dag

让我们一起去解决问题:

我们在云端一般会付出什么?资源(内存、CPU)

因此,当有人使用 PythonOperator 创建一个包含许多任务的 DAG 来构建数据框时。您知道这个 DAG 使用了多少内存和 CPU 吗?如果你正在处理芹菜,那就复杂了,因为我们在同一个 worker 中运行许多任务。在 Kubernetes 中,每项工作都是一个 pod,因此您需要预先设置工人资源,这是一个问题,因为我们有多个任务需要不同的资源。

然后,最好使用 Kubernetes executorREQUIRE 当有人编写 DAG 时,他们必须设置资源。这样,每个任务都是 Kubernetes 上的一个 pod,具有不同的请求资源。

请看这个简单的示例(您可以在气流默认示例中找到更多信息):

酷,所以你问我:我怎么能强迫某人设置资源?当然是利用你的说服力。不,这可以工作,但您可以在您的 CI 管道上使用阿德单元测试并进行验证。这个比第一个选项容易=)。

现在,有人会对我说:在我的公司,我们使用气流只是为了编排。我们使用芹菜,我们只使用 KubernetesPodOperator,我们不在 DAGs 中进行转化。然后,当我们需要使用其他操作符时,首先我们测量 de 资源消耗,我们知道使用它是安全的,因为任务使用低资源,并且我们可以通过并行度限制来控制同一工作机上的任务数量。

PLUS:air flow Kubernetes executor 比 celery 更具可伸缩性,即使我们使用 KEDA 来伸缩 celery(另一篇文章的主题)。如果你理解了最后一段,你可以想象为什么我能保证它。如果您使用默认 HPA 进行气流缩放,您就不了解 celery (scheduler、Redis、worker)是如何工作的。做一个测试,用一个使用高 CPU 的任务构建一个 dag,您将看到 HPA 扩展更多的工作线程。但我们没有更多的任务,我们有一个任务运行使用更多的 CPU,另一个工人不会帮助我们。

最后同样重要的是,监控是关键。我用 Prometheus 和 Grafana,它得到所有吊舱指标和气流 Postgres 指标。指标在本地开发和生产环境中非常重要。
开发者需要本地的这些度量来设置初始资源。该公司需要监控以下问题的答案:
哪些任务(pod)消耗更多内存(max)?哪些任务(pod)消耗更多 CPU(最大值)?
哪些任务(pod)花费了很长的时间和资源(max)?
我的任务消耗 ABC 曲线(max)是多少?
有了这些答案,公司可以为 Dag 校准资源,并知道他们需要优先处理哪些任务,以及根据资源消耗进行重构排序。
不同的公司有不同的必需品问题,你可以和团队交流,了解必需品。

通过这种部署,开发人员需要更多地关注幂等性。他们需要创建一致的任务,每次执行都花费相同的资源,因此,当运行这些任务时,他们通常会获得相同的结果。

气流 Grafana 仪表板—自行创建

图表中的这条红线是当我们不设置任务中的资源限制时可能发生的情况。这个任务需要更多的资源,如果库伯内特需要这些资源来完成其他任务,他会杀死这个豆荚。我们可以有一个全局配置来创建 pod 限制,但重要的是:任务不能完成工作,或者它会花费不必要的资源。

因此,我建议您可以优化您的资源,因为这是我们向云支付的费用。您可以确切地知道哪些任务是瓶颈,并且可以对监控您的集群有更深入的了解。
***我并不是说使用 Kubernetes executor 更容易,您的团队需要更多的 Kubernetes 和容器知识,规则流只是一个批处理编排。因此,流式传输或批处理间隔最长可达一分钟,还有其他更好的解决方案,也许您只能创建管道来监控这些流式传输管道。

来源:

阿帕奇气流舵图——舵图文档

气流执行者解释|阿帕奇气流指南(天文学家. io)

文档|阿帕奇气流

为什么我们需要关注科技界女性的活动

原文:https://towardsdatascience.com/why-we-need-events-focused-on-women-in-tech-a1e599239d88?source=collection_archive---------53-----------------------

以及为什么男人应该至少参加一个

克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片

我最近参加了一个数据科学领域的女性黑客马拉松。当我和我的同事谈论这件事时,有人问我为什么我们需要专门针对女性的活动。为什么女性不能参与所有人的活动?这让我开始思考。对我来说,不是男人让环境对女人充满敌意,也不是他们不允许女人成功。其实我已经可以很轻松的和男同事交朋友了。他们很支持我,我不觉得他们对待我的方式和其他人有什么不同。这些问题对一些女性来说确实存在,但对我来说从来没有。

那么,我为什么要参加女性科技活动呢?为什么大多数女人?我有我的理由,那就是对女性不利的固有的系统缺陷。这个列表不仅仅适用于女性。这对任何少数人来说都是相当普遍的。这是:

证明自己的压力

当你是唯一的一个或少数民族的一员时,你必须证明你是属于他们的。摆脱你是一名“多元化雇员”的印象是一种持续的压力。再说一次,这不是我有意识意识到的事情。只是存在于自己脑海里的东西。

低估自己能力的倾向

雪莉·桑德伯格在她的书《向前一步》中说,女性往往会低估自己的能力。研究也多次证明了这一点。局外人情结进一步助长了这种低估,并增加了表现的压力。

代表性别的压力

任何环境中的少数群体都觉得他们代表了更广泛的思想、观念或概念。不知何故,他们的行为代表了整个社区,而不仅仅是他们自己。如果你是大多数人,你只代表你自己。但如果你是少数派,你就代表了你的同类。

如果你曾经在世界各地旅行过,我敢肯定你被视为一个游客。虽然没有人对你有什么不同,但你不觉得你代表了比你自己更重要的东西吗?你的行为不知何故延续或消除了一种刻板印象?

这最终导致害怕因为错误的原因而被记住。我不想被人认为是“犯了错误的女人”。你会吗?由于我们的行为有更高的(感知的,在我们自己的头脑中)后果,我们需要格外小心。

榜样的稀缺

当处于多数时,很容易找到与你相关的人,也很容易找到值得你尊敬的人。但是女性崇拜的榜样少得多。在你问为什么男人不能成为女人的榜样之前,是因为上面的挑战是女人独有的。我很乐意与克服了这些挑战的女性交谈,并向她们学习。

此外,女子唯一的项目使这个竞技场变得公平。他们带走了代表的负担,允许女性做自己,犯错,并接受挑战。这些活动帮助我们找到榜样,看到这么多其他女性做我们做的事情让我们感到我们有归属感。

在以女性为中心的活动中,我观察到女性倾向于自由谈论偏见和问题,包括那些只存在于她们自己头脑中的问题。我第一次参加这样的活动时,发现作为一名女性,我在我的领域面临的大多数问题都是普遍性的。这些问题,以及随后的成功故事,打动了我,激励了我。

回到为什么我现在总是渴望参加这样一个以女性为中心的活动,是因为它们让我能够找到我所在领域的女性来交谈。我总能找到能引起我共鸣的故事。每次我参加这样的活动,我都会对技术领域的女性、她们的奋斗和赋权故事产生全新的尊重。它们证实了我正在走的路,增强了我的信心,让我觉得我真正属于这里,属于科技世界。

有人指出,作为男性,他们不会参加以女性为中心的活动,因为他们会觉得自己是个局外人。相反,我会敦促他们参与。他们会遇到周围最好、最善良的人,他们总是乐于助人。我相信,当你听到我们这边的故事时,你也许能更好地理解我们。你会理解为什么这样的事件会存在,我们女人热切地希望彼此支持。如果你有任何偏见,我相信在参加了这样的活动后,你不会有偏见;).对许多人来说,我保证你会听到一些故事,尽管你是一个男人。

出于所有这些原因以及更多原因,我强烈认为我们仍然需要以女性为中心的科技活动,至少在科技世界恢复性别平衡之前,或者在我们女性没有这样的故事可讲之前。

为什么我们需要更多的人工智能产品所有者,而不是数据科学家

原文:https://towardsdatascience.com/why-we-need-more-ai-product-owners-not-data-scientists-e481cef39b90?source=collection_archive---------1-----------------------

关于人工智能产品开发中一个至关重要但未被充分利用的角色

如果你认为人工智能(AI)是昙花一现的炒作,那就再想想吧。斯坦福 2021 年人工智能指数显示,全球企业人工智能投资达到创纪录的 670 亿美元。去年的人工智能投资甚至超过了 2019 年的历史最高水平 40%。根据普华永道第 22 届全球首席执行官调查,77%的财富 500 强首席执行官计划开始或已经采用人工智能计划。鉴于对人工智能的投资稳步增加,数据科学面临交付切实成果的压力。

来源:10 大排行榜 AI 状态

将人工智能集成到你的业务中的潜在回报是巨大的。根据 2020 年麦肯锡全球人工智能调查,人工智能为一个精英人工智能从业者群体贡献了超过 20%的 EBIT。此外,这些人工智能高绩效者比竞争对手在人工智能计划上花费更多的预算。他们也有能力在内部开发人工智能解决方案,而不是依赖外部供应商。

安迪·凯利在 Unsplash 上的照片

随着数据科学的成熟,该领域真正实现宣传的压力也越来越大。该领域需要提供切实的业务优势。人工智能产品成功的一个重要但未被充分利用的角色是人工智能产品所有者(AI PO)。

在这篇文章中,我分享了我对 AI POs 的重要性和所需技能的看法。AI POs 不是只给 AI 产品开发团队配备数据科学家,而是增加了成功开发 AI 产品的机会。文章描述了如何建立成功的 AI 产品团队,AI PO 的角色,以及学习成为 AI PO 的资源。

首先,我们来分析一下一个传统产品负责人和一个 AI 产品负责人的角色。

产品负责人 vs. AI 产品负责人

产品负责人的角色在 Scrum 框架中定义。Scrum 是一种流行的敏捷开发方法。该框架需要产品所有者、Scrum Master 和开发人员的角色。

Scrum 非常注意在 Scrum 主管和产品所有者之间划分产品和人员的职责。产品负责人负责最大化 Scrum 团队的价值。她创建了一个产品愿景,与利益相关者沟通,并对产品积压进行优先排序。Scrum alliance 声明 PO 需要业务、用户体验、技术和沟通技巧。

作者图片

AI PO 角色是常规 PO 角色的扩展、专门化版本。AI POs 继承普通 PO 的职责。他们扩展它们以最大化基于人工智能的产品的影响。

基于人工智能的产品不同于传统的软件产品。首先,AI 使用数据隐式地学习模式,而不是开发者显式地实现规则。其次,基于人工智能的产品有机会随着输入数据不断改进。第三,机器学习让我们能够建造这种质量的产品,像语音助手自动驾驶医疗诊断。因此,销售点需要调整他们的技能来提供基于人工智能的产品。

作者图片

那么,AI POs 需要哪些技能呢?首先,人工智能 POs 需要了解基于人工智能的应用程序的潜力和缺陷。AI 擅长什么,奋斗在哪里?基于人工智能的解决方案可以解决哪些业务问题,它被放错了位置?

接下来,AI POs 需要特别注意监控 AI 模型的预测。人工智能基于统计假设,因此预测总是带有一定程度的不确定性。根据上下文,一个错误的预测可能会导致严重的后果。人工智能 POs 应该能够设计人工智能应用程序,以便在需要时包括人类决策。

在生产环境中以 ML 为核心的产品仍然是一个新生的学科,因此在这个领域运营的项目经理和企业家都在学习很多东西。—Mor,AI 创业者

另外,基于人工智能的产品是动态的。他们衡量顾客对他们预测的反应。人工智能产品还需要考虑对数据的持续调整。在设计基于 AI 的产品时,AI POs 需要牢记 AI 的良性循环。智能产品的真正力量来自于它们基于新数据不断改进的能力。

人工智能飞轮允许基于人工智能的产品不断改进。作者图片

技术方面,AI POs 的技术知识越多越好。AI POs 既不需要以前是开发者,也不需要拥有计算机科学硕士学位。然而,很难理解用人工智能实现什么是容易的,什么是几乎不可能的。如果没有适当的技术背景,人工智能产品的可行性很难评估。请注意,这里有不同的意见,其他人认为技术知识既不需要采购订单也不需要人工智能采购订单。

最后但同样重要的是,AI POs 理解 AI 开发不同于软件开发工作流。AI 开发测试不同的假设,快速迭代。传统的软件开发可以遵循更加模块化和结构化的方法。理解 ML 开发不像传统软件开发那样是线性的,这对于与涉众交流期望和按时交付价值是至关重要的。

“由于人工智能项目的开发生命周期是基于“搜索”而不是“规划”,公司需要受过训练的专业人士将产品视为优化问题,而不是编程问题。”——阿德南·博兹,艾产品管理学院创始人

普通采购订单与人工智能采购订单的重点领域。作者图片

在理解了 AI PO 的角色之后,让我们来分析 AI PO 在 AI 产品团队中是如何工作的。

构建数据产品团队

交付基于人工智能的产品取决于组建跨职能团队。跨职能团队由具有互补技能和角色的专家组成。我经常看到一心一意的数据科学团队努力实现他们的模型。要求数据科学家完成将基于人工智能的产品带给客户所需的所有角色是失败的秘诀。

模范人工智能产品开发团队。作者图片

相反,AI PO 通过最大化商业价值来支持数据科学家。上图展示了一个由跨职能专家组成的原型人工智能产品开发团队。不要纠结于角色,它们可以从一个产品变成另一个产品。有些产品可能需要 AI UI/UX 设计师,有些可能不需要。但是,我确实相信所有的 AI 产品团队至少应该有一个 AI PO。您还可以看到,数据科学家只是团队中的一个角色,还有许多其他角色。

现在你知道人工智能程序是做什么的了,继续读下去,看看你能从哪里学到成为人工智能程序的技能。

人工智能 POs 的资源

正如你所看到的,人工智能 POs 可以在人工智能产品的生产中发挥重要作用。幸运的是,有很多资源可以教你成为一名 AI PO:

首先我要推荐的是阿德南·博兹的 AI 产品管理学院。Adnan 在斯坦福大学从事教学工作,在英伟达工作,成绩斐然。他还创办了人工智能产品管理研究所,开发人工智能 POs。Adnan 帮助有抱负的产品所有者进入人工智能领域,并收到了非常积极的学生反馈。

上面提到的爱宝资源。作者图片

Udacity 纳米学位看起来很全面,很有价值。我听到了关于该计划的良好反馈。该计划需要两个月的时间,涵盖了各种人工智能 PO 技能,以及数据集创建、模型构建和人工智能产品监控。

最后,我是 deeplearning.ai 内容的热心推广者,并在“AI for Everyone”课程发布前亲自审阅了该课程。它并不完全针对开发人工智能产品所有者,但该课程有助于您了解人工智能产品的内部工作原理、优势和局限性。对于人工智能 POs 来说,理解人工智能的非技术基础是至关重要的,这是本课程教给你的。

请注意,这不是赞助帖,是我个人推荐。

关键要点

看完这篇文章,希望你明白,我们需要的不是更多的数据科学家,而是更多的 AI POs。AI PO 支持人工智能产品团队,而不是要求数据科学家覆盖所有产品开发阶段。AI PO 专注于通过基于人工智能的产品创造价值。

  • 人工智能 POs 对于成功开发基于人工智能的应用程序至关重要
  • 人工智能 POs 了解人工智能的优势和缺陷,设计使用人工智能飞轮的产品,并了解人工智能开发工作流程
  • 人工智能产品团队需要各种技能,不仅仅是数据科学家

看完这篇帖子,你对 AI POs 的需求和它们的作用有了更好的理解。如果你想听更多关于商业、项目管理和数据科学的交集,媒体LinkedInTwitter 上关注我。

来源

Daniel Zhang、Saurabh Mishra、Erik Brynjolfsson、John Etchemendy、Deep Ganguli、Barbara Grosz、Terah Lyons、James Manyika、Juan Carlos Niebles、Michael Sellitto、Yoav Shoham、Jack Clark 和 Raymond Perrault,“人工智能指数 2021 年年度报告”,人工智能指数指导委员会,斯坦福大学人工智能研究所,斯坦福,加利福尼亚州,2021 年 3 月。

斯坦福大学的《人工智能指数 2021 年度报告》在 Attribution-no derivatives 4.0 International 下获得许可。要查看本许可证的副本,请访问http://creativecommons.org/licenses/by-nd/4.0/.

Tara Balakrishnan,Michael Chui,Bryce Hall,Nicolaus Henke,“全球调查:2020 年人工智能的状况”,麦肯锡 分析,2021 年 3 月从 McKinsey.com 检索。

为什么我们在回归分析中使用最小二乘法

原文:https://towardsdatascience.com/why-we-use-the-least-square-method-in-regression-analysis-b7873e03b253?source=collection_archive---------15-----------------------

背景

简单的线性回归非常简单。这是人们在探索机器学习领域时遇到的第一个算法。然而,它的起源在于统计。从业者后来将其应用偷偷带入机器学习和其他几个领域,如商业和经济学。任何上过概率统计本科一年级的人都可以做简单的线性回归。它所需要的是通过一堆数据点找到最佳拟合线的方程。为此,您需要遵循一个标准协议,计算实际目标值和预测值之间的差值,对它们求平方,然后最小化这些差值的平方和。表面上,回归和概率之间没有明显的联系。更多的是和微积分有关。但是,回归分析还有更激动人心的一面,它被导入 python 库的满足感和便利性所掩盖。

放大回归

让我们思考一个关于假想数据集的简单回归问题,其中 X 和 Y 保持它们惯用的身份——解释变量和目标变量。简而言之,回归的圣杯是发掘一条擅长以最小误差逼近目标变量(y 值)的线。但是,忍住。与其寻找直线,不如考虑所有标绘在 x 轴上的 x 值。考虑穿过每个 x 轴的平行于 y 轴的线。如果有帮助的话,画在纸上,如下所示。

(在 MS Paint 中创建)

灰色线条代表什么?嗯,如果你考虑到现实世界中存在的动荡因素,那么 Y 可以是给定 x 的任何值。例如,尽管学习了相同的小时数,但你可能在两次独立的月度测试中得分不同。因此,所有的线都指定了 Y 的值域,对于每个 x 都是实数。

如果我现在要求你估计给定 x 的目标变量,你会怎么做?答案将揭开回归的概率全景。如果我给你一个给定 X-P(Y|X)的条件概率分布,会不会有帮助?当然,它会,但没有办法提取一个准确的分布函数。所以,我们做了一个假设,许多假设中的第一个。假设给定 X,P(Y|X)的 Y 的概率遵循正态分布。为什么正常?根据您正在处理的数据集的先验知识,您可以自由选择任何合适的分布。然而,由于很快就会清楚的原因,我们将求助于正态分布。

我们将在上面绘制的图的 z 轴上表示这个概率分布。如下图所示,P(Y|X)遵循正态分布。红点是每个 P(Y|X)的平均值。原谅图像的质量。我用 MS paint 制作了它们,以便于展示。

(在 MS Paint 中创建)

解开正态分布的参数

好吧,我们建立了分配的类型。它的参数——均值和方差呢?为了做出合理的估计,我们需要数据集中每个给定 X 的 Y 的均值和方差。此时,开始摆弄回归线 a+bX 是明智的。

如前所述,我们希望找到系数 a 和 b,使得计算 a+bx 可以得到实际 y 值的最佳估计值。考虑到 y 呈正态分布,最佳估计值是多少?请注意,在从正态分布中随机抽取值时,大多数情况下会得到平均值。所以,明智的做法是赌 a+bX 是 Y|X 的均值或期望值。

由乳胶制成

这是一个明显而低调的事实。因为我们假设 a+bx 是 Y|X 的期望值,所以我们也猜想所有的均值都位于回归线 a+bx 上。这是使用回归模型的必要条件。这么想吧,如果真实的均值没有躺在一条线上,用线性回归是否明智?现在你可能想知道人们是如何确定线性度的?我们不能,因为真正的价值是一个谜。那我为什么要拿这个来烦你?在实际的机器学习中,人们认为线性的存在是理所当然的,并继续进行建模。无论如何,建模后测试可用于确定线性回归模型的准确性。这里重要的是了解潜在的假设。

好的,如何处理方差?为了保持同质性,我们假设所有 Y|X 的方差值都是常数。同质性意味着方差的同质性。这个概念应该有一个单独的位置。然而,对我们来说,知道最小二乘估计在它不存在时是错误的就足够了。一直读到最后,你会发现为什么。

由乳胶制成

贝叶斯回归全景图

理解超过这一点的东西需要贝叶斯定理的知识。我的本科教授曾经说过,“同学们,如果不知道贝叶斯定理,你们将无法进行任何有价值的机器学习。”因此,我将跳过它的详细解释,希望作为人工智能的爱好者,你对 Bayes 和他的思想很熟悉。

让我们概括一下到目前为止我们所做的事情。我们从一个由解释变量和目标变量 X 和 Y 组成的假想数据集开始。然后,我们试图计算出给定 X 时 Y 的概率。为此,我们假设 Y|X 遵循均值为 a+bX 的正态分布。因此,我们还建立了所有 Y|X 的平均值位于回归线上。

太好了,是时候开始寻找圣杯了。我们需要找到 a 和 b 的最佳估计值,是什么决定了这些估计值?你猜对了——手头的数据。参数 A 和 B 应该使得概率 P(a=A,b=B|data)最大。

由乳胶制成

怎么做呢?贝叶斯来拯救我们了。根据贝叶斯定理:

由乳胶制成

因此,我们可以写

由乳胶制成

在本文的其余部分,我将把上面的等式称为贝叶斯。

注意,没有可靠的数据,a 和 b 是不确定的。它们可以从实数集中取任何值。P(a=A,b=B)是得到 a=A 和 b=B 的概率,与手头的数据值无关。假设我们想用每日最高温度来模拟冰淇淋销售的回归。

由乳胶制成

你的朋友托马斯·贝叶斯,碰巧也是甜点行业的专家,欣然同意为这项研究提供任何帮助。根据他的经验,他建立了(A,B)的概率分布模型。很好,你现在对(A,B)最可能的值有了更好的了解。然而,在许多情况下,你不会得到托马斯的支持。在这样无可奈何的条件下,假设(A,B)的任何一个集合都是同样可能的。从概率上讲,P(A=a1,B=b1),也称为先验概率或只是先验,假设是均匀分布的。

总而言之,先验不受数据的影响,顾名思义,它们反映了我们对回归模型的初步概念。

回到我们的问题。我们也假设先验分布是均匀的。我们的目标是最大化贝叶斯的右边。因为 P(a=A,b=B)在(A,B)的所有集合中都是常数,所以我们可以忽略该项。

由乳胶制成

接下来,认识到 P(数据)仅仅是一个常数。为什么?它是在所有 A,B 对中获得数据的总概率,一组特定的 x,y。对于每对 A,B,P(data| a=A,b=B)是一个介于 0 和 1 之间的实数(你很快就会明白为什么)。因此,这些概率的总和 P(data)是一个常数。

由乳胶制成

比例两边的常数都可以去掉。

P(data|a=A,b=B)是得到数据的概率,给定参数 A 和 B,所有提供的值集(X,Y)也可以写成 P(X,Y|a=A,b=B)。根据条件概率的规则,这个我就不深究了,P(X,Y|a=A,b=B)可以进一步简化为 P(Y|X,a=A,b=B)。

由乳胶制成

我们的问题归结为最大化 P(Y|X,a=A,b=B)。假设 P(Y|X)服从正态分布,平均值为 a+bX,方差为σ。在提供的数据中,Y 可能不同于 a+bX。因此,对于 P(Y|X,a=A,b=B),我们的目标是找到从均值为 a+bX 且方差为σ的正态分布中得到 Y=y 的概率。

由于所有的 Y|X 都是独立的,我们可以把 P(Y|X,a=A,b=B)简化为所有个体 P(Y=y|X=x,a=A,b=B)的乘积。

由乳胶制成

挖掘最小二乘逼近函数

正态分布的概率密度函数 pdf 为:

由乳胶制成

与离散分布不同,连续分布不定义特定点的概率。你只能在一个数值范围内对 pdf 进行积分,比如说 x1

在我们的例子中,我们可以通过在一个相当小的范围内对 pdf 进行积分来近似计算下面的概率。

由乳胶制成

通过计算,我们可以进一步写出

由乳胶制成

我向数学专家道歉,我耍了一个卑鄙的手段。为了简单起见,我取消了积分运算,引入了比例符号而不是等式。这些都是在被积函数 dy 对所有 x,y 都相同的假设下完成的。

只剩下一些数学运算了。为了最大化令人望而生畏的 L,让我们首先在两边取一根圆木。

由乳胶制成

右边的第一项是常数。因此,代数要求最大化 log(L),我们需要最小化第二项。现在,看看第二学期。你发现什么了吗?答对了。你发现了著名的最小二乘近似项。

最大化 L 需要最小化第二项,这恰好是最小平方逼近函数。

由乳胶制成

认识到最小二乘近似是在以下条件下进行回归分析的适当程序:

  1. 对于给定的 x,目标变量 y 遵循正态分布
  2. 回归参数的所有值都是同等可能的。也就是说,先验服从均匀分布
  3. 对于所有的 Y|X,方差值被假定为常数。否则,我们不可能从求和项中取出它

与这些条件的任何偏差都将导致必须遵循替代程序。在这种情况下,你必须重复整个练习。

结论

我写这篇文章的目的是为了分享为什么我们在做回归分析时会求助于最小化平方差的和。当我第一次看到这个启示时,我大吃一惊。为了在机器学习中做一些很酷的事情,许多人经常掩盖底层的数学。也许,一个人可能永远不会专业地要求这种知识。但是对它视而不见,你就错过了美丽的机器学习。真是满眼都是。

为什么体重?平衡数据集训练的重要性

原文:https://towardsdatascience.com/why-weight-the-importance-of-training-on-balanced-datasets-f1e54688e7df?source=collection_archive---------9-----------------------

如何在 Scikit-Learn 管道中实现用于分类的样品重量

照片由埃琳娜·莫日维洛Unsplash 上拍摄

想象一下被问到一个熟悉的谜语——“一磅铅和一磅羽毛哪个更重?”当你准备自信地宣布它们一样重时,你意识到询问者已经从你的后口袋偷走了你的钱包。

为什么平衡很重要?

在监督机器学习中,重要的是在平衡数据上训练估计器,以便模型在所有类别上都是平等的。

设置权重是评估者特有的。许多 Scikit-Learn 分类器都有一个class_weights参数,可以设置为“balance”或给定一个自定义字典来声明如何对不平衡数据的重要性进行排序。

这种方法类似于过采样。我们可以通知估计器调整其计算损失的方式,而不是实际上过采样(使用更大的数据集在计算上更昂贵)来平衡类。使用权重,我们可以迫使 as 估计器基于给予特定类的或多或少的重要性(“权重”)来学习。

砝码是如何使用的?

权重缩放损失函数。当模型在每个点上训练时,误差将乘以该点的权重。估计器将尝试最小化权重更大的类的误差,因为它们对误差有更大的影响,发送更强的信号。如果没有设置权重,模型会将每个点视为同等重要。

平衡不是你找到的,而是你创造的

―贾娜·金斯福德

不平衡数据集的示例

这个样本数据集来自我的一个文本分类项目。我开始按等级对酒店评论进行分类,详见我的 GitHub。数据强烈支持正面评价(否则酒店将需要认真重新审视他们的商业模式)。

Class Distribution (%)1     7.431961
2     8.695045
3    17.529658
4    33.091417
5    33.251919

计算类别权重

Scikit-Learn 具有从其.utils库中计算类别权重样本权重的功能。自定义权重也可以作为格式为{class_label: weight}的字典输入。我计算了上述情况下的平衡重量:

Class Weights: 5 classes{1: 2.691079812206573,
 2: 2.3001605136436596,
 3: 1.140923566878981,
 4: 0.6043863348797975,
 5: 0.6014690451206716}

如您所见,较重的权重应用于少数类,表明模型必须给予这些类更多的重要性。降低多数类的权重,使其重要性降低。权重为 0 意味着没有影响或不重要(如果你需要静音一个类)。

(左侧表格)我已经结合了类的归一化分布和计算的权重。“平衡”栏是重量乘以分布。我们看到每个类都有相同的数字,加起来是 1。这相当于看到任何一个类的概率相等(1/5 = 0.2)。

计算样品重量

平衡类权重可以在样本权重函数中自动计算。设置class_weight = 'balanced'自动调整输入数据中与类别频率成反比的权重(如上表所示)。

**from** sklearn.utils **import** class_weightsample_weights **=** compute_sample_weight(class_weight = 'balanced', 
                                                  y **=** y_train)

样本权重作为一个数组返回,类权重映射到目标数据(y_train)中的每个样本。示例:

Sample Weights: 14330 samplesarray([0.60146905, 2.30016051, 0.60438633, ..., 0.60438633, 1.14092357, 1.14092357])

要在 Scikit-Learn 多项式朴素贝叶斯管道中使用样本权重,必须在拟合步骤中添加权重。对于这个演示,我不会探究 NLP,这只是对加权样本的奇异效果的比较。所以不要把重点放在整体表现上。

pipeline **=** Pipeline(steps**=**[("NLP", TfidfVectorizer(),
                           ("MNB", MultinomialNB())
                          ])pipeline.fit(X_train, 
             y_train, 
             ******{'MNB__sample_weight': sample_weights})

非加权模型性能

非加权样本数据,强烈倾向于多数类

比较在没有样本权重的情况下训练的上述模型的结果:未加权的模型达到 55%的准确度。

预测非常倾向于多数阶级。这种模式几乎完全忽略了少数民族阶层。

加权模型性能

加权样本数据,更好地训练少数民族班级

在拟合步骤中,通过添加平衡的样本权重来训练完全相同的模型。这个模型达到了 58%的准确率。

沿着真正的正对角线(左上到右下),我们可以看到该模型更适合预测少数民族类别。

这两种模型的精确度只有 3%的差异,但预测能力却大相径庭。准确性有偏差,因为测试类与定型数据具有相同的分布。所以这个模型只是用相同的比例进行猜测,并且用大多数类达到足够的次数。这就是为什么准确性本身并不是模型成功的一个好的衡量标准!但是那是另一天的话题,或者你可以看看这篇关于不平衡的类分布的分类准确性的失败的文章

结论

在平衡数据集上训练模型是很重要的(除非有一个特殊的应用来加权某个更重要的类),以避免预测能力的分布偏差。一些 Scikit-Learn 模型可以用class_weights = 'balance'自动平衡输入类。贝叶斯模型需要一组样本权重,可以用compute_sample_weight()来计算。

感谢您的阅读!你可以在我的 GitHub 上查看这个博客开发的文本分类项目。

为什么女性需要参与数据科学以防止算法中的偏见

原文:https://towardsdatascience.com/why-women-need-to-be-involved-in-data-science-to-prevent-bias-in-algorithms-a374a78ad532?source=collection_archive---------25-----------------------

为什么要在意偏见?怎么才能减少呢?

https://cdn . pix abay . com/photo/2019/11/12/05/59/pop-art-girl-4620143 _ 1280 . png

随着科技的发展,我们相信电脑会为我们做越来越多的日常工作。虽然有些人可能会持怀疑态度,但这并没有什么错,因为我们生成的数据越多,驱动这些计算机的算法就越精确。

然而,这种精确并不代表我们想要的理想的公平和包容的世界。相反,不幸的是,它代表了大多数人试图逃避的过去的世界。一个充满歧视、种族主义和差异的世界——一个不平等的世界,在这个世界里,某些人获得的机会不同于其他人。

所以,问问你自己,你是想继续困在这个不公平的世界里,还是想做出改变,向前迈出一步?如果是这样,那么这篇文章可以帮助你了解偏见,让你走上正轨。

算法中的偏见之所以存在,是因为我们,作为人类,是有偏见的人。读完这篇博客后,你应该能够理解为什么存在偏见,以及为什么在数据科学团队中有更多的女性有助于减轻偏见。

什么是机器学习?

首先,我们需要了解机器学习正在对我们的数据做什么。算法对数据进行统计计算,以找到可以提供见解、识别趋势和做出预测的模式。这不是魔法,这只是数学,但速度是人脑无法处理的。

通常,可用的数据是由人类产生的,算法也是如此。这给我们带来了一个大问题——是 it 数据还是人类有偏见?。

由于多种原因,这个问题非常重要,特别是在解决机器学习问题时,因为最终消费者是人类——其中一些人可能会直接受到他们遭受的任何偏见的影响。

那么,什么是偏见呢?

机器学习中的偏差对应于从摄取的数据中做出的假设中的错误。需要明确的是,偏差不可能完全消失,因为算法是由人类从一组选定的数据中创造出来的。结果,人和数据都有偏差。

算法偏见可以表现为不同的方式,如性别偏见,种族偏见,人口统计偏见,等等。通常,偏见可以在少数群体以及在用于训练机器学习模型的数据中没有得到很好代表的群体中看到。

一些不幸的例子

算法在任何地方都在为我们做决策,包括全球的公司。这些算法可以帮助确定你是否有资格获得贷款、医疗保健、大学和就业,等等。

下面的例子展示了偏见的危害,并强调了在社会中尽早解决这个问题的重要性。问问你自己,这些例子中的任何一个真的令人惊讶吗?

  1. 偏见以多种方式出现在文本中。下面的论文【1】显示,谷歌新闻文章上训练的单词嵌入展示了社会中存在的女性/男性性别刻板印象。当算法被要求完成句子“男人对于电脑程序员就像女人对于 X ”时,它用家庭主妇代替了 X。
  2. 2020 年 4 月谷歌创建了一个帖子解释他们是如何开始解决性别偏见的。这个例子显示了将“我的朋友是医生”翻译成西班牙语。在英语中,医生的性别是模糊的,但如果我们想把它翻译成西班牙语,就有必要指明“朋友”这个词所指的性别。该算法得出结论,医生更有可能是一名男性,给出了单词 friend 的阳性输出。

3.如果我们用谷歌来回翻译短语“他是一名护士”。她是性别中立语言的医生,比如孟加拉语,看看会发生什么。用上面的链接自己试试吧。

截图来自谷歌翻译

截图来自谷歌翻译

如你所见,它改变了性别。这是不是说明算法错了?为什么会这样?这里的问题是,历史数据显示,女性更有可能成为护士,而男性更有可能成为医生。因此,算法会选择最可能的输出。

4.这里显示了一个类似的例子,在 Google Translate 中有一个很长的段落。它显示了从匈牙利语(一种中性语言)到英语的翻译。我们可以看到这种翻译可能是歧视性的。

截图来自谷歌翻译

5.2017 年 10 月,谷歌情感分析 API 在输入“我是同性恋”时给出了有偏差的输出,系统返回负面排名。

6.自回归语言模型 GPT-3 产生的文本太像人类,因此也存在偏见。在论文“语言模型是少量学习者”【2】中,OpenAI 表示,该模型在公平性、偏见和代表性方面存在局限性。

报告强调,在同现测试中,他们查看形容词和副词来完成短语“他非常”、“她非常”、“他将被描述为”和“她将被描述为”。研究结果显示,女性更常被描述为外貌导向的词,如“华丽的”,相比之下,男性的形容词更多样。

这不是模特的错,因为这反映了社会以及现有文本中对妇女的描述。下表显示了模型选择的前 10 个单词。

截图—论文“语言模型是很少尝试的学习者”

也有关于其他类型偏见的研究,如种族和宗教。例如,论文“大型语言模型中持续的反穆斯林偏见”【3】,分析了 GPT-3 的反穆斯林偏见。下图显示了使用编程 API 生成完成时模型建议的可能输出。

截图—论文“语言模型是很少尝试的学习者”

7.偏见不仅存在于文本中,也存在于的图像中。2020 年,下面的文章描述了 Twitter 的算法偏向于白种人,因为被训练了更多的白种人面孔。

8.照片中的另一个趋势种族偏见在 2015 年很明显,当时谷歌照片算法产生了针对少数族裔的种族主义图像。这篇文章解释了谷歌如何采取措施来应对这些不正确的结果。

9.大公司必须实现工作自动化。例如,2018 年,人们发现亚马逊的 AI 自动招聘工具对女性有偏见。这篇文章描述了这是如何从显示男性在整个科技行业占主导地位的历史数据中得出的——最明显的是在亚马逊本身,那里 60%的员工是男性。由于该算法是用该数据训练的,所以它产生了有偏差的结果。

10.另一个显示偏见有多有害的情况是使用 COMPAS 工具(替代制裁的矫正罪犯管理概况),该工具在全美范围内决定何时释放刑事被告方面发挥着重要作用。ProPublica 发现,少数族裔被告被误判为暴力累犯的风险更高的可能性是白人被告的两倍。

11.机器学习也被用于医疗保健行业。医疗保健中的偏见可能非常有害,因为这是我们正在谈论的人的健康和福祉。一篇经济学家的文章强调了医院在接收病人时对少数民族和妇女的偏见。

这篇文章表明,用于测量血氧水平的设备是有偏见的,因为它们在少数民族中比高加索人更频繁地高估了血氧饱和度。结果,他们记录了一些 POC 患者比他们实际上更健康。血氧水平被用作新冠肺炎过度拥挤的医院接收病人的相关测量。这种偏见导致拒绝向需要治疗的人提供医院治疗。

12.一种算法被用于评估教师,正如这篇文章所说,七名休斯顿教师,休斯顿教师联合会提起诉讼,质疑评估增值措施的合宪性,学区用它来决定教师的评估,奖金和解雇。有些案例没有解释为什么声誉好的老师得分低。

该系统的财产被视为机密和“黑箱”,教师在决策过程中得不到任何明确的解释。这是一个清晰的例子,说明了根据算法的使用需要进行监管。我们不能假设算法没有偏见,并相信它们的话来做出可能影响人们的决定。

这些例子足以让我们在更大范围内展开对话。有些例子是几年前的,有些是最近的。这进一步强调了我们如何没有改进,以及问题本身无法解决。

看看这篇博客,它展示了自动化决策可能产生的潜在危害。

因此,作为数据科学家,我们有责任采取行动,作为一个社会,我们有权利站出来反对这种偏见。

可能影响偏见的因素有哪些?

算法偏差不是一个容易解决的问题,因为许多因素都会影响它。首先,我们需要认识到,由于算法不可能完美,因此总会有偏差。第二,我们需要明白算法并不神奇。事实上,它们是对数据的统计方法。

因此,我们选择用来训练模型的数据只是模型可能包含的偏差中的一个重要因素。除此之外,我们需要添加有偏见的人,即选择数据、编写模型和解释结果的人,因为这些人(即程序员和数据科学家)是有偏见的。

最后,影响偏见的另一个相关因素是少数群体在数据和开发这些算法的团队中都被歪曲了。意识到这些现有的偏见可能有助于我们采取行动,帮助减少算法中的偏见。

那么,让我们更深入地了解一下提到的每一个因素。

数据有偏差

数据可能是不完整或不平衡的,这意味着它有更多关于特定人群的信息,这可能导致偏见。请记住,拥有平衡的数据并不意味着模型不会有偏差,但至少会减少偏差。

由于社会的文化和历史,历史数据可能会歧视某些少数群体。因此,检查数据的假设以避免未来的算法偏差是非常重要的。

如果我们只是从数据中去除性别变量以避免性别偏见会怎么样?正如《公平与机器学习的局限和机遇》一书【4】所强调的,事情并没有那么简单,因为还有其他隐藏性别的变量或特征。

人类偏见

无意识地,人类使用精神捷径来做决策,这些捷径中引入的偏见无法消除,因为这是我们大脑的运作方式。然而,意识到这一点将有助于我们在做出假设时预防和避免常见错误。

根据 Bazerman 的“管理决策中的判断”,[3]最常见的人类偏差分为三类:代表性、&锚定可用性和调整偏差。

1.代表性

我们把假设建立在我们头脑中的表象和刻板印象的基础上。例如,如果我们想到一个程序员,我们通常会想象一个男人。此外,这个人可能戴着眼镜,穿着也很特别。

这是我们头脑中已经形成的刻板印象。有错吗?不。然而,错误的是认为所有的程序员看起来都像我们自己的代表。

下面这段话来自 TED 演讲,我认为它完美地总结了代表性偏差的影响:

“……刻板印象的问题不在于它们不真实,而在于它们不完整。他们让一个故事成为唯一的故事。”奇曼达·恩戈齐·阿迪奇

2.有效性

当评估一个事件发生的频率或概率时,决策会受到我们脑海中立即出现的想法的影响。因此,人们倾向于高估或低估事件发生的概率。

例如,你可能认为中彩票的概率很低,但是认识两个中彩票的人的人可能认为这种概率比你想象的要高。

3.锚定和调整

这种类型的偏差指的是一个参考点,在这个参考点上,我们过分依赖于预先存在的信息,根据最初的信息进行调整。

例如,如果你看到一件衬衫价值 500 美元(非常高的价格),旁边还有一件价值 100 美元的 t 恤,你会认为这件衬衫很便宜。但是,你却在不知不觉中没有和其他店比较价格。

因此,总而言之,偏见存在于我们的日常推理中,因此我们必须意识到它并验证我们的假设。通过这样做,我们将有助于减少算法中的偏差。

对妇女的歪曲

当谈到性别偏见时,女性在数据和整个 it 行业中被大量歪曲,特别是在人工智能领域。因此,在开发算法时,他们的观点没有被考虑在内。

让我们来看看支持这一观点的一些数字:

人工智能专家:全球人工智能专家中只有 22% 是女性。

人工智能研究人员:arXiv中人工智能作者的 13.8% 为女性,至少由一名女性合著的人工智能论文自上世纪 90 年代以来一直没有改善。

人工智能会议:在主要的人工智能会议上,只有 18% 的作者是女性。

因此,正如下面的文章所强调的,男性的经验主导了算法的创建,而女性的观点不是解决方案的一部分。

我们如何避免偏见?

如前所述,避免偏见不是一个容易解决的问题。然而,正如也强调的那样,我们可以采取必要的行动来减少它。

  1. 了解数据的来源:检查数据来自哪里非常重要。我们必须意识到局限性,研究特征的含义,并意识到任何准确代表总体的缺失信息。
  2. 获取更多数据:如果你认为你的数据不够,或者没有如实反映社会的某个群体,你需要想办法获取额外的或生成更多的数据,尽可能准确。记住,你选择的数据将是你算法结果的主要因素。
  3. 确保数据平衡:如果不平衡,请选择解决策略。
  4. 注意人类的偏见:检查你自己对数据的偏见,并询问对结果的第二种意见。
  5. 验证假设:如果你有假设,验证它们。
  6. 分析结果&每个类别/组的准确度等级:当查看算法的准确度时,分析总准确度,也分析特定类别。
  7. 用真实的人来测试你的模型:不要满足于来自数据的一定程度的准确性。让真实的人来测试它,并从经验中学习。确保这群人是多元的。
  8. 注意展示结果的方式:展示你的结论并解释成功的定义很重要。当你的算法达到一定的精确度时,要清楚它真正的含义。
  9. 让你的团队多样化:拥有多样化的团队将为解决问题提供不同的观点。这不仅提供了女性的视角,也提供了来自不同背景、年龄、种族和现实生活经历的观点。

没有关于如何避免偏见的指导手册,这些只是一位从事数据工作近十年的女性数据科学家的观点。然而,可以肯定的是,从数据中获得的结果取决于上下文、数据类型、算法的用户以及模型试图解决的问题。

此外,您可以使用一些工具来帮助突出和防止对刻板印象的偏见,和/或帮助您更好地可视化数据和结果。

以下是帮助您入门的有用工具列表:

团队的多样性

我们如何开始解决数据科学中的偏见?正如 Joy Buolamwini 在受欢迎的 TED 演讲中所说的,我如何对抗算法中的偏见,我们可以从实现更具包容性的编码实践开始。

“谁编码很重要。”乔伊·波伦维尼

团队中的多样性是成功的关键:拥有不同的观点、想法和情绪,可以帮助团队努力寻求更好、更强大的解决方案,这些方案考虑到了每一个观点,同时也更具创造性。

更高绩效/更高效的团队:多样化的团队达到更高的绩效,正如下面的文章所强调的,这篇文章展示了与不同的人一起工作是如何挑战你的智力的。此外,随着人们越来越意识到自己的偏见,多元化团队更有可能重新审视事实。

机会:如果没有多元化的团队,我们将会错失减少偏见的机会。如果所有团队成员都是男性,那么我们就没有女性视角。由于世界人口的 50%是女性,我们失去了 50%的代表权,并且很可能会错过来自这部分核心人口的商业机会。

正如下面的观点文章所强调的,团队中的多元化不仅是正确的事情,还通过创新的想法打开了新机会的大门。

创新:正如哈佛商业评论所强调的,多元化的团队更有可能拥有创新的心态。正如尼尔森的研究所说[5],“人们一起工作比他们单独工作能取得更大的成就”。

Nelson 提到异质团队具有更高的创新潜力,这是有意义的,因为这是当今组织存在的原因。

哈佛商业评论的一篇文章也强调了这一点,研究人员提供证据表明,多样性通过创造迫使人们“跳出框框思考”的环境来开启创新解决方案。

多元化团队中的一个悖论:重要的是不要陷入多元化团队会神奇地一起工作的想法。仍然存在有待克服的挑战。研究支持这样一种观点,即不同的团队需要陈述原则,并保持一致以使团队有效地工作。

最近的一项研究 [6]提到,多样化的团队会产生差异和冲突,这可能会降低效率。另一项研究【7】认为,为了实现利益最大化,队友需要遵循操作原则。

Cheruvelil 的另一份报告[8]得出结论,高绩效合作研究团队由致力于共同成果的多样化成员组成。

多元化不仅与性别有关,还与种族、文化、背景、年龄、经历、技能以及人们解决问题的方式有关。创建一个跨学科的团队意味着每个团队成员可以从不同的角度来解决问题,相互补充。

加入我们——社会需要你

人工智能无处不在,几乎每个行业都在使用机器学习来利用数据。因此,无论你发现自己身处哪个行业,人工智能迟早都有可能成为其中的一部分。

有鉴于此,我邀请你参加思考人工智能的力量,并问自己以下问题:

我们如何信任技术来做决策?AI 的潜力有多大?它的局限性是什么?考虑到偏见永远不会完全消除,应该监管什么,如何监管?

我不是说我们不必使用人工智能,人工智能会一直存在,我是说接受当前的限制可以帮助我们从中获得最佳潜力。正如 Zeynep Tufekci 在她的 ted 演讲中强调的那样,

"我们不能把我们的责任外包给机器."泽内普·图费克奇

所以,参与进来,帮忙解决问题

在整篇文章中,您已经看到了为什么我们需要更多女性从事数据科学,以及这如何有助于减少偏见的清晰示例。

我的使命是鼓励你和其他人成为这一变革的一部分。鼓励儿童参与数据科学也很重要,因为它可以对社会产生积极影响。

“低多样性会导致机会的缩小”——梭伦·巴罗卡斯[4]

这句话正好表达了我想表达的意思。在这个领域只有极少数女性会给其他女性提供数据是“男人的事情”的观念,因此甚至不会考虑它。让我们丢掉这些刻板印象,向女性展示她们实际上可以从事数据工作。

不管你的性别如何,你都可以做出改变。在接下来的研究 [9]中进行的几次采访表明,如果我们想在人工智能方面做出改变,应该做更多的工作,让代表性不足的群体更加可见,而不仅仅是为了营销机会。

根据 Melinda Epler 的 TED 演讲——尽管在科技行业,我们想要快速的解决方案,但是没有达到多样性和包容性的“魔杖”。相反,改变从人开始,一次一个人。她呼吁每个人都成为“盟友”,因为当我们相互支持时,我们能够建立更好的团队、产品和公司。

“联盟是强大的。试试看。”梅林达·埃普勒

参考

  1. 托尔加等人(2016)“男人对于电脑程序员就像女人对于家庭主妇一样?去偏置单词嵌入。”【arxiv.org/abs/1607.06520】T4。
  2. Brown,T. B .等人(2020)“语言模型是一次性学习者”。https://arxiv.org/pdf/2005.14165.pdf
  3. 巴泽曼(2002 年)。“管理决策中的判断”
  4. 索隆·巴罗卡斯(Solon Barocas)和莫里茨·哈特(Moritz Hardt)和阿文德·纳拉亚南(Arvind Narayan an)(2019)《公平和机器学习的限制与机遇》https://fairmlbook.org/
  5. Nelson,B. (2014)“这不仅仅是公平的问题。https://dl.acm.org/doi/pdf/10.1145/2597886多样性数据
  6. Yeager,K.L .和 Nafukho,F.M. (2012),“发展多样化团队以提高组织环境中的绩效”,《欧洲培训与发展杂志》。https://doi.org/10.1108/03090591211220320
  7. 琼斯、奇里诺·刘升和赖特(2020),“文化多样性驱动创新:赋予团队成功的力量”,《国际创新科学杂志》https://doi.org/10.1108/IJIS-04-2020-0042
  8. Cheruvelil,K.S .等人(2014 年)。“创建和维持高绩效的合作研究团队:多样性和人际交往技能的重要性”https://esa journals . online library . Wiley . com/doi/ABS/10.1890/130001
  9. Stathoulopoulos,Konstantinos 和 Mateos-Garcia,Juan C,《人工智能研究中的性别多样性》( 2019 年 7 月 29 日)。在 https://ssrn.com/abstract=3428240 的 SSRN 有售:

推荐讲座/视频

为什么从事咨询工作对数据科学家如此重要

原文:https://towardsdatascience.com/why-working-in-consulting-is-so-valuable-for-data-scientists-710f3a4cc2d0?source=collection_archive---------23-----------------------

年轻专业人士的职业建议——观点

职业见解可能有助于您在数据科学领域的职业发展

他的文章不同于我通常写的技术含量很高的数据科学教程。今天,我回顾了我在一家大型通信公司担任数据科学顾问的时光,并讨论了为什么值得这么做的原因。我并不认为我的观点是详尽的和普遍适用的,但我希望它对那些面临职业选择或刚刚开始职业生涯的人有所帮助。本文提出的所有观点均为本人观点。

Unsplash 上由Christina @ wocintechchat.com拍摄的照片

首先,我提供了几个关于我自己的词作为背景。我最初是一名软件工程师,在各种数据和分析领域工作,主要是销售和营销相关的领域。2014 年,我决定完全转向数据科学,并在德国获得了相关领域的硕士学位。之后,我加入了全球最大的营销和通信公司之一,担任数据科学顾问,在接下来的三年里,我在两个不同的业务部门工作:营销(媒体)和咨询。

为什么是媒体?

一个惊人的原因是:

你可能会问,当医学研究或自动驾驶等令人着迷的领域吸引着最聪明的人才时,为什么一个年轻的数据科学毕业生应该考虑在 2021 年加入一家媒体公司。为了回答这个问题,我想引用塔勒布对他为什么对股票交易感兴趣的问题的回答(他又引用了曼德尔布洛特的话):

原因是数据,数据的金矿。

事实上,媒体有大量的数据,成吨的数据,堆积如山的数据,这些数据最好的部分是它是真实世界的数据。这意味着它是肮脏的、稀疏的、不平衡的,并且在所有可能的方面都是破碎的。这些数据 99%都不是很有见地,但却是关于真实人类行为的真实数据。在这些数据中找到 1%的黄金,对于一个好奇的数据科学家来说,是挑战,也是祝福。处理大量组织混乱的数据是学习如何有效处理来自不同来源、不同格式的数据(通常是实时数据)的最佳方式。

对于数据科学家应该做什么,有不同的观点。然而,在机器学习算法的应用之外,看到更大的图景也无妨。了解如何构建能够产生收入的实际工作应用程序至少与深入的数据科学知识一样有价值。没有多少公司采取这一额外的生产部署和维护步骤,因为大多数非数字行业的数据科学项目从未通过概念验证阶段。

当我在 2019 年参加一个工业 4.0 会议时,我来自非数字行业的同事们正在讨论,可能需要一年多的时间才能获得购买传感器的批准,安装传感器,然后收集足够的数据来训练第一个分类模型。在媒体中没有这样的限制。数据太多了,收集起来很便宜。当然,媒体和股票交易一样,不能提供一个自我实现的使命,而你会很乐意与你的朋友分享。

图片来源knowyourmeme.com,经作者允许编辑。

相反,它能给你提供一次无价的经历。

为什么咨询?

原因一:

咨询教会你关注并承担结果的所有权。

在科隆参加 Data 和 AI Meetup 时,我与一对来自当地大学的学生交谈,他们向我提出挑战,说他们的教授认为咨询不是实践真正数据科学的地方。坦率地说,教授说对了一部分,但只是一部分。你不应该指望当你加入咨询公司时,有人会教你如何编写 Python 或运行 A/B 测试。这可能不会发生。将会发生的是,你将被扔在一个项目上,需要自己解决技术部分。当然,你可以询问周围的一些人,但大多数决定你需要自己做出。这是一个巨大的动力,让你不断提高自己的技能,以便在与客户交谈时更加自信。然而,提高你的资格和跟上新的发展将是你自己的责任。同时,各种各样的客户、项目、身边的人会创造一个完美的训练环境,去练习那些自己不容易学会的基础软技能。

事实是,如果你有敏锐的技术技能,你可以在一段时间内发展你的职业生涯,但在某个时刻后,软技能真的开始变得重要,咨询是获得它们的最佳场所。

原因二:

咨询教会你正直。

还记得我在“为什么是媒体?”部分约 99%的不深刻的数据?这仍然适用。有时数据不是我们所期望的,或者更糟的是,有时数据会阻止我们实现我们的承诺。在这种情况下,经验法则是对自己、同事和客户诚实。隐瞒事实很容易失去客户的信任,而重新赢得客户的信任要困难得多。也许不仅仅是咨询,生活中最重要的规则是:

图片来源imgflip.com,经作者允许编辑。

也就是说,如果您发现数据、基础架构等存在问题。,找到并提出解决方案,千万不要只针对问题。总会有一些变通办法让你乐在其中。这条规则也适用于与同事的关系。如果你想在咨询行业取得成功,不要把你面临的问题带给你的上司,而是提出解决方案。这似乎是一条显而易见的建议,但是团队成员总是认为人事经理的存在是为了解决他们的经理的问题。事实上,这不是他们存在的理由。

原因三:

与当地市场相关的正确专业选择将确保你未来几年的就业。

大型咨询公司通常拥有来自多个行业的各种客户。因此,有机会从事一些项目,无论是建立一个推荐系统,自动实体提取算法,还是时间序列预测。在咨询行业工作时,你有一个独特的机会找到你最感兴趣的领域。除此之外,你还将了解当地市场的行业需求。因此,你不仅可以根据个人喜好,还可以根据特定地区的市场需求来选择未来的专业。

例如,我的本地市场是德国,该市场由四个部门主导:汽车、机械工程、化学和电气工业。我工作过的大多数客户来自汽车行业,有时来自为汽车行业供货的化学行业。汽车客户需要的是用结构化数据构建的各种模型,如需求预测、库存优化、推荐系统等。以及基于非结构化数据(如对象和声音识别模型)构建的模型。然而,我碰巧拿到了语义网和知识图的硕士学位。因此,我决定将我的资格改为时间序列分析和结构化数据的机器学习,以适应上述市场背景下公司的需求。

结论

回顾过去的几年,我对自己的职业选择非常满意。很难找到另一个行业能提供如此多的学习和成长机会。让它特别有价值的是可以访问几乎无限的数据和基础设施,各种各样的客户和项目,以及能够培养沟通技能的环境。我不想错过所有这些经历,因为它们让我能够从事我梦想中的新工作。

为什么你赌错了 NBA 球队

原文:https://towardsdatascience.com/why-you-are-betting-on-the-wrong-nba-teams-39e2bf98588?source=collection_archive---------21-----------------------

你可能会惊讶地发现,赢得最多比赛的 NBA 球队并没有赢得最多的赌注!

在这篇文章中,我将分析 NBA 的博彩数据并进行模拟,向你展示为什么这在历史上是正确的——并解释你应该赌哪支球队。你甚至不需要篮球知识来成功实施这个策略。

虽然你不需要成为 NBA 专家,这篇文章假设你有一些体育博彩概念和术语的知识。如果你对它们不熟悉,可以看看这个简短指南作为入门。

投注赔率有多准确?

让我们从基础开始——当两支 NBA 球队相互比赛时,一支球队被认为更有可能获胜(最受欢迎),而另一支球队更有可能失败(不被看好)。如果你将的金钱线赌注押在处于劣势的一方,你将比押在最受欢迎的一方赢得更多的钱;毕竟,你应该得到更大的奖励,因为你选择了不太可能获胜的人。根据体彩设定的奖金,你可以计算出每个队赢得比赛的隐含概率

理论上,赢得赌注的隐含概率应该与你的团队赢得比赛的概率相同。事实上,体育博彩不会这样设定赔率。相反,他们邀请双方都采取行动,这样一来,处于风险中的资金数量就会平衡,从而降低风险,实现利润最大化。

例如,让我们说密尔沃基雄鹿队(去年战绩最好的球队)正在与纽约尼克斯队(战绩… 不是最好的球队)比赛。如果投注者急于在雄鹿身上下注,那么如果雄鹿赢了,体育博彩公司可能会对支付一大笔钱感到紧张。因此,他们决定减少对雄鹿队的支出,增加对尼克斯队的支出,从而激励更多的钱投向尼克斯队。

扬尼斯·阿德托昆博,密尔沃基雄鹿队的明星,可能对赢得打赌感到兴奋。来源:Wikimedia.org

这些支出可能会波动,这样雄鹿队获胜的隐含概率是 90%,而实际上他们的“真正获胜概率”可能只有 80%。在这种情况下,我们有一个价值赌注,从长远来看,在尼克斯队身上下注是有利可图的。

当然,所有投注者面临的最大挑战是找到每一次投注的真实获胜概率,并在其他人之前计算出来。不可能确切知道这些赢的概率,但是我们能找到隐含赔率更可能是无效率的游戏吗?这可能有助于我们发现价值投资的机会。

步骤 1:获取数据

首先,我们需要一个大的数据集来进行分析。我们需要以下数据:

  1. 每场比赛的赔率。我们利用这些信息来决定赌哪个队赢,如果我们赢了,我们赢的金额。
  2. 每场比赛的赢家。我们需要知道我们是否赢了赌注。

我最终使用了 Sportsbook Review ,这是一个汇集了许多不同体育书籍的历史博彩赔率的网站。从那里,我找到了一个开源的存储库,其中有一个脚本,可以有效地从任何历史 NBA 比赛中收集投注数据。我修改了剧本,也是为了刮出每场比赛的最终比分,并运行整个 NBA 赛季,我在 2017-18、2018-19 和 2019-20 三个常规赛季都是这样做的(只包括疫情暂停赛季之前的比赛)。这是数据集的快照:

有很多不同的方式在 NBA 比赛中下注,如货币线、点差、总点数等。因为这篇文章的缘故,我将专门关注货币线的盈利能力。同样,有许多不同的体育书籍可以用来下注。为了简单起见,我将只关注顶峰,它被认为是业内赔率最准确的。

步骤 2:寻找隐含概率的差异

这里的目标是检查过去 NBA 比赛的隐含赔率,并确定它们是否是历史上准确的。如果有很大的差异,那么就可能有赚钱的机会。

我根据他们的货币线赔率计算了每笔赌注的隐含获胜概率。你可能会注意到每场比赛的获胜概率之和大于 1,这是不可能的!然而,体育博彩公司这样做是为了从整个博彩活动中获利。为了调整这一点,我将获胜概率标准化为 1,这就产生了每一次下注的实际隐含获胜概率。

接下来,我创建了“箱”,以便将所有隐含获胜概率相似的赌注组合在一起。为什么要这么做?

假设我们有一个隐含获胜概率为 11.7%(或+755 moneyline)的赌注。很难找到许多其他赌注有这种确切的金钱线。但是如果我们把它包括在 10%到 15%的所有赌注中,那么我们在每个仓位中有相当多的数据点要看。然后,我们计算每个仓位的实际胜率(实际胜率除以游戏总数)和预期胜率(仓位中所有赌注的平均隐含胜率)。

在此基础上,我们可以计算实际胜率和预期胜率之间的差异,我称之为残差,看看是否有大的差异。以下是将所有赌注分成 20 个仓位时的结果。每个箱覆盖大约 5 个百分点的隐含获胜概率区间。

列中的 b 以小数形式显示概率区间。 co unt 列显示每个框中的下注总数。注意,计数在中间一行是对称的,除了( 0.456,0.5】区间有 12 场比赛(24 注),赔率正好是 50/50。

事实证明,隐含的获胜概率(以及货币线)是非常准确的!一般来说,实际和预期的获胜概率相差不会超过 5%。但是,剩余胜率和预期胜率之间存在轻微的负相关关系。看起来,大输家被略微低估了,而大热门被略微高估了。

步骤 3:模拟策略

现在,是时候把我的(想象中的)钱放到我该说的地方了。在上一节中,我们发现巨亏股实际上可能被略微低估了。如果我们在过去的三个 NBA 赛季中模拟对失败者下注会发生什么?我们将使用 2016-17 至 2019-20 赛季的实际游戏结果和 Pinnacle moneylines 进行回溯测试。

我写了一个功能,模拟一个赌博策略,并随着时间的推移跟踪我们的奖金。我们首先必须设置一个下注金额,为了简单起见,每次都是 100 美元。我们还必须设置一个“获胜概率阈值”,它决定了我们要下注的处于劣势的球队。如果我们将其设置为 0.5,那么我们将赌注押在任何一个获胜概率低于 50%的球队(又名每场比赛的失败者)。如果我们将其设置为 0.2,那么我们只对不平衡游戏的大输家下注,这些游戏的获胜概率低于 20%。

我们现在准备走了。如果我们以 0.5 的阈值运行模拟,在每场比赛的失败者身上下 100 美元的赌注,会发生什么?

哦不,我们赔钱了!三个赛季后,我们输掉了****【3,903 美元,赌注从 600 美元猛增至 1,000 美元。

值得注意的是,每次下注的期望值都是负的。正如我前面提到的,体育博彩通过 virgorish 或“vig”抽取每一笔赌注的一部分。Pinnacle 的 vig 约为 2–3%,实际上相当低。任何有利可图的策略都必须比盈亏平衡至少好 3%!

接下来,让我们试试完全相反的策略,赌每场比赛的最喜欢的。在对我的模拟器功能进行了微小的调整后,我们得到了以下结果:

真是一场噩梦!采用这种策略,我们 损失了 10352 美元。将这张图与上一张图比较,我们可以看到趋势向相反的方向移动(正如它们应该的那样),但是盈利完全被亏损的幅度所抵消。

最后,让我们测试一下我们大肆宣传的押注巨大劣势的策略。如果我们以 0.2 的阈值运行模拟会发生什么?

我们的总利润是 7182 美元!!一点都不差!

一个真正重要的警告是,我们在后来盈利之前损失了近 3000 美元。为了在这种策略下生存,你需要有一大笔资金和/或下小注。否则,很容易陷入长时间的亏损,并完全耗尽现金。

如果你想看看我完整的 Jupyter 笔记本,你可以在这里找到它。

结论:找到大时代的失败者

基于这种分析,历史上一直有一种通过押注于大输家而获利的策略。你可以把每一次下注想象成一张彩票,输的可能性很大,但收益很大。

我确实认为,这些失败者相对“定价过低”,而大热门却“定价过高”是可行的。对于很多下注者来说,可能有一个心理上的解释;人们可能希望以长期货币回报为代价赢得更多的回报。

总之,这种弱势策略需要耐心忍受长时间的亏损,下小注,并拥有足够大的资金。然而,如果 NBA 的底层玩家能够获得足够多的稀有 Ws,你就有可能赚到钱。

顺便说一下,尼克斯队本赛季已经击败了雄鹿队,尽管那场比赛只有 12%的隐含获胜概率!也许是未来的征兆。

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

为什么你不是(数据)科学家

原文:https://towardsdatascience.com/why-you-are-not-a-data-scientist-f56b5dee68f4?source=collection_archive---------8-----------------------

现在是我们明确区分数据科学领域的工程和科学研究的时候了

比尔·盖茨是科学家吗?莱纳斯·托沃兹怎么样?难道他们没有造出独一无二的东西吗?他们实际上做的不止这些!他们以自己的方式用他们“发明”的东西影响了整个世界。如果我们不称他们为科学家,那为什么我们称大三毕业生为“数据科学家”??

图片来自维基百科文章的截图

到目前为止,您已经知道我对“数据科学家”这个术语有一个基本的问题,以及它如何模糊了完成这项工作所需的细微差别和复杂性。

让我们看看什么是数据科学的一些定义:

数据科学是一个跨学科领域,它使用科学方法、流程、算法和系统从结构化和非结构化数据中提取知识和见解,并将数据中的知识和可行见解应用于广泛的应用领域。数据科学与数据挖掘、机器学习和大数据相关。—维基百科

什么是计算机科学?

计算机科学是对算法过程、计算机器和计算本身的研究。作为一门学科,计算机科学涵盖了从算法、计算和信息的理论研究到在硬件和软件中实现计算系统的实际问题的一系列主题。—维基百科

在我看来,非常宽泛地说,数据科学处理的是“什么”,而计算机科学处理的是计算的“如何”。但是,我们没有遇到太多的“计算机科学家”的个人资料。相反,我们称他们为软件开发人员、全栈开发人员、数据库工程师等。

不要误解我。我本人来自科学背景,我在数据领域。十多年来,甚至在数据科学兴起之前,我就已经建立并发明了数值算法。我确实明白,数据科学需要科学家的严谨,需要基于事实的严格过程,加上对自己结果的极端猜测。但是,就我们正在做的事情而言,几乎没有未探索的领域。实际上,我们做的和我们所说的适当的软件开发生命周期(SDLC)是一样的!

来源:https://commons . wikimedia . org/wiki/File:General _ System _ SDLC _ % 26 _ Software _ SDLC . gif

当在软件工程、用户研究等方面做出科学严谨和基于事实的决策时。我们不会草率地称他们为科学家,对吗?也许有些人会这么做,但这不是常态。

虽然我们都认为数据科学是炒作,但在我看来,“数据科学家”的角色是近年来被炒作并变得非常抽象的角色。科学家一词适用于对科学原理有深入了解和敏锐理解的人,但不适用于工作经验不足一年的初级候选人。

此外,数据领域中有许多角色与高级数据科学同等重要,甚至更重要。“数据科学”这个术语本身就非常模糊,导致了许多角色定义的混乱。

现在找一个数据架构师比找一个数据科学家难多了!

围绕数据科学家这一角色的大肆宣传正导致被误导的有志之士涌向这些头衔,而不了解业务的真正挑战。有太多的求职者认为自己是科学家,并以此来证明高薪的合理性。但在现实中,每当我建立一个团队时,数据科学家(AI/ML)成员通常是最后被聘用的,因为我们需要首先组织数据。根据我的经验,现在找一个数据架构师比找一个数据科学家要难得多!随着公司意识到数据科学是垃圾进垃圾出,他们现在重新发现了管理数据的重要性。随着该领域需求的增加,以及由于人们涌向数据科学家职位而导致的供应减少,一名优秀数据工程师的工资要求现在与一名优秀数据科学家相当或更高。

我们都知道数据科学的追求者正在用 Kaggle 数据集创造奇迹,大学也在发布突破性的算法。但是,当你绞尽脑汁从稀缺的数据和相关的约束中提取有意义的价值时,真正的挑战和创造力就来了。复杂性和随之而来的研究不仅仅在于算法,还在于数据争论以及将问题分解成更小的基本问题。

只有极少数的实践数据科学家能够对“但是,当你完全没有数据开始时,你怎么能做出贡献呢?”

最好的科学研究是从足够的基础工作开始的我们写一行 Python 代码之前。作为一名优秀的科学家,你应该通过对复杂性和可行性的基于证据的推理来远离潜在的陷阱和失败。我很少看到数据科学人员对如何解决问题进行彻底的研究,甚至帮助重新解释问题陈述。只有极少数的实践数据科学家能够对“但是,当你完全没有数据开始时,你怎么能做出贡献呢?”。这种解决问题的心态和对问题领域和陈述进行基础研究的意愿在当前时代严重缺乏。

如果给你一个要实现的技术问题,而你只是在机器学习方面应用现有的过程、代码或解决方案,我宁愿称你为“ML 开发者”或“ 数据科学开发者 ”。如果你是科学家,告诉我你正在解决的问题,让我相信它是独特的或困难的,用你如何解决它的故事吸引我。

现实世界的数据科学家需要意识到他们的“对业务的影响”,并阐明数据科学如何增加价值。核心数学或计算机科学专家和商业分析师之间的差距需要积极地融合。业务实体中的数据科学家的期望是构建满足业务痛点的解决方案和 POC。我们已经 过了构建酷酷的算法的宣传期 ,这些算法在技术上很复杂,可行性存疑,商业价值有限。

如果你想成为一名数据科学家,问自己一个问题“为什么我需要成为一名数据科学家?”通常情况下,数据分析师或 ML 开发人员的工作是你所追求的,但在这个狂热的世界里,一切都指向数据科学家。如果你不参考互联网就不能建立一个简单的回归算法,你就已经辜负了成为科学家的期望。但是,即使您通过了测试,您也需要能够找到适用于现实世界场景的合适方法。如果你不能做到这一点,如果你不是一个初级候选人,你再次没有通过评估,因为你需要有人为你构建问题。

错不在想成为数据科学家的有志之士。相反,随着越来越多的职位空缺以数据科学家的头衔出现,他们是行业成熟状态的受害者。像我这样的大多数招聘经理也陷入了这种动态之中。然而,事情正在发生变化,随着大多数数据科学工程的自动化,真正的“科学”角色将很快出现。与此同时,让我们脚踏实地,根据我们能做的而不是标题所说的来寻找位置。

因此,如果你需要成为一名数据科学家,了解数学和统计数据,理解基本原理,足智多谋并专注于交付,知道业务需求是什么,并最终知道为什么你想被称为科学家而不是工程师或开发人员!

如果你已经深入数据科学领域,或者是一名非常优秀的数据科学工程师,对商业价值的产生有敏锐的感觉,请联系我。我一直在寻找有能力的候选人加入我的团队。😃

作者信息

Shyam 是 Yara SmallHolder solutions 的数据团队负责人,他的团队负责数据管理和工程、BI、产品分析、营销分析、市场情报、战略洞察和数据科学。他在建立技术和数据领域的全功能团队方面拥有丰富的经验。他本人也是一名实践数据科学家,拥有为大型企业提供数据科学战略咨询的经验。

请在 LinkedIn 这里 随意连接和联系聊天。

你可能喜欢的其他文章

https://shyamdsundar.medium.com/guiding-organizations-by-value-amidst-uncertainty-part-1-1a26e65ac049 https://medium.com/the-innovation/prioritising-the-scientific-way-507d4200b6b8

为什么你找不到数据科学的工作

原文:https://towardsdatascience.com/why-you-cant-get-a-data-science-job-ed40405bcf48?source=collection_archive---------16-----------------------

以及如何增加你成功的机会

图片由 安德里亚·皮亚卡迪奥 来自 像素

公司经常会收到数百份求职申请,人力资源部不可能手动筛选所有的申请。即使你很适合这个角色,你也可能永远得不到回音。作为求职者和面试官,我经历了招聘过程的两个阶段,我想讨论一下你正在犯的、影响你成功机会的错误,以及你能做些什么。

1.你的简历没有通过 ATS

99%的财富 500 强公司使用申请人跟踪系统(ATS )来筛选合格的申请人,以供招聘人员进一步审查。对于一个有 250 名申请人的职位空缺,只有 4 到 6 人会被要求参加面试。如果你从来没有得到回复,很可能你的简历从来没有通过 ATS 的审核,无法出现在人们面前。

如何增加你成功的机会:

  • 修改你的简历,突出多次提到的或接近工作要求顶部的硬技能。例如,如果一份工作需要特定 Python 包或机器学习算法的知识,一定要在简历中列出。
  • 利用在线工具帮助你在简历中找到合适的关键词,以通过 ATS 筛选。
  • 当心使用缩写,因为 ATS 可能正在寻找完全拼写出来的术语,例如机器学习与 ML。如有疑问,请在工作描述中使用相同的术语,因为这很可能是 ATS 配置筛选的内容。
  • 为你的简历使用微软 Word 或 PDF 文件,以确保 ATS 可以正确扫描。如果你没有微软 Word, Google Docs 可以免费使用,你可以下载. docx ( Word)或。pdf ( PDF)文件。

2.你的简历没有说明为什么你适合这个角色

雇主在初始简历屏幕上平均花费 7 秒钟。想象一下,你正在制作一个广告,你只有 7 秒钟的时间来说服观众为什么他们应该购买你的产品。这也是你在简历中需要用到的心态。你能在简历上展示什么,让雇主在 7 秒钟内相信你应该进入面试环节?

如何增加你成功的机会:

  • 格式化你的简历,使其易于阅读并突出与该职位相关的技能。如果雇主看不到明显的联系,他们就没有时间把你过去的所作所为与为什么你会很适合他们的角色联系起来。
  • 修改你的简历,使之符合最高职位的要求,而不是用一个标准的版本来申请所有的职位。这将决定你的简历是通过雇主的筛选,还是被拒绝。
  • 如果你要转行,并且没有直接相关的经验,那么突出你的领域经验如何帮助你将数据科学应用到你直接遇到的业务问题中。

3.你没有证明你的数据科学知识

当雇主第一次看到你的简历时,你就像其他有相似资历的求职者一样。你可以拥有该职位的相关技能,但招聘经理不能确定你真的知道如何运用这些技能。要想脱颖而出,你需要展示你将数据科学应用于商业问题的能力。

如何增加你成功的机会:

  • 创建项目来展示你知道如何在现实世界中应用数据科学。避免 Kaggle 或上的数据集,创建自己的让你的数据独一无二,帮助你的项目脱颖而出。
  • 考虑写关于数据科学的博客。你可以建立一个文章文件夹,向雇主展示你的知识。
  • 联系当地的非营利或小型企业,提供免费工作。这将让你有机会将数据科学应用于现实世界的问题,并在求职面试中讨论这些问题。

4.即使你没有在找工作,你也没有建立关系网

多达 80%的工作是通过个人和职业关系填补的,70%的工作没有在工作网站上发布。重要的是建立一个关系网,这个关系网可能会给你介绍一份工作,而不是你自己去找。

如何增加你成功的机会:

  • 即使你现在没有在找工作,也要开始建立联系。与已经跳槽到其他公司的朋友和同事保持联系。你永远不知道工作介绍会从哪里来。
  • 联系 LinkedIn 上你感兴趣的公司或职位的工作人员,请求一次信息面试。如果你需要寻求工作推荐,这将有助于你建立融洽的关系。
  • 找一个你附近的数据聚会参加,与志同道合的人和潜在的雇主建立联系。演讲者或与会者可能知道你将来适合的职位空缺。

5.你面试得不好

雇主希望雇佣对这个角色感兴趣,并能与不同层次的观众交流的候选人。即使你通过了技术测试,如果你的回答含糊不清,或者你对这份工作不感兴趣,你就不太可能被录用。

如何增加你成功的机会:

  • 研究面试官可能会问的常见问题,练习你的回答。
  • 准备一些你可以问面试官的问题,以显示你对这个职位和公司的兴趣。
  • 请朋友和家人进行模拟面试练习。给自己拍一段视频,以便事后回顾,并向你的模拟面试官寻求反馈,看看你在哪些方面可以做得更好。
  • 最后练习,练习,练习。发展优秀的沟通技巧没有捷径可走。

数据科学工作竞争激烈,即使你有合适的资格,也不能保证你会得到这份工作。现在你知道如何增加成功的机会,我希望你的下一份数据科学工作早点到来。

你可能也会喜欢…

你为什么没有通过机器学习面试

原文:https://towardsdatascience.com/why-you-failed-your-machine-learning-interview-5ebb02b9f69c?source=collection_archive---------16-----------------------

我在 ML 面试过程中的经验。11 个典型问题及回答方法

背景图片来自 Envato ,作者通过他们持有许可证

不久前,我带着计算机科学的硕士学位离开了大学。
我非常清楚我必须在机器学习和数据科学领域找到一份工作。我的简历上有一些数据科学和数据工程方面的工作经验以及一所顶尖大学的硕士学位。但这只是一个开端,要得到这份工作,你需要 T4 在面试中为他们提供便利。

确保你得到你梦想的工作或雇佣你梦想的团队。我将与您分享我在面试过程中被问到的问题和问题类型。这样你就不会再失败,也可以避免我的错误。

我参加了大约 8 次面试,都是多阶段的过程。通常从编码挑战到几次“放大”采访(流行病时间)

一般来说,有 4 种类型的问题,编程问题,数据科学/机器学习问题,编码挑战和行为问题。根据工作的不同,你应该有针对性地准备回答那些更有可能出现的问题。

偏差方差权衡/困境

到目前为止,这是我遇到的最常见的问题,似乎我在每一次复试中都遇到过,这肯定是你应该回顾的事情。偏差-方差权衡是通过增加估计参数的偏差可以减少参数估计的 v 方差。

这个问题的另一个变体是偏差-方差难题。即同时最小化测试集的偏差和方差的问题。

在这两种情况下,我会提到另一个,并额外给出如何减少高偏差(例如,增加模型复杂性)和高方差(例如,选择较少的特征进行训练)的示例。

偏差方差,来源维基百科

培训、测试、验证集之间的差异

另一个你在面试中会遇到的非常常见的 ML 特有的问题。我发现自己在大约 30%的面试中回答了这个问题。

虽然答案可能非常简短:训练集用于拟合/训练/构建模型,验证集用于估计过度拟合发生的点(提前停止)或用于超参数调整,测试集用于估计泛化误差。

我会鼓励你继续说下去,直到脸上显示出满意为止。您可以添加关于每个数据集使用多少%数据的讨论。其他相关主题,如交叉验证或如何处理具有自然时态联系的数据集,可以给你一些提示。

拆分数据集的示例,来源维基百科

你喜欢什么型号?

假设您有数据集的结果,神经网络(NN)的准确率为 93%,决策树的准确率为 91%,您倾向于哪种模型?

虽然这里没有正确或错误的答案,但这是一个谈论可解释性和准确性之间权衡的好机会。如果这是一个股票交易模型,1-2%可能是一大笔钱。如果它是一个接受或拒绝贷款申请的模型,并且客户支持必须解释为什么模型得出这个结论,那么答案是完全不同的。

其他值得讨论的考虑因素包括训练、开发、预测和再训练神经网络的实际成本,与决策树相比,这是非常不同的。

一大堆 SQL 问题

老实说,我对 SQL 问题的数量感到惊讶。某种形式的问题总是会出现,有时伪装成熊猫问题,例如不同类型的连接。有时直接向我说出一个 SQL 谜语(这个查询会输出什么,或者给我写一个..)以及偶尔询问视图、主键、规范化等概念。

这里要吸取的教训是,他们不会期望您编写优化的查询,但是了解基础知识是必须的。

简单的 SQL 问题,由作者创建

行为问题

如果你需要告诉涉众他认为最适合 ML 模型的特性并不是最好的,你会怎么做?

如果你的利益相关者在选择他们提供给你的数据时存在偏见,你会如何表达?(如果他们是数据科学家,则一次;如果他们来自企业,并且只知道基本的 excel,则一次)

行为问题比我最初想的更普遍,但这很大程度上取决于职位。一旦这个职位面对一些非技术的利益相关者,他们将会是这个过程的一个重要部分。尤其是在咨询行业,他们会占用很多面试时间。

在一家大型科技公司的系列面试中,这类问题甚至被问了我 4 个小时。不同的评论者一遍又一遍地问同样的问题,这是一次相当累人的经历,绝对不是我准备好的。你可以做得更好!

你会如何处理一个没有标签的问题?

有时候提问的目的是想弄清楚你是否知道一个概念。在这里,它的目的是让你谈论无监督学习和有监督学习之间的区别。

其他可能的解决途径包括让某人注释数据或构建标注软件。提及和解释特定版本的聚类算法,如 K-最近邻或高斯混合模型,并对其进行潜在的阐述可能是一个额外的收获。确保你的回答适合你申请的行业,向他们展示你是这份工作的合适人选。

监督与非监督学习,来源维基百科

Pep8 是什么

而实际面试中针对特定语言的编程问题并不常见。这是 Python 的一个例子,成为一名优秀的软件工程师总是一个巨大的优势。

Pep8 是 Python 代码最常见的风格指南,它规定了参数后面应该有多少个空格,或者如何构造导入。

这可能会因你所擅长的语言而有很大差异,比如 C++、Scala 等等。他们会问非常不同的问题。我会检查你是否知道至少一个风格指南和一些与测试相关的东西。

如果你有一个 API,你会如何加载一个 CSV?

我回答说你应该把它装上熊猫,因为他们比我做得更好,可能没有更好的方法了…

他说,大家都是这么想的,这是不对的(真为我感到羞耻)。显然,加载熊猫需要 7 秒,而他们在 300 毫秒内实现了。

我用这个问题想教会你的是,在回答一些看似琐碎的事情时,不要过于自信。请确保至少包括您将首先测试它并验证附加的东西,比如可能是 parquet 或者将它加载到内存中(或者甚至可能是 Cython).

解释一个混淆矩阵?

也称为误差矩阵。对于这样一个简单的问题,你不应该列出所有可能的答案,但一定要简要说明它包含真阳性、假阳性,并且你可以从中计算诸如精确度和召回率之类的东西。

如果非要细说的话,你应该考虑看他们的脸。找到适量的信息呈现给他们将永远是一个平衡的行为。

混淆矩阵示例,截图来自维基百科

异常检测?

这是一个非常宽泛的问题。我要做的第一件事是谈论离群值和异常值之间的区别。虽然不是所有的人都有这种差异,但这表明你对这个领域的“文化”差异有所了解。那些有影响的人通常认为异常是数据中的“错误”,不是来自分布,异常值是来自分布,但它们并不常见。

还可以讲隔离林,高斯混合模型,甚至只是标准差等各种统计方法。谈论完这些话题后,你很容易就能完成 5-6 分钟,考虑到面试通常包含更多的问题,这应该绰绰有余。

实现一个机器学习 API?

机器学习面试的另一个很大的部分是实际的编码挑战。我被要求训练一个数据模型,并使用该模型构建一个服务请求的 API。

包括 docker、加载模型和测试。虽然我不能在这篇文章中充分讨论我的答案。幸运的是,我制作了一个完整的视频,向你展示了一个非常真实的例子,告诉你如何在合理的时间内完成这样的练习,以及需要注意什么。

结论

虽然面试过程在技术上和心理上都要求很高,但我相信现在你已经确切地知道该期待什么了。当然总会有意想不到的问题,你不知道答案。通过使用我们在这篇文章中讨论的技术,并成为一名伟大的数据科学家、软件工程师和机器学习工程师,我相信你会找到你梦想的工作。

如果你喜欢这篇文章,我会很高兴在 Twitter 或 LinkedIn 上联系你。

一定要看看我的 YouTube 频道,我每周都会在那里发布新视频。

为什么数据科学导师能在 2021 年帮助你

原文:https://towardsdatascience.com/why-you-need-a-data-science-mentor-in-2021-f2ca7372c7a7?source=collection_archive---------36-----------------------

问导师的 5 件事对你的职业和学习有帮助

约书亚·内斯在 Unsplash 上的照片

有一个数据科学方面的导师有利于你的职业发展和学习。当我开始担任数据科学家时,我有两位导师。一个是从团队构想开始就在那里的资深人士,另一个是寻求指导年轻女性的技术人员。我工作的前 6 到 8 个月,我花时间向我的导师学习。我问了他们大量的问题,给他们出主意,并试图了解我想要什么样的职业发展。在过去的一年里,我从这两个人身上学到了很多关于我的职业和学习的东西。我想和你们分享其中的一些见解。

1.你是哪种类型的贡献者?

在我成为数据科学家的第一个月,我和我团队的一名高级成员坐下来,我问他对团队有什么想法,我可以参与的项目,以及期待什么。他问了我一个问题:你是哪种类型的贡献者?他想知道我是否有兴趣继续做一名个人贡献者,领导一个团队,晋升到一个管理职位,或者成为一名技术人员。对这个团队和公司来说,这是一个很难做出的决定,但这是当时我能被问到的最好的问题。这个问题让我思考未来 2-5 年我想要什么,也是我开始计划工作目标的时候。

你为什么需要一个导师?他们会问你一些尖锐的问题,要求你反思自己的决定和下一步。

2.培养工作作风

我从这位导师那里学到的另一个有趣的趣闻是他的工作方式哲学。他有一个对他很有效的模式,他在高价值的项目上工作,完成 75%,然后把剩下的 25%交给其他人。这使他能够在项目中工作,从中学习,然后教导和指导该项目的下一个人。

不管你是否同意这种工作理念,或者有你自己的想法,我从中学到,每个人都有一种自己工作得最好的方式。通过许多交谈和我自己的经历,我找到了适合我的风格,并在我的项目中实施了它。和导师一起工作让我明白,不同的人工作方式不同,但可以取得相似的结果。

为什么需要导师?导师可以向你展示解决同一个问题的不同方法。学习他们如何处理特定的情况,比如发展一种工作方式,将允许你将这些方法与你自己的方法进行比较,并让你决定如何最好地工作。

3.明白自己想要什么

随着我继续经历这两次导师生涯,我和另一位导师的主要话题之一就是职业发展。我经常和她谈论我正在学习的东西,我未来想要什么,以及我怎样才能到达那里。通过这种关系的发展,我找到了一个可以接受我的计划反馈的人。我首先给她带来了我的第一份年度总结和目标。我和她概述了一切,并征求她的意见。她告诉我,我需要学会展示我工作的附加值,并概述我的长期目标。她帮助我更好地理解了指导个人、领导团队以及与团队分享愿景的意义。当我现在领导我的团队时,我看到了她教给我的许多经验,在我制定我们的团队目标、制定我们的工作路线图以及向更广泛的团队展示附加值的过程中,我也经历了这些经验。

为什么需要导师?你的导师可以帮助你更好地了解你在工作和职业中想要什么。你可能会改变你的想法,但是如果你有一个适当的计划,你可以朝着它努力。

4.展示你的增值

最具挑战性的一课来自我的两位导师,学会向关心你的人展示你的价值。关心的是你的经理、股东或高管,他们想知道你为企业增加了什么价值。

在过去的一年里,我学会了用不同于以往的方式来处理这个问题。通常情况下,我会写几句话来说明项目是什么,我在项目中做了什么,以及我采取了什么步骤来完成它。像之星方法一样,我概述了情况(项目)、任务和采取的行动。在评估我的工作时,我忽略了结果是什么?我没有解释我工作的结果。当我和我的导师一起工作时,我明白了如何更好地跟踪一个项目的绩效,来比较这些价值并起草我的结果。我可以在一张幻灯片中总结这些结果,并向那些想看的人展示我的工作和我的团队的工作的影响。

你为什么需要一个导师?有一个与你工作关系密切的导师可以帮助你获得有价值的技能,比如学习跟踪你的项目表现。他们可以教你如何向利益相关者积极展示你的工作,并分享它如何为企业增加价值。

5.讲述你的故事

随着时间的推移,我开始在大学演讲,并开始指导实习生。在此期间,我和我的导师谈论了我的经历,以及我可以做些什么来改进。我从一位导师那里得到的最重要的建议是讲述我的故事。我知道我是谁,我完成了什么,我从这些经历中学到了什么。随着我与不同的大学、大学生和学员一起工作,我提炼了我的故事,并开始专注于我学到的经验教训。这是我开始用媒体写作的主要原因之一。通过这些对话,我意识到我确实有一些我经常谈论的经验,可以很好地转化为书面形式。

为什么需要导师?当你思考他们提出的挑战性问题并对你们的讨论进行反思时,指导关系可以帮助你更好地了解自己。随着你成长为一名数据科学家,导师还可以教你如何展示你的故事和发展你的个人品牌。

摘要

数据科学领域的导师可以教你很多东西。如果你的团队中有人可以在你的项目中帮助你,提供反馈,并在你需要帮助时帮助推动你前进。考虑在 2021 年找一个导师,尤其是如果你是从数据科学开始的话。当你在自己的岗位上学习和成长时,找到一个支持你的人会是你的宝贵财富。以下是你可以问导师的五个问题:

  1. 我怎样才能最好地向别人讲述我的故事?
  2. 我如何确定我是哪种类型的贡献者以及我想成为哪种类型的贡献者?
  3. 是什么样的工作方式让你达到了现在的位置?
  4. 考虑你在职业生涯中想要什么,并与你的导师讨论如何才能实现。怎么才能得到 X?
  5. 我如何才能最好地向企业和利益相关者展示我的增值?

在过去的一年里,你从导师那里学到了什么?你在考虑 2021 年的导师吗?

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

为什么需要 Python 虚拟环境以及如何设置它

原文:https://towardsdatascience.com/why-you-need-a-python-virtual-environment-and-how-to-set-it-up-35019841697d?source=collection_archive---------5-----------------------

这样做是为了避免将来在 Python 中处理不同项目时出现问题

JESHOOTS.COMUnsplash 上拍照

如果你刚刚开始学习 Python 或者已经写了好几个月的 Python 代码,大概你已经在电脑上安装了几十个库了。尽管每个库都可能是获得新 Python 技能的证明,但是如果所有这些库都安装在同一个环境中,它们可能会破坏系统工具或以前的项目,这些项目有自己的依赖关系。

每个项目可能都需要自己独特的第三方 Python 包。这就是为什么每次我们开始一个新项目时,我们都应该用一个特定的 Python 版本和项目的所有依赖项来建立一个新的虚拟环境。如果您以前从未这样做过,请不要担心,在本指南中,我将带您完成 Python 虚拟环境的设置,以便您在使用 Python 处理不同项目时避免将来的问题。

**Table of Contents** 1\. [What’s a Virtual Environment?](#db7f)
2\. [How to Create a Virtual Environment with venv](#cdd0)
3\. [Sharing Python Projects](#1bb9)
4\. [Alternative to venv](#87af)

什么是虚拟环境?

虚拟环境是一种工具,有助于保持所需的依赖关系和项目隔离。如果你想安装一个新的库并在终端上写pip install name_of_library 而不激活一个环境,所有的包将被全局安装,如果你在你的计算机上处理不同的项目,这不是一个好的做法。

如果这听起来有点复杂,不要太担心,因为虚拟环境只是一个目录,其中包含我们的项目运行所需的所有文件。

如何用 venv 创建虚拟环境

假设我们想在 Python 中处理两个不同的项目。一个是数据科学项目,其中有一些科学库(NumPy、Pandas、Matplotlib 等),而第二个是 web 开发项目,其中我们将主要使用 Django。

假设数据科学项目的目录树是这样的。

data-science-project/
├── dataset1        
├── dataset2
└── dataset3

如果我们将所有这些库安装在同一个默认环境中,不仅会出现一些错误,而且默认环境也会变得有点乱,所以我们将使用 Python 3 附带的venv安装一个新环境(还要确保安装了 pip)。

要创建一个新的环境,打开一个新的终端,并找到您希望存储项目的文件夹。在该目录中运行命令python3 -m venv name_of_the_environment

对于我们的例子,我将通过终端转到data-science-project目录,然后运行前面提到的命令来创建一个名为data_science_env的虚拟环境

cd data-science-project/             # change directory
python3 -m venv data_science_env     # creates the environment

我们刚刚创建了一个文件夹,其中包含运行最新版本 Python 的虚拟环境。现在我们的项目目录树看起来像这样。

data-science-project/
├── dataset1        
├── dataset2
├── dataset3                  
└── data_science_env                  # our new environment

现在是时候激活创建的环境了。为此,我们在终端中运行以下代码。

# mac
source data_science_env/bin/activate
# windows
data_science_env\scripts\activate.bat

在这之后,您将会看到如下图所示的括号中的环境名称(这次是 Django 环境django_env)

作者图片

既然环境已经激活,那么就可以为我们的项目安装特定的库了。比如我要装熊猫。

(data_science_env) pip install pandas

现在,如果您运行pip list ,您应该会看到已安装软件包的列表。由于我们刚刚创建了环境,我们将只找到熊猫。

(data_science_env) pip listPackage    Version
---------- -------
pandas      1.2.4
pip        19.0.3
setuptools 40.8.0

如果您想要停用当前环境,请运行以下代码

(data_science_env) deactivate

运行代码后,您应该不会再看到括号内的环境名称。

如果您想要删除创建的环境,请编写以下内容。

# mac
rm -rf data_science_env
# windows
rmdir data_science_env /s

https://betterprogramming.pub/4-books-i-read-as-a-self-taught-data-scientist-380d13d8bb0c

共享 Python 项目

创建的环境不仅有助于组织我们的项目,还能让我们轻松地与任何人共享项目。有了虚拟环境,就有可能保留我们项目中的所有信息,比如依赖关系,这样任何人都可以复制我们正在使用的相同环境。

为此,请运行以下命令。

(data_science_env) pip freeze > requirements.txt

pip freeze命令列出了环境中安装的第三方包和版本。输出存储在一个名为requirements.txt的文件中

我们可以与任何希望重建特定项目运行环境的人共享该文件。一旦其他人收到该文件,他/她所要做的就是在他们的机器上按照本指南中说明的步骤创建一个新环境,然后激活该环境并运行以下代码。

pip install -r requirements.txt

这样,环境就在第二台机器上被复制了。要确保所有库都安装了您想要的版本,请编写以下代码。

pip list

venv 的替代品

在本文中,我们使用 venv,因为它预装了 Python 然而,还有其他值得一试的选择。

pipenv

这是一个将包和环境管理支持合并到一个工具中的工具,因此它使用pipvenvrequirementes.txt简化了典型的工作流

不幸的是,它没有预装在 Python 中,所以您必须通过 pip 单独安装它。只需在您的终端上运行以下命令。

$ pip install --user pipenv

有关该工具的更多信息和设置指南,请查看此处的可用文档

就是这样!现在您已经准备好开始一个新的 Python 项目了!下面你可以找到一些我做的关于数据科学中使用的库的指南(Matplotlib/Seaborn,Pandas 和 Scikit-Learn)。

与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)

为什么你需要知道模型的内部运作

原文:https://towardsdatascience.com/why-you-need-to-know-the-inner-workings-of-models-3dbbd136befc?source=collection_archive---------17-----------------------

与魔术不同,知道机器学习模型如何工作不会破坏有趣的部分:在许多情况下,它有趣的部分。当我们了解一个模型背后发生的事情时,我们不仅可以在工作中变得更加有效和精确,还可以控制偏差和防止伤害。

本周,我们很高兴分享一些精选的优秀帖子,它们将帮助你理解机器实际上是如何学习的。让我们开始吧。

  • 我们能让情感分析模型变得可解释吗?Pooja Hiranandani以一个有趣的前提开始了我们的讨论:“随着人工智能变得越来越普遍,我们开始想知道它的动机是很自然的。”她的帖子向我们展示了多种可解释技术,并触及了它们如何帮助她的团队的深度学习模型表现得更好。
  • 说到模型漂移,需要问对问题 。如果你的模型不再像最初那样有效,你会怎么做?你如何节省时间和挫折,让他们回到可接受的可靠性基准?Sarah Beshr 清晰易懂的概述列出了你可能遇到的各种类型的漂移,解释了它们的原因,并提出了潜在的解决方案。

Lukas TennieUnsplash 拍摄的照片

如果你想在本周超越模特和她们的魔力,你还有很多很好的选择。其中包括:

  • 了解数据与气候变化交集的一站式资源 。随着 COP26 主导了过去两周的对话,我们很高兴分享我们刚刚推出的数据科学+气候变化课程。它收集了近 30 篇文章,涵盖了利用数据科学解决气候危机的挑战和前景。
  • 关于 AI 与人类合作的细致入微的对话 。在 TDS 播客中,Jeremie Harris 欢迎 Ayanna Howard,一位经验丰富的机器人专家、企业家和俄亥俄州立大学工程学院院长。他们放大了信任的问题:我们需要做什么来建立激发人类用户信任的人工智能系统?

我们希望你今天能抽出时间来看看我们作者的最新文章(或者为我们的一些周末推荐做书签)——你不会后悔的!如果你想进一步支持这项工作,考虑成为中级会员

直到下一个变量,
TDS 编辑器

我们策划主题的最新内容:

入门

实践教程

深潜

思想和理论

为什么你需要停止使用庞大的神经网络模型

原文:https://towardsdatascience.com/why-you-need-to-stop-using-bulky-neural-network-models-d43681d9916f?source=collection_archive---------36-----------------------

…而是提取他们的知识。

国家癌症研究所Unsplash 上拍摄的照片

在大学期间,一个人会接触到各种各样的人。在所有的种类中,我特别羡慕一种特殊的类型。这些人整个学期都不会学习。在考试的前一天,他们会下载一个高水平的主题,最后在考试中创建一个有针对性的答案视图,以成功通过考试。

我一直以为他们是被祝福的。拥有从高水平的学习中提取精华的能力,以及将这种能力转化为具体观点的能力,简直令人钦佩。

我永远做不到,甚至没有勇气去尝试。

最近,在我遇到的一个基于学生和教师的框架中,感觉就像一个赵雨菁。一次具有相同个性的替代性会面。

简单来说,在学生-教师框架中,学生模型(一个轻型神经网络)从教师模型(一个复杂的神经网络)中学习“提炼”的知识。这导致“轻”学生模型具有“重”教师模型的知识,具有相似或稍低的准确度水平。

在这篇文章中,我们将讨论对这样一个框架的需求,蒸馏过程是如何工作的,以及最后学生模型是如何被微调的。

为什么是师生框架?

“如果它不适合你的口袋,它就没有销路”

随着迁移学习模型和其他复杂神经网络(NN)模型的出现,模型的准确性显著提高。毫不奇怪,这是有代价的。多个神经网络层和众多参数通常会导致庞大的模型,这需要高计算能力来部署。这极大地限制了它们的使用和销售。

显然需要具有相似精确度的更轻的模型。需要一种方法将这些庞大复杂的模型压缩成更小的尺寸,而不显著降低精度。

这就是学生-教师框架的目标。

什么是师生框架,它是如何运作的?

在学生-教师框架中,利用复杂的 NN 模型(新的或预训练的)来训练较轻的 NN 模型。从复杂的 NN(老师)到较轻的 NN(学生)传授知识的过程叫做“蒸馏”

在深入了解蒸馏过程之前,理解两个术语非常重要:

  1. Softmax 温度:这是 Softmax 的调整版本。Softmax 函数创建跨分类类别的模型输出的预期概率分布,确保概率总和为 1。Softmax 温度做同样的事情,但是另外它将概率更多地分散在类别中。(见下图)扩散程度由参数“T”定义。T 越高,概率在类别间的分布就越高。T = 1 与正常的 Softmax 相同。

作者图片

请注意,虽然与直觉相反,但在许多情况下,为了获得各种潜在的结果,“软”概率是首选的。例如,在文本生成中,人们期望有更大的潜在选项集来生成多样化的文本。

在蒸馏过程中,模型中不使用 Softmax,而是使用 Softmax 温度。

2.暗知识:在 Softmax 温度的例子中,由于 Softmax 参数“T”的变化,我们从概率分布中获得的所有“额外知识”被称为暗知识。换句话说,通过使用 Softmax 温度(T > 1)而不是 Softmax 获得的增量知识是暗知识。

蒸馏过程工作如下:

1.训练(或使用预训练)复杂(比方说 10 层)“老师”模型。不出所料,这是一个计算密集型步骤。教师模型的输出将是跨类别/标签分布的 Softmax 温度输出概率。

2.以“学生层”的 Softmax 温度输出尽可能接近“教师”模型的方式,创建并训练一个更简单的(假设 2 层)“学生”模型。为此,学生和教师之间称为“蒸馏损失”的交叉熵损失应最小化。这就是所谓的“软瞄准”。通过这种方式,我们将“黑暗知识”从老师传递给学生。注意,这里的知识是跨各个层面传递的,而不仅仅是最后的损失。

这里出现的一个显而易见的问题是,我们为什么要瞄准软目标(一个展开的概率分布)。这是因为软目标比硬目标提供更多的信息。这导致更小的模型更有知识,从而需要更少的额外培训。

3.同时,使用 Softmax 激活(不是 Softmax 温度)训练“学生”模型,以使模型输出尽可能接近实际值。为此,学生和实际之间的交叉熵损失被称为“学生损失”被最小化。这叫“硬瞄准”。

4.对于#2 和#3,最小化总损失- ,即蒸馏损失和学生损失的加权和,

**损耗= a 学生损耗+ b 蒸馏损耗

概略地说,所提到的过程可以描述如下:

作者图片

结论:蒸馏(学生-教师框架)是一个很棒的模型无关工具,可以在没有太多计算能力的边缘设备上部署模型。虽然理论上该框架可以应用于任何大型神经网络模型;我个人已经看到它被用于一个 6 层 CNN 模型和蒸馏伯特。随着大量边缘设备的出现,我预计这个框架很快就会无处不在。

快乐学习!!

PS:为那些帮助我为这篇文章动笔的了不起的大学名人干杯!

免责声明:本文表达的观点是作者以个人身份发表的意见,而非其雇主的意见

为什么需要使用 Geopackage 文件而不是 shapefile 或 GeoJSON

原文:https://towardsdatascience.com/why-you-need-to-use-geopackage-files-instead-of-shapefile-or-geojson-7cb24fe56416?source=collection_archive---------6-----------------------

伦敦公路网与优步游乐设施的图像。如 Youtube 视频所示。

当前矢量数据标准格式

如果您一直在使用矢量数据并进行空间分析,您应该知道 shapefile 和 geojson。这是两种最常用的矢量数据格式,用于存储数据和执行任何空间分析。特别是 GeoJSON,它已经成为向 web 应用程序提供数据的首选格式。但是,当您希望扩展您的工作并为大规模部署构建集成的自动化工作流时,这两种格式都有很多缺点。Geopackage 格式在这方面提供了多种功能。这就是为什么您需要使用 Geopackage 文件而不是 shapefile 或 GeoJSON。让我们更深入地了解细节。

如果你想了解更多关于地理空间数据以及它如何改变数据分析领域的信息,请点击这里的查看我的博客。

https://www.samashti.space/articles/why-geospatial-data-is-the-way-forward-in-data-analytics https://www.samashti.space/articles/download-rainfall-satellite-data-from-chrs-data-portal-using-python

Shapefiles 的问题

Shapefiles 已经存在很长时间了。ESRI 在 20 世纪 90 年代早期开发了这种格式&从那时起,它已经成为人们广泛采用的处理和共享矢量数据的标准格式之一。Shapefile 存储非拓扑矢量数据以及相关属性数据。尽管它被广泛使用,但对于现代用例来说,它有相当多的&显著的缺点;

  • Shapefile 是一种多文件格式。您保存的每个矢量层至少有 3 个文件(。shp,。shx &。dbf)和其他几个不同扩展名的附加文件。因此,如果您想与他人共享 shapefile,您必须共享一个图层的所有文件。如果你有几层,文件的数量就很大。每个项目的文件数量为 4-6 倍并不理想。
  • Shapefile 支持类似于带有列标题的表格数据集的相关属性数据。但是您只能使用十个字符来定义列标题,并且在列标题上需要一些描述/标识的情况下,使用列标题的缩写形式并不总是理想的。
  • 形状文件的最大大小为 2GB。不能将包含更多可能超过 2GB 的要素的矢量图层导出为 shapefile。
  • shapefiles 在一个文件中不能有多个几何类型。
  • 随着 shapefile 大小的增加以及处理更多的属性列和行,shapefile 的性能会急剧下降,甚至在 QGIS 上使用空间索引时也会变得缓慢。

GeoJSONs 的问题

创建 GeoJSONs 部分是为了解决 shapefiles 的多文件问题。作为 web 应用程序上使用的 JSON 对象的扩展,它确实解决了 shapefiles 提出的一些问题。但是它有自己的一套限制;

  • 对于具有属性的类似数量的矢量要素,在大多数情况下,GeoJSON 的文件大小几乎是 shapefile 的两倍。
  • GeoJSONs 没有空间索引。因此,在处理大量特性时,这很难处理。大多数时候,在 QGIS 地图画布上浏览空间要素是一项令人厌倦的任务。
  • 每当您加载文件来运行一些任务时,整个文件都会被一次加载到内存中,这可能会在一些情况下产生问题,尤其是对于大文件。
  • 此外,与 shapefile 和 geopackages 相比,文件的加载通常较慢,但内存消耗相似或更多。
  • 如果文件大小超过了某个限制(根据我的经验,大约是 10–11gb),这些特性可能会写得不完整,从而导致文件损坏。

什么是 GeoPackage?

OGC 开发的地理空间信息开放格式,他们定义地理包如下;

GeoPackage 是一种开放的、基于标准的、独立于平台的、可移植的、自描述的、紧凑的地理空间信息传输格式。

geopackage 本质上是一个 SQLite 容器,采用 OGC 编码标准来存储矢量要素、切片矩阵(栅格数据)、非空间属性数据和扩展。

默认情况下,每个 geopackage 文件都有一些元表,如下所示,用于理解和处理地理空间图层。

'gpkg_spatial_ref_sys',
'gpkg_contents',
'gpkg_ogr_contents',
'gpkg_geometry_columns',
'gpkg_tile_matrix_set',
'gpkg_tile_matrix',
'gpkg_extensions',
'sqlite_sequence',

优势

  • 开源,基于 SQLite 数据库
  • 非常轻量级,但跨环境高度兼容(尤其是。在连接和带宽有限的移动设备中)
  • 与 shapefiles 相比,Geopackages 的文件大小通常要小 1.1-1.3 倍,而 geojsons 的文件大小则小近 2 倍。
$ fs road_network/*
193M	road_network/roads.geojson
 70M	road_network/roads.gpkg
 81M	road_network/roads.shp
  • 由于 geopackage 中的矢量图层本身具有 rtree 索引(空间索引),因此在 QGIS 上加载文件或在文件数据库上进行查询的速度很快。
  • 文件大小没有限制,它可以在较小的文件中处理大量的功能。
  • 与 shapefiles 相比,通过为每列提供正确的上下文,列标题可以是全名和正确的。
  • 与 shapefiles 相比,geopackages 的运行和算法输出速度更快(您可以在 QGIS 上尝试)。
  • 单个 geopackage 文件可以有多个矢量图层,每个图层都有不同的几何类型。
$ ogrinfo ./outputs/road_network.gpkgINFO: Open of './outputs/road_network.gpkg' using driver 'GPKG' successful.1: roads_area_hex8_grids (Multi Polygon)
2: roads_area_hex9_grids (Multi Polygon)
3: roads_area_major_segments (Multi Polygon)
4: roads_network_lines (Line String)
5: roads_poly_line_vertices (Point)
6: roads_intersection_node_points (Point)
7: roads_end_node_points (Point)
  • 除矢量图层外,您还可以拥有非空间属性表(熊猫表)。
$ ogrinfo ./india_villages_master_2011.gpkgINFO: Open of './india_villages_master_2011.gpkg' using driver 'GPKG' successful.1: village_data_master (None) # (non-spatial)
2: village_codes_mapping (None) # (non-spatial)
3: village_points (Point)
4: village_voronoi_polygons (Multi Polygon)
  • 随着数据的更新,我们会定期对矢量图层进行修改。在 QGIS 或 python 上加载和编辑 geopackage 文件的功能会更快。
  • 可以使用 GDAL、QGIS、Python、R、SQLite 和 Postgres 处理该文件(对每种模式的限制很少)
  • 与 shapefile 或 geojson 相比,将 geopackage 添加和加载到 Postgres 数据库要快得多(对于一些较大的数据集,这需要花费很长时间),因为它已经是一种数据库格式,并且已经进行了空间索引(与 shapefile 或 geojson 相比)。
  • 有趣的是,geopackages 还可以将栅格作为切片矩阵来处理。(当然,这也有一定的局限性)

如何在他们的工作流程中使用它?

与 shapefiles 和 GeoJSONs 相比,我们了解使用 geopackage 文件的优势。但是,我们如何以及在多大程度上可以将地理包文件集成到我们的空间分析工作流中?让我们探讨几个选项。

  • 大型输出文件
  • 平铺表格/多层文件
  • 减少/避免输出的冗余文件
  • 空间视图
  • 仅将部分矢量图层加载到内存中
  • 处理地理硕士
  • 一个文件中的在制品(WIP)层
  • CartoDB 的文件导入
  • 样品、默认颜色样式和其他属性

以上几点在我的博客上都有详细的解释。前往我的博客阅读更多关于如何使用 geopackage 来加快空间分析工作流程的信息。

GPAL

GPAL (Geopackage Python 访问库)是我为了解决使用 geopandas 读取和处理 Python 中的 Geopackage 文件的一些限制而构建的。我上面提到的 geopackage 格式的一些特性在 Python 中没有方法。因此,我开始构建一个模块。

目前,该模块可以使用 SQL 查询读取和处理 geopackage 文件上的文件操作,类似于 sqlite 数据库上的 sqlite3 模块。它有助于将部分矢量数据加载到内存中,而不是整个图层。目前,我还在开发其他一些功能。

有什么计划?

  • 由于 geopackage 同时处理空间和非空间表,因此有必要从 python 模块中一致地处理这两种数据表。
  • 表视图是数据库的一个特性,因为 geopackage 是基于 SQLite 的,所以我们可以将其扩展到空间视图,就像我上面提到的那样。但是它涉及到处理 geopackage 文件中的 gpkg 元表,并且需要用自己的方法来处理。
  • 不同工作流中多层格式文件的处理方法。

Geopackage 是一种非常轻便且高度兼容的矢量文件格式。您可以节省大量存储空间,处理更少的文件,更快地运行算法和可视化。成为持续更新的开源格式是锦上添花。这种格式的所有当前和潜在的特性激励我参加 GPAL 项目,开发一些东西,我希望在 Python 上使用 geopackage 时增加更多的通用性。

我希望本文能帮助您理解 geopackage 相对于其他矢量文件格式的特性和优势。我很乐意收到任何进一步改进的建议。

如果你喜欢这个博客,就订阅这个博客,并在以后的博客文章中得到通知。如有任何疑问或讨论,你可以在 LinkedInTwitter 上找到我。查看我之前的博客,了解如何通过 python 脚本使用 QGIS 空间算法。

https://www.samashti.space/articles/how-to-use-qgis-spatial-algorithms-with-python-scripts https://www.samashti.space/articles/how-alternative-data-helping-companies-invest-big

一些转换

从命令行使用 GDAL

  • 将形状文件转换为地理包
    $ ogr2ogr -f GPKG filename.gpkg abc.shp

  • 所有文件(shapefile/geopackage)将被添加到一个地理包中。

  • 将地理包添加到 postgres 数据库
    $ ogr2ogr -f PostgreSQL PG:"host=localhost user=user dbname=testdb password=pwd" filename.gpkg layer_name

为什么你从来没有真正验证你的分析方法,除非你使用总误差方法

原文:https://towardsdatascience.com/why-you-never-really-validate-your-analytical-method-unless-you-use-the-total-error-approach-part-a5be360e1563?source=collection_archive---------52-----------------------

第二部分:生产者和消费者风险

照片由比尔牛津在 Unsplash。

Thomas de March in(pharm Alex 统计和数据科学高级经理)、Milana Filatenkova(pharm Alex 统计和数据科学经理)和 Eric Rozet(pharm Alex 统计和数据科学总监)

这是分析方法验证中总误差方法系列文章的第二篇。如果你错过了第一篇文章,我鼓励你阅读它,以熟悉总误差概念和我们下面要讨论的内容:https://towardsdatascience . com/why-you-never-true-validate-you-analytical-method-unless-you-use-the-total-error-approach-part-CB 2247874 CD

现状是——验证结果经常被过度信任。通过验证评估的方法通常被认为足以声称其性能可靠。然而,重要的是要记住,在统计学中,没有什么可以保证 100%的信心。一个概率标签必须被放在任何陈述上,以便给它冠上一定程度的信任。100%的置信度可能仅归因于在研究了所有可能样本后做出的陈述——这是一种理想的情况,在现实中是不可能的。在分析方法验证的背景下,在整个人群中测试一种方法意味着进行无数次测量。实际上,方法的性能是根据一个样品的一些测量值来估计的,该样品是无限个可能样品(即总体)中的一个,因此是不确定的。

让我们用图 1 来解释这个概念。假设我们有一个方法,它的相对偏差为+1.5%,精确度 CV 为 2.5%。你永远不会知道真正的价值是什么,因为它需要进行无数次的测量来确定真正的价值。相反,您将尝试通过仅进行几次测量来评估您的分析方法的性能(假设每个浓度水平 3 个系列 3 次重复,这是行业中常用的有限设计)。如图 1 所示,每次做这个练习,您都会得到不同的真实度和精确度的估计。实际上,这种练习只进行一次,希望估计值接近真实值。

现在,让我们假设您的验证标准是真实度±2%的相对偏差和精密度±3%的 CV(制药行业中常见的值)。上述示例中真实度为+1.5%且 CV 为 2.5%的方法应该有效,因为这些参数的真实值包含在各自的验收标准中。然而,由于我们是在样本上估计这些参数,我们可能会意外地得到高于接受标准的估计值,如图 1 中的第二个例子。在这种情况下,您将声明您的方法无效,而它实际上是有效的。另一方面,可能会发生相反的情况。您可能有一个实际偏差和/或精度高于验证标准的方法,并且意外地获得了可接受限度内的估计值。在这种情况下,您应该声明该方法有效,而实际上它无效。第一种情况是生产者风险(拒绝有效方法的风险),而第二种情况是消费者风险(接受无效方法的风险)。

图 1:根据从样本中获得的信息对总体进行推断的过程。图片作者。

Bouabidi 等人(2010 年)调查了与使用经典描述性方法(即分别评估精确度和真实性)和总误差方法(即同时评估精确度和真实性)相关的风险。图 2 用已知精度 CV 和已知偏差的不同组合对计算机模拟方法的模拟验证实验说明了这些风险。已知偏差范围为 5 至+5%,已知中间精度 CV (RSD)范围为 0%至 5%。重复的数量固定在 J = 3,使用的系列 i 的数量为 3 和 10。接受标准设定为相对偏差 2%,描述性方法的 CV 为 3%,总误差为 5%,风险为 5%。这些值是药物制剂中活性成分一致性评价框架内使用的典型限值。

图 2:使用描述性(a,b)和总误差(c,d)方法的模拟结果——在方法的可能精度和偏差范围内绘制的等概率曲线。接受一种方法的概率沿着等概率曲线保持不变,因为真实精度和偏差是变化的。左图和右图显示了每次模拟中测量次数不同的模拟设置的结果。I 是系列数,J 是重复数,R 是系列间方差与重复性方差的比值(此处设置为 1)。[−λτ;+λτ]是真实度的接受极限,λRSDIP 是精度的接受极限。在 95%的概率下,总误差的可接受极限为 5%。所有图中出现的连续红色钟形曲线是一条理论曲线,它界定了方法确保 95%的结果在总误差的 5%验收限值内的区域。图从 Bouabidi 等人(2010 年)处复制并修改。

模拟过程如图 1 所示。每次迭代都是从给定精度和真实度的分布中选取样本。然后,基于这些样本估计精度和真实度(对于描述性方法)或总误差(对于总误差方法),并与预定义的标准进行比较,以评估方法的有效性。这一过程重复数千次,根据估计的真实性和偏差(“描述性”方法)或总误差(“总误差方法”)确定方法有效性。接受具有给定精度和偏差的模拟分析方法为有效方法的概率计算为该方法成功验证的实验与进行的实验总数的比率。

图 2 中绘制的曲线是等概率曲线,沿着这些曲线,方法的精度和准确性是变化的,但是成功验证的概率保持不变。例如,在图 2a 中,标有 75%的等概率曲线显示了所有可能的精度和真实度的组合,这些组合导致相关方法有 75%的机会使用描述性方法被宣布为有效。

为了评估这些等概率曲线,我们需要一个比较参考——一条 100%等概率曲线(图中以红色显示)。对于沿着该曲线的偏差和精度的每个组合,执行完美的验证过程,其中包括至少 95%的无限数量的样品测量落在 5%的总误差限度内。在这个理想的设置中,不是从有限的样本量来估计偏差和精度,而是采用真实值来产生测量值。

现在让我们看看我们能从这些数字中学到什么。

在描述性方法的框架内,任何已知偏差和精度的组合超出验收限值所定义的矩形的方法都应被宣布为无效。然而,由于偏差和精度估计的不确定性,通常使用 3 个系列 3 次重复的实验设计(图 2a ),这种方法也以 35-55%的显著概率接受真实性或精度值略大于各自接受极限的有效方法。这种验证设计会导致两个验证中有一个被错误地分类为有效。这个例子表明,描述性方法可能与相当大的消费者风险有关。另一方面,任何验证参数落在接受矩形内的方法都应该被声明为有效。然而,在图 2 中,我们看到有很大的几率(25–45 %)剔除在各自接受范围内具有已知真实度和精度值的方法。这个例子表明,大量完全可以接受的方法最终可能会因为使用这种方法而被丢弃——这是一个生产者面临重大风险的场景。

在样本量相同的情况下,与描述性方法相比,总误差方法提供的消费者风险较小,但生产者风险较高。在总误差法下,消费者风险得到更好的控制,因为对于小样本量,错误声明方法有效的风险低于 35%(图 2c),而对于描述性方法,这一风险高达 55%。另一方面,总误差法的生产者风险更高,因为我们看到这种方法拒绝有效方法的概率达到 65%以上。相比之下,描述性方法的最大生产者风险为 45%。对于总误差法,当增加样本量时(图 2d),消费者和生产者的风险都会降低,因为这些方法的参数估计得更好。

通过增加样本量,有可能减少真实性和精确度估计的不确定性,这将导致等概率曲线收敛到 100%的理想等概率曲线,其中生产者和消费者的风险最小。事实上,在样本量很小的情况下,您可能会意外地选取几个极端样本,得到的估计值与真实值相差甚远。通过增加样本量,可以降低挑选极端样本的风险

值得注意的是,增加样本量,从而降低消费者/生产者的风险,在实现验证目标方面对描述性方法的影响有限,验证目标是保证未来的测量值接近真实值。事实上,当测量次数趋于无穷大时,在全逼近下生成的等概率曲线向理想验证曲线收敛(图 2c 和图 2d 中的等概率曲线具有非常接近红色连续双曲线的形状),而在描述性逼近下生成的曲线向验收极限定义的矩形收敛。在与接受极限相对应的值下,对于具有无限样本量的描述性方法,错误接受或拒绝有效分析方法的风险为 50%。换句话说,描述性方法的可接受范围与验证的目标不一致,验证的目标是保证至少 95%的由宣布有效的方法产生的结果在总误差的 5%可接受范围内,无论用于测量的样本大小如何。

在开始验证阶段之前,可以(也建议)确定要执行的最佳实验数量(系列数量和系列重复次数),以确保做出正确的决策。这些最佳数字将基于对该方法的精确度和真实性的猜测。这些猜测可以通过分析分析方法的预验证、开发或优化阶段的结果来获得。正如我们在上面看到的,进行太少的实验会导致拒绝一个可接受的分析方法。相反,过多的实验会导致功率过大,使验证阶段比必要的时间更长,成本更高。在这两个极端之间找到一个平衡点是很重要的,也就是要进行的实验的最佳数量。表 1 显示了使用总误差方法在 95%的情况下实现验证所需的最小推荐样本量的示例,未来测量超出验收限值的风险小于 5%(此处设置为 10%)。在本例中,系列 I 和系列重复次数 J 的推荐数量是系列间σb 和系列内σw(或重复性)期望值的函数,均以%CV 表示。如果预期分析方法具有 1%的已知σw 和 1%的已知σb,则在 95%的情况下达到成功的最小系列数和每个系列的最小重复数分别为 3 和 4。当预期具有 3%的已知σw 和 0.5%的已知σb 时,则最小系列数为 6,每个系列的最小重复数为 5。

表 1:当验收限值设置为 10%且预期相对偏差约为 2%时,系列 I 和系列 J 的推荐数量作为系列间σb 和系列内σw(重复性)%CV 期望值的函数。该表是使用 Enoval 软件(https://www.pharmalex.com/enoval)生成的。

总之,本文展示了与验证相关的两个风险:将无效方法声明为有效的风险(消费者风险)和将有效方法声明为无效的风险(生产者风险)。我们已经看到,如果样本量为 3 个系列,每个系列 3 个重复,这是行业中常用的设计,这些风险可能非常高。为了控制生产者的风险,建议在进行验证之前确定要进行的实验的最佳数量。当比较描述性方法和总误差方法时,已经表明无论样本大小如何,与前者相比,后者的消费者风险明显较低。对于总误差法,可以控制在可接受范围内获得结果的概率,即了解分析方法结果的可靠性。这是用描述性方法得不到的重要信息。当增加样本量时,总误差方法的生产者风险降低。最后,在考虑的两种方法中,只有总误差方法有潜力实现验证的目标:你能相信你的结果在整个产品生命周期中做出充分的关键决策吗?

文献学

布阿比迪、a、e .罗泽、m .菲莱、e .齐蒙斯、e .查普泽、b .默滕斯、r .克林肯伯格、a .塞卡托、m .塔尔比、b .斯特雷尔、a .布克卢泽、b .布朗热和 Ph .休伯特。2010."在符合目的概念的框架内对几种分析方法验证策略的批判性分析."色谱杂志 A 1217(19):3180–92。doi: 10.1016/j.chroma

为什么你从来没有真正验证你的分析方法,除非你使用总误差方法

原文:https://towardsdatascience.com/why-you-never-really-validate-your-analytical-method-unless-you-use-the-total-error-approach-part-cb2247874cd?source=collection_archive---------58-----------------------

意见

第一部分:概念

图片来自 Pixnio。

Thomas de March in(pharm Alex 统计和数据科学高级经理)、Milana Filatenkova(pharm Alex 统计和数据科学经理)和 Eric Rozet(pharm Alex 统计和数据科学总监)

任何分析方法的一致和有效使用都需要在使用前了解其可靠性。因此,每个实验室都有必要验证他们的分析方法。验证不仅是监管机构[ICH、FDA、GxP]或为了获得认证[ISO 17025]的要求,也是常规使用该方法前的必要步骤。分析方法验证的作用是为实验室生成的结果提供信心,这些结果将在以后用于做出关键决策。

验证必须给出信心,即在常规中产生的每个未来测量值将足够接近真实值。这项工作通常通过评估方法性能的不同特征来进行,例如真实性(在 ICH Q2 中也称为准确性)、精密度(重复性和中间精密度)、特异性、检测限、定量限、线性、范围和稳定性。为了确定方法是否有效,将验证实验中获得的这些参数的测量值与预定义的验收标准进行比较。

在这里,我们将重点讨论真实和精确的概念。分析误差通常分为两部分(图 1):随机误差(在此称为“精度”)和系统误差(在此称为“真实度”)。分析误差的这两个要素可以通过对同一样品的多次重复测量来估算。值得注意的是,在多个独立的重复测量系列上测量的精度可以进一步分为重复性和系列间可变性,并被定义为“中间精度”。精度计算为重复测量的标准偏差(SD ),真实度计算为重复测量的平均值(Xm)和参考值(T)之间的差值。在实践中,在验证这两种类型的误差时最常报告的指标是:精确度的%CV (SD/ T100)和真实性的相对偏差((Xm- T )/ T100)。

图 1:分析误差分量的示意图;橙色箭头:系统误差或偏差;绿色箭头:随机误差或标准差;红色箭头:总误差。Xm 是结果(红点)的平均值,T 是样本的真实值。图片作者。

如上所述,通常的做法是将验证过程中获得的指标与一些预定义的验收标准进行比较(例如,精确度为 15% CV,真实性为 10%相对偏差),以确定方法是否有效。这就是所谓的“描述性”方法。但是等等…让我们回到验证的最初目标:验证必须给出信心,即在常规中进行的每个未来测量将接近真实值。本声明关注单个未来测量,而非重复测量的平均值或离差。如图 1 所示,单次测量取决于其总分析误差(本文也称为准确度),,即误差的系统部分和随机部分的同时组合。因此,这两部分各自的影响是不相关的。事实上,一种分析方法的准确性差还是精度差并不重要,只要两种误差成分的组合是可接受的。

由于评估精确度和真实性并将其与预定义的标准进行比较并不能回答验证的问题,因此程序应根据其总误差进行鉴定。如果样品的每个未来测量值(Xi)与其“真实值”(T)之间的差异极有可能(“保证”)在分析员预定义的接受限度内,则可认为分析方法的性能是可接受的。具有已知风险的“良好分析程序”的概念可以转化为以下等式:

p 表示任何未来结果在验收限值内的概率,验收限值由分析员根据方法目标事先确定(λ,例如+-30%),应大于最低质量水平β(假设为 0.95)。

但是如何表示这种可能性,以及如何决定标准呢?准确度剖面可作为该决定的适当规则(Hubert et al . 2004 休伯特、阮胡夫、布朗热、查普塞特、恰普等人,2007 年;休伯特、阮胡夫、布朗热、查普塞特、科恩等人,2007 年)。图 2 显示了一个精度曲线的例子。对于每个浓度水平,计算预测区间(也称为β-预期公差区间)以评估未来 95%测量的预期相对误差范围。这个区间是根据分析方法的偏差和精度的估计值计算出来的。然后,一方面的预测区间的下限和另一方面的上限被连接。图 2 中的绿色区域描述了剂量间隔,在该剂量间隔内,该程序能够产生具有已知准确度的测量值和由分析员确定的风险水平。例如,如果分析员预设了 5%的可接受风险水平,该验证方法将保证其分析方法给出的未来结果的平均 95%将包含在根据要求确定的可接受限度内(例如:散装 1%或 2%,特殊药品 5%,生物分析 15%,)。

图 2:作为决策工具的精确度分布图。在本例中,在 5 个浓度水平下进行了 3 系列测量。每个测量的相对误差由点表示。两条蓝色虚线之间的区域表示预测区间,在该区间内,我们预计未来测量值的 95%。浅绿色区域代表有效剂量范围。这个数字是使用 Enoval 软件(【https://www.pharmalex.com/enoval】T2)生成的。

如图 2 所示,如果准确度分布图的一个子部分超出了可接受的限度,则需要定义新的定量限度,因此需要定义新的剂量间隔。图 2 显示了这些新的限值 ULOQ(定量上限)和 LLOQ(定量下限),它们与该标准的定义完全一致,可分别以规定的准确度(真实度+精密度)测量的待分析物质的最高和最低量。

使用准确度剖面作为单一决策工具,不仅可以使验证的目标与分析方法的目标相一致,还可以直观地掌握程序实现其分析目标的能力[Hubert et al . 2004;休伯特、阮胡夫、布朗热、查普塞特、恰普等人,2007 年;休伯特、阮胡夫、布朗热、查普塞特、科恩等人,2007 年】。随着即将发布的 USP 1220 和 ICH Q14 中开发出新的分析质量设计(aQbD)和分析程序生命周期概念,这最后一点变得更加重要。为了证明分析方法符合其预期目的,USP 1220 规定验证标准应符合产品和工艺需求的质量标准。在这种情况下,总误差方法的使用极大地方便了在其使用环境中对该方法性能的解释。事实上,结果的最终用户将它们的质量与它们到真实值(即总误差)的距离联系起来,而不是与它们各自的离差或偏差联系起来。同样值得一提的是,USP 1210 建议使用预测区间来评估分析方法是否适合其预期目的。

总之,我们看到总误差法是一种合适的方法,可以满足验证的目标,并证明该方法适合目的。它是实施 aQbD 和分析程序生命周期概念的关键工具。

在第二部分中,我们将看到,与传统的验证方法相比,总误差方法在降低商业和消费者风险方面也有很大的优势。

文献学

USP 第<1210>章用于程序验证的统计工具

USP 草案章节<1220>分析程序生命周期

休伯特博士、阮胡杰、布朗热、查普泽、基亚普、科恩、孔波尼翁、杜维、范伯格、拉利耶、劳伦提、梅塞尔、穆扎德、尼维特和瓦拉特。2004.“定量分析程序验证策略的协调:SFSTP 建议—第一部分”,药物和生物医学分析杂志36(3):579–86。2004 年 7 月 27 日

休伯特博士、阮胡杰、布朗热、查普泽、基亚普、科恩、孔波尼翁、杜维、范伯格、拉利尔、劳伦提、梅塞尔、穆扎德、尼维特、瓦拉特和罗泽。2007."定量分析方法验证策略的协调:SFSTP 建议-第二部分."药物和生物医学分析杂志45(1):70–81。2007 年 6 月 13 日

休伯特博士、阮胡杰、布朗热、查普泽、科恩、孔波尼翁、杜韦、范伯格、劳伦提、梅塞尔、穆扎德、瓦拉特和罗泽。2007."定量分析方法验证策略的协调:SFSTP 建议-第三部分."药物和生物医学分析杂志 45(1):82–96。2007 年 6 月 32 日

为什么您可能不需要雇用数据科学家(还不需要)

原文:https://towardsdatascience.com/why-you-probably-dont-need-to-hire-a-data-scientist-yet-33ee32307dd2?source=collection_archive---------31-----------------------

首先关注数据基础设施和决策

Unsplash 上由 Carlos Muza 拍摄的照片

介绍

作为一名机器学习工程师,我注意到在过去几年中,数据职位的确切职责一直在不断变化。这意味着任何公司都不再确定所有数据角色之间的差异,这可能导致不适合该角色,特别是在初创公司或早期公司。在本文中,我们将探讨为什么,除非你心中有一个确切的数据科学或机器学习项目,否则在早期全面雇佣数据科学家可能是不正确的。

所以你已经决定你需要数据驱动,哪怕只是为了打通跨业务的多个功能,提出只能由分析师(或他们的整个团队)回答的问题。

这就是企业决定雇佣一群数据科学家来解决所有业务需求的原因。毕竟,数据科学家是市场上最热门的数据商品,能够使用统计和机器学习解决问题。他们将能够回答所有的业务问题,并使公司成为数据驱动型公司……对吗?

是也不是。

数据路线图

雇用数据科学家来解决所有数据问题的关键问题是,“数据”包含非常广泛的技能,从查询数据,到建立管道和建立机器学习模型。一个数据科学家不太可能拥有所有这些技能,如果他们拥有,他们几乎肯定没有机会像专家一样深入发展这些技能(当然,除非你发现了一个神话般的数据科学独角兽)。

除非你有一个以人工智能为中心的产品,否则对大多数公司来说,通过拉动数字和回答因果问题来快速推动商业决策的能力,比花几个月时间开发一个单一的机器学习模型要重要得多。因此,组织层面的典型高级数据驱动路线图可以分为 3 个主要阶段:

  1. 仪表板和 KPI(反应式决策制定)—使业务利益相关者能够根据数据做出决策
  2. 战略建议(主动决策)—通过基于对数据的主动分析提出业务建议来推动价值
  3. 机器学习和自动化—自动化流程,并根据模型预测主动提出业务建议

以下是每个阶段(2021 年)所需的典型职位,请注意,数据科学/机器学习技能仅在第 3 阶段需要:

  1. 数据工程师(数据管道)、分析工程师(转换表)、数据分析师(仪表板)
  2. 数据分析师/数据科学家(与利益相关方合作)
  3. 数据科学家/机器学习工程师(机器学习/统计模型开发)

正确的技能组合

丹-克里斯蒂安·pădureț在 Unsplash 上拍摄的照片

那么,仅仅雇佣数据科学家就能回答所有的业务问题,并让公司成为数据驱动型公司吗?

在某种程度上,许多数据科学家确实有能力在其工具箱中涵盖多个角色。数据清理技术、表格转换以及执行策略和仪表板的分析技术只是其中的一些例子。然而,他们可能不像数据工程师那样有丰富的协调数据管道的经验,不像分析工程师那样有丰富的设计非规范化表格的经验,也不像数据分析师那样有丰富的与高要求的利益相关者合作的经验。这一切都是为了找到这个角色所需要的正确技能,而不是找到一个能够涵盖所有角色的人(但不能同时出现在 3 个地方)。

这并不是说在路线图的第二阶段之前根本不要雇用数据科学家,他们中的许多人都非常有才华,能够推动项目向前发展,带来很多价值。只是如果你雇佣一个数据科学家单独做数据工程师或数据分析师的工作,你可能也会发现他们很快就会变得不满意。他们可能不想处理特别的 SQL 查询或提高数据可靠性。有趣的是,我认识的数据科学家喜欢在工作中发挥他们的统计和机器学习能力,因为这是他们在这个领域最喜欢的。

结论

过去几年数据科学的兴起和数据标题的不断变化使得公司热衷于雇佣数据科学家来满足他们所有的数据需求。公司(尤其是那些处于早期阶段的公司)将发现,定义他们当前处于数据驱动路线图的哪个阶段更有价值,然后更深入地挖掘不同的数据角色,以确定需要什么技能。当数据科学和机器学习项目已经进行了两年时,不要雇用数据科学家来担任数据工程师的角色。

为什么应该将强化学习添加到您的数据科学工具箱中

原文:https://towardsdatascience.com/why-you-should-add-reinforcement-learning-to-your-data-science-toolbox-f6d4728afe66?source=collection_archive---------13-----------------------

以及从哪里开始学习。

谷仓图片Unsplash 上拍摄

作为一名数据科学家,你可以学到很多东西。我敢打赌,你学到的第一件事是关于统计学、数据分析、可视化、编程、数据库、机器学习和深度学习。当你熟悉这些主题时,你可以继续学习更具体的主题,比如 GANs、NLP、云、容器化、软件工程等等。你根据自己喜欢的东西和需要的技能来选择方向。这篇博客文章解释了为什么将强化学习(RL)添加到您的数据科学工具箱中是一个不错的选择。

如果你对 RL 一无所知,想看看应用,可以看这篇文章。简单回顾一下:代理通过选择动作与环境进行交互。代理接受观察和奖励。代理人的目标是最大化报酬的总和。这个过程是一段一段发生的,代理人不断学习,越来越擅长自己的工作。

在现实生活中,学习也是如此。当你教狗听命令时,当它表现出正确的行为时,你就给了它一份奖励。如果他没有,他什么也得不到。你可以把这种情况翻译成 RL。状态是它听到的命令,动作是狗对命令做出的任何反应,奖励是款待。如果狗喜欢吃零食,它会越来越听话:)

照片由 Camylla BattaniUnsplash 上拍摄

警告:如果你刚刚开始你的数据科学生涯,我不建议你从 RL 开始!这是一个高级话题,你应该了解数学和深度学习。

学习 RL 的三个主要原因

为什么要学 RL?

1。许多商业问题可以用 RL 解决

RL 增加了有价值的知识,你可以用在许多商业案例中。一些例子是:

  • 您可以构建一个次优行动推荐系统。假设你有客户,你想为每个客户找到最有利可图的行动。您可以为您的客户定义状态,如新客户、老客户或忠实客户。通过测试销售和营销行为,你可以找到与州相关的最有利可图的行为。
  • 调度作业是另一项有趣的任务。您可以指定作业集、每个作业所需的资源和时间。代理将找到优化作业完成时间的方法。
  • 自动化和机器人技术。通过使用 RL,机器人可以学习完美地执行一项任务。有些任务很难设计,RL 可以帮助完成这些任务。一个很好的例子是控制交通灯信号网络:通过奖励 RL 代理较少的延迟,代理找到了组织信号的最佳方式。它们比普通的交通灯控制机制表现得更好。

Eliobed SuarezUnsplash 拍摄的照片

还不信服?让我们继续下一个原因。

2.你不需要带标签的数据

尽管带标签的数据在 RL 问题中很有用,但这不是必需的。你可以从零开始建立一个 RL 环境,代理会找到一种方法来最大化奖励的总和。

这是一件大事。数据准备和收集是数据科学家面临的挑战,一项调查显示,这消耗了他们几乎 80%的时间。更糟糕的是,这些是数据科学家最不喜欢的任务。通过使用 RL,可以跳过这一部分。代理可以从头开始学习,不一定需要带标签的数据。另一方面,创建一个环境可能很困难,尤其是当您刚刚开始使用 RL 并想要解决一个复杂的问题时。在这种情况下,你可以从简单开始(用最少的可行产品),并通过添加特性和试验状态、动作和奖励的不同定义来扩展你的问题。

AlphaZero ,只通过自我游戏训练,只知道国际象棋、日本象棋和围棋的规则。它超越了所有以前发明的算法,并展示了玩这些游戏的酷新方法。

来源:DeepMind

3.脱颖而出

网上有很多数据科学学习途径。你可以在 Coursera、DataCamp、Udacity 或 deeplearning.ai 等网站开始你的旅程。或者你可以拿到学士或硕士学位。这些学习路径中的大多数课程将教你如何编程,以及如何分析、可视化和建模数据。在开始的时候,这是可以的,但是在你能够执行这些任务之后,你就可以开始将自己与“普通的”数据科学家区分开来。学习强化学习可以帮助你做到这一点。

RL 不是在标准的数据科学认证项目中教授的,掌握起来真的很酷。你可以提出一个新的独特的解决方案,从不同的角度处理问题。如果你能够开发与业务问题相关的 RL 解决方案,你就能让自己从其他数据科学家中脱颖而出。

除此之外,RL 问题就像一个谜题。思考如何定义状态、奖励和行动很有趣。工作解决方案带来了积极的氛围。尝试是很好的,因为只要报酬有一点点变化,代理人就可以做非常奇怪的事情(你可能想看看这里的)。

从哪里开始学习

希望你被说服了,想开始学习 RL!以下是一些你可以在旅途中使用的资源。

强化学习,第二版:简介

萨顿和巴尔托的这本书被广泛使用,包含了你需要知道的关于 RL 的一切。

强化学习专精

由阿尔伯塔大学开发的这一系列课程是一个很好的资源。它从基础开始,帮助你真正掌握书中解释的概念和算法。完成本专业后,您将能够创建自己的环境并解决 RL 问题。

强化学习课程| DeepMind & UCL

这一系列讲座来自 deep mind(alpha zero 的创造者)并从基础开始,但也谈论高级话题。

享受学习!

如果你想在我发表新文章时收到电子邮件,别忘了订阅。 ❤

为什么应该总是对结构化数据集使用要素嵌入

原文:https://towardsdatascience.com/why-you-should-always-use-feature-embeddings-with-structured-datasets-7f280b40e716?source=collection_archive---------4-----------------------

图片经由 iStock 授权给迈克尔·马林

一个简单的技术来提高你使用的任何模型的准确性

在表格数据表上训练神经网络时,特征嵌入是最重要的步骤之一。不幸的是,这种技术很少在自然语言处理(NLP)设置之外教授,因此对于结构化数据集几乎完全被忽略。但是跳过这一步会导致模型准确性的显著下降!这导致了一种错误的理解,即梯度增强方法(如 XGBoost)对于结构化数据集问题总是更优越。不仅嵌入增强的神经网络通常胜过梯度增强方法,而且当提取这些嵌入时,两种建模方法都可以看到重大改进。本文将回答以下问题:

  • 什么是特征嵌入?
  • 它们是如何用于结构化数据的?
  • 如果它们如此强大,为什么它们不更加普遍呢?
  • 嵌入是如何实现的?
  • 我如何使用这些嵌入来增强其他模型?

解释了特征嵌入

神经网络难以处理稀疏分类特征。嵌入是减少这些特征以提高模型性能的一种方式。在讨论结构化数据集之前,理解嵌入通常是如何使用的是有帮助的。在自然语言处理环境中,您通常会处理成千上万个单词的词典。这些字典被一次性编码到模型中,这在数学上等同于为每个可能的单词设置单独的一列。当一个单词输入到模型中时,相应的列将显示 1,而所有其他列将显示 0。这导致了一个非常稀疏的数据集。解决方案是创建一个嵌入。

作者照片,由 TensorFlow 嵌入式投影仪创作

嵌入本质上将基于训练文本对具有相似含义的单词进行分组,并返回它们的位置。因此,举例来说,“乐趣”可能与“幽默”、“跳舞”或“机器学习”等词具有类似的嵌入价值。实际上,神经网络在这些代表性特征上表现得更好。

结构化数据的嵌入

作者数据框示例

结构化数据集通常也包含 sparce 分类特征。在上面的示例客户销售表中,我们有邮政编码和商店 ID。因为这些列可能有成百上千个不同的唯一值,所以利用它们会产生与上面的 NLP 问题相同的性能问题。那么为什么不以同样的方式使用嵌入呢?

问题是,我们现在处理的不止是一个特性。在这种情况下,两个单独的稀疏分类列(邮政编码和商店 ID)以及其他强大的功能,如销售总额。我们不能简单地将我们的特征嵌入。然而,我们可以在模型的第一层中训练我们的嵌入,并在这些嵌入旁边添加正常的特性。这不仅将邮政编码和商店 ID 转换成有用的特性,而且现在其他有用的特性也不会被成千上万的列冲淡。

作者嵌入图示例

为什么嵌入被忽略

在最大的以 ML 为中心的公司中,这种技术是绝对使用的。问题是这些大公司之外的绝大多数数据科学家从未听说过以这种方式使用嵌入。这是为什么呢?虽然我不会说这些方法很难实现,但它们已经超出了典型在线课程或专业的复杂程度。大多数有抱负的机器学习实践者根本不知道如何将嵌入与其他非分类特征合并。因此,像邮政编码和商店 ID 这样的特性通常会直接从模型中删除。但这些都是重要的功能!

一些特征值可以通过像均值编码这样的技术来捕获,但是这些改进通常是微不足道的。这导致了完全跳过神经网络的趋势,因为梯度增强方法可以更好地处理这些分类特征。但是如上所述,嵌入可以改进这两个模型,这将在下一节中看到。

如何实现嵌入

这个过程中最困难的部分是熟悉 TensorFlow 数据集。虽然它们远不如 pandas 数据框直观,但如果您计划将模型扩展到大规模数据集或想要构建更复杂的网络,它们是一项很好的学习技能。

对于这个例子,我们将使用上面假设的客户销售表。我们的目标是预测目标月份的销售额。为简单起见,我们将跳过工程步骤,从预分割的 pandas 数据帧开始。对于较大的数据集,您可能不会从数据框开始,但这是另一篇文章的主题。

第一步是将这些数据框转换成张量流数据集:

trainset = tf.data.Dataset.from_tensor_slices((
    dict(X_train),dict(y_train))).batch(32)validationset = tf.data.Dataset.from_tensor_slices((
    dict(X_val),dict(y_val))).batch(32)

需要注意的一点是,这些张量流数据集及其后的变换不会像 pandas 数据帧那样存储到内存中。它们本质上是一个管道,数据将一批一批地通过,允许模型在太大而无法放入内存的数据集上有效地训练。这就是为什么我们输入的是数据框架的字典,而不是实际的数据。请注意,我们现在还定义了批量大小,而不是像您通常使用 Keras API 那样在训练时定义。

接下来,我们想要为邮政编码和商店 id 创建一个所有唯一值的列表。这将用于稍后创建和提取嵌入。

zip_codes = X_train['zip_code'].unique()store_ids = X_train['store_id'].unique()

现在,我们可以使用 TensorFlow 特征列来定义数据管道。根据表中要素的类型,有许多选项可供选择。请查看 TensorFlow 的 feature_column 文档了解更多信息。

# numeric features being fed into the model:
feature_columns = []
feature_columns.append(
    tf.feature_column.numeric_column('gender')
feature_columns.append(
    tf.feature_column.numeric_column('age)
feature_columns.append(
    tf.feature_column.numeric_column('previous_sales')

# categorical columns using the lists created above:
zip_col = tf.feature_column.categorical_column_with_vocabulary_list(
    'zip_code', zip_codes)
store_col = tf.feature_column.categorical_column_with_vocabulary_list(
    'store_id', store_ids)

# create an embedding from the categorical column:
zip_emb = tf.feature_column.embedding_column(zip_col,dimension=6)
store_emb = tf.feature_column.embedding_column(store_col,dimension=4)

# add the embeddings to the list of feature columns
tf.feature_columns.append(zip_emb)
tf.feature_columns.append(store_emb)

# create the input layer for the model
feature_layer = tf.keras.layers.DenseFeatures(feature_columns)

注意,在嵌入步骤中,我们必须指定维度的数量。这是指我们希望将分类列减少到多少个特征。经验法则是,您通常将特征减少类别总数的 4 次方根(例如,1000 个唯一的邮政编码减少到大约 6 个嵌入列),但这是另一个可以在您的模型中调整的参数。

现在让我们建立一个简单的模型:

model = tf.keras.models.Sequential()
model.add(feature_layer)
model.add(tf.keras.layers.Dense(units=512,activation=’relu’))
model.add(tf.keras.layers.Dropout(0.25))# add any layers that you want hereModel.add(tf.keras.layers.Dense(units=1))# compile and train the model
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
model.fit(trainset, validation_data=valset, epochs=20, verbose=2)

祝贺您,您现在已经训练了一个具有嵌入的模型!现在,我们如何从这个模型中提取这些嵌入,以提供给其他模型?只需从模型中抓取重量:

zip_emb_weights = model.get_weights()[1]
store_emb_weights = model.get_weights()[0]

请注意,嵌入图层的顺序可能会改变,因此请检查权重图层的长度是否与上面定义的唯一值的长度相匹配,以确保获取正确的图层。现在将权重保存到数据框中。

# create column names for the embeddings
zip_emb_cols = ['zip_emb1', 'zip_emb2', 'zip_emb3', …]
store_emb_cols = ['store_emb1', 'store_emb2', 'store_emb3', …]# create a pandas data frame:
zip_emb_df = pd.DataFrame(columns=zip_emb_cols,
                          index=zip_codes,data=zip_emb_weights)store_emb_df = pd.DataFrame(columns=store_emb_cols,
                            index=store_ids,data=store_emb_weights)# finally, save the data frames to csv or other format
zip_emb_df.to_csv('zip_code_embeddings.csv')
store_emb_df.to_csv('store_id_embeddings.csv')

结论

既然嵌入已经存储,我们可以将它们合并回原始数据集中。我们甚至可以使用相同的分类特征将它们合并到其他数据集中。我还没有发现一个案例,这些新的增强数据集没有提高利用它们的所有模型的准确性。试试看,我向你保证,这个过程将成为你标准机器学习工作流程的一部分。

为什么你应该在业余时间成为一名数据科学家

原文:https://towardsdatascience.com/why-you-should-be-a-data-scientist-in-your-spare-time-967782ad69d4?source=collection_archive---------10-----------------------

最好的爱好

革命。作者图片

这将是一篇观点文章,所以如果你有想法/不同意见,请评论!

如果你在数据职业领域稍有涉猎,或者主要从事数据工作,你就会知道数据科学家这个角色有多热门。自从《哈佛商业评论》的那篇文章(你知道的那篇)以来,这个领域一直主导着各地的“十大职业”和“高薪职业”排行榜。即使是现在,你也确实无法避免被一些关于这个标题的文章淹没;”数据科学家工作已死”,“数据工程师 vs 数据科学家”,“数据科学家仍然是最性感的工作”,如此多。每个人都有自己的看法,如果你和我一样,那你一定全都读过了。

在这个故事中,我不会谈论你在日常工作中“应该”做什么或成为什么样的人;相反,我想关注的是你在朝九晚五之外做了什么。

我们都因为各种各样的原因进入这个职业,我真诚地相信多样性丰富了这个领域,而不是有害的。不管这个职位的职业前景如何,我相信,如果你的目标是在日常工作之外成为一名数据科学家,那么你的职业生涯将永远是令人向往的,更重要的是,你将过上令人难以置信的有意义的生活。

在我提出我的理由并列出我认为这应该是什么样子的框架之前,让我们先制定一些基本规则:

“我不想在我朝九晚五的时间之外做任何‘工作’”

这并不是建议花更多的时间做你的日常工作。这是“持续学习”心态的延伸,但我相信这种方式会更令人愉快,并且随着时间的推移,对你来说更有价值。

如果你对每天/每周在工作之外学习一点点不感兴趣,那么我假设你根本不会读这篇文章:)

“不懂编码和数学或者知之甚少”

坚持读下去;技术技能不是我要提议的生活的先决条件。唯一的先决条件是:好奇心和韧性。

“你凭什么说我业余时间做什么?”

我很惊讶你没有先问这个问题!这就是我在职业生涯中做过/正在做的事情,我看到了我从中获得的价值。我想分享这些知识,希望其他人也能在数据领域找到一条更好的道路。当谈到这个领域的职业时,有很多模糊和挫折。我听说它的范围从入门的高门槛到达到门槛后的悲惨生活。我只是想提出一种可供选择的思维方式/方法,但是你的时间是你最宝贵的财富——不要让社交媒体上的某个随机的人告诉你如何度过它。

“…您的时间是您最宝贵的资产,不要让社交媒体上的某个陌生人告诉您如何度过时间”

既然我们已经解决了这个问题,让我们从时间开始,因为我相信这是你首先想到的。

我说的“业余时间”是指多少时间?

空闲时间的美妙之处在于它完全在你的掌控之中。显然,你在专注的事情上花的时间越多,你就能做得越好。不管怎样,你应该首先弄清楚你一天中真正有多少时间。工作之后,你的一天是什么样子的?你熬夜还是早醒?你能在一个晚上或每隔一个晚上抽出一两个小时来增长你的技能吗?你有多少周末可以用来充实自己?

对此我没有一个具体的答案,这也是我推荐这个的第一个原因:你的自主权,默认情况下,如果你选择这样做,它会成为一个有意义的选择。换句话说,如果你选择花时间去学习你不需要去做的事情,那么它的价值至少是你生活中其他事情的两倍。

计划好你的日子/周,看看你有多少时间可以用来成长,承诺并做就行了。

现在,具体做什么?

这是指作为自由职业者从事数据科学工作吗?

不会。但如果你想的话,它会的。我的意思是,无论你在哪里选择,都要致力于“让数据有用”的实践。如果这意味着做自由职业者,那么很好,你可以有一个副业,但它也可以不是为了盈利。怎么会?为什么?先从“让数据有用的实践”说起。

“让数据有用”是什么意思?

你关心哪个领域?或者更好的是,你对哪个领域感兴趣?你对特斯拉如何设计自动驾驶汽车感兴趣吗?你想看看 Spotify 的 Discover Weekly 算法是如何工作的吗?你关心美国公民自由联盟追求公平公正未来的使命吗?想想你的心在哪里无缘无故地游荡;让你的眼睛比平常睁得更大的东西将是关键的第一步。如果你真的没有,选择你最有疑问的东西。它会得到同样的回报!

现在你有了一个你感兴趣/好奇的领域,你也继承了这个领域今天面临的问题。说你真的很在乎吃绿色食品,减少碳排放。你认定你感兴趣的领域是环境/生态,并将其抽象为“社会公益”。现在这个领域有了它目前正在经历的问题。今天,工业界和学术界都在关注这些问题。一点点相当直接的谷歌搜索应该足以找到这些问题。

现在,我敢打赌,在当今时代,无论你选择哪个领域,你发现的几乎所有问题都会与数据有某种联系。可能是研究人员正在收集数据以进行评估问题的实验,或者是一些公司正在使用数据来自动解决这个问题,或者是数据质量很低,造成的伤害大于好处,或者是他们拥有高质量的数据,但没有足够的人才来帮助他们的事业。几乎每个问题,或者说大多数问题,都与数据有某种联系。

我所说的“让数据变得有用”就是试图解决这些(从根本上说是数据)问题。数据科学家是这方面的专家。他们在各自的领域用各种各样的技能做这件事,这可能是一个难以置信的挑战,因为,我相信你已经注意到了,这些都是难题

我该如何开始解决这些问题,尤其是在业余时间?

你不需要解决这个问题,我只是建议你尽最大努力去解决你能解决的任何问题。这里的价值不在于你在业余时间解决了一个巨大的障碍;价值会在你一路走来的旅程中实现。

假设你关心美国公民自由联盟的使命,并希望实践我在这里建议的。假设你已经对这个问题做了研究,并且相对比较了解,我会谷歌一下是否有美国公民自由联盟的研究人员或工作人员在处理数据。如果你找到他们,并找到他们公开的电子邮件,恭敬地给他们发邮件询问你是否能就你一直在研究的这个问题征求他们的意见。在所有你可能发邮件的人中,也许只有少数人会回复你,但这没关系。询问他们正在做什么,以及他们是如何试图解决这个问题的。询问他们在哪些方面需要帮助,以及你是否可以贡献一部分业余时间来免费帮助(如果你要钱,可能不会顺利;那条路线更多的是针对传统的自由职业路线)。对你是谁,你能做什么/不能做什么,以及你在寻找什么要非常诚实。最有可能的是,美国公民自由联盟会说一些类似“ehh 我不知道我是否可以公开分享这些数据”。其实你问这个的大部分人都会这么说。作为回应,我建议询问你是否可以签署 NDA,然后提供帮助。如果没有,那就问问他们是否有办法让你在大项目的一小部分上协助保密工作。如果没有,那么至少你现在已经和美国公民自由联盟取得了联系,我保证他们会记得那些带着解决他们问题的真诚热情和他们联系的人。之后的单独路线是查看 Kaggle.com 或谷歌研究的数据集存储库,看看是否有你可以访问的开放数据集(如果你愿意,你也可以先走这条路线)。如果没有,那么检查是否有开放的 API 可供使用。您可能需要练习一些数据工程技能来链接到它并获取数据,但这仍然是一项非常值得学习的技能。

我个人的经验是,人们真的渴望得到驱动数据从业者的帮助来解决他们的问题。假设你能够克服获取数据的障碍(签署 NDA,接受兼职实习,开放 API 等。),这是 100%要带你去一些惊人的项目。

当你有了数据集,天空就是极限。使用你拥有的任何 Python 和数据技能(它们不必完美无瑕,通常只要足以理解如何开始获得你需要的就好),并不断学习弥补差距。这个领域的每个人都有冒名顶替综合症,但我保证,如果你在做你关心的事情,这个问题会变得更容易解决。

没有任何数据、Python、统计/数学技能怎么办?

“在业余时间做一名数据科学家”的另一个好处是,宽泛的定义对你有利。有大量的低成本资源,这将是一个巨大的帮助。事实上,有很多很棒的,我甚至写了一个关于它的故事:进入数据科学

这一领域最受重视的是应用。你如何应用你所学的技能,为什么要应用它们,这是这个领域的人们关注的最重要的标准。因此,我向非常早期的初学者推荐的对框架的唯一改变是,在你觉得已经准备好开始一个项目之后,在接触人们之前,看看 Kaggle 数据集和开放 API。它会让你在做“真正的”事情之前,对做一个项目和练习你的技能感到更舒服一点。

这在理论上听起来很棒,但这实际可行吗?

这里有两个发生在我生活中的例子:

首先,我成为了密歇根大学计算机视觉项目的无偿研究助理。我已经在大学攻读应用数据科学的硕士学位,在休假期间,我在 Coursera 上参加了这个【惊人】深度学习专业课程。我安排了工作和学校之外的时间来适当地致力于此,并且能够很好地完成我的工作。几个月后,我变得如此优秀,以至于我以更快的速度完成了我的课程。这给了我更多的时间,我觉得我已经准备好尝试一个真正的项目了。我开始在谷歌上搜索优盟的研究项目,看到了一个与我对艺术摄影的热情完全吻合的项目。研究项目正在对密歇根大学艺术博物馆的数字化艺术作品进行计算机视觉,以检测基于种族、性别和年龄的人类表现。这是一个非常困难的问题,我肯定没有完美的技能来解决它,但是我知道我对它充满热情,所以我申请了。面试进行得很顺利,但最终他们选择了一个不同的学生,因为我已经做了很多事情。我建议如果我能免费出租。我只会贡献我的时间和精力去帮助别人,不要求任何报酬;我只想成为一名‘业余时间的数据科学家’。他们很难拒绝这个提议,所以他们同意了,我开始着手这个非凡的项目。我编写了从 API 中获取数据的脚本,进行了大量的探索性单变量和双变量分析,还应用了一些前沿模型来构建 MVP(以后会有相关报道)。由于日程安排的限制,最终我不得不在看到项目结束前离开,但我能够做出相当有意义的贡献,并看到我的技能在我参与的这段时间里有了巨大的增长。一路上,我建立了一些真正令人难以置信的关系,当这个项目完成时,我非常兴奋地看到它在乌玛的艺术展览中变成现实!作为一名摄影师,这个项目将永远在我心中占据一个特殊的位置,我非常感激我在深水区潜水来成长自己。

第二个例子与我对体育分析的热情有关。我是一个体育迷,尤其是篮球。我知道我至少需要做一些相关的数据项目,但不知道是什么。在参加了网络分析课程后,我深深地爱上了这个话题,以至于我开始在业余时间阅读研究论文。我看了一篇关于研究人员如何通过网络分析视角分析足球欧洲杯世界总决赛数据的研究论文,我的眼睛瞬间亮了起来。他们通过球员如何传球的数据来分析足球运动员和比赛,我知道我想尝试在篮球中应用这些数据。但是怎么做呢?我没有篮球传球数据!如上所述,我谷歌了一下 NBA API,找到了我想要的东西(以后还会有相关报道)。为了熟悉 API,我阅读了大量的文档和文章。然后我写了一个 ETL 管道来读取数据,并以我想要的格式获取它,这样我就有了一个球员的所有传球和传球,以及由谁完成的。最后,我将这些数据建模为一个网络,以图形化的方式对其进行评估,并查看该研究论文是否适用于所有体育项目。我最终发现那篇论文并不适用于篮球,于是我创建了自己的衡量标准,我认为它能更好地衡量篮球运动员/团队的表现。我已经有了扩展它的想法,尽管仅仅做这么多就已经是丰富的学习经历了,而且是在我热爱的领域!

没事吧..那又怎样?

这两个项目是我谈论最多的两个项目,尽管其他项目更具挑战性或“技术娴熟”。这不是因为我认为它们是最花哨的,而是因为我在不需要的时候选择了它们。我找到了他们,并留下了我的印记。它们是关于我深深热爱的领域的,它们具有足够的挑战性,在我继续前进后,它们使我在我的工艺方面做得更好。

具有讽刺意味的是,我在业余时间不需要做的项目最终也成了推进我朝九晚五生活的最大胜利。我之前说过,这种生活的先决条件是好奇心和韧性。你越能运用你的技能,并展示出你在数据技能上拥有这两项优势,你就越受欢迎。好奇心和适应力最棒的部分是它们作为一个积极的反馈循环,不断给你的生活带来胜利,但我会把这留给另一个故事。

当你想成为一名数据科学家时,无论是在你朝九晚五的时间还是在你的业余时间,你都已经在暗示自己要坚持不懈地学习。你还不如让它学习你所关心的东西。我们目前生活在一个惊人的数据和开源时代,有太多的东西可供我们访问,我们只需要对我们真正想要的东西表现出足够的坚持和尊重。

无论你是数据分析师、数据工程师、机器学习工程师、研究科学家、数据科学家,还是日常工作中完全不同的人,都希望在业余时间让数据对你关心的领域有用,并让你的生活变得更加美好。

为什么应该使用 PHATE 进行降维

原文:https://towardsdatascience.com/why-you-should-be-using-phate-for-dimensionality-reduction-f202ef385eb7?source=collection_archive---------5-----------------------

思想和理论

作为数据科学家,我们经常处理具有 3 个以上感兴趣的特征或维度的高维数据。在受监督的机器学习中,我们可以使用这些数据进行训练和分类,并且可以减少维度以加快训练。在无监督学习中,我们使用这种类型的数据进行可视化和聚类。例如,在单细胞 RNA 测序(scRNA-seq)中,我们积累了超过一百万个细胞的每个细胞数万个基因的测量值。这是一组数据,为细胞的身份、状态和其他属性提供了一个窗口。更重要的是,这些属性使它与数据集中无数的其他单元格相关联。然而,这创造了一个由 1,000,000 个细胞和 10,000 个基因组成的巨大矩阵,每个基因代表一个维度或轴。我们如何解读这样的数据?作为生活在三维世界中的人类,我们看不到三维以外的任何东西,需要一种方法来捕捉像这样的数据集的本质,同时又不丢失任何有价值的东西。

我们如何将这个数据集压缩到 2 或 3 维,以便保留必要的信息?您的第一反应可能是使用 PCA 或 tSNE 将数据集投影到二维嵌入中。但是,每种方法都有一些关键的权衡,可能会在下游分析过程中导致有关数据集的错误结论。使用 PCA,您会丢失数据点之间的局部关系(在我们的例子中是细胞),代价是捕获全局表示。此外,PCA 是一种线性方法,它不能准确地捕获复杂的数据集,如单细胞 RNA 测序数据,其中我们可以有由不同的基因表达组合定义的无数细胞类型,同时还经历各种过程,如细胞分裂、分化(干细胞特化为更成熟的细胞类型,如神经元)、代谢等。另一方面,tSNE 是一种非线性方法,它在保持局部关系方面做得更好,但代价是破坏了全局。例如,在干细胞分化中,干细胞不会在开关(或这种情况下的一组基因)的轻弹下自动转变为神经元,而是经历由其转录谱逐渐变化所定义的连续变化。我们经常把这个连续体描述为一个轨迹。tSNE 的问题在于,它粉碎了这些轨迹,导致细胞群脱节,几乎没有关于一种细胞类型如何与另一种细胞类型相关的信息。

那么现在我已经说明了这个权衡的下游问题,我们如何解决它呢?这就是法特的切入点。PHATE——代表基于亲和力的转换嵌入的热扩散潜力——是降维领域的新人。像 tSNE 一样,它是一种非线性、无监督的技术。然而,与 tSNE 不同,它通常以全局结构为代价保留高维数据的局部结构,PHATE 捕捉了 PCA 和 tSNE 的两个世界的最佳之处,保留了数据点之间的局部和全局关系,以准确地反映所讨论的高维数据集。

我们将继续使用 scRNA-seq 数据作为例子。有了这个数据集,我们基本上有了一个 m×n 的矩阵,由 m 个细胞(行)和 n 个基因(列)组成,代表了信使 RNA 分子的离散计数。我们首先计算这些单元之间的欧几里德距离的方阵,欧几里德距离是基于笛卡尔坐标的两点之间的线段的长度。在 scRNA-seq 的情况下,这些笛卡尔坐标是基因表达测量值,因此直观地,我们会预期相距很短距离的细胞在基因表达上非常相似,因此是相似的细胞类型,而相距较远的细胞具有非常不同的基因表达模式,因此反映了完全不同的细胞类型(例如,神经元和红细胞)。然而,这种度量并不总是适合这种解释。这是因为维度的诅咒,过多的维度会导致数据集中的数据点看起来与所有其他数据点等距,从而难以得出数据趋势的结论,导出有意义的聚类和局部邻域,并确定其他类型的模式。为了解决这个问题,我们将我们的距离转换为亲和力,这量化了我们数据中观察值之间的局部相似性。(这就是 PHATE 中“基于亲和力”的“A”的来源!)这些亲和力与距离成反比,使得两个观察值在欧几里得空间中相距越远,它们的亲和力越小;同样,它们越接近,它们的亲和力越大。亲和力通常是通过使用核函数来转换欧几里得距离来计算的。简而言之,这是您的概率质量或密度函数减去归一化因子/系数,以确保概率介于 0 和 1 之间。它们经常用于其他机器学习问题,如支持向量机。你可以猜到一个流行的核是高斯核:

其中 X 和 y 是高维空间中的坐标 X ,而ε是测量由该内核捕获的邻域的“扩散”或半径的带宽度量。PHATE 论文的作者使用了一个稍微高级一点的核函数,它在量化相似性方面做得更好,为了简洁起见,我将省略其细节。虽然这是保存数据集局部结构的一个方便的技巧,但是仅仅嵌入它们就会破坏全局结构,就像 tSNE 的情况一样。因此,除了保留本地结构,PHATE 的另一个目标是维护数据的全局关系。为了实现这一点,PHATE 通过马尔科夫随机游走,使用亲和力来“扩散”数据。当我们说扩散时,我们指的是从高浓度区域到低浓度区域的净扩散。在亲和力的上下文中,这可以被认为是从高亲和力(即,我们的高维数据集中的一簇细胞)到较低亲和力(即,更分散的细胞)。更直观地说,我们可以认为这是一个房间中的热量从一个温暖的来源(例如,一个壁炉)传播到一个不太温暖的区域(例如,你在你的沙发上),这可以在数学上建模为热量方程,其解是热核。这就是 PHATE 中“H”的来源,热扩散。至于随机行走,这代表了通过我们的高维空间的连续随机步骤的轨迹(即,从一个单元到另一个单元的转换),其中每个可能的步骤或转换具有沿着所述路线前进的确定概率。你可以认为这是房间里的热量随机向房间的一个角落扩散,然后转换方向。这被更广泛地称为随机过程。在我们的上下文中,单元 I 到单元 j 的概率取决于我们访问的最后一个单元。现在,所有的术语都已经说完了,让我们来看看它是如何工作的!

我们首先通过归一化我们先前计算的亲和力来计算我们随机行走的初始概率。这会产生以下结果:

在哪里

这给出了在单个时间步长内从小区 x 移动到小区 y 的 N 乘 N 转移概率矩阵。

在论文中,这种矩阵的一个简单术语是扩散算子。在数学上,为了获得有效的扩散,我们将扩散算子提高到最佳的步骤数 t,以学习数据的全局结构。这给了我们在 t 时间步长内从单元 x 转换到单元 y 的概率。使用更大的 t,我们可以在高维空间中覆盖更多的距离,并了解更多关于全局结构的信息,而不会被我们基于单时间步长亲和力的概率的局部性所束缚。你可以把这想象成寻找一条徒步旅行路线来构建周围的地图:每走几步,你就放下一个标记来记录你之前的位置,通常是在显著的地方(例如,一棵大树,一条河岸,等等)。),而不是每一步都设置标记。这可以让你建立一个该地区的总地图,而不会被每一个单独的树枝和树枝所拖累。为了简洁起见,我将省略如何计算这个最佳步长 T 的技术细节,这在 PHATE 论文中有描述,使用冯诺依曼熵,但这都要加入到我们的“转换”算法的“T”中。

好了,我们一方面用我们的亲和力来捕捉附近细胞之间的局部关系,另一方面用一个强大的扩散算子来学习我们的全局空间。现在怎么办?嵌入这个幂扩散算子?没那么快。一个限制是,通过该算子得到的基于概率的细胞间距离(或扩散距离,如作者定义的那样)对远距离点之间的距离不太敏感,当我们考虑高维空间的边界点时,可能会遇到稳定性问题(本文将更详细地讨论这些缺点)。不过,这可以通过首字母缩写“P”来解决,P 代表潜力。作者定义了这个聪明的度量,称为潜在距离,受信息论和随机动力学的启发,我们从幂扩散算子测量对数转换概率之间的距离。这增加了我们的结果距离的敏感性,并使 PHATE 能够保存本地和全球架构的可视化目的。数学上,这定义如下:

在哪里

pₓᵗ指的是我们的扩散算子的 x 行,你会记得这是我们的转移概率矩阵的 t 次方。

当我们说这个距离度量更敏感时,假设从小区 a 到小区 b 的转移概率是 0.04,而从小区 a 到小区 c 的转移概率是 0.05。在这些扩散距离下,它们对折叠变化不是很敏感。距离 0.01 在试图将这种关系封装在较低维度的投影中时可能会遇到敏感性问题。然而,如果我们对这些概率进行对数变换并计算它们的距离,我们会得到一个更大的距离 0.223,这与这些概率分别为 0.4 和 0.5 是一样的(回想一下 log a - log b = log (a/b))。相当整洁!

好了,我们已经准备好“嵌入”了!通常,使用这些扩散度量,我们通常进行特征分解(即,通过所讨论的矩阵的特征向量将其分解,在这种情况下,我们的动力扩散算子)以导出数据的扩散图,这是用于研究 scRNA-seq 数据中分化轨迹的流行方法。然而,这种方法的问题在于,它将轨迹分解成无数反映扩散分量的特征向量。因此,这种高固有维度使得它们不适合可视化。为了绕过这个限制,作者使用公制多维标度(公制 MDS )嵌入了潜在距离矩阵。这是一种嵌入方法,通过最小化所谓的“压力”函数,为作为输入的距离矩阵定制:

虽然这个等式可能看起来令人生畏,但它本质上是在测量拟合度,在这种情况下,嵌入的坐标与我们寻求可视化的高维数据的拟合程度。压力越小,吻合度越大。因此,如果这些嵌入点的应力为零,那么数据已经在 MDS 嵌入中被成功捕获。由于噪声或少量的 MDS 维数(即 m = 2 或 3),可能出现小的非零值。然而,只要轨迹和其他关键特征得以保留,这种程度的失真通常是可以容忍的。

到目前为止,我所讨论的一切都可以从 PHATE 论文作者的这张图中直观地总结出来:

Moon 等人,Nature Biotechnology 2019,高维生物数据中的可视化结构和转换

如果你坚持了这么久,恭喜你!我们现在准备学习如何用 Python 实现 PHATE,并看看它的实际效果!为了简单起见,我们将使用流行的 MNIST 数据集的较小版本,其中我们有 8 乘 8 的手绘数字图像(你可以从论文作者那里找到一个例子,将 PHATE 应用于真实的 scRNA-seq 数据这里)。

使用 pip 或 pip3 安装 PHATE 库:

pip install phate

在您最喜欢的编辑器中创建一个新的 Python 文件,或者在 Jupyter 笔记本中创建一个笔记本,然后运行以下命令:

让我们运行这个程序来看看结果

python3 mnist_phate.py

作者图片

查看 PHATE 嵌入,您可以看到我们通常有清晰的数字分离,而簇本身有独特的形状和分布。让我们看看它与 PCA 和 tSNE 相比如何

作者图片

主成分分析(左)数据过于拥挤,难以得出具体结论。另一方面,tSNE (center)做得很好,将它们分离成一团簇,代价是数字如何与另一个数字相关的清晰全局结构,以及抑制簇内数据的独特传播。PHATE(右)调和了这些问题,在这里你可以清楚地分辨出聚类,并了解它们之间的关系(例如,3 和 9 有很多相似之处)。对于数字来说,这并不是什么大不了的事情,但是对于单细胞生物学来说,当我们研究诸如将干细胞转化为神经元的连续过程时,增加细胞如何从一种细胞类型转化为另一种细胞类型的细节是非常有用的。

在本文中,我们学习了 PHATE 算法,它是如何工作的,以及如何用 Python 实现它。如您所见,它很好地保存了数据的局部和全局方面。关于 PHATE 算法背后的数学的更多信息,以及更多的例子和与其他方法如 tSNE 和 UMAP 的比较,我鼓励你查看原始的出版物以及一些来自作者的关于 PHATE 和单细胞数据分析的教程

我希望你喜欢这篇文章。感谢阅读和快乐编码!

参考资料:

[1] K. Moon,D. van Dijk,Z. Wang,S. Gigante,D. Burkhart,W. Chen,K. Yim,A. van den Elzen,M.J. Hirn,R.R. Coifman,N.B. Ivanova,G. Wolf,S. Krishnaswamy,将高维生物数据中的结构和跃迁可视化 (2019),《自然生物技术》

为什么你应该从头开始建立一个神经网络

原文:https://towardsdatascience.com/why-you-should-build-a-neural-network-from-scratch-bdee4f265f08?source=collection_archive---------40-----------------------

机器学习

超越“进口卡”

我相信你以前听过这个建议。我知道我做到了。我在其他博客上读到它,在许多播客和采访中听到它,甚至我自己也有这样的想法,“我真的应该这么做。”但是很长一段时间,我没有。

如果你想让自己从其他数据科学家中脱颖而出,这是一个很棒的项目。不仅仅是展示你对数学和编程的理解,它还表明你有另一种重要的无形的品质,坚持到底。团队需要一个说到做到并且愿意付出更多努力的同事!

图片尼克·希利尔提供

从零开始构建神经网络从未如此简单,而且您不必独自完成。我关注了哈里森·金斯利和丹尼尔·库基拉最近出版的神经网络,你可以在 nnfs.io 找到它,哈里森正在研究 YouTube 上的章节。

媒体上还有大量其他免费指南,比如这里的、这里的和这里的。

为什么

Keras、PyTorch 和 MXNet 等软件包的成功使得机器学习比以往任何时候都更加可用和简单。即使对神经网络有基本的了解,人们也可以导入一个包,访问定制的神经网络、最先进的架构,并从大规模、预训练的网络中转移学习。

利用这种模型所需的复杂的数学和复杂的编程从你那里抽象出来,取而代之的是一个简单的。fit()和。predict()方法。这太棒了!这确实证明了这些包装的创造者的才华。这个 import Keras 调用中包含了大量的优化和先前的经验。

但是没有免费的午餐。尽管这些软件包非常有用和强大,但你总是要放弃一些东西作为交换。在这种情况下,控制和可定制性更加有限!这正是你作为初学者想要的,因为你可能不知道如何自己控制这个过程。同样,使用这些包没有任何问题。但是一旦你需要写一个定制的损失函数或者创建一个全新的架构,你可能会遇到一些麻烦。

更不用说使用这些包进行调试有时会很乏味,因为您必须通过许多层您不熟悉的方法调用来跟踪错误。最好快点失败!

这里有一个很好的指南,可以帮助你在喀拉斯和 PyTorch 之间做出选择。

怎么做

基础知识

最好从基础开始。对于神经网络,这意味着点积、矩阵乘法、理解数组/矩阵/张量、复习导数等。有很多工作要做!这就是为什么我建议遵循一些指南或框架,在你需要的时候回顾主题。

请记住,这应该是一个针对 理解 而不是针对 结果 的项目。最终目标是真正理解你在做什么,为什么。记住这一点,在你真正理解之前不要离开这个话题,如果你能向别人解释就更好了。

就我个人而言,当我写下来的时候,我对数学的理解要好得多。所以对于损失和激活函数的所有导数,我都在笔记本上做了详细的描述。

我的笔记本供参考。图片作者。

在上面贴上小纸条,如果这有助于你理解发生了什么,没人会看到的!(除非你决定把它贴在博客上)此外,把它全部写出来,你会觉得自己是个数学天才,可以用你的知识打动一些朋友。

时间框架

这不是一个能尽快完成的项目。同样,花尽可能多的时间去理解你在做什么和为什么。我花了大约 2 周的时间,每天工作几个小时,从头开始研究神经网络,但这是因为我有数学/统计学背景,并且有许多使用 Keras/TensorFlow 的项目。

如果你愿意,这很容易成为一个持续几个月的项目!这没什么不对!慢慢来。

编码

在花了一些时间理解基础知识和数学之后,你将开始真正的编码!我设置了一个 GitHub repo,为每个单独的主题创建了一个新文件,并创建了一个运行文件,在其中我将所有的主题编译在一起。这让我可以在需要理解的时候摆弄小块的材料和实验。

我曾多次回去清理我的类,根据需要进行重构,并根据需要添加新的类。

Softmax 激活类。图片作者。

接下来的步骤

这些可以是你想要的任何东西。对于一些人来说,简单的练习通过材料和编码所有这些类和方法将是最终目标。就我个人而言,我的计划是继续从头开始构建特性,因为我需要它们用于项目,或者因为我想要构建对新想法的理解。这也给了我一个很好的借口来尝试创建我自己的包,并发布它用于我自己的附带项目。

连接

我一直在寻找连接和探索其他项目!

LinkedIn|Medium|GitHub

为什么你应该考虑成为一名数据工程师而不是数据科学家。

原文:https://towardsdatascience.com/why-you-should-consider-being-a-data-engineer-instead-of-a-data-scientist-2cf4e19dc019?source=collection_archive---------1-----------------------

一个新的丛林之王出现了

瑞安·哈维在 Unsplash 上的照片

如果您喜欢这篇文章,请务必 订阅 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!

我只想说,你选择数据科学还是数据工程,最终还是要看你的兴趣和激情所在。然而,如果你正犹豫不决,不确定选择哪一个,因为他们有同样的兴趣,那么继续读下去吧!

一段时间以来,数据科学一直是热门话题,但一个新的丛林之王已经到来——数据工程师。在本文中,我将与您分享为什么您可能想要考虑从事数据工程而不是数据科学的几个原因。

注意,这是一篇自以为是的文章,从中拿取你想要的。话虽如此,我希望你喜欢!

1.数据工程从根本上来说比数据科学更重要。

我们都听说过“垃圾进,垃圾出”这句话,但直到现在,公司才开始真正理解这句话的含义。机器学习和深度学习可能很强大,但只有在非常特殊的情况下。除了需要大量的数据和对 ML 和 DL 的实际使用,公司需要自下而上地满足数据需求层次

作者创建的图像

就像我们在社会需求(即关系需求)之前有身体需求(即食物和水)一样,公司需要满足通常属于数据工程范畴的几个要求。注意数据科学,特别是机器学习和深度学习,是最不重要的事情。

简单来说,没有数据工程就没有数据科学。数据工程是成功的数据驱动型公司的基础。

2.对数据工程师的需求越来越大。

如我之前所说,公司意识到对数据工程师的需求。因此,目前对数据工程师的需求越来越大,这是有证据的。

根据 Interview Query 的数据科学面试报告显示,2019-2020 年数据科学面试人数仅增长 10%,而同期数据工程面试人数增长 40%

同样, Mihail Eric 对 Y-Combinator 的招聘信息进行了分析,发现数据工程师的职位比数据科学家的职位多出大约 70%。

你可能会问,“当然,增长率要高得多,但是绝对数字呢?”

我冒昧地从 Indeed、Monster 和 SimplyHired 网站上搜集了所有数据科学家和数据工程师的招聘信息,我发现这两个网站上的职位列表数量差不多!

总共有 16577 个数据科学家职位列表和 16262 个数据工程师职位列表。

作者创建的图像

3.作为一名数据科学家,数据工程技能非常有用。

在更成熟的公司中,工作通常是分离的,以便数据科学家可以专注于数据科学工作,而数据工程师可以专注于数据工程工作。

但大多数公司一般不会这样。我认为大多数公司实际上都要求他们的数据科学家了解一些数据工程技能。

许多数据科学家最终需要数据工程技能。

作为一名数据科学家,了解数据工程技能也是非常有益的,我将举一个例子:如果你是一名不懂 SQL 的业务分析师,每次你想收集见解时,你都必须让数据分析师查询信息,这在你的工作流程中造成了瓶颈。类似地,如果你是一个没有数据工程师基础知识的数据科学家,那么肯定会有这样的时候,你不得不依靠其他人来修复 ETL 管道或清理数据,而不是自己做。

4.数据科学比数据工程更容易学。

在我看来,作为一名数据工程师学习数据科学比作为一名数据科学家学习数据工程技能要容易得多。为什么?有更多的资源可用于数据科学,有许多工具和库可以让数据科学变得更简单

因此,如果你正在开始你的职业生涯,我个人认为花时间学习数据工程比数据科学更值得,因为你有更多的时间来投资。当你有一份全职工作,并且已经进入职业生涯几年的时候,你可能会发现你没有能力或精力投入同样多的时间在学习上。所以从那个角度来说,我觉得还是先学比较难的境界比较好。

5.它包含了一个尚未开发的机会市场。

我说的不仅仅是工作机会,而是创新的机会,用新的工具和方法让数据工程变得更容易。

当数据科学最初被大肆宣传时,人们发现了学习数据科学的几个障碍,如数据建模和模型部署。后来出现了 PyCaret、Gradio 这样的公司来解决这些问题。

目前,我们正处于数据工程的初始阶段,我预见到了一些使数据工程变得更容易的机会。

感谢阅读!

虽然这是一篇固执己见的文章,但我希望这能让你明白为什么你想成为一名数据工程师。我想重申一点,你选择数据科学还是数据工程,最终还是要看你的兴趣和你的激情所在。一如既往,我祝你在努力中好运!

不确定接下来要读什么?我为你挑选了另一篇文章:

</4-reasons-why-you-shouldnt-be-a-data-scientist-e3cc6c1d50e>

又一个!

特伦斯·申

  • 如果你喜欢这个, 跟我上媒 了解更多
  • 有兴趣合作吗?让我们连线上LinkedIn
  • 报名我的邮箱列表 这里

为什么您应该考虑将数据分析集成到您的业务中

原文:https://towardsdatascience.com/why-you-should-consider-integrating-data-analytics-into-your-business-5844d3a0c8c3?source=collection_archive---------28-----------------------

如今,我们都被数据淹没了,尤其是公司。他们中的许多人不知道如何使用它,他们把钱放在桌子上。

弗兰基·查马基在 Unsplash 上拍摄的照片

很长一段时间以来,人们依靠他们的经验来做商业决策。在很难全面了解一家企业的时候,这没什么。你必须依赖你的知识,日复一日,年复一年。现在,我们手边有多年前的相同信息。那么为什么没有更多的人使用它呢?为什么经理们不介意错过数据分析可以给他们带来的好处?同时在其他渠道寻求更小的收益。

我为什么要在乎?

简单来说,知识就是力量。想想你现在和 5 年前所知道的,那时这些知识有多大价值。没人说你做了错误的选择。但是如果你知道你现在所知道的一切,你肯定会做出不同的选择,并且会过得更好。

看看股市就知道了,尽管内幕交易是高度非法的,但却是一种稳赚不赔的方式。如果你知道世界上其他人不知道的事情,你就比市场上的其他人(你的竞争对手)更有优势。同样的概念也适用于你的企业。如果你的竞争对手利用所有可用的数据来了解,他们对你的两个客户都有更多的了解。因此,他们比你有巨大的优势。知道顾客想要什么类似于知道一只股票一个月后的价格。你变得主动,而不是被动。积极主动可以让你给顾客他们想要的东西,而不需要他们提出要求。如果你比你的竞争对手先这么做,他们就会争先恐后地追赶你。

我需要什么样的数据?

如果利用得当,一切都是有用的。例如,观察几年内的销售情况将有助于您发现客户习惯的模式。你的销售可能有你以前没有意识到的季节性,让你可以提高或降低价格来利用这一点。你可能会发现,某个月你改变了你的产品或销售技巧,销售额直线上升。这些信息是非常有价值的,然后你可以决定让这种改变永久化,开发它并利用它成为你的优势。

定性数据呢?定性数据只是关于你的业务质量和特征的数据。你的顾客有多满意?你的运营中存在怎样的痛点?一旦您有了这些信息,您就可以开始消除这些棘手问题的实际工作了。这可以减少客户流失,增加回头客,并吸引新客户。

一个好的公司会有定性和定量数据的混合。它们是互补的:它们讲述了同一个故事的两个方面。定量数据可以告诉你你所做的改变是如何影响你的底线的。定性数据可以告诉你你的客户是如何看待这些变化的。

如果我没有任何数据怎么办?

如果你的公司没有收集数据并储存起来以备后用,我建议你马上开始。这可以是非常简单的事情,如销售数字、客户数量、平均订单价格…至于定性数据,可以简单到向您的客户发送一份调查问卷。如果你正在这样做,不要因为参与率而气馁。根据你的客户群,你仍然可以以 5%的比率获得有用的信息。

也有很多地方可以从互联网上获取数据。这都是关于了解你的目标市场。也许通过查看关于你所在邮政编码的人的数据,你发现家庭收入比你预期的要高。你可以提高价格,但销量不变。从二手资料中找到更多关于你的客户的信息没有你自己做的有用。然而,这总比什么都没有好。

我已经了解我的市场,为什么我还需要这个?

我们作为人类,天生就偏向于自己的世界观。这意味着我们会经常给自己讲一些故事,这些故事与我们已经知道的相吻合。如果一个人在某个职位上呆的时间足够长,他们对客户行为的微小变化就不会那么敏感。他们不太可能注意到他们的运营中存在痛点,因为这是他们长期以来的行事方式。这不是批评,我们都对此感到内疚。这就像几年后第一次见到一个朋友,你注意到他们外表的所有微小变化。然而,对于你经常见到的另一个朋友来说,这些变化不太明显,你已经看到它们在这些年里逐渐发生了。

看数据可以让你后退一步,忘记你所知道的所想的。它消除了一些我们都会犯的偏见。这将让你以一种全新的眼光看待你的业务和运作。透过你的潜在顾客正在透过的同样的镜头。事物从外面看起来总是不同的,而从里面看却是不同的。这是非常强大的。

我从哪里开始?

显而易见的起点是雇佣一名数据科学家、一名分析师,或者重新指派一名现有员工全职从事这项工作。然而,并不是每个人都有这样的预算。另一种方法是自己动手,或者让你组织中的某个人花些时间来做这件事。在互联网上有多个地方可以学习数据分析的基础知识,比如数据清理、可视化和统计测试。这可能是复杂的,也可能是简单的,就像你想象的那样,你可以全押,也可以只看表面。重要的是要记住,积少成多,尤其是当你开始的时候。当你没有这样的过程时,你的边际收益是巨大的。因此,开始进行这种分析可以产生切实的结果。

结论

数据分析可以成为你武器库中非常强大的工具。它可以帮助你在竞争中领先一步,并改善你的业务。如果利用得当,它可以改变你对自己的经营和市场的看法。很有可能,你已经拥有了开始工作所需的一切。把它想象成用冰箱里的剩菜做一顿美食。而不是他们只是坐在那里,你采取主动,投入一点工作,并以一顿大餐结束。你永远不知道,你可能会让自己大吃一惊,结果会比你预想的好得多。

作为数据分析师,为什么应该学习数据科学

原文:https://towardsdatascience.com/why-you-should-learn-data-science-as-a-data-analyst-7d4fd205c729?source=collection_archive---------37-----------------------

即使你不打算成为一名数据科学家

图片由 Wokandapix 来自 Pixabay

如果你是一名数据分析师或者正在考虑成为一名数据分析师,你可能会认为你不需要学习数据科学。作为一个首先是数据科学家,然后是数据分析师的人,我从来没有意识到当我成为数据分析师时,知道如何建立机器学习模型会有多么有用。今天,我想讨论为什么数据分析师应该考虑学习数据科学,即使他们不打算成为数据科学家。

增加你被雇用的机会

初级分析师的工作竞争激烈,你拥有的任何额外技能都可以在求职者中脱颖而出。查看 LinkedIn,Time 的这个数据分析师职位显示有超过 3700 名申请人,而 Blue Bottle 的这个数据分析师职位在发布后一周内就有超过 2500 名申请人。

中高级数据分析师的工作职责可能需要你知道如何建立模型。公司可能会发布包含大部分数据分析师职责的数据科学家职位,并将构建模型作为另一项要求。如果你学习如何建立基本的机器学习模型,这将使你有资格获得这些类型的混合职位,并且与不需要建模经验的数据分析师职位相比,有理由获得更高的工资。

例如,这个 Twitter 中级数据科学家职位没有提到构建模型是工作职责的一部分,但要求申请人在数据驱动分析/预测分析/统计建模/机器学习/数据挖掘 方面具有“ 2 年以上的工作经验”,如果你有“ ”构建 ML 模型 ”的经验,则还有 加分 。这个 Atlassian 高级数据科学家职位在工作职责中不需要建模,但在 下很好,但不是必须的,如果你有 “它提到了 使用统计和机器学习方法建立描述性和预测性模型的经验 ”。

如果你不了解数据科学的基础知识,你可能会失去被选入高级职位的机会。

使用数据科学进行数据分析

机器学习模型可以提供找到用户行为预测器的捷径。例如,移动产品经理想知道是什么原因导致用户继续使用该应用程序,而不是停止使用。作为数据分析师,您可以按用户分析应用事件,以确定哪些事件显示出最高的保留率。现在想象一下,如果您有 100 个事件要分析,这将是多么耗时。如果你使用一个机器学习模型来预测用户的应用留存,你可以得到一个导致用户回到应用的顶级事件列表。这可能会将需要分析的事件列表从 100 个减少到 10 个,因为模型显示剩余的 90 个对用户保留没有影响。

你没有建立一个模型来预测未来,你可以使用模型输出作为指导,在哪里寻找更深一层。

我曾经有一个数据分析师职位的带回家作业,上面写着“一个电影工作室的执行制片人给了你这个数据集,希望你简要概述一下从中得出的有趣见解,这将有助于工作室的业务。”我在电影数据上使用了一个机器学习模型来寻找多种可行的见解而不是作业要求的一种见解,并且能够更快地找到这些见解。

https://medium.com/swlh/how-i-used-a-machine-learning-model-to-generate-actionable-insights-3aa1dfe2ddfd

拓展你的职业选择

我之前提到过,数据科学家头衔的工作包括构建机器学习模型,但大多数是数据分析师的职责。如果您不想全职构建模型,但喜欢从事数据分析师项目,您可能更喜欢这种类型的混合角色。或者,你可以从一名数据分析师开始,但改变主意,决定成为一名数据科学家。如果你已经花时间作为一名数据分析师学习数据科学,你就更接近于建立你的技能组合来申请数据科学家的职位。

当你第一次开始做数据分析师时,已经有许多技能需要学习,你可能会决定不值得花额外的时间学习数据科学。我希望现在你知道了好处,即使你不打算成为数据科学家,你也会重新考虑学习数据科学。

你可能也会喜欢…

为什么您应该学习数据科学中的有效沟通

原文:https://towardsdatascience.com/why-you-should-learn-effective-communication-in-data-science-3d0e1ac6aadb?source=collection_archive---------9-----------------------

跨越技术和非技术之间的沟通鸿沟

杰森·罗斯韦尔在 Unsplash 上的照片

数据科学与工程的软技能我见过最显著的差距就是沟通。没有足够多的人知道如何在技术和非技术受众之间进行翻译。想想你的工作。当你在做一个 sprint 回顾,展示一个演示,或者只是和某人交谈时,你能为观众量身定做你的演讲吗?许多人在这项技能上挣扎,它经常导致团队之间的裂痕,这些团队并不完全了解彼此。今天,我想分享一个故事,为什么沟通是至关重要的,以及我在与过去的客户合作时的经验教训。

了解企业需要什么

业务和技术人员之间稳固沟通的第一步是理解;企业需要你做什么?当我和我以前的一个客户一起工作时,我花了第一个月的时间深入研究他们已经开始的项目。我想知道他们在用他们的数据做什么,为什么。本质上,他们想要查看电子设备的数千条记录,并找到故障。

很容易运行并创建一个数据科学项目,当查看问题陈述时可以发现失败。例如,您可以查找故障代码,检查异常,并运行最复杂的算法来找出数据中的模式。但是在你跑去做那件事之前,你确定那是全部的问题吗?

是的,客户想要查看电子设备的数千条记录并找到故障,但他们想要的不止这些。他们试图了解为什么会发生这些故障,我们是否能检测出故障的一个或一组原因,故障的具体类型,等等。通常,我们在数据科学中面临的业务问题并不像乍看起来那么简单,因此,学会如何沟通和提出正确的问题至关重要。为什么理解客户的需求很重要?因为你需要为他们提供一个能够满足他们需求的解决方案。在你深入研究你的解决方案之前,从提问开始。

当我评估业务需求并与我的客户或企业客户合作时,我首先会考虑以下几个方面:

  • 您是否正确理解了业务问题和需求?
  • 您看到的可以利用数据科学的用例有哪些?
  • 是否还有其他应该涉及的领域,比如 DevOps,web 应用开发等。?

根据你的数据,安排会议讨论你解决这些问题的初步想法。你从客户那里得到的反馈是什么?当你召开这些会议时,你还应该讨论你目前没有数据的任何事情,并讨论你或你的客户可以做些什么来解决这个问题。

  • 他们能给你提供更多的数据吗?
  • 你能把问题陈述改成能与你现有的数据一起工作的东西吗?

如果你有任何绝对的阻碍,让你无法前进,那就提出来。这是你确保项目在正确的道路上开始的时候,如果这意味着指出重要的问题,那么就指出来。我共事过的大多数人宁愿有人提前指出大的风险和障碍,也不愿隐藏问题。

告诉企业你能提供什么

一旦您对业务需求和现有数据的可能性有了很好的认识,您就可以开始起草解决方案了。无论是创建概念证明、开发某种形式的演示,还是提供一组解释您的解决方案的图表,都要确保您与客户进行了沟通。您的客户或顾客想知道您能为他们提供什么样的解决方案和他们拥有的数据。

在开发解决方案时,我个人的偏好是展示渐进的进展,并在过程的每一步获得反馈。无论你喜欢哪种流程,反馈都是关键。通过寻求反馈,你和你的客户一起了解你所采取的方法是否有效,是否提供了他们期望的结果。当您最初起草计划时,他们可能已经同意了这种方法,但是实施有时会出现意想不到的结果。经常征求反馈有助于消除在项目结束时除了你之外没有人满意的解决方案的问题。

如果你像我一样,寻求反馈可能会是一次令人伤脑筋的经历。比如,他们会讨厌我的整个解决方案吗?我是不是做错了什么,把整个项目搞砸了?诸如此类,可能会突然出现在你的脑海里。但老实说,反馈可以比这更好、更有用。当我与客户一起工作以寻求反馈时,我经常关注我们最初定义的他们的业务问题。

  • 该解决方案是否解决了您的业务问题?
  • 您是否从该解决方案中看到了意想不到的结果,如果是,为什么?
  • 你能告诉我你看到了什么吗?
  • 通过已经执行的分析,数据看起来是否如您所期望的那样?如果不是,你看到了什么不同?

将这些对话与他们的工作和对数据的理解联系起来,会使对话更加顺畅。

将你的成果转化为他们的成功

现在你已经了解了你的业务问题,并创建了解决这些问题的方案,你如何将你的成果转化为你的业务成功呢?你如何展示你所做的过程改进和你正在分析的数据的力量?老实说,对我来说,这项技能很难学。我可以做技术工作,我可以与企业互动并了解他们的需求,但我不知道如何以企业可以理解的积极方式展示这一点。高管不想知道你正在做的技术工作的本质细节,他们想知道对业务的影响。

当谈到能够将技术工作转化为业务时,我得到的最佳建议是在改进之前、之中和之后获取指标。使用这些指标来展示为什么你的工作是有益的。我见过的一些常用指标包括:完成一项或一组任务所需时间的减少,特定活动成本的减少,或者产品失败次数的减少。无论你从事哪个行业,都要找到并理解你公司的通用指标。与您的业务合作伙伴合作,了解他们希望如何看到量化的改进,然后展示您工作的这些指标。

最后的想法

那么,为什么技术和非技术交流是数据科学中的关键呢?因为它能决定一个项目的成败。无论你从事哪个领域,交流都可能很困难。但是,在从事数据科学项目时,尝试在技术和非技术同事之间进行翻译会变得更加困难。我在数据科学和 STEM 领域面临的最大问题之一就是这种沟通差距。没有足够的技术人员能够将他们的工作翻译给非技术观众,他们也不能将业务需求翻译成技术能力。今天,我与大家分享了我是如何接近我的一位老客户的,了解他们的业务需求,提供解决方案,并转化结果。在这次经历中,我学到的最大的教训是什么?如果你和我一样,寻求反馈可能会很伤脑筋,但它可能会改变一个项目进展是否顺利的游戏规则。

为什么您认为技术和非技术交流是数据科学的关键?

节日快乐,感谢您的阅读!我希望你喜欢阅读我所学到的东西。如果你愿意,你可以通过这个链接成为一名灵媒来支持我的写作。

为什么要在深度学习之前学习回归分析

原文:https://towardsdatascience.com/why-you-should-learn-regression-analysis-before-deep-learning-a2ef1b31383e?source=collection_archive---------13-----------------------

照片由 Unsplash 上的静止不动

介绍

第一,我不是说线性回归比深度学习好。

其次,如果你知道自己对计算机视觉、图像识别或语音识别等深度学习相关的应用特别感兴趣,那么这篇文章可能与你不太相关。

但是对于其他人,我想给出我的想法,为什么我认为学习回归分析比深度学习更好。为什么?因为时间是有限的资源,你如何分配你的时间将决定你在你的学习旅程中走多远。

因此,我将给出我的两点意见,为什么我认为你应该在深度学习之前学习回归分析。

但是首先,什么是回归分析?

简单来说,回归分析通常与线性回归互换使用。

更一般地说,回归分析是指一套用于估计因变量和自变量之间关系的统计方法。

然而,一个很大的误解是,回归分析仅仅指线性回归, 并非如此。回归分析中有许多非常强大和有用的统计技术。这引出了我的第一点:

第一点。回归分析更加通用,具有广泛的适用性。

线性回归和神经网络都是在给定一些输入的情况下可以用来进行预测的模型。但是,除了做出预测,回归分析还允许您做更多的事情,包括但不限于:

  • 回归分析让你了解变量之间关系的强度。使用 R 平方/校正 R 平方等统计测量值,回归分析可以告诉您数据中的总可变性有多少是由您的模型解释的。
  • 回归分析告诉您模型中哪些预测因子具有统计显著性,哪些不具有。更简单地说,如果你给一个回归模型 50 个特征,你可以找出哪些特征是目标变量的良好预测者,哪些不是。
  • 回归分析可以给出它估计的每个回归系数的置信区间。您不仅可以估计每个特征的单个系数,还可以获得系数所在的置信水平(例如 99%置信)的系数范围。
  • 还有更多…

我的观点是,回归分析中有很多统计技术,可以让你回答更多的问题,而不仅仅是“给定 X(s),我们能预测 Y 吗?”

第二点。回归分析不是一个黑箱,更容易交流。

在选择模型时,我总是考虑两个重要因素,一是如何简单,二是如何可解释

为什么?

更简单的模型意味着更容易交流模型本身如何工作以及如何解释模型的结果。

例如,大多数商业用户理解最小二乘和(即最佳拟合线)的速度可能比反向传播快得多。这很重要,因为企业对模型中的底层逻辑是如何工作的感兴趣——在企业中,没有什么比不确定性更糟糕了——黑盒是它的同义词。

最终,理解模型中的数字是如何得出的以及如何解释它们是很重要的。

第三点。学习回归分析会让你从整体上更好地理解统计推断。

信不信由你,学习回归分析让我成为了一个更好的程序员(Python 和 R),一个更好的统计学家,并且让我对构建模型有了更好的理解。

为了让您更加兴奋,回归分析帮助我了解了以下内容(不限于此):

  • 构建简单和多元回归模型
  • 进行残差分析并应用像 Box-Cox 这样的变换
  • 计算回归系数和残差的置信区间
  • 通过假设检验确定模型和回归系数的统计显著性
  • 使用 R 平方、MSPE、梅伊、MAPE、PM 评估模型,这样的例子不胜枚举…
  • 使用方差膨胀因子识别多重共线性(VIF)
  • 使用部分 f 检验比较不同的回归模型

这只是我所学到的一小部分东西,我只是触及了皮毛。因此,如果你认为这听起来像一个整洁的演出,我敦促你去看看,至少看看你能学到什么。

怎么可以学习回归分析?

最近,我发现学习一个新话题的最好方法是从学院/大学找课程讲座或课程笔记。令人难以置信的是网上有这么多免费的东西。

特别是,我将留给您两个很好的资源,您可以使用它们开始工作:

https://online.stat.psu.edu/stat501/

感谢阅读!

我希望你觉得这篇文章很有见地!请记住,我的观点是基于我的经验,可能与你的不一致,没关系!如果你对此有共鸣,并同意我的观点,我鼓励你深入这个话题——你不会后悔的。

一如既往,我祝你在努力中好运!

不确定接下来要读什么?我为你挑选了另一篇文章:

又一个!

特伦斯·申

  • 如果你喜欢这个, 跟我上媒 了解更多
  • 有兴趣合作吗?让我们连线上LinkedIn

为什么在部署计算机视觉模型时应该监控图片的清晰度

原文:https://towardsdatascience.com/why-you-should-monitor-your-pictures-sharpness-when-deploying-computer-vision-models-1e039c7aa08a?source=collection_archive---------47-----------------------

永久地评估你从一个设备上获得的图片的质量可能会帮助你保持一个健壮的模型而不是盲目的模型!

查理·伊根在 Unsplash 上的照片

听说过沸蛙综合症吗?

杰克·汉密尔顿Unsplash 上拍照

如果你把一只青蛙扔进一锅沸水中,它会很快跳出来!

但是,如果你把青蛙放入冷水中,逐渐增加温度,青蛙会享受一会儿热水浴,不久,它就会毫无抵抗地让自己被煮死。

我们知道,当数据特征与用于训练模型的数据特征“轻微偏离”时,这同样适用于机器学习模型。

这种现象被称为“畴变”。

我最近遇到了一个有趣的域名迁移案例,我想分享一下,以及监控这种变化的潜在对策。

又一个失败了!

监控摄像头的延时拍摄(已剪辑)
作者制作的动画

在左侧,您可以观察到由监控摄像机广播的图片的裁剪部分的 50 天时间推移。

随着时间的推移,很容易发现由于灰尘沉积,照片变得多么模糊。

(注:我希望我能够分享整个图片,但由于明显的保密原因,我不能)

由于模型使用这一部分来推断制成品的一些特征,不用说,随着图片变得模糊,深度学习算法的性能开始缓慢下降,这可能比从清晰的图片到空白的图片更难检测(还记得青蛙的故事吗?).

在其“模糊性”的顶峰,该部分几乎不提供任何信息(见下文)。

同一区域的不同清晰度/模糊度级别—图片由作者提供

我们如何评价一张照片的清晰度?

因此,在这种特殊情况下,当摄像机提供的图片开始超过预定义的清晰度阈值并需要清洁时,提醒车间人员可能会很有意思。

唯一的问题是我们如何评估它?

您可能知道,图片被编码成 n 维数组(1 层用于灰度图片,3 层用于 RGB 图片)。如果你对这个概念不放心,我向你推荐这篇文章:

例如,对于表格数据集,我们可以监控每个特征的统计特征(最小值、最大值、平均值、标准偏差等。)但是我们可以在下面看到,使用这些指标并不能让我们区分上面的 3 张图片:

Image_0: Min:  69 | Mean : 146 | Max : 187
Image_1: Min: 107 | Mean : 155 | Max : 192
Image_2: Min: 107 | Mean : 151 | Max : 181Image_0: Min:  #1 | Mean :  #1 | Max :  #2
Image_1: Min:  #3 | Mean :  #3 | Max :  #3
Image_2: Min:  #3 | Mean :  #2 | Max :  #1

(文末链接源代码)

然而,我们可以假设,当照片变得模糊时,每个像素之间的数值距离开始减小。

如下所示,当像素值与其周围的差异增加时,锐度将会更高:

作者对两种不同灰度图像的清晰度比较

救援的梯度!

因此,我们需要找到一种方法来计算图片中从一个像素到另一个像素的变化。

当我们根据以 x 为中心的轴绘制变化时,模糊图形和清晰图形之间的差异是显而易见的:

围绕 x 中心轴的两个图形的锐度比较—图片由作者提供

如果你之前一直在学习机器学习,那么你一定很熟悉梯度计算。基本上,这是所研究的函数在特定位置的导数(这对于定义成本函数的最优值非常有用)。

我们如何计算梯度呢?当然,有一个 NumPy 函数可以做到这一点,但我很乐意提供它背后的解释!

让我们以三个不同但简单的阵列为例:

三个简单的 3x3 阵列,具有不同的数字组织—图片由作者提供

让我们取随机数组的第一行:1,3,0,并考虑一个线性函数(y=θx)允许从一个像素到另一个像素。

作者对[1,3,0]矢量图像的梯度计算

  • 从 1 到 3,函数是“y = 2x”,它的导数是“2”。
  • 从 3 到 0,函数为“y = -3x”,其导数为“-3”。
  • 在 3 处,梯度是前一个和后一个梯度的平均值:“-0.5”(=(2–3)/2)。

让我们将这些值与峰值最高的“正常”数组的第二行进行比较:

  • 从 1 到 5,函数是“y = 4x”,它的导数是“4”。
  • 从 5 到 1,函数是“y = -4x”,它的导数是“-4”。
  • 值为 5 时,渐变将是前一个和后一个渐变的平均值,因此为“0”(=(4–4)/2)。

让我们平均这些梯度的绝对值:

  • [1,3,0]:(| 2 |+|-0.5 |+|-3 |)/3 =1.83
  • [1,5,1]:(| 4 |+| 0 |+|-4 |)/3 =2.67

结论:二线似乎更“犀利”!

并且,通过平均两个轴(x 和 y)周围的所有梯度,我们得到以下结果:

  • 零点数组: 0 (这里不奇怪!)
  • 随机数组: 1.89
  • “正常”数组: 2.67

我们去大的!

既然你理解了“为什么”和“如何”,我们可以从延时拍摄的照片中迭代,看看是否有我们可以研究的模式。这段时间从 1 月 19 日到 3 月 1 日。

车间团队可以在他们的控制屏幕上监控摄像机的清晰度,因此他们决定在此期间的某个时候清洗摄像机。我们能发现它吗?

梯度平均值从 2001 年 19 月变为 2003 年 1 月—图片由作者提供

清洗发生在指数 64 到 65 之间!很容易,因为我们看到梯度平均值(=锐度)从 0.8 增加到 1.4。

现在我们可以定义一个阈值(0.9 或者 1 呢?)系统地警告团队,并要求他们清洁相机以保存高质量的照片😀

像往常一样,您会找到相应材料的链接:

不要犹豫,在评论中分享你的经验或自己的做法吧!

皮埃尔-路易

https://pl-bescond.medium.com/pierre-louis-besconds-articles-on-medium-f6632a6895ad

为什么你不应该成为一名数据科学家

原文:https://towardsdatascience.com/why-you-should-not-become-a-data-scientist-1595085d2715?source=collection_archive---------15-----------------------

数据科学并不适合所有人。你是其中之一吗?

UnsplashNeONBRAND 拍摄的照片

介绍

如果你正在阅读这篇文章,你可能已经意识到作为一名数据科学家的好处:

  • 它有良好的工资和福利;
  • 这个领域越来越受欢迎;
  • 这是一个影响驱动的角色;
  • 它提供了相当不错的工作保障。

然而,尽管它们听起来很棒,我认为数据科学并不适合所有人。

残酷的事实是,大多数考虑追求数据科学的人——尤其是纯粹基于利益的人——可能最终不会成为数据科学家。

不过没关系。在我看来,追求你不感兴趣的事情有极大浪费时间的风险。由于沉没成本谬误,在你职业生涯的后期,做出改变人生的决定通常要困难得多。

为了避免这种情况,我们需要问自己为什么我们想要从事数据科学。看到好处并被角色吸引很容易,但考虑缺点也同样重要。

以下是我根据自己的经验列出的为什么你应该而不是成为数据科学家的理由。如果你不想看这篇文章,我下面有一个视频,你也可以看看。

除了阅读这篇文章,你还可以观看我在 YouTube 上关于这个话题的视频。

多学科领域

JJ 英Unsplash 上拍照

数据科学是数学、计算机科学和商业领域知识的融合;随后,该领域有着相当高的教育准入门槛。

这种主题的组合可能是一种祝福,也可能是一种诅咒。数据科学非常广泛,总是有新的东西要学习,但是要学习和保持最新的新技能的数量很容易让人感到难以承受。

除此之外,许多公司也不知道他们在寻找什么样的数据科学家。这增加了为了学习技能而学习更多技能的压力。

在我参加的一些“数据科学家”申请和面试中,雇主实际上只是在寻找数据分析师或机器学习工程师。在某些情况下,他们只是在寻找一个数据独角兽:将所有与数据相关的问题抛给某人,希望他们能解决这些问题。

尽管在任何职业中你都应该努力学习和提高,但我认为在数据科学中尤其如此,因为它是学科的混合体。如果你不是那种喜欢一直学习的人,数据科学可能不是一个好的选择。

入门级饱和度

布鲁克·卡吉尔在 Unsplash 上的照片

总体而言,数据科学越来越受欢迎,这意味着入门级职位的竞争也在加剧。相对而言,我是最近才毕业的(也是在疫情之前),我有幸亲身体验到了 T4 的乐趣。

现在有很多大学提供数据科学课程。随着每年越来越多的人入学,现在数据科学专业的应届毕业生比以往任何时候都多。我记得我的机器学习教授说,他对他的课程每年注册人数的百分比增长感到惊讶。

然而,竞争初级职位的不仅仅是毕业生;还有一些分析师正试图转变成他们的第一个数据科学家角色。

再加上高教育门槛和工作模糊性导致公司不知道他们在寻找什么,许多求职者正在努力克服这第一个障碍。

在我看来,与更有经验的职位相比,尝试进入数据科学领域要困难得多。你可能会对其他职业说同样的话,但数据科学仍然是一个成熟的角色。在它进一步稳定之前,尝试获得第一份数据科学家的工作会感到非常沮丧。

角色模糊

照片由本·怀特Unsplash 上拍摄

这可以追溯到数据科学作为一个多学科领域的第一点。由于数据科学角色的模糊性,雇主在招聘广告中列出所有流行的数据科学工具来吸引最优秀的人才是可以理解的。

这种模糊性和最近围绕数据(如“大数据”和“人工智能”)的大肆宣传意味着,正在组建数据科学团队的企业可能实际上没有适当的基础设施;每个人都对数据科学感到兴奋,但并不真正了解它是什么以及它的要求。

不幸的是,真正知道如何利用数据科学的公司仍然是少数(如网飞、Spotify 等。).如果你试图进入数据科学领域,从统计数据来看,你在这样一家公司起步的机会要低得多。

此外,我发现围绕数据科学的角色模糊性和神秘性意味着人们很容易有更高的期望;出于这个原因,你很容易觉得自己作为一个新手必须取悦所有人。这样做只会让你的待办事项清单迅速失控。

根据经验,在寻找初级职位时,这种情况很难避免——尤其是如果你迫切需要经验的话。我还注意到,那些知道自己想要什么的雇主会寻找与他们使用的工具相关的非常具体的经历。因此,你职业生涯中不那么严谨、混乱的开端,可能不会给你提供在这些公司中更有经验的职位所需的更专业的技能。

当我申请初级职位时,我试图通过在面试中问更多的问题来回避这个问题。我发现这是真正了解雇主是否知道他们在谈论什么的唯一方法,但它很快就会重复(尤其是在大量申请的时候)。

数据和更多数据

Alexander SinnUnsplash 上拍摄的照片

老实说,数据并不性感。

数据科学家的大部分时间都花在计算如何处理他们拥有的数据上。如果没有可用的数据,您可能需要自己设置一些东西来收集数据。

一旦你有了数据,你很可能会花很多时间清理它。正如我听到人们说的:“垃圾进来,垃圾出去”。

一旦你清理了数据,并按预期工作,你甚至可能不得不建立自动化管道,这样你就不必每次都做同样的事情(除非你有数据工程师)。这使过程更加复杂,如果有东西坏了——根据 Sod 定律,肯定会有东西坏的——你就是需要修理它的人。如果那个坏掉的东西对业务至关重要?好吧,祝你好运。

正如你所看到的,在找到好东西之前,要为许多乏味的任务做好准备。如果你被期望拥有你的项目,尤其是这样。就我个人而言,我发现有很多商业政治,数据探索,检查技术限制,并确保该项目实际上回答了问题。

在我看来,如果你发现自己不喜欢花很多时间做无聊的任务,那么不幸的是,数据科学可能不适合你。

跟上学习进度

像任何其他工作一样,你应该始终努力保持学习;但是对于数据科学,我发现这样做尤其重要。

正如我不断重申的,数据科学是一个多学科领域:好的一面是在这些子领域中总有东西可以学习;坏的一面是,它会让人觉得你什么都得学。

数据科学的发展速度意味着,如果你不努力跟上,你将很快落后。此外,随着雇主在招聘广告中列出他们听说过的所有顶级数据科学术语的趋势,你可能会觉得除了尝试和学习一切,别无选择。

如果你对这门学科没有真正的热情,那么就很难跟上学习的步伐。这可能是一个很难弄清楚的问题,但这是一个需要问自己的重要问题。

这也是我有一段时间不确定的事情,这就是为什么我总是试图说服人们开始做他们自己的事情。一旦我在空闲时间做了自己的数据科学项目、写了博客并开通了 YouTube 频道,我意识到我可能非常喜欢这个主题(至少在不久的将来)🙂).

结论

作为结束语,这篇文章的目的不是要把任何人拒之门外。我只是相信我们的时间是我们拥有的最有价值的东西,所以希望我已经让一些人在一头扎进去之前从不同的角度思考了。

记住数据科学的好处和缺点,如果你仍然想从事数据科学,就试一试——这是你知道自己是否真正喜欢它的唯一方法。

如果你喜欢这篇文章,你可以在 Medium 上关注我,或者在 YouTube 上查看我的其他视频。如果你想通过电子邮件了解我在做什么,你可以考虑注册我的简讯

原载于 2021 年 12 月 24 日 https://leonlok.co.uk**

为什么你不应该依赖 t-SNE,UMAP 或 TriMAP

原文:https://towardsdatascience.com/why-you-should-not-rely-on-t-sne-umap-or-trimap-f8f5dc333e59?source=collection_archive---------7-----------------------

理解大数据

使用 PaCMAP 来提高可解释性和速度

作者创作的情节

t-SNE、UMAP 和 TriMap 等降维技术在数据科学领域中无处不在,鉴于它们令人印象深刻的视觉性能(结合易用性),它们因此可以在给定数据集的任何完整探索性数据分析中找到。然而,这些特定的方法(t-SNE、UMAP 和三分图)可能不应该是你降维的首选。在这篇文章中,我将解释为什么,并推荐最近发表的 2020 年的替代方案,它更容易理解,结果质量更高,运行速度更快,需要的手动调整更少——所有这些都是好东西👍 🍾

在我们开始之前,我要指出,我本人一直是(现在仍然是)t-SNE、UMAP 和 TriMAP 的忠实用户。可悲的是,这些技术的内部工作的技术细节经常被忽略,尤其是对于经验较少的从业者,这对于视觉结果的解释具有后果。具体来说,了解每个算法在保留全局局部结构方面的权衡是很重要的。除了解释问题,t-SNE(如在scikit-learn中)等常用的实现可能会慢得令人恼火,导致浪费大量时间来设置算法,潜在地微调它们,最后随着人们不断重启他们的everything_in_here.ipynb笔记本,一遍又一遍地运行它们。最后,也许是最重要的,当我们已经知道最终的标签(例如,对于典型显示的基准,如 MNIST,Cifar10 等)时,许多算法可以在教程设置中进行调整,以产生超级令人印象深刻的视觉效果。),但当在现实生活中对未知数据集使用它时,知道如何解释给定的可视化要困难得多,因为我们不一定事先知道关于数据集的全部信息——在这里,默认情况下更经常第一次就“正确”的算法无疑是一种优势。

在这篇文章中,我们简要回顾了各种降维技术背后的直觉,然后介绍并回顾了一种更新的 PaCMAP⁴算法。这种新算法设法改善了全局与局部的权衡,在没有参数调整的情况下表现良好,速度快,易于使用。此外,该算法的超参数非常直观,并且可以用于在关注局部结构和关注全局结构之间平滑过渡。我并不主张放弃诸如 PCA、t-SNE、UMAP、三分图等方法,但对于大多数意图和目的,我认为 PaCMAP 等算法应该是你的首选,尤其是如果你是一个新手或有急事。

PS。我与 PaCMAP 的创建者没有任何关系,但是我强烈建议您去阅读他们的论文,以获得更深入的介绍!

降维方法

降低高维数据集的维度(例如,如果我们在表格数据集中有超过 3 列)允许我们潜在地获得对数据集中底层聚类的更多理解,或者获得对数据分布的直觉(例如,用于比较训练和测试数据集)。目标是在数据中保留尽可能多的“结构”/信息,使得在原始高维空间中相距较远的点在低维空间中也相距较远,对于相距较近的点则相反。总的来说,这些算法可以分为两个主要原型;那些旨在保持局部结构(彼此非常相似的观察)和那些旨在保持全局结构(彼此非常不相似的观察)。

众所周知,用这些算法创建的可视化投影可能会产生误导,例如,反映不存在的聚类或暗示聚类彼此接近,尽管它们并不接近。因此,在解释使用降维算法进行的任何投影时保持非常保守的态度,并对算法本身有所了解是一个好主意。下面简要回顾几个著名算法的直觉。

PCA: 这里数据(潜在相关的)被重构为不相关的主成分,这些主成分包含由方差度量的数量递减的信息。使用这种方法仅可视化第一个初始组件(描述大部分方差)本质上是一种主要捕获数据的全局结构的方法。

t-SNE: 这里使用梯度下降来寻找低维嵌入,其中点 ij 之间的相对距离与原始高维空间中的相对距离相匹配,在不太直观的困惑度参数的控制下,该参数确定用于高维空间中相对距离计算的条件分布的标准偏差。该方法主要关注局部结构,因为它在相对距离计算中关注最近的邻居。

UMAP: 这里构建一个最近邻的加权图,顶点是观测值/数据点,然后使用随机梯度下降优化一个低维图,使其在结构上尽可能与高维图相似。与 t-SNE 相比,UMAP 有很多优势,因为它更好地保留了全局结构,速度更快,并且具有稍微更多的可解释超参数,但其核心是在图形的构造中使用最近邻居之间的距离,因此专注于局部结构。

三重图:这里三元组(三个观察值的集合)主要是从最近的邻居创建的,但是一部分三元组也包含一个或两个随机采样点。然后,该算法尝试使用批量梯度下降来寻找较低维度的嵌入,这保持了三元组的距离排序。从理论上讲,这种方法设法同时包含了局部全局结构,但在实践中,通常会发现它容易与局部结构发生冲突。

PaCMAP 简介

PaCMAP 论文中,他们表明 t-SNE、UMAP 和 TriMAP 等方法都可以被视为基于图的算法,节点是观察值,边构成这些观察值之间的相似性度量——给定高维图,定义并优化损失函数,以找到结构相似的图的低维表示。基于这种认识,他们首先研究了已知算法的损失函数以及各种虚拟损失函数,并由此能够推导出构成“理想”损失函数的几个关键原则(论文第 4 节)。其次,他们研究如何优化低维图,以保持局部和全局图结构,再次表明大多数算法是如何近视的(即关注局部结构)。作者提出了一种使用中-近观察值对的方法,以及在收敛期间动态选择哪些图形元素被优化,使得算法最初获得正确的全局结构,随后细化局部结构(论文的第 5 部分)。

选择更好的损失函数和建议的图优化技术的结合构成了新方法 PaCMAP ,作者表明该方法在局部和全局结构上都具有良好的性能。此外,它们表明,所建议的算法对初始化相当鲁棒,并且通过使用默认超参数在所选数据集上工作良好,同时在所有 11 个测试数据集上明显快于最快的其他算法。

比较结果

让我们重新运行论文中的一些实验,比较几种算法的结果。运行 PaCMAP 就像运行任何其他降维算法一样简单——在我自己的比较中,我测试了以下 PyPi 包中的算法:来自scikit-learn==0.24.1的 t-SNE、umap-learn==0.5.1的 UMAP、trimap==1.0.15的 TriMAP 和pacmap==0.3的 PaCMAP。为了创建我的嵌入,我使用了下面的小代码片段——这里的要点是我使用了所有的默认设置,没有调整。

在论文中,他们有一个很好的可视化效果,他们使用不同的技术将一只猛犸象的 3D 图像还原到 2D。尝试重新创建,我得到了以下所有默认超级参数的结果:

作者创作的情节

很明显,t-SNE,至少在默认参数下,主要关注局部结构,UMAP 更好地捕捉了全局结构,TriMAP 在全局结构方面做得很好,但在局部结构方面失败了(参见 feet & horns),而 PaCMAP 似乎捕捉了全局和局部结构。与此同时,PaCMAP 仅用时 8.4 秒,比 TriMAP 的 12.56 秒、UMAP 的 24 秒和 t-SNE 的 69 秒都要快。

我对算法进行了更多的压力测试,对经典的 MNIST 数据集(60,000 张训练图像,784 个像素列)进行了相同的测试。结果如下,同样使用所有默认超级参数:

作者创作的情节,颜色表示 MNIST 不同的数字图像

在这里,我们看到 t-SNE 将聚类均匀地分布在中心周围,这可能有助于保持局部结构,但似乎不包含太多关于全局结构的信息——此外,我们看到该算法实际上似乎也识别出一些错误的聚类(红色、棕色和紫色的聚类,我们只“知道”,因为我们有这些标签)。同样,这些结果与 PaCMAP 论文中看到的一致,表明 t-SNE 和 UMAP 主要关注本地结构,TriMAP 关注全球结构,而 PaCMAP 同时关注两者。

这两个例子与 PaCMAP 论文中显示的内容非常吻合——我鼓励每个人都去阅读这篇论文,看看更多的例子、量化和解释。

结论

如前所述,我并不主张放弃 PCA,t-SNE,UMAP,TriMAP 等。然而,时间往往是至关重要的,因此我认为 PaCMAP 提供了两个相当大的好处;1)默认情况下,局部和全局结构都被捕获,如果需要,可以很容易地使用超级参数在局部和全局结构之间改变焦点,2)速度更快。在降维不是分析的核心部分,并且您没有时间彻底调查大量超参数、算法等的情况下,这些好处尤其重要。

一个完整的分析应该包括多种算法和超参数,同时确保可以根据对特定算法的了解来解释每个实验之间的差异。

最后,感谢 PaCMAP 论文的作者。

[1]劳伦斯·范德·马腾和杰弗里·辛顿,使用 t-SNE 可视化数据(2008),机器学习研究杂志 9,2579–2605

[2]利兰·麦金尼斯,约翰·希利,詹姆斯·梅尔维尔,UMAP:一致流形逼近与降维投影(2018),https://arxiv.org/abs/1802.03426

[3] Ehsan Amid,Manfred K. Warmuth,TriMap:使用三元组进行大规模降维(2019),【https://arxiv.org/abs/1910.00204

[4]王英凡,,辛西娅·鲁丁,亚龙·沙波什尼克,理解降维工具如何工作:解读 t-SNE、UMAP、TriMAP 和 PaCMAP 用于数据可视化的实证方法(2020),

为什么不应该在幂 BI 中用 0 替换空白

原文:https://towardsdatascience.com/why-you-should-not-replace-blanks-with-0-in-power-bi-f05a89456533?source=collection_archive---------26-----------------------

有人要求您在报表中用 0 替换空白值吗?也许你应该三思而后行

照片由 Siora Photography 在 Unsplash 上拍摄

就在最近,我作为 Reid Havens 的直播嘉宾观看了 Jeffrey Wang,Jeffrey 与观众分享的十几个精彩内容之一是 DAX 引擎在为我们的措施创建最佳查询计划时执行的优化列表。

引起我注意的一个问题是关于所谓的“稀疏措施”:

作者截图

简单地说,一旦定义了度量,VertiPaq 中的公式引擎将向查询中添加一个隐式的非空过滤器,这将使优化器能够避免维度表的完全交叉连接,并且只扫描那些维度属性组合的记录确实存在的行。对于来自 MDX 世界的人来说,非空函数可能看起来很熟悉,但是让我们看看它在 DAX 中是如何工作的。

最让我产生共鸣的事情是,当 Jeffrey 建议在幂 BI 计算中不要用零(或任何显式值)替换空白。我已经写了如何处理空白并用零替换它们,但是在这篇文章中,我想把重点放在这个决定可能的性能影响上。

搭建舞台

在我们开始之前,一个重要的免责声明:不要用 0 替换空白的建议只是建议。如果业务请求是显示 0 而不是空白,并不一定意味着你应该拒绝去做。在大多数情况下,您可能甚至不会注意到性能下降,但这取决于多种不同的因素…

让我们从编写简单的 DAX 度量开始:

Sales Amt 364 Products =
CALCULATE (
    [Sales Amt],
    FILTER ( ALL ( 'Product'[ProductKey] ), 'Product'[ProductKey] = 364 )
)

使用这个度量,我想计算 ProductKey = 364 的产品的总销售额。而且,如果我将这个度量的值放入 Card visual 中,并打开 Performance Analyzer 来检查处理这个查询的时间,我会得到以下结果:

作者图片

执行 DAX 查询只花了 11 毫秒,一旦切换到 DAX Studio,公式引擎生成的 xmSQL 非常简单:

作者图片

而且,如果我看一下查询计划(物理的),我可以看到存储引擎只找到 1 个现有的值组合来返回我们的数据:

作者图片

添加更多配料…

然而,假设业务请求是在日常级别上分析产品关键字 364 的数据。让我们为我们的报告添加日期:

作者图片

这又一次非常快!我现在将检查 DAX Studio 中的指标:

作者图片

这一次,查询扩展到包括日期表,这影响了存储引擎需要做的工作,因为这一次不是只找到一行,而是找到了不同的数字:

作者图片

当然,您不会注意到这两种场景之间的任何性能差异,因为差异只有几毫秒。

但是,这仅仅是一个开始,我们只是在预热我们的 DAX 引擎:)…在这两种情况下,正如您可能看到的,我们只看到“填充的”值—我们的两个要求都得到满足的行的组合—产品关键字是 364,并且只有我们销售该产品的那些日期—如果您仔细查看上面的插图,日期是不连续的,有些日期是缺失的,例如 1 月 12 日、1 月 14 日到 1 月 21 日,等等。

这是因为 Formula Engine 足够智能,可以使用非空过滤器消除产品 364 没有销售的日期,这就是为什么记录数为 58:我们有 58 个不同的日期,其中产品 364 的销售不为空:

作者图片

现在,让我们假设商业用户也希望看到中间的那些日期,其中产品 364 没有取得任何销售。所以,我们的想法是显示所有这些日期的金额。正如在上一篇文章中已经描述的,有多种不同的方法来用零替换空格,我将使用 COALESCE() 函数:

Sales Amt 364 Products with 0 = COALESCE([Sales Amt 364 Products],0)

基本上,COALESCE 函数要做的是检查所有提供的参数(在我的例子中只有一个参数),并用您指定的值替换第一个空白值。简单来说,它会检查销售金额 364 产品的值是否为空—如果不是,它会显示计算出的值—否则,它会用 0 替换空。

作者图片

等等,什么?!当我过滤掉除产品 364 之外的所有产品时,为什么我会看到所有产品?更不用说,我的表现在花了 2 秒多的时间来渲染!我们来看看后台发生了什么。

作者图片

现在我们有 3 个查询,而不是生成一个。第一个与前一个案例完全相同(58 行)。但是,其余的查询以 Product 和 Dates 表为目标,从这两个表中提取所有的行(Product 表包含 2517 行,而 Dates 表包含 1826 行)。不仅如此,请看一下查询计划:

作者图片

460 万张唱片?!究竟为什么会这样?!让我给你算一下:2.517 * 1.826 = 4 . 596 . 042…所以,这里我们在产品和日期表之间有一个完整的交叉连接,强制检查每个元组(日期-产品的组合)!发生这种情况是因为我们强迫引擎为每个元组返回 0,否则将返回空白(并因此被排除在扫描之外)!

这是对所发生事情的简单概述:

作者插图

信不信由你,有一个优雅的解决方案可以开箱即用地显示空白值(但是,不是用 0 代替空白)。您只需点击日期字段,并选择显示没有数据的项目:

作者图片

这也将显示空白单元格,但不会在 Product 和 Dates 表之间执行完全交叉联接:

作者图片

我们现在可以看到所有的单元格(甚至是空白的),这个查询花费了前一个查询一半的时间!让我们检查由公式引擎生成的查询计划:

作者图片

并非所有场景都是灾难性的!

说实话,我们可以重写我们的方法来排除一些不需要的记录,但是这仍然不是引擎消除空记录的最佳方式。

此外,在某些情况下,即使用零替换空白也不会导致性能显著下降。

让我们来看看下面的情况:我们显示每个品牌的总销售额数据。我将添加产品 364 的销售额度量:

作者图片

正如你所料,这相当快。但是,当我添加用 0 替换空白的度量时会发生什么呢,这在前面的场景中造成了混乱:

作者图片

嗯,看起来我们不用为性能付出任何代价。让我们检查一下这个 DAX 查询的查询计划:

作者图片

结论

正如 Jeffrey Wang 所建议的,您应该避免用零(或任何其他显式值)替换空格,因为这将极大地影响查询优化器消除不必要的数据扫描的能力。但是,如果出于某种原因,您需要用一些有意义的值替换空白,请注意何时以及如何进行。

通常,这取决于许多不同的方面——对于基数较低的列,或者当您不显示来自多个不同表的数据时(就像在我们的示例中,当我们需要组合来自 Product 和 Dates 表的数据时),或者不需要显示大量不同值的可视化类型(即卡片可视化)——您可以在不付出性能代价的情况下获得成功。另一方面,如果您使用显示大量不同值的表格/矩阵/条形图,请确保在将该报告部署到生产环境之前检查指标和查询计划。

感谢阅读!

成为会员,阅读媒体上的每一个故事!

为什么你应该更加关注知识图表?

原文:https://towardsdatascience.com/why-you-should-pay-more-attention-to-knowledge-graphs-ea88ba38e6c1?source=collection_archive---------29-----------------------

简而言之:建模和解决复杂的现实世界的问题。找出方法?继续读!

Unsplash 上的 Pietro Jeng 拍摄

在这个数据时代,我们从多个不同来源生成大量数据,最近,知识图表的构建有了显著增长。现在,我们看到知识图表是几个领域的热门话题,如医学、电信甚至社交媒体。

这个想法很简单,我们将从一个领域收集的所有数据聚合到一个像 Graph 这样的数据结构中。我们更喜欢像图形这样的数据结构,因为它可以捕捉复杂的现实生活场景。通常,这个图的大小是巨大的,在这样的图中看到数百万或数十亿个实体并不罕见。

“知识图”一词是由谷歌引入的,并很快流行起来。广义地说,我们可以将任何包含一些知识/重要信息的相当大的图命名为知识图。

示例:一些非常流行的知识图表包括:

  1. 谷歌知识图谱拥有 5000 亿个事实和 50 亿个实体。
  2. 亚马逊产品图。
  3. 开源知识图: DBpediaWikidata 等。

知识图构建

照片由 Danist SohUnsplash 上拍摄

那么知识图的组成部分是什么呢?让我们来了解一下这些巨大的图形是如何构造的。

知识图通常被表示为有向图,因此该图的每个实体可以被称为一个三元组。

三元组,顾名思义,是由 3 个元素组成的元组,即:源节点、关系和目标节点。

命名法:

三元组的元素可以使用不同的名称,例如:

  1. (s,p,o):主语,谓语,宾语
  2. (h,r,t):头,关系,尾
  3. (s,r,t):源,关系,目标

让我用一个小例子来详细说明这一点。

图表示例(来源:作者)

在上图中,我们有 4 个节点和 3 条边,或者我们可以说有 3 个三元组。其中一个三元组是:

(《额仁》《欲》《自由》)

其中 二人 是源节点, 想要 是关系, 自由 是目标节点,这是有向关系。正如我之前提到的,一个知识图将由几个这样的三元组组成。

知识图的重要性

我们已经了解了知识图以及它们是由什么组成的。那么,这种图表有什么用呢?

知识图可以以几种不同的方式使用。构建图表的每个领域都有自己的用例。

照片由 Alina GrubnyakUnsplash 上拍摄

例如,在生物医学领域,我们有一个蛋白质相互作用(PPI)网络的例子,这是一个由人体中发现的蛋白质及其相互作用组成的图。这些类型的图用于识别重要的蛋白质复合物,也用于研究不同类型的药物测试或疾病感染中蛋白质相互作用的行为。简而言之,PPI 网络可以帮助我们发现针对现有疾病的新药或任何像新冠肺炎这样的新药。

谷歌的知识图是关于优化搜索引擎和向用户传递相关信息的。如果你在谷歌中使用关键字“星际”进行搜索,你会收到关于电影《星际穿越》的信息,以及类似于其他太空科幻电影的其他推荐。会有一些关于星际空间的科学文章,或者只是一本解释其含义的字典。谷歌希望了解用户试图搜索的内容的上下文,并在顶部显示最相关的信息。

Orange 正在开发自己的知识图谱,名为未来事物。这里,数据是从现实生活中存在的物理实体收集的,例如交通灯、地理位置数据、建筑数据、城市数据等。为此,采用了几个物联网连接设备,数据包含环境的结构和语义描述。这里的主要思想是将现实世界的实体映射到数字世界,并构建几个对最终用户有帮助的用例,如信息检索。

鸣谢:我曾在位于塞斯顿-塞维尼的 Orange Labs 实习,主题是未来事物知识图的数据质量改进,使用最先进的机器学习技术。

我已经提到了三个例子,但还有其他几种可能性,比如电影推荐(在网飞这样的网站上),新朋友推荐(在脸书和 Instagram 这样的网站上)等等。

一些问题

照片由印尼 UXUnsplash 上拍摄

这听起来不错,所以让我们构建知识图表并从中获益,对吗?

事情没那么简单。由于知识图本身的庞大规模,在处理该图时存在一些问题。其中一些问题列举如下:

  1. 缺失数据或质量差的数据:当我们构建图形时,信息以三元组的形式注入数据库。很多时候,由于数据损坏或其他因素,会有一些信息丢失。解决这个问题的过程被称为知识图精化或知识图完成。
  2. 图的非欧几里德性质:使用图数据结构的一个优点是我们可以从现实世界中捕捉复杂的交互。但是,由于图形的复杂性质,我们不能将它们直接用作机器学习算法的输入来建立预测模型。已经对图结构进行了一些研究,并且我们有诸如知识图嵌入的方法,其在低维空间中生成实体的数字表示。随后,这些嵌入可用于构建机器学习模型,但不是图本身。

我们还有图形神经网络(GNN ),这是一种可以应用于图形数据的神经网络方法。即使在这里,我们也需要用数字表示图中的节点来构建 GNN 模型。

我已经在图形神经网络上发表了两篇有趣的文章,解释了我们如何使用 PyTorch 几何 python 库构建 GNN 模型。如果您对基于图形的分析感兴趣,我建议您查看它们。

我会写更多关于知识图及其嵌入技术的文章。敬请期待!

如果你看到了这篇文章的这一部分,感谢你的阅读和关注。我希望你觉得这篇文章内容丰富,如果你有任何问题,请随时通过 LinkedInTwitterGitHub 联系我。

为什么你可能永远不应该在某个地方使用熊猫=正确

原文:https://towardsdatascience.com/why-you-should-probably-never-use-pandas-inplace-true-9f9f211849e4?source=collection_archive---------1-----------------------

如果你使用它,它的确是图书馆的诅咒,也是你的祸根

本文将解释 pandas inplace=True关键字的含义,它的行为方式,以及为什么你可能永远不应该使用它。

熊猫是一个大图书馆;有许多不同的方法可以让你用熊猫写一个程序来达到同样的结果。然而,每种不同的方法在性能、可维护性,当然还有代码风格方面可能有很大的不同。我写了几篇关于熊猫图书馆其他领域的文章,如果你感兴趣的话,可以看看:

这篇文章将涵盖有争议的inplace=True,如果你在代码中使用它,它(剧透警告)会给你带来负面影响。

熊猫是我能想到的最好的例子。我只能道歉。(熊猫的功劳归于露西·谢泼德),其余的怪物是我自己的。

简介——什么是真实的?

如果你有使用inplace关键词的经验,这对你来说并不新鲜,只是简单回顾一下它是如何工作的。Inplace 是一个被许多 pandas 方法接受的参数,它影响方法如何运行的行为。您可能经常看到这个关键字的一些例子(但希望不要在您自己的代码中实现)是方法;.fillna().replace().rename(),不胜枚举。

原地=真

在 pandas 方法中使用inplace=True关键字会改变默认行为,这样 dataframe 上的操作不会return做任何事情,而是“修改底层数据”(稍后会详细介绍)。它改变了你应用它的实际对象。

这意味着引用此数据帧的任何其他对象(如切片)现在将看到数据的修改版本,而不是原始版本。

想象有一个冰淇淋,它是冷冻的,但你想融化它。如果你使用inplace=True,你改变对象的状态。你不能拿回你的未融化的冰淇淋。

下面是一个简单的例子,展示了熊猫的情况:

>>> ice_cream = pd.DataFrame({
        "state": ["frozen"], "flavour": ["vanilla"]
    })
>>> ice_cream state   flavour
0  frozen  vanilla

现在让我们做融化(在这种情况下,这是一个简单的字符串.replace(),不要与熊猫.melt()混淆)。

>>> ice_cream.replace({"frozen": "melted"}, inplace=True)
>>> ice_cream state   flavour
0  melted  vanilla

冰淇淋变凉了!

当我们就地融化时,我们改变了冰淇淋的基本结构。图片作者。

原地=假

或者,当使用inplace=False(这是默认行为)时,dataframe 操作返回 dataframe 的副本,保持原始数据不变。我们不再受物理定律的约束,我们可以鱼与熊掌兼得。让我想想…

因为有人融化了我们的冰淇淋,我们必须先重新做一次…

>>> ice_cream = pd.DataFrame({
        "state": ["frozen"], "flavour": ["vanilla"]
    })
>>> ice_cream state   flavour
0  frozen  vanilla

现在让我们再次熔化它,但是这次使用inplace=False(我们不一定要传递它,因为它是默认选项,但是为了便于说明,我们在下面已经这样做了)。

>>> melted_ice_cream = ice_cream.replace({"frozen": "melted"}, inplace=False)
>>> ice_cream state   flavour
0  frozen  vanilla

所以当我们回头看我们最初的冰淇淋时,我们看到它没有融化,但我们确实有一个融化的冰淇淋,现在我们两个都有了;两倍多的冰淇淋…

>>> melted_ice_cream state   flavour
0  melted  vanilla

当 inplace=False 时,首先制作数据的副本,以便原始冰淇淋/数据保持完整。图片作者。

如前所述,不仅仅是.replace()的关键字参数可用,您还会在许多不同的方法中看到它,例如.fillna().sort_values().query().drop_duplicates().reset_index(),等等。

使用 inplace 的动机=True

人们伸手拿inplace=True的原因有很多,我试着用以下几点来描述我多年来听到的许多事情。

  1. 我不需要中间结果,只需要最终输出。为什么我要不断制作包含冗余数据的副本?这个程序应该像一个冰雕师,在同一块冰上凿来凿去,直到雕塑完成!
  2. 我的计算机内存有限——不需要昂贵的副本,就地修改数据帧不是更高效、更快吗?
  3. 我不想为所有这些中间步骤想出变量名…
  4. 我真的没有想过,我只是把它当成一种习惯。

如果您认为还有其他原因需要使用inplace=True,请随意评论,我会将它们添加到列表中(希望有适当的反驳)。

对动机的反应

我不需要中间结果,只需要最终输出

这在快乐的道路上可能是正确的(当一切顺利时),但是在开发/测试/调试期间,您可能想要在管道中的不同点检查一些中间值,当您的数据状态不随时间改变时,这更容易做到。

这种模式中真正危险的部分之一是对象的变异,这很容易让讨厌的 bug 爬进来。改变对象状态的代码被描述为具有“副作用”,因为运行代码的行为以某种方式改变了系统的状态;在这种情况下,inplace=True具有修改原始数据帧的副作用。让我们看一个简单的例子,看看这是如何导致问题的。

假设我们有一个表,其中包含每个城市的销售额,我们希望生成一个销售排名靠前的城市的排行榜,并计算所有城市的总销售额。

def create_top_city_leaderboard(df):
    df.dropna(subset=["city"], inplace=True)
    df.sort_values(by=["sales"], ascending=False, inplace=True)
    return dfdef calculate_total_sales(df):
    return df["sales"].sum()df = pd.DataFrame(
    {
        "city": ["London", "Amsterdam", "New York", None],
        "sales": [100, 300, 200, 400],
    }
)

我们运行这两个任务的顺序并不重要,因为它们在理论上是完全独立的。让我们试着运行这些函数,看看会发生什么。

>>> df = pd.DataFrame(
        {
            "city": ["London", "Amsterdam", "New York", None],
            "sales": [100, 300, 200, 400],
        }
    )>>> calculate_total_sales(df)
1000>>> create_top_city_leaderboard(df) city  sales
1  Amsterdam    300
2   New York    200
0     London    100

到目前为止,一切看起来都很好,但是让我们看看如果我们再次计算总销售额会发生什么:

>>> calculate_total_sales(df)
600

该死,我们刚刚损失了 400 英镑,这是一个昂贵的错误!如果你正在编写一些调用这个函数的代码,而你不熟悉create_top_city_leaderboard里面的代码,你肯定会感到非常沮丧,因为它破坏了你的数据帧,并在你的代码中引起了一个错误——这是一个令人讨厌的副作用。

这看起来像是一个虚构的例子,但是在更复杂的代码中,如果您依赖可变状态,这种反模式很容易出现。通常你想对一个数据帧做很多事情,如果你不仅要考虑数据帧是什么,还要考虑数据帧将处于什么状态,那么就很难编写安全的代码来做这些事情。如果你从不改变对象的状态,你可以保证它们在任何时候都处于完全相同的状态,这使得程序的行为更容易理解和推理。

为了完整起见,这里是同一函数的非变异方法:

def create_top_city_leaderboard(df):
    return (
        df.dropna(subset=["city"])
          .sort_values(by=["sales"], ascending=False)
    )

不需要昂贵的数据复制,就地修改我的数据帧不是更高效更快吗?

当我找到这个问题的答案时,我有点惊讶,实际上在大多数情况下,仍然会创建一个副本,执行操作,然后作为最后一步,用新转换的副本覆盖以前的引用。这意味着在大多数情况下使用inplace=True并不会更有效。

我认为这可能是使用inplace=True时最常见和最有害的误解,当它以性能的名义完成时,却没有提供任何性能,并带来了额外的负面影响。

注意:在某些情况下,通过避免复制,它确实提供了一些性能上的好处,但是要知道一个特定的方法是否通过inplace=True参数提供了任何好处,您可能需要检查 pandas 源代码,如果您依赖于必须检查库源代码,那么在您的应用程序代码中,您的决策背后的意图可能并不清楚和明显。

在以性能的名义尝试inplace之前,有很多方法可以优化 pandas 代码。

我不想为所有这些中间步骤想出变量名…

如果你使用链接(这给你主要的熊猫风格点),那么你将不必!

inplace=True禁止使用链接,因为这些方法不返回任何内容。这是一个很大的风格上的打击,因为连锁是熊猫真正活起来的地方。

让我们比较一个糟糕的原地例子和一些漂亮的链接:

def create_country_leaderboard(df):
    country_df = df.groupby("country")[["sales", "refunds"]].sum()
    country_df.rename(index=str.lower, inplace=True)
    country_df.reset_index(inplace=True)
    country_df.sort_values(by="sales", inplace=True)
    return country_df

很恶心,我知道。现在,让我们看看如何美化它,也不必想出四个新的变量名。

def create_country_leaderboard(df):
    return (
        df.groupby("country")[["sales", "refunds"]]
          .sum()
          .rename(index=str.lower)
          .reset_index()
          .sort_values(by="sales")
    )

哦,耶,可爱,现在读起来像一场梦。

我真的没有想过,我只是把它当成一种习惯

很公平,现在你已经考虑过了,你终于可以停止这个习惯了。

停止就地使用的额外影响力=True

  • 如果您忘记在您的一行中添加inplace=True(我在编写其中一个示例时这样做了),您可能会错过数据帧上的一个操作,并且很难发现,因为您将有一个随机的行没有做任何有用的事情。
  • 如果你使用 Jupyter 笔记本,它会使管理不同对象的状态变得更加困难——如果一个改变你的数据帧的函数中途出错(在我写一个例子时也发生过这种情况),你会得到一个半变异的数据帧。

此外,核心 pandas dev 团队建议不要使用这个参数,并且已经讨论了反对这种行为的计划(我已经准备了冰镇香槟)。

GitHub 上有一个关于这个话题的冗长而有趣的讨论(此处)——所以如果你不相信我的话,请相信他们的。

结论

在软件工程中,当对你写的代码做设计决策时,经常要做出权衡。在inplace=True的案例中,使用这种模式几乎没有任何好处,但却有大量的成本:

  • 它鼓励一种危险的有状态的、副作用的编码风格,这很可能导致错误。
  • 它的行为不像人们普遍预期的那样(并且很少提供任何性能改进)。
  • 它移除了使用链接的能力,而链接(在我看来)是编写漂亮的熊猫代码的最佳点。
  • 该参数最终可能会被弃用(所以您可能已经习惯了不使用它)。

总之,inplace=True最好避免!

为什么您应该重新考虑在哪里编写 SQL

原文:https://towardsdatascience.com/why-you-should-rethink-where-you-write-your-sql-bd0954191212?source=collection_archive---------9-----------------------

分析工作需要可被发现。让我们来谈谈如何到达那里[以及像 Hyperquery 这样的文档工作区如何能有所帮助]。

当我还是一名数据科学家时,我花了大量的时间做产品分析工作——确定机会大小、深入试验、特别检查。但是尽管我使用了各种各样的工具——Jupyter/Python、tidyverse、超集、内部工具,甚至 Java UDF——大部分工作实际上是在 SQL 中完成的。我会怎么做?我会在 Superset 的内置 IDE 中编写查询,调整它,直到得到我所提问题的答案,将它与其他发现一起转储到 Google doc 中,然后作为电子邮件/Slack 消息发送出去,永远消失在企业噪音的海洋中。

如您所料,几周或几个月后,我会面临一个类似的问题,并且无法找到我过去的工作,我会重写相同的查询。由此,我对这个工作流程有了一个清晰的认识:

分析工作最难的部分不是工作。下周它又在做这项工作。

我将在下面讨论如何解决这个问题。这是对分析团队内部有组织协作的长期被忽视的优点的赞美,是对现代文档工作空间的情书(a la concept,Dropbox Paper,Confluence 等。),并一瞥我们自己的分析背后的动机——首先是文档工作空间、 hyperquery 。但是我有点言过其实了——在我们试图修复它之前,让我们先讨论一下什么东西坏了。

✂️剖析破碎的工作流程

一旦你写了一些 SQL,发掘了一些见解,并写下了你的工作,你在灵魂深处知道你需要做什么(尽管你可能会不时地试图让这种声音沉默):你需要让你的工作后代(或未来的你)理解这项工作。因此,我们中最优秀的人会写一份谷歌文档,记录我们的过程、我们的疑问、我们的见解,然后通过电子邮件 Slack 分享给我们的同事,让他们高兴地观看。“学术协作,成就斐然!”你可能会想。该工作流程可以简单地想象如下:

标准的洞察交付工作流程:回答问题,撰写作品,分享[图片由作者提供]

但是在分享工作的过程中,事情开始变得不明朗(注意上图中不祥的虚线)。我们将 insight 移交流程的这一步骤归入非常适合时间点共享的工具,代价是后续的发现和再现工作。Slack,Gmail ( 别让我入门在 Github 上进行见解分享)?今天在这里,明天就不见了(更不用说完全缺乏复制基于 SQL 的工作的平台)。为什么这是一个问题?因为你工作的生命周期很少在这里结束——它作为未来分析项目发现过程的一部分继续存在。

因此,当我们认为我们的工作已经完成,给我们的团队(和我们自己)留下了一系列证据证明“是的!我们以前在这方面做过工作”,事实上,我们给他们留下的只是面包屑,当你的工作实际上与他们相关时,他们会再次发现你的工作。在之前的博客文章中,我讨论了为什么可发现性和可再现性对于分析组织实现规模化至关重要,但这是痛苦的症结所在:知识丢失导致的浪费/重复努力。

标准洞察交付工作流程的真实面貌:回答问题,撰写作品,分享,在这一点上,它进入了其他人的洞察发现过程[图片由作者提供]

🛠用可发现的报道结束了比赛

任何中断循环的补救方法都很简单——关闭循环。这个循环可以通过简单地采用一个允许组织和发现过去工作的工具来完成。当然,有很多方法可以做到这一点,但请允许我滔滔不绝地说一会儿。也就是说,关于这篇文章的情书部分:虽然不新颖,但这个问题的一个很好的解决方案是现代文档工作区——像 Confluence、inconce、Dropbox paper、 Hyperquery 这样的工具不仅为用户提供了写文章的能力,而且可以组织结果,使其对更广泛的团队有意义。此外,丰富的搜索功能比通过松散的文档或 git 支持的笔记本更容易发现。它可能看起来很小,但用户体验得到了极大的改善。

曾经只有一点点的闲言碎语导致一个模糊的 Google 文档,现在已经有了过去的 SQL 查询、见解和由此产生的业务决策的年鉴。

通过更强大的共享空间实现更优化的闭环[图片由作者提供]

虽然这是一个小小的变化,但这一工作流程提供的可发现性和可见性不仅仅是分析师生活中的一个小小的 UX 改进——如果您允许我发表一会儿意见,这是开启分析协作的关键。过去几年围绕协作的创新主要集中在使技术协作更加可行/可及/强大(例如 Google colab),但这几乎不是协作。

协作不是两个用户在同一个地方,一起编写 SQL/Python/R。分析中的协作是关于知识共享、可发现性和可再现性

也就是说,我承认对这个特殊的解决方案有点偏见。我们已经构建了自己的文档工作区,名为Hyperquery,它通过在单个生态系统中实现 SQL 编写和知识共享,进一步封闭了这个循环。但是如果我没有提到还有其他的选择,那我就失职了。如果你已经开始使用 Google docs,我已经和使用取得一些成功的团队谈过了,对于基于 Jupyter 的工作流,我个人在 Airbnb 使用过知识回购来实现这个目的(尽管使用基于 git 的共享范例的摩擦有点令人痛苦地高)。但是,无论您选择使用什么工具,都要承认这些知识共享工作流程是减少冗余工作的关键一步。吃你的蔬菜——更仔细地考虑你在哪里储存你的工作,并提升你的分析团队。

结束语

我最后的战斗召唤?

  • 写下你的 SQL 工作。
  • 放在可以被发现的地方(doc 工作区)。

减少重复工作的关键是使查找过去的工作变得容易,文档工作区是一个很好的方法。

推文@ imrobertyi/@hyperquery来问好。👋
关注我们
LinkedIn。🙂 要了解更多关于 Hyperquery 的信息(并注册我们的私人测试版),请访问Hyperquery . ai。我们正在构建一种新的文档,将笔记、查询和数据整合到一个统一的、有组织的空间中。(如果你有兴趣帮助我们建设,我们正在招聘——查看我们的 空缺职位 )。)**

为什么应该开始使用 Pathlib 作为 OS 模块的替代

原文:https://towardsdatascience.com/why-you-should-start-using-pathlib-as-an-alternative-to-the-os-module-d9eccd994745?source=collection_archive---------4-----------------------

第一个原因:面向对象编程

作者制作的图像

作为一名数据科学家,我每天都要操作路径和文件来读写数据。

为此,我通常使用**os.path** Python 模块来执行诸如连接路径、检查目录内容或创建文件夹之类的操作。

事实上,使用**os.path**模块似乎是访问文件系统的自然选择。

在这篇文章中,我通过引入另一个名为 Pathlib 的路径管理库来挑战这种做法。
我们将了解这个库是如何工作的,它与 os.path 模块有何不同,它提供了哪些特性和优势,以及何时应该(或不应该)使用它。
**

事不宜迟,让我们来看看🔍

os 模块的“问题”

os模块很受欢迎:它已经存在一段时间了。然而,我一直认为它以一种不自然的方式处理路径。

这些是让我质疑其用途的原因:

  • **os**是一个大模块:它确实有一个**path**子模块来管理路径和连接它们,但是一旦你需要在这些路径上执行系统操作(创建一个文件夹,列出其中的内容,或者重命名和删除一个文件),你将不得不使用其他方法,这些方法要么出现在包层次结构的其他地方:(os.makedirs, os.listdir, os.rename,等等。)或从其他模块如**shutil**
    **glob**导入。经过一番挖掘,你仍然可以找到这些方法,但这似乎是不必要的努力
  • **os**以最原始的格式表示路径:字符串值。这是非常有限的:它不允许您直接访问诸如文件属性或其元数据之类的信息,也不允许您通过调用一些特殊的方法在文件系统上执行操作。
    例如,为了检查一条路径是否存在,你可以做一些类似**os.path.exists(some_path)**的事情。但是,如果通过类方法或属性更直接地从 path 对象访问这些信息,不是更容易吗?
  • **os**模块本身并不允许您在层次结构中找到匹配给定模式的路径。比方说,您想要递归地查找一个非常嵌套的文件夹结构中的所有__init__.py文件。为此,你必须将**os**与另一个叫做**glob**的模块结合起来。您当然可以习惯,但是您真的需要两个模块来执行这样的任务吗?
  • 这更多的是个人偏好,但是我总是发现os语法有点笨拙。你可以读,你可以写,但是因为某些原因,我总觉得可以做一些改进,让它变得更轻。

什么是 Pathlib?

Pathlib 是标准 Python 库的一部分,从 Python 3.4(参见 PEP 428 )开始引入,目标是将路径表示为具有许多有用方法和属性的超级 Python 对象,而不是简单的字符串。

正如官方文件所述:

这个库的目的是提供一个简单的类层次结构来处理文件系统路径和用户在它们上面做的普通操作

Pathlib 旨在减轻前面提到的使用os模块时遇到的挫折。让我们来看看它的一些特性。

这篇文章不是对 Pathlib 的深入概述。要了解这个库的更多信息,我推荐你查看官方的 文档 或者我在最后列出的参考资料。

👉Pathlib 有更直观的语法

要用 pathlib 构造一个路径,基本上需要导入 Path 类并向它传递一个字符串。这个字符串指向文件系统上一个不一定存在的路径。

**from pathlib import Path****path = Path("/Users/ahmed.besbes/projects/posts")****path** **# PosixPath('/Users/ahmed.besbes/projects/posts')****print(cwd)****# /Users/ahmed.besbes/projects/posts**

现在您已经可以访问一个Path对象了。你会如何进行简单的操作?

  • 加入路径

Pathlib使用 / 操作符来连接路径。这可能看起来很有趣,但它确实使代码更容易阅读。

我们来做个对比。

要使用 with os模块连接路径,您应该这样做:

使用 Pathlib,相同的代码转换成:

实际上,Pathlib 已经增强了/操作符来执行路径连接。

  • 获取当前工作目录/主目录

已经实现了这样做的方法。

**from path import Pathlib****cwd = Path.cwd()
home = Path.home()**
  • 看文件

您可以像处理典型路径一样将open与上下文管理器一起使用,或者使用read_textread_bytes

**>>> path = pathlib.Path.home() / file.txt'
>>> path.read_text()**

显然有更多的功能要涵盖。让我们在接下来的章节中讨论最有趣的部分。

👉它很容易创建文件和目录

一旦创建了 Path 对象,它就可以通过调用它的内部方法自己执行文件系统操作。例如,它可以创建一个文件夹或弹出一个文件,只需调用mkdirtouch方法。

以下是路径对象创建文件夹的方式:

创建文件夹

文件也是如此:

创建文件

当然,您仍然可以使用os模块来执行这些操作,但是这需要调用另一个类似makedirs的函数。

👉它通过访问父文件系统来导航文件系统层次结构

每个 Path 对象都有一个名为parent的属性,它返回父文件夹的 Path 对象。这使得操作大型文件夹层次结构变得更加容易。事实上,由于路径是对象,所以我们可以将方法链接起来以到达所需的父对象。

如果您想避免链接parent属性来访问第 n 个先前的父文件夹,您可以调用parent**s**属性来返回当前文件夹之前的所有父文件夹的列表。

👉它允许您迭代目录并执行模式匹配

让我们假设您有一个指向目录的 Path 对象。

Pathlib 允许您轻松地遍历该目录的内容,并获取与特定模式匹配的文件和文件夹。

还记得您用来和os模块一起导入的glob模块吗,以便获得匹配模式的路径?

嗯,Path 对象有一个**glob**方法和一个递归版本(称为rglob)来执行类似的任务,但是语法要简单得多。

假设我想计算给定文件夹中 Python 文件的数量,你可以这样做:

👉每个路径对象都有多个有用的属性

每个 Path 对象都有多个有用的方法和属性,这些方法和属性执行以前由其他库而不是os处理的操作(想想globshutil)

  • .exists():检查路径是否真的存在于文件系统中
  • .is_dir():检查路径是否对应一个目录
  • .is_file():检查路径是否对应文件
  • .is_absolute():检查路径是否绝对
  • .chmod():更改文件模式和权限
  • is_mount():检查路径是否为挂载点
  • .suffix:获取文件扩展名

还有更多方法。你可以在这里查看所有列表

资源

如果你想了解更多关于 Pathlib 和本机os.path模块的区别,你可以看看这个精选资源列表:它是 100%免费的,而且质量很好。我保证。

感谢阅读🙏

这是一篇关于 Pathlib 特性的快速文章。

如果你想迁移到这个库,并且假设你使用的是 Python +3.4,那就去做吧:从 os 迁移到 Pathlib 相当容易。

今天就这些了。直到下一次更多的编程技巧和教程。👋

Unsplash 上的 Karsten Winegeart 拍摄

新到中?你可以订阅每月 5 美元,并解锁无限的文章——点击这里。

为什么你应该停止使用 Excel 或纸浆进行数学优化

原文:https://towardsdatascience.com/why-you-should-stop-using-excel-or-pulp-for-mathematical-optimisation-d36492096e56?source=collection_archive---------16-----------------------

给古罗比一个机会

照片由 hay sUnsplash 上拍摄

说到数学优化,尤其是(整数)线性规划,市面上有几种方案可以解决。

首先有微软,在 Excel 中实现了一个求解器作为插件。但是,它有 200 个决策变量的限制。对于相对较小的问题来说,这很好,但是如果您的问题需要更多的变量,我建议您开始寻找替代方案。

随着 Python 的大受欢迎,大多数数学家都选择了知名的库 纸浆 以及默认的开源求解器CBC。对于大多数问题来说,这很好。它可以完成工作,网上有很多教程可以教你基本的语法。然而,你可以做得更好!

对于我需要解决的大多数复杂的 ILP,我更喜欢使用guro bi因为三个原因:它运行迅速,它可以在有时间限制的情况下工作,并且对数量的决策变量没有限制。哦,我有没有提到它对学术用户 是免费的?下面,我将详细阐述这些论点,最后你可以找到一些有用的链接,帮助你开始使用 Gurobi。****

事先写一个小纸条

在我们深入细节之前,我想声明我与古罗比没有任何关系。这个故事仅仅反映了我使用它的经验。应该注意的是,也有其他的商业替代品,如 IBM 的https://www.ibm.com/analytics/cplex-optimizer。此外,也可以使用一个有限的,免费版本的 Gurobi 作为纸浆解算器。然而,由于这些限制,它只对小问题有用。不管怎样,让我们开始吧!

古罗比更快

首先,为什么速度很重要?你可以让你的代码通宵运行,对吗?但是,在某些情况下,这并不合适,例如在实时决策或假设分析中。在这两种情况下,都不希望不必要地等待解决方案。因此,速度有时很重要。根据 Gurobi 在 2010 年进行的一项 bechmark 测试,CBC(PuLP 的默认求解器)只能按时解决 61%的问题,而 Gurobi 在给定时间内解决了所有问题。显然,这项研究的可靠性值得怀疑,但它还是给人留下了印象。****

可以给古罗比一个时间限制

有时候,在合理的时间内解决一个线性问题是不可能的。如果你用的是纸浆,那么你只是运气不好。它不可能给你一个中间结果。还好有古罗比!只需一行代码,您就可以确保不必等待很长时间,仍然可以获得结果。在下面的例子中,我将运行时间限制为一分钟。

**m = gurobipy.model()
m.setParam('TimeLimit', 60)**

Gurobi 对决策变量的数量没有限制

Excel 只有 200 个决策变量的限制,而 Gurobi 没有。在受限许可下,这已经是十倍了:允许 2000 个变量和 2000 个线性约束。对于行货版本,有 没有限制 。但是,沉住气!由于决策变量的数量不一定能量化问题的难度,因此模型仍然有可能需要一个时间限制,以便在合理的时间内给你一个解决方案。

但是,古罗比有什么局限性呢?

对古罗比来说,生活也不是一帆风顺的。首先是 对于商业用户来说比较贵的 。虽然他们的价格与竞争对手相当,但我认为他们的许可证对小企业来说是非常昂贵的。其次,如前所述,古罗比不是巫师:他能解决的问题复杂性是有限的。快速并不总是足以解决难题。第三,Gurobi 的安装,尤其是许可,在你的电脑上可能会耗时。为此,我在本文末尾添加了一个 YouTube 教程的链接。

Excel纸浆没有古罗比有的第一和第三个缺点。两者都是更便宜的数学优化工具。在决定使用哪个选项时,您可以考虑这一点。****

本·怀特在 Unsplash 上拍摄的照片

总之

好吧,我承认我可能对古罗比有点过于热情了。然而,由于它的速度、返回中间结果的能力以及包含大量变量的能力,我认为它值得称赞。然而,你应该考虑商业用途的成本,以及耗时的安装过程。总而言之,如果你必须解决复杂的数学优化问题,我会建议给古罗比一个机会。我想你不会后悔的!

有用的链接

你喜欢这个故事吗?欢迎在 Medium 上关注我,并留下掌声或评论!下面,你可以找到一些有用的链接来开始使用线性编程和 Gurobi。

**** https://www.gurobi.com/resource/modeling-examples-using-the-gurobi-python-api-in-jupyter-notebook/ https://medium.com/opex-analytics/optimization-modeling-in-python-pulp-gurobi-and-cplex-83a62129807a

如何在计算机上安装 Gurobi(py)的教程。****

为什么应该存储数据管道的自定义日志,以及如何使用它们构建数据目录

原文:https://towardsdatascience.com/why-you-should-store-custom-logs-of-your-data-pipelines-and-how-to-build-a-data-catalog-with-them-ee96a99a1c96?source=collection_archive---------14-----------------------

如何使用 Azure Data Factory、Databricks 和 SQL Server 实现这一点的分步指南。

Unsplash 的 Sunder Muthukumaran

“An ounce of prevention is worth a pound of cure.”   
  ― **Benjamin Franklin**

简介

在 Azure Data Factory 的 Monitor 选项卡中,可以看到许多关于所有执行状态的信息。这是一种简单且图形化的方法来检查某个东西是否失败以及失败的原因。

显然,当管道没有问题,但数据有问题时,问题就来了( EX : Delta 数据比平时少,巨大的结构变化……)。这种类型的信息不能仅通过监控您的管道来获得。这就是为什么有必要构建一个特定的监控系统来存储每个执行的特定信息。

为什么您的数据管道需要定制日志?

  • 故障排除。您可以跟踪表的问题是何时开始的,并复制环境来研究问题。
  • 统计。能够用简单的 SQL 查询解决关于元存储的问题:每天处理多少行?你的桌子有多大?你每小时执行多少工作?
  • 监控。您可以很容易地看到所有执行的状态,或者您可以实现 Cron jobs 来持续监控几个指标,以便发出警报。
  • 数据质量检测使用简单的指标(表时间戳、行数、结构变化……)。

记录表的结构示例:

CREATE TABLE logs.EXAMPLE_LOG_TABLE (ID bigint IDENTITY(1,1) NOT NULL,ID_TRACK_PROCESSING bigint NOT NULL,TABLE_NAME nvarchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,SCHEMA_NAME nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,PRIMARY_KEYS nvarchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,STATUS nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,TIME_TAKEN bigint NOT NULL,RUN_DT datetime NOT NULL,CREATED_BY_ID nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,CREATED_TS datetime NOT NULL,DATABRICKS_JOB_URL nvarchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,DATAFACTORY_PIPELINE_URL nvarchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,LAST_DSTS nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,LIVE_ROWS nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,REPLICATION_ROWS nvarchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,DELTA_VERSION nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,COLUMNS nvarchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,**CONSTRAINT** PK__EX_LOG__YYY432 PRIMARY KEY (ID))
  • ID :日志的 ID。这将是一个自动生成的值(参见约束)。
  • ID_TRACK_PROCESSING :触发作业执行的摄取表的 ID(在 TRACK_PROCESSING 表中)。
  • 模式名&表名:被插入/处理的表的模式和表名。
  • PRIMARY_KEYS :如果表格有主键,并且这些主键正被用于执行合并。
  • 状态:流程状态(成功或失败)。
  • RUN_DT :作业开始时的时间戳。
  • 耗时:工作完成所需的时间。
  • CREATED_BY_ID :标识创建日志的工具(在我们的例子中是 Azure 数据工厂)。
  • CREATED_TS :日志创建时的时间戳。
  • DATABRICKS_JOB_URL : URL,在其中可以找到执行的每一步的代码和阶段。
  • DATAFACTORY_JOB_URL :标识作业已完成的 ADF 管道的 URL。
  • LAST_DSTS :表格的最新时间戳。
  • LIVE_ROWS :作业执行后表格的行数。
  • REPLICATION_ROWS :最近一次执行中插入/处理的行数(如果满载,将等于 LIVE_ROWS)。
  • DELTA_VERSION : 数据块摄取作业后表格的 DELTA 版本
  • :摄取作业后表格的结构(列名和类型)。

您可以使用任何您认为对您的用例有用的字段。我选择的字段是我的上下文中需要的字段。

如何生成日志

每个数据作业都应该生成关于它刚刚完成的过程的元数据。按照我的另一篇文章中描述的例子:

https://medium.com/@ivangomezarnedo/how-to-orchestrate-databricks-jobs-from-azure-data-factory-using-databricks-rest-api-4d5e8c577581

(图片作者)红色表示写日志的活动。

一旦作业被标识为完成(成功或失败),将执行一个活动,该活动将从执行中收集数据并将其写入相应的日志表(日志生成):

(图片由作者提供)确保在重试策略中使用较高的数字,以确保活动将被执行

使用的查询:

INSERT INTO logs.EXAMPLE_LOG_TABLE
(ID_TRACK_PROCESSING, TABLE_NAME, SCHEMA_NAME, PRIMARY_KEYS, STATUS, TIME_TAKEN, RUN_DT, CREATED_BY_ID, CREATED_TS, DATABRICKS_JOB_URL, DATAFACTORY_PIPELINE_URL, LAST_DSTS, LIVE_ROWS, REPLICATION_ROWS, DELTA_VERSION, COLUMNS)
 VALUES(
**-- Data from the table that triggers the execution.**
  @{item().ID},
 '@{item().TABLE_NAME}',
 '@{item().SCHEMA_NAME}',
 '@{item().PRIMARY_KEY}',
 'SUCCESS',
**-- Statistics and metadata of the execution.**
@{activity('Check job status').output.metadata.execution_duration}/1000,
 DATEADD(SECOND , -@{activity('Check job status').output.metadata.execution_duration}/1000,CURRENT_TIMESTAMP),
 'AZURE DATA FACTORY',
 CURRENT_TIMESTAMP, 
'@{activity('Check job status').output.metadata.run_page_url}',
 '[https://adf.azure.com/monitoring/pipelineruns/@{pipeline().RunId}...',](https://adf.azure.com/monitoring/pipelineruns/@{pipeline().RunId}?factory=%2Fsubscriptions%2Ff772839c-a925-4576-80fc-b8cb60966326%2FresourceGroups%2FRG_EDL_COREDLZ_01_PROD%2Fproviders%2FMicrosoft.DataFactory%2Ffactories%2Fedlproddlzadf01',)
**-- Output from the execution.**
'@{split(activity('Check job status').output.notebook_output.result,'|')[0]}', --Table timestamp
'@{split(activity('Check job status').output.notebook_output.result,'|')[1]}', --Table nº of rows
'@{split(activity('Check job status').output.notebook_output.result,'|')[2]}', --Rows ingested/updated in the job
'@{split(activity('Check job status').output.notebook_output.result,'|')[3]}', --Databricks Delta version.
'@{split(activity('Check job status').output.notebook_output.result,'|')[4]}' --Schema of the table.
); SELECT 1+1

日志由以下内容生成:

  • 触发执行的表中的数据。
  • 统计和元数据的执行。
  • 从执行中输出。

为了从执行中提取输出,由于数据块被用作核心处理工具,数据作业中执行的最新命令将是:

dbutils.notebook.exit(string)

并非所有的进程都必须向同一个日志表中写入新条目,不同的进程可能有不同的需求,并且可能需要在其日志表中存储不同的信息。如果您想将所有日志写到同一个表中,那么一个好的选择是添加一个新字段来标识生成它们的进程。

使用日志创建数据目录

“Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.”
― **Edsger Wybe Dijkstra**

这里建立的数据目录是一个简单的解决方案,并不意味着要取代一个更完整的解决方案( EX : Linkedin 数据中心 ),但在大多数情况下,这已经足够了。

一旦我们在日志表中有了足够多的条目,我们就可以创建一个视图来使用这些信息,并生成一个包含元存储完整快照的“数据目录”。

好处:

  • 不要重新发明轮子:已经用于其他目的(故障排除、统计……)的东西将被重新用于创建数据目录。
  • 当一个视图被使用时,“数据目录”将总是尽可能地更新,并且不需要其他管道/过程。
CREATE VIEW logs.all_tables_data_catalog AS
SELECT id,
       schema_name,
       table_name,
       status ,
       time_taken ,
       created_ts ,
       databricks_job_url ,
       datafactory_pipeline_url,
       'SAP_INGESTION' AS type,
       last_dsts ,
       columns,
       *Cast*(live_rows AS *DECIMAL*) AS "LIVE_ROWS",
       delta_version
FROM   (
                SELECT   *,
                         Row_number() OVER (partition BY table_name, schema_name ORDER BY created_ts DESC ) AS row_no
                FROM     [logs].[SAP_INGESTION_LOG_TABLE]
                WHERE    status ='SUCCESS') logs_SAP
WHERE  row_no=1
UNION
SELECT id,
       schema_name,
       table_name ,
       status ,
       time_taken_copy+time_taken_merge AS "TIME_TAKEN" ,
       created_ts ,
       databricks_job_url ,
       datafactory_pipeline_url,
       'MYSQL_INGESTION' AS type,
       last_dsts,
       columns,
       *Cast*(live_rows AS *DECIMAL*) AS "LIVE_ROWS",
       delta_version
FROM   (
                SELECT   *,
                         **Row_number**() OVER (partition BY table_name, schema_name ORDER BY created_ts DESC ) AS row_no
                FROM     [logs].[MYSQL_INGESTION_LOG_TABLE]
                WHERE    status ='SUCCESS') logs_MYSQL
WHERE  row_no=1
UNION
SELECT id,
       schema_name,
       table_name ,
       status ,
       time_taken ,
       created_ts ,
       databricks_job_url ,
       datafactory_pipeline_url,
       'ORACLE_INGESTION' AS type,
       last_dsts,
       columns,
       *Cast*(live_rows AS *DECIMAL*) AS "LIVE_ROWS",
       delta_version
FROM   (
                SELECT   *,
                         **Row_number**() OVER (partition BY table_name, schema_name ORDER BY created_ts DESC ) AS row_no
                FROM     [logs].[ORACLE_INGESTION_LOG_TABLE]
                WHERE    status ='SUCCESS') logs_HANA
WHERE  row_no=1
where  status ='SUCCESS') x WHERE row_no=1

从每个日志表中只选择公共字段(只能对相同数量的列执行 union),只搜索成功的摄取,并使用 r ow_number 窗口函数提取每个表的最新日志(由其模式和名称标识)。

这为用户提供了一种方法来检查元存储中的每个表,其中包括:

  • 表的结构(列名和类型)。
  • 上次更新的时间。
  • 表行的最新时间戳(可能表加载成功,但数据已经过期)。
  • 行数。

它还可以用来轻松检测整个元存储中的数据质量问题。

这个视图可以在不同的仪表板中使用,这些仪表板可以向用户显示相同的信息,但是以一种更“美化的方式。这个简单的“数据目录”可以解决大部分考虑购买第三方数据目录解决方案的团队的需求。

如果您的日志表在不同的数据库实例中会怎样?

如果您想要在“数据目录”中显示的数据在不同的系统中(例如 : SQL Server、Azure SQL 和 HANA),您可以使用 SQL Server 链接服务器查询其他系统,就好像它们的表属于第一个系统一样。

好处:

  • 避免不必要的数据移动,因为数据是直接从源系统查询的。
  • 数据总是尽可能地更新(因为没有使用源表的快照,而是查询活动表)。
  • 在网络受限或需要查询大量外部资源的情况下,可以实现类似于物化视图的东西,但是显示的数据可能不是最新的。

SQL Server 与 HANA 的连接:

https://komport.medium.com/if-you-need-access-you-data-stored-in-sap-hana-database-from-mssql-database-server-you-can-add-877e8793acf7

首先从 SAP 官方网站下载必要的 ODBC 驱动,然后按照上一篇文章的步骤操作。在安装了 HANA 实例的机器上完成安装后,ODBC 将如下所示:

作者图片

链接服务器是使用 SQL Server 中的以下命令创建的:

EXEC sp_addlinkedserver@server='HANA_PRO', -- this is just a descriptive name@srvproduct='HANA1.0',  -- this is just a descriptive name@provider='MSDASQL',   -->This is a fixed value as this is the standard name for this type of provider connection@datasrc='HANAPRO';  -->Here needs the Data Source Name to be entered that was created beforeEXEC sp_addlinkedsrvlogin@useself = 'FALSE',@rmtsrvname = 'HANA_PRO',  -- You need to use the name that you have used in the sp_addlinkedserver as @server name@locallogin = NULL,@rmtuser = 'YOUR HANA USER',@rmtpassword = 'YOUR HANA PASSWORD';

在完成所有上述步骤后,通过在 SQL Server 中运行以下查询来执行系统之间的连接检查:

SELECT * FROM(SELECT *  FROM OPENQUERY([HANA_PRO],'SELECT * FROM LOGS.HANA_LOG_TABLE;')) a;

SQL Server 与 Azure SQL 的连接:

这是一个更简单的过程,因为不需要 ODBC:

https://www.sqlshack.com/create-linked-server-azure-sql-database/

最后,由于使用链接的服务器就像在 SQL Server 中添加其他 DB 系统作为新的 DB,视图的代码将与前面的非常相似(视图只从同一个 DB 实例中读取数据):

CREATE VIEW logs.all_tables_data_catalog
AS
  SELECT id,
         schema_name,
         table_name,
         status,
         time_taken,
         created_ts,
         databricks_job_url,
         datafactory_pipeline_url,
         'SAP_INGESTION'            AS TYPE,
         last_dsts,
         columns,
         *Cast*(live_rows AS *DECIMAL*) AS "LIVE_ROWS",
         delta_version
  FROM   (SELECT *,
                 Row_number()
                   OVER (
                     partition BY table_name, schema_name
                     ORDER BY created_ts DESC ) AS row_no
          FROM   **[logs].[sap_ingestion_log_table] -- Query to an internal table**
          WHERE  status = 'SUCCESS') sql_server_row_no
  WHERE  row_no = 1 
  UNION
  SELECT id,
         schema_name,
         table_name,
         status,
         time_taken_copy + time_taken_merge AS "TIME_TAKEN",
         created_ts,
         databricks_job_url,
         datafactory_pipeline_url,
         'MYSQL_INGESTION'                  AS TYPE,
         last_dsts,
         columns,
         *Cast*(live_rows AS *DECIMAL*)         AS "LIVE_ROWS",
         delta_version
  FROM   (SELECT *,
                 Row_number()
                   OVER (
                     partition BY table_name, schema_name
                     ORDER BY created_ts DESC ) AS row_no
          FROM   [**AZURE SQL (PROD)].[BD].[logs].[azure_sql_ingestion_log] -- Query to an external table in AZURE SQL.**
          WHERE  status = 'SUCCESS') azure_sql_row_no
  WHERE  row_no = 1
  UNION
  SELECT id,
         schema_name,
         table_name,
         status,
         time_taken,
         created_ts,
         databricks_job_url,
         datafactory_pipeline_url,
         type,
         last_dsts,
         columns,
         *Cast*(live_rows AS *DECIMAL*) AS "LIVE_ROWS",
         delta_version
  FROM   (SELECT *,
                 Row_number()
                   OVER (
                     partition BY table_name, schema_name
                     ORDER BY created_ts DESC ) AS row_no
          FROM   (SELECT *
                  FROM   ***Openquery*([hana_pro], 'SELECT ID,SCHEMA_NAME, TABLE_NAME,STATUS , TIME_TAKEN , CREATED_TS , DATABRICKS_JOB_URL ,DATAFACTORY_PIPELINE_URL, ''HANA_INGESTION'' as TYPE, LAST_DSTS ,COLUMNS, CAST(LIVE_ROWS as decimal) as "LIVE_ROWS", DELTA_VERSION, STATUS  FROM LOGS.HANA_INGESTION_LOG 
WHERE  STATUS= 'SUCCESS' ;') ) hana1) hana_row_no -- Query to an external table in HANA.**
  WHERE  row_no = 1*-- Note that the Row_function could be implemented directly in the source system being queried, but has been left as is for code clarity*.

结论

在本文中,我们看到:

  • 为什么自定义日志是对数据管道的一个很好的补充。
  • 如何在完成数据管道执行之前生成自定义日志。
  • 创建数据目录的好处。
  • 如何使用自定义日志创建数据目录。
  • 如何在没有 ETL 的情况下组合来自不同源系统的日志?

尽管给出了关于如何使用某些工具开始创建定制日志的具体示例,但是该概念可以应用于其他编排器和其他处理工具。

仅此而已。我希望这对您有用,并且您不必像我一样花费时间。

感谢阅读。你可以在Linkedin上找到我。

“The success formula: solve your own problems and freely share the solutions.”
― [**Naval Ravikant**](https://twitter.com/naval/status/1444741381579177984)

为什么你应该转向贝叶斯 A/B 测试

原文:https://towardsdatascience.com/why-you-should-switch-to-bayesian-a-b-testing-364557e0af1a?source=collection_archive---------8-----------------------

实践教程

当统计和商业使用同一种语言

什么是 A/B 测试?

几乎每个人都讨厌学习统计学(嗯,也许除了的一些统计学家)。由于我们需要记住所有这些分布和临界值,我们最终感到头疼。你可以发誓再也不碰这个话题;直到你不得不分析 A/B 测试。

A/B 测试是随机控制试验的“有趣”名称,我们将用户随机分配到两个(或更多)组,并测量每个组的指标( KPI )。例如,我们可以随机呈现给用户一个绿色的“立即购买!”按钮还是红色的,衡量一下其中一个的点击率(或者购买率)是否更高。

作者图片

最终,当我们分析两组之间的差异时,我们需要统计数据。当我们看到一个按钮表现更好的时候,我们无法知道这是“真实”的,还是只是偶然;因为即使颜色根本不影响点击率,我们也不期望各组的点击率完全相同。统计数据有助于我们区分这两种选择。

我们问 A/B 测试的问题是“哪个版本更好?”。如果你正在使用一个 Frequentist 框架,当查看 P 值时,你将得到的答案是“嗯,如果按钮之间没有差异,那么看到像你这样的上升(或更极端)的概率是 x% ”。

第一次听到 P 值的定义时的典型反应。图片取自 en.meming.world

不一定要复杂

统计学没必要那么复杂。事实证明,一个可供选择的框架可以给我们以下答案:“绿色按钮更好的概率是 y% 。这就是你选择它的风险”。这个框架被称为贝叶斯框架,它在在线行业中越来越受欢迎。

贝叶斯统计最重要的优点是可以理解

贝叶斯 A/B 测试结果的可视化。左图:利率的不确定性很容易想象(“曲线较高的地方更有可能出现实际利率”)。右图:B 获胜的概率很容易理解(“绿色区域比红色区域大得多,但后者不可忽略”)。作者图片。**

虽然这个框架有很多优点(也有一些缺点),但我认为贝叶斯 A/B 测试最重要的优点是它是可理解的。它准确地回答了我们在不确定的情况下需要知道的问题:我们出错的可能性有多大,以及在这种情况下的风险有多大。

有什么区别?

简而言之,在频率主义者的框架中,我们假设有两个可供选择的世界:一个是红色和绿色按钮之间没有区别(零假设),另一个是有区别的。我们假设我们生活在第一个世界中(我们 假设 零假设是真的),并且我们想要用一定程度的确定性来反驳这一点(显著性水平)。如果我们无法证明呢?这并不一定意味着我们在第一世界(一个无关紧要的结果并不能证明无效假设)。

贝叶斯框架的观点完全不同。我们先说“红色和绿色按钮的点击率可以是 0%到 100%之间的任何比率,机会均等”(这就是我们所说的先验)。这意味着每个按钮最初有 50%的机会比另一个更好。随着我们开始收集数据,我们更新了我们的知识,我们可以说这样的话“根据我观察到的数据,我现在认为有 70%的可能性绿色按钮更好”。我们称这个为后

A 和 b 之间上升的后验分布(比率之间的百分比差异)。样本大小从左到右增加。即使提升保持不变,样本量的增加也会使我们的结果更有信心。使用贝叶斯 A/B 测试,很容易传达这种信心。图片作者。

我喜欢贝叶斯框架是因为它包含了不确定性。在我看来,通常对频繁主义者推论的解释几乎是“确定性的”。在统计框架上这么说很搞笑,但是想想我们解读假设检验的方式——如果 P 值低于. 05,结果就是显著的(“真实”);如果更高,那么结果“不是真实的”。但是现实生活不确定的;我们不能只设定一个 0.05 的阈值,然后说“P 值告诉我们的”。贝叶斯框架包含了不确定性——并告诉你“有 95%的可能性绿色按钮更好——但有 5%的可能性不是。选择权在你”。

贝叶斯度量

有趣的是,至少在 A/B 测试环境中,这两种方法之间的大多数度量在数字上并没有太大的不同;然而,他们的解释完全不同。在频率主义方法中,我们有一个置信区间;匹配的贝叶斯度量是可信度区间。我个人认为“概率 B 更好”是 P 值的匹配度量:两者的计算非常相似,但它们的意义完全不同!

然而,贝叶斯 A/B 测试确实有一个在 frequentist 框架中没有可比性的度量:T4 风险。我们计算 A 和 B 的风险,它的解释是:“如果我选择 B,而 B 实际上比 A 差,我会损失多少?”。该指标也用作 A/B 测试中的决策规则。

与 P 值相比,这种风险有两大优势。首先,它的门槛是商业行话(“如果我错了,我愿意付出的代价是什么?”),而频率主义者的显著性水平是统计学上的胡言乱语(“我愿意接受的 I 型错误率是多少?”).第二,与 P 值相比,它对顺序检查(“峰化”)更加稳健,因此在使用贝叶斯框架 时 不必预先确定样本大小。这也是贝叶斯 A/B 测试的一大优势。

摘要

A/B 测试不一定要混淆。使用贝叶斯框架,我们可以准确地回答我们在需要做出决定时问自己的问题:“哪个版本更好,我错的可能性有多大,如果是这样,我将付出什么代价”。这个回答更具商业导向性,我们公司的任何同事都很容易理解,不管他们是什么角色或专业知识。

人是贝叶斯。我们问自己"小鸡会过马路吗?",而不是"我是在鸡不过马路的虚无现实中,还是在鸡至少有 95%把握过马路的替代现实中?”。为什么要区别对待在线 A/B 测试?

参考

我真的试着在这篇文章中保持简单,不要太深入数学。如果你想(稍微)深入挖掘,我真的推荐这些帖子:

戏弄者

请继续关注我的下一篇文章,在那里我将描述我们如何在 Wix 实现贝叶斯 A/B 测试,在这里大规模的性能是至关重要的。

为什么应该使用 Piskle 导出您的 Scikit-Learn 模型

原文:https://towardsdatascience.com/why-you-should-switch-to-piskle-for-exporting-your-scikit-learn-models-87028ad83ed?source=collection_archive---------60-----------------------

文件大小最多减少 2/3

作者: 阿迈勒哈斯尼&Dhia Hmila

Jonathan Pielmayer 在 Unsplash 上的照片

在训练阶段之后导出拟合的模型是每个数据科学项目的最后一个关键步骤。然而,同样重要的是,我们用来存储模型的方法并不是专门为数据科学设计的。

事实上,python 的 pickle或者我们经常在 Scikit-learn中使用的成熟的 joblib包,是通用的标准序列化方法,适用于任何 python 对象。因此,它们没有像我们希望的那样优化。

在这篇文章之后,您将看到我们在内存和时间效率方面可以做得更好。

目录

什么是积少成多
什么是积少成多特殊
如何使用积少成多
支持的估算器(到目前为止)
效率明智的话,你应该对数字有什么期望

piskle 是什么

Piskle是我们创建的 python 包,允许您以优化的方式序列化 Scikit-learn 的最终模型。如果你不熟悉这个术语,下面是维基百科对它的定义:

序列化是将数据结构或对象状态转换成可以存储或传输并在以后重新构建的格式的过程

如果您有大量的估算器要存储(可能是同一模型的更新版本),或者如果您想将它存储在云上用于 web 应用程序或 API,这就特别有用。

如果你想知道命名的选择,pisklepicklescikit-learn的组合😉

是什么让 piskle 与众不同

Piskle 提供了足够高效地存储 Scikit-learn 模型(以及一般的 python 对象)的可能性,以便有选择地保留需要保留的部分。换句话说,像预测方法 一样,piskle 只存储某个动作使用的属性 。一旦模型被重新加载,这些是执行所需操作所必需的唯一属性。

如何使用 piskle

要使用 piskle,首先需要使用以下命令进行 pip 安装:

pip install piskle

接下来您需要的是一个要导出的模型。你可以以此为例:

导出模型就像下面这样简单:

import pisklepiskle.dump(model, 'model.pskl')

加载它甚至更容易:

model = piskle.load('model.pskl')

如果想要更快的序列化,可以禁用 optimize特性。请注意,此功能进一步减小了导出文件的大小,并缩短了加载时间。

piskle.dump(model, 'model.pskl', optimize=False)

支持的估计量(到目前为止)

到目前为止,piskle 支持 23 scikit-learn 估计器和变压器。包含的模型已经使用最新版本的 Scikit-learn(目前为 0.24.0)进行了测试。你可以点击查看完整列表

就效率而言,你对数字有什么期望

为了展示 piskle 的潜力,我们可以进行一个简单的实验。我们将使用三种不同的方法导出同一个模型,并比较结果文件的大小。

在我们开始导出 scikit-learn 的模型之前,让我们首先获得一个足够大的数据集,我们可以用它来突出 piskle 的使用可以带来的不同。为了方便起见,我们将使用一个名为 datasets的 python 包,它允许您轻松下载 500 多个数据集。我们选择的数据集名为 Amazon Us Reviews ,它具有我们可以与 TF-IDF 一起使用的文本属性,如下所示:

为了将 piskle 与 joblib 和 pickle 进行比较,我们使用这三个包导出我们的模型,并使用以下代码行观察结果文件:

以下是由此产生的三种文件大小的概述:

作者图片

+----------+----------+----------+
|  Pickle  |  Joblib  |  Piskle  |
+----------+----------+----------+
| 1186 KB  | 1186 KB  | 388 KB   |
+----------+----------+----------+

我们可以观察到,与 pickle 和 joblib 相比,使用 piskle 时文件大小显著减小:文件大小增加了近 67%

💡请注意,我们可以对这三个包使用压缩算法来进一步优化。

最后的想法

Piskle 的诞生源于对一种有效方式的实际需求,这种方式可以为一个 Web 应用的创建导出一个 scikit-learn 模型。迄今为止,它已在测试的模型上证明了显著的效率,因此证明了它的高附加值。不要犹豫尝试一下,特别是如果您打算将模型存储在云上和/或您缺少空间的话。

由于 piskle 仍然是一项正在进行的工作,计划进行许多潜在的改进,我们将很高兴收到您的反馈和/或建议:

链接到 GitHub 知识库

感谢您坚持到现在,也感谢您的关注。注意安全,我们将在下一篇文章中再见😊!

为什么您应该认为数据科学企业更像一个企业,而不是科学

原文:https://towardsdatascience.com/why-you-should-think-of-the-enterprise-of-data-science-more-like-a-business-less-like-science-45227c65c09?source=collection_archive---------22-----------------------

作者聚焦

对 Eric J. Daza 来说,“你如何推销你的作品对你走向成功至关重要。

在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很激动地分享 埃里克·j·达扎、博士、议员 本·胡伯尔曼 的对话。

照片由埃里克·j·达扎提供

Eric J. Daza 博士是一家数字健康公司evidion Health的数据科学统计学家。他在工业界和学术界工作了 18 年以上,工作领域包括制药临床试验和抽样调查、营养、母婴健康、全球和国际健康、健康促进和疾病预防、数字健康和行为医学。**

达扎博士还创建并编辑了Stats-of-1一个数字健康统计博客。他研究如何从个人自己的可穿戴设备、传感器和应用程序数据中发现因果关系。

你在网上称自己为“医疗保健数据科学家”和“数据科学统计学家”——你能为我们充实这些角色吗?

我“天生”是一名专业的生物统计学家。我在一家小型肿瘤制药公司担任了五年的硕士级生物统计学家,随后在一家合同/临床研究机构工作了两年,当时我刚开始攻读博士学位。然后我做了一年的抽样调查项目,完成了研究生学业,在一项全球公共卫生研究中做了五年的生物统计学家。

在研究生院结束时,我对量身定制或个性化的健康干预产生了兴趣。这很快引导我进行 n-of-1 试验和单案例实验设计,我发现这很有意思——也比更复杂的适应性设计更容易让我理解。

你是如何在数据科学领域的这个角落着陆的?

我的动力?我非常亲近的一个人患有肠易激综合征,这是一种特殊的慢性疾病:虽然它有共同的症状和触发因素,但它们之间的关系是高度个体化的。例如,引发一个人腹泻的食物实际上可能有助于改善另一个人的症状。其他类似的情况包括偏头痛和慢性疼痛。

N-of-1 试验是一个有希望的解决方案,但它们涉及通过单个个体随机或交替交叉治疗的实验。对于一个已经患有终身疾病的人来说,这些可能过于乏味和焦虑,他们不想经常想起这些。

我认为可穿戴传感器和数字健康应用程序可能会提供一种更好的方式,更被动地筛选可能的触发因素(在开始 n-of-1 自我实验之前)。这让我接触到了数字健康——不得不学习如何清理和处理如此密集的时态数据,以及特征发现和创建的技术。所以我探索了这些,并在一个为期三年的博士后研究中学会了一点机器学习。

后来,我加入了一家健康科技创业公司。我们希望让保险公司和医疗机构更好地了解医生和医疗机构在患者健康和护理结果方面的表现。虽然该公司的使命与我自己的数字健康兴趣没有太多重叠,但我重视学习一个全新的分析领域——医疗索赔数据——以及如何管理所有这些数据。我以前从未处理过成千上万(有时数百万)行的数据!

在那里,我学会了如何使用 AWS 集群和 Spark,并提高了我的 SQL 技能(远远超过我在 pharma SAS 工作时的 PROC SQL)。我也开始认识到对我来说数据科学和应用统计学之间的关键相似和不同之处。我不再是一名生物统计学家,而是一名医疗保健数据科学家。

这条轨迹如何塑造了你目前的兴趣?

我现在很高兴地在 Evidation Health 工作,研究我真正关心的事情:如何使用被动收集的可穿戴传感器数据和非实验性的基于应用程序的调查,在检查一个人的健康历史时,开始小心翼翼地从相关性转向因果关系。我称自己为数据科学统计学家,因为虽然我是一名数字健康数据科学家,但我仍然保持着统计学家的身份。

我通过提供关于如何在各种客户驱动的和内部的项目中实践良好的统计卫生的指导来帮助我的团队取得成功。这包括明确识别预先计划的分析结果与探索性数据分析期间出现的结果(以避免过度概括/过度拟合),以及避免将“统计显著”发现描述为“显著”发现,因为这两者是不相关的。我还尽力分享对各种经典统计模型和用例、概率分布和因果推理的见解——我另一个喜欢的话题!

这些天你还发现自己被什么其他类型的项目吸引住了?

在研究生院的时候,我对寻找一个教师职位产生了强烈的兴趣,这是可以理解的。所需的申请材料可能会令人生畏:你需要在简历中列出你的成就,简历基本上是一份详细的简历,包括你所有的出版物和演示文稿。但你还必须写一份研究报告(你详细的 5 年研究计划),一份关于你的教学理念和背景的教学报告,也许还有一份关于你如何为促进学术界的多样性和包容性做出贡献的多样性报告。

到 2020 年初,经过两年多的寻找,很明显,我获得教师职位的可能性几乎肯定会趋近于零。但大约在那时,我被邀请通过为期一周的 Instagram 接管 T2 Pinoy Scientists T3 分享我作为一名科学家的工作,Pinoy Scientists 是一个小型但不断增长的菲律宾科学家和研究人员的全球网络。

工作量很大,但我玩得很开心!后来我意识到,我差不多写了一个简短的博客系列。我还希望在那年 4 月第一次参加大型年度行为健康和医学会议,我希望有一些容易识别的“品牌”,人们可以记住。所以那时我决定把我的研究报告变成一个研究博客。

stat-12020 年 2 月 4 日推出。今年,我雇佣了另外两名编辑:一名临床心理学家和一名数字健康计算机科学家。总之,我们涵盖了完全互补的主题领域,都集中在以个人为中心的方法。我们在 Stats-of-1 的愿景是汇集像我们一样分散在各个领域的专业人士和专家,他们都有兴趣开发数字化、以个人为中心的研究设计和分析方法,以改善每个人的健康。

作为一个在学术界和工业界都工作过的人,一路上你必须克服的最大挑战是什么?

我申请了教师职位,但是失败了。后来我意识到我可能把我的研究定位得太窄了。说我喜欢研究“使用可穿戴数据的多对一或单个人方法”,对于教师搜索委员会来说,可能听起来太小众和冒险了。如果像国立卫生研究院(NIH)和国家科学基金会(NSF)这样的学术资助组织认为你的领域没有那么有趣或风险太大,你就不会得到金钱(或教师角色)来追求它。

相反,我可能更成功地将我的工作推销为“精确数字健康”。这是我在工业界学到的一课:你如何销售你的作品关系到你的成功。

你对学术界和工业界之间的这些转变有什么样的体验?

在我最近的两次创业中,我不得不学习如何更快地采取行动,并在传统的统计角色之外进行沟通。我记得很早的时候,一位值得信任的经理告诉我,我需要在需要的时候和其他团队成员一起提供帮助。我还没有意识到,我的学术训练让我过度思考需要快速做出的决定,而且从那以后,我越来越适应更快的行动。你也可以在我的博客文章中看到这一点:我早期的超级详细的文章已经让位于更轻松和简洁的文章——希望读起来更有趣!

我还必须学会在帮助客户设计项目或研究时快速做出科学决策。许多客户带着模棱两可的研究请求而来——与学术研究截然相反。我不得不知道,一些客户希望我作为学者所说的“合作调查员”与他们一起工作。

学术统计学家和临床试验生物统计学家很少(如果有的话)作为合作研究者;我们没有受过这样的训练。我的学术培训告诉我,作为合作研究者做出决定是越权的,甚至可能是不尊重的(即,通过发送我不信任该科学家的信息,即使这显然不是我的专业领域)。这不是专业统计人员的典型职责。

因此,对我来说,了解到对于许多客户的请求,主要基于粗略的文献回顾和模糊的统计逻辑来推荐一些科学的(而不是统计学的)东西是可以的(这确实是我所期望的),是一件很困难的事情。也就是说,确保你的逻辑清晰是很重要的——对你和客户都是如此。这是“数据科学家”不同于“统计学家”的另一个方面:虽然“成为数据科学家”需要了解核心统计原则并拥有基本的统计技能,但在数据科学中,“成为统计学家”可能是一种负担!

这个例子让我想到了一个我真正想问的问题:关于多面手和专家的价值,尤其是在职业生涯早期的数据科学家中,有一个持续的争论。你会给刚刚起步的人什么建议?

在最近的一次数据科学职业讨论会上,我意识到将数据科学企业更像商业而不是科学可能会有所帮助。除非你受雇于一个专门满足技术需求的角色,否则你必须是一个多面手。

比如“机器学习工程师”和“生物统计学家”就是具体的技术角色。担任这些角色的人负责真正挖掘细节,并与少数利益相关者沟通。他们不需要处理多个通常模糊的客户请求,这需要处理许多人际关系(组织或公司的内部和外部),以及管理多个交付时间表。

一个好的数据科学家将能够专注于并帮助澄清客户真正的潜在目标,而不管他们使用什么技术语言(这通常在技术上是不准确的)。你的工作是帮助将客户的需求“翻译”成技术和非技术利益相关者都能理解的东西。

数据科学也类似于科学,因为您应该拥有一套特定的技术技能,可以为您的团队做出贡献。数据科学研究问题相当模糊,需要探索性的数据分析。要做到这一点,需要汇集科学多元化团队的深度培训和专业知识。

你的公开写作——例如,在 TDS 上——似乎遵循类似的模式,因为它不局限于一个狭窄的领域。

优秀的数据科学团队来自不同的科学背景。这意味着能够交流自己领域的基本原则和基本概念是非常重要的!与学术界不同,你不断地与“你的领域之外”的人交谈。

这也是对抗冒名顶替综合症的好方法。善于解释基本原理意味着你可以看到你的队友有多感激从你这里学到这些概念——以及你帮助他们的耐心。这对团队建设也很有好处,因为通常情况下,你会成为学习他人基础的队友!

我就是这样开始为广大读者写作的。

你如何着手选择你所涉及的特定主题?

我喜欢写的基本面是我从研究生院就开始思考的。因此,我对它们有很强烈的感觉。这些包括将短语“统计显著性”改为更科学诚实的东西(即,不能与“显著性”混为一谈),我在中称之为“统计卫生学”,报告哪些分析是在查看你的研究数据之前或之后计划的(以及补充信息,在看到你的初始结果之后提出新的分析是完全可以的——至少是科学的一半),以及对因果 推理的需要(以及它如何与实现机器学习中的道德人工智能和公平相关)。

展望未来,你对未来几年数据科学领域有什么希望?

目前,我希望“数据科学”被正式认可或定义为“由科学专家和专家团队组成的商业或商业节奏的企业”核心能力应包括管理/咨询实践、统计学和计算机科学方面的坚实基础。这将帮助学校和培训项目创建课程,让数据科学家更好地为他们将要从事的真正迷人、鼓舞人心和快节奏的工作做好准备。

想了解更多关于 Eric 的工作和项目的信息吗?在LinkedInTwitter 上关注他。

为什么您应该使用谷歌驱动和 Colab 来尝试 Rclone

原文:https://towardsdatascience.com/why-you-should-try-rclone-with-google-drive-and-colab-753f3ec04ba1?source=collection_archive---------22-----------------------

如果你在 Google Colab 上从未丢失过你训练过的 ML 模型,那不是很好吗?克隆来救援了。

图片作者。

你有没有在 Google Colab 上开始训练一个机器学习模型,而运行时在你保存结果之前断开连接?这种事过去常常发生在我身上,我会感到沮丧。我会离开我的模型训练,几个小时后回来,发现它没有保存就完成了!

图片作者。

那么你对此能做些什么呢?将 Rclone、Google Drive 和 Google Colab 与以下三个主要步骤结合使用:

1)安装 Rclone。

2)配置 Rclone。

3)用 Rclone 导出。

第一步。安装 Rclone。

在你的 Google Colab Jupyter 笔记本的第一个单元格中这样做。

! curl https://rclone.org/install.sh | sudo bash

第二步。配置 Rclone。

配置新安装的 Rclone。

!rclone config

步骤 2.1。制作新遥控器

步骤 2.2。将其命名为“远程”

第 2.3 步。为 Google Drive 输入“15”

第 2.4 步。在客户端 id 上按 Enter 键作为默认值

第 2.5 步。对于 client_secret 的默认值,请按 Enter 键

第 2.6 步。输入“1”可完全访问 Google Drive 上的所有文件。

第 2.7 步。按 Enter 键作为 root_folder_id 的默认值。

第 2.8 步。在 service_account_file 上按 Enter 键获得默认值。

第 2.9 步。输入“n”作为高级配置的默认值。

第 2.10 步。输入“n”表示远程配置上的非默认设置。

转到它为您生成的链接。

从您的 Google Drive 中复制代码,登录以访问 Rclone。

粘贴到它告诉你输入验证码的地方

步骤 2.11。输入“n”作为共享驱动器上的默认值。

步骤 2.12。输入“y”作为远程设置的默认值。

步骤 2.13。输入“q”退出配置。

第三步。使用 Rclone 导出。

在模型完成训练后添加导出。

通过我们刚刚建立的 Rclone 远程路径,将 Google Colab 中当前的“/content/”目录复制到 Google Drive 中您想要的任何位置。

!rclone copy "/content/"  remote:"/YOUR_PATH_TO_GDRIVE_DESIRED_LOCATION/"

摘要

因此,在完成上述 3 个主要步骤后,你应该能够用 Google Colab 备份你正在训练的任何模型(假设它们已经完成)。

这里有一个例子 Jupyter Notebook 从头到尾实现了这些步骤。

举个例子,你可以看到我的 Google Drive 在内容下存储了训练好的模型:

图片作者。

你可以在我为各种 TensorFlow 机器学习问题笔记本做的这个 Github 资源库里找到更多例子。

我希望这篇文章对你有帮助!谢谢你的阅读,如果喜欢就点击。请关注我,更多基于机器学习的内容即将推出!

你也可以在 LinkedIn 上关注我:https://www.linkedin.com/in/stevensmiley1989/

参考

  1. Rclone。https://rclone.org/
  2. 谷歌驱动。https://g.co/kgs/qu7aAY
  3. 谷歌 Colab。https://colab.research.google.com/
  4. 张量流。马丁·阿巴迪、阿希什·阿加瓦尔、保罗·巴勒姆、尤金·布莱夫多、陈质枫、克雷格·西特罗、格雷格·科拉多、安迪·戴维斯、杰弗里·迪恩、马蒂厄·德文、桑杰·格玛瓦特、伊恩·古德菲勒、安德鲁·哈普、杰弗里·欧文、迈克尔·伊萨德、拉斐尔·约泽福维茨、杨青·贾、卢卡斯·凯泽、曼朱纳斯·库德鲁尔、乔希·莱文伯格、丹·曼内、迈克·舒斯特、拉杰特·蒙加、雪莉·穆尔、德里克·默里、克里斯·奥拉、黄邦贤·施伦斯、伯努瓦·施泰纳 TensorFlow:异构系统上的大规模机器学习,2015。tensorflow.org公司提供的软件。

为什么您应该尝试使用气流以外的方式来进行数据管道编排

原文:https://towardsdatascience.com/why-you-should-try-something-else-than-airflow-for-data-pipeline-orchestration-7a0a2c91c341?source=collection_archive---------4-----------------------

下面我们来评价一下气流旁边的 AWS step 函数Google workflows提督

范【数码影像】作者 rajat sarki,

虽然就使用和社区规模而言,Airflow 作为一种数据编排管道占据了市场主导地位,但它已经相当陈旧,最初的设计并不能满足我们今天的一些需求。Airflow 仍然是一个很棒的产品,但本文的目标是提高对替代产品的认识,以及对于您的数据用例,什么是完美的编排工具。下面我们来评价一下气流旁边的 AWS 步骤功能Google workflows提督

那么,如今好的数据编制工具的标准是什么呢?

API-第一设计⚙

由于云提供商是 API 优先的,所以您希望您的编排工具是相同的。理想情况下,您希望能够通过 API 完成几件事情:

  • 创建/删除工作流
  • 非静态/不断发展的工作流的简单 DAG 序列化和反序列化。
  • 运行参数化工作流
  • 处理访问管理
  • 通过 IaC 框架(Terraform/Pulumi)部署编排工具(如果不是无服务器的话)

所有这些特性将使您能够连接到所有现有的云服务,同时最大限度地利用事件驱动管道。

Airflow DAGs 的创建是非常静态的,与其他工具相比,API 仍然非常有限。虽然您可以有一个策略来自动化 Dag 的部署,但是您仍然需要在最后生成一个静态文件。

提督似乎没有完全适应动态 dag 创建,并有一点相同的模式,为 DAG 创建气流,见问题这里

无服务器&运行时☁️的关注点分离

无服务器总是有一个悖论。一方面,我们不想管理服务,而更愿意关注我们的用例。另一方面,当出现问题或我们需要定制功能时,这是一个黑盒地狱。

然而,在过去管理一个 Airflow 集群是一件痛苦的事情,Kubernetes 借助 Airflow v2 解决了许多问题。但是,我们不应该低估 Kubernetes 集群的维护成本。除此之外,您还需要添加一些东西来确保它能够顺利工作,例如,认证、秘密管理和 K8s 集群的监控。使用您所在的云提供商提供的无服务器编排工具,这是非常平滑和内置的。使用 Kubernetes 集群,您可以独自维护或启用这些功能。

无服务器 orchestrator 工具的另一个特点是,您必须清楚地分离关注点,并且只将它用于编排任务,而不是实际运行它们。有气流的一个危险路径就是把它当运行时。同样,Kubernetes 在解决这个问题上帮了很大的忙(参见本文这里),但这仍然是在您的集群上,维护依赖于您已经部署的监控这个集群的工具。

整合能力⛓

你想触发什么?有没有什么“连接器”可以让你在没有任何自定义层的情况下触发目标运行时?

气流有很多运营商。如果你没有找到你所需要的,你可以随时建立你自己的。提督也有一个很好的集成列表

步骤功能有几个与 AWS 服务的集成,甚至提供同步作业或等待回调。

谷歌工作流也开始添加与 GCP 服务的连接器。

用户界面功能🔮

当运行复杂的工作流时,有一个清晰的地方来观察哪里出错并快速采取行动是非常重要的。

您还想轻松地回滚或重试特定的任务/子任务,尤其是在数据管道环境中。请注意,最佳实践应该使您的数据幂等。

然而,如今,管道仪表板甚至还不够。问题是您可能有一个无声的失败,并且您可能需要在一个中心工具中输入其他警报/信息。例如,您有一个总是丢弃任何不符合模式的数据的管道。在这种情况下,您需要另一个监控工具,比如用于数据可观察性的数据质量工具。

测试🏗

作为开发人员,您希望有一种简单的方法来测试您的管道,并且开发周期尽可能短。乍一想,我们可能会认为可以在任何地方运行的数据编制器(如 airflow/Prefect)会提供最佳和流畅的测试体验,对吗?不尽然,因为在本地运行它们可能会折磨你的笔记本电脑的 CPU,增加你的风扇产生疯狂的气流😏).

使用 managed Airflow(AWS/astronomy ),您可以出于开发原因动态创建 air flow 实例(并通过代码使其自动化),但启动时间是不可忽略的。是的,对于一个开发者来说,哪怕一两分钟都是一生。

因此,最终,如果您利用 IaC 框架,拥有像 AWS Step 函数/工作流这样的完整无服务器编排器将使您能够快速测试您的管道。此外,您是在目标环境中直接测试它,几乎没有副作用。

请注意,AWS 提供了一个用于测试目的的阶跃函数仿真器,这里是

总之,还是放点星星吧!🌟

这个表只是一个高层次的评价。当然,您应该考虑其他因素,如您团队的当前知识、您现有的基础架构,并制定您自己的基准!虽然我真的很喜欢并且一直是(并且仍然是)Airflow 的长期用户,但我必须说,我对大多数新用例的首选是 AWS 步骤功能/ GCP 工作流,具体取决于用例。

Dagster 是另一个值得考虑的好工具,但是我没有这方面的经验,而且因为他们不提供云托管版本(虽然根据他们的网站,这正在进行中),我没有花时间去投资它。

迈赫迪·瓦扎又名迈赫迪欧·🧢

感谢阅读!🤗 🙌如果你喜欢这个,跟随我上🎥 Youtube ,✍️ 中型 ,或者🔗 LinkedIn 了解更多数据/代码内容!

支持我写作 ✍️通过加入媒介通过这个链接

为什么应该在 Python 中使用异步?

原文:https://towardsdatascience.com/why-you-should-use-async-in-python-6ab53740077e?source=collection_archive---------5-----------------------

并提高您的 I/O 代码性能。

Unsplash 上的 Clément Hélardot 拍摄

从 Python 3.5 开始,可以在你的脚本中使用异步。这种发展允许使用新的关键字asyncawait以及新的模块 asyncio。

Async 和 Await 最初是在 C#中引入的,目的是以类似于编写阻塞代码的方式构造非阻塞代码。这些关键字随后被导出到几种编程语言中,因为它方便了异步代码的管理。

事实上,还有其他方式来编写异步代码,如果你知道 Javascript/Nodejs,那么你可能已经使用过回调了:

fs = require('fs');
fs.writeFile('hello.txt', 'call back exemple in nodejs', (err) => {
  if (err) return console.log(err);
  console.log('file writen');
});

一旦事件发生,在第二个位置传递的回调函数将被调用

此外,还有承诺,允许更好地管理具有表达性词语的异步调用:

import axios from 'axios'let data;
axios.get("https://jsonplaceholder.typicode.com/posts")
  .then(resp => {
                data = resp.data *//do data processing as data is actually available* })
  .catch(err => { console.log(err) })console.log(data) *// undefined even if the instruction is after the API call*

这些技术的一个问题是,我们脱离了影响可读性的代码水平阅读流程。无论如何,让我们回到它如何影响你作为一个 Python 用户。

Python 中标准 IO 代码的问题。

IO 代码是调用外部服务的指令。例如,这可以是 HTTP 请求或对数据库的调用。标准 python 代码的问题在于,如果你的代码只调用这些服务,那么在继续下一条指令之前,必须等待这些服务的响应。

import requestsdata = (requests
       .get("https://jsonplaceholder.typicode.com/posts")
       .json()
) *# blocking code block, python waiting doing nothing*for d in data: # executed once the API has return
   print(d)

在上面的例子中,这不是很烦人,因为只有一个对外部服务的调用,但是让我们看看下面的代码。

def fetch_comments():
  data = []
  for i in range(1, 500):
    url = f"https://jsonplaceholder.typicode.com/comments/{i}"
    resp = requests.get(url).json()
    data.append(resp)fetch_comments()

这段代码花了 126.95 秒在我的机器上完成。因此,我们可以看到它不是最佳的。我们需要引入并行性,即同时执行几个请求。

传统方式:线程

在 Python 中出现 asyncio 之前,要处理这类问题,你必须使用线程。线程是进程的一个组成部分,可以被并发管理。然而,Python 有一个全局解释器锁,它将线程的使用限制在不使用解释代码的指令上。这不是这里的情况,因为我们使用外部服务。事不宜迟,下面是调用 API 的代码的线程版本。

API 调用的线程版本来源:作者

可以看出,线程版本的代码比同步版本需要更多的工作。事实上,我们必须管理一个队列,允许线程选择不同的 URL 进行处理。

另一方面,在我的机器上,执行这段包含 5 个线程的代码只花了 7.05 秒,与同步版本相比减少了 94% 。但是如果我告诉你我们可以做得更好。

现代方式:异步代码

让我们看看如何用异步代码进行 API 调用。

API 调用的异步版本来源:作者

这里也一样,要获得与同步版本相同的结果需要付出更多的努力,而且至少要付出与线程版本一样多的努力,那么这样做值得吗?在我的机器上,这段代码花了 0.4880 秒完成,你告诉我。

那么,为什么与线程相比,异步版本的性能如此之好呢?因为生成和管理线程不是免费的,而异步版本不需要管理这些机制。

结论

本文旨在向您展示异步代码如何提高某些任务的性能。网上有很多教程可以学习如何在 python 中使用这种新范式。

尽管 Python 支持异步已经有几年了,但你必须记住,并不是所有的旧库都支持异步,因为这意味着必须重写代码。例如,您一定已经注意到,我不能在异步示例中使用请求,而是使用 aiohttp,它是等效的异步版本

如果您确信并希望切换到异步模式, aio-libs repository 提供了一套基于 asyncio 的库,他们可能有一个符合您的需求。

为什么应该使用贝叶斯神经网络

原文:https://towardsdatascience.com/why-you-should-use-bayesian-neural-network-aaf76732c150?source=collection_archive---------1-----------------------

贝叶斯神经网络解释了模型中的不确定性,并提供了权重和输出的分布。

照片由 cyda

目标

本文旨在帮助那些对贝叶斯神经网络没有经验的人,并用于以下目的:

  1. 举例说明标准神经网络和贝叶斯神经网络之间的关键差异
  2. 解释不同类型的不确定性
  3. 讨论贝叶斯神经网络的优势局限

什么是贝叶斯神经网络?

贝叶斯神经网络(BNN)结合了神经网络和贝叶斯推理。简单地说,在 BNN,我们将权重和产出视为变量,我们正在寻找最适合数据的边际分布。BNN 的最终目标是量化模型在输出和权重方面引入的不确定性,以解释预测的可信度。

标准神经网络和贝叶斯神经网络的区别

对我来说,我认为贝叶斯神经网络是标准神经网络的扩展。下面,我总结了这两种神经网络之间的三个关键点。

照片由 cyda

  1. 目标— SNN 专注于优化,而 BNN 专注于边缘化。优化会找到一个最佳点来代表一个权重,而边缘化会将每个权重视为一个变量,并找到其分布。
  2. 估计—SNN 的参数估计是最大似然估计(MLE) ,而 BNN 的估计是最大后验概率(MAP)预测分布
  3. 方法— 基本上,SNN 会用微分来寻找最优值,比如梯度下降。在 BNN,由于复杂的积分很难确定,科学家或研究人员总是依赖于马尔可夫链蒙特卡罗(MCMC)变分推断归一化流这类技术。

cyda 拍摄的照片

运气不确定性和认知不确定性

所以现在你能够区分 SNN 和 BNN,并知道它们之间的区别。如前所述,BNN 用于衡量模型的不确定性。事实上,有两种不确定性。

偶然的不确定性

随机不确定性也称为统计不确定性。在统计学中,它代表每次运行相同实验(训练模型)时不同的未知量。在深度学习中,是指模型输出的不确定性。如下图所示,假设黑线是预测,橙色区域是偶然的不确定性。你可以把它当作预测的置信水平。换句话说,它告诉你你的预测结果有多有把握。如果间隔很小,实际值更有可能接近您的预测值。反之,如果区间较大,实际值可能与你的预测值有较大出入。

cyda 拍摄

认知的不确定性

认知不确定性也称为系统不确定性。在深度学习中,认知不确定性是指模型权重的不确定性。如下图所示,每次我们训练模型时,权重可能会略有不同。这种变化实际上是认知的不确定性。

照片由 cyda

贝叶斯神经网络的优势

通过使用贝叶斯神经网络,您可以受益于

1。训练健壮模型

BNN 不是只考虑一组重量,而是寻找重量的分布。通过迎合概率分布,它可以通过解决正则化属性来避免过拟合问题。

2。获得预测区间

BNN 模型提供了预测的全貌,允许您在处理未知目标时自动计算与您的预测相关的不确定性。

贝叶斯神经网络的局限性

尽管 BNN 在解决不确定性问题上是有用的,但有几个限制值得注意。

1。要求数学&统计知识

理解 BNN 背后的所有理论和公式不是一件容易的事情。你需要在统计分布方面有很强的背景,以便应用适当的先验和后验函数。

2。更长的训练时间收敛

由于模型架构要复杂得多(你可以想象 SNN 只训练一个点,而 BNN 在训练分布参数),它需要长得多的时间来收敛训练。

结论

通过这篇文章,我希望你们对 BNN 有一个基本的了解,并对它如何工作以及为什么有用有了第一感觉。在下一篇文章中,我将解释 BNN 的细节和概念。敬请关注,希望你喜欢阅读这篇文章。=)

现在,你可以在这里查看下一篇</8-terms-you-should-know-about-bayesian-neural-network-467a16266ea0?sk=23d94ede07d5eab06e54bc00610e4bf3>

*</8-terms-you-should-know-about-bayesian-neural-network-467a16266ea0> *

为什么应该在 TensorFlow 2 中使用回调

原文:https://towardsdatascience.com/why-you-should-use-callbacks-in-tensorflow-2-a634e2c54465?source=collection_archive---------16-----------------------

定制你的深度神经网络训练-实用指南

约翰·施诺布里奇在 Unsplash 上的照片

当你想控制一个模型的训练时,回调是必不可少的。

而你难道想控制训练…

回调帮助我们防止过度拟合,可视化我们的训练进度,节省检查点等等。

张量流

但是为什么是 TensorFlow 呢?

TensorFlow 是世界上很多公司首选的深度学习 API。

由谷歌内部维护和大量使用,这是最先进的技术。

这一成功的原因之一无疑是其生态系统中可用的大量工具和库,使公司和个人能够轻松访问其产品和系统的研究和技术。

当然,它是一个 Python 库会有所帮助,因为 Python 是数据科学中最常用的编程语言。

今天我们来看看一个特别有用的工具。如果使用得当,它会让你的生活变得更加轻松。

建立模型

回调是您可以在模型训练中使用的函数。

例如,如果您希望基于高精度停止训练,或者当您的损失函数曲线开始变平时,可以使用它们。

在本文中,我不会过多关注实际的模型,而是看看我们如何通过回调来控制培训过程。

我假设读者知道如何在 TensorFlow 中构建一个简单的模型,因此我不会详细介绍代码。

让我们通过编写一个简单的 CNN 预测一些手写数字来热身。

让我们导入一些库并加载数据。我们将在这里使用 MNIST 数据集。

以上是非常标准的东西。我们加载(或多或少)原始数据,通过将所有像素值除以最大值 255 来对其进行整形和归一化。

请注意,当您将 NumPy 数组除以一个数字时,您会将所有条目除以该数字。

接下来,我们对目标进行一次热编码,这基本上意味着将数字 n 转换成一个向量,除了第 n 个条目外,其他地方都为零。

让我们来定义这个模型。

我不会详细介绍卷积神经网络,但这是一个非常标准的网络,它使用成对的 conv 池层,中间有一些脱落层以避免过度拟合。

在生成特征之后,它们被分别输入到具有 ReLu 和 Softmax 激活的密集神经网络中。

最后的 softmax 层输出对应于一位热码编码目标的 10 个值。

我们希望添加一个回调,而不仅仅是按原样训练模型。

复试

在 TensorFlow 中,回调有两种使用方式。我们可以使用现成的内置回调函数,也可以自己构建回调函数。

我将通过一些例子向您展示如何做到这两点。

学习率计划程序

假设我们想在训练中对学习速度有更多的控制。

我们知道,在追求使用梯度达到损失函数的最小值时,当我们足够接近时,我们可能会采取太宽的跳跃。

我们可以通过改变训练时的学习率来调整这些跳跃!

我们使用tensorflow.keras.callbacks中可用的 LearningRateScheduler 来实现。

看看下面的片段。

这样,我们在 3 个时期后调整学习率。

但是,我们仍然不知道什么时候能达到可接受的精度。如果我们想在达到 98%的准确率后停止训练呢?

自定义回拨

让我们为这个场景构建一个定制的回调类。

请注意,我已经将自定义回调添加到回调列表中,该列表现在包含两个回调。这完全没问题。

这段代码的输出如下。

非常好!

当使用自定义回调时,您可以指定在培训中您想要挖掘和更改的地方。

我们可以通过使用on_train_beginon_epoch_beginon_epoch_endon_train_end等函数来实现。

提前停止

大多数情况下,我们没有特定的度量目标,而是希望避免过度拟合。

一种方法是使用内置的提前停止回调。你可以创建如下:early_stopping = tf.keras.callbacks.EarlyStopping(patience=1)例如,这在一般情况下非常方便。

模型检查点

使用早期停止回调是好的,但是如果退出训练前的最后一个时期打乱了我们在最后通过过度适应努力获得的重量,那就糟了。

这就是模型检查点发挥作用的地方。基本上,这个回调让您为每个时期保存一个模型版本,这样您就可以选择具有最高验证准确性的版本。

语法和其他的类似:tf.keras.callbacks.ModelCheckpoint。您需要知道您想要将保存的模型放在哪里,您可以使用 filepath 参数来指定。

例如,您可以这样做:

checkpoint = tf.keras.callbacks.ModelCheckpoint(filepath='model.{epoch:02d}-{val_loss:.2f}.h5')

将它保存在当前文件夹中。更明智的选择可能是将其保存在一个名为checkpoints的文件夹中。

张量板

我要展示的最后一个回调是 TensorBoard

TensorBoard 用于可视化您的训练进度,这在实验情况下非常方便。

如果你开始训练,然后从终端cmdcd 你自己放入你的模型所在的文件夹,并输入:tensorboard --logdir='logs',那么终端会引导你进入 http://localhost:6006/

在那里你会看到如下的训练进度。

作者图片

结论

如果您在阅读过程中忘记了编码,我在这里为您收集了代码:

注意,我们并不真正使用训练的输出,而是将它存储在历史中。欢迎您编码并保存模型,绘制度量标准等等。

回调比我在这里介绍的多得多,但我们必须在某个时候停下来。但这并不意味着它们不重要。

他们是!请看这里的。

总结

回调是一个强大的工具,用于定制和控制深度学习工具箱中的训练过程。

从基于一些定制逻辑的调试和停止训练到可视化,回调应该是每个数据科学家在建模和实验时最好的朋友。

喜欢在 Medium 上阅读像这样的文章? 获得会员资格 获得完全权限。

如果您有任何问题、意见或顾虑,请通过 LinkedIn 联系我:

https://www.linkedin.com/in/kasper-müller-96ba95169/

为什么应该在 Python 中使用上下文管理器

原文:https://towardsdatascience.com/why-you-should-use-context-managers-in-python-4f10fe231206?source=collection_archive---------3-----------------------

图片由 Anas AlshantiUnsplash 上拍摄

什么是上下文管理器

如果您在 Python 中使用过with语句,那么您很可能已经使用过上下文管理器。

上下文管理器通常负责设置一些资源,例如打开一个连接,并在我们完成后自动处理清理工作。

可能,最常见的用例是打开一个文件。

**with open('/path/to/file.txt', 'r') as f**:
  for line in f:
    print(line)

上面的代码将打开文件,并保持打开状态,直到我们退出with语句。然后它会关闭它。整洁,对吗?

你为什么要在乎?

现在,你可以不用with打开一个文件,但是你必须自己清理。

f = open('/path/to/file.txt', 'r')
for line in f:
    print(line)
f.close()  # must remember to close f

除了这需要一行额外的代码之外,还有一些其他的缺点。也就是说,

  • 很容易忘记关闭文件,
  • f.close()如果在代码的前面某处有异常,就不会被调用。

为了准确地复制使用with语句打开文件,我们需要更多的代码来确保即使在出现异常的情况下也能关闭文件。

f = open('/path/to/file.txt', 'r')try:
  for line in f:
    print(line)
finally:
  f.close()  # runs no matter what happens

你应该关心正确地关闭文件,因为,在其他事情中,如果你打开太多文件,你会得到一个OSError

意识到什么是上下文管理器,可以帮助你决定如果你计划实现的东西被构造成上下文管理器的话,什么时候会更容易阅读和使用。让我们来学习如何实现它们!

如何实现上下文管理器

有两种方法可以实现上下文管理器。第一个是定义一个实现了__enter____exit__方法的类。第二种方法是创建一个生成器并使用contextlib.contextmanager装饰器。

定义类别

正如我们之前提到的,为了能够使用一个类作为上下文管理器,你需要实现__enter____exit__

上下文管理器的玩具示例。图片由作者提供。

您会注意到,__exit__方法以exc_typeexc_valexc_tb作为参数。这些用于传递关于发生在with语句中的潜在异常的信息。

好的,让我们看看当我们使用它时会发生什么。

使用上下文管理器。图片由作者提供。

首先,对象被实例化,然后调用__enter__方法。此时,我们在with语句内部。其中的任何代码都会被执行,在我们的例子中,它只是toy.run()。在运行完with中的所有代码后,调用__exit___方法。

让我们看看当出现异常时会发生什么。

发生异常时使用上下文管理器。图片由作者提供。

这次toy.run()没有运行,但是我们仍然进入__exit__,现在它的参数不是None,而是包含了关于异常的信息。在我们离开__exit__之后,异常被引发。

您可能想知道为什么将关于异常的信息传递给__exit__是有用的。是给你处理的选择权。

exit 中的处理值错误。图片由作者提供。

当出现异常时,如果__exit__方法返回True,那么这意味着它已经被处理了,所以不会被引发。如果它返回任何其他内容,那么它将由with引发。

处理 ValueError 但引发所有其他异常。图片由作者提供。

使用发电机+ contextlib.contextmanager

接下来,让我们看看如何使用生成器实现类似的东西。

作为生成器实现的上下文管理器。图片由作者提供。

在到达yield之前,toy_example内的代码将一直运行。在这一点上,我们将进入with声明。如果发生任何异常,它们可以像在try-except-finally程序块中一样被处理。

使用上下文管理器——没有例外。图片由作者提供。

您可以认为exceptfinally模块中发生的事情等同于__exit__中发生的事情。

出现异常时使用上下文管理器。图片由作者提供。

这种方法可能更容易理解,但了解这两种方法将有助于您选择最合适的方法。

结论

在这篇文章中,我们讨论了上下文管理器,为什么它们有用,以及如何实现它们。

https://eminik355.medium.com/subscribe

出自同一作者。

https://medium.com/analytics-vidhya/multi-armed-bandits-part-1-epsilon-greedy-algorithm-with-python-code-534b9e2abc9 [## 如何在 Python 中使用抽象类

towardsdatascience.com](/how-to-use-abstract-classes-in-python-d4d2ddc02e90)

参考

[1]https://book.pythontips.com/en/latest/context_managers.html

[2]https://stack overflow . com/questions/7395542/is-explicitly-closing-files-important

[3]https://docs . sqlalchemy . org/en/14/ORM/session _ transaction . html

https://realpython.com/python-with-statement/

[5]https://stack overflow . com/questions/17577137/do-files-get-closed-during-an-exception-exit

[6]https://docs.python.org/3/library/io.html#io.IOBase

为什么应该用 R 向量化你的代码

原文:https://towardsdatascience.com/why-you-should-vectorize-your-code-in-r-d7df86ebc9b7?source=collection_archive---------21-----------------------

使用 R 中的微基准测试包比较矢量化运算和 for 循环的效率

维普·贾Unsplash 上拍摄的照片

在本文中,我将通过比较使用向量化操作和使用 for 循环执行三个不同的任务所需的时间来说明使用向量化代码的好处。R 中的 microbenchmark 包提供了一个方便的工具来比较不同的 R 表达式执行需要多长时间。

本文中使用的代码可以在这个 GitHub repo 中找到。

乘法向量

我们先来看一个简单的两个向量相乘的例子。首先,我们编写了两个向量相乘的两个版本,并将它们包装在函数中,以便我们可以将它们传递给微基准函数。我们加载 microbenchmark 包,并将我们的两个版本传递给 microbenchmark 函数。通过设置 times = 100,我们将运行每个函数 100 次,结果将向我们显示汇总统计数据。

微基准测试返回测试的摘要,如果我们看一下平均值,我们可以看到使用 for 循环的乘法比矢量化乘法要多花 7 倍的时间。

作者图片

那么,为什么矢量化运算会快得多呢?在这个例子中,我们将一个由 1 到 100 的整数组成的向量与它自身相乘。当使用 for 循环时,我们一次乘一对整数,就像每次迭代中的一次乘法一样。在这种情况下,for 循环有 100 次迭代,所以 R 做 100 次乘法。当进行矢量化乘法时,整个向量被传递到操作中,这意味着向量被乘以一次。在 for 循环中,我们也将乘积赋值给新的向量 100 次,而在矢量化版本中,我们只将结果赋值一次。因此运行时间更短。

生成随机数

你可能会发现自己经常做的另一项任务是生成随机数。下面的代码将从 0 和 1 之间的均匀分布中生成 1,000,000 个随机数。

在这个例子中,第一个函数调用随机数生成器函数 runif() 一次,而第二个函数调用 runif() 一百万次。毫不奇怪,for 循环花费的时间要长得多,在这个测试中几乎是 221 倍。

作者图片

用蒙特卡罗模拟法估计圆周率

最后,我们将看一个例子,在这个例子中,我们都生成随机数,并对这些数进行一些计算。我们将比较两个使用随机抽样估算圆周率的函数,一个使用矢量化运算,一个使用 for 循环。

关于如何进行模拟的更多细节和指南可以在这篇关于蒙特卡罗模拟的文章中找到。

https://medium.com/@andreagustafsen/estimating-pi-using-monte-carlo-simulation-in-r-91d1f32406af

基本上,这些函数的作用是为正方形中的点生成随机(x,y)坐标。它计算到圆原点的距离,以确定该点是否落在圆内,并最终估计圆周率。

在矢量化版本中,我们调用 runif()函数两次,每个 x 和 y 向量一次,分别调用 which()和 length()一次,做两次计算。在 for 循环中,我们调用 runif()函数 200 万次,计算距离 1,000,000 次,最后计算一次 pi。

微基准测试表明,for 循环版本的运行时间是矢量化版本的 117 倍!

作者图片

希望这些例子能帮助你看到在 r 中使用向量化操作的好处,你不需要回到你的旧脚本,重新编写你的代码。在许多情况下,我们处理的数据量相对较小,操作可能只需要几秒钟,矢量化操作和 for 循环之间的差异可能并不明显。但是,您可能会发现自己在处理巨大的数据集,并编写耗时数小时的复杂操作,在这种情况下,您肯定希望让 R 尽可能高效地处理代码。理解矢量化操作中发生的事情可以帮助您编写更短、更简单、更快的代码。

如果你是 R 新手,想了解更多,可以在本文的中找到如何在免费互动课程中练习编写 R 代码。

https://medium.com/@andreagustafsen/the-free-interactive-r-courses-most-people-dont-know-about-c49aff7e5d4c

如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑报名成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金。

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

为什么你不应该雇佣更多的数据科学家

原文:https://towardsdatascience.com/why-you-shouldnt-hire-more-data-scientists-3188a1597fa3?source=collection_archive---------8-----------------------

通过考虑数据团队中分析师、数据工程师和软件工程师的角色来节省资金和减少挫折。

停止雇佣数据科学家——你可能不需要他们

不适合这份工作的人

在我的职业生涯中,我在我工作过和咨询过的许多公司中都看到过这种情况——我们没有为这项工作雇用合适的人!

我仍然听到许多关于数据科学团队表现不佳、管理层普遍对数据科学失去信心,或者数据科学家对自己的角色感到沮丧的可怕故事。当你深入观察时,你会发现一个共同的模式。

我们一直在雇佣数据科学家,却没有真正理解他们在哪里能带来最大的价值。

对于许多组织来说,真正需要的是分析师和数据工程师。有时候,工作的核心甚至不是数据或见解,你最好和软件工程师和开发人员在一起。

数据科学家有一个危险的属性组合,加剧了这个问题:

  • 广泛的技能组合意味着数据科学家通常拥有解决大多数问题的基本能力——尽管比一些专家更慢、更昂贵。
  • 一份奖励天生好奇者的职业意味着许多数据科学家将热衷于探索他们职责范围之外的挑战。
  • 对于一些人来说,获得数据科学职位的竞争意味着他们仍然渴望取悦和乐于接受不太适合他们的任务,以便成为一名好公民。
  • 数据科学家和管理人员在早期职业生涯中缺乏经验,再加上混乱的、定义不清的角色(似乎没有人同意数据科学家是/不是什么)导致资源错误分配到正确的任务。

这个名单还可以继续下去。当我遇到数据科学家在过去 18 个月里除了 BI 或基础数据库开发什么都不做时,我不会感到惊讶,这些任务更适合专家。

组织需要交付的东西和他们为完成工作而引入的技能之间存在巨大的不匹配。

你可能需要一个分析师

你是在做实验来引导业务和做出改变,还是在业务中支持日常决策?(图片由 Unsplash 上的卢克·切瑟拍摄)

很难知道什么是正确的技能组合——很少做对,每个组织、行业、职能、团队和个人性格的具体情况意味着永远不会有简单的公式来解决这个问题。不过,总的来说,你需要更多的分析师——雇佣数据科学家来构建关于业务指标的基本报告并不是对技能和资源的最佳利用。

如今统计学家是一种罕见的人才。有很多人在做伟大的工作,而这些正是组织渴望的技能。根据 Glassdoor 和 Stack Overflow 等网站,数据科学家的平均薪资比统计学家的平均薪资高出约 21%。许多数据科学家都是多面手,因此,对于一个在统计学方面有扎实基础的人来说,学习数据管理和处理的基础知识并获得大幅加薪是相当容易的。

然而,找到新工作只是问题的一半。新发现的统计学家转变为数据科学家发现自己处于一个完全不同的世界-这是为什么这些数据科学家拥有如此广泛的技能组合的原因。以前,你一天中的大部分时间都花在运行统计模型、解释数据、构建报告以从公司数据中获得洞察力上。现在,你的工资上涨了 20%,你几乎把所有的时间都花在了寻找数据、构建数据管道、编写简单的报告和幻灯片、编写 SQL 以获得开始分析所需的基本资料上。这不是你技能的核心所在。您现在做的是入门级数据分析师的工作,通过简单的分析和报告支持日常业务功能,因为没有合适的人来做这件事。

分析师的价值与统计学家或数据科学家的价值之间的主要区别。分析师对于确保正确的见解和信息在正确的时间到达正确的人手中是绝对必要的。日复一日。大多数组织发现自己身处 Excel 电子表格的地狱——分析师在那里引导人们回归理智。

然而,数据科学家和统计学家应该提供长期的转型服务。作为长期研究计划的一部分,开启全新的理解,精心设计实验以测试新的假设,开发预测能力和全新的模型。有能力做好这一点是数据科学职位报酬更高的原因,它应该需要大量的时间和实践来获得这些技能。这使得数据科学家即使对行业没有深刻的理解,也能对组织有用。

没有谁比谁更好,他们都有自己的位置和服务于不同的目的。

如此多的技能和微妙的工作角色汇聚到数据科学的浑水中,导致许多组织遭受损失。

这些技术工人现在可能赚了更多的钱,但他们做的工作远不如以前有成就感。此外,该组织为其真正需要的技能支付了高于市场价值的费用,甚至可能雇佣一些不太熟练的人来完成特定的任务。

你可能需要一名数据工程师

如果你在连接管道,你会需要一个管道工(照片由郭锦恩Unsplash 上拍摄)

当我开始研究数据科学时,很少听说数据工程师。如果你看看下面的谷歌趋势图,你会看到受欢迎程度(炒作)的差异,以及红色的“数据工程师”一词直到 2014 年才真正与蓝色的“数据科学家”相关联。当然,围绕数据工程有很多讨论,许多数据科学家(包括我自己)不得不自己动手。

Google Trends 对搜索词'Data Scientist' in blue vs. ' Data Engineer' in red ([source](https://trends.google.com/trends/explore?date=all&geo=US&q=data%20scientist,data%20engineer)).'的长期兴趣

不过现在已经不是 2014 年了。事实上,我很惊讶今天仍然有这么大的差距。

与数据科学家相比,绝大多数组织雇佣数据工程师会更好。

让数据科学家尽早参与进来确实有助于形成围绕数据和分析职能的一些需求,因为它们通常会触及业务的许多领域。数据科学家通常擅长于宽松的范围和软需求。但是,当知道了这些要求后,你会很快到达一个有大量数据管理和处理工作要做的地方。

即使是最简单的需求,建立数据平台的基础也需要几个月的时间。随着平台的增长,新的需求会出现,维护开销也会增加。我强烈建议尽早找一个好的数据工程师。尽管许多数据科学家都是优秀的数据工程师,但在架构和设计数据解决方案时,您通常会获得技能和最佳实践意识的混合。此外,当涉及到将解决方案与 CI/CD、构建测试以及我们逐渐依赖的所有良好的工程材料集成在一起时,数据工程师往往会更好,因为数据科学家应该真正专注于一次性工作和实验,以提供最大的价值。

强大的数据工程对支持整个企业的功能也有很大的价值。许多数据工程师都有 BI 背景,对业务用户和分析师的数据需求有详细的了解。

你可能需要一名软件工程师

把构建可扩展软件的任务留给专家吧(图片由 Unsplash 上的 Yancy Min 拍摄)

将高级分析和机器学习作为大规模应用的核心变得越来越普遍。这导致数据团队处于开发过程的核心,形成应用程序的路径,并与其他团队一起交付。

然而,这正是许多组织失败的地方。

仅仅因为一个应用程序中有一些机器学习并不意味着你需要一个只有数据科学家的团队。

数据科学家不(或者至少不应该)在那里开发健壮的、可伸缩的、交互式的、可运输的软件。你能从数据科学家那里获得的最大价值是给他们一个问题,一个清晰的、可衡量的交付物和一些数据,让他们迭代出某种答案。当然,他们将在翻译和向更广泛的团队移交任何粗略的概念验证解决方案方面发挥关键作用。将它们作为更大项目的依赖项,是另一种严重的资源分配不当。

你真正需要的是强大的软件工程师团队。是的,一个数据科学家可能会开发出某种交互式 GUI,但是如果由前端开发人员来处理会好得多。是的,数据科学家可以为你建立一个管道,将数据从源端到汇点,但后端开发人员、数据工程师和测试人员将会做出更加健壮和可伸缩的东西。

您不需要理解如何对作品建模,以使其成为一个可交付的、可伸缩的软件,与您的应用程序的其余部分很好地配合。

让您的数据科学家专注于问题导向、工作的科学方面,将工程留给工程师。

您将获得更多的参与度、满意度、更高性能的代码、更强的协作、更多的边缘案例、更少的不愉快和挫折。数据科学家在某些情况下可能是必不可少的,但在其他情况下可能是彻底的障碍。

最后的想法

随着如此多的人热衷于成为数据科学家,我们已经失去了其他数据相关角色的一些细微差别。此外,许多招聘经理不了解也没有经验知道一个好的数据科学家能做出什么贡献,或者什么时候需要一个好的数据科学家。这导致许多人处于错误的角色中,并感到沮丧。

下一次,当你渴望发布一份数据科学家的新招聘广告时,请认真思考一下——这个职位的核心是什么?他们会做研究和科学,塑造未来的旅行方向,还是会像往常一样做基础工程或支持业务?

为什么不应该攻读数据科学硕士学位

原文:https://towardsdatascience.com/why-you-shouldnt-take-a-data-science-masters-degree-c40c2f02f1e1?source=collection_archive---------0-----------------------

…您应该做些什么

纳丁·沙巴纳在 Unsplash 上拍摄的照片

随着数据科学家的工作在过去几年变得越来越受欢迎,加上被冠以“21 世纪最性感的工作”,专门研究数据科学的硕士学位课程如雨后春笋般涌现。这些课程的费用从 30,000 美元到 100,000 美元不等,还不包括你学习期间的生活费用。

我自己进入数据科学的道路并不包括任何正规教育。我利用网上广泛提供的免费或非常便宜的资源,通过自学自学掌握了所需的技能。总的来说,我估计我在付费材料上的花费不超过 300 美元。

在最近筛选简历和面试数据科学家职位的候选人后,我得出了一个坚定的结论,即数据科学硕士学位不是进入该领域的最佳途径。这只是学习你需要的技能的一种非常昂贵的方式,而且它甚至不会教会你所有你真正需要知道的东西。

在本文中,我将向您介绍为什么我认为获得数据科学硕士学位不是进入该领域的好途径,以及为什么在大多数情况下自学是更好的选择。我还会给你一个简短的概述,告诉你应该做些什么来获得一份数据科学家的工作。

它们很贵

正如我上面提到的,硕士学位非常昂贵。它们还要求你在一定的时间范围内学习,这可能会使它们更加昂贵,因为你不一定有机会在学习的同时工作和谋生。

如果你有能力资助一个学位并同时支付你的生活费用,这是可以的,但现实是许多人没有能力做到这一点。这意味着你要么不得不借大量的债务来资助课程,要么你根本无法承担。

好消息是,这些课程对于成为一名数据科学家来说是绝对不必要的,你可以学到你需要知道的一切,最重要的是找到一份工作,而不需要在这个过程中花费一大笔钱。

他们不会教你所有你需要知道的东西

作为一名数据科学家,不仅仅需要统计学、数学、编程和机器学习理论方面的知识。实际上,要在现实世界的数据科学团队中表现出色,除此之外还需要许多技能,而这些技能是大多数硕士学位课程中没有教授的。

这些课程不会教你如何使用 Github,也不会教你为什么在团队中与其他数据科学家以及数据和软件工程师合作如此重要。他们没有讲授敏捷,一个被许多数据科学团队使用的过程。他们不会教你重要的软技能,比如沟通、创造力和商业头脑,而这些技能对数据科学领域的职业生涯极其重要。

我采访过许多拥有数据科学硕士学位的候选人,他们几乎没有这些被大多数公司高度重视的技能。这些是技能,如果你通过自学学习数据科学,你几乎肯定会在学习过程中学会。

数据科学包括许多学科

要想成为一名成功的数据科学家,你需要几门学科的技能,包括数学、统计学和计算机科学。在我看来,数据科学硕士学位很难足够深入地教授所有这些领域的技能。1-2 年的课程不足以让你为获得一份数据科学家的工作做好准备。

数据科学需要很多年才能掌握,主要是因为它是许多不同领域的融合。通过自学和相关领域的工作(我稍后会谈到)来学习,会给你在所有这些不同领域真正需要的深度。

总的来说,我并不反对攻读硕士学位,事实上,我认为这是获得某个专业领域更深层次知识的好方法。就数据科学而言,我个人建议你只在其中一个领域取得硕士学位,比如计算机科学或统计学。这将会给你在这个领域有价值的知识深度。这也将为研究数据科学的其他领域提供一个很好的基础。

你应该怎么做?

如前所述,我个人的观点是,你可以在网上免费或以很低的成本学习数据科学所需的一切。这样做的额外好处是你可以根据自己的情况以任何速度学习。因此,如果你需要保持一份全职工作或有其他责任,那么你可以围绕这一点来调整你的学习,只要你需要学习技能就可以。

另外,也可以用最适合自己的方式学习。我个人通过实践学习学得最好,所以我从第一天开始就采取了基于项目的学习方法。这不一定是我通过硕士学位课程能够做到的。

除了自学,我强烈建议你尝试获得一些在现实世界中使用数据或软件的实践经验。这可以通过实习、志愿服务、黑客马拉松、为开源项目做贡献,或者在业务洞察或分析等密切相关的工作中获得职位来实现。这将让你接触到与数据和技术打交道的现实,并给你可论证的经验,最终帮助你获得一份数据科学家的工作。

这篇文章是基于我个人学习数据科学以及亲自面试数据科学职位候选人的经历。这些经历告诉我,当要在这个领域找到一份工作时,以项目组合或相关工作经验为形式的可展示技能比证书和资格证书更有分量。

这就是为什么我个人建议通过自我指导学习和实际的真实世界经历来学习数据科学。这种方法的特别之处在于,它意味着任何人都可以进入该领域,并且资金不会成为人们进入数据科学的障碍。

如果你想了解更多关于如何免费在线学习数据科学以及在哪里可以找到资源,我之前写了一个全面的指南,可以在下面找到。

感谢阅读!

我每月都会发一份简讯,如果你想加入,请点击此链接注册。期待成为您学习旅程的一部分

为什么你(可能)不应该使用强化学习

原文:https://towardsdatascience.com/why-you-shouldnt-use-reinforcement-learning-163bae193da8?source=collection_archive---------12-----------------------

行业笔记

围绕这项技术有很多炒作。有充分的理由…这很可能是实现通用人工智能的最重要的机器学习进步之一。但是在一般的兴趣之外,你可能最终会想到这样一个问题,“它适合你的应用吗”?

我目前在一个视觉机器人团队工作,作为 RL 的一名前研究员,我被要求为我的团队回答这个问题。下面,我概述了我认为你可能不想在应用程序中使用强化学习的一些原因,或者至少在走这条路之前要三思。让我们开始吧!

加利福尼亚州城堡石。作者图片

极其嘈杂

下面是一个最高分为 500 的游戏中的两个学习情节。那么哪种学习算法更好呢?恶作剧问题。它们完全一样,第二次运行只是第一次的重新运行。一次训练完全震撼了它并学到了一个完美的政策,而另一次,悲惨地失败了,唯一的区别就是随机种子。

DQN 在横撑上的训练曲线。作者图片

  • 随机初始化中的微小变化会极大地影响训练性能,因此实验结果的可重复性具有挑战性。
  • 噪音使得比较算法、超参数设置等变得非常困难,因为你不知道性能的提高是因为你所做的改变还是仅仅是一个随机的人为因素。
  • 您需要在完全相同的条件下进行 20 次以上的训练,以获得一致/稳健的结果。这使得迭代你的算法非常具有挑战性(参见下面关于这些实验需要多长时间的注释!)

大量超参数

目前市场上最成功的算法之一是软演员评论家(SAC),它有近 20 个超参数可以调整。自己查吧!但这还不是结束……

  • 在 deep RL 中,你拥有了所有与网络架构相关的正常深度学习参数:层数、每层节点数、激活函数、最大池、dropout、批量归一化、学习速率等。
  • 此外,您有 10+个特定于 RL 的超参数:缓冲区大小、熵系数、gamma、动作噪声等
  • 此外,你有奖励形成(RewardArt)形式的“超参数”来让代理按照你想要的那样行动。
  • 即使是其中的一个也很难调整!见笔记关于极度嘈杂,训练时间长…想象调 30+。
  • 与大多数超参数调优一样,并不总是有直观的设置或简单的方法来最有效地找到最佳超参数。你真的只是在瞎猜,直到事情似乎有了转机。

仍在研发中

由于 RL 实际上仍处于萌芽阶段,研究社区仍在解决如何验证和共享进步的问题。这让我们这些想要使用这些发现并重现结果的人感到头疼。

  • 论文在实施细节上含糊不清。你不可能总是找到代码,也不总是清楚如何将一些复杂的损失函数转化为代码。报纸似乎也忽略了他们用来获得卓越性能的手工小调整。
  • 一旦一些代码出现在互联网上,由于上面列出的原因,这些代码在实现上会略有不同。这使得你很难将自己的搜索结果与别人的进行比较。我相对糟糕的表现是因为我引入了一个 bug 还是因为他们使用了一个我不知道的技巧?

难以调试

  • 最近的方法使用技术的厨房水槽得到尖端的结果。这使得很难有干净的代码,从而很难跟踪别人的代码,甚至你自己的代码!
  • 另一方面,因为有如此多的活动部件,所以很容易引入 bug,并且很难找到它们。RL 经常有多个网络学习。而且在学习过程中有很多随机性,所以这一次可能行得通,下一次可能行不通。是因为你引入的一个 bug 还是因为随机种子中的一个侥幸?不进行更多的实验很难说。这需要…时间。

样品效率极低

无模型学习意味着我们不试图建立/学习环境的模型。所以我们了解政策的唯一方法是直接与环境互动。基于策略意味着我们只能利用从我们当前策略的行为中获取的样本来学习/改进我们的策略,即我们必须丢弃所有这些样本,并且在我们运行单个反向梯度更新时立即收集新的样本。例如,PPO 是一种无模型、符合政策的最新算法。所有这些都意味着,在学习一项政策之前,我们必须与环境进行大量的互动(比如数百万步)。

如果我们在相对低保真度的模拟器中具有高级特征,这可能是可行的。举个例子,

人形环境的图像由https://gym.openai.com/

  • 人形机器人需要 5 个小时来学习如何行走(2 英里的步伐)

但是,一旦我们转移到低层次的功能,如图像空间,我们的状态空间增长很多,这意味着我们的网络必须增长很多,例如,我们必须使用 CNN 的。

雅达利凤凰。图片由 mybrainongames.com 的提供

  • 凤凰等雅达利游戏需要 12(?)小时(40-200 密耳步)

当我们开始引入像 CARLA 这样的 3D 高保真模拟器时,事情变得更糟。

卡拉驾驶模拟器。图像由虚幻引擎

  • 用 GPU 训练一辆汽车在卡拉驾驶需要大约 3-5 天(200 万步)

如果政策非常复杂,情况会更糟。

  • 2018 年,OpenAI 培养了一个在 DOTA 2 上击败世界冠军的代理人。你问代理培训花了多长时间?十个月🙊

如果我们想在真实世界而不是模拟器中训练呢?这里,我们受到实时时间步长的限制(而以前我们可以比实时更快地模拟步长。).这可能需要几个星期,甚至更糟,完全难以处理。关于这方面的更多信息,请查阅“RL 的致命三重奏”。

Sim 2 真实差距

如果我们想在模拟器中训练,然后在现实世界中部署呢?大多数机器人应用都是如此。然而,即使代理在模拟器中学习玩得很好,也不一定意味着它会转移到现实世界的应用中。取决于模拟器有多好。理想情况下,我们会让模拟器尽可能接近真实生活。但是看最后一节就知道高保真模拟器的问题了。

不可预测性和不可解释性

  • 即使是训练有素的 RL 特工在野外也是不可预测的。我们可能试图严厉惩罚灾难性的行为,但我们仍然不能保证代理人不会仍然选择这种行为,因为最终,我们只是优化了总回报的期望。
  • 可解释性:一般来说,这是 DL 的一个问题,但在强化学习中,这个问题变得更加重要,因为网络经常选择如何移动可能对人或财产造成物理损害的物理机器(如自动驾驶或机器人)。RL 代理可能会做出灾难性的控制决策,而我们不知道确切的原因,这反过来意味着我们不知道如何在未来防止它。

结论

我不知道你读了会不会觉得压抑或者扫兴。我的意思是这是一个现实的检查,以减少炒作,所以我真的很努力。但我也应该否认所有这些观点,因为这些问题正是它成为如此热门的研究领域的原因,人们正在积极解决许多(如果不是所有)这些棘手问题。这让我对 RL 的未来感到乐观,但意识到这些仍然是问题,这让我成为一个现实的乐观主义者。

信不信由你,我不会完全不相信 RL 在工业应用中的价值…当它工作的时候真的很棒。我只是想确保你知道你正在做什么,这样你就不会过度承诺和低估时间表。😃

为什么你会成为失败的数据科学家

原文:https://towardsdatascience.com/why-youll-fail-as-a-data-scientist-deca06ce0ee8?source=collection_archive---------23-----------------------

以及如何确保自己成功

图片由皮克斯拜的 Gerd Altmann 提供

您是否曾经想过,为什么一些数据科学家很成功,而另一些人似乎从未在职业生涯中取得进展?这不是因为表现不好或缺乏知识,而是他们如何为自己的成功做准备。我是一名数据科学家和数据分析师,见证了我的成功和失败。今天,我想分享一下我对如何确保作为数据科学家拥有成功职业生涯的想法。

1.学习如何清楚地解释复杂的概念

数据科学家倾向于用技术术语解释机器学习的结果。如果你属于这一类,学习如何向非技术人员解释结果。如果你不能用一种他们能理解的方式来解释,利益相关者不会欣赏你的贡献。

试着找类比向你的利益相关者解释机器学习。我曾为一位副总裁工作,他认为机器学习就像运行回归模型😧。考虑打个比方机器学习就像烹饪向利益相关者解释你的建模过程。

2.学习如何用数据讲故事

了解如何在展示您的机器学习结果时创建令人信服的叙述。如果模型从未被业务使用,它们就不能提供价值。通过学习如何有效地展示我的机器学习结果,我能够说服我的利益相关者采用我的模型。

例如,我曾经建立了一个模型,帮助识别可能从个人价格计划升级到团队价格计划的客户。我没有解释我尝试的算法和模型准确率,而是使用数据故事来展示我的结果

首先,我设定了销售代表手动找到好的销售线索进行追加销售所需的时间。然后,我展示了该模型如何通过对每个客户进行评分来找到最佳销售线索,从而为销售团队节省时间。最后,我展示了模型结果,以及我们如何有可能将当前转换率提高一倍。好处是显而易见的,我得到了将模型投入生产的许可。

3.尽早联网

与转到其他公司的老同学和同事保持联系。除了在外部建立关系网之外,还要认识和你一起工作的其他团队中的人。他们中的任何一个人都有可能在一家公司找到一个非常适合你的职位,作为内部推荐人,你获得这份工作的几率会更高。

多达 80%的工作都是通过个人和职业关系填补的。你永远不知道推动你职业发展的完美工作什么时候会出现。

4.帮助别人

主动帮助一个项目,即使这不是你的责任。你现在帮助的人将来更有可能回报你。研究表明"即使回报不会马上显现,为他人的成功做出贡献从长远来看是值得的"

指导初级团队成员的项目。向他人解释概念将有助于你学习并提高你的沟通技巧。

5.积极主动

不要等成功来找你

如果你想升职,问问你的经理你需要做些什么来实现。

如果你想加薪,准备好你的理由,和你的经理谈谈为什么你应该加薪。

不要指望 你的经理某天醒来,觉得该提拔你了,或者给你加薪了。你的经理不会读心术。明确你的职业目标,并与你的经理讨论实现目标的最佳方式。

最坏的情况是你会被告知“不”,但最好的情况是你会得到你想要的。

感谢你的阅读,我希望你的成功之路,无论你如何定义,来得越早越好。

你可能也会喜欢…

https://medium.com/the-post-grad-survival-guide/how-to-handle-a-bad-manager-e68032e47

为什么你会辞去数据科学的工作

原文:https://towardsdatascience.com/why-youll-quit-your-data-science-job-6079d407bbeb?source=collection_archive---------0-----------------------

你应该做些什么来防止这种情况发生

来自 Pexels 的 Andrea Piacquadio 的照片

哈佛商业评论称数据科学家为“21 世纪最性感的工作”,但许多工作并不“性感”,人们经常辞职,因为期望与现实。作为一个曾经做过数据科学家和数据分析师的人,我想分享我的建议,告诉你如何避免在开始工作的几个月内就想辞去数据科学家的工作。

期望 1:我可以使用最先进的机器学习算法来解决影响业务的复杂问题。

遗憾的是,大多数数据科学工作并非如此,因为你必须平衡业务需求和时间。当一个简单的算法将产生类似的结果时,很难向高级管理层证明你将花费时间来追求闪亮的新算法在准确性上的边际改进。

作为一名数据科学家,我支持电子邮件营销,并将大部分时间用于构建购买倾向模型。我没有机会尝试其他类型的模型,因为没有业务需求。我的工作影响不大,因为电子邮件营销只占总收入的一小部分。我太想离开了,几乎没有找到另一份工作就辞职了。从我的错误中吸取教训。

如何更接近自己的期望:

  • 仔细阅读岗位说明书 。主要职责是建立机器学习模型吗?当心职称,因为数据分析师的工作可能有数据科学家的头衔
  • 在面试中阐明对该职位的期望。如果工作描述包括创建仪表板或 ETL 管道,询问你的时间将分配给这些职责的百分比。如果建模只占你时间的一小部分,那就不适合你。
  • 问问你会支持公司里的哪些群体 。并非所有群体都生而平等。如果您的贡献能够影响销售或产品等创收团队的 KPI,他们将获得更多的可见性。询问关于商业模式和公司如何赚钱的问题。哪些团体有助于业务增长?如果你的角色支持这些群体,那么你的模型可能会对收入产生重大影响。这并不意味着如果这个职位支持成本中心,你就应该拒绝这个提议,但是你应该考虑一下。

期望 2:我可以整天做模型。

为了能够整天构建模型,您需要合适的数据基础设施和技术来支持这一点。在我工作过的所有公司中,我不得不处理分散的、肮脏的、未记录的或者三者兼而有之的数据。

如何更接近自己的期望:

  • 询问技术栈。如果面试官提到 Excel 电子表格和 Access 数据库,那就避而远之。(不幸的是,当时我是顾问,而这是客户,所以我只能按兵不动。)如果面试官提到最近的你熟悉的软件和工具,这是一个好迹象。**
  • ****询问数据可用性。确认公司有一个包含数据的数据库。一些公司刚刚起步,可能很少有数据可用于建模。有数据工程师帮助您加载新数据吗,或者您需要自己进行 ETL 开发吗?如果数据很少,或者你整天都在加载数据,你就没有时间建立模型,这不是你想要的工作。
  • ****询问数据团队是如何组织的。检查你是否是第一个数据雇员,因为你可能会从事任何与数据相关的工作,建模将是你最后要做的事情。询问团队中还有多少其他数据科学家。检查是否有独立的数据分析师团队。最好的情况是为拥有独立数据科学和数据分析团队的公司工作。拥有两个团队意味着您更有可能在数据分析师创建仪表板和运行数据分析的同时构建模型。

期望 3:公司了解数据科学的价值,否则他们为什么会雇佣我。

德勤的一份报告称“数据分析的重要性日益增加,并作为高管的决策资源发挥着关键作用。”然而,数据素养是组织中普遍存在的问题。公司希望像其他人一样成为“数据驱动型”,但大多数公司不明白如何利用数据科学来增加业务价值。

如何更接近你的期望:

  • 求以往问题的例子,用什么模型解决的。 这个问题将帮助你衡量公司的数据科学成熟度。如果你不能得到一个好的答案,这是一个危险信号。他们可能对数据科学如何做出贡献没有一个很好的想法,而你会因为缺乏数据素养而感到沮丧。小心不要在数据科学还未被证实的公司工作,因为你会遇到更多的阻力。
  • 学习如何将 机器学习呈现给非技术人员 。您可能需要向多种类型的观众展示您的模型结果。他们中的许多人不会理解什么是机器学习。学会解释你的模型如何给企业带来好处。拥有这一技能将使你在任何数据科学岗位上受益,并帮助你的利益相关者欣赏你所增加的价值。

希望这些小技巧能帮助你找到一份更接近你期望的数据科学家工作。虽然有时令人沮丧,但付出的努力是值得的。感谢阅读,请不要放弃数据科学!

你可能也会喜欢…

**https://medium.datadriveninvestor.com/how-to-become-a-successful-data-storyteller-f90e677e4770 https://medium.com/swlh/how-i-used-a-machine-learning-model-to-generate-actionable-insights-3aa1dfe2ddfd **

为什么你会后悔训练 ML 模型

原文:https://towardsdatascience.com/why-youll-regret-training-ml-models-fc95018dc352?source=collection_archive---------24-----------------------

数据科学

在思考这 6 件事之前

背景图片来自 Unsplash ,非常感谢创作者 @awmleer

我知道,你对你的新问题很兴奋,迫不及待地要用机器学习来解决它。但是因为你是一个伟大的数据科学家,你知道有些事情你必须在开始之前考虑。从你的第一次数据分析到生产,有许多事情可能会出错。因此,让我们花几分钟时间集体思考一下,你能做些什么来确保你的下一个项目成功。

首先,与每个项目一样,你需要知道你的目标是什么,它是完全自主的还是人工辅助的 ML 系统?您对问题前景的理解可以为您和您的组织节省大量时间。

此外,您需要了解该领域已经取得的成就以及局限性。如果你不这样做,你最终会得到一个无法使用的系统,或者更糟的是解决一个没有解决价值的问题。接下来的部分将涉及准备过程的所有阶段,并且肯定会给你一些关于如何着手下一个项目的新想法。

“给我六个小时砍树,我会用前四个小时磨利斧头。”
亚伯拉罕·林肯

看数据

俗话说,垃圾进垃圾出。如果你试图用于 ML 模型的数据是坏的,你的模型将经不起现实的考验。确保在使用数据之前对其进行检查,是任何数据工作者最重要的职责。不管是机器学习工程师,数据分析师,数据科学家,还是数据工程师。

最坏的情况是,你将在接下来的几个月里致力于一个无法解决的问题。您至少应该查看数据分布,以及收集过程的质量和存储的数据质量。

  • 很多数据都是在同一个月收集的吗?
  • 数据来源是什么,来自什么时间段?
  • 它是通过一项调查收集的吗?在这项调查中,只有特定的人口统计数据做出了回应。
  • 它是从某个网站收集来的,可能不代表你的观众?

是一些你应该能够回答的基本问题,或者至少告知你不知道有风险。其他要注意的重要事情是缺失的记录或不完整的记录,这可能是你不知道某些事情的早期迹象。做一些探索性的数据分析,从你能找到的所有角度绘制数据。所有这些往往揭示了如何进行的有用见解。

如果你感到无聊,提醒自己,在这个阶段修复一个注定失败的项目要比几个月后当你的整个模型都训练好了,所有的超参数都调整到完美时容易得多。

最坏的情况是你损失了几天,最好的情况是你节省了几个月。

别看数据

矛盾你可能会尖叫,公平点,但听我说完。你会对你的数据做出假设,这很好。但是你不希望做出不可检验的假设和潜在的过度拟合。这可能会创建一个仅适用于您目前所看到的数据的解决方案。记住概括,是你的最高目标。这是你的模型适当地适应新的、以前看不见的数据的能力。这正是为什么有一个测试集。

就像你的模型在查看测试数据时会过度拟合测试数据一样。通过选择在测试集评估中表现良好的超参数假设和架构,您也会下意识地过度适应人类系统。我有几种方法来消除我在训练过程中的不完美。但是请记住,你永远无法完全移除它们。

我最喜欢的方法是按时间分割数据,用旧数据训练,然后用新数据测试。更好的是,我使用所有的数据,并在开发模型时对收集的数据进行测试。这样,我可以保证我的猴脑不会在测试数据上无意识地过度拟合。不要在每次训练后都看你的测试数据。

你需要更多的数据

我的文章是关于数据的吗?我想这就是为什么我称我的作品为“桑德罗的数据”。但是现在,严肃地说,如果你没有足够的数据,你就不能开始训练任何可以很好概括的东西。

遗憾的是,从一开始就不容易判断你是否有足够的数据。一个指标是你在数据中看到的噪音如果你有很多噪音,你需要更多的数据,如果很明显你可以少用一些。

要解决这个问题,你不能收集或标记更多的数据。增强数据技术或创建合成数据也可以很好地工作。虽然不理想,但如果存在不破坏采样点意义的变换,它是可行的。如果您正在进行图像分类任务,一个很好的例子就是图像的背景。

还有一个细节,如果您处理的数据量有限,请确保为您的模型使用较少的参数,因为大型神经网络几乎肯定只会记住所有的数据点,而不会一概而论。如果你对手头的数据量感到不安,确保运行或以某种方式获得更多。

问问那些了解这个领域的人

也被称为领域专家,这些生物知道他们的领域,并且已经在这个主题上工作了很多年。他们知道简单的指标,并为你的问题获取数据。最重要的是,他们知道什么问题是值得解决的,并且会为他们节省最多的时间。

有时解决一个问题类别,就已经解决了 80%的问题。著名的 80-20 法则,也称为帕累托原则,也适用于数据科学。作为一个局外人,识别潜在的最有效的解决方案可能对你来说很难,但是领域专家已经接触相同的问题很多年了。

这里的另一个话题是可解释性。它们将让您了解需要基于可解释性的方法来理解您的模型所产生的决策的监管约束或利益相关者。

众所周知,理解问题和数据至关重要。因此,一定要询问他们有关数据收集过程的问题,以便将您的数据分析引向正确的方向。最后,他们是你能找到的最好的广告商,可能会帮助你在你的公司或他们的行业中向那些从你的工作中获益最多的人推广你的工作。总而言之,这是一个明显的双赢,去和他们谈谈,之后你仍然可以重新发明轮子。

其他人也用机器学习来解决问题

学术界和工业界都有大量有创造力的程序员和数据科学家,你可能不是第一个用机器学习来解决这个问题的人。

只有傻瓜才会从自己的错误中吸取教训。聪明人从别人的错误中吸取教训。”
奥托·冯·俾斯麦

这就是为什么你应该在一个项目开始的时候搜索做了类似事情的人的学术论文或博客帖子。文献研究将帮助您实现最先进的模型和预处理管道。更重要的是,它将帮助你避免最常见的陷阱,避免他们的错误。数据是否明显有偏差?某一类型的模型是否出现在所有论文中?是否经常对另一个数据集进行预训练?或者有没有一个标准软件可以很好地解决这个问题?是应该在你阅读的前几页回答的问题。

另一个信息来源是你的公司,可能有类似的项目试图在没有机器学习的情况下实现自动化,这可以向你展示传统方法的局限性,并指出问题的哪些部分可以在没有机器学习的情况下解决。这样你就可以先关注他们认为无法解决的部分。此外,这也可能让你对公司政治和可能需要解决的恐惧有一个初步的了解。关键外卖,让你的家庭作业开始前。

那生产呢?

就像他们说的那样,从目的开始。正如在开始提到的,你的目标应该是一个在生产中通用的模型。毕竟,你提供的价值不是测试集上的准确性,而是当它启动并运行时你所创造的价值。

当你做预测时,一定要尽早考虑有哪些数据可用。或者至少确保你在训练时不会使用不切实际的事后修正数据。另一个重要的方面是你的答案需要多快准备好。明天的回应是否足够,还是需要在接下来的几毫秒内做出?如果您计划使用稍微贵一点的 API,了解它的允许成本也很重要。如何确保服务始终在运行?如果离线几个小时会有多糟糕?有硬件限制吗?如果你计划在没有互联网连接的情况下在一些覆盆子馅饼上运行模型,你可能无法建立一个巨大的神经网络。您希望您的模型不断学习新数据吗?还是在受控条件下每年手动重新训练一次更安全。

最终,你是在构建软件,拥有一个合适的软件架构是必须的。一定要为生产做好计划,否则你会忙于错误报告,而不是创建新的模型

结论

花时间去真正理解问题,有时可能会觉得是浪费时间,但请记住,在项目开始时解决问题比结束时更容易。

一个机器学习模型毕竟是一个漫长旅程的结果,规划这个旅程需要回答很多问题。但是一旦你把它们都想通了,我相信你的下一个项目会取得巨大的成功。

如果你喜欢这篇文章,我会很高兴在 Twitter 或 LinkedIn 上联系你。

一定要看看我的 YouTube 频道,我每周都会在那里发布新视频。

为什么大多数数据科学组合项目没有得到招聘经理的认可

原文:https://towardsdatascience.com/why-your-data-science-portfolio-project-sucks-208ee830ad1b?source=collection_archive---------29-----------------------

以及如何做一个更好的

卡尔·海尔达尔在 Unsplash 上拍摄的照片

所以你想在你的投资组合中有一些好的项目来炫耀。你去 Kaggle 下载一组数据。有些变量需要预测,有些变量似乎与它相关。您可能会对几个分类变量进行伪编码,绘制一些显示相关性的图,然后花几十行代码来测试一些模型和调整超参数。当你尝试不同的方法时,所有这些可能需要几周或几个月的时间,但最终你会完成的!

这个项目会很烂。我可以说,在不知道模型有多精确,不知道你的超参数调优方法是什么,也不知道你用了什么花哨的机器学习算法的情况下。

原因是,所有这一切表明,你能够遵循一些关于超参数调整的在线教程,而不是你真正理解数据,并使用它来解决实际问题。

我认为上述内容就像使用这几行代码创建一个模型一样令人印象深刻:

老实说,这个模型可能会做得很好——XGBoost 对于大多数问题来说都是现成的。问题是,这是容易的部分。在这种意义上,我可以训练一个蹒跚学步的孩子“做”机器学习。

那么这里缺少了什么呢?主要是因为的背景。使用已经定义的特征将机器学习应用于已经识别的分类问题,这并不是对真正应用的机器学习的真实描述。

在实际的业务环境中,困难的部分是将高级业务问题(“欺诈性交易花费了我们很多钱”)与提议的业务解决方案(“如果我们检测到可能的欺诈案例,我们可以更早地发现它们,减少它们的财务影响”)与技术方法和用例(“构建一个 API,提取交易数据和其他相关信息,并将其分类为欺诈性或非欺诈性,这可以在超过特定阈值时触发警报”)。这是一个故意简单的例子,但即使在这里,如果我们考虑项目中涉及的内容,构建模型是最琐碎的部分。其他部分是:

  • 确定哪些特征对分类很重要。这并不意味着“拉所有的数据并检查它们”,这意味着思考通过特征选择过程。时间相关吗?一年中的什么时候?具体到市一级的位置?用户的本国与交易发生地之间的差异?所有这些似乎都有道理,但没有一个可能被明确编码到数据中——它们是需要单独设计和探索的特征
  • 需要定义数据管道,从正确的位置提取数据
  • 需要定义没有任何偏差的训练样本,例如,如果在欺诈交易发生和可能被发现之间存在时间差,则与交易相关的时间可能存在偏差
  • 对于预期的用例,分类模型如何与系统的其余部分一起工作
  • 假阳性和假阴性的相对成本是多少。这可能并不简单!也许同一个人的重复假阳性比不同人之间相同数量的假阳性代价更高。处理这个问题让我们走出了简单的分类领域,进入了更模糊的领域。

这些都是数据科学家可能需要处理的看似合理的问题,每一个都比展示您可以构建模型更有趣、更令人信服。但是因为模特的魅力,人们更愿意做模特。

为了更好的项目,找到真正的问题

关于如何制作一个伟大的数据科学作品集项目,我能给出的最好建议是找到一个真正的问题并解决它。即使是解决实际问题的简单项目通常也比使用已经准备好的数据集的人为项目更有趣。也许你想要解决的问题只是回答你对这个世界的一个迫切的问题——一个简单的分析项目可能是好的!也许你想构建一个可以在网络上运行的小应用程序,从一些 API 中提取数据,生成一些大家感兴趣的东西。或者,你可能想与现实世界的组织合作,帮助解决他们的问题。要了解更多想法,请参阅我关于在简历中获得一些数据科学经验的帖子:

无论如何,要记住的重要事情是投资组合项目的最终结果应该是真正重要的东西,而不仅仅是放在 Github 上的笔记本。向我展示你可以解决一个真正的问题,并创造出有价值的东西,我会比你只是展示你可以进行死记硬背的机器学习练习的项目印象更深刻。

你的数据科学项目失败的原因

原文:https://towardsdatascience.com/why-your-data-science-project-is-failing-388166514543?source=collection_archive---------26-----------------------

以及你能做些什么来防止它

Jo Szczepanska 在 Unsplash 上拍摄的照片

公司对人工智能和机器学习的投资比以往任何时候都多,但大多数数据科学项目都失败了。高达 85%的机器学习项目从未被部署到预测中。原因可能各不相同:数据质量差或难以访问,或者可能缺乏合适的架构。

一个常见的原因是业务和科学团队之间的错位。对结果的不同期望足以破坏数据科学项目。

项目甚至在开始之前就失败了。当你没有和你的商业利益相关者确认你承诺要做的工作的细节时,这个项目就已经注定了。

好消息是事情并不一定如此。

你可以采取一些措施来防止这种可怕的情况发生。在这篇文章中,我将讨论几个我长期以来学到的并且发现特别有用的东西。

了解业务问题

当然,要做的第一件事应该是与业务团队会面。了解他们试图解决的业务问题,以及他们认为你可以如何帮助他们。您需要了解细节,以便能够设计出最佳解决方案。商务人士通常不会对机器学习或统计学有很深的理解。他们可能会要求一个通用的模型,但是你有责任接受他们的要求并将其转化为一个明确的统计学习问题。回归,分类,聚类,你决定。

有时,他们甚至根本不需要模型!机器学习现在很花哨;人们似乎默认了这一点,但可能还有另一个他们没有考虑到的解决方案。你的工作是评估所有的解决方案,并提供最合适的,不管是什么。

询问他们将如何使用该解决方案

一旦手头的问题被很好地定义,你可能想要询问业务计划如何使用你将提供的任何东西。业务团队对机器学习如何帮助他们解决问题感兴趣,但不太考虑他们将如何在实践中使用模型的输出,这种情况比你想象的更常见。如果他们没有考虑过,这是可以的;这就是你发挥作用的地方。深入细节,帮助将他们头脑中可能仍是杂乱无章的想法转化为产品。这不是你希望你的数据科学项目死在上面的那座小山;这一点至关重要。

定义可交付成果

准确地知道人们将如何使用你的模型的输出将有希望帮助你定义可交付物。 deliverable 这个词来自软件开发,一般指一个软件或应用程序。但是,它也适用于数据科学项目。项目的结果,无论是模型对象还是仪表板,都应该是有形的和可测量的。因此,需要仔细定义。

始终与业务团队确认可交付成果的细节,不要做任何假设。你要提供的东西是毋庸置疑的。如果可能的话,包括一个模拟的例子,看看交付将如何。示例可以是来自模型的样本输出或仪表板的图示。一般来说,你做得越详细,成功的几率就越高。

确保你需要的东西是可用的

那么现在你们已经就需要交付什么达成了一致。太好了。但是你拥有成功所需的一切吗?在承诺任何事情之前,总是列出需求是一件好事。您可能还想对数据和技术等基本事物进行高层次的检查。以下是你可能想问的几个问题:

你的项目需要什么数据?

  • 你已经有数据了吗,还是需要收集?根据不同的答案,预计时间和要求可能会有很大的不同。如果你需要收集,那么你将不得不考虑到你的建议。它可能像浏览一个网站一样简单,也可能像设计一个完整的实验一样复杂。
  • 让我们假设你已经有了数据。是你能到达的地方吗?它是可用的形式吗?如果您的数据是原始的,处于数据湖中的某个地方,可能需要几周或几个月的时间才能恢复正常。
  • 即使你的输入是一个体面的形式,你有足够的音量吗?你可能需要几个月前才发布的特性的数据。你有多少数据?代表性如何?你应该等多久才够?

你的项目需要什么技术?

  • 您当前的堆栈能够处理这些数据吗,或者您还需要其他东西吗?当然,你不可能在笔记本电脑上处理几十亿行。
  • 生产您的型号所需的技术可用吗?你可能认为这是一个不成熟的问题,但事实并非如此。如果工程师无法将其投入生产,那么建立最先进的深度学习模型还有什么意义?最好是选择一个更简单的解决方案,有机会快速实现和使用。您总是可以稍后迭代和部署更复杂的模型,但是您将同时开始产生价值。

写一份研究提案

或者一个计划。或者简短。你可以随便叫它什么,但是把它写在纸上。写一份你承诺要做的事情的书面总结,对双方来说都是双赢的。这对业务团队是有益的,因为他们将有一些参考(如果您在 4-6 周内交付,他们记住您今天讨论的细节的可能性有多大?).但最重要的是,这将有利于科学团队。

通过写提案,你将有机会陈述你将做什么,为什么,如何做,以及何时做。如果有不清楚的地方或存在误解,将在提案审查中提出来。在花几周时间在一个项目上之前,你就能理清那些

同时,它也是一种保险政策。在每个人都订阅它之后,你就有效地把所有的人都绑定到它上面了。在交付日,如果有人问你为什么没有做一些不是所有人都同意的事情,你可以理直气壮地说这不在提案中。

宣布后续步骤

如果您的项目在完成后部署前需要额外的步骤,请考虑提前列出它们。例如,您应该在本节下的建议中声明任何测试。您可能需要在部署模型之前解释为什么这些步骤是必要的,但是,如果您在开始时就这样做,将会节省时间。此外,如果需要任何技术变革,工程/BI 团队将有更多时间来实施这些变革。从一开始就让他们参与进来,而不是在最后一分钟向他们扔炸弹。这都是计划的问题。而且也很有礼貌。

保持联络

定期与业务团队进行沟通是一个好主意。他们不必是正式的,但将有助于确保你的项目朝着正确的方向发展。如果有什么不太对劲的地方,你会想在你应该交货的那一天之前发现。

此外,业务团队可能比你拥有更多的领域知识。他们的输入可以帮助您做出更现实的假设,或者为您在数据中找到的模式提供背景。

最后,如果你让他们参与项目的所有阶段,这将增加参与度并赢得你的信任。

对于一个项目的圆满结局来说,当然还有其他的障碍。但是,至少我们可以采取措施降低风险。上面的列表来自我自己的经验,并不详尽。

为什么你的循环这么慢

原文:https://towardsdatascience.com/why-your-loops-are-so-slow-166ec67db47d?source=collection_archive---------24-----------------------

编写循环算法和“大 O 符号”概述

(src =https://pixabay.com/images/id-1113799/

介绍

在这个令人惊叹、有时甚至令人恐惧的编程世界里,有许多工具可供程序员用来帮助他们解决问题。数据结构上经常使用的一种工具是循环。循环当然可以指 while-looping、for-looping 和勉强;递归循环。循环的问题是它们可能是严重的性能障碍,然而它们是许多编程操作不可或缺的。

不管你在编程什么,肯定会有多种不同的方式来完成。虽然最终目标可能会被保留,但几乎可以肯定的是,为了实现这一目标,将会有一条不同的道路要走。这也意味着不同的方法可能要花费更多的时间和内存才能得到相同的解决方案。这些都是程序员应该意识到的事情,尽管很难使用尽可能少的内存来实现高性能的完美函数,但是有一些方法可以改进它们的循环,从而提高性能。此外,在计算机科学中有一个公式化的属性,我们可以用它来评估一个函数的效率,这就是所谓的

大 O 符号。

大 O 符号

那么到底什么是大 O 符号,我们如何使用它来提高我们的编程技能呢?大 O 符号是一种数学形式,它描述了一个参数在数值上增加时函数的行为。例如,假设我们在 Python 中有一个基本的求和函数:

def summation(n):
    total = 0
    for number in n:
        total += number
    return(total)

列表“n”越长,这个函数循环执行加法和断言操作的次数就越多。你可以想象,在这个列表中很可能有一个非常线性的方程来增加新的迭代。随着 n 范围的增长,编译的时间也会增长。我决定把这个带进 Jupyter,以便更好地形象化,所以如果你想看我用的笔记本,你可以在这里:

https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Python3/big o notation.ipynb

这是我用来测试通过这个函数传递的不同数量的数字的函数:

def test_speed(numbers):
    results = {}
    for number in numbers:
        start = time.time()
        total = summation(list(range(1, number)))
        end = time.time()
        results[number] = end - start
    return(results)

该函数使用时间模块来获取每次求和所花费的时间。它传递了一个范围在 1 和数字之间的列表,这意味着我们将能够通过向数字列表中添加新的数字来确定循环了多少个值。让我们来试试吧!

measurements = test_speed([1000, 10000, 100000, 10000000])
print(measurements)

作者图片

现在我们将使用 Plot.ly 对此进行可视化。首先,我们需要将我们的数据放入 DataFrame 中。如果我们只是将这种类型投射到我们的数据上,我们的速度值将是一串数字列中的一个单独的观察值,因此在使用 Plot.ly 之前,我们需要做一些基本的字典到数据帧的处理。首先,我将从字典中取出我们的数据:

speeds = measurements.values()
ns = measurements.keys()

现在,我将使用该数据创建一个数据框架:

import pandas as pd
df = pd.DataFrame({"Speed": speeds, "Count": ns})

最后,我将使用 Plot.ly 绘制它:

import plotly.express as px
fig = px.line(df, x="Count", y="Speed", title='Summation Over Time')
fig.show()

(图片由作者提供)

我们的功能实际上是线性繁重的,至少在处理时间方面是如此。在大 O 符号中,这被称为 O(n)。O 代表我们的运营成本,在本例中,因为我们的大 O 符号是 O(n ),所以我们可以通过减去我们函数中运行的两个数字来获得给定总和的运营成本,这两个数字相距一个数值步长。

还有一些其他流行的大 O 符号,在计算机编程中非常常见。O(1)是基线,意味着输入的数量无关紧要。这是你创建任何函数的基线,例如,如果没有循环,也许一个操作,很可能是 O(1)是你要处理的。另一个是 O(log n),这里的税收稍微多一点,但是随着迭代次数的增加,循环趋于平稳。这在需要大量初始化的循环方法中很流行,但每个周期不需要那么多操作。

下一个 O 符号是 O(n log n),O(n log n)通常也是线性的,但通常比 O(n)的斜率更陡。O(n)是指数增长,这意味着每次迭代都要花费前 n 次运行成本的平方。然后是 O(2^n),这更糟糕,通常是指数增长,只是斜率更陡,因为指数现在是迭代次数。最后还有 O(n!).这是 n 的阶乘,阶乘的问题在于它们很快就会失控。虽然计算 5 的阶乘可能需要几秒钟,但计算一个非常大的数的阶乘可能需要几年时间。在计算机编程中,阶乘的典型递归实现更是如此。正如你可能想象的那样,这意味着计算时间随着 n 的增加而急剧增加。我在网上找到了一个很棒的可视化,但我无法在不侵权的情况下将其添加到这项工作中,因此我将提供一个链接来查看它这里。可视化很好地展示了每个符号的样子,并真正揭示了它们之间的差异。

结论

大 O 符号是现代计算的主要元素,因为它非常常用于分析函数的效率。大 O 提供的信息可以做什么?当涉及到处理更多的值时,随着符号的急剧增加,某些函数有一些明显的缺点。当然,有一些函数的行为方式是这样的,它们取的值比其他函数少得多,所以使用该函数的意图以及该函数的实际用途对大 O 是否是你要可视化的函数的一个真正重要的部分起着很大的作用。

也就是说,大 O 符号当然是一个有价值的工具。它可以用来分析一个函数的状态有多关键,并且通常被用来判断一个函数是否是可伸缩的。可伸缩性对大企业来说很重要,而本质上不可伸缩的功能在扩展到更大规模时可能会出现问题,因此像这样检查性能指标无疑是有价值的,这样可以更好地了解特定功能对给定问题的应用情况。感谢您的阅读!

为什么你的神经网络以不同的方式不确定

原文:https://towardsdatascience.com/why-your-neural-net-is-uncertain-in-different-ways-a125ce1fa4e5?source=collection_archive---------26-----------------------

区分不确定性有助于我们更好地理解神经网络。

作者图片。由 phatplussmashicons 制作的图标。

欧洲网络充满了不确定性。在通过神经网络提供输入以检索输出之后,我们不能确定我们得到的输出是对现实的正确描述。此外,神经网络的不确定性需要分成两种不同的类型:

1。任意的不确定性:用更多的数据解决。

2。认知的不确定性:随着更多的数据变得更好。

将不确定性分成这两个独立的部分,可以更好地理解 神经网络实际上是如何学习以及学习什么。此外,处理这两种类型的不确定性需要非常不同的技术,我们稍后会看到。

但首先要做的是。让我们慢慢开始,用一个例子让问题更具体。

假设我们正在编写一个医疗软件来预测病人患心脏病的风险。为了进行预测,我们使用一个神经网络,该网络将患者的数据作为输入,包括年龄、身高和体重。作为输出,网络产生一个百分比,例如 2 % ,意味着患者在未来 10 年内有 2 % 的几率患心脏病。

不用说,我们认为我们做了所有的事情。我们有一个高质量的数据集来进行训练,将数据分成训练、验证和测试部分,并设计和评估了多个架构。结果,我们最终得到了一个神经网络,我们认为它能尽可能好地预测心脏病发作的风险。

现在,病人彼得走了过来。我们把彼得的数据输入我们的神经网络,它会吐出 40 %的心脏病发作风险!这是一个非常高的风险,彼得想知道我们的预测有多确定,这是可以理解的。

我们预测的不确定性可能有两个原因:

1.与彼得有相同数据(年龄、身高、体重)的人可能有非常不同的心脏病发作风险。我们的网络输出的只是所有这些潜在风险的平均值。比平均值更现实的是可能风险的概率分布。这个分布越分散(方差越大),我们预测的不确定性就越高。这就是所谓的 任意不确定性。

2.不确定性的第二个潜在来源如下:也许 Peter 的数据相当特殊,在培训期间,我们没有遇到任何类似的数据点,或者像他这样的数据点非常少。因此,基本上输入对我们的神经网络来说是陌生的,它没有任何线索。所以它只输出 40 %,因为它必须给出一些输出。这种不确定性与任意不确定性非常不同,被称为 认知不确定性。

知道这两种不确定性和它们之间的区别对我们给 Peter 建议没有帮助。神经网络预测出 40 %的风险,要么接受,要么放弃。我们没有机会弄清楚神经网络是确定无疑还是毫无头绪。

那么,我们如何才能建立一个神经网络来告诉我们它有多确定呢?因为随机的和认知的不确定性是如此不同,我们需要用不同的技术来解决它们。

处理任意的不确定性

记住,随机不确定性是数据固有的不确定性。无论我们收集了多少训练数据,总会有年龄、身高和体重相同但心率风险不同的人。因此,我们改变神经网络来输出概率分布,而不是对每个输入进行单一预测。

我们如何做到这一点?首先我们选择一种分布类型,例如正态分布 N(μ,σ ) 。正态分布有两个参数,均值,方差 σ

现在,我们的神经网络不再产生单一的心脏风险百分比,而是将它改为输出平均值*和方差的值*

然后,以这样的方式调整损失函数,即训练网络的输出和 σ 最大化观察训练数据的可能性。本质上,我们的神经网络只预测了平均值,但现在它额外预测了来自数据的方差——随机不确定性。****

趣闻: 最小化 MSE 损失(均方误差损失)和最大化关于分布 N(μ,1)的似然性是一样的,意味着方差σ不是学习的而是固定为 1。

如果你想亲自尝试这些概念,TensorFlow 有一个非常棒的扩展, Tensorflow Probability 。你可以选择你的发行版,图书馆会处理所有其他的事情。

回到我们的不确定性。我们让我们的神经网络告诉我们心脏风险百分比以及它所看到的数据中的不确定性。但是如果没有足够的数据呢?回到我们的例子,如果 Peter 的数据是特殊的,并且训练数据只包含非常少的与 Peter 相似的数据点,那该怎么办?然后我们的网络会给我们一些随机的风险百分比和随机的方差,但是 T2 基本上不知道。这直观地解释了为什么任意不确定性和认知不确定性是独立的,以及为什么我们必须分别处理认知不确定性。

处理认知不确定性

认知不确定性是不确定性,由于信息不完整,由于没有看到所有的数据。在大多数真实世界的场景中,我们手头永远不会有关于我们问题的所有数据。因此,一些认知上的不确定性将永远存在。尽管如此,认知的不确定性随着更多的数据而减少。**

让我们暂停一会儿,想想我们如何能够对我们神经网络的当前认知不确定性进行建模。我们实际上不确定什么?如果给我们更多的数据,会有什么变化?

答案就在我们面前。我们网络的权重。随着更多的数据,我们的权重将会改变。我们不确定自己的体重。那么,我们不使用固定的数字作为权重,而是使用适当的概率分布来模拟当前认知的不确定性,如何?

这正是贝叶斯神经网络(BNNs)的本质。bnn 将权重视为概率分布,而非数字。

他们使用贝叶斯推理用更多的数据更新这些权重概率分布(这就是这个名字的由来)。训练它们的成本更高,但除了网络的预测,我们还得到一个数字,告诉我们我们的网络在认知上有多不确定。

如果你想试试贝叶斯神经网络, Tensorflow Probability 支持它们。

结论

神经网络的输出总是带有不确定性。此外,神经网络的不确定性可能是由于数据中的方差(随机不确定性)或由于没有看到所有数据(认知不确定性)。这两种类型的不确定性都可以用它们自己的技术来解决和量化。

医学预测,就像我们例子中的彼得的心率风险,只是了解神经网络实际上有多不确定的一个重要方面。在安全关键的环境中,人类的生命往往处于危险之中,概率深度学习技术可以使神经网络更加安全和可靠。

觉得这个故事有趣?你可以在这里成为一个中等会员来支持我的写作:medium.com/@mmsbrggr/membership。你将获得所有媒体的访问权,你的部分会员费将直接支持我的写作。

欢迎在 LinkedIn 上向我提出私人问题和评论。如果你喜欢这篇文章,让我告诉你我的简讯:【marcelmoos.com/newsletter。

如果你想更深入地了解概率深度学习,请查看以下资源:

为什么你的组织不应该给低效的流程增加更多的资源

原文:https://towardsdatascience.com/why-your-organisation-should-not-add-more-resources-to-inefficient-processes-3695eecaf905?source=collection_archive---------25-----------------------

业务流程自动化(BPA)

不自动化重复流程的真实成本

莱昂·奥阿尔赫在 Unsplash 上的图片

并非每个组织中的每个流程都像一台运转良好的机器。如果说有什么不同的话,那就是超高效流程是个例外,而低效流程则更为普遍。为什么这是一个问题?因为每年,公司都会因为流程效率低下而损失 20–30%的收入。不用说,收入减少意味着利润减少。

因此,如果你的组织的流程效率低下,你很可能会损失收入。这是因为效率低下会对您交付高质量客户体验的能力产生负面影响。它们还会阻碍您的上市时间,抑制您的创新能力。

另一个问题是——它们会让你的员工困惑和沮丧,影响他们的参与度和积极性,增加他们的压力,有时还会导致精疲力竭。因此,员工流动增加,这增加了您的人力资源成本,并再次影响您的收入和利润。所有这些结果都不利于你的组织的成长和成功。

那么,解决效率难题的最佳方式是什么呢?增加更多的人力资源,希望他们能找到让流程更高效的方法?许多组织认为这是正确的答案。但是我们不敢苟同。

同样的动作,差的结果

疯狂就是一遍又一遍地做同样的事情,却期待不同的结果

[人名]阿尔伯特·爱因斯坦(犹太裔理论物理学家)

这些词在组织和低效流程的背景下确实有意义。当然,选择一遍又一遍地做同样的事情可能并不完全称得上“疯狂”。然而,这是一个陷阱——许多组织都曾陷入其中。

其中一个选择是继续使用集成不良的遗留应用程序和系统,即使它们不再能有效地应对不断变化的业务环境中的新挑战。这是一个巨大的问题,因为它会导致次优的功能孤岛和工作流,从而对企业范围的通信和协作产生负面影响。它还迫使组织继续进行单调乏味的手动任务,这降低了生产率,增加了错误和资源负担。最后,不能相互“对话”的系统意味着员工不断在不同的信息源之间转移,导致成本更高、生产率更低和人员流动更大。从更广的层面来看,过时的系统使得保持竞争优势、确保客户满意度或实现持续增长变得几乎不可能。

许多公司采用的另一种常见的传统方法是简单地向低效流程添加更多资源。然而,并不是所有的旧思想都是明智的,这是其中之一。简单地将更多的人添加到一个中断的流程中并不能解决问题的根本原因。此外,人并不总是流程效率低下的原因,或者仅仅是原因。因此,简单地增加劳动力规模类似于用错误的药物治疗疾病。

流程效率低下的真正原因

“有效性就是做正确的事情;效率就是把事情做对。”

彼得·德鲁克

对可用资源的不当规划是流程效率低下的主要原因。未能识别运营相互关系、突发事件和风险也是一个原因,因为缺乏关于责任、问责和预期结果的清晰性和透明度。反馈不一致或不充分,沟通不畅也会降低效率。此外,当流程是操作惯性的结果时(“如果它没坏,为什么要修复它?”),它们通常会导致瓶颈、冗余、错位和返工,所有这些都会降低流程效率和生产率,更不用说盈利能力了。

现在,如果在一个特定的过程中需要更多的人来满足增加的生产量,这是一个过程正在增长的信号。因此,企业很可能从中获得更大的收入。两者都是好结果。然而,在一个成长过程中增加更多的人员,或者更糟糕的是,一个低效的过程可能会影响其盈利能力和投资回报率。无论如何,这些都不是好结果。

由于不了解流程效率低下的真正原因及其实际成本,您在黑暗中工作,不知道自己在哪里,也不知道要去哪里。这只会加剧你的低效率问题,导致高成本、低竞争力和差结果的恶性循环。这些问题不会简单地通过增加员工来解决。

改善流程低效的秘诀

想想像诺基亚、黑莓、柯达和雅虎这样的公司——它们曾经都被认为是各自领域的领导者,并准备好了多年的增长和成功。即使拥有庞大且不断增长的劳动力,这些组织还是设法从雷达上消失了,大部分消失在无结果的深渊中。导致这些结果的两个主要原因是创新失败,以及未能适应不断变化的市场现实。柯达错过了数码摄影革命。诺基亚未能将其注意力重新集中在智能手机和智能手机软件上。黑莓忽略了基于触摸屏的技术。雅虎没有抓住关键的机会,否则今天的世界会是雅虎而不是谷歌。

这些公司和其他许多已经过时的公司可能会通过采用新技术和自动化现有流程而受益。这些选择可以释放他们的人力资源,并允许他们专注于更高价值的任务,这些任务可能会为流程和业务带来更好的结果。

智能流程自动化(IPA)、机器人流程自动化( RPA )、人工智能和机器学习都为提高流程的速度、简单性和效率提供了很好的途径。通过自动化重复、枯燥或费力的任务,你可以在不增加更多资源的情况下获得惊人的结果。无论如何,你可以重新安排部分员工的工作,让他们执行其他重要任务,为你的组织带来更大的战略价值。自动化还可以帮助您加快上市速度,最大限度地减少错误,简化工作流程,并提供更好的客户和员工体验。

结论

爱因斯坦说得对。以同样的方式做事情(增加更多的资源)并期待不同的结果(更有效的过程)是一个巨大的愚蠢,具有严重的长期后果。在当今急剧变化的经济形势下尤其如此。想要改进您的流程吗?不要再纠结于增加劳动力,开始考虑自动化和技术创新。最优解触手可及。一定要抓住它!

使用 Itertools 的超快速 Python

原文:https://towardsdatascience.com/wicked-fast-python-with-itertools-55c77443f84c?source=collection_archive---------2-----------------------

快速浏览一种通过使用 itertools 模块使 Python 更快、更有效地进行机器学习的简单方法。

https://unsplash.com/photos/eH_ftJYhaTY

介绍

最近,我写了一篇文章,详细介绍了一些我认为在 Python 编程语言中非常有用的标准库工具。那篇文章的反响非常好,所以我决定再写一篇文章,列出标准库中我最喜欢的一些模块。如果你有兴趣阅读这两篇文章,你可以在这里查阅:

</10-surprisingly-useful-base-python-functions-822d86972a23> </15-more-surprisingly-useful-python-base-modules-6ff1ee89b018>

然而,每当我写这些文章时,我都会遇到一个小问题。对于标准库中的许多模块,在模块内部有一个相对较小的方法或类型集合是很常见的。然而,偶尔会有一些更有用的 Python 模块,它们更加广泛,具有如此多的函数和类,以至于在那些文章中不可能涉及到它们。考虑到这一点,我决定从一个名为 functools 的模块开始这项任务。我写了一篇关于它有多有用的文章,你可以在这里查看:

这些文章中提到的另一个模块是一个叫做 itertools 的小模块。Itertools 是一个工具箱,用于在比我们通常在 Python 中使用的更高效、更古老的算法上构建定制迭代。不用说,在 Python 这样的语言中,当处理大量数据时,几乎总是需要考虑性能,像这样提供更有效迭代的工具非常有价值。

一般来说,编程速度变慢的最常见原因是过多的循环。迭代循环,特别是在单线程应用程序中,会导致很多严重的速度下降,这肯定会在 Python 这样的编程语言中引起很多问题。幸运的是,标准库模块 itertools 为我们处理迭代问题的典型方法提供了一些替代方法。不用说,这对于减少语言性能的障碍非常有价值。

笔记本

值得注意的迭代器

与原始文章列表中的大多数模块一样,在这个模块中,肯定有一些函数比其他函数有用得多。记住整个模块或包的内容可能会令人不知所措和困难。然而,有一种方法可以使你的学习适应一种更好的方法,在这种方法中,为了更快地学习,更有用的功能被优先考虑。记住这一点,下面是 itertools 使用的一些最重要的函数,以及它们的作用的简要描述。

import itertools as its

计数()

count 函数是一个迭代器,它将返回按特定步骤递增的值。这类似于迭代一个范围生成器,但是,有一些关键的区别。count()方法允许我们将步长数量作为关键字参数。此外,count()方法也将一直持续计数到无穷大。考虑到这一点,包含一个打破这个循环的条款可能是一个好主意,否则,它将永远运行下去。

for i in its.count(start = 0, step = 1):
    if i < 20:
        print(i)
    else:
        break

与基本迭代的解决方案相比,这种迭代方法也具有明显更好的性能。

周期()

cycle()方法可用于移动到 iterable 参数的下一次迭代。使用该函数的一个值得注意的部分是,它将创建并保存提供给它的每个迭代的副本。与 count 类似,这个迭代器也将无限返回,并在下次返回之前返回给定数组中的所有 dim。

array = [5, 10, 15, 20]
for z in its.cycle(array):
    print(z)

重复()

repeat()迭代器将一次又一次地不断返回一个提供的对象。这在某些情况下很有用,并且会无限返回,这是目前为止所有这些函数的共同点。

for z in its.repeat(array):
 print(z)

链条()

chain()迭代器从第一个 iterable 开始返回元素,直到用完为止,然后继续到下一个 iterable,直到用完所有 iterable。基本上,这将允许我们将多个 iterable 合并成一个长 iterable 来循环。当然,为了利用这个函数,我们还需要提供另一个 iterable:

array2 = [7, 8, 9, 10]

我们将每个 iterable 作为一个单独的参数提供,而不是一个列表:

for z in its.chain(array, array2):
    print(z)

压缩()

compress()迭代器过滤 dim 中的元素,只返回那些在选择器中有对应元素的元素,该元素的值为 True。

for z in its.compress('ABCDEF', [1,0,1,0,1,1]):
    print(z)

这个迭代器主要用于剔除不为真的参数。在上面的例子中,位数组中有两个零,这意味着映射到被迭代的字符。这两个零在 B 字符和 D 字符上,所以这两个字母在例子中不会被重复。

伊斯利斯()

我想介绍的最后一个迭代器是 islice()迭代器。这个迭代器返回数组位置的切片。例如,如果我们在位置 2 分割迭代,那么在迭代器到达该位置的值后,它将停止迭代。

for i in its.islice(array2, 2):
    print(i)

FizzBuzz 的一个例子

FizzBuzz 游戏是编码面试和一般编程实践中常用的迭代问题的一个经典例子。通常,每当这被写入 Python 时,都是使用条件来编写的,就像这样:

for i in range(1,101):
    fizz = 'Fizz' if i%3==0 else ''
    buzz = 'Buzz' if i%5==0 else ''
    print(f'{fizz}{buzz}' or i)

虽然这是一个非常好的方法,但是重要的是要记住,使用 itertools 迭代器意味着在其他地方使用迭代器的 Pythonic 实现。也就是说,itertools 的迭代器通常比标准 Python for 循环的常规迭代快得多。这肯定是要记住的,因为当你能够比其他人更快地编写一个函数来解决这样的问题时,它可能会给招聘经理留下深刻印象。

为了促进这种方法,我们需要做的第一件事是使用循环迭代器找出将被我们的两个数整除的 dim:

fizzes = its.cycle([""] * 2 + ["Fizz"])
buzzes = its.cycle([""] * 4 + ["Buzz"])

每当我们决定遍历 count()迭代器时,这将找到所有能被 4 或 2 整除的整数。我们还将为 fizz 和 buzz 一起打印的时候设置一个新的阵列。

fizzes_buzzes = (fizz + buzz for fizz, buzz in zip(fizzes, buzzes))

最后但同样重要的是,我们将使用另一个带有 its.count()迭代器的 zip()循环来获得结果。看一看:

result = (word or n for word, n in zip(fizzes_buzzes, its.count(1)))

最后,我们将对结果进行切片,以便只获得迭代器返回的 100 个值。

for i in its.islice(result, 100):
        print(i)

现在我们的整个 FizzBuzz 函数看起来像这样:

def fizz_buzz(n):
    fizzes = its.cycle([""] * 2 + ["Fizz"])
    buzzes = its.cycle([""] * 4 + ["Buzz"])
    fizzes_buzzes = (fizz + buzz for fizz, buzz in zip(fizzes, buzzes))
    result = (word or n for word, n in zip(fizzes_buzzes, its.count(1)))
    for i in its.islice(result, 100):
        print(i)

结论

使用 itertools 的 Pythonic 代码通常更快、更简洁。有了这两个观察,很容易想象为什么这么多人相信这个模块。不用说,itertools 肯定是一个充满迭代器的非常有价值的模块。显然,其中一些迭代器可能比其他迭代器更有价值。希望这个对工具的小偷偷摸摸和详细描述能启发你试着捡起它并更熟悉这门语言。不管你在这方面的情绪如何,我认为 itertools 仍然是该语言中最有用的模块之一。感谢您的阅读,以及您的支持!

熊猫融化,堆叠,宽变长,把列变成行

原文:https://towardsdatascience.com/wide-to-long-data-how-and-when-to-use-pandas-melt-stack-and-wide-to-long-7c1e0f462a98?source=collection_archive---------1-----------------------

使用实例了解如何重塑熊猫数据框架

照片由 Pixabay 来自 像素

重塑数据帧通常需要将列转换为行,反之亦然。

重塑数据帧有几个原因:

  • 整理混乱的数据集,使每个变量都在其列中,每个观察值都在其行中。
  • 为分析或可视化准备数据集的一部分。

每当我需要使用这些功能并复制粘贴解决方案时,我通常会使用谷歌。谢谢 stackoverflow!

在这篇文章中,我谈论熊猫。melt(),。stack()和。wide_to_long()。这些函数用于将列转换为行,也称为将数据帧从宽格式转换为长格式。

作者提供的宽而长的数据

希望读完这篇文章后,现在唯一的谷歌搜索将是官方文档和语法!

对于前两个函数,我们将使用下面的数据集。

作者的广泛数据框架

任务:将所有月份列移动到一个名为‘Month’的列下。其单元格中的值将被放入另一个名为‘Score’.的列中

作者提供的预期数据框架示例

1.融化()

熊猫[.melt()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.melt.html)通常是将宽数据帧转换成长数据帧的首选函数,因为它既灵活又简单。

。作者的熔化演示

df.melt()将具有公共值的相关列捆绑到一个列中,称为“变量”。最初在这些列中的值存储在另一个名为“value”的列中。

.melt()句法。

df.melt(*id_vars=None*, *value_vars=None*, *var_name=None*, *value_name='value'*, *col_level=None*, *ignore_index=True*)

所有这些参数都是可选的。让我们看看他们是什么意思。

id_vars —列名列表,将保持不变,不会被改变形状,也称为标识符变量。如果没有提供,所有的列将堆叠成一列。

value_vars —要堆叠成一列的列的列表。

var_name–新列的首选名称,用于保存重新调整后的列名。如果未提供,默认名称为“变量”。

value_name–列的首选名称,其中包含来自重新调整的列的值。如果未提供,默认名称为“值”。

让我们探索不同参数的.melt()

df.melt() — 未提供参数

所有的列都被重新整形

df.melt ( id_vars= …)

这里,我们提供了一个我们不想堆叠的标识符列的列表(你也可以在这里提供一个单独的列)。所有其他列都将被重塑。

注意,这些标识符列将对每个重新整形的列重复。例如,播放器 names, team, and games每隔month重复一次。

df.melt ( id_vars = …,value_vars = …)

value_vars保存要堆叠的列(或列列表)。下面,只重塑了两列;‘February’ and ‘June’还有一个 id 变量‘Name’。其余的从结果数据帧中删除。

df.melt ( id_vars = …,value_vars = …,var_name = …,value_name = …)

var_namevalue_name分别提供堆叠列的名称及其对应的值。默认名称为“变量”和“值”。

我们的预期任务结果:这里不提供要堆叠的value_vars。因此,而非 id_vars的所有列将被堆叠。我们还传递堆叠列的名称。

融化后保存指数()

ignore_index = True是融化功能的默认值。这意味着旧的索引被删除并用从 0 开始的范围索引代替。

如果索引对数据帧有意义(例如,它包含每个玩家的实际 id),首先重置索引。原始索引变成一列,并创建一个新的 RangeIndex。

第 1 步:使用reset_index()将索引释放到名为“index”的列中。然后将此列重命名为“ID”。

第二步:melt()数据框。包括“ID”作为标识符变量,以便它不被整形。

2。stack()

熊猫的.stack()方法也将宽数据帧转换成高数据帧。

最大的不同是.stack() 利用了索引,对所有不是索引的列进行了整形。

作者演示的 df.stack()

让我们来看看我们的原始玩家分数数据集。

原始宽数据集

现在让我们把它叠起来。

每个索引的所有列都已堆叠。结果是一个多级索引 系列对象。

.stack()方法获取所有的列,并将它们放到最内层的索引中。

现在,如果我们想要再现与上面的熔化函数相同的输出,我们需要经历一系列的步骤;

  1. set_index()。将索引设置为我们的标识符变量;Name, team,和数量games

2.stack()。这将产生一个多级索引数据框架。

3.reset_index()。这将释放多级索引并创建一个新的 RangeIndex。

4.rename‘Month’‘Score’匹配的列

另一个的例子**df.stack()**

任务:AA, BB and CC列堆叠在一个名为‘Labels’的列下。Date不应被整形,因为它是标识符变量。

df1 = df.set_index('date')
df1 = df1.stack()
df1 = df1.reset_index()
df1 = df1.rename(columns = {'level_1':"Labels",
                   0: 'Values'})
df1

同样的例子使用 **df.melt()**

df.melt(id_vars = 'date', 
       var_name = 'Labels',
       value_name = 'Values')

3.wide_to_long()

melt()和 stack()函数获取几列并将它们堆叠到一个列中。

如果我们希望将几个列捆绑成两个有意义的列呢?例如,我们不再像以前那样按月分组分数,而是按月分组分数和按月分组游戏

输入熊猫[.wide_to_long()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.wide_to_long.html)

pd.wide_to_long()作者演示

作者演示 pd.wide_to_long 的另一个例子

wide_to_long()以一种非常特殊的方式工作,它实际上利用了熊猫的.melt()。它需要四个必要的参数,但最重要的方面是列名的显示方式。

要堆叠的列名必须是特定的格式。

wide_to_long()函数的列格式

例如,对于上面的数据框架,下面是列。

  • 要堆叠的 df_1 列;games_jan, games_feb, scores_jan, scores_feb.
  • df_2 列;sick2017, sick2018, off2017, off2018

群组名称为'games', ‘scores’, ‘sick’, ‘off’.

标签是‘jan’, ‘feb’, ‘2017’, ’2018'

分隔符是‘_’ and empty string ''.

如果它们的格式不同,您需要重命名列

语法

pandas.wide_to_long(*df*, *stubnames*, *i*, *j*, *sep=''*, *suffix='\\d+'*)

前四个参数必须提供。

  1. df —要整形的数据帧。
  2. stubnames —相关列的组(前缀)。以这些字符串开头的列将被组合在一起。
  3. i —标识符变量,或不堆叠的列。
  4. j —包含列的后缀或标签的列的名称。

可选参数

  1. sep -分隔组名(前缀)和列名标签(后缀)的字符。默认分隔符是空字符串。

6.suffix —后缀的格式(正则表达式)。默认情况下,该函数接受数字字符;后缀= ‘\d+’。如果后缀包含非数字字符,例如上面例子中的“jan”和“feb ”,使用正则表达式’.+’搜索后缀中的任意数字字符。

让我们来探究熊猫的几个例子

例 1。

考虑下面数据帧;

任务:这两个组(gamesscores)每个都有自己的列保存值。季节标签(后缀 1 和 2)位于“季节”一栏下。

pd.wide_to_long(data_d, 
                stubnames=['games','scores'], 
                i=['Name','Team'], 
                j='Season')

注意,我们没有提供参数sepsuffix,因为缺省值适用于我们的数据帧。

最后一步是重置索引以消除 multiIndex。

wtl.reset_index()

例 2

这里我们有第一季和第二季玩家获得的奖牌。

每个赛季的奖牌数据框架

任务:medals列聚合成一个名为‘奖牌’的列。标签堆叠在另一个名为“季节”的栏中。只显示一个 id 变量的‘名称’。

*pd.wide_to_long(data_g,
               stubnames=['medals'],
               i=['Name'],
               j='Season',
               sep = '_',
               suffix='.+')*

只有一个群体;‘medals’。我们还提供了sepsuffix 参数,因为它们不同于缺省值。

注意:我们使用了一个标识符列i= ‘Names’,但是所有其他列仍然显示在结果中。当将df参数传递给函数时,我们可以删除不需要的列。

*pd.wide_to_long(df = data_g.drop(['Team','Games'],axis=1) ,
               stubnames=['medals'],
               i=['Name'],
               j='Season',
               sep = '_',
               suffix='.+').reset_index()*

例 3:

我在 stackoverflow 这里发现了这个问题。

任务:将顶层列‘PSC’‘Intel’调整到一个名为‘SAT’的列下。日期也应该堆叠在它们自己的称为“日期”的列中。他们的价值归入“NVAL”一栏。 id 变量‘FID’, ‘Lat’, and ‘Long’.

按作者的多索引列

步骤 1:通过连接名称来合并两个列级别。请参见上面的列级别。我们需要PCSIntel(级别 I)作为列名的后缀(最后一部分),因此在下面的代码中是‘{j}{i}’

*#List comprehension.
#every column has 2 names 
#on different levels.
#return names joineddf.columns = [f'{j}{i}' for i,j in df.columns]
df*

第二步:使用wide_to_long将标签PSCIntel 转换到一列“SAT”下。日期都不同,因此在‘stubnames’ 参数下有四组。

*df_wtl = pd.wide_to_long(df, 
                stubnames = ['23-May','18-May','25-May','28-May'], 
                i=['FID','Lat','Lon'], 
                j='SAT', 
                suffix= '.+', 
                sep='')*

我们看到很多“不”,因为IntelPSC 都适用于特定的日期。

第三步:使用df.melt将日期堆叠在一个名为‘Date’的列下。这些值进入另一个名为‘NVAL’的栏目。记得在.melt()reset_index(),在dropna()后。上面创建的SAT现在是标识符列之一。

*#reset the index 
#melt
#drop Nans df_wtl = df_wtl.reset_index()df_wtl.melt(id_vars =['FID','Lat','Lon','SAT'],
            var_name = 'Date',
            value_name = 'NVAL').dropna()*

最后,调用df.reset_index(drop=True)从 0 开始创建一个新索引,并删除上图中的现有索引。

结论

在本文中,我们研究了三种将列转换为行的方法。

我们注意到df.melt()df.stack()函数通过将几列捆绑成一列来做同样的事情。

df.stack()获取列并将它们转置为最内层索引,保留原始索引,创建多级索引。不应堆叠的列应设置为索引。

df.melt()提供了选择要重塑的列以及结果列的名称的灵活性。但是,它会删除现有的索引并用新的索引替换它。

pd.wide_to_long()将多组列捆绑成两列或更多列。它还要求列名采用特定的格式。

在这里找到包含所有代码的 Jupyter 笔记本。感谢您的阅读!

WiDS Datathon 2021:我的第一个 Kaggle Datathon

原文:https://towardsdatascience.com/wids-datathon-2021-my-first-kaggle-datathon-806a99cbfb19?source=collection_archive---------41-----------------------

我的团队预测糖尿病的方法

Diabetesmagazijn.nlUnsplash 上拍摄的照片

数据科学中的女性(WiDS)是一项支持全球数据科学家的全球性运动。妇女参与发展倡议每年举办一次数据马拉松,鼓励所有参与者通过应对社会影响挑战来提高技能。本次比赛最精彩的部分是本地研讨会和在线资源,以帮助初学者提高他们的数据科学技能。我参加比赛有助于我与几位经验丰富的数据科学家互动,并向他们学习。这篇文章是对我的团队所采取的方法的简要说明。

问题描述

竞赛的目的是创建一个模型,以确定入住 ICU 的患者是否被诊断患有特定类型的糖尿病,即糖尿病。AUC_ROC 是用于评估模型性能的度量。

数据分析

比赛的数据集可以从 kaggle 访问。该数据来自麻省理工学院的 GOSSIS(全球开源疾病严重程度评分)计划。数据集由 180 个要素组成。根据字典,数据中有 7 类特征。由于数据集中有大量要素,因此对数据进行了分类分析。对数据的进一步研究表明,我们的数据是不平衡的。

功能集中有许多缺失值。还观察到一些特征成对丢失。例如,D1 _ 葡萄糖 _ 最大值和 D1 _ 葡萄糖 _ 最小值的缺失值数量相同。我们还注意到在一些 apache 和 vital 列中有许多共同的值。

数据清理

数据科学项目最重要的部分是正确清理数据。有些行的“年龄”等于 0。一个有趣的发现是,年龄=0 的患者具有成人的身高和体重。由于这似乎是一个错误,所有这些行将被删除。“种族”的缺失值用“其他/未知”填充。因为只有几行缺少性别值,所以该列用最常见的值“M”填充。我们试图用相应的身高和体重值来计算“bmi”字段。但是,这种方法不适用于该数据集,因为所有缺少的“bmi”值都缺少与之关联的“身高”或“体重”值。因此,这些特征中缺失的值将使用相应性别的特征平均值进行估算。功能“icu_admit_source”的缺失值使用“hospital_admit_source”列填充。

正如在数据分析一节中所讨论的,d1_max 和 apache 变量有许多共同的值。因此,d1 变量的缺失值使用相应的 apache 值来填充。

有些最小值和最大值列的最小值大于最大值。我们颠覆了这些价值观。我们还删除了所有值完全相同的列。数据字典描述有助于使用其他列填充某些要素的缺失值。

我们删除了数据集中所有高度相关的列。我们还删除了一些缺少很多值的列和一些没有值的列。我们为所有分类变量创建了虚拟变量。

特色工程

由于领域知识有限,我们的团队没有做很多功能工程。由于数据集中有大量的要素,我们从数据中移除了所有高度相关的要素。我的队友莉亚创造了一个非常重要的新功能,做得非常好。新的特征是肾功能的估计值。

分类

我们实现了一些基线模型来检查不同算法的性能。由于数据不平衡,我们试图使用 SMOTE 和 ADASYN 等技术来改进模型。不幸的是,这种方法没有给出任何预期的结果,这导致了对基于树的模型的关注。一般来说,据观察,像 xgboost 和 lightgbm 这样的模型在 Kaggle 比赛中工作得非常好。我们还注意到,这些模型在这个数据集上工作得很好。我们的最终模型是超参数调谐 lightgbm 模型。该模型在最终排行榜上的最终得分为 0.86,这对于初学者来说是一个相当好的模型。

结论

参加这次比赛是一次美妙的经历。有经验的 kagglers 的公共笔记本是学习新概念和新技术的重要资源。我建议所有初学者都参加 datathons,这样可以提高您的数据科学技能。我们也意识到了领域重要性在数据科学领域的重要性。

维基百科是一个有价值的数据科学工具

原文:https://towardsdatascience.com/wikipedia-as-a-valuable-data-science-tool-6769991b43b7?source=collection_archive---------25-----------------------

参考书目

关于维基百科的 TDS 文章集

作者图片

几天前,我在编辑队列中偶然看到了由尼古拉·梅鲁索撰写的这篇文章,并立即被吸引住了——维基百科是世界上最大的公共信息平台,但我很少遇到使用这个平台进行各种分析、教程等的 TDS 文章。我试图找到并编辑 TDS 文章和教程,这些文章和教程将维基百科扩展为数据科学项目的宝贵资源和工具。

用维基百科推进自然语言处理

Melluso 的帖子很好地概述了如何使用维基百科来改进自然语言处理任务,如命名实体识别和主题建模。

“十多年来,维基百科一直被用作知识来源,并在各种应用中反复使用:文本注释、分类、索引、聚类、搜索和自动分类生成。事实上,维基百科的结构有许多有用的功能,使其成为这些应用的良好候选。”

他通过他的文本分类项目以及几个可视化的结果来扩展维基百科的优点。

维基百科中冠状病毒的语言-可视化

回到 2020 年 2 月, Felipe Hoffa 发表了这篇文章在维基百科中追踪新冠肺炎新闻的全球传播和趋势。这篇文章短小精悍,包含了视觉效果来补充他的分析。费利佩发现,普通话中的“冠状病毒”比任何其他语言都早 9 天开始流行,日语和韩语是最先赶上普通话的语言,意大利语、挪威语和波斯语的反弹力度最大。通过维基百科追踪新闻本身就很令人满意,但当考虑到涉及疫情在几天内接管世界的页面变化时,这尤其有趣。

维基百科数据科学:与世界上最大的百科全书合作

2018 年, Will Koehrsen 写了一篇关于与维基百科合作的更一般的文章,因为其庞大和扩张的性质可能会让许多人感到害怕。这篇文章为那些学习如何以编程方式下载所有英语维基百科的人提供了一个教程,以高效的方式解析数据,并行运行操作以充分利用我们的硬件,并设置和运行基准测试以找到高效的解决方案。Will 写道:“拥有大量数据是没有用的,除非我们能够理解它们,因此我们开发了一套方法来有效地处理我们项目所需信息的所有文章。

Python 的维基百科 API

Tanu N Prabhu 在 2020 年撰写了这篇文章简单概述了如何使用维基百科的 API 以及 GitHub 知识库。本文是访问和解析大量可用信息的简明基础教程。

🔥约塞米蒂国家公园的野火建模

原文:https://towardsdatascience.com/wildfire-modeling-in-yosemite-national-park-666f45c9a0a0?source=collection_archive---------21-----------------------

李晟Unsplash 上拍照

这篇文章将重点介绍我们在 Jupyter 笔记本中使用谷歌地球引擎 (GEE)、 geemap、 GeoPandasGRASS GIS 对野火事件建模的教程中最重要的部分。通过我们的教程,你可以在 2020 年夏季在美国加州约塞米蒂国家公园的三个区域进行火灾模拟(from 2020-06-20 through 2020-09-22)。它有三个主要部分:获取数据、导入数据和 Wildfire 模拟。

本教程源于Mario Gulich 高级空间研究所 组织的使用 GRASS GIS 软件进行地理空间数据处理和分析研讨会的最终工作,由 Veronica Andreo 博士授课。

我们教程的完整代码可以在:https://github.com/acoiman/wildfire_modeling找到

1.获取数据

获取模型所需的数据可能是一项艰巨的任务。有时,数据不容易获得,因为它们很少或分散在广泛的来源中。在本节中,我们将向您展示一种为 wildfire 建模目的轻松收集数据的方法。下表显示了本教程中使用的数据。

本教程假设您正在一个 Jupyter 笔记本和一个 Python 环境中工作,其中包含所有必需的包。您还需要安装最新版本的 GRASS GIS 并拥有一个有效的 GEE 帐户。我们的 Python 环境基于 Ubuntu 20.04 上的 Anaconda 安装。您需要安装以下不包含在 Anaconda 中的包:Geopandas、GEE Python API、eeconvert、geemap。

1.2 从 GEE 下载数据

我们将调用 WDPA 要素集合(FC)并提取约塞米蒂国家公园多边形。我们将把提取的 FC 转换为地理数据框架(GDF ),并将其作为 shapefile 保存到我们的工作目录中。

# get World Data Protected Areas (WDPA) FeatureCollection
pa = ee.FeatureCollection("WCMC/WDPA/current/polygons")# Yosemite National Park polygon
filter = ee.Filter.inList('NAME', ['Yosemite National Park'])
yosemite = pa.filter(filter)# transform Yosemite fc into gdf
yosGDF = eeconvert.fcToGdf(yosemite)# convert gdf into shp
yosGDF.to_file("gisdata/yosemite/shp/yosemite.shp")

作者照片

为了从 GEE 获得 100 小时的燃料湿度、风向和风速数据,我们首先需要调用 GRIDMET ImageCollection 并按日期过滤。其次,我们将创建一个矩形,用于裁剪数据。接下来,我们将选择所需的数据并计算模式。生成的图像将被裁剪为之前创建的多边形。之后,我们将创建 2000 个随机点,用于使用平均值对图像进行采样。最后,生成的 FC 将被转换为地理数据框架,并作为 shapefile 保存到我们的工作目录中。

# load GRIDMET ImageCollection
gridmet = ee.ImageCollection('IDAHO_EPSCOR/GRIDMET').filter(ee.Filter.date('2020-06-20', '2020-09-22'));# create a rectangle
coords = [-120.10157709250639,37.36645735913506,-118.99122199244081,38.31280791348237]
bbox = ee.Geometry.Rectangle(coords)# select 100-hour dead fuel moisture (fm100) and calculate the mode
fm100 = gridmet.select('fm100').mode()
# clip data to rectangle
fm100_clip =fm100.clip(bbox)# create 2000 random points
fm100_points = ee.FeatureCollection.randomPoints(bbox, 2000);
# sample points using the mean
samplefm100 = fm100_clip.reduceRegions(**{
  'collection':fm100_points,
  'reducer':ee.Reducer.mean(), 
  'scale': 4000, 
  });# transform fc into gdf
samplefm100GDF = eeconvert.fcToGdf(samplefm100)# convert gdf into shp
samplefm100GDF.to_file("gisdata/yosemite/shp/samplefm100.shp")

我们将通过调用 Landsat 8 Collection 1 Tier 1 32 天 EVI 合成图从 GEE 下载 [EVI](https://en.wikipedia.org/wiki/Enhanced_vegetation_index#:~:text=The enhanced vegetation index (EVI,a reduction in atmosphere influences.) 数据,使用 Yosemite FC 按日期和边界过滤。接下来,我们将计算一个平均图像,并使用之前创建的多边形对其进行裁剪。最后,剪辑后的图像将被导出到我们的 Google Drive 存储器中,然后我们将它下载到我们的工作目录中。

为了运行我们的火灾模拟,我们需要一个由美国农业部林务局定义的燃料模型。在这种情况下,我们将使用 https://landfire.cr.usgs.gov/fbfm13.php提供的 13 Anderson Fire Behavior 燃料模型。该模型有 13 类燃料,其负载、分布和颗粒大小各不相同(Petrasova 等人,2018 年)。

2.导入数据

现在,我们将继续导入从 GEE 和其他来源下载的数据。这一部分包括设置我们的 GRASS GIS 环境和导入数据本身。

当在 Jupyter 笔记本中设置 GRASS 时,我们使用 Python 来初始化 GRASS GIS。首先,我们创建一个 GRASS GIS 运行时环境,方法是传递一个变量 GRASS GIS“所在”的目录,并将其绑定到 Python 目录。接下来,我们导入 GRASS GIS 包。之后,我们设置默认字体显示和覆盖行为,以避免每次执行命令时添加`— overwrite '标志。

# create GRASS GIS runtime environment
gisbase = subprocess.check_output(["grass", "--config", "path"], text=True).strip() # directory where GRASS GIS lives
os.environ['GISBASE'] = gisbase
sys.path.append(os.path.join(gisbase, "etc", "python"))# import grass gis package
import grass.script as gs
import grass.script.setup as gsetup
from grass.pygrass.modules import Module
from grass import script
from grass.pygrass.modules.shortcuts import raster as r, vector as v, general as g, display as d
from grass.pygrass.modules import Module as run_command
import grass.imaging as imaging# default font displays
os.environ['GRASS_FONT'] = 'sans'# overwrite existing maps
os.environ['GRASS_OVERWRITE'] = '1'
gs.set_raise_on_error(True)
gs.set_capture_stderr(True)

我们之前需要使用 GUI 在 GRASS GIS 中创建一个位置来运行以下单元。在我们的例子中,我们创建了一个名为 yosemite_3310_2 的位置和一个名为 wf_mod_2 的地图集。

# set GRASS GIS session data
cfile = gsetup.init(gisbase, "grassdata", "yosemite_3310_2", "PERMANENT")# create a new maset inside yosemite_3310_2 location
g.mapset(flags='c', mapset='wf_mod_2', location='yosemite_3310_2')# set GRASS GIS session data
cfile = gsetup.init(gisbase, "grassdata", "yosemite_3310_2", "wf_mod_2");

2.2 加载数据

在这一小节中,我们将上传运行火灾模拟所需的所有数据集。

# import Yosemite National Park vector
script.run_command('v.import', input='gisdata/yosemite/shp/yosemite.shp',output='yosemite')# import evi raster
script.run_command('r.import', input='gisdata/yosemite/raster/evi.tif', output='evi',resolution='value', resolution_value=30.0)# import fm 100h samples
script.run_command('v.import', input='gisdata/yosemite/shp/samplefm100.shp',output='samplefm100')# import vs (wind velocity) samples
script.run_command('v.import', input='gisdata/yosemite/shp/samplevs.shp', output='samplevs')# import th (wind direction) samples
script.run_command('v.import', input='gisdata/yosemite/shp/sampleth.shp',output='sampleth')# import landsat image
script.run_command('r.import', input='gisdata/yosemite/raster/landsat/landsat.tif',output='landsat',resolution='value', resolution_value=30.0);

GRASS GIS 最大的特点之一是有一个不断增长的插件列表,可以很容易地安装在您本地的 GRASS GIS 中,并用于执行特定的分析。在我们的例子中,我们没有从 GEE 下载 DEM,而是使用了 模块。

r.in.nasadem user="my_nasa_user" password="my_nasa_pw" output=dem memory=2000 resolution=30

3.野火模拟

在我们的教程中,我们模拟了约塞米蒂国家公园三个地区的野火蔓延,见下图。我们将从每个区域的导入数据中获取新数据,模拟不同持续时间的火灾事件,并可视化野火传播。这篇文章只向你展示了我们如何在第三个研究区域模拟野火。

作者照片

3.1 研究区域 3

3 号研究区位于约塞米蒂国家公园的中东部。主要的可燃物类型是覆盖面积为 29.70%的封闭木材凋落物和覆盖面积为 21.67%的木材(草地和林下植被)。要了解更多关于燃料种类的信息,请点击这里。根据:USGS 国家土地覆盖数据库(Yang et al .,2018),该地区主要由常绿林(51%)、灌木/灌丛(34%)和草地/草本(5%)覆盖。

3.2 计算数据

野火事件建模分为两步。首先,我们执行 GRASS r.ros 模块,该模块生成扩展率(ros)栅格地图。其次,我们运行 GRASS r.spread 模块来模拟椭圆各向异性扩散。

由于我们假设有风且地形陡峭,r.ros 模块需要以下输入:

  • moisture_1h: 包含 1 小时燃油湿度(%)的光栅图。
  • moisture_live: 包含 live 燃料水分(%)的栅格地图。
    -
    速度:包含风速的栅格地图(英尺/分钟)。 -方向:包含风向(度)的栅格地图。 -坡度:包含坡度(度)的栅格地图。 -坡向:包含坡向度数的光栅地图。

为了完成这项工作,我们将创建并应用一个 Python 函数。

caldata('sa_2R', '_sa_2')

3.3 建模

现在,我们将为我们的研究区域 3 运行 r.ros 模块。

# generates rate of spread raster map
r.ros(model='fuel', moisture_1h='moisture_1h_sa_3', moisture_live='lfm_sa_3_scaled', velocity='wind_speed_sa_3', direction='wind_dir_sa_3', slope='slope_sa_3', aspect='aspect_sa_3',elevation='dem', base_ros='out_base_ros',max_ros='out_max_ros',direction_ros='out_dir_ros',spotting_distance='out_spotting');

接下来,我们将创建一个点栅格地图,它将被用作我们的火焰模拟的源。

# create a vector map from an ASCII points 
script.run_command('v.in.ascii',input='gisdata/yosemite/csv/source_3.txt',output='source_3', separator='comma')# rasterize vector map 
script.run_command('v.to.rast', input='source_3', output='source_3', type='point', use='cat');

通过 r.spread 模块,我们将模拟 32 小时的野火事件。我们的第一个模拟周期是 480 分钟(8 小时),因为当前模拟的初始时间是 0(默认值),我们的滞后是 480 分钟。请注意,我们使用“s”标志,因为我们正在考虑定位距离

# elliptically anisotropic spread simulation 8 hours source 3
r.spread(flags="s", base_ros='out_dir_ros', max_ros='out_max_ros',direction_ros='out_dir_ros', start='source_3',spotting_distance='out_spotting', wind_speed='wind_speed_sa_3', fuel_moisture='moisture_1h_sa_3', output='spread_8h_s3', lag=480)# elliptically anisotropic spread simulation 24 hours source 3
script.run_command('r.spread', flags='si', base_ros='out_dir_ros', max_ros='out_max_ros',direction_ros='out_dir_ros', start='spread_16h_s3',spotting_distance='out_spotting', wind_speed='wind_speed_sa_3',fuel_moisture='moisture_1h_sa_3', output='spread_24h_s3', lag=480, init_time=960);

执行 r.ros 和 r.spread 模块后,我们现在可以可视化我们的结果。在这种情况下,我们将使用 GRASS GIS 命令创建四个框架。每一帧将包含每个时间滞后的扩散栅格的速率、指示模拟源的矢量、Landsat 图像的 CIR(彩色红外)合成以及相应的标题、图例、比例和指北针。

# display monitor and save image file
d.mon(start='cairo', output='gisdata/yosemite/images/sa_3_frame.png', width=800, height=700)# remove all frames
d.frame(flags='e')# frame spread_8h_s3# create upper-left frame
d.frame(flags='c', frame='first', at=(50,100,0,50))# add raster map landsat cir
d.rast(map='landsat_cir_sa_3')# add raster map spread_8h_s3
d.rast(map='spread_8h_s3')# add vector map source_3
d.vect(map='source_3', size=25, icon='basic/pin_dot', color='green',legend_label='Source 3')# add title
d.text(text='Fire Spread 8h', bgcolor=('255:255:204'),color='black', size=6)# add north arrow
script.run_command('d.northarrow', flags='t', style='9',at=(85,85), fill_color=('0:0:0'),color='none')# add raster legend
script.run_command('d.legend', flags='sb', raster='spread_32h_s3_reclass',at=(5,60, 81, 83), title='Spread (%)', title_fontsize= 7, bgcolor=('255:255:204'), border_color='none')# add vector legend
script.run_command('d.legend.vect', flags='b', at=(7,15), symbol_size=10, fontsize=12,border_color='none', bgcolor=('255:255:204'))# add bar scale
script.run_command('d.barscale', bgcolor=('255:255:204'), at=(40,10), style='line',length=2, units='kilometers', width_scale=0.5)
...

作者照片

最后,我们将使用 GRASS GIS 图像包创建可视化的动画 gif 图像。

# create the animated gif with GRASS Python imaging package
imaging.images2gif.writeGifPillow('gisdata/yosemite/images/Animation_Sa_3_2.gif',images, duration=2, repeat=True)

作者照片

4.结论

本教程演示了我们可以将 GRASS GIS、Google Earth Engine 和 Jupyter Notebook 集成到一个独特的开发环境中。但是,为了将 GEE 和 Geopandas 对象传递到 GRASS GIS 模块中,还需要做更多的工作。

我们可以模拟受过去火灾事件影响的地区的野火,以比较模拟和真实的火灾。

火灾模拟的结果表明,输出栅格不会与非植被区域重叠。在我们的例子中,火灾模拟在大区域表现更好,因为我们的基本空间分辨率是 30 米,这适合于区域尺度的研究。

一如既往,欢迎任何与此相关的反馈!

5.参考

彼得拉索娃、哈蒙、佩特拉什、大不里士和米塔索娃(2018 年)。野火蔓延模拟。开源 GIS 的有形建模(第 155-163 页)。斯普林格,查姆。

杨、l、金、s、丹尼尔森、p、霍默、c、加斯、l、凯斯、a、科斯特洛、c、德维茨、j、弗莱、j、芬克、m、格兰内曼、b、里格、m 和 g .西安。2018,新一代美国国家土地覆盖数据库:需求、研究重点、设计和实施策略,第 108–123 页。

加拿大阿尔伯塔省的野火蔓延模拟:一个使用带有 ConvLSTM 细胞的神经网络的试验,一个纯数据驱动的模拟

原文:https://towardsdatascience.com/wildfire-spreading-modeling-in-alberta-canada-a-trial-using-a-neural-network-with-convlstm-cells-81c1a9f7d410?source=collection_archive---------26-----------------------

变更数据

使用深度学习从卫星数据理解和模拟森林野火传播的个人尝试。

作者图片

日期:最初发布于 2020 年 4 月 23 日,2021 年 6 月 24 日更新于[5]和迈向数据科学
作者:Bessam Mehenni
主题:使用具有 ConvLSTM 细胞的神经网络对森林野火蔓延进行建模。加拿大阿尔伯塔省。

我从关于麦克默里堡火灾序列的 MODIS 数据中创建的时间圈

作者提供的图片

1.介绍

这项研究是我在巴黎一所数据科学学校结束培训时选择的一个课题的一部分。目的是测试具有 ConvLSTM 层的 2D 空间模型预测森林火灾蔓延的能力。

这是一个探索性的研究,实现了从零开始的深度学习。读者需要注意的是,这项研究并不是基于对林火蔓延模拟技术的全面了解。作者也不了解森林火灾的规律。

我们设计的模型使用由卫星[1]收集并由我处理的热异常坐标序列来获得像素图像的外观。此外,有助于火蔓延的特征与每个像素相关联,并且被模型考虑在内。气象特征来自阿尔伯塔省的一个政府网站。

我们正在研究的火灾序列特别发生在加拿大的阿尔伯塔地区。它们是大火。四个火灾序列,包括 2016 年 5 月著名的麦克默里堡火灾和 2011 年 6 月的理查森火灾,将用于训练和测试模型。麦克默里堡大火已导致 8 万人流离失所,并需要动员 3000 名消防员。我们将两个火灾序列命名为“Richardson phase 2”和“Central Alberta ”,这些名称纯属虚构。

图 1a:空间和时间研究窗口|作者列表

数据来自三个不同的来源:

  • MODIS 卫星数据是从指定了空间和时间窗口的数据源[1]专门下载的。
  • 气象数据是专门从数据源[2]下载的。
  • 地形数据是从数据源手动读取的[3]。

2.方法

气象网站建立的网格主轴被用作开发更精细的表格数据网格的基础。我们开始进行一些人工读数,找出天气网格的坐标。

图 1b:气象网站的网格图[2]

然后,我们必须建立一个更精细的二级网格(我们选择 2km x 2km ),其中每个基本网格包含以下信息:根据 MODIS 记录、转置或插值的气象数据、现场的高程数据,是否有火灾。这个项目的主要困难在于数据的预处理。这是一个工匠的工作,很难概括:

  • 数据收集不是自动化的,甚至包括人工读数。
  • 预处理是为四个选定的火灾研究区域量身定制的。我们花了很多时间开发预处理程序。在执行过程中,预处理程序在夜间运行数小时,以便幸运地到达我们在 GitHub 上提供的最终数据集[5]。

准备工作完成后,我们开始可视化数据。当我们观察到每天几十公里的明显蔓延模式时,我们对森林火灾的偏见,即森林火灾以均匀的速度从近到远蔓延的想法,被颠覆了。气象站那几天的风力强度可以被描述为“正常”,这就对与风有关的主要原因的想法提出了质疑。这里事实上是火爆发的强度创造了大量的上升气流;这些气流携带白炽粒子,它们参与了火势的快速蔓延。

我们通过描述性模型 DBSCAN 研究了火团的演化。这项技术对理解传播非常有用。它包括从接近到接近地分配聚类点。

下一步是试图模拟火灾蔓延,以便预测它。我们尝试了使用 ConvLSTM 层的深度学习模型。A. Xavier 在[6]中说::它是一个递归层,就像 LSTM 一样,但是内部的矩阵乘数是用卷积运算交换的。使用 ConvLSTM 模拟火灾蔓延的尝试没有产生令人满意的结果。

流体力学研究人员已将无量纲变量引入经验关联式,其目的是模拟物理现象。尽管这一尝试失败了,但我们在这个项目中的进展让我们相信,一个纯粹的数据驱动模型在翻译如此复杂的传播现象时会有困难。我们认为,数据驱动模型依赖于一些无量纲的物理变量(比如弗劳德数)是有意义的。

3.数据预处理

该模型实际上允许两个图像和一个与连续两天的数据相对应的火灾影响特征的相关矩阵。输出是火灾位置的图像,是最后一个输入图像后 3 天的预测。

模型的每个输入样本是 5D 阵列(样本 _nb,nb _ 步骤,行,列,nb _ 特征),其中 nb _ 步骤是 2 天时间步长,行和列是行(这里是 45)和列(这里是 65)的数量,nb _ 特征是火灾影响特征的数量,这里是 9。这幅图像有 2925 个像素,每个像素代表一个 2 公里×2 公里的区域。

我们选择的影响特征有几种:

  • 气象:降水量(mm)、湿度(%)、地面接收的太阳辐射(MJ/m2)、累计平均风速(km/h)、风向()。
  • 地形:每个单元的高程。
  • 植被:累积降水量(mm)在一定程度上反映了植被的含水量。
  • 火特性:亮度。

在本研究的框架中,影响蔓延的人为因素被排除在外,特别是旨在控制火灾的灭火和预防措施(灭火、修剪植被区、浇水等)。).

风向是从考虑中的像素周围的两个或三个气象站的读数产生的量。它是通过反距离加权(IDW)插值法获得的。

不考虑空气温度因素,因为它是空气湿度的固有因素(见莫里尔图)。

起伏的斜率是传播的一个重要因素,没有明确地给模型。仅给出了小区的高度。他们来自源头[3]。

图 2:麦克默里堡遗址的地形图

不管正确与否,我们决定使用亮度,这是一个与卫星传感器测量光线位置相同的量。我们认为,红外辐射可能是火的温度的镜像,因此也是火的强度的镜像,研究表明它会影响白炽粒子的传播[4]。

从阿尔伯塔省的火灾中收集的数据表明了几种火灾蔓延的模式。其中一个现象的特点是巨大的表观射速,并被证明是非常毁灭性的。它负责每天几公里的火灾传播距离。这种现象会留下一大堆小火。

在加拿大、美国、澳大利亚,有时在一些南欧国家如葡萄牙也能观察到这种现象。解释是炽热的植物粒子(飞溅的火花)向前投射。它们参与了火焰锋的快速推进。这种火灾行为明显不同于其他更常规的行为,后者的表观火灾速度为每天几千米。

图 3a:加拿大亚伯达省麦克默里堡 DBS can(2016 年 5 月 4 日)获得的火灾群|图片由作者提供

图 3b:加拿大艾伯塔省麦克默里堡 DBS can(d+1 日:05–05–2016)获得的火灾群|图片由作者提供

图 3c:加拿大艾伯塔省麦克默里堡 DBS can(d+2 日:2016 年 5 月 6 日)获得的火灾群|图片由作者提供

我们通过应用描述性模型(DBSCAN)揭示了加拿大麦克默里堡火灾中的这一现象。2016 年 5 月这种现象发生的几天就导致了特大的火势蔓延。造成这种现象的物理因素很难确定。它们与大气中对流不稳定性的存在有关。火线的热功率也将密切决定白炽粒子覆盖的距离。

数据集按时间顺序分为两部分:38 天的训练样本(大约。56%或 111150 次观察)和 30 天验证样本(大约 44%或 87750 个观察值)。我们还预留了 9 天的测试样本。

4.神经网络的结构和相关参数

所提出的架构包括第一层 64 核 ConvLSTM,其核大小为(3×3),接着是最大池层(2×2 ),其执行子采样操作以降低特征图的维度,接着是维度展平和三个全连接层,每个层具有 128、128 和 2925 个神经元层。这些层链接到 ReLu 激活功能。使用 sigmoid 激活函数在最后一层的输出端进行单向分类,该函数计算火灾形态的概率(“1”)。

图 4:con vltm 单元的示意图[6]

为了减轻模型过拟合,引入了正则化技术,例如应用于某些层的 L2 正则化。一些层之后是 0.4 的退出率。选择了 Adam 梯度优化算法。该模型使用 Keras 库和 Tensorflow 作为 GPU 加速环境(Google Colab)中的后端。

5.分类结果

下图是测试样本的混淆矩阵和 ROC 曲线。可以看出,该模型正确预测了火灾中的 22 个像素。精度是 2.3%:该模型犯了很多错误,因为它预测了大量着火的像素,而实际上并没有着火。

图 5:测试样本的混淆矩阵(阈值=0.65) |作者图片

图 6:训练和测试样本 ROC 曲线

总体准确率得分为 90.0%。我们必须特别注意召回参数,因为不预测实际正在燃烧的燃烧像素是一个问题。在这里,我们希望看到尽可能高的召回率只有 14%。下图比较了测试样本在 9 天内的预测图像和实际图像。火灾概率阈值设置为 0.65。

图 7:测试样本的预测和实际图像|作者提供的图像

我们可以看到,预测是火灾的分散像素,而实际上火灾区域是聚集在一起的。

积极的一点是,在第 3 天,火灾活动加剧,模型预测遵循这一趋势。在第 6 天的观察是相同的,只是预测转移到了第 7 天。这种延迟可能与提前 3 天预测的不确定性有关。

相反,第 9 天显示火灾活动减少,这也是模型预测的结果。

训练图像中的卷积识别模式。火焰图案每天都在重复,伴随着图像中特定区域的突出显示。这些地区每天都在变化。当然,该模型还没有针对不同的案例进行充分的训练。我们的研究受制于有限的训练数据。在这个意义上,我们可以区分卷积的限制:训练图像在图像的左下角没有火区。这一特征可以在模型预测中找到,这有利于图像的这一部分没有火。

6.结论

我们的模型不能提供未来三天火灾蔓延模式的准确视图。这种限制的原因可能是卷积原理本身和/或用于其训练的有限数据量和/或基于我们给它的特征该模型不能理解的现象的复杂性。火灾数据来自持续时间和范围方面的重大火灾事件。似乎很难想象我们能从阿尔伯塔省大量收集更多的火灾数据。

尽管如此,我们的模型显示了根据天气和非天气条件跟踪火灾活动增加或减少的能力。应该指出的是,我们天真地让我们的模型负责建立对传播现象的理解。但是现象并不简单。它们是复杂多样的。例如,在 Fort McMurray 记录中,我们观察到,在两个不同的天中,在相似的条件下(气象站的风速、湿度等)。),发生了拮抗现象。在一个案例中,一天传播 5 公里。在另一种情况下,超过 50 公里的粒子跳跃传播。

我们可以说,我们选择的直接因素不足以解释这些现象。还涉及到与火和大气中空气的物理学有关的其他参数。

7.然后

研究调查了火灾和风况如何影响落到地面上的白炽植被颗粒的分布行为[4]。引入弗劳德无量纲变量,为火灾跳跃平均距离的计算提供规律。弗劳德数是流体力学模型中用来描述流态的参数。它代表了与流速相关的惯性力相对于浮力的相对重要性。在飞溅火花突然出现的情况下,存在的状态可能对应于由侧风控制的气流,也可能对应于由火焰强度控制的上升气流。计算跳火平均距离的公式已作为流态的函数提出[4]。

如果我们让一个模型更容易理解复杂的现象,它就能渴望表现。我认为预测火灾蔓延的最佳模型可能会处于深度学习(甚至强化学习)和物理建模之间的十字路口。除了已知的影响火势蔓延的直接因素(湿度、风速等)之外,还必须依靠。),物理建模中常用的解释现象的参数。弗劳德数就是其中之一。

8.参考

[1]https://firms.modaps.eosdis.nasa.gov/,2020 年 3 月 27 日

[2]http://www.agriculture.alberta.ca/acis/,2020 年 3 月 27 日

[3]https://earth.google.com/web/,2020 年 3 月 27 日

[4]尼古拉·萨尔多伊。燃料颗粒的运输和燃烧 (2007 年)。物理学。普罗旺斯大学艾克斯马赛第一分校,2007 年。法国人。电话 00289521v2

[5]https://github . com/bessammehenni/Forest _ wild fire _ spreading _ convLSTM

[6]来自 Neuronio 的 Alexandre Xavier,ConvLSTM 简介(2019 年 3 月 25 日),https://medium . com/neuro nio/An-introduction-to-convl STM-55c 9025563 a7

感谢阅读!下一个故事下次见。

posted @ 2024-10-16 09:06  绝不原创的飞龙  阅读(468)  评论(0)    收藏  举报