原文:TowardsDataScience
协议:CC BY-NC-SA 4.0
原文:https://towardsdatascience.com/natural-language-process-for-judicial-sentences-with-python-ae5ea52b540d

https://pixabay.com/
在这篇文章中,我将对我们的司法判决进行一些进一步的分析和视觉呈现。我将重点介绍聚类分析,这是一种无监督的学习技术,即使我们对它了解不多,它也非常有助于发现数据中的模式。在 NLP 中,它可以有多种应用:
- 识别推文中对话的共同趋势
- 对来自一个国家不同地区的文本进行分组(每个地区有不同的方言)
- 根据电影涉及的类型对电影评论进行分组
诸如此类。无监督学习的好处是并不总是清楚聚类的含义:这取决于用户根据分析的结果来推导。例如,在我们的研究中,分组可能反映不同的干预领域,或者可能确定宣布判决的司法区域。
为了进行聚类分析,我将使用 K-means 算法。
该算法的第一步是在我们未标记的观测值中,创建随机定位的 c 新观测值,称为“质心”。质心的数量将代表簇的数量(我们将在后面看到如何确定这个数量)。现在,将开始一个迭代过程,由两个步骤组成:
- 首先,对于每个质心,该算法找到离该质心最近的点(根据通常计算为欧几里德距离的距离),并将它们分配到其类别中;
- 其次,对于每个类别(由一个质心表示),该算法计算属于该类别的所有点的平均值。该计算的输出将是该类的新质心。
每次重复该过程时,最初与一个质心分类在一起的一些观察结果可能被重定向到另一个质心。此外,在几次重复之后,质心位置的变化应该越来越不重要,因为初始随机质心与真实质心收敛。当质心位置不再变化时,该过程结束。

作者图片
如果你有兴趣深入研究聚类无监督技术,你可以在这里阅读我以前的文章。
现在让我们用 Python 实现它。
让我们开始定义一个函数,稍后绘制我们的聚类结果。
那我们就准备数据吧。对于我的文档的数字表示,我将使用 TF-IDF 矩阵表示(您可以在第 3 部分中阅读更多关于该技术的内容)。
现在让我们进入集群步骤。我将首先用任意数量的质心训练 K-means 模型,然后我将介绍识别它们的适当数量的技术。
让我们训练模型并使其适合我们的 TF-IDF 截断矩阵:


作者图片
现在,为了进行更有意义的分析,我想确定聚类(或质心)的最佳数量。为此,我将使用轮廓得分技术。
对于每个数据点或观察值以及每个固定数量的聚类,该分数由两部分组成:
- 该观测值与同一聚类内所有其他观测值之间的平均距离(表示为 a
- 该观测值与下一个最近簇的所有其他观测值之间的平均距离(表示为 b

如公式所示,分子越大,用该数量的质心完成的聚类越多。
这个想法是,我们训练一个增量 K-means 模型,其质心数量不断增加,我们为每个质心计算轮廓得分。导致具有最高轮廓分数的模型的质心的数量被假定为最佳数量。
在我的分析中,我训练了 10 个质心在 15 到 25 之间的模型。

作者图片
从上面的图中,似乎最一致的聚类数是 k=24,因为它具有最高的分数。如果添加更多的集群,它可能会更高,但是,我不想让我的数据过多,所以我将坚持这个数字。

作者图片
如上所述,没有预先向用户给出聚类的含义。我们有责任进一步研究模型发现的模式,并将它们与我们拥有的进一步信息联系起来。
希望你喜欢阅读!敬请期待下一部分:)
- NLTK::自然语言工具包
- Python 中的 spaCy 工业级自然语言处理
- 司法新闻| DOJ |司法部
- 司法部 2009-2018 年新闻发布| Kaggle
原文:https://towardsdatascience.com/natural-language-process-for-judicial-sentences-with-python-bb60a6d3cc0b

https://pixabay.com/
在本系列的最新文章中,我们经常提到,为了用作数学模型的输入(许多 NLP 应用程序的最终目标),文本数据需要以某种方式转换成数字表示。我们已经看到了其中的一些,如 TF-IDF 矩阵或词袋。然而,在捕捉单词或文档的含义时,这些技术并不“有用”。
这就是文档嵌入进入游戏的时候。文档嵌入的一般思想是以这样一种方式用向量表示文档,即一旦在向量空间中表示,向量之间的数学距离就表示它们所表示的文档之间的相似性。
在深入研究文档嵌入及其在我们分析中的应用之前,我们首先需要介绍它的起源,可以追溯到单词嵌入的更细粒度的概念。
使用单词嵌入技术,我们将向量定义为单词的数字表示,这样,具有相似含义的单词具有相似的向量表示。
这个想法是,我们需要用数字来表示单词的意思,这样我们就可以进行如下活动:
- ML 模型训练
- 单词所在语料库中潜在模式的可视化
- 预测所分析单词周围的单词
和许多其他人。
一种流行的单词嵌入技术是 Word2Vec,在 2013 年的这篇论文中介绍。Word2Vec 旨在将单词的含义(包括同义词、类比等)捕获到矢量表示中。这背后的思想是,例如,在向量空间中,“巴黎”的数字表示应该比“伦敦”的数字表示更接近“法国”的数字表示。
Word2Vec 基于两种算法:
- 连续单词包(CBOW)→它使用滑动窗口预测给定上下文的单词,即前一个和下一个单词。
- Skip-gram →它以相反的方向工作,使用一个单词作为输入来预测它周围的上下文。尽管它比 CBOW 慢,但在处理生僻字时效果更好。

来源:https://arxiv.org/pdf/1301.3781.pdf
单词嵌入对于许多上下文来说肯定是有用的,但是,这可能还不够。事实上,可能有一些与单词相关的含义不仅严格依赖于它们的上一个或下一个单词,而且依赖于它们所引用的整个文档。也就是说,Word2Vec 算法可能很难捕捉到这样一个事实,即两个同音异义词在不同的文档中可能有非常不同的含义(取决于它们的上下文)。
这就是引入文档嵌入的原因。对于文档嵌入,我们有一个单词嵌入的离散近似,它有助于捕捉整个上下文,并旨在给出更有意义的向量表示。最流行的算法之一是 Doc2Vec,由 Quoc Le 和 Tomas Mikolov 于 2014 年在这篇文章中介绍。
Doc2Vec 模型用于创建一组单词的矢量化表示,这些单词作为一个整体,而不是单个单词。
至于 Word2Vec,Doc2Vec 算法有两种变体:
- 分布式内存模型(DM)→类似于 Word2Vec 算法中的 CBOW 变体,DM 模型在其单词输入中还结合了一个段落矩阵,该矩阵可以被认为是另一个单词。“分布式记忆”这个名称表明了这样一个事实,即段落矩阵充当记忆单个单词不能捕捉的当前上下文中缺少的内容的记忆。

来源:https://arxiv.org/pdf/1405.4053v2.pdf
- 分布式单词包(DBOW)→类似于 Word2Vec 的 skip-gram 变体,但它不是使用单个单词来预测其周围的上下文,而是使用段落矩阵(与上面解释的概念相同)。

来源:https://arxiv.org/pdf/1405.4053v2.pdf
我将使用中可用的模块。更具体地说,我将使用 DBOW 变体。
另外,出于可视化的目的,我将通过 t-SNE 算法来表示嵌入的文档。
因此,让我们开始创建文档矩阵 X,我们将在其上训练 Doc2Vec 算法。
让我们导入所有模块并训练我们的算法:
让我们检索与文档“0001”最相似的 5 个文档:

每个数组代表(target_doc,相似性得分)。
现在我还想可视化我的矢量化文档。为此,我将使用T-分布式随机邻居嵌入(t-SNE) 算法,这是一种非线性降维技术(在这里阅读关于降维的更多信息)。

让我们导入可视化软件包来绘制缩减的维度:

在这张图片的边缘有一些有趣的集群,这意味着这些文档之间可能有一些共同的讨论趋势。用潜在主题分析来扩展这种分析也可能是有用的,以查看那些聚类是否实际上代表潜在主题。
在下一篇文章中,我们将进一步研究低维数据,以执行聚类分析。我们还将通过命名实体来查看文章的词汇组成。
所以请继续关注第 7 部分!
- NLTK::自然语言工具包
- Python 中的 spaCy 工业级自然语言处理
- 司法新闻| DOJ |司法部
- 司法部 2009-2018 年新闻发布| Kaggle
- https://en.wikipedia.org/wiki/Distributional_semantics
- https://aurelieherbelot . net/research/distributional-semantics-intro/
- https://arxiv.org/pdf/1405.4053v2.pdf
- arxiv.org 1707.02377.pdf
- https://arxiv.org/pdf/1301.3781.pdf
原文:https://towardsdatascience.com/natural-language-process-for-judicial-sentences-with-python-e6a01e30a675

https://pixabay.com/
情感分析是一种自然语言处理技术,涉及使用机器学习算法从文本数据中识别和提取主观信息。它通常用于确定一篇文章的整体情绪,无论是积极的、消极的还是中性的。这对于各种应用程序都很有用,例如分析客户反馈、检测社交媒体帖子的情绪或识别电影评论的情绪。情感分析算法通常使用自然语言处理技术和机器学习算法的组合来处理和分析文本数据,并且可以被训练来识别各种类型的情感。
在我们的场景中,我想分析文章的情感是否取决于它们的类别。由于文章没有与其情感对应的标签,我将使用一个名为 VADER 的预训练模型进行无监督分析,该模型可从 NLTK Python 库中获得。第一个单元格可能需要一段时间,所以您可以直接跳到突出显示的 markdown 开始运行代码并可视化结果。
VADER 属于一种依赖于情感相关词汇的情感分析。因此,该模型是在具有相关分数(取决于它是正/+ve、中性还是负/-ve)的词典语料库上训练的。
[….]

[….]
一旦输入一个完整的句子,该模型使用函数“polarity_score”返回 4 个分数:前三个,+ve,neutral 和-ve,表示属于这些分类的内容的范围。第四个是复合分数,在-1 和 1 之间归一化的词汇等级的总量。

现在让我们将 VADER 模式用于我们的司法判决:
让我们用复合分数向数据集添加一列:

现在我在联想:
- 化合物大于 0.05 的任何句子的正标签
- 任何复合值低于-0.05 的句子的否定标记
- 任何含有-0.05 到 0.05 之间的复合词的句子的中性标签

由于我想在一个低维空间中可视化标记的句子,我将从 TF-IDF 矩阵开始应用奇异值分解(您可以在本系列的前几部分中了解关于 SVD 和 TF-IDF 的更多信息):
现在让我们导入可视化库并初始化一个绘图函数:
让我们画出结果:

现在让我们想象一下,对于每个类别,它的文章的总体情绪是什么。

让我们画出结果:

显然,税收似乎是最消极的话题。但是,长的负棒线主要是因为税收是最常见的类别。我们感兴趣的是给定类别的负面程度的相对度量。
带着这个目的,让我们计算并绘制负对正的比值比。


由于比值比,我们可以看到负面文章是正面文章次数最多的类别是身份盗窃。相反,与上面猜测的不同,税收类别显示出较低的优势比,这意味着这两种情绪没有那么不平衡。
总体而言,司法新闻稿的总体情绪似乎是负面的,只有少数类别的优势比低于 1(由红色虚线表示),这意味着正面文章多于负面文章。
- 自然语言工具包
- Python 中的 spaCy 工业级自然语言处理
- 司法新闻| DOJ |司法部
- 司法部 2009-2018 年新闻发布| Kaggle
- https://spacy.io/usage/linguistic-features#named-entities
- https://medium.com/p/d81bdfa14d97/edit
- https://www.nltk.org/api/nltk.sentiment.vader.html
- 休顿,C.J .和吉尔伯特,E.E. (2014 年)。VADER:基于规则的社交媒体文本情感分析的简约模型。第八届网络日志和社交媒体国际会议。密歇根州安阿伯,2014 年 6 月。
原文:https://towardsdatascience.com/natural-language-process-for-judicial-sentences-with-python-ed21d9be9ca9

https://pixabay.com/
正如我们在以前的文章中看到的,NLP 处理包含大量信息的大量文本数据。我们看到了许多降低复杂性和从数据中提取相关信息的技术,从最简单的标记化/词汇化/词干化到 TF-IDF 分析和单词/文档嵌入。
分析这些文本数据的另一个重要方面是识别命名实体。
命名实体可以定义为具有适当标识的对象。例如,一个人是一个命名的实体,还有一个国家、一个组织等等。
为了从原始文本中提取命名实体,需要命名实体识别(NER)算法。NER 算法可以属于不同的类别,从监督学习模型(之前已经标记的实体之间的多类分类)到基于深度学习的方法再到统计模型。后者是我们将要使用的,因为它是 Python 库的 paCy 所使用的。
spaCy 的 NER 提供了 18 个命名实体,我们可以通过导入所需的库并列出这些实体来初步了解它们:

让我们看一个带有原始文本的 NER 应用程序的例子(我使用了比尔盖茨的维基百科页面)。

对于每个命名实体,我们还可以看到 spaCy 提供的定义。也就是说,让我们看看“组织”的定义。

最后,我们还可以使用 spaCy 特性中的一个有趣的视觉效果:

现在让我们跳到 NER 对我们的司法判决的分析。
想看文章的词汇构成。由于“tax”类别是最常见的类别(正如我们在本系列的第 2 部分中发现的那样),我将对该类别进行分析,但是同样的推理可以扩展到所有其余的类别。
让我们初始化一个包含与命名实体相关的 NER 标签的字典。
最后,让我们将字典转换成熊猫数据框架并绘制结果:

就命名实体而言,似乎所有类别都有类似的组成,最常见的是(每个类别)个人、组织和地缘政治实体。
多亏了 NER,
我想在这部分做的最后一个视觉分析是用一个网络框架来表现我们的文本。
网络是表示跨单元动态关系的强大数学模型。在这种情况下,单元(或节点)将是文章,我想检查它们之间的相似性。为此,我将根据链接的节点(即文章)之间的相似性来加权每条边。为了有一个可解释的可视化,我将只使用整个数据集的前 10 篇文章。
现在让我们导入这个分析的主库, NetworkX —一个 Python 包,用于创建和分析网络的结构和交互。
使用 NetworkX 提供的工具,我将为每个节点分配一个与其标题对应的标签:

现在让我们来看看结果:

如果你想更深入地研究网络科学和背后的数学,我建议阅读我以前的文章这里。
通过命名实体和网络分析,我们丰富了可以从原始文本中检索的信息。在下一篇文章中,我们将继续使用无监督学习技术,通过无监督情感分析,不仅检测文本的含义,还检测与每个句子相关的情绪或情感。
所以请继续关注第 9 部分!
- NLTK::自然语言工具包
- Python 中的 spaCy 工业级自然语言处理
- 司法新闻| DOJ |司法部
- 司法部 2009-2018 年新闻发布| Kaggle
- https://spacy.io/usage/linguistic-features#named-entities
- https://networkx.org/
原文:https://towardsdatascience.com/natural-language-process-for-judicial-sentences-with-python-part-1-bdc01a4d7f04

https://pixabay.com/
自然语言处理(NPL)是人工智能的一个领域,其目的是找到计算方法来解释人类语言的口语或书面语。NLP 的思想超越了可以由 ML 算法或深度学习 NNs 进行的简单分类任务。事实上,NLP 是关于解释:你想训练你的模型不仅仅是检测频繁出现的单词,统计它们或者消除一些嘈杂的标点符号;你希望它告诉你谈话的情绪是积极的还是消极的,电子邮件的内容是纯粹的宣传还是重要的事情,过去几年关于惊悚小说的评论是好是坏。
在这一系列文章中,我决定对与美国司法判决相关的新闻稿进行分析。这是一个历史数据集,包含了来自 https://www.justice.gov/news 司法部(DOJ)网站的 13087 篇新闻稿,我在 Kaggle 上找到了 json 格式的(https://www . ka ggle . com/jben Cina/Department-of-Justice-2009 2018-press-releases)。在这些行中,有 4688 行标有新闻稿的类别。
本研究的目标有两个主要研究问题:
- 如果您需要检索详细信息,拥有一个标记良好的知识库是至关重要的。新闻档案每天都在更新,手动标注每篇文章可能会非常耗时。我的问题是:有没有可能实现一个预测算法,自动将新文章分类到现有类别中?
- 能否推断出文章的情绪,并将其与所属的类别联系起来?为此,我将对我的文章进行无监督的情感分析,对于每个类别,显示有多少文章被归类为正面或负面。
为了回答这些问题,我将我的研究分为 9 个部分:
- 第 1 部分:数据预处理
- 第 2 部分:描述性统计
- 第 3 部分:TF-IDF 分析
- 第四部分:矩阵分解的潜在主题
- 第 5 部分:用 LDA 进行主题建模
- 第 6 部分:文档嵌入
- 第 7 部分:聚类分析
- 第 8 部分:命名实体和网络表示
- 第 9 部分:无监督情感分析
- 第 10 部分:用逻辑回归、SVC 和 Keras 神经网络进行预测分析
在本系列的第一部分中,我将介绍数据预处理活动,其中我们还将执行标记化、词干化和词汇化。
- 记号化→将给定文本分解成称为记号的单元的过程。在这个项目中,令牌将是单个单词,标点符号将被丢弃
- 词干提取→提取单词的词根或词干的过程。
- 词汇化→根据上下文将单词转换成有意义的基本形式或词根形式的过程。
注意:词汇化在自然语言处理和 NLU(自然语言理解)中非常重要,因为它比词干提取更准确。现实世界应用的一些例子是聊天机器人和情感分析。这种技术的缺点是词汇化算法比词干化算法慢得多。
为什么我们的数据框中需要这些进一步的元素?因为这些将是我们训练高效 NLP 模型的输入。例如,想象一个情感分析模型:你如何告诉模型“微笑”和“微笑”指的是同一个概念?
因此,让我们从导入必要的库开始(这些库对下一章也很有用):
对于文本 NLP 包,我将使用 Python 库 Spacy 和 NLTK 。
现在,我将下载 json 数据并将其转换成 pandas 数据帧,并执行上述预处理任务。
我注意到文本中充满了xa0 符号,这是表示空格的 Unicode。更具体地说,这个符号代表“不间断空格”。幸运的是,Python 中有一个很好的包,可以通过 pip 安装,就是“unidecode”。一旦导入,函数将获取 Unicode 数据,并尝试用 ASCII 字符表示它。
我还想知道有多少记录有标签,因为它将是我们分类预测分析的目标变量。
所以我们有超过 2000 个文档被贴上标签,这正是我们要找的。现在,我们不需要它们,因为预测分析将是最后一部分。
现在是时候对我们的文本进行预处理了。我将使用上面提到的记号、词条和词干创建另外三列。当我们需要对单词和文档进行矢量化时,这些将非常有用。
在预处理的最后,熊猫数据帧的最终外观将如下所示:

在下一篇文章中,我们将更深入地研究这个数据集的描述性统计,并开始检索相关信息,请继续关注下一章!
- 自然语言工具包
- Python 中的 spaCy 工业级自然语言处理
- 司法新闻| DOJ |司法部
- 司法部 2009-2018 年新闻发布| Kaggle
- 【https://creativecommons.org/publicdomain/zero/1.0/ 号
原文:https://towardsdatascience.com/natural-language-process-for-judicial-sentences-with-python-part-2-964b0e12dd4a

https://pixabay.com/
在这一系列文章中,我将对司法判决进行一系列的 NLP 分析,目的是解决两个研究问题:
- 如果您需要检索详细信息,拥有一个标签良好的知识库是至关重要的。新闻档案每天都在更新,手动标注每篇文章可能会非常耗时。我的问题是:有没有可能实现一个预测算法,自动将新文章分类到现有类别中?
- 能否推断出文章的情绪,并将其与所属的类别联系起来?为此,我将对我的文章进行无监督的情感分析,对于每个类别,显示有多少文章被归类为正面或负面。
在本系列的第 1 部分中,我们介绍了数据集和一些预处理活动,如标记化、词干化和词汇化。
现在让我们开始从我们的数据中获得一些有意义的见解和可视化表示。
现在我感兴趣的是调查哪个是类别出现的频率。在预测任务中也需要这些信息:事实上,在测试预测模型时,有一个评估基准是很有用的,它可以被设置为最频繁的基线预测,也就是说,将最频繁的类别分配给所有记录作为标签。
让我们用类别频率创建一个熊猫数据框架:


我们可以看到,到目前为止,最常见的类别是税收:它几乎是第二常见类别的两倍。
我最初想放弃那些少于 20 条记录的类别。然而,鉴于我分析的目标,我决定保留它们。事实上,我的最终目标是创建一个自动系统,能够在新文章插入数据库时对其进行标记,这样搜索它们就更容易了(在研究问题部分有更好的解释)。因此,我更喜欢保留所有已经提到的类别,由于数据库的不断输入,过一会儿记录会越来越多。
在这一节中,我分析了文章长度在类别中的分布。我很想知道是否有些类别会比其他类别导致更长的文章。

似乎所有的分布都趋向于在 3k 和 5k 字长之间达到它们的最大值,加上几乎所有的分布都非常窄。只有少数种类,如类足类动物,相对于其他种类,其分布范围要广得多。
在这里,我将从文本中提取地缘政治实体,并查看哪些是美国“最热”的地区。我说的“热门”是指他们参与犯罪活动的次数。为了这个分析,我决定检查那些参与贩毒的人,但同样的推理适用于任何其他类别。

注意:位置“美国”被解析为一个地理政治实体,但是为了本节的目的,我们应该只考虑单个州。
现在让我们绘制这些数据:

最后,在这一节中,我想考察一段时间内最常见的类别。为了做到这一点,我按年份汇总了我的数据集,并简单地计算了每个类别出现的次数。

从上面的图表中我们可以看到一些标签是从某一年开始使用的。即民权或身份盗窃从 2016 年才开始使用。
显然,在 2015 年之前,最常见的标签(税)只有 1 条。
在下一篇文章中,我们将讨论 TF-IDF 分析:术语频率(TF)和逆文档频率(IDF)。
请继续关注第 3 部分!
- 自然语言工具包
- Python 中的 spaCy 工业级自然语言处理
- 司法新闻| DOJ |司法部
- 司法部 2009-2018 年新闻发布| Kaggle
- https://creativecommons.org/publicdomain/zero/1.0/
原文:https://towardsdatascience.com/natural-language-processing-pdf-processing-function-for-obtaining-a-general-overview-6fa63e81fbf1
今天,许多用于自然语言处理(NLP)的文档。pdf 格式。将 pdf 读入 Python,虽然不是极其困难,但也不是键入*PD . read _ pdf(’ file _ name . pdf ')*那么简单。今天,我将为您提供代码,它不仅允许您将. pdf 文件读入 Python,还允许您创建一个函数,利用正则表达式来查找文档的元数据。

照片由 Dmitry Ratushny 在 Unsplash 上拍摄
今天将要讨论的主要 Python 库是 PyPDF2。你可以在这里找到 PyPDF2 的文档。PyPDF2 是一个 Python 库,允许分析和操作。通过 Python 实现 pdf 格式文件。该库不仅可以从 PDF 中提取文本,还可以提取 PDf 的元数据,这是我们今天要探讨的功能。
首先,您需要安装 PyPDF2
安装 PyPDF2 后,导入库。其他也需要导入的库有 Pandas 和 re 。
接下来,下面的代码将把 PDF 从它的文件路径作为它的输入,并把它转换成 Python 中可读的形式。将所有这些代码放在一个函数中是非常容易的(我已经这样做了),但是我决定将它打出来,逐行解释代码。对于以下所有代码,我使用了 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey E. Hinton 的论文“使用深度卷积神经网络进行图像分类”(在这里找到论文)。
上面两行代码将允许你用 Python 打开和读取一个 pdf 文件,接下来让我们创建提取器函数!
PDF 信息提取器功能
这个函数的输入将是先前创建的 reader 对象。该函数接受转换后的 PDF,找到元数据,并输出一个字典,其中每个键都链接到某个元数据属性及其值,由找到。PyPDF2 中的 documentInfo() 方法。
使用正则表达式来移除与每个元数据属性相关联的“/”(例如“/Author”→“Author”)。接下来,让我们将列表转换为一个系列和一个数据框!pdf _ to _ list _ series _ and _ df()函数接受一个字典,并将返回该字典的一个序列和数据帧。
使用 AlexNet pdf 运行上述代码产生了以下系列和数据帧:

图片:PDF 系列(图片来自作者)

图片:PDf 的数据框(图片来自作者)
另外,请注意我们无法完全看到标题。我们只需调用系列和数据框的“标题”属性,就会列出完整的标题。

图片:访问 PDF 的标题(图片来自作者)
就是这样!Today 提供了一种快速获取 PDF 元数据并将其转换为字典、系列和数据框的方法。这在您研究和使用 PDF 文档时非常有用。此外,如果您想为某人提供感兴趣的文档的一些快速背景信息,而不必浪费时间自己搜索细节,此功能将允许您有效地优化该任务。感谢阅读!
如果你喜欢今天的阅读,请关注我,让我知道你是否还有其他想让我探讨的话题!另外,在LinkedIn上加我,或者随时联系!感谢阅读!
原文:https://towardsdatascience.com/natural-language-to-sql-from-scratch-with-tensorflow-adf0d41df0ca
简介
在这篇博文中,我们将关注一个有趣的任务:将自然语言翻译成 SQL。对此的学术术语是数据库自然语言接口(NLIDB)。尽管 NLIDB 仍然是一个活跃的研究领域,但是为一个简单的表建立模型实际上非常简单。我们将为一个包含 3 列的雇员表做这件事:姓名、性别和薪水(如图 1 所示)。在这篇博文结束时,您将学习如何从一串自然语言输入(如)到 SQL 查询输出。

图 1:雇员表
概述
在本节中,我们将从较高的层面解释核心思想。
这个任务的核心是一个机器翻译问题。虽然这可能很吸引人,只是扔在一个序列到序列的机器翻译模型,直接从输入的自然语言到输出的 SQL 查询,它在实践中表现不佳。主要原因是模型可能会遇到列值的词汇外(OOV)标记。尽管模型可以在某种程度上容忍其他次要的未知单词,但 OOV 对于列值是致命的。想象一下,在上面的例子中,我们有一个不同的薪水值,它来自训练数据集没有覆盖的简介——60000、70000、80000,你能想到的——总会有一个超出词汇表的薪水数字。name 列也是如此。OOV 令牌将被映射到一个符号,并被提供给翻译模型。因此,模型无法在 SQL 输出中重建准确的实际列值。
处理这种情况的典型方法是通过一个称为架构链接的过程来运行原始输入,该过程识别并缓存列值,并用模型在训练期间看到的占位符来替换它们。例如,在模式链接之后,简介中的输入示例将变成。在训练过程中,模型被赋予类似的标签输出。因此,该模型实际上正在学习如何从列值替换的自然语言输入转换为列值替换的 SQL 输出。最后一步是通过查找模式链接步骤缓存的相应列值来填充占位符。
现在有了高层次的理解,让我们深入到具体的步骤。
数据采集
我们将从数据采集开始。为了完全控制端到端的过程,也为了让它更有趣,我们将从头开始生成训练数据。这个数据生成步骤的预期结果是一个列值替换的自然语言句子和列值替换的 SQL 查询对的列表。虽然你可以继续手工制作一万个训练对,但这很乏味,而且可能不包括模型在推理过程中会遇到的大量语言变化。
相反,我们只手动创建几十个训练对模板来引导数据生成,然后对可能的列名和条件进行采样来实例化训练对。模板可能如下所示:
然后,我们可以对雇员列(姓名、性别、薪水)的组合进行采样,以填充部分,对预定义条件(例如,性别= 、薪水> 和薪水< )的组合进行采样,以填充,对可比列的组合进行采样(在本例中只有薪水)以填充部分。显然,我们需要预先为自然语言语句和 SQL 查询定义、和的可能内容。这通常被称为指定领域的本体。
通过实例化具体的训练对,我们可以很容易地从几十个训练对增加到几百个训练对。接下来,我们需要扩充训练对,以包含更多的语言变体。我们可以通过用释义替换自然语言句子中的短语来做到这一点。基本上,对于句子中的每一个单词或多个单词的短语,我们通过将其改为释义来创建一个新的句子。SQL 查询保持不变,因为我们关注的是自然语言句子中的语言变化。然后,新句子和原始 SQL 查询对被添加到训练数据集中。我们从释义数据库中获取释义。关于如何使用释义数据库进行自然语言增强的具体代码,请参见这篇博文。这使得我们可以从数百个训练对增加到数千个训练对,这足以完成这项任务。
自然语言到 SQL 模型
现在我们有了成千上万个替换了列值的自然语言和 SQL 查询对,我们可以构建我们的翻译模型了。我们使用一个序列到序列的模型,注意机制在这篇的博文中有详细描述。架构的 RNN 部分如图 2 所示。

图 2: RNN 建筑
不过,我们对架构的嵌入部分做了一个改动。来自机器翻译博客文章的原始翻译模型仅仅从零开始学习输入单词嵌入。在这个模型中,我们仍然要学习输入单词嵌入,但除此之外,我们将加载一个固定的预训练单词嵌入层,并将这两个嵌入层的输出连接起来,以提供给模型的其余部分。参见图 3 中的图解。

图 3:自然语言嵌入架构
基本原理是我们可能没有足够的训练数据来表示自然语言输入的语言变化。所以我们想要一个预先训练好的单词嵌入层。但与此同时,我们希望保持我们自己从零开始训练的嵌入,以捕捉这个特定领域中的细微差别。下面是加载固定的预训练单词嵌入层的代码片段。
加载预先训练的嵌入
一旦我们有了这些,我们将在机器翻译博客文章中使用类似的代码进行机器翻译。唯一的区别是,如上所述,我们将把固定嵌入层的输出与自然语言嵌入层连接起来,并将其馈送到递归神经网络层(而不仅仅是从自然语言嵌入层获得输出)。完整的模型代码请参见下面的代码片段。关于如何创建模型初始化参数、和训练循环代码,请随意参考机器翻译博文。
翻译模型代码
我们对模型进行了 10 个时期的训练,并用一些自然语言输入进行了试验:

翻译培训
模式链接模型
现在,剩下的唯一任务是链接列值。给目标一个自然语言句子,如,模式链接应该输出,它可以被翻译模型使用。同时,我们应该记住是 50000。当我们从翻译模型获得 SQL 输出时,我们将写回实际的列值 50000,以创建最终的可执行 SQL 查询。
有许多方法可以将原始输入链接到模式。有些使用基于规则的语法检测来识别潜在的列值。其他方法扫描不同大小的输入范围,并确定它们与列值的相似程度。相似性可以通过计算 span 的单词嵌入和列的集合嵌入之间的欧几里德距离来测量。可以通过对列值的代表性样本的所有单词嵌入求和来预先计算列的聚合嵌入。
我们将在这里探索一种新的方法。我们将使用相同的机器翻译方法来预测/生成任何给定输入的输出掩码。让我们将预定义的占位符映射到一个整数,其余的非列值映射到零。
然后,让我们通过用随机值替换翻译训练对中的占位符来生成链接训练数据的模式。有关更多详细信息,请参见以下代码片段:
模式链接数据生成
我们有如下链接训练数据对的模式。我们可以将训练数据输入到与之前完全相同的机器翻译模型架构中。
我们对它进行了 10 个纪元的训练,并尝试了几个输入示例。

图式链接训练
现在,我们只需要使用输出作为掩码来标记原始输入中的占位符。请注意,对于像 name 这样的多单词值,我们需要将它们折叠成一个占位符。
至此,我们已经完成了从自然语言输入到可执行 SQL 输出所需的所有步骤。
推荐论文
- 用于数据库的端到端神经自然语言接口(链接)。
- 数据库自然语言接口的神经方法:综述。
- 辅助任务(链接)的 Zero-shot Text-to-SQL 学习。
- 一个可迁移学习的数据库自然语言接口(链接)。
- 面向跨域数据库中复杂文本转 SQL 的中间表示(链接)。
- PPDB:释义数据库(链接)。
- 从用户反馈中学习神经语义解析器(链接)。
- 近期数据库自然语言接口的比较调查(链接)。
原文:https://towardsdatascience.com/natural-policy-gradients-in-reinforcement-learning-explained-cf43c

自然策略梯度在统计流形上推进策略,确保相同黎曼距离的一致更新。[罗伯特·卢克曼在 Unsplash 上的照片]
策略梯度算法是现代强化学习的基础。其思想是,通过简单地跟随目标函数的梯度(即偏导数的向量),我们最终会达到最优。这是一个聪明的方法:( I)直接优化政策(而不是学习间接价值函数),( ii)让奖励函数引导搜索。然而,政策梯度有的根本缺陷。本文解释了自然渐变的概念,揭示了传统渐变的缺点以及如何弥补它们。
虽然自然梯度的受欢迎程度已经被 TRPO 和 PPO 等算法超越,但掌握它们的基本原理对于理解这些当代 RL 算法至关重要。自然政策梯度部署不同的思维方式,仅仅观察损失函数并不总是清晰的。
然而,对自然梯度的完整讨论是相当技术性的,需要许多冗长的推导。为了保持这篇文章的简洁,我主要关注于推理和直觉,为更深入的推导提供外部参考。此外,假设对传统(普通)策略梯度和加强算法有扎实的理解。
在传统的策略梯度方法中,梯度∇只给出了权重更新的方向。它没有告诉我们在这个方向上要走多远。导数定义在一个无穷小的区间上,这意味着梯度只在局部有效,在函数的另一部分可能完全不同。
因此,我们在采样(使用当前策略)和更新(基于采样数据)之间迭代。每个新策略卷展都允许重新计算梯度并更新策略权重θ。
行为由步长α控制。这产生了以下众所周知的策略梯度更新函数:

传统的策略梯度更新函数,基于目标函数梯度∇_θJ(θ和步长α更新策略权重θ
更新过程中可能会出现两个常见问题:
- 超调:更新错过了回报高峰,落在了次优政策区域。
- 下冲:在梯度方向上采取不必要的小步导致收敛缓慢。
在监督学习问题中,由于数据是固定的,超调并不是太大的问题。如果我们超过了,我们可以纠正下一个时代。但是,如果 RL 更新导致不良策略,未来的样本批次可能不会提供太多有意义的信息。有点戏剧性:我们可能永远无法从一次糟糕的更新中恢复过来。非常小的学习率可能会解决这个问题,但会导致收敛缓慢。

超调的例子。如果进入梯度方向的步长太大(左),更新可能会错过奖励峰值,并落在低梯度的次优区域(右)。【作者图片】
更新后,我们降落在一个平坦的,次优的地区。低梯度仅引起小的权重更新,并且将需要多次迭代才能再次逃逸。
这里一个有趣的观察是,当我们应该执行一个谨慎的更新时,我们执行了一个大的更新,反之亦然。正如我们将在后面看到的,自然渐变正好相反。
让我们做一个思维实验。为了进行适当大小的权重更新,我们可能会决定给参数变化设置一个上限。假设我们在参数空间中定义一个最大距离作为约束。我们可以这样定义这个问题:

一种权重更新方案,限制了旧参数和更新参数之间的欧几里德距离。
其中| |δθ| |表示更新前后参数之间的欧几里德距离。
这听起来很合理,因为它应该避免超调,同时也没有必要限制更新大小。不幸的是,它并不像你预期的那样工作。例如,假设我们的策略是由θ_1=μ和θ_2=σ参数化的高斯控制,并且我们设置了上限ϵ=1.下图中的两个更新都满足约束!

正态分布对的比较。左边有μ_1=0,μ_2=1,σ_1=σ_2=0.3。右边有μ_1=0,μ_2=1,σ_1=σ_2=3.0。虽然两对之间的欧几里德距离是 1,但是很明显右边的一对比左边的一对更相似。[图片由作者提供]
在这两种情况下,欧几里德距离都是 1:sqrt[(1–0)+(0.3–0.3)]和 sqrt[(1–0)+(3–3)]。然而,对分布(即随机策略)的影响是完全不同的。
问题是给参数空间封顶并不能有效地给我们操作的统计流形封顶。请注意,政策是概率分布,改变概率会改变预期回报。这是我们优化并想要控制的流形。
我喜欢把统计流形想象成分布的“家族”。例如,正态分布的集合族(由μ和σ参数化)构成了一个流形。另一个例子是将神经网络视为输出值的分布。改变随机策略可以被视为在定义目标函数的流形上移动(由参数θ占据)。
参数 cap 仅在统计流形是线性的情况下才起作用,但这种情况很少发生。为了防止策略本身在更新期间改变太多,我们必须考虑分布对参数变化有多敏感。传统的策略梯度算法没有考虑这种曲率。要做到这一点,我们需要进入二阶导数的领域,这正是自然政策梯度所做的。
我们发现,感兴趣的是分布(即由θ参数化的策略)之间的差异,而不是参数 θ和θ_old 本身之间的差异。幸运的是,存在多种距离来计算两个概率分布之间的差。本文将使用文献中最常见的 KL 散度。从技术上来说,它不是一种度量(因为它是不对称的),但可以这样认为(对于小的差异,它是近似对称的):

策略π和π_old 之间的 Kullback-Leibner 散度(也称为“相对熵”)。它描述了两个概率分布之间的距离。
在之前显示的正态分布示例中,KL 散度分别为 0.81661 和 0.023481[公式通过维基百科 ]
在这一点上,引入 KL 散度和费希尔信息矩阵之间的联系是很好的(后面我们会看到为什么)。费希尔信息矩阵是描述统计流形的曲率的黎曼度量,即流形对边缘参数变化的灵敏度。矩阵可以被视为对考虑曲率的距离的校正——想象一下在地球仪上而不是在平坦的地球上测量距离。
如果我们局部地定义 KL 散度*,即δθ= 0,结果证明两者是等价的。在这种情况下,零阶和一阶导数变成 0,可以被删除。二阶导数的矩阵由 Hessian 矩阵表示,在这种情况下,它相当于 Fisher 信息矩阵:*

局部地,KL 散度等价于 Fisher 矩阵。这一结果有助于实际应用。
这个结果对于实际的实现将是至关重要的,但是现在让我们先确定一下。
如果 Fisher 矩阵是一个单位矩阵,那么流形上的距离就是欧氏距离。在这种情况下,传统政策梯度和自然政策梯度是等价的。实际上,这种情况很少见。
与之前类似,我们对允许的更新变更设置了一个约束。然而,这一次,我们将其应用于策略的 KL 散度,而不是参数空间的欧几里德距离。调整后的问题如下:

一个权重更新方案,它限制了新旧策略之间的 KL 差异。注意,这个方案考虑的是分布之间的差异,而不是参数。
通过求解这个表达式,我们确保在参数空间中执行大的更新,同时确保策略本身不会改变太多。然而,计算 KL 散度需要评估所有的状态-动作对,所以我们需要一些简化来处理实际的 RL 问题。
对于接下来的部分,可以在卡耐基梅隆的演讲幻灯片中找到一个精彩而详细的推导(作者 Katerina Fragkiadaki)。为了保持对直觉的关注,我只强调最突出的结果。
我们将找出这个问题的解决方法。首先,我们使用拉格朗日松弛法将散度约束转化为罚函数,得到一个更容易求解的表达式:

通过执行 Langrangian 松弛,我们得到一个惩罚而不是约束大的政策变化的表达式。这个表达式比较好解。
鉴于典型的 RL 问题太大,无法计算所有状态和动作的散度 D_KL,我们必须求助于近似方法。利用泰勒展开——根据导数来近似函数——我们可以基于通过部署策略π_θ获得的样本轨迹来逼近 KL 散度。
上述拉格朗日松弛的泰勒展开看起来如下(为了便于标记,考虑θ=θ_ old+δθ):

逼近最佳权重更新方案的泰勒展开。展开取损失的一阶展开和 KL 散度的二阶展开。
简而言之,损失项 J(θ)用一阶泰勒展开(即梯度 w.r.t. θ)来近似,类似于传统的政策梯度(本质上是局部线性化)。KL 散度用二阶泰勒展开来近似。当局部逼近 KL 散度(即δθ= 0)时,零阶和一阶差评估为 0,因此我们可以消除它们。这里感兴趣的是二阶导数。
为什么损失项 J(θ)没有二阶展开?首先,第二项相对于散度来说可以忽略不计。第二,费希尔矩阵是正定的,但是当也混合在损失项的海森中时,这可能不成立。
为了使表达式不那么吓人,我们可以(I)用 Fisher 信息矩阵代替二阶 KL 导数,以及(ii)删除所有不依赖于δθ的项。这给我们留下了一个稍微友好的表达:

权重更新方案的简化泰勒展开,代入费希尔矩阵,并删除不依赖于δθ的项
撇开符号紧凑性不谈,为什么要用费希尔矩阵代替二阶导数呢?事实证明等价是非常方便的。海森矩阵是一个|θ|⋅ |θ|矩阵,每个元素都是二阶导数。完整的计算可能相当麻烦。然而,对于费希尔矩阵,我们有一个替代表达式,它是梯度的外积。无论如何,由于我们已经需要传统策略梯度的这些值,因此计算开销大大减少:

费希尔信息矩阵可以表示为政策梯度的外积。该表达式在局部等价于 Hessian 矩阵,但在计算上更有效地生成。
因此,如果我们能够像我们习惯的那样计算梯度,我们就拥有了执行权重更新所需的所有信息。还要注意,期望意味着我们可以使用样本。
需要了解的信息相当多,所以让我们简要回顾一下到目前为止我们已经完成的工作:
- 为了防止政策偏离太远,我们对新旧政策之间的 KL 差异进行了限制。
- 使用拉格朗日松弛,我们将约束转化为惩罚,给我们一个单一的(无约束的)表达式。
- 由于我们不能基于样本直接计算 KL 散度,我们使用泰勒展开作为权重更新方案的近似。
- 对于小的参数变化,使用费希尔信息矩阵来近似计算 KL 散度,对此我们有一个现成的表达式。
- 整个近似是一个局部结果,假设θ=θ_old。因此,整个原理只适用于小的政策变化。
现在,让我们看看如何解决这个问题。
是时候回到拉格朗日松弛法的泰勒展开式了。我们如何求解这个表达式,即找到最优权重更新δθ?

权重更新方案的简化泰勒展开可以使用拉格朗日方法来解决
嗯,我们可以通过将梯度 w . r . t .δθ设置为零来找到所需的更新(朗格方法)。求解表达式(现在转换为最小化问题,假设θ=θ_old)得出:

通过将导数 w . r . t .δθ设置为 0 来求解松弛泰勒展开式
该解决方案可以被重新安排以找到权重更新δθ:

重新安排解决方案允许表达最佳权重更新
注意-1/λ是一个常数,可以被吸收到学习速率α中。事实上,α可以通过分析推导出来。从最初的约束,我们知道 KL 散度应该至多是ϵ.对于固定的学习率α,我们不能保证α F(θ)^-1 ∇_θJ(θ)≤ϵ.从代数上来说,我们可以推断出一个动态学习速率α(t11 ),它确保(再次近似地)更新的大小等于ϵ.遵守这一约束会产生以下学习率:

动态学习速率α确保权重更新的 KL-散度(通过近似)不超过散度阈值ϵ
最后,从重新排列中,我们提取 自然策略梯度,这是针对流形的曲率校正的梯度:

自然策略梯度 w.r.t .目标函数是标准梯度乘以逆 Fisher 矩阵,说明黎曼空间的曲率
*这个自然梯度在距离限制内给出了黎曼空间中最陡的下降方向,而不是传统假设的欧几里得空间。注意,与传统的策略梯度相比,唯一的区别是 与逆 Fisher 矩阵相乘!*事实上,如果费雪矩阵是一个单位矩阵——实际上很少是——传统的和自然的政策梯度是等价的。
最终的权重更新方案如下所示

自然政策梯度的权重更新方案。动态学习率确保每次更新同等地改变分布。
这种方案的强大之处在于,它总是以相同的幅度改变策略,而不管分布的表示。
最终结果在两个方面不同于传统的政策梯度:
- 考虑到政策对局部变化的敏感性,梯度由逆向 Fisher 矩阵进行“修正”。由于矩阵是倒置的,在陡坡处(高灵敏度)更新趋于谨慎,而在平坦表面处(低灵敏度)更新趋于较大。传统的梯度方法(错误地)假设更新之间的欧几里德距离。
- 更新权重/步长α具有适应梯度和局部灵敏度的动态表达式,确保ϵ量级的策略改变,而不管参数化。在传统方法中,α是一个可能不适合的可调参数,通常设置为某个标准值,如 0.1 或 0.01。
尽管背后的机制相当不同,但在表面上,传统政策梯度方法和自然政策梯度方法惊人地相似。
自然策略梯度算法的完整概要总结如下。注意,在实践中,我们总是对梯度和 Fisher 矩阵使用样本估计。

自然政策梯度算法,来自柏克莱的深度 RL 课程,作者约书亚·阿奇姆
自然梯度克服了传统方法的基本缺陷,考虑了目标函数定义的流形如何随参数更新而变化。具体来说,自然梯度允许逃离高原,谨慎地接近回报高峰。从理论上讲,自然政策梯度应该比传统政策梯度收敛得更快更好。
在它们最纯粹的形式中,自然梯度算法通常是不实用的。这有许多原因。
首先,泰勒展开提供了高达二阶的局部近似*。由于这个原因,估计的 Hessian 可能不是正定的。在实践中,自然梯度法在数字上是脆弱的,并不总是产生稳定的结果。大量的数学推导可能看起来令人信服,但泰勒展开、样本近似和严格的局部有效性(假设θ = θ_old)会极大地影响现实世界的性能。*
第二,费希尔信息矩阵占据了|θ|⋅|θ|空间。考虑一个有 10 万个参数的神经网络,你可以想象笔记本电脑上的 100 亿个矩阵不会飞。此外,计算矩阵的逆矩阵是 O(N)复杂度的运算,这相当繁琐。因此,对于深度 RL 方法,自然策略梯度通常会超过内存和计算限制。
最后,我们习惯于与复杂的一阶随机梯度优化器——如 ADAM,它也考虑二阶效应——在广泛的问题上提供出色的结果。二阶优化方法(即自然梯度算法)没有利用这些优化器。
诸如共轭梯度和克罗内克因子化近似曲率(K-FAC)的方法可以(部分地)解决上述问题。在实践中,诸如信赖域策略优化( TRPO )和特别是邻近策略优化( PPO )的方法已经在流行度上超过了自然梯度,尽管它们植根于相同的数学基础。
*
当对比自然政策梯度和传统政策梯度时,差异看起来相当有限。最后,我们只在我们所熟悉的梯度上增加了一个倒置的费希尔矩阵——考虑了局部敏感性。尽管如此,我们优化的方式是非常不同的,考虑策略距离而不是参数距离。通过确保策略在更新权重时不会偏离太远,我们可以执行更稳定和一致的更新。
自然策略梯度伴随着一系列数字挑战,尤其是在处理大规模优化时(例如,具有大量参数的神经网络)。此外,在理论基础上进行了大量的近似和简化;修行可能更不守规矩。对于现实世界的实现,最近的策略优化现在通常是首选的。
尽管如此,对自然梯度的理解对于那些希望了解强化学习最新技术的人来说是非常重要的。
喜欢这篇文章?你可能也会喜欢以下的 RL 作品:
对于自然政策梯度的起源,我建议阅读 Amari (1998 年)和 Kokade (2001 年)的基础论文,以及 Martens (2020 年)最近的反思。
- 阿马里,S. I. (1998 年)。自然梯度在学习中很有效。 神经计算, 10 (2),251–276。
- Kakade,S. M. (2001 年)。天然的政策梯度。 神经信息处理系统的进展、 14 。
- Martens,J. (2020 年)。对自然梯度法的新见解和新观点。 《机器学习研究杂志》, 21 (1),5776–5851。
就讲座幻灯片而言,我发现以下几张特别有帮助。
- 高级政策梯度(CS 285)。加州大学伯克利分校。
- Achiam,J. (2017 年)。高级政策梯度方法。加州大学伯克利分校。
- 自然政策梯度(CMU 10-403)。卡内基梅隆。
最后,以下帖子从不同角度提供了很棒的解释。
- 克里斯蒂娅(2018)。自然梯度下降。[ 链接
- 自然渐变。【链接
- 扬·彼得斯(2010 年)。政策梯度方法。Scholarpedia,5(11):3698。【链接
- OpenAI (2018)。信任区域策略优化。[ 链接*
原文:https://towardsdatascience.com/navigating-mlops-dc2a242ef7ed

劳拉·奥克尔在 Unsplash 上的照片
MLOps 已经在机器学习、数据科学、软件工程和(云)基础设施的交叉领域确立了自己的独立地位。在这篇文章中,我想看看机器学习/数据科学在生产中的现代方法、经验教训和实践经验。
我刚开始做机器学习的时候,2014 年我还是大数据工程师的时候,大部分是在大数据的背景下应用的。机器学习或数据科学并不新鲜,但随着 Hadoop 中的 MapReduce 和后来的内存引擎(如 Apache Spark)将机器学习的能力与分布式计算和海量(web)数据的能力联系起来。我们已经看到了许多重大转变,从(本地)Hadoop 生态系统的兴衰开始(并非最后是因为巨大的管理成本),以及云中数据处理的持续趋势,我们可以肯定只有一件事是一致的:变化。
不仅基础设施变了,框架和方法也变了。从 TensorFlow 到 Pytorch,从 CRISP-DM 到 Agile,从 SOAP 到无服务器。很难跟上潮流。
如果你看看人工智能初创公司和咨询公司做出的承诺,以及真正适用的承诺,两者之间存在很大差距。虽然他们中的一些人几乎没有应用任何人工智能,但他们中的大多数人都因为坏的、丢失的或无用的数据而失败。然而,近年来许多公司已经开始成功地应用数据科学,并且有许多模型等待投入生产。这带来了新一波的 MLOps 创业公司,他们现在再次承诺提供一个适合所有人的解决方案。
当从定制的 MySQL 数据仓库迁移到云并评估许多不同的产品时,只有一个结论:没有适用于所有东西的平台,其中大多数都在为非常狭窄的用例工作。对于 MLOps 也是如此。因此,不要认为没有 ML 基础设施团队就可以将模型投入生产。
但是当然,有一些优秀的工具可以解决特定的用例。而且你不需要在投产前建立完整的基础设施,你也不应该。但是您需要相应地扩展您的基础架构。
因此,我将在这里详细说明,并直接说出供应商或开源框架的名称,而不涉及其中任何一个。
只是一个简短的提醒,每一个代码都应该遵循软件工程的原则。这意味着测试 CI/CD、项目结构和编码最佳实践。我在这里不关注这个,因为它与软件工程没有什么不同。
当然,我推荐使用 pandas、scikit-learn、seaborn、tensorflow、pytorch、 huggingface 、jupyter 的 Python 堆栈——凡是你能想到的。然而,从 MLOps 的角度来看,更重要的是该堆栈的部署。如果你有轻量级的脚本,我建议使用 AWS Lambda,如果它变得更高级,我更喜欢运行云服务器(如 AWS EC2)并在 Docker 中隔离一切。将地形用于基础设施是明智之举。我也推荐使用 anaconda,因为他们的库是有管理的,对于专业人员来说非常便宜。
有时你可能需要生产 R 脚本。在这种情况下,要么选择托管服务,要么使用 Docker 来隔离环境。不要在裸机服务器上安装 R 并试图在那里运行生产脚本,你会经历地狱,因为 R 肯定不是生产级语言。并了解 R 库的安全含义。
如果你身边有 Java,就像许多公司一样,使用 java ml 框架可能更容易。在许多情况下,将您的模型直接集成到您的软件环境中是非常有意义的。但是你需要会用 Java 编码的人,或者需要会“移植”代码的工程师。虽然我个人不喜欢 WEKA 并会避免 deeplearning4j ,但我真的很喜欢使用 Smile-ML 。
周围有很多不同的工具,但我个人喜欢 Neptune.ai 。他们称自己为 ML-Ops 的元数据存储库,这相当准确。你可以免费使用它们,甚至在一个小团队中,并跟踪你的实验和保存你的模型,支持许多不同的框架,如 scikit-learn,TensorFlow,Pytorch,R…
如果你部署深度学习模型,我真的会建议你使用模型服务器。可以是 Triton , tensorflow serve ,或者你喜欢的任何东西,但是要用模型服务器!如果你没有定制层,使用 ONNX 作为格式,如果你有定制层,使用框架的模型服务器来避免不必要的工作。这里我写的更详细,重点是 TensorFlow。
如果您为批量预测部署脚本,那么简单的方法就是在 Docker 中运行它们。对于 API,你可以像之前说的那样在 Docker 容器中运行无服务器产品,如 AWS Lambda 或 FastAPI 。
有了 terraform,你还可以在 GPU 实例(AWS、GCP、Azure)上的云中自动进行模型训练。然而,我个人喜欢在我的开发机器上有一个强大的 GPU 来快速试验东西和评估模型。在本地有一个 GPU,这对于原型来说要快得多。还要注意,有特定的 GPU 实例用于推理。
对于编排来说, AirFlow 或 Prefect 似乎是不错的选择,但是 Prefect 要求你在每台服务器上安装一个代理(管理员通常不喜欢这样),在 AirFlow 中你可以使用 SSH。
根据我的经验,监控是高度定制的,但我个人喜欢的是用于时间序列监控的 Kibana ,它在付费版本中提供了开箱即用的异常检测。一般来说,监控模型预测(计数、分布)、训练结果和特征特性之类的东西是明智的。NeptuneAI 还涵盖了与模型训练相关的指标。
我很喜欢使用 MySQL 或 PostgeSQL 这样的纯 SQL 数据库。然而,在某种程度上,使用数据仓库是明智的,因为在 2022 年没有人会构建 Hadoop 集群,所以你最好看看像 Snowflake 这样的云数据仓库,它提供了很多高级功能,特别是针对 ML 和 DS ( Snowpark )。
但还有更多,如果你使用一些相似性搜索引擎(如视觉相似性),你可能要调查向量数据库。直截了当的方法是使用 HNSWlib (支持包括 Java 在内的许多语言)或惹恼来自 Spotify 的,其中的索引只是一个文件。但是还有更高级的选项,比如 Milvus.io 。
不要用 Scrum,用看板,但这是我的看法。详见此处。
最后,让我们快速讨论一下推理设置。通常,很多模型不需要提供实时预测。如果不需要,引入额外的堆栈是没有意义的。以我的经验来看,有三种推理模式。批量预测、实时预测和在线学习系统,其中最后一个是一个例外。我从未真正将在线学习系统投入生产,所以我不能真正谈论它,但至少我可以说这是最复杂的场景,因为它是完全自主的,你需要大量的监控来确保模型不会失败,就像微软向我们展示的。
与批处理相比,实时推理增加了许多复杂性。您需要确保应用所有的软件工程实践来构建一个可靠的、可伸缩的系统。这就是为什么我建议使用模型服务器,因为它们是为这种用例而设计的。
批处理要简单得多,因为如果它失败了,可以很容易地重复,你不需要考虑延迟,通常你只需要输入->输出,不需要太多的网络参与。
我希望这能给你一些启发,帮助你理解 MLOps 是什么。一如既往,这里有很多观点,有其他经历也没关系,但我很高兴在评论中听到你的。
原文:https://towardsdatascience.com/nba-draft-analysis-using-machine-learning-to-project-nba-success-a1c6bf576d19

埃德加·恰帕罗在 Unsplash 上拍摄的照片
众所周知,建立一个成功的体育特许经营最关键的部分之一是尽可能获得最有天赋的球员。对于 NBA 球队来说,获得这种天赋最可靠的方法是在 NBA 选秀中进行选择。每年一次,NBA 球队和他们的球迷充满了希望,他们可以带来一个大学明星,他可以将他们的成功转化为职业水平。
然而,在现实中,NBA 选秀是一门非常不精确的科学,经常导致有很高期望的球员无法实现他们的期望。作为一名 NBA 选秀的狂热粉丝,我想确定是否有可能利用一名选秀候选人的大学生涯来帮助评估他们在 NBA 的未来时的决策过程。对我来说,这似乎是数据分析和运动的一个很好的交集,也是一个获得新技能的机会。
我知道我的篮球统计一站式商店将是篮球参考。在做了一些研究之后,我发现了 Python 的 BeautifulSoup 库,我知道它能很好地为我工作,能够以有效的方式从 Basketball-Reference 获取数据。
注:本文使用的所有代码都可以在 GitHub 上找到,整理在这个笔记本中。
如前所述,我从篮球参考中获得了这个项目的 NBA 数据。我还需要 NCAA 篮球统计数据来进行分析,这些数据是我从体育参考大学篮球中获得的。为了获得这些数据,我使用了 Python 库 Beautiful Soup,它允许从 HTML 和 XML 文件中提取数据。我的第一步是从过去的 NBA 选秀中获取数据。我最初选择看过去的 20 次 NBA 选秀,主要是因为 NBA 比赛的变化是多么迅速,并希望在当前的 NBA 格局中预测成功。

我得到这个数据的页面就是上面的。本页面的网址为https://www . basketball-reference . com/draft/NBA _ { draft _ year }。html 。为了获得几个 NBA 选秀的数据集,我需要利用一个 for 循环来遍历年份列表,并更新多个 NBA 选秀的 URL。一旦完成,我就可以获得过去 20 次 NBA 选秀中所有球员的数据集以及他们的 NBA 职业统计数据。

我的下一个目标是获得大学统计数据,这些数据将与这些数据中每个适用的球员相关联。在此之前,我选择了查看所有入选球员的比赛分布,因为我想看看典型的 NBA 职业生涯长度是什么样的。
在创建可视化之前,我删除了没有参加过任何 NBA 比赛的球员以及没有上过大学的球员。有很多原因可以解释为什么被选中的球员可能从未在 NBA 打过一分钟,这可能包括海外球员被选中并选择留在海外职业联赛,甚至在一些不幸的情况下严重受伤。
很明显,NBA 比赛的分布是右偏的,这是有道理的,因为有一个不断轮换的有希望的 NBA 球员名单年复一年地进入联盟。NBA 球员只持续 2-3 个赛季的情况比勒布朗·詹姆斯这样职业生涯跨越近 20 年的人要常见得多。为了确保在我即将进行的分析中有一个像样的 NBA 表现基线,我决定删除任何没有在 NBA 打过至少 82 场比赛(相当于一个完整赛季)的球员。
在做了这些更改之后,我按照前面类似的过程来获取数据中剩余球员的大学统计数据。

个人球员学院统计链接如下:https://www . sports-reference . com/cbb/players/{ player _ first _ name }-{ player _ last _ name }-1 . html。我获得的大学球员的数据集包括 NBA 选秀的职业大学统计数据。

我考虑了 4 个指标来作为回归模型的目标变量,以表明 NBA 职业生涯的成功水平;WS、WS/48、VORP 和 BPM。对其中每一项的快速描述:
WS — Basketball Reference 将胜率定义为“试图将团队成功的功劳分配给团队中个人的球员统计数据。”获胜份额的计算包括将进攻和防守获胜份额记入玩家的贷方。这包括计算球员相对于联盟平均水平的边际进攻和防守影响,以制定一个指标,量化球员在整个 NBA 职业生涯中对胜利的影响。
WS/48 —与 Win Shares 相同的计算方法,根据上场时间进行标准化调整。因为赢的份额是用统计数据计算的,他们更喜欢在球场上花更多时间的球员。这一统计数据使得所有球员在上场时间相同的情况下发挥的作用更加公平。
VORP——根据篮球参考, VORP 被定义为“一名球员在替补水平(-2.0)以上贡献的每 100 场球队财产的分的盒子得分估计,转化为一支平均球队,并按比例分配给 82 场比赛的赛季。乘以 2.70 以转换为胜于替换。
BPM——再次参考篮球参考,“框加/减,2.0 版(BPM)是一个基于篮球框得分的指标,评估一名篮球运动员在球场上对球队的贡献。它只基于传统篮球框得分中的信息,不包括逐场比赛数据或非传统框得分数据(如扣篮或偏转)。”
我决定利用 WS 作为回归模型中目标变量的最终选择。这些指标都不能完美概括一名 NBA 球员在球场上的影响力,但是当我们看一看 NBA 职业领袖获奖份额列表时,我们可以看到这个指标无疑指向了正确的方向。在这个指标中表现最好的是那些名人堂成员和球员,如果他们今天退役的话。
观察 WS 在数据中的分布,我们可以看到它是右偏的。这非常有意义,因为赢球份额是一个在球员整个职业生涯中累积的统计数据。
在决定了我的目标变量之后,我继续准备我将使用的数据,以便为机器学习模型清理数据。这包括处理大学统计数据中任何缺失的值,并删除任何不必要的功能。
在回归模型中训练数据之前,我选择执行特征选择,以便确定和过滤哪些大学统计数据将具有 NBA 胜利份额的最强信息增益。完成这个过程后,将作为解释性特征保存在我的模型中的大学统计数据包括:
- 比赛开始次数——球员在整个大学生涯中开始的比赛次数(比赛开始时在球场上)。
- 每场比赛的投篮次数——每场比赛的总投篮次数。
- 每场比赛投中 3 分——每场比赛投中 3 分的次数。
- 三分球命中率——三分球投篮次数除以投篮次数。
- 每场比赛的罚球次数——每场比赛的罚球次数。
- 每场比赛的进攻篮板——队友投篮不中后每场比赛的篮板数。
- 每场防守篮板——在对方球员失误后每场比赛的篮板数。
- 每场比赛的总篮板数——每场比赛进攻篮板和防守篮板的总和
- 场均助攻——每场比赛中队友直接传球投篮的次数。
- 每场比赛的阻挡次数——每场比赛中,球员挡出(或阻挡)对方球员投篮的次数。
- 每场比赛失误次数——每场比赛中球员失去对对方球队的控球权的次数。
- 每场比赛的得分——每场比赛的总得分。
因为 Win Shares 是一个累积的统计数据,所以我在选择预测模型的训练集时必须非常小心。这些选秀中的许多球员仍然有许多 NBA 比赛要打,特别是那些从 2010 年 NBA 选秀开始的球员,他们的球员可能刚刚进入他们的最佳 NBA 岁月。正因为如此,我选择限制我的模型的训练数据,以包括 2000-2009 年 NBA 选秀的球员,同时对 2015-2019 年 NBA 选秀进行测试。
我对此的推理是,2000-09 年选秀的球员将退出联盟/在这一点上走下坡路,因此他们的胜率将不再迅速增加,这将是最近 NBA 选秀的情况。我利用随机森林回归模型作为预测模型。该模型的预测高于这些 NBA 球员的实际获胜份额,这是意料之中的,因为这些球员仍在职业生涯的前 7 年内,并有望积累更多的获胜份额。为了说明这一点,我选择用一个主观的过程来分析我的模型的结果,而不是严格地看任何准确性指标。
下面,我比较了 NBA 选秀前 15 名球员的预测胜率和前 15 名球员的实际胜率。
交互式图表(将鼠标悬停在数据点上以查看玩家姓名和价值)
从视觉上,我们可以看到模型对胜利份额的预测与这些 NBA 选秀的当前地位之间的差异。如前所述,这是意料之中的,因为赢球份额是在球员的整个 NBA 职业生涯中累积的。我将不得不等待根据平均绝对误差或平均绝对百分比误差来评估我的模型,直到这些选秀班的球员退出他们的 NBA 职业生涯。


我的模型对这个选秀班的预测结果是一个大杂烩。2015 年选秀中的第一名是卡尔-安东尼·唐斯,他肯定会是一个重新起草的共识前三名,他在职业生涯中迄今为止一直带领这个选秀班赢得份额。
但是,在我的模型中,他在预测的 Win 份额中不在前 15 名之内(排名第 19 位),这是一个相当大的差异。Towns 已经超过了我的模型对他职业生涯的预测 30 %,他还有很长的职业生涯要走,这增加了这种差异。
尽管如此,我的模型确实预测了一些球员,他们将被认为超过了他们原来的选秀位置,包括德文·布克,德隆·赖特,凯文·鲁尼,朗德-霍利斯·杰弗逊,诺曼·鲍威尔,泰尔斯·琼斯,迈尔斯·特纳和鲍比·波蒂斯。
特别是德文·布克,他是第 13 顺位,在我的模型中表现非常好,他在上赛季带领菲尼克斯太阳队进入 NBA 总决赛时,在 NBA 中也支持了这一点。如果给 NBA 总经理一个重来的机会,这些球员很可能会比他们最初的选秀之夜更早被选中。
我的模型预测的最大失误应该是贾利尔·奥卡福、斯坦利·约翰逊、特雷·莱尔斯和温斯洛法官,他们在职业生涯中迄今为止都只不过是边缘轮换球员。
体育作家重新起草比较:
https://fadeawayworld.net/nba/re-drafting-the-2015-nba-draft-class-karl-anthony-towns-devin-booker-kristaps-porzingis


我的模型有最初的第一选择,本·西蒙斯,有最高的预测胜率,如果他现在不坐在这个 NBA 赛季,他最有可能在他的职业生涯中证明这个预测。
然而,球员的第二名、第四名和第五名将不得不被归类为失误,因为马奎斯·克里斯、帕特里克·麦考和克里斯·邓恩与选秀中的前五名选手相去甚远。与他们在选秀之夜实际被选中的地方相比,像卡里斯·勒维特、多曼塔斯·萨博尼斯和德章泰·穆雷这样的球员在模型中的表现都很好。
其他城市如泰勒·尤利斯、德扬泰·戴维斯、以赛亚·怀特海德、斯卡尔·拉比西埃和亨利·埃伦森都没能进入前 15 名。与我的模型的差异还包括没有杰伦·布朗,贾马尔·穆雷,帕斯卡尔·西亚卡姆在预测的前 15 名 WS 中,因为他们都被证明是 NBA 全明星级别的球员。
体育作家重新起草比较:
https://www.yardbarker.com/nba/articles/redrafting_the_2016_nba_draft/s1__


我的模型,就像大多数 NBA 球探和前台一样,预测马克尔·富尔茨将是 2017 年 NBA 选秀班的最佳球员。不幸的是,像球探和前台一样,这个模型没有考虑到富尔茨在他仍然年轻的 NBA 职业生涯中一直困扰他的伤病。
从我的模型来看,下四个最高玩家的预测赢股,Tony Bradley、Dennis Smith Jr .、Semi Ojeleye 和 T.J. Leaf,在该选秀类的实际赢股方面远未达到最高。朗佐·鲍尔在预测获胜份额方面排在第 8 位,作为今年在芝加哥公牛队爆发的人,看起来是一个很好的赌注。
对于今年的选秀班来说,有几个球员在模型中表现出色,但他们在 NBA 职业生涯中迄今为止一直受到伤病的困扰。除了前面提到的马克尔·富尔茨,这还包括扎克·科林斯和哈里·贾尔斯。最重要的是,我的模型没有识别出这个选秀级别的几个最大的抢断,包括贾勒特·阿伦,巴姆·阿德巴约和多诺万·米切尔。
体育作家重新起草比较:
https://bleacherreport.com/articles/-re-drafting-the-2017-nba-draft-class


对于 2018 年的 NBA 选秀,我的模型预测了许多球员,他们在职业生涯中已经超越了他们的 NBA 选秀,然而这些球员的顺序仍然有很大的争议。
这个球员名单将包括贾里德范德比尔特,德安东尼梅尔顿,动摇米尔顿和德文特格雷厄姆。另一个因伤未能达到预期的球员也在我的模型中表现出色,马文·巴格利三世(Marvin Bagley III),他是选秀之夜的 2 号选择。或者,像小温德尔·卡特、沙伊·吉尔吉斯·亚历山大、小迈克尔·波特、科林·塞克斯顿、莫·邦巴和迈尔斯·布里奇斯这样的球员在他们的 NBA 职业生涯中仍然很年轻,但没有人会质疑他们应该在这个选秀班的前 15 名中获得一席之地。
体育作家重新起草比较:
https://hoopshabit.com/2021/08/18/nba-draft-luka-doncic-rises-2018-redraft/


2019 年的 NBA 选秀仍然非常新鲜,球员在职业生涯胜利份额方面有足够的空间,但我对我的模型的预测相对满意,这些预测基于迄今为止预测胜利份额前 15 名球员的 NBA 表现。锡安·威廉姆森和贾·莫兰特在他们年轻的 NBA 职业生涯的第二个赛季就被评为全明星,而大流士·加兰将在本赛季加入他们。泰勒·赫罗,马蒂斯·蒂布尔,布兰登·克拉克,乔丹·普尔和 P.J .华盛顿都在职业生涯中击败了他们的选秀选择,并期待在未来的许多赛季中证明他们是选秀日抢断。
我的模型预测的失误将不得不包括泰杰罗姆,卡姆雷德和布鲁诺费尔南多,他们迄今为止不会被认为是 NBA 选秀的前 15 名球员。
体育作家重新起草比较:
https://bleacherreport.com/articles/-2019-nba-re-draft-where-do-zion-ja-morant-and-the-rest-of-the-class-land
我的分析给我的一个关键收获是,NBA 选秀是一门非常不精确的科学,在预测大学毕业生的 NBA 未来时,需要结合数字分析和传统的球员侦察才能获得最佳的准确性。
虽然我的模型正确地预测了相当多的球员,他们现在会被认为是 NBA 选秀中的“抢断者”(与他们在 NBA 的表现相比,他们在选秀中的表现晚于他们应该被选中的球员),但如果你跟随我的模型去开球,你也会以一些选秀“失败者”(被过早选中的球员)告终,并错过了在现实生活中表现比我的模型预测的好得多的球员。
我在这个项目中遇到的一些问题可以在以后的项目中解决,这些问题包括:
- 为模型提供更多的训练数据——我可以包括 2000 年以前 NBA 选秀的数据,但是,我觉得 NBA 在过去的二十年里变化太大了。为了获得对当今 NBA 真实的预测,我选择省略一些我认为会混淆模型预测的数据。但是,在这样做的时候,我限制了模型可用的训练数据量。
- 纳入国际球员——将选秀前在海外比赛的球员纳入预测也是有益的,方法是将他们纳入该模型的数据集中,或者创建一个单独的模型。今天,国际球员约占 NBA 的 25%,在选秀预测中错过这些球员就排除了一批有才华的球员,包括卫冕联盟 MVP 尼古拉·约基奇。
- 赢得份额可能不是衡量个人成功的最佳指标。篮球是一项团队运动,因此衡量个人表现并不简单。一些非常有天赋的球员可能会被选入糟糕的情况/球队,在这种情况下,他们将不会获得与他们的天赋水平相当的预期胜利份额。在大多数情况下,这将在球员的整个职业生涯中随着他们在球场上的情况变化而平衡,但仍可能导致模型结果的差异。
总之,我了解到,是的,人们可以利用大学篮球统计数据来预测 NBA 选秀的成功前景。然而,仅仅基于大学表现的预测并不理想,因为有许多无法量化的方面会影响他们的 NBA 职业生涯,如球员无形资产和伤病,这些都无法用大学统计数据来解释。
更多内容请看plain English . io。报名参加我们的 免费周报 。在我们的 社区 获得独家获得写作机会和建议。
原文:https://towardsdatascience.com/ndcg-is-not-all-you-need-24eb6d2f1227
电子商务系统(RSs)就在我们身边,帮助我们在当代生活的选择悖论中导航:我应该听的下一首歌是什么?我应该看的下一部电影是什么?或者更微妙地说,我应该消费的下一条新闻是什么?
RSs 代表了最普遍的机器学习系统类型之一,以及它在使数十亿人的数字生活个性化方面的所有力量,和不断提醒我们作为用户、从业者和立法者的责任:通过鼓励你阅读一个关于好莱坞名人与气候变化的故事,我们使你更有可能花时间了解布拉德·皮特的生活,以及它所包含的一切。
因为即使是一个糟糕的预测也可能导致巨大的声誉损失或侵蚀我们的信任,构建更健壮的 RSs 是一个重要的话题,如果我们不能更好地测试现有的系统,我们当然不会构建一个更健壮的系统。
不幸的是,RSs 往往会“无声无息地失败”,如下例所示,摘自 LinkedIn 上一篇关于奇点的帖子(虽然还没那么接近):

每个人都有自己的关于离线评估中没有发现的错误的恐怖故事。[截图来自作者的 LinkedIn feed ]
这意味着,在一个典型的周期中,一个 ML 系统用一些数据进行训练,通过一些准确性指标在一个保留的集合上进行基准测试,如果选择的 KPI 是可接受的,则在野外部署。由于这些系统本质上都是随机的——在许多情况下,是非常复杂的非线性对象——ML 和软件开发之间的直接类比就失效了:测试集的高准确性本身并不能防止像上面这样不合理的推论。
在这篇博文中,我们介绍了 RecList,这是一个新的开源库,用于在现实世界的推荐系统中扩展行为测试。虽然学术介绍以研究论文的形式提供,但我们希望在这里提供一个更实用的视角,面向现代 RSs 的所有利益相关者:ML 工程、产品经理,当然还有最终用户。
克隆回购,系好安全带,请 Github 上一个明星支持我们!
对人工智能进行“行为测试”的想法并不新鲜:正如 NLP 爱好者可能已经注意到的那样, RecList 正在向清单、致敬,微软从 2020 年开始领导建立 NLP 的行为测试。在传统测试中,我们有“逐点”估计(例如, NDCG ,平均倒数排名),它量化了一个保留数据集的泛化能力。相反,行为测试是输入-输出对:通过比较模型的输出和期望的结果来评估模型。例如,在情感分析中,我们希望在交换同义词时预测保持一致:

如果一个模型预测第一次评论的积极情绪,我们通过检查当把“棒极了”换成“棒极了”时预测是否改变来测试它的稳健性。【图片由作者提供】
在构建“你可能喜欢的相似事物”传送带时,我们希望产品在所有相关维度上都相似,因为向浏览低价 polos 的购物者推荐贵 10 倍的商品会导致次优体验:

相似产品的推荐应该尊重用户在各个方面的意图。例如,在这种情况下,基于视觉特征的基于内容的推荐器可能会“无声无息地失败”。[图片由作者提供]
清单的基本观点并不是“行为测试很酷”(咄!),而是说:
- 行为测试可以以一种黑盒的方式运行,将测试从模型的内部工作中分离出来:因此我们可以在没有源代码的情况下比较模型,只要它们公开了一个标准的预测接口;
- 建立一对一的行为测试是昂贵的,但是我们可以通过结合领域知识、ML 技巧和可扩展库来帮助扩展它们。
如果你愿意,RecList 是一个“推荐系统的清单”。
我们确定了三个特定于建议的关键原则来启发我们的图书馆:
不变性质 : 互补和相似项满足不同的逻辑关系。虽然相似的物品可以互换,但互补的物品可能有一个自然的顺序:向购买昂贵电视的购物者推荐 HDMI 电缆是一个好主意,但向购买电缆的人推荐电视是一个糟糕的主意。我们通过将预测与元数据相结合来操作这些见解:例如,我们可以使用价格和分类法来检查不对称约束。

补充项目通常具有隐含的自然排序,这可能永远不会在标准的保留数据集上进行测试,只会在生产中变得明显。【图片来自作者等人的原论文】
不是所有的错误都一样糟糕 : 如果一部电影推荐的地面真相项目是“当哈利遇见莎莉”,漫无目的的度量将无法区分一个暗示的模型终结者和一个提议的模型你已经收到邮件。换句话说,虽然两者都是“错误的”,但它们在同一方面都不是错误的:一个是合理的错误,另一个是可怕的建议,对用户体验具有相当大的破坏性。

当根据“ 【大病号 ”推荐前 3 部电影时,模特 A 和 B 的命中率相同,然而,旋转木马中的“错误”电影并没有提供相同的体验:A 的建议比 B 的建议差得多。[图片由作者提供]
并非所有的输入都是相同的 : 如果我们关心的用户子集更快乐,我们可以容忍整体准确度的小幅下降;例如,如果我在营销活动中推广最新的耐克鞋,那么耐克产品页面上的购物体验应该特别有条理。由于商品消费通常是幂律,相对于高频商品的边际改善可能会产生 KPI 改善,为利基市场“隐藏”严重的退化:如果电影推荐者在漫威大片上变得更好,但对意大利用户来说变得很糟糕,我们应该能够注意到,并进行相关测试,以做出有原则和明确的权衡。除了一些横向用例(例如冷启动项目),最有趣的片段通常是上下文相关的,这是我们图书馆的一个重要指导原则。

即使蓝绿推荐人整体 HR 相当(见我们的 论文 ),在不同品牌上的表现也大相径庭。【图片来自作者等人的原论文】
一个重新列表——我们使用斜体来表示 Python 抽象,而不是作为一个整体的包——仅仅是测试的集合。任何继承了正确抽象的类都可以包含任意多的测试,通过 Pythonic 风格的 decorators 指定(让人想起 Metaflow 中的流)。例如,下面的类只有一个测试,一个来自我们库的例行程序,运行定量检查(覆盖率,受欢迎程度偏差等)。):
一个简单的 RecList,其中一个测试重用了提供的标准库。
由于行为测试通常会随着用例(补充建议不同于类似项目)和数据集而变化,因此 RecList 的一个实例会类似于 CoveoCartRecList ,即针对电子商务研究的 Coveo 数据集的补充建议的一组测试。
由于采用了模块化设计,开始使用新的列表非常快:该库附带了许多预制的测试,您可以将这些测试与任意代码混合使用以进行自定义检查,这使得一致地重用业务逻辑变得非常容易。
了解如何使用隐士的最简单方法是浏览一个现成的例子,或者在你的浏览器中运行提供的 Colab 笔记本:
运行一个现成的 RecList 为 电商推荐 (例子上 电影 和 歌曲 也可用)。
让我们来分解一下:
- 第 1–3 行包含从库中导入的内容
- 第 8 行正在获取 Coveo 数据集。提示:您可以在这里用您的数据集交换您的私有数据。
- 第 12–13 行从库中实例化一个基线模型,并用训练分割对其进行训练。提示:您可以训练自己的模型(或者带一个预训练的模型)并在此处替换基线。只要你的模型围绕着 RecModel 抽象,下游的一切都会正常工作。
- 第 17–20 行实例化 RecList ,在这种情况下,这是一个为该数据集和用例设计的现成列表。正如所料,该类将目标数据集和要测试的模型作为输入。提示:您可以在这里指定您自己的测试集合。
- 22 线运行行为测试。
就是这样!挑选和组合像乐高积木一样的抽象概念——无论是重复使用组件还是自己创造新的积木——都有无限的可能性:
- 挑选一个用例(类似的产品,互补的,等等。);
- 挑选一个数据集;
- 训练一个模型;
- 建造/修改/选择一个隐士:

Reclist 的逻辑流程。在每一步中,你可以选择一个现成的组件,从头开始创建自己的组件,或者修改现有的组件。【图片由作者提供】
当您运行任何 RecList 时,库会将结果转储到一个版本化的本地文件夹中;还提供了一个小型 web 应用程序来可视化和比较运行情况:

一个小烧瓶应用程序使结果更易于阅读:查看repo了解详情。[图片由作者提供]
虽然我们开发RecList 是出于将 RSs 扩展到许多行业的数百个组织所涉及的非常实际的需要,但我们也相信这种方法可以广泛应用于错误分析和新研究模型的全面评估。特别是,我们鼓励您思考两个主要的使用案例:
- 作为研究的实验工具:在开发一个新模型时,你可能想将它与定量的和行为的基线进行比较,以更好地了解错误模式及其相对优势和劣势。Reclist 允许你轻松地做到这一点,并带有现成的流行研究数据集的连接器;
- 作为生产的 CI/CD 检查:在训练一个模型之后,您通常在一个测试集上运行一个定量的基准,以确保在部署之前达到一定的准确性水平。使用 RecList,您还可以用行为测试来补充您的管道,并决定当结果与预期不符时,应该发出哪个标志/做什么。
RecList 是一个免费的库,我们希望在今年对其进行扩展和改进:我们的 alpha 版本已经支持常见用例的即插即用测试,但我们正在积极寻找反馈、采用和新的贡献者(请参见最后的帮助部分!);这也意味着:在我们迭代的时候,API 仍然很不稳定,但是我们有希望很快发布一个测试版。
我们认为,随着我们对推荐系统的理解的提高,行为测试需要不断发展,它们的局限性、能力和范围也会发生变化。
通过开源 RecList,我们希望帮助该领域超越“排行榜追逐”,并为从业者提供更好的分析、调试和决策工具。
如果你喜欢这个帖子,请考虑帮忙!怎么会?一些想法,按努力的升序排列:
- *1 分钟:*给 Github 上的隐士加一颗星支持我们!
- *1 小时:*阅读论文,自述,运行教程:你能给我们什么反馈?
- *1 周:*与您的团队讨论:您将如何在您的公司使用它?您可以用它运行什么 POC?
- 更多:积极为项目做贡献:取得联系!
虽然我们非常精通产业与学术界的合作,但《隐士是我们第一部来源于社区的学术作品。阿尔法版本是由五个人带着爱带给你的——T4·帕特里克、费德里科、克洛伊、布莱恩和我自己——在五个城市——蒙特利尔、米兰、旧金山、首尔、纽约——跨越四个时区。在作者之间总共 5(5–1)/2 =10个可能的面对面匹配中,只有 1 个实际发生过(如果你能猜出是哪一个,你将赢得一个免费版本的 RecList!).
虽然现在说这种模式对我们团队的未来会有多成功还为时过早,但我们的“扩展思维”开发到目前为止已经超出了我们的预期。
我们要感谢 Andrea Polonioli、Ciro Greco 和 Jean-Francis Roy(以及其他许多人)对这个项目的一贯支持。此外,感谢 Matthew Tamsett、Jonathan Davies、Kevin No 对本作品初稿的详细反馈。
最后但同样重要的是,感谢芯片,因为它创造了惊人的不和谐,启动了隐士社区。
原文:https://towardsdatascience.com/nearest-neighbor-missing-visuals-revealed-c2b3

KNN 视觉效果(图片由作者提供)
无监督的 K-最近邻(KNN)算法可能是最简单的机器学习算法。然而,简单的算法并不意味着分析结果也同样简单。根据我的研究,并没有很多分析 KNN 算法结果的方法。在本文中,我将向您展示如何分析和理解无监督 KNN 算法的结果。
我将使用汽车数据集。这里显示了一个样本数据集。这些数据包括汽车的构造、不同的技术特征,如燃料类型、长度、宽度、车门数量等。以及汽车的价格。该数据大约有 25 个字段,其中大约有 15 个数值字段。

汽车样本数据(图片由作者提供)。
数据分为两部分——训练和评分。训练数据集用于训练 KNN 模型。然后,使用该模型来寻找评分数据集中数据的最近邻。
这里的图片将有助于理解 KNN 的结果。
可视化最近邻居的一个优雅方法是使用网络图。评分数据集中的数据是一个中心节点,并与其最近的邻居相关联。

网络图(图片由作者提供)
此外,可以添加悬停工具提示来查看节点背后的细节。这样可以很好地理解分数数据中特定记录的最近邻。

悬停工具提示(作者图片)
由于网络图基于图形分析,您还可以分析邻居之间的连接方式。这有助于找到一个社区的邻居以及孤立的邻居。

最近邻输出的图形分析(图片由作者提供)
将最近邻算法与图形分析相结合是了解整体结果的强大工具。
在现实生活中,一个人可以有好邻居,也可以有坏邻居!同样,KNN 可以识别最近邻,但是,这并不意味着最近邻总是相似或相容的。
我们可以使用 PCA 和聚光灯技术来验证这种“邻域兼容性”,如下所示。我们对所有训练和评分数据使用 PCA 来将数据减少到二维。降维数据用散点图绘制。然后,我们可以使用聚光灯技术来突出显示评分数据集中特定记录的最近邻。关于聚光灯技术的更多信息,请参见我的文章这里

分数记录 2 的最近邻分析(图片由作者提供)
上面显示的是得分记录 2 的所有最近邻。你会观察到所有的点都彼此相对靠近。这意味着最近的邻居彼此相对兼容,因为它们具有或多或少相同的特征。更进一步,检查显示大部分的车都是尼桑,这也证明了我们的观察。
现在让我们对得分记录 6 进行同样的分析,如下所示。

分数记录 6 的最近邻分析(图片由作者提供)
你会发现邻居彼此相距较远。这意味着最近的邻居彼此不太兼容。观察圆点后面的汽车,我们可以看到它是奥迪、沃尔沃和大众旅行车的混合体。因此,即使这些点被归类为最近邻,这些车也是互不相同的。
概括起来
- 网络图和图形分析是可视化 KNN 无监督算法结果的绝佳方式
- 使用主成分分析和聚焦技术,可以分析最近邻的兼容性
你可以访问我的网站,使 KNN 分析以及其他没有编码的分析:【https://experiencedatascience.com】T2
这是我的 Youtube 频道上的一步一步的教程和演示。您将能够使用零编码根据您的数据定制演示。
Youtube 视频链接(作者图片)
请订阅,以便在我发布新故事时随时获得通知。
https://pranay-dave9.medium.com/subscribe
你也可以通过我的推荐链接加入 Medium 。谢谢你。
https://pranay-dave9.medium.com/membership
数据来自https://archive.ics.uci.edu/ml/datasets/automobile。
Dua d .和 Graff c .(2019 年)。UCI 机器学习知识库[http://archive . ics . UCI . edu/ml]。加州欧文:加州大学信息与计算机科学学院。
原文:https://towardsdatascience.com/nearest-neighbors-is-the-foundation-for-knn-optics-dbscan-hdbscan-smote-eeb10ea956e9

Frogly Neighbors,(蛙趣屋居民),Alexas_Fotos, Pixabay 。
有各种算法是建立在其他算法的基础上的。下面的文章关注最近邻(NN ),其他模型在其概念或代码的基础上利用和创新了它。
让我们从基础模型开始,即在 Scikit 中实现的无监督最近邻。此算法用于判断训练数据中的实例是否与您要测量的点 k 最近。它是用于计算神经网络的不同算法的接口,如 BallTree、KDTree。如下图所示,它继承了 KNeighborsMixin、RadiusNeighborsMixin、NeighborsBase。

邻居分类器类实现。

最近邻的“算法”参数。
继续使用每个数据科学家都会遇到的用于分类的 K 个最近邻,并使用上述方法,根据其 K 个近邻来确定一个未见过的样本是否属于某个类别。
如下面的代码所示,KNN 继承了相同的基类“KNeighborsMixin,&radiusboresmixin”,但是顺序不同;在文档中,它在内部使用了 fit()的 NeighborsMixin 和 predict()的 neighborsmixin 实现。

KNeighborsClassifier 类的实现,KNN,Scikit-learn。

KNN 的“算法”参数。
继续讨论 DBSCAN ,这是一种基于密度的聚类算法。简单来说,DBSCAN 寻找高密度样本的集群。我们可以在这里找到 DBSCAN 的代码,在文档中已经可以看到 DBSCAN 的内部算法指向了 NN 模块。
深入挖掘,我们看到 DBSCAN 的代码在内部使用了‘nearest neighbors’模块,如下面快照中的 DBSCAN 的 fit()函数代码和文档所示。

最近邻用法,DBSCAN,Scikit-learn。

DBSCAN 的“算法”参数。
Optics 与 DBSCAN 密切相关,同样,它发现高密度区域并从中扩展集群,但是,它使用基于半径的集群层次结构,Scikit 建议在更大的数据集上使用它。这种光学实现在所有点上使用 k-最近邻搜索
在报告内部,我们看到 Optics 的代码在内部依赖于“最近邻居”模块及其算法,如 Optics compute_optics_graph()函数代码和下面的文档快照所示。

最近邻用法,compute_optics_graph(),optics,Scikit-learn。

光学“算法”参数。
HDBSCAN 通过将 DBSCAN 转换为层次聚类算法来扩展它,然后在其上使用平面聚类提取。
我们可以在 API 引用和代码中看到一些指向 KNN 的线索

类中的 K 参数
深入到代码中我们可以看到,在下面的代码中,函数 _rsl_prims_balltree 实际上是基于 balltree 的,而 _rsl_prims_kdtree 是基于 kdtree 的,它们是 Scikit-learn 中用来计算 NN 的算法。

KDTree,prims_balltree,HDBSCAN

BallTree,prims_balltree,HDBSCAN
合成少数过采样算法(SMOTE)的不平衡学习实现,它不直接使用 Scikit-learn NN 类实现,但使用 NN 概念。我们可以浏览一下代码和文档,立即发现 generate_samples() 函数中的 k_neighbors 参数。

k_neighbors 参数,SMOTE,不平衡-学习。
最近邻算法,由 Evelyn Fix , Joseph Hodges et 开发。艾尔。在 1951 年,后来由 Thomas Cover 在 1967 年扩展,对上述所有实现都至关重要。我们还可以看到,Scikit-learn 的各种算法实现从头到尾都在重用这些代码,而且其他各种包也使用了 NN 算法,以便为我们带来更高级的模型。
我真诚地希望这篇综述能让你理解所有这些算法之间的联系和关系,希望能帮助你用众多的算法方法解决更多的问题。
[1]修复,伊芙琳;约瑟夫·霍奇斯(1951)。歧视性分析。非参数判别:一致性性质 (PDF)(报告)。德克萨斯州伦道夫机场美国空军航空医学院。
[2] 盖,托马斯·m .;彼得·哈特(1967)。“最近邻模式分类” (PDF)。 IEEE 汇刊于
Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是 ML & DL 纲要和StateOfMLOps.com的作者,对 AIOps & MLOps 领域很感兴趣。他是 Justt.ai 的数据科学高级总监。
原文:https://towardsdatascience.com/neat-time-series-aggregations-with-core-pyspark-4aa

https://media . springer nature . com/lw 660/springer-CMS/rest/v1/img//v3/4 by 3?as=jpg
有吨的时间序列指标,其中许多指标有相同的预处理步骤和用例。为了限制冗余,我将关注三个不同用例的简洁指标:
- 使用滚动 Z 值检测异常值
- 滚动相关矩阵
- 指数移动平均线趋势检测
在第一部分中,给出了滚动窗口和采样周期的定义。这些公式为如何开始创建这些移动窗口度量提供了有用的上下文。也可以随意跳到情节和代码:)
正如所有与数据有关的事情一样,有不止一种方式来烘焙您的数据*。这里有一点关于我的背景和编程风格:我来自一个使用大量 SQL 的工作环境,我的聚合策略反映了这一点。因此,我没有使用 PySpark 表达式或内置库,也就是说,如果没有它们我也能完成任务。*
本文中的代码在本地 PySpark 环境中进行了测试,并连接到 S3 数据源。这里是一篇关于如何在 Windows 10 上设置这个测试环境的简短教程文章。
所有的方程式、图表和图形都是我创造的。所有的绘图代码都可以在这里找到。我在所有的情节中使用了 Plotly。
时间序列指标通常受某个时间窗口的限制。可以有不同的粒度或采样周期来计算度量,即 10 分钟、1 小时、1 天等。我将使用的描述本文剩余部分中的度量的语法显示在等式(0)中。

P: (1xM)矩阵
K:采样周期(10 分钟、1 小时等)
M:回顾窗口的大小
N:跨时间序列的当前整数索引
n:跨时间序列的整数索引
t:时间段内的整数索引
例如,如果采样周期(K)为 10 分钟:
t=0,n=1,1 * K = 10 分钟
t=1,n=2,2 * K = 20 分钟
t=2,n=3,3 * K = 30 分钟

https://gist . github . com/freedomtowin/6 f1 ff 6 CBF 2 a 76d 08d 8 CB 90685 EC 9075 f
时间块 t 代表一个大小为 m 的时间窗口。在聚合每个时间窗口后,时间索引 N 递增 1。度量在 t 上聚合,N 跟踪每个窗口的全局时间索引。
滚动 z 分数阈值可用于检测时间序列中的大跳跃或间隙。这有许多潜在的应用,例如,为大的异常值创建警报系统。
z 分数或标准分数表示平均值的标准偏差数。如果你是统计学新手,你可以在这里阅读更多关于这个指标的信息。这个指标可以被认为是移动平均线附近的一个置信区间。
将需要简单移动平均和简单移动标准差来创建 z 得分,分别如下面的等式(1)和(2)所示。

上面的公式显示了这两个指标是如何在 M-1 大小的滚动窗口 t 的时间步长 N 上定义的。最后一个时间步长 M 从聚合时间窗口中排除,因为目标是将当前时间序列值与前一个窗口的平均值和标准差进行比较。如果将当前时间步长包括在内,标准偏差可能会大大增加,该指标将无法检测时间序列中的大变化。
在我们执行这些滚动窗口计算之后,可以计算 z 得分上限和下限,分别如等式(3)和(4)所示。

在这些等式中,z 得分上限和下限分别设置为平均值上下的两个标准差。假设正态分布,经验法则表明我们期望 99.7%的数据在标准偏差范围内。
下图显示了 ATVI 每小时股价的 10 小时移动平均线的 z 值上限和下限。

https://gist . github . com/freedomtowin/6 f1 ff 6 CBF 2 a 76d 08d 8 CB 90685 EC 9075 f
阴影绿色区域表示移动平均线周围的置信区间,黄线表示时间序列,绿线表示时间序列的移动平均线。在某一点上,在置信区间之外有一个急剧的下降,这表明有一个大的异常值。标准偏差随后在 N=130 左右大幅增加。在时间序列跨越置信区间的点上,变化不是很显著。对于这个特定的时间序列,可以使用更大的 z 分数阈值。
注意:数据集经过预处理,包含工作日上午 9 点到下午 4 点之间的每小时数据。为了便于绘图,这些值是相对于指数而不是时间绘制的。这消除了图中的一些不连续性。
首先,创建一个分级索引来执行自连接,以便为每个时间序列(即股票符号)获得一个按时间排序的历史窗口。然后,对于视图(a)中的每个值,在视图(b)中聚合移动平均值和移动标准偏差。从这些度量中,可以计算出 z 得分阈值的上限和下限。
滚动相关矩阵有助于将相关的时间序列组合在一起,帮助找到不同的、不相关的时间序列,或者检测相关模式的变化。我对你的挑战是在不使用内置 PySpark 函数的情况下创建这个;)
归一化协方差,或皮尔逊相关系数,描述了两个变量之间的相关性。该指标限制在-1 和 1 之间,这是在时间序列对之间比较该指标时的一个有用属性。我们可以通过滚动时间窗口计算这种相关性。
滚动相关性也可以用指数移动平均函数来平滑。平滑滚动相关的另一个术语是“实现的相关”

其中, r 是我们的时间序列数据集中 I 列和 j 列的相关性,μ是简单移动平均值,σ是简单移动标准差。
我将使用我可靠的股票数据集来绘制 DoorDash 的小时股价与其他股票(如 ATVI、DIS、NVDA 和 WMT)的滚动相关性。

https://gist . github . com/freedomtowin/6 f1 ff 6 CBF 2 a 76d 08d 8 CB 90685 EC 9075 f
与其他时间序列相比,DASH 和 NVDA 之间的相关性在更长的时间段内似乎是一致的。同时持有这两只股票可能会增加投资组合的风险。
注意:在上图中,当任一时间序列缺少当前时间步长 n 的数据时,就会出现缺失数据点。例如,DIS 缺少 2021 年 8 月至 2021 年 11 月之间的数据。但是,关联窗口将跳过空值,过去 14 小时没有丢失的值将用于聚合。
第一步是计算数据透视表,按时间分区,按时间序列 id、股票代码分组。该数据透视表采用时间序列的平均值, close ,但是由于数据集被预处理为每小时一个值,因此最小值、最大值、第一个值或最后一个值也可以作为聚合。
对于每对时间序列,在计算滚动相关性之前,将删除任一时间序列中具有空值的行
下一步是创建不重复的时间序列对或组合。从每个组合中删除具有空值的行。最后,我们需要计算每对时间序列之间的相关性。幸运的是,PySpark 中有一个内置函数可以计算两列之间的相关性。滚动相关性然后被左连接回数据透视表。
差分指数移动平均线可用于检测时间序列的速度或趋势。这种方法可以在差分时间序列上第二次应用,以检测加速度*,或趋势的变化率。*
指数移动平均线(EMA)可以看作是一个过滤器,它更重视聚合窗口内的最新值。EMA 有两个主要参数,即 alpha 衰减率和窗口大小。时间窗口越大或者 alpha 越低,均线移动的越慢。换句话说,移动平均将比实际时间序列落后更多。
本节使用的趋势检测方法通常称为 MACD 。然而,我将用新的,在我看来更容易理解的术语来解释这个算法。
通常,α通常被选择为等于 2/(1+M),其中 M 是窗口大小。α的这个值对应于平均加权影响,或“质心”,对应于简单移动平均(SMA)的回顾窗口的中心。换句话说,对于高度自相关的信号(比如股票价格),均线会落后于实际价格大约一半的时间。详情请见Robert Nau 的预测笔记。
据我所知和谷歌搜索,如果不使用用户定义的函数或 UDF,在 PySpark 中实现递归方法(如 EMAs)是不可能的。幸运的是,有一个扩展的级数表示,可以用来计算核心 PySpark 中的 EMAs。等式(6)以扩展的符号显示了指数移动平均公式(EMA)。

通过取快速移动(时间窗较短)和慢速移动(时间窗较长)的均线之差,可以估算出趋势*。直观上,这可以被认为是最近价格和以前价格之间的斜率或离散导数。这些均线之间的差异可以称为趋势的速度。*

趋势变化的速度也可以用 1)T4 速度(T5)和 2)均线(T8)来估计。

信号和速度之差可以认为是趋势的加速度。速度和信号之间的收敛代表趋势方向的反转。这种背离代表着一种越来越强的趋势。

https://gist . github . com/freedomtowin/6 f1 ff 6 CBF 2 a 76d 08d 8 CB 90685 EC 9075 f
顶部的图显示了时间序列(黄色)、慢速均线(蓝色)和快速均线(红色)。底部曲线显示了加速度*(直方图)、趋势速度(红色)和信号(蓝色)。该图显示了短时间间隔内趋势的一致性。简单地说,可以设置加速度的某个安全阈值来检测强烈的上升和下降。*
注意:这个图看起来有点起伏,因为我选择 K=3 作为采样周期。
创建了一个单独的函数来计算大小为 m 的特定窗口的 EMA。在该函数中,创建了一个分级指数来执行自连接,以便为每个分区(即股票符号)获得按时间排序的历史窗口。历史窗口的指数和当前指数之间的差异用于为 EMA 公式的扩展序列表示创建 alpha 权重,如等式 8 所示。最后,对于视图(a)中的每个值,汇总视图(b)中的 EMA。
我们可以用均线函数来计算快速移动的均线,慢速移动的均线,快慢均线之差(速度),以及速度的均线(信号)。
简而言之,本文展示了我如何在 PySpark 和 SQL 中聚合时间序列。我知道时间序列窗口和方程的正式定义使得这篇文章更难阅读。不过我喜欢彻底:)我也,大概,本来可以把这篇文章分成三篇。不过,希望 PySpark 和 Plotly 代码对一些新的数据科学家/工程师有用。
以下是一些您可以尝试的数据挑战:
- 在异常值检测算法中,使用指数移动平均代替简单移动平均。
- 编写自己的相关函数,而不是使用内置的 PySpark 相关函数。探索实施类似的指标,例如,协整%20of%20time%20series%20variables.&text=Formally%2C%20if%20(X%2CY,Y%2C%20and%20Z%20are%20cointegrated.)。
- 使用指数移动平均值创建平滑移动窗口相关矩阵。
- 针对 M1、M2 和 M3 的多个参数,描述趋势检测方法的有效性。
这是所有的乡亲。
到此这篇rmsprop算法中文名(prims算法)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/22338.html