TowardsDataScience-博客中文翻译-2022-十六-

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

TowardsDataScience 博客中文翻译 2022(十六)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

D-Tale:你见过的最好的 Python 库之一

原文:https://towardsdatascience.com/d-tale-one-of-the-best-python-libraries-you-have-ever-seen-c2deecdfd2b

大蟒

以下是我对这个必备 Python 库的看法,以及为什么你应该试一试

照片由安娜·施韦茨从派克斯拍摄

Python 库为数据科学家提供了广泛的功能。它们允许数据科学家处理各种数据集并执行复杂的操作。Python 库还使学习新概念变得更加容易,这对刚开始涉足该领域的学生来说至关重要。然而,学习 Python 可能会让人不知所措,在开始时,一些对其他用户来说可能很容易的任务可能需要一段时间来学习如何做和如何使用它。这就是 D-Tale 的用武之地。

即使是经验丰富的 Python 用户,有些任务也可能是重复的,会浪费您宝贵的时间。因此,D-Tale 可以帮助您优化探索性数据分析和数据清理等任务。节省时间,您可以专注于更重要的任务,如精炼代码和调整机器学习模型。但是什么是 D-Tale 呢?下面是来自 PyPI 的解释:

D-Tale 是 Flask 后端和 React 前端的结合,为您提供了一种查看和分析 Pandas 数据结构的简单方法。它与 ipython 笔记本和 python/ipython 终端无缝集成。目前这个工具支持像 DataFrame、Series、MultiIndex、DatetimeIndex & RangeIndex 这样的 Pandas 对象。

我想提醒读者,我不写任何形式的赞助内容。我将根据我的印象表达我个人对图书馆的看法。现在,让我们找点乐子吧!

装置

我们可以安装 D-Tale 很简单。只需在你的终端键入pip install dtale。我没有得到任何安装它的错误。现在,我们需要一个数据集来探索 D-Tale。今天,我将使用 COVID 数据集(Mathieu,e .、Ritchie,h .、Ortiz-Ospina,e .等人新冠肺炎疫苗接种的全球数据库。Nat Hum Behav (2021) 。这是一个有趣的数据集,足够复杂来测试 D-Tale 的一些功能,也足够容易理解正在发生的事情。

现在,让我们开始吧。首先,让我们将熊猫和 D-Tale 导入我们的 Jupyter 笔记本。然后,我们需要导入数据集,将其分配给一个变量,并使用 D-Tale 调用该变量。

**# Importing libraries**
import dtale
import pandas as pd**# Assigning dataset to variable** df = pd.read_csv('covid-data.csv')dtale.show(df)

作者 GIF

耶!我们刚刚打开了 D-Tale GUI。与熊猫不同,我们可以与数据集和库进行交互,而无需键入代码。另一件很酷的事情是,D-Tale 在第一个屏幕上显示的信息比熊猫还多。

作者 GIF

首先,我们可以向下滚动到右侧查看更多数据。在熊猫身上,这不像 D-Tale 那么简单直观。然后,在左上角,您可以看到左上角的列数和行数,而无需键入任何代码。在顶部浏览,你会看到导航菜单。

作者 GIF

现在我们已经熟悉了 D-Tale,我们将探索它的特性。关于 D-Tale 的另一点是,我们不需要在 Jupyter 笔记本上使用它。因此,出于演示目的,让我们在不同的选项卡中使用 D-Tale。不过,你想如何使用它取决于你自己。使用下面的代码。

dtale.show(df).open_browser()

作者 GIF

数据准备

一键更改数据类型

在 Pandas 上改变数据类型并不困难,即使对初学者来说也是如此,而且为了一两个特性而改变它们应该没有问题。但是,如果您需要更改 300 多个特性的数据类型,该怎么办呢?这在专业环境中并不少见,对于这样的任务,键入数百行代码并不是对我们时间的最佳利用。有了 D-Tale,我们只需点击几下鼠标就可以改变数据类型。

例如,在这个数据集中,我注意到日期列是一个字符串。我们不想那样。让我们把它改成日期时间。只需点击列名,并在列名的正下方点击Type Conversion,并选择是否要更改inplace或创建新列。选择数据类型,更改日期格式,然后单击应用。就是这样!

作者 GIF

有奖金。在应用更改之前,您可以看到将要使用的代码。如果你正在学习 Python,这是一个很棒的附加软件。还有更多。一旦数据类型是 DateTime,我们可以在单击列名时看到附加信息,比如偏斜度。很酷,对吧?

作者图片

创建一个不同格式的新列

我们还可以创建一个不同格式的新列。出于演示目的,让我们将日期列转换为字符串。只需点击您想要转换的列名,然后点击Type Conversion,点击New Column,选择新的列名,并选择数据类型。搞定了。

作者 GIF

删除列

删除列再简单不过了。选中要删除的栏目,点击Delete,在弹出的窗口中点击Yes,该栏目就没了。是的,输入删除列的代码也很简单,但没有这么简单。

作者 GIF

更改列的名称

重命名列的过程:点击,重命名,保存。这么简单!只需点击列名,点击Rename,选择名称,并保存。结束了。如果您需要更改许多列的名称,这将非常方便。

作者 GIF

数据转换

过滤数据

过滤数据非常容易。单击要过滤的列。在底部,你会看到过滤选项。您可以过滤任何数据类型。D-Tale 有过滤选项,如等于、大于/小于、不同于等。都在那了!

在下面的例子中,我过滤了各大洲,只显示了北美的数据。

作者 GIF

合并数据

要合并两个数据框,单击左上角的图标,将会打开一个新的选项卡。您可以直接从用户界面上传数据集。选择数据集,你想如何连接它们,差不多就是这些了。如果您打算在另一个项目中使用它,您也可以在底部看到代码。

作者 GIF

分组依据

要分组,点击Summarize Data,选择你想要分组的列,函数(求和、计数、均值、中值等),就完成了。您可以在同一个标签或不同的标签中打开它。

描述数据

需要一个功能的快速摘要?没问题。使用 D-Tale,您可以查看诸如值计数、缺失值、频率、统计汇总(如平均值、中值、百分位数、标准差、偏斜度、字数等)等信息。根据数据类型,它还会显示数据图,如直方图、时间序列、条形图等。

为此,只需点击栏目名称,然后点击Describe (column analysis),你会看到很多很酷的信息。

作者 GIF

如果您想快速浏览所有栏目,您可以单击右上角的符号,单击“summary”选项,然后您将能够通过单击逐个检查所有功能。

[需要另一张 GIF]

数据可视化

数据可视化是数据分析过程中最耗时的任务之一。对于初学者来说,让它们看起来很好可能是一场噩梦,但幸运的是,D-Tale 也可以在这方面提供帮助。您只需点击几下鼠标就可以创建可视化效果,最棒的是:您可以获得代码并了解正在发生的事情。

条形图

让我们开始创建一个条形图。要创建条形图,请单击右上方,转到图表,将会打开一个 GUI。在那里,您可以在十三个选项中选择一种类型的情节!从那里,选择 X 和 Y 变量,聚合类型,如果有的话,瞧,你就得到一个漂亮的图形。

在下面的示例中,我将洲放在 x 轴上,将按洲划分的 COVID 案例总数放在 y 轴上。

作者 GIF

如果你想将数据分组,写下你想分组的变量并做。在本例中,我将国家分组为洲组。

作者 GIF

绘图代码

正如我提到的,您可以很容易地获得代码来检查情节是如何创建的。这是学习甚至交付最终产品的好方法,因为图表很好看,可以用作最终版本。

作者 GIF

散点图

创建散点图和条形图一样简单。选择 x 轴和 y 轴,分组,如果你想,然后嘣。你得到了一个散点图。下面,我正在检查新病例数和接种新冠肺炎疫苗人数之间的关系。

作者 GIF

时间序列

D-Tale 将时间序列带到了另一个高度。只需一次点击,您就可以轻松地用它们创建时间序列图,并浏览不同的时间序列类型,如 Hodrick-Prescott 和 Bacter-King 过滤器。很酷吧。

作者 GIF

描述数据集

我们已经讨论过这个主题,但我想提一下您可以使用摘要功能创建的一些令人兴奋的可视化效果,如直方图、探索类别和创建 QQ 图。

然而,最酷的部分是,您可以将选择的列与其他列进行交互,并创建即时图形。这是了解数据集的最佳方式,无需花费数小时键入代码来获得单击即可获得的结果。

作者 GIF

更多 D-Tale 功能

除了数据分析选项,D-Tale 还提供了一些附加设置,如选择语言和黑暗模式。

改变语言和黑暗模式

D-Tale 有一些更复杂的任务,可能会让非英语人士感到困惑,如果你的母语是中文或葡萄牙语,我有一个好消息,😄-Tale 除了支持英语外,还支持这两种语言来翻译他们的用户界面。

对于喜欢的人还支持黑暗模式。我不是黑暗模式的最大粉丝,因为我觉得它更难阅读,但如果你没有这个问题,你应该喜欢这个额外的功能。

突出显示列

D-Tale 允许我们根据几个选项突出显示数据。例如,您可以根据数据类型突出显示数据。我们还可以突出显示 NaN 值和异常值,以避免遗漏它们。您还可以基于参数(如大于或小于特定数字)突出显示数据。

作者 GIF

最后的想法

唷。这太多了。在这篇博客中,我们看到了 D-Tale 如何通过将繁琐的任务转化为直观的任务,使我们的生活变得更加轻松,即使对于那些经验丰富的专业人士来说也是如此。这个博客遗漏了许多很酷、更复杂的特性,所以我建议您尝试一下,探索一下,找到更多对您有用的特性。

我认为 D-Tale 适合所有人吗?不尽然,但是如果您是需要快速从数据集获得见解的专业人士,或者是不熟悉 Python 世界的学生,那么这是一个需要记住的很好的库。如果你是一个高级 Python 用户,你可以尝试一下,看看你能从它那里得到什么,这需要花一些时间来完成代码输入。如果你有,请在评论区告诉我。编码快乐!

D3Blocks:Python 库,用于创建交互式和独立的 D3js 图表。

原文:https://towardsdatascience.com/d3blocks-the-python-library-to-create-interactive-and-standalone-d3js-charts-3dda98ce97d4

创建交互式的、独立的、视觉上吸引人的图表,这些图表建立在 d3 javascript (d3js)的图形之上,但是可以用 Python 进行配置。

D3Blocks 中支持的前十个块。(图片由作者提供)。

Python 已经成为分析和可视化数据的最流行的编程语言之一。可视化可能是项目成功的关键,因为它可以揭示数据中隐藏的见解,并提高理解。理解和解释数据的最好方法是让它具有交互性。尽管 Python 中提供了许多可视化软件包,但创建美观、独立、交互式的图表,并且在您自己的机器之外也能工作,仍然具有挑战性。在之前的博客中,我已经展示了如何为网络图创建一个独立的交互式图表。 用 D3Blocks 我们超越了单一的图表创造了一个框架 现在包含了漂亮的图表 。它是开源的,不需要安装除 Python 之外的任何东西来创建 D3 图表。输出是一个交互式图表,你只需要一个(互联网)浏览器;分享和发布因此变得超级容易。 在这篇博客中,我将介绍一下 D3Blocks,并结合动手实例简单描述一下这 10 个 Blocks。

如果你觉得这篇文章很有帮助,可以使用我的 推荐链接 继续无限制学习,并注册成为中级会员。另外, 关注我 保持我的最新内容!

何必用 D3.js 呢?

近年来,Python 社区开发了一系列令人印象深刻的可视化库,如 Matplotlib 、 Seaborn 、 Bokeh 、 Plotly 、follow等等。一些库也允许图形是交互式的,但是在这种情况下,它们仍然需要来自 Python 或其他 web 服务的服务来保持运行。d3 的优势在于它的高性能、可深度定制的图表,并且它符合 web 标准。名称" D3 "是DATA-DrivenD**documents,是一个用于生成动态、交互式数据可视化的 Javascript 库,它速度快、看起来漂亮,并且可以添加您所有的创意。此外,除了浏览器之外,您不需要任何其他技术来绘制图表。**

“D3 帮助您使用 HTML、SVG 和 CSS 将数据变为现实。D3 对 web 标准的重视使您可以获得现代浏览器的全部功能,而无需将自己束缚于专有框架,将强大的可视化组件和数据驱动的 DOM 操作方法结合起来。”——d3js.org

D3 也叫 D3.jsd3js。 我将这两个名字互换使用。

使用 d3Blocks 创建独立的 D3 图表非常简单。

我刚刚提到了 d3 的优点,但也有缺点。首先,要将你的创意转化为图表,你需要熟悉 SVG、HTML、CSS 和 Javascript。但是即使你这样做了,d3js 图表也不容易概括不同的数据集。换句话说,d3js 脚本通常是一个静态脚本,它被优化为显示一个特定数据集的结果。更改数据集需要更改各种参数,例如轴的最小值/最大值、列名,很可能还需要更改图表的方向和位置。

使用 D3Blocks,我们通过将数据转换成适合下游 d3js 脚本的格式来克服这些挑战。此外,所有必需的参数,(列)命名、格式、定位、方向等。也是经过的。以这种方式,我们可以利用两个世界的优势;Python 用于数据管理、预处理、分析、建模,d3js 用于可视化。在之前的博客中,我展示了如何将 d3js 与 Python 相结合,在 D3Blocks 中,我们超越了单一的图表。

D3Blocks 中的第一个 blocks 准备好了!

对于每个开发的区块(或图表),都有一个 Python 部分和一个 d3js 部分。d3js 部分以这样一种方式开发,它可以处理具有不同属性的不同数据集,但依赖于 Python 部分。输出是一个 HTML 文件,其中包含一组特定于图表的 d3 库。

D3Blocks 创建的每个图表都完全封装在一个 HTML 文件中,这使得共享和发布成为可能,除了浏览器之外,您不需要任何其他技术。

前 10 个区块分为以下几类:

  • 关系图: 网络(d3graph),三键,弦,热图。
  • 带时间元素的图表: 时间序列,并移动气泡。
  • 用于成像的图表: 图像滑块。
  • 图表多样: 散点、小提琴、粒子。

尽管每个块都有自己的属性,但我们保持输入数据的一致性。这允许在没有数据管理的情况下在块之间切换。让我们通过一个小的动手示例来浏览每个模块。首先,你首先需要 pip 安装 D3Blocks 库:

**pip install d3blocks**

绘制关系的图表

当一个记录与另一个或多个记录相关联时,就描述了关系。在图论中描述了许多形式来存储这种关系,例如,邻接矩阵是对称的正方形矩阵,或者编码顶点-顶点对关系的关联矩阵。无论矩阵的形式是什么,绘制关系图都有助于更好地理解数据。例如,它可以揭示出 演化模式 ,其中节点被复制成两个或更多组,代表阶段。在这种情况下,用和弦桑基图来表示关系是理想的。或者,也可以有 源到端 的模式,其中它从某个点开始,并以可能的中间步骤结束。在这种情况下,网络图会很有用。另一方面,热图图在交互数量很大并且网络等图形变成巨大的毛球时变得有用。对于所有这四个图表,输入数据保持一致,并且需要包含列源、目标和权重的数据框。在下面的四个例子中,我将使用公开可用的 能量数据集【1】,其包含与列的 68 个关系;来源,目标,权重

网络图。

有了D3 graph块,我们就可以用 D3 力定向图来绘制网络交互(更多细节可以在这里找到【5】)。在代码部分 1 中,我们加载*能量数据集【1】,然后使用 d3graph 块分析数据。节点根据 Louvain 聚类试探法进行着色,边的宽度基于权重。现在可以以交互方式探索网络(图 1)* ,其中可以根据边的强度断开边(使用位于顶部的滑块)。这保持了最强连接节点的完整性。**

代码部分 1。创建 D3graph 的示例。

图一。使用 d3graph 块的能源数据集的交互式网络图。在 Louvain 算法聚类方法中,节点被着色,边的大小基于输入的权重。可以使用顶部的滑块根据边权重断开网络。(图片由作者提供)

桑基图。

Sankey 图是一个可视化的图,显示了从一组值到另一组值的流动。矩形框代表节点,箭头的宽度与流速成比例。当您想要显示多对多关系或通过一组阶段发现多条路径时,最好使用 Sankeys。例如,流量如何从(起始)页面流向网站上的其他页面。为了进行演示,能量数据集【1】被用作桑基块 ( 代码段 2) 的输入,从而产生图 2。作为开发 Sankey 块的起点,d3js 代码是从 Mike Bostock 派生出来的,然后被 then 化。关于使用 D3Blocks 的 Sankey 图表用法的更多细节可以在本博客【8】中找到。

代码部分 2。创建桑基图的示例。

图二。使用默认参数的能量数据集的散点图。(图片由作者提供)

和弦图。

一个弦图表示几个实体或节点之间的流或连接。每个实体由圆形布局外部的片段表示。然后,在每个实体之间绘制圆弧。弧线的大小与流量的重要性成正比。为了进行演示,将能量数据集[1] 用作弦块 ( 代码段 3) 的输入,从而产生图 3。作为开发 Chord 块的起点,d3js 代码是从 Mike Bostock 派生出来的,然后被 then 化。

代码第三部分。创建和弦图的示例。

图 3。使用默认参数的能量数据集的弦图。(图片由作者提供)

热图。

利用来自D3 热图库热图,其从(邻接)矩阵创建热图。在代码段 4 中,我们加载能量数据集【1】,将数据重新格式化为邻接矩阵,然后创建热图(图 4 )。热图可以进行交互式聚类和分析。作为开发热图块的起点,d3js 代码是从迈克·博斯托克派生出来的,然后被 then 化。

代码第 4 部分。创建热图的示例。

图 4。使用默认参数的能源数据集的热图。(图片由作者提供)

绘制时间序列数据的图表。

在时间序列数据中,必须有一个日期时间元素以及该时间点的状态。时间序列最直观的例子是 股票数据 ,可以使用 时间序列 进行可视化。 可替换地,也可以有时间依赖性,其中一个动作跟随另一个动作(例如,像一个过程)。在这种情况下, 运动气泡图 有助于理解运动,以及在特定时间点是否出现集群。

时间序列。

时间序列图表可用于日期-时间元素可用的情况,并且这些值直接相互跟随。使用时间序列块,您可以启用/禁用感兴趣的列,并执行刷屏和缩放以快速聚焦感兴趣的区域。显示了代码第 5 节中的一个示例,其中各种气候变量被可视化(图 5) 。作为开发 Timeseries 块的起点,d3js 代码是从 Mike Bostock 派生出来的,然后被 then 化。**

代码第五部分。创建时间序列图的示例。这里我们导入气候数据。

图 5。使用默认参数的时间序列图。右侧面板用于选择(取消选择)可用的气候变量,而底部面板用于刷牙和缩放。(图片由作者提供)

移动的气泡。

移动气泡图提供了对行动如何及时跟进的洞察。它可以帮助理解实体的移动,以及集群是否在特定的时间点和状态发生。虽然可视化方法不是最有效的,但它对力导向和碰撞节点非常有效。静态图表来自一篇名为“美国人的一天生活”的帖子,然后进行了大量修改,以确保图表可以概括不同类型的数据集、州数、方向、格式、颜色等。我们创建了一个函数来生成具有各种状态和随机时间点的随机数据集。在代码段 6 中显示了创建移动气泡图表的演示,这导致了在图 6 中描述的图表。更多信息和例子见 movingbubbles 博客 [ 7 。**

代码部分 6。创建移动气泡图的示例。

图 6。使用默认参数移动气泡图。左侧面板可用于选择时间移动的速度,而右侧面板中的实体在特定时间点从一种状态移动到另一种状态。(图片由作者提供)

图像滑块。

当您想要比较两幅图像时, ImageSlider 非常有用。这在 之前有 状态之后有 的情况下最有用。出于演示的目的,我使用了来自 Unsplash 的 Markus Spiske 的照片。现在可以很容易地比较两幅图像(代码段 7,图 7 )。javascript 代码是从 JohnEdChristensen 中派生出来的,然后被 then 化以方便在图像之间进行比较。**

代码第 7 部分。创建 ImageSlider 图形的示例。

图 7。带有两个输入图像的 ImageSlider。将中间的橙色球向左(前)或向右(后)移动后,会显示该图像。(照片由来自 Unsplash 的 Markus Spiske 拍摄)

散点图。

散点图可能是绘制(x,y)坐标最著名的图形。这样的基本图表是有用的,特别是具有刷和缩放功能。散点图可以按样本着色,并用于检测样本(组)之间的关系。输入是 x 和 y 坐标,但也可以设置各种其他参数,如类标签、大小、(边缘)颜色、工具提示信息等。散点图也可以在两组或三组坐标之间转换。这在比较不同的映射集时会很有帮助,正如在之前的文章 [2]中所描述的。为了进行演示,我将使用来自癌症基因组图谱项目(TCGA) [3]的癌症数据集,该数据集提供了 34 种不同癌组织的多种类型的分子数据。对分子数据进行处理[4],并得出 t-SNE 坐标以及代表患者间相似性的主要成分。使用散点图,我们可以可视化两组坐标(t-SNE 和 PC ) ,并更深入地分析结果(代码第 8 部分,图 8)* 。关于散点图使用 D3Blocks 的更多细节可以在本博客【9】中找到。*

代码第 8 部分。创建散点图的示例。

图 8。散点图。缩放是通过选择一个区域。双击将返回主屏幕。(图片由作者提供)

小提琴情节。

Violin 图可视化了一个或几个组的数值变量的分布。它是箱线图的一种替代方法,可以洞察大型数据集,箱线图可以隐藏一部分信息。使用这个模块,我们可以为一个或几个组配置图表,并更改图表中的各种元素,例如颜色、工具提示和框大小。为了进行演示,将癌症数据集【3】用作小提琴模块* ( 代码段 9) 的输入,从而得到图 9。原始代码是从 D3.js 图库中派生出来的,并大量扩展了新功能。*

代码第 9 部分。创造小提琴情节的例子。

图 9。小提琴情节。(图片由作者提供)

粒子。

有了粒子块,我们可以把任何单词变成交互式粒子图。鼠标移动或触摸单词会让粒子反弹,然后回到原来的位置。可以将各种属性更改为图表的行为,如反弹、粒子大小和颜色。创建粒子图的示例如代码段 10* 所示,结果如图 10 所示。最初的 javascript 是从伊恩·约翰逊那里派生出来的,然后被 then 化了。*

代码段 10。创建粒子图。

图 10。粒子。(图片由作者提供)

做一个贡献者,建立你自己的区块!

现在创建了第一组十个块,一些被分叉和(大量)调整,而其他的从头开始创建。但是有 几百个工作中的 d3 图表【1,6】在交互和交互过程中与 performant 增量更新也是有用的,比如拖动、刷、缩放。图表可用于多种目的,如定量分析、可视化层次结构和创建网络图、以及条形图、线图、散点图、辐射图、地理投影、和各种其他交互式可视化,用于探索性解释。我们构建了作为开源软件的 D3Blocks,以鼓励您构建自己的 block,并加入我们对新 Blocks 的进一步开发。除了构建全新的块,您还可以决定向现有的块添加新的功能!**

最后的话。

D3blocks 库包含 10 个交互式的、独立的、视觉上吸引人的图表,这些图表可以使用 Python 和 d3js 中的后端进行配置。d3blocks 的输出是将每个图表完全封装到一个 HTML 文件中,这使得在网站上共享或发布成为可能,除了浏览器之外,您不需要任何其他技术。

别做梦了,把你的创意加到一块吧!

干杯,E.

如果你觉得这篇文章很有帮助,可以使用我的 推荐链接 继续无限制学习,并注册成为中级会员。另外, 关注我 关注我的最新内容!

软件

  • D3Blocks Github
  • D3Blocks 文档页面

我们连线吧!

  • 我们在 LinkedIn 上连线
  • 在 Github 上关注我
  • 跟随我在媒体上

参考

  1. 【observablehq.com】, 能源数据集 ,2019 (ISC 许可)
  2. t-SNE、UMAP、PCA 和其他映射之间的定量比较, Medium,2022
  3. 癌症基因组图谱研究,n .等人癌症基因组图谱泛癌分析项目Nat Genet 45 ,1113–1120,10.1038/ng.2764 (2013)。
  4. 2D 图中的泛癌亚分类显示了由分子特征的特定组合驱动的亚结构 ,科学报告自然,2016
  5. 用 Python 创作精美单机互动 D3 图表, 中号,2022
  6. Bl.ocks
  7. 如何用 Python 制作 d3js 中的讲故事移动气泡图 ,中,2022 年 9 月
  8. 使用 Python 在 d3js 中创建漂亮的 Sankey 图表的实践指南。中等,2022 年 10 月
  9. 使用 D3js 和 Python 、Medium 2022 年 11 月,使散点图具有交互性,从而充分利用散点图

Dag shub:GitHub 对数据科学家和 ML 工程师的补充

原文:https://towardsdatascience.com/dagshub-a-github-supplement-for-data-scientists-and-ml-engineers-9ecaf49cc505

将您的数据、模型、实验和代码保存在一个地方

动机

作为一名数据科学家,您可能希望对您的代码、模型、数据、参数和指标进行版本化,以便能够重现某个实验。

作者图片

GitHub 是对代码进行版本控制的一个很好的平台,但是对数据、模型和指标进行版本控制并不理想,原因有二:

  • GitHub 有一个 100MB 的严格文件限制,所以上传一个中等大小的二进制文件很容易超过这个限制。
  • 用 GitHub 比较不同版本数据的变化很乱。我曾经在使用git pull后手动接受过 100 多次数据的更改,那是一种痛苦。

DVC (数据版本控制)是对二进制数据进行版本控制的理想工具。但是,你不能在 GitHub 上查看 DVC 跟踪的文件。

作者图片

如果有一个类似于 GitHub 的平台,但是更适合数据科学家和机器学习工程师,那不是很好吗?这时 DagsHub 就派上用场了。

DagsHub 是什么?

DagsHub 是数据科学家和机器学习工程师对他们的数据、模型、实验和代码进行版本化的平台。

DagsHub 允许您在他们的平台上创建一个新的存储库,或者连接到 GitHub 上的存储库。如果要在 DagsHub 上创建新的存储库,请单击新建存储库:

作者图片

如果您在 GitHub 上已经有一个存储库,并且想要将您的存储库迁移到 DagsHub,请单击 Migrate A Repo:

作者图片

如果您想同时通过 GitHub 和 DagsHub 管理您的存储库,请单击 Connect A Repo:

作者图片

DagsHub 上新存储库的界面应该与 GitHub 上的界面非常相似,只是增加了一些选项卡,如实验、数据、模型、笔记本、DVC 和 Git。

作者图片

你可以在这里查看上面的资源库。让我们探索 DagsHub 的一些功能。

数据和代码版本化

假设您的机器上有 GitHub 库的本地副本,我们将使用 DVC 来版本化您的二进制数据。

从安装 DVC 开始:

pip install dvc

通常情况下,在使用 DVC 时,您需要使用一个外部存储,如 Google Drive、亚马逊 S3、Azure Blob 存储、谷歌云存储等。但是,使用 DagsHub,您可以将数据直接存储在平台上。

要将您的数据上传到 DagsHub,首先获取远程按钮下的 DVC 链接:

作者图片

接下来,将该链接设置为 DVC 的远程存储:

dvc remote add origin [https://dagshub.com/khuyentran1401/dagshub-demo.dvc](https://dagshub.com/khuyentran1401/dagshub-demo.dvc)

添加身份验证:

dvc remote modify origin --local auth basic
dvc remote modify origin --local user DAGSHUB_USERNAME
dvc remote modify origin --local password DAGSHUB_PASSWORD

接下来,添加我们希望存储在 DagsHub 上的二进制数据。例如,要添加目录data/raw,我运行:

dvc add data/raw

该命令将创建一个新的.dvc文件。这些是小文本文件,存储如何访问原始数据的信息,而不是原始数据本身。

data
├── raw
│   └── marketing_campaign.csv
└── raw.dvc

将这些文件推送到 DagsHub 的存储中:

dvc push

现在我们可以在数据和代码中添加更改,然后将您的更改提交并推送到 GitHub:

git add .
git commit -m 'push data and code'
git push origin master

如果你同时使用 GitHub 和 DagsHub,你只需要把你的文件推送到 GitHub。DagsHub 会自动与 GitHub 同步!

注意:如果 DagsHub 不同步,单击存储库标题下的刷新图标:

作者图片

如果你熟悉 DVC,这里没什么新鲜的。然而,当您访问 DagsHub 上的存储库时,神奇的事情发生了。

在 GitHub 上,你可以看到你的.dvc文件,但看不到数据本身。这是因为实际数据存储在其他地方:

作者图片

在 DagsHub 上,您可以看到.dvc文件和数据本身,因为数据存储在 DagsHub 上!

作者图片

这非常方便,因为我可以在一个平台上查看代码和数据。

作者图片

跟踪实验

像 MLFlow 这样的库允许数据科学家跟踪他们的实验以及模型和参数。然而,他们不跟踪代码。

如果能保存一个实验的代码、模型、参数、数据不是很好吗?

作者图片

使用 DagsHub 可以轻松做到这一点。DagsHub 允许您使用 DagsHub logger 或 MLFlow 记录您的实验。实验选项卡下的实验应该如下所示:

作者图片

使用 MLFlow 在不提交代码的情况下快速试验不同的参数是一个很好的实践。一旦您找到了具有良好结果的实验,您可以使用 DagsHub logger 将结果保存为开放格式(metric.csv,param.yaml ),并将其与生成结果的代码、模型和数据封装在一起。

让我们来学习如何用这些方法来记录你的实验。

用 MLFlow 记录您的实验

MLflow 是一个开源平台,允许你跟踪和比较实验。要安装 MLflow,请键入:

pip install mlflow

在下面的代码中,我使用 MLFlow 来记录度量和参数。

我还将跟踪 URI 设置为在 MLflow 跟踪远程下找到的 URL:

作者图片

就是这样!现在,每次运行代码时,每个实验的参数和指标都会显示在 DagsHub 存储库的 Experiments 选项卡下:

作者图片

能够在 DagsHub 这样的远程服务器而不是本地数据库中记录您的 MLflow 实验将允许您的队友在他们的浏览器中访问您的实验。

用 DagsHub Logger 记录你的实验

一旦您找到了一个好的实验,并准备好记录该实验的代码、数据和输出,只需将 MLFlow 切换到 DagsHub logger。

要使用 DagsHub 记录器,请从安装 DagsHub 开始:

pip install dagshub

使用 DagsHub logger 记录您的实验与使用 MLFlow 记录非常相似:

运行您的代码后,DagsHub 将自动在您的工作目录中创建两个文件metrics.csvparams.yml:

.
├── metrics.csv
└── params.yml

将所有更改添加到临时区域,然后将这些更改提交并推送到 GitHub:

git add .
git commit -m 'experiment 1'
git push origin master

现在,新的实验将在实验选项卡下用 Git 记录。

作者图片

同时使用 MLflow 和 DagsHub 记录器

尽管在 MLflow 和 DagsHub logger 之间切换很有用,但我发现每次想切换到另一个 logger 时都要重写代码,这很不方便。

我的解决方案是创建一个BaseLogger类,它的方法是log_metricslog_params。每个方法都将使用 MLflow logger 和 DagsHub logger。

有了BaseLogger,我可以在一行代码中同时使用两个记录器。

MLflow 实验之间的比较

要比较两个或多个实验,请勾选要比较的实验框,然后单击比较。

作者图片

您应该会看到所有实验的比较,如下所示:

作者图片

DagsHub 还自动创建图,如平行坐标图和条形图,以便您可以观察参数和输出之间的关系

作者图片

作者图片

Git 实验之间的比较

要比较两个 Git 实验之间的文件差异,请在 experiments 选项卡下复制它们的提交 id:

作者图片

然后将每个提交 ID 粘贴到文件选项卡下的每个分支上:

作者图片

作者 GIF

两次提交之间不同的文件将以黄色突出显示。

作者图片

要查看差异,请单击文件。由于缺少的信息以红色突出显示,附加信息以绿色突出显示,因此我们可以清楚地看到两次提交之间的差异。

作者 GIF

更好的是,DagsHub 提供了一个很好的界面来比较两个 Jupyter 笔记本。

作者图片

作者图片

由于数据科学家经常使用 Jupyter Notebook,因此能够比较两台笔记本的输出非常有用。

额外提示:创建一个 DVC 管道

有时,您可能希望其他人理解您项目的工作流程(例如,一个脚本的输出如何用于另一个脚本)。DagsHub 允许您通过 DVC 管道创建数据工作流的可视化。

作者图片

要创建 DVC 管道,首先要创建一个dvc.yaml文件。在下面的代码中,我将我的工作流分为 3 个阶段:process_datasegmentanalyze。对于每个阶段,

  • cmd指定执行阶段的命令
  • deps指定阶段的依赖关系
  • outs指定阶段的输出
  • metrics指定阶段的指标

outs中列出的所有文件都被缓存,这与使用dvc add时发生的情况类似。这就是为什么你不再需要对这些文件使用dvc add

现在,您可以通过运行以下命令来再现dvc.yaml中指定的整个管道:

dvc repro

产出:

Running stage 'process_data':
> python src/process_data.py
Updating lock file 'dvc.lock'                                                                                                                                                      

Running stage 'segment':
> python src/segment.py
Updating lock file 'dvc.lock'                                                                                                                                                      

Running stage 'analyze':
> python src/run_notebook.py
Updating lock file 'dvc.lock'

现在,其他人可以通过运行dvc repro命令复制您的结果。多方便啊?

接下来,运行dvc push将 DVC 跟踪的所有文件推送到 DagsHub。使用git addgit commit将代码和数据的变化推送到 GitHub。

如果您访问 DagsHub 上的存储库,您应该会在 DagsHub 上看到整个管道的漂亮的交互式图形!

作者 GIF

通过单击图中的节点,可以获得该节点的更多详细信息。现在,其他人只需访问 DagsHub 上的存储库,就可以了解您的数据工作流。

结论

恭喜你!您刚刚学习了如何使用 DagsHub 对您的数据项目进行版本化。使用 DagsHub,您可以在一个地方轻松再现实验并查看数据科学项目的所有组件。

本文的源代码可以在这里找到:

https://dagshub.com/khuyentran1401/dagshub-demo

我喜欢写一些基本的数据科学概念,并尝试不同的数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

Star 这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:

2023 年指导自学成才的数据科学家的每日、每周、每月和每年目标提示

原文:https://towardsdatascience.com/daily-weekly-monthly-and-yearly-goal-tips-to-guide-a-self-taught-data-scientist-in-2023-d405f8d0d87a

这些目标将帮助您建立和组织即将到来的一年,成为一名数据科学家

Zoritsa Valova 在 Unsplash 上拍摄的照片

如果你和我一样,十二月是为即将到来的一年做准备的月份。无论是清理我的电脑文件,捐赠我在过去一年中没有使用的旧物品,还是购买我将在来年阅读的书籍,我认为应该留出 12 月份进行准备,以便你可以有组织、有重点地进入 1 月份,并且没有任何来自去年的包袱。

准备工作的一部分还包括设定我来年的决心或目标,并准备好实现它们所需的一切。但是为什么我需要整整一个月来准备来年的计划呢?

的数据表明即使你设法在一月的整个月完成你的决心或目标,80%的决心在二月中旬仍然会失败。

为什么?

因为在一月份制定决心或目标对他们来说太晚了,无法成功。

你有没有考虑过,为什么你会在一月的第一周看到健身爱好者突然涌入,然后在接下来的几周看到他们明显减少,直到月底才回到常客的行列?这是因为那些在新年前夜昏昏沉沉地决心“减肥”或“去健身房”的人,并没有通过充分的预先计划为成功实现目标做好准备。

那么,所有这些关于分辨率的讨论与数据科学有什么关系呢?

嗯,如果我注意到自学数据科学的任何事情,那就是你往往会失败,至少失败一次。新年伊始是设定自学数据科学目标的大好时机,但前提是你要事先做好适当的准备。因此,12 月是开始准备如何实现 2023 年成为数据科学家的目标的最佳时机。这不仅让你有足够的时间做准备,也让你在进入一月时有正确的心态,充满成功的动力。

每日目标

学习数据科学的日常目标应该是每天提高 1%。这些目标不应该是需要一整天才能实现的怪物,而应该是微小的努力,最终在年底取得巨大的胜利。当然,你的日常目标将由你今年的总体目标来指导,但它们不应该太大或太强。

例如,你可以寻找一个自动化的琐碎任务,花 10 分钟开发一项新的数据科学技能(想象可视化或掌握一个新的库),在一个热情或组合项目上取得进展(每天添加一个新功能,或花几分钟清理代码并创建文档),听一个数据科学播客(或实际上只是消费任何类型的非正式数据科学相关内容),或通过 Twitter 等社区或时事通讯分享你所学到的东西。

每日目标不是你征服世界的地方。相反,它们要小得多,类似于每天服用维生素或遛狗。

这些日常目标也应该是在不打击你的情况下拓展你的能力。每天的目标应该是你每天都期待而不会气馁的事情。你跳过一天的那一刻,你就很容易受到今年整个目标框架崩溃的影响。这就是为什么这些目标需要是可管理的和合理的,这将因人而异。

例如,如果你在工作的同时还试图过渡到数据科学,那么你的日常目标可能就像在上下班途中收听数据科学播客一样简单。这可以在假期或身体不适的时候缩减,以确保你不会打破每天的目标,而不会让自己负担过重。

我去年的一个日常目标是通过阅读像“走向数据科学”这样的网站上分享的文献来跟上数据科学的发展。我每天花不到 10 分钟的时间浏览新内容,记下我觉得有趣或与我的目标相关的内容。每天,当我在等着沏茶的时候,或者当我需要在日常工作中利用社交媒体休息一下的时候,这个目标很容易实现。

记住,这个目标必须是“简单的”——你可以在一整年的每一天都完成而不会筋疲力尽。你可以有很多你想要的每日目标,但是它们都应该很小,并且每天只需要几分钟就可以轻松实现。

你应该在每天的同一时间被提醒你每天的目标。我最喜欢的工具是一个简单的待办事项应用程序,它可以在每天的同一时间给我发送通知。检查我每天的目标非常令人满意,也帮助我留出时间去完成它们。根据你的最佳工作方式,你可能会发现每天在不同的时间完成目标是可行的,或者你可能更喜欢每天有一个预定的时间分配来完成它们。不管怎样,你需要每天被提醒你的目标,并且有一个实际的方法来“检查”它们。如果你写一些代码,让你的每日目标在你的电脑上弹出,作为你的每日提醒,这是加分的。

每周目标

每周目标应该让你感觉在周末完成了一些事情。

当谈到自学数据科学时,你的每周目标应该是让你在学习课程中前进一步,将一些学习概念从你的列表中剔除。

根据你在 2023 年成为数据科学家的目标上投入的时间,你的每周目标将从学习单个概念到整个学习单元不等。例如,如果除了学习数据科学之外,你还有其他几项任务,你的周目标可以是“掌握 Python 中的变量和函数”。或者,如果你的大部分时间都致力于学习数据科学,你每周的目标之一可能是“开发 AI 代码,实现预测能力,以确定这个数据集中的哪些客户将返回他们的订单”。

拿出日历,在上面写下你每周想要完成的目标,开始设定你的每周目标。这些目标应该与你的学习课程紧密结合。例如,你课程中的每个概念或单元应该是一个周目标。这种策略有助于你在课程中不断前进。我在我的学士学位期间使用了这个策略,我是通过完全自学的方式在网上完成的。通过以单元为基础组织我一周的工作,我能够通过每周完成一两个单元作为我的周目标来快速完成课程。

比起每天的目标,我更喜欢把每周的目标设定得更宽松一些。在你的一周中,你会有效率更高的日子和效率更低的日子。因此,我发现将任务安排在某几天是没有帮助的(当然,除非它们有具体的截止日期)。相反,我为整个星期建立了一个主要的待办事项清单,在那里我列出了我必须完成的所有事情。然后,当我在一周内浏览这个清单时,我会核对一下。不再有“我必须在星期一完成所有的事情”了。相反,我只是随波逐流。有时我会在周一完成大量的工作,而在周二却没有完成多少,因为有事情发生了。无论如何,我对周末需要完成的所有工作都有一个想法,而不是每天必须完成一定数量的任务,这也有助于我实现更好的工作和生活平衡。

月度目标

每月的目标应该是实质性的。它们应该是 12 个里程碑,在你成为数据科学家的过程中给你带来巨大的切实利益或进步。

每月的目标应该具有挑战性,而不是无法实现。这些目标中的每一个都可以是一个项目组合,一个完成的认证,或者一个掌握的实际技能。不管它们是什么,你应该能够在年底回顾并看到 12 个大的成就,所有这些都有助于你实现年度目标。

月目标首先应该与你的周目标保持一致。例如,如果你一月份的周目标主要是学习 Python,那么你的月目标应该是在 Python 中创建一个项目,在这个项目中,你可以创建、更新、删除和搜索数字地址簿中的联系人。或者,如果你 4 月份的周目标是将你的编程、数学和可视化技能结合起来,构建一个完整的数据分析,那么你的月目标可以是创建一个简单的世界银行数据分析,以确定给定地区的政治参与量。或者,如果你 10 月份的周目标是围绕职业准备,你的月目标可以是申请 10 份可行的数据科学工作。

月目标应该把你和周目标一起做的所有事情推向高潮,并把它们推向下一个层次。

我喜欢整个月都致力于每月目标,而不是把它们留到最后一分钟。组织对于确保你在完成每月目标的基础上平衡每日和每周目标是至关重要的。月度目标应该被分成可管理的部分,这样你就不会赶着截止日期(除非那是你的事情)。例如,如果你的月度目标是申请 10 份可行的数据科学工作(如果你想成功的话,需要为每份工作准备独特的简历和求职信),你可以在每个周末挑选 2-3 份工作来申请。或者,如果您的月度目标是整合整个数据分析,您可以在每月的第一个周末进行数据采集和清理,在第二个和第三个周末进行分析,在第四个周末完成可视化和项目总结。

我认为每月数据科学目标的成功在于让他们工作起来愉快或令人兴奋。每天和每周的目标很容易完成,因为你进入了一个节奏,它只是成为你日常工作的一部分。然而,月目标总是笼罩在你的头上,感觉就像一个不自然的负担,必须在你必须做的所有其他工作之上完成。你可以通过让你的每月目标包含一些你喜欢的事情来减轻这种感觉。例如,你的月度目标可能是预测即将到来的世界杯冠军,或者通过无偿数据科学工作帮助你所在社区的一家小企业。不管是什么,你的月度目标应该将数据科学与你喜欢的事情结合起来,让它成为你期待完成的事情。不仅如此,成为投资组合项目的每月目标会给你留下一堆项目,你可以充满激情地向未来的雇主描述这些项目。

年度目标

你今年的目标很简单:成为(或者至少接近成为)一名数据科学家。

然而,这个年度目标不够具体,无法实现。

当你在今年 12 月为即将到来的一年设定目标时,你需要先为它设定一些参数。虽然我一直讨厌聪明的首字母缩写词,但我认为它给了我们一个很好的基础来设定这个具体的目标。

你在 2023 年底成为一名数据科学家(或更接近成为一名数据科学家)的目标必须是sspecific、musable、aTTA able、 r elevant、 t imely (是的,每次我使用这个缩写词时我也会退缩,但请原谅我)。SMART 目标的要点是设定更好的目标,这些目标更有可能实现。当你设定具体的目标时,你确保你对需要达到的目标有一个清晰的认识。目标必须是可衡量的,这样你就可以衡量你在实现它的过程中做得有多好。你的目标还需要在你分配给自己的时间内切实可行(这就是为什么你的目标可能是在 2023 年底成为一名数据科学家,或者更接近成为一名数据科学家)。相关性将有助于你坚持你的目标,因为它与你更广泛的抱负一致。最后,你的目标必须有时间限制,否则(相信我)你永远也不会完成。

因此,您 2023 年的总体目标可以是:

在 2023 年 12 月 31 日之前成为一名数据科学家,通过利用自学的数据科学课程磨练我的数据科学技能,在全年准备面试后,在一家公司获得一份数据科学工作。这将使我更接近自己创办数据科学咨询公司的总体目标。

为什么这个目标行得通?因为它是具体的(成为一名数据科学家)可衡量的(通过在一家公司获得一份数据科学工作)可实现的(通过使用我自学的数据科学课程磨练我的数据科学技能来准备全年的面试)相关的(这将使我更接近我创办自己的数据科学咨询公司的总体愿望)及时的(到 2023 年 12 月 31 日)。

2023 年伟大年度目标的另一个例子是:

到 2023 年 12 月 31 日,我将熟练使用 Python、Excel、SQL 和 Tableau 进行客户营销数据分析,方法是完成我的项目 哪些应用程序更有可能吸引用户,这些应用程序将被添加到我的数据科学组合中,用于帮助我获得数据科学领域的工作。

这个目标也是具体的(熟练使用 Python、Excel、SQL 和 Tableau 进行客户营销数据分析)可衡量的(该项目将被添加到我的数据科学组合中,帮助我获得数据科学方面的工作)可实现的(通过完成我的项目,哪些应用更有可能吸引用户)相关的(帮助我获得数据科学方面的 hob)及时的(到 2023 年 12 月 31 日)。

虽然这些目标属性确实是值得畏缩的,但是它们可以给你一个方向,指引你以及你未来一年的每日、每周和每月目标。

你的年度目标需要张贴在你每天都能看到的工作区的显著位置。我非常喜欢这种简单的便笺。每天都看看这个目标,即使你并不缺乏雄心壮志,提醒自己为什么要为每天、每周和每月的目标如此努力。

订阅将我的故事直接发送到您的收件箱:故事订阅

请成为会员,使用我的推荐链接获得无限制的媒体访问权限(我将收取少量佣金,无需额外费用):媒体会员

通过捐赠来支持我的写作,以资助更多像这样的故事的创作:捐赠

DALL-E 2.0,已解释

原文:https://towardsdatascience.com/dall-e-2-0-explained-7b928f3adce7

人工智能的毕加索是如何工作的?

davisuko 在 Unsplash 上拍摄的照片

几天前,OpenAI 发布了我认为最引人注目的人工智能创造力展示: DALL-E 2 。在最基本的层面上,DALLE-2 是一种以非凡的准确性将文本映射到图像的功能,产生高质量和生动的输出图像。但是这项技术到底是如何工作的呢?在这篇文章中,我将尽可能深入地解释,同时让尽可能多的人了解情况。

如上所述,DALL-E 2 将文本作为输入,并将图像作为输出。但这并不是一蹴而就的;更确切地说,DALL-E 2 代表了过去几年来一点一点建立和改进的各种技术的顶峰。这些技术像乐高积木一样相互堆叠,以组成完整的模型。要了解 DALL-E 2,我们首先要了解这些部件是什么,它们做什么。只有这样,我们才能深入了解内部工作和训练过程,以理解底层组件。

夹子

在 DALL-E 2 架构中最重要的构建模块之一是 CLIP。CLIP 代表对比语言-图像预训练,它对 DALL-E 2 是必不可少的,因为它是文本和图像之间的主要桥梁。从广义上讲,CLIP 代表了这样一种观点,即语言可以作为一种工具,用来教会计算机不同的图像如何相互联系。形式上,它规定了一个简单的方法来进行这种教学。

理解 CLIP 的最好方法是首先看到以前的计算机视觉系统的缺点。在 CLIP 之前,计算机视觉的神经方法包括聚集大型图像数据集,然后将它们手动标记为一组类别。虽然今天的模型在这项任务上表现出色,但它固有地受到预先选择的类别的需要的限制。比如,想象一下拍一张街道的照片,让这样的系统去描述;它可以告诉你有多少辆车和标志,但它不能给你一个整体的感觉。更重要的是,没有足够的图像来产生一个类别的任何东西都不会被模型分类。

让 CLIP 如此强大的洞察力是一个聪明的想法,训练模型不仅识别图像属于哪个类别(预定义的选项列表),还从随机标题列表中识别每个图像的标题。这使得模型可以使用语言来更精确地理解“柴犬”和“戴贝雷帽的柴犬”之间的区别,而不是让人类标签员提前指定它们是否属于同一类别。

在完成上述“预训练任务”的过程中,CLIP 能够创建一个向量空间,该向量空间的维度代表图像的特征和语言的特征。这个共享的向量空间在功能上为模型提供了各种各样的图像-文本字典,允许它们在两者之间进行翻译(至少在语义上)。

尽管如此,这种共同的理解并不能代表 DALL-E 2 的全部。即使有把英语单词翻译成西班牙语单词的方法,人们也需要在说话前学习西班牙语的发音和语法。在我们的模型中,CLIP 使我们能够获取文本短语,并理解它们如何映射到图像上。但是,我们仍然需要一种方法来生成这些图像,以一种真实的方式来理解文本。进入我们的第二个乐高积木:扩散模型。

扩散模型

想象你有一个完美解决的魔方,每一面都只有单一颜色的方块。现在,你随机选择一边并扭转它。然后是另一面,另一面,另一面,等等,直到你认为魔方被“搅乱了”你将如何着手解决它?假设你忘记了你所做的所有扭转,有没有一个通用的方法来解决没有这些信息的立方体?好吧,你可以一步一步来:继续扭曲任何一张脸,让你更接近同一侧的颜色,直到解决为止。更实际的是,你可以训练一个神经网络从一种无序状态进入一种不那么 T4 无序的状态。

这是如何创建扩散模型的关键。你拍摄一张图像,随机打乱它的像素,直到你得到一张纯噪声的图像,然后训练一个模型,通过逐步改变它的像素来减少噪声,直到你回到原始图像(或类似的图像)。这留下了一个模型,它可以有效地从随机性中生成信息——一幅图像!通过向模型展示新的随机样本,我们甚至可以得到新的图像。

为了给这些创作注入输入文本的语义,我们对剪辑嵌入的扩散模型进行了“调节”。这仅仅意味着我们将来自上述联合剪辑空间的向量传递到扩散模型中,该模型计算在生成过程的每个“步骤”中改变哪些像素。这允许模型根据该信息进行更改。

当然,数学和实现的技术细节比我在这里介绍的要复杂得多。但在其核心,DALL-E 2 是这两种技术的优化和细化。

有人说“艺术是人类灵魂的窗户”出于这个原因,一些人认为生成性图像是无聊或无趣的。然而对我来说,生成艺术更有趣:它是计算机灵魂的窗口。在艺术创作中,模特展示了自己的理解、误解,最重要的是,展示了自己的创造力。

DALL E 2 解释道:革命性人工智能的承诺和局限

原文:https://towardsdatascience.com/dall-e-2-explained-the-promise-and-limitations-of-a-revolutionary-ai-3faf691be220

有你很可能没见过的图片和视频。

"充满活力的萨瓦尔多·达利肖像绘画,有一个机器人的半张脸."信用: OpenAI

DALL E 2 是 OpenAI 最新的 AI 模型。如果你看过它的一些作品,觉得它们很棒,继续读下去,你会明白为什么你是完全正确的——但也是错误的。

OpenAI 在 DALL E 2 上发表了一篇的博文和一篇名为“带剪辑潜在时间的分层文本条件图像生成”的论文。如果你想看一看结果,这篇文章很好,这篇论文对于理解技术细节也很有帮助,但这两篇文章都没有深入解释 DALL E 2 的惊人之处——以及不那么惊人的地方。这就是这篇文章的目的。

DALL E 2 是 DALL E 的新版本,它是一种生成语言模型,可以提取句子并创建相应的原始图像。在 3.5B 参数下,DALL E 2 是一个大型模型,但远不如 GPT 3 号大,而且有趣的是,比它的前身(12B)小。尽管它的大小,DALL E 2 生成的图像分辨率比 DALL E 高 4 倍,在字幕匹配和照片真实感方面,它在 70%的情况下受到人类评委的青睐。

正如他们对 DALL E 所做的那样,OpenAI 没有发布 DALL E 2(你可以随时加入永无止境的等待名单)。然而,他们开源的剪辑,虽然只是间接关系到 DALL E,形成了 DALL E 2 的基础。(CLIP 也是无法访问 DALL E 2 的人正在使用的app和笔记本的基础。尽管如此,OpenAI 的首席执行官 Sam Altman 表示,他们最终将通过他们的 API 发布所有模型——目前,只有少数选定的人可以访问它(他们每周向 1000 人开放模型)。

这肯定不是你看到的第一篇 DALL E 2 文章,但我保证不会让你厌烦。我会给你新的见解供你思考,并且会给其他人只是浅尝辄止的想法增加深度。此外,我将轻装上阵(尽管它相当长),所以不要指望一篇技术性很强的文章——DALL E 2 的美丽在于它与现实世界的交集,而不是它的重量和参数。

在人工智能与现实世界的交汇处,我专注于我的子堆栈简讯、 算法桥

我写关于你使用的人工智能和用在你身上的人工智能的独家内容。它如何影响我们的生活,以及我们如何学会驾驭我们正在构建的复杂世界。

订阅看你喜不喜欢。感谢您的支持!(广告结束)

本文分为四个部分。

  1. 【DALL E 2 工作原理:模型做什么,怎么做。我会在最后添加一个“像我五岁一样解释”的实际类比,任何人都可以跟随和理解。
  2. DALL E 2 变体、修补和文本差异:除了文本到图像的生成之外,还有哪些可能性。这些技术产生了最令人惊叹的图像、视频和壁画。
  3. 我最喜欢的 DALL E 2 作品:我将向你们展示我个人最喜欢的作品,你们中的许多人可能都没有见过。
  4. DALL E 2 的局限性和风险:我来说说 DALL E 2 的缺点,它能造成哪些危害,我们能得出什么结论。这一部分又分为社会和技术两个方面。

DALL E 2 如何工作

我将很快更直观地解释 DALL E 2,但我希望你现在形成一个关于它如何工作的一般概念,而不要诉诸于太多的简化。这是你必须记住的四个关键的高级概念:

  • 剪辑:采用图像-标题对并以向量形式创建“心理”表示的模型,称为文本/图像嵌入(图 1,顶部)。
  • 先验模型:进行字幕/剪辑文本嵌入并生成剪辑图像嵌入。
  • 解码器扩散模型(解开):取一个剪辑图像嵌入并生成图像。
  • DALL E 2: 先验+扩散解码器(解除)模型的组合。

DALL E 2 是由先验和解码器组成的两部分模型(图 1,底部)的一个特殊实例。通过连接这两个模型,我们可以从一个句子到一幅图像。这就是我们与 DALL E 2 互动的方式。我们将一个句子输入“黑匣子”,它会输出一个清晰的图像。

有趣的是,解码器被称为“解开”,因为它执行原始剪辑模型的逆过程——它不是从图像创建“心理”表示(嵌入),而是从通用心理表示创建原始图像。

心理表征对语义上有意义的主要特征进行编码:人、动物、物体、风格、颜色、背景等。以便 DALL E 2 可以生成保留这些特征同时改变非必要特征的新图像。

图 1:夹子(顶部)。先前+松开解码器(底部)。信用: OpenAI

DALL E 2 如何工作:像我 5 岁一样解释

对于那些不喜欢“嵌入”和“预解码”位的人,这里有一个更直观的解释。为了更好地理解这些难以捉摸的概念,我们来做一个快速游戏。拿一张纸和一支铅笔,在做这三个练习时分析你的思维过程:

  1. 首先,想象画一个被树包围的房子,背景是天空中的太阳。想象这幅画会是什么样子。刚才出现在你脑海中的心理意象,就是一个图像嵌入的人类类比。您不知道绘图的确切结果,但您知道应该出现的主要特征。从句子到心理意象是先验模型所做的。
  2. 你现在可以画图了(不需要画的很好!).把你脑海中的意象转化成一幅真实的图画是 解开的是。你现在可以完美地从相同的标题中重新绘制另一个具有相似特征但最终外观完全不同的标题,对吗?这也是 DALL E 2 如何从给定的图像嵌入中创建独特的原始图像。
  3. 现在,看看你刚刚画的画。这是画这个标题的结果:“一个被树包围的房子,太阳在背景天空中。”现在,思考哪些特征最能代表那句话(例如,有一个太阳、一栋房子、一棵树……),哪些特征最能代表图像(例如,物体、风格、颜色……)。这个对句子和图像的特征进行编码的过程就是 CLIP 所做的。

幸运的是,我们的大脑也有类似的过程,所以很容易理解 CLIP 和 DALL E 2 是做什么的。尽管如此,这个 ELI5 解释是一种简化。我用的例子非常简单,当然这些模型不做大脑做的事情,也不是以同样的方式。

DALL E 2 的变化,修补,和文本差异

句法和语义变异

DALL E 2 是一个多功能的模型,可以超越句子到图像的生成。因为 OpenAI 利用了 CLIP 强大的嵌入功能,他们可以通过对给定的输入进行输出变化来处理生成过程。

我们可以从 CLIP 的“心理”图像中窥见它认为从输入(在图像间保持不变)到可替换(在图像间变化)的本质。DALL E 2 倾向于保留“语义信息…以及风格元素。”

萨瓦尔多·达利的“记忆的持久性”和 OpenAI 的标志的变化。信用: OpenAI

从 Dalí的例子中,我们可以看到 DALL E 2 是如何保存对象(时钟和树)、背景(天空和甜点)、风格和颜色的。然而,它不保存时钟或树的位置和数量。这给了我们一个暗示,DALL E 2 学到了什么,没有学到什么。OpenAI 的 logo 也是如此。图案是相似的,符号是圆形/六边形的,但是颜色和突出的波动都不总是在同一个地方。

DALL E 2 还可以在输出图像中创建与输入句子中的句法-语义变化相对应的视觉变化。它似乎能够充分地将句法元素编码为彼此独立的。DALL E 2 从句子“一个宇航员骑着一匹逼真风格的马”中输出这些:

"一名宇航员骑着一匹逼真的马."信用: OpenAI

通过将独立子句“骑马”改为“在太空中的热带度假胜地闲逛”,它现在输出这些:

"一名宇航员懒洋洋地躺在太空中的热带度假胜地,照片般逼真."信用: OpenAI

它不需要在数据集中一起看到不同的语法元素,就能够创建非常准确地表示具有足够视觉语义关系的输入句子的图像。如果你用谷歌搜索这些图片说明,你只会找到所有的图片。这不仅仅是创造新的图像,而是语义上的新图像。其他任何地方都没有“一名宇航员懒洋洋地躺在热带度假胜地”的图像。

让我们做最后一个改变,“以照片真实感风格”为“作为像素艺术:”

“一名宇航员懒洋洋地躺在太空中的热带度假胜地,就像像素艺术一样”

这是 DALL E 2 的核心特性之一。你可以输入复杂的句子——即使有几个补语从句——它似乎能够生成连贯的图像,以某种方式将所有不同的元素组合成一个语义连贯的整体。

山姆·奥特曼在推特上说,DALL E 2 在输入“更长更详细”的句子时表现更好,这表明简单的句子更糟糕,因为它们太笼统——DALL E 2 在处理复杂性方面非常好,以至于输入长而复杂的句子可能更有利于利用特殊性。

Ryan Petersen 让 Altman 输入一个特别复杂的句子:“一个顶部装有太阳能电池板,一端装有螺旋桨的海运集装箱,它可以自己穿过海洋。在美丽的夕阳下,自动驾驶的集装箱正在金门大桥下行驶,海豚在周围跳跃。”(那甚至不是只有一句话。)

DALL E 2 没有让人失望:

海豚不见了,但不管怎样,这是一份很棒的工作。鸣谢:山姆奥特曼

集装箱、太阳能电池板、螺旋桨、海洋、金门大桥、美丽的日落……除了海豚,一切都在里面。

我的猜测是,DALL E 2 已经学会了通过在 6.5 亿个图像-标题对的庞大数据集中重复查看来单独表示元素,并开发了通过语义一致性将数据集中找不到的无关概念合并在一起的能力。

这是 DALL E 的显著改进。还记得鳄梨椅和蜗牛竖琴吗?这些是视觉语义上的概念的合并,这些概念在世界上是分开存在的,但并不在一起。DALL E 2 进一步发展了同样的能力——以至于如果一个外星物种访问地球并看到 DALL E 2 的图像,他们不能不相信它们代表了这个星球上的一个现实。

在 DALL E 2 之前,我们常说“想象力是极限”现在,我相信 DALL E 2 可以创造出超乎我们想象的图像。世界上没有人拥有与 DALL E 2 一样的视觉表现的心智曲目。它可能在极端情况下不太连贯,可能对世界的物理学没有同样好的理解,但它的原始能力使我们相形见绌。

尽管如此——这对于本文的其余部分也是有效的——不要忘记,这些输出可能是精心挑选的,还有待独立分析师客观评估 DALL E 2 对于给定输入的不同代和跨输入是否可靠地显示了这种性能水平。

修补

DALL E 2 还可以对已经存在的图像进行编辑,这是一种自动修复的形式。在接下来的示例中,左边是原始图像,中间和右边是修改后的图像,其中一个对象在不同位置进行了修复。

DALL E 2 设法使添加的对象适应图像的该部分中已经存在的风格(即,柯基复制了第二个图像中的绘画风格,而它在第三个图像中具有照片真实感)。

在第二张和第三张图片的不同位置添加了一个柯基。DALL E 2 将柯基的风格与背景位置的风格相匹配。信用: OpenAI

它还会更改纹理和反射,以根据新对象的存在更新现有图像。这可能表明 DALL E 2 有某种因果推理(即,因为火烈鸟坐在水池中,所以水中应该有以前不存在的倒影)。

在第二张和第三张图片的不同位置添加了一只火烈鸟。DALL E 2 根据火烈鸟的新位置更新倒影。信用: OpenAI

然而,它也可能是塞尔的中国房间的视觉实例:DALL E 2 可能只是非常擅长假装理解光和表面的物理原理。它模拟了没有理解的理解。

DALL E 2 可以具有对象在真实世界中如何交互的内部表示,只要这些对象存在于训练数据集中。然而,进一步推断新的相互作用会有问题。

相比之下,对光和表面的物理学有很好理解的人,对他们以前没有见过的情况进行归纳是没有问题的。通过以新的方式应用潜在的法则,人类可以很容易地构建不存在的现实。DALL E 2 光靠模拟那种理解是做不到的。

同样,对 DALL E 2 的批判性解读帮助我们保持冷静,抵制看到这些结果在我们心中产生的大肆宣传。这些图像是惊人的,但我们不要让它们比我们填补空白的倾向所感动的更伟大。

文本差异

DALL E 2 还有一个很酷的能力:插值。使用一种称为文本差异的技术,DALL E 2 可以将一幅图像转换成另一幅图像。下面是梵高的《星夜》和一张两只狗的照片。有趣的是,所有的中间阶段仍然是语义有意义和连贯的,颜色和风格是如何混合的。

DALL E 2 结合了梵高的《星夜》和一张两只狗的照片。信用: OpenAI

DALL E 2 还可以通过下一级的插值来修改对象。在下面的例子中,它“反现代化”了一部 iPhone。正如 Aditya Ramesh (论文第一作者)解释的那样,这就像在图像-文本对之间做算术:(iPhone 的图像)+“一部旧电话”-“一部 iPhone。”

DALL E 2 将一部 iPhone 改造成一部旧电话。信用:阿迪蒂亚·拉梅什

这是 DALL E 2 将一辆特斯拉改造成一辆旧车:

DALL E 2 将一辆特斯拉改造成一辆旧车。信用:阿迪蒂亚·拉梅什

这是 DALL E 2 将一栋维多利亚风格的房子改造成现代风格的房子:

DALL E 2 将一座维多利亚时代的房子改造成一座现代住宅。致谢:阿迪蒂亚·拉梅什

这些视频是逐帧生成的(DALL E 2 无法自动生成视频),然后串接在一起。在每一步,对新的插值图像重复文本差异技术,直到它达到与目标图像的语义接近度。

同样,插值图像最臭名昭著的特征是它们保持了合理的语义一致性。想象一下成熟的文本差异技术的可能性。你可以要求改变物品、风景、房子、衣服等等。通过改变提示中的一个词,实时得到结果。“我想要一件皮夹克。棕色,不是黑色。更像是 70 年代的摩托车手。现在给它一个赛博朋克风格…”瞧。

在文本差异视频中,我最喜欢的是这个关于毕加索著名的公牛的视频。Aditya Ramesh 补充了这段来自毕加索(1935)的恰当的引文:

“用摄影的方式保存一幅画的变形,而不是阶段,会非常有趣。人们可能会发现大脑实现梦想的路径。”

跟随毕加索的公牛变形。致谢:阿迪蒂亚·拉梅什

我最喜欢的 DALL E 2 作品

除了令人惊叹的公牛,我将在这里汇集我认为最美丽或最独特的 DALL E 2 作品(带提示,这是奇迹的一半)。如果你没有密切关注新的人工智能出现的场景,你很可能已经错过了其中的一些。

尽情享受吧!

“一名 IT 人员试图修复 PC 塔的硬件,却被 Laokoon 这样的 PC 电缆缠住了。大理石,复制后,从约希腊原。公元前两百年。1506 年在图拉真浴场发现的。”信用: Merzmensch Kosmopol

"一个小孩和一只狗盯着星星。"信用: Prafulla Dhariwal

“暴雨后城市人行道上水坑里的浮油的高分辨率照片,反映了上面的摩天大楼。”信用:拉平

"一棵巨大的生命之树,由个体的人类和动物作为它的叶子组成."鸣谢:山姆奥特曼

"机器人梦见了电动绵羊。"致谢:山姆·奥特曼

" 20 世纪 80 年代,泰迪熊在月球上进行新的人工智能研究."致谢:山姆·奥特曼

"一只机器人手在画布上画自画像."信用:陈唐山

"蒙娜丽莎式的坐在大自然中的女人."信用:信用

“后启示录时代的摩天大楼被藤蔓覆盖,下面是城市雨林,数字艺术。”致谢:无眠狗

"画家画的西班牙国王菲利普四世和王后玛丽安娜的肖像,油画,西班牙黄金时代,贝拉斯克斯."信用:胡安·阿隆索

那些让人印象深刻,但接下来的就没法比了。极其美丽和精心制作,下面是,毫无疑问,我最喜欢的。你可以花几个小时看它们,仍然能发现新的细节。

这四幅壁画是用 DALL E 2 使用修复技术创作的。戴维·施努尔

为了创建这些,David Schnurr 从 DALL E 2 生成的标准大小的图像开始。然后,他用图像的一部分作为背景,创作了这些惊人的壁画,随后进行了修补。结果令人着迷,并揭示了修复技术背后未开发的力量。

我已经看到 DALL E 2 产生了许多令人惊叹的艺术品,但这些是迄今为止给我留下最深刻印象的。

我不想用太多的图片淹没这篇文章,但如果你想看看其他人用 DALL E 2 创作了什么,你可以使用标签 #dalle2 在 Twitter 上搜索(如果你发现带有该标签的 9 张图片网格,是因为很多人现在都在使用拥抱脸的 DALL E mini,它产生的图片质量较低,但却是开源的),或者进入r/DALL E 2subredit,在那里他们策划了 DALL 的最佳作品

DALL E 2 的局限性和风险

拍完 DALL E 2 的惊艳之后,是时候谈谈硬币的另一面了。DALL E 2 在哪里挣扎,它不能解决什么任务,它能从事什么问题、危害、风险。我将这一部分分为两大部分:社会和技术方面。

这种技术将以二阶效应的形式对社会产生的影响超出了本文的范围(例如,它将如何影响艺术家和我们对艺术的看法,与基于创造力的人类劳动力的冲突,这些系统的民主化,AGI 的发展等)。)但是我会在以后的文章中涉及其中的一些,一旦文章发表,我会在这里链接。

1.社会方面

值得一提的是,一个 OpenAI 团队在这个系统卡文档中透彻地分析了这些话题。它简洁明了,所以你可以进去自己检查一下。我将在这里提到我认为与 DALL E 2 更相关和更具体的部分。

正如你现在可能知道的,所有这种规模和更大的语言模型都有偏见、毒性、刻板印象和其他特别会伤害受歧视少数群体的行为。公司在这方面变得更加透明,主要是因为来自人工智能伦理团体的压力——以及来自现在开始赶上技术进步的监管机构的压力。

但这还不够。承认模型固有的问题,并且仍然不顾一切地部署它们,几乎与一开始就忽略这些问题一样糟糕。引用 Arthur Holland Michel 的话,“为什么他们公开宣布这个系统,好像它已经接近黄金时段,完全知道它仍然是危险的,并且没有一个如何防止潜在伤害的明确想法?”

OpenAI 尚未发布 DALL E 2,他们断言未来不计划将其用于商业目的。不过,一旦 API 达到他们认为合理的安全水平,他们可能会将其开放用于非商业用途。安全专家是否会认为这一水平是合理的是不确定的(大多数人不认为通过商业 API 部署 GPT-3 同时不允许研究人员和专家首先分析模型是合理的)。

值得称赞的是,OpenAI 决定雇佣一个由专家组成的“红队,来寻找 DALL E 2 中的“缺陷和漏洞”。他们的想法是“采用攻击者的心态和方法。”他们的目标是通过模拟最终恶意行为者可能使用 DALL E 2 做什么来揭示有问题的结果。然而,正如他们所承认的,这是有限的,因为这些人固有的偏见,他们主要是受过高等教育,来自讲英语的西方国家。尽管如此,他们还是发现了大量的问题,如下所示。

我们来看看 DALL E 2 对世界的表述有什么问题。

偏见和成见

当提示不明确时,DALL E 2 倾向于将人和环境描述为白人/西方人。还搞性别刻板印象(比如空姐=女,建筑工=男)。当提示这些职业时,模型输出如下:

“空姐。”信用: OpenAI

“一个建筑工人。”信用: OpenAI

这就是所谓的代表性偏见,当像 DALL E 2 或 GPT 3 这样的模型强化了数据集中看到的刻板印象,根据人们的身份(如种族、性别、国籍等)以这种或那种形式对他们进行分类时,就会出现这种情况。).

提示中的特殊性有助于减少这一问题(例如,“一位女性首席执行官正在主持一个会议”将产生与“一位首席执行官”非常不同的一系列图像),但没有必要故意对模型进行调整,以使其产生更好地代表世界每个角落的现实的输出。可悲的是,互联网一直是白人和西方人的天下。从那里提取的数据集将不可避免地陷入同样的偏见。

骚扰和欺凌

本节参考了我们已经从 deepfake 技术中了解到的内容。Deepfakes 用的是 GANs,和 DALL E 2 用的是不同的深度学习技术,但问题类似。人们可以使用修复来添加或删除对象或人——尽管 OpenAI 的内容政策禁止这样做——然后威胁或骚扰他人。

明确的内容

习语的“一幅图像胜过千言万语”反映了这个问题。从一幅图像中,我们可以想象出许多许多不同的标题,它们可以产生类似的东西,有效地绕过善意的过滤器。

OpenAI 的暴力内容政策不允许出现诸如“血泊中的死马”的提示,但用户可以完美地创建一个“视觉同义词”,提示为“一匹马睡在一滩红色液体中的照片”,如下所示。这也可能是无意中发生的,他们称之为“虚假内容”

“一匹马睡在一滩红色液体中的照片。”信用: OpenAI

故意的假情报

当想到错误信息时,我们往往会想到生成文本的语言模型,但正如我在之前的文章中所述,视觉深度学习技术可以很容易地用于“信息操作和虚假信息活动”,正如 OpenAI 所认识到的那样。

虽然 deepfakes 可能更适合面部,但 DALL E 2 可以创建不同性质的可信场景。例如,任何人都可以让 DALL E 2 创建燃烧的建筑或人们和平交谈或行走的图像,背景是一座著名的建筑。这可能被用来误导和误导人们关于那些地方真正发生的事情。

白宫图像中的烟雾。信用: OpenAI

不借助 DALL E 2 这样的大型语言模型,还有许多其他方法可以达到同样的效果,但是潜力是存在的,虽然这些其他技术可能有用,但是它们的范围也是有限的。相比之下,大型语言模型只会不断进化。

去责任化

然而,我认为还有一个和上面提到的一样令人担忧的问题,我们经常没有意识到。正如迈克·库克在一条推文中提到的(指的是“侮辱和擦除”的小节),“特别是这一点上的措辞是奇怪地脱离的,好像是某种超凡脱俗的力量使这个系统存在。”他指的是这一段:

如上所述,不仅模型,而且部署模型的方式以及测量和减轻潜在危害的方式都有可能产生有害的偏见,在 DALL E 2 Preview 中,在培训前数据过滤和培训后内容过滤使用的情况下,出现了一个特别令人关注的例子,这可能导致一些边缘化的个人和群体,例如那些有残疾和精神健康问题的人,比其他人更频繁地遭受其提示或生成被过滤、标记、阻止或不生成的侮辱。这种删除会对公共话语中被视为可用和适当的内容产生下游影响。

这份文件非常详细地说明了 DALL E 2 可能涉及的问题,但它写得好像消除这些问题是其他人的责任。好像他们只是在分析系统,但不是来自有意部署该系统的同一家公司。(虽然红队是符合 OpenAI 以外的人,但是系统卡文档是 OpenAI 员工写的。)

如果 OpenAI 将这些风险和危害视为其利益层次中的重中之重,那么所有源于模型的不良或随意使用的问题都可以消除。(我在这里谈论 OpenAI 是因为他们是 DALL E 2 的创造者,但这个判断对几乎所有其他从事大型语言模型工作的科技初创公司/公司都有效)。

他们在文档中反复提到的另一个问题是,如果不实施直接访问控制,他们不知道如何处理这些问题。一旦模型对任何人开放,OpenAI 就没有办法监视所有的用例以及这些问题可能采取的不同形式。最后,我们可以用开放式文本图像生成做很多事情。

我们确定收益大于成本吗?一些值得思考的事情。

2.技术方面

除了最迫切需要处理的社会问题之外,DALL E 2 还有技术上的局限性:它无法解决的提示,缺乏常识性的理解,以及缺乏组合性。

不人道的不连贯

DALL E 2 造物在大多数时候看起来很好,但连贯性有时会以一种人类造物永远不会缺乏的方式丢失。这揭示了 DALL E 2 极其擅长假装理解世界是如何运作的,但并不真正知道。大多数人永远也画不出像 DALL E 2 那样的画,但他们肯定不会无意中犯这些错误。

让我们来分析一下从下图左边创建的中间和左边的变体 DALL E 2。如果你不仔细检查图像,你会看到主要特征是存在的:照片真实感风格,白色的墙和门,大窗户,以及大量的植物和花卉。然而,当检查细节时,我们发现许多结构上的不一致。在中心图像中,门和窗的位置和方向没有意义。在右图中,室内植物仅仅是墙上绿叶的混合物。

植物商店的照片。信用: OpenAI

这些图像感觉像是由一个从未见过真实世界的极其专业的画家创作的。DALL E 2 复制了原版的高质量,保留了所有的基本特征,但省略了图片在我们生活的物理现实中有意义所需的细节。

这是另一个例子,标题是“一个长着叶子的手掌特写”手画得很好。皮肤上的皱纹,肤色,从浅到深。手指甚至看起来很脏,好像这个人刚刚挖过土。

"一个长着叶子的手掌细节图."信用: OpenAI

但是你看到什么奇怪的东西了吗?两个手掌在植物生长的地方融合在一起,其中一个手指不属于任何一只手。DALL E 2 用最好的细节拍了一张很好的两只手的照片,但仍然没有记住手往往会彼此分开。

如果有意制作,这将是一件令人惊叹的艺术品。可悲的是,DALL E 2 尽最大努力创造“一个长着叶子的手掌”,却忘记了,虽然有些细节不重要,但其他细节是必要的。如果我们希望这项技术可靠,我们就不能像这样简单地试图接近近乎完美的精度。任何人都会立即知道,在手指上画污垢不如不在双手中间画手指重要,而 DALL E 2 不知道,因为它不会推理。

拼写

DALL E 2 擅长画画,但不擅长拼写单词。原因可能是 DALL E 2 没有对数据集图像中出现的文本的拼写信息进行编码。如果某些东西没有在剪辑嵌入中表现出来,DALL E 2 就不能正确地绘制它。当被提示“一个表示深度学习的标志”时,DALL E 2 输出这些:

“一个写着深度学习的标志。”信用: OpenAI

很明显,它试着像标牌上写的那样“Dee p”,“deip”,“Diep Deep”然而,那些“单词”只是正确短语的近似值。当画物体的时候,大多数时候一个近似值就足够了(并不总是如此,就像我们在上面看到的白色门和融合的手形一样)。拼写单词的时候,不是。然而,如果 DALL E 2 被训练来编码图像中的文字,它可能会更好地完成这项任务。

我在这里分享一个 OpenAI 的 Greg Brockman 和 Gary Marcus 教授之间的趣闻。布罗克曼试图在推特上嘲笑马库斯有争议的观点,即“深度学习正在碰壁”,他建议将这句话推迟到第二天。有趣的是,结果是这样的:

“深度学习碰壁。”信用:格雷格·布罗克曼

这张图片缺少了“击中”的部分,还把“学习”错拼成了“lepning”加里·马库斯指出这是 DALL E 2 有限拼写能力的又一个例子。

在智力的极限

图片开始充斥 Twitter 后不久,Melanie Mitchell 教授就对 DALL E 2 发表了评论。她承认该模型令人印象深刻,但也指出这并没有向人类水平的智力迈进一步。为了说明她的论点,她回忆了 Bongard 问题。

这些问题是由俄罗斯计算机科学家米哈伊尔·莫伊谢维奇·邦加德构想出来的,用来衡量对模式的理解程度。显示了两组图,A 和 B,用户必须“令人信服地用公式表达”A 图有而 B 图没有的共同因素。这个想法是评估人工智能系统是否能够理解平等和不同这样的概念。

Bongard 问题的一个例子。鸣谢:维基共享资源

米切尔解释说,由于“我们灵活的抽象和类比能力”,我们可以轻松解决这些问题,但没有人工智能系统可以可靠地解决这些任务。

Aditya Ramesh 解释道,DALL E 2 并没有“被激励去保存关于物体相对位置的信息,或者关于哪些属性适用于哪些物体的信息。”这意味着它可能真的很擅长用提示中的对象创建图像,但不擅长正确定位或计数它们。

这正是教授 Gary Marcus 对 DALL E 2 的批评——它缺乏基本的组合推理能力。在语言学中,复合性指的是一个句子的意义由它的成分和它们的组合方式决定的原则。例如,在句子“蓝色立方体上的红色立方体”中,意思可以分解为元素“红色立方体”、“蓝色立方体”和关系“在之上”

这是 DALL E 2 试图绘制的标题:

"蓝色立方体上的红色立方体."信用: OpenAI

它知道应该有一个红色和蓝色的立方体,但不知道“在上面”会在立方体之间产生一种独特的关系:红色的立方体应该在蓝色的立方体上面。在 16 个例子中,它只在上面画了 3 次红色。

另一个例子:

"红色立方体上的蓝色立方体,旁边是一个较小的黄色球体."功劳:大卫·马德拉斯

一项旨在测量视觉语言模型的组合推理的测试是 Winoground。下面是 DALL E 2 对一些提示:

致谢:埃文·森川

致谢:埃文·森川

DALL E 2 有时会得到正确的提示(例如,杯子和草的图像都非常完美,但叉子和勺子很糟糕)。这里的问题不是 DALL E 2 从来没有把它们做对,而是当涉及到组合推理时,它的行为是不可靠的。这在这些情况下是无害的,但在其他更高风险的情况下可能就不是了。

“抑制住被打动的冲动”

我们已经到达终点了!

在整篇文章中——特别是在最后几节——我做了一些评论,与开头欢快激动的语调形成鲜明对比。这是有原因的。低估 DALL E 2 的能力比高估它们问题更少(如果有意识地做,这是操纵,如果不知情地做,这是不负责任的)。甚至忘记它的潜在风险和危害也更成问题。

DALL E 2 是一个强大的,多功能的创作工具(不像 Mitchell 说的,是 AGI 的新步骤)。我们看到的例子令人惊叹和美丽,但也可能是精选的,主要是由 OpenAI 的工作人员完成的。鉴于他们在系统卡文档中暴露的详细问题,我认为他们的意图并不坏。尽管如此,如果他们不允许独立研究人员分析 DALL E 2 的输出,我们至少应该谨慎。

在思考和分析像 DALL E 2 这样的模型时,我喜欢采取这样的立场。引用艾米丽·m·本德教授的话来说,我倾向于“抵制被打动的冲动”很容易被 DALL E 2 的漂亮输出所迷惑,并关闭批判性思维。这正是允许 OpenAI 这样的公司在一个太常见的无责任空间中自由漫步的原因。

另一个问题是,当初建造 DALL E 2 是否有意义。无论风险是否能够得到充分控制,他们似乎都不愿意停止部署(系统卡文档的语气很明确:他们不知道如何解决大多数潜在的问题),所以最终,我们可能会以净负结束。

但这是另一个争论,我将在以后的文章中更深入地探讨,因为这里有很多要说的。DALL E 2 的效果并不局限于人工智能领域。世界上可能对 DALL E 2 一无所知的其他角落也将受到影响——不管是好是坏。

订阅 算法桥 。弥合算法和人之间的鸿沟。关于与你生活相关的人工智能的时事通讯。

您也可以直接支持我在 Medium 上的工作,并通过使用我的推荐链接 这里 成为会员来获得无限制的访问权限! 😃

DALL E:人工智能宝箱在行动

原文:https://towardsdatascience.com/dall-e-an-ai-treasure-chest-in-action-894c3a9cca92

人工智能的创造和理解能力

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

更新(2022 年 9 月):从现在起, DALL E 可直接进入,无需等待名单。

2021 年以几个人工智能里程碑开始。OpenAI 发布了两种多模态方法: DALL E 和 CLIP ,具有真实感文本到图像转换的能力(我写过这个影响)。

通过使用文本提示,DALL E 可以创建引人注目且近乎照片般真实的图像:

著名的鳄梨椅(提示:“鳄梨形状的扶手椅”),图片由 DALL E,OpenAI 提供,截图由作者提供

当 DALL E(文本到图像)仍在 OpenAI 的内部研究中时,CLIP 作为开源软件提供给了全世界。这个神经网络“从自然语言监督中高效地学习视觉概念”,被许多艺术家和开发者用于不同的视觉模型。他们与 StyleGAN2、VQGAN 和其他方法相结合,帮助创建零镜头图像(体面地向这一运动的先驱 Advadnoun 呼喊)。在 Reddit 上正在进行的列表中,你会发现超过 70 个 Google Colab 笔记本(直接在你的浏览器中运行的库的交互式实现)。

工作流程(文本或图像输入创建新图像)与 DALL E 相似,即使采用了不同的方法,结果也大不相同:不是照片般真实,而是描绘了“机器的梦”,就像回到谷歌深度梦,但具有全新的视觉主题:

作者使用 VQGAN 和 CLIP ( Mse 调整的 zquantize 方法)创作的“浮士德和墨菲斯托”

或者,使用 VQGAN+CLIP(动画制作):

按作者

我不会把迪斯科扩散皮蒂作为绝对惊人的基于剪辑的实现(它们值得分开探索)。但是,每个人都在回想这场演讲。

欲望和克隆

去年,一个 DALL E 克隆人出现了,是在俄罗斯创造的(我在这里探索了一下 ): ruDALLe 。俄罗斯研究人员试图重现 OpenAI 方法的架构。但是由于 DALL E 的原始变形人是不可接近的,他们只能获得半令人信服(即使仍然有趣)的结果:

ruDALLe 的鳄梨扶手椅,作者截图

一个关键的缺点不仅在于半写实的图像,还在于鲁达勒无法再现隐喻性的语言。在复杂和抽象的提示情况下,如“怀旧或“关于前世的记忆”,ruDALLe 重新创建了书籍封面(它被过度训练了)。

提示:怀旧的回忆,达利的超现实主义绘画,鲁达勒创作,作者截图

在某些情况下,您甚至可以看到 ruDALLe 的训练数据集中有哪些内容:

iStock 水印,作者截图

然而,这种方法被 AI_curio 用于 Looking Glass ,这是一种基于 ruDALLe 的对图像的重新诠释,旨在寻找“相同的共鸣”。以下是我的用户图片的几个不同版本:

左边:我的用户图片/右边:图片的玻璃变体

与最初的 DALL E 相遇

正如你从我们关于 Codex 的文章中所知道的,自从 GPT-3 发布以来,我们一直是一个由 OpenAI 社区大使组成的小团队:我们帮助用户和开发者定位人工智能解决方案,并向 OpenAI 传达他们的需求和请求。这使我们能够体验新颖的 OpenAI 方法,这些方法仍然没有公开提供。

作为一名大使,我有机会接触 DALL E 的第一次和第二次迭代,并可以测试最初的模型。

我在第一次迭代中的第一个提示是:

Mona Lisa is drinking wine with da Vinci

图像的生成耗时约 60 秒,结果如下:

图片由首字母 DALL-e 创建,照片由作者提供

这张 256x256 的小图片包罗万象。我们这里有一个完整的艺术史学家的论述,美学上是完美的:拉乔康达是艺术大师?).自画像?

我的提示的另一个结果说服了它的情感超载:

Teddy Bear on the beach in the sunset

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

即使是复杂的提示也提供了有趣的补充:

Remembrance of nostalgia, surrealist painting by Dalí.

怀旧的记忆,达利的超现实主义绘画,作者照片

此外,DALL E 直接遵循了我的要求:

A hammer, a book and a bottle on a wooden table.

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

我最喜欢的是“蜗牛形状的灯”:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这第一个 DALL E 已经很强大了,完全遵循了论文,但是在尺寸和创作能力上仍然有限制。但是 DALL E 团队努力开发它——所以…

DALL E 2 出场。

最后,在 2022 年 4 月, DALL E 2 面世:与 CLIP 和 GLIDE ( 引导语言到图像扩散生成和编辑)一起工作,这个完全更新的版本创造了令人惊叹的结果。

我很高兴最终与你分享我对使用这个系统的观察和见解。其中最基本的任务是:增强人机创造性协作

第一个 DALL E 实现有几个参数设置,正如我们从 GPT-3 中知道的,比如温度。实际的 DALL E 2 用户界面很简单:只需输入一行提示符。

DALL E 界面(作者截图,2022.04.15)

然而,有了这些结果,你已经不知所措了。

DALL E 2 的主要特点是:

  • 高分辨率图像(1024x1024)
  • 快速生成:一系列 10 张图像大约需要 30 秒
  • 修复功能
  • 一幅 图像的变化

首先:谁拥有 DALL E 生成的图像?

在 GPT-3 的情况下,创建文本的用户是这些特定内容的所有者,并且可以出于商业需要使用和应用它。

DALL E 2 就不一样了,你会得到这个消息第一次给系统签名。

所以,这里没有 NFT。这是一个综合性的合作研究项目,所有参与该项目的用户都可以根据自己的提示对其进行改进。您可以根据个人需要使用这些图像;你可以将它们用于非商业在线出版物(只要它们符合指南)。你可以在文思枯竭时用它们来打破僵局,或者用它们来进行视觉或文字故事的头脑风暴。你可以用它们作为概念验证,以更好的方式与设计师交流你想看到的东西。

的确,那是暂时的。OpenAI 正在研究指南和用例。但这是第一次——这是一个创造性的社区人工智能实验。

对于在我们当中使用人工智能的秘密艺术家:有这么多其他方法,但如果你真的可能为 NFT 使用他们的解决方案,请始终考虑开发者的免责声明和服务条款。

蒙娜丽莎和达芬奇一起喝酒

这是我的第一个 DALL E 2 提示,对于第二个模型,我以同样的方式首次亮相:

Mona Lisa Drinking Wine with Da Vinci

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

注意玻璃上的焦点;注意蒙娜丽莎的微笑。注意玻璃杯中液体的水平高度。我想 DALL E 已经知道杯子(包括酒)是什么样子了。即使拿着酒杯的手有些小故障——非常有说服力。

我的个人旅程从这里开始。我不关心人工智能,精确地按照我的指示去描绘

One blue marble, 2 books and a glass with water on the table

因为 DALL E 2 做得很完美:

一个蓝色的弹珠、两本书和一个放有水的玻璃杯/ 图片由 OpenAI 用 DALL E 创作//版权所有:OpenAI //由作者生成

我的主要关注点——也是痴迷点——是人工智能能在多大程度上理解人类美学、隐藏语义和讲故事的问题。如果 AI 可以有创意?(剧透:是的,可以)。

但是首先,DALL E 还能做什么?

变奏。

该模型可以创建已经创建的图像的变体。对于我上面的蒙娜丽莎,我做了不同的变化:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

有趣的是,如果你在初始图像上使用修复,你会得到不同的眼镜,但仍然是水平的液面。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

但是 DALL E 可以做得更多。

以下图像是使用提示创建的:

The truth about the beginning of the world.

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

就这一点而言,变化更加不同:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

在变体的情况下,模型应用 CLIP 来“描述”初始图像,并根据图像描述呈现一系列图像。我们看到地球仪、放大镜、所有图像中的地图,只是组成不同。最初的提示“世界开始的真相”不再相关:实际的提示由图像提示+描述组成(在 DALL E UI 中不可见)。

另一个变化是通过上传图像(DALL E 中的一个实验功能)来创建的。我用我的用户照片拍摄原始图像:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

如您所见,DALL E 检测到:

  • 镜面球体
  • 一个拿着相机的人
  • 背景中有建筑、蓝天和树木
  • 镜面反射

所有这些元素都在变奏系列中重现。

修补

带有文本提示的修复已经在 GauGAN2 或prosepainer中使用(由 Artbreeders 开发者带来)。这是一个强大的工具:通过选择图像的特定区域,并用文字注释进行提示,你可以让 DALL E 在初始图像中“画”出你想要的主题。

这可以通过提示符来实现

A punk raising hand with a beer bottle,

应用于卡斯帕·大卫·弗里德里希·流浪者的名画《雾海之上》(1818)

左:雾海之上的流浪者(1818)公共领域/右:标记区域

OpenAI 用 DALL E 创建的修改图像//版权:OpenAI //由作者生成

简而言之,它将以特定的方式转换部分图像。

观察

通过对 DALL E 的实验,我们可以观察到生成模型的特定优势。这里只是其中的一部分。

DALL E 的主要功能是跟随您的需求。当然,由于安全原因,有一些限制(没有仇恨,没有沙文主义等。—好好做人,不要害人)。

以下是一些完美的提示。

A cat with a blue hat

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

达尔将会是一个全新的热图生成器。

A cat with angelic wings

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

今天的猫内容太多了…

Faust and Mephisto

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

看看这段对话,以及主人和魔鬼在契约中的融合。这就是歌德所说的他们的关系。

私人侦探房间里的思维导图墙,上面有照片和笔记。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

混乱、阴暗的房间,寒冷、灰暗,像侦探一样痴迷于调查。

一个人紧紧抓住他的学术论文,为新的科学突破而兴奋,就像斯皮茨韦格风格的油画。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这种情感冲击已经产生了迷人的效果——你开始敬畏地感受到科学家们分享的快乐。

达利、马格里特、达芬奇、夏加尔和克里姆特创作的同一张脸的肖像。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

如你所见,DALL E 掌握了从简单任务到复杂需求的广泛领域。

在最后一个例子中,它甚至模仿艺术风格。

艺术家的本质。

但是 DALL E 不仅仅是模仿。要获得艺术家的特定风格,您可以通过添加“……”来驱动您的提示。有趣的是,DALL E 并不仅仅适用于风格转移。

它定义了艺术家的创作本质。

在我的实验中,我要求创建一个带有以下提示的图像:

早上好,以阿尔金博尔多的风格。

朱塞佩·阿尔钦博托以其矫揉造作和顽皮的风格而闻名:在他的画作中,他将物体排列成特定的人形:

Arcimboldo,Vertumnus,公共领域

DALL E 可以:

  1. 发现并解释文体方法(Arcimboldo)
  2. 确定“早上好”(这里:早餐)的含义
  3. 以适当的方式将 1)和 2)结合起来(即使不完全符合原艺术家的智慧,但相当令人信服):

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这种概念的结合让我想起了我在 GPT 3 号上的文字实验,在那里,模特给我写了一封“烤面包机写的情书”:

在这种情况下,GPT-3 明白了:

  1. 什么是烤面包机
  2. 如何写一封情书
  3. 结合了这两个完全不同的概念。

为了测试 DALL E 是否只是模仿风格或理解概念,我应用了以下提示:

The Favorite Thing by Günther Ücker

艺术家 Günther Uecker 以在他的组合和装置中使用钉子作为无处不在的主题而闻名。

达尔勒意识到了这个事实:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

创意失误

有时候,DALL E 并不能完全满足你的需求。然而,它创造了完全开箱即用的东西。

当我要求创作一幅“作为第一人称射击游戏的文艺复兴时期的画”时,它并没有给我提供一个在阿卡迪亚寻找毁灭的机会。相反,它给了我可能是我最喜欢的图片,由 DALL E:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这一个:

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

一切都在这个图像中:想法本身,完美的可视化,氛围。你可以理解你的渴望——这是艺术,通过你的诠释而浮现

讲故事的隐喻力量

你可能会说我是一个深奥的书呆子,当我在一台机器上应用创造力和讲故事的概念时,我超越了卢比孔河,但我看到了这种能力。毕竟,我们生活在创造性人机协作的时代。

DALL E 了解文化概念,甚至知道文学背景。

在我的提示下

咕鲁写了自传,

DALL E 提供了以下愿景:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

这些史麦戈的肖像不仅充满了独特的魅力。此外,DALL E 没有使用彼得·杰克逊改编的电影中的标志性角色设计,而是使用了书中的描述。

哲学概念在这里也同样适用。

根据阿尔贝·加缪(带有文体谓词:),一幅达芬奇风格的油画,西西弗斯是一个快乐的人

带来了一系列快乐的男人:

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

在这里,DALL E 知道 Sysiphus,知道他卷起石头的折磨,知道希腊的内容(衣服、胡子、风景),然而它从加缪的荒谬理论中带来了一些快乐。

这张令人印象深刻。

弗兰茨·卡夫卡的梦

图片由 OpenAI 用 DALL E 创建//版权:OpenAI //由作者生成

一个打着深色雨伞的年轻女孩穿过马路,在充满阳光的草地间传播黑暗…

这幅 30 秒内完成的作品生动地融合了顽皮的恐怖、梦幻般的荒诞,以及人类灵魂的光明深渊,令人叹为观止。

一切都是在“弗兰克·卡夫卡的梦”这个提示下创造出来的。

创造性混乱

这是我拥抱人工智能创造力的一点,让它顺其自然,在没有人类偏见或纠正的情况下创造。

这些例子证明了机器的混乱虚构,有着超现实的智慧和令人困惑的语义冲突。

The writer thinks through the main plot of her book, an oil painting, in the style of Spitzweg

注意小而坚定的发音“她”——dalle 运用变形金刚网络的自我关注来创造女性作家的肖像。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

你可以用任何你喜欢的方式来解释这个创造性工作的过程——但是这里展示的对作品背后思想的深入探索是引人注目的。

AI Artists in disbelief, in the style of Spitzweg* 
  • )这是我的小黑客。卡尔·斯皮茨韦格以他的讽刺绘画而闻名——这给达尔 E 的人工智能艺术带来了更多的疯狂。事实是,达尔 E 不会以卡尔·斯皮茨韦格的风格直接创造图像;取而代之的是,它将把斯皮茨韦格式的讽刺运用到结果中。有趣的是,有了这个提示,我们同时得到了非常多样的风格。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

风格、紧张、情感和概念的多样性令人惊叹。

当 Artnet 在 Twitter 上发布了一份 2022 年 3 月售出的最贵艺术品清单时,我要求 DALL E 创作一个新的…

...most expensive artworks sold at auction around the world in March 2022

我得到的作品太多了。这不仅仅是我对 DALL E 的迷恋,下面的每张图片都以强烈的听觉效果冲击着我的心灵。

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

OpenAI 用 DALL E 创建的图像//版权:OpenAI //由作者生成

摘要

DALL E 已经证明了它无限的想象力——就像我们对 GPT 3 号所做的那样,我们只是触及了表面。

模型不只是模仿风格或模拟想法。它“理解”(以它自己的方式)概念,并且可以可视化从简单任务到象征性和隐喻性文本的几乎所有东西。

关注我的推特账号看看 DALL E 的新实验

梅兹达勒姆

你可以通过浏览器或 3D 耳机在我的虚拟 3D 画廊“merzDALLEum”中探索 DALL E 创作的艺术品。

链接到我的评论指南:https://medium.com/merzazine/merzdalleum-c8308ad66f12

画廊直接链接:https://spatial.io/s/merzDALLEum-625fed192ce7250001cc16ee?share=6035801166881251211

社会联系

https://twitter.com/Merzmensch/status/1519337266660970498

仪表板 101 —第 1 部分:仪表板布局介绍

原文:https://towardsdatascience.com/dash101-part-1-introduction-to-dash-layout-810ec449ad43

数据可视化

学习用 Python 创建漂亮的定制仪表板

在处理数据时,我们经常需要交流和总结数据,以直观的方式呈现给自己和他人。Dash 是一个开源库,用于构建强大而灵活的仪表板。在三篇系列文章中,我们将构建下面的示例仪表板,以学习使用 Dash 创建仪表板的基础知识。在本系列中,我们将关注以下三个方面:

  1. 仪表板布局:决定仪表板的结构(这个博客)
  2. 使用 CSS 的仪表板样式:自定义仪表板的外观
  3. Dash 回调:添加交互性以增强仪表板

示例仪表板|按作者分类的图像

在本系列结束时,您将能够开始为任何定制需求制作您的定制仪表板。

🏡家政

常见的做法是将 Dash 应用程序代码保存在一个名为app.py的模块中。我们将遵循这一惯例。以下是遵循本系列文章的三个简单步骤:

  1. 将代码保存在app.py
  2. 在您首选的 IDE 中运行该模块:python app.py
  3. 在您的浏览器中访问 http://127.0.0.1:8050/ 查看开发中的仪表板。

📦数据

我们将使用易于访问的 titanic 数据集作为我们的样本数据(该数据可通过 Seaborn 获得,并获得 BSD-3 许可)。让我们

  • 导入必要的库,并加载和格式化数据集
  • 划分数据并训练一个简单的机器学习管道来获得测试数据的预测概率
  • 为下拉菜单和滑块定义辅助函数

我们将使用test数据作为仪表板的底层数据。

📝布局

让我们了解一下我们的示例仪表板的布局是如何构建的。布局中使用了三种组件:

  • Html 组件 : from dash import html
  • 仪表板核心部件 : from dash import dcc
  • Daq 组件 : import dash_daq as daq

我们现在将慢慢分解布局组件。在最外层,仪表板分为左窗格和右窗格:

作者图片

app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div(),
    html.Div()
])if __name__ == '__main__':
    app.run_server(debug=True)

我们使用html.Div()来创建部分。如果我们运行这段代码,仪表板将是一个空白页,因为我们还没有提供任何内容。

现在,让我们更仔细地看看左侧窗格的组件。

左侧图像显示为补充,因为右侧图像中的注释阻挡了作者的内容|图像

app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1(),
        html.P(),
        html.Img(),
        html.Label(), 
        dcc.Dropdown(),
        html.Br(),
        html.Label(), 
        dcc.Dropdown(),
        html.Button()
    ]),
    html.Div()
])if __name__ == '__main__':
    app.run_server(debug=True)

现在,让我们看看右侧窗格:

作者图片

app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1(),
        html.P(),
        html.Img(),
        html.Label(), 
        dcc.Dropdown(),
        html.Label(), 
        dcc.Dropdown(),
        html.Button()
    ]),
    html.Div([
        html.Div([
            dcc.Graph(),
            dcc.Graph()
        ]),
        html.Div([
            dcc.Graph(),
            html.Div([
                html.Label(), 
                daq.BooleanSwitch(),
                html.Label(),
                daq.BooleanSwitch(),
                html.Label(), 
                dcc.Slider(),
            ]),
        ])
    ])
])if __name__ == '__main__':
    app.run_server(debug=True)

太棒了,我们已经完成了布局的所有组件的定义。然而,代码还不完整。我们现在将定义每个组件的参数:

# Graphs
histogram = px.histogram(test, x='Probability', color=TARGET, 
                         marginal="box", nbins=30)
barplot = px.bar(test.groupby('Binned probability', 
                              as_index=False)['Target'].mean(), 
                 x='Binned probability', y='Target')
columns = ['Age', 'Gender', 'Class', 'Embark town', TARGET, 
           'Probability']
table = go.Figure(data=[go.Table(
    header=dict(values=columns),
    cells=dict(values=[test[c] for c in columns])
)])# ********************* Dash app *********************
app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1("Titanic predictions"),
        html.P("Summary of predicted probabilities for Titanic test dataset."),
        html.Img(src="assets/left_pane.png"),
        html.Label("Passenger class"), 
        dcc.Dropdown(multi=True,
                     options=create_dropdown_options(
                         test['Class']
                     ),
                     value=create_dropdown_value(
                         test['Class']
                     )),
        html.Label("Gender", className='dropdown-labels'), 
        dcc.Dropdown(multi=True,
                     options=create_dropdown_options(
                         test['Gender']
                     ),
                     value=create_dropdown_value(
                         test['Gender']
                     )),
        html.Button("Update"),
        ]),
    html.Div([
        html.Div([
            dcc.Graph(figure=histogram),
            dcc.Graph(figure=barplot)
        ]),
        html.Div([
            dcc.Graph(figure=table),
            html.Div([
                html.Label("Survival status"), 
                daq.BooleanSwitch(on=True),
                html.Label("Sort probability in an ascending order"),
                daq.BooleanSwitch(on=True),
                html.Label("Number of records"), 
                dcc.Slider(min=5, max=20, step=1, value=10, 
                           marks=create_slider_marks([5, 10, 
                                                      15, 20])),
            ]),
        ])
    ])
])if __name__ == '__main__':
    app.run_server(debug=True)

让我们更仔细地看看每个组件:
◼️ [html.H1()](https://dash.plotly.com/dash-html-components/h1):传递了一个头字符串。
◼️ [html.P()](https://dash.plotly.com/dash-html-components/p):传递了一个段落字符串。
◼️ [html.Img()](https://dash.plotly.com/dash-html-components/img):在与 app 相同的目录下创建了 assets 文件夹,并将[left_pane.png](https://github.com/zluvsand/dash_dashboard/blob/main/titanic_dashboard/assets/left_pane.png)保存在 assets 文件夹中,传递了图片的路径。

titanic_dashboard
│   app.py
└───assets
│   │   left_pane.png

◼️ [html.Label()](https://dash.plotly.com/dash-html-components/label):传递了一个标签字符串。
◼️ [dcc.Dropdown()](https://dash.plotly.com/dash-core-components/dropdown):选择multi=True可以多选。使用自定义函数以编程方式准备optionsvalue
◼️ [html.Button()](https://dash.plotly.com/dash-html-components/button):按钮串被传递。
◼️ [dcc.Graph()](https://dash.plotly.com/dash-core-components/graph):提供了交互绘图。
◼️ [daq.BooleanSwitch()](https://dash.plotly.com/dash-daq/booleanswitch):设置on=True使开关从 on 开始关闭。
◼️ [dcc.Slider()](https://dash.plotly.com/dash-core-components/slider):使用minmaxstep(从minmax的数字序列,增量为step)为滑块创建可能的值范围。滑块上的起始值由value参数决定。沿着间隔的点由marks定义。

id和/或className用于组件允许我们在设计样式和构建交互性时引用单个或一组组件。现在我们将给出主要部件id和/或className:

该应用程序目前如下所示:

仅部分输出|作者图片

虽然这个无样式的静态仪表板有必要的组件,但我们仍然需要做更多的工作来实现它的最终外观。向仪表板添加交互性将使其更加有用。我们将在接下来的两篇系列文章中学习如何做到这些:
DASH101 —第 2 部分:用 CSS 和 Python 美化 DASH dashboard dash 101—第 3 部分:添加与 dash 回调 的交互性】

使用 Dash 时,了解一些 HTML 和 CSS 会非常有用。如果你想学习 HTML 和 CSS 的基础知识,请查看由 Udacity 提供的这个简短的免费课程。

Pierre chtel-Innocenti 在 Unsplash 上的照片

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。**

谢谢你看我的帖子。如果你感兴趣,这里有我的一些帖子的链接:
◼️️ 用这些技巧丰富你的 GitHub 个人资料
◼️️ 用这些技巧丰富你的 Jupyter 笔记本
◼️ 用这些技巧组织你的 Jupyter 笔记本
◼️ 用 Python 实现简单的数据可视化,你会发现有用的
◼️ 6 个简单的技巧,让你在 Seaborn (Python)中有更漂亮和定制的情节

再见🏃💨

DASH101 —第 2 部分:用 CSS 和 Python 美化 DASH 仪表板

原文:https://towardsdatascience.com/dash101-part-2-prettify-dash-dashboard-with-css-and-python-3866c069a3b6

数据可视化

学习用 Python 设计漂亮的仪表盘

级联样式表,通常称为 CSS,用于格式化和样式化网页。Dash 应用程序完全可以用 CSS 定制,因为 dashboard 是一个 web 应用程序。在这篇文章中,我们将学习熟悉 CSS 的基本知识,以及如何使用它来设计 Dash dashboard。此外,我们将简要地看一下用 Python 定制 Plotly 图形。

照片由丹-克里斯蒂安·pădureț在 Unsplash 拍摄

在上一篇中,我们完成了布局的结构。在这篇文章中,我们将继续上一篇文章的内容,并设计出最终的布局。

📌请注意,本文中显示的代码不是独立的。参考前一篇文章的代码片段是这篇文章的先决条件。为了避免重复,这些片段被省略了。

🔤造型基础

现在让我们学习造型的基础知识。我们将从布局中选取更新按钮作为示例,并将其样式化为如下所示:

如果我们将样式表(即.css文件)保存在与app.py相同目录下的一个名为assets的文件夹中,Dash (v0.22 及以上版本)会自动获取它们。我们将把 CSS 代码保存在一个名为style.css的样式表中,这是样式表的一个常见命名约定。该目录将如下所示:

titanic_dashboard
│   app.py
└───assets
│   │   left_pane.png
│   │   style.css

现在,简单介绍一下 CSS。下面是 CSS 语法的基本结构:

selector {
  property: value;
  property: value;
}

选择器决定选择哪个组件进行样式设计。我们将使用三种类型的选择器:
◼ ️ 类型选择器由 HTML 标签的名称给出,例如[button](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button)。它适用于该类型的所有 HTML 组件。如果我们希望所有按钮的样式一致,使用类型选择器会很有帮助。
类选择器由以.为前缀的类的名称给出,例如.dropdown。在 Dash 中,您可以使用名为className的参数为任何组件指定类名。这允许我们有选择地将特定的组件组合在一起,以便我们可以一起设计它们的样式。
Id 选择器由 Id 名称加上前缀#给出,例如#update-button。使用 Dash 时,可以使用id参数指定组件的 id 名称。与className不同,id在整个应用程序的所有组件中必须是唯一的。

{}中的语法称为声明块,它定义了我们想要的样式。如果你想学习更多关于 CSS 的知识,这个和这个对初学者来说是很棒的额外资源。

让我们把我们刚刚学到的东西付诸实践,并设计按钮。通过在style.css中包含下面的代码,button 将得到它的 after look。

button {
  width: 240px;
  height: 40px;
  cursor: pointer;
  border: 0px;
  border-radius: 5px;
  background-color: black;
  color: white;
  text-transform: uppercase;
  font-size: 15px
}

这里,我们使用了类型选择器。让我们来分解一下代码:
widthheight调整按钮的大小
cursor: pointer;当光标悬停在
上时将光标变为指针◼ border: 0px;移除边框线
border-radius: 5px;圆角
background-colorcolor改变背景和文本颜色
text-transform将文本转换为大写
font-size增加文本的字体大小

由于按钮有id,如果我们想:

#update-button {
  width: 240px;
  height: 40px;
  cursor: pointer;
  border: 0px;
  border-radius: 5px;
  background-color: black;
  color: white;
  text-transform: uppercase;
  font-size: 15px
}

除了使用单独的样式表,CSS 样式也可以通过 Python 脚本中的style属性进行内联。当在 Python 中以内联方式指定 CSS 语法时,每个属性和值都需要用引号括起来,并在字典中提供。下面是我们的代码如何适应这种格式:

html.Button(id='update-button', children="Update", 
            style={'width': '240px', 'height': '40px', 
                   'cursor': 'pointer', 'border': '0px', 
                   'border-radius': '5px', 'background-color': 
                   'black', 'color': 'white', 'text-transform': 
                   'uppercase', 'font-size': '15px'})

将字典键转换为 camel case 也是可行的:

html.Button(id='update-button', children="Update", 
            style={'width': '240px', 'height': '40px', 
                   'cursor': 'pointer', 'border': '0px', 
                   'borderRadius': '5px', 'backgroundColor': 
                   'black', 'color': 'white', 'textTransform': 
                   'uppercase', 'fontSize': '15px'})

我们不会在这篇文章中使用这种格式,但是如果你愿意,你知道如何使用这种格式。

🎨用 CSS 设计仪表板样式

学习了基础知识后,我们现在要给我们的布局改头换面。让我们从调整区域大小和设置背景颜色开始。我们将从style.css中删除之前的练习语法,并添加以下内容:

body {
  background-color:#FFF2CC;
  margin: 0;
  padding: 0;
}
img {
  width: 320px;
  margin-bottom: 30px;
}
#container {
  width: 100%; 
  overflow: hidden;
}
#left-container {
  height: 937px;
  width: 320px;
  background-color:#3BA27A;  
  float: left;
  margin: 0;
}
#right-container {
  margin-left: 340px;
}
#visualisation {
  margin-top: 30px;
  width: 100%; 
  overflow: hidden;
  height: 430px;
}
#histogram {
  width: 700px; 
  height: 430px;
  margin-left: 35px;
  float: left; 
}
#barplot {
  width: 700px; 
  height: 430px;
  margin-left: 800px;
  margin-right: 20px;
}
#data-extract {
  margin-top: 30px;
  width: 100%; 
  overflow: hidden;
  height: 400px;
}
#table {
  height: 420px;
  width: 800px; 
  float: left;
  margin-left: 35px;
  margin-top: 15px;
}
#table-side {
  width: 400px;
  margin-left: 900px;
  margin-top: 60px;
  background-color: white;
  border-radius: 10px;
  padding: 20px;
}

哇,太久了!但是如果我们仔细观察,我们只使用了少数属性。◼ background-color:改变背景颜色。我们可以使用颜色名称(如black)、RGB 颜色(如rgb(0,0,0))或十六进制颜色(#000#000000)。这个是生成调色板的绝佳工具。
margin及其变化,padding:改变截面间距。本帖解释了marginpadding的区别。
height & width:调整小节大小。
overflow:决定一个元素被溢出时如何处理。
float:决定如何定位截面。◼把边缘弄圆。

大多数属性名称可能是不言自明的,但如果不是,或者只是想了解更多,可以在 MDN Web Docs 上查找。例如,如果你查找[overflow](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow)作为例子,你可以看到不同的overflow行为,比如visiblehidden如何处理样本文本上的溢出元素。或者,你可以尝试在谷歌中搜索“CSS <属性名>”。

当您在样式表中进行更改并保存它们时,Dash 会自动刷新您的 web 应用程序。这叫热重装。理解 CSS 代码的一个好方法是观察添加或删除(注释掉)CSS 代码的小部分如何影响应用程序的外观。

你已经学习了一些不同的方法来理解 CSS 代码片段做什么,为了保持这篇文章的简洁,我们将不会详细讨论 CSS 语法的其余部分。

现在让我们格式化文本。我们将从上面开始向车身类型选择器(即body {})添加以下内容:

font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;

此外,我们将把这些额外的 CSS 语法添加到style.css:

h1 {
  margin-top: 50px;
  text-transform: uppercase;
  font-size: 40px;
  color: white;
  text-align: center;
}
p {
  margin-left: 20px;
  color: white;
}
.dropdown-labels {
  margin-left: 20px;
  color: white;
  font-weight: bold;
}
.other-labels {
  margin-left: 20px;
  color: #FFBD59;
  font-weight: bold;
}

是时候设计按钮了。这一次我们将全面展示它的风格:

#update-button {
  width: 240px;
  height: 40px;
  border-radius: 5px;
  margin-left: 38px;
  margin-top: 30px;
  border: 0px;
  cursor: pointer;
  background-color: black;
  color: white;
  font-weight: bold;
  font-family: inherit;
  text-transform: uppercase;
  font-size: 15px;
}
#update-button:hover {
  background-color: #FFBD59;
  color: white;
}

有两件事值得强调:
◼️首先是价值:[inherit](https://developer.mozilla.org/en-US/docs/Web/CSS/inherit)。当我们使用这个值时,我们让选择器从它的父元素继承属性值。◼ ️Another 是第二个选择者。看起来和我们目前看到的选择器略有不同:#update-button:hover。这些被称为伪类,只在指定的状态下设计选择器。在这个例子中,它只在鼠标悬停在按钮上时设置样式。

我们将设计下拉菜单,让它们看起来与整体色调更加协调:

.dropdown {
  margin-left: 20px;
  margin-right: 20px;
  margin-top: 5px;
}
.dropdown .Select-control{
  background-color: white;
}
.dropdown .Select-menu-outer{
  background-color: white;
}
.dropdown .Select-value{
  background-color: #3BA27A;
  color: white;
  font-size: 14px;  
}
.dropdown .VirtualizedSelectFocusedOption {
  background-color: #a5ecd1;
  color: black;
}
.dropdown .VirtualizedSelectOption  {
  font-size: 14px;
}

在这里,我们看到选择器后面跟着另一个选择器。这是为了样式化元素的某些部分。如果您想知道如何首先找到这些选择器值,答案是搜索。如果你搜索下拉样式资源,你会找到有用的资源,比如这个堆栈溢出答案和这个 Plotly 社区帖子。

现在,我们将格式化切换:

.toggle {
  margin-top: 8px;
}

app.py中使用颜色参数更容易改变切换的颜色。我们将不得不对另一个开关重复这一过程。

daq.BooleanSwitch(id='target_toggle', className='toggle', on=True,
                  color="#FFBD59")

最后,让我们来设计滑块的样式:

#n-slider {
  margin-top: 8px;
}
#n-slider .rc-slider-handle  {
  background-color: #FFBD59;
  border: 0px;
}
#n-slider .rc-slider-track {
  background-color: #E6E6E6;
}
#n-slider .rc-slider-dot-active {  
  border-color: #E6E6E6;
}

我们在这篇文章中所做的设计仅仅触及了 CSS 的皮毛,但是希望它能帮助你建立基本的直觉,让你知道如何使用它来定制和美化你的仪表盘。

下面是我们最终的定制样式表内容:

📊绘制图形的样式

现在,我们将致力于定制 Plotly 图形的外观。用 Python 比用 CSS 更容易设计 Plotly 图形的样式。我们将从直方图开始,改变不透明度,并在app.py中应用调色板:

histogram = px.histogram(test, x='Probability', color=TARGET, 
                         marginal="box", nbins=30, opacity=0.6, 
                         color_discrete_sequence=['#FFBD59', 
                                                  '#3BA27A'])

接下来,我们将添加标题,更改字体和背景颜色:

histogram.update_layout(title_text=f'Distribution of probabilities by class (n={len(test)})', font_family='Tahoma', plot_bgcolor='rgba(255,242,204,100)')

我们还将更新 y 轴的标签:

histogram.update_yaxes(title_text="Count")

同样,让我们美化柱状图:

barplot = px.bar(test.groupby('Binned probability', as_index=False)['Target'].mean(), x='Binned probability', y='Target', color_discrete_sequence=['#3BA27A'])barplot.update_layout(title_text=f'Survival rate by binned probabilities (n={len(test)})', font_family='Tahoma', xaxis = {'categoryarray': labels}, plot_bgcolor='rgba(255,242,204,100)')barplot.update_yaxes(title_text="Percentage survived")

最后,让我们修饰一下桌子:

table = go.Figure(data=[go.Table(
    header=dict(values=columns, fill_color='#FFBD59', 
                line_color='white', align='center',
                font=dict(color='white', size=13)),
    cells=dict(values=[test[c] for c in columns], 
               format=["d", "", "", "", "", ".2%"],
               fill_color=[['white', '#FFF2CC']*(len(test)-1)], 
               align='center'))
])
table.update_layout(title_text=f'Sample records (n={len(test)})', 
                    font_family='Tahoma')

我们使用 d3 格式格式化带有格式参数的列。我们用fill_color添加了交替的行颜色。

这是帖子修改后的最终布局:

当查找定制 Plotly 图形外观的不同方法时,您可能会发现 Python 图形参考很有帮助。

希望这篇文章向你展示了 CSS 的威力,以及它在设计 dashboard 时的高度灵活性。完成了仪表板的前端,现在是时候学习添加交互性来为我们的仪表板增压了:◼DASH 101—第三部分:添加与 dash 回调的交互性

使用 Dash 时,了解一些 HTML 和 CSS 会非常有用。如果你想学习 HTML 和 CSS 的基础知识,请查看由 Udacity 提供的这个简短的免费课程。

佛罗里达州本土民间艺术家朗达克在 Unsplash 上拍摄的照片

您想要访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果你使用 我的推荐链接成为会员,你的一部分会费会直接去支持我。**

谢谢你看我的帖子。如果你感兴趣,这里有我的一些帖子的链接:
◼️️ 用这些技巧丰富你的 GitHub 个人资料
◼️️ 用这些技巧丰富你的 Jupyter 笔记本
◼️ 用这些技巧组织你的 Jupyter 笔记本
◼️ 用 Python 实现简单的数据可视化,你会发现有用的
◼️ 6 个简单的技巧,让你在 Seaborn (Python)中有更漂亮和定制的情节

再见🏃💨

DASH101 —第 3 部分:通过 DASH 回调增加交互性

原文:https://towardsdatascience.com/dash101-part-3-add-interactivity-with-dash-callback-420f564ad622

数据可视化

学习在 Python 中嵌入仪表板的交互性

向 dashboard 添加交互性增强了它的可用性,并帮助用户轻松地更深入地探索和分析数据。在这篇文章中,我们将学习 Dash 回调的基础知识,并为我们之前构建的示例仪表板添加交互性。

照片由莎伦·皮特韦在 Unsplash 上拍摄

我们将从上一篇文章中停止的地方继续。如果你想赶上我们在系列中学到的东西,这里有链接:
DASH101 —第 1 部分:DASH 布局介绍dash 101—第 2 部分:用 CSS 和 Python 美化 dash dash 仪表板

📌请注意,本文中显示的代码不是独立的。参考前一篇文章的代码片段是这篇文章的先决条件。为了避免重复,这些片段被省略了。

🔧回拨基础

在 Dash 中,我们使用@app.callback decorator 来增加仪表板的交互性。语法结构如下所示:

app = dash.Dash(__name__)
app.layout = ...[@app](http://twitter.com/app).callback(Output(...), [Input(...), Input(...)])
def update_output(input1, input2):
    ...
    return output1if __name__ == '__main__':
    app.run_server(debug=True)

在这个例子中,我们有两个输入和一个输出。装饰器中的输入数量应该与函数的参数数量相同。输出的数量应该与函数返回的输出数量相同。当任何输入发生变化时,Dash 会自动更新输出。

目前,我们的仪表板中的下拉菜单、按钮、滑块和开关仅仅是装饰,因为它们没有功能。在下一节中,我们将使用@app.callback装饰器为这些仪表板元素添加交互性。

🔨向仪表板添加交互性

让我们将图表设置为每次下拉列表值改变时更新:

# ********************* Dash app *********************
app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1("Titanic predictions"),
        html.P("Summary of predicted probabilities for Titanic test dataset."),
        html.Img(src="assets/left_pane.png"),
        html.Label("Passenger class", className='dropdown-labels'), 
        dcc.Dropdown(
            id='class-dropdown', className='dropdown', multi=True,
            options=create_dropdown_options(test['Class']),
            value=create_dropdown_value(test['Class'])),
        html.Label("Gender", className='dropdown-labels'), 
        dcc.Dropdown(
            id='gender-dropdown', className='dropdown', multi=True,
            options=create_dropdown_options(test['Gender']),
            value=create_dropdown_value(test['Gender'])),
        html.Button(id='update-button', children="Update")
        ], id='left-container'),
    html.Div([
        html.Div([
            dcc.Graph(id="histogram"),
            dcc.Graph(id="barplot")
        ], id='visualisation'),
        html.Div([
            dcc.Graph(id='table'),
            html.Div([
                html.Label("Survival status", 
                           className='other-labels'), 
                daq.BooleanSwitch(id='target_toggle', 
                                  className='toggle', 
                                  on=True, color="#FFBD59"),
                html.Label("Sort probability in ascending order", 
                           className='other-labels'),
                daq.BooleanSwitch(id='sort_toggle', 
                                  className='toggle', 
                                  on=True, color="#FFBD59"),
                html.Label("Number of records", 
                           className='other-labels'), 
                dcc.Slider(id='n-slider', min=5, max=20, 
                           step=1, value=10, 
                           marks=create_slider_marks([5, 10, 
                                                      15, 20])),
            ], id='table-side'),
        ], id='data-extract')
    ], id='right-container')
], id='container')
[@app](http://twitter.com/app).callback(
    [Output(component_id='histogram', 
            component_property='figure'),
     Output(component_id='barplot', 
            component_property='figure'),
     Output(component_id='table', 
            component_property='figure')],
    [Input(component_id='class-dropdown', 
           component_property='value'),
     Input(component_id='gender-dropdown', 
           component_property='value')]
)
def update_output(class_value, gender_value):
    # Update data to dropdown values without overwriting test
    dff = test.copy()
    dff = dff[dff['Class'].isin(class_value)]
    dff = dff[dff['Gender'].isin(gender_value)]
    # Visual 1: Histogram
    histogram = px.histogram(
        dff, x='Probability', color=TARGET, marginal="box", 
        nbins=30, opacity=0.6,  
        color_discrete_sequence=['#FFBD59', '#3BA27A']
    )
    histogram.update_layout(
        title_text=f'Distribution of probabilities by class (n={len(dff)})',
        font_family='Tahoma', plot_bgcolor='rgba(255,242,204,100)'
    )
    histogram.update_yaxes(title_text="Count")
    # Visual 2: Barplot
    barplot = px.bar(
        dff.groupby('Binned probability', as_index=False)['Target'].mean(), 
        x='Binned probability', y='Target', 
        color_discrete_sequence=['#3BA27A']
    )
    barplot.update_layout(
        title_text=f'Survival rate by binned probabilities (n={len(dff)})', 
        font_family='Tahoma', xaxis = {'categoryarray': labels}, 
        plot_bgcolor='rgba(255,242,204,100)'
    )
    barplot.update_yaxes(title_text="Percentage survived")
    # Visual 3: Table
    columns = ['Age', 'Gender', 'Class', 'Embark town', TARGET, 'Probability']
    table = go.Figure(data=[go.Table(
        header=dict(values=columns, fill_color='#FFBD59', 
                    line_color='white', align='center',
                    font=dict(color='white', size=13)),
        cells=dict(values=[dff[c] for c in columns], 
                   format=["d", "", "", "", "", ".2%"],
                   fill_color=[['white', '#FFF2CC']*(len(dff)-1)], 
                   align='center'))
    ])
    table.update_layout(title_text=f'Sample records (n={len(dff)})', 
    font_family='Tahoma')

    return histogram, barplot, table

if __name__ == '__main__':
    app.run_server(debug=True)

这里,我们定义了 2 个输入:下拉菜单和 3 个输出:图形。使用@app.callback装饰器和update_output()函数,每次下拉列表值改变时,图形都会更新。当在函数中使用选中的下拉值过滤数据时,我们确保没有覆盖原始数据test

下拉列表值的变化现在会触发仪表板的更新。但是,如果我们不希望在选择下拉列表值时更新图表,而只希望在按下按钮时更新图表,那该怎么办呢?让我们调整我们的仪表板,使其以这种方式运行。对于这种行为,State将会派上用场。

# ********************* Dash app *********************
app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1("Titanic predictions"),
        html.P("Summary of predicted probabilities for Titanic test dataset."),
        html.Img(src="assets/left_pane.png"),
        html.Label("Passenger class", className='dropdown-labels'), 
        dcc.Dropdown(
            id='class-dropdown', className='dropdown', multi=True,
            options=create_dropdown_options(test['Class']),
            value=create_dropdown_value(test['Class'])),
        html.Label("Gender", className='dropdown-labels'), 
        dcc.Dropdown(
            id='gender-dropdown', className='dropdown', multi=True,
            options=create_dropdown_options(test['Gender']),
            value=create_dropdown_value(test['Gender'])),
        html.Button(id='update-button', children="Update", n_clicks=0)
        ], id='left-container'),
    html.Div([
        html.Div([
            dcc.Graph(id="histogram"),
            dcc.Graph(id="barplot")
        ], id='visualisation'),
        html.Div([
            dcc.Graph(id='table'),
            html.Div([
                html.Label("Survival status", 
                           className='other-labels'), 
                daq.BooleanSwitch(id='target_toggle', 
                                  className='toggle', 
                                  on=True, color="#FFBD59"),
                html.Label("Sort probability in ascending order", 
                           className='other-labels'),
                daq.BooleanSwitch(id='sort_toggle', 
                                  className='toggle', 
                                  on=True, color="#FFBD59"),
                html.Label("Number of records", 
                           className='other-labels'), 
                dcc.Slider(id='n-slider', min=5, max=20, 
                           step=1, value=10, 
                           marks=create_slider_marks([5, 10, 
                                                      15, 20])),
            ], id='table-side'),
        ], id='data-extract')
    ], id='right-container')
], id='container')[@app](http://twitter.com/app).callback(
    [Output(component_id='histogram', 
            component_property='figure'),
     Output(component_id='barplot', 
            component_property='figure'),
     Output(component_id='table', 
            component_property='figure')],
    [State(component_id='class-dropdown', 
           component_property='value'),
     State(component_id='gender-dropdown', 
           component_property='value'),
     Input(component_id='update-button', 
           component_property='n_clicks')])
def update_output(class_value, gender_value, n_clicks):
    # Update data to dropdown values without overwriting test
    dff = test.copy()if n_clicks>0:
        if len(class_value)>0:
            dff = dff[dff['Class'].isin(class_value)]
        elif len(class_value)==0:
            raise dash.exceptions.PreventUpdate

        if len(gender_value)>0:
            dff = dff[dff['Gender'].isin(gender_value)]
        elif len(gender_value)==0:
            raise dash.exceptions.PreventUpdate# Visual 1: Histogram
    histogram = px.histogram(
        dff, x='Probability', color=TARGET, marginal="box", 
        nbins=30, opacity=0.6,  
        color_discrete_sequence=['#FFBD59', '#3BA27A']
    )
    histogram.update_layout(
        title_text=f'Distribution of probabilities by class (n={len(dff)})',
        font_family='Tahoma', plot_bgcolor='rgba(255,242,204,100)'
    )
    histogram.update_yaxes(title_text="Count")# Visual 2: Barplot
    barplot = px.bar(
        dff.groupby('Binned probability', as_index=False)['Target'].mean(), 
        x='Binned probability', y='Target', 
        color_discrete_sequence=['#3BA27A']
    )
    barplot.update_layout(
        title_text=f'Survival rate by binned probabilities (n={len(dff)})', 
        font_family='Tahoma', xaxis = {'categoryarray': labels}, 
        plot_bgcolor='rgba(255,242,204,100)'
    )
    barplot.update_yaxes(title_text="Percentage survived")# Visual 3: Table
    columns = ['Age', 'Gender', 'Class', 'Embark town', TARGET, 'Probability']
    table = go.Figure(data=[go.Table(
        header=dict(values=columns, fill_color='#FFBD59', 
                    line_color='white', align='center',
                    font=dict(color='white', size=13)),
        cells=dict(values=[dff[c] for c in columns], 
                   format=["d", "", "", "", "", ".2%"],
                   fill_color=[['white', '#FFF2CC']*(len(dff)-1)], 
                   align='center'))
    ])
    table.update_layout(title_text=f'Sample records (n={len(dff)})', 
    font_family='Tahoma')

    return histogram, barplot, tableif __name__ == '__main__':
    app.run_server(debug=True)

State保存下拉列表中的信息,但不会触发更新。所以现在当我们改变下拉列表值时,图形保持不变。只有当我们单击“更新”按钮时,图表才会更新为下拉列表中的选定值。此外,我们还以另一种方式改变了下拉列表的行为:当两个下拉列表中没有选择任何值时,我们禁止使用dash.exceptions.PreventUpdate进行更新。

每点击一次按钮,n_clicks递增。这意味着单击按钮会触发图形的刷新。在布局中,我们还将n_clicks初始化为 0,这样 if 条件:if n_clicks>0就不会出错。

最后,让我们为表格的切换和滑块添加交互性:

瞧啊。我们已经完成了向仪表板添加交互性。完整仪表板的代码也可以在这里找到。希望这一系列的三篇文章已经让你尝到了 Dash 的滋味,并激发了你创建自己的仪表板来巩固你的学习的兴趣。

罗纳德·库扬在 Unsplash 上的照片

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。

谢谢你看我的帖子。如果你感兴趣,这里有我的一些帖子的链接:
◼️️ 用这些技巧丰富你的 GitHub 个人资料
◼️️ 用这些技巧丰富你的 Jupyter 笔记本
◼️ 用这些技巧组织你的 Jupyter 笔记本
◼️ 用 Python 实现简单的数据可视化,你会发现有用的
◼️ 6 个简单的技巧,让你在 Seaborn (Python)中有更漂亮和定制的情节

再见🏃💨

动态构建数据科学项目原型的快速方法

原文:https://towardsdatascience.com/dashboard-from-jupyter-notebook-65d594948d24

将您的 Jupyter 笔记本电脑转变为交互式仪表盘

通过将 Jupyter 笔记本电脑转换为交互式仪表盘,快速创建数据科学项目的原型。来自 Pexels 的 Rodolfo Clix 的照片

当您拥有一个精益技术堆栈时,您的数据科学项目将会进展顺利。

是的,栈越小,项目越好!

Jupyter 笔记本与数据科学家的日常工作密不可分。此外,大多数数据科学项目也需要一个交互式仪表板。

如果您可以将笔记本电脑转换成功能丰富的仪表盘,会怎么样💡。

你可以,现在!

通常,开发仪表板需要 HTML、JavaScript 和 CSS 知识。但是像 Streamlit 和 Dash 这样的工具已经使得在没有它们的情况下创建仪表板成为可能。

然而,您仍然需要手动将笔记本电脑转换为功能性应用程序。这涉及到大量的复制和粘贴。

但是有了水星,你可以立即把你的 Jupyter 笔记本变成一个交互式仪表盘,一个在线幻灯片,或者一个网络服务。您可以从 PyPI 包存储库中安装这个库。

pip install mljar-mercury

如何将笔记本转换成功能性仪表盘?

它只需要一个 YAML 配置!

是的,在笔记本的顶部,您需要定义一个具有 YAML 配置的原始单元格。您将拥有所有的仪表板属性、小部件和行为。

小部件名称将自动映射到您笔记本中的变量。然而,您应该在全局级别定义变量。

有道理,对吧?一个笔记本变成一个仪表盘。它的全局变量是我们需要与之交互的变量。所以为它们定义小部件。

这里有一个例子。

一个用 Jupyter 笔记本创建交互式仪表板的 hello world 示例。—作者图片。

这个笔记本有一个小部件——一个输入你名字的输入框。然后我们的仪表板会跟你打招呼。

请注意,YAML 的 param 部分下的小部件名称与我们的变量名相匹配。

让我们运行这个例子。要启动仪表板服务器,请在终端中执行以下命令。

mercury run dashboard.ipynb # if dashboard.ipynb is your notebook

这个命令将启动一个 Django 服务器和一个 celery 进程。如果是第一次,Mercury 还将运行数据库迁移。但是你现在不用担心他们了。

一个 hello world 将 Jupyter 笔记本转换成交互式仪表板的例子。—作者图片。

答对了。您已经创建了一个仪表板!没有 HTML!没有 JavaScript!没有 CSS!

使用更酷的部件和主题!

在前一个例子中,我们使用了一个小部件。然而,Mercury 有十几个很酷的功能,比如滑块、下拉菜单、复选框等等。

每个都有稍微不同的配置。例如,下面的代码将显示一个范围滑块。

params:
    range_variable:
        input: range
        label: Select the minimum and maximum 
        value: [45,50] 
        min: 30
        max: 65

注意,我们已经通过 value 属性给出了初始值。

这将呈现一个范围滑块如下。

Mercury 中的范围选择器滑块示例—由作者截屏。

查看小部件文档以获得完整的列表及其配置。

此外,如果你正在制作一个在线幻灯片,你可以选择一个主题。要制作演示文稿,您必须将输出类型指定为幻灯片和您偏好的主题。这里有一个例子。

output: slides
format:
    theme: moon

你可以从 11 个可用的主题中选择一个。

安全地与他人共享您的仪表板

这是我所知道的创建仪表板的最直接的方法。这也是让你的想法原型化的最快方法。

而且,这是一个典型的 Django 应用程序。因此,你可以像托管任何其他 web 应用程序一样,在代理服务器 (Nginx 或 Apache)后托管它。

此外,如果您使用开放的主机和端口号启动服务器,如下所示,您可以让本地网络中的其他人实时访问它。

mercury run dashboard.ipynb 0.0.0.0:8000

您网络中的人可以使用http://<Your local IP>:8000/访问它。

与他人共享应用程序时,一个常见的问题是安全性。您可能不希望每个人都看到仪表板。

Mercury 使用了 Django 的认证系统。您可以从管理面板创建用户帐户。

默认情况下,我们创建的所有仪表板都是公共的。通过在 YAML 文件中指定 share: private,您可以将它们设为私有。这将使仪表板可供登录用户使用。

不过,认证是 pro 的特色。因此,除非你有商业许可证,否则分享你的仪表板要小心。

创建交互式机器学习仪表板

如果你能控制一个笔记本的全局变量,你就能处理它里面的任何东西。

如果你在用笔记本建立机器学习模型(谁不是呢?😏)使用这个交互式仪表板,您可以做更多的事情。

您可以调整超参数,在数据集之间交替,等等。

为了说明这一点,我们做了一个简单的 K-Means 聚类和交互式聚类数选择。我在以前的几篇文章中用过这个例子。我喜欢 K-means,因为它简单。

以下笔记本将创建一个仪表板来实时调整集群数量。

一个用 Jupyter 笔记本创建的交互式仪表盘,用于调整机器学习参数——由作者截屏。

您可以调整滑块来改变集群,并点击“运行”按钮进行重新渲染。

将离线报告共享为 pdf 和静态页面

在大多数情况下,您必须使用仪表板作为报告工具。你需要一个强大的导出功能。

Mercury 有一个免费的内置导出功能。您可以下载 pdf 或静态 HTML 文件格式的报告。只需调整小部件,运行报告,然后单击下载按钮。

下次您想要提交报告时,您可以使用此工具,而不是手动复制粘贴您的 matplotlib 图表。

最后的想法

这个我提过好几次了。

开发应用不是数据科学家的超能力。构建 ML 模型是。

但数据科学家的几乎所有工作都以一个应用程序或一个仪表板告终。此外,没有这样的工具,就不可能展示或说明伟大的工作。

在过去的几年中,出现了许多技术来弥合这一差距。如今,数据科学家几乎不需要 HTML、CSS 或 JavaScript 技能来构建生产就绪的应用程序。您可以使用 Streamlit 或 Dash 等工具在几分钟内构建一个应用程序。

然而,Mercury 使动态构建数据科学项目原型变得更加容易。在不离开笔记本环境的情况下构建一个可共享的应用程序确实是一个游戏改变者。

感谢阅读,朋友!在LinkedInTwitterMedium上跟我打招呼。

还不是中等会员?请使用此链接 成为会员 因为,不需要你额外付费,我为你引荐赚取一小笔佣金。

通过 iPhone 健康活动数据进行数据分析的最佳实践

原文:https://towardsdatascience.com/data-analysis-best-practices-through-iphone-health-activity-data-66a2c48449df

分析自己的数据可以让你成为一名优秀的数据分析师!

优素福·萨尔汗在 Unsplash 上的照片

你的手机就像一个大数据采集器。它收集了大量与你的身体活动相关的数据。将数据分析和数据科学技术应用于数据可以帮助理解和改善健康。

为了写这篇博客,我提取了存储在我的 iPhone 上的身体活动数据,并使用了一些基本的数据分析技术。我很惊讶地看到一个人可以获得强大的洞察力。通过标准的 iPhone 健康应用程序无法获得这样的见解。它还帮助我更好地了解自己,并获得更多体育活动的灵感!

因此,我总结了一些与数据分析相关的最佳实践。

先了解原始数据!

我先解释一下 iPhone 是如何存储身体活动数据的。我曾经研究过苹果的技术规范来理解数据格式。这有助于更好地理解我正在处理的事情。

如果你有一部 iPhone,你的每一个物理步骤都会产生一个数据记录。该数据记录具有指示步数标识符的类型。它有一个日期、活动的开始时间、结束时间和一个值,该值表示所走的步数。这些步骤可以对应于任何运动——行走或跑步。

iPhone 活动数据格式(作者图片)

分析完整的数据可以带来全新的视角

我买 iPhone 已经三年了,我想到了一个问题,这三年我一共走了多少步?所以我开始分析储存在我的 iPhone 健康应用程序中的数据。

此条形图显示了记录类型“步数”三年的总步数。

3 年内的总步数(图片由作者提供)

420 万步——这是这个分析向我展示的。太神奇了!我很惊讶看到这个分析,因为我是第一次看到这个,标准的 iPhone 健康应用程序没有给出这样的分析。

聚合让你丢失信息

你可以做的另一个有趣的分析是获得全年的观点。iPhone 给出了一个年度级别的分析,但它是按月汇总的。

iPhone 年度分析(图片由作者提供)

当你聚合时,你会丢失很多信息。这是 2022 年的年度分析,采用非汇总的方式。

2022 年分析(图片由作者提供)

在这个视图中,您可以看到一年中的实际日期和当天的总步数。我可以观察到有些日子(用黑色三角形标记),我没有做太多的活动。这不是太好,现在激励我做更多的身体活动。

当你汇总数据时,这种激励性的灵感就消失了。因此,这种非汇总的年度视图比标准的 iPhone 分析更具信息量和启发性。

将视觉分析与实际行动联系起来

让我们转到另一个动机分析热图分析,这是我的最爱之一。

活动热图(图片由作者提供)

这里你可以看到 Y 轴是工作日,X 轴是小时。较暗的红色表示高活性。你可以观察到,一般来说,8 小时和 14 小时左右是高活动时间。热图越红,你的身体活动水平越高。

这种分析可以通过试图使其更红来在视觉上激励进行更多的身体活动。

视觉—动作循环

这种“视觉-行动循环”就是数据分析的目的。数据分析不仅仅是制作漂亮的图片,而是将它们与行动联系起来,并看到漂亮的图片得到改善!

关注数据的形状

你也可以更详细地分析你的身体活动。此分析显示了我在 2022 年 6 月 9 日这一天采取的步骤数量。早上 10 点左右可以看到 2783 级台阶的高峰。这对应的是高强度的跑步锻炼。

峰值分析(图片由作者提供)

看到这样一个峰值及其价值是非常有用的,因为它给了你一个要达到的目标。所以我现在可以尝试在下一次高强度跑步锻炼中打破我自己的 2783 步记录。

结论

分析自己的数据可以让你成为一名优秀的数据分析师!原因很明显。您可以更好地连接到自己的数据,进行改进,并查看对数据的影响!

此外,我希望我已经被激励去分析你的健康数据,去进行额外的身体活动。感谢您的阅读!

额外资源

学习数据科学的无代码平台

您可以访问我的平台,以一种非常简单的方式学习数据科学,并在不编码的情况下应用本文中描述的一些技术。https://experiencedatascience.com

Youtube 频道上的数据科学演示

这是我的 YouTube 频道的链接,我在那里展示了关于数据科学、机器学习和人工智能的各种演示。https://www.youtube.com/c/DataScienceDemonstrated
T3

订阅,以便在我发布新故事时随时获得通知。

https://pranay-dave9.medium.com/subscribe

您也可以通过我的推荐链接加入 Medium

https://pranay-dave9.medium.com/membership

数据分析:使用 Python、Dash 和 Plotly 从数据到仪表板

原文:https://towardsdatascience.com/data-analysis-from-data-to-dashboard-with-python-dash-and-plotly-cee4367708ab

实践教程

数据分析:使用 Python、Dash 和 Plotly 从数据到仪表板

提升您的分析水平并提供更好结果的数据分析场景

看起来好像有人在这里做重要的事情——来自的福克斯的照片

介绍

早在 1998 年,我在一家成长中的初创公司工作,我的老板交给我一项任务,为我们的一些合作伙伴提供一套客户报告。作为一个几乎没有接受过正规培训的项目经理,这对我来说是全新的,并迫使我走上了努力做得更好的道路。几十年后,我仍然在努力完成它,并试图教我在这个过程中学到的东西。

如果你和我一样,如果你再看到一个涉及股票数据集的项目,你可能会尖叫。Gapminder 很好,但现在它已经过时了。再看到一个基于 Covid 数据构建的仪表板实际上并没有多大价值。

这就是这个项目和文章背后的驱动过程。但是,这还不是全部。

我经常在我的项目中使用经济数据。我之前的文章关注的是商品报告,但是我们也可以使用美国美联储的 FRED 系统提供的其他数据。如果你愿意的话,这里有一个前一篇文章的链接——不过我要说的是,前一篇文章的一些内容可能会影响到这篇文章:

对我来说,这个项目始于对现有代码的重构。我经常使用这些数据,但当我第一次接触这些数据时,我采用了一种非常简单且不直观的方法。我想把它做好,所以它缺少了很多我想要的功能。我决定从头再来,这也给了我一个受教育的机会。

这就是我们今天要创建的,使用 Dash 框架的 100% python:

我们的仪表板/分析项目——由我拍摄

不再赘述,让我们开始吧。

预期

如果你从上到下阅读这篇文章,下面是你可以从这篇文章中得到的信息:

  1. 学习使用 Dash / Plotly 框架,使用非标准数据集,完全用 python 构建专业质量数据分析仪表板。
  2. 获取数据。
  3. 了解数据及其带来的挑战。
  4. 用于以各种形式操作数据的方法。
  5. 构建仪表板框架以查看和分析数据。
  6. 使用 plotly 库开发几种不同的图表类型,以不同的方式可视化数据。

我知道有些人通过搜索找到这些文章,试图解决一个特定的问题。对你来说,你可以获得一些有用的见解和代码,可能会让你在特定的道路上走得更远。

总的来说,我花了大约 30 个小时来组装这个系统。大部分时间都花在了挖掘文档、参考资料和博客上,试图避开关键挑战。自始至终,我将说出其中的许多概念,因为有些概念没有很好地记录下来,或者不容易找到。

要求

要完成这篇文章,你需要几样简单易行的东西:

  • 可以运行 Python 的计算机(至少是版本 3.7,尽管我是用 python 3.9 开发的)
  • “requirements.txt”文件中列出的模块
  • 我的知识库中的代码:

https://github.com/brad-darksbian/fed_dashboard

使用 pull_fed_data.py 脚本更新数据的一个 Fed API 键是不错的,但不是特别需要。

过去,我写了一整篇关于获取这些数据的文章。如果感兴趣,请查看:

这是我撰写此类文章的风格,我以高度迭代和逻辑的格式编写代码,因此几乎任何技能水平都可以理解。我刻意避免任何微妙的结构或复杂的方法,以保持高度的可接近性。因此,一些代码可能会有点慢,并且会经历额外的步骤,所以有机会自己进行重构,以进行实践和技能开发。

数据讨论

任何分析项目的第一步都是了解和理解您将使用的数据。这没什么不同。事实上,这个数据特别具有挑战性,所以它确实需要对正在发生的事情有所了解。

示例数据文件位于名为 data/fed_data.csv 的存储库目录中:

fed_data.csv 示例

该数据的核心是字段 report_date、data、report_name、hash 和 release_date 的简单排列。但它们确实需要一些解释。

report_date 字段是特定报告的日期。它与 report_name 一起创建可被视为唯一标识符的内容。嗯,理论上是这样,但我很快就会谈到这一点。

数据字段相对来说是不言自明的。这是与报告日期相关联的报告名称的数字数据。

report_name 是 FRED 系统用来引用特定报告的代码。它晦涩难懂,除非你把它们都背下来,否则是不可读的。总共有超过 200,000 份报告,祝你好运。

哈希是从我的数据库输出的函数,为每个不同的数据记录提供唯一的键。在这种应用中它被忽略。

release_date 是数据变得棘手的地方。你看,在常规的基础上,美联储在月内的特定日期发布经济数据,但他们会不时地用更新的信息修订数据。release_date 告诉我们数据的更新。因此,真正的唯一键是 report_date、report_name 和 release_date,它们将具有不同的数据字段。

如果我们只关心最近的数据,我们的模式将会又窄又高,每一行都有不同的记录,覆盖多个报告。这与我们在实践中经常使用的其他分析数据集非常相似。然而,添加 release_date 给了我们一个不同的维度。这让这项练习变得更具挑战性,让我们能够更好地发挥数据分析能力。

第一步

我们知道我们需要读入数据,并可能进行一些格式化。我们还知道,我们将把它输出到一个仪表板上以供使用。我们来设置一下。

与我的商品仪表板(在简介中链接)非常相似,我从一个基本框架开始,该框架全部包含在存储库中:

  • main.py 这是仪表板的布局文件和驱动程序。稍后会详细介绍。
  • business_logic.py —这是由 main.py 调用的文件,它设置了一些全局数据框架和结构。
  • support_functions.py —这是处理和功能逻辑的主力。
  • layout _ configs.py 这是一个容器文件,用于组织图表的各种布局和可视元素。

对于这些初始步骤,我们将关注 support_functions.py 文件。

我们对数据的格式有一个基本的了解,所以我们的第一个任务是以一种我们可以很容易处理的方式把它输入到系统中。为此,我们将整个数据文件读入 Pandas 数据帧。

# Base retrieval function - reads from CSV
def get_fed_data():
    file_path = base_path + "fed_data.csv"
    # file_path = base_path + "fed_dump.csv"
    df = pd.read_csv(file_path, na_values="x")
    df.rename(
        {"data": "report_data", "hash": "report_hash"},
        axis=1,
        inplace=True,
    )
    df["report_date"] = df["report_date"].values.astype("datetime64[D]")
    df["release_date"] = df["release_date"].values.astype("datetime64[D]")

    return df

这个函数非常简单。我们将可配置的 base_path 变量(未示出)拉成 file_path 的格式,该格式被馈入 read_csv pandas 函数以创建数据帧“df”。然后,我们简单地重命名一些列以保持一致性,并确保数据类型对于日期是正确的。然后我们返回处理过的数据帧。

目前为止都很简单。

然而,我们不能只是把这个原始数据框架放进一个图表,让神奇的算法去做它们的事情。我们需要考虑如何单独处理这些数据。

像这样的项目面临着一个挑战。没有人给我一个规格表或说明,我需要得到它。我不得不自己想办法。恐怖…

处理

当面对不明确的需求时,您通常必须用通用术语来思考。这就是我开始这个阶段的地方。

我知道我需要根据各种标准和格式提取数据,所以我开始创建一些助手函数,这些函数可以单独调用,也可以作为一个更大的过程的一部分来过滤和提炼。

我不会一一介绍,但这是通用模板:

# function to pull specific report
def get_report_from_fed_data(df1, report_name):
    df = df1.copy()
    df = df[df["report_name"] == report_name]
    df.sort_values(by=["report_date"], inplace=True)
    df.reset_index(drop=True, inplace=True)
    return df

这个特定的函数被定义为根据传入的报告名称提取输入数据帧的所有行。

我首先复制一份数据帧。我这样做是因为如果你修改一个数据帧切片中的数据,你将会收到熊猫的警告。我讨厌这样的警告。

下一行只是对传入的 dataframe 的副本进行过滤。这一行主要是通过这段代码从一个辅助函数到另一个辅助函数的变化。

最后,我根据函数的设计目的对结果数据帧进行适当的逻辑排序,然后重置索引。最后一步是使返回的数据帧具有一致的索引,只包含返回的行。

我有助手函数,用于过滤到一个精确的报告日期或大于或等于一个传递日期的报告日期,以及类似的发布日期函数。总而言之,这些涵盖了我所能看到的用于创建图表的大多数条件。

现在就花时间计划可能需要的东西,最终会比匆忙去做更有效率。思考底层数据和预测用例可以提供更好的上下文理解,并且通常可以节省时间。

数据标记

当我开始更多地考虑我的最终结果时,我意识到我有一个恼人的缺口,我应该修复它。它又回到了那个讨厌的 report_name 值及其神秘的本质。

为了更加方便用户,我应该提供一个可以引用的长名字。所以,我创建了另一个函数。为了简洁起见,这里对其进行了简化,但其核心是完整的:

def add_report_long_names(df1):
    df = df1.copy()
        if df.loc[index, "report_name"] == "AMDMUO":
            df.loc[
                index, "report_long_name"
            ] = "Manufacturers Unfilled Orders: Durable Goods"
            df.loc[index, "category"] = "Production"

    return df

上面的代码片段与我在数据上提供的标题图像相关。在这种情况下,我只是检查 report_name 字段,如果它等于“AMDMUO”,我将 report_long_name 值设置为“制造商未完成订单:耐用品”。我也借此机会放入一个“生产”的范畴。

当我这么做的时候,我对这个类别没有直接的想法,但我知道我可能想用它做点什么。

正常化

对于处理这类数据的新分析师来说,通常不太明显的事情是找出一种方法来直接比较两个完全不同的值。我们如何使其正常化,以便我们可以直接在图表上绘制比较,并使其有意义?

描述它的一个实用方法是,如何使用股票数据在图表上绘制亚马逊和沃尔玛的比较表现?最简单的方法是根据变化率定义比较。

这里也是同样的过程。而且,我经常对数据类型这样做。

幸运的是,熊猫很快就搞定了:

def period_change(df):
    df["period_change"] = df.report_data.pct_change()
    df["relative_change"] = 1 - df.iloc[0].report_data / df.report_data
    return df

该功能被设计为位于过滤链的末端。它希望输入的数据帧是一个独特的报告,过滤到一个日期,并按该日期排序。

该函数添加了两个字段,一个用于表示周期变化,即相对于前一行的变化率。另一个是基线变化,即相对于数据帧第一行的百分比变化。

但是,要做到这一点,我们需要绝对唯一的、持久的价值:

def get_latest_data(df1):
    df = df1.copy()
    df = df.sort_values("release_date").groupby("report_date").tail(1)
    df.sort_values(by=["report_date"], inplace=True)
    df.reset_index(drop=True, inplace=True)
    return df

同样,这是与其他帮助程序相同的模板,但在这种情况下,过滤器采用原始数据帧,按发布日期排序,按报告日期分组,并提取分组列表中的最新条目。随着新版本的增加,该功能确保使用最新的数据。简单而有效,允许我们轻松地将干净的数据帧输入到周期变化函数中。

种类

当我添加类别字段时,我知道我想使用它。我仍然不确定具体如何,但我确实需要一种从一个类别而不是一个报告中获取所有相关数据的方法。

与其他相互依赖的辅助函数不同,该函数必须处理主数据框。这并没有让我激动,但这是必须的。

def get_category_data_from_fed_data(df1, report_name, report_date):
    df = df1.copy()
    master_list = df["report_name"].unique()
    master_list = pd.DataFrame(master_list, columns=["report_name"])
    master_list = add_report_long_names(master_list)
    filtered_list = master_list[master_list["report_name"] == report_name]
    filtered_list = master_list[
        master_list["category"] == filtered_list.category.iloc[0]
    ]

    df_out = pd.DataFrame()
    for index, row in filtered_list.iterrows():
        temp_df = get_report_from_fed_data(df, row.report_name)
        temp_df = get_report_after_date_fed_data(temp_df, report_date)
        temp_df = get_latest_data(temp_df)
        temp_df = period_change(temp_df)
        temp_df = add_report_long_names(temp_df)
        df_out = df_out.append(
            temp_df,
            ignore_index=True,
        )

    df_out["period_change"] = df_out["period_change"].fillna(0)

    return df_out

这需要一点处理技巧,所以我将一步步来。

对于输入,我们采用主数据框架和特定的目标报告作为确定类别的基础。我们还传入 report_date 作为起点来限制我们的范围。

像其他助手一样,我们创建一个副本来工作。同样,让我们避免这些警告。

我们的第一步是创建一个惟一的报告列表,然后将它从数组转换回数据帧。这允许我们将报告列表输入到 add_report_long_names 函数中,为我们提供每个报告的长名称和类别。

然后,我们创建一个过滤列表,只列出我们感兴趣的报告名称。理想情况下,这应该只有一行,但是我有点多疑,所以我认为可能存在不止一行的情况。这解释了为什么第二级过滤器只获取第一行的类别。

最后,我们创建一个空数据框来保存我们的结果,并针对主数据框遍历 filtered_list 的行。这个循环展示了瀑布过滤的作用。对于每一行,我们获得匹配的报告,然后过滤结果,仅获得开始日期之后的日期,然后获取该结果并提取最新数据,获取该结果并添加周期变化字段,然后通过 add_report_long_names 函数运行该结果以添加额外的描述符。在瀑布的底部,我们将结果添加到输出数据帧中。

这给我们留下了一组与类别描述符匹配的干净的报告数据。

这就是我们程序的数据处理部分。我们现在准备使用这些数据。

仪表盘

像我的商品报告仪表板一样,我从一张白纸开始。我不会在这里详细讨论这个问题,但是如果感兴趣的话,可以看看引言中链接的文章。

经过大量的辩论,并确定了我真正想看到的定期展示,我决定了一个非常简单的安排和设计。

布局是由 dash-bootstrap-components 模块提供的基本网格,应用了 CYBORG bootstrap 主题。我喜欢深色的仪表板。

注意,为了让我的图表匹配,我使用了 plotly 模板。

下面是我如何设置我的布局:

  • 第 1 行:页眉和标题。
  • 第 2 行:带有开始日期选择器的报告选择器。
  • 第 3 行:显示最新报告日期、最新发布日期和最新数据值的信息栏。
  • 第 4 行:原始数据散点图。

第 1–4 行—按作者分类的图像

  • 第 5 行:从上一个值和从基线开始日期开始的周期性变化的折线图。

第 5 行—周期表—作者图片

  • 第 6 行:标题
  • 第 7 行:关于从最后一个值和从基线开始的变化的类别比较的表面图。

第 6 行和第 7 行—曲面图类别比较—按作者分类的图像

这给了我总共五张图表。让我们来建造这些。

原始数据散点图

第 4 行:原始数据散点图——按作者分类的图片

这个图表对我的价值在于,它让我不仅可以看到基于 report_date 的趋势,还可以显示基于 release_date 的修订历史。上图是消费者价格指数,它没有显著的修订,但其他图表有重大的数值修订,这很有趣。

因为这是一个散点图,我应用了内置的 LOWESS 回归线,以获得线性趋势的一般概念。此图表上还有侧边颜色条,它允许图表上的颜色用作数据点年龄的提示。

使用 plotly express,可以构建一个简单的图表:

def basic_chart(df, long_name):
    df["release_int"] = (df.release_date - pd.Timestamp("1970-01-01")) // pd.Timedelta(
        "1s"
    )

    fig = px.scatter(
        df,
        x="report_date",
        y="report_data",
        trendline="lowess",
        color="release_int",
        color_continuous_scale=px.colors.sequential.YlOrRd_r,
        hover_name="report_long_name",
        hover_data={
            "release_int": False,
            "release_date": "| %b %d, %Y",
            "category": True,
        },
    )

    fig.update_layout(
        newshape=dict(line_color="yellow"),
        title=(long_name + " Raw Data"),
        xaxis_title="",
        yaxis_title="",
        coloraxis_colorbar=dict(
            title="Release Date<br> -",
            thicknessmode="pixels",
            thickness=50,
            tickmode="array",
            tickvals=df.release_int,
            ticktext=df.release_date.dt.strftime("%m/%d/%Y"),
            ticks="inside",
        ),
    )
    # fig.show()
    return fig

需要执行的主要功能是为颜色栏添加一列。Plotly 要求颜色数据为数字格式。因为我试图基于 release_date 应用它,所以它只是使用内置的 pandas time 函数将日期字段转换为 unix 时间。现在我们有一个参考列来定义颜色条和标记。

之后,图表本身的格式几乎完全是股票。我面临的困难是修改颜色条以使用标签的日期,而不是使用整数值。这在 update_layout 函数的 ticktext 行中进行了布局。

注意,因为我将大多数图表定义为回调函数,所以我在代码中保留了 fig.show()行的注释。这使我能够在没有整个 Dash 应用程序开销的情况下进行故障排除和设计。运行它就像在文件底部添加一个函数调用并运行文件一样简单。

由于我们早期的工作,回调同样容易破译。

@app.callback(
    dash.dependencies.Output("basic-chart", "figure"),
    [
        dash.dependencies.Input("report", "value"),
        dash.dependencies.Input("start-date", "date"),
    ],
)
def basic_report(report, init_date):
    # set the date from the picker
    if init_date is not None:
        date_object = date.fromisoformat(init_date)
        date_string = date_object.strftime("%Y-%m-%d")

    # Filter to the report level
    df = sf.get_report_from_fed_data(bl.fed_df, report)
    df1 = sf.get_report_after_date_fed_data(df, date_string)
    # Filter again to the release
    df2 = sf.get_release_after_date_fed_data(df1, date_string)

    # Assign long names
    df2 = sf.add_report_long_names(df2)
    long_name = df2.report_long_name.iloc[0]

    fig = sf.basic_chart(df2, long_name)
    return fig

对于输入,应用程序将报告名称和开始日期发送给回调函数。现在我们将这些值输入回调函数的主体。

第一个 if 语句确保日期不为空(它不应该为空),并将其格式化为一个字符串,我们可以在助手函数中使用它。

然后,该函数调用 get_report 函数,在主数据帧中输入数据,对其进行过滤以获得相关日期,然后过滤以获得开始日期之后的发布。最后,它添加了长名称,因为这些名称在图表的标题中使用,并为一个变量获取一个名称,以输入到上面显示的 basic_chart 函数中。

该函数创建图表,并将其作为 figure 对象返回给应用程序第 4 行中保存的 basic-chart id。

basic_data = dbc.Row(
    [
        dbc.Col(
            dcc.Graph(
                id="basic-chart",
                style={"height": "70vh"},
                config=lc.tool_config,
            ),
            md=12,
        ),
    ]
)

当然,这是基本的行布局。这里我们可以看到 config 参数引用了 layout_config.py 文件,并应用 tool_config 参数来添加我喜欢的绘图工具。值“md-12”是 bootstrap 中主题的配置,它将图表设置为占据整行。

周期图表

周期图本质上彼此相似,并以类似于基本散点图的方式被称为周期图。我不会在这里花太多时间,但是和往常一样,如果你有问题,请联系我。

def baseline_change_chart(df, long_name):
    fig = go.Figure(layout=lc.layout)
    fig.add_traces(
        go.Scatter(
            x=df.report_date,
            y=df.relative_change,
            name="Baseline",
            line_width=2,
            fill="tozeroy",
        )
    )

    fig.add_hline(y=0, line_color="white")
    fig.update_layout(
        newshape=dict(line_color="yellow"),
        title=(long_name + " Change from Baseline"),
        xaxis_title="",
        yaxis_title="",
    )
    # fig.show()
    return fig

上面是基线图表的代码,是用 plotly go 构建的。数字方法。我选择这个而不是 plotly express 函数,因为即使在这个阶段,我也不完全确定我想如何构建我的图表。

然而,这种图表类型提供了一个额外的例子,所以它工作得很好。

与其他图表类型一样,这几乎是一本完美的教科书。这里的主要变化是应用了 layout_configs 文件中的样式,添加了一条水平线和 filltozeroy 参数。

在 Main.py 文件中,回调进行类似的链式过滤,以获得正确的最终数据帧。因为数据只使用不同的最近日期,所以又使用了一个辅助函数。

曲面图

在过去的几个月里,我开始喜欢上了一些东西的表面图。我发现,虽然较长时期的折线图可以充分显示变化,但看到它以三维地形表面的形式展示出来,不仅会强化变化,还会强化不同类别之间的相互作用。

不利的一面是,这些图表需要一点思考才能算出来。如果我正在设计一个一次性的或者带有定义好的打包数据的图表,那么这个图表可以很容易地构建。这是我在向商品报告数据添加曲面图时发现的情况。这里,我们有一个不同的情况。

曲面图旨在比较一个类别中 n+1 个报告的相对移动。这使得创建灵活的模板变得更加有趣。

如果你坚持这篇文章这么久了,这里有一个很大的收获。在我的互联网之旅中,我还没有在其他地方看到过这方面的内容。

与其他示例一样,我们将定义一个函数来基于处理后的数据帧生成图表:

def category_chart_baseline(df1, report_name, report_date):
    df = get_category_data_from_fed_data(df1, report_name, report_date)

    x_data = df["report_date"].unique()
    y_data = df["report_long_name"].unique()
    z_data = []
    for i in y_data:
        z_data.append(df[df["report_long_name"] == i]["relative_change"] * 100)

    fig = go.Figure(
        go.Surface(
            contours={
                "z": {
                    "show": True,
                    "start": -0.01,
                    "end": 0.01,
                    "size": 0.05,
                    "width": 1,
                    "color": "black",
                },
            },
            x=x_data,
            y=y_data,
            z=z_data,
        )
    )

    category = df.category.iloc[0]
    begin_date = np.datetime_as_string(x_data.min(), unit="D")
    end_date = np.datetime_as_string(x_data.max(), unit="D")

    fig.update_layout(
        title=category
        + " Report Baseline Comparison (% Change): <br>"
        + begin_date
        + " - "
        + end_date,
        scene={
            "xaxis_title": "",
            "yaxis_title": "",
            "zaxis_title": "",
            "camera_eye": {"x": 1, "y": -1, "z": 0.75},
            "aspectratio": {"x": 0.75, "y": 0.75, "z": 0.5},
        },
        margin=dict(
            b=10,
            l=10,
            r=10,
        ),
    )
    # fig.show()
    return fig

因为我们使用 get_category_data 函数,所以传入的数据帧必须是主数据帧。但是,除此之外,我们还会传入报告和开始日期——两者都是由应用程序确定的回调提供的。这使得第一部分很简单。

接下来,我们为 x 轴生成一个唯一的日期数组,并为 y 轴生成一个使用 long_report_name 的唯一的报告列表。对于 z 轴,我们通过长报告名称遍历数据框,并将 report_data 值输入到百分比值数组中。

因为所有东西都保持相同的排序顺序,所以 Y 轴和 Z 轴会对齐。

该功能的其余部分只是设置布局和定义方面和相机角度的偏好。还设置了标题部分的变量,但是现在这些应该是非常明显和过时的了。

还记得我说过回调很简单吗?

# Period Chart
@app.callback(
    dash.dependencies.Output("category-baseline-chart", "figure"),
    [
        dash.dependencies.Input("report", "value"),
        dash.dependencies.Input("start-date", "date"),
    ],
)
def category_baseline_report(report, init_date):
    if init_date is not None:
        date_object = date.fromisoformat(init_date)
        date_string = date_object.strftime("%Y-%m-%d")

    fig = sf.category_chart_baseline(bl.fed_df, report, date_string)

    return fig

因为我们经历了预先从功能上定义逻辑的麻烦,这个复杂的图表实际上只剩下样板文件中的一行。

可能最酷的图表类型变成了最容易实现的图表类型之一。

多方面的

困难的事情已经完成了。到目前为止,您已经有了一个很好的想法,可以使用一个具有一定挑战性的数据集和一个可以运行它来分析各种经济数据的应用程序。这是一个很大的成就。但是,有几件事我想说一下。

在存储库中,我包含了一个包含我的样式表的资产目录。这将设置下拉选择器和日期选择器的样式。其中一些需要一段时间来寻找和解决(再次强调,我不是一个真正的前端家伙)。这是一个很好的资源来弄清楚这个应用程序如何布局。

自我测试

对我来说,这是一项正在进行的工作。我故意遗漏了一些东西,我认为这些东西会对试图实践其中一些概念的人构成一个很酷的挑战。

  1. 向图表添加范围滑块以查看时间窗口。
  2. 将一些逻辑重构为基于类的方法。
  3. 将布局配置添加到 layout_configs 文件中,以设置曲面图的样式。
  4. 配置期间折线图以添加任意第二个或第三个报告。
  5. 链接应用程序,以拥有一个数据库后端,而不是一个 CSV 文件。

还有其他的,但是尝试寻找新的方法来挑战你的技能。学习和成长从来都不是白费力气。

结论

这篇文章大概就是这么做的。我希望你能发现它的知识性、教育性,或者至少有点价值。

我鼓励你想办法测试你的分析能力。深入挖掘 Dash 和 Plotly 更多。这些开发人员所投入的工作的深度和能力不断让我感到惊讶。

虽然我以前说过,但它值得重复。我喜欢教学和解释。如果你通读了整篇文章,但有不明白的地方,或者只是想要一个不同的例子,请联系我们。我非常乐意尽我所能给予回应和帮助。

下一次晋升所需的数据分析师技能

原文:https://towardsdatascience.com/data-analyst-skills-you-need-for-your-next-promotion-479275b80bad

“老”一代的建议

西蒙·艾布拉姆斯在 Unsplash 上拍摄的照片

介绍

首先,我要承认,这个主题已经在许多不同的平台上被反复讨论过。那么,我能提供什么还没说的呢?

好吧,事实证明,我比一般的媒介作者老多了。尽管有些人礼貌地称我为“成熟的”或“有经验的”,但事实是,我的观点是由这样一个事实形成的,即我已经存在了足够长的时间,足以记得条形图上的霓虹灯颜色和渐变是很酷的。因此,我能给你的是经得起时间考验的建议。

数据可视化

作为一名分析师,你可能要花至少 10 倍的时间来分析数据,因为你必须把信息呈现给你的观众。因此,图形和其他可视化表示非常重要,因为它可以帮助您更好地理解,即使对于那些没有受过数据集分析培训的人也是如此。通过构建可视化,您可以帮助公司的决策者一眼就理解复杂的想法。

那么如何提高这个技能呢?嗯,有很多在线课程形式的培训选项和大量专门研究可视化的工具。然而,我不太愿意推荐具体的技术或课程,因为世界变化太快,我想提供经得起时间考验的建议。

因此,养成探究他人作品的习惯。建立一个名为“灵感”的书签文件夹,里面放满博客链接。每周花 15 分钟浏览博客,让你的大脑充满各种可能性。

我也建议买几本书。FlowingData.com 大学的爱德华·塔夫特是数据可视化的鼻祖,我也是内森·尤的粉丝,在那里你可以找到书籍、博客、课程和教程。我把他的两本书数据点想象出来,放在书架上寻找灵感。

你将如何实际创建可视化的机制将随着实践而来。你们有的人会爱上 R 或者 python,有的人会爱上 Excel 或者 Tableau。关键是让你的大脑充满各种可能性,这样你就可以在建立它之前想象你想要什么。

数据清理

数据科学家因其声称“构建机器学习模型的 80%是准备和清理数据”而闻名。然而,对于数据分析师来说也是如此。无论实际百分比是多少,事实是,总体而言,花在数据上的大部分时间都花在了清理数据上。

清理数据很重要,因为未清理的数据会产生误导模式,并导致错误的结论。在我职业生涯的早期,我的任务是提供第一次尝试就解决的支持电话的百分比。当我和我的管理人员讨论结果时,他们中的一个坚持说这些数字“没有意义”当我做更多的研究时,我发现 calls 数据有一个名为“status”的列,它有时会填充一个“X”。显然,系统会记录一个“X”作为测试记录,这应该被忽略。

数据清理技能随着实践和业务专业知识的增长而增长。这使得加速变得困难。一般来说,像kaggle.com或津迪这样的网站并不是实践数据清理的最佳场所,因为它们专注于数据科学,而且数据集通常已经相当干净了。另一方面,像 https://data.ca.gov/的或 https://data.gov/的这样的政府网站是寻找杂乱数据集的好地方。即使你不是 R 用户,你也可以跟随 TidyTuesday 项目,寻找有趣的数据集,熟悉在野外发生的清洁步骤的类型。

结构化查询语言

正如我提到的,我不太愿意推荐特定的工具或技术,因为环境变化太快了。可以肯定地说,python 和 R 将继续存在,但是 SQL 在另一个层次上。SQL 是数据库的语言;因此,学习 SQL 将永远是您操作和研究数据集以进行分析的最直接的方式。

如果你在一家允许你下载 excel 表格摘录的公司工作,问问周围的人,看看是否有可能用 SQL 直接访问数据库。一旦您熟悉了数据库结构并编写 SQL 以您想要的方式表示数据,您的效率将随着工作质量的提高而提高。

有许多资源可以帮助你改进 SQL 游戏, CodeAcademy 、 Udemy 和 Udacity 是寻找实践课程的很好的免费资源。 SQL 生成器和 SQL 美化器是很好的链接,可以帮助你学习。 Stack Overflow 有一个很棒的社区,可以回答你遇到的技术性 SQL 问题。

在 Rasgo,我们一直在大力投资回报数据社区。我们最近的项目是推出免费的 SQL 生成器,它可以生成特定数据转换所需的 SQL 语法。我们发现人们在 Google 和 Stack Overflow 上搜索所需的 SQL 语法,浪费了大量可以用于数据分析的时间。SQL 生成器是一个 SQL 查询的模板,它允许您定制列名和表结构,选择想要执行的操作,然后它为您构造各种不同“风格”的 SQL 语法。不要再强调 DATEDIFF()和 DATE_DIFF()之间的细微差别了!阅读本月早些时候的这篇文章,获得一些其他有用的在线工具。

批判性思维

批判性思维是最难掌握的事情之一,因为没有太多的课程或一刀切的方法来掌握这项技能。批判性思维是一种有意识的努力,挑战统治我们的自动心理过程。

批判性思维不是你与生俱来的,也不是你一旦拥有了它,它就会一直存在。相反,批判性思维是每当你有一个重要的决定或分析时,你有意识地激活的东西。这是一种有目的的挑战、质疑和证实假说的努力。

虽然有许多不同的资源可以帮助你提高批判性思维技能,但我想重点介绍的是提问。如果你养成了写下大量问题的习惯,你就会进行批判性思考。

让我们假设您被要求查看客户流失情况,以及最近是否有所改善。停下来问自己一些问题,比如:

  • 流失是如何计算的?为什么那样?还有其他方法吗?
  • 从客户的角度来看,什么是流失
  • 永远是顾客的选择吗?
  • 哪些因素可能很重要?我能测量一下吗?
  • 这个任务的目标是什么?证明,反驳,论证,支持?
  • 我可能忽略了什么?是否有我无法验证/证明的已知假设?

请注意这一系列问题是如何层层叠加的。回答一个问题可能会引出更多的问题。这完全没问题。这才是重点!

例如,当我在一家电信公司担任分析师时,我被要求调查上个月客户流失突然增加的潜在原因。(当时是 4 月)。我用批判性思维写下了一个类似上面的问题列表。

当我谈到如何计算客户流失的问题时,我挑战自己,考虑是否有其他方法来衡量客户流失。长话短说,我发现:

  • 该公司使用“月末”数字来计算流失率
  • 三月份实际上是一个涵盖二月份的“财政”月份
  • 二月是一年中最短的一个月
  • 使用另一个计算流失率的公式显示,三月份的流失率没有上升

基本上,流失的公式是这样的,它会在一年中最短的一个月,也就是所谓的三月,出现“高峰”,这仅仅是因为数学是如何工作的。

这个故事的寓意是,批判性思维有时会带你得出你意想不到的结论。这也是你今天可以决定改进的事情;这不是你需要与生俱来的某种神话般的软技能!

通讯

另一方面,是一种软技能。你可能是这个世界上有史以来最有才华、最有洞察力的数据分析师,但如果你不能与他人交流,那就没有任何好处。不幸的是,我说的其他人是指非技术人员。

作为一名分析师,你跨越两个不同的世界。在一个世界中,您必须与您的同行和其他数据专家一起解决技术问题。在另一个世界里,你是以商业为中心的决策者的翻译。你需要以一种支持性的而不是混乱的方式提供清晰的、高水平的解释。

开始锻炼这种软技能的一个方法是加入一个社区。有许多在线社区、网站和论坛可供数据分析师参与。我非常喜欢 slack 和 discord 频道作为与他人互动的方式,但众所周知,这些频道很快就会消失。我发现当地乐观和数据会谈。俱乐部是分析师们经常去的地方。你也应该通过开博客来练习你的沟通技巧。 Medium 是一个入门的好地方,在这里你可以锻炼你的创造力,练习,练习,再练习。

结论

跟随最新的趋势和技能来提升你的市场价值仍然很重要。例如,20 年前,VBA、宏、DAX 和 ASP 是提升你的优势的好技能。如今,这些技能已经不那么重要了。希望我已经给了你一些有用的建议,关于那些在过去 20 年里没有改变的技能,这样你就可以避免迷失在茫茫人海中。如果你想联系我,讨论过去的时光,你可以在本地乐观和数据会谈中找到我。俱乐部,你随时可以在 Rasgo 直接 ping 我。

处理大量数据特别请求的数据分析师指南

原文:https://towardsdatascience.com/data-analysts-guide-in-handling-flooding-data-ad-hoc-requests-257ea61e38e1

由 pikisuperstar 创建的生产性载体—www.freepik.com

管理临时请求并让您专注于重要项目的技巧

作为一名数据分析师,尤其是在团队还不了解数据的组织中,我们经常需要处理来自不同利益相关者的大量特定数据请求

这些请求一个接一个地看起来很小,所以你可以很快地从你的项目中抽出时间来处理它们。但是,当您将它们组合起来并计算处理它们所花费的时间时,可能会占用您大量的工作时间。

这些要求,虽然看起来不多, 可以让你远离其他重要的项目——你的具有技术敏锐度或产品特性的长期分析项目。这来自于花费在这些工作上的时间和资源(包括占用您的深度工作时间),更不用说在交付数据请求时来自涉众的额外问题/确认。

这些是我多年来学到的处理这些特别请求的技巧,在某种程度上“更聪明地工作”。

提示 1:提前几步做好准备

由故事集创建的进度向量—www.freepik.com

1.1 了解数据流以及您的交付成果的走向

保持好奇,弄清楚数据是从哪里来的。你可以从尝试理解整个产品/业务流程开始——每个步骤的目标,以及每个步骤的输入/输出。接下来,您可以考虑与这些步骤相关的数据点。然后跟进产品经理或工程团队,检查这些数据是否已经被跟踪,如果是,它们存储在哪里

理解这种数据流将有助于在指标或者甚至产品/系统出现问题时进行调试。这也有助于识别追踪中遗漏的潜在重要数据点。

💡不仅要理解数据流入,理解数据流出也很重要。询问利益相关者将如何使用数据(例如,用于什么业务决策,或者用于哪个系统的输入,等等),这样你就可以为他们找出合适的交付格式——防止他们回来找你修改格式!

1.2 保存主要查询,并放在手边

让您的关键查询易于访问。这里的关键查询是在实现特定请求时经常使用的语法。当您实际上可以重用它们来缩短处理时间时,一次又一次地重写相同的简单查询是没有意义的。

同样,对于一些有重复请求的查询,你可以把它们变成一个由一些定义变量组成的查询模板(即用于查询的“where”子句)。这可以为下一次查询节省时间,同时防止重复操作导致任何语法错误。

💡如果您想更进一步,您还可以创建一个带有交互参数的简单仪表板。然后,您可以与利益相关方分享这些信息,根据他们的数据需求进行调整,防止他们向您提出普通而简单的请求。

1.3 使您的分析具有可重复性

通常——尤其是对于初创企业——我们使用由多次迭代组成的敏捷方法。通常需要这样的迭代来评估动态市场并随之调整。一段时间后重新运行一些分析并不少见,无论是为了更新检查,还是为了其他相关的涉众。

继续上一篇技巧文章,除了保存主要查询之外,您还可以通过使您的分析具有可重复性来提升它。这包括保存所有数据(或数据源参考,如果有数据保留限制)、源代码和脚本以及重现所需结果所需的工具文档

💡我通常在 Python 笔记本上做分析,上面有章节、数据源注释和结果。这样,如果我需要再次重新运行分析,我可以更新变量(如果有的话)并重新运行整个笔记本来获得结果,而不是重新编写所有的脚本。

技巧 2:项目任务的优先级排序

由 jcomp 创建的剪切板矢量—www.freepik.com

2.1 启动数据项目的票务系统

为项目团队中的临时请求和数据项目队列设置一个标签系统。这将有助于管理工作量,并防止风险承担者直接发送电子邮件或向团队成员发送请求的压力。此外,拥有一个票务系统将允许您收集更多关于请求的详细信息,以便进行优先级排序。

💡可以包含在票证表格中的一些详细信息如下:

  • 申请人团队
  • 请求的细节:需要哪些数据?采用哪种格式(即电子表格、仪表板、分析文档、数据库表格等)?数据将用于什么/如何使用?
  • 需要数据时的优先级/时间

通过这种方式,可以收到更多详细信息的请求,从而减少与请求者之间的来回沟通。并且可以针对团队带宽的优先级和分配来评估项目列表。

2.2 批处理、时间限制和临时花名册

我个人认为临时请求的主要问题是它的不可预测性。有时可以安静,有时可以泛滥。当它泛滥的时候,人们倾向于盲目地处理它——从一张票跳到另一张票,直到它们都完成。

批处理是我一直用来解决这个问题的策略。它将一些相似的任务(或者在这种情况下,临时请求)组合在一起一次完成,减少了上下文切换(即分析不同的表)或在工具之间移动的时间和精力。这对于处理大量可以组合在一起的简单任务非常有用。

为了确保我有时间做重要的长期项目(而不只是停留在一堆临时的请求上),我做时间限制。就是预先计划好自己的日程,分配一个固定的时间段去做计划好的任务,并真正做到。到了项目时间,我会继续做项目,推迟任何临时工作,除非是在 P0。

💡如果你想更进一步,你可以在你的团队里有一个“特别花名册”。它的工作方式是每周(或者 3 天,或者 2 周,等等——由你决定),一个团队成员负责处理那一周的临时请求。这可以确保你在你的值班周只处理临时的请求,并且在你不值班的时候可以专注于其他项目。

技巧 3:启动“数据自助服务”

pch.vector 创建的满意度调查向量—www.freepik.com

3.1 记录关键指标、仪表板和分析项目

文档是关键。它服务于多种目的,包括理解的一致性(例如,这个“活跃用户”指标实际上意味着什么),对指标值的快速访问(通过仪表板),以及随着时间的推移对分析项目的迭代或改进。

对于指标文档,您将需要以下内容

  • 指标名称(即活动用户)
  • 指标描述—指标是关于什么的(例如,在过去 28 天内登录并进行积极互动的用户数量—在网站中点击/添加到购物车/交易)
  • 指标计算—计算公式(如果有)(例如,接洽率、订单成功率等)
  • 数据源/查询—用于提取指标的查询或表格

对于仪表板,您需要列出仪表板名称、描述和指标。最好也有度量文档的链接。

对于分析项目,文档可能因每个分析需求而异,但通常情况下,您会有背景、目标、假设、数据探索和结论。确保为创建的查询或脚本准备一个附录部分。

💡有了这些文档,当下一个特别的数据请求到来时,您可能能够通过共享这些文档链接为您的涉众启动一个“自助服务”机制,而不是直接为他们重新运行查询:)

3.2 教育你的利益相关者

我一直与不同类型的利益相关者合作,从技术产品经理到非技术项目经理和运营助理。不管他们的技术技能如何,我发现大多数时候人都愿意学习。我们可以利用这种“求知欲”来利用组织中的数据工具,建立“数据自助服务”文化来减少组织中简单的特别请求。

我们的主要角色是提供一种方法来帮助利益相关者尽快获得所需的数据。我们可以通过创建仪表板、查询模板和文档的存储库来促进这一点;然后将它们发布给涉众使用。

💡对利益相关者的教育可以从一个关于浏览存储库的视频开始。然后,转到简单利用仪表板,利用过滤器和交互参数获取他们需要的数据。更多的高级教育可以是关于数据源和 SQL/查询课程的研讨会,但这不是强制性的。

拥有这种设置将有助于我们作为数据团队以及利益相关者本身。作为数据团队,我们可以看到简单的临时请求数量减少,让我们专注于长期项目。作为涉众,他们学习新的技能,并且能够更快地获得所请求的数据(不依赖于数据团队和排队的特别请求)。

结束语

数据请求,包括特别的请求,总是会到达数据团队(确切地说,是数据分析师)。在某种程度上,这是一种感激,因为利益相关者信任你来帮助他们获取数据,所以很高兴看到他们的到来。我们只需要有效地管理它们,这样就不会干扰我们更有附加值的长期工作。

我上面分享的技巧是一些帮助你在请求和项目之间导航的更具战略性的技巧。我的一些其他战术行为技巧包括:

当需要时,不要害怕说不或拖延工作。这适用于涉众的需求或可用性不明确的情况,或者当它不是真正的优先事项时。

我希望这些技巧可以帮助你管理大量的分析特别请求。祝你好运!

供应链可持续发展的数据分析

原文:https://towardsdatascience.com/data-analytics-for-supply-chain-sustainability-c6066de41609

使用数据分析,通过诊断和战略决策减少端到端供应链运营对环境的影响

(图片由作者提供)

多年来,投资者对可持续发展透明度的要求越来越高,2030 年成为第一个重要里程碑。

通过 ESG 得分,组织的可持续性越来越受到重视。

因此,各公司现在都在争先恐后地实施二氧化碳减排路线图。

国际供应链网络的前一个例子—(图片由作者提供)

在之前的出版物中,我将供应链分析作为一套工具,为一家国际时装零售商提高 运营绩效降低成本

在本文中,我们将重点介绍如何使用相同的工具方法减少端到端供应链的环境影响

💌新文章直接免费放入你的收件箱:时事通讯

如何利用数据分析实现供应链可持续发展?

供应链分析是一套使用信息流来回答问题和支持决策的工具和方法。

可持续发展的四种供应链分析——(图片由作者提供)

每种类型都可以回答特定的问题,并通过使用方法、数学概念和分析工具来支持您的运营实现绿色转型。

描述性分析:二氧化碳排放报告

一套工具,提供可见性和整个供应链的单一事实来源,以跟踪您的货件、检测事故并衡量您的运营绩效。

**❓ QUESTION**
How many tons of CO2 are emitted by my distribution network?

这是你绿色转型的第一步:你需要衡量你的运营对环境的影响。

一套工具,提供供应链中测量二氧化碳排放的可见性和单一事实来源:

按国家

报告示例—(图片由作者提供)

按项目

报告示例—(图片由作者提供)

这个想法是测量沿着价值链的二氧化碳排放量,并建立报告,以了解你的分销网络的每一个环节的影响。

**💡 INSIGHTS** It looks like the easiest type from a mathematical point of view.However, it may be the main bottleneck of your green transformation as it requires harmonizing data from different systems.

如果您想要构建一个强大的基础来创建报告并为预测、诊断或说明性分析提供高级模型,这是非常必要的。

工作流程示例—(图片由作者提供)

📈 **ANALYTICS** - Data extraction, transformation and processing with SQL, Python
- Visualizations using matplotlib and PowerBI**🚀 RESULTS**
The measure of the emissions by scope and market to build your baseline of your transformation roadmap.

更多细节,你可以看看这个视频

(作者视频)

诊断分析:产品生命周期管理

这可以概括为事件或问题根本原因分析。

**❓ QUESTION**
What is the most polluting mode of transportation in France?

这一步非常接近描述性分析。建立了单一的统一数据源后,我们可以沿着价值链追踪排放情况。

分布排放—(图片由作者提供)

**💡 INSIGHTS** If your colleague from the sustainability team is asking you why emissions doubled last year.1\. Have a look at the historical data 
2\. Split the emissions by transportation mode (road, air, sea)

这将有助于您理解,这是因为运输团队在面临生产延迟后,用空运取代了海运。

**🚀 RESULTS** This kind of diagnostic can help your management to spot the biggest sources of emissions and put its focus on them.📊 **ADDITIONAL KPIS**
You can implement additional KPIs such as % of air freight (high emissions), % of electric last mile delivery to bring a more proactive approach and trigger alerts if needed.

规定性分析:更新你的目标函数

协助运营部门解决问题,优化资源以实现二氧化碳排放目标。

**❓ QUESTION**
Where should we locate our factories to minimize the CO2 emissions of our Supply Chain Network?

在上一篇文章中,我介绍了帮助运营部门解决问题和优化资源以达到最佳效率的解决方案。

供应链网络设计文章(链接)

对于您的绿色转型,工具和方法将是相似的。唯一的区别是,现在你的目标函数将支持减少二氧化碳排放量。

布尔图显示结果—(图片由作者提供)

在的上一篇文章中,我用方法论设计了一个最佳的工厂网络,来制造产品并交付给特定的市场。

初始线性规划问题—(图片由作者提供)

这个想法是使用一个线性规划模型来选择决策变量(工厂位置),以最低的成本生产和交付产品。

**💡 INSIGHTS** In this kind of exercises usually markets are very far from cheap production locations. Therefore, you'll have high levels of CO2 emissions due to transportation.

如果我们现在改变目标函数呢?

考虑可持续性的新问题—(图片由作者提供)

现在让我们要求模型在考虑运输和生产的同时,考虑到市场最小供应量的约束,使二氧化碳排放量最小化。

桑基图表示例——(图片由作者提供)

🚀 **RESULTS** You may need to completely transform your network to get plants close to your markets.The impact on the cost will be not negligible as you'll have to produce in countries with high labor costs.**💡 GO BEYOND**
Improve your model by including several types of transportation mode (electric, low emissions cargo fuels) that may increase the costs but reduce your CO2 footprint.Thus, you may find alternative solutions and keep some of your facilities in competitive countries.

结论

在 medium 上关注我,获取更多与数据分析和供应链管理相关的文章

为什么重要?

作为供应链经理,您的职责范围包括

  1. 了解并最小化风险
  2. 优化运营以降低成本和二氧化碳排放
  3. 提供资源规划的可见性
  4. 为未来场景做准备

同样的方法,同样的工具

对于描述性分析,没有什么变化,只是现在你需要更加重视数据质量。

至于其他的,调整你的关注点,在你的目标函数中包含二氧化碳减排。

在这段短片中,我们将详细介绍不同类型的供应链分析,

混合方法

这里的一切都应该考虑到你生产和交付的商品的价值。

如果您想保持适当的盈利水平,只关注二氧化碳减排可能是不合理的。

因此,您需要创新,并在数据驱动的见解的支持下使用替代解决方案。

用数码相机模拟不同的场景

数字孪生是物理对象或系统的数字复制品。

供应链数字模型是一种计算机模型,代表供应链中涉及的各种组件和流程,如仓库、运输网络和生产设施。

使用 Python 的数字孪生示例—(图片由作者提供)

模拟几个绿色计划的场景

场景 1:您想要建立一个本地仓库来缩短最后一英里的配送距离

  • 对服务水平会有什么影响?
  • 仓储成本会有什么影响(地点越多)?
  • 我们能减排多少二氧化碳?

场景 2:您希望停止空运以减少二氧化碳排放

  • 对商店的补货周期会有什么影响?
  • 分销计划员需要提前多长时间创建补货订单?
  • 对二氧化碳减排会有什么影响?

场景 3:您想要建立更多的工厂,为所有市场进行本地生产

  • 对生产成本会有什么影响?
  • 运输成本会有什么影响(工厂靠近仓库)?
  • 我们能减少多少二氧化碳排放量?

对于每个场景,您可以操作与计划相关联的参数,并查看您的整体性能会降低多少。

然后,您可以调整其他指标(仓库容量和位置、补货提前期等),直到您重新达到初始目标。

这将向您展示供应链的改进,以获得适应这些新的绿色倡议的稳健性水平。

https://www.samirsaci.com/what-is-a-supply-chain-digital-twin/

数字孪生模型的例子:绿色库存管理

(图片由作者提供)

绿色库存管理可以定义为以环境可持续的方式管理库存。

对于分销网络而言,这可能涉及一系列旨在减少订单传输、准备和交付的环境影响的流程和规则。

(图片由作者提供)

如果我们降低商场补货频率,会对二氧化碳排放量产生什么影响?

使用数据分析来模拟商店补货频率的变化,并衡量对整体环境影响的影响。

https://www.samirsaci.com/green-inventory-management-case-study/

数字孪生模型的范例:时尚循环经济

(图片由作者提供)

循环经济是一种经济模式,旨在最大限度地减少浪费和提高资源效率。

它包括设计注重寿命、重复使用和回收的产品和工艺。

(图片由作者提供)

一些公司已经实施了一种订阅模式,在这种模式下,客户支付一定的费用就可以在特定的时间段内获得的产品或服务。

使用数据分析来模拟循环订阅模式的几种情况对快速时尚零售商的减排和用水的影响。

https://www.samirsaci.com/how-sustainable-is-your-circular-economy/

考虑当地的倡议

管理浪费和减少消耗品的使用也是减少仓库运营对商店交付的影响的好方法。

减少包装薄膜的使用量—(图片由作者提供)

数据分析还可以帮助您估计这些小举措对整个网络的影响(如果应用于所有仓库)。

  1. 使用实际运行数据计算电流消耗
  2. 将这些参数包含在您的数字孪生兄弟中
  3. 概念验证后,估计节约目标
  4. 推断整个网络(每个仓库)的节约

所有这些举措都与降低成本和优化运营的努力相一致。

您可以调整您的持续改进方法,以跟踪耗材使用情况,并找到不会影响您工作效率的替代方案。

首先,从测量运营的当前消耗和环境影响开始。

数据分析可以帮助您自动化这一过程。

https://www.samirsaci.com/sustainable-logistics-reduce-packing-and-consummables-consumption/

关于我

让我们在 Linkedin 和 Twitter 上连线,我是一名供应链工程师使用数据分析来改善物流运作和降低成本。

如果你对数据分析和供应链感兴趣,可以看看我的网站

https://samirsaci.com

参考

  • 什么是供应链分析,Samir Saci,走向数据科学
  • 蒙特卡洛模拟的稳健供应链网络,Samir Saci

时尚数据分析:Excel 系列(# 1)-概述

原文:https://towardsdatascience.com/data-analytics-in-fashion-excel-series-1-f1a6eed57393

Microsoft Excel 数据分析入门综合蓝图

Timur Saglambilek 以像素拍摄的照片

本文讨论的原则适用于时尚以外的其他行业。换句话说,无论您是数据爱好者、研究人员、时尚爱好者、学生还是专业人士,讨论的 Excel 概念都与您的领域相关并适用。

时尚品牌和零售商正在寻找最大化数据分析的方法,主要是通过针对目标受众的个性化来改善产品供应。

根据麦肯锡的研究,将数据整合到规划、销售和供应链中的时尚和奢侈品公司已经收到了显著的效果,在库存和商店优化中实施数据驱动的决策,销售额增加了 10%,库存成本降低了约 15%。

一般来说,那些优化了数据能力以建立以客户为中心的业务的品牌,其数字销售额增长了 30-50%。

总而言之,随着每天发布的数据越来越多,时尚品牌越早学会利用数据,他们在这个时代的生存机会就越大——数据领先者和后来者之间的差距已经扩大。

和我在一起……

https://medium.com/data4fashion/fashion-and-big-data-application-cb946dd76844

虽然许多时尚品牌尚未利用数据的力量,但一些品牌正在探索员工技能提升选项和人才搜寻,一些品牌甚至愿意培训新的数据专业人员,如数据工程师、数据分析师、数据科学家、云工程师等。

换句话说,无论你是核心设计师、插画师、跟单员、技术设计师等,你都需要知道如何从你公司的数据中解读见解- 掌握数据分析。

也就是说,本文将重点关注数据分析的关键步骤之一,即“数据清理”、,但在探索这一步骤之前,让我带您了解一下数据分析生命周期的各个阶段。

数据分析生命周期的 6 个阶段

作者图片

每天大约产生 2.5 万亿字节的数据,随着技术的不断发展,我们产生的数据量也将不断增加。随着数据的创建,也需要对其进行处理和重用。因此,数据经历了一个围绕 6 个阶段的循环运动,每个阶段都有一个规定的目标、任务、功能和相关性。

以上各阶段依次进行,但是,流程可以是向前或向后移动- 这是一个迭代过程。

#1。数据发现:

照片由 Pavel Danilyuk 以像素拍摄

以下是数据发现阶段发生的一些活动:

  1. 数据团队和主要利益相关者检查业务趋势。
  2. 定义目标和成功标准。
  3. 创建业务案例研究,即确定一个业务问题,团队想出一个策略来处理它。
  4. 数据需求、数据来源和数据预期讲述的故事。
  5. 所需资源的评估和评价。
  6. 根据业务问题制定假设。

#2 数据准备:

焦点从业务需求转移到数据需求。

此时,数据团队执行以下任务:

  • 识别数据源
  • 确定在指定的时间范围内可以从每个来源获得多少数据。
  • 整理数据收集、处理和清理。
  • 这个阶段可能会执行多次。

#3 模型规划:

  • 团队探索来自前一阶段的数据。
  • 处理和存储数据需要分析沙盒。它还在整个项目时间框架内提供网络功能。
  • 团队了解变量并选择适合业务案例的变量- 特征选择用于模型构建。
  • 接下来,确定技术、要构建的模型和工作流。

# 4。模型构建:

  • 数据集是为测试、培训和生产而开发的
  • 模型是使用模型规划阶段确定的不同算法构建的。
  • 执行模型的试运行,以基于业务问题测试模型的有效性。

#5。沟通结果:

罗德尼制作公司在像素上拍摄的一张张照片

  • 该团队确定关键结果,衡量与业务问题相关的价值,并生成数据故事,以将结果传达给风险承担者。
  • 主要利益相关方将获得的结果与在数据交付阶段设定的目标和成功标准进行比较。
  • 这个阶段决定了项目的成败。

#6。操作化:

  • 最后,团队运行一个试点项目来部署模型和测试实时环境。
  • 这种方法有助于了解小规模生产环境中的模型性能和相关约束,并在全面部署之前进行调整。
  • 团队准备完整的报告、简报、源代码和相关文档。

然而,如果结果与阶段 1 中的成功标准相反,团队可以在数据分析生命周期中向后移动到之前的任何阶段,以修改任何输入,从而获得不同的结果。

数据分析周期确实是一个迭代过程。

阅读时间很长,但我很高兴我们已经涵盖了数据分析生命周期的基础知识。

***QUICK QUESTION:******Remember the focus of this article is on data cleaning, what phase of the data analytics life cycle do you think data cleaning belongs to?***

如果你做到了这一步,给自己竖起大拇指。你做得很好!

Gif by Giphy

但是,我还有一个理论概念要讲,然后直接进入 Excel 中的数据清理!

很简短,我保证!

为了更好地理解我们想要在 Excel 中做什么,强调数据清理的一些好处是很重要的。

拿起你的咖啡,让我们开始吧!!!

什么是数据清洗?

照片由阿德利·瓦希德在 Unsplash 上拍摄

数据清理是数据需求阶段的一个关键步骤,您可能要在这个阶段花费大约 80%的时间。换句话说,这个阶段的其余部分很大程度上取决于您的数据有多干净。因此,建议你尽最大努力完成这项工作。

为什么要清洗数据?

清理数据的主要原因是为了在构建模型时获得准确的结果。例如,当您构建一个模型来预测销售额或用户是否会点击广告时,重复的条目会改变您的结果。更重要的是,干净的数据更容易阅读、理解,也更容易展示。

说到这里,让我们进入你期待已久的时刻。

告诉过你我会长话短说的!

挤眉弄眼

Excel 用于数据分析

作者图片

Microsoft Excel 是一种已经存在了一段时间的电子表格应用程序。它不仅用于存储结构化数据,还可以执行计算、可视化、构建模型等。尽管它已经存在了 30 多年,但它在行业中仍然有很大的相关性,因此是学习数据分析的一个很好的工具。

为什么要用 Excel 开始分析?为什么不是 Python?SQL?

除了 Excel 价格合理、处理能力要求较低(设备类型)之外,它还为数据分析中使用的其他工具奠定了坚实的基础。换句话说,更容易学习,在其中建立基础将加深你对分析过程的了解。

简单地说,当你知道 Excel 的时候,学习其他复杂的工具,比如 SQL,就会变得很容易。这将确保你有一个更好的过渡。

关于这一点,整个系列将涵盖 12 种用于清理 excel 中数据的技术和公式。

准备好潜水了吗??

拿些饼干,让我们开始吧!!!

由 Tamas Pap 在 Unsplash 上拍摄的照片

Two things to do before performing data cleaning;#1.Make a copy of your dataset.
#2.Spend some time to understand your data-is it a sales data? customer data? what features does it have?the features, datatypes.Doing the #2 will guide you into what to look out for when performing data cleaning.

以下是本系列教程将要讨论的 12 种技术:

  1. 调整列的大小
  2. 去掉前导和尾随空格。
  3. 删除单元格中的换行符
  4. 删除重复项
  5. 处理空白行和单元格
  6. 规范判决案例
  7. 数字格式
  8. 突出显示错误
  9. 将文本拆分成列
  10. 合并两列或更多列
  11. 查找和替换
  12. 表格格式

既然您已经了解了数据清理的概念和一些清理数据的 excel 技术,请直接跳到这里的,您将直接进入使用上述 15 种技术中的每一种的逐步过程。

The next two tutorials in this series will be structured below;**Tutorial 2: Techniques 1–6****Tutorial 3: Techniques 7–12****Tutorial 4: A complete Data Cleaning Project in Microsoft Excel.**

每个教程都有截图、视频短片、练习题来强化你的学习。

点击 这里 开始!!!!

希望你喜欢读这篇文章,就像我喜欢写这篇文章一样。

不要犹豫,在评论区提出你的问题和意见。

在 LinkedIn 上和我联系。

干杯!

** [## 数据可视化实用指南

towardsdatascience.com](/practical-guide-to-data-visualization-83e375b0037)**

时尚的数据分析:Excel 系列(# 2)-数据清理

原文:https://towardsdatascience.com/data-analytics-in-fashion-excel-series-2-8e29be44a306

Microsoft Excel 数据分析入门综合蓝图

照片由UX在 Unsplash 上拍摄

欢迎来到 Excel 系列教程 2。点击 此处 阅读教程#1。否则,继续下面的教程#2。

本教程中涉及的数据清理技术有:

  1. 调整列的大小
  2. 去掉前导和尾随空格。
  3. 删除单元格中的换行符
  4. 删除重复项
  5. 处理空白行和单元格
  6. 规范判决案例

使用的数据集是 Kaggle 的时尚数据集,您可以在这里访问它们> > >数据集 1 和数据集 2

我们开始吧!

#1。调整列的大小:

有时,当您将数据集导入 Excel 时,一些列看起来被压缩了,因此很难看到每个单元格中的完整值。下面的图 1 给出了一个例子。

作者图片:图 1

有不同的方法来解决这个问题,但更快的方法包括两个步骤。

**STEPS:**1.Select the **'all button'**(to the left of column 'A').
2.Double click on any of the boundary lines between the columns.

作者图片:图 2

作者图片:图 3

这将自动调整所有列的大小,如图 4 所示。

视频 1:调整列的大小

图 4 中显示了相同的数据,但现在看起来更具可读性。

作者图片:图 4

#2.去掉前导和尾随空格:

前导空格和尾随空格是出现在数据输入的开头、中间或结尾的不必要的空白,它们可能很难被发现。图 5 的 A 列中示出了一个例子。

要去掉这些空格,请使用修剪功能。

作者图片:图 5

语法:

=修剪(文本)

**STEPS:**1\. Place your cursor on the column (**ProductID**) you wish to clean, hit **Ctrl shift +** at the same time.
2\. Select**'Entire column**'as illustrated in Fig. 6a
3\. Click ok.(This will create a new column to the left of ProductID).

作者图片图 6a

4\. In the new column(column A),Type **=TRIM(B2)**;where B2 is the cell reference for ProductID. See Fig. 6b
5\. Press **ENTER** 6\. The result will be a cell with '1001743' and without the unwanted spaces as shown in Fig.7 and Video 2.

作者图片:图 6b

作者图片:图 7

如您所见,单元格 A2 中的值现在更靠近行,并且没有任何前导空格。接下来的几个步骤将指导您如何在 A2 列的其余行中复制结果。

7\. Select cell A2 (10017413),hover your cursur towards the the tiny square on the right side of the green triangle.
8\. Double click to automatically fill the rest of the row so that your result will look like Fig. 8

作者图片:图 8

现在我们已经清理了不需要的空间,我们需要删除其中一列,因为重复是不正确的。

按照以下步骤完成该过程。

**STEPS:**9\. Place your cursor on cell A2, press **Ctrl Shift Down arrow key** simultaneously to select the entire column.
10.Ctrl C to copy the values.
11.**Ctrl Shift Up arrow key** to go back up.
12.Select cell B2
13.Navigate to **Paste** in the Home Tab.
14\. Click the drop down arrow and select 'value' under the **paste values** session.**This will copy the values in column A into column B seamlessly.
See video 2 for a demo.**

在这之后,右键单击 A 列并选择删除。

视频 2:删除不需要的空间

PS:不要犯普通复制粘贴方法的错误,因为它不会给你预期的结果。

#3.移除单元格中的换行符:

手动换行符和非打印字符有时会出现在数据集中。要消除这种情况,请使用清洁功能。在某些情况下,CLEAN 和 TRIM 函数会一起使用,特别是当数据集很大并且不可能发现所有换行符和额外字符时。

例如,在本教程示例数据集中,看起来没有任何可见的换行符,但建议在处理不需要的空间时使用 CLEAN with TRIM,如上面第 2 条所述。

参考视频#3,了解如何组合两种功能。

视频 3:结合修剪和清洁功能

要复制和粘贴数值,请参考#3 中的步骤 9–14

#4.删除重复项:

数据集中有多个条目会影响分析和模型构建的准确性。因此你需要处理它。你要么先突出显示它,要么直接删除它。

删除重复数据:

Excel 允许您定义什么是重复项,还可以选择要删除重复项的列。

**STEPS:***Select Data > Remove Duplicates > Check the data has header > check columns to remove duplicates from > Click OK*

作者图片:图 9

作者图片:图 10

如果您的数据有标题,请确保选中标题框。

作者图片:图 11

视频 4:删除重复项

#5.处理空白行和单元格:

缺失的值会对结果产生重大影响,并且总是会影响您从中得出的结论。虽然有不同的方法来处理缺失的价值观,但最重要的是不要忽视它们。

您可以决定用“无”、“0”或任何其他单词来填充缺少的单元格。使用以下步骤高亮显示并填充空白单元格。

**STEPS:**1.Select the entire dataset.
2.Hit the F5 key to open the **'Go To'** dialogue box**.** 3**.Click Special >select blank> click ok** 4.Type what you want to fillin the blank cells
5.Press CNTRL ENTER to automatically fill the word in all the blank cells.

作者图片:图 12

作者图片:图 13

PS:输入‘缺失值’后,记得按 Ctrl ENTER。如果您单独按 ENTER 键,您键入的单词将只出现在一个单元格中,其他空白单元格仍将保持空白。

视频 5:填补空白

作者图片:图 14

#6 标准化判决案例

使用数据集的另一个常见情况是不一致的句子情况。例如,一个列可能有大写、小写和大写的组合。您可以使用三个函数将整列转换为最合适的句子大小写。

=LOWER()—将所有文本转换为小写。
=UPPER() —将所有文本转换为大写。
=正确—将所有文本转换成正确的大小写。

**STEPS:** 1.Create a new column next to the ProductBand.
2.Type =PROPER(C2)-Where C2 is the cell reference of 'DKNY' in column C.(Fig.15)
3.Press Enter and you should have 'DKNY' converted to 'Dkny'.
4.Follow the procedure in the video to replicate the result in the rest of the rows.

作者图片:图 15

作者图片:图 16

同样,我们不能有重复的列,所以决定你喜欢的句子大小写,并参考#2 关于如何复制和粘贴值。然后删除不需要的列。

Follow the steps used in =PROPER()to apply the =LOWER()and =UPPER()functions.Refer to video 6 for a demo of the three functions.

视频 6:改变句子大小写

结论

很好的完成了总结部分。如果你有任何问题、反馈或特殊要求,请不要犹豫,在评论区提出,或者通过 LinkedIn 联系我。如果你还没有阅读第一篇文章,点击这里开始阅读。

此外,这些只是 Excel 中使用的一些数据清理技术。在下一个教程中,我将讨论更多的 6,然后做一个完整的数据清理项目。

听起来不错?

回头见!

希望你喜欢读这篇文章,就像我喜欢写它一样。

不要犹豫,在评论区提出你的问题和贡献。

在 LinkedIn 上与我联系。

干杯!

[## 数据可视化实用指南

towardsdatascience.com](/practical-guide-to-data-visualization-83e375b0037)

人工智能初创公司的数据分析原则

原文:https://towardsdatascience.com/data-analytics-principles-at-an-ai-startup-eebbdb208c55

数据分析和机器学习科学方法的规则

蒂姆·高在 Unsplash 上拍摄的照片

我在 SaaS 空间的一家健康创业公司工作,作为一名数据科学家,我的职责主要是生成可重复的分析和构建信息丰富的机器学习模型。虽然这似乎是一个相当标准的角色,但我认为在如何实现这一点上,比一些局外人(甚至是数据科学家自己)可能想象的要紧张得多。

数据科学经常在两个极端之间摇摆:确保工作的输出是完美的,或者关注产生输出的代码。不幸的是,这种不平衡的方法导致了双方的问题。只考虑最终产品会降低代码的正确性和可再现性,并导致产生大量的技术债务。相反,像软件开发人员一样迂腐地编写代码会降低数据科学团队的敏捷性,并阻止他们快速迭代实验以找到“足够好”的解决方案。在这里,我的目标是概述我公司的数据科学团队使用的过程,以在两个极端之间取得适当的平衡。

项目模板减少了开销

Cookiecutter 数据科学的人认为我们的工作应该是正确的和可重复的。达到这种平衡是困难的,为此他们提倡在项目间使用标准模板,可以根据需要进行修改。对此的主要论点是:

  • 原始数据应该是不可变的,因此数据应该以结构化的方式存储,这意味着您只处理原始数据,而不覆盖它。
  • 虽然笔记本很适合探索,但它们不太擅长复制分析。为此,笔记本应该与脚本分开。这创造了一种共生和自我维持的关系:笔记本中的代码可以重构为脚本,脚本可以用于在笔记本中进行进一步的分析和探索。
  • 结构允许容易再现的计算环境。

这种组织结构也有助于文档化。当每个项目都有相同的结构时,人们知道去哪里找代码。他们花在如何安排回购上的时间要少得多,这很累,而且会消耗掉原本可以用于贡献的精力。

我使用 Cookiecutter 模板的一个项目的自述文件(图片由作者提供)。

使用实验跟踪器

大多数人最初都很难习惯机器学习模型的版本控制。我知道我做到了。当我第一次开始将深度学习应用于工作中的问题时,我的大多数结果都是随意保存的。我会有一个 csv 列表,其名称类似于 model_run_3_tweak_lr.csv ,以及另一个包含不同特征工程的不同数据集的完整列表。事情很快变得非常混乱。

幸运的是,我发现了权重和偏差,它允许团队快速迭代不同的模型,持续评估标准度量,并执行超参数调整。这导致了更好的再现性和对产生模型的过程的更好理解。当我写一篇涉及长期预测视力的论文时,我严重依赖 WandB,仅仅是因为我必须调整的超参数的数量。

一个 WandB 仪表板示例,我在预测患者视力时用来跟踪实验(图片由作者提供)。

使用最容易理解的格式,而不是最流行的

一段时间以来,我在工作中面临的一个问题是如何向我们产品的客户呈现回顾性和实时数据。这两种类型的数据以不同的方式存储。以前,我一直在尝试许多不同的压缩分析方法,比如 Plotly 仪表盘、元数据库页面和简单的复制粘贴到谷歌文档。正如你可能猜到的,这是站不住脚的。

有一天,我写了一个脚本来接收客户的回顾性数据,生成大量具有各种结果的 CSV,将这些 CSV 传送到一个 R-script,该脚本将为我生成一些漂亮的ggplot数据,然后返回到另一个脚本,该脚本收集所有这些数据并将其转储到 Google Drive 中的一个文件夹。我认为这很棒,但我意识到这对我们公司没有多大用处时已经太晚了。其中一个分析人员仍然不得不将文件夹中的所有内容移动到一个漂亮的文档中。

在尝试了许多其他解决方案后,我选定了一个非常简单的方案。我仍然有我的分析脚本,但是我会从一个笔记本中调用它们(它本身是从一个模板中复制的)。在确保客户的数据格式正确后,我将文件路径输入笔记本,这将在笔记本中生成我需要的所有内容(图表等)。).我会插入一些注释,并使用 Quarto 将 Jupyter 笔记本转换为交互式 HTML 文档,并隐藏代码。我在公司的第一份回顾报告花了我大约 3 个月的时间。现在,我可以在不到五分钟的时间内生成回顾性的标准化数据报告。保持简单。

使用 Quarto 生成的匿名 HTML 报告示例(图片由作者提供)。

当解决方案不起作用时承认

几个月前,当我训练 NLP 模型从自由文本中提取客户数据时,出现了一个完美的例子。使用虚拟数据的原始模型非常好:在微调了 HuggingFace 的 DistilBERT 问答模型后,我在所有问题的 F 分数和精确匹配上都得到了 90 分以上。然而,随着更多真实世界的数据开始出现,它开始占用我的时间:

  • 我必须标记至少几个数据实例,以便让模型有所学习
  • 这是非常具体的行话,所以无监督学习效果不好
  • 该模型似乎不愿意学习数据中存在的所有异常值

即使经过一个多月的努力,我最终还是得到了相当差的结果。我决定用老办法,写一堆硬编码的规则来提取我们的信息。这是一个更好的解决方案,我希望我能早点这么做,而不是被大型语言模型和迁移学习的诱惑所诱惑。

结论

显然,这些并不是包罗万象的规则,只是我在过去几年里学到的一些好的指导原则。我相信,随着我编写更多的意大利面条式代码,将更大的神经网络应用于基本问题,并在未来的项目中摸索前进,我会继续添加它们。但这就是你学习的方式!

影响 2022 年的 6 大数据科学趋势

原文:https://towardsdatascience.com/data-analytics-trends-that-will-shape-2022-ed5a974af41c

对这个不断发展的行业的未来工作的叙述

艾萨克·史密斯在 Unsplash 上拍摄的照片

新的一年总是以决心开始,这是对新的学习、成长和回顾的强烈爱好。

就这样,对于数据行业来说,这也是新的一年。我们已经看到,截至 2025 年,人们每天将产生 463 的数据。在当今不断发展的技术世界中,随着每天创建的数据呈指数级增长,企业需要重视数据及其成果。

数据和分析是任何业务决策和数字革命的基石。在当今的数字时代,我们作为数据创造者和消费者所接触的“趋势”的数量不足为奇。趋势从来都不是一成不变的,只有了解一些将塑造 2022 年和数据专业人员职位描述前景的数据和分析趋势才有意义。

以下是我列出的 2022 年的一些趋势:

1.小数据是人工智能的未来

这只是昨天的一次演讲,我们学习了大数据分析和工具来处理太大或太复杂的数据集,我们已经在处理人性化的数据了。

六个月前,我开始了我的第一份数据分析师工作,我一直认为大数据是组织日常工作的基础。然而,今天我不会完全袖手旁观。企业更感兴趣的是具有可管理的数据量和可访问性、信息性和可操作性的数据格式。

小数据都是关于人的。

数据——无论大小,都是基于的容量、速度和多样性。

通过工作和阅读新技术,我相信大数据正接近停滞。越来越多的公司在收集和使用大数据集方面日趋成熟,而接下来的话题是什么?已经开始,围绕管理大数据的技能、预算、设计原则和资源的问题也达到了顶峰。2022 年,越来越多的公司将开始转向自动化,使用小数据集作为其数据战略的下一阶段。

以人为中心的数据分析是要记住的关键词。

2.面向业务增长和速度的可扩展人工智能

今天的业务是统计学、系统架构、机器学习部署、数据挖掘等等之间的融合。对于一致性而言,将这些组件组合成灵活且可扩展的模型以分析互联网规模的大量数据非常重要。以下是你需要学习/了解更多可扩展 AI 的原因。

根据定义,可扩展人工智能是算法、数据模型和基础设施以任务所需的规模、速度和复杂性运行的能力。

当我们谈到数据模型和管理时,可伸缩性加起来克服了高质量数据的稀缺和收集问题,并可用于通过重用和重组功能来扩展跨业务问题陈述,从而促进数据的可持续性。

ML 和 AI 开发的可扩展性将要求您建立数据管道的生产和部署,创建可扩展的系统架构和现代采集实践,以保持先进的 ML 和 AI 能力,利用 AI 技术的快速创新。

可扩展的算法和基础设施转向将人工智能的力量应用于关键任务,包括集中式数据中心功能和边缘设备的分布式云支持和网络支持应用。

听起来很简单,可扩展的人工智能很难;将可扩展性的多个组件与业务保持一致,确保增强的技术性能,应对数据量和系统的集成挑战,当然还有数据安全性!2022 年,企业将需要人们来解决这些挑战,并开发一个有凝聚力的建模工作流程。

3.提高网络安全

回到研究生院(2019 年至 2021 年),我的网络安全教授预测了未来几年的五种趋势,但我肯定没有想到自己会早在 2022 年就写出这些趋势。每个季度,关于网络安全的企业培训都会发生多重变化。

  1. 日益增长的勒索病毒威胁 随着在线和数字环境中的活动呈指数级增长,网络钓鱼攻击和恶意软件已不再是新词。加密货币的日益流行为赎金和数据交换创造了前所未有的通道
  2. 社会工程骗局将会非常奏效 疫情无疑已经影响了人类的心理,其注意力持续时间更短,工作动力更低,随着这些漏洞的广泛暴露,没有合规、风险管理行动或企业课程能够迎合人们比以往任何时候都更容易上当受骗的事实
  3. 勒索软件即服务即业务 科技行业担心勒索软件即服务(RaaS)是一种蓬勃发展的数字勒索业务,有各种各样的勒索软件威胁参与者。财富 500 强、小型企业或中端市场的目标规模对于勒索软件攻击来说似乎不够有利可图

企业需要风险缓解工具,并为不断增长的攻击途径做好准备!

随着我们迈向 2022 年,整个 WFH 的景观、不断发展的社会数字化以及我们生活中越来越在线的性质为网络钓鱼者、黑客、骗子和勒索者打开了机会的海洋。正因为如此,个人学习更多网络安全知识,企业雇佣更多此类专业人士,才显得至关重要。

4.云计算的兴起

每天,越来越多的企业在云迁移方面投入资源和资金,以实现零净目标:从缩短上市时间或市场份额到最终增强客户体验。

2022 年采用云的原因:

  1. 减少碳排放——从 2021 年到 2024 年,继续采用云计算可以减少超过 10 亿公吨的二氧化碳排放(IDC 预测)
  2. 从客户的角度来看,云操作快速、轻便且易于交互
  3. 能否在多云和联合云提供商产品上合作,加快上市时间和战略
  4. 与新兴技术兼容,减少处理时间,提高运营效率

友好的邻居建议:如果你能在你的公司推动数据革命,绝对值得推介云迁移——这将是一个更大的数据工程计划,但现在是时候转向了!从大规模处理不可预测的实时数据,到最终用户和数据分发之间更快的连接,能力在于云。

5.以人为中心的数据科学和分析

人类及其情感是世界上几乎一切事物的驱动因素;从战争到和平,每一次遭遇背后的感悟和引发的情绪都是精华。随着我们越来越依赖技术,成功将意味着与人类互动。

我看到越来越多的研究文章、白皮书和博客谈论理解并使人类能够探索和获得洞察力,最终使人类和企业都受益。当我说以人为中心的数据计划时,它不是客户体验或情感分析或人类交互平台的视觉分析。它是昂贵的。

6 年前,我读了唐纳德·诺曼的《日常用品的设计》(当时我想从事用户体验设计)。他书中关于日常设计的简单、颠覆性和引人注目的想法是工程学和人类心理学之间的完美融合。类似的书籍继续启发用户体验设计领域(UX),也就是以人为中心的设计(HCD)。

虽然一些企业仍在探索进入数据科学世界的道路,但数据专业人士预计,在人们开始真正将对人类的研究纳入设计工程之前,产品设计会以同样的方式失败(或者有些可能已经失败)。

在与用户体验设计和现在的数据广泛合作之后,我对我所说的话很有信心—

以人为中心的数据科学是下一件大事!

对于数据分析师、科学家或机器学习工程师来说,超越数据建模的日常设计是多么重要,我怎么强调都不为过。人性化数据背后的逻辑很简单——数据科学的产品并不总是有形的。为了有效地交流结果和见解,我们必须从以人为中心的设计中汲取理念,以改善数据科学产品的用户体验,并利用各种途径来掌握数据科学实施的成功路线图。

啊,我需要写一个关于以人为中心的数据的独立博客!!

6.提升性能的预测分析

一次又一次,我喜欢阅读企业如何使用分析来提高他们的绩效和体验。

谁不喜欢预见未来,做好最好的准备呢?

当今的企业需要预测模型来预测用于历史数据的趋势和行为。人力资源正在使用员工保留模型来提高组织的绩效,商店正在使用数据来预测客户的购买模式,比如电子商务与零售商店,以便在更深、更个性化的层面上更好地了解客户。

预测分析营销是新的革命。

简而言之,新的一年将会看到无限的企业和行业(从金融到医疗保健,从零售到制造,从房地产到流媒体平台)利用预测分析,通过识别未来价值、客户行为、构建更好的产品和提供卓越的服务来提高盈利能力,从而获得收益。

这就是我的博客的结尾。感谢您的阅读!请在评论中让我知道你目前正在从事什么数据科学项目,以及你是否也在遵循你的项目流程!

如果你喜欢阅读这样的故事,可以考虑使用 这个链接 注册成为一名中等会员!

数据帐篷快乐!

Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造富有洞察力的故事来传达商业见解。她是一名全职的医疗保健数据分析师,周末喝一杯热巧克力,写一些关于数据的博客

使用 DVC 进行数据和机器学习模型版本控制

原文:https://towardsdatascience.com/data-and-machine-learning-model-versioning-with-dvc-34fdadd06b15

DVC:这是一个 Git,但对于我们的数据和 ML 模型

由卢卡·布拉沃在 Unsplash 拍摄的照片

我想我们都同意,每个数据科学项目都很有可能变得极其混乱。数据科学项目中有三种常见的混乱来源:代码数据ML 模型

以下是数据科学项目中源于数据、ML 模型或代码的混乱的一些例子:

  • 数据 ➡️我们实现哪些 ML 模型并不重要,它们都需要几组特征,这些特征需要在训练过程之前进行预处理。问题是,我们不知道哪些特性或预处理技术最适合我们的模型。因此,我们很可能最终会创建数据集的几个版本,每个版本都使用不同的转换或特征工程技术。
  • ML 模型 ➡️每个模型都有需要微调的超参数。然而,我们不太可能知道超参数的组合会给我们最好的结果,所以最有可能的是,我们最终会有几个版本的模型。
  • 代码 ➡️为数据预处理管道和模型训练开发脚本不是一个线性的过程。因此,我们需要不断地更改/更新几行代码来调整模型的超参数值,或者添加/删除数据管道步骤。

由于上述问题,接下来可能会发生以下情况:

作者图片

经过大量的实验后,我们假设model_2.pkl给出了目前为止我们训练的三个模型中最好的结果。如果没有适当的方法来构建我们的数据科学项目,我们最终可能会问自己以下任何(如果不是全部)问题:

  • 我们使用了哪些数据和预处理技术来训练这个模型?
  • 我们用来获得这个模型的超参数设置是什么?
  • 如果我们忘记了用于训练该模型的数据和超参数设置,那么有人如何能够再现该实验以获得相同的模型呢?

现在想象一下,我们项目的复杂性呈指数增长,在数据科学项目中重现任何实验都变得极其困难。

去救援吗?

为了解决上面的问题,我们可以使用 Git,这是一个版本控制来跟踪我们的代码。使用 Git,您可以在不同版本的代码之间来回切换。

然而,Git 并不是解决数据科学项目再现性问题的最佳解决方案,因为:

  • Git 主要设计用于存储文本文件,通常不能很好地跟踪二进制文件(例如数据集)的变化。
  • Git-LFS 使我们能够在 Git 上构建时存储大文件,它需要一个特殊的服务器,并且有文件大小限制,当我们想要存储巨大的数据集和模型时,这可能是一个问题。

相反,我们想要的是一个专门为数据科学问题设计的控制版本系统。这意味着控制版本系统:

  • 允许我们选择存储服务来托管我们的数据和模型,同时还允许我们在不同版本的数据和模型之间轻松切换。
  • 允许我们根据特定版本的数据集或模型重现数据科学问题的结果。

这也是 DVC 对我们非常有帮助的地方。

什么是 DVC?

DVC 代表数据版本控制。这是一个开源工具,允许我们轻松地对我们的数据、ML 模型、度量文件等进行版本控制。如果你了解 Git,那么就很容易理解 DVC 是如何工作的,因为 Git 和 DVC 有很多相似之处:

  • DVC 和 Git 有相似的概念和语法,但是它主要是被设计来跟踪我们的数据、ML 模型、度量等等。
  • DVC 与 Git 无缝协作,我们将看到如何利用两者来一次轻松地对源代码、数据和 ML 模型进行版本控制。

DVC 的一个主要优势是,它允许我们在自己选择的存储服务中存储不同版本的数据。这可以在亚马逊 S3,谷歌驱动,Azure,谷歌云存储,或者只是在我们的本地机器上。

DVC 通过生成一个指向数据或模型的特定版本的轻量级文本文件来跟踪我们的数据或模型的不同版本。每当我们想从远程存储或缓存中获取数据集或模型的特定版本时,DVC 都会使用这个文本文件。

作者图片

我们通常用 Git 将这个小文本文件和所有代码存储在一起。所以最终,我们在 Git repo 中只有代码和这个轻量级的文本文件,而实际的数据和模型驻留在我们选择的远程存储中。

现在让我们开始实施 DVC。

入门指南

在本文中,我们将了解如何使用 DVC 跟踪不同版本的数据集和 ML 模型。此外,我们将了解如何使用它在不同版本的数据集和 ML 模型之间来回切换。

如果您还没有这样做,您可以使用 pip install 安装 DVC:

pip install dvc

我们首先需要做的是在本地计算机上创建一个空文件夹,作为我们的本地 repo。为了简单起见,我们称这个文件夹为dvc-project

接下来,要使这个文件夹成为本地 repo,我们需要在终端中使用以下命令初始化这个文件夹中的 Git 和 DVC:

$ cd dvc-project
$ git init
$ dvc init

如果一切顺利,您将在命令行中得到以下消息:

作者图片

在我们初始化 DVC 之后,在我们的dvc-project文件夹中创建了一个名为.dvc/的目录来存储配置文件、缓存位置和其他内部目录。当你输入git status命令时,你可以看到它们是在文件夹中创建的。

作者图片

接下来,我们需要指定我们的远程存储,即我们存储不同版本的数据和 ML 模型的实际存储。这可以是谷歌驱动、亚马逊 S3、谷歌云存储、Azure 存储,或者在你的本地机器上。通常,您可以使用以下命令设置远程存储:

$ dvc remote add -d remote path/to/remote

在本文中,我们将使用 Google Drive,因为我相信任何人都有 Google Drive。要用 DVC 在 Google Drive 上设置我们的远程存储,我们可以执行以下简单的命令:

$ dvc remote add -d remote gdrive://{random numbers+letters}

每当你打开 Google Drive 时,你在那里创建的任何文件夹的 URL 看起来都会像这样:

[https://drive.google.com/drive/u/0/folders/1v1cBGN9vS9NT6-t6QhJG](https://drive.google.com/drive/u/0/folders/1v1cBGN9vS9NT6-t6QhJGiNxshTu-7dFw)

只需将上面包含数字和字母组合的 URL 部分复制到上面的 DVC 命令中。在上面的例子中,这将是:

$ dvc remote add -d remote gdrive://[1v1cBGN9vS9NT6-t6QhJG](https://drive.google.com/drive/u/0/folders/1v1cBGN9vS9NT6-t6QhJGiNxshTu-7dFw)

要检查远程存储是否已正确设置,我们可以使用以下命令:

$ dvc config -l

最后,由于我们刚刚通知了 DVC 我们的远程存储在哪里,那么.dvc/目录中的配置文件也将被更新。为了跟踪这一更新,git add命令将完成这项工作。

git add .dvc/config

我们都准备好了!现在我们可以开始和 DVC 一起玩了。

数据版本化

我们将在本文中使用的数据是 Twitter 情感数据集的子集。该数据集不受版权保护,因此您可以出于自己的目的使用它。我将数据集分成两部分:一部分叫做twitter_1.csv,另一部分叫做twitter_2.csv

数据的第一版本

这个数据集的第一个版本就是最初的twitter_1.csvtwitter_2.csv。要获得这些数据,只需复制下面的两个dvc get-url命令:

$ dvc get-url [https://dagshub.com/marcellusruben/twitter_data/raw/00d21f134ed9449ab55d732dd8030a45284142df/twitter_1.csv](https://dagshub.com/marcellusruben/twitter_data/raw/00d21f134ed9449ab55d732dd8030a45284142df/twitter_1.csv)$ dvc get-url [https://dagshub.com/marcellusruben/twitter_data/raw/00d21f134ed9449ab55d732dd8030a45284142df/twitter_2.csv](https://dagshub.com/marcellusruben/twitter_data/raw/00d21f134ed9449ab55d732dd8030a45284142df/twitter_2.csv)

现在如果你看一下你的dvc-project文件夹,你会看到现在你有twitter_1.csvtwitter_2.csv。这两个文件都有大约 2,5 MB 的内存。

作为第一步,让我们将这些文件存储到我们的远程存储中,这是我们在上一节中设置的 Google Drive。要将我们的 CSV 文件推入远程存储,首先我们需要用dvc add命令跟踪这两个文件:

$ dvc add twitter_1.csv twitter_2.csv

当我们使用dvc add命令时,我们基本上是告诉 DVC,在我们将这两个文件上传到远程存储之前,我们希望 DVC 跟踪并准备好这两个文件。该命令类似于git add命令。

在这个dvc add命令之后,运行git status命令,您将看到类似的输出,如下所示:

作者图片

dvc add命令之后生成了 3 个新文件:一个.gitignore文件和与我们的数据集名称相似的文件,最后带有附加的.dvc扩展名。

  • .gitignore文件告诉 Git 忽略我们用 DVC ( twitter_1.csvtwitter_2.csv)跟踪的数据集
  • 扩展名为.dvc的文件是文本文件,它将充当指向实际数据集的指针。例如,twitter_1.csv.dvc是指向twitter_1.csv数据的指针。

如前一节所述,Git 将跟踪这些指针文件。通过跟踪指针文件而不是实际数据,我们就不再在 Git repo 中存储大文件(比如实际数据集)。

接下来,我们可以使用dvc push命令将数据推入远程存储:

$ dvc push

如果你看一下你的 Google Drive,现在你应该有如下类似的文件夹:

作者图片

使用dvc push命令推送数据集后,您在 Google Drive 或远程存储上看到的文件称为 blob,正如您在上面的截图中看到的。DVC 将原始数据集的内容存储在这个 blob 中。

现在,让我们保存数据的当前版本,以便以后我们可以随时访问它。以下是执行此操作的步骤:

  • 使用git add命令用 Git 跟踪.gitignore文件和扩展名为.dvc的文件
  • git commit提交文件,然后在提交过程中写一些有意义的消息
  • 向 commit with git tag命令添加一个有意义的标记。这个命令很重要,因为当我们稍后想要在数据集的不同版本之间切换时,这个标签就是我们要参考的
$ git add .gitignore twitter_1.csv.dvc twitter_2.csv.dvc
$ git commit -m "Dataset V1.0"
$ git tag v1.0

这就是我们数据的第一个版本。以下是我们迄今为止所做工作的示例:

作者图片

数据的第二个版本

对于数据的第二个版本,假设我们想要修改我们的twitter_1.csv。也就是说,我们想要将twitter_2.csv的所有内容添加到twitter_1.csv中:

**With Mac/Linux**
$ cat <(tail +2 twitter_2.csv) >> twitter_1.csv**With Windows**
$ more +2 twitter_2.csv >> twitter_1.csv

如果你看看它的大小,imdb_review_1.csv现在有大约 5 MB 的内存,是以前数据的两倍。如果我们键入dvc status命令,您会看到一个通知,告知我们的imdb_review_1.csv数据已被修改。

作者图片

接下来,让我们用 DVC 跟踪修改后的数据。和以前一样,我们使用dvc add命令来实现这个目的。

$ dvc add twitter_1.csv twitter_2.csv

现在让我们用push命令将修改后的文件推送到远程存储器。

$ dvc push

你应该会看到你的 Google Drive 上多了一个文件夹,而不是两个。这是因为只有twitter_1.csv被修改,而twitter_2.csv保持不变。

作者图片

dvc add命令之后,可能会发生两件事:

  • 如果我们添加/跟踪一个新文件(或者在我们的例子中是一个新的 CSV 文件),那么对应于这个新文件的一个新的.dvc指针文件将被创建
  • 如果我们添加/跟踪一个现有文件,但其内容已被修改,那么其现有的.dvc指针文件也将被修改,而不会创建新的文件

由于我们只修改了twitter_1.csv,那么它的.dvc文件也会被修改,而twitter_2.csv.dvc文件保持不变。Git 会自动识别修改后的.dvc文件,如下所示:

作者图片

我们需要再次用 Git 跟踪更新后的文件,提交它,然后在提交时添加一个有意义的标记,如下所示:

$ git add twitter_1.csv.dvc
$ git commit -m "Dataset V2.0"
$ git tag v2.0

这就是我们数据的第二个版本。以下是我们在拥有两个版本的数据后目前所拥有的数据的图示:

作者图片

切换不同版本的数据

现在,假设我们想要恢复到数据的第一个版本。我们可以通过输入git checkout <tag>命令来完成。

之前在第一次提交时,我们将标签v1.0包含在提交中。因此,我们可以使用以下命令获取数据的第一个版本:

$ git checkout v1.0
$ dvc pull

在执行完dvc pull命令后,您会注意到我们的twitter_1.csv数据集不再有 5 MB 的内存。相反,它有 2,5 MB 的内存,就像它在开始时一样。

就是这样!我们已经成功地将数据集恢复到了以前的版本。使用同样的方法,您可以通过以下方式恢复到数据集的较新版本(即添加twitter_2.csv后的twitter_1.csv):

$ git checkout v2.0
$ dvc pull

或者,如果您只想获取特定版本中的特定数据,例如twitter_1.csv1.0 版,但仍想将twitter_2.csv保留在 2.0 版中,您可以在dvc pull命令中添加您想要获取的数据的规格,如下所示:

$ git checkout v1.0
$ dvc pull twitter_1.csv

模型版本控制

同样的概念也可以应用于 ML 模型的版本化。为了演示如何做到这一点,我们将使用一个 ML 模型来预测一条推文的情绪:这条推文是正面情绪还是负面情绪。我们的数据集将是我们在上一节中使用的twitter_1.csv

第一步,还是在我们的dvc-project文件夹中,让我们通过下面的命令下载源代码:

$ dvc get-url [https://dagshub.com/marcellusruben/twitter_data/raw/00d21f134ed9449ab55d732dd8030a45284142df/train_evaluate.py](https://dagshub.com/marcellusruben/twitter_data/raw/00d21f134ed9449ab55d732dd8030a45284142df/train_evaluate.py)

这个train_and_evaluate.py脚本执行以下操作:

  • 使用所选数据集训练模型,在我们的例子中,这将是twitter_1.csv
  • 将训练期间每个历元的精度值记录到名为history.json的 JSON 文件中
  • 将训练好的模型保存为.h5格式
  • 在测试集上评估训练模型的准确性,并将准确性结果写入名为evaluation.json的 JSON 文件中

为了确保您能够运行脚本,pip 安装以下要求:

nltk==3.6.5
numpy==1.23.3
pandas==1.3.4
PyYAML==6.0
scikit_learn==1.1.1
tensorflow==2.9.1

此外,我们还应该通过复制以下命令下载一个名为params.yaml的 YAML 文件:

$ dvc get-url [https://dagshub.com/marcellusruben/imdb-data/raw/3420f431a91b8bd7dc8952302338873af2d6e733/params.yaml](https://dagshub.com/marcellusruben/twitter_data/raw/7a6f7a4c6cf1506a22780c15b207c280c69c59ac/params.yaml)

该文件包含我们可以调整的 ML 模型的一个超参数值,即 LSTM 层数。

模型的第一个版本

对于模型的第一个版本,我们将使用params.yaml中的默认超参数值训练模型,其中 LSTM 的输出层设置为 16。

当我们有一个脚本,它将一些东西作为输入,然后输出结果,那么我们可以使用dvc run命令从 DVC 自动捕获:

$ dvc run -n train-and-evaluate -d train_evaluate.py -p train.lstm_out -o model.h5 --plots-no-cache history.json -M evaluation.json python train_evaluate.py twitter_1.csv

上面的命令中有很多参数,所以让我们逐个分析它们:

  • -n:给我们的管道起一个合适的名字,这样当我们想要重现结果或者以后改变什么的时候就可以很容易地调用它。在上面的例子中,我们称我们的管道为train-and-evaluate
  • -d:告诉 DVC 我们的管道train-and-evaluate依赖于哪个文件。在上面的例子中,我们的管道依赖于我们的train_evaluate.py脚本。
  • -p:指定path中参数文件的参数依赖关系。默认情况下,它会查看params.yaml中的参数。在我们的例子中,这将是我们之前下载的params.yaml中 LSTM 图层的数量。
  • -o:告诉 DVC 自动跟踪运行脚本后的输出。我们的train-evaluate.py脚本将生成一个名为model.h5的经过训练的模型。这类似于我们在上一节中看到的独立的dvc add命令
  • -M:指定一个度量文件,这样我们可以在测试集上用dvc metrics评估和比较模型性能。因为我们的脚本生成了一个名为evaluation.json的度量文件,所以我们可以使用这个命令
  • --plots-no-cache:指定一个绘图文件,以便我们稍后可以用dvc plots创建或比较一些可视化。我们的脚本在名为history.json的文件中生成训练期间每个时期的模型精度,因此我们可以使用这个命令
  • 告诉 DVC 运行管道

在我们用上面的dvc run命令运行脚本后,您会看到一个名为dvc.yaml的新的重要文件。

作者图片

这个文件为我们提供了关于train-and-evaluate管道的必要信息:它依赖于哪个脚本,它将生成和跟踪哪个输出文件,哪个文件将作为度量或绘图,等等。

除了dvc.yaml,还有一个叫做dvc.lock的附加文件,看起来像这样:

作者图片

dvc.lock文件允许 DVC 跟踪依赖值的变化,即与我们之前的运行相比,我们是否改变了params.yaml中的超参数值。它还跟踪特定 DVC 管道的每个输出文件的哈希。

现在,如果我们想在测试集上评估训练模型的性能,我们可以使用dvc metrics命令,如下所示:

$ dvc metrics show

作者图片

我们还可以可视化我们模型的训练历史。首先我们需要告诉 DVC 哪个变量会在轴和轴。在history.json里面,我们有两个变量:精度历元。我们将使用 x 轴中的历元和 y 轴 中的精度。最后,我们用dvc plot来可视化剧情。**

**$ dvc plots modify history.json -x epochs -y accuracy
$ dvc plots show**

在该命令之后,您应该会看到一个链接,在该链接中您可以在浏览器中看到可视化效果。

作者图片

现在让我们将自动跟踪的model.h5推入我们的 Google Drive,用 Git 跟踪所有其他文件(dvc.yamlevaluation.jsonhistory.jsontrain_evaluate.pydvc.lock),然后提交它们:

**$ dvc push
$ git add .
$ git commit -m "data_model_v1"
$ git tag data_model_v1**

这就是我们模型的第一个版本!

模型的第二个版本

假设我们想做另一个实验,看看如果我们将params.yaml中的 LSTM 层从 16 层改为 2 层,模型的性能是否会提高。

作者图片

现在,我们可以通过使用dvc repro命令调用train-and-evaluate管道,用新的超参数值重新训练我们的模型:

**$ dvc repro train-and-evaluate**

脚本运行完成后,我们将更新的model.h5推送到我们的 Google Drive,用 Git 跟踪其他更新的文件(dvc.yamlevaluation.jsonhistory.jsontrain_evaluate.pydvc.lock),然后提交它们:

**$ dvc push
$ git add .
$ git commit -m "data_and_model_v2"
$ git tag data_model_v2**

这就结束了模型的第二个版本!

切换不同版本的模型

现在有趣的部分是,我们可以在使用 DVC 的提交之间比较不同版本的 ML 模型的性能。为此,我们可以使用以下命令:

**$ dvc metrics diff [tag commit 1] [tag commit 2]
$ dvc metrics diff data_model_v2 data_model_v1**

作者图片

我们还可以使用以下命令比较提交之间不同版本模型的培训历史的可视化:

**$ dvc plots diff [tag commit 1] [tag commit 2]
$ dvc plots diff data_model_v2 data_model_v1**

作者图片

正如你所看到的,我们以前的模型在训练集和测试集上都有更好的准确性。因此,我们想回到以前的版本是合乎逻辑的。正如你已经知道的,我们可以用git checkoutdvc pull command来做这件事。

**$ git checkout data_model_v1
$ dvc pull**

为了确保我们真的回到了之前的版本,让我们再次运行dvc metrics:

**$ dvc metrics show**

您会看到我们的模型的性能与我们的第一个模型相同,在我的例子中是 89.1%。

作者图片

如果你打开params.yml,你还会看到 LSTM 层输出的值转换回 16,这是我们的默认设置,也是我们第一个模型被训练的超参数值。

结论

在本文中,我们看到了 DVC 如何以多种方式帮助我们组织数据科学项目:

  • DVC 将我们的数据科学项目与 Git 无缝集成。它也有和 Git 相似的语法,因此如果你已经知道 Git,学习曲线不会太陡
  • DVC 使用亚马逊 S3、Azure、谷歌云、谷歌驱动、HDFS 等流行的存储服务来存储不同版本的数据和模型
  • DVC 加强了可再现性,因为我们可以轻松地重新运行具有特定相关性的流水线,并再现结果,而无需考虑使用哪个数据、超参数值或代码版本。
  • DVC 让我们很容易与其他团队成员分享我们项目的进展

你可以自己探索 DVC 的更多功能,我希望这篇文章对你开始使用 DVC 有所帮助!

将提高您工作效率的数据和系统可视化工具

原文:https://towardsdatascience.com/data-and-system-visualization-tools-that-will-boost-your-productivity-e971c1aed5eb

这些可视化工具将帮助您探索和管理复杂的文件、开发环境等,从而提高您的工作效率

米拉德·法库里安在 Unsplash 上拍摄的照片

随着文件、数据集和配置的增长,浏览它们变得越来越困难。然而,有许多工具可以帮助您在处理大型 JSON 和 YAML 文件、复杂的正则表达式、混乱的 SQL 数据库关系、复杂的开发环境以及许多其他问题时更有效率。

JSON

JSON 是适合计算机的格式之一,但不适合人类。即使相对较小 JSON 对象也很难读取和遍历,但是有一个工具可以帮助您!

JSON 编辑器—作者图片

JSON Visio 是一个从 JSON 对象生成图表的工具。这些图表比文本格式更容易导航,为了使它更加方便,该工具还允许您搜索节点。此外,生成的图表也可以作为图像下载。

你可以在https://jsonvisio.com/editor使用网页版,也可以在本地作为 Docker 容器运行。

正则表达式

正则表达式(RegEx)因极其难以阅读而臭名昭著。我推荐两个工具来帮助理解复杂的正则表达式——第一个是 https://regex101.com/:

RegEx 101 —作者图片

这可以帮助您构建和测试正则表达式,以及分解它们并识别其各个部分。

第二个是https://regex-vis.com,它从一个正则表达式中生成一个图形,这对于理解表达式的实际作用非常有帮助:

RegEx-Vis —按作者分类的图像

YAML

YAML,这种语言本应是可读的,但却常常不可读。众所周知,带有多级缩进的长 YAML 文档很难导航和排除故障。

为了避免花费不合理的时间试图找到一个错误的缩进,我建议您使用模式验证,并让您的 IDE 做所有的工作。您可以使用来自https://schemastore.org/json的验证模式或者自定义模式,比如这些来验证您的文件。这些将适用于 JetBrains 产品(例如 Pycharm 、 IntelliJ )以及 VSCode (参见本指南)

如果你喜欢使用vim作为你的编辑器,我推荐使用自定义格式,它可以帮助你发现错误。我的首选配置如下:

最终的格式如下所示:

维姆·YAML——作者图片

除了上面提到的工具,使用 YAML linter 也是一个好主意,比如this或者它的 CLI 等价物,它将验证和清理你的文档。

最后,如果你正在使用 OpenAPI/Swagger YAML 规范,那么你可以使用https://editor.swagger.io/来查看/验证/编辑你的模式。

结构化查询语言

有很多处理关系数据库的软件,但是大多数都集中在连接数据库实例和运行 SQL 查询上。这些功能非常方便,但是对于在可能有数百个表的数据库中导航会非常困难这一事实没有帮助。有一个工具可以解决这个问题,那就是狱卒:

狱卒数据浏览器——图片来自文档

Jailer 是一个工具,它可以——除了其他功能之外——通过跟随外键在数据库中导航。展示狱卒所有特征的几个视频可以在这里找到。

饭桶

git——一个我们每天都在使用的用户体验非常糟糕的软件——也可以使用一些工具来导航历史(日志)、暂存/提交文件、查看差异或例如重新调整分支。

我选择的工具是 IntelliJ/PyCharm 集成——在我看来,没有比这更好的工具来处理与 git 相关的东西了。

如果您不是 IntelliJ/PyCharm 用户,或者您更喜欢呆在终端中,那么下面的命令会让您的生活稍微轻松一些:

上面的命令将打印出一个可读性很好的提交历史图表,类似于:

git 日志—作者图片

如果您还希望稍微改进一下区分功能,那么您可以使用git diff ... --word-diff --color-words:

git word diff —按作者分类的图像

正如你从上面两个例子中看到的,只要付出足够的努力,你可能会让命令行git的体验变得可以忍受,更多类似的技巧请看我以前的文章:

https://itnext.io/advanced-git-features-you-didnt-know-you-needed-ed8455c45495

如果你想完全避免基本的git CLI,你可以尝试使用forgit——一个交互使用git的 TUI:

Forgit —图片来自文档

上图截图互动好看git log。该工具支持几乎所有的git子命令,最重要的是rebasecherry-pickdiffcommit。关于特性的完整列表和更多截图,请参见项目的资源库。

除了使用git或者你的 IDEs 特性,你还可以使用其他工具来帮助完成复杂的文件区分。一个非常强大的工具就是https://github.com/Wilfred/difftastic。支持多种语言的区分工具。关于该工具的演示,请参见本视频。

如果你想要一个专门用于区分结构化语言的工具,比如 JSON,XML,HTML,YAML,那么是一个很好的选择。Graphtage 从语义上比较文档,即使改变元素的顺序,它也能正确地发现差异。

最后,如果你更喜欢可视化工具,那么你可能会发现 Meld 很有用,因为它提供了与 JetBrains 产品相似的体验。

码头工人

从 DevOps 的角度来看,当使用 Docker 时,用docker-compose旋转一堆容器并以很难解决的混乱结束是很常见的。

Lazydocker 是同时处理多个 docker 容器的绝佳工具。如果你不相信我,那就去看看项目库中的 【电梯间】

懒人——作者图片

如果你更喜欢基于浏览器的工具,你可能想试试 Portainer ,它提供了导航/检查 Docker 容器、卷、图像等的仪表板。

Portainer —作者图片

库伯内特斯

考虑到每个 API 资源都可以使用一个可视化工具,当谈到 Kubernetes 时,需要涵盖很多内容。然而,有几个值得注意的领域(实际上是痛点),经常需要可视化工具来有效地设置/管理。

第一个是网络策略,它可以可视化,也可以使用https://editor.cilium.io/进行配置。即使你更喜欢手工制作你的策略,我仍然建议用这个工具来直观地验证它们。

网络策略编辑器-作者图片

另一个类似的工具是网络策略查看器,它只关注策略的可视化,并且具有更简单、更易读的图表。

我推荐使用这个网络策略方案的集合来测试这两个工具,看看它们如何对您的工作流程有所帮助。

配置 Kubernetes 的另一个痛点是 RBAC,更具体地说是角色角色绑定以及它们的集群范围的替代品。有几个工具可以帮助解决这些问题:

Krane 是一个可以生成显示所有角色和主题之间关系的图形的工具。Krane 还有许多其他功能,包括 RBAC 风险评估、报告和警报,以及使用 CypherQL 查询/询问 RBAC 规则。

Krane 更简单的替代方案是[rbac-tool](https://github.com/alcideio/rbac-tool),它可以作为kubectl插件安装。它还可以分析、审核、询问 RBAC 规则,但最重要的是,它可以将它们可视化:

RBAC-工具-按作者分类的图像

最后,如果你更关心简单地配置 RBAC 而不是查看漂亮的图表,那么权限管理器就是你的工具。参见 GitHub 库中的gif,了解该工具的功能演示。

除了网络策略或 RBAC 等专用工具,您还可以利用通用仪表板,例如:

  • Lens—Kubernetes IDE 为管理集群带来了一些健康,尤其是在与 Lens Resource Map 配合使用时,后者将 Kubernetes 资源及其关系显示为一个实时的力导向图。

镜头 IDE —图片由作者提供

镜头资源图—图片由作者提供

  • 像往常一样,也有基于 CLI 的工具,它提供了比光秃秃的kubectl更多的功能。它被称为[k9s](https://k9scli.io/),它确实使在 Kubernetes 中导航、观察和管理您部署的应用程序变得更加容易:

k9s —作者图片

结束语

本文主要关注开发人员/DevOps 工具,但是还有 2 件事情值得一提。首先是 Mermaid.js 用于创建漂亮的图表(作为代码),这是现在与 GitHub markdown 集成。另一个——MathJax——用于可视化数学表达式,最近也得到 GitHub markdown 的支持。

这些是我喜欢的工具或我过去用过的工具,所以这绝不是一个详尽的列表。如果你发现了不同(更好?)工具,请一定要分享,这样别人也可以利用。

**本文最初发布于martinheinz . dev

成为会员阅读媒体上的每一个故事。你的会员费直接支持我和你看的其他作家。你还可以在媒体上看到所有的故事。

*https://medium.com/@martin.heinz/membership *

你可能也喜欢…

*https://betterprogramming.pub/automate-all-the-boring-kubernetes-operations-with-python-7a31bbf7a387 *

基于反向翻译和 MarianMT 的自然语言处理数据增强

原文:https://towardsdatascience.com/data-augmentation-in-nlp-using-back-translation-with-marianmt-a8939dfea50a

使用拥抱面部变形金刚的神经机器翻译框架增加你的训练数据的大小

文章标题(作者图片)

介绍

获得准确的模型不是一条简单的道路。事实上,已经确定了不同的方法来帮助改善模型的性能,其中一种方法是获得更多高质量的数据,这确实不是一个容易的过程。在本文中,我们将探讨数据扩充,这是一种从原始数据中创建新数据的方法。

存在不同的技术,但是我们将通过理解它如何工作和实现它来关注**back translation**这一个。

什么是反向翻译——为什么是马里亚姆特?

本节的目标是理解反向翻译的概念,并弄清楚玛丽安娜特如何有用。

回译

反向翻译的概念很简单,由三个主要步骤组成。

  1. 临时翻译:将每个原始的训练标注数据翻译成不同的语言。在我们的例子中,是从英语到法语。
  2. 反向翻译:将这些翻译后的数据翻译回原始语言,也就是从法语翻译成英语。
  3. 去重:在这个过程的最后,我们将会得到每一个原始文本数据对应的回译。这里的目标是让每个副本只出现一次。

玛丽安山

如前一节的前两步所述,这是用于将原文翻译成目标语言的框架,反之亦然。

MariamMT 是一个高效的机器翻译框架。它使用了引擎盖下的 MarianNMT 引擎,这是由微软和许多学术机构如爱丁堡大学、波兹南的 Adam Mickiewicz 大学纯粹用 C++开发的。同样的引擎目前也在微软翻译服务的背后。

赫尔辛基大学的 NLP 小组在拥抱脸变形金刚上开源了多种翻译模型。MarianMT 是之前使用 Marian 在 Opus 收集的平行数据上训练的那些模型之一。

反向翻译的实施

在开始实现之前,理解以下先决条件是很重要的。

如果您喜欢视频,可以观看本文的视频演示:

先决条件和助手函数

本节的目标是安装、导入所有的库,设置所有的候选模型,并实现实验所需的辅助函数。

有用的库

总共有两个重要的库

  • transformers为了使用 MarianMTModel 和 MarianTokenizer
  • sentencepieceMarian mt 工作所需。

Marian mt _ prerequisites . py

注意:安装完这些库后,请务必重启笔记本,以便所有更改生效。

候选车型

《拥抱脸》中的所有模特名字都使用以下格式Helsinki-NLP/opus-mt-{src}-{tgt},其中{src}{tgt}分别对应源语言和目标语言。它们的值是代表语言的两位数代码。你可以在这里找到语言代码列表。对于我们的例子,我们将有两个候选模型。

每个模型的配置需要两个主要的类,MarianTokenizer 用于加载正确的标记器,MarianMTModel用于加载预训练的模型。

  • Helsinki-NLP/opus-mt-en-fr 第一个将法语翻译成英语的模型
  • Helsinki-NLP/opus-mt-en-fr第一个将英语翻译成法语的模式。

marianMT_first_model.py

  • Helsinki-NLP/opus-mt-fr-en 第二种模式将法语翻译成英语。

marianMT_second_model.py

现在我们已经完成了两个模型的配置,我们可以继续实现反向翻译特性了。

下面是将用于执行翻译的文本列表。

back_trans_texts.py

但是,为了能够正确地实现翻译特性,我们需要在每个需要翻译的文本前面添加特殊的标记>>{tgt}<< 。记住{tgt} 不是 fr 就是 en 。对于我们之前的列表,它看起来像这样:

back_trans_formated_texts.py

下面是完成这样一个任务的 helper 函数。它将原始文本作为输入,并在每个文本的开头添加特殊标记,如前所示。

marianMT_format_texts.py

下面是我们执行函数后得到的结果。

测试 _ 批处理 _ 格式化. py

带有特殊标记的格式化文本(图片由作者提供)

我们可以继续执行负责翻译该批文本的功能。它将待翻译的文本批次、目标语言模型和语言代码作为参数。

marian_perform_translation.py

这是由第 14 和第 15 行生成的从英语到法语的翻译结果。

从英语到法语的翻译(图片由作者提供)

完全相同的函数perform_translation可用于将之前的结果(法语)翻译回英语。我们只需要提供正确的参数,对应第二个模型的信息。

translate_back_fr_to_en.py

这是从英语翻译成法语的结果。

反向翻译从法语到英语(图片作者)

我做了反向翻译,那又怎样?

这里发生了一些有趣的事情。从反向翻译的结果可以看出,第三个文本的翻译和原文的完全一样。

原文及其回译(图片由作者提供)

这里是重复抑制功能出现的地方。它将两个列表(原始文本)作为参数,然后它们的反向翻译通过只保留重复文本的一次出现来组合它们。

marian_combine_two_lists.py

最终增强功能

我们可以将前面所有的辅助函数组合起来,创建一个返回扩充文本的函数,对应于原始文本和它们的反向翻译。

marian_augmentation.py

下面你可以看到相应于原始文本的增强的最终结果。我们将文本从 4 个增加到 7 个,相当于增加了 70%,这在大数据规模下是非常显著的。

原始文本和最终增强文本(图片由作者提供)

结论

恭喜你!🎉 🍾你刚刚学会了如何增加你的原始训练数据。我希望您喜欢阅读这篇文章,并且它给了您提高模型性能所需的技能。请在下面找到更多资源来帮助您进一步学习。

欢迎在 LinkedIn 上添加我,或者在 Twitter 和 YouTube上关注我。讨论人工智能,人工智能,数据科学,自然语言处理的东西总是令人愉快的!

Github 上文章的源代码

MarianMT 关于拥抱脸的文档

MarianNMT 文档

再见🏃🏾

火炬视觉中的数据增强

原文:https://towardsdatascience.com/data-augmentations-in-torchvision-5d56d70c372e

这个博客旨在比较和熟悉研究团体使用的不同数据转换技术

图片作者。

介绍

为什么我们需要数据增强?

数据扩充是深度学习项目的关键要素之一。证明了它在对抗 过拟合 和使模型 更好地泛化 方面的有效性。除了正则化特征之外,变换可以通过添加已经存在的图像的稍微修改的副本来人为地 放大 数据集。

如何选择正确的增强?

选择增强有两种方式: 手动 或使用优化 策略。正如你可能认为的那样,如果没有数据集领域的广泛背景研究,手动设计只能产生次优解决方案

另一方面,自动化策略经过优化,可以在没有人工干预的情况下获得特定任务的最高验证准确性。

在这篇博客中,我们将详细介绍这两种方法,以及torchvision代码。最后,我们将在 CIFAR-10 数据集上比较使用无增强手动自动策略的三个设置的性能。

事不宜迟,让我们深入探讨一下吧!

手动增强

torchvision.transforms模块中有 30 多种不同的增强功能。在这一部分中,我们将重点介绍计算机视觉任务中最常用的五种技术。为了将它们结合在一起,我们将使用transforms.Compose()函数。在我们应用任何转换之前,我们需要使用transforms.Normalize()规范化 输入。该方案减少了模型的不稳定性,加快了收敛速度。

使用整个数据集的平均值标准偏差对输入进行归一化。这些值是为每个通道(RGB)单独计算的。在这种情况下,我们使用特定于 CIFAR-10 的值。如果你想了解更多关于正常化的知识,你可以看看我的文章。

transforms.ToTensor()命令将 PIL 图像格式转换为 torch Tensor,这样就可以将它传递给 PyTorch 模型。

现在我们来看看如何添加转换:

1。随机翻转

—水平

:原稿,*:放大。图片作者。*

—垂直

图片作者。

水平和垂直翻转是最简单的和最强大的 T21 变换之一。参数*p*表示反射发生的概率。

2。填充

图片作者。

参数pad定义了输出的高度宽度的额外像素。

3。随机裁剪

图片作者。

这个功能是将新图像裁剪成想要的sizePadding有助于保持输入的精确尺寸。

4。颜色抖动

图片作者。

该功能随机操作brightnesscontrastsaturation。这样,我们可以模拟白天和夜晚的情况,这有助于泛化。

5。随机擦除

图片作者。

该功能随机选择矩形区域,''删除其像素值为 0 的像素。再次,*p*表示发生的概率。与其他变换不同的是RandomErasing()直接应用于张量;因此它在toTensor()之后。**

手工设计

transforms.Compose()功能允许我们链接多个扩展并创建一个策略。有一点需要记住,有些技术可能是无用的,甚至会降低性能。

最简单的例子就是横向翻转数字‘6’,变成‘9’。可惜标签做不到这一点。因此,只考虑数据集的相关扩充是值得的。

自动增强

自动增强

包含 5 个子策略的自动增强策略。每个子策略由 2 个转换以及这些操作的概率和大小组成。图片来自自动增强:从数据中学习增强策略。

2017 年,谷歌开发了第一个算法, 自动搜索 以改进数据扩充政策。手工设计的主要问题是耗时的背景研究和次优结果。新的解决方案建立在两个组件上,搜索算法搜索空间

搜索算法框架。图片作者。

在每一步中,控制器生成 5 子策略2 采样 操作 。它按顺序进行,首先选择变换,然后选择其 大小概率 。扩充应用于数据集,并传递给原始网络的**较小版本(子版本)**。产生的 验证精度 使用 PPO 算法(奖励)进行修改,以更新控制器的权重。这个过程重复 15 000 次,根据结果选择最佳政策。

控制器生成的单个子策略。图片作者。

自动增强击败了当时所有最先进的结果,但有一个警告:计算成本。有 16 种可能的 增强(如旋转、均衡 )。)、10 个量级值、11 个概率,这就产生了巨大的(16 * 11 * 10)⁰5 个子策略的搜索空间 。寻找最优的是一项计算量很大的重要任务。

幸运的是,torchvision为我们提供了针对 CIFAR-10、ImageNet 或 SVHN 等数据集的预训练策略。所有这些都在AutoAugemntPolicy封装中提供。

Torchvision只接受已经培训过的政策,不支持学习程序。假设您想要为数据集找到最佳扩充。在这种情况下,你需要一个带有自动增强的外部库或者重新实现算法。但是在考虑这个选项之前,先看看下面的方法,它不需要任何额外的包,计算量也更小。

随机扩增

图片来自 RandAugment:搜索空间缩小的实用自动数据扩充。

除了自动增强的计算负担之外,它在大型数据集上的表现也更差。子(代理)网络仅近似于原始模型性能;因此,它只能生成近似(次优)策略。

RandAugment 删除任何学习技术和代理任务,以找到最佳的扩充。

等等,他们是怎么做到的?

首先,RandAugment 只接受两个参数, NMN 是 14 个可用的增强的数(整个列表)。 M 是这些操作的量级,范围为 1-10,定义图像旋转、平移等的程度。

我们可以通过执行简单的网格搜索来找到这些参数,网格搜索依赖于数据集主* 模型,而不是自动增强中的“”网络。*

简单的网格搜索,验证精度为 N={1,2}和 M{2,6,10,14}。图片作者。

本质上,我们根据 N 和 M 的不同组合来训练网络,并选择一个具有最佳验证准确性的组合。听起来很简单,结果本身就说明了产生比自动增强更好或相等的验证准确性

这是随机增加torchvision代码。

比较

在这一部分中,我们将最终看到三种增强系统的性能:

  • 普通 —仅应用Normalize()操作。

  • 基线HorizontalFlip()RandomCrop()RandomErasing()的组合。

  • 自动增强 — 策略,其中AutoAugment是基线配置的附加转换。

数据集

图片作者。

CIFAR-10 由 10 类 60 000 幅 32x32 彩色图像组成,每类 60 00 幅图像。数据集分为 50 000 幅训练图像、2500 幅验证图像和 7500 幅测试图像。

*仅增强训练图像。

对数据集应用转换的代码:

型号

d —表示阶段{1,2,3}。图片作者。

ResNet-20 是为 图像识别深度残差学习 论文中提出的 CIFAR-10 数据集特别定制的 ResNet 版本。

第一层**Conv1**是具有 3x3 内核大小的卷积。接下来是 3 个阶段,其中每个阶段包含{16,32,64}个过滤器。参数 n 通过操纵每一阶段的 残差块 的数量来控制网络的深度。在我们的例子中,它等于 3,这产生 9 个残差块和 18 个卷积层。**

使用步长 2 对阶段之间的特征图*进行下采样,这分别给出了输出尺寸{32,16,8}。残差投影**在这里使用 1x1 卷积来匹配下一阶段的通道。*

网络以 全局平均池完全连接的层结束,导致 20 可训练

下面是 PyTorch 中的实现:

如果你想了解更多关于 T42 的事情,可以看看我在 YouTube 上的视频。

超参数

这些是用于训练的一组参数:

*learning_rate = 0.001
batch = 256
optimizer = Adam
loss = CrossEntropyLoss
epochs = 40
n = 3
weight initialization = Kaiming He*

我还在模型中添加了学习率调度器。当验证损失超过时,它降低了学习率,这有助于防止过拟合

我没有包括所有的训练、验证和测试循环,因为它们有点长,而且对理解主题并不重要。然而,你可以很容易地在我的 Github 上找到它们,并有一些直观的解释。

结果

现在是时候在训练 3 个不同的模型 40 个时期后比较结果了。要评估的主要指标是精度损失函数,所以让我们看看它们是什么样的:

虚线表示验证准确性。图片作者。

虚线代表验证损失。图片作者。

‘Plain’模型中,训练准确度趋向 100%,而验证饱和并降低。此外,验证损失正在增加,这表明过拟合问题。

基线*配置似乎处理**过拟合很好。令人惊讶的是,学习率一次也没有下降。验证准确度稳步向更高的值发展,没有显著下降。可能该模型可以被训练更长时间以用更低的学习率获得更好的结果。*

最后但同样重要的是, AutoAugment 有趣地保持了验证精度高于测试精度。指出了欠拟合的问题,使模型过于泛化,不能很好地拟合数据。同样,该模型可以通过学习率时间表进行更长时间的训练,并可能获得更好的结果。

最终结果可能会令人惊讶,基线增强给出了大约 87%测试准确度的最佳结果,而自动增强给出了大约 84%的测试准确度。它证明了随机翻转、裁剪和擦除是多么强大。**

为自动增强辩护,我个人认为对于这样一个小网络有太多的转换。像 ResNet50 这样的大型模型将具有额外的学习能力,以覆盖更复杂的情况,并更好地进行归纳。

结论

如果你设法到达那里,祝贺你。在这篇文章中,我们经历了深度学习中使用的大量不同的数据增强技术。我们比较了三种不同设置的性能。

**简单的配置证明了数据扩充对于提高模型的准确性至关重要。

**手动挑选转换似乎需要更多数据集背后的直觉,并且经常产生次优结果。尽管如此,即使是标准政策也能产生令人印象深刻的结果。

另一方面,自动化增强无疑是未来的变革,理论上应该在最优解决方案下表现更好。在我们的案例中,学到的策略实际上并没有改善手工设计的结果。然而,这是一个活跃的研究领域,只是最近才开始得到更多的关注,仍然有很大的潜力。

我希望这篇文章给你一个坚实的介绍,让你探索和试验更多的 torchvision 和测试一些其他的技术。欢迎在评论中提问。

如果你喜欢这篇文章,你应该看看我的 中的Github 看看我正在做的其他项目。

数据资本主义:创新、提取、社会良知

原文:https://towardsdatascience.com/data-capitalism-innovation-extraction-social-conscience-3a30bf2c507b

在一个日益被监督资本主义统治的世界里,如何推进社会资本?

大约一年前,我读了凯特·克劳福德(Kate Crawford)写的《人工智能图集》https://www.katecrawford.net/,这是一篇关于管理机器学习领域的提取过程的精彩分析,从环境资源分配到收获我们的政治结构,再到侵犯数据隐私。这篇文章反思了从克劳福德的书中学到的东西。我想按下⏸按钮,思考一个万亿美元产业的含义,以及数据从业者在一个由算法统治的世界中的责任。数字用户如何成为定义新数字世界的积极参与者?数据驱动的公司需要培养什么样的社会良知?即使他们的使命不要求他们关心,他们有什么责任去发展社会资本?我希望这篇文章是数据社区开发一个新框架以将社会参与嵌入数据实践核心的对话的开始。

照片由耶戈·古格莱塔在 Unsplash 上拍摄

什么是数据资本主义?

来自 AI Now Institute 的莎拉·迈尔斯·韦斯特(Sarah Myers West)在 2017 年的一篇文章中解释说, 数据资本主义 是一个系统,其中大数据的商品化有利于从数据中获利的行为者,导致了“不对称的权力再分配”。换句话说,大数据赚钱了,但并没有平等地创造财富。这是一个封闭的系统,其中盈利实体已经成功地提取、转换和利用数据,我们的数据。Milner 和 Traub 于 2021 年在 Demos 发表的一篇更近的文章使用了同样的定义,但强调了这种财富再分配造成的社会灾难,给受保护的阶层带来了特别沉重的负担。

监督资本主义和算法治理

虽然数据资本主义和监控资本主义有相似的特征,但它们并不完全相同。监控资本主义依赖于数据资本主义的基础。没有数据的提取,就没有监控系统可以建立。没有这些数据的货币化,就没有资金来建立这样一个监控系统。监督资本主义这个术语最初是由哈佛大学教授、《T2:监督资本主义的时代》(2018 年)的作者肖莎娜·祖博夫创造的。她将监督资本主义描述为一个过程:人类经验被用作原材料,并被转化为行为数据,这些数据可用于构建预测产品(我们的未来行为),反过来由使用机器学习(ML)算法定制的公司进行交易,以产生有利可图的回报。

作者图片

****算法治理非常接近监视资本主义,因为它认可一种监视系统,在该系统中,我们的行为被 ML 算法跟踪和建模。但是,环境不同。洗钱被用来大规模地执行公共政策目标,以维护社会秩序(遵守法规、执行法律等)。).目标不是赚钱,尽管它可以作为代理发生,而是治理,并在一定程度上控制社会。算法治理是治理和控制之间的一次有趣的散步。这种紧张关系导致许多专家和公共政策专家质疑在这样一个体系中民主的未来。

数字封建主义

由伦敦大学学院(UCL)创新和公共目的研究所组织的一场 2021 年的演讲将祖博夫和奥赖利聚集在一起,讨论数据资本主义的未来,讽刺的是,这个术语被“数字封建主义”所捕捉封建主义是从中世纪借来的术语;这是一种政治、文化和经济体系,在 9 世纪到 15 世纪之间占据主导地位。在这样的体系中,有领主(即土地所有者)和封臣(即占有土地以换取商品和服务生产的臣民)。在这种交换体系中,臣民只有在付清房款的情况下,才被授予拥有家园和上帝保护的权利。同样,数字封建主义可以被认为是用户只有在同意交换个人信息的情况下才有权“免费”使用社交媒体平台。我们的个人数据由于社交媒体平台巨头、21 世纪中世纪的土地所有者而成为“租金”。

数据资本主义是如何发展的?

网络泡沫破裂了📉

本世纪初的网络泡沫破裂是创造“数据资本主义怪物”的关键时刻。在那之前,科技的焦点是创新。目标是设计新的、有创意的、未来的产品,让之前的十年看起来像是发生在中生代。当互联网泡沫破裂时,投资者威胁要撤回对硅谷科技初创公司的投资。因此,科技公司不得不寻找新的赚钱方式。为个人服务的创新不再足以吸引投资,个人成为新的商品,新产品,可以赌上赌下。这让科技公司赚了很多钱。

数据可以赚钱💰

广告无处不在——科技公司意识到广告是赚钱(和留住投资者)的关键。广告不是一个新概念。然而,在广告牌、报纸或电视广告上看到它之前,它现在进入了社交媒体平台。由于大规模的数据收集实践,在线广告变得越来越个性化和有针对性。他们甚至可以预测一个人的需求。这方面的一个例子是塔吉特百货对广告的侵入性使用,甚至在家庭内部宣布之前就暴露了一名青少年的怀孕。

****“监督红利”——Shoshana Zuboff 使用我们的数据描述了主要公司的盈利能力,称为“监督红利”在互联网泡沫破裂后,谷歌的人们意识到存在“数字废气”,这是一个不为任何特定目的收集的数据宝库,可以挖掘出预测消费者行为的信号。2001 年至 2004 年间,由于数字废气的利用,仅广告收入就跃升了 4486%。在那之前收集的数据盈余导致谷歌呈指数增长,谷歌在 2004 年首次公开募股后继续依赖我们的数据作为增长的手段。

**https://infogram.com/column-chart-1h8n6m359jpzj4x?live [## 谷歌广告收入 2001 年至 2021 年

infogram.com](https://infogram.com/column-chart-1h8n6m359jpzj4x?live)

从被动消费到社会良知

租金不合理

在 2021 年与 Zuboff 和 O'Reilly 的谈话中强调的一件重要事情是,盈利性公司收取的租金(即我们的数据)是不合法的。没有理由对大量数据进行提取、收集、转换和建模。收集的一些数据甚至是有问题的和高度歧视性的(例如,在保险费计算中用邮政编码作为替代衡量标准)。因此,公司预测消费者行为的数据收集做法受到质疑。然而,即使有主要的数据隐私法的支持,一个人怎么能与一家公司对抗以确保数据的公平和道德使用呢?我们如何真正确定我们提供给公司的数据仅限于服务和/或产品改进?数字用户如何在塑造数字世界中发挥积极作用?

主动参与

这种认为数据资本主义的未来是数字封建主义的想法不一定 100%正确。这是一个需要数字用户积极参与的选择,以防止数据驱动的公司放任自流。尽管数据资本主义将继续存在,但需要发生一种转变,让用户成为新的赚钱数据机器的积极参与者。首先要认识到,除非我们愿意投资,否则我们无法改变这个系统。

今天,我们享受免费的社交媒体平台,但它们是免费的,因为我们同意被展示有针对性的广告。如果我们不希望我们的行为数据被分析和操纵,我们需要同意基于会员的模式应该取代基于广告的模式。如果我们还没有准备好,另一个解决方案是加强现有的数据隐私法规。为了成为积极的参与者,数字用户可以在公开论坛和全民公决中分享改善数据隐私和安全的想法,在那里他们可以进行辩论。

社会良知

虽然用户在定义游戏规则方面可以发挥作用,但公司有更大的责任公平、合乎道德地使用数据。最终,公司是保存我们数据的金库。目前没有法律要求公司公开用户信息是如何被收集、分析和使用的。美国证券交易委员会于 2022 年 3 月 9 日提交的一项立法提案将要求上市公司披露安全数据泄露;但是,它只解决了数据安全性,而没有解决数据隐私。此外,尽管美国证券交易委员会的职责是监管上市公司,而拟议中的立法正是如此,但它不会给私营公司带来同样的负担,私营公司也使用、模拟和共享我们的数据。

除了制定强有力的数据隐私计划,企业还需要培养社会良知,将社会目标与经济目标一起重新排序。在 21 世纪,我看到四大主题:气候变化,财富不平等,政治极化和歧视。公司已经并继续助长社会问题。想想脸书(更名为 Meta)在加剧罗辛亚种族灭绝中扮演的角色,罗宾汉在保护做空 GameStop 股票的对冲基金中扮演的阴暗角色,亚马逊销毁数百万未售出的产品,等等。如果问题是由公司引起的,他们应该感到有责任解决这个问题。公司在保护我们的社会结构、鼓励言论、提供金融工具来平衡竞争环境、承诺使用可再生能源等方面都有自己的角色。

结论

数据资本主义将继续存在,但这并不意味着数字用户应该成为控制他们数据的系统中的被动消费者。他们应该有权塑造我们生活的不断变化的数字世界。然而,负担并不仅仅落在用户身上。公司有更大的责任以道德和公平的方式使用我们的数据。他们培养“社会良知”也变得越来越重要——许多社会、政治、经济和环境问题因大公司采取的行动而浮出水面。现在是注入同情和关怀的时候了,这样我们也可以增加我们社会资本的红利。

本帖最后编辑于 2022 年 5 月 29 日。这里表达的观点仅属于我自己,并不代表我的雇主的观点。**

以数据为中心的人工智能

原文:https://towardsdatascience.com/data-centric-ai-82fea1fc678d

以及这对机器学习从业者意味着什么……

图片来自 Pixabay 的 Kanenori

介绍

如果你关注机器学习社区的新闻,你肯定听说过以数据为中心的人工智能。这个术语近年来越来越受欢迎,出现在主要的 ML 会议上,并被数据科学界的权威人士所提倡。

让我们看看以数据为中心的人工智能意味着什么,它与以前使用的一些方法有何不同,以及它对 ML 从业者意味着什么。

以模型为中心与以数据为中心的方法

如果您从事过数据科学项目,您可能会想起一些典型的 ML 模型创建步骤。直到最近,典型的步骤是:

  1. 收集数据
  2. 干净的数据
  3. 尝试几种型号
  4. 调整模型参数
  5. 投入生产
  6. 监控模型(或者在某些情况下忘记它)

大部分重点放在第三和第四步。通常,如果你在大学或一些在线训练营学习机器学习课程,重点将是学习这两个步骤。你将花大部分时间研究不同的 ML 模型(线性回归,支持向量机,树,聚类,人工神经网络等。).您将了解它们的优点、缺点、用例,以及如何对它们进行调优,以最大限度地发挥它们的性能。

图片由 Gerd Altmann 来自 Pixabay

很少或没有时间用于数据部分。数据通常被清理、特征化,并被扔进算法中。这是一种以模型为中心的方法,在过去十年中一直运行良好。存储和计算能力的进步使得这种方法蓬勃发展,并导致了我们目前拥有的最先进算法的发展。

我们如此专注于算法开发,以至于忽略了过程中最基本的部分——数据本身。ML 算法的数据就像我们人类的食物。因此,我们需要为我们的算法提供尽可能高质量的数据,以实现最佳性能。

以数据为中心的方法主要关注提供高质量的数据。这意味着我们不能只专注于选择算法,我们必须花时间收集和注释数据,纠正错误标记的数据,扩充数据,并扩展这种类型的过程。

以数据为中心的人工智能的最新发展

以数据为中心的方法是最近在各种数据科学和机器学习会议上讨论的热门话题。去年的 NeurIPS 会议介绍了一个与此主题相关的新主题,名为“数据集和基准”。我在博客的帖子中写了这件事。该课程旨在关注构建高质量数据集的挑战。

以数据为中心的方法也在数据科学和机器学习的知名研究人员中获得了支持。吴恩达是其中之一,他甚至组织了第一届以数据为中心的人工智能竞赛。在这次比赛中,参赛者必须解决一个罗马数字识别的问题。

作者照片

最初,有 3000 张图片和 10 个类,所以数据相对较少。模型是固定的,竞争对手只能应用以数据为中心的方法来改进或更改数据。最后,他们不得不提交最多包含 10,000 张图像的修改后的数据集。

你可以在这篇文章中了解成功的方法。

以数据为中心的 AI 对我们 ML 从业者意味着什么?

对以数据为中心的方法的最新宣传意味着数据终于成为机器学习生命周期的重要部分。迟早,所有的数据科学家都会认同这样一个观点,即建立好的模型需要关注的不仅仅是选择算法和调整参数。

也意味着数据这个机器学习的丑小鸭,可能正在发展成为一只美丽的天鹅,成为构建 ML 产品的重要组成部分。我预计将会有更多的工具被开发出来,集中在注释、扩充和校正数据集上。

如果你想了解更多关于以数据为中心的人工智能,你可以听听我在伦敦为 ML 社区做的演讲。

PS:我正在 Medium 和https://www.aboutdatablog.com/上撰写深入浅出地解释基本数据科学概念的文章。你可以订阅我的* 邮件列表 *每次我写新文章都会收到通知。如果你还不是中等会员,你可以在这里加入**

下面是一些你可能会喜欢的帖子

** **

安全数据科学:基于 Zipf 定律从 Sysmon 日志中寻找威胁

原文:https://towardsdatascience.com/data-centric-security-threat-hunting-based-on-zipfs-law-50ad919fc135

企业安全遥测中基于普适 Zipfian 分布的异常检测工程

来自 Unsplash 的封面照片类似 Zipf 定律曲线。

本文将关注“以数据为中心的安全”范式——利用统计知识满足网络安全需求。无论部署和环境特征如何,这种寻找威胁的方法都会产生相同的结果。我们将基于 Zipf 定律的统计模式,使用许多工具(如 Elasticsearch 或 Splunk)的内置功能来定义基线活动,并评估超出基线的元素。此外,我们在 Python 中共享了一个端到端的基于异常的检测实现来分析 Sysmon ID 1 进程创建事件,并对超出基线的可执行哈希进行威胁情报分析。

前言

从本质上讲,网络安全在目前的概念状态下似乎是无法解决的。在过去的几十年里,我们已经看到了进攻和防守技术之间永无止境的猫捉老鼠的游戏。今天,安全问题本质上是一个风险最小化的任务,整个行业通常成功的方法是避免成为最容易实现的目标之一。

然而,即使是顶级组织也面临着挑战。例如,在最近的 Lapsus$活动中,一个经验最少、资源一般的威胁参与者可以访问基础设施的敏感部分,如微软、NVIDIA、Okta 和 counting。这种情况暴露了传统安全操作中的灰色地带,如内部威胁或针对 MFA 旁路的弱点。

受 Dave 启发,一个据称有效的方法是关注基线活动,将超出基线(OOB)的行为视为具有调查潜力:

重点:“(..)了解基线行为至关重要”。

另一个用来描述 OOB 元素的术语是“异常”通常,在讨论异常时,安全从业者会将注意力集中在机器学习(ML)解决方案上。但是,大部分 ML 炒作都是为了营销需要而人为抽成的。事实上,ML 在网络安全领域有着巨大的潜力,对应用研究有着巨大的需求。然而,我们想强调的是,ML 并不是最重要的,经常是不需要的,而且经常是适得其反的。

ML 挑战的出现是因为,在新奇和异常检测问题中,在像企业网络这样的多维概念空间中基线的定义具有显著的挑战性,这是许多高成本异常检测解决方案的失败之处。这并不意味着我们不能将 ML 算法用于无监督的安全问题。尽管如此,我还是故意在本文中省略了对基于 ML 的异常检测算法的讨论(一些想法在这个 Twitter 帖子中分享了),因为我们提出了一种更直接、更受广泛支持的统计方法。

齐夫定律

这里我们讨论一种基于 Zipf 定律定义基线的具体方法。通过设计,它总是产生超出基线(OOB)的元素。你不能直接把它们当作警报或者欢迎警报疲劳。因此,我们讨论解决 OOB 价值观的各种方法。

花哨的统计学词汇在文献中描述了齐夫定律,但我们可以将其定义为特定封闭环境中的“一种元素分布的模式”。这种模式类似于反向指数曲线,如下图 1 中的紫色线所示:

图一。自然语言处理(NLP)中 Zipf 定律的粗略概括。作者创造的形象。

最初,Zipf 定律是在自然语言处理(NLP)的范围内形成的,表示语料库中单词的分布。在上面的图 1 中,y 轴表示字数,x 轴表示按频率排序的唯一单词。例如,如果我们统计维基百科页面上出现的关于伊丽莎白二世的单词,我们得到:

图二。任意自然语言语料库中的词频。作者创造的形象。

似乎在自然语言中,频繁出现的词(“the”、“to”、“of”、“a”、“and”等。)在文本中几乎没有意义。这样的词被称为“停用词”,通常在进一步的 NLP 处理中被省略。这就是为什么在 NLP 应用程序的开头经常会看到下面的代码:

**import** nltk
**from** nltk.corpus **import** stopwords
nltk_stopwords = stopwords.words('english')words = [word **for** word **in** text.**split()** **if** word.**lower()** **not in** nltk_stopwords]
...

在 NLP 中,为了训练一个模型,Zipfian 分布最有价值的部分是在中间的某个地方,而稀有词太独特了,不会影响训练过程。从上面的词频分布中考虑只出现一次的单词:

[('Tudor', 1),
 ('sovereign', 1),
 ('Jamaica', 1),
 ('cross', 1),
 ('argent', 1)]

虽然这些元素对 NLP 任务没什么兴趣,但是它们还是有点意思的,因为它们代表了超出基线的语言!我们的经验表明——这个 Zipf 的法律属性与防御安全问题高度相关。

企业模式

Zipf 定律代表了一种更普遍的模式,而不仅仅是英语语料库中的词频。我们在许多生产操作方面看到相同的元素外观结构。我们从代表一家中型企业的未公开安全合作伙伴网络中收集数据,具体如下:

  • 外部出站连接目的 IP 地址来自 Sysmon 事件 ID 3 事件;“外部”指非专网 IP 范围和非自身ASN;
  • 进程二进制名称和可移植可执行文件(PE) 散列来自 Sysmon 事件 ID 1 进程创建事件;
  • 用户名来自账号登录事件 ID 4624;

这是这些数据类型在七天时间内基于计数的聚合后形成的模式(请注意,y 轴是对数轴):

图 3。七天以来,这是四种数据类型(目标 IP、可执行哈希、进程名称、用户名)的频率统计。作者创造的形象。

它们中的每一个都形成了一个已经熟悉的模式。这种方法的一个显著优点是,获取基于计数的统计数据非常简单,并且受到许多主要工具的支持。例如,您可以使用 ElasticSearch 的“ rare_terms ”聚合来收集哈希值 Zipfian 分布的较低尾部。考虑到我们收集流程创建事件(EventID 1)和存储在“ hash.sha256 ”字段中的流程可执行散列,精确的 Python 代码收集在过去 7 天内出现不到 100 次的散列:

在 Spark 中,我们可以使用approx _ count _ distinct()来获取相同的统计数据。在 Splunk 中,罕见的运算符提供了相同的结果。这将为您提供以下统计信息:

[{'key': '935c1861df1f4018d698e8b65abfa02d7e9037d8f68ca3c2065b6ca165d44ad2',   'doc_count': 51564},  
{'key': 'fc10d47cb2dc511e648d3020a1f5789d1075be54dcacb6aa6d156f23561edf6c',   'doc_count': 25101},
...{'key': 'd51f88c09c3ed32243bb588177c159ecc3b2578a98cb09b6959eb134386ba2af',   'doc_count': 1}

检测工程框架

为了根据这些统计数据进行威胁搜索,我们定义了一个出现计数的阈值,以调查其下的独特元素。在上面的图 3 中,这被可视化为一条红色虚线,表示在七天内出现 10 次的阈值。

阈值 10 是任意选择的,通常,该值是可配置的超参数,取决于以下细节:

  • 聚合窗口-与数据源同步的频率。查询窗口越大,概括越好(即基线元素出现的概率越小)。但是,您获得结果的频率较低,因此潜在的事件响应时间会增加。
  • 元素的先前频率—对于登录等不太频繁的事件,阈值可能低于流程创建事件。
  • 处理基线外元素的能力和资源。

我们成功使用的一般方法可以用下面的图来表示:

图 4。基于 Zipf 定律统计的检测工程综述。作者创造的形象。

伪代码示例:

instantiate_database()while True:
    stats = get_count_data() for element,count in stats:
        if count < THRESHOLD and not_in_database():
            is_malicious = analyze()
            if is_malicious:
                report() put_in_database() sleep(QUERY_WINDOW)

Sysmon & VirusTotal & SQLite

为了简洁起见,我们使用了上面的伪代码,而我们提供了一个在这个要点中定义的现成的解决方案。

它代表了一个使用 ElasticSearch 从 Sysmon ID 1 进行可执行哈希聚合的功能示例,并使用 VirusTotal (VT) API 分析 OOB 元素,将哈希存储在 SQLite 数据库中以避免冗余的 API 查询。

由于 VT 调用是一种有限的资源,因此我们在此报告该脚本对 VT API 进行了多少次调用的时序洞察:

图 5。一些 OOB 杂凑。作者创造的形象。

在自举高峰之后,API 查询稳定下来并保持在较低水平,平均每小时约 5 个查询。

阈值可变性

由于这是一个敏感的参数,我们报告了对该脚本在长期设置中发起的查询的深入分析,以及所有数据的比率。我们基于从一家中型企业获得的遥测数据,分析 OOB 元素的分析回合数的阈值可变性。以下是代表长期不同阈值下的 VirusTotal API 调用的时间序列:

图 6。每次查询的次数基于阈值选择。作者创造的形象。

没有发现显著的差异,只是在分析开始时增加了查询数量。

我们的检测工程框架对环境中其他数据类型的适用性表明,根据经验,设置“阈值=10”会检查所有元素的大约 40%:

destination ip, 7d: elements below threshold==10: 38.30%
executable hashes, 7d: elements below threshold==10: 40.54%
process names, 7d: elements below threshold==10: 42.81%
usernames, 7d: elements below threshold==10: 36.04%

由于比率与阈值直接相关,以下是可变阈值(x 轴)对所有四种数据类型的所有值(y 轴)比率的影响的直观表示:

图 7。调查的所有元素的比率基于不同数据类型的阈值设置。作者创造的形象。

因此,您可以通过了解哈希的总数量来考虑您的分析预算(例如,您的环境每月执行 25k 次唯一哈希)。由于将已经查询过的值存储在 DB 中,所以每个值只需要分析一次。

替代后处理试探法

除了虚拟仪器,还有无数选项可以执行半自动或全自动分析。首先,您最终可以利用那些提供威胁情报的第三方许可证(Recorder Future、FireEye、Flashpoint、Anomali、Maltego 等)。)你的 CISO 反复要求使用。

然而,聪明的内部逻辑可以产生同样重要的结果,因为 OOB 元素为选择性操作提供了基础,否则这些操作在完整基础架构的范围内是不实际的:

  • 让你的 EDR / 迅猛龙对照 YARA 规则库检查 OOB 二进制(由弗洛里安·罗斯和合著者维护的这个集合是一个好的开始);
  • 在主机上执行autorunsc.exe,对照预定义的程序列表进行检查,并在出现异常条目时发出警报;
  • 根据一个 lolbins 列表查询进程名称,并逐渐过滤掉您的环境中常见的事件(基于进程的“命令行”)—警告所有其他事件;
  • 进行相关分析(对 ElasticSearch 进行新的查询),例如,分析具有 OOB PE 哈希的主机是否在执行的 5-10 分钟内与外部 IP 地址进行了网络通信,如果有,则向人工分析师发出警报。

结论

有时,该领域的远见者提出并实现令人着迷的想法,例如,以图形为中心的活动目录(AD)安全方法,使用由 SpecterOps 团队维护的 BloodHound 等工具,这极大地提高了全球广告网络的质量。或者考虑一下贾里德·阿特金森关于重新思考 MITRE TTPs 的有趣想法:

我们不会假装支持这样的观点。然而,我们希望这篇文章提供了安全专业人员如何在其环境中处理遥测技术的新观点,在(a)定义基线的平面和(b)如何处理 OOB 项目方面具有广泛的潜力。据推测,这种方法可能会照亮当代安全行动的灰色地带。

旁注——我们想强调的是,Zipf 的法律观察并不局限于前面提到的查询和数据结构——它更普遍。我们考虑在另一篇文章中分享额外的思维平面,Zipf 定律可能用于网络安全问题的基于异常的检测工程框架,但对于好奇的人来说,请考虑 multi_terms 聚合。

作为一个提醒,一个完整的代码在这里是这里是,它使用本地 SQLite 数据库对 VirusTotal 实施带外哈希分析,以避免不到 100 行代码中的冗余查询。

数据清理:自动删除坏数据

原文:https://towardsdatascience.com/data-cleaning-automatically-removing-bad-data-c4274c21e299

从数字和字符列中清除错误的数据类型条目

照片由拍摄 Unsplash 上没有修改

导入数据集后,清理数据几乎总是您需要采取的首要步骤之一。熊猫有很多很棒的清洁功能,比如isnull()dropna()drop_duplicates()等等。然而,有两种主要情况没有被涵盖:

  • 一个可能的数字列散布着字符串和布尔值
  • 一个有抱负的字符列有零星的数值和布尔值

隔离和移除这些不良数据尤其具有挑战性——在这里,我将向您展示实现这一目标的工具。但是首先,在做任何进一步的分析之前,有另一个很好的理由删除这些坏数据… 对象类型

对象类型

虽然 pandas 通常在导入期间很好地解释了我们的列的数据类型,但是当坏数据引入非常不同的数据类型的元素时,它几乎总是出错。最终结果是列的数据类型(dtype)被设置为可怕的 对象

这有什么不好?首先,在排序、绘制和过滤数据,以及合并来自另一个数据框架的数据时,它会令人头疼。更糟糕的是,对象消耗了大量的计算资源,使得你处理数据的其他事情——包括 EDA 和机器学习——慢了很多。当然,要修复一个列的数据类型,我们首先需要所有的数据都与新的数据类型一致,否则我们会在转换过程中出错。这意味着清除所有不属于错误类型的数据。

不幸的是,在 Pandas 中根本没有清理混合类型数据的功能,这通常导致一系列排序方法来梳理它们的位置并逐个删除它们。相反,通过一些相当简单的自定义函数,我们可以自动化整个过程!

设置

为了给我们一些数据来玩,这里有一个包含重复元素的快速数据框架,第一列代表我们的未来数字列,第二列代表我们的未来字符列,但两者都有不同 dtypes 的大量坏数据。

检查df.head()df.dtypes我们看到我们的数据,以及可怕的两列的对象 dtype。还要注意,在这种对象形式中,我们无法直接检测 NaNs 这是我们在清理数据时需要注意的。

从数字列中清除字符和布尔值

首先,让我们创建一个简单的函数来列出num_col中包含非数值的所有行的内容和行号。这里需要注意的一点是,我们选择不报告空值(nan)。这就留给了用户稍后使用dropna()来删除它们,或者在清理完所有其他内容后,根据需要将它们转换为其他值。

为了实现这一点,我们遍历每一行并尝试将值转换成一个float。因为 NaN 被认为是一个浮点值,所以这些行被保留。同时,如果该值不是数字或安南,float()函数将返回一个 ValueError。在我们的函数中,它触发打印违规的值和行号。

如果我们在现有的数据帧上使用它,它会立即捕获两个重复的非浮点值:

太好了!我们现在知道所有非数字值隐藏在数据帧中的什么地方。检查之后,我们可以起草一个非常相似的函数来完全删除这些不匹配的行。一旦找到它们,我们现在可以简单地删除该行——当然,我们总是可以自定义 ValueError 后面的行,改为将它赋给我们喜欢的另一个(数字)值。

在循环完 dataframe 列之后,我们使用astype()试图将整列强制转换为float dtype。为什么?因为当我们在try:中调用float()时,我们正在做的就是……尝试。它没有做任何永久的改变。如果出现任何问题,astype()函数将抛出错误,让我们知道它在哪里遇到了问题。该语句还将那些非空的'nan'条目转换成我们可以检测到的适当的 nan。最后,我们重置索引,这样当我们在其他列上使用这个函数时,索引将是连续的,并与我们的cnt计数器一起工作。

在运行我们的函数之后,我们可以检查我们的列的 dtype,并且最后一次运行char_finder()来确保没有错误类型的值出现。瞧啊。

从字符列中删除数字和布尔值

硬币的另一面可能有点棘手。技术上来说‘8’是一个字符……技术上来说‘真’是一个词……但它们很可能不属于我们的字符列。我们在这里遇到的一个棘手的挑战是,尽管我们在创建它时在我们的name_col中输入了一个布尔值True24.5,但是在 Panda 将列转换为对象时,它实际上把一切都当作字符串('True’'24.5')。结果,就像我们之前的函数一样,float()实际上是在测试float('True'),这导致了 ValueError (p.s. float(True)等于 1.0)。如此处所示,我们的'True'元素没有被认为是类型bool的实例,因为它认为它是一个字符串。

为了克服这一点,我们必须加入额外的逻辑来显式测试'True''False',因为像bool()这样的函数不像float()这样的数字函数那样特殊,并且会为任何字符的赋予一个True值。

同样,我们也特别注意将任何 NaNs 留在原位。为此,我们做了一个嵌套的int(float())转换。内部的float()像以前一样,试图把我们的字符串像‘24.5’变成 24.5。int()然后将像 24.5 这样的浮点数转换成 24,这对于这种检查算法来说很好——但是 nan 不是整数,会抛出 ValueError。这很好!我们希望 nan 被发送到 ValueError 部分,因为非错误(即数字)在底部的else:语句中被标记。考虑到这一点,我们的数字/布尔查找器函数和结果如下所示:

我们已经识别了所有的数值和布尔值!在我们创建 fixer 函数之前,请记住我们的 nan 仍然是这个列中的字符串。我们需要在我们的elif语句中显式地处理它,以便手动将它们转换回 nan。我们可以在我们的输出中看到这一点,因为nan现在被表示为<NA>,并且df.isnull().sum()能够检测到它们。

此时,我们的两个 dataframe 列有效地清除了所有错误类型的数据,如下所示。我们还将它们转换成适当的数据类型,这将允许所有进一步的清理、EDA 或机器学习。

现在,我们只需要决定如何处理 nan(现在我们可以检测它们了!)—如果它们构成了大量的行,我们可以考虑删除整列—否则我们通常使用df.dropna()来简单地删除所有 NaN 行。

额外积分—速度分析

通常,for 循环是我们在操作数据帧时最不想做的事情。For 循环在计算上可能非常慢。作为一个思考练习,这些相同的函数可以使用 panda 的apply()函数来实现,然后可以使用更加矢量化的实现。

然而,如果我们检查一下时间(当然是在重置两次之间的 df 之后),我们会发现我们原来的解决方案非常快,即使对于具有 42,000 行的数据帧也是如此。更令人惊讶的是,它的执行速度比这个apply()解决方案快两倍多。

虽然其他矢量化解决方案确实存在,但我发现用几毫秒的时间清理每一列是非常容易管理的。

摘要

这里显示的所有代码,以及一个只有功能的 jupyter 笔记本都可以从我的 github 中获得。我还包括了将所有坏数据转换成 nan 的char_fixer_nan()num_fixer_nan(),以防对您的目的更有用。使用%run ColumnCleaner.ipynb将这些功能保存到本地后,也可以很容易地导入到您的任何笔记本中。

搜寻和清除错误类型的数据并不有趣,这些功能是出于需要而产生的。我真的希望这能帮助每个人加快特别脏的数据集的清理过程。如果你觉得这个有用,请跟我来! 欢呼声此起彼伏,快乐的编码声此起彼伏。

每个初学者都需要知道微软 Excel 中的这些数据清理技术

原文:https://towardsdatascience.com/data-cleaning-techniques-in-microsoft-excel-you-need-to-know-4075cbb30731

想要快速轻松地清理您的数据吗?不要再看了

照片由海蒂·芬在 Unsplash 拍摄

接下来的两篇博文将作为我最近与墨尔本大学学生运营的公益咨询俱乐部 BusinessOne 联合举办的培训研讨会的总结。

该研讨会旨在帮助 BusinessOne 的项目团队学习使用 Microsoft Excel 的基本数据清理技术,并介绍 Microsoft Power BI 作为一种工具来构建交互式仪表盘,以交流数据集中的关键见解。

今天的博客帖子将重点关注研讨会的前半部分,即使用 Excel 执行简单的数据检查和数据清理。

查看以下研讨会的完整录音。

车间使用的材料也可以在我的 GitHub 这里找到。

介绍

Microsoft Excel 是 Microsoft Office 软件产品套件的一部分。这是一个电子表格,它不仅能够将数据以表格形式存储,即行和列,而且还具有计算功能、绘图工具、数据透视表等等。

出于本文的目的,我们将主要关注如何在 Excel 中处理数据,执行基本的检查和数据清理,以及一些基本的计算。

Microsoft Excel 中的“主页”选项卡;作者图片

电子表格中的每个单元格都用一个字母后跟一个数字来引用,例如单元格 A1、A2 等等。

调整列的大小

自动调整列宽前的表格;作者图片

假设客户给了我们这个特定的原始数据集,我们的任务是清理、分析和解释这些数据。

首先,我们应该立即注意到列的大小不合适,这使我们无法看到每个单元格中的完整值。为了解决这个问题,我们可以调整每一列的大小,使它们变得足够宽,以捕获每一列中最长的单词。

我们首先需要通过 Ctrl+A 突出显示整个表格,一旦表格被突出显示,按 Alt,然后按 H、O 和 I,这将自动调整所有列以适合它们的宽度。

自动调整列宽后的表格;作者图片

了解数据集

在我们开始任何清理或分析之前,关键是我们首先要很好地理解我们正在处理的数据集。

在这里,我们可以观察到一个看起来像是交易数据集的表,其中每一行都表示客户在给定日期在特定商店购买的单个产品。在各列之间移动,我们会得到更多信息,如产品名称、数量、总销售额,以及客户属性,如他们的生命阶段和保费水平。

首先检查数据集的行和列总是一个好的做法,特别是我们以前没有见过或处理过的数据,因为这将有助于我们了解在执行数据检查和随后的数据清理时需要注意什么。

重命名列名

要重命名或替换单元格中的值,只需选择您想要更改的单元格,然后开始键入新值。

假设我们想重命名表中的所有列名:

  • LYLTY_CARD_NBR: 积分卡号码
  • 日期:日期
  • 店铺 _ 编号:店铺编号
  • TXN_ID: 交易 ID
  • 产品编号:产品编号
  • 产品名称:产品名称
  • 产品数量:产品数量
  • 总销售额:总销售额
  • 生命阶段:生命阶段
  • 优质客户:优质客户

将数据类型常规转换为短日期

Excel 中的每个单元格都被分配了一种数据类型,该数据类型决定了数据的存储和显示方式。

我们可以在 B 列中看到,日期没有按预期显示,这是因为它们被设置为数据类型 general。为了解决这个问题,我们需要将列转换成短日期。

首先,突出显示 B 列,并将数据类型从 general 更改为 short date。

将数据类型从常规更改为短日期;作者图片

微调功能

在 F 列中,我们可以看到产品名称中出现了不寻常的间距模式。为了清理这个问题,我们可以使用 Excel 中的 trim 函数,并传入产品名称作为它的参数。

trim 函数删除所有不寻常的间距模式;作者图片

本征函数

此外,在列 I 中,我们观察到文本都是大写字母。使用适当的函数,我们可以只大写每个单词的第一个字母,其余的都是小写字母。

适当的函数将每个单词的第一个字母大写;作者图片

删除重复项

重复项是数据集中相同记录的精确副本,它们应该被删除,因为它们没有增加任何附加值。

在 Excel 中删除重复项非常简单。在数据选项卡下,选择删除重复项。

删除重复项;作者图片

这里,我们将重复定义为表中所有字段的精确副本,这也是我们在上面的选择列表中包含所有列的原因。

单击“确定”后,Excel 将通知您找到的重复项的数量,并自动将它们从表中删除。

向总销售额列添加美元符号

因为总销售额是美元数字,所以在数字旁边加上美元符号才有意义。

为此,只需突出显示该列,并将该列转换为会计数字格式,用 Home 选项卡下的美元符号表示。

产品名称中的快速填充包装尺寸

Flash fill 是 Excel 中一个强大的预测功能。它可以感知您正在尝试的逻辑模式,并自动将该模式应用于整个列。

为了演示这一点,假设我们想从 f 列中的产品名称中提取包装尺寸。我们可以看到,包装尺寸,例如 175 克、150 克、210 克等,出现在每个产品名称的最末尾。因此,我们可以利用 flash fill 来识别这种模式,然后用相应产品的包装尺寸填充新列。

实际上,要启动 flash fill,我们必须首先键入第一个包装尺寸,在本例中为 175g,然后继续下一行。当您开始为下一个产品名称键入 150g 时,您应该会看到一个弹出选项,Excel 正在尝试用所有包装尺寸填充整个列。只需按下键盘上的回车键来应用闪光填充。

或者,如果该选项没有出现,请按 Ctrl+E,这是 flash fill 的键盘快捷键。

产品名称中的闪光填充包装尺寸;作者图片

从产品名称中提取第一个单词

假设我们并不真的关心产品的味道,相反,我们只想要品牌名称。最简单的方法是从每个产品名称中提取第一个单词。为此,我们需要两个独立的函数:left 和 find。

Left 从文本字符串的开头返回指定数量的字符。另一方面,Find 返回一个文本字符串在另一个文本字符串中的起始位置。

结合使用这两个函数的公式如下:

LEFT([Product Name], WHICH(" ", [Product Name])-1)

用简单的英语来说,这个公式基本上是说找到第一个空格字符之前的位置,并返回从产品名称到该位置的所有字符。结果,我们得到以下结果:

从产品名称中提取第一个单词;作者图片

查找并替换不一致的产品名称

从产品中获得品牌名称后,我们可以发现一些产品标签上的几个不一致的名称。一些例子包括:

  • Infzns 和 INF uz
  • Snbts 和 Sunbites
  • WW 和 Woolworths
  • RRD 和红石熟食店

产品名称标签不一致;作者图片

作为一名勤奋的数据科学家,我们需要在进行任何进一步分析之前妥善解决这个问题。

有几种方法可以做到这一点,但我在研讨会上演示的方法是使用查找和替换,键盘快捷键 Ctrl+H。

指定要查找的单词和要替换的单词,让 Excel 完成剩下的工作。但是,请记住,如果这个单词出现在同一个电子表格的其他地方,这个方法也会覆盖它。小心行事。

移除异常值

说到成为一名勤奋的数据科学家,在执行数据检查时要注意的另一件事是离群值。

离群值是明显偏离其余数据分布的数据点。重要的是,我们要去除它们,因为它们不仅扭曲了我们对变量的看法,而且在我们构建模型时会对我们的模型产生负面影响。

在我们的交易数据集中有两个异常值。这可以通过产品数量和总销售额列看到。具体来说,一个拥有 226000 号积分卡的顾客在两个不同的场合购买了 200 包筹码,总销售额为 650 美元。

出于本次研讨会的目的,我们将从表中删除这些异常值。

缺少日期

最后但并非最不重要的是,我们的数据中有一个缺失的日期,我必须承认,对于初学者来说,发现这一点很有挑战性,但尽管如此,这是我们努力彻底清理数据集的关键一步。

为了找到丢失的日期,我们需要将整个日期列传递给一个名为 unique 的函数,该函数只返回给定数组中的唯一值。然后,将日期从最早到最新排序。

尽管在 Excel 中没有直接找到遗漏日期的方法,但我们仍然可以想出自己的零碎方法来得到我们需要的东西。具体来说,我们可以构造一个 if-else 语句,如下所示:

IF([Tomorrow] - [Today] = 1, "Yes", "No")

这意味着如果明天的日期和今天的日期之差等于 1,则该日期是连续的,因此是正确的。否则,就会错过日期。

如果操作得当,我们应该会看到丢失的日期是 2018 年 12 月 25 日,也就是圣诞节。这是合理的,因为零售商店可能在假日期间关闭,因此,在特定的一天没有登记任何销售。

虽然 Excel 可能不是最通用和最全面的数据清理工具,但它确实提供了一种非常快速和简单的方法来检查数据集和完成一些基本任务。

为了补充这篇文章,我强烈推荐在我的 YouTube 频道上观看完整的视频,在那里我将更详细地演示这里涉及的每个步骤。

如果你从这篇文章中发现了任何价值,并且还不是一个媒体会员,如果你使用下面的链接注册会员,这对我和这个平台上的其他作者来说意义重大。它鼓励我们继续推出像这样的高质量和信息丰富的内容——提前感谢您!

https://chongjason.medium.com/membership

不知道接下来要读什么?这里有一些建议。

</10-most-important-sql-commands-every-data-analyst-needs-to-know-f0f568914b98>

数据清理工具箱

原文:https://towardsdatascience.com/data-cleaning-toolbox-e0c6a1b94684

由谷仓图片在 Unsplash 上拍摄

在分析您的数据之前,编译要注意的方面

在分析中,洞察的质量在很大程度上取决于所用数据的质量。正如已知的计算机科学谚语“垃圾输入,垃圾输出”,对于分析上下文,它可以被翻译为“垃圾数据输入,垃圾见解输出”。为了确保这些垃圾不会污染用于分析的优质数据,需要在开始数据争论或转换过程之前进行一些预处理。

引用维基百科的说法,数据清理/清除是从记录集、表格或数据库中检测并纠正(或删除)损坏或不准确记录的过程,指的是识别数据中不完整、不正确、不准确或不相关的部分,然后替换、修改或删除脏的或粗糙的数据。消除这一过程可能会导致不正确的、有偏见的和误导性的分析见解。

数据清理框架

数据清理的过程非常简单。

  1. 检查数据:识别数据质量异常(即不正确、不一致的数据)
  2. 处理数据异常:以不误导分析的最佳方式修复数据异常。这可以通过移除、转换或插补来完成。
  3. 验证并报告清理结果:检查数据质量异常是否通过处理得到修复,并记录处理&结果。

数据清理框架(图标向量由 freepik.com 宏向量创建)

数据清理要找哪些方面?

数据清理本质上是指对数据进行预处理,使其具有最佳分析质量。因此,在进行数据清理时,我们应该寻找并检查数据质量的各个方面。

准确(性)

代表一条信息反映现实的程度。

评估准确性可能特别棘手,因为您可能无法用数据本身来评估准确性。比方说,您正在评估客户数据,其中包括他们的地址。这个地址可能是一个假地址(根本不存在),或者部分是假的(城市或邮政编码在那里,但街道名称或建筑不存在)。为了评估这一点,你需要外部数据来验证,比如谷歌地图坐标。

这个外部数据源可能并不总是可用的,所以作为数据分析师,有时候你需要依赖你的领域知识。例如,如果发现一个几秒钟的交货时间数据,而当时距离应该是几公里远,那么你就有权利质疑这个数据的准确性。

有效期

以特定格式收集信息的程度,遵循特定的业务规则

这些规则可以从数据类型约束(即年龄值的整数)、范围约束(即出生日期不能是未来日期)到正则表达式约束(即电话号码或电子邮件格式)不等。

尽管这些规则可以在数据输入/收集时实施(并防止额外的数据清理工作),但有时它们无法建立(即出于设计或用户方便的目的)或存在一些后端错误。这包括从各种来源/输入方法收集的数据,在整合时存在有效性错误。

一致性

检查存储在一个位置的信息是否与存储在其他位置的相关数据相匹配。

一致性可以是数据定义或引用的形式(即一个表中的“客户 ID”数据需要引用组织内其他表中的相同“客户 ID”实体),也可以是指标和格式的单位(即每个数据源的所有日期/时间引用相同的时区)。

这与有效性高度相关,因为在某些方面,可以有适当的规则来确保数据源的一致性。

完全

代表数据在多大程度上满足了你对全面的期望;是否具备所有必要的措施。

这在很大程度上依赖于数据收集,一旦有丢失的数据,可能很难重新填充。当然,我们可以寻找其他数据来源,看看是否有任何准确的副本,或者可以回去收集(即发电子邮件给客户再次填写)。

在数据清理中,我们需要非常小心地处理完整性,因为它可能会扭曲分析结果,并产生误导性的见解。

独特性

检查实体是否是数据集中存在该信息的唯一实例

检查唯一性也受数据上下文的影响。有时需要唯一性(即只能有一个客户有这个特定的社会安全号码),但是有时也不能保持唯一性(即一个电话号码可以列在两个客户下面,因为他们是同一个家庭的一部分)。我们需要了解上下文以及何时应用这条规则。

检查数据异常的工具和技术

通用数据属性

我们可以首先检查通用数据属性(行数、数据类型),了解是否有任何问题。具体来说,在 Python 中,我们可以使用[dataframe.info](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.info.html)函数来获取数据集中的可用列、非空计数和数据类型。

Python Pandas 中的数据帧信息

该函数将帮助我们快速了解是否有我们需要的所有字段(列名),是否有任何缺失数据(非空计数),以及数据是否是预期的数据类型(即项目数量的数值)。

缺失数据

上面的 dataframe info 函数可以为我们提供缺失值的高级概述。为了对丢失的数据进行更广泛的评估,我们还可以使用[missingno](https://github.com/ResidentMario/missingno)库将其可视化。

库中的matrix函数提供了空数据的可视化,让我们了解空数据是如何分布的。我们还可以在可视化数据帧之前对其进行排序,以检查一列中缺失的数据是否与其他列相关(例如,如果空的客户 ID 数据都来自某个特定的国家,则该国家可能存在数据收集问题)。

使用 missingno 的缺失数据可视化

独特性

在 Pandas 中使用[duplicated](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html)功能可以评估唯一性。您可以定义要检查重复的列(或者让它检查所有列),函数将输出一个布尔值,不管该特定行是否重复。

在 Python 中评估重复项

范围约束

由于不同的数据字段可以根据上下文而处于不同的范围约束中(即,出生日期只能是过去的日期值,而计划约会日期只能是未来的值),因此可以以各种方式来评估范围约束。对于数据分析师来说,使用他们的领域知识来调整这一点是很重要的。

为了识别这样的问题,我们可以探索数据集的统计分布并对其进行评估。一个常用的函数是[Dataframe.describe()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.describe.html)。该函数提供数据集的描述性统计数据,包括集中趋势和分散性。

探索数据集的描述性统计数据

使用describe函数,我们可以很容易地识别出quantityunit_price字段中不寻常的最小值,该值在某种程度上小于零。

除了上面的数字描述性统计,我们还可以使用数据可视化来了解数据集分布,并识别出超出预期数据范围值的分布。可以用于这种可视化的一个功能是distplot

分布图,用于确定范围约束中的问题

使用分布图,我们可以清楚地看到有些值超出了范围;低于 0。我们还可以看到,与整个数据集相比,低于 0 的值非常低。这有助于确定可以采取哪些措施来解决这个问题。

一致性

有各种各样的一致性问题需要不同的工具来检测。

最常见的一致性问题之一是不一致的分类标签值。例如,在“客户国家”列中,对于同一个国家越南,我们可以找到不同的值:“越南”、“越南”、“VN”、“越南”等。

另一个首要的一致性问题是格式问题。这可以是日期栏(即 YY 月/日 vs YYY 月/日等)、电话号码(即+12345678890 vs+1–234–567–8890)或网址(即http://hello.comvswww . hello . com)。.)

为了识别这个问题,我们可以使用[Dataframe.groupby](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html)功能。使用这个函数,我们可以研究一个列中可用的不同值以及相关的值计数。这将有助于找到需要更新和修复的值。

确定与 groupby 的不一致

处理数据异常

关于如何处理上面列出的数据异常,没有唯一正确的答案。但是有三个主要选项可以用来处理这些异常,并为分析准备更好的数据。

1.删除/丢弃数据

对于任何数据异常问题,我们都可以执行数据删除。在这种处理中,当我们发现一个问题时,我们丢弃整个观察(即数据集上的整行)。

但是,如果我们确定要删除的数据不是信息性的,则只能 执行此操作。信息不足可能是因为数量相对较少(即百万行中的一行)、值重复(只需要保留一条记录)或损坏太严重(即 90%的字段值丢失或不准确)。在其他情况下,我们应该在执行数据删除之前考虑其他处理方案。

# dropping the problematic data : description_id is nulldf.dropna(subset = ["description"], inplace=True)

在 Python 中,我们可以使用[Dataframe.drop](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html)及其相关函数([dropna](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html#pandas.DataFrame.dropna)[drop_duplicates](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates.html#pandas.DataFrame.drop_duplicates))来实现这一点。

2.均匀化

对于数据不一致的问题,通常可以进行均匀化。为了进行统一,我们需要充分理解数据背景——可用的不一致性(即国家案例:“越南”、“越南”、“VN”、“越南”)和期望的最终统一结果(即“越南”)。

虽然在大多数情况下,我们需要在个案的基础上进行一致化(因为不同数据集的分类变量不同),但有一些工具可以用来格式化不一致。

  • 对于日期/时间:使用[Pandas.to_datetime](https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html)以编程方式将多种不同格式的数据转换为统一的日期时间格式
  • 对于电话号码:使用 Python 中的[phonenumbers](https://pypi.org/project/phonenumbers/)库获得标准化的国家代码和国家电话号码
  • 对于 URL:自定义函数定义[ 示例

3.替换/插补

对于具有超范围值和/或缺失值问题的数据,可以进行替换。具体来说,对于数值数据类型的缺失值问题,可以从数据集中指定的统计值进行替换,我们通常称之为插补。

为了能够替换数据值,我们需要像数据分析师一样利用我们的领域知识。对于超出范围或无效的数据,替换源可以来自数据集之外(即根据城市值更新国家/州值),也可以来自数据集之内(即使用出现次数最多的电话号码作为客户电话号码的真实值)。

对于插补,有一些统计值选项可以插补到数据集。当该值中的数据频率与其他值相比明显较高,并且丢失的数据看起来像它的可能性很高时,最好的方法是使用模式值。另一种选择是使用中间值。当数据集不是高度倾斜时,我们可以使用均值/平均值,或者当数据集更加倾斜时,可以使用中值

在工具方面,我们可以使用 Python 中的[scikitlearn.impute](https://scikit-learn.org/stable/modules/impute.html)库,根据定义的插补类型自动对数据集进行插补。查看这篇来自 Analytics Vidhya 的关于详细输入技术的文章。

报告和总结

对数据集进行的任何处理都可能改变从数据分析中产生的见解。因此,记录所有发现的质量问题和对这些异常情况的处理是很重要的。

斯科特·格雷厄姆在 Unsplash 上的照片

该报告/文档对于以下情况尤其有用:

  • 改进数据收集流程。我们可以添加业务规则来验证数据输入或评估发现大量缺失数据的数据管道。
  • 重现分析如果将来有任何数据修正可用。

由于不适当的/标准化的业务流程或数据管道中的谬误,数据异常很容易被发现。由于数据分析师负责从给定的数据集产生最大的洞察力,因此进行数据清理以确保数据具有最佳的分析质量是正确的。

这将通过(1)识别可用的异常,(2)相应地处理它们,以及(3)验证/报告清洁过程和结果来完成。

Polars 中的数据清理

原文:https://towardsdatascience.com/data-cleansing-in-polars-f9314ea04a8e

了解如何在 Polars 数据框中执行数据清理

Hans-Jurgen Mager 在 Unsplash 上拍摄的照片

在本文中,我将继续探索 Polars DataFrame 库。这一次,我将关注数据科学家花费最多时间的事情— 数据清理。数据清理是检测和更正数据集中损坏值的过程。在现实生活中,这个看似简单的过程需要花费大量时间,因为您遇到的大多数数据都可能包含缺失值、错误值或不相关的值。

加载数据帧

在这篇文章中,我将使用泰坦尼克号数据集。

数据来源 :本文数据来源来自https://www.kaggle.com/datasets/tedllh/titanic-train

许可— 数据库内容许可(DbCL)v 1.0https://opendatacommons.org/licenses/dbcl/1-0/

首先,将 CSV 加载到 Polars 数据框中:

import polars as pl
q = (
    pl.scan_csv('titanic_train.csv')    
)
df = q.collect()
df

数据帧包含 891 行 12 列:

作者图片

CSV 文件中所有缺失的值将作为null 加载到 Polars 数据框中。

寻找空值

要检查特定列中的空值,使用select()方法选择该列,然后调用is_null()方法:

df.select(
    pl.col('Cabin').is_null()  
)

is_null()方法将结果作为布尔值的数据帧返回:

作者图片

计算空值的数量

知道列中有多少行有空值比看到一个满是布尔值的数据帧更有用。因此,您可以使用sum()方法:

df.select(
    pl.col('Cabin').is_null()**.sum() ** 
)

从下面的结果可以看出,列有 687 个空值:

作者图片

sum()count()之间的差异—sum()方法只对那些为true的值求和;而count()方法对所有值求和,包括false

如果您想知道列中的任何值是否包含 null,请使用any()方法:

df.select(
    pl.col('Cabin').is_null()**.any()   # returns true**
)

同样,要查看列中的所有值是否都为空,请使用all()方法:

df.select(
    pl.col('Cabin').is_null()**.all()  # returns false**
)

对数据帧中每一列的空值数量进行计数

通常,您希望快速浏览一下数据帧中的哪些列包含空值,而不是逐个检查每一列。因此,遍历列并打印结果会很有用。您可以通过调用get_columns()方法并遍历它来获取数据帧中的所有列:

for col in df.get_columns():
    print(f'{col.name} - {col.is_null().sum()}')

上面的代码片段打印出以下输出:

PassengerId - 0
Survived - 0
Pclass - 0
Name - 0
Sex - 0
**Age - 177**
SibSp - 0
Parch - 0
Ticket - 0
Fare - 0
**Cabin - 687**
**Embarked - 2**

您可以看到以下列包含空值:

  • 年龄
  • 机舱
  • 上船

替换空值

一旦确定了哪些列包含空值,下一个逻辑步骤就是:

  • 用其他值填充空值
  • 删除包含空值的行

填充整个数据帧

您可以使用fill_null()方法填充整个数据帧中的空值:

df.**fill_null(strategy='backward')**

在上面的语句中,我使用了向后填充策略,其中所有的空值都用下一个非空值填充:

作者图片

请注意,最后一行的舱室列包含一个空值。这是因为它没有下一行来引用要填充的值。

您还可以使用向前填充策略,其中所有空值都用之前的非空值填充:

df.fill_null(strategy='**forward**')

上述语句的输出如下所示:

作者图片

现在您将意识到第一行的 Cabin 值是null,因为它没有前一行来引用要填充的值。

也可以用固定值填充空值,如 0:

df.fill_null(0)

上述语句的输出如下所示:

作者图片

填写特定的栏

根据列的数据类型,您通常会对不同的列采用不同的填充值。例如,您可以使用向后填充策略填充列:

df.select(
    pl.col('Cabin').**fill_null(fill_value='backward')**
)

注意,当您在表达式上调用fill_null()方法时,为策略设置的参数是fill_value而不是strategy

注意,上面的语句返回的数据帧只包含列:

作者图片

如果要在数据帧中包含其他列,请添加以下粗体语句:

df.select(
    **[
        pl.exclude('Cabin'),      # select all columns except Cabin**
        pl.col('Cabin').fill_null(fill_value='backward')
 **]**
)

现在返回整个数据帧:

作者图片

您也可以用固定值替换特定列中的空值:

df.select(
    [
        pl.exclude('**Age**'),
 **       pl.col('Age').fill_null(fill_value=0)**
    ]
)

或者用该列的平均值替换它们:

df.select(
    [
        pl.exclude('**Age**'),
 **       pl.col('Age').fill_null(fill_value=pl.col('Age').mean())**
    ]
)

上述代码片段返回以下结果:

作者图片

如果您想用列中出现频率最高的值替换空值,该怎么办?例如,对于登船列,您希望用大多数乘客登船的港口替换空值。在这种情况下,您可以使用mode()方法:

df.select(
    [
        pl.exclude('Embarked'),
        pl.col('Embarked').fill_null(
            fill_value=**pl.col('Embarked').mode()**)
    ]
)

mode()方法返回一列中出现频率最高的值。

请注意,mode()不能在浮点列上工作。

删除行和列

有时,当数据帧中有空值时,删除行是有意义的,特别是当空值的行数相对于您拥有的总行数很小时。要删除整个数据帧中所有包含空值的行,请使用drop_nulls()方法:

df.drop_nulls()

注意,这样做之后,结果剩下 183 行:

作者图片

在我们的数据集中,这样做并不是一个好主意,因为 Cabin 列具有最多的空值。因此,您应该真正删除列,就像这样:

df.select(
 **pl.exclude('Cabin')**
)

您还可以使用drop()方法来删除一列或多列:

df.**drop**(['Cabin'])            # drop the Cabin column
df.**drop**(['Ticket','Fare'])    # drop the Ticket and Fare columns

注意,drop()方法并不修改原始数据帧——它只是返回删除了指定列的数据帧。如果你想修改原始数据帧,使用drop_in_place()方法:

df.**drop_in_place**('Ticket')

注意,drop_in_place()方法只能删除一列。它将删除的列作为 Polars 系列返回。

对于drop_nulls()方法,您还可以使用subset参数删除基于特定列的行:

df.drop_nulls(**subset**=['Age','Embarked'])

在这种情况下,只有在 Ageabowed列中具有空值的行将被删除:

作者图片

您也可以在特定的列上直接调用drop_nulls()方法:

df.select(
 **pl.col(['Embarked']).drop_nulls()**
)

在这种情况下,结果将是一个数据帧,其中包含删除了空值的装载的列:

作者图片

删除重复值

我将在本文中讨论的最后一种数据清理技术是删除重复项。对于本例,我将手动创建一个 Polars 数据帧:

import polars as pldf = pl.DataFrame(
    {
        "A": [1,4,4,7,7,10,10,13,16],
        "B": [2,5,5,8,18,11,11,14,17],
        "C": [3,6,6,9,9,12,12,15,18]        
    }
)
df

作者图片

注意有一些重复的行,例如 4、5、6 以及 10、11、12。此外,有些行中 A 列和 C 列的值是重复的,例如 7,9。

使用 unique()方法

首先,让我们使用unique()方法删除重复项:

df.unique()

也可以用distinct()的方法。然而,在 Polars 0 . 13 . 13 版本中,它已经被弃用,因此不推荐使用它。

作者图片

从输出中可以观察到,如果您没有给distinct()方法提供任何参数,所有重复的行将被删除,只有一行将被保留。

您还可以使用subset参数删除基于特定列的重复项:

df.unique(**subset=['A','C']**, keep='first')

作者图片

在上面的结果中,观察到行 7,8,9 被保留,而下一行 7,18,9 被删除。这是因为对于这两行,它们的 A 列和 c 列有重复的值。keep=’first’参数(默认参数值)保留第一个重复的行并删除其余的。

如果您想保留最后一个重复行,请将keep设置为‘last’:

df.unique(subset=['A','C'], **keep='last'**)

作者图片

注意,现在将保留第 7、18、9 行。

删除所有重复的行

如何删除 Polars 中所有重复的行?不像在 Pandas 中,您可以将drop_duplicates()方法中的keep参数设置为False来删除所有的重复行:

**# Assuming df is a Pandas DataFrame**
df.drop_duplicates(**keep=False**)

Polars 中的unique()方法中的keep参数不接受False值。所以如果你想删除重复的值,你必须做一些不同的事情。

首先,您可以使用is_duplicated()方法获得一系列结果,表明数据帧中的哪些行是重复的:

df.is_duplicated()

您将得到如下结果:

shape: (9,)
Series: '' [bool]
[
	false
	true
	true
	false
	false
	true
	true
	false
	false
]

要获取所有不重复的行(实际上是删除所有重复的行),可以使用方括号索引方法:

df[~df.is_duplicated()]

作者图片

但是因为在 Polars 中不推荐使用方括号索引方法,所以你应该使用一个更加极性友好的方法。您可以使用filter()pl.lit()方法完成此操作:

df.**filter**(
    **pl.lit**(~df.is_duplicated())
)

结果将与之前的结果相同。

最后,如果您想要删除基于特定列的所有重复项,您可以简单地使用pl.col()方法并传入特定的列名:

df.filter(
    ~**pl.col(['A','C'])**.is_duplicated()
)

上述语句生成以下输出:

作者图片

https://weimenglee.medium.com/membership

我将在即将到来的新加坡 ML 会议(2022 年 11 月 22-24 日)上主持一个关于 Polars 的研讨会。如果你想在 Polars 数据框架上快速起步,请在https://ml conference . ai/machine-learning-advanced-development/using-Polars-for-data-analytics-workshop/注册我的研讨会。

摘要

在本文中,我向您展示了如何:

  • 检查数据帧中的空值
  • 计算空值的数量
  • 使用不同的策略替换空值-固定值、向前填充和向后填充
  • 删除包含空值的行
  • 删除整列
  • 删除重复的行

我唯一的愿望是 Polars 中的unique()方法中的keep参数接受False值,这样我就可以简单地删除重复的行,而不需要求助于使用filter()方法。如果你知道更有效的方法,请在评论中告诉我!

利用机器学习进行数据清洗

原文:https://towardsdatascience.com/data-cleansing-with-machine-learning-aac1221815

手动输入数据的概念证明

达米安·扎莱斯基在 Unsplash 上拍摄的照片

手动输入数据可能是世界上最混乱的数据之一。粗手指打字错误、昵称和缩写只是困扰手动输入数据的一些常见问题。甚至像日期字段这样简单的东西也可能以各种格式和分隔符结束。然而,在处理了来自各种机构和保险公司的医生数据后,我开始厌恶手工输入姓名。

清理工作尝试了多次,但最终很明显,这个问题是普遍存在的,任何一个人或团队都无法独自解决。为了做出凹痕(自动凹痕),我开始尝试各种模糊逻辑匹配的方法。总的想法是定义两个名字之间的某种形式的度量/距离,并确定适当的截断来表示“匹配”或“不匹配”。每种方法在特定情况下都有效,但是各种系统因素,如姓名长度或原产国,将不可避免地迫使匹配结果超出截止范围。有趣的是,与不匹配的名字相比,匹配名字之间的编辑距离仍然相对较小。这是因为扩大两个匹配之间的距离的相同特征成比例地扩大不匹配之间的距离。

这激发了一个想法,使用机器学习来识别差距,而不是依赖于一个截止。以下想法为机器学习方法清理手动输入数据奠定了基础。

布雷特·乔丹在 Unsplash 上的照片

该过程

第一步:标准化

将任何“姓氏”或“姓氏,名字”条目转换为相同的格式。或者,更好的是,把它们分成不同的领域。做你想做的事。只要确保所有的名字都是相同的格式。这是一小步,但影响重大。机器正在为我们做一些重大决定。让我们至少在力所能及的地方帮忙。

分开的字段产生更多的数据,并允许更细微的测量。并非所有数据都是平等的。与姓名相比,地址可能需要不同的测量方法。中间的首字母可能需要更多的重量。

步骤 2:播种数据

假设我们的数据库中有了一个新名字,“威利·旺卡”。我们有一个 10k 已知条目的列表,但是“威利·旺卡”不在其中。当我们将这个新条目与“William Wonka”进行匹配时,我们需要用我们的新数据点播种已知条目。从字面上看,只需在数据中添加“威利·旺卡”即可。

这给了我们一个极端的异常值,当我们测量我们的编辑距离时,他代表了一个完美的匹配。这个种子条目也作为我们的集群的基础,相近的匹配将加入其中。所有其他不匹配的名称将被集中到不包括我们的种子条目的集群中。

杰里米·毕晓普在 Unsplash 上的照片

步骤 3:测量编辑距离

这是魔法开始的地方。编辑距离帮助我们确定两个名字之间的距离。有各种不同的方法来测量名字之间的距离。下面是一个简短的列表:

  1. Levenshtein 距离:使用删除、插入和替换
  2. 最长公共子序列 (LCS):使用插入和删除
  3. 汉明距离:仅使用替换,要求字符串长度相同
  4. damer au–Levenshtein 距离:使用插入、删除、替换和相邻字符的换位。
  5. Jaro 距离:仅使用换位

另一种测量编辑距离的方法是使用 soundex 算法,该算法使用语音字符而不是字母表。虽然它本身不是距离的度量,但它增加了一个额外的标准化层。想象一下,输入你在电话中听到的名字。你听到“比利”这个名字,但它是拼写为“比利”还是“比利”。正常的编辑距离会将这些视为不同。soundex 算法之上的编辑距离会说它们是相同的。

第四步:让机器来决定!

亚历山大·奈特在 Unsplash 上拍照

最后,聚类算法开始为我们做决定。然而,并不是任何聚类算法都适用于此。重要的是使用凝聚聚类算法,该算法从 n 个聚类开始(其中 n 是数据点的数量),然后合并最近的 2 个聚类,直到只剩下 k 个聚类(其中 k 是聚类停止的聚类数量)。我们最终得到的聚类数量取决于数据点的数量和距离。一个好的起点是十个最终的集群。九个虚拟聚类来消耗不匹配的聚类,一个聚类包含我们可能的匹配。

凝聚聚类还确保我们的种子条目获得它们自己的聚类,并且只有比任何非匹配聚类更接近种子条目的数据点被包括在内。这是计算机为我们做决定的地方。还记得截止点如何移动,但间隙不会移动吗?聚类算法使用该间隙作为边界,它根据所有其他数据点来确定该边界。那些不匹配项越远,近似匹配项相对于我们的种子条目就越接近。因此,当该算法对那些相近的匹配进行聚类时,它会根据唯一的一组距离做出决定。

考虑

这里的普通方法并不是数据清理的灵丹妙药。任何实施都面临一些挑战:

  1. 这个过程一次只能处理一个名字。当清理大型数据集时,这是一个真正的考虑因素。然而,每个决定都可以在真空中发生,这使得它非常适合多线程设置。你不必有一个完全干净的数据集来匹配。
  2. 原产国和语言与 soundex 算法有关。这使得他们不是一个一刀切。理想情况下,您可以根据目标名称的来源交换算法。不过,任何 soundex 通常都比没有 soundex 好。
  3. 普通的凝聚聚类算法需要大量资源,即使是中等大小的数据集也需要考虑。
  4. 并非所有的距离都是一样的。编辑距离的适当平衡是很重要的,并且会随着姓名、地址、首字母等的变化而变化。此外,标准化分数可以大大提高性能。

结论

谢谢你能走到这一步!这篇文章在使用机器学习进行数据清理的表述上有点抽象。对于我们这些更注重实践的人来说,我制作了一个在线互动演示。尝试一下,感受一下算法是如何工作的,以及什么样的变化会改变算法。首先在数据集中取一个名字,稍微拼错一点。

如果你喜欢这个概念证明,并希望联系或关注,请在 LinkedIn 上查看我,并关注 Medium 上的更多文章!

数据契约—确保数据网格体系结构的稳健性

原文:https://towardsdatascience.com/data-contracts-ensure-robustness-in-your-data-mesh-architecture-69a3c38f07db

在联合架构中,职责分布在域之间,很难监督依赖性并获得数据使用方面的见解。这就是数据契约发挥作用的地方。为什么数据契约很重要?因为它们提供了对谁拥有什么样的数据产品的洞察。他们支持制定标准并满怀信心地管理您的数据管道。它们提供了关于哪些数据产品正在被消费、由谁消费以及消费目的的信息。一句话:数据契约对于健壮的数据管理是必不可少的!

在您继续阅读之前,我鼓励您从两个维度来看待数据产品的分布和使用。首先,存在技术问题,如数据管道处理和对数据稳定性的共同期望。第二,还有业务方面的考虑,比如就数据共享的目的达成一致,这可能包括使用、隐私和目的(包括限制)目标。通常,每个维度都有不同的角色。对于技术问题,您通常依赖于应用程序所有者或数据工程师。对于业务问题,您通常依赖于产品所有者或业务代表。

数据合约

数据契约类似于数据交付契约或服务契约。它们很重要,因为当数据产品变得流行和广泛使用时,您需要实现版本控制和管理兼容性。这是必要的,因为在一个更大的或分布式的架构中,更难监督变更。从其他应用程序访问或使用数据的应用程序总是会受到耦合的影响。耦合意味着高度的相互依赖。例如,对数据结构的任何更改都会对其他应用程序产生直接影响。在许多应用程序相互耦合的情况下,有时会看到级联效应。即使是对单个应用程序的微小更改也可能导致同时对许多应用程序进行调整。因此,许多架构师和软件工程师避免构建耦合架构。

数据契约被定位为这个技术问题的解决方案。数据契约保证接口兼容性,并包括服务条款和服务水平协议(SLA)。服务条款描述了如何使用数据,例如,仅用于开发、测试或生产。SLA 通常还描述数据交付和接口的质量。它还可能包括正常运行时间、错误率和可用性,以及弃用、路线图和版本号。

在许多情况下,数据契约是元数据驱动的摄取框架的一部分。例如,它们作为元数据记录存储在集中管理的 metastore 中,并在数据管道执行、数据类型验证、模式、互操作性标准、协议版本、缺失数据的默认规则等方面发挥重要作用。因此,数据契约包含了大量的技术元数据。

数据契约的元数据架构

对于分布式架构,我的建议是将您的数据管道框架分布在不同的域中。在这种方法中,域遵循一种通用的工作方式。域自己处理数据,这意味着控制和责任属于您的域。然而,框架和元数据仍然在中央治理之下。

当实现联合工作方式时,另一个建议是从小处着手。从基础开始,比如在共享元数据存储库中存储用于模式验证的元数据、企业标识符和对其他数据集的引用。为可视化数据移动添加数据沿袭支持。接下来,使用像远大前程这样的库来验证技术数据质量,引导您的过程并实现控制。使用 Azure Synapse 和权限构建动态数据管道的最佳实践可在此处找到:https://Piet hein . medium . com/modern-data-pipelines-with-Azure-Synapse-analytics-and-Azure-view-Fe 752d 874 c 67

所有的控制都应该是持续集成过程的一部分。您应该捕获所有运行时信息,比如度量和日志记录,并使其成为您的元数据基础的一部分。这种方法提供了对数据管道稳定性的可见性。因此,从您的域到中央管理驾驶舱有一个反馈回路。

当实现所有数据移动的稳定性时,通过捕获哪些数据消费者使用哪些数据属性(如表和列)来继续扩展。您可以对该信息使用相同的 metastore。这种关于使用的输入是检测突破性变化所必需的。是你的机制让你决定对生产者或消费者的影响。如果数据产品数据集没有被任何人消费,您可以允许破坏性的变化发生。控制数据提供者和消费者之间的握手。我见过一些公司使用源代码控制来管理这个过程,比如 Git。

数据共享协议

数据共享协议是数据合同的延伸。它们涵盖了预期用途、隐私和目的(包括限制)。它们独立于接口,让用户深入了解哪些数据用于何种特定目的,并作为数据安全控制的输入。例如,这些协议可以是对什么数据应用什么过滤器或安全保护。

数据共享协议还可以防止数据使用上的误解。在数据共享之前,域应该讨论数据共享和数据使用问题。当他们达成合作共识时,他们应该在数据共享协议中记录这种共识。您的数据共享协议可能还包括功能数据质量、历史化、数据生命周期管理和进一步分发等项目。这种达成共识的方法不仅从法规的角度来看很重要,而且还能为您的组织带来价值。

您还希望对数据应用分类和条件,如敏感度标签或过滤条件。这成为保护数据时的一个问题。在上一节的图表中,您可以看到一个“数据产品边车”。 Zhamak 将此称为注入策略执行的组件或层,如数据访问控制或数据消费的输出方法。在我之前的角色中,我设计了一个类似的模式:数据产品访问层。它是对您的域数据的安全抽象,用于处理您的安全实施。它是从数据契约中生成的安全层,用于安全地访问数据。它可以是 ACL 或无服务器视图,这是在达成共识后从您的数据契约存储库动态创建的。或为特定消费者选择和过滤的重复数据集。您的最终目标必须是以完全自动化的方式从您的数据契约中获得这些安全视图。

最后,我鼓励您在数据契约属性和文档之间建立联系。确保提供了语义上下文,并与您的术语表建立了关系。这使得消费者能够理解从业务需求到实际实现的转换是如何进行的。如果与业务术语的关系对您很重要,请考虑实施策略。例如,只有当所有数据产品属性都链接到业务术语实体时,才能建立合同。相同的策略也可能适用于上下文变化,例如关系和定义调整。

启动时的最佳实践

如何开始使用数据契约?怎么把东西变得实用?我的建议是慢慢开始。这主要是一个组织上的挑战。相互之间不要引入太多的变化。数据契约是一种文化转变。用户需要熟悉并理解数据所有权的重要性。这种转变也是为了在太少和太多的元数据属性之间找到最佳平衡点。关于过渡:

  1. 首先,创建技术数据管道的稳定性。如果它们是不稳定的,并且容易受到意想不到的和破坏性的变化,那么你的用例将不会进入生产。
  2. 对于您的数据共享协议,通过建立一个简单实用的流程开始。不要把事情复杂化。例如,您可以从用 Microsoft Forms 设计的简单表单或模板开始。你应该用简明易懂的语言起草。接受手动流程。限制您的初始元数据需求。你的第一阶段是关于文化转变和收集需求。迭代,直到您的元数据需求变得稳定。
  3. 在您完成第一个流程后,尝试用基于 web 的应用程序、数据库和/或消息队列来替换您的手动表单。在此阶段,您的中央数据治理团队仍将进行监督。数据访问的粒度级别通常是粗粒度的,文件夹或文件也是如此。尝试利用 REST APIs 来自动提供数据访问策略或 ACL。
  4. 您的下一个阶段是实施更强大的处理批准的工作流程。让您的数据所有者或数据管理者处于领先地位。您的中央数据治理团队将在后座进行监督。该团队定期审查所有数据合同。在这个阶段,您还应该有一个数据目录,显示所有现成的数据产品。提高您的数据安全性和执行能力。允许更细粒度的选择和过滤。考虑像动态数据屏蔽这样的技术来防止数据重复。
  5. 在您旅程的终点,一切都将是自助服务和全自动的。这包括自动安全执行和预测数据批准的机器学习。例如,安全视图在获得批准后会自动部署。

数据契约是一种相对较新的数据网格方法。它们很重要,因为它们提供了依赖关系和数据使用的透明性。从小处着手,首先关注技术稳定性和标准化。通过使用吸取经验教训的过程进行迭代。数据治理是必不可少的,但是过多会造成开销。慢慢建立和自动化。这些是我学到的教训。

数据契约—从零到英雄

原文:https://towardsdatascience.com/data-contracts-from-zero-to-hero-343717ac4d5e

数据契约的实用方法

书写数据契约——作者图像,稳定扩散生成。

最近,社交媒体上围绕数据合同有很多噪音。一些数据从业者分享了关于利弊的观点,但主要是关于它是什么及其定义。虽然我认为数据契约是一个疯狂的话题,但我想分享我的经验和如何开始的实用技巧。数据契约是真实而有价值的东西,你现在就可以用比你想象的更少的努力开始利用它。但是我们为什么首先需要它们呢?

🔥数据契约有什么模糊之处?

积极主动而不是被动

如果你从事数据工作,你很可能会多次遇到这个问题:数据是错误的,而你不知道为什么。数据上游似乎有问题,但你的内部同事都不知道为什么,那么我们该怎么办?我们应该联系谁?

我们怎么会在那里结束?

随着数据不再是头等公民,数据团队大多开始在服务于其他初始目标的现有基础架构上进行分析。他们将根据现有的操作数据库“插入”他们的管道,将数据卸载到一个仓库,并处理其余的。

作者图片

数据团队被困在锤子(他们无法控制的操作数据库)和大声疾呼其需求的业务之间。

他们可以在某种程度上变一些魔术,但是垃圾进垃圾出。上游的问题越多,对数据团队的挑战就越大。

这就是数据契约可以发挥作用的地方。数据团队有一个明确的方法来询问他们需要什么,并提出一个更严格的过程来处理变更管理。

📎我们如何实现这样的契约?

如果我们能从头开始重新做每件事会怎么样?

起初这似乎不现实,因为你很少有机会从绿地基础设施开始。然而,以今天的云技术,这并不那么遥不可及。

事件驱动的架构有助于支持数据契约,原因有多种:

  • 事件可以是强类型的,每个事件都可以与一个模式版本相关联。
  • 如果你使用一个无服务器的事件流,并且基础设施是自包含的(每个主题),那么它是便宜的。
  • 事件平台(又名发布/订阅)为传统的下游数据消费(对象存储、数据仓库)提供了内置的连接器。

像 AWS Kinesis 或 Kafka(有像 AWS MSK 或 Confluent 这样的托管 Kafka)这样的技术,云发布/订阅是让你开始的好选择。

这个想法是与后端创建一个全新的合同,并就(数据)消费者的最佳需求达成一致。

后端人员通常有分析之外的事件驱动模式的用例。例如,微服务之间的通信。这里有两个选项:

  1. 对模式做出妥协,使其既适合数据分析又适合他们的用例
  2. 创建一个专门针对数据分析使用情形的活动

争取 1。避免在源头创建爆炸式的事件类型,但是由于涉及到更多的利益相关者,讨论变更可能会有点困难。

作者图片

定义创建/修改合同的流程

像 Kafka 或 AWS MSK 这样的大多数事件平台都有自己的模式注册中心(在 AWS 中是 AWS 胶合注册中心)。对于创建的每个主题,您都需要注册一个模式。

在数据生产者和数据消费者之间实现这样一个过程的简单方法是重用一个 git 过程

作者图片

所有模式创建/更改/删除都可以通过 git pull 请求来完成。有了主题的明确的所有权和消费者,您可以很快知道谁可以批准对模式的更改。CI/CD 管道在合并时用相应的模式选择并部署变更。

这一过程的美妙之处在于它迫使讨论在做出任何改变之前发生

🚀生产清单

当用事件总线实现数据契约时,这里有一些东西值得推荐。

技巧 1:请使用类型化模式

维护 JSON schema 是一件痛苦的事情。太多自由了。类型化事件的通用标准是使用 Avro 。它受到所有模式注册中心的支持,并且与其他处理引擎(Flink、Spark 等)有很多互操作性。)进行进一步改造。

提示 2:不要在筑巢领域疯狂

因为我们通常以列格式分析数据,所以拥有太多嵌套的复杂字段对于模式演化来说是一个挑战,处理起来也很昂贵。如果您有许多嵌套字段,可以考虑将事件分成多个具有特定模式的事件。

技巧 3:但是你可以在嵌套字段上做一些妥协

如果生产者不确定所有模式的定义(例如,他们依赖于第三方 API),您可以在定义中尽可能地深入,将其余的未知部分作为 JSON 字符串。展开/访问这样的字段会在计算上花费更多,但是它在数据生产者方面留下了更多的灵活性。

技巧 4:在事件中设置额外的元数据字段。

类似于ownerdomainteam_channel,或者用特定的字段标识 PII 列将有助于以后明确所有权、血统和访问管理。

Schemata 是一个很好的资源,可以用来使用模式事件建模或从中获得灵感。

提示 5:不要改变给定字段的数据类型。

最好用新类型重命名字段。虽然我们可以在下游建立一个机制来检测模式版本,但是允许在没有重命名的情况下对字段进行类型更改总是会导致令人头疼的问题。如果你接受一个案子,你将不得不处理所有其他的。所以如果把一个int改成一个string不伤人;当你把一辆int换成float或者把一辆float换成int会发生什么?

技巧 6:没有事件总线,您仍然可以实现数据契约

如果您在git中为您的操作数据库保存了所有的 DDL 语句,您仍然可以实现上面的大部分内容。例如,在对数据库进行任何更改时,都会有一个 git 流程提醒需要批准的消费者。然而,这有点困难,因为当创建模式时,数据团队没有机会发言。

🪃把所有权还给数据生产者

数据契约只是将所有权还给数据生产者的一种趋势,而不是让数据团队承受我们扔给他们的任何数据。

这很棒。它让下游的一切变得更容易,并且避免了产品和数据之间的孤岛

最大的挑战是组织。数据团队必须跨越障碍,并与后端讨论新流程,这可能会令人害怕。强调当前的棘手问题并让人们了解数据的使用方式有助于推动讨论。

对于工具本身来说,可以使用事件平台发布/订阅服务模式注册表、git 为数据契约流程逐步进行设置。

在你的公司内找到一个合适的项目发起人,并从头到尾实现管道。没有必要进行大爆炸式迁移;从小事件开始,接下来延伸格局!

📚进一步阅读

实施数据契约:巴尔·摩西的 7 条关键经验

数据合约的兴起作者查德·桑德森

迈赫迪·瓦扎又名迈赫迪欧·🧢

感谢阅读!🤗 🙌如果你喜欢这个,跟随我上🎥 Youtube ,🔗 LinkedIn 了解更多数据/代码内容!

支持我写作 ✍️通过加盟传媒通过本链接

数据契约:网状粘合剂

原文:https://towardsdatascience.com/data-contracts-the-mesh-glue-c1b533e2a664

实用定义和实施准则

背景和动机

F ar 来自一个独特的整合数据平台——adatalith——数据网格的分布式本质提倡一组松散耦合的数据产品,它们可以相互交互。

在本文中,我们将探索数据契约,这是在我们将大数据分割成碎片后保持一致性的工件。

不仅数据本身会中断,一些支持平台的组件也会中断,比如摄取框架、元数据存储库或调度引擎。正如 Zhamak Dehghani 在她的基础“数据网格”书中解释的那样,数据网格“工程思维状态”应该从多年来软件工程学科中积累的知识中学习。例如,从众所周知的 UNIX 设计原则中汲取灵感:

  • 做一件事并把它做好。
  • 一起努力。

程序换成“数据产品”你会得到数据网格数据分解哲学,再把它换成数据工程组件你会得到工程思维方式。

此外,正如我们在“剖析数据网格技术平台:公开多语言数据”中看到的,我们不仅要设计非常模块化的组件来处理粒度任务,还要实现相同模块的不同变体来适应不同的用户需求和期望。例如,不同的数据产品可能使用不同的摄取框架,或数据转换技术,这很好,在某种程度上,甚至是可取的。

数据网格架构的转变旨在打破整合的数据整体——按作者分类的图像

这种方法的缺点是显而易见的:维护成本上升。

我认为数据网格范例中一个关键的未回答的问题是明确定义什么时候提升一个中心平台组件,什么时候给业务域自由来实现它们自己的部分。很明显,有些部分本质上是全球性的,例如在数据产品搜索组件中,但也有一些灰色区域,如元数据存储库或数据质量引擎,其中的决策并不那么简单。

回到数据,通过将分段并将不同数据产品的实现细节嵌入到数据域中,从而将责任转移到业务域,我们满足了第一个 UNIX 原则(..做一件事,并且希望——把它做好..).

但是,我们如何确保各种数据产品能够无缝地协同工作呢?这里不需要重新发明轮子:一个以契约形式明确定义的 API 和期望就是解决方案

现在,让我们试着理解数据契约的概念,并深入研究不同用户需求所需的多模态技术实现。我们将使用一些我认为完全符合数据网格理念的开源组件。

那么,什么是数据契约呢?

的最终目标是在“其他人的”数据产品上建立信任,数据契约是位于(a) 业务术语表交叉点的工件,提供丰富的语义,(b)元数据目录提供关于结构的信息,(c)数据质量存储库设置关于不同维度内容的期望。

数据契约从业务术语表、元数据目录和数据质量指标存储库中拖出碎片—按作者排序的图像

无法给出一个规范的定义,我宁愿尝试“duck type”一个数据契约(例如描述它的属性)。

因此,数据契约…

旨在简化和促进数据共享— 数据契约在某种程度上是数据产品的外部和可观察的视图,它应该被设计为“引诱🥰潜在的数据消费者清楚地传达数据产品的底层业务语义。

数据契约不是一堆不相交的表的技术元数据。

以面向对象编程为代表,我设想数据契约类似于类接口(例如,公共类方法的列表),而不是私有类属性的列表。作为一个例子,我们应该公开一个类似*top _ January _ 2022 _ customers _ by _ CLV _ EMEA*的接口,而不是公开类似 full_customer_list 和` historical_orders 的表。我相信这一特性与数据产品的“自身有价值”原则是一致的。

自然,契约不仅需要有商业意义,还需要在技术上提供关于其基础结构的丰富元数据:表、事件、图..、数据模式或支持的消费格式。

使用版本控制来保证界面稳定性的数据契约示例—图片由作者提供

保证消费稳定性— 数据产品远非静态的,因此数据契约的一个关键用例是通过接口版本化提供回溯兼容性。正如我们对编程 API 所做的那样,数据契约是有版本的——维护和支持数据产品的旧版本是数据产品所有者的责任。

设定预期— 数据契约传达数据产品的全球和本地政策执行结果,显示 KPI 的 SLOs 值,如数据停机时间或空字段百分比等。

是可消费的和可丰富的 —合同应该是下游流程可消费的,合同可以作为数据转换管道等软件流程的输入。

数据契约可以由作者组合和丰富—图片

最后,绑定和维护数据产品内部的合同是数据产品所有者的责任。

现在,从技术角度来看,数据契约归根结底是需要管理的表元数据。实现可以像共享存储库中的 MS Excel 文件一样简单,一直到 noSQL 数据库(文档存储),一个大趋势是用数据产品源存储库下版本化的 YAML/JSON 文件来表达数据契约。

需要不同的合同验证执行策略

数据契约生命周期中的一个关键方面是实际的契约验证过程,到目前为止,我们已经将数据契约描述为声明性对象。提供关于其描述的数据产品的可信信息的对象。

但是在某些时候,我们需要【填充契约】,并确保我们的数据资产验证契约预期。这意味着根据合同描述的数据来评估合同,并确保结果不会超出预期。例如,如果合同规定某些列值最多有 10%可以为空,那么我们需要实际执行,并在每次数据产品获得新数据或修改数据时计算表中的空行数。结果应该存储在本地或全球合同信息库中。

全球和本地商店之间数据契约的潜在分离——按作者分类的图片

那么,平台如何验证合同呢?

正如我们在简介中看到的,数据网格的美妙之处在于承认不同的角色/旅程在涉及到合同评估时会有不同的需求。然后我们应该让用户选择不同的实现来满足他们的特定需求。为了说明这一点并希望能启发读者,我们将把重点放在两组相反需求的实现上。在现实生活中,这些“极端”的场景之间会有非常不同的灰色阴影。

  • 场景# 1——自动化转换管道:这可能是最经典的场景,我们每天加载一个大表,并且需要确保新的表状态符合数据契约。在这种情况下,需求可能是以自动化方式高吞吐量处理大型数据集的能力。记住这一点,并以使业务领域的开发人员能够自动化合同验证为目标,我们可以设计一个如下所示的软件组件。

大规模评估数据契约的架构示例—图片由作者提供

想法是同意一个合同 YAML 格式,可以自动馈入大期望+ SPARK 组合来执行大规模验证。 Great expectations 是一个执行数据期望的神奇工具,它基于定义关于你的数据的断言。这些断言是以简单的、人类可读的 Python 方法的形式在声明性语言中表达的,因此在解析带有契约的简单 YAML 文件后生成预期是很简单的。

下面的代码片段是使用这种方法执行列验证的 SPARK 作业(使用expect _ column _ to _ exists断言):

  • 场景# 2——交互式开发:在第二个场景中,数据产品是通过像 Jupyter Notebooks 这样的 ide 以交互式方式生成的,这与数据科学家的个人工作更加一致。由于开发往往是迭代式的,所以需要快速地反复评估合同,而不需要让大型集群提交批处理作业。这种情况的一个具体考虑是数据往往适合内存。考虑到所有这些,如下所示的组件将会很有用:

用于快速和本地合同评估的示例架构—图片由作者提供

想法是在本地嵌入每个组件。感谢 Apache Arrow 和 duckdb 这样的技术,我们可以使用进程内 OLAP 数据库高效地查询内存中的分析数据。特别感谢 duckDQ ,这是一个奇妙的 python 库,它提供了一个流畅的 API 来定义和执行数据检查,遵循 scikit 的估计器/转换器范式,在像 pandas dataframe 或 Arrow tables 这样的结构中学习。

以下代码片段说明了这一过程:

注意:在撰写本文时,冰山表的 python 接口( pyIceberg )正处于非常早期的开发阶段,因此在代码片段中,我们直接加载底层的 parquet 文件。

结论

在本文中,我们探讨了“数据契约”的概念,这是确保跨不同数据产品传播的信息可以被共享和重用的关键构件。信任是在数据网格范式下将不同数据资产结合在一起的粘合剂,数据契约是克服消费非来自中央实体的数据资产的恐惧的精髓。

我们还分析了一些使用开源组件的技术实现,用于数据契约生命周期中的一个基本过程:它的评估

数据去神秘化:神经网络——它们是如何工作的?

原文:https://towardsdatascience.com/data-demystified-neural-networks-how-do-they-work-45bad6a92327

没有术语和复杂数学的神经网络如何工作的执行官指南

照片由 JJ 英在 Unsplash

神经网络、深度学习、强化学习——所有这些看起来都很复杂,理解这些东西如何工作的门槛似乎太高了。在本文中,我将使用一个工作实例,以直观的方式解释神经网络的机制。

许多解释试图将大脑中的神经元如何工作与人工神经网络(ANN)联系起来。然而,除非你的学位是生物学、医学或神经科学,否则你可能不知道神经元在大脑中是如何工作的,所以这对你没有帮助。我攻读了神经科学专业的医学学位,我发现对神经元识别直线和环路的解释完全令人困惑,所以不要感到沮丧。对我来说,只有当我能够理解网络正在完成的基本计算时,这才有意义。

我将使用两个示例,一个用于预测航班的价格(回归问题),一个用于确定某人是否会拖欠下一次信用卡付款(分类问题)。

回归示例——预测航班价格

第一步:收集输入信息

首先,我们要考虑我们可以使用哪些数据来帮助我们预测航班的价格。对于我们的例子,我们将使用 2 个输入;以英里为单位的飞行距离和该航线上预订座位的典型比例(即利用率)。

我们将从伦敦和东京之间的航班开始,这个航班的实际价格是 900 英镑。伦敦和东京之间的英里距离是 5,936 英里,通常这条航线上 90%的座位都被预订了。

作者图片

第二步:分配权重

我们需要对这些投入做些什么来达到 900 的价格。为此我们引入了权重。网络将从随机分配权重给每个输入开始。现在,我们将从距离 0.2 开始,航班利用率 6。然后,我们将输入乘以权重,并将它们相加。

作者图片

初步猜测,这并不可怕,但我们可以做得更好。

步骤 3:引入最小阈值

当我们更多地考虑它时,因为固定成本,运营一个航班有一个最低价格。无论航班是飞往爱丁堡还是东京,希思罗机场都会向航空公司收取固定的着陆费、着陆税以及行李搬运工/候机楼的费用(暂时忽略短途和长途英国航空税的细微差别!).这意味着,虽然里程和价格之间的关系应该大致是一条直线,但它不会在 y 轴上穿过 0。

作者图片

我们把这个加入到我们的神经网络中,这叫做偏见。现在的计算是:

第四步:计算误差

我们知道从伦敦到东京的航班花费 900 英镑,但是我们的网络目前预测它花费 1393 英镑。这意味着 493 太高了。我们越接近 900,模型的表现越好。

第五步:调整重量。

现在模型将调整权重。让我们看看,如果我们使用 0.1 的距离并保持 6 的利用率,会发生什么。

更好,但仍不完美。该模型将继续调整权重,直到它尽可能接近 900。

为了保持简单易懂,我在这个例子中省略了一些东西。在这个模型中,航班的距离比利用率有更大的影响,因为数量更大。通常情况下,您会缩放这些数据,因此所有的输入都是相同的范围。我也没有谈到如何调整权重——因为这方面的数学计算确实很复杂。

一个分类例子——预测某人是否会拖欠信用卡付款

上面的例子本质上是一个线性回归问题。神经网络用于回归问题,但更常见的是用于分类问题。这意味着我们要识别图像/客户/卡交易等属于哪个类别。

我们希望预测客户是否会拖欠下一次信用卡付款。

第一步:收集输入信息

我们首先确定可以帮助我们预测客户是否会违约的数据。对于这个例子,我们将使用 3 个输入;客户的信用评分、错过付款的历史以及他们的收入。

有 2 个客户;一个直觉上看起来有风险,另一个没有。

我们从顾客 A 开始。他们直觉上看起来有风险,他们的信用评分相当低,收入低于平均水平,并且他们之前有 5 次错过付款。

步骤 2:分配权重和偏差

接下来,我们像以前一样给每个输入随机分配权重。我们将输入乘以权重,然后将它们相加。

客户甲

作者图片

这导致了 340 分。

接下来让我们看看客户 b 的情况。这个客户直观上看起来风险更小;他们的信用评分为 600 分,没有拖欠还款,收入为 5 万英镑。

客户 B

作者图片

这导致分数为-370。

第三步;激活

在回归解决方案中,输出像元中的数字是一个有意义的数字,即航班的价格。在这个例子中,340 代表什么?他们有可能拖欠下一笔付款吗?

为了回答这个问题,我们使用一个 sigmoid 激活函数。这听起来很复杂,但它所做的只是接受给它的数字,并确保输出在 0 和 1 之间。这意味着我们可以用它作为一个概率,所以数字越大,客户越有可能错过他们的下一次付款。

当我们为顾客 A 计算时。我们可以看到输出是 1。该模型预测客户可能会拖欠下一次付款。

作者图片

相反,客户 B 的输出为 0,这意味着模型预测他们不太可能在下次付款时违约。

作者图片

第四步;计算损失并调整权重

接下来,我们需要计算出预测的准确性。对于客户 B,我们是正确的,客户没有拖欠他们的下一次付款。对于客户 A,尽管有信号,客户也没有拖欠他们的下一次付款。现在,让我们简单地计算一下我们正确预测的客户数量。

我们只正确预测了一半的客户,这不是很好。该模型将自动调整权重,直到正确识别的客户数量最大化。这种方法非常复杂,所以我暂时不在本文中讨论。

与回归示例类似,这个分类示例在某些方面过于简单。我们的两个培训案例都没有拖欠下一次付款。神经网络需要您想要预测的所有输出的示例,并且要从中学习的训练示例明显多于 2 个。我们给模型的所有输入都是数字的。然而,在现实世界中,数据是分类的,例如城市、头发颜色、性别。分类数据必须转换成可以应用权重的形式,即转换成数字。有几种不同的方法来确定模型的性能,正确的度量标准取决于数据类型和模型类型。在将输入传递给模型之前,我们也没有横向扩展输入,这意味着其中一些输入对模型有更大的影响。

参考文献

Purkait,N. (2019) 使用 Keras 设计和创建使用深度学习和人工智能原理的神经网络。可从以下网址获取:https://portal . ig publish . com/iglibrary/obj/packt 0005217 . html(访问时间:2022 年 8 月 19 日)。


我喜欢为商业用户写关于数据科学的文章,我热衷于使用数据来提供切实的商业利益。

您可以通过 LinkedIn 与我联系,并通过 Medium 关注我,了解我的最新文章。

用于目标检测的数据提取

原文:https://towardsdatascience.com/data-distillation-for-object-detection-92a89fe5d996

从不同的角度学习

Robina Weermeijer 在 Unsplash 上的照片

知识的升华

知识提取(KD),也称为模型提取(MD),是深度学习之父杰弗里·辛顿(Geoffrey Hinton)提出的一种令人印象深刻的神经网络训练方法,以获得神经网络的性能。如果你从未听说过 KD,你可以通过这个链接到达我的帖子。

简而言之,知识发现的核心思想是从大型模型(教师)或神经网络模型集合中提取知识,并使用这些知识作为软标签来指导(训练)较小的神经网络(学生),以便学生可以更有效地学习,从而提高其性能,这是通过从头开始训练学生无法实现的。

尽管 KD 很有潜力,但它在训练阶段有局限性,因为它需要大量的硬件资源和长时间来训练大型教师模型或笨重的模型集合,以实现生成用于指导学生模型的良好伪标签(软标签)的目标。为此,来自 AI Research (FAIR)的 Ilija Radosavovic,He 等人提出了数据提取,该方法应用半监督学习,通过利用有限数量的标记数据和互联网规模数量的未标记数据来提高 CNN 在对象检测中的性能。你可以在 arXiv 上轻松找到整篇论文。

数据提炼

数据提炼与知识提炼

来自纸张的数字

上图比较了数据提取和模型提取(知识蒸馏)的区别。模型提取利用模型 A、B、C 的集合来生成软标签,该软标签随后用于训练学生模型。集合中的每个模型可以大于或等于学生模型。部署模型提取的一种流行方式是独立地训练每个模型,这是耗时且计算效率低的。

或者,数据提取仅训练一个教师模型 A,然后应用多变换推理来合成伪标签。多变换推理可以被认为有点类似于测试时间增加过程,并且它可以被应用于改善神经网络的性能。多变换推理也是一种简单的方式,既不需要修改损失函数,也不需要改变模型结构。此外,根据单次变换图像上的预测重新训练模型通常不会带来太多的性能改进价值。因此,输入的多个几何变换可以帮助生成用于训练学生模型的良好伪标签。

来自纸张的数字

如何进行数据提炼

数据提炼包括 4 个主要步骤:

  1. 根据标记数据训练模型(如监督学习)
  2. 使用训练好的模型对未标记数据的多次转换进行预测
  3. 集合预测以生成未标记数据的伪标记
  4. 在真实标签和伪标签的并集上重新训练模型,直到收敛

为了澄清,我给出了一个例子,说明如何使用 YOLOv4 为对象检测部署数据提取。

  • 首先,像常规的监督学习一样,在一组标签数据上训练 YOLOv4。
  • 之后,使用经过训练的 YOLOv4 对未标记数据的多个几何变换进行预测,如下图所示,我应用了一个原始图像、一个翻转版本和一个升级版本,就像测试时增强过程一样。
  • 然后,输出将采用加权盒融合(WBF)方法进行处理,您可以在这里应用任何包围盒后处理方法,例如非最大值抑制。我们都知道输出总是包括真阳性、假阳性和假阴性;我们必须为伪标签选择“好的”预测。一种简单但有效的方式是挑选置信度得分高于某个阈值的预测。以及如何选择一个门槛?在这篇论文中,作者利用了一个阈值,使无标签图像中的平均对象数量等于真实标签图像中的平均对象数量。这可能不是在所有情况下都有效,但至少是有效的!
  • 最后,结合真实标记数据和生成的伪标记数据来重新训练(或微调)YOLOv4 模型。

按作者分列的数字

物体检测的结果

文中给出了在基准数据集 COCO 上的数据提取性能。我想总结如下:

来自纸张的数字

来自纸张的数字

来自纸张的数字

来自纸张的数字

来自纸张的数字

详细内容可以看全文。

结论

在这篇文章中,我简要回顾了数据提取,这是一种提高 CNN 性能的半监督学习方法。通过利用未标记数据的多重几何变换,该方法生成可以与人工标记数据相结合的高质量伪标记,以提高神经网络模型的学习效率。数据提取的能力已经在人类关键点检测和物体检测任务的基准数据集上得到验证。

欢迎读者访问我的脸书粉丝页面,分享关于机器学习的事情:深入机器学习。更多值得注意的帖子可以在这里找到:

  • 约洛夫 4–5D 评论
  • 达克拉斯
  • EFPN
  • 数据增强
  • 雾霾数据合成

感谢您抽出时间!

数据记录最佳实践

原文:https://towardsdatascience.com/data-documentation-best-practices-3e1a97cfeda6

节省时间,提高透明度,并提供高质量的数据

在 Unsplash 上由 Luisa Brimble 拍摄的照片

作为一名分析工程师,我一直在追踪我在旧数据模型中看到的各种数据集的所有者。有大量的谷歌表单四处流动,被用于复杂的数据模型,然而没有人真正知道它们是如何被使用的。我通常必须向来自每个业务领域的多个团队成员发送消息,以便最终找到了解旧数据集的人。即使这样,他们也可能不知道最初为什么要创建它,或者它是否仍在使用。这是一个永无止境的循环,试图记录公司内部使用的所有数据。

这个问题的解决方案不必很复杂。事实上,这相当简单。从开发的一开始,您就需要记录所有的数据源和数据模型。许多团队认为文档是在数据被完美地结构化和组织后做的事情。但是,您的数据会是最佳的吗?

如果我们等到一切都“完美”了才实施最佳实践,那么我们就是在给企业造成巨大的伤害。在构建数据栈时记录数据源和模型将有助于实现最佳的数据文化。数据文档是解决方案,而不是从解决方案中产生的东西。

为什么数据文档很重要

数据文档为您的业务提供了其他方式无法获得的好处。它培养了更好的数据文化,节省了您的数据团队的宝贵时间,并增加了业务的透明度。

节省时间

预先记录你的数据集可以减少未来的技术债务。不用在构建堆栈后回顾过去并试图记住所有数据的意义,您可以随时记录。你正在做的事情背后的为什么仍然历历在目。每当我等到完成构建某个东西来记录它时,我就会忘记数据的复杂细节。在构建数据模型的过程中,您学到了如此多的部落知识,值得尽一切努力去记住它们。

增加透明度

当您记录所有数据集时,业务中的每个人都有一个了解他们可用数据的窗口。利益相关者很少会问哪些事情可以做,哪些事情不能做,哪些事情不能做。这还意味着,分析工程师和数据分析师不必每次去使用不同数据集时都去寻找它们的所有者。一旦数据集被记录下来,所需的信息就随时可供参考。

确保高质量数据

作为数据从业者,没有什么比数据质量更重要的了。记录您的数据可确保数据始终以正确的方式使用。KPI 将跨模型保持一致,相同的时区将用于不同的日期字段,并且可以跟踪代码更改(或者至少这是目标)。文档有助于跟踪数据集的新鲜度、潜在的错误以及模型之间的依赖性——所有这些都是数据质量的关键因素

数据记录最佳实践

既然我们知道数据文档是游戏规则的改变者,那么让我们来讨论一些现在就可以在数据栈中实现的技巧和诀窍。

为您的数据模型创建 dbt 风格指南。

在阅读了 dbt 网站上的大量博客文章后,我发现了创建风格指南的最佳实践。即使不使用 dbt 编写数据模型,也应该创建一个风格指南,详细说明您希望遵循的不同代码和命名约定。

这是我做的第一件事,甚至在建立任何数据模型之前。我很感激我这样做了,因为它给了我一个可以严格遵循的标准。你可以想把所有的事情都记在脑子里,但是在记到某个地方之前,很容易忘记。每当我在编写我的数据模型时遇到问题,我都能够查看指南并回答它,而不必查看其他数据模型并猜测我想要什么标准。

你的风格指南中应包含哪些内容:

  • 命名约定(列名的大小写和时态)
  • SQL 最佳实践(注释代码、cte、子查询等。)
  • 模型的文档标准
  • 日期、时间戳和货币列的数据类型
  • 所有日期的时区标准

下面是我的风格指南中的几个部分的例子,你会想要模仿你的风格:

dbt 约定

Only base_ models should select from sources.All other models should only select from other models.

测试

At a minimum, unique and not_null tests should be applied to the primary key of each model.Run the drop_old_relations script after completing a model in order to delete old views/tables

命名和字段约定

Schema, table and column names should be in snake_case.Each model should have a primary key.The primary key of a model should be named <object>_id, e.g. account_id – this makes it easier to know what id is being referenced in downstream joined models.

建立模型时记录列定义。

我们已经谈到了在构建数据模型时记录数据将如何节省您的时间。但是,这也有助于提高数据的质量。为列创建定义时,您希望确保它们是一致和准确的。当你正在处理数据时,而不是在事后,你通常对数据有最深刻的理解。这是因为在编写数据模型时,您已经了解了数据中的细微差别。

我强烈推荐直接在 dbt 中进行文档化。如果您不熟悉 dbt 中的源文件,这是您记录模型及其列的地方。dbt 允许您直接在这些文件中定义表、模型和列描述。直接在代码旁边编写和存储文档可以确保分析工程师和数据分析师的工作流程顺畅。

像 Castor 这样的数据目录工具允许您跨不同数据集自动填充 dbt 中定义的这些定义,从而将文档化向前推进了一步。这样,如果在多个数据集中有相同的列名,就不必一直定义它。Castor 只需点击一个按钮就可以完成这项工作,节省了您的宝贵时间,让您可以专注于数据模型的编码。

对您的数据模型和数据管道使用版本控制。

版本控制是一项重要的软件工程最佳实践,也可以引入到您的分析工作流程中。大多数团队使用 Github 来跟踪任何代码的变更。然而,我也喜欢在像 dbt 和perfect这样的工具中直接记录不同的版本。这些工具使得在代码旁边显示文档变得容易。

dbt

在 dbt 中,每个源文件都有一个“版本”块。在这里,您可以在每次进行更改时更改版本。它是如此简单,但在记录数据随时间的变化方面却非常重要。

src_marketing.yml(图片作者)

长官

Prefect 是我自动化和部署数据管道的首选工具。这是一个基于 Python 的工具,有一个非常干净的用户界面,易于使用。使用 UI 部署管道时,可以在管道运行代码旁边添加一个自述文件。我利用这个自述文件记录我所有不同的管道版本,包括它们同步的数据和它们运行的模型。

这是一个非常权宜的解决方案,但它并没有淡化它的重要性。有时文档可以简单到保存一个包含一堆关键信息的文档!用你能得到的来凑合没有错。

作者图片

如您所见,我记录了版本号以及该版本中所做的更改、正在同步的数据源和计划运行的数据模型。

将数据目录工具集成到您的堆栈中。

虽然我的其他数据文档最佳实践更多的是使用您已经使用的工具,但是您也可以在您的堆栈中实现一个专门关注数据文档的工具。数据目录集成在您的数据堆栈中,将来自不同工具(如【雪花】、dbt 和 Looker)的文档跨您的堆栈同步到一个位置。我们很幸运,市场上有很好的解决我到目前为止提到的具体痛点的产品。

数据目录允许您为数据集和标签资源分配所有者。这确保了当你对数据或数据质量状况有疑问时,你知道该找谁帮忙,消除了不必要的来回奔波。标记资源还允许您基于数据集的业务领域来分离数据集。当业务团队只想查看其领域中的数据集时,这很有帮助。当用于限制谁可以查看某些数据集时,标记也是一种数据治理形式。

虽然这些是数据目录的核心功能,但不同工具之间还有一些强大的文档功能。我觉得非常有趣的一点是 Castor 的“部落知识”自动化。有多少次你发现自己在一个团队松弛渠道发帖,询问某个数据集?对该数据集了解最多的人会回复一个松散的线程,告诉你所有你需要知道的。

作者图片

Castor 实际上是在一个松散的线程上提取评论,并将它们存储在目录中数据集的一个部分中。这样,“部落知识”就永远不会丢失!它将永远与您其他有价值的文档保存在一起。

结论

实话实说吧。记录我们的数据一点也不“迷人”。对于分析工程师或数据分析师来说,这不是最有趣的事情。但是,我认为这是最重要的。这是改变公司内部数据文化的最佳方式。

当您专注于文档时,利益相关者可以更快地做出决策,数据团队在试图完成工作时会经历更少的摩擦,并且每个人都有可以依赖的数据。不要仅仅为了在将来为你自己和你的团队创造更多的工作而推掉文档。现在优先考虑它,你会很高兴你做了。

关于分析工程、现代数据堆栈和最佳实践的更多信息,订阅我的免费每周简讯。

数据不会说话?开始提问!

原文:https://towardsdatascience.com/data-does-not-speak-for-itself-start-asking-questions-4e152274d605

通过 R 中的可视化快速探索数据的实用工具

杰森·罗斯韦尔在 Unsplash 上的照片

当开始一个新项目,设计新的数据分析方法,甚至准备一个新的出版物时,数据可视化对于探索新的假设,验证和交流我们的发现是必不可少的。

一年前,我在巴塞罗纳(CRG)的基因调控中心做了一次速成演讲——我目前正在那里攻读博士学位——题目是“R中快速数据可视化的实用工具”,目的是宣传一系列软件包的存在,这些软件包使我在探索性数据分析(EDA)方面的生活变得更加容易。

在本文中,我将简要地向您介绍我接近 EDA 的方法。演讲的所有材料都可以在这个网页上免费找到,源代码在相应的资源库中。我想强调开源包在促进数据科学生活中的重要性。特别是,我个人认为由 Alboukadel Kassambara 开发的 R 库gg pubr——一个 ggplot 包装器——提供了从一行程序到完全定制的情节所需的所有功能。

开始前

我强烈建议安装以下软件包:

  • 此处
  • 潮汐
  • ggplot2 (包含在 tidyverse 中)
  • ggpubr

前段时间,我写了一篇关于如何构建数据科学项目的文章。作为一个经验法则,我保存那些每次都很难得到的文件,从这些文件中我可以问很多问题。tidyverse 是一个允许你问这些问题的包,而 T2 ggpubr T3 允许你以一种最少的工作量来实现出版质量。最后, here 包让你确保可以在任何设备上自动找到你的项目的根。

想象你的问题的答案

我们的玩具数据集:palmerpenguins

由马丁·韦特斯坦在 Unsplash 上拍摄的照片

为了开始使用这些包中的函数,我们将使用 palmerpenguins 数据集。这个简单的数据集既有连续变量又有分类变量,非常适合展示不同函数的工作原理。

require(tidyverse)penguins_url = 'https://raw.githubusercontent.com/allisonhorst/palmerpenguins/master/inst/extdata/penguins.csv'dat = read.csv(url(penguins_url), stringsAsFactors = TRUE)dat = dat %>% drop_na()head(dat)##   species    island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g## 1  Adelie Torgersen           39.1          18.7               181        3750## 2  Adelie Torgersen           39.5          17.4               186        3800## 3  Adelie Torgersen           40.3          18.0               195        3250## 4  Adelie Torgersen           36.7          19.3               193        3450## 5  Adelie Torgersen           39.3          20.6               190        3650## 6  Adelie Torgersen           38.9          17.8               181        3625##      sex year## 1   male 2007## 2 female 2007## 3 female 2007## 4 female 2007## 5   male 2007## 6 female 2007

ggpubr 由于建立在 ggplot2 之上,允许快速制作有洞察力的情节,并有很大的定制空间。在策划的时候,我总是问自己“我想要看到什么类型的关系?”以及“我希望它如何呈现给我?”。

分类与分类

例如,我们可能有兴趣知道“每个物种总共观察到多少只企鹅?”。这转化为计算每个物种的企鹅数量,这是一个分类变量。为此,我们可以使用饼图:

ggpie(dat %>% count(species), x = 'n', fill = 'species')

图片作者作者。

或者我们可以更深入一点,结合多个分类变量,问“在不同的岛屿上,我们观察到了多少种不同性别的企鹅?”通过条形图:

ggbarplot(dat %>% count(species, sex, island), x = 'species', y = 'n', fill = 'sex', label = TRUE, position = position_dodge(0.7), facet.by = 'island', palette = 'lancet')

图片由作者提供。

关于 ggpubr 最酷的事情之一是它使用了来自软件包 ggsci 的科学期刊的调色板。在这种情况下,我使用柳叶刀的调色板,只需设置调色板= "柳叶刀"。还要注意,结合 x、方面,人们可以很容易地获得对多变量问题的深刻答案。通过和填充论点。

分类与连续

现在,我们可以继续问一个连续变量在多个类别中是如何变化的,比如“企鹅种类、性别和原产地的鳍状肢长度分布是怎样的?”。在这种情况下,我们可以通过直方图可视化分布,但是我们需要为每个类别生成一个直方图。下面是如何在一行中使用多个方面来实现:

gghistogram(dat, x = 'flipper_length_mm', fill = 'sex', facet.by = c('species','island'))

图片由作者提供。

或者,如果我们不想得出这么大的数字,我们可以使用抖动图或带状图。此外,我们可以可视化分布设置 add='median_iqr' 的中位数和四分位数范围,并通过 add.params 指定其参数。

ggstripchart(dat, x = 'island', y = 'flipper_length_mm', color = 'sex', facet.by = 'species', alpha = 0.5, position = position_jitterdodge(), add = 'median_iqr', add.params = list(color='black', group='sex', size=0.2))

图片由作者提供。

事实上,不管是哪一种企鹅和哪一个岛屿,雄性企鹅的鳍状肢长度似乎总是比雌性企鹅长。但是,这些差异在体重上有统计学意义吗?幸运的是,我们只需要另一小段代码,即 stat_compare_means 函数来执行和可视化期望的统计测试的结果:

ggstripchart(dat, x = 'island', y = 'body_mass_g', color = 'sex', facet.by = 'species', alpha = 0.5, position = position_jitterdodge(), add = 'median_iqr', add.params = list(color='black', group='sex', size=0.2)) + stat_compare_means(aes(color = sex), label = "p.signif", method = 'wilcox.test')

图片由作者提供。

请注意,如果我们没有被起源岛和物种分开,比较雄性和雌性企鹅的体重可能是不公平的,因为巴布亚企鹅的平均体重大大高于其他企鹅。

连续与连续(与分类)

上面,你可能已经注意到企鹅的体重和鳍状肢长度的分布非常相似。但是,“多少钱?”以及“它们与钞票长度相比如何?”。这是一种连续与连续的问题,散点图在这种情况下非常方便:

ggscatter(dat, x = 'flipper_length_mm', y = 'body_mass_g', color = 'bill_length_mm', alpha = 0.5)

图片由作者提供。

通过设置 color='bill_length_mm' ,该变量被绘制为颜色渐变,并允许我们看到,除了鳍状肢长度和体重之间明显的线性关系之外,喙的长度也倾向于随着其他两者的增加而增加。

现在,就像以前发生的一样,你可能想知道是否有其他变量,也称为混杂因素,产生了一种虚假的关系:“我们能看到数据收集年份的抽样偏差或批量效应吗?”。我们可以很容易地使用颜色参数来检查:

ggscatter(dat %>% mutate(year=factor(year)), x = 'flipper_length_mm', y = 'body_mass_g', alpha = 0.5, color = 'year', ellipse = TRUE)

图片来自作者。

幸运的是,情况似乎并非如此。我们可以确认科学家在每个时间点收集了分布中的样本。

此时,你一定在想,“鳍状肢长度和身体质量之间有什么关联?”。我们可以通过 cor.coefcor . coef . args参数非常容易地添加它。

ggscatter(dat %>% mutate(year=factor(year)), x='flipper_length_mm', y = 'body_mass_g', alpha = 0.5, color = 'year', add = 'reg.line', conf.int = TRUE, cor.coef = TRUE, cor.coeff.args = list(method = 'spearman', label.sep = '\n')) + theme(aspect.ratio = 1)

图片由作者提供。

将图合并成一个图形

最后,当我们想在报告中包含不同的数字时,我们可以将它们保存为。pdf 文件和 edit 在像 Inkscape 这样的程序中组合它们。或者,我们也可以使用 ggarrange 对它们进行编程!这里有一个例子:

fontsize = 6labsize = 2# overview number of observations of every sex across islands and speciesp1 = ggbarplot(dat %>% count(species, sex, island), x = 'species', y = 'n', fill = 'sex', label = TRUE, lab.size = labsize, position = position_dodge(0.7), facet.by = 'island', palette = 'lancet') + ylim(NA, 68)# sex-related body mass distributions across islands and speciesp2 = ggstripchart(dat, x = 'island', y = 'body_mass_g', color = 'sex', facet.by = 'species', alpha = 0.5, position = position_jitterdodge(), add = 'median_iqr', add.params = list(color='black', group='sex', size=0.2), palette = 'lancet') + stat_compare_means(aes(color = sex), label = "p.signif", method = 'wilcox.test', size = labsize)# association of flipper length and body massp3 = ggscatter(dat %>% mutate(year=factor(year)), x = 'flipper_length_mm', y = 'body_mass_g', alpha = 0.5, color = 'year', add = 'reg.line', conf.int = TRUE, cor.coef = TRUE, cor.coeff.args = list(method = 'spearman', label.sep = '\n', size = labsize)) + theme(aspect.ratio = 1)p1p2 = ggarrange(p1 + theme_pubr(base_size = fontsize), p2 + theme_pubr(base_size = fontsize), ncol = 1, common.legend = TRUE)fig = ggarrange(p1p2, p3 + theme_pubr(base_size = fontsize), widths = c(2,1), heights = c(2, 1), labels = 'AUTO')# saveggsave('images/myfig.png', fig, width = 15, height = 10, unit = 'cm')

图片由作者提供。

结论

由于有了像 ggpubr 这样的开源包(以及它们所基于的框架),访问和探索数据来回答我们的问题从未如此简单。对我来说,EDA 是数据科学中最重要的部分,因为它允许产生新的假设,更重要的是,发现并纠正不必要的混杂因素。这篇文章是一个更彻底的速成班的一个小尝试,在这个速成班中,我展示了探索基因组数据集的方法(这里有免费的)。如果你喜欢这篇文章,也许你有兴趣阅读其他文章:

  • “构建您的数据科学项目!”
  • 解剖 28 年欧洲制药发展

如果你想知道更多或者有什么不清楚的地方,请不要犹豫!

数据漂移的可解释性:用 NannyML 进行可解释的移位检测

原文:https://towardsdatascience.com/data-drift-explainability-interpretable-shift-detection-with-nannyml-83421319d05f

提醒有意义的多元漂移并确保数据质量

照片由飞:D 在 Unsplash

模型监控正在成为机器学习的热门趋势。随着关于 MLOps 的活动越来越多,我们记录了关于该主题的工具和研究的兴起。

其中最有趣的肯定是由【NannyML】开发的https://nannyml.readthedocs.io/en/main/how_it_works/performance_estimation.html****【CBPE】基于置信度的性能估计算法。他们实施了一个新的程序来评估未来模型在缺乏基础事实的情况下的性能下降。它在检测性能下降方面具有很大的优势,因为在实际应用中,收集标签的成本可能很高,并且可能会延迟。

CBPE 算法可在 NannyML 包 中找到,同时还有一些有趣的移位检测策略。从标准的单变量漂移检测方法到更先进的多变量特征漂移方法,我们拥有强大的武器库来自动检测无声模型故障

在这篇文章中,我们主要关注多元移位检测策略。我们想研究如何检测多元特征转移。我们与单变量情况进行了比较,以说明为什么后者在某些情况下不足以警告数据漂移。最后,我们更进一步,引入了** 一种混合方法来提供可解释的多元漂移检测。**

单变量对多变量 D 裂缝

****单变量漂移发生在变量在分布中出现显著差异时。实际上,我们独立地监控每个特性,并检查其分布是否随时间而变化。这可以通过比较新观测值和过去观测值之间的统计数据来直接实现。由于这些原因,单变量检测易于交流,完全可以理解。

单变量数据漂移(图片由作者提供)

****多变量漂移发生在输入数据之间的关系改变时。检测多变量变化可能更难解释,但通常需要克服单变量检测的缺陷。

多元数据漂移(图片由作者提供)

单变量和多变量漂移背后的原因可能因使用情形而异。无论何种应用,单变量特征漂移的结果可能会产生误导。我们来调查一下原因。

单变量漂移检测的局限性

假设我们有四个系列的数据(通过模拟获得):两个相关的正弦曲线和两个随机噪声特征。我们还考虑了两个数据子集(时段)来进行我们的实验。在“参考时期,我们指的是我们所掌握的历史数据。在“分析期间,我们指的是我们想要分析的新样本。

模拟特征(图片由作者提供)

在我们的参考时期,数据遵循相同的模式,保持它们的关系不变。在“分析期间,我们观察到蓝色正弦曲线和红色正弦曲线之间关系的变化。更准确地说,这两个特征在“参考周期中是正相关的,而在“分析周期结束时它们变成负相关的。

X1 与 X2 的相关性(图片由作者提供)

X1 与 X2 的相关性(图片由作者提供)

****关系发生变化,但单变量分布保持不变。我们的单变量漂移检测能有效吗?

X1 随时间的单变量分布(图片由作者提供)

X2 随时间的单变量分布(图片由作者提供)

X3 随时间的单变量分布(图片由作者提供)

X4 随时间的单变量分布(图片由作者提供)

正如预期的那样,单变量数据漂移检测算法不会显示所有分析要素的任何漂移。从上面的图中,我们可以看到,单变量分布不随时间变化,因此 Kolmogorov-Smirnov 测试不能提醒变化。我们需要更有效的方法。

基于主成分分析的多元特征漂移

上过基础机器学习课程的大家,都已经遇到过主成分分析(PCA)** 。这是一种对表格数据集进行降维以保留最显著的交互的技术。同时,我们可以使用主成分分析将压缩后的数据还原为原始形状。这种重建过程可以仅保留数据中有意义的模式,同时消除噪声。**

PCA 重构能力。左边是有噪声的原始数据。右图为降维后 PCA 重构的数据(图片由作者提供)

NannyML 利用 PCA 的重构能力,开发了一种简单有效的多变量漂移检测方法。

一组数据首先被压缩到一个较低的维度空间,然后被解压缩以返回到原始的特征维度。这个转换过程是重建我们的数据的关键,只保留相关的相互作用。此时,可以计算原始数据和变换后的对应数据之间的一系列重构误差(简单的欧几里德距离)。来自一系列重建误差的任何有意义的尖峰可以被视为数据关系的变化,也称为多变量漂移。

让我们看看这种方法在我们的数据上的应用。

(图片由作者提供)

我们在我们的“参考”数据集上拟合 PCA,并计算重建误差。这有助于建立用于检测未来"分析数据变化的上限和下限。当新数据变得可用时,我们只需使用拟合的 PCA 来压缩和重建它们。如果重建误差落在预期阈值之外,我们应该记录特征关系的变化。这正是我们的数据所发生的情况。

PCA 方法为多元漂移检测提供了有用的见解。通过单一 KPI,我们可以控制整个系统的状态。同时,分离每个特征的贡献可能是增值的。****

可解释的多元特征漂移

使用 PCA,我们的目标是在单一的学习步骤中学习模式。这很好,并且显示出在大多数情况下和一些应用中是有效的。如果我们的目标是发现特性之间的未知关系,我们可以用一种简单的方式来做同样的事情。

****我们可以把关系发现想象成一项受监督的任务。换句话说,给定一组特征,我们可以使用它们来预测彼此,并使用生成的残差作为漂移的度量。如果残差随着时间的推移而变化,我们通知一个转变。

残留特征(图片由作者提供)

回到我们的模拟场景,我们根据“参考”数据为我们所能支配的每个特性拟合一个模型。每个模型都适合使用所有其他特征作为预测器来预测期望的特征。然后我们在“参考”和“分析数据上生成残差。有了可处理的残差序列,我们就可以用单变量方法来检测漂移。

X1 随时间的单变量残差分布(图片由作者提供)

X2 随时间的单变量残差分布(图片由作者提供)

X3 随时间的单变量残差分布(图片由作者提供)

X4 随时间的单变量残差分布(图片由作者提供)

使用单变量方法检测漂移现在更加有效。在“分析”周期结束时,我们记录了 X1 和 X2 的高错误。更准确地说,我们没有证据表明 X1 和 X2 在同一时期存在单变量分布漂移。由于这个原因,高误差可以指示 X1 和输入数据的其余部分之间的关系的变化(对于 X2 也是如此)。换句话说,单变量重建误差分布的变化可以揭示所涉及的特征已经改变了它们的相互作用。

摘要

在这篇文章中,我们介绍了一些有效监控数据漂移的最新技术。我们也明白为什么只有单变量方法会受到影响。我们发现了多元特征转移的重要性,并试图提供一种可解释的方法来识别可能的多元漂移的来源。

参考

要发现检测无声模型故障的的尖端技术,请查看 NannyML 项目:https://github.com/NannyML/nannyml****

内容是我自己的,自己写的,按本人意愿发表(一如既往)。感谢 NannyML 团队收到的反馈

查看我的 GITHUB 回购

保持联系: Linkedin

数据漂移:它可能从任何地方向你袭来

原文:https://towardsdatascience.com/data-drift-it-can-come-at-you-from-anywhere-b78eb186855

数据漂移的概念以各种形状和形式直观地展示出来。

图片来源:作者创作

数据漂移简介

机器学习(ML)模型,至少在其目前的化身中,只不过是 强大的归纳机器 。他们的崇高目标是从一个小例子集合到一个更广泛的归纳概括。

自然,为了成功(和可靠)的运行,它们需要依赖于关键的假设— 输入数据分布不会随时间漂移太多

因为,如果发生这种情况,那么一个成功的模型只在单个时间点成功。随着时间的推移,该模型将根据与其训练时不完全相同的分布进行归纳概括,性能将会下降。

因此,我们需要监控和(及时)检测 MLOps 或 ModelOps 管道中的任何数据漂移,以确保任何(持续)成功的 ML 模型部署。除了常规的 MLops,数据漂移的概念对于 ML 可解释或 可解释 AI (xAI) 领域也很重要。

数据漂移监控模块在端到端 MLops 周期中的确切位置在以下文章中有很好的描述。

关于这个主题的许多文章讨论了输入分布的形状和统计特性。在本文中,我们将以(一个或多个)数据流为例,这些数据流以时间序列的形式进入 ML 模型,并可视化这些变化以清楚地理解这个概念。此外,我们还将讨论工业环境中一些不太明显的数据漂移来源。

数据漂移就像一盒巧克力…

你永远不知道你会得到什么!让我们看看一些明显和不那么明显的例子…

电平转换?明显地

这是一个明显的数据漂移。在许多无监督的模型设置中,这也将被称为' 异常值 '或' 异常值 '。还要注意,漂移可能不是永久的,而是短暂的。漂移的起点和终点都应该很快确定。

图片来源:作者创作

方差转移?微妙的

这比电平转换稍难检测。请参见下图。

图片来源:作者创作

方差减少?那也是一种漂移

在高层次上,业务/流程人员(或您的客户)会告诉您,高方差是不好的。是的,他们几乎总是对的。但是从数据漂移的角度来看,你必须注意任何机会——甚至是方差的突然减少。从统计上看,这也是分布特性的变化。

图片来源:作者创作

一段时间内的峰值移动

这个更微妙,难以察觉。我试图用附加注释来说明这种漂移,比如峰值和 T2 期。你看到这里到底发生了什么吗?数据以周期性的方式出现,每个周期内都有一个峰值。那个峰值的相对位置(在一段时间内)移动了一段时间,然后才恢复正常。

图片来源:作者创作

你看出问题了吗?简单的统计特性可能无法捕捉这种漂移。均值和方差(其他矩也是)可能看起来相似。那你是怎么抓住它的?有趣的是,一些简单的光谱分析会显示出一个转变。因此,你必须引入一些信号处理知识来捕捉这种数据漂移。

上下文数据——捕捉趋势的另一种方式

如果您还在监视具有固定时间指示器的日志记录流,如轮班开始或机器重置,这有时有助于以直观的方式捕捉这些临时轮班。当然,数据监控必须确保良好的时间同步。在下图中,锚点事件和峰值与这些锚点的相对距离将指示漂移。

图片来源:作者创作

相移/延迟

这是一个真正意义上的杀手。对于对时间序列数据进行训练和推理的 ML 模型,轻微的相位延迟就可能产生完全错误的预测。基本上,模型被训练成“如果 X 1 和 X 2 相似,则预测 Y 0,否则预测 Y 1”。

现在,看看下面的情况,意识到异相数据流会发生什么。上面的数据流很好,下面的有点漂移。有可能数据流是正常的,只是采集被延迟,失去了同步。

图片来源:作者创作

有些是漂移,有些不是

在工业或制造业场景中,工艺配方和设置一直在变化。也可能有一个预定的变更日志。需要监控这种上下文数据,以识别正确的数据漂移。这是直观的插图,

图片来源:作者创作

测量/传感器漂移

这也是最难检测和管理的问题之一。输入数据流和生成过程可能是好的,但是传感器上可能有漂移(即测量输入数据并馈送到 ML 模型或监控系统)。

监控系统(由 ML 模型和警报生成模块组成)可能检测到漂移,并认为基本过程已经偏移,向核心过程层发送错误的推荐信号。这将是一个错误的判断和糟糕的建议。

这也是一个将概念漂移(传感器本身的模型或物理动态)误认为数据漂移的例子。这是一个无论如何都要避免的错误。

图片来源:作者创作

摘要

我们通过展示一些可视化的例子,讨论了时间序列意义上的数据漂移的概念。很明显,即使在最简单的一维设置中,捕捉和分析数据漂移也不是一个微不足道的问题。可能需要信号处理或与上下文数据合并等其他技术来正确识别数据漂移的开始和性质。

缓解措施是什么?没有一个答案,这完全取决于行业和具体的应用领域。本文系统地介绍了其中的一些。读一读。

* *

喜欢这篇文章吗?成为 中等成员 继续 无限制学习 。如果你使用下面的链接,我会收到你的一部分会员费, 而不需要你额外付费

*https://medium.com/@tirthajyoti/membership *

数据驱动(基于强化学习)控制

原文:https://towardsdatascience.com/data-driven-control-d516ca28047c

为什么强化学习是控制系统优化问题的热门话题

图:强化学习(基于来自像素的安德里亚·皮亚卡迪奥的图片)

介绍

数据驱动控制。那些基于强化学习(RL)的控制策略,是工业工程的新术语。RL 似乎是所有控制问题的最佳范例,从控制内燃机,到切割金属的机械臂,再到建筑中的空调系统。(这在这些公司发布的与 RL 相关的招聘广告的数量上也很明显。)我们看到了深度学习模型如何破坏图像识别和分割的传统计算机视觉技术的类似破坏。

我们将数据驱动控制定义为应用于控制系统的简单机器学习(ML)技术。

为了理解这一趋势背后的驱动因素,我们首先需要理解现实系统控制理论的局限性。

控制理论的局限性

在非常基础的层次(和高层次),控制系统实际上由系统和控制器组成:

  • 系统来控制
  • 控制器应用控制策略以最佳方式控制系统。

在这种情况下,我们还需要考虑另外两件事情:控制器可以应用的任何策略都受到

  • 它对系统状态的了解——在大多数情况下,由系统传感器提供;
  • 以及它可以控制的系统参数,也称为系统执行器。例如,发动机只能在一定的速度范围内以一定的加速度驱动汽车。

外部/环境因素在控制策略中也起着关键作用,但是这种作用更多的是作为一种“输入”参数,而不是一种约束。例如,室外温度在决定空调制冷多少时起着关键作用;然而,空调的功能不受它的限制。

下图说明了一个控制系统,其中 x_t 是非线性函数 f 的时间导数。

图:(简化)控制系统设计(图片由作者提供)

设计控制策略包括求解表征系统行为的方程——通常以线性方程的形式建模。大多数控制理论的目标是解决线性方程。

不幸的是,现实世界的系统(大部分)是非线性的。例如,甚至捕捉钟摆运动的方程也是非线性的。关于线性化方法已经有了很多研究,基本上是将非线性方程转换成线性方程,然后尝试使用线性状态空间控制理论来解决它们的技术。不幸的是,这种线性化方法非常局限于特定类别的非线性方程,并且不容易推广。

除了求解非线性方程的困难之外,我们当然首先需要知道如何对一个系统(其相应的方程)建模。这就是传统控制策略(也称为模型驱动控制)仍然排除大量我们不知道如何建模的系统(其系统方程未知)的原因。而且,这种系统的复杂性与日俱增,我们希望解决超大规模的问题,例如气候控制、疾病控制、自动车辆、金融市场等。

总结传统控制理论/模型驱动控制的局限性:

  • 系统模型/方程未知
  • 不适用于大规模非线性领域
  • 考虑到这些系统的高维数,模拟它们也是非常困难的

关于这个主题的详细讨论,请参考史蒂夫·伯顿关于控制系统的优秀教程[1]。

曼梯·里来营救了

鉴于传统控制理论面临的上述挑战,现在让我们试着理解为什么基于 ML/Data 的方法在这种情况下显示出很大的前景。

这里的潜在逻辑是,即使对于我们无法建模的非常高维的系统,也存在表征系统行为的主导模式——机器学习(深度学习)非常擅长学习这些模式。

这(很可能)是一个近似值,虽然我们仍然不能完全理解该系统,但除了一些例外情况,对于大多数现实生活中的用例(包括预测)来说,这已经足够好了。

在这篇文章中,我们关注的是基于控制系统的强化学习方法。我们也将触及监督 ML 和非/半监督 RL 之间的关键区别,以及这如何使 RL 成为潜在的任何控制优化问题的良好选择。

强化学习

RL 能够通过实时最大化奖励函数来实现复杂的目标。奖励功能的工作原理类似于用糖果和打屁股来激励孩子,这样算法在做出错误决定时会受到惩罚,在做出正确决定时会受到奖励——这就是强化。强化方面还允许它更快地适应用户情绪的实时变化。有关 RL 框架的详细介绍,感兴趣的读者可以参考[2]。

图:强化学习(RL)公式(作者图片[3])

一些关于 RL 的有趣观察,不涉及太多技术细节:

  • 奖励和策略不一样:奖励功能和 RL 代理策略的角色和职责没有很好地定义,并且在不同的架构之间可能有所不同。一个天真的理解是,给定每个国家行动对的相关回报/成本,政策总是试图最小化总成本。显然,似乎有时保持生态系统处于稳定状态比最小化成本更重要(例如,在气候控制用例中)。同样地,RL 代理策略目标不需要总是与奖励函数一致,这就是为什么需要两个独立的函数。
  • 与机器学习/深度学习中的监督方法类似,最适合企业采用的 RL 方法是“基于模型的 RL”。在基于模型的 RL 中,可以开发问题场景的模型,并基于模型模拟值引导初始 RL 训练。例如,对于能源优化用例,建筑物供暖、通风和空调(HVAC)系统的蓝图用作模型,其模拟值可用于训练 RL 模型。对于复杂的场景(如游戏、机器人任务),不可能建立问题场景的模型,但仍有可能基于历史值引导 RL 模型。

这被称为‘线下培训’,在没有模型的情况下被认为是一个很好的起点。这也是为什么 RL 经常被认为是监督和非监督学习的混合,而不是纯粹的非监督学习范式的原因。

  • 在线和无模型的 RL 仍然是最具挑战性的,其中 RL 代理试图在没有任何监督的情况下实时学习和反应。这方面的研究现阶段似乎缺乏理论基础。研究人员正在尝试不同的方法,通过简单地投入更多的数据和计算能力来解决问题。因此,这仍然是 RL 最“有趣”的部分,当前的研究主要集中在高效的启发式和分布式计算上,以加速的方式覆盖搜索空间。将 DL(神经网络)应用于不同的 RL 方面,例如政策、奖励,也仍然是一个热门话题——称为深度强化学习[4]。
  • 鉴于 RL 的基本性质,似乎有许多有趣的概念可以从决策科学和人类心理学的现有研究中借鉴。例如,Tom Griffiths 在他的演讲“人类和机器中认知资源的合理使用”中引用了一段有趣的话[5]:

虽然模仿人脑似乎是 AI/RL 研究的圣杯;在心理学研究中,人类一直被认为是本质上有缺陷的角色。所以我们真正想做的当然是模仿人脑的“理性行为”。

总结当然是,如果我们想要机器达到真正人类智能的水平,我们需要将这两个领域结合在一起。

案例研究:基于 RL 的暖通空调优化

D.比斯瓦斯。基于强化学习的工厂能源优化。(迈向数据科学— 链接),也发表在 2020 年 6 月第 11 届 ACM e-Energy 会议论文集上。

在我们当前讨论的背景下,上述文章是一个有趣的案例研究。它展示了过去 10 多年来由传统 PID 控制器运行的工业控制系统向更高效的基于 RL 的控制器的成功过渡。

在这种情况下,工业控制系统是指负责维持工厂(一般建筑物)中温度和湿度设置的加热、通风和空调(HVAC)单元。传感器对应于室内(和室外)温度和湿度传感器;并且致动器对应于 HVAC 单元的冷却、加热、再加热和加湿器阀。部署的 RL 模型如下图所示:

图:暖通空调强化学习公式(图片由作者提供)

这是一个复杂的问题,因为它需要计算考虑多个可变因素的最佳状态,例如,占用、制造进度、运行机器的温度要求、建筑物内的气流动态、外部天气条件、节能等。

初始状态:当我们最初开始探索基于 RL 的方法优化 HVAC 控制器的可行性时,HVAC 单元由 PID 控制器控制。PID(比例积分微分)[8]是一种用于优化问题的流行控制技术,它使用控制回路反馈机制来控制过程变量。

这种情况已经持续了 10 多年,HVAC 装置以非常稳定和稳健的方式将工厂的温度和湿度保持在理想的设定值。因此,基于 RL 的探索主要是受其降低能耗和二氧化碳排放的潜力的推动。(研究表明,暖通空调几乎占建筑能耗的 50%,占全球用电量的 10%。)

解决方案:考虑到建模此类系统的难度,我们从随机 RL 模型的初始部署开始(在某种意义上,它只取决于最后的状态)。在下一阶段,我们扩展了 RL 模型以适应“长期回报”,用 RL 术语中的 Q 值来量化。假设在状态 s 采取动作 a ,状态-动作对 (s,a) 的 q 值被定义为从当前状态 s 开始的所有未来步骤的期望回报值的加权和。这个 RL 模型在一个连续的空间环境中运行。该设置中的每个事件对应于室内温度和(或)湿度开始偏离其各自设定值的时间,以及室内条件返回其各自设定值的时间——这是打开相关阀门的结果。

目标状态(进行中):在为期 6 个月的试点中,我们能够开发并实施基于 RL 的 HVAC 控制器,该控制器能够学习并适应真实的工厂设置,无需任何离线培训。基准测试结果显示,在能效方面有可能节省高达 25 %(与 PID 控制器运行时相比)。

结论

总之,RL 到目前为止经历了一段有趣的旅程。从无人监管的 RL 代理击败 AlphaGo 棋手产生的炒作,到努力在企业世界中找到一席之地/效用。在研究方面也有类似的起伏旅程,随着深度学习模型的进展饱和,对 RL 模型的兴趣在过去几年达到顶峰;到现在,重点再次转移到自我监督系统。

说到这里,RL 似乎找到了工控系统的甜蜜点。在将 RL 技术应用于推荐器[3]、聊天机器人[9]方面已经有了一些进展;然而,控制优化是他们“最适合”的地方。在本文中,我们强调了传统控制理论的挑战,并指出基于 RL 的控制器有可能解决/改善该领域的许多复杂问题。这是一个参与这一旅程的激动人心的时刻,希望您也有同样的感受——期待您的反馈!

参考

[1]史蒂夫·伯顿:控制训练营,https://www.youtube.com/watch?v=Pi7l8mMjYVE&list = plmrjakhiennr 20 mz-vpzgfqs 5 zryi 085m

[2] A .巴尔托,R.S .萨顿:强化学习:导论。麻省理工学院出版社,麻省剑桥,2018,http://incompleteideas.net/book/RLbook2018.pdf

[3]比斯瓦斯。基于强化学习的推荐系统。 ( 中链 —走向数据科学),也发表在 2020 年 9 月第 24 届欧洲人工智能大会(ECAI)的“‘医疗保健人工智能进展’专题讲座”上。

[4]w·达布尼:分布式强化学习的进展及其与规划的联系, 2020,https://www.youtube.com/watch?v=iqIGHSgYtbs

[5] T. L .格里菲斯,f .利德,N. D .古德曼。认知资源的合理使用:计算和算法之间的分析层次。https://cocolab . Stanford . edu/papers/griffithsetal 2015-tics . pdf

[6] F. Oldewurtel 等人使用随机模型预测控制和天气预测进行节能建筑气候控制。事故赔偿委员会,2010 年。

[7] Y. Ma 等建筑制冷系统运行的模型预测控制。IEEE 控制系统技术汇刊,20(3):796–803,2012。

[8] F .皮科克。PID 算法的白痴指南。https://www.pidcontrol.net/index.html

[9] Ricciardelli,e .,Biswas,D.: 基于强化学习的自我改进聊天机器人。(中环节 —走向数据科学)In:第四届强化学习与决策多学科会议(2019)。

有经理参与的数据驱动型组织

原文:https://towardsdatascience.com/data-driven-initiatives-unpacked-bringing-managers-to-the-table-2c3e8f8f0b0

一种协调数据科学家和管理层共同目标的可能方法

由 Unsplash 上车头拍摄

数据团队面临的一个常见挑战是弥合将组织转变为数据驱动的实体的需求与成功将其传达给管理层之间的差距。我阅读了许多关于这个主题的论文,经历了不同的框架,并且参与了许多数据项目。对于非技术受众来说,这些模型或框架通常过于复杂,不能总是按原样呈现。我在这里的目的是提出一个共同点的方法,一个对双方都适用的故事,并希望能引起一些读者的共鸣。

整体情况

当谈到交流项目信息时,保持简单是最好的。与管理层交谈时尤其如此,他们不需要理解错综复杂的发动机来驾驶汽车。他们只需要知道,如果他们加满油箱,遵守速度限制,并做定期的技术修改,他们会走得很远!根据同样的类比,我认为数据计划只能用三个维度来描述和解释:数据、技术和人(“3D 数据故事”)。这是非技术观众很容易掌握的大局。以我的经验,这三个维度同等重要。

下面的文氏图总结了每个维度的作用:

3D 数据故事|图片由 Alexandre Allouin 提供

一旦理解了这种简化,就可以建立对当前情况的概述/评估:数据、技术和人员。在这一点上,两个受众都将看到需要改进什么以达到数据驱动的目标。自然,管理团队会明白,每个维度对于成为数据驱动的组织都至关重要。他们还会明白,随着文氏图中圆圈大小的增加,出现绿点(代表您想要评估的数据驱动型组织或数据计划)的可能性也会增加。因此,他们会看到哪里需要更多的努力。

图片作者:Alexandre Allouin

这是你的电梯推销!虽然这对于需要全局的高级经理来说可能足够了,但对于需要确保汽车能够被他们的经理实际驾驶的中级经理来说可能还不够。相同的简化方法将应用于每个维度:它们将通过三个轴进行评估,每个轴将得到一个分数,它们的总和将代表圆的大小。

维度评估

如何定义每个轴应该根据您组织的需求来定制。下面是一个可能对你有用的方法。

  1. 数据

数据维度旨在从数据的角度理解组织的背景。它包括对战略和治理(正式和/或非正式)的评估。它还应涵盖整个数据生态系统的状态:缺失的数据源、分析功能、数据目录、问题和挑战。

作者图片

2.科技

技术维度应被视为数据维度的促成因素。必须包括对数据管道、基础设施、分析和人工智能平台以及数据访问的评估。

作者图片

3.

人的因素很容易被忽视。然而,正如许多研究表明的那样,这通常是开发数据驱动型组织的障碍。必须考虑到许多因素,从高级别宣传/领导到工作人员技能和赋权。

作者图片

每个维度的得分是其关联轴得分总和的结果。每个维度的总和必须达到 33(或人员维度的 34…因为人员很重要!)然后,评估可以在全球范围内传达:三个维度的总和(100),或者如果您想提出特定的挑战,可以通过特定的维度传达。例如: D30 | T31 | P15 显然,必须关注人的方面。另一种方法是对所有维度应用百分比: D91% | T94% | P44%

虽然本文的格式不适合详尽地回顾用于评估每个轴的变量,并且值得深入分析,但我在下面提供了一些提示,您可以在分配分数时考虑。需要注意的是成熟度水平(没有标准模型,已知的有戴尔数据成熟度模型、 Gartner 成熟度模型、 Snowplow 数据成熟度模型等。)取决于你组织的战略目标;你想要达到的目标必须相应地调整。

数据

数据策略&治理

  • 与战略目标一致:战略是否解决了特定的业务需求?
  • 业务需求、角色和职责是否明确?
  • 支持上述内容的数据源是否已经确定?
  • 是否设计了灵活的数据架构?
  • 是否确定了文化变革和人员技能/培训要求?
  • 是否有实施战略的路线图?
  • 是否定义了数据沿袭?

流程

  • 是否解释了将数据转化为见解的流程?(例如分析平台)
  • 是否指定了确保数据完整性的流程?
  • 合适的人能够访问合适的数据吗?
  • 数据管理流程如何与业务流程保持一致并集成在一起?

数据成熟度

  • 是否仍然缺少数据源?
  • 数据架构是否满足所有需求?
  • 新的见解支持组织目标吗?
  • 人们在数据使用方面改变了习惯吗?
  • 有可用的数据目录吗?
  • 是否定义了主数据管理?
  • 数据是否用于预测?

虽然前两个轴更关心项目的计划方面和它将被治理的方式,但是数据成熟度轴旨在评估它们的实现状态。基于你想要达到的目标,你可能会更倾向于给最后一个轴更多的权重。

技术

数据管理

  • 技术是否满足策略中指定的要求?特别是,技术是否与支持数据的不同阶段相关:提取、收集、转换、存储等。?
  • 基础设施是否足够敏捷以支持该策略?
  • 是否实施了主数据管理?

数据使用

  • 工具和平台在分析和可视化方面满足业务需求了吗?
  • 现有系统是否允许用户轻松分享见解?
  • 有没有一些流程已经自动化了?或者有什么流程需要自动化?

数据访问

  • 是否存在访问数据的 API?
  • 该技术允许轻松嵌入图表吗?
  • 是否存在孤立或难以访问的数据源?
  • 是否存在这样一种文化,即任何人都可以访问所有数据源,除非它们包含个人或其他数据保护理由?

领导和沟通

  • 管理层是否定期推广数据文化?
  • 管理层是否在会议、报告或决策中使用数据?
  • 是否为建立数据团队分配了相关资源?
  • 管理层是否鼓励并授权员工采用数据驱动的思维和运营方式?
  • 是否有时事通讯或其他内部通信来宣传成功案例、数据计划等。?

数据扫盲和赋权

  • 员工的数据技能是否经过评估?
  • 是否有评估员工技能的问卷?
  • 员工有机会接受培训吗?
  • 是否确定了任何数据冠军?
  • 员工有机会参加论坛、导师、诊所等吗?在他们需要的时候得到帮助?
  • 是否鼓励员工使用数据?
  • 数据文化问题是否包含在招聘流程中?

制度化和决策成熟

  • 有多少员工访问公司仪表盘,访问频率如何(每天/每周/每月)?
  • 有多少员工创建仪表板,创建的频率如何(每周/每月)?
  • 在过去的六个月/一年中,有多少团队接触过数据团队以开始新的数据项目)?
  • 管理层有多少次利用数据做出明智的决策,并与员工进行沟通?
  • 来自企业的数据相关查询(运营/支持)是否有所减少?
  • 部署新的数据产品是否会节省成本?

最后一个轴可能很难监控,必须在流程的早期进行考虑,以确定收集正确信息的正确策略。

关键要点

  1. 简化您想要讲述的故事,以便组织中的每个人都能理解并掌握这个概念。一个数据驱动的组织可以从三个维度来衡量:数据、技术和人员。
  2. 评估每个维度的成熟度。为此,可以通过将它们分解为三个轴来进一步简化。中层管理人员可能需要这种级别的细节。
  3. 确定将用于评估每个轴的指标。这应该与您的组织目标和您想要达到的数据成熟度级别相一致(您可以使用现有的许多模型来支持您的策略,或者从中受到启发)。
  4. 使用 3D 维恩图,向你的利益相关者传达组织的当前状态,你想要达到的目标,以及达到目标需要什么:这是你的故事。

在项目的整个开发过程中,尽可能多地参考文氏图。组织中的每个人都应该熟悉它:所有员工都能够理解、采纳和推广的大图,以使您的组织转型成功。最后,为了以身作则地领导这个项目(鞋匠不应该是最差的),不断地监控和评估你的进展是至关重要的:这将使你更加可信,并有助于你想要发展的数据驱动的文化。

法语版本

数据驱动的制造:4 个关键的组织支柱

原文:https://towardsdatascience.com/data-driven-manufacturing-4-key-organizational-pillars-f6d08d3da9ff

卢克·切瑟在 Unsplash 上的照片

随着技术的快速发展,今天我们生活在一个数字化转型的时代,企业,尤其是制造企业,能够从产品生命周期的不同来源收集大量数据。它由许多新兴技术支持,包括信息物理系统、数字双胞胎和工业物联网。因此,制造生命周期可能从许多来源产生数据,包括客户、利益相关者、生产线设备、产品和信息系统。

制造企业可以从这些数据中受益,以改进和优化其生产流程和资产利用率,并超越竞争对手。为此,制造企业需要在组织内外纵向和横向整合数据科学能力,并转向数据驱动的制造。垂直整合对应于组织内从生产车间到车间的联合,而水平整合旨在整合多个生产设施、供应链合作伙伴和业务合作伙伴。

对这种数据采用的数据科学可以向制造商提供描述、诊断、预测和规定的分析能力,并且可以创造机会来改进其生产计划、过程优化、材料跟踪、设备维护、质量控制,甚至新产品设计过程。它还允许组织通过授权企业支持战略决策来产生商业价值。

因此,数据科学为数据驱动的制造范式铺平了道路,这种范式将从数据中获得的可操作的洞察力提取到制造智能中,从而实现更明智的决策。数据驱动制造旨在提高运营效率和产品质量,同时降低成本和风险。尽管数据驱动的制造能够将资本密集度降低 30% 并将生产生命周期缩短达 40 % 。制造企业在管理他们的数据科学努力以获得这些潜在利益时面临困难。

虽然数据科学被从业者和学者视为突破性的技术突破,但制造企业在该领域的投资回报普遍低于预期。据 Gartner [1]称,80 %的数据科学项目到 2020 年都不太可能产生任何商业价值,因为这些项目没有用标准化和系统化的方法进行管理和扩展。

制造企业需要关注数据科学和组织能力,以有效地利用数据作为其关键的战略资产,并实现有希望的潜力。然而,由于缺乏组织管理、协调和文化,只有一小部分组织能够成功地从他们的投资中获得商业价值[2]。成为一个数据驱动的组织需要从整体的多学科角度管理和促进组织变革。因此,这篇文章从组织管理的角度研究了数据驱动的制造,有四个关键支柱,(1)变革管理,(2)技能管理,(3)战略联盟,(4)赞助和投资组合管理,以促进向数据驱动的组织过渡。

马克·弗莱彻·布朗在 Unsplash 上的照片

变革管理

变革管理是不断调整组织的结构、文化和管理能力,以适应成为数据驱动型组织的需求。最高管理层的支持在启动组织转型以在整个组织内创建数据驱动的文化方面发挥着至关重要的作用。为此,最高管理层应该通过重新定义组织结构、领导和业务流程来领导变革管理过程。变更管理的一个主要问题是,参与这个转换生命周期的人们通常不共享相同的技能和术语来作为沟通的基线。因此,组织应该进行重组,以共享共同的数据驱动文化,并在数据科学家、软件开发人员、分析师、现场工作人员、利益相关者和高层管理人员之间定义高效和有效的沟通渠道,以支持运营数据科学的协作和互动。

总之,变革管理流程包括评估如何建立和维护组织政策和指令,以重组和调整组织向数据驱动型文化的过渡。作为成功实施变革管理过程的结果,组织应了解变革的范围和愿望,评估利益相关者和员工对变革的准备和意愿,确定和部署行动计划以激励利益相关者和员工,并增加他们对变革管理的参与,以及监测和维持组织变革。

技能管理

技能管理在获取、培训和整合技能和人才方面所做的努力,旨在为数据科学建立合适的多学科团队,并提高整个组织的数据素养。制造组织需要根据快速变化的业务环境和技术解决方案来重新配置和培训人力资源,以保持其市场竞争优势。为此,他们需要制定统一的人力资源管理战略,以确定如何确定、发展或获得所需的人员技能和能力,并根据既定的绩效标准评估候选人和员工的绩效,以满足组织需求。

技能管理中的另一个关键问题是对组织中的员工进行有关基本数据科学原则和方法的培训,以将他们纳入分析决策流程,并提高组织中的数据素养。

战略联盟

战略一致性定义了如何建立战略方向,并确保对组织目标和战略业务方向的共同理解。制造组织通过首先建立其数据科学战略和愿景,开始其成为数据驱动型制造组织的旅程。为此,他们需要调整他们的组织和数据科学战略,以促进他们向数据驱动型制造组织的转变,并提高他们的盈利能力和降低投资风险。这也允许组织将数据科学作为其核心能力和技能。该流程使组织能够了解其业务环境和方向,根据组织愿景确定其目标数据科学能力,并建立和维护战略计划和路线图,以推动业务、数据科学和 IT 部门之间的协调。

赞助和投资组合管理

赞助和投资组合管理流程旨在确保有效和高效地使用财务资源、项目和资产,以实现组织战略、目标和业务方向,成为数据驱动的制造组织。此外,赞助和投资组合管理使组织能够以可承受的成本,在已知和可接受的风险水平下,从战略上一致的投资中获得最佳收益。此流程评估组织中的财务规划和控制是否得到管理,以利用财务资源高效地为项目提供资金,从而支持成为数据驱动的制造组织。这还包括开发一个模型,评估和监控正在进行的资助项目,以决定是否继续或终止资助和资源。作为成功实施该流程的结果,组织根据组织愿景执行为其投资设定的战略方向,考虑和评估不同的赞助和融资模式和选项以支持和维护其投资组合,并监控、优化和评估其正在进行的投资组合中的项目,以根据其不断变化的业务环境和优先事项进行调整。

数据科学能够提高业务部门的运营绩效和数据驱动的决策能力,并在其业务中获得竞争优势。由于数据科学是一个多学科领域,除了从技术角度管理和协调整个组织的数据科学工作之外,还应该从组织管理的角度对其进行管理。

参考文献

[1]高德纳。我们的顶级数据和分析预测 2019 年。2019(2020 年 11 月 19 日访问),https://blogs . Gartner . com/Andrew _ white/2019/01/03/our-top-data-a nd-analytics-predicts-for-2019/。

[2]g kalp,M. O .,g kalp,e .,Kayabay,k .,koyi it,a .,& Eren,P. E. (2021)。数据驱动制造:数据科学成熟度评估模型。制造系统杂志60 ,527–546

[3]g kalp,M. O .,Kayabay,k .,g kalp,e .,koyi it,a .,& Eren,P. E. (2021)。评估向数据驱动型组织转变的过程能力:多学科方法。 IET 软件15 (6),376–390。

复杂系统的数据驱动建模:油藏计算教程

原文:https://towardsdatascience.com/data-driven-modeling-of-complex-systems-8a96dc92abf9

由 Lenstravelier 在 Unsplash 上拍摄的照片

确定性混沌这个几乎似是而非的概念描述了对初始条件如此敏感的系统,以至于不可能进行长期预测。因此,尽管动力学方程中没有随机性,但即使是计算中最微小的误差——例如计算机中的数值精度误差——也会导致未来的预测完全错误。

混沌系统的应用范围从天气预报,流体湍流,等离子体动力学,化学反应,人口动力学,天体运动,股票市场,等等。虽然当前的技术倾向于使用噪声和部分测量信息来约束物理模型(【https://en.wikipedia.org/wiki/Kalman_filter】),但是控制这些系统的方程通常是未知的。因此,能够使用机器学习(ML)等数据驱动方法来预测此类系统非常重要。

洛伦兹“蝴蝶”吸引子

爱德华·洛伦茨在 1963 年开创了理解和洞察混沌动力学的新时代。洛伦茨对地球低层大气中对流的简化将确定性的非周期行为以及“蝴蝶效应”的概念引入了流行文化,蝴蝶扇动翅膀可以改变天气。他的典型例子被称为“洛伦兹吸引子”该系统是三维的(3D ),并且涉及从下面均匀加热和上面冷却的薄流体的特性。下面绘制的是与对流速度和垂直温度变化相关的两个变量。Lorenz 吸引子是动力系统预测中的一个标准问题。

这里的几何对象称为具有分数维的“奇怪吸引子”。准确地说,吸引子的维数是 2.06。图片作者。

这里我们的 3D 数据 u (t)来自一组常微分方程,一个动力系统。为了在这里深入一点动力系统理论,“蝴蝶效应”可以用一组称为李亚普诺夫指数(le)的量来表征。LEs 是描述动力系统中扰动平均增长率的基本特征

LEs 描述了两个点 x₁和 x₂,最初相隔δx₀ = |x₁− x₂|的距离,如何相对于彼此在时间上演变。更具体地说,

λ₁是最大的 LE。因此,如果λ₁是正的,随着时间的推移,两个初始条件,起初只有很小的差异,将在线性化的范围内以指数速度彼此远离——混沌的定义和预测困难的原因。

由正李亚普诺夫指数引起的扰动增长的图解。作者:亚帕丽娜——自己的作品,CC0,https://commons.wikimedia.org/w/index.php?curid=42399467

LEs 可以与吸引子的维度和几何形状直接相关,吸引子是数据驻留在变量空间(称为相空间)中的几何对象。λ₁也是误差指数增长的逆时间常数,因此李雅普诺夫时间λ₁*t 给出了一个无量纲时间,可用于判断预测的质量。

油藏计算

在最大似然法中有许多预测复杂系统的方法,但最近有一种方法在性能、理解和训练的简单性以及潜在动力学的再现方面脱颖而出;这种方法就是储层计算(RC)。RC 是递归神经网络(RNN)的简化形式,这是一种具有反馈连接的网络,能够实现自激励。RNN 的内部状态明确地取决于先前的内部或“隐藏”状态和外部驱动信号。因此,数据有一个自然的顺序——称之为时间——这明确地允许将 RNN 视为一个动力系统。相比之下,其他形式的人工神经网络,如多层感知器,不对数据进行排序,因此它们的自然数学描述是一个函数。

RC 的优点是我们避免了直接在容器内训练权重。它们是根据控制连通性图的属性的少量参数来设置的。这些总体参数是 RC 方法的美妙之处。设置这些参数可以被视为指定类似于气体的整体温度或压力的东西,不需要跟踪每个单独粒子的位置和速度,从而大大降低了问题的复杂性。因此,训练仅限于解决输出的线性回归问题,大大减少了训练时间。

RC 中的信息流。我们有一个输入 u(t ),它通过输入层输入,输入层将信号投射到高维储层中,使我们能够用线性读出层近似非线性动力学。然后读数预测 u(t+1)。我们将 u(t+1)反馈到输入中,给出我们的预测。图片作者。

钢筋混凝土结构

RC 的结构由一个固定的(未训练的)高维“库”和一个训练过的输出层组成。储层的固定性质减少了训练参数空间的大小,以设置控制全局属性的少数参数,然后求解线性回归问题。可搜索参数空间大小的这种减小允许人们容易地绕过由于使用反向传播方案而出现的爆炸/消失梯度问题,并且将 RNN 的训练时间加快了几个数量级。

表 1:控制储层整体特性的参数以及 RNN 方程的更新。

RC 由三层组成:输入层 Win ,储层本身,以及输出层 Wout 。储层由 N 个节点组成,这些节点通常由简单的非线性元件作用,例如,tanh 激活函数。网络中的节点通过 N × N 邻接矩阵 A 连接,随机选择具有连接密度ρA 和在[1,1]之间均匀选择的非零元素,缩放使得 A 的最大特征值是表示为谱半径(ρSR)的数。

让我们看看如何在 Julia 中初始化一个 RC,实现为一个对象,并将表 1 中的输入参数作为初始化参数。函数“get_connection_matrix”创建 N×N 储层并缩放最大特征值。

rc 接受表 1 所示的参数。我们看到 RC 邻接矩阵 A 被实现为稀疏矩阵,因为已经表明非常低连通性的储层实际上在预测方面是最好的(ρA ~ 0.02)。此外,稀疏矩阵向量乘法非常有效。然后,a 按其最大特征值重新调整。Win 在[-,σ]之间随机产生。Wout 的存储器在初始化时被分配,但是 rc 还没有被训练。

输入层 Win 是一个 N × D 维矩阵,将输入信号 u (t)从 D 维映射到 N 维储层空间。 Win 的元素在[-,σ]之间均匀选择。

培训 RC

调用 RNN/水库的隐藏状态 r (t)。更新规则是

其中我们看到下一个 RC 隐藏状态 r (t+1)取决于前一个状态 r (t)和输入数据 u (t)。α是“泄漏率”,它决定了在下一个状态中有多少来自前一个状态的直接混合。节点处的非线性元素由双曲正切函数给出,该函数在这种情况下工作良好,因为它以 0 为中心。

现在的训练包括用数据 u (t)驱动 RC,并生成一系列与数据匹配的储层状态 r (t)。然后我们通过优化损失来确定 u (t)和 r (t)之间的线性映射 Wout

其中 r 是包含 r (t)的矩阵, u 是包含训练数据集中所有 t 的 u (t)的矩阵,β是 Tikhonov-Miller 正则化超参数。这也称为岭回归。解决方法是

其中 I 是 N × N 单位矩阵。因此,训练是一个简单的矩阵乘法问题。我们可以在代码中看到这一点。

训练 rc 需要输入数据序列 u(t)。我们生成对应于输入 u(t)的隐藏状态 r(t)。从那里我们可以计算出输出矩阵。

RC 还需要一些步骤来与数据同步。我们称之为旋转。

预测

现在来预测一下。我们将 u (t)替换为 Wout * r (t),将从动 RC 变成一个自主(仅取决于 r (t))系统

这给了我们“预测机器”,因为只要我们愿意,我们可以简单地向前迭代。代码如下所示,注意“auto_rc”功能与“driven_rc”相同,但带有u->Wout*r

预测可以由一小部分数据 uspin 或储层状态 r(0)开始。然后这个函数预测 nsteps ahead。

洛伦兹吸引子示例

在这里,我们从 Lorenz 系统创建一些训练和测试数据。BasicReservoirComputing 就是上面 RC 代码的模块。系统的大小是 D=3,而水库有 N=200 个节点。参数如下σ= 0.084;α=0.6;SR = 0.8ρA = 0.02;β= 8.5e-8;σb=1.6,这是通过下一节所述的优化程序得到的。我没有定义 make_lor63 和 plot_prediction,但它们可以在 github repo 中找到。整个过程只需要几秒钟。

在下面的例子中,我们看到了 RC 的主要优势之一。不仅预测结果非常棒,这里高达约 9 次李亚普诺夫时间,而且当预测最终发散时(由于“蝴蝶效应”必然会发散),RC 停留在吸引子上,给出“物理预测”——预测具有与实际数据相同的统计特征。

可以计算 RC 的 D 个最大 LEs,并将其与输入数据的 LEs 进行比较。当两者相匹配时,我们得到了未来预测与数据“气候学上相似”的特征。这意味着预测具有相同的统计特性(平均值、标准差、相关性、误差增长,..)作为输入数据。

再现正确的误差增长统计(LEs)的特性不仅对于预测的稳定性很重要,而且对于将 RNNs 结合到当前技术水平的预测方法中也很重要,例如集合卡尔曼滤波器或其他形式的数据同化。这些方法使用贝叶斯推理将稀疏和有噪声的观察结果合并到系统的模型中(数据驱动的或物理的)。推论要求模式的扰动系综再现物理上真实的扰动预报,因此这个性质是重要的。

从 t=0 预测 X、Y 和 Z。请注意良好的短期预测以及长期统计数据的再现。图片作者。

测试 RC

时间序列预测的常见 ML 基准是一步预测均方误差。事实上,这正是我们训练 Wout 获得从u(t)→r(t)→u(t+1)的线性地图的方法。然而,作为一种测试方法,一步预测并不是一个合适的度量;它过分强调数据中的高频模式,而牺牲了 RC 预测的长期稳定性。

我们预测时间的标准度量是有效预测时间(VPT)。VPT 是预测的准确度超过给定阈值的时间 t。举个例子,

其中 d 是系统维数,σ是时间序列的长期标准差,ε是任意阈值,uᶠ是 RC 预测。

通过下面的直方图,我们可以看出在不同初始条件下观察预测的统计集合的重要性。这个集合是通过训练 RC,然后在 Lorenz 吸引子上的不同点测试大量初始条件而生成的。预测时间的变化部分是由于动力系统运动不稳定性的变化。Lorenz 吸引子在中间有一个不稳定的鞍点,在这个鞍点上很难预测状态将在哪个波瓣上结束,而两个波瓣的中心是相当稳定的。

测试 RC 进行预测的初始条件。这些预测的有效预测时间显示在下面的直方图中。当从吸引子的中心开始而不是在波瓣中开始时,预测未来的行为要困难得多。图片作者。

直方图显示了上述 100 个初始条件下的预测时间分布。图片作者。

如何找到正确的参数

找到 RC 的正确参数是使用该技术的主要挑战之一。正如我们在下面看到的,预测能力对我们选择的参数值非常敏感,使得这成为一个有点困难的多维非线性优化问题。谢天谢地,有许多算法专门研究这类问题,例如 CMAEShttps://en.wikipedia.org/wiki/CMA-ES,但是任何全局优化算法都可以。

预测对 RC 参数变化的敏感性。红色表示高平均 VPT 的区域,而蓝色表示低 VPT 的区域。搜索整个参数空间是一个不小的问题。图片作者。

我将采用三步优化方法。程序是:

  1. 修正参数
  2. 通过线性回归训练 Wout
  3. 通过一系列长期预测评估损失函数

我们将用于评估数据拟合度的损失函数为

其中 M 是用于比较的预测数量。uᶠ是预测,u 是数据。指数项是为了抵消误差在时间上的预期指数增长。

增加 M 使损失函数变得平滑,并且能够更好地收敛到全局最小值。然而,折衷是必要的,因为增加 M 将显著增加计算复杂度。我们根据经验发现,对于简单的模型来说,使用 15-20 个左右的预测通常就足够了,前提是这些预测是在统计上独立的点上做出的(彼此相距几个李亚普诺夫时间尺度以上)。理想情况下,数据将很好地采样输入系统吸引子,但实际上不可能总是这样。

下面我们将看到最小化的目标函数的定义和单一未来预测的损失函数。代码依赖于包含非优化参数以及训练数据的对象 f(这里未示出)。然后,我们使用全局优化程序来优化不同的参数。

结论

我们已经简要介绍了 RC 以及训练、预测和优化 RC 以预测复杂系统所需的代码。讨论了优化以找到正确参数的重要性,以及 RC 再现输入数据的长期统计数据的能力。虽然我们仅使用 Lorenz 系统作为例子,但是 RC 还有许多更复杂的应用。

代码和例子可以在 https://github.com/japlatt/BasicReservoirComputing 的找到。

有关 RC 背后的理论的更多信息以及对设计选择的更深入的讨论可以在以下论文中找到。如果您发现这些信息有用,请引用它们。

  1. Jason A. Platt 等人,“在油藏计算中使用预测广义同步进行稳健预测”。载:*(2021 年)第 31 期,第 123118 页。网址:【https://doi.org/10.1063/5.0066013 *
  2. 普拉特、J. A .、彭妮、S. G .、史密斯、T. A .、陈、t-c .、&h . d . I .(2022)。预测复杂时空动态的储层计算的系统探索。arXivhttp://arxiv.org/abs/2201.08910

还可以找到关于将 RNNs 集成到数据同化算法中以处理稀疏/噪声/不完整数据的信息

彭妮,S. G .,史密斯,T. A .,陈,t-c .,普拉特,j . A .。林海燕,古德利夫,硕士,大学博士(2021)。结合递归神经网络和数据同化进行可扩展的数据驱动状态估计。arXiv【cs。LG]* 。运货车http://arxiv.org/abs/2109.12269*

本作品的原始灵感来自陆等人,2018:

陆志新、布莱恩·亨特和爱德华·奥特。“机器学习的吸引子重构”。载于:混沌:一个
跨学科的非线性科学杂志 28.6 (2018),第 061104 页。一美元兑换:.

数据工程师的工具

原文:https://towardsdatascience.com/data-engineer-tools-c7e68eed28ad

数据工程工具箱的基础

朱莉·莫里弗在 Unsplash 上的照片

介绍

在过去的十年里,各种组织试图雇佣大量的数据和机器学习科学家,以便从他们的数据中提取有价值的信息,最终帮助他们做出明智的决策,并构建数据驱动的产品。不幸的是,这种策略对于这些公司中的大多数都失败了,因为在许多情况下,预测模型由于数据质量低而受到影响。数据是分散的,有时甚至不适合分析。

此外,即使当模型运行良好时,由于缺乏可扩展的架构、自动化和最佳实践的应用,它们在生产中的实现和部署也将是一场噩梦。这就是数据工程发挥作用的地方。

数据工程领域包含一套技术和原则,允许工程师通过配置所需的过程从各种不同的来源收集数据。此外,数据工程师有责任确保消除任何损坏的数据,以便使用这些数据的业务用户能够访问干净、准确的信息。

与此同时,数据工程师是现代数据驱动组织中最有价值的人之一,这些组织旨在通过利用他们最有价值的资产来构建或增强产品,即..数据!

为了以高效、可扩展和经济高效的方式实现这一点,数据工程师必须确保他们使用正确的工具,最终帮助他们构建组织所需的工具。

数据库

数据工程师应该能够处理和执行包括 SQL 和 NoSQL 数据库在内的数据库系统的某些操作。数据库是存放大量数据的地方,不同的用户可以在其中查询和提取信息,甚至可以使用数据库作为存储手段或甚至查找某些记录的其他应用程序。

对于大规模系统,数据工程师通常必须建立和维护数据仓库数据湖。我不打算深入讨论这些概念以及它们与传统数据库的不同之处,但是如果您有兴趣了解关于这个主题的更多信息,请务必阅读我最近在下面分享的一篇文章。

(大)数据处理工具

如前所述,数据工程师应该设置所有必要的流程,以便清理和聚合来自多个来源的数据。因此,利用工具以可扩展、高效和容错的方式实现此类流程至关重要。

Apache Spark 是几乎每个行业都普遍使用的这种技术的一个例子。它是最广泛使用的可扩展计算引擎之一,可以执行批量处理、ML 模型训练和大规模数据分析等数据工程任务。此外,它支持多种语言,包括 Python、Scala、Java 甚至 r。

(近)实时数据流

除了对历史数据进行传统的批处理,许多组织还需要实时和大规模地处理数据。例如,考虑当特定事件发生时应该执行特定动作的用例。数据工程师应该能够构建事件流架构,从而实现这些特性。

在我看来,实时数据流之王是阿帕奇卡夫卡。这项技术最初是作为 LinkedIn 中的消息队列实现的,并迅速发展成为一个开源的实时数据流平台。简而言之,Kafka 可以用来从事件流中产生和消费数据,也可以作为一个临时的消息存储库。此外,它可用于实时处理事件流,甚至追溯处理。

在上一节中,我们讨论了 Apache Spark 以及它如何大规模处理批处理。除了批处理之外,Spark 本身还可以通过使用本地支持批处理和流工作负载的 Spark 流处理系统进行数据流处理。

这个 Spark API 扩展允许数据工程师执行来自多个来源的实时数据处理,包括 Apache Kafka 和 Amazon Kinesis。

调度工具

对数据工程师非常有用的其他重要工具是调度机制,它允许在特定的时间间隔执行特定的管道或动作。

此外,当执行多个相互依赖的操作时,这些工具还可以让您的生活变得更加轻松。例如,在加载所需的特定数据之前,不能运行分析操作。因此,调度工具可以帮助您确保一旦动作 A 也成功执行和完成,就执行动作 B。

调度工具的一个例子是 Apache Airflow ,它是设置、调度、执行和监控数据工作流时最常用的平台之一。

监控工具和警报

最后,数据工程师工具箱的另一个重要方面是监控。在今天的文章中,我们讨论了许多需要启动和运行的概念和工具,以便能够以可伸缩和及时的方式执行某些流程。

因此,重要的是要有适当的机制,使我们能够在各种系统上执行运行状况检查,此外,在发现异常情况时通知特定的目标组(例如,特定的开发人员或开发团队),比如某个 Spark 节点,甚至整个集群都出现故障。

大多数现代数据工程工具都可以配置为高度可用,但这并不意味着集群在任何给定时间都 100%健康。高可用性仅仅意味着系统应该不间断地工作,即使发生了不寻常的事情。但是,我们应该能够对我们的系统健康状况进行 360⁰,以便在问题出现时让需要调查问题的团队参与进来。

最后的想法

数据工程是组织的核心,旨在利用他们的数据来发布新产品,更新现有产品,并根据从一段时间甚至实时收集的数据得出的结论来改进他们的整体决策。

因此,招募合适的人来组建团队并帮助组织将其产品和决策提升到一个新的水平是非常重要的。

在今天的文章中,我们讨论了数据工程师应该使用的一些最重要的工具,以便以高效、优雅的方式执行日常任务,实现可扩展且经济高效的解决方案。

成为会员 阅读介质上的每一个故事。你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。

**https://gmyrianthous.medium.com/membership **

相关文章你可能也喜欢

** ** ** ** ** **

数据工程最佳实践—将可靠性和完整性嵌入您的数据管道

原文:https://towardsdatascience.com/data-engineering-best-practice-embedding-reliability-and-integrity-into-your-data-pipelines-45d72bda832f

构建高度可靠和值得信赖的数据管道,为下游数据消费者提供高质量的数据和信息

数据质量和数据可靠性的重要性

不言而喻,数据对于当今许多组织的运营和应用程序来说绝对至关重要。对于数据工程师来说,这不仅仅是通过提取、转换和加载(ETL)管道来交付数据,更重要的是交付可靠的数据,以便企业可以做出有效和明智的数据驱动型决策,数据科学家可以开发值得信赖的机器学习(ML)模型,数据密集型应用程序可以运行,而不必担心数据损坏。

我不得不说,管理和维护数据质量需要多个团队的共同努力,但数据工程师在这方面肯定要发挥作用。因此,本文的重点是在实践中,数据工程师如何在数据管道中嵌入数据质量控制和验证。

以下是今天文章的提纲:

  • 数据质量管理的关键组成部分以及每个关键组成部分的范围;
  • medallion 设计模式——端到端管道流设计模式,具有适当的数据质量控制;
  • 将数据质量检查嵌入数据管道的实施指南。我将深入探讨 3 个框架— great_expectations 、 deequ 和 pydeequ 以及 Databrick 的 Delta Live Table (DLT) —对于每个框架,我将解释每个框架的工作原理,并分享每个框架的实现指南和编程模型。

乔恩·泰森在 Unsplash 上的照片

数据质量管理的关键组成部分

  • 为了通过数据概要分析和数据探索性分析来理解数据,数据工程师有必要真正理解他们的管道正在处理什么数据。对数据的理解有两个层次。第一个层次是从技术和统计的角度去理解数据,比如每批数据的平均大小(记录数),最小值,最大值,平均值,唯一性,完整性。另一个层次是从业务角度理解数据,比如理解数据是如何被使用的,哪些列是关键的,以及对数据所需的任何计算。
  • 定义数据质量规则、检查和期望。数据工程师可以从您从前面的点中获得的数据剖析和分析结果中进行开发。他们还需要与业务所有者和他们使用的数据集的最终用户交谈,以了解他们对数据质量的要求。
  • 基于上述定义的数据质量约束,通过数据管道以自动方式实施检查和验证,以确保每批新到达的数据在到达数据存储位置之前都经过所需的检查和验证。
  • 与主要利益相关方达成一致,如果数据管道检测到任何违反数据质量规则的行为,应采取何种措施。例如,如果您的管道正在处理的数据集是非常关键的业务,并且不应该有任何数据质量问题,任何数据质量违规都应该保证管道故障,并向关键人员发送严重警报,以便可以立即修复这些数据质量问题。然而,如果您所支持的用例能够容忍一些数据质量问题,而不是让管道失败,那么您可以丢弃那些坏记录,或者将它们放在不同的位置,以后再处理它们。
  • 向监控解决方案报告和记录数据质量检查结果。围绕数据质量定义和监控关键性能指标(KPI),如通过记录的数量和失败记录的数量,不仅可以提供更好的可见性和可观察性,更重要的是,监控数据质量可以让人们清楚常见的数据质量问题在哪里,以便可以采取相应的措施来解决坏数据的根本原因。从长远来看,总体数据质量应该有上升趋势。

数据质量控制到位的端到端管道流

下图显示了数据管道将经历的典型端到端数据流,包括接收原始数据、数据转换和数据聚合。

将可靠性和完整性嵌入您的数据管道|作者图片

关键信息是,在将数据保存到存储层(青铜级、白银级、黄金级)之前,数据必须通过数据质量检查,对于未通过数据质量检查的损坏数据记录,在将它们写入存储层之前,需要单独处理。在本文的下一部分,我将分别使用 great_expectations 、 deequ 和 pydeequ 以及 Databrick 的 Delta Live Table (DLT) 来演示如何实现 a 管道。然而,在我进入实施部分之前,您可能想知道“铜、银、金”在这里是什么意思。

“青铜= >白银= >黄金”模式是一种数据流设计,也称为奖章式架构。medallion 架构的设计是为了在数据流经架构的每一层时,逐步提高数据的结构和质量。这就是为什么它与今天关于数据质量和可靠性的文章相关。

下面总结了每一层——青铜色、银色和金色——在圆形建筑下的内容:

  • 青铜(原始数据)-青铜层也称为原始数据层,是数据工程师接收和保存来自外部数据源的所有原始数据的地方。这一层中的表结构与源系统表结构“原样”相对应,还有任何捕获加载日期/时间、流程 ID 等的附加元数据列。
  • 银层(清理和符合的数据)—在银层中,来自铜层的数据被匹配、合并、符合和清理,以便银层可以提供其所有关键业务实体、概念和交易的全局视图。(例如,主客户、商店、非重复交易和交叉引用表)。通常,银层中的数据结构与原始层保持相同
  • 黄金层(策划的业务级表)—黄金层中的数据通常组织在消费就绪的“特定于项目/产品/用例”数据库中。黄金层用于报告,使用更多非规范化和读取优化的数据模型,连接更少。这里应用了数据转换和数据质量规则的最后一层。例如,商业智能(BI)报告和仪表板通常直接使用黄金层的数据。

一般来说,随着数据从原始到青铜到白银再到黄金的流动,数据质量要求变得越来越严格,因为黄金层直接服务于业务。到目前为止,您应该已经对什么是 medallion 数据设计模式以及它为什么与数据质量讨论相关有了较高的理解。如果你想了解更多关于梅达莲建筑模式的细节,你可以访问这里。

从下一部分开始,我将解释如何利用不同的数据质量框架在端到端数据管道中实现数据质量检查。

先说远大前程。

殷切期望实施指导

Great Expectations 是一个开源的 Python 库,它通过数据测试、文档和概要分析提供数据质量管理功能。《远大前程》的三个关键组成部分如下:

  • 期望——期望是关于数据的声明性陈述。预期具体来说是计算机可以计算的数据质量规则,但人类也可以理解,例如……expect _ column _ values _ to _ not _ be _ null。《远大前程》自带预定义的期望库,支持包括 Pandas、Spark、MySQL、MSSQL、SQLite、PostgreSQL、Trino、Redshift、BigQuery、Snowflake 等多种数据源。另一点值得一提的是,伟大的期望允许用户创建自己的定制期望。
  • 数据源——Great Expectations 提供了一个 Datasource 类来与底层数据系统进行交互。Datasource 类为数据连接器和执行引擎协同工作提供了一个接口。被远大前程支持的执行引擎有熊猫、Spark、SqlAlchemy。有 3 种类型的数据连接器用于大期望。第一个是 InferredAssetDataConnector,它通过使用 regex 来推断 data_asset_name,该 regex 利用了文件名或文件夹结构中存在的模式。第二个是 ConfiguredAssetDataConnector,它允许用户进行最大程度的微调,并且需要您想要连接的每个数据资产的明确列表。第三个是 RuntimeDataConnector,它是一种特殊的数据连接器,使您能够使用 RuntimeBatchRequest 在运行时直接提供批处理数据。RuntimeBatchRequest 可以包装内存中的数据帧、文件路径或 SQL 查询,并且必须包含唯一标识数据的批处理标识符,例如工作流编制器调度的作业的 run_id。
  • 验证和检查点—当您第一次验证数据时,会为您创建一个检查点,对此我们寄予厚望。检查站是可重复使用的。一旦您创建了检查点,根据您的规范对其进行了配置,并根据验证结果指定了您希望它执行的任何操作,您今后需要做的就是通知检查点运行。

以下是远大前程的编程模型:

  1. 第一步是启动数据上下文。您可以将数据上下文视为 YAML 文件或 python 字典,其中包含运行 Great Expectations 验证作业所需的所有配置。这些配置包括数据源、元数据存储(预期存储、验证存储、评估参数存储、检查点存储、配置文件存储)和数据文档站点。满怀期望,您可以使用 CLI 初始化新的数据上下文,或者可以在笔记本或工作流工具中实例化数据上下文,而无需 YAML 文件。数据上下文是《远大前程》的核心。没有它,您无法运行任何作业。
  2. 第二步是根据您在数据上下文文件中定义的数据源配置连接到数据。你的数据可以是内存中的 Pandas 或 Spark data frame,也可以来自文件系统、数据库(MySQL、PostgreSQL、MSSQL、Redshift、BigQuery 等),或者云存储位置(AWS S3、Google 云存储(GCS)、Azure Blob 存储)。
  3. 第三步是开发期望,并将配置的期望添加到数据上下文文件中定义的期望存储中。有多种方法可以创建数据质量预期。例如,您可以从领域知识中创建这些期望。您还可以使用 onboarding data assistant 来分析您的数据,并自动生成期望套件,然后您可以对其进行调整以适合您的特定需求。
  4. 第四步(也是最后一步)是验证您的数据。在运行数据验证过程之前,您需要首先创建一个检查点文档。配置检查点时,您可以添加额外的验证数据,或者设置检查点,以便必须在运行时指定验证数据。您可以添加额外的期望套件,并且可以添加检查点在完成数据验证时将执行的操作。常见操作包括更新数据文档、发送电子邮件、发布时差通知或发送其他自定义通知。

PyDeequ 实施指南

Deequ 是一个构建在 Apache Spark 之上的库,用于定义“数据的单元测试”,测量大型数据集中的数据质量。Deequ 的目的是在数据进入消费系统或机器学习算法之前,对数据进行“单元测试”,以尽早发现错误。Deequ 处理表格数据,例如 CSV 文件、数据库表、日志、扁平的 json 文件,基本上是任何可以放入 Spark 数据框架的东西。

在这里,您会注意到 Deequ 和 Great Expectations 之间的一个主要区别是,Deequ 仅适用于 Spark 数据框架,而 Great Expectations 同时支持 Spark 和 Pandas 计算引擎。这未必是一件坏事。原因是,Deequ 构建于 Apache Spark 之上,旨在处理通常位于分布式文件系统或数据仓库中的非常大的数据集(想想几十亿行)。

Deequ 有一个名为 PyDeequ 的 Python 接口,编写这个接口是为了支持 Deequ 在 Python 中的使用。以下是 PyDeequ 的主要组成部分:

  • 分析器和配置文件—分析器和配置文件模块都有助于探索大规模的大数据,计算制定数据质量约束所需的指标。例如,您可以使用 analyzer 来计算列的近似计数清晰度、列的近似分位数以及计算出的完整性值。Analyzer 还可以用来进行符合性检查,测量符合给定的
    列约束的行的比例。
  • 约束建议 PyDeequ 提供预定义的规则和约束,以便对您的数据提出建议。这些预定义的规则包括建议列的分类范围约束、非空约束、数据类型约束和唯一约束。
  • 约束验证—一旦定义了约束,就可以对新数据运行验证测试。验证结果、成功指标以及检查状态可以保存为数据帧或 JSON 文件。
  • 指标存储库——PyDeequ 允许用户将 spark 数据帧上计算的指标和验证结果以 JSON 格式保存在一个中央指标存储库中。PyDeequ 支持两种类型的度量存储库,一种是 InMemoryMetricsRepository,另一种是 FileSystemMetricsRepository。FileSystemMetricsRepository 还支持 HDFS 和 S3。计算的每组指标都需要由 ResultKey 索引,result key 包含一个时间戳,并支持键值对形式的任意标签。有了度量存储库,用户以后可以用不同的方式从存储库中检索度量。

PyDeequ 非常容易启动,并支持 Spark 作为计算引擎,但是 Great Expectations 是一个更全面的数据质量管理框架。

δ现场表实施指导

Delta Live Table (DLT)是 Databrick 的内部 ETL 框架,它可以轻松构建和管理可靠的数据管道,在三角洲湖上提供高质量的数据。DLT 的重点之一是数据质量管理。它提供了通过验证和完整性检查来防止坏数据流入表中的机制,并通过预定义的错误策略来避免数据质量错误。它还提供了一个控制面板来监控数据质量随时间的变化趋势,以深入了解您的数据是如何演变的,以及哪里可能需要进行更改。

与远大期望类似,您可以使用期望来定义数据集的数据质量约束。期望由一个描述、一个不变量和一个当记录不符合不变量时要采取的行动组成。当记录违反预期预定义的预期时,DLT 提供 3 种类型的策略:

  • expect——当您想要保留违反预期的记录时,可以使用 expect 操作符。违反预期的记录将与有效记录一起添加到目标数据集中。
  • expect 或 drop——您可以使用 expect 或 drop 操作符来防止处理无效记录。违反预期的记录将从目标数据集中删除。
  • 期待或失败—当无效记录不可接受时,使用期待或失败操作符在记录验证失败时立即暂停执行。如果操作是表更新,系统自动回滚事务。

摘要

如今,越来越多的业务应用程序和操作系统使用数据,并对数据进行隐式假设,例如,一些列必须具有特定的数据类型,一些列不应包含任何缺失值。如果违反了这些假设,应用程序可能会崩溃,ML 驱动的系统的性能可能会下降,或者,基于数据的业务决策可能会有偏差,甚至是错误的。

因此,无论您最终选择哪种数据质量框架(或者如果适合您组织的需求,您甚至可以构建自己的数据管理解决方案),最重要的事情是将数据可靠性和完整性检查构建到您的数据管道中,以确保您为数据消费者提供高质量的数据。

我希望你喜欢阅读这篇博客。如果你想在有新博客发表时得到通知,请随时关注我。我一般每周都会发表 1-2 篇关于数据和 AI 的文章。

如果想看到更多围绕现代高效数据+AI 栈的指南、深度潜水、见解,请订阅我的免费简讯— 高效数据+AI 栈 ,谢谢!

参考

  • https://www.databricks.com/glossary/medallion-architecture
  • https://docs.greatexpectations.io/docs/
  • https://github.com/awslabs/deequ
  • https://github.com/awslabs/python-deequ
  • https://docs . databricks . com/workflows/delta-live-tables/index . html

注:以防万一你还没有成为媒体会员,并希望获得无限制的媒体访问权限,你可以使用我的推荐链接注册!我可以免费给你一点佣金。非常感谢你的支持!

Julia 中的数据工程

原文:https://towardsdatascience.com/data-engineering-in-julia-3fd37eaa618a

开始创建数据管道所需的一切🪠🧑‍🔧

作者图片

朱莉娅是数据科学和机器学习的自然选择?但是数据工程呢?在这篇文章中,我们将介绍如何使用 Julia 完成各种数据工程任务,从基础到创建管道。正如您将看到的,Julia 的性能和易用性可以轻松地跨整个 ML 和 DS 堆栈使用。

接下来,我们将探讨以下主题,并了解如何使用 Julia:

  • 阅读🤓在茱莉亚写✍️的文件
  • 使用数据库💽
  • 其他工具概述

如果您想了解 Julia 为什么非常适合数据科学,请查看这篇文章:

https://betterprogramming.pub/why-you-should-invest-in-julia-now-as-a-data-scientist-30dc346d62e4

如果你对为什么 Julia 是机器学习的未来感兴趣,请查看:

什么是数据工程?🧐

在我们深入细节之前,有必要回顾一下数据工程到底是什么。如果你已经知道这些东西,并且想深入了解 Julia,请随意跳过这一部分。在尽可能高的水平上,数据工程是将数据从一个源移动到另一个源。举例来说,您有一个在生产环境中运行的网站,有多台服务器,每台服务器都存储特定产品销售的数据。检查总销售额的一种方法是在生产数据库上运行查询,并聚合结果以获得总销售额。但是如果你想做一个更复杂的分析呢?

在这种情况下,数据工程师可能会将所有生产数据库连接到一个专门用于分析目的的不同数据库。到目前为止,我们已经介绍了数据工程的提取和加载功能。然而,在许多情况下,我们可能希望数据采用不同于原始格式的格式。也许您正在记录总交易,但现在想要逐行的项目成本。这是数据工程师执行数据转换的地方,这是数据工程的第三个主要功能。

斯蒂芬·道森在 Unsplash 上拍摄的照片

那么从数据工程的角度来看,我们在这个例子中实际上做了什么呢?嗯,我们定义了一个管道!为了让这个例子发挥作用,我们有一个数据源(原始生产服务器),我们在那里进行提取,然后扩充/转换数据,接着将数据加载到数据仓库(存储),数据科学团队现在可以在那里做进一步的分析。

现在,您已经对数据工程流程有了大致的了解,可能会更清楚为什么让数据科学团队和数据工程团队使用相同的工具(即 Julia)对每个人都有好处。

编辑:我和我的合著者很高兴地告诉大家,我们的新书《朱丽亚速成教程》已经开始预售了:

https://logankilpatrick.gumroad.com/l/juliacrashcourse

阅读🤓在茱莉亚写✍️的文件

一种常见的数据存储技术是将信息保存为逗号分隔值(CSV)。让我们来探索如何用 Julia 加载、修改和写入 CSV 格式的数据。为此,我们将使用 DataFrames.jl 和 CSV.jl 包。我们从添加包开始:

**(@v1.7) pkg>** add DataFrames # type "]" to enter pkg mode**(@v1.7) pkg>** add CSV # type "]" to enter pkg mode

如果您从未使用过 Julia 中的包管理器,并且需要一个快速概览,请查看这篇文章:

https://blog.devgenius.io/the-most-underrated-feature-of-the-julia-programming-language-the-package-manager-652065f45a3a

现在我们已经安装了数据帧和 CSV,我们将加载它们:

**julia>** using DataFrames, CSV

接下来,让我们将 CSV 文件加载到 DataFrames.jl 中:

julia> df = DataFrame(CSV.File("/Users/logankilpatrick/Desktop/QS World University Rankings combined.csv"))

在这个例子中,我们将在 Kaggle 数据集上使用 QS 世界大学排名 2017–2022,该数据集在
公共域中。我们可以看到如下结果:

作者捕获的图像

如果您想选择一个特定的列,您可以这样做:

**julia>** df.university 6482-element Vector{String}:"Massachusetts Institute of Technology (MIT) ""Stanford University""Harvard University""University of Cambridge"⋮

要获得所有的列名,我们可以使用namespropertynames函数:

**julia>** names(df)9-element Vector{String}:"year""rank_display""university""score""link""country""city""region""logo"

如果我们想逐一遍历所有的行,我们会这样做:

for row in eachrow(df) print(row)end

好了,现在我们知道了如何进行一些基本操作,接下来让我们看看如何修改数据帧,然后将其写回 CSV 文件。在 DFs.jl 中,我们可以通过执行df[index, columns]来访问特定的行,所以在这种情况下,如果我们想要访问第二行以及属于它的所有列,我们应该执行df[2, :]。现在让我们创建一个新变量:

**julia>** new_row = df[2, :]**julia>** new_row.university = "Julia Academy""Julia Academy"**julia>** new_row.city = "Remote""Remote"**julia>** new_row.link = "juliaacademy.com""juliaacademy.com"

然后要将新行添加回数据框,我们可以使用push!函数:

**julia>** push!(df, new_row)

现在我们有了更新的数据帧,我们可以通过执行以下操作将其写入 CSV:

**julia>** CSV.write("/Users/logankilpatrick/Desktop/QS World University Rankings combined and Edited.csv", df)

您可以在本地确认这创建了一个新的 CSV 文件,并在最后更新了值。这应该能让你很好地处理 CSV 格式的数据。当然,还有很多我们无法在这篇文章中涵盖的内容,但是我希望这个例子能让你相信在 DataFrames.jl 中使用 CSV 是非常容易的。如果您想了解更多信息,请查看 DataFrames.jl 文档或观看来自 JuliaCon 2021 的研讨会教程:

使用数据库💽在朱莉娅

让我们从在 Julia 中使用 MySQL 开始这个数据库部分。就像我们对其他包所做的那样,要添加 MySQL.jl,我们只需输入] add MySQL。然后,运行using MySQL来加载包。

请注意,本节假设您已经在计算机上创建并运行了一个 MySQL 数据库。我们可以通过以下方式连接到该数据库:

**julia>** con = DBInterface.connect(MySQL.Connection, "localhost","root", "my_password", db = "teacher_sample")MySQL.Connection(host="localhost", user="root", port="3306", db="teacher_sample")

在上面的代码中,我们使用用户名“root”、密码“my_password”和模式名“teacher_sample”连接到目的地“localhost”的数据库。同样,其中一些属性是我在创建 MySQL 数据库时预先设置的。

为了正确地查看我们可以从 SQL 命令返回的结果,我们还需要通过以下方式加载 DataFrames.jl 包:

using DataFrames

然后,我们可以尝试执行一个简单的命令,比如SELECT *:

**julia>** DataFrame(DBInterface.execute(con, "SELECT * FROM teacher_sample.teachers;"))

这会产生以下数据帧:

DBInterface.execute()功能有两个输入:

  • 光标,它是指向我们最初定义的要使用的数据库的指针
  • 字符串格式的 SQL 命令(就像 Python 中的 MySQL 一样)

从这里开始,您可以通过对不同的 SQL 字符串使用相同的execute函数来执行几乎任何您想要的 SQL 命令。这包含了您将从数据库包中获得的核心功能。

Julia 中的其他数据库

除了 MySQL,还有很多其他用 Julia 写的数据库绑定。你可能想看看 TypeDB.jl:

或者 JuliaDB(纯 Julia 数据库):

还有很多其他的!我建议查看一下 https://github.com/JuliaData 的和 https://github.com/JuliaDatabases 的以获得 Julia 中所有可用数据库的完整列表。

其他数据工程工具⚒️

你用什么进行数据工程实际上取决于你在做什么。让我们简单回顾一下如何在 Julia 中使用一些最常见的数据工程工具:

Julia 中的红移

如果想在 Julia 中连接 AWS 红移,可以使用 LibPQ.jl

Julia 中的 BigQuery

Google 的 BigQuery 可以通过 GCP.jl 访问。

朱莉娅中的画面

虽然不完全支持,但您可以通过以下扩展在 Julia 中连接 Tableau:

朱莉娅的阿帕奇火花

Apache Spark 的 Julia 绑定存在于 Spark.jl

《朱丽亚》中的阿帕奇·卡夫卡

在 RDKafka.jl 中可以找到librdkafka的包装器

朱莉娅的达斯克

虽然不完全相同,Dagger.jl 提供了并行性,这很受 Dask 的启发:https://github.com/JuliaParallel/Dagger.jl

朱莉娅的阿帕奇蜂房

Hive 通过 Hive.jl 可用

Julia 会是数据工程的未来吗?🧐

这篇文章的主要目的是强调,你需要的很多工具,如果不是全部的话,都以这样或那样的形式存在。虽然这里或那里可能会有尖锐的边缘,但许多构建块现在已经就位,因此学习 Julia 并希望使用它的人们拥有了他们高效工作所需的东西。

我认为 Julia 在数据工程领域的优势在于模糊了那些想从事软件工程、数据工程和数据科学的人之间的界限。现在,因为许多工具是特定于上下文的,没有多少人在这个领域工作。但是我看到了一个未来,即“全栈数据工程师”使用 Julia 作为帮助他们的单一工具,跨所有三个学科工作。

虽然我已经完成了相当多的高级数据工程,但在这篇文章中,我仍然有很多不知道的东西,并且可能已经错过了。您可能也有兴趣阅读关于使用 Lathe.jl 的 ML 管道。

欢迎在 Twitter 上联系我,分享你的想法:https://twitter.com/OfficialLoganK

数据、工程师和设计师:美国与欧洲的比较

原文:https://towardsdatascience.com/data-engineers-and-designers-how-us-compares-to-europe-e1ce6f0a8908

早些时候,我声称随着公司加倍招聘数据,数据与工程师的比率接近 1:2,一些欧洲顶级科技公司,数据正迎来它的时刻。

它和池塘那边相比怎么样?🇺🇸

我观察的美国公司的数据与工程师比率的中位数是 1:7,而欧洲公司是 1:4。两组的设计与工程师比例均为 1:9。

这篇文章给出了为什么会这样的一些答案,但也留下了一些没有答案的问题。

让我们开始吧!

作者图片

这是处于不同等级的公司之间的巨大差距。

分析公司实际上并不擅长分析。令人失望的是,像 Amplitude、Pendo、Snowflake 和 Fullstory 这样的分析公司并不擅长分析。上述所有公司只有约 2%的员工从事数据工作,超过一半的员工根本不从事技术工作。

开发工具公司确实是为开发人员服务的。当谈到每个工程师的数据人员和设计师数量时,HashiCorp、Sentry 和 Gitlab 都在名单上垫底。这是有道理的,他们都有大型的工程团队——有些超过了员工总数的 50%。

数据是德州的秘密辣酱

给工程师绘制一个设计和数据的矩阵告诉我们一个有趣的故事,公司关注哪里。

作者图片

这与它对欧洲公司的看法有什么不同吗?相当多!

只有 50%的美国公司的数据人员多于设计师,相比之下,我观察的欧洲公司有 80%的数据人员多于设计师。

这并不意味着欧洲人对设计的投资减少;他们只是在数据上投入更多。对于美国和欧洲的公司来说,设计与开发者的比例中位数是 1:9。这与 Nielsen Norman Group 在对 500 家公司的研究中发现的相差不远,该研究显示 50%的公司的目标是设计与开发者的比例至少为 1:10。

美国公司通常是工程第一。与 19 家欧洲公司相比,36 家美国公司属于这个象限。

这是巧合还是有什么结构性的东西在这里发生?让我们深入🇺🇸🤺 🇪🇺.

曲奇还是饼干?美国公司与欧洲公司相比如何

从上周的分析中,我们知道商业模式是数据与工程师比率的最佳指标之一;例如,与 B2B 相比,市场中每个工程师的数据人员数量是 B2B 的 2-3 倍。我只是从美国的低数据比率商业模式中挑选了更多的公司吗?或许如此,但即使在相同的商业模式下,美国和欧洲公司的数据工程师比率也有很大不同。

作者图片

画面清晰。在所有商业模式中,欧洲公司的每位工程师拥有的数据人员明显多于美国公司。

美国是一个更大的市场,拥有更大的工程团队。Doordash & Deliveroo。 deliver oo(🇪🇺)的数据与工程师比率为 0.42,是 Doordash (🇺🇸)的两倍多,为 0.18。这并不意味着 Doordash 更少数据驱动;事实上,从绝对意义上讲,他们的数据人员比 Deliveroo 多,而且他们的团队中不乏出色的数据工作人员。他们的工程团队比 Deliveroo 大得多。

在我的分析中,纵观所有 100 家公司,美国公司的工程师占总劳动力的比例是 21%,而欧洲是 17%。

欧洲有更多的深度技术,美国有更多的开发工具。哈希公司& Onfido。
Onfido (🇪🇺)的数据工程师比率为 0.16,相比之下,HashiCorp (🇺🇸).)的数据工程师比率为 0.02 如果你是瘾君子,那就说得通了。机器学习是你的产品的核心部分,对数据进行更多投资是一个好主意。欧洲有很多类似的深度科技创业公司。相比之下,开发工具与工程师的数据比率非常低,美国目前拥有 DevOps 工具市场的最大份额。

如果我们将数据与工程师的比率并排放在一起,对比是鲜明的,某些垂直行业的差距超过 2 倍。

作者图片

虽然美国更大的工程团队和欧洲对深度技术的关注有助于解释这一点,但还有其他因素在起作用。以下是我的一些(推测的)假设

1)美国市场更大,竞争更激烈,有更多经验丰富的销售主管。因此,美国的 B2B 公司拥有相对较大的销售队伍。

2)欧洲的创业公司通常从一开始就分散在许多市场。这带来了独特的数据挑战,需要更大的数据团队。

3)越来越多的美国公司由工程创始人领导,他们创造了一种更加注重工程的文化。

为了保持良好的秩序,我还研究了公司规模与数据工程师比率之间是否存在关联,因为我的样本中的美国公司略大一些(美国公司的平均规模为 2100 家,而欧洲公司为 1500 家)。我没有发现显著的相关性。

让我知道你的想法。

关于数据

我查看了 LinkedIn 上的关键词,包括了所有匹配项(例如,产品工程师将与工程师项匹配)

  • 数据:数据分析师、数据科学家、机器学习、数据工程师、数据经理、分析工程师、产品分析师、商业智能、数据主管/经理/总监/副总裁
  • 工程:工程师(不含数据工程师),技术/技术负责人
  • 设计:设计(er),用户体验,UX,用户研究

我故意没有包括所有分析师角色,这意味着诸如财务分析师、销售分析师和策略分析师等角色不被算作数据角色,尽管您可以将他们的一些工作归类为数据工作。

魔法数据插补

原文:https://towardsdatascience.com/data-imputation-with-magic-85263d09a43f

凯西-卡达布拉-阿拉卡赞!像变魔术一样消除数据中的噪音!

佩吉·科迪在 Unsplash 上拍摄的照片

在单细胞 RNA 测序数据(scRNA-seq)中,记录了单个细胞基因组中 mRNA 分子的数量,我们经常遇到这些分子的低计数或零计数。这是因为测序机器对更稀疏表达的基因的检测效率较低,导致它们被错误地标记为 0。这给 scRNA-seq 数据增加了许多噪声,这可能使下游分析如维度减少、差异基因表达和轨迹推断潜在可疑。具体来说,这种噪音可以掩盖感兴趣的基因的已知生物关系。

消除这些数据的噪声并绕过这个障碍不是很好吗?这就是归罪的由来。插补是一种填充或估算缺失数据(即零计数)的方法,通过对这些缺失数据条目的真实值进行有根据的猜测。去噪是一种插补模式,在这种模式下,您可以估计噪声并相应地移除噪声。实现这一点的一个简单而有效的方法是来自 Krishnaswamy 实验室的算法(该实验室开发了 PHATE ,一种与更常用的 UMAP 具有竞争力的降维算法),称为 MAGIC 。MAGIC 代表MarkovAf 基于 GI 计算的 C 单元。这种方法在单个单元格数据的图形表示上使用数据扩散来消除噪声。

如果您已经阅读了我的文章,下面的步骤将会非常熟悉,但简单地说,该算法从一个单细胞数据的矩阵开始(但您可以很容易地在您自己的数据集中替换这种矩阵格式),并计算细胞之间的欧几里德距离,创建一个细胞到细胞的距离矩阵(根据数据的维度,我们通常在 PCA 空间中用大约 10-100 个主成分来确定这些距离)。这个矩阵然后从距离转换成亲和力。这度量相似性并且与距离成反比,例如两个细胞在欧几里得空间中越接近(即,它们的距离越小),它们的亲和力越大。该计算使用指数内核实现:

作者图片

其中 xy 各自对应于 PCA 空间中的细胞坐标, d(x,y)xy 之间的欧几里德距离, σ 是带宽参数,并且测量由该核捕获的邻域的“扩散”或半径。这是捕捉邻域单元内局部变化的关键。 σ 的选择因每组单元格而异,以校正单个单元格图中的密度差异。例如,一些细胞可能占据具有很少相邻细胞的稀疏区域,而其他细胞则挤满了一堆细胞。因此,我们希望稀疏区域的带宽“更宽”,而密集区域的带宽更短,以校正这种邻域变化。因此,我们将 σ 设为 x 与其第 k 个最近邻居之间的距离:

作者图片

其中 xₖ 是单元 x 的第 k 个最近邻。MAGIC 的作者建议这个 k 应该很小,以确保整个图的连通性。然而,因为 σ 是细胞特定的,我们的亲和矩阵不再是对称的(即,可能存在一对 x,y 使得 A(x,y) ≠ A(y,x) )。这可以很容易地通过将我们的亲和矩阵的转置添加到原始矩阵 A 中来纠正。

作者图片

在我们计算了我们的亲和矩阵之后,我们通过行标准化将这些值转换成概率,在一个步骤中为所有单元获得从单元 x 到单元 y 的马尔可夫转移概率。

作者图片

因为退出效应呈现出一种形式的技术变异,这种变异通常与生物变异难以区分,随机采样特征(在这种情况下,每个基因的 mRNA 分子计数)可能导致已知先验相同的细胞(例如,干细胞或红细胞)之间的可疑变异。但是,将这些数据想象成一个图,其中节点表示单元,边表示相似单元之间的连接,您可以假设相似单元共享许多邻居,而不同单元具有较少的共同邻居。有没有一种方法可以让我们利用这些信息,让计数稀少的细胞可以从它们噪音较小的朋友那里学习?这就是数据扩散的用武之地,它为我们的马尔可夫概率矩阵求幂 t 。这可以直观地认为是在随机行走的 t 步内从单元格 x 转换到单元格 y 的概率。这个 t 被称为扩散时间。因此,在确定其基因表达谱时,细胞有更多的邻居可以遍历和学习。矩阵的这种动力增加了相似细胞的亲和力,同时消除了更嘈杂的连接。在图形信号的上下文中,您可以将它视为一个低通滤波器,当我们增加 t 时,我们不仅通过亲和力加强相关单元之间的连接,还通过降低稀疏性中出现的错误连接的权重来消除噪声。

这个乘方矩阵然后直接乘以 scRNA-seq 数据的原始矩阵,以获得滤除噪声的估算矩阵。

作者图片

其中 M 为扩散时间驱动的概率矩阵, tXm 细胞和 n 基因的原始单细胞矩阵, X _impute 为估算的基因表达矩阵。

概括地说,我们首先从预处理的原始数据计算细胞到细胞的距离矩阵,将距离转换为亲和力,将亲和力归一化为概率,然后对得到的概率矩阵求幂并乘以原始数据矩阵。很简单,对吧?我非常欣赏这个算法的一点是,从数学的角度来看,它是多么的简单和优雅。但是足够的数学,让我们看看这个算法在行动!

为了测试 MAGIC,我们将使用 pip 安装 Python 版本:

pip install --user magic-impute

我们还将安装一些用于预处理数据的单细胞分析包,以及用于可视化的 PHATE:

conda install -c bioconda scvelo

conda install -c conda-forge scanpy

pip install scprep phate

我们将使用神经元分化的 scRNA-seq 数据集来说明神奇之处。如果你感兴趣的话,你可以阅读我的 RNA velocity 文章,了解更多关于生物学的细节。

原始数据的摘录,其中列对应于基因,行是单个细胞;注意零的大量存在。作者图片

将 MAGIC 应用于神经元分化的 scRNA-seq 数据集的结果。(左)插补前的像元散点图。(右)用魔法插补后的细胞散点图。作者图片

让我们看一下这些图,x 轴是神经元中表达的基因的 mRNA 丰度,称为 VSNL1y 轴是一个叫做 RUNX1T1 的基因的 mRNA 丰度,它出现在前体细胞类型中。每个点都是一个单独的细胞,由另一种叫做 RBFOX1 的神经元标记的表达来着色。我们预计随着细胞沿 x 轴转化为神经元,RUNX1T1 的表达会有明显的下降趋势,RBFOX1 的表达证实了这一点。左图太吵了,无法欣赏这一趋势,但右图用魔法插补成功地再现了这一生物现象。

我们还可以使用 PHATE 可视化原始数据和估算数据,如下所示:

原始(左)和估算(右)数据集之间的 PHATE 比较。作者图片

在这里,细胞根据 RBFOX1 mRNA 的表达被着色,我们可以在右边的图中看到一个清晰的梯度,因为细胞变成了神经元。

结论

在本文中,我们学习了 MAGIC,这是一种简单而有效的去噪方法。虽然在设计时考虑了生物数据,但这种方法也可以应用于其他类型的数据,其中缺失值和噪声也可能是常见的。值得注意的是,在选择幂马尔可夫矩阵的指数 t 时应该小心。指数过高会导致过度平滑,这会消除现有的生物变异,导致下游分析得出错误的结论。为此,对它的常见批评强调了它如何不区分真正的生物零和假阳性,而是转换整个矩阵,而不仅仅是丢失的值。然而,我欣赏这个算法的一点是,从数学的角度来看,它是多么的简单和优雅。单细胞生物学中的插补领域是一个非常受欢迎的分支学科,在过去的几年里,它催生了大量的算法(下面的参考文献中列出了一些例子),MAGIC 是开创性的方法之一,至今仍被广泛应用于该领域。

感谢您阅读这篇文章。如果您还不是中级会员,请考虑在此注册,以便充分使用该平台提供的所有功能:

https://medium.com/@jashahir?source=entity_driven_subscription-56690d914eaf------------------------------------

参考资料:

[1] D. van Dijk,R. Sharma,j . nay ns,K. Yim,P. Kathail,A. J. Carr,C. Burdziak,K. R. Moon,C. L. Chaffer,D. Pattabiraman,B. Bierie,L. Mazutis,G. Wolf,S. Krishnaswamy,D. Pe'er,利用数据扩散从单细胞数据中恢复基因相互作用 (2018),细胞
[2] 以及 S. Krishnaswamy,将高维生物数据中的结构和跃迁可视化 (2019),Nature Biotechnology
【3】m . Huang,J. Wang,E. Torre,H. Dueck,S. Shaffer,R. Bonasio,J. I. Murray,A. Raj,M. Li 和 N. R. Zhang, SAVER:用于单细胞 RNA 测序的基因表达恢复(2018) , Nature 单细胞 RNA-seq 数据的精确稳健插补方法 sci compute(2018)Nature communication s*
【5】g . La Manno、R. Soldatov、A. Zeisel、E. Braun、H. Hochgerner、V. Petukhov、K. Lidschreiber、M. E. Kastriti、p . lnnerberg、a .、J. Fan、L. E. Borm、Z. Liu*

数据叠衣服是一个有风险的游戏

原文:https://towardsdatascience.com/data-jenga-is-a-risky-game-911f3426602d

为什么可持续的数据基础是任何人工智能计划的关键

用 DALL-E 2 生成的图像。

将人工智能引入制造业有巨大的潜力。企业正在向智能制造和工业 4.0 计划投入大量资金,但在预期和实际成功之间仍存在巨大差距。

这有不同的原因,但本文将关注最基本的原因之一——数据基础不适用于目的。你可以称之为数据叠木,因为就像在游戏叠木中一样,你可以通过在顶部开始构建来创建越来越不稳定的结构。

速赢困境

人工智能计划通常作为创新项目启动,与公司的核心有些脱节。为了展示成功并获得更多的接受和支持,项目团队通常使用务实的方法,追求快速成功——围绕具有一些(但不是大量)商业价值的可用数据的机会。

虽然这种方法是可以理解的(通常也是管理层所期望的),但它有一个很大的问题:

重点在于利用当前数据和现有(元)数据管理的可能性,而不是利用正确的数据基础的可能性

价值创造可能既不可扩展也不可持续,因为必要的数据基础尚未到位。就像在激动人心的叠树游戏的最后阶段一样——你可能仍然可以移走一块积木并把它放在上面——但是塔可能会为下一个玩家而倒塌。

数据基础是否符合目的?

制造业中人工智能计划的成功(以及最终的业务影响)最初取决于三个支持支柱,数据团队需要确定数据驱动的价值创造途径:

  • 清晰的商业价值主张
  • 领域专业知识(过程、工业自动化)
  • 足够数量的相关且管理良好的数据(数据基础)

由于公认的高质量数据在既定业务流程中的影响,来自 ERP 系统的数据一般都有良好的数据管理实践[1]。

然而,在制造业的人工智能等新兴领域,数据管理可能仍处于早期阶段,数据来自主要为过程控制设计的系统,其次才是数据收集。虽然在工业自动化系统中数据收集可能很简单,但大量的数据不应被误认为是提取有用知识的实际能力。

此外,吴恩达呼吁一种更加以数据为中心的方法:“不要仅仅关注你收集的数据的数量,还要考虑质量,确保它清楚地说明了我们需要人工智能学习的概念。”[2]

如果没有管理良好的相关数据,人工智能计划的变革性影响的概率可能会从一开始就大大降低。

解决战略差距,释放人工智能的全部潜力

当规划人工智能计划时,缺乏坚实的数据基础很快就会显现出来。然而,存在这样一种风险,即核心项目团队之外的相关利益相关者可能没有认识到这一战略差距。

由于期望在短时间内交付有影响力的结果,沟通可能会变得偏向于成功,专注于速赢。修复数据基础中的战略缺口可能看起来不那么有吸引力,因为这需要付出巨大的努力,并且只能在中长期内获得回报。

持续关注速赢可能会导致一种误解,即简单地建立一些数据分析能力就足以掌握人工智能转型。这甚至可能导致组织没有意识到真正的潜在数据和人工智能对他们的影响。在最坏的情况下,他们甚至可能会完全错过这个机会。

用坚固的金字塔取代摇摇欲坠的塔楼

最终,组织的任务是将计算机科学最基本的概念之一——信息或数据金字塔https://en.wikipedia.org/wiki/DIKW_pyramid【3】——落实到位。它实现了从原始数据(信息)到托管数据(信息)的旅程,通过分析信息构建知识,一直到顶层,再到具有可衡量影响的数据驱动的行动。

数据金字塔及其两个战略方向。图片作者。

制造业中的一个真实例子是现场维护数据(信息)的集合,以识别统计上最重要的设备故障根本原因条件(知识)。

例如,获得的知识可以反馈给 R&D 团队,他们创造了新的和改进的设备设计(智慧)(非人工智能的例子)。也有可能将这种知识与工业自动化数据相结合,以提供实时决策支持系统,例如,避免设备的计划外停机时间(人工智能示例)。

金字塔的结构底部比顶部宽。因此,信息金字塔强调需要一个坚如磐石的数据基础。提取洞察力需要大量的(管理的)数据,这在很大程度上取决于统计法则。

但是如果金字塔还不在那里,如何建造它呢?为了促进这一过程,一些组织现在已经开始创建数据产品的概念和数据产品经理的角色[4]。

自上而下和自下而上:从两个方向构建金字塔

虽然可能存在从挖掘容易获得的数据中发现(意想不到的)知识的情况,但在战略环境中,信息金字塔的定义应该更多地被认为是自上而下的过程,带有自下而上的验证。

基于其战略,一个组织将能够形成可操作的洞察力(智慧),这将使其在市场中具有竞争优势。它可以形成需要构建的知识,这将使组织能够以有效的方式保持竞争优势(=目标知识)。

但是可行吗?引入数据、业务和领域专家将自下而上地验证该方法。目标知识可以基于可行性考虑进行提炼,最终,业务策略将被完美地嵌入到数据结构和架构中。

与多学科团队一起完成这一分析将照亮前进的道路,并突出差距和障碍。它将有助于为一个组织构建人工智能的全部潜力,并弥合技术、领域专业知识和商业战略之间的差距。

结论

构建组织的未来信息金字塔需要大量的时间、精力和投资。但要真正踏上人工智能之旅并释放其全部商业潜力,没有其他办法。

不要把未来的成功建立在摇摇欲坠的叠罗汉塔上,而是依靠坚如磐石的金字塔。

参考资料:

[1]、杨·w·李、利奥·l·皮皮诺和黛安·m·斯特朗(1998 年)。将您的信息作为产品进行管理。麻省理工学院斯隆管理评论,1998 年夏季:95–105

[2]吴恩达。对你的业务来说,人工智能不必太复杂或太昂贵。哈佛商业评论,2021 年 7 月 29 日。

[3]阿科夫,R. L. (1989 年)。从数据到智慧。应用系统分析杂志 15:3–9。

[4]托马斯·h·达文波特、兰迪·比恩和谢尔·贾恩(2022 年)。为什么贵公司需要数据产品经理。哈佛商业评论,2022 年 10 月 13 日

数据湖架构:如何将您的业务提升到数据驱动的世界

原文:https://towardsdatascience.com/data-lake-architecture-for-a-heavy-machinery-dealer-how-to-level-up-your-business-to-the-b41145e86b15

迟做比不做好

在当今世界,所有现代企业都有数字化的一面。也许一些小型手工业企业仍然没有受到数字的影响,但这是例外。每个组织都经历了数字化的几个阶段,从现金流的基本会计到高级分析、预测建模和基于数据的数字服务的开发。

今天,让我分享我的一个客户案例,在这个案例中,我和我的团队致力于数据湖实施,以实现自动化分析来帮助加快决策过程。

显然,这一切都是从 Excel 工作簿开始的。但是,企业中的数据源数量会随着企业的发展而增加。通常,许多业务应用程序都在使用中,如 CRM、ERP 和 WMS。但是,用 Excel 做报表和分析数据的习惯从来没有消失过!

迟早会出现这样的情况:从过多的系统中导出的数据图表过多。每天都需要花费时间来手动准备报告数据,而且从不同系统汇集信息也是一项挑战。如果你需要更新过去时期的信息,那真的是一场噩梦。如果手动处理用于报告和分析的数据,发现错误几乎是不可能的。重新开始可能更容易!

简而言之就是所谓的“Excel 地狱”😃

幸运的是,我们的客户,一家重型建筑机械和设备的主要经销商,在为时已晚之前看到了这些趋势,并要求我们提供帮助。任务是让他们的员工摆脱手动数据准备,并为他们提供一个选项,用于对来自所有系统的数据进行多功能分析,而不需要额外的开发人员。如果可能的话,我们还将为公司的客户提供一种访问数据的方法。时间刚刚好!

即使是 Excel 也比没有好

似乎我们必须自动化部分数据准备过程,并从头开始创建其余部分。这需要对现状进行分析。

首先,我们采访了所有报告系统的用户,并收到了报告的样本。令我们惊讶的是,我们发现员工使用工作簿的一部分作为在 Power BI 中创建的报告的来源。他们只是将手动准备的工作簿作为一个源,并将数据可视化!

这无疑是次优的,因为在大多数情况下,有可能直接连接到业务系统数据,并在报告编辑器中设置限制、添加计算和链接。考虑到 Power BI 对于操作来说是多么简单,因此责怪分析师是没有用的。

在收到当前报告的概述后,我们将其与来源进行了比较。原来,这些不仅仅是应用程序,还有其他 Excel 文件——包含来自外部云 SaaS 的规划数据和报告的文件。甚至还使用了从 GPS 跟踪提供商那里导出的 PDF 文件,其中包含他们自己车队的活动报告。出乎意料的是,我们知道一种为这种系统安排数据收集过程的方法。

因此,我们有一个相当大的 Excel 文件,其中指定了所有源及其属性(访问方法、粒度、刷新率、更改历史等。).这些实际上是元数据,为此开发了一种独特的软件——数据目录。然而,要在业务中灌输数据文化,我们必须从小处着手。Excel 文件是未来目录的第一步。

体系结构

因此,所有这些数据都必须定期从其来源中提取出来并保持更新。数据还必须在最详细的级别上可供分析师使用,他们永远不会提前知道他们想要创建什么样的报告,或者他们想要分析什么样的新指标和业务属性。

根据我们到目前为止所学到的一切,我们故意拒绝了开发企业数据仓库的经典方法。我们选择不创建包含事实、测量和预定义公式的统一数据模型来计算显示。在这种情况下,最合适的架构类型是“数据湖”。

当然,数据湖架构也有其优点和缺点,但是我们将在另一个时间讨论这种方法的适用性。可以说,数据以最详细和“原始”的形式存储,用户可以访问它们或预先安排的数据集市。没有它们也是可能的,尽管有时在复杂计算的情况下使用它们来提高报告的响应速度是值得的。

数据湖架构可以在各种软件的帮助下实现,比如使用 Apache 组件的开源栈。然而,我们的客户已经订阅了微软 Azure,并且部分业务应用程序通过云服务使用,如 MS Dynamix 365。应该注意的是,在过去的几年里,Azure 女士经历了一些重大的改进,现在包括了开发企业分析和大数据系统的所有必要工具。所以,我们决定和 Azure 女士一起建立这个系统。

我们使用无服务器 SQL 池来存储详细数据,专用 SQL 池用于数据集市,Synapse 管道被用作提取、转换和加载数据(ETL)的工具。Power BI 可以在数据导入模式和实时查询模式下连接到数据存储层,这意味着用户在进一步的数据处理中不会受到限制,例如,通过使用 DAX。

一点一点地吃蛋糕

没有人喜欢撰写冗长的技术需求。当然,每个人都想要快速的结果!

因此,在与我们的客户协商之后,我们决定不走冗长的批准和任务评审的道路,而是使用敏捷开发风格在短时间内实现项目。

有几种方法可以在短时间内完成构建 BI 系统的项目。您可以从处理所有数据源开始,并在每次迭代中添加一个新的处理阶段。例如,一个 sprint 用于初始加载到操作数据存储中,一个 sprint 用于加载到数据仓库中,并且可以分配更多的 sprint 来准备数据集市中的报告。

在我们的例子中,我们使用了数据湖架构。实际上只有两层,但是有几十个数据源。这意味着将工作分成 sprint 是合乎逻辑的,将几个源放入每个 sprint 中,并为它们执行整个开发过程——从组装到现成的数据集市。

此外,这对于用户来说非常方便,因为通常情况下,2-3 个源包含一个报告的数据。因此,每次迭代的结果为分析师提供了数据,他们可以用这些数据将一个或多个现有的报告转移到数据湖中。这允许逐渐转变到使用数据仓库,并避免由于在短时间内验证大量数据而分散他们的工作注意力!

最后,每次迭代包括:

  • 开发用于数据提取的适配器
  • 初始装载
  • 配置数据更新流程
  • 计算数据集市
  • 由用户(分析师)验证数据集市中的数据
  • 将报告从 Excel 切换到 Azure Synapse

我们总共连接了 37 个数据源系统!在这里一一列举是没有用的,因为每个公司都有自己独特的系统。只要说有 Excel 图表、关系数据库、API 外部服务等等就够了。

从错误中学习

自然,没有一个敏捷开发过程没有错误、失误和稳定性。我们选择了深度分析而不是直接结果。

很明显,将数据湖中的所有数据放入专用的 SQL 池是一件成本高昂的事情。此外,池本身在一天中所做的一切就是等待新的连接并响应偶尔的用户查询。

我们建议将 Power BI 报告转换为数据导入模式,而不是直接查询模式,以节省我们客户的资金。然后,预先准备好的数据将存储在 Power BI 数据集中,不会消耗任何存储资源,并且无论池是否可用,这些数据都是可用的。

除此之外,我们还配置了更新所有报告数据集的设置,包括数据刷新(在 Synapse 管道的帮助下)。剩下的工作就是按照计划设置专用 SQL 服务的激活和停用,以更新数据和数据集。服务成本几乎降低了四倍!

第二个错误是使用外部 SaaS 来提取公司自己车队的移动数据。通常情况下,该服务通过 JSON 中的 API 提供数据。只是这个 JSON 的形式不完全规范,并且不包含逻辑迭代数据处理所必需的父容器。在微不足道的量,这不是一个问题。但是当我们的客户要求为每次旅行加载详细的 GPS 坐标时,我们明白 Azure Pipelines 的标准工具不能用于处理格式不正确的 JSON。变通的解决方案是一个很好的旧 SQL 和 JSON 文本的批量加载。我们花了几个小时集思广益,编写了一个非常复杂的脚本,快速分析来自服务的文本响应,并将其转换为无服务器数据存储中的文件。没有人保证这将是一个无代码开发!😃

我们遇到的另一个问题是另一个外部服务。由于某种内部原因,它已经撤销了所有的授权密钥,当然,我们的 ETL 过程开始接收错误消息(HTTP 403-Forbidden ),而不是通常的数据。这没什么大不了的,但是考虑到一些 API 的不稳定性,我们遵循了常见的配置实践——每隔一分钟重复几次数据请求。重试次数设置为 30 次。

不幸的是,就在圣诞节假期之前,这些密钥被撤销了,所以在接下来的几天里,这个错误又出现了很多次。令我们非常惊讶的是,我们发现根据 MS Azure 的费率,在下一次尝试接收数据之前的超时也是要收费的。当然,应该由微软来定义哪些功能需要付费以及为什么要付费,但是从客户的角度来看(我们同意这一点),为空闲时间付费是没有意义的。我们收到了一个新的授权密钥,但紧接着,当数据请求尝试失败三次时,我们为开发团队和客户的网络管理员设置了一个通知程序。安全总比后悔好!

结论

让我们从技术实现细节回到项目目标和它的预期任务。

这个系统最明显的好处是从手工数据处理中节省了人工月甚至人工年的劳动成本。当然,对企业来说,这可能会花费一大笔钱,但主要的好处是别的东西。

从业主或上级经理提出数据分析请求到分析员提交报告之间的时间大大减少。现在,几乎可以在一个工作日内满足任何分析需求!很难低估这种加速对公司决策的好处。

当然,当数据湖中没有足够的数据来响应分析请求或准备报告时,也会有例外。幸运的是,Power BI 提供了一个机会,只需点击几下鼠标就可以将新的数据源直接连接到报告编辑器。然后,在确定其价值之后,将这个数据源连接到数据湖比传统的 BI 系统要便宜得多,也快得多。

因此,数据湖分析系统已经成为数字化的一个新的步骤。现在,分析师通过在工作中更接近自助服务的原则来履行职责,上层管理人员总是能够获得最新信息,以便快速准确地做出决策!

除非另有说明,所有图片均为作者所有。

数据湖与数据仓库

原文:https://towardsdatascience.com/data-lake-vs-data-warehouse-2e3df551b800

了解数据存储架构中的两种不同方法

flo·雷吉在 Unsplash 上的照片

数据湖和数据仓库被广泛用于存储大量数据。然而,它们不是可互换的术语。您会惊讶地发现,这两种方法是相辅相成的。下面分段让我们深入了解这两个术语。

数据湖简介

照片由亚伦·伯顿在 Unsplash 上拍摄

众所周知,数据湖是一个集中的存储库。它使你能够积累所有已知的和未成形的数据。最好的事情之一是,它可以在任何规模下做到这一点。它允许您存储非结构化的数据,并构思各种类型的分析。从可视化和仪表板到大型游行,机器学习引导你做出更好的决定。

数据湖的结构化程度较低,更像是一个先转储所有数据,然后再发现用途的湖

为什么企业需要数据湖?

成功从数据中获取商业价值的组织和公司,会积极地超越他们的同行。在各种调查中,人们注意到许多实施了数据湖的组织比熟悉的公司高出 10%(大约。)的真实收入增加。这些公司设法进行独特的分析,如来自点击流、社交媒体、日志文件和存放在数据湖中的互联网对应设备的数据。

最终,它通过保留和吸引客户、提高生产力和做出明智的决策,帮助他们认识到并抓住机会,实现业务的快速增长。

数据湖在企业中有什么价值?

在最短的时间内存储来自大量来源的大量数据的能力,以及让用户能够以各种方式联合和检查数据的能力,通常有助于更好、更快地做出决策。以下是一些实例,将使你清楚:

数据湖能够通过 CRM 平台组合所有的客户数据。社交媒体分析恰好就是如此。然后,它创建一个由购买历史和“发生”门票组成的营销平台,以便委托企业认可最有价值和最有前途的客户群、客户流失背后的原因以及将提高客户忠诚度的奖励和其他促销活动。

数据湖使你的 R&D 小队能够检查他们的论文,提炼推论并相应地分析结果。它可以包括在你的产品创造中选择合适的材料,使性能更快,基因组研究最终导致药物的改进。

在云端定位数据湖

从本质上讲,数据湖是一种示例性的工作负载,恰好部署在云上,因为云引入了实施、可靠性、可伸缩性、可用性以及一组独特的分类分析引擎。

此外,客户认为云是数据湖的优势的主要原因。这是由于更好的安全性、更快的可用性、部署、经常的功能更新、地理覆盖范围、弹性以及与现有利用率相关的成本。

数据湖的一个很好的例子是谷歌云存储或亚马逊 S3

数据仓库简介

照片由 约书亚苏

数据仓库是一个中央信息库,可以对其进行分析以做出明智的决策。通常,数据从事务系统和其他来源流入数据仓库。

数据仓库更加结构化,更像一个水箱,你首先定义用途,然后放入数据

数据仓库是如何工作的?

您可能会在一个数据仓库中发现多个数据库。每个数据库都有自己的数据,这些数据被组织成表和列。和每一列,数据的描述能够被相应地定义。另一方面,表可以组织在模式中,这就是所谓的文件夹。最后,当数据被接收时,它被简单地存储在不同的表中。

数据仓库为什么重要?

当涉及到像数据湖这样的明智决策时,数据仓库具有巨大的价值。不仅如此,它还设法整合大量来源的数据。除此之外,历史数据分析、数据质量、准确性和一致性是数据仓库附带的一些元素。此外,将分析处理从跨国数据库中分离出来最终会增强两个给定系统的性能

数据仓库的一个很好的例子是谷歌的大查询或者亚马逊的红移

数据湖和数据仓库有两种不同的方法——下面是方法

奥利弗·鲁斯在 Unsplash 上的照片

根据不同的需求,组织需要有一个数据仓库和数据湖,因为它们提供了不同的需求和用例。

数据仓库与数据湖截然不同。数据仓库是为了分析来自事务系统和企业应用程序线的关系数据而优化的数据库。

另一方面,数据湖有不同的用途,因为它存储来自一系列企业应用程序的关系数据。不同之处在于,它还存储来自移动应用程序、社交媒体和物联网设备的数据。也就是说,它存储了所有给定的数据,没有任何精心的设计。

此外,数据仓库主要用于批量报告、可视化和结构化数据的 BI 分析。而数据湖可以潜在地用于解决机器学习、数据发现、预测分析和用大量数据进行剖析的问题

拥有数据仓库的组织碰巧看到了数据湖的好处。为了最大化他们的利益,他们正在发展他们的仓库,使其也包括数据湖。它不仅保证了多样化的查询能力,还保证了发现新信息模型的高级能力

数据湖和数据仓库是如何协同工作的?

由 Pawan Kawan 在 Unsplash 上拍摄的照片

这些方法是相辅相成的。数据仓库通过显著增加的并发性来管理结构化和打包数据的质量、一致性和性能。另一方面,data lake 确保专注于原始原始数据承诺和永久存储。它以合理的成本做到了这一点,同时提供了新的分析灵活性。

这两种不同但互补的解决方案被推荐为任何

如果你对更多细节感兴趣,请查看我的 youtube 视频

数据湖 vs 数据仓库 Anuj Syal

最初发表于T5【https://anujsyal.com】

数据湖与数据仓库

原文:https://towardsdatascience.com/data-lakes-vs-data-warehouses-47444228604c

数据湖和仓库有什么区别?

弗兰克·麦肯纳在 Unsplash 上拍摄的照片

介绍

当涉及到永久存储数据时,数据湖和数据仓库可能是使用最广泛的两种存储类型。在本文中,我们将探讨这两者,展示它们的主要区别,并讨论它们在组织环境中的用法。

简而言之,数据仓库和数据湖

一个数据仓库被用作大量结构化数据的中央存储,这些数据可能来自不同的来源。这种商店对公司非常重要,因为它们可以用来提供整个组织的洞察力,以支持决策。

另一方面,数据湖是一种灵活的存储,用于存储非结构化、半结构化或结构化的原始数据。存储的数据未经处理,通常在检索时应用该结构。但是请注意,数据湖不是数据仓库的替代品。

主要差异

在选择如何在组织中存储数据以及是否需要将来自特定来源的数据存储到数据湖或数据仓库之前,考虑所有相关因素非常重要。通常,这些考虑归结为本节中讨论的 4 个主题。

数据类型和处理

正如我们已经讨论过的,数据湖可以用来存储任何形式的数据,包括非结构化和半结构化数据,而数据仓库只能存储结构化数据。

由于数据仓库只能处理结构化数据,这意味着它们还需要提取-转换-加载(ETL)过程,在将原始数据存储到仓库之前,将它们转换为目标结构(写时模式)。换句话说,数据仓库存储经过预处理的历史数据,以适应关系模式。

数据湖更加灵活,因为它们能够存储原始数据,包括提取数据时要应用的元数据或模式。这是数据仓库和数据湖之间最根本的区别。

目标用户群

不同的用户可能需要访问不同的存储类型。通常,业务或数据分析师需要提取用于报告目的的见解,因此数据仓库更适合他们。

另一方面,数据科学家可能需要访问非结构化数据来检测模式或构建深度学习模型,这意味着数据湖是一个完美的选择。

生态系统

在选择数据仓库或湖泊时,另一个需要考虑的重要因素是您组织的现有技术生态系统。由于开源软件 Hadoop 的出现,数据湖变得非常流行。

这意味着,如果您的组织不喜欢开源软件,那么将数据转移到数据湖将是一个挑战。

预算

数据管理计划总是考虑我们打算使用或构建的技术和架构的成本。数据湖的成本要低得多,因为数据是以原始格式存储的,而数据仓库则需要处理数据并准备好供分析,因此会占用更多的存储空间。

选择哪一个

数据仓库和湖泊都被组织用作集中式数据存储,使不同的用户和组织单位能够访问和使用数据来提取见解并执行任何类型的分析。通常一个组织需要一个数据湖和一个数据仓库来支持所有需要的用例和最终用户。

数据湖能够容纳任何形式的所有数据;从结构化到非结构化。此外,在存储数据之前,它不需要任何类型的预处理,因为一旦将数据存储在数据湖中,就可能发生这种情况。数据湖主要对数据科学家和工程师有用,他们需要访问甚至是非结构化的数据,这将帮助他们建立人工智能或机器学习模型。与数据仓库相比,数据湖也更具成本效益,因为它们不要求数据具有任何特定的格式,比如模式。

现在,数据仓库只能存储结构化数据,这些数据可以由特定的组织单位进行分析,以揭示业务洞察力。因此,ETL 过程通常需要围绕数据仓库来构建。ETL 功能使数据能够以预期的格式存储、提取或转换,以便用户可以对其执行特定的任务。因此,数据仓库对于业务或运营分析师来说是非常强大的,他们需要使用模式来访问关系数据,这将使他们能够创建报告并通过发现洞察力来支持决策制定。

最后一句话

在本文中,我们讨论了数据湖和数据仓库之间的主要区别。请注意,这不是苹果之间的比较。两者都支持不同的用例,服务于不同的用户,通常组织需要两者来有效地运行。

数据湖是更加灵活的无模式存储,能够存储非结构化、半结构化或结构化数据。它们通常对更多的技术用户有用,例如数据科学家或工程师。另一方面,数据仓库只能接受关系数据,而关系数据反过来对需要访问现成数据以供分析的非技术人员更有用。

成为会员 阅读介质上的每一个故事。你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。

https://gmyrianthous.medium.com/membership

你可能也会喜欢

https://pub.towardsai.net/object-storage-521d5454d2d https://pub.towardsai.net/data-versioning-for-efficient-workflows-with-mlflow-and-lakefs-892df1f8e7d8 </16-must-know-bash-commands-for-data-scientists-d8263e990e0e>

机器学习中的数据泄漏:如何检测和最小化风险

原文:https://towardsdatascience.com/data-leakage-in-machine-learning-how-it-can-be-detected-and-minimize-the-risk-8ef4e3a97562

作者图片

简介

我们可以将数据泄漏定义为:

“当数据集包含相关数据,但在使用模型进行预测时无法获得类似数据时,就会发生数据泄漏(或泄露)。这导致了在训练数据集上的巨大成功(甚至可能是验证准确性),但是在生产中缺乏性能。”

数据泄露,或仅仅是泄露,是机器学习过程中使用的一个术语,用来描述用于教授机器学习算法的数据包含关于你正在估计的主题的意外额外信息的情况。当在学习过程中引入关于目标标签或号码的信息,而在实际使用过程中无法合法访问这些信息时,就会发生泄漏。数据泄漏最基本的例子是数据集的真实标签作为一个特征包含在模型中。如果这个物体被归类为苹果,算法将学习预测它是苹果。

为什么会发生数据泄露?

数据泄漏可能有多种原因,通常以微妙和难以检测的方式发生。当数据泄漏发生时,它通常会在模型构建阶段导致过于乐观的结果,随后是在预测模型实施并对新数据进行测试后令人不快的糟糕结果。换句话说,泄漏可能会导致您的系统训练一个次优模型,该模型在实践中的表现比在无泄漏环境中生成的模型差得多。泄漏会产生各种各样的实际影响,从造成可怕的财务和技术支出的财务费用到损害消费者对系统可靠性的看法或影响雇主产品的系统故障。因此,数据泄露是机器学习和统计学中最重要和最普遍的挑战之一,也是深度学习实践者必须注意的一个问题。

“现在,我们来了解一下什么是数据泄露,为什么它很重要,如何识别它,以及如何在您的实际应用中防止它?”

在数据保护领域,术语“数据泄露”也与未经授权将信息移出受保护设施(如数据中心)有关。然而,考虑到将有关预测的细节与再培训和模型开发阶段完全分开的重要性,这种保护方法实际上相对适合我们的机器教育环境。

更复杂版本中的数据泄漏

让我们来看看一些更微妙的数据泄漏问题。

第一个例子:

一个典型的例子是当将来的信息被合并到训练数据中时,这些信息在实际使用中是不合法的。假设您在一个零售网站上工作,需要创建一个分类器来预测用户是会留下来阅读另一个页面还是会离开。如果分类器预测他们将离开,网站可能会显示一些鼓励他们留下来购物的内容。用户的总会话长度或他们访问网站期间看到的页面总数是包含泄漏信息的特征的例子。例如,在访问日志数据的后处理阶段,这个总数经常作为新列添加。该功能包含用户未来访问的信息,例如用户还将进行多少次旅行。在现实部署中,这是不可能确定的。“总会话长度”功能可能会被“会话中页面访问”功能所取代,该功能只知道会话中到目前为止已经访问了多少页面,而不知道还剩下多少页面。

第二个例子:

泄露的第二个例子可能是试图预测访问银行网站的客户是否会开户。如果用户的记录包括帐号字段,对于仍在浏览网站的用户,它可能是空白的,但在用户创建帐户后,它将被填充。显然,在这种情况下,用户帐户字段不是一个可行的功能,因为当用户仍在浏览站点时,它可能不可用。

第三个例子:

如果您正在构建一个诊断测试来预测特定的医疗状况,另一个在过去泄漏未来信息的例子是,如果您正在生成一个诊断测试来预测特定的医疗状况。现有患者数据集中的二进制变量可能指示患者是否为该疾病做过手术。显然,这样的特征将是医学状况的极好预测。预测数据可以通过多种不同的方式进入该功能集。有可能缺失诊断代码的特定组合是医学状况的高度症状。然而,由于在检查病人的情况时,这些信息是不可用的,因此利用这些信息是非法的。最后,同一个病人的另一个例子可能是病人 ID 表单。可以基于所采用的诊断路径来分配 ID。换句话说,如果 ID 是去看专家的结果,而最初的医生判断可能是医学问题,那么 ID 可能是不同的。

最后一个例子说明了这样一个事实,即数据泄漏可以以多种方式在训练集中表现出来,并且许多泄漏问题经常同时出现。例如,修复一个漏洞有时可能会揭示另一个漏洞的存在。

其他数据泄露的例子

以下是更多数据泄露的例子,以供参考。泄漏可分为两类训练数据中的泄漏 ,当测试或未来数据与训练数据混合时发生,以及 特征中的泄漏, 当关于真实标签的非常有信息的东西作为特征被包括时发生。

  • 训练数据中的数据泄露:

对整个数据集执行某种预处理是数据泄漏的最常见原因之一,其结果会影响训练期间看到的内容。这可能包括计算归一化和重缩放的参数、查找最小和最大特征值以检测和移除异常值、估计训练集中的缺失值,或者使用变量在整个数据集中的分布来执行要素选择。在处理时间序列数据时,当未来事件的记录被错误地用于计算特定预测的特征时,另一个重要的谨慎要求就出现了。我们看到的会话长度示例只是一个示例,但是如果存在数据收集错误或缺少值指示符,可能会产生更微妙的后果。如果某个要素要求在特定时间段内至少收集一条记录,则错误的存在可能会提供有关未来的信息。换句话说,不再预测更多的观测值。

  • 功能泄漏:

特征泄漏是指当我们删除一个变量,如诊断 ID 或患者记录,但我们忘记删除包含相同或可比信息的其他变量,称为代理变量。一个很好的例子是患者 ID,它包含了由于入院程序而导致的患者病情严重程度的提示。在某些情况下,预测变量记录被故意随机化,或者共享用户个人数据(包括他们的姓名、位置等)的特定部分被抽象出来。根据预测任务,解除这种隐私保护可能会暴露在实际使用中无法合法访问的用户或其他敏感数据。

最后,上述任何场景都可以在第三方数据集中表示,这些数据集也作为新特征的来源添加到训练集中。因此,要时刻注意这些外部数据的特征,以及它们的解释和来源。

如何检测数据泄露?

在这一节中,我定义了三个步骤来检测和避免应用程序中的数据泄漏。

  1. 在开始构建模型之前,做好以下准备工作:

在开始构建模型之前,探索性数据分析可能会在开发模型之前揭示数据中的意外情况。例如,寻找与期望的标签或价值高度相关的品质。在医疗诊断示例中,指示患者经历了针对疾病的特定外科治疗的二元特征可以是这样的示例。这可能与某种特定的疾病密切相关。

2。 在你建立了你的模型之后:

建立模型后,在拟合的模型中搜索不寻常的特征行为,例如与变量相关的异常高的特征权重或极大的信息博弈。接下来,搜索一款车型出乎意料的整体表现。如果您的评估模型结果明显高于相同或可比的情况和数据集,请注意与模型最相关的事件或特征。

3。 训练好的模型在现实世界中的有限应用:

训练样本的有限真实世界安装,以确定由模型的学习和成长结果给出的动作电位和真实结果之间是否存在显著差异,这是另一种可靠但可能昂贵的泄漏检查。

这种对模型有效地推广到新数据的检查是有用的,但它可能无法提供任何关于是否发生泄漏的快速洞察,或者任何性能降低是否是由于其他因素(如经典的过拟合)造成的。

如何最大限度减少数据泄露?

您可以使用一些最佳实践来帮助限制任何应用程序中的数据泄漏风险。

一个重要的指导方针是确保每个交叉验证扫描的任何数据预处理都是单独进行的。换句话说,您为标准化或均衡化要素计算的任何统计数据或变量都应基于交叉验证分割中提供的数据,而不是整个数据集。确保在匹配的保留测试折叠上应用相同的参数。

如果您正在处理时间序列数据,请注意与分析特定数据事件(如用户点击网页)相关的时间戳,并确保用于计算此实例特征的任何数据不包含时间戳晚于截止值的记录。这将确保未来的数据不会包含在现有的要素计算或训练数据中。

如果您已经有了足够的数据,请考虑在使用新数据集之前创建一个单独的测试集,最后才评估您的最终概念和这个测试数据集。其目就像现实世界中的部署,因为您希望确保您的训练模型能够有效地推广到新数据。如果性能没有大幅下降,那就太棒了。如果有,泄漏,以及典型的嫌疑,如经典的过度拟合,可能是一个促成的原因。

最后,我们可以得出结论,以下几点有助于打击数据泄漏。

通过在感兴趣的事件发生之前删除所有数据,并专注于你正在了解的观察或事实

在输入数据中加入随机噪声,以消除可能泄漏变量的影响。

通过移除泄漏变量和评估简单的基于规则的模型,像检查这些变量是否泄漏,如果是,移除它们。如果你对一个有漏洞的变量有任何疑问,我们可以删除它。

通过使用 pipelines 架构,很容易为数据准备执行不同的步骤序列,这些步骤通常在交叉验证折叠中执行。为此,不同的编程语言提供了不同的包或库,比如 R 中的 caret 包和 Python 中的 scikit-learn。

通过使用维持数据集,我们可以在使用验证数据集之前对其进行最终的稳定性检查。

摘要

我们在这篇文章中发现了以下内容:

什么是机器学习中的数据泄露?

数据泄露的不同真实例子

如何检测数据泄露?

如何最大限度减少数据泄露?

数据传承被破坏——以下是 5 种修复方法

原文:https://towardsdatascience.com/data-lineage-is-broken-here-are-5-ways-to-fix-it-3f3e16fb21b

数据谱系应该不像藏宝图,而更像谷歌地图

图片由 Mick Haupt 在 Unsplash 上提供。

数据血统并不新鲜,但是自动化最终使它变得可访问和可伸缩——在一定程度上。

在过去(早在 2010 年代中期),血统是通过大量手工工作实现的。这包括识别数据资产,跟踪它们到它们的摄取源,记录这些源,绘制数据通过各种管道和转换阶段时的路径,以及查明数据在仪表板和报告中的位置。这种记录血统的传统方法非常耗时,而且几乎无法维护。

今天,自动化和 ML 使得供应商开始大规模提供数据沿袭解决方案成为可能。数据沿袭绝对应该是现代数据堆栈的一部分——但是如果沿袭做得不好,这些新版本可能只不过是养眼而已。

所以是时候深入探索了。让我们来探索当前围绕数据血统的对话是如何被打破的,以及寻求有意义的商业价值的公司可以如何修复它。

什么是数据血统?为什么这很重要?

首先,快速复习一下。数据沿袭是一种元数据,用于跟踪数据管道中上游和下游依赖关系之间的关系。沿袭是关于映射的:你的数据来自哪里,当它在你的管道中移动时如何改变,以及它在哪里出现在你的终端消费者面前。

随着数据栈变得越来越复杂,映射沿袭变得越来越具有挑战性。但是如果处理得当,数据血统是非常有用的。沿袭帮助数据团队:

  • 理解特定资产的变更将如何影响下游的依赖关系,这样他们就不必盲目地工作,并冒着给未知的涉众带来不受欢迎的惊喜的风险。
  • 当数据问题发生时,通过快速查看可能导致报告中断的上游错误,更快地解决问题的根本原因。
  • 向依赖下游报告和表格的消费者传达损坏数据的影响—当数据可能不准确时,主动让他们了解情况,并在任何问题得到解决时通知他们。

不幸的是,一些新的数据谱系方法更关注吸引人的图表,而不是编制丰富、有用的地图。与通过数据可观察性实现的端到端沿袭不同,这些表层方法不提供交付沿袭所能提供的全部价值所需的强大功能和全面的现场级覆盖。

当您的数据谱系类似于一盘意大利面条时,您就有麻烦了。图片由 Unsplash 上的 Immo Wegmann 提供。

让我们探索血统可能被打破的信号,以及数据团队可以找到更好的方法的方式。

  1. 通过传承关注质量而非数量

现代公司渴望成为数据驱动型企业,但收集更多数据并不总是对企业最有利的。与分析无关或对分析无用的数据可能会变成噪音。积累最大的数据宝库不会自动转化为更多的价值,但它确实保证了更高的存储和维护成本。

这就是大数据变小的原因。 Gartner 预测,70%的组织将在未来几年内将他们的重点从大数据转移到小而广的数据,采用一种减少依赖性的方法,同时促进更强大的分析和人工智能。

血统应该在这些决定中发挥关键作用。沿袭解决方案应该包括相关的信息,比如哪些资产正在被使用,由谁使用,而不是简单地使用自动化来捕获和生成数据的表面图形。有了这个更全面的数据使用情况,团队可以开始更好地了解什么数据对他们的组织最有价值。不再使用的过时表或资产可以弃用,以避免潜在的问题和下游的混乱,并帮助企业关注数据质量而不是数量。

  1. 通过字段级数据沿袭揭示什么是重要的

彼得·扬达最近发表了一篇文章,讲述了数据团队如何需要像对待地图一样对待血统——具体来说,像对待谷歌地图一样。他认为,lineage 应该能够方便查询来找到你要找的东西,而不是依赖于难以浏览的复杂视觉效果。例如,当你需要一家杂货店时,你应该能够找到一家杂货店,而不会被你实际上不关心的周围的咖啡店和加油站所扰乱。“在今天的工具中,数据血统的潜力还没有被开发,”Petr 写道。“除了几个过滤器,血统体验不是为了找东西而设计的;它们被设计用来展示事物。这是一个很大的区别。”

我们完全同意。数据团队不需要看到关于他们数据的一切,他们需要能够找到解决问题或回答问题的关键。

这就是为什么字段级沿袭是必不可少的。虽然表级沿袭已经成为规范好几年了,但是当数据工程师想要确切地了解他们的管道为什么或如何中断时,他们需要更多的粒度。字段级沿袭帮助团队关注特定代码、操作和数据变更对下游字段和报告的影响。

当数据中断时,字段级沿袭可以显示受影响的最关键和最广泛使用的下游报告。同样的传统通过允许数据团队快速追溯到数据问题的根本原因,缩短了解决问题的时间。

  1. 组织数据谱系以便更清晰地解释

数据谱系可以以另一种方式追随谷歌地图的脚步:通过使谱系中使用的结构和符号的解释变得简单明了。

正如谷歌地图使用一致的图标和颜色来指示企业类型(如加油站和杂货店),lineage 应该为其描述的数据应用清晰的命名约定和颜色,直到构成我们数据管道的不同工具所使用的徽标。

随着数据系统变得越来越复杂,为清晰的解释而组织谱系将帮助团队尽快从他们的谱系中获得最大的价值。

  1. 在数据沿袭中包含正确的上下文

虽然为了数据而积累更多的数据可能无助于满足您的业务需求,但是收集和组织更多的元数据——具有正确的业务上下文——可能是一个好主意。包含丰富的上下文元数据的数据沿袭非常有用,因为它可以帮助团队更快地排除故障,并理解潜在的模式更改将如何影响下游报告和利益相关者。

利用谱系本身中包含的给定数据资产的正确元数据,您可以获得做出明智决策所需的答案:

  • 谁拥有该数据资产?
  • 该资产位于何处?
  • 它包含哪些数据?
  • 对利益相关者是否相关和重要?
  • 当我对该资产进行更改时,谁在依赖它?

当这种关于数据资产在您的企业中如何使用的上下文信息浮出水面,并且可以通过强大的数据谱系进行搜索时,事件管理就变得更加容易了。您可以更快地解决数据宕机问题,并将受影响数据资产的状态传达给组织中的相关利益相关方。

  1. 扩展数据谱系以满足业务需求

最终,数据血统必须丰富、有用、可伸缩,才能有价值。否则,它只是管理层演示中看起来不错的视觉糖果,但实际上并不能帮助团队防止数据事件或在数据事件发生时更快地解决它们。

我们前面提到过,由于自动化,沿袭已经成为数据堆栈中热门的新层。自动化确实解决了这个问题的一半:它可以帮助沿袭扩展以适应新的数据源、新的管道和更复杂的转换。

另一半呢?通过将关于所有数据资产和管道的元数据集成到一个内聚的视图中,使沿袭变得有用。

再次考虑地图。如果地图只显示了现实世界的一部分,那它就没有用。没有全面的覆盖,你就不能依靠一张地图找到你需要的一切,或者从 A 点导航到 b 点,数据血统也是如此。

沿袭必须通过自动化进行扩展,而不减少覆盖面。每一个入口、每一个管道、堆栈的每一层以及每一份报告都必须考虑在内,一直到现场级别,同时要丰富和可发现,以便团队可以准确地找到他们正在寻找的东西,有一个清晰的组织结构,使信息易于解释,并有正确的上下文元数据来帮助团队快速做出决策。

就像我们说的:血统具有挑战性。但是如果做对了,它也是非常强大的。

底线:如果数据血统没有用,那也没关系

当事件发生时,或者如果您只是想更好地了解数据中的关系,字段级沿袭可以使您轻松地发现数据中真正重要的内容。图片由作者提供。

尽管现在数据谱系似乎无处不在,但请记住,我们还处于自动化谱系的早期。解决方案将会继续改进和完善,只要你知道高质量的血统应该是什么样子,看到行业的发展方向将会是令人兴奋的。

我们的希望?沿袭将不再是吸引人的图形,而是更强大的功能,就像下一代谷歌地图一样。

你怎么看?伸手到 巴尔摩西 格伦威利斯 蒙特卡洛 队。我们洗耳恭听。

数据素养——你应该知道的 10 件事

原文:https://towardsdatascience.com/data-literacy-10-things-you-should-know-f59c3b744d03

什么是数据素养?要成为数据素养的人,你应该知道些什么?我们将要回答这两个可能会困扰你一段时间的问题。

作者在 Canva 上创建的图片

你喜欢读书,对吗?如果你没有,你就不会读这篇文章。好吧,你是对的:看了这篇文章不代表你爱读书。但是阅读它肯定意味着你至少是部分识字的。

阅读的“问题”是,一旦你学会了阅读,你就无法忘记它。不仅如此,一旦你的目光与字母相遇,你就不会心甘情愿地不去阅读。你觉得你可以吗?让我们做一个小实验,好吗?

看看下面的图片,还有…不要看上面说的!啊,太晚了;你已经做了。

作者在 Canva 上创建的图像

我很抱歉。你实验失败只是证明了当你的眼睛看到字母时,你的大脑不能决定关闭你的阅读技能。好了,你读了一些东西,然后才想到不去读它。

阅读只是读写能力的一部分,第二部分是写作。

数据素养也是这样吗?

什么是数据素养?

正如维基百科所说,数据素养是阅读、理解、创建和交流数据信息的能力。

与一般的读写能力一样,数据读写能力也包括读写能力。在这种情况下,它读取数据并创建数据。这意味着你应该能够谈论数据,使用分析程序并解释这些分析的结果。

什么造就了数据素养?

您可能听到周围的人都在提到它,不管是知道什么是数据素养的人还是不知道的人。为了确保您属于第一个阵营,我将讨论包含数据素养的十件事。

关于数据素养,您需要了解的内容可以分为三个部分:

  • 存储数据
  • 处理数据
  • 呈现数据

虽然我将谈到的 10 点在多大程度上需要取决于你的工作,但你至少应该有一些关于它们的基本知识,以达到数据素养。

存储数据

这里我不是在谈论存储数据的工具的技术细节。这更多的是概念层面,是成为数据素养的必要的第一步。

1.数据是不完美的

在深入了解数据的细节之前,您应该知道的第一件事(并且永远记住!)就是数据不完美。

当我说不完美时,我想到了两件事。首先,没有完美的方法来存储数据。公司正在成长,改变他们的经营方式,并根据他们可用的技术创新而发展。这不是一条单行道,因为业务变化也会推动技术变化。请记住,数据会不断变化,而且存储数据必须满足许多不同用户的需求,因此您不能期望数据会完全符合您的需求。

以关系数据库为例,它是最常见的数据存储方式之一。它们的性质迫使数据尽可能分段,这导致数据存储在多个表中。也许将您每天使用的几个列简单地存储在一个表中对您来说是理想的。然而,数据不只是为你准备的,你需要克服这种不便。怎么会?这就是我们稍后要讨论的。

数据不完善的第二个方面是指数据本身的不完善。数据总是毫无例外地充满错误和不一致。如果你没有注意到他们,并不意味着他们不在那里。这是你应该永远记住的事情。所以如果你在寻找能给你 100%正确答案的数据,你永远不会得到。不要做那种问员工他们提供给你的数据是否 100%准确的老板。不是,也永远不会是。

数据的意义在于给你你能得到的最合理的正确答案。你是怎么做到的?这是我们的第二点。

2.了解数据质量的目的

从数据中获取可靠的信息取决于数据质量。虽然数据并不完美,但您应该始终努力使其尽可能无误。

您还应该知道数据质量(或缺乏数据质量)如何反映在数据上。这里可以说说数据不一致的问题。例如,客户的地址可能来自不同的来源,您可能最终得到的数据显示某些客户的一个地址,而另一个表显示不同的地址。

这也可能意味着您的数据不完整。你可以有客户的地址,但是没有他们的城市。

数据准确性不是指有没有数据,而是你拥有的数据实际上是否正确。您是否有客户的正确地址,或者这些地址中的一些已经不再有效?

数据也必须精确。你的唱片销量是四舍五入,还是只存储日期而不存储时间?你可能会错过很多。

最后,您的数据可能只是丢失了,或者可能是未知的。好吧,假设你没有你客户的联系方式或者没有记录他们以前的购买。在这种情况下,你不可能尝试向他们提供特别优惠,故意留住他们,或者向他们提供任何有用的信息。

3.数据类型

懂数据的人都知道,存储的数据有很多种类型,而这些数据往往需要特定类型的数据。

当选择了正确的数据类型时,它使数据适合使用。您应该知道有数值,通常一种数值数据类型并不总是合适的。例如,如果你在卖书,你可以将售出的书的数量存储为一个整数。但是如果你卖的是原材料,也许一个十进制的数字会更好,这样你就可以记录售出材料的重量。知道您可以在多种类型的数字数据和精度级别(例如,您想要查看多少个小数位)之间进行选择对于数据素养至关重要。

有些日期只能作为日期存储,因为除此之外你不需要任何其他信息。如果你正在记录你的应用程序的登录时间呢?你可能想看看时间。但是有多精确呢?应该只有几个小时,还是几小时几分钟,甚至几秒或几毫秒?

文本数据也存储在数据库中。根据您想要的文本,您还必须知道您可以决定您存储的字符类型或您想要存储的字符数量。

虽然详细了解这些数据类型对您的工作来说可能是必要的,也可能不是必要的,但至少要意识到,无论数据的格式如何,它们都不能简单地放在一起。

处理数据

作者在 Canva 上创建的图像

数据素养的下一步是了解如何处理数据。不仅在理论上而且还要应用某些技能去做。

处理数据意味着创建、操作和分析数据。三种技能类型使你能够做到这一点。

4.技术

这些技能包括选择合适的技术来分析数据。但是首先,你必须知道你想进行什么类型的分析。是描述性分析还是诊断性分析?甚至可能是预测性的或规范性的?

描述性分析查看历史数据并描述发生了什么。诊断分析做同样的事情,但是它试图给出一个问题的答案,“发生了什么?”。

正如你所想的,预测性和规范性分析展望未来。预测分析使用历史数据和机器学习来回答未来会发生什么。预测分析的下一个层次是规范分析。你用预测分析知道会发生什么。规定性分析试图回答“你应该怎么做?”避免或受益于将要发生的事情。

为了执行数据分析,您应该使用正确的统计技术。它们是:

  • 描述性统计分析
  • 推断统计分析
  • 预测统计分析
  • 规定性统计分析
  • 探索性数据分析
  • 偶然分析
  • 机械分析

5.选择和使用合适的工具

你不太可能只用一支笔和一张纸来做分析。不,你必须选择最合适的工具来实现你想要的。为了做出正确的决定,你必须知道哪些工具适合什么。当然,你应该知道如何使用它们。

你应该只使用一种工具还是结合几种?有时候使用工具并不需要编码知识,但仍然需要了解工具的可能性以及使用它们的经验。这样的工具有 Excel 或 GoogleSheets、Power BI、Tableau 和其他 BI 工具。

但是通常情况下,他们需要了解至少一门编程语言。一些最受欢迎的是:

  • 结构化查询语言
  • 计算机编程语言
  • 稀有

6.商业技能

虽然技术和工具知识是必不可少的,但这些不是独立的技能。它们需要与商业知识相结合。否则,你可能不明白你要解决的是什么业务问题。而如果你不理解问题,你只会偶然提供正确答案。

业务知识包括了解你的公司及其产品,知道不同部门是做什么的,业务流程是什么样子的,每个部门和公司都面临哪些挑战。这也意味着你需要了解公司所处的行业本身,以及与竞争对手相比,公司所处的位置。

例如,如果你想提高销售额,你需要知道市场是什么,竞争对手在做什么,你可以做得更好或不同,你的客户是谁,什么可以吸引他们到你的业务。你看,数据本身并不存在,就其本身而言,它是一种商业工具,应该如此使用。

呈现数据

虽然演示不代表一切,但它肯定是有意义的。数据很少以原始形式呈现。那有什么用?我提到过,在商业中,数据只是一种工具。对于一个可用的工具(意思是:基于它做出商业决策),数据及其洞察力的呈现方式应该是视觉友好的。

7.视觉技能

视觉技能包括创建和阅读以可理解的方式呈现的数据。

如果你是一个执行分析的人,你应该对如何可视化地显示数据有一定的感觉,以便那些阅读它的人尽可能容易地理解它。是的,这包括有轻微的空间感和色彩感。当你以漂亮的小表格、亮点和图表的形式展示你的见解时,这将非常有用。

另一方面,以这种方式呈现的数据对那些看不懂的人来说没有任何意义。这就是数据素养再次发挥作用的地方。如果你甚至不知道图表、趋势线、均值、平均值、增量、分布等是什么,也不知道它如何转化为业务,那么拥有一个包含图表、趋势线、均值、平均值、增量、分布等的仪表板又有什么意义呢?

8.社交技巧

社交技能归结为意识到其他人和你有不同的经历,不同的知识,不同的专业水平和类型。

这可以产生双重效果。第一,你的思考和理解方式不是唯一(正确)的。第二,知道是什么让别人成功可以让你做得更好。

这与数据素养有什么联系?比你想象的还要多!如果你是一名数据科学家,你的社交技能应该会让你适应力强。虽然意识到您不能向您的数据科学同事展示您的发现,但销售和管理委员会的人显然也是如此;相信我,许多人在实践中对此缺乏理解。

它也反过来了。也许你没那么懂技术,但是数据素养和社交技能的水平会让你理解那些与数据打交道的人是如何思考的。如果你这样做了,你对他们的要求会更加精确和直接;你可以理解他们的建议和顾虑。反过来,它会让你们更有效率地一起工作。当你要求一样东西,得到不同的东西,然后试图解释你的意思是别的东西,等等,所有那些没完没了的电子邮件都将一去不复返。

9.没有一个真正的答案

呈现的数据可以用几种方式来解释。对它的解释可能取决于数据本身。例如,如果您正在分析销售额,并且只有过去两年的数据,您可以得出一个结论。如果你有 5 年的销售历史,你会得出一些不同的结论,甚至完全相反的结论。

即使你有最详细的数据,也可能有不同的解释。例如,如果你的收入下降了 20%,而你从事的是酒店业,这可能会被视为一场灾难。如果你知道那一年有一个新冠肺炎疫情,创纪录的油价水平,该行业的平均收入下降了 70%,你的五个直接竞争对手中的三个关闭了业务,并且你没有解雇任何员工,收入下降 20%可以被视为成功。

10.批判性思维

随着所有可用的技术、数据质量的提高、数据量的庞大以及分析数据的方式,人们很容易忘记我们从哪里开始:数据是不完美的!

虽然批判性思维应该涉及数据素养的所有方面,但在基于数据做出决策时尤其重要。有一种倾向是支持数据驱动的决策,这可能导致决策时只依赖数据。虽然根据直觉做决定是偶然的,但只根据数据做决定而忽视理性和批判性思维是一种由数据驱动的灾难。如果你根本没有数据,你可能会过得更好。

在这种情况下,数据素养与一般素养是一样的。对你所读内容的解释,你从中学到什么,以及它如何改变你的所作所为都取决于你。根据数据做决定,不加思考,就像读了陀思妥耶夫斯基的《罪与罚》,认为你最好买一把斧子,然后…嗯,你知道这是怎么结束的!

结论

从这 10 个谈话要点中,你看到了数据素养与一般素养没有太大区别。它也包括读和写,但在数据方面。

数据素养包括对数据存储方式的一般理解。一旦你知道了这一点,你就应该建立处理数据的技术和其他技能。除此之外,您需要知道如何表示和读取数据。

你不需要专家级的知识。你需要它的程度取决于你的兴趣和工作细节。然而,如果你想称自己为数据专家,至少对这 10 点有一个基本的理解是至关重要的。

SQL、Python 和 R 中的数据操作——比较

原文:https://towardsdatascience.com/data-manipulation-in-sql-python-and-r-a-comparison-db63f72fa020

对最常见的 SQL 语句及其用 pandas (Python)和 dplyr (R)编写的对应物的完整而友好的概述

克里斯托夫·高尔在 Unsplash 上拍摄的照片

目录

  1. 简介
  2. 创建表格
  3. 插入
    3.1 插入单个观测值
    3.2 插入多个观测值
  4. 选择
    4.1 选择所有行和列
    4.2 选择有限数量的行
    4.3 选择特定列
    4.4 选择不同的
  5. WHERE 条件(过滤)
    5.1 一个过滤条件
    5.2 多个过滤条件
  6. ORDER BY
    6.1ORDER BY one column
    6.2指定升序与降序
    6.3ORDER BY multiple column
  7. 聚合函数
    7.1 计数
    7.2 AVG、最小值、最大值、…
    7.3 聚合函数和 WHERE 条件
    7.4 加成:描述和总结
  8. 分组依据
  9. 更新/更改表
    9.1 修改现有列的值
    9.2 添加新列
    9.3 删除列
  10. 加入
    10.1 内加入
    10.2 左加入
    10.3 右加入
    10.4 全加入
  11. 结论
  12. 参考文献

1.介绍

这篇文章的目的是分享用于数据操作的最常用的 SQL 命令,以及它们在 Python 和 R 语言中的对应部分。

通过提供实例,我们还想强调两种不同语言之间在逻辑和句法上的相似之处。

对于 SQL 语句,我们使用PostgreSQL,一个流行的开源关系数据库管理系统。对于 Python,我们使用pandas库,而对于 R,我们利用dplyr包。

为什么pandas:

  1. 事实上的管理 Python 中表格数据结构的标准。
  2. 一整套现成的数据操作方法。
  3. 快速高效的DataFrame 对象。
  4. 出色的数据表现。

为什么选择dplyr:

  1. 更干净、更易读的代码:借助管道操作符%>%的函数链接允许更容易地读写 R 代码,并提供语义救济。
  2. 简单高效的语法。
  3. 速度:比 base R 或 plyr 快。

这篇文章是由 SQL commands⁴在分段中组织的,暗示 SQL 是逻辑入口点。然而,根据对每种语言的熟悉程度,也可以很容易地从其他角度阅读它。

2.创建表格

我们可以用CREATE TABLE指令创建一个 SQL 表:

CREATE TABLE IF NOT EXISTS customer_table (
 id SERIAL PRIMARY KEY,
 age NUMERIC NOT NULL,
 gender VARCHAR NOT NULL
);

SQL 表的pandas等价物是pandas.DataFrame,一个可以存储二维表格数据的对象。它可以按如下方式创建:

# the pandas library is imported first
import pandas as pdcolumns = {'id':int(),
           'age':int(),
           'gender':str()}customer_table = pd.DataFrame(columns, index=[])

r 也提供了一个数据帧,它可以通过基本的data.frame() ⁵函数创建:

# the dplyr package is imported first
library(dplyr)customer_table <- data.frame(id=integer(),
                             age=integer(),
                             gender=character())

3.插入

3.1 插入单个观察值

一旦我们创建了数据结构,无论是表还是数据框:

  • 我们可以通过INSERT INTO ⁴语句向 SQL 表中添加行。
  • 我们可以用pandas.DataFrame.append() ⁶方法向pandas.DataFrame添加行。
  • 我们可以使用add_row() ⁷函数向 r 数据帧添加行。

SQL 语句:

INSERT INTO customer_table VALUES
  (1, 27, 'Female');

Python:

customer_table = customer_table.append(
   {'id': 1, 'age': 27, 'gender': 'Female'}, 
   ignore_index=True)

r:

customer_table <- 
  customer_table %>% add_row(id=1, age=27, gender='Female')

注意:当我们创建 pandas 数据帧时,我们指定了列数据类型。尽管如此,用户可以添加一个数据类型不同于最初为列指定的数据类型的记录,并且不会出现错误。

例如,这个 Python 语句完全有效,即使我们先前指定gender是字符串类型:

customer_table = customer_table.append(
   {'id': 1, 'age': 27, 'gender': 2})type(customer_table['gender'].values[0])# prints: 'int'

3.2 插入多个观察值

SQL 语句:

INSERT INTO customer_table VALUES
  (1, 27, 'Female'),
  (2, 27, 'Female'),
  (3, 45, 'Female'),
  (4, 18, 'Male'),
  (5, 23, 'Male'),
  (6, 43, 'Female'),
  (7, 28, 'Female'),
  (8, 27, 'Male'),
  (9, 19, 'Male'),
  (10, 21, 'Male'),
  (11, 24, 'Male'),
  (12, 32, 'Female'),
  (13, 23, 'Male');

Python:

customer_table = customer_table.append([
   {'id': 1, 'age': 27, 'gender': 'Female'},
   {'id': 2, 'age': 27, 'gender': 'Female'},
   {'id': 3, 'age': 45, 'gender': 'Female'},
   {'id': 4, 'age': 18, 'gender': 'Male'},
   {'id': 5, 'age': 23, 'gender': 'Male'},
   {'id': 6, 'age': 43, 'gender': 'Female'},
   {'id': 7, 'age': 28, 'gender': 'Female'},
   {'id': 8, 'age': 27, 'gender': 'Male'},
   {'id': 9, 'age': 19, 'gender': 'Male'},
   {'id': 10, 'age': 21, 'gender': 'Male'},
   {'id': 11, 'age': 24, 'gender': 'Male'},
   {'id': 12, 'age': 32, 'gender': 'Female'},
   {'id': 13, 'age': 23, 'gender': 'Male'}])

r:

id_list <- c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
age_list <- c(27, 45, 18, 23, 43, 28, 27, 19, 21, 24, 32, 23)
gender_list <- c("Female", "Female", "Male", "Male", "Female",
                 "Female", "Male", "Male", "Male", "Male", "Female",
                 "Male")customer_table <- 
  customer_table %>% add_row(id = id_list,
                             age = age_list,
                             gender = gender_list)

4.挑选

4.1 选择所有行和列

一旦我们填充了数据结构,我们就可以查询它们:

  • 我们可以用SELECT * ⁴.从 SQL 表中选择所有的行和列
  • 在 Python 和 R 中,为了显示所有的行和列,只需提示数据框的名称。

SQL 语句:

SELECT *
FROM customer_table;

输出:

 id | age | gender 
— — + — — + — — — — 
 1  | 27  | Female
 2  | 27  | Female
 3  | 45  | Female
 4  | 18  | Male
 5  | 23  | Male
 6  | 43  | Female
 7  | 28  | Female
 8  | 27  | Male
 9  | 19  | Male
 10 | 21  | Male
 11 | 24  | Male
 12 | 32  | Female
 13 | 23  | Male
(13 rows)

Python,R:

customer_table

4.2 选择有限数量的行

  • 在 SQL 中,我们可以使用LIMIT ⁴子句来指定要返回的行数。
  • head()函数允许返回要显示的顶部行数,即使在 Python⁸和 R⁹.使用的语法略有不同
  • 此外,在 Python 和 R 中,可以通过指定索引位置来指定要返回的行数。

SQL 语句:

--top 3 rows
SELECT * 
FROM customer_table 
LIMIT 3;

输出:

 id | age  | gender 
 — — + — — -+ — — — — 
 1   | 27   | Female
 2   | 27   | Female
 3   | 45   | Female
(3 rows)

Python:

# top 3 rows with head
customer_table.head(3)# top 3 rows by index with iloc
customer_table.iloc[0:3,]

r:

# top 3 rows with head
head(customer_table, 3)# top 3 rows by index
customer_table[0:3,]

4.3 选择特定的列

SQL 语句:

SELECT age, gender 
FROM customer_table 
LIMIT 3;

输出:

age | gender 
 — -+ — — — — 
 27 | Female
 27 | Female
 45 | Female
(3 rows)

在 Python 和 R 中,可以通过名称或索引位置来选择列。

备注:

  • 在 Python 中,应该在双方括号中指定列名,以返回一个pandas.DataFrame对象。否则,返回一个pandas.Series对象。
  • Python 从 0 开始计算索引,而 R 从 1 开始。例如,第二列在 Python 中的索引是 1,在 r 中是 2。

Python:

# select columns by name
customer_table[['age', 'gender']].head(3)# select columns by index
customer_table.iloc[:, [1, 2]]

r:

# select columns by name
customer_table[, c('age', 'gender')]# select columns by index
customer_table[, c(2, 3)]# dplyr
customer_table %>%
   select(age, gender)

4.4 选择不同的

  • SELECT DISTINCT允许在 SQL 中只返回不同的值。
  • 在 Python 中,我们可以通过在数据帧上调用pandas.DataFrame.drop_dupicates() ⁰方法,或者通过在 r 中应用dplyr中的distinct()函数来获得相同的结果

SQL 语句:

SELECT DISTINCT age, gender 
FROM customer_table;

输出:

age | gender 
 — -+ — — — — 
 32 | Female
 28 | Female
 45 | Female
 27 | Female
 43 | Female
 23 | Male
 21 | Male
 18 | Male
 24 | Male
 27 | Male
 19 | Male
(11 rows)

Python:

customer_table.drop_duplicates()customer_table[['age', 'gender']].drop_duplicates()

r:

distinct(customer_table)customer_table[, c('age', 'gender')]

5.WHERE 条件(过滤)

  • WHERE ⁴子句可用于根据特定条件过滤行。
  • 在 Python 中,我们可以在pandas.DataFrame.iloc方法中传递这个条件。该条件将返回一个布尔数组,其中True将指示匹配该条件的行的索引。随后,iloc将使用布尔数组作为输入对pandas.DataFrame进行过滤。
  • 在 R 中,我们可以使用管道操作符%>%filter()方法。

5.1 一个过滤条件

SQL 语句:

SELECT * 
FROM customer_table 
WHERE gender='Female';

输出:

id  | age | gender 
- — + — — + — — — — 
 1  | 27  | Female
 2  | 27  | Female
 3  | 45  | Female
 6  | 43  | Female
 7  | 28  | Female
 12 | 32  | Female
(6 rows)

Python:

customer_table.loc[customer_table['gender']=='Female']

r:

customer_table %>% filter(gender=='Female')

5.2 多重过滤条件

SQL 语句:

SELECT * 
FROM customer_table 
WHERE gender='Female' AND age>30;

输出:

 id | age | gender 
 — — + — — + — — — — 
   3 | 45  | Female
   6 | 43  | Female
  12 | 32  | Female
(3 rows)

Python:

customer_table.loc[(customer_table['gender']=='Female') & (customer_table['age']>30)]

r:

customer_table %>% filter(gender=='Female' & age>30)

6.以...排序

  • ORDER BY ⁴命令用于根据一列或多列的值对结果集进行升序或降序排序。默认情况下,它按升序对行进行排序。
  • 在 Python 中,我们可以用pandas.DataFrame.sort_values()对结果进行排序,而在 r 中,可以使用arrange() ⁴函数。对于 Python 和 R,默认的排序条件是升序。

6.1 按一列排序

SQL 语句:

SELECT * 
FROM customer_table 
ORDER BY age;

输出:

 id | age | gender 
 — — + — — + — — — — 
 4   | 18  | Male
 9   | 19  | Male
 10  | 21  | Male
 13  | 23  | Male
 5   | 23  | Male
 11  | 24  | Male
 1   | 27  | Female
 2   | 27  | Female
 8   | 27  | Male
 7   | 28  | Female
 12  | 32  | Female
 6   | 43  | Female
 3   | 45  | Female
(13 rows)

Python:

# default ascending order
customer_table.sort_values(by='age')

r:

# default ascending order
customer_table %>% arrange(age)

6.2 指定升序还是降序

在 SQL 中,可以用DESC(降序)和ASC(升序)关键字指定顺序,如下所示:

SELECT * 
FROM customer_table 
ORDER BY age DESC;

输出:

 id | age | gender 
— — + — — + — — — — 
 3  | 45  | Female
 6  | 43  | Female
 12 | 32  | Female
 7  | 28  | Female
 1  | 27  | Female
 2  | 27  | Female
 8  | 27  | Male
 11 | 24  | Male
 13 | 23  | Male
 5  | 23  | Male
 10 | 21  | Male
 9  | 19  | Male
 4  | 18  | Male
(13 rows)

在 Python 中,我们可以将ascending属性设置为False来进行降序排列:

customer_table.sort_values(by='age', ascending=False) 

r:

customer_table %>% arrange(desc(age))

6.3 按多列排序

SQL 语句:

SELECT * 
FROM customer_table 
ORDER BY age DESC, id DESC;

输出:

 id  | age | gender 
 — — + — — + — — — — 
 3  | 45   | Female
 6  | 43   | Female
 12 | 32   | Female
 7  | 28   | Female
 8  | 27   | Male
 2  | 27   | Female
 1  | 27   | Female
 11 | 24   | Male
 13 | 23   | Male
 5  | 23   | Male
 10 | 21   | Male
 9  | 19   | Male
 4  | 18   | Male
(13 rows)

Python:

customer_table.sort_values(by=['age', 'id'], 
                           ascending=[False, False])

r:

customer_table %>% arrange(desc(age, id))

7.聚合函数

7.1 计数

SQL 语句:

SELECT count(*) 
FROM customer_table;

输出:

count 
— — — -
13
(1 row)

在 Python 中,我们可以利用pandas.DataFrame.shape方法,返回大小为 2(行 x 列)的元组,以及其他方法:

customer_table.shape[0]# a less efficient alternative to shape
len(customer_table.index)

在 R 中,我们可以通过使用nrowcount获得类似的结果:

nrow(customer_table)# as alternative to 'nrow', one may use 'count' from dplyr
count(customer_table)

7.2 AVG,最小值,最大值,…

  • SQL 支持大量的聚合函数,可以从列中直接获得有用的信息,比如 average ( AVG)、count ( COUNT)、standard deviation ( STDDEV)等等。
  • Python 和 R 都提供了现成的方法来计算这样的指标。

SQL 语句:

-- AVG used as example, other functions include: MIN, MAX, STDEV, …
SELECT AVG(age) 
FROM customer_table;

也可以用ROUND函数将结果四舍五入到第 n 位小数:

SELECT ROUND(AVG(age), 2) 
FROM customer_table;

输出:

-- without ROUND
avg 
— — — — — — — — — — -
27.4615384615384615
(1 row)-— with ROUND
round 
— — — -
27.46
(1 row)

Python:

customer_table['age'].mean()# round the result to the nth decimal
customer_table['age'].mean().round(2)

r:

customer_table %>% summarize(mean(age))# round the result to the nth decimal
customer_table %>% summarize(round(mean(age), 2))

7.3 聚合函数和 WHERE 条件

SQL 语句:

SELECT ROUND(AVG(age),2) 
FROM customer_table 
WHERE gender='Female';

输出:

round 
— — — -
33.67
(1 row)

Python:

customer_table.loc[customer_table['gender']=='Female']['age'].mean().round(2)

在 R 中,正是在必须执行多个操作的地方,dplyr的链接功能真正发挥了作用:

customer_table %>% 
  filter(gender=='Female') %>% 
  summarize(round(mean(age), 2))

7.4 奖金:描述和总结

Python 和 R 提供了可视化数据框及其结构的汇总统计数据的方法。

例如,pandas.DataFrame.describe() ⁵方法提供了对数字列的有用见解(输出中省略了非数字列):

customer_table.describe().round(2)

输出:

 | id    | age 
— — — + — — — + — — — — 
count | 13.00 | 13.00
mean  | 6.50  | 27.50
std   | 3.61  | 8.66
min   | 1.00  | 18.00
25%   | 3.75  | 22.50
50%   | 6.50  | 25.50
75%   | 9.25  | 29.00
max   | 12.00 | 45.00
count | 12.00 | 12.00
mean  | 6.50  | 27.50

同样的方法pandas.Series.describe(),也可以仅应用于感兴趣的特定列(pandas.Series):

customer_table['age'].describe().round(2)

相反,在 r 中,我们可以使用summary ⁶函数来实现类似的结果:

# summary statistics of the whole dataset
summary(customer_table)# summary statistics of a specific column
summary(customer_table['age'])

尽管这些本地方法在标准 SQL 中不可用,但是可以编写查询来实现类似的输出。例如:

SELECT 
 COUNT(age), 
 ROUND(AVG(age),2) AS avg,
 MIN(age),
 MAX(age),
 ROUND(STDDEV(age),2) AS stddev
FROM
 customer_table;

输出:

count | avg   | min | max | stddev 
— — — + — — — + — — + — — + — — — — 
13    | 27.46 | 18  | 45  | 8.29
(1 row)

8.分组依据

⁴命令允许你按组排列行。

SQL 语句:

SELECT gender, count(*) 
FROM customer_table 
GROUP BY gender;

输出:

gender  | count 
— — — — + — — — -
Female  | 6
Male    | 7
(2 rows)

例如,在 Python 中,可以使用:
1。返回要素唯一值计数的pandas.Series.value_counts() ⁷方法。
2。对要素上的数据进行分组并执行聚合操作的pandas.DataFrame.groupby() ⁸方法。

# return unique gender values (Male, Female) and respective counts
customer_table['gender'].value_counts()# return average age grouped by gender
customer_table.groupby(['gender'])['age'].mean().round(2)

在 r 中,我们可以利用方便的group_by ⁹从dplyr对数据进行分组,然后通过summarize ⁰方法计算指标:

# return both count and average age grouped by gender
customer_table %>% 
  group_by(gender) %>% 
  summarize(count=n(), round(mean(age), 2))

输出:

gender  | count  | round(mean(age),2) 
— — — — + — — — -+ - - - - - - - - - -
Female  | 6      | 33.67
Male    | 7      | 22.14
(2 rows)

9.更新/更改表

在 SQL 中,ALTER TABLE语句用于添加、删除或修改现有表中的列和约束,而UPDATE语句用于修改现有记录。

9.1 修改现有列的值

SQL 语句:

UPDATE customer_table 
SET gender = 'M' 
WHERE gender = 'Male';SELECT * FROM customer_table;

输出:

id  | age | gender 
 —  + — — + — — — — 
 1  | 27  | Female
 2  | 27  | Female
 3  | 45  | Female
 6  | 43  | Female
 7  | 28  | Female
 12 | 32  | Female
 4  | 18  | M
 5  | 23  | M
 8  | 27  | M
 9  | 19  | M
 10 | 21  | M
 11 | 24  | M
 13 | 23  | M
(13 rows)

在 Python 中,我们可以使用pandas.DataFrame.replace()方法来更新现有列的值:

customer_table.replace('Male', 'M')

我们也可以同时替换多个值:

customer_table.replace(['Male', 'Female'], ['M', 'F'] )

在 R 中,我们可以如下使用mutate():

customer_table %>% 
 mutate(gender = case_when(gender == 'Male' ~ 'M',
                           gender == 'Female' ~ 'F'))

9.2 添加新列

SQL 语句:

-- create new column
ALTER TABLE customer_table
ADD COLUMN age_bins VARCHAR; -- populate column based on existing values
UPDATE customer_table 
SET 
 age_bins = CASE
 WHEN age < 20 THEN 'Teenager'
 WHEN age > 20 AND age < 30 THEN 'Between 20 and 30'
 WHEN age > 30 AND age < 40 THEN 'Over 30'
 WHEN age > 40 THEN 'Over 40'
 ELSE 'Unknown'
 END; -- observe result
SELECT * FROM customer_table;

输出:

 id | age | gender  | age_bins 
 — —+ — — + — — — — + — — — — — — — — — -
 1  | 27  | Female  | Between 20 and 30
 2  | 27  | Female  | Between 20 and 30
 3  | 45  | Female  | Over 40
 6  | 43  | Female  | Over 40
 7  | 28  | Female  | Between 20 and 30
 12 | 32  | Female  | Over 30
 4  | 18  | Male    | Teenager
 5  | 23  | Male    | Between 20 and 30
 8  | 27  | Male    | Between 20 and 30
 9  | 19  | Male    | Teenager
 10 | 21  | Male    | Between 20 and 30
 11 | 24  | Male    | Between 20 and 30
 13 | 23  | Male    | Between 20 and 30
(13 rows)

在 Python 中,我们可以通过pandas.DataFrame.apply()函数实现这一结果,该函数沿pandas.DataFrame的轴执行函数(axis=0将函数应用于每一列,而axis=1将函数应用于每一行):

def age_bins(row):
 if row['age'] < 20:
   return 'Teenager'
 elif row['age'] > 20 and row['age'] < 30:
   return 'Between 20 and 30'
 elif row['age'] > 30 and row['age'] < 40:
   return 'Over 30'
 elif row['age’] > 40:
   return 'Over 40'
 else:
   return 'Unknown'customer_table['age_bins'] = customer_table.apply(lambda row: age_bins(row), axis=1)

在 R 中,我们仍然可以使用mutate函数:

customer_table %>% 
 mutate(age_bins = case_when(
     age < 20 ~ 'Teenager',
     age > 20 & age < 30 ~ 'Between 20 and 30',
     age > 30 & age < 40 ~ 'Between 30 and 40',
     age > 40 ~ 'Over 40',
     TRUE ~ 'Unknown'))

9.3 下降柱

  • 在 SQL 中,我们可以通过ALTER TABLE .. DROP COLUMN命令从表中删除一列。
  • 在 Python 中,我们可以简单地将列名作为列表提供给pandas.DataFrame.drop() ⁵方法。
  • 在 r 中,select() ⁶函数允许通过名称选择列,其中可以减去要删除的列。

SQL 语句:

ALTER TABLE customer_table 
DROP COLUMN age_bins;

Python:

customer_table.drop(['age_bins'], axis=1)

r:

select(customer_table, -'age_bins')

10.加入

让我们假设信息分布在多个表上。例如,我们可能有一个 customer 表和一个 purchase 表,我们可能希望跨这两个表检索信息,以便生成业务报表。

在 SQL 中,我们使用了JOIN ⁴表操作符,它允许根据两个(或更多)表之间的相关列来组合它们的信息。

在观察不同的连接条件之前,我们应该创建第二个表/数据帧进行实验。

SQL 语句:

-- create purchase table
CREATE TABLE IF NOT EXISTS purchase_table (
    purchase_id SERIAL PRIMARY KEY,
    product_id VARCHAR NOT NULL,
    price NUMERIC NOT NULL,
 customer_id NUMERIC NOT NULL
);-- populate purchase table with values
INSERT INTO purchase_table VALUES
  (1, 'SX145', 59.99, 1),
  (2, 'DE438', 19.99, 2),
  (3, 'TG671', 39.99, 4),
  (4, 'ZR565', 129.99, 8),
  (5, 'PO876', 200.00, 5),
  (6, 'LI657', 25.50, 12),
  (7, 'VF455', 69.99, 8),
  (8, 'WS130', 75.00, 8),
  (9, 'CV761', 120.00, 7);

-- observe table
SELECT * FROM purchase_table;

输出:

purchase_id  | product_id | price  | customer_id 
-------------+------------+--------+-------------
           1 | SX145      |  59.99 |           1
           2 | DE438      |  19.99 |           2
           3 | TG671      |  39.99 |           4
           4 | ZR565      | 129.99 |           8
           5 | PO876      | 200.00 |           5
           6 | LI657      |  25.50 |          12
           7 | VF455      |  69.99 |           8
           8 | WS130      |  75.00 |           8
           9 | CV761      | 120.00 |           7
(9 rows)

我们创建对应于新表的pandas.DataFrame:

purchase_table =pd.DataFrame({
    'purchase_id':[1, 2, 3, 4, 5, 6, 7, 8, 9],
    'product_id':['SX145', 'DE438', 'TG671', 'ZR565', 'PO876',       
                  'LI657', 'VF455', 'WS130', 'CV761'],
    'price':[59.99, 19.99, 39.99, 129.99, 200.00, 25.50,
             69.99, 75.00, 120.00],
    'customer_id':[1, 2, 4, 8, 5, 12, 8, 8, 7]
})

类似地,我们在 R 中创建一个data.frame:

purchase_table <- data.frame(
  purchase_id = c(1, 2, 3, 4, 5, 6, 7, 8, 9),
  product_id= c('SX145', 'DE438', 'TG671', 'ZR565','PO876','LI657',
                'VF455', 'WS130', 'CV761'),
  price = c(59.99, 19.99, 39.99, 129.99, 200.00, 25.50, 
            69.99, 75.00, 120.00),
  customer_id = c(1, 2, 4, 8, 5, 12, 8, 8, 7))

10.1 内部连接

INNER JOIN根据相关列返回在两个表中具有匹配值的记录:

内部联接。图片作者。

SQL 语句:

SELECT * 
FROM customer_table as customer 
 INNER JOIN purchase_table as purchase
   ON customer.id = purchase.customer_id;

输出:

id | age | gender | purchase_id | product_id | price  | customer_id 
---+-----+--------+-------------+------------+--------+-------------
 1 |  27 | Female |           1 | SX145      |  59.99 |           1
 2 |  27 | Female |           2 | DE438      |  19.99 |           2
 4 |  18 | Male   |           3 | TG671      |  39.99 |           4
 5 |  23 | Male   |           5 | PO876      | 200.00 |           5
 7 |  28 | Female |           9 | CV761      | 120.00 |           7
 8 |  27 | Male   |           4 | ZR565      | 129.99 |           8
 8 |  27 | Male   |           7 | VF455      |  69.99 |           8
 8 |  27 | Male   |           8 | WS130      |  75.00 |           8
 12|  32 | Female |           6 | LI657      |  25.50 |          12
(9 rows)

我们有 13 个客户和 9 次购买。由于INNER JOIN只返回匹配的值,我们只观察到 9 条记录。查询不会返回没有进行过购买的客户。

在 Python 中,我们可以如下使用pandas.DataFrame.merge() ⁷:

pd.merge(customer_table,
  purchase_table,
  left_on='id',
  right_on='customer_id')

默认情况下,pandas.DataFrame.merge()执行一个INNER JOIN

在 r 中,我们可以使用⁸:的dplyr连接方法

customer_table  %>%
    inner_join(purchase_table, by=c('id' = 'customer_id'))

10.2 左连接

LEFT JOIN返回左表中的所有记录,以及右表中匹配的记录:

左接合。图片作者。

SQL 语句:

SELECT * 
FROM customer_table as customer 
  LEFT JOIN purchase_table as purchase
    ON customer.id = purchase.customer_id;

输出:

 id | age | gender | purchase_id | product_id | price  | customer_id 
----+-----+--------+-------------+------------+--------+------------
  1 |  27 | Female |           1 | SX145      |  59.99 |           1
  2 |  27 | Female |           2 | DE438      |  19.99 |           2
  3 |  45 | Female |             |            |        |            
  4 |  18 | Male   |           3 | TG671      |  39.99 |           4
  5 |  23 | Male   |           5 | PO876      | 200.00 |           5
  6 |  43 | Female |             |            |        |            
  7 |  28 | Female |           9 | CV761      | 120.00 |           7
  8 |  27 | Male   |           4 | ZR565      | 129.99 |           8
  8 |  27 | Male   |           7 | VF455      |  69.99 |           8
  8 |  27 | Male   |           8 | WS130      |  75.00 |           8
  9 |  19 | Male   |             |            |        |            
 10 |  21 | Male   |             |            |        |            
 11 |  24 | Male   |             |            |        |            
 12 |  32 | Female |           6 | LI657      |  25.50 |          12
 13 |  23 | Male   |             |            |        |            
(15 rows)

在 Python 中,我们总是可以利用pandas.DataFrame.merge()函数,但这次我们需要将how参数指定为left(其默认值为inner)。

pd.merge(customer_table,
         purchase_table,
         left_on='id',
         right_on='customer_id',
         how='left')

在 R 中:

customer_table  %>% 
   left_join(purchase_table, by=c('id' = 'customer_id'))

10.3 右连接

RIGHT JOIN返回右表中的所有记录,以及左表中匹配的记录:

向右加入。图片作者。

SQL 语句:

SELECT * 
FROM customer_table as customer 
 RIGHT JOIN purchase_table as purchase
   ON customer.id = purchase.customer_id;

输出:

 id | age | gender | purchase_id | product_id | price  | customer_id 
----+-----+--------+-------------+------------+--------+------------
  1 |  27 | Female |           1 | SX145      |  59.99 |           1
  2 |  27 | Female |           2 | DE438      |  19.99 |           2
  4 |  18 | Male   |           3 | TG671      |  39.99 |           4
  5 |  23 | Male   |           5 | PO876      | 200.00 |           5
  7 |  28 | Female |           9 | CV761      | 120.00 |           7
  8 |  27 | Male   |           4 | ZR565      | 129.99 |           8
  8 |  27 | Male   |           7 | VF455      |  69.99 |           8
  8 |  27 | Male   |           8 | WS130      |  75.00 |           8
 12 |  32 | Female |           6 | LI657      |  25.50 |          12
(9 rows)

在 Python 中:

pd.merge(customer_table,
         purchase_table,
         left_on='id',
         right_on='customer_id',
         how='right')

在 R 中:

customer_table  
    %>% right_join(purchase_table, by=c('id' = 'customer_id'))

10.4 完全加入

当左表或右表中有匹配时,FULL JOIN返回所有记录:

完全加入。图片作者。

SQL 语句:

SELECT * 
FROM customer_table as customer 
  FULL JOIN purchase_table as purchase
    ON customer.id = purchase.customer_id;

输出:

id  | age | gender | purchase_id | product_id | price  | customer_id 
----+-----+--------+-------------+------------+--------+------------
  1 |  27 | Female |           1 | SX145      |  59.99 |           1
  2 |  27 | Female |           2 | DE438      |  19.99 |           2
  3 |  45 | Female |             |            |        |            
  4 |  18 | Male   |           3 | TG671      |  39.99 |           4
  5 |  23 | Male   |           5 | PO876      | 200.00 |           5
  6 |  43 | Female |             |            |        |            
  7 |  28 | Female |           9 | CV761      | 120.00 |           7
  8 |  27 | Male   |           4 | ZR565      | 129.99 |           8
  8 |  27 | Male   |           7 | VF455      |  69.99 |           8
  8 |  27 | Male   |           8 | WS130      |  75.00 |           8
  9 |  19 | Male   |             |            |        |            
 10 |  21 | Male   |             |            |        |            
 11 |  24 | Male   |             |            |        |            
 12 |  32 | Female |           6 | LI657      |  25.50 |          12
 13 |  23 | Male   |             |            |        |            
(15 rows)

Python:

pd.merge(customer_table,
         purchase_table,
         left_on='id',
         right_on='customer_id',
         how='outer')

r:

customer_table  %>% 
    full_join(purchase_table, by=c('id' = 'customer_id'))

备注:

  • 在关系数据库系统和 r 之间执行连接操作的方式上有一些微小的差异。
    例如,在数据库和 r 处理 NA/NaN 值的方式上:dplyr连接函数⁸将两个 NA 或 NaN 值视为相等,而数据库则不是这样。
    通过将值为neverna_matches参数传递给dplyr连接函数,可以修改这种行为,从而在 NA/NaN 处理方面产生与数据库连接更相似的结果。
  • pandas也提供pandas.DataFrame.join()来执行连接操作。虽然它与pandas.DataFrame.merge()非常相似,但这两种方法存在差异,这里将详细讨论⁹.

11.结论

  1. 有不同的方法可以达到同样的结果。在本文中,我们总结了用于数据操作的最常见的 SQL 查询,并为每一个查询提供了 Python 和 R 语言中许多可能的对应查询之一。这篇文章的目的是分享有用的实例,以及了解 Python、R 和 SQL 之间相似之处的方法。
  2. SQL 查询是为PostgreSQL编写的,这是一个流行的开源关系数据库管理系统。不同的数据库可能呈现稍微不同的 SQL 风格。
  3. 我们在这篇文章中探讨的语句是不适当的,这意味着它们不会改变底层数据结构。例如,用customer_table.drop_duplicates()选择不同的行不会从customer_table中删除重复的行。为了保持变化,我们应该分配结果,例如:new_dataframe = customer_table.drop_duplicates()。这也适用于 R。为了完整起见,我们提醒许多pandas方法通过接受设置为Trueinplace参数也支持就地操作(默认情况下,该参数设置为False)。r 还通过将链操作符从%>%修改为%<>%来支持就地操作。例子如下:

Python:

# not in-place: customer_table is not filtered
customer_table.drop_duplicates()# in-place: customer_table is filtered
customer_table.drop_duplicates(inplace=True)

r:

# magrittr is the R package that provides the chain operator
library(magrittr)# not in-place: customer_table is not filtered
customer_table %>% 
  filter(gender=='Female')# in-place: customer_table is filtered
customer_table %<>% 
  filter(gender=='Female')

12.参考

[1]pandas.pydata.org/docs/index.html

[2]dplyr.tidyverse.org/

pandas.pydata.org/docs/reference/frame

postgresql.org/docs/10/sql-commands

[5]rdocumentation . org/packages/base/versions/3 . 6 . 2/topics/data . frame

pandas.pydata.org/docs/reference/api/pandas.[6]DataFrame.append

[7]rdocumentation . org/packages/tible/versions/3 . 1 . 6/topics/add _ row

[8]pandas.pydata.org/docs/reference/api/pandas.DataFrame.head.html

[9]rdocumentation . org/packages/utils/versions/3 . 6 . 2/topics/head

[10]pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates

【11】dplyr.tidyverse.org/reference/distinct

pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc

【13】pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values

[14]dplyr.tidyverse.org/reference/arrange

pandas.pydata.org/docs/reference/api/pandas.[15]data frame . description

[16]rdocumentation . org/packages/base/versions/3 . 6 . 2/topics/summary

【17】pandas.pydata.org/docs/reference/api/pandas.Series.value_counts

【18】pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby

[19]rdocumentation . org/packages/DP lyr/versions/0 . 7 . 8/topics/group _ by

[20]rdocumentation . org/packages/DP lyr/versions/0 . 7 . 8/topics/summary

【21】pandas.pydata.org/docs/reference/api/pandas.DataFrame.replace

[22]dplyr.tidyverse.org/reference/mutate

[23]pandas.pydata.org/docs/reference/api/pandas.DataFrame.apply

【pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop 25】

[26]rdocumentation . org/packages/DP lyr/versions/0 . 7 . 8/topics/select

pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge

dplyr.tidyverse.org/reference/mutate-joins

[29]pandas.pydata.org/pandas-docs/stable/user_guide/merging

数据网格架构以及 API 和 JSON 模式的作用

原文:https://towardsdatascience.com/data-mesh-architecture-and-the-role-of-apis-json-schemas-3dc616650960

如何使用 JSON 模式来协调 API、数据网格和事件定义

数据网格和 API 的关系比您可能意识到的要密切得多。事实上,API 和它们的近亲 JSON 模式是数据网格的基础组件。这个架构讨论解释了为什么。

杰米·哈姆森在 Unsplash 上拍摄的照片

API 和 JSON 模式是企业数据网格的基础元素

API,或称应用编程接口,以及它们的近亲 JSON 模式,通过提供一种指定数据结构、访问方法和安全构造的一致方法,实现了扎马克·德赫加尼的数据网格的每一项原则/功能。通过这样做,API 和 JSON 模式使得在企业的数据网格中查找、使用和管理数据变得更加容易。

本文将通过回答几个简单的问题来解释数据网格、API 和 JSON 模式之间的关系:

  • API 在数据网格中的作用是什么?
  • 如何使用 API,尤其是 OpenAPI 这样的规范来形式化数据结构和访问模式?
  • 如何使用 JSON 模式来协调 API、数据网格和事件定义?

数据网格架构概述

企业数据网格(图 1)由许多组件组成。数据产品是数据网格中的主要原子构建块(更多细节请点击这里)。数据产品包含使用变更数据捕获和事件流主干同步的运营、分析和/或参与数据。API 用于访问数据产品中的数据。为了支持联合治理,每个数据产品都包含一个审计日志,记录数据变更和它管理的数据目录。

图 1,企业数据网格架构

企业的数据网格有许多数据产品。数据产品订阅彼此的数据,使得当一个数据产品改变其数据时,该改变被传达给其他数据产品(订阅该改变)。

一个事件流主干用于将事件(或任何 API 调用)分发到任何“实体”——一个应用程序,或企业数据网格中的另一个数据产品。事件流 Bankbone 管理实体订阅的“主题”。发布者——企业数据网格中的任何参与者——将事件发布到“主题”。事件的消费者——同样,企业数据网格中的任何参与者都会订阅“主题”,并在事件发布到该主题时收到通知。

例如,数据科学家使用的分析数据产品可能会订阅两种数据产品——“客户”和“交易历史”数据产品,以确保它拥有最新的信息来训练 AI/机器学习模型。当对“客户”数据产品中的数据进行修改时,分析数据产品订户将会收到一个通知,其中包含描述所发生的更改的事件。在这一点上,分析数据产品可以用事件信息更新其训练储存库,确保最新的数据用于训练 AI/ML 模型。

最后,企业数据目录——所有数据产品目录的同步聚合——用于使任何用户或开发人员都可以轻松地找到和使用整个企业中的任何数据(当然,假设它们是被允许的)。

API 使得在数据网格中消费数据变得简单

为什么 API 对数据网格至关重要?根据 Dehghani 的原则,API 是访问企业数据网格的工具。 OpenAPI ,一个使用 REST(互联网最常用的协议)的 API 标准,定义了数据网格 API 的契约:

  • 端点:可以访问数据网格服务的 URL
  • 请求:对数据网格端点的传入请求的格式和结构
  • 响应:数据网格响应请求的格式和结构
  • 错误:对请求的数据网格错误响应的格式和结构,以及当使用 HTTP(或 HTTPS)时,错误代码的语义和含义
  • 安全模式:访问数据网格服务端点所需的“角色”的标识

图 2,API 简化了企业数据网格的使用

那么 API 到底是如何实现数据网格原理的呢?简而言之,API 支持:

  • 数据平台:API 契约提供了围绕数据网格能力的定义边界,因此提供了数据平台定义、所有权和责任的基础;API 端点提供了访问企业数据网格的入口点。
  • 自助式:由于任何人都可以使用 API(假设他们有必要的权限),API 允许数据网格是“自助式”的,任何应用程序、用户或开发人员都可以使用。
  • 分散所有权和简化消费:API 市场相当成熟大多数数据网格 API 规范位于所谓的“API 市场”(API 规范的开发者门户和目录);这些 API Marketplaces 定义了数据所有权,同时也使开发人员或用户能够轻松地在企业的数据网格中搜索/查找和理解数据。
  • 联合治理:由于 API 规范是在 API 市场中定义的,数据网格治理团队(以及那些由团队治理的团队)有一个已建立的“记录簿”来管理和治理对数据网格的访问,并传达策略或方向的变化。

API 提供数据网格护栏和安全性

企业的数据网格存储着任务关键型数据,到目前为止,我们都知道保护这些数据的必要性。那么,API 如何提供保护企业数据网格所需的“护栏”呢?

首先,成熟的 API 框架实现了“护栏”,以确保所有数据网格交互安全可靠,而且可操作、可观察、可追踪。典型企业数据网格部署中需要的常见 API 框架功能包括:

  • 异常处理确保数据网格通信的弹性和可靠性
  • 日志记录确保捕获数据网格警报、通知和事件,用于审计或调试目的
  • 数据网格中的警报会自动传播到企业控制台
  • 消息屏蔽确保敏感数据网格消息和日志被屏蔽,以确保符合行业标准(PII、HIPPA 等)
  • 数据网格的健康状态是可见的,并与企业系统管理工具集成
  • 指标捕获数据网格统计信息,并使其对企业控制台可见
  • 消息的跟踪确保相关的数据网格事件可以被跟踪和关联
  • 数据网格中的安全性使用行业标准 OAUTH2、JWT 和 TLS 来确保数据网格的安全
  • 消息验证确保所有数据网格交互符合已发布的合同
  • Sidecar 架构允许以任何语言安全地编写数据网格业务和事件管理逻辑

图 3,API 提供了数据网格安全和护栏

第二,通过使用 OpenAPI 规范,每个端点可以定义其加密首选项。HTTPS 是 HTTP 协议的安全版本,它可以确保所有端点以及企业数据网格之间发送和接收的数据都是加密的。

最后,OpenAPI 规范定义了一个类似“角色”的安全模式。这个“角色”用于使用行业标准 OAUTH2 协议来管理对 API 的访问,从而管理数据网格。当以这种方式使用时,API 的安全模式将 API 访问权限链接到组织的基于角色的访问控制(“RBAC”)能力,从而提供管理对企业数据网格的访问的统一方法。

JSON 模式协调数据网格事件和 API

让我们看看图 4 所示的场景。有几个交互组件允许 JSON 模式成为数据网格的基本元素:

  • 模式注册中心,它是所有事件和交互定义的存储库,因为事件和 API 请求和响应都是由 JSON 模式定义的;管理员(在联邦治理团队的帮助下)在注册中心发布和管理 JSON 模式,确保模式注册中心被建立为定义数据网格事件和交互机制的“记录簿”。
  • 发布者是创建事件并将它们发布到事件流骨干网上众所周知的“主题”的实体;因为发布者将事件作为 JSON 消息发布,所以它们可以由模式注册中心中的 JSON 模式定义;特别重要的是,发布的每条消息都根据模式注册中心的 JSON 模式进行验证,这确保了发布者发布的无效消息会被立即拒绝,只有有效的格式良好的事件/消息才会在企业数据网格中传播。
  • 消费者订阅“主题”,并在事件发布到该主题时得到通知;由于事件是由一个 JSON 模式定义的,并且事件与一个特定的 JSON 模式相关联,因此消费者可以得到一个易于理解和使用的有效结构化消息。

图 4:API 使用 JSON 模式来构建数据网格中的数据

那么,API 适合在哪里呢?OpenAPI 规范被定义为与 JSON 模式显式兼容。这是一个基本和关键的好处,但它没有得到很好的理解,所以让我来解释为什么这是如此重要。

首先,OpenAPI 规范的组件——请求、响应(包括错误响应)和参数——被定义为 JSON 模式。这确保了所有基于 Dehghani 原则的与企业数据网格的交互都是通过 API 进行的,都是在一个易于理解的、健壮的标准结构中定义的。

其次,由于每个 API 请求都是由一个 JSON 模式定义的,所以将 API 消息转换成由同一个模式定义的 JSON 事件是很容易的。现在,我们可以使用 JSON 模式为企业数据网格中的所有传入消息创建结构和语义。

第三,因为所有事件都是由 JSON 模式定义的,所以我们可以将所有事件定义保存在一个事件注册表中。这个事件注册表可以使用“企业事件目录”来呈现,这样可以很容易地找到事件。

第四,由于所有数据网格事件都在注册表/目录中,并且由于与数据网格的所有通信都是通过由注册表/目录中的事件定义的 API 进行的,因此 API 为开发人员提供了“自助”能力的基础,以方便使用 API。

API 和 JSON 模式使得数据网格可以搜索

由于所有事件和数据都是在企业模式注册中心中定义和维护的,因此数据网格的治理变得更加容易。毕竟,治理数据的第一步是了解您拥有什么,并使您能够轻松地治理什么。

但是还有更多。在图 5 中,我们强调了数据产品(联合在不同的组或业务线中)及其本地目录,以及它们的更改/审核日志,如何通过使数据网格“可搜索”来显著简化数据网格治理:

  • 企业数据产品目录(EDPC)是企业数据定义和传承的“记录簿”;所有数据产品目录的更改都会被捕获并同步到模式注册中心和 EDPC(使用事件流主干以接近实时的方式),从而确保 EDPC 始终是最新的,并作为企业数据定义的记录簿;类似地,自动捕获的数据产品变更/审计日志(更多详细信息,请参见此处的)也近乎实时地同步到 EDPC,这将成为数据变更的“记录簿”,从而成为整个企业的数据沿袭。
  • 治理团队成员使用 EDPC 来搜索和了解企业中存在哪些数据以及谁在使用这些数据。
  • 开发人员使用 EDPC 来搜索和理解事件结构和 API 消息格式(回想一下,这些都是 JSON 模式)。
  • 数据科学家使用 EDPC 来识别 AI/ML 模型训练数据在企业中的位置。

图 5:API 和 JSON 模式使得数据网格可搜索

总结想法

Data Mesh 及其 API 和 JSON 模式基础使正确的数据在正确的时间可用,使企业能够自由地推动当今市场所需的创新、速度和敏捷性。API 和 JSON 模式简化了企业数据网格的使用,同时支持不受官僚流程约束的联合数据访问、交付和管理模型,而是允许任何企业团队在任何时候以自动化的方式使用他们的项目、团队或业务线所需的数据。

在实现企业的数据网格时,不要忘记 API 和 JSON 模式扮演的重要角色!


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

数据网格架构模式

原文:https://towardsdatascience.com/data-mesh-architecture-patterns-98cc1014f251

企业数据网格正在彻底改变企业管理数据的方式。什么是基本的数据网格模式?

KOBU 机构在 Unsplash 上拍摄的照片

数据网格模式

企业数据网格正在成为管理企业内部数据的一种独特而引人注目的方式。它将“产品思维”引入企业数据管理,同时在企业中实现更高水平的敏捷性和数据治理。它创造了一种“自助”能力,数据近乎实时同步,从而为实时数字企业奠定了基础。

但是,唉,没有一种产品能给你带来数据网格。更确切地说,企业的数据网格是由许多普遍可用的组件组成的(参见下一节的数据网格架构概述)。

然而,成功的关键是理解这些组件是如何相互作用的。在本文中,我将使用架构模式来描述这些交互。

数据网格架构概述

一个企业数据网由许多组件组成(这里有更多细节、这里有,这里有)。数据产品是数据网格中的主要构建块,包含使用企业数据网格在整个组织中同步的操作、分析和/或参与数据。API 用于访问数据产品中的数据。为了支持联合治理,每个数据产品都包含一个审计日志,记录数据变更和它管理的数据目录。

企业的数据网格有许多数据产品。数据产品订阅彼此的数据,以便当一个数据产品更改其数据时,使用更改数据捕获和事件流骨干将此更改传达给其他数据产品。

最后,企业数据目录——所有数据产品目录和数据变更的同步聚合——用于使任何用户或开发人员都可以轻松地查找、使用和管理整个企业中的任何数据,同时还为了解整个企业中的数据谱系提供了基础。

图 1,企业数据网格架构

我们将在本文中描述以下架构模式:

  • 改变数据捕捉
  • 事件分流骨干
  • 数据产品目录
  • 企业数据产品目录
  • 不可变的变更/审计日志

数据网格模式:更改数据捕获

如今,很难在服务和应用程序边界之间安全、可靠且一致地交付数据。有两种方法可以应对这一挑战。首先,可以使用诸如“两阶段提交”(2PC)之类的协议跨多个数据库同步更新数据,但是这种方法通常很复杂且成本很高,并且通常只在保持多个数据源同步至关重要的情况下使用。

第二种方法是立即更新主数据库,同时在将来更新辅助数据库(但不在事务范围内)。当主数据库和辅助数据库更新的时间间隔比预期的长时,就会出现问题。

变更数据捕获 (CDC)是企业数据网格用来应对这一挑战的基础组件。CDC 通过在数据库的事务日志中捕获和发布条目来工作,但最重要的是,它是在原始事务之外不引人注目地完成这些工作的。这意味着 CDC 透明地捕获运营(或分析)数据的变化,而不会影响原始应用程序或事务流。

(注意:这里有更多详细信息供那些想了解 CDC 在企业中如何工作的人使用)

图 2,数据网格模式:更改数据捕获

但是 CDC 对捕获的“事件”做什么。在企业数据网格中,它将事件发布到事件流主干(下一个模式),以便在整个企业中分发。

数据网格模式:事件流主干

一个事件流骨干 在企业数据网格中分发事件。事件通常源于应用程序、API,在我们的例子中,也源于 CDC 。然而,特别重要的是,任何发布的事件都可以被任何其他订阅实体安全、可靠并且近实时地消费。

图 3,数据网格模式:事件流主干

事件流主干中有几个核心受管实体:

  • 由 JSON 模式定义的事件分布在企业数据网格中。
  • 主题用于在整个企业中排队和分发事件;企业数据网格使用众所周知的主题,这些主题通过允许许多实体发布和消费事件来充当队列。
  • 制作人发布事件到话题;企业数据网中的生产者可能是 API、应用程序或 CDC 。
  • 消费者从话题中消费事件。企业数据网格中的消费者可以是订阅主题并在事件可供处理时得到通知的任何实体或应用程序。
  • 事件流处理器以事件为单位或以时间窗口为基础聚合处理事件,从而在企业数据网格中实现非常复杂和强大的分析技术。
  • 代理管理上述组件,以确保整个企业数据网中安全可靠的事件通信。

数据网格模式:数据产品目录

他们说,数据是新的金矿,挖掘它将带来巨大的洞察力和财富。但是在今天的大多数企业中,数据分散在组织的许多小组中。销售拥有客户数据,分销拥有供应链,财务拥有交易和账户。

不幸的是,这使得查找数据变得非常困难,并且一旦找到数据,将它汇集起来以做出整体的业务决策就更加困难。其结果是:决策过程缓慢、成本高昂且缺乏信息。

数据产品目录 (DPC)包含关于数据产品的数据(“元数据”)的信息。DPC 提供的信息使得任何授权人员或应用程序都可以轻松地在企业数据网格中查找、查看和使用数据产品。DPC 有几个好处:

  • 易于管理,支持本地所有权和问责制。
  • 易于改变和发展,允许决策本地化和更快。
  • 轻松查找、查看和消费数据,让任何(授权)实体都能轻松查找、查看和消费数据(即“自助服务”)。

图 4,数据网格模式:数据产品目录

数据网格模式:企业数据产品目录

企业数据产品目录 (EDPC)是一个存储库,汇集了来自所有本地数据产品目录(DPC)的元数据。企业数据目录用于存储企业数据网格中维护的所有数据的信息和统计数据(元数据),以便于查找、查看、使用和管理数据:

  • 数据科学家使用 EDPC 找到数据在企业中的位置,他们可以用这些数据来训练他们的模型。
  • 商业用户使用 EDPC 查找商业决策所需的信息。
  • 开发人员使用 EDPC 来理解他们的应用程序所需的数据结构。
  • 治理专家使用 EDPC 来理解和监控整个企业的数据,在企业数据网格中实现联合计算治理。

图 5,数据网状模式:企业数据产品目录

数据网格模式:不可变的变更/审计日志

理解数据的谱系(定义为数据经历的变化的汇总列表)对于治理和监管目的至关重要。为什么这很重要?考虑今天的一个常见情况:AI/机器学习的出现现在是一种强制性的企业能力。数据科学家使用复杂的模型来实现和做出关键的业务决策。

然而,在许多企业中,尤其是那些医疗保健和金融领域的企业,这些模型的实际可行性取决于满足监管机构对可再现性和可追溯性要求的能力(更多信息请参见这里和这里)。不幸的是,大多数企业没有能力按照审计员或监管者要求的方式跟踪数据沿袭。

企业数据网格的不可变变更/审计日志通过保留企业数据网格内的历史数据变更来满足这一需求,以用于未来的审计和治理目的。本地数据产品变更/审计日志会根据数据中的任何数据变更自动更新。然后,这些日志被传播到企业数据产品目录(EDPC ),以便整合企业中的数据更改历史。

换句话说,EDPC 包含企业数据网格中所有元素的数据沿袭。EDPC 使用这些数据来提供可搜索的元数据索引,该索引明确包括对每个数据产品的不可变更改/审核日志的引用,从而可以轻松找到并确认数据沿袭。

图 6,数据网格模式:不可变变更/审计日志

总结想法

企业数据网格正在成为实时数字企业的基础促成因素。架构模式提供了一种描述数据网格交互的既定方法。虽然没有现成的工具可用,但构建您自己的组织数据网格的第一步是理解支持数据网格的基本模式。

希望这篇文章给你必要的洞察力来启动你自己的企业数据网格!


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

数据网格云迁移模式

原文:https://towardsdatascience.com/data-mesh-cloud-migration-pattern-fcff598695e4

企业中的云迁移速度太慢、成本太高且过于复杂。数据网格云迁移模式展示了如何加速云迁移。

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

数据网格云迁移模式

云技术无处不在。它隐藏在每一个手机 app 的背后,它触及并存储着我们的每一封邮件、每一条信息、每一次社交。而且,云的价值主张似乎很明确:根据麦肯锡的报告,在所有行业中,云的采用可以释放 1 万亿美元的商业价值

然而,云在企业中的采用(尤其是核心应用和数据的迁移)非常缓慢,而且充满挑战。知名风险基金 A16Z认为这是因为“考虑到这种努力的巨大规模,大多数公司发现很难证明将工作负载从云上转移出去是合理的,并且必要的重写看起来是如此不切实际以至于不可能。”因此,几乎每个行业的大多数系统仍然主要运行在内部数据中心就不足为奇了。

但是现在有了新的技术和模式,甚至更好的方法,可以将数据跨企业移动到云中。这就是数据网格出现的原因。

本文描述了数据网格云迁移模式,以及它如何解决基础数据挑战,从而帮助企业加速云迁移。

请注意,理解构建数据网格不仅仅是采用技术模式,这一点很重要。这还要求你对数据文化、组织行为和数据运营模式的看法发生巨大转变。 Thinh Ha (本文的合著者)曾在一篇名为你还没准备好采用数据网格的 10 个理由的优秀文章中讨论过你在采用数据网格时可能遇到的文化和组织挑战。Thinh 是谷歌英国专业服务部门的战略云工程师,他曾与许多客户合作建立云原生数据网格环境。

最后一点:我们假设您对数据网格有很高的理解。如果你需要一些关于数据网格的背景信息,这里有一些很棒的文章可供参考这里(模式),这里(架构),这里(原则)。对于感兴趣的读者,这里的和这里的和提供了数据网格模式的完整描述。

模式摘要

数据网格云迁移解决方案模式将数据从任何类型的系统(交易或分析)近乎实时地移动到企业数据网格内的云原生数据产品,同时使数据可被发现并易于使用。

背景和业务问题

麦肯锡说“75%的云预算超出预算”和“38%的云项目落后于计划。”他们接着说,一些组织“正在泄露他们的价值份额,而不是获取它,在协调云迁移方面的低效增加了意想不到的成本和延迟。预计未来三年将有大约 1000 亿美元的浪费性迁移支出,大多数企业认为迁移成本是采用云的主要障碍。”

埃森哲最近的分析与此相呼应,该分析显示“三分之二的企业尚未完全实现其预期结果,尽管新冠肺炎疫情已经将云的采用变成了一项指令。”

高德纳估计云计算将占 2020 年 IT 支出的 9.1%。尽管有积极的增长预期,但云支出仅占 IT 支出的 14.2%。因此,尽管云计算有了巨大的增长,但它仍然只是 it 总支出的一小部分。

我想真正的问题是为什么云的采用如此缓慢和昂贵?我认为,许多企业继续青睐内部解决方案而非云有一个简单、令人信服且实际的原因:因为数据就在那里。

简单来说,数据产生数据。如今,企业数据中心中的海量数据形成了一个“数据引力井”,将所有应用程序、环境和服务纳入其轨道。事实是,在我们能够将重心从数据中心转移到云之前,采用将会保持缓慢。

图 1,建立重力井云数据

不幸的是,推论也是正确的:少量的数据没有“引力井”,因此很少吸引新的发展。

但是企业数据中心长寿还有第二个原因。经过多年的发展和增长,我们的企业数据环境变得错综复杂,相互依赖。大多数架构师可以指出他们的企业应用架构看起来更像英特尔的集成电路图。

但是应用程序之间的连接像蜘蛛网一样紧密地结合在一起。当我们移动一个应用程序时,我们拉动它的一条数据“蜘蛛网”,整个架构就会移动和变形。因此,在这个互联的数据网络中,即使很小的迁移也会产生巨大的影响,导致很长的时间表和相应的巨大成本。

图 2,解开数据蜘蛛网

解决办法

因此,云计算面临的挑战很简单。首先,在云上建立强大的数据引力井的最快、最有效、最高效的方法是什么?第二,我们如何在不彻底解开企业应用程序和数据蜘蛛网的情况下做到这一点?

这就是数据网格和“云迁移”解决方案模式的用武之地。 Data Mesh 云迁移解决方案模式将数据从任何类型的系统(事务性或分析性)中以近乎实时且不引人注目的方式移动到企业内安全的云原生数据产品中。

这种模式创建了原始数据的“实时副本”,并且不需要应用程序迁移。这提供了几个切实可行的好处:

  • 它并不引人注目,因此不需要任何应用程序更改,从而减轻了“理清”现有应用程序和数据蜘蛛网的需要。
  • 由于不需要更改应用程序,因此可以非常快速地部署这种模式。
  • 通过更简单的数据迁移,这建立了加速云迁移所需的云“数据引力井”。
  • 作为一个“实时副本”,数据在云上近乎实时可用,为 AI/ML 和高级分析等更新的云原生任务提供及时、一致和准确的数据。
  • 有了云上的可用数据,新的应用程序可以更快地开发出来,上市时间也可以大大缩短。

几个数据网格加速器模式用于提供此功能:

  • Live Replica 模式,以近乎实时的方式制作一个“副本”(相同的数据,如果需要,相同的结构)(关于该模式的详细文章将很快发表)。
  • 数据产品安全模式,确保数据产品管理的数据安全无虞(该模式的详细文章即将发布)。
  • 数据产品可观察性模式 ,使数据移动可追溯、可见。
  • 数据产品可操作性模式 ,确保数据产品中的异常和错误被记录并广播到适当的企业监控系统。

几种数据网格基本模式用于提供此功能:

  • 变更数据捕获模式 ,用数据产品捕获数据中的变更,使其可以传播给感兴趣的消费者,同时也提供理解数据谱系所需的原始数据。这种模式不引人注目地捕获数据库更改,并通过事件流主干将它们发布到云原生数据库中的目的地。“发件箱模式”是 CDC 不可用的替代模式。
  • API 模式 ,使数据易于访问。
  • 数据产品目录模式 ,使数据可被发现。
  • 不可变日志模式 ,提供对数据产品所管理的数据谱系的可见性。
  • 事件流骨干模式 ,以近乎实时的方式向数据消费者传输数据。

它是如何工作的

图 3(如下)展示了数据网格云迁移模式是如何工作的。

图 3,云迁移解决方案模式

  1. 复制:使用 Live Replica Accelerator 模式,将数据近乎实时地从交易、合约或分析系统复制到云原生数据产品。
  2. 发现 : 数据产品目录不可变日志基础模式提供了对数据产品所管理的数据以及数据产品中的数据谱系的可见性。
  3. 访问 : JSON 模式和 OpenAPI 规范(以及支持注册中心)使得 API 模式允许系统使用众所周知的方法查询和更新数据产品。
  4. 流式传输:数据从云原生数据产品流式传输到其他系统或数据产品,允许系统“监听”数据产品内的变化,同时还提供复杂的近实时分析和处理数据的方法。
  5. 可观察性、安全性和可操作性:使用数据产品可观察性、数据产品安全性和数据产品可操作性加速器模式监控云原生数据产品,确保云原生数据产品以安全、可靠的方式运行。

客户体验:金融服务机构采用云

我与 Thinh Ha 讨论了他在利用数据网格推动云应用方面的经验。Thinh 是谷歌英国专业服务部门的战略云工程师,他曾与许多客户合作建立云原生数据网格环境。据哈说:

Data Mesh 帮助我们建立了一个数据引力井,支持从数据中实现规模化价值,并将额外的使用案例和工作负载引入数据云平台。

我们选择与少量 data domain 团队一起构建数据网格,为组织证明单一的端到端业务流程。 我们着手构建云优先的数据平台,使 Data Domain 团队能够独立构建数据产品来证明业务案例,同时提供集中式安全和治理防护,以确保在我们采用联合运营模式时满足 关键控制。

谷歌云拥有一套丰富的技术来帮助你构建数据网格。作为数据平台团队的一部分,我们 创建了可自我服务且默认合规的代码模板,以部署完全托管和自动扩展的 Google 云产品,如用于 RDBMS 的 Cloud Spanner、用于流处理的 Cloud Dataflow 和用于数据仓库的 BigQuery。代码模板充当加速器,帮助 Data Domain 团队快速入门并简化操作。由于多云是客户的一项重要需求,我们还利用了诸如用于事件流的融合 Kafka 和用于数据编目的 Collibra 等服务。

随着我们开始验证数据网格,现有的 Data Domain 团队开始意识到,通过拥有自己的数据产品,他们可以从针对敏捷性的本地优化中获得显著优势。因此,Data Domain 团队开始独立构建新的业务案例,将额外的工作负载转移到平台上。


从那时起,我们不仅有了更好、更快、更便宜的见解。我们还建立了将更复杂的应用程序快速迁移到云的基础!

在我们的讨论中,Ha 发现 Data Mesh 允许他的客户在云上创建临界质量的新数据,这在云上建立了新数据引力井。Ha 的客户一开始规模很小,并且选择了一个重要但不平凡的领域作为起点。Ha 表示,他的客户现在获得了数据网格的更多好处:

  • 数据更加自助。
  • 数据产品将责任、决策和资金与明确的所有者联系起来。
  • 因为我们可以看到我们拥有的数据(目录等),我们现在可以建立一个轻量级的治理过程。

总结想法

如今,企业面临着一个根本性的挑战:尽管云有着显而易见的优势(灵活性、速度、成本),但向云的迁移却很缓慢。为什么?因为我们的数据遗产(仍驻留在企业数据中心的大量数据)有自己的“数据引力井”。当试图移动应用程序时,我们发现我们的“数据蜘蛛网”太难解开,而且成本太高。

本文展示了 Data Mesh 云迁移解决方案模式如何通过以安全、可靠和接近实时的方式简化创建云原生数据引力井来应对这一挑战。它还展示了如何在不影响您当前应用程序和数据环境的情况下做到这一点。

希望本文能为您提供必要的见解,帮助您启动自己的企业数据网格,并加速您的企业采用云技术!


除非另有说明,本文中的所有图片均由 Eric Broda(本文的合著者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

Eric Broda 在本文中表达的观点仅代表其个人,并不代表其客户的观点。

Thinh Ha(本文合著者)在本文中表达的观点仅代表其个人,并不代表其客户或谷歌的观点。

数据网格/数据产品安全模式

原文:https://towardsdatascience.com/data-mesh-data-product-security-pattern-c5b93a27e82e

数据网格/数据产品安全模式如何确保企业数据网格及其数据产品的安全

安娜·扎哈罗娃在 Unsplash 上的照片

数据网格/数据产品安全模式

数据是现代企业的基础构件。但是我们经常看到头条强调安全措施漏洞导致的灾难性后果。这些安全漏洞有很多种,从漏洞百出的周界到误入歧途的员工以及介于两者之间的一切。

数据安全是解决这些缺口的实践,以保护数字信息在其整个生命周期中不被未经授权的访问、破坏或窃取。数据网格提供了保护数据的独特机会。

本文将探讨数据网格/数据产品安全模式:

  • 保护数据产品的边界,数据网格的架构量子。
  • 为数据产品中的数据提供精细的安全性。
  • 确保企业数据网格中数据产品之间的通信安全可靠并受到监控。
  • 为企业数据网格中的每个数据产品构建一个安全的运行时环境。
  • 将安全违规转化为格式一致、定义明确的“安全事件”。
  • 通过将安全事件发布到企业运营和安全管理工具,集成到企业安全机制中。

本文假设您对数据网格有很高的理解。如果您需要一些关于数据网格的背景信息,这里有许多很棒的文章可供参考:这里的(模式)、这里的(架构)、这里的(原则)和这里的(经验教训)。对于感兴趣的读者,全套数据网格模式可从这里和这里获得。

模式摘要

数据网格提供了保护数据的独特机会。首先,它提供了数据产品,这些产品提供了可以应用安全性的明确定义的数据边界。第二,这些数据产品有所有者,确保域内数据安全有明确的责任和义务。第三,Data Mesh 提供了一个自助式访问模型,该模型提供了明确的合同,描述了谁能够或试图使用数据,如何使用数据。最后,它提供了一种便于监控数据安全性的联合治理方法。

数据网格/数据产品安全模式展示了一种为企业数据网格及其管理的数据产品应用安全性的一致方法。

背景和业务问题

企业数据的安全性建立在数据产品和数据网格组件中实现的安全策略的基础之上。如今,这些政策因以下原因而有所不同:

  • 产品(例如,Oracle 与 SQL Server)
  • 运行时环境(例如,AWS 与 Google)
  • 位置(例如,数据中心与云)

因此,数据和安全专业人员缺乏关于其数据网格运营、安全和治理特征的关键信息也就不足为奇了,这些信息包括:

  • 不明确的访问权限,使得难以理解消费数据所需的凭证、角色和/或权限。
  • 不一致的安全策略,使得遵守数据的监管和隐私要求成本高昂。
  • 缺乏使用信息,使得管理敏感数据的访问权限变得困难。
  • 出现安全违规的延迟,导致解决安全问题的延迟。
  • 安全环境中的差距,使得诊断安全违规变得困难且耗时。

数据网格/数据产品安全模式解决了这些问题。

解决办法

认识到数据产品是数据网的架构“量子”(即。数据网格是多个数据产品的混合体),数据网格/数据产品安全模式定义了数据产品的访问安全控制点:

  • 在数据产品的外围,
  • 在数据产品中,
  • 数据产品之间。

图 1,数据网格安全模式、安全策略和访问控制

在数据产品的外围,此模式识别以下安全策略:

  • 运行时环境安全性:虽然这些策略在很大程度上依赖于数据产品的运行时环境,但许多供应商中有几家提供跨内部和云环境的容器(Docker)、容器(Kubernetes)、虚拟机的安全性。
  • API 访问控制 : OpenAPI 规范,最流行的 API 契约定义,允许定义安全模式和“作用域”(与 OAUTH2 一起使用),规定访问数据产品的凭证。

在数据产品中,这种模式识别几种安全策略:

  • 基于角色的访问控制:对数据产品的访问可能仅限于那些具有特定角色或组的人。
  • 基于行的访问控制:安全策略允许单个行受到保护;当需要提升特权来访问数据产品中给定表的子集时,这可能很重要。
  • 基于属性的访问控制:安全策略允许保护各个列;访问数据产品中的敏感字段可能需要提升权限。
  • 数据加密和令牌化:静态数据根据数据产品中数据的敏感性进行加密或令牌化。

在数据产品之间,此模式识别以下安全策略:

  • 一般网络安全控制:这些是企业为管理网络访问和连接组件而建立的策略。
  • 基于主题/流的安全控制:事件主干上的主题/流之间的安全性在功能上与 API 安全性相同(即所需的“范围”和角色)。

这种模式有几个支持功能:

  • 企业身份记录簿:身份的主存储库,维护与分配的组和角色的关系(活动目录、云目录、大型机目录等)。).
  • 模式/规范注册中心:维护支持 API 和事件的灵活安全策略所需的“范围”和数据/事件结构
  • 治理控制:策略定义了数据产品的监管和隐私约束

数据网格/数据产品安全模式还捕获这些控制点的安全违规,并对所有安全违规安全事件进行建模。由于每个数据产品可能使用不同的技术来实现,因此这种模式将原始安全违规规范化为一致格式的安全事件。

这种模式还提供了支持各种消费者需求的能力:

  • 开发人员使用这种模式来帮助设计应用程序,使用安全消费数据产品的方法。
  • 数据工程师使用这种模式来构建和实现安全的数据产品和数据网格组件以及操作环境。
  • 数据科学家使用这种模式来理解访问和消费数据产品所需的安全凭证。
  • 安全人员使用该模式来捕获和诊断安全违规,以确保企业数据网格以安全可靠的方式运行。
  • 数据治理人员使用此模式来了解使用模式,并确保遵守法规和隐私约束。

它是如何工作的

数据网格/数据产品安全模式提供访问控制,以确保数据产品仅由授权实体或人员访问。它还检测企业数据网格中的数据产品,以捕获和发出安全违规,这些安全违规被转换为“安全事件”,提供操作和安全人员可使用的简明和详细的安全信息。

该模式分为三个部分,每个部分概述了典型使用场景中的关键步骤,描述了数据产品内的安全流(图 2)、数据网格中数据产品之间的安全流(图 3)以及不同类型的用户如何在数据网格安全模式中交互(图 4)。

图 2,数据网格安全模式,步骤 1–6

数据产品中的安全流如图 2 所示。在步骤 1 和 2 中,用户或应用程序产生了安全违规(例如,试图访问用户没有足够权限访问的数据)。在步骤 3 中,原始安全事件被捕获并转换成“安全事件”。这些安全事件然后被过滤和记录(步骤 4)并存储在不可变的变更/审计日志中,用于进一步的分析或历史回顾。每个安全事件随后在一个简单的用户界面(“数据产品目录”)中可用(步骤 5),这使得查看安全问题变得容易。最后,安全事件也通过 API 或事件传播(步骤 6 ),以允许它们在企业生产监控和安全解决方案中被吸收。

图 3,数据网格安全模式,步骤 7–9

在上面的图 3 中,我们可以看到数据产品之间的安全违规——例如,当数据产品没有足够的权限添加到主题时——被捕获并转换(步骤 7)为安全事件。如前所述,所有数据产品都会发出安全事件(步骤 8),这些事件发生在整个企业数据网格中的数据产品之间。然后,每个安全事件被格式化,以供企业运营和安全系统摄取(步骤 9)。

图 4,数据网格安全模式,步骤 10–12

在上面图 4 中,安全事件存储在企业数据产品目录中(步骤 10)。这允许各种用户(开发人员、数据科学家和数据工程师)查看安全问题(步骤 11),同时还允许将安全事件发送到标准企业控制台(监控、运营管理和安全应用程序)。

在本文的前面,我们提出了适当的安全功能必须解决的几个挑战。让我们重温一下它们,看看数据网格/数据产品安全模式如何解决它们:

  • 不明确的访问权限:数据网格和数据产品安全在数据产品目录中呈现出基于角色的访问控制(RBAC)和基于属性的访问控制(如果需要的话),使得使用数据所需的凭证、角色和/或权限易于理解。
  • 不一致的安全策略:数据网格和数据产品安全引入了一致的基于角色的访问控制(RBAC)和基于属性的访问控制(如果需要的话),使得使用数据所需的凭证、角色和/或权限易于理解。
  • 缺乏使用信息:数据网格和数据产品安全将数据产品目录中的使用数据以及安全访问违规暴露出来,使得管理敏感数据的访问权限变得非常容易。
  • 出现安全违规的延迟:数据网格和数据产品安全捕获安全违规,并将其立即发送到安全或操作控制台,以便及时诊断和解决安全问题。
  • 安全环境中的差距:数据网格和数据产品安全提供了丰富的环境(谁、什么、何时等等。)关于安全违规,使诊断和解决安全违规变得简单而及时。

总结想法

最近的头条已经清楚地表明,不安全的数据环境将对组织产生灾难性的影响。通过捕获安全违规并立即暴露安全违规及其背景,全面的数据网格和数据产品安全方法允许快速识别、诊断和解决安全问题。通过使用这些信息,它可以提供必要的洞察力来保护您自己的企业数据网格,并提供数据密集型组织所需的安全性。


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

本文表达的观点仅代表我个人,不一定代表我的客户的观点。

数据网格:面向未来的数据基础设施

原文:https://towardsdatascience.com/data-mesh-future-proofing-data-infrastructures-3f858301c2aa

使用数据网格构建健壮且可扩展的数据平台

照片由 Unsplash 上的 kirklai 拍摄

对利用数据中的业务洞察力的需求日益增长,迫使公司投资基础设施和人力资源,以转变其组织,使其成为数据驱动型组织。因此,组织变得越来越了解数据,一些组织甚至已经开始从中受益。尽管有这些充满希望的举措,但在许多组织中,成为数据驱动的迫切需要的文化转变仍然滞后。最近对多个行业的 94 家公司进行的调查显示,只有 26.4%的公司成功创建了数据驱动型组织,超过 90%的高管认为将公司文化转变为更加数据驱动型是瓶颈[1]。本文的重点是从基础设施的角度介绍近年来提出的一些想法,这些想法旨在从根本上转变组织,使其更加以数据为导向。

我们将开始讨论当今的数据基础设施是如何建立起来的,然后看一下我们可以从现代软件开发方法学中学到什么,并以此为序介绍数据网格,这是一种面向未来的数据基础设施的数据架构框架,有助于组织更加数据驱动。

我们现在在做什么?

从较高层次来看,目前许多组织中的原型数据基础设施由三个组成部分组成;数据源、数据仓库和数据用户。数据源代表生成数据的微服务和数据库,即数据的生产者。数据存储库可以是数据仓库或数据湖,数据通过数据管道存储在其中。数据用户通常是个人,如商业智能分析师和数据科学家,他们希望从这些数据存储库中产生价值,即数据的消费者。自从大规模集中式数据存储库出现以来,这一直是操作的标准,并随着技术的发展而修改。

在某种程度上,传统的数据基础设施框架已经工作了很长时间。事实上,集中式数据存储库为如何在组织内管理数据带来了更严格的要求。我们也见证了用于创建和维护这些数据基础设施的技术工具的爆炸式增长。然而,随着业务发展到新的和多样化的数据源,这些集中式数据存储库缺乏灵活性确实阻碍了大规模运营。它还在组织内部创建了筒仓,在这些筒仓中,面向任务的团队在不了解上游和/或下游流程的情况下处理特定的任务。这将最终导致组织内执行脱节、创新步伐放缓和缺乏问责,当目标是培养数据驱动的文化时,这不是一个理想的结果。最后,由于这种集中式框架,数据的生产者和消费者最终都依赖于丰富多样的工具堆栈来分别向这些集中式数据源提供数据和从这些数据源查询数据,这大大增加了构建和维护数据基础架构的总成本。总之,当今许多数据平台的重点开始变成由技能高超的数据专业人员在孤岛中移动数据,而不是以更具凝聚力的方式合作,从中提取价值和业务见解。

这种情况以前发生过

在我们介绍这个问题的解决方案之前,让我们看一下软件工程领域中存在的一个类似的问题。就在十多年前,软件开发人员普遍使用单片架构,它基本上是作为由三层组成的单一单元构建的应用程序;数据库、用户界面和服务器端应用程序。换句话说,应用程序是使用一个包含所有业务逻辑的大型代码库构建的。这种实践已经存在了几十年,并被证明对于构建功能性和安全性的应用程序是有效的。然而,随着业务的增长,这被证明是无效的扩展,无论是在更新一个极其相互关联的代码库方面,还是在必须垂直扩展可能带来的财务挫折方面。还可能有外部因素,如应用程序中使用的框架的更新,这可能会无意中在代码库的多个部分中产生兼容性问题,最终导致应用程序失败。

为了解决这些问题,基于微服务的软件开发架构应运而生,在这种架构中,许多代表业务逻辑的独立微服务被封装到一个应用程序中。基于微服务的软件开发架构是由 Eric Evans(T1)的领域驱动设计(DDD)激发的,简言之,应用程序中的每个微服务都是由理解它的人(即领域专家)创建的。这种架构的好处是它允许水平扩展,由于各种各样的成本和时间节省原因,它比它的对应物更有效。更重要的是,基于微服务的软件开发架构意味着您现在可以应用敏捷的产品管理框架,以可靠、高效的方式部署和维护应用。基于微服务的软件开发架构的早期采用者之一是网飞,他迁移到了基于云的微服务软件开发架构,以满足其视频流服务不断增长的需求[2]。

设计数据基础设施的范式转变

几年前,Zhamak Dehgani 提出了一个概念框架,用于设计下一代数据基础设施,称为数据网格[3–4]。数据网格是作为一种社会技术方法提出的,它彻底改变了数据基础设施的设计方式。回到我们关于微服务架构框架的出现如何改变软件开发的类比,数据网格被提出来利用这种范式来构建未来的数据平台。这是分布式领域驱动架构、自助式平台设计和产品思维的融合。简而言之,这个想法是从集中式数据存储库过渡到跨功能领域的团队,其中每个业务单元(人力资源、市场营销、销售等。)将数据视为一种产品,共同的目标是通过一个通用的基础设施平台,以一种可用的方式向组织的其他部分提供安全的数据。

数据网格的潜在好处是,您可以将数据所有权分散到负责该数据产品的团队(业务单元)。这将最终提高高质量数据的可访问性,为数据消费者提供更有效地收集见解的机会,加快组织的创新步伐。此外,数据网格的灵活性和分散性意味着随着组织和数据源的增长,数据网格模式可以轻松地扩展其操作。总而言之,通过产品思维和领域驱动的架构,data mesh 使单个业务部门更加数据驱动,使数据消费者能够通过快速实验创造商业价值。

目前,有一些组织已经在实践中采用了数据网格的一些元素。例如,欧洲最大的时尚在线平台 Zalando 采用了数据网格的原则来解决他们正在处理的一些问题,集中数据湖简化了数据共享[5]。在他们的努力中,他们引入了一个名为“自带桶”的概念,数据生产者可以将他们的数据插入集中式数据湖。另一端的数据消费者可以使用集中的数据基础设施层来访问这些数据。同时,组织内的数据流被集中的治理层所忽略。除了这些基础设施变化,Zalando 还应用行为变化来分散数据所有权,同时确保组织内的最佳数据质量。类似的结果也出现在盛宝银行、美国退伍军人事务部和罗氏公司[6]。

展望未来

数据网格不是一个可以开箱即用的技术产品。它只是一组原则,作为构建健壮且可扩展的数据平台的蓝图。它为高管和数据专业人员提供了一个机会,利用软件工程的严谨性来构建下一代数据基础架构,在整个组织中培养数据驱动的文化。然而,每个组织的数据需求都是不同的,因此需要对建议的数据网格模型进行修改,以适应其数据策略。与此同时,如果组织处于数据之旅的早期阶段,即数据和/或工程人才成熟度较低,实施数据网格可能没有切实的业务案例。尽管如此,仍然值得注意数据网格的原理,它是一种抢占和解决随着数据需求的发展可能出现的任何潜在瓶颈的方法。最后,考虑到其早期阶段,数据网格的运行将需要大量的资本和人员投资,以及协调的集中努力,以建立和维护所需的分布式基础设施。

参考

  1. Partners,n,《寻求实现数据驱动的领导力:企业数据计划状态的进展报告》,载于《2022 年数据和人工智能领导力调查》。
  2. 微服务与整体架构。可从:https://www . atlassian . com/micro services/micro services-architecture/micro services-vs-monolith 获取。
  3. 如何从单一数据湖转移到分布式数据网。2019;可从以下网址获得:https://Martin fowler . com/articles/data-monolith-to-mesh . html
  4. 数据网格原理和逻辑架构。2020;可从以下网址获取:https://Martin fowler . com/articles/data-mesh-principles . html
  5. 实践中的数据网格:欧洲领先的时尚在线平台如何超越数据湖。2020.
  6. 回顾,H.B .超越技术:用数据网格创造商业价值 2022;可从:https://www . thoughtworks . com/en-au/what-we-do/data-and-ai/data-mesh/creating-business-value-with-data-mesh-white paper 获取。

数据网格——如何让数据治理变得“可计算”

原文:https://towardsdatascience.com/data-mesh-how-to-make-data-governance-computational-258dd3a4d1cd

如何编写可自动化的策略,实施它们,并随着公司的成熟提高计算治理的速度

(照片由 大卫·莱维克https://unsplash.com/s/photos/robot?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)

在本文中,我将解释一个简单的框架,它将帮助您在数据网格中处理数据治理的“计算”部分。

我们将:

  • 解释“计算”的含义,但不要详细描述“联合计算治理”。关于这一点,你可以去查马克关于这个主题的原始文章。
  • 然后,我们将讨论使治理策略完全计算化的两个必要步骤。

本文节选自我在 MEAP 曼宁合著的《数据网在行动》 一书的草稿。

计算数据治理意味着自动化的数据治理。

对于计算数据治理,我们指的是自动化治理。这反过来意味着我们有办法自动检查某些数据策略。

实施计算治理的关键是理解,我们从一开始就实施它。我们只是从非常小且易于实施的政策开始。然后,随着迭代的进行,我们会推出更高级的策略。

使治理策略完全计算化的三个必要步骤是:

  • 第一步是以一种可以自动化的形式引入策略,
  • 步骤 2 是自动化执行,
  • 第三步是提高自动化的速度。

您可以选择适合您当前数据成熟度的自动化级别,并按照我们在第 2 步和第 3 步中展示的框架,通过不时地重复前两步来慢慢提高自动化级别。

我们的出发点是理解我们的政策,我们现在应该有一个书面的形式。例如,他们可以阅读:

策略列表 1。没有严格的访问控制,不允许共享任何个性化信息。

2.每个数据都应该包含标识其业务领域的元数据。

第一项政策旨在帮助实施隐私法规。相比之下,第二个旨在通过使用该公司在商业领域无处不在的语言来使数据更加公平。

这些例子都不是必须的政策;事实上,第二个对于一般公司来说可能太紧了,但是对于我们的例子来说,它们是合适的。

计算数据治理从数据网格的一开始就是必要的,以利用网格本身的特征。因为没有治理,就不可能以自助的方式消费或组合数据网格本身的节点。如果做不到这一点,就需要人工干预,而人工干预无法扩展,因此一开始就停止了数据网格。

步骤 1:使策略具有计算性

让政策具有计算能力意味着把它变成一种算法。

什么是算法? 我们可以简单地将算法松散地定义为一组可以自动遵循的步骤,可能有一个输入和一个输出。

将策略转化为算法听起来像是开发人员会做的事情。但那根本不建议。相反,治理团队应该这样做,因为将策略转换成算法总是会将特定的解释放入文字中,这意味着策略将通过该过程得到修改或澄清。

与此同时,治理团队还必须考虑他们希望通过实施特定的策略到什么程度。

让我们看两个例子来理解这一点。

例 1、业务领域信息 每个数据都应该包含标识其业务领域的元数据。

从我们的 MVP,治理团队可以很容易地将这个策略转化为算法,如下面的例子所示:

例题 1、业务领域信息算法 1。输入:来自中央注册中心的领域数据产品的元数据。

2.检索元数据中的“业务单位”键。

3.将其与业务单位列表进行比较。

4.输出:如果业务单位包含在列表中,则为 True,否则为 False。

治理团队将很快意识到,在这一点上,他们实际上必须在某个地方定义业务单元的列表。他们可能会选择忽略特定的单位,选择标准化的拼写,或者简单地参考已经存在的事实来源。

无论他们做什么,都会影响实际政策,并稍微改变它。

第二个例子更深入一点。

例 2、个性化信息 没有严格的访问控制,不允许共享任何个性化信息。

治理团队可能很难将这个策略放入算法中,我们也一样。最后一个策略只适用于一个特定的元数据字段,而这个策略适用于所有的数据内容。

在这种情况下,我们可以开发一个更简单的足够好的版本,如下所示。

举例 2、个性化信息 1。输入:一个实际领域数据产品的数据。

2.检查数据是否包含“名字姓氏”或“X@Y.Z”形式的数据或典型的 IP 地址。

3.如果不是这样,则返回 True,否则返回 False。

关键是算法策略将不同于我们想要实施的实际策略。只要我们牢记这一点,并在需要时更新算法策略,那就很好。

步骤 2 和 3:自动化策略检查

为了使规则自动化,我们有很大的自由度。车辆自主的六个级别可以作为一个很好的指导方针,让你自己慢慢迭代自动化的不同阶段

对于这两个示例策略,我们认为没有必要将它们变成完全自动化的策略。正如您在上一节中看到的,这非常困难。如果我们只是从我们的数据网格 MVP 开始,甚至可能没有必要将“业务单元”策略变成完全自动化的东西。

自动驾驶的六个级别大致可以概括为:

  • Level-0 :完全没有自动化。有人操作“一切”。那是你的起点。你自己开车。
  • Level-1 :辅助系统,提供某种帮助,如监控/报警,如速度监控器或距离监控器。
  • 级别 2 :该级别描述您想要自动化的系统的一部分的部分全自动化。但是运营商还是要做其他的事情。例如,汽车中的“保持距离”功能或“车道辅助”功能就属于这一类。
  • 级别-3 至 5 :完全自主运行,尽管是分步运行。我们不需要细节。我们保持它的“自主性”意思是你可以放开驱动轮了。

让我们将这些级别应用于我们的系统,即策略检查系统。如果我们将系统保持在 0 级,我们不会得到任何自动执行的策略。如果我们开始我们的“业务单元”政策,这可能是好的,但是一旦每周增加许多数据产品,我们将需要某种程度的自动化。

然而,如果我们认为个性化信息政策真的很重要,那么从一开始我们就需要某种自动化。我们的人力资源将无法处理大量的数据。

如果我们将第一个策略保持在 0 级,那么来自黄色团队的人将需要检查 JSONs 并验证它们。所以让我们暂时保留它。

个性化信息策略的一级系统看起来像什么?每次新数据被推入相应的 git 存储库时,都会启动一个脚本并遍历数据,搜索一些预定义的模式。作为一个监视器,它唯一应该做的就是将相应的行和找到的模式返回给推送数据的团队。然后他们可以自己决定是否违反了政策。

一旦黄队对他们的脚本感到有信心,他们可以决定通过推进部分自动化将它变成一个 2 级系统。这意味着他们会把它作为一个“预提交 git 钩子”安装在数据所在的存储库中。然后,每当有人将新数据放入存储库时,检查将在数据流入系统之前自动运行。如果不符合策略,黄队甚至可能通过返回错误来决定停止提交。

当然,因为检查个性化数据并不容易,这个自动化脚本仍然可能有问题。所以黄队会在第一次尝试时提供一个超驰选项。

用于该部分的3+级自治系统将具有改进的策略检查脚本,并且没有覆盖选项,可能将自动转换应用于个性化数据,以不停止发射团队的流程。这可能包括一个假名或一个“涂黑”功能。

正如您可能看到的,很容易快速迭代不同的阶段,根据人的瓶颈在哪里进行不同级别的各种检查,并考虑治理规则破坏的严重性。

结论

在本文中,您了解了如何通过使用一个简单的专注于治理策略的过程来实现数据治理的计算化。这三个步骤是:

  • 1.从可以转化为算法的政策开始。
  • 2.以算法的形式实现这些策略。
  • 3.然后使用自动化框架的级别来提高计算数据治理的速度。

我希望这些步骤能帮助您实现计算数据治理,因为它是数据网格的重要组成部分!

对如何建立伟大的数据公司、伟大的数据密集型产品、成为伟大的数据团队感兴趣,还是对如何利用开源构建伟大的东西感兴趣?然后考虑加入我的 免费简讯《三个数据点周四》 。它已经成为数据初创企业、风投和数据领导者值得信赖的资源。

数据网格可观测性模式

原文:https://towardsdatascience.com/data-mesh-observability-pattern-467438627572

数据网格可观察性模式有助于我们理解数据网格的状态、数据的移动及其使用模式。下面是这种模式的工作原理,以及为什么它对企业数据网格的成功至关重要。

粘土银行在 Unsplash 拍摄的照片

数据网格可观测性模式

数据网格承诺从根本上提高数据科学家的生产力。但是,除非我们对数据网格的状态、数据如何在其中移动、谁在使用它以及他们如何使用它有更好、更细粒度和更实时的了解,否则它可能不会辜负这些崇高的期望。

数据网格可观察性模式解决了这一挑战。首先,该模式捕获"可观察性事件 " —数据变更、数据移动、访问请求和数据产品内以及企业数据网格中数据产品之间的其他有用事件。

其次,它为数据科学家、业务用户、开发人员和治理专业人员提供指标和使用洞察,以提高生产力和优化数据网格操作。

第三,它向感兴趣的观察者(如企业控制台)发出可观察性事件,以提高数据网格的弹性、稳定性和效率。

第四,当数据在数据产品内和整个企业数据网格中移动时,它将可观察性事件关联到“数据跟踪”。这些数据跟踪提供了一种对离散和异步事件进行分组的独特方式,以提供数据演变和迁移的完整和统一的画面。

在本文中,我将探索这种模式是如何工作的,并具体讨论如何捕获原始数据,如何将其转换为有用的“可观察性事件”,以及数据专业人员如何使用这些可观察性事件。

对于感兴趣的读者,在介绍性文章这里和这里中可以找到全套解决方案、加速器和基本模式。

本文假设您对数据网格有很高的理解。如果您需要一些关于数据网格的背景信息,这里有许多很棒的文章可供参考:这里的(模式)、这里的(架构)、这里的(原则)和这里的(经验教训)。

模式摘要

数据网格可观察性模式捕获并显示数据网格状态、数据网格中数据的变化、数据网格中数据产品内部和之间的数据移动以及数据网格访问请求。它将这些数据建模为可观察性事件,这些事件被分组到“数据跟踪”中,并被聚合以支持各种消费者的需求。

数据网格可观察性模式被多种消费者使用:

  • 开发人员使用可观察性事件和数据跟踪来调试和优化应用程序。
  • 数据科学家使用数据跟踪来了解工程管道中的数据移动。
  • 治理专家使用可观察性事件和数据跟踪来理解数据使用模式。
  • 运营人员使用可观察性事件来确保企业数据网格以安全、高效和弹性的方式运行。

背景和业务问题

虽然技术已经实现了分析和人工智能/机器学习的巨大进步,但数据专业人员缺乏关于他们数据的基本信息:

  • 我有什么数据,我的数据是什么样的?
  • 我的数据发生了什么变化,什么时候发生的,谁更改了它?
  • 当数据在企业数据网格中的数据产品内部以及数据产品之间移动时,是否可以对其进行跟踪?
  • 关于数据关系,数据使用模式说明了什么?

从管理和治理的角度来看,还会出现其他问题:

  • 谁在访问我的数据,我的数据产品是如何使用的?
  • 是否有可用于优化我的数据网格操作的趋势和指标?

数据网格可观测性模式解决了这些挑战。

解决办法

数据网格可观察性模式捕获、过滤、聚集并提供跨几个维度的可观察性事件的可见性:

  • 数据产品变更事件,描述了一个数据产品如何在其生命周期内演化,通过变更数据捕获模式来捕获。
  • 描述数据产品如何被消费的数据产品访问请求被捕获并转换成可观察性事件。
  • 使用模式和趋势从原始产品访问请求中汇总,以深入了解数据产品的消费方式和消费对象
  • 数据产品格式、所有权和安全性也通过这种模式浮出水面

通过这种模式可以获得几种形式的数据:

  • 原始数据和事件,这可能有助于理解粒度使用模式和调试操作问题。
  • Observability Events ,它提供了所有事件的规范化视图,使它们易于搜索、排序、过滤和消费。
  • 数据跟踪,它对相关的可观察性事件进行分组,以了解数据的移动和演变。
  • 汇总数据,汇总和过滤事件,提供数据网格状态和操作的汇总和管理视图。

现在,让我们回到前面提出的挑战和问题,看看数据网格可观察性模式如何解决它们:

  • 我有哪些数据,我的数据是什么样的?数据网格可观察性展现关于数据产品状态的元数据,包括诸如数据库名称、其中的表格、列的格式等细节;这些数据在数据产品目录中提供。
  • 我的数据发生了什么变化,什么时候发生的,谁更改了它?数据网格可观察性模式捕获数据中的变化,它们发生的时间,以及谁改变了它。它通过数据产品目录以原始和汇总形式提供这些数据。
  • 在企业数据网格中,数据在数据产品内部和数据产品之间移动时是否可以被跟踪?许多现代数据环境使用粒度微服务来访问数据,因此通过调用一系列微服务来处理单个请求是非常常见的;数据网格可观察性模式使用“相关性”和“可跟踪性”标识符,具有相同相关性的可跟踪性标识符表示离散的请求是相关的;可以对单个数据产品访问请求进行分组,以提供“数据跟踪”,确定数据如何在企业数据网格中移动。
  • 关于数据关系,数据使用模式说明了什么?上述“数据痕迹”,尤其是在汇总时,可以提供一个关于数据产品如何使用以及数据产品中数据之间最常见关系的引人注目的视图。

现在,管理和治理问题怎么样:

  • 谁在访问我的数据,我的数据产品是如何使用的?数据网格可观察性模式捕获并记录所有访问请求,包括“读”和“写”。这为数据产品提供了原始数据使用模式。
  • 是否有可用于优化我的数据网格操作的趋势和指标?说明更广泛使用模式的聚合使用数据也可通过数据网格可观察性模式获得,并可通过数据产品目录访问。

它是如何工作的

在高层次上,数据网格可观察性模式的工作方式是捕获原始事件和状态信息,将其转换为“可观察性事件”以便于查看和使用,然后让用户可以访问它们。

图 1(如下)展示了数据网格可观察性模式是如何在粒度级别上工作的。

图 1,数据网格可观测性模式

数据网格可观察性模式中的关键活动描述如下:

  1. 应用程序读写数据产品。
  2. 数据产品 API 捕获关于谁、何时以及如何访问数据的信息。
  3. 数据产品中的数据变化也可以使用嵌入在数据产品中的变化数据捕获功能来捕获,从而提供关于数据如何以及何时演变的关键见解。
  4. 原始捕获的事件被规范化并转换成“可观察性事件”,这是用于提供数据网格可观察性的基本构建块。
  5. 可观察性事件被过滤并记录在不可变的变更/审计日志中,提供对数据产品活动的历史访问。
  6. 数据产品目录使用一个简单的用户界面公开可观察性事件,使数据消费者能够了解特定数据产品的数据生命周期和使用模式。
  7. API 还使用正式的 OpenAPI 规范公开可观察性事件,并定义安全的端点,以允许应用程序使用。
  8. 使用企业数据产品目录可以访问和搜索所有数据产品的可观测性事件;该目录为企业数据网格中的所有数据产品提供了一个统一的可观察性信息视图。
  9. 数据科学家、业务用户、开发人员和治理专业人员使用企业数据产品目录来搜索、查看和消费可观测性事件。
  10. 可观察性事件被发送到标准企业控制台(监控、运营管理和安全应用程序)。
  11. 所有数据产品都会发出可观察性事件,使它们在整个企业中普遍可搜索、可查看和可消费。
  12. 企业数据网格中数据产品内部和之间的所有数据移动都会发出可观察性事件。

作为一个额外的好处,该模式还支持“数据网格可跟踪性”,可以“跟踪”数据请求以了解端到端的流程。其工作原理如下:

图 2,数据网格可追溯性

数据网格可追溯性的关键活动描述如下:

  1. 发起一个查询。
  2. 查询被分解成离散的数据请求。
  3. 请求可能需要来自多个来源的数据,这使得它们难以跟踪和调试。
  4. 每个分解的数据请求都分配有相同的“数据跟踪”ID,以表明它们来自同一个传入请求。
  5. 所有请求都记录了相关数据(SQL、源等。)包括“数据跟踪”ID。
  6. 查询工作不正常。为什么?数据工程师如何理解发生了什么?
  7. 数据工程师使用企业数据产品目录来搜索和查看日志。
  8. 日志提供了对原始请求的查看,而且还将日志条目按其“数据跟踪”ID 分组,从而更容易查看请求的所有组成部分并诊断问题。

有趣的是,通过适当选择“数据跟踪”id 并合并“之前/之后”图像的数据(作为捕获的日志数据),扩展数据网格可观察性模式的可跟踪性特性以捕获数据血统信息并不困难。

总结想法

企业数据网是驱动实时数字企业的工厂。通过捕获数据产品内部以及数据产品之间的数据移动,该模式允许开发人员和生产人员理解高级使用模式以及跨企业数据网格的低级数据移动。

希望本文能为您提供必要的洞察力,以优化您自己的企业数据网格,并提供可见性来满足您的数据科学家、开发人员和操作人员的需求。


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

本文表达的观点仅代表我个人,并不代表我的客户的观点。

谷歌云上的数据网格——一个技术架构草图

原文:https://towardsdatascience.com/data-mesh-on-the-google-cloud-a-technical-architecture-sketch-c28fb0a6a4d9

如何使数据网格在谷歌云中技术上工作,以及如何将这些组件转移到其他云提供商

图片由作者提供。谷歌云数据网格架构。

数据网格不仅是技术的转变,也是组织、流程和人员的转变。我相信技术方面其实没那么重要。然而,由于我们还没有合适的工具,出于某种原因,为数据网格本身建立一个好的技术架构还是相当困难的。所以提供更多的工作示例似乎才是合理的!

这篇文章展示了 Google Cloud 上的数据网格架构,其灵感来自 ThoughtWorks 的 Samia Rahman 在 2020 年和 2021 年举办的“女性编码”的两部分研讨会,以及 DeliverHero 团队关于其数据网格灵感设置的演讲。

这篇文章基本上是我与人合著的《MEAP 曼宁 [【数据网格在行动】](http://Data Mesh in Action MEAP) 一书中一章的部分内容的草稿。就当这是一次窥探吧。当然,我喜欢反馈,因为这将使这本书更好!

好了,广告说够了,让我们开始吧!我们会…

  1. 使用几个假想的参与者提供一个高层次的架构草图
  2. 确定该平台的关键组件
  3. 确定数据产品的关键组成部分(这通常很难掌握)
  4. 浏览数据生产者和消费者的典型工作流程
  5. 然后讨论该体系结构的变体/附件

自助式数据平台架构

我们的数据网格有几个参与者。

  • 团队黑色是一个开发团队,也负责创建&维护数据产品。
  • 团队 White 是一个数据科学团队,既创造又消费数据产品。
  • 团队 Grey 拥有自助数据平台。在这种情况下,Grey 团队提供了一个可配置的 terraform 模板。
  • 最后消费者:我们有一些商业分析师和一个推荐系统,它们都主要消费数据。

下图描述了第一个版本中的架构。我们将在下一节考虑一些补充。看看谷歌云平台产品的技术设置是如何工作的。

图片由作者提供。GCP 数据网技术组成部分的详细结构

让我们来识别一个数据网格通常具有的不同组成部分。我们分两步来做,首先是平台的组件,然后是详细的数据产品组件。然后我们将尝试理解不同角色的用户流,最后考虑这个平台的一些变化。

识别平台的组件

平台的关键组件包括:

  • 一个平台内核,它应该经常改变以获取额外的价值
  • 一个平台接口,这个部分应该是尽可能固定的,以使平台工作。
  • 和补充或参与者。

前两个是技术组件。

在我们的架构中,平台 team Grey 提供了一个可配置的 terraform 模板。他们选择将最新的模板放在 Git 存储库中。在这种情况下,git 存储库和它的 README 文件成为了平台接口。模板变成了平台内核

有了这样一个最小的平台,就没有必要让一个完整的团队在这个平台上工作。平台内核可以通过提供新版本的 terraform 模板并让团队升级他们的堆栈来升级。这个平台目前的抽象程度非常低。

然而,由于数据产品的架构,模板已经为数据生产者和消费者提供了很多好处。

确定数据产品的组成部分

这些数据产品都共享基于云数据流及其相关临时存储的公共工具。这使得团队能够轻松地创建数据产品。云数据流允许团队创建以 Java、Python 或 SQL 输出数据产品的管道。

在团队 Black 拥有的数据产品中,团队选择直接连接到数据源,无论是 PubSub 还是一些 BigQuery 数据集。在这种情况下,数据输入端口,即获取数据到数据产品的接口,成为云数据流管道。它的上游数据源是 PubSub 和 BigQuery 数据集。

数据流管道产生一个 BigQuery 数据集。这个平台使用数据集作为数据产品的容器。一个数据产品只有一个 BigQuery 数据集。BigQuery 数据集可以保存多个表和视图,但是可以在数据集级别轻松处理访问权限。一个数据产品中有多个表是完全正常的。该数据集成为第一个数据输出端口

由于该平台使用共享服务 BigQuery,因此在每个数据产品中包含一个特定的 Google 服务帐户非常重要。这允许管理数据产品级别的权限

白队的第一个数据产品使用了一个 Google 云存储桶作为输入端口。这个存储桶允许用户以预定义的模式上传文件。上传时,数据流管道开始工作,将数据转换成 BigQuery 中的新数据产品。

您可以看到,数据端口是一个非常模糊的概念。我们这里有一个 GCS 桶形式的推送输入端口,一个数据流和上游数据集形式的拉取输入端口。最后,在白队的第二个数据产品中,我们将这两个数据产品结合起来,并再次将数据流与首先创建的两个上游数据产品一起作为输入端口。

对所有三种数据产品的访问都是通过服务帐户来管理的。每个都是单独配置的,以允许例如业务分析师访问某些重要的数据产品,或者让推荐系统完成其工作。

工作流程

希望创造新的数据产品的数据生产者将前往平台接口 GitHub repository。他们阅读自述文件,引入最新的 terraform 模板,并应用它为他们的新数据产品创建新的堆栈。为此,他们例如配置他们是否想要使用输入存储。

然后,他们配置他们的数据流管道,连接到可能的上游数据源,并配置他们的服务帐户,以允许访问必要的消费者集合。

另一方面,数据消费者使用 BigQuery SQL 接口来浏览数据产品。如果他需要访问一个新的数据产品,他会向拥有它的团队提出请求。

如前所述,这仍然是一个非常小的平台。

这种建筑的变体

一个简单的变化是将一组数据产品及其所有者包含到平台存储库中。这样,数据消费者将直接知道向谁请求访问。

另一组变化描绘在下面的图片。此图仅显示了可能的附加组件的平台环境,这些附加组件可以不按特定顺序使用。

图片由作者提供。附加平台组件的详细架构

首先,可以使用名为 DataHub 的工具,并将其直接连接到 BigQuery,作为分布式数据产品集的中央数据目录。该组件可以独立工作,无需添加任何附加组件。这将有助于消费者快速发现数据产品。

其次,通过访问 BigQuery 日志,可以通过“流行数据集”或“最频繁的数据用户”统计数据来丰富平台。这可以通过使用 GCP 日志记录和配置日志路由器以及 GCS 桶形式的日志接收器来实现。从 GCS bucket 中,一个定制组件可以计算这些统计数据,并将它们推送到数据中心。

第三,可以访问所有数据产品的另一个定制组件可以对组件运行定制数据质量检查,计算 nan 或运行由数据产品所属团队注册的定制检查。例如,一个对“客户”数据产品可靠的团队可以确保产品中的客户号总是以正确的格式出现。这个测试和结果也将暴露在 DataHub 中。

第四也是最后一点,裸露的 terraform 模板可以被包装成一个细长的图形用户界面。通过这样做,这个 GUI 可以用来通过需要手动设置的重要字段来丰富从 BigQuery 中提取的元数据。

关系到数据网格思想

尽管本文只是关于平台&技术实现,但是技术确实会影响数据网格的其他原则。

平台思维的原则是让所有平台参与者的生活更轻松,同时不限制他们的自由。这种架构在减轻其他团队的负担时也能帮助他们。例如,如果一家公司内的所有开发团队都在 GCP,并且都是像 PubSub & BigQuery 这样的共享服务的大量用户,就会出现这种情况。在这种情况下,模板将帮助团队通过数据流快速访问这些来源,并将它们转化为数据产品的数据集。

在上面概述的变体中,数据生成团队可能会将新的数据质量测试签入到中央存储库中,然后让中央质量组件运行它们。这可能会变成一个瓶颈,因为它可能会导致需要批准的 PR 请求和失败。如果出现这种情况,质量检查应该成为数据产品本身的一部分。然后,只有检查的结果会被暴露到 GCS 位置,并由中央组件获取,以推入数据中心。

联合计算治理仅在该架构中简要讨论,但有了中央数据中心,特别是用于注册数据产品的 GUI,以及对数据集本身运行检查的中央组件,就有很多空间将可自动执行的策略注入该平台。

在这个架构中,数据作为产品在很大程度上依赖于每个团队都有非常简单的方法来操作他们的数据。我们相信在这个例子中数据流服务于这个目的。

具有讽刺意味的是,该体系结构中的 Data Domain 所有权取决于服务帐户和访问控制,因为该体系结构使用大型共享服务。拥有访问的技术边界是至关重要的,否则,所有权不会真正落入数据生成团队的手中。

GCP 设置概要

这个平台架构利用了共享云服务,这些服务大多来自 GCP 环境。它使用了一些非 GCP 特有的组件,Git 和 Terraform,以及变体定制代码和数据中心。

它为数据生产者提供了一套转换数据的工具,但只有一个标准化的数据端口。然而,数据端口可以很容易地扩展到使用 Google Cloud PubSub 和 Google Cloud Storage,为您提供大量的目标格式,满足大多数消费者的需求。

该设置也可以通过微小的差异移植到其他大型云提供商 AWS 和 Azure。因为它们看起来非常相似,所以我们选择不在这里将它们显示为 1-1 映射。

如果你喜欢这篇文章,继续评论吧!

对如何建立伟大的数据公司、伟大的数据密集型产品、成为伟大的数据团队感兴趣,还是对如何利用开源构建伟大的东西感兴趣?然后考虑加入我的 免费简讯《三个数据点周四》 。它已经成为数据初创企业、风投和数据领导者值得信赖的资源。

数据网格可操作性模式

原文:https://towardsdatascience.com/data-mesh-operability-pattern-8e52a1955e54

数据网格可操作性模式帮助我们理解企业数据网格的操作特征。下面是这种模式的工作原理,以及它对企业数据网格的稳定性、弹性和性能如此重要的原因。

亚历山大·安德鲁斯在 Unsplash 上拍摄的照片

数据产品可操作性模式

生产环境的不稳定会影响企业的客户、开发人员的生产力,在极端的情况下,甚至会损害公司的声誉。由于数据网格仍处于发展的早期阶段,因此将稳定性和弹性直接设计到企业数据网格的基础中是一个很好的机会。

数据网格可操作性模式通过检测核心数据产品功能来应对这一挑战,提供对企业数据网格更细粒度和实时操作特征的可见性。

该模式捕获数据产品内以及企业数据网格中数据产品之间的“可操作性事件”—数据错误、安全违规、异常情况。它展示了原始的可操作性事件以及允许操作人员、开发人员和治理专业人员提高企业数据网格的稳定性和弹性所必需的聚合可操作性指标。最后,它向企业控制台发出可操作性事件和警报,以便直接集成到企业标准操作环境中。

在本文中,我将探索这种模式是如何工作的,原始数据是如何被捕获的,它是如何被转换成有用的“可操作性事件”的,以及这些可操作性事件是如何被运营、治理和数据专业人员使用的。

本文假设您对数据网格有很高的理解。如果您需要一些关于数据网格的背景信息,这里有许多很棒的文章可供参考:这里的(模式)、这里的(架构)、这里的(原则)和这里的(经验教训)。对于感兴趣的读者,全套数据网格模式可在此处和处获得。

模式摘要

数据网格可操作性模式捕获并显示数据网格操作特征和统计数据、性能指标以及异常/错误情况。它将这些数据建模为可操作性事件,对其进行过滤和汇总,以支持不同消费者的需求。

数据网格可操作性模式被多种消费者使用:

  • 开发人员使用可操作性事件来调试和优化应用程序。
  • 数据科学家使用可操作性事件来理解消耗数据网格资源的模型的操作特征和性能。
  • 运营人员使用可操作性事件展现核心运营特征,帮助企业数据网格以安全、稳定和高效的方式运行。

背景和业务问题

企业数据网格的稳定性和可靠性建立在易于访问的运营指标的基础之上。虽然技术已经使技术操作有了巨大的改进,但是数据工程师、开发人员和操作人员仍然缺乏关于他们的数据网格操作特征的基本信息:

  • 为什么,我的模型、应用程序或数据管道在哪里中断了?
  • 诊断生产信息所需的信息在哪里?

从运营管理和治理的角度来看,还会出现其他问题:

  • 特定数据产品或我的企业数据网格的性能如何?
  • 特定数据产品或我的企业数据网格有多稳定?
  • 在上一个报告期内,我的企业数据网格的停机时间有多长?哪些组件故障最多?

数据网格可操作性模式回答了这些问题。

解决办法

数据网格可操作性模式捕获、过滤、聚集并提供跨几个维度的可操作性事件的可见性:

  • 数据网格错误在每个数据产品的日志中被捕获。
  • 数据产品错误在数据网格消息和通信组件(如 Kafka)的日志中被捕获
  • 与性能、容量和可操作性相关的操作指标被捕获并汇总到“可操作性事件”中。
  • 稳定性模式和停机趋势从低级数据网格和数据产品日志中汇总,以提供有用的基于时间的可操作性特征。

通过这种模式可以获得几种形式的数据:

  • 原始日志,可能有助于理解粒度可操作性模式和操作特性。
  • 错误和异常日志,帮助诊断和调试生产问题。
  • 可操作性事件,提供各种日志的标准化视图,以便于搜索、排序、过滤和使用。
  • 汇总数据,其将相关的可操作性事件和日志分组,以提供数据网格操作特性的汇总和管理视图。

它是如何工作的

数据网格可操作性模式在企业数据网格中检测数据产品,以捕获和发出关键事件。这些原始事件被转换为“可操作性事件”,即提供一组一致的操作特征的标准化事件,可供数据科学家、工程师、开发人员和企业运营人员使用。

数据网格可操作性模式中的关键活动分为三个部分:

  • 步骤 1-7 描述了数据产品中的可操作性流程(图 1)
  • 步骤 8-10 描述了数据网格中数据产品之间的可操作性流程(图 2)
  • 步骤 10–13 描述了数据网格可操作性模式的使用(图 3)

图 1,数据网格可操作性模式,步骤 1–7

数据产品中的可操作性流程(步骤 1-7)包括:

  1. 应用程序与数据产品的交互会导致错误。
  2. 数据访问会产生安全违规。
  3. 数据库故障会产生停机时间指标。
  4. 原始捕获事件被规范化并转换成“可操作性事件”,这是用于提供数据网格可操作性的基本构件。
  5. 可操作性事件被过滤并记录在不可变的改变/审核日志中,提供对数据产品可操作性事件的历史访问。
  6. 数据产品目录使用简单的用户界面呈现可操作性事件,使数据消费者能够了解特定数据产品的数据生命周期和使用模式。
  7. API 还使用正式的 OpenAPI 规范公开可观察性事件,并定义安全的端点,以允许应用程序使用。

图 2,数据网格可操作性模式,步骤 8–11

所有数据产品都会在企业数据网格中的数据产品之间发出可操作性事件、警报、性能和可操作性特征(步骤 8-11):

8.数据网格内的数据产品之间出现通信错误

9.通信或互操作性错误被捕获并转化为可操作性事件。

10.每个数据产品的性能统计数据都会定期捕获。

11.使用企业数据产品目录可以访问和搜索所有数据产品的可操作性事件。

图 3,数据网格可操作性模式,步骤 12–14

企业数据产品目录展示了数据产品和企业数据网格的运营指标和特征(步骤 12-14):

12.可操作性事件被发送到标准企业控制台(监控、运营管理和安全应用程序)。

13.数据科学家、业务用户、开发人员和治理专业人员使用企业数据产品目录来搜索、查看和消费可操作性事件。该目录为企业数据网格中的所有数据产品提供了可操作性信息的单一统一视图。

14.所有数据产品都会发出可操作性事件,使它们在整个企业内都可以搜索、查看和使用。

现在,让我们重温一下前面提出的挑战和问题,看看数据网格可操作性模式如何解决它们:

  • 为什么,我的模型、应用程序或数据管道在哪里中断了?数据网格可操作性捕获并显示原始错误、异常和警报数据,以及标准化和聚合的可观察性事件,可以查明模型、应用程序或数据管道出现故障的位置。
  • 诊断生产信息所需的信息在哪里?数据网格可操作性模式捕获可观察性事件,并通过数据产品目录以原始和汇总形式提供这些数据。

现在是管理和治理问题:

  • 特定数据产品或我的企业数据网格的性能如何?数据网格可操作性模式为每个数据产品提供工具,以捕获和发出性能指标作为可操作性事件。这些事件以时间窗口为基础进行聚合,提供了在不同时间段和窗口对单个数据产品或整个企业数据网格的性能指标的可见性。
  • 特定数据产品或我的企业数据网格的稳定性如何?数据网格可操作性模式捕获数据产品和企业数据网格中关键组件的停机时间。
  • 在上一个报告期内,我的企业数据网格的停机时间有多长?哪些组件故障最多?对上述停机时间数据进行过滤和汇总,以提供企业数据网格中数据产品在选定时间窗口和报告期内的停机时间指标的可见性。

总结想法

一个不稳定的数据网格会带来灾难性的后果。通过捕获企业数据网格的操作特征,我们可以了解提高其性能、稳定性和弹性所需的信息。

希望本文为您提供了优化您自己的企业数据网格所需的洞察力,并提供了满足您的数据科学家、开发人员和操作人员需求所需的可见性


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

本文表达的观点仅代表我个人,并不代表我的客户的观点。

数据网格模式:更改数据捕获

原文:https://towardsdatascience.com/data-mesh-pattern-deep-dive-change-data-capture-eb3090178c34

探索疾病控制中心模式的来龙去脉

Data Mesh 使用变更数据捕获模式在企业内安全可靠地移动数据。让我们深入研究一下这个模式,看看它在企业数据网中是如何工作的。

照片由 Unsplash 上的 Dariusz Sankowski 拍摄

变更数据捕获:基础数据网格模式

Zhamak Dehghani 最近的【Data Mesh 文章介绍了一种全新的企业数据管理方式。域所有权、将数据视为产品、数据自助服务和联合数据治理方法的结合有望彻底改变企业数据管理。

但是实现企业数据网格还需要新的方法来处理企业数据管理的技术基础。因此,理解企业数据网格使用的支持这一功能的关键模式非常重要:

  • 变更数据捕获,企业数据网格使用它来跟踪数据库中的数据何时发生变更;这些变化被捕获为“事件”。
  • 事件流骨干,用于将 CDC 事件和其他值得注意的事件(例如,对数据网格的 API 调用)传达给企业数据网格中感兴趣的消费者(数据产品内部和之间)。(深潜可用此处)。
  • 企业数据产品目录,一个允许开发者和用户在企业数据网格中查看关于数据产品的元数据的存储库。
  • 不可变的变更/审计日志,它保留了企业数据网格中的数据变更,用于将来的审计和治理目的。

在本文中,我将深入第一个企业数据网格模式变更数据捕获。将讨论几个主题:

  • 模式总结,
  • 模式问题域和上下文,
  • 企业数据网格中的模式执行,
  • 实施 CDC 以支持企业数据网格模式的候选供应商。

本文是系列文章的第一篇。后续文章将讨论其他企业数据网格模式。

但是,在我们开始深入探讨之前,您可能希望回顾一下企业数据网格架构(此处提供)以及基础数据网格模式(此处提供)的概要。

模式摘要

变更数据捕获 (CDC)捕获数据库事务日志中的条目,并将它们(通过事件流主干)发布给企业中的任何相关方(应用程序、人员等)。这是在原始事务之外进行的,这意味着 CDC 可以捕获运营(或分析)数据的变化,而不会对原始应用或事务流产生任何影响。

背景和业务问题

即使在最好的情况下,在企业中安全、可靠且一致地移动数据也是一项挑战。企业使用几种方法来应对这一挑战,但有两种方法是最常见的。

首先,在跨多个数据库同步更新数据的情况下,可以使用“两阶段提交”(2PC)。不幸的是,这种方法既复杂又昂贵,通常只适用于保持多个数据源同步至关重要的情况。

第二种方法是使用 ETL (Extract-Transform-Load)技术首先更新主数据库,然后在一段时间后,更新第二个数据库。但是这种通常使用批处理实现的方法会导致数据陈旧、不同步和不一致。

解决办法

现代 CDC 产品通过提供用于捕获数据更改的可重复模式来解决这一问题,并且通过事件流主干等支持模式,提供了一种在企业内安全、可靠、快速且一致地移动数据的方法。

CDC 解决方案(尤其是与事件流主干相结合时)有许多优势:

  • 更简单的架构:在事务提交到本地数据源后,CDC 从数据库事务日志中捕获数据,从而消除了 2PC 挑战。
  • 非侵入式:通过在数据提交后捕获数据变更事件,CDC 不需要在源数据系统中进行代码变更;当从旧的遗留系统迁移数据时,这是一个关键因素,因为在许多情况下不允许更改代码。
  • 更简单的消费 : CDC 以 JSON 等易于使用的格式提供了每条数据变更记录的通用格式(通常是“之前”和“之后”的列数据加上相关元数据)。
  • 生产级集成:它们拥有生产级内置连接器,可连接到 Kafka 等常见事件平台,以安全可靠地传递数据变更。
  • 近乎实时的数据传输:使用 CDC 传输的数据近乎实时可用,从传统数据提交到收到 CDC 事件的时间通常在半秒(500 毫秒)或更短时间内。

它是如何工作的

图 1(如下)展示了变更数据捕获是如何工作的。

图 1:数据网格模式:变更数据捕获

  1. 数据库中的数据被更新(插入、更新、删除)。在许多情况下,这些更新发生在事务性或遗留数据库中,尽管我见过分析数据作为 CDC 来源的场景。
  2. 每个操作都在数据库的事务日志中提交。这是几乎所有数据库(事务数据库或分析数据库)的共性,构成了要捕获的数据的基本前/后映像。
  3. 变更数据捕获(CDC)系统捕获数据库事务日志中的每个条目,将事务日志条目格式化为具有众所周知的格式(通常是 JSON,由 JSON 模式定义)的“事件”。这些事件包含下游系统所需的所有信息,不仅包括数据的“之后”副本(即在提交发生之后)以及可用于审计/治理目的的数据的“之前”拷贝。
  4. CDC 将事件发布到由事件流主干(通常是 Kafka)管理的主题。事件流主干模式提供了多种抽象,使得跨企业发送数据变得容易:事件,由 JSON 模式定义,分布在企业数据网格中;主题用于在整个企业中排队和分发事件——企业数据网格使用众所周知的主题,这些主题通过允许许多实体发布和消费事件来充当队列;生产者将事件发布到主题——企业数据网中的生产者可能是 API、应用程序或 CDC消费者消费来自主题的事件——企业数据网格中的消费者可以是订阅主题并在事件可用于处理时得到通知的任何实体或应用程序;事件流处理器基于单个事件或基于时间窗口聚合来处理事件,从而在企业数据网格中实现非常复杂和强大的分析技术;代理管理上述组件,以确保整个企业数据网中安全可靠的事件通信。
  5. 主题的任何订阅者都会收到消息,并根据需要进行处理;订户可能会提前订阅主题。
  6. 在常见情况下,来自遗留系统的 CDC 事件由分析事件“消费者”接收。
  7. 分析消费者使用数据更改事件中的信息更新他们的分析数据库。
  8. 任何分析用户都可以使用近实时数据来使用同步分析库;例如,数据科学家可以使用近实时同步(50-500 毫秒往返)的分析存储库,使用最新数据训练他们的模型。

数据网格的模式使用场景

企业数据网格将 CDC(带有事件流主干)用于多种目的:

  • 将更改传播到下游订户和组织中的系统:数据网格使用它来同步数据产品内以及数据产品之间的数据;在企业数据网格中,AI/机器学习训练系统的模型由这种模式提供是很常见的。
  • 实现实时企业 : Data Mesh 利用近乎实时的数据捕获和传输来实现下一代分析和参与系统,这些系统依靠最新数据发展壮大。数据科学家认识到,接近实时的数据可以带来更好的结果。
  • 出于审计目的跟踪数据变更 : Data Mesh 捕获 CDC 事件,这些事件可以存储在不可变的变更/审计日志中,以支持审计和治理需求(这在任务关键型 AI/ML 应用程序中尤其重要)。

考虑下面的例子:一个客户分析知识库被用来训练关键的 AI/机器学习模型。但是,数据是使用隔夜批处理过程填充的。因此,数据科学家意识到这些数据是不一致的,需要大量的数据工程工作来清理。他们还意识到数据是 24-48 小时前的,这种陈旧的数据会导致较差的 AI/ML 模型结果和预测。

图 2:数据网格用例:CDC 和 AI/ML 模型

在企业数据网格中使用 CDC(和事件流主干),情况如下(图 5):

  1. 操作数据被更新。
  2. 变更数据捕获(CDC)从操作数据库中捕获数据,并将其转换为事件。
  3. CDC 将事件(包含有关最近数据更改的所有信息)发布到事件流主干。
  4. 分析系统(近乎实时地)收到数据更改事件的通知,并将其加载到其分析数据库中。
  5. 数据科学家从分析数据库中获取近乎实时的数据,并使用这些数据来训练他们的模型。
  6. AI/ML 模型产生杰出的结果,因为它们使用最新的模型!

供应商前景

我合作过的 CDC 产品中有两种非常受欢迎且功能强大。我很乐意推荐在企业数据网格中使用它们中的任何一种,尽管对于您的特定情况,我所概述的差异可能会使一种比另一种更好:

  • Debezium :这可能是最流行的开源解决方案,理由很充分。首先,它与 Kafka 的源连接器一起开箱即用,因此与最流行的事件流主干产品一起工作时只需最少的配置和设置。第二,它集成了许多流行的数据库产品,包括 Postgres、MongoDB、Oracle 等;第三,它有一个非常活跃的贡献者社区,这预示着它的长远未来。如果您正在将现代的基于 SQL 的数据库或 NoSQL 数据库集成到您的企业数据网格中,这是“首选”解决方案。
  • Connectfrom precise:该产品提供了出色的 CDC 功能(类似于 Debezium),但也集成了大型机数据源,包括旧的 IMS 和 VSAM 数据库(Debezium 尚未提供)。这使得它成为旨在加速“大型机现代化”计划的大型企业数据网格实现的主要考虑因素。

完全披露:我在推荐上述任何产品方面没有任何经济利益——我之所以强调这些产品,是因为我有一些使用它们的经验,它们对我来说效果很好。

总结想法

企业数据网格使数据在企业内安全、可靠、快速、一致地移动变得容易,从而支持实时数字企业。CDC 是用来提供这种能力的几种基本模式之一。

希望本文能为您提供构建 CDC 功能和启动企业数据网格所需的洞察力!


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

数据网格模式:事件流主干

原文:https://towardsdatascience.com/data-mesh-pattern-deep-dive-event-streaming-backbone-99a5bb2a7cbf

事件流主干是一种基本的企业数据网格模式。让我们探索一下它在企业数据网格中是如何工作的。

照片由在 Unsplash 上反推

事件流骨干网:一种基本的数据网格模式

本文讨论事件流主干,这是关于基础数据网格模式的系列文章的第二篇。将讨论几个主题:

  • 模式总结,
  • 模式问题域和上下文,
  • 企业数据网格中的模式执行,
  • 实现事件流主干模式以支持企业数据网格的候选供应商。

本文假设您对数据网格有很高的理解。但是不要担心,如果你需要复习,看看下面的资源:

  • 数据网格原则(更多信息可在这里获得)
  • 数据网格架构(更多信息请点击这里
  • 数据网格模式(更多信息见此处)

本文末尾提供了完整系列文章的列表。

模式摘要

Event Streaming Backbone ”模式用于以接近实时的方式在数据产品内、企业数据网格中的数据产品之间以及更大范围的组织内移动数据(建模为事件)。

背景和业务问题

如今,大多数企业仍在使用通宵批处理流程,运行数百甚至数千个“提取-转换-加载”(ETL)作业,处理数据并将其转移到整个企业的不同数据集。这会导致不必要的复杂性、陈旧和不一致的数据,并最终导致客户投诉。

解决办法

事件流主干模式负责安全、一致、可靠地管理和分发“事件”,并且接近实时。在企业数据网格中,每个事件代表一个应用程序状态变化、一个 API 消息或企业数据网格中数据变化的通知。事件通常在 Apache Avro 或 JSON 模式中定义。

事件流主干使用主题来存储事件。事件被发布或写入到类似队列的主题中。应用程序可以充当生产者(写入主题)、消费者(读取主题),或者两者兼而有之。

事件流主干模式还提供了复杂的处理能力:

  • 事件源/持续:主题上的事件作为事件序列存储在只附加日志中;这允许应用程序状态是可恢复的,同时还允许在企业数据网格中重放事件的时间窗口(这在生产问题诊断期间非常有用)。
  • 数据谱系:事件源机制创建“事件历史”——实际上是数据谱系——为问题诊断以及企业数据网格中的数据治理提供有用的信息。
  • 事件流处理:事件流主干允许在每个事件、时间窗口或聚合的基础上对事件进行分割;由于事件是由流式引擎中的内核功能处理的,因此在企业数据网格中很容易获得接近实时的事件处理功能。
  • 事务性:事件流主干允许使用事务语义产生和消费事件;这提供了一种“全有或全无”的功能,将写/读主题和外部操作(如写入数据库)绑定在一起,在企业数据网格中提供了与我们对数据库的期望相同的一致性、安全性和可靠性。

事件流主干模式,尤其是当与 CDC 模式结合使用时,建立了一个可重复的模式,用于在企业数据网格中捕获和交流数据变更。这些方法有几个好处:

  • 不太复杂的架构:它透明地从一个数据源捕获数据,并将其传递给任何下游实体,并为企业数据网格培育一个非常受欢迎的松散耦合架构。有了事务处理能力,围绕数据一致性的许多繁重工作都以无缝的方式得到了解决。
  • 易于使用:它使用行业标准 JSON 模式(以及其他格式,如 AVRO)为所有在企业数据网格中管理的事件提供了一种通用格式。
  • 生产级集成:它具有通用数据库和云 SaaS 解决方案的生产级内置连接器,可以轻松地在企业数据网格和更广泛的组织之间安全可靠地传递数据变更。
  • 近实时数据传输:通过事件流主干传输的数据是近实时可用的;事实上,从发布事件到收到事件的时间通常在 50-500 毫秒之间;如果您的组织正在向所谓的“实时企业”发展,那么事件流骨干网必须是您的企业数据网的一个关键考虑因素。

它是如何工作的

图 1(下图)展示了事件流主干在企业数据网格中的工作方式。

图 1:数据网状模式:企业流骨干网

  1. 授权的“制作者”发布事件;在企业数据网格中,常见的生产者可能包括变更数据捕获工具、数据产品组件(目录、变更/审计日志)、应用程序和批处理作业。
  2. 使用事件流组件在事件发生时对其进行处理,允许在企业数据网格中的时间窗口内对每个事件进行连续处理、聚合和分析。
  3. 授权消费者,并在事件到达主题时得到通知;消费者获取事件并根据需要处理它;企业数据网格中的普通消费者可能包括数据网格中的其他数据产品、数据科学家(他们使用事件来更新他们的模型训练数据)、应用程序和其他分析系统。
  4. 事件代理管理事件流主干上的事件流,并确保事件在企业数据网格中安全可靠地传输。

企业数据网格的使用场景

事件流主干的一个特别有趣的用例是,当它与"变更数据捕获 " (CDC)模式相结合,将变更从一个数据产品传播到另一个数据产品时。

例如,如今的数据科学家往往依赖陈旧的数据(在通宵批量运行后可用)来训练他们的模型。在企业数据网格中,带有 CDC 的事件流主干从运营系统中捕获数据,并近乎实时地将其同步到分析或培训数据存储库。结果是:数据科学家现在可以用最新数据训练 AI/ML 模型,并产生最佳输出。

供应商前景

下面是实现事件流主干模式的产品列表,其中每个产品都在企业数据网格中运行良好。

  • Apache Kafka:Kafka 的开源发布是所有事件流骨干评判的基线。它最初是在 LinkedIn 上经过实战检验的,现在已经在全球范围内使用。这简直是一个神奇的产品!对于大型企业来说,唯一需要考虑的是产品支持——只要这很重要,大多数组织都会求助于供应商支持版本。
  • Confluent Kafka:Confluent 是 Apache Kafka 的主要企业支持供应商。但 Confluent 也在此基础上构建并扩展了它,以提供一组引人注目的功能,包括云原生支持(沙箱、生产运行时环境和端到端托管实例)、包括时间窗处理在内的复杂事件处理功能,以及独特的流处理工具,如 KSQLDB ,使大规模执行流处理变得更加容易。
  • 云流媒体供应商:虽然您可以在所有云供应商上安装和运行 Kafka,但每个供应商都提供类似的针对其云进行优化的功能(与其他供应商特定的集成)。AWS 提供MSK(Apache Kafka 的托管流媒体),Azure 提供事件中心,谷歌提供 PubSub 。这种方法有两个考虑因素,根据您的情况,它们的重要性可能会有所不同:首先,由于使用了特定于云的功能,这些功能不容易被否决/删除,因此会受到供应商的限制;其次,在混合的本地和云环境中运行通用 Kafka 发行版时会增加复杂性(对于使用 Kafka 将数据中心中运行的应用程序集成到云环境中的大型企业来说,这种情况很常见)。

完全披露:在推荐上述任何产品时,我没有 经济利益——我强调这些产品是因为我对它们有一些经验,它们对我很有效。

本系列的其他文章

下面列出了本系列中关于基础数据网格模式的全部文章。

  • 变更数据捕获(CDC)模式,它跟踪数据库中的变更,并将它们捕获为“事件”。此条可用 此处
  • 事件流骨干模式,CDC 和其他应用程序使用它来发布和订阅/接收企业数据网格中的事件(本文)。
  • 企业数据产品目录模式,这是一个目录/存储库,包含关于企业数据网格中数据产品的元数据(即将推出)。
  • 不可变的变更/审计日志模式,它保留日志并跟踪企业数据网格中的数据沿袭,用于未来的审计和治理目的(即将推出)。

总结想法

事件流主干是一种基本的数据网格模式。它是在企业数据网中以安全、可靠和一致的方式移动事件(以及数据)的高速公路。

技术细节——以及提供的 rational 应该帮助您启动事件流主干的设计和实现,并引导您的企业数据网格!


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

数据网格模式:企业数据产品目录

原文:https://towardsdatascience.com/data-mesh-pattern-enterprise-data-product-catalog-ba4bf072d7c3

企业数据产品目录使得在企业数据网格中查找、可视化、使用和管理数据变得更加容易。让我们详细看看这种模式是如何工作的,以及企业数据网格是如何使用这种模式的

丹尼·米勒在 Unsplash 上的照片

企业数据产品目录:基础数据网格模式

本文讨论企业数据产品目录,这是关于基础数据网格模式的系列文章的第四篇。我将讨论模式总结、问题域和业务上下文、模式如何工作,以及支持该模式的候选供应商。

本文假设您对数据网格有很高的理解。如果你需要一些关于数据网格的背景信息,这里有很多很棒的文章这里(原则),这里(架构),这里(模式)。

本文末尾提供了完整系列文章的列表。

模式摘要

企业数据产品目录是一个“目录的目录”,它使得在任何具有企业数据网格的数据产品中查找、可视化、消费和管理数据(更具体地说,元数据)变得容易。它是在企业数据网格中查找、查看、使用和治理数据的一站式商店。

背景和业务问题

现代企业被数据堵塞了。数据存储在运营数据源、遗留平台、数据仓库、数据湖以及现在所谓的数据湖库中(还有很多)。企业,或者更具体地说,那些负责保护、治理和使用企业数据的专业人员所面临的挑战是,数据很难找到。

而一旦发现,就很难理解了。并且一旦发现并理解,就很难确定它是否是最新的或准确的:它是“记录在案”的质量,还是几天前的?或者它是否已经被转换,如果是,如何、何时、由谁、或哪个应用程序转换?

这些都是当今需要解决的具有挑战性的问题:单个特定于应用程序的解决方案过于狭隘,业务组孤岛解决方案产生有限的信息孤岛。而且,即使它们可以被聚合,那么多独特的解决方案又如何被组合在一起以提供用户真正需要的东西:一个用于查找、查看、管理和使用企业数据的一站式商店。

解决这个问题的一个常见但有问题的方法是使用“主数据管理”(MDM)方法。不幸的是,MDM 复杂、昂贵,并且很少(如果有的话)在大型组织中工作。

为什么?主要是因为一个简单的观察:大多数实现中的 MDM(现在)试图将数据复制/集中到一个新的“主”中,即使一个现有的主已经存在,通常是在操作系统中。这种对集中化的需求与康威定律(Conway's Law)背道而驰,康威定律是人类行为的一个基本真理,因为系统(和数据)与组织的结构(更具体地说,是其决策和融资结构)相一致。换句话说,激励和人类行为强烈支持将数据保存在拥有数据的各种联合团体中。

相反,Data Mesh 通过“数据产品”和“企业数据产品目录”解决了这个问题,它们允许数据停留在它已经驻留的位置,并通过 API 使它可用(这是 Data Mesh 的核心原则之一)。数据网格方法不需要移动数据,不需要整合数据,不需要冗长的辩论,也不需要组织上的麻烦。但是最重要的是,数据网格提供了对主数据所在位置的更好理解。

解决办法

企业数据产品目录是在企业数据网格中查找、查看、管理和使用数据的一站式商店。有几个组件直接与企业数据产品目录交互或向其提供信息:

  • 数据产品目录
  • 模式注册表
  • 不可变的变更/审计日志

解决方案组件:数据产品目录

首先,数据产品目录是关于包含在企业数据网格中的数据产品的信息(“元数据”)的存储库。但它也为用户(可能包括开发人员、数据治理专家和数据科学家)提供了查找、分析和查看数据产品所包含的数据信息的方法。

数据产品目录包含来自多个来源的数据/元数据,包括:

  • 变更数据捕获
  • 模式注册表
  • 不可变的变更/审计日志

一个数据产品目录由几个用户使用:

  • 数据科学家使用它来寻找数据产品中的数据,并理解其结构和格式,以训练 AI/机器学习模型。
  • 业务用户使用它来查找和消费数据,以便做出决策。
  • 开发人员使用它来查找和理解数据结构和格式,以构建和集成应用程序。
  • 治理专家使用数据沿袭和消费模式来治理和审计数据,并支持监管需求。

图 1,数据网格模式:数据产品目录模式

  1. 变更数据捕获 (CDC)获取并发布代表运营、分析和参与数据源变更的事件(使用事件流骨干);数据产品目录是这些事件的监听器。
  2. 不可变变更/审计日志获取并发布代表数据沿袭变更的事件;数据产品目录是这些事件的监听器。
  3. 模式注册中心获取并发布代表 JSON(或 AVRO)模式的事件,这些模式定义了数据产品目录中数据的结构、格式和内容;数据产品目录是这些事件的监听器。
  4. 数据产品目录包含关于由数据产品管理的数据的元数据(关于数据的数据)。
  5. 数据产品目录有一个用户界面,可以方便地查找、查看和使用数据产品中的数据结构。
  6. 许多不同类型的用户访问数据产品目录:数据科学家使用它来了解用于训练模型的数据结构;业务用户使用它来了解用于做出关键业务决策的数据;开发人员使用有关数据和事件结构的信息来构建应用程序。
  7. 治理专家使用数据产品目录来理解数据血统和消费模式。

解决方案组件:架构注册表

数据产品目录包含几种类型的元数据。它包含对由模式注册中心管理的模式的引用。这些模式定义数据产品中的事件和数据(如果需要的话)。这些模式用于帮助用户理解数据结构、格式和组件/元素数据类型,这使得理解和可视化数据产品中的数据变得容易。下面的图 2 显示了模式注册中心是如何工作的。

图 2,数据网格模式:模式注册中心

  1. 开发人员在 JSON(或 AVRO)模式中定义他们的应用程序使用的事件或数据结构。
  2. 管理员将模式发布到模式注册中心
  3. 一旦发布,模式就可供使用。
  4. 开发人员或任何其他用户都可以使用 API 从模式注册中心查询和使用模式。
  5. 在发布事件之前,生产者的事件根据模式注册表中的模式进行验证;仅发布经过验证的消息。
  6. 消费者只接收经过验证和明确定义的事件。
  7. 产品数据目录访问数据产品目录中的事件定义。

解决方案组件:不可变的变更/审计日志

数据产品目录包含对数据产品不可变变更/审计日志中维护的数据沿袭事件的引用。这使用户能够发现、了解数据在企业数据网格中更新和传输时是如何变化的。

这有多种用途:数据科学家使用数据产品目录来了解训练数据的谱系,以实现其模型的可再现性、可追溯性和可验证性,这已成为企业(和监管机构)的主要关注点。但这也使数据产品成为数据治理专业人员的主要“首选”工具。对于审计专业人员来说,当访问元数据和数据历史可以方便地搜索和可视化时,法规问题可以更容易地解决。

企业数据产品目录:工作原理

企业数据产品目录是一个“目录的目录”。它是访问所有本地数据产品信息的门面/代理。在大多数实现中,它并不物理地维护数据产品或模式注册数据。

相反,它为每个本地数据产品提供了一个简单的端点注册中心(API)和模式注册中心,用于根据需要“拉取”相关的元数据。这种方法避免了跨企业数据网格的元数据的重复,同时避免了整合和保持单个数据产品目录(即困扰“主数据管理”的问题)。

图 3(下图)展示了企业数据产品目录是如何工作的。

图 3,数据网状模式:企业数据产品目录

  1. 企业数据产品目录已为所有本地数据产品注册了 API 端点。
  2. 模式注册中心和每个数据产品中都提供了 API,可以方便地访问所有相关数据。
  3. 企业数据产品目录调用数据产品的 API 来从数据产品目录和不可变变更/审计日志以及模式注册表中“拉出”数据。
  4. 所有本地数据产品元数据都是根据需要提取的(通过 API 访问)。
  5. 数据科学家使用元数据来改善 AI/ML 模型训练,业务用户使用元数据来改善决策,开发人员使用数据和事件信息来构建应用。
  6. 企业数据产品目录中的元数据用于管理企业数据和理解消费模式。

供应商前景

下面是实现事件流主干的产品列表,每个产品都将在企业数据网格中工作。

  • Schema Registry: Confluent 的 Schema Registr y 非常可靠,它支持 JSON 模式(我最常用的模式)和 AVRO 模式; RedHat 的服务注册中心看起来与 Confluent 的产品即插即用兼容,并且支持多种模式类型(尽管我没有使用过这个产品)。
  • 企业/数据产品目录:我不得不在很大程度上构建定制的数据目录,所以我不太熟悉具体的供应商产品,尽管有几个像玛格达、阿蒙森和亚特兰看起来很有前途。

完全披露:在推荐上述任何产品时,我没有任何经济利益——我之所以强调这些产品,是因为我有一些使用它们的经验,它们对我来说效果很好。

本系列的其他文章

下面列出了本系列中关于基础数据网格模式的全部文章。

  • 变更数据捕获(CDC)模式,它跟踪数据库中的变更,并将它们捕获为“事件”(此处可用)。
  • 事件流骨干模式,CDC 和其他应用程序使用该模式在企业数据网中发布和订阅/接收事件(此处可用)。
  • 不可变的变更/审计日志模式,它保留日志并跟踪企业数据网格中的数据沿袭,用于未来的审计和治理目的(此处可用)。
  • 企业数据产品目录模式,它是一个目录/存储库,包含关于企业数据网格中数据产品的元数据(本文)。

总结想法

企业数据产品目录是一种基础模式,它使得查看、使用和治理由企业数据网格管理的数据变得简单。技术细节——以及 rational 提供的——应该(有希望)帮助您启动事件流主干的设计和实现,并引导您的企业数据网格!


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

数据网格模式:不可变的变更/审计日志

原文:https://towardsdatascience.com/data-mesh-patterns-immutable-change-audit-log-aec93da33648

让我们回顾一下企业数据网格是如何使用“不可变变更/审计日志”模式的。

米克·豪普特在 Unsplash 上的照片

不可变的变更/审计日志:一种基本的数据网格模式

本文讨论不可变的变更/审计日志,是关于基础数据网格模式的系列文章的第三篇。我将总结该模式的目的、它的问题域和业务上下文、该模式如何工作,以及支持该模式的候选供应商。

本文假设您对数据网格有很高的理解。如果需要的话,下面的文章应该会给你一些背景知识:

  • 数据网格原则(更多信息可在这里获得)
  • 数据网格架构(更多信息请点击这里
  • 数据网格模式(更多信息见此处)

本文末尾提供了完整系列的基础数据网格模式文章的列表。

模式摘要

不可变的变更/审计日志模式跟踪企业数据网格中的数据沿袭。它通过建立数据变更日志来实现这一点,该日志通常来自企业数据网格的变更数据捕获 (CDC)系统,可以对其进行聚合、分析和切片,以支持审计和联合治理需求。

背景和业务问题

大多数大型企业都被看似简单的问题搞糊涂了。我的数据从哪里来?当它从一个应用程序和数据库转移到另一个应用程序和数据库时发生了什么?谁对数据进行了更改?

但是为什么这很重要呢?首先,最简单的是,数据治理所需的基本“良好卫生”使其变得有用,并且在许多情况下是大型企业所必需的。但更重要的是,尤其是在金融服务和医疗保健等受监管行业,它是由监管机构强制执行的。

例如,在金融服务监管机构要求“重要的”人工智能/机器学习模型(即。那些直接影响人或财务风险/状况的风险是可重复、可追踪和可验证的。满足这一需求意味着企业的数据血统必须被很好地建立、理解,并且在接到通知后立即可用/可视化。

不幸的是,企业不得不拼凑一些定制的解决方案,每个解决方案都针对特定的应用程序或数据库配置文件。因此,毫不奇怪,企业会留下一组不一致的工具和能力差距,最终阻碍敏捷性和上市时间。

解决办法

不可变的变更/审计日志使企业能够理解、可视化和报告数据单元的生命周期——或沿袭(注意,我使用的“数据单元”是最广义的,因为它可以是数据元素、数据行、数据表,这取决于您的具体情况所需的粒度。)

不可变的变更/审计日志监听(在事件流主干上)数据变更事件。它收到数据变更事件的通知,并自动捕获数据单元中的变更(使用变更数据捕获模式),将数据单元变更(和元数据)呈现为“数据沿袭事件”,将事件存储在仅附加的持久日志中,并发布数据沿袭事件(使用事件流骨干模式),以便其他感兴趣的下游方可以消费数据沿袭事件。

它还提供了将数据变更事件转化为可操作见解的工具。低级数据更改事件被分组和聚合,以查看单个数据单元的生命周期,可视化工具使查找和查看数据单元的生命周期和沿袭变得容易。

请注意,将这种模式与流行的“事件源”模式混为一谈是一个常见的错误(为了方便起见,关于事件源的一些精彩信息可以在这里的、这里的以及这里的中找到)。但是有一些重要的区别。

在事件源提供事件的持久日志的情况下,不可变的更改/审核日志将数据单元更改(在数据映像之前和之后)与导致数据更改的事件联系起来。

事件源中的主要实体是事件,而 不是 它所作用的数据单元,不可变变更/日志模式中的主要实体既是数据单元 又是 它所作用的事件。

它是如何工作的

图 1,数据网格模式:不可变变更/审计日志

  1. 变更数据捕获 (CDC)从运营、参与或分析数据库的数据库事务日志中捕获数据变更,将其格式化为事件,并发布事件(使用事件流主干)供下游系统使用。
  2. 其中一个下游服务是“聚合微服务”,它接收 CDC 数据更改事件并创建一个数据沿袭记录,该记录将数据的“之前”(数据更改之前)&“之后”(数据的最终状态)图像与导致数据更改的事件相关联。
  3. 数据沿袭记录存储在不可变的变更/审核日志中;注意,“不可变”特征很重要——这通常实现为“仅附加”日志,因此提供了数据单元生命周期的持久且不可改变的历史记录。
  4. 数据沿袭记录被转发到企业数据产品目录;该目录允许按需搜索和可视化数据沿袭记录(以及许多其他属性)。
  5. 模式注册表为所有事件以及数据沿袭记录(以及它们包含的事件信息)提供了定义,从而为实现复杂的数据沿袭分析提供了必要的结构。
  6. 整个企业的用户——数据科学家、治理团队成员和开发人员可以根据需要使用数据谱系记录。

使用场景

数据科学家使用这种模式来了解训练数据的谱系,以实现其模型的可再现性、可追溯性和可验证性,这是人工智能/机器学习支持日益关键的决策所必需的。

数据治理团队也使用这种模式来理解整个企业中的数据沿袭和相关的消费模式。

供应商前景

有几个组件相互作用来捕获、编目和可视化由不可变变更/审计日志模式存储的数据沿袭记录:

  • 模式注册中心 :由于该组件提供了事件的定义(通常是 JSON 模式或 AVRO ),因此它与事件流主干紧密耦合。我对 Kafka Schema Registry 的汇合版本有很好的体验。
  • 企业数据产品目录 :到目前为止,我还没有找到一个具体的供应商来解决这个问题,我必须构建自己的定制系统,将模式注册、聚合微服务、事件可视化和可搜索的目录联系起来。考虑到这一点,我通常会从一个灵活的静态开源内容管理服务开始,如 Docusaurus 或 Hugo ,它们具有可靠的搜索/查找和内容存储功能,然后在聚合和可视化功能上再加一层。我意识到可能有更复杂的解决方案,但这很有效,可以很快实现。
  • 不可变日志:任何可以存储非结构化数据的健壮数据库在这里都可以;此外,虽然该功能不同于事件源,但 Kafka 保存的持久日志可以作为不可变更改/审计日志的基础,尽管可能需要实现额外的功能和配置。

完全披露:在推荐上述任何产品时,我没有 经济利益——我之所以强调这些产品,是因为我有一些使用它们的经验,它们对我很有效。

本系列的其他文章

下面列出了本系列中关于基础数据网格模式的全部文章。

  • 变更数据捕获(CDC)模式,它跟踪数据库中的变更,并将它们捕获为“事件”(此处可用)。
  • 事件流骨干模式,CDC 和其他应用程序使用该模式在企业数据网格中发布和订阅/接收事件(此处可用)。
  • 不可变的变更/审计日志模式,它保留日志并跟踪企业数据网格中的数据血统,用于未来的审计和治理目的(本文)。
  • 企业数据产品目录模式,这是一个目录/存储库,包含关于企业数据网格中数据产品的元数据(即将推出)。

总结想法

不可变的变更/审计日志是一种基本的数据网格模式。与模式注册中心和企业数据产品目录相结合,它提供了实现监管者、审计者和数据治理专家所需的数据谱系的底层能力,同时实现了“联合计算治理”的核心数据网格原则。


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

数据网格解决方案和加速器模式

原文:https://towardsdatascience.com/data-mesh-solution-and-accelerator-patterns-acffbf6e350

太多时候,我们全神贯注于数据网格技术,而忽视了它所能带来的令人难以置信的业务成果。以下是企业中数据网格的一些最佳机会。

佩顿·塔特尔在 Unsplash 上拍摄的照片

通过数据网格交付出色的业务成果

像你们中的许多人一样,我本质上是一名技术专家,我绝对喜欢深入研究低级数据网格技术。但是我的经验表明,理解数据网格的好处与其实现细节同样重要。

为什么?嗯,我认为,任何数据网格之旅都不是一件小事,可能会花费数百万美元,这是一个现实。然而,总得有人来买单。为了解决这个问题,我们应该准备好回答一个非常实际的问题:数据网格可以实现哪些业务成果?

在本系列文章中,我将介绍几种“解决方案”和“加速器”模式,它们将数据产品和数据网格功能结合起来,以交付实际和有形的业务成果。本系列的后续文章将详细探讨每个解决方案和加速器模式。

本文假设您对数据网格有很高的理解。如果您需要一些关于数据网格的背景信息,这里有一些很棒的文章可供参考:这里的(模式)、这里的(架构)、这里的(原则)和这里的(经验教训)。

数据网格模式适用于运营和参与系统(不仅仅是分析)

数据网格通过一组公共的“管道”、组织结构(所有权、平台思维)和治理问题将分析系统和运营/参与系统绑定在一起。正如 Zhamak Dehghani 在她最近的书中指出的那样,“数据网格建议通过作为产品共享并围绕领域定向的数据来弥合两个(分析和运营)层面之间的差距和反馈回路。Data mesh 在一个新的结构下连接了两个层面(分析层面和运营层面),这是一个点对点连接的数据产品和应用程序网络。”

但我会更进一步。我认为数据网格原则——数据所有权、数据即产品、自助服务和联合治理——同样适用于洞察系统以及记录和参与系统。事实上,除了“分析数据产品”之外,我还提倡“运营数据产品”和“参与数据产品”,它们将数据网格的力量带给运营企业的系统/记录数据以及那些与我们的客户互动的系统/数据。

现在,要明确的是,我同意 Dehghani 的观点,即数据网格目前专注于分析,因为这是目前的难点所在,但这并不能改变这样一个事实,即数据网格原则和模式可以使整个企业的各种挑战受益,包括与系统/系统记录数据/参与数据相关的挑战。

因此,随着本文的深入,您将看到数据网格解决方案和加速器模式不仅涵盖分析数据产品,还涵盖运营和参与数据产品。

图 1,分析、运营和参与度数据产品

解决方案、加速器和基础模式

有几组模式被组合来交付杰出的业务成果:

  • ****基础模式包括低级模式,如变更数据捕获和事件流骨干模式(本文后面提供了完整的列表)。这些模式通常用于构建核心企业数据网格,但也可以直接用于组装解决方案模式。这些模式在之前的文章中有详细讨论。
  • ****加速器模式提供了高层次的构建块,这些构建块被组合来解决业务问题的点元素。在许多情况下,它们是由基本模式组合而成的。
  • ****解决方案模式是解决实际业务问题的基础模式和加速器模式的组合。

图 2,数据网格模式汇总

解决方案模式

因此,正如企业中的数据是相互关联的一样,解决方案模式试图解决连接洞察、参与和记录系统的挑战。因此,在创建和部署解决方案模式时,除了想象力之外,没有任何实际限制。

当您通读这些模式时,您可能会认识到有许多方法可以解决它们所解决的业务挑战。之所以选择这些解决方案和加速器模式,是因为 Data Mesh 及其核心原则和补充架构特别适合以实用的方式解决这些挑战。

所以,让我们开始吧!

以下是一些最常见的解决方案模式:

图 3,解决方案模式:AI/ML 数据网格,系统约定数据网格

AI/ML 支持数据网格**解决方案模式(图 3)展示了数据网格如何建立支持数据谱系的实时分析环境。Data Mesh 使用“ Live Replica ”加速器模式(将在本文后面讨论)来创建数据产品,它是来自操作系统的数据的近乎实时的副本。但是同样重要的是,这种模式使用变更数据捕获、事件流骨干和不可变审计/变更日志基本模式来提供模型可再现性和可追溯性所需的数据谱系,这些都是金融服务和医疗保健等受监管行业所要求的。(深潜文章即将推出)

参与系统数据网格解决方案模式(图 3)加速了“参与系统”的实现。在数据网格通常解决“洞察系统”(也称为分析系统)的地方,数据网格模式可以很容易地应用于建立“参与系统”。这些互动系统结合了来自多个来源的信息,以提供客户数据和所有相关数据的一致和整体视图,从而提供卓越的客户体验。Data Mesh 使用实时副本**加速器模式(将在本文后面讨论)将数据从运营系统(或数据产品)近乎实时地移动到项目数据产品中。(深潜文章即将推出)

图 4,解决方案模式:遗留现代化数据网格,云加速数据网格

遗留现代化数据网格解决方案模式(图 4)使用扼杀者**和 CQRS 加速器模式(本文稍后讨论)以安全、可靠且不引人注目的方式迁移数据。随着数据以接近实时的方式迁移到新平台,一致的新数据产品变得可用,并且随着时间的推移,它可以取代旧的遗留平台。(深潜文章即将推出)

云加速数据网格解决方案模式(图 4)使用实时副本扼杀**加速器模式(本文稍后讨论)来显著加速您的云迁移。该模式将数据从任何类型的系统(事务或分析)或数据产品移动到安全的云驻留数据存储。这是创建数据“引力井”的基础,而数据“引力井”是经济高效地构建高性能云原生系统所必需的。(深潜文章即将推出)

零信任数据网格**解决方案模式(图 5)创建了一个安全可靠的数据产品。所有企业——尤其是受监管行业中的企业——都管理敏感数据(监管示例包括 GDPR 、 PCI 、 PII 、 HIPPA )。然而,保护这些数据既昂贵又耗时,而且很难做到正确无误。我很肯定,由于缺乏预见安全需求的远见,已经有太多的项目被推迟。该解决方案模式通过创建可重复的过程(DevSecOps)来解决这一问题,以快速构建安全的任务关键型(零信任)数据产品。(深潜文章即将推出)

主数据管理(MDM)网格**解决方案模式(图 5)有助于了解您的记录簿或主数据以及相关数据的位置。传统的 MDM 解决方案复制主数据,这需要复杂的数据迁移和同步技术。另一方面,这种模式使用企业数据产品目录来允许数据驻留在它们的自然数据产品中,但是使用数据产品的可发现性特性来动态收集主数据信息的链接。(深潜篇即将推出)

加速器模式

加速器模式是高级构建块,通常构建在基础数据网格模式之上,可以组合起来加速解决方案模式的交付。下面是一些最常见的。

图 6,加速器模式:数据产品可观察性,数据产品安全性

****数据产品可观察性加速器模式提供了数据产品的可见性(详细文章可在此处)。该模式展现了几个重要的静态和动态数据产品属性(可通过数据产品目录/仪表板访问),包括:

  • ****数据移动,提供数据产品内的低级事件跟踪,但也关联数据产品内部和之间发生的事件;这些信息对于调试和了解数据产品内部和之间的高度异步通信至关重要。
  • ****元数据,提供关于在数据产品中管理的数据的信息。
  • ****接口定义,提供数据产品访问方法的可见性。
  • ****事件模式,提供由数据产品消费或发出的事件的定义。
  • ****指标,提供关于数据产品消费模式的信息。
  • ****数据谱系,提供数据产品内的数据谱系。
  • ****数据访问权限,提供访问数据产品所需的安全性和访问权限的可见性。
  • ****警报和错误,提供操作警报和错误的可见性,以支持生产监控。

数据产品安全**加速器模式提供了一个粒度安全模型来保护数据产品(深入探讨文章即将推出)。它实施策略来保护数据产品,包括以下内容(注意:为简单起见,我使用了数据库/属性/行命名法,但这些安全结构可应用于非结构化或基于文件的数据):

  • ****基于角色的访问控制,确保只有授权的实体(即已经在他们的简档中被分配了授权角色)可以访问该数据产品。
  • ****基于属性的访问控制,保护对数据产品中数据的各个列、字段或属性的访问。
  • ****基于行的访问控制,保护对数据产品中相关数据的单个行或分组的访问。

图 7,加速器模式:数据产品可操作性,数据产品的扼杀者

****数据产品可操作性加速器模式转发来自数据产品的警报和错误,并将它们发送给相关方,包括例如企业监控功能。请注意,与“数据产品可观察性”模式存在潜在的重叠,但差异虽细微,但仍然很重要:数据可观察性模式捕获数据产品内部的警报和错误,数据产品可操作性模式旨在向相关方发出这些错误(并可能根据需要聚合它们)。(详细文章可在这里获得)。

数据产品的扼杀者**加速器模式使用众所周知的扼杀者——图模式是一种将数据从一个数据产品迁移到另一个数据产品的实用可行的机制。Data Mesh 使用多种基本模式,包括 API、变更数据捕获和事件流主干,在数据产品之间安全可靠地迁移数据。(深潜文章即将推出)

图 8,加速器模式:实时副本数据产品,数据产品的 CQRS

实时副本**加速器模式创建近乎实时(延迟 50–500 毫秒)的数据实时副本。Data Mesh 使用变更数据捕获和事件流主干基本模式将数据安全、可靠且接近实时地移动到同步(在 50-500 毫秒内)的数据产品中。(深潜文章即将推出)

数据产品 CQRS**加速器模式应用众所周知的 CQRS 模式,通过在数据产品之间分离数据产品读写活动来优化性能。Data Mesh 使用 API、变更数据捕获和事件流主干基本模式来优雅而可靠地隔离数据访问方法。(深潜篇即将推出)

基本模式

最底层的组件——数据网格基本模式——用于组成加速器和解决方案模式。这些将在其他文章中讨论:

  • 基础模式总结:介绍模式,它们是如何工作的,以及它们是如何交互的。
  • 数据网格架构,提出了一种绑定各种数据网格模式和组件的架构,
  • 改变数据捕获,在数据产品内部和之间捕获和传输数据,
  • 不可变日志(数据沿袭),它捕获数据变更并将它们聚合到数据沿袭记录中,
  • 事件流骨干,在数据产品内部和之间传输事件,以及更广泛的企业,
  • API,为数据产品提供接口合同,
  • 数据产品目录&企业数据产品目录,为数据产品使用的模式提供元数据和定义。

图 9:数据网格基础模式

总结想法

企业数据网格是实时数字企业的新兴基础。解决方案、加速器和基础模式提供了一种理解和解决常见业务和技术挑战的实用方法。通过使用这些模式,数据网格提供了一种解决这些挑战的实用方法,从而创造真正的价值和切实的业务成果。

希望这篇文章给你必要的洞察力来启动你自己的企业数据网格!


除非另有说明,本文中的所有图片均由 Eric Broda(本文作者)创作。图像中使用的所有图标都是普通的 PowerPoint 图标,不受版权保护。

本文表达的观点仅代表我个人,并不代表我的客户的观点。

数据网格:集中和分散的平衡行为

原文:https://towardsdatascience.com/data-mesh-the-balancing-act-of-centralization-and-decentralization-f5dc0bb54bcf

实现数据网格的细微差别和注意事项

数据网格体系结构通过联合治理和分散的数据产品将数据所有权分布到各个领域团队。数据网格不同于其他数据架构,因为它是高度分散的:分布式而非集中式。

观察结果

我接触的许多大型企业都在研究数据网格。他们发现团队对其数据负责并增加商业价值的扩展模型是一种优雅的方法。他们喜欢数据产品管理思维。然而,他们不喜欢采用完全分散的架构,这可能导致连接数据时的数据重复、平台管理的重复工作、孤岛的创建和技术标准的激增。其他企业担心合并来自多个团队的数据的成本和性能下降。或者害怕对复杂系统管理的深入专业知识的需求:构建一个通过集中治理来控制的分散架构被认为太复杂了。

不同的数据网格拓扑。完全分散化会带来额外的复杂性管理开销。企业在分散化和集中化之间寻求平衡,以解决重复数据分布等问题。(鸣谢:皮埃登·斯特朗霍尔特)

提出参考设计

基于这些客户对话,我经常采用 data mesh 的一些原则提出一个替代方案。

企业享有强大的数据所有权

将责任放在数据产生的地方是一件好事,我真的很喜欢数据网格。它分散了数据的责任,并将责任落实到数据产生的地方。这种一致性完全有意义,因为数据生产者是他们自己数据的专家。他们知道他们的系统是如何设计的,以及在这些系统中管理哪些数据。他们经常与最终用户或业务分析师密切合作,因此知道良好的数据质量对数据消费者意味着什么。在分配数据所有权和确定您的领域时,我的建议是不要局限于应用程序和系统。看看范围,了解你试图解决的业务问题空间。这种分析包括特定环境中的数据、流程、组织和技术,与您组织的战略业务目标和目的相一致。定义域时,确保边界清晰明确。这一点非常重要,因为不同的团队可能会试图声明相同应用程序和数据的所有权。

数据产品思维引起了很好的共鸣

另一个引起广泛共鸣的概念是数据产品。将数据作为产品来管理和提供并不是转储原始数据的极端情况,转储原始数据需要所有消费团队在数据质量和兼容性问题上执行可重复的工作。使用来自所有团队的一个(企业)规范数据模型和强大的一致性,这也不是构建集成层的极限。数据产品设计是一种细致入微的方法,从您的(复杂的)操作和分析系统中提取数据,并将其转换为适合整个组织使用的读取优化版本。这种数据产品设计方法附带了许多最佳实践,例如将您的数据产品与您的领域的语言保持一致,为快速消费设置明确的互操作性标准,从创建的源头直接捕获它,解决时变和非易失性问题,封装元数据以实现安全性,确保可发现性,等等。你可以在这里找到更多这些最佳实践。

对权力下放的保留意见

当涉及到为领域团队配备工程工具来执行数据产品创建和平台所有权的任务时,企业会做出不同的权衡。并非所有组织都有 500 多名数据工程师。并非所有的组织团队都熟悉复杂的数据建模技术、变更数据捕获、Kubernetes 和 Python 笔记本。公司根据其规模、业务需求和现有架构要求不同的方法。

我交谈过的许多企业实施了轴辐式网络拓扑架构,通常由集中的平台团队管理所有公共基础设施,包括数据平台。对于通用数据服务,企业通常使用支持团队,该团队与其他团队密切合作,以实现数据的引入或消费。数据产品思维模式是通过要求团队获得数据的所有权来设想的,这意味着故障排除、修复数据质量问题或解决摄取问题。但是当涉及到复杂的工程时,就有这种成熟度曲线,所以支持团队也经常在入职数据、培训和指导团队最佳实践方面提供帮助。当领域团队缺乏必要的技能时,这些支持团队有时甚至接管数据管道管理。

同样的成熟度曲线通常也出现在数据消费端。在许多情况下,团队依赖共享的资源池来提供关于数据的配置、接收和转换的知识和帮助。这个支持数据的团队吸取经验教训并进行改进以增强服务,例如用于数据管道和接收的框架,以使这些更具动态性和可配置性。在解决效率低下和应用自助服务与花费时间帮助搭载新数据产品之间,这是一个持续的平衡。

较少分散的参考模型

为了解决数据重复问题,企业通常会选择一个中央数据分发平台,而不是由所有团队管理的许多已部署的逻辑组件。这也是我看到许多重叠的地方,例如,数据湖房子架构。您可以在下面找到一个参考模型,它展示了这种具有单一平台实例和数据产品所有权的架构。

基于域的数据所有权参考模型。域总是拥有数据的所有权。(鸣谢:皮埃登·斯特朗霍尔特)

这个参考设计是一个面向领域的架构。尽管使用了共享平台,但是数据提供域或消费域拥有数据的所有权。数据所有权也适用于从新创建或聚合的数据中派生的数据产品。没有合并所有数据的中央或共享集成层。为了应对数据不一致的挑战,您可以考虑引入主数据管理原则。

这种体系结构的解决方案设计如下所示:

应用一些数据网格原则的解决方案架构,例如基于域的数据所有权(鸣谢:Piethein Strengholt)

对于这种架构,我推荐使用元数据驱动的摄取框架:数据处理的统一通用方式。通过这个控制框架,您可以建立适当的数据所有权,这意味着分发数据的团队将始终拥有他们的源系统、元数据配置、管道和数据产品的所有权。

对于消费方,我也主张分散数据所有权。这意味着从事用例工作的团队将对其转换后的数据和分析应用程序拥有所有权。

在这个体系结构中,有一个逻辑存储层,它将来自许多不同团队的数据聚集在一起。在分发数据产品时,这个环境充当所有团队之间的解耦点。这种环境中的分段和隔离通常通过使用每个域的容器来进行。但是,您也可以根据您发现的内聚性,使用存储帐户对域进行逻辑分组。这一层中的数据是不可变的,并且是读优化的。根据您希望如何扩展,您可以提供额外的平台实例。

为了支持您的数据域,还必须有一套强大的数据管理服务。这些功能用于:支持数据接收、处理流程编排、调度、管理主数据管理和数据生命周期管理、执行数据治理和质量管理,以及解决安全管理问题。

该模型中更高的集中化程度解决了以下问题:1)遍历大型历史数据集,无需将数据从一个域转移到另一个域 2)允许检查数据的逻辑关联程度和相互一致性 3)允许主数据管理更高效地运行 4)通过在不同团队之间共享计算资源来降低成本。同时,它应用了来自数据网格的若干最佳实践,例如数据产品思维、面向领域的数据所有者、自助服务功能和数据治理。

结束

每个企业都有自己的数据环境和需要应对的挑战。并不是所有的企业都准备好了大规模的权力下放。但是,您可以通过选择符合您需求的拓扑来取得平衡。

数据网格:拓扑和领域粒度

原文:https://towardsdatascience.com/data-mesh-topologies-and-domain-granularity-65290a4ebb90

至少可以说,微软过去的一年很有趣!我参加了无数的客户对话、研讨会和架构设计会议。在这些客户互动中,数据网格经常成为争论的中心话题。

据我所知,数据网格相对来说是一个新的课题。这是一个必须由公司独特的所有权、组织、安全性、变化速度、技术和成本管理要求来塑造的概念。平衡所有这些需求并不容易,所以公司选择一个通用的架构来满足这些需求。

不同的数据网格拓扑。从完全去中心化和细粒度解耦到更受管理的数据分布。(鸣谢:皮埃登·斯特朗霍尔特)

在这篇博文中,我想分享不同的架构设计模式以及选择每种模式的考虑因素。我将解释公司的驱动力,以及为什么他们偏爱一种设计而不是另一种。

场景 1: 细粒度全密目网

第一个设计模式是 Zhamak Dehghani 如何以最纯粹的理论形式描述数据网格。它是细粒度的、高度联合的,并且使用许多小型的、独立的可部署组件。下图显示了这种架构设计的一个抽象示例。

细粒度和完全联合的数据网格(鸣谢:Piethein Strengholt)

在上面的模型中,数据分发是对等的,而所有与治理相关的元数据在逻辑上是集中的。这种拓扑中的数据由每个单独的域拥有、管理和共享。域保持灵活性,不依赖中央团队进行协调或数据分发。

在细粒度和完全联合的网格中,每个数据产品都被视为一个架构量子。简而言之:这意味着您可以实例化许多不同的小型数据产品架构,用于跨域提供和提取数据。你可以在下面找到这种工作方式的图像。

数据产品架构(鸣谢:Piethein Strengholt)

细粒度和完全联合的网格支持细粒度的领域专门化。它提供了组织的灵活性和更少的依赖性,因为交互是多对多的。最后,它促进了数据的密集重用,因为数据产品的创建程度很高。每个数据产品都变成了体系结构量子。

虽然细粒度和完全联邦的网格看起来很完美,但当公司深入研究时,他们会提出一些问题。首先,拓扑需要所有域在互操作性、元数据、治理和安全标准方面的一致性。这些维度的标准化过程不会自发发生。这是一项艰巨的任务,需要你打破政治界限。它要求你在不同的阶段移动你的架构和工作方式,包括预概念化、概念化、讨论、写作和实现。你需要有足够的数量和更广泛的观众的支持。

第二,公司担心能力重复和网络利用率过高。许多小型数据产品架构极大地增加了基础设施资源的数量。它会使您的架构成本高昂。当集中执行跨域数据查找和数据质量验证时,数据产品架构的粒度也变得有问题。数据重心和去中心化并不同步。

细粒度的全联邦网格是一个很好的选择,但是很难实现。我经常在那些诞生在云上、做多云、相对年轻并拥有许多高技能软件工程师的公司看到这种拓扑结构。当您的公司内部已经有了高度自治时,这种拓扑也可能是一个不错的选择。

场景 2: 细粒度和完全治理的网格

为了解决联合问题,我看到许多公司通过增加一个中心分布层来调整以前的拓扑结构。虽然这种拓扑没有实现完整的数据网格体系结构,但它遵循了许多数据网格原则:每个域都有一个明确的边界,并对自己的应用程序和数据产品拥有自主权,但这些数据产品需要通过一个中央逻辑实体进行分发。

细粒度和完全受控的数据网格(鸣谢:Piethein Strengholt)

上面可视化的拓扑解决了在细粒度完全联合网格中观察到的一些问题。它解决了数据分布和重力问题,如大型数据消费者的时变和非易失性考虑。域不需要分布大型历史数据集,因为数据更紧密地保存在共享存储层上。

公司还认为这种拓扑更容易解决一致性问题。例如,您可以阻止数据分发或消费、强制元数据交付或要求特定的工作方式。多工作空间共享湖设计是一个经常应用的最佳实践。域在它们自己的工作空间中管理和创建数据产品,但是向其他域的分发是通过使用特定于域的容器的中央存储层进行的。

解决开销的多工作空间共享湖设计

除了提供中央存储层,我还看到一些公司提供集中管理的计算或处理服务。例如,使用专用计算在每个域内应用特定于域的转换,但是使用计算资源的共享池集中处理历史数据。这种方法大大降低了成本。

这种拓扑更强的集中化和一致性也是一个考虑因素。这将导致更长的上市时间,并在您的域之间引入更多的耦合。当功能没有准备好时,您的中央分布层可能会阻碍域交付商业价值。我还预计这种拓扑在多云中会更加困难,因为它要求您设计一个中央分布式逻辑实体,在遵守所有治理标准的同时无缝地移动数据。鉴于云供应商目前所提供的特性,使用云原生标准实现这一点很困难。

然而,我看到许多公司选择完全治理的网状拓扑。大多数金融机构和政府都实施这种拓扑结构,但也有其他公司将质量和合规性看得比灵活性更重要。

场景 3:混合联邦网格

不是所有的公司都有很多高技能的软件工程师。其他人则使用过时的遗留系统,这些系统很难维护和提取数据。属于这些类别的公司通常实施“一些”数据网格,如下图所示。

混合联邦数据网格(鸣谢:Piethein Strengholt)

这种拓扑与其他拓扑相比有什么特点?联邦越来越少,集权越来越多。有一种数据产品管理的思维模式,但是有一个维护和创建数据产品的中央平台实例。有时,在领域团队缺乏必要的技能或资源的情况下,甚至会有一个支持团队或平台团队接管数据产品。

在消费数据上,通常有更高程度的自治和网状分布。不同的团队可能处理不同的用例,并对他们转换后的数据和分析应用程序拥有所有权。结果或新创建的数据产品被对等分发或推回到中央平台。

这种拓扑的一个考虑因素是增加了源系统对齐域的管理开销,因为它们很可能由一个中央团队负责。使用这种架构的组织可能会受到不同的操作模型和更复杂的指导和原则的影响。还可能有不一致的数据分发规则,因为消费域经常变成提供域。实现这种架构的额外考虑和治理模型可以在这里找到:https://towards data science . com/data-mesh-the-balancing-act-of-centrization-and-decorization-f 5 DC 0 bb 54 BCF。

场景 4:价值链对齐的网格

专门从事供应链管理、产品开发或运输的组织非常尊重他们的价值链。这些公司有什么特点?他们需要高度专业化或流程整合来为客户带来价值。这些价值链通常在本质上是紧密相连和可操作的。他们还典型地前后处理数据:从操作到分析,再回到操作。

与价值链一致的数据网格(鸣谢:Piethein Strengholt)

在这种价值链结构中,价值链被认为是一组紧密合作的较小领域。这种价值链需要更高程度的自主性,因此可以被视为更大的领域。在这样拓扑中,您通常会看到内部数据产品和跨域数据产品之间的差异。只有当跨越价值链的边界时,才需要遵守核心标准。您还可以允许或混合不同类型治理模型;在一个领域严格遵守,在其他领域放松控制。

使用价值链的考虑是,这个模型需要架构师更强的指导,因为边界可能不总是那么明确。

场景 5:粗粒度对齐网格

一些组织通过兼并和收购实现有机增长,从而扩大规模。这些组织通常有复杂的环境,有时有数百或数千个应用程序和系统。在这些复杂的结构中,你可以看到不同层次的治理、联合和分解。一些结构可能独立自主地运行,而另一些结构则更加完整。

在这些大规模公司中观察到的结构通常相当大。域被认为拥有数十或数百个应用程序。我认为这样的拓扑是一个粗粒度的对齐网格。

粗粒度对齐数据网格(鸣谢:Piethein Strengholt)

这种拓扑的困难在于边界并不总是那么明确。数据不符合领域和业务功能的边界。更常见的是,领域边界基于相对较大的组织或区域观点。这可能会在谁控制数据和需要什么主权的问题上产生政治内讧。

粗粒度数据网格拓扑的另一个挑战是能力复制。很可能每个粗粒度域都使用自己的数据平台来实现数据的加入、转换和分发。这种为更大的领域实现许多平台的方法会导致功能重复。例如,整个企业都可能需要数据质量管理和主数据管理。这种联合方法可能会导致在所有数据平台上实现许多数据质量和主数据管理。确保这些服务在所有平台上的一致实施需要强大的协作和指导。你的组织越大,就越难。

这种多平台方法经常会引发很多问题:如何校准数据平台和域?是否允许更大的域共享一个数据平台?当不同平台需要相同的数据时,如何处理重叠的数据需求?如何在这些更大的域和平台实例之间高效地分发数据?一个好的起点是在实现数据网格之前对你的组织进行适当的域分解。继续设置应用程序和数据所有权。通过制定关于数据产品创造的强有力的指导来继续。

当考虑粗粒度网格拓扑时,重要的是强烈引导向数据网格的过渡。这种拓扑具有更高的自主性,因此需要更强的治理策略和自助式数据平台功能。例如,注册数据产品并使其可被发现可能需要基于域的技术和互操作性选择的特定指导。否则,跨平台的可见性可能会更差,或者基于在域中看到的扩散,成本可能会增加。

粗粒度自治与真正的数据网格实现相矛盾。它带来了在分发数据产品之前对数据进行组合和集成的风险。这有造成更大孤岛的风险。这些巨大的单体在系统之间创造了额外的耦合。它们还引入了数据所有权混淆,因为数据产品是通过使用中间系统分发的,这使得更难看到实际的来源。为了降低这些风险,引入一些原则,例如只捕获唯一的数据,以及使用其唯一的域上下文直接从来源捕获数据。

场景 6:粗粒度和治理的网格

一些大规模的复杂组织旨在通过在这些更大的结构之间建立一个分布的中心层来克服复杂性、对等分布和互操作性偏差。

粗粒度治理数据网格(鸣谢:Piethein Strengholt)

在这种拓扑结构中,团队或组织结构在一个分发平台或市场上达成一致,通过该平台或市场可以发布和消费数据产品。这种拓扑增加了受治理数据网格拓扑的一些特征,例如解决时变和非易失性问题。另一方面,它允许在这些更大的范围内进行更宽松的控制。

所有粗粒度的方法,就像前面的场景一样,需要数据平台团队的高度成熟度。所有组件都需要自助服务,并且必须在分布的中心层和域平台之间很好地集成。元数据管理、治理标准和政策至关重要。如果中央架构和治理团队没有强有力的授权,这些架构很容易失败。

结论

数据网格是一种转变,它可以完全重新定义数据管理对组织的意义。您的中央团队不再集中执行数据管理的所有领域,而是负责定义什么构成了强大的数据治理,什么构成了自助式数据平台。

在向联盟过渡的过程中,公司会做出取舍。一些组织喜欢高度自治,而另一些组织喜欢质量和控制。一些组织的结构相对简单,而另一些组织则庞大而复杂。创建完美的数据架构并不容易,所以对于您的策略,我鼓励您将数据网格视为一个框架。没有对错之分。数据网格伴随着最佳实践和原则。有些你可能喜欢,有些你不喜欢。因此,实施最适合你的方案。

如果这是你喜欢的内容,我让你看看《规模化数据管理》这本书。

数据挖掘:基于 Apriori 算法的购物篮分析

原文:https://towardsdatascience.com/data-mining-market-basket-analysis-with-apriori-algorithm-970ff256a92c

揭开为什么面包总是方便地放在食品杂货店黄油旁边的秘密

安妮·普雷布尔在 Unsplash 上的照片

简介

我们中的一些人带着标准清单去杂货店;尽管我们中的一些人很难坚持购物清单,不管我们有多坚定。不管你是哪种类型的人,零售商总是擅长制造各种诱惑来抬高你的预算。

还记得那次你吃了"哦,我可能也需要这个。“瞬间?零售商依靠这一简单的直觉来提高销售额。

买这个的人很可能也想买那个。

购买面包的人有更高的机会一起购买黄油,因此一个有经验的产品分类经理肯定会知道,面包打折也会促进黄油的销售。

数据驱动战略

大型零售商依靠详细的购物篮分析来揭示商品之间的关联。利用这些有价值的信息,他们能够实施各种策略来增加收入:

  • 相关产品被放置在彼此靠近的地方,这样一种商品的购买者会被提示购买另一种商品。
  • 折扣只能应用于一种相关产品。

Artem Beliaikin 在 Unsplash 上的照片

关联规则挖掘

但是市场篮子分析究竟是如何进行的呢?

数据科学家能够通过实现关联规则挖掘来执行市场购物篮分析。关联规则挖掘是一种基于规则的机器学习方法,有助于根据不同产品在数据集中的同现情况来发现它们之间有意义的相关性

然而,一个主要的缺陷是,它包含各种公式和参数,这可能会使没有数据挖掘专业知识的人感到困难。因此,在与利益相关者分享您的结果之前,请确保对基本定义有充分的理解。

照片由普里西拉·杜·普里兹在 Unsplash 拍摄

核心概念说明

下面我将用一些简单的例子来说明关联规则挖掘中使用的三个核心概念。这将帮助您掌握数据挖掘过程。

假设你现在开了自己的自助餐厅。您将如何利用您的数据科学技能来理解菜单上的哪些项目是相关联的?

亚历山大·萨多夫斯基在 Unsplash 上的照片

在你的自助餐厅里总共有六笔不同的交易。

作者图片

我们可以利用三个用于关联规则学习的核心度量,它们是:支持度置信度、提升度

  1. 支持

支持只是一个事件发生的简单基本概率。以项目集出现的交易比例来衡量。换句话说,支持(A)是包括 A 的事务数除以事务总数。

如果我们分析上面的事务表,对 cookie 的支持是 6 中 3。也就是说,在总共 6 次交易中,包含 cookies 的购买发生了 3 次。或者 50%。

作者支持方程图像

也可以同时对多个项目实施支持。对曲奇和蛋糕的支持度是 6 分之 2。

作者支持方程图像

2。信心

给定一个前因事件后果事件 事件的置信度可以用条件概率的来描述。简单来说就是在事件 B 已经发生的情况下,事件 A 发生的概率。

这可以用来描述当一个商品已经在购物篮中时,另一个商品被购买的概率。它的计算方法是用 X 和 Y 项的交易比例除以 Y 项的交易比例。

从上面的事务表中可以看出,{cookie -> cake}的置信度可以用下面的公式表示:

作者的置信方程图像

条件概率也可以写成:

作者的置信方程图像

最后,我们得出了三选二的解决方案。如果我们只看交易 1 到交易 3,我们可以理解信心的直觉。三次购买饼干,其中两次实际上是和蛋糕一起购买的!

3。抬起

升力是观察到的 与预期的 (缩写为 o/e)。Lift 衡量一件商品被购买时,另一件商品被购买的可能性,同时控制这两件商品的受欢迎程度。它可以通过将两个项目一起出现的概率除以两个单独项目出现的概率的乘积来计算,就好像它们之间没有关联一样。

作者提供的升力方程图像

提升 1 将意味着这两个项目实际上是独立的,没有任何关联。对于任何高于 1 的值,lift 表明实际上存在关联。值越高,关联度越高。

再看表格,{cookies -> cake}的 lift 是 2,暗示着 cookies 和 cake 之间其实是有关联的。

现在我们已经掌握了所有的核心概念,我们可以研究一个能够从事务性数据中生成项目集的算法,该算法用于计算这些关联规则。

Apriori 算法

概观

Apriori 算法是关系数据库关联规则学习中最常用的算法之一。它识别数据集中的项目,并进一步将它们扩展到越来越大的项目集

然而,Apriori 算法只在项目集频繁的情况下才扩展,即项目集的概率超过某个预定的阈值。

Shane Aldendorff 在 Unsplash 上拍摄的照片

更正式地说,

Apriori 算法提出:

在下列情况下,项目集的概率不是频繁的:

  • P(I) < Minimum support threshold, where I is any non-empty itemset
  • Any subset within the itemset has value less than minimum support.

The second characteristic is defined as the 反单调性质。一个很好的例子是,如果购买汉堡的概率已经低于最低支持,那么购买汉堡和薯条的概率肯定也会低于最低支持。

Apriori 算法的步骤

下图说明了 Apriori 算法如何从最小项集开始构建,并进一步向前扩展。

  • 该算法从通过连接步骤生成一个项集开始,即从 K 个项集生成(K+1)个项集。例如,算法在第一次迭代中生成 Cookie、巧克力和蛋糕。
  • 在此之后,该算法立即进行修剪步骤,即移除任何不满足最小支持要求的候选项目集。例如,如果支持度(蛋糕)低于预定的最小支持度,则该算法将移除蛋糕。

它重复这两个步骤,直到没有可能的进一步扩展。

请注意,此图并不是上面事务表的完整版本。它作为一个插图,有助于描绘更大的流动画面。

Apriori 算法粗糙概念图像作者

代码实现

为了使用 Apriori 算法执行购物篮分析实现,我们将使用来自 Kaggle 的杂货数据集。该数据集由 Heeral Dedhia 于 2020 年以通用公共许可证第 2 版发布。

该数据集有 38765 行来自杂货店的采购订单。

照片由 Cookie 在 Unsplash 上的 Pom 拍摄

导入和读取数据

  • 首先,让我们导入一些必要的模块,并读取我们从 Kaggle 下载的数据集。

代码:

输出:

作者输出的代码

分组为交易

  • 数据集在一行中记录单个商品的购买情况。我们将不得不把这些购买的东西归入一篮子物品中。
  • 之后,我们将使用 TransactionEncoder 将事务编码成适合 Apriori 函数的格式。

代码:

输出:

作者输出的代码

注: 数据框将每一行记录为一次交易,交易中购买的物品将被记录为真。

先验和关联规则

  • Apriori 算法将用于生成频繁项目集。我们将指定最低支持为总事务数的 6。产生关联规则,并且我们过滤提升值> 1.5。

代码:

输出:

作者输出的代码

形象化

  • 为了可视化我们的关联规则,我们可以将它们绘制成 3D 散点图。更靠近右上角的规则可能是最有意义的规则,可以进一步深入研究。

代码:

输出:

作者的 3D 散点图

  • 查看产品之间关系的另一种可视化方式是通过网络图。让我们定义一个函数来画一个网络图,它可以指定我们想要显示多少规则。

代号:

输出:

按作者划分的网络图

商业应用

假设杂货店购买了太多的全脂牛奶,现在担心如果不能及时销售出去,库存会过期。更糟糕的是,全脂牛奶的利润率如此之低,以至于他们无法在不牺牲太多利润的情况下享受促销折扣。

照片由达莉亚·沃尔科娃在 Unsplash 上拍摄

可以提出的一种方法是找出哪些产品推动了全脂牛奶的销售,并对这些产品提供折扣。

代码:

输出:

作者输出的代码

例如,我们可以对白兰地、软化剂、水果罐头、糖浆和人造甜味剂实行促销折扣。有些关联可能看起来违背直觉,但规则表明这些产品确实推动了全脂牛奶的销售。

外卖食品

通过实施 Apriori 算法和分析关联度量,企业可以衍生出许多数据驱动的策略来提高收入和利润。这些关联规则在分析消费者购买行为的数据挖掘中至关重要。零售商的一些最重要的战略,如客户分析、购物篮分析和产品聚类,都能够通过关联规则挖掘获得有价值的见解。

最后,非常感谢你读到最后。我希望你喜欢这篇文章!

照片由刘汉宁·内巴霍在 Unsplash 上拍摄

参考

【1】默罕默德和阿科克。一种改进的关联规则 Apriori 算法。(2014).国际自然语言计算杂志。3.2014.3103

【2】d . h . Goh,R.P. Ang。关联规则挖掘简介:在青少年咨询和求助行为中的应用。 (2007)。行为研究方法 39、259–266

【3】拉什卡。机器学习扩展文档。(2021).检索自:https://rasbt.github.io/mlxtend/

【4】a .哈格伯格,d .舒尔特,p .斯沃特。 NetworkX 参考版本 2.7.1 。(2022).检索自:https://networkx.org/

【5】h . ded hia。根据 GPL 2 许可的杂货数据集。(2020).检索自:https://www . ka ggle . com/datasets/heeraldehia/杂货-数据集

揭示的数据模型

原文:https://towardsdatascience.com/data-models-revealed-how-to-choose-the-right-model-647f19469b89

如何选择合适的型号

洛伦佐·埃雷拉在 Unsplash 上的照片

自本世纪初网络泡沫以来,软件一直主宰着世界。在过去的 20 年里,技术变得更加容易接近,更加个人化,更加便携。

这些年来,软件和应用程序发展迅速,驱动它们的数据模型也是如此。不可否认,好的数据模型对软件开发是有影响的。

简单来说,

数据模型很大程度上决定了在其上运行的软件的特性和局限性。

好软件上的错误数据模型很可能等同于糟糕的软件体验..因此,为您的应用选择正确的模型非常重要。

自从 Edgar Codd 在 1970 年提出第一个可以想象的关系模型以来,在过去的 50 年中,数据建模的概念已经经历了一段时间。

下面的数据模型在改变我们今天开发软件的方式上起了很大的作用。

  • 关系模型
  • 文档模型
  • 图形模型

在下面的章节中,我们将介绍这些数据模型、查询语言支持和一些关键指标,以帮助您找到正确的方向。

没有经过验证的原则来选择正确的模式。在接下来的部分中,您可以在数据中找到需要注意的模式,以确定自然适合您的用例的模型。

什么是关系模型?

可能是最著名的数据模型,其中数据以由组成的关系(表)的形式组织。列也称为属性,是关系的属性,元组是包含单个记录的表中的单行。

创建关系模型背后的想法是将数据如何存储、结构化和检索的复杂性隐藏在一个干净的界面后面。这也被称为 声明式 模型,在这种模型中,用户只需要指定他们需要从系统中得到什么,而不用担心系统是如何完成的。

历史数据被表示为一棵大树,但它不适合表示多对多的关系,因此发明了关系模型,数据以表格的形式存储。这种在表中存储数据的格式对于最终用户和数据库系统来说都是非常直观的,这不足为奇。

图 1:关系表(作者图片)

除了能够直观地存储数据之外,关系模型还提供了诸如原子性、一致性、隔离性和持久性等好处,这些都是现代关系数据库的基本特征之一。

查询语言和 DBMS 选项

猜这个没分。SQL 几乎是关系模型的同义词。作为世界上最流行的查询语言之一,SQL 非常适合运行关系查询。

SQL 允许标准的关系操作

  • 创建(插入)
  • 检索(选择)
  • 更新
  • 删除

大多数数据库供应商都提供某种形式的关系数据库产品。以下是基于市场份额的最受欢迎的数据库系统。

  • 神谕
  • 关系型数据库
  • Microsoft SQL Server
  • 精力

随着云的出现,现在很多都在转向可扩展的云数据库,比如 Azure SQL 数据库、Amazon RDS、Google Cloud SQL 等等。

何时考虑关系模型?

大多数情况下,关系模型几乎适用于任何用例,因为它简单而直观。在以下情况下使用关系模型

  • 你熟悉 SQL。掌握一个数据模型需要付出很多努力,而 SQL 有一个强大的技术社区,提供有良好文档记录的解决方案,您很可能不会遇到无法解决的问题。
  • 您的数据是高度结构化的,并且您期望模式中的变化最小。
  • 您的数据很简单,本质上是高度事务性的。例如:商店中的交易或客户的银行取款和存款。
  • 您有多对多的关系,并且严重依赖连接来构建复杂的查询和报告。

什么是文档模型?

2010 年以后,数据的数量、种类和速度超出想象,这在很大程度上推动了采用新模型的迫切需求。

需要不受限制地表达数据*。于是 NoSQL 模型的诞生被解释为 而不仅仅是 SQL *

今天的大多数应用程序使用面向对象的编程范式,这使得关系模型的一个巨大缺点变得非常突出。由于数据存储在关系表中,通常需要一个转换层来将应用程序代码中的对象映射到分布在数据库中几个表中的对象。您可能对术语对象关系映射器(ORM)很熟悉,SQL Alchemy 就是其中之一。

支持文档模型的主要论据是数据局部性和模式灵活性。在关系模型中,单个对象可以跨多个表存储,而在面向文档的模型中,给定对象的所有信息都存储在数据库的单个实例中。这总是消除了对 ORM 层的需求。

让我们以用文档模型的形式表示简历为例。您可以将这种数据结构编码为 XML 或 JSON,两者都是文档模型的子类。作为一个例子,JSON 更简单。

上面的表示更适合这种数据结构,因为它具有更好的数据局部性。如果必须在关系模型中表示相同的内容,则必须将数据拆分并存储在多个表中。数据的检索需要杂乱的连接。在 JSON 格式中,所有相关信息都在一个地方,一个查询就足够了。

与关系数据库不同,文档数据库还提供了模式灵活性。没有模式意味着新的键和值可以添加到文档中。例如,在上面的文档中,在简历中引入一个名为证书的新部分作为一个新的字段是非常容易的。**

这也被称为 读取模式 ,应用程序仅在数据被读取时解释数据的结构。另一方面,大多数关系数据库执行一种模式,也称为 写模式 ,其中数据库确保所有写入的数据都符合特定的模式。

当您希望数据之间有大量的互连性时,文档模型就变得不那么吸引人了。文档模型中对连接的需求越多,应用程序就越需要尽力实现良好的性能。对于高度互联的数据,关系模型是可以接受的,但是 图模型 更自然。下一节将详细介绍这一点。

查询语言和 DBMS 选项

  • MongoDB——一个开源的面向文档的数据库系统,它有自己的语言,称为 MongoDB 查询语言。
  • azure Cosmos DB——微软提供的一个多模型数据库,它甚至允许你使用 SQL 查询 JSON 条目。
  • Amazon Dynamo DB —使用 PartiQL(一种 SQL 兼容的查询语言)查询 NoSQL 数据库。

何时考虑文档模型?

  • 如果您的数据是异构的:文档模型允许将不同类型和格式的数据存储在一起,而不需要预先定义模式。
  • 模式灵活性。您的数据在不断发展,无法强制符合特定的模式。
  • 应用程序严重依赖于对象,ORM 很慢。
  • 数据局部性。如果您希望将数据放在同一位置以获得更快的读取性能。

针对数据局部性的优化不仅适用于文档模型,还有其他 NoSQL 模型也支持这种属性。 列族Cassandra 和 Bigtable 等数据库提供了一种针对数据局部性进行优化的混合模型。这种类型的模型适用于数据仓库、商业智能报表,因为它们在聚合方面提供了高性能。

什么是图模型?

关系使我们成为人类。如果是关系造就了你的数据呢?随着数据点之间的互联变得复杂,需要一个新的英雄。

图形数据模型通常属于 NoSQL 的范畴。一个图由两个对象组成- 顶点 ,例如在一个社交网络图中,人是顶点,边代表哪些人相互跟随。

以图表的形式实现、构造和查询数据的方法有很多种。 属性图模型 就是其中之一,由构建现代图形数据库的先驱之一 Neo4j 实现。

在属性图模型中,顶点具有唯一的 ID、输出边、输入边和一组属性。边由唯一 ID、起始顶点、结束顶点、描述关系的标签和一组属性组成。

让我们以两个人安迪和伯特的社交图为例。

图 2:社交图(作者图片)

上面的图表是自我描述的,不需要更多的解释。该模型的重要方面包括:

  • 任何顶点都可以使用边连接到另一个顶点。没有底层模式强制规定什么可以连接,什么不可以连接。只有关系才能定义它。
  • 从任意一个顶点开始,你可以很容易地沿着顶点链遍历图形。
  • 使用标签来适当地定义关系,几种不同类型的信息可以存储在同一个图中。

这样一个模型的好处是,你可以很容易地将这两个人的更多事实无缝地结合在一起。例如,您可以通过添加一个音乐类型的顶点和一条连接人们各自兴趣的边来表示每个人喜欢什么类型的音乐。

图形模型与应用程序发展的速度相匹配,并且易于适应应用程序的变化。

查询语言和 DBMS 选项

尽管没有一种通用的查询语言适用于图模型,但是市场上有许多产品通常与一个供应商相关联。

Cypher 是用于 Neo4j 数据库的声明式查询语言。下面的例子显示了为上面的图形例子插入部分数据的 cypher 查询。

**CREATE
(Andy:Person {name:'Andy'}),
(Bert:Person {name:'Bert'}),
(Newyork:Location {name:'Newyork'}),
(Walmart:Company {name:'Walmart'}),
(Andy) -[:works_in] -> (Walmart),
(Bert) -[:works_in] -> (Walmart),
(Andy) -[:lives_in] -> (Newyork)**

查找所有在沃尔玛工作的人。

**MATCH
(person) -[:works_in] -> (Walmart)
RETURN person.name**

什么时候考虑图模型?

  • 你的数据是高度关联的。关系是数据的一等公民。
  • 您的数据通常具有多对多的关系,关系模型需要复杂的连接,因此变得低效。
  • 社交网络、欺诈检测、物流等使用案例。

图形模型比其他模型更受用例和目的的驱动。上面的数据可以很容易地在关系数据库中建模,但是高效查询关系的需求允许图模型获得荣誉。

摘要

从历史上看,数据最初是以树的形式表示的,这种形式不适合多对多的关系,因此出现了关系模型。然后,开发人员发现需要一个模型来反映他们的应用程序的面向对象的范例,这导致了 NoSQL 模型的发明。

如今,每种模型设计都有自己的用途,没有放之四海而皆准的解决方案。模型的决定应该总是基于应用。

关系模型的统治地位已经持续了 30 多年,这在计算的历史上是一个伟大的壮举。

还有一些模型没有在本文中详细提及,如 列-家族模型、基因组数据库模型、全文搜索 等。

随着我们的进步,关系模型和 NoSQL 之间似乎有一些交叉。这是一件好事,因为这些模型相互补充,这是数据库在不久的将来要走的一条好道路。

参考

  1. 设计数据密集型应用 —马丁·克莱曼
  2. NoSQL 数据库的类型 — Guru99
  3. 何时使用 SQL — Integrant

数据可观察性与数据测试:您需要知道的一切

原文:https://towardsdatascience.com/data-observability-vs-data-testing-everything-you-need-to-know-6f3d7193b388

您已经测试了您的数据。你也需要数据的可观察性吗?

图片由来自Shutterstock.com的 ESB Professional 提供,通过标准许可购买

在过去的十年里,针对不良数据的第一道也是唯一一道防线就是测试。

类似于软件工程师在将代码推向生产之前使用单元测试来识别有问题的代码,数据工程师将利用测试来检测和防止潜在的数据质量问题进一步向下游发展。这种方法(大部分)很好——直到现代数据工作流程发展到公司开始接收如此多的数据,以至于单点故障不可行。

在软件工程的世界里,没有一个程序员会在没有测试的情况下将代码部署到产品中。类似地,如果没有持续的监控和可观察性,没有工程师会运行生产代码。

鉴于分析数据为这些软件应用提供了动力——更不用说更广泛业务的决策和战略了——我们为什么不将同样的勤奋应用于我们的数据管道呢?

数据是不断变化的,使用不可靠数据的后果远比不准确的仪表板或报告更为严重。即使是数据质量上看似最微不足道的错误,也可能滚雪球般演变成更大的问题。

最近,一位金融科技客户(我们称她为 Maria)解释了她的团队直到几天后才发现的货币转换错误是如何导致收入和工程时间的重大损失的。

Maria 和她的团队以为他们已经进行了所有适当的测试来防止数据停机,但事实并非如此。发生了什么事?

在任何数据系统中,都有两种类型的数据质量问题:你能预测的(已知的未知)和你不能预测的(未知的未知)。虽然 Maria 和她的团队进行了数百次测试来捕捉一组离散的已知未知,但他们没有明确的方法来解释未知的未知,或者随着公司数据生态系统的发展,添加新的测试来解释已知的未知。

玛丽亚解决问题时,损害已经造成。

事实是,已知的未知和未知的未知需要两种不同的方法来测试和数据可观测性。以下是它们之间的区别,以及一些最佳团队为大规模解决数据质量问题所做的工作:

我应该什么时候测试我的数据?

在数据进入生产数据管道之前发现数据质量问题的最常见方法之一是测试数据。通过测试,数据工程师可以验证其组织对数据的假设,并编写逻辑来防止问题向下游发展。

数据测试是一个必备工具,有助于捕捉数据管道中出现的特定已知问题,并在新数据或代码打破您最初的假设时向您发出警告。

一些最常见的数据质量测试包括:

  • 空值 —是否有不应该存在的未知值(空值)?
  • —你的数据到了吗?如果是的话,你得到的是太多还是太少?
  • 分布 —数值是否在预期/要求的范围内?
  • 唯一性 —您的唯一 ID 字段中是否有重复值?
  • 已知不变量 —利润永远是收入和成本的差额吗?

数据测试非常类似于软件工程师如何使用测试来提醒他们对他们的应用程序可能发生的问题的理解。

但是,数据测试足以控制破损的数据管道吗?

与软件类似,数据是企业成功的基础。因此,它需要在任何时候都是可靠和值得信赖的。与站点可靠性工程师(SREs) 管理应用停机时间的方式相同,数据工程师需要专注于减少数据停机时间。

就像单元和集成测试不足以确保软件的可靠性一样,数据测试本身也不能解决数据可靠性的问题。

需要有一种方法来提醒你可能没有预料到的问题(未知的未知),以及随着你的公司吸收更多的数据,如果你能够神奇地克隆自己,你可以测试的问题。尽管如此,即使你可以克隆你自己——加倍你写测试的能力——这是对你时间的一个好的利用吗?

大概不会。需要有一种方法来覆盖你所有的基础,即使是在运动中。

什么时候应该使用数据可观察性?

即使是最全面的测试套件也无法解决整个堆栈中可能出现的所有问题——不仅仅是特定测试覆盖的部分。为了考虑未知的未知,并跟上数据管道中不断增长的已知未知量,您还需要在可观察性上投资。

为了保证高数据可靠性,您的数据质量方法必须对您的数据管道具有端到端的可见性。与 DevOps 可观察性解决方案(即 Datadog 和 New Relic )一样,数据可观察性使用自动化监控、警报和分类来识别和评估数据质量问题。

可观察性涵盖的数据质量问题包括:

  • 一个不更新的 Looker 仪表盘或报告,陈旧的数据几个月都不会被注意到,直到一位业务主管在季度末访问它并注意到数据是错误的。
  • 对您的组织的代码库的一个小更改,导致 API 停止收集为 Tableau 仪表板中的关键字段提供动力的数据。
  • 对 JSON 模式的一次意外更改使 50,000 行在一夜之间变成了 500,000 行。
  • 您的 ETL(或 ELT)发生了意想不到的变化,导致一些测试无法运行,从而导致几天内未被注意到的数据质量问题。
  • 这个测试已经成为您的管道的一部分很多年了,但是最近没有更新来反映当前的业务逻辑。

在与数百个数据团队交谈后,根据经验,我发现大约 80%的数据问题无法通过单独的测试来解决。图片由蒙特卡洛提供。

如果测试您的数据发现了 20%的数据质量问题,那么另外 80%是由数据可观察性引起的。数据可观察性也有助于您的团队确定“为什么?”破损的数据管道背后——即使问题与数据本身无关。

数据可观察性不同于数据测试的四个方面

数据可观察性和数据测试帮助您实现相同的目标——可靠的数据。测试和可观察性都很重要,这两种方法是齐头并进的,但是每种方法保证数据质量的方式不同。

以下是可观察性不同于测试数据的四个重要方面:

1)端到端覆盖

现代数据环境非常复杂,对于大多数数据团队来说,创建和维护高覆盖率的健壮测试套件在许多情况下是不可能的,也是不可取的。

由于数据的复杂性,数据工程师不可能预测开发过程中的所有可能性。在测试不足的地方,可观察性填补了空白,为您的整个数据堆栈提供了额外的可见性。

2)可扩展性

编写、维护和删除测试以适应业务需求可能是具有挑战性的,特别是随着数据团队的增长和公司跨多个领域分布数据。我们从数据工程师那里听到的一个常见主题是在他们的数据生态系统中扩展数据测试的复杂性。

如果您经常回到您的数据管道,并为现有管道增加测试覆盖,这可能是对您的数据团队成员的巨大投资。

此外,当关于数据管道的关键知识掌握在数据团队的少数成员手中时,追溯性地解决测试债务将成为一件麻烦的事情——并导致资源和精力的转移,而这些资源和精力本可以用在移动指针的项目上。

可观察性有助于缓解跨管道扩展数据可靠性带来的一些挑战。通过使用基于 ML 的方法从过去的数据中学习并监控新的输入数据,数据团队可以在很少甚至没有投资的情况下获得对现有数据管道的可见性。由于能够设置自定义显示器,您的团队还可以确保涵盖独特的业务案例和重要资产。

3)根本原因和影响分析

测试有助于在数据进入生产之前发现问题。但是,即使是最强大的测试也无法捕捉到所有可能出现的问题——数据宕机仍然会发生。当它发生时,可观察性使得团队更快更容易地解决发生在数据生命周期每个阶段的问题。

由于数据可观察性包括端到端的沿袭,当数据中断时,数据工程师可以快速识别上游和下游的依赖关系。这使得根本原因分析更快,并帮助团队成员主动通知受影响的业务用户,并在他们解决问题时让他们了解情况。

4)节省时间和资源

数据工程师面临的最突出的挑战之一是速度,他们经常牺牲质量来实现速度。你的数据团队已经在时间和资源上受到限制,而你的首席营销官已经烦了你好几个星期了,你不能再等了。当然,在转换数据之前,你应该设置许多测试,但是时间不够。

数据可观察性充当了针对坏数据的保险政策,并加快了您的团队部署新管道的速度。它不仅涵盖了那些未知的未知,还帮助您捕捉与您的数据相关的已知问题。

那么,你两者都需要吗?

无论您的测试套件有多好,除非您的数据是静态的,否则指望测试本身就能避免数据停机是不可行的。随着数据栈的发展,编写新的测试、更新现有的测试和阈值以及废弃旧的测试所需的升级是乏味的,即使对于人员最充足的团队也是如此。

虽然数据测试可以用于较小的管道,但它不能很好地跨分布式数据系统扩展为了满足这种新常态的需求,数据团队必须依靠测试和端到端的可观察性。

有了这种双管齐下的数据质量方法,您对停机时间的防御变得更加强大。

有兴趣了解更多关于数据可观察性如何补充您的测试吗?伸手 利奥斯科特和* 其余的蒙特卡洛团队 *

斯科特·奥利里 对本文有贡献。

Pandas 中使用流水线的数据预处理

原文:https://towardsdatascience.com/data-preprocessing-using-pipeline-in-pandas-6170f4456796

使用熊猫管道函数编写更好的代码

动机

现实生活中的数据会经历许多预处理阶段,如质量评估、清洗、转换、归约等。在大多数情况下,使用熊猫时,这些步骤的执行方式并不总是有效的。

如果我们能有一种方法,能够以最有效的方式在一个链中执行所有的处理功能,那会怎么样?这就是熊猫的[**Pipe**](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pipe.html)派上用场的地方。

在这篇短文中,我们将首先了解熊猫的烟斗是什么。然后,我们将介绍几个实践案例来展示它的作用。

开始

在本节结束时,您将理解什么是Pipe,然后在对数据集有了一个好的概念之后,对我们试图解决的业务问题有一个更好的理解。

什么是管道?

Pipe 是一个 Pandas 函数,用于通过将前一个函数的结果传递给链中的下一个函数来执行多个函数。这是一个很好的方法,可以使代码更清晰,可读性更好。

现在我们知道我们正在处理什么,让我们看看实践案例的数据集。

让我们创建数据集

这个数据集可能对招聘经理更有意义。但是,如果你不是,就不用担心😀。基本上,它存储了来自不同非洲大城市的申请人的信息。正如您在下面看到的,大多数列都是不言自明的。

pipe _ candidates.py

候选人的原始信息(图片由作者提供)

  • Full_Name是候选人的全名。
  • Degree是申请期间考生的学位。
  • From对应于候选人来自哪里。
  • Application_date是候选人申请职位的时间。
  • From_office (min)是到求职者所在城市的公司办公室的通勤时间(以分钟为单位)。

问题陈述

基于这些信息,招聘经理希望您作为数据科学家创建下表,以帮助他获得关于每个候选人的更详细的信息。

基于业务需求的最终预期表格(图片由作者提供)

使用管道前的独立预处理

在弄脏我们的手之前还有一件事!我们需要为图像中显示的每个任务实现相应的功能。本节的目标是在使用 Pipe 获得最终结果之前,以独立的方式执行每个任务的结果。

→任务 1:全名中的名和姓:全名的格式如下[名][逗号][姓]。所以我们可以使用下面的函数来完成这项工作。

结果 _ 任务 1.py

从第 11 行,我们从任务 1 的执行中得到以下结果。

任务 1:从全名到名和姓(图片由作者提供)

→任务 2: 我们要从申请日期,日,月,年,星期几,年中的月。

结果 _ 任务 2.py

从第 15 行,我们从任务 2 的执行中得到以下结果。

任务 2:从申请日期到更详细的时间信息(图片由作者提供)

→任务 2: 让你的招聘经理满意的最后一个任务是为每个候选人创建一条如下格式的文本信息,其中[候选人]是候选人的全名:

[候选人]拥有[学位],住在离办公室[From_office (min)]的地方。

结果 _ 任务 3.py

任务 2:从所有栏目中生成候选人信息(图片由作者提供)

函数与管道链接

既然我们已经知道了每个函数的工作原理以及它们的预期结果,那么是时候使用 Pipe 将它们全部合并到一个管道中了。使用 Pipe 不需要额外的库,因为它是一个 Pandas 内置函数,一般语法如下:

final_dataset = (my_original_data.
                 pipe(my_first_function, "single_column").
                 pipe(my_second_function, "[col1, ...colN]").
                 pipe(my_third_function).
                 ...
                 pipe(my_nth_function)
                 )
  • final_dateset是应用所有函数后的最终预处理数据集。
  • my_original_data是原始数据集。
  • pipe(my_first_function, "single_column")意味着my_first_function需要single_column来完成任务。
  • pipe(my_second_function, "[col1, ..., colN]")表示my_second_function需要[col1, ..., colN]完成任务。
  • pipe(my_second_function,)意味着不需要指定列名。

下面是前面格式对应的管道逻辑。请注意,在我们的案例中,顺序并不重要。但是如果我们需要名字和姓氏来计算 Info 列,这是可能的,这不是我们在这里所做的,因为我们直接使用全名。

创建 _ 管道. py

使用 Pipe 将 1 到 3 的所有任务组合在一起的最终结果(图片由作者提供)

结论

恭喜你!🎉 🍾您刚刚学习了如何使用 Pandas Pipe 进行多功能链接!我希望这篇文章是有帮助的,它将帮助您把预处理任务提高到一个新的水平。

此外,如果你喜欢阅读我的故事,并希望支持我的写作,可以考虑成为一个媒体成员。每月支付 5 美元,你就可以无限制地阅读媒体上的故事。

欢迎在媒体、推特和 YouTube 上关注我,或者在 LinkedIn 上问好。讨论人工智能、人工智能、数据科学、自然语言处理和人工智能是一种乐趣!

链接到源代码→ 此处

再见🏃🏾‍♂️

数据隐私:用我们看不见的数据回答问题

原文:https://towardsdatascience.com/data-privacy-answering-questions-using-data-we-cannot-see-98381ed2eec

差分隐私概念介绍

菲利普·卡岑伯格在 Unsplash 上拍摄的照片

公司为什么收集数据

在过去的十年里,人工智能(AI)和机器学习(ML)发展非常迅速,现在已经成为我们日常生活的一部分。例如,ML 算法通过识别不适当的内容来防止我们被垃圾邮件淹没,它们引导我们以最快的可能路线穿过城市,或者推荐我们可能喜欢的流媒体平台上的内容。

与经典的由软件工程师硬编码规则的算法相反,ML 自动从现有数据中学习这些规则。可用的数据越多,它们的性能就越好。因此,公司已经成为数据驱动的环境,专门从事数据收集、存储和提取过程,以开发出色的基于 ML 的服务。

作者图片

例如,流媒体平台收集关于我们的偏好和行为的数据,以训练 ML 算法。这些算法可以向每个客户提供他们可能喜欢的内容。这是一种双赢的局面:作为客户,我可以从改进的服务中受益,因为我不必手动搜索庞大的电影和电视剧集来找到我喜欢的内容。另一方面,公司不会失去我这个客户,因为总有新的内容可以消费。然而,也有不利的一面。我必须向公司披露我的流媒体习惯。当这些与个人相关的数据公之于众时,可能会对我产生不利或其他方面的影响。因此,我必须相信公司会安全地存储我的数据。

为什么数据应该匿名

如果可能的话,安全存储这些个人相关数据的努力是相当巨大的。但是,不仅存储困难,使用也困难。假设一家公司雇佣数据科学家,根据这些数据来改进他们的服务。在这种情况下,每个数据科学家都需要访问个人相关数据。因此,必须确保这些人可靠地工作,并且不滥用他们对数据的洞察力。

为了规避这些问题,数据匿名化的想法似乎是显而易见的:只要不存储允许直接识别个人身份的数据(如姓名、地址等)即可。然而在现实中,事情并没有那么简单。

不匿名的匿名数据

由 Unsplash 上的 Venti Views 拍摄的照片

2006 年,网飞发起了一场公开竞赛,让人们提出更好的推荐系统。为此,他们公布了来自 50 万客户的 1000 万份电影排名。为了保护这些客户的隐私,个人信息被删除,姓名被替换为随机数字。乍一看,人们会将这样的数据集归类为匿名数据集。

作者图片

奥斯汀德克萨斯大学的研究人员认识到,每个顾客的总体评价几乎是独一无二的。例如,在上图中,电影 A 的一星、电影 B 的四星和电影 C 的五星的评级组合对于用户 001 是唯一的。因此,即使个人信息已经被移除,评级的唯一性潜在地允许用户的重新识别。

Arvind Narayanan 和 Vitaly Shmatikov [1]正是这么做的:他们证明了通过将网飞的数据集与从互联网电影数据库 (IMDb)搜集的公开信息相结合,有可能消除大部分顾客的匿名性。事实证明,用户不仅可能在网飞应用程序中给出类似的评级,在 IMDb 也是如此。

这表明,当数据通过简单地删除姓名等直接标识符而被“匿名化”时,存在固有的安全问题。:去匿名化的成功取决于攻击者的背景知识。然而,攻击者拥有的背景知识量是无法猜测的。更重要的是,背景知识将随着时间不断增加,因为可用数据的数量在不断增加。今天无法识别的数据集,十年后可能会变得很容易。

这就引出了一个问题:不看数据就用数据来回答问题是不是很优雅?在电影推荐算法的情况下,这将意味着我们根据以前的用户数据来改进算法,而不需要查看这些数据。

更好的方法:用我们看不见的数据来回答问题

为了更好地理解如何利用我们看不见的数据来回答问题,让我们考虑一个非常简单的随机选择的例子:假设我们想知道我们有多少同事吸食可卡因。由于这是一个敏感的问题,我们想保护每个参与者,使他们的答案不会被公开。为此,我们创建了一个安全的数据库,并确保当参与者输入数据时,其身份是未知的。此外,没有与参与者相关的数据(如姓名等。)存储在这个数据库中。

在我们的每个参与者都回答了问题并将他们的数据输入数据库后,我们对数据库进行了一些统计分析,发现 20%的参与者消费可卡因,并公布了这些发现。

作者图片

这种方法的一个大问题是,即使数据库不包含任何与参与者相关的信息,也不能保证他们的匿名性。例如,如果我想知道我的同事中谁吸毒,我必须找出 n-1 个参与者的答案。在这个例子中,我可以问每个参与者他们是否吸食可卡因。当然,每个参与者都可以自由地与我分享他们的答案,因为这是他们的数据,他们可以对他们的数据做任何他们想做的事情。

有了 n-1 个参与者的答案,结合这些发现和公布的 20%的可卡因消费者来推断最后一个参与者的答案是一件很容易的事情,这个人不想和我分享他们的答案。

类似于网飞数据的例子,去匿名化的成功取决于攻击者的背景知识。

一种更好的完全保护每个参与者隐私的方法是一种叫做差分隐私的技术。差异隐私是 Cynthia Dwork 在 2006 年定义的一个框架[2],它指出,无论有什么其他研究、数据集或信息源可用,数据主体都不会受到不利或其他影响。这意味着,通过应用差分隐私,即使在无限计算能力的情况下,并且当所有其他参与者的答案都是已知的时,每个个体的隐私也得到保护。这听起来可能是一个困难的任务,但基本概念很简单:我们只需要包含一点随机性。因此,无论何时,只要对手想出了关于特定数据主体的特定属性,人们总是可以争辩说该属性不是真实的,而是随机生成的。这个概念叫做似是而非的可否认性。

根据何时包含这种随机性,差分隐私分为两类。全局差分隐私假设有一个可信任的管理员或数据库所有者。因此,每当不可信的第三方查询一些数据时,随机性就包含在内。

全球差分隐私草图:原始(私人)数据被添加到一个具有 tursted 管理器的数据库中。每当第三方用户查询数据库时,答案中都会包含一些随机噪声。形象受到作者的启发[4]

相反,本地差异隐私假设没有可信任的数据库所有者。因此,在收集/生成数据时直接增加了随机性。

局部差分隐私草图:在添加到数据库之前,将随机噪声添加到原始(私有)数据中。因此,不需要可信的数据库管理员。形象受到作者的启发[4]

回到可卡因调查,当地差别隐私的实施是直接的:每个参与者在回答之前扔两次硬币。当第一次掷硬币结果是正面时,参与者给出正确答案。另一方面,当是反面时,参与者回答第二次投掷(正面=是,反面=否)。在我们的数据库中,我们然后存储每个参与者的答案,而不知道它是参与者的真实答案,还是只是一个投掷硬币的随机答案。现在,即使攻击者知道除了一个参与者之外的所有参与者的真实答案,这个参与者仍然受到保护,因为有可能貌似合理地否认攻击者的推断答案是真实的。这是差分隐私的一个重要性质:每个参与者的隐私都得到了保护,与攻击者的背景知识无关。

作者图片

当然,在原始数据中加入噪声会影响我们调查的结果。然而,这种噪声的分布是已知的,并且当数据集足够大时,在数据分析过程中补偿这种噪声是容易的任务。例如,在我们的调查中,我们知道 50%的所有参与者随机给出了 50%是和 50%否的答案。在我们的评估中,我们会发现(而不是 20%),35%的所有参与者回答是(35%是真实答案 20%和 50%随机答案的组合)。通过补偿随机答案,我们仍然发现 20%的参与者消费可卡因。

结论

总之,我们能够在不查看原始数据的情况下回答有多少员工吸食可卡因的问题。因此,在数据集中重新识别一个人的答案(几乎)是不可能的。更重要的是,再识别的成功不取决于背景知识,也不取决于计算能力。

如果你喜欢差分隐私的概念,我推荐以下安德鲁·特拉斯克举办的伟大演讲: 隐私保护 AI(安德鲁·特拉斯克)| MIT 深度学习系列

感谢阅读!

参考

[1]大型稀疏数据集的鲁棒去匿名化— Arvind Narayanan 和 Vitaly Shmatikov
[2]差分隐私:结果调查—辛西娅·德沃克
[3]【https://www.openmined.org/
【4】https://blog . open mined . org/basics-local-Differential-Privacy-vs-global-Differential-Privacy/
[5】隐私保护 AI(安德鲁·特拉斯克)|麻省理工深度学习系列

使用 inotifywait 实现数据处理自动化

原文:https://towardsdatascience.com/data-processing-automation-with-inotifywait-663aba0c560a

如何在拥有生产就绪的 MLOps 平台之前实现自动化

由活动创作者在 Unsplash 上拍摄的照片

当在集群或任何其他类型的共享处理系统中工作时,一个很快出现的问题是如何容易地共享数据处理工具。所有用户都有自己的环境、库,并且软件的功能可以秘密地依赖于. bashrc 中定义的一些路径。如果编写一些有价值的数据处理工具却不能与真正需要它们的人共享,那就太遗憾了。

此外,你真的不希望人们每次需要时都要求你为他们处理,是吗?

很明显,答案是使用 MLOps 平台,以及像特性库这样的工具。然而,当一个还没有到位时,建立一个需要时间,甚至更糟的是,从零开始建立它。在这种情况下,我们在等待的同时有什么可以做的吗?

https://www.featurestore.org/what-is-a-feature-store

任何事情都比花大量时间运行来自公司的所有请求的流程,而不是进一步开发您的数据处理或新功能/项目要好。

节省时间的解决方案显然是自动化,但您不必运行完整的 MLOps 管道就可以开始享受自动化的好处。

什么是 inotifywait?

inotifywa 是一个用于 linux 的 cli 工具,它只做一件事:监听目录中发生的事件,并在一个事件发生时打印一条消息。它基于一个名字相似的工具:inotify,但是inotifywait可以递归地监听子文件夹,而前者则不能。

就是这样。倾听事件,并在事件发生时写下一些东西。然而,这足以开启有用的自动化。

事实上,每次它监听一个目录或其中一个子目录上的新事件时,都会打印一条消息,其中包含事件发生的路径、触发事件的文件的文件名以及事件类型。然后,在 bash 中,您可以读取这样的消息,并根据事件类型决定一个动作。例如,您可以运行一个数据处理脚本,该脚本在目录中新创建的文件上运行。

安装 inotifywait

inotifywait 通常不是发行版默认设置的一部分,而是 inotify-tools 的一部分。它的安装依赖于 linux 发行版,可以从源或包 管理器中完成。只需选择最适合您的使用案例和发行版的选项。

请注意,它总是需要管理员权限才能安装。

一个例子

让我们看看如何使用 inotifywait 递归地监视目录,并发出文件创建的所有事件。换句话说,每当文件夹中的文件创建完成时,它都会打印一些内容。 Complete 在这里很重要,因为我们不希望事件在开始写文件时被触发,而是在结束时被触发。

$ inotifywait -m /path/to/target/folder -e close_write -r |
    while read dir action file; do
        python data_processing.py ${dir}/${file}
    done

让我们一点一点来看。首先,我们启动 inotifywait 来监控在-m之后指定的目录,由于-r的原因,递归地进行监控。-e close_write表示发出所有且仅发出文件创建类型的事件。

然后,inotifywait监听该文件夹,每次在其中或其子文件夹中创建新文件时,它都会写入 3 条信息:事件发生的目录路径、事件类型和文件名。本例中的事件类型只有close_write,但是我们可以指定多个参数到-e,用逗号分隔。查看 inotifywait 手册了解更多关于事件类型的信息。我们可以用文件名来处理文件。

脚本的第二部分,while read dir action file读取来自 inotifywait 的行(因为它在管道之前),并将每行的三个部分分配给 bash 变量$dir, $action, $file。最后,我们可以使用这些变量来启动我们的数据处理工具。

让我们假设我们有一个新工具,它运行一些文本规范化规则,然后用附加信息(如词性标记)注释文本。这些转换对于团队中的其他人或者其他团队执行的一些下游任务是必需的。

然后,我们可以要求有新文本数据的人将它们添加到受监控的目录中,这个简单的脚本会在它们被添加到文件夹后立即处理它们。

与目前市场上提供的相比,它看起来像是自动化的原始形式,但是如果团队还没有进行 MLOps,那么它可能是一个合理的选择。

结论

在我们快节奏的工作环境中,做得好的自动化是生产力的关键,你的工作是(一种)软件工程师或数据科学家。当它起作用时,它完成工作,而你可以把你宝贵的精神能量花在新的挑战性任务上。

然而,正确地完成自动化本身需要大量的工作,如果没有合适的自动化框架就更是如此。

幸运的是,几十年来在操作系统工具方面的工作给了我们大量的工具来设置简单的自动化,这些工具可以在准备“真正的东西”时使用。是这些工具中的一种,你对它的使用只受你想象力的限制。

感谢您的阅读!

更多来自我

💔-common-bug-sources-and-how-to-avoid-them-182f9974d2ab>

AWS Glue 和 Great Expectations 上的数据质量比较/用 V3 API 更新

原文:https://towardsdatascience.com/data-quality-comparison-on-aws-glue-and-great-expectations-70af5bdfe39c

图片来自 freepik 的 anustudio

在我以前的文章(贴一和贴二)中,我描述了如何处理存储为中等大小(~500 MB)的 Apache Parquet 文件的同构数据源。但是如果需要处理大数据呢?如何在 AWS 上用《远大前程》来测试?如何比较两个非同质数据集?在本文中,我将探索一种方法来做到这一点。

挑战

Provectus 数据工程团队正在开发由 Pandas 引擎支持的数据管道。最初,Pandas 已经足够了,但是随着数据量的增长,该团队面临着 Pandas 在处理大数据方面的局限性。他们的解决方案是使用阿帕奇火花,而不是熊猫。虽然这是合理的,但他们还需要确保新算法不会出现数据问题。他们正在寻找一种方法来比较他们在 Pandas 上的小型黄金数据集和 Apache Spark 上的大型数据集。有了这些信息,我们开始设计解决方案。

AWS 胶水

首先,我们需要一个可以读取大数据帧的工具。我们排除了对我们的基本解决方案做太多改变的可能性,因为 Pandas Profiling 只适用于 Pandas,而且我们还没有尝试对 Apache Spark 使用 Great Expectations。所以,我们开始了探索过程。

我们的第一个选择是用黄昏代替熊猫。然而,在对 AWS Lambda 进行测试后,很明显它没有改变任何东西——机器无法将如此大量的数据上传到 RAM,以有效地读取 df。

我们的第二个选择是使用 AWS Glue Python,因为它可以处理开箱即用的熊猫。在这个实例中安装必要的库是一个相当大的挑战,结果是不可接受的——我们再次收到 OutMemoryError。

我们最后的选择是尝试使用 Apache Spark。这里我们有两种可能的变体:AWS Glue Spark 和 Amazon EMR。我们选择尝试 AWS Glue Spark,因为这只是一个实验,我们不打算推出基础设施或任何其他组件。最重要的是,AWS Glue 是无服务器的,这满足了使用无服务器服务的需求。

在这一步中,我们需要完成两个基本操作:概要分析和数据测试。我们通常使用 Panda Profiling 作为分析工具,但是它没有 Spark 实现。相反,我们决定使用 spark_df_profiling ,它基于 Pandas Profiling,但支持 spark。Great Expectations 也支持 Spark,所以数据测试部分很容易。

最大的挑战是发布带有必要库的 AWS Glue Spark:
1。使用带有亚马逊 S3 适配器的预配置 great_expectations.yaml 将您的初始 Great Expectations 文件夹上传到亚马逊 S3

V3 API 通用电气:

2.使用作业参数创建 AWS Glue Spark 作业来安装库:

*— additional-python-modules* ***awswrangler, great_expectations,*** [***https://github.com/julioasotodv/spark-df-profiling/archive/master.zip,***](https://github.com/julioasotodv/spark-df-profiling/archive/master.zip,) ***pyyaml, datacompy***

3.照常初始化库

V2:

V3:

4.把 ge.yaml 和 df 读成 Spark

5.使用 spark_df_profiling 进行配置,并动态更改 Great Expectations 配置

6.初始化远大的期望并开始运行测试

V2:

V3:

7.读取 Pandas 数据集并运行 DataComPy

之后,你会收到预期的结果。

稍微介绍一下 DataComPy :它是一个可以显示统计数据和模式变化的库。它使我们能够从测试角度获得更多的数据可见性,并为我们提供关于数据集的附加信息。

DataComPy Comparison--------------------DataFrame Summary-----------------DataFrame  Columns  Rows0  original        5     61       new        4     5Column Summary--------------Number of columns in common: 4Number of columns in original but not in new: 1Number of columns in new but not in original: 0Row Summary-----------Matched on: acct_idAny duplicates on match values: YesAbsolute Tolerance: 0.0001Relative Tolerance: 0Number of rows in common: 5Number of rows in original but not in new: 1Number of rows in new but not in original: 0Number of rows with some compared columns unequal: 5Number of rows with all compared columns equal: 0Column Comparison-----------------Number of columns compared with some values unequal: 3Number of columns compared with all values equal: 1Total number of values which compare unequal: 7Columns with Unequal Values or Types------------------------------------Column original dtype new dtype  # Unequal  Max Diff  # Null Diff0  dollar_amt        float64   float64          1    0.0500            01   float_fld        float64   float64          4    0.0005            32        name         object    object          2    0.0000            0Sample Rows with Unequal Values-------------------------------acct_id  dollar_amt (original)  dollar_amt (new)0  10000001234                 123.45             123.4acct_id  float_fld (original)  float_fld (new)0  10000001234            14530.1555        14530.1555  10000001238                   NaN          111.0002  10000001236                   NaN            1.0001  10000001235                1.0000              NaNacct_id name (original)            name (new)0  10000001234  George Maharis  George Michael Bluth3  10000001237      Bob Loblaw         Robert LoblawSample Rows Only in original (First 10 Columns)-----------------------------------------------acct_id  dollar_amt           name  float_fld    date_fld4  10000001238        1.05  Lucille Bluth        NaN  2017-01-01

生产者和消费者的概念

我们已经学习了如何使用 Apache Spark 的必要工具集。让我们回到第一步,更深入地研究比较概念。主要思想很简单:您需要一个黄金数据集(生产者)并基于它生成测试,然后对它运行,并对目标数据集(消费者)运行这些测试,以比较质量。要访问所有报告,您需要实现一个元数据存储和一个 BI 仪表板。

在这里,您可以看到参考架构:

作者图片

管道

为了实现参考架构,让我们重新使用我们的基本解决方案和 AWS Step 函数和 AWS Lambda。(查看这篇文章了解技术细节。)您需要:

  1. 对 pandas_df 运行分析
  2. 动态生成测试
  3. 针对 spark_df 运行分析
  4. 针对 spark_df 运行准备好的测试
  5. 运行 DataComPy

作者图片

这里只需要一个技术说明:在生产者步骤中,我们将项目推送到元数据存储,并保存到有效负载 id;在消费者步骤中,我们需要更新这个项目。

从 ETL 的角度来看,这看起来很简单:

作者图片

实施理念

上述经验帮助我们为我们的一个客户 Lane Health 实施了一个数据 QA 解决方案。挑战在于车道健康数据是不均匀的,并且获取和读取数据的方式有很大不同。创建一个用于处理高负载的通用管道并不容易。我们将其构建为一个两步解决方案:

  1. 从 PostgreSQL CDC 迁移到亚马逊 S3
  2. Apache 胡迪上的数据转换

作者图片

作者图片

结论

本文探索了使用带有 AWS Glue (Apache Spark ETL)的 Great Expectations 来比较两个数据集的质量的方法,而不需要行比较、字节大小等。我们为我们的一个商业客户演示了这种数据质量方法的实现。

如果您有任何问题或建议,欢迎在下面的评论中联系我,或者直接联系 LinkedIn !

机器学习模型的数据质量考虑

原文:https://towardsdatascience.com/data-quality-considerations-for-machine-learning-models-dcbe9cab34cb

降低“垃圾输出中的垃圾”对机器学习模型的影响

图片来自 Pixabay

在运行机器学习算法之前,确保您拥有良好的数据质量是整个数据科学和机器学习工作流程中至关重要的一步。使用质量差的数据会导致结果严重恶化,并在根据这些结果做出决定时产生进一步的后果。

当开始进入数据科学和机器学习的世界时,我们在培训课程中经常遇到的数据集已经被清理和设置为提供一个好的答案。然而,在现实世界中,这是完全不同的。

真实世界的数据通常包含许多问题,从缺失值到错误值。如果在将数据输入机器学习模型之前没有处理好这一点,可能会导致严重的后果。这些后果可能会产生连锁反应,如财务影响,甚至健康和安全问题。

俗话说,垃圾进来,垃圾出去。如果我们将低质量的数据或错误选择的数据输入到我们的模型中,我们可以预期结果也将是低质量的。

什么是数据质量?

关于数据质量到底是什么,互联网上和文章中有许多定义。

最常用的定义是“适合用于特定目的”。这可能包括确保数据适合实现业务目标、做出明智而有效的决策,以及优化未来的运营。

以下是文献中关于这一主题的一些定义。

来自 Mahanti (2019) —数据质量:维度、测量、战略、管理和治理:

“数据质量是数据满足企业规定的业务、系统和技术要求的能力。数据质量是对数据在特定环境下是否适合其用途的洞察或评估”

来自斯坎纳皮科&卡塔奇(2002)

“数据质量”一词是指数据应具备的一系列特征,如准确性,即正确程度,或通用性,即更新程度。”

来自豪格、扎卡里亚森和利恩普德(2013)

“数据质量通常被定义为‘适合使用’,即评估一些数据在多大程度上服务于用户的目的”

数据质量也由许多只关注质量的管理机构和组织来定义。

例如,在【2015】中,质量被定义为“一个对象的一组固有特性满足要求的程度”,其中固有指的是存在于一个对象内部而不是被赋予的属性。

挪威标准 NS 5801 将数据质量定义为“符合规定的要求”

应当指出,这些定义将数据质量评估视为数据的相对属性,而不是绝对属性。

数据质量差的代价

在企业中使用质量差的数据并做出决策的影响不仅仅是丢失行、错误值和不一致。

它会影响生产力。根据 Friedman 和 Smith 的研究,数据质量差会导致劳动生产率下降 20%。

这也被认为是 40%的新业务计划失败的主要原因。

根据 Gartner Quality Market Survey 的一项调查,从货币角度来看,数据质量差可能会使组织每年损失高达 1500 万美元。另外,据 IBM 称,这可能会使美国经济每年损失 3.1 万亿美元。

其他影响包括:

  • 品牌和声誉受损
  • 无能
  • 错过的机会
  • 收入损失

数据质量的维度

如上所述,许多定义指的是定义相对数据质量的维度或特征。

大多数出版物都遵循 6 个关键维度。让我们仔细看看它们。

6 数据质量的共同特征。作者创造的形象(麦克唐纳,2021)。

完整性:这是一个度量标准,用来衡量所有需要的数据是否都存在于数据集中,以及它是否满足正在进行的项目的目标。如果存在缺失数据,那么应该清楚如何处理这些数据。

此外,还应该检查数据中的默认值,因为它们可能会造成完整性的假象。

如果数据在我们的数据集中丢失,它会产生误导趋势,扭曲我们的分析结果。

准确性:这是一个衡量数据准确反映被描述对象程度的指标。

换句话说,数据在多大程度上反映了现实?

及时性:这是对决策所需数据可用性的衡量。正在处理的最新版本的数据是否可用于做出适当的解释?

我们不断更换电话号码、家庭住址和电子邮件地址。因此,确保我们掌握最新信息至关重要。

如果数据过时,那么对该数据做出的任何决策都可能是不正确的。

一致性:这是对数据一致性的度量。相同的数据在不同的存储位置、软件包和文件格式之间应该保持一致。

有效性:这是对数据在预定义的限制、期望和标准范围内符合程度的衡量。这可以应用于日期格式、电话号码、传感器测量等等。

例如,如果您期望值为 1、2 和 3,但查看的数据包含值 1.5、7 和 42,则这些值无效。

唯一性:特征或对象应该只在一个特定的数据集中出现一次,否则会发生混淆。

重复数据不仅会扭曲结果,还会增加计算处理时间和存储空间。

如果同一要素在一个数据集中多次出现,则需要识别或合并最后一个要素以形成复合要素。

使用 Python 识别不良数据

Python 中有许多库可以帮助进行探索性的数据分析和识别数据中的问题。我以前在 Medium 上已经讨论过很多这样的问题。

以下是一些有帮助的方法和库:

这是一个很棒的小库,可以帮助你生成一个非常详细的数据统计报告。您可以在下面看到一个结果示例,它标识了丢失的数据、重复的行等等。

你可以在这里找到更多关于熊猫的资料。

熊猫概况报告的概述部分。图片由作者提供。

Missingno: 一个非常简单易用的库,可以生成易于理解的数据完整性可视化。

你可以在这里找到更多关于它的信息

缺少显示所有 dataframe 列的数据稀疏性的矩阵图。图片由作者提供。

检测异常值:无效数据点的检测可以通过使用箱线图、散点图和直方图的标准绘图技术来实现。但是,离群值也可以用无监督机器学习技术来识别,比如隔离森林。

数据质量差对机器学习模型的影响

当使用质量差的数据或错误选择的好数据时,对机器学习模型有许多影响。作为调查数据质量问题对测井测量的影响的研究的一部分,我进行了大量的案例研究来说明这些影响。

以下是一些结果。

缺失数据的影响

为了模拟丢失的数据,设置了一个实验,其中可用于人工神经网络的训练数据以 10%的增量减少。测试数据保持不变,以确保公平的比较。

如下所示,当全部数据(100%的训练数据)用于预测声波压缩慢度(DTC)时,我们产生了与目标特征的非常好的匹配。

然而,当训练数据减少到 50%时,模型开始退化,但仍然遵循整体趋势。并且当模型减少到只有原始训练数据的 20%时,与目标特征相比,结果非常差。

减少训练数据对简单人工神经网络性能的影响。作者图片(麦克唐纳,2021)

噪声数据的影响

在第二个案例研究中,对将噪声引入训练特征之一的影响进行了评估。这是为了模拟可能导致错误记录的传感器噪声。

本案例研究的算法是随机森林,这是一种受监督的机器学习算法,由多个决策树组成。

从下面的结果可以看出,当噪声加入 DT 特性时,RHOB 的预测会变得更加嘈杂。然而,它在预测整体趋势方面仍然做得很好,这可能要归功于随机森林的工作方式。

训练数据中不同数量的噪声输入对堆积密度(RHOB)最终模型预测的影响。作者图片(麦克唐纳,2021)

错误选择特征对训练的影响

特征选择是机器学习工作流程中的关键步骤。它允许我们确定哪些特征与预测目标特征最相关。它还允许我们减少训练数据集的大小,这反过来有助于计算处理时间。

在下面的例子中,当在这个特定的案例研究中使用 7 个特征时,在比较真实测量值和实际测量值时,结果是分散的。然而,在将特征减少到 3 之后,在较低的孔隙率下拟合好得多,并且在较高的孔隙率下略有改善。

使用皮尔逊相关特征选择方法,不同数量输入的实际孔隙度和预测孔隙度散点图。图片由作者提供。(麦当劳 2022)

关于示例的更多细节

如果你想了解这些例子的更多细节,你可以在下面找到我的研究论文:

McDonald,A. (2021)岩石物理机器学习模型的数据质量考虑。岩石物理学

摘要

在运行机器学习模型之前,确保数据质量良好至关重要。如果使用了质量差的数据或错误地选择了输入,可能会导致严重的后果,这反过来又会产生进一步的连锁影响。

感谢阅读。在你走之前,你一定要订阅我的内容,把我的文章放到你的收件箱里。 你可以在这里做!或者,您可以* 注册我的简讯 免费获取更多内容直接发送到您的收件箱。*

其次,通过注册会员,你可以获得完整的媒介体验,并支持我和其他成千上万的作家。每月只需花费你 5 美元,你就可以接触到所有精彩的媒体文章,也有机会通过写作赚钱。如果你用 我的链接报名,你直接用你的一部分费用支持我,不会多花你多少钱。如果你这样做了,非常感谢你的支持!****

参考

McDonald,A. (2021)岩石物理机器学习模型的数据质量考虑。岩石物理学

PySpark 中使用 Great Expectations 的数据质量单元测试

原文:https://towardsdatascience.com/data-quality-unit-tests-in-pyspark-using-great-expectations-e2e2c0a2c102

数据工程—数据质量—远大前程系列

将远大期望与无处不在的大数据工程平台相结合

由 Unsplash 上的路径数码拍摄

It 数据以多快的速度进入你的电子表格或仪表盘并不重要,如果数据不正确,那么它就是无用的。此外,它可能导致错误的决定,并可能导致不可逆转的影响。强大的数据质量工具是任何数据工作负载不可或缺的一部分,以防止灾难。在本文中,我将带您了解我是如何在 Pyspark 中使用 Great Expectations 来通过数据转换执行测试的。

PySpark 作为数据处理工具

Apache Spark 是一个著名的工具,通过在分布式环境中实现并行计算来优化 ETL 工作负载。它通常用于批量处理大数据,以减少处理大量数据所需的时间,同时最大限度地降低成本。

PySpark 公开 Python API 与 Apache Spark 接口。通过 PySparkSQL 库,开发者可以使用 SQL 处理结构化或半结构化数据。你所需要的就是 Python + SQL 来让事情运转起来。

参见下面一个简单的用例,其中文件从云存储中读取并加载到数据帧中。使用 SQL 对原始数据进行转换,并将结果物化回云存储。

作者图片

处理数据质量

虽然 PySpark 是一种高效的转换工具,但数据工程的最终目标不仅仅是将数据从原始形式转换为可消费的形式,而是确保最终产品符合预期的质量标准。数据应该符合主题专家同意的业务规则。

以下是我们就数据提问的一些例子:

  • 该列是强制的吗?
  • 这些值有效吗?
  • 格式是否正确?
  • 我们如何确定一个账户在特定时期是活跃的?
  • 如果列的格式是数字,它是否在某个范围内?

这些问题的答案被转换成业务规则,并根据数据进行验证。

远大前程的作用

不幸的是,Pyspark 并没有提供数据质量测试功能。这就是像《远大前程》这样的工具发挥作用的地方。

远大前程是一个用于单元和集成测试的开源工具。它附带了一个预定义的期望列表来验证数据,并允许您根据需要创建自定义测试。除此之外还有更多,但是为了这篇文章,这些是我希望首先探索的特性。

如果你渴望了解更多关于 Great Expectations 的其他特性,你可以跳转到我的另一篇帖子,在那里我根据一个业务需求评估了它的一些有用特性。

项目练习

目标

  1. 探索从 Kaggle 下载的 Kickstarter 活动数据集。
  2. 制定一个指标,计算每个评估年度每个定义类别的成功活动数量
  3. 使用巨大的期望来执行单元和集成测试

怎么做

  1. 数据集经历了从原始形式到最终指标输出的几层转换

转换-作者的图像

模式更改-按作者分类的图像

2.对于每次转换,都要验证数据是否符合对数据的预期

对每个数据帧执行的测试—按作者排列的图像

先决条件

  • Kickstarter 数据集(在本练习中,文件仅存储在本地)
  • 安装了 Great Expectations 库的 PySpark 环境
  • Jupyter 接口

注意:我没有分享如何在本地设置这个环境的说明。如果你有兴趣知道我是如何设置的,请在评论中告诉我。我可以写一篇关于它的文章。

开始吧!

注意:下面显示的代码是截图,但是 Jupyter 笔记本是在 Github 中共享的。

原始数据探索

  1. 首先,让我们导入库并启动 Spark 会话。

2。加载文件并创建一个名为“活动”的视图

3。探索数据集

4。进行数据分析

这可以通过使用 Great Expectations 的内置函数来验证数据来实现。

SparkDFDataset 继承了 PySpark 数据框架,并允许您根据它来验证期望值。

5。为 raw_df 创建一个 SparkDFDataset 实例

对原始数据的单元测试

  1. 检查强制列

下面是用于确定最终指标范围的相关列。

2。强制列不应为空

似乎我们有一个异常值!

3。检查有效的日期格式

我们在这里没有得到 100%的遵从。

4。检查唯一性

啊哦!这个数据集被填充了很多副本!

似乎我们的原始数据并不像我们希望的那样干净。但是在这一点上应该没问题,因为我们仍然需要过滤我们的数据,并最终针对范围内的数据集子集计算指标。

过滤数据

  1. 定义哪些活动在范围内

2。声明一些变量

3。生成评估年度的参考数据

为什么我们需要一个参考数据来推算评税年度?在本例中,评估年度从 7 月的第一天开始,到 6 月 30 日结束。下表显示了每个评估年度的起止时间。

请参见下面的示例场景:

  • 如果该活动开始于 2017 年 1 月 5 日,结束于 2017 年 6 月 30 日,则认为它在 2017 评估年度处于活动状态。
  • 如果该活动开始于 2017 年 7 月 5 日,结束于 2018 年 1 月 5 日,则认为它在 2018 评估年度处于活动状态。
  • 如果活动开始于 2017 年 1 月 5 日,结束于 2017 年 12 月 5 日,则认为它在 2017 年和 2018 年都处于活动状态。

4。应用转换

我预计数据集仍将包含一些重复,所以我做了一点小把戏。如果有重复的活动 id,查询将选择最新的记录。

5。浏览过滤后的数据集

6。为 filtered_df 创建一个 SparkDFDataset 实例

对筛选数据的单元测试

  1. 检查 main_category 是否在范围内

2。检查活动是否在“美国”国家内,货币是否为“美元”,是否仅包括成功的活动

3。检查强制栏是否存在

4。检查唯一性

5。检查有效的日期时间格式

我们的数据现在看起来很整洁!现在我们可以进行下一步了。这些指标将根据派生的类别进行计算。我们将在转型的下一阶段生产这些类别。

标准化数据

  1. 定义在最终指标中使用的类别

2。转换数据

3。探索数据

4。为 standardized _ df创建一个 SparkDFDataset 实例

标准化数据的单元测试

  1. 检查指标和质押类别是否有效

2。检查人口是否等于先前的数据集

由于我们从未进一步筛选过数据集,因此预计行数保持不变。

进入最后一步!

生成最终指标

  1. 定义指标

2。应用变换

3。探索数据

4。为 successful_campaigns_df 创建一个 SparkDFDataset 实例

最终度量的单元测试

  1. 检查列组合的唯一性

2.检查最终指标数据集中的活动总数是否符合预期

最终指标数据集中的活动总数不应多于或少于汇总前的记录总数。

验证摘要

对 Great Expectations 数据集(SparkDFDataSet)调用 validate()函数将返回对该特定数据集执行的所有预期的汇总结果。

自定义测试

我还想进行一些测试,但是我找不到任何合适的函数。例如,我想根据 launch_atdeadline 来验证得出的评估年度是否正确。大期望可以扩展到允许使用自定义函数。我会就此写一个单独的帖子,但如果你想检查代码,请参见笔记本的最后一部分。

结论

我展示了如何利用高期望值来检查数据转换每个阶段的数据质量。我使用了许多内置的期望来验证 Pyspark 数据帧。在他们的文档中可以看到完整的列表。我发现在笔记本上使用这个工具进行数据探索很方便。单元测试也需要整合到数据管道中,以确保每次数据发生变化时的可信度。这是我接下来要探索的。敬请期待!

使用 SQL 进行数据检索—教程和示例

原文:https://towardsdatascience.com/data-retrieval-with-sql-tutorial-examples-a4b6b4b8f816

带示例和备忘单的 SQL 教程

一个组织良好的图书馆。E 2

我们都听说过各种公司,如谷歌、脸书和苹果,如何通过各自的网站、服务和产品收集客户信息和活动。现在,让我们假设其中一家公司的数据科学家想要查看存储的客户数据,以找到业务问题的解决方案。在开始分析和建模之前,科学家将使用结构化查询语言或 SQL(类似于“sequel”)来检索存储的数据。在这篇文章中,我们将回顾什么是 SQL,并通过例子学习如何使用它。

在我关于亚马逊数据科学家角色要求的主要帖子中,我将“数据检索”确定为每个数据科学家都应该具备的首要能力,并将在面试过程中接受测试。作为一名科学家,我发现自己在数据检索和数据分析/建模之间来回穿梭,因此我认为数据检索是我们数据科学家候选人的一项关键能力。

我们将通过附带的脚本来介绍数据科学家日常工作中使用的一些最常见的 SQL 函数,这样您也可以在我们一起解决问题的过程中跟随并继续学习。这一部分以 16 个问题和答案的形式出现,我在回答中进一步解释了每个主题。我建议您跟随并尝试编写自己的查询,以最大限度地学习。最后,我还将提供我在学习 SQL 时开发的备忘单。

我们开始吧!

https://medium.com/@fmnobar/membership

先决条件

为了使用您可以理解的真实示例,首先我们将创建两个名为“people”和“salary”的临时表,然后这两个临时表将用于余下的练习。这种方法的好处是,您可以复制和粘贴表创建部分,然后按照以下步骤进行练习,以最大限度地增加学习机会。请注意,此时您不需要理解表格创建部分的工作,因为这只是为问答部分创建我们需要的内容。

请将下面的内容复制并粘贴到您最喜欢的 SQL 工具中,然后运行。

数据科学家最常用的 SQL 概念

1.基础

现在让我们看看我们在上面的两个临时表中创建了什么。我将把这些框成问题和答案,这样你也可以先尝试解决每个问题,然后再看我提供的答案。我提供的只是解决这些问题的一种方法——通常有不止一种正确的方法可以得到相同的答案。

Q1:检索 **people** 表中所有可用的数据。

A1:

一般来说,我将首先提供答案,然后解释发生了什么以及不同的 SQL 概念是如何工作的,无论是在同一个问题下还是在下一个问题下。例如,Q2 将解释在 Q1 发生了什么。

SELECT
 *
FROM
 people;

结果:

为了将来参考,这是表salary的样子,使用如下:

SELECT
 *
FROM
 salary;

专业提示: 此时,我建议您给这两个表拍个快照——我在下面添加了如何拍快照的说明。在这篇文章中,你会想要回头参考这些表来编写查询,然后上下滚动,发现这两个表并不有趣。为了方便起见,我提供了如何在 Mac 和 Windows 上拍摄快照的说明:

  • Mac 用户— 同时按住这三个键:Shift、Command 和 4,然后选择要拍摄快照的区域。如果您不希望手动选择快照区域,同时按下 Shift、Command 和 3 将打印屏幕。
  • Windows 用户— 同时按下这三个键:Windows 键+ Shift + S,然后使用 Snip 和 Sketch 工具创建一个快照(我在 Mac 上,所以这是基于谷歌搜索的—希望它能起作用)。

Q2:解释一下在之前的查询中发生了什么。

A2: SELECT语句用于从给定的数据库(即表)中选择数据。FROM用于指示应该从哪个数据库中选择数据(本例中为“people”)。最后*简单地说从数据库中选择一切。

Q3:仅检索以下各列的数据: **['name', 'gender', 'job_title']**

A3:

SELECT
 name,
 gender,
 job_title
FROM
 people;

结果:

这一步很简单——我们可以明确指出要选择哪些列。

2.过滤

哪些人在纽约工作?

A4:

SELECT
 name
FROM
 people
WHERE
 location = 'new_york';

结果:

如本例所示,我们可以使用WHERE过滤结果。

3.聚集

聚合帮助我们对数据进行一些基本的分析。例子包括COUNT()MAX()MIN()AVG()SUM()

有多少人住在西雅图或菲尼克斯?

A5:

SELECT
 count(person_id)
FROM
 people
WHERE
 location IN ('seattle', 'phoenix');

结果:

每个城市有多少人居住?

A6:

SELECT
 location,
 count(person_id)
FROM
 people
GROUP BY
 location;

结果:

从上一个问题中我们已经知道了COUNT()的作用,但是现在在查询的末尾还有一个新概念。GROUP BY语句将具有相同值的数据行组合在一起,用于聚合函数,如COUNT()MAX()MIN()AVG()SUM()

凤凰城和纽约的总工资是多少?

A7:

SELECT
 location,
 SUM(salary) AS total_salary
FROM
 people
WHERE
 location = 'phoenix'
 OR location = 'new_york'
GROUP BY
 location;

结果:

这个例子中有两个新的知识。首先,在这个例子中,我们给SUM()列分配了一个别名,结果列现在被命名为total_salary。如果我们没有这样做,该列将如下所示:

第二次学习是另一种方法。注意在WHERE中,我们使用的是OR,这决定了location可以是phoenix也可以是new_york。或者,我们可以使用location IN ('phoenix', 'new_york'),类似于我们在 Q5 中使用的方法。这不会改变结果,只是一种替代方法。

4.连接

这是最有用的特性之一。当试图理解查询时,它有助于可视化数据。让我们先看一个例子,然后我会解释发生了什么。

Q8:检索个人姓名、他们的位置和薪水,以及每个位置的平均薪水。

回答 8:请注意,这是一个我们以前没有解决过的新型问题。个人姓名、工作地点及其工资见表people,而按工作地点划分的平均工资见表salary。我们需要的是将这两个表JOIN在一起,这是可能的,因为这两个表有共同的城市名称(尽管列在people中被命名为location,在salary中被命名为city)。我们的结构如下:

SELECT
 p.name,
 p.location,
 p.salary,
 s.average_salary
FROM
 people p
 LEFT JOIN salary s ON p.location = s.city;

结果:

那么到底发生了什么?让我们更仔细地看看联接:

FROM
 people p
 LEFT JOIN salary s ON p.location = s.city

上面说看表people然后将其连接到表salary。然后,我们需要指出每个表中共享相同值的列(想象一下,只有在这两个特定的列中有公共值时,才把这两个表缝合在一起)。具有相互值的列是来自peoplelocation和来自salarycity。最后,我们在这里使用别名的概念。例如,表people现在的别名是p,而表salary的别名是s。当我们想要从people中指示列location时,我们可以将其指示为people.locationp.location。这同样适用于我们如何将列citysalary表示为s.city。注意结构总是如table_name.column_name所示。最后,我们在这个例子中使用了一个LEFT JOIN。下面我将讨论这意味着什么,以及还有什么其他方式来连接表。

如上所述,我们在这个例子中使用了一个LEFT JOIN。在思考JOIN如何工作时,记住下面的图片是有帮助的。

连接的可视化(由作者创建)

以下是一些最常见的JOIN类型:

  • JOININNER JOIN:返回左表和右表中有匹配值的数据。
  • LEFT JOINLEFT OUTER JOIN:返回左表数据和右表所有匹配的数据。
  • RIGHT JOINRIGHT OUTER JOIN:这是LEFT JOIN的反面。它返回右表中的数据和左表中所有匹配的数据。
  • FULL JOINFULL OUTER JOIN:当左表或右表匹配时,返回左表或右表的所有数据

5.条件式

Q9:在 **people** 中创建一个新列,将职位细分为技术和非技术。只返回姓名、职位名称,新的类别命名为 **job_group** 和工资。

A9:为了回答这个问题,首先我们需要使用以下查询来查看people中有哪些独特的职位:

SELECT
 DISTINCT job_title
FROM
 people;

请注意,DISTINCT是添加到SELECT中的语句,只返回该列中的唯一值,如下面的结果所示:

既然我们已经知道了现有的职位名称,我们可以按照指示将它们分为技术和非技术。在本练习中,使用您的最佳判断来确定什么是技术角色,什么是非技术角色,重要的是学习如何在查询中实现此逻辑。比如financial_analyst是非技术角色,而data_scientist是技术角色。以下查询就是这样做的:

SELECT
 name,
 job_title,
 CASE
  WHEN job_title IN ('software_developer', 'data_scientist') THEN 'tech'
  WHEN job_title IN ('financial_analyst', 'physician') THEN 'non-tech'
  ELSE job_title
 END AS job_group,
 salary
FROM
 people;

结果:

让我们通过更仔细地看我们为这个问题所做的来讨论一下CASE表达式是如何工作的:

CASE
  WHEN job_title IN ('software_developer', 'data_scientist') THEN 'tech'
  WHEN job_title IN ('financial_analyst', 'physician') THEN 'non-tech'
  ELSE job_title
 END AS job_group,

为了实现这个逻辑,我们首先从CASE表达式开始,然后使用WHEN确定条件,例如:

WHEN job_title IN ('software_developer', 'data_scientist') THEN 'tech'

上面的脚本首先查看列job_title,如果任意行的该列的值为software_developerdata_scientist,则输出tech。同样的逻辑也适用于non-tech类别。

然后就是ELSE job_title。该子句说明,如果在上面的WHEN条件下遇到了列中没有的值,则返回列job_title中存在的值。例如,如果我们在列job_title中有一行的值为chef,因为chef不在我们包含在WHEN条件中的那些条件中(即software_developerdata_scientistfinancial_analystphysician),那么该子句将返回列job_title中的原始值,即chef

脚本的最后一部分是END AS job_groupCASE表达式以END结束,而AS job_group是给结果列的别名。这就是在结果表中将列命名为job_group的原因。

Pro 提示:WHEN开始的条件语句的顺序很重要。一旦条件为真,它将停止读取其余条件并返回结果。如果不满足任何条件,它将返回ELSE子句中的值。

Q10:哪个 **job_group** 平均赚钱多?将结果从最高的 **job_group**到最低的排序。

A10:我会用两种方法来回答这个问题,每种方法都会引入新的概念。首先,我将介绍一种方法来展示如何在查询的输出中直接使用FROM,然后我将介绍一种不同的方法来演示WITH子句的应用。

方法 1:

SELECT
 job_group,
 AVG(salary) AS average_salary
FROM
 (
  SELECT
   person_id,
   CASE
    WHEN job_title IN ('software_developer', 'data_scientist') THEN 'tech'
    WHEN job_title IN ('financial_analyst', 'physician') THEN 'non-tech'
    ELSE job_title
   END AS job_group,
   salary
  FROM
   people
 )
GROUP BY
 job_group
ORDER BY
 average_salary DESC;

结果:

那么到底发生了什么?过去我们总是在FROM后面包含一个表名,但是这里的新概念是我们也可以包含一个内部查询来代替表名。首先运行FROM之后的内部查询,然后将结果用作临时表,从外部查询中选择数据。

方法二:

我将首先介绍这种方法中使用的查询,然后解释查询中的每个步骤。让我们首先从查询开始:

WITH count_table AS(
 SELECT
  CASE
   WHEN job_title IN ('software_developer', 'data_scientist') THEN 'tech'
   WHEN job_title IN ('financial_analyst', 'physician') THEN 'non-tech'
   ELSE job_title
  END AS job_group,
  count(person_id) as total_count
 FROM
  people
 GROUP BY
  1
),
total_salary_table AS(
 SELECT
  CASE
   WHEN job_title IN ('software_developer', 'data_scientist') THEN 'tech'
   WHEN job_title IN ('financial_analyst', 'physician') THEN 'non-tech'
   ELSE job_title
  END AS job_group,
  SUM(salary) as total_salary
 FROM
  people
 GROUP BY
  1
)
SELECT
 ct.job_group,
 tst.total_salary / ct.total_count as average_salary
FROM
 count_table ct
 INNER JOIN total_salary_table tst ON ct.job_group = tst.job_group
ORDER BY
 average_salary DESC;

现在让我们更仔细地看看发生了什么。

首先,我们将使用WITH子句创建一个名为count_table的临时表。这个临时表格显示了每个job_group内有多少个人,如下所示:

接下来,我们将创建第二个名为total_salary_table的临时表,显示每个job_group的总工资,如下所示:

现在我们有了这两个表,我们可以将它们连接在一起,找出每个job_group的平均工资,如下所示:

这里的结果与预期的方法 1 的结果相匹配。

6.窗口功能

这些功能在最初的时候更难想象,所以如果你不能马上理解,不要失望。浏览几个例子,你会开始更好地理解它们。我们通常在面试中包括这些,所以我建议你理解并练习这些。

窗口函数通常在一组相关的表格行中执行计算。换句话说,它们在某种程度上类似于带有一些警告的聚合。与聚合不同,窗口函数不会将行组合在一起。这将通过例子变得更加清楚。

窗口功能的几个例子是:COUNT()AVG()SUM()ROW_NUMBER()RANK()DENSE_RANK()LAGLEAD,它们的结构如下:

window_function(column_name) OVER (
 PARTITION BY 
  column_name
 ORDER BY
  column_name ROWS BETWEEN UNBOUNDED PRECEDING
  AND UNBOUNDED FOLLOWING
) AS output_alias;

上面的例子显示了如何构造窗口函数的最常见的元素,但并不是所有的都是必要的。我知道到目前为止这是没有意义的,所以让我们在实践中看看其中的一些,以便更好地理解它们。

Q11:从最高工资到最低工资,按性别创建一个总体工资等级。

A11:

SELECT
 name,
 gender,
 salary,
 RANK() OVER(
  ORDER BY
   salary DESC
 ) AS salary_rank_overall,
 RANK() OVER(
  PARTITION BY gender
  ORDER BY
   salary DESC
 ) AS salary_rank_by_gender
FROM
 people
ORDER BY
 salary_rank_overall,
 salary_rank_by_gender;

结果:

正如您在结果中看到的,使用RANK()窗口功能,我们能够从整体角度以及在每个男性或女性类别中对工资进行排名。在OVER()中,我们指出我们希望通过gender来分解(或“划分”)排名,并通过添加ORDER BY salary DESC从最高工资到最低工资进行排序。

Q12:创建每个薪金的运行总和(即,第 2 行的总和应为第 1 行+第 2 行,第 3 行的总和应为第 1 行+第 2 行+第 3 行的总和,依此类推),并按性别、年龄(从年长到年轻)排序。还包括一列显示每一行的总工资。

A12:

SELECT
 name,
 gender,
 birth_year,
 salary,
 SUM(salary) OVER(
  ORDER BY
   birth_year ROWS between UNBOUNDED PRECEDING
   And CURRENT ROW
 ) AS running_total_salary_overall,
 SUM(salary) OVER(
  PARTITION BY gender
  ORDER BY
   birth_year ROWS between UNBOUNDED PRECEDING
   And CURRENT ROW
 ) AS running_total_salary_by_gender,
 SUM(salary) OVER(
  ORDER BY
   birth_year ROWS between UNBOUNDED PRECEDING
   And UNBOUNDED FOLLOWING
 ) AS total_salary
FROM
 people
ORDER BY
 running_total_salary_overall,
 running_total_salary_by_gender;

结果:

一旦你仔细阅读了下面的解释并与结果进行了比较,我相信你也会体会到窗口函数的强大。

这份报告使用了一些新的陈述,所以让我们更仔细地看一下。我们先来看以下内容:

SUM(salary) OVER(
  ORDER BY
   birth_year ROWS between UNBOUNDED PRECEDING
   And CURRENT ROW
 ) AS running_total_salary_overall,

SUM(salary)只是简单地把工资加起来,但是工资应该如何加起来才是更有趣的部分,在OVER()语句中有说明。首先,薪水按照个人出生年份从低到高排序,如ORDER BY birth_year(没有DESC告诉我们是升序)。然后ROWS告诉如何将SUM()应用于这些数据行。在这种情况下,求和应用于每行(UNBOUNDED PRECEDING)之前的所有行,包括行本身(CURRENT ROW)。

现在,如果我们希望每一行的总和包括特定行之前和之后的所有内容,会怎么样呢?这可以通过以下方式实现:

ROWS between UNBOUNDED PRECEDING
   And UNBOUNDED FOLLOWING

该结构用于计算查询的以下部分中的total_salary,您可以在结果部分中看到:

SUM(salary) OVER(
  ORDER BY
   birth_year ROWS between UNBOUNDED PRECEDING
   And UNBOUNDED FOLLOWING
 ) AS total_salary

因为对于每一行,我们希望得到给定行之前和之后所有行的总和,本质上我们要求查看在每一行的total_salary下显示的该列的总和,这对于每一行都是相同的868,000值。

8.杂项—联合运算符、空处理和日期管理

到目前为止,我们已经介绍了一些可以帮助您编写自己的查询的更常见的概念。在这一部分,我将涉及一些额外的话题,这些话题也能在面试中帮助你。

与上次类似,让我们首先创建两个名为misc_part1misc_part2的新表,然后浏览概念。现在,只需复制、粘贴并运行下面的脚本,为练习的这一部分创建临时表。

加分项(可选): 既然你对不同的 SQL 概念已经比较熟悉了,那就看看你复制粘贴的内容,看你能不能按照逻辑来。您可以看到,我们首先定义一个表,然后指定表中的列以及与每列相关联的数据类型,接着为每列添加值(以一行值的格式)。就是这样!现在,您可以创建自己的临时表,并开始从中检索数据!

现在让我们看看这些表是什么样子的。我将用下面的例子来看一下mist_part1:

SELECT
 *
FROM
 misc_part1:

结果:

然后会用下面的来看misc_part2:

SELECT
 *
FROM
 misc_part2;

结果:

我们可以把这两个表想象成一些关于客户最后一次被联系的营销数据,以及他们是如何被联系的,比如通过电子邮件、电话等等。光看数据就有三个观察结果:

  1. 这两个表有相同的列名,所以作为我们练习的一部分,也许有机会将它们合并,我们将在UNION下进一步探讨。
  2. 有些值丢失了,这在peoplesalary表中并不存在。比如看misc_part2,单元格B5B6都是空的。misc_part1也有一些缺失值。我们将讨论空处理。
  3. 两个表都包含一个日期格式列,这是我们在peoplesalary表中没有的。我们将使用这些值进行一些日期操作。

与上次类似,您可以随意抓取这两个表格以供参考,然后让我们继续使用相同的问答格式来介绍一些新概念。

8.1.联合运算符

Q13:我看到两个表包含相同的列。你能把它们组合成一张桌子吗?按名称对结果进行排序,并确定哪一行属于哪一个表。

回答 13:请记住,我们从两个表开始,每个表包含 8 行数据(不包括标题),因此我们希望合并后的表包含 16 行数据(不包括标题)。

这可以使用以下格式的UNION ALL来完成:

SELECT
 *,
 1 AS misc_table_number
FROM
 misc_part1
UNION ALL
SELECT
 *,
 2 AS misc_table_number
FROM
 misc_part2
ORDER BY
 name;

结果:

结果包括我们预期的 16 行数据(不包括标题)。我们来说说发生了什么。

UNION ALL operator 将来自每个查询的数据堆叠起来。要使其正常工作,需要满足一些条件:

  1. UNION ALL运算符中的每个SELECT必须具有相同的列数。例如,在我们的练习中,每个表包括 4 列。
  2. 每个SELECT语句的对应列必须具有相同的数据类型。例如,两个表中的name都是VARCHAR(30)数据类型,或者两个表中的last_contacted都是DATE数据类型。
  3. 每个SELECT语句的列必须是相同的顺序。换句话说,在我们的示例表中,两个表的顺序应该是namelast_contactedcontact_typemisc_table_number。在我们的例子中也满足了这个条件,这就是我们能够使用UNION ALL的原因。

Q14:查看 Q13 的结果,看起来两个表都包含相同的 **david** **elizabeth** 数据。您能否创建相同的表,但只包含唯一的行(例如,对结果进行重复数据删除)?不需要显示哪些表行属于哪个表行。

A14:这可以通过使用UNION而不是UNION ALL很容易地完成。换句话说,UNION只选择不同的值,而UNION ALL选择所有的值。查询如下所示:

SELECT
 *
FROM
 misc_part1
UNION
SELECT
 *
FROM
 misc_part2
ORDER BY
 name;

结果:

正如预期的那样,结果现在只包括不同的行,行的总数现在是 14(不包括标题),而不是我们在 Q13 中看到的 16。

8.2.零处理

Q15:创建一个名为 **combined_table** 的临时表,其中包含组合表的不同行(类似于 Q14)。在 **last_contacted** 值缺失的地方,输入值为 **1901-01-01** 。我们还知道,缺少的 **contact_type** **phone_call** ,所以也要填充它们。

A15:

WITH combined_table as (
 SELECT
  *
 FROM
  misc_part1
 UNION
 SELECT
  *
 FROM
  misc_part2
 ORDER BY
  name
)
SELECT
 name,
 NVL(last_contacted, '1901-01-01') as last_contacted,
 COALESCE(contact_type, 'phone_call') AS contact_type
FROM
 combined_table;

结果:

结果正如我们所料,所以让我们谈谈发生了什么。

我们在这个练习中使用了两个空函数,就我们的目的而言,它们都是相似的。当表达式为空时,它们都返回替代值。我想两个都用来展示,但你可以选择使用任何一个。让我们更仔细地看看它们:

NVL(last_contacted, '1901-01-01') as last_contacted,
COALESCE(contact_type, 'phone_call') AS contact_type

第一个是说当在列last_contacted中遇到 NULL 时,用1901-01-01替换它。类似地,第二个是说当在contact_type列中遇到 NULL 时,用phone_call替换它,如问题中所指示的。

专业提示: 根据 SQL 环境的不同,语句可能略有不同,但概念保持不变。例如,COALESCE()用于 MySQL、SQL Server、Oracle 和 MS Access,而NVL()主要用于 Oracle。

8.3.日期管理

Q16:从 **combined_table** 开始,为年、季度、月和最后一次联系个人的日期创建单独的列(如果有这样的日期)。

A16:让我们先看看结构和结果,然后再讨论。

WITH combined_table as (
 SELECT
  *
 FROM
  misc_part1
 UNION
 SELECT
  *
 FROM
  misc_part2
 ORDER BY
  name
)
SELECT
 name,
 last_contacted,
 DATE_PART(year, last_contacted) AS year_contacted,
 DATE_PART(quarter, last_contacted) AS quarter_contacted,
 DATE_PART(month, last_contacted) AS month_contacted,
 DATE_PART(day, last_contacted) AS day_contacted,
 contact_type
FROM
 combined_table
WHERE
 last_contacted IS NOT NULL;

结果:

在这个练习中有两个新概念。第一种方法是从日期中提取一个特定的部分(例如,年、季度、月或日),可以按如下方式实现:

DATE_PART(year, last_contacted) AS year_contacted,

想法很简单。year标识要提取日期的哪一部分,然后是原始日期所在的列名,在本例中是last_contacted

第二个概念是过滤掉具有空值的行,这是使用以下方法实现的:

WHERE
 last_contacted IS NOT NULL

Pro 提示: 在 SQL Server 中,不用DATE_PART(),一用DATEPART()

小抄

我在这里附上了我为自己开发的备忘单。在你开始使用它之前,我有两个关于这个和其他备忘单的临别建议:

  1. 如果可能的话,随着时间的推移建立你自己的备忘单,而不是依赖一个准备好的备忘单。与别人分享的相比,当你自己创建和更新它的时候,你会学到更多。
  2. 如果您没有时间创建自己的备忘单,请使用现有的备忘单并将其制作成您自己的备忘单。我的意思是,从现有的小抄开始,然后添加、修改、编辑它,在某个时候它会变成“你的”小抄,你会在这个过程中继续学习。

摘要

在这篇文章中,我们首先讨论了使用 SQL 进行数据检索对于数据科学家的重要性。然后,在 16 道练习题和答案的帮助下,我们继续学习最常见的 SQL 概念。最后,提供了 SQL 中一些更常见概念的参考表,以供将来参考。

感谢阅读!

如果你觉得这篇文章有帮助,请在媒体上关注我,订阅接收我的最新文章!

数据路线图:你应该包括还是不包括这个主题?

原文:https://towardsdatascience.com/data-roadmapping-should-you-include-that-topic-or-leave-it-out-d4c19df7c0c3

数据策略

决定数据路线图内容的四步方法

在 Unsplash 上空中聚焦拍摄的照片

当我第一次听到“路线图”这个词时,我想象着任何一家公司的管理层成员在一个高度安全的房间里开会,闭门决定公司的未来。经验告诉我,制定路线图实际上是一个更加开放和复杂的过程。

在一个公司的数据部门——甚至是一个小型数据团队——构建路线图是一项重要的工作。路线图的目标是决定团队将研究哪些主题,为什么,以及用什么资源。在这篇文章中,我将重点关注团队工作主题的选择。

"路线图是战略计划的可视化."(来源: aha.io )

无论您是为公司的数据路线图做出贡献,还是负责完整地构建它,花时间从战略角度而不是从操作角度思考都会给您带来很多好处。它允许您从运营工作中退一步,并为您提供更清晰的未来视图。

下一季度的数据路线图应该包括什么?您希望您的数据团队在未来几个月内实现什么目标?

为了回答这些问题,我想介绍一下我自己构建路线图的方法。我在目前的公司经历过几次这个过程,所以把它当成一套指导方针,而不是严格的“一刀切”的方法来应用。

第一步:写下每个想法

最好的开始方式是…开始。如果你不知道从哪里开始,不要担心:只要写下你想到的任何想法。这里有一些你可以问自己的问题:

  • 在我最近进行的分析中,我是否多次遇到相同的主题?
  • 根据与同事的交流,我可以确定哪些与数据相关的需求?
  • 我是否注意到一个高影响力的问题可以通过使用数据来解决?

这种反思可以自己进行,但是你也可以和同事一起组织一次头脑风暴会议,这样他们可以挑战你的想法。通过大声说出你的一些书面想法,一个人会更好地形成想法并提出新的想法。

另一个想出点子的好方法是全年定期查看这个问题列表。当你在一个主题上工作时,收集你的想法。如果你注意到一个相关的想法可能值得追求,把它写在你的“路线图待办事项”中。当详细阐述你的路线图的时候,你只需要看看它就能得到建立在其上的想法。

步骤 1 的示例— Marie Lefevre

第二步:将你的想法分成共同的主题

写下每一个想法后,你应该对所有可能成为你下一个路线图一部分的主题有一个全面但相当混乱的概述。

为了获得更清晰的图像,第二步是将想法分成普通的组。群体可以从以下方面的共性中产生:

  • 几个思路解决的问题
  • 企业部门关注的几个想法
  • 实施几个想法的时间范围

围绕共同的挑战将想法分组将让你对你在下一个路线图中可能解决的主题类型有一个初步的感觉。在这一步中讨论过的一些话题甚至会显得无关紧要。举个例子,你可能会对某个主题有一些想法…但是这个主题最近已经被正式从公司的全球路线图中删除了。在这种情况下,你可以降低相关主题的优先级(这次甚至是放弃)。

步骤 2 的示例— Marie Lefevre

第三步:找到合适的主题组合

有了更清晰的组,你就可以开始下一步了:用它们来做一个漂亮的拼图。第三步的目标是结合不同的主题类别,使它们符合路线图。想法可能是无限的,但资源是有限的。这就是为什么这一步是最难的部分:选择什么将被包括在路线图中…什么不会。

为了找到正确的组合,我将每个主题分为以下三类:

  1. 这个主题是否为公司的结构项目服务?它可以与公司的长期愿景、季度 OKR(目标和关键结果)相关,也可以是数据团队参与的跨团队项目。
  2. 该主题是否有助于数据团队的结构项目?它可以是技术迁移项目、与数据基础设施相关的改进、数据模型的变化等。
  3. 该主题是否回答了其他团队的特殊需求?它可以对应于包含在另一个团队路线图中的项目,其中需要来自数据团队的专业知识(例如,数据摄取、建模、可视化),或者您可以根据其他团队的路线图预测的主题

现在的目标是在这三种类型的数据主题之间找到平衡。如果您选择了过多的“特定需求”主题,对结构项目不利,您就有积累技术债务的风险。相反,如果你在内部结构项目上投入太多的资源,你可能会忽略更多的公司范围内的主题:这可能会导致与其他团队的合作不那么密切,以及对公司正在处理的热点主题的操作性较差。

步骤 3 的示例— Marie Lefevre

第 4 步:与利益相关者确认…并提交

您的路线图现在离最终版本更近了。真的吗?现在是时候与其他利益相关者分享你的工作了。无论是对你的老板,对其他团队,还是在你的团队内部,路线图一旦被所有参与其中的人认可,就真正成为了现实。

在构建和巩固路线图的初始版本时,您可能会面临困难的选择:我们应该在下一季度处理主题 A 还是主题 B?在我看来,为你的路线图提供一到三个场景并没有错,如果你对选择的主题仍有疑问的话。只要确保清楚地介绍每一种选择及其利弊。向利益相关者提出一个明确的问题,这样你们可以共同决定路线图中应该包括什么,应该省略什么。

与利益相关者的讨论应该代表你通向伟大路线图的最后一英里。正如介绍中提到的,讨论还应该包括你的资源限制问题。当每个人都在你下个季度路线图的内容和时间上达成一致时,就是这样:剩下的就是平静地开始这个季度!

步骤 4 的示例— Marie Lefevre

结论:现在怎么办?

现在,您的季度路线图已经确定,您的团队已经准备好就选定的主题开展工作。现在发生了什么?

在本季度,确保定期回到您的路线图来检查正在进行的工作是否仍然符合路线图。如果不是,找出原因并做出决定:我们应该坚持原来的路线图还是应该做出调整?

至于在步骤 1 和 2 中列出但未能包含在本季度路线图中的主题,请将其保存在安全的地方。当构建下一个路线图时,你可以将它们包含在你的初始反思中——就像我们在步骤 1 中所做的那样!

想免费获得我的数据路线图清单 你可以在这里下载 。希望你会觉得这有用!

你喜欢读这篇文章吗? 成为 的一员,加入一个不断成长的充满好奇心的社区吧!

*https://marie-lefevre.medium.com/membership *

Python 中的数据采样方法

原文:https://towardsdatascience.com/data-sampling-methods-in-python-a4400628ea1b

一个现成的代码,使用不同的数据采样技术在 Python 中创建一个随机的、有代表性的样本

图片来源:Pexels/christian-diokno

数据采样是大多数研究、科学和数据实验的重要组成部分。这是决定你的研究或调查结果准确性的最重要的因素之一。如果您的样品取样不准确,这可能会对最终结果和结论产生重大影响。根据需要和情况,有许多采样技术可用于收集数据样本。在这篇博文中,我将介绍以下数据采样技术:

**- Terminology: Population and Sampling 
- Random Sampling
- Systematic Sampling
- Cluster Sampling
- Weighted Sampling
- Stratified Sampling**

总体和样本介绍

首先,让我们来看看一些基本术语。学习 群体样本的概念很重要。*总体是所有观察值(个人、对象、事件或程序)的集合,通常非常大且多样化,而样本*是总体中观察值的子集,理想情况下是总体的真实代表。

图片来源:作者

鉴于对整个人群进行实验要么是不可能的,要么就是太昂贵,研究人员或分析师在他们的实验或试验中使用样本而不是整个人群。为了确保实验结果可靠并适用于整个群体,样本需要真实地代表总体。也就是说,样本需要是无偏的。

随意采样

从原始群体中创建随机样本的最简单的数据采样技术是随机采样。在这种方法中,在样本生成过程中,每个采样的观测值都有相同的被选中概率。当我们没有任何关于目标人群的先验信息时,通常使用随机抽样。

例如从 10 个人的群体中随机选择 3 个人。在这里,每个人都有均等的机会以 1/10 的选择概率被选入样本。

图片来源:作者

随机采样:Python 实现

首先,我们生成随机数据作为人口数据。因此,我们将从正态分布中随机抽取 10K 数据点,平均值μ= 10,标准差 std = 2。在此之后,我们创建一个名为 random_sampling ()的 Python 函数,它获取人口数据和所需的样本大小,并生成一个随机样本作为输出。

系统抽样

系统抽样被定义为一种概率抽样方法,其中从随机起点并在固定的抽样间隔后选择目标人群中的元素。

换句话说,系统抽样是概率抽样技术的一种扩展形式,在这种技术中,每隔一段时间就选择一个群体中的每个成员来构成一个样本。我们通过将总体规模除以期望的样本规模来计算抽样间隔。

请注意,系统抽样通常会产生随机样本,但不会解决创建的样本中的偏差。

图片来源:作者

系统采样:Python 实现

我们生成的数据作为人口数据,就像前面的例子一样。然后,我们创建一个名为 systematic_sample ()的 Python 函数,它获取人口数据和采样间隔,并生成一个系统样本作为输出。

请注意,系统抽样通常会产生随机样本,但不会解决创建的样本中的偏差。

巢式抽样法

整群抽样是一种概率抽样技术,在这种技术中,我们根据特定的聚类标准将人群分成多个簇(组)。然后,我们用简单的随机或系统抽样技术选择一个随机群。因此,在整群抽样中,整个人口被分成群或段,然后随机选择群。

例如,如果你想在整个欧洲进行一次评估商业教育二年级学生表现的体验。不可能在欧盟的每所大学进行一项涉及学生的实验。相反,通过使用聚类抽样,我们可以将每个国家的大学归为一类。这些聚类定义了欧盟所有的大二学生群体。接下来,您可以使用简单的随机抽样或系统抽样,并随机选择用于您的调查研究的群组。

请注意,系统抽样通常会产生随机样本,但不会解决创建的样本中的偏差。

图片来源:作者

集群采样:Python 实现

首先,我们生成的数据将作为 10K 观测的人口数据,该数据由以下 4 个变量组成:

  • 价格 : 使用均匀分布生成,
  • Id
  • *****event _ type*:一个分类变量,有 3 个可能值{type1,type2,type3}
  • 点击 :二进制变量取值{0:不点击,1:点击}
 id     price event_type  click
0        0  1.767794      type2      0
1        1  2.974360      type2      0
2        2  2.903518      type2      0
3        3  3.699454      type2      1
4        4  1.416739      type1      0
...    ...       ...        ...    ...
9995  9995  3.689656      type2      1
9996  9996  1.929186      type3      0
9997  9997  2.393509      type3      1
9998  9998  1.276473      type2      1
9999  9999  3.959585      type2      1[10000 rows x 4 columns]

然后,函数 get_clustered_Sample ()将原始数据、每个聚类的观察值以及您想要选择的多个聚类作为输入,并生成一个聚类样本作为输出。

 id     price   event_type  click  cluster
4847  4847  3.813680      type3      0       17
567    567  1.642347      type2      0       17
8982  8982  3.741744      type3      1       17
2321  2321  2.192724      type3      0       17
5045  5045  3.645671      type2      0       17
...    ...       ...        ...    ...      ...
5681  5681  3.175308      type1      0       90
882    882  2.676477      type2      1       90
2090  2090  3.861775      type3      1       90
907    907  1.947100      type3      0       90
2723  2723  2.557626      type1      0       90[200 rows x 5 columns]

请注意,整群抽样通常会产生一个随机样本,但不会解决所创建样本中的偏差。

加权抽样

在一些实验中,你可能需要项目的抽样概率是根据与每一个项目相关的权重,这时就应该考虑观察类型的比例。例如,您可能需要一个搜索引擎中的查询样本,其权重为这些查询被执行的次数,以便可以分析该样本对用户体验的总体影响。在这种情况下,与随机抽样或系统抽样相比,加权抽样更为可取。

加权抽样是一种带有权重的数据抽样方法,旨在补偿具有不相等概率(过采样)、无覆盖、无响应和其他类型偏差的特定观察值的选择。如果不调整有偏差的数据集,而是使用简单的随机抽样类型的方法,那么人口描述符(例如,平均值、中间值)将会是偏斜的,并且它们将不能正确地表示人口与人口的比例。

加权抽样通过创建一个考虑总体中观察类型比例的样本来解决样本中的偏差。因此,加权抽样通常产生一个随机和无偏的样本。

图片来源:作者

然后,函数 get_clustered_Sample ()将原始数据、每个聚类的观察值以及您想要选择的多个聚类作为输入,并生成一个聚类样本作为输出。

加权采样:Python 实现

函数 get_weighted_sample ()将原始数据和期望的样本大小作为输入,并产生加权样本作为输出。请注意,在这种情况下,比例是基于单击事件定义的。也就是说,我们计算点击事件为 1(假设 X%)和 0 (Y%,其中 Y% = 100-X%)的数据点的比例,然后我们生成一个随机样本,使得该样本也将包含点击= 1 时的 X%观察值和点击= 0 时的 Y%观察值。

 id     price    event_type  click
event_type                                     
type1      0   6780  1.200188      type1      1
           1   8830  2.990630      type1      1
           2   8997  3.483728      type1      0
           3   7541  2.402993      type1      1
           4   4460  2.959203      type1      0
...             ...       ...        ...    ...
type3      29  5058  3.426289      type3      1
           30  5855  3.852197      type3      0
           31  6295  2.679898      type3      0
           32  8978  1.115072      type3      1
           33  7730  1.208441      type3      1[100 rows x 4 columns]

加权抽样通常产生一个随机的无偏样本。

分层抽样

分层抽样**是一种数据抽样方法,我们根据具体特征(如年龄、种族、性别身份、地点、事件类型等)将一个群体分成称为阶层的同质子群体。).

被研究人群中的每一个成员都应该属于同一个阶层。然后,使用聚类抽样对每个阶层进行抽样,允许数据科学家估计每个子群体的统计测量值。当人口特征多样化时,我们依赖分层抽样,我们希望确保每个特征在样本中都有适当的代表。

所以,分层抽样,简单来说,就是整群抽样和加权抽样的结合。

图片来源:作者

分层抽样:Python 实现

函数get _ layered _ sample()将原始数据、期望的样本大小、所需的聚类数作为输入,并产生分层样本作为输出。注意,该函数首先使用 click 事件进行加权采样。其次,它使用事件类型执行聚类采样。****

 id     price event_type  click  cluster
0    5131  2.707995      type1      0       45
1    5102  1.677190      type1      0       45
2    7370  1.893061      type1      0       45
3    4207  2.491246      type1      0       45
4    8909  3.252655      type1      1       45
..    ...       ...        ...    ...      ...
96   3254  2.637625      type3      0       85
97   1555  1.196040      type3      1       85
98   7627  3.240507      type3      1       85
99   6405  1.607379      type3      0       85
100  1075  2.471806      type3      0       85[202 rows x 5 columns]

分层抽样,基本上是整群抽样和加权抽样的结合。

如果你喜欢这篇文章,这里有一些你可能喜欢的其他文章:

** https://tatev-aslanyan.medium.com/bias-variance-trade-off-in-machine-learning-7f885355e847 https://tatev-aslanyan.medium.com/data-sampling-methods-in-python-a4400628ea1b https://medium.com/analytics-vidhya/pyspark-cheat-sheet-big-data-analytics-161a8e1f6185

感谢阅读

我鼓励你 加入 Medium today 拥有 完整访问所有跨媒体发布的精彩锁定内容,并在我的 feed 上发布关于各种数据科学、机器学习和深度学习主题的内容。

关注我 中型阅读更多关于各种数据科学和数据分析主题的文章。更多机器学习的动手应用,数学和统计概念查看我的*Github账号。
我欢迎反馈,可以联系LinkedIn。***

快乐学习!**

你应该知道的数据科学反模式

原文:https://towardsdatascience.com/data-science-anti-patterns-you-should-know-1d8711eef72d

通过理解潜在的模式来消除重复出现的棘手问题

杰里米·毕晓普在 Unsplash 上的照片

一种反思维模式是对反复出现的问题的常见却适得其反的反应。因为它们是无效的,它们延续了重复出现的痛点,而没有解决潜在的、系统的问题。反模式几乎存在于人们一起解决问题的任何地方,在软件开发、项目管理中,是的,在数据科学中也是如此。

关于反模式的知识是避免它们的最好方法,所以在这篇文章中,我将分解我在自己的职业生涯中观察到的 5 种常见的数据科学反模式,即:

  1. 临时过载,
  2. 会议瘫痪,
  3. 别针工厂,
  4. 过度的简历驱动开发,以及
  5. 听着。

(当然,这个列表并不完整,列表上的所有项目也不是数据科学领域独有的。)

准备好了吗?让我们开始吧。

临时过载

每个数据科学家都知道临时请求。它们是来自合作者和利益相关者的询问,例如…

  • “哎,能不能快点再拉一遍这些数字?”,
  • “嘿,这个指标突然飙升,你能找出原因吗?”,
  • “嘿,那个指标突然下降,你能找出原因吗?”,
  • “嘿,有人在推特上发布了关于我们产品的奇怪事情,你能调出数据看看这是不是真的吗?”,

如此等等。在最坏的情况下,临时请求可能会完全填满数据科学家的一天,导致临时过载。

👉取而代之的是:

千万不要马上做。除非是紧急情况,否则不要立即处理请求,而是等到你收集了几个这样的请求,然后一次完成所有的请求,也许是在每周的一个专用时间段内(我过去常常在周五设置这样的时间段)。这个'中断合并有两个优点:

  • 首先,它减少了上下文切换。上下文切换的代价比看起来要高:“在一个项目中,20 分钟的中断需要两次上下文切换;戴夫·奥康纳在网站可靠性工程:谷歌如何运行生产系统中写道:“实际上,这种中断会导致损失几个小时真正有成效的工作。”。
  • 其次,它发出了正确的信息。如果你马上处理特别的请求,人们可能会认为这是邀请你在未来提出更多特别的请求。这不是你想要的处境。

自动处理重复的临时请求。一个好的经验法则:如果你两次做一个小任务,第三次试着写一个自动化的脚本。例如,在 Amazon,我们的团队经常被要求准备一份我们拥有的所有模型的列表,以及某些元数据,例如自上次模型更新以来的时间。手动完成几次任务后,我安排了一个 ETL 任务,每周自动提取数据并通过电子邮件发送给相关的利益相关者。瞧,我再也不用去想那个任务了。

当心不可行的数据洞察。在编写任何 SQL 查询之前,请务必询问根据结果可以采取什么措施。如果你正在拉的数据点没有通知任何特定的业务行为,我们真的需要它吗?

会议瘫痪

你是被雇来解决问题的,不是来开会的。然而,几乎不可避免的是,会议量会随着你在一个组织中的任期而增加。如果你觉得因为会议你没有完成任何实际的工作,你就患上了会议瘫痪症。

👉取而代之的是:

如果你没有贡献,就离开会议。如果你既没有在决策过程中贡献你的专业知识,也没有向他人展示任何东西,也没有学到任何对你有用的东西,那就离开吧。离开一个浪费你时间的会议并不粗鲁,但是浪费公司资源(包括你的时间)是不礼貌的。

跳过一次定期会议,看看会发生什么。有时你会发现自己在一系列定期会议的邀请名单上,即使你不确定是否真的需要你出席。亚马逊首席工程师 Steve Huynh 对这种情况有一个有用的建议:一周内,不要出现在下一次会议上,看看会发生什么。如果没有人问你在哪里,这意味着你可以从你的日历中永久删除这个会议系列。如果有人问起你的缺席,道歉并说你下次会回来的。

感觉被授权重新安排会议。将四个 30 分钟的会议分散在一天中进行,与将它们全部放在上午的一个 2 小时时间段内进行,这两者之间有着巨大的差异。这是因为在前一种情况下,你会在“会议模式”和“深度工作模式”之间进行 4 次以上的上下文切换(8 次,而不是 2 次),这实际上会耗费一整天的工作时间。因此,分批安排你的会议,比如尽量减少上下文切换,不仅符合你个人的最大利益,也符合公司的最大利益,因为他们为你的时间付钱。不要犹豫这样做。

别针工厂

这里有一个灾难的处方:让一个模型开发团队构建模型工件,并将它们交给一个工程团队进行部署。这种引脚工厂的方法在实践中并不奏效,因为:

  • 它引入了通信开销。建模团队和工程团队之间的反复增加了摩擦,减缓了迭代周期。ML 是一门经验主义学科,快速的迭代周期是成功的关键。
  • 它错误地假设模型开发和部署是相互独立的。实际上,基础设施约束会影响建模决策,反之亦然。例如,深度神经网络可能需要调整以满足延迟要求。
  • 当生产中出现问题时,它会带来在没有明确所有权的情况下相互指责的风险。例如,如果一个分类特征在生产中突然有一个打破模型的新类别,这是建模问题还是工程问题?两者都有,但是在引脚工厂的方法中,这个问题没有明确的归属。

👉取而代之的是:

与 pin factory 方法相反的是端到端所有权,其中模型所有者拥有整个模型生命周期,包括数据收集、模型开发、离线/在线测试和部署。

为了让这种方法发挥作用,一个组织需要两种类型的 ML 角色,即 ML 基础架构工程师和模型开发人员(又名数据/应用/研究科学家)。ML infra 工程师构建、维护并拥有一组服务,这些服务抽象出围绕模型开发过程的基础设施,一个服务用于模型训练,一个服务用于特征工程,一个服务用于推理调用,等等。模型所有者使用这些服务来端到端地开发、测试和部署他们的模型。

前者拥有服务,后者拥有模型:这种方法工作得很好,因为它拥有清晰的所有权边界,并且几乎没有通信开销。

过度的简历驱动开发

ML 模型开发人员被激励在简单的解决方案可以完成的地方构建过于复杂的解决方案,只是因为复杂的解决方案在他们的简历或推广文档上看起来更好,这种现象被称为简历驱动的开发。从长远来看,这可能会为整个组织带来更高的维护成本,因为过于复杂的模型更难解释、调试和重新培训,并且会为培训和服务带来更高的基础设施成本。

👉取而代之的是:

因此,一个好的策略是保持生产系统尽可能简单,并为研究项目保留大胆的想法,这些想法可以产生出版物。LinkedIn 员工 ML 工程师 Brandon Rohrer 是这样说的:

“ML 策略提示:当你有一个问题时,建立两个解决方案——一个运行在多云 Kubernetes 上的深度贝叶斯转换器和一个建立在一堆过分简化的假设上的 SQL 查询。一个放在简历上,另一个放在生产上。大家高高兴兴回家。”

作为一门实证学科,ML 的许多进展都是由实验推动的。然而,当模型开发人员把所有的东西都扔在一个问题上,“看看有什么坚持”时,事情就变得有问题了。这是听的说法,即只有在大量实验的结果已知后才形成假设的做法。

科学与听觉。图片由作者提供。

由于统计学上的看别处效应,倾听是危险的:你做的实验越多,你偶然发现一个看起来更好的模型的几率就越高。不用说,如果提出的模型被采纳,那么预期的模型改进实际上不会在生产中实现:这只是一个统计上的侥幸。

👉取而代之的是:

  • 永远遵循科学方法。在进行任何实验之前,一定要明确提出一个假设。这可以简单到“我假设 BERT 模型比词袋模型更好,因为在这个问题中,词的上下文很重要,而不仅仅是它们的频率。”没有假设的实验不是科学,是伪科学。
  • 估计方差。不要仅仅测量测试集上的模型准确性,还要尝试估计它的方差,这样你就知道这些变化在统计上有多大意义。例如,您可以通过 bootstrapping 来估计方差,即从测试集的不同随机子集(替换)中创建多个测量值。
  • 不依赖线下指标 ,可以轻松对局。始终根据在线模型性能做出最终发布决定。
  • 记录一切。即使一个实验不成功(不会提高模型性能),也要记录下你尝试了什么,为什么要尝试,以及你发现了什么。留下这样的书面记录将有助于你理解和交流你是如何做出最终的建模选择的,并防止你(和其他人)再次尝试同样的事情。

最后的想法

让我们将这 5 种反模式及其各自的解决方案总结如下:

  1. 避免临时过载:练习中断合并,
  2. 避免会议瘫痪:离开实际上不需要你出席的会议,
  3. 避免 pin 工厂:在支持端到端模型所有权的组织中工作,
  4. 避免过多的简历驱动的开发:为你的研究论文保留疯狂的想法,而不是为了生产
  5. 避免重复:在进行任何实验之前,始终遵循科学方法并制定一个假设。

当然,这份清单并不完整。一般来说,在日常工作中发现反模式的一个好方法是注意重复出现的痛点。例如,由临时过载引起的重复出现的痛点是频繁的上下文切换,这会降低您的工作效率。或者,由 pin 工厂引起的反复出现的痛点是必须频繁地在团队之间来回发送数据。注意重复出现的痛点,您可能会发现潜在的反模式。

最后,区分你可以打破的反模式和你不能打破的反模式。例如,通过遵循我在这里列出的步骤,你可以自己打破临时超载和会议瘫痪,至少在某种程度上。然而,对于像“pin factories”这样的组织反模式,作为一个个体贡献者,你真的没有什么可以做的。如果反模式是组织性的,你唯一能做的就是离开那个组织。

📫 订阅 把我的下一篇文章直接发到你的收件箱。
💪
成为中等会员 并解锁无限权限。
📖
获取我的电子书 ,50 页挤满了来自战壕的实用 ML 见解。

2022 年世界杯上的数据科学

原文:https://towardsdatascience.com/data-science-at-the-2022-world-cup-43f24391c2d4

意见

数据如何平衡竞争环境

2022 年世界杯正在进行中!总的来说,我喜欢体育的一个原因是,在很多方面,每一场比赛、每一个赛季和每一场锦标赛都可以被视为商业世界的缩影。

由瑞德·路易斯在 Unsplash 上拍摄的照片

从数据科学的角度来看,足球领域正在进行一场大数据革命。足球界最大的球队要么正在建立或扩充他们的数据科学部门。广播开始引入一些有意义的统计数据,这些数据至少有些实质内容。分析网站如雨后春笋般到处涌现,提供大量有趣的数据,让你垂涎三尺。

这是一场数据革命,在其他一些运动中发生得更早。特别是在棒球领域,许多数据科学家将迈克尔·刘易斯的钱球和内特·西尔弗(信号和噪音、fivethirtyeeight、佩科塔)作为数据科学在体育和商业领域的灵感来源。

但是,让统计学在棒球中如此成功的许多东西并不容易转化为足球。棒球是由离散的事件组成的。足球本质上是不稳定的。很难把一场足球比赛分成几个独立的事件,尽管已经取得了很大进展。从统计学的角度来看,足球比棒球多了一层抽象。

流动性和抽象性是减缓足球数据革命的重要原因。但是,它也更好地反映了商业中的数据科学。在商业领域,数据科学家试图做的大多数事情都可以归结为将一些流动、抽象、定义不清的概念转化为更容易理解的具体模型和数字。

这并不是要抨击棒球。棒球数据科学的成功是足球数据科学建设的必要一步,甚至是在商业社区。事实上,信号和噪声让我在数据科学领域面临的许多挑战中产生了共鸣。Nate Silver 在棒球和政治领域的成功让我感觉到数据科学解决方案在当今世界中有着如此强大的作用。

因此,虽然数据科学仍在足球领域发展壮大,但世界杯上出现了一些引人入胜的趋势,从整体上说明了数据科学。其中之一是重大扰乱事件的上升。在 2022 年世界杯的前 32 场比赛中,有 11 场比赛可能会产生重大冷门,有 2 场比赛实际上产生了重大冷门,而 2018 年世界杯在同一阶段产生了 0 场冷门。

在这里,爆冷被定义为国际足联排名第 15 位或以上的球队输给排名比他们差至少 20 位的球队,即阿根廷(排名第 3)输给沙特阿拉伯(排名第 51)。根据不同的定义,你可以在 2022 年看到 2-3 次颠覆,在 2018 年看到 0-2 次颠覆。运动员数了 3 个。一场潜在的爆冷是任何符合国际足联排名定义的比赛,无论结果如何。

随着数据进入一个新的领域,我们经常看到根深蒂固的竞争对手坚持他们的传统行为,并为此遭受痛苦。这是因为这些传统通常源自同一批根深蒂固的竞争对手。这些传统是过去那些团队、那些企业成功的原因。而那些传统,虽然经常被盲从,但一般都是制度知识的体现。它们是朝着最佳解决方案缓慢进化的行为,并将继续进化。这种缓慢的进化保护了根深蒂固的竞争对手免于犯危险的错误,但也抑制了他们像弱者一样快速创新的能力。

数据科学的强大之处在于,它提供了一种更快找到最佳解决方案的方法。它让处于劣势的一方很快学会那些根深蒂固的竞争对手花了几十年才弄明白的东西。从根本上说,数据科学,做得好的话,让我们量化情况,并快速提取有意义的模式,而不必亲自经历每种情况。有了数据科学,我们可以比以往任何时候都学得更快。我们可以为弱者创造公平的竞争环境。

因此,对于根深蒂固的竞争对手来说,当数据与现有传统不一致时,这是一个困难的局面。创新和学习存在于这些分歧中,但糟糕的建议和错误也是如此。此外,对于根深蒂固的竞争对手来说,根据创新建议采取行动可能会令人尴尬,因为这是承认他们的一些机构知识是不正确的。

不那么根深蒂固的竞争对手更愿意接受数据科学推荐的创新解决方案,因为他们不拘泥于标准传统。换句话说,这些数据与他们的机构知识并不矛盾,所以并不意味着承认错误。

然而,作为数据科学家,我们不能忽视企业的传统。我们需要尊重他们共同行为背后的制度知识。我们需要采取贝叶斯方法来理解我们的客户。当我们发现一个企业创新行动的机会时,我们需要明白我们可能会过度使用大量的机构知识。我们需要问自己:

  1. 这种传统从何而来,企业有多少证据证明这是一个好主意?
  2. 我们对创新建议的正确性有多大信心?
  3. 我们的模型可靠吗?背后的数据是否干净清晰?
  4. 我们确定我们一开始就问了正确的问题吗?

在足球中,一个有趣的例子是换人的时间。传统上,失败的球队在比赛的第 60 分钟左右开始换人,这是一种长期的做法。但是,这是正确的做法吗?任何对最佳换人时机的分析都应该对重要创新的可能性感到兴奋——也许第 45 分钟的换人明显更好——但他们也需要尊重建立这一传统的机构知识。

一个重要的经验法则是,好的分析应该遵循 80/20 法则。如果我们在一个成功的企业中工作,那么我们的模型中大约 80%的建议应该验证现有的行为,20%应该是创新的。

照片由奥斯汀·迪斯特尔在 Unsplash 上拍摄

也就是说,80%的建议或见解可能会稍微改变现有的行为,但不会大幅度改变它们,因此不会对业务绩效产生大的影响。验证性 80%使企业领导能够满怀信心地采取行动,并让我们相信我们拥有良好的数据和可靠的模型,并且我们已经提出了正确的问题。创新的 20%是我们真正感到兴奋的地方,因为有机会对业务绩效产生重大影响。

如果我们远低于 80%的验证阈值,那么就有理由担心。这意味着我们要告诉企业,他们“学到的”很多东西都是错误的。当然有可能,但是我们需要非常小心。我们需要对它进行贝叶斯分析,并建立我们的信心,从企业目前的状况到我们的建议。我们不能在没有深刻理解我们是如何做到这一点的情况下,就关掉一大堆行为,打开一个全新的集合。事实上,如果我们远低于 80%的阈值,那么我们应该将模型作为一个整体来考虑——是否存在可能将我们引入歧途的基本问题?

即使我们已经达到了 80%的验证阈值,我们创新的 20%也应该从贝叶斯的角度来考虑。我们的模型 80%有效的事实给了我们一些信心,事情运行良好,但我们仍然需要认识到创新的 20%可能是不正确的,因为我们已经说过它与现有机构知识的一些优势相矛盾。我们有许多方法可以建立这种信心,我们可以在风险较低或业务有风险偏好的情况下进行试验(例如,快速行动和打破常规),或者在需要时通过额外的分析。

回到我们的换人时间的例子,结果是模型显示落后的球队进行第一次换人的最佳时间是在第 58 分钟[2]。这足够接近现有的传统,它将进入我们 80%的“验证”。所以,一方面,这里没有什么大的创新,但是酷的是数据显示机构知识在这个话题上或多或少是正确的。这是我们在这种情况下可能会预料到的,考虑到这个决定对比赛的重要性。

本·萨瑟兰、https://www.flickr.com/photos/bensutherland/14833714489、 CC BY 2.0 License 摄影

虽然验证很棒,但企业确实需要预料到来自数据科学团队的干扰。创新的 20%只有在企业愿意实施变革并朝着新的方向前进时才有价值。如果他们不是,那么更愿意利用这些新见解的不那么根深蒂固的竞争对手将会打败他们。在世界杯上,我们将继续看到更多的冷门,因为弱队比现有精英队的策略更胜一筹。

作为数据科学家,我们应该为自己在推动体育和商业向创新方向发展方面的独特地位感到兴奋。但是,我们也要记住,创新意味着颠覆传统。大多数传统来自丰富的知识和经验。

当我们推荐创新时,我们就在发出信号,表明我们组织的制度知识库有问题。这并不意味着我们错了,但这意味着我们需要小心。我们需要明白,我们正在推翻的那些传统可能不是凭空产生的。我们需要权衡支持他们的证据的力度和我们新建议的力度。我们不仅需要在模型中使用贝叶斯方法,还需要在如何推出我们的建议时使用贝叶斯方法。

取得联系

欢迎通过 LinkedIn 联系我,了解更多关于数据科学领域的观点。

参考文献

[1]利特尔顿,本。 足球中的数据和决策

[2]布雷特·迈尔斯。(2012).足球换人时机的提议决策规则。体育定量分析杂志。8.11–11.10.1515/1559–0410.1349.

[3]迈克尔·考克斯。世界杯冲击:小组赛的惊喜会让比赛变得不那么有趣吗?

命令行中的数据科学

原文:https://towardsdatascience.com/data-science-at-the-command-line-3ad09ee73d1a

每个数据科学家都应该了解的关于 shell 的知识

现在已经 50 岁了,我们还是想不出该怎么称呼它。命令行、shell、终端、bash、提示符还是控制台?我们将把它称为命令行,以保持事情的一致性。

为了清楚起见,本文将集中讨论 UNIX 风格(Linux & Mac)的命令行,忽略其余部分(如 Windows 的命令处理器和 PowerShell)。我们观察到,如今大多数数据科学家都在基于 UNIX 的系统上工作。

命令行让你先睹为快(图片由作者提供)

这是什么?

命令行是基于文本的计算机界面。你可以把它想象成一个操作系统的“引擎盖”。有些人误认为它只是过去的遗迹,但不要被愚弄。现代命令行前所未有的震撼!

作者图片

过去,基于文本的输入和输出是你所拥有的一切(那是在打孔卡之后)。就像最早的汽车一样,第一个操作系统甚至没有引擎盖。一切都一览无余。在这种环境下,所谓的 REPL(读取-评估-打印循环)方法是与计算机交互的自然方式。

REPL 意味着你输入一个命令,按下回车键,命令会立即被执行。它不同于编辑-运行-调试或编辑-编译-运行-调试循环,后者通常用于更复杂的程序。

我为什么要用它?

命令行一般遵循“让每个程序做好一件事”的 UNIX 哲学,因此基本命令非常简单。最根本的前提是,你可以通过组合这些简单的程序来做复杂的事情。旧的 UNIX neckbeards 指的是“与计算机进行对话”

几乎世界上所有的编程语言都比命令行更强大,而且大多数点击式图形用户界面更容易学习。你为什么要在命令行上做任何事情呢?

第一个原因是速度。一切触手可及。对于告诉计算机做简单的任务,如下载文件,用特定的前缀重命名一堆文件夹,或对 CSV 文件执行 SQL 查询,你真的不能击败命令行的灵活性。学习曲线是存在的,但是一旦你内化了一组基本的命令,它就像魔术一样。

第二个原因是不可知论。无论您当前使用的是什么堆栈、平台或技术,您都可以从命令行与之交互。它就像万物之间的粘合剂。也是无处不在。哪里有电脑,哪里就有命令行。

第三个原因是自动化。与 GUI 界面不同,在命令行中完成的一切最终都可以自动化。指令和计算机之间没有任何歧义。在基于 GUI 的工具中,所有那些你浪费生命的重复点击都可以在命令行环境中自动完成。

第四个原因是扩展性。与 GUI 不同,命令行是非常模块化的。简单的命令是为无数用例创建复杂功能的完美构建块,而生态系统在 50 年后仍在增长。命令行将一直存在。

第五个原因是没有其他选择。常见的情况是,第三方服务的一些更加模糊或前沿的功能可能根本无法通过 GUI 访问,只能通过 CLI(命令行界面)使用。

它是如何工作的?

命令行的工作方式大致分为四层:

终端 =获取键盘输入的应用程序将它传递给正在运行的程序(例如 shell)并呈现结果。由于现在所有的现代计算机都有图形用户界面(GUI ),终端是你和其他基于文本的堆栈之间必要的 GUI 前端层。

Shell =解析终端应用程序传递的击键并处理运行命令和程序的程序。它的工作基本上是找到程序在哪里,处理变量之类的事情,还提供用 TAB 键完成的功能。这里有不同的选项,比如 Bash、Dash、Zsh 和 Fish 等等。所有这些都具有稍微不同的内置命令和选项集。

命令 =与操作系统交互的计算机程序。常见的例子是像lsmkdirrm这样的命令。有些是预先构建到 shell 中的,有些是在您的磁盘上编译的二进制程序,有些是文本脚本,有些是指向另一个命令的别名,但归根结底,它们都只是计算机程序。

操作系统 =执行所有其他程序的程序。它处理与所有硬件(如 CPU、硬盘和网络)的直接交互。

提示符和波浪号

作者图片

对于每个人来说,命令行看起来都略有不同。

不过,通常有一个共同点:提示,可能由美元符号($)表示。这是一个可视的提示,指示状态结束的位置以及可以开始输入命令的位置。

在我的电脑上,命令行显示:

juha@ubuntu:~/hello$

juha是我的用户名,ubuntu 是我的电脑名,~/hello是我当前的工作目录。

那个波浪号(~)字符是怎么回事?甚至当前目录是~/hello是什么意思?

代字号是主目录的简写,是存放所有个人文件的地方。我的主目录是/home/juha,所以我现在的工作目录是/home/juha/hello,简称~/hello。(约定~用户名一般指某人的主目录;~juha指我的主目录等等。)

从现在开始,我们将省略提示中除美元符号以外的所有内容,以使我们的示例更加清晰。

对命令的剖析

之前,我们简单地将命令描述为与操作系统交互的计算机程序。虽然正确,但还是具体一点吧。

当您在提示符后键入内容并按 enter 键时,shell 程序将尝试解析并执行它。假设:

$ generate million dollars 
generate: command not found

shell 程序获取第一个完整的单词generate,并将其视为命令。

剩下的两个单词milliondollars被解释为两个独立的参数(有时称为自变量)。

现在,负责促进执行的 shell 程序开始寻找一个generate命令。有时是磁盘上的文件,有时是其他东西。我们将在下一章详细讨论这一点。

在我们的例子中,没有找到名为generate的命令,我们以一个错误消息结束(这是意料之中的)。

让我们运行一个实际有效的命令:

$ df --human-readable

Filesystem      Size  Used Avail Use% Mounted on
sysfs              0     0     0    - /sys
proc               0     0     0    - /proc
udev             16G     0   16G   0% /dev
. . .

这里我们运行一个命令“df”(disk free 的缩写)和“--human-readable”选项。

通常在缩写选项前使用“-”(破折号),在长格式选项前使用“-”(双破折号)。(这些惯例随着时间的推移而演变;更多信息请看这篇博文。)

例如,这些是同一件事:

$ df -h 
$ df --human-readable

通常也可以在一个破折号后合并多个缩写选项。

df -h -l -a 
df -hla

注意:格式最终由每个命令决定,所以不要假设这些规则是通用的。

因为像空格或反斜杠这样的字符有特殊的含义,所以将字符串参数用引号括起来是个好主意。但是,对于类似 bash 的 shells,单引号(')和双引号(")是有区别的。单引号从字面上理解一切,而双引号允许 shell 程序解释变量之类的东西。例如:

$ testvar=13 
$ echo "$testvar" 
13 
$ echo '$testvar' 
$testvar

如果您想知道所有可用的选项,您通常可以通过--help参数获得一个列表:

提示:在命令行中输入的通常是一个很长的文件路径。大多数 shell 程序提供 TAB 键来自动完成路径或命令,以避免重复键入。试试吧!

命令的不同类型

作者图片

有五种不同类型的命令:二进制、脚本、内置、函数和别名。

我们可以将它们分为两类,基于文件的和虚拟的。

二进制和脚本命令是基于文件的,通过创建新进程(新程序的操作系统概念)来执行。基于文件的命令往往更加复杂和重量级。

内置、函数和别名是虚拟的,它们在现有的 shell 进程中执行。这些命令大多简单而轻量。

一个二进制文件是一个经典的可执行程序文件。它包含只有操作系统才能理解的二进制指令。如果你试图用文本编辑器打开它,你会得到乱码。二进制文件是通过将源代码编译成可执行的二进制文件来创建的。例如,Python 解释器命令python是一个二进制可执行文件。

对于二进制命令,shell 程序负责从文件系统中找到与命令名匹配的实际二进制文件。但是,不要期望 shell 会在您的机器上到处寻找命令。相反,shell 依赖于一个名为$PATH的环境变量,这是一个用冒号(:)分隔的路径列表,可以进行迭代。总是选择第一个匹配。

要检查你当前的$PATH,试试这个:

如果想知道某个命令的二进制文件在哪里,可以调用 which 命令。

$ which python 
/home/juha/.pyenv/shims/python

现在您已经知道在哪里可以找到文件,您可以使用file实用程序来确定文件的一般类型。

$ file /home/juha/.pyenv/shims/pip
/home/juha/.pyenv/shims/pip: Bourne-Again shell script text executable, ASCII text
$ file /usr/bin/python3.9
/usr/bin/python3.9: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped

脚本是包含人类可读程序的文本文件。Python、R 或 Bash 脚本是一些常见的例子,您可以将它们作为命令来执行。

通常我们不把 Python 脚本作为命令来执行,而是像这样使用解释器:

$ python hello.py 
Hello world

这里的python是命令,hello.py只是它的一个参数。(如果你看看python --help所说的,你可以看到它对应于变体“文件:程序从脚本文件读取”,这在这里确实有意义。)

但是我们也可以像命令一样直接执行 hello.py:

$ ./hello.py 
Hello world

要做到这一点,我们需要两样东西。首先,hello.py的第一行需要使用特殊的#!符号定义一个脚本解释器。

#!/usr/bin/env python3 
print("Hello world")

#!符号告诉操作系统哪个程序知道如何解释文件中的文本,并且有许多很酷的昵称,比如 shebang、hashbang 或者我最喜欢的 hash-pling!

我们需要的第二件事是将文件标记为可执行。您可以使用chmod(更改模式)命令来完成这个任务:chmod u+x hello.py将为所有用户设置可执行标志。

一个内置是一个硬编码到 shell 程序本身的简单命令。像cdechoaliaspwd这样的命令通常是内置的。

如果您运行help命令(这也是内置的!),您将获得所有内置命令的列表。

功能就像是用户定义的额外内置功能。例如:

$ hello() { echo 'hello, world'; }

可以用作命令:

$ hello 
hello, world

如果想要列出当前可用的所有函数,可以调用(在 Bash 类 shells 中):

别名就像宏。更复杂命令的简写或替代名称。

例如,您希望 new 命令showerr列出最近的系统错误:

$ alias showerr="cat /var/log/syslog"
$ showerr
Apr 27 10:49:20 juha-ubuntu gsd-power[2484]: failed to turn the kbd backlight off: GDBus.Error:org.freedesktop.UPower.GeneralError: error writing brightness
. . .

由于函数和别名不是物理文件,所以它们在关闭终端后不再存在,通常在所谓的配置文件~/.bash_profile~/.bashrc文件中定义,当新的交互或登录 shell 启动时执行。一些发行版还支持一个~/.bash_aliases文件(很可能是从概要文件中调用的——它是一路向下的脚本!).

如果您想获得 shell 当前活动的所有别名的列表,您可以不使用任何参数调用alias命令。

将命令组合在一起

几乎所有发生在你电脑上的事情都发生在进程内部。二进制和脚本命令总是启动一个新的进程。内置、函数和别名依附于现有 shell 程序的进程。

进程是用于运行命令(程序)实例的操作系统概念。每个进程都有一个 ID、自己的保留内存空间和在系统上执行操作的安全特权。每个流程还有一个标准输入(stdin)、标准输出(stdout)和标准误差(stderr)流。

这些溪流是什么?它们只是任意的数据流。没有指定编码,这意味着它可以是任何东西。文本,视频,音频,莫尔斯电码,任何命令的作者觉得合适的。最终,你的电脑只是一台美化了的数据转换机器。因此,每个进程都有输入和输出是有意义的,就像函数一样。将输出流与错误流分开也是有意义的。如果您的输出流是一个视频,那么您不希望基于文本的错误消息的字节与您的视频字节混合在一起(或者,在 20 世纪 70 年代,当您的照相排版被排版而不是显示在终端上的错误消息破坏后,标准错误流被实现)。

默认情况下,stdout 和 stderr 流通过管道返回到您的终端,但是这些流可以重定向到文件或通过管道成为另一个进程的输入。在命令行中,这是通过使用特殊的重定向操作符来完成的(|><>>)。

先说个例子。默认情况下,curl命令下载一个 URL 并将其标准输出返回到终端。

curl 命令输入和输出(图片由作者提供)

$ curl https://filesamples.com/samples/document/csv/sample1.csv
"May", 0.1, 0, 0, 1, 1, 0, 0, 0, 2, 0, 0, 0
"Jun", 0.5, 2, 1, 1, 0, 0, 1, 1, 2, 2, 0, 1
"Jul", 0.7, 5, 1, 1, 2, 0, 1, 3, 0, 2, 2, 1
"Aug", 2.3, 6, 3, 2, 4, 4, 4, 7, 8, 2, 2, 3
"Sep", 3.5, 6, 4, 7, 4, 2, 8, 5, 2, 5, 2, 5

假设我们只想要前三排。我们可以使用管道操作符(|)将两个命令连接在一起。第一个命令的标准输出(curl)作为第二个命令的标准输入(head)通过管道传输。默认情况下,第二个命令的标准输出(head)仍然输出到终端。

$ curl https://filesamples.com/samples/document/csv/sample1.csv | head -n 3
"May", 0.1, 0, 0, 1, 1, 0, 0, 0, 2, 0, 0, 0
"Jun", 0.5, 2, 1, 1, 0, 0, 1, 1, 2, 2, 0, 1
"Jul", 0.7, 5, 1, 1, 2, 0, 1, 3, 0, 2, 2, 1

通常,您希望数据在磁盘上,而不是在终端上。我们可以通过使用>操作符将最后一个命令(head)的标准输出重定向到一个名为foo.csv的文件中来实现这一点。

命令卷曲管道与头部命令(图片由作者提供)

$ curl https://filesamples.com/samples/document/csv/sample1.csv | head -n 3 > foo.csv

最后,进程在结束时总是会返回值。当返回值为零(0)时,我们将其解释为成功执行。如果它返回任何其他数字,这意味着执行有一个错误,并提前退出。例如,任何未被 try/except 捕获的 Python 异常都会让 Python 解释器以非零代码退出。

您可以使用$?变量检查先前执行的命令的返回值。

$ curl http://fake-url
curl: (6) Could not resolve hostmm
$ echo $?
6

以前,我们通过管道将两个命令与流连接在一起,这意味着它们是并行运行的。当我们使用&&操作符将两个命令组合在一起时,命令的返回值很重要。这意味着我们要等待上一个命令成功,然后再继续下一个命令。例如:

cp /tmp/apple.png /tmp/usedA.png && cp /tmp/apple.png /tmp/usedB.png && rm /tmp/apple.png

这里我们尝试将文件/tmp/apple复制到两个不同的位置,最后删除原始文件。使用&&操作符意味着 shell 程序检查每个命令的返回值,并在移动之前断言它为零(成功)。这可以防止我们在最后意外删除文件。

如果您对编写更长的 shell 脚本感兴趣,那么现在是一个很好的时机,可以绕道去 Bash“严格模式”的领地将自己从许多令人头痛的事情中解救出来。

像老板一样管理数据科学项目

作者图片

通常,当数据科学家冒险使用命令行时,是因为他们使用了第三方服务或云运营商提供的 CLI(命令行界面)工具。常见的例子包括从 AWS S3 下载数据,在 Spark 集群上执行一些代码,或者为生产构建 Docker 映像。

总是手动记忆并一遍又一遍地键入这些命令不是很有用。从团队合作和版本控制的角度来看,这不仅令人痛苦,而且是一种糟糕的做法。一个人应该总是记录神奇的配方。

为此,我们建议使用自 1976 年以来的经典命令之一 make 命令。它是一个简单的、无处不在的、健壮的命令,最初是为编译源代码而创建的,但是可以被武器化,用于执行和记录任意脚本。

使用make的默认方式是在项目的根目录下创建一个名为Makefile的文本文件。您应该始终将该文件提交到您的版本控制系统中。

让我们创建一个只有一个“目标”的非常简单的Makefile。由于编译源代码的历史,它们被称为目标,但是你应该把目标看作一个任务。

Makefile

hello:
    echo "Hello world!"

记得我们说过这是 1976 年的经典之作吗?嗯,也不是没有怪癖。你必须非常小心用制表符缩进那个echo语句,而不是任何数量的空格。如果你不这样做,你会得到一个“缺少分隔符”的错误。

为了执行我们的“hello”目标(或任务),我们调用:

$ make hello
echo "Hello world!"
Hello world!

注意 make 是如何打印出食谱而不仅仅是输出的。您可以使用-s 参数来限制输出。

$ make -s hello
Hello world!

接下来,让我们添加一些有用的东西,比如下载我们的训练数据。

Makefile

hello:
    echo "Hello world!"

get-data:
    mkdir -p .data

    curl <https://filesamples.com/samples/document/csv/sample1.csv>
    > .data/sample1.csv
    echo "Downloaded .data/sample1.csv"

现在,我们可以通过以下方式下载示例培训数据:

$ make -s get-data
Downloaded .data/sample1.csv

(旁白:我们读者中更有经验的 Makefile 向导会注意到,get-data实际上应该命名为.data/sample1.csv,以利用 Makefile 的简写和数据依赖性。)

最后,我们将看一个数据科学项目中简单的Makefile可能是什么样子的示例,这样我们就可以演示如何使用 make 变量,让您更有灵感:

Makefile

DOCKER_IMAGE := mycompany/myproject
VERSION := $(shell git describe --always --dirty --long)

default:
    echo "See readme"

init:
    pip install -r requirements.txt
    pip install -r requirements-dev.txt
    cp -u .env.template .env

build-image:
    docker build .
        -f ./Dockerfile
        -t $(DOCKER_IMAGE):$(VERSION)

push-image:
    docker push $(DOCKER_IMAGE):$(VERSION)

pin-dependencies:
    pip install -U pip-tools
    pip-compile requirements.in
    pip-compile requirements-dev.in

upgrade-dependencies:
    pip install -U pip pip-tools
    pip-compile -U requirements.in
    pip-compile -U requirements-dev.in

这个例子Makefile将允许您的团队成员在克隆存储库之后初始化他们的环境,当他们引入新的库时固定依赖项,并部署一个带有漂亮版本标签的新 docker 映像。

如果您在代码库中始终提供一个漂亮的Makefile和一个写得很好的自述文件,它将使您的同事能够使用命令行并始终如一地再现您的每个项目的魔力。

结论

归根结底,有些人喜欢命令行,有些人不喜欢。

这不是每个人都喜欢的,但每个数据科学家都应该尝试一下,给它一个机会。即使它在你的日常工具箱中找不到位置,了解基本面也是有好处的。能够与热衷于命令行的同事交流而不被他们的终端巫术吓倒是一件好事。

如果这个话题激发了你的灵感,我强烈推荐接下来看看耶鲁安·扬森斯的免费书籍《命令行数据科学》。

原载于https://valohai.com

来自 Ken Jee 的数据科学职业建议

原文:https://towardsdatascience.com/data-science-career-advice-from-ken-jee-bee257426de4

关于在人工智能和数据领域导航学术和专业职业道路的建议

拉兹万·苏驰在 Unsplash 上的照片

谁是肯·吉?

肯·吉(Ken Jee)是一名数据科学家,也是 YouTube 上的内容创作者,他很快成为了所有人最喜爱的数据科学家。Ken 通过其引人入胜且易于理解的视频,帮助无数人了解了数据科学、机器学习和人工智能。更值得注意的是,Ken 是广受欢迎的#66daysofdata 运动的发起者。肯有两个硕士学位:一个是计算机科学,另一个是商业、营销和管理。他还拥有经济学学士学位。Ken 是 Scouts Consulting Group 的数据科学主管。

在本文中,Ken 讨论了他作为数据科学家的工作,并为任何希望进入该领域的人提供了建议。我们探讨了大学教育对数据科学职业生涯的重要性、数学对数据科学家的相关性、在行业内创造能见度,以及对新技术保持开放态度的价值。

作者注:这篇文章是我有幸在我的播客中深入谈论的肯的智慧的片段转录。在本文的结尾,您会找到整个讨论的链接。这也意味着 Ken 提供的回答经过了大量的编辑,以确保简洁明了,但是请放心,Ken 的信息的意图是保持不变的。

人工智能和数据背后的人类:Ken Jee

你是如何对数据科学产生兴趣的?

我对数据科学产生了兴趣,因为我想提高我的高尔夫技术。我开始探索数据如何帮助我分析自己的表现,并找到改进的方法。我很快发现我有一个独特的优势:分析数据和创造数据驱动的行动来提高我的高尔夫技术的能力。这促使我进一步探索由数据和智能支持的其他性能改进方法。

数学在数据科学中有多重要?

我认为,在进入数据科学领域时,数学不那么重要,重要的是动手编程。我建议人们通过构建项目和编码来动手,因为这将帮助他们直观地发现数学在哪里是有价值的和必要的。

我还建议复习微积分、线性代数和离散数学,但前提是你有理由这样做,并且理解它们与数据科学的关系。随着你在这个领域的进步,你会逐渐了解数学技能的重要性和相关性。一旦你看到它们带来的价值,你就会更有动力去理解它们。

进入数据科学,自我导向学习比正式学位更重要吗?

我鼓励人们研究不同寻常的学习方法,而不是上大学,其中一个主要原因是,许多学生没有充分利用学校的资源。我把所有的办公时间都花在了教授身上,并向精通相关学科的博士们提问,但我发现很少有学生这么做。

我相信拥有一个学位只有在你付出努力并充分利用现有机会的情况下才有帮助。我建议利用大学里的其他选择,比如兼职项目。这样做可以帮助学生从他们的教育中获得最大的收益,并让他们在就业市场上获得优势。然而,我警告说,仅仅获得学位并不能保证事业成功。

作者注:Ken Jee 为数据科学学习平台 365DataScience 做出了贡献,他在那里教育学习者如何开始成功的数据科学职业生涯。

获得数据科学等高级学科的硕士学位并不总是脱颖而出的最佳方法。我的想法是,用你所拥有的资源做你能做的事情,尽可能让自己与众不同,这是非常有价值的。拥有令人印象深刻的作品集、独特的工作或志愿者经历会更有益。

这是值得考虑的,如果你能投入时间和金钱获得硕士学位,因为它无疑是一个可行的资源。但是考虑回学校找工作的机会成本总是很重要的。因此,从财务角度来看,读研以获得人工智能领域的一个特殊职位是一种机会成本;你需要确定读研是否会带来好的投资回报。你需要计算学费和攻读学位的时间成本,然后比较用同样的资金资助一种更加自主的学习方法来获得同样的目标工作。

大多数从业者会发现,如果预期目标是获得一个特定的角色,将资本投入到自我导向的学习方法而不是研究生院是更合适的投资。这种将资金分配视为学习方法的心态表明,大学不应该被视为实现一维目标(如获得特定工作)的方法。在大多数情况下,将时间和金钱投入到有助于求职的资源中,比如简历服务或模拟面试,会比重返校园获得更高的投资回报。

在大多数情况下,将时间和金钱投入到有助于求职的资源中,比如简历服务或模拟面试,会比重返校园获得更高的投资回报。我没有直接攻读数据科学硕士学位,而是攻读了计算机科学硕士学位,这一点,加上我独特的商业技能,使我能够在充满数据科学硕士毕业生的候选人中脱颖而出。

如何合理利用大学资源?

我相信很少有人充分利用现有资源,这是一个被浪费的机会。上班时间,我花了大量时间在老师的办公室里,问问题,寻求帮助。我觉得这是我学费的一次有价值的使用。我建议学生考虑他们的目标,问问他们的钱花得值不值。如果他们去上课,不做任何额外的工作或项目,他们就没有从教育中获得最大的收益。如果学生想从大学教育中获益,他们需要努力工作。

你是怎么学习的?

我学得最好的方法是按照我自己的速度努力学习,反复重读同样的东西,直到我理解为止。读研的时候就爱上了读书,大部分知识都是从课本上得来的。我建议从不同的角度看待事物,以便对一个话题有不同的理解。加快学习的最重要的一个关键是找到一个合适的媒介,以一种对你有意义的方式解释这个主题,这可以是读一篇博客,看一段视频,或者听一段播客。虽然我在研究生院获得知识的主要方法是通过书籍,但我承认我今天学习数据科学概念和主题涉及视频和 YouTube 教程。具体来说,我要提一下流行数据科学 YouTube 频道stat quest with Josh Starmer

作为一名数据科学家,让自己脱颖而出的最佳技能是什么?

数据科学家必须学习编码、数学和商业才能成功。我凭借自己独特的技能组合在竞争中脱颖而出。我的商业知识和满足编码和数据科学战略需求的能力使我成为一个非常理想的候选人。我的简历和作品集在竞争中脱颖而出。此外,我的沟通技巧和商业知识让我在求职面试中有了明显的优势。

你为什么开始在 YouTube 上制作数据科学视频?

我开始在 YouTube 上制作数据科学视频是因为我在尝试学习数据科学的时候没有看到我要找的资源。

我也认为制作视频是提高我沟通技巧的最好方法。创造内容给了我竞争优势,因为它把雇主吸引到了我这里,而不是出去找他们。我通常把这称为内容重力的概念。我创作的内容越多,我对雇主的吸引力就越大,机会就越多。我认为这是竞争优势的圣杯,因为这意味着我不必出去得到我想要的东西;它来找我是因为努力工作和内容创作。

作为数据科学从业者,如何提高自己的知名度?

我喜欢从事有趣的数据项目,创造易于理解的内容,帮助他人学习和成长。我相信数据科学技能是有价值和可分享的,数据驱动的内容有很大的潜力去病毒式传播。公司应该鼓励员工搞兼职,并公开,因为这对公司有好处。我看到一个未来,每个人都使用社交媒体来分享他们的工作和想法,这在大多数角色中都被接受和期待。在我之前的一些工作中,我被称为“制作 YouTube 视频的人”我在工作之外的外部努力有助于我在公司内部的知名度。

对于计划探索元宇宙的数据科学家,你有什么建议吗?

我认为,为元宇宙做准备包括尝试不同的数据类型。具体来说,我建议数据科学家要知道如何在更高维度中建模数据,并预测潜在的问题。此外,我建议温习编程语言,以便更好地理解元宇宙。数据科学家需要预测元宇宙将面临的问题,并了解第三方应用程序的开发。

作者注:Nvidia 深度学习研究所拥有优秀的学习资源,这些资源介绍了创建数字、现实世界和对象的工作流程和过程。

数据科学家的收入潜力有多大?

我接受了减薪,在目前的公司工作,因为它让我有很多自由来创作内容和追求工作之外的其他兴趣。对我来说,选择项目的自主权和自由比更高的薪水更有价值。我不认为人们应该为了赚钱而学习数据科学。我认为软件工程师的准入门槛要低一点,数据科学家必须学习编码、数学和商业才能获得成功。对我来说,比金钱更重要的是享受我的工作。

你是如何成为目前公司的数据科学主管的?

我很早就发现自己不太适应公司的官僚作风。我的重点是创造价值,通过增加价值获得关注,并获得工作满足感。我的头衔从数据科学家进步到了数据科学主管,我现在负责所有与数据相关的工作,并承担了数据科学主管的角色。这一变化反映了我在当前公司很早就承担了越来越多的责任,从单独负责所有数据科学活动到管理数据科学家团队。如果你正在找工作,我建议你通过接触潜在雇主来创造机会。如果他们看到你愿意并且有能力做这项工作,你可能会惊讶于他们对雇佣你的开放程度。我建议数据科学从业者找到一个尚不存在的职位,或者为自己创造一个职位。这样,你就可以跳过这条线,到达你想去的地方,而不用等待机会。

你对入门级数据科学家的建议是什么?

入门级的数据科学家应该与他人分享他们的工作和旅程。人们对生产内容犹豫不决,因为他们害怕被评判,但通常情况并非如此。人们更有可能变得积极和支持。我还建议先学习编码,因为这对数据科学家来说是一项有价值的技能。然而,我认识到每个人的学习方式不同,所以这不是一个放之四海而皆准的方法。

你未来五年的计划是什么?

我未来五年的计划是继续制作内容。我喜欢创作视频,并把它们放在那里,但我也喜欢创业和为人们创造价值的东西。在我人生的下一个篇章中,我计划从事一个应用数据科学技术的项目——一个比内容创作维护成本更低的项目。

作者摘要

Ken 在数据科学领域的经历是独一无二的,但他取得成功的步骤是可复制的,可以适应您的数据科学职业生涯。我与他的讨论揭示了利用数字内容传达您在数据科学领域的专业知识和存在的重要性,这有时会充满噪音。

Ken 对数据科学从业者的建议是专注于创造价值,并确保您不断学习,以跟上快速变化的领域。因此,无论您的数据科学职业目标是什么,都不要忘记享受这一过程并记录下来!

感谢您阅读这篇报道了我和肯·吉的对话的文章。我相信 Ken 的建议和提示将有助于您的数据科学之旅。

本文的一个版本最初发表在 Nvidia AI 博客

你可以在 YouTubeSpotify 上观看或收听与肯·吉的整个对话。

在以下平台找到更多肯的内容:YouTube|Twitter|LinkedIn|播客

完成步骤 1-4,了解我在媒体和其他平台上制作的最新内容。

  1. 成为推荐媒介会员,支持我的写作
  2. 订阅我的 YouTube 频道
  3. 为我的时事通讯订阅我的 邮件列表
  4. 上订阅我的播客苹果播客|Spotify|Audible

https://richmondalake.medium.com/richmond-alake-podcast-lewis-tunstall-62db44b7b1f0

数据科学职业转换:硕士值得吗?

原文:https://towardsdatascience.com/data-science-career-switch-is-masters-degree-worth-it-d2d23e87b3de

意见

数据科学职业转换:硕士值得吗?

第 1 部分:学习模式(在线与物理)

斯蒂芬·道森在 Unsplash 上拍摄的照片

最近,我的职业转向了数据科学。我将在一系列文章中分享我的想法、经验和思考。本帖是第一部分。

我的背景和经历

我于 2021 年 6 月从新加坡国立大学系统科学学院(NUS ISS)提供的一年全日制企业和商业分析技术硕士课程毕业。在此之前,我在公共交通行业全职工作了三年,一直在考虑将职业生涯转向数据科学/分析。当时,由于我在大学期间所学的一些课程,我对统计学有一定的了解,对编码也有一些了解——我学习的是工业和系统工程。

要了解全部细节,你可以点击查看我的 LinkedIn 页面,我们也可以联系(:

数据科学炒作

数据科学的趋势(作为一个研究领域)|图片来自谷歌趋势

上图是数据科学(作为研究领域)的 Google 搜索趋势。我们可以看到,在过去的十年中,这一主题正在兴起,尽管在过去的两年中明显停滞不前。这无疑是行业需求、工作机会和未来职业前景的代表。

当我在 2019 年考虑转行时,我真的不太明白数据角色的工作会是什么样子。公平地说,这是一个相当新的领域,也是一个仍在发展的课题。然而,当我在任何工作门户网站上搜索数据分析师或数据科学家等术语时,我发现自己滚动了很长时间,仍然没有到达职位空缺的最后一页。简单地说,这个领域有无数的工作机会。虽然我们应该考虑我们的偏好、能力和职业倾向,但就业前景无疑是数据科学领域的一个主要拉动因素。

学习模式:在线还是实体

这一节一般适用于所有高等教育(不仅仅是数据领域)。

过去,几乎所有的课程都是在教室或演讲厅里进行的。渐渐地,大学开始提供录音讲座,主要是为那些会缺课的学生,同时也为学生提供复习他们所学内容的机会。现在有许多完全 100%的在线学位,甚至来自世界各地著名的大学。在新冠肺炎·疫情期间,许多大学也求助于将他们的学习模式完全转变为在线学习。这就引出了一个紧迫而关键的问题,在线学习会有效吗?

在注册我的课程之前,我也有这种恐惧和担心。我担心在线学习会阻碍知识转移。然而。我的经历证明我的担心是错误的。事实上,在线学习可以和物理课堂一样有效,甚至更有效。

讲师素质

提供在线课程录音的学校通常会确保最好的讲师来授课。由于这是一个录音讲座,学校能够确保提供最好的教学质量。视频重拍是可能的,不准确的可以被删除,口音和不清楚的音调可以被最小化,从而产生一个近乎完美的演讲。这与物理课不同,物理课取决于讲师的时间安排和是否有空,也可能容易出现无意的错误。但是,这一优势仅适用于录制的在线课程,不适用于直播课程或通过在线会议平台举办的课程。

内容的新鲜度

开设实时课程(无论是在线还是实体课程)的好处是,讲师可以发表评论,了解最新的问题,并分享任何最新的发展。随着数据科学领域的快速发展,这一点尤为重要。

与讲师互动

在物理课上与讲师互动可能是一个挑战。很自然,学生们会犹豫是否要举手提问,尤其是坐在后排的学生。在讲课过程中问一个问题也会打乱思路。然而,在在线课堂上,学生可以随时在聊天窗口提出问题,他们也可以在不干扰教学流程的情况下虚拟地举手。对于不喜欢发言或有语言障碍的学生来说,用键盘输入他们的问题肯定比口头提问容易。

班级后勤

这是网上课程的一个明显的优势,直到我亲身经历后才意识到这一点。在体育课上,讲师的音量和口音可能是一个挑战。在线课程很好地处理了这个问题,因为我们可以很容易地从我们的设备上调整音量,当讲师的口音对我们来说不熟悉时,字幕可以自动生成。此外,当讲师投影他们的幻灯片时,我们可以在自己的屏幕上清楚地看到它们,而坐在演讲厅后面的人可能很难清楚地看到幻灯片。

时间灵活性

当我在网上上课的时候,最大的好处之一就是不用起得那么早,而且我还能准时去上早课。与体育课不同,上学路上没有浪费时间。如果你住得离学校很远,这尤其好。对于在线录制的课程,学生甚至可以随时随地观看,提供了更好的时间灵活性。

小组讨论

虽然面对面的讨论比在线讨论更好更自然,但当我们需要向其他小组成员展示我们的屏幕时,就不那么好了。由于演讲厅的座位安排,在演讲厅进行小组讨论也很困难。在线设置中不是这样的。通过分组讨论室,学生可以轻松地共享屏幕,不受座位安排的限制,可以立即随机分配小组,尽管他们在讨论中可能更保守。

同学互动

在体育方面,学生们可能会在课后闲逛或者在课间一起吃饭。这对于在线课程是不可能的。我认为这是在线课程最大的缺点之一。与物理课堂相比,建立网络和形成关系的机会要少得多。

实体课程和在线课程的比较|图片由作者提供

总之,我认为,如果学生有一个有利的环境,在线课程即使不比课堂环境更好,也是一样的。实体课程的主要好处是与同学建立友谊和关系网,这是网上课程很可能缺少的一个非常重要的方面。然而,我认为无论学习的模式是什么,选择在数据科学领域追求知识已经是迈向(希望)光明未来的一步。

希望这篇分享对你有所启发,尤其是那些正在考虑决定继续深造的人。

在以后的文章中,我计划继续分享:

  1. 考虑转行的人应该关注哪些语言:Python?r?SQL?
  2. 你是应该参加在线课程/训练营,还是应该攻读学位来改变职业?
  3. 转行的经验和技巧

请关注我,获取上述主题的最新信息!

更新:这是第二部分!

订阅我的邮件列表:

https://nathanthandoko.medium.com/subscribe https://nathanthandoko.medium.com/membership

数据科学职业转换:硕士值得吗?(第二部分)

原文:https://towardsdatascience.com/data-science-career-switch-is-masters-degree-worth-it-part-2-1110c3440e4b

意见

在计划职业转换之前要学习的编程语言和要问的三个问题

亚历克斯·丘马克在 Unsplash 上的照片

这是我上一篇文章的延续,上一篇文章主要关注我的背景、数据科学宣传以及对学习模式的回顾。如果你还没有,就去看看吧。

在这篇文章中,我将讲述:

  1. 要学习的编程语言
  2. 转行从事数据科学之前要问的三个问题

应该学什么编程语言?

当我在 2020-2021 年攻读企业商业分析硕士学位时,教授的主要语言是 R,尽管同样的课程也是使用 Python 进行的。事实上,这两种语言非常适合数据争论,并且有许多用于机器学习的库。对我来说,学习它们并不太难,因为我在本科学习时上过一些编程课(C 和 C++)。Python 和 R 的语法并不难学。

然而,当我在新加坡找工作时,绝大多数数据科学家的职位都要求精通 Python,而不是 R 编程。所以我觉得对于一个学习时间有限,又想快速转行到数据科学的人来说,最好的选择就是学习 Python。不要忽视 R(我认为它对于快速和良好的可视化非常有用,并且有许多很好的统计库),但是业界似乎更倾向于采用 Python。

说了这么多,我觉得最需要学习的语言不是 Python 或者 r,是 SQL。

是的,SQL。可惜我报的课根本没教 SQL。SQL 对于从数据库中获取数据是必不可少的,它是将表转换成正确格式的一种非常好的快速方法。它不花哨,但却必不可少。使用 SQL 可以最有效地完成大量的描述性分析、报告和数据争论。

我应该如何转行到数据科学?

做这件事有许多方法。这也取决于很多因素,比如你想多快改变,你能负担多少钱,甚至你愿意付出多少努力。

在决定读全日制硕士的前一年,我参加了 DataCamp 的在线课程。这是由 20 门课程组成的数据科学家课程,我只完成了一半。我学了一点 SQL 和 Python,但看起来还是很基础的。然而,它帮助我确认了我对数据科学的兴趣,这也是我决定注册硕士学位课程的因素之一。

硕士课程包括数据可视化/讲故事、数据辩论、机器学习、大数据和 NLP 课程,其中有几个动手小组项目。然后,我成功地转换了职业,毕业后找到了一份数据分析师的工作。

但是,这只是一条路径,不一定推荐给所有人。还有许多其他方式,如参加为期 3 个月的密集数据科学训练营(如大会),在非全日制基础上攻读硕士学位,甚至只是从在线课程中自学,然后在你足够自信时申请工作。

如果我必须给考虑转行的人提建议,我会问以下问题:

你的目标是什么?

如果你的目标只是进入数据科学领域,或许是做一名数据分析师,我认为没有必要攻读硕士学位。还有其他更实惠、更有针对性的学习方式。可能也不需要机器学习概念,拥有实用的 SQL 和 Python 技能就足够了。

然而,如果你想获得数据科学家或机器学习工程师的职位,我强烈建议你攻读硕士甚至博士学位。不管怎么说,很多工作也把它列为要求。

你想多快达到目标?

如果你想尽快改变,也许参加训练营是最好的选择。三个月,你可能会实现你的目标。然而,如果你想保持缓慢,参加非全日制学位或在线课程将是理想的。

你愿意牺牲什么?

我们不可能拥有一切,一如既往,有些东西是需要牺牲的。在这种情况下,它类似于从三个选项中选择两个:金钱、时间和技能。

如果你选择金钱和时间,牺牲技能,那么训练营将是一个不错的选择。(这是一个合乎逻辑的相对比较,并不怀疑任何训练营)。

如果你选择金钱和技能,牺牲时间,那么非全日制硕士学位将是一条出路。你不会放弃薪水,你会有一个良好的基础和实践技能,但你会在大约 2 年的时间里忙于工作和学习。

如果你选择时间和技能,牺牲金钱,那么全日制硕士学位将是一条出路。放弃薪水,你可以在获得扎实技能的同时快速毕业。

那么,值得吗?

我选择了时间和技能。我想让我的职业转换更快。然而,我也想从工作中抽出一点时间,做些其他我没有时间做的事情。最大的缺点是财务上的机会成本。放弃一年的薪水,再加上学费,无疑会带来沉重的经济负担。但是,钱不是万能的,对吗?

https://nathanthandoko.medium.com/membership

查看我的其他文章:

</7-data-visualization-best-practices-everyone-must-know-b68ebe329b1e> https://medium.com/illumination/the-bible-in-word-clouds-6a7dc3bb38ab

加入我的电子邮件列表,每当我发布新帖子时都会收到通知!
https://nathanthandoko.medium.com/subscribe

数据科学从审计抽样中获得更多见解

原文:https://towardsdatascience.com/data-science-draws-more-insights-from-sampling-2d9b95a7d6a9

增强审计样本的有用性

作者图片

作为审计人员,我们都面临的一个经常性问题是,通过审计一个通常来自更大人群的事件样本(“控制属性抽样”),得出控制措施有效性的结论。如果这让你想起神秘的采样表,比如控制频率和扩展的采样标准,你并不孤单。幸运的是,我们今天不会谈论这些。相反,我想重点讨论如何将数据科学应用于审计问题,以显著提高审计中控制属性抽样的决策质量、规模和影响。

目录

  • 达成共识(定义)
  • 质量更好的意见(统计推断)
  • 自动化&秤审核员判断(监督机器学习)
  • 诊断&修复审核员判断错误(描述性统计&多名评审员注释)

达成共识

一个简短的题外话:术语。因为我们正在将更多定量学科与审计学科之间的流合并,我们需要对事物的定义保持清晰,因为同一个词在每个领域可能有不同的含义,其他的可能完全陌生。我们将尽最大努力规范这些词的更精确的形式,原因将随着我们的继续而变得清楚。请随意跳过细节,只需根据需要返回这里。

在本讨论中,控制是一种自动、手动或混合机制,旨在预防、检测或监控业务流程中的一些风险事件。相比之下,在数据科学&统计中,控制是一个基线,我们可以用它来比较过程中某些干预的结果。

一个观察是你正在测量(“测试”)的事物的一个单一事件。用审计术语来说,这可能是一项交易或一个事件。令人困惑的是,美国审计师有时也把观察结果称为“样本”,而它们是样本的一部分(见下文)。我们也可以称不符合我们测试标准的交易为“观察”。

一个总体是每个观测值的集合。

样本是从总体中抽取的观察值的一部分(或一个百分比)。这不是(见上文)从一个样本的单一观察。事实上,如果你告诉你的数据科学朋友你提取了 25 个“样本”,他们可能会认为你提取了 25 组 n 观察值。

一个参数是关于整个群体的一个可测量的事实。例如,如果你在一个电子表格中有一个账户的每一个日记账条目,你就可以计算出各个成本中心过账的数量。然而,在许多情况下,我们不能直接测量总体参数,这就是为什么我们从总体中抽取一个样本来计算…

一个的统计。基于证据和推理的关于总体的结论。

不确定性就是不确定地知道。每次我们产生一个统计数据(见上文),我们都在不确定的情况下操作,因为我们不可能 100%确定仅仅基于一个样本的感兴趣的总体参数的真实值。在统计学领域,我们试图通过各种方法来量化这种不确定性,其中一些我们将在以后详细讨论。

一个标签是一个观察的注释。通常用于阐明我们感兴趣的重要类别或类型区别。例如,审计员可能会标记样本中的每个观察结果,以指示它是否通过了基于他们的过程的 _testing(真或假),或者内容审查员可能会将图像样本中的每个图像标记为 has_cat 或 not。

一个多标签问题是每个观察值有不止一个可能的标签可以应用于它。这通常也是我们希望能够预测新观察的每个标签的值。在这里,将每个属性结论看作是它自己的标签(而不仅仅是整个观察的通过/失败的集合)是有帮助的。

另一方面,多类问题是一个标签可以采用多个固定类别值中的任何一个。同样,有能力预测一个新的观察可能有什么价值。与其说是通过/失败,不如想象一个标签(称为一致性)来描述订单与其相关合同的一致性程度。合理的值可能包括完全符合、部分符合或不符合。有趣的是,你可能会发现许多问题最初被框定为多标签、多类别。一般遇到这些首先要做的是 1。恐慌和 2。将它们重组为更简单的问题(通常更符合你感兴趣的实际风险)。

分类是将观察结果归类到一个标签内的几个标签或类别中的一个的过程。例如,该视频可以使用值为 1(真)的标签 is_cat 进行分类。

回归包括预测连续变量的值(例如:序列中下一个对等事务的值)。这个术语的定义过于一般化。在统计学中,回归指的是更具体的东西。在机器学习中,它经常被用来指预测一个数字的实践(相对于预测一个标签的值)。

更高质量的意见

我们将统计应用于控制属性抽样的最直接的好处是能够产生描述控制有效性的统计,同时清楚我们意见的不确定性和误差范围。换句话说,对于给定的控制,我们可以对总体中的最大或估计的可能异常率做出统计上有效的结论。它也有一个很好的特点,如果 5 个审计人员可以在一组假设上达成一致,他们应该能够基于对 5 个不同样本的观察独立地得出关于控制有效性的相同结论。

真实(审计员)对话:这就是“控制似乎没有有效运行”与“控制的估计最大总体错误率在 95%的置信水平下为 16%,这超过了我们 10%的审计容差;因此,这种控制似乎没有有效运作”。希望这很清楚为什么我们希望能够发布后一种观点而不是前一种观点。

为了产生在理想条件下有用的足够窄的估计值,样本量通常符合 AICPA 指南(见下文)。基于不同样本大小估计总体误差 rate⁵上限的快速 simulation⁶显示,需要大约 35 次通过观察才能得出总体误差不超过 10%的结论。我们也看到在 100 次左右的观察后,回报迅速减少。

当然,这在现实世界中是可以改变的,在现实世界中,我们可能会遇到一些异常。如果我们在 35 次观察中发现了 3 个例外,我们的总体误差估计上限将是 23%。如果我们将样本扩大到 85 个观察值,并且没有发现更多的例外,那么我们的估计值将下降到 10%。

鉴于我们能够提供这种程度的透明度和对结论的信任,它可能会回避这样一个问题:如果专业人员在历史上根据我们在没有所有 Statistics⁴的样本中观察到的情况得出了关于控制有效性的结论,为什么还要麻烦呢?在这里,我们可以讨论 80 年代末企业采用自动化的变化,以及 90 年代会计监管环境的相应变化,高级分析技术和工具的民主化,大数据的爆炸,大专科学和工程人才库的稳定增长,或者温赖特在 1908 年对 T 型车提出类似的问题。

相反,我会注意到,如果你在做重要的决定,而你希望这些决定基于证据和推理,你可能应该使用统计学,毕竟统计学是改变你想法的科学。这样做,我们可以增压控制属性抽样,以提高审计意见的质量和精度。

自动化和规模化审计判断

虽然能够做出更好的控制属性结论本身是令人信服的,但事实证明,审计团队在样本测试期间生成的标记数据还有许多其他用途。其中一个更吸引人的中心是在有监督的机器学习应用中使用这些标签;使我们不仅可以根据样本观察值和总体误差的上限得出结论,还可以根据总体中的每个观察值得出结论。实际上,自动化控制属性测试。

根据美国注册会计师协会的审计指南(以及我自己对公共会计专业人士的非正式调查,不管有没有价值),对于超过 250 个观察点的人口,审计样本量通常在 25 到 60+之间。虽然在高端,即使这些样本大小也可能对审计构成后勤挑战——特别是如果一次审计需要几个样本的话——但它们仍然远远不能满足在其他领域产生高性能机器学习模型的需要。尽管如此,在自动化控制测试的影响不成比例的情况下(例如:更高的风险控制)我们可以采用一些策略来产生足够的标记观察值,以开始变得有用。具体来说:

  • 将测试目标从多类、多标签分类问题重新构建为二元分类(或回归)问题。这减少了每个类/标签需要的例子数量。
  • 使用数据分析和试探法来部分自动化测试,减少审计时间,或者更有用的是,腾出更多时间来:
  • 扩大样本量。
  • 应用上采样、下采样和合成数据生成来平衡类别并生成更具普遍性的示例。
  • 使用主动学习来得出对分班模型最有用的观察结果。
  • 样品高效测试和验证的交叉验证。
  • 关注正确的绩效指标。准确性很少对任何实际问题有用,因此了解控制测试的背景以及失败在现实世界中的真正含义对于选择正确的指标进行优化至关重要。

我们可以看到,这实际上是在合成数据集上运行另一个 simulation⁶,该数据集具有包含不平衡二进制类的单个感兴趣标注。换句话说,我们试图在一个虚构的数据集上预测一个通过/失败(真/假)的结论,其中只有 15%的样本观察是例外。使用逻辑回归模型和交叉验证,我们可以看到,当我们将样本量扩大到 200 个观察值时,平均模型精度稳定在 90%左右。

在这里,我将再次警告不要盲目地使用准确性来评估模型的有效性。用一个常见的比喻来说:如果美国运输安全管理局简单地拒绝任何人登机,他们就会 100%准确地防止飞行中的争吵。相反,我们应该让控制的性质和未能识别异常的具体后果来决定我们优化哪些指标。基于问题、模型架构和任务,监督机器学习的适当样本大小也可能有很大不同,因此在这里,您将进行实验,并建立如何处理各种上下文的直觉。

诊断和修复审计人员的判断错误

我们还可以重新利用审计样本进行反思,以更好地了解我们的团队如何得出结论(从而发现错误、改进机会或更有效的方法来得出所述结论),或者可测量地提高基于共识的结论的质量。

为了理解我们的审计团队的决策过程,我们可以将控制测试结论(或单个属性级别的结论)建模为测试时团队可用的所有输入的函数。我们甚至可以选择包括大量的额外输入,这些输入可能是为我们的样本观察记录的,但是在过程的走查中可能不是人类可读的或判断有用的。这让我们可以问这样的问题:

  • 哪些观察特征对预测我们的最终结论最有用?
  • 我们的结论中有多少可变性可以用我们在模型中包含的输入来解释?
  • 哪些观察特征对我们的结论最敏感(即它们的值的变化与预测结论的变化非常一致)?
  • 我们的结论只是一些其他输入的代理吗(可能是一个最初没有被审计团队评估的输入,因为它不透明)?

在其他时候,我们可能希望对我们的结论进行更高级别的审查,这可能是由于控制的风险或敏感性。在这里,我们可以采用一种更正式的策略,称为多评分者注释,以及一套伴随的评估方法,广泛称为评分者之间的可靠性/一致性度量。在英语中:我们有一组 n 审核员(评分员),每个人在盲法研究中使用相同的标准(培训/演练知识、属性&证据)独立审核一个样本。然后,我们使用各种评分者之间的可靠性指标(例如。:Fleiss' kappa)来了解小组结论的稳定性和一致性。这让我们能够识别出在我们的审计团队中更容易产生分歧的观察结果的属性或特征。:模糊的属性,过于主观的标准,误解等。).反过来,我们可以使用这些结果来调整我们的测试程序,以产生更一致、更高质量的审计结论。

概括一下

我们看到,在将数据科学工具与控制属性抽样的问题和机会相匹配时,我们可以(1)极大地提高量化和审计决策的质量,(2)自动化审计判断以在整个群体中进行扩展,(3)更好地理解、调整和解释我们自己的观点。除了控制属性抽样之外,这些方法中的许多在测量固有或剩余风险方面也是有用的,这反过来可以推动审计范围。

脚注

  1. 我们在这里使用审计术语来抽象出更多的技术概念,如置信区间、误差幅度和样本均值。我们将在未来深入研究现代审计抽样时讨论这些问题。
  2. 关于分布、独立性和我最喜欢的拼字单词:异方差的统计假设。
  3. 受制于不确定性和中心极限定理的怪异结果。
  4. 基于我自己从事这个职业的亲身经历的轶事。不过,基于实际研究,这也大致属实。虽然这个话题值得单独写一篇文章,但让我承认我的克星抽样表实际上有非常合理的统计数据作为基础,来吊起你的胃口。
  5. 出于各种原因,我们使用 Clopper-Pearson 方法来估计二项式比例的置信区间的上限。不去探究为什么这是控制属性测试的合理方法,我要指出的是,在实践中,我们通常可以用 Jeffreys Bayesian 区间方法代替,它产生一个近似置信水平,而不是 Clopper-Pearson 下的精确置信水平,并且通常会产生较小的样本量。这种替代的适当性在很大程度上取决于控制的背景和风险,以及单个%点在观察的绝对数量方面意味着什么(以及与单次失败相关的风险)。
  6. 模拟和图表背后的代码可以在这个 Colab 笔记本中找到。

自行车运动的数据科学-如何可视化 GPX 路线的坡度范围

原文:https://towardsdatascience.com/data-science-for-cycling-how-to-visualize-gradient-ranges-of-a-gpx-route-d709af02944d

自行车数据科学

第 5/6 部分——用 Python 和 Plotly 可视化 Strava 路线的坡度范围

照片由 Dmitrii Vaccinium 在 Unsplash 上拍摄

据我所知,距离自行车系列的最后一篇文章已经有一段时间了。好消息是——这个故事今天还在继续。我们将从中断的地方继续,那就是梯度分析和可视化。现在你知道了什么是自行车运动中的坡度,以及如何将坡度计算为两点之间的高差。

今天,我们将可视化梯度范围,这意味着显示在特定梯度范围内,例如,在 3%和 5%之间,所用的时间和距离。在接下来的文章中,我们将在一个交互式 Python 仪表板中包括这种可视化(以及其他)。

不想看书?请观看我的视频:

你可以在 GitHub 上下载源代码。

如何读取 Strava 路径数据集

我们今天不会为 GPX 路线文件而烦恼,因为我们已经有了一个包含数据点、高程、距离和坡度数据的 CSV 文件。首先,我们将导入 Numpy、Pandas 和 Plotly,然后我们将读取数据集:

import numpy as np
import pandas as pd
import plotly.graph_objects as go
import plotly.offline as pyo

route_df = pd.read_csv('../data/route_df_gradient.csv')
route_df.head()

它看起来是这样的:

图片 1-包含距离、高程和坡度数据的 Strava 路径数据集(图片由作者提供)

我们对gradient栏特别感兴趣。为了开始分析,让我们调用它的describe()方法:

route_df['gradient'].describe()

图 2-梯度统计(图片由作者提供)

路线看起来大多平坦(平均值和中间值),最小坡度为-29.2%,最大坡度为 17.5%。这些是我们下一步需要的关键信息—为梯度范围创建区间(箱)。

如何创造与熊猫的时间间隔

我们现在将梯度值分组到箱中。这样,我们可以计算每个梯度范围的统计数据,例如,在 3–5%梯度上捕获的所有数据点。为此,我们将使用熊猫的IntervalIndex类。它允许我们从元组中创建二进制文件。

以下区间指数中使用的值完全是随机的。您可以自由使用不同的文件来容纳您的路由文件。容器也是左闭合的,这意味着左边的值被包括在内,但右边的值不包括在内:

bins = pd.IntervalIndex.from_tuples([
    (-30, -10),
    (-10, -5), 
    (-5, -3), 
    (-3, -1), 
    (-1, 0),
    (0, 1), 
    (1, 3), 
    (3, 5), 
    (5, 7), 
    (7, 10), 
    (10, 12), 
    (12, 15), 
    (15, 20)
], closed='left')
bins

图 3-渐变范围的条块(作者图片)

现在让我们使用 Pandas 的cut()方法将这些条块添加到数据集:

route_df['gradient_range'] = pd.cut(route_df['gradient'], bins=bins) 
route_df.head()

图 4 —添加了渐变范围的数据帧(图片由作者提供)

我们现在在gradient_range列中存储了 13 个不同的组。下一步,我们将从中计算一些对可视化有用的统计数据。

从梯度范围计算统计数据

现在的目标是创建一个新的数据框架,其中包含每个梯度的统计数据,包括:

  • 行驶距离
  • 在此坡度范围内花费的游乐设备百分比
  • 获得的高度
  • 高程丢失

我们将通过迭代每个唯一的梯度范围并对数据集进行子集化来创建它,并从那里计算统计数据:

gradient_details = []

# For each unique gradient range
for gr_range in route_df['gradient_range'].unique():
    # Keep that subset only
    subset = route_df[route_df['gradient_range'] == gr_range]

    # Statistics
    total_distance = subset['distance'].sum()
    pct_of_total_ride = (subset['distance'].sum() / route_df['distance'].sum()) * 100
    elevation_gain = subset[subset['elevation_diff'] > 0]['elevation_diff'].sum()
    elevation_lost = subset[subset['elevation_diff'] < 0]['elevation_diff'].sum()

    # Save results
    gradient_details.append({
        'gradient_range': gr_range,
        'total_distance': np.round(total_distance, 2),
        'pct_of_total_ride': np.round(pct_of_total_ride, 2),
        'elevation_gain': np.round(elevation_gain, 2),
        'elevation_lost': np.round(np.abs(elevation_lost), 2)
    })

完成后,将列表转换为数据帧,并按渐变范围排序。这是一个IntervalIndex,意思是分类工作非常有效:

gradient_details_df = pd.DataFrame(gradient_details).sort_values(by='gradient_range').reset_index(drop=True)
gradient_details_df

图 5-每个渐变范围的统计数据(作者提供的图片)

这里有几个解释:

  • 我已经在[-30%,-10%的坡度范围内走完了 442.96 米,一路上损失了 68.58 米的海拔。
  • 大部分骑行是平的[-1%,1) —路线的 71,56%或 26 公里。
  • 我只在 10%以上的坡度骑过 911 米。

现在让我们将这些数据可视化。

用 Plotly 可视化 Strava 梯度范围

我决定使用 Plotly 来可视化数据,因为默认情况下它会生成交互式图表。您可以继续使用 Matplotlib 或任何其他库。

首先,让我们为每个渐变范围声明一个颜色列表—从蓝色到红色(下降到上升):

colors = [
    '#0d46a0', '#2f3e9e', '#2195f2', '#4fc2f7',
    '#a5d6a7', '#66bb6a', '#fff59d', '#ffee58',
    '#ffca28', '#ffa000', '#ff6f00', '#f4511e', '#bf360c'
]

我们将制作一个条形图,每个条形图将显示一个梯度范围和以公里为单位的行驶距离。每个条形还将显示范围和行驶的距离。如果您使用英制系统,请随意将值转换为英里:

custom_text = [f'''<b>{gr}%</b> - {dst}km''' for gr, dst in zip(
    gradient_details_df['gradient_range'].astype('str'),
    gradient_details_df['total_distance'].apply(lambda x: round(x / 1000, 2))
)]

图 6 —单个栏的文本(作者提供的图片)

最后,我们将创建图形:

fig = go.Figure(
    data=[go.Bar(
        x=gradient_details_df['gradient_range'].astype(str),
        y=gradient_details_df['total_distance'].apply(lambda x: round(x / 1000, 2)),
        marker_color=colors,
        text=custom_text
    )],
    layout=go.Layout(
        bargap=0,
        title='Gradient profile of a route',
        xaxis_title='Gradient range (%)',
        yaxis_title='Distance covered (km)',
        autosize=False,
        width=1440,
        height=800,
        template='simple_white'
    )
)
fig.show()

图 7 —渐变范围的条形图(图片由作者提供)

我们可以看到,大部分乘坐是绿色的,这表明一个平坦的表面。5%及以上的坡度只有 2.3 公里的爬坡。听起来不多,但我的腿和肺当时不同意。

结论

这就是你要做的——如何可视化斯特拉发 GPX 路线文件的渐变范围。我不认为最终目标从一开始就是明确的,因为术语“渐变范围”可以意味着几乎任何东西。我希望你能在阅读后理解我对这个术语的看法,并希望你在分析你的 Strava 训练时会发现它很有用。

在接下来的文章中,我们将在一个交互式 Python 仪表板上组合到目前为止本系列中涉及的所有内容以及更多内容,敬请关注。

以下是整个系列的链接——我会在发布文章时添加网址:

  • 第 1 篇:从 Strava 加载并分析 GPX 文件
  • 第二条:用圆形标记和多边形线可视化来自 Strava 的 GPX 文件
  • 第三条:计算点与点之间的高差和距离,可视化路线的高程剖面图
  • 第四条:根据点与点之间的高差和距离计算路线坡度
  • 文章 5:计算和可视化梯度剖面——在梯度范围内循环的距离
  • 文章 6:创建一个 web 应用程序,分析并可视化用户从 Strava 上传的 GPX 文件

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

https://medium.com/@radecicdario/membership

原载于 2022 年 3 月 2 日https://betterdatascience.com

数据科学经理 vs 数据科学专家

原文:https://towardsdatascience.com/data-science-manager-vs-data-science-expert-2784d3740a75

数据科学

您的公司需要哪种配置文件?两种角色的比较:技能、职责以及他们在团队中的角色。

由 Unsplash 上的 krakenimages 拍摄的照片

关于数据科学经理和数据科学专家谁对组织更有价值,科技界有很多争论。一些人认为管理者更有能力制定和实施战略,而另一些人则认为专家更擅长处理数据。

那么,到底是哪个?在本文中,我们将探讨每个选项的优缺点,以帮助您为您的组织做出决策。

文章组织如下:

  • 经理和专家的角色
  • 你需要经理还是专家?
  • 技能
  • 责任
  • 在团队中工作
  • 你需要经理还是专家?

经理和专家的角色

专家的角色不同于经理的角色,因为专家需要对他们拥有多年经验的领域的算法和技术有非常深刻的理解,而经理只是对这个主题有一个大概的了解。很多时候,一个专家不仅要有很好的技术知识,还要有领域知识。

数据科学经理负责数据科学家团队,并确保项目在预算内按时完成。他们还与客户合作,了解他们的需求,并确保团队满足他们的期望。

数据科学专家负责根据数据分析提供见解和建议。他们还开发和测试模型,以改善决策并帮助企业解决复杂的问题。

作者图片

技能

数据科学经理需要了解许多技术和非技术方面的要求。在技术方面,他们需要很好地理解各种可用的数据科学工具和技术,以及如何有效地使用它们。他们还需要能够理解和解释数据科学实验的结果,并向团队提供反馈。

对数据科学经理的非技术要求包括良好的沟通和人际交往能力,以及项目管理经验。他们需要能够与组织内的不同团队合作,并且能够同时管理多个项目。

作为一名数据科学经理,具备专业技能也很重要。理解它是如何工作的很重要,但是是在高层次上。这可以让你更好地理解你的团队正在做的工作,并提供更有效的指导。此外,技术技能可以帮助您在团队中建立信誉,并提高您解决问题的能力。

数据科学专家通常是在特定领域拥有深厚知识的高技术人员。虽然这种专业知识非常宝贵,但对数据科学经理来说并不总是必要的。在许多情况下,一般管理技能和对数据科学原理的理解就足够了。

作者图片

责任

数据科学经理的职责包括:

  • 领导和协调数据科学家团队
  • 制定数据科学战略
  • 从头到尾监督项目
  • 指导每个团队成员的个人发展。

管理者对数据科学项目有一个整体的方法。他们不仅知道并使用技术和模型,还与利益相关者和业务用户交流。他们非常了解机器学习模型的所有要求,以及商业用户将如何使用它们。通过这种整体方法,他们应该能够发现在各个业务领域利用数据科学的新机会。

作为一名数据科学经理,你将负责发展和管理一个数据科学家团队。除了监督你团队的工作,你还将参与的业务开发和销售。这意味着你需要有很强的沟通和表达能力。你还需要能够与客户和合作伙伴谈判交易。

另一方面,数据科学专家负责执行数据科学项目。他们拥有深入的算法和统计技术知识,能够处理大型数据集。他们还具有很强的沟通技巧,这对于与数据科学团队的其他成员协作至关重要。

作为一名数据科学专家,您将负责开展研究,开发新的数据分析技术和方法。你也将参与这些技术在项目中的实施。除了你的技术专长,你还需要有很强的沟通和表达能力。

在团队中工作

作为数据科学经理,您的主要职责之一是发展和管理数据科学家团队。这包括雇佣有才能的人,为他们提供有效完成工作所需的资源,并设定明确的期望。此外,你需要确保你的团队和谐有效地为共同的目标而工作。

作为数据科学经理,能够检查团队的工作并确保他们在正确的轨道上是很重要的。这意味着能够理解他们正在做的数据和分析。如果你不能做到这一点,那么就很难管理团队并确保他们富有成效。数据科学经理还应该告诉每个成员他或她应该采取的方向,并告诉他们今年或本月的目标是什么。

数据科学专家通常能够提供见解和建议,帮助改进数据科学团队的工作。此外,数据科学专家通常能够建立强大的团队,因为他们对该领域有着深刻的理解。他们知道什么样的技能和知识是成功所必需的,并且能够识别有才华的人。另一方面,数据科学经理可能不具备同等水平的专业知识。虽然他们可能能够识别潜在的团队成员,但他们可能没有能力全面评估他们的技能和知识。

你需要经理还是专家?

这个问题的答案可能取决于项目的规模和范围。

如果您有一个包含许多活动部分的大型项目,那么您可能需要一个数据科学经理来保持一切井然有序。经理也有助于协调具有不同技能的团队成员。

另一方面,如果您的项目更有针对性,并且您对想要实现的目标有一个清晰的想法,那么您可能会更好地与数据科学专家合作。专家可以帮助你微调你的项目并确保成功。

最终,决定与经理还是专家一起工作取决于你的具体需求和目标。如果你不确定,向这两种类型的专业人士咨询可能会有所帮助,以了解什么最适合你的项目。

无论如何,你应该记住如果你首先雇佣一个数据科学经理,那么这个经理基本上会建立一个数据科学团队

摘要

恭喜你!您刚刚了解了数据科学经理和数据科学专家之间的区别!

数据科学经理负责领导数据科学家团队,并确保项目在预算内按时完成。他们还需要具备一般的技术技能,并能够有效地将结果传达给非技术风险承担者。另一方面,数据科学专家负责实际做数据分析和建模的工作。他们需要对统计和机器学习有深刻的理解,并能够有效地向技术和非技术受众传达他们的发现。

那么,哪个角色适合你呢?如果你觉得自己具备管理数据科学家团队所需的领导技能,那么数据科学经理可能是正确的选择。如果你更愿意专注于数据科学的实际工作,那么数据科学专家可能会更合适。

最终,由你来决定哪个角色最适合你的工作!

本文内容的灵感来自于 DataTalks.Club 上 Barbara Sobkowiak 的播客插曲 https://datatalks.club/podcast/s01e03-building-ds-team.html 数据科学经理 vs 数据科学专家

原贴于 DataTalks。 俱乐部。

选择最好的数据科学硕士:你应该寻找什么?(英国)

原文:https://towardsdatascience.com/data-science-masters-uk-what-should-you-look-for-4a7a0f4bb0ae

我对未来数据科学学生的建议

照片由 LinkedIn 销售解决方案在 Unsplash 上拍摄

介绍

在我分享了我自己的硕士经历之后,我被未来的学生问了几次关于在数据科学硕士中应该寻找什么的问题。

这可能要归功于大学现在提供的许多新的数据科学课程。然而,如果你是这个领域的新手,有太多的选择会导致选择的矛盾:当有这么多选择时,很难知道哪一个对你最有意义。

课程内容和结构一直在变化(就像在疫情期间一样)。因此,我将根据自己的经验给出一些一般性的建议,以帮助您寻找数据科学硕士课程。

如果你更喜欢看视频,那么你可以看看我下面的视频。

你可以看我在 YouTube 上关于这个话题的视频,而不是看这篇文章。

模块灵活性

照片由 Alora Griffiths 在 Unsplash 上拍摄

在我看来,模块的灵活性是非常重要的,让你优化你的一年的学习。

例如,您可能希望专攻数据科学的某个领域。你可能还想关注你不擅长的话题。无论你的目标是什么,拥有足够的灵活性会让你的经历更有意义。

就我而言,我的硕士课程相当灵活。我选择了计算机科学模块,因为我的背景已经是数学了。研究一些不同的东西,尤其是我一直感兴趣的领域,感觉就像呼吸新鲜空气一样。

因为我的硕士是在数学学院,大部分必修模块都是数学。我要在这里进行推断:大多数硕士课程的必修模块可能来自该课程所属的学校。

在我的课程中,大多数选修模块是计算机科学的,但也有相当多的商业模块。就我个人而言,我建议选择一门课程,允许你从各种不同的学校选择模块;即使你后来决定数据科学不适合你,那么至少你可以选择专攻一个稍微不同的领域。

良好的统计学基础

卢卡斯·桑托斯在 Unsplash 上拍摄的照片

一个合法的数据科学课程总是试图教授一个良好的统计学基础。

寻找数据科学课程时,确保它涵盖了统计理解的基础知识。它至少应该涵盖统计建模和概率论等主题。如果你已经对基础知识有信心,那么你也可以寻找像贝叶斯统计和时间序列分析这样的主题。

对统计学有很好的理解将有助于探索性的数据分析。此外,如果你觉得机器学习很有趣,统计学可以帮助你理解模型和参数在机器学习算法中是如何工作的。

也可以帮你做数据科学面试;根据我的经验,在面试过程的早期阶段往往会有一些统计问题。

Python 和 SQL

克里斯·里德在 Unsplash 上拍摄的照片

你的数据科学课程应该教会你很多 Python 和 SQL。

在学术界,教授的工具在行业中不常用的可能性总是存在的。不管出于什么原因,这种滞后有时会非常显著。

在我的课程中,我主要学习 R 语言,一些模块强调 Python。r 仍然在业界使用,但是如果 Python 是首选的主要语言就更好了。

这是因为 Python 更容易理解,更具灵活性,并且许多数据科学工作经常需要它。在过去的几年里,Python 在受欢迎程度方面也稳步超越了 R。在我看来,如果我想专攻统计学和探索性数据分析,我只会选择 R,尤其是如果我是一名学术研究人员。

有些人认为我的观点有点争议,因为对于数据科学来说,更喜欢 Python 而不是 R。如果你感兴趣,我有一个视频解释我认为 Python 比 r 好的原因

最后,我提到的另一种语言是 SQL:这是一种常用于数据相关角色的查询语言,对于数据分析师和数据科学家来说是必不可少的。它没有 Python 那么性感,但它在任何地方都被用来检索数据。

如果你能确保你的硕士课程涵盖足够多的 Python 和 SQL,那么你在编程语言方面就会有一个很好的基础。此外,除了数据科学,您还可以使用 Python 做很多其他事情。

Tableau 或 Power BI

由粘土银行在 Unsplash 拍摄的照片

直到今天,我认为 Tableau 和 Power BI 是最常用的报告工具。

这些年来,我使用 Tableau 完成各种任务。当我还是数据分析师时,我用它来做报告。我还用它为我的硕士论文和其他项目快速创建图表。现在我是一名数据科学家,我也使用大量 Power BI 来创建和自动化报告。

根据我找工作的时间,我可以自信地说,在找数据科学工作的时候,学习这两种工具都会非常有用。

我会努力确保你的硕士课程中至少有一些模块使用了这些工具。如果他们都没有,那么我会认为这是一个危险信号。

即使是现在,当我在寻找新的数据分析师或数据科学家职位时,通常会有一行文字说,在 Tableau 或 Power BI 方面的一些经验将是有益的。

论文选择

照片由 Tim Gouw 在 Unsplash 上拍摄

你的论文将是你整个学年中最大的项目。

尽管如此,你很可能要到下半学年才能收到论文题目清单。此外,你可能会从某个特定的学校获得更多的主题,以根据硕士原来的学校进行选择。

我的情况是,我的硕士学位在数学学院下面。这意味着与计算机科学和商业相比,我有更多的数学课题可以选择。

我记得我申请了很多与机器学习和深度学习相关的热门计算机科学课题。最后我总是被拒绝了,因为计算机系的学生优先级更高。

为了避免我的情况,最好问一些目前正在上课的学生。他们也许可以分享一些关于论文过程的信息。如果你幸运的话,他们会给你一份主题清单,这样你就能更好地了解将要发生的事情。否则,你可能很难找到你喜欢在夏天做的事情。

我认为尝试和选择一个你喜欢的主题总是最好的,所以最好尽早准备。在我的数据科学面试中,面试官提到了我的论文项目。当你详细解释你的项目时,你至少要表现出一些热情。

数据科学学会

照片由布鲁克·卡吉尔在 Unsplash 上拍摄

许多提供数据科学硕士学位的大学很可能也有一个你可以加入的数据科学协会。

加入数据科学协会有很多好处,可以增强你的硕士经验,例如:

  • 更多你可以参加的课外项目和挑战;
  • 更轻松地为大型数据科学项目组建团队;
  • 通过每年举办的活动,更容易与业内人士建立联系。

如果我完全诚实的话,当我加入利兹数据科学协会时,我并没有对它抱太大的期望。但多亏了这个协会,我最终参加了一个全国性的挑战,这让我成为 Tableau 的世代数据系列的主角。一路上我也交了一些朋友,现在我和这个社团有了很好的联系,如果我再去的话。

如果我不积极参与,这一切都不可能发生。雇主在看我的简历时注意到了我的参与,并在面试时提到了这一点。仅此一点就给了它作为毕业生求职者的重要价值。

结论

我已经有一段时间没有做走失的硕士生了。我还是很失落(惊喜!),但我觉得如果我回到过去重新选择我的研究,我会更好地了解应该寻找什么。

如果你也想在英国攻读数据科学硕士,希望我的想法能给你一些指导。和往常一样,如果你喜欢这篇文章,你可以看看我在 YouTube 上的其他视频。如果你想通过电子邮件了解我在做什么,你可以考虑注册我的简讯🙂

原载于 2022 年 1 月 24 日 https://leonlok.co.ukhttps://leonlok.co.uk/blog/data-science-masters-uk-what-should-you-look-for/

要避免的数据科学错误:数据泄漏

原文:https://towardsdatascience.com/data-science-mistakes-to-avoid-data-leakage-e447f88aae1c

这个无声的错误可能会毁掉你的机器学习项目

在 Unsplash 上由 Sasikan Ulevik 拍摄的照片

数据科学家一直被评为 21 世纪最性感的工作,难怪许多人都在通过大学学位课程或在线训练营学习 Python、数学和机器学习等技能。这些程序可以很好地学习基础知识,但往往与行业中实现机器学习的最佳实践和现实脱节。这些程序通常缺乏的一个主题是数据泄漏,即当你的机器学习模型知道得太多时。数据泄漏非常容易意外地引入到您的机器学习项目中,并可能产生严重的后果。

在本文中,我们将介绍

  • 什么是数据泄露?
  • 机器学习模型如何学习?
  • 数据泄露的例子以及如何防止数据泄露
  • 防止数据泄露的最佳实践

什么是数据泄露?

想象一下下面的场景。你花了几周时间建立了一个精确度和召回率极高的机器学习模型。您非常兴奋,所以您将您的模型部署到生产中,并让它开始根据实时数据进行预测,结果却发现您的模型做出了所有错误的预测!这最终会导致沮丧的用户和愤怒的老板来敲你的门。你不知道的是,数据泄露可能是你的模型在生产中表现不佳的罪魁祸首。

在机器学习领域,数据泄漏,也称为目标泄漏,可能发生在两种不同的情况下:

  1. 您的训练数据包括有关测试集的信息
  2. 您的模型是根据投入生产时无法获得的信息进行训练的

在我们浏览几个数据泄漏的例子之前,让我们先了解一下机器学习模型如何学习的基础知识。

机器学习模型是如何学习的?

如果你多年来一直在练习机器学习,你可以跳过这一节。但是对于机器学习的新手来说,要训练一个模型,你需要将所有可用的数据分成两组——训练集和测试集。

图 1:将数据分成两组——训练和测试。图片作者。

您将在训练集上训练模型,然后在测试集上验证结果。有许多方法可以将您的数据分成这两组,但是最流行的方法之一叫做随机训练/测试分割。这通常是您在学术界使用的方法,但是我们将通过几个例子来说明这种方法会导致数据泄漏。

让我们看一个随机训练/测试分割的例子。

图 2:带有流派的示例电影数据。图片作者。

这里我们有一些电影名称及其类型的示例数据。如果我们想对这些数据进行随机的训练/测试分割,我们首先要决定在我们的训练和测试集中需要多少数据。有许多方法可以做到这一点,但假设我们选择 60/40 分割,这意味着 60%的数据在我们的训练集中,40%的数据在我们的测试集中。

图 3:电影数据的 60/40 随机训练/测试分割。训练数据是深绿色的,测试数据是浅紫色的。图片作者。

在图 3 中,您会看到我们为训练集随机选择了六个数据点,用深绿色表示,为测试集选择了四个数据点,用紫色表示。

例 1——不要随机分割时间序列数据

现在我们知道了机器学习模型如何学习,以及什么是随机训练/测试分裂,让我们来看看我们的第一个数据泄漏示例。

图 4:2020 年 1 月至 10 月的降雨量(单位:英寸)。图片作者。

这是 2020 年几个月的降雨量。假设我们已经准备好训练一个模型来预测某个月会有多少英寸的降水。您可能会尝试使用我们上面提到的随机训练/测试分割,但是那会导致数据泄漏!我们来看看为什么。

如果我们使用 60/40 的训练/测试分割随机分割我们的数据,它可能看起来像这样。

图 5:降水数据的 60/40 随机训练/测试分割。训练数据是深绿色的,测试数据是浅紫色的。图片作者。

假设我们想预测 7 月份的降雨量是多少英寸。当我们进行预测时,我们已经根据 8 月、9 月和 10 月的降水量训练了模型,因此模型知道未来几个月会发生什么!

我们希望使用滑动窗口,而不是使用随机的训练/测试分割。在时间序列数据中使用滑动窗口有几种不同的方法,但我们在这里只讨论一个例子。

图 6:一个滑动窗口的例子。首先,该模型根据 1 月和 2 月的数据进行训练,并根据 3 月的数据进行测试。然后,根据 1 月、2 月和 3 月的数据对模型进行训练,并根据 4 月的数据进行测试。该循环根据需要重复多次。图片作者。

在图 6 中,我们首先根据一月和二月的数据训练我们的模型,然后使用这些数据预测三月。在下一次迭代中,我们将把三月添加到我们的训练集中,并使用一月、二月和三月来预测四月。我们重复这个循环进行一定次数的迭代,然后最终将每次迭代的误差汇总成一个单一的误差度量。

专业提示:总是使用滑动窗口分割时间序列数据!

例 2 —不要包括未来的数据

让我们通过添加更多的数据来扩展前面的例子,尝试并改进我们的模型。在图 7 中,我们添加了每个月的高温。

图 7:每个月的高温已经加入到我们的降水数据中。图片作者。

这看起来很简单,但是如果我们将它包含在我们的模型中,它就是数据泄漏的来源。如果我们试图在月初进行预测,我们的模型不会有该月的高温,因为该月尚未完成!

为了防止这种情况发生,我们建议您将与数据相关的事件映射到时间线上。

图 8:与我们的降水数据相关的重要事件的时间轴表示。图片作者。

图 8 我们例子中的时间线可能是什么样子。在 1 月 1 日,我们的模型预测了这个月的降水量。在整个月中,我们收集每天的降水和温度数据,直到 1 月 31 日月底。只有当一个月结束时,我们才能计算出一月份的最高温度。

当将相关事件映射到时间线上时,注意模型在哪里做出预测是很重要的。一旦我们找到了那个点,我们只想包含在那个点的之前发生的信息。

例子 3——不要随意分组

现在我们已经看到了一些时间序列数据的例子,让我们来看看图 9 所示的数据分类问题。对于这个例子,我们有学生,文章,和他们每篇文章的分数。假设我们想要建立一个模型,根据学生的文章内容来预测他们的文章分数。

图 9:包含学生、论文和成绩的样本数据集。图片作者。

那些不熟悉数据泄漏的人可以从创建 60/40 的训练/测试分割开始,就像我们在前面的例子中所做的那样。您可以在图 10 中看到,学生 1、2 和 3 分别在训练测试集中。

图 10:我们的学生论文分数数据集的 60/40 随机训练/测试分割。图片作者。

当我们以这种方式分割数据时,我们的模型可能会无意中学习特定学生的写作行为和模式。这可以使我们的模型在我们的测试集上表现得非常好,因为它已经看到了这些学生的写作,但当它看到新学生的写作时,表现就差得多。

我们希望每个学生只在训练集或测试集中,而不是随机分割我们的数据。在图 11 中,您可以看到学生 1 和 2 只在训练集中,学生 3 和 4 只在测试集中。

图 11:按学生编号划分的训练/测试。学生 1 和 2 只出现在训练集中,而学生 3 和 4 只出现在测试集中。图片作者。

Python 库 scikit-learn 通过一个名为 GroupShuffleSplit 的函数使这一点变得简单。在这个函数中,您指定要用作拆分数据的指示器的列(对我们来说是学号),然后它会处理其余的事情。如果您的数据有某种自然分组,我们强烈建议使用此函数。

示例 4 —不要忘记您的数据是快照

在学术界,你经常会得到一个不变的数据集;然而,在工业中,你的数据集是不断变化的。对于下一个例子,假设我们有一个带有点击预测模型的网站,该模型可以预测用户是否会点击广告。这个模型的输出可以用来预测向用户显示哪些广告。

图 12:21 年 5 月 16 日和 21 年 5 月 31 日的数据快照。图片作者。

在图 12 中,我们有一个用户,他在 2021 年 5 月 16 日第一次访问我们的站点。因为这是他们第一次上我们的网站,他们以前没有点击过任何广告。假设我们给他们一个广告,他们点击了它。几周过去了,当我们查询我们的数据集时,我们注意到用户 1 现在已经点击了之前的两个广告以及我们向他们展示的当前广告。

如果我们将以前的广告点击作为一个特征包含在我们的模型中,我们就将用户未来的行为泄露到了我们的训练集中。当我们训练我们的模型时,我们知道用户一将点击两个广告。如果我们把数据放在时间轴上,这可能更有意义。

图 13:与我们的广告点击数据相关的重要事件的时间轴表示。图片作者。

当用户访问我们的网站时,我们向他们展示广告,我们的模型预测用户是否会点击广告。用户可能会点击广告,然后离开网站。然后我们就可以最终计算出他们在网站上点击的广告数量。与示例 2 类似,我们希望记录我们的模型做出预测的位置,然后只包括在该预测之前发生的模型中的信息。

示例 5 —重新训练时不要随意分割数据

到目前为止,我们只讨论了当你训练你的模型时发生的数据泄漏。如果你来自学术界,你可能只训练过一个模型,没有部署过。在行业中,一旦您训练了一个模型并将其部署到生产中,您最终将需要重新训练您的模型,因为您的模型看到的数据与它被训练时看到的数据有很大不同。我们将通过一个例子来说明在重新训练过程中哪里会发生数据泄漏。

对于图 14 所示的例子,假设我们在 6/15/21 使用 60/40 随机训练/测试分割来训练一个模型。我们的模型是在数据点 1、2、4、5、6 和 10 上训练的。在数据点 3、7、8 和 9 进行了测试。

图 14:生产模型的 60/40 随机训练/测试分割。图片作者。

部署到生产环境后,几个月过去了,我们的模型性能逐渐下降,所以是时候重新培训了。在 8/30/21,我们训练了一个新模型(挑战者),打算取代当前的生产模型。在我们的 challenger 模型的训练中,我们使用了 60/40 随机训练/测试分割。这包括生产模型训练的所有 10 个数据点,以及我们在部署生产模型后收集的 5 个数据点(11、12、13、14、15)。

为了比较这些模型,我们想让我们的生产模型和挑战者模型都在挑战者模型的测试集上进行预测。然而,当我们进行预测时,我们会发现生产模型已经在挑战者模型的测试集(1、2 和 10)中的数据点上进行了训练,这给了生产模型不公平的优势。

图 15:比较用于生产模型和挑战者模型的训练和测试集。challenger 模型的测试集中的三个数据点(1、2 和 10)用于训练生产模型。这使得生产模式在比较两种模式时具有不公平的优势。图片作者。

为了进一步说明这一点,让我们来看看我们的产品和 challenger 模型在 challenger 模型的测试集上的预测结果,如图 16 所示。我们知道生产模型已经在数据点 1、2 和 10 上进行了训练,因此您可以在下面看到它正确地预测了它们。然而,挑战者模型以前没有见过这些数据点,所以它错误地预测了它们。数据点 3、8 和 12 没有被任何一个模型看到,因此存在正确和不正确预测的混合。

图 16:挑战者模型测试集上生产和挑战者模型预测的结果。图片作者。

当我们计算我们的准确性时,生产模型的得分为 67%,而挑战者的得分为 33%。看着这些结果,我们可能会保持目前的生产模式,并尝试其他挑战者模式。然而,如果我们仔细观察,我们会发现我们已经将数据泄漏引入到我们的生产模型中,并且它人工地看起来比挑战者模型更好!

为了防止这种情况下的数据泄漏,我们必须保存所有的训练集和测试集。假设我们为生产模型保持相同的随机训练/测试分割。当我们训练我们的 challenger 模型时,我们希望加载我们用于生产模型的训练集和测试集,并将这些集用于我们的 challenger 模型。然后,我们将在训练集和测试集之间平均分配我们的新数据点(11,12,13,14,15)。这将确保生产模型不会意外地知道比它应该知道的更多。

图 17:为了创建 challenger 模型训练/测试分割,我们首先加载生产模型使用的训练和测试集,并在训练和测试集之间平均分配新数据。图片作者。

为了进一步说明这一点,让我们在挑战者模型的测试集上比较我们的生产和挑战者模型预测。在图 128 中,我们有一个平等的竞争环境,因为没有生产模型已经看到的数据点。

图 18:挑战者模型测试集上生产和挑战者模型预测的结果。图片作者。

现在当我们计算每个模型的准确性时,我们发现挑战者模型优于生产模型。

最佳实践#1—立即分割数据

现在,您已经看到了一些可能发生数据泄漏的示例,让我们来看看您应该在每个机器学习项目中遵循的一些最佳实践,以防止数据泄漏。

对于这个例子,我们有几个 YouTube 视频的浏览量。要将视图用作机器学习模型中的一个功能,我们需要将数据标准化,以调整异常值。一种方法是通过最小-最大归一化。这将获取数据集的最小值和最大值,并使用它们在 0 和 1 之间转换值。

图 19:作者的最小-最大归一化公式图像。

一个容易犯的简单错误是在规范化或其他转换后拆分数据。在图 20 中,在标准化我们的数据之后,我们完成了 60/40 随机训练/测试分割。您会注意到,标准化的最小值和最大值(0 和 1)在训练集和测试集中是分开的。为了防止数据泄漏,训练集和测试集的最小值都应该为 0,最大值都应该为 1。

图 20:首先规范化您的数据,然后将其分成训练集和测试集的不正确过程。图片作者。

我们想做的是首先拆分我们的数据,然后归一化。您可以在图 21 中看到,训练集和测试集的最小值都是 0,最大值都是 1。

图 21:首先分割数据,然后将其规范化的正确过程。图片作者。

最佳实践#2 —使用交叉验证

在本文中,我们将数据分为两组:训练和测试。在这里,我们将介绍第三组验证,它有助于防止数据泄漏。

我们首先将数据集分成训练集和测试集。接下来,我们将训练集分成 k 个折叠。对于这个例子,假设 k=3。这将把我们的训练集分成三个不同的部分(折叠)。其中两部分将用于训练,一部分将用于验证。我们通过改变用于训练和验证的部分来重复这个过程。在整个过程中,我们找到模型的最佳参数,然后在原始测试集上对它们进行评估,原始测试集包含模型以前没有见过的数据。

图 22:一个三重交叉验证的例子。图片作者。

虽然这个过程乍一看似乎很复杂,但是 scikit-learn 有一个简单的实现,您可以在一行代码中调用它。我们强烈建议使用交叉验证来防止数据泄漏。

最佳实践# 3——对高绩效持怀疑态度

当您的模型达到 99%的精确度、召回率或任何其他指标时,没有什么比这更好的了。不幸的是,如果这听起来好得令人难以置信,那么它很可能就是真的。您的模型很有可能会有数据泄漏,并且无法对看不见的数据产生相同的结果。

在两种不同的情况下,高模型性能可能是数据泄漏的迹象。第一种情况是,您的训练集和测试集表现良好,但是您的验证集表现得比这两个集都好。如果您在结果中看到这种情况,您可能需要对您的项目设置进行批判性的思考,并对其进行数据泄漏分析。

图 23:一个比训练集和测试集表现更好的验证集的例子。F1 分数是精确度和召回率的调和平均值。图片作者。

第二个场景可能是数据泄漏的一个指标,当您的训练、测试和验证集都表现得非常好。在图 24 中,三个集合的得分都是 99%。您的第一反应可能是庆祝,但是您可能应该在部署到产品之前检查您的项目是否有数据泄漏。

图 24:训练、测试和验证集中的高性能示例。图片作者。

最佳实践#4 —使用 scikit-learn 管道

我们在本文中多次提到 scikit-learn 是有原因的——该库为机器学习项目提供了大量强大的功能!我们推荐使用库中的一个工具,叫做管道。管道在防止数据泄漏方面非常出色,因为它们以一定的顺序应用一组步骤,并一起交叉验证它们。

以下说明管道使用的示例来自 scikit-learn 的文档。他们首先将数据分成训练集和测试集,然后创建一个管道来扩展数据,并应用支持向量分类器进行预测。

**from** **sklearn.svm** **import** SVC
**from** **sklearn.preprocessing** **import** StandardScaler
**from** **sklearn.datasets** **import** make_classification
**from** **sklearn.model_selection** **import** train_test_split
**from** **sklearn.pipeline** **import** PipelineX, y = make_classification(random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                 random_state=0)pipe = Pipeline([('scaler', StandardScaler()), ('svc', SVC())])
pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)

最佳实践#5 —检查与目标相关的功能

我们最后的最佳实践是检查您的任何特征是否与您试图预测的变量(目标)相关。在图 25 中,我们有一些医疗保健数据,我们希望预测某人是否会感染流感。我们可能会决定将“服用抗生素”列作为输入包含到我们的模型中。

图 25:样本医疗保健数据。图片作者。

然而,当我们看到那个变量与我们试图预测的变量高度相关(“得了流感”)时,我们可能应该三思。这可能是数据泄露的迹象。

另一种思考方式是将我们的数据放在时间轴上,就像我们之前学过的那样。你会注意到,一旦我们这样做了,我们意识到你不会服用抗生素,直到你得了流感后的 T4。如果我们在模型中包括“服用抗生素”,我们将会把未来的数据泄露到我们的模型中。

概述

总之,当您的模型知道太多信息时,就会发生数据泄漏,而且很难发现。我们已经介绍了几种识别和防止数据泄漏的不同方法,以及机器学习项目的一些最佳实践。

如果你喜欢这篇文章,我们也在 Skillshare 上教授数据科学课程。您可以查看我们关于数据泄露的课程,并使用我们的推荐链接这里获得 Skillshare 的免费试用。

参考

  1. https://sci kit-learn . org/stable/modules/generated/sk learn . pipeline . pipeline . html
  2. E.阿梅森,构建机器学习驱动的应用(2020),https://www . oreilly . com/library/view/Building-Machine-Learning/9781492045106/
  3. https://www . skillshare . com/classes/Data-Science-errors-to-Avoid-Data-Leakage/1955732280

区块链上的数据科学,第三部分:基于氦的物联网正在接管世界

原文:https://towardsdatascience.com/data-science-on-blockchain-with-r-part-iii-helium-based-iot-is-taking-the-world-d2bfe22deebc

人民网有多大?

氦,人民网。照片来自 Unsplash 上的尼玛 Mot 。

作者托马斯·德·马尔钦和米拉娜·菲拉滕科娃

Thomas 是 Pharmalex 的高级数据科学家。他对区块链技术让世界变得更美好的不可思议的可能性充满热情。你可以在Linkedin或者Twitter上联系他。

Milana 是 Pharmalex 的数据科学家。她对分析工具发现我们周围世界的真相和指导决策的力量充满热情。你可以在Linkedin上联系她。

此处 提供这篇文章的 HTML 版本,并附有高分辨率的图表。用来生成它的代码在我的Github上有。

1.介绍

什么是区块链: 区块链是一个不断增长的记录列表,称为块,它们使用加密技术链接在一起。它用于记录交易、跟踪资产以及在参与方之间建立信任。区块链主要以比特币和加密货币应用而闻名,现已用于几乎所有领域,包括供应链、医疗保健、物流、身份管理……一些区块链是公共的,任何人都可以访问,而一些是私有的。数以百计的区块链都有自己的规范和应用:比特币、以太坊、Tezos……

什么是氦: 氦是一种分散的无线基础设施。这是一个利用分散的全球热点网络的区块链。热点是一种带有天线的调制解调器,用于提供远程连接(它可以达到传统 Wi-Fi 的 200 倍远!)之间的无线“物联网”(IoT)设备。这些设备可以是监测空气质量的环境传感器或用于农业目的的定位传感器,用于跟踪自行车车队…探索生态系统这里。人们通过赚取氦代币来激励安装热点并成为网络的一部分,氦代币可以像任何其他加密货币一样买卖。要了解更多关于氦的知识,请阅读这篇优秀的文章。

什么是 R: R 语言在统计学家和数据挖掘者中被广泛用于开发数据分析软件。

这是关于使用 r 与区块链进行交互的系列文章的第三篇。第一部分重点介绍与区块链相关的一些基本概念,包括如何读取区块链数据。第二部分关注如何跟踪 NFTs 数据事务并使之可视化。如果您还没有阅读这些文章,我强烈建议您阅读一下,以便熟悉我们在第三篇文章中使用的工具和术语:第一部分和第二部分。

氦是一个了不起的项目。与传统的区块链相关项目不同,它不仅仅与金融有关,还具有现实应用。它旨在帮助解决密码世界之外的问题,这太棒了!过去,只有大公司才有可能部署通信基础设施。由于有了区块链,现在个人集体都可以使用它了。

虽然有很多关于氦的覆盖方面以及如何正确放置天线以最大化收益的内容,但关于连接设备对网络的实际使用却很少,这就是我们想要在这里解决的问题。在本文中,我们试图通过回答以下问题来检查氦区块链的当前快照:

  • 氦网有多大?
  • 热点在哪里?
  • 它们是否得到积极利用,即它们是否用于与连接的设备传输数据?

我们将分析从区块链的第一个区块到最近的所有历史数据。我们将生成一些统计数据,并强调可视化。我相信没有什么比一张好的图表更能传达信息了

要获取数据,有几种可能性:

  • 设置 ETL:这是获取数据最灵活的方式,因为您可以选择如何管理数据库。不过,这可能很棘手,就这一点而言,您需要(1)设置一台服务器,(2)硬盘上有大量空间(几 TB 用于加载和运行数据库),以及(3)硬盘速度足够快,能够赶上区块链(数据块不断快速增加)。题目上看这个、这个和这个。
  • 使用 API: Easy,但是您可以下载的行数有限。考虑到区块链的面积,这只能代表几天的时间。见这个。
  • 从 Dewi ETL 项目下载数据:多亏了 Dewi,有了一个专用的 ETL 服务器。还提供了一个界面(元数据库)来导航和操作数据。可以从接口提取数据,但仅限于 10⁶行。或者,该团队以 10k/50k 数据块为增量放置 CSV 提取,这就是我们在这里要使用的!数据可在这里获得。

当你处理大数据集时,它会变得非常慢。这里有两个技巧可以加快速度:

  1. 使用适合处理大型数据集包/函数。为了读取数据,我们在这里使用来自数据表包的 fread 。它比 read.table 快得多,并且会自动处理解压缩文件。对于数据管理操作, data.table 也比 tidyverse 快得多,但是我发现用后者写的代码更容易阅读。这就是为什么我使用整齐的方法,除非它挣扎,在这种情况下,我们切换到数据。
  2. 尽量只保留您需要的数据以节省内存。丢弃任何您不会使用的数据,如具有不重要属性的列,并删除您不再需要的重对象。

2.热点

数据

下面的代码旨在读取关于热点的链数据,并执行一些数据管理。我们使用 H3 包将优步的 H3 指数转换成纬度/经度。H3 是一个地理空间索引系统,使用分层六边形网格。H3 支持 16 种分辨率,每种较高分辨率的像元面积是较低分辨率的七分之一。氦使用分辨率 8。给你一个概念,在这个分辨率下,地球被 691,776,122 个六边形覆盖(见这里)。

这是热点数据集的样子。我们有热点的地址、拥有者的地址(拥有者是一个可以链接几个热点的氦钱包)、在网络上第一次看到热点的日期以及它在地球上的位置。

表 1 显示了热点数据集的一些描述性统计数据。

统计和可视化

我们计算的第一个统计数据旨在描述人们可能有多少热点。因为拥有者很多,所以不可能显示所有的组合。绘制分布直方图也不是一个选项,因为它是超级倾斜的(有一个拥有大约 2000 个热点的所有者!).因此,我们在这里选择将热点的数量分类(表 2)。我们看到大多数所有者(约 80%)只拥有一个热点,但有些人拥有数百个热点。

世界上有 50 多万个热点,这是很多的。这些热点不是一天出现的。在图 1 中,我们使用累积图,根据一段时间内添加到网络中的热点数量来直观显示网络的增长。我们看到了三个阶段:(1)缓慢的线性增长,(2)2021 年中期的指数增长,然后是(3)快速的线性增长。在我看来,指数阶段可以继续下去,但由于有限的热点供应已经饱和,这是因为在科维德疫情之后世界芯片短缺。给你一个想法,在我的 hotspot 订单和交付之间有 6 个月的延迟。

图 1:根据添加到网络中的热点数量,网络基础设施增长的累积图。

因为我们有了氦热点的地理信息,我们可以可视化它们的位置。我们首先创建一个空白的世界地图,在上面覆盖热点数据。在一张地图上标出所有单独的热点会太多(有超过 500,000 个热点)——数据汇总后会更容易解释。这里,我们选择使用网络上的一个函数(这里是函数)将热点聚集成六边形,然后使用 geom_hex ggplot2 函数绘制它们(图 2)。

我们可以看到,大部分热点位于北美、欧洲和亚洲,大多在大城市。在非洲、俄罗斯几乎没有热点,在南美也很少。令人惊讶的是,我们在海洋中间看到一些热点。这可能是数据问题,也可能只是欺骗:可悲的是,人们找到了通过欺骗热点位置来增加奖励的方法。

图 2:世界热点本地化。这里有一个高分辨率的图可用https://tdemarchin.github.io/DataScienceOnBlockchainWithR-PartIII/DataScienceOnBlockchainWithR-PartIII.html

除了形象化,提供一些数字总是有用的。下面我们总结了各大洲热点的比例。为此,我们利用带有自定义函数的 rworldmap 包,该函数来自 here ,它将经度/纬度对映射到它所属的洲/国家的名称。表 3 显示,近一半的热点位于北美,其次是欧洲,占 30%,然后是亚洲,占 16%。请注意未定义的一组,它可能指的是位于海洋中部或大陆边缘的热点。还要注意南极洲的四个热点。

3.网络使用

数据

现在我们已经了解了现有热点在地球上和所有者之间的分布情况,接下来我们将有兴趣了解它们是否被联网设备积极使用以及使用频率。为了回答这个问题,让我们下载所有数据传输的历史。这是一个巨大的数据集(3GB)。

在氦原子上,你只需为你使用的数据付费。在上行链路或下行链路分组中发送的每 24 字节花费 1 个数据信用(DC) = $0.00001。要了解网络的使用情况,我们可以从两个角度来看:(1)检查交换的数据量;(2)检查热点与连接的设备进行数据传输的频率。

这就是事务数据集的样子。对于每个事务,我们都有块号、热点地址、传输的字节数、日期和热点位置。

表 4 显示了一些关于事务数据集的描述性统计数据,以及到目前为止交换的数据量。显然,热点和连接设备之间交换的数据量很小,这大约相当于我的智能手机近年来创建的数据量。这个度量似乎不是氦使用的良好指示。事实上,网络的目的不是传输大量的数据,而是以低廉的价格远距离传输数据。下面,我们将看看第二个指标,它更适合量化氦的使用。

另一个有趣的事实是,第一笔交易发生在 2020 年 5 月 15 日,而第一个热点出现在 2019 年 7 月 31 日。这意味着在第一个热点出现和第一笔交易完成之间有大约 14 个月的延迟。有两个原因:(1)我最初的猜测——这是因为需要足够数量的热点来说服联网设备制造商与网络合作,( 2)数据传输在开始时是免费的,DC 交易直到 2020 年 4 月才被激活(更多信息请点击此处)。

统计和可视化

为了确定热点与连接设备之间数据传输的频率,我们还可以分析事务总数。这是氦气使用的另一个指标。热点和连接设备之间的每次数据传输都对应于区块链上的一个事务和数据集中的一行。

为了总结这一指标的演变,我们计算了每天交易数量的累计总和,然后按洲进行分层。从全球来看,图 3 与上面的图 1 非常相似:先是缓慢的线性增长,然后是指数增长,最后是快速的线性增长。唯一的区别是 2021 年 11 月的小故障,这是由于区块链(这里)的一次大停电。令人惊讶的是,我们发现尽管有大约 15%的热点,但与北美和欧洲相比,亚洲在数据传输方面似乎并不活跃。

图 3:热点和设备之间交易数量的增长,按洲分层。

各大洲交易总数的分布证实了这一点,我们看到亚洲仅占总数的 3%。

我们还可以看看前 10 个最活跃的热点在哪里。注意,我们将使用数据表语法,而不是 dplyr 。如上所述, dplyr 语法因其可读性而更受青睐,在这种情况下, data.table 只需 2 秒,而 dplyr 则要慢得多。我们看到最活跃的热点位于法国、美国和加拿大。

我们还可以计算热点在交易中所占的比例,以及每个热点的交易数的中位数。

每个热点的交易数量中位数(不包括未参与任何交易的热点)为 42,40.48%的热点迄今未参与任何交易。我们不能真的说所有的热点都被利用了…还没有!该网络仍处于初级阶段,有很多闲置容量。

让我们再次想象一下世界地图上的交易数量。我们使用相同的 makeHexData 函数绑定数据,并用数据事务的数量覆盖地图。这一次,我们使用 gganimate 包创建一个纵向动画(图 4)。虽然很难与图 3 进行直接比较,因为这里有一个额外的维度(颜色指的是事务的数量),但是消息是相似的。我们看到,在 2020 年中期之前,交易主要发生在北美,然后是欧洲和亚洲的强劲浪潮。在南美和非洲几乎没有交易发生。

图 4:全球交易数量的演变。此处** 有一个高分辨率的图 **

为了增加一点视觉透视,我们还可以使用令人敬畏的 rayshader 软件包来将情节转为 3D。我们将关注两个国家:(1)美国,因为它是热点和交易数量最多的国家;(2)比利时,我的祖国。由于这一次我们打算生成一个静态图,而不是一个动画,我们将数据重新组合成六边形。请注意,这是可能的动画三维绘图,但它需要大量的计算时间和微调(见这)。

图 5 显示了美国地图。我们看到交易在全国均匀分布,尽管活动的峰值(注意图例是对数的!)位于大城市周围(纽约、洛杉矶、旧金山、迈阿密)。

图 5:美国的交易分布。可以用鼠标操纵视图。交互式高分辨率图可用** 此处 **

图 6 显示了比利时的地图。这里的模式是不同的,因为我们看到交易不是均匀分布在全国各地。大多数交易发生在该国的上半部,这与该国人口稀少的下半部(阿登地区)相一致。

图 6:比利时的交易分布。可以用鼠标操纵视图。此处** 的交互式高分辨率图。**

4.结论

我希望你喜欢阅读这篇文章,并且现在对什么是氦网络及其在过去几年的发展有了更好的理解。在这里,我们展示了一些关于如何从基础设施(热点)和数据使用(交易)方面总结和可视化网络增长的技术。我们分析了时空数据,并使用专用的 R 包绘制了它们。

我们期待着收到您的反馈和想法,关于值得在我们的下一篇帖子中涉及的区块链主题。如果你想继续学习使用 R 的链式数据分析,请在 Medium 、 Linkedin 和/或 Twitter 上关注我,这样你就能得到新文章发布的提示。感谢您的阅读,如果您有任何问题或意见,请随时联系我们。

这篇文章的 HTML 版本带有高分辨率的图表,请点击此处。用来生成它的代码可以在我的 Github 上找到。

我要感谢 Dewi 团队和 Helium Discord 社区(@ediewald、@bigdavekers、@jamiedubs、#data-analysis)的支持和提供的数据。

如果您希望帮助我们继续研究和撰写关于区块链的数据科学,请不要犹豫向我们的以太坊(0 xf 5 fc 137 e 7428519969 a52c 710d 64406038319169)、Tezos(tz 1 ffzlhbu 9 adcobxmd 411 ufbdcvgrw 14 mbd)或 Helium(13 wfinfc 7 nrx HR 8 wznbu 8 cycjdztsntiq 8 zwyw 8 vscntzjjj

敬请期待!

参考

https://datavizpyr . com/how-to-make-world-map-with-gg plot 2-in-r/

https://docs.helium.com/

**【https://www.rayshader.com/ **

https://explorer.helium.com/

除非另有说明,所有数字均来自作者。

接受社区贡献的数据科学项目

原文:https://towardsdatascience.com/data-science-projects-accepting-community-contributions-662e724ba110

通过为开源软件做贡献来培养你的技能和帮助他人。

TLDR:这篇文章概述了如何选择你可能参与的开源项目。其中一个更加丰富多彩和令人兴奋的机会包括参考一个问题,为熊猫-概况涉及一个机会,建议新的包装名称!

介绍

为开源项目做贡献可能看起来是一个神秘的过程。为了揭开谜底,我建议通读一期或多期。这里,例如,是一个非技术性的问题,也显示了社区贡献如何作为协作和讨论来工作。

概观

本文概述了三个接受社区贡献的开源软件项目。在回顾了为开源项目做贡献的好处(对您和其他人的好处)之后,本文还提供了关于如何开始成为开源软件贡献者的有用信息。

在之前的一篇关于类似主题的文章中,我描述了另外四个项目,我写道:

成为数据科学家的最佳方式是成为一名数据科学家。提高数据科学的最好方法是练习、练习、再练习。

为开源数据科学项目做贡献是一些最佳实践。由于上一篇文章,我帮助了一些读者与项目负责人联系。

来自 opensource.guide (Github 托管网站)的一个聪明的建议是:

如果你以前从未为开源做出过贡献,那就听听美国总统约翰·肯尼迪的建议吧,他曾经说过,“不要问你的国家能为你做什么——问问你能为你的国家做什么。”

选择一个适合你的项目

明确地说,本文的建议是不要仅仅为了对开源项目做贡献而对开源项目做贡献。为一个开源项目做出有意义的贡献所需的时间、精力和才能并不是微不足道的。

这里的建议是考虑大力支持开源软件项目,但是要在对你有意义的时候这样做。故意的。在查看下面的具体示例之前,请考虑:

  • 考虑一个您经常使用的项目。选择一个你使用的项目意味着你有兴趣让这个项目更好地为你自己服务。
  • 阅读(并重读)投稿人指南。大多数值得你花时间的项目会出版一个贡献者指南。
  • 请记住,贡献并不总是意味着您必须贡献代码。还有其他的贡献方式。有时,贡献可以简单到测试或复制一个已知的问题。其他非代码机会是更新包文档。
  • 花时间了解项目的历史。了解项目的历史非常重要,这样您就可以避免提交超出范围的更新或更改,或者其他人以前提交过但没有被接受的更新或更改。
  • 熟悉项目的许可。当您投稿时,请确保您理解许可是如何工作的,以及这对您的投稿意味着什么。

SK 学习

SKLearn 或 Scikit-learn 可能是许多数据科学家最有用和最常用的机器学习库之一。这是一个开源项目,许多人已经为使它变得更好做出了贡献。分类、聚类、回归和降维只是 sklearn 工具包中用于机器学习和统计建模的一些有用功能。

SK Learn 的投稿指南网站直接说:“这个项目是社区的努力,欢迎大家投稿。”SK Learn 清晰的管理方针和社区价值观对那些有兴趣贡献的人很有帮助。

SK Learn 为新的贡献者提供了一个特定的资源。SK Learn 给新投稿人的建议是,关注 GitHub 问题跟踪器中标记为“好的第一个问题”、“容易”或“需要帮助”的问题。

这个包的 GitHub 问题跟踪器还包括一个“文档”标签。对于那些可能还没有准备好,或者只是不想贡献代码的人,您可以更新文档。撰写和提出好的文档也是一种有意义的贡献方式。

H2O

根据其 GitHub 网站,H20 是:

H2O 是一个用于分布式、可扩展机器学习的内存平台。H2O 使用熟悉的接口,如 R、Python、Scala、Java、JSON 和 Flow notebook/web 接口,并与 Hadoop 和 Spark 等大数据技术无缝合作。

H20 没有使用流行的 GitHub 问题跟踪器,而是使用了一个开源吉拉板。为了熟悉 H20 开发者和用户社区,请访问 Stack Overflow ( 浏览标记 H2O 的问题)。

为了了解 H2O 社区,我也推荐关注他们的(非常有趣的)Twitter 账户。

Tweet from H2O.ai 。

从更实际的角度来看,初学者应该探索 JIRA 董事会中存在的问题。努力重现或解决现有问题。将您发现的问题添加到现有问题中。你也可以对那些对你和你的工作更重要的问题进行投票。

准备好处理新代码的更高级的用户可以立即开始处理现有的问题,这些问题具有高投票数和足以诊断和补救底层问题的文档。

派拉恩 2

这个库旨在使机器学习研究变得容易。对于有抱负的开源贡献者来说,这个库之所以有趣,是因为它需要一个开发人员来接管。它的 GitHub 网站说:

此项目目前没有任何开发人员。我们将继续审查拉请求,并在适当的时候合并它们,但是不要期望有新的发展,除非有人决定继续努力。

你能成为下一个开发者吗?如果是的话,你将继承一个组织良好的系统,包括一个 GitHub 库,一个用户邮件列表(pylearn-users@googlegroups.com),文档,以及一个开发者邮件列表(pylearn-dev@googlegroups.com)。

该项目的最后一次提交是在 2020 年 8 月(截至本文撰写和出版之时)。有超过 100 个问题几乎有一打被标记为“初学者”

熊猫简介

如上所述,这个包正在寻找一个新的项目名称。

这个软件包可以大大减少你花在探索性数据分析上的时间。实现只需要五行代码(如下所示)。

在这篇文章的早期版本中,我从这个项目的问题跟踪中精选了两个问题。两者都没有关闭,但都显示出进步和工作的迹象。

Pandas Profiling 文档让用户通过栈溢出来询问关于软件包的问题, Github 来报告错误,提出修改,并提交特性请求,而他们的 Slack 用于一般的聊天、问题和合作机会。

为了指导用户做出贡献,Pandas Profiling 将潜在贡献分为五个类别,包括“探索性数据分析”、“稳定性”(包括性能和受限环境兼容性)、“交互和用户体验”、“社区”和“机器学习”。

例如,在“社区”类别下,GitHub 的问题跟踪器中有一个问题,涉及为包建议新名称。提交的问题表明,“熊猫概况”不是最好的名字。如果你对 Python 相关的文字游戏很聪明或有创造力,这就是你的问题了!

约翰·卡梅隆在 Unsplash 上拍照

感谢阅读

如果你喜欢我要说的话,可以在:adamrossnelson.medium.com找到更多。

感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelson| LinkedIn:亚当·罗斯·纳尔逊 |脸书:亚当·罗斯·纳尔逊。

数据科学软技能,重温

原文:https://towardsdatascience.com/data-science-soft-skills-revisited-f82c7d8431b8

如果你足够仔细地观察任何一个严格的范畴,它迟早会开始分崩离析。数据科学家的技能通常分为“硬”和“软”,这也不例外。代码文档:软技能还是硬技能?如何创建一个外观清晰的图表,或者设置一个简化的 Python 环境?

本周,我们总结了最近关于数据科学家通常认为是“软”技能的文章,尽管这些技能在任何成功的职业生涯中都起着核心作用。这些帖子提供了清晰可行的见解,还表明观察、结构和实践在导航人类交互时与学习数学或 Python 一样有用。

  • 知道听谁的 很关键。“办公室政治”是一个许多人不喜欢的想法;不过,这个词通常只是缺乏明确的优先事项和有效领导的代名词。为了帮助你解读一个组织的怪癖, Cassie Kozyrkov 最近分享了一篇发人深省的帖子,讲述了数据从业者应该向高管寻求指导,而不是向自己的经理寻求指导的时候。
  • 如何跨角色翻译技能 。为了保持敏捷并继续成长,高提醒我们技能的模块化和可扩展性。基于她最近从软件工程师角色转变为数据工程师角色的经历,她强调了将成功的原则和实践从一个学科带到下一个学科的重要性。

照片由泰勒·希瑞在 Unsplash 上拍摄

  • 是的,沟通仍然很重要——很多 。 Thomas Reinecke 坚持认为软件开发工作流程(以及大多数数据科学项目)的成败几乎完全归结于沟通。这就是为什么理解跨团队和组织良好沟通的一些最大障碍是如此重要。
  • 庆祝成就的微妙艺术 。让其他人知道你成功的数据项目和计划可能会感到尴尬,如果不是彻底的自我推销的话。虽然不需要。Preeti Semwal 提出了三种方法,在不疏远任何人的情况下告知同事重要的职业里程碑。
  • 知道什么时候该改变路线。把退出能力称为“软技能”感觉不准确;当我们走在错误的道路上时,很难意识到,而采取相应的行动就更难了。最近的两篇帖子很好地提炼了这一思维过程:康纳·奥沙利文反思了他离开工业界进入学术界的决定,而阿尤什·马利克分享了关于将数据科学抛在身后的 想法

如果本周你有心情谈论其他话题,我们有更多的建议:

  • 谁不喜欢好的讲解者呢?这里有一篇来自 Kimberly Fessel 的文章,涵盖了准确度、精确度和分类模型背景下的召回率的基础知识(以及一些)。
  • 任何对强化学习感兴趣的人都不应该错过 Wouter van Heeswijk 博士对信任区域策略优化(TRPO)算法的全面介绍(T2)。
  • 地理空间数据迷们,不要错过海伦·麦肯齐的首张 TDS 帖子!这是一个易于访问的等值线指南,对数据科学家来说是一个非常强大的工具,显示了可以轻松访问给定位置的区域。
  • 在 Python 中操作 DateTime 对象可能很棘手,但幸运的是 KahEm Chu 提供了一个全面的实践指南,其中包括您需要自己练习的所有代码片段。
  • 随着人工智能生成的艺术的迅速出现,出现了许多关于创造力、作者身份和伦理的复杂问题。Javier Ideami 试图在他关于可持续生成人工智能的细致入微的深度探讨中解决这些问题。

谢谢你一如既往的支持。如果你想产生最大的影响,考虑成为中级会员。

直到下一个变量,

TDS 编辑

当数据科学解决了这两个问题时,它就成功了

原文:https://towardsdatascience.com/data-science-succeeds-when-it-solves-these-two-problems-7451e7b1caa2

意见

伟大的数据科学家会考虑这两者

塞巴斯蒂安·斯塔姆在 Unsplash 上的照片

数据科学项目并不像它们第一次出现时那样。

许多数据科学家认为,数据科学就是利用统计数据和模型解决问题。但是这些数据科学家的项目可能永远不会投入生产。

因为如果你是一个从事项目的数据科学家,在创建了一个数据解决方案后停下来,你只完成了一半。当一个项目做了一半就停下来,就像从烤箱里拿出一个只做了一半的蛋糕。它可能在外面看起来很棒,但是你不能用它做任何事情——除了把它放回烤箱。

我的整个职业生涯都在用数据解决问题,并且看到了数据科学能够带来的价值。但是要创造这种价值,你需要改变你对数据科学的看法。

每个成功的数据科学项目都会解决两个问题

交付业务价值的数据科学项目解决了两个相互关联的问题:业务问题和数据问题。

业务问题是企业面临的任何挑战或问题。比如寻找客户,增加利润或者建立品牌知名度。不是每个商业问题都可以用数据来解决。

数据问题是你在 Kaggle 或数据科学课程中遇到的各种问题。数据问题包括以下内容:

  • 根据当前数据预测未来结果;
  • 自动化围绕数据的重复流程;和
  • 识别和解释数据集中的模式和趋势。

解决数据问题是大多数人最初进入数据科学的原因。

考虑数据问题本身在教育环境中是好的,但在商业中会导致浪费。当组织雇佣数据科学家并告诉他们“去做数据科学”时,就会发生这种情况。

成功的数据科学项目始于对业务问题的识别。这个业务问题又引出了一个数据问题。获取相关数据。然后,使用这些数据创建一个数据解决方案,该方案也解决了业务问题。

下图对此进行了说明。

作者图片

解决数据问题业务问题的数据科学项目更有可能投入生产。然而,许多数据科学家仍然只关注数据问题。

这里有两个原因。

团队孤岛造成知识差距

数据孤岛不利于数据科学。它们使得连接不同的数据集变得困难。

当数据科学刚刚起步时,数据孤岛是成功的最大障碍之一。如果没有必要的数据架构,数据科学家能够提供的东西就会受到限制。企业认识到了自己的错误。现在,数据整合被视为构建企业数据能力的必要第一步。

然而,数据孤岛并不是阻碍有效数据科学的唯一孤岛。团队筒仓也一样糟糕。尽管大多数组织认识到团队孤岛的危险,但许多组织尚未解决这些问题。

当一个团队与业务的其他部分脱节时,就会出现团队孤岛。对于一些团队来说,这可能不是问题。但是,当数据专业人员与业务脱节时,就会出现知识缺口。

Danny Samson、Alon Ellis 和 Stuart Black 在《商业模式转型:人工智能&云技术革命 》中描述了这种知识差距的后果,以人工智能(AI)为背景:

“产品负责人可能希望人工智能做一些事情,但他们不知道什么是可能的。主题专家 AI 分析师想做点什么,但是他们不理解客户问题。所以你只有这两个轮子在旋转,它们之间的界面只是纯粹的僵局。”

当数据科学家和业务之间存在知识差距时,数据问题和业务问题不可避免地会脱节。

闪亮的新玩具综合症没有帮助

数据科学仍然被许多组织视为闪亮的新玩具。尤其是涉及到前沿技术的时候,比如深度学习。

作为数据科学教育家,Amanda Aitken 在我的播客 中表示,价值驱动的数据科学 :

“有时候,当简单的线性回归或 GLM 可能一样好的时候,我们会被最新的东西弄得有点晕头转向。”

数据科学家和商业领袖都是如此。

数据科学家想要尝试最新的技术。这是雇主吸引人才的最大法宝之一。但是许多商业领袖也喜欢谈论他们生意中使用的新技术。

这会导致“锤子找钉子”的情况。通过积极地寻找使用特定技术的方法,数据科学家和业务领导者以业务问题为代价,过度关注数据问题。

即使数据问题和业务问题有关联,这种思维模式也会导致不必要的复杂数据解决方案。这可能导致业务问题的次优解决方案。

因此,为了提高数据科学项目的成功率,组织应该专注于解决数据科学家和业务之间存在的任何知识差距,并将任何数据科学项目的重点首先放在解决业务问题上。

弥合领导力和数据科学之间的知识差距

为了弥合数据科学家和业务之间的知识差距,数据科学家需要变得更懂业务。但是商业领袖也需要变得更懂技术。

为了变得更懂业务,数据科学家需要与业务互动。在业务部门中安插数据科学家会有所帮助。但不管怎样,所有的数据科学家都需要定期与他们的最终用户交谈。他们需要理解自己的痛苦。

我见过的一些最有效的数据科学家都是从技术终端用户开始的。他们了解最终用户的需求,因为这些需求曾经是他们自己的。能够设身处地为最终用户着想的数据科学家通常会提供更好的解决方案。

然而,桥梁是双向延伸的。企业领导需要能够与数据专业人员交流,并在技术领域做出明智而有效的战略决策。这需要技术素养。

技术素养的含义因组织而异。然而,它应该包括对数据解决方案的构建块的高层次理解,以及任何相关技术的优点和缺点。正如数据科学家需要与业务互动一样,业务领导也需要定期与数据科学家交流。

企业领导者不需要能够产生数据解决方案,就像数据科学家不需要能够运营企业一样。但是每一方都需要对对方的专业领域有一个基本的了解。

一旦弥合了知识差距,企业领导人和数据科学家就可以共同努力,确定适合使用数据科学解决的业务问题。这可以通过使用数据科学项目发现来完成。

什么是数据科学项目发现?

数据科学项目发现包括识别和理解最重要的业务问题,然后考虑这些问题的数据科学解决方案的可行性。

我在的免费指南中详细概述了这个过程,你可以在这里下载。

概括地说,该流程包括四个步骤:

1.识别关键业务问题

评估您当前的业务状况,并确定您当前面临的主要问题。

例如,企业当前可能面临的三个问题是:

  • 降低基于相关性手动分类文档时的错误率;
  • 处理不利媒体报道后的声誉损害;和
  • 预测企业及其竞争对手股票价格的未来走势。

2.确定数据科学的适用性

以步骤 1 中确定的问题为例,评估它们是否适合使用数据科学来解决。在这一步忽略可行性。

其目的是识别那些(a)对业务重要的问题和(b)适合使用数据解决的问题的交集。如下图所示。

作者图片

3.评估可行性和重要性

用三分制(即高、中、低)对步骤 2 中确定的问题的可行性和重要性进行评级。然后使用这些评级对发现的问题进行排序。

问题的可行性越大,对企业的重要性越大,成功的可能性就越大。所以,它的排名应该更高。

例如,虽然使用数据预测股票价格是可能的,但以高精度这样做是非常具有挑战性的。这通常需要专业的金融知识。所以这个问题可能会被给予较低的可行性评级。

另一方面,如果文档的相关性基于简单的规则集,那么通过自动化来减少分类错误是非常可行的。

4.定义你对成功的愿景

从业务而非技术的角度定义一个成功的解决方案。这包括了解以下项目:

  • 要达到的业务目标;
  • 衡量成功的标准;
  • 解决问题对业务的价值;和
  • 存在的任何风险或业务限制。

数据科学项目发现流程导致创建数据科学项目,这些项目关注对业务最重要的内容。

定义成功的愿景可以减少闪亮的新玩具综合症,因为它为解决方案设定了参数。如果数据科学家与业务领导者一起完成这一过程,团队孤岛也会减少。

数据科学不解决问题,而是由人来解决问题

数据、技术和数据科学本身并不能解决问题。它们使人们能够解决问题。数据科学项目最终是为了解决对业务重要的问题。

如果数据科学家像孤岛一样存在于一个组织中,他们就毫无价值。为了让数据科学取得成功,需要在数据科学家和其他业务部门之间搭建桥梁。数据科学家和商业领袖都对此负责。

随着我们进入数据时代,数据科学大有可为。它只是用来解决正确的问题。

附言:如果你想了解更多关于数据科学项目发现过程的信息,你可以在这里获得我的免费指南→【https://www.genevievehayes.com/discovery-guide/

Genevieve Hayes 博士是数据科学家、教育家和人工智能及分析专家,拥有Genevieve Hayes Consulting。你可以在LinkedIn或者Twitter上关注她。她还是 价值驱动数据科学 的主持人,这是一个每月两次的播客,面向希望最大化其数据和数据团队价值的企业。

数据科学培训—有效运行它们

原文:https://towardsdatascience.com/data-science-training-run-them-effectively-e5e5958f116

在您准备培训其他专业人员并为他们在复杂的数据科学世界中的学习做出贡献时,一些引导和注意事项

活动发起人在 Unsplash 上的照片

数据科学和分析是一个发展非常迅速的新兴领域。这是一个复杂的数据科学世界,有许多复杂的概念要理解,许多令人费解的方法要学习,不断发展的编码语言要掌握。为了保持成长,学习是我们所有人都必须坚持的一项活动,无论我们目前处于哪个职业阶段。培训是保持学习的一个很好的方法。

在某些时候,我们都会参加面对面的培训课程。我们都从一些会议中获得了很多,并在项目中实施了学习,同时我们也在其他会议中疑惑“我在这里做什么”

随着我在数据科学职业生涯中的成长,我参加了许多培训课程,它们帮助我学习和成长。

衡量你自己理解的最好方法是试图向某人解释并帮助他们理解。

坚信以上,我开始用我学到的东西来训练人们。随着时间的推移,随着我在职业生涯中的成熟,我已经在数据科学职业生涯的各个阶段培养了许多专业人士;从年轻的专业人士开始他们的旅程到更有经验的专业人士。

从经验来看,数据科学培训课程可能很难开展;不仅要讨论的概念很复杂,还涉及到编码和对技术的依赖,还依赖于参与者之前的知识,会议需要同时具备实践性和理论性— 需要管理大量的考虑事项!

在下面的文章中,我回顾了我参加过并由(可能更多)主持的一些培训课程,思考“是什么让数据科学培训课程有效”。下面,我将提到一些我在为数据科学培训课程做准备时一直在思考的技巧。请注意,其中很多都适用于任何常规训练。

1.从一开始就调整期望值

当您开始任何培训课程时,尤其是数据科学培训课程;值得为你的参与者设定明确的期望。参与者可能是处于数据科学旅程不同阶段的数据科学爱好者,因此可能对课程有不同的期望。
→值得在开始时花些时间设定议程,提及你将涉及的关键话题/主题以及涉及范围。此外,介绍一下实践课程和理论构建课程,会有助于大家达成共识。

将期望保持一致,消除最后一刻出现意外的可能性。

2.拿相关问题来说

如果你正在使用的问题或例子太理论化或太遥远而无法想象真实的用途,人们可能会提前放弃。在不久的将来,每个人都必须感觉到你将要解释的概念在解决他们可能在项目中遇到的问题时有“真正的应用”。

一个容易被忽略的事情是,不要用一个实际的、相关的、真实世界的问题来解释复杂的数据科学概念及其应用。

3.实践课程

会议主要集中在理论上的日子已经一去不复返了。今天,每个人都渴望得到实现这一点的特定代码。在培训之前,花时间设计你的练习或动手练习来尝试课程中涵盖的模型/概念。如前所述,最好准备好真实数据 (或类似真实数据集的虚拟数据)文件,围绕“相关问题”使用课程中学习到的概念进行解决。

的目的应该是确保每个人都能在课程本身中实施所学,而不仅仅是坐着听

事先准备好你的样本数据集、编码语言框架;以便不需要时间在会议中解决这些问题。

4.但是不要忘记这个理论

虽然动手部分是培训课程中非常重要的组成部分,但同时接触支持这一概念的幕后数学和统计数据也很重要。
请记住,你不仅是在进行编码培训,更是在进行数据科学培训,而且没有“科学”,即数学和统计为模型提供支持,数据科学培训是不完整的。

只有参与者理解了理论才有可能理解他们才会在更长的时间内保留概念(或模型)并随时实施。

5.紧凑的教室带来高效的课堂

我们都爱个性化在每个领域,积极响应它。训练也不例外。成功的培训课程通常是那些培训师能够与学员建立联系的课程。根据我的经验,这通常会让学员从课程中获得更好的体验。在培训期间,培训师需要不断地:

  • 澄清疑问回答众多问题学员可能需要帮助他们理解正在讨论的概念。
  • 根据自己的经验提供例子进行补充。
  • 注意感知理解与实际理解的对比
  • 四处逛逛,与个人建立一个回购协议。

→为了有效地完成所有这些工作,发展与学员的关系至关重要,当每个培训师有大量学员时,这就变得很困难。

→确保学员与培训师的比例处于受控状态。

6.了解你的受众

..谁会发现我的内容是相关的?..谁将从中受益最大?..谁将选择我的会话?

了解你的受众,有助于你相应地设计你的内容。基于这些知识,你可以平衡以下培训师的困境:

  1. 覆盖率与深度?
    根据你的听众选择你是要涵盖主题的所有方面(即寻求覆盖面)还是要深入一些关键方面的细节(即寻求深度)。问题是你希望你的听众从你的课程中得到什么,触及许多话题还是深入一些
    这完全是培训师的选择,必须基于他们的目标听众。
  2. 实践 vs .理论?
    ——
    是更侧重于实践练习还是理论。
  3. 例子的种类?
    不管你的例子是否来自某个特定的行业。
  4. 更注重视觉还是语言?
    ——你的受众是否会更容易接受某种类型的内容。

了解你的受众据此设计你的内容

7.建立在以前的学习基础上

让我们面对现实吧— 数据科学概念可能会让人不知所措。尤其是,当一个人是新手或者没有一点数学、统计学、编码背景时。
一次性给出过多复杂信息可能不利。中小学生如此,大学生也是如此(..对于新的或经验丰富的专业人士也是如此。数据科学的概念可能很复杂,假设一些预先的理解是公平的。绝对值得在调整预期时大声说出。然后重要的是建立在之前的理解上,并且在你转向更高级的复杂概念时将这些点连接起来。准备好把新的概念和已经获得的知识联系起来。

将较新概念的点与已有知识联系起来,确保了很高的记忆可能性

8.让它变得有趣

作为一名培训师,你的工作是让你的内容和内容的传递保持课程的趣味性

我们大多数人的注意力持续时间都很短,一旦事情变得单调乏味,我们就可能失去兴趣——数据科学培训课程也是如此。由于数据科学培训会有复杂的概念,因此很可能成为单调的猎物。因此,作为一名培训师,你需要使用不同类型的有趣的例子,引人注目的场景,混合图表,胸部代表,文本和口头解释来确保复杂的概念更容易理解和记住。

将你的内容分成子内容;喷在实用,图形,视觉方面。时不时地在培训师和学员之间或学员之间加入一些对话。— 让每个人都参与进来!

9.带回家的练习

我参加了各种培训,在这些培训中,我学到了很长时间都无法应用的概念。

随着时间的流逝,知识不断消失

参加培训对我有帮助的一件事是,培训师给了我一些带回家的任务,让我去探索和分享。这确保了我也有充分的理由在自己的时间里浏览我在教室里学到的所有东西;也许一两周以后。
请注意,学习应该已经是重温培训中所学概念的足够好的理由;然而,(至少对我来说)通常是日复一日的事情占据了我的生活,以后再回顾一些事情就成了一个挑战。

这就是带回家的迷你项目非常有用的地方。对主题的概括有助于提高记忆力

此外,当我想在将来的某个时候处理一个正在进行的项目时重温这个主题时,我有自己的迷你项目可以参考。

10.获得反馈

随着时间的推移,任何可以衡量的东西都可以改进!

提高你的培训技能的方法是不断寻求反馈不断进行 delta 改进以确保你的下一次培训包含有效的元素,并改进那些无效的元素。
从你所面对的团队中获得反馈非常重要。

获得反馈的一个好而简单的方法是使用标准在线问卷或打印问卷,你可以就会议的某些方面/主题提出问题,并要求回答者从 1 到 10 给你打分。您可以在反馈问卷中涵盖的方面:会议的进度、解释的清晰性、理解的难易程度、会议的持续时间、动手实践、带回家的练习等。

获得反馈的第一步。采取适当的动作就是下一个的

反馈是一份礼物,它会帮助你进步,不要害怕去索取!

摘要

在数据科学领域,人们无法逃避培训,因为它们是我们保持相关性的必要条件。为复杂概念的培训课程提供便利不是一件容易的事情。
下面是一些“思考的食粮”提示,供初学培训师在考虑培训人们掌握艰巨的数据科学概念时参考:

1.设定期望值,并在一开始就让与你的参与者保持一致。

2.使用相关的、现实生活中的、相关的问题来介绍概念。

3.动手能力会一直存在。

4.但是,不要错过数据科学概念的科学方面。

5.参与者——连接很重要——保持一个 紧凑的课堂

6.了解你的受众——据此设计你的内容。

7.利用参与者的先验知识基础知识

8.尽你所能让课程吸引使用口头、视觉、听觉等方式。

9.给带回家的迷你项目— 增加提留增加提留

10.得到 反馈反馈 和..更有 反馈 。并采取动作

保持联系..

如果你喜欢这篇文章并且对类似的文章感兴趣 关注我中的加入我的邮件列表(..如果你已经不是了..)跳上成为 Medium 家族 成员获取数千篇有帮助的文章。(如果您使用以上链接,我将获得您 50%的会员费)**

..不断学习,不断成长!

数据科学教程:在 R 中训练随机森林

原文:https://towardsdatascience.com/data-science-tutorials-training-a-random-forest-in-r-a883cc1bacd1

了解如何使用 R 语言训练随机森林

【这是我在数据科学教程系列中的第一篇帖子——请继续关注,了解更多关于如何用 R 或 Python 训练不同算法的信息!]

R 随机森林是机器学习中使用最广泛的算法之一。由于它们处理非线性模式的能力和可解释性,它们比其他模型有几个优点。

尽管它们正受到其他基于树的模型(如 boosting 算法)的挑战,但在构建数据科学项目时,它们仍然是值得考虑的有效选项,而且这种范式预计不会在不久的将来发生变化。

而在过去,你有两种选择:等待你的软件提供商(如 SAS 或 IBM)发布新版本,或者自己编写原始算法。幸运的是,随着开源语言及其库的广泛采用,您现在可以顺利地用 Python 或 r 训练随机森林。您可以随意使用多个API或函数,它们可以用一行代码训练其中一个模型。

在这篇文章中,我将做一个关于如何使用两个库( randomForestranger )在 R 中训练随机森林的教程——在这个教程中,我们还将讨论为什么我们应该在这个训练过程中依靠 ranger 库,以及我们这样做的标准。

加载数据

对于我们的随机森林用例,我们将使用伦敦自行车共享数据集-该数据集包含伦敦自行车共享的自行车需求信息-我们有每天和每小时的汇总数据:

伦敦自行车共享数据集的第一行

cnt 包含新自行车份额的计数。预览中显示的其他变量与天气数据相关,包括温度、湿度、风速等。

在我们的用例中,我们希望使用当天的大气数据和元数据来预测骑自行车的次数——例如,如果特定的一天是假日或周末。为了简单起见,我们不会在这个过程中执行任何特性工程。

以下命令使我们能够使用 R 读取 csv 文件:

london_bike <- read.csv(‘./london_merged.csv’)

此外,我们将加载本教程所需的所有库:

library(dplyr)
library(randomForest) 
library(ranger)
library(Metrics)

分为训练和测试

之后,我们将使用一个函数来拆分数据训练和测试样本,留下 20%的数据作为性能评估的维持集:

# Splitting into train and testtrain_test_split <- function(data, percentage) {

 data_with_row_id <- data %>% 
 mutate(id = row_number())

 set.seed(1234)
 training_data <- data_with_row_id %>%
 sample_frac(percentage)
 test_data <- anti_join(
 data_with_row_id,
 training_data,
 by=’id’
 )

 training_data$id <- NULL
 test_data$id <- NULL

 return (list(training_data, test_data))
}# Keeping 80% for the training settraining_data <- train_test_split(london_bike, 0.8)[[1]]
test_data <- train_test_split(london_bike, 0.8)[[2]]

我们剩下 13.931 个时间位置(正如我们在预览中看到的,每行代表特定小时的数据)用于训练。如果您愿意,也可以使用超时保持集。不要随机分割数据,而是使用一个连续的时间段(数据集的最后几天)作为测试集——如果我们将这个问题视为时间序列问题,这将更有意义。

为了测试我们算法的目的(评估量化性能),我们将使用 3483 个时间位置来测试我们的随机森林。请记住,我们将以两种方式评估我们的算法:

  • 使用均方根误差-这将映射出算法的预期误差。
  • 执行时间——对于每个库,我们将对其执行进行计时,并了解库之间的差异。

我们还可以从数据集中提取要素和目标的子集-请记住,在本教程中我们不会进行要素工程,而是按原样使用变量:

training_data <- training_data[,c('t1','t2','hum',
                                  'wind_speed','weather_code',
                                  'is_holiday','is_weekend',
                                  'season', 'cnt')]
test_data <- test_data[,c('t1','t2','hum',
                          'wind_speed','weather_code',
                          'is_holiday','is_weekend',
                          'season', 'cnt')]

如问题公式中所述,我们将希望预测在特定的小时和天将使用多少辆自行车—这意味着我们的目标将是包含相同值的列"CNT"—这是上面子集中的最后一列。

准备好数据后,让我们在 R 中实现两个不同的随机森林— rangerrandomForest。

使用 randomForest 库

首先,我们将使用randomForest库。这是最初的 Leo Breiman 的论文的第一批开源实现之一。

我们需要任何复杂的命令来训练我们的算法吗?不要!我们可以使用(几乎)一行代码训练一个随机森林:

*set.seed(1234)
rf <- randomForest(formula = cnt ~ ., 
                   data = training_data,
                   ntree = 100)*

我正在使用种子* 1234 使这些结果可复制。函数 randomForest 接受一些参数:*

  • 公式,带目标和特征的参数,用于训练过程。" cnt ~ "意味着我们希望使用数据帧中的所有其他列来预测变量 cnt 。如果我们只想使用特定的变量作为特征,我们需要明确地命名它们,例如:“CNT ~ var 1+var 2”。
  • **数据,我们希望在训练过程中使用的数据帧。
  • **Ntree,随机森林中训练的树的数量。

使用上面的代码,我们正在训练大约 100 棵树—让我们记录这次运行的执行时间:

*system.time(
 randomForest(cnt ~ ., data = training_data,
 ntree = 100))*

这个随机森林在我的系统上花了大约 12.87 秒。这是我在比较库和不同实现时喜欢做的分析之一。在小规模上,执行时间的差异可能看起来不明显,但是当训练大规模模型时,人们希望使用最有效的库。

我们只使用了随机森林库中的一些参数。在我们的培训过程中,我们还可以使用其他的超参数。

要在我们的训练过程中使用更多的超参数,只需向函数添加额外的参数,例如添加最小节点大小 10:

*rf_2 <- randomForest(formula = cnt ~ ., 
                     data = training_data,
                     ntree = 100, 
                     nodesize = 10)*

您可以使用查看该函数的完整参数列表?r 中的 randomForest* 。*

最后,我想评估我们的树的测试集性能—让我们使用度量库来完成:

*rmse(test_data$cnt, predict(rf, test_data))*

我们使用我们的 rf — 训练好的随机森林模型 来预测测试集的例子。我们将这些值与 cnt,的真实值进行比较,并获得 RMSE 的值(均方根误差)。

我们的 rf 的 RMSE 不是很大,大约为 882.72——为了客观地看待这个数字,每小时共享自行车的平均值大约为 1123 辆。这也是意料之中的,因为这是一个普通版本的随机森林,几乎没有超参数调整和功能工程。

概括一下,用 randomForest,我们实现了 :

  • 12.87 秒的执行时间;
  • 882.72 的 RMSE。

现在让我们将这些值与 ranger 库进行比较!

使用游侠图书馆

我们可以在 R 中使用的另一个实现是https://cran.r-project.org/web/packages/ranger/ranger.pdf实现。这个库也实现了随机森林,但是以一种更快的方式——当你的维度(行或列)增长时,这将产生巨大的差异。

这里是和以前完全一样的随机森林:

***set.seed(1234)
rf_ranger <- ranger(
  formula = cnt ~ ., 
  data = training_data, 
  num.trees=100)***

论点完全相同,除了 ntree,现在写成 num.trees

测量执行时间:

**system.time(rf_ranger <- ranger(
              formula = cnt ~ ., 
              data = training_data, 
              num.trees=100))**

ranger 实现的执行时间大约为 1.84 秒——比 randomForest 实现快 11 秒。

添加新的超参数也很简单,只需向函数添加新的参数:

**rf_ranger_2 <- ranger(formula = cnt ~ ., 
 data = training_data, 
 num.trees=100,
 min.node.size = 10)**

现在让我们来评估我们的 ranger 实现的性能。这段代码略有不同,因为预测函数的行为与使用 rangerrandomForest 训练的对象不同。

这里,我们需要使用 $predictions预测的返回对象中获取数据:

**rmse(
  test_data$cnt, 
  predict(rf_ranger, test_data)$predictions
  )**

游侠实现的 RMSE 在 883.38 左右。这是意料之中的,因为我们使用了一组相似的超参数和特征,而树的不同之处仅在于使用不同库所涉及的自然随机性。

这两种实现的主要区别在于 rangerrandomForest 实现快得多。

概括一下,有了 ranger,我们实现了 :

  • 1.84 秒的执行时间;
  • 883.38 的 RMSE。

基于这些值,在训练和部署随机森林时, ranger 库应该是您的选择。

感谢你花时间阅读这篇文章!我将在未来分享更多的教程,比较其他算法的不同库——我还在 Udemy 上开设了一门课程,从头开始学习数据科学概念,我希望有你在身边。

以下是一个小要点,您可以通过更改输入数据和要素将其用于您的项目:

本文中使用的数据集受开放政府许可条款和条件约束,可从https://www . ka ggle . com/hmavrodiev/London-bike-sharing-dataset获得

数据科学教程:使用 R 训练 XGBoost

原文:https://towardsdatascience.com/data-science-tutorials-training-an-xgboost-using-r-cf3c00b1425

了解如何使用 R 语言训练最强大的基于树的模型之一(XGBoost)

照片由 J. Kelly Brito @unsplash.com 拍摄

在我的数据科学教程的上一篇文章中,我已经展示了如何使用 R 训练一个随机森林。虽然随机森林是非常强大的模型,但它们受到了 boosting 算法的挑战,成为“基于树的模型的冠军”。

一般来说,boosting 模型试图通过处理它们的错误来改进以前的树 —这种机制试图通过创建改进的学习器来减少偏差,这些学习器将试图用过去错误的子集来概括模式。boosting 算法有几种实现,比如 LightGBM 或 XGBoost。在本文中,我们将关注 XGBoost — 梯度增强算法的具体实现。

XGBoost,或极端梯度增强,可用于回归或分类——在本文中,我们将使用回归示例。

就像我的其他数据科学教程系列一样,我们将使用伦敦自行车共享数据集-该数据集包含伦敦自行车共享计划的共享自行车需求信息-我们有每天和每小时的汇总数据:

伦敦自行车共享数据集的第一行

cnt 包含新自行车份额的计数。预览中显示的其他变量与天气数据相关,包括温度、湿度、风速等。

在我们的用例中,我们希望使用当天的大气数据和元数据来预测骑自行车的次数,例如,特定的一天是假日还是周末。为了简单起见,我们不会在 post 期间执行任何功能工程。

以下命令使我们能够使用 R 读取 csv 文件:

london_bike <- read.csv(‘./london_merged.csv’)

此外,我们将加载本教程所需的所有库:

library(dplyr)
library(xgboost) 
library(Metrics)
library(ggplot2)

分为训练和测试

让我们使用一个简单的函数来拆分数据训练和测试样本,留下 20%的数据作为性能评估的维持集:

# Splitting into train and test
train_test_split <- function(data, percentage) {

 data_with_row_id <- data %>% 
 mutate(id = row_number())

 set.seed(1234)
 training_data <- data_with_row_id %>%
 sample_frac(percentage)
 test_data <- anti_join(
 data_with_row_id,
 training_data,
 by=’id’
 )

 training_data$id <- NULL
 test_data$id <- NULL

 return (list(training_data, test_data))
}# Keeping 80% for the training set
training_data <- train_test_split(london_bike, 0.8)[[1]]
test_data <- train_test_split(london_bike, 0.8)[[2]]

我们剩下 13.931 个时间位置(正如我们在预览中看到的,每行代表特定小时的数据)用于训练。

如果需要,还可以使用超时维持集,而不是随机拆分数据,使用连续时间段(数据集的最后几天)作为测试集。

为了测试我们算法的目的(评估量化性能),我们将使用 3.483 个时间位置。请记住,我们将使用均方根误差来评估我们的算法。

只剩下一步了——隔离特性和目标列。从特性开始——记住我们在本教程中不做特性工程,而是按原样使用变量:

*# Defining the features in X_train and X_testX_train <- training_data[,c('t1','t2','hum',
                                  'wind_speed','weather_code',
                                  'is_holiday','is_weekend',
                                  'season')]
X_test <- test_data[,c('t1','t2','hum',
                          'wind_speed','weather_code',
                          'is_holiday','is_weekend',
                          'season')]*

正如问题陈述中所提到的,我们将希望预测在特定的小时和天将使用多少辆自行车—这意味着我们的目标将是包含相同值的列“ cnt ”:

*# Defining the Target
y_train <- training_data$cnty_test <- test_data$cnt*

设置好一切之后,让我们使用 R 来训练 XGBoost 模型!

培训 XGBoost

我们将使用 R 中的 xgboost 库来训练模型。在本例中,我们将在模型中使用 10 轮(该参数与随机森林模型中的树数有点“类似”):

*set.seed(1234)
xgb <- xgboost(data = as.matrix(X_train),
               label = y_train,
               nround = 10)*

请注意一些有趣的事情——虽然在 R 的大多数库中使用格式为 y ~ x1 + x2 + … + xn,的公式的概念,但是对于 xgboost 库却不是这样。在数据参数中,我们陈述特性(X ),在标签中,我们陈述目标(y)——这是我们创建四个不同对象的主要原因,类似于 Python 的 sklearn 中的一个对象。此外,XGBoost 期望数据标签上有一个矩阵,所以我们需要显式地转换我们的对象——我们可以在数据管道或函数本身中这样做。

使用默认参数, xgboost 函数输出每次迭代的 RMSE (均方根误差)度量(用于回归)的历史:

XGBoost 迭代结果。

请注意,在 10 次迭代之后,我们的 RMSE 仍然在下降——使用更高的 nround 参数可能是个好主意,但是我们马上就要这么做。

让我们也为 XGBoost 模型的执行计时:

*# Timing the execution
system.time(
            xgboost(data = as.matrix(X_train),
            label = y_train,
            nround = 10)
)*

这个模型在 0.41 秒左右运行——比大多数装袋模型(如随机森林)快得多。众所周知,助推模型通常比装袋模型训练起来更快。

我们知道,我们的 RMSE 是大约 845 辆自行车。拒绝合作的人呢?我们可以借助来自 Metrics 包的 rmse 函数,在测试集上评估我们的 XGBoost:

*# Assessing performance on the test set
rmse(
 y_test, 
 predict(xgb, as.matrix(X_test))
)*

这段代码将计算 y_test — 测试集示例 —和 predict(xgb,as.matrix(X_test)) — 之间的 RMSE,我们将基于 XGBoost 模型生成预测。

请注意,我们还将 X_test 数据帧转换为 matrix —如果删除此转换,将会出现错误,因为 XGBoost 实现需要 matrix 数据类型。

我们的测试集的 RMSE 是 891 bikes,类似于训练集。我们可以通过调整 xgboost 的一些参数来改善这一点吗?也许吧!我们来测试一下!

扩展 XGBoost 超参数

目前,我的树只下降了 6 层——这是 xgboost 函数的默认参数。让我们稍微调整一下,并增加更多的迭代。

要向 XGBoost 模型添加一个新的超参数,只需在函数中给出一个新的参数,例如:

*# Adding more hyperparameters to the XGBoost model
xgb_ext <- xgboost(data = as.matrix(X_train),
               label = y_train,
               nround = 50,
               max_depth=20)*

超级简单!我们刚刚给我们的助推模型增加了一个新参数 max_depth 。您可以使用为这个模型调整大量参数。xgboost* 命令在 R 中,你可以看到它们全部,包括它们的描述。调整这些参数是提高性能和稳定性的关键。*

正如我们在第一个xgb boost模型中所看到的,我们在性能方面仍有一些改进的空间——这一点似乎从我们的 xgb_ext 模型的输出中得到的证实:**

XGB_EXT 性能

注意,这最后 8 次迭代的 RMSE 比第一次 xgb_model 低得多。更好的是,让我们在每次迭代中可视化 RMSE:

XGBoost 迭代中的 RMSE

在第 20 执行之后,我们的 RMSE 变平了——这种稳定是增强模型的正常行为,可能意味着您已经找到了这组特定超参数的误差的全局最小值。

如果我们增加了迭代次数,那会如何影响执行时间?让我们看看。

*system.time(xgboost(data = as.matrix(X_train),
                    label = y_train,
                    nround = 50,
                    max_depth=20))*

扩展 XGBoost 的执行时间

这个 xgboost 的执行时间比前一个多一点——大约 8.42 秒。这是正常的,因为我们正在构建更复杂的树(更深的树)和更多的迭代。

好的,我们有一个较低的 RMSE 但是..在训练集中有一个好的结果可能是一种"数据科学安慰剂"-我们在看不见的数据上表现如何?

作为最后一项测试,让我们了解一下我们在维持集上的性能:

*# Assessing Performance of Extended XGBoost
rmse(
 y_test, 
 predict(xgb_ext, as.matrix(X_test))
)*

测试集的 RMSE 是 1008 辆自行车!就像在经济学中一样,在数据科学中没有免费的午餐— 我们能够在训练集中改进我们的算法,但我们最终进入了过度适应的领域,创建了一个高方差模型。

发生这种情况是因为我们创建了更复杂的树 —记住,基于树的模型在搜索纯节点时是贪婪的,我们越是让它们变得复杂,它们就越有可能过度拟合。 (如果你对我刚刚说的话感到极度困惑,可以看看这篇帖子!)

或许,我们现在应该尝试更低的最大深度参数,并保持 50 次迭代,以尝试在训练和测试误差之间取得更好的平衡— 作为一个挑战,亲自尝试一下吧!

感谢你花时间阅读这篇文章!如果你想看的话,我还写了一篇关于如何在 R 中训练装袋模型(随机森林)的教程:

*

我还在 Udemy 上开设了一门课程,从零开始学习数据科学的概念,我希望你能在我身边!

以下是一个小要点,您可以通过更改输入数据和要素将其用于您的项目:

本文中使用的数据集受开放政府许可条款和条件的约束,可从 https://www . ka ggle . com/hmavrodiev/London-bike-sharing-dataset获得*

数据科学工作流程:它不像你想象的那样是线性的

原文:https://towardsdatascience.com/data-science-workflow-its-not-as-linear-as-you-might-think-5bb163dc5b67

伯明翰博物馆信托基金会在 Unsplash 上拍摄的照片

数据科学工作流程:它不像你想象的那样是线性的

数据科学项目中迭代过程的综合

对于数据科学领域的新手、正在参加在线课程或参加训练营的人来说,以下场景可能听起来很熟悉。

首先,你学习一种算法及其背后的理论和数学。然后给你一个带回家的案例研究来练习,比如写一个算法来对最有可能流失的客户进行分类。为了解决这个问题,您还需要一个数据集(通常是干净的)来应用算法。

回到您的计算机上,您遵循一个标准的数据争论和建模模板,该模板大致如下:数据清理、探索性数据分析、特征工程、数据预处理、模型构建和模型评估。从开始到结束是一个非常线性的过程。

这个线性过程有什么问题吗?实际上没什么错,这就是人们学习算法和发展解决问题技能的方式。唯一的问题是——现实世界中并不是这样。

的确,没有一种标准的数据科学方法,每个组织都采用不同的工作流程。但是,工作流不像我们在学习时习惯的线性问题解决任务,这也是事实。

让我们看看这个过程或多或少是如何工作的,以及它的哪一部分是迭代的。

发现问题

作为组织中的数据科学家,你不会因为有锤子就去搜一个钉子。大多数数据科学项目都有几个标准起点。

大多数项目都是从一个业务问题开始的——要么是已知的,要么是你必须弄清楚。一些团队手头会有定义明确的问题,比如——如何细分客户以使电子邮件营销更具成本效益?如何用机器学习(ML)改进信贷审批流程?或者如何识别客户交易中的欺诈行为?

一旦你发现了问题,你就开始考虑解决方案。

有时,企业在生产中已经有了数据科学/ML 解决方案(例如生产中的欺诈检测算法)。在这些情况下,您的责任是维护系统并监控可能的偏差,或者引入新的解决方案来改进现有的解决方案(例如,更高的准确率)。

第二个可能的起点是给定的数据集。组织通常会产生大量从未被使用过的信息。因此,作为组织中的一名数据科学家,您可以进行数据挖掘,找出您可以发现的可行见解。这些听起来像是入门级的分析问题,但企业通常会从这种见解中受益匪浅。

数据科学工作流程(来源:作者)

正在解决这个问题

既然你有问题要解决,自然,下一步就是找出如何去解决它。

你总是可以把问题分解成更小的部分。例如,如果你试图预测下一年的收入,你不会立即安装脸书预言家并开始预测。

相反,你搜索相关信息来了解销售的历史模式;目前的销售趋势如何;市场需求趋势如何;其他竞争对手在做什么;等等。

你从不同的来源收集尽可能多的背景信息,从不同的角度理解问题——先缩小再放大。一个好的数据科学家会在进入 Jupyter 笔记本之前分配很大一部分时间做后台工作。

通过方法论思考

一旦你对背景研究做了尽职调查,你就还没有考虑模型、工具、可视化技术。

你正在思考一个方法过程,它将引导你回答这个问题。您需要列出所需的数据集,确定在哪里可以找到它们,以及如何获取数据。把别人电脑上的数据拿到你的电脑上比你想象的要难!

在头脑中有一个整体的过程或者写在纸上很有帮助。这有点类似于在学术环境中,你在实际执行研究之前写下你的研究提案;事情可能会发生变化,但你从一开始就有一个大的蓝图。

需要什么工具?

在这一步,你要思考哪些工具可以帮助回答这个问题。如果是预测问题,时间序列预测模型应该起作用吗?还是反而是线性回归问题?需要 GIS 技术吗?有没有好的 R 或 Python 包可以依赖?

一旦您探索了所有可用的选项并决定了一组特定的工具,您现在就可以开始搜寻数据了。您需要的数据可以是一个数百万行的数据集,也可以是一百个数据点,这取决于您的问题和您选择的模型。

你找到所选模型所需的数据了吗?如果是的话,你就可以开始构建你的模型了。但是如果你没有所有需要的输入,你应该在这里停下来,回到步骤 2 中的方法过程。也许还有其他不需要时间序列数据的工具/方法?不需要大型数据集的系统动态模型怎么样?

照片由猎人哈利在 Unsplash 拍摄

建模

如果你以前没听过,准备好震惊吧。建模是数据科学工作流程中最简单的部分。众所周知,在一个项目中,80%(或多或少)的时间花在了数据清理、特性工程等方面。

大多数模型构建和模型测试过程都是相当标准化的。例如,如果您正在实现一个分类问题:

  • 首先,定义自变量和因变量,然后将数据分成训练集、验证集和测试集
  • 然后运行一个基线模型(如逻辑回归),将其他模型的性能与基线进行比较
  • 接下来,运行其他几个模型——SVM、决策树、随机森林、Bagging、AdaBoost、XGBoost,数量不限——所有模型都有默认的超参数。
  • 选择一个或两个性能最好的模型进行超参数调整(您能猜出为什么没有使用所有模型进行超参数调整吗?稍后我会回答)。
  • 最后,您使用不同的超参数组合运行模型的几个版本,这些超参数组合是手动选择的或者通过 GridSearch 过程选择的。

上面的过程,经过一些迭代,给了你你正在寻找的性能最好的模型。现在,您可以将您的模型移交给工程团队进行生产了。

制作和后期制作

您可能会使用 Jupyter notebook 或类似的环境进行模型实验,但这不会投入生产。大中型组织将有独立的工程团队,他们负责将您的代码转换成更有效的产品质量代码,并将其投入生产。

这里我应该注意的重要一点。根据您的实验,性能最好的模型可能无法投入生产。最终的选择取决于几个因素,比如模型的可解释性、复杂性和维护代码库的难度。

数据科学项目不是线性的

现在谈谈我要说的第二点。

从上面的描述来看,数据科学项目似乎是以线性方式进行的——从问题识别和数据准备到模型构建并将其投入生产。但事实上,这与现实相去甚远。

数据科学是一个迭代的过程。你必须在项目的各个部分之间来回切换。例如,您的模型性能显示出有希望的结果,但您意识到不同的特征工程技术可能提供更好的精度。

你还需要得到利益相关者的认同,包括你的同事。他们会有你不能忽视的重要建议和推荐。这个咨询过程贯穿整个项目,甚至在你认为已经完成的时候。

一旦模型投入生产,这并不是过程的结束。你继续监控模型性能。您需要注意几件事情——模型对样本外数据的表现是否也一样?否则,您可能需要使用新的和额外的数据重新训练模型,或者更改超参数。

你要注意的另一件事是模型漂移。模型漂移是指模型性能的任何偏差(逐渐或突然)或意外行为。这可能是由于基础数据的变化(例如客户群的变化)或模型假设(想想在 COVID 之前建立的预测模型,以及在 COVID 期间它有多有用)而导致的。

最后的想法

对于数据科学项目,没有一刀切的做法。每个组织,无论大小,都有其构建和部署模型的标准操作程序。

但有一件事是真的——它从来都不是一个单向的线性过程。数据科学是一个迭代过程,永无止境。即使一个模型今天运行良好,你也不知道几个星期后你是否必须让它退役。

在我结束之前,我将回答我之前提出的问题—为什么选择超参数调优的模型子集?答案是,模特培训可能是资源密集型和高成本的。训练一个模型可能需要很长时间和很大的硬件能力。如果这些是组织的约束因素,最好选择较少的建模选项进行实验,特别是如果您非常确信剩余的选项都不好的话。

感谢您的阅读。请随意订阅以获得我即将发表的文章的通知,或者通过或 LinkedIn 与我联系。

数据科学:用静态类型编写健壮的 Python

原文:https://towardsdatascience.com/data-science-write-robust-python-with-static-typing-c71b9c9c8044

针对 Python 3.10 进行了更新

翁贝托在 Unsplash 上的照片

编程语言有两种:静态类型动态类型语言。

Python 是一种动态类型语言。您不必显式指定变量的数据类型。函数也是如此:您不必指定参数的类型或函数的返回类型。

换句话说,没有代码编译—Python 解释器在运行时执行类型检查— 在代码执行期间。

另一方面,在静态类型语言中(比如 Java ),必须声明每个变量的数据类型。因此,类型检查在编译时完成。这就是为什么静态类型语言通常更快,但更冗长。

有了 PEP 3107PEP 484 ,我们就可以使用 Python 中的 类型注释 来注释数据类型。然而,Python 仍将是一种动态语言。类型提示的作用是帮助您编写干净和健壮的代码。

有两种主要类型的注释:

  • 变量注释
  • 功能注释

但是首先,让我们演示一个案例,说明为什么类型注释是有益的。

迷你示例

假设我们有一个简单的熊猫数据框架和电影评论。我们希望执行一些基本的预处理,然后将结果存储在一个新的变量中:

reviews_cleaned变量现在是一个系列而不是一个数据帧。因为reviews 数据帧只有一列,所以很容易忽略这一点。

让我们看看是否可以使用类型注释来提高 Python 代码的可读性。

可变注释

我们在声明变量时使用它们。在变量后,添加一个分号,后跟一个空格( PEP standard)和变量的类型:例如:

我们还可以注释非原语变量,比如 列表元组、字典 :

当然,我们可以标注数据科学相关的模块如 熊猫NumPy😗*

注:如果导入别名不是pdnp熊猫numpy ,则相应更改注释。

函数注释

我们还可以注释函数/方法参数及其返回类型。让我们看一个例子:

函数sum_2_numbers计算两个数的和。然而,因为+操作符是重载的,所以它的行为有所不同:对于整数/浮点数,该函数计算它们的总和。对于字符串,函数sum_2_numbers输出它们的连接。

我们可以通过为参数和返回值添加类型注释来使函数sum_2_numbers更加清晰。我们使用以下格式(粗体显示我们添加的注释):

*function_name (argument_name***: argument_type***)* **-> return_type:**

使用注释,函数sum_2_numbers就变成了:

该函数接受两个整数作为输入,并输出一个整数。

注意:用户仍然可以传递 float 和 string 数据类型——注释只是提示而不是要求。

但是,我们可以使用一个工具来强制进行类型检查。

输入 Mypy:在运行时强制类型检查

2012 年,当时的博士生 Jukka Lehtosalo 开始了一个被称为 Mypy 的兼职项目。

Mypy 最初被设想为 Python 的一个变种,具有无缝的动态和静态类型。最初,它是作为一门独立的语言开始的。然后,它被重写为一个外部库,与 Python 兼容。

首先,安装库:

*$ pip install mypy*

然后,我们编写以下脚本来演示 Mypy 如何工作:

最后,使用 Mypy 运行脚本。您应该会看到以下输出:

让我们故意创建一个错误来检查 Mypy 的行为。将变量age 的类型从 int 改为 str 并运行脚本。您应该看到以下内容:

Mypy 已经成功检测到age应该是类型 str。感受自由进行你的实验,检查 Mypy 如何工作。

高级注释

到目前为止,我们已经了解了 Python 中类型注释的基本工作原理。Python Typing模块包含许多不常用的注释类型。让我们来看看其中的几个:

可调用

在 Python 中, Callables 既可以是函数也可以是类(如果它们实现了__call__方法)。

在这里,我们将重点讨论函数。当一个函数是另一个函数的参数时,我们使用来自Typing模块的可调用提示。让我们看一个例子:

我们得到以下输出:

联盟

当一个变量可以有多种类型时,我们使用联合。

在前面的例子中,square函数被注释为只接受整数。实际上,我们也可以计算浮点数的平方。我们可以使用 Union 注释来添加这个功能:

输出与之前相同。square函数现在可以接受整数或浮点数。

在 Python 3.10 ( PEP 604 )中,我们可以用管道运算符代替 Union。我们可以将square函数重写如下:

没有人

没有返回值的函数怎么办?在静态类型语言中,我们通常使用特定的关键字。比如在 Java 中,我们使用 void 关键字。

在 Python 中,我们可以使用常规的 None 关键字:

任何的

另一方面,我们可能希望让变量不受约束——与每种类型兼容。我们可以使用 Any 注释来实现这一点:

大多数开发人员避免使用 Any 注释,因为它没有贡献任何价值——我们还不如完全跳过注释。

我们以后会看到更好的选择。

顺序

在某些情况下,我们的函数可能期望某种类型的序列,并不真正关心输入是一个列表还是一个元组。一般来说, 序列 是实现__getitem__()方法的任何东西。

让我们看一个如何使用来自Typing模块的序列* 注释的例子:*

我们得到以下输出:

我们也可以使用 Mypy 来验证类型检查:

TypeVar —泛型简介

在前面的脚本中,我们的序列可以处理任何类型的变量,因为我们使用了 Any 注释。然而,这使得我们的代码有点模糊。

在许多情况下,我们希望对函数可以接受的变量类型加以限制。

假设我们希望 script2.py 到中的iteration函数只接受带有 strint 值的序列。我们可以使用TypeVar 变量——一个类型变量,让我们声明一个泛型类型:

我们声明了一个名为numeric_var的新类型变量,它接受字符串整数。因此,iteration函数现在接受包含整数字符串序列,但不是两者都包含。

我们还使用了 Mypyreveal_type功能。这个函数告诉我们 Mypy 如何解释我们的类型提示。

让我们使用 Mypy 运行脚本。我们得到以下输出:

Mypy 发现了 2 个错误,这是我们预料到的。问题出在l2t2变量上。具体来说,l2列表包含浮点,而t2元组包含整数和字符串。

要解决这个问题,注释掉t2l2变量并再次运行:

现在,类型检查没有发现任何错误。 Mypy 找到了两个变量,一个包含整数列表和一个包含字符串的元组。**

Python 3.9 中的变化

从 Python 3.9 开始(特别是 PEP 585 ),一些类如tuplelist现在是泛型类型。因此,使用类型类本身代替Typing模块现在是首选。例如:

Python 3.8 之前使用Typing模块的注释语法(也适用于 Python 3.9 以上版本):

在 Python 3.9+中,我们还可以编写:

如果我们进行导入,有一个在 Python 3.8 中运行上述代码的变通方法:

就我个人而言,我仍然对Typing模块使用注释语法,因为许多项目仍然这样做。兼容性第一。

回到我们的例子

现在,我们准备向初始的annotation_demo脚本添加注释。然后,脚本变成:

本质上,我改变了两件事:

  1. preprocessing函数进行了修改,以接受带注释的参数并返回带注释的值。
  2. reviewsreviews_cleaned变量分别被正确标注为熊猫数据帧熊猫系列

结束语

Python 中的类型提示提供了一种编写清晰易读的代码的好方法。记住 Python 的禅 — 可读性很重要!

通过注释,Python 采用了静态类型风格,类似于其他流行的语言。

此外,Python 还有许多我们在本文中没有涉及的其他注释类型。

我个人并不是全部都用。然而,我总是使用函数/方法注释:其他开发人员应该能够立即理解您的函数/方法签名,而无需额外的努力!

感谢您的阅读!

  • 订阅我的简讯!
  • 在 Linkedin 上关注我!

数据科学家 vs 数据分析师 vs 数据工程师

原文:https://towardsdatascience.com/data-scientist-vs-data-analyst-vs-data-engineer-1e2514a36d41

在数据领域找到你真正的激情

奥布里·奥多姆在 Unsplash 上的照片

数据是新的石油。

数据科学家,21 世纪最性感的工作。

没有数据分析,公司就像瞎子和聋子。

……

数据科学已经成为近年来最热门的职业之一。市场的高需求、丰厚的报酬、丰厚的支票和性感的职位头衔都让新毕业生或正在寻找职业改变的人热衷于进入这一领域。然而,数据团队中的职称和工作分配可能会令人困惑。“我喜欢摆弄数据”、“我是一个数据驱动的人”都不足以在数据领域找到最适合你的职业。最糟糕的情况可能是浪费大量时间去申请你根本不适合的工作,或者得到一份你认为自己感兴趣但实际上并不感兴趣的工作,最终失去激情。

我花了一些时间才真正理解数据团队中每个角色之间的区别。当我第一次申请这个领域的工作时,我犯了两个错误。

第一个是,我申请了所有标题中有“数据”的工作,仅仅是因为我不知道其中的区别,并认为“我会先进入这个领域,一切都会自行解决”。数据工程师、数据架构师、业务分析师、数据分析师、数据科学家、商业智能分析师、数据大师、数据大师,应有尽有。只要这个角色与数据有关,它就在我的申请列表中。这非常耗时,效率极低,而且毫无目标。

第二个错误是不知道我真正想对数据做什么。最初,我认为我会成为一名数据科学家,因为我喜欢数据,这是最性感的头衔。在开始从事实际项目后,我意识到我真正喜欢的是分析数据,找出洞察力,并为商业决策做出贡献,这更像是一名数据分析师。

这个故事旨在帮助你理解数据团队中这三个角色的作用,因此希望能帮助你找到真正让你兴奋的事情。

为了说明团队中每个角色的作用,我们首先需要了解数据从生成到呈现在业务决策者面前的过程。让我们以一个电子商务网站为例,从 30000 英尺的高度浏览数据。

数据之旅

当你登录网站浏览商品时,你的所有行为都会被跟踪和监控。你浏览了什么产品,你如何将鼠标悬停在页面上,你在网站上停留了多长时间,你的用户旅程是什么,你购买了什么,你花了多少钱,等等。这些信息(数据)被记录下来并发送到一个地方,通常是云。它可以由 AWS、Azure、GCP 等提供商或本地服务器托管。

作者图片

在这个阶段,数据通常以非常原始的形式存储,甚至可能没有结构化。为了使这些数据可供查询,我们需要将它们移动到数据库中。根据您的需求,有许多种具有不同特征、用途和功能的数据库可供选择。数据清理和转换也将发生在这个阶段。例如,将数据结构转换成表格格式、将 JSON 中的数据扁平化、基于业务逻辑的聚合、数据验证等。

这个过程就是我们所说的 ETL,提取(从云中),转换(数据),加载(到数据库中)。(现代基础设施支持 ELT,即将数据加载到数据库后进行转换。我们将在另一个故事中讨论这个问题。)

这个阶段的目的是为数据消费者提供一组干净的、经过验证的和可用的数据。

作者图片

现在,可用的数据就在数据库中。对此我们可以做两件主要的事情。要么分析数据并找到洞察力以做出商业决策,要么使用数据作为材料来构建一些有趣的产品,如机器学习、深度学习、NLP、推荐系统等。

作者图片

每个角色的职权范围

数据分析师

数据分析师是数据消费者之一。数据分析师回答关于现在的问题,例如:现在发生了什么?原因是什么?你能给我看看 XYZ 吗?我们应该做些什么来避免/实现 ABC?过去 3 年的趋势如何?我们的产品卖得好吗?

让我们重新思考什么是数据。数据是已经发生的事情。数据驱动的决策意味着我们审视已经发生的事情,解读其中的洞见,然后在此基础上采取下一步行动。数据分析师的工作包括 3 个主要部分:

  1. 理解指标/业务问题,即提出正确的问题。
  2. 从数据中找出答案或者更多的感悟。
  3. 交流。这包括创建具有适当可视化的仪表板,并以易于理解的方式向非技术利益相关者解释它们。

技能要求

  1. SQL:这对于所有与数据相关的角色与数据库进行交互是必不可少的。
  2. 数据可视化:更重要的是知道如何以适当的方式可视化数据,而不是你使用的工具。大多数公司都有授权的商业智能工具,如 Power BI、Tableau、Looker、Qlik 等。你不需要知道如何使用它们。如果你理解数据分析的核心概念,你应该不会花很长时间去学习其中的任何一个。
  3. 领域知识:我认为领域知识对数据分析师来说比其他角色更重要。指标代表什么?指标之间是如何相互作用的?什么是指针移动器?这些领域知识对于提出正确的问题、发现真知灼见以及做出商业决策是必要的。

数据科学家

数据科学家是另一个数据消费者。他们不是回答关于现在的问题,而是试图在数据中寻找模式,并回答关于未来的问题,即预测。这种技术其实早就存在了。你一定听说过,它叫统计。机器学习和深度学习是利用计算机的能力在数据中寻找模式的两种最流行的方法。数据科学家也基于这些预测开发产品。例如,推荐系统预测你喜欢什么,排名系统预测受欢迎程度,NLP 预测一个句子的意思。数据科学家构建这些产品不是为了帮助做出商业决策,而是为了解决商业问题。

描述数据科学家的最佳方式是“用数据解决公司问题”的人。这可能是任何事情,取决于公司的规模。你可能会看到一个数据科学家在一家小公司里做很多分析师和工程师的工作。在一个更大的公司,他们更有可能关注我们刚刚谈到的内容。

技能要求:

  1. SQL:这对于所有与数据相关的角色与数据库进行交互是必不可少的。
  2. 统计学/数学:你必须掌握统计学知识,如每种机器学习方法背后的理论,概率等,以解决更复杂的问题。这一部分非常学术和理论化,这就是为什么大多数数据科学家角色需要硕士或博士学位。
  3. 编程技能:要应用统计学知识解决现实世界的问题,你必须具备编程技能。训练模型、编写算法、构建下一代产品都在一台笔记本电脑上完成。数据科学是一门结合了计算机科学和统计学的学科。目前,Python 和 R 是最流行的编程语言。
  4. 软件开发:就像任何其他工程师一样,软件开发技能对于与其他利益相关者合作至关重要。Git 工作流、CI/CD、DevOps 等都是数据科学家的基本工具。

数据工程师

数据分析师和科学家是如何获得数据的?用户行为的数据是如何进入数据库的?我们如何确保数据是可靠的?答案是数据工程师。如果没有数据工程师建立整个结构,数据消费者就无法完成他们的工作。他们构建数据管道,将数据从用户设备接收到云,然后再接收到数据库。简单地说,数据到达数据库之前发生的一切都由数据工程师负责。

数据工程师最关心的是:

  1. 如何将不同来源的数据接收到一个目的地,供分析师和科学家使用。
  2. 确保数据管道、存储、数据结构得到优化,并对公司最具成本效益。
  3. 确保分析师和科学家使用的数据是最新、最有效和最可靠的。他们不会因为数据不正确而做出错误的决策。

技能要求

  1. SQL:此外,数据工程师应该了解每个不同数据库的来龙去脉,何时使用哪个,它们的优势是什么。有时需要了解 DBA(数据库管理)命令,如监控团队成员的访问、编写程序、维护模式以优化数据库性能。
  2. 云计算:由于现在几乎所有的数据都在云上,从存储到数据库再到仓库,工程师必须非常熟悉云计算技术。AWS(亚马逊)、Azure(微软)和 GCP(谷歌)是市场上最受欢迎的三大云服务。这也包括并行计算(Hadoop、Spark)和大数据的应用。
  3. 软件开发:同上。

摘要

用一句话概括每个角色,

业务决策由数据分析师推动。

数据科学家解决商业问题。

数据工程师使数据分析师和科学家能够完成他们的工作。

作者图片

尽管不同公司的实际情况因规模和组织结构而异,但每个角色的主要目的不应该与我们刚刚讨论的相差太远。不太可能看到数据分析师摆弄 AWS 并建立数据管道,而数据工程师在 Looker 中构建仪表板。然而,数据科学家可以做任何事情。在他的视频中,霍马很好地解释了在不同规模的公司中组织会是什么样子。他还非常清晰地介绍了数据科学的历史以及什么是真正的数据科学。

最后,我强烈建议不要只看头衔,而要仔细看职位描述,真正了解这个角色在他们公司做什么,以及这些日常工作是否符合你的期望。

https://hoooching.medium.com/membership

数据科学家必须重新审视他们的工具集:让我来解释一下

原文:https://towardsdatascience.com/data-scientists-must-revisit-their-toolsets-let-me-explain-918ff744d55d

人工智能笔记

无论您是数据科学家还是想成为数据科学家,您都必须重新审视您的工具集

由 Unsplash 上的谷仓图片拍摄

你是在非软件企业找工作的数据科学家吗?您需要在的短时间内从大量数据中提取洞察力吗?要不要评估一下你的想法是不是可以用人工智能解决?如果你对以上任何一个问题的回答是“是”,这篇文章可能会对你有所帮助。

我最近对人工智能领域的新浪潮感兴趣,它被命名为“无代码人工智能”。然而,在人工智能社区,我们仍然没有就如何精确定义无代码人工智能技术达成共识。像 DataRobot 这样的产品将无代码 AI 定义为数据科学家的钢铁侠套装。然而,其他产品如 Sway AI 将其定义为领域专家和数据科学家长老魔杖(哈利波特的魔杖)。

依我看,后一个定义更接近于无代码人工智能技术的主要目标:(1)加快进程,(2)降低成本,(3)提高可解释性。无代码 AI 技术的诞生是为了帮助企业采用 AI 技术。所以,如果你想在大型非软件企业工作,或者想在短时间内从大量数据中获得洞察力,你必须熟悉无代码人工智能的世界。

再来解释一下。

如果你想在大型非软件企业工作,你的工具集中必须有无代码 AI 平台。

https://www.amazon.com/gp/product/B08D2M2KV1/ref=dbs_a_def_rwt_hsch_vapi_tkin_p1_i0

—为什么你必须学习无代码人工智能?

如果你读过我之前关于人工智能战略和数据战略的文章,你就会知道一个人工智能项目要取得成功存在许多挑战,尤其是当它在非软件企业中运行时。例如,在雇佣大型数据科学团队之前,企业需要进行许多实验,以确定可以通过人工智能有效解决的问题。雇佣一个大型数据科学团队成本高昂,而且对于一个企业来说,建立一个充满无数未知数的数据科学团队是有风险的。无代码人工智能技术是许多未知问题的答案。作为一名数据科学家,你可以使用无代码 AI 平台为非软件企业创造价值,而不需要依赖其他专家,例如其他项目中需要的数据工程师。

作为一名数据科学家,你可能会说你还是更喜欢编码;然而,企业期望尽快得到结果。如果你想在 Jupyter 笔记本上从头开始开发任何东西或编写代码,你可能无法在截止日期前完成,或者向管理团队解释清楚。在这里,无代码人工智能平台可以帮助你。

毫无疑问,无代码 AI 技术正在崛起。无论您是数据科学家还是领域专家,都要准备好高效地使用它。

—你必须如何选择一个无代码人工智能平台?

如果你观察一下无代码人工智能领域,你会发现有不同类型的无代码人工智能平台:(1)专注于行业的如 Accern , (2)专注于技术的如 Lobe , (3)数据科学工具如H2O,( 4)Z 类如 Sway 人工智能我将在下面解释这些类别,尤其是 Z 类。

专注于行业的公司是那些选择行业或部门(例如,金融服务)并致力于在该部门提供所有必需的基于人工智能的工具的公司。专注于技术的公司是那些选择特定人工智能技术(例如,计算机视觉或自然语言处理)并围绕该技术建立公司的公司。第三类是那些为主要关注 AutoML 的数据科学家开发工具的公司。

最后一类公司是那些旨在为数据科学家和领域专家开发工具的公司。当他们将 AutoML 整合到他们的产品中时,他们为他们的用例创建了有洞察力的仪表板。很难制造出一种能被所有人使用的产品,但这将彻底改变市场。顺便说一句,Z 类是我对它们的称呼。z 指的是最后来的,完成故事的东西。

所以,请明智地选择你的无代码人工智能平台,否则你将再次陷入不必要的复杂性。

遗言

我对无代码人工智能平台给这个领域带来的机会感到非常兴奋。总的来说,即使无代码 AI 出现了,也总会有对数据科学家和编码的需求。虽然无代码人工智能技术将解决许多挑战,但我仍然相信一个成熟的人工智能产品需要编码,这不会在几天或几周内发生。所以,享受在你的工具集中使用一个新工具,但是请不要误用它!😊

感谢阅读!

如果你喜欢这个帖子,想支持我…

  • 跟我上
  • 亚马逊 上查看我的书!
  • 成为 中的一员
  • 连接上Linkedin
  • 关注我 推特

https://pedram-ataee.medium.com/membership

数据科学家只需要知道一个统计测试

原文:https://towardsdatascience.com/data-scientists-need-to-know-just-one-statistical-test-3115b2ff26fd

读完这篇文章后,你将能够检验任何可能的统计假设。用独特的算法。

[图片由作者提供]

截止到今天的,维基百科总共统计了 104 次统计测试。因此,数据科学家可能会感到不知所措,并问自己:

“我应该知道他们所有人吗?我如何知道何时使用其中一个?”

我在这里向你保证:作为一名数据专业人员,你只需要知道一个测试。不是因为 1 个测试重要,其他 103 个可以忽略不计。而是因为:

所有的统计测试实际上都是同一个测试!

一旦你真正掌握了这个测试是如何工作的,你将能够测试你需要的任何假设。

想要证据吗?在本文中,我们将解决 4 个不同的统计问题。我们会用相同的算法来解决它们。

  1. 你已经掷出了 10 次骰子。你得到了[1,1,1,1,2,2,2,3,3]。模具装好了吗?
  2. 你的朋友声称一些拼字游戏的瓦片从袋子里掉了出来,巧合的是,这些字母组成了一个真正的单词:“F-E-A-R”。你怀疑你的朋友只是想取笑你。你的朋友在撒谎吗?
  3. 在一项客户满意度调查中,100 名客户对产品 A 的平均评分为 3.00,对产品 b 的平均评分为 2.63,这种差异显著吗?
  4. 你训练了一个二元分类模型。在您的测试集(由 100 个观察值组成)上,它在 ROC 曲线下的面积为 70%。模型是否明显优于随机?

在深入研究这些问题的答案之前,让我们试着了解一下统计测试的本质。

任何统计检验的深刻含义是什么?

我试着用统计学中最不原始的例子来回答这个问题:骰子的投掷。

想象一下,你投了六次骰子,你得到了[2,2,2,2,4]。有点可疑,不是吗?你不会期望 6 次中有 5 次得到相同的数字。至少,如果死亡是公平的,你不会期望它发生

这正是统计测试的要点。

你有一个假设,叫做“零假设”,你想测试它。因此,你问自己:

“如果假设是真的,我得到的结果和我实际得到的结果一样可疑的几率有多大?”

在骰子的例子中,问题变成了:“如果骰子是公平的,我多久会得到一个像[2,2,2,2,4]这样意想不到的序列?”既然你问的是“多长时间一次”,那么答案必然是一个介于 0 和 1 之间的数字,其中 0 表示从不,1 表示总是。

在统计学中,这种“多频繁”被称为“p 值”。

在这一点上,推理的路线是相当琐碎的:如果 p 值非常低,那么这意味着你最初的假设很可能是错误的。

请注意,“出乎意料”的概念与您正在测试的特定假设密切相关。例如,如果你认为骰子是公平的,那么结果[2,2,2,2,4]就很奇怪。然而,如果你认为骰子在 75%的情况下都是装载到数字“2”中,这就不足为奇了。

统计测试的要素

阅读前一段,你可能已经猜到我们需要两种成分:

  1. 可能结果的分布,取决于零假设。
  2. 衡量任何结果的“不可预测性”。

关于第一个因素,得到结果的全部分布并不总是简单的。通常,随机模拟大量结果更方便(也更容易):这是真实分布的一个很好的近似值。

关于第二个要素,我们需要定义一个将每个可能的结果映射成一个数字的函数。这个数字必须表示结果有多出乎意料,假设零假设为真:结果越出乎意料,这个分数就越高。

一旦我们有了这两个要素,工作基本上就完成了。实际上,计算分布中每个结果的未预期分数和观察结果的未预期分数就足够了。

p 值是随机得分高于观察得分的百分比。

就是这样。这就是每一个统计测试的工作原理。

这是我们刚刚描述的流程的图示:

如何计算公平骰子的零假设下 outcome [2,2,2,2,2,4]的 p 值?[图片由作者提供]

独特的统计测试

但是我们如何在 Python 中实现呢?算法如下:

  1. 定义一个函数draw_random_outcome。这个函数应该返回随机试验的结果,假设零假设为真。它可以是一个数字、一个数组、一个数组列表、一个图像,实际上可以是任何东西:这取决于具体的情况。
  2. 定义一个函数unexp_score(代表“意外得分”)。该函数应该将实验结果作为输入,并返回一个数字。这个数字必须是结果出乎意料程度的分数,假设它是在零假设下产生的。分数可能是正数,负数,整数,或者浮点数,都没关系。它必须具有的唯一属性如下:结果越不可能,这个分数就必须越高
  3. 多次(例如 10,000 次)运行函数draw_random_outcome(在第 1 点定义),对于每个随机结果,计算其unexp_score(在第 2 点定义)。将所有的分数存储在一个名为random_unexp_scores的数组中。
  4. 计算观察结果的unexp_score,称之为observed_unexp_score
  5. 计算有多少随机结果比观察到的结果更出乎意料。也就是说,数一数random_unexp_scores有多少个元素比observed_unexp_score高。这是 p 值。

根据具体情况,前两步是唯一需要一点创造力的步骤,而第 3、4 和 5 步则完全是机械的。

现在,为了更具体,让我们看一下例子。

例 1。滚动骰子

我们已经发射了 10 次骰子,并获得了这样的结果:

observed_outcome = np.array([1,1,1,1,1,2,2,2,3,3])

无效假设是骰子是公平的。在这个假设下,很容易提取随机结果:用 Numpy 的random.choice就够了。这是我们算法的第一步:

**# step 1** def draw_random_outcome(): return np.random.choice([1,2,3,4,5,6], size=10)

第二步是定义一个名为unexp_score的函数,该函数应该为每个可能的结果分配一个不可预测的分数。

如果骰子是公平的,我们期望每张脸平均出现六分之一的时间。所以我们要检查每张脸的观察频率和 1/6 的距离。然后,为了获得单个分数,我们应该取平均值。这样,距离六分之一的平均距离越高,结果就越出人意料。

**# step 2** def unexp_score(outcome): outcome_distribution = np.array([np.mean(outcome == face) for face in [1,2,3,4,5,6]]) return np.mean(np.abs(outcome_distribution - 1/6))

至此,困难的部分已经完成:正如我之前所说,算法的步骤 3、4 和 5 完全是机械的。

**# step 3** n_iter = 10000random_unexp_scores = np.empty(n_iter)for i in range(n_iter):
  random_unexp_scores[i] = unexp_score(draw_random_outcome())**# step 4** observed_unexp_score = unexp_score(observed_outcome)**# step 5** pvalue = np.sum(random_unexp_scores >= observed_unexp_score) / n_iter

得到的 p 值为 1.66%,这意味着在零假设下,只有 1.66%的结果像[1,1,1,1,1,2,2,2,3,3]一样出乎意料。

出于好奇,这是一个直方图,显示了意外得分的分布以及观察得分的确切位置。

掷出 10 次骰子的意外得分。无效假设:骰子是公平的。观察结果:[1,1,1,1,2,2,3,3]。[图片由作者提供]

例 2。拼字迷

你的朋友声称一些拼字游戏的瓦片从袋子里掉了出来,巧合的是,这些字母组成了一个真正的单词:“F-E-A-R”。你怀疑你的朋友在戏弄你。如何统计检查你的朋友是否在说谎?

首先,观察到的结果是一系列字母,因此是一个字符串:

observed_outcome = 'FEAR'

假设袋子里有 26 个字母。无效假设是随机数量的字母(在 1 到 26 之间)以随机的顺序从袋子里掉出来。因此,我们将不得不使用 Numpy 的random来表示字母的数量和字母的选择:

**# step 1** def draw_random_outcome(): size=np.random.randint(low=1, high=27) return ''.join(np.random.choice(list(string.ascii_uppercase), size=size, replace=False))

现在,如何评价这个场景中的意外?

一般来说,我们有理由认为从袋子里掉出来的字母越多,就越不可能找到一个真正的单词。

因此,我们可以使用这个规则:如果字符串是一个现有的单词,那么它的得分将是该单词的长度。如果字符串不是一个真实的单词,那么它的分数将是单词长度的减。

所以这是算法的第二步(注意:你必须pip install english-words让下面的代码工作)。

**# step 2** from english_words import english_words_setenglish_words_set = [w.upper() for w in english_words_set]def unexp_score(outcome): is_in_dictionary = outcome in english_words_set return (1 if is_in_dictionary else -1) * len(outcome)

步骤 3、4、5 总是相同的,因此我们将从上一个示例中复制并粘贴它们:

**# step 3** n_iter = 10000random_unexp_scores = np.empty(n_iter)for i in range(n_iter):
  random_unexp_scores[i] = unexp_score(draw_random_outcome())**# step 4** observed_unexp_score = unexp_score(observed_outcome)**# step 5** pvalue = np.sum(random_unexp_scores >= observed_unexp_score) / n_iterThis is the result:

这是结果:

字母表中随机字符串的意外分数。零假设:随机选择一些字母,字母的顺序也是随机的。观察结果:“恐惧”。[图片由作者提供]

在这种情况下,p 值为 0.0,因为没有随机得分高于观察得分。所以,根据这个统计测试,你的朋友在撒谎!

例 3。两个平均值之间的差异

您要求 100 名客户对您的两种产品进行评级:产品 A 和产品 b。您获得了以下评级:

product_a = np.repeat([1,2,3,4,5], 20)product_b = np.array([1]*27+[2]*25+[3]*19+[4]*16+[5]*13)observed_outcome = np.mean(product_a) - np.mean(product_b)

结果计算为产品 A 的平均评分(3.0)和产品 B 的平均评分(2.63)之间的差异,在本例中为 0.37。

因为您想要测试平均评分之间的差异是否显著,所以零假设是产品 A 和产品 b 之间没有差异。如果这是真的,我们可以在两个产品之间调换评分。

因此,函数unexp_score将获取所有 200 个评分,对它们进行洗牌,随机分配 100 个给 A,剩余的 100 个给 b。然后,它将计算两个平均值之间的差异。

**# step 1** def draw_random_outcome(): pr_a, pr_b = np.random.permutation(np.hstack([product_a, product_b])).reshape(2,-1) return np.mean(pr_a) - np.mean(pr_b)

根据两种产品之间没有差异的假设,均值之间观察到的差异应该很小。因此,离零越远的结果值就越出人意料。所以我们可以把结果的绝对值作为意外得分:

**# step 2** def unexp_score(outcome): return np.abs(outcome)

步骤 3、4、5 总是相同的,因此我们将从上一个示例中复制并粘贴它们:

**# step 3** n_iter = 10000random_unexp_scores = np.empty(n_iter)for i in range(n_iter):
  random_unexp_scores[i] = unexp_score(draw_random_outcome())**# step 4** observed_unexp_score = unexp_score(observed_outcome)**# step 5** pvalue = np.sum(random_unexp_scores >= observed_unexp_score)/ n_iter

这是结果:

均值间差异的意外得分。零假设:均值之间没有差异。观察结果:0.37。[图片由作者提供]

这种情况下的 p 值为 6.82%。因此,在传统的统计测试中,如果您将阈值设置为 1%或 5%,您应该会得出平均评级之间没有显著差异的结论。

例 4。ROC 曲线下面积

假设你训练了一个预测模型,它在测试数据集上 ROC 下有 70%的面积。好消息,对吧?但是测试集仅由 100 个观察值组成。那么你怎么证明这个结果是否显著呢?

想象这些是你的初始元素:

y_test = np.random.choice([0,1], size=100, p=[.9,.1])proba_test = np.random.uniform(low=0, high=1, size=100)observed_outcome = .7

无效假设是你的模型与随机模型没有什么不同,所以如果你只是打乱你的预测并计算roc_auc_score,你会得到一个在无效假设下产生的结果:

**# step 1** def draw_random_outcome(): return roc_auc_score(y_test, np.random.permutation(proba_test))

一个结果有多出乎意料?由于我们正在处理 ROC 曲线下的区域,其中 50%表示随机分类器,因此当它进一步远离 50%时,结果更加出乎意料,因此我们的函数unexp_score可以是roc_auc_score和 50%之间的绝对差值:

**# step 2** def unexp_score(outcome):
  return np.abs(outcome - .5)

步骤 3、4、5 总是相同的,因此我们将从上一个示例中复制并粘贴它们:

**# step 3** n_iter = 10000random_unexp_scores = np.empty(n_iter)for i in range(n_iter):
  random_unexp_scores[i] = unexp_score(draw_random_outcome())**# step 4** observed_unexp_score = unexp_score(observed_outcome)**# step 5** pvalue = np.sum(random_unexp_scores >= observed_unexp_score) / n_iter

这是结果:

ROC 曲线下面积的意外分数。零假设:预测模型与随机模型没有区别。观察结果:70%。[图片由作者提供]

p 值为 2.25%,因此观察到的结果并不像我们最初认为的那样“令人惊讶”。如果你设置阈值为 1%,遵循统计测试的经典规则,你不能拒绝你的模型不比随机模型好的假设。

那么,为什么所有这些统计测试?

如果你已经走到这一步,你可能会想:如果这么容易,为什么还存在这么多的测试?答案大多是“历史”。

曾几何时,计算比现在昂贵得多,因此“统计测试”基本上是高效计算 p 值的捷径。由于我们所看到的算法的第一步和第二步有如此多的选择可能性,测试激增。

如果你想深化这个话题,可以读一下艾伦·唐尼的经典之作《只有一个测试》,正是它启发了本文。

感谢您的阅读!我希望你喜欢这篇文章。如果你愿意, 在 Linkedin 上加我

数据科学家—停止使用随机种子

原文:https://towardsdatascience.com/data-scientists-stop-using-a-random-seed-fd8f2b83ed50

或者为什么 random_state=42 是一个反模式

系统的随机性(齿轮工作团队在一起),loginueve ilustra, Pixabay

以下是我对在你的作品《模型开发和生产》中使用随机种子的看法和推理。不管所选的数字是多少,在很多情况下这是一个众所周知的数字,例如 42 。在某些情况下,如果您想要保持一致性,可以使用随机种子,而在其他情况下,一致性是错误的选择,您应该完全避免。本文将对它们进行回顾。

要避免的用例

模特培训

我见过许多数据科学家使用随机种子进行培训,不这样做有几个主要原因,让我们深入了解一下:

  1. 进入生产阶段时,您可能会忘记随机种子,并且如果模型依赖于单个随机种子,它可能不够健壮,这可能会影响内部模型决策、层初始化和其他因素。
  2. 您将始终使用相同的种子进行训练,并根据会导致随机种子过度适应的值做出决策。另一方面,如果您在构建模型时没有随机种子,您将对您的模型建立更好的信任,因为它已经看到了各种随机化效果,并且它对随机数变化将更加稳健。换句话说,稳健性来自于多次运行,并且您从直接体验您的模型中获得的信心,您不希望依赖于您意外地过度拟合您的测试数据或者幸运地拥有某个随机种子的机会。

生产环境

我建议在生产中不要使用随机种子。最大的原因是,您肯定会将您的代码绑定到一个随机的数字上,这个数字会影响您的模型或管道中的许多部分,而这些部分在处理来自外部的数据时可能表现不佳。也就是说,我收到的反馈是,在某些情况下,各种随机值也可能有很大的影响,但根据经验,要么测量效果,要么不要使用随机种子。

您可以但不一定应该做的案例

验证流或管道

您可能想要端到端地测试您的流程。例如,您已经为培训或生产建立了一个流程,该流程用于培训、验证和输出一致的结果,并且您希望确保每次都能收到相同的结果。然而,一旦你的流量是一致的,你应该完全删除随机种子,以恢复你的流量的稳健性,而不是依赖于一个单一的随机化数字。

写作教程

这与上面的验证用例密切相关,但是这个用例有一点不同,这可能是完全可接受的随机种子的唯一用例。假设您正在编写一个 ML 教程,当有人重新运行您的教程代码时,您希望您的读者在模型输出方面有一个一致的实验。为此,只有你应该使用随机种子。

ML 竞赛

想象一下,你进入了 ML 竞赛的前 10 名提交,你和竞争者之间的差别是ε,用不同的随机种子一次又一次地运行模型,可能会让你找到一个更好的局部最小值,可以胜过所有其他 10 个竞争者,这是否意味着你的模型是最好的?可能不是,但是如果你关心赢得比赛,这是一个有效的用例。

下面这篇文章很好地解释了这一点。

https://laurenoakdenrayner.com/2019/09/19/ai-competitions-dont-produce-useful-models/

安全性

假设您的所有代码都依赖于一个随机的种子数字,例如 42。我可以推断,知道您使用这个数字的攻击者在攻击您的模型时会更容易成功。我没有方便的例子,但是随机生成器攻击是一个蓬勃发展的领域。

摘要

我希望这篇短文提供了关于随机种子使用和相关用例的足够多的见解,这是一个 IMO 值得进行更多讨论的主题。我要感谢 Yoav Talmi 多年前点燃了这个想法。

Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是 ML & DL 纲要和StateOfMLOps.com的作者,并且对 AIOps & MLOps 领域很感兴趣。如今,他是 Justt.ai 数据科学的高级数据总监。

你如何建立你的批判性思维?

原文:https://towardsdatascience.com/data-scientists-you-need-that-skill-how-to-build-critical-thinking-9891c833eacd

数据科学家的软技能

数据科学家,你需要这个技能。

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

C 批判性思维使用逻辑来联系想法和评估事实,以建立对某一情况的信念。换句话说,批判性思考者逻辑地使用信息来建立更好的理解和解决问题。对于任何以推断客观信息和形成现实解决方案为目标的职业来说,这都是一项重要的资产。

"能够接受一种思想而不接受它是一个受过教育的人的标志。"——亚里士多德

知道了人类大脑中大约有 200 种认知偏差,就更加需要发展这种技能。

设计者:John Manoogian III 类别和描述:Buster 实现:TilmannR —该文件源自:认知偏差法典— 180+偏差,由 John Manoogian III (jm3)设计。巴新:、CC BY-SA 4.0、https://commons.wikimedia.org/w/index.php?curid=69756809

但是为什么它对数据专业人员如此重要呢?

数据专业人员是有洞察力的数据点和业务之间的纽带,带来了引导变革和推动影响的责任和机会。

“能力越大,责任越大——彼得·帕克”

照片由与 Raj 在 Unsplash 上的公路旅行拍摄

好得难以令人相信

根据世卫组织,数据完整性对于确保可信度、透明度和质量是必要的,也是合乎道德的。批判性思维帮助你退后一步,挑战你手中数据的完整性。你可能已经经历过一个很好的例子:

你有多少次立刻开始处理数据集?
VS
停下来问自己:这些数据对解决问题真的有意义吗?

假设数据是干净的、正确记录的、甚至与问题相关的,可能会导致错误的结论和结果,这些结论和结果往往好得令人难以置信。使用批判性思维来质疑数据本身的可靠性,避免做出令人尴尬的错误决策。

专注于能带来价值的东西

我相信你已经听说过兔子洞了。

Benoit Beaumatin 在 Unsplash 上拍摄的照片

它描述了这样一个时刻,我们迷失在小细节中,以至于看不到全局,错过了交付企业想要的东西。批判性思维意味着在形成观点之前,你从更广泛的角度询问数据,以形成对问题更客观的分析,并对你试图解决的问题有更深刻的理解。

必备技能

因此,作为一名数据专家,批判性思维可以帮助你提出正确的问题,并专注于事实,同时保持直觉。它鼓励你在收集数据时拓宽视野,并挑战数据与你正在解决的问题的相关性。最后但同样重要的是,批判性思维将帮助你不断保持好奇心,这可以带来更多创新的解决方案。

好吧。那么,如何去努力呢?

愿意犯错。

批判性思维的困难在于,它需要接受错误,或者至少对你的真理有一定程度的怀疑。它意味着愿意失败,说实话:没人喜欢这样。充其量就是不舒服。最糟糕的是,这很痛苦。

它不需要你有任何特殊的天赋。任何人都可能错。

你需要的是培养你对脆弱的接受和更深刻的谦卑感。这并不有趣或令人愉快,但对你的个人成长至关重要。走那条路,你一定会很快感到无比强大!

给自己时间和空间。

也许你可以开始给自己时间和空间来思考,用 5 个“为什么”技巧来挖掘“为什么”,以找到问题的根源,而不是专注于问题的症状。

来源:Mindtools

我喜欢冥想,给自己空间和时间。有些人喜欢锻炼身体或写日记。但也可以是一些简单的事情,比如从你的日历中清理掉所有不重要的会议和事件,或者坐 30 分钟喝杯咖啡。对你有用的就行!

https://www.huffpost.com/entry/how-to-give-yourself-more_b_519513

让你的周围充满不同的思想。

不要把自己与你的视角隔离太久,否则你可能会陷入众所周知的确认偏差。相反,我会建议你和各种背景的人在一起,让他们尽最大努力剖析你的逻辑。积极地使信息和逻辑的来源多样化,将会强化不被对世界的单一认知所束缚。

做好准备;会很疼的。不要针对任何人。这与你无关。这是关于开放和寻求真相的更高版本。所以保持你的头脑灵活,你会获得你可能从未考虑过的观点。这就是成长。

更多关于确认偏差以及如何应对的信息在这个来自的视频中,Cassie Kozyrkov — 谷歌第一任首席决策科学家,主题演讲人,《与机器学习交朋友》的创始人

承认你的失败。

分享你的成功非常有利于激励和建立自信,分享你的失败也是如此!通过分享我们的学习经验,也就是错误,我们正常化了不知道所有事情也没关系。我们允许更多的合作和信任,因为我们知道我们可以寻求帮助,如果有问题,我们可以一起努力解决。研究表明,了解他人的挑战可以提高全球绩效和效率。

“你不能掩盖你的失败,而是要公开谈论它们,分析哪里出了问题,这样你才能学习新的决策规则”斯蒂芬·沙兹曼

实话实说吧;分享失败很难!因为在某件事上失败是一种无能的表现,这与我们的自尊背道而驰。但它也可以缓解和乐趣!不要相信我的话;参加由 Fuckup Nights 组织的活动或在线观看他们的视频。这是难以置信的宣泄和鼓舞人心的。

求一个安全的环境。

因此,为了培养这种能力,你需要一个让失败正常化的环境,一个开放的实验和反思的环境。这是一个安全的地方,在这里你可以从你认为正确的事情后退一步,并挑战它。在这个空间里,你的队友有权提醒你注意自己的盲点或个人倾向。大多数公司都很难做到这一点,因为他们过于关注结果。研究表明,为了产生这种安全感,工作场所应该提倡更多以学习和透明度为中心的价值观,从领导者开始,他们应该更加公开自己的错误。因为什么比以身作则更好呢?

✌️观看 TEDx 视频“如何建立心理安全的工作场所?”:

扩展你的知识面。

另一种扩展你的认知和挑战你内心真实的方法是尽可能广泛地阅读。一个典型的错误是从我们有限的经验中过度推断。拓宽你经验的一个方法是阅读不同作者的不同主题。任何有助于开阔你视野的高质量的东西都是有价值的。

如果你想阅读更多关于如何培养批判性思维的书籍,我会向你强烈推荐这些书:

  1. 思考,快与慢作者丹尼尔·卡内曼
    这本书将你的注意力带到你的思考过程:好的、坏的、丑陋的。它带来意识,最终帮助你做出更明智的决定。
  2. 永不停止学习:保持相关性,重塑自我,茁壮成长 作者布拉德利·斯塔茨
    这本书是一个很好的起点,让你接受自己并非无所不知,并成为一名更好的学习者。它可以帮助你承认自己的错误,并将他人视为成长的源泉,而不是竞争。
  3. 在赌注中思考:在没有掌握所有事实的情况下做出更明智的决定作者安妮·杜克
    当我写这篇文章的时候,我还在读这本书,并且非常喜欢。这是关于接受你的决策过程中的不确定性,并尽可能得到最好的结果。我相信这在进行数据分析或建立模型时非常重要。

给你一些工具和想法来培养你的批判性思维。如果我想让你从这篇文章中得到什么,那就是:

批判性思维需要开放性。

对真相的不同版本持开放态度,对错误和脆弱持开放态度,对失败持开放态度。所以给自己一点时间;这是一个旅程,而不是目标!

一如既往的给我留下你的评论和留言;我将很高兴收到您的来信,并改进这篇文章。在 Medium 上关注我,了解更多关于数据科学的内容。

https://agiraud.medium.com/membership

这篇文章的灵感来自 J 奥登·莫罗的一篇帖子,以及专家和同行的评论:古平顺、 苏珊·沃什、 唐·甘农-琼斯、伊万娜·尤尔基夫、布莱恩·威利特、乔尔·夏皮罗、 梅根·s .、安波·托罗-基奇、

https://www.linkedin.com/posts/jordanmorrow_dataliteracy-leadership-data-activity-6827952158655307776-ZZmL?utm_source=share&utm_medium=member_desktop

新生数据科学家的数据选择

原文:https://towardsdatascience.com/data-selection-for-nascent-data-scientists-2fb27f534723

用于选择数据集的简单而清晰的框架

保罗·阿奇在 Unsplash 上的照片

介绍

欢迎光临!我和我的合著者(凯勒·根利)很高兴你在这里。所以你在做一个自我导向的数据科学项目?非常好。数据科学是一个实践领域,随着时间的推移,它只会变得更加有用,因为数据呈指数级增长,而且人们越来越普遍地认识到,数据驱动的决策可以在许多层面上增强组织的能力。

我们是来帮忙的!数据科学很复杂,像真的,真的复杂。或者至少可以是;你能给一个项目带来多大的深度是没有底线的。考虑到这一点,拥有一些工作结构是非常有益的。一颗种子水晶,如果你愿意的话,可以在这个前所未有的信息海洋中指引你的方向。).这篇文章将教你在加速你的项目时要考虑什么;这会帮助你将你的选择与你的优先事项联系起来。我们将教你如何验证手头数据的相关性、可访问性类型、质量。我们将教你为什么这些元素是必不可少的,以及它们将如何影响你的作品。如果您正在开始一个自我指导的数据项目,无论您对数据科学完全陌生,或者即使您已经有了一点实践经验,本文都适合您。

空气焦点对去飞溅拍照

两位数据科学家正在努力整理他们的数据

结构

好了,现在你已经准备好了,让我们开始吧。我们相信你有一些很棒的想法,并且很乐意投入其中。但是在你使用最新最好的模型之前,你需要选择一个数据集。这看起来很简单,但也很棘手。这第一步将塑造你整个项目的基调。

首先要考虑的是 相关性。 问问自己,我为什么要做这个项目?学习数据科学流程是否严格?还是对某个特定话题高度感兴趣?也许你是数据科学的新手,直观的数据集将帮助你专注于学习( Titanic 有人吗?!?).或者,您可能希望研究新冠肺炎的数据,因为您有公共卫生背景,并且该主题与您感兴趣的领域相关。当你在寻找一个特定的主题时,潜在数据集的范围变窄了,可行的数据可能更难获得。尤其是在感兴趣的领域非常小众的情况下。这是选择数据集的两个基本原因:

  1. 你在寻找一个促进学习的项目
  2. 你对某个特定的话题或问题感兴趣

这两个动机并不相互排斥,但是知道你开始这个项目的根本原因是很重要的。

接下来是 可访问性获取数据有多容易?你是否在 Kaggle (一个数据科学竞赛的热门网站,拥有大量数据集)上找到了一个易于预览和下载的数据集?或者是否有一些障碍需要跨越,比如访问 API (检索数据的编程接口)权限以获得想要的数据集?您计划如何访问您的数据是需要考虑的重要问题。如果您刚刚起步,并且对数据科学过程感到好奇,那么您应该选择一个易于访问的数据集。

一旦你有了数据,你就要从技能集的角度理解项目的范围 。问问自己,数据集需要新技能吗?如果你是全新的,答案可能是肯定的,所以在你努力前进的时候,你应该考虑一下你想读/学多少。这从一开始就很难回答,在一个项目中总会有即兴的学习会议。但是,在预览数据集时,您需要了解正确执行项目所需的工具和技能。你可以通过预览其他人如何处理类似的项目来实现这一点。你想学习那些特殊的技能吗?你能在合理的时间内学会它们吗?在投入之前,所有这些都不可能完全了解,但是在决定这是正确的努力之前,绝对有可能对你投入的东西有一个感觉。

现在,您需要了解您正在查看的数据的类型。格式是什么?如果你有一个你想要实现的特定类型的建模,这将会很重要。不同的机器学习算法是为不同类型的数据设计的,因此,对您想要实现的模型有一些想法应该可以指导您的数据选择过程。您可能愿意探索任何模型,在这种情况下,数据类型就不那么重要了。例如,假设你刚刚学习了线性回归。选择一个试图预测房价的数据集是有意义的。几种常见的数据类型是:

  1. 数字数据——连续可变的指标,如价格、距离、重量、时间等;通常以测量的形式出现
  2. 分类数据——离散的事物类别,如物种、国家、团队、流派;你可以清楚地说明某个东西还是不在组中的任何分组

你还需要了解 有监督的无监督的 学习之间的区别。

最后要考虑的重要事情是数据的质量。这与数据类型有关,但与“整洁”关系更大。要问的问题:是否有许多缺失的值?行和列是否被很好地组织和标记?如果数据收集过程设计得好,数据应该相对干净,但是发现脏数据是很常见的。你的数据的质量将决定花费多少时间和精力来准备或所谓的“争论”【蒙骗】数据——人们喜欢而不是讨论的数据科学的不性感部分,然而,这是过程中非常关键的(通常也是最耗时的)部分。刚开始时,选择一个干净的数据集可能很有诱惑力,但我建议您亲自动手,花大量时间处理数据。这是一项需要培养的重要技能,你会很高兴掌握了它。如果你正在使用 Python,你会想要立即熟悉熊猫库。Pandas 是争论和探索数据的基本工具。你处理的数据越多,你就越会发现熊猫的广阔和无价。

里卡多·罗查在 Unsplash 上拍摄的照片

展现在你面前的光辉道路

结论

我们已经为您设置了数据科学方法(DSM)的第一步,这是 Guy Maskell 在本文中介绍的。通过验证数据的相关性、可访问性类型、质量,你能够做出在整个项目中支持你的选择。它们不仅会让你前进,还会防止你在项目过程中走回头路。当你前进时,记住你为什么开始这个项目。人们很容易陷入杂草中,退一步,深呼吸,检查一下你为什么开始这个项目是很有力量的。这通常会让你重新调整自己,开始再次看到森林和树木。

在下一篇文章中加入我们,我们将把这个框架应用到一个实际的项目中。

这篇文章是由斯潘塞·戈布尔和凯勒·詹利合作完成的。如果你对他们感兴趣,以下是他们的 GitHubs 和 LinkedIns:

斯潘塞在 | 斯潘塞 Github | 迦勒领英 | 迦勒 Github

PySpark 数据在 5 分钟内出现偏差

原文:https://towardsdatascience.com/data-skew-in-pyspark-783d529a9dd7

正是您需要的,仅此而已

约翰·巴克托在 Unsplash 上拍摄的照片

有很多关于数据偏斜的过于复杂的帖子,这是一个看似简单的话题。在这篇文章中,我们将在 5 分钟内讲述必要的基础知识。

这篇文章的主要来源是 Spark:权威指南,这里是代码。

让我们开始吧…

什么是数据不对称?

在 spark 中,数据被分成行块,然后存储在 worker 节点上,如图 1 所示。

图 1:数据分区如何存储在 spark 中的例子。图片作者。

每个单独的数据“块”被称为一个分区,一个给定的工作者可以拥有任意数量、任意大小的分区。但是,最好将数据均匀分布,以便每个工人都有等量的数据要处理。

当工人之间的数据不平衡时,我们称之为“偏斜数据”

如果我们的机器有 8 个 worker 节点,而不是上面显示的 3 个,那么一个完美分布的数据集在每个节点上会有相同数量的行,如图 2 左侧所示。另一方面,具有不对称的数据集在一些内核上有大量数据,而在其他内核上只有很少的数据。

图 2:均匀(左)与不均匀(右)数据偏斜。图片作者。

我为什么在乎?

很好,我们知道什么是不对称,但它对我们的应用有什么影响?数据不对称的一些常见结果是…

  • 运行缓慢的阶段/任务:某些操作会花费很长时间,因为给定的工作人员正在处理太多的数据。
  • 将数据溢出到磁盘:如果数据不适合工人的内存,它将被写到磁盘,这将花费更长的时间。
  • 内存不足错误:如果 worker 用完了磁盘空间,就会抛出一个错误。

数据不对称意味着计算和内存资源的利用率不均衡。

如何判断我的数据是否有偏差?

如果你正在经历上述的一些症状,并且预期你的数据是偏斜的,你可以使用下面的方法来诊断。

import pyspark.sql.functions as F
df.groupBy(F.spark_partition_id()).count().show()

上述代码确定了对数据帧进行分区的键。这个键可以是数据集中的一组列,默认的 spark HashPartitioner ,或者一个自定义 HashPartitioner 。

让我们来看看输出…

图 3:每个 spark_partition_id 的行数。图片作者。

在图 3 中,我们可以看到创建的演示数据没有出现偏差——每个分区中的所有行数都是相同的。太好了,但是如果我想看到每个分区中的数据呢?

为此,我们将访问底层 RDD,并按分区提取数据…

df.rdd.glom().collect()

.glom()返回列表列表。第一个轴对应于给定的分区,第二个轴对应于该分区中的Row()对象。在图 4 中,我们打印了每个分区中的前 2 个Row()对象——打印 8 个分区中的所有 125 个Row()对象并不容易阅读。

图 4:df . rdd . glom()的输出。collect()被截断到每个分区的前 2 行。图片作者。

很酷,对吧?

提醒一句,当使用.glom()方法时,你很容易让你的记忆超载。如果您正在处理大型数据集,请确保进行缩减采样,以便您收集的任何内容都可以放入 RAM 中。

如何纠正数据倾斜?

尽管有上面的例子,但在现实世界中,完美的数据分布是罕见的。通常在读取数据时,我们会从预分区文件或 ETL 管道中提取数据,这些文件或管道可能不会自动很好地分发。

要解决这个问题,有两个主要的解决方案…

1.按列重新分区

第一种解决方案是根据脚本中的转换对数据进行逻辑上的重新分区。简而言之,如果您正在分组或连接,通过 groupBy/join 列进行分区可以提高 shuffle 的效率。

df = df.repartition(<n_partitions>, '<col_1>', '<col_2>',...)

2.盐

如果您不确定哪些列会导致应用程序的工作负载均匀,您可以使用随机 salt 在内核之间均匀分布数据。我们所做的就是用一个随机值创建一个列,用该列进行分区…

import pyspark.sql.functions as Fdf = df.withColumn('salt', F.rand())
df = df.repartition(8, 'salt')

为了检查我们的盐是否有效,我们可以使用与上面相同的 groupBy

df.groupBy(F.spark_partition_id()).count().show()

图 salted keys 的分布示例。图片作者。

如您所见,每个分区的行数有一些变化,但是我们的键分布相当均匀。

结论

现在,所有其他复杂的帖子都有宝贵的信息——正确划分数据可以对应用程序性能产生巨大影响。然而,有了上面的信息,你(希望)有一个框架来搜索你的解决方案。

也就是说,这里有一些更复杂的快速提示:

  • 你可以在 Spark UI 中查看任务速度的分布。这很有帮助!
  • 通常最好让分区的数量是工作线程数量的倍数。
  • 这里有一个关于 spark 操作层级的快速概述。
  • 洗牌会导致数据被重新分区。一个好的分区将最小化程序所需的数据移动量。
  • 如果你想要一个关于分区大小的超级实用和高级的资源,查看这个视频。

感谢阅读!我会再写 12 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。

数据技能可以在非数据科学职业中发挥重要作用

原文:https://towardsdatascience.com/data-skills-can-make-a-big-difference-in-non-data-science-careers-60e242588f8d

作者聚焦

可持续发展和能源分析师 Himalaya Bir Shrestha 反思了自学和学习编码的诸多好处

在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 喜马拉雅比尔·什雷斯塔 分享我们的对话。

照片由喜马拉雅 Bir Shrestha 提供

Himalaya 是德国的一名能源系统分析师。他拥有可再生能源管理的背景,最初是在柏林的一个科学政策研究所担任气候政策分析师。在空闲时间,Himalaya 喜欢阅读有关数据科学的文章,并在他的日常工作中实施相关技术,这些工作与评估气候政策、建立能源系统模型以及开发不同级别的长期脱碳情景有关。

你是如何发现自己对数据相关话题的兴趣的?

2018 年,我在德国科隆的新气候研究所实习。作为实习的一部分,我为一个项目开发了一个基于 Excel 的蒙古能源系统模型。该模型利用了来自国际能源机构等不同来源的大量能源平衡和排放统计数据。利用这些数据,我可以分析蒙古不同行业的一次能源、二次能源、电力供应和排放轨迹的趋势和驱动因素。此外,我利用该模型通过玩弄各种社会经济杠杆来构建长期脱碳情景。这是我第一次对利用数据获取能源和可持续发展相关主题的见解产生了兴趣。

你被什么样的问题和挑战所吸引?

这些天来,我最感兴趣的是在粒度级别上分析电力部门和能源部门的转型。为此,我正在学习时间序列分析、聚类和空间分析的不同技术。

你所接受的正规培训是否为你所从事的工作做好了准备,还是说大量的自学也是必要的?

在研究生学习期间,我对 Python 有一个基本的了解。我的实习为我使用 Excel 打下了坚实的基础。两年前,当我在 Climate Analytics 工作时,有一次,我看到我的团队领导在一个 Jupyter 笔记本上自动完成了几项任务——这些任务是我在 Excel 中手动完成的。我对使用 Python 可以获得的生产力感到惊讶。

它给我灌输了一种好奇心,点燃了我学习编程的激情。在这之前,我上过一些网络课程。但是我很难坚持这些课程的教学大纲,因为我更喜欢只学习那些我在工作中会用到的领域。此外,当我遇到我无法理解的编程错误时,我会感到沮丧和沮丧,并在没有完成它们的情况下放弃课程。

然而,在某个时候,我决定自己开始一个“代码 100 天”的挑战。我搜索了不同的学习主题资源,如数据分析、数据可视化、机器学习、统计、优化和空间分析。在某种意义上,我创造了自己的道路。在这个旅程中,我发现了媒体平台和数据科学。通过浏览博客帖子和教程并自己实现它们,我获得了很多知识。另外,我每天都记下我学到的东西。

除了自学之外,通过回顾我同事的代码,并接收他们对我的反馈,我在工作中也学到了很多。

作为一个在分析、政策、气候和可持续发展的交叉领域工作的人,拥有强大的编程和数据科学基础有什么优势?

拥有强大的技术和数据背景有多重优势。它使您能够不仅仅将数据视为一些任意的数字,而是可以从中提取有价值的见解的资源。它为你提供了进行不同定量分析的知识、技能和信心,这在这个领域是至关重要的。

在我的工作中,良好的技术和数据背景对于评估不同能源和气候政策的有效性和影响是必不可少的,例如国家确定的贡献。国家数据中心体现了任何国家减少国家排放和适应气候变化影响的努力。此外,良好的数据背景对于从数据中提取洞察力至关重要,这些洞察力与政策建议、商业和能源系统规划投资决策、气候诉讼等相关。

对于可能对社会和环境问题(无论是否与气候相关)感兴趣,但不确定如何着手的数据专业人员,您有什么建议吗?

研究表明,数据科学位于数学、计算机科学(编程技能)和领域专业知识的交叉点。三个方面缺一不全。

有不同的网站提供社会和环境问题的开源数据集,如我们的世界数据、世界银行开放数据、美国宇航局戈达德太空研究所的气候数据,或 Kaggle 的数据集。如果数据专业人员对社会和环境问题感兴趣,他们可以访问这些网站,选择自己喜欢的数据集,并开始使用它们。也有这些来源提供的分析,例如,我们的世界在数据中呈现的可再生能源,或者美国宇航局的全球表面温度分析。

一个人可以简单地通过阅读和试图理解这些分析来获得广泛的分析知识。此外,我还建议搜索媒体和数据科学方面的相关主题,浏览它们,创建关于某个主题的自己的故事,然后分享它。

与此相关的是,行业数据专业人员是否有办法围绕这些主题做出贡献,即使他们仍然留在企业界?

我见过不同的独立研究出版物和来自工业界或企业界人士的博客帖子。阅读他们的观点总是很有趣。在这些部门工作的人总是可以通过媒体、TDS 或社交媒体等平台做出贡献。

作为 TDS 的作者,你已经涵盖了与你的专业领域相关的主题,但也分享了关于更一般主题的指南和教程。你为什么开始为广大读者写作?

我喜欢记录我觉得独特而有趣的编程和可视化技术。在我的学习过程中,我意识到我可以通过结合我的编程知识和我的领域——可再生能源管理和气候政策分析——来创作不同的有趣故事。因此,我写了一些关于数据科学在我的领域中的应用的故事。

写作帮助我在一个地方组织知识。有几个例子,当我参考我自己的故事来执行一个特定的算法或可视化技术。我开始在 TDS 上写作和发帖,因为我认为我的内容可能对读者有所帮助,就像我浏览别人的故事一样。

展望未来一两年,你希望你所在的行业发生什么变化?

在数据科学/政策生态系统中,我看到不同的建模和分析工作将在未来几年开源。今天,读者希望自己检查数据和方法,而不是只看到任何分析工作的结果。例如,在 2022 年 1 月,国际能源机构表示他们愿意在几名科学家的努力下公开他们的数据。这是一个重要的声明,因为一些政府机构和研究人员依赖 IEA 的数据来分析能源系统,制定能源政策和投资决策。

我还看到,在以前依赖基本 Microsoft Office 应用程序的不同组织中,Python 等编程工具和用于可视化的商业智能(BI)工具的接受度和接受度都有所提高。我认为这与使用这些工具的多种应用、优势和自动化可能性有关,这些工具可以显著提高整个组织级别的效率。

要了解更多关于喜马拉雅的工作和探索她的最新文章,请关注他的 Medium 。为了快速介绍他在 TDS 方面的工作,下面是我们档案中的一些亮点:

  • </4-key-figures-to-understand-the-climate-crisis-f92b9a99abbe>(2021 年 10 月,7 分钟)
  • 欧洲发电排放强度(2021 年 3 月,10 分钟)
  • 用 Python 中的 NetworkX 解决德国旅行商问题(2022 年 6 月,12 分钟)
  • Python 地图中的网络与互联(2022 年 3 月,8 分钟)
  • 风能物理与资源评估用 Python(2022 年 1 月,8 分钟)

想和广大观众分享一些你自己的作品吗?我们很乐意收到您的来信。

这个 Q & A 是为了长度和清晰度而稍加编辑的。

数据管理员的座位最差

原文:https://towardsdatascience.com/data-stewards-have-the-worst-seat-at-the-table-e115ec65b639

意见

数据管理员的工作是不可能的。以下是为什么以及我们可以做些什么来增强他们的能力。

在他 2017 年的开创性博客文章中, 数据工程师 的垮台,Maxime Beauchemin 写道,数据工程师的座位最差。

从那时起,数据技术和团队发生了巨大的变化,现在,Apache Airflow 和 Apache Superset 的现任首席执行官和创造者对该行业的未来有了一个更光明的前景。

随着数据从仪表板扩展到机器学习模型、面向客户的应用程序和记录系统,我也看到了曾经是吃力不讨好的职位转变为公司价值的战略驱动力。

那么,如果数据工程师不再坐在最差的位子上,那么数据团队中的谁会继承这个不幸的头衔呢?

当你推断出 Maxime 的一些原始标准时——乏味的任务、低认知度、缺乏权威和操作蠕变的受害者—数据管家成为显而易见的选择。

在你发出愤怒的推特之前,我这么说不是出于对这些越来越挑剔的专业人士的鄙视。事实上恰恰相反。

数据管家角色旨在解决当今数据领域的一些最困难的挑战:治理、法规遵从性和访问。戴着这顶帽子的杰出人士已经盯着大数据风暴的眼睛,并向前迈出了一步。

不幸的是,他们很少成功。

原因如下。

数据管家的发展

正如我们今天所认识到的那样,2000 年代是第一次出现数据管理员角色的时代。无意中,这也是紧随万维网、电子邮件和个人电脑的广泛使用而出现的。

从一开始,数据管理员的角色就与数据治理和元数据管理紧密交织在一起。然而,管理者也在旨在驯服大数据“5 v”的计划中发挥了领导作用:数量、价值、多样性、速度和准确性。

这意味着像数据质量、可访问性、可用性、变更管理、商业智能和法规遵从性这样的职责通常属于管理者的权限范围。

在接下来的 15 年里,从高层管理人员的象牙塔中推出的、旨在对每一项数据资产进行编目的整体数据治理计划将在自身的重压下屈服。

然后在 2016 年,欧盟宣布了 GDPR ,这是一项突破性的、影响深远的数据隐私法规,对违规行为处以严厉的经济处罚。这将带来一波新的跨地区、跨国家、甚至跨州的以数据为中心的监管浪潮(你好 CCPA !).

为了遵从法规,组织意识到他们需要更好地了解他们的 PII 和敏感数据在哪里,以及这些数据是如何流经他们的系统的。

这其中很大一部分开始落到精通特定法规的信息安全和隐私团队身上,但它确实帮助数据管理员更接近行动。

数据团队比较

因为我们是数据人员,所以让我们在深入研究随着时间的推移使数据管理员角色变得不那么有吸引力的其他因素之前,让这个分析更加量化一点。

如果我们认为总搜索量是特定领域的需求和兴趣的粗略表示,我们可以看到数据管家在过去 6 年左右的时间里保持相对静态。

与此同时, 最差席位前数据工程师在 2016 年超过数据管家搜索量,同期增长 18 倍。

甚至像分析工程师这样较新的职位也有类似的工作量,但在过去 6 年里增长了 8 倍。

当然,搜索量并不能衡量一个角色的价值或整体的工作满意度。数据可靠性工程师和数据产品经理等新兴角色的搜索量较低,但对数据团队仍至关重要。

不可能的任务:数据管家

如果您选择接受,那么您的任务,即数据管家,就是记录公司中所有数据资产的传承、使用、合规性、业务逻辑、质量、访问、风险和价值,以及我们的政策和流程。

一如既往,如果你们在这个不断扩大的任务中失败,我们将否认对这些行为的任何责任。这项治理计划将在五个月后自毁。

换句话说,从数据管事的工作描述写出来的那一刻起,这些专业人员就发现自己完成任务的可能性很小。

虽然记录和编目关键资产和敏感数据是可能的,也是明智的,但是数据管理员或他们的领导经常采取最大化的方法。

对于管理和治理的最大化方法,过于强调策略(记录所有数据资产),而不是注重目标的实用方法(让我们轻松使用和理解我们的高价值数据)。

数据治理的过程也提出了一些棘手的问题,比如:什么是数据资产?企业中不同实体的关系和所有权是什么?为什么需要这个过程?

虽然一些数据领导者积极主动地与数据消费者一起定义需求并设置 SLA,但其他人只是外包给数据管理员(或数据保管人),并抱着最好的希望。

利用机器学习的现代数据解决方案——如数据目录、数据发现或数据可观察性解决方案——可以通过呈现关键元数据(如读/写、所有者、模式更改和团队对话)来使治理更加实用。

责任大,权力小

数据管理员的责任仍然存在,但是他们的权力已经不存在了。

随着现代数据平台的发展和数据价值的增长,数据团队变得更加专业化。

从数据运营专家和数据可靠性工程师到数据产品经理和分析工程师,数据管家的职责已经被新一代的数据专业人员所取代

系统变得越来越复杂,需要更多的技术知识来维护;收集有价值的见解变得更加复杂,需要更多的商业智慧;数据产品变得更有价值,需要更多的市场知识来预见未来的发展。

随着数据团队努力实现数据访问的民主化和实施自助服务机制,传统管家的另一个关键角色——守门数据——实际上已经消失了。

数据集的上下文信息在松散的渠道中快速、猛烈、随心所欲地发生,而不是忠实地记录在目录中。

来源。

dbt 等技术也发挥了作用,使工程师能够将原始数据整理到分析层。

所有这些过程都需要某种程度的治理,但是其中许多现在已经超出了数据管理员的控制范围。剩下的是其他人都不想要的责任:对数据和元数据进行记录、编目和分类。

提醒和催促过度工作的工程师记录他们已经从任务清单上划掉的项目是一项吃力不讨好但很重要的工作。鼓励数据团队遵循程序也是如此。

这让我想起了 Maxime 最初博客中关于数据工程师没落的一段话:

"现代团队行动迅速,无论您的组织是工程驱动型、项目管理驱动型还是设计驱动型,也无论它是否愿意将自己视为数据驱动型,数据工程师都不会经常工作。你必须将它视为一个基础设施角色,人们认为这是理所当然的,并在它被破坏或未能实现其承诺时引起他们的注意。”

一个被认为是理所当然的基础设施角色,除非它被打破或没有实现它的承诺?我们确定他指的不是数据管理员吗?

当数据管家成功时

让数据管家取得成功并不是让通才承担本应由专家承担的责任。

相反,我们应该认识到整个数据团队的权威已经开始分散(我敢说,数据网格?)和也分散了数据管理员的角色。

数据网格涉及分散的架构,数据团队的成员嵌入到业务的不同领域,这可以增加数据管理员成功完成任务的机会。图片由作者提供。

换句话说,如果您的团队有数据管理员,那么将他们嵌入到每个域中。

现代数据治理和管理方法还必须超越描述数据的到理解数据目的的。**

数据生产者描述资产的方式可能与数据消费者理解资产功能的方式大相径庭,甚至数据消费者之间在理解数据含义方面也可能存在巨大差异。

领域优先的管理方法可以更好地对文档进行优先排序,设置需求,并为业务运营工作流中的数据赋予共享的含义。

Clearcover 高级数据工程经理 Braun Reyes 描述了他的组织如何成功部署了类似的策略。

我们最初试图让数据治理更像一个集中化的功能,但不幸的是,这种方法并没有获得成功。

我们无法交付价值,因为更广泛的数据和分析组织中的每个团队都负责不同组件和不同复杂程度的数据资产。一刀切的集中式治理方法行不通,也不会扩展。

我们有了更多的联合方法,详见 数据网格原则 。每个数据域都有一个数据管理员,为数据治理之旅做出贡献。

现在,适当的激励措施已经到位。归根结底是所有权的问题。治理必须是每个人的问题,而且必须易于参与。

当每个生成数据的服务都是一个拥有数据和合同的人的域时,治理效果最好。

这是他们的数据,他们的企业关系图(ERD),以及他们记录如何使用这些数据的责任。我们仍处于早期阶段,但开始看到真正的结果和价值。

布劳恩的另一条建议?

用可追踪的指标设定具体目标。我们还实施了“管理分析”,例如,如果 50%的管理数据缺少文档,这种分析就会浮出水面。

然后,我们可以与该域的管理员进行对话,并找出如何删除阻止程序。

数据管家的未来

数据管家的演变让我想起了软件工程中 DevOps 的演变。

安全性和质量保证不是瀑布式流程中的独立阶段,而是在整个应用程序生命周期中自始至终紧密地集成在一起。

数据管理员可能会遇到类似的未来,他们被嵌入到数据运营团队中,并且他们的职责被广泛同化。毕竟,治理不是每个人的责任吗?

感受这种痛苦?我洗耳恭听

关于数据叙事,花艺设计师能教给我们什么

原文:https://towardsdatascience.com/data-storytelling-visualization-floral-design-6a1050607a2e

六节数据可视化课程,灵感来自成功插花的原则

来源:作者收藏

一开始可能并不明显,但是有很多方法可以讲故事。有没有考虑过花艺设计也是讲故事的?他们用鲜花就像数据说书人用数据来讲述他们的故事一样。让我们进入他们的世界,把灵感带到我们的世界。

北卡罗来纳州艺术博物馆有一个名为“盛开的艺术”的年度节日。这个想法是当地花艺设计师利用博物馆的杰作为自己的花艺设计汲取灵感。

来源:作者收藏

当地设计师乔迪·麦克劳德(Jody McLeod)和斯蒂芬妮·加勒特(Stephanie Garrett)讨论为春季设计美丽的花卉图案。讲座开始时,麦克劳德在谈论春天的太阳升起、鲜花开始绽放的时候是多么美好。他指着自己的花卉设计(如上图),解释了这个设计是如何讲述一个关于春天的故事。他说话的时候,我确实看到了太阳升起,春光初现。

是的,花艺设计师是讲故事的人。

但是在我思考之前,我在哪里听过这个相同的主题…可能在我读过的每一本数据故事书中。以下是两人分享的关于花卉设计的其他技巧,你可以在讲述故事时应用数据可视化。

提示 1:你是故事的雕塑家

加勒特展示了她雕刻花卉的布置。郁金香是这个过程中最容易使用的,因为它们变得柔韧。她打趣道“你知道郁金香有什么好处吗?没有人能告诉一朵郁金香该做什么。”

数据也是如此。你必须改变数据的形状,使其更适合你的设计,但是数据说什么就是什么。没有人能告诉数据这个故事是什么— 它向我们讲述了这个故事。

来源:作者收藏

不要害怕花时间将数据整理成你需要的形状——许多人没有意识到只有一小部分数据能说明问题。

这位艺术家重新创作了一幅印象派画作——莫奈的作品。花朵的选择模仿了印象派画家创造艺术的方式,是一层又一层的小笔触。如果这位设计师可以用花朵来绘画,你当然也可以用数据来绘画。

来源:作者收藏

技巧 2:展示重要的部分

设计师指出,很多时候你必须编辑一朵花或一株植物。他指的是去掉多余的叶子,这样花的美就更明显了。对于数据故事来说也是如此。当你试图解释你所有的信息时,没有一点是重要的。

想象一下,如果设计师把所有的叶子都留在这些花上——你会很快失去很多美丽。

编辑您的消息。

在下面的艺术作品中,这位设计艺术家很好地突出了画中的白色和粉色。虽然这看起来像是很多动作——颜色讲述了一个简单的故事——一家人在一起。

这样的安排让我想到了美丽、纯真、承诺和爱——这些都是感性的词语。在数据讲述中,情感联系非常重要。

来源:作者收藏

提示 3:一种颜色突出重要性

我真的很喜欢以多种花和颜色为特色的布置。在插花中,变化创造了整体美。有时,如果你使用一种颜色,它可以让眼睛专注于真正重要的东西。在许多布置中,设计师使用单一的花朵颜色,这就像用画笔将眼睛带到她想要的地方。

数据可视化也是如此。使用一种颜色有助于查看者比较这些值,而不是专注于颜色,这使您的信息毫不费力地出现。

鸟巢讲述了一个春天的故事,黄色的花让人联想到小鸟。正是这种简单的颜色吸引了你的注意力,小鸟的想法产生了情感联系。

来源:作者收藏

艺术品是蓝色的,你是否更关注它的形状?这就像当你有一个非常重要的单一价值时,它必须被强调。这一条信息几乎让你不知所措。

来源:作者收藏

这幅画也很简单,但是你的眼睛马上就能明白什么是重要的。你可以在故事中使用这种技巧——只要把你的注意力集中在主要信息上。

来源:作者收藏

提示 4:保持你的信息重点突出

这位设计师自嘲说,她的前几个设计“一团糟”,因为用了太多的东西。在这种情况下,观者不明白往哪里看,甚至没有时间去看花中的个体美。

这件艺术品让你有点紧张吗?我不确定什么是最重要的,艺术家想让我看哪里?插花可能做得更好——我知道重点放在中间的花。

来源:作者收藏

你真的希望你的数据故事集中在一个信息上,而不是吸引别人的注意力。这一点怎么强调都不为过——找到一个忙碌的设计很容易,但找到一个能很好地沟通的有吸引力的东西却很难。

提示 5:负空间强调你的观点

在这个安排中,设计师想利用负空间。树枝伸向天空,但它实际上只是给人一种高度的错觉。这被称为销售设计中的“空气”。然而,设计师强调了负空间在整体设计中的价值。

你的数据可视化也需要空间来突出重要的部分。在你的下一次数据可视化中,给负面信息留出更多空间,观察你的数据如何成为焦点。

这种安排看起来比实际要大,因为艺术家使用了负空间来给安排一个更长的感觉。我喜欢它的形状和背后的艺术品很相配。设计师花了很多心思让你看到她脑海中的形状。

来源:作者收藏

在下面的照片中很难看到,但在顶部有蓝色的杆,类似于画中的线条。增加杆会导致装置使用更多的空间。它扩展了故事,增加了丰富的细节。

许多数据故事讲述者不理解在他们的主要信息中添加细节的价值——细节必须增强信息。蓝棒并没有从主要的安排中抽离,它强调了作为一个方案的原色。

来源:作者收藏

技巧 6:颜色理论对数据可视化很重要

当你用花作画时,了解颜色是如何起作用的是很重要的。麦克劳德开始在他的布置中添加一些绿色植物,以展示粉色花朵如何从这种苍白的绿色中变得更加突出。他花了几个小时学习颜色如何混合以及什么不能混合。他指出这是一个持续的学习过程,需要数年才能掌握。(数据可视化也是如此。)

来源:作者收藏

色彩理论对所有设计师来说都很重要。我们都见过以奇怪的颜色选择为特色的数据可视化。很奇怪,因为这让你觉得不舒服,你一开始也不明白为什么。

就像上面那幅忙碌的三位女士的画一样,我认为颜色的选择并不相配。在这幅画中,画家可能是故意让观者感到不舒服。

数据故事讲述是关于数据可视化的

你的数据故事实际上是展示最终的数据。正如这些花艺设计师用花来讲述一个故事,帮助你了解花的重要之处——你可以用数据来帮助你的观众了解什么是重要的。

数据团队规模越来越大,速度越来越快

原文:https://towardsdatascience.com/data-teams-are-getting-larger-faster-dec2af9d17ff

数据团队规模与复杂性的关系

高增长公司的数据团队正在变得越来越大,一些最好的科技公司正在接近 1:2 的数据与工程师比率。

更多的数据人意味着更多的分析、更多的见解、更多的机器学习模型和更多基于数据的决策。但是更多的数据人员也意味着更多的复杂性、更多的数据模型、更多的依赖性、更多的警告和更高的期望。

当一个数据团队很小的时候,你可能会受到资源的限制,但是事情感觉很简单。每个人都认识每个人,你对数据堆栈了如指掌,如果有任何问题,你可以立即解决。

但是当一个数据团队超过 10 人时,就会发生一些事情。您不再知道您使用的数据是否可靠,谱系太大而难以理解,最终用户每隔一天就开始抱怨数据问题。

从那以后就不会变得容易了。当数据团队达到 50 人时,你开始有你从未见过的新成员,已经离开公司的人仍然被标记在关键警报中,每天的管道只在上午 11 点完成,让利益相关者抱怨数据从来没有按时准备好。

这是怎么发生的?

随着规模的扩大,数据变得更加困难。

作者图片

数据谱系变得难以管理。将数据谱系可视化仍然是获得所有依赖关系和数据流动方式的最佳方式。但是当您超过数百个数据模型时,这个谱系就失去了它的用途。在这种规模下,你可能有数百个依赖关系的模型,感觉更像是一团意大利面条,而不是有用的东西。随着可视化依赖关系变得越来越困难,推理所有东西如何组合在一起以及知道瓶颈在哪里也变得越来越困难。

管道一天比一天慢。你有太多的依赖,以至于你不再知道什么依赖于什么。在你意识到之前,你会发现自己陷入了一个很难摆脱的困境。某个人在不知道后果的情况下做了一个奇怪的连接,使得具有数百个下游依赖项的上游数据模型慢了 30 分钟。您的数据管道逐渐退化,直到利益相关者开始抱怨数据在中午之前永远不会准备好。在那种情况下,你不得不放下一切去修复它,花上几个月的时间在一些本可以避免的事情上。

数据警报变得越来越难以管理。如果你运气不好,被数百个警报所困,人们会将#data-alerts 频道静音,或者分析师会完全停止编写测试(小心破碎的窗户)。如果您更幸运,您会收到更少的警报,但仍然发现很难管理数据问题。不清楚谁在看哪个问题。您经常会浪费时间查看已经标记给上游工程团队的数据问题,他们将在下周修复根本原因。

最大的数据挑战是组织 。有了规模,你就有了集中运营,嵌入式和混合运营的团队。你不再认识团队中的每个人,在每次全体会议中,都有许多你从未听说过的新成员,你从未见过的人依赖于你一年前创建的数据模型,并不断带着问题来找你。随着新人的加入,他们发现越来越难以理解所有的东西是如何组合在一起的。你最终会依赖同样的几个数据英雄,他们是唯一了解所有东西如何组合在一起的人。如果你失去了其中一个,你甚至不知道从哪里开始。

作者图片

以上都是越来越多的数据团队面临的挑战。许多接近 IPO 阶段的成长型公司的数据团队已经超过了 100 人。

如何处理规模

如何处理大规模的数据团队是每个人都在努力解决的问题。以下是我在一个接近 100 人的数据团队中的一些观察。

拥抱它。第一部分是接受这样一个事实:随着规模的扩大,事情会变得越来越困难,不会像你只有五个人时那么容易。你的业务要复杂得多,依赖性成倍增加,你可能会因为准备 IPO 而受到监管机构的审查,而这是你以前没有的。

如果事情感觉很难,那没关系,他们可能应该这样做。

像一群小团队一样工作。当团队扩展时,最大的问题是数据堆栈仍然被视为每个人的责任。

根据经验,新加入者应该能够清楚地看到对他们重要的数据模型和系统,但更重要的是知道他们不需要注意什么。应该清楚你依赖于其他团队的哪些数据模型。一些数据团队已经开始在只向他们团队以外的人公开某些精心制作的数据模型方面取得进展。

不要让所有数据成为每个人的问题。有些人从复杂的类似建筑的工作中茁壮成长,例如改善管道运行时间。但一些最优秀的数据分析师更像夏洛克·福尔摩斯,当他们能够在数据堆中挖掘见解时,会大放异彩。

避免混合太多。如果您的数据分析师花费 50%的时间调试数据问题或整理管道性能,您可能应该投资更多,将这一职责分配给擅长(并喜欢)这类工作的数据工程师或分析工程师。

不断增长的数据团队将会持续存在,而我们仅仅触及了我们应该如何实现这一目标的皮毛。如果你对此有任何想法,让我知道!