TowardsDataScience 博客中文翻译 2021(七百一十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在 Kaggle 上无缝使用 Python 的数据表库

原文:https://towardsdatascience.com/using-pythons-datatable-library-seamlessly-on-kaggle-f221d02838c7?source=collection_archive---------32-----------------------

在 Kaggle 上管理大型数据集,无需担心内存不足的错误

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

作者图片

Datatable 是一个用于操作大型数据帧的 Python 包。它旨在提供大数据支持并实现高性能。这个工具包很像 熊猫 但是更注重速度。支持内存外数据集,多线程数据处理,有灵活的 API。过去,我们写过几篇文章,详细解释了如何使用 datatable 以令人难以置信的速度读取、处理和写入表格数据集:

这两篇文章在某些参数上比较了 datatable 和 pandas 库的性能。此外,他们还解释了如何使用 datatable 进行数据争论和管理,以及与同一领域的其他库相比,他们的性能如何。

https://h2oai.github.io/db-benchmark/

然而,本文主要关注那些对在 Kaggle 平台上使用 datatable 感兴趣的人。最近,Kaggle 上的许多比赛都有数据集,这些数据集是不可能单独通过熊猫读取的。我们将看到如何使用 datatable 高效地读取这些大型数据集,然后无缝地将它们转换成其他格式。

目前datatable处于测试阶段,正在积极开发中。

装置

Kaggle Notebooks 是一个云计算环境,支持可重复的协作分析。datatable 包是 Kaggle 的 docker 映像的一部分。这意味着在 Kaggle 上安装这个库不需要额外的工作。您所要做的就是导入库并使用它。

**import** datatable **as** dt 
**print**(dt.__version__)

0.11.1

但是,如果您想要下载特定版本的库(或者最新版本的库),您可以通过 pip 安装库来完成。确保笔记本电脑中的互联网设置为打开。

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

*!pip install datatable==0.11.0*

如果你想在你的系统上本地安装 datatable,遵循官方文档中给出的说明。

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

来源:https://datatable . readthedocs . io/en/latest/start/install . html # basic-installation

使用

现在让我们看一个例子,使用 datatable 的好处显而易见。我们将在演示中使用的数据集来自最近一次名为 Riiid 答案正确性预测竞赛 的 Kaggle 竞赛。 挑战是通过随着时间的推移对学生知识进行建模来创建“知识追踪”的算法。换句话说,目的是准确预测学生在未来的互动中会如何表现。

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

https://www.kaggle.com/c/riiid-test-answer-prediction

**train.csv file**由大约一亿百万行组成。数据大小非常适合演示数据表库的功能。

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

训练数据大小

不幸的是,Pandas 抛出了一个内存不足错误,无法处理如此大规模的数据集。让我们试试 Datatable,并记录读取数据集及其随后转换为 pandas 数据帧所用的时间

1.读取 CSV 格式的数据

数据表中的基本分析单位是一个Frame。这与 pandas DataFrame 或 SQL 表的概念是一样的,即数据排列在具有行和列的二维数组中。

%%time

*# reading the dataset from raw csv file*

train = dt.fread("../input/riiid-test-answer-prediction/train.csv").to_pandas()

print(train.shape)

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

上面的fread()功能既强大又极快。它可以自动检测和解析大多数文本文件的参数,从。压缩档案或网址,阅读 Excel 文件,等等。让我们检查数据集的前五行。

train.head()

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

Datatable 读取整个数据集并将其转换为 pandas 不到一分钟。

2.以 jay 格式读取数据

数据集也可以首先以二进制格式保存。jay)然后使用数据表读入数据。 。jay 文件 格式是明确为 datatable 的使用而设计的,但它也可以被其他一些库或程序采用。

*# saving the dataset in .jay (binary format)*
dt.fread("../input/riiid-test-answer-prediction/train.csv").to_jay("train.jay")

现在让我们看看读取 jay 格式文件所花费的时间。

%%time

*# reading the dataset from .jay format*

train = dt.fread("train.jay")

print(train.shape)

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

中读取整个数据集只需不到一秒钟的时间。杰伦格式。现在让我们把它转换成熊猫,这也相当快。

%%time

train = dt.fread("train.jay").to_pandas()

print(train.shape)

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

让我们快速浏览一下框架的前几行:

train.head()

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

这里我们有一个熊猫数据框架,可用于进一步的数据分析。同样,转换所用的时间仅为 27 秒。

结论

在本文中,我们看到了 datatable 包在处理大数据时的表现。由于强调大数据支持,datatable 提供了许多好处,可以缩短在数据集上执行争论任务所需的时间。 Datatable 是一个开源项目,因此它对贡献和合作开放,以改进它,使它变得更好。我们希望您能尝试一下,并在您的项目中使用它。如果你对使用datatable有疑问,使用[py-datatable]标签在堆栈溢出上发帖。

使用 PyTorchVideo 实现高效的视频理解

原文:https://towardsdatascience.com/using-pytorchvideo-for-efficient-video-understanding-24d3cd99bc3c?source=collection_archive---------8-----------------------

了解如何轻松可视化和评估 PyTorchVideo 库中的活动分类模型

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

PyTorchVideo 预言在第五十一可视化(图片由作者提供)

如果你试图找到最好的模型,或者仅仅是与你的任务相关的基线,那么海量的计算机视觉模型可能很难导航。像 TensorFlow Hub脸书的 Detectron2 这样的模型动物园让人们很容易接触到受欢迎的模型。此外,像 PyTorch lightning 这样的库使得修改这些模型来满足你的需求变得容易。这对于图像来说很好,但对于视频来说,这是另一回事。视频数据正变得越来越受欢迎,但随之而来的额外复杂性往往使与视频相关的任务处于次要地位。

PyTorchVideo是一个新的库,旨在使视频模型像图像模型一样易于加载、构建和训练

PyTorchVideo 提供对视频模型动物园、视频数据处理功能和以视频为中心的加速器的访问,以部署所有受 PyTorch 支持的模型,允许无缝集成到现有工作流程中。

PyTorchVideo要完成您的视频工作流程,唯一缺少的是可视化数据集和解释模型结果的方法。这就是第 51 个出现的地方。 FiftyOne 是我在 Voxel51 一直在做的开源工具。它旨在使可视化任何图像或视频数据集变得容易,并探索存储在本地或云中的地面真相和预测标签。51 个数据集51 个应用程序的灵活表示让您可以快速操作您的数据集并解释您的模型,以找到故障模式注释错误可视化复杂标签等等。

这篇博文是最近的 PyTorchVideo 教程的延伸,旨在教你如何将 PyTorchVideofiftone集成起来,从而结束基于视频的 ML 工作流程。具体来说,这篇文章包括:

跟随 Colab!

你可以在你的浏览器中直接运行这篇博文中的例子。

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

Google Colab 中这个演练的截图(图片由作者提供)

设置

为了完成这个演练,您需要安装 FiftyOnePyTorchVideoPyTorch 和 TorchVision :

pip install fiftyone pytorch torchvision

虽然 PyTorchVideo 也可以通过pip安装,但本文中的功能要求它通过 GitHub 安装:

git clone https://github.com/facebookresearch/pytorchvideo.git
cd pytorchvideo
pip install -e .

本演练使用了 Kinetics-400 数据集的子集,可通过以下代码片段下载:

视频数据集比图像数据集更难处理的原因之一是,许多流行的视频数据集只能通过 YouTube 获得。因此,你不需要下载一个包含你需要的所有内容的 zip 文件,而是需要运行如下脚本,从 YouTube 下载自数据集管理以来可能不可用的单个视频。

加载和浏览视频数据集

对于图像数据集,有一些基本的选项可用于可视化批量数据,如 pillowOpenCV 。用于可视化视频数据集的选项非常少。 FiftyOne 是一个新的开源库,为图像和视频数据集提供简单而强大的可视化。

如果您的数据集遵循一种通用格式,比如用于检测的 COCO 格式,那么您可以在一行代码中加载它:

即使你的数据集是一个自定义格式,用 FiftyOne 加载你的数据集仍然很简单。例如,如果您使用的是对象检测视频模型,您可以按如下方式加载数据:

在本例中,我们将按照 PyTorchVision 教程运行视频分类模型。通常,视频分类数据集将存储在磁盘上的目录树中,该目录树的子文件夹定义了数据集类别。这种格式可以在一行代码中加载:

如果您自己也在关注,请将鼠标悬停在样本上或点击样本来播放视频:

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

五十一应用中观看的动力学视频(图片由作者提供)

我们还需要下载并存储一个默认类名列表,在评估预测时会用到:

wget [https://dl.fbaipublicfiles.com/pyslowfast/dataset/class_names/kinetics_classnames.json](https://dl.fbaipublicfiles.com/pyslowfast/dataset/class_names/kinetics_classnames.json)

运行 PyTorchVideo 模型

在本节中,我们使用 PyTorchVideo 下载并运行视频分类模型,该模型基于我们在上一节中加载的数据,并将结果存储在我们的数据集中。本节代码改编自本 PyTorchVideo 教程

Torch Hub 是一个预训练 PyTorch 模型的存储库,允许您下载模型并在数据集上运行推理。PyTorchVideo 通过其火炬中心支持的模型动物园提供了数量的视频分类模型,包括 SlowFast、I3D、C2D、R(2+1)D 和 X3D。以下代码片段下载带有 ResNet50 主干的 SlowFast 的慢速分支,并将其加载到 Python 中:

每个模型都有它期望的特定输入结构。标准的工作流程是编写定制脚本,执行必要的加载和转换功能,为每个模型格式化数据。 PyTorchVideo 通过以灵活的方式为您提供这些功能来加速这一过程,这些功能将满足大多数视频处理需求。例如,以下代码构造了转换来对视频帧进行采样、归一化、缩放和裁剪,而无需自己编写任何函数:

由于数据集存储在 fiftone 中,我们可以轻松地遍历这些样本,使用 PyTorchVideo 加载并运行我们的模型,并将预测存储回 fiftone 中,以便进一步可视化和分析:

评估 PyTorchVideo 模型

除了作为数据集监管的开源生态系统,FiftyOne 还旨在通过允许您快速找到并解决模型故障模式来可视化、评估和解释模型。

为此,我们可以从可视化上一节中生成的预测开始:

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

PyTorchVideo 模型预测在第五十一中可视化(图片由作者提供)

然后,我们可以使用 FiftyOne 来评估具有基本事实的预测,以查看聚合指标和图表,显示诸如混淆矩阵精确召回曲线之类的东西。这种评估将每个样本的正确性标签(“eval”)添加到数据集,这使得通过正确/不正确的预测进行过滤变得容易,或者更一般地,通过 TP/FP/FN 进行对象检测。评估只需一行代码即可完成:

 precision    recall  f1-score   support springboard diving       0.80      0.80      0.80         5
            surfing water       1.00      0.60      0.75         5
      swimming backstroke       1.00      0.80      0.89         5
   swimming breast stroke       0.57      0.80      0.67         5
swimming butterfly stroke       1.00      0.60      0.75         5 micro avg       0.82      0.72      0.77        25
                macro avg       0.87      0.72      0.77        25
             weighted avg       0.87      0.72      0.77        25

让我们为我们感兴趣的类绘制混淆矩阵:

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

结果在第五十一个的混淆矩阵中可视化(图片由作者提供)

我们可以将这个图附加到一个会话对象上,使其交互。因此,如果您单击其中一个单元格, FiftyOne App 会话会更新以显示该单元格中的样本。

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

Jupyter 实验室与 FiftyOne 的互动混淆矩阵(图片由作者提供)

注意:目前只有 Jupyter 笔记本中的绘图是交互式的,但其他环境将很快得到支持!

FiftyOne 还提供了一种新颖的查询语言,通过搜索和过滤任何给定的标签和元数据来创建数据集的视图。这使得浏览数据集和查找与您想到的任何问题相关的样本变得非常容易。例如,我们可以基于跨多个类别的相似置信度快速找到模型对其预测最不确定的样本,并使用来自先前评估的每样本正确性标签(“eval”)来仅查看错误预测的样本:

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

不确定的 PyTorchVideo 模型预测在51中被可视化(图片由作者提供)

可视化这些样本让我们了解应该添加到训练数据集中的数据类型。为了标记这些以备将来参考,我们可以使用 51 应用程序中的标记功能:

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

在第五十一个应用中标记样本(图片由作者提供)

这种动手分析的便利性通常会显著提高数据集质量,从而提高模型性能,比仅使用聚合数据集统计数据的任何分析都要快。

视频中的目标检测

虽然大多数大型视频数据集和研究工作都围绕着分类问题,如人类活动识别,但基于视频的 ML 的应用通常涉及对象检测。目前,PyTorchVideo 主要支持视频分类问题,但是,在 FiftyOne 中有视频对象检测功能。

FiftyOne 允许您从 FiftyOne 模型动物园中基于图像的对象检测模型生成预测,或者将来自您自己模型的预测添加到视频数据集中。动物园里有许多模型可供选择。例如,让我们使用 EfficientDet-D0 。我们首先需要安装 TensorFlowAutoML 。我们可以使用 FiftyOne 附带的 eta 包轻松安装 AutoML:

pip install tensorflow==1.14
eta install automl

现在,让我们将该模型应用于视频并可视化结果:

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

可视化视频对象检测在第五十一(图片由作者提供)

这种可视化需要编写定制脚本来加载原始视频、注释和预测,然后使用像 OpenCV 这样的软件来绘制方框并将可视化导出到磁盘上的新视频中。然后,如果你想改变你正在看的标签,你需要重写你的脚本,并每次重新生成视频。相反,所有这些只花了我们几行代码,并产生了更易于使用和更灵活的数据表示。

摘要

基于视频的机器学习模型越来越受欢迎,但缺乏相同水平的易用代码库,以允许快速开发和评估图像模型。 PyTorchVideo 旨在通过他们的模型动物园、以视频为中心的组件和加速功能,使视频模型更容易实现、训练和评估。另一方面, PyTorchVideo 正在使视频模型的工作变得更容易, FiftyOne 是一个开源库,旨在使管理、评估和改进视频(和图像)数据集变得简单高效。 FiftyOnePyTorchVideo 共同为创建高质量视频数据集和模型节省了大量时间和精力。

关于体素 51

披露:我在 Voxel51 工作,是 五十一 的开发者

Voxel51 总部位于密歇根州安阿伯,由密歇根大学教授杰森·科尔索博士和布莱恩·摩尔博士于 2016 年创立,是一家人工智能软件公司,通过提供开放核心软件构建模块,使计算机视觉和机器学习工程师能够快速设计数据驱动的工作流,从而实现软件 2.0 的民主化。

fiftyone.ai 了解更多!

使用回归来理解 AlphaZero 象棋引擎

原文:https://towardsdatascience.com/using-regression-to-understand-the-alphazero-chess-engine-aba67148978b?source=collection_archive---------14-----------------------

研究人员已经开始用人类的语言解释 AlphaZero 在想什么。请继续阅读,了解更多信息。

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

达米亚诺·林戈里在 Unsplash 上拍摄的照片

神经网络的一个关键问题是所谓的“黑箱问题”。神经网络已经在许多领域(语音识别、自动驾驶汽车、游戏、蛋白质折叠等)产生了最先进的结果。)但是我们无法用人类的语言来解释他们所做的决定。让我们举一个具体的例子:象棋引擎。今天最强的两个国际象棋引擎是 Stockfish 和 AlphaZero。

Stockfish 是一个传统的引擎——它用人类创造的概念来评估国际象棋的位置。一个简单的概念是位置上的兵差。如果白棋的棋子比黑棋多,这个概念将为白棋返回正数,为黑棋返回负数。其他的概念更复杂,但是只要有足够的时间,任何人都可以理解所有的 Stockfish 概念(你可以自己查看 Stockfish 代码这里)。从数学上讲,您可以将 Stockfish 概念想象成一个函数,该函数将国际象棋的位置作为输入,并输出一个数字来表示该位置上的概念的评估。

AlphaZero 与 Stockfish 有着本质的不同。根本没有人类创造的概念。AlphaZero 通过一个大型神经网络运行每个国际象棋位置,并在最后吐出它认为最好的棋步。这是一个黑箱:我们不能像看 Stockfish 那样看着一些代码并理解它的思维过程。那么我们是不是注定永远无法理解 AlphaZero 是怎么想的?直到最近,是的。然而,在过去的几年里,有几种方法已经开始破解黑盒。我想强调一个特别简单而有效的方法。这种方法的来源以及结果,见本文的第 4 节

我们所做的是获取 Stockfish 概念,看看 AlphaZero 神经网络是否包含它们。我们到底该怎么做?对于 AlphaZero 网络中的每一层,我们在该层的激活上运行给定 Stockfish 概念的回归。然后,我们使用该回归的 r 平方来确定该图层是否与 Stockfish 概念相关,r 平方越高,越表明该图层相关。

回归详细信息

上面的描述比较抽象,我们来看一个具体的回归来理清事情。首先,让我们选择一个 Stockfish 概念和一个 AlphaZero 神经网络层。我们将挑选国王安全和第 10 层的概念。这个概念接受一个国际象棋的位置,通过几次试探返回一个代表国王安全程度的数字。接下来,因为我们在做回归,我们需要足够的数据。没问题——我们将从国际象棋数据库中随机抽取几千个位置。然后,我们在每个位置运行 Stockfish king 安全概念。结果是一系列数字——这些是我们回归的 y(因变量)。

为了获得回归的 x(独立变量),我们采用相同的位置样本,并通过 AlphaZero 神经网络逐一运行它们。由于我们选择了第 10 层,所以我们不会通过网络全程运行每个位置;我们停在第 10 层的激活。这些激活是我们的 x。注意,每个 y 是一个标量,每个 x 是一个矢量。

现在,有了数据,我们需要明确我们想要什么样的回归。我们可以做一个简单的线性回归,不需要任何修饰,但是有一个问题。也就是说,AlphaZero 网络中的每一层都很大(总激活数以千计)。因此,正态回归会严重过度拟合,导致人为的高 r 平方值。为了解决这个问题,我们做了一个 L1 正则化回归,取结果的 r 平方作为我们想要的最终值。在这个特定的回归中(第 10 层的国王安全),r 平方为 0.6。因此,我们可以得出结论,第 10 层 AlphaZero 正在计算与 king safety 适度相关的内容。

我们可以对网络中的所有层进行同样的回归,以查看是否存在任何基于层的模式(例如,可能后面的层比前面的层与 king safety 更相关)。我们也可以在网络训练过程中进行这种回归**,以深入了解 AlphaZero 如何学习不同的国际象棋概念。作为一名棋手,我对最后一个用例特别感兴趣。人类学习国际象棋从基本概念开始(例如,棋子如何移动,一步棋威胁),然后逐渐进入更高级的概念(国王安全,棋子移动性等)。).AlphaZero 也是如此吗?**

在我们继续讨论结果之前,让我们用一些伪代码回顾一下广义回归过程:

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

广义回归算法。图片作者。

结果

最初论文中的研究人员对 93 种鱼类概念进行了上述回归过程。首先,他们注意到所有概念都出现了一种模式:从训练步骤 16,000 到训练步骤 128,000,所有层的每个概念的 r 平方增加最多。换句话说,AlphaZero 网络中的大部分学习都发生在这个区间。早些时候,我们问了一个问题,AlphaZero 是否会跟随人类,在学习复杂概念之前学习简单概念——答案似乎是否定的; AlphaZero 在相似的时间内学习概念,不管人为指定的难度如何

研究人员还注意到,一旦网络经过大部分训练(步长> 128,000),大多数简单的概念,如国王是否在检查中或某个棋子是否可以被捕获,都具有在初始层急剧上升的 r 平方,然后在高 r 平方处稳定下来。这表明 AlphaZero 在网络早期处理简单的概念,而 AlphaZero 同意简单的人类象棋概念。当然,当网络还没有被训练时(步骤< 128,000 ),所有层的 r 平方都如预期的那样低。

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

两个简单概念的回归结果图。左边的概念是游戏方是否可以在一步棋中被将死。正确的概念是玩的一方是否在检查。颜色越浅,r 平方越高。“块”是指神经网络层。经许可从原始纸张拍摄的图像。

对于复杂的概念,情况就不那么清楚了。某些复杂的概念,如 Stockfish 材料不平衡(不仅仅是简单的棋子数差异,涉及国际象棋策略)实际上在后面的训练步骤(步骤> 100,000)中 r 平方递减。这意味着 AlphaZero 不同意鱼群物质不平衡公式的某些内容。随着一些复杂概念的训练进展,这些较低的 r 平方证实了人类国际象棋大师对 AlphaZero 的定性观察:它下棋的方式与人类“不同”。综上所述, AlphaZero 并不认同一些复杂的人类象棋概念

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

一个复杂概念的回归结果:鱼群物质不平衡。请注意,在高训练步数时,r 平方实际上是如何降低的。经原始纸张许可拍摄的图像。

当然,这个回归过程并没有告诉我们,例如,AlphaZero 关于物质不平衡的想法与人类有何不同。然而,据我所知,这是第一次,我们找到了一种数学方法来证明存在差异,而在过去,我们所拥有的只是我们的直觉。

在本文中,我们描述了一个回归过程,该过程能够将神经网络中的层与人类概念相关联。这是朝着解决黑箱问题迈出的一步,因为神经网络的内部工作方式对于人类来说是众所周知的难以理解。在未来,我希望看到这种方法应用到国际象棋之外的更多领域。感谢阅读,并请留下任何问题/评论!

更正:Stockfish 的最新版本(从 2020 年 8 月起)现在也有一个神经网络组件。因此它们不再完全是人类可以理解的。

使用 SAP 分析云

原文:https://towardsdatascience.com/using-sap-analytics-cloud-e2a408f8c54?source=collection_archive---------12-----------------------

从零开始逐个任务地进行数据科学

一个让我兴奋的工具

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

照片由 MiRo AmUnsplash 上拍摄

最近,在观看一场经典的 f1 比赛时,我惊喜地看到了 SAP 分析云的概况,其中米卡·哈基宁非常出色。如果你是一个观看经典老歌的 F1 粉丝,你会知道一定有什么特别的东西吸引你的眼球。事实上,这是我对 SAP 分析云的看法。这是一个让我为 SAP 客户和用户感到兴奋的工具,他们希望将人工智能与机器学习驱动的预测相结合,它还可以进行财务规划和建模。如果你了解行业产品,你会知道通常你需要许多不同的工具来做这样的事情。SAP SAC 在一个地方为您提供这一切,并由 HANA 数据设备提供支持。

那么,为什么在一场经典的情感 F1 比赛中,我会对一款产品感到兴奋呢?继续读下去,让我解释一下!如果你以前没有读过我的作品,你应该知道我喜欢从零开始构建东西,因此对数据库、软件开发和云托管有着更高的认识。数据科学人员可能不会使用 SAC,但我怀疑无代码爱好者会非常兴奋,如果不会被这个领域中的一系列可用产品所破坏的话。

什么是 SAP 分析云?

正如我前面提到的,SAP 分析云(SAC)是一个业务工具捆绑包。 SAP 称之为“在一个解决方案中获得您需要的所有云分析功能,包括商业智能(B.I .)、增强分析、预测分析和企业规划。”。因此,SAC 是一个完整的分析环境,托管在使用 HANA 技术的 SAP 云中。

SAC 是基于云的,你可以注册免费试用并亲自动手。我就是这么做的!我用我的 Mac Mini M1(8g 内存)和谷歌 Chrome 浏览器进行了测试。

什么是 HANA,为什么它很重要?

HANA 是一个由 SAP 设计的内存数据库。SAP 将 HANA 定义为“加速实时数据驱动决策的数据库。”。传统的数据库产品是巨大的发明,但是也有障碍;这些产品包括

通常,这些产品表现为带有大量物理存储磁盘和核心数据库软件的数据库服务器,所有这些都在孤岛中运行。数据仓库专家在这些系统上工作,他们会针对事务处理(在线事务处理 OLTP)或分析(在线分析处理 OLAP 或数据仓库数据仓库)进行优化,但不会同时针对两者(混合 OLTP 和数据仓库工作负载)。用户体验(响应能力)受以下因素影响:-

  • 用作主机的裸机服务器的功率和性能以及内存、存储驱动器速度和 I/O 端口吞吐量都限制了用户性能。
  • 服务器的位置和网络带宽的可用性
  • 企业的工作负载水平,以及一般不好的用户查询!

因此,性能和用户查询响应时间可能会有所不同,并倾向于强制对工作负载进行批处理或离线处理。如果事情没有高度组织化,那么通过 TCP/IP 和 ODBC 或其他协议连接 Tableau、IBM Cognos、Power Bi、Looker 等产品可能是一种可怕的体验。为每个请求连接到数据服务器的 BI 服务器相当繁重,有大量的处理开销。

HANA 不一样。它是从零开始设计的,旨在消除所有这些问题,并使用存储在大量昂贵的 RAM 中的数据、索引和固态驱动器上的持久性的组合。 HANA 速度极快解决了传统 SQL 数据库的所有瓶颈和开销。下面的图 1 是 SAP 架构视图。

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

图 SAP 公开文档中的 HANA 系统。作者从本网站捕捉的图片。

内存数据库技术的概念并不新鲜。我以前的工作总是包括一个 REDIS 数据库用于缓存。我总是发现,使用 REDIS 内存缓存支持 MongoDB 或 Postgres 长期持久性,web 应用程序的性能得到了惊人的提高。

事实上,我第一次使用内存/数据库加速器是在 Netezza 上。 Netezza 是一款“高性能数据仓库设备和高级分析应用,用于包括企业数据仓库商业智能预测分析业务连续性规划”——维基百科。Netezza 改名为 IBM 纯数据,和 HANA 一样,速度很快。将 Tableau、PowerBI、Looker 和其他商业智能工具连接到纯数据提供了超越传统模型的巨大性能,是一个强大的数据仓库解决方案。自然,不利的一面是需要EextractTtransformLoad(ETL)策略,导致了整个行业的 DW/ETL 专家。

分析云

讨论了 HANA 以及我们为什么关注 HANA 之后,分析云就是一个 SAP 托管环境,在集成环境中使用 HANA 技术和 SAP 的分析软件。当我们为 SAC 注册时,我们获得了预配置环境中的租用权,以获得开箱即用的最佳性能。

注册了账户后,我决定去试驾一下。由于我怀疑自己是否能参加一级方程式试驾,我不得不满足于 SAP 的极速体验。

试驾

我想,在我对 F1 经典的情绪状态下,我的思绪飘回到泰坦尼克号和那个现在著名的学习者数据集。图 2 是美国国家海洋和大气管理局拍摄的一张照片,照片中这位经典女士正在休息。“在命运多舛的豪华泰坦尼克号上,一名 17 岁的贵族爱上了一位善良但贫穷的艺术家。”— 来自 IMDB 。那些萦绕心头的主题曲的歌词呢?——我的心将继续……多么激动人心的过山车啊?

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

图 2:NOAA Unsplash 上拍摄的照片

泰坦尼克号数据集在很多机器学习课程中使用;的确,我自己也经常用。登录到 SAP SAC 后,我创建了一个新的数据文件夹,如图 3 所示

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

图 SAC 文件夹“Titantic”作者的图片

接下来,我导入了一个从 Kaggle 中获取的训练和测试文件。如图 4 所示。

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

图 4:导入的 Titanic 数据文件的作者截图。

单击 train.csv 文件,我们可以看到 SAC 是如何工作的。我们有度量和维度。“度量”是数字,而“维度”是类别和其他参考数据。我添加了图 5 来演示这个视图。你会注意到任何看起来像数字的东西都被认为是一种度量。因此,年龄,羊皮纸,SibSp 和其他可能必须更新为一个维度。

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

图 5 —我们的训练数据集中的字段。

正如我提到的,泰坦尼克号是一个非常好的使用和研究的数据集。在《走向数据科学》上,我找到了 Niklas Donges 的一篇文章。

Niklas 为每个字段提供了方便的描述,如图 6 所示

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

图 6 —来自 Niklas Donges 的数据科学表格截图

事实证明,从文件导入到创建故事(仪表板)有一些限制,这使我无法更新数据类型。为了控制数据类型,您需要建立一个模型。使用模型,我能够取得更好的进展。图 7 给出了该模型的视图。

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

图 7:来自 SAC 的显示模型尺寸的屏幕截图。作者图片

出于我的目的,我对默认值做了很少的修改,但是在实际的模型中,您需要检查每一列并确保它具有正确的数据类型。有了模型,我能够创造一些视觉效果。

画面

图 8 显示了具有网格函数的堆积条形图。我们可以看到一个图表,显示女性和男性,存活率(0 =假,1 =真),按年龄组的分布,以及个体数量。数据显示,大部分妇女和儿童都下了车,只有少数男性乘客幸存。

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

图 8:作者绘制的谁在泰坦尼克号上的堆积条形图。

图 9 添加了 ticket 类来看看社会阶层是如何公平分配的。

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

图 9:添加票证类别的附加堆叠网格图。

我想现在大家都知道头等舱和二等舱的乘客做得更好。图 9 显示,一等舱和二等舱的女性乘客大部分都下了车,而三等舱的一些乘客下了车。三班的成年男性似乎比二班或一班的更多。

尽管进行了搜索,我还是无法找到并添加图例标签。标题应该是生存。缺失字段的插补使用基于公式的简单变化函数有点笨拙。我想你可以尝试做卑鄙的诽谤。分组或宁滨分类值似乎是在文件导入过程中由模型中的“公式”完成的。我不得不根据任意截止值手动将年龄维度分为成人、青少年、儿童和退休人员。

机器学习

SAP SAC 的机器学习环境有限。图 10 和 11 显示了分类模型的训练结果。

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

图 10:分类模型的训练结果。作者图片

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

图 11:显示分类准确性的混淆矩阵。6%的假阴性/阳性。

我能够应用该模型并获得新的输出。不清楚如何将 ML 模型部署到数据模型以获得连续的推断,但是我没有在这个特性上花太多时间。机器学习选项仅限于刚才金融分析中的选项,如图 12 所示。

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

图 12:当前可用的机器学习算法。

财务策划

SAP SAC 提供两种类型的数据模型。这些是:-

  • 传统 BI 用例的分析模型
  • 多维财务规划用例的规划模型,通常使用带有 Excel 插件的 TM1 等产品。

试用许可不允许我在规划模型功能上取得进展,但是基于我所做的概述,它是令人敬畏的。如果你想尝试一下,像我一样获得灵感,我在本文末尾的灵感部分留下了一些提示和链接。

试驾结束了

试驾结束了。该产品是闪亮的和新的,非常诱人。我想,对于大多数大宗购买来说,20 分钟的试驾不会说服你进行大笔金融投资。

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

扎卡里亚·扎亚恩在 Unsplash 上拍摄的照片

对于任何分析工具,您都需要坐下来规划一个数据模型,实施该模型,然后使用用户定义的用例对您的数据量进行真正的测试。继续进行概念验证,并向自己展示其价值。

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

斯科特·格雷厄姆Unsplash 上拍照

灵感

如果您想了解更多关于 SAP 分析云的信息,您可以使用以下资源。

Udemy

https://www.udemy.com/course/sap-analytics-cloud-sac/ https://www.udemy.com/course/sap-analytics-cloud-sac/

SAP 培训

https://training . sap . com/course/sac 01h-introduction-to-sap-analytics-cloud-remote classroom-023-ie-en/

https://training . sap . com/course/sac 01-简介-到-sap-分析-云-教室-026-ie-en/

https://training . SAP . com/training path/Analytics-SAP+分析+云-SAP+分析+云

使用 SHAP 解释——首先理解这些限制

原文:https://towardsdatascience.com/using-shap-for-explainability-understand-these-limitations-first-1bed91c9d21?source=collection_archive---------11-----------------------

可解释性做对了

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

照片由德鲁·比默Unsplash 上拍摄

我非常享受我的 MBA 学位;我非常喜欢每一个主题,并且能够将每个主题的知识如何帮助我成为一个更好的拥有强大全局观的经理联系起来。然而,有一门课我从来不愿意走进教室,那就是商业伦理。我强烈认为伦理是不可教授的。每个人都有不同程度的信息技术,这是他/她的价值体系的功能。对我来说,也许偷一支笔可以,但偷一辆车就不行了。对其他人来说可能会不同。

最后,普通的定义太好了,不能进一步扩展——“做正确的事情。”

然而,这种“做正确的事情”只对人类有效,因为道德价值是普遍定义的。对于机器来说,价值体系的概念失效了。因此,在我们到达“奇点”这个有争议的阶段之前,为机器定义伦理是人类的责任。

无论是模特的种族偏见、twitter 显著性问题(链接)还是人工智能反基督(链接)——围绕模特偏见和公平问题的例子数不胜数。目前这是人工智能/人工智能发展的最大障碍。

在过去的 5 年里,可解释的人工智能有了巨大的发展。让复杂的模型变得可解释,并试图消除模型中的任何偏见和诱导公平,一直是数据科学家的主要目标之一。

在所有的方法中,SHAP 和莱姆是两个特别的方法,得到了极大的关注。SHAP 以某种方式计算特征的边际贡献,使得总贡献是 100%。另一方面,LIME 关注于局部保真度。即,用局部的、可解释的线性模型来近似任何黑盒机器学习模型以解释每个单独预测的技术。

如果你想了解 SHAP 的运作,这里有一篇关于它的好文章:

在这两者中,虽然 LIME 更快,但是 SHAP 提供了全局和局部的一致性和可解释性,并且在行业中更常用。

在使用 SHAP 之前,应该考虑围绕该方法的各种限制,以便更好地理解和解释该模型。

局限性 1: **相关性而非因果性:**重要的是要承认,SHAP 只是“解释”了按照模型结构定义的变量“相关性”。这并不意味着定义的变量也有因果关系。在因果关系缺失的情况下,这可能是因为虚假的相关性,或者是因为模型中省略了变量(一些本可以更好地定义产出的变量从数据集中缺失,而其他变量试图替代这些缺失变量的影响)。重要的是,要对模型中的每个变量的重要性、标志和因果行为进行单独检查。

限制二: 对模型的依赖: SHAP 按设计是“一个特性对模型有多重要”,并不暗示“这个特性在现实中有多重要”。粗略地说,SHAP 显示了变量对输出全球平均值的敏感性——给定模型。

这提出了两个关键限制:

1.注意,由于 SHAP 有助于推断给定模型的特征的重要性,如果模型被不正确地开发/训练,SHAP 推断将存在固有的问题。

2.因为变量的重要性和符号是在全局平均值(称之为基准值)的基础上定义的。基准值本身的不正确可能会导致变量的推断错误——无论是在标牌上还是在特征的重要性上。

**限制三:******特征重要性和标志:值得注意的是,SHAP 值的推断与模型的“目标”有很强的相关性。例如,如果一个模型是为选择一个好的股票(a 股)而开发的,如果模型的目标是投资组合优化而不是购买/不购买股票,则输出可能具有不同的特征重要性(或标志),尽管这两个模型都旨在增加回报。因此,应始终考虑模型目标来分析 SHAP 输出。

**限制 4: **多重共线性问题:如果存在高度多重共线性的变量,则其中一个变量的 SHAP 值会很高,而另一个变量的值为零/非常低。这可能与特性重要性的概念相矛盾。这里的问题不在于 SHAP 如何分配这些值,而是与模型的训练方式有关。如果机器以首先将权重分配给一个变量(比如 x1)的方式被训练,则其他相关变量的贡献(比如 x2)将是最小的。如果从商业角度来看,第二个变量(x2)更直观,这可能看起来是违反直觉的。

正如亚瑟·C·克拉克第三定律所说,“任何足够先进的技术都和魔法没什么区别。”,是像 SHAP 这样的方法论揭示了魔术背后的现实,并为机器定义了道德科学。

SHAP 是提高模型解释力的一个很好的手段。然而,像任何其他方法一样,它有自己的优点和缺点。当务之急是,在使用这种方法时要牢记局限性,并在适当的背景下评估 SHAP 价值观。

如果你遇到了 SHAP 的更多限制,请在评论中分享。

免责声明:本文所表达的观点是作者以个人身份发表的观点,而非其各自雇主的观点。

使用 SimpleElastix 比较膨胀前后的显微镜图像

原文:https://towardsdatascience.com/using-simpleelastix-to-compare-pre-and-post-expansion-microscopy-images-660eaf992482?source=collection_archive---------31-----------------------

思想和理论

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

图 1:NK 细胞扩增前(青色)和扩增后(橙色) ( 图片由作者提供) 的荧光信号。

根据所用光的波长,传统光学显微镜的分辨率限制在大约 200 纳米。较小的结构可以通过使用像 X 射线这样的高能光子来成像。然而,在广泛的生物应用领域中,有必要使用光学显微镜和荧光染料。尽管几种成像技术的发展超过了分辨率极限,如 d STORM ,但这种极限仍然对理解生物的基本过程构成了障碍。随着膨胀显微镜技术的发展,一种新的有前途的方法被开发出来,从不同的角度观察事物。不是增加空间分辨率,而是将样本扩展到合适的大小,揭示进一步的结构细节和生物相互作用。然而,新方法往往会带来新问题:

扩展后成像的结构是否与原始结构相同?

如果出现扭曲,扭曲的程度有多大?

为了理解扩张过程中哪些调整是“自然”的,哪些必须算作扭曲,我们必须看一下自由度(自由度)。

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

图 2:相似度变换(图片作者)。

由于样本被扩展,可以假设在 x 和 y 方向上的线性放大 s 被包括在该过程中。由于样品在显微镜下的定位,x 和 y 方向的偏移 t 以及角度 θ 的旋转也包括在内。这些参数共同构建了所谓的相似性变换 T ,捕捉完美线性扩展中出现的自由度(图 2)。

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

等式 1:相似变换。该等式描述了源点 x 的缩放 s、移动 t 和旋转 R,详细说明参见。

使用 elastix(一个用于图像配准的 C++库)优化这种转换,如果出现的失真是刚性的,则产生高相关指数。

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

图 3: B 样条变换 ( 图片作者)

为了检测剩余的各向异性,我们尝试尽可能好地对齐我们的相似性变换的结果,并应用弹性 B 样条变换。B 样条变换引入了具有 N_x 控制点和每个控制点的 2 个自由度的规则网格。这为精确对准提供了高度的灵活性(图 3)。

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

等式 2: B 样条变换:该等式描述了当前位置 x 向立方插值 B 样条控制点 x_k 的移动。有关详细说明,请参见。

用优化的 B 样条变换来变换网格 X,Y 产生了局部矢量偏移,其指示了在与相似性变换对齐之后剩余的各向异性(图 4)。

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

**图 4:**NK 细胞上的排列过程。

分步指南,用于对齐扩展前和扩展后的映像

对于以下步骤,必须对膨胀前后的相同结构进行成像。一个困难但(在复习过程中)通常是有益的过程。对齐扩展前和扩展后的图像并创建扭曲贴图只需点击几下鼠标并使用 python 环境。

首先,您需要获得一个与您的 python 发行版相匹配的 simpleelastix⁴(elastix 的 python 绑定)版本。一些预建版本可以在这里找到。如果您的版本不是预构建的,而您使用的是 Anaconda,那么最简单的步骤就是用合适的 python 版本创建一个新环境。例如:

conda create -n "myenv" python=3.6.0

将 SimpleElastix 安装到您的虚拟环境中,方法是切换到您刚刚下载并运行的文件夹:

python setup.py install 

如果一切顺利,你可以得到一个带有预设变量的工作脚本,并在这里实现绘图

对于这个脚本(除了 SimpleElastix),你只需要 matplotlib(绘图),numpy(数组操作)(可能都是预装的)和 skimage(图像加载和调整大小)。

conda install scikit-image

剩下唯一要做的就是在 main.py 中定义文件的路径

EXPECTED_EXPANSION = 3.5#replace with your expected expansion factor                      
root = r"PATH TO YOUR DATA"+"\\"#replace with your root directory                       
path1 = r"POST EXPANSION.tif"#replace with your post-expansion image       
path2 = r"PRE EXPANSION.tif" #replace with your pre-expansion image                    
save_dir = root + r"\results"+"\\"                       
save_name = path2.split(".")[0]

关键概念

现在一切都应该启动并运行(如果不是随时与我联系)。在下一节中,我将描述脚本中使用的一些代码概念,以便用 python 创建和绘制扭曲贴图:

为扭曲贴图创建 B 样条变换:

创建扭曲贴图:

结论

本文展示了如何在 python 中使用 SimpleElastix 对齐扩展前和扩展后的图像。

如果你在安装软件时还有问题或困难,请在评论中告诉我。

参考文献:
1。

** S. Klein,M. Staring,K. Murphy,M.A. Viergever,J.P.W .普鲁伊姆“elastix:基于强度的医学图像配准工具箱”IEEE 医学成像汇刊,第 29 卷,第 1 期,第 196 - 205 页,2010 年 1 月

3。 D.P. Shamonin,E.E. Bron,B.P.F. Lelieveldt,M. Smits,S. Klein 和 M. Staring《用于阿尔茨海默病诊断分类的 CPU 和 GPU 上的快速并行图像配准》,神经信息学前沿,第 7 卷,第 50 期,第 1-15 页,2014 年 1 月

4。 Marstal,k .、Berendsen,f .、Staring,M. & Klein,s .【simple elastix:一个用于医学图像配准的用户友好的多语言库】 2016 年 IEEE 计算机视觉和模式识别研讨会会议(CVPRW) ,第 574–582 页,2016 年

使用 Sklearn 管道简化您的机器学习过程

原文:https://towardsdatascience.com/using-sklearn-pipelines-to-streamline-your-machine-learning-process-a27721fdff1b?source=collection_archive---------16-----------------------

了解 Pipeline 类如何简化和自动化您的机器学习工作流

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

EJ·斯特拉特Unsplash 上拍摄

机器学习通常涉及多个步骤——加载数据、可视化数据、拆分数据、预处理数据,然后最终用训练数据训练模型。所有这些步骤都必须按顺序进行,我们通常在 Jupyter Notebook 中按顺序执行所有这些步骤。在你知道它之前,它是一个混乱的地狱,代码片段分散在不同的单元格中。然而,所有这些都可以使用 sklearn 的Pipeline类来简化,该类旨在提供一种自动化机器学习工作流的方法。

在这篇文章中,我将向你解释如何使用 sklearn Pipeline来定义和自动化你的机器学习工作流。

执行机器学习

在我们讨论如何使用 sklearn 的管道来简化机器学习过程之前,我们先来看看在数据集上执行机器学习的典型步骤。这样,您将更好地理解为什么使用管道进行机器学习是有用的。

加载数据

首先要做的是加载数据。对于本文,我们将使用流行的泰坦尼克号数据集,我们将从 ka ggle(https://www.kaggle.com/c/titanic/data?select=train.csv)下载该数据集:

import pandas as pd
import numpy as npdf = pd.read_csv('[train.csv'](https://raw.githubusercontent.com/dsindy/kaggle-titanic/master/data/train.csv'))display(df)

数据来源:本文数据来源于https://www.kaggle.com/c/titanic/data

正如您从输出(如下)中看到的,总共有 12 列,其中一些对于预测乘客是否会在灾难中幸存没有用:

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

作者图片

让我们选择要用于机器学习模型的特定列:

# save only those columns that we want to use as features
df = df[['Survived','Pclass','Sex','Age','Fare','Embarked']]
df

为了简单起见,我将不深究为什么选择上面的列。如果您想了解关于特性选择的更多信息,请查看我以前的文章:

Python 中的统计—使用 ANOVA 进行特征选择https://towardsdatascience . com/Statistics-in-Python-Using-ANOVA-for-Feature-Selection-b4dc 876 ef4f 0

Python 中的统计—使用卡方进行特征选择https://towards data science . com/Statistics-in-Python-Using-Chi-Square-for-Feature-Selection-d44f 467 ca 745

Python 中的统计—共线性和多重共线性https://towardsdatascience . com/Statistics-in-Python-共线性和多重共线性-4c 4 DCD 82 B3 f

Python 中的统计—了解方差、协方差和相关性https://towardsdatascience . com/Statistics-in-Python-Understanding-Variance-协方差-and-Correlation-4729 b 528 db 01

剩余的数据帧现在有六列:

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

作者图片

让我们检查数据集中是否有 nan:

# check for NaNs
df.isna().sum()# Survived      0
# Pclass        0
# Sex           0
**# Age         177** # Fare          0
**# Embarked      2**
# dtype: int64

如上面以粗体突出显示的那样,年龄着手列有 nan。

拆分数据

在我们进行任何特性预处理之前,让我们将数据分成训练集和测试集:

from sklearn.model_selection import train_test_split# get all columns except Survived
X = df.iloc[:,1:]# Survived
y = df.iloc[:,0]# perform the splitting now
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                  test_size = 0.3, 
                                                  stratify = y, 
                                                  random_state = 0)# reset the indices for training and testing sets
X_train = X_train.reset_index(drop=True)
y_train = y_train.reset_index(drop=True)X_test = X_test.reset_index(drop=True)
y_test = y_test.reset_index(drop=True)

请注意,我们在进行任何数据预处理(如编码、替换 nan 等)之前分割了数据集。这里有两种观点——一种观点认为,在分割数据之前,我们应该首先进行数据预处理。另一个学派认为,我们应该在进行任何数据预处理之前拆分数据。一般来说,要防止“数据泄露”,最好先拆分数据,然后独立于测试数据对训练数据进行预处理。使用定型数据对模型进行定型后,您可以对测试数据进行预处理,并将其提供给模型进行评估。

在上面的代码片段中,数据帧被分成 70%的训练集和 30%的测试集。为了确保训练集和测试集具有相同比例的存活值,我们对**y**进行了分层,并为可重复性固定了一个**random_state**参数值。

特征预处理

下一步是预处理训练数据。这里我们需要预处理两种类型的列——数字列和分类列:

对于数字列,我们要做两件事:

  • 用一些值替换数字列中的所有 nan
  • 标准化数字列值

首先,我们用各列的中值替换年龄票价列中缺失的值。为此,您可以使用 sklearn 中的**SimpleImputer**类:

from sklearn.impute import SimpleImputer# use the SimpleImputer to replace all NaNs in numeric columns 
# with the median
numeric_imputer = SimpleImputer(strategy='median', 
                                missing_values=np.nan)# apply the SimpleImputer on the Age and Fare columns
X_train[['Age','Fare']] = \
    numeric_imputer.fit_transform(X_train[['Age','Fare']])display(X_train)

参考我之前关于使用 SimpleImputer 类的文章:

年龄费用栏中缺失的值现在用各栏的中间值填充:

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

作者图片

下一步是使用**StandardScaler**类标准化这些值:

from sklearn.preprocessing import StandardScaler# Standardize the Age and Fare columns using the StandardScaler
scaler = StandardScaler()
X_train[['Age','Fare']] = \
    scaler.fit_transform(X_train[['Age','Fare']])display(X_train)

年龄票价列的值现已标准化:

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

作者图片

对于分类列( PclassSexoaked),您希望用最频繁出现的值替换缺失值。同样,您可以使用**SimpleImputer**类:

# use the SimpleImputer to replace all NaNs in categorical columns 
# with the most frequent ones
categorical_imputer = SimpleImputer(strategy='most_frequent', 
                                    missing_values=np.nan)# apply the SimpleImputer on the Pclass, Sex, and Embarked columns
X_train[['Pclass','Sex','Embarked']] = \
    categorical_imputer.fit_transform(
        X_train[['Pclass','Sex','Embarked']])
X_train

您现在可以确认在X_train数据框中不再有任何 nan:

X_train.isna().sum()# Pclass      0
# Sex         0
# Age         0
# Fare        0
# Embarked    0
# dtype: int64

既然 dataframe 中没有 nan,那么对分类列要做的最后一件事就是执行编码。有两个选项可用:

  • 序号编码 —这适用于存在隐式排序的列。例如经济状况、等级、乘客级别等。
  • One-hot encoding —这对于值的排序不重要的列很有用。例如性别、发色、肤色等。

在我们的数据集的情况下,**Sex****Embarked**的值没有隐式排序,因此它们可以被一次性编码:

from sklearn.preprocessing import OneHotEncoder# one-hot-encode the categorical columns - Sex, and Embarked
enc = OneHotEncoder(handle_unknown='ignore')X_train[['Sex_female','Sex_male',
         'Embarked_C','Embarked_Q','Embarked_S']] = \    
    pd.DataFrame(enc.fit_transform(
        X_train[['Sex','Embarked']]).toarray()) display(X_train)

您现在应该已经将性别列的值进行了 one-hot 编码:

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

作者图片

现在,您可以继续删除性别装载的列(接下来,您将使用它们的独热编码列):

# drop the Sex and Embarked and use their one-hot encoded columns
X_train.drop(columns=['Sex','Embarked'], inplace=True)display(X_train)

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

作者图片

最后,您现在可以使用分类器来训练模型。对于这个例子,我将使用**LogisticRegression**类:

from sklearn.linear_model import LogisticRegression# train using LogisticRegression
logregress = LogisticRegression()
logregress.fit(X_train,y_train)

准备用于评估模型的测试集

训练好模型后,您现在可以使用测试集来评估模型,以查看它的执行情况。还记得你在训练集上做的预处理吗?您现在需要对您的测试集做同样的事情:

**# replace all NaNs and standardize the numerical columns**
X_test[['Age','Fare']] = \
    numeric_imputer.transform(X_test[['Age','Fare']])**# standardize the Age and Fare columns**
X_test[['Age','Fare']] = scaler.transform(X_test[['Age','Fare']])**# replace all NaNs in the categorical columns**
X_test[['Pclass','Sex','Embarked']] = \
    categorical_imputer.transform(
        X_test[['Pclass','Sex','Embarked']])**# one-hot encode the Sex and Embarked columnns**
X_test[['Sex_female','Sex_male',
        'Embarked_C','Embarked_Q','Embarked_S']] = \    
    pd.DataFrame(enc.transform(
        X_test[['Sex','Embarked']]).toarray())**# drop the Sex and Embarked columns**
X_test.drop(columns=['Sex','Embarked'], inplace=True)display(X_test)

在对测试集执行预处理之后,它现在看起来像这样:

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

作者图片

预处理测试集以匹配定型集的列是很重要的。否则,您将无法使用它来评估您的模型。

您现在可以调用**score()**函数来评估模型:

**logregress.score(X_test,y_test)**
# 0.8097014925373134                  this is the accuracy score

使用流水线简化机器学习

因此,您刚刚使用上一节中的 Titanic 数据集构建并训练了一个模型。你注意到了什么?以下是值得注意的几点:

  • 您必须分别预处理您的训练集和测试集,这涉及到相当多的重复性工作
  • 这涉及到许多步骤,必须按照正确的顺序来执行

使用 sklearn Pipeline类,您现在可以为您的机器学习过程创建一个工作流,并强制执行各个步骤的执行顺序。

在接下来的章节中,你将看到如何使用 sklearn Pipeline类来简化之前的机器学习过程。

加载和拆分数据

第一步是加载数据并执行拆分:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_splitdf = pd.read_csv('[https://raw.githubusercontent.com/dsindy/kaggle-titanic/master/data/train.csv'](https://raw.githubusercontent.com/dsindy/kaggle-titanic/master/data/train.csv')) df = df[['Survived','Pclass','Sex','Age','Fare','Embarked']]
X = df.iloc[:,1:]
y = df.iloc[:,0]X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                  test_size = 0.3, 
                                                  stratify = y, 
                                                  random_state = 0)

为预处理创建管道

让我们使用**Pipeline**类来指定将转换应用到数据的一系列步骤。下面的代码片段创建了三个Pipeline对象:

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder# define the transformer for numeric columns
# for 'Age' and 'Fare'
**numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])**# define the transformer for categorical columns
# for 'Sex' and 'Embarked'
**categorical_transformer1 = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])**# define the transformer for categorical columns
# for 'Pclass'
**categorical_transformer2 = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent'))**
**])**

在上面的代码片段中,我:

  • 创建了一个Pipeline对象(**numeric_transformer**),首先用他们的中间值替换年龄费用列中的 NaNs。然后,这两列的值被标准化:
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])
  • 创建了另一个Pipeline对象(**categorical_features1**)来替换 Sexabowed列中的 NaNs,使其具有每列中最频繁出现的值。然后,对这两列的值进行一次性编码:
categorical_transformer1 = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])
  • 创建另一个Pipeline对象(**categorical_features2**)来替换 Pclass 列中出现频率最高的值:
categorical_transformer2 = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent'))
])

**Pipeline**类的步骤参数接受一个元组列表。每个元组包含:

  • 转换的名称,以及
  • 实现fittransform方法的转换对象。例如,SimpleImputerStandardScalerMinMaxScaler等。最后一个变换对象可以作为估计器(实现fit方法),例如LogisticRegression等。

Pipeline对象中的转换按照元组列表中指定的顺序执行:

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

作者图片

接下来,您将使用**ColumnTransformer**类将在Pipeline对象中指定的转换应用到 dataframe 中的各个列:

from sklearn.compose import ColumnTransformerfeatures_preprocessor = ColumnTransformer(
    transformers=[
     ('numeric',      numeric_transformer,      ['Age','Fare']),
     ('categorical1', categorical_transformer1, ['Sex','Embarked']),
     ('categorical2', categorical_transformer2, ['Pclass'])
    ])

在上面的代码片段中,您应用了:

  • **numeric_transformer** Pipeline对象为年龄票价
  • **categorical_transformer1** Pipeline对象到性别
  • **categorical_transformer2** Pipeline对象到 Pclass

如果有不需要转换的列,您应该将ColumnTransformer类的remainder参数设置为passthrough以确保这些列被保留。否则,它们将被默认删除)

所有这些步骤都被传入ColumnTransformer类并作为**features_preprocessor**返回。现在你可以使用**features_preprocessor**和你想用来训练你的模型的分类器创建另一个Pipeline对象:

from sklearn.linear_model import LogisticRegressionpipe = Pipeline(steps=[
    ('preprocessor', features_preprocessor),  # preprocess features
    ('classifier', LogisticRegression())      # apply classifier
])

在上面的代码片段中,我使用了**LogisticRegression**类来训练模型。

回想一下,**Pipeline**类接受一个包含转换对象列表的元组列表,最后一个类可以实现fit()方法。

最后,您可以使用Pipeline对象训练模型:

# start the training
pipe.fit(X_train, y_train)

运行上述代码,您将看到以下输出:

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

作者图片

对模型评分

要评估模式,请调用Pipeline对象上的score()方法:

pipe.score(X_test,y_test)
# 0.8097014925373134

输出与前面手动执行机器学习的部分相同。

概括一下,下面是使用Pipeline对象的整个代码块:

import pandas as pd
import numpy as npfrom sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.linear_model import LogisticRegressiondf = pd.read_csv('[https://raw.githubusercontent.com/dsindy/kaggle-titanic/master/data/train.csv'](https://raw.githubusercontent.com/dsindy/kaggle-titanic/master/data/train.csv'))df = df[['Survived','Pclass','Sex','Age','Fare','Embarked']]
X = df.iloc[:,1:]
y = df.iloc[:,0]X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                  test_size = 0.3, 
                                                  stratify = y, 
                                                  random_state = 0)# define the transformer for numeric columns
# for 'Age' and 'Fare'
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])# define the transformer for categorical columns
# for 'Sex' and 'Embarked'
categorical_transformer1 = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])# define the transformer for categorical columns
# for 'Pclass'
categorical_transformer2 = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent'))
])features_preprocessor = ColumnTransformer(
    transformers=[
     ('numeric',      numeric_transformer,      ['Age','Fare']),
     ('categorical1', categorical_transformer1, ['Sex','Embarked']),
     ('categorical2', categorical_transformer2, ['Pclass'])
    ])pipe = Pipeline(steps=[
    ('preprocessor', features_preprocessor),  # preprocess features
    ('classifier', LogisticRegression())      # apply classifier
])# start the training
pipe.fit(X_train, y_train)# evaluate the model
pipe.score(X_test,y_test)                     # 0.8097014925373134

如果您观察,会发现不需要对测试集执行预处理——Pipeline对象的score()方法会处理好它!此外,工作流现在定义得更加清晰,也更容易理解。

通过 GridSearchCV 使用管道

您还可以使用带有GridSearchCV类的Pipeline对象进行超参数调优。

下面的代码片段显示了如何将Pipeline对象传递给GridSearchCV类,以便您可以找到使用LogisticRegression类训练您的模型的最佳超参数:

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
import warningswarnings.filterwarnings('ignore')pipe = Pipeline(steps=[
    ('preprocessor', features_preprocessor),  # preprocess features
    ('classifier', LogisticRegression())      # apply classifier
])**# parameter grid
parameters = {
    'classifier__penalty' : ['l1','l2'],          
    'classifier__C'       : np.logspace(-3,3,7),
    'classifier__solver'  : ['newton-cg', 'lbfgs', 'liblinear'],
}****clf = GridSearchCV(pipe,                      # model
                   param_grid = parameters,   # hyperparameters
                   scoring='accuracy',        # metric for scoring
                   cv=10)                     # number of folds****clf.fit(X, y)     # GridSearchCV will automatically split the data
                  # into training and testing data**

当将GridSearchCVPipeline对象一起使用时,注意超参数的键必须以转换器的名称为前缀—“**classifier__**”(注意双下划线)。

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

作者图片

模型定型后,您现在可以评估模型:

**clf.score(X_test, y_test)**
# 0.8134328358208955

现在模型的精度提高了(与之前的 0.8097014925373134 相比)。

您可以打印出最佳超参数和最佳估计值的平均交叉验证分数:

print("Tuned Hyperparameters :", clf.best_params_)
print("Accuracy :",clf.best_score_)   # Mean cross-validated score 
                                      # of the best_estimator

您应该会看到以下结果:

Tuned Hyperparameters : {'classifier__C': 0.1, 'classifier__penalty': 'l2', 'classifier__solver': 'liblinear'}
Accuracy : 0.7934956304619226

使用管道评估分类器

Pipeline对象的另一个好用途是用它来评估不同的算法来训练你的模型。对于我们的例子,让我们尝试不同的分类器,看看哪一个给出最高的准确性。

让我们导入以下模块:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC 
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, \
    AdaBoostClassifier 
from sklearn.discriminant_analysis import \
    QuadraticDiscriminantAnalysis
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF
from sklearn.neural_network import MLPClassifier
from sklearn.naive_bayes import GaussianNB

创建我们希望使用的分类器列表,并指定其特定参数:

classifiers = [    
    LogisticRegression(C=0.1, penalty='l2', solver='liblinear'),
    KNeighborsClassifier(3),
    KNeighborsClassifier(),
    KNeighborsClassifier(7),
    SVC(kernel="linear", C=0.025),
    SVC(gamma=2, C=1),
    GaussianProcessClassifier(1.0 * RBF(1.0)),
    DecisionTreeClassifier(max_depth=5),
    RandomForestClassifier(max_depth=5, n_estimators=10, 
                           max_features=1),
    MLPClassifier(alpha=1, max_iter=1000),
    AdaBoostClassifier(),
    GaussianNB(),
    QuadraticDiscriminantAnalysis(),
]

我们还将使用一个数据帧来存储每个分类器的精度:

# dataframe to store the accuracy of each classifier
df_results = pd.DataFrame(columns=
    ['Classifier', 'Accuracy'])

要试用各种分类器:

  • 遍历列表中的每个分类器,并在每次迭代中创建一个Pipeline对象。
  • 对于每个Pipeline对象,应用预处理器,然后应用分类器。
  • 使用Pipeline对象训练一个模型,然后对其进行评估。

以下代码片段总结了上述步骤:

# train a model using each classifier
for classifier in classifiers: # create the pipeline to preprocess the features 
    # and apply the classifier
    pipe = Pipeline(steps=[
        ('preprocessor', features_preprocessor),
        ('classifier', classifier)]) # train the model
    pipe.fit(X_train, y_train)   

    # append the result to the dataframe
    df_results = df_results.append(pd.Series({
        'Classifier' : classifier, 
        'Accuracy' : pipe.score(X_test, y_test)
    }),ignore_index = True)

当使用并评估所有分类器时,您可以基于最高准确度对结果数据帧进行排序:

display(df_results.sort_values(by='Accuracy', ascending=False))

结果如下所示:

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

作者图片

摘要

在本文中,我已经讨论了 sklearn 中Pipeline类的使用。在 sklearn 中使用管道最大的好处就是让你的机器学习工作流程更清晰,更容易理解。此外,您可以使用它来快速评估数据集的各种机器学习算法。我希望您现在对 sklearn 中的管道是如何工作的有了更清楚的了解!

https://weimenglee.medium.com/membership

使用 spaCy 3.0 构建自定义 NER 模型

原文:https://towardsdatascience.com/using-spacy-3-0-to-build-a-custom-ner-model-c9256bea098?source=collection_archive---------5-----------------------

爆炸使 spaCy 成为 Python 中 NLP 的免费开源库。最近,他们发布了 3.1 版本的更新,这个更新改变了 v2 的很多东西,打破了以前在 Medium 上找到的许多教程。我在 Spacy v3 上唯一能找到的另一篇文章是这篇文章关于用 Spacy 3.0 构建文本分类器。

在该教程的基础上,本文将研究如何在 Spacy v3.1 中构建自定义 NER 模型,使用 Spacy 推荐的命令行界面(CLI)方法,而不是 Spacy v2 中常见的自定义训练循环。因为这篇文章是一篇更实用的文章,我们不会涉及 NER 是什么的基础知识等。你可以在这篇优秀的文章中找到更深入的信息。引用它,NER 本质上是一个“信息提取任务”,我们试图识别实体(如位置、货币价值、组织、人员等)。从给定的文本中。

概观

本质上,在 Spacy v3 中,有一个转变,即在命令行上使用spacy train命令来训练模型管道,而不是在 Python 中创建自己的训练循环。因此,旧的数据格式(json 等。)不再被接受,您必须将数据转换成新的.spacy格式。因此,我们将探讨两个主要问题:

  1. 将您的数据从旧的 NER 格式更新为新的.spacy格式
  2. 使用 CLI 训练您的数据并配置训练
  3. 加载模型并预测

1.新的.spacy格式

过去,NER 的格式如下:

然而,Spacy v3.1 版不再采用这种格式,必须先在doc中转换,然后在docbin中转换,才能转换成它们的.spacy格式。这是使用下面的代码完成的,改编自他们的示例项目:

这有助于将文件从旧的 Spacy v2 格式转换为全新的 Spacy v3 格式。

2.使用 CLI 训练您的模型

过去,模型的训练是在 Python 内部完成的。然而,Spacy 现在发布了一个用于 CLI 的spacy train命令。他们建议这样做,因为这样可能会更快,并且有助于评估/验证过程。此外,它内置了早期停止逻辑(而在 Spacy v2 中,必须编写一个包装器代码来实现早期停止)。

使用这个新命令的唯一问题是,老实说,它的文档还没有 100%准备好。然而,没有文档的问题是,我有时很难知道命令行上的输出到底意味着什么。然而,他们在他们的 Github 论坛上非常有帮助,我在那里一直得到很好的帮助。

使用 CLI 的第一步是获取配置文件。您可以在这里创建自己的配置文件,Spacy 创建一个小部件,允许您在必要时设置您的配置。

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

spaCy 小工具的屏幕截图(按作者)

一旦完成配置(在本例中,选择“English”作为语言,选择“ner”作为组件),我们就可以启动 CLI 了。

填写您的配置文件

配置文件没有完全填充。因此,您应该运行的第一个命令是:

这将使用默认值填充您从 Spacy 的小部件下载的 base_config 文件。你可以使用默认设置,并根据你的需要进行调整,但是现在让我们使用默认设置。

训练模型

一旦完成,你就可以训练你的模型了!此时,您手头应该有三个文件:(config.cfg 文件,(2).spacy格式的训练数据和(3)评估数据集。在这种情况下,我没有创建另一个评估数据集,而是简单地使用我的训练数据作为评估数据集(这不是一个好主意,但只适用于本文!).确保这三个文件都在运行 CLI 的文件夹中。在这里,我还将--gpu-id设置为 0,以便选择我的 GPU。

这是您应该大致看到的输出(它将根据您的设置而变化)

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

列车输出截图(作者)

尽管没有官方文件,这里的讨论和这里的说明:

  1. E 是历元的数量
  2. #是优化步骤的数量(=处理的批次)
  3. 损失 NER 是模型损失
  4. ENTS_F、ENTS_P 和 ENTS_R 是 NER 任务的精度、召回率和 fscore

损失 NER 是基于测试集计算的,而 ENTS_F 等。是基于评估数据集计算的。训练完成后,Spacy 将根据您设置配置文件的方式(即配置文件中关于评分权重的部分)保存最佳模型,以及训练的最后一个模型。

3.用模型做预测

一旦通过 CLI 对模型进行了训练,就可以像在 Spacy 2 中一样加载和使用它。在我们的例子中,它看起来像这样:

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

预测截图(作者)

而且……它起作用了!

感谢阅读这篇文章!如果您有任何问题,并且希望讨论更多关于 Spacy v3 的内容,并了解其他人也在用它做什么,请告诉我。

原载于http://Zach lim 98 . github . io

利用 Spark + R 分析巴西紧急财政援助数据

原文:https://towardsdatascience.com/using-spark-r-to-analyze-emergency-financial-assistance-data-in-brazil-92957e0e25a7?source=collection_archive---------27-----------------------

理解大数据

下载、加载和分析超过 10 千兆字节的数据库

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

照片由毛罗·利马Unsplash 上拍摄

什么是紧急经济援助?

紧急财政援助是 2020 年 4 月通过第 13.9821 号法律实施的临时财政支持。其目标受众包括 18 岁以上的个人、个体微型企业家、个体 INSS 纳税人、失业者、个体经营者和非正规工人,其月人均收入达到最低工资的一半(522.50 雷亚尔)或家庭月总收入达到三份最低工资(BRL 3.135),这些人在 2018 年没有被 IRPF 征税。(弗雷塔斯等人,2020 年,第 8 页)。

关于日期

可以通过 PNAD 新冠肺炎数据(2020 年 4 月至 11 月)对紧急财政援助进行多项分析,但是,由于其代表样本,PNAD 数据不包括各受益方的独特信息。为了获得每个月每个受益人的数据,必须使用透明度门户网站上每月提供的数据库:http://www . Portal transparencia . gov . br/download-de-dados/auxilio-emergencial。通过门户,您可以选择想要下载数据的年份和月份。

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

透明度门户网站(https://www.portaltransparencia.gov.br)

一旦数据被下载并解压缩,就需要在 RStudio 中安装 sparklyr 包,csv 将通过它来加载。

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

作者图片

关于 sparklyr

Sparklyr 是一个包,它提供了 R 和 Apache Spark 之间的接口(简言之,Apache Spark 是一个用于大规模数据处理的统一分析引擎)。换句话说,在 R/RStudio 内部使用 sparklyr 时,我们实际上是在后台运行 Spark 中的函数。使用 sparklyr,可以执行 dplyr 中的几个功能,从 tidy universe 中打包,例如:过滤器选择group_by 等功能。

使用 sparklyr 比使用 data.table 等大型软件包的优势在于:

  1. 它能够加载非常大的文件,而不需要集群或非常强大的机器来完成。分析可能性的前沿大大增加,现在可以加载和分析大于计算机 RAM 内存的文件。
  2. 执行速度。加载大文件不会成为一个耗时的过程,并且一旦加载,利用前面提到的 dplyr 函数,数据操作也非常快速和有效。

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

图片来源:blog.rstudio.com(blog.rstudio.com)

除了 sparklyr 之外,将使用 Apache 基金会的另一个包:arrow。这个包在后台工作,这意味着你不需要专门从它调用任何函数。这里箭头的作用是通过 sparklyr 优化数据加载,通过下面的链接你可以了解更多关于箭头的用处:https://spark.rstudio.com/guides/arrow/.

解释完了,我们现在开始工作吧。

安装包和加载数据

以下代码执行必要软件包的安装和加载:

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

作者图片

一旦安装并加载了包,就该加载数据了,为此您首先需要启动一个与 Spark 的本地连接。

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

作者图片

当执行函数“*spark _ connection _ is _ open(spark _ conn)*时,预期结果为“ TRUE ”,因此我们知道连接成功。

现在是加载数据的时候了:

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

作者图片

加载时,您需要将一些参数传递给 spark_read_csv 函数,它们是:

  1. sc:是之前创建的连接( spark_conn )。
  2. name:将在 Spark 环境中创建的表的名称(我建议插入在该环境中使用的相同名称,在本例中称为“ aux_emerg_202012 ”)。
  3. 路径:要上传的文件的原始名称及其扩展名(。csv)。
  4. 字符集:文件的编码。默认情况下,它是 UTF-8,但是葡萄牙语更适合“Latin1”类型。
  5. 分隔符:csv 分隔符的类型(逗号、分号、…)。
  6. 内存:该参数用于将表存储在缓存中。但是我们不希望这样,因为这个想法是为了优化加载速度,为此,它必须被通知" FALSE "。

好了,现在我们已经装载好底座并准备好进行各种分析。

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

作者图片

分析数据

在这第一点上,我们来看看巴西财政援助受益人的分布情况。

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

作者图片

你可以很快得到一些有趣的统计数据:12 月份有 77,662,032 人受益。这个数字相当于 2020 年巴西人口的 36.7%。当我们观察 15 岁或以上的人口并将其与用户总数进行比较时,这一百分比增加到 46.3%。

如果我们想知道受益人在城市人口中的分布情况,该怎么办?为此,首先需要过滤掉没有市政当局代码信息的行,然后,按市政当局对受益人进行分组和计数:

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

作者图片

这是上述代码的结果:一个包含所有市政当局及其总受益人的数据框架。

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

作者图片

为了获得人口中受益者的比例,我们需要 2020 年每个直辖市的人口估计数。我将使用由 UFRN 人口估计和预测实验室准备的人口预测。他们的作品可以在这里找到:【https://demografiaufrn.net/projecao-populacional/】T4。

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

作者图片

请注意关于总体的重要一点:从样本中移除了 0 到 15 岁的个体。这是因为紧急财政援助是针对 18 岁和 18 岁以上的个人,因为预测是针对 5 年内 5 岁的年龄组,不可能排除所有 18 岁以下的个人。因此,决定去除 15 岁以下的人口。

有了关于受益人和 15 岁以上人口的数据,现在就有可能绘制一张易于可视化的地图。为此,将使用 geobr 软件包,这是一个由 IPEA 团队构建的巴西软件包。通过这个包,可以很快地从国土上获得几个形状文件。

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

作者图片

这是上面代码的结果:

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

作者图片

该地图显示了北部/东北部地区有更多的城市,60%以上的人口受益于财政援助。另一方面,南部/东南部地区受益者占其城市人口的百分比最低。

下面的箱线图有助于进一步澄清这个问题:

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

作者图片

如果我们想知道这在超滤水平上是如何表现的呢?

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

作者图片

最后,如何知道受益人是否在前几个月已经被考虑过了?这个怎么衡量?解决方法是知道经济资助分期付款的数目:

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

作者图片

这是结果:

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

作者图片

12 月受益人中有 53.27%属于第九期财政援助,26.44%属于第八期,相当于该月所有受益人的 79.71%。简而言之,截至年底,该计划覆盖的绝大多数人口都已经在该计划中注册,因为该计划是为了帮助那些受疫情影响最严重的人而设立的。

代码和数据

我的 Github 上有这些代码。你可以看看这些和其他公共数据分析。财政援助数据可在透明门户网站上找到。

你也可以在 LinkedInTwitter 上找到我。

利用空间信息探测铅管

原文:https://towardsdatascience.com/using-spatial-information-to-detect-lead-pipes-73a1e68d5643?source=collection_archive---------20-----------------------

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

弗林特的水塔(左)和腐蚀的铅管(右)。图片来自 BlueConduit

道路距离和图表如何帮助机器学习模型在弗林特和其他城市找到铅管

blue conduit 哈佛的数据科学项目 的合作。 作者: 贾薇拉Max Cembalest凯文·黑尔&达希尔 项目顾问: 贾里德·韦伯,艾萨克·斯拉维特,&克里斯·坦纳。**

几个世纪以来,美国的城市都使用一种廉价、有延展性且防漏的材料来建造他们的水管:铅。今天,铅管带来的健康风险是众所周知的。饮用被铅污染的水会阻碍儿童的发育,并导致成人的心脏和肾脏问题。美国环境保护署(EPA)于 1986 年禁止在新建筑中使用铅管。然而,今天,自来水管道(将水从城市管道输送到每个家庭的管道)在全国仍然很普遍。

众所周知,铅管很难识别和更换。识别铅管的唯一可靠方法是把它从地下挖出来。然而,挖掘是昂贵的,所以假阳性(错误地挖掘安全管道——如铜)是相当昂贵的。使问题更加复杂的是,管道材料的城市记录往往不准确和不完整。

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

左图:管道挖掘人员在弗林特工作。右图:积水和不完整的弗林特市管道记录。图片来自蓝色管道的贾里德·韦伯

BlueConduit 的成立就是为了解决上述问题。该公司使用机器学习来预测家庭是否有基于其特征(建造年份、批量大小、消防栓类型等)的领先服务线。).该公司由密歇根大学的两位教授创办,他们在弗林特水危机期间构建了铅识别模型。当弗林特市开始使用教授的模型时,他们的铅管命中率(事实上,有铅服务管道的挖掘房屋的百分比)从 15%上升到 81%。

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

图片来自 BlueConduit

随着 BlueConduit 将其工作扩展到美国更多的城市,他们正在积极研究进一步改进其模型的方法。为了帮助这项工作,我们探索了公司感兴趣的新领域:空间建模。目前,BlueConduit 的模型不使用空间信息(如房屋的纬度和经度)来进行预测。然而,由于城市是一条街一条街地建立起来的,BlueConduit 长期以来一直假设,在最近的邻居之间共享信息可以提高他们的铅管预测。我们的项目调查了这个假设。

为了测试纳入空间信息的有效性,我们建立了一个扩散模型,使用家庭位置来调整 BlueConduit 标准模型的预测。当在弗林特的家庭数据集上进行评估时,我们的模型显示出优于 BlueConduit 的标准模型(在命中率和城市节约方面)。在这篇博文中,我们详细介绍了我们的数据集和评估设置、建模过程和结果。然后,我们讨论对未来工作的影响。

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

这个项目是由 BlueConduit 哈佛的数据科学项目 合作完成的。

数据集&评估

我们使用 BlueConduit 关于弗林特铅管的数据集来构建和评估我们的模型。由于弗林特水危机后的大规模挖掘工作,该市现在拥有全国最完整的铅管数据集之一。该数据集包含 26,863 行,每行代表弗林特的一个地块(住宅或商业地产)。每个地块有 74 个描述的特征,例如市场价值、大小、位置(纬度/经度)、建造年份和投票选区。目标是一个二元指示器,指示宗地是否有主服务线。总的来说,该市 38%的家庭有铅服务线。

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

左:弗林特铅管数据集片段。右图:弗林特地图,包裹中的铅管被确认为红色。作者图片。

在弗林特,BlueConduit 使用了 XGBoost 模型,除了纬度和经度之外,它接受了所有家庭功能的训练。我们称之为“蓝色管道基线”模型。我们试图通过引入空间信息来提高 BlueConduit 基线测试集的性能。

为了评估我们相对于 BlueConduit 基线的绩效,我们使用了 BlueConduit 开发的两个指标:

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

密歇根州弗林特市 BlueConduit 的基线模型与随机挖掘的命中率曲线的比较。图片作者。

1.命中率曲线:想象你挖了一堆房子,寻找铅管。命中率是指那些被挖掘的房屋中有铅管的百分比。高命中率意味着你很有效率:在你决定挖掘的房屋中,很大一部分含有铅。命中率度量可以扩展到命中率曲线。假设你管理一个挖掘队,任务是挖掘铅管。你会得到一份家庭住址的打印件,以及他们预测的有线索的概率。鉴于资源和时间有限,一种自然的方法是按照预测概率的顺序挖掘房屋——首先是概率较高的房屋,然后是概率较低的房屋。点击率曲线(如上图所示)以图表形式显示了按预测概率(x 轴)排序的挖掘过程中的累积点击率(y 轴)。理想的命中率曲线是尽可能长的时间尽可能高(高命中率)(超过许多被挖的家),这表明你倾向于在非铅家之前挖铅家。上图显示了 BlueConduit 基线的命中率曲线相对于弗林特市随机挖掘的改善。很明显,BlueConduit 基线往往比随机挖掘产生更高的命中率,随机挖掘提供了一个以城市中铅的真实发生率为中心的命中率(38%的家庭)。一旦所有的房屋都被挖掘出来,这两个数字就会收敛到城市的真实含铅量。

2.平均更换成本:BlueConduit 估计挖掘一根(安全的)铜管的原始成本为 3000 美元。挖掘和更换铅管的费用估计为 5000 美元。⁴然而,前者的成本更令人担忧,因为它代表了“浪费”的城市资金(挖掘已经安全的管道)。为了衡量浪费的资金,我们计算平均更换成本:

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

l 代表挖出的铅管数量,C 代表挖出的铜(或其他安全材料)管数量。假设该城市想要确定更换其第一批 100 根铅管的预期成本。如果一个挖掘算法导致城市在达到 100 根铅管(L = 100)之前挖掘了很多铜管(高 C 值),那么它平均更换每根铅管的成本会相当高。实际上,这一指标总结了该市每一根铅管将需要花费 5000 多美元,这是由于铜屋的浪费性挖掘造成的。

如果我们可以证明我们的模型提高了命中率曲线并降低了平均替换成本,我们就可以证明空间信息可以用于改进 BlueConduit 基线。

我们的空间模型:扩散

在我们的实验中,我们探索的最有前途的空间建模策略是扩散。⁵:让我们通过一个例子来激励扩散,并展示我们如何使用它。

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

画面 A:弗林特地图,标出弗林特河和 1925 贝克尔街附近。画面 1925 年贝克尔(红色标记)和周围住宅的卫星图像。B 图中显示的每个家庭都有铅管。作者使用谷歌地图创建的图片。

上图中的 A 部分是弗林特的地图。2014 年,该市将其水源转向弗林特河,用深蓝色突出显示。这一决定标志着弗林特水危机的开始,因为弗林特河水中含有化学物质,会腐蚀城市的铅管。靠近弗林特河的是城市西边的一个居民区,用橙色方框标出。这个社区有高密度的铅服务线。一栋特别的房子——贝克街 1925 号——就坐落在这个街区。

面板 B 放大 1925 Becker St .(用红色指示器标记)及其紧邻的区域。因为弗林特的水管都是在水危机后的几年里挖出来的,所以我们知道了地面真相:图中每家每户都有铅管(包括 1925 年的贝克尔)。因此,如果这个邻域在一个测试集中(即尚未挖掘),一个理想的模型将给出通向每个家庭的高概率。下图显示了 BlueConduit 基线模型给予每个家庭的销售线索预测概率。

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

通过 BlueConduit 基线模型得出的 1925 年贝克尔(31%)和周围家庭(> 90%)的铅概率。回想一下:这张图片中的所有房屋都有铅管。图片作者。

BlueConduit 基线给出了每个家庭领先的高概率(> 90%),除了一个:1925 Becker St (31%)。经过检查,似乎这个家有一个奇特的特征:它的城市记录表明,它有铜(安全)管道。弗林特的管道记录往往不可靠。然而,明确指出铜管的记录通常是准确的。BlueConduit 基线模型锁定了这个特性,并被“愚弄”了。这个模型给了 1925 年的贝克尔(事实上,它有铅管)一个较低的铅概率,将其放在要挖掘的房屋队列中的第 9136 位。如果挖掘资源有限,团队可能永远不会到达这个家。相反,他们可能会在实际上没有铅管的队列中挖掘更高的房屋。我们如何防止这种结果?

正如我们上面提到的,因为城市是一个街区一个街区建立起来的,我们认为近邻应该有相似的领先概率。因为 BlueConduit 基线不使用空间要素,所以它不能在最近的邻居之间直接共享信息。然而,这种类型的信息共享可以通过扩散来实现。

为了建立扩散,我们首先要建模并建立一个家与家之间距离的图表。下图展示了我们的图形构建过程。首先,我们使用开放的街道地图来查找住宅之间的街道距离(曼哈顿距离)。我们选择使用街道距离而不是哈弗森距离(“直线”距离),因为街道编码了家庭之间的一些共享发展和基础设施。住房开发是一个街区一个街区地进行,而不是一个地区一个地区地进行。因此,两栋后院相邻(哈弗线距离较小)的房子可能是由不同的开发商建造的——特别是如果它们没有通过一条共用的道路相连的话。此外,管道通常建在道路下面。因此,街道距离也可以对共享水管进行编码。

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

我们模拟了家庭之间的道路距离。然后,我们用这些距离来创建一个图表。上图显示了为 1925 年贝克尔街区创建图表的过程。图片作者。

获得道路距离后,我们创建了一个连接住宅的图表。在我们的图中,每个节点是一个家。每条边的长度/重量由它所连接的两个家庭之间的街道距离来定义。根据我们的信念,信息共享应该只发生在同一个紧邻的家庭之间,我们只连接彼此在 0.5 公里以内的家庭。

随着图形的完全构建,我们最终可以进行扩散。扩散过程如下图所示。在扩散中,图中的值在节点之间是平滑的。在我们的例子中,领先概率在连接的家庭之间是平滑的。例如,位于许多低量级概率住宅附近的高概率领先住宅会将其预测强度扩散到其邻居,其领先概率将降低。在 1925 Becker St .(如图所示)的案例中,我们看到一个低概率铅住宅位于许多高概率铅住宅附近。它从邻居那里借用预测力量,领先的概率上升。这样,扩散允许我们的模型“校正”邻居之间的差异。

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

扩散前后 1925 年贝克尔附近铅的概率。领先的信心与 1925 Becker 共享(“扩散”),将其领先的概率从 31%提高到 56%。图片作者。

由于使用了扩散,1925 年贝克尔街在挖掘队列中前进了 502 位。从这个角度来看,挖掘 500 个家庭至少要花费 150 万美元。一个预算有限的城市可能没有资金来挖掘额外的 500 套住房。因此,1925 年贝克尔街的挖掘顺序代表了更换和未能修复其危险管道的区别。

然而,贝克街 1925 号只是一个家。扩散给整个城市带来了什么结果?我们将在下一节回答这个问题。

火石的结果

在弗林特对所有 BlueConduit 基线预测进行扩散后,lead homes 在挖掘队列中攀升了 327 个位置(平均)。非领先住宅平均下跌 195 个位置。下图显示了铅和非铅家庭中挖掘顺序变化的全部分布。很明显,铅含量高的房屋倾向于按照挖掘顺序上升(正值),含量低的房屋倾向于下降(负值)。

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

图片作者。

进一步探索,我们发现了家庭间有益信息共享的证据。下图显示了所有家庭中预测领先概率(扩散后)的变化。

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

图片作者。

我们看到一个似乎适得其反的趋势:扩散倾向于提高非铅家庭的铅概率,降低铅家庭的铅概率。然而,值得注意的是,BlueConduit 基线模型为大多数家庭提供了高度确定和高度准确的铅预测。换句话说,大多数铅家的铅概率接近 1,大多数非铅家的铅概率接近 0。因此,我们期望扩散会稍微平滑这些概率,回归它们的极值更接近平均值。这意味着许多领先家庭(基线概率接近 1)的领先概率略微下移,许多非领先家庭(基线概率接近 0)的领先概率略微上移。

鉴于这种适得其反的趋势,怎么可能领先的房屋在挖掘队列中倾向于上升,而非领先的房屋倾向于下降呢?关键是关注最初不确定的房屋。在下图中,图 A 显示了铅概率的变化,但仅在 BlueConduit 基线给出中等铅概率值(30% — 70%)的家庭中。在这里,我们看到一个生产趋势:扩散增加了铅家园的概率,减少了非铅家园的概率。

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

作者图片。

图 B 显示了这些相同房屋的随机样本中挖掘顺序的变化。图形的底部表示它们在 BlueConduit 基线挖掘队列中的位置。顶部代表它们在最终扩散挖掘队列中的位置。因为这些房屋最初被赋予了不确定的预测概率,所以它们位于 BlueConduit 基线挖掘顺序的中心。然而,我们看到扩散将领先的房屋拉得更高,而将非领先的房屋拉得更低。

这些结果表明,从某些家庭到不确定的家庭,信息是有效共享的。类似于 1925 年贝克尔街,我们看到证据表明,不确定的领先住宅(具有中等概率值的领先住宅)往往位于具有更高确定性的领先住宅(概率接近 1 的领先住宅)附近。扩散允许这些不确定的家庭从他们的邻居那里借用预测力量,导致更高的领先概率和在挖掘队列中的更高位置。另一方面,不确定的非铅住宅(具有中等概率值的非铅住宅)往往位于更确定的非铅住宅(概率接近于 0 的非铅住宅)附近。扩散允许这些家庭从他们的邻居那里借用预测力量,导致更低的领先概率和挖掘队列中更低的位置。

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

作者图片。

重要的是,对不确定房屋的积极影响超过了对更确定房屋的潜在不利影响(其极端概率值向平均值回归)。上图中,我们看到了两组命中率曲线。在左侧面板中,我们比较了 BlueConduit XGBoost 基线和 BlueConduit XGBoost 基线的命中率,并将纬度/经度作为预测因素(标记为:“朴素空间模型”)。我们看到,天真地将纬度和经度作为预测因子并没有显著提高命中率。在右边的面板中,我们比较了我们的扩散模型与相同的 BlueConduit XGBoost 基线模型的命中率。在这里,我们看到证据表明,扩散模型在挖掘队列的前半部分和后半部分都具有较高的命中率。

尽管点击率的原始差异看起来很小,但该市储蓄的估计差异相当大。下图显示了这些节约的估计值。

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

左图:在 BlueConduit 基线模型和扩散模型下,更换每根铅管的平均成本。右图:扩散节省的累积量(相对于 BlueConduit 基线)。这两个图的跨度从 0%到 90%的所有铅管被移除。作者图片。

因为扩散倾向于在挖掘顺序中向前推动铅管(并向下拉动非铅管),所以在城市中找到并替换大多数铅管需要更少的总挖掘量。这转化为货币储蓄。如上所述,扩散明显降低了整个挖掘过程中的平均更换成本。到 90%的铅管被挖掘出来时,扩散总共为该市节省了 30 多万美元(相对于 BlueConduit 基线模型)。这些节约主要是由防止浪费挖掘非铅家。

最终,除了货币价值,最重要的改善是对居民而言。考虑到挖掘人员的时间限制,更高的命中率意味着当工人在城市中行进时,居民将经历更少的铅暴露(平均而言)。

讨论&未来的工作

通过允许具有高度领先不确定性的家庭从他们的邻居那里借用信息,扩散在挖掘队列中提供了更有效的家庭排序。在我们对弗林特数据集的实验中,这为城市节省了大量资金,并最终减少了城市居民接触铅的时间。

更广泛地说,我们的结果表明,一个家的位置可以传达关于它的建筑、发展和材料的信息。经度和纬度可能无法单独提供这些信息。但是,当使用城市基础设施(例如街道距离)进行编码时,位置可用作铅管的关键预测值。特别是,考虑周到的邻居模型可以允许邻居之间有效的信息共享。这可以导致机器学习模型的广泛改进。

值得注意的是,我们只处理了一个城市的数据:弗林特。因此,我们并不确切知道我们的结果是否会推广到其他城市。然而,我们的工作利用了一个趋势,这可能是许多城市共有的:彼此靠近的房屋往往有相似的管道。随着 BlueConduit 将其工作扩展到美国更多地区,我们希望空间信息将在未来的测试中继续提高模型性能。此外,我们希望 BlueConduit 将改进我们的扩散超参数,或者找到比扩散更好的空间模型,以进一步改进我们的结果。

参考文献&脚注

  1. 环境保护署,“关于饮用水中铅的基本信息”https://www . EPA . gov/ground-water-and-drinking-water/basic-information-about-lead-饮用水。2021 年 12 月 10 日接入。
  2. **PBS/Nova,“人工智能正在帮助从燧石中取出铅管。”【https://youtu.be/anHwjIASyj4 **
  3. 从技术上讲,服务线有“公共”和“私人”两个部分,其中公共部分归城市或公用事业所有,私人部分归房主所有。因为两者都会污染水源,所以如果其中任何一个成分是铅,我们就认为这个家庭是危险的。详情请见:https://www . nrdc . org/experts/Erik-d-Olson/how-can-I-find-out-if-I-have-lead-service-line
  4. 这些成本和替换指标的平均成本是按照 Webb 等人(2019)的方法计算的。参见 Jared Webb、Jacob Abernathy 和 Eric Schwartz,“走出去:弗林特的数据科学和供水服务线”,彭博数据交换,2019 年。可在:https://storage . Google APIs . com/flint-storage-bucket/d4gx _ 2019% 20(2)获取。pdf
  5. 我们还尝试使用图形神经网络、高斯过程和堆叠模型。然而,这些策略并没有改善 BlueConduit 基线。我们对这些模型的结果和讨论可以在我们的技术报告中看到。

使用 SQL 的 DateDiff()表示年龄

原文:https://towardsdatascience.com/using-sqls-datediff-for-age-dc0cb5b34190?source=collection_archive---------13-----------------------

潜在的 Bug 以及如何避免它

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

Kortnee Greenfield 通过 Unsplash 拍摄的照片

在某些时候,您可能会被要求提取客户数据,包括客户与公司交易/接触时的年龄。最有可能的情况是,交易时的年龄并不是数据中已经存在的一列,因为它取决于特定事件发生的时间。

简单的解决方案是使用内置函数 DATEDIFF(),在这个函数中,您可以找到两个日期之间的年份差异。让我们来看看使用这个函数的一些结果。在这些结果中,我们将看到今天的日期与个人的生日相比较。

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

作者照片

啊哦!你刚刚为未成年人提供了酒,现在闪电就要击中生意,把它夷为平地。很难受,我知道。

变通办法

因此,看起来在使用 DATEDIFF()时,数学运算实际上只计算年份值。一年中的月和日似乎没有被考虑在内。让我们把它考虑进去!

首先,我们将获取这个人的生日,并将使用 DATEADD()函数。在这种情况下,我们将根据 DATEDIFF()结果,添加我们期望此人在给定年份中的年数。

最后,我们将使用 CASE 语句。我们可以说,如果当前事件发生在该年个人生日之前或当天,那么使用 DATEDIFF()函数产生的年龄。如果这个人的生日在事件发生时还没有到来,那就从预期年龄中减去一年。这段代码使用了 T-SQL,为了显示生成的每个步骤,这段代码有点长:

结果是什么样的

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

作者照片

现在,我们看到快乐的绿色小星星会告诉我们年龄变化发生在哪里。我们没有算错年龄!

说到生日

你有没有想过祝同事生日快乐,但要用最难忘的方式?不要再看了。下面的代码,在你改变了这个人的名字值之后,实际上会返回一条很好的生日消息。你可以随时将代码通过电子邮件发送给那个人或任何为你工作的人。

最后的想法

抽查结果至关重要。我总是喜欢用上一篇文章中的问题,“什么会打破这个?”我仍然喜欢你把它变成一场观众欢呼的游戏的想法。

代码是强大的。它加快了我们处理数据的速度。花时间去理解结果和工具是如何工作的。一如既往,继续学习。

使用带状图一次可视化几十个时间序列

原文:https://towardsdatascience.com/using-strip-charts-to-visualize-dozens-of-time-series-at-once-a983baabb54f?source=collection_archive---------27-----------------------

带状图对于在很长一段时间内从几十个(甚至几百个)时间序列中获得头部或尾部非常有用。

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

Unsplash 上的 CHUTTERSNAP 拍摄

随着工业 4.0 时代的到来,所有工业部门的工厂和工业资产运营商都希望利用他们多年来收集的大量数据:在许多情况下,这些数据中只有一小部分被使用,而且只是在被动的情况下使用。假设您经营一家婴儿配方奶粉生产厂,质量团队在进行目视检查时开始注意到半成品中的一些黑斑:尽管您的产品可以安全食用(这些黑斑很可能是煮过头的颗粒,当液体干燥成粉末时,它们会溶解在温水或牛奶中),但这可能会导致更高的客户索赔率,为了安全起见,您可能会扔掉整批产品。

流程工程师可能会与您的常驻数据科学家合作,提取设备和流程数据。使用这些来执行根本原因分析将帮助你产生新的知识:例如,他们可能会提出新的设定点来操作你的制造操作,以防止这一事件在未来批次中发生。

然而,通常情况下,此类问题背后的原因远非简单,可能有多个相互关联的原因:此外,可能存在一些您无法像控制制造变量那样容易控制的依赖因素(天气、供应链变化、原材料质量……)。这意味着,当黑点重新出现在成品中时,您必须再次更新最佳工艺参数。您可能会从之前的根本原因分析中领先一步,并且您可能知道要查看哪些参数以及在哪个时间步骤:然后您可以扩展之前的分析,调整您的制造参数,并继续处理另一个问题…

有一天,你决定试着一劳永逸地解决这个黑点问题!多年来,您一直在收集大量数据并将其置于背景中,您知道深度学习方法可能有助于发现生产环境中的微弱信号…

如果你想建立一个高效的深度学习系统,你需要帮助它筛选成千上万的信号和事件的噪音。精确定位数字时间序列中有趣的模式对于向未来的人工智能模型提供高质量的数据集至关重要。在很长一段时间内对许多时间序列的这种有趣的时间模式的检测取决于时间尺度、起点和将所有数据纳入综合可视化的能力,这将指导您的早期探索。

在上一篇文章中,我描述了准备时间序列数据的过程,以便能够对这些信号进行交互式探索:

然而,你首先要做的可能是绘制所有信号的整体地图。有几个原因可能会让你想拥有这样一个视角来开始你的探索:

  • 揭示有趣的时态模式和反模式
  • 检测感兴趣的横截面
  • 确定是否有同时影响许多信号的重大事件

带状图介绍

什么是带状图,我为什么需要它?

如果只有少量的时间序列,通常可以通过单独或同时绘制标准时间图来可视化它们。

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

时间序列标准图(图片由作者提供)

然而,可视化超过几十个信号所必需的不动产是令人望而却步的。此外,前面的图只显示了 6 个月的数据:可视化更多的数据可能会导致重要的趋势被挤出。

将这样的信号转换成带状图会使信息更加紧凑:

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

之前信号的相应带状图(图片由作者提供)

在这张图上,我使用了三种颜色:绿色表示信号的低值,橙色表示信号的中值,红色表示信号的高值。这个简单的条形带非常便于显示何时出现低值或高值。

从时间序列中剥离这么多信息有什么意义?

主要原因是,我们不想只关注其中的一个,而是可能关注其中的多个,我们可能还想查看超过 6 个月的数据。让我们来看看这个过程,并以获得的全局可视化来结束…

给我看看!

构建信号的带状图非常简单,但需要您选择一些参数。第一步是离散化你的信号。在下面的代码片段中,我从../data文件夹中加载 70 个信号,并离散化第 51 个:

然后,我可以绘制我的信号,并具体化通过离散化过程获得的仓:

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

箱可视化(作者图片)

您可以选择想要将信号离散化到的仓的数量(上面代码中的n_bins=3)。这个数字是任意的,取决于您想要在高层次上可视化的内容。我发现三个层次对于可视化我的数据中的关键变化是有用的。如果您的数据发展缓慢,添加更多级别不会损害可视化。如果您有一些尖峰或非常嘈杂的数据,低数量的级别对于保持图有用是很重要的。在上面的例子中,我还使用了分位数:这意味着我的信号分成三类,数据点的数量大致相同。然后,我会将这些仓分配给信号的每个值:

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

将条柱映射到原始时间序列值(图片由作者提供)

然后,我可以使用这些相同的颜色,将这个信号转换成一个简洁的带状图:

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

之前信号的相应带状图(图片由作者提供)

在这里,我们在独立于其他信号来观察给定信号的同时进行离散化。不过,量化可能会在全局范围内发生:如果您在许多不同资产的相同位置获取温度值,则在全局考虑来自该特定标签的所有信号的同时,对所有温度值进行离散化是有意义的。绘制相邻的带状图将允许您看到不同的图案跃入您的肉眼,将您的调查导向您工厂中的特定设备。

现在,让我们将时间范围从 6 个月扩大到 3 年,并将所有 70 个信号绘制在一个屏幕上:

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

三年来 70 个信号的概述(图片由作者提供)

该图像在大约 3 秒内生成,信号的采样率为 1 小时。由于这种可视化,您可以轻松确定要调查的主要事件(2019 年 2 月和 4 月的大红色带)和不时发生的较短事件(例如 2018 年 3 月 22 日)。这是一个非常好的开始!

结论和未来工作

在本文中,我构建了以前的框架,并更新了我的[tsia](https://github.com/michaelhoarau/tsia)包来构建多元时间序列的带状图。在未来,我将通过添加一些概要特性来扩展这个特性,如 R 包[mvtsplot](https://github.com/rdpeng/mvtsplot)(由著名的 Roger Peng 构建!).然后,我将研究使其更有用的方法,通过提供对时间序列分组的自动洞察或基于多变量演变精确定位感兴趣的时间范围(例如,我们能否在上面的最终矩阵图上自动突出显示所有重要的红色范围?).

如果您喜欢这篇文章,我希望您也会对下面的文章感兴趣:

参考

  • 彭,R (2008): 一种多变量时间序列数据可视化方法 -统计软件学报。http://doi.org/10.18637/jss.v025.c01

使用子图来表达更多的 gnn

原文:https://towardsdatascience.com/using-subgraphs-for-more-expressive-gnns-8d06418d5ab?source=collection_archive---------7-----------------------

改进 GNNs

消息传递图神经网络的表达能力固有地受到限制,因为它们等价于 Weisfeiler-Lehman 图同构测试。几个并行的近期工作表明,这种限制可以通过对通过从输入图中移除节点或边而获得的子图集合应用 GNN 来克服。在本帖中,我们回顾了这些不同方法的共同主题和细微差别。

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

本文由莱昂纳多·科塔、法布里齐奥·弗拉斯卡、哈盖·马龙、和·赵合著。另见Weisfeiler-Lehman 试验简介 结构编码

M 消息传递图神经网络(mpnn)[1]由几个层组成,执行来自相邻节点的信息的逐节点聚合。这种架构的吸引人的特征是它们的局部性(即,每个计算只需要一个节点的直接邻居)和边数的线性复杂度[2]。然而,缺点是它们的表达能力有限:在[3–4]中显示,MPNNs 的表达能力最多与 Weisfeiler-Lehman (WL)图同构测试 [5]一样,这是一种试图通过迭代颜色细化来确定两个图是否结构等价(“同构”)的经典方法[6]。

Weisfeiler-Lehman 测试是一个必要条件,但不是充分条件:事实上,一些同构的图可能是不可区分的。下图显示了一个这样的例子:

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

weis feiler-Lehman 测试是一个迭代的局部颜色优化过程,试图确定两个图是否同构。它输出颜色直方图,提供同构的必要但非充分条件:如果颜色直方图不同,则图形不是同构的,但测试可能无法区分非同构的图形,如这里显示的图形,产生相同的直方图。

在图论中,最初由 Boris Weisfeiler 和 Andrei Lehman 在 20 世纪 60 年代提出的图同构测试在 20 世纪 70 年代后期被扩展到一个层次结构,该层次结构具有越来越强大的更高维度的 k -WL 测试,这些测试对节点的 k 元组进行操作。这篇文章的作者克里斯多夫·莫利斯和哈盖·马龙——以及他们的合著者——展示了相当于 k -WL 测试[4,9–10]的高维 GNN 架构的不同设计;然而,这种模型失去了标准消息传递 GNN [11]的局部性和线性复杂性的优势。

增加 GNNs 表达能力的另一种方法是使用位置编码,它“预先着色”图的不同节点。位置编码是变压器[12]的一个关键架构特征,可以被视为一种“对称破坏”机制,允许变压器表达排列敏感函数。这是一个必要的属性,例如在语言建模中,这种架构特别成功。然而,对于图形结构的数据来说,这种特性不再是所希望的,而且对排列敏感的位置编码通常缺乏通用性[13]。

L 为了寻找一种排列不变的对称破缺机制,乔治·布瑞萨斯和法布里齐奥·弗拉斯卡(迈克尔的博士生)引入了图子结构网络 (GSN),该网络基于小的预定义子结构(三角形、集团、循环等)的局部计数【14】。适当的结构选择使得这种“结构编码”比基本的魏斯费勒-雷曼测试或更高阶的 k -WL 测试更具表达性[15]。

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

采用具有三角形计数的结构编码的 gsn 允许在上述示例中的图形之间消除歧义(属于一个三角形的节点用橙色标出;三角形以绿色显示)。

GSN 模型的优点在于,它本质上是标准的 MPNN,增加了额外的节点或边特征(相应结构的计数),因此受益于消息传递方案的局部性和线性复杂性。检测局部子图的较高复杂度是作为预处理阶段引起的,这在一些应用中通常是可以容忍的。虽然在一个有 n 个节点的图中寻找 k 个节点的子结构的最坏情况的代价是𝒪(nᵏ,但是实际的运行时间要乐观得多。

结构编码强调了本文讨论的一类方法背后的一个简单思想,即使用输入图的子图可以增加图形神经网络的表达能力。再次考虑我们反复出现的一对 WL 等价的非同构图的例子:可以扰动这些图(甚至最小程度地,例如,通过删除一条边,如下图所示),使它们通过 WL 测试可区分。

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

通过 Weisfeiler-Lehman 测试去除边缘(红色虚线),上例中的两幅图变得可以区分。这一观察为几个处理子图集合的表达性 GNN 架构提供了理论基础。

最近几个并行的工作使用这种方法来设计高效的表达图神经网络结构。这些模型,我们统称为“子图 gnn ”,主要区别在于它们的基本原理、产生子图的方式以及聚集来自不同子图的输出的方法。我们在本帖中回顾了其中的一些作品。

ETH Zurich 分布式计算小组引入的Dropout GNNs【16】通过将节点 dropout 应用于图(独立于其他节点以概率 p 移除一个节点)然后运行标准的多层 GNN,从字面上理解这一思想。重复该过程多次,得到不同的子图嵌入;然后,它们以排列不变的方式聚合。这样,每个节点“看到”一个略有不同的邻居,往往解决了导致 Weisfeiler-Lehman 测试失败的歧义。这也可以解释为什么像 DropEdge [17]这样的图的丢失型正则化技术往往工作得很好。

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

图中节点丢失的例子(丢失的节点用红色标记,不参与消息传递)。与 WL 测试相比,每个节点在多次运行中看到其邻域的一组轻微扰动版本的事实导致了丢失 GNNs 的更大表达能力。

重构 GNNs【18】是本帖作者莱昂纳多·科塔和克里斯多夫·莫利斯与布鲁诺·里贝罗的新作,提出了一种基于图重构猜想的新架构。重构猜想是图论中的一组结果,可追溯到 20 世纪 40 年代 Paul Joseph Kellystanis aw Ulam**【19】的工作,假设从所有删除节点的子图的集合中恢复一个图的可能性【20】。虽然对于某些图族可以显示可重构性,但是一般结果仅通过对大小为 n≤ 11 个节点的图进行穷举搜索来验证[21],并且对于更大的 n 是否成立目前是一个公开的问题。**

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

一个图及其去节点子图的集合。子图 1,3,4,6 和 2,5 是同构的。

**在十年后发表的后续工作中,Kelly 考虑了从 k 大小的子图[22] 重建的更一般的设置。不幸的是,对于固定大小 k 的重构,我们没有太多可说的。相反,关于 k 的典型结果——重构试图将最小必要子图大小 k 表示为其节点数量 n 的函数;k-对于某些图族,如树和多部图,显示了可重构性[23]。

k—【18】中提出的重构 GNNs 将标准 MPNN 应用于大小为 k 的每个导出子图,并对所得嵌入求和(这是在深度集【24】中使用的置换不变函数)。由于可能有太多这样的子图[25],必须使用采样(这发生在 Dropout GNNs 的相同程序中)。值得注意的是,1990 年 Béla Bollobás 证明了几乎每个图都可以仅用三个(n-1)大小的子图来重构。这个结果提供了为什么随机子采样子图似乎不会损害 k- 重建 GNNs 经验结果【27】的见解。

k=n-1 重构的k-GNN 可以区分标准 GNNs 不能区分的同构图族,如下图所示的循环跳链图:**

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

循环跳过链接图是 WL 测试(以及标准消息传递 gnn)无法区分的非同构正则图的一个例子,但是可以通过 k-重构 gnn 来区分。

同时,对于足够小的k’s[28],存在可由 GNNs 区分而不能由k-重构 GNNs 区分的图。相反,一个(n-**-2)-重构 GNN 可以区分强正则图,这是标准 MPNN(n-重构 GNNs)和(n--1)-重构 GNN 都不能区分的。这是一个有点令人失望的结论:虽然通过类比 k -WL 测试,人们可能会期望在 GNNs、(n-1)-重建 GNNs、(n-2)-重建 GNNs 等之间存在表达能力的等级,但并不存在这样的等级。

【29】中提出的从星星到子图是赵最近与人合作的另一个利用有根子图提高 GNNs 表达能力的作品。看待 WL 测试的一种方式是通过星形模式进行局部颜色细化(根据邻居的颜色和自己的颜色重新标记一个节点,这是有根星形的独特特征)。将星形模式扩展到一般的有根子图,如 egonets [30],产生了 Weisfeiler-Lehman 算法的一种新的基于子图的变体,称为“子图-1-WL”。由于有根子图的数量与图中节点的数量相同,对于常数 k ,该方法与图的大小成线性比例。******

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

以红色节点为根的星形(左)和 1-ego 子图(右)。

子图-1-WL 严格来说比 WL 更强大,但不亚于 3-WL(在某种意义上,存在 3-WL 不能区分但子图-1-WL 可以区分的非同构图)。当使用过小的有根子图(k-尺寸 k ≤4)时,子图-1-WL 无法区分任意 m≥3 的一族 CFI( m )图[31],这也是 m -WL 所知的无法区分。

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

两个非同构强正则图的例子,不能用 3-WL 来区分,但可以用子图-1-WL 来区分(两个允许进行这种区分的子图被突出显示)。

子图 1-WL 算法的神经版本用标准 MPNN 编码每个根子图;然后,聚合得到的节点式表示。与 Dropout GNNs [16]和 Reconstruction GNNs [18]相比,一个重要的区别是使用了交叉子图聚合,它通过利用子图对齐将来自多个子图的相同节点的节点表示汇集在一起(当考虑一组子图的对称组的更精确定义时,我们将看到这种汇集机制可以从第一原理中导出)。此外,通过在训练期间随机丢弃一些子图,同时在测试期间保留所有子图,使用子图丢弃方法来在不牺牲性能的情况下降低可伸缩性开销。**

等变子图聚合网络(ESAN)【32】是一种与子图多重集的对称结构等变的架构,由法布里齐奥·弗拉斯卡、迈克尔·布朗斯坦、哈盖·马龙及其合著者在最近的一篇论文中提出。子图的多重集是高度结构化的对象,其对称性来源于每个组成子图的结构以及作为整体的多重集。等变原则要求改变多重集 m 子图的顺序(置换群σ)和子图中节点的顺序(置换群σ)产生一个等价的表示,或者换句话说,架构是 w.r.t .等变的乘积群σ=σ×σ。与[16,18]不同,这种对称群公式考虑了子图对齐的事实,使得相同的置换作用于所有子图的节点(与单独作用于每个子图的单个节点置换相反)。****

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

多重子图集的对称群是子图置换(绿色)和节点顺序(橙色)的乘积。

ESAN 是“对称对象深层集合”(DSS)架构的一个实例[33]并且使用两个基本图编码器:第一个编码器是一个独立处理每个子图的暹罗网络;第二个通过处理子图的聚集充当信息共享模块。在几个这样的层之后,通过集合学习模块聚集所获得的子图表示,以形成在下游任务中使用的原始图的不变表示。**

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

ESAN 等变层由一个连体网络(编码器 1,橙色)和一个信息共享模块(编码器 2,黄色)构成。

丢弃 GNNs [16]和重建 GNNs [18]可以被视为仅使用第一编码器的 ESAN 的特殊情况[34]。此外,第二个编码器是[29]中使用的交叉图聚合的一般化,它的添加有利于图分类任务的性能[35]。最后,ESAN 考虑了除了简单的节点删除或 egonets 之外的其他子图选择策略(函数𝜋( G )将输入图 G 映射到其子图集合的可能性。**

这篇论文的很大一部分致力于分析 ESAN 的表达能力——这产生了一种新的 Weisfeiler-Lehman 测试变体,称为“DSS-WL”——具有不同的架构和子图选择政策。结论之一是 ESAN 体系结构可以仅使用 WL 图编码器(标准 MPNN)来区分 3-WL 等价图,并且它可以增强更强体系结构的表达能力。

以前有人认为,为了设计更强大的图形神经网络,超越 Weisfeiler-Lehman 测试的表达能力,人们必须放弃消息传递范式。最近出现的基于子图的 GNN 架构显示了这个问题的廉价解决方案,同时仍然保持在消息传递的职权范围内[36]。

除了表达能力的增加之外,在一些图 ML 任务(例如图分类)中,子图 gnn 与标准 gnn 相比,似乎具有更低的方差风险估计量。这些任务本质上对于(一些)节点删除是不变的[37],本文中回顾的基于子图的技术可以理解为一种数据扩充的形式。

[1] J. Gilmer 等人,量子化学的神经信息传递 (2017)。继续。ICML。

[2]gnns 上下文中的“线性复杂度”通常是指在个节点的数量上缩放为𝒪( n 的算法。虽然最坏情况下的边数可以是𝒪( n ,但是通常假设图是稀疏的,在这种情况下,边数是𝒪( n**

[3] K. Xu 等,图神经网络到底有多强大? (2019) ICLR。

[4] C. Morris 等人, Weisfeiler 和 Leman go neural:高阶图神经网络 (2019) AAAI。

[5] B. Weisfeiler,A. Lehman,将一个图简化为标准形式以及其中出现的代数(1968)Nauchno-Technicheskaya informatisia 2(9):12–16。

[6]“颜色”在本文中被理解为节点式离散标签。

[7]其中每个顶点具有相同数量的邻居(即,相等的度数)的正则图是标准 WL 检验不可区分的族的一个例子。要使一个更高维度的 k -WL 失败,需要更多的正则性:这种情况下的一个典型例子是一族k-等正则图。**

[8]拉斯洛·巴拜把 k 的发明归功于 Neil 与鲁道夫·马顿和独立进行的尼尔·伊莫曼埃里克·兰德的自我测试(后者曾被训练成数学家,但更广为人知的是他在基因组学和生物学方面的工作,他也是拜登政府的现任科学顾问)。参见 L. Babai,拟多项式时间中的图同构 (2015),arXiv:1512.03547 第 27 页。

[9] H. Maron 等人,不变和等变图网络 (2019) ICLR。

[10] H. Maron 等人,可证明强大的图形神经网络 (2019) NeurIPS。参见作者的一篇博文。

[11]Morris 在[4]中介绍的 k -GNN 架构招致𝒪( nᵏ 存储器复杂度。在后续工作中,C. Morris 等人、 Weisfeiler 和 Leman go sparse:Towards scalable higher-order(2020)neur IPS 2020 还设计了一个基于局部邻域聚合的局部版本的k-GNNs[32],考虑到了基础图的稀疏性,并表明该局部版本至少具有与普通的 k -WL 相同的功效。Maron 在[9]中引入的不变图网络(IGN)基于 k 阶张量,并且是kWL 等价的。IGNs 是从 k -WL 的不同变体中派生出来的,与 k -GNNs 相比,在复杂性方面更有优势。特别是,3-WL 等效 IGN“仅”具有二次复杂度。****

[12] A. Vaswani 等人,注意力是你所需要的全部 (2017) NIPS。

[13]关于 GNNs 中位置编码的更详细分析,参见例如 A. Loukas,什么图形神经网络不能学习:深度对宽度(2020)ICLR;ICLR’20,R. Sato 等,随机特征强化图神经网络(2021)SDM;r .阿鲍德等人,具有随机节点初始化的图神经网络的惊人能力 (2020),IJCAI。

[14] G. Bouritsas 等,通过子图同构计数提高图神经网络表达能力(2020)arXiv:2006.09252;参见随附的帖子

[15]图子结构网络[14]的表现性类不遵循标准的 k -WL 层次结构。论文中的分析表明,GSN 在 WL 时至少具有同样的表达能力(即,能区分 WL 能区分的所有图),此外,它还能区分一些 WL 不能区分的非同构图。对于更高维度的 k -WL 测试,给出了不能被 k -WL 区分但可以被具有右子结构的 GSN 区分的图的例子,然而,GSN 可以区分的图的确切类别是未知的。如果重构猜想成立,那么 GSN 是最大表达的。

[16] P. A. Papp 等, DropGNN:随机丢失增加了图神经网络的表达能力 (2021) arXiv:2111.06283。

[17] Y. Rong 等人, DropEdge:走向节点分类上的深度图卷积网络 (2020)是一个典型的图的丢弃方法,其动机主要是希望设计更深的 GNNs(另见关于深度 GNNs 的帖子)。一般来说,随机子图选择提出了一个潜在的问题,因为网络的输出不是排列不变的。然而,在报告的实验结果中,这似乎不会导致任何显著的性能下降。

[18] L. Cotta 等人,强大图形表示的重构 (2021) NeurIPS。

[19]重构猜想首先出现在 P. J. Kelly 的博士论文《论等距变换》( 1942 年)中,该论文是他在“热核弹之父”stanisaw Ulam 的指导下在威斯康星大学麦迪逊分校完成的。参见 J. A. Bondy,《组合学 166:221–252 中的图形重构者手册(1991)调查》,了解图形重构结果的全面综述。

[20]在重构猜想的上下文中,各个子图被称为“卡片”(每个卡片的大小为n-1),它们的集合是一副“卡片”。因为卡片组中的子图被交给同构类,所以卡片组是一个多重集(其中每个元素可以出现不止一次)。如果一个图 HG 有相同的牌组(表示为 H ~ G ),则称它们是G重构G可重构的,如果它的每一个重构都同构于 G 自身(即 H ~ G 蕴涵 HG )。重构猜想陈述了如果 GH 是两个至少有三个顶点的有限无向简单图并且 HG 的重构,那么 HG 。有趣的是,有向图、超图和无限图是不可重构的。**

[21] B. D. McKay,小图是可重构的 (1997)澳大利亚组合学杂志 15:123–126。

[22] P. J .凯利,树的一个同余定理 (1957)太平洋数学杂志。7:961–968 将重构结果扩展到大小为 k 的更小的子图。因此,原始重建结果是一个特例,其中k=n-1。**

[23]v . n dl,从子图的图重构 (2001)离散数学 235(1–3):335–341。

[24] M. Zaheer 等人,深套 (2017),NIPS。

【25】恰恰有 n !/( k !(nT62k)!)在大小为 n 的图中,大小为 k 的子图。

[26]b . bollo bas,几乎每个图都有重构数 3(1990)《图论杂志》14(1):1–4。

[27]参见[18]的补充。

[28]图中所示为[18]中的命题 2,针对的是 k ≤⌈ n /2⌉.

[29] L .赵等,从星到子图:用局部结构意识提升任何一个 GNN(2021)arXiv:2110.03753。

[30]一个节点的 k -egonet 是其具有诱导连通性的 k -hop 邻域。

[31] CFI 图以 J.-Y. Cai、M. Fürer 和 N. Immerman、的首字母命名,这是图识别变量数量的一个最佳下界(1992)Combinatorica 12(4):389–410。

[32] B. Bevilacqua 等人,等变子图聚合网络 (2021) arXiv:2110.02910。查看主要作者论文演示的视频

[33]“复合”对象的等变架构,如具有自身内部对称性的对象集(对称对象的深度集,或 DSS),之前由 H. Maron 等人在学习对称元素集时考虑过(2020)ICML。

[34]辍学[16]和重建[18]中使用的暹罗网络可以从一个更大的对称群中导出,该对称群使用了一种不同的群积概念,称为圈积,参见 R. Wang 等人,分层结构的等变映射 (2020) arXiv:2006.03627。

[35]在[32]中示出了信息共享模块的使用,以在 91%的情况下改善基本编码器的性能,相比之下,当仅使用暹罗网络时,改善基本编码器的性能为 75%。

[36]到目前为止,我们的综述并不详尽,其他几个同时进行的工作已经探索了类似的想法,参见例如 M. Zhang 和 P. Li,嵌套图神经网络(2021)arXiv:2110 . 13197;D. Sandfelder 等人,E go-GNNs:利用图神经网络中的自我结构(2021)arXiv:2107.10957;以及 E. H .蒂埃德等人 Autobahn:基于自同构的图形神经网络 (2021) NeurIPS。

[37]这在[18]中显示为k重建 GNNs,这是 ESAN 的一个特例。**

我们非常感谢克里斯蒂安·博德纳尔和乔治·布瑞萨斯对这篇文章的校对和提供的深刻反馈。有关图形神经网络的其他阅读资料,请参见迈克尔在 上的博客,了解数据科学 订阅 他的帖子和 YouTube 频道 ,获得 中等会员资格并关注 迈克尔

使用 5 阶段数据成熟度模型评估组织影响

原文:https://towardsdatascience.com/using-the-5-stage-data-maturity-model-for-organizational-impact-d398ddd07c4c?source=collection_archive---------19-----------------------

无论您处于流程的哪个阶段,都可以构建和灵活运用您的业务战略

从简单的商业报告到商业智能是一个巨大的飞跃,但是那些让超越传统商业智能的公司是那些扰乱市场的公司。他们投资于源自其业务运营的现代数据团队,以优化整个组织的洞察力,推动增长和投资回报。所以,如果你落后了,你能做什么?你怎么能在这个水平上竞争?从零开始对机器学习进行重大投资可能对你的公司是正确的,也可能不是正确的——然而,认真审视成熟度曲线是前进的最佳方式。

在这项工作中,有必要了解现代数据团队的定义。过去的数据团队可能只有三个传统参与者,即负责数据仓库功能和容量的数据库管理员、专注于数据建模的数据分析师以及负责构建仪表板和相关自助报告功能的 BI 架构师,而如今的团队成员则更多。通常是一个与企业合作但有自己专业技能的团队,这个团队做从概述业务规则到建模数据再到构建单一事实来源的所有事情。最重要的是,这些人提供专门的分析,这种评估是传统 BI 无法提供的。问一个商业问题,比如“我的收入模式应该是什么?”该小组将测试其假设,以展现出人意料的见解。他们可能会应用机器学习或一些统计和预测技术来确定您的组织没有理想数据的模式或差距。

关键的一点是,与仅提供数据模型的传统 BI 团队不同,今天的数据团队作为企业的核心职能运作,并推荐基于数据的战略。该小组在会议桌上占有一席之地,根据数据提供关于公司应该做什么的明智意见。

并非每家公司都拥有或需要最先进的数据团队

五阶段模型展示了数据团队成熟度和组织影响。许多组织都处于这种模式的早期或晚期阶段,这取决于数据对其业务和业务模式的重要性,以及可以在执行日益高级的分析所需的资源上投入多少。初始阶段包括简单的业务报告;其次是商业智能;第三是特别分析和意想不到的见解。第四阶段整合混合集中式数据团队,第五阶段用机器学习增强分析。

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

图片来源:Sisense

这些选项的影响与公司在数据和数据分析方面的投资直接相关,更高的性能需要更多的资源。考虑一家专注于业务报告的公司,它被大多数组织视为数据洞察的最低级别。最终,每个小组都使用孤立的数据进行操作,即使数据与公司内的其他团队不一致,也能洞察关键因素。问题伴随着不一致性出现,例如当来自一个域的数据与另一个域的数据冲突时。客服说流失率在上升,而销售团队说流失率在下降。公司各部门、团队或应用程序之间的数据要么不同,要么有不同的解释。可以跟踪部门绩效,但是不同且独立的事实来源代表了组织的真实挣扎。该公司需要进入第二阶段,这一阶段的重点是通过将数据集中到一个地方来实现商业智能,该数据允许以相同的方式从相同的信息中创建一致的报告。

几乎每个组织都有某种形式的 BI,它可以被描述为一个数据模型和一个可视化工具,基于跨多个来源连接的数据支持业务报告。在这种情况下,可以对数据提出问题,跨越各种数据源,以获得反映在包含整个业务的报告中的业务真相。哪些问题会导致负面的客户体验?营销计划和客户保持率之间有什么关系?这些都是从统一的数据分析方法中产生的有价值的业务见解。在这个成熟度级别,数据分析师是等式的一部分,对于在数据之间建立关联至关重要。这是一个远远超出后视洞察力的分析阶段,实现了有助于将数据应用于未来业务运营和战略的预测性报告。

第三个阶段,即席分析和见解,是关于数据专业人员检查组织数据,询问和回答意外问题,并积极寻求优化业务。“我们能否在销售线索出现时对其进行评分,以确定哪些是最重要的?这些应该如何进行优先排序?”这些都是可以随时提问和回答的问题,有助于提高销售和客户健康的评分策略。扩大这项工作的规模是公司进入第四阶段的关键,这一阶段的特点是混合集中式数据团队。

最终,通过单个数据团队路由每个数据请求并不是一个针对规模优化的策略。当集团支持营销、销售、产品、客户成功、财务和其他不同的公司部门时,可能会出现瓶颈。第四阶段引入了一个混合集中式模型,通过建立一个定义方法和实践的核心数据团队来满足需求,并由一个独立的营销、产品、销售等分析团队提供支持。由于每个团队都与集中的团队合作,整个企业可以作为一个数据驱动的实体进行扩展。

第五阶段利用增强分析和机器学习。数据科学家发挥着重要作用,他们发明或利用机器学习、统计技术和预测能力来预测商业行为。他们的新方法与集中式数据团队共享,应用于业务问题,并用于优化大规模运营。“我们的预测是在正轨上还是在变化?业务本身在变化吗?当顾客进入我们的销售漏斗时,我们如何预测他们的行为?什么样的新服务能让我们成为同类最佳?”这些更深入、更高级的问题依靠数据科学家和预测技术来提供价值。需要注意的是,在数据成熟度曲线的这一点上,实现价值的时间可能会更长。更先进的技术需要更大的投资和一些耐心;然而,回报通常比成熟早期要丰厚得多。

大多数组织都处于四个成熟度级别之一

问几个关键问题来决定你公司的定位。您是否使用不同的报告平台来报告不同的业务职能?您是否孤立于不同部门的记录系统中,或者您是否拥有跨各种业务工具的集成报告?第一阶段和第二阶段的区别在于,您的组织数据是否在单个数据仓库中共享,以及是否针对跨多个来源的业务查询进行了结构化。如果公司有集中的报告,并且 ETL 过程提供了良好的数据模型,那么您可能已经达到了第二个成熟阶段。

另一个需要考察的领域是数据广度。您的业务数据中有百分之多少被整合到一个真实的来源中?事实上,对于任何组织来说,将全部 100%的数据放在真实的中心来源中是不寻常的。这甚至可能是一个无法实现的目标,但是你朝着这个目标前进了多少呢?确定有多少业务数据实际上位于中央存储库中,为您的成熟度时间线提供了一个关键的标记。

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

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

您的数据分析师可以将模型数据与来自多个来源的原始数据混合在一起吗?这是一个微妙但值得思考的问题。理想情况下,您的数据团队可以获取来自新系统的原始数据,并将其与现有的模型数据(如客户、机会或服务数据)相结合,以回答当前数据模型中可能没有预料到的问题。如果将来自多个来源的数据混合到一个仓库中,该过程发生在数据到达仓库之前还是之后?例如,一种更现代的方法是在入库后混合数据。您的数据是否涵盖了客户旅程的所有相关阶段,或者您是否比销售人员更了解潜在客户?关于产品使用的数据很多,但关于它如何影响客户购买偏好的数据却很少?

在确定数据成熟度的过程中,数据治理和访问也至关重要。您公司中担任不同角色的人员对数据的访问权限是否不同?规模较小的创业公司可能没有设立准入门槛,因为参与其中的每个人都是某种意义上的负责人。但是增长可能需要一些更快的行动。随着组织的成熟,剔除个人身份信息(PII)、工资数据或其他他人根本不需要看到的专有事实可能变得至关重要。一个受管理的、单一的真相来源对这些类型的实体也是至关重要的。通常,早期企业有数据游乐场,任何人都可以做任何事情,无意中造成幻灯片被共享但不一定有谨慎计算支持的情况。相比之下,由数据团队控制的治理源只发布批准的数据或明确标记为根据游戏规则开发的数据。

如果业务单位雇佣并嵌入他们自己的分析师来使用中央数据团队提供的工具,混合集中式模型就发挥作用了。当考虑先进的数据能力时,你的公司有模型管理和生产能力吗?您的产品或分析中是否部署和使用了机器学习系统?你的分析工作流程包括机器学习模型吗?这些不一定是内部构建的,通常可以通过现有的模型和行业工具更容易地利用,假设您的分析工作流有能力和培训将它们纳入分析。

使用数据成熟度模型实现数据驱动的成功

你可能会听到首席执行官拍着桌子说,“我们必须以数据为导向。我希望公司里有机器学习。我不太清楚那是什么,但我知道我想要它。”问题是,从基本报告直接进入增强分析意味着您可能会错过一些关键的基础功能,可能会阻止您从更高级的分析中实现预期的影响。缺少 BI 基础和健康的混合团队,组织可能能够开发先进的见解,但发现自己在整个业务中应用它们时有障碍。没有交流框架和基础设施来共享见解。这是一步步经历成熟度模型的最大原因之一。通过建立这些早期阶段,企业创建了开发新见解所必需的基础设施和经验,然后将它们有效而正确地传达给企业。遵循这条曲线的公司更有利于获得长期竞争优势,建立连接组织,让实体将洞察力转化为真正的商业价值。

在 SQL 中使用计数/分组依据/连接组合

原文:https://towardsdatascience.com/using-the-count-group-by-join-combination-in-sql-414d81626764?source=collection_archive---------2-----------------------

计算 SQL 中条目的实例数

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

来源:图片来自 Pixabay

在使用 SQL 中的表时,经常会希望计算该表中实例的数量。这可以是产品类别、品牌等。

当使用一个表时,这就足够简单了。但是,当跨多个表工作时,这项任务可能会有些麻烦。

这里,我们将看一个例子,说明如何将 COUNT 和 GROUP BY 函数与一个内部连接结合起来,以计算特定零售商的不同产品类型的数量。

服装店示例

让我们假设一个繁忙的服装店有几个表存储在一个数据库中,该数据库包含在任何给定时间存储在其仓库中的所有商品。这些表包含商品名称、价格、品牌、产品类型等信息。业主难以估计仓库中每件产品的具体数量,即仓库中存放了多少条牛仔裤、多少件 t 恤?

考虑以下两个表:

>>> select * from clothes1 limit 1;item                | colour   | type 
--------------------+----------+----------
Grass Green T-Shirt | Green    | T-Shirt>>> select * from clothes2 limit 1;item               | price   | size 
-------------------+---------+--------
Sky Blue Jeans     |  79.99  | 31

假设以下场景。 clothes1 代表仓库中曾经出现过的所有衣物。 clothes2 代表仓库中任何一次出现的所有衣物。

假设只有 clothes1 表包含关于类型的信息,这意味着第一个表必须与第二个表连接,以便通过类型识别第一个表中出现的每个项目。

因为我们只想计算当前出现的服装项目的类型,而不是那些存储在第二个表中但没有出现的服装项目的类型,所以我们使用内部连接而不是完全连接来实现这个目的。

使用完全连接将返回 clothes1 中的所有条目,即曾经出现在仓库中的条目。因为我们只对计算当前库存感兴趣,所以我们使用了一个内部连接。

询问

以下是查询:

>>> select t1.type, count(*) from clothes1 as t1 inner join clothes2 as t2 on t1.item=t2.item group by t1.type;

从这个查询中,我们获得了一个类似如下的表:

 type    | count 
-----------+-------
 T-Shirt   |  2496
 Jeans     |  3133
 Sneakers  |  2990
 Shirts    |  3844
 Ties      |  1789
 Trousers  |  2500
(6 rows)

结论

在这个简短的教程中,您已经看到了如何在 SQL 中使用 COUNT/GROUP BY/JOIN 组合来聚合多个表中的条目。

虽然 GROUP BY 查询在只处理一个表时可以简单地实现这一点,但在处理多个表时,情况会变得更加复杂。

非常感谢阅读,任何问题或反馈都非常感谢!您还可以在这里找到原始文章以及有用的 SQL 实践的更多示例。

免责声明:本文是在“原样”的基础上编写的,没有担保。它旨在提供数据科学概念的概述,不应被解释为专业建议。本文中的发现和解释是作者的发现和解释,不被本文中提到的任何第三方认可或隶属于任何第三方。

在 Wolfram 语言中使用 Gurobi 优化器

原文:https://towardsdatascience.com/using-the-gurobi-optimizer-in-the-wolfram-language-939ce585ec64?source=collection_archive---------26-----------------------

实践教程

使用 Gurobi 增强您的优化问题解决能力

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

一个已解决的优化问题——在 Unsplash 上由 S & B Vonlanthen 拍摄

当你进行一次大型旅行时,无论是城市旅游还是背包探险,你都面临着这样一个问题:我的行李里应该放些什么?我是应该多带一件毛衣,因为天可能会冷,还是应该带一件雨衣,因为天气预报似乎要下雨。是应该多带袜子还是多带内衣?我应该带笔记本电脑还是平板电脑就可以了?

当你思考这些问题时,你在解决一个背包问题:给定有限的空间和重量,你在给物品赋值并对它们设置约束。例如,你可能想至少带两件 t 恤,但如果有足够的空间,你可能想带第三件或第四件 t 恤。与此同时,你可能更看重多带几双袜子或多一双鞋。

当你合上行李时,你已经解决了你的最优化问题,实际上就是在你的头脑中做了一大堆数学运算,决定带什么和带多少。

世界各地都出现了更复杂的这类和其他类型的优化问题:用最佳数量的包裹装满一辆卡车,为一辆公共汽车找到最佳路线,在最短的时间内运送最多的人,找出最佳的配料组合,以生产出完整的动物饲料,等等。

当你有不同值和约束的多个选项时,你必须解决一个优化问题。

Wolfram 语言提供了一大组解决优化问题的函数:它可以解决符号和数值优化问题,局部和全局问题,线性和非线性问题,凸和非凸优化问题。每种类型的优化问题都有自己的解决算法,而 Wolfram 语言通过精心设计的顶级界面和内置的自动算法选择,可以轻松使用所有算法。

但是快速解决优化问题是一个复杂的算法挑战:在这个领域没有“可证明最快”的算法。每年都会发现许多新的最先进的算法,将性能边界推得越来越远。为了让 Wolfram Language 访问这些前沿解算器,我们开发了一个通用优化框架,允许您利用任意数量的解算器。

为了使数值问题变得更加简单,Wolfram Research 为来自 Gurobi 的最先进的求解器提供了内置支持,该公司专注于提供世界上最快的优化求解器。他们的旗舰产品 Gurobi Optimizer 比其他求解器快得多,可以解决以下主要优化类型(包括实值和混合整数子类型):线性优化、二次优化、二阶锥优化和二次约束优化。

在这篇文章中,我将温和地介绍使用 Gurobi Optimizer 的可能性,以及如何使用 Wolfram 语言在一个非常高的层次上指定优化问题,它具有内置的排版功能、一流的符号预处理功能以及非常棒的可视化特性。

首先,让我们看看 Gurobi 支持的优化类型及其缩写如何映射到 Wolfram 语言函数中:

除了这些 Wolfram 语言函数之外,还有更高级别的函数,如n 最小化n 最大化,它们自动识别优化类型并选择合适的求解算法。在这篇文章中,我将坚持使用范围更小的 Wolfram 语言函数。

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

解决优化问题——Claudio Schwarz 在 Unsplash 上拍摄的照片

基础—线性优化

让我们从一个非常简单的线性优化问题开始,其中成本函数和约束都是具有任意数量决策变量的线性函数:

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

(图片由作者提供)

在这个有两个决策变量(x 和 y)的简单例子中,我们可以用等高线图来可视化可行区域。此处,橙蓝色阴影表示成本函数的值(无关的绘图细节和选项已通过 Wolfram 笔记本界面的图标化功能省略(…)):

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

(图片由作者提供)

我们现在使用 LinearOptimization 函数来获得答案,并指定我们感兴趣的结果类型(在本例中是原始最小值和原始极小值)。为了使用古罗比优化器,我们将方法选项设置为“古罗比”:

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

(图片由作者提供)

通过指定变量的类型,可以很容易地将这个问题转化为混合整数问题:

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

(图片由作者提供)

我们使用等高线图来放大两个解决方案的位置:

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

(图片由作者提供)

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

找到每个集装箱的最佳位置——照片由 Unsplash 上的 CHUTTERSNAP 拍摄

对速度的需求…

对于简单的优化问题,内置解算器的性能与古罗比优化器差不多:你得到相同的结果,两个解算器眨眼之间就返回答案。但是大多数现实世界的优化问题都有大量的变量和约束。为了显示内置求解器(CLP)和 Gurobi 优化之间的性能差异,我们可以创建一个带有 SparseArray 的示例。下面的 SolverTiming 函数接受一个大小参数(“n”)和一个求解方法(“Gurobi”或“CLP”):

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

(图片由作者提供)

现在,我们可以使用 SolverTiming 函数来创建一个数据集表,以增加每个求解器的问题大小及其计时:

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

我们可以在列表图中比较性能,显示 Gurobi 比 CLP 求解器快一个数量级以上:

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

请注意,我在这里使用了一个非常简单的线性优化示例。 Gurobi 优化器在许多领域表现出色,尤其是在混合整数问题上。有关其性能的更多信息,请访问 Gurobi 的基准测试网页。

正在导入优化问题…

除了在一个 Wolfram 语言会话中创建优化问题之外,你还可以导入以 MPS 格式存储的优化问题。例如,这导入了一个标准的线性优化问题,然后使用 Gurobi 优化器来解决它:

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

以最佳方式管理有限的资源——图片由亚采克·迪拉格Unsplash 上拍摄

二次优化

现在让我们来看看几个二次优化问题,你可以用古罗比优化器来解决。二次优化函数可以解决实数和混合整数问题。

Wolfram 语言的一个很好的特性是你可以使用通用的紧凑矩阵和向量符号来描述你的问题。这里,我们随机生成问题参数,并使用向量不等式字符表示:

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

并使用 Gurobi 优化器获得解决方案:

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

或者我们可以创建一个混合整数问题。这个例子有 3 个实数决策变量和 5 个整数决策变量:

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

使用高级 Wolfram 语言函数…

Wolfram Language 的优化框架的另一个很好的特性是能够将更高级别的符号问题公式翻译成一种 Gurobi 优化器可以处理的形式。在这个例子中可以看到这样一个例子,我们使用 Total […]简洁地将向量 x 和 Norm […]的元素之和表示为元素平方和的平方根。

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

有许多更高级的 Wolfram 语言函数可以用于向量和矩阵,包括所有基本的算术函数和距离函数。

当原语表示适当的约束时,您还可以在像SecondOrderConeOptimization这样的函数中使用像 Disk 这样的基于区域的原语。这里一个圆盘代表一个二阶锥约束 x +y < =1,因此它被转换成一种 Gurobi 优化器可以处理的形式:

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

这相当于编写以下语句:

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

其他基于区域的图元包括多边形和多面体。

两全其美…

LinearOptimizationQuadraticOptimizationSecondOrderConeOptimizationConvexOptimization 的文档页面包含数百个有趣的应用示例,让您可以非常轻松地开始使用 Wolfram 语言Gurobi Optimizer :从库存控制问题、制造问题和运输问题,到解决数独、旅行推销员问题和投资组合优化等数学难题。

对于高技术人员,尤其是那些精通 Wolfram 的人,我们最近也开源了我们的实现,展示了从 Wolfram 语言Gurobi 优化器的连接是如何“在幕后”工作的。它被命名为 GurobiLink,位于 Wolfram Research Github 页面。

使用 Wolfram 语言中的 Gurobi Optimizer 为您带来两全其美:领先的优化问题求解器性能与世界上最好的科学和商业应用计算语言。哦,它还能帮你算出下次旅行要带多少衬衫!😉

要了解更多关于古罗比以及如何获得古罗比优化器的信息,请访问:https://www.gurobi.com/

要了解更多关于 Wolfram 研究Wolfram 语言,请访问:https://www.wolfram.com/

在机器学习之前使用缺失数据 Python 库识别和可视化缺失数据

原文:https://towardsdatascience.com/using-the-missingno-python-library-to-identify-and-visualise-missing-data-prior-to-machine-learning-34c8c5b5f009?source=collection_archive---------4-----------------------

使用岩石物理测井测量的例子

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

蒂姆·莫斯霍尔德在 Unsplash上的照片

数据探索和预处理是任何数据科学或机器学习工作流中的重要步骤。在处理教程或训练数据集时,可能会出现这样的情况,即它们已被设计为易于使用,并允许所讨论的算法成功运行。然而,在现实世界中,数据是杂乱的!它可能有错误的值、不正确的标签,并且它的某些部分可能会丢失。

缺失数据可能是处理真实数据集时最常见的问题之一。数据丢失的原因有很多,包括传感器故障、数据过时、数据管理不当,甚至是人为错误。缺失数据可能是单个值、一个要素中的多个值或整个要素缺失。

重要的是,在进一步的数据分析或机器学习之前,识别并适当处理缺失的数据。许多机器学习算法无法处理缺失数据,需要删除或用新值替换(估算)存在单个缺失值的整行。

根据数据源的不同,缺失值可能以不同的方式表示。最常见的是 NaN(不是数字),但是,其他变体可以包括“NA”、“None”、“999”、“0”、“0”、“-”。如果丢失的数据在数据帧中由 NaN 以外的东西表示,那么应该使用如下所示的np.NaN将其转换为 NaN。

df.replace('', np.NaN)

本文附有以下视频:

失踪的图书馆

Missingno 是一个优秀且简单易用的 Python 库,它提供了一系列可视化功能来理解 pandas 数据帧中缺失数据的存在和分布。这可以是柱状图、矩阵图、热图或树状图的形式。图书馆的原始出版物可以在这里找到。

从这些图中,我们可以确定缺失值出现的位置、缺失的程度以及任何缺失值是否相互关联。通常,丢失的值可能被视为没有提供任何信息,但如果仔细分析,可能有一个潜在的故事。

可以使用 pip 命令安装缺少的库:

pip install missingno

数据集

对于本教程,我们将使用由 Xeek 和 FORCE 2020 举办的机器学习竞赛的公开数据集的子集。竞赛的目的是从现有的标记数据中预测岩性。该数据集由挪威海的 118 口井组成。

该数据包含由测井工具获得的一系列电测量值。测量结果用于表征地下地质和识别合适的油气储层。

本文的数据和笔记本可以在我位于 https://github.com/andymcdgeo/missingno_tutorial的 GitHub 仓库中找到

导入库和加载数据

该过程的第一步是导入库。在本文中,我们将使用 pandas 加载和存储我们的数据,使用 missingno 可视化数据完整性。

import pandas as pd
import missingno as msnodf = pd.read_csv('xeek_train_subset.csv')

熊猫快速分析

在我们使用 missingno 库之前, pandas 库中有几个特性可以让我们初步了解丢失了多少数据。

第一种是使用.describe()方法。这将返回一个表,其中包含有关数据帧的汇总统计信息,如平均值、最大值和最小值。在表格的顶部是一个名为计数的行。在下面的示例中,我们可以看到数据帧中的每个特征都有不同的计数。这提供了并非所有值都存在的初始指示。

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

我们可以更进一步,使用.info()方法。这将返回数据帧的摘要以及非空值的计数。

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

从上面的例子中我们可以看到,我们对数据的状态和数据丢失的程度有了一个更简洁的总结。

我们可以使用的另一个快速方法是:

df.isna().sum()

这将返回数据帧中包含多少缺失值的摘要。isna()部分检测数据帧中缺失的值,并为数据帧中的每个元素返回一个布尔值。sum()部分对真值的数量进行求和。

该行返回以下信息。

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

从这个总结中,我们可以看到许多列,即 WELL、DEPTH_MD、GROUP、GR 和 LITHOFACIES 没有空值。所有其他的都有大量不同程度的缺失值。

使用缺失号识别缺失数据

在 missingno 库中,有四种类型的图形用于显示数据完整性:条形图、矩阵图、热图和树状图。每种方法在识别缺失数据方面都有自己的优势。

让我们依次来看一下其中的每一项。

条形图

条形图提供了一个简单的绘图,其中每个条形代表数据帧中的一列。条形的高度表示该列的完整程度,即有多少非空值。它可以通过调用以下命令来生成:

msno.bar(df)

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

在图的左侧,y 轴刻度范围从 0.0 到 1.0,其中 1.0 表示 100%的数据完整性。如果柱线小于此值,则表明该列中缺少值。

在图的右侧,标度以指数值度量。右上角代表数据帧内的最大行数。

在图的顶部,有一系列数字表示该列中非空值的总数。

在此示例中,我们可以看到许多列(DTS、DCAL 和 RSHA)有大量缺失值。其他列(如 WELL、DEPTH_MD 和 GR)是完整的,并且具有最大数量的值。

矩阵图

如果您正在处理与深度相关的数据或时间序列数据,矩阵图是一个很好的工具。它为每一列提供颜色填充。当数据存在时,图以灰色(或您选择的颜色)显示,当数据不存在时,图以白色显示。

可通过调用以下命令生成矩阵图:

msno.matrix(df)

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

缺少显示所有 dataframe 列的数据稀疏性的矩阵图。

如结果图所示,DTS、DCAL 和 RSHA 列显示了大部分缺失数据。这已在条形图中指出,但额外的好处是您可以查看丢失的数据在数据帧中的分布情况。

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

missingno 迷你图的特写视图。图片由作者提供。

图的右侧是一个迷你图,其范围从左侧的 0 到右侧数据框架中的总列数。上面可以看到特写。当一行的每一列都有值时,该行将位于最右边的位置。随着该行中缺失值开始增加,该行将向左移动。

热图

热图用于识别每个不同列之间的零相关性。换句话说,它可以用来识别每一列之间是否存在空值关系。

接近正 1 的值表示一列中存在空值与另一列中存在空值相关。

接近负 1 的值表示一列中存在空值与另一列中存在空值是反相关的。换句话说,当一列中存在空值时,另一列中存在数据值,反之亦然。

接近 0 的值表示一列中的空值与另一列中的空值之间几乎没有关系。

有很多值显示为

The heatmap can be generated by the following code:

msno.heatmap(df)

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

missingno heatmap plot illustrating the correlation in nullity between data columns. Image by the author.

Here we can see that the ROP column is slightly negatively correlated with the RHOB, NPHI and PEF columns, and slightly positively correlated with RSHA. If we take a look at DRHO, its absence is highly correlated with missing values in the RHOB, NPHI and PEF columns.

The heatmap approach is more suitable for smaller datasets.

Dendrogram

The dendrogram plot provides a tree-like graph generated through hierarchical clustering and groups together columns that have strong correlations in nullity.

If a number of columns are grouped together at level zero, then the presence of nulls in one of those columns is directly related to the presence or absence of nulls in the others columns. The more separated the columns in the tree, the less likely the null values can be correlated between the columns.

The dendrogram can be generated by:

msno.dendrogram(df)

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

mssingno dendrogram illustrating the correlation in nullity between the well log measurements.

In the dendrogram plot above, we can see we have two distinct groups. The first is on the right side (DTS, RSHA, and DCAL) which all have a high degree of null values. The second is on the left, with the remainder of the columns which are more complete.

LITHOFACIES, GR, GROUP, WELL, and DEPTH_MD are all grouped together at zero indicating that they are complete.

RDEP, Z_LOC, X_LOC, and Y_LOC are grouped together close to zero. RMED is in the same larger branch suggesting that some of the missing values present within that column can be correlated with these four columns.

Summary

Identifying missing prior to applying machine learning is a key component of the data quality workflow. This can be achieved using the missingno library and a series of visualisations to understand how much missing data is present, where it occurs, and how the occurrence of missing values is related between the different data columns.

感谢阅读!

如果你觉得这篇文章有用,请随时查看我的其他文章,这些文章从不同的角度研究了 Python 和测井数据。你也可以在 GitHub 找到我在这篇文章和其他文章中使用的代码。

如果你想联系我,你可以在 LinkedIn 或者我的 网站 找到我。

有兴趣了解更多关于 python 和测井数据或岩石物理学的知识吗?跟我上

如果你喜欢这篇文章或任何其他文章,并想表达你的谢意,欢迎你来给我买杯咖啡

参考

比洛古尔(2018)。缺少 no:一个缺少的数据可视化套件。《开源软件杂志》,3 卷 22 期,547 页,https://doi.org/10.21105/joss.00547

博尔曼,彼得,奥桑德,彼得,迪里布,法哈德,曼拉尔,投降,&迪辛顿,彼得。(2020).机器学习竞赛 FORCE 2020 井测井和岩相数据集[数据集]。芝诺多。http://doi.org/10.5281/zenodo.4351156

使用正确的工具可视化数据

原文:https://towardsdatascience.com/using-the-right-tools-to-visualize-data-20c994f7392f?source=collection_archive---------8-----------------------

数据可视化

Tableau、ggplot2 和 seaborn

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

图片来源:我

谈到可视化数据,大多数人都有一个简单明了的想法。他们用散点图来显示两个变量之间的关系。箱线图用于比较变量中不同元素的离差。饼图可以用来描绘不同的类作为一个整体对变量的贡献。时间序列图可用于显示某人或某个组织在一段时间内所取得的进展。

除了对使用什么样的图表有一个明确的想法之外,重要的是利用一个软件包来创建图表和开发图表,有多种资源可以用来实现这一点。ggplot2 via R、seaborn via python、Tableau、PowerBI、MS Excel 都是用于构建图表的一些著名平台。

本文将关注在三个包/平台上构建图表的过程:Tableau、seaborn 和 ggplot2。所使用的数据集是广泛使用的 iris 数据集。虹膜数据集有五个变量。其中四个是连续变量:花瓣长度,花瓣宽度,萼片长度和萼片宽度。最后一个是分类变量,叫做物种。它有三个等级:setosa,virginica 和 versicolor。

通过在所有三个平台上构建相同的图表,可以比较图表的质量,并决定在处理数据可视化项目时使用哪一个。生成的两个图表是:

  • 比较萼片宽度和萼片长度之间关系的散点图。
  • 比较不同物种四个变量平均值的条形图。

iris 数据集在 R-studio 和 Jupyter 笔记本上都是现成的。因此,它很容易被导出用于 Tableau。

(舞台上由人扮的)静态画面

Tableau 是一个让数据可视化尽可能简单的平台。与 python 和 R 相比,它的巨大优势在于它不需要代码来加载数据集或创建图表。由于其拖放功能,它允许用户修改变量来构建图表,从而有效地向用户呈现信息。它还有其他功能,可以用来美化图表,使它们对观众有吸引力。

一个很好的生动的例子。图表是在一分半钟内完成的。

Tableau 的易用能力在上面的视频中可以见证。本·琼斯(Ben Jones)的《与 Tableau 交流数据:设计、开发和交付数据可视化》是一本可以指导初学者如何掌握使用 Tableau 的艺术的书。使用 Tableau 构建的其他图表可以在下面查看。

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

Tableau 如何呈现散点图

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

Tableau 如何呈现条形图

ggplot2

ggplot2 是 R-studio 提供的一个非常棒的包。与 Tableau 不同,它要求用户导入一个包来构建图表。虽然它需要一些编码,但是编码的语法非常简单。用 ggplot2 构建一个简单的图表包括两个简单的步骤。

第一步是加载 tidyverse 包。ggplot2 包是 tidyverse 包提供的众多包中的一个。通过加载 tidyverse 包,用户还可以在设计图形时访问其他包的功能。加载 tidyverse 的代码可以在下面看到。

install.packages("tidyverse")
library(tidyverse)

第二步是使用编码语法生成图形。编码语法如下所示。ggplot()调用 ggplot2 包并识别要使用的数据。geom_point()表示带有点的散点图是所需的图形。通过在 geom_point()中使用 aes()命令,可以很容易地绘制出哪些变量应该出现在 x 和 y 轴上,并根据它们的种类对它们进行分组。labs()可用于为图表添加标题,并标记 x 轴和 y 轴。使用 theme_classic()将主题设置为 classic 使得用户可以使用经典主题。

如果用户对绘制不同于下面通过 ggplot2 创建的图表感兴趣,此链接可作为用户的指南。

ggplot(data = df_iris) +
  geom_point(aes(x = sepal_width, y = sepal_length, color = species)) +
  labs(title = "Sepal length vs Sepal width", x = "Sepal width", y = "Sepal length") +
  theme_classic()

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

ggplot2 如何渲染散点图

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

ggplot2 如何渲染条形图

海生的

Seaborn 是 python 提供的一个包。它是对 python 提供的另一个数据可视化包 matplotlib 的改进,用于美化图形。Seaborn 的功能就像 ggplot2 一样,它要求用户加载一个包,并使用编码语法来获得所需的绘图。下面是加载 seaborn 包和其他有用的包的代码,这将使设计图表变得容易。

import seaborn as sns; sns.set_theme(style = "dark")
%matplotlib inline
import matplotlib.pyplot as plt

加载包之后,下一步是使用正确的功能来绘制图表。plt.figure()可以用来决定绘图的大小。sns.barplot()接受要放在 x 和 y 轴上的变量以及要使用的数据集。与 ggplot2 一样,在 sns.barplot()函数中对绘图的外观进行了进一步的更改。plt.title()、plt.xlabel()和 plt.ylabel()用于标注地块。

如果用户有兴趣通过 seaborn 绘制不同于下图的图表,这个链接可以作为用户的向导。

plt.figure(figsize = (20,12))
sns.barplot(x = "species", y = "number", data = n_iris2, hue = "feature", palette = "deep")
plt.title("Bar chart of the average values of the features across species", fontsize = 20)
plt.xlabel("Species", fontsize = 12)
plt.ylabel("Average value", fontsize = 12)

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

seaborn 如何渲染散点图

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

seaborn 如何渲染条形图

结论

上面讨论的所有三个平台对于设计和构建图形来说都是惊人的。对于对编码不感兴趣的人来说,Tableau 是轻松生成图表的好方法。ggplot2 和 seaborn 是编码平台,为用户提供了一种控制图形外观的开放式方法。当谈到数据可视化时,您的想象力是您唯一的限制。

以下是关于数据可视化的推荐文章列表:

感谢您的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值