admin管理员组

文章数量:1645531

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

如何在 2022 年建立一个机器学习演示

原文:https://towardsdatascience/how-to-build-a-machine-learning-demo-in-2022-5bda6cd99743

了解为什么你应该在 2022 年为你的机器学习模型制作演示,以及如何以适合你的需求、技能和受众的方式来做这件事。

Artturi Jalli 在 Unsplash 上拍摄的照片

为什么演示现在至关重要

机器学习模型的交互式演示越来越受欢迎。毕竟,就像一幅画胜过千言万语一样,没有什么比让别人直接与你的模型互动来产生兴趣更好的了。如果你有兴趣跟上最近的趋势,或者正在为你自己的演示寻找灵感,我强烈推荐关注 @ak92501 twitter 账户。

其中的一个例子是一个模特将肖像照片转换成网飞神秘秀所用风格的插图的演示。演示的易用性和用不同的输入照片快速测试模型的能力是这个项目如此迅速地变得如此受欢迎的部分原因。

您可能希望构建交互式演示的原因有很多:

  • 在开发过程中让同事测试模型
  • 原型,以寻求对新想法的投资
  • 传播研究成果,可能作为研究论文的附录
  • 建立一个作品集

无论你的理由是什么,这篇文章都将提供一些提示和建议来充分利用这个机会。

如何在 2022 年建立一个互动演示

在 2022 年,有多种方法可以为你的机器学习模型构建一个交互式演示。你选择哪一个取决于:

  • 你的目标受众
  • 你的软件工程技能
  • 你的货币预算
  • 你的时间预算
  • 您的需求(交互性、灵活性)

作者提供的图像(徽标是其各自所有者的财产)

本文将介绍三种方法:公共笔记本共享、全栈和应用程序库。

TLDR —我应该使用哪种方法?

本文的其余部分将详细介绍关于这三种方法您需要了解的内容。如果你想快速回答,下面的表格应该会有帮助!

2022 年机器学习演示构建不同方法的比较。作者图片

经验法则:

  • 在代码可见性有用而交互性不重要的情况下,与技术受众分享?使用 Google Colab(或同等工具)
  • 演示成为成熟产品的可能性大吗?从长远来看,采用全栈方法可能会节省您的时间
  • 如果以上都不是,那就用应用程序库和拥抱脸空间托管吧

公共笔记本共享(Google Colab)

Jupyter notebooks(以及之前的 iPython)在巩固 Python 作为机器学习的领先编程语言方面发挥了重要作用。虽然不是没有缺点,但通过支持交互式数据探索和迭代开发,笔记本迅速成为机器学习爱好者的重要工具。但是,如果远程访问需要托管,设置 Jupyter 环境可能会很困难,而且可能会很昂贵。

Google Colab 是这一领域的重要颠覆者——它通过提供完全托管的笔记本体验,无需任何设置或维护,实现了机器学习的大众化,并提供了对昂贵计算资源的免费访问。

Colab 使得共享笔记本并让其他人与之交互变得轻而易举,即使这需要 GPU 加速。例如, fastai 文档甚至最近的 fastai 书籍都可以作为 Colab 笔记本使用,允许人们在浏览材料时运行和修改代码。

大多数笔记本都可以在 Colab 上运行,不需要太多的工作,一些小部件可以让用户输入他们自己的数据。如果笔记本是在公共 Github repo 上进行版本控制的,那么只需共享一个如下格式的链接:

[https://colab.research.google/github/$ACCOUNT/$REPO/blob/$BRANCH/$PATH_TO_NOTEBOOK](https://colab.research.google/github/$ACCOUNT/$REPO/blob/$BRANCH/$PATH_TO_NOTEBOOK)

其中$ACCOUNT是 Github 账户,$REPO是存储库,$BRANCH是分支,$PATH_TO_NOTEBOOKipynb文件的完整路径。

如果你有兴趣与大众分享你的作品,Colab 笔记本不是最好的选择。然而,它们是非常强大的工具,可以轻松地将想法传达给技术同行。以至于几乎所有机器学习的新发展都倾向于将配套的 Colab 笔记本作为标准。作为一个例子,我探索了一种全新的基于补丁的自我监督方法,使用由我自己提供的输入数据(在这种情况下,是我的猫 Jasmine 的照片)。它让我对这项新的研究有了更好的理解,而且对我来说是免费的。

我的猫 Jasmine 的新自我监督方法的 Google Colab 截图,笔记本位于https://Colab . research . Google . com/github/Facebook research/Mae/blob/main/demo/Mae _ visualize . ipynb

总的来说,交互性非常有限。解决这个问题的一个可能方法是使用一个库,比如 Gradio ,它允许直接在笔记本上创建基本的用户界面。Gradio 将在应用程序库部分详细介绍。

为了完整起见,我应该提到亚马逊网络服务宣布 SageMaker Studio Lab ,它类似于 Google Colab,具有一些优势,如持久存储。我还没有机会探索它,但理论上它可以以类似于 Google Colab 的方式使用。

Colab 笔记本的优点:

  • 免费使用 GPU 计算
  • 与 Git 紧密集成以促进共享
  • 完全受管,无需设置或维护

Colab 笔记本的缺点:

  • 仅限于技术观众,不适合外行观众
  • 默认情况下交互性有限,可以使用 Gradio 等库来改进
  • GPU 可用性时好时坏
  • 需要一些外部存储(例如存储模型人工制品)

全栈

这种创建交互式演示的方法要求最高,但从长远来看,这种方法可能会有回报。它是全栈式的,因为它涉及两个组件:

  • 一个后端负责将模型作为 REST API 进行加载和服务
  • 一个前端提供 UI 元素与后端交互

显而易见的缺点是,它需要对这两个组件都感到舒适,或者至少愿意学习。然而,这种方法是最灵活的,可以用作部署成熟生产环境的垫脚石,而无需从头开始

在深入下面的后端和前端组件之前,我们先来看看全栈方法的优缺点。

全栈模式的优势:

  • 根据需要灵活调整
  • 可以包括其他功能,如身份验证
  • 可用作生产部署的基础,无需从头开始
  • 可以针对性能进行优化

全栈方法的缺点:

  • 需要后端和前端开发知识
  • 耗时的开发和部署
  • 需要基础设施进行部署

后端

对后端开发的不同技术栈的详尽讨论超出了本文的范围。然而,鉴于大多数从事机器学习应用的机器学习工程师至少熟悉 Python,我们将重点关注基于 Python 的后端解决方案。

后端开发的不同工具:通用 web 框架、服务库和特定于框架的服务库。图片由作者提供。

后端的目标是充当模型的包装器,以便可以通过来自前端的HTTP请求来查询它,这被称为服务于的模型。为了做到这一点,人们通常会使用 web 框架。很长一段时间以来, Flask 是基于 Python 的 web 框架的标准,并且确实仍然非常流行。然而, FastaAPI 正迅速成为新宠,这要归功于令人印象深刻的性能和对异步操作的本机支持。本文是理解如何使用 FastAPI 部署简单模型的一个很好的起点,而本教程提供了一个完整的概述,介绍了使用 GPU 支持服务 PyTorch 模型所需的所有步骤。

使用 FastAPI 这样的通用框架需要编写大量样板代码,只是为了让您的 API 端点启动并运行。如果为一个演示部署一个模型是您唯一感兴趣的事情,并且您不介意失去一些灵活性,那么您可能想要使用一个专门的服务框架。一个例子是 BentoML ,它将允许您为您的模型获得一个优化的服务端点,并且比一般的 web 框架运行得更快,开销更少。特定于框架的服务解决方案,如 Tensorflow Serving 和 TorchServe 通常提供优化的性能,但只能分别用于服务使用 Tensorflow 或 PyTorch 训练的模型。

前端

前端负责提供一个用户界面,与服务于模型的后端进行交互。在大多数情况下,它将是一种输入数据(如用于自然语言处理的文本,或用于计算机视觉的图像)和显示模型输出的手段。将这个用户界面放在 web 浏览器中可以让您的演示不需要额外的依赖就可以访问。

前端开发是您可能不得不放弃 Python 的地方。虽然像 Skulpt 和 Brython 这样的库支持在浏览器中使用 Python,但我强烈推荐使用 Javascript,因为非常大的社区意味着教程很多,如果需要,寻求帮助会容易得多。用 Javascript 构建用户界面的两个最流行的库是React(ML 演示的教程)和vue . js(ML 演示的教程)。使用一个通用的框架将会给你定制用户界面的灵活性。

部署

一旦您的后端和前端组件准备就绪,就必须将它们部署到公共可访问的地方。再说一遍,灵活性是这个游戏的名字。像 Heroku 这样的服务为应用程序的部署提供了托管(和免费,取决于使用)体验。Amazon Web Services、Azure 或 Google Cloud 等公共云提供商可能是一个选择,一个小的演示可能很适合他们的免费层产品。

无论您决定走哪条路,我建议您考虑使用 Docker 将您的演示容器化。通过这种方式,相同的容器映像被用于开发期间的本地测试和在您的托管提供商上的部署,有助于避免由于环境变化而带来的不良后果。

应用程序库

那么,如果您想要的东西几乎和全栈方法一样灵活,但是没有开发需求,该怎么办呢?你很幸运,因为在过去的几年里,Python 库的出现使得只用几行代码就可以创建令人印象深刻的交互式演示。在本文中,我们将关注两个最有前途的库: Gradio 和 Streamlit 。下面将探讨这两者之间的显著差异,但高层次的想法是相同的:消除全栈部分中概述的大部分痛苦的后端和前端工作,尽管代价是一些灵活性。

格拉迪欧

Gradio 已经在 Google Colab 部分提到过,因为它可以用来为笔记本添加交互元素。如库的入门页面所示,构建一个接口只需要几行 Python 代码。

import gradio as grdef greet(name):
  return "Hello " + name + "!!"iface = gr.Interface(fn=greet, inputs="text", outputs="text")
iface.launch()

如果您在笔记本电脑上工作,用户界面会立即显示出来。如果从脚本运行,浏览器窗口将打开并指向http://localhost:7860。之所以这样做,是因为 Gradio 本质上是在后台为您运行一个 API 服务器,从而负责全栈一节中讨论的大部分工作。它曾经利用 Flask 来创建本地 API 服务器,但是最近转向使用 FastAPI 。

在上面的代码片段中,greet函数将被替换为您的模型的推理代码。注意,inputsoutputs都被设置为文本,所以 UI 将自动默认为处理基于文本的任务所必需的小部件。类似的小部件存在于最常见的用例中,包括计算机视觉和音频处理。此外,Gradio 还提供了非常方便的功能,例如,如果显示的输出是意外的(例如,如果处理失败),可以截图或让用户进行标记。

如果你想与世界分享你的用户界面,在launch方法中使用share=True参数将为你提供一个指向你的演示的gradio.app URL。请注意,这只是将请求转发到您的机器,因此只有当您的脚本或笔记本正在运行时,它才会起作用,并且链接会在 72 小时后自动过期。请参阅下面关于拥抱面部空间托管的部分,以解决这些限制。

由几行代码生成的文本输入和输出的默认 Gradio UI。作者截图。

Gradio 专注于为机器学习模型构建用户界面,这意味着它将为您处理几乎所有事情,并且开箱即用,只需很少的配置。

格拉迪欧的优点:

  • 开箱即可快速轻松设置
  • 直接在笔记本上运行
  • 绝对不需要网络开发知识
  • 应用程序易于共享
  • 内置 UI 元素的良好选择
  • 截图或输出标记等功能对于演示来说非常方便

梯度的缺点:

  • 对用户界面布局的有限控制
  • 不适合复杂的应用程序(例如状态管理、缓存)

细流

Streamlit 是一个构建和共享数据应用的库。他们的策展画廊展示了数据可视化应用、仪表盘、互动教程,当然还有机器学习演示的例子。

Streamlit 可用于构建复杂的应用程序,与 Gradio 相比,其代价是进入门槛更高。例如,它不能直接在笔记本上运行—命令行工具用于从脚本启动应用程序。采用实时重新加载方法,对代码所做的更改会自动反映在浏览器中运行的应用程序中,从而允许快速迭代。

Streamlit 附带了一些高级功能,如缓存,这有助于防止长时间运行的任务(例如下载和准备用于推理的模型)不必要地运行多次,以及构建有状态应用程序的能力(在用户会话期间保留信息)。这些功能使用例超越了简单的机器学习演示。在 UI 方面,该库有大量内置的小部件,并可以通过第三方组件的支持进一步扩展。

Streamlit 提供名为 Streamlit Cloud 的应用共享托管服务。在撰写本文时,可以使用 Streamlit Cloud 和免费计划部署一个私有(需要认证)和无限的公共应用。或者,Streamlit 应用程序很容易容器化,并使用 Docker 进行部署。

如果你对部署 Gradio 和 Streamlit 应用程序都感兴趣,拥抱面部空间可能是一个不错的选择。

细流的优点:

  • 快速设置
  • 缓存和状态管理等高级功能允许构建复杂的应用程序
  • 大量内置 UI 小部件可供选择
  • 高度可定制的 UI 布局
  • 通过支持自定义第三方组件进行扩展

Streamlit 的缺点:

  • 共享应用程序不像使用 Gradio 那么简单
  • 复杂的应用程序需要对高级 web 开发概念有所了解
  • 与笔记本不兼容
  • 缺少 ML 演示的一些基本的内置特性(例如,意外输入/输出的标记)

拥抱脸空间革命

当拥抱脸将空间添加到他们的 ML 产品和工具生态系统中时,部署使用 Gradio 或 Streamlit 开发的应用变得更加容易。空间类似于 Github 页面——代码被提交给存储库,应用程序被自动构建和服务。创建空间时,您可以在 Streamlit、Gradio 和 Static(或多或少复制 Github Pages 的静态网站托管功能)之间进行选择。然后,空间会自动设置为容纳您选择的库。版本控制和用户喜欢空间的能力等有用功能使其成为部署公共机器学习演示的绝佳体验。

类似于谷歌 Colab 如何使训练最先进的机器学习模型所需的计算资源的访问民主化,拥抱面部空间允许任何人主持演示供世界检验。这意味着整个机器学习工作流,从模型训练到交互式演示的部署,现在都可以免费进行,而且几乎完全是用 Python 编写的。

✨如果你喜欢这个内容,请花时间到 在媒体上关注我,并查看我在平台上的其他帖子。我的大部分内容,包括这个故事,也发表在我的个人网站( nicjac.dev ) ✨上

如何用 PyTorch 和 GPU 构建用于 NLP 任务的神经网络

原文:https://towardsdatascience/how-to-build-a-neural-network-for-nlp-tasks-with-pytorch-and-gpu-da542591dbe1

使用 Google Colab 对文本数据建模的框架

斯蒂夫·约翰森摄:https://www . pexels . com/photo/blue-red-and-black-abstract-painting-2130475/

T 他的文章旨在作为一个框架,使用 Python、神经网络和 GPU 来解决自然语言处理(NLP)问题。虽然理解这里的一切需要很高的数学水平,但我写这篇文章的目的是让一个完全的初学者或经验丰富的老手从中有所收获。我希望一个初学者带走解决 NLP 问题的一般框架,而一个老手可能使用它作为在 PyTorch 中将模型推送到 GPU 的参考。

我们开始吧!

NLP:数据和预处理

尽管数据清理不是建模过程中最令人兴奋的方面,但它无疑是最重要的。数据清理和预处理指的是将原始文本数据结构化和格式化成我们可以建模的东西。对这一过程的关注可以成就或破坏后续模型的统计推断。我们将使用来自 NLTK(用于 NLP 的 Python 库)语料库模块的数据,该模块包括电影评论及其真相分类(无论评论是正面还是负面)。让我们首先导入我们将需要的模块并下载必要的数据…

该项目的相关进口报表

在 NLP 中有很多被抛弃的术语——让我们介绍一些更相关的术语…

  • 文集文档的集合
  • 文档 —来自语料库的文本主体
  • 令牌文档中的单词列表
  • 词汇 —词汇

用粗笔画,所有包含#ElonMusk 的 tweets 就是一个语料库的例子。包含#ElonMusk 的所有 tweet 集合中的每个 tweet 都是一个文档。因此,每个文档中的每个单词都是一个令牌。这个环境中的词汇属于社交词汇;也就是使用#ElonMusk 时在社交语境中使用的词汇。

为了开始 Python 中的预处理,我们将创建两个列表。第一个列表包含电影评论语料库中的每个文档。第二个列表包含基本事实,一个对应于评论是正面还是负面的值(“正面”或“负面”)。

创建文档及其各自类别的列表

让我们看一下每个列表中的单个元素,这样我们就可以更好地了解我们正在处理的数据…

文件[0]:

"plot : two teen couples go to a church party..."

这是文档列表中的众多电影评论之一。

猫[0]:

0

这是与上述电影评论相对应的类别(负面)。请注意,在代码中,我们是如何将负数(’ neg ‘)转换为 0,将正数(’ pos ')转换为 1 的——这对于我们的神经网络模型是必要的。

我们的目标是建立一个神经网络,可以学习电影评论中常用的词,这些词可以是积极的,也可以是消极的。在此之前,我们需要清理一下电影评论文本。

让我们构建一个函数来清理和预处理每个文档。

预处理和清洗改编自数据营

再一次,让我们分解一些语言学术语…

  • 令牌化 —将文档转换为令牌列表
  • 词干化——孤立词根(示教 = 示教)
  • 终止词——无信息贡献的词( the同为)

预处理功能为每个文档建立一个标记器和一个词干器。我们通过遍历列表中的每一个文档,并从删除所有标点符号和减少所有单词开始。在某些情况下,我们需要考虑不同的情况,但为了简单起见,我们将’ GREAT’ 和’ great 视为同一事物。

接下来,我们将标记器应用于文档,创建一个单词列表,在其中应用停止单词移除和词干。如果这个列表中有一个单词存在于 NLTK 预定义的停止单词列表中,我们会将其从单词列表中删除。这里的目标是开发尽可能小的单词列表,同时保持尽可能多的关于原始文档的信息。换句话说,如果我们有一长串不相关的信息,我们会给我们的模型带来不必要的噪音,让它更难学习。例如,“很可能出现在正面和负面的电影评论中。因此,在清理后的文本中包含“”和“”不会帮助我们的模型学习。

最后,我们将把剩下的单词“T42”转换成“教学”。*“-ing”*结尾是为了语法目的而存在的,但是这个词的词根意义没有改变,所以我们打算以类似的方式在所有文档中对其进行建模。再一次,我们想最小化我们的模型面临的噪音,所以它有最好的学习机会。

既然我们已经预处理了文档,我们需要开发一个文档术语矩阵,即所谓的文档术语矩阵。这听起来可能很复杂,但它实际上是一个文档矩阵和每个文档中的术语。也许更合适的名称是文档-令牌矩阵,因为每行对应一个文档,每列对应一个令牌以及它在文档中出现的次数。这意味着对于所有文档中的每一个标记,都有一个用于的列,其中矩阵中的每个值都对应于它在该文档中出现的次数。

让我们为预处理的电影评论数据建立一个文档术语矩阵。

创建文档术语矩阵并将其转换为数据框架

现在我们准备开始构建我们的语言模型。我想强调的是,我们仍然可以做大量的事情来进一步预处理这些数据。在继续构建模型之前,我们可以应用降维技术、聚类算法等等,从我们的文档(文档术语矩阵)中进一步提取有意义的信息。虽然深入探讨降维技术超出了本文的范围,但我想留下一些我创建的资源来进行降维主题的教育…

  • 主成分分析
  • 奇异值分解

事不宜迟,让我们进入有趣的部分,构建模型。

NLP:使用 GPU 在 PyTorch 中构建神经网络模型

在本节中,我们将构建神经网络来学习如何对电影评论进行分类。我们还将学习如何使用 PyTorch 和 GPU,通过并行化来提高训练速度。我推荐使用 Google Colab 和他们的免费 GPU 层来开始。如果您对直观理解并行化及其如何加速计算感兴趣,请查看下一篇文章的直觉部分。

  • 随机化奇异值分解

训练任何机器学习或人工智能的第一步是将数据分割成训练测试集。我不会在模型开发的哲学上花太多时间,我们将一起构建每个组件。如果你有兴趣更深入地理解我通常所说的建模艺术,请随意阅读以下文章…

  • 人工智能训练营
  • 机器如何学习?
  • 线性回归与神经网络

首先,我们将数据分成训练集和测试集。

为我们的分类模型创建电影评论的训练和测试集

现在我们已经准备好建立我们的分类模型了。我非常支持边做边学(在这里是编码)。然而,理解构成人工智能模型的基础数学是有好处的。让我们从代码开始,提供一些关于我们所做的数学选择的直觉。

PyTorch GPU 二进制分类模型

在这种情况下,神经网络最重要的功能选择是输出层的激活功能。摆在我们面前的任务是一个二进制分类任务,因此我们需要将一个输入分类为两个类别之一( 1 或 0,正或负)。我们选择一个 sigmoid 激活函数来做这件事。该激活函数将其输入压缩到对应于电影评论是否正面的概率中。如果概率大于 50%,我们会说电影评论是正面的,否则我们会说它是负面的。我们的神经网络将通过调整其权重来学习输入到概率的正确映射,以改进其对训练集中的基本事实的预测。一旦我们训练了我们的模型,我们将用测试集来测试它;我们这样做是为了确保我们的模型不会记忆 ( 过度拟合)训练集中的观察值。

注意,在上面的代码块中,我们包含了一个语句*。到(’ cuda’)'* 。这会将模型推送到 GPU,因此当开始训练过程时,它会自动并行化。这将显著提高培训过程的绩效。

注意:使用 GPU 时最常见的错误之一是在使用 GPU 时试图访问存储在 CPU 中的内存,反之亦然。永远记住变量在内存中的存储位置。

我们现在准备使用训练数据来训练模型。

PyTorch GPU 模型培训

在模型被充分训练后,我们需要测试它的表现如何样本外。我们将使用我们的模型尚未见过的测试数据来确定我们的模型对新数据的分类能力。这将确保我们的神经网络模型实际上是在学习一些东西,而不仅仅是过度拟合训练数据。

创建一个二元测试集来与基本事实进行比较

print(classification_report(y_hat_int, y_test))
 precision    recall  f1-score   support

           0       0.87      0.88      0.88       258
           1       0.87      0.86      0.87       242

    accuracy                           0.87       500
   macro avg       0.87      0.87      0.87       500
weighted avg       0.87      0.87      0.87       500

使用分类报告功能,我们可以比较模型的预测和实际情况,以确定模型的准确性。

上面的打印输出告诉我们,我们的模型在确定哪些电影评论是正面的,哪些是负面的方面做得非常好!

一些最后的想法…

这里我们观察到相对平衡的支持,测试集中正面和负面评论的数量。需要注意的是,在我们的训练和测试集中,我们通常希望有一个像这样平衡的类表示。如果类别不平衡,我们的模型可以学习猜测出现最多的类别,这意味着它真的没有学到任何东西。

这在异常检测问题(如洗钱和医疗保险欺诈)中很常见,因为异常的发生通常只占数据的一小部分(比如 0.01%)。因此,一个模型仅仅通过猜测出现最多的类就可以获得大约 99.99%的准确率。

当然,这是一个有趣的问题,我们可以在另一篇文章中探讨!

参考文献

https://www.kaggle/datasets/nltkdata/movie-review

Bo Pang and Lillian Lee. 2004\. A Sentimental Education: Sentiment Analysis 
Using Subjectivity Summarization Based on Minimum Cuts. In ACL.

非常感谢您的阅读!我希望你喜欢这篇文章——如果你有任何问题,请随时发表评论或联系我们:roman@quantguild

如果你有兴趣了解更多,请查看 Quant Guild !

Quant Guild 是我创办的一所在线学校,你可以在那里学习包括数学、统计学、计算机科学和数据科学在内的主题。

如果你对更多免费课程和资源感兴趣,或者想在 Quant Guild 支持我们,你可以看看我们的…

  • GitHub
  • YouTube
  • 中等
  • 帕特里翁
  • 网站
  • 领英

除此之外,下期再见!

RMP

如何为面板数据建立混合 OLS 回归模型

原文:https://towardsdatascience/how-to-build-a-pooled-ols-regression-model-for-panel-data-sets-a78358f9c2a

a 面板数据集(来源:世界发展指标数据在 CC BY 4.0 license )(图片由作者提供)

以及使用 Python 和 statsmodels 对其拟合优度的详细分析

在本文中,我们将了解面板数据数据集,我们将学习如何使用 statsmodels 和 Python 为真实世界的面板数据集构建和训练一个池化 OLS 回归模型

训练池化 OLSR 模型后,我们将学习如何使用调整后的 R 平方、对数似然、AIC 和回归的 f 检验来分析训练模型的拟合优度。我们将通过对其残差的详细分析,更深入地了解模型的拟合优度。

固定效应随机效应随机系数模型一起,混合 OLS 回归模型恰好是面板数据集的一个普遍考虑的模型。事实上,在许多面板数据集中,混合 OLSR 模型经常被用作比较其他模型性能的参考或基线模型。

本文是面板数据分析系列文章的第 1 部分:

  1. 如何为面板数据集建立混合 OLS 回归模型
  2. 了解固定效应回归模型
  3. 随机效应回归模型的实用指南

什么是面板数据?

面板数据集包含在一段时间内为一个或多个唯一可识别的个人或“事物”收集的数据。在面板数据术语中,为其收集数据的每个个体或“事物”被称为一个单元

以下是面板数据集的三个真实例子:

弗雷明汉心脏研究:弗雷明汉心脏研究是一项长期的实验,于 1948 年在马萨诸塞州的弗雷明汉市开始。每年,来自 5000 多个个体的健康数据被捕获,目标是识别心血管疾病的风险因素。在这个数据集中,单元是一个人。

格伦菲尔德投资数据 :这是一个流行的研究数据集,包含 10 家美国公司 20 年来积累的公司业绩数据。在这个数据集中,单位是一家公司。

英国家庭小组调查 :这是对英国家庭样本的调查。自 1991 年以来,每个抽样家庭的成员都被问到一系列问题,他们的回答被记录下来。随后的每一年都要对相同的家庭样本进行一次访问。这项调查的目的是分析英国发生的社会经济变化对英国家庭的影响。在这个数据集中,单元是一个家庭。

在建立面板数据集时,研究人员为每个单元测量一个或多个称为变量的参数,并以表格形式记录它们的值。变量的例子有个人的性别、种族、体重和血脂水平,或公司的员工人数、流通股和 EBITDA。请注意,一些变量可能会随着时间的推移而变化,而另一些则保持不变。

该数据收集练习的结果是一个三维数据集,其中每行代表一个独特的单元,每列包含该单元的一个测量变量的数据,z 轴包含该单元被跟踪的时间周期序列。

面板数据集来自纵向研究,其中研究人员希望研究测量变量对一个或多个响应变量的影响,如一家公司的年度投资或一个国家的 GDP 增长。

真实世界面板数据集

以下面板数据包含了七个国家从 1992 年到 2014 年的人均 GDP 年增长率。除了 GDP 增长数据,该面板还包含每个国家总资本形成的同比增长:

a 小组数据集(来源:世界发展指标数据 CC BY 4.0 license )(图片由作者提供)

在上面的数据集中,每个国家(“单位”)在相同数量的时间段内被跟踪,产生了所谓的平衡面板不平衡或不均衡面板是指在不同的时间段跟踪不同的单元。

上面的数据集也是一个固定面板(相对于**旋转面板)**的例子,因为我们在每个时间段都在跟踪同一组国家。

在本文的其余部分,我们将看看数据面板是固定的平衡的

在面板数据集中,属于一个单元的数据点集称为。通常,单位和组这两个词在关于面板数据集的讨论中可以互换使用。

回到世界银行的数据集,假设我们希望研究总资本形成的增长和一个国家的 GDP 增长之间的关系。为此,我们形成以下回归目标:

回归目标

我们的目标是精确定义一个国家总资本形成的增长与该国每年经历的 GDP 增长之间的关系。

回归策略

我们的策略将是选择和拟合一个适合面板数据集,特别是 WB 面板数据的回归模型。我们的回归模型应该允许我们将国家 i 在时间段(年份) t 经历的年 GDP 增长表示为某个函数 *f(.)*在 t 时间段内 i 国家总资本形成的年增长率。

以符号形式:

在时间周期 t,国家 I 的 GDP 增长是国家 I 在时间周期 t 的总资本形成增长的函数

在上面的回归方程中, ε_it 是回归的残差,它捕捉了 i 国家在 t 年期间的同比增长的方差,这是模型无法能够“解释”的。

混合 OLS 回归模型

如前所述,混合 OLS 回归模型通常是一个很好的起点,也是几个面板数据集的参考模型。我们将研究它对世界银行数据集的适用性。

为此,我们将通过将国家和年份视为两列来“展平”面板数据,如下所示:

展平版本的面板数据集(图片由作者提供)

我们的因变量(内生变量)和解释变量(外生变量)如下:

因变量y= GDP _ PCAP _ 长城 _PCNT
解释变量X= GCF _ 长城 _PCNT

数据集可以在 这里下载

使用 Pandas ,我们将把这个展平的面板数据集加载到内存中,使用 Seaborn ,我们将绘制 plot yX.

我们将从导入所有必需的包开始,包括我们将在本文后面使用的包:

**import** pandas **as** pd
**import** scipy.stats **as** st
**import** statsmodels.api **as** sm
**import** statsmodels.graphics.tsaplots **as** tsap
**from** statsmodelspat **import** lzip
**from** statsmodels.stats.diagnostic **import** het_white
**from** matplotlib **import** pyplot **as** plt
**import** seaborn **as** sns

将展平的数据集加载到 Pandas 数据框中:

df_panel = pd.**read_csv**('wb_data_panel_2ind_7units_1992_2014.csv', **header**=0)

使用 Seaborn 绘制所有国家所有时间段的 GDP 增长与总资本形成增长的关系图:

sns.**scatterplot**(**x**=df_panel[**'GCF_GWTH_PCNT'**],  
                **y**=df_panel[**'GDP_PCAP_GWTH_PCNT'**],
                **hue**=df_panel[**'COUNTRY'**]).**set**(**title**=                 
                'Y-o-Y % Change in per-capita GDP versus Y-o-Y % Change in Gross capital formation')plt.**show**()

我们看到下面的情节:

国内生产总值同比增长%与总资本形成同比增长%的国家散点图(图片由作者提供)

在数据面板中,所有国家的 GDP 年同比增长率与总资本形成年同比增长率之间似乎存在线性关系。这对使用 OLS 技术拟合线性模型来说是个好兆头。

但是,我们也在响应变量 GDP_PCAP_GWTH_PCNT 中观察到了 异方差 的迹象。具体地,对于不同的 GCF_GWTH_PCNT 值,GDP_PCAP_GWTH_PCNT 的方差不是常数。对于使用 OLS 估计技术来说,这不是一个好兆头。

无论如何,让我们继续用 OLS 回归模型来拟合这个扁平的数据面板。在本文的后面,我们将看到如何使用一组拟合优度测试来度量模型的适用性。

混合 OLS 回归模型方程如下:

汇集的 OLS 回归模型方程(图片由作者提供)

在面板数据集上训练模型的目的是找到拟合系数 β_cap_1β_cap_0β_cap 中的“cap”表示它是模型估计的系数的值,而不是总是未知的真实(群体水平)值 β

ε 是拟合模型的残差,是具有一定均值和方差的随机变量。如果 OLS 估计技术正确地完成了它的工作,ε将具有为零的平均值,并且ε将具有以 GCF_GWTH_PCNT 为条件的恒定方差(即 ε 将不是异方差的),并且 ε 将不是自相关的。

我们将使用 statsmodels 的OLS类来构建和拟合 OLS 回归模型,如下所示:

定义 yX 变量:

y_var_name = **'GDP_PCAP_GWTH_PCNT'** X_var_names = [**'GCF_GWTH_PCNT'**]

从数据面板中切出 y 矢量:

pooled_y=df_panel[y_var_name]

从数据面板中切出 X 矩阵:

pooled_X=df_panel[X_var_names]

添加回归截距的占位符。模型拟合时,这个变量的系数就是回归模型的截距 β_0

pooled_X = sm.**add_constant**(pooled_X)

构建 OLS 回归模型:

pooled_olsr_model = sm.**OLS**(**endog**=pooled_y, **exog**=pooled_X)

在*()yX)*数据集上训练模型并获取训练结果:

pooled_olsr_model_results = pooled_olsr_model.**fit**()

打印培训总结:

**print**(pooled_olsr_model_results.**summary**())

我们得到以下输出:

WB 数据集上混合 OLS 回归模型的训练输出(图片由作者提供)

如何解释混合 OLSR 模型的训练输出

首先要注意的是拟合系数的值: β_cap_1β_cap_0

β_cap_0 = 0.9720,β_cap_1=0.2546

这两个系数都被估计为在 p

The trained Pooled OLS model’s equation is as follows:

The trained Pooled OLS regression model (Image by Author)

How to interpret the Pooled OLSR model’s performance

We will analyze whether Pooled OLS model is the adequate model for our regression problem. We will analyze the model’s goodness-of-fit using direct measures and tests such as R 平方F 检验 以及对数似然和 AIC 分数处显著不同于 0,并且也通过残差分析间接不同。

通过 R 平方、f 检验、对数似然和 AIC 分析拟合优度

调整后的 R 平方 测量的是中由 X 解释的总方差的分数,在考虑了由于包含回归变量而损失的自由度之后,为 0.619 或约 62%。这当然不是一个糟糕的数字,但仍然没有什么值得欣喜若狂的。

测量模型参数联合显著性的回归的 F 检验 产生了 261.4 的检验统计量,p 值为 2.15e-35,从而使我们得出结论,模型的系数估计在 p 值为<001 时联合显著。

该模型的对数似然为-300.29, AIC 得分为 604.6。这些拟合优度值本身是没有意义的,除非我们将它们与竞争模型进行比较。在我下周的文章中,我们将在相同的数据面板上建立一个固定效应模型,并使用这两种方法来比较有限元模型和混合 OLSR 模型的拟合质量。

残差分析

让我们分析拟合模型的残差正态性异方差性相关性——影响线性模型拟合优度的三个属性。****

回想每个原始残差ε_ it = y _ OBS _ it—y _ pred _ it,即 GDP_PCAP_GWTH_PCNT 的观测值和预测值之间的差值。让我们打印出包含训练模型的原始残差的 Pandas Series对象:**

打印(pooled _ olsr _ model _ results . resid)

模型的原始残差

以下是残差的平均值:

******print**(**'Mean value of residual errors='**+**str**(pooled_olsr_model_results.resid.**mean**()))****

Mean value of residual errors=**3.682354628259836e-16**

平均值实际上为零,这是使用 OLS 估计技术的预期结果。

残差是正态分布的吗?

让我们绘制残差的 Q-Q 图:

****sm.**qqplot**(data=pooled_olsr_model_results.**resid**, **line**=**'**45**'**)plt.**show**()****

混合 OLS 模型的残差 Q-Q 图(图片由作者提供)

这是我们观察问题的第一个迹象。残差的 Q-Q 图是对正态性的直观检验,它清楚地表明拟合模型的残差不是正态分布的。Q-Q 测试的结果由 Jarque-Bera 和综合测试 的输出支持,用于显示在训练总结的底部面板中的常态。两个测试都表明残差在 p < .001 处不是正态分布的。

正态性的 JB 检验和综合检验的结果(图片由作者提供)

即使残差不是正态分布的,混合 OLS 估计仍然是面板数据回归问题的最佳线性无偏估计。残差的非正态性不影响 OLS 回归模型的蓝色性。

具有非正态分布的残差的一个缺点是,人们不能 为模型的预测建立可靠的置信区间 。我们可以容忍小的偏离正态分布,但是大的偏离会使正态分布或学生的 t 分布失效。因此,可靠的置信区间不能(也不应该)计算。

残差是齐次的吗?

如果 OLSR 模型的残差是异方差的,即残差的方差在 X 的所有值上不是常数,则 OLS 估计器不是 有效的 (尽管它仍然是 无偏的 )。

让我们目视检查残差,看看残差相对于 X 的曲线中是否存在任何趋势:

****fig, ax = plt.**subplots**()fig.**suptitle**('Raw residuals of Pooled OLS versus X')plt.**ylabel**('Residual (y - mu)')plt.**xlabel**(**'X='**+**str**(X_var_names[0]))ax.**scatter**(pooled_X[X_var_names[0]], pooled_olsr_model_results.**resid**, **s**=4, **c**=**'**black**'**, **label**=**'**Residual Error**'**)plt.**show**()****

我们看到下面的情节。对于 X 的不同值,残差似乎没有恒定的方差。我用红色箭头标出了差异趋势:

混合 OLS 模型的残差与 x 的关系图。该图显示异方差残差(图片由作者提供)

可以通过运行白色测试来确认异方差,其中我们将回归 X 上的残差平方,并测试所得回归模型系数的显著性,如下所示:

****keys = [**'Lagrange Multiplier statistic:'**, **'LM test\'s p-value:'**,
        **'F-statistic:'**, **'F-test\'s ' 'p-value:'**]results = **het_white**(**resid**=pooled_olsr_model_results.**resid**, **exog**=pooled_X)print(**'Results of the White test for heteroskedasticity of residual errors ===> '**)
print(**lzip**(keys,results))****

我们看到以下输出:

******Results of the White test for heteroskedasticity of residual errors ===>
[(‘Lagrange Multiplier statistic:’,** 9.918681580385458**), (“LM test’s p-value:”,** 0.007017552347485667**), (‘F-statistic:’,** 5.186450932829045**), (“F-test’s p-value:”,** 0.006582734100668208**)]******

LM 检验的 p 值是< .001 indicating a 对残差是同伦齐次的 White 检验的零假设的拒绝。

如前所述,混合 OLS 回归模型将产生总体值的无偏估计,即使拟合模型的残差是异方差的。但是残差中的异方差将违反高斯-马尔可夫假设中的一个,该假设使 OLS 估计量成为手头问题的最佳线性无偏估计量。具体而言,当残差是异方差的时,OLS 估计器变得 低效 ,即,它失去了在所有可能的线性无偏估计器中生成具有最低可能方差的预测的能力。当残差是异方差的时,OLS 估计量会低估或高估参数估计中的方差,导致参数估计的标准误差被遗漏指定。由于标准误差用于计算置信区间,参数估计的置信区间也变得不正确。对于与模型预测相关的标准误差和置信区间,也可以看到相同类型的不规范。

残差与响应变量 y 相关吗?

让我们绘制相对于 y=GDP_PCAP_GWTH_PCNT 的残差:

****fig, ax = plt.**subplots**()fig.**suptitle**('Raw residuals of Pooled OLS versus y')plt.**ylabel**('Residual (y - mu)')plt.**xlabel**('y')ax.**scatter**(pooled_y, pooled_olsr_model_results.**resid**, **s**=4, **c**=**'**black**'**, **label**=**'**Residual Error**'**)plt.**show**()****

我们得到如下的情节:

混合 OLS 模型相对于 y=GDP_PCAP_GWTH_PCNT 的残差图(图片由作者提供)

在残差和 y 之间似乎有一个线性趋势。使用 皮尔逊 r 的相关性测试证实了这一视觉判断:

****keys = [**'Pearson\'s r:'**, **'p-value:'**]results = st.**pearsonr**(**x**=pooled_y, **y**=pooled_olsr_model_results.**resid**)print(**'Results of the Pearson\'s r test of correlation between the residual errors and the response variable y ===>'**)**print**(**lzip**(keys,results))****

我们看到以下输出:

******Results of the Pearson's r test of correlation between the residual errors and the response variable y ===>**
[("**Pearson's r:**", 0.6149931069935411), ('**p-value:**', 3.996454333518694e-18)]****

第一个值 0.61499 是残差和之间的相关量(~ 61%),第二个值 3.99645e-18 是结果的 p 值。我们将忽略报告的 p 值,因为我们知道残差远非正态分布。无论如何,报道的相关性(61%)本身明显大于零,因此是显著的。**

回归残差和响应变量之间的高度相关性表明,我们的混合 OLSR 模型缺少重要的解释变量,否则这些变量将能够“解释”这种相关性。无论该国的人均 GDP 增长率( y )如何变化,总资本形成率( X )都无法解释已经以与 y 相关和异方差的形式泄漏到残差中。

残差是自相关的吗?

让我们绘制残差的自相关函数(ACF)图:

****tsap.**plot_acf**(**x**=pooled_olsr_model_results.**resid**)**plt**.show()****

我们看到下面的情节:

混合 OLSR 模型残差的自相关图(图片由作者提供)

滞后 0 时 1.0 的完美相关性将被忽略,因为一个数总是与其自身完美相关。但我们看到滞后 1、2 和 3 处的残差之间存在显著的自相关。

正如残差中的异方差一样,残差中的自相关违反了高斯-马尔可夫假设中的一个假设,该假设使 OLS 估计量变蓝。具体来说,自相关残差会导致标准误差被遗漏指定(低估),从而导致 t 值(或 z 值)被高估,并且参数估计的置信区间被遗漏指定。实际上为零(即无关紧要)的系数可能被错误地报告为非零(重要)。

调查结果摘要

总之,我们发现我们为世界银行数据集构建的混合 OLS 回归模型具有以下特性:

  • 调整后的 R 平方约为 62% 对于真实世界的数据集来说,这并不坏。
  • 发现模型的参数系数在 p<0.001 处显著。
  • f 检验表明参数系数在 p<0.001 处联合显著。
  • 模型的残差不是正态分布的,这意味着与模型预测相关的标准误差和置信区间可能不完全可靠。
  • 残差是异方差的,这意味着模型参数的参数显著性 t 检验结果、参数估计的相应置信区间以及 f 检验结果并不完全可靠。该结论适用于与模型预测相关的标准误差和置信区间。
  • 残差与响应变量y相关,这意味着模型遗漏了重要的回归变量,否则这些变量将与y相关,它们的缺失导致相关性的余额泄漏到残差中。******
  • 残差在滞后 1、2 和 3 处是自相关的,这意味着模型参数估计的标准误差可能被低估,而报告的 z 值(或 t 值)相应地被高估。从功能上讲,残差中的自相关意味着回归模型的一般不规范。

总的来说,混合 OLSR 模型的残差分析指向了手头问题的回归模型的错误规范。我们也许可以用面板数据集的另外两种回归模型中的一种做得更好,即固定效应随机效应回归模型。

在我下周的文章中,我们将深入探讨固定效应回归模型,并研究如何在世界银行数据集上构建和拟合 FE 模型。我们将比较它与集合 OLSR 模型的拟合优度。

这里是本文使用的世界银行数据集的 下载链接

下面是本文中使用的完整源代码:

参考文献、引文和版权

数据集

世界发展指标世界银行数据 CC BY 4.0 license 。 下载链接

纸质和图书链接

巴蒂·h·巴尔塔吉, 面板数据的计量经济分析 ,第 6 版,施普林格

威廉·h·格林, 计量经济分析 ,第 8 版 2018,培生**

形象

本文中所有图片的版权归 CC-BY-NC-SA 所有,除非图片下面提到了不同的来源和版权。

如何用 Python 构建实时转录 App

原文:https://towardsdatascience/how-to-build-a-real-time-transcription-app-in-python-7939c7b02614

使用 AssemblyAI 和 Streamlit 的分步教程

介绍

实时转录应用程序是一种实时提供语音实时转录的应用程序。这种应用程序使用语音识别引擎将口语转化为文本,然后实时显示在屏幕上。该应用程序可以用于各种目的,包括转录讲座,会议和会议。

使用实时转录应用程序有几个好处。首先,它可以帮助你捕捉发生的想法和对话。这对于在快节奏环境下工作或者有很多想法的人来说特别有用。其次,可以帮助你提高沟通能力。这是因为你可以看到自己怎么说话,别人怎么说话。这有助于你找出可以改善沟通的地方。第三,该应用程序也可能被听力有困难的人或学习英语的人使用,因为该应用程序可以帮助实时转录音频,以便用户可以在说话时看到屏幕上的文本。然后,可以对转录的文本应用自然语言处理,以供进一步分析。

在本文中,我们将探索如何使用 AssemblyAI API 作为后端,Streamlit 作为前端,用 Python 构建一个实时转录应用程序。

为了补充本文,您还可以观看视频版本:

如何使用 AssemblyAI 和 Streamlit 在 Python 中构建实时转录 Web 应用

实时转录应用程序的高级概述

在本文中,我们将用 Python 构建一个实时转录 web 应用程序,它将允许我们实时执行语音到文本的转录。

为此,我们将利用 Python 中的几个库,如下所示:

  • 我们将用来存放所有输入和输出小部件的 web 框架。
  • websocket —允许应用程序与 AssemblyAI API 交互。
  • asyncio —允许应用程序以并行方式执行所有各种音频输入和输出。
  • base64 —允许应用程序在音频信号发送到 AssemblyAI API 之前对其进行编码和解码。
  • json —读入由 AssemblyAI API 生成的音频输出(转录文本)。
  • pyaudio —对通过端口音频库输入的音频进行处理。
  • ospathlib —用于浏览项目的各个文件夹,并执行文件处理和操作。

设置工作环境

要在您自己的电脑上重新创建实时转录应用程序,我们可以从创建名为transcription的 conda 环境开始:

conda create -n transcription python=3.9

您可能会看到安装 Python 库依赖项的提示,当您这样做时,点击键盘上的Y按钮进行确认并继续。

一旦我们创建了 conda 环境,您就可以按如下方式激活它(您需要在每个编码会话中执行此操作):

conda activate transcription

在您的编码会话之后,您可以退出 conda 环境,如下所示:

conda deactivate

下载 GitHub repo

现在,我们通过 GitHub 下载实时转录 app 的完整回购如下:

git clone [https://github/dataprofessor/realtime-transcription](https://github/dataprofessor/realtime-transcription)

进入realtime-transcription文件夹,如下所示:

cd realtime-transcription

接下来,我们可以安装应用程序使用的必备库:

pip install -r requirements.txt

获取 AssemblyAI API 密钥

访问 AssemblyAI API 非常简单,从向 AssemblyAI 免费注册开始。

接下来,登录到您的帐户后,您将在右侧面板中找到 API 密钥,如以下截屏所示。

如何获取 AssemblyAI API 的截屏?

现在您已经将 API 密匙复制到内存中,您将希望将其粘贴到位于名为.streamlit的文件夹中的secrets.toml文件中(即文件路径为.streamlit/secrets.toml),该文件应该包含以下内容:

api_key = ‘xxxxx’

其中xxxxx应该由 API 键替换。

在下一步中,我们可以通过st.secrets[‘api_key’]命令检索这个 API 密钥。

运行实时转录应用程序

在运行实时转录应用程序之前,我们先来看看工作目录的内容(如 Bash 中的tree命令所示):

实时转录文件夹的内容。

我们现在准备推出实时转录应用程序:

streamlit run streamlit_app.py

这将在新的互联网浏览器窗口中打开应用程序:

实时转录 app 截图。

现在,让我们在下面的截屏中看看应用程序的运行情况。

应用程序运行的截屏。

代码的解释

在这里,我们将解释应用程序的底层代码。

  • 第 1–8 行 —导入 web 应用程序使用的必备库。
  • 第 10–13 行 —启动应用程序使用的会话状态。
  • 第 15–22 行 —通过text_input小部件提供用于接受用户音频参数输入的输入小部件。
  • 第 24–31 行 —上述代码块提供的输入音频参数用于通过pyaudio打开音频流。
  • 第 33–46 行 —定义了 3 个自定义函数(如start_listeningstop_listeningdownload_transcription),这些函数将在代码的后面被调用,我们稍后会谈到。
  • 第 49 行 —通过st.title命令显示应用的标题。
  • 第 51–62 行 —使用st.expander命令显示该应用的关于信息。
  • 第 64–67 行 —创建 2 列(通过st.columns命令)用于放置开始和停止按钮(即通过按钮部件中的on_click选项使用start_listeningstop_listening)。
  • 第 69–139 行 —音频输入和输出的处理在这里执行,音频信号被发送到 AssemblyAI API,在那里转录的文本以 JSON 格式获得。这段代码是由 Misra Turp 和 Giorgios Myrianthous 开发的代码修改而来。
  • 第 141–144 行 —显示转录下载按钮,然后删除文件。

结论

恭喜你,你已经使用 AssemblyAI API 用 Python 构建了一个实时转录 app。正如本文前面提到的,该应用程序有几个使用案例(例如听写文章或电子邮件,用于提高沟通技巧,为重听人抄写等。).诸如自然语言处理的进一步顶层分析然后可以应用于转录的文本。

接下来读这些

  • 数据科学如何掌握 Python
    下面是数据科学需要的必备 Python
  • 如何掌握数据科学的熊猫
    下面是数据科学需要的必备熊猫
  • 如何用 Python 构建 AutoML App
    使用 Streamlit 库的分步教程
  • 学习数据科学的策略
    打入数据科学的实用建议
  • 如何免费搭建一个简单的作品集网站
    不到 10 分钟从头开始的分步教程

✉️ 订阅我的邮件列表,获取我在数据科学方面的最佳更新(偶尔还有免费赠品)!

关于我

目前,我是 Streamlit 的全职开发人员。此前,我是泰国一所研究型大学的生物信息学副教授,数据挖掘和生物医学信息学负责人。在我下班后的时间里,我是一名 YouTuber(又名数据教授)制作关于数据科学的在线视频。在我做的所有教程视频中,我也在 GitHub 上分享 Jupyter 笔记本(数据教授 GitHub page )。

https://data-professor.medium/membership

在社交网络上与我联系

YouTube: http://youtube/dataprofessor/
网站: http://dataprofessor/
LinkedIn: https://www.linkedin/company/dataprofessor/

推特: https://www.twitter/thedataprof
脸书: http://facebook/dataprofessor/
GitHub: https://github/dataprofessor/
Instagram:

如何建立不连续数据的回归模型

原文:https://towardsdatascience/how-to-build-a-regression-model-for-discontinuous-data-bf4b493a491f

我们将研究如何对不连续数据的一种常见情况进行建模

大多数现实世界中生成数据的过程都受现实世界事件的支配。随着季度业绩的公布和天灾人祸的消息,股票价格会暴跌和飙升。随着金融危机、衰退和供应冲击的爆发,失业和油价等宏观经济指标会经历突然的趋势逆转。

以在足够长的时间内收集的任何真实世界的时间序列数据为例,你很难不发现至少一个趋势的急剧上升或下降,其严重程度足以将序列分为“之前”和“之后”部分。

在这种情况下,分析师的工作不仅是建立一个对这种不连续性稳健的统计模型,而且还要估计导致这些不连续性的事件的影响。

研究人员开发了许多技术来实现这双重目标。我们将在不连续(或几乎不连续)数据的常见情况下研究这样一种技术。

我们来看看下面这张图表,显示了美国从 2002 年 1 月 1 日到 2020 年 1 月 1 日的每周失业率。该数据包含了一次大衰退,即从 2007 年 12 月延续到 2009 年 6 月的“T2 大衰退”。

美国劳工统计局,失业率[UNRATE],检索自弗雷德,圣路易斯美联储银行;2022 年 6 月 18 日(公共领域数据)

如果我们希望为这些数据构建一个回归模型,我们至少有以下几种不同的方法:

  1. 我们可以构建一个分段回归模型,对上述数据集的三个不同部分进行建模,即衰退之前、期间和之后的部分。
  2. 我们可以使用一种称为回归扭结设计的回归技术。
  3. 我们可以用一个隐马尔可夫模型进行实验。具体来说,一个 2 状态马尔可夫转换自回归(MSAR)模型。这两种状态将表示衰退和非衰退阶段。MSAR 模型也应该能够代表在这样的时间序列数据集中必然存在的自相关。
  4. 最后,我们可以简单地选择在衰退期不对数据建模,从而将衰退期压缩到零宽度区域。因此,与前三种方法相反,我们不会对衰退期间时间序列的行为感兴趣。因此,我们也需要准备好丢失包含在经济衰退期数据集中的信息。

但是,如果我们简化这一点,有些人可能会说,这是一个不正确的决定,在时间序列的衰退阶段丢弃数据点,这就为以下有趣的线性模型打开了大门:

失业率的回归不连续模型(图片由作者提供)

在上面的模型中:

  • β_0 为截距。
  • β_1时间周期变量的系数。 Time_Period 为正整数,取 1、2、3 等。我们引入这一变量是为了捕捉经济衰退之前和之后这两个数据部分的月环比趋势。
  • β_2虚拟变量 历元的系数。我们将位于衰退开始之前的数据集部分的纪元设置为 0,将位于衰退阶段结束之后的数据集部分的纪元设置为 1。
  • ϵ 是一个误差项,它捕捉了我们的模型无法解释的未评级方差。

这里有一个到数据集的链接,该数据集包含就业率、时间段纪元变量。它不包含衰退阶段包含的数据点。

建立和训练回归模型

让我们使用 Python、Pandas 和 statsmodels 来构建和训练这个模型。

我们首先将数据集加载到 Pandas 数据框架中:

**import** pandas **as** pd
**import** statsmodels.formula.api **as** smf
**import** statsmodels.graphics.tsaplots **as** tsa
**from** matplotlib **import** pyplot **as** pltdf = pd.read_csv(**'unemployment_rate_us_fred.csv'**, header=0)

接下来,让我们用 Patsy 语法构造回归表达式。

reg_exp = **'UNRATE ~ Time_Period + Epoch'**

在上面的表达式中,请注意,回归截距并未明确提及,但是当我们使用它来构建模型时,statsmodels 会自动包含它。

让我们使用 statsmodel 构建 OLS 模型。我们将回归表达式和数据集作为参数传递:

regdis_model = smf.**ols**(**formula**=reg_exp, **data**=df)

接下来,让我们训练模型并打印训练总结:

regdis_model_results = regdis_model.**fit**()
**print**(regdis_model_results.**summary**())

我们看到以下输出。我在输出中突出了几个有趣的区域:

回归模型的训练输出(图片由作者提供)

分析模型性能

在右上角,我们观察到调整后的 R 平方为. 925。该模型能够解释 92.5%的失业率差异。

在调整后的 R 平方的正下方,我们看到 Statsmodels 报告了用于回归分析的 F 检验的输出。已经为我们计算了 F 统计量,其值为 1220,p 值为 1.09E-111。f 检验的输出表明,在 p 为< .001 时,模型的系数是共同显著的,这意味着,该模型在解释未评级的方差方面比均值模型做得更好(在这种情况下,做得好得多)。

让我们将注意力转向输出的中心部分,在这里我们可以看到系数估计值、它们的标准误差、p 值和估计值周围的置信区间。我们看到,所有三个系数的估计值在< .001.

The coefficient of 时间段的 p 值处是显著的(— 0.0525),这表明在衰退阶段的任一侧,在时间段中,失业率估计会以 0.0525(约 5%)的平均*率下降。*回想一下,在我们的数据集中,单位时间段是一个月。

最后,纪元的系数提供了一个有趣的见解。其值为 6.3757。我们的模型估计,2008 年至 2009 年的大衰退已经导致美国失业率平均增加了 6.3757%,95%的置信区间相当窄,从 6.111%到 6.641%。

残差分析

让我们看看 statsmodels 报告的残差正态性的 Jarque-Bera 和综合测试 的结果:

两个测试的 p 值都在 0.05 以上,从而验证了测试的默认假设,即残差呈正态分布。这意味着,我们可以依赖模型报告的置信区间估计。这是好消息。

然而,德宾-沃森检验的统计数据在< 2.0 indicating a positive auto-correlation among the residual errors. The test’s finding is vindicated by the following auto-correlation plot:

Auto-correlation plot of the residual errors (Image by Author)

The above plot can be produced by executing the following two lines of code:

tsa.**plot_acf**(regdis_model_results.**resid**)
plt.**show**()

The plot shows a strong auto-correlation at LAG-1, which means that each value in the time series of residual errors is correlated with the value that immediately precedes it in the time series. Since values at LAG 1 and LAG 2 are correlated, and LAG 2 and LAG 3 are similarly correlated, LAG 1 and LAG 3 are also correlated but to a lesser extent. Thus we see a gently sloping curve of correlations at the other lags also.

A strong auto-correlation of this type in the residuals implies that our model is missing one of more key explanatory variables. Or, the entire functional form of our model may need to be revisited. Perhaps, one of the other three kinds of models suggested at the beginning of the article would prove to be more effective in explaining the variance in UNRATE.

Nevertheless, our plucky little linear model seems to have held up well to the scrutiny. It has allowed us to model the discontinuity that 出来,我们将引入失业数据集中。它不仅估计了大衰退双方的失业趋势,还为我们提供了一种科学估计大衰退对失业率影响的方法。

参考文献、引文和版权

数据集

美国劳工统计局,失业率[UNRATE],从圣路易斯美联储银行检索;https://fred.stlouisfed/series/UNRATE。(在公共领域可用)。本文中使用的数据集的精选版本 可以从这里 下载。

形象

本文中的所有图片版权归 Sachin Date 所有,版权归 CC-BY-NC-SA 所有,除非图片下面提到了不同的来源和版权。

如果您喜欢这篇文章,请关注我的Sachin Date以获得关于回归、时间序列分析和预测主题的提示、操作方法和编程建议。

如何用 Python 构建一个简单的 Kafka 生产者和消费者

原文:https://towardsdatascience/how-to-build-a-simple-kafka-producer-and-consumer-with-python-a967769c4742

阿帕奇卡夫卡建筑简介。

Johannes Plenio 在 Pexels 拍摄的照片

建议的点播课程

我的一些读者联系我,要求提供点播课程,以了解更多关于 阿帕奇卡夫卡 的知识。这是我推荐的 3 个很好的资源:

  • 阿帕奇卡夫卡数据流&阿帕奇火花纳米级**【uda city】**通过此链接获得高达 70%的优惠
  • 数据工程纳米学位(UDACITY)
  • 使用 Python 的数据工程—职业轨迹(DATACAMP)

**>>>还不是中等成员?考虑与我的 推荐链接 签约,以获得 Medium 必须提供的一切,费用低至每月 5 美元

介绍

在您作为数据工程师的职业生涯中,您会自然而然地超越批处理(这意味着查询有界数据集),并熟悉流处理中使用的工具。在流处理中,数据是无限的,并且在查询时可能是不完整的。

业界领先的流数据框架之一是 Apache Kafka 。Kafka 是一个工具,它允许工程师根据主题实时生成数据。消费者可以读取和处理存储在这些主题中的数据。

从概念上讲,主题类似于数据库中的表,但是主要的区别在于,在数据库中记录可以被覆盖,而 Kafka 将主题作为日志来维护,这些日志是只附加事件的有序集合。主题可以存储为单个日志,也可以水平扩展为分区。

在本教程中,您将学习如何构建一个本地 Apache Kafka 集群。你还将学习如何使用 Python 在卡夫卡中创建生产者消费者。尽管有许多 Kafka Python 库,但在这里你会熟悉由 Confluent 提供的一个。

要安装这个库,使用下面的pip命令:

***pip3 install confluent-kafka***

一旦安装了库,您将能够在您的应用程序中导入它。

在讨论生产者和消费者之前,下一节将带您通过 Docker 设置一个本地 Kafka 集群。

用 Docker 运行一个本地 Kafka 集群

为了在本地运行 Kafka 集群,你需要两样东西:Kafka 经纪人动物园管理员

代理是一台机器- 托管一个或多个分区 -负责处理向这些分区写入新事件或从中读取事件的请求。根据具体的用例,Kafka 集群可以由一台机器或一个机器网络组成

相反,Zookeeper 被定义为一种集中式服务,它在分布式系统中提供灵活和健壮的同步,并跟踪 Kafka brokers 的状态以及主题和分区。

设置它们最方便的方法是使用 Docker compose 文件来运行多个容器,并使用一个配置脚本启动所有的东西。

在本教程中,您将使用存储在 this GitHub repo 中的docker-compose.yaml文件(记得保存在与 Kafka 生产者和消费者 Python 文件相同的目录中)。通过打开docker-compose.yaml,你会看到下面的代码:

上面的配置文件和 confuent 'Apache Kafka 快速入门 页面上共享的模板几乎一模一样。

如您所见,它利用了 融合图像 的优势,因此运行它将确实创建两个容器,一个用于代理,一个用于 Zookeeper。要通过 CLI 构建这两个容器,请使用以下命令:

***docker-compose up -d***

这将引导您看到提示:

*Status: Downloaded newer image for confluentinc/cp-zookeeper:7.0.1
Status: Downloaded newer image for confluentinc/cp-kafka:7.0.1
Creating zookeeper ... done
Creating broker    ... done*

恭喜你!您已经通过 Docker 在本地成功建立了一个 Kaka 集群。

打造一个卡夫卡制作人

既然您的 Kafka 集群正在后台运行,那么有趣的部分来了:用 Python 构建一个生成器。

要编写一个生产者,您应该创建一个生产者实例,发送数据并监听确认。在下面的例子中,您将使用 Faker 模拟关于用户的虚假数据的生成,并将它们写入到user-tracker主题中。要执行的步骤如下:

  • 导入所需的库并创建一个 faker 对象:
*from confluent_kafka import Producer
from faker import Faker
import json
import time
import logging
import random fake=Faker()*
  • 配置日志的格式。每当有新事件可用时,日志将被附加到主目录中的一个producer.log文件中:

  • 通过指定 Kafka 集群的端口来创建生成器:

  • 定义一个负责确认新消息或错误的回调函数。当一个有效的信息变得可用时,它被解码成utf-8并以首选格式打印出来。相同的消息也会附加到日志文件中:

  • 编写一个生产者循环,模拟当前月份中十个用户注册事件的创建。每条消息都从字典转换成 json 格式发送给 Kafka:

如您所见,在向 Kafka 发送数据之前,main()函数正在调用poll()向生产者请求任何以前的事件。如果找到,事件被发送到回调函数(回执)。在这种情况下,p.poll(1)意味着允许 1 秒的超时。

最后,生产者也被刷新(p.flush()),这意味着阻塞它,直到先前的消息被有效地传递,使它同步。

构建 Kafka 生成器的完整代码可从这里获得。如果您现在尝试使用以下命令通过 CLI 运行它:

***python kafka_producer.py***

输出将是发送到 Kafka 集群上的user-tracker主题的消息(以及写入producer.log文件的消息),终端将显示确认,如下所示:

通过 CLI 运行 Kafka 生成器的结果

建立一个卡夫卡式的消费者

在卡夫卡的作品中,消费者生来就是为了阅读并经常清理、转换丰富来自主题的信息。在其核心,消费者作为一个无限循环运行,等待消息被传递到他们正在收听的主题。**

可以从头开始阅读消息(主题中的第一条消息)或从主题中的特定位置开始阅读,称为偏移,由 Zookeeper 跟踪。**

下面的代码将向您展示如何构建 Python 消费者:

  • 导入Consumer库并创建消费者实例。您需要传递 Kafka 集群正在运行的端口、一个消费者组名称,以及偏移重置(,在这里消费者应该开始读取*)😗

  • 确定应该消费的主题的名称并订阅它。如果有不止一个主题可用,您可以使用list_topics().topics命令列出它们的名称:

  • 为了开始接收事件,您创建了一个无限循环来轮询主题,寻找任何可用的消息。用户始终可以调整到从特定偏移开始和停止:

特别是,以下代码的行为方式如下:

  • 如果没有消息,它就一直等待,
  • 如有错误,将显示
  • 当消息为资金时,将被解码为 *utf-8* :

构建 Kafka 消费程序的完整代码可在这里获得。如果您现在在终端中打开两个窗口并再次运行生成器:

***python kafka_producer.py***

其次是消费者:

***python kafka_consumer.py***

您会注意到,由生成的生成的消息将在短暂延迟后开始显示在使用者窗口中:

通过 CLI 运行 Kafka 消费程序的结果

这意味着您的消费者正在按预期工作…成功了!

结论

在本文中,您开始了解 Kafka,特别是如何使用 Python confluent_kafka包创建一个简单的 Kafka 生产者和消费者。

《T4》是一个很基本的例子,说明了如何利用卡夫卡作为一种技术(只是触及了表面!但是应该给你一个架构的概念,以及如何开始构建更高级的逻辑。

来源

  • 用 Python 进行数据工程(电子书—第 12–13 章)
  • 阿帕奇卡夫卡经纪人基础知识
  • 什么是 Zookeeper,为什么阿帕奇卡夫卡需要它?
  • 卡夫卡《同花顺》与《民意测验》的区别

你可能也会喜欢

*💔-nanodegrees-you-should-consider-to-advance-your-data-engineering-career-in-2021-baf597debc72> 💔-ways-to-create-tables-with-apache-spark-32aed0f355ab> *

如何构建一个 Streamlit 应用程序来从 YouTube 视频中提取主题

原文:https://towardsdatascience/how-to-build-a-streamlit-app-to-extract-topics-from-youtube-videos-9c7aebbfab8e

AssemblyAI 的主题检测功能概述

GR Stocks 在 Unsplash 上拍照

想象一下,运行一个平台,用户定期上传自己的视频。你将如何对这些不断增长的内容进行分类,并在相关类别中进行标记,以便将来的访问者可以轻松找到它们?

第一种方法是分析用户补充的元数据。这通常是文本格式。它可以是一个标题或描述,有时是一系列标签——(这就是 Youtubers 所做的)

但是如果这些元数据丢失了呢?你还能对视频内容进行分类吗?

本帖将尝试通过使用assembly ai语音转文本 API 及其话题检测 特性 来回答这个问题。我们将了解这项功能是如何工作的,以及如何将它嵌入到从 Youtube 视频中提取主题的 Streamlit 应用程序中。

最后将提供演示和代码 💻

事不宜迟,让我们来看看🔍。

👉如果你想了解更多关于 AssemblyAI API 的知识,我建议你阅读我之前的两篇文章:

一种新颖的话题检测方法

AssemblyAI 提供了一个人工智能支持的功能,可以提取音频或视频文件中的主题。

我发现这个功能有趣的地方是 AssemblyAI 如何处理主题检测问题。

令人惊讶的是,它似乎没有使用经典的无监督 NLP 技术,如潜在狄利克雷分配(LDA)或潜在语义索引(LSI)。

相反,AssemblyAI 应用的是一个包含 689 个类别的标准化分类法上的多标签分类。

乍一看,这似乎有点牵强,但是在多个例子上运行 API 之后,结果证明是相当令人信服的。我们将在演示中看到更多相关内容。

AssemblyAI 使用的分类法被称为 IAB 分类法。它由互动广告局维护,这是一个为在线广告制定行业标准的美国组织。因此,它被出版商用来轻松地组织他们的网站内容。这也使得提取的主题适合于上下文定位场景。

这是一个详细描述 IAB 分类的表格。

我仔细看了一下,发现它确实涵盖了广泛的主题。以下是一些例子:

  • 关于汽车的话题

作者截图

  • 关于服装的话题

作者截图

  • 关于政治的话题

作者截图

现在你可以争辩说,你的音频文件可能集中在一些不属于这个分类的非常具体的主题上。在这种情况下,您可以使用 AssemblyAI 首先获取脚本,然后使用定制方法自己执行提取。

如何激活话题检测功能?

就像激活内容审核特性一样,激活主题检测就是在请求体中添加一个参数。该参数是iab_categories键,必须设置为真。

要执行转录和主题检测,您可以使用以下 shell 命令从终端调用 API:

使用 Python,这可以转化为:

当您发送 POST 请求时,会向处理队列提交一个转录作业。此任务是异步的,可能需要一些时间才能完成。

为了等待处理队列完成并在之后获取输出,您可以很容易地想象一个 while-loop ,它会休眠一段时间并继续运行,直到处理完成。

一旦转录完成,您应该得到以下输出。

作者截图—带话题检测的转录

有一些常见的东西:你可以查看 API 文档来了解更多关于这些字段的信息。

新增的是返回话题检测结果的**iab_categories_result**键。

每个结果对应于音频文件的一部分(该部分由startend时间戳界定),并且具有提取的主题列表(也称为标签),这些主题按照相关性的降序排序。

例如,马丁·路德·金演讲的第一部分分为:

  • 事件和选举>政治事件
  • 新闻和政治政治政治政治问题 T21
  • 新闻与政治>政治

从 YouTube 视频中提取主题🎥

这个周末我有一些空闲时间,所以我构建了一个从 Youtube 视频中提取主题的 Streamlit 应用程序。

在寻找可视化结果的直观方式时,我首先遇到了streamlit-timeline,这是一个 Streamlit 组件,允许您可视化带有时间编码事件的交互式时间线。

作者 GIF

我考虑显示视频中同时开始的部分,而不是事件。然而,我很快就面临着在每张幻灯片中嵌入相应视频的问题。

这时候我转到了 streamlit-player

该组件允许您在 Streamlit 中嵌入 Youtube 视频,通过正确的参数设置,它甚至可以使视频在特定的时间戳开始和结束:这对于用例来说是完美的。

试玩!🚀

在分享代码之前,这里有一个一分钟的视频演示。

作者的视频——使用 AssemblyAI 从 Youtube 视频中提取主题的 Streamlit 应用程序演示

这款应用非常简单:它首先要求你提供一个视频网址,一旦你点击了转录按钮,它就会执行一系列任务:

  1. 它从 YouTube 视频中提取音频
  2. 它把音频上传到 AssemblyAI 服务器
  3. 它提交一个带有主题提取的转录作业
  4. 它获取结果并保存它们
  5. 它显示输出:对于每个结果,它嵌入相应的视频部分、转录的文本以及提取的主题列表。

该应用已上线。你可以在这里试用一下https://share.streamlit.io/ahmedbesbes/assemblyai/main/app.py****:注意,它使用的是我的 API 密匙,链接到一个自由计划账户。如果每月使用量超过其限制,您将无法转录视频。

但是,您仍然可以可视化一些预先计算的示例。

如果你想在本地运行应用程序,代码可以在 Github 上找到。您可以通过简单地安装需求并启动 Streamlit 命令来运行它。

**git clone** [**git@github**](mailto:git@github)**:ahmedbesbes/assemblyai.git
cd assemblyai/
pip install requirements.txt
streamlit run app.py**

如果您对代码有任何疑问,请随时联系我们。

深入挖掘参考资料

  • https://docs . assembly ai . com/audio-intelligence # topic-detection-iab-classification
  • https://github/okld/streamlit-player
  • https://towards data science . com/how-to-transcripte-and-analyze-audio-files-with-python-and-assembly ai-22660 dbf8e 66
  • https://towards data science . com/how-to-moderate-audio-data-using-python-and-assembly ai-a5eab 9910730

感谢阅读🙏

这是我在 AssemblyAI 系列的第三篇文章。我希望您能从这个软件和我们构建的 Streamlit 应用程序中学到一些有用的东西。

不要犹豫克隆代码或运行它。如果你有问题,你可以联系我。

下一个帖子将是关于 AssemblyAI 的最后一个帖子:它将涵盖实时转录,敬请关注。

今天就这些了。下次见!👋

新到中?你可以每月订阅 5 美元,并解锁各种主题的无限文章(技术、设计、创业……)你可以通过点击我的推荐链接来支持我

**https://ahmedbesbes.medium/membership

由路易斯·史密斯在 Unsplash 上拍摄的照片**

如何构建成功的仪表板

原文:https://towardsdatascience/how-to-build-a-successful-dashboard-359c8cb0f610

一份清单,来自某个制造了几个不成功产品的人

在我人生的这个阶段,我想我已经设计了一百多个不同的仪表盘。随着我越来越资深并开始管理一个团队,我对这些任务变得越来越谨慎——质疑每个仪表板请求的实际需求和期望值。构建一个有效的仪表板实际上需要时间——当需求没有被正确定义时,它会很快变成一个数月的噩梦(最终没有人使用它)。

人们通常会很快要求一个新的仪表板。构建仪表板是做一些实际上有形的事情,也就是说,你正在构建一个可以在“真实世界”中发布的产品(与研究相反,研究更抽象)。但是最终,如果没有一个明确的问题可以由仪表板解决,或者如果构建仪表板的成本比它将创造的价值更重要,那么接受这个项目可能是浪费时间。

由于您的时间很宝贵,下面是一个清单,遵循它可以增加您的仪表板项目的成功机会。

在 Unsplash 上由 Carlos Muza 拍摄的照片

步骤#1:定义用例及受众

在开始实际工作之前,您应该清楚一些事情,特别是:您为什么要构建这个仪表板,以及为谁构建。

“艰难的选择,轻松的生活。容易的选择,艰难的生活。”——杰西·格雷戈雷克

根据我的经验,在这个阶段,重要的是要明确什么是用例,不是用例,以及谁是目标受众。如果你在一开始就做出这些“艰难”的选择,这会让你的生活变得更容易——所以请确保正确回答以下问题:

  • 这个仪表盘试图解决什么问题?这将是需要回答的第一个问题。如果你的仪表板不能解决任何问题,人们就不会使用它。通过清楚地定义问题,您可以更好地了解仪表板将产生什么价值,这可以帮助您估计您在这个项目中的个人投资应该是多少(参见我的文章“如何选择要处理的数据项目”以获得更多信息!)
  • **对什么不会有用?**清楚仪表盘的用处和用处,可以让你确保自己没有使用仪表盘,也就是说,过多的信息淹没了界面,使其难以使用。它对内部品牌也非常有用——如果很明显你的仪表板只对做 X 有用,你的仪表板在内部会被称为做 X 的仪表板。
  • 谁将是该仪表板的受众?为您的受众量身定制体验。例如,如果你的读者不熟悉你所报道的业务,你应该在数据中加入更多的内容。如果他们不知道如何使用过滤器,你就不应该添加过滤器。如果他们主要使用他们的移动设备,确保它是移动友好的。招募一些能够代表你的受众的测试人员——他们可以给你关于任何模型和最终产品的反馈。
  • **你如何知道你的仪表板是否成功?**这是一个棘手的问题,经常被忽视。在这个项目结束时,你会希望有一个简单的标准来决定这是成功还是失败。它可以是基于使用的(例如,“每月有超过 X 人连接到仪表板”),也可以是基于项目的(例如,“大多数项目 Y 的决策都是基于仪表板提供的数据”)。

第二步:基准//寻找灵感

既然你对成功的样子和你应该建立的东西有了一个清晰的想法,现在是时候更好地了解你的受众以及他们与数据的关系了。他们在数据之旅中处于什么位置?他们目前在使用哪些数据?他们的数据梦想是什么?理解它们是让您的仪表板成功的关键:

  • 我们的组织过去是否尝试过解决这个问题?如果你不了解过去,你如何建设未来?如果一个解决方案在过去已经被尝试过,学习什么可行,什么不可行可能是非常强大的。
  • **哪些仪表板受您的受众欢迎?**你的受众已经在内部消费数据,他们可能已经习惯于看到以某种方式呈现的数据。他们是否习惯于看到它被特定维度分割?他们会喜欢你遵循特定的命名惯例吗?研究这些仪表板可以给你一个项目该做和不该做的清单。
  • **没有这个仪表板,您的受众目前过得怎么样?**了解你的受众目前在没有仪表盘的情况下做了什么,有助于理解他们需要仪表盘的最低价值是什么,换句话说,你的仪表盘最少应该做什么,并相应地优先考虑功能

步骤#3:原型和构建

仪表板的用户体验在仪表板的成功中起着重要的作用,而分析师们常常忽略了它的重要性。请不要忘记,仪表板是一种有形的产品,应该定期使用,确保这一点的最佳方式是与您的潜在用户一起开发它:

  • 首先制作模型。建立模型(尤其是简单的,在电子表格上)并让你的潜在用户运行它,可以让你确保你覆盖了他们所有的用例,并且 UX 是理想的。保持简单专注于它试图解决的问题。想一想【倒金字塔原理】如何呈现数据。对正确类型的数据使用正确的可视化。
  • 让你的潜在高级用户运行这些模型。用一些实际数据填充模型,并展示给你的 beta 测试人员(你在步骤 1 中确定的)。观察他们如何使用模型(即他们的用户旅程),以及他们是否能够自己找到所需的信息。如果他们没有,或者他们的用户之旅很痛苦——重复并再试一次。

你令人敬畏的嘲笑(作者图片)

  • 构建仪表板!现在一切都已经通过了验证,你的 beta 测试人员也欣喜若狂,继续构建仪表板吧。确保数据加载足够快,不同部分之间保持一致,并且数字使用正确的格式。

第四步:测试,测试,测试

在发布之前确保仪表板工作似乎是显而易见的。但是“作品”是什么意思呢?这意味着“你的观众能够找到他们正在寻找的信息”,它有多个组成部分:

  • 数字是否正确/它们是否匹配不同的数据源?没有什么比一个报告“错误”数字的仪表盘更具破坏性的了——你的听众可能会立刻失去信任。查看报告相同指标的其他仪表板和数据源,并验证您是否报告了相同的内容。
  • **主要用户旅程是否按预期运行?**在步骤 3 中,您确定了一系列关键用户旅程(CUJs)。试着按照这些建议去做,看看你是否能够完成关键任务——如果你不能,你应该解决这个问题。
  • **不同的测试人员对最终产品满意吗?**最后一次向你的 beta 测试人员寻求帮助,让他们在仪表盘上尽情驰骋。特别注意他们的问题——这些问题通常是缺少了什么或没有足够的上下文,以及仪表板可能没有按预期工作的信号。

第五步:记录一切

还记得在步骤 2 中,当你发现有人已经试图解决这个问题并记录了他们的努力时,你有多开心吗?现在是你回报的时候了!

  • **数据来自哪里,如何转换?**确保开始一个产品需求文档(PRD ),以记录数据来自哪里以及您正在应用哪种潜在的转换(以及为什么)。
  • **你实际构建这个仪表盘的所有步骤是什么?**将它添加到 PRD 中——这对你开始另一个项目后接手的同事很有用。
  • **还有其他一些潜在的考虑吗?**使用 beta 测试人员提出的问题(来自步骤 4)建立一个 FAQ,并直接从仪表板链接(可能在 PRD 旁边)。

第六步:发布杰作

你完了!现在是时候走向市场,向世界展示您的非凡作品,并接受祝贺信息了:

  • 向所有相关利益方发送发布电子邮件。确保你写好了发布邮件,你只有一次机会留下第一印象。
  • 考虑组织一次培训。如果仪表盘有点复杂,或者只面向少量用户,那么组织一次培训来确保他们知道如何使用它,并从中获得最大价值可能会很有意思。这也是为将来的迭代收集反馈和/或特性请求的好方法。
  • **确定您的仪表板可被发现。**如果您有一个集中的知识管理系统,请确保您的仪表板是该系统的一部分,并且您已经尽可能地对其进行了优化,以便能够找到它。

步骤 7:验证你的仪表板是成功的

还记得您在步骤 1 中为该仪表板定义的成功标准吗?现在是时候使用它,并了解你是否成功了。您是否获得了预期的用户数量?您的仪表板是否帮助正确的人做正确的事情?如果没有——调查哪里出了问题,要么修复它,要么从中吸取教训。如果是的话——庆祝吧,因为生命太短暂了。

你完了!嗯……暂时的。

因为仪表板是一种有形的产品,应该定期使用,而且一旦发布了仪表板,很多事情都可能出错(例如,目标受众可能会随着时间的推移而改变,一般需求也可能会发生变化,上游数据源可能会更新,等等。)—您应该确保您有适当的流程来维护它并相应地更新它。启动是一回事,确保它长期成功是另一回事(我将在另一篇文章中谈到这一点)…我想请继续关注。)

希望你觉得这篇文章很有见地,我的这篇长文没有让你厌烦。你会在这个清单上添加什么吗?请在评论区告诉我!

感谢阅读!

如果你觉得“有趣”,可以看看我的其他文章:

</7-tips-to-avoid-public-embarrassment-as-a-data-analyst-caec8f701e42>

如何在 BigQuery 中使用 SQL 构建唯一的 MD5 行散列(加上一些相关的东西)

原文:https://towardsdatascience/how-to-build-a-unique-md5-row-hash-using-sql-in-bigquery-plus-a-few-related-things-e6f71820f38b

使用原生 BigQuery 功能在 SQL 中生成动态的、唯一的行标识符

不是那种杂碎。在 Unsplash 上由 Richard T 拍摄的照片

动机

您可能有许多不同的原因想要为 BigQuery 数据集中的每一行数据构建散列,但它们主要与 BigQuery 中没有强制主键这一事实有关。

这意味着您的数据可能包含重复的行,无论是来自上游数据收集或传输错误、错误配置的数据摄取工具,还是仅仅因为意外加载了某个内容两次。

或者别的什么。谁知道呢?

无论重复的来源是什么,你都应该试着理解它们是什么,并可能把它们过滤掉(如果你关心这类事情,也要找出根本原因……仅供参考,你可能应该这样做)。

如果的数据中确实有的重复行,那么一旦你开始应用更复杂的转换(如连接),你就有放大错误并使下游流程、模型和决策无效的风险,这会耗费来之不易的信任,并可能导致其他不可预测的、不想要的结果。

或者也许没人会注意到。那会更好还是更坏?

无论您的数据来自何处,在任何数据质量保证流程(以及数据转换流程)中,确认源数据的每一行都是独一无二的,这始终是一个有价值的步骤,既能让您安心,又能让下游数据消费者和系统放心。

散列函数的一个简化定义是,它是一个从任意字符串输入中输出唯一的固定长度字符串的函数。它实际上比这更专业一点,因为它是一个字节数组,但它的行为像一个字符串,所以这是一个很好的看待它的方式。

需要理解的最重要的几点是:

  • 对输入的任何更改都会导致不同的散列
  • 它只有一种工作方式——您不能从散列中反算输入,但是您可以验证输入是否相同
  • 散列使您能够检查输入是否完全相同,这对于有效的验证非常有用,尤其是在不同的系统之间,因为这样您就可以使用相同算法的特定语言实现

情况

我们将部署一些不同的本地函数和技术,以优雅、简洁和动态的方式解决这个问题。

对于这些例子,我们将使用zoo_elephants表,它包含一些虚构的大象的西瓜年消费量的完全虚构的数据,并且是公共的,因此任何经过身份验证的 BigQuery 用户都可以查询。数据中没有重复项(但我们希望/需要证明这一点)。要检查 BigQuery 控制台中的数据,请执行以下查询:

SELECT *
FROM flowfunctions.examples.zoo_elephants

您将在结果面板中看到数据,带有简单的模式:

animal STRING,
name STRING,
year INT64,
watermelons INT64

解决办法

  1. TO _ JSON _ STRING()

这是一个极其健壮和强大的函数,它(在许多用例中)使您能够向一个公共表表达式添加一列,该表达式是每行的 JSON 表示。要了解其工作原理,请尝试以下查询:

WITH
inbound_zoo_elephants AS (
SELECT *
FROM flowfunctions.examples.zoo_elephants
) SELECT *, 
TO_JSON_STRING(inbound_zoo_elephants) AS row_json
FROM inbound_zoo_elephants

您将看到输出数据现在有一个额外的列,包含数据的 JSON 表示,例如第一行的row_json列包含值:

{"animal":"Elephant","name":"Beepbeep","year":2018,"watermelons":1032}

如果在函数中添加一个true可选pretty_print参数:

TO_JSON_STRING(inbound_zoo_elephants, true) AS row_json

然后你可以把它打印得很漂亮,用换行符来表示行中的数据:

{
"animal": "Elephant",
"name": "Beepbeep",
"year": 2018,
"watermelons": 1032
}

这个输出较长,但更容易阅读,这可能是有用的。然而,在我们的用例中,额外的空白是不必要的。

2。 MD5()

现在对于散列函数…有几个不同的选项,给出不同长度和类型的输出。我们将使用一个简单的 MD5 ,尽管它显然被加密破解,返回 16 个字符,足以满足我们的用例。其他选项有 FARM_FINGERPRINT (返回一个可变长度的有符号整数) SHA1 、 SHA256 和 SHA512 ,分别返回 20、32 和 64 字节,对于密码用例更安全。然而,MD5 显然是最短的一个,因此它占用较少的屏幕空间(加上这不是一个加密用例),所以我们要用它:

WITH
inbound_zoo_elephants AS (
SELECT *
FROM flowfunctions.examples.zoo_elephants
),add_row_json AS (
SELECT *,
TO_JSON_STRING(inbound_zoo_elephants) AS row_json
FROM inbound_zoo_elephants
) SELECT *,
MD5(row_json) AS row_hash
FROM add_row_json

您将看到第一行的row_hash_column值类似于:

xFkt7kQAks91FtJTt5d5lA==

这包含字母数字以及特殊字符,这将有助于我们的目标,但可能会导致其他问题。

例如,您需要三次单击它来选择它,如果您双击它,那么您只会得到第一个特殊字符(在本例中:=)之前的字符串。如果你像我一样,是一个容易犯人为错误的人,这可能是个问题。

继续,试着选择它。然后取消选择它。然后再次选择它。挺烦的吧?

3。 到 _ 十六进制

我们将用来整理这个输出的最后一个函数将把上一步的杂乱的输出转换成一个整洁的十六进制字符串,它本质上是一个包含数字和字母组合的字符串。

WITH
inbound_zoo_elephants AS (
SELECT *
FROM flowfunctions.examples.zoo_elephants
),add_row_json AS (
SELECT *,
TO_JSON_STRING(inbound_zoo_elephants) AS row_json
FROM inbound_zoo_elephants
),add_row_hash AS (
SELECT *,
MD5(row_json) AS row_hash
FROM add_row_json
) SELECT *,
TO_HEX(row_hash) AS hex_row_hash
FROM add_row_hash

执行这段代码,您会看到hex_row_hash列的值类似于:

c4592dee440092cf7516d253b7977994

现在是 32 个可爱的小写十六进制字符。

试着双击它,你会意识到选择它的体验是一种更加人性化的交互。在一生中,这将为您节省大约33%点击选择该选项所需的次数,这相当于更低的错误率和更低的重复性劳损几率。

注意,输出将只包含小写字母,所以如果您特别喜欢大写字母(我没有),那么您可以合理地将TO_HEX行改为:

UPPER(TO_HEX(row_hash)) AS hex_row_hash

这给出了输出:

DCBADCD29D37091C34BAFE4EE114DBA0

然而,这是一个多余的步骤,所以我们不会这样做。另外,我只喜欢对 SQL 关键字使用大写字母,因为我发现用我人类的(也有些蹩脚的)眼睛扫描和理解代码结构更快更容易。

因此,现在公共表表达式结构的查询已经很清楚了,每个 CTE 名称都清楚地描述了它所采取的特定操作:

WITH
inbound_zoo_elephants AS (
SELECT *
FROM flowfunctions.examples.zoo_elephants
),add_row_json AS (
SELECT *,
TO_JSON_STRING(inbound_zoo_elephants) AS row_json
FROM inbound_zoo_elephants
),add_row_hash AS (
SELECT *,
MD5(row_json) AS row_hash
FROM add_row_json
),add_row_hash_hex AS (
SELECT *,
TO_HEX(row_hash) AS hex_row_hash
FROM add_row_hash
)SELECT *
FROM add_row_hash_hex

对于开发和调试来说,这是一个非常有用的结构,但是非常冗长,不太有用。作为第一步,现在我们知道所有的步骤都起作用了,我们可以重构代码,使其更加简洁:

WITH
inbound_zoo_elephants AS (
SELECT *
FROM flowfunctions.examples.zoo_elephants
)SELECT *,
TO_HEX(MD5(TO_JSON_STRING(inbound_zoo_elephants))) AS hex_row_hash
FROM inbound_zoo_elephants

这是较短的,但仍然不可重复使用。让我们把它打包成一个简单的函数,以便在需要的时候快速简单地重用它。

CREATE OR REPLACE FUNCTION `flowfunctions.hash.hex_md5_row_hash`(row_json STRING) 
AS (
TO_HEX(MD5(row_json)) 
);

您可以通过更改project_id(上面代码中的flowfunctions)和dataset_name(代码中的hash)在您自己的项目和数据集中重新创建它。

实际上,我喜欢添加一行描述,以便用户可以就地查看文档,这样可以最大限度地减少任务切换,并添加有价值的本机可用元数据。此外,知道将row_json参数作为TO_JSON_STRING (cte_name)传入也很重要,所以我在描述选项中解释了这一点:

CREATE OR REPLACE FUNCTION `flowfunctions.hash.hex_md5_row_hash`(row_json STRING)
OPTIONS (
description="Returns: [STRING] Hexadecimal encoding of an MD5 hash of the JSON string representation of a row.  The row_json argument should be passed as TO_JSON_STRING(cte_name) where cte_name is the name of a prior common table expression"
)
AS (
TO_HEX(MD5(row_json))
);

太好了!现在在控制台中看起来是这样的:

漂亮整洁。

执行

现在我们可以这样调用函数:

SELECT flowfunctions.hash.hex_md5_row_hash(row_json STRING)

或者镜像前一个查询的语法:

WITH
inbound_zoo_elephants AS (
SELECT *
FROM flowfunctions.examples.zoo_elephants
)SELECT *,
flowfunctions.hash.hex_md5_row_hash(inbound_zoo_elephants) AS hex_row_hash
FROM inbound_zoo_elephants

这可能比前一个版本更冗长,所以您可能实际上只想使用前一个版本,消除不必要的(在本例中)函数依赖:

TO_HEX(MD5(TO_JSON_STRING(inbound_zoo_elephants))) AS hex_row_hash

无论哪种方式,为了实现最终证明数据集中没有重复项的目标,我们需要在查询中再执行一个步骤来比较总行数和唯一行数:

WITH
inbound_zoo_elephants AS (
SELECT *
FROM flowfunctions.examples.zoo_elephants
),add_row_hash AS (
SELECT *,
TO_HEX(MD5(TO_JSON_STRING(inbound_zoo_elephants))) AS hex_row_hash
FROM inbound_zoo_elephants
)SELECT
COUNT(*) AS records,
COUNT(DISTINCT hex_row_hash) AS unique_records
FROM add_row_hash

它返回:

太棒了。

由于records的值与unique_records匹配,我们可以得出结论,每一行都是唯一的。太好了,我们可以继续我们的分析,而不用担心重复及其影响。

实际上,考虑到前面提到的我糟糕的视力,我将添加一个红色/绿色图标,这样我就不需要做任何复杂的心算了:

WITH
inbound_zoo_elephants AS (
SELECT *
FROM flowfunctions.examples.zoo_elephants
),add_row_hash AS (
SELECT *,
TO_HEX(MD5(TO_JSON_STRING(inbound_zoo_elephants))) AS hex_row_hash
FROM inbound_zoo_elephants
)SELECT
COUNT(*) AS records,
COUNT(DISTINCT hex_row_hash) AS unique_records,
CASE 
WHEN COUNT(*) = COUNT(DISTINCT hex_row_hash) 
THEN '🟢' ELSE '🔴' 
END AS unique_check_icon
FROM add_row_hash

唷,现在我不需要在脑子里比较任何数字,绿灯让我知道一切都好:

很好看。

虽然在这样一个简单的例子中使用这种技术显然有点不必要,但实际上它确实有助于在更复杂的查询中快速识别潜在的差异和问题。

以快速可靠的方式检查更多行的列匹配或相似性,而不必离开 BigQuery 控制台工作流,这是一个强大的小生产力提升。小幅度的生产力提升积少成多…

结论

你可能会想:

  1. 这篇文章不应该是关于简单的行散列,而不是行复制测试、固执己见的 SQL 结构断言、无意义的函数开发或让 BigQuery 显示愚蠢的交通灯吗?
  2. 难道你不能用更少的代码,使用不同的 and 联合和子查询之类的东西来实现同样的事情吗?

对此我会回答:

  1. 是啊,我知道。然而,这种看待问题的方式引出了一些相邻的有用的技术,这些技术值得研究,因为它们可以在许多其他方面得到应用。另外,我问你一个问题:你更喜欢哪种类型的旅行……a)直接到达目的地而不分心的旅行,还是 b)到达目的地但沿途发现许多新奇有趣的地方的旅行?
  2. 是啊,管它呢。在生活和代码中,总是有很多方法可以实现任何事情。有些人有缺点,有些人有机会,但大多数人两者都有。实际上,您可能想知道哪些行实际上是重复的,这样您就可以标记和/或过滤和/或用于数据质量保证,这种技术为您提供了这种能力。现在,您还将拥有一个可靠的惟一连接键,它可以充当(非强制)主键。此外,复杂的嵌套子查询和怪异的自连接扭曲可能很快变得无法阅读或直觉,根据SQL 的禅:

TFSQL10.1:可读性计数

写干净的、模块化的、顺序的代码是一个好主意,目标是使它不仅功能性强、效率高,而且易于阅读和理解。不过,我跑题了:

在 BigQuery 中构建唯一行散列的简单方法:

TO_HEX(MD5(TO_JSON_STRING(input_data)))

如果你需要一个如何定义input_data的解释,那么检查上面的TO_JSON_STRING()部分。

如果您觉得这(以及其他相关材料)有用和/或有趣,请跟我来,并查看我的开源项目转换流程以获得更多工具和技术来扩展您的 BigQuery 超能力。

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

如何使用 Python 构建一个 Web 应用程序来转录和总结音频

原文:https://towardsdatascience/how-to-build-a-web-app-to-transcribe-and-summarize-audio-with-python-dc719cb9e1f5

一本实用指南,总结您最喜爱的数据科学 Spotify 播客,并简化它以创建 web 应用程序

来源: flaticon

Spotify 的播客剧集的特点是非常长,这很容易让你沮丧或分散你的注意力。你有没有想过把播客里看起来很吸引人,但你在那一刻的心情总结一下?获取播客的要点并最终说服你听完它可能是个好主意。

在本教程中,我们将构建一个 web 应用程序来转录和总结《裸数据科学》中的一集,该集探讨了不同的数据科学主题,并提供了成为数据科学家的实用技巧。

该应用程序将使用 Streamlit 构建,而 AssemblyAI API 将允许我们转录和总结 Spotify 播客的剧集。首先,这个 API 使用自动语音识别将音频转换成文本,然后生成文本摘要。让我们开始新的冒险吧!

目录

  • 第一部分:转录并总结音频
  • 第二部分:创建 Web 应用

第 1 部分:转录和总结音频

本教程将分为两个部分。第一部分主要展示如何应用 AssemblyAI API 来总结我们播客的内容。在第二部分中,我们将使用 Streamlit 来开发 web 应用程序。这些是以下步骤:

  • 从收听笔记中提取剧集的 URL
  • 发送转录请求
  • 检索转录和摘要

1.从收听笔记中提取剧集的 URL

Listen Notes 是一个强大的播客搜索引擎和在线数据库,提供访问播客数据的 API,并允许基于它构建新的服务和应用。在本教程中,我们将使用 Listen Notes API 从我们的目标播客中检索该集的 url。

  • 首先,您需要创建一个帐户来检索数据,并订阅免费计划来利用 Listen Notes API。有了这个计划,你每个月最多可以有 300 个请求,这足够你处理个人项目了。
  • 然后,在 Listen Notes 中进入播客的页面,点击你感兴趣的剧集,选择“使用 API 获取该剧集”。
  • 之后,您可以将语言代码更改为 Python,并从选项列表中单击 requests,以便以后使用库请求。
  • 复制代码并将其粘贴到您的笔记本/脚本中。

我们正在向 Listen Notes Podcast API 的端点发送一个 GET 请求,这是一个从 Listen Notes API 检索数据的策略操作。最后,我们将最终输出保存为一个 JSON 对象,其中还包括以后需要的剧集的 URL。

我们还导入了一个 JSON 文件,名为 secrets.json ,它非常类似于一个字典,因为它由一组键值对组成。它需要包含分别用于 AssemblyAI 和 Listen Notes 的 API 键。您需要在您的帐户中访问它们。

{
"api_key":"<your-api-key-assemblyai>",
"api_key_listennotes":"<your-api-key-listennotes>"
}

2.发送转录请求

我们现在向 AssemblyAI 的转录端点发送一个 POST 请求,而不是发出一个 GET 请求。post 方法用于将音频 URL 上传到程序集 AI。

这一步对于获取转录和摘要是很重要的,如果我们设置 auto_chapter 等于 True,那么就包含了转录和摘要。如果我们将 auto_chapter 设置为 False,我们将只获得转录。之后,我们保存转录反应的 id。

3.检索转录和摘要

最后,我们可以通过向 Assembly AI 发送 GET 请求来获得转录和摘要。在响应状态完成之前,我们需要发出一些请求。稍后,我们将结果保存到两个不同的文件中,一个 txt 文件用于转录,一个 JSON 文件用于摘要。

最重要的步骤已经完成。我们可以查看摘要:

[
    {
        "summary": "Having a big bang is one of the most common causes of data science project failures. This episode explains why it's better to aim for suboptimal solutions at the start of a project and how you can avoid the big bang problem by following an ancient Japanese philosophy.",
        "headline": "Having a big bang is one of the most common causes of Data science project failures.",
        "gist": "Avoid the big bang problem.",
        "start": 2110,
        "end": 37530
    },
    {
        "summary": "This week we are going to talk about another mental model that we found very useful in our experience leading data science projects and teams. It's common to see in business when you start approaching a data intensive problem data initial planning, and then you have some initial directions to go with the root cause. Could be that when you ask a good problem solver or people who are interested in problem solving to find a solution for something, we often want to go for the best solution that there is.",
        "headline": "This week we are going to talk about another mental model that we found useful in our experience leading data science projects and teams.",
        "gist": "The problem model model.",
        "start": 41790,
        "end": 200986
    },...}]

第 2 部分:创建 Web 应用程序

现在你已经能够理解转录和总结播客的主要部分,我们可以切换到第二部分。目标是用 Streamlit 创建一个应用,这是一个免费的开源框架,允许使用 Python 用几行代码构建应用。

在第一行代码中,我们只是导入 python 库并定义函数,这些函数重现了前面显示的步骤。此外,我们还创建了一个 zip 文件,其中包含带有转录的文件和带有摘要的文件。

现在,我们可以定义应用程序的主要部分。首先,我们使用st.markdown显示应用程序的主标题。在我们创建了一个左侧面板工具条之后,使用st.sidebar来输入我们发布的剧集 id。插入 id 后,我们点击“提交”按钮。

在我们按下按钮后,应用程序将执行所有步骤来转录和总结该集的音频。几分钟后,结果将显示在网页上。如果您想下载输出,可以使用 download 按钮,将转录和摘要保存到 zip 文件中。

编写完所有代码后,可以将其保存到文件 summ_app.py 中,并在终端上使用以下命令行运行代码:

streamlit run summ_app.py

自动返回本地 URL 和网络 URL。你可以点击其中一个链接,瞧!现在,你有一个了不起的应用程序,转录和总结你最喜欢的播客!

应用程序的完整代码

为了更好地理解,最好显示 web 应用程序使用的所有代码。

最终想法:

我希望这篇教程对开始使用 AssemblyAI 和 Streamlit 有用。在这个案例研究中,它被应用于转录播客的音频。这里的 GitHub 代码是。还有很多其他可能的应用,比如 zoom 通话,youtube 视频。更多信息,请查看 AssemblyAI 官方网站的文档及其 youtube 频道。感谢阅读。祝您愉快!

其他相关文章:

你喜欢我的文章吗? 成为会员 每天无限获取数据科学新帖!这是一种间接的支持我的方式,不会给你带来任何额外的费用。如果您已经是会员, 订阅 每当我发布新的数据科学和 python 指南时,您都会收到电子邮件!

如何使用通过多功能数据工具包获取的数据构建 Web 应用程序

原文:https://towardsdatascience/how-to-build-a-web-app-with-data-ingested-through-versatile-data-kit-ddae43b5f62d

数据库,网络应用

关于如何构建 Web 应用程序的分步教程,结合了 Streamlit Python 库和多功能数据工具包。

图片由 Unsplash 上的 Taras Shypka 拍摄

在过去的几个月里,我参与了一个非常有趣的项目,叫做多功能数据工具包(VDK)。VDK 是一个非常强大的框架,用于在数据库中接收不同格式的数据,包括 CSV 文件、JSON 对象,甚至 REST API 服务提供的数据。

VDK 兼容几种类型的数据库,包括但不限于 sqlite、Trino DB、Impala、Postgres 和 Snowflake。

VDK 由 VMware 实施,是一款开源软件。更多信息可以参考官方 VDK Github 库。

在我以前的文章中,我描述了 VDK 的不同方面,包括:

  • 如何开始使用 VDK
  • VDK 和 Trino DB 如何组合
  • 如何从 REST API 摄取数据。

在本文中,我将描述如何使用通过 VDK 存储的数据来构建一个基于 Streamlit 的 web 应用程序,Streamlit 是一个流行的 Python 库,用于快速轻松地构建网站。

您可以在页面底部找到与本文中描述的示例相关的完整代码。

要配置环境以使用 VDK,您可以参考以前的文章。

文章组织如下:

  • VDK 概况
  • 场景的定义
  • VDK 的数据接收
  • VDK 的数据处理
  • 构建 Streamlit 应用程序。

1 VDK 概述

通用数据工具包(VDK)是一个框架,允许您开发,部署,运行和管理数据作业。**数据作业是一种数据处理工作量。**您可以定义两种类型的数据作业:

  • 摄取作业,将不同来源的数据推送到数据湖。通常,通过接收作业,您接收由数据提供者提供的原始数据。
  • 处理已经包含在数据湖中的作业,您可以在其中操作您的数据。这个想法是建立精选的数据集,你可以用它来做进一步的分析。

关于 VDK 的更多细节,你可以阅读我以前的一篇文章,题为多功能数据工具包概述。

2 场景的定义

此场景的目标是构建一个显示美国天然气价格和温度之间关系的应用程序。

该应用程序使用 VDK 来摄取和处理以下两个 CSV 数据集:

  • 1997-2020 年天然气价格
  • 【1910 年至 2020 年美国气候极端指数

天然气价格数据集包含 5,953 条记录,由美国能源信息管理局(EIA)提供。每个记录包含天然气的每日价格。对于每条记录,以下信息可用:

  • 日期(每天提供)
  • 价格(美元)

下表显示了数据集的摘录:

作者图片

美国极端气候指数数据集包含 112 条记录。对于每条记录,可以下载许多参数。数据分析师选择以下信息:

  • 日期(每年提供一次)
  • 远高于正常的最低温度百分比
  • 远低于正常的最低温度百分比。

下表显示了数据集的摘录:

作者图片

要运行此示例,您需要:

  • 多功能数据工具包
  • Trino DB
  • Trino 的多功能数据工具包插件
  • 细流

有关如何为 Trino 安装多功能数据套件、Trino DB、Streamlit 和多功能数据套件插件的更多详细信息,请参考此链接。

3 VDK 的数据接收

数据摄取上传到 CSV 文件的数据库输出中,如前一节所述。对于每个数据集,通过以下步骤执行数据接收:

  • 删除现有的表(如果有)
  • 创建新表格
  • 直接从 CSV 获取表格值。

前面的所有步骤构成了一个数据摄取作业。

要访问 CSV 文件,此示例需要有效的互联网连接才能正常工作。例如,我只考虑第一个数据集(天然气价格),但对于其他数据集,过程是相同的。

3.1 删除现有表格

我将这一步写成一个 SQL 命令,如果表存在的话,就删除它:

DROP TABLE IF EXISTS natural_gas_prices

3.2 创建新表

现在,我定义了一个新步骤,该步骤创建了一个新表,其中将包含 CSV 文件:

CREATE TABLE natural_gas_prices (
   Date varchar,
   Price double
)

3.3 摄取值

为了从 CSV 获取值,我定义了一个 Python 脚本,它将 CSV 文件作为熊猫数据帧读取,然后通过 VDK 提供的send_tabular_data_for_ingestion()方法获取它:

def run(job_input: IJobInput): url = "https://datahub.io/core/natural-gas/r/daily.csv"
   df = pd.read_csv(url) job_input.send_tabular_data_for_ingestion(
       df.itertuples(index=False),
       destination_table="natural_gas_prices",
       column_names=df.columns.tolist(),
   )

4 VDK 的数据处理

数据处理包括两个步骤:

  • 用天然气价格的平均值构建年度视图natural_gas_prices
  • 合并两个表,前一个和climate_extremes_index

4.1 建筑年景

要构建年度视图,只需操作natural_gas_prices表,如下所示:

CREATE TABLE average_gas_price_by_year AS(SELECT extract(YEAR from CAST(Date AS date)) AS Year,
   avg(Price) AS Price
   FROM natural_gas_prices.  
   GROUP BY extract(YEAR from CAST(Date AS date))
)

因此,我创建了一个新表,名为average_gas_price_by_year

下表显示了生成的表的示例:

作者图片

4.2 合并两个表

最后一步,我合并了两个表climate_extremes_index(从第二个 CSV 文件中提取的表)和average_gas_price_by_year。值在区间[0,1]中被归一化,从而使它们之间的比较成为可能。

CREATE TABLE merged_tables AS(SELECT Year,(Price / (SELECT max(Price) FROM average_gas_price_by_year)) AS NormPrice,(MuchAboveNormal / (SELECT max(MuchAboveNormal) FROM climate_extremes_index WHERE CAST(climate_extremes_index.Date AS integer) IN (SELECT Year from average_gas_price_by_year))) AS NormTemperatureMuchAboveNormal,(MuchBelowNormal / (SELECT max(MuchBelowNormal) FROM climate_extremes_index WHERE CAST(climate_extremes_index.Date AS integer) IN (SELECT Year from average_gas_price_by_year))) AS NormTemperatureMuchBelowNormalFROM average_gas_price_by_year INNER JOIN climate_extremes_indexON average_gas_price_by_year.Year = CAST(climate_extremes_index.Date AS integer))

在前面的查询中,对于 select 中的每个字段,除了Year,我按照最大值对字段进行规范化。为了获得字段的最大值,我构建了另一个内部查询。

5 构建 Streamlit 应用

现在我已经准备好构建最终的应用程序了。首先,我导入所有需要的库:

import altair as alt
import numpy as np
import pandas as pd
import streamlit as st
import trino

我将使用altair构建一些图表,并使用trino连接到 Trino 服务器。

现在,我连接到服务器:

conn = trino.dbapi.connect(
   host="localhost",
   port=8080,
   user="root",
   catalog="mysql",
   http_scheme="HTTP",
   verify=True,
   schema="energy",)

我写了一篇减价文,题目是:

st.markdown("# Does the Natural Gas Price in the US depend on the temparature?")

现在,我从数据库中读取数据:

df = pd.read_sql_query(f"SELECT Year, NormPrice, NormTemperatureMuchAboveNormal, NormTemperatureMuchBelowNormal FROM merged_tables",conn,)

我制作了这张图表:

palette = ["#ff9494", "#ff5252", "#8B0000"]indicators = ["NormPrice", 
"NormTemperatureMuchAboveNormal",
"NormTemperatureMuchBelowNormal",
]price_bar = (alt.Chart(df)
   .mark_bar(size=30)
   .encode(x="Year:O", y="NormPrice:Q", color=alt.value("#8B0000"))
)temp_list = ["MuchAboveNormal", "MuchBelowNormal"]
temp_type = st.selectbox("Select Temperature", temp_list, key="temp_type")temp_line = (
   alt.Chart(df)
   .mark_line()
   .encode(x="Year:O", y=f"NormTemperature{temp_type}:Q", color=alt.value("#ff9494")))c = (price_bar + temp_line).properties(height=350, width=800)
st.altair_chart(c)

最后,我从终端运行应用程序:

streamlit run dashboard.py

下图显示了最终输出:

作者图片

摘要

在本文中,我描述了如何将 VDK 与 Streamlit 集成来构建一个 Web 应用程序。首先,我在 VDK 下载、消化和处理数据,然后我在 Streamlit 中构建了 Web 应用程序。

你可以在 VDK 官方 Github 库中的 examples 一节下找到这个例子的完整代码。

对于多功能数据工具包的问题或疑问,您可以直接加入他们的公共 slack workspace 或他们的邮件列表或在 Twitter 上关注他们。

相关文章

如何打造一个 AI 服装设计师

原文:https://towardsdatascience/how-to-build-an-ai-fashion-designer-575b5e67915e

基于 StyleGAN 和 GANSpace 的服装语义编辑

ClothingGAN 演示[图片由作者提供]

概观

这是我的老项目clothing an的一篇报道。该项目使用 StyleGAN 用 AI 生成服装设计,并使用袖子、尺码、连衣裙、夹克等属性对其进行语义编辑。您也可以如上图所示进行风格转换,首先生成 2 个不同的服装设计(输出 1),使用不同的种子编号。然后,它将生成第三个设计(输出 2),该设计混合了前两个设计。然后,您可以调整希望它从两个原始设计中继承多少风格或结构。

你可以试试这里的演示,这里是源代码(随意开始回购)

概述

  • 灵感
  • 我是如何建造的
  • 训练风格 GAN 模型
  • 用 GANSpace 进行语义编辑
  • 用 Gradio 构建 UI
  • 部署到巨大的空间

灵感

GAN 或生成对抗网络是一种生成模型,它能够通过学习大型图像数据集的概率分布来生成图像。我总是觉得 GANs 很吸引人,因为它使我能够创作出高质量的艺术或设计,即使没有绘画方面的技术或艺术技巧。最近在 GAN 上看到很多人脸编辑演示,但在其他数据集上很少看到语义操纵。因此,我创建了 ClothingGAN 应用程序,你可以与人工智能合作设计衣服,而不需要很高的技术专业知识。

我是如何建造的

第一步,要有一个可以生成服装的生成模型。我没有设法找到一个公共模型,可以产生一个体面的质量图像,因此我决定用样式训练我自己的甘服装模型。然后我使用 GANSpace,一种基于潜在空间的语义编辑方法,来提供编辑功能。它在 GAN 潜在空间中找到重要的方向,这些方向可能代表某些视觉属性,然后我手动标记这些属性。最后,我使用 Gradio 库构建了演示界面,并将其部署到 HuggingFace 空间。

训练风格 GAN 模型

我使用了 StyleGAN2-ADA[2]模型,因为在项目进行的时候,最新的 StyleGAN 模型是 StyleGAN2-ADA 模型。但是,您可能希望使用当前最新版本 StyleGAN3。虽然我不确定 StyleGAN3 与我的方法或我正在使用的其他库有多兼容。

为了训练模型,我使用了由dong eun Yoo在PixelDTGAN【1】论文中创建的服装数据集。该数据集具有 84,748 幅图像,包括 9,732 幅具有干净背景的上部服装图像,这些图像与剩余的 75,016 幅时装模特图像相关联。我只使用了背景干净的服装图片。因此,用于训练 StyleGAN 模型的总图像大约是分辨率为 512×512 的 9k 图像。这是作者网站上分享的数据集的链接。PixelDTGAN 论文受麻省理工学院许可。

LookBook 数据集一览[图片由作者提供,数据集由 PixelDTGAN[1] 提供]

我不会讨论如何训练模型的具体步骤,因为我之前已经就这个主题写了一篇文章。只需对所选数据集执行相同的步骤。

这是训练后的结果。

由训练模型生成的设计的样本和插值[图片由作者提供]

用 GANSpace 进行语义编辑

语义图像编辑是在给定的源图像中修改语义属性(例如样式或结构)的任务。例如,修改一个人的头发颜色,同时保留这个人的身份。图像编辑的应用范围很广,从照片增强、用于艺术和设计目的的风格处理到数据扩充。语义图像编辑通常有两个目标:允许同时对多个属性进行连续操作,并在保持图像真实性的同时尽可能多地保留源图像的身份。

现有的使用 GANs 的语义图像编辑方法可以主要分为图像空间编辑或潜在空间编辑。图像空间编辑学习直接将源图像转换成目标域中的另一图像的网络。这些方法通常只允许二进制属性改变,而不允许连续改变。这些方法的例子有 pix2pix、StarGAN 和 DRIT++等。

相反,潜在空间编辑通过操纵跨越 GAN 模型的潜在空间的输入向量来间接操纵图像。这些方法主要集中于在潜在空间中寻找代表生成图像的语义属性的路径。在这些路径中导航输入向量允许连续编辑属性。

无监督、自我监督和监督的潜在空间编辑方法都已被提出。gan space【3】在潜在或特征空间中使用主成分分析(PCA)以无监督的方式寻找重要方向。使用闭型因子分解也可以类似地找到重要方向(来自 SeFa 论文)。自监督方法也能够在没有标签的情况下找到这些方向,因为它们生成自己的标签,但是通常受限于几何属性,例如旋转或缩放。另一方面,像 InterfaceGAN 这样的监督方法需要标签信息或方法的属性分类器。

GANSpace[3] 讨论了预训练的 GAN 模型在对生成的图像进行造型时的使用。GAN 模型学习将噪声分布 z 映射到图像分布的函数。因此,给定不同的噪声输入 z,产生的输出将会不同。然而,深度学习模型通常是一个黑箱,它并不明确知道噪声输入和生成的输出之间的关系,因此无法明确控制输出。然而,GAN 模型可以被调整为在给定类标签的情况下生成特定的类输出,如条件 GAN 中所研究的。然而,在训练期间,需要数据集的标签信息来调节 GAN 模型,这对于某些情况可能是不可行的。

另一方面,GANSpace 的论文[3]提出,可以在 z 潜在空间中找到某些重要的方向,z 潜在空间表示生成的输出中的已知语义概念,例如输出的风格。为了找到这个方向,对于几个样本观察中间层中的激活,并且从中间网络激活空间中的值计算 PCA 方向 v。然后,方向 v 将被转移以在 z 潜在空间中找到对应方向 u。整个过程如下图所示,取自 GANSpace 的论文。

在 GAN 潜在空间中识别 PCA 方向的 2D 图解[来源: GANSpace 论文[3]

可以在不同层中计算重要方向 u,并且每层中的方向可以表示不同的语义概念。在早期层中找到的方向通常表示高级特征,如布料结构,而在最后几层中找到的方向通常表示低级特征,如光照或颜色。通过在这些已知的方向上操纵噪声输入 z,我们可以将生成的输出操纵到期望的特征。下图显示了在不同 GAN 模型中应用 GANSpace 方法时的操作结果。

GANSpace 的结果是不同的模型。[来源:甘斯佩斯论文[3]

在训练好的模型中寻找方向

这里将显示的代码是在 Google Colab 上测试的,你可以跟随我的笔记本或者在你自己的环境中,但是如果你跟随 Colab 环境之外的环境,确保你的环境有预先安装在 Colab 中的依赖项。

如果你想跟随,这是教程笔记本

首先,我们需要安装 GANSpace 所需的依赖项。

!pip install ninja gradio fbpca boto3 requests==2.23.0 urllib3==1.25.11`

运行完代码后重启运行时,然后克隆 GANSpace repo。

!git clone https://github/mfrashad/ClothingGAN.git%cd ClothingGAN/

运行以下代码进行进一步设置。确保您位于 GANSpace 文件夹中。

!git submodule update --init --recursive!python -c "import nltk; nltk.download('wordnet')"

接下来,我们必须修改 GANSpace 代码来添加我们的定制模型。对于 StyleGAN2,我们需要模型文件的 PyTorch 版本。因为我们的 StyleGAN 模型文件在 Tensorflow 中。pkl 格式,我们需要用 rosinality 做的转换器把它改成 pytorch 格式。pt 文件。只要按照这个笔记本里的步骤就可以了。(该项目是在正式的 StyleGAN2 PyTorch 版本实现之前完成的,如果您的模型文件已经存在,您可以跳过这一部分。pt 或 Pytorch 格式)。

接下来,回到 GANspace 文件夹,修改models/wrappers.py来添加我们的模型文件。首先,转到 StyleGAN2 类,在config变量中添加我们的模型名称和输出分辨率。

我在 models/wrappers . py[Image by Author]的第 117 行的配置变量中添加了分辨率为 512x512 的“lookbook”模型

接下来,再向下滚动一点,在checkpoints变量中添加到模型的链接。要生成到我们模型的链接,只需将模型文件上传到 Google drive,并使用这个站点生成到它的直接链接。

我在 models/wrappers.py 文件的第 149 行添加了一个新的生成器模型“lookbook”

将模型添加到文件中之后。运行visualize.py c 脚本进行 PCA,并在向计算出的主成分方向移动输入时可视化视觉变化。

用于 PCA 和可视化变化的命令[图片由作者提供]

--use_w选项意味着我们将操纵中间潜在代码w,而不是 StyleGAN 中的原始潜在代码znum_components是指定你想保留多少个方向或主成分。最大组件将是 512 或输入zw尺寸。--video选项是在主成分方向上移动时生成视觉变化的视频,而不仅仅是生成图像。该脚本可能需要大约 30 分钟才能完成。

一旦完成,它将在 out 文件夹中生成可视化的更改。对我来说,它在out/StyleGAN2-lookbook文件夹下。

生成的可视化输出[图片由作者提供]

我们将看一下style/ipca/summ/components_W.jpg,因为它可视化了前 14 个主要组件。

前 14 个主成分的可视化[图片由作者提供]

从上图中,我们可以开始选择要放入演示中的主要组件,并给它们贴上标签。例如,在我看来,C0 可以标记为袖长,C1 为夹克,C2 和 C3 为外套,C4 和 C5 为服装的亮度,C6 为较短的服装。

您还可以在附加文件sampX_real_W.jpg中看到不同样本的可视化,以确保由主成分引起的变化在不同样本之间保持一致。还有 9 个额外的样本是由visualize.py脚本生成的。

这是另一个例子的可视化。

不同样本的主要成分的可视化[图片由作者提供]

你可以看到,即使是不同的样品(袖长为 C0,夹克为 C1 等),变化也大致一致。

此外,您还可以在compinst文件夹中看到每个组件的可视化视频。主成分本身以.npz的格式保存在cache/components/文件夹中

计算出的主成分文件的位置[图片由作者提供]

一旦我们有了组件,我们就可以开始构建演示 UI 了。

用 Gradio 构建 UI

Gradio 是一个 python 库,它使得用几行代码构建 ML 项目的 UI/demo 变得极其容易。下面是 Gradio 有多简单的一个例子:

示例代码和使用 Gradio 生成的应用程序[图片由作者提供]

当你想把你的 ML 应用程序演示成一个单一的函数时,Gradio 是合适的。

首先,我们需要将发电机模型和主要组件加载到内存中。

然后,我们将定义一个效用函数来操作指定方向的w输入,并使用生成器生成图像。

最后,我们可以定义主函数generate_image并使用 Gradio 库为该函数构建 UI。

这就是结果!

带有 Gradio 的演示用户界面[图片由作者提供]

Gradio 还将提供一个链接,您可以在那里分享您的朋友或任何人都可以尝试演示。然而,演示的主机并不是永久的,Colab 服务器被限制在 12 或 24 小时后才会自行终止。对于永久托管,您可以简单地在云中或您自己的服务器上运行代码。但幸运的是,拥抱脸创造了 Spaces ,一个你可以简单上传你的 ML 应用并永久免费托管的平台(如果你想要 GPU 需要付费)。此外,它与 Gradio 和 Streamlit 完美集成,开箱即用。

部署到巨大的空间

首先,前往空间并登录/注册您的帐户。然后单击“创建新空间”。

拥抱脸空间主页[图片由作者提供]

然后,选择您想要的名称和许可证,并选择 Gradio 作为 space SDK。

创造新空间[作者图片]

接下来,克隆拥抱脸回购。

[图片由作者提供]

就我个人而言,在推送回购时,我遇到了一个身份验证问题,我不得不使用令牌作为身份验证方法,方法是将远程 URL 设置为:

https://HF_TOKEN@huggingface.co/spaces/mfrashad/Test

或者你也可以在 URL 中使用你的拥抱脸账户的用户名和密码进行认证。

https://HF_USERNAME:PASSWORD@huggingface.co/spaces/mfrashad/Test

一旦克隆完成,我们就可以开始创建演示所需的文件。在 Spaces repo 中需要 3 个重要的文件:requirements.txt指定要与pip install一起安装的所有 python 依赖项,packages.txt指定要与apt install一起安装的依赖项,以及包含 Gradio 演示代码的主 python 文件app.py

此外,您需要使用 git-lfs 将任何二进制文件上传到 repo,例如图像。

所以我所做的只是将我们在 Colab 中的所有代码复制到 Spaces repo 中。删除图像、二进制文件和演示不需要的文件。把我们笔记本里所有的 python 代码放到一个 python 文件app.py里。然后创建requirements.txtpackages.txt。一旦完成,简单地git push和瞧!该演示将在拥抱脸空间提供给任何人尝试(假设你没有任何错误)。

关于代码的完整内容,你可以查看clothingan Space repo中的文件。

您的共享空间演示将显示在您的个人资料和共享空间主页上[图片由作者提供]

恭喜你!你设法一直读到这一点,并希望设法做好一切。对于更多的挑战,您可以尝试训练自己的 StyleGAN 模型,并应用语义编辑。例如,我也将相同的方法应用于角色和时装模型的生成。

你可以在这里试试 CharacterGAN 的试玩。

字符生成和语义编辑[图片由作者提供]

如果你喜欢阅读这样的教程,并希望支持我成为一名作家,可以考虑注册成为一名媒体会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金。

https://medium/@mfrashad/membership

另外,看看我的其他故事。

参考

[1] Yoo,d .,Kim,n .,Park,s .,Paek,A. S .,& Kweon,I. S. (2016 年 10 月)。像素级域转移。在欧洲计算机视觉会议(第 517–532 页)。斯普林格,查姆。

[2]t . Karras,m . Aittala,j . hells ten,Laine,s .,Lehtinen,j .,& Aila,T. (2020 年)。用有限数据训练生成性对抗网络

[3]哈尔科宁、赫茨曼、莱蒂宁和巴黎(2020 年)。Ganspace:发现可解释的 gan 控制。神经信息处理系统的进展33 ,9841–9850。

如何从零开始建立一个情感语调分析器

原文:https://towardsdatascience/how-to-build-an-emotional-tone-analyzer-from-scratch-ea286b8ee4de

如何构建一个高性能的情感语调分析器来与 IBM Watson 竞争,而无需支付每 API 交易费用

吴怡在 Unsplash 上拍照

介绍

在最近的一篇文章中,我展示了如何使用 IBM Watson 的“声调分析器”,它可以将文本的情感分析直接嵌入到用 Python(或其他语言)编写的机器学习应用程序中。

本文继续开发和解释 Python 代码,探索与一个虚构的在线女装零售商的客户反馈相关的开放许可数据集,使用 tone analyzer 预测客户写评论时的情绪。

在结论中,我注意到 IBM Watson 的免费定价计划将客户限制在每月 2,500 个 API 调用,如果我选择对所有 23,000 个数据点执行代码,那么它们的计量成本将是 202 美元(~ 149 美元),并且代码运行将花费大约 4 个小时。

当我思考 IBM Watson Tone Analyzer 的利与弊时,我开始思考如何自己编写类似的东西,对客户在编写自由文本格式反馈时的情绪做出有用的预测,但这样会执行得更快,并避免大型数据集的交易成本。

本文的其余部分解释了我如何从头开始构建一个情感语调分析器,以及它与 IBM Watson 服务的比较。

构建情感语调分析器

1.获取一些数据

首先要做的是获得一些数据来再次构建和测试,我已经选择重用开放许可女装在线零售数据集(https://www . ka ggle . com/nica potato/women-ecommerce-clothing-reviews)。

这些数据是在“CC0:公共领域”许可下授权的,这意味着“你可以复制、修改、分发和执行这些作品,即使是出于商业目的,都无需征得许可”(详见 https://creativecommons/publicdomain/zero/1.0/)

作者图片

我使用的数据集是第一篇文章的输出数据集,该文章对 2000 行进行了采样,然后使用 IBM Watson API 调用的每月免费配额来返回客户体验的主要情绪(Emotion)和一个指示该情绪有多强烈的分数(Emotion Score)。

我还将数据集的副本放入df_reviews_raw中,以便稍后进行比较。

2.分为培训和验证/坚持

这里,我选择以 80/20 的比例对两个数据帧进行采样,而不是采用更常见的方法返回 4 个 numpy 数组(X_train, y_train, X_test, y_test = train_test_split(df_reviews, test_size=0.2, random_state=42))。

原因是,稍后我需要将评论“矢量化”成一组新的特征,如果将训练和测试数据保留为 DataFrame 而不是 numpy 数组,这将更容易做到。

最后,分割的数据帧被深度复制,以避免在我们开始向分割的数据帧添加新特征时会发生的SetWithCopyWarning

训练数据将用于 k-fold 交叉验证,有效地充当训练和测试数据,而验证/排除数据将在建模结束时用于判断性能和避免过度拟合。

3.重新平衡培训数据

Joy        0.901569
Sadness    0.082026
Anger      0.008559
Fear       0.007846
Name: Emotion, dtype: float64

数据严重不平衡,超过 90%的数据被归类为“快乐”情绪。在开发过程中,我尝试了让数据不平衡或重新平衡,重新平衡产生了一个模型,该模型对拒不合作的数据集表现得更好,因此数据需要重新平衡…

这段代码对数据进行了重新采样,提供了与原始数据帧相似的行数,但对 4 种情绪进行了平均采样

Anger      350
Fear       350
Joy        350
Sadness    350
Name: Emotion, dtype: int64

4.特征工程

下一步是使用TfidfVectorizer对评论文本进行矢量化。这是通过分析文本中与目标变量相关的单字(单个单词)和双字(两个连续单词的组合)来实现的。

然后可以手动检查这些 ngrams,看它们是否有意义,然后将其附加到数据上,以提供可用于预测性机器学习分类算法的数字特征。

TfidfVectorizer已经被安装和改造。这意味着作为一个模型,TfidfVectorizer已经被构建为使用训练数据来驱动一组预测,然后生成(转换)的数据已经从模型返回。

看一看已经产生的东西就更容易理解了

作者图片

我们的训练数据中的 1400 行中的每一行都有一组 300 个标记化的单词(标记化只是用唯一的数字或标记替换英语单词的过程)。

这 300 个单词中的每一个都有一个值,表明它在评论文本中使用了多少。

5.评估特征工程

从这里开始,我们只需要一小段代码来看看哪些英语单词和单词与 4 种情绪最相关,这将提供一个常识性的检查,以确定该方法是否有效…

Joy:
Most correlated unigrams: fits, great, comfortable, got, true, nice, pounds, love, perfect, bad, length, lay, petite, much, disappointed, across, pulled, though, bust, skirt
Most correlated bigrams: true size, runs slightly, need wear, dry clean, fabric bad

Sadness:
Most correlated unigrams: wanted, sad, disappointed, get, saw, like, pounds, great, wore, love, lay, size, even, much, material, received, first, would, across, still
Most correlated bigrams: need wear, runs slightly, going back, fabric bad, pounds usually

Fear:
Most correlated unigrams: across, pulled, shoulders, fear, squareapple, underlayer, types, si, narrow, done, space, slightly, romper, different, way, vest, chest, part, glad, guess
Most correlated bigrams: runs slightly, types fabric, small athletic, little short, space arms

Anger:
Most correlated unigrams: problem, strike, flat, pounds, idea, dressy, purchased, deep, zipper, mentioned, small, shows, appears, reviewers, lay, sheer, reviews, pants, cami, pink
Most correlated bigrams: need wear, pounds usually, reviewers mentioned, sale price, runs slightly

这看起来很合理。与快乐、悲伤、恐惧和愤怒相关联的单词看起来确实可信。当“轻微跑动”出现在快乐、悲伤和恐惧中时,二元模型看起来不太合理。

总的来说,我们拥有的似乎是一组合理的数据,可以进入预测模型构建阶段。

6.建立模型

6.1 选择 X 和 y(特征和目标)数据

在开发期间,我确实尝试构建了一个仅使用矢量化单词的模型,但是我发现,如果我将Review RatingReview Polarity作为特征包括在内,那么针对验证/保留集的性能就会提高,这就是将这些列应用于带有df_reviews_train.iloc[:,[3,5]的矢量化单词的原因。

6.2 超参数调谐

RandomForestClassifier(bootstrap=False, max_depth=40, max_features='sqrt', min_samples_split=5, n_estimators=200, random_state=42)

TUNED_HYPER_PARAMS_500字典包含我在开发过程中通过在 5 个数据折叠上执行 500 次迭代的RandomizedSearchCV确定的超参数,因为 2500 次拟合需要相当长的时间,所以我从文章中省略了这一点,只使用了最佳参数。要了解全部细节,请查看 GitHub 项目。

7.评估模型

7.1 根据培训和测试数据进行评估

初始评估是通过将训练数据分成 5 个部分,并使用每个部分作为训练/测试集来评估模型的准确性…

作者图片

使用混淆矩阵来可视化性能也是有用的。如果你对如何为 k 倍交叉验证建立混淆矩阵的完整解释感兴趣,我已经在另一篇文章中解释了细节

https://grahamharrison-86487.medium/how-to-plot-a-confusion-matrix-from-a-k-fold-cross-validation-b607317e9874

作者图片

k 倍交叉验证的平均准确度为 0.9835714285714285,非常高。混淆矩阵显示,实际上是“快乐”的 17 个数据点被预测为“悲伤”,但除此之外,预测看起来确实非常好。

“恐惧”和“愤怒”是 100%准确的,这看起来很可疑。这可能是因为训练数据中非常少的数量或数据点被分类为恐惧和愤怒,并且已经被向上采样,所以这些记录中的变化非常小,这使得算法很容易以高精度进行预测。

这表明有必要根据包含 4 种情绪(包括罕见情绪)原始比例的验证/拒绝数据来评估绩效。

7.2 根据验证/拒绝数据进行评估

请注意,该模型现在适用于完整的 X_train 和 y_train 数据集。这是因为 k-fold 交叉验证使模型适合 5 个数据集,每个数据集占训练数据的 80%。

针对 100%的训练数据而不是 80%的训练数据完成拟合极有可能产生更准确的模型。

作者图片

相对于验证/保留集的准确度是 90.32%,这并不坏,但不幸的是,由于数据集如此不平衡,仅仅猜测每个记录的“Joy”将是具有 92.3%准确度的粗糙模型。

尽管原始模型的 f1 分数会更低,但无论如何,本文的重点是演示如何从头开始构建情感语调分析器。这种方法是合理的,只是如果选择的源数据不那么不平衡,性能会好得多。

8.将预测添加到数据集

记住 IBM Watson 的输出,它产生了两个特性

  • 主要情绪
  • 主要情感的得分

下面的代码通过将这些功能添加到验证/保留数据中,然后执行手动、直观的检查来查看它们是否合理,从而模拟该功能。

下面的代码添加了这些功能。应当注意的是,model.predict_proba(X_val)返回 shape (351,4)的 numpy 数组,即验证数据中的每条记录 1 行,4 列-4 种情绪中的每种情绪 1 列,其值等于每种情绪的概率。

由于期望的结果是主要情绪的分数,因此ALPHABETICAL_EMOTION_MAPpd.Series(predicted_classes).map(ALPHABETICAL_EMOTION_MAP).to_numpy()建立映射,以提取每行上预测情绪的分数。

作者图片

从快速,视觉检查,它看起来都很合理。第一个记录被 IBM Watson 预测为 0.796461 的“Joy”,被 scratch-build tone analyzer 预测为 0.777917 的“Joy”。所有前 10 个记录看起来都很合理,包括 IBM Watson 预测为“愤怒”和自制分析器预测为“悲伤”的第 8 行(预测是针对负面情绪之一)。

9.对整个数据集进行预测

在最初的文章中,我使用 IBM Watson 对 2,000 个采样行进行预测,但是源数据包含 23,000 行。我不愿意花 202 美元(约 149 英镑)买全套,所以在做了这么多艰苦的工作后,我决定不在我的分析中加入情感因素。

现在我有了一个临时构建的情绪语气分析器,最后一步是用它来预测源数据中所有 23,000 行的客户情绪…

Wall time: 21.2 s

我们做到了!scratch build emotional tone analyser 的运行时间为 21.2 秒,而 IBM Watson API 调用运行 23,000 个数据点需要 4 个多小时,成本为零,而 IBM Watson 的每 API 调用成本为 202 美元(约 149 英镑)。

剩下的就是比较结果,看看他们如何叠加…

Joy        0.7940
NaN        0.1235
Sadness    0.0685
Anger      0.0075
Fear       0.0065
Name: Emotion, dtype: float64
Joy        0.863239
Sadness    0.135490
Anger      0.000712
Fear       0.000559
Name: Emotion, dtype: float64

结论

与 IBM Watson 对 2000 行样本的预测为 79.4%相比,我们的临时构建的情感语气分析器对 23,000 行完整数据集的预测为 86.3%。

13.5%的评论被 scratch 算法预测为“悲伤”,而 IBM Watson 的预测为 6.9%。IBM Watson 在 12.4%的情况下未能做出预测,但临时构建的算法总能做出预测。“愤怒”和“恐惧”看起来相差 10 个数量级,但在两个数据集中的相对百分比非常低。

由于我们不知道 IBM Watson 是如何构建的,也不知道它自己的预测有多准确,这使得评估我们自己的算法的真正准确性非常困难,而且情绪无论如何都可能是主观的。在一次试验中,一个评论者可能会说他们有大约 53%的人感到悲伤,但实际上他们可能已经接近其他的情绪,甚至可能已经感觉到了各种情绪的混合。

作为评估的进一步阶段(本文之后),我采用了 scratch built 算法的输出,并使用它来识别与 Power BI 仪表板中的评论文本相关联的积极(快乐)和消极(悲伤、愤怒或恐惧)情绪。

这个过程和我所获得的知识将会是未来一篇文章的主题,但是我可以说的是,预测的情绪为观想增加了真正的洞察力。

通过“悲伤”、“愤怒”和“恐惧”过滤的评论将仪表板用户直接带到负面评论,这些评论是最有用的,因为它们可以用于改进评论主题的产品和服务。

感谢您的阅读!

如果你喜欢读这篇文章,为什么不看看我在 https://grahamharrison-86487.medium/的其他文章呢?此外,我很乐意听到您对这篇文章、我的任何其他文章或任何与数据科学和数据分析相关的内容的看法。

如果你想联系我讨论这些话题,请在 LinkedIn 上找我—【https://www.linkedin/in/grahamharrison1 或者发电子邮件到ghar rison @ Lincoln college . AC . uk。

如果你想通过订阅来支持作者和全世界 1000 个为文章写作做出贡献的人,请使用下面的链接(注意:如果你使用这个链接免费注册,作者将收到一定比例的费用)。

https://grahamharrison-86487.medium/membership

本文标签: 中文翻译博客TowardsDataScience一百九十八