TowardsDataScience 博客中文翻译 2021(四百九十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

事情并不象初看到的那样简单

原文:https://towardsdatascience.com/more-than-meets-the-eye-image-transformations-using-homography-and-texture-metrics-in-python-db03427c5091?source=collection_archive---------45-----------------------

Python 中使用单应性和纹理度量的图像变换

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

照片由 Cookie 在 Unsplash 上的 Pom 拍摄

在我以前的文章中,我讨论了图像处理的不同方法。其中一些是图像清理甚至物体检测。在这篇文章中,我们将更多地讨论图像的变换和特征生成,即:单应性和纹理度量。

单应

单应性可以进行的变换包括旋转、平移、缩放,甚至倾斜。这可以通过映射两个平面投影之间的坐标来实现。

这方面的一个例子是我们的文档扫描仪应用程序,其中纸张被转换为可读的视角。让我们以下面的代码为例来尝试一下:

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

作者图片

为了生成卡片的俯视图,我们必须计算单应矩阵。这是通过获得卡片角的坐标,以及卡片将被投影到自顶向下视图的坐标来实现的。

#import libraries
from skimage.io import imread, imshow
import matplotlib.pyplot as plt
import numpy as np#load the card
cards = imread('medium/cards.jpg')#initialize source and destination coordinates
src = np.array([319, 134,
                273, 61,
                133, 103,
                162, 188,
]).reshape((4, 2))dst = np.array([203, 37,
                314, 36,
                314, 181,
                203, 182,
]).reshape((4, 2))

对于我们希望图像呈现的投影类型,有不同类型的变换。因为我们希望保留卡片形状的线条,所以我们将使用投影类型的变换。不同的类型可以在这里找到供你参考。

#transform image point of view
from skimage import transform
tform = transform.estimate_transform('projective', src, dst)
tf_img = transform.warp(cards, tform.inverse)
fig, ax = plt.subplots()
ax.imshow(tf_img)
_ = ax.set_title('projective transformation')

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

作者图片

纹理度量

由于一些图像在本质上非常敏感,颜色信息可能在多个区域不一致,因此可以考虑另一种方法来表征我们的图像。纹理是这种替代形式,其中考虑了强度值的空间排列。

样本纹理度量可以通过使用熵作为度量来完成。熵的好处是它可以检测灰度中强度值的变化。给定下面的代码,我们可以看到熵在起作用

import matplotlib.pyplot as plt
import numpy as npfrom skimage import data
from skimage.util import img_as_ubyte
from skimage.filters.rank import entropy
from skimage.morphology import diskimage = img_as_ubyte(data.brick())fig, (ax0, ax1) = plt.subplots(ncols=2, figsize=(12, 4),
                               sharex=True, sharey=True)img0 = ax0.imshow(image, cmap=plt.cm.gray)
ax0.set_title("Image")
ax0.axis("off")
fig.colorbar(img0, ax=ax0)img1 = ax1.imshow(entropy(image, disk(5)), cmap='gray')
ax1.set_title("Entropy")
ax1.axis("off")
fig.colorbar(img1, ax=ax1)fig.tight_layout()plt.show()

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

作者图片

这就是你可以用单应性和纹理度量做的样本输出。

对我的工作感兴趣?你可以在我的个人资料中看到更多的故事

https://nico-aguila.medium.com/

不仅仅是文字——你的表情符号表达了很多

原文:https://towardsdatascience.com/more-than-words-your-emoji-says-a-lot-96f4ec21af23?source=collection_archive---------32-----------------------

三个表情符号解释器 Python 包的简要概述。

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

照片由多明戈·阿尔瓦雷斯 EUnsplash 拍摄

几年前,我需要从 Twitter 数据流中检索 tweets,以完成关于在线说服分类的论文。正如任何第一个大规模研究项目所预期的那样,任何可能出错的事情都会出错。我在检索 8GB 的推文后发现的一个问题是,在所有编码之间的某个地方,所有东西都不可读,并且包含奇怪的符号和类似胡言乱语的字符——我怀疑一个可能的原因是表情符号。

这件事让我开始探索各种解释表情符号的 python 包。

表情符号

第一个包是emoji,它通过简单安装检索表情名称,反之亦然,如下例所示:

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

包文档截图https://pypi.org/project/emoji/

这是您可能想要与语言模型结合的包。你可以替换句子中的表情符号,并根据自己的喜好使用 NLP 模型。当使用 n-grams 时,将表情符号解释放在句子中的原始位置很重要,你可以通过标记化来做到这一点。

以下是从包文档中截取的截图代码,方便您使用:

>> import emoji
>> print(emoji.emojize('Python is :thumbs_up:'))
Python is 👍
>> print(emoji.emojize('Python is :thumbsup:', use_aliases=True))
Python is 👍
>> print(emoji.demojize('Python is 👍'))
Python is :thumbs_up:
>>> print(emoji.emojize("Python is fun :red_heart:"))
Python is fun ❤
>>> print(emoji.emojize("Python is fun :red_heart:",variant="emoji_type"))
Python is fun ❤️ #red heart, not black heart
>>> print(emoji.is_emoji("👍"))
True

emoji包很棒。它还支持除英语之外的其他语言,但如果你在一条推文或一个句子中有多个表情符号,该怎么办?在这种情况下,你可能会考虑为你原来句子中的所有表情符号创建一个字典,供以后使用。为此,更好的选择可能是demoji方案。它有一个选项,可以检索文本中出现的所有表情符号的字典。就我而言,这正是我所需要的,这样我就不会在处理数据时丢失信息。

德莫吉

demoji这个包的用法如下:

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

包文档截图https://pypi.org/project/demoji/

这个包demoji.findall()创建了一个表情符号的字典和它们与原文分开的解释。如果你想在语言模型中使用这个包,你需要使用demoji.replace()-它将取代表情符号。

另一个选项是demoji.replace_with_desc(),它用描述代码替换字符串中的表情符号。

为了方便您的使用,下面是从包文档中截取的截图代码:

>>> tweet = """\
... #startspreadingthenews yankees win great start by 🎅🏾 going 5strong innings with 5k’s🔥 🐂
... solo homerun 🌋🌋 with 2 solo homeruns and👹 3run homerun… 🤡 🚣🏼 👨🏽‍⚖️ with rbi’s … 🔥🔥
... 🇲🇽 and 🇳🇮 to close the game🔥🔥!!!….
... WHAT A GAME!!..
... """
>>> demoji.findall(tweet)
{
    "🔥": "fire",
    "🌋": "volcano",
    "👨🏽\u200d⚖️": "man judge: medium skin tone",
    "🎅🏾": "Santa Claus: medium-dark skin tone",
    "🇲🇽": "flag: Mexico",
    "👹": "ogre",
    "🤡": "clown face",
    "🇳🇮": "flag: Nicaragua",
    "🚣🏼": "person rowing boat: medium-light skin tone",
    "🐂": "ox",
}

DeepMoji

最后,在搜索适合我需求的包时,我找到了这个令人惊叹的 python 包deepmoji.顾名思义,这是一个基于深度学习的包,它检索了 N 个最相似的意思表情符号。

这个令人难以置信的软件包提供了一个全新的方法来分析数据,找到文本和作者之间的相似意义。

下面是一个基于 PyTorch 版本 torchMoji 实现 DeepMoji 包的简单教程:

我搜索了为特定任务解释表情符号的包,但它们有其他用途。你可能想考虑一个分析你的朋友或家人 WhatsApp 群组的项目:每个人都发送哪种表情符号?也许用 DeepMoji 对使用表情符号意义相近的成员进行分类?可能性是无限的。欢迎你在下面的评论中告诉我这些包可能对其他项目有用。有没有其他你喜欢的解释表情符号的 python 包?

强屈折语言的形态分析

原文:https://towardsdatascience.com/morphological-analysis-in-strongly-inflected-languages-623e2cc8a443?source=collection_archive---------29-----------------------

在数据科学中,如何有效地为具有丰富形态句法复杂性的非英语语言建立语言模型

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

托马斯·凯利在 Unsplash 上的照片

关键词 :自然语言处理、半监督训练、数据科学、命名实体识别、词性标注、语言模型、词法分析、词法分析、单词嵌入、文本分类

词法分析、NER(命名实体识别)和词性(词性)标注在 NLU(自然语言理解)中起着重要的作用,并且在强屈折(融合)的外语中可能变得特别困难,例如捷克语、德语、阿拉伯语或汉语,而一个单词可能有许多变体和后缀,这取决于其语法上下文(例如:捷克语名称:Jan — Honza — Honzík、Honzíkovi、Honzovi……)。因此,如果不将一个单词转换成其适当的引理形式,我们很难考虑任何文本分类,例如,将主格名词转换成其关于 NLG(自然语言生成)的假设语言情况。

我想到的一个外语通用方法的例子可能是使用 ULMFiT(一种基于迁移学习的方法),在维基百科等大型文本语料库上进行训练,在目标语料库上进行微调,并使用它来编码您的文档。这可能会产生一个基本的分类模型,而当前的 FastAi 库实现 sentencecode 来将单词分割成标记(从而产生更小的词汇)使这项工作变得更加容易。当这可能花费时间和资源时,为 NER 标记数据和训练用于词性标记的语言模型是昂贵的。例如,如果没有这些步骤,我们将无法构建基于意图的聊天机器人。

这正是布拉格查尔斯大学数学和物理学院形式和应用语言学研究所作为开源软件发布的 MorphoDiTa 工具(形态学词典和标记器)的用处。它的特点是词汇识别和单词及语义标记(名、姓、公司、俚语、粗俗术语、位置、子位置、大小写等),既可以作为独立的库使用,也可以通过 REST API 作为 web 服务使用。目前,它公开提供捷克语、斯洛伐克语和英语,但阿拉伯语也在开发中,该模型基本上可以为任何语言定制——只要有足够的标签数据。让我们从用户的角度简单了解一下它是如何工作的…

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

邮递员|作者的印刷屏幕

上面我们看到的是 Postman 中 API 的 JSON 响应。具体来说,我们用给定的参数调用分析方法。你能注意到的是,每个记号都有它的引理和标签。文档中描述了标记标志(参见参考资料)。例如,你可以看到单词“Jedeme”(“我们要去”)有它的词条“jet”(“去”),它是一个动词(POS),现在或未来形式(subPOS)。此外,还有 lemma 结构,当我们用 Python 迭代 json 文件时,这一点很明显,如下图所示。

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

VS 代码|作者打印屏幕

例如,你可以看到动词“jet”(“go”)有它的基本形式,并且有一个注释;单词“s”(“with”)有很多可能的缩写,用“:B”表示,这是一个撒克逊的外国风格的术语,用“,t”表示;并且还可以看到给定名称的文字形式(lemma(";y”)“Honza”就是“Jan”。

您可以在我的 GitHub repo 上看到完整的代码,并通过点击此处亲自体验一下

如上面的简单例子所示,当您需要处理一门外语的丰富的形态句法复杂性时,MorphoDiTa 提供了一个有价值的工具。有了它,您可以轻松地将令牌转换为词条,然后在 NLU/NLP 部分中使用 FastText(它在生成词向量时会考虑 n 元语法)将这些词条进一步转换为语言模型。在基于意图的聊天机器人的情况下,这在理论上也可以作为一个实体提取器用于填充你的槽,因为所有这些信息都是需要的(例如语言格——与格:可能是接收东西的人、姓名、公司、时间、地点等)。)已经是形态分析的一部分。此外,您还可以在创建单词向量时使用这些信息作为特征,从而为包括英语在内的任何语言生成比没有词法分析丰富更准确的单词分类和预测模型。

如果没有 MorphoDiTa,非英语国家(占世界大多数)中与 NLP 相关的任何工作都将变得相当复杂,并且将处于研究领域的边缘,甚至是简单的开发和数据科学任务。
词法分析甚至可以为英语语言带来优于现有 NLP 库的好处。

参考文献:

大多数业务经理不关心你可能学过的复杂算法

原文:https://towardsdatascience.com/most-business-managers-dont-care-about-fancy-algorithms-you-might-have-discovered-6ef7761310fa?source=collection_archive---------37-----------------------

数据科学的主要作者说。以下是他们在雇用数据科学家时实际寻找的东西。

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

Unsplash.comLucrezia Carnelos 的照片

你可能会惊讶地听到,大多数雇用数据科学家的商业领袖实际上并不关心你可能读过或学过的花哨的统计/ML 算法。当然,基于有抱负的数据希望者的意见,你必须在你的技术工具包下有复杂的、最先进的算法,这似乎是反直觉的。

但业内资深人士却不这么看。我在加州硅谷担任数据科学家才三年,但我对商业问题的复杂算法解决方案越来越怀疑和犹豫。以下是造成这种情况的基本原因,也是这些商业领袖在聘用数据科学家时所寻求的。

1.商业领袖“根本不关心复杂的算法”。

这种说法实际上直接来自的《傻瓜数据科学》(第二版)。作者莉莲·皮尔森写道:

“大多数业务经理和组织领导都不关心编码和复杂的统计算法。另一方面,他们对寻找通过提高销售率和减少低效来增加业务利润的新方法非常感兴趣。

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

虚拟数据科学

Lilian 谈到了我认为当今数据科学中最被误解的部分:它的实际目的。我遇到的许多有抱负的数据科学家对学习复杂的技术和算法更感兴趣,而不是理解这些算法如何被用来影响公司的底线。

我对 TradeRev(现在在 Acerta)ML 技术主管的 TDS 采访说明了一切。他在数据和软件工程领域拥有超过 15 年的行业经验,他告诉我:

“数据科学家通常关心模型、Jupyter 笔记本和超参数……但你需要考虑业务环境,机器学习如何适应业务。

[例如]考虑业务环境——ML 如何适应业务。ML 是商业的一部分,就像推荐系统一样。推荐系统不是业务,而是业务的一部分。"

如果你是一个经验丰富的行业老手,这种关于在技术冷静之前优先考虑业务环境的观点应该是很自然的。你知道,归根结底,重要的是业务,而不是算法。

但是作为一名有抱负的数据科学家,你可能会对这样的说法感到震惊。我见过太多的有志之士,他们花了无数的时间学习在权威期刊上发表的所有最新和最复杂的算法,希望学习算法所花的时间/金钱与工作成就直接相关。

不难看出为什么。机器/深度学习算法被神秘和敬畏所笼罩,市场上学习这些算法的过多课程似乎验证了它们在就业市场上的重要性,如果不是整个工作的话。

但诚实的事实是,在商业环境中,如果一家公司不能从这些算法中赚钱,它们就会被视为毫无意义的投资。很多时候,像深度强化学习这样的利基算法无法为一般的商业目的货币化,从而产生可观的收入。

以 Spotify(之前在 DoorDash 工作)的高级数据科学家 Jeffrey Li 为例,我在 TDS 采访过他。听听他对与求职面试体验相关的业务影响的看法:

根据我从评分带回家的经验,我在市场上看到的大多数数据科学家的最大陷阱或最大弱点是能够将机器学习模型与商业影响联系起来。所以很多非常非常聪明的人建立了这个非常复杂的五层神经网络,它能做出很好的预测,得分很高。

但是,当我们深入研究特定模型的业务影响时,他们通常很难回答这个问题。最终,我们需要机器学习对业务产生影响。这非常重要。

2.在私营公司,复杂性意味着风险。

在现实行业生活中,复杂性扼杀 ML 项目还有一个更具体的原因,那就是风险。脸书著名增长黑客、社交资本首席执行官查马斯·帕利哈帕蒂亚(Chamath Palihapatiya)认为,对硅谷科技公司的投资可以归结为以下两个方面:

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

作者图片

资本轻/密集是指生产一个产品需要多少资源和时间。显而易见/不显而易见指的是制造这种产品的商业案例有多显而易见。

许多成功的科技公司在考虑如何投入时间和资源开发产品或功能时,都遵循类似的原则。在数据科学的例子中,如果一个 ML 算法惊人的强大,但是没有明显的商业案例,没有企业或产品经理会批准这个项目。这就摒弃了数据科学家数月来一直致力于的模型,让他们永远生活在本地笔记本电脑中,只为收集灰尘。

大多数业务经理和组织领导不关心编码和复杂的统计算法。另一方面,他们对寻找通过提高销售率和减少低效来增加商业利润的新方法非常感兴趣。

资本要求也是如此。如果你不在一家资本过剩的公司,那么这家公司会对资源分配非常严格和有意识。现在,Covid 经济的情况更是如此,在这里,曾经自由的投资支出已经被资源保守主义所抵消。

但是在资本问题上还有另外一个例子。解决问题的算法越复杂,它给公司的技术生态系统带来的潜在风险就越大。风险越大,业务经理(尤其是没有数据背景的经理)就越不兴奋,因为如果部署的模型出现问题,他们必须直接承担部分责任。相信我。事情总是会出错。

例如,我们的 ML 技术主管 Amit 指出了一个在模型生产后可能出错的主要问题。他说,“现场数据可能与训练/测试数据有不同的分布”,这是一种你训练模型的数据和你在现实生活中收到的数据完全不同的情况,不管出于什么原因。有人称之为*特性漂移,*这是生产级数据科学家必须经常面对的一个常见问题。

</3-strategies-to-successfully-switch-to-a-thriving-data-science-career-5cf0cbe1f010>

另一个在模型生产中经常出现的问题是“模型错误,你的预测是错误的。”一般来说,随着技术解决方案变得越来越复杂和具有挑战性,更多的 bug 自然会堆积起来。

这些问题不会扼杀一个复杂的 ML 项目。关键是,如果在最初的项目范围确定期间没有正确评估风险,并且如果有更简单、资本更少(更精简)的解决方案可以产生更高的收入,经理们会选择后一种方法。

3.以下是在数据科学面试中这一切是如何进行的。

听听 Amit 和 Jeffrey 的经验丰富的想法,很明显,在数据科学行业,无论是应用周期还是更长的时间,不将新奇性置于适用性之上是一个常见的比喻。因此,简单的解决方法是反其道而行之。也就是说,寻找资本轻、业务明显的数据解决方案。

这里有一个例子。假设你被要求为一个带回家的访谈项目做一个异常检测预测任务。不要只是展示像 Prophet 这样的最先进的算法,而是要问一个问题,从工程和产品的角度来看,解决这个问题的最简单的方法是什么?

这可能意味着利用简单 IQR 或滚动平均作为阈值来创建异常指标。然后,您可以进一步使用中心极限定理,看看更多的统计方法如何改变异常检测的输出。

建立这种心态是至关重要的,因为它允许你从多个角度看问题,而不仅仅是从数据的角度。如果你对这种技能不熟悉,培养你的商业敏锐度的一个好方法是通读数据科学产品问题和产品设计问题。这可能看起来超出了数据学习的范围,但它将成为您的数据之旅中的基本要素。

每个人都应该知道的最常见的数据建模面试问题

原文:https://towardsdatascience.com/most-common-data-modelling-interview-questions-4055adf79229?source=collection_archive---------6-----------------------

了解 SQL、NoSQL、关系数据库等的基础知识…

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

图片由 Unsplash 上的新数据服务提供

本文将讨论一些在面试中最常被问到的关于数据建模的基本问题。在您的数据科学之旅中掌握数据建模是非常有益的,对于初学者来说,一开始可能会不知所措,但通过实践,它可以产生巨大的回报。

什么是数据建模?

简单地说,为家庭账单创建电子表格的行为就是数据建模。

定义:“…组织数据元素以及它们如何相互关联的抽象概念…”

数据建模可以很容易地转化为数据库建模,因为这是基本的最终状态。对于任何参与准备、分析和处理数据的人来说,这是一项重要的技能。正如你所猜测的,这肯定是一个迭代过程。数据工程师、数据科学家、软件工程师、开发人员等…不断重组、重构和优化数据模型,以满足组织的需求。

现在回到最初的问题,那么如果数据建模是组织数据元素和定义关系的行为,为什么不能像我们的家庭示例一样,在 Excel 中创建和存储所有内容呢?

Excel 电子表格中可以存储的数据量有很多限制。因此,数据库有助于将元素组织成表格——行和列等。基本操作(如大规模读写)是无法用 Excel 表完成的,因此最好使用数据库来处理大多数业务功能。

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

作者图片

数据模型的三种类型是什么?

三种类型的数据模型:

  • 概念数据模型 —这关注于所讨论的数据的非常高级的用户视图(实体映射)。
  • 物理数据模型 —这是模式(表的集合)描述数据如何物理存储在数据库中的地方。
  • 逻辑数据模型 —该模型位于概念模型和数据模型之间,允许数据的逻辑表示脱离物理存储而存在。

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

鸣谢:斯里·普拉卡什,来源:https://www.pinterest.co.uk/pin/218917231859820120/

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

作者图片

数据建模有什么好处?

数据建模使开发人员、数据架构师、业务分析师和其他利益相关者更容易查看和理解数据库或数据仓库中数据之间的关系。简单来说:

  • 减少软件和数据库开发中的错误。
  • 提高整个企业中文档和系统设计的一致性。
  • 提高应用程序和数据库性能。
  • 简化整个组织的数据映射过程。
  • 改善开发人员和商业智能团队之间的沟通。
  • 在概念、逻辑和物理层面简化和加速数据库设计过程。

什么是关系模型?

该模型将数据组织到一个或多个由列和行组成的表中,用唯一的键标识每一行。

什么是关系数据库?

它是基于数据关系模型的数字数据库,用于维护关系数据库的软件系统是关系数据库管理系统(RDBMS)。

常见的关系数据库类型: Oracle、Teradata、Mysql、PostgreSQL、Sqlite

使用关系数据库的优势是什么?

一旦数据被转换为行和列格式,数据就被标准化了,可以用 SQL 查询。

  • 灵活地添加表,改变表,添加和删除数据。
  • 数据完整性是使用关系数据库的基础。
  • 数据以表格格式系统地存储和建模。
  • 如果你有一个较小的数据量(不是大数据),你可以使用一个简单的关系数据库。
  • ACID 事务:这允许满足数据库事务的一组属性,以通过保持数据完整性来保证有效性,即使在出现错误、断电的情况下也是如此。

什么是主键?

主键是唯一标识关系数据库管理系统表中每一行的一列或一组列。

什么是外键?

外键是在两个表之间创建关系的列。外键的目的是维护数据完整性,并允许在一个实体的两个不同实例之间导航。

主要差异

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

作者图片

什么是正常化?

规范化 是为了减少数据冗余和增加数据完整性,按照一系列范式构建关系数据库的过程。

什么是反规格化?

反规范化 是通过添加数据的冗余副本,以损失一些写性能为代价,试图提高数据库的读性能的过程。简而言之,这意味着拥有数据的重复拷贝,这看起来像是一个不自然的过程,但是必须在读取量大的工作负载中执行该过程,以提高性能。

OLAP 和 OLTP 有什么区别?

数据库被设计为将结构化数据存储为可以使用 SQL 查询读取的表。数据必须遵循严格的模式,这允许(DBMS)极大地协同优化数据存储和处理。

也就是说,它们将磁盘文件中数据和索引的内部布局与其高度优化的查询处理查询紧密分离,从而为存储的数据提供非常快速的计算,并为所有读/写操作提供强大的事务 ACID 保证。

数据库上的 SQL 工作负载可以分为两类:

  • 在线事务处理(OLTP): 这些通常是高并发、低延迟的简单查询,一次读取或更新几条记录:就像银行账户事务一样
  • 在线分析处理(OLAP): 这些工作负载类似于定期报告,是典型的复杂查询(涉及聚集和连接),需要对许多记录进行高吞吐量扫描。

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

作者图片

星型与雪花型模式比较

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

作者图片

列出不同之处

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

作者图片

何时不使用关系数据库?

  • 拥有大量数据
  • 需要能够存储不同的数据类型格式
  • 需要高吞吐量—快速读取
  • 需要灵活的模式
  • 需要高可用性:表示系统始终运行,没有停机时间
  • 需要横向可扩展性

什么是 NoSql?

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

作者图片

SQL 与无 SQL

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

作者图片

NoSQL 数据库的类型

NoSQL 数据库主要分为四类:

1)键值

2)基于列

3)基于图形

4)基于文档。

以上指定的数据库没有一个能更好地解决所有问题。根据产品需求选择数据库总是最好的。

Key-Value: 这些数据库在一个简单的数据模型上工作,这个模型有一对惟一的键和一个与之相关联的值。这种类型的数据库运行高效,并显示出高度的可伸缩性,例如:在缓存 web 应用和会话管理中。

一些例子:Redis、Memcached

**基于文档:**这些数据库以文档格式存储半结构化数据及其描述。它们非常类似于键/值数据库。它们基于键/值存储数据,类似于键-值数据库,唯一的区别是值以 XML、JSON、BSON 的形式存储。这些主要用于移动应用数据处理和内容管理。

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

作者图片

一些例子:MongoDB、Terrastore、RavenDB

**基于列:**这些数据库以列而不是行来组织数据。这些行有许多与特定行相关联的列。列族包含我们可以一起访问的一组相关数据,这意味着它们可以比其他传统数据库更快地查询大型数据集。这些主要用于欺诈检测推荐引擎和目录。

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

作者图片

一些例子:Cassandra,Hbase,Hypertable,Amazon DynamoDB

**图形存储:**这些数据库将数据组织成节点和显示节点之间连接的边。这些用于映射关系,例如映射客户关系或预订管理系统。

与表松散连接的传统关系数据库相比,图数据库本质上是多关系的。遍历关系尤其重要,因为它们已经被捕获到数据库中,不需要计算它们。它们主要用于社交网络、物流和空间数据。

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

作者图片

一些例子:Neo4J,Dgraph,Amazon Neptune,OrientDB

17)什么是 CAP 定理?

CAP 定理证明了任何分布式系统都不能同时保证 C、A 和 P。换句话说,它表明分布式系统不可能提供三分之二以上的保证。

  1. 一致性:即使在一个操作执行之后,数据也应该保持一致。例如,在更新数据库之后,我们运行的所有查询应该产生相同的结果。
  2. **可用性:**数据库不应该有任何停机时间,它应该始终可用并且响应迅速。
  3. **分区容忍度:**即使服务器之间的通信不稳定,系统也应该继续运行。

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

来源:https://www.xenonstack.com/blog/nosql-databases/

如果你想更多地了解 NoSQL,我强烈推荐这个关于这个话题的写得很好的博客:https://www.xenonstack.com/blog/nosql-databases/

感谢阅读!

恭喜你!你坚持到了最后。我希望这些关于数据建模的问题对您有所帮助和启发。如果你已经知道所有这些,我很高兴刷新你的记忆和技能。我会不时更新这个列表,提出更多的问题。谢谢:)

更多阅读:

最重要的随机数 Python 模块,永远在你身边

原文:https://towardsdatascience.com/most-important-random-number-python-modules-to-keep-always-by-your-side-ef99a4ae624b?source=collection_archive---------29-----------------------

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

随机生成的数字的指数、正态和泊松分布函数的直方图,使用第三节中的 Python 代码创建。在所有地块中,使用了 5000 个随机产生的数字大小的样本。作者出于教育目的创作的图形。

介绍

在数据科学、统计建模、机器学习和绘图中,由于多种原因,人们经常需要生成随机数据进行模拟。有许多编程语言可以用来生成随机数和数据,在本文中,我想特别关注 Python 编程语言。在本文中,我将向您展示哪些是可以帮助用户生成随机数据的最重要的 Python 库和模块。

这篇文章背后的原因是因为我观察到,在大多数教学材料、关于 Python 和数据科学的书籍中,他们只是彻底地提到了随机数生成函数,而没有专门的一节来介绍它们。显然,在本文中,我将选择这些库和模块中最重要的一些,我认为它们通常在数据科学中最常用,因此,我的选择并不完整,因为我不会讨论现有随机数模块的全部范围。像往常一样,在本文中,我假设读者了解基本的 Python 和它的一些库。

I .不安全的随机数模块

Python 和许多其他程序中的随机数生成实际上并不是完全“随机”的,而是具有确定性的成分。为此,这些生成的数字被称为伪随机数。下面,当我写一个“随机数”时,你应该明白我指的是伪随机数。Python 和其他程序生成伪随机数的原因是,需要使用一个初始值来开始随机数生成序列,这个初始值通常被称为种子数。

基本的 Python 发行版都有一个名为 random 的默认模块,负责随机数的生成。这是生成具有不同分布函数的不同随机数时要调用的核心模块。然而,这个模块不能生成用于加密的安全随机数,这就是为什么它被称为不安全随机数模块。密码生成的随机数通常用于生成安全令牌、密码等。

1。random . seed(a =无,版本=2)

该子模块用于修复和初始化随机数发生器。Python 中的种子号用于在没有运行多线程的情况下复制相同的随机数序列。例如,如果我将种子值设置为特定的数字、字符串等。如果使用相同的调用函数以相同的顺序调用,使用与我相同的种子号的另一个用户将获得相同的随机数序列。

random.seed() 模块的第一个参数 a 是种子的值,第二个参数是要使用的 Python 版本,其中 version=2 是默认版本。对于 Python 以上的版本,种子值 a 可以是[int](https://docs.python.org/3/library/functions.html#int)[float](https://docs.python.org/3/library/functions.html#float)[str](https://docs.python.org/3/library/stdtypes.html#str)[bytes](https://docs.python.org/3/library/stdtypes.html#bytes)[bytearray](https://docs.python.org/3/library/stdtypes.html#bytearray)。例如,在本文中,我将使用种子值 1,即 a=1 来生成随机数。首先,我使用以下 Python 代码:

[In]: **import** random 
[In]: random.seed(a = 1)

在上面的代码中,种子从 a=1 的值开始,但是可以使用任何值。如果你在你的计算机中设置了相同的种子值,你应该在下面生成和我一样的数字序列。

2. random.randint(a,b)

该子模块生成区间[a,b]中的随机整数,包括区间极值。如果我选择,a = 0,b = 10,我得到例如:

[In]: random.randint(a = 0, b = 10)
[Out]: 2

3.random.randrange ( 开始停止=无步进=1 )

该子模块在半开区间[a,b]内生成整数,默认步长为 1。这个函数与 *random.randint(),*相同,如果我们用 b+1 代替 b,或者等价地, random.randint(a,b) 和 *random.randrange(a,b+1)如果在random . seed(a = 1)**之后立即被分别调用,它们将给出相同的随机数。*例如,如果我在第 2 节的代码之后运行下面的代码,我会得到:

[In]: random.randrange(start = 0, stop = 11)
[Out]: 9

如您所见,结果与前面的代码不同,因为它们是按顺序执行的。但是,如果您独立执行这些代码,您会得到相同的结果。

4.随机选择(序列)

该子模块使用户可以从给定的序列列表中选择一个随机数。例如,假设我有一个列表,l = [1,4。,8,9.6,30],然后运行下面的代码:

[In]: l = [1, 4., 8, 9.6, 30]
[In]: random.choice(list)
[Out]: 1

在上面的例子中,我使用了一个数字列表,但是序列可以是字符串、元组、范围等。

5.随机. random()

这个子模块在半开区间[0,1]产生一个随机数(浮点)。如果我在前面的代码之后依次运行下面的代码,我会得到:

[In]: random.random()
[Out]: 0.2550690257394217

6.随机高斯(μ,σ)

该子模块为用户提供了从随机数的高斯分布中生成随机数的可能性,其中均值=μ,标准差=σ。例如,如果我选择平均值 = 0 ,并且∑= 1,我得到:

[In]: random.gauss(mu = 0, sigma = 1)
[Out]: -1.0921732151041414

7.随机指数变量

的这个子模块根据指数概率分布函数生成随机数,其表达式如下

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

指数概率分布函数在物理学、生物学、水文学等不同的科学领域都是非常重要的。例如,在物理学中,放射性粒子衰变分布近似遵循函数(1)。参数𝜆称为速率参数,它是一个大于零的正数。对于给定的随机变量 X ,其期望值为 E (X) = 1/𝜆 ,方差为 Var(X) = 1/𝜆。所以遵循指数概率分布函数的随机变量 X均值为 *= 1/𝜆,*其中𝜆必须不为零。

例如,为了生成服从分布(1)且 *= 2 的随机数,*我运行以下 Python 代码:

[Int]: random.expovariate(lambda = 1/2)
[Out]: 2.108767728131761

8.随机均匀(a,b)

该子模块在区间[a,b]中生成均匀分布的浮点数,包括极值 a,但是极值 b 可能包括也可能不包括,这取决于舍入。例如,为了从区间[0,10]中的均匀分布生成一个随机数,我在上面第 7 点中的代码之后运行下面的代码(请注意代码的顺序,以生成与这里给出的输出相同的输出):

[In]: random.uniform(a = 0, b = 10)
[Out]: 7.887233511355132

我上面描述的八个随机数模块有一个核心模块,Python 的 random 模块。然而,Python 中有一些基本上基于上述随机模块的库,允许用户执行快速有效的数值计算。在这些图书馆中,有一个是 T21 图书馆。NumPy 有很多随机数模块,可以用来生成数字和数组。为了简化符号,首先我导入 NumPy:

[In]: **import** numpy **as** np
[In]: np.random.seed(a = 2)

在导入 NumPy 之后,我还导入了 random.seed()模块来设置 NumPy 生成器的种子。这个模块是第 1 点中 random.seed()的 NumPy 等价物。为了简单起见,我选择种子的值等于 2。下面讨论 NumPy 最重要的随机数子模块。

9.np.random.rand(d0,d1,…,dn)

NumPy 的这个子模块在半开区间[0,1]内生成随机数和填充有个均匀分布的个随机数的不同形状的数组。如果没有给这个子模块一个参数,它将返回一个区间为[0,1]的随机数。如果给定一个参数,则返回一维 NumPy 数组。如果给定多个参数,将返回一个多维数组。以下 Python 代码使这些概念更加清晰:

[In]: np.random.rand()
[Out]: 0.43599490214200376[In]: np.random.rand(d0 = 3)
[Out]: array([0.02592623, 0.54966248, 0.43532239])[In]: np.random(d0 = 3, d1 = 2)
[Out]: array([[0.4203678 , 0.33033482],
       [0.20464863, 0.61927097],
       [0.29965467, 0.26682728]])

**NP . rand()**模块与NP . random()模块有相似之处,我不在本文中介绍。

10.randn(d0,d1,…,dn)

NumPy 的这个子模块允许用户从均值为零且标准差等于 1 的正态分布中生成一个或多个随机数据样本。元组(d0,d1,…,dn)必须是正整数,它的存在是可选的。元组的大小表示返回数组的维数。如果没有给函数 **np.random.randn(),**赋值,那么它的输出就是一个来自正态分布的随机浮点数。如果只有一个数字作为参数给出,则输出是一个浮点一维 NumPy 数组,其分量等于给定的参数值。如果给定了多个数字作为参数,该函数将返回一个具有特定维度和组件的浮点多维数组。下面的例子让事情变得更清楚:

[Int]: np.random.randn()
[Out]: 0.5514540445464243[In]: np.random.randn(d0 = 4)
[Out]: array([ 2.29220801,  0.04153939, -1.11792545,  0.53905832])[In]: np.random.randn(d0 = 3, d1 = 3)
[Out]: array([[-0.5961597 , -0.0191305 ,  1.17500122],
       [-0.74787095,  0.00902525, -0.87810789],
       [-0.15643417,  0.25657045, -0.98877905]])

NumPy 模块NP . random . standard _ normal()与 **np.random.rand(),**非常相似,唯一的区别是前者以一个整数或一组整数作为参数。

11.np.random.randint(low,high = None,size = None,dtype = 'I ')

NumPy 的这个子模块在半开区间[低,高]从离散的均匀概率分布函数生成随机整数。在 high = None 的情况下,该子模块生成区间[0,low 内的整数。大小通常是一个整数或整数元组,它指定输出 ndarray 或整数的大小。以下示例有助于更好地理解该子模块:

[In]: np.random.randint(low = 3, high = None, size = 4)
[Out]: array([2, 0, 2, 1])[In]: np.random.randint(low = 3, high = 10, size = 4)
[Out]: array([9, 3, 5, 8])[In]: np.random.randint(low = 0, high = 10, size = (2, 2))
[Out]: array([[9, 8],
       [7, 1]])

12.np.random.exponential(scale = 1,size = None)

NumPy 的这个子模块从指数概率分布函数(1)生成样本。比例参数等于 1/𝜆,,其默认值等于 1。size 指定从分布(1)中生成的数字样本的大小。这里有一些具体的例子:

[In]: np.random.exponential(scale = 2, size = 1)
[Out]: array([1.89881464])[In]: np.random.exponential(scale = 2)
[Out]: 9.388438956222803[In]: np.random.exponential(scale = 3, size = (2, 2))
[Out]: array([[0.38174426, 0.48249559],
       [5.73733106, 2.13714827]])[In]: np.random.exponential(scale = 3, size = (1, 2, 2))
[Out]: array([[[ 0.73490213, 15.00188906],
        [ 1.13631244,  0.89818388]]])

13.np.random.binomial(n,p,size = None)

NumPy 的这个子模块从二项式分布函数生成标量数和数组。这里我假设读者知道这种在统计学中非常重要的分布函数。自变量 n 是试验次数,p 是每次试验成功的概率。概率 p 在区间[0,1]内,试验次数 n 是大于或等于零的正数。size 指定输出数组的维度。以下示例有助于理解该子模块:

[In]: np.random.binomial(n = 1, p = 1/2, size = None)
[Out]: 1[In]: np.random.binomial(n = 10, p = 1/3, size = (2, 2, 2))
[Out]: array([[[3, 3],
        [2, 5]],

       [[5, 6],
        [5, 3]]])[In]: np.random.binomial(n = 0, p = 0.4, size = 3)
[Out]: array([0, 0, 0])[In]: np.random.binomial(n = (1, 2, 4), p = (0.1, 0.5, 0.4), size = 3)
[Out]: array([0, 2, 2])

14.np.random.poisson(lam = 1.0,size = None)

NumPy 的这个子模块根据泊松概率分布函数生成标量数和数组。即使在这里,我也假设读者知道这个分布、它的参数和它的性质。第一个参数是 k 个事件应该发生的区间 𝜆 。参数 𝜆 可以是标量,也可以是类似数组的标量。size 可以是 None,也可以是指定输出多维数组形状的 tuple。这些示例有助于理解该子模块:

[In]: np.random.poisson(lam = 2, size = None)
[Out]: 4[In]: np.random.poisson(lam = 2, size = 4)
[Out]: array([4, 3, 1, 2])[In]: np.random.poisson(lam = (1, 3, 4), size = (3, 3))
[Out]: array([[0, 6, 7],
       [3, 5, 9],
       [3, 2, 4]])

二。安全随机数模块

第二节中讨论的所有模块都不是生成随机数和随机数数组的安全模块。Python 为用户提供了通过 secrets Python 模块生成安全随机数和字节的可能性。这个模块为加密、密码、令牌等创建随机数和字节。在本文中,我不会讨论这个模块,读者可以在上面的链接中找到更多信息。

三。绘制随机数据

上面描述的随机模块对于在许多情况下创建模拟图非常有用。它们可用于检查特定概率分布函数的行为,可用于将实际数据分布与众所周知的概率分布(如泊松、正态、伯努利分布等)进行比较。在下面的 Python 代码中,我使用了上面解释的一些随机数模块来创建本文顶部显示的图形。Python 代码是:

[In]: **import** numpy **as** np
[In]: **import** matplotlib.pyplot **as** plt 
[In]: import **seaborn** as **sns**
[In]: sns.set(style="whitegrid")
[In]: np.random.seed(10)[In]: fig, axs=plt.subplots(1, 3, figsize=(15, 6))
axs[0].hist(np.random.exponential(scale = 1, size = 10000), color = "r")
axs[0].set_title("Exponentially distributed random numbers")
axs[1].hist(np.random.randn(10000), color = "m") 
axs[1].set_title("Normally distributed random numbers")
axs[2].hist(np.random.poisson(lam = 5, size = 10000), color = "k")
axs[2].set_title("Poisson distributed random numbers")

四。结论

在本文中,我讨论了 Python 中最重要的随机数模块。正如我在开始时提到的,我的列表并不完整,因为还有其他模块,但我试图尽可能不偏不倚地列出我的列表,它由那些通常在数据科学中最常用的模块组成。

如果想要简单的随机数用于一般目的,那么内置的 Python 模块 random 就足够了。如果想要创建随机数和填充随机数的数组,那么 NumPy random 模块可能是最好的选择。可以使用这个模块进行模拟,并创建模拟图,如第三节所示。

如果你喜欢我的文章,请与你可能对这个话题感兴趣的朋友分享,并在你的研究中引用/参考我的文章。不要忘记订阅将来会发布的其他相关主题。

最流行的共指消解框架

原文:https://towardsdatascience.com/most-popular-coreference-resolution-frameworks-574ba8a8cc2d?source=collection_archive---------9-----------------------

最好的共指消解模型是什么?选一个看什么?

作者 玛尔塔·马朗考斯卡 帕韦·米耶尼克祖克

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

照片由玛丽·赫林拍摄

快速回顾一下

这是我们上一篇 共指消解 介绍的后续文章。如果你正在寻找一个有例子支持的好的理论背景,我们推荐它。反过来,本文涵盖了最流行的共指消解库,同时展示了它们的优缺点。

简单回顾一下——共指消解(CR)是一项具有挑战性的自然语言处理(NLP)任务。它的目的是将指同一现实世界实体的表达组合在一起,以获得不那么模糊的文本。它在文本理解、问题回答和摘要等任务中很有用。

通过示例进行共指消解

通过使用共指消解,我们希望得到一个明确的句子——一个不需要任何额外上下文就能理解的句子。预期的结果显示在下面的简单示例中(而将 CR 应用到文本的详细过程显示在前面的简介文章中):

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

步骤 1 —选择一个句子来分析或嵌入并检测歧义词(提及)

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

步骤 2-将检测到的范围与剩余句子中的其他提及/真实单词实体进行分组

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

步骤 3-用最有意义的真实世界实体解决相互引用

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

第四步——获得一个明确的句子

研究动机

在 NLP 系统中,共指消解通常只是整个项目的一部分。像大多数人一样,我们也更喜欢利用经过充分测试的现成解决方案,这些解决方案只需要一些微调,而不需要从头开始编写任何东西。

有许多关于共指消解的有价值的研究论文。然而,并不是所有的都有简单明了的实现。

我们的目标是找到一个生产就绪的开源库,它可以很容易地整合到我们的项目中。

顶级图书馆

有许多关于 CR 的开源项目,但在对当前最先进的解决方案进行全面研究后,到目前为止,最突出的两个库是 Huggingface NeuralCoref 和 AllenNLP。

拥抱脸

Huggingface 有相当多的项目集中在 NLP 上。他们最出名的可能是他们的变形金刚库,我们也在我们的人工智能咨询服务项目中使用这个库。

我们不会进入详细的实现,但 Huggingface 的neural corf使用神经网络解决了相互引用,并且基于一个优秀的 spaCy 库,任何关注 NLP 的人都应该烂熟于心。

该库有一个简单易懂的自述文件,涵盖了基本用法。但是我们发现这个库最大的优点是它允许简单的访问底层空间结构并在其上扩展。spaCy 将句子解析成文档、跨度和标记。Huggingface 的 NeuralCoref 为它们增加了更多的特性,例如,给定的区间是否有任何共同引用,或者一个令牌是否在任何簇中,等等。

此外,该库有多个可配置的参数,例如算法应该如何贪婪地行动。然而,经过大量测试后,我们发现默认参数在大多数情况下效果最好。

还有一个演示可以标记所有有意义的跨度,并显示网络的输出——其中提到指的是哪个。它也给出了关于分配分数的信息,以及每个提及对是如何相似的。

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

这个演示对于简短的文本来说效果很好,但是由于输出显示在一行中,如果查询变得太大,就不容易阅读了。

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

不幸的是,还有一个更重要的问题。在撰写本文时,演示比代码中的实现效果更好。我们已经测试了许多参数和底层模型,但我们无法获得与演示完全相同的结果。

社区在其 Github 的多篇文章中进一步证实了这一点,关于如何获得与演示页面上相同的模型,回答非常模糊和不准确——通常归结为“您必须试验不同的参数和模型,看看什么最适合您”。

艾伦 LP

艾伦人工智能研究所(简称 AI2)可能是自然语言处理领域最著名的研究小组。他们是 ELMo 等模型的发明者。他们的项目名为 AllenNLP,是一个开源库,用于为各种 NLP 任务建立深度学习模型。

这是一个巨大的库,有许多基于 PyTorch 构建的模型,其中一个是我们使用的预先训练的共指消解模型,它基于这篇论文。

同样,AllenNLP 也有一个演示。它非常清晰易懂,尤其是在输出方面。它的结构是多行的,可读性很好。然而,与 Huggingface 不同,相似性细节在这里是模糊的,即使从代码中也不容易访问。

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

然而,AllenNLP 共指消解并不是没有问题。当你第一次执行他们的 Python 代码时,结果非常混乱,很难知道如何理解它们。

AllenNLP 倾向于找到更好的聚类,然而,它经常解析它们,导致无意义的句子。

然而,正如我们在后面提到的,我们已经应用了一些技术来解决这个库及其使用中的大多数问题。

详细比较

就像库一样,有许多不同的数据集是为共指消解而设计的。一些值得一提的是 OntoNotesPreCo 数据集。但最符合我们需求并获得商业使用许可的是 GAP dataset,它是由谷歌开发的,于 2018 年发布

该数据集由近 9000 对有标签的歧义代词和先行词组成。由于 pairs 是从维基百科中取样的,它们提供了现实世界文本所带来的不同挑战的广泛覆盖面。数据集可以在 Github 上下载。

我们已经在整个 GAP 数据集上运行了几次测试,但真正给我们带来最大收获的是手动检查每一对并精确分析中间聚类以及获得的结果。

下面是数据集中的一个例子,其中包含关于热狗历史的信息。

从现在起,我们将 Huggingface NeuralCoref 实现称为“Huggingface ”,将 Allen Institute 提供的实现称为“AllenNLP”。

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

原句

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

提及通过 Huggingface 找到的对

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

提及由 AllenNLP 找到的配对

最常见的 CR 问题

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

提及通过 Huggingface 获得的集群

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

提及 AllenNLP 收购的集群

非常长的跨度

很难说获得长跨距是否是一种优势。一方面,长跨度捕捉到了上下文,并告诉我们更多关于我们正在寻找的真实世界的实体。另一方面,它们通常包含太多的信息。

例如,第一个 AllenNLP 聚类由一个很长的提及来表示:费尔特曼的一个波兰裔美国雇员,名叫内森·汉德沃克。我们可能不想用如此广泛的表达来替换每个代词,尤其是在嵌套跨度的情况下:

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

相反,Huggingface 只会用单词 Handwerker 替换第一组中的所有提及。在这种情况下,我们将失去 Handwerker 的姓名、国籍以及与 Feltman 关系的信息。

嵌套共指提及

在 GAP 示例中,我们看到嵌套的跨度—一个(或多个)提及在另一个提及的范围内:

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

根据 CR 解析策略,嵌套跨度中的提及可以被替换或不被替换,但这完全取决于个人偏好——通常很难说哪种方法最适合数据。这可以从下面的例子中看出,对于每一个例子,不同的策略似乎是最合适的:

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

不正确的语法形式

缩写是浓缩的表达形式,通常通过使用撇号获得,例如:

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

AllenNLP 将某些缩写视为一个整体,用不正确的语法形式替换其他提及:

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

在这种情况下,Huggingface 通过始终采用名词短语的基本形式来避免这个问题。然而,这也可能导致不正确的句子:

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

这是因为所有格形容词和代词的出现——当一个集群是由主语和所有格组成的时候。

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

不幸的是,这两个库都存在这个问题。然而,AllenNLP 检测到几个 POS(词性)标签,并试图在某些情况下处理这个问题(尽管并不总是获得预期的效果)。

查找冗余 CR 群集

例如,不需要的聚类是所讨论的文本片段中的第二个拥抱脸聚类。将的前雇主替换为的前雇主并不能提供任何额外的信息。类似地,当一个集群不包含任何名词短语或仅由代词组成时,很可能是不必要的。这些类型的聚类可能导致语法错误的句子,如下例所示。

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

下传检测

我们之前已经全面描述了回指和下指的问题,后一个问题特别棘手,因为它更难捕捉,并且经常导致错误的提及替换。

Huggingface 在 cataphora 检测方面存在问题,而 AllenNLP 总是将聚类中的第一个区间视为代表性区间。

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

利弊

为了方便起见,我们还构建了一个两个库的主要优缺点的表格,这是我们在与它们合作的过程中发现的。

拥抱脸

✔演示提供有价值的信息
✔易于使用
✔与 spaCy 兼容

演示的工作方式不同于 Python 代码😞 ✘ 不处理下指
✘ 经常发现冗余簇

AllenNLP

✔非常清晰的演示
✔检测所有格
✔检测下指

✘代码使用起来不直观
✘经常生成太长的簇
✘有时会错误地处理所有格
✘原始地解决共指经常导致语法不正确的句子

我们还发现有趣的是,Huggingface 通常定位更少的集群,因此替代提及的频率更低。相比之下,AllenNLP 似乎更“积极”地替换提及对,因为它发现了更多的聚类。

摘要

在本文中,我们讨论了最著名的共指消解库,以及我们使用它们的经验。我们也展示了它们的优势,并指出了它们带来的问题。

在本系列的下一篇也是最后一篇文章中,我们将展示我们是如何成功实现它们的。我们将展示如何在某种程度上把它们结合成一个解决方案,通过取长补短,利用对方的优势来解决问题。

如果你想使用这些库中的任何一个,我们还提供了两个更详细的笔记本,你可以在我们的 NeuroSYS GitHub 上找到。

更多类似的文章请看一下 神经系统博客

第三部分— 如何建立有效的共指消解模型

参考

[1]: 聊天机器人最先进的神经共指消解 — Thomas Wolf (2017)

[2]:—Kenton Lee,Luheng He,,Luke Zettlemoyer (2017)

MATLAB 中基于运动的目标检测与跟踪

原文:https://towardsdatascience.com/motion-based-object-detection-and-tracking-in-matlab-5713f08362ff?source=collection_archive---------26-----------------------

基于运动的多目标跟踪算法在悬停无人机视频中的实现

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

作者图片

检测和跟踪全运动视频中的对象具有重要的应用,例如交通监控、安全和视频监控等。尽管它有各种各样的用途,但是由于它的复杂性,大多数人倾向于回避做任何计算机视觉工作,而没有意识到有许多库和软件包可以使实现变得简单。

这里介绍的是一个简单易懂的指南,用于理解和实现 Matlab 的基于运动的多对象跟踪算法,以便您可以在自己的视频中检测和跟踪移动对象。该算法在一个视频上进行测试,其中一个场景是从一架悬停的无人机上拍摄和记录的。

基于运动的多目标跟踪算法

我们将使用 Mathworks 的 Matlab 代码,可在这里获得

在后面的讨论中,有几个术语是很重要的,下图说明了每一个术语。

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

相关术语以及它们对应于每个帧的哪个部分。作者图片

上面显示的术语也在这里定义:

  • 物体识别号或物体 id 用于区分不同的物体。
  • 物体包围盒是包围被检测物体的盒子
  • 帧 X 轴是每帧中沿水平线的像素坐标轴
  • 帧 Y 轴是每帧中沿垂直线的像素坐标轴
  • 物体质心由 x 像素坐标和 y 像素坐标组成,用于定义物体在空间和时间上的中心
  • 帧数是一个物体可见的帧数,知道每秒钟的摄像机帧数可以让这个参数测量一个物体在场景中的时间

与实现深度学习和大量训练数据来检测对象的流行检测算法不同,Matlab 基于运动的算法仅使用运动。通过首先减去两个帧的背景来检测对象,并且如果两个帧之间的差包含足够多的相连像素,则对象被识别。利用简单的卡尔曼滤波器预测每个探测到的物体的路径,如果沿着预测的轨迹探测到后续物体,则将其指定为相同的物体。

下图显示了一个普通视频截图的示例,旁边是用于检测和跟踪对象的减去的背景空间。

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

视频截图左边显示正常视频,右边显示运动检测和跟踪。减影背景图像中的变化是白色,而无变化是黑色。作者图片

获取机载视频数据

我用 DJI 的 Mavic Mini 无人机拍摄了自己和兄弟姐妹及朋友一起散步的场景。下面的照片展示了我们拍摄的场景和使用的设备。无人机一直在盘旋,因为如果相机超过一定的移动量,算法就不会工作。

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

显示测试现场的图片,演员走过现场,使用无人机和摄像机,以及无人机的遥控器。作者图片

我们都以正常的速度沿着场景的水平或垂直轴直线行走,除了两条轨迹以明显更慢或更快的速度倾斜,以便稍后测试跟踪算法。在获得大约 12 分钟的视频后,从无人机上检索数据,以输入到检测和跟踪算法中。

检测和跟踪的对象

尽管使用了悬停无人机的抖动镜头,检测和跟踪算法工作良好,如下面最繁忙的 15 秒剪辑所示,有 5 个不同的对象。

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

一个 15 秒的剪辑,展示了 5 个对象的检测和跟踪。作者图片

如前所述,为了显示对象检测和跟踪算法的简单应用,如上所示,两条路径偏离了正常模式。让我们来看看一些输出数据,以尝试在不必手动分析 12 分钟视频的情况下找到异常路径。输出数据包括对象 id、对象的 x 和 y 质心以及对象出现的帧。

在整个 12 分钟的视频中,总共检测和跟踪了 192 个物体,尽管需要注意的是,由于无人机的移动,其中一些可能是重复的或错误的识别。首先,我们可以将轨迹绘制到背景上,以查看每个被跟踪的对象经过的地方,下图显示了所有轨迹的绘制。

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

12 分钟视频中记录的所有 192 首曲目的图表。作者图片

虽然不是很清楚,在上面的图像中,我们可以看到两条对角线,代表偏离轨道。如果我们画出每个轨迹出现的时间,我们应该能够很容易地检测出较长和较短的异常轨迹。下图显示了所有曲目中每个曲目的持续时间。

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

所有音轨的音轨时长图。作者图片

使用上面的图,我们注意到慢速和快速异常磁道的异常磁道 id 分别为 1 和 22。现在,我们可以裁剪视频,仅显示异常轨道 1 和 22 出现的时间,如下所示。

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

快速和慢速异常轨迹的剪辑。那首慢歌以双倍速度播放。作者图片

使用输出轨迹数据,我们能够快速识别异常轨迹。过滤以仅显示异常剪辑比手动检查 12 分钟的视频以获得 30 秒的异常镜头要快得多。

摘要

随着所有库或算法的不断改进并向公众发布,实现对象检测和跟踪变得越来越容易。值得注意的是,有几种不同的工作流用于检测和跟踪对象,每种工作流都有其优点和缺点。这里提出的基于运动的方法对于诸如这里提出的具有运动目标的情况可能工作得很好,但是静止目标的检测和跟踪将需要不同的方法。

在这里给出的简单应用中,输出对象检测和跟踪数据用于从总共 192 个对象中识别两个异常轨迹。虽然只有一个 12 分钟的视频被用来识别总计 30 秒的特征,但这种方法可以用于从数小时的视频中识别小的异常行为。

在 ML 中快速移动而不打破东西

原文:https://towardsdatascience.com/move-fast-without-breaking-things-in-ml-c070bfca2705?source=collection_archive---------16-----------------------

行业笔记

许多公司都认识到,将一个在研究实验室中有效的模型投入生产,说起来容易做起来难。

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

作者图片

由 Doordash 的 ML 工程师 Bob Nugman 和 Arize AI 的 and Aparna Dhinakaran 撰写。在这篇文章中,Bob 和 Aparna 讨论了可靠性工程对于 ML 计划的重要性。

机器学习正迅速成为新兴产品和技术的关键因素。这使得该领域迅速成熟,因为它试图将构建 ML 模型的过程从艺术转变为工程实践。换句话说,许多公司正在认识到,将一个在研究实验室中有效的模型投入生产,说起来容易做起来难。

ML 从业者在将模型部署到生产环境中时面临的一个特殊挑战是确保他们的用户获得可靠的体验。想象一下,现在是凌晨 3 点,你被一个疯狂的电话吵醒。你跳进一个会议,首席技术官在线上,问问题。在新推出的市场中,购买数量突然下降,导致每分钟都有大量收入损失。社交媒体突然充斥着令人讨厌的用户报告。时间不多了。你的团队正在努力,但还不清楚从哪里开始。一款车型在生产中开始失败了吗?随着行业试图将机器学习转化为工程实践,我们需要开始讨论解决这个 ML 可靠性问题。

工程的一个重要部分是确保我们产品的可靠性,那些包含机器学习的产品也不例外。在一天结束时,你的用户不会给你一个通行证,因为你在你的产品中使用了最新最棒的机器学习模型。他们只是希望事情能顺利进行。

为了框定我们关于 ML 中可靠性的讨论,让我们首先来看看软件工程领域在发布可靠软件方面学到了什么。

软件可靠性

为什么

事实上,任何现代技术企业都需要强大的可靠性工程项目。这种计划的范围和形式将取决于业务的性质,选择将涉及复杂性、速度、成本等方面的权衡。

一个特别重要的权衡是在速度(“快速移动”)和可靠性(“不打破东西”)之间。有些领域,如欺诈检测,两者都需要。

将 ML 加入其中会使事情变得更加有趣。

考虑设定 99.95%的可用性目标。这为我们提供了每周 5 分钟的停机预算。绝大多数停机(根据我们的经验,超过 90%)都是由人工引入的代码和/或配置更改引发的。这现在也越来越多地包括对生产 ML 模型和数据管道的改变。

对生产系统的代码和配置进行变更几乎是连续不断的,每一次变更都有可能导致停机事件。类似地,随着对 ML 依赖的增加,对 ML 系统的高速生产交付的需求也在增加,同样存在着引入倒退或中断的风险。

如果我们要实现这个目标,那么每周只允许一次事故,那么挑战就变成了在五分钟内检测并完全缓解一次事故。怎么会?

需要有一个系统的可靠性计划。

可靠性的三大支柱

一个成功的可靠性计划应具备以下要素。每一个都将在下面详细介绍。

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

作者图片

  • 可观察性:检测、探索和理解回归的能力
  • 变更管理:工具和实践确保每一个引入的变更(代码、配置、业务规则、基础设施等)都是可发现的、可观察的、逐步推出的、可缓解的、可恢复的。
  • 事故响应:当(不是如果)事故发生时,预先存在的计划和能力已经到位,以首先减轻然后恢复事故的影响。事故响应流程包括事故后阶段的启动,包括无过失事后验尸,其结果反馈到所有三大支柱的改进中。

这三个支柱对整个工程过程、技术堆栈以及组织的文化施加压力。

让我们来探讨一下它们的目标和一些特性。

可观察性

成功的可观测性解决方案将使我们能够:

  • 快速检测回归
  • 告知快速有效缓解的途径。
  • 一旦问题得到缓解,告知问题的原因,以便可以全面分析、理解和解决问题,通常通过事后分析过程。

为了提高效率,可观察性工具和实践需要在整个组织中标准化,同时能够灵活地满足每个团队的需求。一个可观察性团队应该制定最佳实践并实现工具,以使开发人员能够以最小的努力一致地满足他们的可观察性需求。

变革管理

如上所述,大多数停机都是由代码和配置的众多更改之一触发的。变更管理系统的目标是确保以集中、系统的方式引入变更,支持我们的可靠性目标。

与可观察性类似,变更管理(代码、配置、基础架构、ML 模型等)应该在整个组织内标准化,同时适应团队之间的不同需求。最好由专门的所有者来管理变更工具和实践。

Sebastian Yates 展示了一个构建良好的变革能力管理的例子。

事故响应

尽管我们做了最好的准备,真正*难以想象的事情还是会发生。*在那个时候,响应不应该看起来像是头脑风暴、解决问题等工程活动。它应该看起来像一个事件响应,有一个预定义的结构,排练过的角色,尖锐的专业工具,和一个操作的命令。

重要的是,其他两个支柱,即变化的可观察性和管理,对于建立成功的事件响应能力至关重要。

机器学习中的可靠性

现在,我们已经了解了可靠性在软件工程的广阔世界中意味着什么,让我们利用我们的知识来理解 ML Ops 领域需要解决什么问题,以帮助公司部署具有机器学习组件的可靠应用程序。

要做到这一点,让我们回到我们之前讨论过的关于你的 CTO 深夜来电的故事。为了提供更多的背景信息,让我们假设为您的电子商务公司对您的搜索结果进行排名的模型正在返回奇怪的结果,并且正在严重影响客户转化率。让我们一步一步来看这里发生的事情。

甚至在你被邀请与你的首席技术官一起参加电话会议之前,对问题的第一步反应就已经发生了。问题已被发现,相关人士已被提醒。这可能是度量监控系统的结果,该系统负责确保重要的业务度量不会偏离轨道。

接下来使用你的 ML 可观察性工具,我们马上会谈到更多,你能够确定问题发生在你的搜索模型中,因为使用你返回的前 n 个链接的用户比例已经显著下降。

了解了这一点之后,你需要依靠你的模型管理系统,要么回滚到你之前的搜索排名模型,要么部署一个简单的模型,让你在此期间保持领先。这种缓解是阻止您的公司每分钟损失(同样多)金钱的原因,因为每一秒钟都是为用户提供不正确产品的关键。

现在事情又开始工作了,您需要回顾您的模型可观察性工具,以理解您的模型发生了什么。这里有许多可能出错的地方,其中一些可能会影响您的缓解策略,因此快速开始了解出错的原因非常重要。

最后,一旦您发现了问题的根本原因,您就必须想出一个解决方案,从修复数据源、重新训练您的模型,到重新设计一个新的模型架构。

现在,让我们更深入地了解这些在生产产品中实现 ML 可靠性的因素。

可观察性

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

作者图片

使任何系统可靠的关键因素是内省系统内部工作的能力。就像机械师需要在汽车引擎盖下观察你的引擎是否运转顺畅一样,ML 工程师需要能够在他们的模型引擎盖下观察,以了解他们的模型在生产中是如何整流罩的。虽然这似乎是显而易见的,但许多公司在部署机器学习时都是盲目的。通过综合性能指标来衡量模型的性能是不可观察的。

思考 ML 可观察性的最佳方式是,你的团队如何有效地检测到你的模型性能的问题,对问题进行缓解以止血,确定回归的根本原因,并对问题进行补救或解决。值得注意的是,有能力检测问题并不构成对 ML 系统的完全可观察性。如果没有自省的能力来找到根本原因或权衡各种因素的总和,任何解决方案都将是某种形式的猜测。

为了更好地说明您的工具应该寻找什么样的东西,我们首先需要了解哪些东西可能出错?

那么什么会出错呢?

你应该观察什么实际上取决于什么会出错。

使用 ML 模型时,有许多不同的模型故障模式和生产挑战,每种模式都需要您观察系统中的附加信息。

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

作者图片

首先,战斗的第一步是检测问题的发生。这通常是通过测量模型性能指标来完成的,如运行精度、RMSE、f1 等。一个问题是这并不像听起来那么简单。在理想情况下,在模型做出决策后,您很快就知道了模型预测的基本事实,从而很容易确定模型在生产中的表现。举个例子,预测用户可能会点击哪个广告。在模型做出决定后,你几乎马上就能得到一个关于你表现如何的结果。用户要么点击了它,要么没有点击!

ML 的许多应用程序没有这种实时基础事实的奢侈,在这种情况下,可以使用代理性能度量,如相关的业务度量。除了模型性能指标之外,您可能希望监控服务健康指标,如预测延迟,以确保您的服务为您的用户提供良好的体验。

一旦通过监控模型性能或服务健康度量检测到回归,您需要更多的信息来理解您的模型可能会发生什么。有助于事件响应的一些重要注意事项:

服务:

  • 模型预测的延迟和面向用户的延迟
  • 服务停机时间(非常类似于软件)

数据:

型号:

  • 模型正在执行的底层任务可能会在一夜之间发生缓慢或快速的变化!
  • 你的模型可能会以一种非设计的方式产生偏差(你的用户的一些意想不到的子集会得到可测量的不同结果吗)
  • 您的模型可能在某些数据子集上表现特别差(需要存储和理解您的模型错误)

对于这些潜在的生产挑战中的每一个,你的 ML 可观察性工具集应该使你的团队能够检测回归并深入研究它们,以最好地理解它们为什么会发生以及你能做些什么。

我们可以整天谈论 ML 可观察性,所以让我们继续讨论如何最好地管理生产中模型的发布更新。

变革管理

每次你把新的变化推向生产,你都冒着把你的用户引入到你的团队没有预见和防范的问题中的风险。

事实上,假设你的搜索模型在你假设的电子商务平台上因为一个新模型的推出而倒退了。现在,您的业务度量发现出了问题,并且您的可观察性工具确定了搜索模型,那么我们该怎么做呢?我们之前提到了缓解和补救之间的区别。在这种情况下,由于我们正在迅速损失公司的资金,最好的办法可能是尽快止血(缓解问题)。

我们可能有的一个选择是恢复到我们以前部署的模型。或者,我们可以发布我们的幼稚模型,这种模型可能没有那么好的性能,但始终工作得很好。在我们的例子中,这可能只是显示从弹性搜索返回的精确结果。

为了更好地防止这些潜在的问题迅速而显著地发生在你的产品的用户身上,ML 系统应该遵循与软件部署相似的展示过程。

与通常使用静态测试用例来测试软件以确保代码不会回归任何行为一样,ML 系统也应该在部署前进行静态验证测试。例如,如果你正在提供自动驾驶服务,通过一些标准化的确定性模拟器路线运行你的新模型可能会让你发现一些明显的回归。

虽然静态验证对于提高运输产品的质量非常重要,但它无法替代您在生产中对模型的了解。让我们来讨论一下如何从您的生产模型中获得这些经验,而不会有全面停机或降低所有用户体验的风险。

您可能希望首先将您的模型发布给一部分用户,以便在所有用户察觉到问题之前及早发现问题。这种技术通常被称为金丝雀部署

如果通过 ML 监控系统检测到问题,随着您逐步推出您的更改,您应该能够轻松快速地恢复到之前的模型版本及其相应的软件版本。

另一个密切相关的话题是影子部署的想法。在影子部署中,你可以在新模型发货之前,将现有模型在生产中看到的输入信息输入到新模型中。因此,当您的用户仍在体验现有模型提供的预测和用户体验时,您可以开始衡量您的新模型的表现,并做出任何必要的更改,以使其为黄金时间做好准备。

影子部署的另一个好处是,您可以在影子部署中对多个候选模型进行实验,并选择一个能够在当前生产数据上表现最佳的模型。

现在我们已经有了一些技术来帮助我们提高部署的质量,让我们来讨论一下当您在将生产模型部署到生产中之后发现它有问题时,您可以做些什么。

事故响应

好的,我们在生产中发现了模型的一个问题,我们应该怎么做?这在很大程度上取决于您的模型应用程序,但这里我们将讨论一些关于如何在短期内处理问题(缓解)并朝着真正的修复(补救)努力的一般策略。

减轻

首先,就像软件一样,您可以回滚到以前的模型版本和相应的软件/配置。如果您推广了一个通过验证过程的坏模型,这种缓解策略可能会对您有所帮助;但是,这并不总能解决您的问题。可能您的输入数据分布或模型的底层任务已经发生了变化,使得旧模型在生产中也不是一个好的选择。

在某些情况下,另一个可行的策略是部署模型的简单版本。这可能通常比更复杂的模型性能低,但在面对输入和预期输出分布的变化时,它可能会做得更好。该模型不需要机器学习,可以只是一个简单的基于启发式的模型。这种策略可以帮助您在返工更复杂、但性能更好的模型时赢得时间。

补救

这给我们带来了解决由生产中的 ML 模型引起的事件的最常见的建议:只需重新培训它!这个建议很常见,因为它涵盖了模型的许多潜在故障模式。如果输入数据发生了变化或基础任务发生了变化,对较新的生产数据进行重新培训也许能够解决您的问题。随着时间的推移,世界在变化,你的模型可能需要定期重新培训以保持相关性。

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

作者图片

再培训策略可能包含一整篇技术文章,所以让我们跳到节略版。重新训练模型时,您有一些选择:

您可以选择对数据的某些子集进行上采样,这可能会修复与某类数据的非预期偏差或表现不佳有关的问题。

如果你认为你的输入/输出分布的转变会持续下去,你也可以对更新的生产数据进行采样,以建立新的训练集。

如果您认为这种分布变化是暂时的,并且可能是季节性的,那么您可以根据此季节性期间的数据来训练新版本的模型并部署它,或者求助于工程特征来帮助您的模型理解它试图近似的函数中的季节性指标。

您的模型的性能可能会下降,这是因为引入了一个新类别的示例,这是它在培训中没有见过的。如果这类例子非常不同,你可能需要一个全新的模型来处理这些特殊的例子。训练一个单独的模型并采用一个更高级别的模型来确定对一个特定的例子使用哪个模型的过程通常被称为联合

我们将在这里讨论的最后一个选项是重新开始。如果再培训没有帮助恢复性能,并且您的旧模型也无法完成工作,那么任务可能已经发生了足够大的变化,需要以下一些内容:新的模型架构、新的功能、新的数据处理步骤。

结论

软件世界花了几年时间才支持我们上面概述的可靠性框架。有了可观察性、变更管理和事件响应这三个支柱,我们可以将可靠性收益从软件领域转化到 ML 应用领域。现在由 ML Ops 空间来提供我们迫切需要的工具,以使 ML 应用程序可靠。

超越事实,了解你的维度

原文:https://towardsdatascience.com/move-over-facts-know-your-dimensions-e1489862f9a0?source=collection_archive---------7-----------------------

数据仓库中的维度类型

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

照片由西格蒙德Unsplash 拍摄

度量,度量,度量!如今,我们希望捕捉应用程序中的每一次点击、每一次滚动和每一个事件,并在其上运行作业。众所周知(事实:P )这些指标是黄金(或者我应该说石油?)但是你有没有想过失败者,这些指标所指的维度?

本文将带您回到数据仓库的基础,并回顾数据仓库中不同类型的维度。如果您已经熟悉什么是尺寸,您可以跳到下一部分。

让我先谈谈维度是什么,那么维度是什么?

维度是我们观察、测量和体验世界的方式。在数据领域,这可以转化为维度,即我们衡量数据和回答业务查询的实体。维度是衡量标准的方式。例如:指标如何与地理相关?

可视化和理解维度的最简单方法是它们在星型模式中的位置:

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

定义完维度后,让我们继续下一节,讨论维度的不同类型。

维度的类型

根据尺寸变化的频率,可将其分为三种类型:

**静态尺寸:**不随时间变化的尺寸。这些维度非常容易实现。例如,用户的出生日期。

缓变尺寸(SCD): 尺寸随着时间推移缓慢改变 或能够改变的尺寸。实现 SCD 有多种方法,这取决于您希望如何处理发生的变化。

例如,假设用户在 21 年 2 月 24 日从印度搬到了美国,我们希望在维护为

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

设计 SCD 的各种方法有:

  • SCD — Type 0: 发生变化时,保留原来的值。更新的维度表:

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

  • SCD — Type I: 发生变化时,覆盖原始值。更新的维度表:

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

  • SCD — Type II: 发生变化时,增加新的一行。当您想要维护尺寸变更的历史记录时,请使用类型 II 尺寸设计。更新的维度表:

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

  • SCD — Type III: 当发生变化时,增加一个新列。更新的维度表:

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

  • SCD — Type IV: 当发生变化时,覆盖并维护一个单独的历史表。

**快速变化尺寸:随时间变化 或能快速变化的尺寸。例如,用户的体重。快速变化的维度通常被实现为垃圾维度,如下所述。

上面介绍了基于更改频率的维度分类,还有其他基于维度存储方式和其他一些因素的维度分类。其中一些定义如下:

**退化维度:**作为事实表的一部分存储而不是存储在单独的表中的维度。将维度存储为退化维度的决定取决于几个因素,如查询性能考虑。例如,用户的名字可以存储为事实表的一部分。

**符合尺寸:**这些尺寸无论在哪里被引用都具有相同的含义。例如,日历维度表。

**垃圾维度:**这可以解释为一个杂项表,可以维护该表以将不相关的属性存储在一起,并且当不希望将事实表中的太多外键维护到太多维度表时,可以使用单个外键来引用该表。这些通常被实现来处理快速变化或快速变化的维度。

**推断维度:**这些是维度表类型,用于在维度表中的引用可用之前加载事实表的情况下,处理后期数据。在这种情况下,为了尊重引用完整性,可以在事实表可以推断的维度表中创建一个所有维度属性都为空的新记录。当维度数据可用时,可以更新该新行。

嗯,三分钟内的信息太多了!希望这有助于澄清数据仓库中的一些维度类型。

下次见,
JD

远离 R

原文:https://towardsdatascience.com/moving-away-from-r²-4a89b1c70393?source=collection_archive---------20-----------------------

使用它的危险以及如何改进你的分析。

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

作者造成的不良形象

介绍

r 是一个众所周知的模型指标,每个数据分析师都有它的工具箱,但尽管它很流行,数据分析师倾向于谈论和使用这一指标的方式与统计界对它的看法不匹配。在这篇文章中,我希望用简单的图表和语言来解释 R 的一些误用,以及我们如何使用更适用的度量来改进我们的分析。

这篇文章很大程度上受到了 科斯马·沙立子博士的讲稿 的启发。我的意图是将一些难以理解的统计数据转换成一个更加直观和外行的解释。

行动纲要

一些积极使用 R 的人可能想知道这有什么大不了的。以下是一个简短的总结,如果你不同意以下至少一点,也许值得继续读下去。

使用 R 的好理由:

  1. 我想看看我的数据有多嘈杂。

使用 R 的错误理由:

  1. 我想知道我的模型在预测方面有多好。(不好,用均方差代替)
  2. 我想知道我的自变量是否显著。(不好,使用 p 值)
  3. 我想知道我的线性模型在统计上是否显著(不好,使用 f 检验,但是也要确保检查你的假设)
  4. 我想知道我的因变量有多少是由我的自变量解释的(不好…有点……)

还感兴趣吗?太好了,继续读下去!

背景

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

按作者分类的图表

非常简要地回顾一下 R

r 是一个常用于评估线性回归模型的指标。在上图中,我们可以看到红点(预测值)与黑点(实际值)的差异。这两种颜色之间的黑线叫做余数。但是如果我们想想出一些方法来看看我们的残差有多大呢?插入 R。

r 是自变量解释的因变量方差的比例。用不太正式的术语来说,它是一个介于 0 和 1 之间的值,用来描述我们的模型与数据的吻合程度。在许多数据分析领域,R 还充当了比较和评估模型的指标,0 表示非常差的模型,接近 1 的值表示良好的模型。我们用残差平方和(RSS)除以总平方和(TSS ),然后从 1 中减去该分数。

信号和噪音

信号和噪声是数据世界的阴阳两极。信号是指我们试图检测的数据中的一些真相,而噪声是掩盖我们信号的无意义信息。为了把这个比喻带入 21 世纪,你可以把 signal 想象成你想要找到的最喜欢的 Spotify 播放列表,把 noise 想象成那些总是被推销的垃圾播客。在本文中,我将频繁使用这些术语,以便让来自非统计背景的人更容易理解诸如标准差和真实系数值之类的概念。

r:噪声的度量单位

作为数据科学家,我们希望检测数据中的信号。我们开发模型和复杂的分析来做这件事,然后我们评估我们所做的,以确定我们是否做得很好。这就是为什么用 R 来衡量我们信号的强度(或有效性)是如此错误的原因——因为 R 在很大程度上衡量的是我们数据中的噪声。

回想一下,在我们对 R 的简短讨论中,我们说过,自变量解释的是因变量方差的比例。这应该会给我们带来一些危险信号,因为根据定义,我们意识到,随着因变量方差(噪声)的增加,我们能够解释的部分就越少,即使我们保持信号不变。

这可能还没有意义,所以让我们想象一下在保持信号不变的情况下增加噪声是什么样子。

操纵 R

在本例中,我们将创建一些数据。我们要做的是定义我们的信号是什么,引入不同水平的噪声,并观察 R 如何反应。

我们的信号:X 的真实系数等于 1.2

噪声:平均值为 0 且标准差增加的数字的随机相加。

为此,我们将使用以下代码来生成数据。

x1 <- seq(1,10,length.out = 500) 
y1 <- 2 + 1.2*x1 + rnorm(500,0,sd = 1) 

对于 x1,计算机将生成 500 个 1 到 10 之间的数字。对于 y1,我们要取这个数,乘以我们的真实系数(1.2),加上 2,然后加上一个随机分布在 500 左右的随机数,平均值为 0,标准差为 1。

我们将创建 4 个图表和线性回归,以查看我们的结果如何随着标准差的增加而变化。重要的是要认识到,在每一种情况下,我们的信号(真实系数为 1.2)将保持不变,但我们会有不同水平的噪声(长期来看平均值为 0)。

如果 R 测量我们的信号或它的强度,它应该保持大致相等。如果它测量我们数据中的噪声,那么当我们增加模型中的噪声(保持信号不变)时,R 应该直线下降。那么会发生什么呢?

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

按作者分类的图表

你看看那个。我们每次回归的信号是 1.2,每次回归都在 1.2 左右。但是请注意,每次我们增加噪音时,我们的 R 似乎都受到了影响。

这就是为什么 R 可以成为一个破坏性的模型评估者。由于它甚至没有试图测量信号,淡化低 R 的模型会导致我们忽略我们在数据中准确识别信号的时间。

r 和解释:一个解释

早些时候我告诉过你,R 是由自变量解释的因变量方差的比例,但是现在,亲爱的读者,我必须承认这也比看起来更复杂。

当我们经常说一个词的时候,我们可能会欺骗自己认为我们理解了它,但它值得我们注意真正检查“解释”在这里的意思。我担心的是,许多人认为这个模糊的词意味着“原因”。最后,我们应该证明 R 不可能告诉我们 X 导致 Y,或者在两者之间有某种因果联系。

这个简单的实验实际上很容易做。让我们取一些 X,它实际上对 Y 有一些因果影响(和前面的代码一样)。那么,如果 R 确实度量了某种因果联系,并且我们知道 X 是导致 Y 的原因,那么用 Y 解释的 X 的变化的 R 应该低于用 X 解释的 Y 的变化的 R。

让我们进行这个实验,看看我们的 R 有什么不同。

x2 <- seq(1,10,length.out = 500)     
y2 <- 2 + 1.2*x2 + rnorm(500,0,sd = 3)
summary(lm(x2~y2))$r.squared
summary(lm(y2~x2))$r.squared

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

我们代码的输出

我们知道,Y 对 X 没有因果影响,然而,如果我们相信 R 向我们展示了某种因果联系,那么这里的 R 应该是不同的,但它们不是,所以我们必须拒绝任何概念,即 R 可以证明我们的因变量和自变量之间的某种因果联系。

实际上,我认为大多数数据分析师会拒绝说 R 告诉我们 Y 有多少是由 X 引起的,但我确实认为许多人相信这一点。那些通常很少关心方差的人,却惊人地关心有多少方差是由某个变量“解释”的。

所有这些的含义

一旦你理解了 R 和噪声之间的关系,当分析师主要基于 R 值来提升或贬低一个模型时,你会忍不住退缩。正如我们刚刚看到的,R 不能告诉我们数据中的信号,它本身是一个非常有限的指标。

事实上,很难找到一个令人信服的理由来给 R 以它应该得到的关注。这篇文章已经太长了,但是我认为,很多时候沉迷于 R 是一个很坏的习惯,因为它通常会鼓励新人疯狂地过度适应(你的模型可以解释的噪声越多,R 就越好),忽略其他更重要的线性回归模型指标,一旦他们遇到真实世界的数据及其混乱,他们就会失败。

我确实认为 R 在边缘情况下仍然有用,但是几乎每个分析都可以通过使用另一个更适用的度量来改进。它的简单性对任何数据科学的新手来说都是有吸引力的,但是为了更好地掌握统计和数据科学,认识到它的缺点并使用更好的技术是很重要的。

这篇文章是一个白痴数据分析师写的,他极大地简化了提到的统计数据。错误是可能的,但是 R 应该被更谨慎地使用的主要观点仍然存在(至少我希望如此。我知道什么?我只是一个免责消息)。

超越批处理与流

原文:https://towardsdatascience.com/moving-beyond-batch-vs-streaming-continuous-datasets-e00713797929?source=collection_archive---------35-----------------------

连续数据集:通过两种生态系统的可访问性

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

来源:Pixabay

我的世界观很大程度上受我的产品和业务背景的影响,它让我以量化公司或产品价值的统计数据来思考这个世界。随着时间的推移发生了什么?现在发生了什么事?

世界各地的 FAANGs 都明白这一点,并提供量身定制的产品来提供这一价值。当我登录 Google AdWords 时,我不仅可以看到我的活动目前的运行情况,还可以看到它在一段时间内的表现。两者缺一不可,这将是一个不完整的观点。

谷歌分析、脸书和亚马逊拥有看似毫不费力的实时报告。网飞和苹果的反应式界面会根据我的浏览行为和指示的偏好进行更新,为我提供我可能感兴趣的产品和关于我互动方式的当前视图。如果没有基于实时洞察的即时调整,我的用户身份和与这些服务的关系就不会一样。

奇怪的是,当我们使用大多数其他商业工具时,我们的体验会受到影响。你能想到你使用的 B2B 系统没有几天或至少几个小时的报告延迟吗?

回想一下你上一次访问公司的人力资源系统是什么时候。与等待系统更新相比,打电话给他们确认确实做出了改变通常更容易。

B2C 也是如此。向保险公司索赔需要多长时间?你可能认为只有老派、行动缓慢的企业才会有这个问题,但事实并非如此。我们中的大多数人都曾在这样的组织中工作过:每个季度结束后,至少要花一个月的时间来最终确定销售目标。尽管《哈佛商业评论》调查的 83%的企业认为“在最佳时间将数据转化为可操作的洞察力的能力”很重要,但只有 22%的企业表示他们能够成功做到这一点。

但是人们越来越期待反应式的体验。提供这些功能的产品表现明显更好。几乎所有的福布斯未来 50 强都属于这一类别,这并不是巧合,因此 IDC 称到 2025 年 30%的数据将是实时的

那么,是什么让今天的 FAANGs 和明天的预计科技巨头提供这些类型的体验,而不是其他人呢?很可能是因为他们拥有庞大的技术团队,可以绕过当前数据管道的限制。管道分为两类,每一类都有自己的优点和缺点。A16Z 在他们最近的帖子中详细讨论了这些范例。

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

来源:作者创作

批处理系统组织大规模数据集,以便最终用户可以就这些数据集提出问题并快速获得答案。每次发出查询时,这些答案的计算都涉及到对围绕其提问的整个数据集的处理。批处理系统通常用于分析用例,具有特定的优点和缺点:

慢:问题只能问历史,不能问现在发生的事情。批处理系统通常有一天的延迟,但是有可能将这个时间范围降低到几个小时。

**昂贵:**因为每次提出一个问题都会处理整个世界,所以账单会随着数据集的大小和发出的查询数量而迅速增加。

**灵活:**它们易于使用,可以快速询问特定问题或试验新的用例。

流系统查看“事件”并在事件发生时处理每个事件。它们通常用于操作目的,如监控、机器学习或构建反应式体验。

**快速:**有可能在事件发生的几毫秒内获得洞察力或采取行动。

**昂贵且不方便:**用例需要定制开发,构建它们需要一个相当大的工程团队,既要让它们启动并运行,又要维护它们。

**历史很少:**流媒体系统通常只处理最近的数据,而不处理历史信息。

你们中的一些人会说“但是 Kafka 最近使用云存储添加了无限保留,所以我可以在那里卸载我所有的历史,并从我的流媒体系统中获取历史”。你是对的,但有一个相当大的警告——为了实际使用历史数据,你需要通过卡夫卡读回那些数据。雪花不能通过设计直接查询它,任何其他批处理系统也不能,所以如果你想使用一个流系统来查看历史数据,每次提出一个问题,你都需要通过你的代理将数据返回,这有点像用一根吸管连接两个消防水管。这些查询将花费难以忍受的长时间来返回任何有用的信息。雪上加霜的是,这些代理正是您的生产系统所使用的代理。如果你超负荷工作,你会危及生产本身,这是不可取的。

这只是两个世界之间巨大差异的一个例子,不仅仅是在互操作性方面,还有最终用户的类型(分析师与工程师)。大多数大型企业在不同的用例中同时使用批处理和流处理,最终拥有两个完全不同的系统,这两个系统应该是一致的,但很少会这样。

打击一个能够从数据集而不是技术的角度思考的人。

我们知道定制管道可以做到这一点,因为科技巨头支持这种功能。一个显而易见的方法是协调系统间的查询。例如,我可以构建两个独立的管道,在我的分析系统中查询超过一天的数据,在我的流系统中查询最近的数据。这已经作为一个 Lambda 架构得到普及,但是有几个原因导致它不能很好地工作。

首先,光是实施就要花费数百万美元,而且极其耗时,当我想要创建新的数据流和报告视图时,发展成本可能也一样高。当我在系统间查询时,我可能总是会被不一致性所困扰。因此,虽然可能,但这种方法只适用于大型企业,而且效率肯定不高。

即使我想通了所有这些,也几乎不可能获得跨两个系统进行重复数据删除的准确答案,从而限制了此类设置中数据的效用。

对于大多数公司和应用程序来说,这是第二个问题。

仔细看看这个问题,我们只是看到了真正问题的症状:我们正在拼凑点解决方案,试图解决一个整体的业务数据问题。我们有帮助我们移动和处理数据的技术解决方案,但它们的互操作性很差,我们仍然需要协调全面解决方案所需的所有技术基础设施。这是有道理的,因为尽管批量数据处理已经取得了很大进展,但我们还只是处于真正实时连续物化的最早期阶段。所有现有的框架在可以发出的查询类型(例如,窗口)方面都有有意义的限制,这阻止了它们真正像批量分析那样被使用。从功能上来说,这意味着你可以连接和比较最近的数据,但是如果你想做任何超出这个范围的事情,祝你好运。

听起来很像三振出局。

连续数据集:呼唤新范式

到了紧要关头,我们都有一个单一的底层数据集,尽管它可能由来自不同位置的多个信号组成。技术迫使我们将基于基础架构的“批处理”和“流式”视图捆绑在一起,并将其视为相同数据的根本不同的副本。当工程师想要构建一个新的用例时,他们需要协调这些副本。当他们创建依赖于低延迟流数据的服务时,他们必须从批处理环境中手动回填细节。这有着至关重要的连锁效应,当制定新的数据驱动的用例、发展或将它们集成到您的堆栈中时,这会限制或至少增加潜在使用模式的复杂性。

迄今为止,流媒体系统一直是围墙花园。静态数据存储在基于技术的专有格式和位置中,只能通过向流系统请求该数据来读取。您的数据永远不应该被锁定在访问层之后,而是以您的用户(了解批处理系统)可以直接访问的格式存储。如果是这样的话,我们可以有一个服务于低延迟流用例的单一数据表示,同时仍然可以被广泛使用的批量分析工具生态系统查询。

格式不是唯一不应该受制于技术和供应商的东西。您的数据应该存储在一个便宜、可访问且灵活的位置。对于这些要求,实际上只有一个选项—云存储—几乎是为任务定制设计的。这听起来有些愚蠢和过时,但大多数流媒体系统仍然在本地存储数据,并迫使用户担心当他们的磁盘填满时该怎么办。

我们应该能够清楚地表达我们关心的数据集,并确信技术将允许访问历史和非常低延迟的更新,这些更新是可访问的,并由云存储支持:连续数据集,尽管仅此还不够。为了满足我们的业务需求,连续数据集需要其他特定属性:

  1. **数据目录。**存放数据并易于搜索的单一位置。太多的企业依赖分散在工具中的分散数据。通过在企业内创建一个全局命名空间,数据目录可以包含每一条有权限的可用信息,以确保正确的用户可以访问。
  2. **可审计性。**改变某样东西的价值不应该看起来像是覆盖它,而是记录它的新价值。我们应该总是能够回到过去,看到任何数据集的完整历史。
  3. **无限变换。**这很难,但我们需要廉价地创建新的衍生数据集的能力,通过连接、扩充或转换上游数据集,这些数据集始终保持最新和完整。这些转换不能受制于今天的流窗口或回看限制,这些限制迫使用户为特定查询改变工具。
  4. 秤。即使是数据仓库也有局限性。工作流不应该根据规模需求来强制选择技术。
  5. **互通性。**这些数据集应该与团队使用的任何工具一起工作。雪花,蜂房,数据库,SaaS 工具等应该很容易插入,并与历史和当前信息保持同步。

河口流是第一个考虑连续数据集的系统,有助于为每个人提供与 FAANG 一样的优质用户体验和业务洞察。

从数据库思维模式转向数据湖思维模式

原文:https://towardsdatascience.com/moving-from-a-database-mindset-to-a-data-lake-mindset-d93ffae7caca?source=collection_archive---------15-----------------------

使用数据湖时的三种范式转变

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

图片作者:乔尔·安巴斯

使用数据库和数据湖之间有几个关键的概念差异。
在这篇文章中,让我们找出一些乍一看可能并不直观的区别,尤其是对于具有强大关系数据库背景的人来说。

该服务器是一次性的。数据在云中。

解耦存储和计算:这是谈论数据湖的经典案例。

在传统数据库系统(以及最初基于 Hadoop 的数据湖)中,存储与计算服务器紧密耦合。服务器或者内置存储,或者直接连接到存储。

在现代基于云的数据湖架构中,数据存储和计算是独立的。数据保存在云对象存储中(例如:AWS S3,Azure 存储),通常是像 parquet 这样的开放格式,计算服务器是无状态的,它们可以在任何需要的时候启动/关闭。

存储和计算的分离实现了:

  • 降低计算成本:服务器在必要时运行。不使用时,可以关闭它们,从而降低计算成本。
  • 可扩展性:您不必为峰值使用量购买硬件。服务器/CPU/内存的数量可以根据当前的使用情况动态增加/减少。
  • 沙箱:多个计算服务器/集群可以同时读取相同的数据。这允许您有多个团队,在不同的集群中,并行工作,读取相同的数据,而不会相互影响。

原始数据才是王道!精选的数据是从。

在数据库范例中,来自源系统的数据被转换并加载到数据库表中后,就不再有用了。在数据湖范式中,原始数据作为真实的来源保存,最终永远保存,因为它是真正的资产。

然而,原始数据通常不适合企业用户使用,因此需要经过一个处理过程来提高质量、提供结构并简化使用。经过筛选的数据最终会被存储起来,供数据科学团队、数据仓库、报告系统和业务用户使用。

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

数据湖策展(来源:作者图片)

典型的数据湖消费者只看到经过策划的数据,因此他们对策划的数据比对生成它的原始数据更看重。

然而,数据湖的真正资产是原始数据(以及监管管道),在某种意义上,监管数据类似于可以随时刷新的物化视图

关键要点

  • 可以随时从原始数据中重新创建。
  • 可以通过改进的固化过程重新创建。
  • 我们可以有多个精选视图,每个视图用于一个特定的分析。

今天做出的模式决策不会约束未来的需求

通常,信息需求会发生变化,需要分析一些最初不是从源/操作系统收集的信息。

在一个典型的场景中,如果原始的原始数据没有被存储,历史数据将永远丢失。

然而,在数据湖体系结构中,今天做出的不将字段加载到管理模式上的决定可以在以后撤销,因为所有详细信息都安全地存储在数据湖的原始区域中,并且历史管理数据可以用附加字段重新创建。

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

策划模式演变(图片由作者提供)

关键要点

  • 如果您现在不需要,就不要花太多时间去创建一个通用的“一刀切”的管理模式。
  • 迭代地创建一个管理模式,从添加您现在需要的字段开始。
  • 当需要其他字段时,将它们添加到监管流程中并重新处理。

最后的想法

数据湖不是数据库的替代品,每种工具都有其优点和弱点。

对于 OLTP 来说,使用数据湖可能和使用数据库来存储万亿字节的非结构化数据一样糟糕。

我希望这篇文章有助于揭示两个系统之间的一些关键设计差异。

从熊猫到星火

原文:https://towardsdatascience.com/moving-from-pandas-to-spark-7b0b7d956adb?source=collection_archive---------13-----------------------

当您的数据集开始变大时,迁移到 Spark 可以提高速度并节省时间。

大多数数据科学工作流都是从熊猫开始的。Pandas 是一个很棒的库,可以让你做各种各样的转换,可以处理不同种类的数据,比如 CSV 或 JSONs 等。我喜欢熊猫——我在上面制作了一个名为“为什么熊猫是新的 Excel”的播客。我仍然认为熊猫是数据科学家武库中的一个令人敬畏的图书馆。然而,当你正在处理的数据集变得太大时,熊猫就会开始耗尽内存。正是在这里,火花进入画面。

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

Spark 对于大型数据集来说是很棒的❤️ [ 来源

我以问答的形式写这篇博文,带着你可能会有的问题,我刚开始写的时候也有。

Q1。什么是火花?

Spark 是一个处理海量数据集的框架。它允许您以分布式方式处理大数据文件。它让几个工人运转起来,这些工人处理你的大数据集,所有这些都由一个驱动节点来编排。该框架的分布式特性使您可以将其扩展到数 TB 的数据。你不再被任何一台机器的内存所限制。Spark 生态系统现在已经发展得如此之快,以至于您不需要担心任何工作流程编排,并且可以开箱即用,性能卓越。

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

星火生态系统参考

Q2。什么时候应该搬出熊猫,认真考虑用 Spark?

这取决于你机器的内存。我想说大于 10GB 的数据集对熊猫来说太大了,Spark 在这里变得非常有益。假设您的数据集中有 10 列,每个单元格有 100 个字符,因此大约有 100 个字节,并且大多数字符都是 ASCII 码,可以用 1 个字节进行编码,那么 10M 行将是您应该想到 Spark 的地方。

Q3。Spark 做什么都比熊猫好吗?

不要!对于初学者来说,学习熊猫肯定要容易得多。Spark 可能更难,但有了最新的 API,您可以使用数据帧处理大量数据,这些数据帧几乎和熊猫数据帧一样容易处理。

此外,直到最近,Spark 还不太支持可视化。你只能对数据子集进行可视化。最近,当 Databricks 宣布他们将在 Spark 中对可视化提供原生支持时,情况发生了变化(我仍在等待看到这一点)。但在这种技术成熟之前,Spark 至少在虚拟世界里不会完全取代熊猫。您总是可以通过df.toPandas()将 Spark 数据帧转换成 Pandas,然后运行可视化或 Pandas 代码。

Q4。Spark 设置起来很吓人。我该怎么办?

Spark 可以通过 PySpark 或 Scala(或 R 或 SQL)在 Python 中进行交互。我写了一篇关于在本地或定制服务器上开始使用 PySpark 的博客——人们评论说开始使用 PySpark 有多难。我认为在尝试运行 Spark 时,您可以直接使用托管云解决方案。

我推荐两种开始使用 Spark 的方法:
1。Databricks —这是一个完全托管的服务,为您管理 AWS / Azure / GCP 中的 Spark 集群。他们有可以运行的笔记本,与 Jupyter 笔记本非常相似。
2。亚马逊 EMR 和 Zeppelin 笔记本 —这是由 AWS 提供的半托管服务。您需要托管一个 Spark EMR 端点,然后运行 Zeppelin 笔记本与之交互。其他云提供商也有类似的服务,我在这里不包括他们。

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

Databricks 是托管 Spark 集群的一种流行方式[ImageSourcewith CClicense

Q5。Databricks 和 EMR 哪个好?

在花了几个小时试图了解两者的利弊之后,有一些考虑:
a) EMR 完全由亚马逊管理,你不需要离开 AWS 生态系统。
b)如果您有 devops 专业知识或有 devops 人员帮助您,EMR 可能是一个更便宜的选择——您需要知道如何在完成后上下旋转实例。也就是说,EMR 可能不稳定,你可能需要花几个小时调试。Databricks Spark 要稳定得多。
c)使用 Databricks 很容易安排作业——您可以非常轻松地安排笔记本电脑在一天或一周的特定时间运行。它们还提供了一个到 Ganglia UI 中指标的接口。
d)对于 Spark 作业而言,Databricks 作业可能比 EMR 作业贵 30–40%。但是考虑到灵活性和稳定性以及强大的客户支持,我认为他们是值得的。Databricks 在 Spark 中以交互方式运行笔记本电脑的收费是 6-7 倍,所以请注意这一点。鉴于 30/60/120 分钟的活动后,你可以拒绝实例,从而节省成本,我仍然认为他们可以整体更便宜。

鉴于这几点,我想说如果这是你的第一个 Spark 项目,你应该选择 Databricks,但是如果你有大量的 DevOps 专业知识,你可以尝试 EMR 或者在你自己的机器上运行 Spark。如果你不介意公开分享你的工作,你可以免费试用 Databricks 社区版或者用他们的企业版做 14 天的试用

Q6。PySpark 和熊猫相比有多相似或不同?

我觉得这值得有自己的博客。星火计划的贡献者安德鲁·雷的这个演讲应该可以回答你的一些问题。
主要相似之处有:
a) Spark 数据帧与熊猫数据帧非常相似。
b) PySpark 的 groupby、aggregations、selection 等变换都和熊猫很像。与熊猫相比,PySpark 稍微难一点,有一点学习曲线——但感觉相似。

主要区别是:
a) Spark 允许你用 SQL 和 Python查询数据帧,我觉得这真的很棒。有时,用 SQL 编写一些逻辑可能比用 Pandas/PySpark 记住确切的 API 更容易,您可以这样做,也可以互换工作。
b) 火花数据帧是不可变的。不允许切片,覆盖数据等。
c)Spark※懒评。它构建了一个所有转换的图表,然后当你实际提供一个动作,比如collectshowtake时,它会懒洋洋地评估它们。转换可以是宽的(查看所有节点上的全部数据,因此orderBygroupBy)或窄的(查看每个节点中的单个数据,因此containsfilter)。与窄转换相比,进行几个宽转换会慢一些。与熊猫相比,你需要更加注意你正在使用的广泛转换!

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

Spark 中的窄与宽转换。大范围转换速度较慢[图片由作者提供]

Q7。还有什么其他优势可以火花吗?

Spark 不仅提供数据帧(rdd 上的高级抽象),还通过 MLLib 提供优秀的流数据和分布式机器学习 API。因此,如果你想对流数据进行转换,或者想在大型数据集上进行机器学习,Spark 可能会对你有用。

Q8。有 Spark 的数据管道架构的例子吗?

是的,这里有一个 ETL 管道,原始数据从数据湖(S3)处理,并在 Spark 中转换,加载回 S3,然后加载到像雪花或红移这样的数据仓库,然后驱动像 Tableau 或 Looker 这样的 BI 工具。

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

BI 工具的大型数据处理 ETL 管道示例[图片由作者提供]

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

在 Amazon SageMaker 中执行 ML 的示例管道

您也可以首先从仓库内不同的来源收集数据,然后使用 Spark 转换这些大型数据集,将它们加载到 S3 的 Parquet 文件中,然后从 SageMaker 读取它们,以防您更喜欢使用 SageMaker 而不是 Spark 的 MLLib。SageMaker 的一个额外优势是,它让您可以轻松部署,并通过 Lambda 函数触发模型,而 Lambda 函数又通过 API Gateway 中的 REST 端点连接到世界。我已经写了一篇关于这个架构的博文。另外学习 SparkJules Damji 的书学习 Spark 真的很棒。

这就完成了从熊猫到星火的博文。我们讨论了一些相似点和不同点,开始使用 Spark 的最佳方式,以及一些利用 Spark 的常见架构。

如有任何问题或意见,请通过 LinkedIn 联系我!

资源:
1。Jules Damji 讲述 Spark 如何工作的幕后故事。
2。朱尔斯·丹吉的《学习的火花》一书。
3。比较熊猫句法和安德鲁·雷的 PySpark talk

MPIRE for Python:多重处理非常简单

原文:https://towardsdatascience.com/mpire-for-python-multiprocessing-is-really-easy-d2ae7999a3e9?source=collection_archive---------1-----------------------

MPIRE 简介,这是一个速度极快且最用户友好的 Python 多处理库

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

Jarek Jordan 在 Unsplash 上的照片

Python 是一种流行的编程语言,原因有几个。最重要的是,它易于设置和学习,因此开发速度快。然而,一个主要的缺点是 Python 的执行速度。与许多其他流行的编程语言相比,Python 在速度方面排在最后。幸运的是,通过用 C 编写许多性能关键的库并添加 Python 包装器(例如 NumPy),速度问题已经大大缓解了。这些解决方案运行良好,它们可以利用多线程进行并行计算。当您自己的代码降低了您的速度,并且您想要并行化纯 Python 代码时,事情就变得棘手了。

通过多线程,单个进程的多个线程被同时执行。用 C/C++编写的库可以毫无问题地利用多线程。Python 不能利用多线程,因为臭名昭著的全局解释器锁(GIL)。我不会去解释它是做什么的,为什么它还在这里,因为有很多关于这个话题的其他优秀的博客帖子。这里要记住的是,由于这个 GIL,Python 不能像其他语言一样利用多线程处理 CPU 密集型任务。(注意:对于 I/O 密集型任务和其他释放 GIL 的任务,多线程可以很好地工作。)

因此,Python 程序员经常需要依赖多重处理,新的进程同时产生和执行。通过产生新的进程,我们有效地避开了 GIL。然而,为了在这些进程之间进行通信,我们需要使用管道或队列。这些通信原语不仅降低了多重处理的速度,而且如果你不是很有经验的话,它们也很难使用。

有许多 Python 库提供了多处理能力,并且不需要编写所有样板代码来处理进程和进程间通信。例如,有multiprocessing.Poolconcurrent.futures.ProcessPoolExecutor类,它们都可以在 Python 标准库中找到。此外,还有 Joblib 等第三方包,以及 Dask 和 Ray 等分布式计算包。后一类还提供了跨几台机器的计算。然而,在我 7 年的 Python 程序员生涯中,单台机器上的多处理通常就足够了,建立一个工人集群的额外成本得不偿失。

然而,即使有这么多图书馆,没有一个能让我满意。大多数都有一个陡峭的学习曲线,因为它们引入了一个全新的关于multiprocessing.Pool的编程语法,提供了很差的错误处理,或者根本没有提供我正在寻找的所有功能。因此,四年前,我创建了一个新的包,它可以完成所有这些功能,甚至更多。它已经在 Slimmer AI 的几十个项目中使用,经过几次迭代的反馈和在生产环境中的暴露,它已经成为今天的成熟包。它现在是 Slimmer AI 的首选多处理库,最近,我们在 GitHubPyPI 上公开了它。文档可在这里获得。

在这篇博文中,我将介绍我们的多处理库 MPIRE(多处理真的很简单),并将它与现有的库在功能、易用性和速度方面进行比较。除了普通的串行处理,我对 MPIRE 进行基准测试的库有multiprocessing.Poolconcurrent.futures.ProcessPoolExecutor(一个multiprocessing.Pool的包装器)、Joblib、Dask 和 Ray。在这篇文章的剩余部分,我将用ProcessPoolExecutor来指代concurrent.futures.ProcessPoolExecutor

MPIRE 概述

MPIRE 构建在流行的multiprocessing 标准库之上,大部分遵循相同的语法,这使得它非常容易学习。mpire.WorkerPool级类似于multiprocessing.Pool级,但是增加了更多的特性和配置选项。MPIRE 的主要特点是:

  • 比其他多处理库执行速度更快
  • 直观的 Pythonic 语法
  • 优雅且用户友好的异常处理
  • 通过一组工作人员轻松使用写入时复制共享对象
  • 每个工作者可以有自己的状态,并且通过方便的工作者初始化和退出功能,可以容易地操纵该状态
  • 进度条支持使用 tqdm
  • 仪表板支架
  • Worker insights 可让您深入了解多处理效率
  • 子进程可以被固定到特定的或一系列的 CPU 上
  • 多种进程启动方法可用,包括:fork、forkserver、spawn 和 threading(是的,threading)
  • 可选地利用 dill 作为通过多进程的序列化后端,支持在 iPython 和 Jupyter 笔记本中并行化更多外来对象、lambdas 和函数

对于这篇博文来说,浏览所有特性太多了。因此,我将重点放在几乎每个多处理任务的相关特性上。请参考文档了解更多关于 MPIRE 的其他特性。

让我们看几个例子,并将 MPIRE 与其他库进行比较。

例 1。句法

假设我们有一个耗时的函数:

我们想调用 100 次并并行化:

Joblib 和 Ray 相对于multiprocessing.Pool引入了全新的语法。这意味着需要更多的时间来学习如何充分和优化地利用这些库。相比之下,MPIRE 的语法非常接近multiprocessing.Pool

在没有多处理的情况下运行这个函数大约需要 100 秒,而所有经过测试的多处理库大约需要 20 秒。这是因为它们都被配置为创建 5 个流程,从而并行处理 5 个任务。在启动子进程和进程间通信时会有一些小的开销,但是在这种情况下预期会有 5 倍的加速。

示例 2:进度条

让我们添加一个进度条,让事情变得更有趣一点。当然,当你运行一个长任务时,你想知道任务的状态和完成的时间。我们将建立在前一个例子的基础上,利用tqdm作为进度条库。

multiprocessing.Pool的情况下,如果我们想要显示实时进度信息,我们必须使用imap,一个返回生成器的map的惰性版本。尽管 Ray 有一个仪表板,但是在那里找不到进度信息。ProcessPoolExecutor和雷都引入了许多样板代码来实现进度条这样的琐碎工作。然而,雷在这里拿了蛋糕。当使用 MPIRE 时,我们可以简单地设置progress_bar标志,我们就完成了。

示例 3:异常处理

尽管您可能很有经验,但每个人都会偶尔引入 bug。在多处理上下文中调试异常并不总是容易的。然而,多重处理库至少可以使调试变得更容易。让我们看下面这个简单的例子:

现在,这个函数到处都在叫ZeroDivisionError ,这里只是为了说明。让我们看看不同的库将如何处理以下数据:

我们稍微修改了一下上面的代码,以使用新的函数和数据,但大部分都是相似的。完整代码见此链接。我们来看看输出。

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

光线(上)、Joblib(中)、MPIRE(下)的错误输出。图片作者。

对于大多数库,我们可以确切地看到哪一行导致了错误,即return (x * y) / z。然而 Joblib 和 Ray 只表示发生在some_function的第 3 行。即使雷召唤出一个RayTaskError(ZeroDivisionError),它仍然可以作为普通ZeroDivisionError被抓,所以那里不用担心。然而,这些回溯之间的主要区别在于,MPIRE 显示传递给导致错误的函数的参数。这使得调试更加容易。唯一做这件事的其他图书馆是 Dask。

MPIRE 包含更多的特性,其中一些将在接下来的基准测试部分展示。

基准

这篇帖子显示了三个基准的结果,这些结果来自 2019 年由罗伯特·西原发表的关于雷的帖子。为了使基准测试更加公平,我将客户端的启动和关闭调用添加到总基准测试时间中,并删除了代码来“预热”Ray 工作线程。后者本来是作者做的,因为初始内存访问比较慢。预热在实践中并不常见,无论如何,所有多处理库都会受到预热的影响。此外,我增加了每个基准测试的工作负载,并使其在不同数量的内核之间保持一致,以更好地了解增加更多工作人员的好处。最后,通过允许使用[Manager](https://docs.python.org/3/library/multiprocessing.html#multiprocessing-managers) 对象,一些多处理实现得到了进一步优化。同样,这使得比较更加公平。

基准测试运行在一台具有 20 个内核的 Linux 机器上,禁用了超线程,内存为 200GB(对于这些基准测试来说已经足够了)。对于每项任务,使用不同数量的流程/工人进行实验,结果在 5 次运行中取平均值。各个库和基准测试的计时是一致的,所以为了使图形不那么混乱,省略了误差线。所有基准代码都可以在这里找到。查看[requirements.txt](https://github.com/sybrenjansen/multiprocessing_benchmarks/blob/main/requirements.txt) 文件,了解需要安装哪些依赖项。

基准 1:数字数据

该基准使用不同的图像过滤器处理图像。每个滤镜的图像保持不变。因此,能够以某种方式将图像发送给每个进程的库具有明显的优势。这在multiprocessing.Pool中是不可能的,因为你需要求助于multiprocessing.Process 并且自己处理所有的通信和启动/加入过程。不理想。对于 MPIRE,代码如下所示:

就这么简单。该映像作为一个写时复制共享对象传递给每个进程,这意味着数据没有被复制,但底层内存被重用。只有当进程改变图像数据时,才会制作副本。在我们的例子中,这种情况不会发生,所以我们是安全的,处理将会很快。

计时结果如下图所示:

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

数值计算基准测试结果平均超过 5 次运行。图片作者。

multiprocessing.PoolProcessPoolExecutor明显表现不佳,我们认为为他们使用 4 名以上的工人没有额外的好处。每次发送图像显然会导致大量开销。另一方面,随着工作人员数量的增加,其他库的计算时间确实持续减少。当使用 4 个或更少的工人时,Joblib 和 Ray 都比 Dask 和 MPIRE 慢一点,但之后它们会赶上来。最终,Joblib 和 MPIRE 胜出,尽管差距很小。

在这个基准测试中,Joblib 利用其 NumPy 内存映射特性来加速重复共享相同的图像对象。禁用此项会显著增加 Joblib 的总时间。所以重要的是要记住,当你在一个不是 NumPy 数组的对象上做简单的计算时,Joblib 不会那么快。

基准 2:有状态计算

在第二个基准中,每个工作者跟踪自己的状态,并且应该在新任务到来时更新它。正如在原始 Ray post 中一样,任务是处理文本文档并跟踪单词前缀计数——最多 3 个字符。每当某个前缀出现 3 次以上时,一旦处理完所有文档,就应该返回该前缀。

执行流前缀计数的简单类如下所示:

注意:StreamingPrefixCount 的这个实现类似于来自原始 Ray post 的,并不保证返回所有文档的正确前缀。然而,这在这种情况下并不重要,因为这个基准只是用来说明有状态计算。

可以为每个工作人员存储本地数据,并在所有工作完成后返回数据的库显然最适合这项任务。支持这一点的库有 Dask、Ray 和 MPIRE。 DaskRay 都支持Actors,支持有状态计算。然而,对 Dask 来说,这种支持似乎是实验性的,我无法让它在不崩溃的情况下工作。为了避免使用Actors ,我使用了get_worker,并在最后发送了一个特殊的哨兵令牌来收集结果。它并不漂亮,但很管用。

对于 Ray 来说,Actor 功能运行良好。人们可以使用ActorPool 来很好地分配工作量:

对于 MPIRE,我们可以利用 https://slimmer-ai.github.io/mpire/usage/workerpool/worker_state.html [worker_state](https://slimmer-ai.github.io/mpire/usage/workerpool/worker_state.html)[worker_exit](https://slimmer-ai.github.io/mpire/usage/map/worker_init_exit.html)功能。在这种情况下,我们还可以利用写入时拷贝:

与其他库相比,样板代码的数量有限。与 Ray 一样,还有一个额外的好处,即负载会自动在工作人员之间进行平衡。

multiprocessing.PoolProcessPoolExecutor和 Joblib 对 worker 状态没有支持,需要依赖 Python Manager对象。使用Manager对象的缺点是它们存在于独立的服务器进程中,任何状态变化都必须通过代理传递给它们。因此,这些库的性能受到了很大的影响,与串行处理相比,性能更差。

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

5 次运行的平均有状态计算基准测试结果。图片作者。

串行处理的时间在这里有一点波动,尽管它只能利用一个工作线程。对于这个基准测试,每个工作者都有自己的状态,并保持本地前缀计数。为了使比较公平串行处理还利用了多个StreamingPrefixCount 对象,等于工人的数量。

从结果来看,Dask 在速度上显然很难赶上 Ray 和 MPIRE。如果 Dask 要修复他们的Actor 实现,可能会不相上下。雷和姆皮尔的表现差不多。虽然,MPIRE 一直比它快一点点,但差距很小。

基准 3:昂贵的初始化

在该基准中,神经网络模型用于预测图像数据集上的标签。(注:为了简单起见,反复使用同一个数据集进行预测。)加载这个模型只需要几秒钟。但是如果每项任务都需要这样做,那么时间会很快增加。虽然这个基准看起来与前面的例子相似,但是这个基准不需要跟踪工作状态的变化。

对于下面的代码片段,假设我们有一个Model 类,它在创建时加载到模型和数据集中。对于multiprocessing.Pool,代码如下所示:

对于 MPIRE,我们再次利用[worker_state](https://slimmer-ai.github.io/mpire/usage/workerpool/worker_state.html)。这一次,我们还使用了[worker_init](https://slimmer-ai.github.io/mpire/usage/map/worker_init_exit.html)功能:

我们可以在这里再次利用写时复制,但是 Tensorflow 模型在这样做的时候并不好用。然而,使用worker_init功能也一样快。注意,我们将keep_alive设置为True。默认情况下,MPIRE 会在一次map调用后关闭工作线程,以减少内存需求。由于 MPIRE 启动和停止工作线程的速度非常快,而 Python 可能非常需要内存(它倾向于将分配的内存保持在备用状态),这通常是所希望的行为。然而,在这种情况下,我们不希望每次运行都重新加载模型,所以我们保留了工作线程。方便的是,当退出上下文管理器时,它们会自动关闭。

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

昂贵的初始化基准测试结果平均超过 5 次运行。图片作者。

Joblib 和 Dask 一开始都表现不错,但很快被 Ray 和 MPIRE 超越。multiprocessing.PoolProcessPoolExecutor似乎在最后赶上了,但是你必须意识到,如果加载模型的时间增加,它们之间的差异——以及像 Ray 和 MPIRE 这样的库——也会增加。

总体基准性能

当将基准计时标准化到 0–1 的范围并取平均值时,我们看到以下趋势:

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

平均归一化基准结果。图片作者。

所有多处理库都可以超越单核性能,这是关键所在。Joblib 明显优于multiprocessing.PoolProcessPoolExecutor,反过来 Dask 也击败了 Joblib,因为它有存储状态的能力。MPIRE 和 Ray 的性能甚至比 Dask 还要好,是首选。

虽然 Ray 和 MPIRE 的速度差不多,但是当您只能在一台计算机上使用时,MPIRE 的易用性使其成为更有趣的库。

摘要

这篇博客文章介绍了 MPIRE,这是一个用于 Python 的多处理库,它易于使用,包含许多特性,并且在速度方面一直胜过所有其他的多处理库。

MPIRE 不仅具有直观的 Pythonic 语法,还具有本机进度条支持和用户友好的异常回溯。后者将减少您的调试时间,并让您的注意力集中在重要的地方:尽可能快速地执行您的工作。

如果你发现 MPIRE 是一个对你自己的工作有价值的多重处理工具,我很乐意听到你的意见。我希望它为你提供效率收益,就像它为我们在 Slimmer AI 提供的一样。

mpl finance——matplolib 相对不为人知的用于绘制金融数据的库

原文:https://towardsdatascience.com/mplfinance-matplolibs-relatively-unknown-library-for-plotting-financial-data-62c1c23177fd?source=collection_archive---------10-----------------------

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

照片由 Yiorgos NtrahasUnsplash 上拍摄

包括快速创建图表的方法,如烛台,连科,或点和图

众所周知,matplotlib是非常通用的,可以用来创建几乎任何你想要的图表。这可能不是最简单或最漂亮的,但在 StackOverflow 上看了足够多的问题后,它很可能最终会很好地解决。

我知道在纯粹的matplotlib中创建像蜡烛图这样的金融图表是可能的,但这不是最愉快的体验,有更简单的方法来使用库,如plotlyaltair(我在的另一篇文章中介绍了这一点)。然而,直到最近我才发现matplotlib有一个单独的库/模块专门用于金融策划。它叫做mplfinance,在这篇文章中,我将展示它的一些漂亮而独特的特性。

设置

设置相当标准。首先,我们导入库。

然后,我们下载股票价格来处理——对于本文,我们使用 2020 年下半年的苹果股票价格。如果你对下载股票价格的更多细节感兴趣,你可以看看我的另一篇文章。

OHLC 海图

mplfinance提供了几种有助于分析资产价格模式的图表。第一个,也是库中默认的一个,是 OHLC 图表。我们可以简单地使用plot函数来创建它:

mpf.plot(df["2020-12-01":])

其中df是一个包含 OHLC 数据的pandas数据帧和一个DatetimeIndex。我们将数据限制到上个月,只是为了清楚地看到该图元素的形状。

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

作者图片

这种解读与蜡烛图非常相似。左边的横线表示开盘价,右边的横线表示收盘价。垂直线代表价格的波动性,我们可以从两个极端读取高/低价格。

在这一点上,值得一提的是mplfinance提供了一种在一个图表上堆叠多层信息的简单方法。例如,假设我们想将最高价和最低价作为线添加到先前创建的绘图中。我们可以使用make_addplot函数轻松做到这一点,如下所示。我们首先定义附加行,然后将它们作为额外的参数传递给绘图函数。

运行该代码会生成下面的图像,该图像仅确认垂直线的极值对应于给定日期的最高价和最低价。

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

作者图片

自然,这是一个简化的例子。在更复杂的情况下,我们可能会对添加一些技术指标感兴趣,例如,布林线或简单的移动平均线。我们将很快回到后一个问题。我们也可以使用相同的功能来创建符号,显示我们进入/退出位置。你可以在这里找到一个很好的例子。

蜡烛图

下一个可用的图表类型是烛台图表。用mplfinance生成它们就像给plot函数添加一个额外的参数一样简单。

mpf.plot(df["2020-12-01":], type="candle")

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

作者图片

当你看着蜡烛和日期时,很明显有一些遗漏的日期。这自然是因为市场在周末和一些特殊的日子是关闭的。如果你想考虑这一点,你可以给plot函数提供一个额外的参数:

mpf.plot(df["2020-12-01":], type="candle", show_nontrading=True)

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

作者图片

让我们给情节添加更多的信息。首先,我们可以向plot函数传递一个方便的参数—— mav ——它会自动添加我们想要的任何简单的移动平均线。对于这个情节,我们来取 10 天和 20 天的 MAs。其次,我们还可以添加交易量。

mpf.plot(df, type="candle", mav=(10, 20), volume=True)

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

作者图片

伦科图表

老实说,mplfinance是我第一次看到以下两种剧情,因为它们不像《OHLC》和《烛台排行榜》那样受欢迎。第一种被称为伦科图表,它是利用价格变动构建的,不像大多数图表那样考虑标准化的时间间隔。

在实践中,它的意思是,当价格移动一个特定的量时,一个新的块被创建,每个后续的块与前一个块成 45 度角添加,或者在它的上面或者在它的下面。

Renko 图表最常见的用途是从价格序列中过滤噪声,并帮助识别价格趋势。这是因为所有小于指定方框大小的价格变动都被过滤掉了。

我们可以通过在使用plot函数时简单地指定type参数来创建 Renko 图表。

mpf.plot(df,type="renko")

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

作者图片

我们也可以根据自己的喜好修改砖块的大小。在下面的代码片段中,我们将其设置为 2。

mpf.plot(df, type="renko", renko_params=dict(brick_size=2))

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

作者图片

点数图

库中可用的最后一种绘图类型是点数图。与伦科图表类似,它没有考虑时间的流逝。P&F 图使用堆叠的 X 和 O 柱,每个符号代表一个特定的价格变动(由盒子大小决定,我们可以根据自己的喜好调整)。

x 代表价格上升一定的量,而 O 代表下降。我们需要的最后一条信息是创建不同符号的新列的条件(O 跟在 X 后面,反之亦然*)。为了创建一个新的列,价格必须按照冲销金额进行更改,该金额通常设置为盒子大小的三倍(在mplfinance中,默认值为 1)。*

*mpf.plot(df, type="pnf")*

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

作者图片

我们可以很容易地将这张 P&F 图与第一张伦科图进行比较,以发现完全相同的模式。

添加风格和一般美化

使用mplfinance创建的情节对于一句俏皮话来说已经很好看了,所以肯定是在纯粹的matplotlib中不会经常发生的事情。然而,我们可以使用 plot 函数中更多的选项来使我们的绘图更加漂亮。

对于下一个情节,我们改变比例的数字,添加一个标题,选择紧凑的布局和应用一种风格。我们使用币安风格,这使得情节类似于流行的加密交换。

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

作者图片

就我个人而言,我认为对于我们必须编写的额外代码来说,这是一个很大的改进。如果您想知道库中有哪些样式,可以使用以下命令查看所有样式:

*mpf.available_styles()*

最后,我们还可以轻松地将图形保存到本地文件中。为此,我们只需向plot函数的savefig参数提供文件名。代码将如下所示。

外卖食品

  • mplfinancematplotlib投资组合中的一个库,专门用于绘制资产价格数据
  • API 非常容易使用,我们经常可以用一行程序创建漂亮的图表
  • 该库提供了一些不常见的绘图类型,如 Renko 图或点和图形图

您可以在我的 GitHub 上找到本文使用的代码。此外,欢迎任何建设性的反馈。我也很好奇你是否听说过 Renko/Point 和 Figure 图表,甚至可能在实践中使用过它们。你可以在推特或评论中联系我。

如果你有兴趣学习如何使用 Python 进行量化金融,你可能想看看 Quantra ( 免责声明:一个附属链接),它提供了关于这个主题的各种不同的课程。

来自《走向数据科学》编辑的注释: 虽然我们允许独立作者根据我们的 规则和指南 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

如果您喜欢这篇文章,您可能还会对以下内容感兴趣:

*</9-useful-pandas-methods-you-probably-have-not-heard-about-28ff6c0bceee> [## quantra——学习量化金融的 Python 编码平台

towardsdatascience.com](/quantra-a-python-coding-platform-to-learn-quantitative-finance-8e5e88c89120)*

“MRMR”准确地解释了你希望别人如何向你解释

原文:https://towardsdatascience.com/mrmr-explained-exactly-how-you-wished-someone-explained-to-you-9cf4ed27458b?source=collection_archive---------1-----------------------

想要改进您的功能选择吗?“最大相关性-最小冗余度”(又名 MRMR)是优步的机器学习平台使用的一种算法,用于寻找“最小最优”的特征子集。

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

[作者图]

MRMR(最大相关度-最小冗余度的首字母缩写)是一种特征选择算法,在优步工程师于 2019 年发表这篇论文后获得了新的流行:

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

截图来自:来源

作者展示了他们如何通过MRMR在各种营销应用中实现自动特征选择,其中包括:

  • 用户获取,
  • 交叉销售/追加销售,
  • 用户流失和重新激活。

然而,MRMR 并不是最近才被发现的。这是由两位伯克利的研究人员在 2005 年发表的论文中首次提出的:

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

截图来自:来源

作者声称,在成千上万的基因中,选择其中的几个(例如 50 个)就足以实现这项任务(预测疾病)的最高准确度。所以关键是:我们如何找到这 50 个幸运儿?这正是 MRMR 最初设计的目的。

从这两个例子中,很明显MRMR有多灵活,这可以在完全不同的领域证明是有用的,从市场营销到基因组学

在这篇文章中,我们将看到 MRMR 是如何工作的,以及它与其他流行的特征选择算法(如博鲁塔)有何不同(如果你想了解更多关于博鲁塔的信息,我已经写了一篇专门的帖子:博鲁塔准确地解释了你希望别人如何向你解释)

最小最优与所有相关

特征选择算法可以大致分为两类:

  • 极小最优(如MRMR);
  • 全相关(如博鲁塔)。

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

特征选择就像玩飞镖…[作者图]

最小最优方法寻求识别一小组特征,这些特征— 放在一起具有最大可能的预测能力。另一方面,全相关算法被设计成选择所有特征,这些特征分别具有任何预测能力。

因此,如果特征 A 和特征 B 都是相关的,但是它们带来或多或少相同的信息,那么全相关方法将选择它们两个,而最小最优方法将只选择其中一个并丢弃另一个。

这似乎是一个细微的区别,但在实践中却有很大的不同。想象一个场景,我们有一万个特征。你用 Boruta 你发现其中的 5000 个和目标变量有某种关系。但是五千仍然是一个难以管理的功能数量。

在丁和彭的例子中,你可以用一个小得多的模型,例如 50 个特征,达到同样的(或者更高的)精度。但是,如何选择它们呢?从 Boruta 拿前 50 的特性是行不通的。事实上,它们中的许多可能彼此高度相关:它们不会添加太多信息。

开发 MRMR 就是为了解决这个问题。

“K 个最佳特征并不是 K 个最佳特征”

我们举个玩具的例子。假设我们的任务是预测一些人的收入,知道他们(或他们的亲属)的一些特征。我们处理这些特性:

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

玩具数据集。[作者图]

让我们假设我们知道变量之间的因果关系(这是我们在现实生活中不经常拥有的特权,但是它对理解 MRMR 背后的逻辑很有用)。

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

变量之间的因果联系[作者提供的图表]

知道了因果网络将使特征选择变得简单得可笑:我们将选择{ 年龄智商身高 },因为这些是唯一与目标变量有直接因果关系的特征。添加任何其他元素都会带来不必要的噪音。

然而,这些特征并不一定是对目标变量具有最强预测价值的特征。总结如下:

“最好的 K 个特征并不是 K 个最好的特征.”(改编自 T. M .封面)。

这是什么意思?

例如,以母亲的智商为例:它与收入没有直接联系,但与智商有联系,而后者又与收入有很大联系。所以,如果你测试一下,你会发现妈妈的智商收入之间有相当强的关系。但是既然我们的模型中已经有了智商,保留母亲的智商就没有意义了。

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

K 最佳特性与 K 最佳特性,K = 3。每个特征都与它与收入关系的“强度”(F-统计量)相关联。[作者图]

一般来说,这意味着只关注每个特征和目标变量之间的关联是不够的。

我们希望找到 K 个最佳特征,而不是 K 个最佳特征!

这正是 Boruta 的问题所在:它为每个特性提供了单独的评估。事实上,在我们的例子中,Boruta 会选择所有 7 个特征,因为它们都与收入有一定的统计相关性。

这在我们没有太多功能的情况下是有意义的。但是,在实际应用中,经常会发生这样的情况:

  • 我们不知道特征和目标变量之间的因果关系;
  • 我们有太多的特征;
  • 特征中有高度的冗余。

在这些情况下,可能是像博鲁塔这样的全相关算法太“放纵”了,而 MRMR 能够移除不必要的特征。

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

变量之间的因果联系[作者提供的图表]

所以,现在的问题是:MRMR 是如何工作的?

在 MRMR 的引擎盖下

使用 MRMR 时,你基本上只需要做一个选择:决定你想要保留的特性的数量。我们将称这个数字为 K。在我们的例子中,我们将取 K =3

在实际应用中,人们可以根据领域知识或其他约束来选择 K ,例如模型容量、机器内存或可用时间

MRMR 迭代地工作。在每一次迭代中,它(根据规则)识别最佳特性,并将其添加到所选特性的篮子中。一旦一个特性被放进桶里,它就再也出不来了。

在我们的例子中,这些是我们在每次迭代结束时得到的结果:

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

K = 3 时的 MRMR 过程[图由作者提供]

在每次迭代中,决定选择“最佳”特征的规则是什么——即第一步的智商,第二步的年龄和第三步的身高?这是 MRMR 的核心。

**“最大相关性-最小冗余度”之所以这样叫是因为——**在每次迭代中——我们希望选择与目标变量具有最大相关性的特征,以及与先前迭代中已经选择的特征具有最小冗余度的特征。

实际上,在每次迭代 i 时,为每个待评估的特征计算分数( f ):

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

一级方程式赛车。MRMR 概观[作者图]

迭代 i 中的最佳特征是得分最高的特征。就这么简单。

现在唯一的问题是如何计算分子和分母。基于这一决定,优步论文的作者们识别出了 MRMR 的许多变体,如中旬MIQFCDFCQFRQRFCQRFRQ 。然而:

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

截图来自来源。[作者强调]

由于 FCQ 非常简单和快速,并且通常比其他算法运行得更好,所以我将把重点放在这个变体上(顺便说一下,扩展到其他变体很简单)。

特征 f 在第 i 次迭代(分子)的相关性计算为特征和目标变量之间的 F 统计量(此处为进一步了解 F 测试)。冗余度(分母)被计算为该特征和在先前迭代中选择的所有特征之间的平均(皮尔逊)相关性。所以,公式变成了:

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

方程式 2。MRMR 公式(FCQ 变体)[作者提供图片]

其中 i 是第 i 次迭代, f 是被评估的特征, F 是 F 统计量, corr 是皮尔逊相关。请注意,相关性是以绝对值表示的。事实上,如果两个特征具有 0.9 或 0.9 的相关性,这没有什么区别:在这两种情况下,它们都是高度冗余的。

为了让事情变得更清楚,假设我们处于第三次迭代。这是之前发生的事情:

  • IQ 已在第一次迭代时选择;
  • 年龄在第二次迭代时被选中。

接下来我们应该选择哪个功能?

计算每个特征的分数只需要 F 统计量和相关性:

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

3 次迭代中发生的情况的图示。[作者图]

如上所述,下一个最佳特征是得分最高的特征,在本例中是高度*。*

从头开始的 Python 实现

我们上面描述的迭代过程很容易在 Python 中实现:

MRMR 的 Python 实现(FCQ 变体)[作者代码]

这个实现非常容易理解。然而,这是次优的。你能找出原因吗?

在上面的代码中,我们计算了很多我们永远不会用到的相关性。事实上,在第 6 行,我们正在处理所有可能的特征对。这意味着 F * ( F - 1) / 2 对。对于 F = 10,000,这将意味着5000 万次关联!

通过只处理我们在每次迭代中需要的特征对,我们可以节省更多的时间,即计算“进行中”的相关性。这可以节省我们很多时间。

毕竟,在每次迭代时,我们只需要计算前一次迭代选择的特征与所有从未选择的特征之间的所有相关性,并将它们存储在一个相关矩阵中。这意味着:

  • 第一次迭代:不需要关联。事实上,还没有选择任何特征:选择具有最高分数(即最高 F 统计量)的特征就足够了。
  • 第二次迭代: F - 需要 1 个相关性。
  • 第三次迭代: F - 需要 2 个相关性。
  • K 次迭代: F - K + 需要 1 次相关。

*现在,做数学很容易:这个过程需要计算少于 F ** ( K - 1)的相关性。如果 F =1 万, K =50,这就得出一个合理得多的数字:小于 50 万的关联

这个改进的版本看起来像这样:

MRMR 的一个更快的 Python 实现(FCQ 变体)[作者代码]

除了第 11 行和第 21–23 行之外,这几乎等同于上一个版本。

给我一个“pip 安装”

你可以在我的 Github 中找到分类问题的现成版本 MRMR。它可以通过以下方式安装:

*pip install mrmr_selection*

这是如何在熊猫数据框架上使用它的一个片段:

*from mrmr import mrmr_classif
from sklearn.datasets import make_classification

# create some data
X, y = make_classification(n_samples = 1000, n_features = 50, n_informative = 10, n_redundant = 40)
X = pd.DataFrame(X)
y = pd.Series(y)

# use mrmr classification
selected_features = mrmr_classif(X, y, K = 10)*

结论

我们已经看到了为什么 MRMR 在许多实际问题中是一个有用的特征选择步骤:因为它试图找到一小组与目标变量相关并且彼此几乎没有冗余的特征。

MRMR 的价值不仅在于它是有效的(正如优步的论文所证明的),还在于它的简单性使得它可以在任何管道中快速而容易地实现。

感谢您的阅读!我希望这篇文章对你有用。

我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以发短信给我我的 Linkedin 联系人

MS-DAYOLO:用于跨域目标检测的多尺度域自适应 YOLO

原文:https://towardsdatascience.com/ms-dayolo-multiscale-domain-adaptive-yolo-for-cross-domain-object-detection-d7912a9de975?source=collection_archive---------28-----------------------

提高检测器对畴变的鲁棒性

当测试数据的分布与训练数据的分布不同时,会发生域转移问题,导致目标检测模型的性能下降。例如,对象检测器是针对在晴朗天气和有利天气下捕获的图像数据进行训练的,但它适用于测试阶段的恶劣天气场景,包括灰尘、雨或雾。虽然已经提出了许多先进的对象检测方法,包括 R-CNN 网络家族(R-CNN,Fast R-CNN,Faster R-CNN,Cascade R-CNN)或 YOLO 系列(YOLOv1-v4),但研究人员只专注于在基准数据集上的性能,如 COCO,VOC,WAYMO,Cityscapes 等。其中包括干净图像数据和对象检测中的域移动。近年来,这个主题被更广泛地研究,有时它被称为术语领域适应。在这篇文章的剩余部分,我将回顾一个新的多尺度域自适应 YOLO (MS-DAYOLO)框架,用于跨域对象检测。

戴约洛女士

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

MS- DAYOLO 的建筑(图片见诸报端[ 来源)

MS-DAYOLO 的架构如上图所示。一般来说,MS-DAYOLO 是基于 YOLOv4 开发的,它几乎采用了 YOLOv4 的主要组件。主要区别在于,有一个域自适应网络(DAN ),它连接到主干上,以鼓励主干学习域不变特征。具体来说,如上图所示,DAN 连接到主干中的特征地图 F1、F2 和 F3。作者已经考虑利用特征图 F1、F2 和 F3,因为这些特征被直接馈送到检测器的颈部,从而它们携带了输入图像的主要信息,这可能有利于训练 DAN。

域自适应网络(丹)

为了避免获得实时对象检测器中最重要的计算,DAN 仅在训练期间被集成到主干中。DAN 的任务是预测输入图像是否在源域(完成训练的域)或目标域(没有训练模型的新的域)。

DAN 被优化以最小化域分类损失 L_dc ,其被计算为以下二元交叉熵损失函数:

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

其中 i 为训练图像的索引, t_i 为领域标号( t_i = 1:源领域, t_i = 0:目标领域), p(x,y) 为特征图位置 (x,y) 处的预测领域概率。

另一方面训练骨干最大化 L_dc 学习不变特征。也就是说,为了使对象检测器对域的变化具有鲁棒性,应该鼓励检测器学习输入图像中的显著内容(或显著对象),即使图像是在任何条件下捕获的。如果这一过程操作得当,可以提高检测机的性能和稳健性。

丹被优化为最小化 L_dc ,而骨干被训练为最大化 L_dc ,这导致了联合最小值-最大值问题。

总损失

总损失函数公式如下:

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

其中 L_det 是检测损耗,而 λ 是用于平衡总损耗的负标量。 λ 的负值可以解释为解决前段提到的联合最小-最大问题。换句话说, λ 负责控制 DAN 对整个网络性能的影响。关于 λ 的进一步详细解释可以在论文中找到。

结果

表 1 显示了 Cityscapes 数据集上不同适应配置的定量结果。表中, PRCMB 是代表人、骑手、汽车、摩托车和自行车的类别名称。通过对 DAN 采用所有三个特征映射 F1、F2 和 F3,已经实现了最佳性能。

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

表 Cityscapes 数据集的定量结果(论文中的表格[ 来源 ])

表 2 显示了在 BDD100K 和 INIT 数据集上验证 YOLOv4 和 MS-DAYOLO 时的性能比较。

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

表 BDD100K 和 INIT 数据集的定量结果(论文中的表格[ 来源 ])

使用 YOLOv4 和 MS-DAYOLO 对雾状图像数据进行目视检测的结果如下图所示:

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

视觉检测结果:(a)清晰图像上的 YOLOv4,(b)模糊图像上的 YOLOv4,©模糊图像上的 MS-DAYOLO。(论文中的图像[ 来源 ])

结论

在这篇文章中,我简要回顾了一种新的多尺度域自适应 YOLO (MS-DAYOLO)框架,用于跨域对象检测。正如论文中提到的,MS-DAYOLO 是第一个提出考虑改进 YOLO 模型来处理畴变问题的工作。在自动驾驶应用的各种测试场景下,MS-DAYOLO 已被证明优于最初的 YOLOv4。

欢迎读者访问我的脸书粉丝页面,这是一个分享关于机器学习的事情的页面:深入机器学习。我发布的关于物体检测的其他值得注意的帖子包括:

感谢您抽出时间!

利兹大学数据科学硕士:我的经历(2018/19)

原文:https://towardsdatascience.com/msc-data-science-at-leeds-my-experience-2018-19-926e007989b7?source=collection_archive---------31-----------------------

我的数据科学硕士的全面崩溃。

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

介绍

硕士压力大,费用高。我已经在这里讨论了我认为数据科学硕士学位是否值得。这一次,我想谈谈我在利兹大学的数据科学硕士学位会很有帮助。

难怪有人问我,我的数据科学硕士是什么样的。一些人想知道是否值得攻读数据科学硕士学位。其他人特别想知道更多关于利兹大学提供的课程。

我会试着在不太无聊的情况下尽可能深入。以下是我将要讲述的内容:

  • **申请流程:**这是我申请流程的一个非常笼统的概述,因为我记不太清了。
  • **课程结构:**我在利兹一年的整体结构。
  • **模块结构:**不同学校的模块结构不同。
  • **我最喜欢的模块:**我最喜欢的模块。
  • **我的学位论文:**学位论文过程和我的经历。
  • **评分:**利兹如何以我的成绩单为例计算硕士研究生的成绩。
  • **利兹数据科学协会:**一个伟大的协会,提供基于团队的数据科学项目供参与。

现在,我充分意识到,并不是每个阅读这篇文章的人都打算去利兹大学学习。即使你对这门课程不感兴趣,希望你仍能从我在英国攻读数据科学硕士的经历中学到一些东西。

同样值得注意的是,数据科学硕士是一个相对较新的事物。因此,如果全国数据科学硕士的课程结构和模块选择与我学生时代相比发生了显著变化,我不会感到惊讶。

应用进程

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

Kelly SikkemaUnsplash 上拍摄的照片

入学要求

在你申请之前,大多数数据科学硕士希望你有某种数学或计算背景。至少,大多数大学希望你至少有一个 2:1(荣誉)的学位。如果你是一名国际学生,那么有一个额外的语言要求,即雅思总分 6.5 分,所有部分都不低于 6.0 分。

我见过一些没有多少数学背景的学生,他们几乎没有任何计算机知识。他们还是通过了申请,所以要求可能没那么严格。这当然取决于大学,因为我想象一些大学(如牛津和剑桥)比其他大学严格得多。

应用和成本

我在 2018 年 6 月左右开始申请,我记得申请过程相当简单。要申请,我必须点击官方课程页面上的申请按钮创建一个帐户。然后我记得填写了一堆关于我自己的基本信息。

申请中最耗时的部分是写我的个人陈述。我记得我只是写了我的现状和为什么我想学习数据科学。有趣的是,我的一些留学生朋友说他们甚至不需要写个人陈述。正因为如此,我不确定这个要求有多一致。

几周后,大学通过电子邮件和信件回复了我,并无条件录取。他们解释了基本的课程细节和学费,并指导如何接受提议。当时的学费是 10000,因为我是校友,所以打了 1000 的折扣。如果你是国际学生,学费会贵得多(如今高达 25,000 多英镑)。

接受报价后,他们给我发了一封接受邮件和信。不久之后,我收到了两本小册子,里面有更多关于大学校园和我的提议的信息。

课程结构

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

万花筒Unsplash 上拍摄的照片

时间线概述

一般来说,英国高等教育的学年大约在九月或十月开始。考试通常在一月和六月举行。

如果你在读硕士课程,那么你就要用这个夏天剩下的时间来写论文。你通常在八月或九月左右完全完成,之后你将等待毕业。

信用

在利兹大学,每个模块完成后都有一定的学分。这些课程通常从 10 到 15 学分不等,有些课程相当于 20 学分。唯一的例外是价值 60 学分的论文。

这门课程有必修和选修单元。为了让我通过考试,我的模块必须总计达到 180 或 185 学分。

我还需要通过至少 135 学分的“5M 级”模块。这些模块只有硕士生才能修。然而,5M 级模块也有“3 级”版本,适用于来自不同课程的最后一年本科生。这意味着硕士生和本科生一起分享大部分课程。

参加 5M 级别课程的学生有额外的课程来覆盖更深入的内容。因此,期末考试有额外的问题,完全是让 500 万学生回答的。

模块

第一学期有必修的计算机科学模块,第二学期有数学模块。在选修课方面,选择的模块主要包括数学和计算机科学。我记得有一些地理和商业模块,但这些选择较少。事实上,我所有的模块不是数学就是计算机科学。

每学期之前,每个人都必须在设定的时间范围内登录选择他们的选修模块。我必须从三个列表中选择:A、B 和 c。

要求是从列表 A 和 B 中选择至少 30 学分的模块,从这些列表中总共选择至少 60 学分。一旦完成,我们可以从列表 c 中选择更多。

请记住,5M 级模块的 135 学分规则适用于全年。为了平衡我的工作量,我试图将这些模块尽可能均匀地分布在两个学期中。

由于这种结构,由于时间表冲突,不可能总是注册某些模块。有人告诉我们,如果我们能补上错过的课,还是有可能报名的。在这些情况下,方案主管也需要批准。

论文

名单:选择论文题目的正式程序要到第二学期才开始。然而,我们在第一学期就意识到要提前计划我们的选择。

第二学期之前也没有正式的名单。就我所能记得的,我相信他们在第二学期开始和中期的某个时候公布了名单。如果没有感兴趣的题目,我们也可以向论文协调员建议我们自己的题目。然后他们会试图找到合适的主管来配合你的主题。

这个列表相当大,大约有 50 个主题。虽然这门课严格来说是在数学学院下,但是这个列表包含了数学和计算机科学的主题。也有来自商业和心理学的话题。

**主题:**每个主题都包含一个描述、目标,有时还包含一个资格要求。在有需求的情况下,我们需要有合适的技能或者已经学习了某些模块。

他们也可以分配一个以上的学生。根据我的经验,最受欢迎的通常是与机器学习有关的计算机科学话题(炒作是真实的)。例如,有一个涉及 Airbnb 数据,我知道很多学生申请只是因为这个名字(我对此感到内疚)。

同样重要的是,我们与其他课程的硕士生分享了一些话题。例如,计算机科学导师可能会优先考虑计算机科学的学生,而不是这门课的学生。我个人曾试图申请计算机科学学院的大型机器学习课题(如 Airbnb 的课题),但都没有成功。

选择截止日期:最终提交的截止日期是三月底。我们必须选择三个偏好,并将其发送给协调员。如果他们不批准任何一个,那么我们必须选择另一个。

正如你所看到的,提前考虑你的论文将涉及的内容是非常有用的。这样做将有助于在第一和第二学期选择模块。

模块结构

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

Dom FouUnsplash 上拍摄的照片

根据学校的不同,模块的结构可能会有很大的不同。由于我只修了数学和计算机科学模块,所以我只能对这两个模块进行评论。

数学:数学模块可能非常激烈,尤其是 5 米级的。对于评分,大部分权重是期末考试,通常占 80%。其余的由分散在整个学期的课程组成。根据教授的不同,我们每周或每两周收到一份作业。

每份作业通常由一系列问题组成。这些通常是像证明,“证明这是真的”和计算问题。对于一些模块,我们不得不做一个更重要的统计项目。

在我看来,数学模块给人的感觉更加死板,缺乏创造力。如果你熟悉数学,那么这可能并不奇怪。此外,如果你有其他大项目要做,每周或每两周一次的课程可能会让你不知所措。我认为重考的好处是,即使你弄乱了一些功课,你总体上仍然可以做得很好。

计算机科学:这些模块在期末考试中的权重通常低于数学模块。因此,通常更重视课程,有些课程的权重高达 40%。从我的经验来看,大多数计算机科学模块都有大约两份作业。这些通常在你如何对待他们方面提供了相当大的灵活性。大多数教授只关心你解决了问题,并且它有效。

与数学模块相比,还有更多的实验室会议来帮助完成课程。随着对课程的重视,我想这是有道理的。计算机科学模块的另一个关键区别是,你可以带自己的笔记参加考试。这来自一个数学学位,感觉很神奇。这绝对有助于我不再像记忆数学模块那样感到记忆公式的压力。

我最喜欢的模块

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

Unsplash 上的 Matese Fields 拍摄

我觉得提供一些关于我最喜欢的模块的见解可能会有所帮助,因为你们可能也在学习相同的模块。显然,从那时起事情可能已经改变了,所以请记住这一点。我做的大部分模块都是 5M 级的。如果你想看我做的每个模块,你可以跳到评分部分。

由于我过去是一名分析师,我选择了那些我认为在当时有用的模块。我还尝试挑选了一些我认为在我作为数据科学家工作时可能有用的信息。虽然很诱人,但是最好避免选择看起来简单的模块。毕竟硕士学位并不便宜,所以你不妨充分利用它。

机器学习(5M 级计算机科学)

这个模块总体上是对机器学习的一个很好的介绍。这位教授对这个话题充满热情,真诚地想帮助学生。我们讨论了决策树、卷积神经网络和强化学习等算法。可能会涉及到相当多的数学知识,我们应该把这些内容牢记在心。因此,线性代数的先验知识对这个模块非常有用,尤其是在学习神经网络的时候。

机器学习非常受欢迎。它是如此受欢迎,以至于第一次讲座没有足够的空间来容纳所有的学生。有些人甚至不得不坐在地板上!

几周后,随着人们转向这个模块,班级变得更大了。如今,我只能想象它会比以前更受欢迎。

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

第一次机器学习讲座。教授没想到会有这么多学生!

期末考试占 80%的权重,其余的是课程作业。课程之一是使用 Keras 实现一个神经网络架构。教授给了我们一个模板,让我们在上面工作,第一次训练神经网络非常酷。

第二个课程是使用强化学习训练一个人工智能玩游戏。这个很难,需要和很多其他学生一起合作。

我要说的是,尽管有难度,这个模块中的课程作业是最有趣、最令人愉快的。尝试用代码实现数学理论并看到它的工作是很好的。

统计学习(5M 级数学)

我想把统计学习看作机器学习的统计方法。统计学习和机器学习都侧重于使用过去的数据来训练模型进行预测。

不同之处在于,统计学习没有从“算法”的角度来处理这个问题。相反,我们学习统计建模和在数学层面评估模型性能的重要性。

令人惊讶的是,该模块对考试和课程的重视程度相当。也就是说,考试和课程各占 50%的权重。这对于一个数学模块来说是很不寻常的,但这一次数学考试压力小了也不错。

在我看来,统计学习很好地补充了机器学习。在模型方面,我们学习了基础知识:线性回归、逻辑回归和带有 boosting 和 bagging 的决策树。然后很大一部分集中在评估这些模型,并知道如何统计选择最好的模型。

教授也很棒,他很好地解释了概念。即使没有统计学背景的人也会发现这个模块是可行的,因为它集中在统计建模的基础上。如果你对机器学习很认真,并且想拥有数据建模的统计学基础,那么我会推荐你学习这个模块。

数据挖掘和文本分析(5 级计算机科学)

本模块重点介绍对文本数据使用机器学习算法。随着对图像数据使用机器学习的大肆宣传,我觉得知道如何处理文本数据也很重要。虽然涉及到一些数学,但与机器学习等模块相比,这是最少的。

我们学会了如何使用一种叫做 Weka 的工具。自从我毕业后,我还没见过或听说过有人使用这个工具,所以我怀疑它对你的简历有多大用处。基本上,它是一个允许你挑选机器学习算法应用于文本数据的工具。我们将它用于我们的课程作业,它有助于在高层次上了解如何应用这些算法。然而,感觉我只是在挑选魔法药水,看看哪种效果最好,而不需要了解一切。

尽管如此,我还是觉得讲座材料很有趣。我们学习了如何对自然语言和文本分析建模。我们还学习了机器翻译、信息检索、聊天机器人和文本分类。

这位教授很奇怪,但讲课笔记很不错。期末考试占 60%的权重,其余的是课程作业。总的来说,我认为这个模块相对简单。这感觉像是一个“不太严重”的问题,但它仍然是有用的。它为我自己处理文本数据提供了足够好的基础。鉴于文本数据无处不在,这绝对是一件好事。

我的论文

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

尼克·莫里森在 Unsplash 上拍摄的照片

我不会过多地谈论我的论文是关于什么的,因为我不认为有人会觉得它有趣(如果你感兴趣,你可以在这里阅读)。相反,我会解释这个过程和我所经历的。注意,我的论文是在数学学院下完成的。

主管会议

正如我之前在课程结构部分提到的,我在三月底提交了我的偏好后,就拿到了我的最终题目。从那时起,我试着稍微准备一下论文,但是直到我第一次和我的导师见面时才开始。我说“导师”是因为我有两个导师:一个在论文的前半部分,另一个在论文的后半部分。

第一次见面发生在我五月/六月考试之后。我认为这是我写论文的正式开始。从那以后,我每周都和我的主管开会。这些非常重要,因为主管让我保持在正轨上。

为了充分利用这些会议,我必须向他们展示我一直在做的工作。我花了大部分会议时间来处理我的问题。有时我偏离了论文的主要目标,导师总是确保让我知道。他们会通过阅读我到那时为止所写的东西,然后在上面写笔记,让我知道要修改什么。

不是每个会议都有用,但大多数会议都有用。他们还确保我做了正确的事情来打动外部考官,这非常有帮助。

口头介绍

论文的最终提交时间大约在八月底。之后,我们不得不准备一个持续了大约一个小时的口头报告。演示持续了大约 30 分钟,剩下的时间是提问。

观众包括我的导师和论文协调员。他们问的大多数问题都相对简单,但有些问题有点尴尬。不过总的来说,感觉比预期的要容易。可能是因为我已经花了几个月的时间写作,并凭记忆知道了大部分内容。

分级(研究生授课)

利兹大学的所有学位都有一个评分标准。基本上,你的成绩是通过对你的单元分数进行加权平均,然后除以 10 计算出来的。

举个例子,如果你的加权平均分是 75,那么你的最终得分是 7.5。请注意,用于计算加权平均值的权重是您的模块的学分。因此,在学分较高的模块中表现良好将对你的期末成绩产生更大的影响。

您的最终奖励取决于您的最终得分属于哪个范围。这些是:

  • **失败:**小于 5.0
  • **过关:**5.0–5.9
  • **优点:**6.0–6.9
  • **区别:**大于 7.0

0.1 的任意范围适用于所有边界线。例如,如果你的最终分数是 6.93,那么你仍然可以得到一个优异的成绩。

这种不及格、及格、优秀和优秀的评分系统是英国研究生教育最常见的。在利兹,他们将加权平均值除以 10,但我认为大多数其他大学不会介意。如果我们忽略这一点,那么我看过的每所大学都有基本相同的界限。

这里有一个计算器,你可以从利兹大学网站下载

最后,对于那些好奇的人,我已经扫描了我的成绩单,并在下面放了一个计算器的截图。

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

我的所有模块,包括他们的分数,水平和学分。

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

分数计算器与我的模块结果。

利兹数据科学学会

利兹大学为学生提供了一个很好的数据科学社团。他们提供以团队为基础的项目,学生可以参加以获得额外的经验。例如,我参加了全国 Hiscox 数据挑战赛,从大学中选出的团队参与解决一个数据科学问题。利兹数据科学协会组建了这个团队,并允许我们代表学校。

这给我的简历带来了奇迹,结果,我出现在 Tableau 的世代数据博客上。我在采访中被问到这个项目,对于没有太多经验的人来说,这是一个很好的起点。

作为一名学生,很容易忘记数据科学是一个非常基于项目的领域。我认为有一个数据科学协会参加对任何大学来说都是非常有价值的。它会对你的数据科学求职产生巨大影响,尤其是作为一名应届毕业生。当你在寻找合适的硕士课程时,一定要在这方面做些研究。

结论

这里有相当多的信息需要消化。希望这是有用的,特别是如果你想在利兹学习同样的课程。总的来说,我对这门课程的体验是相当积极的。虽然肯定有一些我不喜欢的模块和我不喜欢的教授,但我在短时间内学到了很多东西。

无论你是未来的学生还是校友,请联系我,让我知道你的想法。听到别人为什么决定攻读数据科学硕士学位的故事总是很有趣!

原载于 2021 年 7 月 7 日【https://leonlok.co.uk】

【源码免费下载链接】:https://renmaiwang.cn/s/3r450 支持向量机(Support Vector Machines,SVM)是机器学习领域一种强大的监督学习算法,尤其在分类和回归问题上表现出色。本章聚焦于通过Python 3.7实现支持向量机,提供详尽的代码注解,帮助读者深入理解其工作原理。一、支持向量机基本概念支持向量机的核心思想是找到一个最优超平面,该超平面能够最大程度地将不同类别的数据分开。超平面是特征空间中的一个决策边界,它由距离最近的训练样本(即支持向量)决定。SVM的目标是最大化这些最接近样本的距离,也就是所谓的间隔。二、SVM的两种类型1. 线性SVM:当数据线性可分时,SVM可以找到一个线性超平面进行分类。2. 非线性SVM:通过核函数(如高斯核、多项式核等)将低维非线性数据映射到高维空间,从而在高维中找到一个线性超平面进行分类。三、SVM的主要组成部分1. 决策函数:SVM使用超平面作为决策边界,形式为`w·x+b=0`,其中`w`是超平面的法向量,`b`是偏置项。2. 支持向量:位于最近间隔边缘的数据点,对超平面的位置至关重要。3. 软间隔:允许一部分样本落在决策边界内,通过惩罚项C控制误分类的程度。4. 核函数:用于实现非线性分类,如高斯核(RBF,Radial Basis Function):`K(x, y) = exp(-γ||x-y||^2)`,其中γ是调整核函数宽度的参数。四、Python实现SVM在Python中,我们可以使用Scikit-Learn库来实现SVM。Scikit-Learn提供了多种SVM模型,如`svm.SVC`(用于分类)、`svm.LinearSVC`(仅线性分类)和`svm.NuSVC`(nu版本的SVM,支持类别不平衡问题)。五、SVM的训练与预测流程1. 数据预处理:将数据归一化或标准化,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值