TowardsDataScience 博客中文翻译 2021(三百二十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

速率度量的贝叶斯 A/B 检验

原文:https://towardsdatascience.com/going-bayesian-testing-rate-metrics-82e872b79175?source=collection_archive---------20-----------------------

入门

如何在没有 p 值和置信区间的情况下运行速率度量的 A/B 测试?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

陈伶俐·桑特兰Unsplash 上拍摄

你是否曾经努力向非技术观众甚至你自己解释你的 Frequentist 测试结果(即零假设/替代假设、p 值和置信区间)?你希望在运行 A/B 测试后,你可以说“有 95%的可能性 A 组比 B 组有更好的点击率”,然后就完事了吗?如果是的话,那你就来对地方了,如果不是的话,我们有可爱狗狗的照片,所以你可能会想留下来。

你是一名狗玩具公司 WoofWoof 的数据科学家。营销部门想要开展一个新的数字广告活动,他们正试图决定是否应该在广告中使用柯基犬或哈巴狗的图片。很快,你建议运行一个 A/B 测试,向一组人展示带有 corgi 的版本,向另一组人展示带有 pug 的版本,看看哪一个在点击率方面做得更好。营销部门同意了这一点,于是你开始回忆如何实际分析数据。

我们将介绍运行 A/B 测试所需的理论和步骤,即贝叶斯方法。我们将用 Python 实现一切。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

布雷登·安德森在 Unsplash 上拍摄的照片

你需要贝叶斯定理

题目有点露馅了,但是你需要熟悉 贝叶斯定理 。贝叶斯定理为我们提供了一种方法来模拟在观察到新数据后,我们对某事物的先验信念是如何变化的。

Bayes Theorem
 P(A|B) = P(B|A) P(A) / P(B)where
 A, B: events in sample space
 P(A|B): conditional probability of A given B
 P(B|A): conditional probability of B given A
 P(A): probability of A
 P(B): probability of B

以上定义是针对离散变量,对于连续变量是针对概率密度函数定义的。

在我们的例子中,我们关心的是点击率,我们用𝜃.来表示我们将把我们关于𝜃的先验信念表示为𝜋(𝜃)——这是感兴趣参数的先验分布。接下来,运行实验后我们将观察数据,𝛸.似然函数 f(𝛸|𝜃)告诉我们,给定不同的𝜃.值,观察数据𝛸的可能性有多大我们真正关心的是𝜋(𝜃|𝛸),即𝜃.的后验分布这基本上说明了在考虑了我们观察到的数据和我们先前的信念之后,不同的𝜃值的可能性有多大。我们可以用贝叶斯定理得到𝜋(𝜃|𝛸)。

𝜋(𝜃|𝛸) = f(𝛸|𝜃)𝜋(𝜃) / f(𝛸) 
       ~ f(𝛸|𝜃)𝜋(𝜃)where
  f(𝛸): probability density of 𝛸 (can think of it as a normalising constant)

总的来说,我们有

posterior ~ likelihood x prior.

先验:贝塔分布

先验的意思是获取我们对点击率可能值的任何先验知识。如果你不知道,你可以选择一个无信息先验,例如,所有可能的值都是同样可能的。无论是哪种情况,有一点是肯定的:速率度量只能取 0 到 1 之间的值!因此,我们需要一个先验分布来反映这一点,比如 Beta 分布。

贝塔分布有两个参数可以使用,𝛼 >0 和𝛽>0(图 1 中的ab)。让我们看一些图,直观地了解它们如何影响密度函数的形状。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。不同参数值的贝塔分布。图片由作者提供。

您可能已经注意到了图 1 中的一个模式。分布的峰值在(𝛼-1)/(𝛼+𝛽-2)——这实际上是分布的模式。此外,𝛼和𝛽越大,模式周围的值就越集中(请看图 1 中的对角线)。

事实上,你可以认为𝛼-1 是成功的次数,𝛽-1 是失败的次数。那么,模式(𝛼-1)/(𝛼+𝛽-2)可以认为是successes / trials。因此,如果我们想要一个先验,给 0.5 左右的𝜃值更多的权重,就像我们做了一个实验,得到 20 个成功(点击)和 20 个失败(没有点击),我们可以选择𝛼=21 和𝛽=21.如果我们想要一个无信息的先验,我们可以选择𝛼=1 和𝛽=1——在这种情况下显然没有模式。

请记住,您的先验越强,即非常大的𝛼和𝛽,我们将需要从它那里转移更多的数据。

可能性:二项分布

可能性告诉我们,在给定不同的𝜃.值的情况下,观察到数据的可能性有多大,𝛸由于我们正在使用比率指标,这意味着我们有试用(我们的数字广告的印象)和成功(点击的广告),所以 二项式 分布非常适合。

提醒一下,当成功概率等于𝜃(通常成功概率表示为p)时,𝜃binomial(𝜈分布对𝜈试验中𝜅成功的概率进行建模。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。

后路:?

我们选择了贝塔分布作为我们的先验,二项分布作为我们的可能性。我们的后验可能是什么呢嗯…(你可能已经在想象可怕的数学计算了)。

原来我们的后验也是贝塔分布!当然,这不是意外。这种β-二项式先验似然组合经常被选择,因为它们是共轭先验。共轭先验仅仅意味着当你把它们结合起来时,后验分布与先验分布来自同一个分布族。

If
  Prior is Beta(𝛼, 𝛽)
  Likelihood is Binomial(𝜈, 𝜃)
Then
  Posterior is Beta(𝛼 + successes, 𝛽 + failures)
Where
  𝜈 = successes + failures

所以我们需要做的就是选择𝛼和𝛽作为我们的先验,运行我们的实验,收集数据,然后计算我们的后验概率,这也是一个参数为𝛼+successes,𝛽+failures.的贝塔分布轻松点。

我们的 A/B 测试计划是给两组相同的先验,然后使用 Bayes 定理计算它们的后验分布。一旦我们有了后验概率,我们就可以进行有趣的比较,找出并宣布赢家。

测试实现

我们感兴趣的是 A 组(柯基广告)在点击率(CTR)方面优于 B 组(哈巴狗广告)的概率,即

P(corgi CTR — pug CTR > margin)

其中margin可以是 0 或者其他我们关心的值。这基本上是在回答“柯基广告的点击率至少margin大于哈巴狗广告点击率的概率有多大”这个问题?

我们将通过对每组点击率的后验分布进行抽样来寻找答案。该过程如下:

Set N to some big number (e.g. 10000)
Set differences = []for i = 1 to N:
   a_sample = sample a value from group's A posterior
   b_sample = sample a value from group's B posterior
   a_b_diff = a_sample - b_sample store a_b_diff in differencesP(A - B > margin) ≈ % of values in differences that are greater than margin

在我们的实现中,我们将使用矢量化方法,而不是for循环,因为这样更快。

这可能看起来像很多代码,但大部分只是为了创造一些情节。第 23 行到第 35 行是重要的一行,在这里我们从后验抽样并计算差异的分布。

还有 另一种方式 你可以用后验来总结你的实验,这里我们还没有实现。它包括计算差异后验分布的最高密度区间(HDI) (最短区间,使得其中的值的概率等于x%)并检查它是否与实际等价的预定义的**区域****【ROPE】**重叠。例如,我们可以将 ROPE 定义为[-0.005,0.005],这意味着我们认为两组在该范围内的差异可以忽略不计。计算出差异的后验分布后,下一步就是计算 95%的 HDI(实际用多少百分比由你自己决定)。如果人类发展指数没有与我们的绳子相交,我们得出结论,这两个群体是不同的。

他们当中谁最可爱?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

弗洛伦西亚·波特Unsplash 上拍摄的照片

A/B 测试正在进行中,市场部已经要求你分析数据。

Corgi group
  Impressions: 9760
  Clicks: 3660Pug group
  Impressions: 9344
  Clicks: 3420

使用上一节中的代码,您可以简单地执行以下操作

GROUP_A = 'Corgi'
GROUP_B = 'Pug'ab_test = BetaBinomialTest(GROUP_A, GROUP_B)
ab_test.update_group_data(GROUP_A, successes=3660, trials=9760)
ab_test.update_group_data(GROUP_B, successes=3420, trials=9344)prob, differences = ab_test.compare(GROUP_A, GROUP_B, margin=0.0)

才能快速得到答案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左图:差异分布。右图:点击率的后验分布。图片由作者提供。

你回到市场部,让他们知道有大约 90%的可能性 corgi 版本比 pug 版本更好。在这一点上,他们可能会决定 90%就足够了,并与 corgies 合作,或者决定继续实验,以收集更多的数据,并变得更加确定。

其他指标呢?

如果你已经到了这一步,你可能想知道当你想使用贝叶斯 A/B 测试进行非速率度量时会发生什么。有更多的共轭先验分布对,因此可以很容易地使用。如果这些符合你的数据,那么你是幸运的——方法将与我们在本文中看到的非常相似。否则,您可能需要使用贝叶斯推理包,比如 PyStan ,来为您创建后验分布的近似值。

结论

在本文中,我们介绍了使用 Bayes 定理运行速率度量的 A/B 测试的理论。我们已经了解了如何在 Python 中实现测试,并且看到拥有组的后验分布允许我们计算不同问题的概率(不同的margin值)。

我们还得出结论,柯基犬比哈巴狗更可爱,这位作者有偏见(如果你没有注意到,这篇文章中没有哈巴狗的图片)。

更多来自同一作者。

https://medium.com/analytics-vidhya/calculating-using-monte-carlo-simulations-337cff638ac5 https://medium.com/analytics-vidhya/multi-armed-bandits-part-1-epsilon-greedy-algorithm-with-python-code-534b9e2abc9

参考

【1】【贝叶斯定理】维基百科。【在线】。可用:https://en.wikipedia.org/wiki/Bayes%27_theorem.【访问时间:2021 年 2 月 7 日】

【2】巴耶定理。【在线】。可用:http://Galton . uchicago . edu/~ ei chler/stat 24600/讲义/l06.pdf. 【访问时间:2021 年 2 月 7 日】

[3] A .金,“共轭先验解释”,,2020 年 1 月 16 日。【在线】。可用:https://towardsdatascience . com/conjugate-prior-explained-75957 DC 80 bfb。【访问日期:2021 年 2 月 13 日】

[4]约翰·克鲁施克。2010.做贝叶斯数据分析:R 和 bug 教程(第 1 期。由…编辑).美国学术出版社。

超越二进制

原文:https://towardsdatascience.com/going-beyond-binary-cdb70c18a4a4?source=collection_archive---------29-----------------------

了解量子计算的世界⚛

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由格特·奥特曼提供,来自 Pixabay

什么是量子计算?

让我们考虑一台经典的计算机,它的每一位都处于两种状态之一,T0 或 T1,通常被认为是 T2 或 T3。一个量子比特,更好的说法是一个 量子比特 ,相当于量子计算机。量子位具有一些非常独特和有趣的性质,这使得量子计算成为计算机中最有趣的领域之一。

叠加

与比特不同,量子比特可以处于10的状态,在之间的任何地方🤯!很疯狂,不是吗?这是由于被称为 叠加 的量子粒子的能力,其中这些粒子不是具有单个定义的状态,比如 1 或 0,而是具有成为10的*。*

当一个量子位处于叠加态时,测量它的值,然后 将量子位从它的无限可能状态 坍缩到众所周知的状态01。然后,它保持在该状态,直到复位。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MuonRay 来自博客

纠缠

可以说,量子计算最有趣的现象是两个或更多的量子比特能够成为相互纠缠的。**

在这样的系统中,任何一个纠缠粒子的状态都不能独立于其他粒子的量子状态来描述。这意味着无论您对一个粒子应用什么操作或过程,都会与其他粒子相关联。例如,如果你测量一个粒子并坍缩,那么其他粒子也会坍缩。

好吧,所以它们是基于概率的。但是我们能改变这些概率吗?

是啊!它遵循一个叫做 的量子干涉过程。

量子干涉

量子位元以这种或那种方式坍缩(即坍缩为 0 或 1)的可能性是由量子干涉决定的。干涉会影响一个量子位的状态,从而影响测量过程中某个结果的概率,而这个概率状态正是量子计算的强大之处。

所以我有点掌握它的窍门了…但是我实际上是如何编码的呢?我需要量子计算机吗?

一点也不!微软发布了一个 量子开发套件 (QDK) ,这是一套工具,允许我们在我们的桌面上模拟量子环境

量子环境中的编码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由路易斯·戈麦斯Pexels 拍摄

虽然我们通常需要下载 QDK 进行开发,但在 Jupyter 环境中测试是最容易的,微软为此专门发布了一个 IPython 内核。

虽然这里也解释了所有的 Jupyter 代码,但我鼓励你去 这个 DeepNote 项目 ,复制它并运行它,因为它包含额外的注释和代码练习。解决了这个问题,让我们开始吧。

QSharp 基础知识

在一篇文章中解释完整的 Q#语言超出了我的能力范围,但是,让我们看看一般的语法来了解这种语言。

在下面的代码块中,使用open命令,一些依赖项被导入到文件中。遵循的命名约定非常类似于 C#。

这些用于整个 Jupyter 笔记本

现在我们可以看看在 Q#中创建函数和变量的语法。在 Q#中,变量是不可变的,这意味着在初始化之后,它们不能被重新赋值,除非被指定为可变的。创建它们的语法类似于您在 javaScript 中看到的,使用了let关键字。

**let varName = varValue;**

注意,变量的数据类型不是在初始化时指定的,而是从给定的varValue中自动推断出来的。

可变变量(值可以改变的变量)可以使用mutable关键字初始化,并使用set关键字重新赋值。

**mutable varName = varValue;
set varName = anotherValue;**

另一个重要的 Q#特性是操作,它相当于其他语言中的函数。操作将特定的数据类型作为输入来返回输出。操作的语法是~

**operation OpName(input1: DType, input2: DType): ReturnDType {
    // body of the operation
    return retVal;
}**

注意,没有返回值的函数的ReturnDTypeUnit,相当于 C#或 C/C++中的void。要了解更多关于 Q#数据类型的信息,请查阅微软官方文档。

下面是一个基本 Hello World 操作的代码,使用 Q#中的[Message](https://docs.microsoft.com/en-us/qsharp/api/qsharp/microsoft.quantum.intrinsic.message)函数,它大致相当于 Python 中的print、C#中的Console.Write和 C++中的std::cout

由于 Q#是一种运行在量子计算机上的语言,执行操作的方式有点不同。我们不是直接执行,而是运行一个 IPYNB magic 命令— [%simulate](https://docs.microsoft.com/en-us/qsharp/api/iqsharp-magic/simulate),后跟模拟操作的名称。

该消息打印在标准输出中

Q#支持基本的数据类型IntFloat等等,以及它们上面的操作符。下面是 Q#中的一个基本加法函数。

为了模拟我们的操作,我们需要在操作名称后输入key=value格式的参数,如下所示。

3 + 5 = 8,对吗?

Q#中的量子测量

如上所述,量子位(更好的说法是量子位)是量子计算机的基本存储单位。这里有一个程序分配一个量子位并返回它的测量值。
返回 Q#中一个量子位的测量值的函数是 M 操作 [M(Qubit) => Result](https://docs.microsoft.com/en-us/qsharp/api/qsharp/microsoft.quantum.intrinsic.m),其中Result是一个内置的数据类型,它给出了OneZero

用于创建和测量量子位的代码

运行这个程序给了我们0的输出,因为量子位在分配后总是处于零的初始化状态。

初始化的量子位总是具有 0 的测量值

Q#中的叠加

叠加态是量子粒子的唯一状态,其值是无限概率的组合。
回想一下,在叠加态下测量一个量子位会将它折叠成两个二进制值中的一个。
一个特殊的量子比特门将一个量子粒子置于叠加态,在 Q#中,就是 H(哈达玛的简称) [H(Qubit) => Unit](https://docs.microsoft.com/en-us/qsharp/api/qsharp/microsoft.quantum.intrinsic.h)

注意,H 变换返回Unit,因为它只是就地改变量子位的状态。

随机数发生器

这意味着我们可以用量子位制造一个真随机数发生器(RNG) !这里面的步骤会是~

  • 分配量子位
  • 将量子位叠加
  • 测量量子位并返回其值。

请注意,为了能够重复使用,量子位需要在每次测量后重置。为此,我们使用测量和复位的组合操作,即[MResetZ](https://docs.microsoft.com/en-us/qsharp/api/qsharp/microsoft.quantum.measurement.mresetz)

此外,我还创建了一个助手函数RunNTimes,它将任意一个函数Unit => Result和一个数字n作为输入,并运行该函数 n 次。

用于创建一位数随机数生成器的代码

n = 100运行nQRNG,得到如下结果~

我们得到几乎等量的 1 和 0,证实了随机性

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由安娜·阿兰特斯派克斯拍摄

我们完了!本教程的目的是以一种不需要任何数学资格的方式唤起人们对量子计算的兴趣,此外还为读者提供了使用 Q#和 QDK 迈出量子计算第一步的工具。如果你还没有 我真的鼓励你 看看这里的 Jupyter 笔记本 因为那会给你一些 Q#的实践经验。

为了继续你的量子计算专业知识之旅,我鼓励你查阅微软文档中的以下资源。

学习数学的工具

此外,量子卡式是开始 Q#和量子计算之旅的绝佳方式。

你可以通过 LinkedinEmailGithub 联系我!

我希望你喜欢这个教程,并拥有美好的一天!

用决策智能超越数据科学

原文:https://towardsdatascience.com/going-beyond-data-science-with-decision-intelligence-88e5ff08cb34?source=collection_archive---------31-----------------------

决策智能是数据科学家在构建道德人工智能系统时需要的技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

布鲁克·拉克在 Unsplash 拍摄的照片

回到 2018 年 3 月,谷歌在任命了他们有史以来第一位首席决策科学家 Cassie Kozyrkov 。首席决策科学家的职责之一是对谷歌的许多员工进行决策智能培训,随着人工智能系统成为谷歌商业模式的一个更加突出的特征,这一系列技能变得越来越重要。在本文中,我想简要概述一下决策智能,以及我认为随着决策智能被更广泛地采用,数据科学家的角色将如何演变。

什么是决策智能

决策智能是一门新的学科,当使用数据实现系统时,它是关于做出好的决策的。有了人工智能系统,决策智能将引导数据科学家询问某个特定的数据是否应该包含在训练数据集中,或者另一个数据是否应该排除在外。这个决定将如何影响模型在现实世界中的表现?数据科学是决策智能的一半,因为我们必须处理数据并建立机器学习模型。后半部分涉及社会和决策科学。社会科学家在做出正确决策方面训练有素,而数据科学家目前却没有。决策智能的目的是确保人类在构建人工智能模型时做出的决策具有预期的结果。随着谷歌的业务越来越依赖机器学习算法,谷歌帮助推广了这一学科。

做出更好的决策

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由布伦丹·丘奇Unsplash 上拍摄

这个概念在人工智能系统中非常重要,因为糟糕的决策是机器学习模型中偏差的主要因素。在最近的一篇帖子中,我讨论了亚马逊性别偏见的人工智能招聘模式。

简而言之,亚马逊的目标是建立一个人工智能系统来自动化他们的一个招聘流程。这位模特显然是根据 10 年前的简历训练出来的,其中大部分是男性求职者。结果是,尽管女性候选人完全合格,但该模式仍然歧视女性候选人。一旦这一点变得明显,亚马逊最终取消了该系统。如果建造这种人工智能的工程师受过决策智能训练,这种性别歧视模型可能永远不会被编程。受过社会和决策科学培训的数据科学家可能会发现,训练数据会导致模型在任务中做出错误的决策。这个例子说明了设计好的人工智能系统需要社会科学家的意见,或者受过社会科学训练的数据科学家——决策智能数据科学家!

数据科学家的未来

谷歌清楚地认识到这些技能对他们的员工和业务有多么重要。他们发明了一种新的领导职位,让他们的工程师在决策智能方面更有能力。 Cassie Kozyrkov 已经培训了超过 17000 名谷歌员工,帮助他们在数据科学领域做出更好的决策。因此,我认为数据科学家的角色将在未来几年内演变为包括决策智能方面的培训。我可以想象越来越多的组织需要为他们的数据科学家职位提供决策智能培训的证据。最终,我可以看到一个新的角色被创造出来。这将是一个在数据科学学科和导致良好决策的社会因素方面训练有素的人。我建议我们称这个新的专业人士为决策科学家。我不认为数据科学家的职位会有任何发展,因为将社会科学家加入数据科学家团队会产生与决策科学家团队相同的影响。问题是,当组织可以拥有一个同时具备这两种技能的人时,为什么还要为两个专业人士买单呢?我最初的印象是,决策智能是领导团队的技能,但人工智能巨头谷歌显然认为这些技能应该教给每个人。

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由米切尔罗Unsplash 上拍摄

谷歌正在以决策智能的新学科引领数据科学家的进化。目标是建立能够做出正确决策的人工智能系统。决策智能可能会在解决人工智能系统中出现的偏见方面发挥重要作用。随着数据科学家对他们模型中使用的数据提出问题,并在系统建立之前识别设计中的缺陷,这种情况将会发生。我将引用首席决策科学家 Cassie Kozyrkov 的话,来讨论什么是决策智能。

“…数据科学家被教导如何分析调查数据,如何仔细思考大量的数学问题,如何处理如果数据是连续的,如果数据是分类的,会发生什么。[……]但是他们没有学到的,不是直接在培训中学到的,是如何构建调查?你如何确保调查最大限度地减少,比如说,回答偏差,也就是用户或参与者对你撒谎,给你错误的答案?因此,如果数据科学家希望他们的工作有用,那么有人,不管是他们自己还是队友,只要有能力深入思考这些东西,就必须参与进来。”

超越 ML 系统的简单误差分析

原文:https://towardsdatascience.com/going-beyond-simple-error-analysis-of-ml-systems-9218f9602d33?source=collection_archive---------41-----------------------

行业笔记

在部署机器学习算法时,赌注比任何玩具问题或竞争都要高得多。

原载于 2021 年 7 月 26 日https://alexandruburlacu . github . io

首先,有一个故事…

想象你自己是一名 ML 工程师…非常酷,我的朋友!

首先恭喜你,拍拍自己的背,你的家人一定很骄傲。

第二,根据公司规模、文化和机器学习团队的成熟度,你很可能会在许多计算机科学和软件工程领域中漫游。

再次,拍拍自己的背。现在,让我们进入正题。

作为 MLE,你的部分工作是挑选、调整和部署 ML 模型。我相信我不需要向你解释这不是那么微不足道的。你一定相信这个过程的难点是调模型吧?或者可能是算法的部署?虽然这些确实很重要,尤其是后一个,但这里有个问题给你:

您如何确保生产出高质量的模型?

如果你要告诉我,你刚刚在一个保留的数据集上测试了你的模型,你选择的度量标准是精度或均方差之类的东西,那就运行吧。很快。很远。如果你没有跑,准备好被质疑你是否:

  • 有一个基线,
  • 平衡数据集或调整指标,
  • 使用保留的数据集进行调整/超参数搜索…等等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这么多问题……制作人:imgflip.com

我想你现在已经明白,简单的训练/测试分割和一些误差指标,比如准确度或者甚至 F1*,都不足以回答问题。但是什么样的才够呢?嗯,视情况而定,就像软件工程中的所有事情一样。您需要理解,将您的模型特征减少到只有一个或几个标量将会丢失太多关于模型的信息。

*F1 成绩是更好的选择,btw

…然后是至理名言

*更像个人战争故事

免责声明,这是一个很长的帖子,所以也许泡些茶/咖啡,吃点零食,你知道,一些帮助你度过整个事情的东西。也许记笔记会帮助你保持专注。在阅读大量的技术文本时,它无疑会对我有所帮助。

另一个小小的免责声明:我有一个与这个主题无关的旧帖子,但是它的焦点是可解释性/可解释性方法。在这篇博客文章中,我更多地关注如何评估机器学习模型的错误。如果你认为这些主题彼此非常接近,有些重叠,你是对的。为了更好地评估一个模型,我们有时需要理解它进行预测的“推理”。

请记住——根据您应用机器学习的领域,一个不合格的模型可以是任何东西,从您的用户的一点烦恼到放大偏见并使您的客户逃离您的企业的完整垃圾箱火灾。虽然上述用户可能很容易选择退出前者,但后者可能会毁了你的业务。我们不想那样。你的雇主肯定不知道。

好的,收到。但是你怎么知道一个机器学习模型是好的呢?需要了解它的预测吗?你的用例中有你最关心的特定用户群吗?这些问题可以帮助您获得一个评估策略,从而确保在您部署一个 ML 模型之后不会出现任何问题。

你知道吗,让我先定义几个 ML 评估成熟度等级。对我来说解释起来更容易,对你来说也更容易理解。现在,不要为一些更高级的术语的含义而烦恼,我将在本节之后解释它们。

  • 0 级(L0) :有一个训练+测试分割和一两个通用指标,比如 MSE 或准确性。在这个层次上,不建议部署 ML 模型(最好理解为:不负责任)。
  • 第 1 级(L1) :前一级,但是如果可能的话使用交叉验证,或者最坏的情况,有一个大而多样的测试集。对于分类问题,您需要每个类的度量,对于回归问题,您需要多个度量。对于分类用例,ROC-AUC 得分或 F1 得分等指标比准确性好得多,因此使用这些指标。此外,了解您的模型的精度和召回特性对于成功的 ML 产品至关重要。在回归的情况下,MAPE+RMSE+调整后的 R 是一个很好的组合,你也可以考虑用 AIC 和/或 BIC 。对于回归,尝试至少有一个对异常值稳健的度量标准( MAPE 对某些类型的异常值稳健,但对其他类型的异常值不稳健)。
  • Level 1.1 (L1.1) :检查大多数错误预测,即预测可信度高,但预测错误的条目。它可以帮助你发现错误模式,甚至可能是偏见。
  • 第 2 级(L2) :使用反事实和输入值随机变化的扰动分析。通常,这种方法允许理解每个条目的特性重要性,但这更像是您必须努力才能获得的额外收获。
  • 2.1 级(l 2.1):ICE/PDP/ALE图可用于更好地理解特性重要性。请记住,这些对计算能力的要求相当高。
  • 2.2 级(L2.2) :在批准部署模型之前,替代局部解释(通常是石灰)和/或附加特征解释(即 SHAP)以理解模型预测。也需要大量计算。
  • 三级(L3) :基于群组的模型检验。定义群组的一种方法是通过流形式的错误分组。在这个层次上,重要的是要认识到数据分布的变化,如果适用的话,要对不同时期的数据进行评估。请相信我,有时特性和/或标签分布会发生变化,即使在您不希望它们发生变化的领域。不考虑这一点会让你感到头疼。
  • (可选)第四级(L4) :对抗性实例检查。像主播和 TCAV 这样的东西也在这个水平。原则上,任何其他高级的模型可解释性/可解释性或安全审计都在这个级别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异能等级。不要做 L0。制造厂商:imgflip.com

当在测试版中发布一个模型时,你会希望处于第 1 级,当它处于生产阶段时,你会希望处于第 2 级,然后从第 2 级发展到第 3 级。级别 4 更具体,并不是每个用例都需要它。也许你正在内部使用你的 ML 算法,一些恶意代理试图欺骗你的风险很低,在这种情况下,我怀疑你需要检查你的模型的行为,但使用你自己的判断。

注意,虽然我提到了回归用例,但是我省略了很多关于时间序列预测的信息。这是故意这样做的,因为这个话题很大,而且这个帖子已经读了很久了。但是如果你对这里发生的事情有一个基本的了解,你可以把不同的时间序列分析工具映射到这些层次上。

方法

让我们粗略地将评估/错误分析方法分为三大类:(1)度量,(2)分组,和(3)解释。度量是显而易见的。分组可能是最抽象的。我们把训练/测试分割、交叉验证、输入数据群组和错误分组放在这里…哦,上帝…组(没有双关的意思)。最后,在解释的保护伞下,还有诸如代理本地解释、特征重要性,甚至分析最错误的预测等等。

韵律学

我不会深入探讨基于指标的评估,但会提到,根据您的用例,您可能希望考虑与预测错误程度相关的非线性指标。也许你可以接受一点错误,但是如果模型是非常错误的,或者经常错误,你会想要更多的惩罚它。或者,相反,随着错误预测的增多,或者模型的总损失不断增加,您希望您的指标具有类似于对数的行为,即随着模型错误的增多,指标将减弱其增长。

此外,关于对异常值稳健的度量,如果您事先做了一些异常值消除,有时这些是很好的。或者可能有必要,在你不能或者特别是不去除异常值的情况下,不管出于什么原因。记住这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

离群值对模型拟合度的影响。来源:https://scikit-image.org

通常,在生产场景中,您会想要在不同的群组上评估您的模型性能,甚至可能基于这些群组来使用不同的模型。群组是指一组实体,具有特定的分组标准,如年龄段,或基于位置,或其他。

分组

我在上一段提到了群组,所以继续跟进是有意义的。团队很重要,因为你的利益相关者对这些感兴趣,有时你也是,但是企业通常是团队的头号“粉丝”。为什么?嗯,可能有很多原因。也许他们对为特殊的客户群体提供一流的服务特别感兴趣,或者也许他们必须遵守一些法规,这些法规要求他们为所有用户提供特定级别的性能。

此外,如果是真实世界的数据,您的数据集肯定是有偏差的。也就是说,对于每个类别/类别组,您将会有代表性不足的类别、各种不平衡,甚至不同的要素分布。例如,对于任何企业来说,给北美地区以外的用户提供低于标准的推荐,或者预测某个有色人种是某种类人猿是不合适的。

我们需要根据一些特征创建群组,并跟踪我们的机器学习系统在这些方面的表现。通常你会发现,那些意识到自己团队的团队会为不同的用户群部署不同的模型,以确保为每个人提供高质量的服务。

但是分组不仅仅是基于输入数据特征的群组。有时对于模型分析来说,根据错误创建分组是有意义的。根据误差分布进行某种分组。也许对于某些输入,你的模型给出的误差很低,对于其他输入,误差很高,而对于另一组,误差分布完全不同。为了发现和理解这些,你可以使用 K-Means 来聚集你的损失,并找出你的模型失败或表现不佳的原因。这就是优步的流形所做的,这真是太棒了!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传**外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(上)3 组误差分布,以及 2 个模型之间的比较。(底部)一旦我们有了错误组,我们就想知道为什么会发生这些错误。可视化这两个集群之间的特征分布差异会有所帮助。
来源:作者。灵感来源:http://manifold.mlvis.io/

最后,分组也是关于你如何将你的数据安排到训练和测试分割中。或者更多的分割,比如模型训练过程中的评估。这些有助于注意模型何时开始过度拟合或其他情况。请记住,在进行超参数搜索时应特别小心。对于快速训练的模型,一种叫做嵌套交叉验证的技术是一种非常好的方法,可以确保模型真的很好。嵌套部分是必要的,因为进行超参数优化(HPO)时,您是在评估集上进行优化,所以至少可以说您的结果是“乐观的”。进行额外的分割可以让你对最终模型有一个更公正的评估。慢模式呢?哦,博伊。试着拥有一个足够大的数据集,这样你就可以在所有的评估/测试阶段进行大的划分。你也没有这个?你听说过人工智能的需求层次吗?

此外,一个经常被忽视的问题是数据集的目标分布。它可能严重不平衡,因此,在对其进行训练/验证/测试分割取样时,应特别小心。这就是为什么你应该总是寻找一种方法让你的分割分层*(见 scikit-learn 的StratifiedKFold,还有train_test_split有一个stratify=参数,对于多输出数据集检查multioutput_crossvalidation包)。当数据集不平衡时,你可以尝试做一些过采样,比如 la SMOTE 或 ADASYN,但根据我的经验,这可能并不总是有效,所以只需实验(这是一个类似 scikit-learn 的库[imbalanced-learn](https://imbalanced-learn.org/stable/index.html))。*

解释

免责声明#2,这篇博文的这一部分可能是最令人震惊的部分之一。关于 ML 可解释性/可解释性有相当多的文献,我将只简要地提到一些方法,为了更深入的概述,请查看 Christoph Molnar 的 【可解释机器学习】

这个类别非常抽象,有些人可能会认为这些与模型评估没有真正的联系,而是 ML 可解释性/可解释性。我说这些方法可以揭露隐藏的错误和偏见。基于这些,现在你可以选择一个模型而不是另一个,因此解释对于评估是有用的。这些工具在识别“正确答案—错误方法”场景方面表现出色,这些场景将在没有任何问题指标和分组的情况下通过。

那么,关于一个模型,你能“解读”出哪些可以帮助你评估它的东西呢?首先,如果您的模型/API 允许,您可以检查特性的重要性。您可能会发现一个模型对一些模糊的特性或者没有意义的特性给予了过多的关注。此时,你应该成为一名侦探,并找出为什么会这样。这种特征重要性被称为 全局特征重要性 ,因为它是在模型级别从所有训练数据中推断出来的。

接下来容易做的是 扰动分析 ,其中有多个类别。扰动分析意味着改变输入,看看会发生什么。我们可以出于不同的目的改变输入,以评估模型的不同方面。

  • 反事实,又名“如果我改变这一个特征,我的模型预测会如何改变?”。例如,我们可以检查模型对变化的敏感程度,原则上这些变化会直观地改变预测。一个突出的工具是 Tensorboard 的假设工具。
  • 对立的例子,又名“我能创建这样的输入吗,虽然与正常输入相似,但会导致混乱的预测”。检查这些对于面向外部用户的系统来说通常很重要,在这些系统中,攻击可能会产生非常恶劣的后果,而且因为这种验证更加具体,所以通常会留到项目的后期进行。
  • 为了评估模型对不重要的变化有多稳健,或者它捕捉“常识性”有多好,随机改变也可以用于局部特征重要性。在情感分析问题的情况下,一个随机的改变可能是用同义词替换没有积极或消极语义的词,也就是中性词。
  • 非分布数据。好吧,这不是真正的扰动分析,但有时你想确保模型可以推广到相似但不完全相似的数据。或者你可能只是想让在工作中找点乐子,然后把德语句子传给一个在西班牙语文本上训练过的情感分析模型。

另一种帮助您发现错误模式的方法是检查模型可信度非常高的错误预测。简单来说,皇家混蛋。我学这个方法比较晚,是从 Goodfellow 等人的深度学习书上学的,我很懒,这个方法虽然事后看来很明显,但对我来说是新的。我更喜欢做扰动分析,这样就不需要漂亮的打印和/或绘图了。但是当我在做我的研究项目时,我现在“强迫”我自己(其实也没那么糟糕)也做这一步。

我建议定义一些由以前有问题的输入例子组成的回归测试套件。这有助于确保 ML 模型的未来版本确实是对以前版本的改进。在它可以检查以前错误分类的条目或使用不同类型的扰动分析的例子。稍后,您将会感谢这个回归套件。

替代本地解释,其中最突出的工具是石灰,是另一种可解释性工具。代理本地解释试图用简单的机器学习模型来逼近复杂的机器学习模型,但仅针对输入数据的子集,或者可能仅针对单个实例。

最后(现在是肯定的),另一个值得注意的 ML 可解释性方法是附加特征解释,对于这一类别,最突出的工具之一是 SHAP。SHAP 尤其有趣,尽管更难理解,因为它基于博弈论,并使用匀称的值来定义局部特征的重要性。这种方法的一个问题是 Shapely 值或几乎任何其他附加特征解释方法都没有考虑特征交互,这可能是一个交易破坏者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SHAP 用沙普利值来解释每个特征值对预测的影响。来源:作者。

还有更先进的工具,专门针对神经网络进行调整。这些使用不同形式的显著性或激活图。像这样的工具很酷,也很有用,但是很难使用,而且不够通用。试图涵盖其中的一个子集将需要一整本书,所以如果你感兴趣,你知道该怎么做;).在这本书里,你可以找到更多关于现代工具的详细解释,比如 SHAP、莱姆、锚,还有更经典的方法,比如 PDP、ICE 和 ALE 图。甚至像 Tensorflow 的 TCAV 工具这样的概念识别方法。

要记住的一点是,可解释性工具对于正确的模型评估是至关重要的。虽然不是直接的映射,但是您可以将这些解释方法用于像代码评审这样的模型。在生产系统中,你不会在没有代码审查的情况下合并代码,不是吗?

个人推荐

我们已经接近这篇文章的结尾了,所以我想给你一些建议,告诉你当评估 ML 模型时,如果那些成熟度级别还不够的话,该如何进行。这些建议更低级、更实用,如果你愿意的话,还有些问题。

  • 当然,从几个合适的评估指标开始。不要只用一个。如果可以的话,交叉验证。如果做 HPO,有两个测试分裂。对于分类,我会推荐至少一些损失和一些得分函数+ scikit-learn 的classification_report,如果你没有大量的类,混淆矩阵是你的朋友。有些人使用 AUC 和精确召回曲线,这很好,但我不习惯这些。也许在这篇博文之后,我会开始使用它们。(照我说的做,不要照我做的做)
  • 在这之后,我通常做扰动分析(随机和反事实)。寻找前 k 个最错误的预测是有帮助的,但我很少这样做(照我说的做,不照我做,#2)。
  • 如果我还不满意,我肯定会检查错误组,比如流形和/或代理本地解释(类似于 LIME,我主要使用eli5包)。我不喜欢后一种方法,因为这需要花费大量的时间,尤其是对于较大的输入。关于代理模型的局部解释,有时我发现使用缺省值来调整代理可能太简单了。我做 NLP,所以这两点对我来说都是一个真正的问题。

有时,尤其是在开发的早期阶段,我可以对模型预测进行一种“探索性测试”,即输入非分布数据,看看会发生什么。

对于个人实验,我有时可以使用 SHAP,但我发现它有点令人沮丧,很难导出图形,而且它在 Jupyter 上工作时效果最好。此外,它很慢,但这是所有代理解释的普遍问题。

我还没有玩转锚、对立的例子,以及做类似“找到与不同类最相似的条目”或“找到与这个类最相似的条目”的事情。后两者可以在特征、嵌入和/或预测空间中使用 kNN 来完成。微软数据科学家似乎在问这类问题来评估他们的模型。**

最后,我确信这些信息会让你不知所措。这就是为什么我能给出的最好的建议是使用一个简单的模型,一个容易理解的模型。为了提高性能,你也可以尝试在有意义的特性上投入时间。总而言之,做你的公司需要你成为的数据科学家就好,而不是你想成为的那种。无聊理性战胜炒作驱动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

明智地选择你的英雄。制造商:imgflip.com

可能这个帖子,没有其他的,帮助我结晶了很多多年来获得的隐性知识。也许你听过这句名言——“一个人教,两个人学”,我相信这里也发生过类似的事情。

我知道我的帖子通常又长又密,对不起,我想,但另一方面,现在你不必书签 5-10 页,只需这一页😀😀😀jk。无论如何,感谢你坚持不懈地阅读这篇文章,如果你想留下一些反馈或只是有一个问题,请留下评论。估计要过一段时间才能下次了。

 *vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
> Until then, you can play around                                 <
> with most of the methods described in this blog post            <
> by checking the link below                                      <
> [https://github.com/AlexandruBurlacu/error_analysis_code_samples](https://github.com/AlexandruBurlacu/error_analysis_code_samples) <
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*

你也可以点击这里。所有的例子都是种子,所以应该可以重现一切。玩得开心。

承认

特别感谢 @dgaponcic 的风格检查和内容审核,再次感谢 @anisoara_ionela 的彻底语法检查,感谢 @dianaartiom 对 ML 的最后一点反馈。你们都是最棒的❤

几个参考

Github repos,其中也包含各自论文的链接:

利用 MS2DeepScore 超越光谱相似性

原文:https://towardsdatascience.com/going-beyond-spectral-similarity-with-ms2deepscore-ef0f923428e6?source=collection_archive---------36-----------------------

使用深度学习模型直接从 MS/MS 谱图预测结构相似性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

光谱相似性得分通常被用作结构相似性的代表。但是在很多情况下,两者有很大的不同。这可能会对库比较的结果产生疑问。Florian 和他的团队建立了一个深度学习模型,成功地直接从串联质谱预测了结构相似性。

光谱比较是每个代谢组学工作流程的一部分

将质谱测量结果与库测量结果进行比较是任何代谢组学分析流程中的关键步骤。你需要可靠的光谱比较,

  • 识别您的化合物:在参考库中搜索与您的碎片模式相匹配的化合物。
  • 寻找类似物:通过相似的裂解模式寻找结构相关的化合物。
  • 帮助结构解析:将你的分子与一个分子类别联系起来,以缩小潜在的分配范围。

对于串联质谱,通常通过计算它们之间的余弦值来比较质谱。高余弦值表明两种化合物的裂解曲线重叠良好。

你可能认为高余弦值与高结构相似性相关。不幸的是,余弦分数只能告诉你光谱的相似度。但是当你想要注释你的化合物时,你会对结构相似感兴趣。这是一个至关重要的区别。****

光谱和结构的相似性:苹果和橘子

让我们来看看不同之处:

  1. 光谱相似度,例如余弦相似度,测量两个质谱图之间的重叠。
  2. 结构相似度,与 Tanimoto 评分一样,使用分子结构的 2D 向量表示法来量化两个分子指纹的重叠。

光谱相似性可能与结构相似性显著不同。这可能会让你从图书馆搜索中得出错误的结论。让我们看看这会对你的工作产生怎样的影响。

以抗生素达托霉素(上图)和一种假设的类似物(下图)为例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

达托霉素(上图)和它的类似物(下图)改变了裂解模式,尽管总体上彼此非常相似。余弦分数比较将给出较低的分数,并且不能检测出它们是高度相似的结构。

  • **高结构相似性:**类似物(下图)的结构仍与其未修饰形式达托霉素(上图)高度相似。
  • **低光谱相似性:**类似物中的修饰携带到许多碎片中,并使许多质谱峰发生位移。结果,几乎没有重叠的峰保留下来,因此光谱相似性得分较低。

这意味着,如果你的样品中含有达托霉素类似物,你将不会从文库或类似物搜索中找到,即使你在文库中有达托霉素参比光谱!

这意味着如果你仅仅依靠余弦相似性,

  • 你不能确定余弦值最高的匹配真的是最好的结构匹配。
  • 您的库可能包含相近的结构匹配,但您看不到它,因为匹配的光谱相似性得分非常低。

然而,Florian Huber 和他的团队找到了一种直接从串联质谱预测结构相似性的方法。

MS2DeepScore 如何从串联质谱预测结构相似性

MS2DeepScore 可以预测化合物何时是密切相关的结构类似物,即使其他比较方法,如余弦相似性,可能会失败。

Florian Huber 和他的团队使用来自 15,000 多种独特化合物的 100,000 多种光谱训练了 MS2DeepScore。一旦经过训练,MS2DeepScore 模型就可以直接从两种化合物各自的 MS/MS 图谱中预测它们之间的 Tanimoto 相似性得分。

使用它所学到的知识,MS2DeepScore 在关联结构相似的化合物方面始终优于余弦相似度和 Spec2Vec,即使当化合物的碎片图谱发生变化时。重要的是,用于比较得分准确性的化合物不包括在 MS2DeepScore 训练数据集中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MS2DeepScore 在精度与召回率方面优于余弦得分和 Spec2Vec。来源:作者

在我们的实施例中,达托霉素和类似物之间的余弦值仅为 0.24。由此,我们可以假设这些化合物在结构上并不紧密。但 MS2DeepScore 模型预测的谷本得分为 0.95,非常接近实际的谷本得分 0.98。

使用 MS2DeepScore

开始使用 MS2DeepScore 很简单,您可以在几分钟内开始用它比较光谱。

无论用什么乐器采集,都可以使用 MS2DeepScore。MS2DeepScore 与 matchms 模块一起工作,因此您可以选择几个开源数据类型,如。mgf,。mzxml 和. mzml。

Florian 和他的团队将 MS2DeepScore 设计成一个包含 Jupyter 笔记本教程的 python 包来帮助您入门。你可以使用模型开始比较你的光谱,该模型已经在的 15,000 种化合物的 109,000 个光谱上进行了预训练。要了解更多关于 MS2DeepScore 及其开发的信息,请务必查看预印本出版物

MS2DeepScore 的下一步是什么?

我们正在构建利用 MS2DeepScore 进行库匹配的新方法,包括一个 API、一个易于使用的界面和持续更新的模型。

这个新版本将提供,

  • 在超过 230,000 个光谱上训练的新模型;
  • 图书馆与 GNPS 公共数据库的匹配;
  • 一种新的否定模式比较。

如果您想试用它,请不要犹豫联系我们获得测试版访问。

超越 value_counts():只用 3 行代码创建视觉上引人入胜的频率表(使用 OkCupid 数据)

原文:https://towardsdatascience.com/going-beyond-value-counts-creating-visually-engaging-frequency-tables-with-only-3-lines-of-code-3021c7756991?source=collection_archive---------41-----------------------

一些你可能不知道的简单而有用的生活窍门

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者创作,灵感来自 Loveascii

虽然在 Python pandas 库中为一个系列对象创建频率表最简单的方法是应用value_counts()方法,但是这个操作的结果看起来相当简单。我们可以通过调整方法的布尔参数normalizesortascendingdropna,或者将值(如果它们是数字的话)分组到 bin 中,来使它提供更多的信息。然而,这里的选项非常有限,所以为了在视觉上增强结果频率表,我们可以考虑一些简单而有用的技巧,比如方法链接、文本定制、为每个频率值添加%符号,以及使用漂亮打印的功能。

在本文中,我们将使用包含年龄、性别、位置、教育等信息的 Kaggle 数据集进行实验。,针对 OkCupid 交友 app 的 6 万用户💞。然而,出于我们的目的,我们将只使用用户状态的数据。

1.方法链接

首先,让我们为用户状态创建一个基本频率表:

import pandas as pd
profiles = pd.read_csv("okcupid_profiles.csv", na_values="unknown")
s = profiles["status"]
s.value_counts()**Output:**single            55697
seeing someone     2064
available          1865
married             310
Name: status, dtype: int64

尽管此表清楚地显示了总体趋势,但以相对频率查看此信息会更方便。让我们将True分配给normalize参数,并将结果频率表(它本身是一个序列)分配给一个名为s_norm的变量。

(*旁注:*在下文中,我们将默认保留value_counts()方法的所有其他参数,这意味着我们将只考虑按降序排序的频率表,并排除缺失值。对于我们的目的,使用或不使用这些参数并不重要。)

s_norm = s.value_counts(normalize=True)
s_norm**Output:**single            0.929275
seeing someone    0.034437
available         0.031117
married           0.005172
Name: status, dtype: float64

现在所有的频率都被转换成分数,但是我们更喜欢看到百分比,所以让我们把这个系列乘以 100:

s_pct = s_norm.mul(100)
s_pct**Output:**single            92.927456
seeing someone     3.443673
available          3.111652
married            0.517218
Name: status, dtype: float64

我们真的不需要如此精确的百分比。此外,让我们想象一下,我们根本不需要小数点:

s_pct_rounded = s_pct.round()
s_pct_rounded**Output:**single            93.0
seeing someone     3.0
available          3.0
married            1.0
Name: status, dtype: float64

不幸的是,舍入到整个部分给我们留下了所谓的可空整数(即小数部分等于 0 的浮点数)。要修复它,我们可以使用convert_dtypes()astype(int):

s_pct_int = s_pct_rounded.convert_dtypes()
s_pct_int**Output:**single            93
seeing someone     3
available          3
married            1
Name: status, dtype: Int64

现在让我们展开s_pct_int的整个表达式,显示我们链接的所有方法:

s_pct_int = profiles['status'].value_counts(normalize=True).mul(100).round().convert_dtypes()

2.添加表格标题

在不了解上下文的情况下,从上表中无法清楚地看出这些数字代表的是百分比而不是绝对频率。让我们使用 f 字符串格式为表格添加一个标题:

print(f"OkCupid user statuses, %\n{s_pct_int}")**Output:**OkCupid user statuses, %
single            93
seeing someone     3
available          3
married            1
Name: status, dtype: Int64

一个好主意是,特别是如果我们一次打印出几个频率表,从视觉上突出表的其余部分的标题,例如使其加粗。为此,我们可以使用 ANSI 转义码序列。特别是,要在 Python 中以粗体显示一个字符串,我们应该在该字符串之前添加序列\033[1m,在它之后添加\033[0m —:

print(f"\033[1mOkCupid user statuses, %\033[0m\n{s_pct_int}")**Output:****OkCupid user statuses, %** 
single            93 
seeing someone     3 
available          3 
married            1 
Name: status, dtype: Int64

3.将%符号加到每个频率值上

在上面的例子中,我们给表格标题添加了%符号。如果我们想把它加到每个频率值上呢?这里的一个解决方法是制作一个频率值列表,在每个列表中添加%符号,然后从这个列表中创建一个序列。为了制作列表,我们可以使用下面的 For 循环:

lst_with_pct_symb = []
for value in s_pct_int.values:
    lst_with_pct_symb.append(f"{value}%")
lst_with_pct_symb**Output:**['93%', '3%', '3%', '1%']

或者更简洁地说,一个列表理解:

lst_with_pct_symb = [f"{value}%" for value in s_pct_int.values]

现在,让我们创建并打印一个更新的频率表。这一次,我们将从标题中删除%符号:

s_with_pct_symb = pd.Series(lst_with_pct_symb, index=s_pct_int.index)
print(f"\033[1mOkCupid user statuses\033[0m\n{s_with_pct_symb}")**Output:****OkCupid user statuses**
single            93%
seeing someone     3%
available          3%
married            1%
dtype: object

4.漂亮的印刷桌子

最后,我们可以把频率表打印出来。为此,我们将使用to_markdown() pandas 方法,该方法需要安装(不一定是导入)制表模块(pip install tabulate)。

**重要提示:**为了正确显示结果,只能在print()命令中使用to_markdown()方法。

让我们再次展示名为s_with_pct_symb的用户状态频率表,这次是一个真实的表,使用的是to_markdown()的基本语法。如前所述,我们将添加一个粗体标题并应用 f 字符串格式。为了一致性,在下文中,我们将要显示的频率表分配给一个名为S的变量:

S = s_with_pct_symb
print(f"\033[1mOkCupid user statuses\033[0m\n{S.to_markdown()}")**Output:****OkCupid user statuses**
|                | 0   |
|:---------------|:----|
| single         | 93% |
| seeing someone | 3%  |
| available      | 3%  |
| married        | 1%  |

我们可能要做的第一件事是删除一个自动创建的表头(在我们的例子中是多余的)。为此,我们必须为一个名为headers的可选参数分配一个空列表或字符串:

print(f"\033[1mOkCupid user statuses\033[0m\n{S.to_markdown(headers=[])}")**Output:****OkCupid user statuses**
|:---------------|:----|
| single         | 93% |
| seeing someone | 3%  |
| available      | 3%  |
| married        | 1%  |

表格文档中,我们可以找到一些其他参数进行调整。但是,它们大多与 DataFrame 对象相关。在我们的例子中,假设我们有一个序列,并且记住在添加了%符号之后,频率值实际上变成了字符串,我们有一个小得多的选择。

我们来玩一下参数tablefmtstralign。它们中的第一个定义了表格格式,可以有下列值之一:plainsimplegithubgridfancy_gridpipeorgtbljiraprestoprettypsqlrst等。例如,我们之前看到的表格格式叫做pipe,这是to_markdown() pandas 方法的默认格式。奇怪的是,对于制表软件包本身,默认的表格格式是simple。至于第二个参数stralign,它用于覆盖默认的字符串数据对齐方式(即left)。这里可能的选项是rightcenter

print(f"\033[1mOkCupid user statuses\033[0m\n"
      f"{S.to_markdown(headers=[], tablefmt='fancy_grid', stralign='right')}")**Output:****OkCupid user statuses**
╒════════════════╤═════╕
│         single │ 93% │
├────────────────┼─────┤
│ seeing someone │  3% │
├────────────────┼─────┤
│      available │  3% │
├────────────────┼─────┤
│        married │  1% │
╘════════════════╧═════╛

现在让我们把注意力转向我们之前创建的名为s_pct_int的频率表。提醒其语法和外观:

s_pct_int = profiles['status'].value_counts(normalize=True).mul(100).round().convert_dtypes()
s_pct_int**Output:**single            93
seeing someone     3
available          3
married            1
Name: status, dtype: Int64

要为s_pct_int创建降价表,添加相应的表头是有意义的。同样,让我们为tablefmt参数尝试一个新值:

S = s_pct_int
print(f"\033[1mOkCupid user statuses\033[0m\n"
      f"{S.to_markdown(headers=['STATUS', '%'], tablefmt='github')}")**Output:****OkCupid user statuses**
| STATUS         |   % |
|----------------|-----|
| single         |  93 |
| seeing someone |   3 |
| available      |   3 |
| married        |   1 |

然而,这里我们有一个好消息:对于数字频率值,我们可以使用floatfmt参数来定制浮点数的格式。这意味着上面方法链中的最后两个方法(round()convert_dtypes())是多余的,可以删除。它留给我们之前创建的频率表s_pct:

s_pct = profiles['status'].value_counts(normalize=True).mul(100)
s_pct**Output:**single            92.927456
seeing someone     3.443673
available          3.111652
married            0.517218
Name: status, dtype: float64

让我们展示一下它的降价表示:

S = s_pct
print(f"\033[1mOkCupid user statuses\033[0m\n"
      f"{S.to_markdown(headers=['STATUS', '%'], tablefmt='github', floatfmt='.0f')}")**Output:****OkCupid user statuses**
| STATUS         |   % |
|----------------|-----|
| single         |  93 |
| seeing someone |   3 |
| available      |   3 |
| married        |   1 |

由于正确的数字格式,我们获得了与前一个相同的表。

注意:floatfmt参数不配合表格格式pretty使用。

实用的外卖

尽管上面的整个演练花费了大量的迭代和描述,下面我们将找到 4 个不同版本的profiles['status']频率表的最终代码解决方案,全部以%表示:

  • 2 个带有/不带有%符号的简单表格,
  • 2 个印刷精美的表格,带/不带%符号,带/不带表头。

每个解决方案最多只需 3 行简单代码,就能生成感兴趣的频率表的直观有效的表示。

S = profiles['status'].value_counts(normalize=True).mul(100).round().convert_dtypes()
print(f"\033[1mOkCupid user statuses, %\033[0m\n{S}")**Output:****OkCupid user statuses, %**
single            93
seeing someone     3
available          3
married            1
Name: status, dtype: Int64
s_pct_int = profiles['status'].value_counts(normalize=True).mul(100).round().convert_dtypes()
S = pd.Series([f"{value}%" for value in s_pct_int.values], index=s_pct_int.index)
print(f"\033[1mOkCupid user statuses\033[0m\n{S}")**Output:****OkCupid user statuses**
single            93%
seeing someone     3%
available          3%
married            1%
dtype: object
S = profiles['status'].value_counts(normalize=True).mul(100)
print(f"\033[1mOkCupid user statuses\033[0m\n"
      f"{S.to_markdown(headers=['STATUS', '%'], tablefmt='github', floatfmt='.0f')}")**Output:****OkCupid user statuses**
| STATUS         |   % |
|----------------|-----|
| single         |  93 |
| seeing someone |   3 |
| available      |   3 |
| married        |   1 |
s_pct_int = profiles['status'].value_counts(normalize=True).mul(100).round().convert_dtypes()
S = pd.Series([f"{value}%" for value in s_pct_int.values], index=s_pct_int.index)
print(f"\033[1mOkCupid user statuses\033[0m\n{S.to_markdown(headers=[], tablefmt='fancy_grid')}")**Output:****OkCupid user statuses**
╒════════════════╤═════╕
│ single         │ 93% │
├────────────────┼─────┤
│ seeing someone │ 3%  │
├────────────────┼─────┤
│ available      │ 3%  │
├────────────────┼─────┤
│ married        │ 1%  │
╘════════════════╧═════╛

结论

在本文中,我们讨论了一些简单而强大的方法来改进频率表的布局和整体可读性。他们都有value_counts()熊猫方法作为核心部分,但都超越了它,产生了更有影响力的表现。更重要的是,每个建议的解决方案,在其最终形式下,最多需要 3 行代码。

我希望你喜欢阅读我的文章,并发现它很有帮助。感谢大家的阅读,祝使用 OkCupid 交友 app 的人好运😉💘

你会发现这些文章也很有趣:

</5-pandas-methods-youve-never-used-and-you-didn-t-lose-anything-37277fae7c55> </2-efficient-ways-of-creating-fancy-pictogram-charts-in-python-8b77d361d500>

在深度学习上不断深入

原文:https://towardsdatascience.com/going-deep-on-deep-learning-bd9312096fa3?source=collection_archive---------31-----------------------

在一个有从一个流行词跳到另一个流行词的趋势的领域,深度学习被证明是发现和科学进步的持续驱动力——但也是混乱甚至恐惧的经常来源。TDS 是来帮忙的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Patrick sch pflin 在 Unsplash 上的照片

贝叶斯方法,从错误中学习

一个开始的好地方?这是对贝叶斯深度学习的全面介绍,作者 Joris Baan ,他写这篇文章的明确目标是弥合基础概率论和前沿研究之间的差距。你很难找到比 Lina Faik 耐心解释深度 Q 学习、强化学习以及这两者如何推动新的和令人兴奋的现实世界应用更好的文章来阅读。

如果我们退一步,从自己的错误(或模型的错误……)中学习是任何机器学习工作流程中的关键一步,无论深度与否。本周,我们围绕这个主题发表了几篇颇有见地的帖子:我们强烈推荐 Emeli Dral指南,以找到你的回归模型中的弱点,以及这个关于错误分析和负责任的机器学习的重要概述,由 Besmira Nushi 和她在微软研究院的同事提供。当你这样做的时候,用 Aparna Dhinakaran 对模型性能指标的讨论和她的模型监控剧本来完成你的 ML 阅读会议。

当然,深入可能意味着不止一件事——当我们积极完善我们的技能并理顺我们的日常流程时,我们经常会感觉到与我们的工艺有更深的联系。如果你错过了它们,现在赶上 Gregor Scheithauer 博士关于让你的代码更有效的教程还不算太晚,还有 Lathan Liou 对他多年来开发的简化的 R 数据分析工作流程的简明介绍。尽情享受吧!

第一步,加强联系

我们知道你们中的许多人最近刚刚开始了数据科学之旅,你们中的一些人可能还在思考这是否是适合自己的道路。如果这描述了你目前的状态,你现在能做的最好的事情就是抽出几分钟来阅读副主编安妮·邦纳关于数据科学入门的阅读清单

安妮的帖子关注的是一个有时会在所有算法和可视化中迷失的领域:网络。正如她所说的,“和那些已经做了你将要做的事情的人联系是最聪明(也是最快)的前进方式之一。”在你看完安妮推荐的读物时,做好准备,让自己充满想法和动力。

变革性人工智能技术的最终前沿

对于我们这些生活在赤道以北的人来说,春天感觉很近——更新和新的可能性的承诺也是如此。我们想不出比人工智能的开阔视野更适合这个季节的话题了,TDS 播客主持人 Jeremie Harris 和他最近的嘉宾研究员 David Roodman 一起深入探讨了这个话题。收听这一集了解大卫在经济模型、预测和人工智能公平性方面的工作。

无论你在世界的哪个角落,无论你是否会经历更长的白天和更温暖的天气,TDS 的所有人都祝你度过美好的一周。感谢您阅读、分享和参与我们发布的作品,感谢您让这个社区保持支持、开放和无止境的好奇。

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

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

入门指南

实践教程

变革的数据

思想和理论

争取金牌:使用广义线性模型预测奥运会奖牌结果

原文:https://towardsdatascience.com/going-for-gold-predicting-medal-outcomes-in-the-olympics-using-generalized-linear-modeling-e6e9d4837ae8?source=collection_archive---------11-----------------------

我们能建立一个运动员赢得奖牌几率的广义线性模型吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

凯尔·迪亚斯在 Unsplash 上的照片

和许多人一样,我一直在家里享受东京奥运会。作为一名数据科学家,在观看一些网球比赛时,我摆弄了一个关于奥运选手的 Kaggle 数据集,列出了他们的年龄、性别和国籍等特征,以及每个运动员获得的奖牌(如果有的话),并想看看我能否基于这些特征建立一个运动员赢得奖牌几率的广义线性模型。

动机

根据年龄、身高和国籍等相关特征,我们能否预测某个运动员在奥运会上赢得奖牌的可能性?

资料组

我们将使用从雅典 1896 年到里约 2016 年的夏季和冬季奥运会的综合数据集。对每位运动员的以下特征进行测量:

  • ID(每个运动员的唯一标识符,以说明重复的姓名)
  • 名字
  • 性别(F 代表女性,M 代表男性)
  • 年龄
  • 高度(厘米)
  • 重量(千克)
  • NOC——由国家奥林匹克委员会为每个国家制定的三个字母的代码(例如,USA:美利坚合众国)
  • 游戏(例如,2008 年夏季,2010 年冬季)
  • 季节(夏季或冬季)
  • 城市(如东京)
  • 运动(如网球)
  • 项目(如网球女子单打)
  • 奖牌(金、银、铜、钠)

初始数据探索

首先,让我们加载数据集:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

让我们看看哪个国家积累的金牌最多:

USA    1131
URS     471
GER     319
GBR     289
FRA     264
       ... 
HAI       1
FIJ       1
PER       1
HKG       1
SYR       1
Name: NOC, Length: 109, dtype: int64

我们看到美国获得了最多的金牌,截至 2016 年,共有 1131 枚奖牌,这是有道理的,因为它自 1896 年成立以来一直参加奥运会。

让我们看看美国在哪个运动项目上赢得了最多的奖牌:

Athletics                    344
Swimming                     246
Shooting                      54
Wrestling                     52
Boxing                        50
Diving                        48
Gymnastics                    35
Rowing                        33
Speed Skating                 29
Basketball                    23
Tennis                        21
Sailing                       19
Weightlifting                 16
Cycling                       16
Alpine Skiing                 16
Figure Skating                15
Archery                       14
Equestrianism                 11
Snowboarding                  10
Freestyle Skiing               8
Bobsleigh                      7
Beach Volleyball               6
Synchronized Swimming          5
Canoeing                       5
Short Track Speed Skating      4
Fencing                        4
Football                       4
Art Competitions               4
Skeleton                       3
Golf                           3
Softball                       3
Ice Hockey                     3
Water Polo                     3
Rugby                          3
Volleyball                     3
Judo                           2
Taekwondo                      2
Nordic Combined                1
Jeu De Paume                   1
Baseball                       1
Triathlon                      1
Roque                          1
Tug-Of-War                     1
Polo                           1
Name: Sport, dtype: int64

因此,看起来美国以 344 枚金牌在田径项目上独占鳌头,其次是游泳项目,有 246 枚金牌。但是,我需要注意的是,截至 2016 年里约奥运会,田径项目的实际金牌数为 335 枚。截至 2018 年,当这些数据汇总在一起时,大多数剩余的运动项目都有正确的统计数据,然而,在过去如何计算奖牌方面存在一些轻微的差异。例如,在击剑比赛中,数据显示美国获得了 4 枚奖牌,但一些消息来源却报道了 3 枚。这是由于 1904 年国际奥委会将美国人艾伯特森·范·佐·波斯特算作代表古巴而不是美国的差异T5 造成的。在该数据集中,假设美国人表示。我推测,在奥运会早期的田径比赛中也有类似的争议,这可以解释略高的数字,所以我鼓励读者在得出结论之前,与官方的奥运资料进行交叉验证,以自己对这个数据集的分析。尽管如此,上面这些统计数据大部分都是正确的,比如游泳和网球。

我们可以根据运动发生的季节来划分运动项目:冬天或夏天。既然田径和游泳是夏季项目,让我们来看看美国在哪个冬季项目中获得了最多的金牌:

Speed Skating                29
Alpine Skiing                16
Figure Skating               14
Snowboarding                 10
Freestyle Skiing              8
Short Track Speed Skating     4
Skeleton                      3
Ice Hockey                    3
Nordic Combined               1
Name: Sport, dtype: int64

美国以 29 枚奖牌获得了最多的速滑金牌,但似乎夏天才是美国真正闪光的地方。让我们看看哪个国家在冬奥会上赢得了最多的金牌。

NOR    111
USA     96
GER     86
URS     77
CAN     62
AUT     59
SUI     50
SWE     50
RUS     49
FIN     42
GDR     39
ITA     37
NED     37
FRA     31
KOR     26
CHN     12
FRG     11
GBR     11
JPN     10
EUN      9
CZE      7
BLR      6
AUS      6
POL      6
CRO      4
EST      4
SVK      2
SLO      2
UKR      2
LIE      2
TCH      2
ESP      1
KAZ      1
IND      1
BEL      1
NEP      1
UZB      1
BUL      1
Name: NOC, dtype: int64

挪威也没有 NOC 代码,根据该数据集,挪威在冬季奥运会上以 111 枚金牌领先。然而,截至 2014 年索契冬奥会(这是该数据集中最近的一次冬季奥运会),官方统计数据为 118 次,其中缺少了一些 1992 年和 1994 年的数据。然而,像田径运动一样,这并不是一个巨大的偏差。

然后我们可以看到挪威在冬季奥运会上占主导地位的运动:

Cross Country Skiing    33
Speed Skating           25
Biathlon                15
Nordic Combined         13
Alpine Skiing           10
Ski Jumping              9
Figure Skating           3
Freestyle Skiing         2
Curling                  1
Name: Sport, dtype: int64

因此,越野滑雪是挪威的强项,共获得 33 枚金牌。

我们可以使用熊猫的crosstab函数来可视化这些奖牌分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

与美国相比

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

请注意,并不是每一项冬季运动都有代表,因为美国并没有在每一项冬季运动中获得奖牌。例如,冬季两项没有出现,不像在挪威的图表中也有一些运动没有出现。

广义线性建模

现在我们已经做了一些基本的汇总统计,让我们看看我们是否可以建立一个模型来预测单个运动员(而不是一支球队/国家)赢得奖牌的机会。有各种方法可以做到这一点,如训练神经网络,但在本文中,我们将重点放在广义线性模型(GLM)。

回想一下,线性回归通过一些解释变量 X 的线性组合,对一个连续变量 y ~ N( μσ )进行建模。例如,我们可以根据运动员的身高和性别预测他们的体重,如下所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 β 是第 i 名运动员的每个特征的系数——在这种情况下,是身高和性别——而 ϵ 是残差的误差项。这可以更概括地描述为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于线性回归的更深入的讨论,见这里这里

像这样的线性回归模型满足三个关键属性:

  1. 它们有一个随机成分y——我们的因变量——遵循正态分布。
  2. 如上所述定义的线性预测器,通常称为 η
  3. 将线性预测器连接到均值的链接函数 g 在线性模型的情况下, g 是恒等链接函数 g,因此g(ηᵢ)=*ηᵢ=*μᵢ

现在假设我们想预测自奥运会以来每个国家获得的奖牌数。因为我们的 y 变量统计的是奖牌数,它是一个离散变量,违背了线性回归中使用的正态分布下连续变量的假设。在这种情况下,更合适的模型是泊松回归模型。这是一个广义线性模型(GLM)的例子。

广义线性模型在某种意义上是广义的,尽管在它的根部仍然有一个线性模型,但是随机分量 y 可以是分布的指数族的任何成员(例如,正态、伽玛、泊松等),并且链接函数可以是任何函数,只要它是平滑且可逆的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

假设我们想模拟一名运动员是否获得了奖牌:铜牌、银牌或金牌。因为这是一个二元结果,我们的响应变量 y 应该遵循伯努利分布 y ~ Bin(1 ,p )=Ber( p ),我们的线性预测器的链接函数定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在哪里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

逆 logit 函数称为逻辑函数,它基于线性预测值对赢得奖牌的概率进行建模。由于通常 n = 1(因此我们得到 μᵢ = pᵢ ),这个模型被称为逻辑回归。

我们将以游泳为例,展示具有物流链接功能的 GLM:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意,有几个身高和体重条目是 NaNs,因此我们将删除这些条目以及年龄,以便更好地衡量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还将我们的响应变量 Medal 建模为 0 代表北美,1 代表金牌、银牌或铜牌

最后,我们将性别编码为 0 代表男性,1 代表女性:

现在我们准备好构建我们的模型了。我们将使用statsmodelspatsy 包,您可以使用 pip 来安装它们。statsmodels包含了我们将需要来适应我们的 GLM 的函数,而patsy是一个用户友好的库,用于构建我们可以使用以前的包来适应的统计模型。让我们从一些简单的事情开始,建立年龄和奖牌结果之间的关系模型。我们将首先安装软件包并运行以下代码:

pip install statsmodels
pip install patsy

运行此代码,我们获得以下输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这个输出包含很多内容,但是我希望您关注的主要内容是两行,截距和年龄,以及偏差。对于前两行中的每一行,它们都列出了该参数的估计系数β、标准误差、z 得分、表示模型中该预测值显著性的 p 值以及估计系数β的置信区间。

偏差是对残差平方和的概括,它量化了 GLMs 的拟合优度。理想情况下,我们希望这个度量小于 n-p ,其中 n 是观察值的数量(18776),而 p 是我们模型中的参数数量(2)。因此我们的偏差是 14645<18776–2 = 18774。因此,模型通过了拟合优度测试,但让我们尝试将其可视化。statsmodels没有用于 GLMs 的直观绘图库,但我们可以使用matplotlib绘图库轻松地对其进行编码,绘制拟合概率与年龄的关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这并没有真正给我们一个很好的拟合,这是有道理的,因为年龄不一定与性能的增长率相关联。让我们尝试添加额外的特征,比如身高、体重和性别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据高度绘图,我们获得了稍微好一点的拟合,正如偏差从 14645 下降到 14202 所证明的那样,但它仍然不能有效地给我们的数据一个稳健的拟合。年龄不是一个具有高 p 值的重要预测因素,这在我们的年龄模型中并不令人惊讶。

回想一下,美国的第二大运动是游泳,所以我们可以将美国作为一个解释变量。与该数据集中的性别二进制分类(不包括任何非二进制运动员)不同,国家(NOC)是一个跨越两个以上类别的分类变量,因此我们需要以这样一种方式修改它,即我们有一个列来指定某个运动员是否代表美国。pandas有一个函数get_dummies(),它创建一个虚拟变量,将输入列的每个分类变量二进制化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这将删除 NOC 列,取而代之的是为每个国家添加二进制列,以“NOC_”为前缀,表示某个运动员是否代表该国。因此,“NOC_USA”告诉我们一名参赛运动员是否代表美国,而“NOC_CAN”告诉我们一名运动员是否代表加拿大。

现在让我们将这个新变量添加到我们的模型中,看看它是否能更好地拟合我们的游泳数据。我们将删除年龄,因为它的表现不佳,并再次按高度绘图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这给了我们一个比以前的模型更好的拟合,从 14202 年到 11922 年偏差的显著下降也可以看出这一点。鉴于美国在游泳方面的声誉,根据数据,成为美国人会增加一个人成功的机会是有道理的。如果我们建立 0.6 或 0.7 的截止概率作为决定奖牌结果的阈值,我们将获得非常接近二进制数据的拟合。

结论

在本文中,我们学习了 GLMs,使用一个综合的奥运会数据集作为逻辑回归的例子,以及一些数据格式化/清理技术。虽然 GLMs 是统计建模的强大工具,但它们也有缺点。如果数据集包含大量要素,则可能会过度拟合模型或遇到性能计算瓶颈,具体取决于数据集的大小。此外,还有其他不在该数据集中的特征可以改进我们的模型,例如在非奥运场馆的运动表现(例如网球的温布尔登)。还有其他可能更有效的数据建模方法,如支持向量机或神经网络。最后,对于像这样的历史数据集,很可能会因为有争议的视图而导致缺失值或错误,因此当您从该数据集和类似数据集得出结论时,请记住这一点。

我希望你喜欢这篇文章。我鼓励你自己尝试这个数据集并进行分析。请在下面的评论中告诉我你的经历,或者如果你有任何问题。编码快乐!

用于机器学习的 Golang?

原文:https://towardsdatascience.com/golang-for-machine-learning-bd4bb84594ee?source=collection_archive---------2-----------------------

意见

Golang 是建立机器学习管道的未来吗?让我们试着建一个。

Go 或 Golang 是 Google 在 2007 年设计的,在语法上与 C 类似,但具有内存安全、垃圾收集和结构类型。除了其惊人的快速性能之外,与 Python 不同,Go 允许简单的并发,就像在 C++或 Java 中一样。并发性允许多个程序或算法(包括 ML 的那些)异步执行,而不影响最终结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Fotis FotopoulosUnsplash 上拍摄

考虑到这一点,我计划比较使用 Golang 构建一个简单的 ML 管道的优缺点。我将同时使用 Python 作为参考点。此外,我将提供我个人对这种语言的总体看法,并评估 Go 在 AI/ML 社区中是否有前途。所以,让我们开始吧。

**注意:**在我们继续之前,这篇文章不会介绍如何在你的机器上安装和设置 Go。如果您还没有这样做,请遵循这些全面的说明

目录:

  1. 设置
  2. 数据帧
  3. 数据操作
  4. 围棋中的机器学习

设置

首先,我们需要在我们的终端中安装以下软件包。

  1. 安装 DataFrameGoNum 包及其依赖项。DataFrame 和 GoNum 类似于 Python 的 NumPy,通常用于操作 DataFrame 对象。
$ go get -u github.com/kniren/gota/dataframe
$ go get -u github.com/gonum/matrix
$ go get -u gonum.org/v1/gonum/...

2.安装 GoLearn 包。GoLearn 是 GoLang 中的一个机器学习库,类似于 Python 的 sklearn。它允许简单的矩阵操作、ML 算法的构造、模型拟合,甚至用于训练/评估过程的数据分割。

$ g++ --version # make sure you have a G++ compiler$ go get github.com/gonum/blas$ go get -t -u -v github.com/sjwhitworth/golearn
$ cd $GOPATH/src/github.com/sjwhitworth/golearn
$ go get -t -u -v ./...

既然困难的部分已经过去,让我们进行更有趣的部分吧!

数据帧

我们将使用描述不同类型鸢尾花的鸢尾数据集。您可以通过在终端中运行以下命令来获取 IRIS 数据集:

$ wget [https://raw.githubusercontent.com/sjwhitworth/golearn/master/examples/datasets/iris_headers.csv](https://raw.githubusercontent.com/sjwhitworth/golearn/master/examples/datasets/iris_headers.csv)

确保将。CSV 文件,位于您当前正在处理的文件夹以及您的 main.go 文件所在的位置。

我们需要首先将下面的包导入到我们的 main.go 程序文件中。

现在我们已经有了所有的导入,让我们编写 main()函数来加载 CSV 数据并很好地打印出来。

您将得到以下漂亮的数据摘要,它描述了行数(150)、属性数(5)、属性摘要(包括数据类型)以及前几行的摘要视图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虹膜数据帧摘要(图片来自作者)

相当整洁!到目前为止,这些操作中的大部分与您在 Python 中的编码方式相似。

数据操作

现在让我们来探索如何在 Go 中执行数据操作。

1。子集化

Python 中最简单的子集化操作之一是使用 df.head() 操作。我们可以在 Go 中类似地执行这个功能。

head := df.Subset([]int{0, 3})                       fmt.Println(head)

您将看到数据帧的前两行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Go 中设置数据帧的子集(图片来自作者)

个人觉得操作没有 Python 中的那么啰嗦。如果事先不了解 Go 中的数据类型,您将很难理解这个函数。

2.过滤

假设现在你想探索鸢尾属物种的属性。您可以使用函数 filter()过滤行,如下所示。

versicolorOnly := df.Filter(dataframe.F{
    Colname:    " Species",
    Comparator: "==",
    Comparando: "Iris-versicolor"
})fmt.Println(versicolorOnly)

您将只检索带有鸢尾-杂色物种的行!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按物种名称过滤(图片来自作者)

您也可以将比较器属性与>、≥、<或≤的属性互换。

就我个人而言,我不介意语法上的变化,因为这些操作到目前为止看起来非常直观。但是这些程序的字数明显比 Python 中的长,如下图所示。

versicolorOnly = df[df[" Species"] == "Iris-versicolor"]

3.列选择

除了子集化和行过滤之外,还可以通过下面的简单操作对列进行子集化。

attrFiltered := df.Select([]string{"Petal length", "Sepal length"})                       fmt.Println(attrFiltered)

您可以找到许多其他的数据争论操作,包括连接、聚合、函数应用(回想一下。在熊猫身上应用()。)、等。

总的来说,我还是更喜欢 Python,但可能是因为我没有足够的围棋实践经验。然而,Go 的冗长可能会阻止我追求前者。

围棋中的机器学习

既然我们已经在 Go 中处理了一些数据帧,我们可以开始构建一个简单的机器学习管道。对于这个例子,让我们建立一个简单的 KNN 分类器来确定鸢尾的物种类型,给定它的属性集合(例如,花瓣长度,花瓣宽度等)。

0.重新加载数据

在 main()函数中,让我们重新加载 CSV 数据集。

fmt.Println("Load our csv data")
rawData, err := base.ParseCSVToInstances("iris_headers.csv", true)if err != nil {
    panic(err)
}

1.初始化 KNN 分类器

这里,我们从 GoLearn 的 knn 子包 中初始化一个新的 KnnClassifier。然后,我们将必要的属性传递给新的分类器类:使用欧几里德作为距离函数,线性作为算法核心,使用 2 作为选择的邻居数量。

fmt.Println("Initialize our KNN classifier")
cls := knn.NewKnnClassifier("euclidean", "linear", 2)

2.培训-测试分割

像往常一样,我们执行训练/测试数据分割(各 50%)。到目前为止没有什么新奇的,一切看起来都和我们在 Python 的 sklearn 库中做的一样。

fmt.Println("Perform a training-test split")
trainData, testData := base.InstancesTrainTestSplit(rawData, 0.50)

3.训练分类器

任何 ML 流水线的主要部分将是分类器的训练。但是,如果你熟悉 Python 的 sklearn 包,那么 Go 中的过程即使不完全相同,也是相似的。

cls.Fit(trainData)

4.汇总指标

训练步骤完成后,我们可以使用保留的测试数据执行评估,并检索性能总结。

fmt.Println("Print our summary metrics")confusionMat, err := evaluation.GetConfusionMatrix(testData, predictions)if err != nil {
    panic(fmt.Sprintf("Error: %s",err.Error()))
}fmt.Println(evaluation.GetSummary(confusionMat))

如果一切顺利,您将在终端中打印出以下内容!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的 KNN 分类器的评估总结(图片来自作者)

不算太差!对于新训练的 KNN 分类器,我们达到了 97.73%的准确率。尝试并实现你能在 GoLearn 中找到的其他类型的分类器!

最后,您可以在下面的代码片段中找到完整的代码!

结论

总的来说,我发现构建机器学习管道的 Go 语法足够直观。不过我发现 Go 的 ML 社区规模比 Python 的要小。这使得故障排除非常麻烦,有时甚至令人沮丧。此外,许多这些包中缺乏 GPU 支持会阻碍您的 AI 开发过程。不仅如此,不同的 ML 相关包之间似乎也很少有互操作性。例如,GoLearn 包实现了自己的 Dataframe“Instance”类,该类可能无法很好地与原生的 GoNum 类甚至 GoTA 的 data frame 对象一起工作。

尽管如此,Go 凭借其高超的速度和并发性,有可能在机器学习应用中超越 Python 但它需要有足够的数量(即临界质量)的人工智能开发人员这样做。

做订阅我的邮件简讯:【https://tinyurl.com/2npw2fnz】在这里我定期用通俗易懂的语言和漂亮的可视化方式总结 AI 研究论文。

参考文献

[1]https://en . Wikipedia . org/wiki/Go _(编程 _ 语言)

[2]戈努姆:https://github.com/gonum/gonum

[3]戈勒恩:https://pkg.go.dev/github.com/Soypete/golearn

[4]戈塔:https://github.com/go-gota/gota

Golang vs Python: 6 个问题决定哪种编程语言最适合你

原文:https://towardsdatascience.com/golang-vs-python-6-questions-to-decide-which-programming-language-is-best-for-you-cf5aa5902c57?source=collection_archive---------14-----------------------

这两种编码语言一决雌雄——但是谁是赢家呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阿尔瓦罗·雷耶斯在 Unsplash 上拍摄的照片

在这个世界上,编写任何代码的能力都是一个巨大的优势,通常程序员面临的最大问题是知道从哪种语言开始学习,而不是是否要学习一种语言。你能想到的每一种用途都有不同的语言。在这些流行的编码语言中,程序员经常面临 Golang 和 Python 的激烈竞争。(官方名称是 Go,但网站名称是 Golang.org,所以程序员通常把它称为两者之一。)

从表面上看,这两者明显不同:Python 创建于 1991 年,是编码领域的老古董,而 Go 由 Google 于 2012 年首次发布,相对来说是个新手。Go 以其速度著称,而 Python 是一种速度较慢的语言。Python 是通用的,而 Go 在语法和格式上更严格。

然而,它们都被认为是许多典型编码问题的答案:作为初学者,学习哪种语言最好?哪种语言是获得计算机编程工作的最佳语言?哪种编码语言最好?每种语言都有其追随者,他们声称自己的语言无论如何都是最好的。

事实上,就像我写的每一篇关于如何在线学习计算机科学的文章一样,这很复杂。你是否应该学习 Go vs Python 的答案取决于你是否是初学者,你想要什么工作,你的计算机科学历史,以及你的目标是什么。

目录

· [Table of Contents](#1589)
· [Let’s start with a brief historical definition of Golang vs Python](#326d)
· [Golang vs Python: Which coding language is best for beginners?](#4367)
· [Golang vs Python: Which coding language is best for experienced coders?](#d304)
· [Golang vs Python: Which language is best for a job in computer science?](#b6a8)
· [Golang vs Python: Which language is best for machine learning?](#32de)
· [Golang versus Python: Which language is best for programmer productivity?](#1fe9)
· [Golang vs Python: Which language is best for the future?](#ab3a)
· [What’s the best language when deciding Golang vs Python?](#18d7)

让我们从 Golang vs Python 的简单历史定义开始

Python 在 1991 年出现在编码领域,是由吉多·范·罗苏姆写的,他想要一种我从未听说过的编程语言的继承者,叫做 ABC 编程。它的特点是可读性、多功能性和可伸缩性。它是一种语言的怪兽,拥有巨大的库、热情的支持者社区(称为 pythonistas ),以及三个不完全兼容的版本。

与此同时,Go 于 2012 年发布,很像雅典娜,完全由它的父亲罗伯特·格里塞默(Robert Griesemer)、罗布·派克(Rob Pike)和肯·汤普森(Ken Thompson)在 2009 年发布。这是一种为特定目的而构建的语言,是为了解决谷歌当时在代码中面临的许多问题,也是出于恶意,因为创建者都不喜欢 C++。它的支持者(地鼠)喜欢它,因为它吸取了 C 和 Javascript 等语言的精华,同时避免了它们的缺陷。

当您开始考虑 Golang 与 Python,以及您希望哪种语言用于哪项任务(或者您希望别人叫您哪种编码昵称)时,记住这些背景知识是非常有用的。两者都有优点和缺点,但是根据您的最终需求,在 Golang 和 Python 之间有一个确定的答案。

Golang vs Python:哪种编码语言最适合初学者?

众所周知,Python 最适合绝对编码婴儿。给你一些背景,我能够按照指令运行一个用 Python 编写的 Instagram 活动自动化机器人,只需要很少的编码能力。这个机器人很复杂,但我的成功实现通过模拟我在照片上的喜欢活动,使我的猫的 Instagram 账户增长到近 16k 粉丝。(Instagram 后来取缔了这类远程互动。)我发现错误很容易解决,语言很容易阅读,社区也非常支持我。简而言之,像我这样的完全新手的好语言。

Python 的编写方式使得它非常适合初级程序员学习。刚接触编码概念的人会发现 Python 比 Go 更容易学。围棋对于初学者来说是可以学习的——我已经写了一整篇关于为什么初学者应该在 2021 年学习围棋的帖子——但是 Golang 的许多主要特性和好处会被资深程序员更好地理解。

与此同时,就哪种语言最适合绝对的编码初学者而言,Python 是我的赢家。套用我以前一篇关于2021 年哪种语言最流行的文章,Python 对初学者来说很好,因为它:

  • 读起来像英语
  • 足够快速地构建一个功能原型
  • 对于初学者可能想尝试的任何项目来说都足够通用

综上,当问题为“Golang vs Python:哪个最适合新手?”对于大多数人来说,答案是 Python。

Golang vs Python:哪种编码语言最适合有经验的编码人员?

我可能已经在前面的部分给出了这个游戏,但是我的答案是 Golang(假设你没有做任何 AI/ML 工作)。Go 通常更适合那些已经知道如何编码并想在他们的武器库中增加另一种编程语言的人。

正如我上面所说的,它是基于谷歌工程师现有的问题而创建的。与许多其他语言相比,它被设计成更好的*。它易于编写和阅读(尽管更冗长),并且运行速度比 Python 代码快得多。像 Python 这样的不同版本之间也没有混淆。当我在猫的 Instagram 账户上使用机器人时,我遇到的主要问题是版本之间的兼容性。*

Go 有一个更简洁的语法和一组更紧凑的库。它对那些想用更少臃肿的语法变得更有效率的程序员很有帮助,因为它完全符合你的想法— 如果你是一个有经验的程序员。此外,它是为了扩展到大型项目而构建的,就像 Google 在本世纪初开发这种语言时所面临的恐惧一样。

如果你是一个有经验的程序员,Golang 是一个很好的、容易掌握的、有用的语言。你将能够欣赏到其他语言上所有初学者可能不会欣赏的小改进,比如命名约定。对于有经验的程序员来说,Go 轻松赢得了 Golang vs Python 之战。

Golang vs Python:哪种语言最适合计算机科学的工作?

许多人和我一样,喜欢编码,却没有真正去找一份计算机科学的工作。作为一名业余爱好者,我很高兴自己的大部分收入来自写作。但我是少数。

因为学习编码是一个巨大的承诺,大多数学习编程的人都是为了钱——这也不可耻。尤其是当学习编程的成本可能很高时,比如当你考虑计算机科学证书或文凭等选项时,为了最好的就业前景,优化语言学习是有意义的。

因为他们独特的特点,Golang vs Python 的这个特殊答案也取决于你想要什么工作。如果你正在找一份入门级的工作,Python 是最好的。学习 Python 可以让你快速掌握编码概念,并且能够完成新工作中可能需要的几乎所有任务。

或者,如果你雄心勃勃地想找一份收入最高的工作,那就去吧。

(双关。)

正如我在我写的 2021 年最流行的编码语言中所解释的,Go 以其顶级语言而闻名,因为:

  • 它是为大项目建造的,通常由大公司运营
  • 它比 Perl 更快更容易学,Perl 是收入最高的语言
  • 编写它是为了减少调试和阅读代码的时间,这是一项非常有价值的技能

这不是一种通用的语言,但对那些像优步、Twitch、Dropbox,当然还有谷歌这样正在招聘围棋开发者的公司来说更好。

Golang vs Python:哪种语言最适合机器学习?

机器学习是那些包含大量可能性的术语之一。在这篇关于 Golang 和 Python 的文章中,我将“机器学习”定义为编写一个可以对外部刺激做出决策的模型。例如,机器学习可以帮助你的 gmail 帐户确定谁在给你发垃圾邮件,谁实际上是你失散多年的阿姨,向你发送一个关于你不想错过的潜在遗产的重要信息。

对于想要编写机器学习模型的编码人员来说,Python 当然是最受欢迎的选择。

Python 领先,57%的数据科学家和机器学习开发人员使用它,33%的人优先开发它。

开发商经济公司的克里斯蒂娜·沃斯科格鲁

Python 在机器学习方面如此受欢迎的部分原因是它是 TensorFlow 的家园,tensor flow 是 Python 中发布的深度学习框架。Go 的优势在于其简单、易于实现的库和框架,Python 在复杂、众多框架中深厚而丰富的历史使其成为机器学习的最佳语言。TensorFlow 无疑是这些库中的佼佼者,但 Keras 和 Scikit-learn 也是著名的库。

值得注意的是,受欢迎程度并不等同于质量。虽然 Go 在流行程度方面甚至没有排在机器学习的前 10 种语言中,但 Websensa 在他们的帖子中承认哪种语言是最好的,“Go 更快,更具可扩展性和性能,因此它非常适合大规模项目。这使得它成为研究机器学习基础设施的最佳选择之一。”也许在未来 Golang 和 Python 之间的辩论中,Go 将成为机器学习编码器的首选。

Golang 与 Python:哪种语言最有利于程序员的生产力?

生产力,就其基本定义而言,就是高效地完成大量有意义的工作。由于选择的悖论,当使用有限的工具集时,人类(因此也是人类程序员)往往最有效率

所以,Go 是成为一个更有生产力的程序员的最佳语言。语法如此有限,库也不那么臃肿,以至于用更少的代码行就能更快地完成工作,因为只需编写更少的代码。

仅仅通过库的数量和语法的范围,Python 就在多功能市场上占据了优势。但是多功能性是有代价的,这个代价就是生产力。

有趣的是,Python 有时被推荐为初学者最高效的语言——用 Python 很容易快速启动并运行程序,而且用 Python 几乎可以做任何事情。

然而,在这场“Golang vs Python:哪种语言的生产力最高?”我认为 Go 是最好的,因为它更有效率,更容易调试,格式相似,最重要的是,它易于阅读。永远不要忘记编码是一种协作行为——你花在理解别人编码上的时间越少,就越容易做出有成效的贡献。

Golang vs Python:哪种语言最适合未来?

像地球上的其他人一样,我看不到未来。但我可以做一个有根据的猜测。当谈到用最经得起未来考验的语言来衡量 Golang 与 Python 时,我的猜测是 Go。也就是说,Python 仍然处于主要的增长轨道上,所以它也是一个很好的选择,我不认为这两种语言在不久的将来会失宠。

Python 无疑有着悠久的历史——它已经存在了 30 年,经历了三个脆弱和不兼容的版本,它比许多其他过时的语言都长寿,自 2003 年以来,它一直名列十大最受欢迎的语言,并且在 2018 年发生的仁慈的终身独裁者(又名创始人圭多)退休后,它仍在继续。它正在快速获得新用户,并且没有放缓的迹象——2019 年,Pythonistas 第一次超过了 Java 开发人员(据我所知,他们甚至没有一个酷而有趣的昵称)。

但是 Python,像许多其他更古老的语言一样,是一种不圣洁的聚合怪兽,由许多杂乱无章的库、语法和框架混杂在一起组成。它的多个版本组合起来很笨拙,并且通常不可移植。例如,Python 2 计划在 2015 年庆祝它的生命终结。根据维基百科文章的说法,该项目被推迟了五年,“因为担心大量现有代码不容易被移植到 Python 3 上”。那不是未来的证明。

与此同时,如果我看着我不存在的水晶球,问自己一个世纪后谷歌是否还会存在,我简直无法想象它不会存在。如果谷歌仍然存在,那么 Go 或者它的某个版本也会存在。Golang 的创建不仅是为了解决谷歌当时的问题,也是为了解决它未来可能遇到的所有问题。

对我来说,它的品牌认知度和专用特性意味着,在 Golang 和 Python 之间的竞争中,它似乎是未来最有可能成为最佳语言的竞争者。

决定 Golang vs Python 的时候用什么语言最好?

如果你已经走到这一步,还在寻找一个明确的答案,我不得不让你失望了:没有答案。就像问学西班牙语好还是意大利语好。明年夏天你打算去意大利还是西班牙?这就是你的答案。

Python 和 Go 都是很好的学习语言。如果你想在 Golang 和 Python 的战争中找出哪一个对你最有利?嗯,首先你需要弄清楚你要去哪里。

高尔夫运动日不是真的

原文:https://towardsdatascience.com/golfs-moving-day-is-not-a-real-thing-722317cb28f3?source=collection_archive---------36-----------------------

第二轮是更好的行动

高尔夫球评论员经常引用的一个短语是“移动日”,这是一场锦标赛四轮中的第三轮的名称。据说在搬家日的,,尤其是,球员们会争抢位置,试图在最后一天给自己一个荣耀的机会。但是,当然球员只是试图在每一轮投篮低,第三轮没有不寻常的位置变化,是吗?简短的回答是:不,不是;事实上,随着回合的进行,排行榜上的移动越来越少;移动日并不是一个真实的现象。

数据

为了调查这一点,我收集了四大赛事的轮末得分数据,从 1990 年的两个案例(公开赛大师赛)和 1999 年的另外两个案例(美国公开赛、美国 PGA),到 2021 年。用于收集数据的代码在这里是。在下面的所有分析中,分数和排名仅过滤给在第二轮结束时晋级的球员(大约一半的场地),以便可以确定所有球员在三对回合之间的位置变化。在平局的情况下,玩家的位置被设置为平局中最高的位置(最小的数字);例如,对于并列第十的两个玩家,都被分配位置 10。

圆周运动

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从第一轮结束到第二轮结束,玩家位置的平均变化(向上或向下)最大,在后面的几轮中减少。换句话说,第二天排行榜上的活动比第三天多。

这是有意义的,因为随着更多轮次的进行,玩家之间在质量或形式上的差异有更多的机会表现出来,并且该领域的总得分随着时间的推移变得更加分散:总得分的四分位数范围(IQR)从第一轮后的 3.1 增加到第二轮后的 3.7,以及第三轮后的 5.3。因此,排名前 30 的球员通常会发现自己在第三轮开始时需要比第二轮开始时(0.15)更多的杆数才能上升一个位置(0.23),到第三轮结束时(0.31),位置之间的杆数甚至更多。此外,特别低的回合分数,例如能够实现大动作的分数,在第三轮中并不常见:第三轮(69.1)和第四轮(69.0)中单回合分数的第十个百分位数是相似的(不可能通过包括或排除错过晋级的球员来公平地将这些分数与第二轮进行比较)。

我们可以通过计算连续几轮结束时排行榜之间的肯德尔排名相关系数来以另一种方式衡量排行榜的变化。更大的系数意味着两轮之间的排行榜看起来更相似,因此在两轮比赛的后一轮中运动更少。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于所有四个比赛来说,随着比赛的进行,排行榜变得更加稳定,至少在过去的 30 年里是这样。这种进展是稳定的:在第三轮结束时,排行榜活动没有明显下降,第二轮结束后也是如此。2018 年美国网球公开赛是第三天活动量不同寻常的一场比赛:这是一个的案例,当天晚些时候得分条件更难,这使得球员有可能更早出局,以弥补领先的位置。

获胜的机会

因此,第三天看到不寻常的仓位变化的想法并没有被现实所反映。的确,第四天的运动量减少了,所以玩家必须在第三天“行动”而不是等到最后一轮的想法是有一定道理的。然而,更具决定性的一点似乎是在第二轮结束时:在第二轮结束时,只有 10%的最终获胜者是已经进入前十名的而不是。前十名之外的人在最后两轮比赛中冲锋是最常见的,尽管仍然不太可能(19%的赢家)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在第三轮结束时没有进入前十名的赢家甚至更少(2%的赢家),尽管如果我们看一下前 5 名或前 1 名的位置(未显示),从第二轮结束到第三轮结束的下降没有那么明显。因此,我们可以说,在第三轮中进入前十是非常重要的,因为玩家有任何获胜的机会,但如果他们在第二轮结束时没有进入前十,这已经是一个漫长的镜头。

今年的四名获胜者在第二轮比赛后分别排名第六、第一、第五和第二,到第三轮比赛结束时,这四名分别成为第一、第一、第六和第二名。因此,松山秀树是移动日哲学的一个例子——他从第六名跃升至第一名,比之前的领先者多了七杆,并赢得了 2021 年的大师赛——而乔恩·拉姆表明,第三轮的“移动”并不重要,因为他在第三天从第五名滑落至第六名,在领先者身上失去了一杆,然后恢复到赢得 2021 年美国公开赛

一个(好得多的)评估你的机器学习模型的方法

原文:https://towardsdatascience.com/good-approach-to-evaluate-your-machine-learning-model-e2e1fd6aa6bb?source=collection_archive---------9-----------------------

使用一个或两个性能度量标准似乎足以宣称你的 ML 模型是好的——它很可能不是。

对于像我这样的数据科学家来说,使用经典的性能指标来恰当地评估 ML 模型是多么的困难。

即使可以使用多种指标和评分方法,理解我(可能还有许多其他人)面临的问题的正确指标仍然具有挑战性。这就是为什么我在大部分 ML 模型质量评估中使用飞贼 AI 的原因。在过去的两年里,我一直是开发飞贼 AI 的积极成员。

https://snit.ch?utm_source=blogOlivier&utm_medium=referral&utm_campaign=abetterapproach

让我用一个例子来解释为什么选择正确的指标如此重要:使用 UC Irvine 机器学习存储库中集中的数据生成一个可以预测公司破产的模型。该数据集名为台湾破产预测(由 CC 4.0 授权),利用了《台湾经济日报》1999 年至 2009 年的破产数据。

问题:不平衡的数据集

您将遇到的第一个问题是数据集中的不平衡。这既是好消息,也是坏消息。好消息是只有 3.3%的公司破产了!另一方面,坏消息是数据集中的不平衡使得预测“罕见阶层”(3.3%)变得更加困难,因为我们的懒惰模型可以通过简单地预测没有破产来预测 96.7%的公司的正确命运。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者的目标不平衡评估

您可以看到,这也是一个性能评估问题,因为大多数指标都偏向于最大的类,最终导致它们出错。为什么?预测没有破产使得我们的模型在理论上有 96.7%的准确性。这里有一个在飞贼 AI 中构建和评估的第一个模型的例子。默认情况下,该工具会计算多个相关的性能指标。正如你在下面看到的,我们的第一个模型获得了 96%的准确率。然而,当你看 F1 的分数时,,一个不平衡班级的更好的衡量标准,我得到的分数仅仅是 26%…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者的初始质量分析图像

那么是什么原因呢?

不平衡数据集的解决方案

当处理不平衡的数据时,第二步是尝试使训练数据集更加平衡。你可以通过对多数类(非破产)进行欠采样、去除随机观察或对少数类(破产)进行过采样来实现这一点。

对于过采样,您可以复制随机观测值或使用成熟的算法创建合成观测值,如合成少数过采样技术。 SMOTE 的工作方式是选择相近的示例,在示例之间画一条线,然后在沿着这条线的一个点上画一个新的示例。

如您所见,我可以使用许多技术来增强我的模型。

有了飞贼,我可以清楚地看到我的各种实验的历史:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者的多重质量分析图像

以下是我从上面的实验中学到的一些结论:

  • 欠采样和过采样技术显著提高了 F1 分数。这是好事!
  • 然而,这种性能的提高是以牺牲模型的整体质量为代价的。
  • 我们的模型 4(带欠采样的梯度提升)是最好的模型,因为它的性能几乎与模型 2 一样好,但质量通常更好。

等等!这个“质量分”是什么?

Snitch 使用大约十几个自动质量分析来生成这个质量分数。

质量分析产生:

  • **特征贡献得分:**到检查你的模型的预测是否有偏差或者在输入变量之间公平分布。
  • **随机噪声鲁棒性分数:**检查您的模型是否对噪声数据的引入具有鲁棒性。
  • **极端噪声鲁棒性得分:**检查您的模型是否对最坏情况噪声数据的引入具有鲁棒性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自飞贼 AI 质量分析方法论,2021。经允许重新发布

绩效评估很难

没有什么是来之不易的,绩效考核也不例外。虽然很难做到正确,但在开发模型时,性能评估需要认真对待。不是因为你有一个好的精度,你的模型才是好的。

事实是,准确性甚至可能不是一个相关的性能指标。在我们的例子中,F1 分数肯定更好,因为我们的数据集是不平衡的。这里的教训很简单。确保您验证了您选择的指标正确地衡量了您试图实现的目标。

尽管性能指标很重要(它们毕竟是关于测量你的模型预测结果有多好),但是这些指标不能验证数据偏差或者你的模型的整体稳健性。这里的一个好的实践是专门测试其他特征,如偏差和稳健性。

我们看到,一些模型在理论上比其他模型表现更好,但实际上质量较差。我们也看到了表现不佳但质量更好的模型。最终,目标是能够比较这些信号以选择最佳方法。

请记住,一个更好的方法不应该只关注于评估您的模型的性能,它实际上需要进行深入的测试,以确保您的系统也是健壮的,以便它实际上可以处理生产中的新数据…这就是奇迹需要发生的地方!

好的评估方法以及如何找到它们

原文:https://towardsdatascience.com/good-evaluation-measures-and-how-to-find-them-69a204045bb?source=collection_archive---------35-----------------------

我们使用理论方法来分析和比较分类和聚类的性能度量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Arie Wubben 在 Unsplash 上拍摄的照片

在每一个实际的机器学习任务中,都有一个测量结果的问题。对于部署的算法,我们可以考虑现实生活中的后果,如用户增长或财务收益,但我们需要在开发过程中更简单的性能测量。同时,不同的度量可以导致不同的评估结果,从而导致不同的选择算法。这就是为什么找到一个合适的质量衡量标准是至关重要的。

从分类和聚类到机器翻译和分割任务,许多研究领域已经产生了它们自己的一套完善的传统使用的度量方法。多年来,人们进行了几次比较性能测量的尝试,但这个问题仍然缺乏一个系统的方法。

在最近的论文[1,2]中,我们 Yandex Research 系统地分析了聚类和分类的验证方法。

绩效指标及其不一致性

分类是在无数应用中实现的典型机器学习任务。研究人员通常将预测的标签与实际标签进行比较,以使用性能度量来评估分类结果,如准确性F-度量等。但是,不同的度量表现不同。下面我们展示了降水预测任务中一些测量方法的不一致性(详见[2])。对于这个问题,分歧是巨大的。因此,它可能会极大地影响所做的决定。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

天气预报数据的不一致性(降水预报),%

聚类是另一个广泛使用的任务,它有助于各种应用程序,包括文本挖掘、在线广告、异常检测和许多其他应用程序。目标是对相似的对象进行分组。这里,质量度量的问题更加明显:我们必须将预测的分区与实际的分区进行比较,这是非常重要的。例如,你能猜出物体的哪个部分更符合由形状和颜色表示的实际部分吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集的两个候选聚类,形状表示参考分区。

如果您很难决定哪一个更好,不必担心:已知的聚类相似性度量在这个简单的例子中并不一致。例如,广泛使用的 RandAdjusted Rand、Jaccard 测度偏好左划分,而变异信息归一化互信息偏好右划分。还有许多其他的聚类相似性度量,选择正确的一个是有争议的。

如何选择正确的衡量标准

因此,我们来了一个问题:如何选择一个合适的措施?为了回答这个问题,我们采取了一种理论方法。首先,我们定义一些性能度量所需要的属性。例如,对于一个完美的预测,人们会期望一个度量达到其最大值,而不完美的预测会有较低的分数。

恒定基线是的一个显著属性。它需要一种方法来避免偏向特定的类大小(用于分类)或聚类大小(用于聚类)。这种偏好可能会导致无意中选择部署更差的算法。事实证明,对于分类和聚类任务,几乎所有常用的度量都存在偏差。

公式化属性后,我们正式检查每个属性的多个已知度量。重要的是,我们的研究并没有提出所有应用都应该选择的“完美测量”。相反,当特定应用需要特定属性时,我们提供一种工具来帮助拒绝一些不合适的措施。下面是一些二元分类方法(包括建议的方法)的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二元分类测度的性质

其他发现

我们的正式方法导致进一步令人兴奋的见解。例如,我们注意到没有一个性能度量同时满足所有的属性。特别是,不存在具有恒定基线属性并且可以线性转换为度量距离的测量。事实证明这在理论上是不可能的,也就是说这两个性质中至少有一个要舍弃。

如果我们放松恒定基线性质,但要求它保持渐近,我们有一个满足所有其余性质的措施。该相关距离可用于分类和聚类评估【1,2】。

如果我们放弃距离的要求,其余的性质也可以同时得到满足。对称平衡精度是一种非常有趣的测量方法——标准平衡精度与其对称精度之间的平均值。这种方法以前没有用于分类评估,它的类似物也很少用于聚类评估。有趣的是,对称平衡精度的良好特性对于多类分类也得以保留。这是唯一有这个优势的措施。

我们希望我们的工作将促进对其他更复杂任务的性能测量的进一步研究。

[1]Martijn gosgens,Alexey Tikhonov 和 Liudmila Prokhorenkova。“聚类相似性指数的系统分析:如何验证验证措施”ICML 2021。
[2]马丁·格斯根斯、安东·日扬诺夫、阿列克谢·吉洪诺夫和柳德米拉·普罗霍伦科娃。
“好的分类措施以及如何找到它们。” NeurIPS 2021。

谷歌分析是数字营销,但数字营销不是分析

原文:https://towardsdatascience.com/google-analytics-is-digital-marketing-but-digital-marketing-is-not-analytics-ba73cbb4ee69?source=collection_archive---------30-----------------------

这些学科应用不同的方法和工具来进行分析,但最重要的是有着非常不同的目标

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

米利安·耶西耶在 Unsplash 上拍摄的照片

使用数据做出明智而及时的决策已经成为大多数现代企业和组织的成功因素。同时,随着存储和计算能力的增加,以及新技术和应用的发展,如社交网络的扩展,智能手机、基于物联网的设备的广泛使用等。数据的数量和格式发生了巨大变化,分析和处理数据的可能性令人印象深刻。

可能由于这种突然的发展,对于在庞大的数据生态系统中共存的不同专业人员的活动和角色,存在许多困惑和误解。

最常见的误解之一是将数字营销甚至市场研究与商业智能和分析混为一谈。这些学科应用不同的方法和工具来进行分析,但最重要的是有着非常不同的目标。

术语“谷歌分析”和“分析”经常被营销人员互换使用。实际上,它们代表了两个完全不同的概念。也许这种混淆的原因是 Google Analytics 和 Analytics 都将他们的分析建立在可测量的指标上,但这是相似之处结束和显著差异开始的地方。

让我们首先解释什么是数字营销,特别是这个学科用来产生信息的机制。

数字营销与通过数字渠道展示的广告有关,如搜索引擎、社交媒体、网站、电子邮件、移动应用程序。这是一个庞大的渠道系统,每个营销人员都应该将它整合到他们的业务中,这样他们就可以在世界各地提供产品和服务,而不用考虑国家和大陆。由于这种广告形式覆盖的范围很广,与传统方法相比,它成倍地增加了销售的可能性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上的照片

为了更好地了解互联网及其广告渠道的复杂世界,从而能够应用最佳公式来实现产品的成功,营销人员将需要专门的支持,如 Google Analytics 提供的支持,以便跟踪网站活动:总点击量、会话持续时间、每次会话的页面数、跳出率等。使用该网站的人的信息,以及流量来源的信息。

这些指标通常在广告仍在运行时可用,因此通常用于提高活动绩效。如果一些广告在特定指标上优于其他广告,将预算从低性能广告转移到高性能广告可能是有意义的。

广告商可以选择使用多种指标来优化他们的广告。例如,他们可能会查看视频视图,以了解哪个视频频道最适合更广泛地展示他们的信息,同时查看视频完成率,以判断哪个版本的广告最吸引观众。一般来说,您使用的度量越多,您获得的信息就越多,当然,前提是这些度量是相关的。

然而,值得注意的是,在营销领域,并非所有的决策都基于 Google Analytics 指标,许多市场研究和数字营销专业人员仍然使用主观衡量标准,如从定性方法中获得的标准。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由格伦·卡斯滕斯-彼得斯Unsplash 拍摄

例如,定性测量可能试图测量客户交互的质量。这些评论可以是营销活动前后撰写的评论,其中每个评论都有一个评级。这些质量审查基于简单的调查,如是或否问卷或标记预设答案。

有几种技术可以用来获得质量评估,一些最常用的是:调查、焦点小组、访谈和标杆管理。总的来说,尽管这些方法具有很高的主观性,但一些营销人员继续使用它们来试图更深入地了解消费者对各种话题的想法和观点。

定性方法,如果设计良好,应用正确,可以用于调查消费者行为中不太明显的方面。

当这些技术与定量方法结合而不知道如何做时,问题就出现了,更糟糕的是,仅仅因为你在使用数字尺度就相信定性测量是定量的,这是一个错误,经常退化为一系列无意义的“统计分析”。

由于这个原因,最近几年人们非常重视用数据分析的基本原理来装备所有商业职业的重要性。这种新技能被称为“数据文献”。该学科旨在强化每个专业人员都需要的必要知识,以便能够进行与其职业相关的主要数据分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pakata GohUnsplash 上拍摄的照片

另一方面,业务分析、数据分析或简单的分析是一个分析任何类型的业务数据的过程,以将其转换为有用的信息,帮助业务领导者、经理和其他最终用户做出明智的决策。

分析包括各种各样的概念、技术、应用和工具,使分析师能够收集、清理、分类、调整和分析数据。

该流程的结果应允许开发和执行数据查询,创建报告、数据可视化(数据 Viz)和仪表板,以可访问和清晰的方式提供公司决策者所需的信息。

通过使用分析,还可以配置工作流,以便在组织中更多更好地使用数据。

数据科学家或数据分析师也可以直接向其他部门的同事报告,根据他们的分析结果做什么。例如,可以创建解决方案,以便即使是未经培训的人也可以使用基于 R 或 Python 等专门程序的应用程序来更快更轻松地完成工作。优化工作流的最有效方法之一是基于机器学习模型的实现,只要目标和数据允许。

市场研究和数字营销也不是商业智能。BI 是一个定义非常明确的学科,属于业务分析,它使用特定的数据分析和可视化工具(仪表板)来描述业务的当前状态,并提供组织支持决策所需的最相关的信息。

商业智能可以涉及公司价值链的不同阶段,从绩效指标(KPI)的分析,到与供应链、生产、销售相关的指标,甚至是基于不同历史数据组合的未来业务场景的评估。

在 BI 分析中,与任何其他数据分析一样,必须使用特定的工具对来自不同来源的原始数据进行集成、整合和清理,以确保最终用户处理准确一致的信息。

虽然有些分析非常简单,甚至可以使用 Excel 电子表格来报告见解,但 BI 平台作为集成数据系统的前端接口越来越受欢迎。这是因为 BI 工具不仅允许以更加实用和简单的方式处理大量数据,而且允许大量用户参与同一个项目,而不是典型的单一分析师方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马文·迈耶在 Unsplash 上的照片

因为分析适用于公司中的所有数据,所以它也适用于营销数据,我们可以称之为“营销分析”,但这也与数字营销或市场研究无关。这只是使用营销指标作为输入的数据分析的应用。

同样,这种方法可以应用于其他类型的数据,例如来自人力资源部门的数据,在这种情况下,它被称为“人员分析”

不仅营销使用的方法和工具与分析使用的方法和工具非常不同,而且它们的目标也非常不同。

让我们记住,营销的主要目标是销售产品或服务,从这个意义上说,营销专业人员将尽一切努力使购买决策有利于他们的建议,无论相对于其他选择有多好。

相反,分析试图探索所有可能的选项,分析风险并识别机会,以便为做出最佳决策提供必要的支持。

例如,在分析术语中,在没有令人信服的技术理由的情况下,支持或反对某一特定选项的行为被称为偏见。

正如我们所看到的,这些学科的名称有时会被混淆,但显然位于同一根绳子的两端。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由merit ThomasUnsplash 上拍摄

关于这一点,在 Cassie Kozyrkov(谷歌公司首席决策科学家)最近在 LinkedIn 上发表的一篇文章“误解 2:分析与新闻/营销”中,她写道:

“分析不是营销。区别在于,分析是为了扩大决策者的视角,而营销是为了缩小视角。”

在数据世界中,除了这里显示的错误概念之外,还有其他错误概念,像这样的文章的主要目的是揭示一些概念,这些概念即使对于经验丰富的专业人员来说也是令人困惑的。我认为所有的角色都同样重要,但最重要的是知道我们在哪里,不要混淆梨和苹果,因为我们对自己的道路越清晰,我们就可以开发更多更好的东西,并与周围的人分享。

面向 MLOps 的谷歌云服务

原文:https://towardsdatascience.com/google-cloud-services-for-mlops-d1702cd9930e?source=collection_archive---------22-----------------------

探索 Google 云平台上的 MLOps 选项

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Pexels 的 Axel Vandenhirtz 的照片

MLOps 是实践,而不是工具的故事中,我描述了 MLOps 的价值和核心组成部分。主要目标是远离特定的工具,强调人和过程。重点是什么(MLOps 定义)和为什么(考虑 m lops 的原因)。在这里,我将开始解决如何的问题,特别是如何使用谷歌云平台服务(以下简称 GCP 服务)来加强你的 MLOps 实践。

假设你想在机器学习中实现一个连续的交付和自动化管道。在这种情况下,有几种谷歌技术可以利用,我将区分两类:GCP 服务和人工智能管道功能。您的选择在很大程度上取决于您的环境、目标和 MLOps 成熟度。

这个故事分为三个部分:

  • MLOps 成熟度模型
  • 面向 ML 工作流的 GCP 服务
  • GCP 的 MLOps 框架(人工智能平台管道)

m lops 成熟度模型

您可以通过考虑您在 AI 项目中的自动化和可重复性水平来评估您的 MLOps 成熟度。本文中提出的一种方法是定义三个级别:

  • MLOps level 0 是人工智能计划的手动流程。
  • MLOps 一级带来 ML 流水线自动化。
  • ML ops 2 级支持所有 ML 活动的完整 CI/CD 渠道。

现在,您如何在您的组织中利用这种成熟度模型呢?首先,您需要了解您当前在 MLOps 实践方面的成熟度水平,这可以通过成熟度评估练习来完成。该评估将帮助您识别您在 ML 中的优势和劣势,不仅从过程的角度,而且从考虑现有的人员和工具的角度。

如果你不打算采取行动,做一个成熟度评估毫无意义。做评估的目的不是获得一个分数,而是确定你在哪里,你想去哪里。因此,下一步是确定您希望达到的目标 MLOps 水平。一旦你有了一个目标,你就可以做一个差距分析来确定你当前的状态和你的最终目标之间缺少什么。这些信息将帮助您定义实现目标的不同步骤(路线图)。

差距分析对于从人员、流程和技术角度理解如何改变您的组织至关重要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

差距分析,以确定目标状态和实现目标的路线图。

协调 ML 工作流程的 GCP 服务

现在让我们假设您的 MLOps 过程已经定义,并且您最终准备好利用工具来支持您的 AI 实践。

您将寻找一个支持整个机器学习生命周期的技术解决方案,从发现和可行性到模型实验和操作化。该工具必须理想地自动化人工智能实验、模型训练和评估、模型部署和模型监控的一些或所有方面。

GCP 有多种选择来支持这一需求。通常情况下,没有放之四海而皆准的解决方案。你必须根据你的目标和现有的团队来决定。为了满足不同的需求,选择多种工具是绝对没问题的。

首先要考虑的是 Google Cloud AutoML 。为什么是 AutoML?因为它将负责人工智能团队通常必须进行的许多活动。

使用 AutoML,您注入数据,它会训练一个与您试图解决的问题相关的模型。然后,您可以使用经过训练的模型,并将其用于在线或批量预测。AutoML 提供了一条捷径,并加速了几个典型的 ML 典型任务,如数据探索、数据准备、特征工程、模型选择、模型训练、模型评估和超参数调整。AutoML 简化了人工智能过程,并自动化了通常是 MLOps 一部分的任务。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GCP 的自动化:从数据采集到预测

Google Cloud 上 MLOps 的另一个选择是使用 GCP 服务创建一个管道。如前所述,MLOps 完全是关于人工智能任务的自动化,以支持端到端的生命周期。您可以使用完全托管的 GCP 服务来自动化数据提取、数据准备和模型训练。让我们以四个基本的 GCP 服务为例:BigQuery、云存储、AI 平台和 Cloud Composer。

您可以使用 BigQuery 进行探索性数据分析和数据准备(结构化或半结构化数据)。你可以在云存储中存储非结构化数据(图像、视频、音频),你可以使用人工智能平台来训练回归或分类问题的模型。您可以使用 Cloud composer 来编排从开始(数据采集)到结束(服务和监控)的流程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编排 ML 工作流程的简单 GCP 服务。

GCP MLOps 框架

我刚刚介绍了一些支持基本 MLOps 流程的简单 GCP 服务选项。但是对于更高级的需求,您可能想要考虑使用 MLOps 框架。目前最受欢迎的是 Kubeflow Pipelines 和 Tensorflow Extended (TFX)。两者都是开源框架,在 GCP 上得到完全支持。

Kubeflow 是一个 Kubernetes-native 机器学习工具包。使用 Kubeflow Pipelines ,您可以基于容器构建和部署可移植的、可伸缩的端到端 ML 工作流。Kubeflow 最初是 Google 的一个内部项目,后来它被开源了,现在它可以在任何支持 Kubernetes 的地方运行(云和本地)。

使用 Kubeflow,第一步是使用特定的 SDK 创建管道定义。一旦定义了管道及其不同的组件,您需要创建一个 Kubeflow 实验来运行管道。然后,各种组件被封装起来,作为工作流在 Kubernetes 集群上执行。

另一个流行的 MLOps 框架是 Tensorflow Extended (TFX)。TFX 始于 2017 年,是谷歌的一项内部计划,并迅速成为大规模端到端 ML 的首选框架,不仅在谷歌内部,而且在所有其他 Alphabet 实体中。然后在 2019 年,TFX 成为公开的开源软件。

TFX 是一个配置框架,它提供了定义、启动和监控 Tensorflow 机器学习系统的组件。TFX 库中有多个组件,您可以根据您的 MLOps 需求组装它们,以创建一个有向无环图(DAG 是您的 TFX 管道)。管道通常会混合数据接收和验证、数据转换、ML 建模、模型分析和模型服务步骤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TFX 组件(图片来自https://www.tensorflow.org/tfx)

如果 TFX 提供了定义管道所需的一切,那么您必须利用外部的编排器来运行管道。在撰写本文时,TFX 支持的 orchestrators 是 Apache Airflow、Apache Beam 和 Kubeflow。这一步非常简单,因为它主要是管道中的一个配置,您可以在其中指定想要使用哪个编排。

Kubeflow 管道和 TFX 都通过 AI 平台管道在 Google Cloud 上得到支持,因此您可以选择最适合您的 MLOps 实现的方式。

使用 AI 平台管道,您可以全面了解工作流程中的不同步骤。您还可以与其他 GCP 服务集成,例如作为数据源的云存储或 BigQuery,用于转换的数据流,或用于训练和服务模型的人工智能平台。

当需要为您的 MLOps 实践选择工具时,Google Cloud 提供了多个选项来满足从最基本到最高级的需求。

做出明智决策的一个关键驱动因素应该是您的 MLOps 成熟度。没有放之四海而皆准的方法。有时,一组简单的编排好的 GCP 服务就足够了(AutoML、BigQuery、云存储、AI 平台训练和 Cloud Composer。)但对于其他场景,支持 Kubeflow 管道和 Tensorflow Extended (TFX)的 AI 平台管道服务将是端到端 ML 工作流的更好选择。

Google 云存储(GCS)让 BigQuery 变得简单

原文:https://towardsdatascience.com/google-cloud-storage-gcs-to-bigquery-the-simple-way-4bb74216b8c8?source=collection_archive---------6-----------------------

因为简单比复杂好(但复杂比复杂好)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谁不爱一朵简单的云。在 Unsplash 上由 C Dustin 拍摄的照片

我部署的第一个云功能就是为了完成这个任务。我们每天晚上都有大量 CSV 文件被放入 Google 云存储桶中,这些文件需要在 BigQuery 中进行转换和分析。

花了一些时间在谷歌上,我来到了这个操作指南,它有点不同(JSON 文件而不是 CSV),但我想我可以稍微调整一下,让它工作。毕竟,在软件和数据工程的世界里,这是一个非常普通的工作流程:找到一些几乎做你需要的事情,弄清楚它是如何工作的,然后调整代码来做你需要的事情。而且成功了!我花了一整天全力以赴地工作,但最终我们有了一个正常工作的数据管道,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将数据从谷歌云存储传输到 BigQuery。图片来自https://cloud . Google . com/architecture/streaming-data-from-cloud-storage-into-big query-using-cloud-functions

三个云存储桶,三个 Python 云函数,两个 PubSub 主题,一个 Firestore 数据库,一个 BigQuery 数据集,六杯咖啡和一只梨树上的鹧鸪,我们准备好了!总共有十种不同的云资源,所以有十个不同的地方可以检查是否有问题(在某些时候几乎总是会有问题,尽管可能不是以你期望的方式)。

快进到现在(更多的云功能被开发、调试、部署,并且大部分都被淘汰了……稍后会有更多的介绍),我的想法转向了Python 的禅,特别是第 3 和第 4 点:

简单比复杂好。

复杂总比复杂好。

但是复杂和复杂有什么区别呢?根据剑桥词典:

复杂 (形容词):涉及许多不同但相关的部分

复杂的 (形容词):涉及很多不同的部分,以一种难以理解的方式

现在我看看上面的架构图,它看起来并不复杂。看起来很复杂。

一定有更好的方法。

结果是有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以简单的方式从 BigQuery 查询 GCS 数据(图片由作者使用

事实证明,如果数据在云存储桶中,您根本不需要将数据流式传输或加载到 BigQuery 中,您只需要使用外部表的魔力。

简单吧?您只需通过 UI 或 DDL 在 BigQuery 中创建一个新表(本质上是在 BigQuery SQL 编辑器中用 SQL 执行管理任务的一种方法)。在 UI 中,您必须确保将表格类型从默认的Native table更改为External table,因为忘记这样做将导致一个静态表格,该表格不会拾取新数据。

DDL(数据定义语言)实际上非常简单,在这种情况下:

CREATE OR REPLACE EXTERNAL TABLE `myproject.mydataset.mytable`
OPTIONS (
  format = 'CSV',
  uris = ['gs://mybucket/*.csv']
)

这里重要的部分是*。因为这意味着任何出现在 bucket 中的新文件都会立即出现在 BigQuery 中。您还可以通过添加不同 URIs 的列表来聚合多个存储桶中的文件:

CREATE OR REPLACE EXTERNAL TABLE `myproject.mydataset.mytable`
OPTIONS (
  format = 'CSV',
  uris = ['gs://mybucket01/*.csv', 'gs://mybucket02/*.csv']
)

或者通过在 URI 中包含文件夹路径,从不同的子文件夹创建表:

CREATE OR REPLACE EXTERNAL TABLE `myproject.mydataset.mytable`
OPTIONS (
  format = 'CSV',
  uris = ['gs://mybucket/subfolder/*.csv']
)

甚至过滤不同文件名:

CREATE OR REPLACE EXTERNAL TABLE `myproject.mydataset.mytable`
OPTIONS (
  format = 'CSV',
  uris = ['gs://mybucket/filename_stem*']
)

然而,您受到每个 URI 只能使用一个通配符这一事实的约束,因此,如果您想将不同的文件过滤到不同的表中,并确保可以在 BigQuery 中查询新数据,不同的文件类型将需要共享一个文件名词干。

最后一步是将文件名添加到 BigQuery 中。实际上有一个名为 _FILE_NAME 的伪列,它将原始文件名传递到外部表中,但是您必须显式地查询(并重命名)它以使其可用。最简单的方法是使用下面的 SQL 通过 UI 创建一个视图:

SELECT *, 
_FILE_NAME AS filename 
FROM `myproject.mydataset.mytable`

或通过 DDL:

CREATE OR REPLACE VIEW `myproject.mydataset.myview`
AS
SELECT *, 
_FILE_NAME AS filename 
FROM `myproject.mydataset.mytable`

厉害!

嗯,也许吧。希望这一切都完美地工作,您的实时数据是可查询的,并且您对自己构建了一个简单、轻量级、无服务器、零维护的数据“管道”感到非常满意(从技术上来说,它甚至不能称为管道,因为您实际上没有移动任何数据)。

但事情并不总是这么简单。为什么?

一个词:图式。

如果(这是一个很大的假设)模式自动检测能够完美地工作,那么这种方法就非常有效。如果您查看文档,您会注意到为了推断模式:

BigQuery 通过在数据源中选择一个随机文件并扫描多达 100 行数据作为代表性样本来启动推断过程。然后,BigQuery 检查每个字段,并尝试根据样本中的值为该字段分配一种数据类型。

但是如果这 100 行不能代表所有的数据呢?如果分析的行都是有效的整数,但其他行也包含字母字符?如果 BigQuery 将类型推断为 INT64,这将导致您对数据运行的任何查询都失败,这显然不好。

我的朋友,这意味着你可能处于 BigQuery 模式管理的世界中,一个你可能会也可能不会完好无损(或神志清醒)的兔子洞。或者您可能需要使用另一种方法或外部工具来自动管理模式更改,但是您试图保持简单。你只是想让它稳定可靠地工作。一劳永逸。

“你吃了蓝色药丸……故事结束,你在床上醒来,相信你想相信的一切。你吃红色药丸……你呆在仙境,我让你看看兔子洞有多深。”—墨菲斯,《黑客帝国》(1999 年)

还有一个办法,我的朋友。不吃药。

处理这种模式挑战(以及系统之间许多不同的数据类型问题)的最简单方法是:

  1. 创建一个外部表,将的所有数据类型设置为字符串
  2. SAFE_CAST 将所有字段转换为正确的数据类型

看起来很简单,对吧。

是啊,没那么简单。怎么把所有东西都设置成 string?这不是 UI 中的一个选项(但如果是就好了)。如果你有数百列呢?您真的不希望手工编写 SQL 转换代码,因为 a)这将花费很长时间,b)您几乎肯定会在某个地方犯一个(可能永远无法发现的)错误。

有很多简单的变通方法可以做到这一点,但是最好的方法——不需要外部工具,不需要通过 API 或使用 CLI 进行交互——是使用一些相对较新的 BigQuery 功能:脚本。

但那是另一天的主题…

希望这已经对一些人有所帮助,并消除了(至少一些)你未来生活中的并发症!

最令人满意的问题是那些当你足够认真地看待它们时就会消失的问题——我,2021

如果您觉得这(以及其他相关材料)有用和/或有趣,请跟我来!

如果您还不是会员,请加入 Medium,从这个活跃、充满活力和激情的数据人社区每月只需 5 美元就能获得无限的故事。也有很多其他人,但是如果你对数据感兴趣,那么这里就是你要去的地方…

谷歌 colab 笔记本已经在运行 Deepmind 的 AlphaFold v. 2

原文:https://towardsdatascience.com/google-colab-notebooks-are-already-running-deepminds-alphafold-v-2-92b4531ec127?source=collection_archive---------7-----------------------

全球数百名科学家已经从这一革命性的软件中获益。而且是免费的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另见我的两个涉及不同方面的后续故事:

上周(2021 年 7 月),Deepmind 的同行评审学术论文发表在 Nature 上,描述了其预测蛋白质结构的 CASP 获奖 AlphaFold v.2 程序的所有细节。同时,他们在 Github 上发布了它所有的代码开源。在几个小时内,一些科学家创造了谷歌 Colab 笔记本,每个拥有免费谷歌账户的人都可以用自己喜欢的蛋白质运行 AF2,而无需下载其 2.2 TB 的任何一点,也不需要任何硬件。使用这些程序进行研究的 CASP 评估员的故事。

2020 年 12 月,一个名为 CASP 的组织举办了一场预测蛋白质三维形状的“比赛”,该组织透露,Deepmind 的 AlphaFold (AF2)版本 2 以相当大的差距“赢”了亚军。许多媒体称 AF2 解决了一个 50 年的老问题。虽然这是一种夸张,但 AF2 对生物学的贡献是巨大的,有望减轻实验蛋白质结构测定的负担,并加速分子生物学的研究。尽管有这些好消息,世界各地的科学家还是引发了负面情绪,这些情绪与据称的技术不可获得性、缺乏再现性的细节以及急于知道运行 AF2 是否超出学术预算有关。但是事情已经完全不同了,而且是永久性的。

上周(2021 年 7 月),Deepmind 的同行评审学术论文发表在 《自然》 上,描述了其预测蛋白质结构的 CASP 获奖 AlphaFold v.2 程序的所有细节。与此同时,他们在 Github 上发布了所有的代码开源。一些科学家仍然抱怨数据文件太大(实际上有 2.2 TB)。然而,在几个小时内,一些专注的科学家创造了谷歌 Colab 笔记本电脑,每个人都可以使用免费的谷歌帐户运行 AF2,甚至不需要下载数据,也不需要任何特殊的硬件。事实上,所有的计算都发生在云上,但都在一个免费的 colab 空间内,这使得用户能够对运行进行微调。在经历了如此多的负面情绪后,所有这些都被认为是使技术大众化的最佳方式之一。感谢谷歌!

目录

一些背景:蛋白质结构、实验测定和基于计算机的蛋白质结构预测

蛋白质是生物“纳米机器”,由长的、基本上线性的氨基酸链组成,这些氨基酸链采用所谓的结构进行三维折叠。自然界中有 20 种氨基酸,它们在每个蛋白质中以独特的方式重复,由每个蛋白质编码基因决定。了解氨基酸序列很容易,因为这可以直接从基因组中推断出来。但是要了解它们在 3D 空间中的排列方式是很困难的。而且,每个氨基酸就像一个由几个原子组成的小分子;因此,了解蛋白质的 3D 形状或“3D 结构”需要确定其所有氨基酸的所有原子的相对位置。例如,给定由字母 A、C、D、E、F、G、H、I、K、L、M、N、P、Q、R、S、T、V、W 和 Y 表示的 20 种标准氨基酸,称为泛素的蛋白质由以下序列组成:

MQIFVKTLTGKTITLEVEPSDTIENVKAKIQDKEGIPPDQQRLIFAGKQLEDGRTLSDYNIQKESTLHLVLRLRGG

…在 3D 中折叠成这样,每个原子显示为一个通过棒与其他原子相连的球体,每个氨基酸(即上面序列中的每个字母)以不同的颜色显示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

泛素的原子结构。图片作者。

但是,请注意,我们通常通过仅显示近似 3D 形状的轨迹来简化这些图形:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代表泛素三维结构的轨迹。图片作者。

每次 AlphaFold 在聚光灯下,你可能都会看到这种类型的图纸。

了解蛋白质的三维形状在生物学和任何相关学科中都是必不可少的。仅举数百个例子中的两个,生物技术应用的酶实际上是一类特殊的蛋白质。抗生素、化疗剂和药物等绝大多数化合物的目标都是小分子,其作用依赖于识别和结合蛋白质的三维特征。

结构生物学是试图在原子水平上解释生物系统的学科。这主要取决于相关分子结构的可用性,其中最重要的通常是蛋白质。虽然许多结构可以通过实验技术确定,如 X 射线或中子衍射、核磁共振(NMR)或电子冷冻显微镜(也称为冷冻电子显微镜,cryo-EM),但也有使用计算方法预测或“建模”这些结构的替代方法。事实上,结构生物学家长期以来的梦想是将蛋白质序列输入计算机程序,并从中获得它所采用的三维结构。这并不容易,而且还没有完全解决,但是经过几十年对这个问题的研究,机器学习模型的入侵(当然还有大量数据的可用性)导致了 AF2(以及其他几个程序,我们必须澄清),它可以非常准确地预测许多蛋白质的 3D 结构。

自然,这种预测对于大量生物分子来说是必不可少的,这些生物分子无法在各种实验所需的数量和条件下生产。但是预测结构对于在解决结构所需的实验中可能不难生产和操纵的分子的情况也是有用的,但是对于这些分子来说,结构提供的信息量与成本和时间不相称。事实上,如果我们能够有足够的信心预测生物分子的结构,我们就可以将实验集中在特别困难的系统上(这正是结构基因组学所追求的),或者集中在研究结构扰动的影响上,比如配体与被研究蛋白质结合的影响。在极端情况下,如果我们能够在原子水平上预测一个给定系统的所有物理化学,我们就可以完全免除结构测定实验,并可以集中精力直接理解机制和这种知识允许我们做的一切:开发新的药物,设计新的酶,理解进化,…

结构预测的关键评估(CASP)

鉴于结构预测对结构生物学的影响,自上世纪中期以来,几代研究人员一直在研究这个问题,特别是蛋白质,因为它们比其他生物大分子具有更大的结构价值和多样性。已经开发了许多方法,这些方法可以分为两大类。一方面,那些使用已知结构试图预测相似序列或折叠的蛋白质结构,这被称为“同源建模”。另一方面,那些试图独立于与已知结构的其它蛋白质的任何同源性而“折叠”序列的方法,例如通过使用基于基本物理化学原理的模拟或通过使用关于小肽片段和/或残基接触的结构的信息。

随着结构建模的方法、程序和专家出现的大问题是如何评估这些预测的质量。在 20 世纪 90 年代早期,结构预测的关键评估,或 CASP,作为一个组织诞生,其目标是提供对预测蛋白质结构的可用方法的持续监测和评估。竞赛(实际上没人想称之为竞赛,但对许多人来说这就是竞赛!)每 2 年举行一次,在此期间,组织者收集尚未在蛋白质数据库中发表的实验结构。组织者将这些蛋白质的氨基酸序列提供给预测组,预测组在一段时间后将他们的预测发送给组织者。然后,一组独立于组织且不作为预测者参与的评估者将预测者提供的模型与只有评估者可以访问的实验结构进行比较。每场比赛都以一系列论文结束,这些论文描述了目标提出的难度,描述了预测者提供的模型的质量,生成了预测者的“官方”排名,并讨论了建模的“艺术状态”,特别是哪些方法有效,哪些结构问题特别难以预测,等等。在 2016 年和 2019 年之间,举行了 CASP12 和 CASP13,为此,该作者是竞赛主赛道的评估员,该竞赛侧重于预测困难的目标。这两个 CASP 开始揭示与共同进化技术一起应用的机器学习方法的破坏性力量,不仅出自 alpha fold 1(casp 13 的“获胜者”)之手,而且出自几个学术团体之手,这些学术团体在之前的几年中一直在为这些技术奠定基础。

想了解更多关于 CASP 的信息,请看另一个故事。要查看 CASP12 和 CASP13 论文(技术同行评审文章),请参见我分子建模和序列分析下列出的关于蛋白质建模的出版物。

蛋白质建模的机器学习方法,Deepmind 及其 AlphaFold 1 程序

2018 年 12 月,CASP 透露,有史以来第一位私人玩家“赢了”。这是谷歌字母表小组的 Deepmind。Deepmind 的程序 AlphaFold 的第一个版本排名第一,大大高于第二名,但不是明星。此外,尽管它发明并实施了一些新的想法,但其核心主要是将学术界在过去几年中所做的事情推向极限。在关键要素中,不仅分析进入序列,还分析一系列相关序列(“序列比对”),这些序列对应于通过略微不同的序列实现相似 3D 折叠的蛋白质。关键是,在进化过程中氨基酸会发生变化,但在空间上接近的氨基酸对必须保持一定的亲和力,从而在进化模式中引入耦合。十年来,学术界一直在分析如何从序列比对中提取这些偶联。到了 CASP12,他们开始正确地做这件事,在结构预测方面带来了小小的改进。到 CASP13 时,许多小组都在做,但一些学术小组和 AF1 也利用这一信息不仅预测了接触的氨基酸对,还预测了它们之间的距离,甚至它们的相对方向。这些中间预测然后被不同的程序使用,包括 AF1,来模拟蛋白质的三维结构。

AF1 是 CASP13 中评估的大多数蛋白质中最好的,你可能看到了媒体的大肆宣传。但它并不像 AF2 那样具有破坏性。

AlphaFold 版本 2

2020 年 12 月,CASP14 的结果在网上公布(由于疫情,所以我可以作为一名前评估员在那里!)表明 Deepmind 又赢了,但这一次是迄今为止实际上“解决”了一些(并不像你在媒体上看到的那样,只是一些)蛋白质结构预测中的关键问题。

像其他程序一样,AF1 作为一种不相连的模块工作。一个主要模块分析输入序列和比对,以预测氨基酸对之间的距离和方向,然后另一个模块使用这些距离和方向作为约束条件,将氨基酸的线性序列“折叠”成预测的 3D 结构。AF2 不是对 AF1 的调整,而是完全的重新设计,从输入到输出的一切都通过一个单一的模型,从序列到预测的 3D 结构。这意味着网络“知道”所有连接序列和结构的物理过程。细节在他们的同行评议文章中,尤其是在它的支持信息中。在中级阶段,卡洛斯·奥特拉尔的职位是。

下面的图总结了自四分之一世纪前开始以来 CASP 取得的进展(我是在 2002 年才知道 CASP 的,当时我刚刚了解蛋白质结构!).经过多年相当差的预测能力(注意这个图只针对硬目标!)你可以看到从 CASP11 到 CASP12 的明显改进(还没有 AlphaFold),然后是从 CASP13 的另一个跳跃,不仅是由于 AF1,而且是在整个社区,然后是 CASP14 的最新改进,学术方面也有所改进,但不如 Deepmind 那么多,它打破了质量的障碍。此外,它的预测一直很好,正如你在相当低的离差中看到的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CASP 的时间演化。对于每个 CASP 版本,我绘制了针对所有困难目标的最佳模型的 GDTTS 中位数(+/-中位数偏差)。GDTTS 是 CASP 的主要指标之一:得分低于 30–40 的模型相当差,高于 50–60 的开始相当好,高于 80–90 的表示与实验结构非常一致。图片作者。

AF2 的预测是如此之好,它不仅得到了正确的整体形状,还得到了大多数原子的精确位置。在我上面展示的蛋白质图形示例中,这意味着不仅要正确猜测轨迹的走向,还要准确猜测构成每个氨基酸的所有原子的位置。它得到了一些非常大的蛋白质(通常更大的蛋白质更难建模)。它甚至得到了一些蛋白质-蛋白质复合物,这是 CASP 中一个完全不同的轨道,仍然落后。

AF2 对 CASP14 的预测如此之好,以至于他们的一些模型被用于完成一些 CASP14 靶标的实验结构测定。这种情况在之前的 CASPs 中只发生过几次。

最后,AF2 不仅是蛋白质结构的可靠预测因子,也是其已知结构质量的良好预测因子。这是蛋白质结构预测领域的关键,但却被开发者和用户所忽视。一个带有相关质量评估的模型要比一个缺乏任何正式质量评估的假定好的模型丰富得多。所有严肃的团体都提供这样的估计,在 AF2 的情况下,Deepmind 的人确信他们的质量指标是好的。AF2 预测了一个称为 LDDT 的质量估计,CASP 用它来逐个氨基酸地比较模型和实验结构。通过这种方式,AF2 会告诉您所生产车型的不同区域的情况。

通过合作笔记本对 AF2 的民主化访问——进入分子生物学的新时代

在 CASP14 披露 AF2 的成功后,批评和怀疑立即接踵而至:“学术界无法与这些巨头竞争”,“他们做出了它,但我们将无法使用它,这很好”,以及“他们肯定不会开放使用它”是一些常见的反应。但是事情已经完全不同了。,为好。

上周,描述这个庞大的机器学习模型的全部结果的学术论文与 Github 托管的所有免费开源代码一起发布。此外,参与的研究人员(我非常感谢他们)建立了谷歌 Colab 管道,你甚至可以在手机上使用 AF2。

从 Github 下载的 AF2 重 2.2 TB,该模型将在 GPU 上运行。但是通过使用 Google Colab 你不需要下载软件,也不需要任何强大的 GPU。你只需要在云上运行一切。而且你甚至不需要了解云计算!

这两位研究人员用上面的 Twitter 帐户组装的 Colab 笔记本可以处理一切事情,从加载库和输入你的蛋白质序列到构建其比对,找到已知结构的同源物(“模板”,这当然对相关蛋白质的建模有很大帮助),运行 AF2 并显示结果:你可以在浏览器中看到 5 个 3D 模型,以及估计的 LDDT 对序列的绘图。此外,原则上,您可以派生这些笔记本中的任何一个,并进行自己的编辑,以使运行适应更具体的任务。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AF2 在 Google Colab 笔记本上运行的示例结果,此处显示了右侧的模型及其对序列的相关质量评估。图片作者。

我已经用这些笔记本做了几次测试,已经得出了一些结论。最重要的一点是序列比对和模板都有助于获得更好的模型。我看到了许多关于人们使用该工具的推文,但许多推文忽略了 LDDT 估计图。这些剧情必不可少!

对 AF2 预测的高质量的大肆宣传对我来说更加剧了实际使用它的可能性,而且如此容易。这为全世界的研究人员带来了潜力,为 AF2 的局限性和可能性的广泛基准铺平了道路。对于研究不可实验的蛋白质的生物学家来说,模拟蛋白质结构是必不可少的。正如引言中所解释的,即使你有一些数据,但不能正确使用,好的蛋白质模型也是有用的。无需深入细节,一个例子是通过分子置换对 X 射线数据进行定相的能力。另一个大的领域是使用蛋白质模型来完成实验量,例如使用原子坐标的中分辨率 Cryo-EM。随着 Deepmind 本身进入生物学的其他问题(没有透露计划,但我们可以先猜测蛋白质-蛋白质相互作用,然后进行小分子设计),以及学术界可以从 AF2 应用和现在公开的所有知识中直接获利,未来甚至更加光明。

长期以来,生物学工作一直依赖于计算机和经典软件。现在是 AI 的时代。

更多链接和阅读

TDS 编辑:https://towards data science . com/alpha fold-based-databases-and-fully-fledged-easy-use-alpha fold-interfaces-horizing-BAF 865 c6d 75 e中看到我的后续故事

还有这个的后续故事TDS Editors 中讲述了 AlphaFold2 与调用一个出色的序列比对构建器 MMSeqs2 的结合,让用户在简单的 Colab 笔记本上充分利用这项技术:https://towards data science . com/the-hype-on-alpha fold-keep-growing-with-this-new-preprint-a8c1 f 21 d15 c8

Google colab 笔记本也可以用来运行分子动力学模拟,见本故事 TDS 编辑:https://towards data science . com/new-preprint-descriptions-Google-colab-notebook-to-efficient-run-molecular-dynamics-simulations-of-9b 317 f 0e 428 c

AlphaFold 2 论文自然

Github 中的 AlphaFold 2 代码

牛津蛋白质信息学小组 Carlos Outeiral 的博客文章:Google deep mind 的 AlphaFold 2 真正实现了什么,对蛋白质折叠、生物学和生物信息学意味着什么。非常有趣的第一个想法和回顾在第 14 章发生了什么。

牛津蛋白质信息学小组 Carlos Outeiral 的博客文章:结构预测奇迹的背后是什么。比我在这里给你的更详细,但比《自然》杂志的文章简单。

喜欢这篇文章,想给我提示?【https://www.paypal.me/LAbriata】-谢谢!

我是一个自然、科学、技术、编程和 DIY 爱好者。生物技术专家和化学家,在潮湿的实验室和计算机里。我写我广泛兴趣范围内的一切。查看我的 列表 了解更多故事。 成为媒介会员 访问我和其他作家的所有故事, 订阅通过邮件获取我的新故事 (平台原创附属链接)。

Google Colab Pro+:值 49.99 美元吗?

原文:https://towardsdatascience.com/google-colab-pro-is-it-worth-49-99-c542770b8e56?source=collection_archive---------2-----------------------

谷歌刚刚发布了 Colab 的新订阅计划:Pro+。新变种是否值每月 49.99 美元?我看了看新包装。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

Google Colab 在家做深度学习,准备和分享数据科学案例,相互协作,越来越受欢迎。就我个人而言,我使用 Google Colab 主要是为了 Kaggle 比赛。所以我很好奇新的订阅选项会提供什么。

两年前,谷歌发布了 Colab Pro。这是 Colab 的第一个付费订阅选项。每月 9.99 美元,专业用户可以获得更快的 GPU,如 T4 和 P100,如果资源可用的话。此外,pro 版本的运行时间更长,实例连接时间长达 24 小时。在免费版本中,运行时间限制为 12 小时,RAM 也限制为 16 GB。在 pro 版本中,可以选择高内存选项,从而使用 32 GB 的 RAM。Google Pro+变种现在提供了更多的选择,可以在没有云服务器或本地机器的情况下相对便宜地运行深度学习。让我们看一看。

肌肉——GPU 和内存

Colab Pro+提供对与 Colab Pro 相同的 GPU 的访问。但是,如果资源不足,Pro+用户将被优先考虑。在 RAM 方面,Pro+又出现了一个显著的变化。

虽然 Colab Pro 提供 32 GB 的内存,但 Pro+用户可以通过高内存选项获得 52 GB 的内存。

这大约是专业用户的 1.6 倍,免费用户的 3.25 倍。这意味着大量数据也可以在 GPU 应用程序之外进行处理。

运行时间

连接的持续时间在机器和深度学习中非常重要。在免费版本中,笔记本电脑在 12 小时后断开连接,在专业版本中,在 24 小时后断开连接。一直困扰我的是,浏览器必须保持打开,否则在我的体验中,大约 90 分钟后就会断开连接。这对于密集的生态测试是没有用的,因为本地机器必须一直开着。浏览器崩溃时有发生。

H ere Pro+在我看来提供了最重要的创新之一:后台执行。在训练被触发后,虚拟机继续运行长达 24 小时**,而**浏览器不必保持打开。

模型和数据仍然存储在工作空间中。我总是将数据直接推送到我的 Google Drive,这使得后台执行更加有用。

有效性

不幸的是,目前可用性没有任何变化。Colab Pro 和 Colab Pro+在以下国家均有销售:美国、加拿大、日本、巴西、德国、法国、印度、英国、泰国。在这些国家/地区之外,Pro 或 Pro+套餐不可用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Colab 订阅计划的比较;作者图片

结论

从我的角度来看,如果有人持续使用 Colab Pro+服务,并且还想培训大型模型,例如在迁移学习领域,那么 Colab Pro+是值得的。最重要的新特性是后台执行。52 GB RAM 也是一个有用的升级,因为过去我经常用完 Colab Pro 中的 32 GB RAM,导致运行时崩溃。此外,当我长时间密集使用 GPU 和高内存引擎时,我更经常被服务阻止。在那些时刻,Colab Pro+的进一步优先化会帮助我。如果您只是偶尔使用 Colab,即一个月几次,那么升级肯定是不值得的。

进一步阅读

如果您喜欢中级数据科学,并且还没有注册,请随时使用我的推荐链接加入社区。

谷歌数据分析专业证书:综述

原文:https://towardsdatascience.com/google-data-analytics-professional-certificate-a-review-a426b12a35?source=collection_archive---------0-----------------------

对于有抱负的非传统背景的数据分析师来说,这是一个有价值的证书

(我推广这门课程没有报酬。这是我个人的看法。)

2021 年 3 月,谷歌推出了数据分析专业证书。这来得正是时候,因为分析角色的供应落后于需求,导致市场上数据分析师短缺。

近年来,对数据分析角色的需求激增,导致高薪分析角色的空缺数量增加。事实上,根据 Burning Glass 的数据,仅在美国就有 33.74 万份数据分析工作,平均入门级工资为 6.79 万美元。

同时也有很多非传统背景的应届毕业生和专业人士(比如我自己!)想进入数据空间的人。

这听起来像你吗?如果是的话…继续读下去。

作为一名数据分析师,我喜欢与来自非传统背景的学习者分享数据分析的知识。今天,我希望能够分享我对这门课的想法。作为一家科技公司 Gojek 的数据分析师,我知道数据分析师需要什么。今天我就分享一下我作为从业者对 Google Analytics 证书的看法。

什么是数据分析?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卢卡斯·布拉塞克Unsplash 上拍摄

此时,您可能想知道…什么是数据分析?根据谷歌的说法,

数据分析是对数据的收集、转换和组织,以便得出结论、做出预测和推动明智的决策。

简而言之,我用数据帮助人们做决定。这可以以提取数据、可视化数据甚至建模数据的形式出现。

本谷歌分析课程涵盖了成为分析师的基础知识,包括掌握分析师日常工作所需的工具。

您将学习的工具

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SQL 是必不可少的工具。卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片

该证书涵盖了您作为数据分析师所需的日常工具。这使得它成为一门非常实用的课程。这些工具包括

  1. 像 Excel 或 Google Sheets 这样的电子表格(绝对必要!)
  2. SQL(用于数据提取)
  3. Tableau(用于数据可视化)
  4. R、RStudio、R Markdown 和 Tidyverse 包(用于编程和数据争论)

你将学到的技能

本课程共有课时,包括

学习数据的基础

本课程首先概述数据生态系统,从初级数据分析师在日常工作中的实践和流程、该角色所需的技能开始,并解释与数据分析师相关的术语和概念(如数据生命周期)

提问以做出数据驱动的决策

数据科学最难的部分之一是提出正确的问题。本课程涵盖有效的提问技巧,有助于为利益相关者提供一个分析框架。

为勘探准备数据

数据以各种形状、形式和类型出现。对于分析师来说,了解用于处理不同数据类型和格式的方法是非常重要的。这包括访问、提取、过滤和分类数据库中的数据的方法。

处理数据从脏到干净

数据清理是数据分析师的一项重要日常活动。在本节中,您将学习使用 SQL 进行数据清理,并验证数据清理的结果。

分析数据以回答问题

在本节中,您将学习探索和分析数据来回答问题。为此,需要通过计算对数据进行组织、格式化和处理。这部分课程使用电子表格和 SQL 来实现这一目的。

通过可视化艺术分享数据

讲故事是数据分析和科学中最困难也是最复杂的部分之一。可视化可以帮助数据从业者通过引人注目的数据叙述向利益相关者传达见解。这个类使用 Tableau 作为数据可视化平台。

用 R 编程分析数据

需要一定程度的编程熟练程度来加快分析过程,特别是对于复杂的数据科学项目。r 是一种非常棒的开源语言,为数据从业者所熟知。它的 tidyverse 包维护良好,对于数据争论(dplyr、purr、tidyr)和数据可视化(ggplot2)非常有用。有些人可能想知道是否应该学习 python。我的观点是,你先学哪一个并不重要,因为你可以用任何一个做很多事情。

完成一个顶点项目

顶点项目对于获得数据科学或分析面试非常重要。在该证书的最后一门课程中,您将有机会通过案例研究建立自己的投资组合,并学习常见的分析面试问题。

这门课适合你,如果你…

✅没有先前的经验或先决条件

厌倦了在开始一个看似基础的课程之前就花费在先决条件上吗?这个分析课程不期望学习者有任何经验,所以它非常适合应届毕业生或任何想学习分析的人。

✅希望得到雇主的关注。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片

如果你完成了谷歌数据分析证书,你就有望进入谷歌雇主联盟(仅在美国可用)的顶级雇主行列。该联盟中的公司受益于谷歌的人才管道,这些人才通常来自非传统背景。这个人才,当然是指谷歌提供的课程的学习者。

想知道财团内部的哪些公司?他们是家喻户晓的名字,像埃森哲、拜耳、百思买、德勤、威瑞森、Snap、沃尔玛等等。点击阅读更多关于财团的信息。

✅想从头到尾了解分析。

学习分析的一个痛点是需要在互联网上搜寻资源。谷歌通过为分析学习者提供一体化课程解决了这个问题。课程内容全面,为分析职位提供必要的技能。

✅每周有 10 个小时的空闲时间

该课程相对轻松,每周 10 个小时,目标是在不到 6 个月的时间内完成认证。

这个班不适合你,如果你…

❌已经有了分析方面的背景

你大概只需要一张证书,证明你学过分析学。如果你已经参加了一个非常类似的课程,如 Udacity 的分析学纳米学位课程Datacamp 的 Python Track 数据分析师课程、或任何数据分析认证课程,你就不需要再参加这个课程了。

❌是 python 的铁杆粉丝

抱歉 python 的粉丝们,这门课是用 R 教的,关于一个人应该从 R 还是 python 开始,一直有激烈的争论。如果你正在寻找一种极其灵活的语言,那么也许你会更喜欢 python。如果你想学习最好的数据包,那么 R 可能更合适。这是我的观点,值得在博客上单独发表。

一节课多少钱?

在撰写本文时,这八门课的学费是每月 39 美元。因此,你越快完成课程,效果越好。

Coursera 还为有需要的学习者提供经济援助。我个人从经济资助中受益匪浅,我绝对感激。

需要预览吗?从这里开始。

自学数据分析和数据科学并不容易,但我相信谷歌分析证书通过汇编高质量的资源,让你触手可及,让学习变得更容易。我希望你喜欢这门课,并祝课程顺利!

在 LinkedIn 上与我联系。

https://www.linkedin.com/in/travistang [## Travis Tang -数据分析师- Gojek

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

如果你喜欢这篇文章,你可能会喜欢…

面向初学者的谷歌数据工作室

原文:https://towardsdatascience.com/google-data-studio-for-beginners-99355e9df809?source=collection_archive---------17-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

艾萨克·史密斯在 Unsplash 上拍摄的照片

使用最简单的免费工具之一,在几分钟内实现令人难以置信的可视化

每个作家都知道,一幅画胜过千言万语;在数据科学领域,一个好的可视化是物有所值的。作为一个对这个行业和技能还非常陌生的人,我不能从专业的角度来说,但作为一个新手数据工程师,我来到我的新公司时,口袋里有一些熊猫,眼睛里有明亮的城市灯光。我的团队已经收集了大量奇妙的、基本上干净的数据…但是没有人有时间或专业知识将其转化为可操作的东西。对于初出茅庐的数据科学家来说,他们在寻求理解的过程中发现的可能是最伟大的工具:谷歌数据工作室。

当我第一次开始玩它的界面时,我嗤之以鼻。这不是熊猫,也不是 Seaborn,我刚刚花了数百个小时学习如何在工作场所使用我新奇的 Python 技能,所以我决定这样做。也就是说,我用它做得越多,我就越能理解谷歌数据工作室,或者酷孩子们称之为 GDS 的真正强大的本质。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

显示不告诉

每个人都喜欢图表。说真的,他们有。即使讨厌数据的人也喜欢好的图表。线上升了吗?有多好看?但最重要的是,上线了吗?

我是在开玩笑(大部分是),但是在商业世界里,我们的工作不是玩数据,而是为那些不玩数据的人翻译数据。一次又一次,你会发现一个漂亮的图表会在任何一天胜过一个数字。不仅如此,当你和一个像糖果一样吞噬度量标准的团队一起工作时,你需要尽可能快地提供大量的图表。因此,谷歌数据工作室是你的星期五。

在我们了解这项计划的威力之前,重要的是要知道它并不适合所有人。这是一个在数据新手和数据科学家之间架起桥梁的工具。它能做机器学习吗?不,你应该用它来清理数据吗?亲爱的上帝,不。即使合并也有它的局限性。但是任何一个从头开始编写堆积条形图的人几乎都会被这样一个事实所冒犯:在比煎鸡蛋还短的时间内将一个漂亮而精确的图表转储到一个报告中是多么容易(当然,如果你的数据是干净的话!).

谷歌数据工作室的优势在于其数据处理的可塑性。每个数字列都有一个可定制的默认聚合,所以从详细的行跳到一个分组的总和比说“Pivot table,schmivot table”更容易。不仅如此,它还让数据探索变成了一个拖拽式的梦想。最后,也是最重要的一点,它是为数不多的免费程序之一,允许你私下与你的团队分享数据,而不必在一个封闭的网站上进行托管。我充分意识到了 Streamlit 的强大功能和可定制性,我仍然计划在未来广泛使用该程序,但对于与我的团队共享敏感数据,GDS 是一个上帝派来的人。我可以说,在不小的程度上,GDS 改变了我的团队的工作方式。但是为什么要告诉你,当我可以给你看的时候?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

航空焦点Unsplash 上拍摄的照片

如何做 GDS 报告

您首先会注意到,在几分钟内创建一个完全填充的交互式报告是多么容易。请记住,GDS 是一个聚合工具,所以请确保您的数据是干净和一致的。俗话说:“垃圾进来等于垃圾出去”,所以你永远不要指望谷歌的优秀员工会为你做真正的数据工程工作。

第一步:加载您的数据

加载数据有多种选择。GDS 可以很好地处理空值,但是在这样做之前要确保理解空值以及列的语义配置。当您开始时,最常见的挫折之一是意识到您的配置到处都是,当遇到它不理解的值时,您的数据会中断。

GDS 有几个加载数据的方便选项,尽管它们都有各自的优缺点。在连接数据之前,一定要阅读文档,因为当你发现行丢失时已经太晚了。数据连接器包括:

  • PostgreSQL/MySQL*(每个查询限制 100k 行)*
  • Google Sheets (没有高级账户的数据限制)
  • CSV 文件上传*(最大数据集大小为 100mb)*
  • 谷歌大查询*(我没用过)*
  • 谷歌分析/谷歌广告*(仅限最近三个月没有付费版本*)
  • 以及更多的谷歌产品

我个人最喜欢的是谷歌床单。您可以在几秒钟内连接两个程序,GDS 会将该工作表视为活动数据库,因此,只要您单击报表页面顶部的刷新按钮,您就会看到报表中反映的更改。在我的大部分报告中,我会上传文件,这样我就可以随心所欲地拥有尽可能多的行和列,而不会接近 100mb 的限制。

我创建了一个假数据集来演示加载和可视化数据是多么容易。我可以强调地告诉你,我想出这些假公司名字所花的时间比我写 GDS 报告的时间还要长。我的数据包括数据类型的组合:分类字符串、整数和日期。下面你可以看到我将这些数据连接到 GDS,并在几秒钟内创建了一个表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

仅此而已。我会说,在操作之前,你应该总是检查你的数据的语义配置,我在上传数据之后就这样做了。

第二步:视觉化

让我告诉你在 GDS 想象是多么的不可思议的容易。我在我的报告中添加了一个堆积条形图,然后更改了维度,这样我们就可以看到每个客户的联系方式的明细。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就这么简单!每个图表都从列(绿色字段)中提取数据,同时聚合指标(蓝色字段)。如果您想对一个数字列求和,只需将其拖到指标中,然后选择求和(或平均值、中值、最大值等。).对于对象列,可以选择“计数”或“非重复计数”。最后,有一个专门针对日期范围的特定维度,这就是 GDS 真正有趣的地方。

第三步:过滤器

任何人都可以给他们的团队一个带有现成图表的 powerpoint,但 GDS 走得更远。该计划旨在为所有团队成员提供充分的互动,这种互动采取过滤器的形式。在大多数程序中,如果你有 3 个销售团队,你需要为每个团队做不同的报告,但是在 GDS,你可以创建过滤器,点击一个按钮来改变报告。筛选器可以控制数据中的任何列。

3A。过滤器控制箱

您可以在左侧看到基本的交互式过滤器。我通常对几乎所有的事情都使用下拉菜单,我鼓励你尝试一下,看看什么是有效的。对于每个过滤器,您选择它将控制哪一列,然后选择您想要显示的指标,以显示该列的不同之处。假设我只想查看销售团队的客户,我想查看的指标是该类别中有多少不同的客户。您只需选择“帐户名”作为您的指标,然后将聚合设置为非重复计数。就是这样!这里有一个快速的方法:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您甚至可以通过对报告元素进行分组来控制哪些过滤器会影响哪些图表。如果没有分组,筛选器将影响共享数据源的任何内容,但是有了分组,您可以创建用户友好的复杂报表。您还可以选择将固定过滤器应用于任何报告对象,也可以选择将所述过滤器一起应用于整个组。

3B。日期控制

GDS 最有用的元素之一是它的现场报道能力。当你连接 Google Analytics 数据源时,它会直接从你的网站上提取实时数据,并根据你的报告进行汇总。当然,有些数据连接器比其他连接器快得多(在我的经验中,CSV 文件上传往往是最快的,但是数据更新是手动的)。也就是说,如果你关注纵向数据,日期范围可能很重要。GDS 非常擅长自动解析日期列,但是,即使您在处理列时遇到问题,也可以使用 PARSEDATE()函数创建一个自定义字段。我现在不会进入自定义字段,这将是另一篇文章,但请放心,如果你以’ YYYY-MM-DD '格式传递日期时间列或对象列,GDS 会很好地翻译它,即使存在空值。

日期控件影响每个图表和字段中的特定数据字段。无论您在报告中放置什么对象,它们都有一个“日期范围”选项。您也可以将日期范围应用于组。在这里,您可以设置默认的日期范围,可以简单到上周,也可以复杂到上周三之前的 47 天。

3C。应用过滤器

我最后一个小小的滤镜是一个天才按钮,在所有的图表对象上贴上“应用滤镜”的标签。通过打开此按钮,您可以单击表格中的一行或图表中的一列,报告将自动基于该对象进行过滤。看看这个:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就这么简单!希望您现在可以看到这个免费的开箱即用的包中有多少工具可供您使用。

结论

作为我团队中唯一的数据人员,Google Data Studio 改变了我的生活,但它肯定有其局限性。我计划写更多的优点和缺点,以及一些我在混合数据时发现的有用的方法。以下是 GDS 如此强大的原因概述:

优点

  • 难以置信的易于使用(甚至对于非数据人员)
  • 丰富的数据连接器和可靠的文档
  • 自由的
  • 非常适合团队内部的私人数据共享
  • 非常可定制的交互式报告
  • 使用与 Google Sheets/Excel 相同的字段函数,并提供便于参考的文档字符串
  • 漂亮的动态图表
  • 过滤器本身就值门票的钱
  • 不需要编码

CONS

  • 在将数据强制写入报告之前,您必须了解您的数据
  • 如果不升级到 Google 360(每年花费 15 万美元),上传的大小是有限制的。)
  • 没有文档和论坛之外的技术支持
  • 合并数据源有极大的局限性(例如,不能使用多个连接键连接多个数据源。所有表必须有一个公共连接列)
  • 有时它只是中断,错误消息充其量只是含糊不清

总的来说,Google Data Studio 感觉像 Data Science-Lite,但除了 Streamlit for teams(仍处于测试阶段)之外,我还没有找到更好、更简单的选项来与非数据团队成员共享漂亮、复杂、交互式的报告。

我将在未来发布更多操作方法,如下所示:

  • 使用 Google Sheets api 构建数据管道
  • 非数据团队成员的最佳数据通信实践
  • 数据混合

谢谢朋友们!如果你有问题或想法,请留下评论,我会尽力回答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值