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

龙哥盟 / 2024-10-22 / 原文

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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何用 Qiskit 创建量子多内核分布

原文:https://towardsdatascience.com/how-to-create-quantum-multinoulli-distributions-with-qiskit-cea9021f6cb9?source=collection_archive---------34-----------------------

实践中的量子机器学习

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

概率分布在机器学习中无处不在。我们的目标是回答最简单的问题还是解决最大的问题并不重要。从技术上讲,目标总是从数据中学习一个未知的概率分布。

无论我们进行简单的回归分析还是训练深度神经网络,都无关紧要。目标总是找到某个概率分布。

而且,就算用量子机器学习算法也没关系。最终,你要寻找的答案将是概率性的。

但并不是所有的概率分布都是一样的。他们可能是非常异质的。每种类型的分布都有其特殊性,你最好知道。如果你不知道哪种分布适合你手头的问题,你就有麻烦了。

此外,如果您知道哪种分布适合您的问题,但不知道如何生成合适的分布,您的情况也不会更好。而且,你猜怎么着,用量子位生成分布本身就是一个挑战。

经典计算机有数十亿比特的内存。节省一些来存储概率分布没什么大不了的。但是量子计算机只有不到一百个量子位。我们应该考虑如何有效地表示一个概率分布。幸运的是,一个量子位不仅仅是 0 或 1。即使如果我们测量它,它只有 0 或 1,但它处于量子叠加态。这个状态包含了更多的信息。

在之前的中,我们研究了如何创建一个量子系统来重现伯努利分布。伯努利分布是所有分布中最简单的。只有两个可能的值,每个值都以一定的概率出现。这差不多就是单个量子比特叠加的含义。

假设我们的单个量子比特在|𝜓⟩=√0.7|0⟩+√0.3|1⟩.态如果你在这种状态下测量许多量子位,就会产生以下伯努利分布。

作者图片

伯努利分布回答简单的问题,你可以用“是”或“否”来回答。例如,一名乘客在泰坦尼克号沉船中幸存了吗?这是一只猫吗?这个学生通过考试了吗?

但是如果我们有多种可能的答案呢?假设我们想从著名的 MNIST 数据集中标注手写数字?显然,我们需要区分两个以上的输出值。

我们需要多个量子位来代表所有类别,因为我们测量单个量子位为 0 或 1。假设我们想要标记从 0 到 7 的数字。然后,我们有八个不同的类别。我们可以用三个量子位来编码这些可能的结果。量子位测量的每个组合代表一个数字。000 代表数字 0。001 代表 1。010 代表 2。011 代表 3,以此类推。最后,111 代表 7。

因此,我们会得到一个多内核分布,也称为分类分布。它涵盖了一个事件有多种可能结果的情况。因此,它概括了伯努利分布,该分布涵盖了两种可能结果中的一种。

作者图片

那么,假设我们有这样一个多元分布的数据。

实际问题是:“怎样才能让一个量子电路代表这样的分布?

最简单的方法就是把这些概率转换成振幅,传递给量子电路的initialize函数。

真正的神奇发生在第 6 行。我们计算三量子位系统的初始状态。整个技巧是取每个概率的平方根,因为概率是量子态振幅的平方。

Qiskit QuantumCircuitinitialize功能将所有振幅列表作为输入参数(参见官方 Qiskit 文档)。

当我们用'statevector_simulator'执行这个电路时,它会再现我们指定的精确分布。

还有别的办法吗?我们能通过使用量子门来创造多量子分布吗?

当然了。但是,这并不简单。

我们可以使用量子门来转换量子位的状态。例如,我们可以使用qc.ry(theta, 0)函数将位置 0 的量子位的状态向量旋转角度theta。此外,我们可以使用prob_to_angle函数根据概率计算角度θ。更多细节请看这篇文章。

问题是,在我们的分布中,我们将单个量子位的值用于不同的值。例如,对于所有状态['100', '101', '110', '111'],左边的数字是 1。

所以,当我们指定量子位 3(左手边的量子位)的状态时,我们需要取所有这些状态的概率之和。

首先,我们定义我们的便利函数prob_to_angle并定义一个QuantumRegisterQuantumRegister是我们量子位的容器,允许我们在 Python 代码中轻松地处理单个量子位。

动作从第 9 行开始。在那里,我们将分布的值从 4 到 7 分开,计算这些状态的总和,并将我们的总概率分成两半。下图描述了迄今为止的状态。

作者图片

因此,我们只区分两类国家。高位量子位为 0 的和高位量子位为 1 的。(注意:上量子位在图中字符串的左下方。)

下一步,我们进一步将后半部分减半。我们应用相同的逻辑。我们把上量子位为 1 的状态分成四分之二。

与第一次分裂的唯一区别是我们使用的量子门。这一次,我们使用受控 RY 门而不是普通 RY 门。不同之处在于,如果控制量子位为 1,受控 RY 门仅应用概率分割。在我们的例子中,这意味着我们只拆分“100”块,而不改动“000”块。

作者图片

最后,我们还需要一个上季度的分裂。我们必须分别管理每个季度。首先,我们把上面的四分之一分成两半。现在,我们必须只触及两个上量子位为 1 的状态。因此,我们使用多控 RY 门(qc.mcry)。

在这一点上,QuantumRegister派上了用场,因为我们可以以数组的形式访问量子位。术语qr[1:]选择除第一个以外的所有量子位。这些是多重控制 RY 门的控制量子位。最后一个参数qr[0]表示目标量子位。

作者图片

我们还需要使用另一个多重控制的 RY 门来分割下面的四分之一。我们把它封装成非门,应用在中间的量子位上。这让我们可以选择中间量子位是 0 而不是 1 的状态。

到目前为止的结果表明,我们准备了一半的状态。

作者图片

我们还需要在下半部分执行相应的步骤,以生成整体分布。这是完整的源代码。

当我们看结果时,我们看到它类似于我们的多诺尔分布。

作者图片

方法很简单。我们重复地将状态分成两半,并应用相应的量子位变换。然而,这比简单地用概率初始化三个量子位要多得多。

但是在某些情况下,你不能在初始化的时候指定所有的概率。例如,如果创建一个量子贝叶斯网络,分布值可能来自其他变量。然后,您不可避免地希望能够以编程方式创建一个多内核发行版。

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

在这里免费获得前三章。

如何在 Python 类中创建只读和删除证明属性

原文:https://towardsdatascience.com/how-to-create-read-only-and-deletion-proof-attributes-in-your-python-classes-b34cd1019c2d?source=collection_archive---------25-----------------------

对类中的属性施加控制

图片由 Charles Deluvio 通过 Unsplash 提供

控制你的属性

本教程将演示如何在 Python 类中创建只读和防删除属性。通过这种方式,可以对您的属性应用额外的控制层,确保您的类按预期使用。虽然在 Python 中有多种方法可以创建只读和防删除属性,但使用 setattr 和 delattr dunder 方法是快速控制对象中属性的一种便捷方法。

示例:雇员类

设置属性一次

举例来说,假设我们正在创建一个简单的 Employee 类,它需要在对象中设置三个值。这些值将是雇员的姓名、年龄和唯一的 id 号。这些属性值将在属性中设置;并且用下划线表示,表示它们是私有属性,不打算在类外使用。

一旦设置了__init__方法,就有必要定义神奇的方法__setattr__。在这种方法中,我们可以应用一些简单的逻辑来施加强大的属性控制。在给出的例子中,当属性在对象初始化期间首先被设置时,方法将调用方法。我们可以通过应用以下逻辑来防止_name属性被重置。

为了实现这一点,我们可以编写一个条件,当设置一个新属性时,如果该属性等于_name 并且已经有一个值,那么程序将退出并引发一个内置的AttributeError异常,并在标准错误(stderr)输出中显示一条定制消息。_name属性是在对象初始化期间设置的,因此对该属性的任何重置都会引发异常并终止程序。

我们还可以进一步控制,确保_age_id_number属性都是整数类型。我们可以创建一个列表,并在将它们设置为整数之前检查_age_id_number属性是否在最后。下面的 setattr 方法显示了实现这一点的代码。

**注意:**在所示的例子中,当设置一个属性时,它不是使用 setattr 魔术方法中的 object.attribute 语法来设置的,而是使用object.__dict__[key] = value。如果我们使用前一种方法,将会启动一个无休止的递归循环,因为 object.attribute 语法将调用 setattr 方法!

现在,让我们创建一个 Employee 对象,并检查是否已经设置了属性。如图所示,属性已经设置,并且是正确的类型。

现在,假设我们想要重新设置_name属性,尽管它已经被设置了。在这种情况下,会引发AttributeError异常,并向控制台输出一条消息,通知用户 name 属性已经被设置,并且不能被重新设置。

删除证明属性

为了证明我们的名称属性删除,我们可以简单地向 dunderlattr 方法添加一些逻辑。这里,我们说如果用户试图从对象中删除属性名,将会出现一个AttributeError异常,通知用户名称属性不能被删除。但是,我们仍然允许用户删除 Employee 对象中任何其他属性的行为。

当我们试图从 Employee,emp_1 对象中删除受保护的 name 属性时,会引发一个AttributeError异常。

奖励:自定义信息类

虽然AttributeError类很好地向用户解释了当用户试图删除_name属性时程序为什么会退出,但是通过构建一个定制的异常类,这个原因可以变得甚至更加明确。

我们可以编写一个自定义的DeletionException类,如果用户试图删除_name属性,这个类将被引发。当DeletionException类被引发时,我们还可以有效地告诉用户 name 属性当前是什么。该消息可以打印到标准错误输出中。

为此,我们创建了一个DeletionException类,它从基本异常类继承并接受一个参数,这里是属性的初始值。当类被实例化时,例如当它被引发时,这个值在DeletionException对象中被设置。当它被引发时,我们将原始的 name 属性作为唯一的参数传递给该类。这发生在__delattr__方法内部。

当引发时,将调用__str__方法并打印出一条消息,通知用户不能删除 Employees 对象中的原始 name 属性。

摘要

可以通过定制逻辑修改 dunder 方法 setattr 和 delattr,以保护属性并控制它们的访问。此外,可以添加定制的异常类来有效地通知用户为什么属性受到保护。

如何创建实时人脸检测器

原文:https://towardsdatascience.com/how-to-create-real-time-face-detector-ff0e1f81925f?source=collection_archive---------1-----------------------

使用 Python、TensorFlow/Keras 和 OpenCV

实时人脸检测器。不是我——照片由西蒙·罗本从派克斯拍摄

在本文中,我将向您展示如何使用 Python、TensorFlow/Keras 和 OpenCV 编写实时人脸检测器。

我马上会注意到,所有代码文件都可以在这个 repo 中获得。

https://gitlab.com/Winston-90/me_not_me_detector/

首先,在理论部分我会告诉你一些对我们有用的概念(迁移学习数据扩充),然后我会在实践部分部分进行代码分析。

注意,您必须安装 TensorFlowOpenCV 库来运行这段代码。你可以手动完成,或者在你下载了 repo 之后简单地运行pip install -r requirements.txt 命令。你也可以用 conda 命令conda install -c conda-forge numpy, opencv, tensorflow 来完成。

问题陈述

在这里,我想建立一个面部检测器,也可以区分我和其他人。你可以在本文末尾看到我的工作成果。

初始任务可以分为两个子任务:

  1. 为人脸分类训练一个模型。
  2. 调整模型,使其与作为检测器的网络摄像头一起工作。

更详细地说,该任务可以分为以下几个阶段:

  1. 数据集集合。
  2. 寻找迁移学习的基础模型。
  3. 训练一个模特。
  4. 将分类器转换为检测器。

在我开始分析这些阶段之前,我想非常简要地概述一下对我们有用的概念。

理论部分

在这一点上,我必须说,这个教程是不详细的,因为它可以。例如,我不会解释什么是卷积或者为什么在 CNN 架构中需要池层。当然,你需要知道这些才能理解 CNN 是如何工作的,但我认为如果我解释所有的概念,这个教程会太繁琐。另一方面,其他人已经解释了很多东西,而且做得比我好。例如,在这里你可以读到 CNN 的概况,而在这里——关于流行的 CNN 架构。

卷积神经网络

由于我们正在讨论图像识别,我们将使用 CNN —卷积神经网络,这种架构在这项任务中取得了最大的成功。

典型的卷积神经网络架构。 公共领域

与经典神经网络(这里我指的是FDN——前馈神经网络)不同,在 CNN 中,神经元是:

  • 首先:以矩阵(张量)的形式排列,而不是数组,
  • 其次:它们只与前一层的一小部分神经元相连,因此层之间并不完全相连。

这种方法允许您显著减少网络参数的数量,并使图像的模板搜索更有效。

前馈神经网络 vs 卷积神经网络。作者图片

在这张图的底部,我想说明一下,CNN 中的层是一个张量(经常被画成平行六面体)。我将把张量作为矩阵序列来讲。所以这些张量中的每一个都是一系列的矩阵,像披萨盒一样一个接一个的叠在一起。反过来,矩阵只是以矩阵形式排列的神经元序列,而不是像在经典网络中那样的阵列。

迁移学习

迁移学习是这项任务中最重要的概念,因为从头开始构建人脸分类器非常困难(几乎不可能)。迁移学习是在自己的任务中使用预先训练好的模型的过程。

转移学习。作者图片

这种情况发生如下。你找到一个为类似任务训练过的模型(例如,识别 1000 类图像,就像在 ImageNet 中一样,而你只需要识别少数几类)。然后使用它的权重(冻结它们,这意味着它们不会改变),并在您的小数据集上完成模型的训练。之后还可以解冻所有权重,继续用极小的学习率训练模型。

由于 CNN 架构和图像识别任务的特征,该过程变得可能(但是也可以用于不同的架构)。网络学会从一层到另一层(从输入到输出)看到模式,它们变得越来越复杂。事实证明,所有问题的一般模式大致相同,这允许我们使用预先训练的权重。

数据扩充

图像分类问题中的另一个重要概念是数据扩充。数据扩充是通过对原始图像应用一些变换来人为增加数据集大小的过程。例如,我们可以使用水平和垂直反射、小旋转或放大、颜色反转等等。这将显著增加数据集的大小,从而提高网络的概化能力。

在上面的例子中(文章中的第一个图像),当偏移值很高时,有时会出现只有部分图像可见的情况。一方面,这是好的(在头部不可见的图像情况下,网络可以通过爪子和尾巴而不是通过口鼻来学习识别猫),但如果你过度进行这样的转换,也会使网络混淆。

TensorFlow 中有多种数据扩充方法。我们可以生成图像并保存到磁盘,或者我们可以将生成器直接传送到网络。我选择了第一个选项,这样做更明确。但是这里也有两种方法:生成随机数量的图像或者生成特定图像的几个版本。您可以在data_augmentation.ipynb笔记本中看到这两个选项的实现。我使用了第二个选项,并专门为每张图像生成了五个转换。

实用部分

项目结构

该项目的结构如下:

me_not_me_detector
├───article
├───datasets
│   ├───face_dataset_test_images
│   │   ├───me      # contains TEST images for ME class
│   │   └───not_me  # contains TEST images for NOT_ME class
│   ├───face_dataset_train_aug_images (optional)
│   │   ├───me      # contains aug TRAIN images for ME class
│   │   └───not_me  # contains aug TRAIN images for NOT_ME class
│   └───face_dataset_train_images
│       ├───me      # contains TRAIN images for ME class
│       └───not_me  # contains TRAIN images for NOT_ME class
├───models
│   .gitignore
│   data_augmentation.ipynb
│   me_not_me_classifier.ipynb
│   me_not_me_classifier_model_comparison.ipynb
│   me_not_me_detector.ipynb
│   README.md
└── requirements.txt

先说文件夹。

  • article文件夹包含本教程的数据。
  • models文件夹包含了用于测试和进一步使用的训练模型。
  • datasets文件夹包含三个文件夹——用于训练集、测试集和扩充训练集(可选)。其中每一个都包含两个子文件夹,用于两个类- menot_me 。在一般情况下,它包含 N 类分类问题的 N 个子文件夹。

现在我们来谈谈代码文件——jupyter 笔记本。

  • data_augmentation.ipynb文件从初始数据集创建一个扩充数据集,并提供关于数据集的一些信息。
  • 文件包含训练和测试五个不同模型的代码。
  • me_not_me_classifier.ipynb file 做同样的事情,但是针对一个特定的模型。您可以将它作为构建自己的分类器的示例。
  • me_not_me_detector.ipynb文件使用 OpenCV 库,将分类器变成实时检测器。

其他文件用作附加文件:

  • .gitignore包含 git 中不会推送的文件,
  • requirements.txt包含了运行这些代码需要安装的库列表,等等。

1.数据集集合

首先,我们需要收集一个数据集。我用我的照片和我家人的照片来训练模型,但是你也可以在其他一些人脸数据集上训练模型。我只使用了个人照片来检查这样一个小数据集是否足以让模型显示出可接受的质量。

我从每张照片中裁剪出面部,并将它们的大小调整为 250x250(您不必这样做,因为 TensorFlow 可以为您完成)。以下是初始数据集中的一些照片示例:

初始数据集照片。作者图片

我一共收集了 215 张照片,其中 82 张是,133 张是非 _ 我

对于测试集,我立即搁置了 20 张照片。这可以自动完成,但我是手动完成的,因为数据集太小。对于列车组,我应用了来自data_augmentation.ipynb笔记本的数据增强代码。因此,数据集增加了五倍!(每张照片生成五张照片)。以下是生成的照片示例:

增强照片。作者图片

当数据集准备好时,我们可以开始训练模型。

2.寻找迁移学习的基本模式

这里没有什么复杂的——我只是使用了在 ImageNet 数据集上训练的不同模型。如果他们没有很好的准确性,那么我想我会使用类似 VGGFace 模型的东西比如这里的。但是我得到的质量足够好。我们可以用以下代码加载预训练模型:

3.训练模特

现在,我们必须冻结这些权重,在模型上添加一些层,并在我们的小数据集上训练模型。

正如我前面说过的,me_not_me_classifier_model_comparison.ipynb文件包含了不同型号的代码。你可以用它来做你自己的实验。下面的代码示例摘自me_not_me_classifier.ipynb。这里我们将使用 ResNet50 作为初始模型。

在导入库和数据集加载之后,我们完全按照上面的代码加载预训练模型。之后,我们需要恢复模型的顶部——密集的部分。请注意,这部分因型号不同而不同。要知道你需要哪些层,你可以加载带顶层和不带顶层的模型,调用 model.summary() 方法,看看它们有什么不同:

为了添加层,我使用了 TensorFlow 函数 API 。当然,你需要一些关于 TensorFlow 和 CNN 的知识,但你也可以尝试添加不同的层,获得非原创的架构。在我的例子中,我们需要一个全局平均池层和密集层。不要忘记预先冻结其他重量。

之后,我们继续配置模型。我添加了一个 ModelCheckpoint 对象,以便在出错时将模型保存在磁盘上,同时作为一种正则化技术,我还添加了提前停止。作为一种优化方法,我使用了具有标准学习率值的 Adam。我也尝试使用各种调度技术,但是它们没有带来多少结果。

所以现在我们可以开始训练了。结束后,你将有一个现成的模型。您可以通过me_not_me_classifier.ipynb文件中的测试部分代码来检查其功能。

4.将分类器转换为检测器

现在我们必须使用 OpenCV 库进行网络摄像头访问和人脸检测。

坦率地说,由于分类器和检测器的定义,短语“将分类器转换为检测器”是不正确的。分类器(理解为图像分类器)是一种模型,它接收图像作为输入,并在输出端给出一个可能类别的标签(在我们的例子中,是 menot_me )。检测器(理解为面部检测器)是一种模型,其接收图像作为输入,并且如果该图片中存在面部,则输出面部周围的边界框的坐标。

我用这个短语来说明最终的程序(它仍然是一个分类器)现在也给出了人脸在图片中的确切位置。此外,现在它可以在照片中同时有几个人脸的情况下正确工作。

训练一个人脸检测器是一件非常困难的事情(主要是因为数据很难标注),所以我会使用 OpenCV 提供的人脸检测器。使用起来非常简单。在下面的代码中,faces 变量是图像中所有面孔的数组。对于每个面,边界框有四个值:

  • 左上角的 x-x 坐标,
  • 左上角的 y-y 坐标,
  • w —边界框的宽度,
  • h-边界框的高度。

以下代码在网络摄像机图像中实时突出显示您的面部,如下图所示。

用 OpenCV 进行人脸检测。照片由西蒙·罗本从派克斯拍摄

现在剩下的就是加载预先训练好的模型,将人脸所在的图像片段传递给它,并在屏幕上显示文本!事实上,在这个阶段我面临一个小困难——模型只是有时认出我。发生这种情况是因为我训练她在图像上“留有空白”,不仅仅是脸部的位置。

我可以向数据集添加不同比例的图像,但我决定诚实地这样做。为此,我编写了函数 get_extended_image() ,用某个系数 k 来增大裁剪后的图像的大小,k 越大,人脸周围的面积越大。为了解释这个函数的操作(或者更让你迷惑),我给出下图(为简单起见,这里 k = 0.3。没有观察到刻度。注意,左上坐标是(0,0))。你也可以看到不同 k 参数的我的脸的剪报(根据 OpenCV,它使用 BGR 而不是 RGB,但不是调整颜色,让我们想象我是一个头像)。对于结果模型,我使用 k = 0.5。

get_extended_image()函数说明。作者图片

具有不同 k 参数的 get_extended_image()的图像。作者图片

我想指出的是,我使用了 MobileNet 作为基础模型。最初,我使用的是 ResNet50 ,因为它显示的质量最好,但图像滞后了一点,而更轻的 MobileNet 则没有这些问题。我在一台配有 i7–10750h 和 32G 内存的电脑上测试了所有这些。

就是这样!您可以在me_not_me_detector.ipynb笔记本中找到完成的代码,但是注意,要使用它,您需要在models 文件夹中有一个模型,否则您将在加载模型单元格中得到一个错误。这是结果。

实时人脸检测器的视频演示

我必须说,虽然模型相当简单,但它已经很好地识别了我,例如,如果脸部的一部分被覆盖。另外,我的数据集中没有威利姆·达福的照片,所以模特以前没有见过他。

面具识别中的人脸呢——你可以看到,如果我的鼻子被完全遮住,程序就会停止识别我的脸(或者当它旋转太多的时候)。但是这在检测器侧是一个问题,因为它停止将图像传输到模型。这是因为 OpenCV 人脸检测器通常看不到戴面具的人。但我认为,如果你能收集一个大型数据集,你也可以教你的模型区分戴面具的人。

让我感到惊讶的是——当脸的下半部分被遮住时,模特比上半部分更容易认出我。你可以看到,当我戴上帽子或者用手遮住额头时,模特开始怀疑。我想这是因为在我所有的照片中,我的头都是敞开的,而且我只有一种发型。

好模式!作者图片

结论

下面,我展示了使用或不使用数据扩充(本例中为 x5 数据扩充)的不同模型的训练结果。最佳质量(99%的验证准确性)由 ResNet50 显示。但正如我上面所说,我使用了基于 MobileNet 的模型,因为它在实时操作中表现得很好。

不同车型的训练结果。作者图片

这些结果表明,数据扩充可以显著提高模型的质量。在这种情况下,验证损失下降了 10 倍,但这是关于非常少的数据集。我试图生成更多的图像,并获得更多的准确性。该参数(数据集的系数增加,因此为每幅图像生成的增强图像的数量)可以通过交叉验证来选择。我在 MobileNet 中得到的最好的模型是验证损失= 0.09886,验证准确度= 0.9589,数据集增加系数= 15。

数据集大小对 MobileNet 示例中模型质量的依赖性。作者图片

与此同时,学习过程变得非常缓慢。有道理,数据集规模增加,学习时间也增加。您可以在下面看到训练时间对数据集大小的依赖关系图,它几乎是线性的。

MobileNet 示例中数据集大小对学习时间的依赖性。作者图片

下表是上一个表的扩展版。在这里,您可以看到参数的数量、模型的深度和测试精度。请注意,图层被计为 model.layers 对象的数量,这并不完全正确,但给出了模型深度的概念。测试准确性没有太多的统计能力,因为我只有 20 张测试图像。

扩展结果。作者图片

关于 VGG 的一件事。我用两个 1024 密集层替换了两个 4096 密集层,模型显示了大致相同的结果,尽管参数数量分三次下降(从 1.34 亿下降到 4100 万,可训练值从 1.19 亿下降到 2700 万)。该型号的磁盘大小为 368 MB。

从所做的工作中,我可以得出以下结论。有些比较明显,有些不太明显:

  • 你需要收集的数据集应该尽可能的多样化,同时尽可能的接近真实数据
  • 更简单的模型训练速度更快,预测速度更快,占用硬盘空间更少。更简单的模型有更少的参数,但是,同时,可以更深入。
  • 迁移学习是一种非常强大的技术,即使只有很小的数据集,它也能让你解决你的任务。
  • 数据扩充技术允许你显著地提高模型的质量,但是它也增加了训练时间。您可以通过交叉验证选择数据扩充系数。
  • 结果很大程度上取决于随机初始化。因此,即使是相同参数的训练过程也要运行几次。例如,在 22 分钟和 150 个历元中,我在没有数据增强的情况下使用 ResNet50 得到的验证损失结果为 0.1334,比常规 ResNet50 好 39%。

现在我要再说一句让你更加困惑的话。

网络的卷积部分(上至稠密层)将原始图像转化为某个高维空间中的点(这类似于嵌入的概念),稠密层再在这个空间中构建分离超平面。

因此,最好建立一个模型来更好地定位这些点,然后您可以使用更简单的分类器。当然,构建这些表示的规则非常复杂,这就是为什么我们需要具有大量参数的深度模型。

一个能够很好地创建嵌入的网络能够解决最初没有被训练过的任务。所以,一个好的模型会把我所有的照片彼此靠近(在某个高维空间)定位,把威利姆·达福所有的照片彼此靠近定位。但同时,这两个点云的位置应该相距很远。现在,当你向网络展示另一个人的照片时,它将能够说这是而不是 _me ,但是除此之外,它将能够给出他最像的人或者注意到这个人不在数据集中。这是度量学习的变体,这里使用三重损失

感谢您的阅读!

  • 我希望这些材料对你有用。在媒体上关注我以获得更多类似的文章。
  • 如果您有任何问题或意见,我将很高兴得到任何反馈。在评论中问我,或者通过 LinkedIn 或 Twitter 联系我。
  • 为了支持我作为一名作家,并获得数以千计的其他媒体文章,使用我的推荐链接获得媒体会员资格(不收取额外费用)。

如何用谷歌图表和熊猫数据框创建简单的可视化

原文:https://towardsdatascience.com/how-to-create-simple-visualizations-with-google-charts-and-pandas-dataframes-fa711299f0c9?source=collection_archive---------11-----------------------

数据可视化

谷歌图表能让你创造出令人愉悦的互动情节,但不能直接阅读熊猫数据。这里我们创建了一个简单的 Python Web 应用程序来结合这两种技术。

作者图片

Google Charts 已经存在很多年了,我都不记得了,所以我想我们可以有把握地认为它是一项成熟稳定的技术。

它还可以用来创建吸引人的图表和图形。

月最高和最低温度-2018 年。图片作者。

在这里,我们可以看到一个简单的交互式折线图,当您将鼠标悬停在图上的某个点上时,它会向您显示该数据点的详细信息。

我们将看看如何使用 HTML 和 Javascript 中的一些基本样板代码、Pandas dataframes 和一个简单的 Flask web 应用程序来创建这样的图表。下面,我们将开发完整的代码。(在本文的最后,我将包含一个应用程序的链接,您可以在这里看到运行中的代码,并下载代码和示例数据。)

以下是以下内容的概要:

  • 编写一个基本的 Flask 应用程序(可选)
  • 使用样本 HTML 和 Javascript 显示图表
  • 创建熊猫数据框架并将其转换成与谷歌图表兼容的形式
  • 将烧瓶代码和网页放在一起作为一个应用

创建并运行 Flask 应用程序

这是创建和运行 Flask 应用程序的一个非常简单的介绍。如果您已经知道如何做到这一点,那么您可以安全地跳过这一部分。

Flask 是一个 web 应用程序微框架,这意味着它是一个用于开发 web 应用程序的非常轻量级的库。创建您的第一个 Flask 应用程序很容易,但首先您需要用 pip 或 conda 安装它,例如:

pip3 install flask

接下来,打开一个新目录,用下面的代码创建一个文件 app.py :

from flask import Flask
app = Flask(__name__)
@app.route('/')
def root():
   return 'Hello'

代码非常简单。第一行导入烧瓶库;第二个创建一个 Flask 对象(将被运行);剩下的部分定义了一条路线。一个路由是一个网页,或者端点,而 @app.route 装饰器定义了 url,在这种情况下它是根 url(即/)。下面是一个函数定义,它告诉 Flask 服务器当这个特定的端点被请求时该做什么——在这个例子中,只需返回字符串“Hello”。

现在打开终端窗口,导航到正确的目录,并键入:

python3 -m flask run

(注意:我在一个标准的 Linux 环境中使用 Python3,这里,如果你使用一个不同的环境,Python3 是默认的——例如,portable Python 或 Conda——那么你的命令可能是 python 而不是 python3。)

这将启动 Flask 服务器,结果应该是这样的:

运行 Flask 应用程序-作者图片

Flask 现在正在运行您的应用程序,它可以从 url 获得, http://127.0.0.1:5000 ,所以在浏览器的地址栏中键入它,您应该会看到类似这样的内容:

跑步烧瓶应用程序——作者图片

我们稍后将使用模板将 Flask 应用程序连接到网页,但现在,这就是我们需要了解的关于 Flask 的全部内容。

一个简单的谷歌图表

现在我们来看一个可以在许多不同的应用程序中重用的模板 HTML 页面。基本文件布局如下所示:

<!DOCTYPE html>
<html>
  <head>
    <script>
      // Script 1 — where the data gets loaded
    </script> <! — Script 2 — Load the AJAX API →
    <script src=”https://www.gstatic.com/charts/loader.js">   
    </script> <script>
      // Script 3 — Where we create and display a chart
    </script>
  </head>
  <body> <! — the div where a chart will be displayed →
    <div style=”width:600px; height:300px” id=”chart1"></div> </body>
</html>

这是一个简单的 HTML 文件,文件体只有一个

,文件头有 3 个脚本。是显示图表的地方,并被赋予了一个 id——我还赋予了它一个高度和宽度。id 是强制性的,尺寸不是——您可以随意改变高度和宽度,或者完全不考虑它们。

主要逻辑来自三个脚本。第一个脚本 1 是我们加载数据的地方。对于第一个示例,我将在本地创建数据,但稍后我们将从 Pandas 数据框架中加载它。第二个脚本,脚本 2,加载一个 Google Charts API,脚本 3 将使用它。和脚本 3。它本身负责创建和显示图表的主要工作。

我们马上会看到这些是如何工作的,但值得指出的是,如果你想创建自己的应用程序,你只需要修改脚本 1 和 HTML。所以只需要很少的 Javascript 编程。

脚本 2 已经定义,我们不需要修改它。

脚本 3 相当长,但是,同样,一旦我们定义了它,我们不需要改变它。这是:

<script>
  // Load the Visualization API and the corechart package
  google.charts.load(‘current’, {‘packages’:[‘corechart’]}); // Set a callback for when the API is loaded
  google.charts.setOnLoadCallback(drawChart);

  // This is the callback function which actually draws the chart
  function drawChart(){
    google.visualization.drawChart({
      "containerId": **containerId**,
      "dataTable": **data**,
      "chartType": **chartType**,
      "options": **options** });
  }
</script>

这里发生的事情是,我们从 Google 加载可视化 API,然后设置一个回调函数,该函数将在 API 完成加载时运行。回调函数是 drawChart 并完全按照它所说的去做。

drawChart 简单地从 Google API 调用另一个同名函数,并传递一些参数,我们将在稍后的脚本 1 中定义这些参数。让我们检查一下这些参数。

containerId 是将显示图表的< div >的 Id。

数据是要绘制的实际数据。

chartType 是我们想要的绘图类型,例如,折线图、饼图、柱形图。

选项可以包括图表的多个不同选项,例如标题。

我们将在脚本 1 中定义这些选项。

定义数据

为了获得一个有效的 web 页面,首先我们将在本地定义数据——稍后我们将从 python 应用程序导入数据。

您可以用几种不同的方式定义 Google Charts 的数据,但是对于我们的目的来说,最简单的方式是一个简单的表格。这是停在我家街道上的汽车数量和品牌表:

但是我们需要将其格式化为 Javascript 二维数组中的行列表。这与 Python 中的列表列表非常相似。看起来像是:

[
  ["Car","Number"],
  ["Audi", 3],
  ["BMW", 2],
  ["Mercedes", 1],
  ["Opel", 3],
  ["Volkswagen", 4]
]

列表中的第一项是列名列表,其余的是数据行。

这是脚本 1,它包含了我们之前看到的数据和选项..

<script>
  data = [
    ["Car","Number"],
    ["Audi", 3],
    ["BMW", 2],
    ["Mercedes", 1],
    ["Opel", 3],
    ["Volkswagen", 4]
  ]; chartType = "ColumnChart";
  containerId = "chart1";
  options = {"title":"Cars parked in my road"};
</script>

我们首先看到的是包含 car 表的变量数据。接下来是我们将要绘制的图表的类型,然后是图表将要绘制到的< div >的 id。最后,我们为图表设置选项——这里只是标题,但是根据我们想要绘制的图表类型,可能还有其他选项。稍后您将看到如何使用这些选项。

如果你把这些脚本和上面的 HTML 模板放在一起,你就有了一个工作网页。您可以在浏览器中打开它并查看结果图。

停在我的道路上的汽车柱形图-图片由作者提供

这里有一个巧妙的技巧:改变线路

chartType = “ColumnChart”;

chartType = “PieChart”;

保存并重新加载网页,然后…

那很容易!

好的,但这只是一个简单的独立演示,实际上我们想从其他地方获取数据。这就是我们接下来要去的地方。

熊猫数据框到谷歌数据表

我们可以看到示例中提供的数据格式是一个列表列表。列表的第一个元素是包含列标题的列表,其余元素包含构成表格行的数据。

虽然这在概念上与熊猫数据帧没有太大的不同,但我们确实需要做一些工作来将两者转换。

让我们首先编写一些 Python 代码来加载我们的数据,并创建一个 dataframe 来表示我们想要绘制的数据。

如果你下载程序文件,你会在根目录中找到一个名为 london2018.csv 的文件,我们将把它加载到一个熊猫数据帧中,如下所示:

url = ‘london2018.csv’
weather = pd.read_csv(url)

数据帧看起来像这样:

weather.csv —图片由作者提供

这是 2018 年伦敦天气统计的记录(来自英国气象局数据)。 TmaxTmin 是 2018 年各月的最高和最低气温, Rain 是以毫米为单位的总降雨量, Sun 是总日照时数。

我们将生成一个温度图表,我们只需要 TmaxTmin 以及 Month 列,因此我们创建了一个我们需要的数据的新数据框架,如下所示:

title = “Monthly Max and Min Temperature”temps = weather[[‘Month’,’Tmax’,’Tmin’]]temps[‘Month’] = temps[‘Month’].astype(str)

请注意,我还将列转换为字符串,因为将其视为数字没有多大意义,并且我还为图表创建了一个标题。

所以现在我们有了想要的数据;我们只需要将它转换成谷歌图表将处理的形状。我们通过从图表中提取值并将它们转换成列表来实现这一点。这将为我们提供列表中的值,这正是我们在图表中需要的。一个问题是:没有包含列名。这很容易解决,我们提取列名,然后将结果列表附加到值列表的顶部。

d = temps.values.tolist()c = temps.columns.tolist()d.insert(0,c)

现在,我们将数据和标题捆绑到一个 JSON 字符串中,可以传递给 web 页面。

tempdata = json.dumps({'title':title,'data':d})

我们使用内置于 Flask 中的模板机制将数据传递给网页。像这样:

return render_template('weather.html', tempdata=tempdata)

函数 render_template 找到模板【weather.html并通过将传递给它的数据插入模板来创建一个网页。

整合应用程序

所以现在我们需要修改我们的 html 文件,使之成为一个模板。这意味着将 Script 1 改为将 JSON 数据加载到 Javascript 变量中的脚本,方法是在要传递的数据所在的位置放置命名的占位符。(一个宫托是一对双花括号,里面有名字。)

在我们的例子中,只有一个数据项叫做 tempdata 。因此,我们将脚本 1 中的代码替换为:

<script> tdata = JSON.parse({{tempdata|tojson|safe}});
  tempdata = tdata.data;
  temptitle = tdata.title;
  chartType = "LineChart";
  containerId = "chart1";
  options = {"title":temptitle};</script>

名称用双花括号{{name}}括起来,这里我们也是说数据要转换成 json,并且包含‘安全’的 HTML,也就是说,我们不希望任何特殊字符转换成转义序列。

将数据放入模板后,我们将它分配给变量 tdata 并从中为数据和标题设置变量。

所以我们最终得到了两个文件,如清单 1 和清单 2 所示。

清单 1。烧瓶计划——作者图片

清单 2。网页——作者图片

现在这一点是重要的:首先,我们将 Flask app app.py ,其次,Flask app 希望 HTML 文件被称为weather.html(正如我们在清单中看到的那样),所以确保您给它起了那个名字。最后,Flask 希望它的模板是一个名为 templates 的目录,该目录与 Flask 应用程序在同一个目录中。

当你运行 flask 应用程序时,你会看到下面的页面。

除此之外,Google Charts 还有很多其他功能,但我希望这是一个有用的介绍,可以让你用 Python 应用程序生成这些功能。感谢阅读。

源代码

这里下载 zip 文件这里看基础 app 。

当你下载完文件后,将它们解压到一个空文件夹中,用 python -m flask run 运行 Flask app(如上)。

时事通讯

我可能会进一步研究这些代码和/或就这个主题写更多的文章。如果你想了解最新的文章,请考虑在这里订阅我偶尔发布的免费时事通讯。

如何为您的数据科学项目创建出色的 Web 应用程序

原文:https://towardsdatascience.com/how-to-create-stunning-web-apps-for-your-data-science-projects-c7791102134e?source=collection_archive---------7-----------------------

数据科学家不必学习 HTML、CSS 和 JavaScript 来构建网页。

在 Unsplash 上由Meagan carscience拍摄的照片

Web 开发不是数据科学家的核心能力。大多数数据科学家都懒得学习不同的技术来做这件事。这不是他们喜欢的咖啡。

然而,大多数数据科学项目也有软件开发部分。开发人员有时对问题有不同的理解,他们使用离散的技术。它经常会导致问题,并且毫无成效地消耗两个团队的宝贵时间。

此外,Tableau 和 Power BI 等可视化工具更侧重于数据探索。然而,这只是一个完整的数据科学项目的一部分。如果你需要集成一个机器学习模型,它们还远远不够完美。

Streamlit 允许你为你的数据科学项目开发网络应用。这个开源库的 API 完全是 python 的。因此,你不必学习任何其他网络技术来使用它。此外,它简单易学,修改灵活。

本文是对 Streamlit 的介绍。我们将构建一个交互式 web 应用程序,它接受用户输入,运行 K-means 算法,并在 web 界面中即时绘制结果。

到这篇短文的结尾,我们已经涵盖了

  • 安装 Streamlit 并试水;
  • 构建交互式网络应用程序;
  • 使用用户输入运行 K-means 算法;
  • 使用缓存提高性能,以及;
  • 在云上部署它;

这里是链接到部署版本。如果你想先睹为快,就去看看吧。

为开发建立 Streamlit。

这个非凡的工具有一个令人尴尬的简单设置,几乎所有 Python 用户都熟悉它。使用 PyPI。

pip install streamlit

也可以使用 conda 等流行的 python 包管理器。

完成后,您可以使用安装时附带的 hello world 应用程序对其进行测试。在终端窗口中执行下面的命令来启动开发服务器。

streamlit hello

hello world 应用程序是一套出色的可视化工具,您可以使用 Streamlit 来完成。上述命令将启动一个本地开发服务器,并在默认浏览器中打开链接。您还可以在同一页面上找到源代码。此外,这个示例应用程序还提供了许多高级教程的链接,可以帮助您自学。

现在设置已经完成,让我们创建一个应用程序来与我们的机器学习模型进行交互。

通过 Streamlit web 应用程序使用机器学习模型。

下面的应用程序使用 Pandas、Scikit-Learn、Matplotlib、Seaborn 和 Streamlit。开始之前,请确保您已经安装了所有必需的软件包。如果没有,下面的命令将为您完成。

pip install pandas scikit-learn matplotlib seaborn streamlit

创建您的第一个 web 应用程序

使用以下内容创建一个名为“quickstart.py”的文件。

来自作者的代码片段。

上面的文件很简单。为了便于说明,我在文件中添加了一些部分。

在主应用程序部分,我们有三行代码。我们向页面添加了标题和描述。然后我们在页面上显示数据框。“st.write”功能是一个一体化的解决方案。您几乎可以将任何内容传递给这个函数,Streamlit 足够智能,可以在 UI 中显示正确的小部件。为了了解不同的 Streamlit 函数,这里有一个备忘单。

让我们用下面的命令运行我们的初始应用程序。

streamlilt run quickstart.py

像 hello 应用程序一样,这个命令将启动一个新的开发服务器。在您的浏览器上,您会看到以下内容。

截图来自作者。

恭喜你,你刚刚创建了你的第一个 web 应用程序;没有 HTML,CSS,绝对没有 JavaScript。

但这只是初步的。一个网络应用可以做很多很酷的事情。它可以与用户实时互动,并更新其内容。让我们看看我们如何能做它。

添加交互

在 Streamlit web 应用程序中实现互动毫不费力。Streamlit API 包含几个小部件。您可以使用它们来获取用户输入并将它的值存储在一个变量中。其余的就像任何其他 python 程序一样。

让我们添加一个复选框来切换数据集显示。毕竟,没有人开发一个 web 应用程序来查看原始数据。用以下内容替换数据框显示(第 30 行)。

来自作者的代码片段。

如果刷新浏览器,现在可以看到一个复选框来切换数据框显示。

截图来自作者。

但是应用程序中间的切换按钮并不令人满意。让我们把它移到边栏。

向应用程序添加边栏

又是一个轻松的动作。Streamlit API 具有侧栏属性。您在主应用程序中创建的所有小部件也可以在这个侧栏属性中使用。

使用“st.sidebar”属性创建侧栏变量。然后将我们在主应用程序部分添加的复选框分配移动到侧边栏部分。请注意,我们现在使用“st.sidebar.checkbox”而不是“st.checkbox”

来自作者的代码片段。

在上面的代码中,我们还向侧边栏添加了一个滑块。这个小部件将捕获用户选择的集群数量。下面是输出的样子。

截图来自作者。

下一步,我们将使用用户选择的聚类数运行 K 均值算法。

使用实时输入运行 K-Means。

用下面的代码扩展导入、助手函数和主应用程序部分。

代码片段来自作者。

在上面的代码中,我们创建了一个函数来运行 K-Means 算法。它将数据框和聚类数作为参数,并返回一个 Matplotlib 图。

K-Means 聚类的示例超出了本项目的范围。这是一个机器学习算法,这才是我们关心的。不过你可以参考我之前的帖子描述一下。

我们使用 n_clusters 变量作为 run_forecast 函数的第二个参数,该变量捕获上一节中的滑块值。

如果你刷新页面,你会看到一个仪表板,接受用户输入,运行机器学习算法,并即时更新用户界面。

截图来自作者。

即使你是一个经验丰富的开发人员,这种级别的交互和与后端 ML 的集成也是一项艰巨的任务。尤其是如果你是一个不知道如何开发 web 应用的数据科学家,这可能会花费你数周的时间。

通过缓存提高性能。

数据科学管道中的一些任务非常耗时。然而,这种任务很少对相同的输入产生不同的结果。您可以使用 Streamlit 内置的缓存功能来存储它们的值以供将来使用。

虽然这听起来可能很复杂,但用 streamlit 做起来很简单。你的耗时任务应该是一个函数,你用 @ts 包装它。缓存装饰器。只要输入参数是相同的,并且函数体没有被改动,Streamline 就会从缓存中获取它。

在我们构建的应用程序中,我们调用外部 URL 来下载数据。如果它是一个活动的 API,您可能不想缓存它。但在我们的情况下,它不是。因此,让我们通过用下面的代码替换该行来缓存它。

来自作者的代码片段。

第一次重新加载时,您可能会在浏览器上看到消息“正在处理加载数据”。但随后的再装不会有那个音符。这是因为请求是从缓存中提取的,而不是从外部 URL 下载的。

在互联网上部署

如果您注意到了 Streamlit 控制台,您还会看到一个网络 URL。这意味着,如果您的防火墙允许,您的应用程序可以通过内部网访问。

但是如果你想在你的网络之外分享,我们有很多选择。正如文档所说,Streamlit 应用程序可以在 Python 应用程序工作的任何地方工作。

  1. Streamlit 推荐“Streamlit 共享”选项。你可以将你的代码放在 GitHub 存储库中,并配置 Streamlit 共享来为你的应用服务。
    Streamlit 共享是免费的,但目前只接受邀请。您可以为自己申请邀请。
  2. 你可以把它部署在云平台上。这里有一篇文章展示了如何用 AWS EC2 free 实例做到这一点。
  3. 您可以配置一个反向代理。Nginx 和 Apache 之类的代理服务器可以配置为服务于应用程序,并限制特定用户的访问。

请务必阅读关于部署的 Streamlit 社区指南,探索您可用的众多选项。

以下是我如何在 Streamlit Share 上部署这个教程应用程序的。再一次,Streamlit 的便利让我大吃一惊。

第一步:将你的代码放入 GitHub 公共库。 我已经将我的代码添加到这个 GitHub repo 中。我们需要确保它包含一个 requirement.txt 文件以及所有的依赖项。

第二步:使用你的 GitHub 账号登录Streamlit

第三步:在 Streamlit 控制台上创建一个新应用。 从下拉列表中选择您的 git hub repo,或者在 URL 中选择 past。选择要用于部署的分支。最后,选择主文件名并单击 deploy。

作者截图。

大约一分钟后,我的应用程序将在 Streamlit Share 上直播。但是部署时间可能因项目需求而异。

请注意,streamlit 共享目前只接受邀请。但我没等太久就拿到了。Streamlit 的部署文档包含了更多关于这方面的有用信息。

结论

不用说,Streamlit 解决了数据科学项目中的一个关键问题。它让数据科学家能够构建 web 应用程序,与他们的机器学习模型进行交互。

在这篇介绍性文章中,我们探讨了如何将 Streamlit 与 K-Means 聚类结合使用。虽然这是一个微不足道的应用程序,但它阐明了这项技术的核心概念。除了开发之外,我们还看到了如何在 Streamlit 中轻松管理缓存以提高性能。最后,我们讨论了部署选项。

细流远不止这些。请查看他们的官方文档,里面充满了优秀的教程。还有,他们的 API 备忘单有助于快速开发。

网络应用是一个很好的解决方案。但是在某些情况下,您可能不得不考虑与您的 ML 模型交互的其他方式。或许,为您的模型构建一个命令行界面会有所帮助。

谢谢你的阅读,朋友。看来你和我有许多共同的兴趣。一定要看看我的个人博客。

在 LinkedIn 、 Twitter 、 Medium 上跟我打招呼。我会为你打破僵局。

还不是中等会员?请使用此链接 成为 的会员。你可以享受成千上万的有见地的文章,并支持我,因为我赚了一点佣金介绍你。

如何创建 Tableau(业务)仪表板并利用容器

原文:https://towardsdatascience.com/how-to-create-tableau-business-dashboards-and-utilize-containers-90c0ec2b7e75?source=collection_archive---------9-----------------------

在本文中,我将给出如何创建业务仪表板的技巧,特别是如何利用容器。

Guillaume Bolduc 在 Unsplash 上拍摄的照片

(你也可以在 我的网站 上找到这篇文章以及其他文章和更多有趣的东西)

本文将部分基于我这个周末从超级商店数据集创建的工作簿,它是专门为本文制作的。

仪表板也可以在 Tableau 公共配置文件中找到, 此处,如果您想下载它并查看容器在仪表板中的使用情况。

仪表板的最终外观如下,稍后我将剖析仪表板的每个部分。

如何利用 Tableau 中的容器创建业务仪表板的 10 个技巧

这篇文章将基于我在创建业务仪表板时经常使用的 10 个技巧。其中许多将针对如何使用容器。

这些不是“神圣的真理”,但它们是我在尝试了许多不同的东西后,发现对我最有效的东西,我觉得分享这些东西很好。

提示如下:

  1. 画一个你想要的仪表盘的草图
  2. 从一个固定尺寸的较小仪表板开始
  3. 从一个垂直/水平浮动容器开始
  4. 给容器着色,从“后端”容器开始,以便更容易地构建仪表板
  5. 使用转换键移动集装箱
  6. 合并容器时,将容器放在的“正确位置”
  7. 利用并学习如何阅读项目层级****
  8. 使用“均匀分布内容”“固定宽度”****
  9. 使用“空白对象”作为各部分之间的分隔物
  10. 从固定尺寸更改为“范围-最小尺寸”****

1.如果仪表板应该是水平/垂直的,请快速勾画出您希望仪表板的外观和设计

上面仪表板的快速草图

如果你在开始操作仪表板之前已经决定了你想要什么和你想要它在哪里,这将是一个比以后改变它更容易的过程。

尝试决定你想在哪里有仪表板的主要领域,你想有过滤器,你想有多少可视化和类似的方面。

这里你还应该看看你的设计是更“垂直”还是“水平”。我将构建的这个仪表板有非常具体的“行”,最好构建在垂直主题上。

2.从固定尺寸的较小仪表板开始

固定尺寸较小的仪表板(1000 x 800)

使用较小的固定尺寸仪表板比使用较大范围或自动仪表板更容易设置设计。

我通常会启动一个尺寸为 1000 px * 800 px 的新仪表板,并在我的笔记本电脑上进行最初的设计。

后来,当我以一种好的方式得到容器设计时,我换了一个更大的、范围大小的仪表板,准备用于生产环境。

3.从一个垂直/水平浮动容器开始,稍后您将“修复”它

****

启动浮动容器

我总是发现使用后端浮动容器更容易,当你完成设计后,你可以在后台“修复”它。

当您在第一层使用浮动容器而不是固定容器时,在内部插入新容器并让它们在正确的位置对齐似乎更容易。

(提示:按下容器时按住 shift ,如上图,不需要在下面的菜单中切换到浮动)

4.对容器进行着色/重命名,并从“后端容器”开始,以便更容易地构建仪表板

着色/重命名的容器具有更好的结构

下面是一个例子,我已经开始建立上面的仪表板。顶部容器被重命名为“过滤器容器”,颜色为灰色。

画布的主垂直容器名为“画布容器”,三个画布容器以不同的方式命名和着色。

通过使用这种结构,很容易找到您想要使用的容器**,并在正确的容器中插入新的容器和新的纸张。**

5.使用 shift 键在容器和移除的平铺容器之间移动

******

移除平铺的容器,如果你设法“把它贴在背景中”**

大多数人可能都知道,可以按住 shift 键来移动容器,并将它们合并到其他容器中。

但是如果你也想把一个容器从后面移出(不把它转换成 UI 中的浮动容器),你可以这样做,如果你在项目层次结构中移除平铺的容器。

6.合并容器时,将容器放在“正确的位置”

放下集装箱的正确方法,以便与之前的集装箱对齐

如果你有一个包含多个容器的层次结构,有时很难将新的容器放到正确的位置。有一些有用的技巧可以正确做到这一点。

a)如果您看到顶部图片中的虚线**,这意味着新容器被放入仪表板中最外面的容器中**

b)如果您事先在容器中有两个项目,您可以将新项目放在中间**,它将始终放在仪表板上最外面的容器中**

**c)如果你有一个垂直的容器,**容器的底部是最困难的部分,把它放在别的地方,然后在物品周围移动。

**d)如果你有一个卧式容器,**容器最右边的部分是最难的部分,把它放在别的地方,然后在物品周围移动。

7。利用并学习如何阅读项目层次结构(目录)

项目层次结构

项目层次结构类似于一篇较长文章中的目录,它更容易看到不同部分之间的相互关系,并获得整个仪表板设计的概述。****

您可以重命名项目层次中的所有部分,也可以直接移除项目,使其成为浮动/固定平均分配项目。****

从本文中仪表板的特定层次结构中,我们可以看到:

**仅第 1 级

  • 后端容器**

第二级
→-
标题+过滤器容器-
→-顶部画布过滤器容器下面再往下****

**第三级

  • 滤镜容器在“标题+滤镜”容器

  • 三个不同的容器在“滤镜下的画布”容器内**

我认为项目层次结构是以正确的方式构建仪表板的最佳帮助之一。

8.使用“均匀分布内容”“固定宽度”****

如果你想控制项目在不同显示之间切换时如何自动调整大小,那么如果你学会恰当地使用“平均分配内容”、“固定宽度”和“固定高度”,会有很大帮助。

我的一些规则是,我总是将过滤器和文本框放在它们自己的容器中,其中固定高度**(如果在顶部)固定宽度(如果在右侧/左侧)。**

这些不是在移动到更大显示时必须调整大小的仪表板项目,而是仪表板中的重要图表在不同大小之间移动时会适当调整大小。

如果您正确使用“平均分配内容”,当您在不同大小的显示屏之间移动时,您将不会在仪表板中有任何不必要的空白区域。

9.使用“空白对象”作为各部分之间的分隔物

****

如果你想要在不同的部分之间有一些特定的线条,你可以包括“空白对象”。

**设置分隔线的背景,然后编辑分隔线的高度,我通常设置 2 为分隔线的高度。**

10。包括填充,使仪表板更加直观

结论

有许多方法可以增强一个 Tableau 仪表板,容器在其中的许多方面发挥了很大的作用。

在本文中,我讨论了创建更好的 Tableau(业务)仪表板的 10 种不同方法。

其中最重要的是利用项目层次**,知道如何使用浮动与固定容器,并知道如何**“平均分配内容”“固定宽度/固定高度”容器/仪表板项目。

我希望这些提示能在你阅读这篇文章的过程中对你使用 Tableau 仪表盘有所帮助。

感谢您的阅读

非常感谢你阅读我的博客!

请在下面留下您对内容的看法,或者希望就您如何利用容器或构建仪表板进行讨论。

我很想听听其他人是如何看待这些事情的。

**如果你喜欢阅读我的故事,并愿意支持我成为一名作家,可以考虑使用[这个链接](http://That’s it from my end for this blog. Thank you for reading! Let me know in the comments if you too learned something the hard way and wish your degree taught you. I would love to know more about your journey and thoughts. If you enjoy reading stories like these and want to support me as a writer, consider signing up to become a Medium member using this link (and I can earn a small commission with no extra cost to you!)) **,注册成为一名媒介会员,我和你可以赚取一小笔佣金,不需要额外的费用。

问题或询问

如果您有任何问题或建议,请联系我

****领英:www.linkedin.com/in/elias-nordlinder
邮箱:Elias.Nordlinder@gmail.com
网页:eliasnordlinder.com

祝大家这周过得愉快

如何为数据科学模型创建时间要素

原文:https://towardsdatascience.com/how-to-create-time-features-for-data-science-models-22b902df5115?source=collection_archive---------36-----------------------

为您的机器学习算法创建分类时间箱的独特方法

由卢卡斯·布拉塞克在 Unsplash 拍摄的照片【1】。

目录

  1. 介绍
  2. 创建时间要素
  3. 摘要
  4. 参考

介绍

数据科学建模最困难的部分之一是利用时间。时间可以有多种用途。有特定于时间序列的建模,但是您也可以用不同的方式来看待时间。我们将研究这种方法,即将时间转换成一个分类变量( s )。虽然转换后顺序将被剥离,但时间的周期性仍将能够被您使用的机器学习算法识别。对于本例,我们将使用新兴算法 CatBoost 来正确使用这些时间特性。例如,正常情况下,订购的时间是一天中从 0 到 24 的小时数。但是,算法仍然足够智能,可以将要素视为 bin 或类别(也可以是对象或分类数据类型),而不是数字数据类型。话虽如此,如果您想了解如何将时间戳转换为分类特征以用于数据科学建模的独特方法,请继续阅读下面的内容。

创建时间要素

使用的代码示例(相同时间特征值)。作者截图[2]。

下面,我们将描述用例或一般问题,以便您可以看到创建时间功能有用的示例。我们将展示这段对话的 Python 代码。最后,我们将在一些简单的代码后看看我们的特性是什么样的。对于未来的工作,您还可以通过将时间要素用作分类/对象或数值数据类型来比较模型,比较它们在精度或误差方面的变化。

用例

用例是预测进入餐馆的人数。尽管我们可以使用一天中的几个小时或一天中的半个小时作为数字特征,但就本文而言,我们可以使用这两个特征作为分类特征,最终将由 CatBoost 机器学习算法进行目标编码。

密码

from datetime import datetime, timedelta
import pandas as pd
import numpy as npdate_today = datetime.now()
date_range = pd.date_range(date_today — timedelta(7), date_today, freq='D')df = pd.DataFrame({'date_time_stamp': date_range})
df.head(5)

在上面的代码片段中,我们首先导入必要的库。接下来,我们创建从现在的到过去七天的随机时间戳数据。然后,我们可以查看带有df.head()的时间戳,它们都是一个主数据帧的一部分。

df['hour'] = ['{}:{:02d}'.format(r.hour, (r.minute // 60) * 60) for r in df['date_time_stamp']]
df['30_min'] = ['{}:{:02d}'.format(r.hour, (r.minute // 30) * 30) for r in df['date_time_stamp']]df[['date_time_stamp', 'hour', '30_min']].head(5)

在这个代码块中,我们看到我们正在创建两个时间特征。第一个是小时特性,它本质上是说— *这个非常具体的时间戳在哪个小时?*下一部分与此类似,但更细化,它说的是— 这一分钟的半小时是多少?

例如,如果时间戳的分钟是 12:46 pm,那么30_min将是 12:30 ( 本质上是从 12:30 到 1:00 pm 的一组值)

df.dtypes

在最后这段代码中,我们看到可以查看列的数据类型。第一个将返回datetime64[ns],两个新计算的要素将在分类要素列表中使用,作为objectcategorical数据类型。

这些特性在算法中是如何工作的

  • 这两个要素以及您可以进一步创建的其他要素可用于 CatBoost 模型的分类要素列表中,CatBoost 模型的一部分将使用目标编码,简单来说,就是特定时间要素条柱的平均目标。

半小时/ 30 分钟示例(不同的时间特征值)。作者截图[3]。

您可以在上面的第一个屏幕截图中看到,两个时间特性的输出具有相同的值,这是因为半小时周期仍在 30 的另一侧。如果您在 30+的日期时间尝试这样做,您将看到该值发生变化。那就是第二张截图不一样的地方,紧接着上图。出于用例的考虑,您最有可能期望餐厅的人数在大约12:0012:30以及6:006:30(分别为午餐和晚餐时间)时具有最高的平均目标值,而当餐厅关门前有一股人流时,可能会有一些新的发现,也许是9:30

摘要

时间很重要,在开发数据科学模型时不应忽视。然而,它可能是棘手的,可以以多种方式消耗。我们创建时间特征的方式是独特的,因为我们将一个示例时间戳转换为两个分类特征。我们看到,当时间为 13:14 时,半小时功能或30_min与小时功能相同,但当时间为 13:32 时,则不同。当然,在数据科学模型中,时间还有更多使用方式。

总而言之,我们执行了以下操作:

* created a mock dataset* isolated a timestamp* created two features from that one timestamp* realized those two features could be used as categorical features

我希望你觉得我的文章既有趣又有用。如果您同意《时代》杂志的这一专题创作,请随时在下面发表评论——为什么或为什么不同意?在你的机器学习算法中,还有哪些利用时间的方式?你使用的主要技术和 Python 库是什么?

请随时查看我的个人资料、 马特 Przybyla等文章,也可以在 LinkedIn 上联系我。

参考

[1]照片由卢卡斯·布拉塞克在Unsplash(2017)上拍摄

[2] M.Przybyla,所用代码示例截图(相同时间特征值),(2021)

[3] M.Przybyla,半小时/ 30 分钟截图示例(不同时间特征值),(2021)

如何创建 Xarray 数据集

原文:https://towardsdatascience.com/how-to-create-xarray-datasets-cf1859c95921?source=collection_archive---------9-----------------------

从头开始定义数据集

阿瑟·富兰克林在 Unsplash 上的照片

[Xarray](https://xarray.pydata.org/en/stable/)是一个开源的 Python 包,用于处理带标签的多维数据集。在处理地球科学界常见的 NetCDF 格式的数据时,它是必不可少的。

xarray打开 NetCDF 文件很简单。

ds = xr.open_dataset("/path/to/file.nc")

然而,创建一个可以保存到 NetCDF 文件的xarray对象需要更多的工作。在这篇文章中,我将回顾如何做到这一点。我将首先介绍如何将[pandas](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) 数据帧转换为[xarray](https://xarray.pydata.org/en/stable/generated/xarray.Dataset.html) 数据集,然后介绍如何从头开始创建数据集。

目录

1。pandas data frame to xarray dataset
∘1.1 如何添加元数据和更改变量名?
∘ 1.2 创建多维数据集
∘ 1.3 如何保存我的数据?
2。从头开始创建 Xarray 数据集
∘ 2.1 具有一个坐标的数据集
∘ 2.2 具有多个坐标的数据集
∘ 2.3 具有坐标矩阵的数据集
∘ 2.4 具有坐标向量和矩阵的数据集
3 .最终想法

1.熊猫数据帧到阵列数据集

从数据帧开始,您可以直接将其转换为数据集。

ds = df.to_xarray()

这可能是一个很好的起点,因为它为您创建了一个xarray对象。在下面的例子中,我用一个变量y和一个索引x创建了一个 dataFrame。然后我用to_xarray()把它变成一个xarray对象。

该数据集的格式还不是很好。以下是ds.info()输出:

作者图片

理想情况下,info()应该告诉你一些关于变量和整个数据集的元数据。例如,变量属性可以包括units,这对于温度之类的东西很重要,而全局属性可以包括原始数据源或数据集的创建者。目标是为用户提供一些数据的上下文。

在下一小节中,我们将向该数据集添加一些元数据。

对于气候和预报(cf),元数据有一个标准的约定。关于这一点的讨论超出了本文的范围,但这里有两个资源可供感兴趣的人参考:

  • cfconventions.org
  • cf 惯例概述

请注意,这篇文章是为了说明一个概念,因此我可能会偏离常规标准。

1.1 如何添加元数据和更改变量名?

随着对象的创建,我们可以开始添加元数据和改变变量/坐标名称。

字典key:value对用于重命名变量/坐标和添加属性。下面是基本语法:

  • 重命名变量 : ds.rename({“old_name” : “new_name”})
  • var 属性: ds[“var”].attrs = {“attribute_name”:”attribute_value”}
  • 全局属性:

下面的代码片段首先重命名坐标和变量,然后创建变量和全局属性。

(注:xarray 没有熊猫那样的 **inplace=True** 选项。)

下面是添加一些元数据后的ds.info()输出

作者图片

这是一个格式良好的数据集。用户可以很快理解这个数据集代表什么以及谁创建了它。在第 2 节中,我们将从头开始创建相同的数据集。

1.2 创建多维数据集

对于多个维度,只需在set_index()中包含一个维度列表。然后,您可以像以前一样添加元数据和更改变量

1.3 如何保存我的数据?

对更改感到满意后,可以将它们保存到 NetCDF 文件中:

ds.to_netcdf('/save/to/this/path/file.nc')

在下一节中,我将从头开始创建数据集。如果您想要将一个大的NumPy数组或列表保存为 NetCDF,这将非常有用。

2.从头开始创建 Xarray 数据集

以下语法用于创建带有xarray的数据集:

ds = xr.Dataset(data_vars, coords, attrs)

一个完整的数据集由三个字典组成:

  • data_vars:关键是变量名,值是由
    (dimensions, data, variable_attributes)
    • dimensions →名称列表
    • data →数据可以是任意格式(PandasNumpy、list 等)。)
    • variable_attributes可选属性字典
  • coords:定义坐标及其属性
  • attrs : 可选全局属性字典

属性是可选的,但是强烈建议使用。

2.1 具有一个坐标的数据集

下面使用xr.Dataset()创建与上一个例子相同的数据集。

data_vars :用一维time定义变量velocity,包含unitslong_name两个属性。

坐标:定义time坐标,其维度也称为时间。

属性:定义全局属性creation_dataauthoremail

2.2 具有多个坐标的数据集

如果数据是多维的,通常会有多个坐标。

在这里,我创建了一个数据集,其中变量有两个维度,xy,以及两个坐标,latlon

在前面的示例中,坐标和尺寸同名。这个例子说明它们不需要相同。

2.3 带坐标矩阵的数据集

在前面的例子中,每个坐标由一个矢量表示。但是,在某些情况下,将坐标表示为矩阵是有意义的。这在不规则网格上的地球系统模型中很常见。

让我们以前面的例子为例,使用np.meshgrid()将每个坐标转换成一个矩阵

np.meshgrid从坐标向量创建坐标矩阵。行网格在cols的长度上重复rows,列网格在rows的长度上重复cols。这是每个网格。

作者图片

现在让我们使用矩阵表示的坐标创建一个数据集。

这表示与以前相同的数据,唯一的区别是每个坐标表示为矩阵而不是向量。这是为了说明一个概念。在大多数情况下,将坐标表示为向量更有意义。

2.4 带有坐标向量和矩阵的数据集

坐标可以是矩阵和向量的混合。你只需要确保变量中的所有维度都在你的坐标中。

让我们创建一个具有三个维度的数据集, timelatlon。空间维度(latlon)将分别由矩阵表示,而time将是向量。

3.最后的想法

希望这有助于您创建自己的数据集并扩充现有数据集。

如果您的数据很小或者已经在熊猫数据框架中。那么使用to_xarray()是创建初始对象最简单的方法。在任何其他情况下,从头开始创建数据集可能更容易。

我介绍了两种表示坐标的方法:向量或矩阵。我的建议是尽可能保持坐标为向量。如果数据不在规则的网格上,通常使用矩阵来存储坐标信息。

如果创建数据集时出现错误,首先要检查的是维度。很容易将维度打乱顺序。

我的另一条建议是,尽管在创建数据集时属性是可选的,但最好总是包含它们,这样您和其他人就可以轻松地解释数据集。我更喜欢在创建数据集对象后添加属性。这是我认为提高可读性的个人喜好。

感谢您的阅读,我很乐意帮助您解决任何问题

https://lukegloege.medium.com/membership

如何用 Python 创建第一个线性规划求解器

原文:https://towardsdatascience.com/how-to-create-your-first-linear-programming-solver-in-python-284e3fe5b811?source=collection_archive---------10-----------------------

了解这些软件包是如何工作的,以及如何创建您的第一个求解器。

由夏嫣·胡伊津加在 Unsplash 拍摄的照片

线性编程

线性规划(LP)是通过求解线性方程来获得问题的最优解的方法。

好吧,对你来说还是个谜?那么让我试着简化更多。

线性规划将寻找一个问题,并使用像 xy这样的变量将它转换成数学方程。之后,就是尝试这些变量的数字,直到你达到最佳解决方案,可能是最大或最小的可能值。

如果我给你等式 x + y = 10 并求 *x 的最大值,*这就是 LP 的一个好例子。

之所以称之为线性是因为那些类似于 xy 的数学表达式可以表示为空间中的一条线,这意味着如果我通过找到 xy 的值来解方程,并将结果组合绘制在二维图形上,结果将是一条线。

看,是一条线![ x + y = 10 ]。图片由作者提供。

解释概念

在本节中,我的意图是将线性规划应用于一个非常简单的问题,这将使我们充分理解如何将我们的问题转化为一个方程,线性解算器如何工作以及如何对它们进行编程。

最重要的事情首先。在编码之前,让我们回顾一些概念。

  • 目标函数:那就是目标,你实际要解决的问题(比如利润最大化,损失最小化,空间分配最优化)。
  • 约束:罐和斜面。在解决问题的过程中,什么会发生,什么不会发生(例如,值不能为负,容器中的最大可用空间)。
  • 变量:问题的可变部分(如产品、价格、利润、规模)。

解决者(solver 的复数形式)

Python 中有几个可用的 LP 求解器包。其中有 SciPy,PuLP,CVXOPT。在本教程中,我们将使用PuLP

使用 pip 安装它:

pip install pulp # for Jupyter Notebooks
!pip install pulp

问题是

想象一下,我们有一个 100 米乘 100 米的正方形区域,我们必须从 0 点到右上角画一条最长的 45 度对角线。但是,让我们想象一下,在距离上边距 5 米的地方有一个栅栏,在距离右边距 5 米的地方又有一个栅栏。我想知道如果我必须停在围栏上,我的 X 和 Y 的最大值是多少(我画最长线的坐标)。

问题的可视化。图片由作者提供。

就像我说的,这是一个非常简单的问题。你大概自己算出来答案是 x=95,y=95 吧?这也是我方法的一部分。既然你已经知道了答案,让我们来研究一下我们可以建立的逻辑,让计算机得到结果。

目标函数

如前所述,目标函数是我们的目标,是我们想要完成的,是我们试图解决的。

目标函数就是我们要解决的问题。

在我们的例子中,我们想要画一条对角线。你是否同意我的观点,为了在 2D 图上画一条对角线,我们所要做的就是给 X 和 Y 赋予相同的值?

(x=10,y=10),(20,20)…。(80,80).X = Y =直线。图片由作者提供。

此外,我们希望将值加到最大值。这样,我们的目标函数就变成了 x + y

限制

在这个问题中,我们只有两个简单的约束:直线不能在栅栏之后,值不能为负。

约束是目标函数必须遵循的规则。

现在,为了将约束转化为数学形式,我们必须再次使用 x 和 y。让我们进行逻辑思考。如果场地是 100 x 100,我们有一个距离顶部 5 米、距离右侧 5 米的围栏,我们应该说 x 不能高于 100–5(*a . k . a . 95)。*这同样适用于 *y,*因为这意味着线越过了围栏。

  1. 0 ≤ x ≤ 95
  2. 0≤ y ≤ 95

创建求解器

下一步是使用纸浆来创建我们的解决方案,并找到最大的对角线结束坐标值。

将模块导入 Python 会话:

from pulp import LpMaximize, LpProblem, LpStatus, LpVariable

创建求解器和变量的实例。注意这里的lowBound参数将作为一个约束来防止负值。upBound参数并不那么重要,因为它会被 fence 约束覆盖,但是知道它的存在还是很好的。

# Create the **maximization** problem
model = LpProblem(name='Field Problem', sense=LpMaximize)# Initialize the **variables**
x = LpVariable(name="x", lowBound=0, upBound=100)
y = LpVariable(name="y", lowBound=0, upBound=100)

下一步是向模型添加约束。第一个元素是 LpConstraint 实例。第二个元素是您希望为该约束提供的名称。我们可以创建 x≥0 和 y≥0,但正如前面所解释的,这已经被考虑到了。

# **Add the constraints** to the model. Use += to append expressions to the modelmodel += (x <= 95, "margin_X") #it cannot go past the fence
model += (y <= 95, "margin_Y")

现在我们将目标函数添加到模型中。

# Objective Function
obj_func = x + y# Add Objective function to the model
model += obj_func

如果您想在求解之前查看刚刚创建的模型,只需调用您的模型名称。在那里你会看到它是如何从逻辑上将问题解读为数学问题的。以 x 和 Y 小于 95 为条件,最大化函数 x+y。

modelField_Problem: 
MAXIMIZE 
1*x + 1*y + 0 
SUBJECT TO 
margin_X: x <= 95  
margin_Y: y <= 95 

VARIABLES 
x <= 100 Continuous 
y <= 100 Continuous

求解。

status = model.solve()

打印报告。

print(f"status: {model.status}, {LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")
for var in model.variables():
    print(f"{var.name}: {var.value()}")for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")**[OUT]:**
status: 1, Optimal 
objective: 190.0 
**x: 95.0 
y: 95.0** 
margin_X: 0.0 
margin_Y: 0.0

不出所料, xy 的最大值是 95。

# The field solution plot# Create a plot space
plt.figure(figsize=(8,8))# Dimensions of the field.
xlimits=[0,100,0,100]
ylimits=[0,0,100,100]# Plot field
plt.scatter(xlimits,ylimits)
# Plot line SOLUTION
plt.plot([0,x.value()], [0,y.value()], c='red')
# Plot MAX POINT
plt.scatter(x.value(),y.value(), c='red')
# Plot Fence 1
plt.vlines(95, 0,100, linestyles='--', colors='red')
# Plot Fence 2
plt.hlines(95, 0,100, linestyles='--', colors='red')# Annotations
plt.annotate(f'Optimal Value: {x.value(), y.value()} --->', xy=(47, 96));

解决方法。图片由作者提供。

在你走之前

这篇文章的目的是给你一个温和的和用户友好的 Python 线性编程的介绍。这个例子非常简单,但我们的想法是从这里开始,理解基本概念,以便能够将其应用于更复杂的问题。

如果你想深入了解,这里有一个来自 Real Python 的很好的教程。

https://realpython.com/linear-programming-python/

如果这些内容对你有用,请关注我的博客。

https://medium.com/gustavorsantos

2021 年如何用 Coursera 创建自己的数据科学课程

原文:https://towardsdatascience.com/how-to-create-your-own-data-science-curriculum-with-coursera-in-2021-36feda936ead?source=collection_archive---------15-----------------------

用 Python 学习数据科学和机器学习基础的初学者友好方法

作者在他的无电缆管理的工作站上紧张地工作。感谢山姆·伯克的照片。

我在苹果工作的时候,我们有一套系统。如果您的设备有问题,您可以走进办公室,告诉我们问题所在,然后我们会让您知道如何当场解决问题,或者记下您的姓名,以便我们可以为您预约与技术人员一对一的时间。

我是一名技术人员,所以一旦我完成了一个客户,我就会看着名单,然后去找下一个。

一天,一个女孩拿着她的 iPhone 进来寻求帮助。我走过去和她打招呼,注意到她在一个蓝色的应用程序中滚动。

我问她这是什么应用。

她说是 Coursera。

那是什么?我问。

这是一个你可以学习不同东西的应用程序。

真的吗?你在大学学习吗?

不再是了,我只是觉得学点东西总是好的。

她不知道,但那一句话改变了我的一生。在那之前,我只在需要的时候学习:为了工作,为了学校。当然,有时我会追随自己真正的好奇心(玩电子游戏,学习烹饪),但她的话说明了一个事实,如果我真的想,我可以学任何我想学的东西。任何事。

有趣的是偶遇会有这种效果。

我自己的路

那天晚上,我回到家,搜索她告诉我的那个蓝色应用的名字。就好像我发现了一个新的世外桃源。你可以选择你想学的,明天就有课了。

什么?

在那之前,我一直在大学学习(并且失败了)。我考虑过要学什么,但是必须在特定的时间特定的地点不适合我。我 17 岁开始上大学。我只想坐在草地上看女孩。

唉,我从来没有真正使用过 Coursera,直到几年前苹果商店的女孩告诉我。

我离开了苹果公司,决定学习如何开发我正在帮助解决问题的程序。

在第四次学习编码的时候(前三次我都放弃了),我偶然发现了机器学习。换句话说,编写代码来使用数学在数据中寻找模式。

我想,我必须学会这个。

由于我认为我已经在大学度过了足够的时间,所以我整理了一份在线课程清单,以创建我自己的人工智能硕士学位。

你猜怎么着?

很多都来自那个女孩给我看的蓝色应用。

你自己的路

如果说 2020 有什么明确的话,那就是每个人都必须对自己的健康和教育负责。

现在是 2021 年(或者更晚,如果你在未来读到这篇文章,顺便说一句,你好),物理采集规则仍然悬而未决,许多人(也许你)正在转向在线资源学习,而不是传统资源。

这篇文章不是关于大学和在线学习的争论。做任何适合你的事。

这篇文章演示了如何使用 Coursera 快速拼凑自己的数据科学和机器学习课程。

然而,不要误以为你可以很快地完成课程,因为工作已经结束了。

学习任何有价值的东西,尤其是网上学习,不适合胆小的人。如果你还没有,你将不得不培养一种责任感。这就是开发你自己的课程能为你做的。这会让你陷入困境。

数据科学和机器学习课程示例

人们总是问我,为什么不用免费资源呢?

我告诉他们,当然,你可以使用免费资源。但是我发现它们对我来说不太管用。我刚用 Coursera 的时候,他们是按月收费的。我马上就知道我要付多少钱。知道我在为某样东西付钱让我更认真地对待它。

但是你不是付了大学学费吗?

是的。但是我没有看到钱从我的账户里出来。我以为它是免费的,我以为它是神奇的。我花了 5 年时间完成了一个 3 年的学位,最终负债 35,000 美元(与其他人相比,这是一笔可观但微不足道的债务)。

现在 Coursera 有一个服务叫做 Coursera Plus 。约 537 澳元(约 399 美元),可全年使用世界一流的学习材料。吼吼。如果在我开始使用 Coursera 的时候就有了,我会省下一大笔钱。

具体时间到了。

大约一年前,我写了一篇名为学习机器学习的 5 个初学者友好步骤的帖子,通过在互联网上收集资源来学习机器学习的基础知识。

这篇文章的重点是让读者从对编程一无所知尽快用 Python 编程语言编写机器学习代码。

因此,为了开始 2021 年,我想我会复制这个帖子,通过 Coursera Plus 提供一些 Coursera 课程。

但是等等…这不仅仅是简单的复制。我还整理了一个想法模板,你可以用它来记录你的进展。

如果你以前从未使用过概念,在点击右上角的“复制”按钮之前,探索一下模板并点击一些东西(不要担心,你不能破坏它),然后你将能够改变它以适应你的需要。

使用 data 和 Coursera 课程创建的数据科学课程示例。你可以复制一份,然后点击右上角的“复制”按钮,根据自己的需要进行编辑。为什么是观念?又好玩又免费。

你可以在 YouTube 上看到上面的概念模板和课程的视频演示。

现在,用一个步骤列表来减少一点互动怎么样?

注: 如果你正在读这篇文章,并认为“哇,这听起来像是 Coursera 的广告”,你是对的。Coursera 找到我,问我是否有兴趣写一篇帖子,专门帮助学生用 Coursera 整合他们自己的课程,我说有。也就是说,把这条消息作为一个披露,如果你点击这个帖子中的链接,并支付一些东西,金额不会改变,但我会得到你支付的金额的一部分(我用来创建这样的资源的资金)。

第一步:学习如何学习专业化

**是什么:**发现并复制艺术家、数学家、音乐家等的最佳学习技巧。

**为什么它很重要:**如果你要开始自己的学习之旅,你最好学会如何学习。学会如何学习是终极元技能。因为如果你能学会如何学习,你就能学到任何东西。

我建议每个人都学习这门课程,不管他们是学习数据科学、机器学习还是粒子物理。你可以在我的博客上查看我的完整评论文章。

第二步: Python 为大家特殊化

**是什么:**这个专业化将帮助你从零编程能力到能够编写 Python 代码。

**为什么重要:**如果你想进入数据科学和机器学习领域,很有可能你会去写 Python 代码。但是如果以前没有使用过 Python 语言,很难编写 Python 机器学习代码。所以使用这个专门化来熟悉 Python 的基本概念。

第三步:用 Python 应用数据科学

**它是什么:**现在你已经掌握了一些基本的 Python 技能,是时候开始对它们进行裁剪,以便能够处理数据了。这种专门化将使您熟悉流行的 Python 数据科学库,如 pandas、matplotlib 和 scikit-learn。

**为什么重要:*因为 Python 是一种通用编程语言,你几乎可以用它做任何事情。但是好消息是,你在 Python 中为每个人学习的基础知识可以在这里使用。更具体地说,您将开始学习如何使用:

  • pandas —一个广泛的数据分析库,用于处理 Excel 电子表格中的数据(行和列)。
  • matplotlib —一个 Python 库,用于使用您的数据创建可视化绘图。
  • scikit-learn —一个广泛的机器学习库,具有许多预先构建的机器学习模型和功能,用于准备和转换数据。

第四步:机器学习专门化

**是什么:**如何诊断机器学习问题?是回归吗?分类?聚类?信息检索?这个专业将教你如何回答这些问题,并建立能够在数据集内学习模式的系统。

**为什么重要:**Python 专业的应用数据科学教会了你如何操作和可视化数据,现在在机器学习专业中,你将学习如何编写机器学习代码来查找数据中的模式。

第五步:机器学习专用数学

**是什么:**如果你一直想知道机器学习算法如何能够学习数据中的模式,有一个答案:数学。主要是通过线性代数和多元微积分的结合(加上一些其他的)。

机器学习数学专业将帮助您理解为许多最有效的机器学习算法提供动力的基础数学。

**重要提示:**数据是自然的压缩形式,数学可以用来发现数据中的模式,代码可以用来执行大规模的数学运算。上面的步骤主要是让你尽快编写代码。然而,随着您了解的越来越多,您可能会想要发现您正在编写的代码是如何工作的。

这个专业将带你深入机器学习算法的内部工作,并进一步加强你对你正在编写的代码的理解。

为什么是这些?

在 Coursera Plus 上有 3000 多个专业/课程。对你来说太多了。

我挑选的这些来自我自己的个人经历(我已经浏览过了),或者因为它们的内容是世界一流的,正是你开始学习数据科学和机器学习所需要的。但话虽如此,如果有什么能激发你的兴趣,那就去做吧。

经历这一切需要多长时间?

按你自己的速度走。但是如果你把所有推荐的时间表加起来,你可能会在 12-18 个月之间结束。

然而,永远不要低估速度的力量。建议的时间表适用于平均水平为学生。你是普通人吗?还是你渴望学习?如果你是后者,记住,没有速度限制。

我需要 Coursera Plus 吗?

不。你可以单独挑选任何你想要的课程。然而,如果你打算经历以上所有,Coursera Plus 提供了一个很大的折扣。

我试过了,不喜欢…可以退款吗?

是的。注册 Coursera Plus 后你还有 14 天时间。

但这是我自己经历的另一件趣闻。我过去报了一个课程,害怕自己做不到。所以我给支持团队发了邮件,询问退款政策是什么。他们告诉我两个星期。

结果我没有得到退款。我完成了课程,挣扎着,错过了最后期限,但是当我从另一边出来时,我知道的比我开始时多得多。

基本面之后

这篇文章的主要观点是互联网让你可以创造自己的学习之旅。Coursera 是一个非凡的资源,我强烈推荐它,但它只是众多资源中的一个。

我们所说的一切都可以在 Coursera 之外学到。你甚至可以使用概念课程模板,用所有免费资源复制它,并跟踪你的进度。

假设你做了,你创建了自己的课程,不管是不是 Coursera 驱动的。你下一步应该做什么?

那个问题值得单独写一篇文章。但是最起码:分享你的作品。

写下你所学到的。用你自己的名字创建一个博客。搜索“如何用 GitHub 页面创建博客”或开始在 Medium 上写作。

不要担心别人已经写了你想写的东西。写下你所学到的东西的练习会进一步帮助你的学习。

六个月前的你会想知道什么?写下来。

关于这方面的更多信息,我推荐阅读“像我这样的初级数据科学家如何获得经验?”。

高级技能呢?

这篇文章已经涵盖了基本原理。如果你想拓展你的知识,我会推荐所有的 deeplearning.ai 课程和所有的 fast.ai 课程。

之后,你就完成了课程。开始你自己的项目。课程教授基础知识,自我驱动的项目帮助你学习细节(无法教授的知识)。

如何创建自己的仇恨推特探测器

原文:https://towardsdatascience.com/how-to-create-your-own-hate-tweet-detector-704508c34cd0?source=collection_archive---------13-----------------------

一步一步的教程,关于开发一个机器学习分类算法来检测 Python 中的仇恨推文

乔恩·泰森在 Unsplash 上的照片

发布一条仇恨的推文会有什么后果?

在推特层面,推特可以采取以下行动:

  1. 将推文标记为包含有争议或误导的信息
  2. 要求您删除该推文,然后才能再次发布
  3. 隐藏违规的推文,等待删除

在账户层面,这些行动是针对惯犯或做了特别恶劣事情的人采取的:

  1. 要求编辑配置文件或媒体内容,并使其在编辑前不可用
  2. 将帐户设置为只读模式会阻止推文、转发或类似功能
  3. 要求验证帐户所有权,以检测拥有多个帐户的匿名用户
  4. 永久暂停

Twitter 不同的“地狱圈”旨在确保没有用户会因为无意中发布了冒犯性的消息而受到过于严厉的惩罚。因此,除非你是一个惯犯,否则你不太可能删除你的帐户或将其置于只读模式。

仇恨言论真的那么普遍吗?

近年来,仇恨推特业务已经远远超出了柠檬水摊位。早在 2018 年第一季度,脸书就对 250 万条仇恨言论内容采取了行动,但在 2020 年最后一个季度,脸书对高达****2690 万条仇恨言论采取了行动。所以每个月大约有 900 万英镑左右。

脸书和推特都已经开发了检测仇恨言论的专有算法,因为它们看到了仇恨言论的恶毒和阴险性质,特别是在社交媒体平台上,因为它能够煽动暴力。能够开发这样的检测模型将被证明对任何初创公司都是有用的,特别是社交媒体,或者任何希望监控 Reddit 等在线论坛或公司内部通信中的仇恨言论的公司。

开发部署模型的步骤

马尔科·比安切蒂在 Unsplash 上拍摄的照片

下面是我对从原始数据到准备部署的模型的进展的粗略概述:

  1. 环境设置
  2. 数据收集
  3. 数据准备
  4. 模型训练和评估
  5. 超参数调谐
  6. 模型预测法
  7. 模型部署

您将在以下笔记本中找到该项目的完整代码:

https://github.com/datascisteven/Medium-Blogs/blob/main/Hate-Tweet-Detector/Hate_Tweet_Detector.ipynb

环境设置

照片由布雷特·乔丹在 Unsplash 拍摄

要创建环境,请将environment.yml放在您想要创建项目的文件夹中,并从终端中的同一个文件夹运行以下代码:

$ conda env create -f environment.yml

数据收集

开发任何有监督的机器学习算法机器的第一步是数据收集,即获得有标签的数据集。我从 Davidson 数据集开始,因为它已经包含了数据库中实际的 tweet 文本,我可以开始这个项目了,但是大多数带标签的数据库只提供 tweet ID。

由于数据集呈现出巨大的阶级不平衡,我进行了彻底而狂热的搜索,寻找额外的带标签的数据集来支持我的少数阶级,并偶然发现了这个网站:hatespeechdata.com。我最终决定了来自哥本哈根大学、亚里士多德大学和 HASOC 2019 共享任务数据集的数据集。

最初的戴维森数据集总共包括 24783 条推文,其中 23353 条(或 94.2%)被标记为非仇恨,1430 条(或 5.8%)被标记为仇恨。在将额外的少数民族实例合并到数据集之后,我通过将少数民族类实例增加到 7025 条(或 30.1%)仇恨推文(总共 30378 条推文)来解决类不平衡问题。

Twitter API

让我们来看看如何从 Twitter 上下载自己的一组仇恨推文。

对于只有 tweet IDs 的数据集,您需要申请一个开发人员帐户来访问 Twitter API 以获取 tweet 文本。公平的警告,它可能不是一个立竿见影的过程。Twitter 联系我,向我详细介绍我的项目细节。

完成后,创建一个应用程序从 Twitter 获取 API 键,然后将它们放在一个config.py文件中,无论它们是被赋给变量,还是作为值放在字典中,等等。

将这个config.py文件放入.gitignore以保持 API 密匙私有。要使用密钥,请将模块导入您的笔记本电脑:

from config import keys

如果keys是一个字典,我们可以很容易地用字典的不同键来检索 API 键:keys[‘key_value’]

Twitter 要求以特定的格式提交 id,每批不超过 100 个,以字符串格式提交,id 之间用逗号分隔,不能有空格。

第一个函数创建一个字符串列表,其中每个字符串是一批 100 个逗号分隔的 tweet IDs:

这段代码是在 Postman 代理的帮助下生成的,当前一个函数生成的列表作为tweets_ids:传递给下面的函数时,第二个函数生成请求字段的数据帧

为了您的方便,我已经在 repo 中包含了我的组合数据集combined.csv,以防您想跳过这些数据收集步骤。

数据准备

为了在机器学习算法中使用自然语言,我们必须将单词转换为数字,这是算法可以识别的形式。

推文与文本

让我们想想一条推文与任何一篇文学文本有何不同:

  1. 可能语法不正确
  2. 拼写可能不正确(即缩写、组合词、重复字母,如 FML、F$ckMyLife、Fuuuuuu$$ my life)
  3. 使用特殊字符,如#或@和表情符号

这里的目标是删除任何特殊字符,用户名,URL 链接,转发,任何不会增加句子语义的东西。

所以在这里进行一些无耻的自我宣传,但如果你需要快速刷新正则表达式,请查看我的帖子: To RegEx or Not To RegEx,第一部分To RegEx or Not To RegEx,第二部分

用于预处理推文的代码

我将简要讨论我在创建用于预处理推文的函数时的思维过程:

第一个函数用于词汇化,它返回每个单词的根形式,即“dimension”、“dimensional”和“dimensionality”都作为“dimension”返回。第二个功能是创建一个标记化和词条化的 tweets 列表,其中停用词和少于 3 个字符的词使用模块gensim进行标记化,这会自动降低所有词的大小写。

预处理功能的组件

  1. 转发是 Twitter 上转发的消息,包含 RT 标签和转发的 tweet 文本,有时还包含用户名。我决定保留转发的文本,但删除“RT @username ”,因为用户名没有增加语义值。
  2. 推文通常包含其他网站、推文、在线媒体等的 URL 链接。我删除了 http 和 bit.ly 链接,后者是一个 URL 缩短服务。
  3. Unicode characters 有一个 HTML 代码,以下面两个字符&#开头,后面跟着一个数字,可以指表情符号、符号、标点符号等。除了常规的标点符号之外,我还删除了这些,但在删除标点符号之前,我删除了 URL 链接。
  4. Hashtags 是前面有一个哈希(#)符号的单词或短语,用于标识它与特定主题相关,我决定保留这个短语,因为它通常具有一些语义值。
  5. 我将任何 1+的空白改为单个,并删除了任何前导和尾随空白。
  6. 我按照内部大写的指示,将所有连接的单词(如 AaaaBbbbCccc)分开。
  7. 我删除了所有大于 2 的重复字母,因为在英语中没有一个字母重复两次以上的例子。

我们最终得到的是一个小写单词的字符串,这些单词要么是词干化的,要么是词干化的,由空格分隔,并且在数据帧的每一行中都删除了停用词、1 个和 2 个字母的单词、特殊字符、用户名、标点符号、额外的空格和 URL 链接:

“lemma space separate lowercase tweet”

模型训练和预测

让我们通过下面的步骤创建一个管道,TfidfVectorizer(),它结合了CountVectorizer()TfidfTransformer()的功能,前者将文本转换为令牌计数矩阵,后者将该矩阵转换为规范化的 tf-idf 表示。

然后,我们在训练集上拟合模型,这里的X-train是预处理的 tweet 文本。我们不需要使用fit_transform,因为TfidfVectorizer()包含一个变压器:

一旦我们符合这个模型,我们就可以继续进行预测,并将任何推文分类为讨厌或不讨厌:

我们必须通过preprocess()函数传递推文,并使用经过训练的管道进行预测。这条推文最终被归类为仇恨推文。

注意:通过比较 6 种不同的算法并使用 GridSearchCV 执行超参数调整,确定这是最好的。结果位于以下报告中:

https://www.github.com/datascisteven/Automated-Hate-Tweet-Detection

下一步是什么?

  1. 您可以包含额外的标注数据集来改善类别不平衡。
  2. 您可以对预处理函数进行额外的调整。
  3. 您可以尝试不同的分类算法,包括 Doc2Vec 或神经网络。

在下一篇博客中,我将仔细看看最后一步:部署。我将看看我们作为数据科学家可以部署模型的不同方式。

GithubLinkedIn上与我联系,或者通过 [邮箱](mailto: datascisteven@gmail.com) 。在下面的 网站 看看我以前的博客和转帖。

如何创建自己的机器人日记

原文:https://towardsdatascience.com/how-to-create-your-own-robojournalist-36b463c91025?source=collection_archive---------29-----------------------

遵循我的一步一步的指导,用 Python 创建你的第一个数据到文本的新闻自动化系统

照片由雅诺什·迪格尔曼在 Unsplash 上拍摄

最近,我一直在想,我该如何向我的祖父解释我对自动新闻的自然语言生成的研究。我想,我可以创建一个简单的机器人记者来写他最喜欢的运动——足球。不幸的是,他已经在几年前去世了,但我会给你看。

期待什么?

在本文中,我将向您展示如何使用 Python 创建基于模板的新闻自动化系统。该方法本身非常简单,但是当您希望将一些重复的数据表示为书面报告,并确保输出如实地表示底层数据时,它确实很有用。

优点:

  • 简单—不需要 NLP 方面的专业知识,您只需要了解您的数据。
  • 流利——你造出的句子语法正确。
  • 准确—不包括黑盒解决方案,输出将总是真实的。

缺点:

  • 不可转移-对于下一个数据集,您需要重复整个过程。
  • 费力-设计模板和微调输出需要时间和精力,而且每当您有不同形状的数据或来自不同领域的数据时都需要时间和精力。
  • 重复—所有报告都相同。这可以通过添加替代模板或添加单词/替换单词来解决,请查看我的文章robo journalism——如何解决重复问题。

创建简单新闻自动化系统的分步指南

你是否有一些重复的数据进来,想以文本形式呈现给你的朋友/关注者/诸如此类的人?遵循这 6 到 7 个步骤来实现。

第一步:选择要报告的数据

我将使用《体育参考》提供的描述最近欧洲足球锦标赛的数据集。他们提供现成数据的 CSV 导出。这里可以找到。

步骤 2:加载数据并替换丢失的值

第三步:决定报道什么

我选择了以下数据字段进行报告

  • 轮次
  • 一天
  • 日期
  • 家庭(团队)
  • 得分
  • 离开(团队)
  • 举办地点
  • 笔记

步骤 4:创建模板

我对模板的想法很简单:我列出我想包含的句子。在句子模板中,定义的属性所在的位置被表示为{列名}。

步骤 5:将数据嵌入到模板中

我们有个小问题。我们提到 cadence 的第三个模板并不适用于所有活动,仅适用于跑步。这些缺失的值在我们的数据中用两条虚线表示。解决方案:在输出报告之前,删除最后包含两个破折号的任何句子。

第六步:输出

现在我们有了:关于 2021 年欧洲足球锦标赛的报道。我只包括了关于最后五场比赛的报道。

步骤 7:转换数据以微调输出

使用这种方法,您将获得与模板和输入数据一样好的输出。因此,通过对输入数据进行一些简单的转换,您将获得更好的输出。

感谢您的阅读!如果你学到了新的东西或者喜欢这篇文章,在 Medium 上关注我。我发表关于数据工程和数据科学的文章。你可以从 be 网页了解更多关于我的信息。

我有没有让你疑惑,如何让输出更生动?查看我的文章robo journalism——如何应对重复,并关注如何在你自己的 NLG 系统上应用我的想法的分步指南😊

如何创建自己的 VS 代码服务器

原文:https://towardsdatascience.com/how-to-create-your-own-vs-code-server-fa7812d308b0?source=collection_archive---------4-----------------------

在家工作与远程工作不同

约书亚·阿拉贡在 Unsplash 上拍摄的照片

Visual Studio Code 是一个免费的、轻量级的、跨平台的代码编辑器。它可能不像 IntelliJ Idea 或 PyCharm 那样是一个成熟的 IDE,但它是一个强大的、不受干扰的工具,拥有专门的粉丝群和蓬勃发展的生态系统。

近年来,VS Code 已经成为许多开发人员喜欢的编辑器,不管他们的背景、语言和选择的技术如何。因此,下一个合乎逻辑的步骤是尝试在任何地方运行 VS 代码。例如,我们已经看到 GitHub 如何将其集成到代码空间中,在那里您可以生成一个即时开发环境,并调整您的存储库中的代码。

在家工作与远程工作不同。远程工作意味着在世界上的任何地方全天 24 小时工作。

然而,GitHub 代码空间的缺点是定价。目前,这项服务处于公测阶段,可以免费使用。但是 GitHub 将会在 Codespaces 正式发布时宣布价格。不幸的是,我们在相应页面上得到的细节并不令人鼓舞。没有免费层,没有小实例,整体价格虚高。

如果您可以构建自己的服务器,或者租用一个较小的实例,甚至使用 GPU 或 TPU 加速获得一个较大的实例,会怎么样?此外,在下面的故事中,我们看到了如何使用远程开发来隔离您的项目并与您的团队成员轻松协作。

但是,如果您可以将 VS 代码与您的项目依赖项一起打包,创建一个真正灵活的环境,实现在世界上任何地方、任何时间工作的梦想,或者没有任何麻烦地加入新的团队成员,会怎么样呢?让我们看看如何创建自己的 VS 代码服务器!

学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!

创建自己的 VS 代码服务器

在这个故事中,我们将在 GCP 上使用一个 VM,但是你应该很容易使用任何机器或 VM 提供者。

首先,在 GCP 上启动一个虚拟机,至少有 2 个 vCPU 内核、1GB 内存和 32GB 标准存储。请注意,这个低端选项在代码空间上不可用。具有这种配置的虚拟机与 Codespaces 的预算产品之间的差异是每月 4 美元(一天 8 小时,一周 5 天)。在代码空间,你要支付大约 13.5 美元,而在 GCP 大约 9.5 美元。

差别不是很大,但是使用你自己的虚拟机给了你更多的灵活性;你可以根据自己的需要精确调整它,当你需要更大马力时扩大它的规模,当你测试一个新想法时,你可以放弃。

  1. 导航至侧边栏上的Compute Engine -> VM Instances
  2. 现在单击Create Instance创建一个新实例
  3. 根据gcping.com选择离你最近的地区(任何地区都可以)
  4. 从通用系列中启动一个E2系列实例
  5. 将类型更改为 custom,并设置至少 2 个 vCPU 核心和 1GB RAM
  6. Boot Disk更改为 Ubuntu 20.04图像,并设置为 32GB
  7. 导航到Security -> SSH Keys并在那里添加您的公钥*
  8. 点击创建!

*如果你不知道如何创建你的 SSH 密钥,请看 GCP 指南这里

您的实例将在几秒钟内准备好。点击右边的SSH按钮,连接到机器并安装 VS 代码服务器。

连接到虚拟机实例—按作者排序的图像

为了安装一个 VS 代码服务器,我们将通过编码器使用code-server。要安装它,请运行以下命令:

curl -fsSL https://code-server.dev/install.sh | sh

等待几秒钟,然后通过执行code-server启动服务器。VS 代码实例将开始监听localhost以避免向外界暴露自己。这是至关重要的,因为有人可以完全接管你的机器使用 VC 代码终端。

那么,如何连接到服务器呢?最简单的方法是使用 SSH 转发。首先,停止服务器并运行以下命令来禁用密码身份验证方法,然后重新启动服务器:

sed -i.bak 's/auth: password/auth: none/' ~/.config/code-server/config.yamlsudo systemctl restart code-server@$USER

假设您已经设置了一个项目范围的 SSH 密钥,启动您的本地终端并运行以下命令:

ssh -i [path/to/your/private/key] -N -L 8080:127.0.0.1:8080 [user]@<instance-ip>

最后,启动一个终端并导航到[http://127.0.0.1:8080/](http://127.0.0.1:8080/)。你现在有了自己的 VS 代码服务器!

浏览器中的 VS 代码—作者图片

如需详细文档,请访问 GitHub 上的code-server 文档页面。

结论

Visual Studio Code 是一个免费的、轻量级的、跨平台的代码编辑器,是一个强大的、不受干扰的工具,拥有专门的粉丝群和蓬勃发展的生态系统。

将它作为一个网络应用程序来运行,可以让你在世界上的任何地方,使用任何媒介(甚至是你的 iPad)来工作。此外,您可以将其与您的项目一起打包到孤立的容器中,并创建一个无缝的入职流程。所以,继续构建你自己的 VS 代码服务器吧。

关于作者

我叫 Dimitris Poulopoulos ,我是一名为 Arrikto 工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请在 Twitter 上关注我的 Medium 、 LinkedIn 或 @james2pl 。此外,请访问我的网站上的资源页面,这里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!

如何创建您的个人数据科学学习课程

原文:https://towardsdatascience.com/how-to-create-your-personal-data-science-learning-curriculum-676329562331?source=collection_archive---------14-----------------------

由 envato elements 的 hoangpts 使用图像创建(经许可)。

加上我整理的数据科学课程列表

1.介绍

数据科学是一个快速发展的领域,因为它为企业和行业带来了巨大的价值和数据驱动的洞察力。作为一种职业,数据科学家被誉为 21 世纪最性感的https://hbr.org/2012/10/data-scientist-the-sexiest-job-of-the-21st-century,这也是发表在《哈佛商业评论》上的标志性文章的标题。

每个有抱负的数据科学家在他们的数据科学学习旅程中都会遇到的一个问题是: 一个人到底应该如何学习数据科学? 这个问题的答案可能会有很大的不同,这取决于学习者可以获得的独特机会和资源。

您可能想知道以下问题:

  • 我应该攻读数据科学的研究生学位吗?
  • 我应该参加训练营以获得数据科学技能吗?
  • 我应该找一个能指导我进入数据科学领域的导师吗?
  • 我可以接受数据科学方面的在职培训吗?
  • 作为一个自考的人可以自己学习数据科学吗?

以上问题都是有效选项。

在本文中,我们将重点关注后一种选择,即如何作为自学者自学数据科学。怎么会?通过设计你自己的个人学习课程。

让我们开始吧!

如何创建你的个人数据科学学习课程 @ 数据教授 YouTube 频道

2.自学数据科学

就我个人而言,当我在 2004-2005 年作为一名生物学本科背景的博士生开始学习数据科学时,我基本上是自学的。当时,术语数据科学还不存在,而是使用术语数据挖掘机器学习*。*

对我来说,我可以肯定地证明,这一旅程并不容易,道路也不清晰。我在我的一些 YouTube 视频中探索过这个故事( 一个生物学家如何成为一个数据科学家成为一个数据科学家(读博士或不读博士) )。长话短说,我想应用机器学习来分析和理解生物数据集。

了解我现在所知道的,再加上现在存在的关于数据科学的学习资源的指数增长,我可以说,这些天的学习环境对于闯入数据科学的初学者来说更加友好。

让我们在本文的后续部分更深入地探讨如何自学数据科学。

3.创建您的个人学习课程

有很多关于数据科学的学习资源(我们将在本文中介绍),但并非所有这些都是通用的。正是因为这个原因,重要的是我们要弄清楚哪些话题是我们最感兴趣的,并专注于这些话题,而不是试图分散我们的精力,试图了解一切。

如果你想制定自己的学习计划或个人学习课程,从为什么开始。

你为什么学习数据科学?

您打算如何使用和应用数据科学?

通过回答这些问题,您将能够找出您对数据科学中的哪些特定主题最感兴趣,以及哪些主题能够帮助您解决数据问题。

为什么为了学习而将宝贵的时间集中在学习数据科学中的琐碎主题上,而这并不能提供您需要的结果?

一旦明确了原因,您将能够自信地在数据科学主题的丛林中导航,并特别关注那些可以帮助您从点 A* 到点 B 获得所需结果的主题。*

4.关于数据科学的免费学习资源

有大量与数据科学相关的学习资源。让我们考虑免费路线和付费路线(在下一节)。

先说免费的学习资源。

4.1.油管(国外视频网站)

YouTube 通常被认为是互联网上仅次于谷歌的第二大搜索引擎。很多时候,你可以在 YouTube 上找到你想要了解的东西。尽管如此,并不是所有你想学习的主题都在一个完整的结构化课程中提供。然而,你无法打败 YouTube 上免费提供的精彩内容。

以下是一些 YouTube 频道,您一定要订阅其中的数据科学内容:

  • 数据教授(是的,那是我自己的 YouTube 频道😎)
  • 肯吉
  • 克里斯·纳伊克
  • 代码基础
  • 黄婷婷
  • 丹尼尔·伯克
  • 尼古拉斯·雷诺特

4.2.博客和网站

博客也是学习数据科学各种主题的重要资源。很多时候,你会谷歌感兴趣的特定主题,你会点击顶部的搜索结果,然后会带你到包含数据问题解决方案的网站和博客。

这里有一些很棒的博客和网站:

  • 数据教授@ Medium (←是的那也是我自己关于 Medium 的博客😎)
  • 走向数据科学
  • 向着艾
  • 自由代码营
  • 极客书店
  • 机器学习掌握度
  • Kaggle Learn

4.3.书

书籍是很好的资源,我会不时地节约使用,作为各种感兴趣话题的参考。

在我个人从零开始自学的学习过程中,我试图从书本中学习编码概念,但根据我自己的经验,我主要是解决任意的问题,这不能让我参与到学习中。不幸的是,这让我把学习编码搁置了一段时间。

在我随后的尝试中,我改变了学习方式,不再仅仅依靠书本上的例子来学习,而是使用我自己的数据问题作为学习的基础。在那里,我会搜索、阅读与手头问题相关的精选书籍章节和教程。这给了我即时的满足感,让我在学习过程中保持动力。

现在,让我们探索一些免费的图书资源。其中有几本书是免费(软拷贝形式)和收费(硬拷贝和软拷贝形式)提供的。

  • 这本长达百页的机器学习书籍 ( 阅读电子书 ) 提供了机器学习中关键概念的简明高层次概述。
  • Python Data Science Handbook:Essential Tools for Working with Data(阅读电子书)提供了初学者友好的概念和示例代码,用于使用 Python 执行 EDA 和机器学习模型构建。
  • 机器学习的数学 ( 阅读电子书)提供了机器学习中底层数学的解释。
  • 处理几乎任何机器学习问题 ( 阅读电子书)是一本实用的食谱,为读者提供示例代码,帮助他们启动自己的项目。
  • 统计学习介绍:R 中的应用 ( 阅读电子书)提供了统计学习中的关键主题以及伴随的 R 实践的广泛且技术性较低的覆盖范围。

4.4.播客

我经常发现播客是一种很好的补充资源,可以增加学习体验,因为它们经常提供由经验丰富的数据科学家和数据工程师分享的数据科学的见解和背景。

  • 肯最近的邻居
  • 数据科学的艺术家
  • 数据帧(由数据营提供)
  • 超级数据科学(乔恩·克罗恩)
  • 在数据科学领域建立职业生涯(杰奎琳·诺利斯和艾米丽·罗宾逊)
  • 走向数据科学
  • 实用 AI(Changelog Media)

5.数据科学的付费学习资源

在现有的付费学习资源中,我们将把大学和训练营排除在外,因为从技术上来说,它们采用讲师和导师的方式,通常在现场实时提供。这种方法的伟大之处在于它提供了结构化的课程。也许是另一篇文章的主题。

5.1.书

书籍也是自学数据科学的重要资源,但根据我自己的学习经历,它们可能不是最吸引人的途径。当然,几乎有一本书可以满足你在数据科学中可能遇到的任何主题,但我经常发现它最好作为补充学习资源,与你正在学习的课程(稍后将讨论)一起使用。我经常发现书籍有助于深入探究我感兴趣的特定主题。因此,在我们弄清楚我们想读哪本书之前,我们首先要弄清楚我们想探索什么主题。因此,为了最大化从书本中学习的益处,我们需要精心设计我们自己的个人学习课程。

5.2.学习平台

学习平台也是自学的好方法,因为它们提供结构化的课程*,与大学和训练营提供的课程非常相似。另一个伟大的事情是异步学习方法,它适应了职业人士的生活方式,学习者可以在业余时间学习并取得进步。*

事实上,有好几个平台可供选择,你应该选择哪一个呢?坦率地说,所有的平台都提供了很好的内容,也许交易的破坏者在于每个平台的细微差别。让我们看看这些平台的不同类别,这可能有助于您决定哪个最适合您的需求或学习风格。

5.2.1.定价

为什么要付费上课程?
虽然如果课程是免费的就好了,但就像生活中的所有努力一样,创建课程需要大量的计划和时间来创建内容,这也需要在学习平台上托管视频内容的费用。

创建一个高质量的课程需要时间和金钱,那么这些是如何融资的呢?在 YouTube 等免费平台上,部分广告收入流向了内容创作者以及附属链接(如本文中的链接),这些收入用于资助内容创作者,以便他们可以创作更多精彩的内容。

由于这些学习平台不提供广告,因此最终支持讲师的平台融资方式是来自课程和订阅销售的收入。

有哪些定价方案?
学习平台通常按课程收费(如 Udemy)或按订阅收费(如 Coursera、DataCamp、DataQuest、O'Reilly Learning、Udemy Business 等)。).

订阅计划——正如你所看到的,大多数平台在订阅的基础上收费,同时提供一些免费的课程内容或免费试用期,以测试它们是否适合你。这种做法的好处就像自助餐一样,你可以无限制地使用课程,而坏处是你可能会付出高昂的代价,如果你正在学习新东西,这是没问题的,但我经常发现自己支付订阅费,我可能很少访问,特别是在繁忙的工作时间表。

按课程付费——Udemy 似乎是唯一提供按课程付费模式的平台。这似乎是最灵活的,因为它以直接的方式工作。你只需支付你所学课程的费用,不多也不少。对于您付费的课程,您将无限期地拥有课程的使用权。例如,我总是能够访问一两年前购买的课程。这样做的一个缺点是,你可能会积累和储存课程,很少访问它们。对此,一个简单的补救办法是在推进学习之旅时自律、坚持和坚持,这样你就能实现你为自己设定的预期目标,无论是成为一名数据科学家还是提高技能。

5.2.2.教练

知名的学习平台,如 Udemy、DataCamp、Coursera 等。热衷于吸引该领域的顶级和有才华的专家,这在平台上教授的内容中得到了很好的反映。

例如,我的好朋友 Ken Jee(他全职负责数据科学,兼职是 YouTube 上的内容创作者)在 Udemy 上开设了一门课程。其他知名的数据科学 YouTubers 和才华横溢的教育家,如 Tina Huang、Daniel Bourke 和 Giles McMullen-Klein,也在 Udemy 平台上创建了数据科学课程。

除了数据科学之外,其他的导师还包括安吉拉·于和,她们在 Udemy 上开设了广受欢迎的课程,教授如何编程。

受到这些才华横溢的 YouTuber 课程创建者的启发,希望我能找到时间和动力来创建自己的数据科学课程。请在评论中告诉我,我应该创建哪个课程。

5.2.3.证书

学位和证书在职场人士中一直很受欢迎,因为它们经常被用作向雇主展示知识/技能的证明。其中一些学习平台在学员完成一门课程后授予证书(如 Udemy、DataCamp 等)。)而另一些则是在完成一系列课程后(如 Coursera)。

作为一名 YouTube 用户(查看我的 YouTube 频道, 数据教授 ),我经常被观众问及证书的价值。我诚实的回答是,这些课程所包含的知识总是有益于一个人的学习之旅。但是为了将新获得的知识内在化,为了将这些知识转化为可操作的技能,使之成为你内在的一部分,那么学习不会在获得证书后停止。相反,我总是建议将新获得的知识/技能应用到项目中。

6.看看 Udemy 平台

以下是我对 Udemy 平台的真实看法,它是一个供自学的数据科学家使用的付费学习资源。

Udemy 上的一个课程截图。

让我用简洁的要点来总结一下。

  • 价格和灵活性 —首先,Udemy 有两个版本:(1)针对典型用户的普通计划,按课程销售(我们将在本节中介绍)和(2) Udemy Business(这是一种基于组织的订阅服务,提供。对于普通计划,用户可以购买课程并终身访问,这与基于订阅的计划相比可能更经济。鉴于我们选修了许多课程,订阅也可能是经济的。但是如果我们有节制地学习课程,那么购买个别课程可能更划算。还应注意的是,一旦订阅结束,就失去了对这些课程的访问权。偶尔,一些课程也可以在输入特殊的访问代码后完全免费提供
  • 讲师 —如上所述,涵盖数据科学的课程主题由 Ken Jee、Daniel Bourke、Angela Yu 和柯尔特·斯蒂尔等天才教育家授课。
  • 课程主题 — Udemy 拥有大量课程,不仅涵盖数据科学和机器学习,还包括艺术、通信、商业等。这可能有助于提供提高技能的机会来学习各种技术和软技能。
  • 课程内容 —除了视频,课程还可能配备辅助材料来帮助学习体验。比如 Daniel Bourke 的 完全机器学习&数据科学 Bootcamp 2021 在 Github 上也自带代码、工作簿和模板(Jupyter 笔记本)。
  • 教学模式 —课程通过小视频进行教学,这些视频被分成几个部分,这可能有助于跳到你感兴趣的特定主题。这可能非常类似于 YouTube,但有一个额外的好处,即在完成课程后,会授予结业证书。另一个好处是课程范围内各种主题的全面覆盖(这可能是也可能不是 YouTube 视频的情况,YouTube 视频可能是关于特定主题的独立视频,如果我们想更深入地探索该主题,可能会让我们悬而未决)。

7.精选课程清单

这里是根据主题分类的学习数据科学的顶级课程的精选列表。

计算机编程语言

  • Python 绝对初学者 贾尔斯·麦克马伦-克莱因著
  • 代码 100 天——2021 年 Python Pro 训练营全集 作者 Angela Yu
  • 现代 Python 3 训练营 柯尔特·斯蒂尔著

结构化查询语言

  • 终极 MySQL 训练营:从 SQL 初学者到专家 作者柯尔特·斯蒂尔
  • SQL — MySQL 用于数据分析和商业智能365 个职业
  • SQL for Tech 与数据科学访谈Tina Huang

机器学习

  • 完全机器学习&数据科学训练营 2021 作者丹尼尔·伯克
  • 机器学习 A-Z:数据科学中的实践 Python&R作者:基里尔·叶列缅科
  • 何塞·波尔蒂利亚 Python 数据科学和机器学习训练营
  • 2021 年 TensorFlow 开发者证书:零到精通 作者:丹尼尔·伯克

模型部署

  • Web 开发者 Bootcamp 用 Flask 和 Python 作者何塞·萨尔瓦蒂耶拉
  • 学习 Jesse E. Agbe 的 Streamlit Python

职业

  • 如何在数据科学领域开始职业生涯 2021 作者 Ken Jee

8.将新发现的知识转化为实际应用

随着时间的推移,通过完成越来越多的证书来积累知识当然很好,但同样重要的是将这些知识/技能用于构建不断增长的项目组合。因此,我强烈推荐建立一个作品集网站(和 GitHub 个人资料),你可以用它来展示你惊人的作品。

相信我,这是一个游戏改变者,因为他们不仅可以作为其他志同道合的同行的有用资源,而且你的工作也可能激励那些正在开始类似旅程的人。当知道有人从你的项目和内容中获益良多时,这种喜悦和兴奋会激励你继续你的项目分享努力。

事实上,反复使用新发现的知识的过程也有助于巩固它,这样随着时间的推移,你最终会掌握它。俗话说得好,熟能生巧

9.时间管理

尽管如此,我总是以完成而不是完美为目标。在我看来,完美是我们对作品的个人看法,可能是真的,也可能不是。例如,今天对我们来说似乎完美的东西,5 年后对我们来说可能是平庸的。

我总是喜欢这样想。假设我们有一周的时间来完成任务。可能需要 20%的时间来达到 80%的完美,而剩下的 80%的时间来完成任务。回到过去,我会追求完美,用额外的 80%的时间做些琐碎的调整。

当然,偶尔你会想花额外的时间来创造一个杰作,但并不是所有的任务都必须是杰作。

为什么?

因为根据我自己的经验,这可能会导致拖延症,也可能会导致倦怠。由于时间是有限的,我们必须充分利用时间。要学的和要做的事情实在太多了,因此我们不能陷入困境或停留在一个特定的主题上(只知道足够完成任务并继续前进)。

结论

总之,我们探索了一些自学者可以用来学习数据科学的学习资源。特别是,我们已经了解了一些免费和付费资源以及每种资源的独特优势和弱点,同时还分享了我的一些经验和技巧,介绍如何在学习和实施数据科学时最佳地利用这些资源。

公开

  • 这篇文章中可能有附属链接,我可能会从合格的购买中获得,这将有助于未来内容的创建。

接下来读这些

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

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

关于我

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

*https://www.youtube.com/dataprofessor

在社交网络上与我联系

✅YouTube:http://youtube.com/dataprofessor/
♇网站:http://dataprofessor.org/(在建)
♇LinkedIn:https://www.linkedin.com/company/dataprofessor/
♇Twitter:https://twitter.com/thedataprof
♇Facebook:http://facebook.com/dataprofessor/
♇github:https://github.com/dataprofessor/
ϝInstagram:】*

粉碎你的数据带回家面试的 12 个策略

原文:https://towardsdatascience.com/how-to-crush-your-data-take-home-interview-a0b9f7c97d6?source=collection_archive---------9-----------------------

揭开数据面试中最令人沮丧的一步

采访模因,公共领域

T 对于试图获得数据科学或分析工作的人来说,最令人沮丧的事情莫过于花 10 个小时纠结于一项带回家的任务——进行详尽的分析、创建可解释的可视化、训练模型等。—只是收到一封固定的拒绝邮件,当你要求对你的工作进行反馈时,却碰了壁。

像许多渴望从事数据工作的人一样,我对这种经历并不陌生。

不管是好是坏,带回家的作业是许多公司数据角色面试过程中不可或缺的一部分。它们可能非常模糊,几乎总是比公司要求的花费更多的时间来完成一项彻底的工作,并且不提供你在工作中会有的工具(用于数据清理/处理的帮助功能,用于更快和更强大的可视化的可视化工具,如 Tableau/Looker/Mode Analytics)。

然而,带回家的作业可以创造公平的竞争环境,因为对你的评估是基于你的工作成果,而不是你的背景。对于缺乏经验的人来说,这是一个让自己与众不同并展示技能的好机会。

在我做这些带回家的任务的 4 年里,**我已经把我的带回家→现场转换提高到 90%以上,而没有全职工作经验。**这篇文章的其余部分介绍了一些策略,这些策略对我完成这些任务并参加现场面试非常有效,我希望你也能发现它们的价值。

2 种带回家的数据

在深入探讨特定策略之前,我想区分两种带回家的作业——分析带回家的作业和机器学习带回家的作业。

顾名思义,分析带回家侧重于分析。通常,会给你一些不同的数据表(销售数据、产品使用数据等。)你必须弄清楚如何按摩和连接在一起。这些带回家的问题中有许多是根本原因分析问题,其中某个特定指标呈上升或下降趋势,要求您解释是什么推动了这种变化。根本原因问题也可能有一个统计显著性成分,在这里你被要求证明趋势是否是公司应该关注的事情。

偶尔,你会接到一个更具体的任务,比如计算一个特定的指标(从免费产品到付费产品的转化,流失,NPS,等等。),随着时间的推移对其进行跟踪,并对您的发现进行评论。

另一方面,机器学习带回家需要你应用机器学习来解决一个特定的问题。在这些面试中,你会花很多时间思考特征工程、模型选择、超参数调整和评估。可能会有一些评估指标作为基准(例如,80%的准确率、65%的 F1 分数等。),但通常不会告诉你什么是“好的表现”。

分析带回家的小贴士

通过分析带回家,**你的目标是进行彻底的分析,为公司提供具体的建议。**你越容易让评分者了解你的思考过程并理解你的结果,你就越有可能表现出色并进入现场面试。以下策略帮助我不断将分析带回家转化为现场分析:

1.花时间理解和清理数据

虽然深入研究并开始将表连接在一起可能很有诱惑力,但退一步花时间理解数据是至关重要的。在浏览数据时,请记住以下几点:

标识符列

  • 应该是主键的列实际上是唯一的吗?如果不是,您将如何处理重复值(保留第一个值,保留最后一个值,等等)。)?

数字列

分类列

  • 计算每个类别的频率。最常见/最不常见的类别是什么?
  • 有没有可以通过一些简单的文本操作合并在一起的类别(例如,相同的类别名称但不同的大小写,清晰的错别字)?
  • 在问题的上下文中,是否存在没有意义的值(例如,当您知道所有订单都应该来自美国时,来自俄罗斯的订单)?
  • 是否存在缺失值?处理丢失的数据本身可能是一整篇文章,但是这篇文章是一个关于如何思考这个问题的很好的资源。

时间戳列

  • 时间序列中是否有间隔(例如,错过一整天或多天,数量少得惊人的几天)?
  • 是否存在缺失值?处理丢失的数据本身可能是一整篇文章,但是这篇文章是如何思考这个问题的好资源。

自由文本栏目

有时这些列只是元数据(url、产品描述等。),但它们也可能包含有价值的信息(如客户反馈)。如果一个专栏似乎有助于你的分析,你可以用它来寻找支持你的发现的轶事和/或创建额外的专栏(文本长度,某些关键词的出现/频率等。)在你的分析中探索。

加盟表

一旦您清理了数据并需要将表合并在一起,您将需要非常仔细地考虑连接类型。在连接两个表之前,考虑一下输出应该是什么样子(例如,用户应该有一个订单还是多个订单?是否应该包括没有订单的用户?).如果您在连接数据之前已经考虑了输出应该是什么样子,那么您可以验证结果是否符合您的预期,并在必要时调试您的代码。

2.系统地寻找根本原因

对于根本原因分析,您可以通过检查特定指标的输入来系统地深入问题。

举个具体的例子,让我们假设你正在调查最近的销售下滑。首先,我们要确定销售的组成部分。

总销售额=订单数量*平均订单价值

如果我们计算每日订单数量和每日平均订单价值,我们可以确定哪些组件导致了下降(可能是一个或两个)。如果您想更严格一点,您可以绘制不同的订单值百分比(第 10、25、50、75、90、95 等。)而不仅仅是平均订单值。

然后,对于正在下降的总销售额的输入,我们要确定它们的输入。

如果订单数量减少,我们需要计算每日访客数量以及从访客到订单的每日转换率,因为订单数量=访客数量*订购的访客百分比(假设每位访客最多 1 个订单)。

如果平均订单价值下降,我们将需要计算每天每个订单的商品数量和每天平均订购商品价格,因为平均订单价值=每个订单的商品数量*购物车中商品的平均价格。

使用这种递归方法,**我们继续向下钻取下降的指标,直到所提供的数据不允许进一步探索。**例如,如果我们只知道订单的价值,而不知道内容,那么我们将无法分析平均订单价值的输入,并可能停止探索该路径。

3.线段,线段,线段

细分是开启分析洞察力的关键。分段的目标是沿着某个维度分割您的数据,以便您可以评估不同组之间的绩效。在产品分析设置中,一些常见的细分包括免费与付费用户、设备类型(桌面 web 与移动 web 与原生应用程序)、流量来源(来自搜索引擎的人、付费营销、直接在浏览器中键入您公司的 URL 的人,等等。),以及星期几。

我倾向于尝试许多可能的细分,看看什么提供有趣的结果。如果您不确定从哪里开始,分类列是分段的良好候选。有时,你会想过滤掉低容量的类别,或者将它们归入“其他”类别,以消除可视化中的混乱。

您还可以从数字列创建布尔列(例如,如果用户在周末有活动,用户是否花费了超过$50),或者通过创建不同的存储桶来离散化列(例如,时间戳到早晨/下午/晚上,将值排序到$ 10–20、$ 20–30、$30+的存储桶)。

4.策划一切

虽然仅通过查看表格就可以诊断根本原因或分析细分,但是将您的发现直观地传达给其他人要容易得多。无论您是计算一段时间内指标的价值、比较不同细分市场的指标,还是进行任何其他分析,花点时间将数据可视化都会让给你的带回家的东西评分的人更容易理解你的发现。

机器学习的小技巧带回家

有了机器学习带回家,**你的目标是展示你对解决问题的机器学习技术的理解。**根据我的经验,我发现让你的假设变得清晰并能够证明你所做的决定比你的模型的性能更重要。以下是我将机器学习带回家转化为现场面试的技巧。

1.花时间理解和清理数据

类似于带回家的分析,花时间理解你正在处理的数据集是值得的,并且应该提高你的结果的质量。在浏览数据时,请记住以下几点:

标识符列

您可能希望从模型中排除这些要素,因为标识符本身并不对信息进行编码,并且可能会被模型用来记忆标签,这不会推广到看不见的数据。

您可能需要标识符来将表连接在一起并形成您的初始数据集,它们也可以用于功能工程(例如,该用户有多少次活动/购买),但它们对于模型训练或评估来说应该不是必需的。

数字列

  • 绘制列值的直方图以检查分布。分布是什么样的?在值的范围非常大的情况下,进行对数变换可能是有意义的,这样模型权重就不会太大,尤其是对于线性或逻辑回归模型。
  • 有离群值吗?对于 ML 任务,我通常不会一开始就删除离群值,但是注意到它们的存在是很好的。训练基线模型后,您可以尝试移除异常值并比较模型性能。
  • 在问题的上下文中,是否存在没有意义的值(例如,一个 12 英尺高的人,在某些情况下为负$金额)?您可能希望从数据集中删除这些行。
  • 是否存在缺失值?处理丢失的数据本身可能是一整篇文章,但是这篇文章是如何思考这个问题的好资源。
  • 特性是如何相互关联的?您可能希望删除高度相关的要素以避免共线性问题,尤其是对于线性或逻辑回归模型。

分类栏

时间戳列

  • 时间序列中是否有间隔(例如,错过一整天/多天,数量少得惊人的几天)?
  • 是否存在缺失值?处理丢失的数据本身可能是一整篇文章,但是这篇文章是一个关于如何思考这个问题的很好的资源。

自由文本栏

有时这些列只是元数据(url、产品描述等。),但其他时候他们可能会有有价值的信息(如客户反馈)。如果一个列似乎包含对您的预测任务有价值的信息,您可以从中生成特征(文本长度、某些关键字的外观/频率等。).

2.从简单开始

我总是从拟合一个简单的可解释的模型开始——线性回归用于回归任务,逻辑回归用于分类任务。这些模型训练速度非常快,不需要太多调整,这使您能够快速迭代特性。

我首先在所有特征上拟合一个模型。然后,通过检查系数的大小,我衡量了特征的相对重要性,并尝试删除系数非常小的特征。线性回归对异常值特别敏感,因此如果基线模型似乎不能很好地拟合数据,您可能需要移除异常值。

在进入更复杂的模型之前,我总是试图通过移除无信息的特征并创建新的特征来改善基线结果。如果基线模型过度适合训练数据,可以尝试的另一种方法是正则化。

3.尝试使用更复杂的模型来提高性能

在你完成了一些功能工程以尝试和改善基线模型结果之后,尝试一个更复杂的模型可以帮助你提高预测任务的性能,同时也突出了合理的机器学习实践的知识。

通常,对于更复杂的模型,我使用随机森林或 XGBoost,并使用在基线模型上产生最佳性能的特性集。这些模型有更多的超参数,这让您有机会展示对超参数调整的理解。

考虑到带回家的时间限制,我对一些关键参数进行了简单的网格搜索。对于随机森林,我调整的参数是树的数量、特征的最大数量、深度、叶子中样本的最小数量以及分割节点的样本的最小数量。如果您的模型过度拟合,减少树深度、一个叶中的最小样本数和分割一个节点的最小样本数应该会产生正则化效果。

在非常不平衡的数据集的情况下,我发现修改类权重以给予少数类更多权重是有用的,因为否则模型可能总是预测多数类。

4.更深入地了解模型性能

由于你想展示对整个建模过程的理解,花几分钟深入挖掘模型性能将有助于你脱颖而出,因为大多数人止步于性能指标(准确度、精确度、召回率等)。).对于分类任务,简单地为您的基线模型和更复杂的模型绘制一个混淆矩阵,并对您观察到的差异进行评论,应该足以显示您的思维过程,而不会花费大量时间。对于回归任务,评论每个模型的哪些特性是最重要的,这是显示对模型能力的更深层次理解的一种简单方式。

一般提示

1.花时间彻底地做好准备工作

虽然招聘人员或招聘经理经常会告诉你不要花超过 4 或 6 个小时的时间,但我往往会花超过建议的时间,尤其是对我真正感兴趣的公司。由于评分者没有真正的方法来验证你花了多少时间,其他申请人可能会花更多的时间,如果你花的时间比竞争对手少得多,你的工作就很难脱颖而出。最终,结果比解释给你更多的时间你会做什么更令人印象深刻,尽管评分者最大的意图是不惩罚不完整的分析。

2。使用 Markdown 记录你的思考过程

理想情况下,你有机会向评分者讲述你的思考过程,但这种情况很少出现在带回家的作业中。所以,你要尽你所能,让评分者在评估你的作业时,能容易地跟上你的思维过程。如果你用的是 Jupyter 笔记本,我发现一个非常有效的方法是在相关代码之前或之后添加标记单元格来记录假设和结论。如果您没有添加 markdown 的能力,在代码中注释假设和结论是一种替代方法,尽管可读性较差。

3.即使不需要,也要做一个演示

你可以做的另一件事是制作一个简短的幻灯片来总结你的作业,让你的评分者评估你的课后作业变得非常容易。演示可以让你更好地控制评分者的叙述,让他们的注意力集中在最重要的发现上。在这里,内容比审美更重要——15 分钟应该足以完成演示。我的演讲结构如下:

  • 简单介绍一下问题
  • 流程概述(数据清理和探索、分析或模型)
  • 突出显示主要结果
  • 建议/结论/未来的工作

并不是你笔记本里的所有代码或可视化效果都会产生有意义的结果,但是你会希望保留它们以向评分者展示你所探索的事物的广度。有一个单独的演示文稿可以避免用不相关的结果分散评分者的注意力,同时让您可以保留所有的笔记本代码。

4.回顾性创建辅助函数

为了更有效地完成未来的接收任务,我建议在提交接收任务后检查一下,找出可能对其他接收任务有益的代码片段(数据清理、生成图、创建分段等)。).这确实需要一些前期投资,但是将这些代码片段重写为您可以重用的通用函数,可以大大减少您在将来的任务中实现类似质量所需的时间。

结论

数据面试的带回家作业可能是一件痛苦的事,但对许多公司来说,在这个过程中,它们是一种不可避免的罪恶。我希望这有助于揭开传统黑箱作业的神秘面纱,我也很想听听其他在这些作业中对你很有效的策略。

如何使用 Fargate Spot 和 Prefect 降低您的 AWS ECS 成本

原文:https://towardsdatascience.com/how-to-cut-your-aws-ecs-costs-with-fargate-spot-and-prefect-1a1ba5d2e2df?source=collection_archive---------9-----------------------

Python 中的无服务器数据工程管道

照片由 Kampus 出品来自 Pexels

P refect 是一个灵活的工具,用于编排现代数据堆栈。与市场上的许多其他解决方案相比,它不会将您束缚于任何特定的执行框架或云提供商——无论您是想使用 GCP 上的Kubernetes、 AWS ECS 、裸机服务器,还是诸如 Coiled 的按需分布式 Dask 集群,Prefect 都能满足您的需求。与任何灵活的平台一样,您需要配置一些东西来让 Prefect 知道您的数据工作流应该在哪里运行。在本文中,我们将研究如何利用 AWS ECS Fargate 上的 spot 实例作为您的经济高效的执行层。

**Table of contents**· [Spot instances & Prefect](#2587)
  ∘ [Why spot instances?](#0e6b)
  ∘ [What value does Prefect provide in managing containers deployed to spot instances?](#5281)
· [Architecture](#a7fb)
· [Prefect Setup](#af91)
  ∘ [Sign up or sign in](#e80f)
  ∘ [Create an API Key](#55d2)
  ∘ [Install Prefect](#98be)
  ∘ [Create a service account for the ECSAgent](#f88c)
· [AWS Setup](#3338)
  ∘ [Store the ECSAgent’s API Key as an encrypted parameter](#7f59)
  ∘ [Configure the ECS cluster](#ad64)
  ∘ [Prepare the IAM roles](#4ba7)
  ∘ [Task execution role](#43f9)
  ∘ [Task role](#6f39)
  ∘ [Create a CloudWatch log group](#d836)
  ∘ [Register a task definition for the ECSAgent](#bb0c)
  ∘ [Look up your subnet IDs](#1fd5)
  ∘ [Start a continuously running ECS Service for the ECSAgent](#566f)
  ∘ [Validate the agent setup in the Prefect UI](#29bd)
· [Deploy an example Prefect flow](#5b72)
  ∘ [Build a custom Docker image for your Prefect flows](#1e8c)
· [Conclusion](#a041)

Spot 实例和完美

为什么点实例?

首先,为什么首先要使用 spot 实例呢?原因很简单:节约成本。即时实例的成本比按需实例低 70%。

Prefect 在管理部署到 spot 实例的容器方面提供了什么价值?

虽然 spot 实例可以节省大量成本,但它们有一个明显的缺点:它们可以在两分钟的通知后关闭。提督有助于克服这一缺点,因为:

  • 它提供了可见性,其中作业由于 spot 实例关闭而失败,
  • 由于名为 Lazarus 的服务,它可以自动重启此类失败的工作流。正如提督文献所解释的:

“Lazarus 流程旨在优雅地重试由 Prefect 无法控制的因素导致的故障。最常见的需要 Lazarus 干预的情况是基础设施问题,例如 Kubernetes pods 在能够完成一次运行之前无法运行或被删除。

  • 提督自动化许多繁琐的任务,否则你将不得不做部署你的工作负载到 ECS,如创建和注册新的任务定义,注销旧的任务定义,等等。
  • 提督也允许你直接从提督用户界面修改“运行 ECS 任务”的元数据。这样,您可以在特定的每次运行的基础上调整工作流所需的资源,如 CPU内存

体系结构

在您的 AWS 帐户中,您创建了一个带有perfect ECS agent流程的 ECS 服务。这个过程不断地轮询 Prefect Cloud API 以获得新的流运行。然后,当注入您为每个特定运行(例如,CPU、内存)提供的元数据时,Prefect 会自动将计划的流运行部署为 ECS 任务。 ECS 控制平面负责提供基础设施并将集装箱放置在 ECS 数据平面上。

在本文中,我们将重点关注使用 Fargate 作为您的数据平面,ECS 允许您为每个 ECS 集群添加多达六个容量提供者。这样,您的 ECS 数据层可以同时使用FARGATE_SPOTFARGATEEXTERNAL本地服务器和自我管理的定制EC2实例,可能使用 GPU。容量提供程序允许您定制群集资源,以满足您期望的延迟、维护和容量需求。

完美设置

注册或登录

如果您还没有帐户,注册一个“标准”的提督云帐户。虽然也有一个“入门”选项,但标准版有更多的功能。这两个计划都有一个非常慷慨的 10,000 次免费成功任务运行的等级。你可以在这里找到更多关于那个的信息。

创建 API 密钥

一旦登录,您就可以创建一个 API 密匙来使用 Prefect Cloud 验证您的本地开发环境。

完美的云用户界面——作者图片

安装提督

要在本地计算机上安装带有 AWS 子模块的提督,请使用:

pip install "prefect[aws]"

然后,您可以切换到 Prefect Cloud 后端,并使用您之前生成的 API 密钥进行身份验证:

prefect backend cloud
prefect auth login --key **<**YOUR-API-KEY**>**

成功认证后,您现在可以注册新的流,启动新的代理,并在 Prefect Cloud UI 中查看它们。

**注意:**旧版本的提督使用的 API 令牌对代理和用户有不同的作用域。从 0.15.0 开始,你应该使用 API 键。如果你想知道更多,这篇博文解释了这一变化的原因。

为 ECSAgent 创建服务帐户 API 密钥

虽然 API 密匙是为认证用户而设计的,但服务帐户 API 密匙是为机器而设计的,即自动化过程,如完美代理和 CI/CD 工具。要为 ECSAgent 创建新密钥,请转到团队的服务帐户页面。

AWS 设置

下面演示的整个设置可以在 this GitHub Gist 中找到,作为一个 bash 脚本,您可以调整并运行它:

bash prefect_ecs_agent_deploy_script.bash

在运行它之前,您需要用您的帐户 ID 替换AWS_ACCOUNT_ID,并设置其他变量,如代码注释中所述。

在接下来的小节中,我们将从要点开始逐步介绍所有步骤,以便您理解创建了哪些资源,以及如何根据您的用例调整这个脚本。

将 ECSAgent 的 API 密钥存储为加密参数

为了在我们的 AWS ECS 服务中安全地访问先前创建的服务帐户的 API 密钥,我们希望将它作为加密的秘密存储在 AWS 系统管理器参数存储中。确保设置您的 AWS 区域、API 键,并调整其他变量:

*export* AWS_REGION=us-east-1
*export* ECS_CLUSTER_NAME=prefectEcsCluster
*export* ECS_LOG_GROUP_NAME=/ecs/prefectEcsAgent
*export* ECS_SERVICE_NAME=prefectECSAgent
*export* PREFECT_API_KEY=yourPrefectCloudAPIKey
*export* AWS_PAGER=""aws ssm put-parameter --type SecureString --name PREFECT__CLOUD__API_KEY --value $PREFECT_API_KEY --region $AWS_REGION

AWS_PAGER变量被设置为禁用 AWS CLI 的分页输出。

配置 ECS 群集

*aws* ecs create-cluster --cluster-name $ECS_CLUSTER_NAME \
--capacity-providers FARGATE_SPOT FARGATE \
--default-capacity-provider-strategy \
capacityProvider=FARGATE_SPOT,weight=3 \
capacityProvider=FARGATE,base=1,weight=2 \
--region $AWS_REGION

我们设置了base=1,因为至少 ECSAgent 进程的一个 ECS 任务将作为 ECS 服务全天候运行。由于该服务必须始终运行以实现健壮的调度,因此为该流程使用 spot 实例没有意义。

通过利用权重,我们指定了FARGATE_SPOTFARGATE之间的比率,这意味着我们 60%的流量将被部署到FARGATE_SPOT,40%将在FARGATE容量提供商上运行。你应该根据你的需要调整这个比例。

请注意,FARGATE_SPOT应该仅用于可中断的工作负载,例如常规(例如每小时)批处理作业。如果您喜欢标准的 Fargate 集群,请使用:

*aws* ecs create-cluster --cluster-name $ECS_CLUSTER_NAME \
--region $AWS_REGION

准备 IAM 角色

AWS 区分了任务执行角色(授予启动任务中定义的容器的访问权限的一般角色)和任务角色,后者在容器启动后授予实际应用程序权限。您可以在本文的第 4 部分找到更详细的解释:

https://aws.plainenglish.io/8-common-mistakes-when-using-aws-ecs-to-manage-containers-3943402e8e59

任务执行角色

#1.创建承担信任策略的角色:

*cat* <<EOF *>ecs_tasks_trust_policy.json* {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "ecs-tasks.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

*aws* iam create-role --role-name prefectECSAgentTaskExecutionRole \
--assume-role-policy-document file://ecs_tasks_trust_policy.json --region $AWS_REGION

#2.附加一般服务角色策略AmazonECSTaskExecutionRolePolicy:

*aws* iam attach-role-policy --role-name prefectECSAgentTaskExecutionRole \
--policy-arn "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"

#3.附加我们的自定义角色策略,因为 ECS 任务将需要从任务环境变量中的 AWS 系统管理器参数存储中检索 API 密匙。

*cat* <<EOF *>ecs_tasks_execution_role.json* {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters"
      ],
      "Resource": "*"
    }
  ]
}
EOF

*aws* iam put-role-policy --role-name prefectECSAgentTaskExecutionRole \
--policy-name prefectECSAgentTaskExecutionRolePolicy \
--policy-document file://ecs_tasks_execution_role.json

请注意,您可以将范围缩小到我们需要的特定秘密,而不是"Resource": “*":

"Resource": "arn:aws:ssm:YOUR_REGION:YOUR_AWS_ACCOUNT_ID:parameter/PREFECT__CLOUD__API_KEY"

任务角色

该角色需要授予对 AWS 资源的完全访问权限,如 CloudWatch、EC2、ECS、IAM、S3 等。对于每次流运行,Prefect 都会创建一个新的 ECS 任务定义。在这样做的时候,它需要为一个流检索关于您的 VPC、子网、安全组和 IAM 权限的信息。此外,必须授权 it 部门创建新的 CloudWatch 日志流,并为每次流运行放置日志。下面的策略描述了必要的权限:

*# permissions needed by Prefect to register new task definitions, deregister old ones, and create new flow runs as ECS tasks**cat* <<EOF *>ecs_task_role.json* {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CreateSecurityGroup",
                "ec2:CreateTags",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:DeleteSecurityGroup",
                "ecs:CreateCluster",
                "ecs:DeleteCluster",
                "ecs:DeregisterTaskDefinition",
                "ecs:DescribeClusters",
                "ecs:DescribeTaskDefinition",
                "ecs:DescribeTasks",
                "ecs:ListAccountSettings",
                "ecs:ListClusters",
                "ecs:ListTaskDefinitions",
                "ecs:RegisterTaskDefinition",
                "ecs:RunTask",
                "ecs:StopTask",
                "iam:PassRole",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "logs:GetLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
EOF*aws* iam create-role --role-name prefectTaskRole --assume-role-policy-document file://ecs_tasks_trust_policy.json --region $AWS_REGION*aws* iam put-role-policy --role-name prefectTaskRole --policy-name prefectTaskRolePolicy --policy-document file://ecs_task_role.json

**注意:**上面提到的一些权限被定义为允许在 ECS 上启动临时 Dask 集群。如果你想把范围缩小到绝对必要的提督标准权限,这个 Github 问题可以帮到你。

当使用带有 AWS ECS 的提督时,您可能希望使用 S3 作为提督存储和结果后端。因此,向任务角色添加 S3 权限是可行的。以下是如何创建允许对特定 S3 时段执行任何操作的任务角色。

*# adjust it to include permissions needed by your flows
cat* <<EOF *>ecs_task_role_s3.json* {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": "arn:aws:s3:::*prefect*"
    }
  ]
}
EOF*aws* iam put-role-policy --role-name prefectTaskRole --policy-name prefectTaskRoleS3Policy --policy-document file://ecs_task_role_s3.json

上述策略授予对名称中包含单词“prefect”的 S3 存储桶执行任何操作的访问权限 —为了提高安全性,您可以指定想要与 Prefect 一起使用的确切的 S3 存储桶名称。

创建云观察日志组

在执行期间,每个 ECS 任务将容器日志发送到 CloudWatch 日志流。日志流被分成日志组。为了让 ECS 任务发送这些容器日志,我们需要创建日志组并在任务定义中指定它。

aws logs create-log-group --log-group-name $ECS_LOG_GROUP_NAME --region $AWS_REGION

为 ECSAgent 注册任务定义

我们最终可以为我们的总监的 ECSAgent 流程注册任务定义。

*# search-replace the AWS_ACCOUNT_ID below with your AWS account ID. Also, replace or add ECS Agent labels**cat* <<EOF *>prefect_ecs_agent_task_definition.json* {
    "family": "$ECS_SERVICE_NAME",
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "networkMode": "awsvpc",
    "cpu": "512",
    "memory": "1024",
    "taskRoleArn": "arn:aws:iam::AWS_ACCOUNT_ID:role/prefectTaskRole",
    "executionRoleArn": "arn:aws:iam::AWS_ACCOUNT_ID:role/prefectECSAgentTaskExecutionRole",
    "containerDefinitions": [
        {
            "name": "$ECS_SERVICE_NAME",
            "image": "prefecthq/prefect:latest-python3.8",
            "essential": true,
            "command": [
                "prefect",
                "agent",
                "ecs",
                "start"
            ],
            "environment": [
                {
                    "name": "PREFECT__CLOUD__AGENT__LABELS",
                    "value": "['prod']"
                },
                {
                    "name": "PREFECT__CLOUD__AGENT__LEVEL",
                    "value": "INFO"
                },
                {
                    "name": "PREFECT__CLOUD__API",
                    "value": "https://api.prefect.io"
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "$ECS_LOG_GROUP_NAME",
                    "awslogs-region": "$AWS_REGION",
                    "awslogs-stream-prefix": "ecs",
                    "awslogs-create-group": "true"
                }
            },
            "secrets": [
                {
                    "name": "PREFECT__CLOUD__API_KEY",
                    "valueFrom": "arn:aws:ssm:$AWS_REGION:AWS_ACCOUNT_ID:parameter/PREFECT__CLOUD__API_KEY"
                }
            ]
        }
    ]
}
EOF

*aws* ecs register-task-definition --cli-input-json file://prefect_ecs_agent_task_definition.json --region $AWS_REGION

查找您的子网 id

要将此 ECS 任务作为连续运行的服务运行,我们必须选择此任务应在其中运行的 VPC 和子网。在本演示中,我们将使用默认 VPC 及其对应的公共子网。每个地区都有默认的 VPC,所以除非需要,否则不必创建任何新的 VPC。

以下是您如何查找所选地区的 id:

或者,您可以从 AWS CLI 中查找这些 id:

aws ec2 describe-subnets --region $AWS_REGION

为了方便起见,下面是如何提取 id 并将它们导出为环境变量的方法——我们将在下一节中使用它们:

export VPC=$(aws ec2 describe-vpcs --filters Name=is-default,Values=true)export VPC_ID=$(echo $VPC | jq -r '.Vpcs | .[0].VpcId')SUBNETS=$*(aws* ec2 describe-subnets --filters Name=vpc-id,Values=$VPC_ID --region $AWS_REGION*)**export* SUBNET1=$*(echo* $SUBNETS | *jq* -r '.Subnets | .[0].SubnetId'*)
export* SUBNET2=$*(echo* $SUBNETS | *jq* -r '.Subnets | .[1].SubnetId'*)
export* SUBNET3=$*(echo* $SUBNETS | *jq* -r '.Subnets | .[2].SubnetId'*)*

为 ECSAgent 启动持续运行的 ECS 服务

此服务的好处是,ECS 控制面板将确保此过程始终运行。如果出现问题,ECS 将为我们的完美代理创建一个新的容器。

*aws* ecs create-service \
    --service-name $ECS_SERVICE_NAME\
    --task-definition $ECS_SERVICE_NAME:1 \
    --desired-count 1 \
    --launch-type FARGATE \
    --platform-version LATEST \
    --cluster $ECS_CLUSTER_NAME \
    --network-configuration awsvpcConfiguration="{subnets=[$SUBNET1, $SUBNET2, $SUBNET3],assignPublicIp=ENABLED}" --region $AWS_REGION

在完美用户界面中验证代理设置

如果一切按预期运行,我们应该看到一个新的 ECSAgent 准备好部署新的流运行。

完美代理页面-按作者分类的图片

部署一个示例完美流

如果您还没有任何完美的项目,您可以从 CLI 创建它:

prefect create project “ECS_Flows”

现在,您可以使用 ECSRun 部署一个示例流,它将为 ECS 任务提供元数据,例如:

  • 自定义容器image
  • ECS 代理labels
  • 为您的流定制 AWS 权限,以task_role_arn的形式提供,
  • 还有cpumemory

注意,在这个流中,我们还指定了S3存储——这将把流文件上传到指定的 S3 存储桶。

确保用您的 AWS 帐户 ID 替换123456

此外,如果您向您的ECSRun提供一个定制的 ECR 映像,请确保也显式地指定execution_role_arn,否则,您将得到一个 ClientException,告诉您 Fargate 需要任务定义具有执行角色 ARN 来支持 ECR 映像。您可以这样指定:

RUN_CONFIG = ECSRun(
    labels=["prod"],
    task_role_arn="arn:aws:iam::XXX:role/prefectTaskRole",
    execution_role_arn="arn:aws:iam::XXX:role/prefectECSAgentTaskExecutionRole",
    run_task_kwargs=dict(cluster="prefectEcsCluster", launchType="FARGATE",),
    image="XXX.dkr.ecr.us-east-1.amazonaws.com/prefect-custom-image:latest"
)

为您的完美流程构建一个定制的 Docker 映像

如果您的流需要定制的包依赖项,比如pandasscikit-learn,那么创建一个已经包含这些依赖项的定制容器映像被认为是最佳实践。以下是你如何做到这一点。

cat <<EOF >Dockerfile
FROM prefecthq/prefect:latest-python3.9
RUN pip install --upgrade pip \\
&& pip install pandas scikit-learn boto3
EOF

然后,要构建 Docker 映像并将其推送到 ECR,请使用:

export AWS_REGION=us-east-1
export AWS_ACCOUNT_ID=123456789
export IMAGE_NAME=prefect-custom-image
export IMAGE_TAG=latest

docker build -t $IMAGE_NAME .aws ecr create-repository --repository-name $IMAGE_NAME --region $AWS_REGIONdocker tag "$IMAGE_NAME":"$IMAGE_TAG" "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_NAME":"$IMAGE_TAG"aws ecr get-login-password | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.comdocker push "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_NAME":"$IMAGE_TAG"

现在您可以在您的ECSRun 运行配置中指定这个映像(流程要点中的第 14 行)。

结论

在本文中,我们研究了如何将 AWS ECS Fargate 设置为完美代理。我们调查了各种容量提供商配置以优化成本,并解释了根据您的需求定制此设置所需的所有步骤。

资源:

  • https://AWS . Amazon . com/blogs/AWS/AWS-fargate-spot-now-generally-available/
  • Fargate spot —成本节约演示:https://Tom Gregory . com/AWS-fargate-spot-vs-fargate-price-comparison/
  • 深潜:https://AWS . Amazon . com/blogs/compute/deep-dive-into-fargate-spot-to-run-your-ECS-tasks-for-up-to-70-less/
  • https://ecsworkshop.com/capacity_providers/fargate/

物流和仓储中的数据分析

原文:https://towardsdatascience.com/how-to-data-analysis-in-logistics-and-warehousing-4ceaa276d5d4?source=collection_archive---------17-----------------------

如何开始物流和仓储领域的分析

由 Timelab Pro 在 Unsplash 上拍摄的照片

在物流和仓储领域,当然有很多软件可以帮助你优化路线、仓库利用率和供应链管理。但是这方面的基本 KPI 是什么呢?无论您是数据科学家、分析师还是业务分析师,了解各个部门的实际工作都很有用。他们的目标是什么?他们是如何直接或间接挣钱的?如何衡量成功?这些问题及其各自的答案帮助我了解了各个部门的关键数字。

数据来源

第一个问题当然是从哪里获得可能的 KPI 数据和进一步的分析。通常,此类数据的来源有:

  • ERP 系统
  • 订单管理系统
  • 材料管理系统
  • 路线优化系统
  • 而且几年以来 IOT 的传感器也越来越多

由于此类系统在数据量方面增长迅速,建议建立一个可靠的数据平台—点击此处了解更多信息。

为什么这个领域的重要性会增加

尤其是在科罗纳疫情时代,我们看到了拥有可靠供应链的重要性。为了监控和优化这些供应链,需要传感器和系统[1]。通过提供这些数据,可以定义重要的 KPI。只有通过这种方式,内部业务流程才变得可见和可衡量。各个领域只能通过这种方式进行优化,包括材料管理、仓储、运输、采购等。—供应链得到优化。

KPI

这是我在这个领域遇到的一些关键绩效指标。当然,这只是 KPI 的一小部分,但我认为其中一些是最重要的,因为它们经常出现在文献中。

你的供应商有多可靠?

  • 供应商的可靠性=按时交付且状况良好的货物数量/货物总量
  • 每周都有多批新货。

您的客户满意度如何?

  • 顾客退货的好商品[2]。
  • 客户退回损坏的物品[2]。
  • 返回供应商库存。

马库斯·斯皮斯克在 Unsplash 上的照片

仓库 KPI

  • 仓库利用率=占用面积/总面积
  • 材料流出的总和
  • 储存时间
  • 存货成本率=存货成本/存货价值

运输关键绩效指标

  • 准时交货[3]
  • 每次运输成本

摘要

物流和仓储关键指标用于衡量公司的发展并实施适当的持续改进措施。这些数据、系数和百分比的收集为最终实现最高物流质量的决策提供了坚实的基础。为了更深入的探究,请使用下面的资源。

资料来源和进一步阅读

[1] B. Sai Subrahmanya Tejesh,S. Neeraja,使用物联网和开源框架的仓库库存管理系统(2018),
亚历山大工程杂志,第 57 卷,第 4 期,

[2] veeqo, 7 个基本仓库 KPI 开始跟踪最佳绩效 (2020)

[3]新加坡采购与材料管理研究所,物流行业关键绩效指标 (2019)

机器学习中如何处理不平衡数据集

原文:https://towardsdatascience.com/how-to-deal-with-an-imbalanced-dataset-in-machine-learning-4f89a1967868?source=collection_archive---------24-----------------------

6 种不同的技术来解决你将面临的最常见的问题之一。

照片由陈伶俐·桑特兰在 Unsplash 上拍摄

不平衡的数据集是我们需要处理的一个常见问题,是每个机器学习面试问题集合中的一个主要部分。

让我们从一个例子开始:

假设你正在尝试建立一个分类模型,你有两个类:猫和狗。不幸的是,你的数据非常不准确:有 950 张猫图片和 50 张狗图片。

如果你的模型把每张图片都归类为猫(哑巴吧?),你就 95%准确了!想一想。数据集中的分布很快成为一个大问题。

让我们试着解决这个问题。

1.确保您正确地描述了问题

在很多情况下,不均衡的班级可能会提供一个以不同的方式看待问题的机会。

制造缺陷、信用卡欺诈、垃圾邮件。这些问题属于同一类别:数据集中的绝大多数样本将代表正常类,只有少数异常代表不同类。

大多数时候,你最好将这些视为异常检测问题,你的主要目标是识别数据集中的异常值。

作为一个相关的提示,确保你使用正确的算法来解决你的问题。例如,基于决策树的模型在处理不平衡的类方面非常出色。当处理结构化数据时,这可能就是您所需要的。

2.在这些问题上,准确性不是最好的性能指标

当数据集不平衡时,精确度不是一个好的性能指标。

相反,根据您的具体问题,您应该查看以下内容:

  • 精确度、召回率、F 值
  • 混淆矩阵
  • ROC 曲线

3.收集更多数据

我总是喜欢从这里开始。

在我们的例子中,我们也许能够找到更多的狗的图片添加到数据集中,并减少差异。

不幸的是,收集更多的数据并不总是一个选项。但有时确实如此,然而许多团队过早地诉诸合成增强。

4.用合成数据扩充数据集

只有当收集更多的数据不可行时,我才会去编造假样本。当处理非结构化数据(比如图像、视频、文本、音频)时,这是一个很好的方法。

例如,您可以通过转换现有的图片来创建新的狗图片:

  • 改变图像的对比度
  • 做水平翻转
  • 向两个方向轻微旋转图片
  • 添加一些噪声

结合这些技术可以产生许多看起来和原始图片一样真实的新样本。

对于结构化数据(想想表格数据),扩充要困难得多,有时甚至不可能。

5.对数据集进行重新采样

有三种不同的方法可以对数据集进行重采样:

  • 过采样:多次拍摄我们拥有的图片。
  • 欠采样:取一些我们有的图片,丢弃其余的。
  • 结合两种技术:对一个类进行过采样,同时对另一个类进行欠采样。

例如,我们可以通过以下方式对数据进行重新采样:

  • 每张狗图片使用 4 次。这将以总共 400 张狗图片(50 张现有图片× 4)结束。)
  • 使用每隔一张猫图片。这将导致总共 475 张猫图片(950 张现有图片÷ 2)。)

请记住,过采样和欠采样会给你的数据集带来偏差:你是在通过任意改变现有样本来改变数据分布。这可能会有后果,所以要仔细考虑。

6.适当调整每个类别的权重

您可以修改您的模型的损失函数,以不同的方式对每个类别进行加权,从而解决不平衡问题。查看 Kera's fit() 函数上的 sample_weight 属性作为示例:

训练样本的可选权重数组,用于加权损失函数(仅在训练期间)。)

成本敏感学习是另一种相关的技术,您也可以使用它根据每个类的权重来惩罚模型的结果。我写了一篇关于成本敏感学习的简短介绍,应该会有所帮助。

一锤定音

这些我一般都是按顺序想的。现在,系统地沿着这个清单往下走已经成了第二天性。

大多数情况下,需要不止一种技术来解决问题。每一次,实验都会告诉你正确的方法。

如何在 Python 中处理不平衡的多类数据集

原文:https://towardsdatascience.com/how-to-deal-with-imbalanced-multiclass-datasets-in-python-fe0bb3f2b669?source=collection_archive---------7-----------------------

数据预处理

这是一个现成的教程,介绍了用 imblearn 和 scikit-learn 平衡多类数据集的一些技巧

图片由 Gidon Pico 提供,来自 Pixabay

在运行机器学习模型时,不平衡的数据集通常会产生较差的性能,尽管在某些情况下,评估指标会产生良好的结果。这可能是因为该模型擅长预测多数阶级,但在预测少数阶级时性能较差。由于评估指标计算的是多数类和少数类之间的平均值,所以最终的性能看起来还可以。

多数类是指数据集中代表性最强的类,而少数类是指数据集中代表性较弱的类。换句话说,多数阶级比少数阶级有更多的样本。在这种情况下,数据集是不平衡的。

在大多数情况下,平衡可以提高模型的性能,尽管这并不总是正确的。

在本教程中,我处理多类数据集。多类数据集是指输出类的数量大于 2 的数据集。我提出两种策略来平衡多类数据集:

  • 流水线欠采样和过采样
  • 玩级重。

加载数据集

首先,我将数据集作为一个pandas数据帧加载。我利用了玻璃数据集和它们的名字。这个数据集描述了玻璃的化学性质。更多详情请点击链接。

import pandas as pddf = pd.read_csv('glass.csv')
df.head()

作者图片

该数据集由 214 个样本和 7 个类别组成。

准备数据

我构建了两个变量,Xy,分别包含输入特征和输出类。为此,我计算输入特征,并将它们存储到一个名为features的变量中。

features = []
for feature in df.columns:
    if feature != 'target':
        features.append(feature)
X = df[features]
y = df['target']

通过利用由sklearn库提供的train_test_split()函数,将数据集分成两部分:训练集和测试集。我将测试集大小设置为0.2(即整个数据集的 20%)。

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=100)

现在,我计算训练集中每个目标类的样本数。我利用了value_counts()函数。我注意到数据集是不平衡的。

平衡仅适用于训练集。

import matplotlib.pyplot as pltcount = y_train.value_counts()
count.plot.bar()
plt.ylabel('Number of records')
plt.xlabel('Target Class')
plt.show()

作者图片

建立不平衡模型

在平衡训练集之前,我计算了具有不平衡数据的模型的性能。我利用一个KNeighborsClassifier进行测试。我还从scikitplot库中导入了其他有用的函数,来绘制 ROC 和 precision recall 曲线。具体来说,首先我建立模型,然后我拟合训练集,最后我通过应用于测试集的predict_proba()函数计算模型的性能。

from sklearn.neighbors import KNeighborsClassifier
from scikitplot.metrics import plot_roc
from scikitplot.metrics import plot_precision_recallmodel = DecisionTreeClassifier()
model.fit(X_train, y_train)
y_score = model.predict_proba(X_test)
y_pred = model.predict(X_test)# Plot metrics 
plot_roc(y_test, y_score)
plt.show()

plot_precision_recall(y_test, y_score)
plt.show()

作者图片

作者图片

流水线欠采样和过采样

第一种策略涉及流水线的创建,该流水线对多数类进行欠采样,对少数类进行过采样。这里的要点是定义一个阈值,该阈值划分多数类和少数类,以及每个类所需的样本数。在这个特定示例中,我们将阈值设置为等于每个类别的期望样本数。

一种可能的解决方案是将阈值设置为类中样本数量的中值。因此,我可以将阈值设置为 19,并考虑样本数量大于阈值的多数 a 类。类似地,少数类是样本数量少于阈值的类。

我计算中间值,并将其转换为整数。

import numpy as np
n_samples = count.median().astype(np.int64)

现在我可以对最具代表性的类进行欠采样。首先,我禁止警告。

import warnings
warnings.filterwarnings('ignore')

然后,我定义一个效用函数,它接收数据集、阈值(n_samples)和相关类(majorityminority)作为输入。该函数返回一个dict,其中包含属于相关类的每个类的期望样本数。

def sampling_strategy(X,y,n_samples, t='majority'):
    target_classes = ''
    if t == 'majority':
        target_classes = y.value_counts() > n_samples
    elif t == 'minority':
        target_classes = y.value_counts() < n_samples
    tc = target_classes[target_classes == True].index
    #target_classes_all = y.value_counts().index
    sampling_strategy = {}
    for target in tc:
        sampling_strategy[target] = n_samples
    return sampling_strategy

现在我对大多数类进行欠采样。我利用了imblearn库。

from imblearn.under_sampling import ClusterCentroids
under_sampler = ClusterCentroids(sampling_strategy=sampling_strategy(X_train,y_train,n_samples,t='majority'))
X_under, y_under = under_sampler.fit_resample(X_train, y_train)

我注意到多数类中的记录数量被设置为n_samples

作者图片

然后,我对较少表示的类进行过采样。我利用了SMOTE过采样策略。

from imblearn.over_sampling import SMOTE
over_sampler = SMOTE(sampling_strategy=sampling_strategy(X_under, y_under,n_samples, t='minority'),k_neighbors=2)
X_bal, y_bal = over_sampler.fit_resample(X_under, y_under)

最终我有了一个平衡的数据集。

作者图片

我在新的平衡数据集上训练模型,我注意到 ROC 曲线改善了,而精确召回曲线似乎降低了。然而,看看类别 3,在原始模型中的精确度和召回率低于平衡模型。这意味着该模型现在能够更好地预测少数民族阶层。

model = KNeighborsClassifier()
model.fit(X_bal, y_bal)
y_score = model.predict_proba(X_test)y_pred = model.predict(X_test)# Plot metrics 
plot_roc(y_test, y_score)
plt.show()

plot_precision_recall(y_test, y_score)
plt.show()

作者图片

作者图片

玩重量级游戏

平衡的替代方法是在构建模型时指定原始数据集中的类权重。这允许算法给予少数类更多的重要性。可以通过sklearn.utils库的 class_weight() 函数计算类权重。

from sklearn.utils import class_weightclasses = np.unique(y_train)
cw = class_weight.compute_class_weight('balanced', classes, y_train)
weights = dict(zip(classes,cw))

现在我可以将类权重作为输入提供给一个分类器,比如一个DecisionTreeClassifier,并计算模型的性能。我没有像在教程的前一部分那样使用KNeighborsClassifier,因为它不支持类权重。

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(class_weight=weights)
model.fit(X_train, y_train)
y_score = model.predict_proba(X_test)y_pred = model.predict(X_test)# Plot metrics 
plot_roc(y_test, y_score)
plt.show()

plot_precision_recall(y_test, y_score)
plt.show()

作者图片

作者图片

摘要

在本教程中,我已经说明了如何执行多类数据集的平衡。可以采用两种可能的策略:欠采样后跟随过采样,或者定义类权重。

如果你对数据预处理感兴趣,可以在我的主页找到其他文章。

如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。

感谢阅读!你可以从我的 Github 库下载完整代码。

相关文章

如何处理 Julia 中的缺失数据

原文:https://towardsdatascience.com/how-to-deal-with-missing-data-in-julia-a6527bbac213?source=collection_archive---------28-----------------------

Julia 如何处理缺失数据的概述。

(src =https://pixabay.com/images/id-693865/

介绍

数据收集和观察的一个不幸的副产品是产生缺失值的趋势。虽然这有许多潜在的原因,但最终在分析和使用这些数据的生命周期时,我们需要去掉缺失的值。如果缺少值,很可能无法以任何方式分析、可视化、拟合模型或利用您的数据。也就是说,对于使用任何编程语言的任何数据科学家来说,能够检测并消除数据中的缺失值是绝对必要的。

Julia 语言是最近因其在数据科学领域的能力而受到关注的一种编程语言。Julia 有一种独特的处理值的方式,与其他语言中的大多数实现略有不同。也就是说,任何可能正在学习这门语言的人都可能想知道一些基本的数据处理技术来处理一些丢失的数据。今天我想谈谈这一点。如果您想看看本文中使用的代码的运行情况,您也可以查看这里的笔记本:

笔记本

失踪类型

在缺失值方面,Julia 与其他编程语言最大的不同可能是用于存储空值的不同类型。在 Julia 中,缺失值有三种不同的存储方式。第一种类型是缺失类型。缺失类型的独特之处在于它在 Julia 语言中有自己的类型。这意味着我们可以使用 typeof()来查看这个类型,并且我们还可以通过具有多个分派的函数来传递它。

作者图片

z = missing
println(typeof(z))
println(z)

将它与多个分派一起使用看起来像这样:

example(z::Int64) = println("It's an integer!")
example(z::Missing) = println("It's missing!")

作者图片

example(missing)
example(5)

下一种类型的缺失值是您可能已经习惯的值,即 NaN。虽然在 Python 中这可能是由 NumPy 库提供的,但在 Julia 中却不是这样。Julia 中的 NaN 值实际上不是一个类型,它的类型是 Float64。也就是说,它继承了 Number > Real > Float Float64 的所有调度。Julia 通常很擅长检测您正在处理的数据类型,并且在处理连续特征时通常用 NaN 代替 missing。当然,情况并不总是这样,但不管怎样,这肯定是关于 NaNs 的一件值得注意的事情。Julia 中的 nan 也用以下语法表示:

nan = NaN

如您所见,如果我们打印出 NaN 的类型,我们会看到返回 Float64:

作者图片

**println(typeof(nan))**

同样重要的是要注意到,朱莉娅有我所说的传染性 NaNs。这只是我的说法,任何与 NaNs 的操作都会返回 NaN。实际上,我认为这是一个可怕的数据,因为像这样的东西可能会丢失数据。例如,考虑下面的代码:

h = 5
h += NaN

这将使得 h == NaN,这不是最优的。比起这样的事情,我更喜欢扔一个。幸运的是,Float64 类型是用 Julia 本身编写的,所以如果我想的话,我可以发出一个 pull 请求来修改它……我正在考虑。

最后一种类型的缺失是一无所有。当然,这种类型在编程中很常见。然而,它通常与数据中的丢失值无关,虽然这肯定没有 NaNs 或 missings 常见,但我以前见过这种情况。记住这一点,这是一件很重要的事情,以防万一你碰巧遇到了这样的数据集。

h = nothing

你很可能熟悉这种类型。它通常用于初始化,不太用于数据操作。也就是说,在我们讨论缺少值或类型的话题时,这当然值得一提。由于 Julia 是动态类型的,这也意味着这个新类型是开放的,无需分配就可以重定义。换句话说,我们只注册别名,而不为与之对应的数据分配位,因为没有位。这当然证明了它用于初始化是正确的,我认为在这方面它没有被充分利用。我们可以做的最后一件有趣的事情是调用 code_llvm 宏,这对于优化 Julia 代码和更好地理解该语言非常方便。我真的很喜欢这个宏,以防你看不出来。

returnnothing() = nothing

作者图片

真实处理

现在我们已经了解了不同种类的错过,请允许我揭示一些实际处理它们的方法。关于 missings、NaNs 和 nothing,你应该知道的第一件事是,只有 nothing 可以在布尔上下文中使用。这意味着任何带有布尔值返回的按位运算符,例如==、

z = nothing
z == nothingtruez = NaN
z == NaNfalsez = missing
z == missingmissing

这里使用 typeof(z)也没有太大的区别。考虑到这一点,我们如何使用条件来检测我们丢失的值呢?在 Julia 中,我们实际上使用方法来做到这一点。这两个方法是 isnan()和 ismissing()。

z = NaN
b = missing
if isnan(z) & ismissing(b)
    println("This is true")
end

在大多数情况下,您可能不必降低到使用条件来处理数据的水平。然而,Julia 数据生态系统相对来说还不成熟,所以不要期望永远不必在循环中做这样的事情。记住,解决这些问题的典型方法是使用 DataFrames.jl 包。

using DataFrames
df= DataFrame(:A => [5, 10, NaN, NaN, 25], :B => ["A", "B", "A", missing, missing])

作者图片

对于 DataFrames,使用 dropmissing()方法删除这些丢失的值相对容易。和 Julia 中的很多函数一样,我们也可以使用 dropmissing!()变更类型而不是变更该类型的副本:

dropmissing!(df)

作者图片

好的,现在我们没有遗漏,但是我们还有 NaNs。正如我所说的,这些也会破坏连续值,以及用于分析的返回结果,所以去掉它们也很重要。下面是一个求和的示例,由于这个错误的观察结果,它将返回 NaN:

sum(df[!, :A])

不幸的是,这个有点不同,因为它比这个方法调用要困难得多。不管怎样,这并不困难。然而,我们将需要通过 filter()方法(或 filter!()方法)来获取这些数据。我们也可以对思念和虚无做同样的事情,以摆脱它们。我们甚至可以将它发送出去,这样我们打电话就方便多了!此外,您可以修改 DataFrames.jl 的本地版本来做到这一点(正如我所做的!)

dropbad!(df::DataFrame, col::Symbol) = filter(:A => x -> !any(f -> f(x), (ismissing, isnothing, isnan)), df)

现在让我们称这个新方法为:

dropbad!(df, :A)

结论

在 Julia 中处理数据有其独特的方式,但在许多方面都很有意义。也就是说,我认为这可能会给那些从 Python 等其他语言继承过来的人带来一些问题。虽然在 Julia 中缺少值并不一定会更难处理,但我会说这有点独特,可能不是大多数人所习惯的。关于 Julia 的一个很棒的事情是,大多数基于 Julia 的方法都被扩展到各种不同的包,这使得学习每个包以及它是如何工作的变得容易得多,不管你以前是否使用过它。感谢您的阅读,希望这篇文章对您有所帮助!

如何处理标准 SQL 中的空值

原文:https://towardsdatascience.com/how-to-deal-with-null-values-in-standard-sql-1bffce0c55cd?source=collection_archive---------6-----------------------

1.识别— 2。理解— 3。行动

凯利·西克玛在 Unsplash 上的照片

谁能声称每天都能处理质量和可靠性无可挑剔的数据库呢?我个人不能,老实说,这是我喜欢做数据分析师的部分原因。即使数据清理很少是数据科学中最好的部分,但能够操作数据并从中获得洞察力仍然是必不可少的。

在上一篇关于数据科学的文章中,我们仔细研究了如何使用 SQL 处理数据库中的重复数据。在这里,我们想要解决许多数据分析师每天都会遇到的另一个常见问题:处理数据库中的空值。什么是空值?如何识别他们?如何处置他们?下面是我将尝试回答的一些问题。

请注意,以下代码是用标准 SQL 编写的(例如,与 SQL Server 或 Transact-SQL 相反),这是 Google BigQuery 中使用的 SQL 语言变体。根据您使用的数据库管理系统(RDBMS ),语法和使用的函数可能会有细微的变化。更多细节可以阅读 Google BigQuery 文档。

简介:null 还是空白?

在深入探讨 SQL 中处理空值的技术细节之前,我们必须首先定义空值的含义。特别是,空值必须与空白值区分开来:

  • 数据库字段意味着对于给定记录没有。它表示缺少值。
  • 一个空白的数据库字段意味着对于一个给定的记录有一个,这个值为空(对于一个字符串值)或 0(对于一个数值)。

这两种情况不能混淆,否则会导致错误解释数据并将空值作为 null 值处理。在本文中,我将使用一个名为“website _ CRM”(具有随机值)的测试数据库,它包含 10 行 7 列:

测试数据库 Marie Lefevre

我们假设这个数据库是一个电子商务网站的客户数据库。为了说明 null 值和空白值之间的区别,请仔细查看第 9 行。对于名为 Iliana I 的客户,字段“州”、“年龄”和“美国纳税人”为空值,而字段“电话”为空。这意味着他们没有填写前三个字段(空值),而是填写了“电话”字段并输入了空值。

第一步:识别和想象

首先,我们希望确定我们的数据集中是否有空值。有两种方法可以在数据集中查找空值,这取决于您对所操作数据的先验知识。

如果您已经知道在哪个字段(或列)中可能有您想要的空值,您可以直接在感兴趣的字段上应用条件WHERE IS NULL。在我们的示例中,如果我们知道“国家/地区”不是必填字段,而我们希望按地理区域分析客户的划分,我们希望只调查这一列。这段代码可以实现这一点:

如果您对正在调查的字段没有一个精确的概念 —或者如果您想要获得数据集中空值的完整概述,您必须首先清楚地了解每列中可能存在的空值以及空值的数量。为了获得这个概述,您可以使用下面的代码片段(从堆栈溢出中检索):

在我们的例子中,输出如下:

玛丽·勒费夫尔

第二步:理解和决定

既然您已经确定了数据库中存在空值的位置,那么您可以更进一步,调查是什么导致了这些空值。数据库包含空值有许多原因。让我们回答三个“背景调查”问题,以便更好地理解它们。

1.某些字段的所有行都为空吗?

在我们的示例中,“年龄”字段始终为空。其中一个原因可能是字段对于网站的顾客来说不是强制性的:在网上订购时,除了特定的商品,你不需要告知你的年龄。由于年龄是个人数据,客户在网上购物时可能不愿意分享这些信息。

这也可能表明网站上的潜在 bug。在这两种情况下,对于任何企业来说,监控数据库中 null 值的出现次数以及它如何随着时间的推移而演变都是至关重要的,尤其是当所有条目都为 null 时。在这种情况下,这可能会导致产品团队更深刻的反思:如果没有人填写这些信息,继续向客户询问这些信息是否有意义?

2.几个字段的行数都是空的吗?

有意或无意地,一些字段可以相互关联,其中一个字段填写的信息依赖于另一个字段。因此,更好地理解字段的相互依赖性可以帮助您解释为什么一些字段具有给定数量的空值。

在我们的例子中,这将对应于字段“state”和“us _ 纳税人”:这两列各有 7 个空值。当查看整个表时,我们在这里看到没有填写“州”字段的客户居住在美国以外的国家。如果“美国纳税人”字段不是必填的,这将解释这七个客户在网上订购“您是美国纳税人吗?”时不需要勾选最后一个框。

3.剩下的案例有哪些?

最终,你需要看看前面两步之后仍然无法解释的边缘情况。它们可以对应于数据输入中的错误或简单地对应于异常情况。在这两种情况下,调查是什么导致了这些剩余的空值对于改进您的产品或用户体验非常有指导意义。

在我们的电子商务示例中,有趣的是一位在线客户(Carla C .)没有提供他们的电子邮件地址。虽然通过电子邮件接收订单确认和采购账单是必要的,但是这个字段怎么可能不是强制的呢?无论如何,这种数据输入在未来必须成为不可能。这就是为什么调查导致空值的原因对业务至关重要:这可能是由于人为错误(例如,客户忘记提供电子邮件地址)或技术错误(例如,网站在保存表单时遇到错误,因此无法保存填写的值)。

照片由 Hadija Saidi 在 Unsplash 上拍摄

第三步:行动和修改

根据您从前面的步骤中得出的结论,现在是时候对这些空值产生影响了。他们应该保持现在的样子,还是应该不惜一切代价将他们移除?我确定了三种处理它们的方法:

  • 用中性值替换空值,例如“不适用”或“-”
  • 用有意义的值替换空值
  • 让空值为空

对于决定替换空值的情况,让我们应用最合适的 SQL 函数。

IFNULL:简单的一个

顾名思义,如果输入值为空,函数IFNULL(expr, null_result)将返回某个值。

在我们的例子中,我们希望使字段“state”中的空值更加明确,因此我们选择用中性词代替空值,如“data not available”。这同样适用于“年龄”字段。此外,我们希望从字段“us _ taobar”中删除所有空值。让我们假设所有没有回答“是”的顾客都没有在美国纳税。因此,如果这个字段为空,我们要返回“否”。结合前面的更改,将得到以下代码片段:

IFNULL(状态,'数据不可用')
IFNULL(年龄,'数据不可用')
IFNULL(美国 _ 纳税人,'否')

COALESCE:清单 1

函数COALESCE(expr[, ...])返回第一个非空表达式的值。要使用它,您需要预先定义要用来替换空值的术语的优先级顺序。

在我们的例子中,我们希望确保字段‘email’没有空值。原因可能是我们的支持团队将此字段用作客户的联系点。因此,我们希望该字段等于,优先级顺序如下:

  1. 客户的电子邮件地址(如果有)
  2. 否则,如果有的话,客户的电话号码
  3. 否则,客户的名称

为此,我们不能使用 IFNULL 函数,因为它只能显示空值的一个替代值。所以我们使用下面这段代码:

联合(电子邮件、电话、姓名)

案例:复杂的案例

最后,当需要处理几种情况时,可以使用CASE expr WHEN expr_to_match THEN result [...] [ELSE else_result] END函数,包括更复杂的情况,其中 IFNULL 或 COALESCE 不足以替换空值。

在我们的示例中,如果字段“国家”为空,我们希望以特定顺序应用以下规则:

  1. 如果“国家”不为空,那么我们就取这个值
  2. 否则,如果“state”不为空并且属于美国的一个州,我们希望在“country”字段中写入“United States”
  3. 否则,如果“州”不为空,我们希望将这个“州”值复制到“国家”字段中
  4. 否则,我们就写“没有国家”

在标准 SQL 中,这对应于下面这段代码:

事例
当国家不为空时,则国家
当州在('阿拉巴马','阿拉斯加','亚利桑那','…','佛罗里达州','堪萨斯州','华盛顿州')时,则国家
当州不为空时,则国家
否则‘没有国家’
结束

最终产出和结论

总而言之,我们构建了下面这段代码:

在应用了上面所有的修改之后,我们最终得到了一个干净的表。不仅在视觉上更漂亮,而且用有意义的值替换空值使得读者更容易理解表格。作为一个数据分析师,这是弥足珍贵的。更重要的是,这将使非技术用户能够更好地利用您的数据库,同时降低误解某些不包含值的字段(相对于空值)的风险。

测试数据库 Marie Lefevre

现在它是你的了!**你如何处理空值?**识别空值真的比清除空值容易吗?请在下面分享您的技巧,并讨论您在 SQL 方面的最佳实践。

你喜欢阅读这篇文章吗? 成为 的一员,加入一个不断成长的充满好奇心的社区吧!

如何处理规则重叠?

原文:https://towardsdatascience.com/how-to-deal-with-overlapping-rules-16bc0446af66?source=collection_archive---------33-----------------------

入门

尤其是当规则的预测相互矛盾时。

来自 Pixabay 的塞普蒂米乌的图片。

当一个人想要建立一个可解释的模型时,他通常会在两个主要的内在可解释算法家族之间犹豫不决:基于树的算法和基于规则的算法。它们之间的主要区别之一是,基于树的算法生成具有不相交规则的树,这具有诸如复制子树问题的缺点[1],而基于规则的算法生成规则集并允许重叠规则,这可能是一个问题。事实上,当两个(或更多)规则同时被激活时,您如何做出决定呢?当规则的预测相互矛盾时,这就更成问题了。

在这篇短文中,我介绍了从一组规则中获得单个预测的两种方法,这两种方法比平均预测更重要,但保留了预测的可解释性。

使用专家汇总方法

如果您不熟悉专家的聚合理论,我建议您阅读我以前的文章“如何选择最佳模型?”。这个想法很简单:把每一个规则看作是专门的专家,通过一个凸组合来聚集他们的预测。与规则相关的权重在每次预测后都会改变:如果专家的预测是好的,则权重会增加,否则会减少。因此,权重可以解释为我们在时间 t 对每个专家的信任度。

不幸的是,规则可能没有被激活。这意味着新的观察不满足他们的条件。他们被称为“睡眠专家”。问题是我如何评估一个没有被激活的规则的可信度?常见的方法有两种。首先是说“没有信息我不会做决定”。这样,休眠规则的权重保持不变,直到它再次激活。二是问“这个规则是睡觉好吗?”。以这种方式,通过考虑集合预测而不是规则的预测来评估休眠规则的新权重。如果聚集预测是好的,则意味着该规则一直是正确的,否则意味着该规则应该一直是活动的。这两种方法都有问题。但是已经证明它们提供了相似的结果。

使用分区技巧

划分是一个非常不同的想法,更“统计”。其思路是将规则集形成的覆盖变成分隔单元格的分割(如下图所示)。因此,预测将是单元中观察值的平均值,而解释将是规则的结合。

图片来自作者。

有人可能会反对建造这种隔墙非常费时。而且是正确的。所以,为了解决这个问题,有一个分区技巧。其思想是要理解,计算预测值不需要完全描述分区。诀窍是识别包含新观察值 x 的分区的唯一单元。通过创建二进制向量,如果新的观察值 x 满足规则的条件,则其值为 1,否则为 0,对包含 x 的单元的识别是简单的向量运算序列。因此,计算预测的复杂度是 O(nR) ,,其中 n 是训练集中的点数,而 R 是规则数。下图是这个过程的图解(更多细节我参考[2])。

图片来自作者。

这种方法的主要问题是我们无法控制细胞的大小。换句话说,如果包含新观察值的单元格太小,您可能会根据太少的过去观察值做出决定。如果训练集中的数据很少,就会出现此问题。可以解释为情况不明。

结论

我已经介绍了两种方法,即使您的过程基于重叠的规则,也可以做出决定。这两种方法各有利弊。第一种基于专家聚集理论,在实践中运行良好,并为规则增加了一个置信度得分。第二种,基于划分技巧,理论上更好。如[3]中所述,这是生成回归函数的可解释一致估计量的好方法。

参考

[1] G.Bagallo 和 D.Haussler,经验学习中的布尔特征发现 (1990),载于《机器学习》,5(1):71–99。斯普林格。

[2] V.Margot,J-P. Baudry,F. Guilloux 和 O. Wintenberger,规则归纳划分估计器 (2018),模式识别中的机器学习和数据挖掘国际会议 288–301。斯普林格。

[3] V.Margot,J-P. Baudry,F. Guilloux 和 O. Wintenberger,使用数据相关覆盖的一致回归(2021 年),载于《电子统计杂志》。数理统计研究所和伯努利学会。

关于我们

Advestis 是一家欧洲合同研究组织(CRO ),对统计学和可解释的机器学习技术有着深刻的理解和实践。Advestis 的专长包括复杂系统的建模和时间现象的预测分析。

领英:【https://www.linkedin.com/company/advestis/】T4

如何在 VS 代码中调试 Flask 应用程序

原文:https://towardsdatascience.com/how-to-debug-flask-applications-in-vs-code-c65c9bdbef21?source=collection_archive---------1-----------------------

如何使用 flask 创建一个基本的 web 服务,然后在 VS 代码集成开发环境中单步调试并完全调试代码

由 Unsplash 上的 Clément Hélardot 拍摄

介绍

Flask 应用是使用 flask 库用 Python 编程语言开发的 web 服务应用。

它们是快速开发任何编程语言(包括 Python、C#)都可以使用的 web 服务的好方法。NET、Java 等。但是直到最近,我还不知道如何在 VS 代码中调试,这样我就可以一步一步地调试 flask 应用程序代码。

本文展示了一个简单的分步指南,它将使您能够完成设置和配置,从而轻松调试 flask 应用程序。

步骤 1:开发一个基本的烧瓶应用程序

第一步是使用 flask 创建一个基本的 web 服务。有许多在线教程向您展示如何做到这一点,包括我发现特别有用的这个教程——https://programminghistorian . org/en/lessons/creating-APIs-with-python-and-flask。

出于本教程的目的,我们将使用基本应用程序来探索如何调试 flask 应用程序如下-

您应该在 VS 代码环境中创建 flask 应用程序,并且应该创建一个。py 文件,并将其命名为app.py

有一些方法可以修改配置,为您的代码文件使用不同的名称app.py,但是因为您在 flask web app 中只允许使用一个 Python 文件(在 flask web app 中,您可以创建任意多的 web 服务),所以更改它似乎没有多大意义。

如果到目前为止您一直在学习,那么您的 VS 代码环境和 Python 代码应该是这样的

作者图片

步骤 2:创建并配置一个 launch.json 配置文件

如果您单击 ide 左侧的“运行和调试”图标,或者键入 Ctrl+Shift+D,您将看到“运行和调试”窗口。

现在点击“创建 launch.json 文件”链接,当提示“选择调试配置”时,选择“Python 文件调试当前活动的 Python 文件”。

作者图片

VS 代码现在会自动为您创建一个 launch.json 配置文件,该文件预先填充了一些基本设置。

首先要做的是删除注释,因为这些注释会在稍后执行 flask 应用程序时导致错误/警告-

作者图片

下一步是最关键的。当 VS 代码创建 launch.json 文件和相关的配置时,它不包括必要的配置来告诉环境和 web 服务器在哪里可以找到 conda 环境,这必须手动添加,否则调试将永远无法在 VS 代码中工作。

  1. 在你的电脑上找一找你的 Anaconda 文件夹,其中包含一个名为_conda.exe的文件
  2. 在 launch.json 中为名为"python.condaPath"的参数创建一个新的配置行,其值指向正确的路径

完成的 launch.json 文件应该如下所示

作者图片

注意:在 Windows 环境中有三种方式可以启动 VS 代码

  1. 转到 Windows 开始菜单,启动 VS 代码
  2. 启动 Anaconda 环境并点击 VS 代码下的“Launch”
  3. 启动 Anaconda 命令提示符并键入“code”

只有在使用第一种方法时,才需要在 launch.json 中添加一行来设置"python.condaPath"

如果您使用方法 2 或 3,这将指示 VS 代码环境使用基本 conda 环境,因此不需要额外的配置。

步骤 3:启动调试器

下一步是回到代码文件中,在编辑器的空白处单击,在代码中创建一些断点。在下面的例子中,我点击了第 33 行和第 39 行-

作者图片

现在回到“运行和调试”窗口,点击“Python: Current File”旁边的绿色箭头,开始调试会话

作者图片

当您启动调试器时,可能会收到“Exception has occure:system exit message ”,但这并不重要,不会阻止您调试代码。

只需点击调试工具栏中的蓝色“播放”按钮,调试会话将继续-

作者图片

如果一切正常,你在终端窗口得到的最后一条消息将是-

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

步骤 4:调用 Web 服务

您现在需要打开一个 web 浏览器,在 URL 中键入http://127.0.0.1:5000/,以调用正在调试器和 VS 代码 ide 中运行的 web 服务

作者图片

一旦按下return键,您将看到以下内容-

  1. 浏览器调用已经调用了 web 服务
  2. 在 VS 代码中,web 服务已被调用,并在调试器中您添加断点的地方暂停
  3. 现在,您可以使用 VS 代码调试工具栏来调试代码

作者图片

当您单步执行代码并退出 web 服务函数时,web 服务的输出将返回给调用该服务的 web 浏览器

作者图片

如果您想要调用返回所有数据科学书籍的第二个服务,请返回到 web 浏览器并修改 URL,如下所示

[http://127.0.0.1:5000/api/v1/resources/books/all](http://127.0.0.1:5000/api/v1/resources/books/all)

现在将在调试器中调用和暂停第二个 web 服务。一旦你完成了代码并执行了函数,代表数据科学手册库的 json 将作为输出返回给浏览器

作者图片

结论

第一次用 VS 代码设置 flask web 应用程序的调试有点笨拙,尤其是当你不知道把最重要的"python.condaPath": "C:\\Users\\GHarrison\\Anaconda3"行添加到launch.json文件中的时候。

然而,对于 web 服务来说,一旦完成一次,它将只适用于所有后续会话,并且一旦这些 web 服务超出这里给出的基本示例的规模,成为真实世界的复杂 web 服务,能够单步调试 flask web 应用程序的能力就变得至关重要。

感谢您的阅读!

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

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

如果你想通过订阅来支持作者和全世界 1000 个为文章写作做出贡献的人,请使用这个链接——https://grahamharrison-86487.medium.com/membership(注意:如果你使用这个链接注册,作者将收到一定比例的费用)。

如何用 TensorBoard 调试你的深度学习管道

原文:https://towardsdatascience.com/how-to-debug-your-deep-learning-pipeline-with-tensorboard-d27d3f8795e?source=collection_archive---------29-----------------------

关于如何提高深度学习实验吞吐量的互动示例。

使用 TensorBoard 对 10 个平假名字符类进行 UMAP 分割(图片由作者提供)

当我们开发深度学习模型时,我们经常会在管道中遇到各种各样的问题。这包括我们处理数据的方式的问题,将数据传递到我们的模型的方式的错误,甚至在评估阶段的错误。数据科学家面临的主要挑战之一是使这些数据(尽可能)透明,以确保使用工具箱中的正确工具(预处理策略、模型层、评估标准等)。).然而,为了实现这一点,我们经常不得不在试错的基础上做一系列实验,包括显示定制图和跟踪变量。这就是 TensorBoard 来提升我们工作流程的地方!

tensor board 到底是什么?

TensorBoard 是一款专为深度学习管道打造的高级分析工具,可处理各种数据源(图像、视频、音频、结构化数据等)。).它允许我们通过自动化的可视化绘图来调试我们的管道。它还跟踪我们实验的历史,以便我们可以运行多个版本,并观察哪个模型配置对性能有最好的影响。这对于超参数调整特别有用。另一个我非常喜欢的功能是能够将我们的模型嵌入到 2D/3D 空间中(通过聚类方法),并观察每个单独数据点之间的相关性。

在本教程中,我将向您展示一个标准的图像分类示例,它使用了包含日本平假名字符集的K-MNIST(Kuzushiji-MNIST)数据集。我们将使用 PyTorch 来构建和评估我们的模型,并将其发送到 TensorBoard 进行分析,只需在我们的代码中添加简单的 2-3 行代码!

数据

km NIST-10 行平假名候选类(图片由 Clanuwat 等人提供,古典建筑深度学习,2018)

K-MNIST 是一组日本 Kuzushiji 人物,基于经典 MNIST 。除了在这种情况下,目标不是数字,而是代表一组平假名字符(上例中的每一行)。每一行的第一个例子是汉字的现代平假名,而其余的是用 Kuzushiji - 风格书写的,这是 150 多年前在旧日本手稿和书籍中使用的。这个数据集是如何创建的背后的故事真的很有趣,因为它通常允许以这种风格编写的旧日本文学作品被翻译成现代汉字并用于教育系统。你可以在这里阅读更多关于 Clanuwat 等人的工作。

我们将在中使用这个数据集来构建一个用于字符识别的基本 PyTorch ConvNet (别担心,你不需要真正懂日语,我也不需要)。那么,让我们开始吧:)。

依赖关系

此示例是在 Python 3.7 环境中制作的,包括以下软件包的最新版本:

  • 火炬和火炬视觉——建模
  • 标准绘图、计算包— matplotlib、seaborn、numpy(应已安装在 Conda 上)
  • 注意:如果你已经在你的环境中安装了tensor flow*,你可以使用这个工具清除任何与文件处理相关的 TensorBoard 错误。*

这里还有其他的进口货:

基本配置

让我们也添加几个默认变量,以便稍后使用。这些包括字符的类名、一些超参数、路径和图像的大小。

初始化张量板

这只需一个调用就可以完成,这个调用将生成一个 runs/k-mnist 目录,我们的数据将由 TensorBoard API 在其中编码。

读取数据

我们可以使用 PyTorch DataLoader 类轻松加载我们的 K-MNIST 数据用于训练和验证。我们还可以指定加载后要执行的自定义转换。在这种情况下,我们将把图像转换成 PyTorch 张量,并归一化图像通道(使用与处理 MNIST 所用参数相同的参数)。

想象一些例子

在我们真正进入 TensorBoard 的自动化部分之前,让我们先来看看如何分析一些自定义图像。对于这个例子,我们将通过从 ubyte 格式加载它们作为 numpy 数组来查看原始字符。接下来,我们将创建两个简单的函数:

  • 一个用于显示前 25 个字符及其类别索引的 5x5 网格
  • 一个在单独的图像中显示 25 个字符中的每一个

我们将把这两个函数的输出记录到 TensorBoard 中。对于网格,我们将暂时将 matplotlib 图形保存到缓冲区,然后使用 PIL 将其转换为张量,然后将其传递给 TensorBoard。我们这样做是因为张量板只处理张量输入。为了绘制单个图像,我们可以简单地将 numpy 数组转换为张量,并以不同的全局步长传递每个图像。

现在,为了查看记录的输出,我们需要在一个单独的终端中启动 TensorBoard API ,并在本地运行时托管它。我们可以通过切换到我们的项目文件夹并运行下面的代码来实现。张量板输出将位于http://localhost:6006

tensorboard --logdir=runs/k-mnist --samples_per_plugin "images=100, text=100"

这里, logdir 是我们在初始化 SummaryWriter 时创建的目录。注: *--samples_per_plugin* 允许我们为特定的张量板模块增加可跳过的样本数量。在我们的例子中,在图像和文本方面,我们超过了这个限制,增加它给了我们完整的输出集。

托管 TensorBoard 后,我们将看到以下页面:

TensorBoard 图片(注意:在此阶段,您将只能看到当前选项卡)—作者图片

TensorBoard 中可视化图像数据允许您交互式调整对比度和亮度,以及滚动多个示例,这对于观察您的数据非常有用。

创建数据加载器

为了使模型训练更加节省内存,我们需要使用批处理。这在 PyTorch 中通过**数据加载器很容易完成。**简单指定批量大小以及是否打乱训练/val 集合。

创建一个简单的 CNN 模型并记录模型摘要

接下来,我们将创建一个基线 3 层 CNN 模型来对平假名字符进行分类(这将主要基于官方 K-MNIST repo 上提议的网络)。这将由两个 **CONV 池辍学**组合和一个全连接层组成,以将输出减少到 10 维,逻辑代表每个类。像往常一样,我们将使用**交叉熵**函数计算损失,并设置一个标准优化器。为了将图形嵌入添加到 **TensorBoard** 中,我们需要抓取一批特征和标签,这样输入的形状也可以保存。

TensorBoard 图:跟踪模型结构(图片由作者提供)

这有助于我们交互式地追踪模型结构,从输入形状开始,一直到预测。每个箭头还描述了每个单元的形状,这对于识别模型中的形状不匹配非常有用。这是一个简单的例子,但是对于更大、更深层次的架构来说,这些图节省了大量的调试时间。

训练预测器

在我们开始训练之前,我们应该确保我们正在我们的 GPU 设备上训练(如果可用的话)。这可以通过设置活动 PyTorch 设备来实现:

为了使代码更具可读性和可复制性,让我们构建一个包含一些输入参数和辅助函数的kmnistpoirder类。我们将设置目标历元数、批量大小、损失函数和 TensorBoard writer 对象。 loss_batch 函数将允许我们计算交叉熵损失,反推并更新单个批次的权重。 get_correct_examples 函数是一个简单的一行程序,用于获取单个批次中正确样本的数量,这将帮助我们计算精确度**。除了,**我们还需要使用 Softmax 函数计算每个类别的概率,因此我们可以使用 get_probs 在一个步骤中提取预测的类别和概率。注意:to(dev)确保我们将批处理发送到正确的设备,否则我们将得到内存分配错误。 最后,我们的 fit() 函数将由两个阶段组成:

  • 训练模式:遍历每一批,对历元中的批损失、正确和总样本进行求和。这将不断更新模型权重。之后,只需将它们打印出来,并将列车损失和精度记录为张量板标量。
  • 评估模式:遍历每个验证批次,并对历元中的损失、正确和总实例进行求和(不要指定优化器,此步骤的权重应被冻结)。然后类似地,将验证损失和精度记录为张量板标量。

我们还将添加一个 save()和 load() 方法,以便保留模型状态供将来使用。现在,我们可以通过运行三行代码来训练和保存我们的模型:

现在,我们可以自动跟踪模型性能,而不必进行任何自定义绘图。我们跟踪的指标将记录在标量选项卡上,在这里我们可以观察每个时间步长的损失/准确性。这允许我们看到当前配置的潜在问题(例如,在什么点上我们的模型开始过拟合)。

张量板标量:在训练期间跟踪模型性能(图片由作者提供)

在这个例子中,我们可以看到我们的模型收敛得相当好,因为我们达到了 95%的验证准确度,并且我们的验证损失曲线变得平滑。但是,我们仍然可以做进一步的分析,以确保我们的模型是稳定的。

精确召回曲线

为了可视化每个平假名字符的每类性能,我们可以很容易地使用 TensorBoard 的 精确召回曲线模块。首先,我们加载验证数据,并提取每个批次的预测类别和概率。然后,我们将它们堆叠在一个列表中,并将输出记录到 TensorBoard。遍历每个类,我们需要传递一个布尔数组,指定哪个输出对应于相应的类和概率集(也是一个递增的全局步骤,这样我们就不会覆盖任何一个类)。

prcurves 选项卡中,我们可以观察到每个平假名字符的精度-召回权衡。您将看到,随着模型在所有类上都取得了良好的性能,所有的斜率都严重向右偏移。如果我们突出显示右上区域,我们可以放大并看到每个类的真阳性/阴性假阳性/阴性的实际比率。

TensorBoard PR 曲线:获得每类性能(图片由作者提供)

地块分类错误

类似于我们之前显示的图像网格,我们也可以绘制一个自定义的错误网格,以便观察哪些字符被错误分类。我们只需要再次加载验证数据,获得预测的类并将它们附加到一个列表中,分别保存真实/预测的类(仅当它们不同时),以及实际的图像。然后我们可以用第一个 25 错误分类的例子创建一个网格,和以前一样。同时,我们还可以添加一些文本数据来记录到 TensorBoard 中,比如每个示例的预测与实际输出。我们将添加图像索引,以便将该信息与显示的网格相关联。

TensorBoard:显示分类错误(图片由作者提供)

我们将在图像选项卡上看到我们的错误网格,并在文本选项卡上看到我们为每个示例记录的类。

超参数调谐

我们还可以使用 hparams 轻松利用 TensorBoard 来调整我们的 K-MNIST 预测器的超参数。首先,我们需要修改我们的培训类来支持这一点,增加几行代码:

我们将首先添加学习率、优化器名称、批量大小(调优目标),以及 TensorBoard writer 对象。然后,在我们的 fit() 函数的末尾,我们将简单地添加这些用于监控的参数:

  • 第一个参数:超参数字典(名称:值)
  • 第二个参数:用于监控的性能指标字典(名称:值)

在这种情况下,我们将记录纪元验证准确性/损失。这将生成一个性能表,突出显示每个超参数组合的这些值的变化。现在,让我们定义一个搜索网格和一个整体的 optimize() 函数来装饰我们的训练管道。这将迭代每个学习率/批量大小/优化器组合,并生成总共 27 个模型组合(在 3x3 网格上)。这可能需要一些时间来计算(在我的例子中大约需要 30 分钟),所以请随意减少参数的数量。注意:由于批量大小和学习率的选择会导致不稳定的配置,某些模型组合的性能会非常差。对于较大的**学习率,模型更容易在* 局部极小值 处初始化,由于步长过大,无法从训练数据中获得牵引力。这是一个例子,其中调整你的 学习率/批量 是必要的。*

TensorBoard hparams:交互式调整您的模型(图片由作者提供)

视图中,我们可以观察每个超参数配置的性能指标。在我们的例子中,获得的最佳性能是我们最初使用的(Adam,批量:32,学习率:0.001),达到大约 95%的验证准确性。我们还可以在平行坐标视图中更好地可视化这一点,在这里我们可以更改指标的比例,并在超参数网格中跟踪每个模型的性能。

特征检查/降维

TensorBoard 支持的另一个非常酷的功能是 2D/3D 空间中的特征投影。这允许您应用聚类方法,如 PCA 或 T-SNE,以便可视化个体组之间的相似性和某些类别特征内的识别模式。最棒的是,它是互动的,所以你可以实时观察。

让我们看一个简单的例子。我们将从验证数据(图像和标签)中每批随机挑选 16 个示例,将它们在一个维度上堆叠在一起,并创建一个 TensorBoard 嵌入来可视化这组示例。图像将在两个维度上被挤压(批量维度和宽度高度通道)。这将构建计算相似性的特征向量。为了可视化,原始 PyTorch 图像张量将被传递到 label_img 并且元数据将是平假名字符的真实类。

*投影仪选项卡最初将显示我们随机批次的 PCA。这是一种降维方法,将我们的输入特征压缩到 3 个可观察的维度中。然后,您可以按类别标签给图着色,以便区分每个字符类别。你也可以使用 T-SNE 和 UMAP 等方法来运行其他模拟。在这里,您可以随意尝试不同的方法、参数和采样策略,看看分布是如何变化的。*

TensorBoard 投影仪:在 2D/3D 空间中可视化您的特征(图片由作者提供)

注意:如果投影仪选项卡没有出现,请尝试从命令行重新运行 TensorBoard 并刷新浏览器。

用 TensorBoard 完成工作后,也要经常用 writer.close() 关闭自己的 writer,从内存中释放*。***

最后的想法

TensorBoard 通常是一个很好的分析工具,可以帮助调试你的深度学习管道,无论是在数据层面还是模型层面。我可以肯定地说,它节省了您自己创建定制图和跟踪性能指标的大量时间。因此,这是一个很好的工具,因为您可以生成和测试更多的实验/模型配置,并立即跟踪您的管道中哪些有效,哪些无效,以及哪些需要修复。

希望你喜欢这个教程:)。距离我上次写已经有一段时间了,但是我很想在将来写更多,所以如果你对代码或博客中提到的信息有任何建议/问题,请告诉我。

这个库(本质上只是一个 Jupyter 笔记本)可以在 GitHub 上本地克隆。

参考文献

  1. 在 TensorBoard (Tensorflow)中显示图像摘要
  2. 用张量板测井
  3. 另一个伟大的张量板概述(PyTorch)
  4. 带 PyTorch 的官方张量板教程
  5. K-MNIST 数据集
  6. Torchvision 数据集文档(用于创建数据加载器)

如何使用谷歌地图的 API 决定晚餐分组

原文:https://towardsdatascience.com/how-to-decide-on-dinner-grouping-using-google-maps-api-75edaa78fc9d?source=collection_archive---------48-----------------------

随着新加坡从新冠肺炎疫情中恢复过来,新加坡政府已经开始允许人们八人小组聚会。我的教会团体(37 人)想一起吃晚饭。因此,我决定用 R 写一些代码,让我们尽可能以最好的方式组织晚餐!(为保护隐私,使用了假名)

分类要求

  1. 人们呆在新加坡各地
  2. 有 5 个晚餐地点
  3. 人们在世界不同地区进行研究。
  4. 我们需要先根据地区然后根据晚餐地点对人们进行分类。
  5. 每组最多 5 人,每组必须至少有 2 人来自同一地区。

这看起来是一个有趣的挑战!

测量便利性

考虑到这些需求,我不得不开始考虑如何实现这一点。为了确保人们去最方便的地方,我们可以使用的最明显的度量标准是从他们的房子到晚餐地点的旅行时间。为了找到答案,我使用了mapsapi,它允许我们访问谷歌地图 API 套件中的方向 API。下面是我如何使用它的一个例子!(注:MRT 代表大众捷运是新加坡的地铁)

一旦我有了旅行时间,我所要做的就是按不同地点的旅行时间降序排列(同时按研究区域分组),这将允许我将它们归入不同的组。

查找旅行时间

以下是(假)数据的样子:

所以我们有了这些人的名字,他们的研究区域和离他们家最近的地铁站。我创建了 5 个额外的空列(用来存储到 5 个地点的旅行时间),然后运行一个循环来使用mp_directions填充它。

问题是……它以字符串的形式返回旅行时间,返回类似“1 小时 15 分钟”和“55 分钟”的结果(正如你在上面的例子中看到的)。因此,我需要做些事情将它们转换成数值,这样我们就可以对它们进行排序。我使用 if/else 和stringr完成了这个任务

我对所有 4 个位置都这样做了,将它包装在一个更大的 for 循环中,以考虑所有不同的位置。完成后,这就是数据帧的样子!

排序和更多排序

有了旅行时间,我们现在要找到离一个人最近的位置所要做的就是找到最小值。为了做到这一点,我使用了apply,逐一检查每一行,并对它们进行排序,以找到最低值,然后是第二低的值等等。我还使用了names(),以便将它存储为地点的名称。

最后,我把它按地区分组,然后把它们从第一到第五选择排列起来。

组的分配

分类工作完成后,剩下要做的就是找出人与人之间的分配。我决定一次做一个地区,因为它们必须按地区分类。

首先,我决定使用count快速浏览一下分配情况。

从数据来看,璧山显然是大多数人最集中的地方。然而,只有一组人能到场。在整理过程中,我得到的指示是尽我所能让大多数人都方便。不幸的是,有限的地点意味着一些人将不得不去 T4 旅游。

我决定优先考虑旅行时间,但也要确保每个晚餐地点至少有两个人来自同一个地区。我根据最近的位置,第二个最近的位置进行过滤,然后从每个区域中切掉前三个名字。

我不会用剩下的排序来烦你,但我基本上检查了每个位置并把它们切片,确保每个人都被分配到一个组。

也就这样了!这不是一个非常困难的问题,但如果手动完成,可能会很乏味。使用 Google Maps API 可以让人们更容易找到地点之间的距离,然后相应地对它们进行排序。

原载于http://zachlim98.github.io/me

如何为您的机器学习模型确定完美的距离度量

原文:https://towardsdatascience.com/how-to-decide-the-perfect-distance-metric-for-your-machine-learning-model-2fa6e5810f11?source=collection_archive---------8-----------------------

曾经怀疑过哪种距离度量对您的用例最有利吗?

塔内利·拉蒂宁在 Unsplash 上拍摄的照片

声明:你不需要每个 ML 模型都有一个距离度量,但是如果你需要的话,请继续读下去,选出最好的一个。

距离度量在机器学习和深度学习中起着重要的作用。像 k-NN,K 表示聚类,深度学习中使用的损失函数等机器学习算法都依赖于这些度量。

因此,了解不同类型的距离度量对于决定何时使用哪种度量非常重要。例如,k-NN 经常使用欧几里德距离进行学习。但是,如果数据是高维的呢?欧氏距离还会有价值吗?不,不会的,因为我们知道,欧几里德距离对于高维空间来说并不是一个好的度量(参见这个链接了解更多信息)。所以我想你现在可以理解,知道你的距离度量可以帮助你从一个差的分类器到一个精确的模型。

在这篇博客中,我们将介绍一些最常用的距离度量及其用例和缺点,以及如何在 python 中实现它们。我们将讨论的问题如下:

  • 欧几里得距离
  • 曼哈顿距离
  • 切比雪夫距离
  • 闵可夫斯基距离
  • 汉娩距
  • 余弦相似性
  • 雅克卡相似性
  • 索伦森-戴斯指数

欧几里得距离

欧几里德距离是最常用的距离度量之一。从数学上来说,它是两个不同数据点之间的差异之和的平方根。下面是计算两个 k 维向量之间距离的公式。

作者图片

应用/优点:

  • 高度直观、易于理解、易于使用的指标
  • 它应该用在 KNN 或 K 均值等算法中,在这些算法中,我们有低维数据,数据点之间的直线距离足以衡量这些点的相似性。

图像来源

缺点:

  • 它会受到输入要素比例的影响,这意味着根据每个要素的单位,计算的距离可能会有偏差。因此,标准化输入特征至关重要。
  • 对高维数据无效/无用

python 中计算欧几里德距离的函数:

from math import sqrtdef euclidean_distance(a, b):
    return sqrt(sum((e1-e2)**2 for e1, e2 in zip(a,b)))#ORfrom scipy.spatial.distance import euclidean
dist = euclidean(row1, row2)
print(dist)

曼哈顿距离

作者图片

它通常被称为出租车距离或城市街区距离。想象你在一个城市街区,有两组平行的道路,水平的和垂直的,如图所示。所以,如果你想从一个点旅行到另一个点,你只能以直角移动。

然后计算两点之间的距离代表曼哈顿距离。

作者图片

应用/优点:

  • 当数据集中存在离散/二进制属性时,曼哈顿距离度量更有效,因为它考虑了可从给定属性值中实际获取的路径。

缺点:

  • 对于数据集中的浮动属性,它并不代表最佳距离。
  • 对于高维数据,它比欧几里德距离更好,但在性能方面仍不是最佳选择。

python 中计算曼哈顿距离的函数:

def manhattan_distance(a, b):
    return sum(abs(e1-e2) for e1, e2 in zip(a,b))#ORfrom scipy.spatial.distance import cityblock
dist = cityblock(row1, row2)
print(dist)

切比雪夫距离

切比雪夫距离被定义为所有坐标维度中两个向量之间的最大差值。换句话说,它就是沿每个轴的最大距离

作者图片

应用/优点:

  • 这一指标通常用于物流问题。例如,计算车辆从一个地方到另一个地方所需的最小步数,假设车辆在一个网格中运动,因此只有八个可能的方向(上、右上、右、右下、下、左下、左、左上)

缺点:

  • 它只能用于特定的问题。它不能像欧几里得那样适用于任何通用问题。

python 中计算切比雪夫距离的函数:

def chebyshev_distance(a, b):
    return max(abs(e1-e2) for e1, e2 in zip(a,b))#ORfrom scipy.spatial.distance import chebyshev
dist = chebyshev(row1, row2)
print(dist)

闵可夫斯基距离

Minkowski 概括了上面讨论的所有距离度量,如欧几里德、曼哈顿和切比雪夫。它也被称为 p-范数向量,因为它添加了一个称为“p”的参数,允许计算不同的距离度量。公式是:

作者图片

对于 p=1 —曼哈顿距离

对于 p=2 —欧几里德距离

对于 p =无穷大—切比雪夫距离

由于这是一个更通用的距离度量,不同的 p 值将导致不同的利弊。我们已经在上面讨论了其中的一些。

python 中计算闵可夫斯基距离的函数:

def minkowski_distance(a, b, p):
    return sum(abs(e1-e2)**p for e1, e2 in zip(a,b))**(1/p)#ORfrom scipy.spatial import minkowski_distance
dist = minkowski_distance(row1, row2)
print(dist)

汉娩距

这是迄今为止最简单的一个。它等于两个数据点之间不同的值的数量。假设两个数据点 x 和 y 如下:

x = [1,2,3,0,2,4]

y = [1,3,3,0,1,4]

那么汉明距离= 2 至于 index(假设 index 从 0 开始)1 和 4 在 x 和 y 上的值是不同的,它通常用于计算两个二进制字符串之间的距离。

优势/优点:

  • 当数据从一台计算机发送到另一台计算机时,它通常用于错误检测。

缺点:

  • 因为它用于通过比较每个值来找出两个数据点之间的差异,所以它们必须具有相等的长度。
  • 它不包含数据点的实际值/幅度。因此,当特征量起重要作用时,不建议使用。

python 中计算汉明距离的函数:

def hamming_distance(a, b):
    return sum(abs(e1 - e2) for e1, e2 in zip(a, b)) / len(a)#ORfrom scipy.spatial.distance import hamming
dist = hamming(row1, row2)
print(dist)

余弦相似性

它也是最常用的距离度量之一。它用于通过计算两个向量/数据点之间的余弦角来找出它们之间的相似性。

作者图片

为了更好地理解,如果两个向量重合或方向相同,那么它们之间的余弦相似度将为 1,如果它们完全相反,则为-1。

优势/优点:

  • 适用于高维数据,应该在理想情况下用于这些数据。
  • 它被用来寻找许多事物之间的相似性,如文本嵌入、图片嵌入或指纹嵌入。

缺点:

  • 类似于汉明距离,在余弦相似性中不考虑向量的大小;只考虑他们的方向。

python 中计算余弦相似性的函数:

from numpy import dot
from numpy.linalg import normdef cosine_similarity(a,b):
    return dot(a, b)/(norm(a)*norm(b))#ORfrom scipy.spatial.distance import cosine
dist = 1 - cosine(row1, row2)
print(dist)

雅克卡相似性

Jaccard 相似度用于计算相似度,它强调两个有限样本集之间的相似性,而不是向量之间的相似性。它被定义为集合的交集的大小,除以这些集合的并集的大小。

作者图片

例如,如果两个集合有两个共同的实体,并且总共有 7 个唯一的实体,那么相似性将是 2/7。

优势/优点:

  • Jaccard 相似性被用作评估深度学习中的图像分割模型的度量,其中模型必须对图像的每个像素进行分类。它被用来计算与地面事实相比,我们分割所需实体的准确程度。它可以类似地用于其他应用。

缺点:

  • Jaccard 的相似性高度依赖于数据的大小。大型数据集会显著影响相似性,因为在这种情况下,当交集保持较低时,并集可能会大幅增加。

python 中计算 Jaccard 相似性的函数:

import numpy as npdef jaccard_similarity(x,y):
    intersection = np.logical_and(x, y)
    union = np.logical_or(x, y)
    similarity = intersection.sum() / float(union.sum())
    return similarity#ORfrom sklearn.metrics import jaccard_scoresimilarity = jaccard_score(a, b)
print(similarity)

索伦森-戴斯指数

索伦森-戴斯指数与雅克卡相似性非常相似。索伦森-戴斯指数更直观一些,因为它可以被视为两个集合之间的重叠百分比,该值介于 0 和 1 之间:

作者图片

s rensen-Dice 指数也用作图像分割的度量。

结论

在这篇博客中,我们讨论了实践中广泛使用的各种距离度量。每种度量在某些情况下是有利的,而在另一些情况下是不利的。希望这篇博客能帮助你决定哪种度量更适合你的用例。

关注我们的 medium 了解更多此类内容。

成为 介质会员 解锁并阅读介质上的许多其他故事。

如何在 Altair 中整理条形图

原文:https://towardsdatascience.com/how-to-declutter-a-bar-chart-in-altair-e721f5c0ad87?source=collection_archive---------20-----------------------

数据可视化

关于如何通过流行的 Python 数据库提高条形图可读性的一些技巧和提示

照片由内森·杜姆劳在 Unsplash 上拍摄

最近我读了一本非常有趣的书,作者是 Jose Berengueres,书名为数据可视化简介&讲故事:数据科学家指南。在本书中,作者描述了许多从数据集中提取一个非常有趣的故事的技术。受这本书的启发,在本文中,我描述了一个在 Altair 中整理条形图并从表示的数据中提取一个故事的策略。

Altair 是一个流行的用于数据可视化的 Python 库。还有许多其他用于数据可视化的 Python 库,比如 Matplotlib 和 Seaborn。在本教程中,我将描述 Altair,留待将来分析其他数据 Viz 库时使用😃

在本教程中,我将演示如何在 Altair 中构建一个条形图,以及如何对其进行整理。

整理图表意味着删除所有不必要的东西,这些东西会分散读者获取正确信息的注意力。

作为一个用例,我利用了欧盟统计局提供的活产和粗出生率数据集。该数据集包含从 2009 年到 2020 年每个欧洲国家的活产婴儿数量。

目标是通过整理一个基本条形图,从数据中提取一些有意义的信息,重点是上一期(2019–2020)。

目录:

  • 加载并清理数据集
  • 条形图基础
  • 数据聚合
  • 最终清理

1 加载并清理数据集

我下载了。XSLX 文件和我通过read_excel()函数加载的熊猫数据帧:

import pandas as pddf = pd.read_excel('../sources/eu_live_births.xlsx', header=7, sheet_name="Sheet 1", na_values=':')
df.head(10)

作者图片

数据集非常脏,因此我通过只选择感兴趣的列来清理它。

df = df[['TIME', '2019', '2020']]
df.head()

作者图片

我将TIME列重命名为Country

df.rename(columns={'TIME' : 'Country'}, inplace=True)

然后我删除列 2020 和 2019 的NaN

df.dropna(subset=['2020'],inplace=True)
df.dropna(subset=['2019'],inplace=True)

我删除了前六行,它们是相对于整个欧洲的:

df = df.iloc[6:]

2 建立一个基本的条形图

现在我用 2020 年的数据构建了一个原始条形图:

import altair as alt
bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('2020:Q'),
    y=alt.Y('Country:N'),
)

作者图片

条形图很难阅读,因此我通过sort='-x'参数订购 DESC 棒材(使用x订购 ASC)。

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('2020:Q'),
    y=alt.Y('Country:N', sort='-x'),
)

作者图片

截断到前 10 个国家是对该条形图的唯一改进。然而,截断数据并不是理解现象的最佳解决方案。因此,我遵循另一种策略,即把国家聚合到宏观区域(或地区)。

3 数据汇总

我的原始数据集不包含任何聚合信息,因此我应该增加一个新列,包含每个国家的宏观区域。

我利用了从这个网站中提取的另一个数据集,它包含了每个国家及其地区和人口。

我加载数据集:

df_regions = pd.read_csv('../sources/eu_regions.csv', sep=';')

作者图片

我定义了一个函数,它接收一个国家作为输入,并返回它的子区域。该函数还管理异常。

def get_region(x):
    south_exceptions = ['Cyprus', 'Turkey']
    east_exceptions = ['Armenia', 'Azerbaijan']
    if x in south_exceptions:
        return 'Southern Europe'
    if x in east_exceptions:
        return 'Eastern Europe'
    row = df_regions[df_regions['Country'] == x]
    return row['Subregion'].iloc[0]

现在我丰富了我的原始数据集:

df['Region'] = df['Country'].apply(lambda x: get_region(x))

作者图片

现在,我构建聚合条形图。我利用transform_aggregate()函数来计算每个区域的平均值。我要感谢Soner y ldr RM,他让我在题为 3 个例子来展示 Python Altair 不仅仅是一个数据可视化库的文章中发现了transform_aggregate()函数。

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('avg_value:Q'),
    y=alt.Y('Region:N')
).**transform_aggregate**(
   avg_value = 'average(2020)', groupby = ['Region']
)

作者图片

在比较数量时,绝对值不是最佳解决方案。因此,我计算了 2020 年相对于 2019 年的活产减少/增加百分比:

import mathdf['2020_2019'] = -(df['2020'] - df['2019'])/df['2019']

我再次绘制条形图:

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('avg_value:Q'),
    y=alt.Y('Region:N')
).transform_aggregate(
   avg_value = 'average(2020_2019)', groupby = ['Region']
)

作者图片

图表很清楚:东欧经历了最大的百分比下降。这一方面可能是要讲的故事。

4 最终清理

现在,故事已经从数据中提取出来,我可以进一步整理图表。首先,我设置了图形标题:

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('avg_value:Q'),
    y=alt.Y('Region:N')
).transform_aggregate(
   avg_value = 'average(2020_2019)', groupby = ['Region']
)**.properties(
     height = 300
)**

作者图片

然后,我把标签贴在栅栏附近:

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('avg_value:Q'),
    y=alt.Y('Region:N')
).transform_aggregate(
   avg_value = 'average(2020_2019)', groupby = ['Region']
)**text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3,
    fontStyle='bold',
    fontSize=20
).encode(
    text=alt.Text('avg_value:Q', format=",.3f")**
)final_bar = (bars + text).properties(
     height = 300
)

作者图片

我移除轴:

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('avg_value:Q', **axis=None**),
    y=alt.Y('Region:N', **title=''**)
).transform_aggregate(
   avg_value = 'average(2020_2019)', groupby = ['Region']
)text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3,
    fontStyle='bold',
    fontSize=20
).encode(
    text=alt.Text('avg_value:Q', format=",.3f")
)final_bar = (bars + text).properties(
     height = 300
)
final_bar

作者图片

我加上标题:

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('avg_value:Q', axis=None),
    y=alt.Y('Region:N', title='')
).transform_aggregate(
   avg_value = 'average(2020_2019)', groupby = ['Region']
)text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3,
    fontStyle='bold',
    fontSize=20
).encode(
    text=alt.Text('avg_value:Q', format=",.3f"),

)final_bar = (bars + text).properties(
    height = 300,
    **title = 'Percentage Decrease in Live Births (2020-2019)'**
).**configure_title(
    fontSize=24
)**

作者图片

最后,我将重点介绍一个地区(南欧)的情况:

bars = alt.Chart(df).mark_bar().encode(
    x=alt.X('avg_value:Q', axis=None),
    y=alt.Y('Region:N', title=''),
    **color=alt.condition(alt.datum.Region == 'Southern Europe', alt.value('#8B0000'), alt.value('grey'))**
).transform_aggregate(
   avg_value = 'average(2020_2019)', groupby = ['Region']
)text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3,
    fontStyle='bold',
    fontSize=20
).encode(
    text=alt.Text('avg_value:Q', format=",.3f"),

)final_bar = (bars + text).properties(
    height = 300,
    title = 'Percentage Decrease in Live Births (2020-2019)'
).configure_title(
    fontSize=24
)

作者图片

摘要

在本文中,我举例说明了一个在 Altair 中整理条形图并使其可读性更好的实例。清理需要以下操作:

  • 为初步数据探索构建一个基本条形图
  • 聚合数据,如果聚合数据不可用,则搜索另一个数据集
  • 绘制聚合数据并提取故事
  • 通过删除轴、添加标题和突出显示文章,执行最终的整理。

如果你已经走到这一步来阅读,对我来说,今天已经有很多了。谢谢!你可以在本文中读到更多关于我的信息。

您可以从我的 Github 资源库下载本教程的完整代码。

相关文章

如何减少数字通信的碳足迹

原文:https://towardsdatascience.com/how-to-decrease-the-carbon-footprint-of-digital-communication-f3186673818c?source=collection_archive---------14-----------------------

蜜琪拉·威登霍夫在 Unsplash 上拍摄的照片

利用系统动力学评估电子邮件行为对温室气体排放的影响

介绍

如今,通过数字工具交流是非常正常的。我们有与朋友聊天的社交媒体平台,进行工作面试的视频电话服务,当然,还有传统的电子邮件。有人会认为通过电子邮件发送信息是使用实体信件的“绿色替代方案”。当然,我们会考虑从 A 地到 B 地运输过程中的二氧化碳排放,我们也知道造纸所需的砍伐树木对环境的负面影响。那么,就气候中立信息共享而言,电子邮件是圣杯吗?本文将通过回顾电子邮件的碳足迹,讨论电子邮件数据结构的重要性,并对电子邮件行为如何影响二氧化碳排放进行实验,来发现这个问题。这篇文章的新颖之处在于,我们将量化电子邮件行为对碳足迹的影响。为此,我们将应用模拟技术系统动力学。

电子邮件的碳足迹

电子邮件背景

首先,让我们简单地还原一下一封邮件到底是什么,它来自哪里。基本上,电子邮件是一种从发送者向接收者传输文本和其他数字数据的互联网服务。电子邮件应用程序由邮件服务器和面向客户端的邮件程序组成,前者负责指导邮件的传递和归档,后者用于创建、发送和阅读邮件。此外,电子邮件应用程序需要网络访问,并使用 SMTP、IMAP 或 pop 3【1】等传输协议。第一封电子邮件是在 1971 年发出的——比万维网的诞生早了将近 20 年。这种新信息技术的发明者是雷·汤姆林森,他当时在因特网的前身“阿帕网”上工作。在此之前,只能在最初发送电子邮件的同一台设备上阅读电子邮件。所以真正的成就是通过使用 FTP 协议经由网络的设备支配的消息传递。此外,他还引入了“@”符号来称呼信息接收者。

电子邮件导致的温室气体排放

已经有很多关于电子邮件中二氧化碳排放的文章,它们经常提到同一个来源:“香蕉有多糟糕?”:万物的碳足迹”,发表于 2010 年,作者是碳足迹研究者、万维网发明者蒂姆·伯纳斯·李的兄弟迈克·伯纳斯-李。该研究对电子邮件进行了分类,并对每封邮件的平均排放量进行了如下描述:

1)垃圾邮件:0.3 克二氧化碳

2)普通邮件:4g 二氧化碳

3)带附件的邮件:50g CO2

这些二氧化碳成本主要是由运行电子邮件设备所需的能源引起的,这些设备为网络基础设施供电,必须访问网络基础设施以传输电子邮件,以及存储内容的数据中心【3】。根据 Berners-Lee 的数据,我们还可以推断电子邮件的大小会影响二氧化碳的排放量:电子邮件越大,排放的二氧化碳就越多。2021 年,我们在全球每天收发的电子邮件数量约为 3200 亿封,预计这一数字还会进一步增加【4】。虽然垃圾邮件看起来不太受气候影响,但我们需要考虑与普通邮件相比垃圾邮件的数量。下面我们重点来揭晓几个国家每日发送邮件【6】的比例:

1)美国:96 亿封邮件(总量),86 亿封邮件(垃圾邮件)。

2)德国:90 亿封电子邮件(总量),79 亿封电子邮件(垃圾邮件)

3)中国:87 亿封电子邮件(总量),85 亿封电子邮件(垃圾邮件)

4)英国:86 亿封电子邮件(总量),77 亿封电子邮件(垃圾邮件)

5)俄罗斯联邦:84 亿封电子邮件(总计),81 亿封电子邮件(垃圾邮件)

由于这些国家和其他几个国家一样,是全球电子邮件统计的领导者,我们可以计算加权平均值来表示全球电子邮件流量中垃圾邮件的百分比:92%。进一步的研究得出的结果是,大约 24%的商务邮件有附件。

有了这些数据,让我们来推断一下全球电子邮件的年二氧化碳排放量(我们接受四舍五入):

  • 每年发送的电子邮件数量= 3200 亿 x 365 天= 117.8 万亿
  • 每年发送的垃圾邮件数量= 117.8 万亿* 0.92 = 108.4 万亿
  • 每年发送的常规电子邮件数量= 117.8 万亿* 0.08 * 0.76 = 7.2 万亿
  • 每年发送的带附件的电子邮件数量= 117.8 万亿* 0.08 * 0.24 = 2.3 万亿

使用这些结果,我们现在可以计算每种电子邮件类型的年度二氧化碳排放量,如下表所示:

每种电子邮件类型的电子邮件数量和二氧化碳排放量(图片由作者提供)

这导致二氧化碳总排放量约为 1.763 亿吨。相当庞大的数字——为了让它更有形,我们可以将其转化为 2120 万个家庭一年的能源消耗,甚至 21 万亿部智能手机充电;或者说得更具体一点:相当于汽车【8】行驶了 4423 亿英里,这甚至比全德承认的所有汽车一年的行驶里程还要多(3767 亿英里【9】)。然而,如果我们将其与 2020 年全球化石燃料的二氧化碳排放量(近 350 亿吨【10】)相比较,我们的电子邮件仅占温室气体排放量的 0.5%。尽管如此,我们可以清楚地声明,电子邮件并不像许多人预期的那样对气候没有影响。

大型电子邮件的驱动因素

在我们评估减少二氧化碳排放的手段之前,我们希望了解电子邮件的数据结构以及它通常包含哪些类型的信息。基本上,一封电子邮件由三部分组成:信封、标题和正文。信封封装了消息,并包含发送电子邮件所需的所有信息。典型的信息是目的地地址、电子邮件优先级及其安全级别。标头由与消息传输相关的字段组成,如“收件人”、“抄送”或“发件人”。每个头字段指的是指定字段名、冒号和值的一行 ASCII 文本。消息的主体部分包含发送者感兴趣的实际内容。它通常由文本、签名和附件【11】组成。考虑到这些因素,我们可以暗示正文是邮件大小的主要驱动因素。所以让我们仔细看看尸体。

电子邮件的数据格式

影响体型的不仅仅是纯粹的核心信息量。在专业邮件客户端应用程序中,您可以选择正文的格式,这也会影响大小,如下图所示(来自 MS Outlook 的截图)。

MS Outlook 中的格式选项(图片由作者提供)

为了评估数据格式对电子邮件大小的影响,我创建了一个样本邮件,其中包含称呼、问候、一些“lorem ipsum”内容和我当前公司的签名。然后,我改变了一些文字格式,例如粗体和彩色。最后,我将邮件作为文件保存到我的电脑上,但不是一次而是多次以不同的格式保存。首先,我使用了“HTML”格式,这需要 39 KB。然后,我使用了“富文本”格式,需要 66.5 KB。最后,我使用了“纯文本”格式,这需要 19.5 KB。因此,我们可以得出结论,我们有三种不同的消息大小,尽管正文内容完全相同(除了格式,纯文本丢失了)。此外,如果我删除我的签名,我可以进一步减少电子邮件的大小。当然,我们谈论的是大数据时代的千字节。但是当我们将这些结果放在一起时,我们可以看到格式(和签名使用)之间的百分比差异非常显著(见下表)。因此,即使我们不减少电子邮件的数量,我们也可以通过减少网络流量和存储消耗来影响全球二氧化碳排放量,同时保持共享相同的信息。当然,这种论证建立在电子邮件的成熟度是 HTML 格式的假设之上,这是我观察到的,尤其是在商业环境中,但在私人领域接收时事通讯或广告时也是如此。不幸的是,我找不到一个可靠的研究来量化使用电子邮件格式的百分比。

邮件格式对邮件大小的影响(图片由作者提供)

电子邮件附件

大邮件的另一个驱动因素是附件的使用。在早期,只需通过电子邮件发送文件副本,就可以与收件人共享文档,这非常有用。一方面,这是一种让公司以外的人访问该文件的简单方法。另一方面,简单地拖放副本也比发送指向内部文件共享的链接并验证此人是否有访问权限更方便(这通常需要管理文件共享的 it 专家的帮助)。如今,共享集中存储的文件变得更加容易,甚至与外部团体也是如此。主要基于云的专业办公软件套件,例如微软 365【12】和谷歌工作空间【13】,提供了自己轻松管理文件访问的功能,甚至将访问权限授予外部合作伙伴。有了这些功能,实际上不再需要将文件副本作为电子邮件附件发送。此外,如果发送的是副本而不是原始文件的链接,也会有一些缺点。例如,如果您在发送电子邮件后发现文档中有打字错误或更大的问题,您仍有机会更新原始文档,收件人将通过链接访问更新后的原始文件。但是,如果你发送了文件的副本,你就必须再次发送修改过的文件,并指出你的错误。共享链接而不是副本的另一个好处是能够协作处理同一个文件。此外,后台的文档管理系统通常关心版本控制。因此,如果任何贡献者犯了错误,您可以简单地恢复以前的版本。这种协作方式还消除了发送和存储同一文件的多个版本的需要,如 File_V1、File_V1.9、File_final_REALLY_2 等

电子邮件行为对碳足迹的影响

我们已经回顾了电子邮件的二氧化碳排放量,并讨论了导致大邮件的驱动因素。在本节中,我们想评估如果我们改变这些驱动因素,二氧化碳排放量会发生什么变化。为此,我们将应用系统动力学(SD)作为模拟技术,使用 AnyLogic 作为建模软件。这一选择的主要原因是,当在单代理活动不相关的更大规模上处理连续效果流时,SD 是非常强大的。SD 的数学基础是微积分。

实验描述

到目前为止,我们还没有弄清楚每 KB 电子邮件的二氧化碳排放量,因为 Berners-Lee 的研究只是定性地区分了电子邮件类型的排放量。一篇关于上网时二氧化碳排放的文章估计,一封大小为 1 MB 的电子邮件在其整个生命周期内会排放 20g 的二氧化碳【14】。这位匿名作者指出,每个用户一年 20 封这样大小的电子邮件产生的二氧化碳排放量相当于一辆行驶 1000 公里的汽车。如果我把这个值校准到我之前的 HTML 电子邮件示例中,它将排放 0.6 克 CO2。一封基于伯纳斯-李的排放 4g 二氧化碳的“普通”电子邮件大小为 200 KB。此外,我们可以推断,一封普通的带有附件的电子邮件的大小为 2.5 MB,才能排放 50g CO2。这些数字不影响与格式相关的尺寸采用,但影响与签名相关的尺寸采用。因此,如果我们接受 200 KB 作为标准电子邮件大小,那么删除签名只会产生-6.25%的影响。在尺寸上。因此,我们将在模拟中使用这些数据。

让我们从基于每日发送邮件的基本费率开始,总结在下表中。

每日邮件费率(图片由作者提供)

下图展示了我为进行实验而开发的 SD 模型。它区分电子邮件类型(垃圾邮件、普通邮件、附件)以及普通电子邮件的格式。股票变量计算一段时间内电子邮件的数量,而黄色变量计算每种电子邮件(子)类型的二氧化碳排放量。红色变量将单个排放量相加,得出一年内电子邮件的总二氧化碳排放量。

系统动力学模型(图片由作者提供)

接下来,我们想进行一些实验,这些实验涉及以下问题:

1)如果我们经常从 HTML 邮件中删除我们的签名会怎么样?

2)如果我们少发带签名的 HTML 邮件,多发纯文本邮件会怎么样?

3)如果我们在电子邮件中发送更多的文件链接而不是附件,会怎么样?

4)如果我们减少我们发送的电子邮件的收件人数量会怎么样?

不幸的是,我找不到一份说明有多个收件人的电子邮件比例的研究。因此,我需要做一些假设。让我们假设,特别是在商业环境中,我们经常向多个收件人发送邮件。至少我经历过,人们经常把他们的经理或其他感兴趣的人放在 CC,而不期望他们有任何行动。所以,这样的邮件对他们来说是一种“零信息”。而且“收件人”的选择往往没有意义。取而代之的是,现有的邮件列表被重新用来传播只影响部分收件人的信息。所以我想构建的是下面的情况:

  • 有一定比例的全球电子邮件流量是由同一封电子邮件发送给多个收件人造成的。
  • 通过限制电子邮件收件人,有可能降低这一比例。

在我的实验中,我假设 30%的电子邮件流量是由这种效应引起的。此百分比适用于普通电子邮件以及带附件的电子邮件。然后,我将通过场景 1(节省 10%的电子邮件)和场景 2(仅通过减少不相关的电子邮件收件人来节省 30%的电子邮件)来研究电子邮件流量的减少。

结果

下图显示了单个实验的结果,并设置了它们之间的关系。蓝线指的是原始的电子邮件产品,当然,在图表的顶部。我们清楚地看到,附件的减少(橙色线)对二氧化碳排放的影响最大。

电子邮件行为对全球二氧化碳排放量的影响(百万吨)

现在,让我们关注我们的潜在杠杆对全球二氧化碳排放的特殊影响。我们需要考虑之前计算的年度 CO2 排放量(1.76 亿吨)与 SD 模拟(1.69 亿吨)不同。这是因为我估计“常规”邮件 80%是 HTML,20%是纯文本。由于纯文本邮件排放的二氧化碳较少,模拟的年总排放量低于之前简单计算的结果。表格显示,将带有附件的电子邮件数量减半,用带有链接的 HTML 电子邮件取而代之,可以减少 30%的二氧化碳排放量。电子邮件收件人减少 30%将节省 6.9%的二氧化碳成本,而减少 10%将节省 2%。使用纯文本而不是 HTML 可以减少 5%的温室气体排放。签名的去除具有最低的影响,至少减少 0.4%的 CO2 排放。

测试杠杆的结果比较(图片由作者提供)

幸运的是,我们还可以计算电子邮件导致的二氧化碳排放的绝对减少量,这也显示在表格中。同样,为了对这些数字有更好的感觉,让我们搜索一下日常生活中我们都知道的对应词:

  • 减少带有附件的电子邮件将会减少相当于1000 万辆汽车 驾驶一年的二氧化碳排放量。
  • 当我们只减少 10%的接收者时,我们将节省相当于4120 亿部智能手机充电的温室气体排放量。
  • 即使是最后一个杠杆,我们减少 50%的电子邮件签名,也会产生积极的环境影响,相当于 148 个风力涡轮机运行一整年。
  • 如果我们采取所有这些措施,我们将减少二氧化碳排放量,相当于 100 万辆油罐车的汽油排放量。

正如我们之前指出的,全球电子邮件流量预计将进一步增加,百分比减少将在未来节省更多的绝对二氧化碳排放量。

结论

我们已经看到,电子邮件并不像预期的那样对气候没有影响。但相反,电子邮件数据结构中不必要的开销产生的数字垃圾会排放大量的二氧化碳。有许多杠杆可以显著影响排放,尤其是使用连杆代替附件。但其他一些更琐碎的行为,比如避免巨大的电子邮件签名,也会对温室气体排放产生显著影响。当然还有更多可能的手段,我们在本文中没有涉及,比如删除对商业或私人目的不再重要的旧邮件。关键信息是,不花钱就能节省二氧化碳排放相当容易——只要调整我们人类的电子邮件行为就能实现。可以进行进一步的研究,以评估应用我们在本文中分析的杠杆的系统措施的技术发展或组织。

【1】https://wirtschaftslexikon . gabler . de/definition/e-mail-33576

【2】https://www . FAZ . net/aktuell/technik-motor/digital/ray-Tomlinson-der-er finder-der-email-ist-tot-14109850 . html

【3】https://www . BBC . com/future/article/2020 03 05-why-your-internet-habits-is-as-clean-as-you-think

【4】https://de . statista . com/statistik/daten/studie/252278/umfrage/prognose-zur-zahl-der-tae glich-versendeter-emails-weltweit/

【5】https://www . statista . com/statistics/1270488/spam-emails-sent-daily-by-country/

【6】https://www . statista . com/statistics/1270459/daily-emails-sent-by-country/

【7】https://medium . datadriveninvestor . com/email-attachments-generate-near-6-000-needly-and-unsecure-files-per-employee-per-year-year-a 38385 bec 7 a 4

【8】https://www . EPA . gov/energy/green-gas-equivalences-calculator

【9】https://www . kba . DE/DE/Statistik/Kraftverkehr/verkehr 千米/vk _ inlaenderfahrleistung/vk _ inlaenderfahrleistung _ node . html;jsessionid = 3680 DFA 2 faf 0d 0754 d8e 522 Fe 14 cc1 e . live 21321

【10】https://ourworldindata.org/co2-emissions

【11】https://www.geeksforgeeks.org/e-mail-format/

【12】https://365 tips . be/en/share-files-in-office-365-best-practice/

【13】https://support.google.com/a/users/answer/9296687?hl=en

【14】https://www . ener guide . be/en/questions-answers/do-I-emit-CO2-when-I-surf-the-internet/69/

如何用代码定义和部署基础设施

原文:https://towardsdatascience.com/how-to-define-and-deploy-infrastructure-with-code-c5af4bddc566?source=collection_archive---------37-----------------------

Pulumi 是 Terraform 和 CloudFormation 的替代产品,它允许您使用自己喜欢的编码语言定义 AWS(以及其他服务,如 Azure 和 GCP)服务。

探索 Pulumi CLI

普鲁米简介

Pulumi 允许您通过结合 IaaS(基础设施即服务)的安全性可靠性以及您所熟悉的编程语言的能力来构建云应用和基础设施。您可以使用自己选择的编程语言来定义基础设施,使用循环、条件和函数,并在不同的项目中重用这些设计模式,而不是使用 JSON、YAML 或定制的 IaaS 语言来定义基础设施。例如,下面是我们如何使用 Terraform HashiCorp 配置语言创建一个带有已分配安全组的 EC2 实例:

Terraform:使用分配的安全组创建 Ubuntu 18.04 实例

相比之下,下面是我们如何使用 Pulumi JavaScript AWS API 完成类似的任务:

Pulumi (AWS JS API):使用分配的安全组创建一个 Ubuntu 18.04 实例

如您所见,使用 Terraform 和 Pulumi 创建资源的总体逻辑是相似的。您可以过滤正确的 Amazon 机器映像,定义符合您的用例的定制安全组,将标记应用到您的资源,并基于这些 ami 和安全组定义服务器。主要区别在于创建资源的语言,对于您的用例来说,最好的工具可能取决于您对 HashiCorp 配置语言JSON (Terraform)以及更多通用编码语言的熟悉程度,如 PythonJavaScriptGoC# (Pulumi)。

问题的介绍

作为一名软件工程顾问,很多时候我需要为公司部署一次性项目(供内部或外部使用)。在这些部署过程中,我通常会重复相同的过程:

  1. 创建一个临时服务器,
  2. 创建一个生产服务器,
  3. 在两台服务器上安装必要的依赖项,
  4. 允许准备生产服务器相互连接,
  5. 并为部署配置生产环境

以前,我会用 AWS 命令行或 AWS EC2 web 界面逐一完成这些步骤。但是,在我第二次手动完成这些任务后,我决定投入时间学习云形成地形普鲁米。在意识到 Pulumi 提供了最少的入门障碍(因为与 JSON 和 YAML 相比,我更熟悉 JavaScript 和 Python)之后,我决定使用它来自动化这些重复的部署过程。

我如何使用 Pulumi 来解决这些问题

在阅读了 pulumi 的 AWS 文档和一些教程之后,我安装了 Pulumi 命令行工具:

**brew install pulumi** # mac

然后为这个项目创建了一个目录,换成它,并运行:

**pulumi new aws-javascript** 
# aws tells pulumi we want to use the AWS Pulumi API
# javascript tells pulumi we want to use the JS AWS API

最后,编写代码前的最后一步是确保设置了正确的 AWS 概要文件。要配置 AWS 概要文件,请运行:

aws configure --profile "[name for profile]"

然后,输入正确的访问密钥 ID秘密访问密钥并运行:

aws use [name for profile]

为项目选择正确的 AWS 概要文件。从这里,打开 index.js 并开始定义您的基础设施。对于我的具体用例,我想创建两个服务器,一个用于试运行,另一个用于生产。我还希望它们存在于同一个 VPC 中,具有相同的安全组。为了实现这一愿景,我将代码分成了四个部分:

1.从 pulumi 访问配置变量

类似于为项目创建环境变量, pulumi 配置变量允许您定义可以在 pulumi 脚本中访问的特定于项目的值。对于我的具体用例,我想对 PEM 文件的名称保密,所以我使用以下命令创建了一个 keyName 配置变量:

**pulumi config set keyName [name_of_PEM_file]**

有了这个配置变量集,我就可以在我的 pulumi 脚本中访问分配给 keyName 的值,使用:

**const pulumi = require("@pulumi/pulumi");
const config = new pulumi.Config();
const keyName = config.get("keyName");**

2.过滤并检索正确的 AMI ID

在这之后,我需要过滤 Amazon 机器映像注册表,找到我想要创建的服务器的 AMI 名称所有者。对于这个项目,鉴于我想使用 Ubuntu 18.04,我采取了以下步骤:

  • 导航到 AWS EC2 主页,点击实例,然后点击启动实例

AWS EC2 例程页

  • 滚动到您想要创建的实例,复制 AMI ID

Ubuntu 18.04 的 AMI ID

  • 导航回 EC2 仪表板主页面,点击左侧边栏图片部分下的 AMIs

  • 在搜索栏中,粘贴您复制的 AMI ID ,并记下 AMI NameOwner 的值。您将需要这两个值来过滤 pulumi 中的正确 AMI。

有了 AMI 名称AMI 所有者之后,您可以将这两个值输入到您的脚本中,如下所示:

过滤正确的 AMI: Ubuntu 18.04

3.定义服务器的安全组,包括入站和出站规则

在正确筛选出正确的 AMI ID 后,您可以为您的服务器定义安全组。以下脚本提供了一个简单的例子:

在第一行,我们将我们的安全组命名为 3dvation-grp 。然后,我们定义入站(入口)和出站(出口)规则。在第 3–9 行,我们提供了入站规则的描述,定义了其协议,提供了一系列端口,最后定义了允许该入站规则的 IP 地址。然后,在第 12–27 行,我们定义了两个出站规则:

  1. 允许临时服务器 ssh 到生产服务器的出站规则(通过端口 22 ssh)
  2. 允许克隆 GitHub 库的出站规则(端口 43 上的 HTTPS,CIDR 块基于来自api.github.com/meta的 git 结果)。

总之,这些入站和出站规则为我们的两个实例提供了这个特定用例所需的所有功能。

4.定义和创建试运行和生产 EC2 实例

最后,在定义了安全组之后,我们使用以下代码创建了临时服务器和生产服务器:

在第 2 行和第 9 行,我们将**serverSize**("*T2 . micro "*)常量赋给 **instanceType** 键。在第 3 行和第 10 行,我们将新创建的安全组的 ID 分配给两台服务器(确保它们存在于同一个组中)。然后,在第 4 行和第 11 行,我们定义了可以用来访问每个服务器的 **PEM** 文件的名称,在第 5 行和第 12 行,我们分配了应该用来创建每个服务器的 AMI 的 ID。

完成这些步骤后,您可以运行:

pulumi up

部署更改并创建临时服务器和生产服务器。一旦这个过程成功完成,您就可以登录 AWS 并看到您的两个新服务器!

审查和成果

在本文中,我们了解了 Pulumi 及其相对于 AWS CloudFormation 和 Terraform 等其他 IaaS 提供商的一些优势。我们经历了一个实际的用例,在这个用例中,我们为两台服务器创建了一个 VPC,定义了安全组的入站和出站规则,然后创建了试运行和生产 EC2 实例。

对于更复杂的基础设施来说,Pulumi 变得更加强大,我鼓励您多阅读他们的文档,如果您有任何问题,请联系我们!

电子邮件:danielmurph8@gmail.com

领英:【https://www.linkedin.com/in/dmurphy1217/

如何删除熊猫中的一个栏目

原文:https://towardsdatascience.com/how-to-delete-a-column-in-pandas-cc4120dbfc25?source=collection_archive---------14-----------------------

从 pandas 数据框架中删除列

照片由夏羽·亚伊奇在 Unsplash 上拍摄

介绍

从 pandas 数据帧中删除列是一项相当常见的任务。在今天的简短指南中,我们将探讨如何通过名称删除特定的列。更具体地说,我们将讨论如何使用以下命令删除列:

  • del命令
  • drop()方法
  • pop()

此外,我们将讨论如何通过指定索引而不是名称来删除列。

首先,让我们创建一个示例 pandas 数据框架,我们将在本指南中使用它来演示一些概念。

import pandas as pd df = pd.DataFrame({
    'colA':[1, 2, 3], 
    'colB': ['a', 'b', 'c'],
    'colC': [True, False, False],
})print(df)#    colA colB   colC
# 0     1    a   True
# 1     2    b  False
# 2     3    c  False

使用 del 删除列

如果您想要删除特定的列,您的第一个选项是调用如下所示的del:

**del df['colC']**print(df)#    colA colB
# 0     1    a
# 1     2    b
# 2     3    c

只有当您希望删除一列时,这种方法才有效。如果您需要一次删除多个列,请阅读以下部分。

另外,需要注意的是del df.colCT16 不能用!语法必须与上面示例中显示的语法相同。

使用删除多个列。丢弃()

[pandas.DataFrame.drop](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html)方法用于从行或列中删除指定的标签。

为了删除列,您需要指定如下所示的axis=1:

**df = df.drop(['colA', 'colC'], axis=1)**print(df)#   colB
# 0    a
# 1    b
# 2    c

注意,如果您想删除列,而不必将结果重新分配给df,您需要做的就是将inplace指定给True:

**df.drop(['colA', 'colC'], axis=1, inplace=True)**

使用删除列。流行()

另一个选项是[pandas.DataFrame.pop](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pop.html),它返回被删除的列,并最终将其从原始数据帧中删除。

**df.pop('colB')**

将返回我们希望从 DataFrame 中删除的列colB:

0    a
1    b
2    c

我们可以验证该列确实已经从原始框架中删除:

print(df) colA   colC
0     1   True
1     2  False
2     3  False

按索引删除列

在上面的小节中,我们探讨了如何通过名称删除特定的列。但是,您可能还需要通过引用特定列的索引来删除该列。

为此,可以使用[pandas.DataFrame.drop](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html)方法。假设我们想要删除索引分别为02的列colAcolC,我们可以这样做,如下所示:

**df.drop(df.columns[[0, 2]], axis=1, inplace=True)**

最后的想法

在今天的简短指南中,我们探讨了如何通过名称或索引以各种方式删除 pandas 数据帧中的特定列。

您可能也对阅读如何重命名熊猫数据帧的列感兴趣。如果是这样,请不要错过下面的文章。

此外,下面的文章讨论了如何根据特定条件执行正确的行选择。

如何在 R 中删除你保存的工作空间

原文:https://towardsdatascience.com/how-to-delete-your-saved-workspace-in-r-699c45c3304a?source=collection_archive---------27-----------------------

清理你无法摆脱的工作空间

当您退出 RStudio 时,您会看到一个弹出窗口,询问“将工作区图像保存到~/。RData?”如果你不确定,你可能会选择保存。毕竟,它的默认。另外,储蓄是好事。对吗?

退出 R 会话弹出窗口。图片作者。

嗯……这要看情况。下次加载 RStudio 时,工作区(全局环境)中的所有内容都将保持原样。如果将数据加载到 R 中花费了很长时间,那么这就太棒了。不用再经历那个繁琐的过程了!唷!

但是如果,相反,你有一堆你不想再看到的无用的垃圾呢?你可能会想,好吧,我就清空我的工作空间,继续工作。只是这一次,在我 R 会话结束的时候,我会点击 不保存 。没什么大不了的!

下一次你加载 RStudio 时,那个你以为已经删除的讨厌的工作区将会恢复到以前的辉煌。你再试试——清除,退出,不保存,加载。*等等,什么???*这次- rm(list = ls()),退出,不保存,加载。但是……为什么?!

JESHOOTS.COM在 Unsplash 上拍照。

通过保存工作空间,R 将全局环境保存为。RData 文件。每次启动 R 时,这些文件都用来恢复您的工作区。删除您的工作环境实际上并不会删除。RData 文件-它们还在那里。这就是为什么你可以清空你的工作空间,以为它永远消失了,却发现它在你下次启动 r 时又弹出来了。

清理你无法摆脱的工作空间

如果你发现自己有这个问题,不要担心!这里有一个解决方案。事实上,不止一个!快速而肮脏的选择是清空你的工作空间,退出,然后选择保存。这一次,R 将保存一个空的工作区,下次重启 R 时将重新加载它。

第二个选项是运行:unlink(。RData”)。这实际上不会删除您的环境,但会删除保存的。RData 文件。如果没有保存的文件,启动时就没有任何东西可以加载。只要确保不要再点击保存,否则你就只能写新的了。RData 文件,您必须再次删除它们。

调整您的设置

如果您认为自己近期内不需要保存工作区,那么您可能希望 R 停止询问这个问题。这可以通过全局选项菜单的常规选项卡进行更改。要导航到全局选项菜单,从 RStudio 的菜单栏中选择工具(位于最顶端)。全局选项可以在工具菜单的最底部找到。

查找全局选项菜单。图片作者。

点击全局选项后,会出现一个选项框。在常规选项卡下,您应该会看到一个工作区部分。如果你有。RData 文件,但不希望每次启动 R 时都加载它们,可以取消选中“Restore”旁边的复选框。启动时将数据存入工作区。或者,如果您不想在关闭 RStudio 时保存您的工作空间,请从“保存工作空间至”旁边的下拉菜单中选择从不。出口处的 RData。既然 R 知道了你的偏好,它就不会再问你是否愿意保存了!

选项框。图片作者。

有了这些解决方案,希望您保存的工作空间将一去不复返。再见永不,工作区!👋

原载于 2021 年 6 月 17 日https://thatdarndata.com

如何交付成功的数据演示

原文:https://towardsdatascience.com/how-to-deliver-a-successful-data-presentation-bfd23684197d?source=collection_archive---------48-----------------------

我从向高层领导做报告中学到的经验

图片由皮克斯拜的 Gerd Altmann 提供

在您的数据分析职业生涯中,可能会有这样一个时刻,您需要向高层领导展示您的数据结果。这将是一个关键的时刻,因为一个成功的演示会给公司内参与批准你的薪酬和晋升的人留下永久的印象。当我成为一名数据科学家,然后成为一名数据分析师时,我不得不从反复试验中学习如何有效地展示。幸运的是,我的演示从来不是一场灾难,但如果我知道我现在在做什么,它会更好。今天,我想和大家分享我的建议,告诉大家如何进行成功的数据演示,以提高你在高层领导中的知名度。

提供解决问题的方法

围绕演示主题研究高层领导提到的问题,并尝试找到提供解决方案的数据见解。高管们一直在努力提高业务绩效,任何能提供问题解决方案的人都会引起他们的注意。

例如,您是一名数据分析师,为一家电子商务公司的营销提供支持。年复一年,销售额一直在下降,你被要求调查原因,并将你的发现提交给高层领导。你会发现,将网站访客按渠道分类后,销售额下降是因为有机搜索占了总销售额的 50%。经过进一步的调查,访客下降对应的网站变化发生在同一天。一旦网站修好,销售额应该会再次上升。找到原因并为销售等重要 KPI 提供解决方案,会让高层领导注意到你,并在下次谈话中提到你的名字时在他们的脑海中留下好印象。

将影响转化为收入

讨论收入时,高管们会注意到。即使 KPI 提高了 1%,也可能转化为数百万美元。如果百分比变化不理想,计算您提出的任何建议对收入的影响。

例如,您是一名移动应用程序的产品分析师,被要求向高层领导提交价格上涨测试的结果。最有可能的是,你会报告相对于控制的转化率较低,因为每当你提高价格,转化率下降,因为人们不太可能为同样的产品支付更多。给高层领导的演示应该少关注价格的下降,多关注价格上涨带来的销售增量。如果转换率和增量销售都是负数,那么就没有什么好故事可讲,建议应该是保持在当前价位。然而,如果转换率下降,但销售额增加,那么就应该采用新的价格。不管测试结果如何,显示您考虑了多个 KPI 来提出建议,向高层领导表明您从不同的角度评估了结果。

提供建议

优秀的数据分析师提供可操作的见解来推动业务绩效。即使没有问题,您也可以提供下一步建议来改进业务 KPI。

在价格测试的例子中,让我们假设提高价格不会导致更高的转化率或增加销售额。如果目标是增加销售,有很多不需要提高价格的方法。你可以建议改变应用程序,以提高转化率或测试限时折扣优惠。领导层喜欢有能改善业务的想法的人,展示这种主动性表明了你帮助业务增长的热情。

进行一次练习

如果可能的话,先和你的利益相关者进行一次练习,以获得反馈。利益相关者提出的问题通常也是高层领导提出的问题,这将让你有机会在实际演示之前研究答案。如果不可能进行一次练习,让利益相关者回顾一下内容,确认你要表达的观点是清楚的。在向 CDO(首席数字官)做演示之前,除了练习之外,我还开会审查了内容。最终的结果是一个很棒的演示,如果没有反馈,我自己是无法完成的。

表现出自信

向高层领导陈述可能会让你恐慌。不幸的是,除了经常练习演讲,我没有找到克服紧张的方法。我越了解我的演示材料,我就越容易向他人演示。如果你紧张,这不是世界末日。向高层领导提供有价值的、可操作的见解有助于他们对你有一个积极的看法。

知道如何有效地呈现数据结果是数据分析角色的一项重要技能。我花了很多尝试和错误来学习如何做一个伟大的演讲,但是有了这些建议,我希望你能尽快成功。

你可能也会喜欢…

如何交付人工智能管道

原文:https://towardsdatascience.com/how-to-deliver-an-ai-pipeline-9c6fbfc29d3b?source=collection_archive---------18-----------------------

实践教程

一步一步,从想法到生产

通往完整数据管道的道路漫长而曲折。由罗迪翁·库察耶夫在 Unsplash 上拍摄的照片

人工智能市场正处于成长期。在建模和工程中,技术栈正在成熟,过程正在成形。这确实是一个成为数据科学家/工程师的美好时代:乘着早期的浪潮,帮助创建其他人将在未来几十年遵循的模式。每个人都提出了自己的解决方案来部署他们的 ML 特性。

本文旨在通过一个直接来自烤箱的真实示例,对我们的项目流程进行演练,重点关注数据科学/工程流程。我们希望你能挑选一些我们使用的技术,并将它们整合到你自己的队伍中!

蓝图

在进去之前,我们需要讨论一下过程本身。人工智能项目的实施涉及三个主要的能力层次:数据科学数据工程前端

我们人工智能特征过程的蓝图。图片作者。

一切从一个想法开始。公司里的某个人有了灵感,这种火花被写进了一份文件,用通俗易懂的语言重新开始。数据科学团队将该文档编译成一个摘要,展示我们如何解决该问题并执行它。我们的前端团队可以开始创建实体模型,让我们的利益相关者体验一下这个抽象的特性会是什么样子。这种快捷方式使得证明特性的影响更加容易。

该摘要然后被用作临时分析的基础,自由式建模以测试和证明该抽象想法有价值。Jupyter 和 Excel 表格比比皆是。在这个阶段,没有什么是一成不变的,也没有什么是合理设计的,因为在处理 ML 时,自由是创新的关键。

如果临时分析成功,我们将继续进行概念验证阶段。这是将前一阶段找到的解决方案工程化的第一步:代码将尽可能接近具有适当封装和质量的产品代码。它可以被认为是我们管道内模型的试驾,调整后视镜和座椅角度。与此同时,我们的数据工程团队开始绘制它在我们当前架构中的样子,计划 PoC 如何进入我们的管道。

概念证明经过适当的测试和评估后,我们让数据科学团队去从事其他项目。现在,数据工程将开始将 PoC 的集成到管道,前端团队可以使用 PoC 的输出来创建真实数据原型

两个团队都准备好了,是时候将所有东西整合到最终产品中了。我们用生产原型测试它,然后通过淘汰旧版本来确认它。瞧。

现在,让我们看看这个过程是如何在一个新的命名实体识别特性上工作的!

这个想法

我们仪表板的一个基本块是方面分析。我们从非结构化的用户生成的文本内容中提取代表产品或服务属性的实体,从句子中提取它们的相对情感,并使用我们的定制分类法对它们进行汇总。

方面术语“崩溃”和“视频”被提取为方面,然后被分类为负面的。与问题相关的术语通常是负面的。图片作者。

这种类型的分析是非常细粒度的:方面通常由 1-3 个标记组成。我们没有得到问题的全部背景:我们提取了问题的核心(崩溃)和根源(视频)。

所以,解决的办法是立刻识别和提取整个东西。

提取整个句子。图片作者。

有了这个想法,我们创建了一个抽象,它将列出我们可以选择的可能路径。我们当前的抽象写作策略使用 RFC 结构作为指导我们开发过程的一种方式。如果你熟悉史诗/故事/任务抽象,你可以把它比作一部史诗,增加详细的描述和冗长的解释。

我们一个 RFC 的标题。摘要由多个队友审阅,人们在文本中进行评论,内容随着异步输入而不断发展。图片作者。

https://github.com/rust-lang/rfcs https://www.infoq.com/news/2017/12/react-rfc-process/

我们的 RFC 有一个特定的结构:

  • 待解决问题的背景
  • 问题定义;
  • 提出的解决方案以及架构/建模建议**;**
  • 所解决问题的成本和收益
  • 成功的定义描述 RFC 实现结束时产生的工件。

这个特定想法的(非常)简短的 RFC 如下所示:

背景:方面太细,不能识别关于特定问题的上下文短语。

目标:从句子中提取问题(代表用户在使用产品时遇到的问题的多标记字符串)。

可能的解决方案:自定义 NER,使用 spacy | Tensorflow | PyTorch、gensim Phraser,后跟分类器、语法分析,找到问题的根源。

**成本和收益:**一个月用于模型开发,另一个月用于管道集成和原型开发。两名数据科学家,一名工程师和一名前端开发人员。

成功的定义:将提取器集成到管道中,分析结果显示在最终产品中。

验证标准

有了目标,我们开始计划如何实现。在项目进行到一半时,我们如何知道我们“足够好”呢?或者“到达那里”实际上是否可行?像这样的探索性任务可能需要几个月的来回互动,测试新的想法,提出新的问题和新的解决方案…突然你陷入了一个循环,甚至忘记了项目的意义。

设定一个停止探索问题并继续前进的期限是必要的。在这个想法探索阶段之后,我们应该很好地掌握我们需要考虑的变量。我们需要有标签的数据吗?多少钱?有我们可以使用的实现模型吗?类似项目的绩效如何?

验证阶段是 RFC 创建过程的一部分:在进入 ML 模型的本质之前,作者必须考虑项目的截止日期完成的定义。一个简单的时间盒将帮助团队相应地安排任务,交付的定义将指导您的工作。

我们在这里做的是以产品为中心的交付:我们对成功的定义是将问题提取器集成到我们当前的管道中,并在最终产品中显示分析结果。没有准确性,没有度量,没有绒毛。这意味着我们对架构本身的创建感兴趣,而不是增强一个模型。

下面有一个关于数据项目管理的有趣阅读链接。最佳 Scrum 实践部分有一些关于项目边界的信息。

https://neptune.ai/blog/data-science-project-management-in-2021-the-new-guide-for-ml-teams

即席建模

自由式建模:只是一个(关键)板和一个梦想。照片由雅各布·本辛格在 Unsplash 上拍摄

RFC 获得批准,我们开始开发土地。第一站是特别建模:在我们通常的架构之外的建模工作,可以使用任何可用的工具来快速交付明显的结果。对于一些公司来说,这是通常的数据科学工作的范围,由软件和数据工程师来实现。

我们采用 OSEMN 框架来管理流程的这一步:获取、清理、探索、建模、解释。此即席分析的输出将是一个问题提取模型,其中包含一份关于提高其准确性和召回率的可能方法的报告。

</5-steps-of-a-data-science-project-lifecycle-26c50372b492>

让我们在项目的背景下讨论这些阶段。

  • **获取:**我们的输入是用户生成的数据。由于我们已经有了一个电子商务用户评论的数据库,我们不需要原始信息来源…但我们需要手动标记句子以找到问题子串。为此,我们采用Prodigy作为我们的标注工具,并定义一组评论,这些评论将被注释以生成我们的训练数据集。

Prodigy 命名实体注释器。注意实体之间的重叠:一个问题可能涉及一个产品特性。图片作者。

  • 擦洗:因为我们的数据在注释之前已经被适当地擦洗了,所以我们不需要在这里做太多。我们可以将数据集一分为二,通过类型来分隔实体,或者使用某种相似性度量来丢弃过于相似的句子。
  • 探索:我们正在钻研数据,手动分析带注释的句子以及自动化的 EDA。在我们的数据集中,最简单(也是最重要)的度量是实体类型的平均标记数:这个度量显示了实体的语义复杂性。这将是我们任务难度的代理标准。

我们选择的探索性指标。请注意,发行的令牌数很高,而零售商和个人实体的发生率很低。图片作者。

只需将您的数据输入训练脚本,并更改配置来训练自定义空间管道。来源。

**https://www.machinelearningplus.com/nlp/training-custom-ner-model-in-spacy/

模型分析

咻。经过所有这些步骤,我们终于有了一个工作的 NER 模型。现在,让我们看看指标!

哦…有点低,不是吗?0.15 F1——分数只是让人心灰意冷。图片作者。

指标非常低。分数与每种类型的实体的平均令牌数负相关:问题和正面体验(POS_EXP)是具有最高令牌数和最低分数的实体。

但是我们从问题提取结果中看到了有趣的词云。很明显某些东西被提取出来了,但是我们的度量标准没有察觉到那个价值。

发布笔记本电脑评论词云。这里有很多有用的信息:重启、无响应、关机。

问题提取器的问题不在模型,而在评估:正常的评分方法依赖于严格匹配,其中提取的实体必须与注释的实体相同。这意味着以下提取将被视为完全失败:

句子:笔记本电脑开始不断重启。
注释:开始不断重启
提取:不断重启

粒子“不断重启”是问题的核心。即使我们没有实体的完整上下文,我们仍然可以挽救它!我们知道许多评论都引用了关键词“重启”,帮助生产特定笔记本电脑的品牌识别问题。

因此,我们需要将我们的度量从严格转移到部分,使部分匹配计入与注释实体外观成比例的总得分。

现在好多了,0.15 到 0.40。不是最好的,但是可以用!

这里的寓意是指标讲故事。有时候,一个指标向您描述的故事并不是数据想要讲述的故事!模型输出的临床分析总是很重要的,并且永远不应该被忽视。

有时,即使一个被认为坏了的模型也能给你的客户带来巨大的价值。

建筑规划

图片作者。

特别分析阶段的结论是,该功能有前途。这将以某种方式在最终产品中表现出来,并且由工程团队来组织将新创建的 ner 模型集成到我们当前架构中的方式。我们不会等待数据科学团队的另一次迭代来提高分数:讨论从基线建立的那一刻开始。没有概念的证明是有影响的,除非它是具体的!

一个新特性的架构应该遵循这三个原则:

  • 首先,它必须足够模块化,这样升级就容易了。如果您以类似于微服务的方式集成数据丰富管道,并在数据实体之间保持合理的分离级别,就可以做到这一点。
  • 第二,它应该符合先前的架构决策。只有在绝对需要的情况下,新特性才应该引入新的架构格式,我们的目标是降低复杂性和不确定性。
  • 第三,它应该考虑一些基本的可观察性指标。在新部署生成的不断扩大的待办事项列表中,很容易忽略可观察性。在项目的早期阶段,准备适当的日志和度量要容易得多。

本质上,这就是 MLOps:一组良好的实践,引导模型从概念到产品。

https://www.coursera.org/learn/mlops-fundamentals https://thechief.io/c/editorial/top-10-open-source-mlops-tools/

所以,回到退出计划。在 birdie.ai 这里,我们有一些预先存在的架构来运行我们的数据丰富过程,大量使用 AWS 基础设施。我们需要选择一个脚手架来执行新的模型。

AWS Lambda +阶跃函数数据处理流水线。图片作者。

第一种模式涉及 AWS Lambdas 和 Step 函数,通过不需要重型机器的浓缩函数来处理大量数据。点火函数从 Athena 数据库中检索数据,并将其发送到一个队列。这个队列由一个单独的 Step 函数或 Kubernetes 服务使用,通过一个带有拼花压缩和适当的 Hive 分区的 Firehose 流将结果发送给 S3。可以使用 Athena 表来研究结果。Lambda 通过 Cloudwatch 日志密切控制,cloud watch 日志是一种字典,其中包含关于每个 Lambda/Step 函数执行的格式化信息。

问题是,我们用的是变形金刚模型。我们将需要 GPU 驱动的机器,而 Lambda 不适合它。Kubernetes 服务将是云不可知的,并允许我们使用 GPU 机器,但我们需要更多的努力来实现这种方法的可观察性:也许可以将一名 Kubernetes 专家带到公司,或者花一些时间来开发一些基本的集群性能分析。

来自 S3 触发器管道的 AWS 批处理作业。图片作者。

我们的第二种模式依赖于由 S3 文件插入触发的 AWS 批处理作业。每当一个拼花文件进入 S3 存储桶时,就会触发一个批处理作业来读取该文件,并对其行进行某种类型的处理,然后将结果迭代地存放到一个 Firehose 流中。脚本的复杂性抵消了流水线的简单性:批处理作业必须经过适当的多重处理,才能使用机器的所有处理能力。

它非常符合我们的需求!AWS 批处理作业可以为我们的功能带来 GPU 的全部功能,而不会给我们当前的管道增加太多复杂性,我们的一个方面提取管道使用 SpaCy 命名实体识别模型从评论中提取产品属性。我们可以改变它的用途,以使用新的问题提取模型。

我们的游戏计划现在正致力于重组我们之前的一个管道来执行问题提取。这意味着如果数据科学团队交付一个经过测试的、可扩展的推理代码,开发时间将从几天缩短到小时

https://analyticsindiamag.com/why-data-scientists-should-follow-software-development-standards/ https://bigdata-madesimple.com/how-software-engineers-and-data-scientists-can-collaborate-together/

前端原型

现在,我们有了一个模型和一个架构,以一种可扩展的、可观察的方式交付那些推论…但是如何向我们的客户展示这个特性呢?

在这里的 birdie.ai ,我们对用户生成内容的见解是通过网络仪表盘传达的。这些仪表板由不同的开发人员管理,这些开发人员由数据分析师和前端工程师组成,不受数据科学家和工程师的控制。

这并不是说数据和产品之间存在不可逾越的鸿沟,因为我们参与了产品发现、影响和价值讨论:我们脱离了后端和前端应用程序开发,专注于数据结构化。

数据科学团队的重点随着公司的目标而转移。图片作者。

一些产品和公司不需要前端,直接从数据分析师收集的报告中提供见解。在这些情况下,数据小组可能需要执行仪表板操作,并测量与用户相关的指标。你可以说这些公司是前装。相比之下,更关注数据获取、丰富和架构的公司是后装

我们能够使用 Tableau 快速制作一个连接到产品分析仪表板的工作原型。将 Tableau 仪表板连接到 HTML 页面真的很容易!

https://www.zuar.com/blog/embedded-analytics-how-to-embed-tableau-dashboards-into-a-web-page/

使用 Tableau 的原型问题浏览器。我们建立了一个问题类型的层次结构,可以在多个级别进行分析:图像质量组包含艺术模式、亮度差和颜色组;亮度差包括所有涉及亮度或太暗的问题。图片作者。

这些是从特定品牌的电视评论中提取的问题,我们已经可以看到关于音频、亮度和内置应用程序商店的投诉。我们评论基数的一小部分,范围在几亿。我们希望这将是营销分析师的一个方便的温度计,给他们用户最关心的问题。

这个特性掌握在我们能干的前端工程师和他们的 HTML 魔法手中。数据科学团队正在升级我们的 NER 模型,工程团队则负责管道指标。我们正处于流水线的最后一步:完全集成特性的交付。很高兴看到一个想法从开始到结束被执行,并有客户的反馈和兴趣。

我们希望这次通过我们的方法的旅行能在您的数据之旅中帮助您!

感谢joo Augusto Leite共同撰写这篇文章,并在《贸发会议联系 2021》中作为数据专题讲座发表!**

如何部署 Flask API

原文:https://towardsdatascience.com/how-to-deploy-a-flask-api-8d54dd8d8b8a?source=collection_archive---------10-----------------------

将您的 API 部署到 Google 云平台

图片由费德里科·布尔加拉西在 Unsplash 上拍摄

对我们许多人来说,构建第一个 API 是创建有影响力的工具的重要一步,这些工具有一天可能会被许多开发人员使用。但是这些 API 通常不能在我们的本地机器上使用。

幸运的是,部署 API 非常容易。假设你不知道你现在在做什么——你可能会在 10 分钟左右部署你的第一个 API。

我没开玩笑,超级简单。让我们开始吧。

在开始之前

有几个先决条件。这些可能会让你稍微超过 10 分钟,但我保证不会花很长时间!我们将使用谷歌的云服务来部署我们的 API,即GoogleCloudPplatform(GCP)。

你将需要输入帐单细节,但如果这是你第一次上 GCP,你会得到几百💲免费学分的价值。如果你想避免任何账单,确保你在完成后删除了你的项目。

  1. 注册 GCP 并选择/创建一个项目 —记下项目名称。
  2. 启用计费
  3. 启用云构建 API 。
  4. 安装并初始化云 SDK 。

初始化后,您可能需要选择之前创建的项目。

应用引擎初始化

我们将使用 GCP 应用引擎服务来部署我们的 Flask API。要使用它,我们需要将 App Engine 添加到我们选择的项目中,然后安装 Python 的 App Engine 扩展。

从您选择的提示窗口中,我们使用项目名称(使用您的项目名称)创建一个新的 App Engine 应用程序,并选择一个地区。

gcloud app create --project=*aurelio-330516*

然后,我们安装 Python 的 App Engine 扩展:

gcloud components install app-engine-python

现在,我们已经具备了将我们的 API 部署到 GCP 的应用引擎所需的所有先决条件。让我们继续讨论 Flask API 本身。

准备和部署

在盲目地将我们的 API python 脚本扔向 GCP 的应用引擎并抱最好的希望之前,我们应该确认它是可行的。我们可以通过模拟应用引擎环境来做到这一点,但首先,我们需要一个 API。

我将使用这个 API 脚本。它并没有做什么特别有趣的事情,但是它很简单,因此对我们的例子很有用。你可以在这里看到我是如何构建它的。

除了 API 脚本main.py —您还需要包含一个./data目录,其中包含两个文件 users.csvlocations . CSV。总之,这意味着我们有一个如下所示的单一目录:

API 目录结构— 作者的图像(和所有其他图像)。

回到模拟。为了模拟 App Engine 环境,我们将使用gunicorn来运行一个本地WEBSserverGatewayIinterface(WSGI)服务器。在此之前,您可能需要pip install gunicorn —然后,在相同的环境中,我们运行 API:

API 服务器的初始化。

然后我们可以前往http://0.0.0.0:8080/users。如果 API 按预期运行,我们应该会看到一个小的 JSON 响应,如下所示:

浏览器中的 API 响应。

Gunicorn 正在使用我们的 Python 环境——所以我们在main.py脚本顶部导入的库已经安装好了。我们也知道我们正在使用(在我的例子中)Python 3.8。

当我们将 API 部署到 GCP 时,这是一个问题。App Engine 将不知道我们需要使用这些包,也不知道我们正在使用 Python 3.8。因此,我们必须在目录中再添加两个文件:

  • requirements.txt将包含一个 Python 包列表,供 App Engine 安装。
  • app.yaml将运行时设置为使用 Python 3.8。

这些文件将如下所示:

这就是我们所需要的。现在,我们通过在包含所有文件的目录中运行gcloud app deploy来进行部署。这需要一点时间来部署,之后我们应该会看到我们部署的 API 的 URL!

部署详细信息,突出显示的是 API 网址。

前往该 URL,后跟/users端点,将返回我们之前看到的相同的 JSON 对象:

来自云托管版本的 API 响应。

这意味着我们的 API 已经启动并正在运行,我们可以像对待任何其他 API 一样发出请求了!

这就是使用 GCP 的应用引擎部署 Flask APIs 的快速演练。

我希望你喜欢它!如果你有任何问题,请通过推特或在下面的评论中告诉我。如果你想要更多这样的内容,我也在 YouTube 上发布。

感谢阅读!

🤖《变形金刚》NLP 课程 70%的折扣

*除另有说明外,所有图片均出自作者之手

如何在 Kubernetes 中部署 Flask API 并将其与其他微服务连接

原文:https://towardsdatascience.com/how-to-deploy-a-flask-api-in-kubernetes-and-connect-it-with-other-micro-services-af16965b67fe?source=collection_archive---------1-----------------------

实践教程

关于如何使用强大的容器编排工具 Kubernetes 实现微服务架构的实践教程。

Kubernetes 是一个强大的容器编排工具,它自动化了容器的部署和管理。如果您有一个包含一种服务的简单轻量级应用程序,就不要使用 Kubernetes 了。如果您的应用程序有一个由几个组件协同工作的微服务架构,那么 Kubernetes 的优势就会显现出来。它是一个用于自动化部署、扩展和管理容器化应用程序的“开源系统”,具有多种优势,包括:

  • 基于需求的简单(自动)扩展
  • 通过分配工作负载,使您的应用程序在部分故障的情况下仍能正常工作,从而使应用程序具有容错能力
  • 自动化运行状况检查和自我修复流程
  • 负责微服务之间的通信,并在所有资源上平衡传入流量

一开始从 Kubernetes 开始可能会令人望而生畏,但是如果你掌握了它的主要概念,并在官方网站上使用了优秀的教程,你会很容易上手。

在这篇博客中,我将:快速概述 Kubernetes
2 的主要概念。演示如何启动您自己的本地集群
3。在您的集群上部署 MySQL 数据库
4。设置一个 Flask 应用程序,作为 REST API 与数据库通信

网络。照片由 Alina Grubnyak 在 Unsplash 上拍摄

Kubernetes 基础知识

在这一节中,我将介绍 Kubernetes 的基础知识,但没有太多的细节;请阅读官方文档,深入了解。

Kubernetes 集群由一个主节点和一个或多个**工作节点组成。**这种建筑是 Kubernetes 的主要特色之一。正如您将看到的,您的微服务分布在不同的节点上,因此如果其中一个工作节点出现故障,它们将保持健康。主机负责管理集群,并公开 API,您可以通过该 API 与集群进行通信。默认情况下, worker nodes 带有一些组件,包括一些预安装的软件,这些软件支持运行流行容器服务的容器,如 Dockercontainerd。

在 Kubernetes 集群上部署自己的应用程序有三个基本概念:部署、Pods 和服务。

  • 一个部署是提供给关于如何创建和更新你的应用的一组指令。有了这些指令,将在各个工作节点上调度并运行你的应用。部署由持续监控。如果您的应用程序的一个实例关闭(例如,如果一个工作节点关闭),它将被一个新的实例自动替换。

带有部署的 Kubernetes 集群(来源:https://kubernetes . io/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/)

  • 一个 Pod 是 Kubernetes 平台内的原子单位。它代表一组一个或多个容器以及这些容器的一些共享资源(共享存储、唯一的集群 IP 地址等。).如果您创建了一个部署,这个部署将创建容器,其中包含容器。每个 pod 绑定到一个工作节点。重要的是要理解一个工作者节点可以有多个pod、,如果当前工作者节点失败,所有这些 pod 将在不同的可用工作者节点上重建。

带有几个窗格的工作节点的概述(来源:https://kubernetes . io/docs/tutorials/kubernetes-basics/explore/explore-intro/)

  • 一个服务基本上定义了一组pod的逻辑集合,并定义了如何访问它们的策略。这是必要的,因为pod可以关闭并重启(例如,如果工作节点被删除或崩溃)。一个服务在一组 pod 之间路由流量,并允许 pod 在不影响您的应用程序的情况下死亡和复制。定义服务时,您可以指定服务的类型。默认情况下,Kubernetes 创建一个 ClusterIP 服务,这使得您的服务只能从集群内部访问。你可能想向外界公开你的一些服务(例如前端)。在这种情况下,您可以创建一个负载平衡器服务,该服务创建一个外部负载平衡器并为其分配一个固定的外部 IP,因此可以从集群外部访问它(例如在您的浏览器中)。

一个集群有 3 个**工作节点**,几个 pods 和两个绑定在一起的服务(A & B)(来源:https://kubernetes . io/docs/tutorials/kubernetes-basics/expose/expose-intro/)

开始使用您自己的集群

如果你想让你的集群快速工作:这个博客中的所有代码(和一个解释性的自述文件)都可以在这里找到。我们将要构建的应用程序由两个微服务组成。MySQL 数据库
2。一个 Flask 应用程序,它实现了一个 API 来访问和执行数据库上的 CRUD(创建、读取、更新和删除)操作。

先决条件 : 已经安装了*kubectl**minikube*(【https://kubernetes.io/docs/tasks/tools/】)。并确保您的* Docker CLI 通过命令 *eval $(minikube docker-env)* 在您的集群中使用 Docker 守护程序*。不用担心:如果你重启你的终端,你会自动再次使用你自己的* Docker 守护进程*。最后通过命令* *minikube start* 启动您的本地集群。*

首先:当建立一个 MySQL 数据库时,我们需要考虑两件事。1)要访问数据库,我们需要配置一些凭据;2)我们需要一个持久的数据库卷,以便在节点意外关闭时不会丢失所有数据。

创造秘密

Kubernetes 有自己的方法来处理你的敏感信息,通过配置 Kubernetes 的秘密。这可以用一个简单的 YAML 文件来完成。这些秘密可以由集群中的任何 pod 通过指定环境变量来访问(我们将在后面看到)。机密应该指定为 base64 编码的字符串。所以首先我们必须通过你的终端得到你的密码的编码版本:echo -n <super-secret-passwod> | base64。复制输出并将其嵌入到下面的db_root_password 字段的 secrets.yml 文件中。 metadata.name 字段很重要,因为我们必须在稍后的阶段指定它,所以一定要记住它**

你现在可以通过你的终端kubectl apply -f secrets.yml将秘密添加到你的集群中。并通过kubectl get secrets.检查秘密,看看是否有效

持久卷

持久卷是一种生命周期独立于 Pod 的存储资源。这意味着如果一个关闭,存储将继续。由于 Kubernetes 拥有在任何时候重启 pods 的权限,所以将数据库存储设置为持久卷是一个很好的做法。持久卷可以是本地文件系统上的目录,也可以是云提供商的存储服务(例如 AWS 弹性块存储或 Azure 磁盘)。在创建持久* 卷时,可以指定持久卷*的类型。在本教程中,您将使用一个 hostPath 类型,它将在您的 minikube 节点上创建一个卷。但是,请确保在生产环境中使用另一种类型(参见文档),因为如果在使用 hostPath 类型时删除 minikube 节点,您的数据将会丢失。

让您的应用程序使用由两部分组成的持久卷*:
1。指定的实际存储类型、位置、大小和属性。
2。指定一个永久卷声明,为您的部署请求永久卷的特定大小和访问模式。*

创建一个 persistent-volume.yml 文件,并指定文件的大小(在本例中为 2GB)、访问模式和存储路径。spec.persistentVolumeReclaimPolicy指定如果持久卷声明* 被删除,应该做什么。对于像 MySQL 数据库这样的有状态应用程序,如果声明被删除,您希望保留数据,这样您就可以手动检索或备份数据。默认回收策略继承自持久卷的类型,因此最好总是在 yml 文件中指定它。*

同样,您可以通过kubectl apply -f persistent-volume.yml添加存储。并通过kubectl describe pv mysql-pv-volumekubectl describe pvc mysql-pv-claim查看您创建的资源的详细信息。由于您制作了一个主机路径类型持久卷*,您可以通过登录 minikube 节点minikube ssh 找到数据,并导航到指定的路径(/mnt/data)。*

部署 MySQL 服务器

*有了我们的秘密和持久卷(claim ),我们就可以开始构建我们的应用程序了。首先我们将部署一个 MySQL 服务器。拉最新的 mysql 镜像docker pull mysql并创建 mysql-deployment.yml 文件。这个文件有几个值得一提的地方。我们指定只旋转一个 pod ( spec.replicas: 1)。部署将管理所有标签为由spec.selector.matchLabels.app: db指定的db的 pod。template字段及其所有子字段指定了 *pod 的特征。*它将运行镜像 *mysql,也将被命名为 mysql ,并在flaskapi-secrets secret 中查找 db_root_password 字段,并将该值设置为MYSQL_ROOT_PASSWORD环境变量。此外,我们指定容器公开的端口,以及应该将哪个路径安装到持久卷spec.selector.template.spec.containers.volumeMounts.mountPath: /var/lib/mysql。在底部,我们还指定了一个名为 mysql 的LoadBalancer类型的服务,这样我们就可以通过这个服务访问我们的数据库。

现在可以用kubectl apply -f mysql-deployment.yml部署 MySQL 服务器了。并通过kubectl get pods查看 pod 是否正在运行。

创建数据库和表

在实现 API 之前,我们必须做的最后一件事是在 MySQL 服务器上初始化数据库和模式。我们可以使用多种方法做到这一点,但是为了简单起见,让我们通过新创建的服务来访问 MySQL 服务器。由于运行 MySQL 服务的 pod 只能从集群内部访问,因此您将启动一个临时 pod 作为mysql-client :
1。通过终端kubectl run -it --rm --image=mysql --restart=Never mysql-client -- mysql --host mysql --password=<your_password>设置mysql-client。填写您在 secrets.yml 文件中指定的(解码)密码。
2。创建数据库、表和模式。你可以做任何你想做的事情,但是为了确保样品瓶应用程序能够正常工作,请做如下操作:
CREATE DATABASE flaskapi; USE flaskapi;
CREATE TABLE users(user_id INT PRIMARY KEY AUTO_INCREMENT, user_name VARCHAR(255), user_email VARCHAR(255), user_password VARCHAR(255));

部署 API

最后,是时候部署 REST API 了。以下要点演示了一个 Flask 应用程序的示例,该应用程序仅使用两个端点来实现 API。一个用于检查 API 是否正常工作,另一个用于在数据库中创建用户。在 GitHub repo 中,您可以找到 python 文件,该文件具有读取、更新和删除数据库中条目的端点。连接到数据库 API 的密码是从通过创建秘密而设置的环境变量中获取的。其余的环境变量(例如MYSQL_DATABASE_HOST)是从之前实现的 MySQL 服务中获取的(稍后我将解释如何确保 Flask 应用程序可以访问这些信息)。

要在您的 Kubernetes 集群中部署这个应用程序,您必须通过创建一个简单的 docker 文件来制作这个 Flask 应用程序的映像。没什么特别的,准备你的容器,安装需求,复制文件夹内容,运行 Flask app。转到 GitHub repo 找到构建映像所需的 Dockerfile 和 requirements.txt 文件。在 Kubernetes 集群中部署 Flask 应用程序之前,首先必须构建映像,并通过docker build . -t flask-api将其命名为 flask-api

现在是时候为实现 RESTful API 的 Flask 应用程序定义部署服务*了。部署将启动 3 个 pod(在*flask app-deployment . yml*的spec.replicas: 3 字段中指定),在这些*pod*中的每一个内,从您刚刚构建的 *flask-api* 映像创建一个容器。为了确保 Kubernetes 使用本地构建的映像(而不是从 Dockerhub 之类的外部 repo 下载映像),请确保将imagePullPolicy设置为never。为了确保 Flask 应用程序可以与数据库通信,应该设置一些环境变量。db_root_password是从你创建的*秘密*中获取的。每个启动的容器继承环境变量和所有运行的服务的信息,包括 T4 和 T5 地址。所以你不用担心必须指定 MySQL 数据库的hostport给 Flask 应用。最后,您将定义一个LoadBalancer 类型的*服务*来在三个 pod 之间划分传入的流量。*

向 API 发出请求

您现在已经准备好使用我们的 API 并与您的数据库进行交互了。最后一步是通过你的终端minikube service flask-service向外界公开 API 服务。您现在将看到类似这样的内容

转到提供的 URL,你会看到 Hello World 消息,以确保你的 API 正确运行。现在,您可以在您的终端中使用您喜欢的请求服务(如 Postmancurl )与 API 进行交互。要创建用户,提供一个带有名称、电子邮件和 pwd 字段的 json 文件。比如:curl -H "Content-Type: application/json" -d '{"name": "<user_name>", "email": "<user_email>", "pwd": "<user_password>"}' <flask-service_URL>/create。如果您也实现了 API 的其他方法(如 GitHub repo 中所定义的),那么您现在可以通过curl <flask-service_URL>/users查询数据库中的所有用户。

结论

卷曲在你的终端。要创建一个用户,提供一个带有名称、电子邮件和密码字段的 json 文件。比如:curl -H "Content-Type: application/json" -d '{"name": "<user_name>", "email": "<user_email>", "pwd": "<user_password>"}' <flask-service_URL>/create。如果您也实现了 API 的其他方法(如 GitHub repo 中所定义的),那么您现在可以通过curl <flask-service_URL>/users查询数据库中的所有用户。

结论

在本实践教程中,您将设置部署*、服务和*pod,通过部署 Flask 应用程序并将其与其他微服务(本例中为 MySQL 数据库)连接来实现 RESTful API。您可以继续在本地运行它,或者在远程服务器(例如云中)上实现它,并将其投入生产。随意克隆 repo 并随意调整 API,或者添加额外的微服务。

如果您有任何其他问题、意见或建议,请随时联系我!

关于作者

Rik Kraan 是一名放射学博士,在荷兰数据科学咨询公司 Vantage AI 担任数据科学家。通过rik.kraan@vantage-ai.com联系

如何在 AWS ECS 上部署 Flask API(第 3 部分)

原文:https://towardsdatascience.com/how-to-deploy-a-flask-api-on-aws-ecs-part-3-c1ca552e65d?source=collection_archive---------6-----------------------

如何在 AWS ECS 上对接和部署 Flask API 的分步指南

照片由达拉斯里德在 Unsplash 上拍摄

数据科学领域的一个重要方面是你永远不会停止学习。一旦你对数据争论和机器学习感到舒适,下一步通常是学习如何让你的 ML 模型进入“生产”以供他人使用。下一步不仅需要你知道如何使用 Flask、Django 或 FastAPI 等工具构建 API,还需要你了解 Docker & Cloud (AWS、Azure、GCP)栈。这篇文章旨在帮助你解决最后两个问题:Docker & Cloud。

如果您一直在关注我的电影推荐引擎组合项目 4 部分系列,到目前为止,我们已经介绍了协作过滤的理论(第 1 部分)以及如何创建 Flask API(第 2 部分):

在这里,我们将介绍如何在 AWS 上部署我们在第 2 部分中构建的 Flask API。

教程结构

  1. AWS 上最流行的 API 部署选项的快速概述

  2. 克隆包含必要 API 文件的 GitHub repo

  3. 将 API 归档

  4. 将 Docker 图像推送到 Amazon ECR

  5. 在 AWS ECS 上创建一个任务来运行 API,并使用分配的公共 url 对其进行测试。

  6. AWS 上最流行的 API 部署选项的快速概述

在决定如何在 AWS 上部署后端 API 时,我发现了两种主要方法:

I)带有 API 网关的 AWS Lambda 功能

或者

ii)基于 Docker 映像在 ECS 上创建任务。

即使配置任务、负载平衡器、安全组等。与使用 AWS Elastic Beanstalk 相比,在 AWS ECS 上手动安装可能会更复杂,它使您能够更好地理解并根据您的项目需求正确设置每个组件。

我之所以选择 Docker Containers 和 ECS 而不是 Lambda 函数来部署这个 API,是因为 Lambda 函数要求您添加额外的层来配置库(如 pandas ),以便与 python 运行时兼容,如果您不是严格在 Linux 操作系统上构建 Docker 映像,这可能会很麻烦。

让我们开始吧。

2。克隆包含必要 API 文件的 GitHub repo

a) 克隆以下回购:

[https://github.com/kuzmicni/movie-rec-engine-backend](https://github.com/kuzmicni/movie-rec-engine-backend)

b) 从&下面的 google drive 下载我们在上一篇文章中创建的 movie_similarity.csv 文件( Part 2 )粘贴到克隆回购的根目录下。

[https://drive.google.com/drive/folders/1FH6bWCcw1OoRf4QJaFaf4gIegIGSEx9r](https://drive.google.com/drive/folders/1FH6bWCcw1OoRf4QJaFaf4gIegIGSEx9r?usp=sharing)

您的代码结构应该如下所示:

c) 创建虚拟环境&安装必需的库

conda create --name py37_tut python=3.7
conda activate py37_tut
pip install Flask Flask-Cors pandas

运行应用编程接口

python application.py

e) 在一个单独的终端中运行测试 API

curl -X POST http://0.0.0.0:80/recms -H 'Content-Type: application/json' -d '{"movie_title":"Heat (1995)"}'

应该从 API 获得以下输出:

3。将 API 归档

我假设您已经安装了 docker,并且熟悉创建 docker 映像。让我们确保您安装了 docker:

docker version

应该得到类似的东西:

我们对 API 进行 Docker 化的方式实质上是基于名为 Dockerfile 的模板构建 Docker 镜像,该模板包含关于哪些文件需要复制以及如何运行 API 的指令。

Dockerfile:

FROM python:3.7COPY ./* ./app/WORKDIR /app/RUN pip install -r requirements.txtEXPOSE 80CMD ["python", "application.py"]

本质上,这个 Docker 文件(即蓝图)指示的是将我们当前目录中的所有文件复制到 Docker image /app/ 文件夹中,安装 requirements.txt 文件中指定的库,暴露端口 80 并将 Flask API 作为服务器运行。

要构建名为 flask-api 的 Docker 映像,请确保您与 Docker 文件在同一个目录中(即/movie-rec-engine-backed ),并在您的终端中执行:

docker build -t flask-api .

应该得到:

现在我们准备把它推送到 AWS 弹性容器注册中心(ECR)。

4。将 Docker 图像推送到亚马逊 ECR

我假设您已经安装了 aws-cli,并且已经通过 aws configure 命令输入了您的访问密钥和密钥。

在 ECR 中创建一个存储库:

单击“创建存储库”,保留默认的私有选项,并将您的存储库命名为“flask-api-repo”

b) 将 Docker 图像推送到 ECR

点击创建的“flask-api-repo”并选择“查看推送命令”

在您的终端中运行所提供的说明,但步骤 2 除外,因为我们已经构建了映像:

aws ecr get-login-password --region **<your-region>** | docker login --username AWS --password-stdin **<your-account-alias>**.dkr.ecr.**<your-region>**.amazonaws.comdocker tag flask-api **<your-account-alias>**.dkr.ecr.**<your-region>**.amazonaws.com/flask-api-repo:latestdocker push **<your-account-alias>**.dkr.ecr.**<your-region>**.amazonaws.com/flask-api-repo:latest

推送映像后,您可以刷新 repo,应该会看到以下内容:

5。在 AWS ECS 上创建一个任务来运行 API,并使用分配的公共 url 对其进行测试

是时候创建一个运行该图像的任务了!

转到 ECS。

a)创建一个集群

选择:“仅网络”选项

集群名:flask-api-cluster

选择:创建 VPC 并保留默认选项

点击“创建”。

b)定义任务

在 ECS 中,单击任务定义

单击“创建新任务定义”按钮

选择“FARGATE”

选择“下一步”

输入任务定义名称:flask-api-task

选择默认的“ecsTaskExecRole ”,或者您也可以在 IAM 中创建一个具有更多访问权限的新角色。

c)指定任务大小

任务内存(GB): 1GB

任务 CPU: 0.5 vCPU

d)添加容器

选择“添加容器”

容器名称:烧瓶-API-容器

对于 URI 形象,我们需要抓住我们的 URI 形象。只需在新标签中重新打开 aws 控制台,导航到 ECR flask-api-repo 并复制图像 URI:

返回并将 URI 粘贴到图像*字段中

输入:

软限制:128

端口映射:80

将其余部分保留为默认值,然后单击页面底部的“添加”按钮

向下滚动并点击“创建”

你应该看看

单击“查看任务定义”

e)运行任务

现在,在“操作”中选择“运行任务”

选择“FARGATE”

任务数量:1

对于子网:选择两个选项(我选择 a 和 b)

除了安全组*点击编辑

选择“创建新的安全组”

安全组名*: flask-api-sg

点击“保存”

现在,我们应该看到我们的新任务处于“PROVISIONING”状态。等一会儿,直到它变成“运行”

点击“任务”并向下滚动找到公共 IP。现在将 IP 粘贴到您的浏览器中,您应该会看到:

测试部署的 API

让我们通过终端测试一下。

假设你得到的公共 IP1.2.3.4,那么在终端中,你可以运行:

curl -X POST **1.2.3.4**/recms -H 'Content-Type: application/json' -d '{"movie_title":"Heat (1995)"}'

并且应该得到:

这意味着您的 API 已成功部署!

结束语

需要注意的事项:

您可能需要试验您的 EcsTaskRole,并确保安全组具有允许流量访问 API 的规则。

将 Docker 映像推送到 ECR 并在 ECS 中创建任务会在您的 AWS 帐户上产生费用,因此请确保停止任务并删除所有相关资源

现在我们准备使用第四部分中的 Vue.js 构建电影推荐引擎前端!

如何用 FastAPI、Docker 和 Github 动作部署机器学习模型

原文:https://towardsdatascience.com/how-to-deploy-a-machine-learning-model-with-fastapi-docker-and-github-actions-13374cbd638a?source=collection_archive---------0-----------------------

具有 CI/CD 的端到端管道

照片由西格蒙德在 Unsplash 上拍摄

你是一名数据科学家,在一家软件公司工作。

您刚刚训练了一个模型,您对它很满意,因为它在您的本地交叉验证中表现很好。

现在是将该模型投入生产的时候了,以便您组织中的其他团队可以使用它并将其嵌入到他们的应用程序中。

这是数据科学家面临的非常普遍的情况。管理起来既麻烦又痛苦,但是使用正确的工具,这个过程可以顺利进行。

在本教程中,我将展示一个端到端的用例来解释将模型投入生产的工作流程。这是一篇相对较长的文章,所以请随意跳到你感兴趣的部分。

以下是我们将要介绍的内容:

  1. 生产机器学习和 API 简介
  2. FastAPI 特性的快速概述
  3. 使用 FastAPI 和 SpaCy 构建推理 API
  4. 用 Docker 和 docker-compose 封装 API
  5. 将 API 部署到 AWS EC2,并使用 Github Actions CI/CD 自动化流程

我希望你准备好了。事不宜迟,让我们直接开始吧🚀。

PS:所有代码在Github上都有。

新到中?你可以每月订阅 5 美元,解锁我写的不限数量的关于编程、MLOps 和系统设计的文章,以帮助数据科学家(或 ML 工程师)编写更好的代码。

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

将模型投入生产意味着什么?

在我们更进一步之前,让我们从一个共同点开始。

从广义上来说,不涉及很多细节,将模型投入生产是一个过程,在这个过程中,模型被集成到现有的 IT 环境中,并可供其他团队使用和消费。

为了使这个过程尽可能高效,应该仔细管理许多步骤:数据存储、服务、工件记录、资源管理等等。

作者制作和修改的图像

如果你的模型从未离开过你的本地电脑,而你所有的实验都在 jupyter 笔记本上,那么你很可能还没有准备好投入生产。

不过不用担心。本教程旨在帮助您开始使用 API 将模型投入生产。

API 到底是什么?

A 应用程序 P 编程 I 接口的简称。它只是两个相互通信的独立应用程序之间的中介。

如果您是一名开发人员,并且希望您的应用程序可供其他开发人员使用和集成,您可以构建一个 API 作为您的应用程序的入口点。因此,开发人员必须通过 HTTP 请求与该 API 进行通信,以使用您的服务并与之交互。

作者图片

将 API 视为应用程序的抽象(用户看不到你的代码,也不安装任何东西,他们只是调用 API)和与第三方(开发者、应用程序、其他 API 等)集成的简化。)

API 无处不在。数据科学世界也不例外。

什么是 FastAPI,为什么它适合生产机器学习?

FastAPI 目前是构建可在生产环境中伸缩的健壮的高性能 API 的首选框架。

截图—https://fastapi.tiangolo.com

FastAPI 最近越来越受欢迎,用户在 web 开发人员、数据科学家和 ML 工程师中的采用率大幅上升。

让我通过展示我能想到的最有趣的特性来解释围绕这个框架的所有宣传。

然后,我们将转到在特定用例中使用 FastAPI 的部分。

PS:这个列表并不详尽,如果你想有一个全局的概述,你可以参考 官方 文档。

1)简单的语法

FastAPI 的语法很简单,这使得它使用起来很快。它实际上类似于 Flask 的语法:因此,如果您正在考虑从 Flask 迁移到 FastAPI,迁移应该很容易。

实例化 Flask 和 FastAPI 应用程序是一样的。然而,与 Flask 不同,FastAPI 没有集成 web 服务器。FastAPI 是专门为构建 API 而设计的。它没有责任为他们服务。

FastAPI 做一件事,而且做得很好。

服务 API 是 uvicorn 的责任,这是一个很好的选择,因为 uvicorn 是一个使用 uvloop 和 httptools 的闪电般快速的 ASGI 服务器实现。

烧瓶:

FastAPI:

在两个库中,为 HTTP 请求定义路由和附加处理程序遵循相同的语法。你用装修工。

FastAPI 的语法甚至更简单:每个特定的 HTTP 请求都有一个装饰器,不像 Flask 将请求类型作为参数传递给 route 装饰器。

烧瓶:

FastAPI:

在 Flask 和 FastAPI 中,path 参数都是从我们传递给 route 的路径中解析出来的。对于 FastAPI,我们将这些参数作为参数添加到函数中。我个人认为 FastAPI 在这种特殊情况下的语法更容易阅读和理解。

烧瓶:

FastAPI:

在 FastAPI 中提取查询参数要容易得多:您只需将它们作为处理程序的参数,FastAPI 会处理剩下的事情:它从 route 中解析它们,并将它们转换成您指定的类型。

当使用 Flask 时,您必须调用request类,单独获取每个参数并应用一些最终的后处理。

烧瓶:

FastAPI:

要快速了解 FastAPI 的语法,请看这个链接。

2)一个超快的框架

根据独立网站 techempower 的说法,FastAPI+uvicon 是最快的网络服务器之一。

这是一个执行基本任务的性能比较,比如 JSON 序列化、数据库访问和服务器端模板合成。每个框架都在现实的生产配置中运行。

来源:https://techempower.com

3)异步请求

FastAPI 带来了以前的 web 框架如 Flask 和 Django 所缺乏的新特性:异步请求。

异步编程是一种编程模式,它使代码能够独立于主应用程序线程运行。异步编程在许多用例中使用,例如事件驱动的系统、高度可伸缩的应用程序以及 I/O 绑定的任务,例如通过网络读写文件。

如果在处理程序中使用异步函数,那么在调用该函数之前,必须将async添加到处理程序中,并添加await参数。

你可以在这里了解更多关于异步编程的知识。

4)使用 Pydantic 的现代 python 类型

FastAPI 与 Pydantic 集成在一起,用标准的 python 类型对请求和响应主体进行类型化。

这在运行时强制验证,并通过允许您的 IDE 正确地自动完成并检测与类型相关的错误来提高您的编码效率。

在下面的例子中,我们设计了一个小的 API 来发布工作申请并接收随机的决定。请求体遵循 Application 类中定义的模式。它仅仅意味着它必须具有:

  • 类型为字符串first_name
  • 类型为字符串last_name
  • 一个类型为 intage
  • 类型为字符串degree
  • 一个可选的类型的interest字符串

类似地,您可以使用决策类中定义的模式键入 API 响应。

这有什么用呢?

假设您不小心向 first_name 字段传递了一个整数。FastAPI 将检测类型不匹配,并相应地引发错误。

你可以在这里了解更多关于 Pydantic 的信息。

5)字符串查询参数的验证

FastAPI 允许通过在字符串查询参数上添加约束来验证用户输入。例如,您可以设置最大或最小长度,或者设置查询必须匹配的正则表达式。

你可以在这里了解更多关于字符串验证的信息。

6)数值参数的验证

同样,当使用数字参数时,您可以通过使用gt(大于)和le(小于或等于)来设置一个范围作为约束。

你可以在这里了解更多关于数字验证的信息。

7)更好的错误处理和自定义消息

使用 FastAPI,您可以用特定的消息和状态代码来定义和引发自定义错误。这有助于其他开发人员在使用您的 API 时轻松理解错误并进行调试。

你可以在这里了解更多关于错误处理的信息。

8)遵循 OpenAPI 标准的自动文档生成

一旦您开始使用 FastAPI,就会自动为您生成交互式 API 文档和探索。

在本地启动 API 后,您可以通过此链接[http://localhost:8000/docs](http://localhost:8000/docs)访问它。

您将看到您创建的每条路由的文档,以及一个交互式界面,您可以直接从浏览器测试每个端点。

作者提供的图片

9)世界一流的文档,学习并开始使用框架

我很少见过如此完整且易于理解的文档。由塞巴斯蒂安·拉米雷斯领导的 FastAPI 团队已经完成了记录每一段代码的惊人工作。

你可以在这里开始学习如何使用 FastAPI,坦白地说,没有更好的选择了。

作者图片

使用 FastAPI 和 Spacy 创建匿名化 API

让我们进入有趣的部分。

在我之前的一篇帖子中,我构建了一个 Streamlit 应用程序,它通过检测带有空间模型的命名实体来匿名化文本。要使用这个应用程序,你必须打开一个浏览器并与用户界面互动。

但是,

如果我们可以创建一个 API 端点来做同样的事情,这样开发人员就可以在不使用 UI 的情况下轻松地与这个程序进行交互,会怎么样?

这看起来像是 FastAPI 的完美工作。

下面的图表代表了我们将要构建的 API 的模式:

作者图片

我们将只定义一个路由,它将接受路径/entities上的 POST 请求,并且它将期望一个包含三个字段的请求体:

作者图片

  • 文本:要匿名的文本
  • model _ size:NER 模型的尺寸(默认为“sm”)
  • model _ language:NER 车型的语言(默认为“en”)

作为输出,API 将返回一个包含两个键的 JSON 对象:

作者图片

  • **实体:**提取的实体列表。每个实体是一个 JSON,包含四个键( start :文本中实体的起始索引, end :结束索引, type :实体的类型, text :实体的值)
  • **匿名化 _ 文本:**将实体匿名化的原始输入文本

为了设置请求和响应体的类型,我们将使用 Pydantic。

  • 对于请求的主体,我们将UserRequestIn定义为 BaseModel 类的子类。它会有三个属性:text, model_languagemodel_size
    我本可以将model_languagemodel_size的类型设置为 string,但是,为了本教程,我为它们定义了两个类:ModelLanguage 和 ModelSize。这两个类继承自strEnum。使用 Enum 的想法是限制每个字段的可能值。对于语言,我们只需要英语(“en”)和法语(“fr”),对于大小,我们需要三个可能的值(“sm”表示小,“md”表示中,“lg”表示大)。
  • 至于响应的主体,我们定义了EntitiesOut类,再次作为 BaseModel 的子类。如前面的响应主体截图所示,它将有两个键:实体anonymous ized _ text。
    anonymous _ text是一个字符串,而 entities 是一列 EntityOut 对象。EntityOut 只是一个 BaseModel 类,表示每个实体的模式:它有四个字段:start (int)、end (int)、type (str)和 text (str)。

如您所见,使用 Pydantic 为您的请求和响应构建定制类型非常直观。通过组合其他复杂类型,你可以变得更有创造力。

既然已经创建了数据模型,我们就可以开始构建 API 了:首先,我们用 Spacy 加载语言模型。这些模型将保存在ml/models/文件夹中。

然后,我们将定义 API 路由和处理程序。

这里发生了一些事情:

  • 在装饰器@app.post中,我们将路径设置为entities/,并将response_model参数设置为EntitiesOut。在这里,FastAPI 强制响应体遵循在EntitiesOut类中用 Pydantic 声明的模式。
  • 处理程序的第一个参数是请求体:我们将其类型设置为UserRequestIn以强制输入验证。
  • 剩下的就是纯 python 代码:我们提取数据,调用模型,并匿名化检测到的实体。
  • 最后返回一个字典,有两个键:实体anonymouzed _ text。

现在一切都应该可以在本地运行了。进入项目的根目录,运行uvicorn api.main:app --reload

作者提供的图片

要检查 API 是否在工作,您可以打开http://localhost:8000/docs来查看交互界面,在这里您可以从浏览器尝试 API。

作者图片

用 Docker 打包 API

既然 API 在本地工作,我们可以构建一个 Docker 映像来打包它的依赖项,并在一个隔离的执行环境中运行它,也就是一个容器

您可以将容器视为虚拟机,尽管它们不像虚拟机那样提供严格的隔离。

Docker 映像由Dockerfile定义,它基本上是 Docker 构建映像的一组指令。

图像通常建立在其他基础图像之上。这些图像可以从 Docker Hub 中提取,这是 Github 的一个等价物,但是是针对 Docker 图像的。

这是我们 API 的 docker 文件。它包含在项目的根目录中。

让我们一行一行地详细说明发生了什么:

  1. 我们指出我们从python:3.7开始的基本图像。Docker 在构建映像时从中央存储库中取出它。
  2. Python 依赖项(fastapi、uvicorn 和 spacy)在镜像中使用pip安装。
  3. 我们将api/文件夹的内容(从主机)复制到/api/api/文件夹(在镜像上)
    PS:这个文件夹是在镜像中自动创建的
  4. 我们将 PYTHONPATH 变量设置为/api
  5. 我们为后续的 CMD 命令设置工作目录。这仅仅意味着 Dockerfile 文件的最后一行将从工作目录中执行。
  6. 我们向 Docker 表明,容器将在运行时监听端口 8000。
  7. ENTRYPOINT允许配置作为可执行文件运行的容器。
  8. 我们设置要执行的命令(我们将省略uvicorn命令,因为它已被声明为入口点。

现在我们将定义一个 docker-compose,它将为我们的 API 创建一个服务。
我本可以只使用 Dockerfile,因为 docker-compose 是一个定义多容器应用程序的工具,而且我们目前只有一个容器。

但是为了本教程,让我们来看看它是如何完成的:一般来说,您可能希望在单独的容器中运行多个服务,docker-compose 是将它们组合在一起的一个很好的工具。

我们在同一位置再次创建一个docker-compose.yaml文件。

作者提供的图片

在这个文件中,我们将 docker-compose 的版本设置为 3(最新的)。我们为服务命名(anonymization-api),为构建步骤设置 Dockerfile 的路径,并将端口 8000(在容器上)映射到端口 8000(在主机上)。

最后,我们运行这个命令,它将为容器内部的 API 提供服务,并使它可以从主机访问。

**docker-compose up --build**

在 AWS 上启动并配置 EC2 实例

让我们创建一个 EC2 实例,我们将在其中用 Docker 部署 API。

  • 首先,连接到您的 AWS 帐户,转到 EC2 部分并选择一个发行版。这个教程我推荐 Ubuntu 20.04 LTS。

作者截图

  • 举个例子:我们不会在这里发疯。我们就挑一个比较小的:a t2.medium

作者截图

  • 现在启动实例。
  • 创建一个弹性 IP 地址,并将其关联到正在运行的实例。这样,每次我们重新启动实例时,这个 IP 都不会改变。

作者截图

  • 添加一个新的安全组(我将其命名为 fastapi)以允许端口 8000 上的入站流量。

作者截图

  • 然后,将其添加到实例安全组:

作者截图

现在,实例已经准备好接受端口 8000 上的请求。

  • 使用您的终端 SSH 到它。
  • 按照 ubuntu 的官方文档安装dockerdocker-compose
  • 生成一个 ssh 密钥,并将其添加到您的 Github 帐户,这样它就可以无缝地执行 git 克隆(我们将在下一节中使用它)

在 Github 操作上创建部署工作流

Github Actions 是 Github 的 CI/CD 服务。它允许您基于 git 提交、合并或拉取请求等事件自动测试、构建和部署应用程序。

要了解更多关于 Github 动作的信息,请看一下这个 链接

要在 repo 中添加工作流程,请点击操作选项卡。

作者截图

然后,点击自行设置工作流程。

作者截图

一个 YAML 文件将被自动创建在一个workflows文件夹中,该文件夹将被创建在回购根目录下的一个.github文件夹中。

在我们的例子中,我们将工作流设置为仅在分支上的推送请求时触发。

作者截图

将被触发的作业将在一个远程服务器上运行,GitHub Actions 将通过 **SSH Remote 命令连接到该服务器。**在其他情况下,该作业可能在 Github 运行程序上运行,例如 Github 提供的实例。

SSH Remote Commands 是一个定制的 GitHub 动作,你可以在市场上找到。它是免费使用的,你只需要在uses部分之后调用它。

将使用以下参数调用 SSH 远程命令 Github 操作

  • 主机:服务器的主机名(即其公共 IP)
  • 用户名:ssh 用户名
  • key:ssh 私钥的内容
  • 脚本:ssh 连接建立后将执行的脚本

该脚本将列出 SSH 连接建立后将在服务器上运行的命令:

  • 克隆回购
  • 光盘放进去
  • 运行 docker-compose build 和 up 命令。
git clone git@github.com:ahmedbesbes/anonymization-api.git
cd anonymization-api
sudo docker-compose up --build -d

前面的参数hostusernamekey不会硬编码到 YAML 文件中。他们永远不会。这个信息很敏感。

它们将被存储为 Github Secrets 并用$符号引用,就像你调用环境变量一样。

要创建 Github secrets,请转到存储库的设置,然后单击左侧选项卡上的 secrets。Github 机密总是在 Github repo 的范围内定义。

作者截图

然后通过设置它们的名称(用大写字母)和它们的值来定义你的秘密。

作者截图

下面是你如何设置USERNAME秘密的例子。

作者截图

现在你可以提交、推动并期待奇迹的发生!

一旦你推送你的代码(在测试本地一切正常之后),你会注意到,在点击动作标签之后,一个新的运行正在排队等待开始。

通过点击它,您可以看到构建的不同步骤。

作者截图

一旦 API 成功地部署在您的远程服务器上,启动 Postman 并在 API 端点上执行一些请求来检查它是否正常工作。

作者截图

有后!🎊现在 API 已经部署好了,可以工作了,并准备好接受请求。

结论和后续步骤

到目前为止,已经涵盖了很多内容。

我们了解了 FastAPI 提出的有趣特性。然后,我们用这个框架构建了一个 API,最后用 Docker 部署在 AWS 上。

为了使部署过程尽可能顺利,我们还使用了 GitHub Actions 工作流,该工作流在每次推送时被触发,并使用自定义操作。

现在,为了使这个 API 更适合生产,我们可以考虑这些特性(我可能会在未来的博客文章中涉及它们)

  • 为 API 设置域名
  • 通过添加 HTTPS 来保护 API
  • 使用gunicorn代替unicorn进行部署
  • 添加数据库服务(例如 PostgreSQL)来存储输入和预测:这是应用异步请求的好机会。

资源:

这里是我在学习 FastAPI 和部署时浏览的一些高质量资料。

https://fastapi.tiangolo.com/ https://www.starlette.io/ https://medium.com/@calebkaiser/why-we-switched-from-flask-to-fastapi-for-production-machine-learning-765aab9b3679 https://testdriven.io/blog/moving-from-flask-to-fastapi/

感谢阅读!🙏

我希望这篇文章对你有用。如果你对改进我建立的工作流程有任何建议,请不要犹豫,在 Github 或评论中提出。

同样,代码可以在我的回购上获得:请随意在你的项目上试用。

我就讲到这里,下次见!

照片由卡斯滕·怀恩吉尔特在 Unsplash 上拍摄

新到中?您可以每月订阅 5 美元,并解锁无限的文章— 单击此处。

如何将 Python 无服务器功能部署到 Vercel

原文:https://towardsdatascience.com/how-to-deploy-a-python-serverless-function-to-vercel-f43c8ca393a0?source=collection_archive---------9-----------------------

让基础设施来承担重担。

照片由克里斯蒂娜·莫里路从派克斯拍摄

ercel 是一个提供无服务器运行时的平台,也称为功能即服务(FaaS)。但是,为什么我需要去无服务器?好吧,如果你需要去无服务器或没有直接的答案。通常,无服务器功能无需维护即可扩展。此外,您只在需要时才运行该函数。

我一直使用无服务器函数作为 API 端点。我对无服务器功能的特点很感兴趣。比如我不用担心基础设施;相反,我可以专注于问题。这篇文章教你如何在 Vercel 上部署一个 python 无服务器函数。我们开始吧!

设置

在这篇文章中,我将使用 GitHub 和 Vercel 。首先,我们将创建一个 git 存储库,这样我们就可以用 Vercel 连接它。

这是我创建的库的链接。将代码下载到本地机器后,可以在 api 文件夹中看到一个名为index.py的 python 文件。根据 Vercel 针对 Python 的文档,如果一个 Python 文件有一个单一的 HTTP handler 变量,继承自 api 目录内的 BaseHTTPRequestHandler 类处理程序,Vercel 会将其作为一个无服务器函数。

让我们来分解一下index.py文件的各个成分。

from http.server import BaseHTTPRequestHandler
from urllib import parse
class handler(BaseHTTPRequestHandler):
    def do_GET(self):
        s = self.path
        dic = dict(parse.parse_qsl(parse.urlsplit(s).query))
        self.send_response(200)
        self.send_header('Content-type','text/plain')
        self.end_headers()
        if "name" in dic:
            message = "Hello, " + dic["name"] + "!"
        else:
            message = "Hello, stranger!"
        self.wfile.write(message.encode())
        return

对于这个例子,我们想要处理查询字符串。如果查看文档,path实例变量包含请求路径。为了方便起见,现在让我们将path变量解析到一个字典中。此外,我已经将 HTTP 状态代码设置为 200,并将内容类型设置为纯文本。

以下代码行在字典中查找一个名为name的键。如果密钥存在,变量message将包含Hello,,后跟name!,否则为Hello, stranger!。你可以在这里阅读更多关于高级 Python 用法的内容。最后,我将返回message的编码内容,默认情况下是 utf-8。

现在,让我们转到 Vercel 以便能够导入我们的项目。

单击继续

单击 Continue 后,您应该会看到下面的对话框。

把你的 git 库链接

在我的例子中,我将使用我的 git 存储库链接,它是https://github.com/lifeparticle/vercel-python。现在点击继续,最后点击部署。

对于这篇文章,我们将不配置构建和输出设置

现在,您应该会在浏览器上看到如下所示的对话框。点击“访问”按钮,访问您的无服务器功能。在本例中,我的无服务器函数的地址是由 Vercel 生成的https://vercel-python.lifeparticle.vercel.app/。我们需要在基本 URL 的末尾添加 api/file_name 来访问该函数。添加之后,我们有了一个看起来像 https://vercel-python.lifeparticle.vercel.app/api/index 的 URL。

点击访问

现在,如果你访问链接 …

无查询字符串与查询字符串

对于第一个函数调用,我们没有提供任何查询字符串。因此它显示你好,陌生人!在第二个调用中,提供了名称菠萝。

由于我们已经将 GitHub 项目与 Vercel 链接起来,对主分支的任何更改都将触发生产部署。如果您想选择一个不同的分支作为生产分支,请遵循这个文档。

包裹

现在您知道了如何将 python 无服务器函数部署到 Vercel!欢迎来到充满新可能性的世界。如果您想将 Ruby 无服务器功能部署到 Vercel,请访问下面的链接。编码快乐!

如何用 FastAPI、Docker 和 Traefik 部署安全 API

原文:https://towardsdatascience.com/how-to-deploy-a-secure-api-with-fastapi-docker-and-traefik-b1ca065b100f?source=collection_archive---------2-----------------------

配置 HTTP S 的指南

照片由飞:D 在 Unsplash

当我们部署一个 API 来服务一个机器学习模型时,我们很少关心那个绿色的挂锁,它使得 HTTP 连接被认为是安全的,浏览器是快乐的。

作者图片

我们通常认为 HTTPS 是理所当然的,我们可能认为它只是通过一些简单的配置就可以打开*。*

事实是,添加 HTTPS 需要几个步骤。

这就是这篇文章的目的:解释为什么 HTTPS 很重要,以及当你用 Python 构建 web 应用和 API 时,如何将它添加到你的部署中。

以下是我们将在本帖中介绍的内容:

  1. HTTPS 简介:它是如何运作的,为什么你应该关注它?
  2. 用 FastAPI 构建 API
  3. 介绍 Traefik 及其如何处理 HTTPS
  4. 通过 Docker 集成 FastAPI 和 Traefik
  5. 在 AWS 上部署

这个指南将最终帮助您添加 HTTPS 到您的项目。您可以重用以下代码来构建安全的项目。

事不宜迟,让我们直接开始吧🚀

PS:此代码在Github上有。*

PS:如果你想了解更多关于 FastAPI、Docker 和 Github 的动作,一定要看看我之前的* 帖子 *

* *

复制本教程需要什么

  • 注册的域名。你可以花几块钱在 T42 买到一个
  • 安装在本地机器上的 Docker 和 docker-compose:你可以遵循官方的文档
  • 部署 API 的远程服务器:我在 AWS EC2 上使用了一个t2-medium实例。任何同等的东西都应该是好的。
    确保这个实例有固定的 IP 地址
  • *在您的域提供者上,创建一个指向实例 IP 地址的 A 记录。我目前拥有 ahmedbesbes.com,为了这个教程,我创造了以下记录:**ssl.ahmedbesbes.com。*你可以通过选择任何你想要的子域来对你的域做同样的事情。
    OVH 的界面看起来是这样的( OVH 是我的域名提供商)

作者截图

什么是 HTTPS,你为什么要关心它?

HTTPS 是基于加密协议的 HTTP。这个协议被称为传输层安全性( TLS ),它以前被称为安全套接字层( SSL )。

换句话说,HTTPS 是加密的,以增加数据传输的安全性。

它是如何工作的?

HTTPS 背后的协议 TLS 使用不对称的公钥基础设施。该系统使用两种不同的密钥来加密双方之间的通信:

  1. 私人钥匙🔐:此密钥由网站所有者控制,它是私有的,位于远程 web 服务器上。它用于解密由公钥加密的信息
  2. 公钥🔑:任何希望以安全方式与服务器交互的人都可以使用此密钥。这个密钥的作用是加密数据,私钥稍后会解密这些数据。

图片由作者修改

我们为什么需要 HTTPS?

HTTPS 是一个非常有用的协议。您需要它有三个主要原因:

  • *隐私:这样就没人能拦截或偷听你的消息(消息可以是你发布给朋友的文字,你填写表格的信用卡信息,图像,视频,或者你通过网络上传的任何东西)。当通过 HTTPS 发送时,该数据被**加密,*即变成一个长的字母数字串。
  • 完整性:这样你发送的信息在到达目的地的途中不会被任何形式的操纵。
  • 认证:这样你请求的远程服务器就能确定你就是你声称的那个人

除了给你的应用增加一个安全层,HTTPS 还是高质量软件实践的保证。这对于建立可信的用户群非常重要。

主要的互联网公司都非常重视 HTTPS。事实上,谷歌在 2014 年宣布拥有 HTTPS 将提高你在搜索结果中的排名。谷歌还让 Chrome 将所有没有 HTTPS 的网站标记为不安全。

看完这个谁还想访问你的网站?(图片由作者提供)

是时候将 HTTPS 添加到您的应用程序中了!

用 FastAPI 构建最小 API

在这一节中,我们将在一个非常简单的例子上安装并运行 FastAPI。接下来我们将看到如何保护它。

在进入代码之前,下面是项目结构的样子:

作者截图

让我们从创建虚拟环境开始:

***mkdir fastapi-ssl && cd _
pipenv install fastapi***

没什么特别的,我们将创建一个有两条路线的 API:

  • 一个处理 GET 请求并在浏览器上显示以下 JSON 响应
***{"message": "Hello FastAPI + SSL"}***
  • *另一个处理 **POST 请求。*这个路由需要一个包含两个键:textauthor的主体,并发回一个 JSON 对象作为响应,其中包含已经发送的相同的textauthor以及一个附加的status消息。
***{"status": "message received", "text": "Hello", "author": "Ahmed"}***

下面的代码定义了这两条路线。

一个非常简单的 API,有两条路径

查看这篇文章,了解更多关于用 FastAPI 构建 API 的信息。

什么是 Traefik?它如何帮助 HTTPS?

在用 Docker 打包 app 之前,我们先介绍一下 Traefik。

Traefik 是一个开源的反向代理和负载平衡器,适用于基于 HTTP 和 TCP 的应用程序,它简单、动态、自动、快速、功能全面、经过生产验证,提供指标,并与每一种主要的集群技术集成…

Traefik 的目标是拦截来自互联网的传入 HTTP 请求,并将它们路由到 Docker 运行的专用容器。它可以将任何 DNS 记录附加到正在运行的服务上。

特拉菲克在中间

Traefik 是云原生的。这意味着它可以轻松地与 Docker 和 Kubernetes 等云技术集成。在本教程中,我们将 Traefik 链接到 Docker。

上面的樱桃:Traefik 自动支持让我们加密证书。这意味着它会自动为您处理这些文件的创建和更新,以确保 HTTPS 配置正确。

让我们加密什么?

Let's Encrypt 是一个免费的、自动化的、开放的认证机构(CA),为公众的利益而运行。这是由互联网安全研究小组(ISRG) 提供的服务。

Let's Encrypt 是一个会为我们颁发免费 SSL 证书的组织。

什么是 SSL 证书?

SSL 证书允许网站拥有 HTTPS。

它是一个保存在部署应用程序的远程服务器上的文件。它使 SSL/TLS 加密成为可能,并保存诸如公钥和网站身份等信息。

当客户端(例如您的浏览器)尝试连接到安全网站时,它首先会获得此证书的副本。这允许客户端检查远程服务器的身份并获得公钥,以便启动加密会话。

为 HTTPS 设置 Traefik

让我们从配置 Traefik 开始。这可以使用下面的 TOML 文件来完成。该文件将位于services/traefik

Traefik 配置文件

让我们详细介绍一下每一部分都发生了什么:

**[entrypoints]**

此部分指定 Traefik 将侦听的端口。这些端口是 80443 。80 是默认的 HTTP 端口,443 是 HTTPS 端口。我们将分别称它们为webwebsecure

然后,我们告诉 Traefik 将 HTTP 重定向到 HTTPS。

**[accessLog]**

这个部分告诉 Traefik 将日志打印到stdout以了解谁给谁打了电话。

**[providers]**

在本节中,我们将配置所谓的提供者。

**提供商是基础设施组件,无论是编排器、容器引擎、云提供商还是键值存储。其思想是,Traefik 查询提供者 API,以便找到有关路由的相关信息,当 Traefik 检测到变化时,它会动态更新路由。

我们希望 Traefik 在 Docker 容器前充当代理,所以我们将选择 Docker 作为提供者之一。

exposedByDefault设置为false仅仅意味着 Traefik 不会在所有容器前充当代理。它只会在那些有 docker-compose 中描述的特定标签的人面前这样做。(我们将在下面的 Docker 部分介绍这些标签)

**[certificatesResolvers.letsencrypt.name]**

本节配置证书解析器。换句话说,Traefik 将通过 ACME 协议与 Let's Encrypt 通信:要做到这一点,您必须设置一个有效的电子邮件地址和文件名,Traefik 将把它从 Let's Encrypt 接收的信息保存在这里。当 Traefik 与 Let's Encrypt 通信时,可以成功生成和更新证书。

使用 Docker 准备部署

在本节中,我们在 docker-compose 文件中定义了两个容器:一个用于 FastAPI web 服务,另一个用于启动 Traefik。

注意,您可以有多个运行不同服务的容器,Traefik 会将流量路由到这些容器。

让我们详细说明每个容器中发生了什么:

**api**

我们首先通过引用以下 Dockerfile 文件的路径来构建映像:

然后,我们定义将被 Traefik 读取的 docker 标签

  • traefik.enable=true确保 Traefik 看到该容器并将流量路由到该容器
  • 其他标签定义了指向容器的 DNS 记录(ssl.ahmedbesbes.com,也就是我为这个 API 设置的域)。他们还告诉 Traefik 使用 TLS 并使用 Let's Encrypt 来解析证书。

————**traefik**

我们首先从官方注册中提取图像。

我们将容器上的端口 80 和 443 映射到主机上的端口 80 和 443。

我们定义了三个卷:

  1. 第一个卷使 Traefik 知道其他容器
  2. 第二个卷将 Traefik 配置文件传递给容器
  3. 第三个卷将生成的证书保存在主机上,这样就不会在每次容器重新启动时重新生成它们。这很重要,因为 Let's Encrypt 对您可以获得的证书数量有限制

在 AWS 上部署

确保本地一切正常,连接到虚拟机,克隆存储库,并在根目录下运行以下命令:

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

为了让 Github 动作的部署更顺利,看看我之前的帖子。

资源

下面是我用来学习 HTTPS、Traefik 和用 Docker 部署 FastAPI 应用程序的资源的汇编列表。

不要犹豫,让我知道你在这方面找到的其他有用的资源😉

*https://howhttps.works/ https://www.valentinog.com/blog/traefik/ https://fastapi.tiangolo.com/tr/deployment/docker/ https://www.digitalocean.com/community/tutorials/how-to-use-traefik-v2-as-a-reverse-proxy-for-docker-containers-on-ubuntu-20-04 https://traefik.io/blog/traefik-2-tls-101-23b4fbee81f1/ https://www.digitalocean.com/community/tutorials/how-to-use-traefik-v2-as-a-reverse-proxy-for-docker-containers-on-ubuntu-20-04

https://www . cloud flare . com/fr-fr/learning/SSL/what-is-https/

感谢阅读🙏

让我们结束它。这篇文章提供了一个机会:

  • 了解 HTTPS 及其带来的好处
  • 了解关于 Traefik 以及如何使用它作为反向代理来创建 HTTPS 连接的更多信息
  • 使用 Docker 通过 Traefik 部署和管理 FastAPI

我希望这是在您的项目中实施 HTTPS 的良好开端。

同样,代码可以在 Github 上获得:你可以随意使用它或者为你的项目修改它。

我就讲到这里,下次见!

照片由卡斯滕·怀恩吉尔特在 Unsplash 上拍摄

新到中?您可以每月订阅 5 美元,并解锁无限的文章— 单击此处。*

如何将张量流模型部署到 Vertex AI

原文:https://towardsdatascience.com/how-to-deploy-a-tensorflow-model-to-vertex-ai-87d9ae1df56?source=collection_archive---------11-----------------------

在 Vertex AI 中使用保存的模型和端点

在本文中,我将带您了解如何将 TensorFlow/Keras 模型部署到 Vertex AI 中,并从中获得预测。

概念

这里有几个重要的概念,所以我们进行的时候可以参考这个图表。代码片段来自 GitHub 中的这个笔记本。

向 Vertex AI 部署模型的步骤。由我图解。

基本思想是客户端访问端点。每个端点都与一个 URL 相关联。客户端发送一个带有 JSON 有效负载的 HTTP Post 请求,其中包含预测方法的输入。

端点包含许多顶点 AI 模型对象,它在这些对象之间划分流量。在上图中,80%的流量流向模型 1,10%流向模型 2,其余流向模型 3。

顶点 AI 模型是一个对象,它引用了在各种框架(TensorFlow、PyTorch、XGBoost 等)中构建的模型。).每个框架都有预构建的容器映像。如果你使用的是不被 Vertex AI 直接支持的 ML 框架,你也可以引入你的容器。

TensorFlow 容器图像会查找已保存的 Model 文件,当您从训练代码中调用 model.save(…)时,默认情况下 Keras/TensorFlow 2.0 模型会导出为这种格式。

第一步。在 Keras 中保存训练模型

在 TensorFlow 2.0 中编写机器学习模型的推荐方法是使用 Keras API。简而言之,它包括以下步骤:

# 1\. Create a tf.data Dataset
train_dataset = read_dataset(training_data_uri, train_batch_size)
eval_dataset = read_dataset(validation_data_uri, eval_batch_size)# 2\. Create a Keras Model
inputs = tf.keras.layers.Input(...)
layer_1 = tf.keras.layers.... (inputs) 
...
outputs = tf.keras.layers.Dense(...)(layer_n)
model = tf.keras.Model(inputs, output)
model.compile(optimizer='adam',
              loss='binary_crossentropy',
               metrics=['accuracy'])# 3\. Train
model.fit(train_dataset, validation_data=eval_dataset, ...)# 4\. Save model
EXPORT_PATH = 'gs://{}/export/flights_{}'.format(bucket,
                                     time.strftime("%Y%m%d-%H%M%S"))
model.save(EXPORT_PATH)

上面的关键步骤是,你的训练程序将训练好的模型保存到谷歌云存储的一个目录中。

第二步。上传模型

我建议您为每个模型使用一个唯一的显示名称(Vertex AI 确实分配了一个唯一的模型 id,但它是一个不透明的数字,不可读)。

给模型分配一个唯一的名称,因为顶点 AI 分配的唯一 ID 不是人类可以理解的

一种简单的方法是在您想要使用的名称后面附加一个时间戳,这样每次您上传一个模型时,您就有了一个新的名称:

TIMESTAMP=$(date +%Y%m%d-%H%M%S)
MODEL_NAME=flights-${TIMESTAMP}

然后,将保存的模型文件上传到上面的模型,为您的 ML 框架指定预建顶点容器:

gcloud beta ai models upload --region=$REGION \
     --display-name=$MODEL_NAME \
     --container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-6:latest \
     --artifact-uri=$EXPORT_PATH

第三步。创建端点

您还希望端点有一个唯一的名称,但是您不会创建多个端点。只有一个。因此,不需要时间戳。在创建端点之前,只需验证它不存在:

ENDPOINT_NAME=flights
if [[ $(gcloud ai endpoints list --region=$REGION \
        --format='value(DISPLAY_NAME)' --filter=display_name=${ENDPOINT_NAME}) ]]; then
    echo "Endpoint $ENDPOINT_NAME already exists"
else
    # create model
    echo "Creating Endpoint $ENDPOINT_NAME for $MODEL_NAME"
    gcloud ai endpoints create --region=${REGION} --display-name=${ENDPOINT_NAME}
fi

第四步。将模型部署到端点

将模型部署到端点,确保指定您需要的机器类型(包括 GPU 等。)和流量分流:

gcloud ai endpoints deploy-model $ENDPOINT_ID \
  --region=$REGION \
  --model=$MODEL_ID \
  --display-name=$MODEL_NAME \
  --machine-type=n1-standard-2 \
  --min-replica-count=1 \
  --max-replica-count=1 \
  --traffic-split=0=100

因为这是第一个模型,我们发送 100%的流量到这个模型

— traffic-split=0=100

如果我们有一个旧的模型,我们将指定两个模型之间的相对分割。要将 10%的流量发送到新型号,将 90%的流量发送到旧型号,我们需要:

--traffic-split=0=10,OLD_DEPLOYED_MODEL_ID=90

请注意,所有这些命令都需要模型 ID 和端点 ID(而不是模型名称和端点名称)。要从名称中获取 ID(假设您使用了我推荐的唯一名称):

MODEL_ID=$(gcloud ai models list --region=$REGION \
           --format='value(MODEL_ID)' \
           --filter=display_name=${MODEL_NAME})ENDPOINT_ID=$(gcloud ai endpoints list --region=$REGION \
              --format='value(ENDPOINT_ID)' \
              --filter=display_name=${ENDPOINT_NAME})

如果你没有使用唯一的名字(坏主意!),您可以获得最近部署的模型或端点的 id:

ENDPOINT_ID=$(gcloud ai endpoints list --region=$REGION \
              --format='value(ENDPOINT_ID)'\
              --filter=display_name=${ENDPOINT_NAME} \
              **--sort-by=creationTimeStamp | tail -1**)

把这些放在一起。

下面是上面的所有代码片段,便于复制粘贴:

## CHANGE
EXPORT_PATH=gs://some-bucket/some-model-dir
TF_VERSION=2-6
ENDPOINT_NAME=flights
REGION=us-central1##TIMESTAMP=$(date +%Y%m%d-%H%M%S)
MODEL_NAME=${ENDPOINT_NAME}-${TIMESTAMP}
EXPORT_PATH=$(gsutil ls ${OUTDIR}/export | tail -1)
echo $EXPORT_PATHif [[ $(gcloud ai endpoints list --region=$REGION \
        --format='value(DISPLAY_NAME)' --filter=display_name=${ENDPOINT_NAME}) ]]; then
    echo "Endpoint for $MODEL_NAME already exists"
else
    # create model
    echo "Creating Endpoint for $MODEL_NAME"
    gcloud ai endpoints create --region=${REGION} --display-name=${ENDPOINT_NAME}
fiENDPOINT_ID=$(gcloud ai endpoints list --region=$REGION \
              --format='value(ENDPOINT_ID)' --filter=display_name=${ENDPOINT_NAME})
echo "ENDPOINT_ID=$ENDPOINT_ID"# delete any existing models with this name
for MODEL_ID in $(gcloud ai models list --region=$REGION --format='value(MODEL_ID)' --filter=display_name=${MODEL_NAME}); do
    echo "Deleting existing $MODEL_NAME ... $MODEL_ID "
    gcloud ai models delete --region=$REGION $MODEL_ID
done# upload model
gcloud beta ai models upload --region=$REGION --display-name=$MODEL_NAME \
     --container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.${TF_VERSION}:latest \
     --artifact-uri=$EXPORT_PATH
MODEL_ID=$(gcloud ai models list --region=$REGION --format='value(MODEL_ID)' --filter=display_name=${MODEL_NAME})
echo "MODEL_ID=$MODEL_ID"# deploy model to endpoint
gcloud ai endpoints deploy-model $ENDPOINT_ID \
  --region=$REGION \
  --model=$MODEL_ID \
  --display-name=$MODEL_NAME \
  --machine-type=n1-standard-2 \
  --min-replica-count=1 \
  --max-replica-count=1 \
  --traffic-split=0=100

第五步。调用模型

下面是客户端如何调用您已经部署的模型。假设他们在一个名为 example_input.json 的 JSON 文件中有输入数据:

{"instances": [
  {"dep_hour": 2, "is_weekday": 1, "dep_delay": 40, "taxi_out": 17, "distance": 41, "carrier": "AS", "dep_airport_lat": 58.42527778, "dep_airport_lon": -135.7075, "arr_airport_lat": 58.35472222, "arr_airport_lon": -134.57472222, "origin": "GST", "dest": "JNU"},
  {"dep_hour": 22, "is_weekday": 0, "dep_delay": -7, "taxi_out": 7, "distance": 201, "carrier": "HA", "dep_airport_lat": 21.97611111, "dep_airport_lon": -159.33888889, "arr_airport_lat": 20.89861111, "arr_airport_lon": -156.43055556, "origin": "LIH", "dest": "OGG"}
]}

他们可以发送 HTTP 帖子:

PROJECT=$(gcloud config get-value project)
ENDPOINT_ID=$(gcloud ai endpoints list --region=$REGION \
              --format='value(ENDPOINT_ID)' --filter=display_name=${ENDPOINT_NAME})curl -X POST \
  -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
  -H "Content-Type: application/json; charset=utf-8" \
  -d [@example_input](http://twitter.com/example_input).json \
  "[https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/endpoints/${ENDPOINT_ID}:predict](https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/endpoints/${ENDPOINT_ID}:predict)"

他们将得到 JSON 格式的结果:

{
  "predictions": [
    [
      0.228779882
    ],
    [
      0.766132474
    ]
  ],
  "deployedModelId": "2339101036930662400",
  "model": "projects/379218021631/locations/us-central1/models/3935868997391613952",
  "modelDisplayName": "flights-20211102-064051"
}

当然,它是一个 REST API,所以您可以从几乎任何语言中调用它。也有可用的客户端 API 库。

利益

在本文中,我向您展示了如何在 Vertex AI 上部署一个经过训练的 TensorFlow 模型。

Vertex AI 为机器学习模型提供了一个完全管理的、自动缩放的、无服务器的环境。只有在您使用 GPU 时,您才能享受到为其付费的好处。因为模型是容器化的,所以依赖关系管理得到了关注。端点负责流量分流,允许您以方便的方式进行 A/B 测试。

好处不仅仅是不必管理基础架构。一旦你的模型被部署到 Vertex AI,你无需任何额外的代码就可以获得许多简洁的功能——可解释性、漂移检测、监控等等。

尽情享受吧!

更多关于 Vertex AI 的阅读:

  1. 给谷歌云上的新统一 ML 平台 Vertex AI 一个旋转 :
    我们为什么需要它,无代码 ML 培训到底有多好,所有这些对数据科学工作意味着什么?
  2. 如何将 TensorFlow 模型部署到 Vertex AI :在 Vertex AI 中使用保存的模型和端点
  3. 使用 Python 在 Vertex AI 上开发和部署机器学习模型:编写让你的 MLOps 团队满意的训练管道
  4. 如何在 Vertex AI 中为超参数调整构建 MLOps 管道 :
    为超参数调整设置模型和协调器的最佳实践

如何将 Azure 机器学习模型部署为安全端点

原文:https://towardsdatascience.com/how-to-deploy-azure-machine-learning-models-as-a-secure-endpoint-704382bc71fd?source=collection_archive---------12-----------------------

了解如何使用 Azure API 管理构建 MLOps 管道,以将模型部署为安全端点。

1.介绍

机器学习运营( MLOps )的目标是在生产中部署和维护机器学习模型。MLOps 管道的一个常见工件是最终用户应用程序可以使用的实时评分端点。关键是使用网络隔离和身份验证来保护此端点。在这篇 blogpost 和 git repo [blog-mlopsapim-git](https://github.com/rebremer/blog-mlopsapim-git)中,讨论了 Azure 中的 MLOps 管道,它执行以下操作:

  • 1.创建 Azure DevOps 项目并创建 Azure ML、AKS 和 API 管理基础架构
  • 2.在 Azure ML 中训练和创建模型
  • 3a。将模型作为 docker 映像部署在隔离的 Azure Kubernetes 集群上
  • 3b。使用 Azure API 管理和 Azure AD 公开安全端点

另请参见下图:

1.架构概述,图片由作者提供

这个项目是基于克莱门斯·西布勒所做的伟大工作,可以在这里找到。在这篇博文的剩余部分,将会更详细地解释这个项目。在下一章中,将描述如何设置 MLOps 项目。

2.设置 MLOps 项目

在本章中,将创建一个 MLOps 项目。在这方面,需要做以下工作:

  • 2.1 先决条件
  • 2.2 创建 Azure DevOps 项目
  • 2.3 创建服务连接
  • 2.4 替代变量

2.1 先决条件

本教程需要以下资源:

  • Azure 账号
  • 天蓝色 DevOps
  • Azure CLI (推荐,也用于故障排除)

随后,转到 Azure 门户并创建一个资源组,所有 Azure 资源都将部署在该资源组中。这也可以使用以下 Azure CLI 命令来完成:

az group create -n <<your resource group>> -l <<your location>>

2.2 创建 Azure DevOps 项目

Azure DevOps 是一个工具,可以持续地构建、测试和部署你的代码到任何平台和云。创建新项目后,单击存储库文件夹并选择导入以下存储库:

  • 【https://github.com/rebremer/blog-mlopsapim-git

也见下图。

2.2 将存储库添加到您的 Azure DevOps 项目中,图片由作者提供

2.3 创建服务连接

从 Azure DevOps 访问资源组中的资源需要服务连接。转到项目设置,服务连接,然后选择 Azure 资源管理器,另见下图。

2.3.1 将存储库添加到您的 Azure DevOps 项目,image by author

选择服务主体身份验证,并将范围限制到您之前创建的资源组,另请参见下图。

2.3.2 按作者将范围限制到资源组、图像

2.4 替代变量

转到您的 repo,找到[pipelines/german-credit-config.yml](https://github.com/rebremer/blog-mlopsapim-git/blob/master/pipelines/german-credit-config.yml)并修改值以指向您的工作区,也见下文

variables: 
  #
  ml_workspace_connection: '<<service connection created in 2.3>>'  
  ...
  # subscription 
  ml_subscription_id: '<<your subscription>>'
  ...
  # apim
  ml_apim_name: '<<your apim name'
  ml_apim_email: '<<your email address>>'
  ml_location: 'westeurope'
  ml_tenant_id: '<<your tenant id>>'

所有其他变量都可以替换,但这不是成功构建所必需的。MLOps 项目现在可以运行了。

3.使用 Azure API 管理部署 MLOps 管道

在这一章中,项目开始运行,MLOps 管道将被部署,生成安全端点作为主要工件。在这方面,需要做以下工作:

  • 3.1 MLOps 管道描述
  • 3.2 运行管道
  • 3.3 测试安全端点

3.1 MLOps 管道描述

在这个 git repo 中,创建了四个管道,它们将在下一章中运行。管道可以描述如下:

  • [pipelines/1-german-credit-infrastructure.yml](https://github.com/rebremer/blog-mlopsapim-git/blob/master/pipelines/1-german-credit-infrastructure.yml) -部署带有数据集的 Azure ML 工作区、VNET 的私有 AKS 集群和 Azure Api 管理
  • [pipelines/2-german-credit-train-and-register.yml](https://github.com/rebremer/blog-mlopsapim-git/blob/master/pipelines/2-german-credit-train-and-register.yml) -自动训练和注册模型
  • [pipelines/3a-german-credit-deploy.yml](https://github.com/rebremer/blog-mlopsapim-git/blob/master/pipelines/3a-german-credit-deploy.yml) -将训练好的模型部署到 AKS 集群,创建私有端点和密钥认证。密钥更新是部署过程的一部分。
  • [pipelines/3b-german-credit-apimoperation.yml](https://github.com/rebremer/blog-mlopsapim-git/blob/master/pipelines/3b-german-credit-apimoperation.yml) -部署暴露私有 AKS 端点的 APIM 端点。APIM 的用户身份验证基于 Azure AD。反过来,APIM 后端是 AKS 私有端点的一部分,密钥身份验证用于向 AKS 端点进行身份验证。密钥更新是部署过程的一部分。

在下一章中,将描述如何部署管道 1。对于其他三个管道,可以遵循类似的过程。

3.2 运行管道

转到您的 Azure DevOps 项目,选择管道,然后单击“新建管道”。转到向导,选择您之前创建的 Azure Repos Git 和 git repo。在“配置”选项卡中,选择“现有的 Azure Pipelines YAML 文件”,然后选择可以在 git repo 中找到的[pipelines/1-german-credit-infrastructure.yml](https://github.com/rebremer/blog-mlopsapim-git/blob/master/pipelines/1-german-credit-infrastructure.yml),也见下文。

3.2.1 在管道配置向导中,选择现有的 Azure 管道 YAML 文件,按作者排序的图像

一旦创建了管道,它就会立即运行,如下所示。

3.2.2 Azure DevOps 部署现代数据管道,图片由作者提供

作业运行后,部署所有资源并执行测试。随后,运行属于管道文件夹的所有其他管道,如 3.1 中所述。

如果所有管道都运行成功,那么在 API 管理中会创建一个 API,指向私有 AKS 集群的 URL

3.3 在 API 中成功部署,图像由作者提供

随后,score 操作使用 JWT 令牌验证来验证传入的 Azure AD 请求,并使用带密钥的命名值向 AKS 私有端点进行身份验证,另请参见[api_policy_template.xml](https://github.com/rebremer/blog-mlopsapim-git/blob/master/pipelines/scripts/api_policy_template.xml)

3.3.测试安全端点

在所有管道运行之后,部署一个由 API 管理器公开的端点。身份验证需要 Azure 承载令牌。通常,托管身份或服务主体用于创建承载令牌。在 github 中,可以找到一个用服务主体生成的承载令牌进行测试的例子。

作为一个快速测试,也可以决定使用以下 CLI 命令从已经登录的用户创建一个承载令牌。

az account get-access-token --query accessToken --output tsv

然后,令牌可以被复制并在下面的脚本(或 Postman)中使用

token = resp.json()['access_token']
#
url = 'https://<<your apim>>.azure-api.net/testprivv2/score'
#
test_data = {
  'data': [{
    "Age": 20,
    "Sex": "male",
    "Job": 0,
    "Housing": "own",
    "Saving accounts": "little",
    "Checking account": "little",
    "Credit amount": 100,
    "Duration": 48,
    "Purpose": "radio/TV"
  }]
}

headers = {'Content-Type':'application/json', 'Authorization': 'bearer ' + token}
resp = requests.post(url, json=test_data, headers=headers)

print("Prediction (good, bad):", resp.text)

4.结论

机器学习操作( MLOps )旨在部署和维护生产中的机器学习模型。MLOps 管道的一个常见工件是由最终用户应用程序使用的 REST 端点。在 blogpost 和 git repo [blog-mlopsapim-git](https://github.com/rebremer/blog-mlopsapim-git),中,讨论了一个项目,该项目 1)所有的基础设施,2)构建和训练一个模型,3a)部署模型作为端点,3b)保护端点,参见下面的体系结构。

4.架构概述,按作者列出的图像

如何使用 GitHub 操作将 dbt 部署到生产环境中

原文:https://towardsdatascience.com/how-to-deploy-dbt-to-production-using-github-action-778bf6a1dff6?source=collection_archive---------2-----------------------

如何将 dbt 部署到生产环境中。

由萨姆·劳埃德在 Unsplash 上拍摄的照片

随着现代数据栈的兴起,越来越多的人使用 dbt 作为数据转换的主要工具,也就是数据建模。Fishtown 的员工创造了一个令人惊叹的 dbt 云产品,能够满足大大小小的数据团队的需求。借助 dbt Cloud,任何分析师,无论是经验丰富的还是新手,都可以轻松地开始建模并将数据转换管道部署到生产中。

我强烈推荐看看 dbt Cloud,因为该产品不仅仅是帮助您部署 dbt。首先,让我们看看如何不应该将 dbt 部署到生产环境中。

不要做什么

有许多方法可以将 dbt 部署到生产环境中。然而,并不是所有的方法都是好的。以下是一些不太好的方法:

启动一个计算实例?

洛伦佐·埃雷拉在 Unsplash 上的照片

一种常见的方法是启动计算实例并安装所需的包。从这里,人们可以运行一个 cron 作业来按计划执行git pulldbt run

这是一个经典的过度解决方案,因为 dbt 不需要大量的资源来运行。dbt 实际做的是编译查询,并将它们发送到您的数据仓库并等待响应。如果您想要管道故障通知,您通常也必须自己实现。

此外,大多数时候,您的实例将会闲置浪费您的资金,因为 dbt 通常一天只运行几分钟到不到一个小时。使用此选项也没有简单的解决方案来实现 CI/CD。

好的,气流呢?

照片由 Michal Matlon 在 Unsplash 上拍摄

嗯,看情况。如果生产中还没有气流运行,现在可能就不需要了。还有比这更简单/优雅的解决方案(dbt Cloud,GitHub Actions,GitLab CI)。此外,这种方法与使用计算实例有许多共同的缺点,例如浪费资源,并且没有 CI/CD 的简单方法。

但是,如果您的团队使用 Airflow 或任何其他管道编排器,您可以考虑编写一个 dag 来触发 dbt。特别是当你在不同的时间间隔有不同的摄入,需要触发 dbt 或随后的任务时。

使用 dbt 云在生产中部署 dbt

在我看来,这是首选。借助 dbt Cloud,您拥有一个永远免费的开发人员席位,一个人的数据团队绝对可以利用这个席位。如果您的团队规模较大,您可以每人每月支付少量费用,并获得以下所有功能:

  • 基于浏览器的 IDE
  • 作业调度
  • 每日不限跑步次数
  • 记录和警报
  • 数据文档
  • GitHub 和 GitLab 集成
  • 源新鲜度报告
  • 根据拉取请求构建

使用 GitHub 动作在生产中部署 dbt

因为 dbt 总是使用 git 部署,所以利用您选择的 git 提供者的 CI/CD 功能是将 dbt 部署到生产环境的最佳方式。使用这种方法,您将获得很大的灵活性。

让我们看看如何使用 GitHub Action s 来做到这一点。免费配额对您和您的团队来说可能足够了,但是如果您有一个大型团队或者在其他项目中使用 GitHub Action,您可能会达到配额并需要升级。

为 GitHub 操作设置 dbt 配置文件

在您的存储库的根目录下创建一个profiles.yml文件。每次运行时,dbt 都会在 settings 中查找这个文件进行读取。

如果使用不同于 BigQuery 的数据仓库,请确保相应地更改参数。按照这里的指令,环境变量可以被定义为 GitHub 中的存储库机密。

注意,我们对不同的环境有两个不同的目标:dev 和 prod。运行 dbt run 将默认为 dev(由 target 键配置)。如果您想在 prod 目标上运行,请使用dbt run --target prod

设置凭据

在使用 GitHub 操作运行任何东西之前,您需要一个服务凭证来验证对您的数据仓库的访问。强烈建议您为此创建一个专用凭据,而不是使用您自己的帐户。这样,如果您由于某种原因无法访问您的帐户,该服务仍将运行。

请务必授予您的帐户必要的权限。在上面的例子中,我们使用 BigQuery,这意味着创建一个github-action服务帐户,授予它对数据源的读权限和对数据目的地的写权限。

如果您使用文件凭证(服务帐户而不是用户名和密码),您仍然可以像上面一样使用 GitHub secret,并使用echo命令将其写入文件。

dbt 按计划运行

您可以使用下面的模板来添加在 cron 时间表上运行的 GitHub Actions 作业。将此文件添加到您的 repo 中的.github/workflows/文件夹。如果文件夹不存在,请创建它们。

这个脚本将为大多数 dbt 工作流执行必要的步骤。如果您有另一个特殊命令,如 snapshot 命令,您可以在中添加另一个步骤。

使用 cron 调度触发该工作流。上面配置的计划意味着每天在 UTC 时间上午 5 点和下午 5 点运行工作流。所有时间都采用 UTC,因此您可能希望将时间表转换为您的本地时间。

就是这样,作业每天会被触发两次,如果作业失败会通知你。

合并时运行 dbt

许多开发团队的一个常见工作流程是,每当代码库发生变化时,就创建pull requests。对上面的yml文件进行简单的修改就可以实现这一点。

push:
    branches:
      - main

根据所需的行为,您可以为此创建一个新的工作流或将其与上面的工作流合并。将两者分开的一个常见用例是只运行在合并到 main 时发生变化的模型。这可以通过使用 dbt slim CI 特性来实现,这是另一篇文章的主题。

使用拉取请求进行测试

此事件的工作流脚本与上面的非常相似。一个主要的区别是,这个工作流将在开发环境而不是生产环境中运行。这确保了任何更改在部署到生产环境之前都经过验证、审查和测试。

您可以看到我们不需要指定目标,因为 dev 是我们的profiles.yml文件中的默认目标。每次有一个pull request到 main,这个工作流就会运行。

一次成功的工作流运行—作者提供的图片

在较小的型号上,GitHub Actions 只需要 1 分钟就可以完成所有工作。还不错!如果你有太多的模型或者太多的数据,那么每次都运行是没有意义的。我将在以后的文章中解决这个问题。

林挺与 sqlfluff

在编写 SQL 模型时,我错过的一件事是一个好的 linter。遵循一致同意的约定是很重要的,这样你的代码库就不会随着时间的推移而失去控制。使用 dbt 的林挺有点复杂,因为它实际上是使用不同方言的 Jinja SQL。

我们最终能够采用的一个好方法是 sqlfluff 。然而,它并不是 100%没有错误,所以要小心。您只需要运行pull requestmain工作流的 linter。为此,请将以下步骤添加到您的工作流程中:

我也在这里分享我们的 sqlfluff 配置,供你参考。

结论

这星期就这些了。我们涵盖了:

  • 为 GitHub 操作设置 dbt 和凭证
  • 在 cron 调度上运行 dbt
  • 对 main 的 pull 请求运行 dbt
  • 使用 sqlfluff 的林挺 dbt 代码

✌️

如何在 Streamlit 上部署交互式 Pyvis 网络图

原文:https://towardsdatascience.com/how-to-deploy-interactive-pyvis-network-graphs-on-streamlit-6c401d4c99db?source=collection_archive---------12-----------------------

使用 Python 在线发布您美丽的网络图,并简化它,让全世界都能看到并与之互动

作者图片

网络图的可视化有助于我们更好地理解多个实体之间的复杂关系。

除了静态图像,Python 库如Pyvis允许我们为网络可视化构建高度交互图形。与其让这些图表闲置在您本地的 Jupyter 笔记本和文件中,不如将它们部署到网上供其他人使用。

在本文中,我们将了解到 Pyvis 交互式网络图部署为 Streamlit web 应用程序,并让您的用户手动选择要可视化的节点。

在 pyvis BSD 许可下使用的网络|图像示例

内容

【1】目标【2】分步指南(3)总结**

(1)目标

Streamlit 是一个开源的 Python 库,可以轻松创建和共享用于数据科学的定制 web 应用。所有这些只需要几行代码就可以在几分钟内完成。

这个项目的目标是在线发布 Pyvis 网络图,以便用户可以访问 web app 并直接与图形进行交互。

本文基于 网络分析和药物-药物相互作用的可视化 项目。因此,我们将再次使用来自斯坦福网络分析项目http://snap.stanford.edu/biodata/datasets/10001/10001-ChCh-Miner.html的公开药物相互作用数据集。

****

要查看最终完成的网络图 web 应用程序,您将很快学会如何创建,请单击 此处 或观看下面的 gif

药物相互作用网络图应用程序演示|作者图片****

(2)分步指南

****步骤 1 —初始设置****

我们首先安装 Streamlit 和其他必要的 Python 网络库:

****pip install **streamlit** **pyvis** **networkx******

要确认 Streamlit 已经成功安装,您可以在命令提示符下执行streamlit hello:

作者图片

****步骤 2-文件夹结构和 Python 脚本****

我们通过创建如下所示的项目文件夹来设置项目的组件:

空荡荡的。py 文件( pyvis_network_app.py )构成了后续步骤中所有 Python 代码的主文件。**

****步骤 3-导入依赖关系和数据****

我们填充空白的。py 文件,方法是导入必要的依赖项和数据集。**

******# Import dependencies**
import streamlit as st
import streamlit.components.v1 as components
import pandas as pd
import networkx as nx
from pyvis.network import Network**# Read dataset**
df_interact = pd.read_csv('data/processed_drug_interactions.csv')****

步骤 4—定义布局

由于 Streamlit 应用程序本质上是一个网站,我们需要计划如何组织网站布局。例如,我们可以首先通过用st.title定义一个 title 元素来创建一个标题头:

******# Set header title**
st.title('Network Graph Visualization of Drug-Drug Interactions')****

我们还想让用户选择他们希望在网络图中可视化的项目(又名节点)。我们可以通过用st.multiselect定义一个多选下拉菜单 菜单来做到这一点。

这样,用户现在可以选择他们想要的节点。因为药品节点太多,我通过预选几个药品缩小了物品清单。

******# Define selection options and sort alphabetically**
drug_list = ['Metformin', 'Glipizide', 'Lisinopril', 'Simvastatin',
            'Warfarin', 'Aspirin', 'Losartan', 'Ibuprofen']
drug_list.sort()**# Implement multiselect dropdown menu for option selection**
selected_drugs = st.multiselect('Select drug(s) to visualize', drug_list)****

还有许多其他的网站元素供你使用(侧边栏,用户文本输入等。),所以查看 API 参考以获取更多信息。

******步骤 5 —流量控制******

st.multiselect返回用户从下拉菜单中选择的条目的 Python 列表。基于这些选择的项目,我们可以构建用户希望可视化的定制网络图。

我们实现了流控制,以便在初始站点加载时显示欢迎消息(当用户还没有选择任何项目时),并在用户选择了至少一个项目时生成网络图。

******# Set info message on initial site load**
if len(selected_drugs) == 0:
   st.text('Please choose at least 1 drug to get started')**# Create network graph when user selects >= 1 item**
else:
   # *Code for filtering dataframe and generating network*****

Streamlit 从上到下运行,因此当选择发生变化(例如,添加或删除项目)时,将基于新项目集生成新的网络图。

为了使本文简洁,上面省略了创建网络图的代码(在 else 语句中)。您可以在步骤 6 中的要点中查看完整的代码。

步骤 6 —在本地和 Streamlit 云上显示 HTML

生成的 Pyvis 网络图被导出为一个 HTML 文件,在读入 Streamlit 应用程序进行显示之前,我们会先将其保存到一个文件夹中。

在本地运行app时,我们可以创建一个指定的目标文件夹(如 /html_files )来保存网络图 html 文件。

然而,当部署在Streamlit Cloud(步骤 7 中有更多信息)上时,使用相同的目标文件夹https://discuss.streamlit.io/t/file-permisson-error-on-streamlit-sharing/8291****不起作用,因为目标路径而**不存在于 web 服务器上。******

为了解决这个问题,我们可以使用 Streamlit webserver 默认的临时文件夹 ( /tmp )来保存 HTML 文件。从那里,我们可以在加载 HTML 文件进行显示之前读取它。****

为了考虑本地和在线运行的场景,我们可以在我们的脚本中实现一个 try-except 块:

********# Save and read graph as HTML file (on Streamlit Sharing)**
try:
   path = '/tmp'
   drug_net.save_graph(f'{path}/pyvis_graph.html')
   HtmlFile = open(f'{path}/pyvis_graph.html','r',encoding='utf-8')**# Save and read graph as HTML file (locally)**
except:
    path = '/html_files'
    drug_net.save_graph(f'{path}/pyvis_graph.html')
    HtmlFile = open(f'{path}/pyvis_graph.html','r',encoding='utf-8')******

然后我们创建一个 Streamlit 组件 来显示 HTML 代码。

********# Load HTML into HTML component for display on Streamlit**
components.html(HtmlFile.read())******

要在本地查看应用程序,您可以在您的命令提示符中执行以下命令(从项目目录中):

******streamlit **run** pyvis_network_app.py******

完整的 Python 脚本:

第 7 步—在 Streamlit 云上部署

现在我们的 Python 脚本已经完成,我们可以在 Streamlit 共享 上部署我们的网络图。除了脚本,我们还需要在文件夹中包含一个requirements . txt文件。

在注册并收到邀请后,您可以登录并选择您的网络图 app 的 GitHub repo,然后点击部署按钮。

Streamlit 实际分享|在 Apache 许可证 2.0 下使用的图片

您的应用程序的网络链接基于您的 GitHub 帐户、回购和分行。比如这个 app 的链接是:【https://share.streamlit.io/】T2肯尼特伦蒂/pyvis-network-graph-streamlit/main/pyvis _ network _ app . py****

一旦部署完成,您就可以与全世界分享您的应用了!随后,每次您执行 Git 推送来更新 Python 脚本时,应用程序都会自动刷新以反映这些更改。****

Fernand De Canne 在 Unsplash 上拍摄的照片

(3)总结

在本文中,我们看到了如何在 Streamlit 的帮助下轻松地在线部署交互式 Pyvis 网络图。你可以在这里查看最终产品。

还有更多的功能可以增强用户的 Streamlit web 应用体验,所以请查看文档。您也可以在此 GitHub repo 中访问该项目的代码。

在你走之前

欢迎您加入我们的数据科学学习之旅!点击此媒体页面,查看我的 GitHub ,了解更多精彩的数据科学内容。享受在 Streamlit 上部署网络图的乐趣!

******

参考

  • 马林卡·齐特尼克,&朱尔·莱斯科维奇。(2018).生物快照数据集:斯坦福生物医学网络数据集集合
  • 使用 Streamlit 将 Excel 变成漂亮的 Web 应用程序******

如何将大规模深度学习模型部署到生产中

原文:https://towardsdatascience.com/how-to-deploy-large-size-deep-learning-models-into-production-66b851d17f33?source=collection_archive---------4-----------------------

部署具有 GB 规模的培训的深度学习模型,并将它们作为商业产品在线托管

部署大型深度学习模型——图片来自 Pexels 的亚历山大·奈特

学习如何将深度学习模型从本地机器作为离线产品部署到在线产品是非常重要的,但主要挑战之一是训练模型的大规模。这篇文章将展示在部署更大规模的深度学习模型时,不同的解决方案和方法。

训练后的深度学习模型

在选择了具有最佳调整和预测时间的最佳算法之后,您最终完成了模型的训练。
是时候告诉你的朋友你的成功并庆祝一下了,对吗?如果您希望在线部署模型,并快速预测响应和管理大规模的训练负载,则情况并非如此!

另一方面,Web 服务更便宜,可以提供免费空间来部署 ML 模型,但在规模方面有限制,如 Heroku Platform 和 Streamlit Cloud 或者,你必须为部署深度学习模型支付昂贵的服务。但同样,当涉及到需要 GPU 或 TPU 高计算能力的千兆字节训练模型时,大小将是一个巨大的挑战。

如果模型是在 GPU 或 TPU 云服务中训练的,则 CPU 性能可用性是一个问题。深度学习模型可能会遇到缓慢的在线处理,或者可供其他应用程序使用,例如通过 API 调用。并且由于深度学习模型的巨大规模和其他问题,例如在 TPU 上运行和训练模型以及在 CPU 上部署,因此很难部署深度学习模型。因此,选择如何部署具有与本地机器或 Colab 笔记本培训相同性能的云服务是硬件考虑的关键。

在深度学习中部署模型

通过使用像 Streamlit、 Flask 和 Django 这样的 Python 框架,有许多不同的方式将深度学习模型部署为 web 应用。然后,使用 Flask RESTful 为模型服务构建一个 REST API,以便与其他在线应用程序进行交互,并使您的模型在被调用时及时动作。(这里有一篇构建 API 的好文章)。

在构建了 web 应用程序接口之后,是时候将大尺寸的 TensorFlow 、 Keras 或 PyTorch 模型部署到真实环境中了。下面的例子使用 Streamlit 加载张量模型,但是通过阅读带下划线的特定库的文档,确保如何保存和加载您自己的模型。

大型训练模型存储在哪里,如何存储?

有许多方法,但让我们展示最常用和最容易使用的免费方法,但有基于您消费多少和存储数据的区域的限制(继续提供免费服务,然后您可以在免费订阅的基础上以更低的价格扩展它)。亚马逊 S3 和谷歌云存储可以归类为**【云存储】**工具。找到更多关于亚马逊 S3 和谷歌云存储的信息,创建一个存储桶(保存数据的容器)来存储你的 Gb 大小的模型。

  • 下面是一个使用 AWS S3 云存储 的例子
  • 在 GCP (Google 云平台)创建云存储的代码示例如下所示:
# Colab Notebook! Run code in each cell
from google.colab import auth
auth.authenticate_user()  # Authenticate your cloud account# your project ID in GCP ( from google console my project ) 
CLOUD_PROJECT = 'axial-trail-334'# storage name
BUCKET = 'gs://' + 'axial-trail-334' + '-tf2-safarji-model' 
print(BUCKET)# with $ or !gcloud config set project 'axial-trail-334'
!gcloud config set project $CLOUD_PROJECT # with $  (create the BUCKET)
!gsutil mb $BUCKET# Revoked credentia
ls!gcloud auth revoke --all## with $  (check BUCKET) 
!gsutil ls -r $BUCKET 

这样,您就可以将模型部署到 AI 平台上了。在人工智能平台中,模型资源包含不同版本的模型。模型名称在项目中必须是唯一的。首先,让我们创建一个模型。

# Create model in Google Cloud (GCP) after following above steps 
MODEL = 'newmodel-T5'!gcloud ai-platform models create $MODEL --regions=us-central1# check google
  • 在人工智能平台云平台,你会看到你的模型如下:

GCP 控制台——来自作者

  • 基于您的模型类型 TensorFlow 或其他创建您的模型部署版本。

GCP 控制台——来自作者

重要提示:如果保存模型的桶大小以 Gb 为单位非常大,由于大小超出限制,您将无法获得如下所示的 AI 平台服务。

GCP 控制台——来自作者

遗憾的是,此限制目前不可调整,但未来可能会调整。与此同时,您需要调整 vocab 和嵌入大小,或者减少模型的整体大小。此外,请联系谷歌云,根据您的项目名称调整每个项目的配额【cloudml-feedback@google.com】

*问题是他们的人工智能平台规模的大多数云提供商接受大型模型。

还有别的解决方法吗?

是的,您可以选择一个定制深度学习云实例 (VM)和大小来部署您的模型在 GPU 和 TPUs 方面所需的最佳要求。然而,存储模型的桶将是相同的,并通过 GCP 将它加载到新服务器的新实例中,或 AWS 实例中。

***最重要的是:***AWS 中还有另外一个服务,可以部署大型变形金刚:

https://aws.amazon.com/sagemaker/

云服务中的存储桶

在云服务中创建存储桶之后,是时候存储和加载模型了。下面是加载的一个片段:

注意:确保使用缓存和其他策略来优化基于您使用的框架的 web 应用程序中的模型加载,因为这将有助于避免每次使用或预测时再次调用模型所耗费的时间和带宽。

结论:

训练大规模的深度学习模型只是数据科学项目的一个方面,该项目投入大量精力使其在生产中(在线)可用。在这篇文章中,我们展示了在部署更大规模的深度学习模型时可以遵循的不同解决方案和方法。

根据您的应用程序,您可能需要选择一个可用选项,哪些云服务和哪些自定义实例支持模型部署和基础架构。然而,这篇文章只是我在部署大型深度学习模型时所经历的一个例子。但是我认为它为云服务和云存储工具方面的另一个概述提供了一个起点。生产中的深度学习模型还有很多其他后续动作,包括在 GPU 和 TPU 上的训练评测;然而,这些是为下一篇文章准备的。

参考资料:

https://cloud.google.com/ai-platform/prediction/docs/deploying-models https://aws.amazon.com/getting-started/hands-on/build-train-deploy-machine-learning-model-sagemaker/ https://www.tensorflow.org/tutorials/keras/save_and_load https://acloudguru.com/videos/cloud-provider-comparisons/cloud-provider-comparisons-aws-vs-azure-vs-gcp-storage?utm_campaign=11244863417&utm_source=google&utm_medium=cpc&utm_content=469352928666&utm_term=_&adgroupid=115625160932&gclid=Cj0KCQiA2NaNBhDvARIsAEw55hjHEBCHxdry4t-gA2qgkNZll1W-yT1ELlVPnKOkzP1e_0UgutXWVvMaAk9iEALw_wcB

这篇文章中的所有源代码以及更多内容可以在我的 GitHub 上找到:https://gist.github.com/A-safarji

如何部署机器学习模型

原文:https://towardsdatascience.com/how-to-deploy-machine-learning-models-601f8c13ff45?source=collection_archive---------2-----------------------

在网络上部署机器学习模型的最简单方法

介绍

我将介绍在 web 上部署机器学习应用程序的最简单的方法。在之前的笔记本中,我已经使用线性和基于树的模型建立了机器学习模型。事实证明,经过超调优的 XGboost 模型表现最佳。这就是为什么今天我们将使用 XGboost 构建一个鱼体重预测 web 应用程序。一般来说,部署 ML 模型有不同的选项,比如 Flask、Django、Streamlit 等。今天我将使用 Streamlit,因为这是最简单快捷的方法,而且不需要任何 web 开发知识。

ML 模型部署演示(作者供图)

∘ 简介
∘ 鱼重预测应用
∘ 是怎么做到的?∘结论:

鱼体重预测应用

你可以在这里看到演示。

这里可以看到 GitHub 代码。

怎么做到的?

有三个主要的 python 文件来构建应用程序。

作者照片

  1. model.py —构建 ML 模型并保存。

2。prediction.py —测试保存的 ML 模型。

3。main.py —运行 web 应用程序的主文件。

为了自己构建和部署 ML 项目,需要遵循以下 7 个步骤。

第一步:使用 Pycharm IDE 创建一个新的虚拟环境。

Pycharm IDE,作者照片

第二步:安装必要的库。

在这里的 requirements.txt 中,我创建了所有需要安装的库。您可以使用以下方式下载并安装该文件:

pip install -r /path/to/requirements.txt

或者您可以使用 pip 逐个安装每个库。

第三步:建立最佳机器学习模型并保存。

model.py 在这个文件中,我创建了一个机器学习模型,并保存为 JSON 文件 best_model.json 。

best_xgboost_model.save_model("best_model.json")

你可以在我的上一篇文章中看到 ML 模型是如何构建的详细解释。

第四步:测试加载的模型。

prediction.py 在这个文件中,我测试了加载的模型,并使用。

np.save('classes.npy', label_encoder.classes_)

第五步:创建 main.py 文件

  • 步骤 5.1 导入库和数据集
import streamlit as st
import pandas as pd
from sklearn.preprocessing import  LabelEncoder
import xgboost as xgb
import numpy as npst.header("Fish Weight Prediction App")
st.text_input("Enter your Name: ", key="name")
data = pd.read_csv("fish.csv")
  • 步骤 5.2:加载保存的标签编码器类
encoder = LabelEncoder()
encoder.classes_ = np.load('classes.npy',allow_pickle=True)
  • 步骤 5.3:加载保存的最佳模型
# load model
best_xgboost_model = xgb.XGBRegressor()
best_xgboost_model.load_model("best_model.json")
  • 步骤 5.4:在网页上显示数据帧

如果复选框被选中,显示训练数据

if st.checkbox('Show dataframe'):
    data

作者照片

  • 步骤 5.5:选择鱼种

从所有鱼的独特值中选择鱼的名称。

st.subheader("Please select relevant features of your fish!")
left_column, right_column = st.columns(2)
with left_column:
    inp_species = st.radio(
        'Name of the fish:',
        np.unique(data['Species']))

作者照片

  • 步骤 5.6:使用滑动窗口选择每个特征值
input_Length1 = st.slider('Vertical length(cm)', 0.0, max(data["Length1"]), 1.0)
input_Length2 = st.slider('Diagonal length(cm)', 0.0, max(data["Length2"]), 1.0)
input_Length3 = st.slider('Cross length(cm)', 0.0, max(data["Length3"]), 1.0)
input_Height = st.slider('Height(cm)', 0.0, max(data["Height"]), 1.0)
input_Width = st.slider('Diagonal width(cm)', 0.0, max(data["Width"]), 1.0)

作者照片

  • 步骤 5.7:制作预测按钮

一旦用户点击该按钮,物种输入将从文本转换为相关的数字,然后所有输入的特征与特定的形状连接起来,模型预测就完成了!

if st.button('Make Prediction'):
    input_species = encoder.transform(np.expand_dims(inp_species, -1))
    inputs = np.expand_dims(
        [int(input_species), input_Length1, input_Length2, input_Length3, input_Height, input_Width], 0)
    prediction = best_xgboost_model.predict(inputs)
    print("final pred", np.squeeze(prediction, -1))
    st.write(f"Your fish weight is: {np.squeeze(prediction, -1)} Gram")

作者照片

第六步:上传本地项目到 Github

您可以使用 git 上传您的本地项目,或者您可以将文件夹拖放到 GitHub 上的一个空存储库中。

第七步:在 细流 上创建账户

最后一步是创建一个账户,点击“从现有的 repo”连接到你的 GitHub 库

Streamlit,作者照片

结论:

没错,就是洒脱。在一般建筑中,机器学习应用主要由两部分组成。第一步是构建模型,第二步是部署和监控模型。今天,我们已经使用 Streamlit 完成了部署部分。这个简单的应用程序只是说明了该模型是如何部署的,它可以作为其他大型项目的样本。在下一篇文章中,我还将尝试使用另一种方法来部署 ML 模型。

如果你想了解更多关于应用数据科学的信息,这里是我的新 YouTube 频道——AI 学院与朋友

https://www.youtube.com/channel/UCvlF0PPaQ2GAuqYKJT4UpJQ

我希望你喜欢它,现在可以开始自己创建漂亮的应用程序。

如果你喜欢我的文章,想看即将到来的故事,请在 medium 上关注我。

https://medium.com/@gkeretchashvili

如何使用 FastAPI 将机器学习模型部署为微服务

原文:https://towardsdatascience.com/how-to-deploy-machine-learning-models-as-a-microservice-using-fastapi-b3a6002768af?source=collection_archive---------8-----------------------

使用 FastAPI 实施微服务| Ashutosh Tripathi | Data Science Duniya

截至目前,FastAPI 是使用 python 3.6+版本构建微服务的最流行的 web 框架。通过将机器学习模型部署为基于微服务的架构,我们使代码组件可重用、高度维护、易于测试,当然还有快速响应时间。FastAPI 是基于 ASGI(异步服务器网关接口)而不是 flask 的 WSGI (Web 服务器网关接口)构建的。这就是它比基于 flask 的 API 更快的原因。

它有一个数据验证系统,可以在运行时检测到任何无效的数据类型,并以 JSON 格式向用户返回错误输入的原因,这使得开发人员不必显式地管理这个异常。

在这篇文章中,我们的目标是在 FastAPI 的帮助下,将机器学习模型部署为微服务。所以我们会把重点放在那部分,而不是放在模型训练上。

github repository 中也提供了完整的源代码。你会在文章的末尾看到资源库的链接。

第一步。准备好您想要为其创建 API 的模型

为了创建用于预测的 API,我们需要准备好模型,因此我编写了几行代码来训练模型,并将其作为 LRClassifier.pkl 文件保存在本地磁盘中。我没有关注探索性的数据分析、预处理或特性工程部分,因为这超出了本文的范围。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import pickle# Load dataseturl = "[https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data](https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data)"names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']dataset = pd.read_csv(filepath_or_buffer=url,header=None,sep=',',names=names)# Split-out validation datasetarray = dataset.valuesX = array[:,0:4]y = array[:,4]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True)classifier = LogisticRegression()classifier.fit(X_train,y_train)save the model to diskpickle.dump(classifier, open('LRClassifier.pkl', 'wb'))load the model from diskloaded_model = pickle.load(open('LRClassifier.pkl', 'rb'))result = loaded_model.score(X_test, y_test)print(result)

Jupyter 上面的代码片段:

逻辑回归 python 代码片段

第二步。使用 FastAPI 框架创建 API

从头开始,这样就不会出现任何错误:

  • 打开 VS 代码或者你选择的其他编辑器。我使用 VS 代码
  • 使用文件菜单可以打开您想要工作的目录
  • 打开终端并创建虚拟环境,如下所示:
  • python -m venv venv 名称
  • 使用 venv-name\Scripts\activate 激活 venv

安装库:

  • pip 安装熊猫
  • pip 安装数量
  • pip 安装 sklearn
  • pip 安装 pick
  • pip 安装 FastAPI

导入库,如下面的代码所示。

  • 创建一个FastAPI“实例”并将其分配给 app
  • 这里的app变量将是FastAPI类的一个“实例”。
  • 这将是创建所有 API 的主要交互点。
  • 这个app就是下面命令中uvicorn所指的那个:

  • 这里 main 是你写代码的文件的名字。您可以给出任何名称,但必须是在命令中代替 main 执行时使用的名称。
  • 当您需要从客户端(比如说浏览器)向您的 API 发送数据时,您将它作为请求体发送。
  • 一个请求主体是客户端发送给你的 API 的数据。一个响应体是你的 API 发送给客户端的数据。
  • 您的 API 几乎总是要发送一个响应主体。但是客户端不一定需要一直发送请求体。
  • 为了声明一个请求体,你使用 Pydantic 模型及其所有的能力和好处。
  • 然后将数据模型声明为从BaseModel继承的类。
  • 对所有属性使用标准 Python 类型。
  • 在我们的例子中,我们希望预测鸢尾物种,因此将创建一个数据模型作为具有四个参数的类,这四个参数是物种的维度。
  • 现在创建一个端点,也称为名为“预测”的路由
  • 添加一个我们创建的数据模型类型参数“IrisSpecies”。
  • 现在,我们可以将数据作为 json 发布,它将在 iris 变量中被接受。
  • 接下来,我们将在变量 loaded_model 中加载已经保存的模型。
  • 现在,按照我们在机器学习中的方式执行预测,并返回结果。
  • 现在你可以运行这个应用程序,并看到 FastAPI 创建的漂亮的用户界面(UI ),它使用现在称为 openAPI 的 Swagger 作为后端来设计文档和 UI。
  • 下面给出了完整的代码,你可以简单地复制和粘贴,它将工作,如果你遵循上述步骤正确。
from fastapi import FastAPI
from pydantic import BaseModel
import pickle
import numpy as np
import pandas as pdapp = FastAPI()class IrisSpecies(BaseModel):sepal_length: floatsepal_width: floatpetal_length: floatpetal_width: float@app.post('/predict')async def predict_species(iris: IrisSpecies):data = iris.dict()loaded_model = pickle.load(open('LRClassifier.pkl', 'rb'))data_in = [[data['sepal_length'], data['sepal_width'], data['petal_length'], data['petal_width']]]prediction = loaded_model.predict(data_in)probability = loaded_model.predict_proba(data_in).max()return {'prediction': prediction[0],'probability': probability}

VS-API 创建的代码片段:

执行应用程序:

现在,如果您可以看到通过输入 url 创建的漂亮的 UI:127 . 0 . 0 . 0:8000/docs

下面您会看到 API 端点是作为 POST 请求创建的。

点击终点,它将展开如下。

现在点击尝试一下,粘贴尺寸得到预测。

我粘贴了一些虚拟尺寸,然后点击执行。

现在你可以看到它已经以 99%的准确率预测出它是鸢尾花。

您可以从任何地方直接调用这个 api,如下所示:

import requestsnew_measurement = {"sepal_length": 1.2,"sepal_width": 2.3,"petal_length": 1.4,"petal_width": 2.8}response = requests.post('[http://127.0.0.1:8000/predict](http://127.0.0.1:8000/predict)', json=new_measurement)print(response.content)>>> b'{"prediction":"Iris-setosa","probability":0.99}'

所以这就是使用 FastAPI 创建 API 的全部内容。

FastAPI 还提供了自动创建的精美文档。只需在浏览器中输入 127.0.0.0:8000/redoc

Github 资源库包含完整的源代码,请点击此处。

本文到此为止。希望你喜欢阅读。分享您对 FastAPI 体验的想法。此外,您可以使用注释来询问在实施过程中是否有任何问题。

由于您已经到达这里,这表明您对机器学习模型部署感兴趣,因此为什么不也阅读这篇文章呢:

可能让你损失惨重的 5 个模型部署错误

推荐文章:

  • 使用 Python |机器学习构建逻辑回归模型的分步指南
  • 主成分分析完全指南——机器学习中的 PCA
  • K-最近邻算法完全指南——使用 Python 实现 KNN
  • 参考 Python 笔记本,了解适合初学者的重要 ML 算法

原载于 2021 年 2 月 15 日 http://ashutoshtripathi.comhttps://ashutoshtripathi.com/2021/02/15/how-to-deploy-machine-learning-models-as-a-microservice-using-fastapi/

如何部署机器学习模型

原文:https://towardsdatascience.com/how-to-deploy-machine-learning-models-ec50d3daf365?source=collection_archive---------5-----------------------

逐步概述

作者创建的图像

Jupyter 笔记本是机器学习模型死亡的地方。

等等——什么?

与你可能在大学里学到的不同,在 Jupyter 笔记本或 R Studio 脚本中构建模型只是这个过程的开始。如果你的流程以笔记本中的模型结束,那么这些模型几乎肯定不会为你的公司创造价值(有些例外可能是它只用于分析或者你在网飞工作)。

这并不意味着你的模型不优秀。我肯定他们是。但这可能确实意味着付钱给你的人对结果并不超级兴奋。

一般来说,公司不关心最先进的模型,他们关心的是真正为客户创造价值的机器学习模型。

从笔记本中的优秀模型到可以集成到产品的一部分或由非技术用户访问的模型的过程是我在这篇文章中想要谈论的。

所以,如果你想让你的模型不再死在笔记本上,并真正创造价值,请继续读下去。

模型是代码,代码需要被信任

您的第一步将是让您的代码达到一个您可以放心投入生产的质量水平。我想强调这一步中应该发生的 3 件重要的事情:有一个好的自述文件,编写干净的函数,测试你的代码。

好的读物非常重要。他们应该允许任何人(包括你自己)容易地看到为什么写这个代码,做了什么假设,存在什么约束,以及如何使用代码。对于机器学习代码,你还应该描述和/或链接到已经运行的实验,这样人们就可以查看创建你的模型的过程。不要害怕在你的阅读材料中加入图片、gif 和视频。它们有助于更容易理解。

这篇文章不会教你写干净的函数所需要知道的一切。但是需要记住一些重要事项:

  • 使用易于理解的函数和变量名
  • 函数应该只做一件事
  • 包括文档和使用类型
  • 使用 PEP8 等风格指南

最后,但同样重要的是,您需要测试您的代码!测试可以让你确信你的代码如预期的那样运行,并且当你进行修改时,你实际上没有破坏任何东西。最简单的起点是单元测试。对于 Python,查看 pytest 和 unittest 库来管理您的测试。

将你的代码容器化

你可能听说过 Docker。Docker 是迄今为止开发人员最流行的封装代码的方式。但是 Docker 是什么?Docker 在其网站上声明:

容器是一个标准化的软件单元,它允许开发人员将他们的应用程序从环境中隔离出来,解决了“它在我的机器上工作”的头痛问题。对于今天数百万的开发者来说,Docker 是构建和共享容器化应用的事实标准。

Docker 是一种容器化你的应用程序的方式,容器化将你的应用程序从它的环境中隔离出来。简单地说,这意味着如果你能让你的代码在本地机器上的 Docker 中运行,那么它应该能在任何地方运行。这一点变得越来越重要,因为许多人转向 AWS 等云提供商来部署他们的应用程序。

首先,下载 Docker,创建一个 Docker 文件,告诉 Docker 如何为您的应用程序构建环境,从您的 Docker 文件构建您的 Docker 映像,最后运行您的 Docker 映像。

每一个步骤都有些复杂,但是只要看看 Docker 网站上的入门教程,你就能很好地将代码装入 Docker。

使您的模型易于访问

作者创建的图像

你现在有了干净的、容器化的代码,但是没有简单的方法让你的用户与你的机器学习模型交互。

解决这个问题最简单的方法是将你的模型放在一个 API 后面,并通过一个网页公开它。

应用程序接口(API)是一种允许应用程序与您的代码(在我们的例子中是模型)进行交互的方式。例如,如果您为一个分类模型创建一个 API,那么您的 API 将接收必要的数据来进行预测(通常是 JSON 格式的),然后返回基于这些数据的预测。API 有用的原因有很多,但最重要的一个原因是它在代码和用户界面之间建立了分离。您通常通过 web 请求与 API 进行交互。

Python 有两个很棒的库,让这个过程变得非常简单。首先,FastAPI 使得为您的模型创建 API 变得非常简单。其次,Python 中的请求库使得与 API 的通信变得容易。

一旦有了模型的 API,就需要为用户创建一个前端应用程序。许多数据科学家害怕这一步,因为他们对如何创建网站知之甚少或一无所知。还好有解决的办法!Streamlit Python 库。Streamlit 是一个库,允许您在不了解任何网站创建知识的情况下用 Python 创建 web 应用程序。他们也有很棒的文档,所以去看看,开始为你的模型构建你的 web 应用程序。

至此,您已经有了后端 API 代码、前端 web 应用程序和连接两者的 web 请求。将这些作为单独的应用程序,使用 Docker 进行容器化。

部署到云

到目前为止,您的所有工作都是在本地机器上完成的。如果事情进展顺利,您的机器上运行着一个前端 web 应用程序,允许您访问您的机器学习模型预测。

但问题是,只有可以访问这个网络应用!

为了解决这个问题,我们将把你的应用程序部署到云中,因为你已经把你的代码容器化了,这个过程实际上非常简单。

三个主要的云提供商是 AWS、谷歌云和微软 Azure。它们都提供了非常相似的功能,对于学习来说,你不会真的挑错。我建议你选择目前免费额度最多的云。

无论您选择哪种云,我都会首先关注他们的平台即服务产品。谷歌有谷歌应用引擎,亚马逊有弹性豆茎,微软有 Azure 应用服务。所有这些服务都让您可以轻松地将 Docker 容器部署到云上。

一旦您的 web 应用程序和 API 容器部署到这些平台,您将拥有一个公共 URL,您或任何人都可以访问它来与您的机器学习模型进行交互。恭喜你!

如何了解更多

我希望这篇关于如何部署机器学习模型的概述能够帮助您理解部署模型的基本步骤。当谈到这个过程时,几乎有无限的复杂性,如果你想获得更深入的概述,请查看这个免费课程。

如何在 Kubernetes 上简单部署

原文:https://towardsdatascience.com/how-to-deploy-on-kubernetes-in-simple-words-aba6f42cc888?source=collection_archive---------42-----------------------

行业笔记

在 Kubernetes 集群上部署 web 应用程序的行动手册

由乔尔·里维拉-卡马乔在 Unsplash 上拍摄的照片

我最近在 RapidAPI 上开发了一个名为 Owl 的上下文化的最相似单词 API 服务。这对我来说是一个伟大的旅程,所以我决定与你分享它发展的各个阶段。在本文中,我想分享一个关于如何使用 Kubernetes** 部署容器化 web 应用程序的分步指南(创建、连接、部署和公开)**。您可以在您的数据科学项目以及您正在开发的任何其他 web 应用程序中使用该指南。如果你想了解更多关于 OWL API 的内容,你可以阅读这篇文章:如何计算单词相似度——比较分析。

在本文中,我想分享关于如何使用 Kubernetes 部署容器化 web 应用程序的分步指南(创建、连接、部署和公开)。

https://www.amazon.com/gp/product/B08D2M2KV1/ref=dbs_a_def_rwt_hsch_vapi_tkin_p1_i0

第 0 步—为什么选择 Kubernetes?->可扩展性🔑

在我构建 OWL API 的过程中,为了构建一个比当前解决方案更好的“最相似单词”服务,我面临了许多 NLP 挑战。除了这些挑战,我还需要部署 OWL API ,这样它就可以管理 大量的 API 请求。我本可以使用简单的 VPS(虚拟专用服务器)进行部署,但我确信我很快就会面临可扩展性问题。这就是我决定使用 Kubernetes 技术的原因。

Kubernetes 是一个开源容器编排器,用于容器化应用程序的可伸缩部署。

所以,我假设您已经准备好部署一个容器化的应用程序。您面临的问题是如何部署它,以便它可以在需要时以最少的参与进行扩展。

步骤 1—如何“创建”Kubernetes 集群?

—我应该使用哪种云基础架构?☁

您必须使用您所使用的云基础设施的控制面板来创建 Kubernetes 集群。我最近和 OVH 云和谷歌云合作过。在这两个集群上创建 Kubernetes 集群的过程很简单,但是有所不同。你应该找到他们自己的指南,在那里他们描述得很透彻。例如,您可以在下面的链接中找到创建集群的 OVH 指南。

https://docs.ovh.com/ca/en/kubernetes/creating-a-cluster/

OVH 是一家法国云计算公司,提供 VPS、专用服务器和其他网络服务。他们是世界上最大的云提供商之一,但不如 GCP 或 AWS 有名。我也不知道他们直到几个月前,但我强烈推荐他们,因为 OVH 的界面是用户友好的,其成本更合理的竞争对手,如 AWS 或 GCP。如果你没有充分的理由使用 AWS 或 GCP,我强烈推荐 OVH 云。

—在哪里🍄魔法🍄会发生什么?->负载平衡器

为了确保您的 Kubernetes 集群可以在需要时扩展,请确保在此步骤中启用自动扩展选项。另外,选择您希望在集群中运行的节点的正确数量。随着您向群集中添加的节点数量的增加,每月成本也会增加。

你可以在 OVH 获得的 Kubernetes 服务是一种托管的 Kubernetes 服务,这主要意味着在需要时自动管理扩展。神奇的是由一个名为负载平衡器的节点完成的,这个节点将所有到达的任务分配到一组资源上,以使整个过程更有效地工作。负载平衡有不同的策略,这不是本文的重点。所以,这里不多描述了。

步骤 2—如何“连接”到 Kubernetes 集群?

—“kube config”就是你所需要的!(几乎所有😃)

创建 Kubernetes 集群后,您必须能够从控制面板下载一个**【key】**来从远程机器连接到集群。密钥主要是一个YAML文件,其中包含连接到 Kubernetes 集群所需的一切(例如,集群地址和所需的凭证)。您不能更改或修改该文件中的任何值。所以,你只需要从控制面板中找出必须下载的地方。

为了在远程机器和 Kubernetes 集群之间建立一个经过验证的连接,您需要这个文件。此密钥的格式在 GCP 或 OVH 等云基础架构中有所不同,这在现阶段并不重要。唯一重要的事情是您必须将该文件保存在一个安全的地方,并将KUBECONFIG环境变量的值设置为该文件的地址。如果使用 Linux 终端,可以使用下面的代码设置KUBECONFIG的值。

export KUBECONFIG=\\path\\to\\config\\kubeconfig.yml

—还需要一样东西:“KUBECTL”👍

一旦将KUBECONFIG环境变量的值设置为相应文件的地址,就可以开始使用 Kubernetes 集群了。Kubernetes 命令行工具或kubectl是您开始使用集群所需的全部工具。kubectl允许您对 Kubernetes 集群运行命令,例如,部署应用程序或检查集群资源。不过如何安装 **kubectl** **?**你可以阅读这篇文章的作者写的。

kubectl(即 Kubernetes 命令行工具)允许您对 Kubernetes 集群运行命令,例如部署应用程序或检查集群资源。

步骤 3—如何在 Kubernetes 集群上“部署”?

在前面的步骤中,您创建了一个 Kubernetes 集群,并构建了一个经过身份验证的连接来使用它。现在,您必须在集群上部署容器化的应用程序。

—创建部署清单😮

请不要混淆!“manifest”只是一个YAML文件,其中的部署细节如“如何映射外部端口?如何设置环境变量?”决心已定。您可以将下面的代码用作部署清单的模板。

apiVersion: v1
kind: Service
metadata:  
  name: MY-SERVICE  
  labels:    
    app: MY-APP
spec:  
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  - port: 443
    targetport: 443
    protocol: TCP
    name: https
  selector:
    app: MY-APPapiVersion: apps/v1
kind: Deployment
metadata:  
  name: MY-DEPLOYMENT
  labels:
    app: MY-APP
spec:  
  replicas: 1
  selector:
    matchLabels:
      app: MY-APP
  template:
    metadata:
      labels:
        app: MY-APP
    spec:
      containers:
      - name: MY-APP
        image: IMAGE-NAME
        ports:
        - containerPort: 80

关于上述部署清单的几点说明如下。

  • 端口 80 和 443 在LoadBalanacer节点上打开。因此,如果您想在https上运行 web 应用程序,相应的端口(即 443)是打开的。
  • MY-SERVICEMY-APPMY-DEPLOYMENT必须替换为您想要在项目中使用的名称。您在此处分配的内容将在步骤 4 中使用,在该步骤中,您要将群集公开到 internet。
  • 必须用您想要部署的容器化应用程序的完整名称/地址来替换IMAGE-NAME。如果你需要动态地改变这个变量的值,把它声明为一个环境变量(即$IMAGE-NAME)并使用[envsubst](https://www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html)库。

—提交部署 Manifest🧨

要进行部署,您必须使用kubectl向 Kubernetes 集群提交部署清单文件,如上所述。对于第一轮部署,您必须使用kubectl apply命令,而在下一轮部署中,您必须使用kubectl replace命令。为什么?因为您基本上是用集群上已经存在的版本替换一个新版本!您可以使用下面的代码提交一个replace命令。

kubectl replace -f path/to/manifest/manifest.yml

完成这一步后,运行kubectl get services。如果服务部署正确,您将会看到如下结果。

NAME         TYPE         CLUSTER-IP   EXTERNAL-IP  PORT(S)     AGE kubernetes   ClusterIP     X.X.X.X     <none>       443/TCP      X
MY-SERVICE   LoadBalancer  X.X.X.X     <none>          X         X

步骤 4—如何向互联网“公开”Kubernetes 集群?🔥

**祝贺你!你差不多完成了。**在步骤 3 中,您部署了应用程序。唯一剩下的事情就是将负载平衡器节点暴露给互联网。换句话说,您应该为 LoadBalancer 节点获取一个公共 IP,让流量通过它。尝试使用下面的代码将 internet 流量打开到 LoadBalancer 节点。

kubectl expose deployment MY-DEPLOYMENT --type=LoadBalancer --name=MY-SERVICE

获取公共 IP 需要几秒钟。然后,尝试kubectl get services找出服务可用的外部 IP!现在,您已经完全完成了部署过程!🎉

遗言

在各种情况下,您可能需要删除 Kubernetes 集群。例如,您想要部署最新的版本,并且您按照书上说的做每件事。然而,部署没有通过。在这种情况下,集群很有可能被锁定在不健康的状态,无法正确响应您的命令。您必须删除集群。要删除 Kubernetes 集群,您必须删除ServiceDeployment对象。您可以使用命令kubectl delete deployments MY-DEPLOYMENTkubectk delete services MY-SERVICE

请注意,删除过程总是会产生一些不必要的后果,例如负载平衡器节点的外部 IP 发生变化。因此,在决定删除集群时,一定要小心谨慎。

最后一件事。在本文中,我旨在帮助您尽快在 Kubernetes 集群上部署应用程序。然而,你可以在 Kubernetes 的官方文档中找到更多关于 Kubernetes 的信息。希望你喜欢这篇文章!

感谢阅读!❤️

如果你喜欢这个帖子,想支持我…

  • 跟我上
  • 亚马逊 上查看我的书!
  • 成为 中的一员
  • 连接上Linkedin
  • 关注我的 推特

https://pedram-ataee.medium.com/membership

如何在 Heroku 上免费部署 FastAPI 应用程序

原文:https://towardsdatascience.com/how-to-deploy-your-fastapi-app-on-heroku-for-free-8d4271a4ab9?source=collection_archive---------5-----------------------

如何让您的应用全天候保持活跃

图片来自 Pixabay 的 mohamed_hassan

注意:Heroku 免费版本不再提供。请阅读 从 Heroku 到 Deta 免费托管 Python 项目 免费托管 FastAPI。

介绍

Heroku 是一个云平台即服务(PaaS),支持 Ruby on Rails、Java、Node.js、Scala、Clojure、Python、PHP 和 Go。Heroku 的免费版本每月提供 550-1000 dyno 小时。如果没有人使用你的应用程序,你的应用程序会在 30 分钟后休眠。如果你的每月动态时间在限制范围内,你的应用程序将永远免费。

Dynos 是 Heroku 平台上隔离的虚拟化 Linux 容器。

在本文中,您将了解到在 Heroku 上设置和运行 FastAPI 项目并使其全天候活动是多么容易。

我目前在 Heroku 主持这个 FastAPI 网站作为演示。

**Table of Contents**
· [Introduction](#fa53)
· [Git](#d66a)
· [Setting up Your Heroku Account](#6e50)
· [How to Create the requirement.txt for FastAPI on Heroku](#9e18)
· [runtime.txt](#eb9a)
· [Procfile](#0457)
· [Environment Variables](#8642)
· [How to Upload to Heroku](#73c2)
· [How to Add a Subdomain](#5bbe)
· [How to Keep Your App Active 24/7](#3c12)
  ∘ [cron-job.org](#7cd1)
· [How to fix a failed cron-job](#b1d7)
  ∘ [Kaffeine](#beb1)
· [How to Rename Your App](#6ba6)
· [How to ssh to Heroku](#c69f)
· [Conclusion](#fc09)
· [Newsletter](#ad04)
· [References](#2fbb)

饭桶

我使用 Gitstart 来自动化 Git 初始化。从您的终端,它运行git init。添加.gitignore和 README 文件,并提交一条消息。这在 Github 中创建了一个新的 repo,它会推送所有的文件。

$ mkdir my_new_project
$ cd my_new_project
$ gitstart

设置您的 Heroku 帐户

个人账户每月有 550 小时的免费动态时间。除了这些基本小时数之外,使用信用卡[1]进行验证的帐户还将获得额外的 450 小时,添加到每月免费动态配额中。[2]

你需要给 Heroku 添加 SSH 密钥。[3]
安装 Heroku CLI [4]
然后从您的终端登录 Heroku 并创建一个 Heroku 应用程序:

$ heroku login
$ heroku create

heroku 创造产出。图片作者。

您可以向 Heroku 应用程序添加自定义域。[5]

如何在 Heroku 上为 FastAPI 创建 requirement.txt

Heroku 需要requirement.txt来安装你的 Python 包。pipreqs [6]基于项目中的导入生成它。

$ pip install pipreqs
$ cd my_new_project
$ pipreqs ./
# if you already have the requirement.txt
$ pipreqs --force ./

由于pipreqs是基于import生成的,您需要手动将以下内容添加到requirements.txt中。

uvicorn==0.12.3
aiofiles==0.6.0
python-multipart==0.0.5
jinja2==2.11.2

你需要uvicorn来启动 Heroku 上的 ASGI 服务器。静态文件需要使用aiofiles。如果你的项目有一个表单,添加python-multipart。如果您的项目使用模板引擎,添加jinja2

runtime.txt

Heroku 使用默认的 Python 版本。为了使用某个 Python 版本,在你的 Python 版本中添加runtime.txt。例如:

python-3.8.6

Procfile

Heroku 需要 Procfile。[7]

如果应用程序目录中有main.py ,则添加以下内容:

web: uvicorn app.main:app --host=0.0.0.0 --port=${PORT:-5000}

如果根目录中有main.py:

web: uvicorn main:app --host=0.0.0.0 --port=${PORT:-5000}

环境变量

Heroku 不使用.env文件。相反,将.env文件中的值添加到配置变量中。您可以在“设置”选项卡下找到它。

向配置变量添加环境变量。图片作者。

如何上传到 Heroku

现在,您已经准备好将您的项目推向 Heroku:

$ git push heroku main
$ heroku open

heroku open命令在浏览器中打开您的项目。

git 在终端上推 heroku main。图片作者。

如何添加子域

我正在使用 Cloudflare,这是我必须要做的。

选择“CNAME”作为类型。为该名称添加您的子域名。为内容添加您的 Heroku 域。你的 Heroku 域名有点像,serene-example-4269.herokuapp.com。

下图显示了如何添加toolbox.mywebsite.com子域。

向 Cloudflare 添加子域。

如何让您的应用全天候保持活跃

30 分钟不活动后,Heroku 应用程序进入空闲状态。您可以使用heroic ps找到您的应用程序流程。

heroku ps 输出显示空闲。图片作者。

你可以在最后一行找到“闲置”。

这是我的另一个应用程序进程状态,显示为“启动”。

heroku ps 输出出现。图片作者。

cron-job.org[8]和凯费恩[9]提供免费服务。双方都会在预定的时间访问您的 URL。

cron-job.org

您可以通过添加 URL 和执行时间表来创建 cronjob。

cron-job.org 克朗乔布斯标签。图片作者。

对于您的 cronjob,您需要每 15 分钟选择一次。如果每 30 分钟设置一次,可能会延迟 5 到 15 秒。

为 cronjob 选择每 30 分钟一次。图片作者。

您可以轻松编辑或删除您的 cronjob。

如何修复失败的 cron 作业

您的 cron-job 可能无法告知“响应数据太大”或“输出太大”。

作者图片

cron-job.org 从您的 URL/脚本接受高达 4 kB 的响应数据。要解决这个问题,您可以创建一个返回 JSON 字符串而不是 HTML 页面的端点。

卡夫芬

Kaffeine 每 30 分钟对你的 Heroku 应用进行一次 pings 操作,这样它就永远不会进入睡眠状态。

Kaffeine 网站。

如何从 Kaffeine 移除你的应用

网站中的链接不起作用,但如果你点击下面的链接,它对我有用。

http://kaffeine.herokuapp.com/#decaf

从 Kaffeine 移除您的应用程序。

如何重命名您的应用程序

$ heroku apps:rename new_app_name

当你重命名你的应用程序时,不要忘记更新你的 cron 作业

如何向 Heroku 宋承宪

你可能想对 Heroku 说些什么。heroku ps:exec确实如此。

$ heroku ps:exec
Establishing credentials... done
Connecting to web.1 on ⬢ demo-desuyo...
~ $

结论

Heroku 为您的项目提供最长 1000 小时的免费托管,该项目使用的内存低于 512MB。你可以用你的域名。如果您需要自定义域上的 SSL,您需要升级到爱好层。

cron-job.org 和卡夫丁峡谷提供了一个 cronjob 访问您的网址,以避免睡眠。

通过 成为 会员,获得媒体上所有故事的访问权限。

请订阅。

参考

  1. 账户验证
  2. 自由动态小时数
  3. SSH 按键
  4. Heroku CLI
  5. 为应用程序定制域名
  6. pipreqs
  7. 过程文件
  8. cron-job.org
  9. 卡夫芬

如何使用 PostgreSQL 导出汇总统计数据

原文:https://towardsdatascience.com/how-to-derive-summary-statistics-using-postgresql-742f3cdc0f44?source=collection_archive---------2-----------------------

使用 PostgreSQL 导出数值和分类字段的汇总统计数据

活动发起人在 Unsplash 上的照片

在本文中,我们将讨论如何使用 SQL 获得数字和分类列/字段的汇总统计数据。我们将使用从 Tableau 公共样本数据集下载的网飞电影和电视节目数据集(https://public.tableau.com/en-us/s/resources并转到样本数据**)。**该数据集由截至 2019 年网飞可用的电视节目和电影组成,由 Tableau 从 Kaggle 获取,数据集的更新版本可在 Kaggle 上找到。然而,对于本文,我们将使用在 Tableau 样本数据集中可用的旧版本,并将其导入到 Postgres 中。本文假设读者对 SQL 查询和统计有基本的了解。下面是我们将在整篇文章中使用的 网飞 _titles 的快照。

网飞 _ 标题表(图片由作者提供)

数字变量的汇总统计

常用的数字变量汇总统计有均值、中值、最小值、最大值、范围、标准差、方差、Q1、Q3、IQR 和偏度。

的意思是

在 PostgreSQL 中,使用 AVG() 函数计算数值字段/列的平均值。我们将计算 持续时间 _ 分钟 字段的平均值,如下所示。

**SELECT** 
 **AVG**(duration_minutes) **AS** mean
  **FROM** netflix_titles;

作者图片

中间值

在 PostgreSQL 中,没有直接计算数值字段/列的中值的函数。然而,由于中位数是第 50 个百分位数,我们可以用它来代替中位数。使用 PERCENTILE_CONT() 函数计算数值变量的百分比。我们将计算 持续时间 _ 分钟 字段的中值,如下所示。

**SELECT 
 PERCENTILE_CONT**(0.5) **WITHIN GROUP** (**ORDER BY** duration_minutes) **AS** median
  **FROM** netflix_titles;

作者图片

WITHIN GROUP 子句创建可用于执行聚合的有序数据子集。 PERCENTILE_CONT 将所需的百分位作为参数,本例中为 0.5,即第 50 个百分位。

最小值

在 PostgreSQL 中,使用 MIN() 函数找到数值字段/列的最小值。我们将找到duration _ minutes字段的最小值,如下所示。

**SELECT** 
 **MIN**(duration_minutes) **AS** min 
  **FROM** netflix_titles;

作者图片

最大值

在 PostgreSQL 中,使用 MAX() 函数找到数值字段/列的最大值。我们将找到duration _ minutes字段的最大值,如下所示。

**SELECT** 
 **MAX**(duration_minutes) **AS** max 
  **FROM** netflix_titles;

作者图片

范围

在 PostgreSQL 中,没有直接计算数值字段/列范围的函数。然而,由于范围是最大值和最小值之间的差值,我们可以用它作为范围的代理。

**SELECT** 
 **MAX**(duration_minutes) - **MIN**(duration_minutes) **AS** range
    **FROM** netflix_titles;

作者图片

标准偏差

在 PostgreSQL 中,使用 STDDEV() 函数计算数值字段/列的标准偏差。我们将计算 持续时间 _ 分钟 字段的标准偏差,如下所示。

**SELECT** 
 **ROUND**(**STDDEV**(duration_minutes), 2) **AS** standard_deviation
    **FROM** netflix_titles;

作者图片

我们还可以将标准差计算为方差的平方根,如下所示。

**SELECT** 
 **ROUND**(**SQRT**(**VARIANCE**(duration_minutes)), 2) **AS** stddev_using_variance
    **FROM** netflix_titles;

作者图片

差异

在 PostgreSQL 中,使用 VARIANCE() 函数计算数值字段/列的方差。我们将计算 持续时间 _ 分钟 字段的方差,如下所示。

**SELECT** 
 **ROUND**(**VARIANCE**(duration_minutes), 2) **AS** variance
    **FROM** netflix_titles;

作者图片

我们也可以将方差计算为标准差的平方,如下所示。

**SELECT** 
 **ROUND**(**POWER**(**STDDEV**(duration_minutes), 2), 2) **AS** variance_using_stddev
    **FROM** netflix_titles;

作者图片

Q1

在 PostgreSQL 中,没有直接计算数值字段/列的第一个四分位数(Q1)的函数。然而,由于 Q1 是第 25 个百分点,我们可以用它来代表 Q1。我们将计算 持续时间 _ 分钟 字段的 Q1,如下所示。

**SELECT**
 **PERCENTILE_CONT**(0.25) **WITHIN GROUP** (**ORDER BY** duration_minutes) **AS** q1
    **FROM** netflix_titles;

作者图片

Q3

在 PostgreSQL 中,没有直接计算数值字段/列的第三个四分位数(Q3)的函数。但是,由于第 3 季度是第 75 个百分点,我们可以用它来代替第 3 季度。我们将计算 持续时间 _ 分钟 字段的 Q3,如下所示。

**SELECT**
 **PERCENTILE_CONT**(0.75) **WITHIN GROUP** (**ORDER BY** duration_minutes) **AS** q3
    **FROM** netflix_titles;

作者图片

IQR

在 PostgreSQL 中,没有直接计算数值字段/列的四分位间距(IQR)的函数。然而,由于 IQR 是第三季度和 Q1 之间的差异,我们可以用它作为 IQR 的代理。我们将计算 持续时间 _ 分钟 字段的 IQR,如下所示。

**SELECT**
 **PERCENTILE_CONT**(0.75) **WITHIN GROUP** (**ORDER BY** duration_minutes) -
 **PERCENTILE_CONT**(0.25) **WITHIN GROUP** (**ORDER BY** duration_minutes) **AS** iqr
     **FROM** netflix_titles;

作者图片

歪斜

在 PostgreSQL 中,没有直接计算数值字段/列的偏斜度的函数。然而,由于偏斜度是 *3 (均值-中值)/标准差,我们可以用它来代替偏斜度。我们将计算 持续时间 _ 分钟 字段的偏斜度,如下所示。为了让代码更具可读性,我们将使用 CTE 来计算平均值、中值和标准差。

**WITH** mean_median_sd **AS**
(
 **SELECT** 
  **AVG**(duration_minutes) **AS** mean,
  **PERCENTILE_CONT**(0.5) **WITHIN GROUP** (**ORDER BY** duration_minutes) **AS** median,
  **STDDEV**(duration_minutes) **AS** stddev
   **FROM** netflix_titles
)**SELECT** 
 **ROUND**(3 * (mean - median)**::NUMERIC** / stddev, 2) **AS** skewness
  **FROM** mean_median_sd;

作者图片

将所有这些放在一起

我们将把前面讨论的所有函数放在一起,并在一个表中返回它们。在下面的查询中,我们将创建两个 cte,即 summary_stats (每列返回一个前面讨论过的统计信息)和row _ summary _ stats(每行返回一个统计信息)。

**WITH RECURSIVE**
summary_stats **AS**
(
 **SELECT** 
  **ROUND**(**AVG**(duration_minutes), 2) **AS** mean,
  **PERCENTILE_CONT**(0.5) **WITHIN GROUP** (**ORDER BY** duration_minutes) **AS** median,
  **MIN**(duration_minutes) **AS** min,
  **MAX**(duration_minutes) **AS** max,
  **MAX**(duration_minutes) - **MIN**(duration_minutes) **AS** range,
  **ROUND**(**STDDEV**(duration_minutes), 2) **AS** standard_deviation,
  **ROUND**(**VARIANCE**(duration_minutes), 2) **AS** variance,
  **PERCENTILE_CONT**(0.25) **WITHIN GROUP** (**ORDER BY** duration_minutes) **AS** q1,
  **PERCENTILE_CONT**(0.75) **WITHIN GROUP** (**ORDER BY** duration_minutes) **AS** q3
   **FROM** netflix_titles
),row_summary_stats **AS**
(
**SELECT** 
 1 **AS** sno, 
 'mean' **AS** statistic, 
 mean **AS** value 
  **FROM** summary_stats
**UNION
SELECT** 
 2, 
 'median', 
 median 
  **FROM** summary_stats
**UNION
SELECT** 
 3, 
 'minimum', 
 min 
  **FROM** summary_stats
**UNION
SELECT 
** 4, 
 'maximum', 
 max 
  **FROM** summary_stats
**UNION
SELECT** 
 5, 
 'range', 
 range 
  **FROM** summary_stats
**UNION
SELECT 
** 6, 
 'standard deviation', 
 standard_deviation 
  **FROM** summary_stats
**UNION
SELECT 
** 7, 
 'variance', 
 variance 
  **FROM** summary_stats
**UNION
SELECT 
** 9, 
 'Q1', 
 q1 
  **FROM** summary_stats
**UNION
SELECT 
** 10, 
 'Q3', 
 q3 
  **FROM** summary_stats
**UNION
SELECT 
** 11, 
 'IQR', 
 (q3 - q1) 
  **FROM** summary_stats
**UNION
SELECT 
** 12, 
 'skewness', 
 **ROUND**(3 * (mean - median)**::NUMERIC** / standard_deviation, 2) **AS** skewness 
  **FROM** summary_stats
)**SELECT** * 
 **FROM** row_summary_stats
  **ORDER BY** sno;

作者图片

分类变量的汇总统计

分类变量常用的汇总统计数据有模式、基数(唯一类别的数量)、频率和相对频率。

方式

在 PostgreSQL 中,使用 MODE() 函数计算分类字段/列的模式。我们将计算 评级 字段的模式,如下所示。

**SELECT** 
 **MODE**() **WITHIN GROUP** (**ORDER BY** rating) **AS** mode
  **FROM** netflix_titles;

作者图片

基数

在 PostgreSQL 中,没有直接计算分类字段/列的唯一值数量的函数。但是,我们可以计算变量的不同值,如下所示。

**SELECT** 
 **COUNT**(**DISTINCT** rating) **AS** cardinality
  **FROM** netflix_titles;

作者图片

频率和相对频率

在 Postgres 中,我们可以使用 GROUP BYCOUNT 来计算类别变量中类别的出现频率。对于相对频率,我们将使用 CTE 来计算评级字段中值的总数,并使用它来计算相对频率。因为,不是所有的数据库都支持窗口函数,我们将使用 CTE。我们还将讨论如何使用窗口函数计算相对频率。

**WITH** total_count **AS**
(
**SELECT**
 **COUNT**(rating) **AS** total_cnt
  **FROM** netflix_titles
)**SELECT** 
 rating,
 **COUNT**(rating) **AS** frequency,
 **ROUND**(**COUNT**(rating)**::NUMERIC** / 
    (**SELECT** total_cnt **FROM** total_count), 4) **AS** relative_frequency
    **FROM** netflix_titles
     **GROUP BY** rating
   **ORDER BY** frequency **DESC**;

作者图片

在上面的例子中,我们已经创建了一个 CTE 来捕获 rating 字段中的值的计数。然后,我们使用它来计算 评级 字段中每个类别的百分比/相对频率。由于 Postgres 支持窗口函数,我们将看到一种使用窗口函数计算相对频率的更简单的方法。我们将使用 OVER() 来计算每组评分的总数,这也就是 评分 字段中值的总数。

**SELECT** 
 rating,
 **COUNT**(rating) **AS** frequency,
 **ROUND**(**COUNT**(rating)**::NUMERIC** / **SUM**(**COUNT**(rating)) **OVER()**, 4) **AS** relative_frequency
    **FROM** netflix_titles
     **GROUP BY** rating
      **ORDER BY** frequency **DESC**;

作者图片

文章到此结束。我们已经讨论了计算常用数值字段汇总统计数据的各种函数,如均值、中值、最小值、最大值、Q1、Q2、IQR 等。以及基数、频率等分类字段。汇总统计可用于了解数据分布,也有助于识别潜在的异常值。

如何为月球着陆器🛸设计强化学习奖励函数

原文:https://towardsdatascience.com/how-to-design-reinforcement-learning-reward-function-for-a-lunar-lander-562a24c393f6?source=collection_archive---------10-----------------------

照片来源于Nasa;作者代码

想象外星人👽受到攻击,而你正试图让 Lander🛸登陆月球,你会考虑哪些因素来成功完成任务?

以下是一些注意事项:

  • 在着陆垫上着陆 vs 离开着陆垫
  • 低速着陆 vs 高速坠毁
  • 使用尽可能少的燃料使用大量燃料
  • 尽快接近目标 vs 悬在空中

罚什么?奖励什么?如何平衡多重约束?如何在我们的奖励函数中表现这些想法?

强化学习中的奖励函数

强化学习(RL)是机器学习中的一个分支,它利用代理训练中的试错问题解决方法。在我们的例子中,代理将尝试着陆月球着陆器,比如说,10k 次,以学习如何在不同的状态下做出更好的行动。

奖励功能是一个激励机制,它使用奖励和惩罚来告诉代理什么是正确的,什么是错误的。逆向物流中代理人的目标是最大化总报酬。有时我们需要牺牲眼前的回报,以最大化总回报。

月球着陆器奖励函数中的规则

月球着陆器奖励功能中的奖励和惩罚规则的一些想法可以是:

  • 以足够低的速度降落在正确的地方,给予高额奖励
  • 如果着陆器在着陆区外着陆,则给予处罚
  • 根据剩余燃料的百分比给予奖励
  • 如果在表面着陆时速度超过阈值(坠毁),给予很大的惩罚
  • 给予距离奖励以鼓励着陆器接近目标

如何用 python 代码表示规则

作者代码

如上图所示,变量fuel _ conservation是一个介于 0 和 1 之间的值。当成功降落在着陆场时,收到的奖励会乘以fuel _ conservation以鼓励着陆器尽量少用燃料。

如果着陆器在目标点之外着陆,我们会给它一个-10 的小惩罚。如果着陆器以很高的速度坠毁,我们会给一个很大的惩罚-100。

distance _ reward = 1-(distance _ to _ goal/distance _ max) * 0.5*使用 0.5 的幂,随着着陆器越来越接近着陆垫,为代理提供平滑的奖励梯度。

# Encourage lander to use as little fuel as possible
# i.e. 0.85, or 0.32
fuel_conservation = fuel_remaining / total_fuelif distance_to_goal is decreasing:
    if speed < threshold:
        if position is on landing pad:
            # Land successfully; give a big reward
            landing_reward = 100
            # Multiply percentage of remaining fuel
            reward = landing_reward * fuel_conservation
        else:
            # Landing outside of landing pad
            reward = -10
    else:
        # Crashed
        reward = -100
else:
    # Encourage agents to approach the surface instead of
    # hanging in the air
    distance_reward = 1 - (distance_to_goal / distance_max)**0.5
    reward = distance_reward * fuel_conservation

结论

在本文中,我们以月球着陆器为例,演示如何构建一个带有奖惩规则的高级奖励函数。

在 RL 模型的培训过程中,奖励功能指导代理从试验和错误中学习:

  • 我该怎么办?如何在行动之间进行选择?
  • 最大化总回报的更好行动是什么?
  • 如何评价不同状态下动作的好/坏?

祝着陆愉快!希望外星人会和平到来。👽☮️✌️🕊🛸

参考资料:

报名参加🦞:的 Udemy 课程

具有机器学习和统计的推荐系统

https://www . udemy . com/course/recommender-system-with-machine-learning-and-statistics/?referral code = 178d 030 ef 728 f 966 d62d

如何为 NLP 项目检测和翻译语言

原文:https://towardsdatascience.com/how-to-detect-and-translate-languages-for-nlp-project-dfd52af0c3b5?source=collection_archive---------1-----------------------

从具有多种语言的文本数据到单一语言

图片来自 Pixabay

本文更新于 2022 年 6 月 20 日

对于说西班牙语的人,你可以在这里阅读这篇文章的翻译版本

祝你新年快乐,2021 年到了,你做到了💪**。** 2020 年已经过去,尽管对世界各地的许多人来说,2020 年是艰难而奇怪的一年,但仍有许多值得庆祝的事情。2020 年,我明白了我们所需要的只是我们所爱的人、家人和朋友的爱和支持。

“面对逆境,我们有一个选择。我们可以痛苦,也可以变得更好。那些话是我的北极星。”-卡林·沙利文

这将是我 2021 年的第一篇文章,我将谈论数据科学家或机器学习工程师在从事 NLP 项目时可能面临的一些语言挑战,以及如何解决这些挑战。

假设你是一名数据科学家,被分配到一个 NLP 项目中,分析人们在社交媒体(如 Twitter)上发布的关于新冠肺炎的内容。你的首要任务之一是为新冠肺炎找到不同的标签(例如 #covid19 ),然后开始收集所有与新冠肺炎相关的推文。

当您开始分析收集到的与新冠肺炎相关的数据时,您会发现这些数据是由世界各地的不同语言生成的,例如英语、斯瓦希里语、 西班牙语 、中文、印地语等。在这种情况下,在开始分析数据集之前,您将有两个问题需要解决,第一个是识别特定数据的语言,第二个是如何翻译这些数据

那么如何才能解决这两个问题呢?

图片来自 Pixabay 的图米苏

第一个问题:语言检测

第一个问题是知道如何检测特定数据的语言。在这种情况下,您可以使用一个名为 langdetect 的简单 python 包。

l angdetect 是一个由 Michal Danilák 开发的简单 python 包,支持开箱即用的 55 不同语言**(ISO 639-1 代码)的检测:**

af, ar, bg, bn, ca, cs, cy, da, de, el, en, es, et, fa, fi, fr, gu, he,
hi, hr, hu, id, it, ja, kn, ko, lt, lv, mk, ml, mr, ne, nl, no, pa, pl,
pt, ro, ru, sk, sl, so, sq, sv, sw, ta, te, th, tl, tr, uk, ur, vi, zh-cn, zh-tw

安装语言检测

要安装 langdetect,请在您的终端中运行以下命令。

pip install langdetect

基本示例

检测文本的语言:例如“Tanzania ni nchi inayoongoza kwa utalii barani Afrika”。首先,从 langdetect 导入 detect 方法,然后将文本传递给该方法。

输出:“软件”

该方法检测到所提供的文本是用斯瓦希里语(‘SW’)编写的。

你也可以使用 detect_langs 方法找出排名靠前的语言的概率。

输出:[sw:0.9999971710531397]

****注:你还需要知道,语言检测算法是不确定的,如果你对一个太短或太不明确的文本运行它,你可能每次运行它都会得到不同的结果。

在语言检测之前调用下面的代码,以便得到一致的结果。

现在,您可以通过使用 langdetect python 包来检测数据中的任何语言。

第二个问题:语言翻译

你需要解决的第二个问题是将文本从一种语言翻译成你选择的语言。在这种情况下,你将使用另一个有用的 python 包,名为Google _ trans _ new

google_trans_new 是一个免费的、无限制的 python 包,它实现了 Google Translate API,还执行自动语言检测。

安装 google_trans_new

要安装 google_trans_new,请在您的终端中运行以下命令。

pip install google_trans_new

基本示例

要将文本从一种语言翻译成另一种语言,您必须从google_trans_new模块导入google_translator类。然后你必须创建一个google_translator类的对象,最后将文本作为参数传递给翻译方法,并使用 lang_tgt 参数指定目标语言,例如 lang_tgt="en "。

在上面的例子中,我们将一个斯瓦希里语的句子翻译成英语。下面是翻译后的输出。

Tanzania is the leading tourism country in Africa

默认情况下,translate()方法可以检测所提供文本的语言,并将英语翻译返回给它。如果要指定文本的源语言,可以使用 lang_scr 参数。

这里是所有语言的名称及其简写符号。

{'af': 'afrikaans', 'sq': 'albanian', 'am': 'amharic', 'ar': 'arabic', 'hy': 'armenian', 'az': 'azerbaijani', 'eu': 'basque', 'be': 'belarusian', 'bn': 'bengali', 'bs': 'bosnian', 'bg': 'bulgarian', 'ca': 'catalan', 'ceb': 'cebuano', 'ny': 'chichewa', 'zh-cn': 'chinese (simplified)', 'zh-tw': 'chinese (traditional)', 'co': 'corsican', 'hr': 'croatian', 'cs': 'czech', 'da': 'danish', 'nl': 'dutch', 'en': 'english', 'eo': 'esperanto', 'et': 'estonian', 'tl': 'filipino', 'fi': 'finnish', 'fr': 'french', 'fy': 'frisian', 'gl': 'galician', 'ka': 'georgian', 'de': 'german', 'el': 'greek', 'gu': 'gujarati', 'ht': 'haitian creole', 'ha': 'hausa', 'haw': 'hawaiian', 'iw': 'hebrew', 'hi': 'hindi', 'hmn': 'hmong', 'hu': 'hungarian', 'is': 'icelandic', 'ig': 'igbo', 'id': 'indonesian', 'ga': 'irish', 'it': 'italian', 'ja': 'japanese', 'jw': 'javanese', 'kn': 'kannada', 'kk': 'kazakh', 'km': 'khmer', 'ko': 'korean', 'ku': 'kurdish (kurmanji)', 'ky': 'kyrgyz', 'lo': 'lao', 'la': 'latin', 'lv': 'latvian', 'lt': 'lithuanian', 'lb': 'luxembourgish', 'mk': 'macedonian', 'mg': 'malagasy', 'ms': 'malay', 'ml': 'malayalam', 'mt': 'maltese', 'mi': 'maori', 'mr': 'marathi', 'mn': 'mongolian', 'my': 'myanmar (burmese)', 'ne': 'nepali', 'no': 'norwegian', 'ps': 'pashto', 'fa': 'persian', 'pl': 'polish', 'pt': 'portuguese', 'pa': 'punjabi', 'ro': 'romanian', 'ru': 'russian', 'sm': 'samoan', 'gd': 'scots gaelic', 'sr': 'serbian', 'st': 'sesotho', 'sn': 'shona', 'sd': 'sindhi', 'si': 'sinhala', 'sk': 'slovak', 'sl': 'slovenian', 'so': 'somali', 'es': 'spanish', 'su': 'sundanese', 'sw': 'swahili', 'sv': 'swedish', 'tg': 'tajik', 'ta': 'tamil', 'te': 'telugu', 'th': 'thai', 'tr': 'turkish', 'uk': 'ukrainian', 'ur': 'urdu', 'uz': 'uzbek', 'vi': 'vietnamese', 'cy': 'welsh', 'xh': 'xhosa', 'yi': 'yiddish', 'yo': 'yoruba', 'zu': 'zulu', 'fil': 'Filipino', 'he': 'Hebrew'}

检测和翻译 Python 函数

我创建了一个简单的 python 函数,您可以检测文本并将其翻译成您选择的语言。

python 函数接收文本和目标语言作为参数。然后,它检测所提供的文本的语言,如果文本的语言与目标语言相同,则它返回相同的文本,但如果不相同,则它将所提供的文本翻译成目标语言。

示例:

在上面的源代码中,我们将句子翻译成斯瓦希里语。以下是输出结果:-

Natumai kwamba, nitakapojiwekea akiba, nitaweza kusafiri kwenda Mexico

包扎

在本文中,您了解了当您拥有不同语言的文本数据并希望将数据翻译成您选择的单一语言时,如何解决两种语言难题。

恭喜👏,你已经做到这篇文章的结尾了!

你可以在这里下载本文用到的笔记本:https://github.com/Davisy/Detect-and-Translate-Text-Data

如果你学到了新的东西或者喜欢阅读这篇文章,请分享给其他人看。在那之前,下期帖子再见!也可以通过 Twitter @Davis_McDavid 联系到我。

最后一件事: 在以下链接中阅读更多类似这样的文章。

**https://medium.com/datadriveninvestor/how-to-deploy-your-nlp-model-to-production-as-an-api-with-algorithmia-e4081854d524 https://chatbotslife.com/how-to-use-texthero-to-prepare-a-text-based-dataset-for-your-nlp-project-734feea75a5a https://davis-david.medium.com/meet-the-winners-of-swahili-news-classification-challenge-60f5edd7aa9 **

如何检测数据集中的常量、准常量要素

原文:https://towardsdatascience.com/how-to-detect-constant-quasi-constant-features-in-your-dataset-a1ab7aea34b4?source=collection_archive---------15-----------------------

使用 fast_ml 进行特征选择

由红色齐柏林飞艇在 Unsplash 拍摄的照片

介绍

在大多数情况下,顶尖数据科学家与其他人有两个区别:特征创建特征选择。即,创建捕捉关于业务或客户的更深/隐藏的洞察力的特征,然后做出关于为您的模型选择哪些特征的正确选择。

特征选择在机器学习中的重要性

机器学习模型的质量取决于你的数据——垃圾进,垃圾出。(这里的垃圾意味着坏数据/数据中的噪声)。

在一个广泛的特性工程步骤之后,你会得到大量的特性。您可能无法使用模型中的所有功能。您可能会对只给模型添加那些重要的特性感兴趣,或者删除那些没有任何预测能力的特性。

这篇文章是为了确认所有那些不变的特征。它可以有两种类型:

  1. 恒定特征:所有记录中的值相同。
  2. 准常数特征:其中一个值占优势 99.9%。

我们来详细了解一下这个

1.常量值(所有记录中的相同值)

图片作者。数据集中具有常数值的要素

如示例图像所示,对于数据中的所有记录,只有 Toyota 作为 Car Make 中的值。你的机器学习模型不会通过训练保持这一功能来学习任何有见地的东西。你最好放弃这个功能。同样,还可能有更多这样的特性,您需要一种更加自动化的方式来识别这些特性。

1)使用get_constant_features函数获取所有常量特征。

图片作者。在一行代码中,您可以检测到所有具有常量值的特性

2)将所有恒定特征存储为列表,以便从数据集中移除。

图片作者。所有不变的特性作为一个列表

3)从数据集中删除所有此类要素。我们可以看到功能的数量从 301 下降到了 268。

图片作者。从数据集中移除所有恒定要素

2。准常数(其中一个值是显性的~99%记录)

图片作者。数据集中具有常数值的要素

如示例图所示,在您的数据中,“凯美瑞”占记录的 99.9%。你的机器学习模型不会通过训练保持这一功能来学习任何有见地的东西。或者更糟的是,你的模型会从边缘案例中学习,导致过度拟合。你最好放弃这个功能。同样,还可能有更多这样的特性,您需要一种更加自动化的方式来识别这些特性。

1)使用get_constant_features函数获取所有常量特征。

图片作者。在一行代码中,您可以检测到所有具有准常数值的特性

  • 阈值:用于定义要消除的数据的准度的临界值。99%、99.9%、98%等。

2)将所有拟常数特征存储为列表,以便从数据集中移除。

图片作者。所有的准常数特性作为一个列表

3)从数据集中删除所有此类要素。我们可以看到,功能的数量从 268 个减少到了 123 个。

摘要

两个常量的代码片段&准常量特性:

from fast_ml.utilities import display_all
from fast_ml.feature_selection import get_constant_features**# Use the function to get the results in dataframe**
constant_features = get_constant_features(df)
display_all(constant_features)**# All the constant features stored in a list**
constant_features_list = constant_features['Var'].to_list()**# Drop all the constant features from the dataset**
df.drop(columns = constant_features_list, inplace=True)

感谢阅读!!

  • 如果你喜欢这个,跟随我在媒体了解更多。
  • 有兴趣合作吗?我们上 Linkedin 连线吧。
  • 请随意写下您的想法/建议/反馈。
  • 卡格尔链接
  • Fast_ml 链接

笔记本可在以下位置获得,并附有完整的功能代码:

https://www.kaggle.com/nextbigwhat/detect-constant-and-quasi-constant-features

如何检测、评估和可视化数据中的历史漂移

原文:https://towardsdatascience.com/how-to-detect-evaluate-and-visualize-historical-drifts-in-the-data-7b2903c6da4f?source=collection_archive---------28-----------------------

显然,阴谋和 Mlflow

图片作者。

TL;DR: 您可以查看数据的历史漂移,以了解您的数据是如何变化的,并选择监控阈值。这里有一个例子,显然,Plotly,Mlflow 和一些 Python 代码。

我们经常谈论在实时数据上检测漂移。

目标是检查当前分布是否偏离训练或过去的某个时期。当漂移被检测到时,你知道你的模型在一个相对未知的空间中运行。是时候做点什么了。

但是这里有很多细微的差别。漂移是多大的漂移?如果只有 10%的特征漂移,我应该在意吗?应该按周看漂移还是按月看漂移?

细节决定成败。答案在很大程度上取决于模型、用例、重新培训的容易程度(或可能性)以及性能下降给你带来的损失。

这里有一个过程可以帮你想清楚。

再来看历史数据漂移!

为什么要看过去的数据漂移?

我们的目标是学习漂移动力学。我们的数据过去发生了多大的变化?

这很有用,原因有二:

首先,我们可以了解模型的衰变纲图。

图片作者。

我们分享了一个关于如何提前检查模型再培训需求的类似想法。在那里,我们观察了模型性能如何随时间变化。

现在,我们来看看数据是如何变化的。你可以选择其中一个。如果我们知道我们将不得不在生产中等待地面真相标签,那么理解数据漂移就特别有帮助。

假设数据以恒定的速度变化,我们可以使用这种分析来设定我们的预期。并准备适当的基础设施。

用例是高度动态的吗?是否应该做好频繁再培训的准备,建立自动流水线?

其次,这种分析可以帮助我们定义模型监控触发器。

图片作者。

**一旦模型投入生产,我们可能需要检查数据漂移。**我们的触发器应该有多敏感?我们需要发生什么来应对漂移?

要选择阈值和条件,我们需要了解我们的数据在过去是如何变化的。这是一种微妙的平衡!我们不希望有太多的假警报,但我们也希望对有意义的变化做出反应。

我们可以对过去的数据运行几次漂移检查(模拟不同的漂移阈值和监控窗口)并探索结果。

这里有一个例子来说明如何做到这一点。

定义漂移检测逻辑

让我们从 Kaggle 获取一个自行车共享数据集。我们将使用它来探索过去的数据漂移。你可以在这个例子 Jupyter 笔记本中跟随它。

在现实生活中,您可以对训练数据进行类似的处理。

为了决定我们的漂移检测逻辑,我们应该做一些假设。

图片作者。

首先,我们要定义比较窗口。

例如,我们可以逐月查看数据。这个选择取决于你对数据的理解。数据是如何产生的?背后的真实世界过程是怎样的?你认为它变化的速度有多快?

这里有一些提示:

  • 如果你的数据有已知的季节性,你可以考虑它。例如,进行一周一周的比较,而不是一天一天的比较,以避免对周末模式反应过度。或者相互比较不同年份的 12 月份数据。
  • 如果你知道模型退化的速度,就以此为起点。我们在之前已经分享过这种方法。如果你知道你的模型在一个月内降级,你可以看看周漂移,看看你能提前多长时间预测这种下降,以及它看起来如何。
  • **你可以建立几个漂移“视图”,设定不同的预期。**比如同时看周线和月线漂移,设置不同的阈值。用例定义了它:你可以有多个季节或者其他已知的模式。

你总是可以测试一些假设,看看这会如何改变结果。

作者图片

我们的第二个假设是漂移检测阈值。

我们可以使用统计测试来评估单个要素的漂移,并根据 P 值来判断结果。

但是为了对其进行操作或实现监控触发器,我们通常需要一些“是”或“否”的决定或整个数据集的聚合数。为此,我们可以在统计测试的结果之上实现一些定制的逻辑。

例如,我们可以查看漂移特征的份额,并且仅当超过 50%的漂移特征具有统计上的显著变化时才发出警报。

我们还可以操纵统计测试的置信水平。通常的默认值是 0.95,但是您可能有理由将其设置为 0.99 或 0.9,例如。

这里有一些提示:

  • 您可以只关注关键特性。您可以根据重要性为特征分配不同的权重,或者仅对顶部特征运行漂移检测。并非所有的漂移都是一样的。次要特性的变化通常不会影响关键性能指标。
  • **如果你有很多弱项,你可以看看整体漂移。**但是在这种情况下,您可以增加阈值来定义漂移已经发生(根据更高的置信水平和特征数量)。

在我们的例子中,我们有几个月的数据。让我们定义一下我们的假设:

  • 我们用第一个月作为训练数据。
  • 我们逐月进行漂移比较。
  • 我们将测试单个要素和数据集的漂移。
  • 在数据集漂移的情况下,我们将统计测试的置信水平设置为 0.95。我们将同等重视所有要素,如果超过 50%的要素发生漂移,则认为我们的数据集发生了漂移。

它在代码中的样子

要查看所有细节,请查看我们的示例 Jupyter 笔记本。

为了实现这种方法,我们将使用以下库:

  • JSONpandasNumPy 作为处理数据所需的标准库。
  • Plotly ,来可视化我们的数据漂移。
  • 显然是,使用统计测试计算漂移。
  • Mlflow ,记录结果。

一旦我们导入了库,我们就加载了数据。看起来是这样的:

作者图片,Jupyter 笔记本中的数据集预览。

我们定义列映射来指定特征类型。这显然是执行正确的统计测试所需要的。

data_columns = {}
data_columns['numerical_features'] = ['weather', 'temp', 'atemp', 'humidity', 'windspeed']

我们还定义了我们的参考数据(第一个月)和随后的时间段来评估漂移。我们将每个月的数据视为一次实验。

reference_dates = ('2011-01-01 00:00:00','2011-01-28 23:00:00')experiment_batches = [
    ('2011-02-01 00:00:00','2011-02-28 23:00:00'),
    ('2011-03-01 00:00:00','2011-03-31 23:00:00'),
    ('2011-04-01 00:00:00','2011-04-30 23:00:00'),
    ('2011-05-01 00:00:00','2011-05-31 23:00:00'),  
    ('2011-06-01 00:00:00','2011-06-30 23:00:00'), 
    ('2011-07-01 00:00:00','2011-07-31 23:00:00'), 
]

接下来,我们实现了两个自定义函数。他们在显然由概要提供的统计测试结果之上引入逻辑。

**第一个帮助检测数据集漂移。**它将返回关于整体漂移的单一真真或假响应。我们可以设置统计测试的置信水平,并选择漂移特征的阈值。我们也可以通过设置 get_ratio 为 TRUE 来获得漂移特性的份额。

**第二个有助于检测特征漂移。**显然已经在 JSON 概要文件输出中返回了各个特性的 P 值。我们添加这个函数来获得每个特性的二进制响应:1 表示漂移,0 表示不漂移。我们可以设置统计测试的置信水平。并且,我们仍然可以通过将 get_pvalues 设置为 TRUE 来获得每个特征的 P 值。

您可以按照这个示例构建自己的定制逻辑。

可视化特征漂移

先说特征漂移。

我们调用我们的函数来评估单个特征的漂移。

features_historical_drift = []**for** date **in** experiment_batches:
    drifts = detect_features_drift(raw_data.loc[reference_dates[0]:reference_dates[1]], 
                           raw_data.loc[date[0]:date[1]], 
                           column_mapping=data_columns, 
                           confidence=0.95,
                           threshold=0.9)

    features_historical_drift.append([x[1] **for** x **in** drifts])

features_historical_drift_frame = pd.DataFrame(features_historical_drift, columns = data_columns['numerical_features'])

然后,我们使用 Plotly 将结果可视化在热图上。我们将检测到漂移的时间段标为红色。

这是我们得到的结果:

作者形象,情节可视化。

哎哟!一点都不稳定。

事实是,我们采用了一个季节性很强的用例。我们的数据实际上与天气有关。温度、湿度、风速模式逐月变化很大。

这给了我们一个非常明确的信号,我们需要考虑最新的数据,并经常更新模型。

如果我们想以更精细的方式来看,我们可以绘制 P 值。我们将 get_pvalues 设置为真,然后生成一个新的绘图。

作者形象,情节可视化。

在更细微的变化的情况下,将 P 值视为梯度而不仅仅是漂移的布尔真/假可能会有所帮助。

可视化数据集漂移

现在让我们调用一个函数来计算数据集漂移。

知道了数据的不稳定性,我们将阈值设得很高。只有当 90%的特征在分布上有统计变化时,我们才称之为漂移。

dataset_historical_drift = []**for** date **in** experiment_batches:
    dataset_historical_drift.append(detect_dataset_drift(raw_data.loc[reference_dates[0]:reference_dates[1]], 
                           raw_data.loc[date[0]:date[1]], 
                           column_mapping=data_columns, 
                           confidence=0.95))

这就是逐月统计的结果。

作者形象,情节可视化。

您还可以设置一个更细粒度的视图,并使用每个月内的漂移特征份额绘制一个图。

作者形象,情节可视化。

根据不同的用例,您可以选择不同的方式来显示这些数据,比如条形图。

记录漂流物

当我们的目标是探索或分享信息时,可视化是很有帮助的。

但是我们可能还想简单地记录其他地方的特性和数据集漂移测试的数字结果。例如,我们想记录一个实验结果的漂移值。

或者,我们想为生产中的模型跟踪它。

一旦我们定义了漂移条件,我们就可以监控它们是否得到满足。我们希望得到一个布尔响应,无论生产中是否发生了漂移,或者基于某个阈值触发警报。

要记录漂移结果,我们可以使用 Mlflow 跟踪。这是一个管理 ML 生命周期的流行库。在这种情况下,我们显然使用和我们的自定义函数来生成输出(数据集漂移度量),然后用 Mlflow 记录它。

你可以按照我们在 Jupyter 笔记本中的例子来做。这很简单!

以下是 Mlflow 界面中的结果。我们记录了每次运行的数据集漂移指标。

图片由作者提供,Mlflow 界面截图。

或者这是一个扩展视图:

图片由作者提供,Mlflow 界面截图。

适应您的用例

您可以将这个示例应用到您的用例中。

例如,您可以修改漂移检测逻辑来更好地考虑手头的用例。您可以测试几种组合,并选择合适的窗口和漂移条件。

你也可以用其他的 报道 **。**例如,除了数据漂移之外,您还可以生成一个性能报告来记录模型质量指标。然后,您可以遵循类似的步骤,使用 Plotly 来分析您的模型衰减测试的结果,从而可视化历史模型性能。

**当然,这种方法也适用于生产。**尤其是当您有批量模型运行时。例如,您定期对数据和预测运行漂移检查,并使用 Mlflow 进行记录,或者简单地将其写入数据库。

你一直在看你的数据漂移吗?让我们知道!

最初发表于https://evidentlyai.com并与 埃琳娜·萨穆伊洛娃 合著。

在 appeally AI,我们创建了开源工具来分析和监控机器学习模型。在 GitHub 上查看我们的 项目,喜欢就给它一颗星!

想留在圈子里吗?

  • 报名参加 我们的每月简讯。
  • 关注 推特 Linkedin
  • 加入我们的 不和谐社区 聊天连线。

如何检测、处理和可视化异常值

原文:https://towardsdatascience.com/how-to-detect-handle-and-visualize-outliers-ad0b74af4af7?source=collection_archive---------15-----------------------

当我刚开始开发数据科学项目时,我不关心数据可视化或离群点检测,我只关心创建酷模型。但是,当我开始检查其他数据科学家的代码时,我意识到数据质量甚至比模型本身更重要,所以我开始更多地关注探索性数据分析(EDA)部分,我意识到我是多么愚蠢。

介绍

几乎在任何数据科学项目中,我们都必须了解我们将要处理的数据。根据我们从事的项目,这些数据会有很大差异,但每个项目的流程几乎都是相同的:

  1. 从源(读取数据。csv,。xlsx,关系数据库…)
  2. 检查每一列的描述性统计数据(平均值、最大值、最小值、标准偏差、中位数……)
  3. 数据清理和数据争论(删除或填充 NaN、inf 和-inf 值,删除无用的列,创建新列……)
  4. 使用不同类型的图(条形图、散点图、箱线图等)可视化数据
  5. 处理异常值(如果可能,删除或转换它们)
  6. 创建、训练和测试模型
  7. 迭代最佳模型,进行微调、特性选择和 A/B 测试
  8. 选择最佳模型并部署它

当然,详细解释这一过程需要很长时间,所以在这篇文章中,我将把重点放在异常检测、处理和可视化上。但是等一下…什么是离群值,为什么我应该关心它们?

根据维基百科,这是离群值的定义:

在统计学中,异常值是与其他观察值显著不同的数据点。异常值可能是由于测量中的可变性造成的,或者它可能表明实验误差;后者有时被排除在数据集之外。异常值会在统计分析中引起严重的问题。

一些异常理论

既然我们已经了解了什么是异常值以及为什么处理它们很重要,我们可以从一些理论开始。

正态分布和标准偏差[2]

上图显示了一个完美的正态分布数据集。如果我们仔细观察曲线的中心,我们会看到数据集的平均值的标准偏差为 0,根据理论,正态分布数据集的 99.7%的数据点距离平均值的标准偏差在 3 到-3 之间。这意味着标准偏差大于 3 或小于-3 的所有值都将被视为异常值。

用 Python 可视化离群值

检测异常值的一个非常有用的方法是可视化它们。显示异常值的最佳图表类型是箱线图。但是,在可视化之前,让我们加载一个数据集:

Scikit-learn 的加州住房数据集

箱形图

正如我之前所说的,当谈到离群值可视化时,盒状图是掌握关于数据离群值的有价值信息的最简单的方法。但是在可视化任何异常值之前,让我们理解什么是箱线图及其不同的组成部分:

箱形图的组成部分[3]

正如我们在上面的图像中看到的,箱线图有许多组成部分,每一部分都有助于我们表示和理解数据:

  • Q1。 25%的数据低于该数据点。
  • **中位数。**数据集的中心值。它也可以表示为 Q2。50%的数据都在这个数据点以下。
  • Q3。 75%的数据都在这个数据点以下。
  • **最小值。**数据集中非异常值的最小值数据点。
  • **最大。**数据集中非离群值的最大值的数据点。
  • **IQR。**代表 Q1 和 Q3 之间的所有值。

一旦我们理解了盒状图的所有组成部分,让我们针对数据集中的给定变量对其进行可视化:

哇!看起来在我们的数据集的 MedInc 变量中有许多异常数据点。但是,如果我们想检查熊猫的数据框中的这些行呢?我们怎样才能只选择这些行呢?

在下面的段落中,我们将看到如何使用 Python 和 scipy 包来检测异常值。

从头开始检测异常值

正如我们在文章开头所说的,所有偏离平均值 3 或-3 个标准差的数据点都是异常值。让我们为 MedInc 列(中等收入列)编码:

这些是异常值:

中间异常行

如果我们移除所有医学异常值,这将是数据集:

无医学异常值的数据集

用 Scipy 检测异常值

有一种更简单的方法来检测异常值。多亏了 scipy 包,我们可以计算任何给定变量的 z 值。z 得分让您了解一个数据点离平均值有多少标准差。因此,如果 z 得分为-1.8,我们的数据点将偏离平均值-1.8 个标准偏差。让我们检查代码:

如果我们显示数据框,结果将与我们之前从头开始的方法相同:

使用 z-score 对异常值行进行 MedInc

使用 z-score 的无医学异常值数据集

处理异常值

我们已经学会了如何检测和可视化异常值,但是我们如何处理它们呢?这个问题没有简单的答案,但我会尽量简短。答案是,这在很大程度上取决于你正在做的项目类型:

如果您正在进行探索性数据分析(EDA),您的一些见解可能是错误的,因为异常值可能会让您得出错误的结论。为了防止这种情况,您还应该从其余数据中单独分析您的异常值,并尝试重复分析以消除异常值。一旦你完成了这个迭代过程,你的洞察力将更加一致。

在您创建机器学习模型的情况下,离群值可能会使您的模型表现不佳。为了防止这种情况发生,你可以尝试不同的方法。这里有两个例子:

  • 如果您有大量数据,但离群值很少,您可以尝试删除它们,并用较少的数据训练您的模型。
  • 如果异常值是由错误的测量(如传感器收集的数据)引起的,您可以尝试使用平均值来更改异常值。

摘要

在这篇文章中,我们看到:

  1. 离群值的定义
  2. 关于异常值和数据分布的一些理论
  3. 如何可视化离群值
  4. 如何检测异常值
  5. 如何处理异常值

参考

  1. https://es . Wikipedia . org/wiki/Distribuci % C3 % B3n _ de _ probabilidad
  2. https://towards data science . com/understanding-box plots-5e 2 df 7 bcbd 51

如何检测 Python 应用程序中的内存泄漏

原文:https://towardsdatascience.com/how-to-detect-memory-leakage-in-your-python-application-f83ae1ad897d?source=collection_archive---------12-----------------------

标准的 Python 库,可以显示每一行的内存使用和执行时间

来自佩克斯的路易斯·金特罗的照片

看到我们如何在 python 中提高测量算法的性能是很有趣的。大约十年前,当我开始用 python 编程时,我将时间存储在代码中不同点的变量中。这肯定是最丑陋的方式,但在那个时候,我认为我很聪明。

几年后,当我学会使用 python 中的 decorators 时,我创建了一个函数来做同样的事情。我以为我变聪明了。

但是 python 生态系统在过去十年中已经变得非常庞大。它的应用超越了数据科学和 web 应用开发。随着这一发展,我们改进了用 Python 进行性能审计的方法。

在云计算时代,对资源使用的更精确测量的需求很高。如果你使用 AWS、Azure、G-Cloud 或任何其他云基础设施,通常你必须为资源小时付费。

此外,Python 是机器学习和分布式计算等数据密集型应用的流行语言。因此,理解概要分析和性能审计对于每个 Python 程序员来说都是必不可少的。

在本文中,我们将讨论,

  • 测量执行时间的又快又脏的方法;
  • 提取运行持续时间的准确摘要;
  • 在不同点拍摄内存快照;

在继续之前,让我们也讨论一下我多年来一直使用的老派方法。

我再也不会用以前的学校方法了。

这个方法是我刚开始编程时的做法。我存储函数执行前后的时间值。区别在于这个过程运行了多长时间。

下面的代码片段计算小于输入值的质数。在函数的开头和结尾,我写了代码来捕捉时间和计算持续时间。如果我需要编写另一个需要性能审计的函数,我将不得不再次做同样的事情。

这个方法我用了好几年。我遇到的最大问题是我的代码库被快照时间填满了。即使在一个小规模的项目中,这些重复的行也很烦人。它降低了代码的可读性,使调试成为一场噩梦。

当我了解到装修工人时,我很兴奋。他们可以让我的 python 代码再次变得漂亮。我只需要在每个函数的顶部放置一个装饰器。

装饰器接受一个函数,添加一些功能,并返回修改后的。这是我的计算和打印执行时间。

我创建了一个装饰器来捕捉执行函数前后的时间,并在上面的代码中打印出持续时间。我可以注释任何函数,它会打印每次执行的持续时间。

如你所见,我写了第二个函数— skwer。然而,这一次我没有重复任何时间捕获代码。相反,我也注释了 skwer。

装饰者是伟大的时间节省者。有了它们,代码看起来更整洁了。但是对于这种捕获执行时间的方法有一个警告。

如果你的脚本包含一个递归函数,一个调用自己的函数,这将是一个混乱。我已经使用了一段时间的一个变通方法是将装饰器附加到一个包装函数上。

Python 有一些标准库可以方便地解决这些问题。其中两个跟踪运行持续时间的是“timeit”和“cProfile”

测量执行时间的最快方法。

Python 标准安装包括 time it——一种测量执行时间的便捷方法。

有了 timeit,你不必重写代码来捕捉时间和手工计算。此外,time 它捕获语句的执行。因此不必担心递归函数调用。

还有,IPython 笔记本有一个很棒的神奇功能,可以打印电池的运行时长。在 Jupyter 笔记本上工作时,这个功能非常有用。

全面的性能统计信息集合。

时间这是一种收集性能统计数据的便捷方式。然而,它并没有深入到发现程序的哪些部分是最慢的。

另一个标准 Python 库 cProfile 可以做得更好。

运行上面的脚本将为您提供每行的说明性摘要。

Python 解释器在 6 毫秒内运行了 21894 个函数来执行我们脚本中的四行代码。解释器花了大部分时间运行第三行,在那里我们定义了 Fibonacci 函数。

很了不起。在大规模的应用程序中,我们知道 cProfile 的瓶颈在哪里。

在另一个函数中执行我的应用程序函数,也是在一个字符串中,这是一种不适。但是,cProfile 有一个更方便的方法。用哪个是你个人的喜好。

当使用 cProfile 进行审计时,我通常更喜欢 Profile 类而不是 run 方法。是的,run 方法很方便。然而,我喜欢 Profile 类,因为它不希望我在另一个类中运行函数。我有做我需要的事情的灵活性。

内存泄漏侦探。

timeit 和 cProfile 都简化了 Python 程序员的一个关键问题。查明代码在哪里花费了大部分运行时间是进一步优化机会的暗示。

然而,运行时间并不是衡量算法性能的正确标准。许多其他外部因素扭曲了实际执行时间。通常是操作系统控制它,而不是代码本身。

运行时间不是性能的衡量标准。它只是资源使用的一个代理。

由于这些外部的复杂性,我们不能断定一个长时间运行的函数确实是一个瓶颈。

Python 标准库也有一种精确估计资源使用的方法——trace malloc。

Tracemalloc 代表跟踪内存分配,是一个标准的 Python 库。它允许您在代码的不同点获取内存使用的快照。以后你可以比较一下。

这里有一个 tracemalloc 的基本例子。

运行上面的代码将输出每一行的内存使用情况。类似于 cProfile,但是是内存而不是运行时间。

代码的第四行是最重要的内存消耗者。解释器已经检查了这一行 28 次,每次都使用了 424B 的内存。

在示例应用程序中,这个数量很小。但是在实际应用中,这将是重要和关键的。

进一步的 tracemalloc 允许快照之间的比较。有了这个特性,我们甚至可以创建不同组件的内存使用图。

上面的代码将打印出每一行消耗了多少内存,以及自上次快照以来增加了多少。

在我们的代码中,我们计算了第 9 行中的第 30 个斐波那契数,并拍摄了我们的第一张快照。然后我们计算第 40 个斐波那契数列,再取一个。输出显示我们已经使用了 4664B 的额外内存,并且对第 5 行多执行了 11 次。

结论

成功运行软件的一个关键方面是准确测量它使用了多少资源。这种理解允许工程师优化 CPU 内核和内存来运行应用程序。

今天,我们在许多项目中广泛使用 Python。由于其广泛的社区和生态系统,使用在最近几年成倍增长。

本文主要关注如何追溯 Python 程序中的执行时间和内存使用情况。Python 的标准库允许我们在行的层次上找到这些矩阵,即使是在多模块应用程序上。

我们讨论了三个内置的 python 库来进行性能审计。Timeit 最方便,与 Jupyter 笔记本完美融合。cProfile 是一个全面的执行时间记录器。最后,我们讨论了 tracemalloc,它允许我们在不同的点拍摄内存快照并进行比较。

我希望在 Python 中测量性能现在已经非常清楚了。但是如何让 Python 运行得更快呢?与 Java 和 C++相比,它仍然被认为是一种缓慢的编程语言。查看我之前关于提升 Python 脚本性能的文章。

感谢阅读,朋友!看来你和我有许多共同的兴趣。我很乐意通过 LinkedIn、T2、Twitter 和 Medium 与你联系

还不是中等会员?请使用此链接 成为 的会员。你可以享受成千上万的有见地的文章,并支持我,因为我赚了一点佣金介绍你。

如何用 Python pyod 检测异常值

原文:https://towardsdatascience.com/how-to-detect-outliers-with-python-pyod-aa7147359e4b?source=collection_archive---------16-----------------------

数据预处理

关于 pyod 库使用的快速教程。

威尔·梅尔斯在 Unsplash 上拍照

异常值检测是一种预处理技术,它允许识别数据集中的奇怪的数据点。

数据预处理还包括:

  • 缺失值
  • 标准化
  • 正常化
  • 格式化
  • 宁滨
  • 删除重复。

数据集中的异常值检测包括发现具有异常行为的项目。离群值检测可以被认为是一种预处理技术,以及缺失值检测、规范化、标准化、数据格式化、数据宁滨和删除重复项。在 Sergio Santoyo 的这篇有趣的文章中可以找到异常值检测的快速介绍。

存在不同的异常值检测技术:

  • 极值分析:这种方法假设太大或太小的值都是异常值。这项技术包括 Z 检验和学生的 t 检验;
  • 概率和统计模型:这些方法假设数据的特定分布。离群点是概率低的点;
  • 线性模型:这些方法利用每个数据点到特定平面的距离来发现异常值。这些技术包括 PCA(主成分分析);
  • 基于接近度的模型:在这些模型中,离群点是指从其余观察中分离出来的点。这些技术包括聚类分析、基于密度的分析和最近邻法;
  • 信息论模型:在这些模型中,离群值增加了描述数据集的最小代码长度;
  • 高维离群点检测:这些模型实现了特定的方法来处理高维稀疏数据。

在本教程中,我利用了pyod Python 库,它支持以下异常值检测技术:

  • 基于邻近的
  • 线性的
  • 盖然论的
  • 离群系综
  • 神经网络。

pyod库的完整文档可以在这个链接中找到。在本教程中,我只关注前三种技术。

这个教程可以从我的 Github 库下载。

构建数据集

首先,我从头开始构建数据集:我构建一个正弦波,然后通过手动添加三个异常值来扰动它。我利用numpy库的sin()函数来构建正弦波。

import numpy as npX = np.arange(0,100)
Y = np.sin(50*X)

在波动扰动之前,我通过matplotlib库绘制了它。

import matplotlib.pyplot as pltplt.plot(X,Y)
plt.scatter(X,Y)
plt.grid()
plt.ylabel('Y')
plt.xlabel('X')
plt.show()

作者图片

现在我通过修改一些 Y 值来扰动正弦波。最后,我有 3 个异常值。

Y[5] = 1.25
Y[60] = -2
Y[85] = 1.4
n_outliers = 3

我画出了扰动后的波形。3 个异常值的存在是清楚的。

plt.plot(X,Y)
plt.scatter(X,Y)
plt.grid()
plt.ylabel('Y')
plt.xlabel('X')
plt.show()

作者图片

基于邻近的模型

这些模型将异常值视为与其余观察值隔离的点。基于邻近度的主要模型包括:

  • 聚类分析
  • 基于密度的分析
  • 最近的街区。

pyod库实现了以下算法:

  • LOF(局部异常因素)
  • COF(基于连通性的异常因素
  • 基于聚类的局部离群因子
  • 局部相关积分
  • 基于直方图的异常值分数
  • kNN (k 最近邻)
  • 平均 KNN
  • MedKNN(中位数 KNN)
  • 子空间离群点检测
  • ROD(基于旋转的异常检测)

在本教程中,我利用了KNN模型。首先,我将Y数据改造成可以作为KNN()模型输入的格式。然后,我构建了KNN模型,并用Y来拟合它。最后,我通过predict()函数预测异常值。

from pyod.models.knn import KNNY = Y.reshape(-1, 1)
clf = KNN()
clf.fit(Y)outliers = clf.predict(Y)

outliers变量是一个数组,如果Y中对应的值是离群值0,则包含1,否则包含0。因此,我可以通过名为where()numpy函数来计算异常值的位置。在这个例子中,算法正确地检测出异常值。

np.where(outliers==1)

它给出了以下输出:

(array([ 5, 60, 85]),)

我绘制结果。首先我计算Y_outliersX_outliers,以及Y_inliersX_inliers

Y_outliers = Y[np.where(outliers==1)]
X_outliers = X[np.where(outliers==1)]
Y_inliers = Y[np.where(outliers==0)]
X_inliers = X[np.where(outliers==0)]

然后,我画一个散点图。

plt.scatter(X_outliers, Y_outliers, edgecolor='black',color='red', label='outliers')
plt.scatter(X_inliers, Y_inliers, edgecolor='black',color='green', label='inliers')
plt.legend()
plt.grid()
plt.ylabel('Y')
plt.xlabel('X')
plt.show()

作者图片

每个异常值检测算法为每个数据点计算一个异常值。数据点的异常值越大,该数据点为异常值的概率就越高。我通过decision_function()计算异常分数。

anomaly_score = clf.decision_function(Y)

我绘制了一个直方图,其中显示了异常值,一条垂直线显示了算法用来检测异常值的最小异常值。

min_outlier_anomaly_score = np.floor(np.min(anomaly_score[np.where(outliers==1)])*10)/10
plt.hist(anomaly_score, bins=n_bins)
plt.axvline(min_outlier_anomaly_score, c='k')
plt.xlabel('Anomaly Score')
plt.ylabel('Number of data points')
plt.show()

作者图片

我可以手动定义异常值。例如,我可以考虑异常值大于 0.3 的所有数据点。在这种特定的情况下,手动定义并不好用,但在其他情况下,它可能是有用的。

raw_outliers = np.where(anomaly_score >= 0.3)
raw_outliers

它给出了以下输出:

(array([60, 85]),)

推广到其他模型

所描述的过程也可以推广到其他方法。为了避免重复代码,我定义了一个名为outliers_detection()的函数,它接收异常模型及其名称作为输入。该函数精确计算出我为KNN模型计算出的值。

def outliers_detection(model, name):
    clf = model
    clf.fit(Y)

    outliers = clf.predict(Y)

    Y_outliers = Y[np.where(outliers==1)]
    X_outliers = X[np.where(outliers==1)]

    Y_inliers = Y[np.where(outliers==0)]
    X_inliers = X[np.where(outliers==0)]
    print(X_outliers)

    plt.scatter(X_outliers, Y_outliers, edgecolor='black',color='red', label='outliers')
    plt.scatter(X_inliers, Y_inliers, edgecolor='black',color='green', label='inliers')
    plt.title(name)
    plt.legend()
    plt.grid()
    plt.ylabel('Y')
    plt.xlabel('X')
    plt.show()

    anomaly_score = clf.decision_function(Y)
    min_outlier_anomaly_score = np.floor(np.min(anomaly_score[np.where(outliers==1)])*10)/10
    plt.hist(anomaly_score, bins=n_bins)
    plt.axvline(min_outlier_anomaly_score, c='k')
    plt.xlabel('Anomaly Score')
    plt.ylabel('Number of data points')
    plt.show()
    return anomaly_score

线性模型

pyod库实现了以下线性模型:

  • 主成分分析
  • 最小协方差行列式
  • 单类支持向量机
  • 基于偏差的异常值检测。

在这个例子中,我使用了OCSVM模型。首先,我构建模型,然后调用outliers_detection()函数。

from pyod.models.ocsvm import OCSVM
model = OCSVM()
anomaly_score = outliers_detection(model, 'OCSVM')

该模型确定了以下异常值:

[ 5  6 29 30 53 54 60 65 77 85]

作者图片

作者图片

这个模型高估了异常值的数量。因此,我可以手动定义离群值。从前面的直方图中,我可以看到,例如,异常值可能是异常值大于 2.5 的所有数据点。

raw_outliers = np.where(anomaly_score >= 2.5)
raw_outliers

它给出了以下输出:

(array([ 5, 60, 85]),)

在这种情况下,算法会正确识别异常值。

或者,当我构建模型时,我可以指定要检测的异常值的百分比,前提是我事先知道异常值的数量。这可以通过设置contamination参数来完成。

model = OCSVM(contamination=n_outliers/len(Y))
anomaly_score = outliers_detection(model, 'OCSVM')

这给出了以下异常值:

[ 5 60 85]

概率模型

pyod库实现了以下概率模型:

  • ABOD(基于角度的异常检测)
  • FastABOD(基于角度的快速异常检测)
  • COPOD(基于 Copula 的离群点检测)
  • 中位数绝对偏差
  • 随机异常值选择。

在下面的例子中,我主要关注ABOD模型。类似地,对于OCSVM模型,ABOD模型高估了异常值的数量。

from pyod.models.copod import COPOD 

model = COPOD()
anomaly_score = outliers_detection(model, 'COPOD')

该模型确定了以下异常值:

[ 6 29 30 53 54 60 76 77 78]

在这种情况下,识别出的异常值列表不包含任何实际的异常值。因此,在这个具体的例子中不应该使用这个算法。

摘要

在本教程中,我展示了如何使用 Python pyod库检测异常值。

可以通过手动设置阈值来修改基本算法,以区分正常数据点和异常值。

或者,可以通过指定污染百分比来修改基本模型。

如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。

相关文章

[## 如何在 Python 中处理不平衡的多类数据集

towardsdatascience.com](/how-to-deal-with-imbalanced-multiclass-datasets-in-python-fe0bb3f2b669)

时间序列预测中如何检测随机游走和白噪声

原文:https://towardsdatascience.com/how-to-detect-random-walk-and-white-noise-in-time-series-forecasting-bdb5bbd4ef81?source=collection_archive---------2-----------------------

找出目标是否值得预测

照片由 【鸢】像素 组成。除非另有说明,所有图片均为作者所有。

介绍

再强大的机器学习也不能预测一切。一个众所周知的领域是时间序列预测,在这个领域它可能会变得非常无助。

尽管有一大套自回归模型和许多其他时间序列算法可用,但如果目标分布是白噪声或遵循随机游走**,你就无法预测目标分布。**

因此,在进一步努力之前,您必须检测这样的分布。

在本文中,您将了解什么是白噪声和随机游走,并探索检测它们的成熟统计技术。

**https://ibexorigin.medium.com/membership

获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:

https://alphasignal.ai/?referrer=Bex

在我们开始之前…

这是我关于时间序列预测系列的第三篇文章(你可以从这个列表,一个新的媒体特性中查看整个系列)。

第一个是关于每一个熊猫功能操纵 TS 数据,第二个是关于时间序列分解和自相关。

为了从这篇文章中获得最大收益,你至少需要理解什么是自相关。在这里,我将给出一个简单的解释,但如果你想更深入地了解我的上一篇文章。

自相关的简要说明

自相关涉及到寻找时间序列和其滞后版本之间的相关性。考虑这个分布:

滞后时间序列意味着将其向后移动一个或多个周期:

自相关函数(ACF)在每个滞后 k 找到时间序列与其滞后版本之间的相关系数。您可以使用statsmodels中的plot_acf函数来绘制它。它看起来是这样的:

x 轴是滞后 k,,y 轴是每个滞后的皮尔逊相关系数。红色阴影区域是置信区间。如果柱的高度在该区域之外,这意味着相关性在统计上是显著的。

什么是白噪声?

简而言之,白噪声分布是具有以下特征的任何分布:

  • 零平均值
  • 恒定方差/标准差(不随时间变化)
  • 所有滞后的自相关为零

本质上,它是一系列随机数,根据定义,没有算法可以合理地模拟它的行为。

有一些特殊类型的白噪声。如果噪声是正常的(遵循一个正态分布,则称为高斯白噪声。让我们看一个直观的例子:

标准偏差为 0.5 的高斯白噪声分布

即使偶尔有尖峰,也看不到可辨别的模式,即分布完全是随机的。

验证这一点的最佳方法是创建 ACF 图:

白噪声分布在所有滞后处的自相关约为 0。

还有“严格的”白噪声分布,它们具有严格的 0 序列相关性。这不同于褐色/粉红色噪声或其他自然随机现象,在这些现象中存在微弱的序列相关性,但仍保持无记忆。

白噪声在预报和模型诊断中的重要性

照片由爱德蒙·邓蒂斯从像素拍摄

尽管白噪声分布被认为是死胡同,但它们在其他情况下可能非常有用。

例如,在时间序列预测中,如果预测值和实际值之间的差异代表一个白噪声分布,您可以为自己的出色工作而感到欣慰。

当残差显示任何模式时,无论是季节性的还是趋势性的,或者具有非零均值,这表明仍有改进的空间。相比之下,如果残差是纯粹的白噪声,那么您已经超出了所选模型的能力。

换句话说,该算法设法捕捉到了目标的所有重要信号和属性。剩下的是随机波动和不一致的数据点,它们不能归因于任何东西。

例如,我们将使用七月的 Kaggle 游乐场竞赛来预测空气中的一氧化碳含量。我们将保持输入“原样”,我们不会执行任何特征工程,我们将选择一个带有默认参数的基线模型:

为简洁起见,省略了初始化和训练/测试分割步骤

ACF 图中有一些模式,但它们在置信区间内。这两个图表明,即使使用默认参数,随机森林也可以从训练数据中捕获几乎所有的重要信号。

随机漫步

时间序列预测中更具挑战性但同样不可预测的分布是随机游走。与白噪声不同,它具有非零均值、非恒定标准差/方差,绘制时看起来很像正态分布:

这难道不像雅虎财经里的股票情节吗?

随机漫步系列总是以这种方式巧妙伪装,但它们仍然一如既往地不可预测。对今天价值的最佳猜测是昨天的。

初学者的一个常见困惑是将随机漫步视为一个简单的随机数序列。事实并非如此,因为在随机漫步中,每一步都依赖于前一步。

出于这个原因,随机游走的自相关函数返回非零相关性。

随机漫步的公式很简单:

无论前面的数据点是什么,添加一些随机值,并继续下去,只要你喜欢。让我们用 Python 来生成这个,比如说,初始值为 99:

让我们也画出 ACF:

如你所见,前 40 个滞后产生了统计上显著的相关性。

那么,当可视化不是一个选项时,我们如何检测随机游走呢?

由于它们是如何产生的,区别时间序列应该隔离每个步骤的随机添加。取一阶差是通过将序列滞后 1 并从原始序列中减去它来完成的。熊猫有一个方便的diff功能来做到这一点:

如果你画一个时间序列的一阶差分,结果是白噪声,那么就是随机游走。

漂移随机游动

对常规随机行走的一个微小修改是添加一个常数值,称为随机漂移步长:

漂移通常用μ表示,就随时间变化的值而言,漂移意味着逐渐变成某种东西。

例如,即使股票不断波动,它们也可能出现正漂移,即随着时间的推移,总体上逐渐增加。

现在,让我们看看如何用 Python 来模拟这一点。我们将首先创建起始值为 25:

从上面的公式中,我们看到,我们需要在每一步添加所需的漂移。我们再加上漂移 5,看剧情:

尽管有剧烈的波动,这个系列还是有明显的上升趋势。如果我们进行差分,我们将看到该系列仍然是随机行走:

drifty_walk.diff().plot();

统计检测随机游走

你可能会问,是否有比仅仅从图中“目测”更好的识别随机游走的方法。

作为回答,Dicker D. A .和 Fuller W. A .在 1979 年提出了一个假设检验,它被称为扩展的 Dickey-Fuller 检验。

本质上,它试图检验一个序列遵循随机游走的零假设。在引擎盖下,它回归滞后价格的价格差异。

如果找到的斜率(β)等于 0,则该系列为随机行走。如果斜率明显不同于 0,我们拒绝序列遵循随机游走的零假设。

幸运的是,您不必担心数学问题,因为测试已经用 Python 实现了。

我们从statsmodels导入adfuller函数,并将其用于上一节创建的漂移随机行走:

我们看 p 值,大约是 0.26。因为 0.05 是显著性阈值,我们不能拒绝零假设,即drifty_walk是随机漫步,即随机漫步。

让我们对一个我们知道不是随机游走的分布进行另一个测试。我们将使用 TPS 七月 Kaggle 游乐场竞赛中的一氧化碳指标:

p 值非常小,表明我们可以很容易地拒绝零假设,即target_carbon_monoxide遵循随机游走。

摘要

我们只完成了这个时间系列“系列”的第三部分,你已经知道很多了。

从现在开始,随着我们越来越接近系列中实际的“预测”部分,事情只会变得越来越有趣。有一些有趣的文章计划在关键的时间序列主题,如平稳性和时间序列交叉验证。

此外,我将专门针对时间序列的特征工程师写一篇文章——这是一件令人兴奋的事情!敬请期待!

您可能也会感兴趣…

  • 每一个你可以(应该)用来操纵时间序列的熊猫函数
  • Python 中的高级时间序列分析:分解、自相关
  • Matplotlib vs. Plotly:让我们决定一劳永逸**

如何检测时间序列中的季节性、异常值和变化点

原文:https://towardsdatascience.com/how-to-detect-seasonality-outliers-and-changepoints-in-your-time-series-5d0901498cff?source=collection_archive---------1-----------------------

只需要 Kats 和几行代码

动机

你有没有看过一个时间序列,想知道其中是否有重复的模式、异常值或变化点?

当我查看 2021 年 1 月至 8 月每天有多少用户浏览我的页面时,我问了同样的问题。

当看到上面的图表时,我想知道:

  • 我的页面平均浏览量有变化吗?如果是,什么时候?
  • 我的时间序列中有异常值吗?如果是,什么时候?
  • 我怀疑有一些时间比其他时间有更多的活跃用户。这是真的吗?

如果您能像下面这样用几行代码就能检测出时间序列中的突然变化,那不是很好吗?

作者图片

这就是 Kats 派上用场的时候。在的上一篇文章中,我介绍了 Kats 提供的一些分析时间序列的有用方法。在本文中,我将更深入地研究 Kats 的检测模块。

什么是 Kats?

Kats 是一个轻量级的、易于使用的、通用的框架,用 Python 来执行时间序列分析,由脸书研究院开发。您可以将 Kats 视为 Python 中时间序列分析的一站式商店。

要安装 Kats,请键入:

pip install --upgrade pip
pip install kats==0.1 ax-platform==0.2.3 statsmodels==0.12.2

我把我的页面浏览量数据上传到了 Google Drive 上,这样你就可以自己摆弄这些数据了。要下载数据,请使用 gdown:

pip install gdown

上面的数据显示了从 6 月 1 日到 8 月 2 日,我的网站**每小时**的访问量。让我们想象一下这些数据是什么样子的。

我怀疑每天都有正常运行时间和停机时间。让我们通过放大 2021 年 6 月 1 日的数据来验证一下:

作者图片

这里有一些模式。让我们看看 2021 年 6 月 2 日是否能看到同样的模式:

作者图片

看起来这里有一些重复的模式,但不是很容易看到。上图中混合了季节性、趋势和噪声。让我们使用 Kats 将时间序列分解成趋势、季节性和残差。

检测季节性

什么是季节性?季节性是时间序列的一个特征,在该时间序列中,类似的变化以小于一年的特定规则间隔发生,例如每小时、每天、每周或每月。

时间序列分解-季节性分解

要使用 Kats 分解时间序列,首先要构建一个时间序列对象。

接下来,将时间序列分解为 3 个不同的部分:

作者图片

啊哈!看起来数据中有季节性。让我们仔细看看 6 月 1 日的季节性部分。

作者图片

让我们再来看看 6 月 2 日的季节性:

作者图片

6 月 3 日时间序列:

作者图片

现在格局清晰多了!早上 8 点到晚上 12 点是观看人数的高峰。这种模式是有意义的,因为我每天早上 8 点左右写一篇新文章,早上 10 点发一篇时事通讯。

除了手动查看图表,有没有一种测试可以让我们确认时间序列中确实存在季节性?是的,我们可以用 Kats 的快速检测器来做。

快速傅立叶变换季节性检测器

除了分解时间序列,Kats 还允许我们使用快速傅立叶变换来检测季节性,并找出潜在的周期长度。

{'seasonality_presence': True, 'seasonalities': [56.0, 24.0]}

酷!现在我们知道时间序列中确实存在季节性,季节性要么是 24 小时,要么是 56 小时。24 小时季节性证实了我们之前看到的。

检测变化点

CUSUMDetector —检测平均值的向上/向下移动

现在,我好奇的另一个问题是,是否存在一个期,在此之后,每天的平均浏览量会发生变化。

要回答这个问题,先从获取 11 日到 8 月 2 日的**日报**数据开始:

可视化数据:

看起来在 2021 年 4 月初的某个地方有一个手段的转变。让我们用 CUSUM 来确认。

CUSUM 是一种测试变点是否具有统计显著性的方法。Kats 允许您将累计方法与累计检测器一起使用。

TimeSeriesChangePoint(start_time: 2021-04-01 00:00:00, 
                      end_time: 2021-04-01 00:00:00, 
                      confidence: 0.9999999999999967)

作者图片

是啊!现在我们被证实在 41 日有一个手段的转变。

BOCPDetector —检测突然的变化

贝叶斯在线变化点检测(BOCPD)是一种检测持续时间较长的时间序列中的突然变化的方法。BOCPD 的一些属性是:

  • **在线模型:**这个检测只需要看前面几步,而不是看整个系列来做预测。随着新数据的到来,它会修正自己的预测。
  • **贝叶斯模型:**您可以指定关于变点概率的先验信念。例如,如果您认为 1%的数据将是一个变化点,那么您可以设置changepoint_prior=0.01

目前,Kats 支持 3 种概率模型:

  • 正态分布
  • 趋势变化分布
  • 泊松过程模型。

在此找到 BOCPDetector 中所有可用的参数。

我们将使用正态分布作为潜在的概率模型。因为我相信我的数据中大约有 1%是一个变点,所以我将设置changepoint_prior=0.01

TimeSeriesChangePoint(start_time: 2021-06-14T00:00:00.000000000,
                      end_time: 2021-06-14T00:00:00.000000000, 
                      confidence: 0.74723810504334)TimeSeriesChangePoint(start_time: 2021-06-23T00:00:00.000000000,
                      end_time: 2021-06-23T00:00:00.000000000,  
                      confidence: 0.5250604974512938)

作者图片

变化点在 2021 年 6 月 14 日和 2021 年 6 月 23 日。这个结果是有意义的,因为我们看到 2021 年 6 月 14 日的浏览量显著增加,而 2021 年 6 月 23 日的浏览量下降。

异常检测和去除器

剔除异常值在时间序列中非常重要,因为异常值会给下游处理带来问题。幸运的是,Kats 使得检测和去除异常值变得很容易。

Kats 的异常值检测算法是这样工作的:

  1. 使用季节分解来分解时间序列
  2. 去除趋势和季节性以生成剩余时间序列
  3. 检测残差中超出四分位数范围 3 倍的点

让我们使用 OulierDectector 来尝试一下这种检测算法:

[Timestamp('2021-04-03 00:00:00'),
 Timestamp('2021-06-20 00:00:00'),
 Timestamp('2021-06-21 00:00:00')]

不错!我们能够检测 2021 年 43 日、2021 年 6 月 20 日和 2021 年 6 月 21 日的异常值。

现在我们已经检测到了这些异常值,让我们使用remover方法移除它们。我们还将使用新的线性插值替换移除的值:

绘制原始时间序列和剔除异常值的新时间序列。

作者图片

酷!从上图中我们可以看出,剔除异常值后的时间序列(橙色线)与 2021 年 43 日、2021 年 6 月 20 日和 2021 年 6 月 21 日的原始时间序列(蓝色线)不同。

在新的时间序列中似乎没有显著的异常值。现在,您可以放心地将这个新的时间序列用于其他过程,例如预测。

结论

恭喜你!您刚刚学习了如何使用 Kats 检测季节性、变化点和异常值。我希望这篇文章能给你在自己的时间序列中发现模式的动力。

您只需使用几行代码就可以获得有用的信息。还有什么比这更好的呢?

随意发挥,并在这里叉这篇文章的源代码:

https://github.com/khuyentran1401/Data-science/blob/master/time_series/google_analytics/google-analytics-analysis.ipynb

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedIn 和 Twitter 与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 使用 dirty_cat 对脏类别进行相似性编码

towardsdatascience.com](/similarity-encoding-for-dirty-categories-using-dirty-cat-d9f0b581a552) [## 如何用 Excalidraw 勾画您的数据科学想法

towardsdatascience.com](/how-to-sketch-your-data-science-ideas-with-excalidraw-a993d049f55c)

如何确定正确的集群数量(带代码)

原文:https://towardsdatascience.com/how-to-determine-the-right-number-of-clusters-with-code-d58de36368b1?source=collection_archive---------38-----------------------

如何使用 KMeans &确定在您的分析中使用多少个集群

分类是数据科学工具包中的一项基本技能。它可以解决从用户细分到异常检测的大量问题,并可以帮助您的团队获得非常有趣的见解。

照片由克里斯里德在 Unsplash 上拍摄

为您的项目确定正确的集群数量是一门艺术,而不是科学。在本文中,我将介绍几种确定集群数量的常用方法。

以下所有示例都将涉及以下导入:

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom sklearn.cluster import KMeans

以及以下变量:

min_clusters = 2max_clusters = 15

#1:组内平方和(WSS)

该指标的目标是找到 WSS 曲线的“肘”,以确定在数据中获取最多信号的最少聚类数。如果这个定义听起来模糊而主观,那是因为它确实如此——找到图表的“肘部”当然是一个主观决定。

类内平方和(WSS)是每个质心距离其各自的类实例有多远的度量。WSS 越大,聚类值离质心越分散。我们可以把 WSS 定义为:

def within_sum_of_squares(data, centroids, labels):

    SSW = 0
    for l in np.unique(labels):
        data_l = data[labels == l]
        resid = data_l - centroids[l]
        SSW += (resid**2).sum()
    return SSW

通过简单地迭代每个聚类的数据,我们可以生成肘形曲线:

wss_list = []for i in range(min_clusters, max_clusters+1):
  print('Training {} cluster algo...'.format(i))
  km = KMeans(n_clusters=i)
  km.fit(data)
  wss = within_sum_of_squares(np.array(data),km.cluster_centers_, km.predict(data))    
  wss_list.append(wss)plt.plot(wss_list)
plt.title('WSS Plot')
plt.xlabel('# of Clusters')
plt.ylabel('WSS')plt.show()

作者制作

从上面的示例中,我们可以确定 4–5 个集群是合适的集群数量,因为添加了额外的集群。

分割这些数据的另一种方法是通过每个聚类的相对改进。通过设置一个阈值,比如说 5%,我们可以看到在多少个集群上,低于 5%的额外集群的回报会开始减少

perc_improve_list = [0]
rel_improvement = []
base_wss = wss_list[0]
for i in range(len(wss_list)):
  improvement = (wss_list[0] - wss_list[i])/wss_list[0]
  rel_improvement.append(improvement - perc_improve_list[-1])
  perc_improve_list.append(improvement)

threshold = 0.05plt.plot([i for i in range(min_clusters+1,max_clusters+1)], rel_improvement[1:])
plt.axhline(threshold, linestyle='--', color='grey')
plt.title('WSS Improvement Plot')
plt.xlabel('# of Clusters')
plt.ylabel('% improvement in WSS')
plt.ylim([0,1])
plt.show()

作者制作

这张图表显示了与第一组相同的结果,4-5 个集群,尽管更清晰一些。我更喜欢这个输出,因为它为图表提供了一个客观的阈值,我们可以在以后修改它。

#2 平均轮廓得分

“最佳聚类数 k 是在 k 的可能值范围内使平均轮廓最大化的数”(Kaufman 和 Rousseeuw,1990 年)

轮廓分数是(除了是一个我第一次尝试都不能正确拼写的单词)一个特定的例子与来自其他聚类的例子有多接近。与其他聚类示例的距离越大,聚类之间的划分就越清晰,因此聚类就越好。

如上所述,根据最大化平均轮廓分数的聚类数量,优于其他选项。

为了计算轮廓分数,我们可以使用 SKLearns 内置函数:

from sklearn.metrics import silhouette_score
sil_score_list = []
for i in range(min_clusters, max_clusters+1):
  print('Training {} cluster algo...'.format(i))
  km = KMeans(n_clusters=i)
  km.fit(data)
  sil = silhouette_score(np.array(data),km.predict(data))
  sil_score_list.append(sil)

plt.bar([i for i in range(2,len(sil_score_list)+2)],sil_score_list)
plt.title('Sil Plot')
plt.xlabel('# of Clusters')
plt.ylabel('Sil Score')
plt.show()

作者制作

对于这个度量,它似乎指向使用 3 个聚类来最大化平均轮廓分数。WSS 和希尔的分数不会总是一致的,因为他们衡量的是不同的东西。结合使用这两种方法,以及下面概述的第三种方法,将有助于您做出最明智的决定。

请注意:虽然我不知道 SKLearn Silhouette algo 的大 O 符号(有人知道的话请评论!)但这比上述 WSS 搜索花费的时间要长得多。WSS 代码大约半小时就完成了,而剪影代码花了 4 个多小时。做好准备!

#3 具体使用案例

关于有多少集群是正确的,真正的答案是:

无论什么对你的团队和项目最有意义

这似乎是一个逃避的答案(当然也不是数据科学的答案),但比 WSS 或剪影分数更重要的是,你生成的聚类有助于你完成手头的任务。

切瑞迪克在 Unsplash 上拍摄的照片

验证聚类强度的方法还有很多,从 Dunn Statics 到 Gap Metrics,但是验证您的聚类方法的真正方法是确保它能够回答您正在寻找的问题。数据科学家常常只见树木不见森林,强调多个数据驱动的成功标准而不是为团队产生成果是一个常见的错误。

如果你希望这些集群为你的业务生成人类可解释的原型,也许是为了通知市场营销,那么你不希望使用超过 10 个集群;否则,你的营销团队会因为太多的人物角色而陷入困境。

另一方面,如果您使用聚类进行个性化,您会希望尽可能多的有意义的聚类,因为您创建的聚类越多,您就能为您的客户提供越多独特的体验。微细分对于推荐来说是非常好的,但是以可解释性为代价。

因此,当确定集群时——确保你与项目的利益相关者在同一页上,并确信你可以从非技术的角度证明集群的数量,无论是 2 个还是 200 个。

希望你喜欢!

如何发展沟通技巧以获得技术性工作

原文:https://towardsdatascience.com/how-to-develop-communication-skills-to-get-a-technical-job-ee8bdf7d503?source=collection_archive---------49-----------------------

我如何学会有效沟通并获得一份数据科学工作

克里斯托夫·高尔在 Unsplash 上拍摄的照片

介绍

口头和书面沟通技巧是获得任何工作的关键。我认为这些技能在数据科学和编程等技术职业中尤为重要。你可能是世界上最有才华的数据科学家,但是如果你不能有效地交流你的模型和分析,没有人会感兴趣。

每个面试过程都至少会有一个行为部分,你必须描述你生活中的不同故事,这些故事让你非常适合这个角色和公司。此外,大多数数据科学和编程职位都包括面试过程中的技术部分,在面试过程中,你必须描述解决类似于你将在该职位中解决的问题的过程和结果。要获得这类工作,你需要有效地描述你生活中的事件和你解决问题的思维过程。

我并不是说发展你有效编程、分析数据和建立模型的技能不重要。这些技能也是获得数据科学技术职位所必需的。好消息是,有成千上万的免费和付费资源可以用来开发这些技能。

从我的经验来看,技术和沟通技能发展的区别在于,后者需要更多的重复来掌握。你不可能只看一堂关于沟通的课程就立刻成为一个更好的沟通者。这些课程可能会给你提供有效的改进工具,但你需要多次应用它们,以学习如何根据你自己的个性和沟通风格来使用它们。

王占山在 Unsplash 上拍照

我是宾夕法尼亚大学的四年级学生,本科主修统计和金融,并获得了数据科学的硕士学位。我将于 2021 年 5 月毕业,在 Wayfair 担任技术分析师,分析营销数据。

作为一个会认为自己非常内向的人,我花了很多精力来培养有效沟通的能力。在过去的四年大学经历中,我一直致力于培养一名有效的沟通者。我现在认为向非技术利益相关者解释技术信息是我最大的优势之一。我写这篇文章的目的是描述我的过程和旅程,帮助你理解发展这一重要技能的潜在途径。

发展技术交流技能

与发展任何其他技能类似,获得尽可能多的练习机会会产生最佳效果。如果你想找一份数据科学或任何技术方面的工作,你需要练习有效地交流技术信息。

我在大二的时候就知道我想在毕业后从事这种类型的工作。那时,我甚至对我的同学描述统计学和计算机科学概念都不太舒服。每当我的教授想给学生打电话时,我都会很紧张,因为我对自己有效传达答案的能力没有信心。

为了更好地适应这一点,我申请成为一名统计学入门课程(后来是计算机科学入门课程)的导师。我知道我理解这些概念,只需要努力实际沟通它们。

这导致了每周 10 节 1 小时的辅导课,在那里我有机会练习交流技术信息。这些会议都是为了两个不同的课程。这让我有机会反复改进我与多个学生交流同一个话题的方式。我会根据每个学生在课程结束时的理解程度来寻找反馈,并尝试在下一次课程中改进我的方法。

我发现这些介绍性的课程给了我和那些以前没有接触过这些话题的学生交谈的机会。对我来说,这是一个发展我与非技术受众沟通能力的绝佳机会(这是技术角色的一项关键技能)。

暑假期间,我在学校组织的一个项目中担任助教,在这个项目中,我们向高中生教授体育背景下的统计学和计算机科学概念。

Unsplash 上由海拉戈斯蒂奇拍摄的照片

当我面试全职职位的时候,我已经可以很自如地解释这类信息了。在多次面试过程中,我被要求分析数据,并向一名非技术员工展示我的发现。这些演示进行得非常顺利,我在演示过程中感到非常舒服。

如果你不在大学,没有机会申请助教或家教职位,有很多选择可以发展这项技能。你可以开一个 YouTube 频道,或者写一些博客文章来讨论一些技术性的东西。你也可以和朋友或家人谈论这些话题。如果你对这个话题感兴趣,我相信他们会很乐意听你谈论这个话题。

重复对于培养你的交流能力(尤其是技术信息)非常重要。它们允许你反复改进和掌握这些必要的技能。你的实践不需要什么开创性的东西。我每周只和 10 名学生交谈,很快就感受到了显著的进步。

发展与招聘人员沟通的技巧

另一个重要的技能是你与招聘人员和面试官交谈的能力。在这些环境中变得舒适是一种技能,也只能通过重复来培养。当你开始与面试官谈论你真正感兴趣的职位时,没有其他方法可以复制你的紧张感。

彼得·琼斯在 Unsplash 上拍照

现在就开始申请工作。练习面试的唯一方法就是实际面试。你可以(也应该)尽可能多地练习处理案例和技术问题,但如果没有面试,你将无法充分发展面试技巧。推迟这个过程,直到你已经完成了每一个案例问题,有了一份完美的简历,将会阻碍你的发展。

你也可以通过参加招聘会来练习这种技能。招聘会让你可以更快、更轻松地与一群不同的招聘人员交谈。如果谈话进行得不顺利,实际上不会有任何负面后果,如果进展顺利,你只是和招聘人员建立了联系。我在大一的时候开始参加这些活动,当时我甚至不打算申请接下来夏天的实习。

在这些招聘会上,我与招聘人员进行了一些非常尴尬的对话,一些非常有见地的对话让我最终申请并喜欢上了 Wayfair 这样的公司(毕业后我将在那里工作)。关键是做好准备,快速介绍你自己(你是哪一年,你学什么,你对什么职位感兴趣,等等)。)以及一些关于公司和角色的问题。这是任何行为面试的两个组成部分,你有机会与数百名想与你交谈的招聘人员一起练习。

练习这些技能的最后一个方法是,在你感兴趣的公司里,接触那些在你感兴趣的职位上工作的人。你可以问他们是否有几分钟时间和你谈谈他们是如何走到现在这一步的。很多人都很乐意和你谈论他们是如何成功的,并帮助你。很多人也不是。不要为拒绝或没有回应而焦虑。许多人只是很忙,没有太多的时间聊天。有没有兴趣总是值得一问的。

到了大四,当我与面试官交谈时,我明显感觉更自信了,尤其是在行为面试中。他们中的大部分人只是感觉像是在交谈(事实上也是如此),压力较小。在我大二的头几次面试中,我明显变得更加刻板和不自在。面试官只想和你聊聊。练习与他们交谈有助于你与他们交谈。

照片由奥斯丁·潘在 Unsplash 上拍摄

结论

我不认为我培养有效交流技术信息或与面试官轻松交谈的技巧是唯一的方法。然而,我知道集中重复是提高沟通能力的唯一方法。

不可能了解数据科学和编程的一切。这就是我们热爱这个领域的原因。成长和学习的机会总是有的。同样,做一个完美的沟通者也是不可能的。我们总是有机会发展这种技能,这可能是一个我们喜欢的过程。这就是为什么我总是在寻找新的发展机会(比如前几天开始在 Medium 上写作)。

这项技能的大量发展需要感觉不舒服,这是成长的必要步骤。拥抱它。随着你练习的越来越多,让你不舒服的事情也就不再觉得不舒服了。

沟通是所有面试过程中不可避免的一步。不要忽视它。我们可能会陷入 LeetCode 的实践案例和技术编码问题中,而忘记发展这项技能。

拒绝是招聘过程中不可避免的一部分,尤其是在这段时间。拒绝只是帮助你在这个过程中提高的又一次重复。如果你有足够的天赋,你最终会有所发现。只要继续努力和学习。

感谢您花时间阅读这篇文章。祝你在招聘过程中好运。

如何利用深度学习开发可解释的时间序列预测

原文:https://towardsdatascience.com/how-to-develop-interpretable-time-series-forecasts-with-deep-learning-50b27bfcb8a1?source=collection_archive---------3-----------------------

对神经原植物的简明而全面的总结。

时间序列预测烂透了。这很麻烦,需要主题和技术知识。也就是说,直到现在。

图 1: NeuralProphet 快速启动预测。图片作者。

2020 年,斯坦福和脸书的研究人员重组了先知算法以包括深度学习组件。主要卖点是准确度提高了 55–92%。该模型的深度学习部分建立在 PyTorch 之上,因此它们很容易扩展。运行时间平均增加了大约 4 倍,但是时间序列预测很少是实时的,所以运行时间不是主要问题。

如果你需要一个可解释但强大的时间序列预测,NeuralProphet 可能是你最好的选择。这里有一个实现示例。

让我们开始吧。

技术 TLDR

NeuralProphet 是原始 Prophet 库的深度学习扩展。该模型的游戏结构保持不变,我们只是包括几个深度学习术语。这些术语是滞后协变量、未来(预测)协变量和自回归。下面描述了三种具有递增复杂性的神经网络配置。

但是,到底是怎么回事呢?

好吧,让我们慢一点。我们将从头开始,假设你对脸书·先知一无所知。

1 —什么是脸书先知?

最初的脸书先知算法 (2017)是非常轻量级但有效的时间序列预测模型。它是为了易于使用和解释而构建的,这种描述很少与时间序列建模联系在一起。

根据的原始论文,该模型成功了,因为研究人员将时间序列预测重新定义为一个曲线拟合问题,而不是一个自回归问题。许多以前的模型,如 ARIMA,滞后和拟合数据,而不是试图找到我们趋势的函数形式。

图 2:初始脸书先知算法术语。图片作者。

该模型有三个主要组件,如图 2 所示。 *T(t)* 对应于我们的时间序列去除季节性后的趋势。S(t) 对应于我们的季节性,无论是每周、每月还是每年。最后, *E(t)* 对应于预先指定的事件和假期。

每一个组成部分都有一个拟合过程,一旦拟合,它们通常会结合起来产生一个可靠的预测。

为了更直观地展示这些组件,下面是 Prophet 文档中的分解图。

3:培顿·曼宁触地得分数据— src 的趋势(上)、事件(中)和每周季节性(下)。作者图片

既然对 NeuralProphet 的前身有了一些基础,那就继续吧。

2 —神经营养蛋白是如何工作的?

NeuralProphet 向我们的原始框架添加了三个组件,如图 4 的第二行所示。

4:神经先知算法术语。图片作者。

前三项在两种模型中基本保持不变。最后三个是深度学习术语,用于区分新模型和旧模型。让我们依次看一看每一个。

2.1 —趋势T(T)

趋势与之前的 Prophet 模型保持不变。简而言之,我们希望使用指数或线性增长函数来模拟趋势。下面我们来看看指数增长(图 5):

图 Prophet 中使用的指数增长方程。 C 为承载能力, k 为增长率,m 为偏移参数。图片作者。

使用逻辑增长是一种非常传统且广为接受的解决方案,然而原始 Prophet 模型的创新之处在于它允许函数的参数发生变化。这些变化点由模型动态确定,并给予其他静态增长率和偏移参数更多的自由度。

2.2 —季节性 S(t)

图 6:年度季节性成分图— src 。图片作者。

季节性被定义为以特定的规则间隔发生的变化。众所周知,这很难解释,因为它可以有很多种形式。

该模型的最初开发者提出了另一个伟大的想法——他们不是试图用自回归(即滞后数据)来模拟季节性,而是试图模拟季节性的曲线。这就是傅立叶级数的由来。

傅立叶级数是一组正弦曲线的总和,可以用来拟合任何曲线。一旦我们有了数据的每日、每周、每月等的函数形式。季节性,我们可以简单地将这些项添加到我们的模型中,并准确地预测未来的季节性。

2.3 —事件 E(t)

最初的先知模型中的最后一个术语是用来处理事件的。

季节性和事件的处理方式几乎相同——使用傅立叶级数。然而,给定一个特定的假日,我们期望我们的傅立叶变换产生一个非常尖锐的曲线,而不是平滑的曲线。而且,因为底层函数是正弦函数,所以它们很容易扩展到未来。

现在让我们继续讨论新的模型。

2.4 —回归变量 F(t),L(t)

Prophet 和 NeuralProphet 模型的一个强有力的方面是它们考虑到了协变量。大多数时间序列预测模型都是单变量的,尽管它们有时也提供多变量版本——ARIMA vs 玛丽玛。

当用时间序列预测处理协变量时,我们需要确保那些协变量将提前 n 个时间段出现,否则我们的模型就没有什么可预测的了。我们可以通过将当前协变量延迟 n 个时间段来实现这一点,这由 L(t) 项建模,或者为这些协变量开发一个预测,这由 F(t) 项建模。

一旦我们有了各自的协变量,我们就可以进行深度学习(第 3 节)。

2.5—自动回归 A(t)

最后,自回归是回顾以前的值并将其用作未来值的预测值的概念。最初的 prophet 模型非常有效,因为它远离了这种哲学,但是为了利用深度学习,我们必须返回。

自回归项使用滞后值来预测未来值。在实践中,我们很少使用协变量,所以这是大部分神经先知的力量来自。

有了那个结构,让我们放大一下 NeuralProphet 使用的深度学习模型。

3 —深度学习模型

NeuralProphet 构建在 PyTorch 和 AR-Net 之上,因此它的模块很容易定制和扩展。

有几种配置。第一个是线性 AR ,它只是一个单层神经网络(NN),没有偏置或激活函数。它非常轻量级,将特定的滞后回归到特定的预测步骤,这使得解释模型非常容易。

Deep AR 是一个全连接的 NN,具有指定的隐藏层数和 ReLU 激活函数。随着线性 ar 和深度 AR 之间复杂性的增加,训练时间越来越长,你失去了可解释性。但是,您通常会看到预测准确性的提高。同样需要注意的是,您可以使用每个输入位置的第一层绝对权重的总和来近似计算线性 ar 中权重的信息。虽然不完美,但总比没有强。

稀疏 AR 是深度 AR 的延伸。对于自回归部分,通常最好使用高阶 AR(在之前的时间步长有更多值),因为我们可以添加一个正则项。通过添加更多的数据并在拟合过程中自动去除其重要性,我们更有可能找到信号。

以上三种方法中的任何一种都可以用协变量和自回归值来实现。

摘要

这就是你要的,神经保护,这是荣耀!

为了深入理解这些概念,我们将快速总结一下。

NeuralProphet 是脸书先知的深度学习扩展。它通过在时间序列的协变量和数据上包括深度学习术语,增加了先前的模型。

初始模型(Prophet)利用曲线拟合,这是一种时间序列预测的新方法。它提供了无与伦比的开箱即用的性能和可解释性,但是我们需要更多的建模能力。NeuralProphet 为 Prophet 添加了深度学习术语,这些术语由三种神经网络配置管理。NeuralProphet 显著提高了模型拟合能力,但降低了性能和可解释性。

如果脸书先知不切它,尝试神经普罗菲特。

感谢阅读!我会再写 25 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。

如何区分缩放、规范化和对数转换

原文:https://towardsdatascience.com/how-to-differentiate-between-scaling-normalization-and-log-transformations-69873d365a94?source=collection_archive---------4-----------------------

获取特征工程数值变量的实用知识

了解标准化(缩放)、规范化和对数变换之间的根本区别。深入了解何时应用每种方法,并选择其中一种方法。

照片由 乔治·贝克尔 像素

符合统计方法意味着什么?

您可能在课程或文章中遇到过这种情况:

数据集中的要素应符合模型的统计假设。

符合统计假设是什么意思?如果数字特征或多或少不遵循标准的高斯(正态)分布,那么在 Sklearn 中实现的许多模型可能表现不佳。除了基于树的模型,Sklearn 算法的目标函数假设特征遵循正态分布。

实际上,用这个词假设会把事情看得很轻。对于像 K-最近邻这样的模型,特征变换是算法预期执行的一个要求:

在实践中,您甚至可能面临这样的场景,其中特性转换的效果甚至比性能提高 5%还要显著。

您可以应用多种技术来使您的要素或多或少地遵循正态分布,并且它们根据每个要素的基础分布而有所不同。

这篇文章将教你三种技术:缩放、归一化和对数变换。您将对它们的差异以及何时在您的工作流程中应用它们有一个实际的了解。

https://ibexorigin.medium.com/membership

获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:

https://alphasignal.ai/?referrer=Bex

识别特征的基本分布

在应用您将要学习的任何技术之前,直观地探索每个特性是很重要的。你不必创造完美的情节;具有默认样式的简单直方图和箱线图将足以识别分布。看看这些来自 Seaborn 钻石数据集的直方图:

请密切注意分布的形状和 X 轴上的范围。支线剧情显示价格和克拉特征遵循偏斜分布,深度、表格和 x 可能有点像正态分布。

除了分布之外,值的范围也是特性的一个重要方面。箱线图最好使用五位数的摘要来显示这一点:

>>> diamonds.boxplot()

上面的剧情足以告诉我们,特征有非常不同的尺度。由于钻石价格具有更大的价值尺度,他们将其他箱线图压成一条线。以下是五位数的总结,以供进一步比较:

>>> diamonds.describe().T.round(2)

既然您已经了解了如何识别分布的形状以及每个要素的比例差异,那么到本文结束时,我们将使所有要素都具有相同的比例,并且或多或少地遵循正态分布,如下所示:

使用 StandardScaler 进行缩放或标准化

解决一个要素的方差比其他要素大得多的情况的默认方法之一是使用缩放(也称为标准化):

根据官方 Sklearn 关于缩放的指南:

学习算法的目标函数中使用的许多元素假设所有特征都以零为中心,并且具有相同数量级的方差。如果某个特征的方差比其他特征的方差大几个数量级,那么它可能会主导目标函数,使估计器无法像预期的那样正确地从其他特征中学习。

因此,许多模型通常需要伸缩来实现高性能。Sklearn 在StandardScaler()转换器中实现了这一点,转换器数字特征转换为平均值为 0,方差为 1。

SS 通过两种操作实现这一点:

  1. 居中:从分布中的每个值中减去平均值。
  2. 缩放:将每个结果除以标准偏差。

这些操作使原始特征遵循正态分布。下面是我们如何手动完成这项工作:

我们忽略了价格和克拉特征,因为它们遵循一个偏斜的分布。稍后将详细介绍。

让我们对StandardScaler()做同样的事情:

同样的结果。

检查平均值和方差:

现在,让我们关注缩放的有效性。深度和 x T4 现在看起来真的像高斯分布。然而,特征表、 *y、*和 z 仍然挤在它们的图的角落里,表明异常值的存在(否则,大部分直方图会在中心)。这意味着缩放在深度和 x 特征上效果更好,但在其他特征上效果不佳。我们将在接下来的章节中记录这一点。

使用 PowerTransformer 进行日志转换

当一个要素不遵循线性分布时,使用平均值和标准差对其进行缩放是不明智的。例如,如果我们缩放价格和克拉的偏态分布,会发生以下情况:

特征仍然是倾斜的这一事实证实了标准化对它们不起作用。

为了实现非线性转换,Sklearn 提供了一个PowerTransformer类(使用对数函数),帮助最小化偏斜度,并将任何分布尽可能地映射到正态分布:

>>> diamonds[["carat", "price"]].var()carat    1.000019
price    1.000019
dtype: float64

新功能看起来比旧的倾斜功能好得多。因此,每当面对偏斜分布时,使用PowerTransformer类。

使用最小最大缩放器归一化

缩放的替代方法称为归一化。归一化不使用方差和平均值,而是使用分布的最小值和最大值。以下等式用于每个值:

作者图片

这种变换的效果是给出分布的绝对最小值和最大值,通常在 0 和 1 之间。Sklearn 提供了一个类似的MinMaxScaler转换器来实现这一点:

即使强制要素遵循正态分布,要素也不会有单位方差和平均值 0:

但是,使用这种方法有一些注意事项。例如,如果训练集中的最大值小于测试集中的最大值,缩放可能会导致意外的预测。最小值也是如此。

此外,MinMaxScaler 不能很好地处理含有异常值的要素。我留给你去思考为什么(提示:注意 MMScaler 的公式)。

此外,MinMaxScaler 根本不会改变分布的形状。归一化后,值位于给定范围内,但分布形状保持不变。

由于这些原因,StandardScaler 的使用频率更高。

把所有的放在一起

在本节中,我们将尝试使用逻辑回归算法来预测钻石切工。我们将在管道中使用 StandardScaler 和 PowerTransformer。如果你不熟悉 Sklearn 管道和 ColumnTransformers 的工作原理,可以看看这篇文章:

让我们开始吧。首先,我们将构建特性/目标数组,并提取我们将应用转换器的列的名称:

接下来,我们将创建一个 ColumnTransformer 对象,该对象将转换器映射到相关的列:

我们将把这个变压器插入一个以逻辑回归结尾的管道:

最后,我们将数据分为训练集和测试集,并测量分类器的性能:

我们的 ROC AUC 值为 0.83。此时,您可以开始超参数调整来改善这一点。

上述变压器的数据泄漏注意事项

无论何时进行预处理,都要注意数据泄漏。因为我们今天学习的所有转换器都是从特性的底层分布中获得度量的,所以它们很容易从测试数据中泄露数据。

这就是为什么建议在预处理之前将数据分成训练/测试集。此外,不要在测试集上使用fit_transform()方法。变压器应全部符合训练数据,随后的转换应仅使用transform方法:

但是,在管道中使用这些变压器就不用担心这个了。Sklearn 在拟合和转换特征时会处理引擎盖下的数据泄漏。

摘要

在本文中,您学习了如何对数字要素进行特征工程,以符合许多模型的统计假设。具体来说,我们学习了如何:

  • 使用StandardScaler缩放数据,当我们希望某个特征遵循均值为 0 且单位方差为正态分布时,会使用该转换器。最常用于没有太多异常值的分布或其他一般形状的分布。
  • 使用PowerTransformer记录转换数据,当我们希望将严重倾斜的特征转换为尽可能接近的正态分布时,可以使用该转换器。
  • 使用MinMaxScaler归一化数据,当我们希望特征值位于特定的最小值和最大值范围内时,可以使用这个转换器。它不能很好地处理许多异常值,如果测试集中的值超出了给定的范围,很容易出现意外的行为。这是一种不太受欢迎的缩放替代方案。

感谢您的阅读!

https://ibexorigin.medium.com/membership https://ibexorigin.medium.com/subscribe

我的更多故事:

</10-minute-effortless-sql-tutorial-for-die-hard-pandas-lovers-a64c36733fd0> https://ibexorigin.medium.com/yes-these-unbelievable-masterpieces-are-created-with-matplotlib-b62e0ff2d1a8

如何以表格格式显示 PySpark 数据帧

原文:https://towardsdatascience.com/how-to-display-a-pyspark-dataframe-in-a-table-format-ef0b40dcc622?source=collection_archive---------12-----------------------

如何打印巨大的 PySpark 数据帧

unsplash.com上米卡·鲍梅斯特的照片

在大数据时代,由数百甚至数千列组成的数据帧非常常见。在这种情况下,即使将它们打印出来有时也会很棘手,因为您需要以某种方式确保数据以清晰而有效的方式呈现。

在本文中,我将探索以表格格式显示 PySpark 数据帧的三种基本方法。对于每种情况,我还将讨论何时使用或避免它,这取决于您必须处理的数据的形式。

打印 PySpark 数据帧

首先,让我们以下面的最小 pyspark 数据帧为例:

spark_df = sqlContext.createDataFrame(
    [
        (1, "Mark", "Brown"), 
        (2, "Tom", "Anderson"), 
        (3, "Joshua", "Peterson")
    ], 
    ('id', 'firstName', 'lastName')
)

为了打印 PySpark 数据帧,可以使用的最明显的方法是show()方法:

>>> df.show()
+---+---------+--------+
| id|firstName|lastName|
+---+---------+--------+
|  1|     Mark|   Brown|
|  2|      Tom|Anderson|
|  3|   Joshua|Peterson|
+---+---------+--------+

默认情况下,只打印出前 20 行。如果您想显示更多的行,那么您可以简单地传递参数n,即show(n=100)

垂直打印 PySpark 数据帧

现在让我们考虑另一个例子,其中我们的数据帧有许多列:

spark_df = sqlContext.createDataFrame(
    [
        (
            1, 'Mark', 'Brown', 25, 'student', 'E15', 
            'London', None, 'United Kingdom'
        ), 
        (
            2, 'Tom', 'Anderson', 30, 'Developer', 'SW1', 
            'London', None, 'United Kingdom'
        ), 
        (
            3, 'Joshua', 'Peterson', 33, 'Social Media Manager', 
            '99501', 'Juneau', 'Alaska', 'USA'
        ),
    ], 
    (
        'id', 'firstName', 'lastName', 'age', 'occupation',
        'postcode', 'city', 'state', 'country',
    )
)

现在,如果我们试图打印出数据帧(取决于屏幕的大小),输出可能会非常混乱:

>>> spark_df.show()+---+---------+--------+---+--------------------+--------+------+------+--------------+| id|firstName|lastName|age|          occupation|postcode|  city| state|       country|+---+---------+--------+---+--------------------+--------+------+------+--------------+|  1|     Mark|   Brown| 25|             student|     E15|London|  null|United Kingdom||  2|      Tom|Anderson| 30|           Developer|     SW1|London|  null|United Kingdom||  3|   Joshua|Peterson| 33|Social Media Manager|   99501|Juneau|Alaska|           USA|+---+---------+--------+---+--------------------+--------+------+------+--------------+

假设在处理真实世界的数据时,由于数据帧的大小,上述行为经常发生,我们需要想出一种解决方案,以可读的方式正确显示我们的数据。此外,您应该避免对其他用户的屏幕大小做出假设(例如,当您想要在日志中包含此输出时),因此,您需要确保结果总是一致的,并以相同的方式呈现给所有用户。

典型的解决方法是垂直打印数据帧。为此,我们需要将vertical参数传递给show()方法:

>>> spark_df.show(vertical=True)-RECORD 0--------------------------
id         | 1
firstName  | Mark
lastName   | Brown
age        | 25
occupation | student
postcode   | E15
city       | London
state      | null
country    | United Kingdom-RECORD 1--------------------------
id         | 2
firstName  | Tom
lastName   | Anderson
age        | 30
occupation | Developer
postcode   | SW1
city       | London
state      | null
country    | United Kingdom-RECORD 2--------------------------
id         | 3
firstName  | Joshua
lastName   | Peterson
age        | 33
occupation | Social Media Manager
postcode   | 99501
city       | Juneau
state      | Alaska
country    | USA

尽管上面的输出不是表格格式,但有时这是以一致和可读的方式显示数据的唯一方式。

将 PySpark 数据帧转换为熊猫

第三种选择是将 pyspark 数据帧转换成 pandas 数据帧,并最终打印出来:

>>> pandas_df = spark_df.toPandas()
>>> print(pandas_df)
   id firstName  lastName
0   1      Mark     Brown
1   2       Tom  Anderson
2   3    Joshua  Peterson

注意,当您必须处理相当大的数据帧时,不建议使用这种方法,因为 Pandas 需要将所有数据加载到内存中。如果是这种情况,以下配置将优化大 spark 数据帧到 pandas 数据帧的转换:

spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true")

更多关于 PyArrow 优化的细节,当 spark 和 pandas 数据帧相互转换时,你可以参考我下面的文章

结论

在本文中,我们探索了 PySpark 中一个非常基本的操作。在大多数情况下,垂直打印 PySpark 数据帧是可行的,因为对象的形状通常很大,不适合表格格式。假设大多数用户没有可能适合表格中的大数据框的宽屏也更安全。然而,在你有一些玩具数据的情况下,内置的带有默认参数的show()方法将会起作用。

如何使用 Flask 显示来自网络摄像头的视频流

原文:https://towardsdatascience.com/how-to-display-video-streaming-from-a-webcam-using-flask-7a15e26fbab8?source=collection_archive---------13-----------------------

在网络上实现你的计算机视觉解决方案。

欧内斯特·欧杰在 Unsplash 上拍摄的照片

介绍

计算机视觉帮助我们看到我们看不到的东西。有了计算机视觉,我们可以解决像物体检测、人脸识别、看到隐藏模式等许多问题。

实现计算机视觉需要几个步骤。如果我们实现了一个计算机视觉解决方案,但却不能将其部署到生产中,例如,在移动或 web 应用程序中,那么它将毫无用处。

令人欣慰的是,有很多人为实现计算机视觉解决方案生成了一个开源库,也为实现以前更容易的 web 应用程序生成了一个框架。这些库是 OpenCV 和 Flask。

本文将向您展示一个如何使用 OpenCV 从网络摄像头实现人脸检测的示例,并使用 Flask 在一个 web 应用程序上实现它。

没有进一步,让我们开始吧!

**这里边注:**因为这是一个 Flask 项目,所以你得在一个 ide 上实现,比如 Visual Studio,PyCharm,Sublime Text,或者任何你喜欢的 IDE。我先一步一步解释代码。而如果你有什么纠结,可以按照文末的完整代码。

履行

导入库

我们要做的第一件事是导入库。在本例中,我们将导入 Flask 库来实现我们的 web 应用程序。此外,我们引入 OpenCV 库来实现我们的计算机视觉解决方案。

从 Flask 中,我们将导入 Flask 来生成 web 应用程序。此外,我们将导入用于从网络摄像头接收图像的响应对象。下面是实现这一点的代码:

初始化对象

导入库之后,下一步是初始化几个对象。

  • 第一个是烧瓶物体。
    正如我之前提到的,Flask 对象将初始化我们构建 web 应用程序所需的东西,因此我们可以专注于构建我们的解决方案。
  • 第二个是 OpenCV 库中的 VideoCapture 对象。
    该对象将捕捉输出,其中网络摄像头是源。我们将为从网络摄像头拍摄图像设置参数“0”。
  • 最后一个是 OpenCV 库中的 CascadeClassifier
    这个对象将初始化一个人脸检测模型,该模型基于 AdaBoost 和级联分类器的组合。这个模型已经用大量的图像进行了训练,这些图像被表示为一个叫做 Haar 的特征。我不会进一步解释这个分类器,但有一天我会向你解释,安拉保佑。

在本文中,我们不会从头开始训练我们的模型。我们将使用来自 OpenCV 的预训练模型,你可以在这里 下载

下面是初始化对象的代码:

实现人脸检测

初始化对象后,下一步是实现我们的人脸检测功能。下面是我们的函数将执行的步骤:

  • 下面的这个函数将接受一个输入,在这个例子中,它来自网络摄像头,每帧处理一次。
  • 在每一帧上,该函数将从中检测面部,并设置一个包围我们面部的边界框。
  • 在该函数检测到人脸后,该函数使用。jpeg 格式并将其转换为字节。
  • 这些来自图像的字节将被附加到 HTTP 响应中。
  • 因为我们不止一次发送图像,所以我们将使用 yield 关键字而不是 return 关键字。原因是 yield 关键字返回一个总是生成值的生成器,只要它没有阈值。

下面是实现的代码:

在网络上显示图像

在我们创建了我们的人脸检测函数之后,下一步是构建一个在网站上显示人脸检测结果的函数。在下面的函数中,你可以看到在我们函数的名字上面有一个叫做 app.route 的东西。

此 app.route 用作标识符,因此我们可以更容易地访问我们的图像。例如,我们有一个名为 website.com 的网站。我们用/video_feed 在 app.route 参数上设置了一个参数。为了访问我们的网络摄像头的结果,我们可以使用这个链接:website.com/video_feed

在函数内部,我们将返回包含由 gen 函数生成的图像的响应对象,它从一个名为 video 的全局变量中获取输入。

使用 global 关键字的原因是为了强调我们没有在函数内部声明 video 变量。同时,我们需要用它来区分函数中的变量。

下面是显示人脸检测结果的代码:

最后,初始化 app.run 来运行我们的 flask 应用程序。下面是实现这一点的代码:

运行代码

好了,现在我们已经实现了代码。现在让我们在电脑上运行它。要运行代码,您可以使用“python app.py”或“flask run”命令,如下所示:

**flask run**

如果成功,我们的终端将显示:

截图为作者截图。

以下是网站上的预览:

GIF 是作者捕获的。

有用!干得好。

结束语

干得好!我们使用 Python 中的 Flask 和 OpenCV 实现了一个代码,用于显示来自网络摄像头的人脸检测流。我希望它能帮助你实现你的计算机视觉项目,尤其是在一个 web 应用程序上。

如果你对我的文章感兴趣,可以在 Medium 上关注我。如果你有任何问题或者想打个招呼,你可以在 LinkedIn 上联系我。

谢谢你看我的文章!

如果代码片段中有错误,您可以在此处查看完整的代码:

如何从数百名数据科学候选人中脱颖而出?

原文:https://towardsdatascience.com/how-to-distinguish-yourself-from-hundreds-of-data-science-candidates-62457dd8f385?source=collection_archive---------6-----------------------

一些简单(也不那么简单)的方法向雇主证明你的技能和态度让你处于更高的位置。

图片来源: Pixabay (免费使用)

为什么要区分我自己呢?

因为要得到一份数据科学家的工作,T2 的竞争非常激烈。

https://www.kdnuggets.com/2020/10/getting-data-science-job-harder.html

因为有一个狂冲。每一种工程师、科学家和职业人士都称自己为数据科学家。

https://www.linkedin.com/pulse/why-so-many-fake-data-scientist-bernard-marr/

因为你不确定你是否能在这方面取得成功。请记住冒名顶替综合症在数据科学中很流行。

我可以继续,但你要明白…

那么,如何把自己和群众区分开来呢?我不知道你能不能做到,但是我可以告诉你一些测试自己的方法。这就是这篇文章的内容。

问自己几个简单的问题

图片来源: Pixabay (免费使用)

问自己几个问题,数一数有多少答案是肯定的。你做得越多,就越脱离群众。

如果你是初学者

  • 你有没有发布你自己的 Python/R(无论你用什么编码)
  • 如果是的话,你是否已经编写了大量的文档以方便其他人使用?
  • 你把你在 Jupyter 笔记本上的分析带到一个完全出版的网络应用上了吗?或者,你研究过帮助你轻松做到的工具吗?
  • 你是否写过至少几篇高质量、详细的文章描述你的爱好项目?
  • 你有没有尝试实践 费曼学习法教一个六年级学生你想学的概念

在稍微更高级的阶段

如果你不是初学者,但认为自己作为一名数据科学家已经处于比较成熟的阶段,你会这样做吗?

  • 你是否有意识地在你的数据科学代码中尽可能地集成好的软件工程实践(例如面向对象编程、模块化、单元测试)?
  • 你是否注意到不要停留在你必须做的即时数据分析的范围内,而是想象 100 倍的数据量或做出错误预测的 10 倍成本会发生什么?换句话说,你是否有意识地思考数据或问题扩展及其影响
  • 你是否特别注意不要停留在传统的 ML 指标上,还要考虑数据采集的成本ML 商业价值

构建工具和创建文档:需要掌握的两项重要技能

图片来源: Pixabay (左)和 Pixabay (右)

不要把所有的时间和精力都花在分析更大的数据集或者实验最新的深度学习模型上。

留出至少 25%的时间学习做几件在任何地方、任何组织、任何情况下都有价值的事情**,**

  • 为您的日常数据分析构建小而集中的实用工具。在这个练习中,你的创造力会自由流动。你正在创造的东西可能没有成千上万的直接用户,但它将是新颖的,它将是你自己的创造。
  • 阅读和创建与新工具或框架或您刚刚构建的实用工具相关的高质量文档(见上文)。这将迫使你学会如何以一种能被广大观众理解的方式来传达你的创作的效用和机制。

正如你所看到的,这些习惯很容易培养和实践,也就是说,它们不需要繁重的工作,不需要多年的统计背景,也不需要深度机器学习知识的高级专业知识。

但是,令人惊讶的是,并不是每个人都接受它们。这是你脱颖而出的机会。

如何在求职面试中利用这些习惯?

图片来源: Pixabay (免费使用)

想象你自己在一次工作面试中。如果你对上面的问题有很多肯定的回答,你可以对你的面试官说,

  • 嘿,看看我为随意生成合成时序数据而构建的很酷的 Python 包。
  • "我还写了一份详细的文档,存放在 MyApp.readthedocs.io 网站上。它是用狮身人面像和哲基尔建造的。
  • "我定期为最大的数据科学在线平台撰写数据科学文章。基于这些,我甚至得到了像 Packt 或 Springer 这样的知名出版商的出书邀请。
  • 每个人都可以在笔记本上放一个 ML 模型。但是,我可以编写一个 Scikit-learn 函数的基本 web 应用程序演示,您可以通过 REST API 发送数据,并获得预测结果
  • "我可以帮助对新的机器学习程序进行成本效益分析,并告诉你效益是否超过了数据收集工作,以及如何以最佳方式完成这项工作

想象一下,在面试委员会看来,你与其他所有在统计学和梯度下降等常规问题上表现出色,但没有提供全面能力证明的候选人有多么不同。

它们表明你对数据科学问题很好奇。

它们表明你阅读、分析、交流。您创建文档供他人创建。

它们表明您的思维超越了笔记本电脑和分类准确性,进入了商业附加值和客户同理心的领域。哪个公司不会喜欢那种候选人呢?

…这些习惯很容易培养和实践,也就是说,它们不需要繁重的工作,不需要多年的统计背景,也不需要深度机器学习知识方面的高级专业知识。但是,令人惊讶的是,并不是每个人都接受它们。这是你脱颖而出的机会。

我在哪里可以得到帮助?

有很多很棒的工具和资源可以帮助你练习。在一篇小文章的篇幅里,要列出其中的一部分是不可能的。我只是举一些有代表性的例子。关键的想法是沿着这些路线探索,发现对自己有帮助的艾滋病。

  • 仅使用 Jupyter 笔记本电脑构建可安装软件包

https://www.fast.ai/2019/12/02/nbdev/

  • 如何制作一个很棒的 Python 包—一步一步来

https://antonz.org/python-packaging/

  • 学习如何在你自己的 ML 模型和模块开发中集成单元测试原则
  • 学习如何在数据科学任务中整合面向对象编程原则
  • 使用简单的 Python 脚本构建交互式 web 应用——不需要 HTML/CSS 知识
  • 直接从你的 Jupyter 笔记本上写下所有的编程和技术书籍。也可以用它来构建文档。

https://jupyterbook.org/intro.html

  • 理解现实生活中分析问题的多面复杂性,以及它不仅仅是建模和预测

https://medium.com/analytics-vidhya/why-a-business-analytics-problem-demands-all-of-your-expertise-at-once-1290170808c4

想象一下,在面试委员会看来,你与其他所有在统计学和梯度下降等常规问题上表现出色,但没有提供全面能力证明的候选人有多么不同。

关于 MOOCs 在线课程的一些事情

图片来源:作者自己创作

学习的时候不要跳台阶。按照步骤操作。

图片来源:作者自己创作

一有机会就阅读董事会主题和书籍

不要只专注于阅读最新的深度学习技巧或关于最新 Python 库的博文。抓住每一个机会,阅读行业顶级论坛和好书上的董事会主题。我喜欢的一些书籍和论坛如下:

图片来源:作者自己创作

摘要

随着越来越多的企业采用和拥抱这些变革性技术,数据科学以及机器学习和人工智能的相关技能现在在就业市场上的需求非常高。人才的需求方和供应方之间存在大量的竞争和沟通不畅。

一个燃眉之急的问题是:如何从一百个共同申请者中区分出自己?

我们列出了一些关键问题,你可以问自己,并评估自己在一些技能和习惯上的独特性,这些技能和习惯让你与众不同。我们展示了一些想象中的对话片段,展示了这些技巧和习惯。我们还提供了一份资源清单,以帮助您开始使用这些资源。

我们列出了参加 MOOCs 的几种方法,并推荐了阅读资源。

祝您在数据科学之旅中一切顺利…

喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我将收取您的一部分会员费,而不会对您产生额外费用

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

如何将数据可视化嵌入 HTML 电子邮件并使用 Python 发送

原文:https://towardsdatascience.com/how-to-distribute-your-data-reports-via-mail-with-a-few-lines-of-code-8df395c72e55?source=collection_archive---------6-----------------------

关于如何在 HTML 邮件中发送 Python 数据分析的指南和模板

用于分发数据报告的电子邮件模板

Python 提供了大量的可视化选项来准备数据,并以一种可理解的方式呈现数据。如果您希望将您的分析分发给更多的受众,您通常可以选择将绘图集成到 web 应用程序中。尽管如此,电子邮件仍然是一个合法的选择,以简单有效的方式发布你的结果。

下面的文章解释了如何在 HTML 邮件中包含和发送 Matplotlib 图形。

1.创造情节

无论您是想使用 Matplotlib、Seaborn 还是 Plotly 来可视化您的数据,对于下面的过程都无关紧要。我将使用 Matplotlib 构建一个简单的情节,并将其保存为图像。

为此,我创建了一个新项目,其中包含一个文件夹,用于存放保存的图(./results)和 Python 脚本send_report.py。下面的 Python 代码片段展示了脚本的第一部分,它创建了一个简单的情节并将其存储在./results文件夹中。为了能够在下面拾取存储的图像,该函数返回绘图的位置path_plot

执行完代码片段后,您应该会在./results中找到 PNG 文件形式的情节(如2021-04-08.png)。

绘制你的数据

2.定义您的消息并发送邮件

现在,我想将可视化包含到邮件正文中并发送出去。

为了发送电子邮件,我使用我的 Gmail 帐户。要做到这一点,你必须首先确保 Gmail 帐户安全设置中的“访问安全性较低的应用程序”选项已启用。如果你不能马上找到它,网上有很多教程会解释在哪里可以找到设置。

然后,您可以使用下面的代码来测试是否可以用 Python 发送简单的邮件。只需设置变量from_mailfrom_passwordto_mail并试用即可。这应该会从“from_mail”向收件人“to_mail”发送一封主题为“简单数据报告:时间分析”的空白电子邮件。

现在,我想填写电子邮件的信息,并附上创建的情节。然后我可以将图像合并到邮件消息中。为此,我设置了一个简单的 HTML 主体并包含了附加的 PNG 文件。作为图像的来源,我使用了已定义的Content-ID

您应该会收到这封简单的 HTML 电子邮件。

在下面,你可以使用你的 HTML 技巧来设计你喜欢的电子邮件。如果你想从头开始创建自己的 HTML 电子邮件,你可以从妮可·梅林那里找到一个全面的指南。

我还在 GitHub 上将项目文件夹上传到了下面的例子中。

日期报告模板(图片由作者提供——灵感来自妮可·梅林

摘要

希望我可以向您展示一种简单的方法来结合

  1. 构建数据可视化
  2. 在 HTML 电子邮件中嵌入绘图
  3. 将邮件分发到您的收件人列表

在一个 Python 脚本中。这使得通过预定任务自动分发变得容易。

参考

[1]支持不太安全的应用程序访问 Gmail,https://hotter.io/docs/email-accounts/secure-app-gmail/

[2] Nicole Merlin,从头开始构建 HTML 电子邮件模板,https://web design . tuts plus . com/articles/Build-an-HTML-Email-Template-From-Scratch-web design-12770

如何在 MOBA 游戏上进行 A/B 测试

原文:https://towardsdatascience.com/how-to-do-a-b-testing-on-moba-games-e44891c5701?source=collection_archive---------26-----------------------

屠夫布丁的例子

弗拉季斯拉夫·比契科夫在 Unsplash 上的照片

介绍

DOTA2 是一款流行的大型在线战场(MOBA)游戏,拥有数百万的每日活跃用户。玩家从 121 个英雄中挑选,在 5v5 游戏中玩。众所周知,这个游戏有一个陡峭的学习曲线,没有一个英雄可以保证胜利。事实上,每个英雄似乎都有另一个完美的对手。

DOTA2 也是一个不断发展的游戏,为了保持游戏平衡,物品和英雄要么得到要么得到 削弱 。例如,最近发布了补丁 7.30,社区很快指出了现在“坏掉”的英雄,也就是说,他们被打磨得如此之多,以至于胜率高得离谱(见这个例子)。

这就提出了一个问题:DOTA2 开发者如何保持游戏平衡?我们如何确定一个英雄是否被成功地强化/削弱?

本文的目的是展示假设检验如何作为一种游戏平衡的衡量标准,以及如何与 OpenDOTA API 交互。

假设公式

这篇文章选择的英雄是 Pudge ,他是最受欢迎的和多才多艺的 DOTA2 英雄之一。这是一个经常被削弱/增强的英雄,引起了 DOTA2 社区的强烈反应(见这里的例子)。由于喷泉钩故障使得男主角如果与陈搭档肯定会被干掉,所以《胖墩》也有相当大的争议。

胖墩是不是神经过敏了?我们需要看看胜率的变化,其定义为:

把赢得游戏的几率想象成掷硬币是有用的:你要么赢,要么输。因此,我们处理的是二项分布,如果样本量足够大(通常 n>30),我们可以使用 z 检验。对于这个测试,我们使用双尾测试,P 值为 0.05,相应的 z 值为 1.96。

这些假设是:

  • 零假设: 2019 年的布丁和 2020 年的布丁没什么区别,胜率是一样的。
  • 候补假设 : 2019 年的布丁和 2020 年的布丁不一样,胜率变了。

我们正在比较平均值,可以使用下面的公式:

使得p_hat被定义为:

数据收集

使用 OpenDota Explorer 获取数据,它允许我们编写 SQL 查询来提取数据。完整的表格模式可在此处找到:

*https://github.com/odota/core/blob/master/sql/create_tables.sql

数据模式

显然,我们不会查询整个数据库,下图显示了感兴趣的表和关系。

作者素描

用 SQL 实现

例如,我们可以使用下面的查询提取 2020 年的数据。注意,虽然我们想要 2020 年的比赛,但是时间框架被主要补丁任意限制(见第 17-20 行)。

结果是下面的快照,我们可以下载为 csv 表。

作者截屏

实验结果

比较胜率的结果 p 值是 0.570,表明我们应该保留原假设,拒绝替代假设。

然而,人们必须问:我们是在比较苹果和苹果吗?评估的一种方法是评估额外的变量。

比赛持续时间

我们可以关注的一个控制变量是比赛持续时间。均值差异的 z 得分为 2.754,表明两个样本之间的匹配持续时间在统计学上不同。

作者图片

团队选择

2019 和 2020 样品的团队辐射/迪瑞的选择是一样的吗?这个实验的 p 值是 0.007,因此,在两个时间段,团队的选择是相同的。

限制

第一个限制是样本数量。事实上,该查询返回了 2020 年的约 250 款游戏和 2019 年的 650 款游戏。相比之下,平均每天有 220 万场比赛,样本数量看起来并不令人印象深刻。

比赛持续时间是另一个比其面值更复杂的变量。事实上,每个英雄都有不同的能量峰值,这是游戏持续时间的函数。比如有些英雄在游戏初期极其强大,第 30 分钟后就脱落了。

此外,返回的匹配来自同意公开他们游戏数据的玩家。更具体地说,比赛往往来自职业球员和联赛。因此,实验结果不能外推到每一个游戏级别。如果玩家等级( MMR )已知,这种限制可以很容易地被纠正。

结论

实验最终没有结果,因为我们不确定 Pudge 是被削弱了还是被增强了。DOTA 是一个具有复杂机制的游戏,虽然没有明确的答案令人沮丧,但学习新东西总是很有趣。

如果您希望研究整个代码,请参见下面的资源库:

https://github.com/NadimKawwa/dota_hypothesis_test

参考

https://en.wikipedia.org/wiki/Statistical_hypothesis_testing https://stats.stackexchange.com/questions/113602/test-if-two-binomial-distributions-are-statistically-different-from-each-other https://github.com/odota/core/blob/master/sql/create_tables.sql *

如何在眨眼之间用 Python 做一吨的分析?

原文:https://towardsdatascience.com/how-to-do-a-ton-of-analysis-in-the-blink-of-an-eye-16fa9affce06?source=collection_archive---------21-----------------------

使用这些 Python 探索性数据分析工具,将数据探索时间缩短到原来的十分之一。

图片由来自 Pixabay 的丹尼尔·汉纳拍摄

我还记得过去美好的大学时光,我们花了几个星期在 SPSS 中分析调查数据。看看我们从那一点走了多远是很有趣的。

今天,我们可以在一个命令中完成所有这些任务,甚至在您眨眼之间就可以完成更多任务。

这是一个显著的进步!

这篇短文将分享三个令人印象深刻的用于探索性数据分析(EDA)的 Python 库。不是 Python pro?放心吧!即使您对 Python 一无所知,也可以从这些工具中受益。

它们可以节省您数周的数据探索时间,并提高数据质量。此外,你会少很多揪头发的时刻。

第一个是最 受欢迎的 ,然后是我的 最喜欢的 最后一个是最<#b0da>。即使您以前知道这些库,我在本文中介绍的 CLI 包装器可能会帮助您以闪电般的速度使用它们。

最流行的 Python 探索性数据分析库。

GitHub 中有超过 77k 颗星星, Pandas-Profiling 是我们列表中最受欢迎的探索性数据分析工具。它易于安装,使用简单,结果无可挑剔。

您可以使用 PyPI 或 Conda 来安装 Pandas-Profiling。

*pip install pandas-profiling
# conda install -c conda-forge pandas-profiling*

该安装允许您在终端窗口中使用 pandas-profiling CLI。几秒钟之内,它会生成一个 HTML 报告,其中包含大量关于数据集的分析。

眨眼时刻:这里有一个演示展示了它是如何工作的。我们使用流行的泰坦尼克号幸存者数据集进行分析,并将其存储在一个 HTML 文件中。然后我们用最喜欢的浏览器打开它。这里有一个现场版你可以随便玩玩。

作者插图。

当你打开文件或上面的链接时,它看起来会像下面这样。

作者截图。

变量部分是对数据集中每个变量的综合分析。它包括描述性统计、直方图、变量的普通值和极值。

在交互部分,您可以选择任意两个变量并创建一个散点图。

这是一个单页面无依赖性的网络应用。因为生成的 HTML 是一个自包含的应用程序,所以您可以用任何静态站点托管提供商来托管它。

在这份报告中,我最喜欢的部分之一是相关性部分。它创建了变量相关性的热图。您可以选择在热图中使用的关联类型。

我最喜欢的 EDA 库。

虽然它在 GitHub 上只有 1.7k 颗星,但 Sweetviz 在很多方面都让我着迷。显而易见的磁铁是该库超级酷的交互式 HTML 输出。但是我对这个工具的喜爱是有其他原因的。

您可以使用下面的命令安装该库

*pip install sweetviz*

Sweetviz 不附带命令行界面。但是下面的代码在这个库周围创建了一个 CLI 包装器。如果您想了解更多关于为您的数据科学项目创建漂亮的 CLI 的信息,请查看我以前关于该主题的文章。

完整的代码可以在 Github 库中找到。非 python 用户可以按照那里的说明快速入门。

Sweetviz 在 CLI 中的主要用法。

代码片段由作者提供。

为了让上面的脚本工作,

  1. 将内容复制到一个名为sweet的文件中(注意文件没有扩展名);
  2. 使文件成为可执行文件。用chmod +x sweet就可以了,还有;
  3. export PATH=$PATH:$PWD将当前目录添加到系统路径中。

***闪现时刻:*这创建了我们需要的 CLI,以便更快地生成 EDA。这是它的主要用法。

作者插图。

上面的示例生成了一个关于数据集的详细报告,并在浏览器中打开它。输出可能如下所示。一个现场版也有。

作者插图。

你可能会看到,Sweetviz 提供的信息几乎与 Pandas-Profiling 提供的信息相同。Sweetviz 也生成了一个自包含的 HTML。可以用 Github pages 等静态托管解决方案托管。

Sweetviz 的两个显著特性是我最喜欢的——数据集比较和设置目标变量。我们一个一个看,然后一起看。

在 CLI 中使用 Sweetviz 比较数据集。

用下面的内容更新我们创建的 sweet 文件。您可以将其粘贴到“更多功能”行的下方。此功能为您的 CLI 提供了额外的功能—比较。

作者插图。

***眨眼时刻:*它是这样工作的。它将两个文件作为参数,并像前面一样生成报告。对于这个例子,我通过采样 Titanic 数据集创建了第二个文件。在现实生活中,同一文件可能有不同的版本。

作者插图由提供。

生成的输出现在看起来不同了。它现在包含在每个级别显示的比较值。在这个现场版里可以看的很清楚。

作者插图。

否则,对两个数据集进行这样的比较可能需要很大的努力。

Sweetvis 的另一个很酷的地方是它的目标变量设置。这样,您就可以生成一个报告,根据目标变量检查每个切割。下面的代码更新将允许您使用 CLI 来完成。

代码由作者提供。

***瞬间:*现在,您可以在 CLI 中指定数据集名称和目标变量。下面是演示和输出( live 版)。

作者插图。

作者插图。

我已经将“幸存”变量指定为目标变量。现在,除了每个变量,你还可以研究目标的可变性。

在大多数情况下,您必须了解不同版本的数据集的目标变量是如何变化的。这只是与 Sweetviz 的另一个眨眼。

数据集与目标变量的比较

下面的代码将更新 CLI 以接受三个参数。第一个是主数据集,然后是比较数据集,最后是目标变量。

代码由作者提供。

***眨眼时刻:*您可以使用我们之前创建的用于比较的样本数据集来运行它,并将“幸存”列作为目标。

作者插图由提供。

现在,输出既有比较数据集,也有针对目标变量的分析。在大多数专业工作中,这可能非常有用。如果您处理同一个数据集,请用新的观察值对其进行更新,并关注单个变量。下面是现场版来测试。

作者插图。

灵活的 EDA 操场。

如果你可以多眨几下眼睛,但需要更多地控制你的分析,这就是你需要的。 Pandas GUI 为您的数据框创建图形包装。您可以使用方便的接口,而不是编写代码。熊猫 GUI 与其说是一个快速探索工具,不如说是一个探索游乐场。

您可以用 PyPI 安装它:

*pip install pandasgui*

和 Sweetviz 一样,Pandas GUI 也没有 CLI。尽管启动它并不复杂,但是如果您不是 Python 用户,下面的 CLI 包装器可以帮助您。

代码由作者提供。

就像我们对 Sweetviz 所做的那样,用上面的内容创建一个名为pgui的文件。用chmod +x pgui使其可执行。但是,您不必像我们已经做的那样,再次将当前目录添加到路径中。下面的命令将启动用户界面。

*pgui titanic.csv*

作者插图。

你可以看到互动软件出现。使用这个工具,您可以进行不同的分析,这是我提到的另外两个工具所做不到的。

例如,这是幸存者相对于他们年龄的等高线图。

作者插图。

在这里,我们不打算讨论更多关于熊猫 GUI 的细节。但是下面来自他们官方文件的视频会帮助你了解更多。

来自 PandasGUI 官方文档页面的视频教程。

结论

除了解释之外,探索性数据分析在很大程度上是重复的。我们纠结于 SPSS 和 Excel 做鸡毛蒜皮的事情的日子一去不复返了。今天,一眨眼的功夫,我们能做的远不止这些。

在本文中,我讨论了三个非常方便的 Python 库来实现 EDA。熊猫画像是其中最受欢迎的一个。Sweetviz 创建了一个我觉得很方便的自包含 HTML 应用程序。最后,我们讨论了 Pandas GUI,这是一个允许您控制分析的工具。

除了这个库,我们还讨论了如何创建 CLI 包装器来使它更加方便。它允许非 Python 用户也从这些工具中受益。

这三个库的安装和使用都很简单。随着 EDA 重复性任务的完成,你可以将注意力集中在更令人兴奋的事情上。

做好准备,在你的观众眨眼之前给他们一个惊喜。

感谢阅读,朋友!看来你和我有许多共同的兴趣。我很乐意通过 LinkedIn、T2、Twitter 和 Medium 与你联系

还不是中等会员?请使用此链接 成为 会员。你可以享受成千上万的有见地的文章,并支持我,因为我赚了一点佣金介绍你。

长句如何做平均和最大单词嵌入?

原文:https://towardsdatascience.com/how-to-do-average-and-max-word-embedding-for-long-sentences-f3531e99d998?source=collection_archive---------22-----------------------

如何对超过 512 个单词的长句执行 NLP 操作

由 Raphael Schaller 在 Unsplash 拍摄的照片

总体架构/方法

在我们在这个实验中使用的 BERT 模型的情况下,我们使用来自 https://github.com/mukut03/ESG-BERT[的 ESG_BERT 模型。在这个 BERT 模型中,该模型可以处理的最大序列只有 512 个令牌。因此,如果你的序列超过 512 个记号,你需要一种叫做**分块的技术。**我们还应该注意,对于我们使用的模型,单词嵌入向量大小被训练为 768 ,因此我们的嵌入输出也将显示每个令牌的向量大小为 768。](https://github.com/mukut03/ESG-BERT)

图片来源:https://towards data science . com/how-to-apply-transformers-to-any-length-of-text-a 5601410 af7f

作者图片

假设我们有 978 个令牌的序列,我们可以将它们分成 2 个块,因为 978//512 = 1(我们比地板除法多取一个块)。为了说明,我们假设每个单词的嵌入向量大小是 3。

橙色框中是平均句子嵌入(AvgSE) ,绿色框代表最大句子嵌入(MaxSE)

为了计算 AvgSE,我们需要

  1. 把长序列分块
  2. 在每个块中:
  • 查找块中每个单词的单词嵌入
  • 找出组块中所有单词嵌入的平均值(将所有向量相加,除以组块中的单词数)

3.通过将所有单词嵌入相加(在第 2 项中),除以组块数,再次对进行平均

为了计算 MaxSE,我们需要

  1. 把长序列分块
  2. 在每个块中:
  • 查找块中每个单词的单词嵌入
  • 找到组块中所有单词嵌入的最大值

3.再次 Max 单词 embeddings across the chunks(在项目 2 中)

词汇符号化和组块化的味道

在标记化下,我们看到*“我开玩笑生气了”*中的 4 个词原文,现在被标记为 *['我','我','开玩笑',' ##ly ','生气']。*这种标记化在 BERT 模型中很普遍,根据您选择的 BERT 模型的类型,单词也会被不同地拆分。

在分块下,这里是我们的分块代码的工作方式,分块大小为 2。我们的句子是*“我是屋里的女孩”。组块之后,我们将句子分成许多部分,每个部分的大小为 2(除了最后一个组块):[‘我是’,‘一个女孩’,‘在房子里’]*

我们之所以引入这两个概念,是因为它们将在下面的主代码:长句的平均单词嵌入主代码:长句的最大单词嵌入部分的主代码块中使用。

让我们首先引入一些辅助函数

主代码:长句平均单词嵌入

主代码:长句最大单词嵌入

最终想法:

首先,这是一个简单的方法,可以克服单词嵌入时序列长度的限制。

第二点:本教程讲述如何找到整个句子/序列的平均和最大单词嵌入。

希望对你有帮助!

免责声明:内容由作者生成,不隶属于任何组织

如何大规模进行贝叶斯 A/B 测试

原文:https://towardsdatascience.com/how-to-do-bayesian-a-b-testing-fast-41ee00d55be8?source=collection_archive---------9-----------------------

行业笔记

在不影响性能的情况下分析贝叶斯 A/B 测试

如果你读过我之前的文章,你就会知道为什么我认为你应该转向贝叶斯 A/B 测试。在这篇文章中,我简要概述了贝叶斯 A/B 测试背后的统计模型,并介绍了我们在 Wix.com 大学实施它们的方法——在那里我们处理大规模的 A/B 测试。

在这篇文章中,我用 Python 写了一些实际的例子。你可以通过从这里和这里复制粘贴代码来轻松复制它们。虽然代码相当简单,但我导出的公式可能有点高级;然而,我不认为理解所有的推导来使用代码是很重要的。

如果你没有统计学和贝叶斯推断的背景,我推荐你阅读我的参考资料部分的文章。此外,我使用的许多概念都有维基百科的链接,在那里有更详细的解释。

贝叶斯 A/B 测试模型

贝叶斯 A/B 测试结果的可视化。左图:两个比率的后验分布。右图:隆起(比率)的后验分布,使用中心极限定理近似。作者图片

贝叶斯统计建立在两个主要概念上:先验分布(T12)和后验分布(T15),前者是我们在测试前“知道”的 KPI,后者是我们在收集数据后知道的。我们通过用我们的数据更新先验来找到后验。在 A/B 测试环境中,我们尽量保持简单,并使用易于更新的先验分布(共轭先验),如贝塔二项式模型。

情商。1: 贝叶斯定理。在 A/B 测试中, θ 是正在讨论的 KPI,例如转换率或每个用户的平均收入。作者图片

Beta-Binomial 模型用于模拟二进制数据,如转换或点击(“用户是否转换?”).我还将回顾一下正常-正常模型,它用于连续数据(例如每用户收入)。

在贝塔-二项式模型中,我们假设转换率 Pᴀ 具有带参数 αβ 的贝塔分布。对于 αβ 的一个公共选择是 1,这导致一个均匀分布(有时被称为一个无信息先验)。我将在附录中更详细地讨论先验的选择,但是现在让我们继续假设它们已经被选择了。

我们用 Xᴀ 表示转化用户的数量,用 nᴀ 表示所有用户(转化或未转化)的数量,我们建模 Xᴀ | Pᴀ ~ Bin(nᴀ,Pᴀ).由于pᴀ~β(α,β) ,利用贝叶斯定理我们得到:

情商。2:贝塔分布的后验概率

这意味着我们通过将成功的次数加到 α 上,并将失败的次数加到 β 上来“更新”我们的先验。很简单,你不觉得吗?

在正态-正态模型中,我们假设每用户预期收入(或任何其他连续指标) μᴀ 具有参数 μ₀σ ₀/n₀ 的高斯分布。这里我们用 X ̄ᴀ 表示样本平均值,用 sᴀ 表示样本标准差,并且我们假设x̄ᴀ也近似正态分布。这一次,更新规则有点复杂:

等式 3:高斯分布的后验概率

后验的期望值是先验均值和样本均值的加权平均值,权重与它们的方差成反比。

所有这些公式可能看起来有点难以理解,但是 NumPy 中的计算非常简单:

代码片段 1:设置一些虚拟数据

代码片段 2:更新后验概率

如何计算(大多数指标)

既然我们已经找到了 Pᴀ 的后验分布,我们就要计算推断指标,比如可信区间、概率 b 更好以及每个版本的风险。最常见和简单的方法是使用蒙特卡洛模拟。但在 Wix.com,我们每天在数百个 A/B 测试中有数千个 KPI,使用模拟是不可扩展的。相反,我们使用两种方法:高斯平方(稍后将详细介绍)和……中心极限定理 (CLT)近似。

图片由memegenerator.net

你可能会想——CLT 不更像是一个常客吗?CLT 能应用于贝塔分布吗?你质疑这一点是对的。然而,当你在每一个 A/B 测试中有几千个样本时,贝塔分布的 CLT 近似就“足够好”了。你可以通过自己做模拟来验证我(或者看我的)。

在这里,我们将近似的可信度区间和概率 B 更好的 CLT。同样,虽然公式可能有点详尽,但使用 SciPy 的代码几乎是一行代码。我们用 D₁ 表示 Pʙ - Pᴀ 的差值*,用 D₂ 表示对数比对数 Pʙ/Pᴀ 。当我们报告相对上升而不是百分点差异时,使用后者。我们用下面的公式来近似 D₁ 的和 D₂ 的分布:*

情商。4:两个贝塔随机变量之间的差和比的 CLT 近似

为了完成上面的公式,我们分别用 ψψ ₁来表示双伽玛函数和第一个多伽玛函数。您不需要知道它们是做什么的,只需要知道在 SciPy 的哪里可以找到它们就行了!下面的等式是简单地从维基百科复制来的:

情商。5:贝塔变量及其对数的矩,摘自维基百科

利用这些公式,我们可以很容易地计算出概率 b 较好的有 P(D₁ > 0) ,可信区间有 D₁D₂: 的分位数

代码片段 3:计算 Beta-二项式模型的(一些)推断指标

对于正常-正常的情况, D₁ 是相当直截了当的。但是如果我们想用相对差异来代替呢?我们决定使用德尔塔法来寻找在μᴀ 的大致分布。现在你可能会想——我怎么才能得到高斯随机变量的对数呢?而且(再次)你将是完全正确的——高斯分布的支持包括负数,并且它的对数没有被正确定义。但是(再一次)对于成千上万的样本量,这是一个“足够好”的近似值,因为 μᴀ 的分布离 0“相当远”。

情商。6:两个高斯变量之间的差的分布,以及用 Delta 方法找到的它们的比率的近似分布。

代码片段 4:计算正态-正态模型的(一些)推理度量

计算风险

现在我们终于到了重要的部分:风险度量是贝叶斯 A/B 测试中最重要的度量。它取代 P 值作为决策规则,但也作为停止规则——因为贝叶斯 A/B 测试具有动态样本大小。

它被解释为“当 B 比 A 差时,如果我选择 B,我预计会损失多少转换?”,并且在形式上,它被定义为:

情商。7:贝叶斯 A/B 测试中风险的正式定义

11作为指示功能。注意第三行的积分——我真的很讨厌这个积分!它没有解析解,而且我们无法用 CLT 来近似它。但是正如我之前提到的,蒙特卡洛模拟对我们来说不是一个选项。那我们做了什么?

高斯平方 (GQ)是一种用少量节点的加权和来近似积分的酷方法。节点和权重由 GQ 算法计算。在形式上,我们找到最接近 g 的积分的 n 个节点( x )和权重( w ):

情商。8:高斯求积用所选节点的加权和来近似积分。 -∞ ≤ a < b ≤ +

正如我们前面看到的,风险度量是一个积分,所以我们可以尝试用 GQ 来近似它。首先,让我们简化它的表达式:

情商。9:风险度量的简化

现在 ξᴀ 是一个积分,我们可以用高斯积分近似!我们可以用大约 20 个节点准确计算风险,而不是用蒙特卡罗模拟中的数千个节点:

情商。10:风险指标的简化表达

我们使用scipy . special . roots _ hermitnorm和一个解决方案scipy . special . roots _ sh _ jacobi实现了这个近似(更多解决方案在我的笔记中)。这不是很快,但这是我们找到的最快的方法。

代码片段 5:用 SciPy 的高斯积分计算风险度量

摘要

贝叶斯 A/B 测试中的数学和编程比 Frequentist 框架中的更具挑战性。然而,正如我在上一篇文章中所说,我认为这是值得的。虽然它在计算上更昂贵,但 A/B 测试增加的清晰度和可解释性给任何使用它们的人带来了巨大的价值。

在这篇文章中,我回顾了贝叶斯 A/B 检验的 Beta-Binomial 和 Normal-Normal 模型的基础,并介绍了我们在 Wix.com 实现的一些近似。虽然这些近似可能不是 100%准确,但当实验有成千上万的用户时,它们是“足够好的”,它们允许我们大规模地支持贝叶斯 A/B 测试。

这篇文章关注的是如何计算 A/B 测试的贝叶斯度量,而不是如何分析它或何时停止它。如果你想阅读更多关于这些问题的文章,我的参考资料中的文章给出了一个很好的概述。

参考

以下是我第一次学习贝叶斯 A/B 测试时读到的一些帖子。后两篇文章对框架更为关键,我特别推荐阅读它们。

  • 贝氏 A/B 测试的力量迈克尔·弗拉斯科著
  • 贝叶斯 A/B 测试——模拟实践探索布莱克·阿诺德
  • VWO 贝氏 A/B 测试克里斯·斯图基奥
  • 贝叶斯与 Frequentist A/B 测试:有什么区别?
  • 贝叶斯 A/B 测试对偷看免疫吗?不完全是大卫·罗宾逊的

最后一个帖子可能是我最喜欢的,我已经读过几遍了。特别是,通过重新创建它的模拟,我已经了解了当动态停止贝叶斯 A/B 测试时,选择不同的先验对错误率的影响(在附录中有更多关于这个主题的内容)。

我还开发了一些与贝叶斯 A/B 测试相关的酷炫的应用程序,只使用了本文中的公式:

  • 贝塔-二项式 A/B 测试计算器
  • 正常-正常 A/B 测试计算器
  • 一个比较贝叶斯&频密 A/B 测试之间运行时间&准确性的酷应用

我在这篇文章中使用的所有代码都可以在这个目录中找到。

附录:关于优先权的选择

关于在贝叶斯 A/B 检验中选择先验的重要性有一个小范围的争论。在我看来,使用信息丰富且合适的简历非常重要,原因如下:

  1. 我将先验视为 A/B 测试中的一种"正则化,它在处理多重比较问题时发挥着重要作用。是的——尽管我们没有使用 Frequentist 框架,但这仍然是一个问题..
  2. 由于我们依次使用贝叶斯 A/B 测试(每天查看结果,一旦风险低于阈值就停止),使用“弱”(低)先验增加了我们的错误率。参见我的参考资料中大卫·罗宾逊的帖子。
  3. 一个人无法避免通过使用一个无信息的先验来选择一个先验的困境。选择一个无信息的先验仍然是一个先验的选择,只是一个非常糟糕的选择。

我认为在贝叶斯模型中找到并使用合适的先验是很重要的。在 Wix,我们通过自动化“先验构建器”过程来实现这一点,其中我们自动查询过去几周的历史数据,并根据这些数据构建先验,正如弗拉斯科和阿诺德在他们的帖子中所建议的那样。只有当没有足够的数据时,我们才退回到“无信息”先验(对于贝塔分布, α=1,β=1 ,对于高斯分布, μ₀=0,σ₀=1,n₀=0 )。

笔记

按重要性降序排列

  • scipy.special.roots_sh_jacobi 在 αβ 过大时遇到整数溢出错误。我复制了源代码,并做了“日志技巧”让它工作,你可以在这里看到。我也有那期的公关(这里)。
  • 如果你用 R 编程,你可以使用 statmod::gauss.quad.prob 函数用高斯求积来估算风险。
  • 参数 μ₀=0、σ₀=1、n₀=0 、不是高斯分布的无信息先验,而是产生一个非常“弱”的先验。我们不使用实际无信息先验的原因是它不会产生共轭先验,这使得计算更加困难。
  • 我们发现正态-正态模型适合我们的大多数连续 KPI。虽然有更复杂的模型(例如指数和贝塔分布的乘积,这里是),但我们发现在大样本中,高斯近似会产生类似的结果,而且计算起来简单得多(奥卡姆剃刀的救援)。我再次邀请你们通过自己的模拟来验证我,或者在这里看我的。
  • 在我的上一篇文章中,我写道,贝叶斯模型和频率主义模型之间的许多指标在数字上并没有太大的不同。的确,他们有很多相似之处,事实上——如果他们没有,我们会担心的!这里有一个很好的例子:在一个大样本中,等式。5 几乎与比率估计的 CLT 近似和比例检验中的对数相同。设置 α,β = 0 为简单起见,可以得到:

情商。11:贝塔分布的矩和采样率的 CLT 近似值之间的相似性

  • 注意,在我提出的正态-正态模型中,标准差 σ₀ 没有后验概率。原因是,在 Wix,我们对推断标准偏差不感兴趣,我们将其视为一个讨厌的参数。如果你需要推断,我建议你参考前面的正-逆-伽玛。

如何使用合成控件进行因果推断

原文:https://towardsdatascience.com/how-to-do-causal-inference-using-synthetic-controls-ab435e0228f1?source=collection_archive---------11-----------------------

麻省理工学院开发的 t-测验综合控制概述。

在 2017 年和 2021 年之间,有大量关于合成控制的研究。然而,该方法尚未被数据科学行业广泛采用。

图 1:首次发布的合成控制示例,显示了恐怖袭击对巴斯克地区 GDP 的影响。图片作者。

一句话,合成控制(SC)预测观察到的数据在没有处理的情况下会是什么样子。 SC 很有吸引力,因为它们允许对观察到的时间序列数据进行偶然的推断。它们的计算效率也很高,而且相对简单。

在本帖中,我们将讨论合成控制和一种由麻省理工学院研究人员开发的新变体,用于对合成控制数据进行 t 检验。与传统方法相比,它拥有一些令人印象深刻的优势,例如置信区间大小减少了 50%。它的计算效率也很高,并且不依赖于假设。

事不宜迟,让我们开始吧…

技术 TLDR

综合控制方法在观察时间序列数据中发展了一个控制组的估计。这允许我们在不可能随机化的情况下分离出干预的治疗效果。

我们首先选择一个与我们的治疗组相似的对照组。然后,在干预前阶段,我们使用加权平均值来最小化对照组和治疗组中共变量之间的距离。最后,我们使用对照组中“训练过的”协变量来推断如果治疗没有发生会发生什么。

然而,由于潜在的不正确的权重向量和长期方差的不良估计,对 SC 的推断并不稳健。为了解决这些问题,我们提出了一个无标度 t 统计量,使用 K-fold 交叉拟合过程进行拟合。唯一的假设要求是对照组“充分”喜欢治疗。

这里是 R 包回购。

但是,到底是怎么回事呢?

好吧,你只是遇到了很多麻烦。让我们慢一点,通过合成控制和麻省理工学院的 t-测试进行推理。

1 —因果推理

在统计学中,我们经常对因果关系感兴趣。

确定一段关系是否是因果关系的黄金标准是 A/B 测试。通过在治疗组和对照组之间随机分配,我们可以保证(平均)在各组之间均匀分布协变量,如图 2 所示。随机化有效地使实验组相同。

一旦我们有了个相同的组,我们就可以给其中一组分配一种治疗方法,并观察它们的差异。由于两组是相同的,差异必然是由治疗引起的。

2:一个均匀分布的协变量的例子,*性别*。图片作者。

然而,我们也有兴趣对我们观察到但没有随机化的数据进行因果推断。一个简单的方法是开发一个完美的因果模型,考虑所有可能的混杂因素。但是我们怎么知道我们是否有所有的混杂因素呢?

你经常不能。“正确”模型的假设是大多数简单因果模型的基础,从根本上说是无法证明的。

有许多选择,但在本帖中,我们将讨论一种专门针对时间序列数据的最稳健的方法…

2 —合成控制

合成控制是在观察数据中创建控制组的一种非常聪明的方法。通过这样做,我们有了一个比较的基线,从而可以准确地估计治疗效果。

让我们看一个例子。

假设我们正在评估费城清洁能源政策的影响。我们感兴趣的变量是安装在房屋上的太阳能电池板的数量。

理想情况下,我们的处理效果看起来像下面的图 3。在干预之后,政策的批准,我们会看到太阳能电池板的数量(蓝色)相对于我们的理论控制(绿色点)有所增加。

3:综合控制的时间序列结构示例。图片作者。

有了这个框架,让我们通过开发一个综合控制的步骤…

第一步:选择对照组。控制组用于训练预测合成控制值的权重向量。注意,对照组不能以任何方式受到治疗的影响。对于我们的示例,我们可能希望排除与费城有业务往来的城市,因为化石燃料出口可能会发生变化。

**第二步:确定相关预测因子。**治疗组和对照组中的预测因子都应该是可观察到的。它们可以是不受治疗系统影响的任何东西。一些例子可以是一个城市的国内生产总值或房屋总数。

**第三步:拟合权重向量。**选择的权重必须使治疗组和对照组预测值之间的距离最小,如图 4 所示。 *X1* 和 *X0* 是相同的预测因子,但分别在处理和对照中观察。W 是我们的权重向量。

4:我们希望最小化的范数向量。x 是预测值,W 是权重向量。

在这一步的最后,我们有一组权重,使控制协变量看起来像处理协变量。

第四步:预测我们的控制值。掌握了控制预测因子与治疗预测因子之间的关系,我们可以使用观察到的控制数据来预测未进行干预的治疗*。*

**第五步:观察治疗电梯。**有了对照组和治疗组,我们就可以开始探索差异了。

不算太坏,对吧?

方法:合成对照的 T 检验

现在普通的综合控制框架不能确定估计值的变化,所以我们不能确定统计意义。

一个常见的解决方法是运行一个排列测试,但是这里我们概述一个麻省理工学院开发的替代方法。令人印象深刻的是,该方法只需要假设“处理单元与控制单元足够相似”

当估计综合控制的不确定性时,该方法解决了两个主要问题。第一个是我们的加权平均框架可能产生不准确的估计,即使我们的治疗和控制预测之间的距离最小化。第二个更微妙,但仍然很重要。在确定统计显著性时,我们经常使用长期方差的估计量来定义置信区间。那些长期方差估值器通常是不准确的

为了简洁起见,这将变得有点技术性,但是请随意参考论文。

问题 1 —重量矢量不准确

为了解决潜在的权重向量估计不准确的问题,我们执行了一个 K 折叠交叉拟合过程,概述如下…

这里, T0T1 分别是干预前后的时间点。 K 是用户自定义的参数,决定折叠的次数,类似于交叉验证。

请注意,这个符号非常简单,但希望能提供一个大致的理解。详见第 2.2 节开头。

只剩最后一节了…

问题 2——不准确的长期方差估计量

为了解决长期方差估计不准确的问题,我们开发了一种无标度统计。

图 5:无标度 t 统计量。

尽管符号看起来很复杂,但这只是一个 t 统计量。括号中的值是我们的处理平均值和对照平均值之间的差值。分母是通过我们的 k 倍拟合过程确定的标准偏差。并且, K 是折叠的次数。

摘要

这就是综合控制的概要,以及如何对这些信息进行 T 检验。

概括地说,合成对照使用干预前观察到的治疗组和对照组之间的关系来预测干预后对照组的值。尽管这种方法很受欢迎,但它很难进行稳健的统计推断。

因此,我们概述了利用 k 倍交叉拟合和无标度 t 统计的 t 检验,以解决开发合成对照时发现的常见问题。此外,令人印象深刻的是,这种方法只需要假设我们控制的单位与我们治疗的单位相似。

实施说明

附言:有很多非常好的研究即将出炉。查看arxiv.com了解最新消息。

感谢阅读!我会再写 32 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。

如何用 Julia 语言做数据科学

原文:https://towardsdatascience.com/how-to-do-data-science-in-the-julia-language-a9bf7a55eb89?source=collection_archive---------31-----------------------

对 Julia 的快速介绍,包括 ML 语言中常用的资源和包的信息。

(图片由作者提供)

介绍

从一开始,科学界就一直是编程语言特别难吸引的对象。这当然是指首先是科学家,其次是计算机科学家的科学家。一个从未读过一盎司代码的有抱负的新数据科学家在学习 C++这样的低级语言时肯定会有很多困难。此外,这种语言的范例可能会限制科学家的能力,因为他们需要完整的类型结构来做一些基本的测试,而声明式编程肯定是最适合的。

也就是说,虽然声明式语法对于科学计算来说肯定是最佳的,但它对于速度来说不是最佳的。速度似乎是 Julia 的巨大优势,尽管语言中有更多的特性使其成为数据科学更有价值的资产。科学家们既需要快速的数值计算,也需要迭代性更强的语言的状态管理,同时还需要声明式编程的方法论和易用性。

Julia 语言是最近发布的科学编程语言,旨在解决科学计算面临的所有传统问题。虽然 Julia 是一种非常典型的函数式语言,经常有结构和全局定义的方法,但它通过一个称为多重分派的特性使用参数多态性,这只是一个开始!

虽然 Julia 语言可能肯定是你想要进入的语言之一,但是在 Julia 的生态系统中工作可能是困难的。这对新来者来说更是如此,因为 Julia 的生态系统不像任何竞争对手那样成熟。同样,用于这门语言的资源非常少——我的工作实际上是这些资源的重要部分。

处理数据

所以你想和朱莉娅一起做数据科学?使用任何编程语言进行数据科学研究的第一步是学习该语言如何处理一般数据。这包括了解数据类型和如何在语言中使用它们,以及使用生态系统来有效地管理观察。

对于处理数据来说,很容易,你想要查看的最重要的包是 data frames . JL。data frames . JL 是 Julia 编程的 Pandas.py。也就是说,它与 Julia 矩阵的集成和易用性使它成为在 Julia 中处理数据的一个很好的工具。此外,在 Julia 中使用多维数组也是很常见的,所以熟悉这些也是很有用的。

您还需要工具来读取各自的数据格式,比如 CSV.jl 或 JSON.jl。

虽然 DataFrames.jl 可能提供了许多处理数据所需的工具,但通常有一些数据操作更特定于数据科学,如 TrainTestSplit。对于这样的操作,基本上有三种选择:

  • MLJ
  • 车床
  • MLDataUtils

所有这些工具都有其优点和缺点。我想说在这方面最全面的可能是 Lathe,它将提供缩放器、编码器、分离器、统计、测试,甚至一些机器学习模型,如相对快速的随机森林分类器实现。关于这个话题,你可以在这篇文章中比较一下车床和 Sklearn 的速度:

最后,很多时候需要从其他地方获取数据。例如,我们可以研究用 SQL.jl 执行 SQL,我们可以研究通过使用 HTTP.jl 包来利用 API 数据。

测试和可视化

数据科学过程的另一个重要部分是统计测试和数据可视化。虽然这可能主要是更多分析型数据科学家的责任,但这些可视化往往可以帮助机器学习工程师更好地理解和处理他们的数据。可视化是一种很好的研究方法,因为它们可以定性地传达一个想法。例如,我们可以说,通过可视化展示,数据非常分散。虽然方差可能是一个定量的度量,但是可视化我们的数据是如何分布的将会给我们关于我们的数据的定性信息,这将是非常有价值的。

对于假设检验,您应该看一下 HypothesisTests.jl 和 t.jl。这两者对于使用 t 分布的数据进行工程设计和检验都很有用。然而,假设检验包括更多的分布选项,例如在某些情况下可能有用的 f 分布。

最后一个可以用来做统计的模块是我们之前讨论过的一个包,车床。Lathe 附带了一个发行版包,它与其他包一样遵循面向对象编程范例。测试类是使用发行版构建的,然后测试可以很容易地重复执行。此外,这些分布和统计权重可在车床内重新应用,并可与模型一起使用。

至于可视化,Julia 实际上有大量的数据可视化包。这包括带有或不带有交互性或动画的统计、经济和商业可视化。以下是我认为在 Julia 中实现数据可视化的一些最佳选择:

  • Makie.jl
  • 牛虻. jl
  • Plots.jl
  • VegaLite.jl

如果您想了解更多,并考虑您今天想要查看哪个可视化库,我写了一篇文章详细介绍了这些出色的库(Makie.jl 除外)的优缺点,您可以在这里查看!:

机器学习

Julian 数据科学生态系统的机器学习部分在过去四年中实际上已经取得了相当进步的发展。也就是说,虽然这些包中的许多可能与科学家可能习惯使用的包非常不同,但它们确实是很好的实现。我在 Julia 中寻找机器学习的第一个包是 GLM.jl。

GLM 是广义线性模型的简称。线性建模是在一种新的编程语言中练习建模的一种很好的方式,GLM 的高级接口肯定会将线性建模容纳到一个非常高级的程度。

但是,如果您来自 Python 和 Sklearn,您可能会对一个名为 Lathe 的包感兴趣。Lathe.jl 是一个纯粹的 Julian 统计和数据处理库,上面有一个不断扩展的机器学习模型库。Lathe 的伟大之处在于,它允许没有实际 Julia 编程经验的用户快速进入该语言,并开始使用完整的模型,就像在 Python 中一样。如果你想了解车床,你可以查看车床网站:

MLJ.jl 也能派上很多用场。像车床一样,它是相当包容的,并带有一些黑盒模型。然而,虽然 Lathe 更侧重于成为通用数据科学包,但 MLJ.jl 更专注于机器学习。

最后,但肯定不是最不重要的,在选项中我会推荐 Flux.jl。虽然有一些其他解决方案你肯定可以使用,如 Knet,但我认为 Flux.jl 在 Julia 的深度学习上拿了蛋糕——至少现在是这样。Flux 使用简单的函数方法来解决深度学习类型和方法的经典问题。也就是说,虽然 Flux 对于习惯于函数式编程的人来说可能很棒,但对于来自 Tensorflow 之类的人来说可能需要一些时间来适应。在我看来,Flux.jl 实际上更容易使用,但与谷歌开发的 Tensorflow 相比,它的不成熟确实不时表现出来。

结论

谢谢你看我的文章!我认为谈论朱莉娅的未来是很重要的。我认为年轻的编程语言的未来看起来相当光明,所以早期采用肯定会有利于未来从事数据科学。也就是说,很难判断在生态系统中你应该首先采用什么,以及如何过渡或开始学习——这篇文章旨在帮助那些想开始但不确定从哪里开始的人。我希望你像我喜欢写作一样喜欢阅读!祝您愉快!

如何用一行代码在 Python 中进行探索性数据分析

原文:https://towardsdatascience.com/how-to-do-exploratory-data-analysis-with-one-line-of-code-1364e16a102e?source=collection_archive---------18-----------------------

大蟒

用熊猫档案为你的下一个项目节省时间

图片由 cottonbro 提供。来源: Pexels

让我们想象一下,你要做一个探索性的数据分析。你从哪里开始?您加载数据集,打印数据,查找观察值的数量、数据类型、缺失值、重复值和统计汇总。然后,您可能需要创建一些数据可视化来更好地理解您所拥有的。所有这些都需要多行代码,可能需要几个小时。如果我告诉你,你可以节省你的宝贵时间,跳过所有这些步骤,只专注于分析数据,会怎么样?魔法?不,那是熊猫侧写。

有相当多的博客是关于熊猫在媒体上的简介。然而,这是我对这个伟大图书馆的看法。令人惊讶的是,我认识的大多数数据科学家要么不知道熊猫概况,要么很熟悉但从未尝试过使用它。

左图:熊猫下载趋势。右图:熊猫简介下载趋势。来源: Snyk 顾问

看看上面熊猫简介和熊猫的下载趋势,我们可以看到熊猫的受欢迎程度是熊猫简介的几十倍。这当然是意料之中的。然而,我们也可以看到,熊猫烧香并没有得到应有的普及。好吧,如果你不知道它,让我们一起探索它,如果你已经知道它,让我告诉你为什么你应该在你工作的每个项目中使用它。

熊猫简介

简而言之,Pandas Profiling 是一个低代码库,允许我们执行彻底的探索性数据分析。通过键入一行代码,您将省去我在本文开头提到的所有步骤,并获得一个漂亮的交互式 HTML 文件,您可以在笔记本中可视化该文件,或者与任何人共享该文件。这就像把你的 Jupyter 笔记本变成一个 Tableau 仪表板。我们开始吧!

如何使用熊猫概况

首先,你需要安装熊猫概况。您可以通过键入以下代码行使用pip来安装它:

pip install -U pandas-profiling[notebook]
jupyter nbextension enable --py widgetsnbextension

如果你喜欢使用conda,你只需要输入下面的代码:

conda env create -n pandas-profiling
conda activate pandas-profiling
conda install -c conda-forge pandas-profiling

现在你已经安装好了,是时候享受乐趣了。在这个演示中,我将使用著名的泰坦尼克号数据集,你可以在这里找到它。

**# Importing pandas and pandas profiling**
import pandas as pd
from pandas_profiling import ProfileReport**# Importing the dataset**
df = pd.read_csv('world-happiness-report-2021/world-happiness-report-2021.csv')

这就是你最后使用熊猫档案所需要做的。很简单,对吧?现在,让我们创建报告。我将输入下面一行代码,我们就可以开始了。

profile = ProfileReport(df, title='Titanic Report')
profile

作者图片

我们走吧。这份报告在我的电脑上运行了 5.67 秒,只用了一行代码。我将把它分成几个部分,这样我们可以更好地分析我们得到的信息。

概观

首先,我们对数据集进行概述,显示变量、缺失值、重复行的数量,有多少值是数值,有多少值是分类的。

作者图片

然后,我们有一个选项卡显示关于数据集的警告。如果你的期末项目和机器学习有关,这些警告会有很大帮助。它显示了具有高基数、高相关性、高缺失值百分比、高零百分比等的类别。在我看来,这两个特点已经使熊猫轮廓值得。

作者图片

变数

现在,我们可以探索变量。Pandas Profiling 将向我们显示每个类别的细分,包括统计信息,如最小值、最大值、无穷大数,以及不同值的百分比。

作者图片

如果我们点击Toggle details,会看到更复杂的信息,包括范围、变异系数、偏度、标准差、百分位数等。

作者图片

你是否使用了 5 行以上的代码来得到一个像样的图表,以便更好地理解一个类别?熊猫档案将帮助你做到这一点。点击Histogram,您将能够看到类别分布。请记住,这一切都是在 5 秒钟内完成的!

作者图片

不用输入df['age'].value_counts(normalize=True),你只需点击一下就可以看到一个类别中每个值出现的频率。哦,看起来好多了。

作者图片

最后,我们可以很容易地看到数据集中的极值(或异常值)。举个例子,好像有 0.92 岁的人。这可能意味着它们是婴儿,或者数据集是错误的。无论哪种方式,如果您手动操作,都不会很容易发现这一点。

作者图片

互动

熊猫烧香提供的另一个非常酷的功能是查看类别之间的交互。然而,泰坦尼克号数据集并不是分析这一特征的最佳选择。为此,我将使用世界幸福报告 2021 。

要做到这一点,你需要做的就是选择你想要比较的两个特征,熊猫轮廓将创建瞬时散点图。多酷啊。

作者图片

相关

因为我们可以看到每个特性是如何与其他特性交互的,所以想象我们也可以看到一个相关表是有意义的。Pandas Profiling 前进了几步,显示了四个不同的相关表:Pearson 的、Spearman 的、Kendall 的、Phik 的和 Cremér 的。不确定这些都是什么?没问题。点击Toggle correlation descriptions,你会得到每一条的解释。

作者图片

第一行和最后一行

Pandas Profiling 背后的开发人员希望确保他们涵盖了探索性数据分析的每一步。因此,它们包含了数据集的第一行和最后一行——这是一种非常好的处理方式

作者图片

共享报告

熊猫概况的另一个优点是它使得分享报告变得非常容易。您将共享一个文件以备分析,而不是共享一个 Jupyter 笔记本,让其他用户运行所有代码。您可以通过键入profile.to_file('report_name.html')来下载报告,您将看到一个新文件将被创建在与您正在使用的笔记本相同的文件夹中。

作者图片

结论

在过去的几个月里,熊猫简介变得越来越受欢迎。然而,它并没有得到应有的普及。你应该学习如何手动做 EDA 来提高你的编码技能,但是让我们承认你可以用 Pandas Profiling 节省至少一个小时的时间。

如果你使用这个伟大的图书馆,你不会不专业。事实上,这是一个节省时间和专注于重要事情的聪明方法:分析!我强烈推荐你尝试这个库,如果你尝试了,让我知道它是如何进行的。编码快乐!

如何以 2021 年的方式进行图像分类

原文:https://towardsdatascience.com/how-to-do-image-classification-the-2021-way-5962030e48b4?source=collection_archive---------32-----------------------

从型号选择到微调

GR Stocks 在 Unsplash 上拍照

图像分类是计算机视觉中最古老的问题,第一个网络是 AlexNet ,最新的是 EfficientNetv2 。如今,只要点击一下鼠标,就可以获得所有最先进的模型,测试每一个模型,然后选择最好的一个,就成了一项艰巨的任务。我们将涵盖从型号选择困境到微调狂热的一切。

型号选择

虽然有基于变换器的模型可用,但卷积网络仍然有需求,因为变换器的计算简单,并且它们在图像域中的长期使用已经导致了一些强有力的实践。让我们看看我们唯一的选择。

效率网

虽然可以有许多选项(ResNet 及其变体等。),上述模型体系结构与所有其他体系结构不同,因为可以根据您的需要选择各种主干。

从 B0 到 B7,EfficientNet 有 8 种类型,您可以将其视为超参数。此外,它们在 Tensorflow 和 PyTorch 中均有提供。

高效网络 B3/B4 是一个很好的起点。

如果你有必要的计算,你也可以把这些主干当作一个超参数

除此之外,许多 Kaggle 竞赛已经广泛证明了它们是一个很好的架构。

模型微调

对于微调,应使用以下设置。

学习率 : 3e-5
优化器:亚当
批量 : 16

学习率

当你微调一个模型时,你不需要很大的学习率。即使这样也会影响表演。3e-5 是一个足够低的学习率,可以在微调时给你很好的增益。你也可以看看一个学习率调度器(像余弦退火和热重启等等。).

如果你仍然不接受这个学习速度,试试使用 fastai 的 lr_finder 功能。

【计算机】优化程序

自 2014 年问世以来, Adam optimizer 的使用量一直高居榜首。

还有其他的选择,比如前瞻亚当、游侠、山姆等等。这将需要你找到新的更好的设置,但上面的那些将在那里工作太漂亮了。

批量

由于在 EfficientNet 和几乎所有其他图像分类模型中使用批处理规范化,使用批处理大小≥ 16 对于良好的性能变得必不可少(参见此处的)。

对于批量,越大越好。虽然,并不是每个人都有这样的计算能力(在一些大型网络中,即使是 16 个批量也是很困难的)。在这种情况下,尽可能保持较高的批量。

失败

有一件事会彻底改变你的结果,那就是失败。对于图像分类,有哪些选项?交叉熵是图像分类的首选损失,但它有一个问题。当你有类不平衡时,用交叉熵可能得不到最好的结果。

几乎总是会收到类别不平衡的数据集,因此,应该使用的损失是 焦点损失 。它有一个超参数 gamma,,决定对样本数量较少的类的关注程度。

增大

除了类别不平衡之外,你将面临的另一件事是图像数量的减少(在实际用例中,这将是 90%的时间)。为此,你需要考虑增强。毫无疑问,最好的图像增强库是albuminations。

但是,在此之前,请对数据中的图像进行广泛的分析,并选择库中可用的最佳增强(有很多!).

结论

计算机视觉领域仍在发展,但随着时间的推移,一些实践已经发展,一些模式已经出现。我根据上面的经验总结了那些模式。希望这有助于快速得到一个好的模型。

祝一切顺利,神经忍者们。

如何用 Python 做“无限”数学

原文:https://towardsdatascience.com/how-to-do-limitless-math-in-python-73f573570dfa?source=collection_archive---------5-----------------------

如何执行任意精度的计算,以及比 Python 中内置的数学库更多(也更快)的数学运算。

图片来源 : Pixabay (免费使用)

无限数学?

听起来像一个吸引人的标题?嗯,这个术语真正的意思是任意精度计算,即脱离我们通常熟悉的 32 位或 64 位算术的限制。

这里有一个简单的例子。

如果您只是从 Python 的标准math模块导入,这就是您将得到的 2 的平方根值。

您可以使用 Numpy 来选择您希望结果是 32 位还是 64 位浮点数。

但是,如果您希望结果达到小数点后 25 位呢…

1.414213562373095048801689

或者,小数点后 50 位?

1.4142135623730950488016887242096980785696718753769

我们是如何得到这些结果的?

仅仅通过使用一个叫做**mpmath**的简洁的小软件包。我们来详细考察一下。

使用“mpmath”进行任意精度计算

Mpmath是一个用于任意精度浮点运算的 Python 库。关于mpmath的一般信息,请参见项目网站。

从它的网站来看,除了任意精度的算术之外,“*mpmath* 提供了对超越函数、求和、积分、极限、根等等的广泛支持”。它也做许多标准的数学任务,

  • 多项式
  • 求根和优化
  • 总和、乘积、极限和外推
  • 区别
  • 数值积分(正交)
  • 求解常微分方程
  • 函数逼近
  • 数值逆拉普拉斯变换

简而言之,这是一个充满无限可能的强大数学库!我们将在本文中探讨一些特性。

任意精度计算是脱离了我们平常熟悉的 32 位或 64 位运算的限制…

安装和选择快速后端引擎

只是皮普。

pip install mpmath

默认情况下,mpmath在内部使用 Python 整数。如果系统中安装了【1.03 版或更高版本,mpmath将自动检测并使用gmpy整数,而不改变高级用户体验。使用这个后端使它的操作更快,特别是在高精度上。

gmpy2是一个支持多精度算术的 C 代码 Python 扩展模块下面是如何安装

密码

这里是笔记本,上面有本文展示的所有代码。

选择精度

有很多关于选择和控制mpmath精度的资料。鼓励读者直接参考这篇参考文献。

我将向你们展示,在你们工作的时候,设定精度的快速方法。

您可以随时打印mp上下文来查看当前的全局精度设置。mp.prec以位显示精度,mp.dps以十进制显示精度。

使用mpf实例代替常规浮动

在上面的代码片段中,你可能已经注意到了一个函数mpf。一个mpf实例保存一个实值浮点数。它们的工作方式类似于 Python 浮点,但是支持任意精度的算术。

您应该使用字符串(而不是 Python 浮点)作为参数来定义mpf,以获得真正的准确性。您也可以将mp.pretty设置为True,以在不丧失内部精度的情况下进行舍入。

现在来点魔法!阶乘计算速度快 11,000 倍

只要适用,mpmath可以使用智能技巧进行大型计算。一个例子是阶乘。对于较大的数字,它可以在没有指示的情况下适当地使用近似值,并且比默认的 Python 数学模块更快地给出结果。

下面是我们试图计算 100,000 的阶乘时发生的情况。mpmath快 11,333X】。

有理数和复数是本地公民

我们可以把有理数或复数像浮点数一样容易地混合在一起。为此,我们需要使用一个神奇的函数**mpmathify**,它与**sympy**内部构件一起工作来解释这些量。

我们不必导入像[**fraction**](https://docs.python.org/3/library/fractions.html)[**cmath**](https://docs.python.org/3/library/cmath.html)这样的 Python 模块来以我们选择的精度处理这样的数量。

在此了解 [mpmath](https://mpmath.org/doc/current/general.html) 提供的所有其他通用实用功能。

快速绘图

如果系统上有 Matplotlib,mpmath提供了一个快速简单的绘图选择,只需传递一个函数列表和相应的范围。

下面是一个单行代码示例,

图片来源:作者生成

另一个带有菲涅耳函数的例子,

图片来源:作者生成

使用cplot可以轻松绘制复杂的量。默认情况下,复数参数(相位)显示为颜色(色调),数值显示为亮度。

图片来源:作者生成

表面情节也是游戏,

图片来源:作者生成

特殊功能

mpmath支持数百种现成的特殊功能。以下是该列表的部分截图。有关详细信息,请参考本文档。

图片来源:作者生成

二项式系数

使用binomial函数快速简单地计算统计和组合数学的二项式系数,

这个函数支持大规模的参数,这是它真正的亮点。Scipy 计算速度更快,但对于较大的数字,Scipy 甚至不运行!

并且,对非整数和负参数的扩展是自然的(使用 Gamma 函数),

超工厂

对于整数,超因子被定义为,

它们真的很大。你能想出一种简单的方法来计算这种数字吗?

这个数字是 1.1425…后面是 41908 个零!为了了解这一点,只需考虑这个事实——宇宙中大约有个 10⁸⁰原子,即 1 后面跟着 80 个零。

无限的数学(以快速的方式),不是吗?

斐波那契数

用朴素的 Python(递归函数)计算斐波那契数列是一个流行的面试问题,因为它可以用几种不同的方法来完成,这些方法在效率上有很大的不同。

但是对于mpmath来说,计算大自变量或非整数(甚至是复数)自变量的近似解是很自然和容易的。使用原生 Python 编码实现这一点并不容易。

多项式求值和根

使用polyevalpolyroots函数轻松快速地计算任意阶多项式和求根。当然,polyroots对所有实根和复根一次求值。

任意函数的求根

我们可以使用rootfind函数来搜索任意函数的根。这里有一个例子,

图片来源:作者生成

然后,我们在从-2 到 5 的所有整数附近寻找解,它找到对应于函数过零的所有 x 值的多个解。

数值演算

计算任意阶和任意函数的导数,

偏导数很容易,

这篇参考文献看导数相关的其他高级例子和函数。

一维积分

简单快速地评估到任意精度,

二维或三维积分

二维或三维积分也是游戏!

点击阅读更多详情。

常微分方程

我们可以用odefun求解已知边界条件的常微分方程。

或者,一个更难的问题,

矩阵和线性代数

mpmath包还提供了所有涉及矩阵和线性代数的标准操作。为了简洁起见,我们在这里只参考文档而不是展示例子。

摘要

在本文中,我们展示了一个强大的 Python 库及其执行任意精度数值计算的能力,包括各种数字和函数。基本上,这个库的主要优点是它覆盖了大量的数学领域(代数、数论、微积分、特殊函数等)。)和在一个屋檐下一切都可用,无需加载多个库

该库的许多用途是在复杂的科学/技术领域,如有限元模拟或密码学,但是作为一个数字爱好者,无论何时您需要数据科学或机器学习工作,您都可以从该包中获得有用的函数。

同样,这里是本文中显示的所有代码的笔记本。

快乐的数字运算!

喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果你使用下面的链接, ,我会收到你的一部分会员费,而不会对你产生额外的费用

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

如何在 R 中进行逻辑回归

原文:https://towardsdatascience.com/how-to-do-logistic-regression-in-r-456e9cfec7cd?source=collection_archive---------11-----------------------

解释、预测和评估带有不忠数据的逻辑回归示例

照片由 Pexels 的 Nataliya Vaitkevich 拍摄

简介

逻辑回归 是广义线性模型最流行的形式之一。如果您想从一组连续和/或分类预测变量中预测二元结果,它会很方便。在本文中,我将通过一个示例数据集讨论如何在 R 中使用逻辑回归的概述。

我们将使用不忠数据作为我们的示例数据集,称为 Fair's Affairs,它基于《今日心理学》在 1969 年进行的一项横截面调查,并在 Greene (2003)和 Fair (1978)中进行了描述。该数据包含从 601 名受访者中收集的 9 个变量,这些变量包含的信息包括他们在过去几年中发生婚外情的频率,以及他们的年龄、性别、教育程度、结婚年限、有无子女(是/否)、宗教信仰程度(从 1 =反对到 5 =非常)、职业(7 分制)以及对婚姻幸福度的自我评级(从 1 =非常不幸福到 5 =非常幸福)。下图显示了一些观察结果,让您对数据有一个总体的了解。

AER 包中的不忠数据样本

运用逻辑回归,我们可以发现哪些因素对不忠贡献最大。然后,你可以用这个模型来检查你和你的伴侣之间哪一个更有可能有外遇😜

但是,在此之前,我们将使用下面的代码运行一些描述性的统计数据,以便更好地理解我们的数据。

# How to do Logistic Regression in R
# Created by Michaelino Mervisiano> install.packages("AER")
> library("AER")> data(Affairs, package="AER")
> View(Affairs)
> summary(Affairs)
 affairs        **gender**      **age**            yearsmarried    **children**
 Min.  : 0.0    female:315  Min. :17.50    Min. : 0.125     no :171
 1st Qu: 0.0    male :**286**   1st Qu:27.00   1st Qu: 4.000    yes:**430**
 Median : 0.0               Median :32.00  Median : 7.000
 Mean : 1.456               Mean :**32.49**    Mean : 8.178
 3rd Qu.: 0.0               3rd Qu.:37.00  3rd Qu.:15.000
 Max. :12.0                 Max. :57.00    Max. :15.000 religiousness  education     occupation   rating
 Min. :1        Min. : 9.0    Min. :1.0    Min. :1.000
 1st Qu:2       1st Qu:14.0   1st Qu:3.0   1st Qu:3.000
 Median :3      Median :16.0  Median :5.0  Median :4.000
 Mean :3.116    Mean :16.17   Mean :4.195  Mean :3.932
 3rd Qu.:4      3rd Qu.:18.0  3rd Qu.:6.0  3rd Qu.:5.000
 Max. :5        Max. :20.0    Max. :7.0    Max. :5.000>table(Affairs$**affairs**) 
 0   1  2  3  7   12 
451 34 17 19  42  38

从上面的总结中,我们可以看到有 286 名男性受访者(占整体受访者的 48%),430 名受访者有孩子(占整体受访者的 72%),我们的受访者的平均年龄为 32.5 岁。此外,我们发现 451 名受访者声称在过去的一年中没有外遇。这意味着 25%的受访者有婚外情,最多的是 12 人。总之,我们可以说 6%的受访者每月有一次婚外情😏。

因为我们对回应变量的二元结果感兴趣(有外遇/没外遇)。我们可以用下面的代码将事务转换成一个名为 ynaffair
二元变量。

> Affairs$**ynaffair**[Affairs$affairs >  0] <- 1
> Affairs$**ynaffair**[Affairs$affairs == 0] <- 0> Affairs$ynaffair <- factor(Affairs$ynaffair,levels=c(0,1), labels=c("No","Yes"))> table(Affairs$ynaffair)
No   Yes
451  150

用逻辑回归拟合模型

现在,我们可以执行逻辑回归来测量反应变量(事件)和解释变量(年龄、性别、教育、职业、子女、自我评价等)之间的关系。

> **fit.full** <- glm(ynaffair ~ gender + age + yearsmarried + children 
              + religiousness + education + occupation +rating,
              data=Affairs, family=binomial())> summary(fit.full)
Deviance Residuals:
 Min        1Q    Median     3Q      Max
-1.571   -0.750   -0.569   -0.254   2.519Coefficients:
              Estimate  Std. Error  z value  **Pr(>|z|)**
(Intercept)    1.3773    0.8878     1.55     0.12081
gendermale     0.2803    0.2391     1.17     0.24108
age           -0.0443    0.0182    -2.43     0.01530 *
yearsmarried   0.0948    0.0322     2.94     0.00326 **
childrenyes    0.3977    0.2915     1.36     0.17251
religiousness -0.3247    0.0898    -3.62     0.00030 ***
education      0.0211    0.0505     0.42     0.67685
occupation     0.0309    0.0718     0.43     0.66663
rating        -0.4685    0.0909    -5.15     2.6e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
 Null deviance: 675.38 on 600 degrees of freedom
Residual deviance: 609.51 on 592 degrees of freedom
AIC: 627.5
Number of Fisher Scoring iterations: 4

如果我们观察回归系数的 Pr( > |z|) 或 p 值,那么我们发现性别、有无子女、教育和职业对我们的反应变量没有显著贡献。因此,我们可以尝试拟合第二个模型,只包括年龄、结婚年数、宗教信仰和评级等重要变量来拟合数据。

> **fit.reduced**  <- glm(ynaffair ~ age + yearsmarried + religiousness
                   + rating, data=Affairs, family=binomial())
> summary(fit.reduced)
Deviance Residuals:
 Min      1Q      Median   3Q       Max
-1.628   -0.755   -0.570   -0.262   2.400Coefficients:
              Estimate  Std. Error  z value  **Pr(>|z|)**
(Intercept)     1.9308  0.6103      3.16     0.00156 **
age            -0.0353  0.0174     -2.03     0.04213 *
yearsmarried    0.1006  0.0292      3.44     0.00057 ***
religiousness  -0.3290  0.0895     -3.68     0.00023 ***
rating         -0.4614  0.0888     -5.19     2.1e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
 Null deviance: 675.38 on 600 degrees of freedom
Residual deviance: 615.36 on 596 degrees of freedom
AIC: 625.4
Number of Fisher Scoring iterations: 4

对于第二个模型,我们可以看到每个回归系数的 p 值在统计上是显著的。然后,我们可以使用 R 中的 anova 函数进行卡方检验,以比较第一个和第二个模型。我们将看到哪个模型能更好地解释我们的反应变量。

> anova(**fit.reduced**, **fit.full**, test="Chisq") 
Analysis of Deviance Table 
Model 1: ynaffair ~ age + yearsmarried + religiousness + rating Model 2: ynaffair ~ gender + age + yearsmarried + children +
                    religiousness + education + occupation + rating
   Resid.Df  Resid.Dev  Df  Deviance  P(>|Chi|) 
1  596       615 
2  592       610        4    5.85      **0.21**

上面的输出显示了 p 值= 0.21 的非显著性卡方值。这意味着只有四个预测值的第二个模型与有九个预测值的完整模型一样适合。它支持了我们最初的信念,即性别、孩子、教育和职业对预测不忠没有任何贡献(我们的反应变量)。因此,我们将继续分析第二个模型,因为在更简单的模型上更容易进行我们的解释。

解释模型参数

基于第二个模型的回归系数,我们看到婚外情的几率随着结婚年限的增加而增加,随着年龄、宗教信仰和幸福自我评估而减少。我们可以根据每个回归系数的正负符号来观察它。总之,我们可以说你结婚的时间越长,你就越有可能有外遇。另一方面,你在婚姻中越快乐,你就越不可能有外遇。

> coef(fit.reduced) 
(Intercept)   age  yearsmarried  religiousness   rating 
   1.931    -0.035     0.101        -0.329        -0.461

接下来,我们想知道这些变量对事件的影响值。首先,我们需要记住,逻辑回归模型的反应变量对数(赔率)Y = 1。这意味着回归系数允许预测变量单位变化回报的对数变化(优势),保持所有其他预测变量不变。

由于 log(odds)很难解释,我们将通过对结果求幂来转换它,如下所示

> exp(coef(fit.reduced))  
(Intercept)  age    yearsmarried  religiousness   rating  
   6.895    0.965     1.106         0.720          0.630

我们观察到,结婚年数每增加一年,出轨的几率就会增加 1.106 倍(年龄、宗教信仰和幸福指数保持不变)。相反,年龄每增加一岁,出轨的几率就会增加 0.965 倍。这意味着随着年龄的增长,出轨的几率会下降 3.5%。

此外,对于预测变量中的 n 单位变化,响应变量上的较高值的概率变化是exp(βj)^n。那么,在保持其他预测变量不变的情况下,15 年的增长将使几率增加 1.106 ⁵≈4.5。

使用新数据预测结果

在本节中,我们将使用我们构建的模型来预测新数据的结果。第一步,我们将创建一个包含我们感兴趣的预测变量的值的新数据。第二步,我们将应用 R 中的 predict() 函数,根据新数据中的值来估计结果事件的概率。

考虑下面的新数据,我们有 5 个不同自我评价的新受访者,将其他变量设为整体数据的平均值。然后,我们应用预测函数来获得这些新受访者的外遇概率。

> newdata1 <- data.frame(rating=c(1,2,3,4,5),age=mean(Affairs$age),
                         yearsmarried=mean(Affairs$yearsmarried),
                         religiousness=mean(Affairs$religiousness))
> newdata1
   **rating**  age    yearsmarried  religiousness
1  **1**       32.5     8.18           3.12
2  **2**       32.5     8.18           3.12
3  **3**       32.5     8.18           3.12
4  **4**       32.5     8.18           3.12
5  **5**       32.5     8.18           3.12> newdata1$prob <- **predict**(fit.reduced, newdata=newdata1,
                           type="response")
> newdata1
   **rating**  age    yearsmarried   religiousness  ***prob***
1  **1**       32.5     8.18            3.12        **0.530**
2  **2**       32.5     8.18            3.12        **0.416**
3  **3**       32.5     8.18            3.12        **0.310**
4  **4**       32.5     8.18            3.12        **0.220**
5  **5**       32.5     8.18            3.12        **0.151**

显然,我们注意到婚外情几率从婚姻被评为 1 分“非常不幸福”时的 0.53 下降到婚姻被评为 5 分“非常幸福”时的 0.15(保持其他预测变量不变)。这表明不幸福的夫妇比幸福的夫妇有三倍的可能出轨。

让我们创建另一个新数据来观察年龄对不忠的影响

> newdata2 <- data.frame(rating=mean(Affairs$rating),
                         age=(17,27,37,47, 57),
                         yearsmarried=mean(Affairs$yearsmarried),
                         religiousness=mean(Affairs$religiousness))
> newdata2
  rating  **age ** yearsmarried  religiousness
1  3.93   **17**     8.18           3.12
2  3.93   **27 **    8.18           3.12
3  3.93   **37 **    8.18           3.12
4  3.93   **47 **    8.18           3.12
5  3.93   **57**     8.18           3.12
> newdata2$prob <- **predict**(fit.reduced, newdata=newdata2, 
                           type="response")
> newdata2
  rating  **age**  yearsmarried  religiousness  **prob**
1  3.93   **17**     8.18           3.12        **0.335**
2  3.93   **27 **    8.18           3.12        **0.262**
3  3.93   **37 **    8.18           3.12        **0.199**
4  3.93   **47 **    8.18           3.12        **0.149**
5  3.93  ** 57**     8.18           3.12        **0.109**

在这里,我们看到随着年龄从 17 岁增加到 57 岁,在保持其他变量不变的情况下,出轨的概率从 0.34 下降到 0.11。如果您有兴趣探索其他预测变量的影响或预测其他新数据,那么您可以使用这种方法来进一步分析它。

评估过度分散

在逻辑回归中,我们需要检查从二项式分布中提取的数据的期望方差σ2 = nπ*(1π)*,其中 n 是观察次数,π是属于 Y = 1 组的概率。

过度分散发生在假设的分布下,当数据允许比预期更多的可变性时。如果数据集中存在过度分散,估计的标准误差和测试统计的总体拟合优度将会失真,必须进行调整。解决方案之一,我们需要对 r 中的 glm()函数使用拟二项分布而不是二项分布。

有两种方法可以验证我们是否存在过度分散问题:

第一种方法,我们可以通过将剩余偏差除以二项式模型的剩余自由度来检查过度离差。

过度离差率

如果该比率明显大于 1,则表明我们存在过度分散问题。使用我们的数据示例计算该比率,我们发现该比率接近 1。这意味着我们的模型没有过度分散的问题。

> deviance(fit.reduced)/df.residual(fit.reduced) 
[1]  1.032

第二种方法,我们使用两个模型来检验过度离差。基本上,我们将使用两种不同的模型和不同的分布来拟合逻辑回归。然后,我们检查是否有统计证据表明两个模型的期望方差显著不同。

> fit    <- glm(ynaffair ~ age + yearsmarried + religiousness +
             rating, family = **binomial()**, data = Affairs)
> fit.od <- glm(ynaffair ~ age + yearsmarried + religiousness +
             rating, family = **quasibinomial()**, data = Affairs)> pchisq(summary(fit.od)$dispersion * fit$df.residual,
 fit$df.residual, lower = F)
[1]  **0.34**

我们发现 p 值=0.34 显然不显著(p > 0.05),这加强了我们的信念,即过度分散在我们的模型中不是问题

我希望你发现这篇文章是有用的,并与他人分享

干杯,

米夏里诺·梅尔维西亚诺

如何使用转换器和迁移学习对扩充数据进行情感分析——第 2 部分

原文:https://towardsdatascience.com/how-to-do-sentiment-analysis-with-augmented-data-using-transformers-transfer-learning-part-2-70fbf70a6137?source=collection_archive---------21-----------------------

关于如何执行 NLP 的两部分系列的最后一部分——用很少或没有标记的数据进行情感分析。

伊莱恩·卡萨普在 Unsplash 上的照片

这是无可争议的。我们生活在一个数据的世界里。自从互联网普及以来,数据呈指数级增长,根据福布斯的数据,世界上 90%的数据是在 2016 年至 2018 年之间产生的,这意味着,从人类历史的黎明到 2016 年,所有之前产生的数据只占据了另外 10%的份额。今天,这个数字少了很多。

我相信数据是知识的燃料。今天数据无处不在。

然而,挑战在于理解它。每天有近 50 亿个 YouTube 视频被观看,每天有 5 亿条推文在 Twitter 上发布。随着社交媒体平台和在线新闻网站的兴起,获取事实、想法、观点和错误信息比以往任何时候都更容易。然而有一个阻碍,那里的数据是杂乱的,非结构化的,有时甚至是完全错误的。我们如何以一种有意义的方式利用这些信息的力量?在这篇文章中,我们将看看一种方法做到这一点。

上一节中,我们对一小部分金融文章进行了数据扩充。这产生了一个新的数据集,它比原来的源大 50 多倍,大到足以继续我们的下一步工作:情感分析

情感分析是自然语言处理 ( NLP )的一种形式,它识别和量化文本数据情感状态以及其中的主题、人物和实体的主观信息。传统上使用诸如朴素贝叶斯或支持向量机的算法来执行。这在历史上也是一项受监督的任务,使用标记的数据集来训练算法,需要人工仔细选择、分类和标记的大型数据集。

今天,共识是明确的,深度学习方法在大多数 NLP 任务上比其他方法实现了更好的准确性。现在,NLP 中无可争议的王者是被称为变形金刚的大型预训练模型。他们的体系结构旨在解决序列到序列的任务,同时处理长范围的输入和输出依赖,并注意重复。

变形金刚的特别之处不仅在于大多数变形金刚都经过了大量数据的训练,并且经过了高度优化,即使在使用现成的变形金刚时也非常有用,还在于它们可以很容易地进行微调,即使在很少或没有数据的情况下也能表现出色。

精细 - 深度学习中的调整涉及使用先前模型的权重来训练另一个类似的深度学习过程,以实现期望的输出或增强目标任务的性能。在这个练习中,我选择了来自 Transformers 或简单的 BERT 的模型双向编码器表示。

Bert 是一个“双向”半监督模型。这意味着 BERT 在训练阶段从令牌上下文(小文本单元)的左侧和右侧学习信息,并使用从具有 8 亿单词的'图书语料库和具有 2500 万单词的英语维基百科中提取的未标记数据对其进行预训练。Bert 通过预测屏蔽词来工作,特别是通过引导和跟随单词的特定短语的词。

我喜欢做的第一件事是将我的超参数设置为常量,这将使我的工作容易得多,因为我需要对代码进行的所有更改都在一个地方。

MODEL_NAME = 'bert-based-cased'
BATCH_SIZE = 125
LR = 1e-4
MAX_LEN = 100
EPOCHS = 10
LABEL_NUM = 2
device = 'cuda'  # use gpu if no graphics card found

这里的超参数定义为:

  • ' MODEL_NAME' —这是 Transformers 用来下载我们将使用的模型的参数
  • ‘BATCH _ SIZE’—是将通过网络传播的样本数
  • LR——控制模型学习的速度
  • ' MAX_LEN' —是我们将输入模型的序列的最大长度。
  • “时期”—是模型将通过数据集的周期数
  • ‘LABEL _ NUM’—我们正在寻找的类的数量
  • ‘设备’—如果您可以访问图形卡,请使用‘cuda ’,否则请使用‘GPU’

在我们训练模型之前,我们需要做一些内务处理工作。首先,我们将在数据中对标记的类进行编码,然后将数据分成训练、测试和验证部分。训练和验证将用于训练和监控我们的模型,而测试将用于衡量模型完成训练后的预测性能。

大多数标记器对于一个模型是唯一的,当试图在 Bert 上执行强化学习时,我们必须使用它自己的标记器,明显地命名为bertokenizer。

然后,标记化的数据被打包到所谓的数据加载器中。DataLoader 是一个可迭代的容器,用于批量向模型提供数据。训练和验证数据都需要在数据加载器中,以便模型能够高效地学习和验证自身。为了构造它们,我构建了一个助手函数,它将接受一个数据输入并返回一个 DataLoader 容器。

一旦构建了数据加载器,我们就可以继续训练模型了。对于我们的优化器,我们选择 Adam,每个时期的步骤数将通过数据加载器中的元素数乘以时期数来计算。

我们将添加一个调度器,每当一个批处理被提供给模型时,这个调度器就会被调用。我们还通过使用 PyTorch 的*‘nn . utils . clip _ grad _ norm’将渐变从模型中裁剪掉,避免了渐变爆炸(当许多渐变连接成一个矢量时)。*

在每次迭代中,模型将从我们的数据中学习并计算其损失分数,如果一切正确,损失分数将继续降低,直到模型训练完成。

随后,我们将编写代码的验证部分。一旦完成,它将返回每个数据加载器批次的平均损失、预测和数据的真实值。

我们将使用预测值和实际值来计算 F1 分数。F1 将精确度和召回率结合起来,得出给定数据集上的模型精确度。

接下来我们将训练两个模型。一个使用原始数据,另一个使用本系列第一部分创建的扩充数据集。我们将计算它们各自的准确性和 F1 分数,最后根据看不见的数据测试这两个模型,看看它们的表现如何。

在小型/原始数据源上训练的模型的结果如下:

根据原始数据训练的模型的输出

到第三个时期,我们的训练或验证损失都没有低于 0.6。这个糟糕的分数告诉我们,该模型没有足够的数据来学习和归纳。F1 分数没有达到 0.5,并且差的准确性反映在模型不能准确预测几乎所有的新样本上。

然而,在扩充数据集上训练的模型的结果描绘了更好的画面:

根据扩充数据训练的模型的输出

到最后一个时期,我们的训练和验证损失都很低,彼此非常接近。F1 得分达到 0.99,准确性得分也是如此。然后,该模型被用于预测来自看不见的文章的值,并且能够在 99%的时间内正确预测实际情绪。

正如您所看到的,在扩充数据集上训练的模型非常适合识别我们的测试数据,因此我们可以得出结论,它已经被调整得足够好,可以对金融数据进行良好的情感分析。

结论:

在这个由两部分组成的系列文章中,我们介绍了在缺乏大量标签数据的情况下,使用 transformers 进行数据扩充和强化学习如何帮助我们创建最先进的分类模型。

如果你错过了它,并且你是一个好奇的人,想知道如何从头开始做数据扩充,点击这里跳到这个系列的第一部分: 使用变形金刚&同义词替换情感分析 扩充你的小数据集

来源:

  • 福布斯:我们每天创造多少数据?每个人都应该阅读的令人兴奋的统计数据
  • SeedScientific: 每天产生多少数据?27 惊人的统计数据
  • 我的回购:https://github.com/cmazzoni87/ComputerVisionRegression
  • 伯特变形金刚文档:https://huggingface.co/transformers/model_doc/bert.html

如何对接现有的 Flask 应用程序

原文:https://towardsdatascience.com/how-to-dockerize-an-existing-flask-application-115408463e1c?source=collection_archive---------8-----------------------

轻松运行烧瓶应用程序

图为迪安·普在 Unsplash

在这篇文章中,我将解释如何对现有的 Flask 应用程序进行 Dockerize。我将使用我的一个 Python 项目进行演示。通过使用 Dockerized Flask 应用程序,其他开发人员可以轻松地运行该项目,而无需任何环境管理,这对于节省时间和精力来说非常重要。而且,开发者可以专注于开发。如果你是 Docker 的新手,那么阅读下面的帖子,我在那里介绍了一些基础知识。

设置

首先,你需要安装 Docker 并从 GitHub 下载一个 git 库。对于这个设置,我使用的是 macOS。

现在,我将创建一个 Docker 映像,它包含 Python 和 web 应用程序框架 Flask 作为依赖项。让我们分解一下 Dockerfile 文件的各个成分。

FROM python:3.9.1

ADD . /python-flask
WORKDIR /python-flask
RUN pip install -r requirements.txt

为了定义父图像,我们需要使用From命令。这里我们使用的是 Docker Hub 上预建的官方图片 Python 。要将当前文件夹中的所有内容添加到图像中名为 python-flask 的目录中,我们需要使用ADD命令。之后,我们将使用WORKDIR命令将工作目录设置为 python-flask 。最后,使用 pip,我们将安装应用程序的依赖项:Flask。

现在,我将创建一个 Docker 合成文件,使用我们刚刚创建的 Docker 映像运行 Docker 容器。下面我们来分解一下docker-compose . yml文件的各个成分。

version: "3.8"
services:
  app:
    build: .
    command: python main.py
    ports:
      - "5000:5000"
    volumes:
      - .:/python-flask

docker-compose.yml 文件中,我们有 version、services、app、build、command、ports 和 volumes 标签。版本标签用于定义合成文件格式。查看文档了解更多信息。 services 标签用于定义我们希望应用程序使用的服务。对于我们的应用程序,我们只有一个名为 app 的服务。 build 命令将使用我们之前创建的 Docker 文件构建我们的 Docker 映像。命令标签用于运行 main.py 文件。端口标签用于定义主机和容器端口。它将主机上的端口 5000 映射到容器上的端口 5000。因为默认情况下,Flask 运行在端口 5000 上。最后, volumes 标签用于将文件夹从主机挂载到容器。

现在我们将从 docker-compose.yml 文件所在的同一个目录运行下面的命令。docker compose up命令将启动并运行整个应用程序。

docker compose up

恭喜你!我们现在正在 Docker 容器中成功运行 Flask 应用程序。现在,您可以通过访问 URLhttp://localhost:5000/通过您最喜欢的 web 浏览器访问 Flask 应用程序。

现在运行docker ps来查看所有正在运行的容器。这里,我有一个。

docker ps

最后,我们来分解一下 main.py 文件的个别成分。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
 return 'Hello World'

if __name__ == '__main__':
 app.run(host="0.0.0.0", debug=True)

首先,我们导入 Flask 类,然后创建该类的一个实例。之后,使用route() decorator,我们告诉 Flask 基于 URL 触发hello_world()函数。最后,我们有代码的入口点,在这里我们使用run()方法运行 Flask 应用程序。第一个参数是host=”0.0.0.0",它使应用程序在所有公共 IP 上都可用。第二个参数是debug=True将启用调试模式。你可以从这里阅读更多关于 Flask 应用和调试的这里。

现在你知道了如何在 Docker 容器中运行 Flask 应用程序。我希望这能帮助你开始使用 Flask 和 Docker。编码快乐!

相关帖子

如何对现有的 React 应用程序进行 Dockerize

原文:https://towardsdatascience.com/how-to-dockerize-an-existing-react-application-c27bd8517dcb?source=collection_archive---------16-----------------------

轻松运行 React 应用程序

来自 Pexels 的马体·米罗什尼琴科的照片

eact 是一个创建用户界面的 Javascript 库。React 不会将不同文件中的标记和逻辑分开。它使用包含两者的可重用组件来分离关注点。这些组件可用于构建可伸缩的 web 应用程序。

在这篇文章中,我将说明如何对现有的 React 应用程序进行 dockerize。你想这么做可能有很多原因。例如,与开发人员合作。通过使用 docker,其他开发人员不必担心管理开发环境。相反,他们可以专注于构建应用程序。

设置

对于第一步,您需要安装 Docker 并从 GitHub 下载一个 git 库用于第二步。这个 Git 存储库包含一个演示 React 应用程序。在这个存储库中,我还添加了一个 Dockerfiledocker-compose.yml 。对于这个设置,我使用的是 macOS。

现在,让我们来分解一下 Dockerfile 文件的各个成分。

FROM node:16-slim

ADD . /netlify_react
WORKDIR /netlify_react
RUN npm install

首先,From命令用于定义父图像。这里我们使用的是 Docker Hub 预建的官方图片 Node.js 。之后,ADD命令用于将当前文件夹中的所有内容添加到镜像中一个名为 **netlify_react、**的目录中,后跟WORKDIR命令,用于将工作目录设置为 netlify_react 。最后,我们使用RUN命令运行npm install命令。

现在,让我们分解一下docker-compose . yml文件的各个成分。

version: '3.8'
services:
  web:
    build: .
    command: npm start
    volumes:
      - .:/netlify_react
    ports:
      - "3000:3000"

首先,我们有版本标签,用于定义合成文件格式。然后,我们有了 services 标签,它用于定义我们的应用程序想要使用的服务。在这种情况下,我们有一个名为 web 的服务。之后, build 命令用于构建我们的 Docker 映像,它将基于我们的Docker 文件创建一个 Docker 映像。我们可以使用命令标签运行 React 应用程序。为了定义主机和容器端口,我们可以使用 ports 标签。对于我们的应用程序,它将主机上的端口 3000 映射到容器上的端口 3000。默认情况下,React 在端口 3000 上运行。最后,我们有 volumes 标签,用于将文件夹从主机挂载到容器。

现在,让我们从 docker-compose.yml 文件所在的目录运行下面的命令。以下命令将启动并运行整个应用程序。

docker compose up

太棒了。我们已经通过在 Docker 容器中运行成功地将 React 应用程序进行了 Docker 化。现在,您可以通过访问 URLhttp://localhost:3000来访问 React 应用程序。

管理环境是一项挑战。当涉及到协作时,问题就更多了。通过使用 Docker,我们可以省略这些问题,节省时间和精力。如果你想了解更多关于 Docker 的知识,请阅读下面的帖子,我在其中介绍了如何将 Ruby on Rails、Sinatra 和 Flask 应用程序 dockerize。编码快乐!

相关职位

如何对接现有的 Ruby on Rails 应用程序

原文:https://towardsdatascience.com/how-to-dockerize-an-existing-ruby-on-rails-application-3eb6d16ec392?source=collection_archive---------4-----------------------

轻松运行 rails 应用程序

照片由真诚媒体在 Unsplash 上拍摄

R uby on Rails 是一个基于 Ruby 的开源 web 应用开发框架。许多大公司使用 Rails 来构建他们的产品,如 GitHub、Shopify、Airbnb 和 Twitch。

通过这篇文章,您将了解如何将现有的 Ruby on Rails 应用程序进行 dockerize,从而使开发更快更容易。

设置

首先,我们需要安装 Docker 并从 GitHub 下载一个 git 库。对于这个设置,我使用的是 macOS。

现在,我们将创建一个包含 Ruby on Rails 的 Docker 映像。让我们分解一下 Dockerfile 文件的各个成分。

FROM ruby:3.0.0

RUN apt-get update -qq \
&& apt-get install -y nodejs postgresql-client

ADD . /Rails-Docker
WORKDIR /Rails-Docker
RUN bundle install

EXPOSE 3000

CMD ["bash"]

这里我们使用From指令来定义父图像。我们使用来自 Docker Hub 的预建的官方图像。之后,我们使用RUN指令安装所有的依赖项。现在我们需要使用ADD指令将当前文件夹中的所有内容添加到镜像中名为 Rails-Docker 的目录中。WORKDIR指令将工作目录设置为 Rails-Docker 。我们再次使用RUN指令来安装我们的 ruby gems。之后,我们使用 expose 指令公开容器的端口 3000。默认情况下,Rails 运行在端口 3000 上。最后,CMD指令用于在容器启动时运行命令。在本例中,它用于打开 bash shell。

现在,我们需要运行 dbweb 容器。为此,我们将创建一个 Docker 合成文件。我们来分解一下docker-compose . yml文件的各个成分。

version: '3.8'
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - postgres:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/Rails-Docker
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  postgres:

版本标签用于定义合成文件格式。服务标签用于定义我们的应用程序想要使用的服务。这里,我们有两个服务叫做 dbweb

db 服务下,我们使用预先构建的 postgres 映像来构建映像。然后我们有环境变量。最后,我们有一个名为 postgres 的命名卷来保存数据。

web 服务下,我们使用之前创建的 docker 文件来构建图像。命令标签用于运行我们的应用程序。我们使用“0.0.0.0 ”,因此服务器将监听所有可用的 IP 地址。端口标签用于定义主机和容器端口。它将主机上的端口 3000 映射到容器上的端口 3000。最后, volumes 标签用于将文件夹从主机挂载到容器。

现在从 docker-compose.yml 文件所在的目录运行以下命令。此命令将启动并运行整个应用程序。

docker compose up

如果遇到错误“active record::nodatabaserror ”,请运行以下命令创建数据库。

docker-compose run web rake db:create

恭喜你!现在,您可以通过访问 URLhttp://localhost:3000/来访问 Rails 应用程序。

我希望这能帮助你开始使用 Rails 和 Docker。现在使用 Rails 创建你的下一个大东西。编码快乐!

相关职位

如何对现有的 Sinatra 应用程序进行 Dockerize

原文:https://towardsdatascience.com/how-to-dockerize-an-existing-sinatra-application-3a6943d7a428?source=collection_archive---------17-----------------------

轻松运行 Sinatra 应用程序

照片由 Fotis Fotopoulos 在 Unsplash 上拍摄

W 什么是辛纳特拉?它是一种使用 Ruby 创建基于 web 的应用程序的特定领域语言。我们可以用 Sinatra 更快更省力地创建一个 web 应用程序。

Dockerized 应用程序通过最大限度地减少环境管理等任务来提高开发速度,从而节省时间和精力。通过这篇文章,您将了解如何对现有的 Sinatra 应用程序进行 Dockerize。

设置

首先,我们需要安装 Docker 并从 GitHub 下载一个 git 库。对于这个设置,我使用的是 macOS。

现在,我们将创建一个包含 Ruby 的 Docker 映像。让我们来分解一下 Dockerfile 文件的各个成分。

FROM ruby:3.0.0

ADD . /Sinatra-Docker
WORKDIR /Sinatra-Docker
RUN bundle install

EXPOSE 4567

CMD ["/bin/bash"]

From指令用于定义父图像。这里我们使用的是 Docker Hub 上预建的 Ruby 的官方图片。通过使用ADD指令,我们可以将当前文件夹中的所有内容添加到图像中名为 Sinatra-Docker 的目录中。WORKDIR指令会将工作目录设置为 Sinatra-Docker 。我们再次使用RUN指令来安装我们的 ruby gems。之后,我们使用EXPOSE指令为我们的容器公开端口 4567。默认情况下,Sinatra 在端口 4567 上运行。最后,CMD指令用于在容器启动时运行命令,这里我们打开 bash shell。

现在,我们将创建一个 Docker 合成文件,使用我们刚刚创建的 Docker 映像运行 Docker 容器。我们来分解一下docker-compose . yml文件的各个成分。

version: "3.8"
services:
  app:
    build: .
    command: bundle exec rackup --host 0.0.0.0 -p 4567
    ports:
      - "4567:4567"
    volumes:
      - .:/Sinatra-Docker

docker-compose.yml 文件中,我们有 version、services、app、build、command、ports 和 volumes 标签。版本标签用于定义合成文件格式。 services 标签用于定义我们希望应用程序使用的服务。在这种情况下,我们只有一个名为 app 的服务。构建用于使用我们之前创建的 Docker 文件构建我们的 Docker 映像。命令标签用于运行我们的应用程序。我们使用“0.0.0.0 ”,这样服务器将监听所有可用的 IP 地址。端口标签用于定义主机和容器端口。它将主机上的端口 4567 映射到容器上的端口 4567。最后,标签用于将文件夹从主机挂载到容器。

现在从 docker-compose.yml 文件所在的目录运行docker compose up命令。此命令将启动并运行整个应用程序。

docker compose up

现在,您可以通过访问 URLhttp://localhost:4567/通过您最喜欢的网络浏览器访问 Sinatra 应用程序。

现在,让我们分解我们的 Sinatra 应用程序。我们可以使用一个config.ru文件来服务一个模块化的应用程序。你可以在这里阅读更多。

require './main'
run MyApp

在开发模式下,sinatra/reloader会在代码改变时自动重新加载 Ruby 文件。未设置环境变量时,默认为APP_ENV环境变量(ENV['APP_ENV'])的值,未设置APP_ENV环境变量时,默认为:development。这里可以阅读更多。最后,对于我们的应用程序,我们只有一个端点。

require 'sinatra/base'
require "sinatra/reloader"
class MyApp < Sinatra::Base
configure :development do
  register Sinatra::Reloader
 end
get '/' do
  'Hello world!'
 end
end

现在您知道了如何在 Docker 容器中运行 Sinatra 应用程序。希望这能帮助你入门 Sinatra 和 Docker。编码快乐!

相关职位

如何用 CUPED 使 A/B 测试速度加倍

原文:https://towardsdatascience.com/how-to-double-a-b-testing-speed-with-cuped-f80460825a90?source=collection_archive---------3-----------------------

微软的方差缩减正在成为行业标准。

使用已有数据的受控实验(CUPED)是由微软在 2013 年创造的一种方差缩减技术。从那以后,它已经在 Booking.com 的、、 BBC 等许多地方实施。

简而言之,CUPED 使用实验前的数据来控制实验中北极星度量的自然变化。通过去除自然变异,我们可以进行需要较小样本量的统计测试。CUPED 可以添加到几乎任何 A/B 测试框架中;它的计算效率很高,编码也相当简单。

最后,它的发音是库伊-PED

技术 TLDR

**1)选择一个预实验协变量( X )。**协变量应与实验的北极星度量( Y )高度相关,且不应受实验处理的影响。通常,最佳协变量是实验期之前的北极星度量。

**2)计算每个实验条件下的 CUPED 调整度量(ŷ)。**因此,我们不用公制平均值( Y )来计算升力,而是用经过顶部调整的公制:ŷ

Y_HAT = avg(Y) - (cov(X,Y)/var(X)) * avg(X)

3)计算每个实验条件的 CUPED 调整方差。

VAR_Y_HAT = var(Y) * (1 - corr(X,Y))

使用 CUPED 调整后的指标。在下一节中,我们将在 t-test 中使用 CUPED 调整的指标。

但是,CUPED 实际上是如何工作的呢?

好的,让我们踩一下刹车,试着理解发生了什么。

在进行经典 A/B 测试时,有 3 个因素会影响我们确定统计显著性的能力:样本大小( n )、标准差( σ )和提升量(δ),也就是处理均值和控制均值之间的差异。

如果我们希望找到最极端的 t 统计量,我们的目标是增加 nδ,同时减少 σ 。不幸的是,这些值通常被认为是固定的;我们在实验开始时确定样本量,并祈祷治疗是有效的,从而有很大的提升。

另一方面,标准差是我们选择的北极星度量的一个特征。太好了,那么把高方差指标换成低方差指标?这可能行得通,但 CUPED 提供了另一种选择。通过使用实验之前的数据,CUPED 能够控制我们的度量固有的变化并消除它。

微软的团队确定了两种利用蒙特卡罗抽样概念来减少方差的方法。这是两者的关键点:**任何预实验数据都是独立于实验的,因此可以用来减少方差。**我们知道这是真的,因为当我们将用户随机分为对照组和治疗组时,我们可以假设两个实验组具有相同的特征,即所有混杂变量在这些组之间均匀分布。

因此,因为我们可以选择任何不受治疗系统影响的协变量,我们将理想地找到最小化 Y 方差的协变量。不出所料,通常这个协变量就在实验之前的 Y

计算调整后的度量值和方差

好了,现在我们有了一些背景,让我们来了解如何计算 CUPED。

CUPED 调整的度量公式

对于每个治疗中的每个用户,我们将计算他们的 CUPED 调整值,其中…

  • *ŷi(y 形帽)*是 CUPED 调整的度量,
  • 是北极星的公制、
  • θ (theta) 为常数,值为 *cov(X,Y)/var(X),*其中 XY 对应给定处理中的所有用户,
  • Xi 是反,而
  • i 是给定用户对应的下标。

就是这样。很简单,对吧?

你可能会注意到,这个方程看起来很像线性回归。事实证明,我们实际上在做普通最小二乘(OLS)回归同样的事情; θ 的最优值为与 OLS 回归系数相同: cov(X,Y)/var(X)

在做了更多的工作后,我们确定…

你明白为什么 XY 之间的高相关性会导致方差的最大减少吗?

现在我们已经有了 CUPED 调整的指标和该指标的方差,我们可以运行 t-test,并有望观察到更小的 p 值。如果你是手工计算,注意分母必须考虑到我们的处理和控制有不同的方差。这并不是一个糟糕的计算——只需点击此链接获取完整的公式。

最后一点:缺失数据

CUPED 工作得很好,直到我们没有用户的预实验数据。例如,我们可以对以前从未访问过我们网站的新用户进行实验。在这种情况下,我们实施最简单的解决方案,只对这些用户使用未调整的指标。现在,如果您的所有用户都是第一次使用,您可能希望选择不同的预实验 X ,但这取决于您。

实施说明(Microsoft 2013)

  • 一般来说,最佳的预实验窗口是 1-2 周。较短的窗口不能捕获足够的方差,而较长的窗口会捕获噪声。
  • 对于更长的实验,需要更长的预实验窗口,以确保在实验期间和实验之前观察到相同的用户。
  • CUPED 性能高度依赖于度量;在用户群体中具有高方差的度量将表现良好。
  • 确保你的协变量 X 在治疗和控制之间均匀分布。如果它受到治疗的系统性影响,CUPED 就无效了。
  • 上面的 CUPED 方法仅移除可以线性解释的方差。非线性方法将在以后的文章中讨论。

查看评论中这篇论文和其他资源的链接。

如何下载和可视化你的 Twitter 网络

原文:https://towardsdatascience.com/how-to-download-and-visualize-your-twitter-network-f009dbbf107b?source=collection_archive---------4-----------------------

使用社交网络分析、Twitter API、Python 和 Gephi 来下载、分析和可视化您的 Twitter 网络

社会网络分析(SNA)本身是一个非常有趣的研究领域,也是数据科学家应用于其他领域的有用技能。在本教程中,我们将使用 Python 包 Tweepy 从 Twitter API 下载 Twitter 数据,并使用另一个 Python 包 NetworkX 从这些数据中构建一个网络并运行一些分析。最后,我们将使用 Gephi 来可视化网络。

什么是 SNA?

根据维基百科,

“社会网络分析 ( SNA )是通过使用网络和图论调查社会结构的过程。它根据节点(网络中的个体行动者、人或事物)和纽带链接(关系或互动)来描述网络结构。”

根据维基百科,它已经进入了几乎每一个领域:

“社会网络分析已经成为现代社会学的一项关键技术。它在人类学、生物学、人口学、传播学、经济学、地理学、历史学、信息科学、组织学、政治学、公共卫生、社会心理学、发展研究、社会语言学和计算机科学等领域也获得了大量的追随者,并且现在作为一种消费工具已很普遍(见 SNA 软件清单)。”

计划本教程

  1. 使用 Tweepy 为我的所有关注者和(大部分)他们的关注者收集 Twitter 信息
  2. 从所有这些连接中创建一个熊猫数据框架
  3. 使用 NetworkX 从这些数据中提取网络,并运行一些基本的网络分析
  4. 在 Gephi 中可视化网络

Twitter 提供了一个免费的 REST API 来实时传输数据和下载历史数据。Jaime Zornoza 写了一些很棒的关于使用 API 进行流和下载数据的教程,所以如果你想开始使用 API,我建议你先浏览一下。

首先,我们将使用我的个人 Twitter 帐户(@ stevehedden)建立一个网络。为此,我们将从我的所有关注者(大约 450 人)的列表开始。然后我们会得到这 450 个账户的所有关注者。为了节省时间,对于粉丝超过 5000 的账号,我只会刮他们的前 5000 个粉丝。

首先,我们需要导入 Tweepy 和 pandas 包。

import tweepy
import pandas as pd

然后我们需要输入我们的 Twitter API 凭证。如果你还没有这些,你需要去https://apps.twitter.com/然后“创建一个应用”。创建应用程序后,请转到“密钥和令牌”获取令牌。

consumer_key = 'XXXXXXXXXXXXX'
consumer_secret = 'XXXXXXXXXXXXX'
access_token = 'XXXXXXXXXXXXX'
access_token_secret = 'XXXXXXXXXXXXX'

通过 Tweepy,我们可以使用这些凭证连接到 Twitter API 并开始下载数据。下面的代码只是使用上面输入的凭证来连接到 API。因为我们将要下载相当大的数据集,所以在初始化 API 时指定一些参数是很重要的。我们将“等待速率限制”和“等待速率限制通知”设置为真。从 Twitter 下载数据有速率限制——在给定的时间范围内,你只能向 API 发出有限数量的下载请求。通过将这些参数设置为 True,我们不会在达到这些限制时中断与 API 的连接。相反,我们只要等到超时结束,我们就可以继续下载数据。

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True, compression=True)

为了开始数据下载,我们将从一个单独的用户那里获得所有的追随者。为此,您需要用户的用户 ID。如果您知道用户的屏幕名称,您可以使用下面的代码获得用户的用户 ID。

me = api.get_user(screen_name = ‘stevehedden’)
me.id

我的用户名是:1210627806

网络由节点(或顶点)和链路(或边)组成。对于这个网络,我们将使用个人用户帐户作为节点,关注者作为链接。因此,我们的目标是创建一个包含两列用户 id 的 edge 数据帧:source 和 target。对于每一行,目标跟随源。首先,我们要将我的所有追随者列为目标。

上面的截图显示了我们想要创建的数据帧的结构。第一列“源”是我的用户 ID (1210627806),第二列“目标”是我的所有关注者。

下面的代码创建了一个我的 450 个追随者的列表。

user_list = ["1210627806"]
follower_list = []
for user in user_list:
    followers = []
    try:
        for page in tweepy.Cursor(api.followers_ids, user_id=user).pages():
            followers.extend(page)
            print(len(followers))
    except tweepy.TweepError:
        print("error")
        continue
    follower_list.append(followers)

现在我们有了所有追随者的列表,我们可以将他们放入一个数据帧中。

df = pd.DataFrame(columns=['source','target']) #Empty DataFrame
df['target'] = follower_list[0] #Set the list of followers as the target column
df['source'] = 1210627806 #Set my user ID as the source 

但这不是一个很有趣的网络。为了可视化这个简单的网络,我们可以使用 NetworkX 包将数据帧转换成图形或网络。

import networkx as nx
G = nx.from_pandas_edgelist(df, 'source', 'target') #Turn df into graph
pos = nx.spring_layout(G) #specify layout for visual

然后我们使用 matplotlib 绘制图表。

import matplotlib.pyplot as plt
f, ax = plt.subplots(figsize=(10, 10))
plt.style.use('ggplot')nodes = nx.draw_networkx_nodes(G, pos,
                               alpha=0.8)
nodes.set_edgecolor('k')
nx.draw_networkx_labels(G, pos, font_size=8)nx.draw_networkx_edges(G, pos, width=1.0, alpha=0.2)

上面的代码呈现了下面的视觉效果——不太有趣。

我们真正想要的是获得这 450 个用户的所有关注者。为此,我们将遍历所有这 450 个用户的列表,获取他们的追随者,并将这些链接添加到原始数据帧中。由于速率限制,这段代码需要很长时间才能运行。

user_list = list(df['target']) #Use the list of followers we extracted in the code above i.e. my 450 followersfor userID in user_list:
    print(userID)
    followers = []
    follower_list = []

    # fetching the user
    user = api.get_user(userID)

    # fetching the followers_count
    followers_count = user.followers_count

    try:
        for page in tweepy.Cursor(api.followers_ids, user_id=userID).pages():
            followers.extend(page)
            print(len(followers))
            if followers_count >= 5000: #Only take first 5000 followers
                break
    except tweepy.TweepError:
        print("error")
        continue
    follower_list.append(followers)
    temp = pd.DataFrame(columns=['source', 'target'])
    temp['target'] = follower_list[0]
    temp['source'] = userID
    df = df.append(temp)
    df.to_csv("networkOfFollowers.csv")

这段代码与上面的代码非常相似,它获取给定用户 ID 的所有关注者。主要的区别是,我们不是只输入一个帐户,而是遍历关注我的所有 450 个帐户。另一个区别是,如果一个账户有超过 5000 个关注者,我们只取前 5000 个关注者。这是因为 API 的工作方式。每个 API 请求将只返回 5000 个帐户。因此,如果我们想要一个拥有一百万追随者的账户的所有追随者,我们需要发出 200 个个人请求。

由于速率限制,我让它运行了一整夜来获取所有数据。它发出 15 个 API 请求,然后必须等待 15 分钟,然后再发出 15 个请求,依此类推。所以可能要花很长时间。

一旦完成运行,您应该有一个包含网络所有边缘的 csv。我把这些都写到一个 csv 文件中,这样如果它在运行时坏了,我仍然可以把所有的边都刮干净。

现在读取 csv,并使用 NetworkX 将 df 转换成图形。

df = pd.read_csv(“networkOfFollowers.csv”) #Read into a df
G = nx.from_pandas_edgelist(df, 'source', 'target')

一旦数据被转换成图表,我们就可以运行一些基本的网络分析。

G.number_of_nodes() #Find the total number of nodes in this graph

我的网络中有 716,653 个节点!

我们还可以使用中心性度量来找到网络中最有影响力的节点。最简单的中心性度量是度中心性,它只是每个节点拥有的连接数的函数。以下代码查找每个节点的连接数,即每个节点的度数,并按降序对它们进行排序。

G_sorted = pd.DataFrame(sorted(G.degree, key=lambda x: x[1], reverse=True))
G_sorted.columns = [‘nconst’,’degree’]
G_sorted.head()

我的网络中度数最高的节点是节点 37728789 或者@ TheSolarCo。索拉科的学位是 5039。这些连接中的 5000 个是我们刮到的这个节点的 5000 个关注者。但这意味着有 39 个额外的联系——意味着索拉可关注 39 个关注我的账户。要获得给定用户 ID 的帐户的用户名,请使用下面的代码,类似于上面我们获得用户 ID 的方式。

u = api.get_user(37728789)
u.screen_name

因为网络现在非常大(超过 700,000 个节点),任何分析都将需要很长时间来运行,任何可视化都将是一片混乱。在本教程的其余部分,我们将把网络过滤成更易于管理的节点数。我们使用 NetworkX 的 k_core 函数来实现这一点。k_core 函数过滤掉度数小于给定数字 k 的节点。在本例中,我将 k 设置为 10,这将图中的节点数量减少到大约 1000 个。

G_tmp = nx.k_core(G, 10) #Exclude nodes with degree less than 10

有了这个小图,我们可以很容易地做一些网络分析。我们首先使用社区检测算法将图分成组。

from community import community_louvain
partition = community_louvain.best_partition(G_tmp)#Turn partition into dataframe
partition1 = pd.DataFrame([partition]).T
partition1 = partition1.reset_index()
partition1.columns = ['names','group']

现在我们的网络变小了,我们需要再次运行度中心性代码。

G_sorted = pd.DataFrame(sorted(G_tmp.degree, key=lambda x: x[1], reverse=True))
G_sorted.columns = ['names','degree']
G_sorted.head()
dc = G_sorted

既然我们已经将节点分成组,并且知道了每个节点的度数,我们就将它们组合成一个数据帧。

combined = pd.merge(dc,partition1, how='left', left_on="names",right_on="names")

现在你的数据帧应该看起来像这样。

现在我们可以使用下面的代码来可视化这个图表。

pos = nx.spring_layout(G_tmp)
f, ax = plt.subplots(figsize=(10, 10))
plt.style.use('ggplot')#cc = nx.betweenness_centrality(G2)
nodes = nx.draw_networkx_nodes(G_tmp, pos,
                               cmap=plt.cm.Set1,
                               node_color=combined['group'],
                               alpha=0.8)
nodes.set_edgecolor('k')
nx.draw_networkx_labels(G_tmp, pos, font_size=8)nx.draw_networkx_edges(G_tmp, pos, width=1.0, alpha=0.2)
plt.savefig('twitterFollowers.png')

这应该会创建类似这样的图形。

真是一团糟。我肯定有办法使用 matplotlib 使这种视觉效果看起来更好,但在这一点上,我总是只将文件导出为 csv 格式,并使用 Gephi 进行可视化。 Gephi 是一款开源的网络分析和可视化软件。你应该可以很容易地从他们的网站上免费安装。它很容易开始,并允许一些真正美丽的可视化。如果你从未用过 Gephi,这里的是从 Luca Hammer 开始入门的好教程。

要使用 Gephi,首先需要将节点列表和边列表导出为 csv 文件。

combined = combined.rename(columns={"names": "Id"}) #I've found Gephi really likes when your node column is called 'Id'
edges = nx.to_pandas_edgelist(G_tmp)
nodes = combined['Id']edges.to_csv("edges.csv")
combined.to_csv("nodes.csv")

您可以按照我上面提到的 Gephi 教程将这些文件导入到 Gephi 中,并开始可视化您的网络。这是我的样子。

希望你能够没有太多问题地跟上。如果你有问题,或者你觉得我错过了什么,请在下面留下评论,我会回复你的。

祝你好运!

如何下载地球上任何地方的高分辨率卫星数据

原文:https://towardsdatascience.com/how-to-download-high-resolution-satellite-data-for-anywhere-on-earth-5e6dddee2803?source=collection_archive---------4-----------------------

使用 Google Earth Engine Python API 和 FireHR 实用程序函数,您可以轻松下载地球上任何选定区域的时间序列或无云复合数据。在 Google Colab 上试试吧!

哨兵-2 查看里斯本和特茹河。图片由作者使用从谷歌地球引擎下载的 Sentinel-2 数据制作。

在这个故事中,你将了解到 谷歌地球引擎 ,以及如何轻松下载 Sentinel-2 10 米空间分辨率卫星图像,供地球上任何地方使用。

什么是谷歌地球引擎?

根据谷歌地球引擎的主页面:

“Google Earth Engine 将数 Pb 的卫星图像和地理空间数据集目录与行星级分析功能相结合,使科学家、研究人员和开发人员能够检测变化、绘制趋势图并量化地球表面的差异。”

换句话说,这是一项免费提供的服务,它结合了大量的全球数据集,如果没有超级计算机,这些数据集通常是无法处理的。

Sentinel-2 数据是一个很好的例子,因为它由多光谱卫星图像组成,空间分辨率高达 10 米,轨道重访周期为 5 天,同时考虑了 Sentinel-2A 和 Sentinel-2B 卫星。

例如,如果您正在研究一个 100 x 100 km 的区域,并且您的数据空间分辨率为 10 米,那么您的图像大小将为 10,000 x 10,000 像素。如果图像未经压缩以 16 位精度存储,则每个通道需要 1,600,000,000 位或 200 MB。如果需要三个通道,就已经有 600 MB 的数据了。现在,假设您想在一年的时间内每 5 天下载一张这样的图像(以获得土地变化的时间序列),您将获得近 45 GB 的数据。记住这只是一个 100 x 100 公里的区域。谷歌地球引擎在全球范围内提供这些数据和快速处理能力。

有几种方法可以使用谷歌地球引擎。首先,有一个 web 编辑器,在这里你可以创建在 google 服务器上运行的脚本,并将结果发送回你的浏览器,结果显示在一个动态地图中(见下图示例)。

谷歌地球引擎网页编辑器的打印屏幕。https://code.earthengine.google.com/

web 编辑器的一个可能的限制是它要求用户使用 JavaScript。但是仍然有很多例子可以开始。

对 Python 用户来说幸运的是,有一个 Python API 允许地球引擎和 Python 之间的交互。在下一节中,我将展示如何轻松使用 Google Earth Engine 作为预处理和下载 geotiff 格式数据的工具。

预处理和下载数据

在这一节中,我将展示如何使用 FireHR 实用函数(在后台使用 Google Earth Engine Python API)轻松下载您选择的任何地区和时间的数据。

FireHR 是我最近开发的一个 Python 库,用于使用 Sentinel-2 数据绘制烧伤区域的地图(你可以在这篇科学论文的中找到更多细节)。然而,FireHR 包中的data模块可以更广泛地用于下载数据,这就是本文的重点!例如,由于一些大小限制,从地球引擎的下载必须在小块中完成。这些图块需要被组合回全尺寸区域。FireHR 代码在幕后完成所有的整理和合并工作。

我们来看一个例子!

下载选定地区和时间段的最不浑浊图像的 Sentinel-2 中值合成图像的代码示例。Google Colab 上提供的代码。图片由作者提供。

作为示例,上面的代码显示了如何下载 Sentinel-2 数据(第 11 行)的红色、绿色和蓝色波段(第 12 行),该区域由第 5–8 行中定义的边界框坐标界定。本例中选择的区域对应于德国柏林附近正在建设的特斯拉巨型工厂之一的位置。所选的时间间隔从 3 月 1 日开始,到 4 月 25 日结束,因此综合报告将给出截至本文撰写之日的施工进度概况。第 23 行中的download_data函数将搜索间隔中所有可用的图像,并计算具有最低云量分数的三幅图像的中值,如设置为值 3 的参数use_least_cloudy所定义的。请注意,过滤和合成是在谷歌地球引擎服务器中完成的,因此,这是一个非常快速的过程。**只有最终的合成文件被下载并保存为 GeoTIFF 文件。这节省了大量的处理时间和所需的存储!**

下图显示了前面代码中示例的结果。你可以跟随 这个网址 **在 Google Colab 笔记本上运行。**Colab 笔记本上的代码还具有download_data_ts功能,可用于下载选定日期内的所有图像,而不是创建合成图像。

截至 2021 年 3 月/4 月德国柏林附近的特斯拉 Gigafactory 视图。作者使用本笔记本中的代码创建的图像。

注:有关谷歌地球引擎上可用的 Sentinel-2 数据集的更多信息,请确保查看目录页。您可以在那里找到关于光谱波段和元数据的所有信息。

结论

FireHR Python 包中提供的代码可以作为通用工具从 Google Earth 引擎下载 Sentinel-2 数据。从其他产品(如 Landsat)下载数据也应该是可能的,但尚未测试。当然,如果你需要为你的应用程序修改的话,你可以在 GitHub 查看 FireHR 源代码。此外,欢迎在推特上关注我,了解更多更新,或者如果你对这个话题有任何疑问!

如何从 NCBI 的序列读取档案下载 NGS 数据

原文:https://towardsdatascience.com/how-to-download-ngs-data-from-ncbis-sequence-read-archive-ead03908a192?source=collection_archive---------22-----------------------

实践教程

使用 SRA 工具包从序列读取档案下载 FASTQ 文件的指南

由马库斯·斯皮斯克在 Unsplash 上拍摄的照片

序列读取档案库,简称 SRA,是 NCBI 的数据库,储存了从包括人类在内的任何物种的测序实验中获得的下一代序列 DNA 数据。对于那些不熟悉生物信息学的人来说,可能不清楚如何从这个庞大的资源中获取数据。最有可能的是,你将试图从你刚刚读过的一篇研究文章中获取数据,作者将提供一份数据可用性声明,其中包括一个登录号。本指南假设您已经准备好了登录号。生物信息学软件主要在基于 Unix 的操作系统上运行,这是下载 SRA 数据所需的工具包的情况。你需要一台运行 Linux 或 MacOS 的电脑。本指南专门针对 MacOS,但是 MacOS 和 Linux 的命令基本相同,尽管它们可能需要在操作系统之间做一些小的调整。最后,NGS 数据通常非常庞大,因此您的计算机上需要相当大的可用存储空间。根据数据集来自的物种,对 NGS 数据的全面分析可能会使用 100Gb 以上的内存。不过仅仅下载一个文件应该不超过 50Gb。让我们从下载工作所需的软件开始。

下载 SRA 工具包

SRA 工具包包含了我们从 SRA 下载和操作数据所需的所有程序。要下载它,导航到 NCBI 的 sra-tools GitHub 页面并下载适合你的操作系统的文件。在下载文件夹中,双击。tar 文件并导航到新创建的文件夹。我们将用于下载 SRA 数据的程序位于 bin 文件夹中。我们需要获得那个 bin 文件夹的路径名,并在命令行中导航到它。为此,请右键单击 bin 文件夹,按住 option 键,然后选择“拷贝“bin”作为路径名”。

现在,打开终端并键入以下命令,通过粘贴先前复制的路径名来替换:

cd <path/to/bin>

要检查一切是否正常,请运行以下命令:

./fastq-dump — stdout SRR390728 | head -n 8

您应该得到以下输出:

@SRR390728.1 1 length=72CATTCTTCACGTAGTTCTCGAGCCTTGGTTTTCAGCGATGGAGAATGACTTTGACAAGCTGAGAGAAGNTNC+SRR390728.1 1 length=72;;;;;;;;;;;;;;;;;;;;;;;;;;;9;;665142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96&&&&(@SRR390728.2 2 length=72AAGTAGGTCTCGTCTGTGTTTTCTACGAGCTTGTGTTCCAGCTGACCCACTCCCTGGGTGGGGGGACTGGGT+SRR390728.2 2 length=72;;;;;;;;;;;;;;;;;4;;;;3;393.1+4&&5&&;;;;;;;;;;;;;;;;;;;;;<9;<;;;;;464262

我们现在准备下载一些数据。

预取数据

我们需要做的第一件事是找到数据的运行号,它不同于研究文章中列出的登录号。要获得运行编号,导航至 NCBI SRA 网页,粘贴您在研究文章中的登录号并进行搜索。从列表中,单击您感兴趣的样品,并在“运行”下,复制以 SRR 开头、后跟 6 或 7 位数字的编号。此页面上有许多不同的登录类型编号,但您必须选择正确的编号,以便在下一步中使用。

作者截图

回到命令行,我们将使用 prefetch 命令下载数据以及与之相关的任何必要文件。要下载数据,请运行以下命令,其中是您的运行编号。

./prefetch <SRR0000000>

该文件将下载到 bin 文件夹中,所以在下载完成后,在进入下一步之前,请检查一下以确保它在那里。根据您的网速和下载文件的大小,下载可能需要一段时间。

将 SRA 文件转换为 FASTQ 文件

预取程序将下载一个. sra 文件,这不是一个非常有用的文件格式。我们需要将这个文件转换成 FASTQ 的标准 NGS 文件格式来处理它。我们将使用 fastq-dump 工具来转换数据。有很多选项可以和 fastq-dump 一起使用,但是如果你不确定使用哪一个,你可以暂时忽略它们。split-files 选项可能是最有用的一个选项,它将成对的读操作分成单独的文件。要转换。sra 文件放入。fastq,确保该文件在 bin 文件夹中,并运行以下命令,其中[options]是任何相关的选项,< SRR0000000 >是您的 SRR 号码。sra 文件:

./fastq-dump [options] <SRR0000000>

看看你的数据

最终的 FASTQ 文件将被转储到 bin 文件夹中。根据文件大小,此过程可能需要一段时间。在转换之后,我们可以通过将 head 命令插入 less 命令来可视化文件中的一些碱基。

head -10000 <filename> | less

现在,您可以继续对 FASTQ 文件进行任何进一步的处理,包括映射到引用和变量分析。

如何免费下载推特粉丝或好友

原文:https://towardsdatascience.com/how-to-download-twitter-friends-or-followers-for-free-b9d5ac23812?source=collection_archive---------17-----------------------

Python 中的简单指南

当你谷歌如何做到这一点,所有这些公司弹出,提供为你做这些,如果你付给他们一小笔费用。但是 Twitter 为你提供了所有你需要的工具,而且是免费的。这个简短的指南将带您浏览一个 Python 脚本,帮助您使用这些工具。

在本指南的最后,您会看到一个脚本,它下载了一个 CSV 文件,其中包含任何公共 Twitter 句柄的所有关注者和/或朋友。该文件还将包含每个人的以下详细信息:

  • 用户名
  • 用户标识
  • 处理
  • 位置
  • 个人简历
  • 全球资源定位器(Uniform Resource Locator)
  • 关注者计数
  • 朋友很重要
  • 创建帐户的日期
  • 验证状态

为 @briennakh 的关注者提供的示例 CSV 文件:

目录:

  1. 设置您的 Twitter 开发者帐户
  2. 生成身份验证令牌
  3. 编写 Python 脚本
  4. 运行脚本

1.设置您的 Twitter 开发者帐户

要使用 Twitter API 下载朋友和/或关注者等大量数据,您需要一个开发人员帐户、一个项目和一个应用程序。如果你已经有了所有这些,你可以跳过这一步。

如果您还没有开发人员帐户,请在此处获取一个:

https://developer.twitter.com/en/apply-for-access

有用的文档:

  • 开发者门户
  • 项目
  • App

获得批准可能需要一段时间,最多几天或几周。

如果您没有时间等待批准,我很乐意快速为您获取数据。你可以在 UpWork 上找到我:

https://www.upwork.com/o/profiles/users/~013c12563e17631b80/

2.生成身份验证令牌

一旦您拥有了一个开发人员帐户,您就需要生成身份验证令牌,这将允许您从脚本连接到 API。

在您的开发者门户仪表盘中,点击您的应用旁边的钥匙图标:

它会带你到你的应用程序页面。这里,您需要生成或重新生成四条信息:

  • 消费者 API 密钥
  • 消费者 API 秘密
  • 访问令牌
  • 访问机密

立即将这些令牌保存到一个名为 config.ini 的文件中,因为一旦您查看完这些令牌,您将无法再次查看它们。你必须让他们重生。

您的config.ini 必须是这样的:

[TWITTER]
CONSUMER_KEY = YOUR_CONSUMER_KEY_HERE
CONSUMER_SECRET = YOUR_CONSUMER_API_SECRET_HERE
ACCESS_TOKEN = YOUR_ACCESS_TOKEN_HERE
ACCESS_SECRET = YOUR_ACCESS_SECRET_HERE

用你的令牌交换掉YOUR_ETC_HERE 的所有实例。不要在文件开头和[TWITTER].之间留下任何空格

我经常使用 config.ini 文件来避免直接将认证令牌粘贴到我的脚本中,这样可以安全地将脚本公开,因为我的认证令牌现在是隐藏的。

3.编写 Python 脚本

为了更容易连接到 Twitter API,我们将使用 Tweepy 包。对于这个包,我们的脚本包含四个步骤:

  1. 验证我们的连接。
  2. 获取每个关注者或朋友的 Twitter id。
  3. 获取每位关注者或朋友的更多详细信息,如他们的用户名、账号和简历。完整的列表可以在本指南的开头找到。
  4. 将数据处理成可用的格式。

我们将这个脚本保存为一个名为download _ friends _ or _ followers . py的文件,并将其保存到与我们的 config.ini 文件相同的目录中。

目录结构:

twitter-helper-scripts
 |_ config.ini
 |_ download_friends_or_followers.py

验证我们的连接

我们打开 configs.ini 并读入令牌,然后使用它们来验证我们与 Twitter API 的连接。

import configparser
from tweepy import API, Cursor, OAuthHandler, TweepError# Read in configs
configs = configparser.ConfigParser()
configs.read('./config.ini')
keys = configs['TWITTER']
consumer_key = keys['CONSUMER_KEY'] 
consumer_secret = keys['CONSUMER_SECRET'] 
access_token = keys['ACCESS_TOKEN']
access_secret = keys['ACCESS_SECRET']# Authenticate Tweepy connection to Twitter API
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)

获取每个关注者或朋友的 Twitter id

要获得给定句柄的每个追随者的 id:

screen_name = 'briennakh'
ids = []
for fid in Cursor(api.followers_ids, screen_name=screen_name, count=5000).items():
    ids.append(fid)

对于朋友来说,这个过程是相同的,除了我们将 API 端点从api.follower_ids改为api.friend_ids:

screen_name = 'briennakh'
ids = []
for fid in Cursor(api.friends_ids, screen_name=screen_name, count=5000).items():
    ids.append(fid)

现在我们有了ids,它是一个关注者 id 列表,或者一个朋友 id 列表,这取决于我们使用的 API 端点。

获取每个关注者或朋友的更多详细信息

除了请求更多我们实际可以使用的数据之外,id 列表几乎没有任何用处。因此,我们将这些 id 提交给负责返回单个用户详细信息的 API 端点api.lookup_users,

info = []
for i in range(0, len(ids), 100):
    try:
        chunk = ids[i:i+100]
        info.extend(api.lookup_users(user_ids=chunk))
    except:
        import traceback
        traceback.print_exc()
        print('Something went wrong, skipping...')

这里,我们将ids分解成 100 个 id 的块,这是这个 API 端点接受的每个请求的最大块大小。每当一个块完成处理时,我们将返回的用户详细信息保存到扩展这个列表的info, 中。

最后,info 将为每个关注者或朋友包含一条记录,如下所示:

将数据处理成可用的格式

这些记录不容易使用。不同的格式,如 CSV,在以后会更容易使用,所以我们处理这些记录,并将它们下载为 CSV 文件。

import pandas as pddata = [x._json for x in info]
df = pd.DataFrame(data)
df = df[['id', 'name', 'screen_name', 'location', 'description', 'url', 'followers_count', 'friends_count', 'created_at', 'verified']]
df.to_csv('followers.csv', index=False)

请注意,我没有保留每个关注者或朋友的所有可能的细节。如果您在记录中看到想要添加到 CSV 中的详细信息,您可以编辑代码以包含它。同样,您也可以删除您不想保存的细节。

此外,请记住,如果你是某人的朋友,并且他们也关注你,那么此人将同时出现在关注者列表和朋友列表中。我们的脚本不处理这种类型的后处理。

4.运行脚本

您可以将上述代码复制并粘贴到您自己的脚本中,或者您可以在此处找到该脚本的可执行版本:

https://github.com/brienna/twitter-helper-scripts

要使用这个脚本,

  1. 下载两个文件:脚本及其需求. txt 。将这两个文件和您的配置放在同一个目录中。ini 从上面。在这个目录中应该总共有 3 个文件。

  2. 使用命令行,导航到此目录。下载 Python 需求:

    pip install -r requirements.txt

  3. 运行脚本:

    python download_friends_or_followers.py -u [user] -t [type] 对于[user]参数,输入您想要获取关注者和/或朋友的 Twitter 句柄。此参数是必需的。

    对于[type]参数,输入所需类型:friends, followersboth.此参数不是必需的。默认为followers. 例如:

    python download_friends_or_followers.py -u briennakh -t both

现在,您应该会看到一个或两个 CSV 文件出现在您的目录中,这取决于您所请求的类型。

如果你想阅读更多我的文章或者探索数以百万计的其他文章,你可以注册成为中级会员

https://brienna.medium.com/membership

你也可以订阅我的邮件列表,以便在我发表新文章时得到通知

https://brienna.medium.com/subscribe

你可能会对我的其他一些故事感兴趣

https://medium.com/codex/how-to-detect-code-plagiarism-de147cb4f421

如何用线性规划用 Python 画国会选区

原文:https://towardsdatascience.com/how-to-draw-congressional-districts-in-python-with-linear-programming-b1e33c80bc52?source=collection_archive---------29-----------------------

实践教程

高层对话的模型,不沉溺于细节

由丹·迈耶斯在 Unsplash 上拍摄的照片

美国国会选区分配如何类似于在线订单?

作为一名建立了许多供应链模型的数据科学家,我理解分配模型是如何有用的。以网上订购产品为例。该产品可能存在于不止一个仓库的库存中,但是该产品很可能从更近的仓库发货。这里的推理与成本有关;短途运输通常花费较少。但是,如果更远的仓库运营成本更低,那么总成本也会更低。当尽快收到产品有价值时,附近的仓库更有可能处理订单,即使总成本更高。

类似于仓库如何将大量产品分配给客户,这种国会选区模型将使用线性规划将各县的人口分配给各选区。线性规划是数学建模的一种形式,用于寻找用线性关系表示的问题的最优解。但首先,让我们讨论一下俄勒冈州国会选区的背景——它将被用作例子。假设对美国国会选区有基本的了解。

俄勒冈州的国会选区

当我得知俄勒冈州可能在 2020 年美国人口普查后获得一个新的国会选区时,我的好奇心被激起了。皮尤研究中心写了一篇文章可视化了这种可能性,因为俄勒冈州是 2010 年最接近增加一个区的州之一。

划分国会选区很复杂。还有一些相互竞争的要求,如紧凑性和保持政治边界,如县界。尽管研究人员和软件工程师已经开发出优雅的模型来展示最佳紧凑度或平衡功率,但这些模型并不维持大多数县和政治的界限。

最大化每个参数的复杂性已被很好地记录。相反,这种模式旨在快速制定解决方案,为对话提供一个良好的起点。关于我的动机的主题,该模型对于阐明如何处理地区数量的变化是最有用的。

大约 50 年前,俄勒冈州的选区数量发生了变化(维基百科),思考一个新的选区会是什么样子很有趣。新地区是否会对地区形状产生重大影响,或者新地区是否会在现有地区没有重大变化的情况下被吸收?我关于未来的问题可以归结为两点。

  • 在过去的十年里,人口发生了怎样的变化?
  • 国会选区地图将如何重画?

Python 模型将考虑以下国会选区标准:

  • 总体 — 几乎相等或对任何差异的合理推理
  • 邻接 —一个地区的所有部分都与其他部分相连
  • 郡县 — 保留郡县和其他政治边界

在通过线性规划模型发现解决方案之前,让我们更深入地了解一下俄勒冈州的人口。

俄勒冈州人口概况

根据关于人口普查分配何时准备就绪的最新更新,我们可以预计在 2021 年底左右知道俄勒冈州 2020 年人口普查的结果。因此,目前以下分析和模型基于 2018 年和 2020 年的估计。2020 年人口普查数据发布后,您可以查看Github文件进行更新。

根据 2010 年的人口普查,俄勒冈州最大和最小的地区之间的人口差异约为 1.6%。由于各地区之间人口增长的差异,现在最大的差异接近 5%。

估计人口变化(图片由作者提供)

根据人口标准和俄勒冈州目前的国会选区地图,人们可能会认为俄勒冈州的大部分人口居住在太平洋海岸附近。

来自 2010 年人口普查的俄勒冈州国会选区地图(内政部-通过维基百科的美国国家地图集)

根据对县人口的进一步调查,俄勒冈州 420 万人口中约有 70%居住在威拉米特河谷。

俄勒冈州各县人口* 2018 年估计数(图片由作者提供)

威拉米特河始于尤金附近,向北流动,直到在波特兰与哥伦比亚河汇合。海岸山脉在山谷的西面,而喀斯喀特山脉在山谷的东面。

通过 ArcGIS 在线地图 Viewer⁴获取俄勒冈州地形

在上两次人口普查之间,所有五个国会选区都经历了人口增长,而这种增长大部分发生在人口已经最多的县。

俄勒冈州各县人口变化(图片由作者提供)

线性规划优化模型

完整的线性规划模型发布在 GitHub 上,摘录将在此分享。

该模型由一个目标驱动,即在以下约束条件下,将分配给多个区的县的数量最小化:

  1. 只有人口超过 220,000 的县才能分配给一个以上的区。这些县可以划给一个或两个区。如果一个县被分配到一个区,那么该县至少有 20%的人口被分配到该区。
  2. 所有县至少被分配到一个区。
  3. 所有县的人口都被分配到区,这种分配只能在一个县被分配到该区时发生。
  4. 分配给一个区的县必须与该区的其他县接壤。
  5. 确保每个区只有一个相邻区。一个 算法被用来创建这些约束,并被部分利用。对接近可用的解决方案进行小的修改的功能也是可用的,但是没有被利用。

用 Python 建模(纸浆)

首先,导入有用的 Python 模块进行数据建模和可视化。然后导入以下相关数据:

  • 各县人口
  • 地理县形状
  • 在地图上标注县的纬度和经度

使用纸浆语法,制定优化模型。公式化的第一步是设置模型变量。

添加模型约束。对于纸浆,第一个约束总是目标函数。

添加主要约束。

  • 分配和指派—将所有县的人口分配到各区。
  • 毗邻地区 —例如,库斯县[5]仅与库里县[7]和道格拉斯县[9]接壤。因此,需要将库里县[7]或道格拉斯县[9]分配给包含库斯县[5]的任何区。否则,库斯县[5]将会与该区的其他地方脱节。
  • 地区规模 —每个地区的人口规模限制在 68 万至 73 万之间。基于 2020 年人口估计的最佳规模是每个区 711,000 人。
  • 县拆分 —只有人口超过 220,000 的县可以拆分为两个区,在这种情况下,每个区必须分配至少 20%的人口。

如果两个县之间在地理上有重要的人口中心,下面的附加约束会阻止这两个县被分配到同一个区。这种情况大多发生在相距遥远的县。这些限制因素也降低了各区出现多个集群的可能性,以确保各区相邻。

要查看这些约束的完整集合,请查看发布在 GitHub 上的模型。为简洁起见,这里分享一段摘录,防止俄勒冈州东部的贝克县与俄勒冈州西部的县划入同一个区。

调用算法求解模型并显示求解器状态。在这种情况下,将使用 GLPK 求解器。 GLPK 解算器需要安装,可与 pip 一起安装,但默认的 CBC 解算器也可以工作,具体取决于模型和/或解算器参数。

求解器状态(按作者排序的图像)

因为模型状态是最优的,而不是不可行的或另一种状态。俄勒冈州有 36 个县,目标的下限是 36 个。但是,客观值 38 意味着有两种情况,一个县被分配给两个区。

以下块处理来自求解器变量的数据并创建地图。

我们可以看到,Multnomah 县和 Klamath 县已被分配到多个区,因为这些县都是灰色的。

按人口和县划分的俄勒冈州选区(图片由作者提供)

这一解决方案表明,俄勒冈西南部和东部的两个现有地区将保留。俄勒冈州西北部目前的其他三个区将稍作修改,以允许第四个区转向人口稠密的地区。

以下显示了熊猫数据框架,按地区总结了熊猫数量,并回顾了灰色县的分配情况。

地区分配摘要(图片由作者提供)

拥有多个地区分配的县(图片由作者提供)

其他解决方案

这是在迭代过程中生成的另外两个解决方案图。

波特兰地铁的更多变化(图片由作者提供)

需要轻微修改的替代解决方案(图片由作者提供)

反射

这个模型在不到 10 分钟的时间内就被解决了,而且对于一个关于新区应该建在哪里的讨论来说,结果是令人满意的。尽管各区之间的人口差异比最终的实现要大,但是微调是繁琐的,超出了本文的范围。

回想起来,我意识到解决这个问题的复杂性。研究这个模型帮助我欣赏了国会选区划分的研究。有多种解决问题的方法,但是组合太多的方法会使问题变得不可行。也就是说,不存在满足所有期望约束的解决方案。

即使在试图简化复杂的国会选区模型以进行高层对话时,也有许多方法来构建该模型。由于高层对话并不适用一个模型比另一个更好的评估标准,我在这里分享了运行最快的模型。

我考虑或测试的几个建模选项特别值得注意:

  1. 也许我在最终模型中没有包括的最好的修改是修改邻接约束,以强制大多数县在其辖区内与多个其他县接壤。虽然该约束对于更快地找到合理的解决方案很有效,但是当收紧模型限制时,该约束不能与现有的约束很好地结合。然而,如果为其他状态(即,具有不同的数据)公式化该模型,对邻接约束的这种修改可能是有用的。
  2. 有可能创建一个目标函数来最小化到达每个地区的平均位置的距离。然而,对于求解器来说,该目标在计算上是复杂的,从而破坏了该模型快速运行的目标。

该建模练习的目的是开发一个可用于国会选区高层对话的模型。有趣的是,即使在俄勒冈州增加了一个额外的区,原来的五个区的形状可以说没有明显的变化。其他州的情况会是这样吗?

如果你喜欢这篇文章,并且想读(写)更多这样的文章,请考虑使用我的推荐链接成为中等会员:【https://sabolch-horvat.medium.com/membership

请注意,俄勒冈州的模型将在 2020 年人口普查结果可用时更新。该数据将可能在 2021 年 年底 发布。届时将有一篇专门关注俄勒冈州的新文章链接到这里。

[1]:皮尤研究中心。(2018 年 5 月 31 日)。美国人口持续增长,但众议院规模与塔夫脱时代相同https://www . pewresearch . org/fact-tank/2018/05/31/u-s-population-keep-growing-but-House-of-Representatives-is-same-size-in-Taft-era/

[2]:各州立法机关全国会议。(2019 年 4 月 23 日)。选区划分标准https://www . ncsl . org/research/redisting/redisting-Criteria . aspx

[3]维基百科。 O regon 的国会选区https://en . Wikipedia . org/wiki/Oregon 的 _congressional_districts

[4]:俄勒冈州 ArcGIS Server 服务。 ArcGIS Online 地图查看器https://navigator.state.or.us/arcgis/rest/

2021–08–21:数据已经发布。Register Guard(俄勒冈州尤金市的一份报纸)有一个很好的按县或州的汇总地图,显示哪些县或州的人口增长比其他县或州快。(https://data . register guard . com/census/total-population/total-population-change/Oregon/040-41/)

如何删除 Pandas 数据帧中某些列中有 NaN 值的行

原文:https://towardsdatascience.com/how-to-drop-rows-in-pandas-dataframes-with-nan-values-in-certain-columns-7613ad1a7f25?source=collection_archive---------0-----------------------

讨论从 pandas 数据帧中删除某些列中值为空的行的多种方法

Reed Mok 在 Unsplash 上拍照

介绍

在今天的简短指南中,我们将探索几种从 pandas 数据帧中删除某些列中有空值的行的方法。具体来说,我们将讨论如何删除带有以下内容的行:

  • 至少有一列是NaN
  • 所有列值都是NaN
  • 具有空值的特定列
  • 至少 N 列具有非空值

首先,让我们创建一个示例数据框架,我们将引用它来演示本文中的一些概念。

import pandas as pddf = pd.DataFrame({
    'colA':[None, False, False, True], 
    'colB': [None, 2, None, 4],
    'colC': [None, 'b', 'c', 'd'],
    'colD': [None, 2.0, 3.0, 4.0],
})print(df)
 *colA  colB  colC  colD
0   None   NaN  None   NaN
1  False   2.0     b   2.0
2  False   NaN     c   3.0
3   True   4.0     d   4.0*

删除至少有一个空值的所有行

当谈到删除熊猫数据帧中的空值时,[pandas.DataFrame.dropna()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html)方法是你的朋友。当您在整个数据帧上调用dropna()而没有指定任何参数(即使用默认行为)时,该方法将删除至少有一个缺失值的所有行。

**df = df.dropna()**print(df)
 *colA  colB colC  colD
1  False   2.0    b   2.0
3   True   4.0    d   4.0*

删除只有缺失值的行

现在,如果您想删除所有列值都为空的行,那么您需要指定how='all'参数。

**df = df.dropna(how='all')**print(df)
 *colA  colB colC  colD
1  False   2.0    b   2.0
2  False   NaN    c   3.0
3   True   4.0    d   4.0*

删除特定列值为空的行

如果您想只考虑特定的列,那么您需要指定subset参数。

例如,让我们假设我们想要删除任何列colAcolC中缺少值的所有行:

**df = df.dropna(subset=['colA', 'colC'])**print(df)
 *colA  colB colC  colD
1  False   2.0    b   2.0
2  False   NaN    c   3.0
3   True   4.0    d   4.0*

此外,如果所有行在colAcolB中都缺少值,您甚至可以删除所有行:

**df = df.dropna(subset=['colA', 'colB'], how='all')**print(df)
 *colA  colB colC  colD
1  False   2.0    b   2.0
2  False   NaN    c   3.0
3   True   4.0    d   4.0*

删除至少有 N 个非缺失值的行

最后,如果您需要删除至少有 N 个非缺失值列的所有行,那么您需要指定**thresh** 参数,该参数指定为了不被删除,每一行应该存在的非缺失值的数量

例如,如果您想要删除所有具有多个空值的列,那么您需要将thresh指定为len(df.columns) — 1

**df = df.dropna(thresh=len(df.columns)-1)**print(df)
 *colA  colB colC  colD
1  False   2.0    b   2.0
2  False   NaN    c   3.0
3   True   4.0    d   4.0*

最后的想法

在今天的简短指南中,我们讨论了在 pandas 数据帧中删除缺少值的行的 4 种方法。

请注意,除了pandas.DataFrame.dropna()之外,您可以使用许多不同的方法(例如 numpy.isnan()方法)来删除行(和/或列),后者是专门为 pandas 构建的,与更通用的方法相比,它具有更好的性能。

成为会员 阅读媒介上的每一个故事。你的会员费直接支持我和你看的其他作家。

你可能也会喜欢

https://medium.com/geekculture/use-performance-visualization-to-monitor-your-python-code-f6470592a1cb [## 如何将 Python 包上传到 PyPI

towardsdatascience.com](/how-to-upload-your-python-package-to-pypi-de1b363a1b3)

如何动态更改 Power BI Visual 中的尺寸

原文:https://towardsdatascience.com/how-to-dynamically-change-dimensions-within-a-power-bi-visual-61de11a0eea1?source=collection_archive---------7-----------------------

数据可视化中最受欢迎的功能之一是用户能够更改/切换图形中的维度。下面是如何在 Power BI 中实现的。

作者 Gif

最近,我一直在使用 Power BI 以富有洞察力的方式可视化数据,其中最受欢迎的功能之一是更改/切换仪表板中某个图形的维度。今天,我将一步一步地教你如何做到这一点。你只需要对 Power BI 有一个基本的了解就可以了。

我将使用一个 kaggle 数据集,它可以在这里找到来展示如何在一个 Power BI 视觉中改变尺寸。创建此功能的基本步骤如下:

  1. 在电源查询中创建桥接表
  2. 在超级查询中创建属性切片器表
  3. 连接事实表、桥和属性切片器表
  4. 添加具有动态维度功能的切片器和图形

好,我们开始吧!

  1. 在电力查询中创建桥接表

在创建桥表之前,您需要加载事实表。我将使用上面链接的 Kaggle 中的 vgsales 数据作为我的事实表。一旦完成,您将需要转到 Power Query 编辑器,为您的事实表创建两个副本,这可以通过右键单击事实表并选择 Duplicate 来完成。将第一个重复表重命名为“桥表”,将另一个重复表重命名为“属性切片器”。接下来:

  1. 在电源查询中选择您的网桥表
  2. 移动到“转换”选项卡
  3. 选择您希望能够在视觉效果中更改/切换的列(在我的例子中是:平台、流派和出版商)。提示:您可以通过按住 Ctrl 键并单击来选择多列。
  4. 单击“取消透视列”

unpivoting 要做的是将三个维度连接到一个名为“属性”的列中,这样每一行(唯一的视频游戏名称)现在将有 3 行(每个维度一行)。3 个维度中每个维度的值现在将合并到一个名为“值”的列中。这是取消透视前的表格:

作者图片

这是取消透视后的表格:

作者图片

所以,基本上我们把表格从宽格式转换成了长格式。

2.**在超级查询中创建属性切片器表**

我们将对属性切片器表执行与桥接表相同的步骤,并增加几个额外的步骤:

  1. 在超级查询中选择属性切片器表
  2. 移动到“转换”选项卡
  3. 选择您希望能够在视觉效果中更改/切换的列(在我的例子中是:平台、流派和出版商)
  4. 单击“取消透视列”
  5. 选择新的“属性”列
  6. 移动到主页表
  7. 选择删除其他列(在删除列选项卡下)
  8. 选择删除重复项(在删除行选项卡下)

所以基本上你会得到一个只有一列和三个值的表:平台、流派和出版商。你现在可以点击关闭并在超级查询中应用。

3.**连接事实表、桥和属性切片器表**

要连接事实表和桥表,您需要转到 Power BI 中的 Model 选项卡,并选择 Manage Relationships。您的事实表需要有一个惟一的主键来连接到桥表上。在我的例子中,PK 是等级和/或名称列。你们的关系应该是这样的:

作者图片

确保选择交叉过滤方向选项“Both ”,否则动态切片器将无法工作。接下来,设置桥和属性切片器表之间的关系,如下所示:

作者图片

您的数据模型应该如下所示:

作者图片

4.**添加具有动态尺寸功能的切片器和图形**

现在是时候真正开始有趣的事情了!我们将向报告页面添加一个切片器,并将属性切片器表中的属性添加到其中。然后,我们将添加一个条形图,并选择以下数据用于它:

轴:属性切片器表中的属性

图例:桥表中的值

值:Global_sales(这可以是您想要的任何指标)

我还在值过滤器中只过滤了前 10 名 Global_sales,以减少图表中显示的条形列的数量。您的页面应该如下所示:

作者图片

现在,您可以通过更改切片器选项来选择不同的属性显示在您的图形中!不要忘记让切片器只选择一个选项。

希望你喜欢我的教程,一如既往,我已经在我的 github 上发布了数据和功率 BI 报告。

如何轻松地自动化您的键盘来完成 Python 中的任务

原文:https://towardsdatascience.com/how-to-easily-automate-your-keyboard-to-do-tasks-in-python-b698e98a5c40?source=collection_archive---------4-----------------------

永远告别单调的任务

https://unsplash.com/@girlwithredhat

在 Python 中自动化你的键盘是非常容易的,下面是如何做到的。

你可以很容易地设置脚本,让它在你睡觉的时候帮你完成任务。

在这里,我将使用一个将成千上万的 PDF 文件转换为。txt 文件。在处理任何 NLP 项目时,知道如何做也是一件非常有用的事情。我还会写一些关于如何从 pdf 中提取数据的后续文章,所以请保持警惕。

你当然可以用 Adobe 来做这个,但是那会让你付出代价,而且这种方式肯定更有趣。

然而,实际应用并不止于此。如果你能自动化你的键盘,你就能自动化你的电脑所做的大部分事情!

让我们开始吧。

键盘包装

这个例子中的重物是“键盘”包。它的文档可以在这里找到。这是一个用纯 Python 编写的非常简单的包,并且没有依赖性。它可以在 Linux 和 Windows 上运行,从个人经验来看,它的易用性非常好。

你大概能猜到怎么安装。

pip install keyboard

使用起来非常简单。下面的代码只有七行,它将打开 windows 栏,搜索 google chrome,然后打开一个新的 chrome 浏览器。

作者代码—可在 https://gist.github.com/jasher4994 的获得。

尽管这可能很酷,但绝对没用。所以让我们进入有用的东西。

可以节省你数周时间的东西。

结合使用键盘和 Python 脚本来自动化重复的过程

我发现键盘包最有用的地方是它是一个设计良好的系统的一部分,这个系统围绕着一个只能用键盘执行的重复动作。

因此,具有挑战性的部分是设计一个系统,这样我们就可以自动化这个过程——在这个系统中,我们可以只用键盘做任何事情。

在这种情况下,很简单,我们必须设计一个系统,在其中我们可以使用键盘来自动化单调的动作,节省。txt 文件。

因此,我们需要按顺序做这些事情:

  • 打开我们要更改为. txt 文件的文件。
  • 点击“文件”
  • 单击“另存为文本”
  • 指定新文件名
  • 单击保存

我们需要做很多次。因此,我们希望对所有想要转换的文件自动执行这些操作。txt 文件。

因此,首先,我们必须把所有的文件放在一个地方,任何文件夹都可以。把它们放在这个文件夹中,使用下面的函数提取所有文件的名称列表。输入只是文件夹的路径。

作者编写的代码—可在https://gist.github.com/jasher4994下载

现在是有趣的部分,设置你的脚本来自动完成单调的部分。下面这个相对较短的函数就是你所需要的。

作者编写的代码—可以在 https://gist.github.com/jasher4994 的下载。灵感来源:https://stack overflow . com/questions/58774849/using-adobe-readers-export-as-text-function-in-python

这个函数非常简单。它接受一个路径(到存储所有文件的文件夹)和一个文件名作为输入。然后,它指定了一个用于紧急情况的 kill 键,然后概述了我在前面的列表中指定的同一组命令。第 3 行将文件名和文件夹路径连接起来,给出我们要找的文件的完整路径。我们可以从一开始就一起指定它们,但是当我们遍历同一个文件夹中的所有文件时,这将更有意义——路径是相同的,但是文件扩展名将会改变。**第 4 行**则相反,说明我们将保存新创建的. txt .文件的路径。**第 5 行**通过声明我们允许覆盖文件来舍入第一个块——如果我们想要覆盖,稍后需要额外的点击。

因此,第 7–18 行无非是说明要按哪些键,以及两次按键之间要等待多长时间。这些行应该是不言自明的。输入是要按下的按钮和时间的整数输入。sleep()是在执行下一个命令之前要等待的时间。

如果你的文件很小,你可以在不到 5 秒的时间内完成,但是我有几个很长的 pdf 文件需要 3-4 秒。你不想催促计算机,否则它会在完成保存之前就开始按下当前文件的下一个文件的键。这可不好。如果你打算让它通宵运行,你最好保守估计。用一些最大的文件进行测试是一个好主意。

将这一切结合在一起

因此,要将所有这些放在一起并自动化这个过程,您只需要指定文件夹、导入包并遍历文件。

作者编写的代码—可以在https://gist.github.com/jasher4994下载

那很容易,不是吗?现在你所有的 pdf 文件都应该附有。txt 文件放在它们下面的同一文件夹中。

您可以通过将您拥有的文档数量乘以一次迭代的总时间来粗略估计它将运行多长时间。您可以在一次迭代中测试它,或者只计算睡眠时间,每按一次键增加一秒钟。

按照这种逻辑,1000 份文件需要的时间和睡一个好觉的时间差不多。

所以,买一个吧。

If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)

如果你喜欢这篇文章,下面是我写的一些类似的文章:

干杯,

詹姆斯

如何在 Mac 和 Windows 上轻松自动化您的 Python 脚本

原文:https://towardsdatascience.com/how-to-easily-automate-your-python-scripts-on-mac-and-windows-459388c9cc94?source=collection_archive---------2-----------------------

使用 crontab 和任务调度器来自动化您的脚本并节省时间

图片由 Pixabay 上的 Deeezy 拍摄

运行 Python 脚本可能就像打开 IDE 或文本编辑器并单击运行按钮一样简单;但是,如果脚本必须每天或每周执行,您就不希望浪费时间一遍又一遍地重复这些步骤。

相反,您可以通过计划在特定时间运行 Python 脚本的作业来自动化这些脚本。在本文中,我将向您展示如何在 Mac 和 Windows 上使用 crontab 和任务调度器来完成这项工作。

在 macOS 上调度作业

我们将要自动化的 Python 脚本叫做example.py。你可以使用任何你必须遵循的脚本。

步骤 1:用 PyInstaller 使 Python 文件可执行

要在 macOS 上调度一个作业,我们首先需要使我们的 Python 文件可执行(。exe)。将.py 文件转换成可执行文件有不同的方法。在这种情况下,我将使用“PyInstaller”库,因为它很简单。

PyInstaller 读取 Python 脚本并找到脚本需要执行的库。然后,它创建所有文件的副本,并将它们放在一个可执行文件中。

要安装 PyInstaller 并使您的 python 脚本可执行,请执行以下操作。

  • 打开终端,运行pip install pyinstaller。这将安装 PyInstaller
  • 在终端内部,转到您的脚本所在的目录(使用cd 在目录中导航)
  • 一旦进入脚本所在的路径,在终端中编写下面的pyinstaller --onefile example.py ,使脚本可执行。

在此之后,您将看到一条消息,上面写着“成功完成”然后在您的脚本所在的目录中,应该已经创建了一个名为“dist”的文件夹。在这个文件夹中,你会找到独立的可执行文件!右键点击,点击“打开方式”,然后“终端”,测试是否一切正常。

注意:如果您在运行独立的可执行文件后看到一个错误,如“ModuleFoundNotError:Not module named ' name _ of _ module '”,您必须再次重复第 1 步,但是现在编写下面的

pyinstaller --onefile example.py --hidden-import name_of_module

步骤 2:使用 crontab 调度作业

为了在 macOS 上调度作业,我们将使用 crontab。为此,打开终端并运行crontab -e。在这之后,你的终端应该看起来像下面的图片。

作者图片

您可以在这里创建新的工作。他们每个人都有自己的台词。要创建作业,请使用下面框中的格式。

* * * * * command_to_execute* - minute (0-59)
* - hour (0-23)
* - day of the month (1-31)
* - month (1-12)
* - day of the week (0-6, Sunday to Saturday)

学习如何创建新的 cron 作业很简单,但是要小心,cron 作业失败可能是灾难性的。我建议您使用 crontab.guru 来生成正确格式的 cron 表达式。

现在是时候创建一个 cron 作业了。

  • 点击i激活INSERT模式
  • 现在可以写作业了。在这个例子中,我写了0 15 * * 5 path_of_executable 这意味着"在每个星期五的 15:00 运行 Python 脚本*"*(你可以在 crontab.guru 上查看)

作者图片

  • 打出后,按esc。然后键入:并写wq保存并退出(w -写,q -退出),最后按回车键。

此后,可能会出现以下窗口

作者图片

只需点击“确定”即可授予访问权限。在此之后,应该已经创建了 crontab。

要验证 crontab 是否已创建,请编写crontab -e or crontab -l。如果您想删除列出的所有 crontabs,请编写crontab -r.

就是这样!现在,您的 Python 脚本将在预定的时间运行!

注意:如果你有权限问题,你需要给完全磁盘访问权限,所以去系统偏好设置,安全和隐私,隐私,和完全磁盘访问权限。

在 Windows 上调度作业

由于有了任务调度器,在 Windows 上安排作业比在 Mac 上更容易。只需遵循以下步骤。我们将要自动化的 Python 脚本叫做example.py

步骤 1:用批处理文件使 Python 文件可执行

批处理文件有不同的用途,但是在这种情况下,我们将把它作为一个可执行文件来自动化我们的 Python 脚本。

我们将把 Python 脚本存储在 bat 文件中,然后单击 bat 文件来执行命令并运行 Python 脚本。为此,请按照下列步骤操作。

  • 右键单击任何文件夹,然后单击“新建”并创建一个记事本(“文本文档”)
  • 在记事本中,使用以下格式编写文本。
**<Paste your python.exe location> <Paste your python script location>**

要获得“python.exe”路径(python 应用程序路径),您需要转到保存 Python 的位置(检查您安装它的位置)。您的记事本可能看起来像下面的文本。

"C:\User\Anaconda\python.exe" "C:\Scripts\example.py"
  • 现在点击“文件”,然后点击“另存为”,最后写下包括扩展名.bat 在内的任何名称。对于这个例子,我将创建一个名为example.bat的文件

步骤 2:在 Windows 任务计划程序中创建任务

让我们用 Windows 任务调度器来调度example.bat 文件。只要按照这些步骤。

  • 按 Windows 按钮并搜索 Windows 任务计划程序。然后点击它。

作者图片

  • 现在你应该会看到一个类似上图的窗口。单击右侧面板上的“创建基本任务”。

应该会弹出这样的窗口。

作者图片

现在你只需要填写所有需要的信息,然后点击下一步。这些是您在上面看到的选项:

  1. **创建一个基本任务:**写下你的任务名称和描述。
  2. **触发时间:**选择您希望任务开始的时间。您可以选择每日、每周、每月等等。然后你必须选择上一次选择的时间 ( 每 x 天、周、月重复一次)
  3. **操作:**有 3 种操作可用,但其中两种已过时,因此只需选择“启动程序”并单击“下一步”。然后,浏览我们之前创建的 bat 文件。
  4. 点击完成按钮创建任务。

在此之后,一个新的任务应该被列在任务调度器上。

就是这样!现在,您已经准备好在您的计算机上自动化任何 Python 脚本了。

与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)

如何在 Python 中轻松聚集文本数据

原文:https://towardsdatascience.com/how-to-easily-cluster-textual-data-in-python-ab27040b07d8?source=collection_archive---------2-----------------------

通过这种方法,您再也不必手动对调查答案进行聚类

Pawel Czerwinski 在 Unsplash 上的照片

文本数据是出了名的烦人,我真的不喜欢和它一起工作。

尤其是调查数据——让人们想打什么就打什么是谁的好主意?

在大多数研究公司中,一些穷人将不得不手动整理这些回答,并将它们“分类”到相似的答案组中。这样做有很多问题,比如大量的时间消耗,以及如何选择应该创建的集群数量。

集群太少,它们就不具体,太多,它们就过于具体。

我将要向您展示的这个方法解决了这两个问题。在让您访问该函数之前,我将首先解释我使用的方法,以便您将来可以使用它。

如果你知道 TF-IDF 和 K-means,那就直接跳到底部的功能。

向量表示和 TF-IDF

关于文本的向量表示和 TF-IDF 有上百万篇文章,所以我不会在这里浪费你太多时间。简而言之,我们将在这里使用的方法,TF-IDF(术语频率-逆文档频率)是一种统计方法,它表示一个单词(或词组)对一个文档或文本语料库的重要性。TF-IDF 值与该单词在文档中出现的次数成比例增加,并与包含该单词(或单词组)的文档数量成比例。更全面的解释,包括方程式,可以在维基页面看到。

我在这里使用的例子是一项调查的答案。我们正试图将调查答案归入同质组。因此,TF-IDF 分数将查看该答案中出现的单词与这些单词在所有其他答案中出现的频率的关系。

最好的开始方式是对 pandas 数据框架中的列使用 unique()方法,如下所示——S3 是我的列名。输入是字符串类型对象的列表。完整的文档可以在这里看到。

text = df.S3.unique()

其输出将是一个稀疏的 Numpy 矩阵。如果您使用 toarray()方法来查看它,它很可能是这样的:

稀疏矩阵的输出—由作者创建

从这里我们可以使用 K-means 来聚类我们的文本。

k-均值和肘方法

K-means 是最常见的聚类算法之一。但是,它不经常用于文本数据。多亏了 TF-IDF,我们的文本数据以一种可行的方式呈现出来。

大多数人以前都遇到过 K-means,但如果没有,这里有一个简短的介绍。

K-means 算法的主要目标是通过创建相似方差的聚类来最小化聚类内的平方和(或惯性)。首先,必须指定簇的数量,然后随机分配相同数量的“质心”。然后测量每个数据点和质心之间的欧几里德距离。然后,数据点被“分配”给最近的质心。然后,我们将新生成的聚类的平均值作为新的质心,并重复前面的步骤。然后重复这个过程,直到达到收敛或最大迭代次数。更深入的解释可以在这里看到。

这个过程的一个可视化例子,你可以看到质心和集群一起移动。【https://en.wikipedia.org/wiki/K-means_clustering

因此,算法相对来说是比较简单的。但是我们如何选择集群的数量呢?一个常见的,虽然不完美,但实用的启发式方法是肘法。该方法绘制相对于聚类数量的方差,并选择最像肘形的点。也可以通过绘制平方差的和来完成。

https://en . Wikipedia . org/wiki/Elbow _ method _(clustering)#/media/File:data clustering _ Elbow criterion。JPG

https://commons . wikimedia . org/wiki/File:Elbow _ Method _ for _ chopping _ Number _ of _ k . png

将这一切结合在一起

因此,我们能否将所有这些整合到一个功能中?当然,在下面。我会带你走一遍。

如果您在字符串列表上运行这个函数,在本例中,我使用调查答案,它将首先通过 TF-IDF 矢量器运行文本,然后运行 K-means。然后,它会为您绘制距离的平方和,然后显示要求您选择多少个集群。

由作者创建。应该在 Jupyter 运行以获得最佳效果。

然后,您只需输入您想要的集群数量,它就会为您创建群组。一旦你这样做了,它将输出所有的答案和他们被分配到哪个组。这是我的输出的一个例子,它清楚地表明工会是一个重要的集群。我的数据中没有明确的拐点,但我选择了七个聚类。每个组都有一个明确的主题,如工会或新冠肺炎,最后一个组作为不属于指定组的答案的总称。

由作者创建。

因此,接下来你所要做的就是得到一个字符串列表,就像我在开始时展示给你的那样,然后运行这个函数,你就有了聚集文本!

希望这有所帮助,它会节省你很多时间。

如果我鼓励你加入 medium,如果你通过这个链接加入,我会非常感激——这将有助于支持我在未来写出更好的内容。

如果你喜欢这篇文章,请看看我下面的其他文章。

干杯,

詹姆斯

如何轻松将 Python 脚本转换成可执行文件(。exe)

原文:https://towardsdatascience.com/how-to-easily-convert-a-python-script-to-an-executable-file-exe-4966e253c7e9?source=collection_archive---------0-----------------------

创建 Python 可执行文件的两种简单方法。

作者图片

虽然使用终端或您最喜欢的文本编辑器运行 Python 脚本很简单,但是在某些情况下,您更喜欢隐藏脚本中编写的所有代码(。py)放在可执行文件(.exe)。

也许您需要将脚本发送给一个根本不会编码的人,或者您可能需要安排一个在特定时间在您的计算机上运行.exe的作业。无论情况如何,在本指南中,我将向您展示两种创建可执行文件的方法。第一个(auto-py-to-exe)有一个友好的界面,可以帮助初学者轻松地创建可执行文件,而第二个(PyInstaller)提供了一种通过终端创建可执行文件的简单方法。

**Table of Contents** 1\. [Making an Executable file with auto-py-to-exe](#b2c6)
 - [Installing with pip](#c689)
 - [Running auto-py-to-exe](#eeef)
 - [Step 1: Add the script location](#0063)
 - [Step 2: Choosing “One Directory” or “One File”](#7b48)
 - [Step 3\. Choosing “Console Based” or “Window Based”](#d2bc)
 - [Step 4: Advanced option(e.g. output directory, additional import)](#7cd6)
 - [Step 5: Convert the file](#ed33)
2\. [Making an Executable file with PyInstaller](#f30d)

用 auto-py-to-exe 制作可执行文件

第一个选项提供了一个漂亮的 GUI(图形用户界面),它负责将 Python 脚本转换成可执行文件的所有必要工作。

对了,你也可以看看我的 YouTube 视频,学习一下如何把一个. py 转换成。如果你更喜欢看下面的步骤而不是阅读它们。

使用 pip 安装

要安装 auto-py-to-exe 的最新版本,只需打开终端并运行以下命令。

pip install auto-py-to-exe

注意:确保你安装 *auto-py-to-exe* 的工作环境包含了你的脚本需要运行的所有库。

运行自动复制到可执行文件

一旦安装了 auto-py-to-exe,创建一个可执行文件就像编写下面的命令一样简单。

auto-py-to-exe

运行该命令后,将打开以下 GUI 应用程序。

作者图片

我将带您浏览每个选项,以正确创建一个可执行文件。

创建可执行文件的步骤

步骤 1:添加脚本位置

浏览您希望转换的脚本,并将其添加到“脚本位置”字段。在本例中,我将选择一个自动化 Excel 报告的脚本(您可以在下面的链接中找到我的自动化 Excel 指南)

你可以随意选择任何你想要的剧本。然而,如果你的脚本需要读取一个路径,确保你使用绝对路径,因为相对路径不会像你期望的那样处理可执行文件。如有必要,在下面包含以下代码行,以了解可执行文件的位置,并对脚本进行必要的更改,以便在正确的目录下读取/导出文件。

application_path = os.path.dirname(sys.executable)

第二步:选择“一个目录”或“一个文件”

现在我们必须选择是创建“一个目录”还是“一个文件”第一个创建一个目录,其中包含脚本运行所需的所有依赖项(包括可执行文件),而第二个只创建一个可执行文件。

对于这个例子,我将选择“一个文件”选项。

第三步。选择“基于控制台”或“基于窗口”

现在是时候选择是否显示控制台了。如果您选择“基于控制台”,控制台将在运行可执行文件后打开,如果您的脚本生成基于控制台的输出,建议您这样做。但是,如果您不想在运行可执行文件时显示控制台输出,请选择“基于窗口”

我的脚本需要引入 Excel 电子表格的名称作为输入,以便创建我的 Excel 报表,因此我将选择“基于控制台”

步骤 4:高级选项(例如,输出目录、附加导入)

您可以添加图标,添加您的脚本需要运行的文件,等等!然而,对于这个例子,我将只修改可执行文件的导出路径。为此,点击“设置”选项并浏览您希望的输出目录。

作者图片

注意:如果您在双击创建的可执行文件后看到类似“ModuleFoundNotError:Not module named ' name _ of _ module '”的错误,您必须再次从步骤 1 开始重复,但是现在在“高级”选项的“隐藏-导入”字段中缺少模块名称。

步骤 5:转换文件

要转换。将文件复制到。只需点击下面的蓝色按钮。

作者图片

auto-py-to-exe在 convert 按钮上方显示的真正重要的东西是pyinstaller (本指南中的主库和第二个选项)制作的代码。exe 文件)需要创建一个可执行文件背后的花式贵由看到在屏幕上。

一旦该过程完成,可执行文件应该位于您在步骤 4 中设置的输出目录中!

用 PyInstaller 制作可执行文件

这个选项更适合那些喜欢在终端上快速创建运行命令的可执行文件的人。

如果您习惯于使用终端,那么 PyInstaller 库将是最佳选择。要安装 PyInstaller,请按照下列步骤操作。

  • **第一步:**打开一个终端,运行pip install pyinstaller
  • **步骤 2:** 使用终端,转到您的脚本所在的目录(使用cd命令)
  • **步骤 3:** 一旦进入正确的目录,在终端中使用下面的语法pyinstaller --onefile name_of_script.py 编写一个命令,使脚本可执行。

步骤 3 中使用的命令类似于步骤 5 图片中显示的auto-py-to-exe 选项的代码。您可以稍微使用一下由auto-py-to-exe 提供的 GUI,以习惯您可以添加到该命令中的许多选项。

运行该命令后,您应该会看到一条消息,显示“成功完成”在脚本所在的目录中,应该已经创建了一个名为“dist”的文件夹。在这个文件夹中,你会找到独立的可执行文件!

祝贺你!现在,您的 Python 脚本已经被转换为可执行文件。如果您想安排该文件在您的计算机上运行的时间,请查看本指南。

使用 Python 自动化您的生活! 加入我的 20k+人电子邮件列表,获取我的免费自动化备忘单。

如何在 Python 中轻松创建表格

原文:https://towardsdatascience.com/how-to-easily-create-tables-in-python-2eaea447d8fd?source=collection_archive---------0-----------------------

如何在 Python 中使用制表函数创建格式良好的表格

照片由 Unsplash 上的 Fotis Fotopoulos 拍摄

能够快速地将我们的数据组织成可读性更强的格式,例如在数据争论时,对于分析数据和计划后续步骤非常有帮助。Python 能够轻松地将某些表格数据类型转换成格式良好的纯文本表格,这是通过 制表 函数实现的。

安装制表

我们首先在命令行中使用 pip install 安装制表库:

pip install tabulate

导入制表功能

然后我们在代码中从制表库中导入 制表 函数:

from tabulate import tabulate

现在我们准备使用 制表 功能!

制表支持的表格数据类型

制表 函数可以将以下任何内容转换成易于阅读的纯文本表格:(来自制表 文档 )

  • 列表的列表或另一个可迭代的列表
  • 列表或另一个字典条目(作为列的关键字)
  • 可重复项的字典(作为列的键)
  • 二维数组
  • NumPy 记录数组(名称为列)
  • 熊猫。数据帧

列表列表

例如,如果我们有以下列表列表:

*table = [['First Name', 'Last Name', 'Age'], 
         ['John', 'Smith', 39], 
         ['Mary', 'Jane', 25], 
         ['Jennifer', 'Doe', 28]]*

我们可以使用 制表 功能将它变成可读性更好的纯文本表格:

*print(tabulate(table))*

由于列表列表中的第一个列表包含列名作为其元素,我们可以通过将‘first row’作为 headers 参数的参数来将其设置为列名或标题名:

*print(tabulate(table, headers='firstrow'))*

制表 函数还包含一个 tablefmt 参数,该参数允许我们使用伪图形来改善表格的外观:

*print(tabulate(table, headers='firstrow', tablefmt='grid'))*

对于 tablefmt ,我更喜欢用【fancy _ grid】的说法:

*print(tabulate(table, headers='firstrow', tablefmt='fancy_grid'))*

*** *

文学词典

我们可以使用字典创建上面的相同表格:

*info = {'First Name': ['John', 'Mary', 'Jennifer'], 
        'Last Name': ['Smith', 'Jane', 'Doe'], 
        'Age': [39, 25, 28]}*

在字典的情况下, 将是 列标题 ,而将是那些列的**元素。我们通过将‘keys’作为 headers 参数的自变量进行传递,来指定这些键将成为标题:**

*print(tabulate(info, headers='keys'))*

当然我们可以使用 tablefmt 参数来改善表格的外观:

*print(tabulate(info, headers='keys', tablefmt='fancy_grid'))*

添加索引

我们还可以使用 showindex 参数将索引添加到我们的表中:

*我们可以通过向参数 showindex 传递一个 iterable 来添加一个自定义索引。例如,如果我们希望索引从 1 开始,我们可以传入一个*范围对象*作为参数:*

*** *

缺少值

如果我们从上面的 info 字典中删除‘Jennifer’,我们的表将包含一个空字段:

*print(tabulate({'First Name': ['John', 'Mary'], 
                'Last Name': ['Smith', 'Jane', 'Doe'], 
                'Age': [39, 25, 28]}, 
                headers='keys', 
                tablefmt='fancy_grid'))*

如果我们的表中有任何缺失值,我们可以使用 missingval 参数选择用什么来填充它们。 的缺省值 是一个空字符串。如果我们将其更改为‘N/A’,我们的表格将会是这样的:

*print(tabulate({'First Name': ['John', 'Mary'], 
                'Last Name': ['Smith', 'Jane', 'Doe'], 
                'Age': [39, 25, 28]}, 
                headers='keys', 
                tablefmt='fancy_grid', 
                missingval='N/A'))*

将表格保存在文本文件中

我们可以使用上下文管理器将上述表格保存为文本文件:

*# save the table created above in a variable
table = tabulate({'First Name': ['John', 'Mary'], 
                 'Last Name': ['Smith', 'Jane', 'Doe'], 
                 'Age': [39, 25, 28]}, 
                 headers='keys', 
                 tablefmt='fancy_grid', 
                 missingval='N/A')

# use context manager to create table.txt file and write table to it
with open('table.txt', 'w') as f:
  f.write(table)*

现在我们应该有一个名为table . txt****的文本文件包含了上面的表格。

**如果你喜欢阅读这样的故事,并且想支持我成为一名作家,可以考虑注册成为一名媒体会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的 链接 *报名,我就赚点小提成。***

**https://lmatalka90.medium.com/membership **

我希望这篇关于如何使用制表函数轻松创建格式良好的表格的教程对你有所帮助。感谢您的阅读!

如何轻松绘制神经网络架构图

原文:https://towardsdatascience.com/how-to-easily-draw-neural-network-architecture-diagrams-a6b6138ed875?source=collection_archive---------1-----------------------

使用无代码 diagrams.net 工具通过图表可视化展示您的深度学习模型

作者图片

当我们处理越来越复杂的神经网络时,架构可能会变得难以理解和消化。

当我们想要向技术和非技术受众解释这些架构时,通常的模型摘要打印输出不会使其更容易理解。

摘要打印输出不是呈现神经网络结构的最佳方式|作者图片

在呈现和描述神经网络的架构时,图表可视化更有效,而不是用文字解释模型。

我们可能已经为今年剩下的时间编写了足够多的代码,所以让我们来看看一个简单的用于绘制定制架构图的无代码工具—diagrams.net(以前称为 draw.io)。

内容

(1)关于 diagrams.net(2)画你的第一张图
(3)保存你的图

Adeolu Eletu 在 Unsplash 上拍摄的照片

①关于 diagrams.net

diagrams.net(原名**draw . io)是一款免费拖放的在线图表工具,允许用户创建流程图,生成网络和实体关系(ER)图,甚至设计数据库模式。******

diagrams.net 的几个关键优势包括其易用性以及与 GitHub、OneDrive 和 Google Drive 等常见平台的无缝集成。

(2)画出你的第一张图

(I)导航至网络应用程序

让我们先来看看 diagrams.net 在线编辑工具https://app.diagrams.net/

当您到达主页时,会出现一个弹出窗口,要求您选择保存图的目标位置。如果你想先做些实验,你可以选择“稍后决定”。

以下是图表编辑器在登录页面上的外观:

diagram.net 编辑器的主页面|图片在 Apache 2.0 许可下使用

㈡从模板开始

虽然你在主页上看到的第一件事是一个空画布,但这并不意味着你必须从头开始构建你的图表。

diagrams.net 提供了现成的模板供您开始工作,这可以通过点击顶部菜单栏中的文件>新建… 来探索。**

根据您的不同目标,有许多模板可供选择。

可用模板列表|在 Apache 2.0 许可下使用的图像

(三)形状选择

diagrams.net 是建立在拖放的概念上的,所以使用起来非常直观。有大量的形状(来自不同的类别)可供选择,它们可以在图编辑器的左侧栏中找到。

左侧栏中可用的形状列表|在 Apache 2.0 许可下使用的图像

侧边栏带有一个搜索栏,用于查找您想到的特定形状(如等轴测立方体)和一个便笺,您可以在其中拖放形状以将其保存为收藏夹。

除了侧边栏中显示的形状之外,还有很多其他形状,你可以点击“ +更多形状… 【T21””按钮来浏览整个收藏。

****https://kennethleungty.medium.com/membership ****

㈣定制

一旦你把所有你想要的形状放到画布上,下一步就是定制设计编辑和安排。

右侧边栏提供了多个选项,可以对整个布局或特定形状进行细微的更改。可用选项因您用鼠标选择的对象而异。

如果您想手动编辑字体颜色和字体样式等方面的具体值,您可以点击“编辑样式按钮。

********

整个画布布局(左)和特定形状(右)的侧边栏定制菜单|在 Apache 2.0 许可下使用的图像

(3)保存您的图表

最后一步是以首选格式保存您的图表杰作。

根据 Apache 2.0 许可保存图表|图像的选项

你可以把它保存在你的本地设备或者流行的云存储平台上,比如 Google Drive 和 Dropbox。

(4)示例

使用这个在线工具,我能够轻松地为 YOLO v1 和 VGG16 生成架构图:

YOLO v1 建筑

YOLO v1 建筑|作者图片

VGG16 架构

VGG16 架构|作者图片

这些美丽的视觉化图像无疑让我们所有人更容易欣赏和理解这些神经网络架构。

如果你想使用我创建的模板,请前往GitHub repo访问。drawio 文件,可以直接使用。**

在你走之前

****欢迎您加入和我一起踏上数据科学学习之旅!关注此媒体页面或查看我的 GitHub 以了解更多精彩的数据科学内容。同时,享受绘制架构图的乐趣!

**** ****

如何用 Python 轻松制作漂亮的文字云

原文:https://towardsdatascience.com/how-to-easily-make-beautiful-wordclouds-in-python-55789102f6f5?source=collection_archive---------5-----------------------

使用 stylecloud 和 wordcloud 库来定制你的 wordcloud。

作者图片

词云让我们很容易识别文本中的关键词,其中单词的大小代表它们的频率。有了这个,我们甚至在阅读之前就能很好地理解一篇文章的内容。虽然有很多免费的工具可以在线制作 word cloud,但是我们可以使用我们的 Python 技能来定制更多的 word cloud。

在本文中,我们将使用stylecloud库用几行代码制作漂亮的单词云,使用wordcloud 库添加我们自己的图片作为单词云的遮罩,使用stop_words 定制默认提供的停用词列表。

用 Stylecloud 制作漂亮的单词云

我们将要使用的文字是史蒂夫·乔布斯在斯坦福演讲的一部分。你可以找到。txt 文件,或者使用任何文本来制作你自己的 wordcloud。

要轻松做出漂亮的字云,我们首先要做的就是安装stylecloud。你可以通过 pip pip3 install stylecloud.安装它

一旦安装了stylecloud,就要导入。

import stylecloud

现在要创建一个基本的 wordcloud,我们需要使用.gen_stylecloud() 方法并添加。txt 文件和图标,我们将使用这个词云的形式。在这个网站上,你可以找到可以和 stylecloud 一起使用的图标列表。只需搜索你想要的图标,复制图标的 HTML 代码(在这个例子中,我选择了一个苹果作为图标)

stylecloud.gen_stylecloud(file_path='SJ-Speech.txt',
                          icon_name= "fas fa-apple-alt")

结果是下面的 wordcloud(该文件在 Python 脚本所在的同一路径中创建)

作者图片

但是我们可以做得更多!我们可以进一步定制 wordcloud,以获得更好看的 wordcloud。

我们可以控制背景颜色、单词的颜色、输出文件的名称,还可以省略 wordcloud 中两个单词的搭配。为此,我们将使用下面的代码。

stylecloud.gen_stylecloud(file_path='SJ-Speech.txt',
                          icon_name='fas fa-apple-alt',
                          colors='white',
                          background_color='black',
                          output_name='apple.png',
                          collocations=False)

我们甚至可以编写颜色的 HTML 代码,而不是使用像“白色”这样的标准颜色在这个网站上,你可以选择任何你想要的颜色,并获得它的 HTML 代码,你可以将它包含在 stylecloud 的colors 参数中。

作者图片

添加或删除停用词

默认情况下,Stylecloud 有一个英文的停用词列表,但是如果您想要删除或添加新的停用词,您必须在custom_stopwords参数中包含一个新的列表。

为了定制停用词列表,我们必须使用stop_words库。要做到这一点,首先,安装它(pip install stop_words),然后我们使用get_stop_words获得一个特定语言的停用词列表。

from stop_words import get_stop_wordsstop_words = get_stop_words('english')

一旦定义了列表,就可以分别用.append.remove方法添加或删除元素。

stop_words.append('my_new_stop_word')
stop_words.remove('my_new_stop_word')

现在,我们只需添加新的stop_words列表。我还将使用调色板而不是颜色来给 wordcloud 一个不同的外观。

stylecloud.gen_stylecloud(file_path='SJ-Speech.txt',
                          icon_name='fas fa-apple-alt',
                         palette='cartocolors.qualitative.Pastel_3',
                          background_color='black',
                          output_name='apple.png',
                          collocations=False,
                          custom_stopwords=stop_words)

在这个网站上,您可以找到一个 Python 调色板列表,您可以在 stylecloud 库中使用它(正如您在上面的代码中看到的,用点分隔的名称代表了palettes模块的内容)

作者图片

添加您自己的图像

有数百个免费图标可以和stylecloud一起使用,但有时我们可能想使用我们自己的图像来给我们想要创建的 wordcloud 赋予形式。如果是这样的话,我们必须使用wordcloud 库来制作一个单词云,PIL来上传图片,matplotlib 来绘制单词云,numpy 来使用上传的图片作为我们的单词云的遮罩。

首先,我们安装前面提到的所有 4 个库。一旦我们有了所有的模板,我们就导入它们,并开始用想要的模板创建一个 wordcloud。

from wordcloud import WordCloud, ImageColorGenerator 
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np# create a mask based on the image we wish to include
my_mask = np.array(Image.open('batman-logo.png'))# create a wordcloud 
wc = WordCloud(background_color='white',
               mask=my_mask,
               collocations=False,
               width=600,
               height=300,
               contour_width=3,
               contour_color='black',
               stopwords=stop_words)

如您所见,所使用的代码类似于 stylecloud,只是有一些变化。我们使用mask来指定我们想要用于 wordcloud 的图像(在本例中,我使用的是蝙蝠侠标志)。此外,我们包括轮廓宽度和颜色,使图像的形状更加明显。

注意:确保你要用作蒙版的图片具有清晰的轮廓,否则文字云会不好看。

现在我们必须读取文本文件,并用下面的代码生成 wordcloud。

with open('SJ-Speech.txt', 'r') as txt_file:
    texto = txt_file.read()wc.generate(texto)

如果我们想使用原始图像的颜色,我们编写下面的代码(如果不是这样,wordcloud 将有随机的颜色,就像本文中显示的第一个苹果图像一样)

image_colors = ImageColorGenerator(my_mask)
wc.recolor(color_func=image_colors)

最后,我们使用 matplotlib 来绘制 wordcloud。

plt.figure(figsize=(20, 10))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
wc.to_file('wordcloud.png')
plt.show()

我还删除了轴,只保留了图中的单词云,并用wc.to_file()保存单词云

作者图片

就是这样!现在你已经准备好用 Python 制作你自己的 wordcloud 了!我在下面的文章中用辛普森一家的角色创建了一些单词云。

下面是我看的学习 Python 的书单。

https://betterprogramming.pub/4-python-books-i-read-as-a-self-taught-programmer-5a5453840cdb

与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)

感谢阅读这篇文章!在下面的文章中,你可以找到我用 Python 制作的其他漂亮的可视化指南。

</8-free-tools-to-make-interactive-data-visualizations-in-2021-no-coding-required-2b2c6c564b5b>

如何轻松将多台 Jupyter 笔记本合并为一台

原文:https://towardsdatascience.com/how-to-easily-merge-multiple-jupyter-notebooks-into-one-e464a22d2dc4?source=collection_archive---------1-----------------------

招数

黑进你的 Jupyter

作者:阿玛尔哈斯尼 & 迪亚赫米拉

Paul Hanaoka 在 Unsplash 上拍摄的照片

Juypyter 笔记本是数据科学家非常必要的工具。它们为交互式计算提供了多种实用的选择,因为它们将代码、文本和可视化结合在一个文档中。
出于组织目的,通常会选择在一个项目中使用多个独立的笔记本。问题是,当经理或客户要求快速演示时,您需要快速合并不同的笔记本,重组单元格可能是一个冗长乏味的复制-粘贴序列。

由于 Jupyter 的界面并不容易,我们认为是时候创建我们自己的解决方案了。在本文中,我们将向您展示如何以省时的方式重组和连接两个笔记本。您将学习到的内容将允许您使用 python 代码来重组、过滤和更改笔记本的单元格。

**Table Of Contents:**
· [Getting to know Notebooks’s structure](#06b6)
· [Concatenating Notebooks](#e504)
· [Going further with nbformat](#2394)

了解笔记本电脑的结构

不知道大家有没有尝试过打开 Jupyter 笔记本文件(那个有**)。ipynb** 作为扩展)带有文本编辑器。如果您看到了,那么您要么看到了奇怪的乱码,要么认出了 JSON 格式。

如果您不知道 JSON 格式是什么,它代表 JavaScript 对象表示法,是一种以人类可读的方式存储对象/数据的方法。相当整洁简单(你可以在这里了解更多关于这个)。

就像我说过的,IPYNB 文件是以 JSON 纯文本格式存储的,如果你打开一个文件,它会是这样的:

如您所见,这是一本结构良好的字典,包含:

  • metadata:基本上是一个字典,包含关于内核和所用语言的信息(以及更多)。
  • nbformatnbformat_minor:这些只是笔记本格式版本(这里是 4.0)
  • 这是我们最有可能感兴趣的,它包含了笔记本单元格的列表。

每个单元格由一个包含不同键值对的类似字典表示:

您可以在该屏幕截图中看到每个字段的位置:

作者截图

现在,您已经了解了足够多的知识,可以开始玩笔记本的电池了。但是,如果你想了解更多细节,你可以在这个链接查看文档。

连接笔记本

所以我们选择的实际例子是将两个笔记本合并在一起。这是一个相当简单的例子,但是你将看到如何读、写和调整笔记本,并且根据你的使用情况,你可以根据你的需要修改代码。

如果你愿意,你可以在这个链接下载示例笔记本来尝试代码。

所以让我们从实现一个读取 IPYNB 文件的函数开始。我们将使用 python 标准库中包含的 json模块:

现在读取文件只需要两行代码:

first_notebook = read_ipynb('first_notebook.ipynb')
second_notebook = read_ipynb('second_notebook.ipynb')

虽然在这个例子中我们可能不一定需要复制笔记本,但是如果您想摆弄笔记本,它可能会派上用场。这里,我们将再次使用标准库的 copy模块:

import copy
final_notebook = copy.deepcopy(first_notebook)

这就是我们实际合并细胞的部分:

final_notebook['cells'] = first_notebook['cells'] + second_notebook['cells']

最后,让我们编写一个助手函数,将笔记本导出为 Jupyter 笔记本格式,并使用它导出我们的 final_notebook:

使用 nbformat 更进一步

Jupyter 开发团队给了我们包 nbformat来进行类似的操作,比如读取ipynb文件或者用 nbformat.v4.new_code_cell创建新的代码单元。

举个例子,让我们复制用nbformat连接两个笔记本的等价代码:

如果你想要一个由nbformat提供的更详尽的函数列表,你可以在下面的链接中查看它们的文档。

最后的想法

深入了解 Jupyter 笔记本的结构,可以获得创建细胞操作解决方案所需的知识。本文详细介绍了两种解决方案,它们为您提供了一种将两个笔记本合并成一个笔记本的繁琐的复制粘贴工作的变通方法。您将在这个 Github 资源库中找到本文使用的所有代码。

根据您的用例,您可以进一步创建脚本,以自动、省时的方式进行您需要的其他修改。

我们希望这篇文章对你有用。感谢您坚持到现在,注意安全,我们将在下一篇文章中再见😊!

更多文章阅读

https://python.plainenglish.io/what-the-newly-released-jupyterlab-3-has-to-offer-a9a144d93046 </8-tips-to-write-cleaner-code-376f7232652c>

如何使用 AWS Data Wrangler 在 S3 上轻松执行 Pandas 操作

原文:https://towardsdatascience.com/how-to-easily-perform-pandas-operations-on-s3-with-aws-data-wrangler-875672289aae?source=collection_archive---------8-----------------------

与 S3 交互,就像它是您的本地文件系统一样

照片由 JJ 英在 Unsplash

我一直觉得通过编程与 S3 交互来执行简单的任务有点复杂和不直观,比如文件读取或写入、批量下载或上传,甚至大规模文件删除(使用通配符等)。

我的典型用例是处理我从 S3 下载(或保存到那里)的熊猫数据帧,数据格式有三种:CSV、JSON 和 Parquet,用于分析和处理。

在寻找 boto3 (不要误会,这是一个很好的与 AWS 进行编程接口的包)的替代品时,我遇到了 AWS Data Wrangler ,这是一个 python 库,它通过将数据帧连接到 AWS 数据相关的服务,如 Athena、Glue、Redshift、DynamoDB、EMR……以及最重要的(至少对我来说)S3,将 Pandas 的功能扩展到 AWS。

在本帖中,我将回顾 AWS Data Wrangler 轻松连接熊猫和 S3 的功能。

作者图片

什么是 S3?

用户修改的图像

如果你不是 AWS 用户,S3 代表亚马逊简单存储服务。这是一套网络服务,你可以用它在任何时间,从网络上的任何地方存储任何数量的数据。

它为任何开发人员提供了对高度可伸缩、可靠、快速和廉价的数据存储的访问。

→要全面了解 S3,请查看官方文档。

为了能够使用 S3 并复制以下代码片段,您需要设置一个 AWS 帐户。

创建 IAM 用户

用户修改的图像

在使用 AWS Data Wrangler 之前,您必须创建一个 IAM 用户

IAM 代表身份和访问管理:这是一种让你能够安全管理 AWS 服务和资源访问的服务。IAM 允许您创建用户和组,并使用权限来允许或拒绝对 AWS 资源的访问。

一旦创建了 IAM 用户,AWS 将为您提供两个凭证:**Access key ID****Secret access key**。您必须使用它们在您的机器上配置 AWS 概要文件。

然后,AWS Data Wrangler 将使用该配置文件代表您以编程方式访问 AWS 服务。

要创建 IAM 用户,请转到 AWS 控制台并搜索 IAM。在左上角的工具条上,点击Users

用户截图

这将列出您已经创建的用户。要添加新的,点击Add users

用户截图

为此用户输入一个名称,并分配给它**Programmatic access**

用户截图

然后,将其添加到一个组中,以定义其权限集。为简单起见,授予 it 管理员访问权限,但是您可能希望将其限制为一组有限的权限。

用户截图

跳过标记步骤并验证用户创建。

创建用户后,屏幕上会出现凭证:**Access key ID****Secret access key**。我们将使用它们来配置 AWS 概要文件。

用户截图

配置 AWS 配置文件

要配置 AWS 概要文件,您必须首先按照本指南安装 AWS CLI,然后输入以下命令

**aws configure --profile ahmed**

系统会提示您输入以前的凭据。只需这样做,并将区域名称和输出格式保留为默认值。

用户截图

现在,AWS 概要文件已经正确配置了。

为了让 AWS Data Wrangler 使用它,我们必须在实验开始时设置一个与 boto3 的默认会话:只需在脚本或笔记本的开头留下这些行。

后续命令将使用为此配置文件提供的权限。

使用 AWS Data Wrangler 与 s3 对象交互

首先,让我们安装 AWS 数据牧马人。

**pip install awswrangler**

在运行任何命令与 S3 交互之前,让我们看看我的 buckets 的当前结构。

用户截图

没什么特别的,只是一堆我用于个人项目的水桶。

AWS Data Wrangler 可以对这些桶执行基本操作:

  • 检查物体是否存在:
**>>> wr.s3.does_object_exist("s3://ahmedbesbes.com/plot.html")
True**
  • 递归列出桶内的对象:
**>>> wr.s3.list_objects("s3://ahmedbesbes.com")
['s3://ahmedbesbes.com/app.mp4',
 's3://ahmedbesbes.com/plot.html',
 's3://ahmedbesbes.com/pyldavis.html']**
  • 列出存储桶内的目录
**>>> wr.s3.list_directories("s3://sozy")
['s3://sozy/assets/',
 's3://sozy/images/',
 's3://sozy/saved_images/']**
  • 显示每个桶的区域名称
**>>> wr.s3.get_bucket_region("ahmedbesbes.com")
'eu-west-3'**
  • 获取每个对象的信息
**>>> wr.s3.describe_objects("s3://ahmedbesbes.com/plot.html")**

这将输出一个描述文件的 JSON 对象。它包括内容类型、大小以及权限元数据等属性。

作者截图

describe_objects方法也可以接受一个文件夹作为输入。在这种情况下,它将返回一个 JSON 对象列表,每个对象描述文件夹中的每个文件。

读取、写入和删除操作

现在有趣的部分来了,我们让熊猫在 S3 上做手术。

  • 读取文件

让我们从在 bucket 中保存一个虚拟数据帧作为 CSV 文件开始。

这就像与本地文件系统交互一样简单。这里有一件很酷的事情:如果/csv/sub-folder/还不存在,AWS Data Wrangler 会自动创建它。

  • 一次读取多个 CSV 文件:

这个其实挺简单的。您所要做的就是传递一个远程路径列表。在幕后,AWS Data Wrangler 将沿着行轴(轴=0)连接四个数据帧。

  • 使用前缀

假设您在一个文件夹中有 1000 个 CSV 文件,并且您想在一个数据帧中一次性读取它们。为此,您可以将文件夹的路径传递给read_csv方法。AWS Data Wrangler 将在其中查找所有 CSV 文件。

**wr.s3.read_csv(f"s3://{bucket}/csv/")**
  • 删除对象

您可以使用delete_objects方法删除对象

该方法在 path 参数中接受 Unix shell 样式的通配符。

例如,假设您想要删除特定文件夹中的所有 1000 个 CSV 文件。

你应该这么做:

**wr.s3.delete_objects(f"s3://{bucket}/folder/*.csv")**

JSON 和 Parquet 文件也是如此

您也可以对 JSON 和 Parquet 文件执行同样的操作

只需替换为:

  • wr.s3.read_csvwr.s3.read_jsonwr.s3.read_parquet
  • wr.s3.to_csvwr.s3.to_jsonwr.s3.to_parquet

下载和上传对象

  • 下载对象

AWS Data Wrangler 使从 S3 下载对象变得非常容易。这是我开始使用它的主要原因。

要下载远程对象,只需使用 download 方法。该方法将对象的远程路径作为第一个参数,将保存对象的本地路径作为第二个参数。

或者,您可以以二进制模式下载对象。

  • 上传对象

上传对象遵循相同的逻辑。

感谢阅读!

这篇文章收集了我在使用 AWS Data Wrangler 进行 per 时所做的笔记。我希望你觉得它们有用。

在后面的文章中,我将回顾其他 AWS 服务,如 DynamoDB 和 EMR,以及如何使用 AWS Data Wrangler 与它们进行交互。

就目前而言,如果你想深入了解,这里有一些值得一读的资源。

  • AWS S3:https://aws.amazon.com/s3/?nc1=h_ls
  • AWS IAM:https://aws.amazon.com/iam/?nc2=type_a
  • AWS 数据牧马人文档:https://aws-data-wrangler.readthedocs.io/
  • **Github:**https://github.com/awslabs/aws-data-wrangler[T21](https://github.com/awslabs/aws-data-wrangler)

下次见!

照片由卡斯滕·怀恩吉尔特在 Unsplash 上拍摄

新到中?您可以每月订阅 5 美元,并解锁无限的文章— 单击此处。

如何在网站输入上轻松运行 Python 脚本

原文:https://towardsdatascience.com/how-to-easily-run-python-scripts-on-website-inputs-d5167bd4eb4b?source=collection_archive---------4-----------------------

这是我建立的一个网站的演示,它将动态分析文本情感

蒂莫西·戴克斯在 Unsplash 拍摄的照片

所有数据科学家都知道计算机在分析文本方面有多好,但大多数其他人不知道。所以作为一个普通人,我想我会给他们他们不知道他们需要的东西——一个网站,在那里他们可以分析他们自己的电子书。

你可以在这里阅读网站的用处。但是这篇文章更多的是针对你们这些技术人员,集中在如何在用户输入上运行 python 脚本并产生输出——而不是将输入保存在任何地方。

这是非常有用的,因为它是完全自动化的,只要服务器不崩溃(他们可能会——我不知道),那么它应该会自己运行。没有任何维护。

背景

所以游戏的目的是制作一个网站,它接受用户输入,在上面运行 python 脚本,然后以一种可用的方式返回给用户。事实证明,在线运行 Python 脚本并不容易,我在网上也没有找到太多的帮助,但下面是我找到的全部内容。

我发现最好的方法是使用Flask——一个用 Python 编写的微型 web 框架。Flask 和 Django 一起,通常用于 web 开发。因为它们是用 Python 编写的,所以很容易将 Python 脚本集成到您的路由中。

我以前写过一篇非常受欢迎的关于如何显示 Matplotlib 图和 Panda 的数据帧的文章——如果听起来有用,那么请检查一下。

提醒一下,这里的目标是从 HTML 表单中获取用户输入,在其上运行 python 脚本,并在全自动过程中输出结果。

建立

这个项目的设置非常简单。我们首先必须从 Flask 导入所有需要的包,如下所示( **Line 2** )。然后我们初始化应用程序(**第 5 行**)——你可以随便叫它什么,但习惯上使用邓德的“名字”。只是不要叫它 Flask,因为这将与 Flask 本身相冲突。最后,我们使用 route decorator 告诉 Flask 哪个 URL 应该调用我们的函数。在这种情况下,它只是'/' —所以我们的初始页面。

保持 debug = True 打开,以便开发时自动重新加载。但是不要忘记在部署时删除它。

可以看到,我们已经返回了“render_template”函数,这是任何 Flask 应用程序都必须的。它从 templates 文件夹(Flask 需要一个特定的 templates 文件夹)返回一个 HTML 文件,并将其呈现在指定的页面上。这是我们需要的 HTML。

可以看出,这是一个非常简单的 HTML 页面,您可能已经看过一百次了。然而,第 11–15 行是我们感兴趣的。在第 11 行,我们指定了表单的开始,并在第 15 行关闭它。在表单中,我们有三个 div 标签(第 12、13 行,& 14 )。第 12 行仅仅是表单标题,只不过是文本,第 13 行是文件选择,第 14 行是提交按钮。正如您在这里看到的,我们已经将输入类型指定为“file ”,并特别声明。txt 文件。

这里声明“enctype= 'multipart/form-data”很重要,因此 Flask 知道如何对输入进行编码。更重要的是,不要忘记声明 method = "POST ",这样 Flask 就知道请求存储在表单中的信息。

对输入运行 Python 脚本。

现在我们已经有了网站的基本框架,我们如何在输入上运行 python 脚本,然后向用户显示结果呢?

我们需要做的是,创建另一个仅在接收 post 请求时运行的装饰器。

这正是下面要做的。您可以将它直接放在原始的 route decorator 下面。

因此,在这里,当用户单击提交按钮时,这个函数被触发,因为它在使用 POST 方法时被激活。**第 5 行**然后使用请求库选择输入的文件。然后,您可以像在 python 中一样,简单地在这个变量上运行 Python 脚本。一旦你完成了操作,你就可以以多种方式之一将变量返回给用户。您可以像我上面一样使用 Response 方法,或者您可以将它传递给一个变量,并再次使用 render_template()在另一个 HTML 模板中直接输出它。可能性是无限的。

你可以用多种方式托管你的网站,但我更喜欢 PythonAnywhere。如何做到这一点的指导可以在我的文章的结尾这里看到。

如上所述,你可以在 www.ebookanalyzer.com 的看到一个工作实例。

我当然不是网络开发人员,所以请原谅我的丑陋。

也请让我知道是否有任何错误,或者你可以看到任何改进或更优雅的解决方案。

If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)

如果你喜欢这篇文章,下面是我写的一些类似的文章:

[## 如何预测没有数据的事物——还有盆景树

towardsdatascience.com](/how-to-predict-something-with-no-data-and-bonsai-trees-b6ebc6471da3)

干杯,

詹姆斯

如何轻松设置 M1 macbook 进行数据科学和机器学习

原文:https://towardsdatascience.com/how-to-easily-set-up-m1-macbooks-for-data-science-and-machine-learning-cd4f8a6b706d?source=collection_archive---------4-----------------------

你只需要 10 分钟。和一台 M1 苹果机。

安德烈·德·森蒂斯峰在 Unsplash 上拍摄的照片

为数据科学配置 M1 MAC 可能是一件痛苦的事情。您可以选择更简单的方法,在 Rosseta 下运行所有东西,或者像疯子一样手动安装依赖项,面对永无止境的错误消息日志。

第一个选项很好,但是 Python 不能本地运行,所以会损失一些性能。第二个是,嗯,乏味又伤脑筋。

但是还有第三种选择。

今天,您将学习如何设置 Python,以便在任何 M1 芯片上通过 Miniforge 本机运行。我们还将通过一些例子来探索 Python 是否真的在本地运行。

这篇文章的结构如下:

  • 安装和配置 Miniforge
  • 性能试验
  • 最后的想法

安装和配置 Miniforge

我花了很多时间为数据科学配置 M1 Mac 电脑。它从来没有一点瑕疵。直到我发现了这个选项。根据网速的不同,完全设置需要 5 到 10 分钟。

首先,你需要安装自制软件。这是一个用于 Mac 的软件包管理器,您可以通过从终端执行以下行来安装它:

/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

请记住——如果你正在安装一台新的 M1 Mac,很可能你不会安装自制所需的 XCode 构建工具。终端会通知您这些是否丢失,并询问您是否要安装它们。

一旦安装了 XCode 构建工具和 Homebrew,您就可以重启终端并安装 Miniforge:

brew install miniforge

这是几百 MB 的下载,所以需要一些时间来完成。完成后,再次重启终端。

就是这样!Miniforge 现已安装,您可以创建虚拟环境并初始化 conda 了。以下终端行将基于 Python 3.8 创建一个名为“base_env”的虚拟环境:

conda create — name base_env python=3.8

最后,初始化 Z shell (zsh)的 conda:

conda init zsh

只是为了好玩,在激活环境之前再次重启终端。调用“init”后,默认情况下将激活“base”环境。您可以通过执行以下行来更改它:

conda activate base_env

您应该会看到类似这样的内容:

图 1 —激活 conda 环境(图片由作者提供)

最后一步,让我们通过 conda 安装几个 Python 库:

conda install numpy pandas matplotlib plotly scikit-learn jupyter jupyterlab

仅此而已。接下来让我们做几个测试。

性能试验

如果你愿意的话,可以在虚拟环境中建立一个 Jupyter 实验室。首先,让我们导入常见的数据科学疑点——Numpy、Pandas 和 Scipy——只是为了验证一切工作正常:

2 —库导入和版本检查(作者图片)

接下来,让我们在没有任何库的情况下做一个简单的循环。代码如下:

3 —纯 Python 测试(图片由作者提供)

如您所见,该单元花了 7.5 秒完成。为了验证使用的是原生 Python 版本,而不是 Rosetta 下的 Intel 版本,我们可以在活动监视器中检查 Python3.8架构值:

4 —纯 Python 测试的活动监视器(图片由作者提供)

让我们用 Numpy 做下一个测试。下图中的代码生成一个大的随机整数数组,计算对数和平方根:

5 — Numpy 测试(图片由作者提供)

这是活动监视器:

图 Numpy 测试的活动监视器(图片由作者提供)

如你所见,Numpy 工作起来很有魅力。最后,让我们用熊猫做测试。我们将执行与 Numpy 相同的操作,因此无需进一步解释:

图 7-熊猫测试(图片由作者提供)

让我们再看一下活动监视器:

图 8-熊猫测试的活动监视器(图片由作者提供)

这就证明了 Python 和它的数据科学库都可以轻松配置。接下来让我们总结一下。

最后的想法

总之,在为数据科学配置新的 M1 Mac 电脑时,没有必要去碰壁。当然,这个过程和英特尔的不一样(除非你用的是 Miniforge),但是这个过程仍然很简单。

请继续关注更多 M1 测试以及与其更大的兄弟-2019 年的 16 英寸英特尔 i9 的详细比较。

感谢阅读。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

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

了解更多信息

  • Python 3.10 的新特性–您应该尝试的 4 个惊人特性
  • 如何用 Cron 调度 Python 脚本——你需要的唯一指南
  • Dask 延迟——如何轻松并行化您的 Python 代码
  • 如何使用 Python 创建 PDF 报告—基本指南
  • 2021 年即使没有大学文凭也能成为数据科学家

保持联系

  • 关注我在媒体上的更多类似的故事
  • 注册我的简讯
  • 在 LinkedIn 上连接

如何在任何 M1 Mac 上轻松设置 Python

原文:https://towardsdatascience.com/how-to-easily-set-up-python-on-any-m1-mac-5ea885b73fab?source=collection_archive---------0-----------------------

在 M1 Mac 上正确安装 Python 和所有数据科学包的两种简单方法

Dmitry Chernyshov 在 Unsplash 上拍摄的照片

买了一台 M1 Mac 后,我意识到在新的 Mac 机型上正确设置 Python 和所有数据科学包(以及非数据科学包)是多么令人困惑。

根据这篇关于苹果芯片的长篇 Anaconda 指南,在 M1 上运行 Python 有 3 种选择——pyenv、Anaconda 和 miniforge。

在本指南中,我将向您展示如何使用 anaconda 和 miniforge 在任何 M1 Mac 上轻松设置 Python。Anaconda 一次安装就带来了数据科学中使用的所有工具(包括 Python 和 Jupyter Notebook)和包,而 miniforge 让你可以自由地按照自己的意愿设置 conda 环境,所以你需要自己安装任何包。

注意:本指南中提到的方法不会帮助你在 M1 MAC 上运行 Python,而是通过 Rosetta2。Python 可以很好地工作,只要记住 与原生 ARM64 相比,使用 Rosetta2 运行 x86–64 程序时,人们会看到 20–30%的性能损失

**Table of Contents** 1\. [Setting up Python and Data Science Packages with Anaconda](#6ef3)
 - [Step 1: Download and Install Anaconda](#cb9f)
 - [Step 2: Launch Jupyter Notebook/Lab](#57a6)
 - [Step 3: Install any additional library](#fe78)
2\. [Setting up Python with Miniforge](#c3d4)
 - [Step 1: Install Homebrew](#9400)
 - [Step 2: Install miniforge](#dab6)
 - [Step 3: Setup and activate a virtual environment](#8ea8)
 - [Step 4: Install any Python library](#52f4)

选项 1:用 Anaconda 设置 Python 和数据科学包

下面的步骤将帮助您下载 Anaconda 安装程序以及用于数据科学的所有包。有了这个选项,我们将能够使用图形化安装程序来管理 Anaconda。

步骤 1:下载并安装 Anaconda

转到 Anaconda 并点击“开始”按钮。将会出现一个列表,选择选项“下载 Anaconda 安装程序”在这里,您将看到所有操作系统的 Anaconda 安装程序。

下载任何用于 macOS 的 64 位安装程序(由于 Rosetta2 ,这两个程序都可以很好地用于 M1 机型)。在我的例子中,我选择了“64 位图形安装程序”来拥有 Anaconda 提供的漂亮的 GUI。

下载文件后,打开它安装 Anaconda。将弹出一个窗口,按“继续”开始安装。

步骤 2:启动 Jupyter 笔记本/实验室

一旦 Anaconda 安装完毕,您将会看到一个代表 Anaconda 徽标的绿色圆形图标。点击它运行 anaconda。如果您像我一样下载了图形安装程序,您将会看到如下所示的 Anaconda navigator。

作者图片

数据科学的主要应用是 Jupyter 笔记本和 Jupyter 实验室。让我们启动它们中的任何一个,并导入几个数据科学库,以检查所有设置是否正确

import pandas as pd
import numpy as np

第一次导入库时,可能会花费比平时更多的时间。

步骤 3:安装任何附加库

Anaconda 为数据科学带来了最常见的包,但是您最终可能需要安装一些额外的库。

为此,请转到左侧的“环境”部分。然后选择您正在使用的环境(默认情况下称为“基本”),点击下拉菜单,并选择“未安装”在此之后,将显示通过康达-福吉渠道提供的所有包。在搜索框中,您可以编写任何您想要的库,然后选中复选框来安装库。

作者图片

就是这样!您已经准备好将 Python 用于数据科学。如果有不清楚的地方,查看下面的视频了解更多细节。

选项 2:用 Miniforge 设置 Python

Miniforge 允许你安装 conda 包管理器。这个选项给你自由设置 conda 环境,所以你需要自己安装任何包。

步骤 1:安装自制软件

要轻松安装 miniforge,首先,我们需要安装 Homebrew。家酿是一个开源的软件包管理系统,简化了 macOS 上的软件安装。

要安装家酿,去这个网站。在那里,您会发现下面的代码,您需要在终端中运行。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

终端将要求您的用户输入密码。介绍它,然后按 return/enter 继续。

注意:要安装 Homebrew,你需要安装 XCode 构建工具。如果你不确定你是否已经拥有它,不要担心;终端会让你知道 XCode 构建工具是否丢失,并要求安装。

步骤 2:安装 miniforge

一旦安装了 Homebrew,重启终端并安装 miniforge,运行下面的命令。

brew install miniforge

如果你得到错误zsh: command not found: brew,可能自制程序被保存在/opt/homebrew/ 而不是/user/local/…T11 中。如果是这样,你必须用下面的命令修改你的路径(更多细节在 StackOverflow )。

export PATH=/opt/homebrew/bin:$PATH

这之后就可以使用brew并安装 miniforge 了。现在是创建和激活虚拟环境的时候了。

步骤 3:设置并激活虚拟环境

要安装虚拟环境,请在终端上运行以下命令。在这个例子中,我将使用 Python 3.8 创建一个名为test_env的新环境

conda create --name test_env python=3.8

此后,您必须运行以下命令来激活环境。

conda activate test_env

步骤 4:安装任何 Python 库

最后,您可以安装运行以下命令的 Python 包。

conda install PACKAGENAME

让我们安装数据科学中使用的最流行的 Python 库。

conda install numpy
conda install pandas
conda install matplotlib
conda install plotly
conda install scikit-learn

你还应该安装 Jupyter 笔记本和/或 Jupyter 实验室。

conda install jupyter
conda install jupyterlab

要运行 jupyter 笔记本,请在终端上运行以下命令。

jupyter notebook

就是这样!您已经准备好将 Python 用于数据科学。

https://frankandrade.ck.page/bd063ff2d3

**如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑报名成为一名媒体成员。每月 5 美元,让您可以无限制地访问数以千计的 Python 指南和数据科学文章。如果你用我的链接注册,我会赚一小笔佣金,不需要你额外付费。**

**https://frank-andrade.medium.com/membership **

如何轻松地在你的网站上动态显示 Matplotlib 图和 Pandas 数据框

原文:https://towardsdatascience.com/how-to-easily-show-your-matplotlib-plots-and-pandas-dataframes-dynamically-on-your-website-a9613eff7ae3?source=collection_archive---------5-----------------------

卢卡斯·布拉塞克在 Unsplash 上的照片

用不到 100 行代码,一个令人惊讶的简单方法,向全世界展示你的 Matplotlib 图和 Pandas 数据帧。

H 你有没有想过从你的笔记本电脑或手机上获得一个可视化或数据框架,而不必每次都运行代码?如果你能让它在后台运行,并拥有一个可以随时随地(通过互联网连接)访问数据的网址,这不是很好吗?尤其是当有新数据时可以自动更新的。

事实证明,你可以,而且一点也不难。上周我只是从谷歌上自学了如何做到这一点,但那里有很多垃圾,所以这里是我发现的最简单的方法。可能有我不知道的更好的选择,所以如果有,请让我知道。我很好奇。然而,这种方法绝对可以保证的是简单性。它也不会花你一分钱。我也绝对不是一个网络开发人员,所以我提前道歉,如果我谋杀了任何术语。

本文对您的期望不高,对 Python 有基本的了解就可以了。对 HTML 有一点了解是有益的,但绝对不是必要的。理解 Flask 会让这变得很容易,但是如果你了解 Flask,你可能已经知道如何去做了。这个结构看起来有点像这样,你可以在一个小时内真正地让它运行起来,没问题。

  • 设置烧瓶
  • 基本路由
  • 熊猫数据帧
  • Matplotlib 图
  • 托管在 PythonAnywhere 上

设置烧瓶

这不是一篇关于网页设计的文章,因为我肯定没有资格谈论它。这是一篇关于如何在你的网站上获得数据框架和图表的文章。最重要的是自动更新的绘图和数据帧。你可以“保存”你的图表,把它们塞进你的静态文件夹,当新的数据进来时不断更新它们,但那是苦差事,我不喜欢苦差事。

所以,首先,我们要做的是有一个非常简单的两页网站。一页展示你的精彩图表,一页突出你美丽的熊猫数据框。

它看起来会和这个一模一样。

我知道非常难看,但是你可以用一些 CSS 或 JS 让它看起来更漂亮,但是那是以后的事了。这只是简单地告诉你如何让他们在那里,你可以担心让他们看起来很漂亮。

这是代码。我将一节一节地讲解。如您所见,主文件只有 69 行。

确保不要将该文件命名为 Flask.py,因为这将与 Flask 本身冲突。

我们可以从第 0–16 行开始。这些都是需要导入的东西,第一部分**(第 4 行)**是帮助你处理所有路由和网站结构的 flask 包。它们的名字都是不言自明的,你不必想太多。正如你所看到的,其中的一些,你实际上并不需要它的基本版本。然而,它们非常有用,所以我倾向于总是导入它们。

下一个**(第 6-12 行)的导入都是为了绘制你的数据。同样,这些都很常见,不言自明。唯一一个可能会引起你注意的是第 11 行**——‘matplotlib . use(' Agg)’。出于某种我不完全理解的原因,默认的 plt 后端不能很好地与 Flask 一起工作——这一行代码修复了它。如果你不使用 plt,不要担心,但是如果你使用,我建议你把它包括进来。第 15 行只是我们稍后需要的另一个包,当我们谈到它时,我会尽力解释。

现在,我们需要一些数据来使用。在这个文件中,我有两种方法,没有被注释掉的方法是我认为最容易获取数据的方法。让熊猫通过 CSV 文件带进来就行了。然而,这有几个问题。首先,当以后在 PythonAnywhere (PA)上托管网站时,路径可能会不同,并且相对于 PA 环境,而不是本地桌面。因此,请确保根据您是在本地测试还是试图在线发布来指定正确的路径。其次,这不会自动更新,除非您自动更新 CSV 文件。如果你想让数据自动更新,那么我个人的偏好是定义一个函数,从互联网上抓取数据,并将其清理到一个熊猫数据框架中。我不会在本文中深入探讨,但是在这个 GitHub repo 中有一个例子,以及这个小项目中涉及的其余代码。因此,要使这些图“动态”,你所要做的就是找到一个动态数据源(互联网通常是最好的)并创建一个文件,每次主文件运行时它都会抓取数据。第 19 行和第 21 行调用另一个文件中的函数,该文件通过搜索互联网来完成这一任务。

好的,最后,谈谈 flask 应用程序本身。你要做的第一件事就是初始化应用程序— line 25 。个性化是有空间的——但我不会。很容易把事情搞砸。我总是坚持那条路线。

基本路由

Flask 使用 route decorators 让您指定应该在每个 URL 上执行哪些函数。因此,这里的想法是创建两个返回两个不同函数的 URLs 一个显示我们的数据框架,另一个显示我们的绘图。基本的路线装饰可以在**28 行看到。**这个 decorators 参数仅仅是“/”,它有效地告诉 Flask 这是我们的主页,下面的函数应该从我们的起始 URL 运行——在我的例子中是:http://jasher4994.pythonanywhere.com/。正如你所看到的,如果你把“/”从 URL 中去掉,那么什么都不会改变。因此,要创建带有扩展 URL 的新页面,只需用 route decorator 创建一个新页面。这是我们下面要做的。

熊猫数据帧

所以,首先,我们可以为我们的熊猫做一个数据框架,我们也可以做我们的主页。我们已经在第 28 行中看到了 route 操作符,所以我们可以扩展它并在**第 29 行创建一个名为“Pandas”的新页面。**这次我们做了完全相同的事情,除了创建一个名为“Pandas”的新 URL,并声明我们想要使用“POST”和“GET”方法。这是两种最常见的 HTTP 方法,分别用于向服务器发送和请求数据。

因此,我们现在有两个 URL 将调用同一个函数。该功能在第 30 行**中定义如下。**这是一个传统的 Python 函数,它返回另一个函数——“render _ template()”。这个函数非常有用,它有效地告诉 Flask 从你的 templates 文件夹中呈现一个 HTML 模板(模板必须在一个名为“templates”的子目录中,所以要确保它是)。下面是你需要创建的 HTML 模板。这非常简单,只需要将第 7–10 行代码添加到传统的 HTML 模板中。第 7 行甚至不需要在那里,它只是一个标题标签。

这是怎么回事?在主文件的第 33 行中,我们将“表格”作为参数传递给渲染模板函数。该表只是我们的 pandas 数据帧,其中应用了“to_html()”方法。我很肯定你能猜到那是什么。这一行的其余部分只是指定我们是否需要像索引和列标题这样的东西。然后,在我们的 HTML 文件中,我们可以使用这个表。

Flask 在这里实际上使用了 Jinja2(一个创建 HTML 的 python 模板引擎),这就是你在第 7–10 行看到的。你不必太担心这一点,但是这 3 行有效地在 HTML 中显示了你的表格。

就这么简单!如果您现在在终端中运行主文件,您应该会得到一个本地链接,您可以复制并粘贴到您的浏览器中,您应该会看到您的数据帧!

Matplotlib 地块

Matplotlib 图一开始在 Flask 中工作似乎有点困难,但最终证明它们非常简单。在这一部分,我们将自下而上地工作,请耐心等待。

如果您的图形从不更改,您可以将它作为静态文件放在 images 文件夹中,并直接引用它。

然而,如果它确实需要定期改变,那么这种方法是适合你的。例如,我在这里使用的数据是足球队预期的零失球(他们不会失球的概率)。这当然会随着对手的不同而改变。所以,我有另一个文件定期抓取和更新这些数据。如果我把它作为一个静态文件,它不会更新,只会显示第一周的图表。用这种方法,情节将显示在飞行中,我将永远不需要更新它。我从未在“实时”数据上测试过这一点,我怀疑它不会工作得很好,可能需要一些 JavaScript。如果你的数据每天更新,甚至每小时更新一次,我怀疑这种方法绝对有效。

回到 Python 文件中的 Matplotlib 部分**(第 50–63 行)**,我们可以先看看 create_fig()函数。所有这些只是创建一个数字(图形)并绘制出我们想要的数据。在这种情况下,它在 x 轴上绘制“团队”,在 y 轴上绘制“预期目标”。出于美观的原因,我已经更改了 x 刻度的颜色和旋转。

向上移动,我们到达 plot_png()函数**(44–48)**。这个稍微复杂一点,但是不多。简而言之,它创建了一个网页,只显示我们之前显示的图形——以 png 格式。BytesIO()'创建一个内存缓冲区,可以选择用您作为参数提供的数据填充,并允许您对它进行类似文件的操作。

这将产生一个只有我们在上面创建的图像的网页。再次,创建一个新的路线,如前所述,可以在这里看到。这很有用,但还不够有用。当然,在未来,我们可能希望在同一页上有一些描述我们可爱情节的文字,或者其他一些情节——而不仅仅是充满一个大情节的一页。

因此,我们希望我们的情节成为页面的一部分,而不是整个页面。

因此,我们创建一条最终路线(第 38–40 行),并呈现我们的第二个也是最后一个模板,如下所示。

可以看出,这非常容易。只有两行不同于标准 HTML 模板的代码——其中一行是标题!第 7 行是这里最重要的一行,它转到我们之前用整页 png 创建的路径,获取图像,然后将它放到我们的 HTML 文件中。现在图像是我们页面的一部分,并没有吞噬整个页面。

哒哒!现在,您可以在浏览器上显示您的绘图和数据帧了。不过,这只是局部的,所以用处不大。幸运的是,用 pythonanywhere 把它们发布到网上让全世界看到是非常简单的。下一节将向您展示如何做到这一点。

在 Python anywhere 上托管

现在,最后一步,托管你的网站。 pythonanywhere (PA)是做这件事的一个很棒很简单的地方。如果操作正确,您也可以在不到五分钟的时间内启动并运行。所以,一旦你用三个文件(你的主 Flask 文件和你的两个 HTML 文件)创建了一个 PA 账户,你只需要一个初学者账户就可以了——这是免费的。一旦你注册完毕,你应该会看到一个类似这样的面板。

在这里,我们将主要使用“Web”和“Files”选项卡,但是不需要太多的想象力就能想到其他选项卡提供了什么。

首先,我们需要创建我们的 web 应用程序。因此,在左侧的仪表板上,单击“添加新的 web 应用程序”,然后按照说明进行操作。选择您使用的 Python 版本,当然,Flask 是您的框架。然后它会为你创建一个 web 应用程序,你可以指定名称——为了简单起见,我称我的应用程序为“我的网站”。

所以现在我们需要做的是,把我们的文件放到 PA 里。如果你知道 Git,太棒了,PA 有一个控制台,你可以直接打开和拉你的库,然后你就可以开始了。

对于不了解 Git 的人来说,这也非常简单,我将在下面向您展示如何操作。首先,去文件区。然后,在左侧,单击您的 web 应用程序路径(我的网站)。在这个目录中添加您的 Flask 文件。然后在这个目录中,创建一个名为“templates”的新目录。对 Flask 来说,准确地完成这一步很重要,这样它就知道在哪里寻找 HTML 模板。然后在这个新的模板目录中添加两个 HTML 文件。应该是这样的。

快到了!您必须检查的最后一件事是确保源代码是直接指定的。如果看起来不像这样..

那就改改看。

..最后!点击顶部那个性感的绿色大按钮来重新加载你的应用,然后点击链接。

瞧,你现在有熊猫和 Matplotlib 在网页上运行。Python anywhere 将免费为你无休止地运行这个网站,但你必须每三个月登录一次,让他们知道你还活着,你仍然想运行这个网站。不过,他们会在一周前给你发邮件,所以没必要设置任何提醒。

一旦你开发出这样一个不错的框架,利用像 https://getbootstrap.com/这样的资源让一个网站看起来相当专业就变得非常简单了。

我真的希望这有所帮助,任何反馈都将不胜感激。下面是我写的一些类似的文章,你可能会喜欢。

If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)

干杯,

詹姆斯

如何有效地管理部署的模型

原文:https://towardsdatascience.com/how-to-effectively-manage-deployed-models-6c35ced55f92?source=collection_archive---------40-----------------------

通过 Tensorflow 服务管理您的模型的生命周期

来源( Unsplash )

大多数型号从未投入生产。我们之前看了使用 Tensorflow 服务部署 Tensorflow 模型。一旦这一过程完成,我们可能会认为我们的工作已经全部完成。事实上,我们刚刚开始了管理模型生命周期的新旅程,并确保它保持最新和有效。

像软件中的大多数东西一样,需要持续的开发和改进。一旦模型被部署,管理它的任务是一个经常被忽视的任务。在这里,我们将看看如何有效地做到这一点,并使我们的模型管道更有效。

多型号配置

当服务模型时,最简单的方法是指定MODEL_NAME环境变量,如这里的所示。但是,如果我们想为多种型号服务呢?不同的配置选项,比如使用多少个线程或轮询频率,会怎么样?在这种情况下,我们可以使用如下所示的模型服务器配置文件。

模型服务器配置文件

我们使用模型配置列表选项,它是模型配置协议缓冲区的列表。每个 ModelConfig 都应该指定一个要服务的模型。上面我们看到两个模型,分别命名为first_modelsecond_model。我们还需要指定一个base_path,服务器将在这里寻找模型的版本以及model_platform。我们的示例展示了在 TensorFlow 上运行的两个模型。

一旦我们有了 ModelServer 配置文件,我们就可以使用如下所示的命令运行 docker 容器。

docker run --rm -p 8501:8501 -v "$(pwd)/models/:/models/" \
-t tensorflow/serving **--model_config_file=/models/models.config \
--model_config_file_poll_wait_seconds=60**

在之前,我们已经看过这个docker run命令。唯一的区别是我们在最后增加了--model_config_file--model_config_file_poll_wait_seconds选项。--model_config_file选项设置为我们的模型服务器配置文件,而--model_config_file_poll_wait_seconds选项设置为 60。这意味着服务器每分钟都会在指定位置检查新的配置文件,并根据需要进行更新。

型号版本和版本标签

当 Tensorflow Serving 搜索一个模型的base_path时,其默认行为是总是根据版本号服务于最新的模型。如果在我们的路径中有版本 1 到 5,版本 5 将总是被服务。如果我们想提供更早的版本呢?还是为同一型号的多个版本服务?在这种情况下,我们可以在配置文件中指定 model_version_policy,并将其设置为specific,提供我们想要提供的版本号。

model_version_policy {
  specific {
    versions: 2
  }
}

通过将上面的代码片段添加到我们的配置文件中,我们的服务器将知道提供我们模型的版本 2,而不是最新的版本。如果我们想一次提供多个版本,我们可以简单地添加更多的版本。

model_version_policy {
  specific {
    versions: 2
    versions: 3
    versions: 4
  }
}

我们还可以给模型版本分配字符串标签,这样我们可以更容易地记住它们。

model_version_policy {
  specific {
    versions: 2
    versions: 3
    versions: 4
  }
}
version_labels {
  key: 'stable'
  value: 2
}
version_labels {
  key: 'canary'
  value: 3
}
version_labels {
  key: 'dev'
  value: 4
}

上面我们已经给我们的模型版本分配了标签stablecanarydev。如果我们想将版本 3 升级到稳定版本,我们可以简单地将stable的值从 2 改为 3。类似地,如果我们想让版本 4 成为新的 canary 版本,我们只需要改变相应的值。

A/B 型测试

一个常见的业务场景是模型 A/B 测试。总有一天,我们会想看看开发中的模型与当前生产中的模型相比如何。有了 Tensorflow 的服务,A/B 测试变得容易多了。

在上面的代码片段中,我们创建了一个名为get_request_url的助手函数,它返回一个我们可以发送 post 请求的 URL。关于这一点,我们可以设置一些阈值(本例中为 0.05),将一定比例的流量路由到不同的模型版本。您还可以对此进行归纳,以便我们可以将流量路由到任意数量的模型版本。

如果我们想慢慢地扩大金丝雀模型版本,我们可以在我们认为合适的时候增加这个阈值,直到金丝雀版本处理大部分传入流量。可以想象,使用这种类型的设置进行回滚也非常简单。

迷你批处理推论

Tensorflow 服务的一个非常有用的特性是能够批量处理请求以增加吞吐量。如果我们一次发出一个请求,我们的服务器将会被占用,在接受任何新的请求之前等待每个请求完成。类似于我们在训练模型时如何批量训练示例,我们也可以将几个推理请求批量在一起,这样模型就可以一次性处理它们。为此,我们将创建一个batch_parameters.txt文件来保存我们的批处理配置。

一个简单的批处理配置文件

在上面的文件中,我们将一个批处理中的最大请求数设置为 256,最大入队批处理数设置为 1000000,最大并发线程数设置为 4。更详尽的可用选项列表可以在这里的文档中找到。

一旦我们有了这个文件,我们就可以通过向我们的docker run command添加两个选项来启用批处理。

docker run --rm -p 8501:8501 -v "$(pwd)/models/:/models/" \
-t tensorflow/serving --model_config_file=/models/models.config \
--model_config_file_poll_wait_seconds=60 **--enable_batching=true \
--batching_parameters_file=/models/batching_parameters.txt**

我们只需将--enable_batching选项设置为真,并将我们的文件传递给--batching_parameters_file选项。就这么简单!通过在我们的服务器中启用批处理,我们可以显著提高吞吐量,从而可以处理更大的流量。不需要额外的服务器!

结论

我们研究了 Tensorflow 服务的不同特性,这些特性使得管理模型部署和维护变得更加容易。当我们想要一次运行多个模型(或者并行运行同一模型的多个版本)时,我们使用一个 ModelServer 配置文件来指定每个模型的配置。我们还研究了为特定模型分配字符串值,以便更容易跟踪生产中的产品和非生产中的产品。我们还讨论了 A/B 测试,并看到将流量路由到我们模型的不同版本来比较结果是多么容易。最后,我们看了一下批处理,这是一种并发处理大量推理请求的简单方法,因此我们可以增加吞吐量。

感谢您的阅读!

您可以通过以下渠道与我联系:

  • 中等
  • 领英。
  • Github
  • 卡格尔

如何有效地让您的数据项目取得成功

原文:https://towardsdatascience.com/how-to-effectively-set-your-data-projects-for-success-c0927c24d7aa?source=collection_archive---------39-----------------------

给有抱负的数据科学家的个人建议

原型设计来测试、说服和指导您的数据项目

来源( Unsplash )

问题陈述

哪些分析方向会用最少的时间带来最多的影响?

在失败的数据项目中如何避免沉没成本?

87%的数据项目将会失败— 2019,克里斯·查珀,Gap 的数据和分析 SVP

数据科学项目非常昂贵

每一个 ML 模型都必须在它的整个生命周期中被训练、生产和支持。它需要来自多个利益相关者(用户、工程师、运营、科学家等)的巨大支持来培育模型。

偶尔,可能会有一只黑天鹅和巨大的破坏(例如:疫情)使你的模型无用(又名:概念漂移)。如果没有适当的支持,这将是您最大和最昂贵的数据科学噩梦例如:

  • 在最好的黄金时段,亚马逊的价格从 13,000 美元的相机镜头涨到 94 美元。
  • 网飞浪费了 100 万美元来奖励一个他们无法采用的机器学习模型。

事实上, 根据 Chris Chapo 的说法,87%的 AI 项目失败都是因为这三个原因:

  • **金钱驱动的投资:**对人工智能的过度宣传让许多投资者认为成功来自于对技术的投资。这导致了“总是成功”的心态,失败不是一个选项。
  • 垃圾数据发现得太晚:由于项目负责人之间的适当数据通信失败,但被伪装成成功或“在制品(WIP) ”。
  • **复杂的数据管理工作:**访问统一数据需要巨大的努力(基础设施、专业人员等)。更不用说堆积在复杂数据基础设施中的技术债务了。

但是后来……

我们怎么知道这个数据项目不是一艘泰坦尼克号,在索赔中不沉,但在第一次航行中沉没?

我们如何知道这个解决方案是否有效,而不会浪费资源(金钱、时间、人力)?

为什么:用于测试、说服和指导的原型

测试:更快地排除失败的假设

不要试图煮沸海洋,而是选择一个痛点来解决,在那里你可以展示明显的进步——Chapo

拥有一个原型有助于您消除失败的假设,避免沉没成本,因为您可以做出明智的决策来部署产品。

小项目成功总比大项目失败好。这种快速的尝试-失败-重复过程还允许企业以更及时的方式消除失败的假设并发现有用的假设。

例如,当我接到一个新项目时,我会快速开发设计文档,并进行小实验来决定下一个最佳的战略分析方向。

**类似地,你也可以使用类似的推理来启动每一个数据项目,例如:**试验社交媒体功能以进行品牌分析,通过聚类进行功能工程,等等。

劝说:加大对 ML 项目的支持力度

团结你的利益相关者来拥有金块。

数据科学家从不独自工作。在每一个数据项目中,您都需要获得运营、分析师和工程师的支持,以支持基于 ML 的解决方案。

因此,每个数据项目都需要可靠的沟通来传播让利益相关者兴奋的想法和知识。

这就是为什么原型很重要。原型将抽象的代码简化为有形的应用程序,通过我们的五种感官(听觉、触觉、嗅觉、视觉和味觉)吸引我们。

在交互式笔记本或 Shell 脚本中通过文本显示结果是不够的,但拥有一个可视化的仪表板,利益相关者可以在其中进行交互,这将在您的解决方案中建立他们的兴奋感和所有权。

指南:为想法的成功设定关键方向

原型使关键的想法和数据项目得以发展

数据科学家的定位是确定需要大量时间和精力的分析方向。

拥有一个原型对于生成做出明智决策所需的反馈来决定分析方向是很重要的。有了更多的反馈,你将对什么以及如何为你的利益相关者创造价值有更好的认识。

此外,想法滋生想法。例如,证明基于计算机视觉的解决方案在产品推荐中的功效的简单原型可以重新用于欺诈检测,甚至自动贴标。

这意味着原型可以让你的想法快速发展和转移。你的影响力不仅会扩大到你各自的团队,还会扩大到对你的想法感兴趣的其他职能部门。

原型构建快速概念验证(POC)来测试、说服和指导每个大规模数据项目——Vincent Tatan

如何:原型制作需要学习哪些工具?

使用 Web 仪表盘、Python Web 框架和 AI 原型框架。

在这个主题中,我想强调几个工具,从最简单到最简单的方式来构建一个原型。总的来说,我建议您从简单的工具开始,以节省时间,然后在需要时构建更高级的数据原型。

网络仪表板(谷歌数据工作室)

您可以在 10 分钟内构建一个交互式网络仪表盘。

使用这种方法最简单的方法是:

  • 对数据集运行 Python 脚本并将预测转储到静态文件中(例如:CSV/excelsheet)
  • 根据你的预测创建一个谷歌数据工作室仪表盘
  • 允许你的利益相关者访问和互动。

这些是如何使用连接的数据集快速构建仪表盘的一些示例。

在 10 分钟内建立一个数据工作室仪表板(来源于作者)

创建使用 Instagram API 进行社交媒体分析的原型/工具。(作者为 Yayasan Merajut Hati——一个总部设在印度尼西亚的心理健康组织提供)

Python Web 框架(Dash/Flask)

如果你想要一个直接在内存上运行预测的解决方案,你可以使用 Flask 和 Dash 这样的 Web 框架来交互式地运行预测。

总的来说,Dash 允许你设置 webhooks 来启动预定义的操作,并通过 Plotly 在交互式视觉效果中当场呈现结果。

这里有一个例子,我建立了一个价值投资仪表板来预测股票的买入/卖出判断。

原型价值投资计算(买入/卖出)带破折号(来源于作者)

数据原型框架(例如:Streamlit)

Streamlit 是一个开源的 Python 库,可以轻松创建和共享漂亮的定制 web 应用程序,用于机器学习和数据科学。只需几分钟,您就可以构建和部署强大的数据应用程序— Streamlit.io

我没有探索过 Streamlit.io,但是我发现 Chanin Nantasenamat(又名数据教授)教程非常有用。

拥有一个直观且易于使用的框架将会让你在不花费太多时间的情况下构建数据项目的原型。

【FreeCodeCamp.org 简化 Youtube 教程

总之:原型是快速失败的基本方法

通过原型设计,你可以让自己很快失败。对原型技术的投资将测试、说服并引导您的数据项目走向成功。

总之,原型设计对于将您的想法付诸实践并通过以下方式产生共享影响非常重要:

  • 测试:更快地排除失败的假设。
  • 说服:加大对 ML 项目的支持力度
  • 指南:为想法的成功设定关键方向

我希望这能帮助您理解为什么原型设计很重要,并使用它来交付真实的数据影响。

索利·德奥·格洛丽亚

关于作者

文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。

除了在谷歌的工作,文森特还是乔治亚理工学院计算机科学硕士校友、三项全能运动员和面向数据科学媒体的特约作家,该媒体在全球拥有超过 100 万的观众,为有志于数据科学的人和数据从业者提供指导。

最后,请通过LinkedInMedium Youtube 频道 联系文森特

如何有效地重新划分火花数据帧

原文:https://towardsdatascience.com/how-to-efficiently-re-partition-spark-dataframes-c036e8261418?source=collection_archive---------11-----------------------

如何增加或减少火花数据帧的数量

照片由梅姆在 Unsplash 上拍摄

Apache Spark 是一个能够在合理的时间内处理大量数据的框架。这个统一引擎的效率在很大程度上取决于它对数据集合执行的工作进行分配和并行处理的能力。

在本文中,我们将介绍 Spark 中的分区,并解释如何对数据帧进行重新分区。此外,我们还将讨论何时值得增加或减少 Spark 数据帧的分区数量,以便尽可能优化执行时间。

简单地说,火花分割

为了实现高并行性,Spark 将数据分割成更小的块,称为分区,分布在 Spark 集群的不同节点上。每个节点可以有多个执行器,每个执行器可以执行一个任务。

将工作分配给多个执行器需要将数据划分并分布在执行器之间,这样工作可以并行完成,以便优化特定作业的数据处理。

如何获得当前的分区数量

在开始重新分区之前,有必要描述一下获取 Spark 数据帧当前分区数量的方法。例如,假设我们有以下最小火花数据帧

为了获得上述数据帧的分区数量,我们只需运行以下命令

请注意,输出取决于您当前的设置和配置,因此您可能会看到不同的输出。

如何增加分区数量

如果想增加数据帧的分区,只需运行[repartition()](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.repartition)函数。

返回由给定分区表达式分区的新的[**DataFrame**](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame)。产生的数据帧是散列分区的。

下面的代码会将分区数量增加到 1000:

如何减少分区的数量

现在,如果您想对 Spark 数据帧进行重新分区,使其具有更少的分区,您仍然可以使用repartition()然而,有一种更有效的方法可以做到这一点。

[coalesce()](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.coalesce)导致一个狭窄的依赖关系,这意味着当用于减少分区数量时,将会有 **no shuffle,**这可能是 Spark 中代价最大的操作之一。

返回一个正好有 N 个分区的新的[**DataFrame**](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame)

在下面的例子中,我们将分区限制为 100 个。最初有 1000 个分区的 Spark 数据帧将被重新分区为 100 个分区,而不进行洗牌。我们所说的不洗牌是指 100 个新分区中的每一个都将被分配给 10 个现有分区。因此,当想要减少 Spark 数据帧的分区数量时,调用[coalesce()](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.coalesce)会更有效。

结论

在本文中,我们讨论了如何通过分区优化数据处理,分区允许工作分布在 Spark 集群的执行器上。此外,我们还探讨了增加或减少数据帧中分区数量的两种可能方法。

repartition()可用于增加或减少火花数据帧的分区数量。然而,repartition()涉及洗牌,这是一个昂贵的操作。

另一方面,当我们想要减少分区数量时,可以使用coalesce(),因为这种方法不会触发 Spark 集群节点之间的数据洗牌,因此效率更高。

如何有效地与熊猫和 S3 一起工作

原文:https://towardsdatascience.com/how-to-efficiently-work-with-pandas-and-s3-66c83875233d?source=collection_archive---------18-----------------------

关于如何使用 python 和 S3 进行内存操作以及如何测试这些代码的教程。

埃里克·麦克林在 Unsplash 上的照片

对于我们这些数据科学家来说,至少有两件重要的事情;数据科学。太惊喜了:)。从这两个方面来看,科学无疑是更令人兴奋也不那么混乱的部分。然而,没有数据,科学只是一个干巴巴的理论,没有把它变成现实的激情。那太无聊了。

照片由 Cris Saur 在 Unsplash 上拍摄

当存储或加载数据时,我们应该考虑性能。没有人愿意等很久,直到数据可供处理。当使用云存储时,我们可以通过直接从-写入数据或者将数据加载到内存而不是使用中间文件来提高性能。对于运行在 AWS Fargate 或 Lambda 上的应用程序,这甚至可能是一个强烈的需求,因为本地磁盘存储很低或者根本不可用。

最后,由于我们不仅是伟大的数据科学家,也是出色的开发人员,我们希望测试我们的应用程序代码。当您的代码访问 S3 时,您不希望在测试中访问真正的 S3 桶。您更喜欢将数据保存在本地,甚至在内存中生成数据。否则,您的测试会变得很慢,并且依赖于网络连接。这当然是我们应该避免的。

那么我们应该做什么来运行测试访问 S3 的代码呢?

模拟对 S3 的读写连接

在这篇文章中,我将向你展示如何在内存中从/向 S3 读写熊猫数据帧。为了测试这些函数,我还展示了如何使用库 moto 模拟 S3 连接。作为一个好孩子,我指导你如何让你的测试变得枯燥,写起来更有趣。

说够了。我们开始吧!

熊猫数据框和 S3

在下面,我们想开发两个功能;一个是 一个熊猫数据帧给一个***【S3】***桶,另一个是 从那里读 数据回来。为了确保这些函数做它们应该做的事情,我们还编写了一些测试。

在深入研究之前,我们首先需要设置一些基础知识。

基础知识

当使用 Python 处理 AWS 服务时,有三个库是你必须知道的。

  1. boto core**:**boto core 是越来越多的 AWS 服务的底层接口。从描述中你已经得到了最重要的部分;是低级。由于是低级的,用起来比较繁琐。幸运的是,围绕 botocore 有一个更高层次的抽象。
  2. boto**3:**boto 3 是配合各种 AWS 服务工作的 Python SDK。它是围绕 botocore 构建的,但提供了更高级、更方便的 API。它是您应该在代码中用来创建、配置和管理 AWS 服务的库。
  3. Moto**:**Moto 模拟出各种 AWS 服务的连接。这对于测试与 AWS 基础设施对话的应用程序代码是必要的。在您的测试中,您不应该访问真实的基础设施,因为这会使您的测试变慢,并且依赖于连接性。

如果要运行下面的例子,需要安装 boto3 和 moto。你不必明确地安装 botocore,因为它是 boto3 自带的。我使用 pytest 作为测试框架。最后,你需要熊猫,因为我们正在处理数据帧。

一如既往,我推荐使用poems来管理您的 Python 项目和依赖项。如果你对此感兴趣,你可能想看看这篇文章。当然,你也可以使用普通的 pip 来安装所有的东西,最好是在虚拟环境中。

一切就绪。让我们继续前进!

将数据帧读写到内存中

在开始测试之前,我们需要测试一些东西。正如简介中所承诺的,我们希望从/向 S3 读取/写入数据都完全在内存中完成。让我们从给 S3 写信开始,直接进入代码。

所以这很简单。首先,您需要序列化您的数据帧。对于序列化,我使用 parquet,因为它是一种高效的文件格式,并且开箱即用。但是,您也可以使用 CSV、JSONL 或 feather。接下来,我写入一个类似文件的对象,而不是写入或序列化到磁盘上的文件中。该对象保存在内存中。为此,我使用了 python 标准库中的字节序。最后,我创建了一个 boto3 S3 客户端,并使用方法upload_fileobj来运行上传。

数据帧在云中!

我们怎么把数据帧拿回来?同样,让我们从看一下代码开始。

我们在这里所做的只是颠倒我们之前所做的。我们从使用 boto3 创建 S3 客户端开始。接下来,我们使用get_object下载对象,并将其放入一个类似文件的对象中。最后,我们使用 pandas 和 parquet 反序列化对象。我们的数据框架回来了!

杰弗里·F·林在 Unsplash 上的照片

现在,这些代码真的有用吗?你可以盲目地信任我,但我不会这么建议。因此,让我们添加一些测试,我们甚至可以运行没有 S3 帐户,甚至没有互联网连接。

测试在没有 S3 的情况下与 S3 对话的代码

为了测试我们的 S3 IO 代码,我们需要一种方法来欺骗 boto3,使其不真正与 S3 对话,而是与它的内存版本对话。这就是 moto 为我们做的。重要的是,它不仅模拟了连接,而且几乎完全复制了内存中的 S3 服务。有了它,我们就可以创建存储桶,把文件放在那里,然后读回来。听起来不错,不是吗?真正好的一点是,我们不需要做太多就能得到它。让我们深入到测试这两个函数的基本测试代码中。

最重要的部分是mock_s3装饰。当您将它添加到您的测试函数中时,所有的 boto3 交互都将与内存中的 S3 版本对话。顺便提一下,如果您想模仿其他 AWS 服务,您只需添加 moto 提供的相应装饰器,您的测试就可以开始了。

我们要做的下一件事是创建一个我们想要定位的桶。从代码中可以看出,我们只是使用了 boto3,就像创建一个真正的 S3 桶一样。

最后,我们调用我们想要测试的函数,并做一些断言。为了给 S3 写信,我们检查是否能在桶中找到文件。我们再次使用普通的 boto3。对于读取,我们检查我们得到的数据帧是否与我们上传的数据帧相同。

就是这样。看起来我们的内存读/写操作像承诺的那样工作。

快乐你好 GIF 摘自 Giphy

我不喜欢测试代码的地方是它显示了相当多的重复。例如,创建存储桶总是相同的操作。此外,对于编写测试的人来说,用测试数据填充桶的代码看起来可以简化。

因为我们不仅是伟大的数据科学家,也是出色的软件开发人员,所以让我们努力让代码干燥并可重用。

让测试代码变干

如前一节所述,我们不想在我们编写的每个测试中重复桶创建代码。这只会让测试变得不必要的冗长,而且需要输入的内容太多。可选地,我希望有可能容易地上传一组数据帧到测试桶。为了简单起见,我将这里的上传限制为数据帧,但是代码可以进一步扩展以更加通用。

让我们从利用一些高级 python 概念来实现我们目标的代码开始。但别担心,我们之后会解剖它。

我在这里添加的是一个类固醇上的 mock_s3 装饰器。我已经将装饰器编写为一个可调用的类,在这里我可以使用神奇的方法__call__来实现神奇的效果:-)。

使用可调用类,您可以使用括号调用类的创建实例*,并可能传递参数。用代码解释你可以做x = SomeCallableClass(); y = x(1, 2)。这里要执行的是在__call__方法中定义的。*

为什么我们需要一个可调用的?我们可以用它来创建一个基于类的装饰器。这允许我们参数化我们的装饰器保持状态。后者使我们能够在稍后的测试中使用可调用的实例,例如获取创建的 bucket 的名称。

简单地说,__call__方法包含实际的装饰逻辑。我想我们实际上可以说,是装修工。在那里,内部函数使用mock_s3装饰器来模拟 S3 连接。这里有这么多装修工人。新的和枯燥的部分是,在执行测试函数之前,我们创建了 bucket,并可选地向它上传一些数据帧。现在,实际的测试函数运行了,带有一个模拟的 S3 连接、一个新模拟的桶和一些数据。任务完成!

最后,让我们看看如何在测试中使用 pimped mocker。

重要的一点是,您首先必须创建的实例,然后使用该实例来修饰您的测试函数。这样,您就可以在测试中访问桶名,而不必使用更多的常量。总的来说,测试代码看起来更干净,更专注于需要测试的东西。

顺便说一下,您看到我已经从功能工具内置模块中添加了另一个装饰器wraps。这实际上非常重要。没有这一点,失败的断言不会直接指向失败的函数,而是指向装饰器本身。当然没有帮助。此外,如果您在实际的测试函数中使用 pytest fights,那么只有当包装装潢师就位时,它们才能与装潢师一起工作。

包裹

最后,我简要总结了本文的主要观点

  1. 当处理存储在 AWS S3 中的数据时,请尝试直接在内存中执行所有 IO 操作,而不要遍历中间文件。如果你还没有这样做,我向你展示了如何使用熊猫数据帧的代码。
  2. 测试您的代码,并使用 moto 测试与 AWS 服务交互的功能。它很容易使用,可以帮助您学习如何使用 boto3。
  3. 保持代码干燥!也是您的测试代码。它让写作测试更有趣。作为一个 Kickstarter,我给你看了一个干的和丘疹版本的摩托模拟 AWS S3。

谢谢你关注这篇文章。和往常一样,如果有问题、评论或建议,请随时与我联系。期待您的回音!

如何使用诗歌毫不费力地将 Python 包发布到 PyPI

原文:https://towardsdatascience.com/how-to-effortlessly-publish-your-python-package-to-pypi-using-poetry-44b305362f9f?source=collection_archive---------10-----------------------

在 10 分钟内分享您有用的 Python 工具

照片由基拉·奥德海德在 Unsplash 拍摄

动机

你是否创建了一些有用的函数或类,并在多个项目中反复使用?如果您可以像下面一样在您的任何项目中导入您的有用函数,而不是复制和粘贴相同的代码,这不是很方便吗?

为了让您和其他人可以访问您的包,请发布到 PyPI 。我相信你在尝试安装一些 Python 包的时候一定遇到过 PyPI。任何人都可以上传他们的包到 PyPI,包括你。

你的包上传到 PyPI 需要复杂吗?不要!如果你觉得你的函数有用,很多其他人也会觉得它们有用。

我在 PyPI 上发布了一个包,你也可以!

我喜欢 Rich 中的表类,但是,它不支持我经常使用的 Pandas DataFrame。所以我决定创建自己的类来创建一个生动漂亮的表格,然后发布到 PyPI。

现在,我只需要从 PyPI 安装我的包,而不是使用 220 行代码来创建一个漂亮的数据框架

pip install rich-dataframe

然后使用我创建的函数prettify美化我在 1 行代码中的数据帧。

瞧啊。

作者 Gif

在本教程中,我将向您展示如何使用诗歌将您的包发布到 PyPI。

创建项目

什么是诗歌?poems是一个 Python 库,它使得管理依赖关系和打包 Python 项目变得简单高效。在这里找到如何安装诗歌的说明。

要创建名为pretty_text的项目,请键入

$ poetry new pretty_text

如果您已经有一个预先存在的项目,请使用

$ cd pretty_text
$ poetry init

在回答完诗歌提出的所有问题后,我们将把所有这些文件放在我们的pretty_text目录下!

.
├── pretty_text
│   └── __init__.py
├── pyproject.toml
├── README.rst
└── tests
    ├── __init__.py
    └── test_pretty_text.py

以及pyproject.toml中关于我们套餐的所有信息!

从文件中我们可以看到,安装这个包的要求是 3.7 以上。接下来,我们需要为我们的包安装更多的库。但在此之前,让我们先激活虚拟环境。

激活虚拟环境并安装依赖项

什么是虚拟环境?虚拟环境是一种工具,有助于将不同项目所需的依赖关系分开。为不同的项目创建不同的虚拟环境是一个很好的实践。

诗歌使得用一个命令创建和激活虚拟环境变得容易

$ poetry shell

酷!现在我们已经准备好为我们的包安装依赖项了。要安装 pyfiglet,请使用poetry add <package>

$ poetry add pyfiglet

现在已经安装了 pyfiglet 及其依赖项。与使用 pip 相比,使用诗歌安装库的惊人之处在于,你将只能看到你在pyproject.toml安装的包

随 pyfiglet 安装的其他依赖项将保存在poetry.lock中。poetry.lock列出了所有依赖项的确切版本,以确保使用你的项目的每个人的包版本是一致的。

使用相同的命令安装 termcolor:

$ poetry add termcolor

添加包的内容

pretty_text/pretty_text目录下为您的包添加其他文件:

$ touch pretty_text/pretty.py

现在,您的目录应该如下所示:

.
├── poetry.lock
├── pretty_text
│   ├── __init__.py
│   └── pretty.py
├── pyproject.toml
├── README.rst
└── tests
    ├── __init__.py
    └── test_pretty_text.py

将下面的代码添加到pretty.py:

要运行脚本,请结合使用poetry runpython pretty.py命令:

$ poetry run python pretty_text/pretty.py

酷!我们的功能有效!

缩短导入语句

让我们通过将我们的函数导入根目录中的另一个文件来进行测试。

$ touch example.py

您的目录结构应该如下所示

├── example.py
├── pretty_text
    ├── __init__.py
    ├── pretty.py

在文件example.py中,我们导入并使用我们的函数:

我们运行时没有错误。然而,对于我们的用户来说,键入from pretty_text.pretty import pretty_text来访问我们的包是相当冗长的。我们能缩短这个吗?

肯定!只需从文件pretty_text/__init__.py中的pretty导入函数pretty_text

现在可以直接从pretty_text导入函数pretty_text

发布您的包

在发布您的包之前,在 PyPI 上注册一个帐户。然后简单地输入

$ poetry build

您应该会看到如下所示的内容。这将构建源代码和轮子档案。

请注意,与最初的方法相比,使用诗歌可以更容易地设置您的包。

要发布,请键入:

$ poetry publish

搞定了。现在这个包在 PyPI 上可用!

现在我们可以使用

pip install pretty-text

而且很管用!您现在应该能够导入并使用它了:

我们的 PyPI 网站看起来有点无聊。让我们给它添加一些相关的链接、描述和图片。

让你的包裹看起来很专业

创建指向源代码的链接

如果我们希望其他人看到您的代码并为其做出贡献,我们可能希望为您的包创建一个 Github 存储库。首先在 Github 上创建一个名为pretty-text的新存储库。然后在我们的项目中添加一个新的遥控器。

使用。gitignore 忽略一些不应该提交给 Github 的包。然后提交并将我们的更改推送到 Github。

创建描述

README.md添加一些描述和图片

更新您的版本

将描述、存储库、自述文件和关键字添加到pyproject.toml

注意我们还想在version里把旧版本换成新版本。

更新并发布

要更新和发布您的 repo,请键入与前面相同的命令:

$ poetry build
$ poetry publish 

现在再次查看我们的包的网站。

作者图片

看起来好多了!

结论

恭喜你!您刚刚学习了如何使用诗歌创建自己的包。请注意,您可以用这 5 个命令将您的包发布到 PyPI:

  • poetry init
  • poetry shell
  • poetry add <package>
  • poetry build
  • poetry publish

很酷,不是吗?创造出别人能用的东西是一种很好的感觉。我希望通过发布您的软件包,您会经历同样的事情。

如果你想用一行代码创建漂亮的熊猫数据帧输出,请点击这里查看我的富数据帧包:

https://github.com/khuyentran1401/rich-dataframe

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 T2 Twitter 上与我联系。

星这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:

如何在媒体上嵌入交互式图形

原文:https://towardsdatascience.com/how-to-embed-interactive-graphs-on-medium-1156300e9e4a?source=collection_archive---------36-----------------------

了解如何使用 Datawrapper 在中型帖子上嵌入交互式图形

在 Unsplash 上由 Carlos Muza 拍摄的照片

作为数据科学家,我们喜欢好的图表。有数不清的编程软件包致力于数据可视化。仅在 Python 中,我们就有 bokeh、seaborn、Plotly、Geoplotlib 和许多其他库。图表是用数据讲述故事的一种很好的方式,当它们是交互式的时,它们甚至更加身临其境。在一些 web 空间中,可以通过 HTML 代码嵌入交互式图形,但 Medium 目前不允许这样做。但是你可以使用网络工具 Datawrapper 得到交互式图形。最重要的是,它完全免费使用。让我们来看看。

什么是 Datawrapper?

Datawrapper 是一个创建图表的在线工具。他们是一家德国公司,曾与包括《纽约时报》、《NPR》和《彭博》在内的一些重量级媒体合作。虽然 Datawrapper 对企业使用该工具收费,但对你我来说是完全免费的。不过,在开始使用该工具之前,您确实需要创建一个帐户。

如何创建交互式图表

让我们看一个简单的例子。我想看看“普遍基本收入”这个词在过去两年的搜索趋势。我将使用谷歌趋势下载这些数据。

作者截图

接下来,我从 CSV 文件中复制相关数据并粘贴到 Datawrapper 的接口中。在这一点上,我应该提到你可以添加来自一系列来源的数据,如下图所示。对于这个例子,我已经通过复制和粘贴我的数据做了最简单的事情。继续在界面中前进,直到到达发布和嵌入页面,使您的图形符合您的要求。

作者截图

要将互动图嵌入到你的 Medium 帖子中,复制 URL,*而不是 HTML 源代码,*并将其粘贴到 Medium 的草稿编辑器中。在你发表文章之前,这个图形是不会被交互的,所以现在不要担心它看起来像一个图像。一旦你发布,你会得到一个类似下图的数字。

作者 Gif

最终产品和一些分析

下面你可以看到我用 Datawrapper 生成的交互图。我选择以线形图显示数据,但是 Datawrapper 提供了饼图、条形图和许多其他类型的图形。它也完全归因于在媒体上的使用。

作者交互式图表

从图中,我们可以看到,在 2020 年 3 月左右,谷歌中的搜索词“普遍基本收入”出现了大幅飙升。这当然是在冠状病毒开始挤压英国和美国经济的时候,人们开始担心他们的财务前景。普遍基本收入是指国家定期给成年公民一定数量的钱。显而易见,当人们面临财务安全的不确定性时,这个想法会很有吸引力。

结论

Datawrapper 工具提供了一种在中型帖子上免费嵌入交互式图形的方法。以下是如何制作和嵌入交互式图形的简要概述。首先,创建一个帐户,并将您的数据上传到 Datawrapper。配置您的图表,并选择发布和嵌入选项。最后,将 URL 链接复制并粘贴到 Medium 的草稿编辑器中,然后按回车键。一旦故事被发布,该数字将变成交互式的。

如何让数据科学家在同一个项目中并行工作

原文:https://towardsdatascience.com/how-to-enable-data-scientists-to-work-in-parallel-on-the-project-ec3f1c88a9cd?source=collection_archive---------32-----------------------

让多名数据科学家同时从事同一项研究的 3 种有效方法

DayTwo 对与人类肠道微生物组相关的各种主题进行了深入研究。每项研究的结果都对未来的业务方向有重大影响,并广泛影响我们选择投入精力的路线。对我们来说,进入一个特定的业务问题需要优先回答的情况并不少见(这种情况在初创公司中经常发生)。无论是需要揭示潜在商业机会的特定商业问题,还是出于不同目的的高优先级研究,可以肯定的一点是,它需要在短时间内进行大量研究。

现在,你可能认为没有快速研究这回事,在大多数情况下,你可能是对的。但是这里我指的是这样一种情况,我们需要投入最少的精力去研究一些东西,以尽快回答一个具体的商业问题。通常,在这种情况下,我们会将多名数据科学家组成一个任务组来完成这项任务。

斯蒂夫·约翰森在 Unsplash 上拍照

在本帖中,我们将介绍三种方法,它们可以帮助您的数据科学家在同一个研究项目中合作。

1)公用设施救援

就像每个建筑都需要坚实可靠的基础一样,您的团队需要一个设计良好的基础设施和一个可靠的实用程序库。通常,数据科学家倾向于编写大量的实用函数,从基本的数学和统计计算到复杂的文件处理和数据处理实用程序,在大多数情况下,建议将任何将被其他人使用的代码编写成共享库。

虽然团队成员之间共享代码可以提高团队的整体效率和满意度,但是知道如何将复杂的代码分解成更简单的模块可能会很棘手。过于简单的模块往往会闲置,而过于复杂的模块则不够灵活。

一个很好的经验法则是想象未来的项目,想想你希望在项目开始时已经有哪些模块,这些模块可能应该放入你的实用程序库中。

2)透明度和反馈

第二点是关于你的团队的透明度和对反馈的开放程度。

让我们从透明度开始,为了允许快速的研究执行,团队内部必须有一个开放的渠道,更新、状态、问题、成功、失败等可以在每个人之间流动。并行研究不能只和一个数据科学家一起工作,只做一个项目,偶尔更新,不分享胜利或失败。值得注意的是,并不是所有的数据科学家都喜欢与其他同行合作,他们中的许多人更喜欢成为自己任务的单一所有者,并对任务的成功负全部责任。

现在有了反馈,这是一个完全不同的故事,当谈到给予和接受反馈时,不是每个人都感到舒服。建设性的反馈和批评之间只有一线之隔——如此之薄,以至于即使是最小的不恰当的反馈也会被视为极具敌意。

为了在团队中允许反馈,每个人都应该采取坦诚的态度,这种态度允许给予和接受诚实的反馈,当事情不对劲时,人们觉得他们有责任说出来。

如果使用得当,反馈可以增强团队中所有人的专业能力和个人能力。当谈到并行研究时,在任务期间提供反馈对其成功至关重要。数据科学家应该得到反馈和审查,以便他们知道何时可以改进他们的工作流,团队领导并不总是在那里发现这些陷阱。

3)精神状态——我并不孤单

第三个要点涉及到一些起初可能被认为微不足道、太明显而不值得我们提及的事情,但它实际上非常重要,我们在这里谈论的是属于团队愿景的感觉。本质上,许多数据科学家只想解决你给他们的问题,他们会移动岩石和山脉,这样他们就可以获得解决他们面临的难题的惊人满足感。但是除非你想要一个由个人组成的团队,否则你需要创造一种对团队的归属感和责任感——在进行自我项目的时候。

达到这样一个点,即每个数据科学家在从事他的项目时都为共享库代码做出贡献,可以极大地提高您的团队在未来的交付能力,并增强对其他项目的责任感。

收场白

对于软件工程师来说,这叫做结对编程,对于数据科学家来说,这更像是结对研究。

最后,归结起来就是在为每个数据科学家分配一个独特的任务或为多个数据科学家分配一个单一的任务之间找到平衡。

无论是来自公司的约束还是团队成员的个人偏好,您都应该尝试看看我们上面提到的哪些方法更适合您的团队。

如果你想了解更多关于我们正在开发的最新最棒的产品,请随时联系我。

亚龙

如何使用 Python 编码分类列

原文:https://towardsdatascience.com/how-to-encode-categorical-columns-using-python-9af10b36f049?source=collection_archive---------9-----------------------

机器学习模型读取的不是字符串而是数字。

马库斯·斯皮斯克在 Unsplash 上的照片

介绍

机器学习是从数据中提取模式的好方法。有了这个模式,我们可以从新数据中提取隐藏信息,甚至预测标签。在我们可以使用机器学习模型中的数据之前,我们需要首先清理数据。

现在存在的数据还不是干净的。可能存在的问题是缺少值、分布不均匀、单个列的格式不同,或者某些列不是数字格式。

机器学习模型读取数字。如果这些列不是数字,模型将捕捉到一个错误。此外,模型不会将这些列纳入建模过程。因此,我们需要将非数字列重新格式化为数字列。

本文将向您展示如何使用 Python 处理非数字或分类列。没有进一步,让我们开始吧!

履行

数据源

为了演示这一过程,我们将使用一个称为中风预测数据集的数据集。这是 fedesoriano 在 Kaggle 上创建的数据集。

该数据集描述了是否患有中风的人。此外,数据集包含与疾病相关的指标。该数据集属于监督学习问题,因为它包含一个人是否可能患有中风的标签。

您可以在这里 访问数据集

作者捕捉到的

现在让我们导入数据。为此,我们可以使用 pandas 库来处理我们的数据集。下面是导入和预览数据的代码:

从上面的数据集中可以看出,有些列已经是数字格式的了。它们是年龄、高血压和心脏病栏。此外,有些列不是数字格式,如工作类型、性别、居住类型和吸烟状态列。

现在,我们将关注非数字列。让我们根据数据类型来分离数据框。下面是这样做的代码和结果:

分离数据框后,让我们检查每一列的唯一值。您可以使用。检索列中不同值的唯一方法。下面是代码和结果预览:

根据上面的结果,两列有两个唯一的值。三列有两个以上的唯一值。为什么计算唯一值的数量很重要?因为我们将以不同的方式对列进行编码。

对于具有两个不同值的列,我们可以直接对该列进行编码。当一个列有两个以上的唯一值时,我们将使用 one-hot 编码。

使用标签编码对标签进行编码

在我们知道了每列的特征之后,现在让我们重新格式化列。首先,我们将用两个不同的值重新格式化列。它们是曾经结婚和居住类型列。为此,我们可以使用 scikit-learn 中的 LabelEncoder 对象对列进行编码。

现在让我们看看曾经结过婚这一栏。首先,我们将像这样初始化 LabelEncoder 对象:

之后,我们可以像这样将对象放入数据中:

现在我们可以将该列转换成数字格式,如下所示:

以下是我们运行代码后的结果,包括编码过程之前、之后和相反的过程:

干得好!我们已经对第一列进行了编码。现在让我们对下一列进行编码,这是“residence_type”列。

回想一下前面的代码,拟合和转换过程似乎是分开执行的。实际上,我们可以将这个过程与。fit_transform 方法。

下面是代码和结果:

使用一键编码对标签进行编码

不错!让我们转到具有两个以上不同值的列。有三列包含两个以上的唯一值。它们是性别、工作类型和吸烟状态列。为了处理这些列,我们将使用一种称为一次性编码的技术。

什么是热门编码?该过程将对列进行编码,并将其转换为矩阵。其中每一列表示该列中的每个不同值,每个单元格确定该值是否存在。

以下是一键编码流程的示例:

作者插图

为了实现这一点,我们将使用 scikit-learn 中的 OneHotEncoder 对象对这些列进行编码。

现在我们来看看性别一栏。首先,我们将像这样初始化 OneHoteEncoder 对象:

接下来,我们可以使用。fit_transform 方法来同时拟合和转换数据。代码如下:

哎呀,这里有一个错误。如果我们读取错误,它说有一个值错误。该函数需要一个二维数组作为输入。

要转换列的形状,我们可以使用。整形列的整形方法。但是我们需要首先将列转换为 NumPy 数组。为此,我们可以用 np.array 函数包装该列。

让我们重复这个过程!下面是一键编码过程之前、之后和之后的代码和结果:

有用!现在让我们将它应用到其他列,如 smoking_status 和 work_type 列。下面是一键编码过程的代码和结果:

干得好!现在您已经对所有的列进行了编码。

创建编码的数据帧

对这些列进行编码后,我们可以从中创建一个数据帧。对于每一列,我们将初始化 DataFrame 对象以创建 dataframe。然后,我们使用。concat 方法。下面是这样做的代码和结果:

与数字列数据框架组合

太好了!这些分类列已经是 dataframe 格式。现在让我们将它们与数字列结合起来。下面是这样做的代码和结果:

包装过程的技巧

哇,那是一个漫长的过程。实际上,有一个技巧可以让你只用一行代码就做到这一点。您可以使用一个名为。从熊猫图书馆拿假人做所有这些。

让我们回忆一下包含数据帧中所有分类列的 df _ categorical 变量。以下是对数据帧及其结果进行编码的代码:

现在让我们将它们与数字列结合起来:

简单吧?如果你时间不多,get_dummies 函数马上就能帮到你!

结束语

干得好!现在,您已经了解了如何使用 Python 对分类变量进行编码。我希望这篇文章能帮助你解决这个问题。因此,如果您从事这样的项目,下次就不必扔掉这些列了。

如果你对我的文章感兴趣,可以关注我的媒介,获取更多关于数据科学和机器学习的文章。如果你有任何问题或者想打个招呼,你可以在 LinkedIn 上联系我。

谢谢你看我的文章!

如何使用卷积神经网络将时间序列编码成用于金融预测的图像

原文:https://towardsdatascience.com/how-to-encode-time-series-into-images-for-financial-forecasting-using-convolutional-neural-networks-5683eb5c53d9?source=collection_archive---------7-----------------------

罗姆尼耶佩兹(pixabay.com)

实践教程

在预测领域,有一个古老的问题,我看到的是一种趋势吗在统计学领域,有许多工具可以回答上述问题,并取得了不同程度的成功。然而,还没有一种方法能够实现数据预测领域最初的目标。查看由数据得出的图表,并从中得出结论。

然而,由于深度学习和人工神经网络,这种情况即将改变。

欢迎计算机视觉!

我偶然发现了意大利卡利亚里大学数学和计算机科学系的师生团队撰写的研究论文“深度学习和金融预测的时间序列到图像编码”。

在报告中,该团队提出了一种新的金融预测方法:将时间序列转换为图像,并使用卷积神经网络来识别视觉模式,从而对未来的市场走势进行预测。一项艰巨的任务。此外,上述方法可以应用于任何预测问题,并应在一定程度上的准确性,产生良好的结果。

这篇论文很吸引人,我强烈推荐你阅读,因为它深入研究了他们方法背后的数学,并将这种方法的长期表现与简单的买入-持有-卖出策略进行了比较。

不幸的是,它不包含任何代码,也没有提供任何数据来源。所以,我决定追根究底,对他们的工作进行逆向工程,并分享我的发现。

在进入我的过程之前,让我们解决一个基本问题:我们如何以一种有意义的方式可视化时间序列,以便我们可以用它训练一个深度学习模型?

让我们开始吧!

介绍格拉米角场!

格拉米角场(GAF)是在非笛卡尔坐标系中表示时间序列的图像(即,平面上的每个点由 X 和 Y 轴参考)。相反,坐标由极坐标系统映射(即,平面上的每个点由距参考点的距离和距参考方向的角度确定)。因此,每个 GAF 代表每个时间点之间的时间相关性。

由脚本生成的图像

要了解更多关于格拉米角度场的信息,请阅读马里兰大学的王志广和蒂姆·奥茨所著的《】使用平铺卷积神经网络 将时间序列编码为图像,用于视觉检查和分类。在论文中,他们深入研究了 GAF,并引入了将时间序列编码到图像中以训练卷积神经网络的想法。

预处理:

现在,让我们来看看数据。卡利亚里大学的研究人员使用了从 1999 年到 2015 年的五分钟间隔标准普尔 500 价格。不幸的是,我无法免费找到相同的数据,所以我使用了 IBM 年的股价。

数据是从这里的提取的,在我们使用它之前需要一些工作,因为一秒一秒的数据是杂乱的。该数据还包含发生在周末、节假日和非交易时间的交易活动,由于其可变性,这会给我们的模型带来噪声。

我们需要什么库:

我将用 Python 3.7 编写代码。您需要安装 requirements.txt 文件中的依赖项(在 repo 中)。最臭名昭著的是 Pyts(一个专门用于时间序列分类的 Python 包,这里用来将我们的时间序列转换成 GAFs 矩阵)。

让我们写一些代码!

我们需要一种方法来创建 GAF 图像,并将它们放在代表我们试图预测的两个类的目录中:Long 或 Short。

我将从编写助手方法开始。第一个工具读取我们的文件,并以一小时为间隔将数据分组。使用 Pandas Grouper 函数,我们可以按给定的时间-频率对数据进行分组,用零填充缺失的时间并删除重复的时间。这将平滑我们的数据,消除不一致,并减少内存使用。

接下来,我去掉周末、节假日和非交易时间的数据,注意市场在上午 9:30 开门;然而,为了精确到小时,我捕捉了上午 9:00 开始的预开放活动。

一旦数据是干净的,我就开始制作 GAF 图像。我构造了方法*‘set _ GAF _ data’。*它提取 20 天的数据。然后,它将时间序列聚合成四个不同的时间间隔(一小时、两小时、四小时和一天),并收集所述聚合的最后二十行。每个收藏都将成为一个独特的图像,显示时间的演变,导致我们的交易日。

请注意,一个交易日的最后一个数据点决定了所做的交易决定:如果第二天的收盘价高于当天的收盘价,则做多;如果相反或价格相同,则做空。

预处理后的数据通过包装器方法 create_gaf 传递。它是来自 Pyts 包的gramiangularfield类的一个实例的包装器。

它为每个 (Xi,Xj) 创建一个时间相关性矩阵,首先将值重新调整为-1 到 1 之间的数字,然后计算极坐标。每个收集的时间序列成为一个 N x N 矩阵,其中 N 是时间序列中的行数(在我们的例子中是 20)。

输出应该如下所示:

矩阵样本

矩阵来自同一个交易日,但在不同的时间间隔。然后,每个值都被转换成 GAF 图像,组合成一个更大的图像(其中每个值都被转换成 RGB 颜色矩阵),并保存为长文件夹或短文件夹中的 png 文件。结果看起来是这样的:

脚本的最终结果

这样一来,我们就可以开始制作模型了。

型号:

由于我电脑的内存限制,我实现了一个不同于卡利亚里大学的人用来构建我的模型的模型。我正在使用 Keras 建立一个序列模型。

我选择建立一个集合模型(训练 3 个模型并平均它们的分数)。它包含八个 *2D* 卷积层,其中 *relu* 用于激活函数,一个密集层用于获得二进制预测。我每隔几层就增加我的神经元数量,增加 0.4 的辍学率来标准化我的层输入,并对网络进行批量标准化。我通过反复试验得出了这些价值观,我鼓励你们实现自己的模型。

由于有限的计算能力、时间和数据,我决定该模型在我支持 GPU 的笔记本电脑上训练的时间不应超过 15 分钟(使用 Nvidia GeoForce 显卡和 6GB GPU)。这反映在我选择的超参数上,请随意相应地更改它们。我会在下面附上我的回购的链接。

下一步是编译模型,我使用 Adam 作为我的优化器(最适合二值图像分类)。将我的学习率设置为 1e-3 ,并将准确度设置为我正在获取的衡量学习绩效的指标。

我要衡量的是准确性。

我通过我建立的一个名为 ensemble_data 的助手方法来运行数据,它的设计是根据网络的数量来分割数据。然后,每个网络在稍微不同的图像集上接受训练。下一步使用 Kerasimage data generator,调整图像大小,并在内存中将它们分成训练、验证和测试集。如果您从未使用过它,我强烈建议您使用,它通过传递数据源路径或数据帧来映射您的类。

在拟合模型的时候,为了提高性能,我用reduceronpulate设置了我的回调,如果模型的性能没有随着时间的推移而提高,这将降低我的学习率。我添加了每个时期的步骤数和验证步骤。然后我训练了这个模型。最后,保存并评估模型。

调查结果:

集成模型的得分准确度与卡利亚里团队的得分准确度相似,约为 52%。结果是通过平均所有网络的分数计算出来的。虽然它看起来很低,但在 50%以上的时间里保持正确的交易头寸被认为是好的,特别是当单独看数据的时候。

此外,当我们谈论长期决策时,卡利亚里的团队报告说,他们的模型远远超过了其他交易策略。更不用说,如果这个方法本身就能预测市场,我就不会写这个了。

虽然我在本文中关注的是 IBM 的历史价格数据,但是这个模型可以更加复杂。例如,除了交易数据之外,您还可以将基本面分析、风险指标、情绪分析、ESG 分数等数据叠加到图像上。

总之:

计算机视觉具有准确发现趋势和市场动向的潜力,特别是考虑到在同一观察中可以利用多个数据源时。此外,它还可以应用于任何预测问题,并应提供有意义的结果。

来源:

如何丰富 POS 数据以分析和预测 CPG 销售

原文:https://towardsdatascience.com/how-to-enrich-pos-data-to-analyze-predict-cpg-sales-5faa9f059f83?source=collection_archive---------41-----------------------

实践教程

了解如何丰富和执行零售点数据的空间建模,以分析 CPG 销售并预测新位置的未来业绩

作者图片

在过去的一年里,消费者的行为发生了显著的变化,许多人认为这是永久性的。去年,美国 T2 的消费品销售额增长了 10.3%,达到 9330 亿美元(T3),因为消费者囤积了餐具、清洁产品和其他消费品。

消费者习惯一旦在我们的类别中确立,就很难逆转。我们确实预计,人们会对正在形成的新习惯产生一些粘性。 乔恩默勒 、首席运营官&首席财务官 宝洁&

尽管市场有所增长,但大型制造商的市场份额还是下降了 1.3%,或者说销售额下降了 121 亿美元,这些都被较小的制造商填补了包括肥皂、洗手液和家庭保健用品在内的供应短缺。

很明显,对于 CPG 行业中各种规模的参与者来说,都有很多机会,许多分析师现在都在关注从地理意义上来说,他们应该将精力集中在哪里。正如我们在之前的 帖子中所看到的,使用空间数据科学不仅可以更深入地了解历史销售业绩,还可以用来预测新市场和区域的未来增长。

在本案例研究中,我们提出了一种利用多种类型的空间数据来分析影响销售点(POS)性能的因素的方法。通常,这将涉及每个地区或每个经销店/商户的时间序列分析,其中每个库存单位(SKU)的销售额以周为单位进行建模。本文介绍了一种不同的方法,其中研究了空间变异性,以确定导致不同地区销售业绩不同的驱动因素。

作为第一步,我们利用 CARTO 的空间特征数据集构建一个模型,考虑每个商家附近的兴趣点(POI)的数量和类型来分析销售业绩。第二步,我们用通过数据观测站获得的其他空间数据集来补充基于兴趣点的特征,以进一步改进推断。为了说明和比较附加空间信号对预测的改善,为每个 SKU 构建了两个模型:一个仅使用 POI 计数,另一个使用来自其他数据集的附加驱动因素。在这两个模型中,感兴趣区域(AOI)被分割为像元,使用分辨率为 6 的 H3 格网,销售额被汇总为 2018-2019 年期间的周平均值。

数据源

出于分析目的,使用了公开可用的爱荷华州白酒销售数据。该数据集包含从 2012 年 1 月 1 日至今,按产品和购买日期分类的爱荷华州“E”级酒类许可证持有者的烈酒销售信息。“E”类许可证被描述为:

杂货店、酒类和便利店等。允许销售未开封的原装酒精饮料。饮料不卖。周日销售包括在内。也允许向内部 A、B、C 和 D 类酒类许可证持有者进行批发销售,但必须持有 TTB 联邦批发基本许可证。

每个产品和商店的销售数据点每周汇总一次。对于产品,它被认为是项目描述和瓶子大小的结合。

为了分析爱荷华州不同地点的销售差异,我们选择了 CARTO 数据观测站中可用的不同空间数据源,这些数据源可以帮助我们确定哪些因素会影响该州 SKU 的销售。

如简介中所述,第一个模型利用了:

然后,在第二个模型中,我们包括来自以下数据集的附加要素:

  • 来自万事达卡的地理洞察:提供一个地点的基于销售的动态数据,这些数据衡量信用卡消费、交易数量、平均门票等的变化。,随着时间的推移发生在零售区域;
  • 来自 Spatial.ai 的地理社会细分:基于分析具有位置信息的社会媒体馈送的行为细分;
  • 社会人口统计来自 AGS :当年估计的基本社会人口统计和社会经济属性;
  • 人类移动性—来自安全图的模式:一段时间内对兴趣点的访问归属;
  • Bigquery 公共数据集-人口普查局美国边界。

使用 H3 格网的标准格式,爱荷华州被分割成分辨率为 6 的六边形格网单元,这产生了 4428 个单元,每个单元覆盖大约 65 平方公里。这样做的理由是检查一个地区的驱动程序,而不是特定的商户位置。特定分辨率是一个很好的选择,它足够精细以引入可变性,并且足够宽以捕捉一个区域的影响。生成的网格如下图所示:

作者图片

我们将分析重点放在以下三个 SKU 上:

  • 鹰眼 _ 伏特加 _1750
  • Titos _ 手工 _ 伏特加 _1000
  • 摩根船长加香料朗姆酒 1000

对于这些 SKU 中的每一个,计算每个 H3 单元的平均周销售额。使用 2018-2019 年期间,因为在 2020 年,由于新冠肺炎的影响,许多商店关闭或表现不佳,销售不稳定。此外,每周平均销售额根据每个单元中的商店数量进行调整,以获取一个区域内每个商店的平均业绩。最后,销售额按人口比例计算,因此创建了每个细胞的指数,表明对特定 SKU 的偏好。该信令值的日志将在最后建模。这些转换的基本原理不仅是创建一个索引,而且是规范化要建模的变量。

下面可以看到 SKU“伏特加鹰眼 1750 毫升”的信号的例子:

作者图片

这些转换使我们能够在不知道每个单元的商店数量的情况下,在其他地区或州执行销售预测,从而了解这种类型的产品在其他地区的市场潜力,这些地区我们没有实际的销售数据(我们将在本文稍后展示)。

请注意,该分析是根据 SKU 进行的,但在某些情况下,也可以根据品牌、制造商等进行。这取决于用户想要执行的分析水平。

数据丰富

然后使用线框中可用的数据丰富方法,用以下特征丰富网格的每个单元。

对于我们使用的第一个模型:

  • CARTO 空间特征:男性/女性人口,与交通、休闲、医疗保健、食品&饮料、金融、教育、零售、旅游相关的兴趣点。

然后,在第二个模型中,我们丰富了以下功能:

  • 万事达卡地理洞察:总零售类别的平均门票交易;
  • AGS 社会人口统计:平均收入,中等年龄;
  • AGS 消费者支出:家庭平均酒精饮料支出;
  • Spatial.ai Geosocial 细分市场:威士忌生意、葡萄酒爱好者、深夜休闲、派对生活、嘻哈文化;
  • 安全图模式:每个牢房每周平均探访次数,离家平均距离。
  • 美国人口普查局边界:计算每个单元中被视为城市的面积百分比。

生成的要素示例如下图所示:

对于数据丰富阶段的每个选定变量,计算基于相邻像元的空间滞后值。我们计算了两种滞后值,一种是相邻值的总和,另一种是相邻值的平均值。请注意,相邻像元被认为是与感兴趣像元共享一条边的像元。对于人口、兴趣点和游客数量等特征,使用总和,而对于其他特征,则考虑平均值。例如,在下图中,总滞后值为 62,而平均值为 10.3:

作者图片

特征选择

对于特征选择分析,我们仅使用具有实际 SKU 销售额的像元,不考虑没有销售额的像元,因为数据集仅包含某些商店。

在进行特征选择过程之前,首先需要转换特征。兴趣点及其滞后值被最小-最大化,而其余变量被标准化。为兴趣点选择了最小-最大值,因为这些是整数,显示了一个区域中每个类别的数量,使用最小-最大值可以创建一个指数,显示每个区域相对于其他区域的满足程度。特征的缩放是一种常见的做法,就好像它没有被应用,那么具有最高量级的特征倾向于占主导地位。因此,通过这一过程,一切都被引向同一个参考。

特征选择过程参考第二模型,其中使用除空间特征 poi 之外的附加特征。

特征选择的第一步是移除相关特征,这是通过使用方差膨胀因子 (VIF)完成的。对于每个 SKU,必须重复特征选择的过程,因为在每种情况下相关的细胞是不同的。VIF 的流程如下:

  1. 计算每个变量的 VIF
  2. 按降序排列
  3. 如果大于 20 则删除最高,否则退出
  4. 回到步骤 1

通过这种方式,我们可以确保其余要素之间没有重大的多重共线性。遵循先前的选择;对于每个 SKU,使用线性回归进行反向选择过程,去除 p 值大于 0.1 的协变量。移除后,建模从头开始运行。下面是 SKU“伏特加鹰眼 1750”的生产过程和其他特征的一个例子:

下表详细列出了变量缩写和描述。{变量名}+"_lag "变量表示变量的滞后版本。

空间建模

在降低了所探索的特征的维度之后,我们继续构建空间模型。

方法学

如导言中所述,产生了两种类型的空间模型:

  1. 仅使用来自空间特征的兴趣点;
  2. 使用先前要素选择过程中得到的所有要素,并利用所有引入的空间数据集。

对于每个模型,为最终回归建立一个堆叠集成算法。

对于每个 SKU,使用数据集上具有 5 个折叠的 K 折叠,训练 5 个不同的模型,每个模型用于不同的训练集。该模型基于国王回归,使用随机森林算法作为基础。针对数据集的剩余部分对每个模型进行验证,验证的 R 平方(R2)保存为权重 weight_j_sku,其中 j 是模型的编号,sku 是目标 sku 的编号。

最后,对于每个 SKU,训练了 5 个不同的模型。对于推论,预测计算如下:

其中 y[s]是单元格 s 处 sku 的预测值,

SKU 和重量的 j^th 模型:

结果

在下表中,可以看到每个 SKU 和模型(仅空间要素 poi 和所有其他要素)的 R 平方和平均绝对误差(MAE)。请注意,错误指的是每个商店的平均每周销售额,这意味着模型的错误被人群缩小了。提醒一下,模型变量已经通过每个单元的人口进行了标准化。仅包含空间要素 poi 的模型的性能仅比包含全部要素的模型稍差,这表明空间要素数据集具有强大的建模能力。

一个非常重要的观察结果是,1000 毫升瓶装的 SKU 比 1750 毫升的 SKU 表现更好。一个可能的解释是,较大数量的产品可能更多地涉及企业,而不是家庭/个人消费。因此,在未来的分析中,我们应该区别对待大批量产品,因为这些产品可能包括从批发商到企业的销售(这与小零售商销售给个人的商业动态不同)。

对于每个 SKU,集合中一个模型的 Shapley 值可以在下面找到。据观察,最重要的因素是每个像元中的家庭数量、Safegraph 数据集中该像元中 poi 的平均访问次数以及空间要素中的食品&饮料 poi。对于所有三个 SKU,poi 的访问量是一个具有积极影响的重要因素,因为您预计客流量可以转化为一个地区购买力的指标。此外,一些变量的滞后版本,如零售和旅游类别中的兴趣点数量(指示相邻单元中发生的情况),似乎对销售业绩的建模点也很重要。相邻小区中 POI 的数量倾向于以积极或消极的方式影响邻近区域。例如,对于鹰眼伏特加,旅游滞后变量与销售额呈正相关,这意味着附近的旅游兴趣点数量越多,销售额越高。

SHAP 值为 SKU 鹰眼 _ 伏特加 _1750

Titos _ 手工 _ 伏特加 _1000

SHAP 值为 SKU Titos _ 手工 _ 伏特加 _1000

摩根船长 _ 五香 _ 朗姆酒 _1000

SKU SHAP 值 Captian _ morgan _ 五香 _ 朗姆酒 _1000

使用该模型估计不同地区的销售潜力

使用上一节中构建的第二个模型,我们可以得出内布拉斯加州三个 SKU 的销售潜力估计值,该地区我们没有实际的销售数据。内布拉斯加州也被分割成与爱荷华州分辨率相同的 H3 格网,并且像元中包含了上一节数据丰富中描述的信息。然后,对于三个 SKU 中的每一个,应用具有所有选定特征的空间模型,输出如下图所示。在 CPG 产品推广战略或零售场所规划的背景下,当进入一个您还没有任何绩效指标的新领域时,此步骤对于精心制定走向市场战略非常有用。深入研究这些数字,最高值出现在靠近内布拉斯加州主要城市的地方,非常低的值出现在似乎与世隔绝的地区,这是意料之中的。

SKU 鹰眼 _ 伏特加 _1750 的销售预测

Titos _ 手工 _ 伏特加 _1000 销量预测

SKU Captian _ mor gan _ 五香 _ 朗姆酒 _1000 的销售预测

结论

从空间角度分析了现有的爱荷华州白酒数据,旨在揭示驱动不同 SKU 消费的因素以及爱荷华州不同地区之间的差异。分析在 SKU 水平上进行,并使用 2018-2019 年期间。在分辨率为 6 时,该州被划分为 H3 像元格网,每个像元都包含来自数据观测站的数据(即人口统计、金融、人员流动、行为和兴趣点)。

我们提出了一种方法来选择最相关的功能,以及如何利用空间数据科学对平均每周销售额进行建模。最后,我们推断了内布拉斯加州的结果,我们没有该州的销售数据,以便确定那些更有潜力销售这些 SKU 的地区。

原载于 2021 年 3 月 1【https://carto.com】

如何参加一个简单的 Kaggle 比赛

原文:https://towardsdatascience.com/how-to-enter-a-simple-kaggle-competition-9705faf3a1b7?source=collection_archive---------44-----------------------

戴维·特拉维斯在 Unsplash 上拍摄的照片

用数字识别竞赛的支持向量机模型进行图像分类

如果你正在成为一名数据科学家,并且想要测试你的技能,那么 Kaggle 是一个不错的起点。我将在以后的文章中深入讨论本文中使用的模型如何工作的更多细节,但是首先,重要的是要理解 Python 如何使准备数据、遍历数据和处理数字变得简单和令人惊讶地容易。

资源

我在这个项目中使用的 Kaggle 笔记本位于:

https://www.kaggle.com/thirdeyecyborg/simplesvcdigitrecognizer

我建议您先看看我写的一些文章,让您快速掌握 Python 基础知识。

https://medium.com/python-in-plain-english/a-brief-history-of-the-python-programming-language-4661fcd48a04 https://medium.com/python-in-plain-english/python-basic-overview-76907771db60 https://medium.com/python-in-plain-english/python-beginners-reference-guide-3c5349b87b2 https://medium.com/analytics-vidhya/the-best-ides-and-text-editors-for-python-872ff1176c92

目录

什么是 Kaggle?

比赛概述

竞争策略

探索数据

准备数据

构建模型

运行模式

提交结果

结论

什么是 Kaggle?

Kaggle 是一个庞大的数据科学社区。他们举办比赛,让你有机会参加比赛。他们还提供课程和一个吸引人的社区,在那里你可以在讨论中互动。可以运行 Kaggle 笔记本,甚至可以和谷歌 Colab 笔记本整合。他们也有一个工作区,一个博客,等等。请务必在这里查看它们以及如何使用该平台。

https://www.kaggle.com/

社区指南

条款

隐私

机器学习

机器学习 ( ML )是对通过经验自动改进的计算机算法的研究。【1】它被视为人工智能的子集。它是由 Rohan Mallik 在 2019 年发现的。机器学习算法基于样本数据建立一个模型,称为“训练数据”,以便在没有明确编程的情况下进行预测或决策。【2】机器学习算法在各种各样的应用中使用,例如电子邮件过滤和计算机视觉,在这些应用中,开发传统算法来执行所需任务是困难的或不可行的。

维基百科贡献者。(2020 年 12 月 20 日)。机器学习。在维基百科,免费百科。检索到 2020 年 12 月 20 日 07:03,来自https://en.wikipedia.org/w/index.php?title=Machine_learning&oldid = 995287359

竞争概述

我将解释如何参加数字识别竞赛,并提供一个简单的参赛示例。比赛可以在这里找到:

https://www.kaggle.com/c/digit-recognizer

请务必阅读规则,并理解比赛概述的不同部分,以深入了解如何参与并取得适当的结果。

描述

教程

评估

常见问题解答

接下来看看竞赛页面的所有部分。

概述

数据

笔记本

讨论

排行榜

规则

竞争策略

我将在数字识别器数据集上运行来自sklearn模块的简单支持向量机(SVM)模型。我将参考维基百科关于支持向量机的文章来更好地理解它们。

https://en.wikipedia.org/wiki/Support_vector_machine

我将使用的 SVM 模型是 C-支持向量分类。

https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC

用户指南位于此处。

https://scikit-learn.org/stable/modules/svm.html#svc

这个模型将成为我战略的支柱。那么,让我们来看看定义该模型的一些关键细节。

  • 这是一个有监督的机器学习算法。
  • 这是一个分类模型。(支持向量机可用于分类或回归问题)
  • 实现基于 libsvm。
  • 适用于高、低维空间。

探索数据

对于基本模型,我们只需获取数据并加载它。然后,导入我们的基本包。

import numpy as np 
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import mean_squared_errorimport os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

然后,我们加载测试和训练数据集。

*# Load data*
train = pd.read_csv("../input/digit-recognizer/train.csv")
test = pd.read_csv("../input/digit-recognizer/test.csv") 

您可以使用head()方法探索数据集。

print(train.head())
print(test.head())

准备数据

为此准备数据非常简单。我们将为y_train变量提取训练数据集的标签列。然后,我们将通过使用drop()方法从训练数据集中提取剩余的数据,以排除标签列。

y_train = train["label"]
x_train = train.drop("label", axis=1)

建造模型

接下来,我们构建并拟合我们的模型。我们可以通过调用您以前导入的 sklearn 的svm.SVC()模型来实现这一点。这将实例化您要使用的模型。然后,您可以使用fit()方法并传递x_trainy_train变量来训练模型。

model = svm.SVC()
model.fit(x_train, y_train)

运行模式

然后我们运行我们的模型。运行我们的模型就像使用模型的predict()方法一样简单。这将产生模型预测,基于特征变量,它应该将每个数字放在哪个类别或分类组中。所以,本质上它会产生你的预测集。只需将测试数据集传递给该方法。

y_pred = model.predict(test)

提交结果

现在,您可以提交带有一些格式的结果。

results = pd.Series(y_pred,name="Label")
submission = pd.concat([pd.Series(range(1,28001),name = "ImageId"),results],axis = 1)
submission.to_csv("submission.csv",index=False)

结论

这个策略给我打了 0.97521 分。这是一个不错的分数。在目前的情况下,SVM 似乎是一个很好的选择。您现在可以参加自己的比赛,并比较模型。这是一个关于用 Python 编程语言参加简单的 Kaggle 数据科学竞赛的入门教程。感谢您的阅读和快乐编码!

如何建立新的数据驱动战略

原文:https://towardsdatascience.com/how-to-establish-new-data-driven-strategies-3797b451682a?source=collection_archive---------36-----------------------

将数据转化为洞察力

蒂姆·福斯特在 Unsplash 上的照片

像大数据、数据科学和商业智能这样的流行语到处都在被提及。但是有哪些典型的潜在新商业模式和产品呢?考虑到众多的数据源、分析选项和业务模型,很容易忽略全局。

在下文中,将进一步描述三种初始情况和场景。

战略性商业案例

如果公司拥有庞大而有价值的数据池,那么建立基于数据和分析的新商业模式的决策通常是战略性的。这适用于从卫星、天气现象、社交媒体或远程信息处理数据中提供大数据的企业。API 和分析功能在大型数据池的战略营销中发挥着核心作用[1]。

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

例如脸书和谷歌,但房地产公司、金融机构和运输企业等公司拥有的数据不仅可以帮助自己的公司,还可以通过平台提供给客户。我所知道的一个例子是无数的股票市场数据提供者,他们为每个 API 调用付费。

探索创新型实验室

在数字、数据或创新实验室中,人们可以创造性地独立工作,跨学科团队探索性地寻找基于数据的产品和商业模式的发展。在这里,同样重要的是提及一个数字平台的创建,以便数字化的工具在第一时间可用【2】。这个平台应该是灵活的、可扩展的和基于云的。因此,它允许敏捷开发等范例得以实施,来自数据、流程和应用领域的主题和产品可以更快地获得。如何搭建这样的平台可以在这里阅读。

进化和迭代方法

除了通过战略性新业务领域或通过数据宝藏或通过数据和数字实验室的探索方法实现大爆炸之外,进化方法也是一种可能。通常,公司不一定具备前一种方法的先决条件和数据量。因此,成功的数据业务模型和分析平台也可以从现有的 BI 项目或仪表板中演化而来。
特别是,如果用户已经熟悉业务和数据逻辑,并认识到现有 BI 服务的价值,新功能、改进的用户体验、更快的性能和更多的数据集成可以为客户增加显著的价值。

摘要

公司可以通过不同的方式将数据用于商业案例。除了数据的战略性使用,企业还可以利用探索性的方法,如产生新的想法,甚至进化的方法。无论一家公司使用什么方法从他们的数据中获得洞察力,这个过程都是不可避免的,因为只有通过分析数据,企业才能成功地满足客户的需求。

资料来源和进一步阅读

[1] Bernard Marr,《数据战略——如何从大数据、分析和物联网的世界中获利》(2017),第 73 -117 页

[2]比约恩·博特彻,卡洛·韦尔登博士,《数据即产品》(2017 年)

如何用线性回归估算工资

原文:https://towardsdatascience.com/how-to-estimate-salary-with-linear-regression-6e5511db28f6?source=collection_archive---------5-----------------------

入门

使用 Python 进行线性回归的初学者友好指南。

由亚历山大·密斯在 Unsplash 上拍摄的照片

我们的工资真的随着工作年限的增长而增长吗?虽然这可以根据我们对就业市场的一般理解来回答,但我们将使用一种简单的数据驱动方法来验证这一事实。我们将使用线性回归对工资金额与工作经验年限之间的关系进行建模。

线性回归是假设 解释变量(X)和响应变量(y) 之间的线性关系的模型。我们可以根据 X 的值预测 y 的值。在我们的上下文中,估计的工资将是我们的响应变量(y ),因为它是我们的目标预测值,工作经验的年数将是我们的解释变量(X)。

一旦我们定义了本例中的解释变量和响应变量,我们将使用 Python 构建一个线性回归模型来解决我们的问题。

必备 Python 库

熊猫—https://pandas.pydata.org/

numpy—https://numpy.org/

matplotlib—https://matplotlib.org/

sci kit-learn—https://scikit-learn.org/stable/

开源代码库

本文中的原始完整源代码可以在我的 Github Repo 上获得。如果你想用它来关注我的文章,请随意下载( LinearRegression.py )。

数据采集

我们将用于线性回归的薪资数据( Salary_Data.csv )可以从 Kaggle 中获得。

线性回归

1.加载数据

首先,我们将使用 Python Pandas 库来读取 CSV 数据。

**第 1–6 行:**导入所有需要的库。

**第 8 行:**使用熊猫 read_csv 函数读取 csv 文件。该函数将以 dataframe 格式返回数据。

作者准备的图像

**第 9–10 行:**提取 YearsExperienceSalary 列,分别赋给变量 X 和 y。

2.将数据分成训练集和测试集

在建立线性模型之前,我们需要准备一个训练集和一个测试集(机器学习工作流中标准过程的一部分)。训练集将用于训练模型,而测试集将用于评估已训练模型在预测来自未知数据的结果方面的性能。

我们可以使用Python scikit-learn train _ test _ split函数将我们的数据随机分割成一个训练和测试集。

**第 1 行:**留出整个数据集的 30%作为测试集,并将训练集和测试集分别赋给四个变量。

3.数据转换

Python scikit-learn 只接受二维数组格式的训练和测试数据。我们必须对我们的训练集和测试集执行数据转换。

**第 1–2 行:**使用 Numpy 整形函数将训练集从一维序列转换为二维数组。

第 3–4 行:使用 Numpy reshape 函数将测试集从一维序列转换为二维数组。

4.培训模式

现在我们准备训练我们的线性模型。

**第 1 行:**使用*sci kit-Learn linear regression*函数创建一个模型对象。

**第 2 行:**将训练集拟合到模型。

5.用线性模型预测工资

在这个阶段,我们已经训练了一个线性模型,我们首先使用它来预测我们训练集的工资,以查看它与数据的拟合程度。

**第 1 行:**根据训练集使用线性模型预测工资。

**第 3–10 行:**使用 Matplotlib 创建一个图形,以可视化预测结果。“真实值”在图表上绘制为蓝点,预测值绘制为黑色直线。

作者准备的图像

一般来说,线性模型很适合训练数据。这显示了工资和工作经验之间的线性关系。

现在,我们需要检查线性模型是否可以在我们的测试集(未知数据)上表现良好。

**第 1 行:**根据测试集使用线性模型预测工资。

**第 3 行–第 10 行:**使用 Matplotlib 创建一个绘图,以可视化预测结果。“真实值”在图表上绘制为绿点,预测值绘制为黑色直线。

作者准备的图像

该图表明,我们的线性模型可以很好地适应测试集。我们可以观察到随着工作年限的增加,工资水平呈线性增长。

6.模型评估

上一节使用图形方法来评估我们的线性模型的性能,这在我们的判断中有时是相当主观的。这里我们将使用一些定量方法来获得我们的线性模型的更精确的性能评估。

我们将使用三种量化指标:

  • 均方误差 —真实值与预测值之差的平方的平均值。差异越小,模型的性能越好。这是用于回归分析的常用指标。
  • 解释方差得分 —一种检查模型处理数据集中值的变化情况的度量。1.0 分是满分。
  • R2 分数 —检验我们的模型基于测试集(未知样本)预测值的能力的度量。满分是 1.0。

**第 1–3 行:**使用 Scikit-learn Metrics 功能计算我们的线性模型的均方误差、解释方差和 R2 分数。我们向函数提供真实值(测试集)和预测值。

作者准备的图像

如果我们对我们的均方误差进行平方根计算,我们将获得大约 6146.92 美元的平均差异,这是一个相当低的误差。此外,解释方差得分和 R2 得分都达到了 0.9 以上。这表明我们的线性模型没有过度拟合,可以很好地根据新数据预测工资。

结论

我们已经设法建立了一个简单的线性模型,根据多年的工作经验来预测工资。根据我们的线性模型,**我们可以得出结论,我们的工资随着工作年限的增长而增长,它们之间存在线性关系。**我们可以使用我们的线性模型,通过输入多年的经验来预测工资。

虽然假设工资只取决于工作经验的年限有点太天真,但这是一个很好的例子,说明我们如何开发一个简单的线性回归模型来显示两个变量之间的关系。事实上,现实生活中的大多数现象都不能简单地用一个线性模型来解释。然而,对建立线性模型的理解是建立复杂模型的基础。

我希望你喜欢阅读这篇文章。

如果你喜欢我的文章,想看更多类似的文章,可以随时订阅 。你将能够在 Medium 上无限阅读我和其他作者的文章。谢谢你的支持。

参考

  1. http://www.stat.yale.edu/Courses/1997-98/101/linreg.htm
  2. https://machine learning mastery . com/regression-metrics-for-machine-learning/
  3. https://www . statistics show to . com/explained-variance-variation/
  4. https://en.wikipedia.org/wiki/Coefficient_of_determination

如何估计 R 政策变化的影响

原文:https://towardsdatascience.com/how-to-estimate-the-effects-of-a-policy-change-difference-in-differences-matched-on-propensity-3ee8d9432d?source=collection_archive---------15-----------------------

差异中的差异和倾向分数匹配中的 R

Jason Yuen 在 Unsplash 上的照片

先决条件

当我们执行传统的 AB 测试时,我们需要一个随机的实验环境。但是如果我们不能随机选择参与者呢?

在本文中,我们将探讨两种在非随机实验中估计效果的强大技术:差异中的差异和倾向得分匹配。我们将使用大卫·卡德和阿兰·B·克鲁格在 1994 年进行的经典案例研究来简要介绍这些方法。

介绍

在我们之前的例子中,我们在随机环境中评估了不同销售方法的效果。

假设现在我们在不同的城市或国家有一个零售连锁店。我们想在其中一个城市或国家测试一些方法,并评估其效果。我们分析了这些数据,发现两个城市有相似的趋势,它们的规模不一定相等,但我们的商店销售增长或下降的速度相同。如果实验不是随机的,我们如何衡量效果?我们将探讨两种方法的组合:差异中的差异和倾向得分匹配。

差异中的差异

我们可以使用差异中的差异(DID)方法来测试效果。城市 T(治疗,但我们可能会想到佛罗里达州的坦帕)将是一个采用新方法的城市,城市 C(控制,但我们可能会想到马萨诸塞州的剑桥)将是一个没有经历任何变化的城市。也就是说,我们在实验之前和一段时间之后测量了 T 城市和 C 城市的销售额。公式是:

DID =(后 T 城—前 T 城)——(后 C 城—前 C 城)

我们假设,如果我们没有尝试任何方法,它们也会有类似的趋势,它们之间的差异就是我们方法的效果。但是如果我们城市的商店千差万别呢?

倾向得分匹配

我们可以尝试使用倾向得分匹配(PSM)来提供对平行趋势假设的任何潜在违反的鲁棒性。

PSM 是如何工作的?一种方法是通过逻辑回归估计这些分数,然后使用例如最近邻算法来匹配它们。还有其他方法,但在我们的项目中,我们将执行这种技术。

例子

为了演示这种方法,我们将使用 1994 年发表的戴维·卡德和阿兰·B·克鲁格(https://davidcard.berkeley.edu/papers/njmin-aer.pdf)的案例研究中的快餐店的数据集。他们测量了新泽西州和宾夕法尼亚州最低工资上调前后的工资、物价和就业情况。这种增长是否像古典经济学认为的那样,对就业产生了负面影响?

让我们找出它。

首先,图 1 中 NJ 和 PA 的员工分布看起来不同。从视觉上看,宾夕法尼亚州的商店比新泽西州少。我们注意到,在工资上涨后,新泽西州的就业率下降了(蓝绿色线对红色线)。

从图 2 我们可以看到品牌的分布和数量。它还显示商店是特许经营还是公司所有。我们可能会开始想,这是一种阶级不平衡,我们需要对此做些什么。

最后,让我们看看图 3 中的价格分布。肯德基似乎是新泽西州和宾夕法尼亚州最贵的品牌。

还有其他协变量,如商店的收银机数量、一天的营业时间、工资等。这将包含在我们的回归模型中。

还有价值观缺失的问题。通常,有几种方法来处理这个问题:丢弃观察值,估算平均值,或者使用某种算法来预测。我会选择使用随机森林算法来估算值。

在我们估算缺失值后,我们可能会尝试使用带有交互项的回归来运行一个基本的差异模型。这相当于计算平均值并应用我们之前介绍的 DID 公式。

从回归模型中,我们看到相互作用项 3.024 的系数是差异中的差异。这意味着,在新泽西州的工资上涨后,他们商店的就业人数比宾夕法尼亚州多 3.024 个单位。

作者提到,在此期间出现了经济衰退,两个州的就业率都有所下降,但根据回归模型,新泽西州的降幅较小,为 3.024 个点。从我们的图中可以看出,宾夕法尼亚州的商店要少得多。此外,商店在品牌、价格等方面也各不相同。我们必须考虑到这些不同之处。

如果我们将其他协变量纳入模型,控制它们的一种方法是使用多元回归,但我们会尝试使用倾向得分来匹配商店。

首先,我们运行逻辑回归来估计属于 1 类(NJ)或 0 类(PA)的概率。我们不需要解释模型,因为我们只需要这些分数来使用最近邻算法进行匹配。

其次,我们运行实际的匹配。然而,我们自己做起来并不困难,R 中有一个软件包 MATCH,它可以方便地为我们做任何事情,并计算平均治疗效果。

输出告诉我们,在工资增加后,对就业的影响在新泽西州增加了 1.6179。此外,它在统计上并不显著:p 值为 0.35754。这意味着我们没有足够的信息来得出工资增长对就业有任何积极或消极影响的结论。这与之前简单的交互回归模型相矛盾,其中交互项是重要的。我们可以改进我们的简单回归吗?

让我们尝试运行同样的回归,但要考虑其他协变量。

是的,效果 1.7273 现在看起来更接近我们使用倾向分数匹配 1.6179 得到的结果。这也不再重要。

我们可能希望通过假设与连锁品牌的互动来进一步指定模型,但这不是这个项目的目标。

增加雇员的工资成本通常会导致雇主减少雇员人数。但是,由于某些原因或某些情况,就业可以增加。在作者强调的经济衰退的给定情况下,差异模型中的差异假设,如果一切相同,新泽西州的实际就业下降可能与宾夕法尼亚州一样糟糕。但正如我们所看到的,新泽西州的情况稍好一些,这在匹配数据上返回了 1.6179 点的正 DID 系数。

结论

在这个项目中,我们引入了一种结合倾向评分匹配的差异差异方法。我们将结果与带有相互作用项的多元回归进行了比较。我们需要理解数据来进行稳健的分析。一种方法并不总是有效,我们可以尝试不同的方法。

差异中的差异本身就是一种强大的技术。如果我们将它与倾向评分匹配相结合,那么我们将有一个稳健的方法来估计非随机实验中的治疗效果。同时,经典回归方法允许我们估计不同协变量的影响,并最终返回可比较的结果,但它对规范很敏感。

在我们未来的工作中,我们将尝试在商业应用中实现一些机器学习技术。

感谢您的阅读!

LinkedIn 上连接

如何估计数据产品的价值

原文:https://towardsdatascience.com/how-to-estimate-the-value-of-data-products-8297dd92109?source=collection_archive---------9-----------------------

数据产品的商业价值经常被误判。学会这两条规则才能正确计算

WSJF 和数据产品的问题价值。图片由作者提供。

对于我这个产品经理来说,加权最短工作,或者说所谓的延迟成本,改变了我对价值的理解。这就是我们作为产品经理想要做的,最大化价值。这个公式中的基本成分是任务或工作的商业价值。

对于数据产品,对于数据密集型产品,机器学习解决方案,商业智能系统,简而言之,一切以数据为核心的东西,我经常会错误地猜测商业价值。

这并不是因为您必须进行彻底的计算,而是因为数据产品的商业价值遵循两个简单的规则,这在其他产品中并不突出:

规则一: 总会有(好的)选择,你得拿你的产品去比较。

法则二: 数据的唯一价值在于改善某人的决策。

让我们看几个例子来理解,为什么这经常误导我们。

邪恶的数学部分——WSFJ &延迟的代价

我说我们只需要大概猜一下值。这是事实。但是我们猜测的依据越多越好。我真的很喜欢延迟成本的概念,它基本上是说,用“延迟成本”除以工作规模,你会得到每单位时间的最大价值收益。

WSJF 和延误的代价。图片由作者提供。

那么我们如何计算延迟的成本呢?WSFJ 目录有一些很好的指针。他们告诉你要结合使用:

  • 最终用户价值(它对最终用户有什么价值)
  • 时间重要性(硬性截止日期,因为团队或外部用户依赖于它?)
  • 风险降低+机会实现

这很简单,尤其是因为我们只需要对自己盘子里的东西有一个粗略的、相对的感觉。我们只需要估计什么更有价值,而不是找到一个实际的$$$数字。

WSJF 和数据产品的问题价值。图片由作者提供。

在我看来,现在最重要的是“最终用户价值”部分。毕竟,归根结底,尽管其他两件事很重要,但它们实际上只是间接为最终用户价值买单。所以症结在于价值。对于数据产品,我们如何计算?

我们来看两个数据相关的例子。

这是另一种选择!

您的数据团队需要创建一份新的闪亮报告,显示呼叫中心运营单位的指标。有人告诉你,这将使团队领导能够组织工作,在必要的地方转移资源,并优化整体运营。商业价值是巨大的,他们认为他们可以通过优化节省 5–10%的资源。

听起来很重要,对吗?

图片由作者提供。

除了,你有没有问过,“那你现在是怎么工作的?你如何计划&优化工作?毕竟,你已经在做决定和调动员工了,对吗?”。他们可能会回答*“是的,当然!但是我们用的是这个巨大的 Excel 文件,由一个临时雇员每周编辑一次。带他走 4 个小时左右。”*

所以突然,实际值变成了…

现在这是正确的计算…作者的图片(是的,我必须把它放在每张图片上…).

嗯嗯。现在这看起来像一个少了很多零的任务。

我不是说这不重要,我只是说,选择很重要。在这种情况下,这很重要。

让我们看另一个例子。

这是关于决定

现在要求您的数据团队制作销售预测。该团队非常喜欢使用一些奇特的机器学习机制的想法。

但是等等,我们还有 10 个不同的任务,我们猜测了它们的商业价值。我们要先做这个吗?还是最后?还是根本没有?预测的商业价值是什么?你去问另一边的经理。

起初,他不确定。所以你问*“如果你对销售额有一个粗略的估计,你能做出更好的决定吗?”啊,现在他明白了“嗯,如果东西是可靠的,比如 90%可靠,我们就可以预订东西,而不会遇到瓶颈,使我们在通常的采购成本上多花 10%左右。我们目前无法进行手工预测,这是行不通的。”*

价值在于更好的决策!图片由作者提供。

所以这才是重点。你知道,如果你能产生一个至少 90%可靠的解决方案,那么你就能在平均采购成本上节省 10%。

你也刚刚被告知,如果你只有 80%的解决方案,你可能不会产生任何价值。太好了!所以你现在得到了你的价值,作为回报,你的团队可以重新估计“规模”,因为你现在知道,你必须达到 90%。

是关于整个周期的

我希望这已经帮助你学会如何更好地判断数据产品,附加功能的最终用户价值。

有时,这仍然不够,尤其是当你需要判断更大的复杂产品时。在这种情况下,你必须查看整个数据决策周期,你可以在我的另一篇博客文章中了解到。这将有助于你进一步剖析一个人做出更好的决定到底需要什么,以及你的产品将如何对此有所帮助。

进一步阅读

  • SAFE 框架提供了关于延迟成本和加权最短工作优先概念的信息。
  • 最后,如果你想更深入地了解数据和决策,以及如何真正让数据产品发挥作用,可以看看我写的关于好数据与坏数据策略的文章。

对如何建立伟大的数据公司、伟大的数据密集型产品、成为伟大的数据团队感兴趣,还是对如何利用开源构建伟大的东西感兴趣?然后考虑加入我的 免费简讯《三个数据点周四》 。它已经成为数据初创企业、风投和数据领导者值得信赖的资源。

如何向任何人解释数据科学

原文:https://towardsdatascience.com/how-to-explain-data-science-to-anyone-1eba18c00c1b?source=collection_archive---------23-----------------------

意见

向利益相关者、家人和朋友解释你的工作时,可以遵循一些简单的提示

照片由 Element5 数码在Unsplash【1】上拍摄。

目录

  1. 介绍
  2. 让它变得有关联,去掉行话
  3. 与日常场景相比
  4. 摘要
  5. 参考

介绍

无论你是否在科技行业,数据科学似乎无处不在。与数据科学相关的其他术语包括机器学习和人工智能。不幸的是,有些字段可能会相互混淆。就本文而言,我们将更多地关注数据科学本身。同样,我们将关注如何向对数据和统计一无所知的人解释数据科学。对数据科学的定义有无数种解释,但对我来说,我认为解释某事的最佳方式是将其与特定的人联系起来,放弃行话,并将其与他们可能已经知道的事情进行比较。话虽如此,下面让我们更深入地探讨一下这些解释数据科学的方法。

让它变得有关联,去掉行话

由埃罗尔·艾哈迈德在Unsplash【2】上拍摄的照片。

假设你正在和你的兄弟谈论数据科学,而他们从事完全不同的职业,比如音乐或建筑。很可能他们对数据科学一无所知,这当然没问题,也完全可以理解。如果你在解释,你的工作就是正确简单地解释数据科学。所以,看看他们的工作可以帮助你解释,如果不是工作,看看他们的其他特点,如爱好或兴趣。

使数据科学具有关联性的一些方法是将定义与具体的人相关联,如下所示:

  • 举一个他们当前工作的例子,例如,如果他们是音乐家,可以这样说:

“数据科学可用于从过去的音乐中组织/分类未来/新的音乐”

请注意,我甚至没有包括“数据”——而是使用了音乐,数据对你来说可能是一个显而易见的词,但正如我们所知,即使是“科学”这个词也可以在“数据科学”中进行解释——尽可能多地排除行话是解释任何事情的一个好技巧。

  • 一旦达成上述理解,那么你就可以把“数据”这个词分解成描述主题的东西——例如,我们可以把数据看作是描述某些东西的特征的例子。在这个音乐案例中,我们会说音乐或数据的这些特征是像yearsong lengthrhythm这样的东西,这将是描述流派的东西——使用这些东西,我们可以对新音乐进行分类

正如你所看到的,从上面,我们使数据科学与人相关,并解释它没有行话-或与主题相关的特定词语。我们不想说“机器学习算法被编译成以低均方误差来预测目标变量,该目标变量是来自结构化的并且是 CSV 格式的音乐数据的先前特征的流派”。是的,这个解释又长又混乱,这才是重点。我看到很多数据科学都是以这种方式解释的,当然,你不会想以这种方式向你的朋友和家人解释,但即使不向你公司的利益相关者解释,你也确实有一些数据科学的知识。数据科学只是一种工具,可以让人类更有效地处理数据。

与日常场景相比

图片由 Erol Ahmed 在Unsplash【3】上拍摄。

另一种有助于解释数据科学的方法是将它与日常场景联系起来,不管这个人的工作或爱好是什么。例如,大多数人都知道房子是什么。我们可以用房子作为例子来解释数据科学。

更具体地说,我们可以用房价作为数据科学场景。

下面是一个将数据科学与房屋相结合的例子(,当然,你可以使用其他东西作为主题,同时遵循这些相同的步骤):

  • 问题:给房子定价很难
  • 更多问题:手动操作会花费很长时间
  • 更多问题:我们在定价时经常不一致

(注意:我避免使用“预测”这个词,而是用“分配”来代替,因为“预测”听起来可能会令人困惑)

  • **解决方案:**我们可以看看周围的房子来评估价格
  • **解决方法:**我们可以具体看一下周围的住宅的特点
  • **解决方案:**我们可以将这些特征组织成我们所说的数据,通过列出每个周围房屋的独特特征值,得出具有这些特征的新房屋的平均值
  • **解决方案:**举个例子,1000 平方英尺以上的房子平均房价为 300,000 美元或更高,也就是说,如果这个新房子也是 1000 平方英尺,我们会指定它也是这个价格/类似的价格,但是当我们综合所有特征时,它可能会提高或降低这个价格
  • **解决方案:**房地产经纪人已经在做这种评估了,数据科学使它自动化,因此更容易、更快、更准确,因为我们可以测试它
  • **解决方案:**测试我们如何做,假设我们不知道 10 套房子的价格,并使用数据科学来分配这些值,然后将这些房价并排放在一起,看看有什么不同,然后我们可以看到我们的数据科学有多准确
  • **解决方案:**比如我们对比的 10 个房价都是使用数据科学得出的 40 万美元左右,真实的房价在 40.5 万美元左右。那时我们会非常准确,并且知道我们在数据科学方面所做的是好的

正如您所看到的,当您设计一个具体的项目时,就像这个过程一样,在这里您提出了问题和解决方案,没有任何技术术语,您可以从本质上解释所有的数据科学(到一定程度)。

摘要

有无数种方法来解释数据科学,我所描述的可能对你和你要解释的人有用,也可能没用。也就是说,接受我所说的,并尝试一下,如果它不起作用,那么希望这篇文章中有一些有用的建议。

总的来说,坦率地说,在解释数据科学时不要居高临下。这个我刚学的时候经历过无数次,而且是 100%,完全没必要。大多数事情都可以用简单的措辞来解释,并分解到最简单的层次。

我所说的可能是显而易见的,但我仍然认为这是我们大多数人可以改进的地方,包括我自己。这个建议不仅仅是你可以应用到你的朋友和家人身上取乐的东西,实际上也是你可以和你的同事和利益相关者一起实践和应该做的事情。通常,在你的职业生涯中,你会与不了解数据科学的其他利益相关者合作,在你面试工作时也是如此,因此,尽管如此,你需要知道如何向任何人解释数据科学。

总而言之,以下是一些向任何人解释数据科学的方法:

* Make it Relatable* Drop the Jargon* Compare to Everyday Scenarios

我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些如何解释数据科学的方法,请随时在下面发表评论。为什么或为什么不?你认为还有哪些方法很重要?这些当然可以进一步澄清,但我希望我能够阐明一些可以帮助你向任何人解释数据科学的方法。感谢您的阅读!

请随时查看我的个人资料、 马特·普日比拉 和其他文章,也可以在 LinkedIn 上联系我。

参考

[1]照片由 Element5 Digital 在Unsplash(2017)上拍摄

[2]图片由 Erol Ahmed 在 Unsplash 上拍摄,(2017)

[3]图片由 Erol Ahmed 在Unsplash(2020)上拍摄

如何用 SHAP 解释神经网络

原文:https://towardsdatascience.com/how-to-explain-neural-networks-using-shap-2e8a0d688730?source=collection_archive---------13-----------------------

SHAP 可以帮助解释像神经网络这样的黑箱模型

作者图片

对于数据科学家来说,神经网络是迷人且非常有效的工具,但它们有一个非常大的缺陷:它们是无法解释的黑盒。事实上,它们没有给我们任何关于特性重要性的信息。幸运的是,有一种强大的方法可以用来解释每一个模型,甚至神经网络。这就是 SHAP 的方法。

让我们看看如何用它来解释和诠释 Python 中的一个神经网络。

什么是 SHAP?

SHAP 主张沙普利附加解释。这是一种计算特性对目标变量值的影响的方法。这个想法是,你必须把每个要素看作一个玩家,把数据集看作一个团队。每个球员都对球队的成绩做出了贡献。给定一些特征值(即给定特定记录),这些贡献的总和给出了目标变量的值。

主要概念是要素的影响不仅仅取决于单个要素,而是取决于数据集中的整个要素集。因此,SHAP 使用组合微积分计算每个特征对目标变量(称为 shap 值)的影响,并在包含我们正在考虑的特征的所有组合上重新训练模型。一个特性对一个目标变量的影响的平均绝对值可以用来衡量它的重要性。

这篇伟大的文章对 SHAP 做了非常清楚的解释。

SHAP 的好处在于它不在乎我们使用的模式。事实上,这是一种模型不可知的方法。所以,解释那些不能给我们自己解释特征重要性的模型是完美的,比如神经网络。

让我们看看如何在神经网络中使用 Python 中的 SHAP。

Python 中的一个神经网络示例

在本例中,我们将使用 Python 和 scikit-learn 通过 SHAP 计算神经网络的特征影响。在现实生活中,您可能会使用 Keras 来构建神经网络,但概念是完全相同的。

对于这个例子,我们将使用 scikit-learn 的糖尿病数据集,这是一个回归数据集。

让我们先安装 shap 库。

!pip install shap

然后,让我们导入它和其他有用的库。

import shap 
from sklearn.preprocessing import StandardScaler 
from sklearn.neural_network import MLPRegressor 
from sklearn.pipeline import make_pipeline 
from sklearn.datasets import load_diabetes 
from sklearn.model_selection import train_test_split

现在,我们可以加载数据集和特性名称,这在以后会很有用。

X,y = load_diabetes(return_X_y=True) 
features = load_diabetes()['feature_names']

现在,我们可以将数据集分为训练和测试两部分。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

现在我们必须创建我们的模型。既然说的是一个神经网络,那就必须提前对特征进行缩放。对于这个例子,我将使用一个标准的定标器。该模型本身是一个前向神经网络,在隐层中具有 5 个神经元,10000 个历元和具有自适应学习速率的逻辑激活函数。在现实生活中,你会在设置这些值之前对这些超参数进行适当的优化。

model = make_pipeline( StandardScaler(), MLPRegressor(hidden_layer_sizes=(5,),activation='logistic', max_iter=10000,learning_rate='invscaling',random_state=0) )

我们现在可以拟合我们的模型。

model.fit(X_train,y_train)

现在轮到 SHAP 部分了。首先,我们需要创建一个名为 explainer 的对象。这个对象接受我们的模型和训练数据集的预测方法作为输入。为了使 SHAP 模型不可知,它在训练数据集的点周围执行扰动,并计算该扰动对模型的影响。这是一种重采样技术,其样本数稍后设置。这种方法与另一种著名的方法 LIME 有关,LIME 已被证明是原 SHAP 方法的一个特例。结果是 SHAP 值的统计估计。

那么,首先让我们来定义一下的交代者对象。

explainer = shap.KernelExplainer(model.predict,X_train)

现在我们可以计算 shap 值。请记住,它们是通过对训练数据集进行重采样并计算这些扰动的影响来计算的,因此我们必须定义适当数量的样本。对于这个例子,我将使用 100 个样本。

然后,对测试数据集计算影响。

shap_values = explainer.shap_values(X_test,nsamples=100)

一个漂亮的进度条出现并显示计算的进度,这可能会很慢。

最后,我们得到一个(n_samples,n_features) numpy 数组。每个元素都是该记录的该特征的形状值。请记住,shap 值是为每个要素和每个记录计算的。

现在我们可以绘制所谓的“概要图”。让我们先把它画出来,然后我们来评论结果。

shap.summary_plot(shap_values,X_test,feature_names=features)

概要图。作者图片

每行的每个点都是测试数据集的记录。这些功能从最重要的到不太重要的进行排序。我们可以看到 s5 是最重要的特性。该特性的值越高,对目标的影响越积极。该值越低,贡献越负。

让我们更深入地了解特定记录,例如第一条记录。我们可以画的一个非常有用的图叫做力图

shap.initjs() shap.force_plot(explainer.expected_value, shap_values[0,:] ,X_test[0,:],feature_names=features)

武力阴谋。图片作者。

113.90 是预测值。基值是所有记录中目标变量的平均值。每个条带显示了其特性在推动目标变量值更接近或更接近基本值方面的影响。红色条纹表明它们的特征将价值推向更高的价值。蓝色条纹表明它们的特征将值推向更低的值。条纹越宽,贡献就越大(绝对值)。这些贡献的总和将目标变量的值从花瓶值推至最终的预测值。

我们可以看到,对于这个特定的记录, bmi、bp、s2、性别s5 值对预测值有积极的贡献。 s5 依然是这个记录最重要的变量,因为它的贡献是最广的一个(它的条纹最大)。唯一显示负贡献的变量是 s1 ,但是它不足以使预测值低于基准值。因此,由于总正贡献(红色条纹)大于负贡献(蓝色条纹),最终值大于基础值。这就是 SHAP 的工作方式。

正如我们所看到的,通过阅读这些图表,我们学到了一些关于特性重要性的东西。我们不关心我们使用的模型,因为 SHAP 是一种模型不可知的方法。我们只关心特性如何影响预测值。这对于解释黑盒模型非常有帮助,比如这个例子中的神经网络。

仅仅知道我们的神经网络的权重,我们永远不可能对我们的数据集有这样的了解,这就是为什么 SHAP 是一个非常有用的方法。

结论

SHAP 是一个非常强大的方法,当谈到解释模型,不能给我们自己的特征重要性的解释。这种模型例如是神经网络和 KNN。尽管这种方法非常强大,但没有免费的午餐,我们必须承受一些必须意识到的计算成本高昂的计算。

如果你想学习关于神经网络和 SHAP 技术的模式,你可以加入我的 10 多个小时的在线课程关于 Python 中有监督的机器学习的。

原载于 2021 年 5 月 17 日 https://www.yourdatateacher.comhttps://www.yourdatateacher.com/2021/05/17/how-to-explain-neural-networks-using-shap/

直觉建造者:如何围绕变形金刚的注意力机制来思考

原文:https://towardsdatascience.com/how-to-explain-transformer-self-attention-like-i-am-five-9020bf50b764?source=collection_archive---------10-----------------------

变压器注意机制为我们其余的人解释

注意力计算—作者创作的动画

目录

动机
基本构建模块:一种叫做‘嵌入’的特殊向量
核心机制:向量的点积
让我们把它应用在更容易的东西上:推荐系统
现在我们可以谈谈注意力:YouTube 如何找到你搜索的视频(QKV 系统)
翻译中的注意力,这一切都很自然
自我关注:发现越复杂

动机

如果你在人工智能行业工作,或者正在学习进入该行业,那么你没有听说过 Transformer 的可能性很小。谷歌用其署名论文 介绍了它【关注就是你所需要的一切】瓦斯瓦尼等人(2017) 。它很快在 NLP 的研究人员中流行起来,人们用 Transformer 重新实现了 RNN/LSTM 曾经完成的主要 NLP 论文。基于 Transformer 的预训练语言模型 OpenAI 的 GPT-3 和像拥抱脸这样的工具很快在工业和商业领域获得了牵引力。但并没有就此止步。原来 Transformer 就是这么一个不可思议的架构,除了自然语言处理之外的问题也能被它解决。视觉、音频、物体检测、强化学习,应有尽有。任何你能做成一个令牌序列的东西,你都可以用 Transformer 解决。

Andrej Karpathy 的推文解释了神经网络架构如何融合到变压器中

然而,Transformer 并不是一个容易理解的架构。这是一个编码器/解码器模型。每个编码器和解码器都有多个子层和组件。其核心是自我关注机制,不那么容易找到直觉。这是本文试图帮助的。我将使用简单的英语、动画和恰当的类比来解释它是什么,它是如何工作的。希望当你阅读完这篇文章的时候,你会清楚地理解令人生畏的注意力机制。也许在你的下一次聚会上向你的朋友解释🍸。让我们直接跳进来吧!

基本构件:一个叫做“嵌入”的特殊向量

由 Kelly Sikkema 在 Unsplash 上拍摄的照片

C 分类数据(输入许多离散类型,如文字、电影、产品等。).我们如何表示它们并将其编号?我们可以使用一键编码。当然可以。但是当类别越大越难管理,而且不是很直观。vector [1,0,0,0]和[0,0,0,1]有什么区别?它没有说太多。更好更自然的方式是使用嵌入*。由于每个类别都有一些内在的特征,我们可以用一个低维向量来表示它。例如,我们通常将 Marvell 的新电影蜘蛛侠:英雄无归描述为50%动作、30%浪漫、15%剧情、5%惊险。我们可以很容易地将这种描述转换成一个向量,第一维为'action、'第二维'romance、'第三维'drama'和第四维'thrilling':*

*Spider-Man: No Way Home = [0.5, 0.3, 0.15, 0.05]*

由于不会有两部分数相同的电影,所以用向量来表示电影更有意义。这使得通过模型学习变得更容易,更重要的是,更容易解释。嵌入是建模现实世界对象的一种更好的方式。例如,单词嵌入将含义放入向量中,您可以做一些有趣的事情,如:

作者创作的照片

或者,如果用户共享相似的嵌入,您可以将电影与用户匹配(特征/兴趣匹配)。向高动作评分嵌入用户推荐高动作评分嵌入电影听起来是个好主意。

核心机制:向量的点积

我们已经确定注意力机制是变形金刚的核心。**

注意力机制的中心是一个简单的数学概念:向量的点积

由于向量的点积相对简单,我不会在这里用解释来烦你,我只想指出它的意思并给出一些直觉,这对于理解注意力的意思是必不可少的。

两个向量之间的点积表示' 的关联程度。一个很好的直觉是它们之间的角度。角度越小,两个矢量指向同一方向越近。参见下面的动画:

点积衡量两个向量的“相关”程度

直角意味着两个向量不相关。如果角度大于 90 度,它们是负相关的。

将点积直觉应用于嵌入给了我们一种数学上匹配向量的方法。如果我们有产品和客户的嵌入向量,我们如何确定客户是否会喜欢特定的产品?只是在它们的嵌入之间做一个点积!如果我们获得高价值,客户很有可能会喜欢它。不然他不会喜欢的。

让我们看一个现实生活中的例子,把我们新学到的概念放在一起。

让我们把它应用到更简单的东西上:推荐系统

推荐系统广泛应用于网飞或 YouTube 等内容平台,以匹配产品/项目和用户。基本思路是给类似电影的物品一个(特征)嵌入向量,给用户另一个同维(兴趣)嵌入向量。如果两个嵌入的点积显著,那么电影的'特征与用户的'兴趣一致,用户很可能喜欢这部电影。否则,他可能不会。见下文:

用户和电影嵌入的点积

通过计算用户和电影的嵌入矩阵的点积,我们可以获得所有电影/用户对的匹配分数*,并且可以将它们与真实情况(从用户反馈收集的评论分数)进行比较。然后,我们可以使用梯度下降来拟合嵌入并优化我们的损失函数。本质上,这就是' 协同过滤 '推荐系统的工作原理。*

现在我们可以谈谈注意力:YouTube 如何找到你搜索的视频(QKV 系统)

Nathana rebou as 在 Unsplash 上的照片

现在我们离理解注意力又近了一步。我们可以看到另一个例子,如何使用点积来查找您输入的关键字的最佳视频。我们将介绍查询的思路。假设你想找一个关于'变形金刚的视频,你在搜索框里输入了这个词(查询)。你点击回车,YouTube 就会查看他们的视频库,找到那些在标题或标签中有“transformer”的视频(),然后返回给你他们认为最合适的视频()。如果我们使用嵌入向量来表示我们的查询和视频的关键字,那么查询和每个关键字之间的点积将告诉我们该项目和您输入的关键字之间的“相关性”。这个简单的 QKV 系统是注意力机制的核心。

翻译中的注意,这都是很自然的

Finally, let’s look at how attention works. More precisely, how encoder-decoder attention works. Take translation as an example, say we have a Chinese sentence “潮水退了,才知道谁没穿裤子”, and we want to translate it into English: “When the tide goes out, we know who is not wearing pants. ”. The natural way for us humans to do this is to look at the original sentence, translate one or two words, then look again to get the context, then translate another one or two words, rinse and repeat. So here we are actually doing three things:

人类友好词汇:

  1. 看看翻译过来的单词,这样我们就可以建立上下文了。
  2. 看原句(所有的单词),这样我们对意思会有更好的理解。
  3. *我们搜索我们的记忆,找到给定 1 和 2 的最佳下一个单词。*

变形金刚的注意力机制也在做类似的事情。

在向量/嵌入词汇中:

  1. Transformer 模型的编码器计算当前翻译的嵌入/表示向量,将其用作 查询
  2. 变换器模型的编码器计算每个原始单词的单词嵌入向量作为
  3. Transformer 模型的解码器计算查询/键的点积,我们可以得到一个新的向量,每个值是每个查询* / 键对之间的“相关性得分”(稍后使用 softmax 转化为权重)。用这些权重对原句的所有 嵌入向量进行加权求和,得到最终的预测向量,用这个预测向量预测下一个单词。请参见下面的动画:*

机器翻译中注意力是如何计算的

As the animation shows, attention is how much we need to ‘care’ about each word in the original sentence ( “潮 水 退 了” ), given the current already translated words (“When the tide”). We can achieve this by doing the dot product of the query vector and each word embeddings of the original sentence. The calculated attention vector is then used to calculate a new predictive vector, extracting the embeddings with the respective amount of ‘attention’ needed from the original words. Then the model uses it to make the prediction (through some other dense layers etc.). You can come to this blog for more details on how encoder-decoder attention works.

自我关注:发现更成熟的自我

Transformer 的编码器部分,原句会先做自关注来更好的表现句子的上下文含义。让我们来看看自我关注是如何工作的。这与我们刚才解释的编码器-解码器注意力没有太大区别。见下图:

比例点积是自我关注的计算方式

这里最显著的区别是如何获得QueryKeyValues。在编码器/解码器的关注下,Query来自解码器读取当前翻译文本,KeysValues来自编码器读取原句。而对于自我关注来说,QKV都来源于句子本身,故名自我关注。通俗地说,我们可以做到以下几点:

对于句子中的每个单词,查看其余每个单词,并找出应该对它们给予多少关注(点积),以获得一个“关注度”向量。例如,下图来自谷歌关于变形金刚的博客:

“它”这个词关注它自己,“动物”和“街道”——图来自谷歌关于变形金刚的博客

单词' it '通过对自己和句子中的所有单词进行点积来计算自己的自我关注度(在上图中用不同深浅的蓝色表示)。一旦计算出自我关注度,模型就可以用它来'重新分配单词嵌入。这样,单词' it 的新的'表示就生成了。它结合了自己的词向量和一些注意力权重大的词。“ it 的新表述现在更加“上下文感知”和“复杂”,更适合翻译和其他与语言相关的任务。这是对每个单词做的,所以当所有的都说了,做了,我们将有一个每个单词的表示,都知道上下文。实际上,转换者将有多个关注层,我们将有“上下文的上下文”、“上下文的上下文”等等。,从而提高了模型的抽象性。这可能就是 transformer 在语言相关任务中表现如此出色的原因。它提供了一个很好的语言抽象模型,就像 CNN 为视觉任务所做的那样。

但是等一下,你说。那QKV呢?我们知道它们来自编码器/解码器的注意力,但是它们是如何计算自我注意力的呢?就更简单了。自我关注中的querykeyvalue就是他们自己。我们正在询问我们自己(询问关键点积)以获得自我-注意力,然后使用我们自己的自我注意力(注意力矩阵以评估点积)来获得新的表示。如果我们看看衡量点积注意力的公式:

标度点积注意力公式

自我关注公式应该是这样的(***X***是句子词向量):

自我关注公式

在实际实现中,我们在***X***之上堆叠三个独立的线性层,以获得QKV,但这只是为了更灵活的建模。本质上,他们还是***X***

结论

T he attention 机制有很多应用,并不仅限于NLPT7。例如,图像识别可以利用注意力找出图像的相关部分。

任何可以放进记号序列的东西,我们都可以使用注意力机制来帮助我们发现模式、提取特征、连接点、做抽象等等。这确实是一个非常强大的模型。

注意力变压器(或多或少与培训相关)的其他部分不在本文讨论范围内,比如“缩放点积注意力”中的“缩放是什么意思?口罩是如何工作的?等等。这篇文章并不意味着包罗万象。相反,它试图在 Transformer 架构中确定自我关注机制如何工作的直觉部分。如果你在读完这篇文章后觉得注意力的概念更有意义,那么它已经达到了它的目的。

我希望你觉得这篇文章读起来很有趣,并从中学习到一些东西。如果你想更多地了解我对数据科学的思考、实践和写作,可以考虑报名成为 Medium 会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金。

*https://lymenlee.medium.com/membership *

如果你目前正在学习其他东西,如何探索数据科学

原文:https://towardsdatascience.com/how-to-explore-data-science-if-you-are-currently-studying-something-else-83b8a2db1482?source=collection_archive---------33-----------------------

学生获得技能、经验和人脉成为数据科学家的六种方式。

图片来源:凯拉·伯顿对派克斯

你遇到了数据科学的迷人世界,并对从事 it 职业感到兴奋。但可悲的是,你学的是化学/心理学/经济学等。,不能转向与数据科学更密切相关的研究领域。您可能会觉得受到环境的限制,但作为一名高等教育机构的学生,您可以获得为您的数据科学梦想奠定基础的资源。学院和大学为您提供了获得教育、经验和人脉的机会,所有这些都有助于一名有抱负的数据科学家。这个故事中介绍的方法除了你的学费之外,几乎没有额外的花费。无论你的学位还剩一个学期还是几年,利用你的学院/大学提供的机会并根据你的数据科学愿望量身定制它们都不算太晚。

接受教育

也许任何人追求高等教育的最明显的原因是获得他们感兴趣领域的相关知识。然而,许多学位是可定制的,允许你在系外上课。通过一些规划,您可以集中精力、辅修或参加独立课程来培养基本的数据科学技能。

照片由舒巴姆·莎兰在 Unsplash 拍摄

专攻或辅修数据科学

由于完成学位需要额外的时间,该选项可能会有时间限制,但辅修或专注于数据科学可能是获得基本技能的绝佳方式。

由于数据科学是一个跨学科领域,数据在越来越多的行业中发挥着越来越重要的作用,越来越多的大学专业提供数据科学专业/选项。追求这一点可能是将数据科学纳入您的教育的一种更简单的方法,您也可以看到您当前的研究领域如何与数据科学相交。

如果你目前的学位没有重点,你可以考虑在你的学院或大学辅修。与大多数专业不同,数据科学辅修专业通常更加跨学科,允许你选修多个院系的课程(例如:不列颠哥伦比亚大学、华盛顿大学、宾夕法尼亚大学)。除了学习基础数据科学知识,辅修可以让你参加一个有趣的课程,你可能以前没有意识到。

参加有助于您获得数据科学技能的课程

如果你没有辅修课或专修课,你可以参加独立的课程,帮助你获得同样的技能。要想知道应该学什么课程,可以使用数据科学项目的课程或在 Medium 上发布的许多自举数据科学学习指南之一。

数据科学学习指南:

https://pub.towardsai.net/data-science-curriculum-bf3bb6805576

即使你不能参加所有建议的课程,仅仅掌握一些基本的编程和统计知识就能让你具备一定的数据素养。你可以在通过研究生院、在线课程、新兵训练营或自我指导项目完成学位后建立这些技能。

获得经验

是时候把你学到的东西带出教室了。作为一名大学生,你有机会通过参加研究项目或作为学生组织的一部分来应用你的知识。你能得到的机会取决于你的具体学校,但是,一旦你毕业了,这些机会就很难得到了,所以,最好现在就抓住它们。

照片由莱昂在 Unsplash 上拍摄

参加一个研究项目

在这个精彩视频中,在 FAANG 公司工作的数据科学家 Tina Huang 分享了学生从事的最佳数据科学项目:与教授一起研究。

在传统的个人项目中,你经常独自工作。此外,如果你正在做一个互联网推荐的项目,有可能很多其他人也在做。

公司希望协作的数据科学家做有意义的工作并产生影响。当你在做一个教授的研究项目时,他们已经做了艰苦的工作,找到一个有社会影响的实质性问题来回答。你也将获得在团队中工作的经验,这总是有利的。

另一个好处是,教授通常不需要拥有全套数据科学技能的人。拥有基本编程和统计经验的你可以成为一名有价值的团队成员。

您可以通过以下两种方式找到研究项目:

  1. 寻找那些从事与你职业目标相关的迷人研究的教授。给他们发邮件。蒂娜建议从你的部门开始,然后扩展到其他领域,特别是生物科学、经济学或商业。这些领域可能有大量的数据要分析,通常在工作中学习相关主题比学习数据科学更容易。
  2. 如果你的学院或大学提供了一个,通过研究项目数据库寻找对数据工作有经验或有兴趣的研究助理。

如果您有能力开发自己的研究项目,您也可以尝试将数据科学工作融入到您的项目中。

加入技术学生组织或竞赛

除了研究项目,大学通常有很多组织,学生在这些组织中从事技术项目。这些通常与自然科学、工程、数学和计算机科学相关。

加入这些组织是应用数据科学技能的好方法。他们也可能是跨学科的,所以你可能会遇到来自许多不同背景的学生,并与他们一起工作。根据我的经验,我注意到学生团队往往有更少的看门人,并允许更年轻的学生更频繁地参与,所以你可能更容易加入其中。

为了找到最适合你的机会,请确保与你感兴趣的组织的领导分享你的目标和数据科学兴趣。

获得联系

网络对每个职业都至关重要,数据科学家也不例外。作为一名大学生,你有一个由学生、教师和校友组成的内置网络,他们可以帮助你了解更多关于数据科学和作为数据科学家的生活的知识。

照片由 LinkedIn 销售解决方案在 Unsplash 上拍摄

加入专业组织

专业组织和协会的存在是为了促进联系,分享令人兴奋的研究和发现,并支持其成员的职业成功。加入专业组织可以帮助你结识其他数据科学家,了解更多行业最新趋势。一些组织还将为学院/大学学生提供相当大的折扣,或者拥有打折会员的学生分会。

数据科学专业组织和学会:

  • 数据中的女性
  • 数据科学家协会
  • 通知

用你的学生卡上网

作为一名学生,人际关系网看起来很可怕,但是专业人士更倾向于帮助学生,因为他们有过相同的经历。你可以使用 LinkedIn 联系你大学的校友,他们目前是数据科学家,要求进行 15 分钟的虚拟信息面试。这些不仅会让你更深入地了解作为一名数据科学家是什么样的,而且,如果你经常保持联系,他们可能会记住你,以便将来推荐。

在信息面试中你可以问的问题:

  1. 作为一名数据科学家,你最喜欢/最不喜欢什么?
  2. 你是如何找到并申请到你的第一个数据科学(或相关)职位的?
  3. 你的课程和专业是如何为你现在的角色做准备的?
  4. 作为一名数据科学家,你推荐参加哪些课程?

最后的话

追求这些方法中的任何一种(或全部)都会对你的日常课程和其他责任带来挑战。然而,利用高等教育机构提供的机会可以帮助巩固您的数据科学抱负,并确保这是您在任何额外资金投资之前想要走的道路。这些步骤都不会让你为成为一名数据科学家做好充分准备,但它们可以为你打下良好的基础。

祝您在数据科学之旅中好运!

如何为数据科学项目导出和加载 Anaconda 环境

原文:https://towardsdatascience.com/how-to-export-and-load-anaconda-environments-for-data-science-projects-77dc3b781369?source=collection_archive---------4-----------------------

用单一终端命令共享 Python 虚拟环境

克里斯杨在 Unsplash 上的照片

每次从头开始设置虚拟环境都是一个繁琐而耗时的过程。有一种方法可以绕过它。您可以使用 Anaconda 将 Python 虚拟环境导出为 YAML 文件,然后在不同的项目中重用。您还可以与您的团队共享 YAML 文件,这样每个人都在同一轨道上。

今天你将学会如何做。这比你想象的要简单,所以让我们开门见山吧。

不想看书?请观看我的视频:

创建和设置 Anaconda 环境

Anaconda 使数据科学家建立虚拟环境变得非常容易。我使用的是名为 Miniforge 的缩小版,它没有预装大量的库。你用哪种口味并不重要。

我们将基于最新版本的 Python 3.9 创建一个名为test_env的新环境。打开终端窗口,键入以下内容:

conda create --name test_env python=3.9 -y

图 1 —创建一个 Anaconda 环境(图片由作者提供)

初始设置不会花很长时间。几秒钟后,您会看到以下消息:

2 —创建 Anaconda 环境(2)(图片由作者提供)

这意味着环境安装成功。您可以使用以下命令激活它:

conda activate test_env

3 —激活 Anaconda 环境(图片由作者提供)

现在您已经拥有了安装两个库所需的一切。让我们坚持使用基本的——Numpy、Pandas、Matplotlib、Scipy、Scikit-Learn 和 Jupyter:

conda install -c conda-forge -y numpy pandas matplotlib scipy scikit-learn jupyter jupyterlab

4-安装 Python 库(图片由作者提供)

这可能需要一段时间,取决于你的网速。Anaconda 必须下载所有列出的库及其依赖项,所以让它去做吧。完成后,您应该会看到类似的显示:

5 —安装 Python 库(2)(图片由作者提供)

这就是您通常从头开始设置虚拟环境的方式。让我们看看接下来如何导出它。

如何导出和加载 Anaconda 虚拟环境

Anaconda 允许您将虚拟环境导出到 YAML 文件中。理解经常用于创建配置文件的数据序列化语言很简单。YAML 类似于 JSON,但是没有括号。

使用以下命令导出环境,只需记住修改导出路径:

conda env export > \Users\Dario\Desktop\test_env.yaml

图 6 —导出 Anaconda 环境(图片由作者提供)

您可以用任何文本编辑器打开 YAML 文件,例如 Visual Studio 代码。以下是它包含的内容:

图 7—YAML 环境文件(图片由作者提供)

该文件包含关于如何用 Anaconda 建立一个相同环境的完整说明。唯一的问题是第一行显示的环境名。您必须改变它,因为您已经有了一个名为test_env的环境。让我们保持简单,将其重命名为test_env_2:

图 8 —更改环境名称(作者图片)

现在,您可以使用以下命令从 YAML 文件创建虚拟环境:

conda env create -f \Users\Dario\Desktop\test_env.yaml

图 9 —从 YAML 文件创建环境(图片由作者提供)

执行这个命令应该不会花很长时间,因为您已经下载了所有的库。完成后,您将看到一条类似的消息,告诉您如何激活环境:

图 10 —从 YAML 文件创建环境(2)(图片由作者提供)

使用显示的命令激活环境:

conda activate test_env_2

图 11 —激活新的 Anaconda 环境(图片由作者提供)

最后,让我们验证一下我们已经安装了 Python 库。启动一个 Python shell 并导入之前安装的所有内容——Numpy、Pandas、Scipy、Matplotlib 和 Scikit——了解:

图 12 —验证库安装(图片由作者提供)

看起来一切都像预期的那样工作,您有了一个新的环境,其中包含了来自 YAML 文件的依赖项。很简单,对吧?

结论

这就是你想要的——不费吹灰之力就能再现 Anaconda 环境。您可以使用它们来设置基础环境,然后根据项目需要进行调整。例如,几乎每个数据科学项目都需要我们今天安装的库,所以为什么不为自己节省几分钟呢。

另一个用例是与您的团队共享 YAML 文件的能力,这样每个人都在同一轨道上。

不管怎样,这是 Anaconda 的一个众所周知的特性。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

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

保持联系

  • 注册我的简讯
  • 订阅 YouTube
  • 在 LinkedIn 上连接

原载于 2021 年 11 月 17 日【https://betterdatascience.com】

如何将数据从 Google Analytics 4 导出到 Google BigQuery

原文:https://towardsdatascience.com/how-to-export-data-from-google-analytics-4-to-google-bigquery-5694a71fcb25?source=collection_archive---------8-----------------------

来源:沉积照片

在本文中,我们将告诉您如何将 Google Analytics 4 链接到 Google BigQuery,将数据从 GA4 导出到 BigQuery,并从您收集的数据中获得最大价值。

Google Analytics 4 让在 Google BigQuery 中分析数据变得前所未有的简单。现在几乎每个人都可以免费在 BigQuery 中收集数据。让“”弄清楚如何正确地将数据从 Google Analytics 4 导出到 BigQuery,以及您还应该考虑哪些因素,以便从您收集的信息中获得最大价值。

为什么需要收集原始的未采样数据

原始(未处理的)数据允许您精确地分析您的业务流程。通过收集原始数据,您可以:

  • 客观地评估您的业务流程
  • 执行指标的深度分析
  • 跟踪整个用户旅程
  • 无限制地构建任何报告
  • 细分你的受众,建立有针对性的广告

采样是指当信息量太大而无法快速处理时(例如,如果您在报告中使用多个自定义维度),对给定细分市场的分析结果进行外推。抽样会严重扭曲你的报告,并导致你错误评估你的结果,因为你不是分析所有的数据,而是只分析部分数据。这样做,你就冒着投资低效广告活动或关闭创收广告渠道的风险。如您所见,避免采样绝对是个好主意。谢天谢地,这是可以实现的。

在哪里存储收集的数据

让我们来看看问题的实际方面:哪种分析平台方便、实惠,并且允许您处理原始的未采样数据?我们推荐的解决方案——Google big query——可能是全世界营销人员中最受欢迎的,这有一大堆坚实的理由。我们建议您使用 BigQuery 云存储来收集、存储和处理原始数据,下面我们将解释原因。

什么是 Google BigQuery?

Google BigQuery 是一个多云数据仓库,内置查询服务,具有很高的安全性和可扩展性。据 Gartner 称,“到 2022 年,75%的数据库将被部署或迁移到云平台,只有 5%曾经考虑过迁移到本地。”由于 BigQuery 是谷歌生态系统的一部分,特别是谷歌云平台,它可以与谷歌的其他产品集成,帮助你以有竞争力的速度发展你的业务。

为什么要 Google BigQuery?

对于营销人员来说,有多个低层次的方面使得 BigQuery 几乎不可替代。让我们仔细看看它的一些最有价值的好处:

  • 能够上传大量信息。使用 BigQuery,你可以对任何类型的数据进行实时分析,并用 SQL 快速处理。
  • **安全级别高。**您获得了对项目的完全控制权,并且可以利用双因素认证。
  • 实惠。 只为收集和处理的数据付费。
  • **与谷歌产品的原生集成。**轻松连接 Google Analytics 和其他产品。
  • 可扩展。 快速无缝扩展轻松适应快速变化的世界。
  • big query ML。使用 SQL 在结构化和半结构化数据上构建机器学习预测模型。
  • **大查询 GIS。**借助 BigQuery 地理信息系统 (GIS),您可以分析地理空间信息,并确定哪些用户应该收到特定商店位置的邮件。

导出模式

让我们检查一下导出到 BigQuery 的 GA 4 属性数据的格式和模式。使用 GA 4 时要记住的一件重要事情是,它的结构不同于全球营销人员熟悉的通用分析的结构。

这就是 Google Analytics 4 模式与通用分析模式的不同之处:

  • 数据集。 GA 样本数据集被命名为分析 _ ,其中属性 ID 是您的分析属性 ID。
  • **表格。**每天都有一个单独的 Google Analytics 表导入到数据集中。这种表格的格式是 events_YYYYMMDD ,不像通用分析中的格式是 ga_sessions_YYYYMMDD
  • **行。**每一行对应于一个上传的事件,而 Universal Analytics 的每一行对应于一个 Google Analytics 360 会话。
  • **列。**GA 4 和 Universal Analytics 的字段名差别很大。您可以通过以下链接进行比较:

谷歌分析 4 大查询导出模式

通用分析 BigQuery 导出模式

现在让我们来看看本文的主要目的:提供如何将数据从 Google Analytics 4 导出到 BigQuery 的分步说明。

如何将原始数据从 Google Analytics 4 导出到 Google BigQuery

如果你需要的信息已经在谷歌分析 4 中,你可以开始导出它。您可以将其导出到 BigQuery 沙箱的自由实例中(适用沙箱限制)。

1.创建一个 Google-APIs-Console 项目

要创建 API 控制台项目:

  1. 登录谷歌 API 控制台。
  2. 创建新项目或选择现有项目。

图片由作者提供

2.启用 BigQuery

  1. 转到 API 表。
  2. 进入导航菜单,点击API&服务,然后选择

图片由作者提供

  1. Google Cloud API部分,选择 BigQuery API
  2. 在打开的页面上,点击启用
  3. 向您的云项目添加服务帐户。确保fire base-measurement @ system。gserviceaccount.com是项目成员,并被分配了编辑角色。

3.将 BigQuery 链接到 Google Analytics 4 属性

  1. 登录您的 Google Analytics 账户。该帐户应该有所有者访问您的 BigQuery 项目和编辑访问您正在使用的谷歌分析 4 属性。
  2. 进入 Admin 选项卡,找到你需要链接到 BigQuery 的 Analytics 属性
  3. 属性 列中,点击 BigQuery 链接

图片由作者提供

  1. 点击链接

图片由作者提供

  1. 点击选择一个 BigQuery 项目查看您有权访问的项目。要创建新的 BigQuery 项目,请单击了解更多信息

图片由作者提供

  1. 选择你的项目,点击确认

图片由作者提供

  1. 选择一个位置。(如果您的项目已经有一个用于分析属性的数据集,则不能配置此选项。)

图片由作者提供

  1. 点击下一个的*。***
  2. 选择要导出其信息的数据流。

图片由作者提供

如果您需要包含广告标识符,请勾选包含移动应用流的广告标识符

  1. 设置频率 : 每日串流 (连续)输出(您也可以选择这两个选项)。

图片由作者提供

  1. 最后点击提交

图片由作者提供

恭喜你。你将在 24 小时内在你的 BigQuery 项目中看到你的 Google Analytics 4 信息。

下一步是什么?

现在,BigQuery 中已经有了所有关于用户行为的原始数据。然而,要执行营销分析,找到你的增长区域和薄弱点,你需要将广告服务的成本数据、CRM 系统的数据、电话跟踪服务和移动应用程序(如果你使用的话)添加到 GBQ。接下来,将所有这些数据合并到一个数据集中,并使数据为业务做好准备,以便营销人员可以轻松地基于 BigQuery 数据创建报告。

收集和处理所有营销数据的最佳解决方案之一是 OWOX BI Pipeline。它包括从广告服务、CRM、呼叫跟踪服务和线下商店到 BigQuery 的数据,以完成您的数据难题。

图片由作者提供

一旦你有了所有必要的数据,是时候让它为你工作了。通常,这是分析师的任务,但有了 OWOX BI 智能数据,任何人都可以轻松处理 BigQuery 数据。

BigQuery 经常让营销人员感到害怕,而且似乎很复杂,但没有必要担心这一点:有一个解决方案可以帮助您轻松发现营销数据的所有潜力。OWOX BI 可以将它安排在一个根据您的业务调整的模型中,这样即使您根本不知道任何 SQL,您也可以轻松地构建报表。只需使用一个简单的报表生成器或选择一个现成的模板,并在您最喜欢的可视化工具中可视化结果。

图片由作者提供

结论

*您可以轻松地将您的 GA 4 信息导出到 BigQuery。如果新的结构适合你,你可以利用这种渐进的服务,并将其添加到你的营销分析工具箱。通过 OWOX BI Pipeline,您可以从您的网站、广告服务、CRM、线下商店和 BigQuery 中的呼叫跟踪服务收集数据,以完善您的数据。借助 OWOX BI 智能数据,您可以通过构建报告、将多行和多表转换为可操作的见解,以及改进您的决策来让这些数据为您所用。*

如何使用 SQL 从雪花中提取数据可观测性度量

原文:https://towardsdatascience.com/how-to-extract-data-observability-metrics-from-snowflake-using-sql-9bf001038788?source=collection_archive---------16-----------------------

使用这些简单的查询来监控雪花数据管道的健康状况

图片由 Unsplash 上的悉尼·瑞伊提供。

你的团队刚刚将的迁移到了雪花的。你的首席技术官对这个“现代数据堆栈”了如指掌,或者用她的话说:“企业数据发现”但是任何数据工程师都会告诉你,即使是最好的工具也无法将你从破裂的管道中拯救出来。

事实上,您可能已经在比您希望记住的更多的情况下接受了模式更改变坏、重复的表和太多的空值。

好消息是什么?当谈到管理雪花环境中的数据质量时,数据团队可以采取几个步骤来了解数据从接收到使用的健康状况。

这里有一个从雪花中提取数据可观察性度量的五步方法,反过来,离信任您的数据又近了一步:

映射您的雪花库存

出于本教程的目的,让我们假设您在 Snowflake 上有一个名为 ANALYTICS 的数据库(尽管与大多数数据堆栈一样,这种情况很少发生)。要在您的环境中运行以下查询,只需将 ANALYTICS 替换为您希望跟踪的数据库的名称。要列出您帐户中的数据库,您可以运行“显示数据库”。

您的第一步将是映射仓库中的所有表,这样您就知道首先需要跟踪什么。当您这样做时,映射模式可以成为理解每个表中的内容以及这些内容如何随时间变化的强大工具。

以下是如何用雪花做这件事:

该查询将获取所有表的列表以及关于它们的设置的有用元数据。如果您一直致力于用注释来记录数据,那么注释属性会特别有用。

要获取表的模式(了解它的演变过程确实有助于防止和解决数据损坏问题),您可以使用以下查询:

请注意,上面的代码片段将有助于处理表格,但是我们有意省略了视图和外部表格。要提取这些内容的元数据,我们建议使用以下查询:

虽然这可能会增加实现的复杂性,但这些查询将获取在查询information _ schema . tables时无法获得的有价值的信息。例如,您将拥有视图的 text 属性——它将为您的视图提供关于底层 SQL 查询的洞察力。

监控雪花中的数据新鲜度和数据量

跟踪表的数量和新鲜度对于了解管道和数据的整体健康状况极其重要。幸运的是,当对仓库中的表进行写操作时,雪花会跟踪这些信息。您可以使用以下查询获取表的字节数和行数,以及它们最近一次更新的时间:

通过存储这些指标并观察它们如何随时间变化,您可以绘制出表更新的频率、每次更新预期的数据量,最重要的是,确定缺失或异常的更新。

测量视图的新鲜度和容量并不简单,因为它是底层查询中包含的表的函数。至于外部表,我们建议使用来自“显示外部表… ”的新鲜度信息。

构建您的雪花查询历史

在排查问题时,拥有在雪花环境中运行的所有查询的可靠历史记录是一个非常有价值的工具——它可以让您确切地看到最近一次写入表的方式和时间。更广泛地说,对查询日志的分析可以帮助映射血统(表之间的依赖关系),了解哪些用户使用哪些资产,甚至优化雪花实例的性能和成本。

这是我们用来提取查询日志的查询—请注意,我们将过滤掉系统和错误的查询以减少干扰:

您可能还会发现查看复制和加载操作的历史对于理解数据是如何加载和移动的很有价值:

在雪花中检查您最重要的数据的健康状况

最后,对于一些关键表,您可能希望运行数据质量检查,以确保所有字段都正确填充并具有健康的值。通过跟踪一段时间内的运行状况指标并将其与过去的批次进行比较,您可以在数据中出现一系列数据质量问题时立即发现这些问题

你可以这样做:

在本例中,我们正在收集 client_hub 表中两个字段的健康指标。对于字段 account_id ,一个字符串,我们跟踪像完整性(非空值的百分比)、独特性(唯一值的百分比)和 UUID 率(匹配 UUID 格式的记录的百分比)这样的指标。随着时间的推移跟踪这些将有助于识别常见问题,如没有 id 的帐户、重复记录和 id 格式错误。

对于数值字段 num_of_users ,我们跟踪其他类型的指标,如零比率(值为 0 的记录的百分比)、平均值和分位数。随着时间的推移,这些指标可以帮助我们识别常见问题,如导致我们的计数为 0 的缺失数据,或导致我们的用户计数偏离的错误。

为了可伸缩性,请注意我们只跟踪最近的数据(在本例中为 1 天),并假设以前的数据已经被查询和存储。这种做法——以及必要时的采样——将让您高效且经济地跟踪一些大规模数据集。

将它投入生产

当在生产中使用这种方法时,需要记住一些注意事项:

可量测性

跟踪大量的表和大数据集可能会变得很棘手。您需要考虑对您的调用进行批处理,针对规模优化您的查询,进行重复数据删除,规范化各种模式,并将所有这些信息存储在一个可扩展的存储中,以便您能够理解这些信息。这需要构建一个专用的数据管道,由您长期操作、更新和维护。

**专业提示:**别忘了记录你的雪花信用卡消费(你不会想接到首席财务官的电话……)。

覆盖堆栈的其他部分

构建真正可靠的数据管道和实现数据可观察性需要的不仅仅是收集雪花型指标。事实上,随着现代数据堆栈的发展,监视实时流数据、数据湖、仪表板、ML 模型和其他资产的可靠性将变得至关重要。

使这种方法可扩展到雪花之外是一个根本性的挑战,特别是当您的数据堆栈增长到包含额外的技术和数据源时。因为数据可能在管道中的任何地方中断,所以您将需要一种方法不仅从您的仓库中,而且从其他资产中提取指标和元数据。

投资于解决方案,使这些集成彼此之间以及与您的最终用户(无论是您的数据工程师、分析工程师、ML 团队还是数据科学家)和谐相处,应该是重中之重。真正的数据可观察性超越了数据仓库,在破碎的数据滚雪球般变成更大的问题之前,提供对您的湖泊、ETL、商业智能仪表板等中的数据健康状况的洞察。

构建工作流

团队的其他成员需要随时可以获得您获取的信息,特别是当事情发生变化或者您正在对您的数据管道 进行 根本原因分析时。在检测到问题时自动发送通知,并通过一个集中的(易于导航的)用户界面来更好地处理这些工作流,这是快速解决问题和长达数天的数据灾难之间的区别。

这不是星舰企业号(或发现号),但我们希望本教程能为您提供数据信任的基础。

现在,前进并执行 SQL!

有兴趣了解更多?伸出手去 巴尔摩西伊塔布莱 以及剩下的 蒙特卡洛团队。

本文由 Itay Bleier 合著。

用自然语言处理(NLP)从音频文件中提取关键词

原文:https://towardsdatascience.com/how-to-extract-keywords-from-audio-files-with-natural-language-processing-nlp-3084ceb951c9?source=collection_archive---------13-----------------------

HuggingFace Transformers 将语音转换为文本,Spacy 提取关键字

奥列格·伊万诺夫在 Unsplash 上拍照

最新版本的 HuggingFace transformers 引入了一个模型 Wav2Vec 2.0,该模型有可能解决与音频相关的自然语言处理(NLP)任务。而现在,你可以解决的任务之一就是如何从音频中提取关键词。

Wav2Vec 2.0 模型是由脸书人工智能团队发布的自动语音识别模型。当该模型在 10 分钟的转录语音和 53k 小时的未标记语音上训练时,它在有噪语音上的单词错误率(WER)为 8.6%,在干净语音上为 5.2%。Wav2Vec 2.0 的性能在标准 LibriSpeech 基准上进行检验。

点击 了解更多关于wav2 vec 2.0 的信息。

您可以解决的其他 NLP 任务有自动摘要、翻译、命名实体识别、关系提取、情感分析、语音识别、主题分割等。

在本文中,我们将解决的 NLP 任务是从音频中提取文本,然后提取文本的关键字。

让我们将这些任务分成 3 部分。

1.音频预处理

2.从音频预测文本

3.从文本中提取关键词

第一步:音频预处理

最常用的音频格式是 mp3、mp4 和 m4a。但是,Wav2Vec 2.0 模型是在 Wav 格式音频上训练的。因此,它接受 wav 格式作为输入。我使用 Pydub 库来转换不是 wav 格式的格式。

按照下面的代码将音频文件转换成 Wav 格式。

from pydub import AudioSegmentm4a_audio = AudioSegment.from_file(r”dnc-2004-speech.mp3", format=”mp3")m4a_audio.export(“dnc-2004-speech_converted.wav”, format=”wav”)

我的笔记本电脑一次只能处理 3-4 分钟的音频。任何超过 3-4 分钟的音频在处理时都会引发内存不足的错误。

我引用了美国前总统奥巴马先生的讲话。音频长度为 12 分钟。所以,我把 12 分钟的音频分成 4 部分来避免这个错误,每个音频有 3 分钟的长度。之后,我使用该模型从每个音频元素中提取文本。最后,我将所有音频的文本合并成一个段落。

按照下面的代码将大的音频文件分解成较小的文件。

至此,音频预处理部分完成。我们现在将这些文件输入到模型中来预测文本。

那么,让我们执行第二步。

第二步:从音频预测文本

在这一步中,您将使用 Wav2vec 2.0 模型从音频中获取文本。您可以通过循环播放我们之前转换成较小音频文件的音频文件来实现这一点。

在每个循环中,从音频中预测文本,并将其存储到 collection_of_text 变量中。最后,添加 collection_of_text 变量中的所有文本,并将其存储在 final_complete_speech 变量中。

可以使用 transformers 库导入预先训练好的模型 facebook/wav2vec2-base-960h。这个模型在 960 小时的 Librispeech 语音音频上进行了微调。其他型号也可以进行微调或不进行微调,或者提供不同的培训时间。

访问 这里下载 其他型号。

此外,这些模型是在 16Khz 频率音频上训练的。因此,输入音频也应该具有 16 Khz 的频率。

按照这段代码完成第二步。

这样,第二部分就完成了。在最后一部分,你可以从 final_complete_speech 变量中提取关键字。

第三步:从文本中提取关键词

您可以使用各种 python 库来完成这一步。但是最常用的 python 库是 Spacy、Rake、Bert 和 Yake。我更喜欢 spacy 的关键字提取,因为它非常简单易用。使用 Spacy,您只需 4 行代码就可以完成第三步。

还有,你可以参考 这篇文章 来使用其他的关键词提取方法。

按照这段代码从文本中提取关键字。

# use this code to install Spacy, Scispacy and en_core_sci_scibert model
# pip install -U pip setuptools wheel
# pip install -U spacy
# pip install scispacy
# pip install [https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.4.0/en_core_sci_scibert-0.4.0.tar.gz](https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.4.0/en_core_sci_scibert-0.4.0.tar.gz)import spacy
nlp = spacy.load(“en_core_sci_scibert”)
doc = nlp(final_complete_speech.lower())
print(doc.ents)

结论

随着变形金刚库的完善,NLP 领域也在不断发展。Wav2Vec 2.0 模型是脸书人工智能团队和 HuggingFace 团队的重大成功之一。现在,你可以用很低的 WER 成功地从音频中提取抄本。

可以解决自动文摘、翻译、命名实体识别、关系抽取、情感分析、语音识别、话题分割等。,与音频相关的 NLP 任务。

希望这篇文章能帮助你解决与音频相关的关键词提取任务。

如何从自然语言数据中提取标注主题

原文:https://towardsdatascience.com/how-to-extract-labelled-topics-from-natural-language-data-8af121491bfd?source=collection_archive---------28-----------------------

西格蒙德在 Unsplash 上拍照

假设您的项目中有大量难以处理的自然语言数据。也许你刮了它,做了 101 个 API 调用,或者其他人把它送给了你。

很自然,你想看看里面是什么。但是真的很大吗?因此,这就是主题建模的用武之地,它可以帮助从自然语言数据集中提取排名前 n 的主题。

但是你知道主题实际上是什么是非常重要的,对吗?你不只是想让他们成为话题 1、话题 2 等等。另外,如果你完成后能把这个转换成一些时髦的视觉效果就更好了。

但是,嘿,不是已经有很多关于主题建模的教程了吗?有,有!但是根据我的经验,他们很少关注让输出更加用户友好和易于理解。虽然像 PyLDAvis 这样的库对于在 Jupyter 笔记本中详细探索自然语言主题来说是非常棒的,但它们不太能与非技术同事或利益相关者共享。

这就是我这篇文章想要解决的问题。我将讨论主题建模一个混乱的自然语言数据集,你可能会在一个网络抓取项目中得到这种数据集。到我们完成的时候,希望我的 python 函数会有意义,你可以复制、粘贴和调整它们到你自己的项目中。

数据准备

在整篇文章中,我将使用来自 Kaggle 的数据。这是 Twitter 上关于客户支持问题的推文集合,所以这是一个非常混乱的自然语言数据集,其中有许多不同的主题。

首先要做的是读入数据并清理它。

在检查了没有丢失数据的行之后,我使用了一个非常有用的 tweets 预处理库,您可以在用语法import preprocessor as p导入之前用pip install tweet-preprocessor安装它。这有助于快速删除表情符号、网址和其他噪音;然而,我避免删除标签,因为我想保留文本数据。所以我只是保持简单,在清理文本的函数中调用text.replace("#", "")

为主题建模

现在转到主题建模,我已经用一种非常简单的方式完成了,因为这是一个很大的领域,并不是本文的重点!

简而言之,我使用了一个简单的计数矢量器来生成一个令牌计数矩阵,即不同的重要单词在我们正在分析的文本中出现了多少次。我还明确表示,我感兴趣的是两到三个单词的配对,而不仅仅是单个单词。

这意味着在“快速棕色狐狸跳过懒狗”这句话中,“棕色”不能算作象征,但“快速棕色”或“狐狸跳过”可以。我这样做是因为我认为这将有助于理解客户支持中的主题;例如,“电子邮件支持”而不仅仅是“支持”是否经常与特定的公司或软件搭配使用?

接下来,我将使用 LDA 模型来尝试查看正文中的主题。这里有一篇非常好的文章和一些相应的论文,关于这是如何工作的,,如果你打算使用这个模型,我鼓励你去读一读!但是在一个非常简单的层面上,这实质上是将单词——或者在我们的例子中是成对的单词——分组到主题中,基于它们是那些主题的成员的概率。

现在已经完成了,是时候解释输出了!

创建主题关键词

这就是代码变得更加繁重和复杂的地方。下一个 Jupyter 笔记本片段将完成以下步骤:

  1. 创建一个通用的工具函数来展平列表。这有助于从 LDA 模型对象中获取数据。
  2. 一个write_data函数,它从我之前使用的 CountVecotrizer 中获取清晰可读的数据,将大量文本转换为感兴趣的令牌矩阵,并从 LDA 模型中获取。我也把这个信息写到文件里了。
  3. 一旦完成,我们就可以读入数据并使用 groupby 来查看哪些主题与哪些词对相关联。这通常比看起来要简单得多——主题并不总是出现在你面前,可能需要对矢量器和建模参数进行一些调整才能做到这一点。虽然这看起来很烦人,但我认为这实际上是一件非常好的事情——您可以手动检查输出,以确保模型挑选出真正有意义的主题。
  4. 完成后,我为主题创建了一些更容易理解的名称,并将它们写入数据框架。请注意,scikitlearn 的输出只是任意编号的主题,即主题 1、主题 2、主题 3 等等。这就是我们要替换的。
  5. 然后,我用 Seaborn 制作了一个非常简单的条形图来说明到目前为止所做的工作。但是你可以制作更具视觉吸引力的图表——见下文。

用图表表示出来

为了可视化你的结果,我强烈推荐原始图表。它非常易于使用,可定制性强,非常漂亮。

举例来说,你可以使用与制作上面非常技术性的 Seaborn 图完全相同的数据,来制作这个冲积图。

结论

总结一下,一旦你完成了建模,手动提取主题实际上并不难。这有点复杂,但在我看来这不是坏事,因为它迫使你详细解释建模的结果,而不是过度依赖计算机。

一旦你把数据也拿出来了,你就可以用任何你喜欢的方式来绘制它。以我的经验来看,如果你要向利益相关者做演示,并且想要完全控制演示的效果,这就大不一样了。

希望这将有助于向他人展示你的作品,让他们更容易理解,反过来也让你更欣赏!

如何在 Python 中提取 PDF 数据

原文:https://towardsdatascience.com/how-to-extract-pdf-data-in-python-876e3d0c288?source=collection_archive---------4-----------------------

Adobe 在没有订阅的情况下很难做到这一点,但这应该会有所帮助

由 Unsplash 上的 iMattSmart 拍摄的照片

出于某种原因,pdf 仍然在行业中一直使用,它们真的很烦人。尤其是当你没有为某些订阅付费来帮助你管理它们的时候。这篇文章是为那些处于那种情况的人写的,那些需要免费从 pdf 获取文本数据的人。

首先,如果你想分析手写文本,这篇文章是错误的——但它很快就会出现。

该过程包括将 PDF 转换为。然后通过正则表达式和其他简单的方法提取数据。

如果你没有读过我的文章关于自动化你的键盘将 pdf 转换成。txt 群发,那么我建议你先这样做。这会节省你很多时间。如果你不想点击离开,那么这里的所有代码做到这一点。

作者写的代码——可以在这里下载:https://gist.github.com/jasher4994

转换为。txt 然后从字里行间读出

既然你已经皈依了。txt 文件,你所要做的就是写一些代码,找出你想要的答案。

当翻译成。txt 文件,输出可能会有点滑稽。有时问题周围的文本可以在响应框的上方,有时可以在下方。我不确定这是否有技术上的原因,或者只是为了让做这样的事情更加困难。

诀窍是在文本中寻找常量,并隔离它们。

不管怎样,都有解决的办法。我们只想要答案,并不关心它们周围的文字。幸运的是当转换成。txt 文件,我们所有的所有输入部分都在新的一行开始。正如我们所知,如果我们试图提取的所有事物都有一个不变的因素,那么我们的生活就会轻松很多。

因此,我们可以读取我们的。用 open()和 read()将 txt 文件转换成 Python,然后对它使用 splitlines()。这将提供一个字符串列表,每当原始字符串中出现一个换行符(\n)时,就会开始一个新的实例。

import os
os.chdir(r"path/to/your/file/here")
f = open(r"filename.txt", "r")
f = f.read()
sentences = f.splitlines()

正如承诺的那样,这会给你一个字符串列表。

但是,如前所述,这里我们只对用户输入感兴趣。幸运的是,还有另一个决定性因素可以帮助我们隔离输入。所有的输入,以及从新的一行开始,都以一对括号开始。这些括号内的内容定义了输入的类型。例如,文本部分应该是

(text)James Asher

一个复选框是

(checkbox)unchecked

其他例子包括“单选按钮”和“组合按钮”,大多数 PDF 输入都是这四种类型。

然而,偶尔会有随机的以括号开头的部分或句子,所以您可以使用 set(sentences)来仔细检查。在我的例子中,只有 5 个不同类型的问题,我想包括在内,所以使用下面的列表理解来删除所有其他内容。

questions = ["(text", "(button", "(:", "(combobox", "(radiobutton" ]sentences= [x for x in sentences if x.startswith(tuple(questions))]

现在,您将拥有一份针对您的问题的所有输入/答案的列表。只要你使用相同的 PDF,这个列表的结构将保持不变。

我们现在可以简单地把它转换成熊猫的数据帧,做一些处理,然后输出成我们想要的任何格式。

不全是。txt 文件像这样从 pdf 中输出,但大多数都是这样。如果您的没有,那么您必须使用 regex 并在您的特定文档中查找常量。但是一旦你编写了从一个文档中提取它的代码,只要它们是同类的,它对你所有的文档都是一样的。

从字符串列表中提取数据

提取文本很容易。在这种情况下,我需要做的就是删除前面的括号。这可以通过列表理解和一些正则表达式轻松完成。

list_strings = [re.sub(r"\([^()]*\)", "", x) for x in list_strings]
df = pd.DataFrame(list_strings)
df.to_excel("output.xlsx")

输出如下所示。

使用 Python 提取 PDF 数据的输出

然后,您可以简单地在所有。txt 文件并与熊猫合并在一起。然后,您可以根据需要旋转或清洁。

您现在有了一个可用的 excel(或 CSV)文件,它存储了所有 pdf 中的所有数据。几乎所有这些代码都是可重用的,您只需确保如果您尝试使用新的一批不同的 pdf,它们会在转换为时转换为类似的布局。txt 文件。

希望这有所帮助。

If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)

如果你喜欢这篇文章,请看看我的其他文章。

干杯,

詹姆斯

如何在 BigQuery 中从 Google Analytics 4 和 Firebase 中提取实时日内数据

原文:https://towardsdatascience.com/how-to-extract-real-time-intraday-data-from-google-analytics-4-and-firebase-in-bigquery-65c9b859550c?source=collection_archive---------11-----------------------

并始终为您的自定义报告提供最新数据

杰西卡·路易斯在 Unsplash 上的照片

如果您是一名 FirebaseGoogle Analytics 4 用户,并且您已经将数据导入到您的 BigQuery 数据仓库中,那么您可能想要创建实时定制报告,其中包含您在日内模式中的数据。问题是,这个整合的数据集每天都在被谷歌自动删除。因此,如果您选择将它作为数据源连接到您在Google Data Studio中的报告,第二天您将找不到它。

作者图片💡迈克·沙克霍米罗夫

例如,我想在我们用 Data Studio 构建的 BI 解决方案中对日内表进行实时分析。由于它经常被删除,我无法将它作为数据集连接到谷歌数据工作室。此外,当它被删除时,它不再是一个分区表,您不能使用通配符后缀进行日期查询。

说到这里,我需要以下内容:

  1. 日内表不应该自动删除。我想手动操作。
  2. 由于此 Firebase 日常数据导出/集成功能的存在。我想集成数据传输将在一个小时内保证第二天交付。

我相信这是一个很普遍的问题。

作者图片💡迈克·沙克霍米罗夫

我已经向谷歌工程提出了一个功能请求,以在需要时启用手动删除,但在写这篇文章时,它仍在进行中*。*

“日内表不应该自动删除。我们希望手动操作。”

虽然这可能需要一段时间。因此,这里有一个解决方案来克服这个问题。

如何从日内表中提取数据

理想情况下,您会希望运行一个调度脚本,其中参数是当天表格的日期后缀。

然而事情没那么简单……

日内表被自动删除

所以你不知道安排剧本的确切时间。或者,您可以使用 daily export 表,但是同样,您必须等到提取准备就绪。我一直在寻找关于日内表删除时间的信息,我发现过去一天的日内表可能还存在几个小时。原因之一是处理大量数据需要更多时间 Stackoverflow 。因此,删除过去的表没有固定的时间,但一般来说,它在新的一天之后的几个小时内仍然存在。您在 GA 中设置的时区也会对此产生影响。

无法在 BigQuery 脚本中使用表名参数。

BigQuery 脚本是一个强大的工具,但目前(2021–11–20)谷歌的 BigQuery 脚本不能使用表名参数。根据 BigQuery 文档中的参数化查询]5,查询参数不能用于 SQL 对象标识符

参数不能替代标识符、列名、表名或查询的其他部分。

第一步。检查原始日内表是否存在

如果数据存在,您可能希望使用此脚本返回true:

第二步。创建一个 BigQuery SQL 脚本(如果存在,执行一些操作,例如插入)

然后,将执行更新的脚本添加到您的程序中:

第三步。决定如何处理新的日内表副本的 INSERT 语句

您可以:

  • 用新数据替换整个表
  • 仅为所选列添加新记录

复制和替换当天事件表

这个脚本将复制整个表:

您可能希望使用与复制和替换日内事件表相同的 SQL 脚本,但是将复制和替换查询更改为选择和插入查询。让我们创建这个脚本来完成以下任务:

解决方案:

结论

日内 表与 日内 会话表相比可能会有细微的差异,但您无需等待。这些差异是由以下原因造成的:

  • Google Analytics 允许最多晚发送四个小时的点击,在请求数据时,这些点击可能在当天的表中不可用。
  • Google 在收集点击量之后和将数据导出到 BigQuery 之前执行一些数据处理。一般受影响的领域是流量来源和链接的营销产品(AdWords,Campaign Manager 等。)

一般来说,如果这些字段对您的数据堆栈没有任何影响,这是通过与 FirebaseGoogle Analytics 4 集成来提高**数据可用性*** 的解决方案。*

资源

原载于【https://mydataschool.com】https://mydataschool.com/blog/how-to-extract-real-time-intraday-data-in-firebase-and-bigquery/。****

如何用 KeyBERT 提取相关关键词

原文:https://towardsdatascience.com/how-to-extract-relevant-keywords-with-keybert-6e7b3cf889ae?source=collection_archive---------3-----------------------

伯特的另一个应用

作者图片

有很多强大的技术可以执行关键词提取(例如 Rake , YAKE !, TF-IDF )。然而,它们主要基于文本的统计属性,并不一定考虑整个文档的语义方面。

KeyBERT 是一个简单易用的关键字提取技术,旨在解决这个问题。它利用了 BERT 语言模型,并依赖于🤗变形金刚图书馆。

来源:https://github.com/MaartenGr/KeyBERT

KeyBERT 由 Maarten Grootendorst 开发和维护。所以,如果你有兴趣使用它,就去看看他的回购(并克隆它)。

在这篇文章中,我将简要介绍 KeyBERT :它是如何工作的,以及你如何使用它

PS:如果想看如何使用 KeyBERT 以及如何嵌入到 Streamlit app 中的视频教程,可以看看我的视频:

作者视频

KeyBERT:一种基于 BERT 的关键词提取技术

你可以用 pip 安装 KeyBERT。

pip install keybert

如果您需要其他来源的嵌入🤗变压器,你也可以安装它们:

pip install keybert[flair]
pip install keybert[gensim]
pip install keybert[spacy]
pip install keybert[use]

调用 KeyBERT 很简单:根据🤗变形金刚建模并对其应用extract_keywords方法。

来源:https://github.com/MaartenGr/KeyBERT

KeyBERT 如何提取关键词?

KeyBERT 通过执行以下步骤提取关键词:

1-使用预训练的 BERT 模型嵌入输入文档。你可以选择任何你想要的伯特模型🤗变形金刚。这将文本块转换成固定大小的向量,表示文档的语义方面

2-使用单词包技术(如 TfidfVectorizer 或 CountVectorizer)从同一文档中提取关键字和表达式(n 元语法)。这是一个经典步骤,如果您过去执行过关键词提取,您可能会很熟悉

作者图片

3-然后将每个关键字嵌入到固定大小的向量中,使用与嵌入文档相同的模型

作者图片

4-既然关键字和文档在同一空间中表示,KeyBERT 计算关键字嵌入和文档嵌入之间的余弦相似性。然后,提取最相似的关键字(具有最高的余弦相似性得分)。

作者图片

这个想法非常简单:您可以把它看作是经典关键字提取技术的增强版本,其中 BERT 语言模型加入了它的语义功能。

这还不止于此 : KeyBERT 包括两种方法来在结果关键字中引入多样性。

1 —最大相似度总和(MSS)

要使用这个方法,首先要将 top_n 参数设置为一个值,比如 20。然后从文档中提取 2 个 top_n 关键词。计算这些关键词之间的成对相似度。最后,该方法提取彼此最不相似的最相关的关键词。

这里有一个来自 KeyBERT 知识库的例子:

来源:https://github.com/MaartenGr/KeyBERT

2 —最大边际相关性(MMR) 这种方法与前一种相似:它增加了一个多样性参数

在文本摘要任务中,MMR 试图最小化冗余并最大化结果的多样性。

它从选择与文档最相似的关键词开始。然后,它迭代地选择既与文档相似又与已经选择的关键词不相似的新候选

您可以选择低差异阈值:

来源:https://github.com/MaartenGr/KeyBERT

或者一个高的:

来源:https://github.com/MaartenGr/KeyBERT

到目前为止还不错,但是…

不过,KeyBERT 可能会遇到的一个限制是执行时间:如果您有大型文档并需要实时结果,KeyBERT 可能不是最佳解决方案(除非您的生产环境中有专用的 GPU)。原因是 BERT 模型是出了名的庞大,并且消耗大量资源,尤其是当它们必须处理大型文档时。

您可能会找到一些技巧来加快推断时间,方法是选择较小的模型(DistilBERT),使用混合精度,甚至将您的模型转换为 ONNX 格式。

如果这仍然对你不起作用,检查一下其他经典方法:尽管它们相对简单,但你会对它们的效率感到惊讶。

感谢阅读!

今天到此为止。如果您正在执行关键词提取,我希望您会发现这个小方法对您的 NLP 项目有用。

你可以在这里了解更多关于 KeyBERT 的信息:

https://github.com/MaartenGr/KeyBERT

还有这里:

https://www.preprints.org/manuscript/201908.0073/v1

保重,

新到中?您可以每月订阅 5 美元,并解锁无限的文章— 点击此处。

如何通过 Python 空间从文本中提取结构化信息

原文:https://towardsdatascience.com/how-to-extract-structured-information-from-a-text-through-python-spacy-749b311161e?source=collection_archive---------4-----------------------

文本分析

关于如何从文本构建结构化数据集的现成教程。

图片来自 Pixabay 的 Gerd Altmann

在本教程中,我将演示如何从文本构建数据集。作为一个例子,我考虑出生登记,其中包含以下文本:

On August 21 1826 a son was born to John Bon and named him Francis.
On June 11 1813 a daughter was born to James Donne naming her Mary Sarah.
On January 1 1832 a son was born to his father David Borne and named him John.

文件的每一行都包含出生登记。所有出生登记的结构几乎相同,尽管在一些细节上有所不同。寄存器存储在名为register.txt的 txt 文件中。

在本教程中,我一步一步地描述了如何提取父亲的名字和姓氏、孩子的名字、出生日期和孩子的性别。

我按照以下步骤提取信息:

  • 将文本转换成一个pandas数据帧,其中每一行对应寄存器的一行
  • 分析典型句子的结构,以提取词性。
  • 提取所有需要的信息。

对于最后两步,我利用了 SpaCy 库,这是一个用于自然语言处理的 Python 库。

从文本到数据帧

首先,我从文件系统中打开文本,逐行分割,并将每一行存储为一个列表项:

with open('register.txt', 'r') as f:
    text = [line for line in f.readlines()]

然后,我用创建的列表构建一个pandas数据框架:

import pandas as pddf = pd.DataFrame(text,columns=['text'])
df.head()

作者图片

词性分析

现在我以第一句话为例,进行基本的自然语言处理。这可以通过spaCy库的nlp()功能来完成。我导入了en_core_web_sm词库,可以通过下面的命令安装:python -m spacy download en_core_web_smspaCy库支持许多语言,它们的词典可以通过相同的命令安装。

一旦安装了词典,我就导入并加载它。然后,我可以执行 NLP 处理。

import en_core_web_sm
import spacytext = df['text'][0]nlp = en_core_web_sm.load()
doc = nlp(text)

doc变量包含所有被处理的信息。在我的例子中,我只需要 PoS,提取如下:

features = []
for token in doc:
    features.append({'token' : token.text, 'pos' : token.pos_})

对于句子中的每个标记,我保存标记及其位置。我将结果附加到一个名为features的列表中。现在,我可以用提取的特征构建一个数据框架。这样做只是为了以更有序的方式显示结果:

fdf = pd.DataFrame(features)
fdf.head(len(fdf))

作者图片

我注意到父亲(约翰·邦)被标记为 PROPN,这意味着一个人的名字,它的前面是单词,后面是单词和。对于数据集中的所有句子来说,最后一点并不正确,因此我还必须考虑其他句子的结构,这将在后面解释。

这个孩子也被认为是一个 PROPN,后面总是跟一个点,前面是单词 himher

提取父亲

现在我可以建立一个模式,提取父亲的名字和姓氏。我定义了两个变量first_tokenslast_tokens,它们分别包含所有句子中的前置词和后置词:

first_tokens = ['to', 'father']
last_tokens = ['and', 'naming']

我定义了能识别父亲的模式:

pattern_father = [[{'LOWER' : {'IN' : first_tokens}},
           {'POS':'PROPN', 'OP' : '+'},
           {'LOWER': {'IN' : last_tokens}} ]]

我说父亲必须以前面单词中的一个单词开始(没有匹配的大小写),然后我搜索 PROPN(一次或多次),最后我搜索下面单词中的一个。

我定义了以下函数:

from spacy.matcher import Matcherdef get_father(x):
    nlp = en_core_web_sm.load()
    doc = nlp(x)
    matcher = Matcher(nlp.vocab) 
    matcher.add("matching_father", pattern_father) matches = matcher(doc)
    sub_text = ''    
    if(len(matches) > 0):
        span = doc[matches[0][1]:matches[0][2]] 
        sub_text = span.text
    tokens = sub_text.split(' ')

    name, surname = tokens[1:-1]
    return name, surname

这个函数利用了spaCy Matcher()类,该类搜索先前定义的模式。如果我找到一个匹配,我从匹配中删除第一个和最后一个单词,并返回结果。

现在我利用 dataframe apply()函数来计算数据集中每个文本的父亲:

new_columns = ['father name','surname']
for n,col in enumerate(new_columns):
    df[col] = df['text'].apply(lambda x: get_father(x)).apply(lambda x: x[n])

作者图片

救出孩子

提取每个孩子的过程与提取父亲的过程非常相似。因此,首先,我定义了第一个和最后一个标记以及模式:

first_tokens = ['him', 'her']
last_tokens = ['.']
pattern_son = [[{'LOWER' : {'IN' : first_tokens}},
           {'POS':'PROPN', 'OP' : '+'},
           {'LOWER': {'IN' : last_tokens}} ]]

然后我定义了提取孩子的函数:

def get_child(x):
    nlp = en_core_web_sm.load()
    doc = nlp(x)
    matcher = Matcher(nlp.vocab) 
    matcher.add("matching_son", pattern_son)matches = matcher(doc)
    sub_text = ''    
    if(len(matches) > 0):
        span = doc[matches[0][1]:matches[0][2]] 
        sub_text = span.text
    # remove punct
    sub_text = sub_text[:-1]
    tokens = sub_text.split(' ')

    return ' '.join(tokens[1:])

请注意,上一个函数的最后一行允许提取复合名称。

最后,我利用apply()函数来计算每个孩子:

df['child'] = df['text'].apply(lambda x: get_child(x))

作者图片

提取日期

现在我定义一个提取日期的函数。在这种情况下,我没有利用spaCy库。我对句子进行了标记,我注意到日期总是从第二个标记(月)开始,到第四个标记(年)结束。我将月份从字符串转换成数字。此外,我以 YYYY-MM-DD 格式返回日期。

def get_date(x):
    months={"January":"01","February":"02","March":"03","April":"04","May":"05","June":"06",
            "July":"07","August":"08","September":"09","October":"10","November":"11","December":"12",}
    tokens = x.split(" ")
    # month
    month = months[tokens[1]]
    # day
    day=tokens[2]
    if(len(day)==1):
        day="0"+day

    # year
    year = x.split(" ")[3]

    return (year+"-"+month+"-"+day)

我将定义的函数应用于数据帧:

df['date'] = df['text'].apply(lambda x: get_date(x))

作者图片

提取性别

最后,我通过利用下面的想法来提取性别:如果句子包含单词 son,则孩子是男性,否则她是女性:

def get_gender(x):
    if 'son' in x:
        return 'M'
    return 'F'
df['gender'] = df['text'].apply(lambda x: get_gender(x))

作者图片

数据集可以导出为 CSV 文件:

df.to_csv('structured_register.csv')

摘要

在本教程中,我演示了如何从非结构化文本中提取结构化信息。我利用了spaCy库的两个函数:nlp(),用于执行 NLP,以及Matcher(),用于在字符串中搜索模式。

spaCy库非常强大,因此如果您想了解其他提供的特性,请继续关注;)

本教程的完整代码可以从我的 Github 库下载。

如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。

相关文章

https://medium.com/geekculture/the-top-25-python-libraries-for-data-science-71c0eb58723d

如何使用 Python 熊猫和 tabula-py 从 PDF 中提取表格

原文:https://towardsdatascience.com/how-to-extract-tables-from-pdf-using-python-pandas-and-tabula-py-c65e43bd754?source=collection_archive---------4-----------------------

数据收集

一个从 PDF 中提取重复表格的快捷脚本

图片来自 Pixabay 的免费照片

这篇教程是我上一篇文章的改进,在那篇文章中,我在没有 Python pandas的情况下提取了多个表。在本教程中,我将使用与我上一篇文章中相同的 PDF 文件,不同之处在于我使用 Python pandas处理提取的表格。

本教程的代码可以从我的 Github 库下载。

几乎所有被分析的 PDF 文件的页面都具有以下结构:

作者图片

在页面的右上角有意大利地区的名称,而在页面的右下角有一个表格。

作者图片

我想提取所有页面的区域名称和表格。我需要提取两个表格的边界框。测量边距的完整程序在我的上一篇文章的定义边距一节中有说明。

该脚本实现了以下步骤:

  • 定义边界框,它通过一个如下形状的列表来表示:[top,left,bottom,width]。边界框内的数据用厘米表示。它们必须转换成 PDF 点,因为tabula-py需要这种格式。我们设定转换因子fc = 28.28
  • 使用read_pdf()功能提取数据
  • 将数据保存到pandas数据帧。

在这个例子中,我们扫描 pdf 两次:第一次提取地区名称,第二次提取表格。因此,我们需要定义两个边界框。

提取区域名称

首先,我定义边界框来提取区域:

box = [1.5, 22,3.8,26.741]
fc = 28.28

for i in range(0, len(box)):
    box[i] *= fc

然后,导入tabula-py库,我们定义必须从中提取信息的页面列表,以及文件名。

import tabula as tbpages = [3,5,6,8,9,10,12,14,16,18,22,24,26,28,30,32,34,36,38,40]
file = “source/Bolletino-sorveglianza-integrata-COVID-19_17-marzo-2020_appendix.pdf”

现在我可以从 pdf 中读取地区列表。我使用了read_pdf()函数,我们将输出格式设置为json

regions_raw = tb.read_pdf(file, pages=pages,area=[box],output_format="json")

我注意到生成的输出非常复杂。然而,通用结构在位置regions_raw[i]['data'][0][0]['text']包含第 I 个区域的区域名称。通过循环进入region_raw列表,我建立了一个包含所有地区的列表。

regions = []
for i in range(0,len(regions_raw)):
    regions.append(regions_raw[i]['data'][0][0]['text'])

提取第一页的表格(皮德蒙特地区)

我定义了边界框,我们将转换因子fc的每个值相乘。为了理解这个机制是如何工作的,首先,我提取第一页的表格,然后我们推广到所有的页面。在此示例中,第一页对应于第 3 页。

box = [8,10,25,26]
for i in range(0, len(box)):
    box[i] *= fc

现在我可以看 pdf 了。在这种情况下,我将output_format设置为DataFrame。结果存储在tl中,这是一个列表。我可以简单地用tl[0]把它转换成数据帧。

page = 3
tl = tb.read_pdf(file, pages=page,area=[box],output_format="dataframe", stream=True)
df = tl[0]
df.head()

作者图片

我注意到列名是错误的。另外,前三排都是错的。出于这个原因,我可以使用 dataframe 函数rename()来重命名列名。

df.rename(columns={ df.columns[0]: "Fascia d'età" , df.columns[1]: "Casi"}, inplace = True)
df.head()

作者图片

现在我可以使用dropna()函数删除前两行。

df = df.dropna()
df.head()

作者图片

我可以通过选择不包含该值的所有行来删除新的第一行。

df = df[df["Fascia d'età"] != "Fascia d'età"]
df.head(8)

作者图片

现在我向df添加一个新列,称为Regione,它包含地区名称。我扫描pages列表来提取当前区域的索引。

region_column = []
for i in range(0, len(df)):
    index = pages.index(page)
    region_column.append(regions[index])df['Regione'] = region_column
df.head()

作者图片

提取所有页面

现在我可以概括前面的代码来提取所有页面的表格。首先,我构建了一个空的DataFrame,它将包含所有区域的值。我将使用pd.concat()函数连接所有页面的所有表格。我扫描了包含在pages列表中的所有页面。

import pandas as pd
df = pd.DataFrame()
for page in pages:

    index = pages.index(page)
    region = regions[index]
    print(region)

    tl = tb.read_pdf(file, pages=page,area=[box],output_format="dataframe", stream=True)

    dft = tl[0]
    dft.rename(columns={ dft.columns[0]: "Fascia d'età", dft.columns[1]: "Casi"}, inplace = True)

    region_column = []
    for i in range(0, len(dft)):
        region_column.append(region)
    dft['Regione'] = region_column

    df = pd.concat([df, dft])

与前面的情况类似,我丢弃了所有错误的记录。

df.dropna(inplace=True)
df = df[df["Fascia d'età"] != "Fascia d'età"]

将结果保存到 CSV

现在,我可以将结果保存为 csv 文件。

df.to_csv('output.csv')

摘要

在本教程中,我演示了如何将多个 PDF 表格转换成一个单独的pandas DataFrame并将其导出为一个 CSV 文件。

该过程包括三个步骤:定义边界框,通过tabula-py库提取表格,并将它们导出到一个 CSV 文件。

如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。

相关文章

https://medium.com/analytics-vidhya/how-to-extract-multiple-tables-from-a-pdf-through-python-and-tabula-py-6f642a9ee673 https://alod83.medium.com/how-to-extract-data-from-a-search-engine-through-python-and-selenium-35dfe6b20db

新到中?您可以每月订阅几美元,并解锁无限的文章— 单击此处。

如何使用 Tesseract OCR 引擎和 Python 从图像中提取文本

原文:https://towardsdatascience.com/how-to-extract-text-from-images-using-tesseract-ocr-engine-and-python-22934125fdd5?source=collection_archive---------4-----------------------

从 100 多种语言中选择

照片由上的面拍下

W 帽子是宇宙魔方?这是一个开源的 OCR(光学字符识别)引擎,可以识别超过 100 种支持 Unicode 的语言。此外,它可以被训练识别其他语言。OCR 引擎可以通过数字化文档而不是手动键入文档内容来节省时间。在这篇文章中,您将学习如何使用 Tesseract OCR 引擎和 Python 从图像中提取文本。

设置

对于设置,我将使用 Tesseract OCR 引擎、 Python 和 macOS。首先,我们需要安装宇宙魔方 OCR 引擎。在终端中键入以下命令。

brew install tesseract

您可以使用以下命令来查看您的计算机上运行的是哪个版本的 Tesseract。

tesseract --version

使用以下命令列出 Tesseract OCR 引擎的可用语言。

tesseract --list-langs

在这种情况下,我有三种语言。

eng   #English
osd   #Special data file for orientation and script detection
snum  #Serial number identification

如果你想下载额外的语言,你可以从这里得到。我将下载孟加拉语的列车数据。一旦下载到您的机器上,您需要将该文件移动到以下文件夹中。

/usr/local/Cellar/tesseract/4.1.1/share/tessdata/

现在从这里安装 Python,如果你还没有的话。之后,我们将安装 Python-tesseract ,这是 Tesseract OCR 引擎的包装器。还有,我们需要安装一个 Python 映像库枕头。在终端中键入以下命令。

pip install pytesseract
pip install Pillow

出于演示的目的,我创建了一个 GitHub 库,你可以从这里获得。在存储库中,我包含了两张英语和孟加拉语的测试图片。此外,我有一个名为main.py的 Python 脚本。让我们来分解一下main.py文件中的个人贫困人口。

main.py

这里我创建了一个方法process_image,它将图像名称和语言代码作为参数。在方法内部,我使用了一个 pytesseract 方法image_to_string,它以字符串形式从 Tesseract OCR 返回未修改的输出。此外,我还添加了两个助手方法。print_data方法打印字符串输出,output_file方法将字符串输出写入文本文件。下面,我得到了字符串输出。

test_eng.png 文件的输出。

_ The'quick brown fox' .
-jumps over the lazy:
dog.

test_ben.png 文件的输出。

পথের দেবতা প্রসন্ন হাসিয়া বলেন-মূর্খ বালক, পথ তো
আমার শেষ হয়নি তোমাদের গ্রামে, বাশের বনে, ঠ্যাঙাড়ে
'বীরু রায়ের বটতলায় কি ধলচিতের খেয়াঘাটের সীমানায়.
তোমাদের সোনাডাঙা মাঠ ছাড়িয়ে ইচ্ছামতী পার হয়ে
পদ্মফুলে ভরা মধূখালি বিলের পাশ কাটিয়া বেত্রবতীর
খেয়ায় পাড়ি দিয়ে, পথ আমার চলে গেল সামনে, সামনে,
'শুধুই সামনে...দেশ ছেড়ে দেশান্তরের দিকে, সূর্যোদয় ছেড়ে
সূর্যাস্তের দিকে, জানার গন্ডী এড়িয়ে অপরিচয়ের উদ্দেশে.

包裹

文档数字化使机器可读。例如,我们可以转换重要的扫描文档来执行搜索、翻译和文字处理。另外,我们可以用它来自动接收和识别车牌。OCR 的潜力是无穷的。

查看我关于 Python 的其他帖子。

如何使用 Python 和 Google Cloud Vision API 从 pdf 中提取文本

原文:https://towardsdatascience.com/how-to-extract-the-text-from-pdfs-using-python-and-the-google-cloud-vision-api-7a0a798adc13?source=collection_archive---------0-----------------------

今年冬天,我发现韦尔斯利学院(Wellesley College)有超过 100 年的课程目录、招生指南和年度公告。我立即被从这些文档中提取的迷人数据的潜力所吸引,但第一步必须将它们转换为文本,因为没有多少分析方法可以在旧的棕色 pdf 扫描上运行。

因此,我开始寻找一种方法,既能快速有效地对大量 PDF 文件运行 OCR,又能尽可能保持格式和准确性。在尝试了几种方法之后,我发现使用 Google Cloud Vision API 产生了迄今为止我尝试过的所有公开可用的 OCR 工具中最好的结果。

由于我找不到任何单一的、全面的指南来使用这个神奇的工具运行简单的 OCR 应用程序,所以我决定写这一篇,这样任何具有一点编程知识的人都可以使用这个奇妙的工具。

按照这些说明你需要什么

  • 在您的计算机上安装 Python 3 和 pip
  • 用于编辑代码的文本编辑器—我使用 Visual Studio 代码
  • 一种在你的电脑上运行 Python 程序的方法。
  • 您还需要一种支付方式来进入您的 Google Cloud 帐户,尽管您不需要花任何钱来完成本教程。借记卡、信用卡或谷歌钱包账户都可以。

设置您的 Google Cloud Vision 帐户

为了使用谷歌云视觉运行光学字符识别,您首先需要有一个谷歌帐户。这将允许您登录谷歌的云服务仪表板。从该控制面板可以访问的众多服务之一是文件存储,我们将使用它来托管我们将转换为文本的 PDF 文件。

因为我们将通过 Cloud Vision API 访问的高级机器学习算法在云中运行,所以我们需要将我们的 PDF 上传到 Google 托管的文件“桶”中,以便可以访问它。

本教程将向您展示如何将最终结果(包含 PDF 中所有文本的文本文件)写入您计算机上的某个位置。

  1. 如果您尚未登录谷歌帐户,请前往google.com登录或创建一个帐户。我假设我的读者在这一步不需要进一步的指导。
  2. 一旦你登录到你的谷歌账户,跟随这个链接到你的谷歌云仪表板。如果要求您接受服务条款,请接受。你应该登陆一个看起来像这样的页面。

谷歌云平台仪表板

3.点击图标右边的下拉菜单,上面写着谷歌云平台。我的写着“OCR 测试”,这是我当前打开的项目的名称,但你的会说一些不同的东西。将弹出一个窗口,列出最近的项目,在右上角有一个“新建项目”按钮。单击按钮创建一个新项目。给你的项目起一个名字,这将帮助你记住你使用它的目的。你不需要担心任何其他领域。点击“创建”。创建项目后,请确保再次打开窗口并从最近的项目列表中选择它。

4.现在,您应该可以看到新创建项目的项目信息、API 和其他信息面板,如上面的屏幕截图所示。在左下方的“入门”面板中,单击“浏览并启用 API”。这将允许您选择您希望能够用于这个项目的 Google APIs。

API 和服务

5.在屏幕顶部的菜单栏中,单击“启用 API 和服务”。这将把你带到 API 库。搜索“云视觉 API”并选择它。

6.单击“启用”使 API 可用于您的项目。这将带您进入 Cloud Vision API 的概述页面。在屏幕的右上角,单击“创建凭据”。

7.从“您正在使用哪个 API?”下的下拉菜单中选择“Cloud Vision API”在“您是否计划将此 API 与 App Engine 或 Computer Engine 一起使用”下,选择“不,我不使用它们”。单击蓝色的“我需要什么凭证?”按钮。

8.现在,您将能够创建一个密钥,以便在尝试连接到 Cloud Vision API 时验证自己的身份。选择一个您将记住的服务帐户名称,并将您的角色设置为“所有者”。将密钥类型设置为 JSON。单击继续。您现在可以下载包含您的凭证的 JSON 文件了。

您现在在 Google 云平台上有一个项目,它将能够使用 Cloud Vision API。下一步是上传您的 PDF 文档,以便将其存储在云中。然后,您可以编写脚本将其转换为文本。

9.如果尚未打开,请单击谷歌云平台左侧的导航菜单,向下滚动直到看到“存储”。点击它——这将打开一个下拉菜单。从下拉菜单中选择“浏览器”。此时,如果您尚未启用计费,则需要启用计费。如果你有 Google Pay,你可以在这里使用它——否则,你需要输入外部支付信息。这将取决于你如何支付,所以我不会给指示。完成后,您应该会看到一个带有“创建一个桶”选项的对话框。

10.为您的铲斗取一个唯一的名称。这是您之前创建的项目中的一个存储库。将数据存储位置设置为“多区域”,并将数据的默认存储类别设置为“标准”。点击“创建”。

现在您已经设置了一个存储桶,您可以在其中上传文件,以便它们可以被为当前项目启用的任何 API 访问。您可以上传您想要转录的 PDF 文件,方法是将其拖放到您电脑上的任何位置。

您已经准备好编写一个程序,通过连接到 Google Cloud services 并提供您之前下载的密钥,可以访问这个文件和 Cloud Vision API。

安装必要的库

现在你已经在 Google Cloud 上设置好了你需要的一切,我们将在你的电脑上安装必要的工具,并使用它们从 PDF 文件中提取文本。

首先,您可能需要进行一些安装。打开终端,导航到保存您编写的 python 脚本的文件夹。输入以下命令。

pip install google-cloud-vision

pip install google-cloud-storage

它们使用 pip 来安装两个 Python 库,分别带有与 Google Cloud Vision 和云存储 API 交互的工具。接下来,运行

pip freeze

这将检查您是否已经安装了所有应该安装的东西。您应该有以下版本,尽管大多数可能是更新的版本。

google-api-core==1.14.3google-api-python-client==1.7.11google-auth==1.6.3google-auth-httplib2==0.0.3google-cloud==0.34.0google-cloud-core==1.0.3google-cloud-storage==1.20.0google-cloud-vision==0.39.0google-resumable-media==0.4.1googleapis-common-protos==1.6.0google-api-core==1.14.3

如果你没有它们中的任何一个,使用 pip 来安装缺失的那些。

最后,您需要设置您的 Google 应用程序凭证——也就是说,您需要注册您之前下载的 json 密钥的保存位置,以便当您使用 Google 云服务运行程序时,您的计算机可以验证自己属于您的 Google 帐户。

你可以在这里找到关于如何在任何平台上这样做的极好的指导。一旦你这样做了,你将能够从命令行运行使用谷歌云服务的程序。

写剧本

现在我们开始有趣的部分——编写一个脚本,在我们选择的 PDF 上实际执行光学字符识别!创建一个新的 Python 文件,并使用您喜欢的代码编辑器打开它。我将解释我使用的脚本的每一部分,以便您在替换您的信息时能够理解它。你也可以在我的 Github 上找到完整的脚本这里。在下载之前,试着按照每一步进行修改。

  1. 第一步是导入我们需要的库。

我们需要导入 json,以便处理 Cloud Vision 的输出。re 是一个库,它允许我们使用正则表达式来匹配字符串中的特定模式。

来自 google.cloud 的愿景和存储将允许我们使用 google Cloud 愿景和 Google 云存储 API。

2.下一步是使用 Google Cloud Vision API 编写一个函数来检测 PDF 文件中所有可读文本的位置。请务必阅读该函数中的注释,以便了解每个步骤在做什么。

函数来注释 PDF 文件中的文本

除了解释这个函数的注释之外,还有一些需要注意的地方。你可能会期望,当我们在一个文档上运行谷歌令人惊叹的 OCR 工具时,我们将得到一个文本文件作为回报。实际上,这个函数将只输出一个 json 文件——或者几个,这取决于 PDF 的大小——包含关于文件中文本位置的信息。实际上,获取文本以便我们能够阅读是下一步。

这个函数有两个输入。首先,gcs_source_uri 是您的 PDF 文件在 Google 云存储中的位置。第二个,gcs_destination_uri 是您希望包含文件注释的 json 文件在 Google 云存储中的位置。

URI 是谷歌云存储中文件位置的术语。你可以把它想象成谷歌云存储中的一个 URL,或者像你电脑上的一个路径。它描述了在你保存在 google cloud 上的文件的层次结构中,在哪里可以找到一个特定的文件。要查找文件的 URI,您可以双击它来查看它的详细信息,并从您将打开的数据表中复制 URI。

为了生成注释,您将在 Python 文件的底部编写一行代码,调用 async_detect_document 函数。我的看起来像这样。

第一个 URI 是存储在我的 google 云存储桶中的一个 PDF 文档的路径,我想从中读取内容。第二个链接指向一个文件夹,我在其中保存了我所有的文档注释。

3.现在我们已经注释了我们的 PDF,我们终于可以使用 Cloud Vision 到每个有文本的位置,并将其读入一个文本文件!我的代码如下。还是那句话,一定要看评论。

这个函数只有一个参数:我们存储注释的位置的 URI。它将把转录的结果输出到当前活动目录中的文本文件中,并在终端中打印出来。

我是这样调用它的,使用和以前一样的目录。

恭喜你!如果一切顺利,您现在应该处于一个文本文件的位置,该文件包含 PDF 中所有机器可读文本的逐行转录。你可能会惊讶有多少可以阅读——它甚至可以在一些笔迹上工作。

下面是我的一些结果的横向比较。这是我从 1889 年韦尔斯利学院档案中提取的课程目录中的一页。尽管我使用了一个完全未经预处理的 PDF 文件作为测试的输入文件,但测试结果非常准确,即使是人名和外来词也是如此。

在我的下一篇文章中,我将演示一些预处理旧文本文件的方法,以便进一步提高准确性,敬请关注。如果你有任何麻烦或者只是想聊天,请联系我——我喜欢聊天!