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

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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据错误&如何修复它们

原文:https://towardsdatascience.com/data-bugs-how-to-fix-them-610f73296aaa?source=collection_archive---------56-----------------------

卡梅隆·巴恩斯在 Unsplash 上的照片

数据科学家从痛苦的经历中知道,代码中的错误通常不是大难题。根据错误的经典定义,数据本身包含错误——意外的行为,通常是由错误的假设导致的。

在这篇文章中,我想分享我个人的一个数据错误的故事,它非常能说明你在数据科学工作中会遇到的错误类型。

在 DAGsHub,我们正在创建工具,使这些错误更容易修复。我将展示我如何在这个具体的案例中应用这些工具。修复数据错误是一个具有挑战性的过程,工具也没有我们想象的那么神奇。 我们马上就到! 😉

背景

我们为 DAGsHub 制作的第一个教程是一个“标准的”MNIST 教程。

这很好也很简单——也许太简单了!许多用户评论说,他们厌倦了 MNIST 的教程,它们根本不代表现实——数据已经是干净的、平衡的、有标签的、统一的。这只是简单的图像。看到 MNIST 的教程会立刻打消他们的兴趣,因为他们觉得你可以用 MNIST 把任何东西变得好看,不管它实际上是好是坏。

因此,我们决定基于真实世界的数据创建一个新的教程。我们决定使用 StackExchange API 来生成一个 CSV 文件,该文件包含来自许多问题的数据,特别是来自 CrossValidated 的数据,该数据处理有关统计的问题。这些问题包括文本和表格元数据。要预测的标签是“这是否被标记为机器学习问题?”,你可以很容易地把它想象成一个为写问题的用户提供的推荐系统,或者一个在后端 BI 或自动化中使用的工程化功能。标签也非常不平衡,只有 10%的正面标签。

简而言之,这个新教程比 MNIST 更忠实地代表了现实。

问题是

当我生成原始数据时,我没有考虑按日期排序——我只是错误地认为我将从网站的历史记录或最新问题中获取所有问题。哎呀。我想我们都曾经历过这种情况。

我最终得到的是 50,000 个样本,这是 API 愿意返回的上限。更糟糕的是,样本在时间上分布不均匀!如果这是一个完全随机的选择,那就更好了。但我甚至没有那么幸运。我不知道是什么样的奇怪采样导致了我实际得到的时间分布:

数据科学家的 pic 前后—比较数据时间分布。作者图片

底线——虽然我成功地在数据上建立了一个像样的模型,但我使用的数据却被破坏了。我有一个完全与数据相关的错误,我的代码没有任何改变可以修复它。我需要完全替换数据。在其他情况下,也许我会发现有一部分数据只需要手动丢弃。这类故事在现实生活中很常见。

在 Github 上这个场景可以做什么?

  • 案例 1: 数据存储在一些外部存储器中,比如 S3,下载它的 URL 作为代码的一部分保存在 Github 上。在这种情况下,我可以转到存储桶并替换存储在那里的数据。然而,我会丢失旧数据,甚至更糟的是,我会丢失数据版本和现有代码之间的关系!后来,弄清楚我的代码、实验和结果模型的哪个版本来自于这些破碎的数据变得非常困难。我很可能会忘记,即使不会,当我休假或离开公司时会发生什么?谁想拿我的工作,谁就注定要失败。
  • 案例 2: 如果我在 S3 上创建一个新版本的数据,将其命名为data_v2.csv,并在我的代码中更改 URL,会怎么样?欢迎来到版本地狱:

欢迎来到版本地狱。照片由 PhDComics 拍摄

  • 案例 3: 我们使用 Git-LFS。Git-LFS 是 Git 的一个扩展,它允许你有效地对大文件进行版本控制。它不完全是 Git 的一部分——不支持 diffs 和 merges 之类的东西,因为在大数据上计算它们太昂贵了。此外,您需要一台能够处理 LFS 的专用服务器。幸运的是,GitHub 做到了这一点。不幸的是,仍然存在问题——您为 LFS 获得的存储量是有限的,并且它几乎不是一个成熟的数据存储解决方案。我更愿意将这些大文件存储在一些合适的云存储中,并找到一种方便的方法将它们链接到我的 Git repo。更重要的是,当你试图比较这些大文件的版本时,GitHub 提供的信息非常有限。逐行比较是不实际的,但我觉得有比这更有用的东西要说:

Git-LFS 数据差异(修改的行数也不正确—文件要大得多)。作者截图,来自 GitHub

即使上述所有技术问题都解决了,还有一个人的方面被完全忽略了——改变数据的影响是什么?好的,文件已更改,但这如何影响我的指标?现在数据分布不同了吗?我有没有想看的之前和之后的可视化效果?在 vanilla Git 和 Github 中,我只能有意义地比较文本和一些图像。

你能在 DAGsHub 上做什么?

我们依靠 DVC 将你的数据文件连接到你的 Git 提交——类似于 Git-LFS,但更灵活,允许你将数据存储在你自己的云存储上,并有许多其他很酷的数据科学特定功能。

DAGsHub 允许您查看笔记本和直观的笔记本差异,这有助于您理解底层数据,并创建数据版本的自定义可视化比较。您还可以查看一些数据格式的内容(更多内容即将推出),作为 UI 的一个集成部分。我们的目录区分功能也使得比较大型数据集成为可能。最后,专门针对这样的问题,我们创建了数据科学拉请求,它让您可以对数据执行与对代码相同的审查过程。

有了这些工具,我现在可以用新的、正确的版本替换我的数据文件,使用 DVC 和 Git 提交新版本,瞧!数据现在是固定的…

…嗯,差不多了。我仍然需要将数据推送到我的遥控器上,否则,这个项目对于没有我的笔记本电脑的人来说是毫无用处的。

建立云存储很难

好了,现在我们可以获得一个版本控制的数据拉取请求,用有意义的数据科学信息来指导决策。我们的数据存储在具有世界规模容量的成熟存储设备上。太棒了。

但是,让我们面对现实吧——建立云存储是一件痛苦的事情。信用卡?我是?存储桶保留策略?服务帐户?

Blech🤢!

这太难了。如果我们希望开源数据科学蓬勃发展,我们必须让它更容易获得。善意的人会希望帮助找到并修复 bug,但是我们不应该强迫他们去钻牛角尖。摩擦是创造力和生产力的杀手。

它应该像 git push 一样简单,访问控制应该自动处理。

我们正在 DAGsHub 努力工作,以使这成为现实(敬请期待更多)。

摘要

在现实生活中,数据是杂乱的,无论您需要迭代代码还是模型,您都需要迭代数据和注释。回到老派版本地狱不是一个解决方案。数据应被视为版本受控的源代码,对数据的修改应经历与其他所有事情相同的审查过程。不仅如此——为了实现真正的开源,我希望任何人都能对我的数据做出修正。

数据目录 3.0:现代数据栈的现代元数据

原文:https://towardsdatascience.com/data-catalog-3-0-modern-metadata-for-the-modern-data-stack-ec621f593dcf?source=collection_archive---------3-----------------------

是时候采用现代元数据解决方案了,这种解决方案与现代数据堆栈的其他部分一样快速、灵活且可扩展

照片由哈尼恩·克里姆利拍摄

2020 年给我们的日常词汇带来了很多新词——想想冠状病毒德方德说大话。但是在数据世界中,另一个短语正在流传… 现代数据堆栈

数据世界最近围绕着处理海量数据的最佳工具集,也就是“现代数据堆栈”而汇聚起来。这包括在同类最佳的工具上建立数据基础设施,如用于数据仓库的 Snowflake ,用于数据湖的 Databricks ,以及用于数据接收的 Fivetran

好的方面?现代数据堆栈速度超快,易于在几秒钟内扩展,并且几乎不需要开销。坏事吗?在将治理、信任和上下文引入数据方面,它仍然是一个新手。

这就是元数据的用武之地。

那么现代元数据在今天的现代数据堆栈中应该是什么样子呢?基本数据目录如何发展成为数据民主化和治理的强大工具?为什么元数据管理需要范式转变才能跟上当今的需求?

在过去的一年里,我与 350 多位数据领导者交谈过,了解他们在现有元数据管理解决方案方面面临的基本挑战,并构建了现代元数据管理的愿景。我喜欢把这种方法叫做**数据目录 3.0 **

为什么现代数据堆栈比以往任何时候都更需要“现代”元数据管理?

几年前,数据主要由组织中的 IT 团队使用。然而,今天的数据团队比以往任何时候都更加多样化-数据工程师、分析师、分析工程师、数据科学家、产品经理、业务分析师、公民数据科学家等等。这些人中的每一个人都有自己喜欢的、同样多样化的数据工具,从 SQL、Looker 和 Jupyter 到 Python、Tableau、dbt 和 r。

这种多样性既是一种力量,也是一种奋斗。所有这些人都有不同的处理问题的方式、工具、技能、技术堆栈、工作方式……本质上,他们每个人都有独特的“数据 DNA”。

结果往往是协作中的混乱。令人沮丧的问题,如“这个列名实际上是什么意思?”以及“为什么仪表盘上的销售数字又错了?”当快速团队需要使用数据时,让他们慢半拍。

这些问题并不新鲜。毕竟,Gartner 发布元数据管理解决方案魔力象限已经超过 5 年了。

但是还是没有好的解决办法。大多数数据目录只不过是 Hadoop 时代的创可贴解决方案,而不是与当今现代数据堆栈背后的创新和进步保持同步。

元数据管理的过去和未来

就像数据一样,在过去的三十年里,我们对元数据的思考和处理方式也在稳步发展。它可以大致分为三个发展阶段:数据目录 1.0、数据目录 2.0 和数据目录 3.0。

数据目录 1.0:IT 团队的元数据管理

时间:20 世纪 90 年代和 21 世纪初
产品:Informatica、Talend

Informatica 在 2012 年的元数据管理器。(来源)

从技术上来说,元数据从古代就已经存在了——例如亚历山大图书馆的每一卷卷轴上都贴有描述性标签。然而,元数据的现代概念可以追溯到 20 世纪后期。

在 20 世纪 90 年代,谢天谢地,我们把软盘放在一边,接受了这个叫做互联网的新奇工具。很快,大数据和数据科学风靡一时,组织试图找出如何组织他们新收集的数据。

随着数据类型和格式以及数据本身的爆炸式增长,IT 团队负责创建一个“数据清单”。像 Informatica 这样的公司在元数据管理方面处于领先地位,但是对于 IT 人员来说,建立和保持新的数据目录是一项持续的斗争。

“数据仓库团队经常花费大量时间谈论、担心元数据,并对元数据感到内疚。由于大多数开发人员天生厌恶文档的开发和有序归档,元数据经常被从项目计划中删除,尽管每个人都承认它很重要。

拉尔夫·金博尔,2002 年

数据目录 2.0:由数据管家提供支持的数据清单

时间:2010 年
产品:Collibra,Alation

2019 年 Alation 的数据目录。(来源)

随着数据变得越来越主流,并在 IT 团队之外传播,数据管理的理念开始生根发芽。这指的是一组专门负责管理组织数据的人。他们将处理元数据,维护治理实践,手工记录数据,等等。

与此同时,元数据的概念也发生了变化。随着公司开始建立大规模的 Hadoop 实施,他们意识到简单的 IT 数据清单已经不够了。相反,新的数据目录需要将数据清单与新的业务环境结合起来。

就像这个时代超级复杂的 Hadoop 系统一样,Data Catalog 2.0s 很难设置和维护。它们涉及僵化的数据治理委员会、正式的数据管理员、复杂的技术设置和漫长的实施周期。总而言之,这一过程可能需要长达 18 个月的时间。

这个时代的工具基本上是建立在整体架构之上,并在内部部署。每个数据系统都有自己的安装,公司不能通过简单的云更新来推出软件变更。

技术债务增加,元数据管理开始逐渐落后于现代数据堆栈的其他部分。

元数据范式转变的需要

虽然数据基础架构堆栈的其余部分在过去几年中不断发展,并且 Fivetran 和 Snowflake 等工具允许用户在不到 30 分钟的时间内建立一个数据仓库,但数据目录却跟不上。即使是试用 Data Catalog 2.0 时代的元数据工具,也需要大量的工程时间来进行设置,更不用说与销售代表进行至少 5 次通话来获得演示了。

由于缺乏可行的替代方案,现代数据堆栈的最早采用者和大多数大型科技公司都求助于构建自己的内部解决方案。一些著名的例子包括 Airbnb 的 Dataportal ,脸书的 Nemo ,LinkedIn 的 DataHub ,Lyft 的 Amundsen ,网飞的 Metacat ,以及优步的 Databook

然而,并不是所有的公司都有这样的工程资源,构建几十个类似的元数据工具并不是特别高效。

是时候采用现代元数据解决方案了,这种解决方案与现代数据堆栈的其他部分一样快速、灵活和可伸缩。

数据目录 3.0:面向不同数据用户的协作工作区

今天,我们正处于元数据管理的转折点—从缓慢的内部部署数据目录 2.0 向新时代数据目录 3.0 的转变。就像从 1.0 到 2.0 的跳跃一样,这将是我们如何看待元数据的一个根本性转变。

Data Catalog 3.0 的外观和感觉与 Data Catalog 2.0 一代中的前辈不同。相反,Data Catalog 3.0s 将建立在嵌入式协作的前提下,这是当今现代工作场所的关键,它借鉴了 Github、Figma、Slack、incidence、Superhuman 和其他当今常见的现代工具的原则。

想象数据目录 3.0 的用户体验。(图片提供:亚特兰蒂斯)

数据目录 3.0 的 4 个特征

1.数据资产>表格

Data Catalog 2.0 一代的构建前提是“表”是唯一需要管理的资产。但现在完全不同了。

如今,BI 仪表盘、代码片段、SQL 查询、模型、特性和 Jupyter 笔记本都是数据资产。

3.0 代元数据管理需要足够灵活,以便在一个地方智能地存储和链接所有这些不同类型的数据资产。

2.端到端的数据可见性,而不是零敲碎打的解决方案

数据目录 2.0 时代的工具在改进数据发现方面取得了重大进展。然而,他们没有给组织一个“真实的单一来源”的数据。关于数据资产的信息通常分布在不同的地方——数据沿袭工具、数据质量工具、数据准备工具等等。

Data Catalog 3.0 将帮助团队最终实现圣杯,即关于组织中每个数据资产的真实信息的单一来源。

3.为元数据本身就是“大数据”的世界而构建

我们正在快速接近一个元数据本身将成为大数据的世界。能够处理和理解元数据将帮助团队更好地理解和信任他们的数据。

这就是为什么新的 Data Catalog 3.0 应该不仅仅是元数据存储。

它应该从根本上利用元数据作为一种数据形式,可以像所有其他类型的数据一样进行搜索、分析和维护。

今天,云的基本弹性使得这一点前所未有地成为可能。例如,查询日志只是当今可用的一种元数据。通过解析 Snowflake 中查询日志的 SQL 代码,可以自动创建列级血统,为每个数据资产分配流行度分数,甚至推断每个资产的潜在所有者和专家。

4.嵌入式协作时代来临

Airbnb 在分享他们关于推动采用内部数据门户的经验时说了一些深刻的话:“设计数据工具的界面和用户体验不应该是事后的想法。”

由于数据团队的基本多样性,数据工具需要设计成与团队的日常工作流程无缝集成。

这也是嵌入式协作真正活跃起来的地方。嵌入式协作是指工作发生在你所在的地方,摩擦最少。

如果您可以在获得链接时请求访问数据资产,就像使用 Google Docs 一样,而所有者可以在 Slack 上获得请求,并在那里批准或拒绝它,会怎么样?或者,如果当您检查数据资产并需要报告问题时,您可以立即触发与您的工程团队的 JIRA 工作流完美集成的支持请求,该怎么办?

嵌入式协作可以统一几十个浪费时间、造成挫折、导致数据团队工具疲劳的微工作流,而不是让这些任务变得令人愉快!

下一步是什么?

任何处理数据的人都知道,数据目录早就应该赶上现代数据堆栈的其余部分了。毕竟,如果没有使数据变得可理解的资产——文档、查询、历史、词汇表等等,数据是毫无意义的。

随着元数据本身成为大数据,我们正处于元数据管理变革性飞跃的风口浪尖。虽然我们还不了解 Data Catalog 3.0 时代的一切,但很明显,在未来几年,现代元数据管理产品将会崛起,在现代数据堆栈中占据应有的位置。

想了解更多关于第三代数据目录的信息吗? 查看我们的电子书

发现此内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。

以数据为中心的人工智能竞赛——前 5%完成的提示和技巧

原文:https://towardsdatascience.com/data-centric-ai-competition-tips-and-tricks-of-a-top-5-finish-9cacc254626e?source=collection_archive---------23-----------------------

由吴恩达和 DeepLearning 组织的竞赛中排名第一的提交材料的技术。人工智能

卡伦·艾姆斯利在 Unsplash 上的照片

数据是人工智能的食物,通过从以模型为中心转向以数据为中心的方法,模型性能的改善有巨大的潜力。这就是最近由吴恩达深度学习组织的 以数据为中心的人工智能竞赛 背后的动机。AI 。

在这篇文章中,我分享了我的 Top 5% 提交的技巧(约 84%的准确率)、可行和不可行的方法,以及我和其他高级参与者从实验中获得的经验。

内容

【1】竞赛目标实验跟踪(3)技巧我的最佳投稿**

照片由 Pietro MattiaUnsplash 上拍摄

(1)竞赛目标

在传统竞赛中,数据集是固定的,而参与者竞争构建高性能的高级模型架构。

这场比赛打破传统,由固定模型** ( ResNet50 )代替数据集。因此,参与者需要通过使用标签校正和数据扩充等技术来改进数据。**

该数据集包含 2880 幅手写罗马数字图像,范围从 1 到 10(即 IX)。数据被分成训练集和验证集,每个集合包含对应于十个数字的子文件夹。

十种罗马数字图像样本|作者根据公开比赛数据整理

目标是改进图像数据集,使得模型(当针对隐藏测试集进行评估时)能够以最高可能的准确度识别罗马数字标签。

(2)实验跟踪

而不是使用先进的 ML 跟踪工具(如 MLFlowW & B 等。)对于实验管理,我选择了老式的微软 Excel,因为它非常适合这些简单的任务。

目的是记录每一个变化的影响,并用它来指导随后的实验。下面是我使用的电子表格模板的快照:

用于实验跟踪的电子表格模板|作者图片

(3) 我的最佳投稿技巧

你可以在这个 GitHub repo 内的'Full _ Notebook _ Best _ submission . ipynb' Jupyter 笔记本中找到我的最佳提交的代码,所以可以查看一下,进行全面的逐步演练。

我不会用每一步的细节来淹没你,我会把重点放在四个最有影响力的技巧上。

(I)结合训练和验证数据

在数据探索过程中,我发现验证集中的图像比训练集中的图像更清晰,更能代表数字。

因此,我将来自训练和验证** 的图像组合起来,将放入一个单独的文件夹中,以实现更均衡的分布。**

还有一个单独的label_book文件夹,包含每个标签的五个“最佳”示例。我还将这些理想样本放入数据集,以丰富数据集。

注意:虽然对训练集和验证集的视觉检查在技术上并不严格,但GoDataDriven团队创建了一个嵌入的可视化来证明它们之间风格分布的差异。你可以在这里找到 UMAP 的*https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img/https://godatadriven.com/wp-content/uploads/2021/08/altair.png***

照片由蒂姆·莫斯霍尔德Unsplash 上拍摄

㈡注重数据清理

考虑到这是一场以数据为中心的竞争,可以预计会有大量的工作进入数据清理。在这个过程中有两种主要的问题需要处理:

  • 无关图像

与十个罗马数字无关的图片示例|由作者根据公开比赛数据编辑

这些嘈杂的不相关的例子被移到一个单独的文件夹中从模型训练中排除。虽然这缩小了数据集的大小,但记住数据质量胜过数据数量是至关重要的。****

  • 误贴图片

贴错标签的图片示例|由作者根据公开竞赛数据编辑

根据我的判断,我把贴错标签的图片放到了合适的文件夹里。我自己进行数据清理的好处是在重新标记过程中引入了一致性,这是关键,因为许多例子都是高度不明确的。****

我通过使用拖放方法和两个并排打开的窗口,尽可能简单地执行数据清理。****

(较宽的)左边窗口突出显示图像,而右边窗口列出了我可以将图像移入的不同文件夹。

我删除或重新标记图像的拖放方法。我的宽屏显示器当然让我更容易执行。|作者图片

㈢有针对性的翻转

我利用 imgaug 进行数据增强,因为我发现它有更广泛的增强器选项。应用了一系列涉及以下变换的普通增强:

作者从增强|图像的一般序列转换的示例

上面的顺序相当标准,所以没有太多讨论。(详情可参见 GitHub 回购 )

更有趣的是,我采用了一种有针对性的随机翻转方法。根据标签的不同,我应用了水平翻转(fliplr)、垂直翻转(flipud)、两个,或者****

在所有这些翻转中,最重要的事情是确保生成的增强图像仍然类似于原始的罗马数字。

  • 水平和垂直翻转: i、ii、iii、x

这四个标签(I、ii、iii、x)适合两种类型的翻转,因为得到的图像看起来仍然像原始数字。

标签为“ii”|作者图片的水平+垂直翻转示例****

  • 仅水平翻转: v

对于标签 v ,只有水平翻转才有意义。

标签为“v”|作者图片的水平翻转示例****

  • 仅垂直翻转: ix

对于标签 ix ,只有垂直翻转才有意义。

标签为“IX”|作者图片的垂直翻转示例****

  • 无烙: 四、六、七、八

对于剩余的标签,执行任何形式的翻转都会导致无法识别或不正确的数字。因此,没有为带有这些标签的图像编写翻转脚本。

㈣最大限度地限制数据集的大小

每次提交最多可提交 10,000 张图片。回想一下,原始数据集只有 2,880 个,因此尽可能增加我们的数据大小是有意义的。

我为 10 个标签中的每一个设置了 1,000 个图像的目标大小,以实现平等的表示。这是通过用在原始图像上随机增加产生的新图像来补充每个标签的数据来完成的。

通过以上技术,我实现了 83.97% (前 5%,排名 24)的模型准确率。这一准确性显著高于基线(64.4%),距离 85.82%的中标提交仅< 2%。

我在排行榜上的最终位置|作者图片

(4)什么没有起作用

以下是我尝试过的一些技术,这些技术似乎没有改善数据集:

  • 增加图像的大小(例如 500 x 500)
  • 在增加步骤的序列中引入随机顺序
  • 应用形态学操作(例如,膨胀/腐蚀、Otsu 阈值处理)
  • 进一步增加增强的强度,例如更剧烈的旋转、剪切、对比等。
  • 将数据集加满到 10,000 时,确保每张图像至少增加一次。

(5)最好的想法

其他参与者所使用的创造性技术给我留下了深刻的印象,也让我感到谦卑。以下是一些已发表的例子:

还有一个赛后论坛线程充满了精彩的想法。

如果您遇到其他排名靠前的创新解决方案,请告诉我,我很乐意将它们添加到这个列表中。

absolute visionUnsplash 上拍摄的照片

(6)学习要点

  • 简单不等于低质量。虽然与其他提交的方法相比,我的方法很简单,但它们仍然产生了出色的结果,并且优于许多其他创新技术。我希望这对任何热衷于尝试以数据为中心的技术的人都是一种鼓励。
  • 在数据科学领域,一个问题有许多解决方案,所以不要害怕尝试你所有最疯狂的想法。
  • 平衡收益和成本很重要。当我发现我剩下的想法并没有提高准确性时,我决定不投入额外的时间和精力进行实验,因为回报是递减的。
  • 以数据为中心的方法无疑会越来越受欢迎,尤其是因为建模只是整个 ML 管道的一小部分。

在你走之前

欢迎您加入我的数据科学学习之旅!点击此媒体页面,查看我的 GitHub ,了解更多精彩的数据科学内容。****

你可以在这里 找到这篇文章 的 GitHub 回购。同时,享受采用以数据为中心的方法的乐趣!

***** *****

以数据为中心与以模型为中心的人工智能?答案很清楚

原文:https://towardsdatascience.com/data-centric-vs-model-centric-ai-the-answer-is-clear-4b607c58af67?source=collection_archive---------11-----------------------

目前人工智能的方法有问题。但是有一个解决办法。

布兰登·洛佩兹在 Unsplash 上的照片

通常在笔记本和学习材料中,你会发现很多通过参数优化来提高机器学习模型准确性的方法。这只能让你到此为止。

在现代机器学习中,数据就是一切,但在人工智能项目中,数据经常被忽视,也没有得到妥善处理。结果,数百个小时被浪费在优化基于低质量数据的模型上。这就是为什么您的模型的准确性明显低于预期的主要原因——这与模型调整无关。

不要让这种事发生在你身上。

每一个 AI 解决方案都由两部分组成:代码(模型)和数据。库让你为相同的结果编写越来越少的代码,但是没有人能告诉你如何充分准备数据。这是以数据为中心的方法的一般要点。更多的细节在一点。

今天的文章回答了以下问题:

  • 什么是以数据为中心的 AI?
  • 数据数量与数据质量——你应该选择哪一个?
  • 哪里可以找到好的数据集?

什么是以数据为中心的 AI?

吴恩达的话再次充满智慧。在他在 YouTube 上长达一小时的会议中,Andrew 做了一个特别的陈述,这确实击中了要害:你的模型架构已经足够好了

这是有意义的——天才团队致力于模型架构(想想 ResNet、VGG、EfficientNet…) —所以可以肯定他们做了正确的功课。不要试图改进他们的工作,这是一个你不想对抗的风车。

话虽如此,你的机器学习方法可以是以模型为中心的,也可以是以数据为中心的:

  • 以模型为中心的方法:询问如何改变模型以提高性能。
  • 以数据为中心的方法:询问如何改变或改进数据以提高性能。

以模型为中心的方法对从业者来说更有趣。这很容易理解,因为实践者可以直接应用他们的知识来解决特定的任务。另一方面,没有人想整天标记数据,因为这被视为一项乏味的低技能工作。

别做那种人。数据和模型一样重要,甚至更重要。

在同一个 YouTube 会议上,Andrew 提出了另一个让你思考的观点:在最近的出版物中,99%的论文是以模型为中心的,只有 1%是以数据为中心的

事实证明,大多数性能提升都是通过以数据为中心的方法实现的。例如,请看下面的图片,它取自上述会话:

图 1 —基线、以模型为中心和以数据为中心的方法性能比较(图片由作者提供)

我不太了解钢铁缺陷检测、太阳能电池板,也不了解表面检测,但当我看到一个时,我知道准确性的提高。以模型为中心的方法对基线提供了零或接近零的改进,但是可能花费了从业者数百小时的时间。

总结一下——不要试图比一屋子的博士更聪明。相反,在尝试改进模型之前,请确保您的数据质量是一流的。

数据数量与数据质量

数据量代表可用的数据量。通常的方法是收集尽可能多的数据,并留给神经网络来学习映射。

稍后我会分享我的顶级网站来寻找好的大型数据集,但让我们在 Kaggle 上探索平均数据集大小。如下图所示:

图 Kaggle 上数据集大小的分布

如您所见,大多数数据集并没有那么大。在以数据为中心的方法中,数据集大小并不太重要。当然,你不能在三张图片上训练一个神经网络,但重点是转移到质量上,而不是数量上。

数据质量就是质量。如果你没有成千上万的图片也没关系——它们的高质量和正确的标签是至关重要的。

看一下下面的例子,它显示了数据贴标签机如何为对象检测任务的图像贴标签:

图 3 —绘制物体检测边界框的不同方法( i 作者的图像)

想迷惑一个神经网络?这很简单——只要给东西贴上不一致的标签。如果你关心数据质量,严格的标注规则是必不可少的。尤其是当你有多个贴标机的时候。

然而,一个问题仍然存在— 多少数据是足够的?

这比你想象的要难回答。大多数算法在文档中都有最小的推荐数据点数。例如, YOLOv5 推荐每类至少 1500 张图片。我已经设法用较少的样本得到了好的结果,但是准确性肯定会随着更多的训练样本而提高。

总而言之,拥有丰富的数据是额外的好处,而不是必须的。只要在较小的数据集中提供较高的数据质量,您就可以事半功倍。

哪里可以找到好的数据集?

现在,我们将探索两种资源,您可以通过它们免费下载高质量的数据集。第一个是数据科学社区的知名人士,而另一个是专门从事特定领域的新人。

卡格尔

是的,你几乎可以在 Kaggle 上找到任何东西。这是一个用于查找任何来源的数据集(表格、图像等)的既定资源。

图片 4 — Kaggle 数据集主页(图片由作者提供)

如果你是数据科学和机器学习的新手,Kaggle 是一个不错的起点。它也非常适合那些想在比赛中试试运气的人。如果你赢了,这些也可能是经济上的好处。

Graviti 开放数据集

这是这个街区的新成员。 Graviti 提供了一系列高质量的数据集,主要用于计算机视觉。

图 5 — Graviti 开放数据集主页(图片由作者提供)

有超过 1100 个数据集可用,但并不是所有的数据集都最终确定。然而,他们的团队每天都在增加新的数据集,所以未来看起来很光明。例如,下面是他们的 nuScenes 数据集通过可视化功能可视化后的样子:

图片 6 —重力核场景数据集(图片由作者提供)

如您所见,该网站易于使用,并为您提供了在线浏览数据集或本地下载数据集的选项。

包扎

现在你有了它——对以数据为中心的人工智能方法的基本介绍。归结起来就是更关心数据质量而不是数据数量。然而,高质量的数据集很难找到。这就是本文前面部分的由来。

如果你想建立一个高质量的机器学习模型,你需要一个高质量的数据集。对于日常使用, Kaggle 是一个很好的起点。如果你对计算机视觉和人工智能感兴趣,试试 Graviti 吧——它是完全免费的。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

https://medium.com/@radecicdario/membership

保持联系

大规模数据分类

原文:https://towardsdatascience.com/data-classification-at-mega-scale-ba47f81791db?source=collection_archive---------26-----------------------

为什么组织应该考虑使用新的自动化方法来解决由来已久的数据分类问题

图片来源: Pixabay

数据分类是一个老问题,也是关键组织流程的核心,如数据保护、数据安全和法规遵从性。随着现代组织积累的海量数据,数据分类不再能够通过手动数据管理或启发式规则来解决,而是 AI/ML 技术的一个令人信服的用例。

在本文中,我将讨论分类的基础知识、现代企业面临的挑战,以及如何使用人工智能模型实现分类,包括一个大规模人工智能分类系统的真实例子。

什么是数据分类?

数据分类的主要目的是将数据组织成类别。它包括分析数据,然后创建基于内容、文件类型或其他元数据的类别。您可以对结构化和非结构化数据使用数据分类。数据分类通常是数据隐私条例规定的一项要求

除了实现合规性,组织还利用数据分类来获得对其风险缓解的洞察,并定义数据保护策略。例如,数据分类可以帮助组织了解他们将最有价值的数据存储在哪里,以及他们的用户最常创建哪些类型的敏感数据。

企业数据分类的挑战

数据只有在能够提供有意义的见解时才有用。然而,数据池有时更像一片沼泽,而不是一个清晰的信息池。当这种情况发生时,可能需要几个月的时间,组织才能理解和分类他们的数据。

最初对数据进行分类时,组织需要筛选成千上万的结构。巨大的数据量并不是唯一的挑战,数据质量也会减慢这一过程。

电话号码格式和错别字会显著降低数据质量,并混淆算法。此外,如果分类数据使用不当,也可能会减慢分类过程。

人工智能/人工智能分类技术

机器学习算法可以快速处理数据和执行动作。分类算法在大型数据集上训练,接受新的未知数据并生成预测,通常是每个分类标签的基于概率的置信度得分。

以下是用于分类数据的常用策略:

  • 贝叶斯定理 —使用文档的特征来预测它属于某个类别的概率。如果文档的许多组成部分与一个类别有共同的特征,这个原则说文档可能是类别的一部分。
  • 决策树——通过提问推断文档属性的算法。该算法会提出问题,以缩小选项范围并了解数据点所属的类别。
  • K-最近邻——将一条新数据与数据库中包含的相似数据点进行比较的算法。它可以帮助预测文档的类别,并为相关文档提供推荐。
  • 神经网络 —使用数百万虚拟神经元来模拟认知过程的算法。神经网络体系结构已经出现,它能够以比人类更好的性能执行语言处理和分类任务。

示例实现:使用 PyTorch 进行大规模分类

在论文《面向安全和隐私的可扩展数据分类》( Tanaka,Sapra 和 Laptev,2020 )中,作者描述了一种可扩展的、基于人工智能的分类系统,该系统满足以下要求:

  • 可以对持久(历史)和在线(实时)数据进行分类
  • 可以处理任何类型或格式的数据,包括长文本记录和大型表格
  • 准确的分类,能够在未来添加新的数据类型
  • 支持实时入口流量的快速分类
  • 可扩展的基于云的架构支持大数据量

下图显示了系统架构:

图片来源:arxiv.org

该系统由三部分组成:持久数据处理、在线数据处理和 ML/启发式规则。

持久化数据处理

该组件从所有数据存储中收集元数据,并形成一个易于高性能查询的目录。对于每个数据存储,它会估计扫描数据所需的计算资源,并运行一个作业来执行扫描。Jobs 对数据运行伯努利样本,并从每一列中提取特征,将特征传递给机器学习算法以生成分类预测。

在线数据处理

该系统提供了一个 API,任何向组织吸收新数据的系统都可以访问该 API。API 基于相同的 ML/启发式规则引擎为数据提供实时预测。

启发式规则和 ML

研究人员为大规模自动分类创建了两个支持系统:

  • 为简单的分类场景提供基线的手动试探法。这采用静态规则的形式,当特定特征具有特定值时,静态规则导致特定的分类决策。
  • 一个基于 PyTorch 的模型,分成多个模块,可以独立替换或调整,而不会影响整体性能。该模型支持 100 多种数据类型,包括电子邮件和短信等非结构化内容。

PyTorch 模型定义了分别处理基于文本的稀疏特征和基于数字的密集特征的嵌入。这些特征变成一个向量,该向量经过批量归一化和非线性激活,以产生每个分类标签的 0 和 1 之间的输出。参数扫描技术用于寻找最佳学习速率、批量大小和调整其他超参数。

可扩展数据分类:4 个最佳实践

以下是设计有效的大规模数据分类系统的几种方法:

  1. 自动化一切 —当您需要对大型数据集、多种数据类型以及数千兆字节或数千兆字节的数据进行分类时,自动化变得至关重要。请记住,数据不是静态的,您应该有办法处理历史数据和每天流入系统的新数据。
  2. 利用人类知识——不要仅仅依赖算法。利用主题专家并利用他们的知识来构建一个健壮的系统。您可以使用人类专家来定义静态规则,以在特定情况下覆盖算法,或者使用他们的专业知识来为每个分类场景更好地选择和调整 ML 算法。
  3. 解释性预测 —分类通常用于合规或安全目的,你需要理解为什么一种算法以某种方式对数据进行分类,以及这种分类是否真的有效。再次,让人类专家参与进来,仔细微调算法,以确保你对自己的预测充满信心。
  4. 计划资源 —大型分类项目可能需要大量资源。确定当前和预期的数据量、您计划使用的算法及其计算要求、基础架构(内部部署或基于云)、IT 支持和主题专家,以帮助构建一个强大的分类流程。

结论

在本文中,我解释了数据分类的基础知识,并涵盖了:

  • 人工智能/最大似然分类的工作原理——从经典的朴素贝叶斯到神经网络
  • 自动分类的实际应用
  • 结合启发式规则和机器学习模型的大规模分类系统的示例实现
  • 在您的组织中实施基于人工智能的分类的最佳实践

我希望这将有助于您探索新的自动化方法来解决古老的数据分类问题。

基于 Python Pandas 和 Seaborn 的 Airbnb 数据集的数据清洗和 EDA

原文:https://towardsdatascience.com/data-cleaning-and-eda-on-airbnb-dataset-with-python-pandas-and-seaborn-7c276116b650?source=collection_archive---------12-----------------------

发现改变价格的特征

照片由斯蒂芬·惠勒Unsplash 拍摄

Airbnb 把有地方租的人和需要地方住的人联系起来。它变得如此受欢迎和成功,以至于我们大多数人都将 Airbnb 视为我们旅行计划中的一个选项。

在确定一个地方的价格时,有几个因素起着关键作用。主人应该为他们的住处列出一个合理的价格。

另一方面,寻找住处的人会从几个方面来评估房源,比如位置、面积、便利设施,最重要的是价格。

在本文中,我们将尝试找出哪些功能对一个地方的价格有影响。有许多 Airbnb 数据集可以通过 creative commons 许可获得,因此可以随意使用和探索它们。

我们将为 Python 使用 Pandas 和 Seaborn 库。因此,本文也将是这些库的实用指南。

网站上有很多可用的数据集。我们将使用的是 2021 年 7 月 7 日西班牙巴塞罗那的列表文件。让我们从导入 Pandas 开始,从 CSV 文件中读取数据来创建一个数据帧。

import pandas as pdlistings = pd.read_csv("listings.csv")print(listings.shape)
(17079, 74)

有两个清单文件。一定要用 74 列的。

数据清理

某些列的格式不适合分析。例如,“价格”、“主机接受率”和“主机响应率”列存储为字符串。

listings[
    ["price","host_response_rate","host_acceptance_rate"]
].dtypes# output
price                   object
host_response_rate      object
host_acceptance_rate    object
dtype: object---------------------------------------------------------listings[
    ["price","host_response_rate","host_acceptance_rate"]
].head()# output

(图片由作者提供)

这些列需要转换成数字格式。我们可以使用astype函数来改变数据类型。但是,需要事先删除“$”和“%”字符。

listings["price"] = listings["price"].str[1:].str.replace(",","").astype("float")listings["host_response_rate"] = listings["host_response_rate"].str[:-1].astype("float") / 100listings["host_acceptance_rate"] = listings["host_acceptance_rate"].str[:-1].astype("float") / 100

由于“$”和“%”字符是字符串中的第一个和最后一个字符,我们可以使用它们的索引来删除它们。

str[1:]选择从第二个字符开始的所有字符,而str[:-1]选择直到最后一个字符的所有字符(最后一个字符除外)。然后,astype函数将数据类型改为 float。

这些列现在如下所示:

(图片由作者提供)

有一个名为“浴室文本”的列,其中包含一些信息:浴室数量和浴室类型。

listings[["bathrooms_text"]].head()

(图片由作者提供)

我认为最好是两个单独的栏目,分别列出浴室的数量和类型。我们可以通过使用str访问器下的split函数来完成这项任务。

listings["bathroom_qty"] = listings["bathrooms_text"].str.split(" ", expand=True)[0]listings["bathroom_type"] = listings["bathrooms_text"].str.split(" ", expand=True)[1]

(图片由作者提供)

探索性数据分析

数据集中有 74 个要素。最好将它们分成一些主要的组,以保持我们分析的完整性。

我想从价格这个目标变量开始。

价格

让我们创建一个 price 列的直方图,以了解它的分布情况。我将使用 Seaborn 库进行数据可视化,所以第一步是导入它。

import seaborn as sns
sns.set_theme(font_scale=1.5, style="darkgrid")

直方图可通过使用displot功能创建。

sns.displot(data=listings, x="price", kind="hist", aspect=1.5)

价格直方图(图片由作者提供)

由于价格非常高的异常值,分布是高度偏斜的。在这种情况下,最好取价格的对数。

listings = listings[listings.price!=0]listings.loc[:,"log_price"] = np.log(listings.loc[:,"price"])sns.displot(data=listings, x="log_price", kind="hist", aspect=1.5)

价格的自然记录(图片由作者提供)

在记录日志之前,我从数据框中删除了一些价格为 0 的列表。价格似乎呈对数正态分布。

主持

关于主人的一些特征在一个地方的价格中起着关键作用。例如,比起未验证的主机,人们更倾向于信任具有验证身份的主机。

listings.groupby(
    ["host_identity_verified"], 
    as_index=False
).agg(
    avg_price = ("price","mean"),
    qty = ("price","count")
)

(图片由作者提供)

列表按host_identity_verified列分组,并计算每组的平均价格。“t”代表真,“f”代表假。主机经过验证的列表平均价格要高得多。

最好也检查每组中的列表数量,以确保数据不是非常不平衡。

让我们用类似的方法检查主机响应时间。响应更快的主机可能平均价格更高,因为没有人喜欢等待太久。

listings.groupby(
    ["host_response_time"], as_index=False
).agg(
    avg_price = ("price","mean"),
    qty = ("price","count")
).sort_values(
    by="avg_price", ascending=False
).reset_index(drop=True)

(图片由作者提供)

除了前面的例子,使用sort_values函数按平均价格对结果进行排序。这有助于我们更清楚地看到响应时间和价格之间的关系。

正如预期的那样,平均价格随着响应时间的增加而降低。

大小

一个地方的大小或容量是价格的决定因素。accommodates栏显示了这个地方可以容纳多少人。

让我们使用箱线图来比较不同accommodates值的价格分布。

sns.catplot(
    data=listings, 
    x='accommodates', y='log_price', kind='box',
    height=6, aspect=1.8, width=0.5
)

kind参数设置为 box 的 Seaborn 的catplot函数创建一个盒图。heightaspect参数调整绘图的大小。最后,width参数改变图中方框的大小。

(图片由作者提供)

我们清楚地看到,一般来说,价格随着容纳价值的增加而增加。

  • 盒子的底线是第一个四分位数,所以 25%的值在这条线以下。
  • 方框中间的线表示中间值。一半的数值在这条线以下。
  • 方框的顶行是第三个四分位数,这意味着 75%的值在这条线以下。

一半的值在盒子的底部和顶部线之间,所以我们得到了值分布的概况。底部和顶部的点表示异常值。

有效性

有几个栏目与一个地方的可用性有关。例如,availability_30列显示了未来 30 天的可用天数。

我们还可以看到未来 60、90 和 365 天的可用天数。

让我们检查一下可用天数和价格之间是否存在相关性。

listings[[ 
    'availability_30', 'availability_60', 
    'availability_90', 'availability_365',
    'log_price'
]].corr()

(图片由作者提供)

可用天数和价格之间似乎有一点正相关。我们还发现,未来 30 天、60 天和 90 天的可用天数之间存在高度正相关,这其实并不令人意外。

有一个名为instant_bookable的栏目可能会对价格产生影响。急需一个地方的人会寻找可以立即预订的地方。对他们来说,钱通常是第二关心的事情。

listings.groupby(
    ['instant_bookable'], as_index=False
).agg(
    avg_price = ("price","mean"),
    qty = ("price","count")
)

(图片由作者提供)

地方的类型

数据集中有酒店房间、私人房间、共享房间和整个家庭。我们可以使用 group by 函数的箱线图来检查价格如何根据地点的类型而变化。

sns.catplot(
    data=listings, 
    x='room_type', y='log_price', kind='box',
    height=6, aspect=1.8, width=0.5
)

(图片由作者提供)

一般来说,私人房间和共享房间更便宜。我们在私人房间类别中看到许多异常值。它们可能位于城市中非常受欢迎的地方。

舒适

我们通常在预订或租房时会考虑一个地方的便利设施。例如,一台像样的咖啡机可能会改变游戏规则。

数据集中有一个名为amenities的列,但它包含了这个地方所有可用的便利设施。为了检查某个功能或设施对价格的影响,我们需要从该列中提取它。

谢天谢地,使用 Python 和 Pandas,这是一个简单的操作。下面的代码片段使用列表理解来检查“咖啡机”是否存在于便利设施列中。

listings.loc[:,"has_coffee_maker"] = ['coffee maker' in row.lower() for row in listings.amenities]

在检查之前,每个值都被转换成小写,因为我们感兴趣的是“咖啡机”、“咖啡机”或咖啡机的任何其他大写和小写组合。

listings.has_coffee_maker.value_counts()False    8777
True     8298
Name: has_coffee_maker, dtype: int64

几乎一半的地方都有咖啡机。让我们看看有和没有咖啡机的地方的平均价格。

listings.groupby(
    ["has_coffee_maker"]
).agg(
    avg_price = ("price", "mean")
)

(图片由作者提供)

位置

位置是一个地方非常重要的特征。在某些情况下,靠近某个地方是极其重要的,位置是人们花钱的目的。

“邻居”和“邻居组”栏让我们了解这个地方的位置。我们将根据这些值检查平均价格。

如果您想更进一步,有一个单独的邻域文件,其中包含每个邻域的地理坐标。这有助于进行彻底的基于位置的评估。例如,当有重要的足球比赛时,靠近诺坎普可以提高价格。

listings.groupby(
    ["neighbourhood_group_cleansed"], as_index=False
).agg(
    avg_price = ("price", "mean"),
    qty = ("price", "count")
).sort_values(
    by="avg_price", ascending=False
).reset_index(drop=True)

(图片由作者提供)

Les Corts 是最贵的邻里团体。让我们也来看看 Les Corts 内不同社区的平均价格是如何变化的。

listings[listings.neighbourhood_group_cleansed=="Les Corts"].groupby(
    ["neighbourhood_cleansed"]
).agg(
    avg_price = ("price", "mean"),
    qty = ("price", "count")
).sort_values(
    by="avg_price", ascending=False
)

(图片由作者提供)

结论

我们试图探索来自西班牙巴塞罗那的 Airbnb 数据集。我们的重点是了解一个列表的不同特征如何影响它的价格。

当然,我们可以更深入,寻找更具体的特征和关系。然而,我们所做的展示了探索性数据分析过程中的典型操作。

我们还做了一些数据清理,以便使数据更适合数据分析。

别忘了 订阅 如果你想在我发表新文章时收到电子邮件。

你可以成为 媒介会员 解锁我的全部写作权限,外加其余媒介。如果您使用以下链接,我将收取您的一部分会员费,无需您支付额外费用。

https://sonery.medium.com/membership

感谢您的阅读。如果您有任何反馈,请告诉我。

数据清理和特征工程:机器学习中被低估的部分

原文:https://towardsdatascience.com/data-cleaning-and-feature-engineering-the-underestimated-parts-of-machine-learning-10681dae4cf7?source=collection_archive---------10-----------------------

数据清洗和特征工程被应用于杂乱的巧克力棒评级数据集

照片由 Vicky YuUnsplash 上拍摄

介绍

每个人都想进入机器学习领域。每个人都希望加载数据,并希望直接根据这些数据训练机器学习算法。在大学里,我们只处理干净的数据集,比如 MNIST 或 CIFAR-10 数据集。在那里,你可以直接从应用不同的机器学习算法开始,并对它们进行比较。但是在现实中,你并没有得到一个完美和干净的数据集。你通常会得到一个非常混乱的数据集,在应用机器学习之前,需要进行大量的数据清理和特征工程。一般来说,机器学习本身是整个过程中较小的部分,而数据清洗和特征工程是较大的部分。这篇文章展示了来自 Kaggle 的巧克力棒评分数据集的数据清理和特征工程。这个数据集是相当混乱的,允许提出一些数据清理的想法。笔记本可以在我的 github 页面找到。一些功能工程的想法是从 Kaggle 上的笔记本中得到启发的。

数据集

巧克力棒评级数据集包含关于巧克力棒及其评级的信息。目标是使用关于巧克力棒的给定信息并预测巧克力棒的等级。表 1 显示了所有可用的特性以及每个特性的简短描述。

表 1:巧克力棒评级数据集中所有可用特征的概述(按作者分类的表格)。

在数据集的描述中,陈述了使用客观质量和主观解释的组合来评估每个巧克力。评级本身是使用一个批次的巧克力棒完成的,批号、年份和审查日期都包含在数据集中。表 2 显示了不同等级及其含义的概述。

表 2:所有评级级别及其含义的概述(按作者分类)。

探索性数据分析、数据清理和特征工程

本章描述了使用特征工程探索数据集、清理数据和创建一些新特征的过程。本章的目标是准备数据,以便它可以直接用于以后的机器学习。使用 Pandas 加载数据,并存储在 Pandas 数据框中。

作为第一步,pandas 数据帧头函数用于获得数据的初始视图。列名格式不正确,包含换行符。图 1 显示了数据帧的头部。

图 1:包含巧克力棒评级数据集的熊猫头像数据框(图片由作者提供)。

因此,作为第一步,列名被重命名(图 2)。

图 2:重命名巧克力棒评级数据框列的代码(由作者编写)。

其次,使用 pandas 数据框函数 info() 来快速检查哪些数据类型可用以及数据是否缺失。列 Company、Spec_Bean_Origin_or_Bar_Name、Cocoa_Percent、Company_Location、Bean_TypeBroad_Bean_Origin 是分类特征,必须进行转换。当查看缺失值时,只有特征 Broad_Bean_OriginBean_Type1795 个总样本中包含一个缺失值。然而,当查看数据帧头(图 1)时,特性 Bean_Type 的前五行是空的,因此应该算作缺失值。因此,获取 Bean_Type 的第一个条目,以便检查其值,并使用此条目将这些值替换为 NaN (图 3)。

图 3:获取 bean 类型的缺失值指示,并用 NaN 替换所有列的缺失值(由作者编写代码)。

Bean_Type 的空值替换为 NaN 后,再次调用 info() 函数,此时显示该特征包含 891 个缺失值,几乎是样本总数的 50% 。特性 Broad_Bean_Origin 也有一些缺失值,现在包含了 74 个缺失值。

下一步,通过移除尾随百分比符号并将数据类型转换为数字数据类型来转换特性 Cocoa_Percent

然后,创建一个数字和分类特征列表,并绘制每个数字特征的直方图(图 4 和图 5)。

图 4:创建数字和分类特征列表并对其进行初步探索性数据分析的代码(由作者编写)。

图 5:巧克力棒评分数据集的数字特征直方图(图片由作者提供)。

可以看出,数据集中的审查期从 2006 年到 2017 年。特性 Cocoa_Percent 的分布似乎有点倾斜,可以在以后进行转换。大部分评分在三到四之间,意味着大部分巧克力棒是“满意的”。

在对分类特征进行更仔细的检查后,可以看到它们包含了大量的类别(表 3),并且还包含了某些类别的部分单个例子,这对于机器学习算法来说不是很有帮助。因此,这些是首先要改造的。

表 3:所有分类特征的概述以及每个特征的不同类别的数量(图片由作者提供)。

转换 Bean 类型

第一个转换的分类特征是 Bean_Type 。图 6 显示了所有可用 bean 类型的直方图。

图 6:转换后所有可用 bean 类型的直方图(图片由作者提供)。

最常见的豆类有 Criollo、Trinitario、Forsastero。大多数其他 bean 类型只是这些 bean 类型的混合。Blend 也经常出现,但只是表示这个 bean 类型是其他 bean 类型的混合。其他一些不太常见的豆类有贝尼亚诺豆、马蒂纳豆、EET 豆、国家豆和亚马逊豆。因此,创建一个包含所有这里提到的 bean 类型的列,然后检查每个样本是否存在这些类别。如果出现任何类别,那么该样本的 category 列将被加 1。如果一个样本包含多个 bean 类型,则设置多个类型。因此,混合的 bean 类型可以映射到分类特征。bean 类型也包含许多缺失值。这里,缺失值被映射到类别 Unknown_Bean_Type ,因为当几乎 50% 的数据缺失时,其他数据插补方法可能会很困难。

了解巧克力棒是否含有混合豆类也是有用的。可能这已经对最终评分有影响了。因此,增加了一个名为 Num_Beans 的新特性。这个特性包含了巧克力棒所含的不同豆类的数量。

最后,添加了一个特性 Is_Blend 来保存巧克力棒是否包含混合豆类,并且类型为 Blend 的豆类也为该特性获得了 true。

图 7 显示了执行上述步骤的代码。

图 7:转换 bean 类型特性列的代码(作者代码)。

转换酒吧的特定地理区域

下一个被转换的特征是Spec _ Bean _ Origin _ or _ Bar _ Name。有 1039 不同的类别,很多。还有许多类别只包含一个值,这不会为机器学习算法提供任何有用的信息。

经过更仔细的检查,很明显,许多国家和城市在逗号后包含了无用的信息。因此,所有行值都用逗号分割,只保留第一部分。这已经将类别的数量减少到 682 个不同的类别。此外,一些类别在国家或城市名称后包含“w/ nibs”。这也被删除,并将类别数量减少到 672 。最后,单次出现类别被映射到类别“其他”,这将不同类别的大小减少到 209 。图 8 显示了这些转换的代码。

图 8:转换巧克力棒原产地的特定地理区域的代码(由作者编写)。

改造蚕豆产地

作为下一个特性,蚕豆源( Broad_Bean_Origin )将被仔细检查。总共有 100 个不同的类别,有些类别也只是其他更常见类别的逗号分隔列表。此外,有些国家有时会有不同的写法(如多米尼加共和国,D.R .,D. Republic,多米尼加共和国)。因此,使用正则表达式是为了确保所有不同的拼写都映射到同一个国家。

蚕豆原点特征也包含 74 缺失值。这些丢失的值被类别未知 _Bean_Origin 替换。

在格式化国家和替换丢失的值之后,逗号分隔的列表被分割以获得类别列表,然后应用与特性 Bean_Type 相同的方法。

在所有的转换之后,只剩下 51 个不同的类别。图 9 显示了对该特征应用所有变换后的最终直方图。这里不包含代码,因为代码很多。如果你有兴趣了解我是如何进行这些转换的,请随意查看我的 github 页面上的 jupyter 笔记本。

图 9:转换后所有可用蚕豆源的直方图(图片由作者提供)。

转变公司位置

特征公司位置是最后转换的分类特征。这里,只有公司位置的单次出现再次被替换为类别“其他”。

最终转换

最后,使用 pandas get_dummies() 函数转换剩下的所有分类列。

作为最后一个变换,可可百分比的倾斜特征使用对数变换进行变换。由此,偏斜度从 1.06 降低到 0.3 。图 10 显示了应用变换前后的直方图。可以看出,转换后的直方图看起来比转换前的直方图更加均匀。

最后一步,通过使用数据的 20% 进行测试,将数据分为训练和维持测试集。

图 10:对数变换前(左)和变换后(右)的数字特征可可百分比直方图(图片由作者提供)。

结论

巧克力棒评级的杂乱数据集现在已经清理干净,并添加了一些可能有用的功能。对分类特征进行编码,并创建训练集和保留测试集,并存储在 csv 文件中。现在可以直接使用它们来对这个数据集执行一些机器学习。如果你有兴趣看我如何在这个数据集上应用机器学习,那么我鼓励你看看我的 github 页面上相应的 jupyter 笔记本。

未来的工作

目前,单一类别被映射到一个新的类别“其他”。但也许有另一种方法可以进一步减少单一类别,并映射到更有意义的类别。这同样适用于缺失值,它们也映射到“其他”类别。这里,可以使用数据插补策略,并且可以将机器学习算法的性能与这里给出的策略进行比较,以便检查这是否可以进一步提高性能。

数据清理——如何处理熊猫丢失的值

原文:https://towardsdatascience.com/data-cleaning-how-to-handle-missing-values-in-pandas-cc8570c446ec?source=collection_archive---------8-----------------------

删除值、填充值、替换值

照片由 Gabby KPexels 拍摄

处理熊猫中缺失的值

数据清洗是 EDA 中的重要步骤之一。数据清理可以通过多种方式完成。其中之一是处理丢失的值。

让我们了解一下如何处理数据集中的缺失值。

目录

  1. 识别缺失值
  2. 替换丢失的值
  3. 填充缺失值
  4. 删除缺少的值

识别缺失值

不同类型的缺失值:

  • 标准缺失值
  • 非标准缺失值
  • 意外缺少值

标准缺失值

空白单元格,NaN,n/a →在 Pandas 中,这些单元格默认被视为空值。

标准缺失值只能被熊猫检测到。

示例:我创建了一个简单的数据集,其中包含不同类型的空值

student.csv(图片由作者提供)

让我们导入数据集

df=pd.read_csv(“student.csv”)
df.head(10)
  1. df.isnull()。sum() →它将返回每一列中 null 值的计数。它将只计算标准的空值。
df.isnull().sum()

仅计算 3 个标准缺失值。[空白单元格,NaN,不适用]

  1. df[《数学》]。isnull() →返回一个布尔数组。true-表示空值。
**df["Math"].isnull()**

非标准缺失值

有时会像一样输入缺失值..,__,—,缺失,na, @,??、*** 等。

不同类型的缺失值-突出显示。

现在让我们检查“数学”和“英语”列中的所有唯一值。通过检查这一点,我们可以识别数据集中所有非标准的缺失值。

df[“Math”].unique()

df[“English”].unique()

它将返回该特定列中的所有唯一值。我们可以确定哪些是其他值,这些值将被视为“缺失值”。

从这两列唯一值中,我们可以识别出一些缺失值,如**na**??

这些是非标准的缺失值。

意外缺少值

基于数据集的上下文来识别意外丢失的值。这里的分数只有 0 到 100 分。所以**999999****X**也被标识为缺失值。

替换丢失的值

  1. df.replace(旧值,新值)旧值将被新值替换
missing_values=[**'??'**,**'na'**,**'X'**,**'999999'**]
df=df.replace(missing_values,np.NaN)
df

现在所有缺少的值都被替换为 NaN。现在很容易处理所有的空值。我们可以删除所有的空值,或者用平均值/中值来填充它们。

填充缺失值

填补缺失值的不同方法

  1. 均值/中值,众数
  2. 菲儿,菲儿
  3. 插入
  4. 替换

1.均值/中值,众数

  • 数值数据→平均值/中值
  • 分类数据→模式

在有数字数据的列中,我们可以用平均值/中值来填充缺失的值。

均值-当数据没有异常值时。 的意思是平均值 。平均值会受到异常值的影响。

【举例。如果我们计算一个房间里员工的平均工资,如果公司 CEO 走进来,平均工资会更高。不可能是代表金额。在这种情况下,我们可以选择中值]

中值-当数据有更多异常值时,最好用中值替换它们。 中位数是中间值 (50%)

在包含分类数据的列中,我们可以通过模式填充缺失的值

模式—最常见值

让我们用平均值来填充缺失的值

  1. 首先,我们必须检查列的数据类型。
df.dtypes

“数学”和“英语”属于“对象”数据类型。我们必须转换成“浮点”数据类型来计算平均值。

2.更改列的数据类型并计算平均值

df[**"Math"**]=df[**"Math"**].astype(**"float64"**)m=round(df[**"Math"**].mean(),2)
m

产量:75.83

3.现在用平均值-75.83 填充“数学”栏中缺少的值

df[**"Math"**].fillna(m,inplace=**True**)
df

分类数据

如果我们想要替换分类数据中缺失的值,我们可以用 mode(最常见的值)来替换它们

员工. csv

  1. 让我们替换“角色”列中的空值
df=pd.read_csv(**"employee.csv"**)
m=df[**"Role"**].mode()
m
#Output0    Developer
dtype: object

2.它返回一个 series 对象,包含最常见的值。我们必须选择系列中的特定值。

m=df[**"Role"**].mode()[0]
m
#Output:'Developer'

3.填写值

df[**"Role"**].fillna(m,inplace=**True**)
df

“角色”列中的空值替换为“开发人员”

2.菲儿,菲儿

b 填充 —向后填充—它将向后传播第一个观察到的非空值。
ffill —向前填充—它向前传播最后观察到的非空值。

如果我们的数据集中记录了连续几天的温度,我们可以通过 bfill 或 ffill 来填充缺失的值。与这类数据集的平均值/中值相比,它会更加准确。

天气. csv

  1. b 填充
df1=pd.read_csv(**"weather.csv"**)
df1.bfill(inplace=**True**)
df1

bfill

2。ffill

df1.ffill(inplace=**True**)
df1

ffill

3.插入

interpolate()是填充缺失值的方法之一。

天气 2.csv

我们已经连续三天缺少值了。我们可以使用插值方法,而不是用相同的值填充所有三行。

bfill/ffill 将为后续缺失值填充相同的值。

df2=pd.read_csv(**"weather1.csv"**)
df2=df2.interpolate()
df2

插值 vs bfill[图片由作者提供]

让我们在使用内插法与 bfill 填充连续缺失值后可视化数据集

**import** seaborn **as** sns
sns.pointplot(x=**"Day"**,y=**"Temp"**,data=df3,color=**'darkorange'**)

从图中,我们可以看到缺失值是如何通过插值方法填充的[默认情况下使用线性方法]

4。更换

有时,我们可以使用 replace 方法替换特定的缺失值。

就像我们可以从外部来源获取数据并替换它。

删除缺少的值

  1. 移除数据集中的所有空值
df.dropna()

2.删除特定列中的空值

df.dropna(subset=[**"Math"**])

结论

数据清理包括许多步骤。我只讲述了如何处理数据集中缺失的值。还有更多类似于修复无效值、拆分列、合并列、过滤子集、标准化数据、缩放数据。

感谢阅读!

关注这个空间,获取更多关于 Python 和数据科学的文章。如果你喜欢看我的更多教程,就关注我的 LinkedInTwitter

点击这里成为中等会员:https://indhumathychelliah.medium.com/membership

R 中的数据清理变得简单

原文:https://towardsdatascience.com/data-cleaning-in-r-made-simple-1b77303b0b17?source=collection_archive---------0-----------------------

标题说明了一切

JESHOOTS.COMUnsplash 上拍照

数据清洗。为下游目的识别、纠正或删除不准确原始数据的过程。或者,更通俗地说,这是向分析就绪数据集迈出的乏味但完全必要的第一步。在数据科学家的时代,数据清理可能不是最性感的任务,但永远不要低估它完成或破坏一个统计驱动的项目的能力。

更详细地说,让我们把数据清理想象成一块空白画布的准备工作,探索性的数据分析和统计建模油漆的一笔一划很快就会使它完全生动起来。如果你的画布最初没有被清理干净,也没有恰当地符合项目目标,那么无论你画得多漂亮,接下来对你的艺术的解读都将是混乱的。

数据科学项目也是如此。如果你的数据准备不足,不管你的统计技巧多么前沿,不可靠的结果都会困扰你的工作。对于任何以将数据转化为公司或学术价值为生的人来说,这是一个可怕的前景。

俗话说:垃圾进来,垃圾出去

不幸的是,现实世界的数据清理可能是一个复杂的过程。许多预处理都是依赖于数据的,不准确的观察值和缺失值的模式通常是每个项目及其数据收集方法所特有的。当手工输入数据时尤其如此(数据验证,有人知道吗?)或者是非标准化、自由反应的产物(想想从自然保护和心理学等领域搜集的推文或观察数据)。

然而,“卷入”并不一定要翻译成“失去”是的,每个数据帧都不一样。是的,数据清理技术依赖于个人数据争论偏好。但是,与其被这些未知所淹没,或者不确定什么才是真正的“干净”数据,你可以采取一些通用步骤来确保你的画布马上就可以进行统计绘制了。

TL;DR: 数据清洗听起来很可怕,但是无效的发现更可怕。以下是一些有助于保持数据清理步骤清晰简单的工具和提示。

让我们开始吧。

输入 R

r 是处理数据的极好工具。像 tidyverse 这样的软件包使得复杂的数据操作变得几乎没有痛苦,并且作为统计学的通用语言,对于许多数据科学家和社会科学研究者(比如我自己)来说,这是一个自然的起点。也就是说,它绝不是数据清理的唯一工具。这只是我们在这里要用的一个。

对于替代的数据清理工具,请查看这些关于 PythonSQL语言中立方法的文章。

接下来,输入一个简单的清单

不管 R 有多有用,如果您错过了装订数据清理步骤,您的画布仍然会准备不足。为了尽可能保持简单,以下是清理原始数据时应始终考虑的最佳实践清单:

  1. 熟悉数据集
  2. 检查结构错误
  3. 检查数据异常
  4. 决定如何处理缺失值
  5. 文件数据版本及变更

如果这些步骤仍然有点模糊,请不要担心。我们将使用下面的示例数据集更详细地介绍每一项。

最后,输入一个真实的例子

工具箱和清单很酷,但是两者在现实世界中的应用才是真正的学习。

在下文中,我们将按顺序检查数据清理清单的每个步骤。为了演示这些步骤,我们将使用目前在 Kaggle 上可用的“技术调查中的精神健康”数据集,以及相关的 R 代码片段。

第一步:熟悉数据集

一个重要的“预数据清理”步骤是领域知识。如果你正在做一个与亚马逊地区的 Potoo 睡眠模式相关的项目,但不知道 Potoo 实际上是什么,那么你可能无法很好地理解变量的含义,哪些变量是重要的,或者哪些值可能需要认真清理。

简而言之:如果你的变量一开始对你没有意义,在进入数据清理之前,一定要仔细阅读或者咨询专家。

为了保持在我自己的临床心理学领域,我将使用前面提到的“技术调查中的心理健康”数据集,这是 2016 年的一系列调查反馈,旨在捕捉技术员工的心理健康状况和工作态度。为了更深入地了解这些数据,请点击这里查看原始资料。

从文件大小到数据类型,充分了解数据集是动手清理数据之前的另一个关键步骤。没有什么比意识到一个核心特性充满了噪音或者在分析过程中发现内存不足更让人恼火的了。

照片由蒂姆·高Unsplash 上拍摄

为了避免这种情况,我们可以采取一些快速的初始步骤来确定什么可能需要额外的关注。要在打开之前确定数据文件的大小,我们可以使用:

file.info("~/YourDirectoryHere/mental-heath-in-tech-2016_20161114.csv")$size

我们使用的数据文件是 1104203 字节(或 1.01 MB),无论如何都不是大数据。RAM 短缺在这里很可能不是问题。

#an initial look at the data frame
str(df)

从输出中,我们还可以看到数据帧由 1433 个观察值(行)和 63 个变量(列)组成。还列出了每个变量的名称和数据类型。我们将在第 2 步中回到这些信息。

像上面这些快速而肮脏的方法可以有效地让你开始熟悉手头的东西。但是请记住,这些功能只是探索型数据分析的冰山一角。查看这个资源中的,了解这里没有介绍的 EDA 的潜行高峰。

步骤 2:检查结构错误

现在我们对数据有了一个感觉,我们将评估数据框的结构错误。这些错误包括输入错误,如错误的数据类型、非唯一的 ID 号、错误标记的变量和字符串不一致。如果在您自己的数据集中有比下面提到的更多的结构性缺陷,请确保在您的数据清理中包括额外的步骤来解决这些问题。

a)标签错误的变量:用 names() 函数查看所有变量标签。我们的示例数据集有很长的标签,很难在接下来的代码中调用。我们可以用 dplyr 的 rename() 来修改它们,如下所示:

df <- df %>% rename(employees = How.many.employees.does.your.company.or.organization.have.)colnames(df)[2]

b)错误数据类型:这些可以通过步骤 1 中使用的 str() 函数或更明确的 typeof() 函数来确定。这个数据集中有几个不正确的数据类型,但是让我们继续使用“employees”变量来演示如何识别和更新这些错误:

typeof(df$employees)

返回“字符”,但变量实际上应该是一个具有 5 个级别的因子:“6–25”、“26–100”、“100–500”、“500–1000”和“大于 1000”。我们可以使用 as.factor() 函数相应地改变数据类型:

df$employees <- as.factor(df$employees)

c)非唯一 ID 号:这个特殊的数据集没有 ID 标签,响应者由行号标识。但是,如果包含 ID 号,我们可以用 duplicated() 函数或 dplyr 的 distinct() 函数删除重复项,如下所示:

#with duplicated()
df <- df[!duplicated(df$ID_Column_Name), ]#with distinct()
df <- df %>% distinct(ID_Column_Name, .keep_all = TRUE)

d)字符串不一致:这包括可能干扰数据分析的打字错误、大写错误、标点错位或类似的字符数据错误。

以我们的“性别”专栏为例。

unique(df$gender)

输出继续。事实上,总共有 72 个独特的回应。正如我们所看到的,由于不一致的大写字母和术语缩写而存在差异。为了统一这些响应,我们可以使用正则表达式结合 gsub() 来识别常见字符模式,并将所有女性识别响应转换为虚拟编码值“1”,将所有男性识别响应转换为“0”。

df$gender <- gsub("(?i)F|(?i)Female", "1", df$gender)
df$gender <- gsub("(?i)M|(?i)Male", "0", df$gender)

正则表达式根据字符串数据有很大的不同。点击这里查看 R 的正则表达式备忘单,了解如何使用它们。

此外,要注意丢失的值被错误地表示为字符“NA”值,而不是 NA 数据类型。使用以下代码修复实例:

df <- df %>% na_if(gender, "NA")

步骤 3:检查数据的不规则性

接下来,我们将评估数据集的不规则性,这包括准确性问题,如无效值异常值。同样,这是杂乱数据框中的两个常见陷阱,但是要注意您自己的数据特有的不规则性。

a)无效值:这些是没有逻辑意义的响应。例如,我们数据集中的第一个问题(“你是自雇人士吗?”)应该与第二个(“你的公司或组织有多少员工?”).如果第一栏中有一个“1”表示该个人是自雇人士,则第二栏中应该有一个“NA ”,因为他或她不为公司工作。

另一个常见的例子是年龄。我们的数据集由技术员工的回答组成,这意味着任何报告年龄大于 80 岁或小于 15 岁的人都可能是输入错误。让我们来看看:

可以肯定地说,一个 3 岁和 323 岁的孩子没有完成员工调查。要删除无效条目,我们可以使用以下代码:

df <- df[-c(which(df$age > 80 | df$age < 15)), ]

离群值:这是一个有很多争论的话题。查看维基百科的文章,深入了解什么是离群值。

经过一点特征工程(查看完整的数据清理脚本此处供参考),我们的数据集有 3 个连续变量:年龄每个回答者诊断出的精神疾病数量,以及每个回答者认为有精神疾病的数量。为了了解数据的分布情况,我们可以绘制每个变量的直方图:

“total_dx”和“total_dx_belief”都严重倾斜。如果我们想要减轻极端异常值的影响,有 3 种常见的方法可以做到:删除异常值替换值(又名 W insorize )或什么都不做

删除观测值:定位并删除有极值的观测值。这在处理明显是人为输入错误导致的极端值时很常见(如之前在我们的“年龄”列中输入的 323 年值)。但是,如果不是这样,就要小心了,因为删除观察结果会导致重要信息的丢失。

Winsorize :当一个异常值对你的模型假设或结果产生负面影响时,你可能希望用一个不那么极端的最大值来代替它。在 Winsorizing 中,在数据的预定百分位之外的值被识别并被设置为所述百分位。以下是我们数据集 95% Winsorization 的示例:

#looking at number of values above 95th percentile 
sum(df$total_dx > quantile(df$total_dx, .95))df <- df %>% mutate(wins_total_dx = Winsorize(total_dx))

什么都不做:对,就是……什么都不做。如果离群值虽然极端,但包含了与您的项目目标相关的重要信息,那么这是最好的方法。这是我们对“total_dx”变量采取的方法,因为每个受访者报告的精神疾病数量有可能成为科技员工对精神健康态度的重要预测指标。

补充说明:这可能是大数据时代,但小样本仍然是临床领域的严峻现实,包括我自己。如果这也是你的现实,要格外小心异常值,因为它们对样本均值、标准差和方差的影响会随着样本量的减少而增加。

步骤 4:决定如何处理丢失的值

这里我将直接切入正题:没有单一的“最佳”方法来处理数据集中的缺失值

照片由 krakenimagesUnsplash 上拍摄

这听起来可能令人生畏,但是理解您的数据和领域主题(回想一下步骤 1?)可以派上用场。如果您非常了解您的数据,那么您也很有可能知道哪种方法最适合您的特定场景。

我们数据集的大部分 NA 值都是由相关回答造成的(例如,如果您对一个问题的回答是“是”,则可以跳过下面的问题),而不是人为错误。这种差异在很大程度上可以用自雇和公司雇佣的定向问题产生的不同回答模式来解释。将数据集分成两个框架(一个用于公司雇佣的应答者,一个用于个体雇佣的应答者)后,我们计算公司雇佣的特定数据集的总缺失值:

sum(is.na(df))#percent missing values per variable
apply(df, 2, function(col)sum(is.na(col))/length(col))

这看起来可能缺少很多值,但是,经过进一步的检查,唯一缺少值的列是那些针对自雇响应者的列(例如,“您是否有医疗保险(私人保险或国家提供的保险),其中包括精神健康问题的治疗?”).该变量中缺失的值应该在我们公司使用的数据集中,因为它们被公司政策覆盖。

这让我们想到了第一个选择:

a)删除变量。删除具有 NA 值的列。在具有大量数据和很少缺失值的项目中,这可能是一种有效的方法。在我们的情况下,这也是可以接受的,在我们的情况下,自雇变量没有给我们的公司雇佣数据集增加重要的信息。

但是,如果您正在处理一个较小的数据集和/或多个 NA 值,请记住移除变量会导致大量信息丢失。

b)移除观察。删除具有 NA 值的行。同样,这在大型项目中可能是一种可以接受的方法,但是要注意有价值信息的潜在损失。要删除带有缺失值的观察值,我们可以很容易地再次使用 dplyr 库:

#identifying the rows with NAs
rownames(df)[apply(df, 2, anyNA)]#removing all observations with NAs
df_clean <- df %>% na.omit()

c)估算缺失值。用推断的替换值替换 NA 值。我们可以使用给定变量的平均值、中值或众数来实现,如下所示:

for(i in 1:ncol(df)){
  df[is.na(df[,i]), i] <- mean(df[,i], na.rm = TRUE)
}

此外,我们还可以使用线性回归等预测方法估算连续值,或者使用逻辑回归等方法估算分类值。 使用库mouse的多重插补 也可用于连续或分类数据。当实现这些方法时,请注意,如果缺少的值和数据集属性之间没有关系,结果可能会产生误导。你可以在这里了解更多关于这些技术和它们相关的 R 包

KNN 插补为输入连续或分类缺失值提供了另一种可能的替代方法,但请记住,这可能非常耗时,并且高度依赖于所选的 k 值。

#imputing missing values with the caret package's knn method
df_preprocess <- preProcess(df %>% dplyr::select(primary_role),
                            method = c("knnImpute"),
                            k = 10,
                            knnSummary = mean)df_impute <- predict(df_preprocess, df, na.action = na.pass)

使用支持缺失值的算法。如果使用 NA 值,有些算法会出错,有些则不会。如果希望将 NA 保留在数据集中,请考虑使用能够处理缺失值的算法,如线性回归、k-最近邻或 XGBoost。这一决定也很大程度上取决于项目的长期目标。

步骤 5:记录数据版本和所做的更改

为后面的乡亲们大声说清楚:好的研究是可复制的研究。如果你或第三方不能从你使用的相同的原始数据集中重现相同的干净数据集,你(或任何其他人)就不能验证你的发现。

清晰的文档是良好数据清理的一个重要方面。你为什么要做出这些改变?你是怎么做到的?你用的是什么版本的原始数据?这些都是你需要能够回答的重要问题。像 R MarkdownRPubs 这样的工具可以无缝地将文档编织到你的 R 项目中。如果你还不熟悉的话,可以去看看。你未来的自己会感谢你。

对于那些已经走到这一步的人,感谢阅读!

在整篇文章中,我们借助一个简单的清单和真实数据集应用程序,阐明了基本的数据清理步骤以及在 R 中实现这些步骤的潜在方法。要进一步了解,你可以在我的 GitHub repo 这里找到完整的 R 脚本。

请记住,尽管该指南是一个有效的锚,但数据清理是一个由数据集和手边的长期统计目标强烈预测的过程。不要害怕发挥创造力!画布本身可以很快成为一件艺术品🎨

数据清理是分析,而不是繁重的工作

原文:https://towardsdatascience.com/data-cleaning-is-analysis-not-grunt-work-edb386f9429d?source=collection_archive---------24-----------------------

行业笔记

曼哈顿哈德逊河沿岸有一个切割非常奇怪的树桩(反正从 2018 年开始),几乎像一把椅子。但是如果你仔细看,这棵树已经长在一些旧的铁栅栏周围,留下了一个对无心电锯操作者来说不可战胜的树桩(摄影:Randy Au)

TL;DR:清洗数据被一些人认为是卑微的工作,在某种程度上低于性感的“真正的”数据科学工作。我叫 BS。 清理数据的行为将数值/判断/解释强加于数据,旨在允许下游分析算法运行并给出结果。那跟做数据分析一模一样。事实上,“清理”只是进行全面数据分析过程中的一系列可重用数据转换。一旦我们接受了这个框架,我们需要采取的步骤就是更自然地清理数据流。我们希望允许我们的分析代码运行,控制无用的方差,消除偏见,并记录下来供他人使用,这一切都是为了服务于我们希望在未来运行的一系列潜在分析。

已经是周四了(短暂的几周是最糟糕的),我再次在 Twitter 上询问人们是否有人对我应该写的东西有想法。我得到的一个回复是:“清洗”。说真的,就是这样。

起初我认为这要求有点过分。数据清理是一个古老的话题,我能在时事通讯中写些什么来促进对话呢?

然后我开始看现有的关于数据清理的文章…它变得 烦人 。有一大堆东西都试图听起来很权威,说着同样的话。但是作为一个从业者,我看得出没什么用。这就像教科书中令人恼火的“留给读者做练习”。上次我对一个技术写作话题感到恼火,它催生了一个怪物 SQL 优化帖子

然后,我开始认真思考数据清理作为一个概念,并陷入了整个认识论的兔子洞。

所以让我们开始吧。

现有的数据清理写是相当无用的

首先,让我们从现有的关于“数据清理”的文章的问题开始。

维基百科关于数据清理的帖子对数据质量的重要品质做了很好的总结:有效性、准确性、完整性、一致性、一致性。它还有一个关于“过程”的部分,非常枯燥和学术化(以一种消极的方式),根本不会帮助你清理任何数据。

接下来,当我搜索“数据清理”时,我将从谷歌上的顶部链接中抽取一些帖子。我会提供链接作为参考,这样你就知道我在抱怨什么了。

这个高排名的页面就像是维基百科页面开始时更友好的扩展。幸运的是,它在 process 部分列出了一大串用于清理数据的示例技术,比如清理空间、删除不相关的值等等。有一些例子和插图!

这一篇是我从未听说过的某个数据产品网站的类似博客的随机帖子。它很短,主要是“数据质量很重要,你需要持续监控它”。他们没有错,但也没什么帮助。然后他们会给出一个流程循环来清理、验证和监控您的数据…我想这是因为他们在向您销售产品中的一些功能。

接下来, Tableau 加入了重复游戏,解释为什么干净的数据很重要,列出了类似的步骤清单,并在最后加上了数据质量的品质!还不错,但与目前为止的其他参赛作品非常相似。

数据科学教育网站上的这个说了“好数据>更好的算法”之类的话,还有机器人的卡通图片(我喜欢可爱的东西),所以这是一个加分项。接下来就是检查清单,删除不良观察,修正错误,填补缺失值,等等。我在这里得到了他们的“销售”技能,但仍然。

模式识别大脑感知模式!

如果你想要一个高排名的数据清理帖子,只需记住“数据质量很重要”、“审计数据、发现错误、修复错误、监控、重复”和“良好数据质量的品质”这些概念。举几个例子。用<1000 字做。

盈利!(字面意思,通过广告和产品销售)

我最大的不满是,这些都是肤浅的清单,“去找到坏的东西并清理它!使用这些工具/技术。容易!”如果这么简单,我们就不会花这么多时间做了。你经常会收到一个“好数据具有这些品质”的列表,所以去看看你的数据,确保它具有这些品质。如果没有,就想办法把这些品质强加到数据上。与此同时,每个读者都在想,“那么,怎么做呢?”

旁注:如果你搜索“数据清洗理论”,会有一些更好的讨论。

还有努力自动化数据清理(通常在 AI 的帮助下,因为显然 AI 让一切变得更好)。这些努力的一部分源于有太多该死的数据,人类不可能分析所有的数据。但是这些产品/功能也旨在减少清理数据的苦差事,甚至不用看它。对此我非常怀疑。自动化很重要,但实际做清洁也很重要。

打扫卫生是一项艰难而细致入微的工作,为什么我们要像洗衣服一样对待它呢?我们没有给出如何分析数据的清单,对吗?(哦不,有时人们显然会这样做……)

在这篇文章之前,我从未认真考虑过数据清理。但是,当我以批判的眼光看待它时,我发现我们已经在数据分析过程的一个乏味、令人沮丧的部分上贴上了一个令人不快的标签(谁想做清理工作,不妨称之为“舀数据猫砂”)。然后通过层层抽象和糟糕的教育,我们已经忘记了它有多重要。

然后,我们讲述恐怖故事,并进行“关注”研究,即 80%60%40% ,不管怎样,昂贵的数据科学家的时间有百分之多少都花在清理数据上。这一统计数据本身似乎更像是一种模糊的方向表达,而不是确凿的事实。利·多兹在这里写了一篇关于粗略统计的更详细的文章。

无论这种说法的实际真相是什么,其含义和行动呼吁都是明确的——如果我们让清理过程变得更简单、更快速、自动化,我们将迎来数据科学生产力的天堂。首席执行官们可以节省员工人数和薪水。每个员工都可以从一个漂亮的图形用户界面上进行简单的分析。数据科学家将使用最佳算法解决性感问题。会有满溢的酒杯,洞见会毫不费力地从天而降。

撇开愚蠢不谈,停下来想想数据清理实际上是什么。而不是“消除错误以提高数据质量”的机械定义。也不是“数据质量越好,结果越好”的终极目标。先说本体。

我们执行数据清理,因为我们怀疑有关于我们关心的一些主题的有用信号。例如,我怀疑当一个重要的截止日期临近时,我的抱怨量会增加。但是我感兴趣的信号被淹没在大量的噪音和错误中:我的发帖量与截止日期不相关,我的时区随着历史而改变。我下载了奇怪的数据,所以可能会有漏洞。我用两种语言写作。我发了很多微博,所以我不能阅读所有的微博并手工编码。

我们正在进行清理,因为我们希望从噪声中提取有用的信号,为此,我们决定在数据点级别“可纠正”某些噪声。因此,我们清洁这些部件,以免它们影响我们的分析。

等等,但那是数据分析!

我们称之为数据清理,因为不知何故,它“不是我正在做的真正的分析”,而是“之前的东西”。真正的工作是使用带有名称的算法,而不是“查找和替换”。我只是被迫做这种卑微的劳动,这样我就可以实现我作为真理带来者的真正荣耀。

这种清洁工作被认为是机械的,而且“不困难”。一个高中生或 RA 可以这样做,他们花费了我一部分薪水。但是考虑到一个 16 岁的人脑有多复杂,我不这么认为。

这里有一个非常典型的清洁情况。边注,嵌入长得离谱所以我截屏 原文推文这里 。感觉就像在费城滚动了几英里。

清理数据的行为是优先转换数据的行为,以便您选择的分析算法产生可解释的结果。这也是数据分析的行为。

如果我们的算法如此神奇,以至于我们可以只输入原始文本日志,而真正的见解却掉了出来,你猜怎么着,我们永远不会清理。我们的计算机不在乎我们的数据有多难看——都是 1 和 0。回归将高兴地向你提供的任何数字表中吐出系数。所有这些清理工作的真正原因是原始数据的信噪比太低,不符合我们的意图。我们需要提高数据质量来放大信号,以便我们的工具能够找到。

我们这样做:决定每个拼错费城的用户仍然有效,即使他们不会拼他们的家乡。我们没有简单地使用所有的模型特征,因为只有 3 个特征是重要的。我们需要排除具有 XYZ 档案的用户,因为我们给了他们特殊的折扣,他们会在销售页面上偏向我们的 A/B 实验。所有这些来自法国的用户都不算,因为我们没有在那里投放广告。需要排除来自错误#12345 的重复事件,否则会使我们的结果有偏差。

以上都是我们通过决策清理数据的例子。您可能会将一些分类为“清理”,一些分类为“分析”,但是它们都是非常相似的转换类别。被贴上“清理”和“分析”标签的似乎更多的是对其价值的判断——让我们听起来聪明的好东西被称为“分析”。

但是清洁是机械的。分析有意图!

分析意味着我们在寻找意义。清理,一个主要用于“修复质量问题”的步骤,比如打字错误和收集错误,难道没有分析的意图,这是两者之间的区别因素吗?

没有。

因为清理操作本身会对数据进行价值判断。回到费城的例子,对你来说似乎显而易见的是,所有这些拼写错误应该被分组在一起,并被清理为相同的正确值。作为一个经常分析互联网上打开的文本框中的垃圾数据的人,这是我看到这些数据时的自动反应。这是因为我所做的工作通常希望来自给定位置的所有数据被分组在一起。

但是如果你在做语言学研究呢?那些错别字其实对你来说极其有价值。将这种差异标准化会使这方面的任何分析变得不可能。如果我们不存储原始数据(这是推荐的最佳实践,只有一些人遵循),它将永远丢失。

选择以任何一种方式转换数据必然意味着您已经选择用它来做某些事情,而排除其他事情。无论变化是大(输入缺失值、删除条目)还是小(删除尾部空格、规范化日期格式),都没有关系。

作为一个例子,地球上最大的数据生成/收集系统之一,大型强子对撞机生成如此多的数据,以原始形式存储是不可能的。因此,物理学家花费了无数的思考和精力,利用几十年的特定领域知识,创造出定制的算法来过滤和预选要记录的内容。它是为特定目的而构建的—他们实际上设计并控制了整个工具链,包括硬件。

这里应该有些功劳:重申我写的东西没有一样是新的,在写这篇文章的中途,我发了一条关于数据清理的微博,它像病毒一样传播开来。 有人在惊人的推特数据群里 指点我 本刊出自于由凯蒂·罗森和特雷弗·穆尼奥斯(2019)

来自数据人文领域(尽管 15 年前我做了一些计算哲学/社会学,但我甚至不知道这个领域的存在),它更有说服力地讨论了关于数据清理的非常相似的观察结果。非常推荐阅读!

亦作 另一位伟人 把我与 联系起来本文 比较了两种宽泛的清理数据的方法,在无序中强加秩序。它还涉及经济学和生物学领域如何保存原始数据,预计未来可能需要重新分类(重新清理)。

还有一个牛逼的人 给我指了 danah boyd 的 作品这篇论文 讨论了很多大数据的关键问题,包括数据清洗。指出当数据清理对你甚至可以用一组数据说什么有巨大影响时,它被认为是微不足道的。也很值得一读。**

清理数据可以让您了解自己的数据

我坚信,作为一名数据科学家,了解你的数据至关重要。这是我告诉每个向我寻求建议的人的一件事。只有当你知道已经收集了什么,什么还没有被收集,它是如何被收集的,陷阱在哪里,隐藏的依赖在哪里,等等,你才能使用你的数据做出自信的陈述。

达到这种熟悉程度的唯一方法是努力工作,深入熟悉手头的数据集。人们通常将这项工作归于分析的“探索性数据分析”阶段,但是 EDA 经常发生在数据已经被部分清理的时候。真正原始的、不干净的数据通常甚至不能在软件中正常运行,因为一些意想不到的事情通常会出错。解决这些问题会带来大量关于数据集的知识(和问题)。(好吧,精明的读者会注意到这不是唯一的方法,最终熟悉一个数据集的最好方法是亲自收集数据,但这是另一个话题。)

我们中的大多数人并不在严格的机构工作,这些机构会仔细记录数据收集的每一个细节,比如美国人口普查局。在我们的世界里,不存在能够回答关于方法论、数据质量和清洁度的微小问题的手册。此外,让我们诚实地说,我们当中有多少使用人口普查数据的人真正读过这些文件?绝对不是我。

我将提出这样的主张,清理数据是获得对底层数据的坚实理解的先决条件。如果你把这种责任委托给其他人,不管是其他人还是机器,你都有可能对你的数据做一些危险的事情。务实的问题是我们愿意承担多大的风险,以及你是否意识到自己在承担风险。

在许多情况下,这种危险的影响很小——通常很少有人会在意你是否曲解了人口普查数据,制作了一张糟糕的地图来发布。出于权宜之计,你可能愿意相信人口普查在维护高质量数据方面做得很好,并接受你可能会因为没有阅读某处的脚注而做一些愚蠢的事情。

通过在完全信任的基础上保证足够好的数据质量,您可以节省时间并直接跳到 EDA。当使用一个简单用途的众所周知的、可靠的资源时,这是一个非常诱人的立场。但是,即使有可靠的来源,不一致也确实存在,并且可以在以后被发现。希望这不会打乱你的发现。

但是如果你制作的地图被用来做生死攸关的决定呢?还是为了寻求真理的严肃学术研究?那么风险就更大了,你需要绝对确定你的发现不是一些人为的数据。不要相信别人的清洁。

但是我们不能对每个分析都做清洗!那要花很长时间!它不会扩展!

不是每个数据分析都这样。对于每个数据设置。从清洁中学到的知识不会在一夜之间消失。您编写的用于执行清理的代码不会丢失。

清理是熟悉数据集的一种强大方法,也是生成所需数据集以获得有趣结果的一种强大方法。如果你非常了解这些数据,你可以蒙着眼睛浏览,你就不会再做手工清理了。到那时,您已经有了已经构建好的代码、工具和指南,并且对工具非常熟悉。

我并没有说我们不能自动化我们选择做的清洁操作。自动化的问题在于,它可能会将对底层数据的理解与数据的分析和解释分离开来。当我查询一个数据仓库时,我不熟悉由不知名的工程师编写的大量管道,每个管道每小时对万亿字节的数据进行非常具体的转换。这总是让我处于一个非常不舒服的位置,对我工作的基础没有 100%的信心。

但是,如果你正在做清理工作,编写清理代码,并使用它来实现自动化,这不是一个问题。你是发现所有问题并实施所有修复的人。希望你记录并传播这些知识,这样其他人可以受益并节省时间和精力。否则,你只是让别人不得不相信你的分析判断。

没有人能幸免于变化

在所有这些工作中,每个人都需要担心的一件事是需要持续关注数据质量从我们脚下转移的情况。对于任何长期运行的数据操作来说,这都是一个持续的风险。

无论是自动化还是手动流程,如果底层数据收集流程发生变化,那么一切都完了。因此,预计偶尔不得不重新清洁操作。

在现代分布式系统基础设施设置中,防范这些情况是极其困难的。有些东西总是在变化或破裂的过程中,这些都有不可预知的副作用。

让我们将数据清理重新定义为“构建可重用的转换”

一旦你把数据清理工作的地位提升到等同于“全面数据分析”的地位,我们就会陷入这种不安的境地,一切都是分析。将巨石柱分析过程分成几个阶段的冲动太强烈了,无法抗拒。作为一个阶段,我们已经有了探索性的数据分析,有些东西必须填补空白。

我建议我们开始将数据清理视为“构建可重用的转换”,原因有二:

首先,分析使用转换从数据中提取洞察力。我们以某种方式(如聚类、SVM、决策树)洗牌,通过某种镜头(如回归、统计推断)审视数据,我们看到了以前未知的模式和真相。

第二,典型的数据清理操作是在分析过程的早期进行的,以便为“真正的分析”做准备。我们能够这样做的唯一原因是,这些早期的清理转换可以在大量的分析中重复使用。随着我们越来越接近最终的分析,可重用性逐渐降低。

因此“清理数据”的行为实际上是构建一个转换库,该库在同一数据集的多个分析中可以重用。在某个很大程度上任意的截止点,您将数据交给其他人使用。

好了,现在我已经滔滔不绝地讲述了数据清理是分析过程的一个关键部分,让我们来完成数据清理即分析的过程。

“更好地”进行数据清理

当您开始将数据清理视为“我需要采取的步骤,以使我的分析算法产生有用的结果”,而不是“在我可以使用我的数据之前,这里有一个我需要检查的属性和错误的列表”,世界看起来有点不同。我们可以从我们的最终分析目标开始反向工作。

首先,除非你非常确定,否则不要做永久性的改变

当我们开始清理和分析的时候,我们将会在早期做出一系列将来可能会后悔的决定。我们想避免这种情况。因此,第一条规则是尽可能保留原始数据的副本。实际上,在开始工作之前,我已经压缩并单独存档了一个原始数据集,这样我就不会不小心扔掉它。

只有当有压倒一切的限制时(比如 LHC 的体积问题),你才应该考虑永久丢弃数据。在这样做之前,你最好确定你的数据清理过程的质量。与无法撤销任何错误并需要收集新数据的遗憾相比,数据存储相对便宜。

其次,永远要留下完整的分析文件记录

我以前曾经更详细地写过关于这个主题的文章,但是你总是想要一份你的分析的书面记录。从原始数据到最终呈现的转换过程中的每一步都应该有指向之前步骤的链接/参考。这可以提醒你做了什么来完成一个分析,以便日后重现,它也允许你回答关于分析是如何完成的问题(“你考虑了 X 吗?”)几个月后,几年后。

在 Jupyter 笔记本、colab 和版本控制的时代,没有太多的理由不提供线索。随着时间的推移,您的清理转换库将变得足够健壮,您可以将它打包到一个库中。

记住这些基础知识,我们就可以开始清理/分析我们的数据了。

目标 1:修复那些会让你的分析算法窒息的东西

我们都应该非常熟悉这一系列事件:你把数据格式化,把它放入你选择的软件中,点击“分析事物!”按钮,annnnnnd…它崩溃了——无效输入、意外的空值、负持续时间、不正确的数组大小。虫子。

乍一看,这类问题似乎是最机械的,很容易通过自动化处理。这些是突然出现的随机空值,通过表单验证的荒谬表情符号,应该是唯一的重复 id,由于日志系统时钟不同步,具有时间戳的数据条目暗示着时间旅行。通常这些很容易发现,因为你的数据管道崩溃或给出其他无意义的结果。

当人们嘲笑数据清理时,他们正在思考这些问题。有数不清的变化,他们都很讨厌处理。通常你修复了一个,满怀希望地期待你花了几天时间进行的分析最终会有结果…然后一个新的出现了。

许多这些问题的解决似乎也很容易。只需去掉 Unicode,将所有的 NULLS 变成空白,直接忽略重复的代码,只需让我的代码运行!

遗憾的是,在生产环境中,我们无法掩盖所有这些问题。那些怪癖都是 bug。有时它们是无辜的,您可以安全地去掉 Unicode。但有时它们是一个更阴险的错误的结果,一个将偏见引入整个系统的错误。就像可能出于某种难以理解的原因,由于第二个日志记录错误,只有带有表情符号的名字才会出现在数据集中。

问题是,仅仅从数据上看,没有办法知道一个错误属于无辜的灾难范围的哪一部分。你必须去跑腿分析这个问题,自己找出答案。这将大大降低你的工作速度,甚至可能迫使你扔掉你的数据集!这通常是吃力不讨好和不受欢迎的工作。这就是为什么我们讨厌这样做。

但是如果你做不到,你的分析可能就站不住脚了。

目标 2:减少不必要的变化

在柏拉图式球形奶牛落入真空的完美理想世界中,数据集中唯一存在的差异是“重要的差异”。A 组的每个人都在测试中得了 35 分,B 组的每个人都得了 95 分。组 A 和组 B 是克隆体,仅在处理 t 上不同。

显然,我们必须处理现实世界中的变化。但是你可以想象“清理”数据的方法,这种方法可以给各种算法,如回归、k-means 等,提供最大的信号。,同时仍然保持在伦理和统计的界限内。简单的例子是固定拼写和规范标点符号。更高级的情况包括将值分类。

当人们使用大 A 进行“分析”时,他们通常能够找到控制这种差异的方法,使用名称为“特征选择”、“归一化”或“特征生成”的方法,所有这些方法都涉及到用一些差异信息来换取算法上的好处。当他们不想吹嘘它的时候,他们会把它塞进一个脚注/附录,称之为“清洗”。

有些测量的方差对我们有用,有些可以去掉而不影响我们的目标分析。了解其中的区别是从事数据工作的一个重要部分。

目标 3:消除偏见(尽你所能)

偏见是我们的敌人。我们希望我们的工作是稳健的和可推广的,而数据中的偏见会毁了这一点。如果你打算为你花在数据准备上的时间和大脑周期做预算,那就在这里花大部分时间。

用于控制偏差的许多常见操作包括丢弃某些数据条目、填充缺失值或校正/重新采样/重新映射值,所有这些都是为了控制渗入原始数据的特殊数据偏差。

这就是专业知识至关重要的地方。某个主题的专家能够更好地识别数据集中潜在偏差的位置。这些人知道在哪里发现收集的数据中的明显偏见:数据收集错误(重复等),内部测试者帐户,人口过采样,受访者的自我选择,等等。但是专家们也应该知道如何识别数据集中隐含的结构性偏差,什么没有被收集,并且能够想出策略来最小化这些问题带来的损害。

领域知识还会告诉你手头的任务是否需要清理。如果我们不在乎人们从哪个城市申请贷款,我们就永远不用担心清理 50 多种拼写错误的“费城”。如果我们怀疑我们可能需要它,我们会投入一些精力来修复它。

随着目前所有关于机器学习和算法偏见的道德使用的讨论,清理数据的这一方面比以往任何时候都更加重要。如果有偏见的数据进入 ML 系统,就会发生不好的事情,像计算机视觉系统在处理深色皮肤颜色方面仍然有问题

当你达到这一水平时,你正在进行的许多清理操作应该开始变得非常具体,以实现你的最终目标,很难判断你是在清理还是在做分析。这些步骤越来越复杂,需要更严格的论证。

我在给别人做数据集,我怎么知道要清理什么?

除非你知道人们会用这些数据做什么,否则你不会知道。即使你知道,你仍然必须猜测什么可能有助于他们的分析,而不是伤害它。到目前为止,最重要的事情是完整地记录下每一个清洁决定,以备将来之需。

知道在哪里停下来并交给下一个人是这个过程中最难的部分。你必须预见未来,预测人们将要做什么。因为我甚至不能预测我自己会做什么样的分析,更不用说别人了,所以你不会 100%正确,你必须做出调整。最好提前为该迭代做好计划。

谢谢!

希望这篇博文能帮助你稍微改变一下看待清理数据的方式。我承认我甚至没有停下来认真思考“什么是清洁?”直到这篇文章引发了各种有趣的问题。有很多更聪明的人对此有更好的思考和写作,就像我之前链接的那些论文。

我是 Randy Au,目前是 UX 定量研究员,前数据分析师,通用数据和技术爱好者。计数材料时事通讯是一个关于数据科学、UX 研究和技术的不那么性感的方面的每周数据/技术博客。偶尔会谈到其他有趣的话题。

最初发表于T5【https://counting.substack.com】。欢迎推文和评论。**

数据清理:数据科学不性感的一面

原文:https://towardsdatascience.com/data-cleaning-the-unsexy-side-of-data-science-680fedabcb20?source=collection_archive---------20-----------------------

对现实生活中的一个例子的深入研究

图片由皮克斯拜克利姆金提供

《哈佛商业评论》称数据科学家为21 世纪最性感的工作时,我怀疑“性感”是否包括了数据清理这一平凡的任务。虽然许多人认为数据科学就是使用机器学习算法来建立模型和产生商业影响,但数据清理也是成为数据科学家的一个重要组成部分。**

对于那些不熟悉数据清理过程的人来说,它可以像检查丢失的值、修复格式和标准化值一样简单——但这仅仅触及了表面。今天,我想通过一个现实生活中的例子来讨论我的经历,这个例子超越了基础知识,让你了解作为一名数据科学家应该做些什么。

背景

我刚刚在一家新公司开始工作,市场渠道要求我计算访客注册率,因为谷歌分析中没有这些信息。作为一名新员工,我不熟悉这些数据,经过一些初步研究,我得出结论,有足够的数据来进行分析。当我开始更详细地查看数据并遇到一些障碍时,我意识到我说得太早了。

解决缺失的环节

我的第一个问题是连接访问者注册。网站访问者和用户注册之间没有连接数据的公共密钥。访问者被分配一个 cookie ID,如果他们注册,他们被分配一个用户 ID,但是注册表格不存储 cookie ID😕

在回到市场部告诉他们这项任务是不可能的之前,我决定探索连接数据的替代方法。我查看了两组数据之间的所有数据字段,以确定一个我可以使用的公共密钥,并找到了 IP 地址。这不是一个完美的解决方案,因为一个访问者可能有多个 IP 地址,但营销部门不知道每个渠道的注册率是多少。他们需要方向性的洞察力来决定在短期内将精力集中在哪里,直到工程修复了访问者和注册之间的联系。否则,他们可能会浪费时间来优化表现不佳的渠道。

为了确保 IP 地址是一个可行的选择,我比较了整体访客注册率,我计算的结果与其他营销报告类似。如果比率相差甚远,我会告诉市场部,在数据修正之前,分析是不可能的。

****外卖:

  • 现实世界中的数据是不完美的,您可能需要提出替代方案,以在短期内提供方向性的见解,直到找到长期解决方案。在我的例子中,我不得不使用 IP 地址来链接访问者和用户。
  • 在继续之前,将您计算的费率与其他报告进行比较。您提议的解决方案可能会生成不正确的结果,您需要等待数据得到修复。
  • 向利益相关者传达数据限制,以设定期望值。洞察力是方向性的,应在数据确定后重新计算。

数据发现和删除重复项

下一步是创建一个 IP 地址到用户 ID 的映射表。这在理论上听起来很简单,直到我查看数据,发现有两个用户表,每个都有重复的用户 ID 记录。此外,用户表具有不同的覆盖范围,这意味着一个用户 ID 可以在两个表中,也可以只在一个表中。

首先,我必须对用户表进行重复数据删除,以确保每个表只有一个用户 ID 记录。我一次检查一个用户 ID 的重复记录,以评估哪些值不同。我注意到最早的用户记录与注册日期的访问者 IP 地址相匹配。我通过选择创建日期最早的记录,继续对用户数据进行重复数据消除。

我使用了一个按用户 ID 的完整外部连接来创建一个完整的用户列表。我运行了另一个重复检查,删除了一个 IP 地址映射到多个用户的记录,因为我不能确定哪个用户 ID 对应于那个访问者记录。

****外卖:

  • 对于具有多个源的数据,运行覆盖率检查以确定是否需要创建新表。我注意到一个表只包含历史数据,而新用户在另一个表中被更新。这意味着我必须创建一个新表来获得创建的用户的完整列表。
  • 检查重复记录的值以确定差异(如果有),从而确定要应用重复数据消除的业务逻辑。在我的例子中,我选择了最早的记录,因为它包含了与访问者匹配的正确的 IP 地址。可能所有值都相同,您可以通过选择任何记录来对表进行重复数据删除。
  • 始终检查源表中的重复项以及从源数据创建的新表。如果有您没有发现的重复项,您可能会计算出错误的结果。如果我保存了一个 IP 地址映射到多个用户的记录,我可能会按渠道报告错误的注册率。

应用业务逻辑生成新数据

加入访客到用户后,我需要按营销渠道分组。不幸的是,没有可用的营销渠道字段,我不得不从访问者数据的其他字段中获取它。我研究了 Google Analytics 如何定义营销渠道,并使用类似的业务逻辑来与现有的营销报告保持一致。

****外卖:

  • 如果你不确定获取价值的业务逻辑,研究现有的利益相关者使用和应用的类似定义的报告。这将有助于他们理解你的数字,因为他们已经熟悉了现有报告中使用的定义。

最后的想法

Tableau 将数据清理定义为 修复或删除数据集 内不正确、损坏、格式不正确、重复或不完整数据的过程。 “在我的案例中,我用 IP 地址固定了从访客到注册的链接,去除了重复,应用了业务逻辑,生成了不完整的渠道数据。虽然数据清理不像构建机器学习模型那样性感,但它是成为数据科学家的一个重要部分,我希望你现在对现实世界中会发生什么有更好的想法。

你可能也会喜欢…

** https://medium.datadriveninvestor.com/how-to-become-a-successful-data-storyteller-f90e677e4770 **

机器学习产品中的数据收集

原文:https://towardsdatascience.com/data-collection-in-machine-learning-products-816c1e1951b1?source=collection_archive---------29-----------------------

带示例

布雷特·乔丹在 Unsplash 上的照片

当我刚刚开始我的数据科学之路时,对我来说一切都是关于精确建模的。但我很快意识到,要提供真正的价值,模型不能存在于真空中。为了获得合理的性能,我遗漏了数据的重要方面,不太清楚用户对模型结果的反应。 因此,我开始从我认为或知道的 ML 驱动的产品中收集例子,以了解不同公司收集数据的方式来解决这些问题。在这篇文章中,我想分享一些我收集的案例,大部分来自面向消费者的产品,以及它们为从事数据驱动产品的数据科学家和产品经理解决了什么问题。

尽管我下面描述的许多模式并不完全是专门针对 ML 产品的,并且可以应用于任何数字产品,但当涉及到 ML 时,它们变得至关重要。为什么?ML 模型可以在他们从未见过的例子上操作,或者在高度个性化的环境中操作,所以他们几乎不可能对每个输出进行测试。因此,允许用户反馈有助于识别不太好的体验。此外,一些模型能够动态地整合反馈,并几乎立即调整用户体验。最重要的是,ML 模型是以数据为基础的,所以规模化的优质数据收集是优质模型的基础。

免责声明 。我不实际上知道这篇文章中描述的元素在真实产品中是如何工作的——这篇评论是基于我的理解和公司在公开的文章和演示中分享的信息。我在这里描述的是我的观点——“我可能会做什么”。

我将写几类数据收集:

  1. 预体验—用于在使用前调整产品功能。
  2. 反馈——用于衡量用户对产品体验的反应。
  3. 众包——用于收集与特定用户的产品体验无关的额外数据。

体验前模式—准备好开始了吗?

体验前数据收集可用于快速个性化产品。这里的目标是快速收集相关数据。这有助于确保用户尽快接触到数据驱动的产品功能。在某些情况下,这是让产品发挥作用的唯一方法。因此,数据收集需要在产品或功能的开始阶段进行。它可以以填写用户资料、设定个人目标或校准产品的形式出现。

有一系列可能的 ML 学习模型可以涉及个性化——推荐器、分类器、回归模型等等。他们可以将收集的数据用作模型要素或标签。

记住 也很重要,当你要求用户分享信息时,你需要为他们提供价值作为回报

目标和偏好——我想,我喜欢,我是

对于 推荐器 系统,收集偏好数据有助于解决用户“冷启动”问题。我们可以在从用户与系统的交互中获得足够的隐式数据之前,构建一个初始特征向量。在下面的例子中,Spotify 用户被要求在入职时选择至少 3 位最喜欢的艺术家。然后,可以将协同过滤应用于用户的选择,以提供初始播放列表推荐。

(左)图片由作者提供,截图取自作者在 Coursera 内容推荐设置| (中)图片由作者提供,截图取自作者在 Youper onboarding 的体验,心理健康目标| (右)图片由作者提供,截图取自作者在Spotifyfavorite artists on boarding 屏幕的体验。

由于用户通常希望在入职期间回答一些问题,这也是一个捕捉行为方面的机会,否则很难衡量,如动机或兴趣。

重要的是要对你要问的问题的数量和类型有足够的选择性,以避免侵犯用户的隐私或使用户的入职时间太长而无法完成。 所以你需要了解什么样的数据可能对你的模型最有鉴别能力。在问用户一个额外的问题之前,你需要做用户或领域研究,与专家交谈,分析可用数据以确定最有希望的方向。然后提出假设,试着收集一些数据来验证它是否带来了有用的信号。

校准—我们来调整一下

校准通常用于传感器数据,以确保该工具在每个特定设备上都能按预期工作。一个例子可能是 Face ID,其中人脸识别模型的最后一层应该根据特定用户的数据进行训练。校准可以用来获得正面的类样本——从不同角度看用户的面部。

苹果 Face ID 校准界面|图片由弗拉基米尔·雅基莫夫提供,经允许后发布,截图由弗拉基米尔在设置 Face ID 时拍摄。

反馈模式——你觉得怎么样?

反馈被称为输出,可以反馈给系统。当我们考虑 ML 的产品环境时,反馈可以通过用户对模型输出的反应来定义,该模型可以用来改善用户体验。

隐性与显性—观察或询问

隐性反馈 通过观察用户对产品组件的反应(点击、鼠标悬停、转化、参与持续时间)来收集。

隐式反馈的好处是它不需要用户的额外操作,所以它是为每个人收集的。与此同时,仅依赖隐式反馈会使理解用户行为背后的细微推理变得更加困难。如果没有额外的信息,就无法判断用户在停止播放 YouTube 视频时是感到无聊还是变得忙碌。然而,当用户再次回到应用程序时,理解原因对于决定显示此内容或类似内容至关重要。此外,在许多情况下,需要花费时间来收集足够的区别性隐式数据,以便为每个用户做出准确的决策。

不是任何用户活动数据收集都可以被视为反馈。例如,我的 Spotify 流媒体历史记录需要与我的推荐联系起来,才能成为反馈。我是从建议的曲目中选择播放列表还是搜索特定曲目?我在播放播放列表时跳过了任何曲目吗?反馈问题总是——对体验的反应是什么?

Spotify 流媒体历史作者的数据样本。

像脸书反应或保存到书签这样的工具也可以归因于隐性反馈。他们都在帮助用户实现他们的目标——让他们的朋友知道他们关心这个帖子,或者确保在将来可以方便地访问重要的项目。这些动作向模型发出信号,表明特定内容对该用户很重要。与此同时,他们对动机的理解也有所不同——对一个帖子的反应是 关心生气

明确的反馈 通过提出明确的问题来获得。如果用户可以选择不回答(就用户体验而言,这是一个很好的做法),这种类型的反馈带有自我选择偏差。只有参与的用户或有强烈意见的用户才会愿意提供。

(左)图片由作者提供,截图取自作者在 Facebook Messenger 语音通话反馈屏幕| (右)图片由作者提供,截图取自作者在 Gmail 收件箱的广告体验。

同时,通过询问更多关于体验的具体问题,可以帮助你更深入地理解问题。

正面与负面反馈——喜欢还是讨厌

正反馈 确认与产品互动成功。我喜欢它,它很有用,这对我很有用。
负反馈 突出系统的问题或允许改变不想要的结果。我不喜欢它,它是不正确的,我不想这样。

“对话不重要”|图片由作者提供,截图取自作者在 Gmail 桌面收件箱的体验。

例如,Gmail 的“对话不重要”功能可以为预测邮件重要性的模型收集正确的标签。它可用于改进模型整体或特定用户的个性化预测。

只有在大多数配置中,隐式反馈往往是积极的,而显式反馈在一个界面元素中既可以是积极的,也可以是消极的。

询问与允许反馈

我们可以选择 主动向 用户 询问反馈 ,通过发送推送通知或使其成为产品流的一部分。

例如,它可以用作主动学习算法的一部分,在这种情况下,获取特定案例的标签很重要。向相关用户寻求标签会增加他们做出反应的机会。例如,Airbnb 或 Booking.com 等服务可以主动联系用户,通过询问新物业来解决项目“冷启动”问题,或者通过比较不同用户的反应来建立用户档案。

(左上)图片来自作者,截图来自作者入住后【Booking.com】发给作者的房产评级推送通知(酒店名称已修改)| (左下)图片来自作者,截图来自作者到访后谷歌地图发给作者的房产评级推送通知| (右图)图片来自作者入住后 Airbnb 发给作者的房产评级应用内流程截图

被动反馈 较少干扰用户体验,但仍可访问。用户可以使用它来纠正或报告他们的体验。正如我之前提到的,有时我们无法测试模型在现实生活中会遇到的所有边缘情况,因此允许这样的反馈可以让我们对负面或混乱的用户体验保持透明。

Google 搜索的单位转换器中的反馈|作者图片,作者通过搜索“英寸到厘米”截图,打开反馈调查。

确认反馈 —我们做对了吗?

确认反馈类似于主动反馈。在这种情况下,产品变更是主动进行的,用户可以选择确认或拒绝。在下面的例子中,语法上自动纠正单词,但允许用户通过确认改变来提供正面反馈,或者通过回滚到最初键入的单词来提供负面反馈。然后,该反馈可以用作分类模型的标签。这些将是重要的标签,因为模型犯了一个错误,这个错误已经被用户纠正了。

语法上自动更正|图片由作者提供,截图由作者在使用语法上的自动更正时,通过键入“隐含地”进行截图。

众包模式——帮助我们帮助他人

在上面的例子中,用户通常希望在分享数据后马上发生一些事情,以改善他们的体验,或者表达他们对刚刚发生的交互的看法。通过众包,用户可以被激励提供数据来影响其他用户或随着时间的推移获得更好的产品质量。

这可能是您获得关于没有足够数据的项目的更多信息的方式,方法是询问几个用户,获得您不确定的预测标签,或者为尚不存在的全新产品收集数据。在下面的例子中,Linkedin 要求其他用户填写他们的联系信息,这不会影响他们的即时体验。

(左)“帮助我们识别相关机会”——图片由作者提供,截图取自作者的 Linkedin feed 并被修改以隐藏个人信息| (中)“帮助我们了解你的视频是关于什么的”——图片由作者提供,截图取自作者的“帮助改进 Google Photos ”以作者的视频为特色的流程| (右)“在公交车上是什么感觉?”—图片由作者提供,截图取自作者的谷歌地图搜索。

结论

收集相关数据是建立有效的 ML 模型和它们所驱动的伟大产品的重要工具。在多样化的数据收集机制方面与产品和 UX 团队密切合作,可以帮助数据科学家及时获得相关数据点,从而确保更好的模型性能。

如果您想了解机器学习的产品和 UX 方面的更多信息,请查看:

  1. 苹果人机界面指南— 输入

2.以人为中心的机器学习 —共同学习和适应的计划

3.贾瓦黑尔,加维什,索姆佐尔,马丁,科斯特科娃,帕蒂。(2010).在线音乐推荐服务中隐式和显式反馈的比较。10.1145/1869446.1869453.

data_dashboard:用于 EDA 和基线 ML 模型创建的 Python 包

原文:https://towardsdatascience.com/data-dashboard-python-package-for-eda-and-baseline-ml-model-creation-f10840a6cea0?source=collection_archive---------23-----------------------

基于 HTML 的仪表板,让您的头脑环绕在数据周围

要素页面中的散点图网格(Iris 数据集)

你曾经被提供了一个 Excel 电子表格,CSV 文件或任何其他数据,没有任何有用的上下文,但有一个任务是“从中做出有用的东西”吗?或者也许你刚刚参加了另一个 Kaggle 比赛,下载了数据,并开始想知道从哪里开始?我记得在那里,我用 Jupyter Notebook 在一些单元格中创建了无数的表格,在其他单元格中创建了可视化,并在其他地方创建了我自己的注释。最后,我只剩下一个乱七八糟的笔记本,根本不知道下面发生了什么。恼怒和恼怒之下,我冒险踏上了创建代码的旅程,这些代码不仅能完成所有的工作,还能以一种实际上有助于理解数据的方式呈现数据。因此,经过大量的思考和更多的编码,我成功地完成了这个版本,它不仅可以处理几乎所有的数据,还可以为其他人(不仅仅是我)所用。向您呈现…

数据 _ 仪表板

HTML 仪表板中的一个页面

data_dashboard 是一个 Python 包,它试图在您获得数据但不知道从哪里开始时帮助您。该软件包旨在:

  • 通过描述性统计和可视化提供数据概述,帮助数据科学家理解数据;
  • 通过提供直观的界面,帮助进行特征工程/转换/数据清理;
  • 通过对一组预定义的模型(可以定制以满足数据科学家的需求)执行 GridSearch,创建最佳可能的“基线”机器学习模型(sk learn);
  • 创建 HTML Dashboard,它不仅是用户友好的和易于导航的,而且是一个专注于设计和风格的(为了美学上的愉悦和“商业”演示准备);
  • 为初级数据科学家提供教育材料,他们可能缺乏广泛操作数据和创建适当可视化的能力;

您可以通过 pip 下载该软件包:

pip install data-dashboard

要开始使用它,你需要三样东西:

  • X :您的数据(已经载入内存)
  • y :你的目标变量(已经载入内存)
  • output _ directory:创建仪表板的文件夹路径

请记住,没有必要预先转换您的数据——Dashboard 会处理好的。如果你手头没有任何数据集,你可以使用内置的例子(sklearn 的玩具数据集)。

这样一来,仪表板的创建就非常简单了:

from data_dashboard import Dashboard
from data_dashboard.examples import irisoutput_directory = “your_path/dashboard_output”
X, y, descriptions = iris()# descriptions is an optional argument, more in documentation
dsh = Dashboard(X, y, output_directory, descriptions)  dsh.create_dashboard()

HTML Dashboard 将在提供的输出目录中创建,并在您的默认浏览器中打开供您研究。如果您对定制仪表板的创建感兴趣,请访问这里的文档。

如果您不能创建自己的仪表板,您还可以查看已部署的示例(使用 Titanic 数据集):【https://example-data-dashboard.herokuapp.com/

仪表盘

Dashboard 只不过是一组“静态”的 HTML 文件——不需要将它们放在服务器上或用 localhost 模拟来查看它们。您可以自由地移动文件或删除它们,并快速创建新的文件(没有任何额外的复杂性层)。但是,请记住,用于创建可视化和表格的每一部分数据都是直接嵌入到 HTML/JS 代码中的——除非您的数据是公开的,否则全局共享该仪表板是不明智的。

创建的仪表板分为 3 个部分:

  • 概观
  • 特征
  • 模型

概观

仪表板的概览页面

创建的控制面板的第一页是概述,这是理解数据的简单而重要的开始。你的 X 中的每一个特征都在这里得到各自的统计数据:平均值、中值、最小值、最大值等等。分类变量也是如此,它们在内部被转换成数字以实现这一点。如果您的特性不会在流程中使用(例如,这是一个日期类型的特性),它的名称将包含在未使用的列部分。请记住,表格中的所有功能名称(例如图中所示的年龄)都是“可悬停的”——当鼠标指针经过它们时,会出现一个包含附加信息的描述框。最后但同样重要的是,页面的底部元素是一个很好的老式 seaborn pair plot——所有有用的信息都浓缩在一个图中。

特征

仪表板的功能页面

“功能”页面让您深入了解单个功能及其与其他功能的关系。这里最重要的是左上角的“汉堡”按钮——你可以用它来改变当前的功能。页面也被分成更小的子部分,以防止不必要的混乱。

前两个部分侧重于活动要素-第一部分是描述性统计数据和分布直方图,第二部分是具有实际变换要素的变换器。如前所述,Dashboard 会转换所有提供的数据,以便在模型训练中使用。然而,默认转换器非常简单——如果您觉得它们不够用,您可以随时进一步定制它们(或者甚至预先转换您的功能并完全跳过 Dashboard 的转换)。同样,如果你感兴趣,请参考文档。另一件需要注意的事情是数字类型特征的额外可视化行-3 个不同的转换器用于“归一化”值,然后将它们绘制为直方图-这样您可以决定哪个归一化器在这方面做得最好。

第三部分是特征之间具有皮尔逊相关性的热图。这是页面中交互性最差的可视化,因为它不响应功能的变化。可视化也不“关心”相关的方向-0.8 和(-0.8)在颜色强度方面被视为相同。还对“原始”值和标准化值计算相关性。对结果要有所保留,因为分类变量与数值变量的处理方式是一样的。

特征页面中的散点图网格

页面的最后一部分是散点图网格。还记得 seaborn 在概览页面上的 pairplot,以及它是如何绘制每个特性之间的关系的吗?这是同一个概念,但有一个额外的变化——选择的特征现在在每个情节中起着一个着色因素的作用。您可能会发现识别数据中的一些模式很有用。

另一方面,有时 seaborn 的总览成对图和散点图网格都没有创建。有一个很好的理由,因为那些元素是基于你的 X 中的特性——你拥有的越多,需要创建的支线剧情就越多( n )。因此,如果达到一个任意的限制,那么这两个元素在运行时和可视化上都将被禁用(在大约 200 个或更多的图中寻找模式没有什么意思)。文档为您提供了在需要时如何启用它们的方法。

模型

Dashboard 的工作并不仅限于使用表格和可视化工具进行探索性数据分析,还将对您的数据进行搜索、选择和训练。Dashboard 会自动评估目标变量内部的内容,并决定它所面临的问题类型(回归、二元分类或多类分类)。接下来,网格搜索一组默认模型,并选择性能最佳的模型(基于您选择的评分函数)。这一步是可定制的——您可以控制是对所有模型进行网格搜索,还是只对性能最好的“默认”模型进行审查(类似于 LazyPredict 包)。此外,您还可以提供自己的模型及其参数来进行搜索和比较。如果你感兴趣的话,一切都写在文档中。

为了说明这一点,Dashboard 试图纳入所有关于训练模型的良好实践—数据被分成训练集和测试集,所有模型和变压器的训练都是在训练集上完成的,您在仪表板中看到的结果是使用测试集计算的。

最后但并非最不重要的一点是,模型页面中包含了适当的可视化——您可以比较表现最佳的模型,查看它们在特定问题评估方面的不足之处,等等。根据问题的类型,将创建不同类型的可视化(例如,二元分类的 ROC/Precision-Recall/DET 曲线、回归的预测误差和残差以及多类分类的混淆矩阵)。情节是使用散景库构建的,因此它们是高度交互式的——你可以四处移动情节,放大或缩小,点击图例以静音一些元素,悬停以获得附加信息,等等。

表中始终包括表现最佳的模型的分数,您可以看到模型在不同的评分函数下是如何工作的,而不仅仅是在开始时选择的那个。此外,每个模型名称都是“可悬停的”(类似于表中的特征名称),但它将向您显示用于创建模型的参数,而不是描述。

类似地,预测表也存在于所有类型的问题中——这是一个简单的表,比较不同模型对每行数据的预测。您可以尝试使用它来识别任何“有问题”的行。

结论

data_dashboard 包的创建不仅是为了自动化数据科学家在第一次接触新数据时需要解决的所有初始步骤,而且是为了以用户友好和以设计为中心的方式完成这些步骤。理解数据是成功分析和预测的关键之一——培养这种“纽带”,你很快就会成为大师。希望 data_dashboard 能在这方面帮助你!

证明文件

https://data-dashboard.readthedocs.io/en/latest/

开源代码库

https://github.com/maciek3000/data_dashboard

放弃

请记住,这是我第一次尝试 Python 包(甚至是其他人使用的开源代码)。如果你遇到任何问题或者你觉得有些地方可以改进,请随时联系我(任何社交门户或电子邮件:【dowgird.maciej@gmail.com】T2)。我很乐意得到反馈!

Tableau 中的数据加密

原文:https://towardsdatascience.com/data-densification-in-tableau-93c0a6bfcc5f?source=collection_archive---------19-----------------------

理解 Tableau 中的数据加密所需的一切

索尔·梅尔卡多在 Unsplash 上的照片

先说几个重要的问题。

为什么我需要知道 Tableau 中的数据加密?

好吧,如果你曾经建立一个仪表板,你想显示任何类型的曲线路径,像地图上的飞行路径,桑基图,径向图等。你需要数据加密。

Tableau 不支持任何类型的现成曲线图表。因此,我们使用数据加密来构建它们。

什么是数据增密?

数据增密基本上是一种对数据集进行增密的技术,或者更简单地说,是增加数据集中的观察次数。

我们举个例子。假设,我们的数据集中有两个点,如下图所示,我们想用这些点构建一条弧线。

数据集(作者提供的图片)

让我们拖动列和行货架上的 X 和 Y,并将它们更改为尺寸。我们只得到两分。如果不添加更多的点,Tableau 无法绘制圆弧。

使用 Tableau 绘制数据集(图片由作者提供)

如何增加数据集的密度?

本质上,我们将在同一个 excel 表中创建另一个选项卡(我们将它用作数据源)并添加这些额外的点。它应该看起来像这样。

数据加密的额外加分(图片由作者提供)

现在,我们将用两个数据点在这个工作表和原始数据集之间进行交叉连接。交叉连接或笛卡尔连接基本上是将第一个表的每一行与第二个表的每一行结合起来的连接。 Tableau 默认不支持交叉连接。因此,我们通过使用一个带有内部连接的公共关键字来欺骗 Tableau。这个关键字可以是任何内容。我用了“十字架”这个词。

Tableau 中的交叉连接(图片由作者提供)

在这一步之后,我们将看到 10 倍于原始数量的观察结果(在本例中为 20)。我们已成功加密数据集。

增密数据集(按作者分类的图像)

如何使用数据加密绘制曲线图表?

在尝试创建弧之前,让我们尝试使用这些点绘制一条增密的直线。对于制作直线,我们 不需要 增密数据,但是为了更好地理解这个概念,我们将首先从增密直线开始。

O 你的目标是画出 10 个均匀分布的点,并用它们画一条线。

现在,要在这条线上添加这些点,我们需要两样东西-

  • 两个连续点之间的距离
  • 他们的坐标,以便他们可以被标绘

间隔

想想你如何将一根 12 英寸长的棍子分成两部分。你可能会先将长度分成两半(6 英寸),然后从两端开始将它折断 6 英寸长。

Bartosz Kwitkowski 在 Unsplash 上拍摄的照片

使用相同的原理,通过 n 个等距点分割该线,我们得到该线的长度并除以(n-1)。

所以,间距应该是—

(3–1)/(10–1) = 0.222

这 10 个点的坐标

既然知道了起点(1,1)的坐标,就可以用间距来计算所有多余点的 x 坐标。

一旦我们得到了 x 坐标(1,1.22,1.44,1.66,1.88 …),我们需要用公式将它映射到额外的点,这样我们就可以在计算的字段中使用它,而不是硬编码。

x =(额外点+I)*间距

其中 I = x/间距-额外点

I =(1/0.222)-1 = 3.5

加分 1 = (1+3.5)*0.222 = 1

加分 2= (2+3.5)*0.222 = 1.22

加分 3= (3+3.5)*0.222 = 1.44

加分 4= (4+3.5)*0.222 = 1.66

加分 5= (5+3.5)*0.222 = 1.88

加分 6= (6+3.5)*0.222 = 2.10

加分 7= (7+3.5)*0.222 = 2.32

加分 8= (8+3.5)*0.222 = 2.54

加分 9= (9+3.5)*0.222 = 2.76

加分 10= (10+3.5)*0.222 = 2.98

请注意,我们正在画的这条线的方程是 y=1x+0。所以,基本上 y=x。

表格计算

首先,我们计算间距,然后用它计算 x 和 y 坐标。

Tableau 计算字段(图片由作者提供)

结果是相同的直线上有更多的点。

数据加密前后(图片由作者提供)

现在,让我们用同样的方法画一个圆弧。为此我们将使用三次方程-

y=x

由于方程不再是线性的,我们需要根据上面的方程改变 y 坐标。

Tableau 计算字段(图片由作者提供)

将增密的 X 坐标和新的 Y 坐标拖动到列和行架上,并将其更改为尺寸。我们在这里。我们的电弧准备好了!

最终曲线图表(图片由作者提供)

当你想在 Tableau 中构建一个弯曲的图表时,它基本上是在连续的点之间画线。因此,点数越多,曲线看起来就越平滑。

尽管曲线看起来几乎很平滑,但您可以尝试添加更多额外的点来平滑曲线。

数据加密是一种重要的数据可视化技术。还有其他方法来增加数据集的密度,但我觉得本文中探讨的方法最简单,并且适用于小型数据集。应该谨慎使用它,尤其是当您有一个包含数百万行的庞大数据集时。

关于这个话题的更多信息,你可以参考这篇博客文章,其中 KEN FLERLAGE 对此做了更详细的描述。

https://www.flerlagetwins.com/2019/05/intro-to-data-densification.html

感谢阅读!

理解数据发现和数据可观察性之间的关系

原文:https://towardsdatascience.com/data-discovery-and-data-observability-how-do-they-interact-8c5211df698?source=collection_archive---------28-----------------------

数据可观测性是后端,数据发现是前端

图片来自 Castor 的博客

合著者:凯尔·柯文——big eye 的联合创始人兼首席执行官

数据可观察性工具和数据目录已经成为现代数据堆栈的重要组成部分。这不足为奇。数据量呈爆炸式增长,移动和操作这些数据的工具正以惊人的速度增长。数据越多,工具越多,就越难找到、理解和信任你拥有的数据。最近,有两个关键问题使数据可观察性和数据发现解决方案成为焦点:

  1. 负责将数据从一个系统转移到另一个系统的数据管道已经变得极其复杂。随着数据操作工具的增多,数据管道中相互连接的部分越来越多。数据更有可能在整个管道中被破坏,并且定位故障发生的位置或了解如何解决问题变得更加困难。因此,数据工程师需要花费数天时间来寻找数据问题,整个组织对数据的信任度直线下降。
  2. 随着组织中数据集的数量呈指数级增长,文档编制成为一项极其艰巨的任务。手工记录数千个表和数百万个列是不可能的。因此,数据用户花更多的时间去寻找和理解数据,而不是进行有价值的数据分析。

而是新的问题,新的解决方案。数据可观察性解决第一个问题,而数据发现解决第二个问题。本文致力于解释这些工具是什么,以及它们如何协同工作来为您公司的数据带来可信度。

数据可观察性和数据发现:它们是什么?

数据可观察性指的是组织完全了解其系统中数据的健康状况的能力。可观察性实现了对数据管道中数据行为(如数据量、分布、新鲜度)的持续监控。基于这些见解,它创建了对系统、其健康和性能的整体理解。拥有对数据管道的“可观察性”意味着你的数据团队可以快速准确识别和防止数据中的问题。数据可观察性工具结合了工具、监控、异常检测、警报、根本原因分析和工作流自动化等功能。这有助于数据团队发现、修复和防止问题搞乱他们的分析和 ML 模型。

数据发现工具使任何使用数据的人能够快速和准确找到并理解他们需要的数据。以发现为中心的目录(与企业中常见的以控制为中心的目录相反,这些目录需要仔细管理谁可以在多长时间内访问哪些数据)将搜索、受欢迎程度排名、查询历史、世系、标记、Q & A 历史等功能与公司仓库中的所有数据相结合。这有助于数据团队更快地移动,减少混乱和误用风险。

但是为什么“快速”和“准确”如此重要呢?

快速很重要,因为许多从事数据工作的人很难找到,雇佣起来很贵,而且每周都超负荷工作。减去 10 分钟的空闲时间,找到并通读过时的文档,或者运行一系列重复的 SELECT *查询。尤其是当每个人都在静静地每周做 5-10-20 次的时候。如果您有一个 10 人的数据团队,平均每年花费 900,00 0 美元,那么您很容易每年损失 70,0 00 美元,而且随着您的团队规模的扩大,损失还会增加。

准确地说很重要,因为当团队成员为企业做实际工作时,工作的正确性取决于他们是否正确地使用了数据。做分析以告知当年支出增长的人可能不得不猜测使用 3 个时间戳列中的哪一个:事件记录在用户移动设备上的时间、事件到达公司网关的时间、记录写入数据库的时间。除了它们可能被命名为对记录它们的工程师有意义但对其他人来说难以理解的事物:ts、created_at 和 local_time。最终的分析通常以数据用户的纯粹猜测而告终。

需要一个全面的解决办法

速度和准确性是复杂的问题。完全解决这些问题的团队可能仍然会获得手工文档或者基本管道测试覆盖的一些好处,但是他们错过了由于知道这两个问题正在被全面解决而带来的生产率提高。事实上,速度和准确性作为投资的函数有一个凸值,这意味着你要么全押,要么根本不做。半心半意的努力不会让你有任何进展。这促使优步、Airbnb、Lyft 和 LinkedIn 等公司的一些世界上资金最充足的数据团队不仅建立了俗气的局部解决方案,还为这两个问题领域建立了成熟的内部产品。

当团队全面解决了这两个挑战时,他们会得到一个神奇的奖励特性:信任。****

信任是一种模糊的东西,很难量化,但每个组织都非常想要。没有人喜欢质疑他们用来决定是否继续每月花费 5 万美元进行广告宣传的数据,或者新产品功能是否真的提高了 11%的参与度,或者用户看到的模型预测是否会出问题。

💡但是要获得信任,组织需要知道两件事:我们是否以正确的方式使用数据,以及数据是否真的按照预期的方式工作。

像 Castor 这样的发现产品解决的是前者,Bigeye 这样的可观测性产品解决的是后者。但是当你两者都有的时候会发生什么呢?

在像优步、Airbnb、网飞和 LinkedIn 这样已经在内部构建了这些产品的全球规模的公司中,它们通常是深度集成的——看看他们关于 Databook、Metacat 和 Datahub 的博客帖子就知道了。这为数据团队提供了他们需要的所有元数据,让他们知道他们正在以正确的方式使用数据,数据正在按预期工作,并且在不增加工作流摩擦的情况下完成所有这些工作。

现在,数据科学家知道使用三个时间戳列中的哪一个。他们知道,在过去的 90 天里,没有任何 nulls、dupes 或 future 值隐藏在其中,会扰乱他们的分析。由于耦合良好的工作流程,他们在大约 10 秒钟内就知道了所有这一切。

为什么需要独立的数据目录和数据可观测性平台?

您现在可能已经理解了,以一种全面的方式解决速度和准确性问题将使您在数据策略方面达到您想要的位置。但是一个问题仍然存在:全面解决这些挑战是否意味着使用一个单一的、一体化的工具来实现数据可观察性和数据编目,还是应该投资购买两个独立的工具来无缝集成?出于显而易见的原因,我们个人建议使用两种不同的工具。

发现和可观察性问题是特殊的,因为数据发现解决方案的主要用户不同于可观察性平台的主要用户。数据分析师、产品科学家和其他数据消费者关心数据发现,因为他们需要找到、理解和使用数据来完成工作。另一方面,数据工程师更关心可观察性,因为他们负责修复和预防数据管道中的问题,以确保数据的可靠性。

这两个配置文件具有完全不同的工作流程。数据工程师希望在他们自己的内部系统中的工具(如 PagerDuty)中捕获数据质量信息,而数据分析师希望看到这些信息显示在数据目录中。即使在 UI 方面,数据工程师和数据分析师也有不同的期望。独立的数据可观察性平台可以满足数据工程师的工作流,而独立的数据目录可以满足分析师和业务用户的工作流,而不会影响他们。

数据发现和数据可观测性是两个复杂的问题,需要大量的专业知识才能有效解决。由于这个原因,只要两个解决方案无缝集成,许多数据团队将会更好地结合每个问题的最佳解决方案。

最后的想法

如果没有数据发现数据可观察性,利用您的数据是极其困难的。随着组织收集越来越多的数据,以及数据管道过程变得越来越复杂,这种情况会变得更加严重。同时解决速度和准确性将建立对您所拥有的数据资产的根深蒂固的信任。全面解决这些问题的最佳方式是将最佳发现和数据可观察性解决方案结合在一起。如果您需要任何选择帮助,我们已经将可观察性发现解决方案的基准放在一起。

原载于https://www.castordoc.com**

商业智能的数据发现

原文:https://towardsdatascience.com/data-discovery-for-business-intelligence-534599025516?source=collection_archive---------12-----------------------

“那么我应该使用哪个仪表盘呢?”

图片由选择明星

介绍

仪表板和报告是商业世界中的通用语。尽管看起来很简单,但在每个 KPI 仪表板的背后都有数据分析师,他们负责保持仪表板的工作、准确和新鲜。

对于只有少数数据分析师的小团队来说,构建仪表板很容易。他们熟悉每个数据集,编写他们需要的查询并不需要很长时间。但是对于更大的组织来说,数据的数量让任何一个人或团队理解所有数据的能力都相形见绌。

每当出现业务问题时,分析师可以通过整合他们的仪表板或分析来扭转局面。但是,一个业务问题往往会引出另一个问题,达到 50 或 100 个仪表板会很快发生(问任何知道的人—如果有的话,这是一种保守的说法)。如果两个不同的人有相同的业务问题要回答怎么办?他们知道参考哪份报告吗?他们会看同一份报告吗?对于分析师和那些更熟悉 BI 工具的人来说,从零开始构建一个新的指标通常比寻找一个现有的指标花费更少的时间。这会造成不一致,甚至会导致不准确的结果和错误的决策。

我们如何促进更好的可见性和理解?

数据发现平台

到目前为止,弥合这一知识鸿沟的最佳解决方案是定期清理仪表板和文档。但是,由于各种原因,底层数据会不断变化:

  1. 您的组织发布了新产品,并开始收集不同类型的数据。
  2. 您开始使用新软件来跟踪业务运营,您可能希望将其与您当前的数据结合起来。
  3. 您开发了一组新的业务 KPI,以便随着业务的发展来跟踪或更改计算指标的方式。

由于数据总是在变化,文档需要不断维护,BI 仪表板可能很快变得陈旧甚至错误。随着分析师改变角色或离开组织,这变得更加困难——当一个过程依赖于一个人积累的知识时,如果这个人的情况改变,它很容易崩溃。

数据分析师和数据消费者(依赖这些仪表板的业务/产品团队)之间存在信息不对称的问题。也就是说,组织中使用的数据上下文仍然是数据团队中的部落知识。正如我在之前的博客文章中详细描述的那样,像网飞SpotifyAirbnb 这样的超大规模公司已经开始将元数据及其文档整合到一个叫做 数据发现平台 的地方。

这些数据发现平台都是一个集中的地方,公司中的任何人都可以在这里找到他们正在寻找的数据,查看还有谁在使用它,它在哪里被使用,并分享他们关于它的知识。通过将 BI 工具插入这些平台并收集元数据,数据团队和数据消费者都可以从有关数据在公司内部如何定义和使用的端到端可见性和上下文中受益匪浅。以下是 BI 集成对数据驱动型组织最有益的三种方式。

1.了解上游依赖性和下游影响

当 BI 工具与数据沿袭相连接时,数据转换流程从头到尾都是可见的。通过数据沿袭,数据生产者(通常是软件工程师或数据工程师)知道哪些报告或仪表板可能会因字段名更改或表废弃而中断。通过了解潜在的下游影响,数据生产者可以与数据消费者(BI 团队或数据分析师)协调,以确保在需要进行更改时实现平稳过渡。这样,您的工程团队在弃用列或删除源表之前可能会三思。

当数据沿袭与 BI 工具集成时,数据分析师可以了解他们的报告和仪表板的所有上游依赖关系。当报告数字看起来不正常时,它们可以遍历谱系树来查找依赖表及其新鲜度。如果没有数据沿袭,找出数据流中导致错误输出的确切位置就像黑盒测试一样——在表、日志和 SQL 查询中进行大量杂乱无章的探索。数据沿袭使得隔离和纠正问题变得更加容易。

图 1: 选择 Star 的数据谱系,显示 PRODUCTS.product_category_name 的更改如何影响两个 BI 仪表板

2.清理旧型号和仪表板

https://twitter.com/fulhack/status/1382533598574735371

任何拥有商业智能工具超过一年的公司都会处理仪表板杂乱的问题。随着时间的推移,临时分析、季度报告甚至核心控制面板都会过时或更换为新版本。问题是,旧仪表板通常不会被删除。没有人希望删除共享文件夹中的仪表板,因为有人可能正在使用它。这就产生了一个杂乱和不活跃的报告的长尾,人们可能会在其中乱翻,但他们不会确定数据是否可靠或相关。浏览 BI 工具变成了它自己的部落知识任务,最终最好是让别人给你发送一个特定的链接来打开。更糟糕的是,可能有人依赖过时的仪表板进行日常操作。

这种情况经常发生,因为仪表板元数据及其新鲜度不会被自动跟踪。连接控制面板元数据及其操作指标,如上次成功运行报告、上次编辑时间和顶级用户,可以了解控制面板的运行状况。通过比较使用数据和运营指标,可以轻松识别和清除过时的数据模型。如果仪表板不再被其他人维护或使用,数据消费者也会很清楚。

图 2 :终端用户和分析师可以使用活动元数据检测过时的仪表板

3.支持自助分析

现代 BI 工具为非技术用户提供了一种无需学习 SQL 就能操作数据的方法。它们使得在特定基础上挖掘数据变得非常容易。但是,即使使用最简单的工具,对于许多数据消费者来说,构建仪表板仍然很困难,因为他们没有数据的背景或上下文。例如,当有 20 个维度字段时,最常见的数据切片方式是什么?如果存在具有相似名称的字段(例如,状态字段与活动 _ 状态字段),使用哪个维度是正确的?通过包含字段级使用信息,数据发现平台可以为数据消费者提供如何使用数据的指导。

图 3 :哪些维度和尺度最受欢迎,可以用来过滤或透视长相?

很多时候,想要自助满足自己的分析需求的数据消费者最终会陷入表和字段的海洋。在没有任何文档或指导的情况下,试图理解数据是如何表示的是令人沮丧的。数据发现将该上下文带到最前面,如图 3 所示,它显示了每个字段的受欢迎程度,或者哪些维度和度量在其他仪表板中被用作过滤器或枢纽。新增的上下文可以指导新的数据分析师或消费者适应数据,使他们能够探索和运行自己的分析。

通过数据发现让您的数据完全可见

随着时间的推移,数据发现平台将发展成为事实上的工具,供员工查找和了解整个组织使用的数据。作为一个集中的元数据中心,他们了解数据如何随着时间的推移而变化,并为分析师、数据科学家和业务用户提供分析和建议,以快速找到他们想要的东西。

Select Star ,我们相信 BI 集成是数据发现平台的核心部分。我们在现代数据工具(包括雪花、BigQuery、Tableau、Looker 和 Mode)的基础上构建了深度集成和元数据分析,以提供端到端的数据沿袭和运营使用指标。我们正在帮助快速成长的初创公司和财富 500 强公司建立单一来源的真相文件&对他们的数据进行治理。如果您希望了解您的数据,并为您公司的每个人提供更好的自助服务分析体验,我们希望听到您的意见。

数据发现:数据湖数据目录的未来

原文:https://towardsdatascience.com/data-discovery-the-future-of-data-catalogs-for-data-lakes-7b50e2e8cb28?source=collection_archive---------9-----------------------

为什么我们需要数据治理和元数据管理的分布式方法

梁朝伟的 Unsplash

在过去的几年里,数据湖已经成为现代数据堆栈的必备工具。但是,虽然驱动我们访问和分析数据的技术已经成熟,但在分布式环境中理解和信任这些数据的机制却落后了。

以下是 数据发现 可以帮助确保您的数据湖不会变成数据沼泽。

构建数据平台 时,数据团队必须做出的首要决策之一(仅次于“我们为什么要构建这个平台?”)是选择一个 数据仓库还是 湖来为他们的分析进行电力存储和计算。

虽然数据仓库提供的结构使数据团队能够轻松高效地操作数据(即收集分析见解和支持机器学习功能),但这种结构可能会使它们对于某些应用程序来说不灵活且昂贵。

另一方面,数据湖具有无限的灵活性和可定制性,可以支持各种各样的用例,但是伴随着这种更大的灵活性而来的是大量与数据组织和治理相关的其他问题。

因此,沿着湖边甚至湖边小屋路线行进的数据团队常常难以回答有关其数据的关键问题,例如:

  • 我的数据存储在哪里?
  • 谁能接触到它?
  • 我该如何使用这些数据?
  • 这个数据是最新的吗?
  • 企业如何使用这些数据?

随着数据操作的成熟和数据管道变得越来越复杂,传统的数据目录经常无法回答这些问题。

这就是为什么一些最好的数据工程团队正在重新思考他们构建数据目录的方法,以及数据湖需要什么。

数据目录可能会淹死在湖里

尽管异常灵活和可伸缩,但数据湖缺乏必要的组织来促进适当的元数据管理和数据治理。图片由 Unsplash 上的 Adrian 提供。

数据目录作为元数据的目录,提供关于数据健康、可访问性和位置的信息。他们帮助数据团队回答关于在哪里寻找数据、数据代表什么以及如何使用数据的问题。但是,如果我们不知道这些数据是如何组织的,那么我们所有最好的计划(或者管道)都是徒劳的。

在最近的一篇文章中,Intuit 数据平台主管 Seshu Adunuthula 恰当地问读者:“你的数据湖是像一个二手书店还是一个组织良好的图书馆?”

对于现代数据团队来说,这一点越来越重要。随着公司向湖泊倾斜,他们通常会损害在仓库中存储数据所隐含的组织和顺序。数据仓库迫使数据工程团队结构化或至少半结构化他们的数据,这使得基于业务用户的需求进行编目、搜索和检索变得容易。

历史上,许多公司使用数据目录来实施数据质量和数据治理标准,因为随着数据资产的发展,他们传统上依赖数据团队手动输入和更新目录信息。在数据湖中,数据是分布式的,随着数据在其生命周期中的演变,很难对其进行记录。

非结构化数据是有问题的,因为它与数据目录相关,因为它是无组织的,即使是有组织的,也通常不被声明为有组织的。这可能适用于数据仓库中管理的结构化或半结构化数据,但是在分布式数据湖的环境中,如果没有某种程度的自动化,随着数据的发展手动实施治理是无法扩展的。

现在:手动和集中式目录

了解不同数据资产之间的关系(随着时间的推移而演变)是至关重要的,但这通常是传统数据目录所缺乏的。虽然现代数据架构(包括数据湖)通常是分布式的,但数据目录通常不是,将数据视为一维实体。非结构化数据没有大多数数据目录赖以工作的预定义模型,必须经过多次转换才能使用。

尽管如此,公司需要知道他们的数据存储在哪里,谁可以访问这些数据,并能够衡量其整体健康状况——即使存储在湖中而不是仓库中。如果没有对数据沿袭的可见性,当数据问题在下游进一步出现时,团队将继续花费宝贵的时间进行灭火和故障排除。

数据工程师从数据目录中需要什么

数据发现可以取代或补充现代数据目录,方法是提供关于数据堆栈不同部分数据的分布式实时洞察,同时遵守通用治理和可访问性标准。图片由巴尔·摩西提供。

传统的数据目录通常可以满足仓库中结构化数据的需求,但是数据工程师如何在数据湖的复杂水域中航行呢?

虽然许多数据目录都有一个以用户界面为中心的工作流,但数据工程师需要以编程方式灵活地与其目录进行交互。他们使用目录来管理模式和元数据,并且需要一种 API 驱动的方法,以便能够完成各种各样的数据管理任务。

此外,数据可以通过多个入口进入湖泊,工程师需要一个目录来适应和考虑每一个入口。与数据在进入之前将被清理和处理的仓库不同,数据湖接受原始数据,而没有任何端到端健康的假设。

在一个湖中,存储数据既便宜又灵活,但这使得了解你拥有什么以及如何使用它成为一个真正的挑战。数据可以以多种方式存储,比如 JSON 或 Parquet,数据工程师根据要完成的工作以不同的方式与数据交互。他们可能将 Spark 用于聚合作业,或者将 Presto 用于报告或特别查询,这意味着损坏或不良数据有很多机会导致故障。如果没有沿袭,数据湖中的这些故障可能会很混乱,很难诊断。

在一个湖中,数据可以以多种方式进行交互,目录必须能够提供对什么正在被使用,什么没有被使用的理解。当传统目录不能满足需求时,我们可以将数据发现作为前进的方向。

未来:数据发现

数据发现 是扎马克·德格哈尼和 Thoughtworks 的 数据网格模型 提出的一种基于分布式面向领域架构的新方法。在这个框架下,特定于域的数据所有者对其作为产品的数据负责,并促进跨域的分布式数据之间的通信。

现代数据发现通过四种主要方式填补了传统数据目录的空白:

自动化扩展到整个湖泊

使用机器学习,数据发现可以自动跟踪表和字段级沿袭,映射上游和下游依赖关系。随着数据的发展,数据发现也能确保您对数据及其使用方式的了解。

数据运行状况的实时可见性

与传统的数据目录不同,数据发现提供了对数据当前状态的实时可见性,而不是其“编目”或理想状态。由于发现包括消费者如何接收、存储、聚合和使用您的数据,因此您可以收集一些见解,例如哪些数据集已经过时,可以废弃,给定的数据集是否符合生产质量,或者给定的表上次更新的时间。

数据沿袭,用于了解数据的业务影响

这种灵活性和动态性使得数据发现非常适合将沿袭引入数据湖,允许您在正确的时间呈现正确的信息,并在许多可能的输入和输出之间建立联系。有了沿袭,当数据管道中断时,您可以更快地解决问题,因为像模式更改这样经常被忽略的问题将被检测到,相关的依赖关系将被映射。

跨域的自助式发现

数据发现还支持自助服务,允许团队轻松利用和了解他们的数据,而无需专门的支持团队。为了确保这些数据值得信赖和可靠,团队还应该投资于 数据可观察性 ,它使用机器学习和自定义规则来提供实时警报和监控,当您的数据湖或下游管道出现问题时。

跨湖治理和优化

现代数据发现不仅使公司能够了解哪些数据在其生命周期中被使用、消费、存储和废弃,还能了解如何使用,这对于数据治理至关重要,并提供了可用于跨湖优化的见解。

从治理的角度来看,在湖中查询和处理数据经常使用各种工具和技术(Spark on Databricks for this,Presto on EMR for that,等等)。),因此,通常没有一个单一的、可靠的读取和写入的真实来源(就像仓库提供的那样)。适当的数据发现工具可以作为事实的来源。

从优化的角度来看,数据发现工具还可以让涉众轻松识别最重要的数据资产(经常被查询的数据资产!)以及那些没有被使用的,这两者都可以为团队优化他们的管道提供洞察力。

数据湖的分布式发现

随着公司继续加大对数据的接收、存储和利用,有助于提高透明度和可发现性的技术将成为关键。

越来越多的一些最佳目录在分布式、特定于领域的发现中分层,为团队提供了在数据生命周期的所有阶段完全信任和利用数据所需的可见性。

就个人而言,我们对即将到来的事情感到无比兴奋。有了正确的方法,也许我们最终可以一起放弃"数据沼泽"双关语?

有兴趣了解如何在您的数据湖中扩展数据发现吗?伸出手去 巴尔摩西斯科特奥利里 ,还有 蒙特卡洛团队

要了解构建分布式数据架构的所有最新消息和趋势,请务必加入 数据网格学习松弛频道

本文由 斯科特·奥利里 共同撰写。

数据分布与抽样分布:你需要知道什么

原文:https://towardsdatascience.com/data-distribution-vs-sampling-distribution-what-you-need-to-know-294819109796?source=collection_archive---------8-----------------------

统计数字

了解中心极限定理、标准误差和抽样分布环境中的自举

作者图片

区分数据分布(即总体分布)和抽样分布是很重要的。在使用中心极限定理或其他概念(如标准差和标准误差)时,这种区别非常重要。

在本帖中,我们将回顾上述概念以及自举的概念来估计抽样分布。特别是,我们将涵盖以下内容:

  • 数据分布(又名人口分布)
  • 抽样分布
  • 中心极限定理(CLT)
  • 标准误差及其与标准差的关系
  • 拔靴带

数据分布

许多统计学处理的是从大量人口中抽取的样本进行推断。因此,我们需要区分对原始数据的分析和对样本的分析。首先,让我们回顾一下数据分布的定义:

数据分布:原始数据集中各个数据点的频率分布。

让我们首先生成随机倾斜数据,这将导致非正态(非高斯)数据分布。生成非正态数据的原因是为了更好地说明数据分布和抽样分布之间的关系。

因此,让我们导入 Python 绘图包并生成右偏数据。

生成的右偏数据的直方图(图片由作者提供)

抽样分布

在抽样分布中,您从数据集中抽取样本,并计算类似于平均值的统计量。区分数据分布和采样分布非常重要,因为大多数混淆来自对原始数据集的(重新)样本进行的操作。

抽样分布: 从数据集【1】中抽取的多个样本的样本统计量(又名指标)的频率分布。或者简单地说,样本统计量的分布称为抽样分布。

  1. 从数据集中抽取一个样本。
  2. 计算步骤 1 中抽取的样本的统计数据/指标并保存。
  3. 多次重复步骤 1 和 2。
  4. 绘制计算统计的分布图(直方图)。
>>> Mean: 0.23269

从总体中抽取的样本均值的直方图(图片由作者提供)

上面的采样分布基本上是每个采样的平均值的直方图(在上面,我们在 2000 次迭代中绘制了 50 个元素的采样)。上述抽样分布的平均值约为 0.23,从计算所有样本平均值中可以看出。

⚠️不把抽样分布与样本分布混为一谈。抽样分布考虑样本统计量的分布(如平均值),而样本分布基本上是从总体中抽取样本的分布。

中心极限定理(CLT)

💡 中心极限定理: 随着样本量的变大,抽样分布趋于更像正态分布(钟形曲线形状)。

在 CLT,我们分析的是抽样分布,而不是数据分布,这是一个重要的区别。 CLT 在假设检验和置信区间分析中很受欢迎,了解这个概念很重要,尽管在数据科学中使用了 bootstrap,但在数据科学的实践中很少谈论或考虑这个定理[1]。关于自举的更多信息将在本文后面提供。

标准误差

标准误差是描述抽样分布中统计数据可变性的指标。我们可以计算标准误差如下:

其中 s 表示样本值的标准偏差, n 表示样本大小。从公式中可以看出随着样本量的增加,SE 减小

我们可以使用以下方法估计标准误差[1]:

  1. 从数据集中提取新样本。
  2. 计算步骤 1 中抽取的样本的统计数据/指标(例如平均值)并保存。
  3. 重复步骤 1 和 2 几次。
  4. 通过计算前面步骤的统计数据的标准偏差,可以获得标准误差的估计值。

虽然上述方法可以用来估计标准误差,但我们可以使用自举,这是更可取的。我将在下一节讨论这个问题。

⚠️不把标准误差和标准偏差混为一谈。标准偏差捕捉单个数据点的可变性(数据的分布),而标准误差捕捉样本统计的可变性。

拔靴带

Bootstrapping 是一种简单的估计抽样分布的方法,它从总体中随机抽取样本(替换)并计算每个重采样的统计量。自举不依赖于 CLT 或其他关于分布的假设,它是估计 SE 的标准方法[1]。

幸运的是,我们可以使用来自 MLxtend 库[bootstrap()](https://rasbt.github.io/mlxtend/user_guide/evaluate/bootstrap/)功能(你可以在 MLxtend 库上阅读我的帖子,其中涵盖了其他有趣的功能)。该函数还提供了传递自定义样本统计数据的灵活性。

>>> Mean: 0.23293 
>>> Standard Error: +/- 0.00144 
>>> CI95: [0.23023, 0.23601]

结论

主要的要点是区分对原始数据集或数据集样本所做的任何计算。绘制数据的直方图将导致数据分布,而绘制对数据样本计算的样本统计将导致样本分布。同样,标准差告诉我们数据是如何分布的,而标准差告诉我们样本统计数据是如何分布的。

另一个要点是,即使原始数据分布是非正态的,抽样分布也是正态的(中心极限定理)。

你可以在 GitHub 上找到这篇博文的 Jupyter 笔记本。

感谢阅读!

最初发表于https://www.ealizadeh.com

我是一名高级数据科学家和工程师,我想写一些关于统计学、机器学习、时间序列分析、有趣的 Python 库和技巧的文章。

参考

[1] P. Bruce 和 A. Bruce (2017),数据科学家实用统计,第一版,O'Reilly

有用的链接

数据文档困境?这里有一个框架。

原文:https://towardsdatascience.com/data-documentation-woes-heres-a-framework-6aba8f20626c?source=collection_archive---------11-----------------------

引入一个框架来帮助数据团队建立文档优先的文化

照片由 卫斯理丝丝

“这一栏是什么意思?”
“有两张表同名?我能用哪一个?”
“为什么我们的 MRR 数字在财务和销售报告中不同?”
“谁能解释一下我们的营销数据?”

像这样的信息似乎很熟悉?欢迎来到世界上每个数据从业者的生活。

2016 年,我负责一个快速扩展的数据团队。我们有大量的新表格生成,新项目上线,还有几个新的团队成员加入。但是我们的团队不是按规模建立的。

在六个月内,尽管我们的团队成员增加了一倍,但我们的生产力实际上下降了。

只有老团队成员对我们使用的数据有足够的了解。因此,在我们疯狂的截止日期前,他们最终自己完成了所有额外的工作,并且过度劳累。新的团队成员感到沮丧,因为他们缺乏实际开展富有成效的工作所需的环境——即使他们做了工作,也没有用。我花了这么多心血建立的公司和文化已经开始在我周围恶化。

然后,更糟糕的是,我们最年长的数据团队成员,一个和我们一起工作了两年的人,告诉我他想辞职。我惊呆了。这位分析师对我们所有的数据和项目都了如指掌。我们发展得很快,我们的梦想客户和项目已经排好了队。我看着顾客的眼睛,承诺我们会兑现承诺。他们选择了信任我们。我们现在该怎么坚持下去呢?

在三个小时试图说服、哄骗并恳求这位分析师留下来之后,我意识到…我们要靠自己了。我记得那天晚上我在办公室的阳台上哭了整整三个小时。这是我人生中最低谷的时刻之一。

当我第二天早上醒来时,我记得我对自己许下承诺——我再也不会给任何一个人权力让我们处于如此脆弱的境地。

这一事件标志着装配线项目的开始:努力使我们的数据团队尽可能敏捷和有弹性。在两年多的时间里,我们创建了内部工具和框架来帮助我们的团队更好地运行,我们也学到了很多关于围绕自组织和透明原则构建更强大的数据文化的知识。

在这篇文章中,我将分享我们用来在 Atlan 组织我们自己的数据团队、使我们的数据民主化以及使文档成为我们日常工作流程的一部分的原则和框架。

通向文档优先文化之路

文档文化就是…一种“文化”。它是一套共享的实践、信仰、价值观和做事方式。

作为一名文化和团队建设的终身学生,我最喜欢阅读的文化之一是《哈佛商业评论》的文章,题为“不要让你的公司文化只是发生”。

作者谈到了一个叫做 文化地图 的框架,它帮助你进行设计你所设想的文化所需的对话。它帮助你定义文化的三个核心要素(引自 HBR ):

  • 结果:这些是您希望(和不希望)您的文化实现的事情。
  • 行为:这些是你的文化中可见的部分——人们每天采取的积极或消极的行动,这些行动会给你的公司带来期望或不期望的结果。
  • 促成者和阻碍者:这些是正式或非正式的政策、仪式、行为和规则,它们促成或阻碍了你的文化——这些是真正有意实现理想文化的要素。

我们的团队松散地遵循这个框架来指导我们的实验,建立一个文档优先的方法。

第一步:设想结果,或者创造共同目标的理想状态

说到底,文化是由人构建的,人是由目的驱动的。重要的是要记住,文档文化只是达到目的的一种手段。

创建文档优先文化的第一步是让团队就理想状态达成一致。

我推荐便利贴、白板和优秀的辅导员。开始这种练习的一个很好的问题是,“我们希望我们的团队在 12 个月后会是什么样子?”在这里,培训师的角色对于将想法和想法整合到整体中至关重要。

如果你很好地运行这个会话,你可能会从我们的团队得到这样的结果:

  • 成为一个完全自组织的团队:你所有的数据、知识、实验和项目都应该是可重用的、透明的、易于访问的。
  • 创造一个信任您的数据和决策的环境。
  • 建立一种协作至上的文化:每个人都应该感到被授权和被包容,尽管你的团队基本上是多元化的。

一旦你的团队心中有了一个最终状态,使用“ 开始、停止、继续 ”练习来列出可以帮助你的团队实现目标的行为列表。希望有详细记录的数据会在其中一个便笺上!

第二步:通过可衡量的目标建立更好的行为

问问你自己,好的文档实际上意味着什么?

一旦你的团队确定了优秀的文档是你努力追求的行为之一,建立一个可衡量的目标来帮助你确定这实际上意味着什么是很重要的。为此我强烈推荐 5W1H 框架。

图片来自 图集

5W1H:一个伟大的数据文档框架

5W1H 框架代表什么、为什么、在哪里、谁、何时和如何。

使用 5W1H 框架将您的元数据属性缩小到一个简短的必备列表,您需要调用每个数据资产良好记录的

什么:数据资产是关于什么的?

这可以由几个属性来定义,例如:

  • 描述(针对表格或列)
  • 关键词或标签
  • 主题或类别

为什么:数据资产为什么存在?

  • 数据源
  • 沿袭(跟踪数据资产)
  • 影响分析(该数据资产支持哪些仪表板或项目?)

哪里:数据资产来自哪里?

  • 空间覆盖
  • 语言
  • 商业领域

世卫组织:谁负责数据资产?

  • 创建者或所有者
  • 贡献者或专家
  • 切点

何时:数据资产是何时创建和更新的?

  • 编成日期
  • 上次更新或修改日期
  • 更新频率
  • 时间范围

如何:如何使用数据资产?

  • 许可证
  • 分类
  • 用例

第 3 步:衡量哪些因素对找出促成因素和阻碍因素至关重要

一旦你有了记录数据的框架,从策略到执行有许多不同的方法。(在以后的博客文章中会有更多相关内容!)

从德鲁克到戴明的任何人都有一句俗语,据说是“如果你不能衡量它,你就不能改进它。

作为数据从业者,我们帮助其他人应用他们的数据见解,但我们经常忘记将它们应用到自己身上。

每天、每周、每月衡量文档目标的进展。有了像 Atlan 这样的现代数据编目工具,您可以使用 API 在一个粒度级别上测量您的文档完成率。按团队成员或不同部门筛选,甚至创建排行榜!

作为一个团队,一起思考哪些是可行的,哪些是不可行的。不断迭代和改进你的文档框架和策略。这需要时间,但是突然地,有一天你会醒来并意识到你有一种文档优先的文化。

我们元数据文档仪表板的一部分。(图片来自 阿特兰 )。)

觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。

数据不决定!

原文:https://towardsdatascience.com/data-doesnt-decide-b2b796057e16?source=collection_archive---------32-----------------------

为什么你必须明白是什么让灯一直亮着

Charles Deluvio 通过 Unsplash 拍摄的照片

“我们非常注重数据,”“数字告诉我们应该做什么?”是心态的好例子,这种心态有可能让一个组织陷入困境。业务不仅仅是数字和 KPI,数据分析师和数据科学家必须永远记住这一点。

最好的情况是:有人告诉你你错了

让我们来看一个你可能会遇到的场景。火警响起。有人刚刚注意到 FR-KPI(真实关键绩效指标)在年底表现不佳。事实上,看到这种剧烈的变化,有些人担心该公司可能会陷入螺旋式下降。让我们来看看:

作者照片

eeeekkk!这是我们的平均单位利润 KPI。它比我们现有的其他 374 个 KPI 稍微重要一些:前 5 名。为了得到这个 KPI,我们简单地将利润除以售出的单位数。

在筛选了各种 SQL 表、Excel 文件、Jupyter 笔记本和友好的同事提示之后,您开始了解正在发生的事情。你开始发现,你的产品现在是通过第三方网站提供的,这使得你的公司每卖出一件商品都要花费利润!

你意识到这个超级重要的 KPI 有可能变得更低!这个 KPI 能上去很重要。你冲向决策者,告诉他们你的公司不应该再通过第三方网站提供你的产品。你应该坚持你的公司控制的途径,每销售一个单位可以获得更多的利润。打开香槟酒瓶!

你做了别人让你做的事

有人来找你,担心某个 KPI 会下降。他们让你找出它下降的原因。你做到了。这里有什么问题?

这个场景缺乏背景。它缺少其他可以讲述不同故事的 KPI。这绝对需要更好地理解整个业务,以及它在销售环境中是如何运作的。范围太窄了。

从全局来看,我们注意到,自从开始与第三方供应商合作以来,每月售出的商品数量显著增加。这个供应商在网上有很大的影响力,实际上帮助我们降低了广告费用。是的,他们需要钱来交换他们为我们做的事情,但他们最终会让事情变得更好。

作者照片

事实上,自从这次新的冒险以来,底线真的开始疯狂增长。销售额和利润都增加了一个整数!这通常不是一夜之间发生的事情。这一举措可能是该组织发生的最好的事情!

不要在没有咨询其他数据朋友或业务熟人的情况下参加会议,以检查这种“停止印刷”类型的建议是否符合当前的业务情况。

最坏的情况:他们听从你的建议

企业是复杂的。有很多活动部件。很多人都在努力达到或超过给他们的 KPI。企业应该定义什么是真正重要的。在某种程度上,新的 KPI 甚至可能开始与另一个 KPI 相矛盾。顾客不是空白支票。找出是什么让灯亮着。

数据很重要,也很有用。永远记住“鼻子贴着地面”式的方法可能是遗漏一些主要内容的原因。数据表明两点之间的最短距离是一条直线。只有当这条线路的一部分由一座横跨峡谷、两边都是陡峭悬崖的桥组成时,这条线路才会起作用。

joo Cordeiro 通过 Unsplash 拍摄的照片

数据域和数据产品

原文:https://towardsdatascience.com/data-domains-and-data-products-64cc9d28283e?source=collection_archive---------5-----------------------

行业笔记

实践中的数据网格

我接触的所有客户要么对下一代现代数据平台感兴趣,要么正在规划。在这一转变中,数据网格体系结构获得了很大的吸引力。与此同时,对这一概念的解释也存在一些担忧:缺乏实际指导。

关于数据网

Data mesh 提倡将数据视为一种产品,将所有权更深入地推向生产团队。这背后的理论是所有权与数据创建更好地结合,这为数据带来了更多的可见性和质量。这种责任的左移解决了数据爆炸的问题,数据爆炸使得不堪重负的中央数据团队为了更大的利益负责清理、协调和集成数据。将特定数据集的职责委托给数据域意味着企业被拆分为小型企业,每个企业负责构建抽象、提供数据、维护相关元数据、提高数据质量、应用生命周期管理、执行代码控制等等。尤其是传统的大规模企业很难适应这种现代方法,因为数据通常在域之间共享,或者一个域的数据可能依赖于另一个域。这使得实施变得困难,所以让我提出我的观点并分享一些实用的指导。

指导

标准化和清晰的原则是实现成功的关键。例如,数据产品不应该成为实验的对象。它们也不应该引发标准、文件类型、协议格式等等的激增。因此,我建议任何组织采纳以下十八项原则:

1。 明确界定你的领域边界

每个人都使用他们自己的域、子域或有界上下文的定义。这种模糊性是一个问题。没有明确的指导,领域变得过于相互关联,所有权成为解释的主题,复杂性将被其他领域推入其他领域。

我对域管理的建议是明确和严格的边界。每个域的边界必须清晰明确。属于一起的业务关注点、流程、解决方案领域和数据必须保持在一起,并在域内进行维护和管理。理想情况下,每个领域属于一个敏捷或 DevOps 团队,因为当有一个团队时,耦合点的数量是可管理的,并且容易被所有团队成员理解。在一个域内,紧耦合是允许的;然而,当跨越边界时,到其他域的所有接口必须使用互操作性标准来解耦。这就是数据产品发挥作用的地方。

话虽如此,对于数据管理,我鼓励您将您的领域具体化。这避免了长时间的(政治)讨论,也禁止团队根据他们自己的需要自由地解释边界。向面向领域结构的转变是一种过渡。当您将新的提供者和消费者加入到您的体系结构中时,您可以有组织地制定您的域列表,而不是预先规划好一切。

例如,对于数据域列表,您可以使用列出所有数据域的存储库,包括每个域的命名和适用性。您可以使用相同的存储库来描述团队组织、使用和共享,以及物理表现:应用程序和数据库的列表。

另一篇以边界和粒度为特色的博文可以在这里找到:https://towardsdatascience . com/data-domains-where-do-I-start-a 6d 52 fef 95d 1

2。 具体阐述您的数据产品和互操作性标准

下一个建议是定义什么是数据产品。数据产品是数据架构的一个单元或组件,它封装了使读取优化数据集可供其他域使用的功能。这需要你明确定义自己不同的发布类型(例如,面向批处理、面向 API、面向事件)、元数据标准等等。具体说明数据产品是什么样子的。例如,批量数据产品被定义为拼花文件,并且总是必须包含一个用于元数据的 YML 文件,该文件包含这些 X 属性。例如,我不相信报告和仪表板是数据产品,因为它们解决特定的客户需求,因此与底层用例紧密耦合。

3。 没有原始数据!

数据产品与原始数据相反,因为公开原始数据需要所有消费领域的返工。因此,在任何情况下,您都应该封装遗留或复杂的系统,隐藏技术应用程序数据。这也意味着域将拥有如何转换数据以提高可读性的转换逻辑。

没有原始数据的原则,你也可以申请外部数据提供者:在你的企业生态系统的逻辑边界之外运作的外部方。它们通常位于独立的、不受控制的网络位置。要求您的合作伙伴遵守您的标准或通过额外的域应用中介:消费团队通过抽象复杂性和保证稳定和安全的消费来充当提供者。

原始或未经修改的数据没有保证。如果你坚持让它可用,比如机器学习,确保它被标记。

4。 为重叠域定义模式

如我所说,对于跨域共享的数据,事情变得复杂了。对于数据域的粒度和逻辑分段,您可以利用来自域数据存储的指导:

当域比较大,或者域需要通用的——可重复的——集成逻辑时,分解域尤其重要。在这种情况下,拥有一个通用域会有所帮助,它可以提供集成逻辑,允许其他子域标准化并从中受益。一个基本规则是保持子域间的共享模型较小,并始终与无处不在的语言保持一致。

由 Piethein Strengholt 创建的图像

对于重叠的数据需求,您可以使用不同于领域驱动设计的模式。以下是对这些模式的简短总结:

  • 如果复制的相关成本优先于可重用性,那么作为一种设计模式,可以使用单独的方法。当为了更高的灵活性和敏捷性而牺牲可重用性时,这种模式通常是一种选择。
  • 如果一个领域很强大,并且愿意拥有下游消费者的数据和需求,那么可以使用客户-供应商模式。这种模式的缺点是相互冲突的关注点,迫使下游团队协商可交付成果和安排优先级。
  • 伙伴关系模型中,集成逻辑在新创建的域中以特别的方式进行协调。所有团队都相互合作,尊重彼此的需求。每个人都需要一个大的承诺,因为每个人都不能自由地改变共享的逻辑。
  • 一个符合模式可以被用来使所有的域符合所有的需求。这种模式可以是一种选择:1)当集成工作极其复杂时;2)不允许任何其他方拥有控制权;3)或者当使用供应商包时。

在任何情况下,您的域都必须遵守您的互操作性标准。因此,为其他域生成新数据的合作伙伴域必须像任何其他域一样公开它们的数据产品。

5.数据产品包含可供广泛消费的数据。

不同的领域团队和各种用例很可能会重复使用相同的数据。因此,您的团队不应该让他们的数据产品符合数据消费者的特定需求。主要的设计原则应该是最大化领域生产力和促进消费。另一方面,数据产品基于用户反馈而发展,并为其生成相关的工作,因此团队可能会很想合并消费性的特定需求。你在这里应该非常小心!如果消费者将特定于消费者的业务逻辑推进到所有数据产品中,就会迫使所有数据产品同时发生变化。这可能引发所有团队成员之间激烈的冲刺目标交叉协调和积压谈判。我的建议是引入一些争议管理:一个监管机构,监督数据产品不是针对消费者的。这个机构可以介入指导领域团队,组织预约和知识共享会议,提供实际的反馈并解决团队之间的问题。

6。 创建关于缺失值、默认值和数据类型的具体指南

我经历过关于必须如何解释缺失和默认数据的激烈辩论。例如,数据确实丢失并且无法导出,但是运营部门仍然期望由员工提供强制数据值。如果不提供指导,将会产生大量的描述和指导。有些可能始终提供不正确的值,有些可能提供随机值,而有些可能根本不提供指导。这同样适用于详细的局部参考值和数据类型。因此,您可能希望引入有关数据的指导,这些数据必须在整个数据集中具有一致的默认值和格式。这也意味着相同的十进制精度、符号和语法,解决了数据消费者不必应用(复杂的)应用程序逻辑来获得正确数据的问题。您可以将这些原则设置为面向系统或面向领域的,但是我也看到大型企业在所有数据产品中必须使用什么数据格式和类型方面提供通用指导。

7。 数据产品在所有交付方法中都是语义一致的:批处理、事件驱动和基于 API 的

对我来说,这听起来是显而易见的,但我仍然看到今天的公司为面向批处理、事件和 API 的数据制定单独的指南。由于所有分布模式的数据来源都是相同的,所以我鼓励您使所有的指南对所有的模式都一致。你可以要求你的所有领域使用一个单一的数据目录来描述所有的术语和定义。这一单一来源成为链接(映射)所有不同数据产品的基线。

8。 数据产品继承了无处不在的语言

了解数据创建的背景是非常重要的。这就是无处不在的语言的用途:一种构建的、形式化的语言,由利益相关者和设计师达成一致,服务于我们的设计需求。无处不在的语言应该与领域保持一致:业务功能和目标。我看到一些公司要求域使用该域语言中人类友好的列名。对我来说,这并不重要,只要提供了从物理数据模型到业务数据模型的映射。这使得您的领域能够将业务概念从无处不在的语言转换成数据。

9。 数据产品属性是原子的

数据产品属性是原子的,必须表示最低级别的粒度,并具有精确的含义或精确的语义。在理想状态下,这些数据属性与数据目录中的项目一一对应。这样做的好处是,数据消费者不会被迫拆分或连接数据。

10。 数据产品从创建的那一刻起就保持兼容

数据产品保持稳定,并与运营/交易应用程序分离。这意味着模式漂移检测,所以没有破坏性的变化。它还意味着版本控制,在某些情况下,独立管道并行运行,让您的数据消费者有时间从一个版本迁移到另一个版本。

11。 将易变参考数据抽象为更小粒度的值范围

您可能希望提供关于如何将复杂的参考值映射到更抽象的数据产品友好的参考值的指导。该指南还要求对敏捷性不匹配有一个细微的差别:1)如果使用方的变更速度很快,您的指导原则必须是在使用方维护复杂的映射表。2)如果变化的速度在提供方,指导原则是要求数据产品所有者将详细的本地参考值抽象或汇总为更通用的消费者不可知参考值。这也意味着消费者可能执行额外的工作,例如,将更通用的参考值映射到消费特定的参考值。

12。 为可读性而优化(转换):抽象出复杂的应用模型。

不断重新训练、不断读取大量数据的分析模型。这个读取方面会影响应用程序和数据库设计,因为我们需要优化数据可读性。同样,您可以引入优化和数据可读性的原则。例如,要求领域定义子产品:围绕主题领域有逻辑组织和混乱的数据。面向资源的架构(ROA)可能是一个很好的灵感。指南还将包括,过于标准化或过于技术化的物理模型必须转化为更可重用和逻辑有序的数据集。必须对复杂的应用程序逻辑进行抽象,并且必须以足够的粒度获取数据,以服务尽可能多的消费者。这也可能意味着交叉引用和外键关系必须是整数,并且在整个数据集中以及与来自同一数据产品提供商的所有其他数据集中保持一致。消费域不应该操纵键来连接不同的数据集!

13。 数据产品是从源头直接捕获的

不应该允许域封装来自不同数据所有者的其他域的数据,因为这将混淆数据所有权。因此,数据产品必须直接从原始领域(源)创建。

14。 新创建的数据意味着新的数据产品

由于业务转换(使用业务逻辑的语义变化)而创建和分发的任何数据都被认为是新的,并导致新的数据和数据所有权。因此,您希望实施相同的数据分布原则。这意味着新创建的共享数据必须遵循这篇博文中概述的相同原则。

另一个关注点是可追溯性:知道数据发生了什么。为了降低透明度的风险,要求数据消费者对他们的获取以及他们应用于数据的操作和转换序列进行编目。这种沿袭元数据应该集中发布。

15。 为了安全封装元数据

对于包括细粒度消费在内的数据安全性,您需要定义一种数据过滤方法:保留的列名、封装的元数据、产品元数据等。例如,我看到一些公司在他们的数据产品中使用保留的列名。如果这样的保留列名存在于任何这些数据集中,它可以用于细粒度过滤。因此,只能允许访问非敏感数据,或者可以过滤数据。例如,可以为消费者创建虚拟视图。分类或标签也是如此。

16。 你可能想介绍一些企业一致性

有些人会认为这一指导无助于真正的数据网格实现,但我看到一些公司重视企业一致性。我想强调的是,您不应该构建企业规范数据模型,就像在大多数企业数据仓库架构中看到的那样。在一个大规模的组织中,引入一些企业一致性可能会有所帮助,在这样的组织中,许多域依赖于相同的参考值。因此,您可以考虑引入包含企业参考值的指南。例如,货币代码、国家代码、产品代码、客户细分代码等等。如果适用,您可以要求您的数据产品所有者将其本地参考值映射到企业列表中的值。

您可能会对主标识号给出相同的指导,它将主数据和来自本地系统的数据链接在一起。这些数据元素对于跟踪哪些数据已经被掌握以及哪些数据属于一起是至关重要的,因此您可以要求您的本地域在其数据产品中包含这些主标识符。

最后,只有当企业数据非常稳定并且确实重要时,才考虑使用本指南。企业数据元素的列表有限。是一打,不是几百。

17。 解决时变和非易失性问题

我看到一些公司通过规定数据产品必须如何交付以及如何在下游消费来解决时变和非易失性问题。例如,产品到达后会被版本化、比较、分叉为读取优化的文件格式,并转换为缓慢变化的维度,从而保留以前数据产品的所有历史数据。在所有情况下,数据仍然是面向领域的,因此在任何消费发生之前,不允许应用跨领域集成。

18。 使用数据产品蓝图

创建数据产品的策略是什么?应该通过一个平台来促进它,还是必须由域名来满足它们自己的需求?我的观点是,创造是一个互动的过程,可以得到最好的促进。如果您分散工作并努力实现领域自治,那么您可以通过设计和提供蓝图来实现平衡,这些蓝图包含集成和向不同领域提供数据所需的最基本的服务,同时为数据产品优化提供自治。您的蓝图可以为每个域或共享一些内聚力的一组域实例化。下面的模型是允许创建可伸缩数据产品的参考模型。

Piethein Strengholt 的形象设计

如果做得正确,这些蓝图可以被设计成这样一种方式,血统被自动下推到目录中。对于组合服务的粒度级别,可以使用不同的网状拓扑。一些公司重视高效的计算资源使用,或者认为大型数据消费者存在数据重力问题,因此更喜欢单一平台,同时仍然通过不同的容器隔离域。其他公司使用协调网状方法,并允许组织内的域运行自己的平台,同时遵守共同的政策和标准,就像上面的模型一样。有些采用能力复制来确保完全隔离。这很可能会增加成本,也是一个口味问题。

困难

按领域构建数据产品是一个很有前途的概念,最近得到了很多关注。它试图解决一些可伸缩性问题,但是企业需要意识到其中的陷阱。构建适当的数据抽象不适合胆小的人。技术上很难,应该很好的促成。以下检查表确保更好的数据所有权、数据可用性和数据平台使用:

  • 定义数据互操作性标准,例如协议、文件格式和数据类型。
  • 定义所需的元数据:模式、分类、业务术语、属性关系等。
  • 定义数据过滤方法:保留的列名、封装的元数据等。
  • 确定域、应用程序、组件等的划分粒度级别。
  • 新数据的设置条件:数据质量标准、数据结构、外部数据等。
  • 为数据分组、参考数据、数据类型等定义数据产品指南。
  • 定义需求契约或数据共享存储库。
  • 定义治理角色,例如数据所有者、应用程序所有者、数据管家、数据用户、平台所有者等。
  • 建立沿袭接收能力+定义沿袭交付程序+数据沿袭的唯一散列键。
  • 为每个域定义应用程序级、表级和列级的沿袭粒度级别。
  • 确定分类、标签、扫描规则
  • 定义数据消费的条件,例如通过安全视图、安全层、ETL 等。
  • 如何使用容器、文件夹、子文件夹等来组织数据湖。
  • 定义数据分析和生命周期管理标准,例如 7 年后移动等。
  • 为关键标识符、丰富过程等定义企业参考数据。
  • 为交易数据、主数据和参考数据定义日志和历史数据处理方法
  • 定义重新交付和协调的过程:数据版本化
  • 在技术选择上与企业架构保持一致:哪些领域允许哪些服务;哪些服务只保留给平台团队。

最后,分布式体系结构还将管理和所有权分布在整个组织中。您的团队变得端到端负责。做出有意识的选择,并非常详细地了解将要发生的事情。精确地说明哪些活动仍然是核心,以及对团队的期望是什么。

如果这是你喜欢的内容,我让你看看《规模化数据管理》这本书。

数据域—我从哪里开始?

原文:https://towardsdatascience.com/data-domains-where-do-i-start-a6d52fef95d1?source=collection_archive---------0-----------------------

行业笔记

设计企业级数据网络的战略途径

在我与企业进行的所有数据网格讨论中,数据域的主题最受关注。客户发现面向领域的数据所有权是数据网格中最难的部分。通常,对领域驱动设计缺乏基本的理解(DDD)。其他数据从业者发现 DDD 的概念太难理解,或者很难将来自软件架构或面向对象编程的例子投射到他们的数据领域。在这篇博文中,我将试着去掉复杂的词汇,为你提供实用的指导。

领域驱动设计

让我们从理论部分开始:领域驱动设计(DDD)是一种支持软件开发的方法,有助于描述大型组织的复杂系统,最初是由 Eric Evans 描述的。DDD 很受欢迎,因为它的许多高级实践对现代软件和应用程序开发方法(如微服务)产生了影响。

DDD 区分了有界上下文、域和子域。领域是我们试图解决的问题空间。它们是知识、行为、法律和活动汇集的地方。它们是我们看到语义耦合的领域:组件或服务之间的行为依赖。为了更好地管理复杂性,域通常被分解成子域。一个常见的例子是分解一个域,使每个子域对应一个特定的业务问题。

并非所有的子域都是相同的。例如,您可以将域分类为核心、通用或支持。核心子域是最重要的。它们是秘方,是配料,让生意变得独一无二。通用子域名是非特定的,通常很容易用现成的产品解决。支持子域名并不能提供竞争优势,但却是保持组织运转所必需的。通常,它们没有那么复杂。

有界上下文是逻辑(上下文)边界。他们关注解决方案空间:系统和应用程序的设计。在这一领域,关注解决方案空间是有意义的。在 DDD,这可以是代码、数据库设计等等。在域和有界的上下文之间,可以有对齐,但是将它们绑定在一起并没有硬性规定。有界上下文本质上通常是技术性的,并且可以跨越多个域和子域。

DDD 在数据管理方面的困难在于,DDD 最初的用例是在软件开发的背景下对复杂系统建模。最初,它从未被创造出来用于建模企业数据,这使得数据管理从业者的方法非常抽象和技术性。所以让我打个比方。把一个领域想象成一个共同感兴趣的领域。以你的房子和街道为例。街道是一个域,每个房子代表一个子域。每栋房子都有自己的房子,都有栅栏,这也意味着一栋房子不会占据整个房子。栅栏代表有界的上下文(责任模型)。房主负责维护他们的房子,并可以在他们的范围内做任何他们想做的事情。然而,当跨越边界(栅栏)时,有一些规则需要遵守。例如,当离开或进入你的房子时,总是使用公共车道。

如果我们将数据网格作为数据民主化的一个概念,并实现面向领域的数据所有权原则以获得更大的灵活性,这在实践中会如何工作?从企业数据建模到领域驱动设计建模的转变会是什么样的?我们可以从 DDD 的数据管理中学到什么?

对你的问题空间进行功能性业务分解

在允许团队端到端地操作他们的数据之前,我的第一个建议是查看范围并理解您试图解决的问题空间。在进入技术实现的细节之前,先做这个练习很重要。正如 DDD 所主张的,在这些问题空间之间设定逻辑界限是有帮助的,因为责任更加清晰,也将得到更好的管理。

为了对你的问题空间进行分组,我鼓励你看看你的业务架构。在业务架构中,有业务能力:业务可能拥有或交换以实现特定目的或结果的能力。这种抽象将数据、过程、组织和技术打包在一个特定的上下文中,与组织的战略业务目标和目的相一致。业务能力图显示了哪些功能区域被认为是实现您的使命和愿景所必需的。

一家虚构的航空公司的业务能力图

上面,我对一家虚构的航空公司进行了分解: Oceanic Airlines ,为了取得成功,它需要掌握业务能力图中列出的所有功能领域。例如,大洋航空公司必须能够作为在线或离线机票管理系统的一部分销售机票,或者由于飞行员管理计划而有飞行员驾驶飞机。该公司可以外包一些活动,同时保持其他活动作为其业务的核心。

你将在实践中观察到,你的大多数人都是围绕这些能力组织起来的。从事相同业务能力的人共享相同的词汇。这同样适用于您的应用程序和流程;基于它们需要支持的活动的内聚性,它们通常被很好地对齐并紧密地连接在一起。因此,业务能力映射是一个很好的起点,但是故事并没有到此结束。

将业务能力映射到您的应用和数据

为了更好地管理您的企业架构,业务能力、有限的上下文和应用程序都应该保持一致。这样做时,遵循一些基本规则是很重要的。至关重要的是,业务能力停留在业务层面上,并保持抽象。它们代表了一个组织所做的事情,并以问题空间为目标。当一个业务能力被实现时,一个特定上下文的实现——能力实例——被创建。在解决方案空间的这种界限内,多个应用程序和组件协同工作来交付特定的业务价值。

与特定业务功能相关的应用程序和组件与其他业务功能相关的应用程序保持分离。这允许更大的灵活性,也是领域和有界环境发挥作用的地方,就像边界围栏和我们的房子一样。您可以设置明确的原则:有界上下文是从业务功能中派生出来的,并且专门映射到业务功能。它们代表了业务功能实现的边界,表现得像一个域。如果业务能力改变,有界的上下文也会改变。优选地,您期望域和相应的有界上下文之间完全一致,但是现实——您将在接下来的部分中了解到——可能是不同的。

如果我们将能力映射投射到 Oceanic Airlines,您的有界上下文边界和域实现可能如下所示。

域之间的数据分布(作者:Piethein Strengholt)

在上面的“域间数据分布”示例中,客户管理建立在主题专业知识的基础上,因此有权决定向其他域提供什么数据。客户管理的内部架构是分离的,因此这些边界内的所有应用程序组件可以使用特定于应用程序的接口和数据模型直接通信。然而,使用数据产品和清晰的互操作性标准将数据分发到其他域是正式的。这是进入或离开你家的普通车道!在这种方法中,所有的数据产品都与领域保持一致,并继承了无处不在的语言:一种构建的、形式化的语言,由来自同一领域的利益相关者和设计者达成一致,以服务于该领域的需求。

多能力实现产生额外的域

当使用业务功能图时,理解一些业务功能可以被实例化多次是很重要的。例如,海洋航空公司,我们到目前为止一直使用的例子,可以有多个本地化的“行李处理和丢失项目”的实现。例如,某项业务仅在亚洲运营。在这种情况下,“行李处理和遗失物品”是亚洲相关飞机的一项功能。不同的业务线可能以欧洲市场为目标,因此在这种情况下使用另一种“行李处理和丢失物品”功能。这种多实例的场景可能会导致使用不同技术服务的多个本地化实现,以及操作这些服务的不相关团队。吸取的教训是,业务能力和能力实例(实现)的关系是一对多的,这也意味着您最终会有额外的(子)领域。

共享功能和共享数据

更重要的是你应该如何处理共享的业务能力。这种功能通常集中实现——作为服务模型——并提供给不同的业务部门。例如,“客户管理”可能就是这样一种能力。就海洋航空公司而言,亚洲和欧洲的业务部门对其客户使用相同的管理。问题是:如何将领域数据所有权投射到共享功能上?很可能多个业务代表对坐在同一个共享管理中的客户负责。总结一下,有一个应用域和一个数据域!数据产品的角度来看,您的领域和有界上下文并不完全一致。相反,你可以认为从业务能力的角度来看,仍然有一个单一的数据问题。

数据产品:数据产品是数据架构的一个单元或组件,它封装了使读优化数据集可供其他域使用的功能。

对于您共享的功能,比如复杂的供应商包、SaaS 解决方案和遗留系统,我建议在您的领域数据所有权方法上保持一致。一种技术是通过数据产品分离数据所有权,这也可能需要应用程序的改进。在“客户管理”的例子中,来自应用领域的不同管道可以生成多个数据产品:一个数据产品用于所有与亚洲相关的客户,另一个用于所有与欧洲相关的客户。这意味着多个数据域来自同一个应用程序域。

处理共享数据的另一种技术是要求您的应用程序域设计一个单独的数据产品,该产品封装了元数据,用于区分数据产品内部的数据所有权。例如,您可以为所有权使用保留的列名,将每一行映射到一个特定的数据域。下面你会看到一个使用域列的例子。

封装元数据如何促进共享所有权的示例(作者:Piethein Strengholt)

共享功能的复杂性在于数据域与应用程序域重叠。理想情况下,您拥有业务能力的团队与您的应用程序域一致,因此软件所有权和数据所有权也是一致的。如果无法拆分您的域,您需要区分应用程序所有权和数据所有权。因此,在“客户管理”的例子中,您将有一个负责底层技术服务、管道和应用程序组件的应用程序所有者。接下来,您将有多个数据所有者(业务代表)负责不同的数据集,包括元数据注册、隐私、安全性等等。

关注服务于多种业务能力的复杂应用

另一个需要注意的地方是满足多种业务能力的应用程序,这在大型和传统企业中很常见。例如,大洋航空公司使用一个软件包来促进“成本管理”和“资产和融资”。这种共享应用程序通常很大而且很复杂:提供尽可能多的功能的供应商业务套件或遗留系统。这种情况下的应用领域预计会更大。这同样适用于共享所有权,这意味着多个数据域驻留在一个应用程序域中。

与来源一致、重新交付和与消费者一致的领域的设计模式

在映射您的域时,您将了解到基于数据的创建、消费或重新交付有不同的模式。我建议设计架构蓝图来支持您的领域,基于它们所具有的特征。

源对齐域与数据来源的源系统对齐。这些通常是交易或操作系统。目标必须是直接从这些黄金来源系统中获取数据。源自提供域的数据产品应该针对密集数据消费进行读取优化,因此您希望使用标准化服务来促进域的数据转换和共享。这些服务,包括预配置的容器结构,使您的面向源代码的领域团队能够更容易地发布数据;这是阻力最小的路径,以最小的干扰和成本做正确的事情。例如,如果设计正确,您的架构看起来像下面的模型:

源对齐域数据共享(作者:Piethein Strengholt)

消费者对齐的域与来源对齐的域相反,因为它们与需要来自其他域的数据的特定最终用户用例对齐。他们消费和转换数据,以适应他们的业务用例。为了满足这些消费需求,您应该考虑为数据转换和消费提供共享数据服务,例如处理数据管道、存储基础设施、流服务、分析处理等的与域无关的数据基础设施功能。

使用数据的消费一致领域(作者:Piethein Strengholt)

再交付领域:另一个不同且更困难的场景是数据的可重用性。例如,多个下游消费者可能对来自不同领域的数据组合感兴趣。数据产品的指导将有助于做出正确的决策。

对于您的架构,我鼓励您松散地耦合数据产品的创建和您的分析用例。在下面的模型中,域同时拥有聚合数据、可重用数据和分析用例。然而,这两个问题是不相关的。使用这种方法,数据消费者可以安全地消费新的数据产品,而不会与同一领域的分析用例紧密相连。这种情况下的聚合数据是分析用例的输入。

共享汇总数据(作者:Piethein Strengholt)

另一个选项可以是新生成的数据,这些数据将成为其他域的候选数据。在这种情况下,数据消费者变成了数据提供者,并将遵循相同的数据分发路径。这种情况下的架构如下所示:

分享新创建的分析数据(作者:Piethein Strengholt)

应对复杂集成挑战的标准化模式

当将您的企业环境分解成更细粒度的领域结构时,您会遇到复杂的集成挑战。如果我们以海洋航空公司为例,不同的其他领域可能需要来自“客户管理”的数据。或者"飞行计划和概述
管理"必须在"飞行员管理"中知道一名飞行员是否还存在,才能计划一次飞行。你会如何解决这个问题?

最佳实践是在通用车道模式上实现跨域边界集成的标准化。例如,在执行大型数据处理时,您可以应用 CQRS 来构建面向域的读取数据存储。这允许域从其他域集中读取数据,而不需要不断复制数据。例如,对于高度一致的读取(和命令),推荐使用 API 模式。以下关于设计模式的概述可以在您的过渡中为您提供支持:

领域间复杂集成的公共车道模式

如果您的公共车道模式设计正确,它们也可以与您的数据管理功能集成。这允许您捕获元数据,以获得安全性、可观察性、可发现性、沿袭和链接、质量监控、编排、通知等方面的透明度和洞察力。

解耦的粒度级别

现在我们知道了如何识别和促进数据域,我们来看下一点:设计正确的域粒度级别和分离规则。当分解您的架构时,有两个重要的方面发挥作用:

首先,功能域和设置有界上下文的粒度:符合工作方式,确保数据对所有域可用,利用共享服务,遵守元数据标准,等等。我对数据分布的建议是设置边界,在可能的情况下,设置精细的边界,因为成为数据驱动就是让数据可用于密集(重复)使用数据。如果您将您的域边界定义得太粗,您将在许多应用程序之间强加不期望的耦合,并且数据可重用性会丧失。因此,每次数据跨越业务能力的边界时,都要努力实现解耦。这意味着在一个域中,紧耦合是允许的。然而,当跨越边界时,域必须保持解耦,并分发读取优化的数据产品,以便与其他域共享数据。因此,例如,如果大洋航空公司的“预订&佣金”和“客户管理”需要交换数据,它们必须使用通用的车道模式。

第二,对于技术领域和基础设施利用率,有粒度。想象一个现代分布式数据平台,它使用不同的分散区域来实现服务数据集成和数据产品的敏捷性。这样一个区域,下面有共享的基础设施和服务,您将如何向您不同的领域团队提供这些呢?我的经验是,许多不同的方面触发了哪些功能域将被逻辑地分组在一起,并成为共享平台基础设施的候选。这里有几个例子:

  • 工作和共享数据方式的内聚力和效率。这与数据重力密切相关:在域之间不断共享大型数据集的趋势。
  • 区域界限可能会导致实现相同的业务功能和蓝图。
  • 所有权、安全性或法律界限可能会迫使域被分离。例如,某些数据不允许被其他域看到。
  • 灵活性和变化速度是重要的驱动因素。在几个领域内可以有创新的速度,而其他领域强烈重视稳定性。
  • 功能边界可以将团队分开,例如面向源/面向消费者。也许你的领域团队中有一半人认为特定的服务比其他服务更重要。
  • 一个原因可能是您希望出售或分离您的功能,因此与来自其他领域的共享服务紧密集成是不明智的。
  • 团队规模、技能和成熟度可能是一个因素。高技能和成熟的团队希望运营他们自己的服务和基础设施。
  • 不幸的是,政治界限也可能是一种驱动力。当业务能力与组织结构不一致时,我尤其会看到这一点。

业务能力建模的好处在于,它可以帮助您更好地识别和组织数据网格架构中的领域。它提供了数据和应用程序如何为您的企业带来价值的整体视图。与此同时,您可以优先考虑并关注您的数据策略和实际业务需求。除了只需要数据之外,您还可以使用这个模型。例如,如果可伸缩性是一个问题,您可以确定您最关键的核心能力,并为这些能力开发一个策略。

当将所有域和基础架构区域拼接在一起时,数据网格体系结构在概念上应该是这样的:

数据网格架构中域如何组织、利用基础设施和交互的示例架构(作者:Piethein Strengholt)

在上面的模型中,域被逻辑地组织并有效地共享基础设施,同时使用公共车道模式集成和分布数据。每个数据产品团队作为一个子域,负责他们生产和服务的数据。当跨越域边界时,团队利用基础设施区域蓝图提供的共享数据服务进行数据转换和消费。

有些人可能会担心,通过预先规划一切来构建这样一个目标状态架构是一项密集的工作。建议的替代方法是在将域加入到架构中的同时,有机地识别它们。因此,你不是自上而下地定义你的目标状态,而是自下而上地工作:探索、试验和将你的当前状态向目标状态过渡。这种方法可能会更快,但是当东西开始损坏时,会暴露出进入复杂的移动或改造操作的风险。一个更微妙的方法可能是在两个方向都起作用,然后在中间会合。

最后,设计大规模的分布式架构也需要你大规模地思考。业务能力建模和映射您的关键战略支柱将平滑您的领域分解。如果这是你喜欢的内容,我让你看看《规模化数据管理》这本书。

感谢 @mchesbro@mihail.tatarnikov@bashyrogerRichard RotellaKlaudia GoweroJan Meskens 提供反馈!此外, @roger.stoffers 分享了他的著作《数字化转型实地指南》中的见解

数据漂移第 1 部分:数据漂移的类型

原文:https://towardsdatascience.com/data-drift-part-1-types-of-data-drift-16b3eb175006?source=collection_archive---------12-----------------------

导致模型性能下降的不同类型的数据漂移

作者图片

在这一系列文章中,我计划解释数据漂移的概念以及它如何导致模型性能下降,如何识别数据漂移,以及如何提出一个监控计划来帮助尽早识别数据漂移和性能下降。

让我们考虑这样一个场景,你开发了一个模型,预测客户贷款违约的概率,它有很好的性能。简单地说,性能指标是准确性,您的模型有 86%的准确性。但是部署后几个月,你的模型表现不佳。业绩下滑到 70%。或者,项目批准和模型部署中的延迟,导致训练好的模型仅仅停留在那里几个月,而没有部署到生产中。当它最终被部署时,性能并不好。这是否意味着你当时开发的模型实际上并不好?不一定,“shift happens”(明白吗?).在这一系列文章中,我将讨论数据漂移(或数据偏移)如何导致性能下降,不同类型的数据漂移,如何识别数据漂移,整体模型监控实践,以便这些变化不会让您措手不及,以及最后如何在识别数据漂移后克服并修复您的模型。

在这篇文章(第 1 部分)中,让我们看看不同类型的数据漂移,以及它们是如何发生的一些例子。这将有助于我们理解数据漂移如何导致模型性能下降。

数据转移、数据漂移、概念转移、变化的环境、数据断裂都是描述同一现象的类似术语:训练和测试/生产数据之间的不同数据分布

当这些变化发生时,我们正在打破机器学习模型的基本假设。假设过去的(训练)数据代表未来的(测试/生产)数据。

数据移位的类型

1)协变量移位(自变量的移位):

协变量移位是一个或多个独立变量(输入特征)的分布变化。这意味着由于一些环境变化,即使特征 X 和目标 Y 之间的关系保持不变,特征 X 的分布也已经改变。下图可能有助于更好地理解这一点。

作者图片

在我们上面的违约概率示例中,这可能意味着由于疫情,许多企业关闭或收入减少,他们不得不裁员,但他们决定继续支付贷款,因为他们担心银行可能会没收他们的资产(X 变量的分布不同,但 Y 的分布相同)。

另一个例子是,随着用户群的增长,你投入生产的模型开始看到一个新时代的人口统计。你可能会对年轻用户进行培训,但是随着时间的推移,你也可能会有很多老用户。因此,你会看到均值和方差增加,因此数据漂移。

当这种变化发生在模型的一个或多个主要变量中时,性能下降会更加明显。您还应该在模型开发过程中验证输入特性是稳定的(例如,检查训练集和测试集内部和之间的这种变化),然后在部署后通过模型监控继续这样做。要学习如何识别协变班次,请看以下帖子: 第二部分 & 我的博文

在更正式的定义术语中,协变量移位是指 Ptrain(Y|X)=Ptest(Y|X)但 Ptrain(X) ≠Ptest(X) 的情况

其中 Ptest 可能是模型部署后的测试集或数据。

2)先验概率转移(目标变量的转移):

通过先验概率转移,输入变量的分布保持不变,但目标变量的分布发生变化。例如,可能是这样的:

作者图片

在我们上面的违约概率示例中,可能有一些公司没有真正受到锁定的影响,也没有遭受任何收入损失,但他们故意选择不偿还贷款分期付款,以利用政府补贴,并可能节省这笔钱,以防未来情况恶化(相同的 X 分布,但不同的 Y)。

在更正式的定义术语中,协变量移位是指 Ptrain(X|Y)=Ptest(X|Y)但 Ptrain(Y) ≠Ptest(Y) 的情况

其中 Ptest 可能是模型部署后的测试集或数据。

3)观念转变

随着概念漂移,输入和输出变量之间的关系发生变化。这意味着输入变量的分布(例如用户人口统计、单词频率等。)甚至可能保持不变,我们必须转而关注 X 和 y 之间关系的变化。

在更正式的定义术语中,概念转换是指 Ptrain(Y|X) ≠ Ptest(Y|X) 的情况

其中 Ptest 可能是模型部署后的测试集或数据。

概念漂移更可能出现在依赖于时间的领域,如时间序列预测和季节性数据。在一个月内学习一个模型不会推广到另一个月。概念漂移有几种不同的表现方式。

逐渐的概念漂移

渐进式或渐进式漂移是我们可以观察到的随时间推移而发生的概念漂移,因此可以预期。随着世界的不同变化,我们的模式逐渐变得过时,导致其性能逐渐下降。

作者图片

概念逐渐漂移的一些例子有 :

  • 推出替代产品 —在培训期间无法获得的产品(例如,如果该产品是市场上同类产品中的唯一产品)可能会对该型号产生不可预见的影响,因为它以前从未见过类似的趋势
  • 经济变化——利率的变化及其对更多贷款人拖欠贷款的影响可能会引起变化。

随着时间的推移,这些情况的影响会累积起来,导致更剧烈的漂移效应。

突发的概念漂移

作者图片

顾名思义,这些观念的转变来得很突然。一些最明显的例子出现在新冠肺炎首次在全球范围内出击的时候。需求预测模型受到严重影响,供应链跟不上,突然出现了像 2020 年卫生纸大短缺(不是官方术语,只是我的叫法😆)

作者图片

但是这种变化也可能发生在公司的正常运作过程中,而不会发生疫情 。

道路网络的重大变化:新道路的突然开放和其他道路的关闭或新公共铁路系统的增加可能会给交通预测模型带来麻烦,直到它收集了一些数据来处理,因为它以前从未见过类似的配置。

生产线增加新设备:新设备提出新问题,减少老问题。所以这个模型不确定如何做出好的预测。

一般来说,环境中的任何重大变化都会使模型陷入不熟悉的领域,从而导致性能下降。

重复出现的概念漂移

作者图片

反复出现的概念漂移相当于“季节性”。但季节性在时间序列数据的机器学习中是常见的,我们也意识到了这一点。因此,如果我们预期这种漂移,例如在周末或一年中的某些假期出现不同的模式,我们只需要确保我们用代表这种季节性的数据来训练模型。只有当模型不熟悉的新模式出现时,这种数据漂移通常会成为生产中的一个问题。

实际上,确定数据漂移的确切类型并不重要。通常,这种漂移可能是这些东西的组合,而且很微妙。重要的是识别对模型性能的影响并及时捕捉偏差,以便尽早采取措施,如重新训练模型。

既然您怀疑存在数据漂移,那么如何识别模型性能下降背后的数据漂移发生在哪里呢?要了解如何识别数据集中的数据漂移,请阅读本系列的第二部分

https://practicalml.net】点击 查看我的博客 获取更多即将发布的帖子

参考

[1] Sarantitis,G. (2021 年 6 月 24 日)。机器学习中的数据移位:是什么,如何检测。圣乔治·萨兰蒂斯。https://gsarantitis . WordPress . com/2020/04/16/data-shift-in-machine-learning-what-it-and-how-to-detect-it/。

[2]萨穆伊洛娃,E. (2021 年 6 月 22 日)。生产中的机器学习:为什么要关心数据和概念漂移。中等。https://towards data science . com/machine-learning-in-production-why-you-should-care-data-and-concept-drift-d 96d 0 BC 907 FB

https://gsarantitis.wordpress.com/2020/04/16/data-shift-in-machine-learning-what-is-it-and-how-to-detect-it/

数据漂移—第 2 部分:如何检测数据漂移

原文:https://towardsdatascience.com/data-drift-part-2-how-to-detect-data-drift-1f8bfa1a893e?source=collection_archive---------18-----------------------

识别模型中数据漂移的指南

图片由卢克·切瑟 | Unsplash 拍摄

在本帖中,我们将介绍一些用于识别任何可能发生的数据漂移的技术。

假设您已经将一个模型部署到生产中,并且您注意到性能正在下降。性能下降背后有几个可能的原因:

  1. 模型输入数据本身存在错误:
  • 由于数据源的问题,输入数据可能是错误的。前端问题意味着写入数据库的数据不正确
  • 特征工程计算中可能存在错误。来源处的数据是正确的,但在管线中或特征工程期间存在错误,这意味着输入到特定特征的模型中的数据是不正确的

这些问题通常需要进一步的人工调查,并且可以通过代码审查、调试等来解决。

2.当外部因素导致数据发生真实变化时。这就是数据漂移,在本系列的第 1 部分中,我们了解了不同类型的数据漂移(协变量漂移、先验概率漂移&概念漂移)和一些例子。

假设经过一些检查后,您怀疑模型性能下降确实是由于数据漂移。那么,我们如何验证这一点,并确定数据漂移发生在数据的哪个位置呢?

测量漂移有三种主要技术:

  1. 统计:这种方法使用数据集上的各种统计指标来得出关于训练数据的分布是否不同于生产数据分布的结论。我们已经有了数据,所以它通常涉及到每次运行相同的计算,并可能绘制结果以便于分析。
  2. 基于模型:这种方法包括训练分类模型,以确定某些数据点是否与另一组数据点相似。如果模型很难区分数据,那么就没有任何显著的数据漂移。如果模型能够正确地分离数据组,那么可能存在一些数据漂移。
  3. 自适应窗口(ADWIN):这种方法用于流数据,在这种情况下,有大量的无限数据流入,不可能全部存储。与此同时,数据可能会变化得非常快。

1.统计法

这些方法中有许多是比较分布的。比较需要一个参考分布,它是我们用来比较生产数据分布的固定数据分布。例如,这可能是训练数据的第一个月,或者是整个训练数据集。这取决于你试图检测漂移的背景和时间范围。但是显然,参考分布应该包含足够的样本来表示训练数据集。让我们考虑一个使用 2019 年的数据训练的分类模型,其性能在 2020 年一直在缓慢下降。在这种情况下,我们可以开始尝试使用以下方法来检测顶级功能中的数据漂移。

注意:因为我们想观察数据随时间的漂移,我们想按时间聚合或划分数据,可以是每月、每周等,这取决于您的数据和监控频率。在本例中,我们将按月汇总数据。

下面我将解释一些用于检测漂移的不同统计方法。要查看使用真实数据集的完整代码示例,请参考我的博文这里

平均

我们可以考虑的第一个也是最简单的一个衡量标准是我们特征的方法。如果平均值在几个月内逐渐向某一特定方向移动,那么可能发生了数据漂移。

作者图片

我们可以从迷你图中看到,功能 A 处于下降趋势。迷你图不是识别趋势的最佳工具,因为它们会使细微的变化看起来有些夸张。平均值不是检查漂移的最可靠的方法,但却是一个很好的起点。

统计距离度量

有许多不同的统计距离度量可以帮助量化分布之间的变化。不同的距离检查在不同的情况下是有用的。

人口稳定指数

PSI 常用于金融行业,是一种衡量变量在两个样本之间或一段时间内的分布变化程度的指标。顾名思义,它有助于测量两个人口样本之间的人口稳定性。

Equation: PSI = (Pa — Pb)ln(Pa/Pb)

ln(Pa/Pb)项意味着,与具有大百分比分布的仓中的大变化相比,代表小百分比分布的仓中的大变化对 PSI 的影响更大。

应该注意的是,群体稳定性指数仅仅表示特征的变化。但是,这不一定会导致性能下降。因此,如果您确实注意到性能下降,您可以使用 PSI 来确认总体分布确实发生了变化。PSI 检查也可以添加到您的监控计划中。

库尔巴克-莱布勒散度

KL 散度衡量两个概率分布之间的差异,也称为相对熵。如果一个分布与另一个分布有很高的方差,KL 散度是有用的。

KL 公式来自维基百科

KL 散度也是不对称的。这意味着,与 PSI 不同,如果参考和生产(比较)分布对被交换,结果会有所不同。所以 KL(P || Q)!= KL(Q || P)。这对于涉及 Baye 定理的应用或当您有大量训练(参考)样本,但在比较分布中只有一小组样本(导致更多方差)时非常有用。

KL 分数的范围从 0 到无穷大,其中 0 分意味着两个分布是相同的。如果 KL 公式采用以 2 为底的对数,结果将以位为单位,如果使用自然对数(底 e),结果将以“nats”为单位。

詹森-香农(JS)散度

JS 散度是量化两个概率分布之间差异的另一种方式。它使用我们上面看到的 KL 散度来计算对称的标准化得分。这使得 JS 散度分数更有用,也更容易解释,因为当使用对数基数 2 时,它提供了 0(相同分布)和 1(最大不同分布)之间的分数。

使用 JS,不存在被零除的问题。当一个分布在某些区域有值而另一个没有值时,就会出现被零除的问题。

瓦瑟斯坦距离度量

Wasserstein 距离,也称为推土机距离,是给定区域内两个概率分布之间距离的度量。Wasserstein 距离对于非重叠数值分布移动和高维空间(例如图像)的统计是有用的。

Kolmogorov-Smirnov 检验(K-S 检验或 KS 检验)

KS 检验是连续/不连续一维概率分布相等的一种非参数检验,可用于比较样本与参考概率分布(单样本 K–S 检验),或比较两个样本(双样本 K–S 检验)。

2.基于模型

上述统计方法的替代方法是建立一个分类器模型,尝试区分参考分布和比较分布。我们可以通过以下步骤做到这一点:

  1. 将用于构建当前生产模型的批中的数据标记为 0。
  2. 将我们从那时起收到的那批数据标记为 1。
  3. 开发一个模型来区分这两个标签。
  4. 评估结果,必要时调整模型。

如果开发的模型可以很容易地区分两组数据,那么协变量发生了变化,模型需要重新校准。另一方面,如果模型难以区分两组数据(其精确度约为 0.5,与随机猜测一样好),则没有发生显著的数据偏移,我们可以继续使用该模型。

3.ADWIN 自适应滑动窗口

如前所述,当我们有一个输入数据流时,上述技术不是很合适。在某些情况下,数据可能漂移得如此之快,以至于当我们收集数据并训练模型时,趋势可能已经发生了变化,我们的模型已经过时了。但是计算出训练的最佳时间框架也不是那么简单。这就是自适应滑动窗口技术有用的地方。它能适应不断变化的数据。例如,如果发生变化,窗口大小将自动缩小,否则,如果数据是静止的,窗口大小将增大以提高准确性。

这些技术可以根据其适用性来检测数据漂移。但是我们希望避免等到发现模型中的性能显著下降时才开始调查数据漂移。这就是拥有一个模型监控计划变得非常有用的地方。查看本系列文章的第 3 部分(即将发布),了解如何创建有效的模型监控计划。

原载于 2021 年 6 月 10 日【https://practicalml.net】

https://practicalml.net查看我的博客,将来会有更多帖子

参考

[1] Dhinakaran,A. (2020 年 10 月 19 日)。使用机器学习可观察性的统计距离度量。中等。https://towards data science . com/using-statistical-distance-metrics-for-machine-learning-observability-4c 874 cded 78。

[2]维基媒体基金会。(2021 年 6 月 21 日)。库尔贝克-莱布勒散度。维基百科。https://en.wikipedia.org/w/index.php?title = kull back % E2 % 80% 93 lei bler _ divergence&oldid = 1029607529。

进一步阅读

PSI:https://towards data science . com/using-statistical-distance-metrics-for-machine-learning-observability-4c 874 cded 78。

kull back-lei bler(KL)divergence:https://towardsdatascience . com/light-on-math-machine-learning-intuitive-guide-to-understanding-KL-divergence-2b 382 ca 2 B2 a 8

詹森-香农(JS)散度:https://medium . com/datalab-log/measuring-the-statistical-similarity-between-two-samples-using-Jensen-Shannon-and-kull back-lei bler-8d 05 af 514 b 15

瓦瑟斯坦距离度量:(https://towardsdatascience . com/earth-movers-distance-68 fff 0363 ef2)

https://en.wikipedia.org/wiki/Wasserstein_metric

Kolmogorov–Smirnov 测试:https://en . Wikipedia . org/wiki/Kolmogorov % E2 % 80% 93 Smirnov _ test # Discrete _ and _ mixed _ null _ distribution

基于模型:https://www . arango db . com/2020/11/arango ml-part-4-detecting-co variate-shift-in-datasets/

数据驱动调度优化方法

原文:https://towardsdatascience.com/data-driven-approach-for-schedule-optimizations-60fdcba1376e?source=collection_archive---------21-----------------------

如何使用 Google 或-Tools 来调度问题,并用 Plotly 可视化输出

Pablo Merchán Montes 在 Unsplash 上拍摄的照片

从餐馆开始…

想象你是一家餐馆的经理。今天正好是忙碌的一天,你现在缺少人手来完成客户的订单。菜要洗,鸡要切,同时,菜要做……菜做好了,还要有人上菜,收钱。看到待办事项列表越来越长,现在你有点焦虑:你应该分配谁去做什么任务,这样你才能在最短的时间内完成所有的订单?我刚才描述的场景本质上实际上是一个调度问题。或者在更高层次上,是 Or(运筹学)课题的子集。运筹学是一门运用先进的分析方法来帮助做出更好决策的学科。有大量的开源库可供用户用来解决调度问题。其中,Google OR-Tools 是最受欢迎的开源库之一,用于解决包括车辆路径、调度、整数规划、线性规划和约束编程问题在内的问题。更多详情,你可以参考他们的官方网站超过这里

尽管链接中给出了大量例子来演示如何利用这个库来解决优化问题,但是如果您对它完全陌生,最初的学习曲线可能会有点深。今天,我将向你展示一个为餐厅员工制定时间表的例子,希望它能让你更容易理解其中的概念。让我们开始吧!

问题设置

现在,让我们为餐厅调度问题添加更多的细节,以更好地模拟实际的餐厅环境。为了便于跟踪,让我们假设餐厅里总共有三名员工帮助完成任务。为了完成来自客户的订单,通常有三种类型的任务要处理:

  1. 准备配料。这一步可能包括洗菜、切鸡肉等。
  2. 做饭。根据不同种类的食物,烹饪时间可能会更长或更短。
  3. 服务客户。这一步可能包括诸如上菜、收款等任务。

同样,在现实中,整个过程可以进一步细分,这里为了简单起见,我们只采取这 3 个步骤。这里需要注意的另一点是,工作人员实际上需要按顺序完成这 3 个步骤,即只有在准备工作完成后才能做饭。除非饭菜做好了,否则不可能给顾客上菜。在调度问题的上下文中,这些被称为“优先约束”。我们将在后面的编码部分再次讨论这个概念。设定 3 个主要处理步骤后,下一步是确定哪个员工负责哪个处理步骤,以及他/她完成该步骤需要多少时间。实际上,这里的任务安排可能相当灵活,因为一些员工可能既能处理配料准备又能烹饪,而其他人可能只专注于服务客户。在我们的例子中,为了简单起见,我们将预先安排分配给每个员工的任务。在编码部分有更多的细节。

使用 Google 或工具进行日程安排

有了这些设置,我们就可以开始实际的编码了。如前所述,我会使用 Google 或-Tools 作为支持库来优化我们餐厅的时间表。要安装 Google 或-Tools for python,只需在命令行中键入以下内容:

python -m pip install --upgrade --user ortools

值得一提的是,如果你使用的是 C++,C#,或 Java,Google 或-Tools 也有可用的包装器。Google OR-Tools 中有几个针对不同用例的解算器。对于调度,我们将使用 CP-SAT 求解器:

from ortools.sat.python import cp_model

在程序开始时,我们需要首先定义订单信息,由分配的员工和完成该步骤所需的时间组成。这里,订单数据被定义为一个元组列表,其中每个元组对表示分配的人员和所需的处理时间。下图中可以找到一个示例。

作者图片

horizon ”变量定义了在最终计划中分配的可能值的上限。通过计算每项任务所需时间的总和,如果每件事情都按顺序一个接一个地完成,它会返回最坏情况下所需的总时间。在接下来的部分中,您将看到这个“horizon”参数是如何出现的。

horizon = sum(task[1] for job in jobs_data for task in job)

在下一部分代码中,我们使用嵌套的 for 循环遍历所有 3 个订单的每个处理步骤,然后相应地创建开始、结束和间隔变量。注意这里 start_var 被定义为模型。NewIntVar(0,horizon,' start'+suffix) —这里 horizon 定义了 start_var 可以达到的上限。通过创建所有这些变量,稍后将更容易定义问题的相关约束。

for job_id, job in enumerate(jobs_data):
    for task_id, task in enumerate(job):
        staff = task[0]
        duration = task[1]
        suffix = '_%i_%i' % (job_id, task_id)
        start_var = model.NewIntVar(0, horizon, 'start' + suffix)
        end_var = model.NewIntVar(0, horizon, 'end' + suffix)
        interval_var = model.NewIntervalVar(start_var, duration, end_var, 'interval' + suffix)
        all_tasks[job_id, task_id] = task_type(start=start_var,
                                               end=end_var,
                                               interval=interval_var)
        staff_to_intervals[staff].append(interval_var)

在定义了所有相关变量之后,下一步是定义问题的约束。在我们的示例中,我们有以下 3 个主要约束:

  1. 一名员工在给定时间内只能处理一项任务,不允许同时处理多项任务(我肯定你不希望你的员工在忙着做饭的时候给客户上菜)。在调度的上下文中,这被称为析取约束
  2. 正如我们之前已经提到的,需要按照步骤顺序来完成订单->准备,烹饪,然后上菜。这在调度问题中称为优先约束
  3. 最后,总体目标当然是在最少的时间内完成所有订单。
# Create and add disjunctive constraints.
for staff in all_staffs:
    model.AddNoOverlap(staff_to_intervals[staff])

# Precedences inside a job.
for job_id, job in enumerate(jobs_data):
    for task_id in range(len(job) - 1):
        model.Add(all_tasks[job_id, task_id + 1].start >= all_tasks[job_id, task_id].end)#Minimize the total time spent
obj_var = model.NewIntVar(0, horizon, 'total_time')
model.AddMaxEquality(obj_var, [all_tasks[job_id, len(job) - 1].end for job_id, job in enumerate(jobs_data)])
model.Minimize(obj_var)

配置好这些东西后,我们只需要让 Google 或-Tools 在后端做优化工作,看看返回的输出是什么。如果稍后找到最佳解决方案,状态变量将返回“最佳”

solver = cp_model.CpSolver()
status = solver.Solve(model)

可视化输出时间表

因此,现在模型在运行求解程序后返回“最优”状态。太棒了。现在我们应该如何可视化时间表?基本上,我们将需要检索我们之前定义的相关开始和结束时间变量的最终值,然后用一些条形图将其可视化。Plotly 为我们提供了一个方便的功能,只要输入的数据按照所需的格式进行格式化,我们就可以自动创建甘特图。关于 Plotly 库的用法,我不会讲太多细节,你可以随时参考在线教程或我的完整代码。

def visualize_schedule(assigned_jobs,all_staffs,plan_date):
    final = []
    for staff in all_staffs:
        #print("This is for staff: ", staff)
        assigned_jobs[staff].sort()
        for assigned_task in assigned_jobs[staff]:
            name = 'Order_%i' % assigned_task.job
            temp = dict(Task=staff,Start=plan_date + pd.DateOffset(minutes = assigned_task.start),
                        Finish= plan_date + pd.DateOffset(minutes = (assigned_task.start + assigned_task.duration)),
                        Resource=name)
            final.append(temp)
    final.sort(key = lambda x: x['Task'])
    return final

使用 Plotly 可视化的最终输出如下图所示。我们可以看到,完成所有三个订单总共花费了 18 分钟。通过这种可视化,您可以非常直观地了解相关的约束条件是否得到满足。

用 Plotly 可视化的餐厅工作时间表(图片由作者提供)

添加附加约束

我们刚刚定义的问题实际上是调度的一个非常基本的例子。在现实世界中,我们可能需要考虑许多其他类型的约束。这里我们可以添加另一个约束来说明:为了确保更好的客户满意度,餐馆要求所有的菜都应该在烹饪完成后的 3 分钟内提供给客户。换句话说,现在步骤 2 和步骤 3 之间的时间差应该在 3 分钟以内。正如我们在前面的计划输出中所观察到的,现在订单 1 没有满足这个约束,步骤 2 和步骤 3 之间有很大的差距。我们如何将这个约束添加到模型中呢?实际上,通过添加下面的粗体中突出显示的条件,可以很容易地做到这一点,我希望这是不言自明的:

for job_id, job in enumerate(jobs_data):
    for task_id in range(len(job) - 1):
        model.Add(all_tasks[job_id, task_id + 1].start >= all_tasks[job_id, task_id].end)
        # Make sure the time gap of task 2 and task 3 are less then 3 mins
        **if task_id == 1:
            model.Add(all_tasks[job_id, task_id + 1].start <= all_tasks[job_id, task_id].end + 3)
        else:
            continue**

添加此约束并重新运行模型后,更新后的明细表显示在下图中。虽然总的完成时间保持不变,但现在所有 3 个订单都满足了我们设置的新约束(从烹饪完成到上菜不超过 3 分钟)。虽然在这个例子中这个解决方案看起来很简单,但是当员工人数和订单数量增加时,使用这个工具的好处将会更加明显。

带有附加约束的更新时间表(图片由作者提供)

最后的想法和未来的工作

对于这个用例,我们有很多可以改进的地方。例如,我们可以用不同的人处理相同任务的方式来配置它,而不是为不同的人预先定义单独的任务。根据他们对不同任务的熟练程度,可能会有不同的相关处理时间。这样,调度程序可以给出更动态的输出。

为了进一步增强它,我们可以将这个日程安排程序作为一个 web 应用程序,用户可以通过前端 UI 简单地输入人员和订单信息,然后最终的日程安排将作为输出显示出来。如果您对此感兴趣,请随意尝试!

参考

这篇文章中的例子很大程度上遵循了与他们的官方网站相同的结构。关于用 Google 或-Tools 实现其他约束的更多例子,你可以参考他们的 Github 页面讨论组

最后,你可以在我的 Github 页面这里找到我在这篇文章中使用的全部代码。感谢阅读!

附言

如果您有兴趣加入中等会员计划,您可以使用以下链接注册!提前感谢大家的帮助:)

https://medium.com/@tianjie1112/membership

数据驱动审计| #1 使用 Python 自动采样

原文:https://towardsdatascience.com/data-driven-audit-1-automated-sampling-using-python-52e83347add5?source=collection_archive---------23-----------------------

使用 Python 自动化审计流程

克里斯里德在 Unsplash 上的照片

你将从这篇文章中学到什么

  • 将取样时间从一小时减少到一分钟
  • 如何将文件转换为最佳格式的示例代码
  • 步骤背后的基本原理

你可以在下面找到脚本。

设置

您从需要制作样本的客户处接收群体文件。

在创建示例之前,您需要执行以下步骤:

  1. 在 Python 中加载群体
  2. 移除不在范围内的实体
  3. 创建一个随机样本
  4. 导出到 excel

第一步

加载您从客户端收到的填充。你可以在这里下载数据集。

如您所见,客户为每个月(2015 年 1 月、2015 年 2 月……)创建了一个单独的表。对于我们的抽样过程,我们需要一个包含所有这些月份的合并表。

population.xlsx 数据集的屏幕截图

用以下参数读入所有纸张:

  • sheet_name = 0 |将所有工作表作为字典读入
  • dtype = str |读入所有数据类型为“string”的列
population = pd.read_excel("population.xlsx", sheet_name = None, dtype = str)

将不同的工作表连接成一个合并的工作表。

population = pd.concat( population , ignore_index = True)

现在您有了一个合并的工作表,但是您会注意到它还不是一个干净的格式。您需要执行以下清洁步骤:

  1. 删除空白的行和列

  2. 分配列名

  3. 删除不包含帐户值的行

  4. 转换为压缩格式

  5. 删除空白行

使用以下参数:

  • axis = 0 |删除具有 NA 值的行
  • how = 'all' |仅当所有值都是 NA 时才删除一行
  • subset = 'all' |只考虑从 1 开始的列(因此不包括第一列)
population = population.dropna( axis = 0 , how = 'all' , subset = population.columns[1:] )

现在,通过指定 axis = 1 删除没有任何值的列,并重置索引。

population = population.dropna (axis = 1 , how = 'all').reset_index( drop = True)

2.分配列名

您可以从文件的第一行获取列名。使用 iloc 函数将第一行的值存储在变量“columns”中。

columns = population.iloc[0]population.columns = columns

3.删除不包含帐户值的行

仍有不包含相关信息的行,例如实体行。您需要排除所有不以数字开头的行。

标题需要删除,因为我们已经分配了它们

population = population.loc[ population['Financial Row'].str[:1].str.isnumeric()]

输出示例

干得好!开始有点像了。

4.转换为压缩格式

最佳实践是将数据帧转换为压缩格式。请记住,行很便宜,但列很贵。这使得以后的过滤更加容易。

population = population.melt( id_vars = 'Financial Row', var_name='Entity', value_name='Amount')

示例输出

第 2 步:排除帐户

以下客户不在范围内:

  • 400XXX
  • 500XX
  • 800XXX

我们使用。loc 函数过滤数据帧,排除以这些帐户开头的行。通过指定“~”符号,您可以让 python 知道您想要排除满足条件的记录。

account_list = ["400", "500" , "800"]population_1 = population.loc[ ~ population['Financial Row'].str[:3].isin(account_list)]

第三步:制作样品

你现在想做一个样品。审计中常见的样本量是 20 条必须随机选择的记录。

在示例函数中使用以下参数:

  • n = 20 |样本量为 20
  • random_state = 1 |这允许您复制您的结果。
population_1 = population_1.reset_index( drop = True)population_sample = population_1.sample( n = 20, random_state = 1).reset_index()

抽样输出

步骤 4:将其全部导出到合并工作簿

您可以使用 excelwriter 函数将所有内容导出到合并工作簿中

with pd.ExcelWriter("sample.xlsx") as writer:
   population.to_excel(writer, sheet_name = "population_source")   
   population_1.to_excel(writer, sheet_name = "population_scoped")
   population_sample.to_excel(writer, sheet_name = "sample")

干得好!您已经成功实现了采样过程的自动化。

明年,只要再次运行这个脚本,去享受阳光吧!;)

在这里下载脚本

注:这是一系列博客中的第一篇。敬请关注更多内容。

照片由扎克·杜兰特Unsplash 上拍摄

数据驱动的客户细分

原文:https://towardsdatascience.com/data-driven-customer-segmentation-c16062741a7c?source=collection_archive---------7-----------------------

使用 k 均值聚类创建和分析客户群

"为了看清事物,站在一个人的外面可能是必要的."

――彼得·霍格,《夜的故事》

布鲁克·拉克Unsplash 拍摄的照片

介绍

我相信学习营销数据科学的最好方法是通过例子来工作。在这篇博文中,我想谈谈

  • 客户细分以及了解这一点的重要性
  • 建立 k-means 聚类模型,用肘法和剪影系数选择最佳聚类数
  • 营销语境下的 k-均值聚类解读

客户细分

客户细分是根据共同特征将客户分成不同群体的过程,这使得公司能够有效且恰当地对每个群体进行营销[1]。

我们为什么需要客户细分?

腾雅特Unsplash 上拍照

鉴于目前市场竞争激烈,了解客户行为、类型和兴趣至关重要。尤其是在目标营销中,对客户进行分类和了解是形成有效营销策略的关键一步。通过创建客户细分,营销人员可以一次专注于一个细分市场,并定制他们的营销策略。例如,你有一个酒店业务,你可能会针对即将举行周年纪念的夫妇,为他们提供一个特别的浪漫套餐。

总的来说,客户细分是成功的目标市场营销的关键,通过客户细分,您可以针对特定的客户群体进行不同的促销、价格选择和产品放置,以最具成本效益的方式抓住目标受众的兴趣[2]。

数据

我使用的是 UCI 机器学习库中的公共数据集,该数据集记录了一家总部位于英国的注册无店铺在线零售商在 2010 年 1 月 12 日至 2011 年 9 月 12 日之间发生的交易。数据集可以在这里找到。该公司主要销售独特的适合各种场合的礼品。这家公司的许多客户都是批发商。

功能:

  • 发票号:发票号。名义上,分配给每笔交易的 6 位整数。如果该代码以字母“c”开头,则表示取消
  • 库存代码:产品(物品)代码。名义上,一个 5 位数的整数,唯一分配给每个不同的产品。
  • 描述:产品(物品)名称。名义上的
  • 数量:每笔交易每种产品(物品)的数量。数字的
  • InvoiceDate:发票日期和时间。数字,每笔交易生成的日期和时间
  • 单价:单价。数字,单位为英镑的产品价格
  • CustomerID :客户编号。名义上,一个唯一分配给每个客户的 5 位整数
  • 国家:国家名称。名义上,每个客户居住的国家的名称。

数据争论

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

df = pd.read_excel('online_retail_dataset.xlsx', sheet_name='Online Retail')

数据清理

至于数据清理,我做了以下操作:

  • CustomerID空记录。让我们删除包含空值的行
  • 数量栏有负值,可能是采购后退货造成的。让我们删除数量为负的行
  • 单价栏也有负记录。我也决定放弃负价格的唱片
  • 购买记录的时间段为 2010 年 1 月 12 日至 2011 年 9 月 12 日。上个月数据不完整。让我们忽略不完整月份的记录。
# Let's drop rows containing NULL values
df.dropna(subset=['CustomerID'], inplace=True)

# Remove negative quantity
df = df.loc[df['Quantity'] > 0]

# Remove rows with negative price
df = df.loc[df['UnitPrice'] > 0]

# Handle incomplete data
df = df.loc[df['InvoiceDate'] < '2011-12-01']

数据转换

# Calculate total sales
df['Sales'] = df['Quantity'] * df['UnitPrice']

# Create per-customer data
df_customers = df.groupby('CustomerID').agg({'Sales': sum,
                                             'InvoiceNo': lambda x: x.nunique()})
df_customers.columns = ['TotalSales', 'OrderCount']
df_customers['AvgOrderValue'] = df_customers['TotalSales'] / df_customers['OrderCount']

# Rank the data
df_rank = df_customers.rank(method='first')

# Let us normalize the data to center around the mean 
# and have a mean of 0 and a standard deviation of 1
df_normalized = (df_rank - df_rank.mean()) / df_rank.std()

现在,您可以看到这些值以 0 为中心,标准偏差为 1。让我们使用这些数据进行聚类分析。

k 均值聚类

k-means 聚类是最简单也是最常用的算法之一。它试图找到代表特定数据区域的聚类中心。该算法包含两个步骤:

  1. 将每个数据点分配到最近的聚类中心
  2. 将每个聚类中心设置为分配给它的数据点的平均值。

一旦实例到聚类的分配不再改变,k-means 聚类就结束计算。

我们应用 k-means 聚类时,我们必须记住

  • 每个簇由其中心定义,这意味着一个簇具有凸起的形状。因此,k 均值捕捉具有相同“直径”的相对简单的形状
  • k-means 假设所有方向对于每个聚类都是同等重要的
  • 该算法在聚类中心之间的中间绘制聚类之间的边界[3]。

定义最佳聚类数

使用 k-means 聚类进行客户细分的一个缺点是,您必须事先知道聚类的数量。让我们探索两种定义数据集中聚类数量的方法:

  • 轮廓系数
  • 肘法

轮廓系数

剪影系数是一种用于估计聚类技术好坏的度量。

剪影系数的公式:

其中 b 是一个点与其最近的聚类之间的平均距离,而 a 是同一聚类内的数据点之间的平均距离。轮廓系数的范围从-1 到 1,其中值越接近 1 越好。

基本上,轮廓系数测量与其他聚类【2】相比,数据点与其聚类有多接近。

肘法

肘方法用于验证 k-means 聚类中的聚类数。肘方法的思想是对数据集运行 k-means 聚类,得到一系列值 k (比如说 k 从 1 到 10),并对每个值 k 计算:

  • 失真,这是距各个聚类的聚类中心的平方距离的平均值(使用欧几里德距离度量)
  • 惯性,它是样本到它们最近的聚类中心的平方距离之和[4,5]。

利用 k 均值聚类进行客户细分

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn import metrics 
from scipy.spatial.distance import cdist

# Calculate Silhouette coefficient
for n_cluster in [2, 3, 4, 5, 6, 7, 8]:
    kmeans = KMeans(n_clusters=n_cluster,
                    max_iter=400,
                    n_init=20).fit(df_normalized[['TotalSales',
                                                  'OrderCount',
                                                  'AvgOrderValue']])
    silhouette_avg = silhouette_score(df_normalized[['TotalSales',
                                                     'OrderCount',
                                                     'AvgOrderValue']],
                                      kmeans.labels_) 
    print('Silhouette coefficient for %i clusters: %0.3f' % (n_cluster,
                                                             silhouette_avg))

不同簇数的轮廓系数值

# Calculate inertias and distortions for customers dataset
# Link to original code: https://www.geeksforgeeks.org/elbow-method-for-optimal-value-of-k-in-kmeans/
distortions = [] 
inertias = []
K=range(1, 11)

for k in K: 
    kmeanModel = KMeans(n_clusters=k, max_iter=400, n_init=20).fit(df_normalized[['TotalSales',
                                                                                  'OrderCount',
                                                                                  'AvgOrderValue']]) 
    kmeanModel.fit(df_normalized[['TotalSales', 'OrderCount', 'AvgOrderValue']])
    distortions.append(sum(np.min(cdist(df_normalized[['TotalSales',
                                                       'OrderCount',
                                                       'AvgOrderValue']],
                                        kmeanModel.cluster_centers_,
                                        'euclidean'),axis=1)) / df_normalized[['TotalSales',
                                                                               'OrderCount',
                                                                               'AvgOrderValue']].shape[0]) 
    inertias.append(kmeanModel.inertia_)

# Plot distortions
plt.plot(K, distortions, 'bx-',  linewidth=2.5, color='dodgerblue') 
plt.xlabel('Values of K', fontsize=14) 
plt.ylabel('Distortion', fontsize=14) 
plt.title('The Elbow Method using Distortion', fontsize=16) 
plt.xticks(np.arange(1, 11))
plt.show()

# Plot inertias
plt.plot(K, inertias, 'bx-', linewidth=2.5, color='dodgerblue') 
plt.xlabel('Values of K', fontsize=14) 
plt.ylabel('Inertia', fontsize=14) 
plt.title('The Elbow Method using Inertia', fontsize=16) 
plt.xticks(np.arange(1, 11))
plt.show()

查看肘部曲线和轮廓系数,我选择聚类数=4,因为轮廓系数相对较高,惯性和扭曲不会随着聚类数的增加而发生显著变化。

现在我们知道了聚类的数量,让我们建立一个 k-means 聚类模型。

# Build k-means clustering model
kmeans = KMeans(n_clusters=4,
                max_iter=400,
                n_init=20).fit(df_normalized[['TotalSales',
                                              'OrderCount',
                                              'AvgOrderValue']])

cluster_centres = kmeans.cluster_centers_
df_cluster_centres = pd.DataFrame(cluster_centres,
                                  columns=['TotalSales', 
                                           'OrderCount',
                                           'AvgOrderValue'])
df_cluster_centres['Cluster'] = df_cluster_centres.index

df_four_clusters = df_normalized[['TotalSales',
                                  'OrderCount',
                                  'AvgOrderValue']].copy(deep=True)
df_four_clusters['Cluster'] = kmeans.labels_

每个客户都标有其聚类/细分

每个细分市场的客户数量

每个聚类中心的值

让我们仔细看看各组的中心。聚类#1 在所有三个属性中的数值最低。这意味着分类#1 包含销售额最小、订单数量最少和每订单平均价值最低的客户。这组客户是低价值客户之一。另一方面,簇#0 在所有属性中具有最高数量。因此,集群#0 中的客户购买昂贵的产品,给企业带来最高的收入。您通常希望将营销工作集中在这部分高价值客户上,因为这将带来最高的回报。

集群#2 中的客户相当有趣。他们购买相对频繁,因为订单数量相对较高,但他们的平均每单价值较低。这些是经常购买低值物品的顾客。所以,给这个细分市场推荐便宜的产品就太好了。集群#3 中的客户也很有趣,因为他们对收入和订单数量的贡献处于中低水平。然而,他们的平均每单价值相对较高,这意味着他们偶尔会购买昂贵的商品。因此,向该细分市场销售昂贵的产品是合适的。

让我们将这些片段形象化

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 0]['OrderCount'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 0]['TotalSales'],
            c='mediumvioletred')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 1]['OrderCount'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 1]['TotalSales'],
            c='dodgerblue')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 2]['OrderCount'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 2]['TotalSales'],
            c='gold')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 3]['OrderCount'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 3]['TotalSales'],
            c='lightseagreen')

plt.title('TotalSales vs. OrderCount Clusters', fontsize=16)
plt.xlabel('Order Count', fontsize=14)
plt.ylabel('Total Sales', fontsize=14);

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 0]['OrderCount'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 0]['AvgOrderValue'],
            c='mediumvioletred')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 1]['OrderCount'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 1]['AvgOrderValue'],
            c='dodgerblue')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 2]['OrderCount'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 2]['AvgOrderValue'],
            c='gold')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 3]['OrderCount'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 3]['AvgOrderValue'],
            c='lightseagreen')

plt.title('AvgOrderValue vs. OrderCount Clusters', fontsize=16)
plt.xlabel('Order Count', fontsize=14)
plt.ylabel('Avg Order Value', fontsize=14);

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 0]['TotalSales'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 0]['AvgOrderValue'],
            c='mediumvioletred')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 1]['TotalSales'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 1]['AvgOrderValue'],
            c='dodgerblue')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 2]['TotalSales'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 2]['AvgOrderValue'],
            c='gold')

plt.scatter(df_four_clusters.loc[df_four_clusters['Cluster'] == 3]['TotalSales'], 
            df_four_clusters.loc[df_four_clusters['Cluster'] == 3]['AvgOrderValue'],
            c='lightseagreen')

plt.title('AvgOrderValue vs. TotalSales Clusters', fontsize=16)
plt.xlabel('Total Sales', fontsize=14)
plt.ylabel('Avg Order Value', fontsize=14);

从图中可以看出,的高价值客户(紫色)在各个维度的价值最高,而的低价值客户(蓝色)则相反。

让我们来看看高价值人群最受欢迎的购买行为

pd.DataFrame(
    df.loc[df['CustomerID'].isin(high_value_cluster.index)
          ].groupby('Description').count()['StockCode'].sort_values(ascending=False).head(10))

高价值人群购买的最受欢迎的商品

当你瞄准高价值细分市场时,我们可以在营销策略中利用这些关于高价值细分市场购买的最受欢迎商品的信息。你可以推荐与这些畅销商品相似的商品,因为顾客对这些类型的产品最感兴趣。

摘要

  • 我们应用 k-means 聚类来理解在线零售店的细分市场
  • 使用肘方法和轮廓系数,我们找到了最佳的分段数,即 4
  • 我们从总销售额、订单数量和平均订单价值方面考察了每个细分市场之间的差异,并为每个细分市场制定了潜在的营销策略
  • 我们查看了高价值客户群购买的最受欢迎的商品,这可能有助于向这一高价值群体销售类似的商品,并提高转化率。

感谢您的阅读,请在下面评论您对使用机器学习进行客户细分的看法。要查看我的更多帖子,请在 Medium 和 LinkedIn 订阅。

Jupyter 笔记本可以在我的 GitHub 上找到。

参考文献

[1]客户细分定义—什么是客户细分。(未注明)。检索于 2021 年 2 月 10 日,来自https://www.shopify.com/encyclopedia/customer-segmentation

[2]黄耀辉(2019)。市场营销数据科学实践:使用 Python 和 R. Birmingham 通过机器学习改进您的市场营销策略。

[3]米勒,A. C .,圭多,S. (2018)。Python 机器学习导论:数据科学家指南。塞瓦斯托波尔,加利福尼亚州:奥赖利媒体。

[4]利用肘方法确定 k-means 聚类的最佳聚类数。(未注明)。检索于 2021 年 2 月 11 日,来自https://bl.ocks.org/rpgove/0060ff3b656618e9136b

[5]肘法求 k 的最佳值。(2021 年 02 月 09 日)。2021 年 2 月 11 日检索,来自https://www . geeksforgeeks . org/elbow-method-for-optimal-value-of-k-in-k means/

数据驱动的骑行和锻炼预测

原文:https://towardsdatascience.com/data-driven-cycling-and-workout-prediction-72c393e2542c?source=collection_archive---------14-----------------------

将旧的骑行锻炼数据转化为基于 ML 的数字私人教练,用于锻炼预测

在这篇博文中,我将分享我如何利用微软机器人框架和微软团队,将自行车练习中的数据转化为基于机器学习的智能机器人,这帮助我在训练中取得更多成绩,并始终保持动力。

概观

我在 2020 年 1 月底开始骑可折叠自行车,我爱上了骑自行车。我也喜欢处理数据,所以我用智能手表记录了我去斯特拉瓦的所有旅程。🚴🏻🚴🏻

五月底,我将我的城市自行车升级为沙砾自行车。直到秋天,我和我的新自行车在户外活动中度过了美好的时光。

伊斯坦布尔的户外骑行,图片由作者提供

在天气好的时候在外面练习之后,对于寒冷的天气,我在家里设置了一个疼痛洞穴,使用 Elite 阿里翁 AL13 rollerMisuro B+传感器Zwift 上进行虚拟骑行。Zwift 是一个虚拟环境,在这里你可以与你的 3D 虚拟角色连接,与其他运动员一起实时骑行。

室内游乐设施,作者图片

我的 Zwift 帐户与 Strava 连接,收集我所有的骑行数据,目前我已经完成了“3700km”的户外和室内活动🎉🎉

我决定分析我的数据,在分析之后,我决定用我的工程能力将它提升到一个新的水平。

这份报告展示了如何分析您的 Strava 数据,并使用 Jupyter 笔记本将其可视化。此外,该项目旨在预测潜在的锻炼日期和距离,以使用您自己的数据找到最佳的锻炼计划。这款数字私人教练可以作为健身伴侣使用。

这个项目最初是从 Jupyter Notebook 上现有批量数据的数据发现开始的。在数据探索阶段,我看到了一些模式,并认为,这些模式可以帮助我恢复健康。不久之后,我决定建立一个预测模型来预测我的锻炼、ride typedistance值。为了在 bot 框架中使用预测模型,该模型被导出为 pickle 文件,一个基于 FastAPI 的应用程序在 Python 中为该模型提供服务,微软团队中的一个聊天机器人调用该 API 帮助我提供一些输入,然后检索预测。

建筑,作者的图像

数据发现—亮点

让我们来看看我到目前为止取得的一些亮点,这里是一些关于我的数据的亮点。

  • 在 1 年的时间里,我已经完成了大约 3700 公里,包括户外和室内锻炼活动。大约 1/3 是 Zwift 上的虚拟乘坐。

户外和室内骑行的总距离 km,图片由作者提供

  • 2019 年,我增加了一些脂肪,但由于我的身体活动和一些健康的食物,我在这段时间里减掉了约 13 公斤(约 28 磅)。

一年内的总重量,图片由作者提供

  • 我喜欢下面展示一年中发生的所有重要生活事件的每周图表。

Jan-Mar:对锻炼充满热情

4 月至 6 月:疫情和土耳其的封锁

6 月至 12 月:享受户外和室内骑行

12 月:新年假期挑战#Rapha500

简:幸运地有了一个新的家庭成员:)

1 月至 3 月:试图重新找到我的老习惯,最后但并非最不重要的是,决定建立一个数字私人教练。

每周总距离,按作者分类的图像

  • 到目前为止,我一次骑行的最长距离是 62 公里,我喜欢这个显示我一段时间内表现的图表;

户外骑行与室内骑行的每次骑行距离,图片由作者提供

相互关系

当我检查乘坐类型时,我意识到在某一点后我只切换到室内虚拟乘坐,我想看看选择室内乘坐和天气之间是否有相关性,特别是与WindTemperature的相关性。为此,我在训练中使用天气 API 来检索天气状况,结果很清楚;我不喜欢在寒冷的雨天骑自行车,所以过了一会儿,我又回到了室内虚拟骑行。下图显示,在一定温度下,我选择了室内骑行。这是其中的一个特征——我已经加入到我的预测模型中。

游乐设备类型与温度,图片由作者提供

特征工程

我花了一些时间用 Jupyter 笔记本可视化我的乘坐数据,我发现了一些模式。这些模式要么是我有意识的决定,要么是条件使然。

我决定做一个关于特征工程的练习

1.游乐设备类型

游乐设备类型是影响训练持续时间和天数的一个因素,所以我添加了一个标志来表示游乐设备是室外还是室内

  • rideType —布尔标志

2.气候条件

正如在相关性中提到的,天气是影响我锻炼计划的因素之一:

  • Temperature -摄氏温度值为整数
  • Wind - km/h 值为整数
  • Weather Description -描述天气是否多云、晴朗、下雨等。

3.星期几和周末

当我将距离与周末或工作日进行对比时,我发现我最长的骑行时间是在周末。公共假期是另一个因素,但是现在,我决定不把它们整合在一起。

  • DayOfWeek -整数

一周中某一天的总距离,按作者分类的图像

但我主要选择了周二和周四作为工作日短途骑行日,并决定添加一天中的一周作为一个功能,并根据下图使用周末作为标志

  • isWeekend -布尔标志

工作日和周末的总距离,按作者分类的图像

4.一天中的某个时刻

在炎热的夏天,我更喜欢在温度比中午凉爽的时候进行户外骑行。基于下面的情节,一天中的某个时刻影响着我的乘坐和乘坐类型,所以我决定为一天中的某个时刻添加一个功能

  • hour -整数

距离与一天中的时间,作者提供的图片

预测模型

出于我个人的需要,在数据分析之后,我希望有一个输出distanceride type的预测,T3 是指我预计要骑行多少公里,而是指计划的骑行是室内还是室外。

因此,我使用之前的数据分析和工程特征来创建DistanceRide Type的预测模型。

1.乘坐类型预测

就心理准备而言,室内和室外骑行是有区别的,所以一般来说,我会根据我的骑行类型在锻炼前一天准备好我自己和我的骑行设备。我确实喜欢出去,但是我不喜欢下雨和寒冷的天气。此外,我想找到最适合我锻炼的骑行方式。

这个选择也影响了我的锻炼距离和时间。由于这是一个分类问题,我决定选择Logistic Regression来预测乘坐类型。

设置训练数据:

2.距离预测

每周,我都会设定我想要完成的每周距离目标。这个决定也受到外部因素的影响,比如“一天中的什么时候?”,“天气怎么样?”,“外面热还是外面冷?”,“风大吗?”、“是周末还是工作日?”

考虑到这些因素,我想预测一下我的预期骑行距离。这是一个Regression问题,我决定选择Linear Regression进行距离预测。

对于这两种模型(预测距离乘坐类型,以下是我决定在我的模型中使用的工程特性:

*['hour','dayOfWeek','isWeekend','temp','wind','weather']*

虽然我已经决定选择Logistic Regression作为乘坐类型,选择Linear Regression作为距离,但可能会有更精确的模型。开发这些模型的过程是迭代的,通常需要更多的游乐设备数据,所以这只是第一步。

有个好看的机器学习算法小抄。您可以了解更多关于 ML 算法及其应用的信息。

模特培训

对于锻炼预测,机器学习模型训练被添加到 7 — b 预测锻炼模型训练。ipynb Jupyter 笔记本。以下是训练模型的一些步骤:

首先,我用选定的特征(X)设置训练数据:

# select features as list of array
X = data[['hour','dayOfWeek','isWeekend','temp','wind','weather']]
X = X.to_numpy()

然后我创建训练数据的标签(Y):

# set Distance values
Y_distance = data['Distance']
Y_distance = Y_distance.to_numpy()
​
# set Ride Type Values
Y_rideType = data['rideType']
Y_rideType = Y_rideType.to_numpy()
  1. 用于 RideType 预测的 Logistic 回归

对于逻辑回归,我提供所有数据用于训练,并拟合我的最终模型。该模型使用了以下特征['hour','dayOfWeek','isWeekend','temp','wind','weather']

训练数据特征:

  • hour -值在 0 - 23 之间
  • dayOfWeek -值在 0 - 6 之间
  • isWeekend -工作日 0,周末 1
  • temp -以摄氏度为单位的整数温度值
  • wind——以千米/小时为单位的整数风速值
  • weather -天气 API 提供的天气描述

训练预测值:

  • rideType -室外骑行 0,室内骑行 1
# import Logistic Regression from sci-kit learn
from sklearn.linear_model import LogisticRegression
​
# select training data and fit final model
model_lr = LogisticRegression(random_state=0).fit(X, Y_rideType)
​
# test prediction with a clear sunny Sunday weather data
result_ridetype = model_lr.predict([[8,6,1,20,3,0]])
print("Result type prediction=%s" % result_ridetype)
​
# test prediction with a cold Sunday weather data
result_ridetype = model_lr.predict([[8,6,1,10,12,1]])
print("Result type prediction=%s" % result_ridetype)

2。距离预测的线性回归

对于预测模型,我总共有 168 个锻炼数据,我想将它们全部用作训练数据。

训练数据特征:

  • hour-0-23 之间的值
  • dayOfWeek-0-6 之间的值
  • isWeekend -工作日 0,周末 1
  • temp -以摄氏度为单位的整数温度值
  • wind——以千米/小时为单位的整数风速值
  • weather -天气 API 提供的天气描述

训练预测值:

  • distance -以公里为单位的距离值。
# import Linear Regression from sci-kit learn
from sklearn.linear_model import LinearRegression
from sklearn.utils import shuffle# select training data and fit final model
model = LinearRegression()
model.fit(X, Y_distance)# test prediction with a cold Monday weather data
result_distance = model.predict([[8,0,0,10,15,0]])
print("Result distance prediction=%s" % result_distance)# test prediction with a sunny Sunday weather data
result_distance = model.predict([[6,6,1,26,3,1]])
print("Result distance prediction=%s" % result_distance)

3。将模型导出为 pickle 文件

在这个阶段,经过训练的模型被导出为 pickle 文件,以便通过 web API 使用。web API 使用来自天气 API 的数据,收集必要的数据特征进行预测,并将预测结果输出给用户。

# import pickle library
import pickle
​
# save distance model file in the model folder for prediction
distance_model_file = "../web/model/distance_model.pkl"
with open(distance_model_file, 'wb') as file:
 pickle.dump(model, file)
​
# save ride type model file in the model folder for prediction
ridetype_model_file = "../web/model/ridetype_model.pkl"
with open(ridetype_model_file, 'wb') as file:
 pickle.dump(clf, file)

解决办法

这是一个端到端的解决方案,使用 Strava 锻炼数据导出作为输入。Strava 包含室内和室外健身骑行数据。为了分析数据,Jupyter 笔记本用于Data CleaningData Pre-ProcessingModel Training和`模型导出。对于机器学习模型训练和预测,使用 scikit-learn Python 包。预测模型由 scikit-learn 导出,用于预测我的骑行类型和锻炼距离。

该模型作为 pickle 文件通过 FastAPI 应用程序托管,该应用程序提供了一个 API 来传递参数,并使用第三方天气 API 预测天气信息。模型使用这些值进行预测。

作为一个用户界面,我使用微软 Bot 框架创建了一个对话式 AI 项目,与 Fast API 进行通信。我选择微软团队作为画布,因为这是我经常用来交流的平台。

有了这个解决方案,我现在可以选择我的城市、锻炼日期和时间,我得到了一个提供distanceride type值的预测。

体系结构

建筑,作者的图像

文件夹结构:

  • bot - Bot 应用程序检索预测模型
  • data -数据文件夹包含 Strava 输出
  • notebooks-分析所有数据的所有笔记本
  • web -预测模型的 FastAPI
  • model -包含预测模型
  • app.py -用于预测模型的 FastAPI web 应用
  • myconfig.py -环境变量
  • utils.py -常用实用功能

运行项目

在这个示例中,使用 Python 3.8.7 版本来运行项目。

  1. 创建虚拟环境
python -m venv .venv

2.激活您的 Mac 虚拟环境:

source ./venv/bin/activate

3.安装依赖项

pip install -r notebooks/requirements.txt

4.从您的个人资料中导出您的 Strava 数据

5.创建一个Data文件夹,并将您的 Strava 数据导出到该文件夹中。

6.在本地运行Jupyter Notebook

jupyter notebook

天气 API

无法获得天气数据来将与我的锻炼相关联,所以我使用天气 API 来提取我现有锻炼日的天气信息。我已经使用了 WorldWeatherOnline API 来获取我所在地点的最新天气预报。这个 API 还提供了提前 14 天的天气预报,每小时的天气预报和天气警告,所以这对我的预测 API 也很有帮助。

python FastAPI API 的 Web 应用程序

运行 Python FastAPI 以便在本地机器上运行

cd webpython app.py

测试终点

发布 Web 应用程序

将 Python FastAPI 发布到 Azure Web App 服务

cd web
az webapp up --sku B1 --name data-driven-cycling

在 Azure 门户上更新启动命令,设置>配置>常规设置>启动命令

gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

要重新部署和更新现有应用程序:

az webapp up

在本地测试 Bot 应用程序

先决条件:

cd bot
dotnet run

或者来自 Visual Studio

  • 启动 Visual Studio
  • 文件->打开->项目/解决方案
  • 导航到bot文件夹
  • 选择CyclingPrediction.csproj文件
  • Bots/Cycling.cs更新你的 api url
  • 如果您想使用本地 Web API 进行测试,请更改您的本地端点,例如:
string RequestURI = String.Format("[http://127.0.0.1:8000/predict?city={0}&date={1}&time={2](http://127.0.0.1:8000/predict?city={0}&date={1}&time={2)}",wCity,wDate,wTime);
  • 如果您将使用 Azure Web API 进行测试,请更改您的 Azure 端点,例如:
string RequestURI = String.Format("[https://yourwebsite.azurewebsites.net/predict?city={0}&date={1}&time={2](https://yourwebsite.azurewebsites.net/predict?city={0}&date={1}&time={2)}",wCity,wDate,wTime);

用于测试的模拟器上的机器人,图片由作者提供

之后,你的机器人就可以进行交互了。

微软团队中的机器人

发布 bot 后,您可以连接不同的对话用户界面。我已经连接了微软团队,并命名为Data Driven Cycling Bot

一旦您发送第一条信息,它就发送一张卡来选择CityDateTime信息,以预测健身骑行类型和最小距离。

微软团队中的机器人,图片由作者提供

结论

这是一次从我现有的数据中发现见解的个人旅程,然后变成了一个数字私人教练。

对于接下来我想重点介绍步骤,

  • 设定每周目标,并根据我的目标预测本周的锻炼计划。
  • 比较游乐设备指标,查看随时间推移的改进情况。
  • 支持美国指标(现在仅支持 km)

代码可在
https://github . com/ikivanc/Data-Driven-Cycling-and-Workout-Prediction获得

期待听到新的想法和开放的贡献。

谢了。

数据驱动的足球运动员技能评估

原文:https://towardsdatascience.com/data-driven-evaluation-of-football-players-skills-c1df36d61a4e?source=collection_archive---------11-----------------------

实践教程

这提供了一个通用的方法来衡量任何足球运动员的控球技术水平,并对射门技术进行了样本分析。

Wix.com 大学的数据科学家 Ofir Magdaci

作者图片。

先验知识

为了真正掌握要介绍的所有概念,强烈建议您熟悉 StatsBomb xG 指标。这篇伟大的 fbref.com 文章可以提供你需要的所有信息。

激励和总结

在最后两篇文章中,我既介绍了解释了两个主要模型,这两个模型让我们能够用数学方法来表示足球的语言: Action2VecPlayer2Vec 。我们研究了它们的含义、语义和动力学。我们的结论是,这些模型描述的是玩家做什么,而不是他们做得有多好。显然,玩家的技能水平在我们的建模中是一个缺失的元素,这就是这篇文章所要讲的。

足球涉及多种技巧。一些是有球技能,如传球和运球,而另一些是无球技能,如移动到死区或盯人。第二类通常更具挑战性,通常需要更丰富的数据。到目前为止,持球技能是最普遍和最被考虑的。

足球分析行业的兴起导致了无数种测量、比较和可视化球员技能的方法。然而,由于球队的战术或比赛风格,许多方法是有偏见的,通常忽略了动作的变化。这些提高了对客观的、数据驱动的测量的需求,这将为玩家评估设定标准。

在这项工作中,我提出了一种技能评估方法,它与数据科学和机器学习中的现有方法不相上下。这种方法适用于任何技能,无论是有球还是无球,只要有合适的数据。这里我就为 拍摄分析演示一下这个机制。

数据集

与之前的作品一样,本作品的数据基于 Statsbomb 开放数据集。文档可以在数据集的 Github 库站点上获得。

缩小技能水平差距

什么是技能

技能的构成可能比你想象的更难定义。字典暗示“… 执行某个动作的能力”。然而,举例来说,射击是一项复杂的任务,有许多变化和困难。此外,可以用不同的技术、角度、范围等进行拍摄。但最终,它仍然是推测性的——即使是一个顶级得分手也可能在任何一天错过一个好机会。

想想像跳高这样的运动项目。挑战明显不那么复杂——障碍越高,越难克服——然而,对于一个固定的障碍高度,结果总是一个概率事件。

因此,一项技能更好的定义可能是 在特定难度下完成特定任务的可能性 。我们可以用一个概率分布来描述一个玩家完成动作的技能“ ”一个 ”,其中 l 是难度级别。鉴于任务的难度,成功的可能性是未知的,Sₐ(L=l)。

如何衡量技能分布?

要凭经验估计一个玩家的投篮技术的分布,需要两件事:对于各种条件的**(等于 1 —难度)结果 。对于拍摄,对应的是拍摄的 xG 值及其结果。

估计每一枪的概率不是一件小事。幸运的是,Statsbomb 好心地将 https://statsbomb.com/2020/07/statsbomb-release-expected-goals-with-shot-impact-height/ 他们的 xG 度量添加到数据集中,这给了我们从枪击事件中得分的概率。因此,得分的概率越高,击球难度等级就越低。

注意:我必须澄清,xG 模型,或者我将讨论的任何其他概率模型,旨在预测击球的预期 结果。因此,这种模型忽略了个人数据(例如,球员的弱脚质量)。它是关于估计每一次击球的“净值”,而不是它的确切结果。

图 1:数据集中所有镜头的 xG 分布。除了惩罚的 xG 值(在 0.75-0.8 之间)之外,分布是高度偏斜的。

一旦我们估计了技能分布,Sₐ(L),我们就可以计算一些指标。

升力的概念

**提升的概念在数据科学界被广泛使用。它通过将两者相除来比较指标和基线。该比率表明计算值比基线高出多少。

xG 提升 AUC:从分配到 KPI

要生成一个数字作为 KPI(关键绩效指标),我们可以计算技能分布 AUC (曲线下的面积)。尽管如此,我发现使用比率,即 AUC 和预期得分 AUC(等于 0.5)之间的 lift、来指示球员比预期好多少,更能提供信息和交流。

图 2:xG 分布图对比。xG 转换被描述为一种分布,其中虚线表示作为基线的预期性能。“提升”指数衡量的是每个球员比他们的预期表现好多少。xG AUC 将分布缩小为单个标量,作为 KPI 使用。

图 2 显示了几个玩家的 xG 分布,与根据 StatsBomb 的 xG 指标的预期性能进行了对比。

当描述为分布时,我们可以更清楚地看到更大的画面。我们可以观察并注意到水平上的表现差异,检测心理信号,如错过重大机会(如路易斯·苏亚雷斯),并更好地理解球员之间的权衡。不出所料,梅西在任何给定的难度下都超过了基准,总体上实现了 1.15 的 xG Lift AUC。

不同拍摄类型的 xG 提升

这个 KPI 集合显示了与由 StatsBomb 的 xG 度量估计的预期性能相比,玩家在执行特定击球类型 时有多好。它的计算非常简单:

公式 1:xG 提升指数,表示对于任何给定的射门(例如,任意球、远射等),球员的表现超出预期的程度。)

电梯的利与弊

使用这种方法有两个主要挑战。首先,估计行动的难度通常需要非常丰富的数据,如 Statsbomb 360StatsPerform 跟踪数据。其次,计算概率是不容易的,有时也是不清楚的。例如,如何估计运球的难度?对一个对手有效的方法对另一个拥有高超拦截技术的对手可能完全无效。

为了弥补这些障碍,该指标提供了大量优势:

它简单且易于实施。

它与数据科学中的现有衡量标准——Lifts 和 AUC 相当。

直观的底线:球员比预期好多少。

它很健壮,可以应用于任何运动和技能。

但也许最大的附加值是能够只分别评估不同类型的镜头。比如我们可以只在远射、任意球、或者一对一上计算 xG 升力。正如你可能已经知道的,我很少在没有亲自执行的情况下提出想法…

可视化技能水平

图 3 显示了根据 StatsBomb 公开数据集估算的小内马尔技能雷达图。这些值是提升百分位数,考虑到数据集中所有合格的玩家——那些至少有 30 次击球的玩家。

这给了我们一个清晰、一致、标准化和规范化的尺度。或者,当所有类别都用升程衡量时,也可以使用原始升程值。

相似的类别尽可能放在一起,以避免排序偏差。玩家射击技能被分成不同的子类别和上下文。这些上下文可以应用于性能评估、玩家搜索或开发。通常情况下,球员们在与其他人斗争的同时,在某些射门类型上表现出色,当然,除非你的名字是利奥·梅西(图 4)。

图 3——不同基线下的内马尔互动技能雷达图。此分析的合格玩家至少有 30 个镜头,每个镜头类型有 10 个实例。如果玩家对一种类型的投篮次数少于 10 次,但总的投篮次数多于 30 次,那么他得到的 Lift=1,这表明他的表现符合预期,不会影响结果。

仔细看,xG 升力图类似于雷达图。事实上,它是雷达图的缩小,其中轴折叠成单个射击指数。高 xG 值当然包含子技能,比如一对一的收尾,点球,还有部分头球。然而,低 xG 值主要包括远射和任意球。然而,在这两种情况下,总音量越高,记录的技能水平越高。这是如何正确排序类别的另一个提示。

当然,这种技术既有好消息也有坏消息……好消息是我们可以将这种方法应用到任何我们可以测量的技能上,比如运球和传球!然而,这也包括坏消息,因为我们无法使用事件数据来衡量其他一些技能(例如死区覆盖或标记)。

图 4——里奥·梅西的技能雷达图,大部分技能都很出色。他的头球升力相对较低,因为它低于 1,而许多球员得到了默认值 1。其次,梅西是目前数据集中射门次数最多的球员,而大多数球员的射门次数都很少,这造成了明显的统计偏差(见下一部分)。

寻址数据偏差

Statsbomb 开放数据集本质上是二十年来数千个匹配样本的拼贴。这些比赛起源于许多比赛,各大洲,男女都有。更重要的是,它是而不是 随机收集的(参见:文档)。因此,数据非常稀疏,有偏见,并且往往集中在顶级球队和联赛,而不是足球运动员和比赛的真实分布。

因此,每个球员的投篮分布是如此的倾斜,以至于我不能很好的画出来。我宁愿用数字展示给你看:

*Mean shots per player: 5.2, STD: 46.4.
  ╔════════════╦══════════════╗
  ║ Percentile ║    #Shots    ║
  ╠════════════╬══════════════╣
  ║    25%     ║        0     ║
  ║    50%     ║        1     ║
  ║    75%     ║        1     ║
  ║    90%     ║        8     ║
  ║    95%     ║       14     ║
  ║    99%     ║       56     ║
  ║    Max     ║    2,190     ║ Messi
  ╚════════════╩══════════════╝*

由于数据集是而不是随机的,大多数玩家很少被评估击球。为了解决这个问题,我过滤掉了所有出手次数少于 30 次的玩家——然而有些托举还是太激进了(图 5)。对于拥有数百次投篮机会的球员,我们确实得到了准确、真实的数字。**

图 5:数据集中合格玩家的投篮命中率分布。符合条件的玩家至少有 30 发。

如何正确使用雷达图的 5 个技巧! ✍

雷达图可能是足球分析社区中最受欢迎的图表,因为他们可以在同一张画布上以非常直观的方式展示许多技能。不幸的是,它也有许多可能的故障点——这可能使它成为所有图表中被误用最多的图表。

以下是帮助您创建完美雷达图的方法:

1。观察你的变量的顺序:雷达图逻辑很简单——多边形的体积越大,玩家在所列技能中表现越好。通过连接相邻的点来创建体积。因此,交换图表中两种技能的位置可能会产生戏剧性的效果:

图 6:两张相同球员数据的雷达图,但类别排序不同。在右边,相邻的技能是相关的,因此排序正确。在左边,语义排序缺失,使我们无法理解每一个玩家是什么类型的。

2。避免使用依赖战术的类别——这可能是最大也是最常见的错误。在一场比赛中,计算成功运球/铲球的次数是没有意义的。这些措施在很大程度上取决于球队的质量、比赛风格或者教练的指示。相反,使用诸如“成功的一对一防守行动的百分比”这样的指标。

3。使用相对数字 —所有值都应该与有意义的基准相关。例如,我们可以用百分位数来代替显示一场比赛中一名球员运球获胜的百分比。

4。保持你的 刻度固定——比如当使用提升或百分位数时。当每个维度尺度不同时,我们可能会通过制作有偏见的图表来误导读者。

5。添加基线 —例如,相同位置球员的平均表现——这对于数据集中其他球员的全球可比性至关重要。在尺度不一致的情况下更是至关重要。

可能的附加分析

这些分析需要更大、更平衡的数据集。然而, Football2Vec 库也包含了他们的代码供你探索:

  • 比较不同维度的 xG 提升曲线— 这种分析可能揭示一些关于不同比赛位置、年龄和比赛的技能水平变化的见解。
  • 比较训练托举和比赛托举 —这可能是影响球员表现的心理或战术效果的指标。

用令人惊叹的用户界面将这一切包装起来

是时候让所有的东西都聚集在一个漂亮的流线型用户界面上了。这个超级易于使用的 Python 包已经成为我最喜欢的与我的工作进行交互的包,并使它对其他人很友好。为此,我构建了一个简单的玩家控制面板,具有以下特性:

1.情报室

信息区包含:(a)团队和球员选择的滑动条;(b)玩家图像,以及(c)元数据。图片作者。

2.玩家技能分析部分

“分析”参数控制面板。图片作者。

技能部分包含两个子部分:(1)带基线的技能雷达图。(2)徽章-对于提升值大于阈值[=1.1]的玩家,每种击球类型都有一个唯一的图标。图片作者。

3.玩家进化区(可折叠)

分析球员的技术和赛季表现。包含两个剧情动画图表:

各赛季玩家技能雷达图动画(plot . py****>【玩家 _ 进化】),集成控件。图片作者。

各季动画动作热图(见plot . py>)带集成控件。它描述了一年中动作的频率和位置。图片作者。

4.xG 评估(可折叠)

xG 评估部分提供了两个图表:(1)击球转换率分布图(顶部)——绘制了如图 2 所示的单人游戏的 xG 转换率分布图(2)xG Lift by body part——分析选手的头部和腿部表现。图片作者。

5.播放器 2Vec 嵌入部分

播放器 2Vec 部分呈现(1)播放器 2Vec ( UMAP )嵌入图,以及通过余弦相似性以及欧几里德距离与所选播放器最相似的播放器。

所有代码都可以通过 Football2Vec Python 开源库获得。

摘要

在这篇文章中,我们揭开了技能评估的世界。从零开始,我们首先定义了什么是技能,我们如何从数学上形式化它,以及我们如何从经验上衡量它;我们了解了用于评估不同类型拍摄的升力(公式 1) xG 升力xG 升力 AUC — 的概念。

然后,我们将重点转移到如何正确地可视化技能,并强调重要的最佳实践;借助 Streamlit 的强大功能,我们能够将复杂的模型和统计数据转化为易于理解的交互式漂亮用户界面。

在这三篇文章中,我们经历了一个端到端的数据科学之旅,以创建足球语言的整体表示。我们的目标尚未实现,但在实现目标的持续探索中,我们刚刚成功抵达大本营。

下一步是什么?

现在我们的方法涵盖了玩家做了什么,以及他做得有多好(至少他射得有多好)。剩下的工作就是找到一个有足够数据量的下游任务来学习。当然,额外的技能可以根据需要进行建模。

我希望你觉得这三部曲读起来有趣。感谢所有的反馈,这真的很有趣!

游戏,设置和匹配。

数据驱动并没有消亡

原文:https://towardsdatascience.com/data-driven-isnt-dead-3230378e4c7a?source=collection_archive---------23-----------------------

行业笔记商业科学

问题不在于术语;而是我们不是真心的

资料来源:皮奥特·科诺乌,数据

每隔几年,数据科学和技术术语就会出现在商业词典中,只是变得流行、被过度宣传,然后就不再流行了。机器学习、人工智能和许多其他技术都遵循这些模式。不幸的是,即使是最基本的想法也会成为这个循环的牺牲品。

最新的受害者:数据驱动。

数据驱动意味着什么?

马库斯·斯皮斯克Unsplash 上拍摄

难怪人们开始厌倦大数据和术语“数据驱动”。如今,几乎每个公司都声称拥有数据驱动的衣钵。

不是无缘无故的。数据已经成为任何市场成功的关键。甚至你的本地街角熟食店也可能在利用数据做出一些商业决策。这一现实导致了意料之中的反弹。当然,并非所有所谓的数据驱动型企业都以同样的方式使用数据。

那么,数据驱动意味着什么呢?其核心是,数据驱动型公司利用他们的数据做出更好的决策,创造更佳的结果。他们从公司每天收集的大量数据中发现模式和见解,以便更有效地实现业务目标并提高 KPI。

简而言之,数据驱动型公司利用他们的数据来推动最佳结果。

一家熟食店看着某一特定专业的大量订单,决定把它作为一个常规的菜单项目,可能无法完成复杂的分析。尽管如此,如果这个决定增加了收入或者让更多的人进来,他们可能会满足“数据驱动”的最低门槛。

当然,将一次性决定等同于文化转变仍然有些牵强。真正的数据驱动型公司不会只是偶尔利用他们的数据。他们围绕决策改变了整个公司文化,通过有效利用数据来改善决策。许多公司将两者混为一谈,这无疑损害了“数据驱动”的声誉。

数据驱动危险吗?

万花筒Unsplash 上拍摄的照片

但是这个术语的过度应用并不足以成为抛弃数据驱动的理由。数据驱动的决策仍然是一个关键的竞争优势。

不幸的是,许多人不同意——一些最响亮的声音呼吁我们从我们的词汇中消除数据驱动:数据科学家。

我从数据科学社区的人那里听到了关于为什么数据驱动不再是正确目标的各种争论。有人说,最好是简单的“了解数据的”、“了解数据的”或“了解数据的”:我们的勇气,被做出非常糟糕的决定的数据所检验,应该推动结果。我甚至看到有人提出,数据驱动的决策是危险的,好像人类可能会失去对数据的控制。虽然大数据有其局限性,但分析中的大多数危险和偏见最终来自我们,而不是数据。

“数据驱动”公司的真正问题是

克里斯·利维拉尼在 Unsplash 上拍摄的照片

然而,一些反对“数据驱动”的数据科学家确实有一个令人信服的观点。数据驱动往往是不准确的。当你考虑大多数公司如何使用数据时,很难说它真的被用来推动最佳决策。

太多时候,先做一个预测,然后根据这些假设做出决定,以应对现实。例如,一位商店经理查看需求预测,预测他的商店下周将销售 10 件蓝色男士衬衫,他将订购 10 件蓝色男士衬衫来满足该需求。很少考虑销售这 10 件蓝色球衣是否是实现收入或利润目标的最佳方式。数据推动决策,但在整体业务目标的背景下,也许是错误的决策。

预测分析中的这一缺陷通常被标记为数据驱动的决策中的固有缺陷。因为预测只能告诉你可能会发生什么(假设没有危机发生),而不能告诉你在任何情况下如何实现给定的目标,所以数据驱动的思维模式通常被认为是小于。

这没有认识到真正的问题:一个预测性的,而不是指令性的方法。

我们如何用数据驱动结果?

真正的数据驱动型决策利用数据来推动成果:它使用数据向您展示实现业务目标的最佳途径。当我听到一位数据科学家说,基于数据的决策比数据驱动的决策更好时,我只能假设他们使用预测分析来解释这些数据。如果是这样,他们是对的。

在其核心,预测分析是最有用的决策支持工具。他们的存在是为了给你提供信息,给你决策的背景。当你使用它们时,它必须是一种基于数据的方法,因为否则你会冒着朝着错误的目标优化的风险。这是一个随着时间推移而加剧的错误,因为一个优秀的数据科学家会随着时间的推移改进算法,越来越高效地实现次优结果!

图片来源: Evo 定价 (CC 带归属)

为了实现数据驱动,您必须进行优化以获得最佳结果。这必然需要一种规定性的方法。在这种情况下,您可以定义最适合您公司的目标,然后利用这些数据帮助您实现目标,不管在此过程中会出现什么样的危机和挑战。这是用数据推动结果并最终实现数据驱动思维的唯一途径。

让数据驱动再次变得有意义

一旦你揭示了数据驱动的辩论背后隐藏的问题,很明显,人们并不喜欢这个词;他们对数据处理方法的局限性深感沮丧。幸运的是,这有一个简单的解决方案。

正确的分析——规范的分析——使得利用数据做出有意义的决策成为可能。

通过这种方式,很明显默认回到基于数据的(或者更糟,仅仅是基于数据的)决策是有局限性的。随着您更有效地利用您的数据,影响会越来越大。组织必须采取更难但最终更好的分析方法:指令性。

图片来源: Evo 定价 (CC 带归属)

数据驱动、规范的业务和项目是为成功而设立的。因此,不要因为简单地回到数据信息似乎就足够的时代,就低估了数据的价值。通过正确的分析,您可以有意义地转型为数据驱动型公司。希望,如果我们这样做了,人们会像我现在一样再次喜欢上“数据驱动”这个术语。

PS 更多商业科学来自我的写作:

[## 如何(不)在数据科学项目中失败

towardsdatascience.com](/how-not-to-fail-at-your-data-science-project-7e8c84305aa8)

Monthly Business Science in your inbox, new software, and University-level learning:[**Free access**](https://evouser.com/register)Questions? Please reach out on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)

数据驱动的多点触控属性揭秘

原文:https://towardsdatascience.com/data-driven-multi-touch-attribution-demystified-3eb3486476c6?source=collection_archive---------21-----------------------

度量和测量

马尔可夫归因模型入门

有效运营企业的最宝贵信息之一是了解某项业务活动直接产生的收入。

知道哪些努力得到了回报可以让你加倍努力并扩大规模,而了解时间和金钱被浪费在哪里可以让你通过少做多做

这就是归属的问题。

营销人员正面处理这个问题,因为他们必须在多个影响渠道上花费有限的资源。潜在客户在他们的客户之旅中与企业有许多接触点。他们必须不断地问这个问题:

哪个活动/渠道真正赚钱?

这不仅仅是营销问题。你的企业和顾客之间的每一次互动都有助于购买体验,因此,拥有一部分归因难题。

归因不是纯粹的理论练习。它直接关系到你如何有效地利用资源来实现业务增长。使用复杂归因模型将支出与收入对应起来的组织,其收入增长 20%或以上的可能性是 T10 的两倍。

这篇文章将探讨传统上如何处理多触点归因,以及如何通过一点数据魔法来改进你的归因模型。

在整篇文章中,我将使用“接触点”这个词,因为这是一个非常通用的模型,但是请随意将它直接翻译到您自己的领域中。它同样适用于特定的活动、营销渠道、销售行为,甚至是在数字产品中与客户的互动。

传统多点触摸属性

你会如何运用常识为特定客户购买的每个接触点分配信用?

根据您的观点,您可能会对客户旅程中的每次体验的影响应用不同的启发法:

第一次接触
100%的荣誉归于第一次接触点,因为他们将客户带入了我们的世界。

最后一次接触
100%的信用分配给最后一次接触点,因为它让客户迈出了最后一步。

时间衰减
最近的接触点会获得更多的信任,因为最近的接触点可能会对领先优势起到更多的“预热”作用。

线性
为什么我们不能都成为朋友?只要你参与了转化之路,所有人都有同等的荣誉!

第一次接触和最后一次接触思维之间显然存在一种平衡。让我们给第一次和最后一次触摸各 40%的信任,其余的平均分配。

自定义
每个频道都是独一无二的,所以我要根据我认为的重要程度给每个频道加上权重。

使用传统多触点归因试探法分配的点数| 作者图片

所有这些试探法有什么共同点?

嗯… 我们编造了它们,这至少会让你感到一点点不舒服。事实上,这种观点得到了近 78%的营销人员的认同,他们不确定自己是否使用了正确的归因模式。

你还必须注意,这些也可能被扭曲,以服务于一个人的激励。例如,如果我有一个潜在客户生成业务,我只是在一个客户的网站上投放广告,那么通过第一接触模式获得 100%的信用并获得相应的报酬对我来说是最有利的💰。

我说“传统方法”,但这是一个误称,因为不幸的是,这是行业的现状。超过 90%的组织没有利用数据为他们的归因模型提供信息,其中大约 1/3 的组织甚至没有尝试跟踪支出到收入。

除了猜测这个核心业务问题,我们还能做得更好吗?

数据驱动的归因方法

我们可以让数据说话,而不是自己制定规则。

有各种类型的模型可供我们使用来解决这类问题。围绕这一主题的大量文献往往集中在 3 种主要方法上。

  1. 幸存
  2. 沙普利
  3. 马尔可夫

生存模型将生物统计学中的“某些治疗对死亡时间的影响”问题转化为“某些接触点对转化时间的影响”生存模型的设置需要几个定义,并且超出了本文的范围。

Shapley 模型来自博弈论的世界,它提供了一种公平的方式,根据参与者的贡献程度在他们之间分配收益。每个接触点都可以被视为游戏中的参与者,回报可以建模为所有客户的总购买价值。

使用匀称的价值观进行归因是一种聪明而直观的方法,具有许多有用的特性。尽管如此,计算所需的计算能力随着接触点类型的数量呈指数增长,这使得它对许多拥有复杂客户旅程的公司来说没有吸引力。值得注意的是,有效地用逼近沙普利值的算法确实存在。

最后一个模型是马尔可夫模型,它直观,抗噪声,伸缩性很好,所以这是我们今天要关注的。

无论您想使用哪种模式,您都需要首先对您的业务进行调整,以捕捉潜在客户接触点事件。这可以是作为 Salesforce 中的任务跟踪销售活动,通过自动化软件的营销活动,或定制的数据收集策略(实习生?🤨 ).

简单马尔可夫归因

一旦你的数据准备就绪,你就可以按照客户与你的业务互动的顺序,开始建立对客户旅程的理解。仅仅通过计算从一次互动到另一次互动的顾客数量,你就可以得到每个接触点的转移概率

所有可能转换路径的转换图|图片作者

现在我们知道了转移概率,我们可以通过所有可能的转化途径遵循概率链来估计给定数量的潜在客户的转化数量(就像一个漏斗)。**

例如,如果我有 100 个潜在客户,我可以计算转换数量为:

***# Conversions =** 100 ⨉ 30% Website ⨉ 30% Converted +
  100 ⨉ 30% Website ⨉ 40% Facebook ⨉ 35% Converted +
  100 ⨉ 70% Google Ads ⨉ 8% Website ⨉ 30% Converted +
  100 ⨉ 70% Google Ads ⨉ 8% Website ⨉ 40% Facebook ⨉ 35% Converted = 15.664 Conversions*

如你所见,我们只是简单地添加了多个漏斗的效果。唯一转换路径的转换次数是相加的,因此每个路径贡献的转换率也是相加的。

每个转换路径对整体转换的部分贡献

我们有每个路径对我们整体转换率的贡献,但是我们仍然需要计算每个接触点的贡献。要做到这一点,我们可以问,“如果我只移除一个接触点,我的总体转换率会怎么样?”**

例如,我们可以通过有效地将所有离开该节点的流量发送到一个黑洞来删除谷歌广告,并使用我们剩余的转化路径来计算我们的转化率。

假设从我们的客户旅程中删除谷歌广告| 作者图片

这种假设的去除产生的总转化率为 0.132

*Overall Conversion Rate **without** Google Ads =
  Conversion Rate of (**Start** > Website >**Converted**) +
  Conversion Rate of (**Start** > Website > Facebook >**Converted)**= 0.09 + 0.042
**= 0.132***

如果我们没有谷歌广告的转化率是 13.2% ,这意味着谷歌广告一定只为我们之前的整体转化率 15.6% 贡献了 2.4%

这只占总转化率的 0.024 / 0.156 = 15.38%

这个 15.38% 的值被称为谷歌广告接触点的移除效应,是计算每个节点整体属性权重的关键数字。

计算去除效果的公式可总结如下:

  • Rx =接触点 x 的移除效果
  • Cw =总转换率接触点 x
  • Cr =移除接触点 x 后的图形转换率

Rx=(Cw Cr)/Cw = 1(Cr/Cw)**

能不能用这个去除效果作为每个触点的权重就完事了?

不完全是。但是我们很亲密。

为了理解为什么我们可以看到如果我们删除网站会发生什么,并计算其删除效果。

假设将网站从我们的客户旅程中移除| 图片作者

每条路径都经过网站,所以删除效果当然会是 100% 。如果我们给网站一个 100% 的属性权重,其他接触点还有什么属性?

这就是为什么不直接使用移除效果,我们可以通过确定特定触摸点在所有移除效果的总和中所占的比例( RSum )来使用归一化移除效果。

每个触摸点的去除效果的属性权重

现在我们有重量了!我们可以通过简单地将每个接触点的归属权重乘以总转换美元金额 V 来计算我们的归属值 A 。这通常是购买金额的总和,但是如果您想了解全部情况,我强烈建议您使用客户终身价值。

A = V ⨉ ( Rx / Rsum )

例如,假设我们的客户总共花费了 100,000 美元,谷歌广告的归属价值将是 100,000 美元⨉0.1066 = 10,660 美元。如果你在谷歌广告上的营销支出少于这个数字,你就获得了正的投资回报。

马尔可夫归因假设

马尔可夫模型很方便,但是它做了一些你应该知道的假设。

第一个假设是移除一个特定的接触点不会导致客户使用转向其他渠道。这个假设在大多数时候都成立,但是你必须考虑你的业务会受到什么影响。

例如,如果你的客户通过谷歌搜索出现在你的脸书页面上,删除脸书可能会将流量转移到你的网站频道,因为它会出现在结果页面的上方。

的第二个假设是,从一个频道到下一个频道存在一些潜在的常数概率。实际上,不同的客户有不同的隐藏转移概率。分析你对所有顾客的归因效果,确实会给你“普通顾客”的归因权重

对不同的客户群重复这一练习并找出相似之处和不同之处可能是一个有用的实验。

有趣的是,您可以将这里使用的标准马尔可夫模型扩展为一个隐马尔可夫模型,以推断每个客户的隐藏状态(例如他们是处于“研究模式”还是“购买模式”)。

第三个假设是每个触摸点处的转移概率仅取决于先前的状态。我们知道这根本不是真的。客户的转化倾向肯定会受到客户旅程中接触点顺序的影响。

这就是为什么在实践中,你不仅要考虑先前的状态,还要考虑两个或更多先前的状态。这些叫做高阶马尔可夫模型。

高阶马尔可夫模型

对于二阶马尔可夫模型的情况,我们从观察单个接触点到成对地考虑它们。

2 nd 阶马尔可夫模型(仅显示转换路径)| 图片作者

一阶路径 A → B → C → D 变成了 AB → BC → CD 的二阶路径,每条高阶路径的转移概率都是沿着它所构建的低阶路径的转移概率的乘积。例如

即使我们考虑成对的接触点,我们仍然可以通过移除转移图中包含该接触点的所有节点来计算单个接触点的移除效果。**

例如,删除谷歌广告将导致下图:

用二阶马尔可夫模型去除效果| 图片作者

我们可以继续其他接触点。移除网站接触点会使所有节点失效,移除脸书会使底部节点失效。计算我们属性权重的数学方法和以前一样。

**来自第二和第二阶马尔可夫模型的去除效应和归因权重

值得注意的是,你通常不会在野外看到一阶马尔可夫模型用于多点触摸属性,因为我们确实关心对我们的触摸点有更长的“记忆”。

相反,你可能永远也不会遇到 4 阶或更高阶的马尔可夫模型,因为当你提高模型的阶次时,在某个点上你会得到递减的精度回报。

单触式转换路径

考虑下面的改装客户之旅。

包含单点触摸转换路径的转换图| 作者的图像

让我们计算这 3 个接触点的归因权重,但这一次,我们还将计算转化的数量。我们可以假设有 20 个客户进行了转换,并查看理想的多点触摸归因分裂与马尔可夫归因分裂相比如何。

单点触摸路径对马尔可夫归因的影响| 作者图片

注意到什么奇怪的事了吗?

对于脸书和网站来说,分享他们转化的部分功劳是有道理的,但是当与该渠道完全没有互动时,他们为什么要从谷歌广告转化中获得部分功劳呢?

这是使用规范化移除效果的注意事项。要在实际部署中解决这个问题,您可以从分析中移除单点接触路径,并对剩余的路径使用高阶马尔可夫模型。然后,您可以简单地添加单点触摸旅程的转换,因为它们的贡献是显而易见的,不需要建模。

现状核实

在这篇文章中,我们一直假设数据驱动的模型会比传统模型更好。虽然在大多数情况下这可能是真的,但我们能衡量他们到底有多好吗?就此而言,我们如何将一个多点触摸归因模型与另一个进行比较?

评估任何归因模型有效性的困难在于,归因权重的“基础事实”对我们来说是隐藏的,因此我们无法判断我们离现实有多远。

解决这个问题的一个有趣的方法是通过整合来自你的业务的数据和来自你的专家的领域知识来创建一个你的客户互动的模拟

通过仔细观察您的客户接触点,拟合数据的统计分布,并对变量之间的交互进行建模,您可以创建与生产数据非常相似的模拟数据。拼图的最后一块是模拟的归因权重,它可以来自您的专家,并将被用作您的归因模型的“目标”。

领域专家可能无法准确指出每个接触点的确切属性权重,但他们应该能够提供有效的 90%置信区间。假设每个场景中所有接触点的属性权重总和为 100%,您可以使用领域专家估计的属性权重分布作为蒙特卡洛模拟的输入,来计算每个属性模型的误差分布。

在这一点上,你可以把归因模型放在一起,看看哪一个更接近目标。你也可以测试许多“假设”案例,并在多个场景中对每个归因模型进行压力测试,以衡量它们如何适应你的业务特有的不同假设条件。这些模拟场景也为你调整归因模型提供了更快的反馈机制。

从这里去哪里

开始使用这个模型的最大障碍不是计算的复杂性;它为您的业务提供收集数据的工具,然后将所有数据集中在一个地方进行分析。只要有一点毅力,这个就能完成。

如果你从事市场营销,你很幸运,因为有像 BizibleAttributionRockerbox 这样的软件供应商可以帮助你连接到你的数据,并为你建立归因模型。

在某些情况下,现成的软件不够灵活,无法处理您的数据收集或建模需求。在这些情况下,你需要开始考虑推出自己的解决方案。

这里也不需要从头开始。像channel attribute这样的 Python 和 R 包只需几行代码就能适合你的模型。

归因建模是一个丰富而迷人的话题。在这篇文章中,我放大了马尔可夫模型,但是我恳求你看看 Shapley 方法,因为,尽管有计算上的挑战,它有许多令人满意的特性。

使用转换路径的自底向上建模也不是数据驱动属性的唯一方式。在某些情况下,衡量接触点可能非常困难,比如广告牌和广播广告。cookies 和数字拼接的不断变化的前景带来了一系列挑战。

营销组合建模这样的自上而下的方法提供了一种在处理汇总信息时计算属性的替代方法。这一系列模型是可解释的、可扩展的和优化友好的,但是可能需要一种实际操作的建模方法。

提到的大多数模型都提供了一种捕捉特定接触点和转换之间的相关性的方法,但是为了说明特定接触点导致了转换,您可以运行受控实验(A/B 测试)并计算该接触点的转换提升

由于在动态商业环境中运行多个实验的高成本和复杂性,这在实践中可能并不总是可行的。然而,除了受控实验之外,还有其他方法来确定因果关系,这些方法使用因果网络作为它们的基础。

正如您所看到的,这是一个热门话题,我们只是触及了表面,但开始学习使用这些数据驱动的多点归因方法中的任何一种,都有可能让您比使用传统方法的绝大多数竞争者拥有更大的竞争优势。

👏如果你喜欢这个话题,留下一些掌声来帮助其他人发现它。👏

想进一步讨论这个吗?在 Linkedin 上留言或联系我。

📕这篇文章最初发表在 Show Me The Data 博客上,在那里我讨论了更多关于数据驱动业务的话题。

简而言之,数据驱动的预测性维护

原文:https://towardsdatascience.com/data-driven-predictive-maintenance-in-a-nutshell-ccc65a13b998?source=collection_archive---------18-----------------------

基本概念和流行算法概述

布雷特·乔丹在 Unsplash 上的照片

对于像飞机、铁路、发电厂这样的复杂系统,维护是一个大问题,因为它确保系统在其生命周期内的可靠性和安全性。

通过利用先进的传感器功能、物联网技术和数据分析算法的力量,工业 4.0 时代的维护经历了从“被动”到“主动”的快速转变:不是只在故障已经发生时才执行维护,最先进的策略是主动预测系统降级并“及时”安排维护。这种新型维护被称为预测性维护 (PdM)。

实际上,PdM 通常是通过首先使用传感器持续监控系统的健康状态来实现的。随后,数据分析算法被用来根据最新的测量结果预测系统的剩余使用寿命。最后,相应地设计一个维护时间表来维护系统的原始预期功能。

PdM 的核心是预测技术,它能够在给定实时测量数据的情况下预测在役系统的退化趋势。这就是数据科学大放异彩的地方:机器学习模型通常用于识别系统当前健康状态的特征,并预测系统故障发生前的剩余时间。

在本帖中,让我们仔细看看执行预测任务时常用的数据驱动模型。这篇文章的结构如下:

  • 首先,为了做好准备,我们将简要回顾一下预测性维护的主要步骤。
  • 第二,我们将根据系统的特征将系统分为不同的类别,并且我们将针对每个系统类别讨论流行的机器学习模型。
  • 最后,我们将讨论交付可靠的预后分析所面临的挑战。

我们开始吧!

1.预测性维护的主要步骤

图 1 预测性维护的主要步骤。(图片由作者提供)

PdM 的主要步骤包括数据采集、诊断、预测和健康管理,如上图所示。

1.1 数据采集

数据采集步骤处理从传感器收集测量数据,并处理原始信号以提取可指示系统健康状态的有用特征。后一项任务通常被称为数据科学中的特征工程。

为了提取特征,信号处理技术通常用于将原始数据转换成不同域中的特征(例如,时间、频率、时间-频率)。由于 PdM 主要遇到非平稳信号,时频分析工具可以方便地提取用于诊断和预测目的的特征。在这一类别下,短时傅立叶变换、小波包分解、经验模式分解和希尔伯特-黄变换是最流行的方法。

特征提取之后的附加步骤是特征缩减。这是因为所提取的特征通常太多而无法在实践中利用。流行的降维方法,如主成分分析、核主成分分析、Isomap 等。通常用于消除冗余特征。

1.2 诊断

诊断步骤基于提取的特征值处理故障检测和故障模式识别。

故障诊断通常被公式化为一个分类问题。因此,流行的分类方法,如 k-最近邻、支持向量机、决策树、随机森林,被广泛用于预测给定特征值的系统健康状态标签。下面给出了应用决策树模型对系统故障模式进行分类的简单说明。

图 2 使用决策树进行故障诊断。(图片由作者提供)

1.3 预测

PdM 的下一步是预测。这里,目标是预测被监控系统的未来状态,并估计系统的剩余使用寿命(RUL),即,直到系统故障发生需要多长时间。

图 3 是预后分析的示意图。(图片由作者提供)

预测是推动智能 PdM 的关键技术。由于它预测系统不再执行其预期功能的时间,因此它为用户提供了在延长系统使用寿命的同时降低故障风险的机会。

自然,数据驱动的方法被大量研究以估计 RUL。因此,一系列机器学习策略被提出用于各种应用场合。在第三节中,我们将回顾一些常用的 RUL 预测方法。

1.4 健康管理

在检测到系统故障并估计出系统的剩余使用寿命之后,是时候根据所获得的结果采取一些行动了。

健康管理步骤的主要目标是以最佳方式管理维护和后勤支持,即实现增加的可用性、可靠性和安全性,以及降低的维护和后勤成本。健康管理通常被公式化为一个约束优化问题,其中采用全局优化算法来获得最佳的维护计划。

2.系统特征的分类

根据所考虑的系统类型,预测方法通常有所不同。因此,在讨论各个类别下的具体方法之前,先根据各种系统的特点对它们进行分类是一个好主意。

2.1 系统特征

一般来说,我们可以根据系统的状态是直接可观测的还是间接可观测的,以及其状态是被建模为离散过程还是连续过程来对系统进行分类。下面的决策树说明了这种分类方案。

图 4 预后方法的分类。(图片由作者提供)

2.2 直接或间接可观察?

第一个标准是系统状态的可观测性。

在某些情况下,监测数据可以直接描述系统的底层状态,如磨损和裂纹大小。对于这些情况,RUL 的估计可以有效地公式化为时间序列预测问题。

然而,在许多其他情况下,监测数据只能间接表明系统的基本状态,如旋转机械的振动和基于油的监测。在这些情况下,我们可以将预测问题设计为求解两个耦合方程:

图 5 我们可以把预测问题框架为求解两个耦合方程。这里,索引 k 表示时间标准。(图片由作者提供)

测量方程弥补了测量特征值和内部系统状态之间的差距。这里, h (。)表示测量模型, ν 表示测量噪声。

同时,我们用一个状态演化方程来描述系统的退化过程。在这里, f (。)表示退化模型, w 表示模型不确定性。引入这个不确定项是因为退化模型只能部分反映真实的物理过程。

2.3 离散或连续状态演化?

第二个标准是基于我们如何对系统的状态演化建模。

对于某些情况,我们假设系统在有限状态空间φ= { 0,1,…, N }上演化,其中 0 对应于完美健康状态, N 代表故障状态。这些离散状态可以基于实践中有意义的操作条件来导出,例如“良好”、“仅轻微缺陷”、“需要维护”,或者它们可以通过将无监督聚类技术应用于训练数据来导出。

对于其他情况,将系统演化建模为一个连续的过程可能更有意义。例如,通常作为锂离子电池健康指标的电池内阻在经历一系列充放电循环后会不断降低。

3.预测算法

在本节中,我们将讨论一些常用的用于预测目的的机器学习方法,即预测系统的剩余使用寿命(RUL)。我们根据上一节介绍的类别来组织我们的讨论。

3.1 马尔可夫模型

马尔可夫模型对于状态可以直接观察到并且以离散方式演化的系统是有用的。

一般来说,马尔可夫方法将系统退化建模为一个随机过程,该过程在一组有限的状态φ= { 0,1,…, N }之间跳跃。这里,0 对应于完美的健康状态, N 代表故障状态。状态序列构成了一个马尔可夫链

马尔可夫模型的主要假设是未来的系统状态只取决于当前的系统状态。这个性质也被称为马尔可夫性质

在马尔可夫链建模框架下,RUL 可以被定义为退化过程从当前状态第一次过渡到故障状态 N 所需的时间量。这也称为首次通过时间 (FPT)。

当然,为了使用马尔可夫方法计算 RUL,我们需要知道状态的数量和状态之间的转移概率矩阵,其中 Aᵢⱼ 表示从一个状态 ij 的转移概率。实际上,它们是从训练数据中估计出来的。为了确定状态的数量,通常采用一种 K 均值聚类算法。

3.2 时间序列预测

时间序列预测方法对于状态可以直接观察到并以连续方式演化的系统是有用的。在这些设置中,RUL 估计实质上是对测量的时间序列数据的估计,以达到预定的阈值。

有多种方法可以建立时间序列预测模型。例如,我们有指数平滑法,其基本形式是预测新的观测值,作为过去观测值的加权平均值,权重随时间呈指数递减。

此外,我们有 ARIMA 模型。这里,ARIMA 代表自回归综合移动平均线。ARIMA 结合了自回归模型和移动平均模型,自回归模型根据过去的观测值回归新的观测值,移动平均模型将误差项建模为同时发生和在过去不同时间发生的误差项的线性组合。最后,ARIMA 采用差分步骤(对应于模型的“综合”部分)来消除趋势的非平稳性。

除了经典的时间序列预测方法之外,我们还可以使用神经网络。近年来,递归神经网络,特别是长短期记忆(LSTM)模型,在预测方面越来越受欢迎。

3.3 隐马尔可夫模型

隐马尔可夫模型(HMM)对于那些状态只能被间接观察并且以离散方式演化的系统是有用的。

从概念上讲,HMM 由两个随机过程组成,一个是可观测过程 Y ₙ,其说明了从传感器测量中获得的观测值,另一个是系统退化过程 Z ₙ,其状态是不可观测的,并且根据有限状态空间上的马尔可夫链进行演化。

图 6 是隐马尔可夫模型的示意图。(图片由作者提供)

通常,条件概率 p(yₙ|zₙ=I)被用来描述这两个过程之间的关系。

基本的 HMM 只能处理离散的观测值,即可观测的过程 Y ₙ在有限的状态空间上演化。然而,在实践中,观测值 Y ₙ往往是连续的。在这些情况下,混合高斯隐马尔可夫模型 (MoG-HMM)通常被用来处理连续观测值。在那里,高斯分布的混合被用来近似 p 的概率密度(yₙ|zₙ=I)。

3.4 随机过滤方法

对于状态只能被间接观测且以连续方式演化的系统,随机滤波方法是预测 RUL 的好选择。

随机过滤方法来自一个更大的研究领域,称为数据同化。在那里,目标是通过吸收来自观察和模型预测的信息来估计系统状态的概率分布。

随着新的测量变得可用,随机滤波方法使用贝叶斯学习来迭代地更新系统状态和控制状态演变的参数。一旦状态和参数被估计,我们可以使用演化方程预测未来的系统状态。总体工作流程如下图所示。

图 7 使用随机滤波方法预测 RUL 的工作流程。(图片由作者提供)

对于测量方程,测量模型 h (。)通常是从训练数据导出的数据驱动模型。对于状态演化方程, f (。)可以从物理原理或监督学习方法中导出,这取决于物理退化知识和相关训练数据的可用性。

关于用于状态估计的随机滤波技术,最常用的方法是基于卡尔曼滤波器,其具有封闭形式的解并且评估非常快。但是,它只能处理线性的 f (。)带有高斯噪声项。为了克服这个限制,提出了更高级的变体,包括无迹卡尔曼滤波器、集合卡尔曼滤波器等。

最常用的滤波技术是粒子滤波,也称为顺序蒙特卡罗(SMC)方法。这种类型的过滤方法使用一组加权粒子(也称为样本)来表示系统状态和演化参数的概率分布。一旦有了新的观测数据,这些粒子的权重就会根据贝叶斯规则进行更新。由于其模拟性质,粒子滤波可以处理现实世界应用中的非线性和非高斯性。

4.预测面临的挑战

尽管预测算法发展迅速,但在现实中进行可靠的预测分析并不总是容易的。有许多挑战可能会阻碍我们实现这一目标:

  • 传感器可靠性和故障,因为传感器可能在恶劣的环境中工作;
  • 特征提取,因为分离与复杂系统退化过程相关的特征是一项重要的任务;
  • 数据可用性,采用机器学习技术进行预测通常需要大量的训练数据(尤其是运行至故障数据),由于时间和成本的原因,这些数据不容易从在役系统中获得。

除了上述问题,预测中遇到的不确定性构成了获得可靠的 RUL 估计的另一个主要挑战。

预测不确定性可能源于:

  • 输入数据:传感器数据可能包含大量噪音。此外,环境和操作负载条件也在不断变化。
  • 模型:由于训练数据有限,构建的数据驱动模型可能无法准确捕捉真实的系统退化过程,从而产生建模误差和不确定性。

由于这些不确定性会导致预测结果与实际情况的重大偏差,因此开发一个系统的不确定性管理框架对于交付有意义的 RUL 预测至关重要。要了解更多关于如何管理与基于模型的预测相关的不确定性,请查看我以前的文章:

* *

5.外卖食品

在本文中,我们讨论了预测性维护的基本概念,并介绍了一些最流行的估算系统剩余使用寿命的算法。此外,我们还讨论了在获得可靠的预后结果方面的一些挑战。

本文的主要收获包括:

  • 预测性维护(PdM)包括数据采集、诊断、预测和健康管理。
  • 预测是实现智能 PdM 的关键技术;
  • 预测的主要任务是预测系统的剩余使用寿命(RUL);
  • 根据被研究系统的特点(直接/间接可观测、离散/连续状态演化),通常采用马尔可夫模型、时间序列预测方法、隐马尔可夫方法和随机滤波方法来估计 RUL;
  • 由于传感器可靠性和故障、特征提取、数据可用性和预测不确定性方面存在挑战,因此不容易进行可靠的预测分析。

参考

[1] N. H. Kim,2017,工程系统的预测与健康管理
[2] L .廖,F. Kottig,2014,工程系统剩余使用寿命预测的混合预测方法综述,以及在电池寿命预测中的应用IEEE 可靠性交易会
[3] X. Si,W. Wang,C. Hu,D. Zhou,2011,剩余使用寿命估计—统计数据驱动方法综述
欧洲运筹学杂志
[4] S. Sankararaman,K. Goebel,2015,预测与系统健康管理的不确定性
国际预测与健康管理杂志

关于作者

我是一名从事航天应用不确定度量化和可靠性分析的博士研究生。统计和数据科学是我日常工作的核心。我喜欢分享我在迷人的统计学世界中学到的东西。查看我之前的帖子了解更多信息,并在 Linkedinhttps://www.linkedin.com/in/shuaiguo16/上与我联系。****

如何防止完好管道中的坏数据

原文:https://towardsdatascience.com/data-engineering-101-how-to-prevent-data-downtime-c09a022aa6ff?source=collection_archive---------34-----------------------

你应该考虑的 3 个策略

图片由 Shutterstock 上的 RT Images 提供。

对于数据团队来说,破损的数据管道、陈旧的仪表板和凌晨 5 点的消防演习是家常便饭,尤其是当数据工作流从不同来源接收越来越多的数据时。从软件开发中汲取灵感,我们把这种现象叫做 数据宕机——但是我们如何才能主动预防坏数据在第一时间来袭呢?

最近,我的一个客户提出了这个问题:

“您如何防止数据停机?”

作为一家拥有 3000 名员工的媒体公司的数据主管,他的团队负责每天向数百名利益相关方提供数 TB 的数据。考虑到数据移动的规模和速度,数据宕机,换句话说,数据全部或部分丢失、出错或不准确的时间段,是一个非常常见的现象。

一次又一次,营销部门(或运营或销售或任何其他使用数据的业务职能部门)的某个人注意到他们的 Tableau 仪表板中的指标看起来不对,伸出手来提醒他,然后他的团队停止了他们正在做的任何事情来解决问题。在这个过程中,他的利益相关者失去了对数据的信任,宝贵的时间和资源被从实际建设中转移出来,以扑灭这一事件。

也许你能理解?

数据停机时间的增加

从制造业中的预防性维护到软件工程中的错误监控(排队可怕的 404 页……),防止停机的想法是许多行业的标准做法,这些行业依靠正常运行的系统来运行业务。

然而,许多吹嘘其数据驱动资质的公司并没有投资于防止管道破裂或在数据流向下游之前识别低质量的数据。他们不是主动应对数据停机,而是被动应对,用坏数据玩打地鼠游戏,而不是专注于在第一时间防止数据停机。

幸运的是,还有希望。一些最具前瞻性的数据团队已经开发出了最佳实践,可在您的首席执行官有机会提出一个可怕的问题之前,防止数据宕机,并阻止管道破裂和仪表盘不准确。!"

下面,我分享 3 个关键步骤,你可以采取这些步骤来防止坏数据破坏你的 好管道 :

1.测试你的数据。并进一步测试你的数据。

对于大多数数据团队来说,测试是抵御坏数据的第一道防线。承蒙* 阿诺弗朗西斯卡 Unsplash*。**

2021 年,数据测试就是表赌注。

就像软件工程师对他们的代码进行单元测试一样,数据团队应该通过端到端的测试来验证他们的数据。测试的核心是帮助您衡量您的数据和代码是否如您所想的那样运行。

模式测试和自定义固定数据测试都是常见的方法,可以帮助确认您的数据管道在预期的场景中正常工作。这些测试寻找警告信号,如空值和参照完整性,并允许您设置手动阈值和识别可能指示问题的异常值。当以编程方式应用于管道的每个阶段时,数据测试可以帮助您在问题变成数据灾难之前检测和识别问题。

2.了解数据沿袭和下游影响

字段和表级沿袭可以帮助数据工程师和分析师了解哪些团队正在使用受上游数据事件影响的数据资产。图片由巴尔·摩西提供。

通常,数据宕机是无意更改的意外后果,远离依赖数据资产的最终消费者,而数据团队的成员甚至都不知道。这是糟糕的数据谱系的直接结果——我称之为 “你在用那个表?!" 问题。

简而言之,数据血统是数据上游和下游依赖性的端到端映射,从摄取到分析。数据沿袭使数据团队能够理解每个依赖项,包括哪些报告和仪表板依赖于哪些数据源,以及在每个阶段发生了哪些特定的转换和建模。

当数据沿袭被整合到您的平台中时,尤其是在字段和表级别,任何更改的所有潜在影响都可以被预测,并在数据生命周期的每个阶段传达给用户,以抵消任何意外的影响。

虽然下游血统及其相关的业务用例很重要,但也不要忽视了解哪些数据科学家或工程师正在访问仓库和湖泊级别的数据。在他们不知情的情况下推动变更可能会中断耗时的建模项目或基础设施开发。

3.优先考虑元数据,并像对待元数据一样对待它

当应用于特定用例时,元数据可以成为解决数据事件的强大工具。图片由巴尔·摩西提供。

在防止数据停机方面,沿袭和元数据是相辅相成的。作为沿袭实践的一部分,标记数据允许您指定数据的使用方式和使用人,从而减少误用或损坏数据的可能性。

然而,直到不久前,元数据还被视为那些你发誓有一天会用到的空亚马逊盒子——被囤积起来,很快就被遗忘了。

随着公司投资于更专业的数据工具,越来越多的组织意识到元数据在日益复杂的技术堆栈中充当无缝连接点,确保您的数据在每个解决方案和管道阶段都是可靠和最新的。元数据尤其重要,它不仅有助于了解哪些消费者受到数据停机时间的影响,而且有助于了解数据资产是如何连接的,以便数据工程师能够更好地协作并快速解决可能发生的事件。

元数据根据业务应用进行应用时,您将深入了解您的数据如何推动公司其他部门的洞察和决策。

数据停机的未来

强大的端到端沿袭使数据团队能够跟踪其数据流,从接收、转换和测试,一直到生产、合并转换、建模和流程中的其他步骤。图片由巴尔·摩西提供。

那么,在实现我们的无数据停机世界的梦想时,这给我们留下了什么?

嗯,就像死亡和税收一样,数据错误是不可避免的。但是,当元数据被划分优先级,沿袭被理解,并且两者都被映射到测试和可观察性时,对您的业务的负面影响— 数据停机的真实成本 —在很大程度上是可以预防的。

我预测数据停机的未来是黑暗的。这是件好事。我们越是能够防止数据停机带来的麻烦和消防演习,我们的数据团队就越是能够专注于项目,以可信、可靠和强大的数据推动业绩和业务向前发展。

有一些数据宕机的故事分享吗?我洗耳恭听。联系 巴尔摩西 蒙特卡洛团队 ,并参加我们的 下一次数据可观测性网络研讨会

数据工程:创建自己的数据集

原文:https://towardsdatascience.com/data-engineering-create-your-own-dataset-9c4d267eb838?source=collection_archive---------10-----------------------

如何使用 Python 和提取转换加载管道创建自己的数据集

伊恩·巴塔格利亚在 Unsplash 上拍摄的照片

介绍

你是一名机器学习工程师还是一名数据科学家,你想在数据集上应用机器学习(ML),而数据集目前并不存在?或者你是一名数据工程师,你的工作是创建一个数据集,以便机器学习工程师和数据科学家可以将这个数据集转化为你公司的商业价值?在这两种情况下,您应该熟悉提取-转换-加载(ETL)管道。

ETL 是一个允许您从各种来源提取数据,根据您的要求转换数据,并最终将其加载到您选择的数据库或数据格式中的过程。

在本文中,我将向您展示一个 ETL 管道的例子。我想创建一个小型数据集,其中包含所有国家的幸福数据、关于人口数量和国内生产总值的数据,以及每个国家的平均年龄。

作为编程语言,我使用 Python。我从维基百科搜集幸福值,从 Rapid API 搜集每个国家的人口数据,从另一个网站搜集平均年龄。然后,我将这些数据集组合在一起,并对数据集中存储的数据类型和数值应用一些转换。最后,我将数据集加载到一个 CSV 文件中,这样它就可以被机器学习工程师加载。

你可以在我的 Github 库这里找到完整的 Jupyter 笔记本。我使用 Python 中的 BeautifulSoup 包和 request 包从不同的网站和 API 中抓取数据。

提取

现在让我们从管道的第一部分开始,从不同的来源提取数据。作为第一步,我从维基百科收集快乐数据。代码 1 显示了从 Wikipedia 链接中提取完整的 html 数据,然后使用 BeautifulSoup 从提取的 html 数据中获取幸福表的代码。

代码 1: Python 代码,用于从维基百科抓取快乐数据,并将其存储在熊猫数据框中。

在第 8 行,请求包用于从提供的 Wikipedia 链接中获取 html 数据。在第 14 行,创建了 BeautifulSoup 对象,并将原始 html 数据作为输入传递。在第 17 行中,“find_all”函数用于获取所有带有 html 类“wikitable”的表。Gif 1 展示了如何检查一个网站的元素,以获得您感兴趣的表的类别。

Gif 1:这个例子展示了如何检查一个 html 对象来获取 html 类。可以通过右键单击对象,然后选择“检查元素”选项来检查 Html 对象。

Code1 的剩余部分将 html 表转换成 Pandas 数据框。

图 1 显示了这个数据框的头部,它包含了 153 个国家的幸福数据。

图 1:世界幸福数据框头部。

下一步,使用 Rapid API 中的 this API 获取每个国家的人口数据。Rapid API 还提供了一些关于如何从该 API 获取数据的示例 Python 代码。代码 2 显示了从这个 API 获取数据并将其附加到幸福数据帧的代码。

代码 2:通过从 Rapid API 提取数据来获取幸福数据集中每个国家的人口数据的代码。tqdm 包用于在执行 for 循环时获取进度条。

不幸的是,五个国家的人口数字不见了。这些现在可以从互联网上的其他来源加载,但这不是在这个小项目的上下文中完成的。

下一步,通过抓取世界数据网站来加载每个国家的平均年龄,可以在这里找到。再次检查感兴趣的表,以便获得正确的 html 类。代码 3 显示了获取数据并将其存储在数据帧中的完整代码。

代码 3:用于从 worlddata 网站提取每个国家的平均年龄数据并将其存储在 Pandas 数据框中的代码。

这个数据集只包含 116 个不同国家的数据,而幸福数据集包含 153 个国家的数据。同样,人们也可以从不同的来源提取缺失国家的数据,但在这个小项目中没有这样做。

现在,作为提取过程的最后一步,幸福数据框和包含每个国家平均年龄的数据框被合并成一个大数据框(代码 4,图 2)。

代码 4:连接数据框以创建一个大的数据框。

图 2:提取管道步骤结束时的数据帧头。

改变

现在让我们从 ETL 管道的第二部分开始,转换步骤。在转换步骤中,您通常会调整数据格式以满足您的需求,或者将列组合到新功能中。数据集准备得越好,机器学习工程师之后要做的工作就越少。在这个项目中,我决定添加一个包含每个国家 GDP 的列。这可以通过将“人均国内生产总值”和“人口”两栏相乘来计算。作为第二个转换步骤,我通过删除百分号并将字符串转换为浮点数,将列“20 岁以下人口”转换为浮点数。代码 5 显示了这些转换的代码,而图 3 显示了最终转换后的数据帧的头部。

代码 5:转换管道步骤的代码。计算 GDP 并将其添加到数据框中,20 岁以下人口列被转换为 float 类型。

图 3:应用转换后数据帧的最终状态。

负荷

加载步骤是 ETL 管道的最后一步。在加载步骤中,最终数据集被加载为预期的存储格式。这可以是数据库、CSV 文件或许多其他存储类型之一。我决定将这个数据集存储在一个 CSV 文件中。这可以很容易地加载到机器学习中。代码 6 显示了最后一个管道步骤的代码。

代码 6:将最终数据集加载到 CSV 文件中。

结论

在本文中,我通过使用几个不同的数据源创建了一个小型数据集,并将数据组合成一个数据集。我演示了 ETL 管道的样子,并为每个管道步骤添加了代码。数据集现在可用于进一步分析。

谢谢你把我的文章看完!我希望你喜欢这篇文章和我参与的项目。如果你想在未来阅读更多类似的文章,请关注我,保持更新。

数据工程失败—为什么几乎不可能在截止日期前完成?

原文:https://towardsdatascience.com/data-engineering-failure-why-is-it-almost-impossible-to-meet-deadlines-fc1b5b5aa90?source=collection_archive---------16-----------------------

思想和理论

“我喜欢截止日期。我喜欢它们经过时发出的嗖嗖声。”

工程是一门艺术(鸣谢:我)。

失败。我想写关于失败的东西。为什么数据工程师很难评估项目的持续时间,也很难满足截止日期?

在我过去 7 年的工作经历中,我有机会与多个数据工程团队合作。我注意到一个项目接一个项目的一个常见模式是,工程师很难定义和满足里程碑。

为了创建路线图和里程碑,我们一个团队接一个团队尝试了所有流行的方法。从 Scrum 跳到 Lean,尝试使用扑克计划或同行评估来确定任务的大小。这并没有阻止我们失败。但是,这很正常。

在这篇文章中,我将分享我们作为数据工程师失败的 3 个主要原因,并提出解决方案,以开启与社区的讨论。

数据工程师不擅长区分优先级

我们不擅长优先排序,这意味着大量的中断和不切实际的时间表。你说打扰?是的,数据工程深受上下文切换之苦。我们每天经常在不同的任务间穿梭。

这里是夸张的(是真的吗?)数据工程师的日常计划:

  • 早上——修复夜间破裂的管道
  • noon —回答#data-public 上关于仓库列的公共松弛问题
  • 下午——帮助一位分析师解决一个你在早上喝咖啡休息时聊到的棘手问题
  • 下班后——你开始你的日常工作

因为数据工程师在历史上被视为一个支持团队,他们需要(或者他们想要)尽可能快地回答问题,这显然与项目期限相冲突。很难拒绝。我知道。但是为了保持你的心理健康,你需要学习。

另一方面,我们也有太多反复出现的管道问题。编写无错误的管道是一项艰巨的任务。但是为什么呢?因为我们经常处于数据提供者和消费者之间(参见数据网格),面对太多的移动部分。我们将数据从数据库转移到存储或第三方平台。数据库模式、存储、第三方 API 或业务需求可能会发生变化。然后产生新的问题。

但是,我们不要只责怪其他团队,我们有时也会因为没有足够的时间或因为我们只是拙劣地建造蹩脚的管道。很难区分计划好的项目、计划外的项目和日常的 bugs &问题。

解决方案

为了解决这个优先化的问题,我给你提供了 4 条探索的途径。你会看到前三个是组织性的,最后一个更多的是关于消除技术债务以避免每天支付。

1 —开始成为产品团队的旅程。让人们明白你和他们一起开发工具,而不仅仅是提供服务。然后,开一个产品管理岗位,才能开始像考虑产品一样考虑数据。这颗子弹是目前数据网格及其周围一切的行业大趋势。警告:不要雇佣项目经理来管理积压的任务。

2 —如果你管理一个数据团队,创造一个信任的氛围,让工程师在必要时说不。当来自高层的压力很大时,说不并不是一件容易的事。

3-创建图腾持有者角色。团队中应该有人每周负责回答所有可能的外部干扰。创建每周轮换和角色很容易,但不要忘记检查角色是否真的有效。这会减少干扰吗?如果没有,找到原因并改进。

3 —将软件工程最佳实践应用到您的管道或应用程序开发中。像幂等性、可再现性、读/写模式等概念。是必须做的。当你开发一个管道时,它很可能有一天会失败。所以,为了未来,让调试和重启变得容易些。并且记住:造复杂是简单,造简单是复杂。

每天都有新的十字路口

数据工程项目在另一个时间表上

与其他数据任务相比,数据工程任务很少是小任务。您可能已经遇到过这种情况,分析师要求用一个表来回答一个业务问题,而当您添加该表时,分析师已经找到了获取数据的解决方案。

前一种情况说明了人们所处的不同时间表数据,也描述了同步它们的复杂性。

  • 数据分析师每天都有时间表,因为他们主要回答问题(业务或直觉)。
  • 数据科学家每周都有时间表,由于特征工程,他们将问题转化为模型。
  • 数据工程师按月安排工作,他们构建平台以支持过去、当前和未来的使用案例和增长。

我们按月工作的主要原因是,到今天为止,工具仍然很难操作(你还记得 Hadoop 吗?),对于同一项任务,我们有太多的工具和可行的解决方案,而不考虑这样一个事实,即每次我们在做一些事情时,都会发现一些计划外的东西。

如果我们增加工具的复杂性,数据平台得到的低质量输入。它带来了很多边缘案例:正常案例正在成为边缘案例,不良输入成为常态。说实话,许多数据平台尚未涵盖数据质量路径,数据工程师每天仍面临边缘情况。

工具复杂性和输入质量之间的这种混合会给我们工作的每个任务带来延迟。我们终于明白为什么我们需要这么长时间才能前进。

一名数据工程师因为洪水而推迟了他的项目

解决方案

1 —循序渐进。第一次评估项目?不要试图确定一年项目的规模。将它分割成 3 周或 3 个月的小项目,并创建小的可理解的任务。第一次你会错,但是经过几次尝试后,你肯定会变得更好。不练习,成不了大师

2 —我们都在同一条船上。在数据团队中,我们的北极星应该是为同事提供数据。让我们成为队友,理解彼此的限制。工程师在这里为公司创造最好的平台,分析师和科学家在这里创造数据的可见性、用途和界面。

3-关注技术创新,拥抱它们。许多新产品(Airbyte、Meltano、Singer 等)都加入了云数据存储(BigQuery、Snowflake、Databricks)。他们旨在简化数据工程的复杂性。使用它们。更重要的是:让它们适应您的堆栈。

数据工程学科仍然年轻

这一学科如此年轻的事实突出了前面两点。每一个选择或小错误都可能很容易导致技术债务。

这个行业错了好几年,随着数据科学的大肆宣传,许多公司雇佣了数据科学家,让他们做数据工程工作。这导致了两个主要问题:我们有沮丧的数据科学家和糟糕的工程平台。

不要误解我的意思,我认为数据科学家可以建立很好的平台,但是当你在做一项你不应该做的工作时,结果可能是欺骗性的。

数据工程团队通常被整合到“传统的”产品团队中,但是因为这个学科是新的,所以其他团队无法弄清楚数据工程师的能力。这是一个问题。有时,数据工程师可以带来更适合的解决方案,以避免不必要的工作。

我们也缺乏数据产品经理或者对数据平台有了解的产品经理。经常发生的情况是,产品经理在他们的范围界定中完全忘记了数据生态系统,后来给数据团队增加了计划外的工作。

此外,由于他年轻的数据工程技能相当广泛,除了大公司有足够的资源专门团队,小公司需要雇用 5 条腿的绵羊数据工程师。数据工程师被要求从 DevOps 技术跳到生产级代码编写,然后再跳到 SQL 调试。

一名数据工程师正在阅读“数据工程杂志”(鸣谢)

没有多少工程师有构建数据平台的丰富经验。对于一个新项目的团队来说,如果团队中没有人做过,那么很难评估这个项目会持续多久。如果我们再加上每两年变化一次的工具和趋势,我们如何才能更好地进行评估呢?

解决方案

1 —寻求帮助。你可能没有机会在你的团队中有一个前辈,但我认为如果你要求的话,会有人愿意帮助或挑战你。例如,询问其他规模相同或市场相同的公司,要有创意。我过去做过,我遇到了很棒的人。

通过在公共会议和/或聚会上展示来挑战你的选择和愿景。从这里你会得到问题和反馈,这将有助于你评价你的平台。

2——阅读别人写的东西,获得灵感。但不要忘记,你可能不是网飞、优步或 Airbnb。您可能不需要创建新的开源数据库技术来计算您的度量。

3 —雇佣拥有不同技能的团队。如果适合您的使用情形,最好雇用 2 名多面手和 2 名专业人员(例如开发操作系统和流),而不是 4 名多面手。但是要小心,过早地专门化你的团队也会产生问题。你不希望只有一个人负责流媒体。否则假期对他来说会很难熬。

结论

如果你是数据工程师,请善待自己。成为一名伟大的数据工程师需要时间。如果这是你第一次独自创建一个平台,挣扎是正常的。

如果你和数据工程师一起工作,请善待他们。在他们的日常职业生活中,工程师喜欢看到人们使用他们制造的工具。

但是不要忘记给你的项目设定(具有挑战性的)截止日期。只有这样,你才会进步,并开始与同事建立信任。还要记住,每个解决方案都有自己的文章,我们有许多可操作的杠杆来改善这种情况。

这篇文章也可以更普遍地应用于软件工程。数据工程真的如此讲究,有特定的需求吗?难道我们不应该把数据工程师当成另一个工程团队吗?

特别感谢 Augustin、Charlotte、Emmanuel 和 Pierre 的评论。

副标题由道格拉斯·亚当斯引用。

这篇文章最初发表在 blef.fr 上,我在那里发表了一份关于数据的每周策划简讯。工程、筹款、分析、组织一切都是。

数据工程——使用 Apache Airflow 的 Google Bigquery 到漂亮的电子邮件模板

原文:https://towardsdatascience.com/data-engineering-google-bigquery-to-pretty-email-templates-using-apache-airflow-4798b4caa3f5?source=collection_archive---------26-----------------------

从你的数据仓库到电子邮件

Solen Feyissa 在 Unsplash 上拍摄的照片

大家好。
作为数据从业者,我们经常需要将数据交付给需要它的人。
随着时间的推移,在数百个特别请求和 SQL 查询之后,您很快就会意识到这些请求中有许多是相似的,并且可以自动化

与此同时,以 excel 文件形式附加数据的传统方式已经过时了。现在是 2021 年,是时候想出创新的方法来显示你的数据了。

你有没有想过从你的数据仓库中提取一些数据,并通过电子邮件发送出去,同时让整个过程自动化?

我正好有适合你的东西。

今天,我们将使用 Apache Airflow 来自动化整个过程,同时保持数据的美观。

先决条件

我们将使用熊猫来转换数据。
我在这里 写了关于熊猫 的基础知识,涵盖了你需要了解的关于处理数据的主要概念。

然后我们将使用阿帕奇气流使整个过程自动化。Airflow 是数据工程师用来有效管理和监控其自动化任务的工作流管理系统。我碰巧在这里 写了一篇关于在 Apache Airflow 上构建第一个管道的综合指南。

对于这个例子,我们将使用 Google Bigquery 作为我们的数据仓库,因为这是我目前正在使用的。但是,要理解数据可以从任何数据仓库中提取出来,并以类似的方式进行操作。

让我们写一些代码。

克里斯托弗·高尔在 Unsplash 上拍摄的照片

安装和导入

#installing libraries
pip install google-cloud
pip install pretty-html-table
pip install pandas-gbq
pip install pandas#importing libraries
import google.cloud.bigquery as bq
import pandas as pd
import pandas_gbq
from pretty_html_table import build_table
from airflow.utils.email import send_email

熊猫-gbq

Pandas-gbq 是一个包,提供了从 Pandas 到 Google BigQuery API 的接口。它允许我们从 Bigquery 中提取数据,并通过一行代码将其导入到我们的 Pandas DataFrame 中。如果你没有使用 Google BQ,如果你的数据仓库有 pandas 连接器,可以做一个快速搜索。

漂亮的 html 表格

Pretty-HTML-table 允许我们在一个漂亮的 HTML 表格中显示我们的熊猫数据帧。这个表格整洁美观,非常适合显示任何类型的汇总数据。

获取数据

使用 Google Bigquery 作为我们的数据仓库。

query = """SELECT * from sample_table"""
project_id = <your google cloud project id>
df = pandas_gbq.read_gbq(query, project_id=project_id)#process your data here

下面是我们的示例数据,用于演示目的。

作者图片

请注意,在继续之前,您可以在这里进行任何类型的数据处理。

美化桌子

在这里,我们将数据转换成一个漂亮的 HTML 表格。

output_table = build_table(df, 'blue_light')

如果你打印‘output _ table’,它会显示一堆 HTML 代码——

作者图片

它在邮件中实际上看起来是什么样的——

作者图片

这个库把你的熊猫数据帧和转换成一个 HTML 编码的表格,这在电子邮件中看起来更顺眼。因此,当您遇到一堵无法阅读的代码墙时,不要感到惊讶。

wolfentertainment.comgif

我在这里使用“蓝光”主题。可用主题的完整列表可以在库的 PYPI 文档 中找到。

准备电子邮件内容

既然我们已经准备好了数据。
是时候创建并发送我们真正的电子邮件了。

#creating email content
html = '<!DOCTYPE html><html><p style="font-family:verdana">'
html += """Here's the data for the day: """
html += '<hr>'
html += output_table
html += '</p></html>'#defining receivers and subject
email_subject = 'Sample Data from Bigquery'
email_to = <receivers>
email_content = html
send_email(email_to, email_subject, email_content)

现在可以发送电子邮件了。就这么简单。

设计气流操作器

现在我们已经完成了代码,下一步是将它们组合成一个气流操作符,这样我们就可以自动完成这项工作。我们可以确定哪些变量要作为实例变量传入。

出于演示的目的,我选择了 query、receivers 和 Pretty-HTML-Table 主题作为实例变量,只是为了好玩。

创建操作符时要注意的主要变量是 execution_date 。这个变量表示 airflow UI 中的执行日期,不会被运行日期弄错。

作者图片

我们可以用执行日期替换查询中的日期,这样我们的作业在每次运行中只提取当天的数据。让我们在 DAG 里做吧。

设计气流 Dag

最后一步是写入气流 Dag 。这就是我们定义的—

  • 什么时候运行作业?
  • 我们多久运行一次作业?
  • 我们什么时候正式开始工作?

通过使用上面的示例,我们已经将管道设置为从 2021 年 3 月 7 日开始,每天在
上午
10 点运行。我们还将查询设置为只提取当天的数据。

和..差不多就是这样!
现在坐下来,监控你工作中的错误。

结论

安东尼·福明在 Unsplash 上的照片

恭喜

如果你已经走了这么远,给自己一点鼓励。
在这篇文章中,我们谈到了—

  • 从 Google Bigquery 中提取数据
  • 将它转换成一个漂亮的 HTML 表格
  • 创建电子邮件的内容
  • 将一切组合成一个气流算子
  • 设计 DAG 以自动化作业

现在走吧。建立你的管道并与我分享。
我在等。

数据是一种珍贵的东西,它将比系统本身持续更久——万维网的发明者蒂姆·伯纳斯·李。

订阅我的时事通讯,保持联系。

也可以通过 我的链接 注册一个中等会员来支持我。你将能够从我和其他不可思议的作家那里读到无限量的故事!

我正在撰写更多关于数据行业的故事、文章和指南。你绝对可以期待更多这样的帖子。与此同时,你可以随时查看我的其他 文章 来暂时填补你对数据的渴望。

感谢 的阅读!如果你想和我联系,请随时通过 nickmydata@gmail.com 联系我或者我的 LinkedIn 个人资料 。也可以在我的Github中查看之前写的代码。

数据工程师不应该写气流图——第 1 部分

原文:https://towardsdatascience.com/data-engineers-shouldnt-write-airflow-dags-b885d57737ce?source=collection_archive---------4-----------------------

意见

是时候寻找一种更好的方法来使用 Apache 气流了

里卡多·戈麦斯·安吉尔在 Unsplash 上的照片

我认为数据工程师不应该写气流图。相反,数据工程师应该构建自动化那些 Dag 创建方式的框架

没有什么比一遍又一遍地做同样的事情更无聊的了。这正是你写 DAG 时要做的。你一遍又一遍地做着同样的事情。过了一段时间,工作变得重复,你的技能开始得不到充分利用。

Stitch Fix 的数据平台副总裁杰夫·马格努松几年前写了一篇文章,他在文章中指出 工程师不应该编写 ETL 他的观点是数据工程师的工作不是编写 ETL,而是概括和抽象这些 ETL 的制作方式

我相信这正是我们在气流方面做错的地方。我们只是在编写 Dag,而不是构建概括和抽象 Dag 创建方式的框架。当你做了一段时间后,它会变得重复并且不好玩。

此外,重复代码不是编写可维护代码的聪明方法。 ( 不要重复自己)原则存在是有原因的,也就是,写可维护的代码。

这篇文章旨在与你分享我写了两年气流 Dag 后学到的一些经验。我希望这能对社区有所帮助,并从中受益。我相信是时候找到一种更好的方法来使用 Apache Airflow 并改进我们进行数据工程的方式了。

TL;构建框架,不要写 Dag。你可以通过使用动态 Dag、OOP 和软件设计模式来做到这一点。

数据工程师的职责

数据工程师的主要职责不是写 ETL。同样,对于 Apache Airflow,数据工程师的职责不是编写 Dag。为什么?很简单。

“工程师擅长抽象、概括,并在需要的地方找到有效的解决方案。”杰夫·马格努松

我相信数据工程可以被看作是软件工程的一个专门化。软件工程的主要目的是编写可靠的、可伸缩的、可维护的代码。我认为这也是我们作为数据工程师应该努力的事情。

实现这一点的方法之一是对事物进行概括和抽象。那是我们的工作。通过概括和抽象来构建事物,这样我们就可以授权数据分析师和数据科学家来完成他们的工作。

“那么,在这个新的、水平的世界里,工程师的角色是什么?总而言之,工程师必须部署平台、服务、抽象和框架,让数据科学家能够自主地构思、开发和部署他们的想法(比如用于构建、调度和执行 ETL 的工具、框架或服务)。”杰夫·马格努松

数据工程师不应该写 Dag

你需要学习的第一件事是,确定什么时候写 DAG,什么时候不写。

我不希望你去工作,开始疯狂地概括和抽象事物。过度工程化和过度一般化也是一个问题。你应该努力保持平衡。

这里有我写博客时学到的 4 课。我希望这给你带来一些关于如何停止写 Dag 并开始构建更多框架的指导!

1.DAG 写入有时会重复

我写的第一个 DAG 是一个 MySQL 数据库的 ELT 过程。任务很简单。考虑到一些限制条件,我必须提取数据。把它载入 S3 自动气象站。最后,使用基于 SQL 的转换来转换数据。就这样。所以,我只是用几个 PythonOperators 写了一个 DAG 文件。

集成之后,我被要求再集成两个数据库。一个是另一个 MySQL 数据库,另一个是 MongoDB 数据库。

很简单。像第一个任务一样的另一个任务。因此,我从第一个 DAG 文件中复制了一些代码,并将这些代码复制到几个 DAG 文件中。我对另外几个积分做了同样的事情。没什么大不了的。只是多了 5 到 6 个数据源。

几个月后,我们决定改变使用气流操作器的方式。我们从 PythonOperators 迁移到了 KubernetesPodOperators。你猜怎么着?我发现我在所有 DAG 文件中都有几乎相同的代码。因此,我不得不在所有 DAG 文件中进行相同的更改

这时我意识到我做错了。所以,我们开始使用动态 DAGs 。然后,我们使用面向对象编程(OOP)改进了这种方法。特别是,我们构建了一个定制的 DAG 工厂。工厂允许我们从一段独特的代码中创建多个 Dag。这让事情变得简单多了!

这是我在学到的第一课 可以使用动态 Dag 和面向对象的方法来构建你的 Dag。但是,要小心,动态 Dag 在大量使用时会产生问题。点击阅读更多

查看这些文章了解更多信息。

https://www.astronomer.io/guides/dynamically-generating-dags

2.构建允许人们与您的 Dag 进行交互的界面

在我们开始动态生成 DAGs 之后,感觉棒极了。编写用于集成新数据源的新 DAG 可能需要 5 分钟。除非你知道把代码放在哪里。

这是我的第二堂课。你不是给自己造东西,而是给别人用。

我会让数据分析师写他们自己的 Dag,但是他们不能,因为太难了。那时,我们萌生了编写一个框架来加载基于 YAML 文件的数据源的想法。没什么特别的,但是很实用。

这里的底线是构建允许人们与你的 Dag 交互的界面。在我们的例子中是一个简单的 YAML 文件。但是,天空是极限。如果您需要的话,您甚至可以构建一个 web UI 来实现这一点。

3.气流操作员工厂是必要的

我喜欢从 Airflow 1.10 迁移到 2.0。但是,你知道吗?我讨厌在使用 KubernetesPodOperator 的地方修改所有的代码行。

在气流 2.0 中,KubernetesPodOperator 发生了很大的变化。以下是影响我们的一些事情:

  • 端口已从列表[Port]迁移到列表[V1ContainerPort]
  • env_vars 已从字典迁移到列表【v1 env var】
  • 资源已经从 Dict 迁移到 V1ResourceRequirements
  • 资源已经从 Dict 迁移到 V1ResourceRequirements
  • …点击此处查看变更的完整列表

那是我的第三课。你不仅需要一个 DAG 工厂,还需要一个 Operator 工厂。

迁移之后,我们构建了自己的操作符工厂。如果 KubernetesPodOperator 再次发生变化,我们现在已经做好了准备。下一次改变将在一个文件中引入,而不是在 10 个不同的文件中。

4.动态 Dag 和 OOP 是不够的

现在你知道我们喜欢动态 DAGs 和 OOP,让我告诉你另一件事。一切都很好,直到我们开始发展和采用新的用例。我们意识到动态 Dag 和 OOP 不足以解决我们的问题

我们意识到我们构建了紧密耦合的模块。我们做得太差了,以至于我们的 DAG 工厂只有在包含两种特定类型的任务时才会生成 DAG。这两种类型是提取和转换。我们有一个用例,我们想要生成一个只包含提取任务的 DAG。我们不能这么做,因为我们的 DAG 工厂不允许。我们期望包括提取和转换任务。****

这是我的第四课。你必须小心你如何概括和抽象事物。你不能只是在生活中到处扔随机的概括和抽象。

我们解决代码紧密性的方法是使用 软件设计模式 DAG 工厂和 Operator 工厂遵循工厂方法模式。这是最广为人知的设计模式之一,但是你应该知道还有更多的!我们还发现遵循策略模式模板模式非常有用。

结论

我知道我在这篇文章中所做的一些陈述可能会很强烈并引起争议。请让我知道你对它的想法!

小心我在文章中建议的原则。不要把事情过度概括,过度工程化!

“复制远比错误的抽象便宜”桑迪·梅斯

感谢阅读!

最后,感谢胡安·费利佩·戈麦斯让这一切成为可能。

更新:本文的第二部分现已推出

如果你想随时更新我的作品, 请加入我的 简讯 偶尔,我会和我的读者分享一些东西。如果你加入我会很感激的:)

数据工程师不应该写气流图——第二部分

原文:https://towardsdatascience.com/data-engineers-shouldnt-write-airflow-dags-part-2-8dee642493fb?source=collection_archive---------8-----------------------

阿帕奇气流的框架建议

理查德·霍瓦特在 Unsplash 上的照片

这是关于为什么数据工程师不应该写气流 Dag的第二篇文章。在这篇新文章中,我们将介绍一个针对 Apache 气流的框架 提案****。

本文旨在阐明构建框架如何帮助您解决一些与 DAG 编写相关的问题。

在这篇新文章中,我将对第一部分做一个简短的回顾。所以,没必要看。尽管如此,如果你想对我在这一篇中要阐述的东西有更详细的解释,你应该考虑读一读。

[## 数据工程师不应该写气流图——第 1 部分

towardsdatascience.com](/data-engineers-shouldnt-write-airflow-dags-b885d57737ce)

为什么数据工程师不应该写 Dag

正如我在第一篇文章中提到的,数据工程师的工作不是编写 ETL。数据工程师的工作是编写可靠的、可伸缩的、可维护的代码

数据工程师不应该为了写 Dag 而写 Dag。如果数据工程师专注于概括和抽象事物,而不是编写简单的 Dag,他们的技能可以得到更好的利用。

DAG 写入有两个主要问题:

  • 这是一个重复的过程。违反了 ( 不重复自己)的原则。如果处理不当,最终会产生大量重复且不可维护的代码。
  • 对于那些没有专业知识的人来说,这可能很难做到。当这种情况发生时,数据工程师就成了为其他人写 Dag 的人。这不一定是坏事,但我们可以做得更好。

我相信你可以遵循几个原则来缓解这两个主要问题:

  • 尽可能使用动态 Dag来生成你的 Dag。坚持干原则是个好办法。
  • 通过使用面向对象编程(OOP)和设计模式来改进您生成动态 Dag 的方式。如果处理得当,它可以提高代码的可维护性。
  • 构建允许人们与他们的 Dag 交互的界面。作为一名数据工程师,你的工作不是为别人写 Dag。你的工作是授权给人们,让他们可以写自己的 Dag 并与他们互动。

这些原则帮助我们解决了上述问题。我们用它们建立了一个处于早期阶段的框架。但是,它被证明是有用的。

在下一节中,我们将介绍我们的框架提案,称为 Castor ,在西班牙语中代表 beaver 。我们希望这个框架能够为我们如何更好地使用 Apache Airflow 提供一些启示。

该框架允许使用一种更为 的声明性 方法来定义数据管道。而不是由 DAG 编写强制执行的命令式方法。我们相信声明式数据管道是数据管道的未来。

castor:Apache 气流的框架提案

想象一下,编写 DAG 就像编写一个简单的配置文件一样简单。该配置文件将为您做一切。你只需要指定你想做的事情,剩下的事情会由其他的事情来处理。

这就是我们在编写框架时试图实现的目标, Castor 。我们希望简化 DAG 的编写,这样就像编写配置文件一样简单。但是,我们也想解决这两篇文章中已经提到的问题。

为此,我们结合了动态 Dag、OOP 和软件设计模式,并构建了 Castor 。我们通过构建和使用该框架获得的一些好处是:

  • 它帮助我们标准化了使用 Dag 的方式。因此,团队中的每个人都在同一页上。因为每个人都知道框架,所以移交很容易完成。当你不得不把一个进程交给别人的时候,你传递配置文件,就是这样。配置文件比 DAG 代码更容易阅读和理解。
  • 几乎所有的 Dag 都是由相同的代码行生成的。因此,如果我们想引入一个变化,我们在一个文件中做,这适用于项目的其余部分。我们不必在 10 或 20 个文件中做同样的更改。
  • 我们使用设计模式来获得某种程度的代码解耦,这让我们感到安全。引入新功能现在更容易了。就像贬低他们一样。
  • 因为编写 DAG 就像编写配置文件一样简单,所以几乎任何人都可以做到。通过这种方式,我们使数据分析师和数据科学家能够编写他们自己的 Dag,而不必沾染 Airflow 编程风格。

我们的框架包括 5 个组件:配置文件、DAG 工厂、任务创建器、任务策略和操作符工厂

配置文件

配置文件是生成 Dag 的方式。你基本上指定你想在你的 DAG 中是什么,就是这样。

以一个有 5 个任务的简单 DAG 为例。这两个任务中的两个是虚拟操作员开始任务和结束任务使 DAG 看起来漂亮。其他 3 个任务就是 PythonOperators 做你想做的任何事情——数据提取、数据转换等等。这是它在 Airflow UI 上的样子。

来自 Airflow UI 的 DAG 示例—作者制作的插图。

如果您想采用传统的方法,您可以为 DAG 编写代码,仅此而已。但是,如果您使用更具声明性的方法,这就是使用 YAML 配置文件的样子:

接口获取配置文件,并将其传递给框架的其他组件。此类组件根据您的请求获取文件并构建 DAG。

达格工厂

DAG 工厂只是工厂方法模式的一个实现。

DAG 工厂的责任不仅仅是创建 DAG。但是,要确保 Dag 的任务是根据配置文件中声明的依赖关系正确创建的。为此,它使用了 任务创建器

代码看起来是这样的

任务创建者和任务策略

这是魔法开始的地方。任务创建者和任务策略是策略模式的实现。

如果你对策略模式一无所知,这里有它的 UML 图。

战略模式 UML 图—作者基于[ 1 ]所做的图解

基本上,你有一个接口(策略)来声明子类应该实现什么。然后,一个上下文类通过接口与这些子类进行交互。

这是一个有趣的模式,因为您用组合代替了继承。此外,它遵循开闭原理。因此,你可以添加新的策略,而不必改变的背景。如果你想了解更多关于这个图案的信息,请查看这个以获取更多信息。

Castor 的上下文中,我们使用策略模式来创建任务。创建气流任务的方法之一是使用气流操作符。所以,按照这种模式,你基本上有尽可能多的策略和你想使用的操作符

首先,我们只实现了两个策略:python operator strategy和 dummy operator strategy。这就是 UML 图的样子。**

策略模式的 Castor 实现——作者举例说明

这里的要点是你应该** 编码你想使用的策略,然后忘记它们。你不必在生活中手动创建另一个气流任务。**

操作员工厂

最后,我们有操作符工厂。这是工厂方法模式的另一个实现。我个人喜欢 Operator Factory,因为在从 Airflow 1.10 迁移到 2.0 的过程中,我没有一个这样的工厂。

很简单。如果你在你的项目中到处使用气流操作符,如果操作符改变了,你注定要对项目做很多改变。

让我告诉你它看起来怎么样,因为我们已经做到了。我们的项目中有很多使用 KubertenesPodOperators 的文件。假设有 10 到 20 个文件。

在我们迁移到 2.0 之后,我们意识到 KubernetesPodOperator 发生了变化。以下是一些改变了的东西:

  • 端口已经从列表[Port]迁移到列表[V1ContainerPort]
  • env_vars 已从字典迁移到列表[V1EnvVar]
  • 资源已经从 Dict 迁移到 V1ResourceRequirements
  • 资源已经从 Dict 迁移到 V1ResourceRequirements
  • …点击此处查看变更的完整列表

迁移之后,一切都失败了。几个小时后,我们意识到这个问题与引入到 KubernetesPodOperator 中的变化有关。所以,我们修好了。但是,我们必须对使用 KubernetesPodOperator 的 20 个文件进行同样的修改。

这时我们意识到我们应该实现一个操作符工厂。我们将所有与气流操作员的互动都集中在那里。因此,如果想要与气流操作符交互,我们可以通过操作符工厂来实现。此外,如果我们必须引入变化,我们只在工厂里做,仅此而已。

实现非常简单。这是代码。

最后的想法

在本文中,我们介绍了一个框架提案被称为Castor。** 之所以这是一个提议,是因为这个框架还没有做好生产准备。它没有测试,是一种实验性的代码。**

如果你想看的话,这里有 Github 回购。

**https://github.com/castor-team/airflow-castor

本文的目的不是宣传我们的框架。我们的目标是揭示如何更好地使用 Apache Airflow。在这种情况下,我们提倡使用更多的声明性数据管道,因为我们相信它们是数据管道的未来。

再一次,我想知道更多关于你的想法。

感谢阅读!

特别感谢胡安·费利佩·戈麦斯让这一切成为可能。**

如果你想随时更新我的作品, 请加入我的 通迅 !偶尔,我会和我的读者分享一些东西。如果你加入我会很感激的:)

数据探索+谷歌地球引擎作为我的本科论文

原文:https://towardsdatascience.com/data-exploration-google-earth-engine-as-my-undergrad-thesis-531ac794dc9b?source=collection_archive---------23-----------------------

工程物理毕业前的最后一个项目总结

美国宇航局在 Unsplash 拍摄的照片

放弃

谷歌地球引擎没有赞助这个。我所想要的是给出我为我的本科论文项目所做的总体想法,并展示一些数据可视化。

介绍

我喜欢好奇,在不同的现象中寻找模式,并使用视觉来分享(并获得)知识或强调相关信息。(对我来说)数据科学领域涵盖了这些事情,不仅对重点问题产生了影响,而且有助于找到新的问题来解决。

我的本科论文题目是“Herramientas estadísticas y computacionales en imágenes satelitales de Earth Engine para la explora ción de incindios forestes,从西班牙语翻译成英语是“用于野火探测的地球引擎卫星图像中的统计和计算工具”。

为什么是野火?

野火是复杂的自然现象,超越了“世界变得越来越热”,它们包括了解环境的行为;文化、社会、环境、气候和其他类型的变量。我关注的是墨西哥的尤卡坦州。

Joanne Francis 在 Unsplash 上拍摄的照片

什么是谷歌地球引擎?

谷歌地球引擎(GEE)地球引擎(EE) 是一个基于云的平台,拥有庞大的数据目录。它使大规模卫星图像处理能够对与森林砍伐、地表温度变化、干旱等相关的地球表面进行不同的高影响分析。GEE 还旨在帮助研究人员轻松地与其他研究人员、非营利组织和公众分享他们的工作[1]。

Google Earth Engine viahttps://earthengine.google.com官方网页截图

为了提取数据并使用 GEE 的所有功能,用户必须使用一个或两个客户端库来访问 API: JavaScriptPython 。在我的特例中,我使用了 GEE Python API 原因如下:

  • 我对这种编程语言的掌握比其他任何语言都好。
  • 使用 GEE Python API 的一个优势是,借助于该领域中使用的库,如 NumPy、Pandas、Matplotlib、Scikit-Learn、GeoPandas 等,可以轻松集成到数据科学/分析工作流中;以及 Jupyter 笔记本中的开发和文档过程。
  • 一些库方便了一些 GEE 对象的操作。我用过的有: eemontgeemap 。两者都允许我执行各种操作,从操纵 GEE 对象到将 GEE 对象转换成熊猫。数据帧或 GeoPandas。地理数据框架对象。他们很容易得到一些变量的时间序列。

工作流程

像当今许多与数据相关的项目一样,这些阶段是:

项目的工作流程。作者制作的图表。

(主要)工具

我在整个项目中使用 Python,这里是我使用的库(在一个图像中)。

主要工具( PythonR )。图由作者制作。

数据

我使用了来自三个不同来源的数据集:

  • 2017 年森林火灾记录:国家林业委员会提供
  • 热点记录(2001–2020):由公司提供(资源管理系统的火灾信息)。
  • 卫星图片收集:GEE 提供(见上图)

来自谷歌地球引擎的图片集。图由作者制作。

探索性数据分析

一幅图像胜过千言万语,所以我在下面的数据可视化中总结了第 6 章(名为探索性数据分析)。

热点聚集

在 2001 年到 2020 年间,置信水平高于 84%的高热点集中在该州的中部和东部。(公司提供的数据)

置信水平意味着观测实际上是火的置信水平。作者制作的图

受影响的市(县)

虽然 Tekax 在 2017 年有最高的记录,但它没有最显著的受影响表面积;该市是 Tizimín 市(国家林业发展委员会提供的数据)

作者制作的棒棒糖剧情

作者制作的棒棒糖剧情

有问题的孕期

在国家森林委员会和公司数据集的帮助下,找到了野火发生率最高的月份。

作者做的条形图

作者做的时间序列

环境变量的时间序列

仅仅知道变量的数据分布是不够的。了解变量行为的历史以找到模式或相关时期是很重要的。

该图显示,三月、四月和五月是最热的月份;此外,2017 年是最干旱的一年(低土壤湿度和 PDSI)

作者制作的热图

交互式地图

多亏了叶子地图,我可以在一个互动地图中可视化数据。下图显示了 2001 年至 2019 年期间受野火影响的表面以及时间范围内的地表温度。

2001 年至 2019 年的地表温度和受野火影响的地表。由作者创建,用叶子谷歌地球引擎数据制作的地图。

结论

Google Earth Engine 平台是一个信息丰富的工具,其开发环境(Google Earth Engine 代码编辑器)对没有高水平编程技能的用户以及通过其 Python API 在数据科学和分析领域有经验的用户来说是友好的。这一平台提供的机会不仅限于森林火灾,因为它可以涵盖不同的环境问题,如干旱、水供应、温室气体监测,甚至是社会问题,如人类住区及其如何影响生态系统。

更多信息

方法论的所有过程和对数据的探索都记录在 Jupyter 的笔记本上。这些笔记本位于 GitHub 存储库中。不幸的是,这个库是西班牙语的,但是如果你有任何问题,你可以联系我。

https://github.com/isaacarroyov/thesis_undergrad

我在做这篇论文的时候,有机会参加了火生态学协会举办的第九届国际火生态学与管理大会,并展示了一张海报。因此,我创建了一个 GitHub 知识库,用英语提供类似的信息。

https://github.com/isaacarroyov/2021_AFE_FireCongress09

关于我

我叫艾萨克·阿罗约,最近刚从工程物理专业毕业。我对数据科学、机器学习(尤其是无监督学习算法)及其在高影响力项目中的应用感兴趣。

你可以通过电子邮件((isaacarroyov@outlook.com)或社交媒体联系我,比如 LinkedIn (Isaac Arroyo)、insta gram(@ unisaakarroyov)或 Twitter(也可以是@ unisaakarroyov)。点击这里联系我

参考

[1] Gorelick,n .,Hancher,m .,Dixon,m .,Ilyushchenko,s .,Thau,d .,和 Moore,R. (2017 年)。谷歌地球引擎:面向所有人的全球地理空间分析。环境遥感,202,18–27。

数据探索、理解和可视化

原文:https://towardsdatascience.com/data-exploration-understanding-and-visualization-72657f5eac41?source=collection_archive---------7-----------------------

生成可视化效果以快速理解您的数据

卢克·切瑟在 Unsplash 上的照片

D 数据探索、理解和可视化是数据科学问题的一个重要方面。在这里,我提供了几种方法来简化这个过程。

数据探索和可视化是数据科学问题的一个重要方面。最好的可视化总是与手头的问题相关,并利用领域知识。然而,作为一名数据科学家,你会发现自己经常重复许多相同的可视化。

在这篇文章中,我生成了一系列可视化效果,您可以复制并粘贴这些效果来解决您的数据科学问题,从而简化您的工作并理解您的数据。

部分

这些部分是根据用于探索的可视化类型来划分的:

  • 相关热图
  • 按特征分类分布
  • 二维密度图。

所有的可视化都是交互式的,这是 Plotly 的标准。

本文的数据是 scikit-learn 乳腺癌数据集。但是,如果您创建一个数据框架,其中的目标变量被列为可视化的“目标”,则您可以将这些变量应用到您的数据中。

热图

第一种方法是简单的热图,描述特征和目标变量之间的相关性。

这些关联热图包含一条实线对角线,代表每个功能与其自身的关联。这些图旨在快速识别非对角线值中显示的高度相关的特征。

按类别的特征分布

第二种方法是按类分解特征分布。有了这些分布,您可以结合行业知识来识别异常和类别分离。

Plotly 还可以选择显示一维密度图,并将其添加到密度图中。这得益于显示每个单独的实例,而不是密度图中的汇总版本。

2D 密度图

最后展示的是一个二维密度图。这些图更复杂,因为它们需要选择和显示成对特征的组合。

在提供更多信息的同时,展示每一对都扩大了产生的图形的数量。这些类似于之前的密度图,但是它们更详细地揭示了类之间的分离。

根据二维图的性质,您的问题可能需要更复杂的模型来支持有效的分类。

特征相关热图

关联热图是快速识别与其他要素高度相关的要素的好方法。这些图揭示了那些与目标变量最相关的特征,这些特征可以作为特征选择过程来选择。

数据帧的关联热图(由作者编码)

然而,更重要的是识别相关特征的极端情况。

根据要素的布局,很难快速识别高度相关的要素。但是这些相关性在特征具有来自色标的相同极端颜色的区域中是可见的。

要找什么

高度相关的特征,无论是正相关还是负相关,都会影响您的模型。这些高度依赖的特性会通过在特性集中添加冗余来影响模型有效建模数据的能力。

简单地说,它们分散了你的模型学习它需要知道的东西的注意力,因为它必须不止一次地处理相同的信息。

此外,当特征与目标变量不相关时,这些特征有可能是噪声。这些噪声变量也可能对模型的整体性能有害。

本质上,你的模型使用噪声变量没有任何好处。至少,你的模型需要学会忽略这些嘈杂的变量。当存在大量低相关性特征时,请认真考虑特征选择。

因此,在第一次视觉化之后,你已经可以指导你的下一步了。识别并消除冗余和噪声变量。

数据框架的关联热图(由作者绘制)

按类别划分的特征分布

第二种方法是按类分解特征分布。在这里,您可以开始整合行业知识并识别每个特征的异常。

例如,如果年龄是一个特征,那么负年龄就不是一个准确的值。这些情况可以从特征分布中快速识别出来。同样,行业知识可以提供每个特性的更多细节。但是,这些将更多地视情况而定。

按类的特性分布(按作者的代码)

这些图还指示应该实现什么类型的缩放。根据您计划使用的模型,这是使模型有效的关键步骤。

顺便提一下,一些模型对不同的特征尺度更有弹性。例如,基于树的模型或多或少与规模无关。但是,在许多其他情况下,缩放数据可以将指数分布转换为均匀或正态分布,并更好地符合模型预期。

重新缩放问题

许多缩放方法需要知道特征分布中的临界值,并可能导致数据泄漏。例如,最小-最大缩放器应该只适合训练数据,而不是整个数据集。当最小值或最大值在测试集中时,您已经减少了一些数据泄漏到预测过程中。

直方图具有误导性

每个分布下方显示的一维频率图有助于理解数据。乍一看,这些信息似乎是多余的,但是这些信息直接解决了以直方图或分布形式表示数据时的问题。

例如,当数据被转换成直方图时,仓的数量被指定。仓太多很难破译任何模式,仓太少会丢失数据分布。

此外,将数据表示为分布假设数据是连续的。当数据不连续时,这可能表示数据中存在错误或关于要素的重要细节。一维频率图填补了直方图失效的空白。

按类别的特征分布(按作者绘制)

二维密度图

二维密度图结合了先前密度图的各个方面和第一次可视化中的相关热图。

但是这些可视化的代价是,当组合来自多个特征的信息时,有许多配置。

此外,当比较成对的特征时,可能性的复杂性急剧上升,因为特征的每种排列都是可能的。

二维密度图(作者代码)

Plotly 通过“figure_factory”模块为二维密度可视化提供内置功能。

该功能易于实施,分为两个系列,有标记颜色和尺寸选项。同时使用颜色和大小似乎有些问题,但是定义的函数实现了这两个选项。

可视化还利用相关性来限制特征对的大小。默认情况下,我只显示与目标变量最相关的 k 个特性。然后为可视化生成所有特征对的集合。

显示两个以上维度的信息

二维可视化无法显示我们的模型可能捕捉到的更高维度的关系。但是,当局限于二维空间时,人们可以创造性地用形状和颜色来显示数据的其他方面。

在这种情况下,我利用标记的形状来表示类别,用等高线来表示频率。以更高维度表示数据可以获得更多信息,但代价是很难快速理解这些模式。

二维是一个合理的限制,这样即使有大量的信息,可视化仍然容易理解。

二维密度图(作者绘制)

包裹

这篇文章展示了几种不同的可视化方法,用于理解数据中存在的要素。

开发模型时,一切都从数据开始。因此,有效的数据理解对于设计有效的模型至关重要。这些可视化为您的数据提供了大量的洞察力,并且易于重现。

这篇文章旨在展示一个预测建模项目的几个可视化功能以及目标模式。

您可以随意复制和粘贴这些函数,以供将来使用。

如果你有兴趣阅读关于新颖的数据科学工具和理解机器学习算法的文章,可以考虑在 medium 上关注我。

如果你对我的写作感兴趣,想直接支持我,请通过以下链接订阅。这个链接确保我会收到你的会员费的一部分。

https://zjwarnes.medium.com/membership

数据析取

原文:https://towardsdatascience.com/data-extraction-b9ac0cb645b6?source=collection_archive---------29-----------------------

如何做

运动数据域(Mixamo FBX)

主页(按作者)

机器学习和深度学习模型的应用每天都在涌现,对于初学者来说,一个最重要的问题是:“从哪里开始?”作为数据科学领域的新人,mind 在诸如 NLP、计算机视觉或任何其他事物之间周旋。然而,任何 ML/DL 算法的应用都遵循相同的流程:数据提取、清理、模型训练、评估、模型选择、部署。这篇文章和其他文章没什么不同,但它是针对动画或医疗保健信息学领域的数据而策划的。

运动数据本质上是复杂的,因为它是一个分层链接的结构,就像一个图形,其中每个数据点或节点是一个关节,而到其他关节的链接或边是骨骼。骨骼和数据点的方向和位置描述了可能随着帧数的增加和捕获或模拟的对象改变其位置而变化的姿态。

为了不再浪费时间,我将从脚本本身开始。它分为几个步骤,但如果你愿意,你可以直接跳到下面 GitHub 链接中给出的脚本代码。

https://github.com/RahhulDd/FbxToNpyConverter/blob/main/fbx2npy.py

数据采集

在进入下一步之前,我建议您下载一个示例 Mixamo。fbx)文件从下面提供的链接。将此文件放入“常规”文件夹。

我还在文件夹中提供了一个样本文件来测试给定的脚本。

数据处理

首先,我们导入以下库。记住,“bpy”是一个只能由 Blender 工作台访问的 Blender 库。因此,只在 Blender 中编写脚本。

#Library Imports
import bpy
import os
import time
import sys
import json
from mathutils import Vector
import numpy as np

接下来,我们为 I/O 目录路径设置以下设置变量。

#Settings#This is the main file which loads with clear 'Scene' setting HOME_FILE_PATH = os.path.abspath('homefile.blend')
MIN_NR_FRAMES = 64
RESOLUTION = (512, 512) #Crucial joints sufficient for visualisation #FIX ME - Add more #joints if desirable for MixamRig
BASE_JOINT_NAMES = ['Head', 'Neck','RightArm', 'RightForeArm', 'RightHand', 'LeftArm', 'LeftForeArm', 'LeftHand',                    'Hips', 'RightUpLeg', 'RightLeg', 'RightFoot', 'LeftUpLeg', 'LeftLeg', 'LeftFoot', ]

#Source directory where .fbx exist
SRC_DATA_DIR ='regular' #Ouput directory where .fbx to JSON dict will be stored
OUT_DATA_DIR ='fbx2json' #Final directory where NPY files will ve stored
FINAL_DIR_PATH ='json2npy'

在上面的代码片段中,我们已经设置了分辨率以及将用于数据提取的关节数量。您也可以限制帧数,使每个动画文件的帧数一致。最终处理后的数据将存储在“\json2npy”文件中。

一旦选择了基础关节名称,我们将创建一个字典来访问装备的每个元素,默认情况下命名为“MixamoRig”。

#Number of joints to be used from MixamoRig
joint_names = ['mixamorig:' + x for x in BASE_JOINT_NAMES]

首先。fbx 文件转化为 JSON 对象字典,每个字典包含每帧关节位置信息。这是通过使用下面给出的函数来完成的。

def fbx2jointDict():

    #Remove 'Cube' object if exists in the scene
    if bpy.data.objects.get('Cube') is not None:
        cube = bpy.data.objects['Cube']
        bpy.data.objects.remove(cube)

    #Intensify Light Point in the scene
    if bpy.data.objects.get('Light') is not None:
        bpy.data.objects['Light'].data.energy = 2
        bpy.data.objects['Light'].data.type = 'POINT'

    #Set resolution and it's rendering percentage
    bpy.data.scenes['Scene'].render.resolution_x = RESOLUTION[0]
    bpy.data.scenes['Scene'].render.resolution_y = RESOLUTION[1]
    bpy.data.scenes['Scene'].render.resolution_percentage = 100

    #Base file for blender
    bpy.ops.wm.save_as_mainfile(filepath=HOME_FILE_PATH)

    #Get animation(.fbx) file paths
    anims_path = os.listdir(SRC_DATA_DIR)

    #Make OUT_DATA_DIR
    if not os.path.exists(OUT_DATA_DIR):
        os.makedirs(OUT_DATA_DIR)    

    for anim_name in anims_path:

        anim_file_path = os.path.join(SRC_DATA_DIR,anim_name)
        save_dir = os.path.join(OUT_DATA_DIR,anim_name.split('.')[0],'JointDict')

        #Make save_dir
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)

        #Load HOME_FILE and .fbx file
        bpy.ops.wm.read_homefile(filepath=HOME_FILE_PATH)
        bpy.ops.import_scene.fbx(filepath=anim_file_path)

        #End Frame Index for .fbx file
        frame_end = bpy.data.actions[0].frame_range[1]

        for i in range(int(frame_end)+1):

            bpy.context.scene.frame_set(i)

            bone_struct = bpy.data.objects['Armature'].pose.bones
            armature = bpy.data.objects['Armature']out_dict = {'pose_keypoints_3d': []}

            for name in joint_names:
                global_location = armature.matrix_world @ bone_struct[name].matrix @ Vector((0, 0, 0))
                l = [global_location[0], global_location[1], global_location[2]]
                out_dict['pose_keypoints_3d'].extend(l)

            save_path = os.path.join(save_dir,'%04d_keypoints.json'%i)
            with open(save_path,'w') as f:
                json.dump(out_dict, f)--EXPLANATION--
In the function above, first we remove pre-rendered objects like “Cube”, which is set as default when Blender is opened. Then we set the “Light” object settings to increase radiance of energy as well as type as “Point”. These objects can be access using “bpy.data.objects[name of object]” to manipulate the data related to it. Also, we have set the resolution settings by using “object.data.scenes[name of scene]” to manipulate scene rendering setting.Once it is done, we save the file as “main_file()” blend file. All the files in the directory ending with “.fbx” is listed and loaded in loop where each loop extracts the global location of Armature and it’s bones. Armature object can be used to get matrix of location in the video file and it’s pose structure for each frame and save it as a dictionary of bones and it’s location in JSON object file.

最后,使用 jointDict2npy()方法收集每个动画的每个 JSON 对象文件,将所有动画连接起来,以帧和位置的矩阵形式表示,就像图像一样。

def jointDict2npy():

    json_dir = OUT_DATA_DIR
    npy_dir = FINAL_DIR_PATH
    if not os.path.exists(npy_dir):
        os.makedirs(npy_dir)

    anim_names = os.listdir(json_dir)

    for anim_name in anim_names:
        files_path = os.path.join(json_dir,anim_name,'jointDict')
        frame_files = os.listdir(files_path)

        motion = []

        for frame_file in frame_files:
            file_path = os.path.join(files_path,frame_file)

            with open(file_path) as f:
                info = json.load(f)
                joint = np.array(info['pose_keypoints_3d']).reshape((-1, 3))
            motion.append(joint[:15,:])

        motion = np.stack(motion,axis=2)
        save_path = os.path.join(npy_dir,anim_name)
        if not os.path.exists(save_path):
            os.makedirs(save_path)

        print(save_path)

        np.save(save_path+'\\'+'{i}.npy'.format(i=anim_name),motion)--EXPLANATION--
Above function saves each of the animation in the form of .npy file which consist of 3D-Data array like Tensor formatted as (NumberOfJoints, NumberOfAxes, NumberOfFrames). “.npy” is an efficient structure which saves the data encoded in binary representation. Another alternative is to save it as a compressed file using “savez_compressed()” to “.npz” files.

使用以管理员身份运行的命令提示符执行脚本。键入以下命令来执行脚本:

CMD COMMAND : blender --background -P fbx2npy.py'if __name__ == '__main__':

    #Convert .fbx files to JSON dict
    fbx2jointDict()

    #Convert JSON dict to NPY 
    jointDict2npy()

处理的最终结果将看起来像下面给定的图像。这是从视频运动文件中选择的大约 5 帧。您可以使用“visualise_frame.py”文件来显示以下示例数据的结果。

已处理的视频帧(按作者)

结论

在这篇文章中,我们学习了如何处理动画数据。fbx 格式来获取关于每帧每个关节位置的数据。在野外有许多应用需要运动数据来学习任务,如姿态估计、运动重定目标等。在下一篇文章中,我将分享如何将这种类型的数据标准化,以便深度学习模型可以使用它。在那之前,再见,朋友们!!!

使用通用数据集保持数据工厂整洁

原文:https://towardsdatascience.com/data-factory-generic-datasets-a998b832f060?source=collection_archive---------18-----------------------

如何在 Azure 数据工厂中为 Blob 存储和 SQL DB 创建通用的、可重用的数据集

克丽玛乔Unsplash 上的照片

你有没有遇到过 Azure 数据工厂设置有一英里长的数据集列表,因为每个数据集都是为一个管道而创建的?我确实有。在本文中,我将向您展示如何创建通用的、可重用的数据集来保持工厂整洁。

本文组织如下:

  1. 如何为 Blob 存储创建通用数据集
  2. 如何为 SQL 数据库创建通用数据集
  3. 用法示例

请参见我的注释中的常见问题: 1) 您可能需要为某个字段设置 None 值,当其他字段没有值时,该字段是不可见的, 2) 找到字段的动态内容编辑器可能很棘手,以及 3) 如何在管道属性中包含特殊字符,如\t 或\n(制表符或换行符)。

1.如何为 Blob 存储创建通用数据集

为了创建一个通用的、可重用的 Blob 存储数据集,我们将像往常一样创建一个数据集,并给它一个描述性的名称。这里我将我的数据集命名为 miiastorage_delimitedtext,其中 miiastorage 是我的存储帐户,delimitedtext 是指我为数据集选择的格式类型。

创建后初始数据集属性的屏幕截图。

接下来,我们将为我们希望在使用该数据集时能够动态设置的每个设置创建一个参数。在这里,我决定参数化一切,但你可能总是有相同的编码等。除了容器和路径之外,我已经给了所有设置默认值,因为无论如何在使用它们的时候它们都不能为空。

显示数据集参数的屏幕截图。除了容器和路径之外,其他都有一个默认值,因为几乎每次引用该数据集时,这些值都会发生变化。行分隔符参数默认值似乎没有设置,但它是在 json 代码中设置的,我将在本文后面介绍。

然后,我们设置带有动态内容的数据集属性来引用这些参数。

显示属性设置的屏幕截图,其中每个属性都用数据集参数的动态内容引用来定义。

注 1 :当压缩类型为时,压缩级别必须设置为。使用基本属性时,压缩级别默认为,压缩级别不可见(= )。

注 2 :寻找动态内容链接有时很棘手。这里有两个流程可以帮你找到方向。

当编辑框可见时,如何为数据工厂中的下拉菜单设置动态内容的示例流程。步骤 1 是下拉菜单的初始视图。当编辑复选框被选中时,下拉列表变为文本框(步骤 2),当文本框被激活时,动态内容链接出现(步骤 3)。第 4 步展示了动态内容设置后的样子。

当编辑框不可见时,如何为数据工厂中的下拉菜单设置动态内容的示例流程。步骤 1 是下拉菜单的初始视图。单击下拉菜单两次以打开和关闭它(步骤 2)。菜单关闭时会出现动态内容链接(步骤 3)。第 4 步展示了动态内容设置后的样子。

注 3 :数据工厂编辑器对特殊字符如\t (tab)和\n(换行符)进行转义。这意味着,当您在编辑器中的文本字段中键入\n 时,它实际上会\n 并中断您的管道。要添加这些字符,你可以尝试遵循 Azure 的提示,从文本编辑器中复制粘贴,或者你可以通过 json 代码编辑器添加你的特殊字符。

显示列和行分隔符字段如何具有特殊字符(如制表符或换行符)将被编辑器转义的额外信息的屏幕截图。Azure 建议您从文本编辑器中复制并粘贴所需的字符。

数据工厂截图,json 代码编辑器可以从右上角进入。

数据工厂 json 代码编辑器截图。在第 28 行,我已经将换行符的默认值定义为\n。

2.如何为 SQL 数据库创建通用数据集

然后是 SQL 数据库数据集。让我们像往常一样从创建数据集开始。同样,我们希望尽可能通用地命名它,不需要一开始就为它定义任何表。

在没有定义表的情况下创建 Azure SQL 数据库数据集属性后的屏幕截图。

接下来,我们检查“Edit”框,它将“Table”输入字段扩展为两个字段,一个用于模式,一个用于表。这允许我们添加动态内容,通过它我们可以引用数据集参数。

Azure SQL 数据库数据集属性的屏幕截图。选中“编辑”复选框,将“表名”字段展开为单独的“模式”和“表名”字段,以允许添加动态内容。

然后,我们为这个数据集定义参数。我们需要的唯一参数是“模式名”和“表名”。我没有定义任何缺省值,因为这些参数经常在用例之间变化。

架构和表名的 Azure SQL 数据库数据集参数的屏幕截图。通常,不需要缺省值,因为这些参数在用例之间经常变化。

最后,我们在动态内容中添加对这些参数的引用,这样就完成了。

Azure SQL 数据库数据集属性的屏幕截图,其中架构和表名称是动态设置的。

3.用法示例

让我们创建一个简单的管道来演示用法。管道包含复制活动,该活动将 CSV 文件的内容从 blob 存储复制到 SQL 数据库。

对于源代码,我们只需要定义容器和路径参数,因为我的默认参数对这个文件很好。

带有源数据集示例设置的屏幕截图。

对于接收器,我们只需要填充模式和表名字段。

包含接收器数据集示例设置的屏幕截图。

现在我们可以调试我们的管道了。该表将被创建到我的数据库中,其结构与我的存储帐户中的 CSV 文件相同,因为我选择了“自动创建表”。

调试运行成功后数据工厂视图的屏幕截图。

该屏幕截图显示了我的数据库中的简单 SELECT *查询,以展示现在已经创建了表并传输了数据。

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

用我没有提到的连接器来实现这一点,你会有困难吗?请在评论中告诉我,我会尽力帮助你😊

干旱预报系统的数据

原文:https://towardsdatascience.com/data-for-good-somalia-drought-management-e882355a98e0?source=collection_archive---------17-----------------------

变更数据

应用数据科学和分析应对全球变暖引发的环境挑战。具有真实世界降雨数据的端到端项目

“数据为善是一场运动,在这场运动中,人们和组织超越边界,使用数据科学和人工智能来应对当今紧迫的挑战,以改善社会。”

作者照片。

目录

  1. 介绍性故事
  2. 输入数据准备
  3. 探索性数据分析
  4. 特征工程
  5. 型号选择
  6. 政策建议
  7. 参考

介绍性故事

花点时间想象以下场景。有一天,你被任命为索马里人道主义和灾害管理部的高级顾问,该政府机构负责处理全国范围的紧急情况。你被纯粹的快乐所感动,并且想要更新你的 LinkedIn 个人资料、Twitter 时间表和你的其他平台。即使你不知道你是怎么被选中的。

你注意到录取通知书附带了几十份令人印象深刻的文件。转眼间,当你阅读非政府组织的报告、评估和以前 PDF 简报中的咨询文件时,你意识到你正坐在职业地雷上。因为挑战不可能变得更难了。

尽管被宣布为失败的国家,索马里几十年来一直试图重新站立起来。内战高峰期出现的恐怖组织“青年党”正在发动持续的叛乱。迄今为止,它们几乎每周都在继续肆虐。此外,索马里面临着重要的体制和国家建设任务。健康的经济、政治气候和利益相关者之间的普遍信任水平都依赖于它们的充分解决。这些只是近年来这个饱受战争蹂躏的国家面临的众多挑战中的几个。根据您询问的对象和他们认为的优先事项,挑战列表可能会有所不同。

回到我们假设的例子,记住给你工作的部门希望你解决其中一个问题:即索马里的干旱问题。

我在这篇文章中的目标是帮助你找到这些解决方案,以便索马里的干旱情况在未来可以得到更好的处理。利用数据科学,我们将设计一个干旱预警系统。它意味着分析相关数据,形成建模方法,并根据收集的数据提出管理方案。

输入数据准备

那么,我们从哪里开始?像往常一样,谷歌来拯救我们。幸运的是,寻找索马里的降雨量数据并不难,尽管这并不令人愉快。在经历了一些挫折之后,我发现 http://www.tamsat.org.uk/的 TAMSAT 似乎是唯一一致的、容易获取的、免费的索马里降雨数据来源。它实际上为整个非洲提供了基于卫星的降雨量估计——可配置到每日粒度和 4 公里半径分辨率。在指定地理位置、所需的粒度和分析时间段后,您将收到一个下载链接,其中包含一个 CSV 或 NETCDF 文件。让我们在使用熊猫图书馆中读到它。

表 1:索马里 1983 年至 2021 年的 TAMSAT 每日粒度数据。作者照片。

观察粒度为每日,度量单位为毫米(缩写为 mm)。一毫米的降雨量相当于每平方米一升水。

我们端到端项目的下一步涉及编写一个数据处理函数。我们的目标是将每日数据向上采样(提升一个粒度级别)到每周一次,并生成一些可能有用的时间序列特征。“我们为什么要这么做?”你可能会想。在数据建模阶段,从我们的原始输入数据中提取这些特征迟早会派上用场。

表 2:基本时间特征。作者照片。

探索性数据分析

必须记住的是,任何严肃的数据项目都是从探索性分析开始的。说实话,这是一个人跳到任何造型形式之前的踏脚石。在这方面,我们可以从备受尊敬的统计学先驱约翰·图基那里汲取深刻的智慧,他曾经创造了一个恰当的短语。作为他 1977 年的开创性著作《探索性数据分析》的一部分,他写道:“探索性数据分析永远不可能是故事的全部,但其他任何东西都不能作为基石。”这就是为什么我们首先只研究索马里的降雨量数据。

图 1:1983-2021 年月降雨量的时间序列可视化。作者照片。

当雨季没有到来时,我们就说发生了干旱。毫无疑问,这是一种以极度匮乏为特征的局面。从上面的时间序列图中可以看出,索马里一直是,而不是不由自主地,最受欢迎的目的地之一。事实上,从 1983 年开始一直到 2021 年的图表中可以明显看出,索马里遭受了频繁的干旱。

此外,为了给可视化技术提供更多的背景信息,值得一提的是蓝线——在零点和 200 毫米最大值之间摆动——代表索马里的月降雨量。而红色虚线表示为分析目的而生成的聚合度量。这是整个研究期间的平均月降雨量,纯粹是识别蓝线间隙的直观助手。参见下面的代码:

查看这段代码,您会发现两个值得注意的地方:1)我使用了 Pandas transform 将聚合数据与分类数据结合起来,2)我创建了一个名为“干旱”的新变量。让我解释一下我的理由。

任何分析索马里干旱问题的人都会面临的第一个问题是:“在索马里的气候和地理背景下,什么是真正的干旱?”根据科彭气候分类,索马里分为两类。第一种是沙漠气候,第二种是温暖的半干旱气候。总共有四个季节,其中两个通常是雨季。

如果不是气候变化带来了更频繁的极端天气状况和干旱,索马里将定期享受 4 月至 6 月的 Gu(春季)雨季和 10 月至 12 月的 Deyr(秋季)雨季。

图 2:按月份、季度和年份划分的平均/累计降雨量的水平条形图。作者照片。

如上图所示,我们可以清楚地看到这些图案。平均而言,4 月/5 月和 10 月/11 月的降雨量比一年中的其他时间要多得多。但这并不是人们可以推断的全部。特别令人吃惊的是第三个也是最后一个条形图中的 1997 年,这是整个 38 年期间的最高峰。它的特点是降雨量超过 600 毫米。

在丰年,索马里通常会有 400-600 毫米的降雨量。然而,这似乎已经成为一种相当罕见的现象:38 年中只有 7 年拥有这样的数量!另一个引人注目的现象是 2017 年的下降,这是索马里历史上最糟糕的一年,最终导致人道主义危机和饥荒。幸运的是,它获得了足够的国际关注和救济资金,防止了急性营养不良升级为大范围的饥饿和死亡。

考虑到长时间的雨水不足会造成如此多的困难,人们不禁要问各国能对此做些什么。这就是为什么我创造了布尔变量“干旱”,以建立一个预测干旱发生的模型。我使用的逻辑非常简单,从最后一段代码中可以明显看出。

我首先生成了一个名为“Rain_Season”的中间列,当日期列显示为四月、五月、六月或十月、十一月、十二月时,根据正常情况下应该发生的两个雨季,该列的值为 1。然后,每次降雨量低于平均水平且“Rain_Season”为 1 时,“干旱”列将为 1,这是干旱发生的布尔代码。虽然这听起来很有道理,但我想承认,如果我的决定是由气象专家提供的话,那会好得多,因为他们确切知道阈值应该是多少毫米的降雨量。理想情况下位于地区级别。

但无论如何,现在让我们转向探索性分析的另一个重要角度。回答我提出的关于国家可以做什么的问题,我们最好使用统计学的概念。其中一个概念是自相关:过去的模式如何解释现在的现实。为此,我们从统计 Python 库 Statsmodels 导入了两个方便的函数。

图 3:自相关图。作者照片。

直观地观察索马里每周降雨量的自相关函数是有用的,因为它使我们能够理解过去和现在是如何交织在一起的。在这种情况下,它的形状以一条反指数曲线为特征,这意味着降雨量的未来值与其过去值适度相关,而相关性的强度随着我们考虑的滞后次数而降低。

然而,检查偏自相关函数,我们只看到降雨量与第一和第二滞后有很强的相关性。对于那些不熟悉时间序列计量经济学概念的人来说,这只是意味着过去的趋势在很大程度上解释了目前观察到的现实。这也意味着未来的降雨量取决于现在的降雨量。

特征工程

现在进入端到端项目的下一阶段,我们将把精力转向特性工程的主题。尽管有时被淡化为一项高强度低产出的活动,但对这一极其关键的步骤的普遍定义是:“从原始输入数据中准备、转换和提取有用的信息。”事实上,我们应该清楚地记得,这个领域的一位圣人曾经用语言描述了下面的话,强烈地强调了特征工程的重要性。

你使用的特性比其他任何东西都更能影响结果。据我所知,没有任何算法可以单独补充正确的特征工程所提供的信息增益。

—卢卡·马萨隆

所以,让我们按照这个聪明的金玉良言行动吧。基于我们从自相关分析中获得的过去解释未来的知识,现在让我们提取一些额外的时间序列特征。我决定提取的降雨滞后值代表前几周的降雨量,存储在每个时间点 t 的单独列中。这肯定会提高我们在后期建模阶段的干旱预测准确性。

我们的决赛表如下所示:

表 3:高级时间序列特性。作者照片。

明眼人无疑会注意到,我们的数据表看起来与我们开始时的原始数据有些不同。不过请放心,我没有诉诸一些非法的黑魔法,现在会给我想要的结果(许多数据怀疑论者会对你提出指控)。

我刚刚将原始的时间序列数据转换成一种适合监督机器学习的形式。换句话说,假设一个时间序列只不过是一系列具有时间维度的数据点,那么算法预测所需要确保的就是我们有一个时间变量来捕捉这个序列的节奏。

在我们的例子中,它是每周节奏,因此在日期时间索引的背景下,查看变量“Time_t”就足以让我们知道我们仍然在查看相同的每周时间序列数据。然而,在这个阶段,我们在数字和布尔变量的组合中捕获了更多的细节。“这对干旱紧急预测有什么帮助?”你可能在想。看看下面的特性重要性图会让事情变得更清楚。

图 4:皮尔逊特征重要度图。作者照片。

为了指出从情节中可以推断出什么,我们可以宣布几件毫不奇怪的事情。首先,春季或秋季的季节性,正如人们明显预料的那样,与干旱的发生或不发生高度相关。因此,当布尔雨季变量等于 1 时,我们很有可能观测不到降雨。这是因为索马里最近的天气历史倾向于突出干旱。其次,当在一个正常的雨季中观察到的平均降雨量(之前的红色虚线)低于实际记录的量(即,“Avg _ rain _ Diff”为正)时,我们很可能会遇到相反的情况:降雨!这就是为什么那个变量有接近 50%的负相关系数。相当直观。

由此得出的结论是,这些特征与我们想要预测的目标在令人满意的程度上相关。这里还有一件重要的事情。看看我们的滞后自相关特征。根据他们的说法,干旱迫在眉睫的最有指示性的迹象是雨季开始后 4 周过去了,还没有降雨记录。虽然有趣的是,我们注意到,4 周的滞后是与干旱最密切相关的,但我们必须记住,这种相关性并不意味着因果关系。

除此之外,不仅要检查特征和目标之间的相关性,还要检查特征本身之间的相关性,这是一个很好的实践。因为在有些情况下,变量之间强烈的负相关或正相关会妨碍模型的预测能力。在下面的图表中,让我们尝试确定我们是否受到这种现象的影响,这种现象在统计学领域被称为多重共线性。任何高于 80%的皮尔逊相关都是有问题的。

图 5:皮尔逊相关热图。作者照片。

与之前的垂直条形图不同,这张图有点难以阅读。但幸运的是,我们有颜色编码,这使我们能够很容易地发现强烈相关的特征。与第一列相邻,左上角的象限看起来很可疑。在那里,我们可以识别出表现出强相互相关性的变量对。它们是“Weeknum”、“Quarter”和“Month”。

从我们的输入数据中删除其中两个不会损害我们预测干旱的能力,因为它们的信息增益相当微不足道,因为它们包含相同的季节性信息。这就好像你在同一层级的会议中有两个人,他们拥有相同数量的信息。其中一个在会议中并不真正需要,因为另一个足以报告他们所拥有的信息。

型号选择

在最终开始我们预测干旱和选择数据科学模型的最初目标之前,我们必须将数据分成训练集和测试集。请记住,我们还必须删除我们在上一步中确定的冗余功能。从截图中可以看出,我选择了 2015-21 年的动荡期作为测试集,以确定该模型是否能准确预测关键时间段。在测试集中,干旱的发生稍微少一些,纯粹是因为时间范围比训练时间周期短得多。

作者照片。

图 6:训练与测试分布图。作者照片。

逻辑回归

鉴于我们的探索性分析揭示了特征-目标关系中的强线性,采用逻辑回归方法来预测索马里的干旱是明智的。下面的代码片段和结果说明了一个简单的逻辑模型足以让我们获得好的结果。

作者照片。

从各方面考虑,结果看起来很有希望。我们在测试集上取得了 92%的预测准确率。这意味着历史降雨量数据足以让任何国家设计一个基于数据科学的干旱管理系统。此外,想象一下我们有更详细、更可靠的地理信息数据,如经度、纬度、降雨区等。我知道我提到过 TAMSAT 有非洲的数据,但是我发现索马里的数据在地理信息方面并不可靠。有些坐标实际上位于邻国肯尼亚和埃塞俄比亚。

图 7:混淆矩阵图。作者照片。

但是,等等,准确性应该是唯一要报告的性能指标吗?不,实际上,你应该始终怀疑那些只交流准确性的数据科学家,尤其是当目标变量不平衡时(一个类别远远超过另一个类别)。对于这个特殊的用例,逻辑回归模型实际上犯了一些严重的错误:假阴性。看右上象限,你可以看到有 8 个实例,大约测试集中 3%的数据点,模型预测没有干旱,即使那些周是干旱的。一般来说,假阴性在许多应用中是相当危险的,例如新冠肺炎预测。相当于宣布一个病人没有病毒,而实际上他们是病毒携带者。不管是哪种情况,我认为我们已经尽了最大的努力来处理现有的数据。

政策建议

技术世界的当前趋势一次又一次地证明了一件事。他们证明了数据具有改变的力量。因此,无论是发达国家还是发展中国家的政府,都必须善用数据。不过,提醒一句。为了不使这篇文章比现在更长,我将简明扼要地总结这些政策建议。

  • a)索马里需要建立一个拥有最新设备的气象研究所,以观察干旱周期等天气现象。这将丰富全球组织基于卫星的数据,并使数据驱动的干旱预测任务变得容易得多。最终,这样的努力将最终形成一个干旱管理系统,当某些地区处于人道主义灾难的边缘时,该系统将发出黄色或红色警报。
  • b)索马里需要利用其强大的口头传统和人民的集体记忆来记录干旱的历史、地点、生命和牲畜损失方面的影响及其持续时间。通过根据频率、严重程度和持续时间将干旱分为不同级别来提升数据质量是非常重要的。
  • c)索马里必须尽一切可能解决极端天气状况的原因。非法木炭生产、过度放牧、商业卡特尔不负责任的用水,所有这些发展都需要受到抑制。事实上,除非目前的森林砍伐速度被遏制,否则情况不会很快好转——即使有数据科学的能力。
  • d)索马里应该与国际水技术专家合作,这些专家目前在开发雨水收集和保护系统方面处于世界领先地位。落下的少量雨水往往会在山洪暴发和无人看管的乡村景观中消失。在与饥荒的斗争中,可以做更多的事情来利用这一点。

非常感谢阅读。

参考

  1. 如何在 Python 中将一个时间序列转化为一个监督学习问题?https://machine learning mastery . com/convert-time-series-supervised-learning-problem-python/
  2. 数据为善:一场新的社会运动https://www . apexofinnovation . com/data-for-Good-A-New-Social-Movement/
  3. 罗伯特李哈登 2007 年索马里地质。
  4. 以色列水务专家帮助世界的 10 种方式https://www . Israel 21 c . org/10-ways-Israel-water-expertise-is-help-the-world/
  5. 机器学习的特征工程基础技术https://towards data science . com/Feature-Engineering-for-Machine-Learning-3a5e 293 a 5114
  6. 快速实时审查 2018 年索马里干旱反应,马克·杜布瓦、保罗·哈维和格林·泰勒。
  7. 使用卫星图像时间序列对陆地生态系统的近实时干扰探测:2011 年索马里的干旱探测。
  8. 基于 SPEI 的《2020 年索马里干旱的时空评估》, Sylus Kipnegeno,Justine Muhoro Nyaga,Abdi Zeila Dubow。
  9. 约翰·图基探索性数据分析,1977 年。

福祉数据:认知的范例?

原文:https://towardsdatascience.com/data-for-well-being-a-paradigm-of-awareness-c519c5499f41?source=collection_archive---------33-----------------------

变更数据

个人必须能够理解他们的选择的含义,以便为他们的数字生活做出好的决定

大卫·罗伊·哈登博士黄广林伊冯·洛博士

瓦尔德马尔·布兰德Unsplash 上拍摄的照片

数字化转型因其对进步和发展的益处而受到全球称赞。任何数字化转型组织的核心都是数据,每个人都可以安全地访问这些数据,以开发更好的产品、客户体验或收集更深入的业务见解。

将数据置于日常决策的中心需要改变个人技能和态度、组织结构、政策以及各方之间的关系。这些考虑突出了人类行为的问题,因为不同的社会和社会中的人们对数据驱动的信息技术手段会有不同的看法,但理想情况下,每个人都应该能够自由地做出符合他们自己对福祉的定义的知情选择。

福祉数据

如今,人们的数据不再是公共资产;它越来越多地被私人资助、收集和分析。政府机构、企业和个人之间也有一个广泛的共识,即数字技术、数据和人工智能应该有助于改善人类福利。然而,考虑到围绕个人数据披露和个人福祉之间权衡的辩论,所有利益相关者都必须事先承认数字技术、数据和人工智能可能会产生负面后果。

对一些人来说,大量收集和分享个人数据会降低个人福祉,因为这侵犯了隐私权。除此之外,如何处理和使用一个人的数据可能是更大的问题,因为围绕有针对性的广告、政治竞选甚至虚假信息的不安情绪越来越多。

作为被命名为“数字人道主义”(Meier,2015) [1]或“大数据促进发展”(Hilbert,2016) [2]的倡议的一部分,magal hes 和 Couldry (2021) [3]指出,积极的福祉成果可以来自“数据化”,即将生活的更多方面转换为数字数据,用于算法挖掘和半自动决策。

本文探讨了正在进行的数据管理工作是否以及如何假设个人意识到个人数据的披露和处理所带来的影响。

数据共享中同意的含义

有些情况下,共享信息的选择是由社会、社会的代表为了个人的“利益”而做出的。在使用速度限制、建筑物中危险材料的限制、获取武器方面——这些规定是由社会话语推动的,或者在某些情况下,是为了公民的利益而单方面颁布的法令。制定这些规则是基于这样一种假设,即每个人对这些限制的好处都有一定程度的认识。

GDPR 在这方面取得了长足进步,要求数据使用必须得到明确同意。然而,在没有验证用户对潜在影响的理解的情况下,我们质疑这样的法规是否为公司而不是消费者提供了法律保护。

先驱行为经济学家 Cass Sunstein 支持这一观点,他在最近的一本书中思考信息披露是否有助于改善人类福祉[4]。人们希望从组织获得服务或利益,他们同意分享他们的数据以换取这种效用——每当我们点击接受一组条款和条件时,我们都熟悉这种范式。

然而,桑斯坦认为许多同意协议是无效的;“全成本无收益”。相反,他们征收认知税——阅读和处理信息所涉及的成本——例如,让用户在参与某项交易之前阅读几页条款和条件。

当我们考虑世界各地的许多交易时,这种认知成本是显著的。通常,一个人不能完全理解他们所同意的事情,更不用说做出一个明智的决定,决定这是否对他们有利,或者如何为自己辩护。

人们普遍承认,在个人数据披露中获得同意的过程存在缺陷。例如,网站经常使用设计轻推,以便更容易接受而不是拒绝披露条款,并故意使隐私政策难以理解[5]。这阻碍了知情同意,并使这一过程更像是对合规性的粗略点头,而不是有意义的用户保护。尽管从技术上讲,用户可以获得所有相关数据来做出决策,但这也给他们带来了大量复杂冗长的信息。

对于这种要求消费者具有高认知负荷的同意程序,已经有了一些法规响应。例如,GDPR 规定,平台不能让用户默认同意被跟踪,如果这些 cookies 被消费者拒绝,也不能拒绝访问。但是,这并不能确保用户知道他们的个人数据将如何被收集和使用,也不能减少同意过程中涉及的认知税。人们仍然可以点击同意而不阅读和理解数据披露的全部条款。

健康同意

两种可能的解决方案可能会有所帮助。

首先,同意程序可能需要回答多项选择问题,以确保用户在继续之前理解这些条款。这些问题可以涵盖
i)他们的数据可以用于什么,以及
ii)他们的权利包括什么,例如擦除和访问的权利。
在此过程中,只有用户正确回答问题,同意才有效这证明他们知道他们的个人数据将被如何处理。

这里提出的第二个选择是使用同意管理器。这些机制允许消费者决定向组织提供什么样的数据,以及用于什么目的。用户可以表明他们愿意披露什么,而不是让数据收集者单方面设定使用条款。同意管理的功能可以由收集数据的组织提供,也可以由在个人和数据收集者之间进行协商的第三方平台提供。

当然,个人仍然可以违背自己的最大利益,没有任何解决方案可以始终保证用户得到积极的结果。但是,尽管对福祉的定义仍将存在分歧,但每个人都应该得到有效的理解,作为为自己的数字福祉做出决定的第一步。


**参考文献:**

[1] P .迈耶(2015)。数字人道主义者。佛罗里达州博卡拉顿:CRC。

[2] M .希尔伯特(2016)。大数据促进发展:前景与挑战回顾。发展政策评论,34(1),135-174 页。doi:10.1111/12142

[3]j . c . magal hes 和 N. Couldry (2021 年)。大技术、数据殖民主义和社会公益的重新配置。国际传播杂志,15,20。

[4]桑斯坦(2020 年)。信息太多:了解自己不想知道的东西。麻省理工出版社。

[5] C. Utz,m .德格林,S. Fahl & F. Schaub ( 2019,11 月 11 日–15 日)。(联合国)知情同意:实地研究 GDPR 同意通知。在英国伦敦举行的 ACM SIGSAC 计算机和通信安全会议上。doi:[10.1145/3319535.3354212](http://dx.doi.org/10.1145/3319535.3354212)

# TensorFlow 中用于训练的数据格式:拼花地板、Petastorm、羽毛等

> 原文:<https://towardsdatascience.com/data-formats-for-training-in-tensorflow-parquet-petastorm-feather-and-more-e55179eeeb72?source=collection_archive---------11----------------------->

## [理解大数据](https://towardsdatascience.com/tagged/making-sense-of-big-data)

## 通过统一不同类型的机器学习工作负载的文件格式来简化数据管理

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d9d4e1b4d0cf0f16de9657cd593055ee.png)

由[马克西姆·舒托夫](https://unsplash.com/@maksimshutov?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

机器学习是关于数据的。为了成功训练一个复杂的模型,你需要一个*高质量的*训练数据集;一个足够大、标注准确并正确表示现实世界中数据样本分布的数据集。然而,适当的数据管理同样重要。通过*数据管理*,我们指的是数据存储的方式和位置、数据访问的方式以及数据在开发生命周期中经历的转换。这篇文章的重点是用于存储训练数据的*文件格式*以及它对模型训练的影响。在定义机器学习项目时,选择文件格式是您需要做出的许多重要决定之一。

这个职位由四个部分组成。在第一部分中,我们将确定一些我们希望文件格式具有的属性。在第二部分中,我们将回顾潜在的文件格式,并根据我们发现的所需属性对它们进行评估。接下来,我们将调查将这些格式流式传输到 TensorFlow 培训课程的不同选项。在最后一节中,我们将描述我们运行的一些实验,以测试其中的一些选项。

在我们开始之前,让我们先做好准备。在本帖中,我们将假设我们的训练数据集的大小需要将其存储在分布式存储系统中,例如数百 TB。在下面的例子中,我们将使用亚马逊 S3 进行数据存储,但是原则同样适用于任何其他分布式存储系统。在开发周期中,数据可能会被几个消费者访问,用于各种目的,包括数据创建、数据分析、模型训练等等。我们的重点将是 TensorFlow 中的培训,尽管我们要说的大部分内容也适用于其他培训框架。

这篇文章的基本假设是我们的数据需要一种文件格式,即我们需要一个或多个文件用于:1。将单个数据样本的所有元素/列/特征组合在一起,以及 2。将多个数据样本分组在一起。当然,人们可以设想这样的场景,其中人们可以选择将所有样本的所有元素保存在单独的文件中,并以它们的原始格式保存。然而,在许多情况下,特别是如果文件很小(例如几千字节),这种策略可能会严重降低数据访问的运行时性能。

这篇文章的目的是强调选择文件格式时一些重要的考虑因素,并讨论一些目前可用的不同选项。我们将提到许多格式以及许多软件开发框架和工具。这些提及应该*而不是*被解释为认可。适合您的选择可能基于广泛的考虑,其中一些可能超出了本讨论的范围。这篇文章将包括一些简单的代码片段。这些仅用于演示目的,不应视为最佳实施。

机器学习工具的前景是极其动态的。我们将提到的一些格式和工具将继续发展,我们将做出的一些评论可能在您阅读本文时已经过时。注意跟踪新版本和新工具的发布,并确保根据最新的可用信息做出设计决策。

请不要犹豫,与我联系,提出任何意见或纠正。

# 文件格式的期望属性

为了便于讨论,让我们来看看 TensorFlow 中用于培训的一种常见文件格式,即 *TFRecord* 格式。

## TFRecord 格式

[*TFRecord*](https://www.tensorflow.org/tutorials/load_data/tfrecord) 是一种基于[协议缓冲区](https://developers.google.com/protocol-buffers/)的格式,专门设计用于 TensorFlow。一个 *TFRecord* 文件由序列化的二进制样本序列组成。每个样本代表一个 [tf.train.Example](https://www.tensorflow.org/api_docs/python/tf/train/Example?version=nightly) ,它又代表一个字符串到值映射的字典。 *TFRecord* 格式的顺序特性有助于提高数据流吞吐量。特别是,不需要下载并打开一个完整的文件来开始遍历其内容。此外, [TensorFlow tf.data](https://www.tensorflow.org/guide/data#consuming_tfrecord_data) 模块包括高度优化的 [TFRecordDataset](https://www.tensorflow.org/api_docs/python/tf/data/TFRecordDataset) 类,用于基于 *TFRecord* 文件中存储的数据构建输入管道。然而, *TFRecord* 格式并非没有缺点。这里我们列举几个:

**单一目的**:TF record*格式不太可能满足开发管道上任何其他数据消费者的需求。开发团队通常以不同的格式维护他们的数据,并专门为培训目的以 *TFRecord* 格式创建数据的派生。存储数据的多个副本并不理想,尤其是当数据集很大时。除了数据存储的额外成本,这意味着每次核心数据集发生变化时,都需要生成一个新的 *TFRecord* 副本。我们可能希望根据培训课程的发现更新核心数据记录,在这种情况下,我们还需要维护生成的 *TFRecord* 记录与核心数据格式中相应条目之间的映射。*

**提取部分记录数据**:当我们的训练模型只需要 *TFRecord* 元素的子集时, *TFRecord* 格式出现了另一个问题。例如,假设我们有一个多头模型,它对输入图像执行不同类型的像素级分割。数据集中的每个记录包含对应于模型的多个头部的多个地面实况图像。现在我们决定训练一个只有一个头部的模型。简单的解决方案是输入完整的 *TFRecord* ,忽略不必要的字段。然而,提取和解析无关数据的需求会严重影响我们输入管道的吞吐量,从而影响我们训练的速度。为了降低管道中的瓶颈风险,我们需要创建一个额外的数据副本,其中只包含与当前特定培训相关的内容。这进一步加剧了我们上面讨论的数据重复问题。

**记录过滤**:有时我们对遍历具有特定条目值的记录感兴趣。简单的方法是遍历所有数据,简单地删除任何不匹配我们的过滤器的记录(例如,使用 [tf.filter](https://www.tensorflow.org/api_docs/python/tf/data/Dataset?version=nightly#filter) )。和以前一样,这会给数据输入管道带来相当大的开销,并导致训练循环严重不足。在之前的帖子中(这里是[这里是](https://medium.com/@julsimon/making-amazon-sagemaker-and-tensorflow-work-for-you-893365184233)和[这里是](https://medium.com/@julsimon/deep-dive-on-tensorflow-training-with-amazon-sagemaker-and-amazon-s3-12038828075c),我们展示了根据输入图像是否包含粉色汽车来过滤输入图像的需求。我们提出的解决方案是将不同的数据类存储在不同的文件中。每当需要过滤时,我们可以只遍历与过滤器相关的文件。然而,这个解决方案要求我们能够预测我们将需要应用的过滤器,这并不总是可能的。如果我们需要应用一个我们没有预料到的过滤器,我们可以用一个额外的分区重新创建数据,或者使用丢弃不匹配样本的简单方法。这两个选项都不是最优的。

**数据转换**:典型的输入数据管道可能包括对输入数据的多种操作,包括数据扭曲、扩充、批处理等等。TensorFlow 提供了一组内置的数据处理操作,可以通过 [tf.data.Dataset.map](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#map) 函数添加到输入数据管道计算图中。但是,您可能会发现,使用 TensorFlow 无法高效地实现所需的数据处理。一种选择是使用 [tf.py_function](https://www.tensorflow.org/api_docs/python/tf/py_function) 应用原生 python 代码块,但是由于 [Python 全局解释器锁](https://wiki.python.org/moin/GlobalInterpreterLock) (GIL),这可能会限制您的数据吞吐量性能。许多用例要求在进入张量流计算图之前,使用一种能够在原生 python 中应用操作的格式。

## 格式要求

基于上面的讨论,让我们在我们的文件格式中编译一些我们正在寻找的属性的列表。考虑到存储我们数据的多个副本会增加成本和复杂性,我们将从现在开始限制自己只存储一个数据副本,也就是说,我们必须选择一种能够满足所有数据消费者需求的格式。该列表并不打算包含所有内容。应考虑基于特定用例的附加要求。

*   **分布式存储**:文件格式和支持库必须支持在分布式存储设置中存储大型数据集的选项,如亚马逊 S3、HDFS 等。
*   **软件生态系统**:我们需要一个强大的图书馆生态系统,为分析和操作数据提供一系列工具。
*   **列支持**:文件格式和支持库必须支持有效提取每个数据样本的特征子集。
*   **行过滤**:文件格式和支持库应支持对样本特征值的高效过滤。
*   **TensorFlow 集成**:格式必须有助于数据从存储器高效地流入 TensorFlow 培训课程。

我们在讨论中忽略的一个培训需求是**数据洗牌**。通常的做法是在每次遍历(历元)之前混洗训练数据。如果我们能够随机访问数据集中的任何样本,数据重组就很容易了。然而,这种对单个样本的随机访问是以牺牲性能为代价的,尤其是在分布式存储环境中。取而代之的是,人们必须求助于用于混洗的其他机制,包括以下各项的组合:在数据创建期间混洗样本、在构成完整数据集的文件列表上混洗、在多个数据集之间进行[交错](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#interleave),以及在训练期间使用适当大的混洗缓冲区(例如,参见 [tf.data.Dataset.shuffle](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#shuffle) )。我们选择不将混排作为文件格式的要求,因为在我们看来,在我们提出的培训场景中,这一挑战将存在于任何文件格式选择中。

在下一节中,我们将评估几种用于培训的文件格式的兼容性。在下一节中,我们将讨论将它们流式传输到 TensorFlow 的选项。

# 文件格式调查:镶木地板、花瓣和羽毛

对深度学习的数据格式的全面调查超出了本文的范围。我们将把讨论限制在几个强有力的候选人身上。更广泛的调查比比皆是。这里有一个例子:

</guide-to-file-formats-for-machine-learning-columnar-training-inferencing-and-the-feature-store-2e0c3d18d4f9>  

您还可以查看我最近的一篇帖子,它涵盖了相对较新的*[*web dataset*](https://github.com/tmbdev/webdataset)*格式,这是一个有趣的解决方案,专门面向希望尽可能以最原始的形式维护数据的开发人员。**

**我们将根据我们在上面选择的指标来衡量每种格式,如下图所示,其中总结了我们对 *TFRecord* 格式的评估。我们用绿色表示完全支持,黄色表示部分支持,红色表示不支持。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e0c3d41f16485e7b456809bc66b7fdc5.png)**

**TFRecord 评估**

## **阿帕奇拼花地板**

**更引人注目的文件格式选项之一是 [*Apache Parquet*](http://parquet.apache.org/) 。 *Apache Parquet* 有一个广泛的软件生态系统,它有多个框架和工具支持各种各样的数据处理操作。它在数据分析师中尤其受欢迎。将我们的培训建立在相同的形式上的可能性是很有吸引力的。**

***Parquet* 格式的成功主要归功于它是一种[列存储](http://en.wikipedia.org/wiki/Column-oriented_DBMS)格式。与 CSV 或 *TFRecord* 等其他格式相反,在列数据格式*中,数据的列*被存储在一起。数据集中的每个文件都被划分为行块,每个行块包含多个样本。在行块内,样本数据根据列存储,即所有样本的第一字段的值首先出现,然后是所有样本的第二字段的值,依此类推。格式的列性质有助于高效的数据分析,因为可以在列的子集上进行查询,而不需要加载整个数据记录。此外,将列组合在一起可以更有效地压缩数据,从而降低存储成本。查看[这篇文章](/understanding-apache-parquet-7197ba6462a9)了解更多关于列数据存储的优势。**

**下图总结了我们对拼花地板的评估:**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/408da82796163fa25fee7c130312d87b.png)**

**拼花地板评估**

**作为一种列格式, *Parquet* 能够有效地提取数据列的子集。此外,我们还可以利用格式的分栏特性,通过以下方式促进行过滤:1 .首先提取我们正在过滤的列,然后 2。仅对匹配过滤器的行提取其余的列。然而,由于有效的数据提取可能依赖于提取完整行块的列数据,因此不清楚这种方法是否能很好地执行。因此我们用黄色标记了这个能力。更高效的过滤方法可能需要在数据集创建期间根据类别将样本分离到不同的 *Parquet* 文件中,如上所述。在 [pyspark](https://spark.apache.org/docs/latest/api/python/) 中,这可以使用 [partitionBy](https://spark.apache.org/docs/2.4.0/api/python/pyspark.html?highlight=partitionby#pyspark.RDD.partitionBy) 功能来完成。**

****Parquet 数据集创建**:在下面的代码块中,我们演示了使用 [pyspark](https://spark.apache.org/docs/latest/api/python/) 库从流行的 [Cifar10](https://www.cs.toronto.edu/~kriz/cifar.html) 数据集创建一个 *Parquet* 数据集。其他库也支持拼花地板的创建,包括熊猫和 pyarrow。**

```
**from tensorflow.keras import datasets
from pyspark.sql import SparkSession, Row
from pyspark.sql.types import StructType, \
        StructField, IntegerType, BinaryTypedef cifar_to_parquet():
    schema = StructType(
                [StructField("image", BinaryType(), True),
                 StructField("label", IntegerType(), True)])
    (data, labels), _ = datasets.cifar10.load_data()
    labels = labels.flatten().tolist()
    num_procs = 4 *# set the number of parallel processes* spark = SparkSession.builder\
        .master('local[{num_procs}]'.format(num_procs=num_procs))\
        .getOrCreate()
    sc = spark.sparkContext num_samples = len(labels)
    output_url = 'file:///tmp/parquet' def row_generator(i):
        return {
            'image': bytearray(data[i].tobytes()),
            'label': labels[i],
        } *# optionally configure the size of row blocks
    # blockSize = 1024 * 1024 * 16 # 16 MB
    # sc._jsc.hadoopConfiguration()\
    #     .setInt("parquet.block.size", blockSize)* rows_rdd = sc.parallelize(range(num_samples))\
        .map(row_generator)\
        .map(lambda x: Row(**x)) spark.createDataFrame(rows_rdd, schema)\
        .write.mode('overwrite')\
        .parquet(output_url)**
```

**虽然组成数据集的文件数量、每个文件的大小以及每个行块的大小会对数据加载的性能产生有意义的影响,但控制这些参数有时会有点棘手。在 pyspark 中,可以使用 *sc 设置行块大小。_jsc.hadoopConfiguration* 如上面代码块中的注释所示(默认值为 128 MB),文件的大小和数量取决于并行进程的数量和 [coalesce](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html?highlight=partition#pyspark.sql.DataFrame.coalesce) 函数。**

**通过适当的配置,该脚本可以修改为直接写入亚马逊 S3(例如,参见此处的和此处的)。**

## **佩塔斯托姆**

**petastorm 库的创建有一个特定的目标,即统一开发管道上所有数据消费者使用的数据集(见[这里](https://www.infoq.com/presentations/petastorm-ml-pipelines/))。尽管 petastorm 抽象了底层存储格式,但使用的默认格式是 *Apache Parquet* 。更准确地说,petastorm 通过在 [Unischema](https://petastorm.readthedocs.io/en/latest/api.html#module-petastorm.unischema) 结构中提供额外的模式信息、支持多维数据和支持数据压缩编解码器来扩展 *Apache Parquet* 。此后,我们将假设使用扩展的 *Parquet* 作为底层格式,并滥用术语 *petastorm* 来指代库本身以及库创建的文件格式。为了区分这两者,我们在提到 *Petastorm* 格式时将使用大写。使用 *Parquet* 作为底层格式意味着 *Petastorm* 享有我们上面讨论的与使用列格式相关的所有好处。然而,使用 petastorm 引入的 *Parquet* 扩展有一个警告:数据集需要由 petastorm 库创建,开发管道上的所有数据消费者都需要 petastorm 库来正确读取和解析数据。这个要求有些限制,因为 *Parquet* 格式最吸引人的属性之一是其用于访问和操作数据的广泛的软件生态系统。正是因为这个原因,我们在下面的评估图中用黄色标记了*软件生态系统*:**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/410fd4587888386e944f1c502eef8e37.png)**

**Petastorm 评估**

**Petastorm 包括许多其他引人注目的特性,包括对行组索引和 n 元语法的支持。你可以在这里和这里了解更多关于 petastorm [的信息。](https://eng.uber.com/petastorm/)**

****Petastorm 数据集创建**:PETA storm 中的数据集创建与 pyspark 中的 *Parquet* 创建非常相似。主要区别在于使用了 [Unischema](https://petastorm.readthedocs.io/en/latest/api.html#module-petastorm.unischema) 和包装数据集创建的 *materialize_dataset* 上下文。**

```
**from petastorm.codecs import CompressedImageCodec, \
        NdarrayCodec, ScalarCodec
from petastorm.etl.dataset_metadata import materialize_dataset
from petastorm.unischema import Unischema,\
        UnischemaField, dict_to_spark_row
from pyspark.sql import SparkSession
from pyspark.sql.types import IntegerTypedef cifar_to_peta():
    MySchema = Unischema('MySchema', [
        UnischemaField('image', np.uint8,
                       (32,32,3), NdarrayCodec(), False),
        UnischemaField('label', np.uint8,
                       (), ScalarCodec(IntegerType()), False),
    ])
    (data, labels), _ = datasets.cifar10.load_data()
    labels = labels.flatten().tolist()
    num_procs = 4 *# set the number of parallel processes* spark = SparkSession.builder.\
        master('local[{num_procs}]'.format(num_procs=num_procs))\
        .getOrCreate()
    sc = spark.sparkContext num_samples = 100*#len(labels)* output_url = 'file:///tmp/petastorm'
    rowgroup_size_mb = 128 def row_generator(i):
        return {
            'image': data[i],
            'label': np.uint8(labels[i]),
        } *# Wrap dataset materialization portion.
    # Will take care of setting up spark environment variables as
    # well as save petastorm specific metadata* with materialize_dataset(spark, output_url,
                             MySchema, rowgroup_size_mb):
        rows_rdd = sc.parallelize(range(num_samples)) \
            .map(row_generator) \
            .map(lambda x: dict_to_spark_row(MySchema, x)) spark.createDataFrame(rows_rdd, 
                              MySchema.as_spark_schema()) \
            .write \
            .mode('overwrite') \
            .parquet(output_url)**
```

**行块大小由 *rowgroup_size_mb* 参数在 petastorm 中确定。在这个例子中,我们没有利用 petastorm 中包含的编解码器支持。当使用大数据元素时,使用编解码器支持可以显著压缩数据并节省存储成本。**

## **羽毛**

**[羽毛文件格式](https://arrow.apache.org/docs/python/feather.html)是我们考虑的另一种纵列格式,因为它包含在 [TensorFlow I/O](https://www.tensorflow.org/io) 中(更多信息见下文)。虽然 *Feather* 和 *Parquet* 之间有许多相似之处,但是它们不同的底层实现也有许多细微的差异。两者之间的一个很好的比较,包括场景中*羽毛*可能是更好的选择,可以在[这里](https://ursalabs.org/blog/2020-feather-v2/#:~:text=Parquet%20is%20fast%20to%20read,is%20even%20faster%20to%20read.&text=In%20the%20case%20of%20Feather,converting%20to%20R%20or%20pandas.)找到。区分*羽化*格式的版本 1 和版本 2 很重要。版本 2 支持更多的数据类型以及不同类型的数据压缩。每当你遇到*羽*的评论,切记它可能是基于格式的版本 1。**

**羽毛和 T21 的主要区别在于软件生态系统的范围。尽管它得到了诸如 [pyarrow](https://arrow.apache.org/docs/python/feather.html) 和 [pandas](https://pythontic.com/pandas/serialization/feather) 等库的支持,但在撰写本文时, *Feather* 格式远没有 *Parquet* 那么流行,而且支持框架的数量也非常有限。我们在下图中总结了我们的*羽*文件格式评估:**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/410fd4587888386e944f1c502eef8e37.png)**

**羽毛评价**

**作为列格式,对于我们如何选择对*列支持*和*行过滤*属性进行评级,存在与上述相同的考虑因素。**

****羽毛数据集创建**:在下面的代码块中,我们演示了使用 [pyarrow](https://arrow.apache.org/docs/python/feather.html) 创建一个*羽毛*文件。*羽毛*创作支持也被内置到[熊猫](https://pythontic.com/pandas/serialization/feather)库中。在之前的数据集创建中,流程并行化是数据创建代码不可或缺的一部分,与此相反,我们在这里演示了单个文件的创建。完整的解决方案需要生成多个进程,负责创建构成完整数据集的文件的不相交子集。**

```
**from tensorflow.keras import datasets
import pyarrow as pa
from pyarrow.feather import write_featherdef cifar_to_feather():
    (data, labels), _ = datasets.cifar10.load_data()
    data = [data[i].flatten() for i in range(data.shape[0])]
    labels = labels.flatten()
    table = pa.Table.from_arrays([data,labels], ['data','labels'])
    write_feather(table, '/tmp/df.feather', chunksize=10000)write_feather(table, '/tmp/df.feather', chunksize=10000)**
```

**在上面的例子中,行块的大小由参数 *chunksize* 决定。注意,与前面的格式创建相反,我们通过每个块的记录数而不是每个块的内存量来确定大小。**

# **使用替代文件格式的 TensorFlow 培训**

**现在,我们将注意力转向上面列出的最后一个要求,文件格式与 TensorFlow 培训的兼容性。无论您选择的文件格式有多么吸引人,如果您不能将其应用到培训课程中,或者输入流的速度不能满足您的需求,那么您就又回到了起点。在本节中,我们将探索一些工具,用于在 TensorFlow 中使用上述文件格式进行培训。在接下来的部分中,我们将在一些实验中测量输入流的速度。我们的讨论是基于 [TensorFlow](https://www.tensorflow.org/) 的 2.4.1 版本、 [TensorFlow I/O](https://www.tensorflow.org/io) 的 0.17.1 版本和 [petastorm](https://petastorm.readthedocs.io/en/latest/index.html#) 的 0.11.0 版本。**

## **张量流数据集 API**

**在一个典型的 TensorFlow 应用程序中,我们定义了一个 [tf.data.Dataset](https://www.tensorflow.org/api_docs/python/tf/data/Dataset) ,它表示一系列数据样本,并将其送入训练循环。建立一个 [tf.data.Dataset](https://www.tensorflow.org/api_docs/python/tf/data/Dataset) 包括定义数据源和对数据应用转换。源可以是存储在内存或文件中的数据。查看[此处](https://www.tensorflow.org/guide/data)了解更多关于如何在 TensorFlow 中创建数据集的信息。既然我们已经选择了 *TFRecord* 格式作为我们的参考点,那么让我们从回顾如何将 *TFRecord* 文件输入到 TensorFlow 培训会话开始。**

****TFRecordDataset:** 一个 [TFRecordDataset](https://www.tensorflow.org/api_docs/python/tf/data/TFRecordDataset) 将一列 *TFRecord* 文件作为输入,并产生一系列序列化的 *TFRecord* 数据样本。之后通常会有一个 [tf.data.Dataset.map](https://www.tensorflow.org/api_docs/python/tf/data/Dataset?version=nightly#map) 调用,在这个调用中会对每个样本进行解析。下面的代码块演示了从以 *TFRecord* 格式存储的 [Cifar10](https://www.cs.toronto.edu/~kriz/cifar.html) 数据创建 [TFRecordDataset](https://www.tensorflow.org/api_docs/python/tf/data/TFRecordDataset) :**

```
**import tensorflow as tf
def get_dataset():
    autotune = tf.data.experimental.AUTOTUNE
    def parse(example_proto):
        feature_description = {
            'image': tf.io.FixedLenFeature([], tf.string),
            'label': tf.io.FixedLenFeature([], tf.int64)}
        features = tf.io.parse_single_example(example_proto,          
                                         feature_description)
        image = tf.io.decode_raw(features['image'], tf.uint8)
        image = tf.reshape(image, [32, 32, 3])
        return image, label

    records = tf.data.Dataset.list_files(<path_to_files>+'/*')
    ds = tf.data.TFRecordDataset(records, 
                     num_parallel_reads=autotune)
    ds = ds.map(parse, num_parallel_calls=autotune)
    return ds**
```

**我们对 [TFRecordDataset](https://www.tensorflow.org/api_docs/python/tf/data/TFRecordDataset) 的体验总体上是积极的;拉取和解析文件的底层机制似乎相当可靠,我们很少发现自己在管道的这一部分遇到瓶颈。我们还发现该 API 非常健壮,在各种各样的培训环境中都表现良好。**

**TensorFlow 有几个其他的 tf.data.Dataset 类用于直接从文件加载数据,包括 [FixedLengthRecordDataset](https://www.tensorflow.org/api_docs/python/tf/data/FixedLengthRecordDataset) 和 [TextLineDataset](https://www.tensorflow.org/api_docs/python/tf/data/TextLineDataset) 。从与任何现有类都不匹配的文件格式构建 TensorFlow 数据集需要更多的创造力。这里我们将按照复杂程度的升序来提到三个选项。**

****从内存源**创建数据集:第一个选项是下载并解析 Python 中的文件(在 TensorFlow 之外)并将数据样本从内存源加载到 TensorFlow 中。一种方法是使用[TF . data . dataset . from _ generator](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator),如下面的伪代码块所示。**

```
**import tensorflow as tf
def get_custom_ds(file_names):
    def my_generator():
        for f in file_names:
            # download f
            samples = ... # parse samples from f
            for sample in samples:
                yield sample return tf.data.Dataset.from_generator(
                  my_generator,
                  output_types=[tf.uint8,tf.uint8],
                  output_shapes=[[32,32,3],[]])**
```

****解析 TensorFlow** 中的文件:第二种选择是依赖 TensorFlow 的 [tf.io](https://www.tensorflow.org/api_docs/python/tf/io) 模块来下载和解析文件。与之前的解决方案相比,这里的文件管理是 TensorFlow 执行图的一部分。下面是一种使用[TF . data . dataset . list _ files](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#list_files)和[TF . data . dataset . interleave](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#interleave)API 的方法:**

```
**import tensorflow as tf
def get_custom_ds():
    autotune = tf.data.experimental.AUTOTUNE
    filenames = tf.data.Dataset.list_files(<path_to_files>+'/*',
                           shuffle=True)
    def make_ds(path):
        bytestring = tf.io.read_file(path)
        samples = ... # parse bytestring using tf functions
        return tf.data.Dataset.from_tensor_slices(samples) ds = filenames.interleave(make_ds, 
                         num_parallel_calls=autotune,
                         deterministic=False)
    return ds**
```

****创建自定义数据集类**:我们提到的最后一个选项是创建一个新的 tf.data.Dataset 类,专门用于处理您的数据格式。这种选择需要最高超的技术。根据数据输入流的速度来衡量,它还提供了最高的潜在回报。实现这一点的一种方法是修改 TensorFlow C++代码,[从源代码](https://www.tensorflow.org/install/source)重新构建 TensorFlow。例如,可以克隆 TFRecordDataset 实现,只覆盖与解析格式特别相关的代码部分。通过这种方式,人们希望能够享受与 TFRecordDataset 相同的性能优势。这种方法的缺点是需要维护一个专门的 TensorFlow 版本。特别是,每次升级到 TensorFlow 的新版本时,您都需要重新构建您的自定义解决方案。请注意,自定义数据集类创建也可以在 TensorFlow I/O 中实现,而不是在 TensorFlow 中实现,如[这篇](/how-to-build-a-custom-dataset-for-tensorflow-1fe3967544d8)帖子中所述。**

**虽然上述任何解决方案都可以进行适当的调整以最大限度地提高性能,但这并不总是那么容易。更糟糕的是,您可能会发现理想的配置(例如,底层系统流程的数量)可能会因培训环境的不同而有很大差异。从这个意义上来说,使用一个专用的数据集类(比如 TFRecordDataset)比我们已经描述过的定制解决方案有更大的优势。接下来我们将看到的两个解决方案将使用专门为我们选择的文件格式设计的数据集类。**

## **张量流输入/输出**

**[TensorFlow I/O](http://TensorFlow I/O) (tfio)是 TensorFlow 的一个扩展包,增加了对 TensorFlow 中不包含的许多文件系统和文件格式的支持。特别是,tfio 定义了用于创建基于 *Feather* 格式的数据集的[tfio . arrow . arrow Feather dataset](https://www.tensorflow.org/io/api_docs/python/tfio/arrow/ArrowFeatherDataset)类和用于创建基于 *Parquet* 格式的数据集的[tfio . v 0 . io dataset . from _ Parquet](https://www.tensorflow.org/io/api_docs/python/tfio/v0/IODataset#from_parquet)函数。**

****tensor flow I/O Feather Dataset**:[tfio . Arrow . Arrow Feather Dataset](https://www.tensorflow.org/io/api_docs/python/tfio/arrow/ArrowFeatherDataset)类只是设计用于支持 [Apache Arrow](https://arrow.apache.org/) 格式的[API 集合](https://www.tensorflow.org/io/api_docs/python/tfio/arrow)中的一个。要全面了解 tfio [Apache Arrow](https://arrow.apache.org/) 产品,请务必查看[这个](https://blog.tensorflow.org/2019/08/tensorflow-with-apache-arrow-datasets.html)博客。在下面的代码块中,我们演示了基于我们在上面创建的以 *Feather* 格式存储的 Cifar10 数据的[tfio . arrow . arrow Feather dataset](https://www.tensorflow.org/io/api_docs/python/tfio/arrow/ArrowFeatherDataset)的使用。**

```
**import tensorflow as tf
import tensorflow_io.arrow as arrow_iodef get_dataset():
    filenames = <list of feather files>
    ds = arrow_io.ArrowFeatherDataset(filenames, 
                          columns=(0, 1),
                          output_types=(tf.uint8, tf.uint8),
                          output_shapes=([32*32*3,], []),
                          batch_mode='auto')
    ds = ds.unbatch()
    return ds**
```

**通过将 *batch_mode* 参数设置为*‘auto’*,我们选择让数据集返回 *Parquet* 行块。因此,我们应用的第一个调用是[解锁](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#unbatch)记录,以便返回单个样本。这种策略应该比单独读取样本产生更好的性能。**

**我们发现,如果将[tfio . arrow . arrow feather dataset](https://www.tensorflow.org/io/api_docs/python/tfio/arrow/ArrowFeatherDataset)与[TF . data . dataset . interleave](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#interleave)结合使用,吞吐量性能会有所提高:**

```
**import tensorflow as tf
import tensorflow_io as tfiodef get_dataset():
    autotune = tf.data.experimental.AUTOTUNE
    filenames = tf.data.Dataset.list_files(<path_to_files>+'/*',
                           shuffle=True)
    def make_ds(file):
        ds = arrow_io.ArrowFeatherDataset(
                     [file], [0,1],
                     output_types=(tf.uint8, tf.uint8),
                     output_shapes=([32*32*3,], []),
                     batch_mode='auto')
        return ds
ds = filenames.interleave(make_ds,       
                              num_parallel_calls=autotune,
                              deterministic=False)
    ds = ds.unbatch()    
    return ds**
```

****TensorFlow I/O 拼花数据集**:与 *Feather* 数据集类相反, [from_parquet](https://www.tensorflow.org/io/api_docs/python/tfio/v0/IODataset#from_parquet) 函数接收单个*拼花*文件。但是,我们可以通过在以 *Parquet* 格式存储的 Cifar10 数据集上使用[TF . data . dataset . interleave](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#interleave)来克服这一限制,如下所示:**

```
**import tensorflow as tf
import tensorflow_io as tfiodef get_dataset():
    autotune = tf.data.experimental.AUTOTUNE
    filenames = tf.data.Dataset.list_files(<path_to_files>+'/*',
                           shuffle=True)
    def parquet_ds(file):
        ds = tfio.IODataset.from_parquet(file, 
               {'image': tf.string, 
                'label': tf.int32})
        return ds
ds = filenames.interleave(parquet_ds,       
                              num_parallel_calls=autotune,
                              deterministic=False)
    def parse(example):
        image = tf.io.decode_raw(example['image'], tf.uint8)
        image = tf.reshape(image, [32, 32, 3])
        label = example['label']
        return image, label
    ds = ds.map(parse,num_parallel_calls=autotune)

    return ds**
```

## **佩塔斯托姆**

**petastorm 库 [TensorFlow API](https://petastorm.readthedocs.io/en/latest/readme_include.html#tensorflow-api) 定义了 *make_petastorm_dataset* 函数,用于从 petastorm 阅读器(petastorm.reader.Reader)创建 TensorFlow tf.data.Dataset。这个数据集的源可以是 *Petastorm* 格式,也可以是 raw *Parquet* 格式。为了从 *Petastorm* 格式的数据集中读取,我们使用 make_reader API 创建读取器。为了从一个 *Parquet* 格式的数据集中读取数据,我们使用 make_batch_reader API 创建读取器。这里的表[中描述了两个阅读器之间的一些微妙差异](https://petastorm.readthedocs.io/en/latest/readme_include.html#non-petastorm-parquet-stores)。请注意,从 *Petastorm* 格式创建的 TensorFlow tf.data.Dataset 返回单个数据样本的序列,而从 raw *Parquet* 格式创建的 TensorFlow tf.data.Dataset 返回批量数据样本,其大小由 *Parquet* 行组大小决定。**

**在下面的代码块中,我们演示了如何使用*make _ PETA storm _ dataset*API 从以 *Petastorm* 格式存储的 Cifar10 数据创建 TensorFlow tf.data.Dataset。**

```
**from petastorm import make_reader
from petastorm.tf_utils import make_petastorm_datasetdef get_dataset():
    with make_reader('<path to data>') as reader:
        ds = make_petastorm_dataset(reader)
    return ds**
```

**在下面的代码块中,我们演示了如何使用*make _ PETA storm _ dataset*API 从以 *Parquet* 格式存储的 Cifar10 数据创建 TensorFlow tf.data.Dataset。**

```
**from petastorm import make_batch_reader
from petastorm.tf_utils import make_petastorm_datasetdef get_dataset():
    autotune = tf.data.experimental.AUTOTUNE
    with make_batch_reader('<path to data>') as reader:
        ds = make_petastorm_dataset(reader)
    ds = ds.unbatch()
    def parse(example):
        image, label = example
        image = tf.io.decode_raw(image, tf.uint8)
        image = tf.reshape(image, [32, 32, 3])
        return image, label
    ds = ds.map(parse,num_parallel_calls=autotune)
    return ds**
```

**注意我们如何使用 [unbatch](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#unbatch) 例程来返回单个样本。**

# **结果**

**在这一部分,我们分享几个实验的结果。所有实验都在一个 c5.2xlarge [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)(有 8 个 vCPUs)上运行,TensorFlow 版本为 2.4.1,TensorFlow I/O 版本为 0.17.1,petastorm 版本为 0.11.0。实验分为两部分。首先,我们尝试了以我们讨论过的文件格式存储的 Cifar10 数据输入 TensorFlow 会话的不同方法。我们创建了数据的多个副本,以便人为地夸大数据集。对于这些实验,我们选择将训练批量设置为 1024。**

**为了评估样本记录的大小如何影响相对性能,我们运行了第二组测试,其中我们向每个 Cifar10 数据样本添加了一个大小为 2 MB 的随机字节数组。对于这些实验,我们选择将训练批量设置为 16。**

**对于所有实验,数据集被分成大小为 100-200 MB 的基础文件。**

**因为我们只对测量训练数据吞吐量感兴趣,所以我们选择放弃构建训练模型,而是直接在 TensorFlow 数据集上迭代,如下面的代码块所示。**

```
**import time
ds = get_dataset().batch(batch_size)
round = 0
start_time = time.time()
for x in ds:
    round = round + 1
    if round % 100 == 0:
        print("round {}: epoch time: {}".
                format(round, time.time() - start_time))
        start_time = time.time()
    if round == 2000:
        break**
```

**注意,在 petastorm 的情况下,数据集遍历必须移动到 petastorm 阅读器上下文中。**

**我们分享这些结果的目的是让你知道你的出发点是什么,以及可能需要的优化工作量。我们强烈建议不要从这些结果中得出任何关于您自己的使用案例的结论,原因如下:**

1.  **解决方案的性能可能会因模型、数据集和培训环境的不同而有很大差异。**
2.  **对于给定的用例,每个解决方案的性能将根据如何配置格式和 TensorFlow 数据集的具体情况而有所不同,包括:每个文件的大小、行组的大小、压缩方案的使用、工作进程的数量、每个样本批次的大小等等。**
3.  **实验通过直接迭代 TensorFlow 数据集来测量解决方案的最大吞吐量。在实践中,吞吐量需要足够高,以保持培训会话繁忙。换句话说,只要我们没有遇到 IO 瓶颈,我们可能会非常满意低于最大值的吞吐量。**
4.  **当你读到这篇文章的时候,我用过的库的版本可能已经过时了。较新版本的库可能包含影响其性能的更改。**
5.  **最后但并非最不重要的是,我的实验中出现错误的可能性。当你找到他们时,请给我写信。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1b661c54b92934da0112f5a386ff67f5.png)**

**测试结果(每步秒数越少越好)**

**结果证明了 *TFRecord* 格式和 *TFRecordDataset* 的实力。特别是,我们可以看到它们在不同环境下的稳定性。与此同时,其他一些实验产生的训练量相比之下并不逊色。虽然我们发现结果令人鼓舞,但在我们测试的两个案例中,必须注意替代解决方案的不稳定性。在一个场景中表现良好的解决方案(与 *TFRecord* 格式相比)在另一个场景中似乎会失效。看起来,与使用 *TFRecord* 格式*相比,*将其他格式用于不同的培训设置可能需要一些额外的工作。鉴于我们在本帖中讨论的替代格式的优势,这种努力可能是值得的。**

**另一个感兴趣的指标是与每个选项相关的 CPU 利用率。在最近的一篇博客文章中,我们讨论了由于一个或多个 CPU 达到最大利用率而导致培训管道中出现瓶颈的可能性。在担心这种可能性的情况下,明智的做法是评估与数据存储相关的不同决策如何影响加载和解析数据的 CPU 利用率。其中包括文件格式的选择、数据压缩(和解压缩)、TensorFlow 数据集创建方法等等。在下面的图表中,我们列出了 Cifar10 实验中三个性能最高的解决方案的平均 CPU 利用率。CPU 利用率是从[亚马逊 CloudWatch](https://aws.amazon.com/cloudwatch/) 的[亚马逊 EC2 实例指标](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html#ec2-cloudwatch-metrics)中获取的。由于我们使用的实例有 8 个 vCPUs,因此最大利用率为 800%。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/957d6ba12e7a44cca5c0b3e9415d450a.png)**

**CPU 利用率(800%之外—越低越好)**

# **摘要**

**尽管 TensorFlow 明显偏向于 *TFRecord* 格式,但它的一些属性仍不尽如人意。虽然 *TFRecord* 格式对于训练来说很棒,但是它不太可能适合开发管道中数据的任何其他消费者。在本帖中,我们讨论了几种更好地解决整体项目需求的格式,并评估了它们与 TensorFlow 培训的兼容性。虽然可能需要一些努力来支持不同的训练场景,但是我们的结论是有合法的替代方法来代替 *TFRecord* 格式。**

# 数据融合:谷歌云数据仓库的无代码管道

> 原文:<https://towardsdatascience.com/data-fusion-a-code-free-pipeline-for-your-google-cloud-data-warehouse-5b31dd4be91e?source=collection_archive---------15----------------------->

## 无需专业技能,只需几天而不是几个月就能建立企业级端到端数据平台

尽管过去五到十年发布了大量基于云的大数据平台和应用程序,但创建数据仓库通常仍是一项艰巨的任务,需要独特的技术技能来设计、设置和日常操作。在将数据融合添加到其 SaaS 解决方案组合后,谷歌云旨在提供一种解决方案来克服这些挑战,并让每个用户都有能力创建和管理企业级数据平台。

这是及时的,因为对于许多公司来说,新冠肺炎不仅严重破坏了现有的数据源和商业智能操作和仪表板,还造成了快速使用数据的额外压力。与此同时,经济的不确定性削减了预算和资源。如今,几乎每个人都比以往任何时候更需要更简单的解决方案,由于其直观的拖放式用户界面,数据融合可以为许多组织提供极大的帮助。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5cfed313a012313d9e80395e23b4b417.png)

照片由[西格蒙德](https://unsplash.com/@sigmund?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 拍摄

# 用例

关于数据融合的公开或社区内容仍然很少,即使它已经在谷歌云平台上普遍[提供了一年多](https://cloud.google.com/blog/products/data-analytics/introducing-the-code-free-bridge-to-data-analytics-on-google-cloud)。即使数据融合仍然处于初级阶段,我也想分享我的印象,并解释它是如何信守承诺的。也就是说,

> 数据融合如何允许在几天而不是几个月内建立一个端到端的数据仓库,

同时满足以下要求:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d4760313635bf0a0e44e4a02afd08ceb.png)

维克多·加西亚在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

1.每天接收由单租户服务器集群产生的数百千兆字节的压缩数据;

2.定期为每个实体制作 PDF 报告;

3.为一些团队成员提供商业智能工具,他们可以修改现有的仪表板,创建新的仪表板,并通过简单的用户界面查询和可视化最新数据;

4.为未来的机器学习敞开大门。

它还满足了这种性质项目的严格限制,包括

5.零资本支出和低运营支出的基于消费的成本模式;

6.尽可能多的 SaaS 和自助服务;和

7.最少量的编码或高度技术性的操作;

# 示例架构

> 数据融合本质上是协调所有的管道步骤,从第三方数据的**摄取**,到转换数据到分析数据库的**加载**。 [Data Studio](https://datastudio.google.com/overview) 然后根据转换后的数据创建商业智能报告。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4f1020d5cafdacac710ecc8074ae4b14.png)

利用数据融合、云存储、大查询和 Data Studio 的数据平台的架构图。作者图解。

请注意,数据融合与谷歌的大部分产品组合无缝集成,因此这里提到的几个解决方案可以被其他谷歌云产品取代。例如,这个用例使用[云存储](https://cloud.google.com/storage)作为数据湖,使用[大查询](https://cloud.google.com/bigquery)作为数据仓库,但是存在许多替代方案。在本例中,管道经过以下步骤:

## 1.摄入谷歌云存储

Blob 存储是构建存储原始和非结构化数据的数据湖的明显候选,这是摄取步骤将首先存储数据的地方。数据融合为大多数数据源提供了连接器,包括存储帐户、其他公共云、FTP、Oracle 等数据库等。还有许多方法可以将原始文件发送到谷歌云存储,从高度自动化的解决方案和传输实用程序到依赖虚拟机的更多手动解决方案。

## **2。数据融合工作流程**

数据融合提供了一个易于使用的拖放用户界面来创建数据管道,称为集成。集成允许用户创建具有三种类型元素的管道:

1.  数据源——比如谷歌云存储
2.  转换,位于输入和输出之间
3.  汇,即输出——比如 Big Query,这是谷歌著名的 SaaS 数据仓库解决方案,专门用于分析工作负载

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/21732e8f865f4208552aee9cf31d54eb.png)

数据融合的基本工作流程:数据输入(源)-转换-数据输出(汇)。作者截图。

每个管道必须至少包含一个源和一个接收器(数据融合不允许“空”箭头)。

**示例**

在从 Google Gloud 存储中读取所有匹配的文件名后,我们的第一个 ETL 管道分为两个路径:

第一个用处理 CSV 文件的内容

*   用 Javascript 编写的第一个逐行转换,
*   一个解析 CSV 文件的“牧马人”,
*   大型查询的接收负载

第二个示例使用

*   Group By 和 Count 计算文件中的记录数,
*   添加时间戳的 Javascript 转换,
*   一个大型查询接收负载,
*   最后是文件移动,在成功加载后将文件归档到不同的 Google 云存储目录中。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/97b0853e3fd5d4decf7163a6e69c3e94.png)

数据融合示例工作流从云存储接收数据,并将转换后的数据插入到大查询中。作者截图。

数据融合始终依赖于强类型模式,因此每次转换都会接收到可预测的输入并产生可预测的输出。例如,Google Cloud Storage reader 会将每个逐行读取的属性传递给下一个转换:一个字符串“body”表示行的内容,一个字符串“path”表示文件路径。当需要逐记录而不是逐行读取输入文件时,也可以使用 XML 阅读器。

**转换**

数据融合提供的最强大的工具是数据转换,其中包括[牧马人](https://en.wikipedia.org/wiki/Data_wrangling)。

> wrangler 允许用户使用直观的图形用户界面解析平面文件。从逐行加载的样本原始数据文件开始,用户可以解析、重命名和改变变量类型、添加或删除列、提取和分解数据等。所有的操作都在一个被称为“配方”的转换列表上被同时跟踪。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/49d3150575a68cf81a754c9ae15600fa.png)

Data Fusion wrangler 用于在平面文件上定义由 14 个转换步骤组成的配方。作者截图。

一旦定义了争论的步骤,配方中的指令列表就应用于管道中的转换。执行时,转换会将其输入模式中的输入行转换为输出模式。数据融合并不总是直接更新 wrangler 转换中的输出模式,但是配方和模式都可以导出为 JSON 文件,并通过数据融合导入。该食谱还与谷歌数据准备共享相同的语言,谷歌数据准备是一个稍微更强大的工具,但需要单独的许可证。

数据融合提供了许多其他对于更复杂的管道不可或缺的转换:规范化/反规范化、XML 解析等。虽然不总是像气流等效物那样通用,但是数据融合转换提供了全面的功能覆盖。JavaScript 是一种必然有用的转换。由于数据融合仍然是一个相对较新的解决方案,在某一点上,它将缺乏一个功能。这就是 JavaScript 转换变得方便的地方。需要添加时间戳,但没有管理时间戳或文件名的转换?没问题,一个三行脚本就能搞定。

## **3。大查询**

转换的输出可以发送到各种数据存储和数据库,其中大查询将成为数据仓库的基础。数据融合 BigQuery 接收器将转换产生的数据转换为附加在 BigQuery 表中的行。请注意,在创建表时,BigQuery 不需要显式定义的模式,在这种情况下,当第一行插入表中时,将记录模式。虽然很方便,但是管理数据融合和大型查询之间的模式更改可能很困难,尤其是在数据仓库创建的早期阶段。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4961e9b64e2804dd3dbb67f6fe5bd6cb.png)

存储转换数据的大型查询数据仓库。作者截图。

数据融合可以反过来从大查询中读取数据,以便转换数据和创建更复杂的管道。相对简单的数据转换的另一种替代方法是使用大查询计划查询:这些查询将在计划的时间运行,从给定的表中选择数据,并将输出写入新的表中。

## **4。数据工作室**

Data studio 是谷歌的 SaaS 数据可视化工具。它是免费的,并与 Big Query 紧密集成,因此

*   使用 SQL 语言,可以使用从大型查询表中检索到的数据即时创建和更新可视化效果
*   反之亦然,来自大查询 GUI 的查询输出可以立即导出并在 Data Studio 中可视化

Data Studio 希望输入相对结构化的数据,并且与 PowerBI 等竞争工具相比,它提供的过滤或聚合功能较少,因此拥有正确的 SQL 脚本和一些预处理表非常重要。一旦理解了这一点,Data Studio 提供了一个极其高效的框架,几乎可以立即检索、编辑、发布和导出报告为 PDF。此外,可以在 SQL 查询中直接考虑报告中的参数,从而可以轻松地为各种配置或每个实体生成报告。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e8281b8bb06714dc7cd7a3604e767dcf.png)

Data Studio 查询大查询数据仓库,为用户构建商业智能报表。作者截图。

# **结论**

> 无代码数据管道:数据融合信守承诺

通过提供图形用户界面,允许非技术用户在几天内创建数据管道,Data Fusion 优雅地处理了一个业务问题,否则需要更复杂的技术堆栈*。本文中提到的所有 Google 云解决方案几乎总是彼此无缝集成,使得任何用户都可以轻松使用所有不同的组件,而无需任何技术配置或代码行。

> 数据融合是一个相对较新的解决方案,还有待改进

不过,一个例外是数据融合的最初几天,不幸的是,这带来了一系列神秘的错误和可用性故障。它甚至在第一次执行后就开始了:数据融合的默认资源需求超过了 Google Cloud 试用帐户配额,这只有在深入研究日志文件后才能理解。也许更重要的是,大多数用户输入不会在 GUI 中得到验证,而只会在管道预览期间得到验证。基本错误(如打字错误)通常会导致模糊错误,仅在精细日志中报告。谷歌必须迅速改善这一点,以确保新用户不会感到沮丧,尤其是 Azure 和 AWS 上的竞争解决方案往往能更好地处理这一问题。最后,维护独立的环境和版本也很困难。如果没有数据融合的专用功能,这些任务中的大多数必须使用导出和导入来手动处理。治理和访问控制也是如此:用户可以按照自己的意愿自由地改变事情,但这可能会以稳定性和复杂性为代价。

> 数据融合对许多公司来说看起来很有前途

Data Fusion Enterprise edition 的标价约为 3000 美元/月,此外还有每个管道执行所收取的 [Dataproc](https://cloud.google.com/dataproc) (Hadoop)成本。目前还不清楚有多少客户在使用数据融合,但数据融合解决了许多公司面临的一个真正的业务问题,因此应该有一个光明的未来。

*[ [气流](https://en.wikipedia.org/wiki/Apache_Airflow)(云作曲) [Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop) (Dataproc)等]

# 数据治理存在严重的品牌问题

> 原文:<https://towardsdatascience.com/data-governance-has-a-serious-branding-problem-7925b909712b?source=collection_archive---------8----------------------->

## 数据治理从哪里开始以及一切是如何出错的故事

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4d61433c6e02cf9557deed12cd591e4a.png)

*照片由* [*迪米特里·阿尼金*](https://unsplash.com/@anikinearthwalker?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) *上* [*下*](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)

> *“在我在数据行业完成的所有任务中,数据治理一直是我最不喜欢的。”*
> 
> *–劳拉·b·麦德森,* [*扰乱数据治理*](http://books.google.com/books?id=YhXCDwAAQBAJ)

当你听到“数据治理”这个词时,你首先想到的是什么?规则还是政策?流程还是管理?控制?

数据治理被视为一个限制性的、官僚的、控制性的过程——一组从高处落下的限制来减缓您的工作。事实是,这通常是组织内部的实际运作方式。

作为从事数据治理工作的人,这让我有点难过。治理不应该是数据人类必须害怕的事情。从本质上讲,数据治理与控制无关。这是为了帮助数据团队更好地合作。

因此,让我们来分析一下为什么数据治理会出现身份危机,它在几十年前的实际设想是什么,以及我们如何才能挽救各地数据管理者的声誉。

# 数据治理从何而来?

数据治理建立在非常酷的原则之上。但是如果你搜索数据治理的历史,你可能不会走得很远。事实上,没有任何东西可以追溯到可笑的早期(想想[数据来源于 20,000 年前的骨头](https://www.weforum.org/agenda/2015/02/a-brief-history-of-big-data-everyone-should-read/)或者[人口普查的‘起源于古埃及](https://www.wsj.com/articles/a-short-history-of-census-taking-11561760685))。

部分原因是,数据治理并不性感。很少有人能忍住哈欠,深究它的现在,更不用说它的过去了。让事情变得更加困难的是,数据治理来自于数据管理,这个词听起来更加密集和专业。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/acdb06a3b4a2f00341695b39d1a67b00.png)

自 1990 年以来,书面提及“数据治理”(蓝色)和“数据管理”(红色)。(图片由 [*图集*](https://atlan.com/) *,用*[*Google Ngrams*](https://books.google.com/ngrams/graph?content=data+governance%2Cdata+stewardship&year_start=1990&year_end=2019&corpus=26&smoothing=3)*创建)。)*

虽然“数据治理”在 2000 年代中期开始兴起,但驯服和保护数据(也称为“数据管理”)的想法自十年前数据爆炸以来就一直存在。

数据管理将技术性的数据世界与非技术性的商业世界联系起来。正如劳拉·麦德森[所写的那样](http://books.google.com/books?id=YhXCDwAAQBAJ),“数据管家的目的是帮助巩固粘糊糊的东西……他们说 IT 的语言,并将其翻译回业务。这个角色需要幼儿园老师的耐心和成功应对人质危机的能力。”

**从本质上讲,数据管理以及后来的治理都与协作和民主化有关。**数据管家充当了人员和流程之间的桥梁。他们熟练地引导公司克服使用数据带来的复杂性,并为令人生畏的大数据新世界带来清晰和秩序。

# 当今的数据治理:控制,而不是协作

尽管数据治理源于这种协作思想,但很少以这种方式实现。今天,它更多地被视为一种强加控制的方式。

**数据治理计划通常围绕保护和风险展开,我们必须治理数据以降低风险。**

难怪公司害怕数据风险。随着数据的增长,围绕数据的规则和期望也在飙升。随着隐私泄露的新闻不断,人们越来越关注如何保护自己的个人数据。2018 年,由于多次大规模数据泄露摧毁了 Equifax、脸书、万豪和雅虎等品牌的信誉和股票价值,出现了一场“[关于数据治理的全球清算](https://www.wsj.com/articles/the-morning-download-facebook-at-center-of-global-reckoning-on-data-governance-1521463522)”。因此,新的数据法规遵从性要求(例如 GDPR 和 CCPA)每天都在涌现。

如今,公司希望降低向错误的人展示机密数据的风险,降低不良数据被用于制定重大决策的风险,以及降低违反重要法规的风险。为了防止这些失误,数据被复杂的安全流程和限制所包围,所有这些都由远程数据治理团队决定。

# 更多的数据治理,更高的敏捷性?

多年来,数据治理已经失去了它的身份。我们害怕它,但我们应该庆祝它——因为从根本上说,它是关于创建更好的数据团队,而不是控制他们。

事实上,越多的人开始信任数据治理,他们实际上能够实现的就越多。听起来不确定?先说个例子。

在 Atlan,我们最初是一个数据团队。当时,我们不知道什么是数据治理。我们只知道我们想要承担大规模的[“数据为善”项目](https://atlan.com/about),比如为联合国创建一个 SDG 监测平台,或者开设 10,000 个新的清洁燃料配送中心。

问题是,每天都很混乱。我们有协作过载,人们花更多的时间试图访问或理解数据,而不是实际使用它。我们的空闲时间被诸如“为什么 721 个地理区域的数据丢失了?”或者“为什么这些仪表板显示不同的数字?”

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/86ea6ee3428fec7261c2dc750c9fa776.png)

*来自我们数据团队的松弛消息示例。(图片由* [*阿特兰*](https://atlan.com/) *)。)*

因此,我们努力解决这些问题,建立内部数据工具和更好的协作流程。很快,我们意识到我们完成项目的速度是正常规模三分之一的团队的两倍。我们甚至[建立了印度的国家数据平台](https://youtu.be/cctT8QDDC7w),这是由一个 8 人团队在仅仅 12 个月内完成的。如果没有管理我们的团队和数据的正确的工具和文化实践,我们永远不可能做到这一点。

我认为,组织越是开始相信并投资于(而不是害怕)真正的数据治理,他们就越能实现。这意味着实现敏捷和协作的治理工具和过程,而不是某个地方的自上而下的治理团队宣布,“这就是你需要如何考虑定义”。

# 现代数据堆栈中的数据治理复兴

在 Tristan Handy 关于现代数据堆栈的博客中,他谈到了数据治理落后于现代数据堆栈的其他部分。他写道,“治理是一个时代已经到来的产品领域……**没有良好的治理,更多的数据==更多的混乱==更少的信任。**

我认为他的话反映了现代数据堆栈中数据团队和从业者的广泛情绪。随着数据团队变得越来越主流,现代数据堆栈使得接收和转换数据变得更加容易,数据治理实践的缺乏是阻碍数据团队变得敏捷和产生影响的最大障碍之一。

> *这让我们迎来了数据治理的救赎时刻。从业者第一次自下而上地感受到了治理的需要,而不是由于监管而自上而下地强制实施。*

这种自下而上的采用是我们最终获得正确数据治理的机会。然而,现代数据堆栈的现代数据治理将与其前身大相径庭——这意味着我们必须改变实现数据治理的方式。

# 当今数据治理需要的范式转变

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c6cc6e9ed49e54434be39f4e42b9b544.png)

*形象由* [*图册*](https://atlan.com/) *组成。*

## **从数据治理到“数据和分析”治理**

“数据”不再是唯一需要治理的资产。

我们正在转向一个生态系统,在这个系统中,数据资产不仅仅是表格,它们还是仪表板、代码、模型等等。所有这些资产都需要整体形式的治理。

## **从集中的方法到分散的、社区主导的方法**

基于集中式数据管家的自上而下的治理模式将不再有效。

工作场所正在发生变化。自上而下的文化正在被侵蚀,员工渴望他们所做的一切都有目的,所以只是告诉人们做一些事情不再管用。未来的数据治理需要从根本上以实践者为主导。

我几乎认为这是一个数据社区,而不是数据治理,其中从业者感到有责任创建可重用资产,以便他们可以帮助其他社区成员。

## **从事后想法到日常工作流程的一部分**

在过去的十年中,数据治理总是在事后才被应用。数据从业者将按原样交付项目,然后回头添加由自顶向下的命令规定的数据治理需求。

在新的世界里,数据治理将不再是事后的想法。相反,它将成为数据从业者“运输工作流程”中不可或缺的一部分。

# 让我们重塑数据治理

现代数据堆栈是重塑新类别的大师。仅在去年一年,我们就创造了[无头 BI](https://basecase.vc/blog/headless-bi) 、[反向 ETL](https://medium.com/memory-leak/reverse-etl-a-primer-4e6694dcc7fb) 、[数据可观察性](/what-is-data-observability-40b337971e3e),以及更多领域。最让我着迷的运动是“[分析工程](https://www.getdbt.com/what-is-analytics-engineering/)”,它改变了数据清洗和转换的思路,赋予了一整群人更高的目的。

我对我们的社区有一个要求… **让我们最终重塑数据治理的品牌,并在我们的堆栈中给予它应有的位置和尊重**。让我们让它听起来像它的本意—一套令人惊叹的数据团队将遵循的实践。

我不太清楚现代数据治理的新品牌和名称应该是什么,但它需要与治理的基本重新定位保持一致,作为自下而上、社区主导的实践者运动。

也许它应该被称为数据支持、社区主导的数据治理或数据产品思维模式?也许数据管家的角色应该包含在数据产品经理的角色中?也许数据治理经理应该更名为数据社区经理或数据支持经理,并加入更广泛的数据平台团队?

有这么多的可能性,所以我希望听到更多人的意见。你怎么想呢?

**觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章** [**Atlan**](https://atlan.com/) **。** [**在此订阅。**](https://metadataweekly.substack.com/)

# 什么是数据治理?

> 原文:<https://towardsdatascience.com/data-governance-impact-on-24cb8e29f281?source=collection_archive---------23----------------------->

## 数据越多,问题越多=价值越低

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2410a333d0329e89f4f9f5517014a01d.png)

数据治理具有直接的业务影响— Image by [Castor](http://www.castordoc.com)

> *“数据治理是衡量公司对其数据的控制力的标准”*

数据治理是一个数据管理概念。这是一种衡量公司对其数据控制能力的方法。这种控制可以通过高质量的数据、数据管道的可见性、可操作的权限管理和明确的责任来实现。数据治理包括创建一致且适当的公司数据处理所需的人员、流程和工具。我所说的一致和适当的数据处理是指确保可用性、可用性、一致性、可理解性、数据完整性和数据安全性。

最全面的治理模型——比方说,对于一家全球银行——将有一个强大的数据治理委员会(通常有首席执行官参与)来驱动它;高度自动化,元数据记录在企业字典或数据目录中;数据沿袭可追溯到许多数据元素的来源;以及随着企业需求的变化而不断调整优先级的更广泛的领域范围。

良好的数据治理和隐私模型是人员、流程和软件的混合体。

# 数据治理对业务有直接影响。

数据治理不仅仅是公司为了遵守法规而不得不部署的生锈流程。当然,一部分是法律义务,感谢上帝,但廉洁的治理可以带来很高的商业成果。

以下是数据治理的主要目标:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/54da4bf15ba5b3f639b6cfb1e9f9c2bb.png)

数据治理业务影响—按作者分类的图片

# 数据治理什么时候成了一件事?

时间表和该领域的关键里程碑。

在过去的二十年里,围绕数据的挑战是构建一个基础架构来高效、大规模地存储和使用数据。随着云数据仓库和 dbt 等转换工具的出现,这些年来生产数据变得更加便宜和容易。由于有了像 Looker、Tableau 或 Metabase 这样的 BI 工具,对数据的访问已经大众化。现在,构建漂亮的仪表板是运营和营销团队的新常态。**这引发了一个新问题:分散的、不可信的&不相关的数据和仪表盘。**

即使是最受数据驱动的公司也仍然难以从数据中获得价值,因为高达 73%的企业数据未被使用。

## →1990–2010:第一部数据隐私法规的出现

20 世纪 70 年代,世界上第一部数据保护法规在德国黑森州通过审查。自那以后,数据监管不断加强。20 世纪 90 年代,欧盟关于数据保护的指令标志着第一个关于数据隐私的法规。

然而,随着 GDPR、HIPAA 和其他有关个人数据隐私的地区性法规的出现,合规性在 2010 年代后半期真正成为了一项全球性挑战。这些第一批法规推动了大型企业的数据治理。这就迫切需要开发工具来处理这些新的需求。

‍

## →2010–2020:符合法规的首选工具。首席级意识到数据治理成为推动业务价值的战略优势

一方面,随着数据资源/流程越来越复杂,另一方面,随着第一批 GDPR 侵权罚款的出现,公司开始构建法规遵从性流程。组织治理和隐私的第一批软件诞生于 Alation 和 Collibra 等公司。

挑战很简单:在公司的各种数据基础设施中实施可追溯性。那时,数据治理是企业级公司的特权,只有企业能够负担得起这些工具。本地数据存储使得部署该软件非常昂贵。事实上,像 Alation 和 Collibra 这样的公司不得不在现场部署技术专家,将数据连接到他们的软件。数据治理工具的第一个版本旨在收集和引用组织各部门的数据资源。

这一时期有几种力量在起作用。收集数据变得更容易,存储数据变得更便宜,分析数据变得更简单。这导致了数据资源数量的寒武纪大爆发。因此,大公司很难了解使用数据完成的工作。数据是分散的、不可信的和不相关的。这种混乱给数据治理带来了新的战略层面。数据治理不仅仅是一项法规遵从性义务,它还成为了创造商业价值的关键手段。

‍

## → 2020 年+:迈向自动化和可操作的数据治理

随着云数据堆栈的标准化,范式发生了变化。更容易连接到数据基础设施并收集元数据。2012 年,在众多孤岛式内部数据中心上部署数据治理工具需要 6 个月的时间,而在 2021 年,在现代数据堆栈(例如:雪花、Looker 和 DBT)上部署数据治理工具只需 10 分钟。

这带来了新的挑战:自动化和协作。excel 上的数据治理**意味着手动维护数千个表格和仪表板上的 100 多个字段。这是不可能的。使用非自动化工具**的数据治理**意味着在数千个表上维护 10 个以上的字段:这非常耗时。使用**全自动工具**进行数据治理意味着只在数千个表上维护 1 或 2 个字段(字面意思是表和列/字段描述)。对于手工工作的最后一部分,您需要利用社区。基于数据消耗(流行资源的高文档 SLA)对工作进行优先级排序,并通过友好的 UX 使使用民主化。**

此外,您希望将数据治理工具集成到数据堆栈的其余部分。定义一次东西,到处都可以找到:无论是表定义、标记、KPI、仪表板、访问权限还是数据质量结果。

‍

# 每个人面临的数据治理挑战不尽相同

基于行业需求和公司规模的多样化治理用例

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/25f97ba53a8bd08ad73f48f3409ae2b1.png)

基于行业需求和公司规模的多样化治理用例—图片由作者提供

‍There 是数据治理计划的两个主要驱动因素:

数据监管将数据治理流程的最低标准推得更高。它要求企业添加控制、报告和文档。这是确保有时不清楚的过程透明的需要。

随着公司中数据资源、工具和人员的指数级增长,拥有强大的治理变得越来越重要。

复杂程度随着业务运营范围(涵盖的业务线数量和地理位置)、数据创建速度或基于数据的自动化程度(决策、流程)而增加。‍

# 如何建立良好的数据治理和隐私模型?

需要几块砖来加强数据管理

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4537878b703956dbc367a96f1fbff517.png)

实施数据管理需要几块砖—图片由 Xavier de Boisredon 提供

‍Before 甚至谈到数据治理,一个公司需要基础:一个好的基础设施。根据业务需求和公司的数据成熟度,数据架构的性质可能会发生很大变化。关于存储,您是选择内部存储还是云存储?数据仓库还是数据湖?关于模特:火花还是 DBT?在数据仓库中还是在 BI 工具中?实时还是批量?关于可视化:你只允许任何人建立仪表板或数据团队吗?等等。

任何数据治理策略的第一层都是确保相关人员可以找到相关数据集来进行分析或构建他们的人工智能模型。如果你不执行这一步,公司最终会在与工程团队的会议上提出很多问题。该公司最终拥有大量重复的表格、分析和仪表板。设计执行后续步骤所需的资源需要花费宝贵的时间。

一旦你能有效地找到数据。你需要快速理解它,以便评估它是否有用。例如,您正在查看一个名为“*active _ users _ revenue _ 2021*”的数据集。有一栏“*付款*”。这一栏是€还是美元?是今天早上刷新的,还是上周刷新的,还是去年刷新的?它包含所有活跃用户的数据还是只包含欧洲的数据?如果我删除一列,这会破坏营销或财务团队的重要仪表板吗?等等。

现在,您拥有了存储在可扩展基础架构中的数据,每个人都可以找到并理解这些数据,您需要相信这些数据是高质量的。这就是为什么这么多的数据可观察性和可靠性工具在过去的五年中诞生了。数据可观察性是使用自动化监控、警报和分类来消除数据停机的一般概念。数据质量的两种主要方法是:声明性的(手动定义阈值和行为)或 ML 驱动的(检测分布中的突然变化)。

有些数据可能比其他数据更隐私或更具战略性。假设你是一家银行,你不想让公司里的任何人访问交易日志。您需要定义访问权限,并且随着处理数据的人员数量和类型的增长,高效地管理这些权限会很快变得困难。有时,您想为某个特定的任务或其他任何事情授予某人访问权限。如果你的一名员工曾在财务部工作,但后来转到了市场部,会发生什么?你需要彻底有效地管理这些权利。

这个是不言自明的。您需要列出所有资产,报告个人信息和使用情况,以遵守法规。目前,监管机构只针对企业,规模较小的公司开始被罚款只是时间问题。‍

# 数据治理在现代数据堆栈中处于什么位置?

数据治理将信任从原始数据源带到领域专家仪表板

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/eba20d19cfcc2c4ce1d6f20fa403876d.png)

现代数据堆栈治理—图片由 Xavier de Boisredon 提供

典型的数据流如下:

*   您从企业的各种来源收集数据。它可以是产品日志、营销和网站数据、支付和销售日志等。您可以使用 Fivetran、Stitch 或 Airbyte 等工具提取这些信息。
*   然后将这些数据存储在数据仓库中(雪花、红移、Bigquery、Firebolt 等等)。数据仓库既是存储数据的地方,也是转换数据以对其进行提炼的地方。
*   过去 3 年的新趋势转化层是 DBT。它支持在数据仓库中用 SQL 执行数据转换,同时实现软件工程的良好实践。
*   最后,这种转换帮助您构建您的“数据集市”,这是提炼数据的黄金标准。可视化砖有助于领域专家可视化这种黄金级数据,以便在整个组织中分享见解。

这些步骤发生在不同的工具上,具有高度的抽象性。很难鸟瞰引擎盖下发生的事情。这就是数据治理带来的好处。你可以看到数据是如何流动的,管道在哪里断裂,风险在哪里,作为数据管理者你的精力应该放在哪里等等。

# 更多分析和基准

点击此处,了解更多关于现代数据堆栈[的性能指标评测和分析。我们写了利用数据资产时涉及的所有过程:从现代数据堆栈到数据团队的组成,再到数据治理。我们的博客涵盖了从数据中创造有形价值的技术和非技术方面。如果你是一名数据领导者,并希望更深入地讨论这些话题,请加入我们为此创建的](https://notion.castordoc.com/)[社区](https://notion.castordoc.com/unsupervised-leaders)!

*最初发表于*[*https://www.castordoc.com*](https://www.castordoc.com/blog/what-is-data-governance-and-privacy)*和*[https://www . moderndatastack . XYZ](https://www.moderndatastack.xyz/category/Data-Privacy-and-Governance)*。*

# 数据有许多需要可视化的周期性成分?把它当成音频!

> 原文:<https://towardsdatascience.com/data-has-many-periodic-components-you-need-to-visualize-treat-it-like-audio-dd9569e2a774?source=collection_archive---------17----------------------->

## [提示和技巧](https://towardsdatascience.com/tagged/tips-and-tricks)

## 使用傅立叶变换可视化周期性分量。

您正在处理时间序列数据,并且处于初始发现阶段。你试图找出数据随时间变化的所有不同方式。可能存在趋势,即数据随时间不断增加或减少。可能有完全随机的变化。并且可能存在以某些固定周期随时间上下变化的循环分量。

如果只有一个周期分量,这可能很容易在数据中看到,你甚至可以直观地估计它的周期。但是如果有多个周期分量,每个都有自己的周期呢?如果数据具有超过 3 个(有时超过 2 个)周期分量,简单的绘图通常没有用。

有没有什么方法可以确保你已经识别出所有的周期性成分,每一个都有不同的周期,以及它们自己的趋势和随时间的变化,并将它们可视化?那个东西其实是存在的,它叫声谱图,是信号处理中一个很好理解的话题。由于您正在处理时间序列数据,因此信号处理中使用的许多技术都应该适用,因为信号(音频、天体物理学等)本质上是时间序列数据,其中每个观察值都有一个时间戳和值。

让我们来看看如何制作声谱图。

# 傅立叶变换

其数学基础被称为傅立叶变换。简而言之,如果您的信号有周期成分,FT 是用于从信号中提取其频率(或周期)的数学过程。

<https://en.wikipedia.org/wiki/Fourier_transform>  

对信号中的时间间隔(一个窗口或一段时间)应用一次 FT,可以得到该窗口内的周期分量。如果您将窗口移动到信号中的不同位置,并再次应用 FT,您将获得该窗口中的周期分量。重复这个过程很多次,每次只移动窗口一点点,就会描绘出周期成分如何随时间演化的画面(如果有的话)。

# 来自音频的教训

在音频处理中,这种技术使用非常频繁。捕捉音频的一个小时间窗口并对其应用 FT 将揭示当时信号的“频谱”或音频的一组频率成分。

这是我不久前开始的一个项目,目标是构建任何音频文件的声谱图(周期成分随时间的演变):

<https://github.com/FlorinAndrei/soundspec>  

如果你从电影[《黑暗骑士](https://www.imdb.com/title/tt0468569/)中选取歌曲 [Why So Serious](https://www.youtube.com/watch?v=1zyhQjJ5UgY) (小丑主题),并对其应用 soundspec,这就是你得到的声谱图:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2d7abef47826e133bbb71808a564655c.png)

(图片由作者提供)

在水平轴上,有时间。纵轴是频率。请注意,周期和频率是成反比的,所以周期= 1 /频率。颜色表示振幅,黄色表示高振幅,蓝色表示低振幅或零振幅。

你可以看到在 200 到 400 秒之间有非常强的周期成分,频率约为 30 … 40 Hz,因此周期为 0.033 … 0.025 秒(你可以在歌曲中听到这是一条强有力的低音线)。还有许多其他周期性成分散布在声谱图中——音乐通常非常复杂。

# 返回数据

让我们来看看这个数据集:

[https://github . com/FlorinAndrei/misc/blob/master/FFT _ data . p?raw=true](https://github.com/FlorinAndrei/misc/blob/master/fft_data.p?raw=true)

初始化所有库:

```
import pandas as pd
from matplotlib import pyplot as plt
from scipy import signal
import numpy as np
import os
import pickleplt.rcParams["figure.figsize"] = (16, 9)
```

绘制数据集:

```
if os.path.isfile('fft_data.p'):
    dt = pickle.load(open('fft_data.p', 'rb'))
plt.plot(dt);
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/40fd989a0e5d38bff20ac97d1db16f0a.png)

(图片由作者提供)

第一部分有些明显,有一个周期成分,还有一些噪声。但是剩下的就变得相当复杂了。里面有多个周期成分吗?如果有,她们的经期是什么时候?他们有多少人?就对信号的贡献而言,它们在时间上是恒定的,还是变化的?

SciPy 库有一个名为`signal.spectrogram()`的函数,可以生成这个数据集/信号的谱图。让我们应用它:

```
f, t, Sxx = signal.spectrogram(dt, 1)
plt.pcolormesh(t, f, np.log10(Sxx), shading='auto');
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4c856fd918cbbb3319b662682a967efb.png)

(图片由作者提供)

如您所见,傅里叶变换对整个数据集应用了 4 次,生成了 4 组光谱。从黄色的位置可以很清楚地看出,所有的活动都发生在底部,低频的地方(短周期的地方)。

我们只保留声谱图底部的 1/5 放大,其余的可以忽略:

```
f, t, Sxx = signal.spectrogram(dt, 1)
frac = len(f) // 5
fshort = f[0:frac]
Sshort = Sxx[0:frac]
per = np.rint(1 / fshort).astype(int)
plt.pcolormesh(t, fshort, np.log10(Sshort), shading='auto');
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1fbf8119e397db15afce6946fbf13636.png)

(图片由作者提供)

那更好。您可能已经开始怀疑可能有 3 个周期成分,一个(具有最高频率)在间隔的中心是重要的,另一个(具有中间频率)在间隔的后半部分,第三个(具有低频率)似乎在任何地方都是相同的。

我们需要在时间和频率上提高图像的分辨率。为此,我们将通过`signal.spectrogram()`的`nperseg`参数为时间窗口定义一个固定的大小。我们还将通过`noverlap`参数最大化连续窗口之间的重叠:如果`noverlap = nperseg-1`将第一个窗口应用于信号的最左边部分,那么它将向右移动 1 个像素,再次应用,再次移动 1 个像素,以此类推。

```
nseg = 200
f, t, Sxx = signal.spectrogram(dt, 1, nperseg=nseg, noverlap=nseg-1)
frac = len(f) // 5
fshort = f[0:frac]
Sshort = Sxx[0:frac]
per = np.rint(1 / fshort).astype(int)
plt.pcolormesh(t, fshort, np.log10(Sshort), shading='auto');
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/30206126182ab3837fde0d856d0923f6.png)

(图片由作者提供)

好多了。很明显,有 3 个周期成分。频率最低的一个在整个数据集中是恒定的,可能就是我们在原图中看到的那个——图像左三分之一的上下波动。其他两个组成部分随时间变化——这解释了为什么最后三分之二的情节不同。

让我们使用更大的窗口(400 点)再次放大:

```
nseg = 400
f, t, Sxx = signal.spectrogram(dt, 1, nperseg=nseg, noverlap=nseg-1)
frac = len(f) // 5
fshort = f[0:frac]
Sshort = Sxx[0:frac]
per = np.rint(1 / fshort).astype(int)
plt.pcolormesh(t, fshort, np.log10(Sshort), shading='auto');
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/21d11e41e67e285856a3ab97c5969c53.png)

(图片由作者提供)

这可能是最好的了。请记住,这里有一些权衡:为了提高分辨率,您需要一个大窗口,同时也要正确检测长周期信号。但是增加窗口会丢失图像左右两端的数据点——大窗口无法“足够接近”边缘以进行分析。看看横轴是如何随着窗口变大而变短的。

在纵轴上,我们把频率转换成周期。让我们给图像添加一个网格。最后,让我们平滑图像,使它看起来更好(通过`plt.pcolormesh()`的`shading`参数)。

```
nseg = 400
f, t, Sxx = signal.spectrogram(dt, 1, nperseg=nseg, noverlap=nseg-1)
frac = len(f) // 5
fshort = f[0:frac]
Sshort = Sxx[0:frac]
per = np.rint(1 / fshort).astype(int)plt.yticks(ticks=fshort[::2], labels=per[::2])
plt.ylabel('period')
plt.xlabel('obs')
plt.pcolormesh(t, fshort, np.log10(Sshort), shading='gouraud')
plt.grid(True)
plt.show()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/53a556bc7e8a346e21e474dcfb367130.png)

(图片由作者提供)

现在很清楚了:有一个分量的周期是 100 个点,在整个数据集中是恒定的。还有一个 50 分周期的成分,只在后半段有关系。还有第三个成分,周期为 25 个点,在数据集的中间很强,但在极端情况下很弱。

数据集实际上是合成的。这是用于生成它的代码,在这里您可以看到分量、它们的频率以及它们的可变幅度:

```
N = 1000
dt = np.zeros(N)
np.random.seed(0)for t in range(N):
    dt[t] += 50 * np.random.randn()

    a1 = 429 * np.exp(-((t - N / 2) / (N / 10)) ** 2)
    p1 = 25
    s1 = p1 / 5
    dt[t] += a1 * np.sin(2 * np.pi * t / p1 + s1)

    a2 = 212 * (np.tanh(5 * (2 * t / N - 1)) + 1)
    p2 = 50
    s2 = p2 / 7
    dt[t] += a2 * np.sin(2 * np.pi * t / p2 + s2 + np.random.randn() / 2)

    a3 = 375
    p3 = 100
    s3 = p3 / 4
    dt[t] += a3 * np.sin(2 * np.pi * t / p3 + s3 + np.random.randn() / 10)pickle.dump(dt, open('fft_data.p', 'wb'))
```

具有最短周期的分量具有按照高斯曲线随时间变化的幅度。中间分量的幅度随时间以双曲正切的形式变化。

# 最后的想法

如果数据没有间隙,并且时间维度是均匀的,傅立叶变换就可以很好地工作。否则,您将不得不估算缺失的数据点,填补空白,确保时间维度表现良好。

包含本文中使用的所有代码的笔记本在这里:

[https://github.com/FlorinAndrei/misc/blob/master/fft.ipynb](https://github.com/FlorinAndrei/misc/blob/master/fft.ipynb)

感谢阅读!

# 现代企业的数据高速公路

> 原文:<https://towardsdatascience.com/data-highways-for-the-modern-enterprise-d8365c2e4024?source=collection_archive---------24----------------------->

## 如果没有支持的基础设施,数据不会传播很远

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e2d81c0d96864f2944e5362df45c484d.png)

图片由 Shutterstock 提供,由作者编辑

铺设的道路在技术基础设施中很常见,但这是建设高速公路的最佳时机。一个多世纪前,由于装配线上的大规模生产,汽车价格从 1913 年的 850 美元下降到 1924 年的不到 300 美元,我们看到了美国编号公路系统的诞生,以更好地服务于长途旅行。这些高速公路引发了基础设施投资,以前所未有的规模进一步调动了人员和货物,从根本上改变了我们的生活方式。就像早期的核心创新不是汽车而是装配线一样,今天的“三巨头”云提供商进行创新,以部署装配线的现代等价物,并实施大规模运营。就像一个世纪前汽车风靡一时一样,今天我们生活在消费者应用的黄金时代,这些应用提供服务和商品,从食品和家具到虚拟旅行,触手可及。但是数字高速公路在哪里呢?当今数字世界中的“商品”是数据。跨企业的平台团队正在构建他们自己的铺路和数据基础设施,在他们的本地领域发现新的岩石。这是对想象现代数据高速公路的一次尝试,在未来十年,每个公司都可以利用现代数据高速公路在数据驱动的世界中更快地前进。

# 早期

传统上,数据湖(DLs)是整个组织中的结构化和非结构化数据被转储的地方。过去,这些数据转储自然会导致专有内部解决方案的成本上升。如今,客户可以在云中创建自己的数据湖。构建数据湖的步骤通常包括定义存储(着陆/接收)位置、配置接收到该位置、准备和丰富数据、配置访问控制,以及最终查询数据以进行分析,如下所示。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b4a9002e7f374bc2536a19af0df4c54a.png)

当前数据接收和存储的设置和配置(图片由 Madrona Venture Group 提供)

但是这种接收、存储、转换和分析步骤的安排并不新鲜。这已经存在了几十年,尽管“现代”工具似乎取代了上一代工具。改变的是‘渣渣’的减少。有了正确的抽象层次,实践者不必一遍又一遍地重新发现同样的粗糙边缘、缺口或惊奇。

# 还有很多路要走

在使用数据进行分析和机器学习的现代组织中,我们发现团队仍然需要解决几个难题-从最直接的查询性能和数据质量问题到围绕数据隐私的更具战略性的问题。团队也对他们的基础设施成本和部署时间(或洞察时间)越来越敏感,这两者都是生产力和长期竞争力的替代指标。这些问题表明需要尚未建成的现代数据高速公路。

**A .高性能查询** —随着存储(现在在云对象存储中可靠且经济高效地可用)与计算的分离,可以将查询编译成高效的逻辑和物理查询计划的*查询引擎*(通过缓存获得额外的性能)对于抽象底层存储布局和格式至关重要。这种查询引擎自然依赖于作为核心能力的*索引*,随着时间的推移,它可以理想地适应新数据类别的新类型索引。毫不奇怪,已经构建了这种高性能查询引擎的现代数据仓库现在可以作为各种查询模式的单一来源,从即席分析查询、数据科学任务和 ML 工程到预定的商业智能报告。他们的核心是一个高性能的查询引擎。[参见:Databricks 的[雪花](https://www.snowflake.com/),[三角洲湖](https://delta.io/),[亚马逊红移](https://aws.amazon.com/redshift/) ]随着阿里云的 [Hologres](https://www.alibabacloud.com/product/hologres) 于 2021 年 2 月推出,我们预计明年将看到查询延迟的进一步改善。数据存储的下一步是什么?我敢打赌,在接下来的五年里,将会出现数量级更复杂的查询(更多内容见下一节)。

**B .数据质量&管理** —一项关键的组织能力是让不同的团队就“好数据”的含义达成一致。从战术上讲,这需要定义一个数据模式和管理高质量数据的规则。从战略上来说,组织部落知识的正式化和期望值的设定对于建立对业务决策和最终用户体验的更深信任是至关重要的,这些数据是用来服务的。[参见: [WhyLabs](https://whylabs.ai/) 、[远大前程](https://www.superconductive.com/)、 [Anomalo](https://www.anomalo.com/) 、 [Monte Carlo](https://www.montecarlodata.com/) 、 [BigEye Data](https://www.bigeye.com/) 、 [Hubble](https://www.gethubble.io/) 、 [Databand](https://databand.ai/) 、 [UnravelData](https://unraveldata.com/) ]超越数据质量,我们期待在持续评估和多维评估指标方面的新工作,将数据操作/多操作从目标可观察性转变为知情可控性,让上游系统和团队负起责任例如,修复上游的实体嵌入可以解决使用这些嵌入的下游产品中的错误。最近的论文如 [Bootleg](http://hazyresearch.stanford.edu/bootleg/) 、 [RobustnessGym](https://arxiv.org/abs/2101.04840) 显示,数据管理技术(不是建模技术)如增强和弱标记可以提高基线模型的准确性,特别是长尾分布[见:[潜泳](https://snorkel.ai/)

**C .数据隐私** —另一个关键的组织能力是建立有意使用和控制数据的机制。在第一个层次上,这需要有意识地判断业务决策是否需要不打算用于该场景的数据。例如,当你看到一个令人毛骨悚然的广告时,商家是打算给你看一个令人毛骨悚然的广告,还是无意的代表判断力差?一些公司已经建立了开源框架(如网飞的 Metacat、LinkedIn 的 DataHub、Airbnb 的 Dataportal、优步的 Databook、Lyft 的 Amundsen)用于数据编目、血统跟踪和使用政策的执行。这些框架除了确保模型根据给定业务目的的数据进行训练之外,还支持可重复性。下一层是确保任何人(包括员工)都不能访问用户数据。第三层是部署定义明确的数据保留和删除机制,根据个人或群体的同意对其数据实施可靠的控制。使用传统安全机制的问题是,比如用于信用卡保护的技术,用加密令牌(又名“假名化”)替换特定字段会失败,因为人们无法指出哪个特定数据字段实际上是敏感的。虽然一个数据集本身可能看起来无害,但当它与另一个数据集一起使用时,可能会变得敏感。加密一个给定的数据集(“去标识”)可能看起来是安全的,但是如果多方(非预期的)持有解密密钥呢?目前还不清楚加密数据本身是否能达到预期的准确度。差分隐私提供了可证明的保证,以确保无法通过在数据中引入校准噪声来了解特定个人的任何信息。这使企业能够在准确性和隐私性之间进行权衡,当然也有助于从一个校准良好的数据集中提供效用,否则这是不可用的。虽然谷歌、苹果、脸书和 LinkedIn 等大型公司正在内部建设隐私,而 [Privacera](https://privacera.com/) 、 [Immuta](https://www.immuta.com/) 和 [Privitar](https://www.privitar.com/) 等公司也展现出了希望,但它仍然是数据领域服务最不足的领域。

**D .数据转换** —数据转换能够将数据过滤、整形、丰富成一种形式,这种形式能够激发洞察力并为机器学习(ML)模型生成特征。SQL 仍然是当今最流行的转换接口,而各种管道代码工具将多个相关步骤缝合在一起。[参见: [Dbt](https://www.getdbt.com/) , [Airflow](https://airflow.apache.org/) ]这本身不一定是一个困难的问题,但它是大量“垃圾”和无差别的繁重工作耗费时间和生产力的地方。诸如[perfect](https://www.prefect.io/)和 [Flyte](https://flyte.org/) 之类的完全托管、经济高效的云中服务很有前途,但这一领域仍然与成本约束、业务 SLA、质量和责任以及我们上面提到的预期使用要求相隔离。有没有办法从根本上改变这个问题空间?例如,如果应用程序生产环境可以用期望的约束来声明性地定义,为什么数据基础设施环境不可以呢?

**E .特性工程** —如果特性不容易“回填”,添加新特性或收集新类型的数据通常会导致较长的交付周期。作为一名希望从用户那里收集新信号的数据科学家,你必须首先设计该功能,将其添加到源应用程序中以收集它,然后等待数周时间来收集足够的数据以得出可靠的结论。这将模型开发周期延长至几个月。这些批处理或流式数据管道可以进一步馈入离线特征存储,也是在 S3 上,其保存注册的 ML 模型“特征”。确保人工智能模型在训练期间看到与推断期间相同的数据分布仍然是一个难题,Airbnb 的 [Zipline](https://conferences.oreilly.com/strata/strata-ny-2018/cdn.oreillystatic.com/en/assets/1/event/278/Zipline_%20Airbnb_s%20data%20management%20platform%20for%20machine%20learning%20Presentation.pdf) 开始解决这个问题,也许 [Tecton](https://www.tecton.ai/) 可以在此基础上继续努力。

**F .模型构建** —随着公司开发更复杂的 ML 系统,比如通过将模型组合在一起,或者用音频和视频等非结构化数据训练更大的模型,训练所需的计算成本迅速膨胀。然而,随着模型开始在架构上趋同,我们预计这些培训成本对于大多数应用程序来说会逐渐减少,这些应用程序可能建立在标准模型的优化版本上,或者使用 API,比如来自亚马逊 Rekognition 或者微软的 GPT-3 API。更重要的是,使模型计算更接近源数据,并利用数据的底层关系结构来执行复杂的查询,这将导致成本的数量级降低。这可能为下一代查询引擎奠定基础,进一步优化数据的组织方式。[参见:[Li liquid](https://engineering.linkedin.com/blog/2020/liquid-the-soul-of-a-new-graph-database-part-1), [Relational.ai](https://www.relational.ai/)

**G .模型部署**——可悲的是,推理和训练环境继续使用不同的工具、系统和管道。这些孤立的工具和流程在安全地将模型部署到生产环境中时会产生巨大的障碍,导致数据科学家将时间花费在基础设施问题上,而不是数据和模型设计上。在原型阶段早期为数据科学家提供铺平道路的工具自然使他们能够更快地投入生产。[参见:来自 Airbnb 的 [Algorithmia](https://algorithmia.com/) 、 [Seldon](https://www.seldon.io/) 、 [Bighead](https://www.youtube.com/watch?v=UvcnoOrgyhE) 、 [OctoML](https://octoml.ai/) ]

# 是时候建造…什么?

我们在查询性能方面取得了一定的进步,但数据质量和管理、数据隐私、特征工程和模型构建仍有很长的路要走。十多年前,亚马逊通过云服务开创了这场革命,现在我们已经看到了云中构建的变革性产品类别。是时候构建肌肉和护栏来利用这一基础设施来加强我们的组织和数据实践了。您看到的是相同还是不同的差距?我们遗漏了什么?

# 回归中的数据不平衡

> 原文:<https://towardsdatascience.com/data-imbalance-in-regression-e5c98e20a807?source=collection_archive---------10----------------------->

## 回归分析中数据不平衡的调查及对策

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0156c8627d2bdc1b9c31676c61c4ad3a.png)

照片由 [imgix](https://unsplash.com/@imgix?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

# 介绍

数据不平衡是现实世界数据集的一个典型问题。通过查看二元分类任务,可以最好地描述数据不平衡。在二元分类中,如果 0 类和 1 类之间的样本数量不均匀,则数据集是不平衡的。机器学习模型倾向于更好地预测具有更多样本的类(多数类)而不是具有较少样本的类(少数类)。这种不平衡越大,模型对多数阶级的偏向就越高。在回归分析中,数据不平衡不太明显,但可能存在并导致问题。本文给出了一个回归任务中数据不平衡的例子和一些对策。每个对策用于训练一个线性回归模型,并相互比较结果。可以看出,使用对策提高了 R 平方得分和均方误差(MSE)。这些对策可以直接用于其他不平衡回归任务,以提高性能。使用的数据集是 Boston Housing 数据集,可以在 [scikit-learn](https://scikit-learn.org/stable/datasets/toy_dataset.html) 上找到。完整的 jupyter 笔记本可以在我的 github 页面上找到。

# 数据输入

本章介绍如何加载数据。使用 scikit-learn 库和 pandas 加载数据。图 1 显示了将数据集加载到 pandas 数据框中的 python 代码。

图 1:将波士顿住房数据加载到 pandas 数据框中的代码(由作者编写)。

该数据集已经只包含浮点型要素,没有缺失值,因此无需进一步预处理。

# 目标变量的分布

该数据集的目标变量是“以 1000 美元为单位的自有住房的中值”(MEDV),如数据集说明中所述。图 2 显示了目标变量的直方图。在最佳情况下,目标变量的分布将是正态分布。但是,可以看出,波士顿住房数据集的目标变量显然不是这种情况。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b562cae7d8716b7250f45d5932bb414b.png)

图 2:波士顿住房目标变量直方图(图片由作者提供)。

平均值在 20 左右,第一部分看起来已经很像正态分布了。但是有一个较高 MEDV 值的大右尾。这可能会导致一个问题,即该模型可以更好地预测平均值周围的 MEDV 值,但在预测右尾的 MEDV 值时却非常糟糕。这是因为在大多数情况下,模型会看到平均值附近的值,因此偏向于这些 MEDV 值。

还可以执行统计测试,以验证该分布不是正态分布。图 3 显示了计算这个分布是正态分布的零假设的 p 值的代码。实际上,小于 0.05 的 p 值意味着可以拒绝零假设。因此,p 值为 0.05 或更大意味着该分布是正态分布。

图 3:执行统计测试以检查数据分布是否为正态分布的代码(由作者编写)。

该统计测试的 p 值为 1.76e-20,因此远小于 0.05。

# 目标变量的变换

如前一章所示,目标变量是高度倾斜的。本章的目标是介绍可应用于目标变量的不同变换。这些转换的目标是使目标变量的分布更接近正态分布,从而消除不平衡。

## 平方根变换

第一个变换是平方根变换。这个转换只是计算目标变量的每个条目的平方根(等式 1)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7777209287dce0087d346b35d628fc41.png)

等式 1:应用于输入目标变量的平方根变换(图片由作者提供)。

图 4 显示了应用这个转换后目标变量的直方图。新的分布看起来已经不那么偏斜了,但仍然不像正态分布。新分布的 p 值为 3.56e-5,因此仍低于 0.05。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0617d7b7943b8d45ade97c7a5255e8fc.png)

图 4:应用平方根变换后的波士顿住房目标变量直方图(图片由作者提供)。

## 对数变换

另一个有用的转换是计算输入目标变量的每个条目的自然对数(等式 2)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c7184c512f494eec4ab006121829a039.png)

等式 2:应用于输入目标变量的对数变换(图片由作者提供)。

图 5 显示了应用对数变换后的直方图。这个分布看起来比原来的好,但仍然不像正态分布。这个分布的 p 值在 1.82e-4,仍然低于 0.05。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b8d6fb310736876afa2a0227c754a1aa.png)

图 5:应用对数变换后的波士顿住房目标变量直方图(图片由作者提供)。

## Box Cox 变换

最后介绍的变换是 Box Cox 变换。等式 3 示出了如何计算 Box Cox 变换,其中λ被确定为使得分布最佳地接近正态分布。图 6 显示了如何使用 SciPy 库计算 Box Cox 转换,而图 7 显示了转换后的目标变量的分布。这种分布已经看起来非常类似于正态分布,并且达到了大于 0.05 的 p 值 0.1。因此,我们可以说该分布等于正态分布。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0fc1eab98d170163404eff35432e319e.png)

等式 3:应用于输入目标变量的 Box Cox 变换(图片由作者提供)。

图 6:计算 Box Cox 变换的代码(作者代码)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9ea92117e59260d5c2331ceddf56f7e2.png)

图 7:应用 Box Cox 变换后的波士顿住房目标变量直方图(图片由作者提供)。

# 训练线性回归模型

在这一章中,为每个转换以及没有应用转换时训练线性回归模型。这有助于检查哪种转换最适合当前数据集,以及转换是否有助于提高性能。为了应用转换,创建了一个 Transformer 类。该类还能够应用逆变换,从而可以将变换后的模型的预测转换回来,并且可以将预测与原始测试数据进行比较。图 8 显示了 Transformer 类的代码。

图 8:用于应用转换和逆转换的 Transformer 类的代码(由作者编写)。

下一步,为每个转换和原始的、未转换的案例训练一个线性回归模型(图 9)。使用 scikit-learn 中的 StandardScaler 类对训练数据进行缩放。这里,重要的是仅在训练数据上训练定标器,以避免数据泄漏到测试集中,从而得到过于乐观的结果。然后,为每个转换训练一个线性回归模型,并使用 Transformer 类转换目标数据。在训练之后,执行对拒绝测试数据的预测,并且使用当前应用的变换的逆变换将预测转换回来。最后,计算 R 平方得分和 MSE,并将其存储在数据帧中。

图 9:为每个转换训练线性回归模型的代码,并在保留测试集上获取结果。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a7928f29e09ad8b74a40b222ceeafb6f.png)

图 10:测试集的最终结果。

图 10 显示了最终的数据帧。正如你所看到的,所有的转换都会导致两个分数的提高。Box Cox 变换和 log 变换的性能最好。

# 结论

数据不平衡不仅是分类任务中的问题,也是回归任务中的问题。回归模型的性能可能受到目标变量的分布不是正态分布和偏斜的事实的影响。对目标变量应用转换可以提高性能。

# 数据输入,预测输出

> 原文:<https://towardsdatascience.com/data-in-predictions-out-8be0812269ed?source=collection_archive---------33----------------------->

## 数据科学项目的生命周期

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fe71c8595dc9dd9f961477c02005f51b.png)

照片由 [Pexels](https://www.pexels.com/photo/cutout-paper-illustration-of-human-hand-with-magnifier-and-chart-5841845/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 的 Gabby K 拍摄

数据科学家在处理大数据时,遵循定义良好的数据科学工作流程总是有利的。无论数据科学家是希望以通过数据可视化传达故事的动机来执行分析,还是希望构建数据模型,数据科学工作流程都很重要。数据科学项目的标准工作流可确保组织内的各个团队保持同步,从而避免任何进一步的延迟。

任何数据科学项目的最终目标都是产生有效的数据产品。在数据科学项目结束时产生的可用结果被称为数据产品。数据产品可以是任何东西——仪表板、推荐引擎或任何有助于商业决策的东西)来解决商业问题。然而,为了达到生产数据产品的最终目标,数据科学家必须遵循正式的逐步工作流程。数据产品应该有助于回答业务问题。同样,数据科学项目的生命周期不应该仅仅关注过程,而应该更加重视数据产品。这篇文章概述了数据科学家遵循的数据科学项目的标准工作流程。解决任何分析问题的全球公认结构被称为跨行业数据挖掘标准流程或 CRISP-DM 框架。以下是典型数据科学项目生命周期中的各个阶段。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/82489dae5629411eaf285e0ea87424e0.png)

CRISP-DM 架构

## 1.商业理解

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f5ae2f79a68f5a8bed39a06f33d1b0f7.png)

照片由[娜塔莉亚·瓦特凯维奇](https://www.pexels.com/@n-voitkevich?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)从 [Pexels](https://www.pexels.com/photo/tax-documents-on-the-table-6863335/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 拍摄

整个循环围绕着业务目标。如果你没有一个精确的问题,你会解决什么?清楚地理解业务目标是极其重要的,因为这将是你分析的最终目标。只有在正确理解之后,我们才能设定与业务目标同步的具体分析目标。你需要知道客户是想减少信用损失,还是想预测商品价格等等。

## 2.数据理解

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3eb98c7044bf93d5ff6a975bc5a9ef2b.png)

照片由 [Pexels](https://www.pexels.com/photo/charts-on-black-wooden-table-669622/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 的 [Lukas](https://www.pexels.com/@goumbik?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 拍摄

业务理解之后,下一步就是数据理解。这包括收集所有可用的数据。在这里,您需要与业务团队密切合作,因为他们实际上知道存在什么数据,什么数据可以用于这个业务问题以及其他信息。这一步包括描述数据、它们的结构、它们的相关性、它们的数据类型。使用图形绘制来浏览数据,并提取通过浏览数据可以获得的任何信息。

## 3.数据准备

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f860383dfe59a939665746ba15834e24.png)

照片由[卢卡斯](https://www.pexels.com/@goumbik?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)从[派克斯](https://www.pexels.com/photo/person-holding-pen-pointing-at-graph-590020/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)拍摄

接下来是数据准备阶段。这包括选择相关数据、通过合并数据集整合数据、清理数据、通过移除或输入缺失值来处理缺失值、通过移除错误数据来处理错误数据、使用箱线图检查异常值并处理它们等步骤。构建新数据,从现有数据中获取新特征。将数据格式化为所需的结构,移除不需要的列和要素。数据准备是整个生命周期中最耗时也是最重要的一步。你的模型会和你的数据一样好。

## 4.探索性数据分析

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9d1d28c93ffb27473af9e167961a1488.png)

照片由[像素](https://www.pexels.com/photo/clear-light-bulb-355948/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)的 [Pixabay](https://www.pexels.com/@pixabay?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 拍摄

这一步包括在构建实际模型之前,对解决方案和影响它的因素有所了解。数据在一个特征的不同变量中的分布使用条形图进行图形探索,不同特征之间的关系通过散点图和热图等图形表示来捕捉。许多其他数据可视化技术被广泛用于单独探索每个要素,以及将它们与其他要素相结合。

## 5.数据建模

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d7768b6c1cfb80bb6a6074299eecfd7d.png)

照片由来自[佩克斯](https://www.pexels.com/photo/black-and-gray-laptop-computer-546819/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)的[路易斯·戈麦斯](https://www.pexels.com/@luis-gomes-166706?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)拍摄

数据建模是数据分析的核心。模型将准备好的数据作为输入,并提供所需的输出。这一步包括选择适当的模型类型,无论问题是分类问题、回归问题还是聚类问题。在选择了模型系列之后,在该系列的各种算法中,我们需要仔细选择算法来实现它们。我们需要调整每个模型的超参数,以实现所需的性能。我们还需要确保在性能和可推广性之间有一个正确的平衡。我们不希望模型学习数据,而在新数据上表现不佳。

## 6.模型评估

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e30ac629994429de9b8553e484f701ef.png)

照片由[维塔利·弗拉索夫](https://www.pexels.com/@ihasdslr?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)从[派克斯](https://www.pexels.com/photo/person-pointing-numeric-print-1342460/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)拍摄

在这里,评估模型是为了检查它是否准备好被部署。该模型在一个看不见的数据上被测试,在一组仔细考虑过的评估标准上被评估。我们还需要确保模型符合现实。如果我们在评估中没有获得满意的结果,我们必须重复整个建模过程,直到达到期望的度量级别。任何数据科学解决方案,一个[机器学习模型](https://www.educba.com/machine-learning-models/),就像人类一样,应该进化,应该能够用新数据改进自己,适应新的评估指标。我们可以为某个现象建立多个模型,但很多模型可能并不完美。模型评估帮助我们选择和建立一个完美的模型。

## 7.模型部署

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6d5bac80d07c9bf9ed5cfbcc1a776dca.png)

照片由[克里斯蒂娜·莫里洛](https://www.pexels.com/@divinetechygirl?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)从 [Pexels](https://www.pexels.com/photo/woman-standing-while-carrying-laptop-1181354/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 拍摄

经过严格评估的模型最终以期望的格式和渠道部署。这是数据科学生命周期的最后一步。上面解释的数据科学生命周期中的每一步都应该认真对待。如果任何一步执行不当,都会影响下一步,整个努力都白费了。例如,如果数据收集不当,您将会丢失信息,并且无法构建完美的模型。如果数据清理不当,模型将不起作用。如果模型评估不当,它将在现实世界中失败。从业务理解到模型部署,每一步都应该给予适当的关注、时间和努力。

人们经常混淆数据科学项目和软件工程项目的生命周期。情况不应该是这样的,因为数据科学更多的是科学,而不是工程。没有适用于所有数据科学项目的通用工作流流程,数据科学家必须确定哪个工作流最符合业务要求。上面描述的工作流程是基于一个最古老和最流行的工具——CRISP DM。它是为数据挖掘项目开发的,但现在也被大多数数据科学家采用,并根据数据科学项目的要求进行了修改。CRISP-DM 仍然是数据挖掘和数据科学项目的顶级方法/工作流,43%的项目使用它。

数据科学项目生命周期中的每一步都依赖于各种数据科学家技能和数据科学工具。它从提出一个有趣的业务问题开始,这个问题指导着数据科学项目的整个工作流程。数据科学项目生命周期是一个研究和发现的迭代过程,为使用预测模型所需的任务提供指导。从业务理解到模型部署,每一步都应该给予适当的关注、时间和努力。

感谢阅读!

如果你喜欢这篇文章,请随意查看<https://seekingwithin.substack.com/>****——**每周一期的时事通讯,涵盖了广泛的话题,探讨了这样一个信念:我们寻求的大多数答案就在我们自己身上。**

**想和我交流吗?通过[电子邮件](http://mailto:reuben3699@gmail.com/)、 [LinkedIn](https://linkedin.com.in/reubence) 或 [Twitter](https://twitter.com/reuben_rapose) 给我发消息!**

# 数据集成:权威指南

> 原文:<https://towardsdatascience.com/data-integration-the-definitive-guide-e9d42a95a6cd?source=collection_archive---------30----------------------->

## 简单来说,就是移动数据的过程

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5b719e56844a17580d5effe3dae4c88c.png)

帖子中的所有图片均由作者提供

# 什么是数据集成?

快速谷歌搜索说,“数据集成是将来自不同来源的数据组合成一个单一的、统一的视图的过程”。听起来很简单,对吗?但是,嘿——既然你正在读这篇文章,你已经知道这么狭隘的数据集成定义,至少可以说是鲁莽的。

在我开始描述数据集成的真正含义之前,让我向您保证,本指南并不是要说服您某个特定的解决方案或技术比其他的更好。相反,本指南的目标是为您提供一个全面、公正、360 度的数据集成前景概述。

为此,我将介绍构成数据集成前景的所有技术— **iPaaS** 、 **CDP** 、 **ETL** 、 **ELT** ,最后是**反向 ETL** 。

即使你是一个经验丰富的数据人员,我也希望这个指南能在你每次选择合适的方法来移动数据时成为你的计算工具。

好吧,那么什么是数据集成呢?

简而言之,**数据集成是*在数据库之间移动*数据的过程——内部的、外部的或者两者都有。**在这里,数据库包括生产数据库、数据仓库以及生成和存储数据的第三方工具和系统。

最好记住所有的集成工具都使用相同的底层技术——API。如果你想了解更多关于 API 的知识,这里有[一个深入的指南](https://zapier.com/learn/apis/chapter-1-introduction-to-apis/)、[一个视频](https://youtu.be/7YcW25PHnAA)和[一个课程](https://www.udemy.com/course/learn-and-understand-apis-and-restful-apis/)。

# 这么多动作..

*   **iPaaS 或集成平台即服务:**数据直接在云应用之间移动,iPaaS 中很少或没有发生转换
*   **CDP 或客户数据平台:**数据通过一个中心枢纽在云应用程序之间移动,从而实现适度的转换能力
*   **ETL 或提取、转换和加载:**数据通过 ETL 工具内置的健壮的转换层从云应用程序移动到数据仓库
*   **ELT 或提取、加载和转换:**数据从云应用程序直接移动到数据仓库,通过 SQL 在仓库中进行转换和数据建模。这里的主要区别是,使用 ETL,转换发生在数据加载到仓库之前(T2),而使用 ELT,转换发生在之后
*   **反向 ETL:** 数据从数据仓库转移到云应用。通常,核心转换发生在逆向 ETL 过程之前的仓库中,但是逆向 ETL 工具可能有一个最小的转换层来使数据适应外部系统的模式

现在,让我们更详细地看一下每一项技术——它们的优缺点、每一项技术的受众以及当今市场上的主要参与者。再次提醒,请记住,评论完全是基于正在讨论的技术,而不是基于在该技术下运营的公司或产品。

# iPaaS 或集成平台即服务

据称,iPaaS 是由企业 iPaaS 供应商 Boomi 于 2008 年创造的。从那以后,iPaaS 得到了广泛的采用,并导致了以各种形式和包装提供 iPaaS 解决方案的公司的激增。

今天最受欢迎的是面向企业的 [Tray](https://tray.io/) 和 [Workato](http://workato.com/) 以及面向中小企业的 [Zapier](http://zapier.com/) 、[integra mat](http://integromat.com/)和 [Automate.io](http://automate.io/) 。

不用说,集成和功能的范围因供应商而异,但从根本上说,它们都做同样的事情——基于触发器执行操作。触发器本质上是发生在系统 A 中的事件,该事件被传送到集成平台(通过 API 调用或 Webhook ),然后集成平台执行一个或多个预定义的动作。

最简单的例子是,每次您收到一封电子邮件(一个事件或触发器),您还会收到一条包含该电子邮件内容的松散消息(操作一),然后该电子邮件会被标记为已读(操作二)。在这里,一旦有新邮件到达您的收件箱,您的电子邮件客户端*就会将此消息发送*到集成平台,然后 iPaaS 会完成它的工作。

关于 iPaaS 解决方案,要记住的一件有趣的事情是,它们还可以按计划(比如每小时)检查系统 A 中的更改,如果检测到更改,就会执行指定的操作。

以上面的例子为例,集成平台可以每小时敲你的收件箱,如果有新邮件,它可以执行操作,如果没有,它什么也不做。在这里,触发器也是在你的收件箱中发现了一封新邮件,但这一次,iPaaS 必须从电子邮件客户端*获取*该信息,而不是将其发送出去。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/30a8085db6d71b81b6433523788ad149.png)

*数据如何通过 iPaaS 移动*

iPaaS 解决方案还可以用于在事件发生的内部系统之间移动数据。然而,这很不常见,因为集成平台通常根据它们执行的操作或任务的数量来收费,并且很快就会变得非常昂贵。

采用 iPaaS 的最大驱动因素之一是,它们提供了一个可视化界面来构建集成,使业务团队能够控制其工作流自动化需求。本质上,iPaaS 将最简单的编码概念引入到一个 UI 中,这个 UI 很容易操作,几乎不需要任何技术知识,这真是太棒了!

此外,iPaaS 解决方案的亮点之一是它们与第三方 SaaS 工具的深度集成。只要 SaaS 供应商公开了 API 端点,iPaaS 就可以从中提取数据或向其推送数据,从而实现一些真正复杂的集成,否则这些集成将需要编写和维护大量代码。

也就是说,像任何其他技术一样,iPaaS 也有一系列限制,并不是所有类型集成需求的理想解决方案。当需要移动不依赖于事件的数据时,基于事件的集成尤其不够。最后,由于 iPaaS 解决方案如此灵活和自由,它们给用户增加了很多复杂性。

# CDP 或客户数据平台

客户数据平台收集和整理来自不同来源的客户数据,并将这些数据发送到不同的目的地。这里需要注意的是,除了移动数据,CDP 还通过专有的 SDK 和 API 支持数据收集。然而,我打算将本指南的重点放在数据集成上,因此将把数据收集留给另一天的指南。

像 iPaaS 解决方案一样,CDP 在过去几年中也获得了发展,产生了横向 CDP 供应商,如[细分市场](https://segment.com/)、 [mParticle](http://mparticle.com/) 、 [Lytics](https://www.lytics.com/) 和 [Tealium](https://tealium.com/) ,以及专注于解决特定行业需求的纵向 CDP,如 [Amperity](https://amperity.com/) (零售和酒店)和 [Zaius](https://www.zaius.com/) (电子商务)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d8782da1bab272e4eb27fd42973a5dae.png)

*数据如何通过客户数据平台移动*

在移动数据方面,客户数据平台依赖于预定义的数据模型,并提供与第三方供应商的有限或浅层集成,这使得它们对于许多数据集成用例来说不太理想。

关于客户数据平台,需要记住的重要一点是,根据定义,CDP 不仅仅是在工具之间移动数据。它使营销和增长团队能够基于用户行为和用户特征构建细分市场,并将这些细分市场与第三方工具同步,以提供个性化体验,而无需依赖工程或数据团队。如果你想了解更多关于 CDP 的信息,[请查看来自数据导向学院的指南](https://dataled.academy/customer-data-platform/)。

另一方面,如果您已经在使用 Redshift、Snowflake 或 BigQuery 等数据仓库,您甚至可能不需要 CDP — [阅读这篇深入的文章,其中讨论了为什么您的客户数据平台应该是数据仓库而不是现成的产品](https://fivetran.com/blog/customer-data-platform-data-warehouse)。

# ETL 或提取、转换和加载

ETL 是一个传统的数据集成过程,根据维基百科的记载,它的起源可以追溯到 20 世纪 70 年代。然而,直到 90 年代早期,Informatica(T21)才让 ETL 在企业中变得司空见惯。然后是 2005 年推出的 Talend,现在是 ETL 领域的领导者。

在 ETL 范式下,首先从第一方数据库和第三方来源(主要是用于销售、营销和支持的 SaaS 工具)中提取数据,然后由 T2 转换数据以满足分析师和数据科学家的需求,最后由 T4 将数据加载到数据仓库中。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/899ef5f26a16b6611235be32b02362ca.png)

*数据如何在 ETL/ELT 解决方案中移动*

这种转换特别耗费资源和时间,会显著影响数据提取和加载之间的时间。

然而,由于仓储技术和生态系统的进步,ETL 正在被更快、更灵活的 ELT 所取代——请继续阅读以了解更多信息。

# ELT 或提取、加载和转换

ELT 是 ETL 的现代方法,由于 Redshift、Snowflake 和 BigQuery 等云数据仓库变得非常快速和可靠,使得转换可以在仓库内部进行,因此 ELT 在很大程度上得到了推动。除此之外,将计算与存储和数据仓库分离的架构的灵活性和成本优势变得显而易见。

five tran[、](https://fivetran.com/) [Stitch](https://www.stitchdata.com/) 和 [Matillion](https://www.matillion.com/) 是引领新 ELT 范式的公司。领先的 ETL 提供商 Talend 在 2018 年收购了 Stitch,以拥抱 ELT。因此,可以说 ELT 是新的 ETL,但是这两个术语现在都在使用。

在 ELT 范式下,数据从源系统中提取出来,加载到数据仓库中,而不发生任何转换。事实上,现代 ELT 工具甚至不提供内置的转换功能,而是与像 [dbt](https://www.getdbt.com/) 这样的服务很好地集成,这些服务是为处理数据仓库中的转换层而专门构建的解决方案,消除了在其他地方执行转换的需要。

ELT 快速、经济,最重要的是,不需要编码,所有这些都推动了从 ETL 到 ELT 的转变。

# 反向 ETL

使用 ELT 工具存储来自不同来源的数据有很多好处。但是,使用 dbt 等工具转换数据仓库中的数据的能力使数据仓库成为所有类型数据的真实来源,特别是通常分散在内部和外部系统中的客户数据。结果,一种新的工具出现了,由于没有更好的术语,逆向 ETL 诞生了。

Hightouch 是一个反向 ETL 工具,使 Retool、Superhuman 和 Zeplin 等快速发展公司的数据团队能够仅使用 SQL 而非脚本将客户数据从数据仓库同步到销售、营销和分析工具。

像 Hightouch 这样的反向 ETL 工具负责以下工作:

*   定期从仓库或数据库中提取数据,并将其加载到销售、营销和分析工具中
*   每次数据改变时触发一个 webhook 或进行任意 API 调用
*   将提取的数据行移动到生产数据库,以提供个性化体验

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/49d6b61ab2d3add08d6e0d7d60d156b3.png)

*数据如何通过像 Hightouch 这样的反向 ETL 解决方案移动*

你会问,这种新方法对数据团队有什么好处?

因为数据团队已经在维护数据仓库,作为用于分析目的的干净一致的客户数据的来源,将这些数据从相同的真实来源转移到云应用程序是一件容易的事情——数据工程师最终可以维护一个单一的数据管道,供团队*分析*以及*对数据采取行动*。

但是这仅仅有利于数据团队吗?绝对不会。

销售、营销和分析团队受到这一新数据工作流程的积极影响,因为他们最终能够*分析* **和** *根据*相同的*、*一致、可靠的*数据采取*行动。这建立了对数据的信任和团队间的和谐。

# 结论

我希望这篇文章能够帮助您理解整个数据集成的前景,并使您能够理解不同技术的优缺点。显而易见,有多种方法可以满足特定的集成需求,什么对您最合适取决于您的用例以及您可用的资源。

[如果您有任何反馈或者想了解更多关于这些集成技术的信息,我很乐意听取您的意见](https://twitter.com/iCanAutomate)。

[这篇文章最初发表在 Hightouch 博客](https://www.hightouch.io/blog/data-integration/)上。

# 数据集成—需要考虑的事项

> 原文:<https://towardsdatascience.com/data-integration-things-to-consider-d557ca97b2f1?source=collection_archive---------27----------------------->

## 对源系统的依赖性是什么?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/936bdd313e7d8fba5c83a51c2d833672.png)

约翰·福勒在 [Unsplash](https://unsplash.com/t/nature?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的照片

当将数据从系统 A 集成到系统 B 时,数据工程师和其他利益相关者不仅应该关注数据过程,例如通过 ETL/ELT,还应该关注源系统。必须考虑的各种情况以及我从早期项目中学到的内容如下:

## **供货情况**

源系统何时可用?你必须考虑维护周期、停机时间等。否则,如果系统不可用,数据集成过程将无法工作,或者只能捕获部分数据。这里,**实现对源系统的监控并使用重试机制**是有意义的(阅读[此处](/five-best-practices-for-stable-data-processing-99304b18360e)了解更多信息[1])。另一个主题是必须考虑的时间窗口,这将影响以下主题:

## **加载次数**

从源系统加载数据需要多长时间,我的进程在满负荷状态下访问源系统需要多长时间?例如,如果您正在进行批量加载或处理大量数据,对于大型数据库来说,这通常需要更长的时间——如果这需要太长时间或给源系统带来太多负载,您应该使用 **CDC 技术或数据库复制服务**。此外,您可以检查**源系统不得从数据传输中接收任何不必要的负载,例如在高峰时间**。我经历的一个例子是,到了月底,每月的财务报表对系统产生了很大的影响——在这里,数据处理作为额外的开销被更好地避免了。

## **不同的数据结构**

在大数据的新世界中,**基于列的非关系数据库和数据仓库正在兴起**。但是如果您有一个经典的数据库作为源系统,那么您必须在 ETL/ELT 过程中考虑这一点。例如,**如果数据来自源系统,那么在最先进的数据仓库服务**中对其进行反规范化是有意义的,比如 Google 的 Big Query 或 Amazon 的 Redshift,并在嵌套数组结构中对其进行处理。这不仅提高了速度,还带来了成本效应[2]。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ebb7c0c0819b8f5855cf583d100f8d97.png)

BigQuery 中嵌套数据的示例—按作者排序的图片

## **不同的数据类型**

**源系统和目标系统可能具有不同的数据类型**。一个经典的例子是,Oracle 数据库处理 0 和 1 或 char 'y '和' n' [3],而其他技术处理布尔值。为了便于以后的数据处理,例如通过 BI 工具,转换这些数据也是有意义的。

## 商业背景

除了这些技术点,**一般你还应该对源系统背后的业务有一点了解**。它到底是做什么的,背后的业务流程是什么,数据是由谁或通过什么生成的。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ce158aebe30497f7fafc14942c47bc05.png)

业务流程插图—作者图片

这总是帮助我,例如,快速理解数据错误,以有意义的方式设计数据转换,并且,如果必要的话,优化源系统以便优化后续的分析过程。

## 摘要

通过在数据集成项目中的一些经验,我清楚地认识到,不仅关注数据过程和目标系统,而且关注源系统总是有意义的。无论如何,作为项目经理或产品负责人,理解业务流程是至关重要的。这也适用于映射该过程的系统。以下是我认为最重要的几点,对于任何数据集成项目来说都要牢记在心。

## 资料来源和进一步阅读

[1] Christian Lauer,[稳定数据处理的五个最佳实践](/five-best-practices-for-stable-data-processing-99304b18360e) (2021)

[2]谷歌,[避免重复的连接和子查询](https://cloud.google.com/bigquery/docs/best-practices-performance-output#avoid_repeated_joins_and_subqueries) (2021)

[3] O'REILLY,[Oracle PL/SQL Programmin](https://learning.oreilly.com/library/view/oracle-plsql-programming/0596003811/)g(2021)

# 与熊猫的数据集成

> 原文:<https://towardsdatascience.com/data-integration-with-pandas-b7deaa4f0f31?source=collection_archive---------21----------------------->

## 如何轻松导入数据

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ef97fecc764b296edb7fd2c4bbb79008.png)

在 [Unsplash](https://unsplash.com/s/photos/pine?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上由[Duan veverkolog](https://unsplash.com/@veverkolog?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)拍摄的照片

对于通过 Jupyter Notebook 进行的即席数据分析,您通常需要通过 CSV、Excel 或数据库获得外部数据,以便使用 Python 对其进行处理。多亏了**便利的熊猫图书馆**,阅读数据相对容易。在本文中,我为您总结了标准流程。当然,您也可以将相同的错误用于以后的标准化和集成的数据集成过程,比如您的数据仓库的 ETL。

## 主要使用案例

下面是我选择的最常用的命令和源代码。如果你也想尝试一下,你可以简单地使用 **Jupyter 笔记本在线**——点击[这里](https://jupyter.org/try)【1】。

**从 CSV 文件中读取**

一个非常典型的第一个用例当然是著名的 CSV 文件,它要么作为源系统的转储提供给您,可以在线检索,要么自动存储在一个文件夹中。

```
import pandas as pdpd.read_csv(‘yourfilename.csv’, header=None, nrows=5)
```

在**导入熊猫**和通过 *read_csv* 导入文件后,您将已经看到成功:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fe99ae1a71938a2e09ae03c3a2b4b846.png)

导入的数据-按作者分类的图像

**从谷歌工作表中读取数据**

和上面一样,但是有一个谷歌表单链接— **注意你在**之前就把表单发布到网上了。(转到文件→发布到网站[2])

```
import pandas as pdnew_google_sheet_url = ‘[https://docs.google.com/spreadsheets/d/e/2PACX-1vQ8lv36OQPiqgfFjdgJF9clvwhhh2Ao2xDzkIzYp2g1CqBbpLsnW5nefPsPVOKKBX2PdFVX6Mweyyut/pub?gid=1696994381&single=true&output=csv'](https://docs.google.com/spreadsheets/d/e/2PACX-1vQ8lv36OQPiqgfFjdgJF9clvwABn2Ao2xDzkIzYp2g1CqBbpLsnW5nefPsPVOKKBX2PdFVX6Mweyyut/pub?gid=1696994381&single=true&output=csv')df=pd.read_csv(new_google_sheet_url)
```

瞧:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/54429943ea6558460ec64a6b899b4498.png)

导入的数据-按作者分类的图像

**从数据库中读取数据**

除了 CSV 和其他类似的文件,你还会经常将数据连接到数据库——这里,除了 Pandas,我们还需要 sqlite3 模块[3]。

```
import pandas as pd
import sqlite3
```

成功导入数据后,我们现在可以通过 SQL 字符串轻松地查询表:

```
# Read via SQLite databases
con = sqlite3.connect(“your.database.link”)
#Read table via Select Statement
player = pd.read_sql_query(“SELECT * from Table”, con)
#close the connection
con.close()
```

**其他可能的数据来源**

除了上面提到的标准数据源,当然还有许多其他可能的数据源,例如像 Google Big Query 和 Amazon 的 Redshift 这样的数据仓库技术,甚至是 NoSQL 数据库。在这里,你会经常找到可下载的 Pythons 库[4]。

## 摘要

无论是通过 Jupyter Notebook 进行的临时数据分析,还是后来的标准化和自动化数据集成流程,通常都需要文件或数据库等外部数据源。这些可以很容易地用工具集 Python、Pandas 和其他可能的库连接和查询。在本文中,作为概述提到了最常用的数据源,其他数据源通常可以通过其他第三方库访问。

来自 giphy.com 的 Gif 图片

## 资料来源和进一步阅读

[1]Jupyter.org,[主页](https://jupyter.org/try) (2021)

[2] [朱可夫格林](https://stackoverflow.com/users/4351027/zhukovgreen),[斯塔克韦尔弗洛](https://stackoverflow.com/questions/24063629/loading-a-generic-google-spreadsheet-in-pandas) (2016)

[3] pythoncentral.io,[Python 中的 SQLite 介绍](https://www.pythoncentral.io/introduction-to-sqlite-in-python/) (2013)

[4] Google,[使用 BigQuery 存储 API](https://cloud.google.com/bigquery/docs/bigquery-storage-python-pandas) 将 BigQuery 数据下载到 pandas(2021)

# 数据也适用于小型企业

> 原文:<https://towardsdatascience.com/data-is-also-for-small-businesses-9dad5598fb5c?source=collection_archive---------37----------------------->

## 了解中小型企业如何从数据中获取价值

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9afb0cb6c80c7a68d6162bcf0b1a034b.png)

迈克·彼得鲁奇在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

自从我开始在介质上写作以来,我一直关注数据的价值。在类似“[你的公司因为糟糕的数据质量损失了多少](https://medium.datadriveninvestor.com/how-much-is-your-firm-losing-because-of-poor-data-quality-6bb8996d0616)”、“[什么是商业分析?](https://medium.datadriveninvestor.com/what-is-business-analytics-ca535577865e)”或“[这是将改变您业务的数据的处理方式](/this-is-how-the-data-that-will-change-your-business-is-processed-4b5ab92ab9c1)”我们从不同的角度探索了数据,以及这些数据对于在市场中获得竞争优势的重要性。然而,您可能会觉得,用数据推动企业健康发展并在市场中竞争,这只是拥有长期预算的大公司所能承受的。当你听到的大多是海量数据(大数据)、强大的技术基础设施、大型多学科团队、企业内部各个层面的变化时,这是一种很自然的感觉。

如果你感到不知所措,冷静下来。我来自西班牙,在这个国家,中小企业是商业领域的重要组成部分。为此,我想帮助您了解如何利用数据来改进您的战略,更好地了解您的客户,并最终保持和发展您的业务,即使您正在工作或拥有中小型企业。以下是关于如何开始使用数据的四个建议。

# ☝🏽从一个具体的用例开始

你比任何人都了解自己的事业。在这种情况下,您需要考虑您的业务,并确定一个特定的用例。建议作为第一个,你选择一个容易测量的用例。否则,你会碰壁,因为你不知道从哪里可以得到数据。

开始处理数据时,最常见的错误之一是试图一次解决所有问题。这不是获取大量数据并“看看能用这些数据做些什么”这是关于思考,我能衡量什么,在总结时我能做出什么决定?如果你试图同时解决几种情况,你将会失去注意力,你将很难回答你问自己的商业问题。此外,您处理的数据量越大,资源就越多。

正如我们在文章“[这是如何改变您的业务处理方式的数据](/this-is-how-the-data-that-will-change-your-business-is-processed-4b5ab92ab9c1)中所讨论的,它以一个问题开始,以衡量结果结束。对你来说,选择正确的问题和决定后衡量你所获得的结果一样重要,因为没有衡量结果,你永远不知道你所做的决定是对还是错。

# ✌🏽数量不是质量

我们都很清楚我们生活在信息时代,世界各地不断产生大量新数据。当谈到大众媒体或社交网络中的数据时,我们通常将大数据称为唯一的现有数据。当我们谈论数据时,我们有偏见,我们认为大量的数据总是必要的,以便能够从中提取价值。大数据只是满足几个条件的数据集合:数量、多样性、速度、准确性和价值。在西班牙,你可以用一只手的手指数出拥有被视为大数据的必要数据量的公司。

你不需要有大量的数据来驱动你的业务,用较小的数据集也是可能的。

如果您不确定可以从哪里获得数据,首先考虑您可以使用的企业内部数据源。这里有一些想法可以帮助你:

*   客户关系管理
*   销售历史
*   产品库存
*   网站的谷歌分析数据
*   电子邮件

如果你的企业的内部数据源不够用,那么用外部数据源来扩展它们,比如社交网络或 web 报废。外部资源让你可以补充你对企业的愿景。

无论如何,要想到你的数据越多,你要清理和分析的数据就越多,这肯定会增加成本。获取足够大的数据集来开发您选择的用例,不要试图填充不必要的数据。

# 🤟🏽扔掉不必要的东西

大公司可以投入大量资源从他们的数据中提取价值,因为他们负担得起。大公司也会失败,但当他们失败时,后果并不像你失败时那么严重,因为他们可能会在某些方面失败,但他们肯定会在其他方面成功。因此,总的来说最终会是积极的。然而,如果一个小企业失败了,后果可能是痛苦的。

作为一个小企业,当你不确定你的业务是否会有真正的回报时,进行大量的前期投资是没有意义的。如果你可以分析数据,得出结论,并根据这些数据做出决策,那很好,但如果你的行动结果对你的业务来说不够,那就没用了。

从数据中提取价值不需要做的事情包括:

*   一个完整的数据部门
*   挖掘这些数据的大型团队
*   大量的数据
*   对 IT 基础设施的大量投资

表现得就像你是一家想生产最低可行产品的初创公司。关注要点,减少不必要的成本。你开始了。如果一切顺利,剩下的会自己来。

# ✊🏽利用敏捷性

公司就像船。对于一艘货船来说,改变方向并不是一件容易的事情。然而,如果你有一艘 65 英尺长的帆船,你可以根据需要多次改变航向。在商业中,这种类比是成立的。对于一家大公司来说,做出影响整个公司的决策是困难的,因为这需要许多人达成共识,并重新调整整个公司。然而,你的企业越小,你就越容易根据需要进行多次转换。

利用你所拥有的敏捷性作为相对于大公司的竞争优势。如果您没有足够的数据,请寻找其他来源。如果您选择开始的用例变得复杂,那么识别其他用例。如果这些数据让你对你的业务有了一个前所未有的认识,那就让你的业务模式或产品朝着正确的方向发展。接受新的想法,保持灵活性,将创业的心态融入你的公司。

越来越多的公司由数据驱动,这意味着,除其他外,他们做出的决策是基于数据的。如果你有一个小公司,你成为一个数据驱动的公司会容易得多,这可以让你做出更客观的决策。

处理数据是每个人都可以做的事情,即使你是一个小企业或为一个小企业工作。你也可以利用数据,但是是在不同的尺度上。保持一致,投入必要的资源,但不要认为越多越好。

我们在这篇文章中看到的 4 点将指导你,所以你可能知道从哪里开始。随着业务的增长,需求会越来越大,为了支持你需要做出的决策,你必须继续投资。不要超越你自己,利用你作为一个小企业所拥有的能力,去适应。衡量,实验,最重要的是,确认你采取的行动有积极的结果。

感谢阅读!🤗

# 数据是一种资产。它的价值是什么?

> 原文:<https://towardsdatascience.com/data-is-an-asset-what-is-its-value-464013d62640?source=collection_archive---------13----------------------->

## 像高管一样思考数据。

*本文是我在* [*大数据黄金时间 2021*](https://bigdata.primetimefor.cz/en/program) *大会上的演讲翻译。*

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/928cbf3f2093f1b72261a574cd08a4ef.png)

作者在演讲中。|[jiří·江田的照片](https://www.flickr.com/photos/34231398@N03/51674525903/in/album-72157720187223615/)

我我们都明白 ***数据有值*** 。这就是为什么公司大量投资数据,也是为什么这么多人选择数据作为他们的职业道路。

此外,数据也符合国际财务报告准则(IFRS)或经合组织(OECD)标准对资产的定义。

> 资产是由实体控制的资源,是过去事件的结果,预计未来的经济利益将由此流入实体。

尽管数据是一种有价值的资产,但我们并没有发现它在资产负债表中有所体现。这是为什么呢?道格·兰尼是《信息经济学》的作者,这本书是关于信息货币化和估价的。

2001 年对世界贸易中心的袭击不仅导致了悲惨的生命和财产损失。存储在双胞胎物理服务器上的大量数据也不可逆转地丢失了。

这吓坏了保险公司。想象一下,所有客户列表、历史交易和订单的价值会是多少!为了安全起见,他们将信息资产排除在保险单之外。他们没有浪费时间让这些轮子运转起来—信息资产的排除在攻击后的一个月内就完成了。而会计师在 2004 年[跟进,断言数据不算](https://www.iasplus.com/en/standards/ias/ias38)(无法投保时)。

但是,这并不意味着数据完全没有价值!相反,它的价值是一种固有的属性;这不是权威可以决定的。数据的价值取决于市场及其参与者。因此,我们看到许多数据市场正在兴起,公司在那里出售和购买数据集。想想看,有很多公司的产品无非就是把各种类型的数据提供给别人使用。

而且[数据甚至可以被用作抵押品](https://www.forbes.com/sites/douglaslaney/2020/07/22/your-companys-data-may-be-worth-more-than-your-company/?sh=4fb063ae634c),就像联合航空公司和美国航空公司在新冠肺炎疫情期间所做的那样。每家航空公司的客户忠诚度项目数据价值约 200 亿美元。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8da7a4a9f0e6e878d4fc44a51ea8cc7a.png)

由[克里斯蒂安·兰伯特](https://unsplash.com/@_christianlambert?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

对保险公司来说没有价值的东西,对银行来说却有巨大的价值,这难道不有趣吗?但是他们是怎么得出这个数字的呢?我们如何评价一个数据集?

有句话叫做*‘情人眼里出西施’*。这与买卖双方对数据价值的讨论有关。通常,卖方的观点通常基于构建数据集所产生的成本以及对买方业务影响的估计。另一方面,购买者在评估可能的业务影响的同时,也在估算建造成本(一个“购买还是建造”的决策)——他们通常可以准确地估算。导致卖方和买方之间某种程度上对称的信息不对称。

在现实生活中是如何运作的?我见过这样的例子,卖家认为数据集的价值比买家认为的高 10 倍。价格谈判中无法弥合的巨大差距。不过,我敢肯定,其他潜在买家对同样的价格会更满意。因为,就像我说的,情人眼里出西施。

但是请注意,卖方和买方都在考虑商业利益。那是因为**数据的经济价值** 绝对关键。

我们都见过数据如何被用来制定更好的决策、提高运营效率,甚至产生新的收入流的例子。所有这些都会直接影响公司的 P&L,进而影响其价值。

当考虑经济价值时,我建议采纳比尔·施马尔佐的建议,他在帮助我们理解数据经济学方面做了大量工作。[他说](https://hyperight.com/how-to-monetise-your-data-to-fuel-growth-in-your-business-chat-with-bill-schmarzo/),那:

> “你不能孤立于业务来确定数据的价值。”

数据有许多独特的属性,不会耗尽、恶化,可以使用和重复使用。多亏了这些,[正如比尔解释的](https://www.datasciencecentral.com/profiles/blogs/schmarzo-s-economic-digital-asset-valuation-theorem-formulas),我们对数据做得越多:边际成本变平(下图中的效果#1),经济价值增长(效果#2)。

而且,数据还可以并行多种用途!想象一下,一个客户数据集正被用来确定定价、产品推荐以及针对单个客户的营销活动。当我们提高此类客户数据集的质量,或者我们添加一个新的相关功能时,它会对依赖它的所有数据解决方案产生影响。因此,经济价值加速增长(效应#3)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ee38109e80ab40fe4436318ee050518a.png)

Schmarzo 的经济数字资产估值定理|来源:Bill Schmarzo,大数据 MBA |图片由作者提供

那么,x 轴上有哪些数据用例呢?

对我来说,一个数据用例、数据项目、数据计划,甚至整个数据策略都是关于三个问题的:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0ffee4f048d2458f46d0353a8dd08438.png)

作者图片

问题 1 将我们的数据项目与业务联系起来。重要的是,它还提供了经济价值的衡量标准(如 ARR、运营成本等)。

第二个问题需要整体回答,因为我们很少只需要数据和分析。我们必须考虑战略联盟、基础设施,可能还有最重要的人。这个问题的答案也让我们对投资的情况有所了解。

最后,第三个问题形成了一个可行的计划。它让我们能够对经济效益和投资进行排序。

我听到你们问,随着时间的推移,数据投资会有什么样的表现?与任何其他投资类似,数据投资回报率遵循熟悉的投资 J 曲线。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/493efd5888bf07132999b248865928b9.png)

作者图片

这里要提到两个要点:

1.  **时间不会停止。**因此,如果我们想在一年内将数据的经济价值最大化,我们不应该浪费六个月的时间去想该做什么。
2.  J 曲线的形状只是一个估计。没有人能保证下跌不会更深,或者甚至会回升,或者足够快地达到盈亏平衡,或者会像预期的那样继续急剧增长(并且持续足够长的时间)。

投资 J 曲线并不新鲜。然而,对数据的投资往往不像其他投资那样得到认真管理。

在我的职业生涯中,我曾在公司、咨询公司、初创公司和私募股权公司工作过。仅从我自己的经验来说,我提出这些看法:

*   在企业中,我们经常估计未来的影响来证明年度预算的合理性。实际影响很少被衡量。
*   顾问在“销售”单个项目的投资回报率,因此客户最终会得到几十条“J 曲线”(客户流失模型、数据仓库、新 ERP、Tableau 实施等),这些曲线很难汇总,也不会重复计算收益或错过任何投资。
*   对初创企业的数据投资往往受到下一轮投资对估值的影响。因此,收益的实现往往被推迟。
*   私人股本领域似乎得到了认真的管理。一位私募股权投资者收购了一家由关键业务指标驱动的公司,并计划在 5-7 年内出售该公司并获利。因此,数据投资的关键是对这些关键业务指标产生影响。在最初几年大量投资。透过 J 曲线观察投资组合中的公司,在公司从上升轨迹中受益时卖出(甚至为下一个收购者留下一些价值)以支撑估值。

那么,它在现实生活中是什么样子的呢?

举例来说,让我们考虑 SaaS 的 B2B 技术业务。这些公司的共同业务问题(请记住定义数据项目的第一个问题)是通过增加交叉销售和追加销售来推动 ARR(我们的关键业务指标)。

接下来,我们需要考虑需要什么来解决这个问题(数据项目的第二个问题)。在 [DataDiligence](https://www.datadiligence.com) 我们使用 SAPI 框架来提醒自己所有影响数据项目成功的重要因素。让我们看一个快速的高级示例。

*   从**战略**的角度来看,我们可能需要一个强大的赞助商,以及数据、销售和营销部门之间的紧密合作。
*   谈到**数据和分析**,可能需要高质量的 CRM 数据和购买倾向模型。
*   我们需要数据专家来构建 x-sell 模型。我们还需要确保销售和营销团队做出数据驱动的决策,并帮助将倾向得分转化为销售额。我们不要忘记,推动数据文化和采用的是**人**。
*   我们显然需要一个数据基础设施来运行这一切。包括构建和操作模型的数据科学平台。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9c65cfa17dc6824fb2f7bc15403d7d03.png)

SAPI 框架由 DataDiligence 有限公司提供,图片由作者提供

现在来谈谈与数据项目相关的第三个问题——我们如何完成它?我不会讲太多细节,因为这是每种情况的独特之处。但是从经济价值的角度来看,路线图通常包含四个阶段。

1.  首先,我们关注基础——建立数据基础设施,获取数据等。
2.  接下来,我们构建数据输出—我们示例中的购买倾向模型。
3.  然后,我们与销售和营销同事合作,利用这些来推动 x 销售(期望的业务成果)。
4.  最后,我们推出它,尽可能扩大影响范围,并尽可能延长影响时间。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3edbcf59dddf954220123be211fabff9.png)

作者图片

因为**数据是一项战略投资**并且应该如此对待,我们需要在路线图上附加一个投资计划。这通常包括所需的所有投资(资本支出、OPEX、基础设施、人员……)、对关键业务指标的影响(在这种情况下为 ARR)以及对现金流和 EBITDA 的影响(例如),按季度或任何其他合理的时间段衡量。

只有这样,我们才能正确管理项目——平衡投资和业务影响,同时处理数据项目的非线性、R&D 性质。通过这种方式,我们可以做出战术和运营决策,以便在需要时让项目回到正轨,并从错误中吸取教训以备将来之用。

我经常被问到的一个问题是,当有这么多其他因素在起作用时,我如何将数据项目对业务指标的影响归因于其他项目、竞争、营销活动、总体市场形势等。答案是用数据驱动决策!在我们的例子中,我们可以使用 A/B 测试,也许甚至包括一个*安慰剂*组。评估它们,并尽可能准确地评估数据项目的实际影响。

让我们假设项目进展顺利,对 ARR 的影响超出了预期。接下来呢?

要回答这个问题,我们需要回到数据经济学。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ee38109e80ab40fe4436318ee050518a.png)

Schmarzo 的经济数字资产估值定理|来源:Bill Schmarzo,大数据 MBA

并遵循这些步骤来最大化我们成功的机会:

1.  制定一个数据策略来很好地排序用例。
2.  开始!(时间不停。)
3.  做一个接一个的项目,建立在成功(和教训)和数据本身的基础上。

这是我们能够系统地实现数据经济价值的唯一途径。

这是最主要的。

数据是一种资产。流汗!

***感谢阅读!***

***欢迎在评论中分享你的想法或观点。***

***跟我上*** [***中***](https://adamvotava.medium.com/)*[***领英***](https://www.linkedin.com/in/adamvotava/) ***和*** [***推特***](https://twitter.com/_adam_votava) ***。****

# 数据堵塞会议:父母收入如何决定孩子上大学的概率

> 原文:<https://towardsdatascience.com/data-jam-session-digging-into-the-nyt-teaser-about-college-rate-versus-parent-income-99408e45e4b5?source=collection_archive---------39----------------------->

## 受《纽约时报》数据可视化的启发,我对大学出勤率和家庭收入之间的关系做了更深入的研究

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a2c9e6818f5a01bc5b1c659c69e582ff.png)

照片由 [**凯拉·伯顿**](https://www.pexels.com/@keira-burton?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 发自 [**Pexels**](https://www.pexels.com/photo/cheerful-diverse-classmates-studying-in-park-6146970/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)

5 月 14 日,《纽约时报》的时事通讯中有一个链接,链接到一个数据,即“穷人”和“富人”家庭的孩子上大学的可能性有多大。读者被要求在一张图上画一条线,y 轴是孩子上大学的比例(一个 0 到 1 之间的数字),x 轴是父母收入的百分比。
你可以试试[这里](https://www.nytimes.com/interactive/2015/05/28/upshot/you-draw-it-how-family-income-affects-childrens-college-chances.html?campaign_id=9&emc=edit_nn_20210514&instance_id=30809&nl=the-morning&regi_id=119956320&segment_id=58039&te=1&user_id=7bfb48191e644dd8f497d044991861fb)看看你的最佳猜测有多准。

正确的曲线如下所示:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/27e7770441aab9ce290cc4c7676de5f0.png)

图 1:上大学的孩子的比例和他们父母收入的百分比之间的关系大致是线性的。

这或多或少是一条直线。这意味着父母的收入百分位数和他们的孩子上大学的概率之间存在线性关系。NYT 的文章声称,这种关系让许多读者感到惊讶,因为他们中的许多人都误解了。

我认为这个*惊喜*可能不是因为数据,而是因为选择的指标:**收入百分位数**。当我和大多数人读到“富人”和“穷人”这两个词时,他们脑海中浮现的是实际收入。根据收入分布,即多少人赚了多少钱,相邻的收入百分位数可以对应非常不同的收入。你知道收入排在第 90 位的美国人的平均收入是多少吗?这与第 95 百分位的收入相比如何?大概不会。

在这个小小的数据堵塞会议中,我们将使用上面图[1]中的数据,添加收入分布信息以更好地解释它,并构建一个简单的大学出勤率模型。

我们将

1.  讨论为什么我们应该把大学入学率看作是父母收入和父母收入百分比这两个指标的函数,
2.  探索上面的图如何转化为不同收入分布的大学比率与收入的关系,
3.  查看并理解这个数据样本的真实收入分布,
4.  使用真实的大学入学率与收入的关系来预测如果收入分配不同,有多少(或少)孩子可以上大学。结果可能*其实* *会让*你大吃一惊!

## 收入百分比与收入

那么,哪个指标更能说明问题:实际收入还是收入百分比?首先,让我们回顾一下百分位数的定义:

> 第 10 百分位的家庭收入低于样本中 90%的家庭,收入高于样本中 9%的家庭。

使用 x 轴上的百分位是有意义的,因为它允许您对总体进行量化陈述。例如,我们可以粗略地看到,50%家庭的孩子上大学的机会不到 55%。这一指标还有一个很好的特性,即曲线下的面积是上大学的儿童总比例的估计值。对于这个数据集,我们得到 58.3%。(这是假设孩子的数量不太依赖家庭收入。)

然而,有人会说**决定一个年轻人能否上大学的相关数字不是他们父母的收入与其他父母的收入相比如何,而是他们的收入与高等教育成本相比如何。**

为了理解为什么上面的曲线或多或少是一条直线,包括在较高的收入百分位数(人们会期望它变平,因为每个人都应该能够负担得起大学,对不对?),我们遗漏的关键信息是收入百分比和实际收入之间的关系。

## 看看不同的收入分配方案

为了说明,让我们对可能的收入分布进行一些猜测,即父母在每个百分点的家庭收入:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e871620fde85ce6c988485bf00df16b3.png)

图 2:不同的收入分配情景;一个是我们数据集中真实的收入分布。你能猜出是哪一个吗?

让我们花一分钟来了解它们。

*   情景 1 低收入的人很少,高收入的人很多。第 50 百分位和第 90 百分位的收入没有太大差别,这意味着收入最高的 50%的人赚的钱非常相似。你可以说这是一个更加公平的社会的收入分配。
*   场景 2 是线性关系。第 20 和第 30 百分位之间的收入差距与第 80 和第 90 百分位之间的收入差距相同。所有输入箱等间距分布。
*   在情景 3 中,相邻百分位数之间的收入差异随着百分位数的增加而增加。这意味着从第 20 个百分点到第 21 个百分点的收入增长比从第 90 个百分点到第 91 个百分点的增长要小得多。在这种情况下,富人赚的钱比穷人多得多。
*   情景 4 是百分位数低于 75 的线性关系和百分位数高于 75 的指数关系的混合。在这种情况下,收入较高的那几个百分比的人比所有其他人赚的钱都多,包括那些收入在 90%的人,而收入较低的人有更多类似的收入。

**这些*场景中的一个*是真实分布(对于这个数据集),你大概能猜到是哪一个?**

没错,就是场景 4(红色曲线)!

你可能已经注意到这些场景有些奇怪:它们有不同的资金总量(曲线下的区域)。为了解决这个问题,我们将它们归一化到曲线下的公共区域:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9580521cdd12374d4815351fa8a2b23a.png)

图 3:当对所有收入组求和时,确保我们所有的收入方案都有相同的总收入。

请注意,因为现在货币总量是守恒的,所以不同情景下最高收入人群的收入差别很大。

## 大学出勤率与实际收入

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1098bf85a1848dfb6a54cb4501108898.png)

图 6:在基于实际数据的场景 4 中,大学出勤率在收入约 20 万时开始饱和。

如果我们将孩子上大学的比例与实际家庭收入(以美元计)进行对比,我们会发现 90%的比例在家庭收入接近 20 万美元时达到,这比美国人的平均收入高得多。

对照实际收入绘制所有场景,我们得到:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9b9cff992260ffc699c7fae511571207.png)

图 7:在所有收入分配方案中,上大学的儿童比例与家庭收入的关系图。

表明在其他情况下,我们已经在低得多的收入下实现了 90%的大学入学率。

**这说明了了解实际收入分布(百分位数和收入值)的重要性,以便充分掌握 NYT 时事通讯(图 1)中的信息。**

有了这个认识,让我们继续,看看我们是否可以做一些进一步的分析。

## **预测不同收入分布的大学入学率**

到目前为止,我们保持了收入百分比和大学出勤率之间的固定关系。正如我在开始时所说,这是不现实的。相反,人们会认为上大学的可能性取决于实际收入(美元)以及它与大学教育成本的对比。

如果我们确定实际收入(美元)和大学费用之间的关系(如果我们知道真实的收入分布,我们可以这样做),我们可以推导出在不同的收入分布情况下,有多少孩子能够上大学。(请注意,该模型隐含假设高等教育成本独立于收入分配)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/43c199000470806904f035e634ed014c.png)

图 8:不同收入分配情景下上大学的儿童比例。假设上大学的概率是由父母的收入决定的,而不是与其他收入相比。

红线表示我们从第一个图开始的真实数据。场景 4 是真实的:在这个数据样本中,收入与百分位数的关系是线性的,除了在最高收入区间,它变成了指数关系。收入最高的家庭平均收入为 140 万美元,而收入倒数第二的家庭收入不到这个数字的三分之一。第 90 百分位的家庭平均收入为 15 万美元。这解释了为什么即使在高收入百分位数的情况下,大学出勤率仍然线性地依赖于收入百分位数,也解释了为什么当被要求画出图 1 时,许多人会弄错。

我们在开始时已经计算过,真实数据样本中上大学的儿童的总百分比是 58.3%。我们现在可以计算其他收入分配情景的百分比:

*   情景一:63.5%
*   情景二:62.5%
*   情景 3: 50.0%

场景 3 比我们的基线场景(事实)拥有更多的高收入家庭,其大学入学率只有 50%。这是因为在这种情况下,中产阶级下层最终会拿回家更少的钱,这将他们的许多孩子排除在大学之外。即使在我们最公平的收入分配方案中,我们也只能提高 4-5%的大学入学率。
这是为什么?
如果你回到图 6,你会发现中低收入人群上大学的概率随着收入的增加而急剧增加。

**为了将大学入学率提高到 60%以上,我们需要让大多数家庭的收入超过 6 万美元**

*或*

降低高等教育的成本。

# 摘要

我们已经看到,在分析大学出勤率时,父母的收入百分位数和收入都是需要考虑的重要指标。

我们已经了解到,在美国,父母的收入在收入较低的 75%的人群中呈线性增长,而在收入较高的 25%的人群中呈指数增长。

基于大学学费取决于实际收入以及实际收入与大学费用的比较这一假设,我们发现,即使收入分布完全不同,大学学费的变化也不到 5%!

对我来说,这是这个数据集真正的惊喜。这表明,提高大学出勤率,尤其是低收入家庭孩子的大学出勤率的最有效方法是降低高等教育的费用。然而,这个想法需要在将来的另一个数据阻塞会议中进行探索!

现在,我希望你喜欢这个。你可以在这里找到随附的 jupyter 笔记本。

# **参考文献:**

我使用的数据是公开的,是从 https://opportunityinsights.org/[下载的。](https://opportunityinsights.org/)

数据链接:[https://opportunity insights . org/WP-content/uploads/2018/04/Statistics _ By _ Parent _ or _ child _ Income _ percentile . xlsx](https://opportunityinsights.org/wp-content/uploads/2018/04/Statistics_By_Parent_or_child_Income_Percentile.xlsx)

它最初被编译并用于本文:

[1] R. Chetty,N. Hendren,P. Kline 和 E. Saez *《机会之地在哪里?《美国代际流动的地理》* (2014 年),《经济学季刊》

论文链接:https://www.nber.org/papers/w19843

引发这一分析的《纽约时报》数据可视化:

[https://www . nytimes . com/interactive/2015/05/28/upshot/you-draw-it-how-family-income-affects-children-college-chances . html?campaign _ id = 9&EMC = edit _ nn _ 20210514&instance _ id = 30809&nl = the-morning&regi _ id = 119956320&segment _ id = 58039&te = 1&user _ id = 7 bfb 48191 e 644 DD 8 f 497d 044991861 FB](https://www.nytimes.com/interactive/2015/05/28/upshot/you-draw-it-how-family-income-affects-childrens-college-chances.html?campaign_id=9&emc=edit_nn_20210514&instance_id=30809&nl=the-morning&regi_id=119956320&segment_id=58039&te=1&user_id=7bfb48191e644dd8f497d044991861fb)

任何想法和数字(如无特别说明)均为本人所有。

# 数据工作不适合我,下一步该做什么?

> 原文:<https://towardsdatascience.com/data-job-is-not-for-me-what-to-do-next-70c90ea14d8f?source=collection_archive---------35----------------------->

## 当你意识到数据工作不适合你时该怎么办。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/309c2fb98f73494bec08b89060a95ef9.png)

马库斯·温克勒在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

你可能会看到新闻或求职申请提到数据行业的人挣多少钱。

你对行业前景感兴趣,并开始从所有在线课程、youtube 频道、文章甚至训练营中学习。

你学习数据、统计和编程语言,在那里花费了很多时间和金钱。

然后你意识到你可能对数据工作本身不感兴趣,只看到行业前景。当你学习所有与数据工作相关的东西时,没有什么乐趣可言,你只是为了成为一名数据科学家而投入了如此多的时间和金钱,才留下来学习更多的东西。

可能有人熟悉这种故事吗?这是一个压力很大的情况,但也是一个现实的情况。

根据我的经验,并不是每个人都喜欢处理数据。即使它可以随着时间的推移而增长,仍然有许多选择。

那么,当你意识到数据工作不适合你的时候,该怎么办呢?

# **接纳自己**

在你做任何事情之前,确保你已经**确定**要离开数据领域,即使只是暂时的。意识到你感觉不到你的激情或者只是你想做的事情并不尴尬。毕竟这是为了你的幸福。

以我的经验来看,我以前教过的学生中,很少有人尝试数据领域,但最终意识到这不是他们想要做的事情。这让他们感到焦虑和恐慌,因为他们牺牲了大量的金钱、时间和精力来进入数据领域。

我给那些在数据领域感觉不太对劲的学生的第一个建议是**“感觉没问题,保护好自己。”**研究自己不喜欢的东西,就像在自己不喜欢的公司工作一样;你总是想放弃。

如果你仍然觉得一下子放下一切不是一个正确的举动,那就试着给自己一些时间,让自己与数据领域保持距离。之后你可能就知道自己想要什么了。

# 找到你“正确的”数据工作

当你在了解数据职业时,你看到的是大公司内部对 AI 或机器学习实现的美化。你看到它,觉得如果你能做那种工作,会赚很多钱,只是意识到它不适合你。

那么也许,仅仅是也许,你想要的数据工作并不适合你。你的优势可能在于数据工作,但你看到的是一种不同的数据工作。毕竟数据工作有很多种。

最容易分类的是**数据分析师**、**数据工程师**、**机器学习工程师**、**数据科学家**。这些是由许多公司定义的现代数据工作。

例如,我之前学习了许多数据科学材料,以意识到他的热情不是创建一个预测机器学习,而是从可用数据中创建一个描述性分析,并创建一个令人惊叹的仪表板。他最初的目标可能是成为一名数据科学家,但最终却喜欢上了数据分析师的工作。

# 打开另一个机会

虽然您已经学习了所有数据科学材料,但并不认为这是您想要的,这并不意味着您所学的一切都是徒劳的。这实际上是一份材料,你可以申请另一个就业机会。

我认识几个学习数据科学的人,但他们不一定想成为数据科学家或在这个领域工作。他们正在学习数据科学,以提高他们对当前工作的理解,并在工作中做得更好。

例如,我认识一个学习数据科学的商人,他想更好地理解呈现给他们的数据,并根据数据做出决定。另一个例子是,我的学生从学习数据科学变成了一名 web/应用程序开发人员。

我建议避免这样的想法,当你学习数据科学时,工作机会只在数据领域。也许在申请市场营销职位时,你不会在简历中展示 Python 技能,但心态仍在。

试着拥抱你真正喜欢做的事情,试着寻找另一个机会。然后,试着把在数据科学学习中学到的东西运用到自己的工作中。你可能想坐下来,用你在数据科学方面学到的知识修改你的简历,看看哪种技能适合另一个机会。

# **结论**

在数据领域找一份工作是很难的,在你完成了所有的学习之后更难放弃。有时候我们需要接受这不是我们想要做的,然后继续做我们真正想要的事情。

对于那些觉得数据工作不适合自己的人,我的建议是:

*   **接纳自己**
*   **找到“正确的”数据作业**
*   **打开另一个机会**

# 如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的[简讯。](https://cornellius.substack.com/welcome)

> 如果您没有订阅为中等会员,请考虑通过[我的介绍](https://cornelliusyudhawijaya.medium.com/membership)订阅。

# 数据新闻,一种三维空间投影

> 原文:<https://towardsdatascience.com/data-journalism-3d-spatial-projection-a54c96137c6a?source=collection_archive---------37----------------------->

## [数据新闻](https://towardsdatascience.com/tagged/data-journalism)

## *一个将数据新闻知识解构为几个主要筒仓的框架。*

*【作者表示有兴趣利用这一框架为不发达国家和偏远地区的在职记者提供数据新闻培训】。*

# 数据新闻

1848 年,美国国会议员霍勒斯·格里利利用他对旅行报销记录的访问权,为纽约州论坛报撰写了一篇报道,以**文本和表格**的形式,列出了“每个国会议员的姓名,以及他获得的里程数、邮路可能给他的里程数,以及他们之间的成本差异。”([汉密尔顿,2016](https://journals.sagepub.com/doi/abs/10.1177/1077699017701926) )。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e371d138644702c5c3e9d38555344554.png)

来源: [pixabay](https://pixabay.com/vectors/coach-horse-horse-drawn-stagecoach-2027207/)

这种数据新闻的行为可能比该领域的定义早了 150 多年,但仍然包含了目前范围内的大部分元素。

2014 年,亚历山大·本杰明·霍华德教授(哥伦比亚大学)[为数据新闻业提供了一个**现代定义**,即“收集、清理、组织、分析、可视化和发布数据以支持新闻行为的创作”的工作。](https://academiccommons.columbia.edu/doi/10.7916/D8Q531V1)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9ba115fbec07693c3818cd1c6eaa18aa.png)

资料来源:Dror Kessler

# 解构

从表面上看,解构可以被描述为一种批判性分析的方法,这种方法强调概念系统的内部运作,将其分解为**个组成部分以及它们之间的关系**。

汉密尔顿对数据新闻的定义提供了一系列与数据相关的活动,人们可以在创作故事的过程中参与这些活动。通过这样做,他提供了一个**面向任务的**,以及某种程度上连续的、解构的实践视角。

解构的行为有几个吸引力。它允许将一个整体分割成它的组成部分,从而暴露出它的内部结构和内部依赖性。通过识别每个元素,特定的知识可以与其特定的性质相关联,从而有助于**专业化**和深度。

此外,特定解构策略的选择引入了知识的一个额外的**方面,通过识别其独特的使能价值,作为一种视角,或特定种类的透镜,用于获得对整体的理解。**

# 空间投影

因此,我们有理由假设几种不同的解构可以应用于同一个整体,每一种都突出了一个特定的观点,并呼吁关注特定类型的专业化。

组合几个这样的分解提供了一个**多维表示**,每个分解作为这个新空间的一个轴。空间中的每个交叉点都可以用它在每个轴上的投影,用它与每个分解的关系来描述和研究。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/820f48c98789bc226b44319338b32ac3.png)

来源:[维基媒体](https://commons.wikimedia.org/wiki/File:Coord_planes_color.svg)

我们整个就是数据新闻的实践。我们将大胆地为它的分解提供几个轴,它们一起将形成一个多维空间,数据新闻实践**居住在其中**。

# 提议的解构

我们提出**三个主要分解**,用于将数据新闻描述为一个 3D 空间,以及支持方面的两个额外的**枚举划分**:

*   D1:故事的类型,它的角度。
*   D2:数据性质**来源**。
*   D3: **工具链**/用于处理相关数据的技术。
*   S1:所涉及数据的**格式**。
*   S2: **活动**/完成的任务。

使用这三个主要的分解,我们因此可以**描述**一个特定的数据新闻行为(例如一个故事),根据它是什么类型的故事,它的数据来自哪里,以及我们如何处理它。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/249b6281c29e36861e270c7d1b0f9b6e.png)

资料来源:Dror Kessler

此外,根据行为的性质,我们可能会对数据的格式和感兴趣的特定活动给予**额外的关注**。

本文的其余部分将概述数据新闻的上述五种分解,并提供关于如何使用它们来描述实践的信息。

# D1:故事角度

伯明翰城市大学和 BBC 数据部的保罗·布拉德肖写了关于数据故事的 7 个常见角度。作为第一次迭代,我们将把这个**分解**作为故事角度分解。

布拉德肖写道:

> 我发现实际上大致有七个核心数据故事角度。许多人在讲述故事时将其他角度作为次要维度(例如,一个变化故事可能会继续谈论某件事情的规模),但我所看的所有数据新闻故事都以其中一个角度为主导。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6c17d3d937c70b929117875d7ea0959d.png)

来源:[在线新闻博客](https://onlinejournalismblog.com/2020/08/11/here-are-the-7-types-of-stories-most-often-found-in-data/)

简而言之,以下是布拉德肖描述的七个角度:

1.  **规模**:“这是一个多么大的问题”
2.  **变化**(和停滞):“这是上升/下降/没有改善”
3.  **排名**(还有离群值):“谁最好,谁最差?谁不寻常,为什么?我们排在哪里”
4.  **变化**:“邮编彩票”,地图和分布
5.  **探索**:工具、模拟器、分析、互动和艺术
6.  **关系**(及揭穿):“事物有联系”——或者没有。网络,权力和金钱的流动。相关性与因果性。
7.  **不良/开放**(问题和解决方案) :不良数据、“无数据”和“获取数据”案例。

# D2:数据来源

数据可能驱动或支持一个故事,可能来自一个或多个来源,通常以数据集**的形式出现。一个故事的数据可能已经存在,或者将被专门收集来支持这个故事。**

一些特定类型的数据源可能会提供独特的机会。例如,一个定期发布的数据集可能会被**预期**一个基于其先前发布的处理代码,并在它可用时导致更快的故事周转。

我们可以识别出数据故事背后通常存在的以下类型的数据源,与特定的数据格式无关

1.  **公布的**:官方定期公布的数据,通常由负责收集和发布的机构公布(如国家统计局)。
2.  **收集的**:由新闻机构以调查和其他研究方法的形式(例如,在特定推文和其他社交网络事件发生时,自动将它们累积到电子表格中)通过手动或自动方式收集和汇总的数据。
3.  **废弃的**:可在线获得(通常在网站上)但无法直接以可用形式获得的数据,因此被自动流程“剥离”。这是数据收集的一个特例,但由于它很常见且意义重大,因此值得独立存在(例如,从在线市场收集产品信息和供货情况,或从 PDF 文件中检索表格)。
4.  **被黑**:通过使用高级分析、监视和其他计算知识密集型方法从可用和受保护的来源获得的数据(例如监测区块链网络的异常事件)。
5.  **泄露**:通过泄密行为或其他形式的披露(如维基解密)提供的数据。
6.  **API** :通过使用由信息持有者提供(或发现被暴露)的应用编程接口获得的数据(例如,随着时间的推移使用特定标签的推文,使用 Twitter API)。

# D3:工具链

一旦数据到了数据记者的手里,它必须被处理,作为研究的一部分,导致一个故事,故事本身的写作,和它的交付给读者。

用于此类处理的工具在复杂性、可用性和用途方面各不相同。一些工具是通用的(电子表格),而另一些工具需要专业知识(例如人工智能模型)。

一些工具通常以免费网络服务的形式提供(例如 datawrapper 和 fluorescent visualization assistants ),而其他工具则需要安装和付费许可。一些工具可能专门用于特定的任务(例如 open refine——清理数据),而其他工具则是通用和开放的(Python、Jupyter 笔记本和 Pandas 库)。

数据新闻从业者可能会选择集中并拥有(也可以说是掌握)一套特定的工具,这些工具将成为某种工具箱——在数据出现时应用于数据,并快速处理并将其转化为故事形式。

由于这些工具集在整个故事的生命周期中会以连续的方式处理数据,所以这里采用了工具链这个术语。在软件开发中,工具链是一组用于执行复杂软件开发任务的编程工具([维基百科](https://en.wikipedia.org/wiki/Toolchain))。

类似地,在数据新闻中,工具链是一组服务和工具,用于执行与新闻行为相关的数据处理的各个方面。

作为第三个分解轴的一部分,我们建议对工具链进行以下主要分类:

1.  **电子表格**:行/列模态工具,如 Microsoft Excel 和好的工作表。
2.  **在线工具**:互联网上提供的服务,通常是免费的,可以根据设定和定制的模板上传和处理数据。
3.  **Python** (编程):开放式编码,使用一组公共库进行数据处理,笔记本(Jupyter)或 IDE 形式,着眼于一般计算社区。
4.  (编程):开放式编码,使用 RStudio 和一组公共库,着眼于英国和其他新闻/统计社区。
5.  **命令行**(编程):使用 Linux(以及 MacOS)文本处理命令行实用程序进行低级和高吞吐量处理,着眼于黑客社区。
6.  **API** :使用网络可用的编程服务来收集、丰富、处理和发布数据。这个类别是“在线工具”类别的程序兄弟。
7.  **人工智能**:一个横向类别,包含与在数据处理环境中使用人工智能相关的其他类型和方法的工具链。因为这是一种高度专业化的方法,所以它是独立的。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/55e1db36990cae5660c8a991b3d726ee.png)

来源:[凯文·霍奇森](https://www.flickr.com/photos/dogtrax/12050717093)

# 中间点

建立了三个主要的分解,角度-源-工具链,我们可以回到数据新闻行为存在的 3D 空间的概念:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ce9fde445104ca5c6385f45c658125cd.png)

资料来源:Dror Kessler

因此,当**将**投影到每个轴上时,每个故事都可以定位在 3D 空间中。此外,story 可能会沿着不同的轴移动,以寻找更有效的角度、替代数据源或工具链来解决处理问题。

例如,一个关于从 Covid 中恢复最慢的西方国家的故事,一个**排名故事**,可能从世界卫生组织公布的数据中提取数据,并由电子表格工具链处理。

发现这个故事缺乏吸引力,人们可能会使用另一个数据集,这次是废弃的,关于选定国家的疫苗接种率,来改变故事的角度,成为一个关系故事。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7ec6c473b7790ef168f89bb53efef7f2.png)

资料来源:Dror Kessler

在这种情况下,横跨两个轴(角度、源)的**运动**被用于增强故事,同时保持相同的工具链。

或者,一个人可能使用 Excel 处理与一个故事相关的数据,却发现它的**庞大的数据量**使得对数据的探索变得缓慢,从而降低了截止日期的可能性。在这种情况下,工具链开关可以被认为是一种更有效的开关,可能属于**编程**家族,以取得领先。

因此,将这一框架应用于发展中的故事的能力可以为**生成故事**提供一个地图,中途改变方向,并以有效的方式成功完成数据新闻行为。

当一个有抱负的数据记者开始选择要掌握的领域时,它也可以作为一个专业选择系统。

接下来,我们将概述两个额外的枚举分区。

# S1:数据格式

作为补充,我们列举了可能遇到的数据源的格式。

数据格式在某种程度上与**刀具链**轴相关,因为特定的刀具链更**适合**处理某些格式。

与其他分解一样,这种分解有助于数据新闻行为的产生和记者的专业化。

学习**识别数据格式**,基于它们相关的文件扩展名、交付协议和视觉/文本表示,是探索数据源和在网页和文件中找到数据孤岛的一项有价值的技能。

发现以下格式是常见的:

1.  **XLS** (Excel 格式):可以直接加载到 Excel 和类似工具(Google Sheets 等)中的二进制数据文件。该格式描述了一个二维单元格矩阵(一个表),通常组织为多列数据行,可能带有一个列标题行。一个文件可能包含几个命名的表,通常用于在单个文件中传递相同数据的几个方面。这种文件类型和所有其他格式一样,也可以通过基于编程的工具链(Python、R 等)来访问。
2.  **CSV** (逗号分隔值):可以直接加载到电子表格和其他工具中的结构化文本文件。文件中的每一行(一行)都由分隔符(通常是逗号)分隔的列值组成。该文件可能包含一个列名标题行作为其第一行。与 XLS 相反,这种格式是自然的,不依赖于工具。尽管如此,它的一些限制使这种格式更具技术性,但仍然非常容易理解。
3.  **HTML** (XML/RSS):网页是使用超文本标记语言(HTML)构建的。对这种格式的深入了解对于数据记者在抓取网站以及生成交互式演示文稿(结合 Javascript)时非常有用。作为一种“标记语言”,HTML 与各种 API 和数据源使用的 XML(通用可扩展标记语言)有些关系。RSS 作为 XML 的具体实现,用于新闻和其他提要(播客等)。
4.  **JSON** :代表 JavaScript 对象符号。JSON 是一种存储和传输数据的轻量级格式。当数据从服务器发送到网页时,经常使用 JSON。JSON 是“自描述”的,很容易理解( [w3schools](https://www.w3schools.com/whatis/whatis_json.asp#:~:text=JSON%20stands%20for%20JavaScript%20Object,describing%22%20and%20easy%20to%20understand) )。这种格式经常出现在 HTML(网页)和 REST APIs 中。
5.  **纯文本**(a)数据可能出现在非结构化文本文件中,而不是 CSV。尽管如此,纯文本还是拥有一些固有的特性。文件由行组成,而行由字符组成,通常使用特定的字符集编码。虽然编程环境最适合处理这类文件,但有经验的用户将能够使用电子表格软件来解析这类文本并从中提取数据。
    (b)文本文件可以仅包含文本(例如,演讲或法律的文本)。这种文件可以通过统计和人工智能方法进行语义分析,这些方法可以提取感兴趣的特征,例如词汇、对概念的引用、提到的人和地点等。
6.  **PDF** :一种可移植的文档格式,起源于印刷行业,现在作为一种出版、人类可读的格式非常普遍。以 PDF 文件发布的报告通常包含感兴趣的数据孤岛。提取这样的数据不是一个简单的任务,有些错误,但仍然很有可能。一系列的在线服务、编程库和黑客,供喜欢冒险的记者使用。
7.  **媒体**(音频/视频):数据可以采用文本和数字之外的形式(尽管人们可以认为所有计算机处理的数据都是数字的——即量化的)。转换的音频是数据。街头摄像机的视频就是数据。能够处理如此多样的数据格式是一个高级和专业的飞跃,但仍然存在一些简单的情况。例如,将一段对话的音频文件转换成文字记录,识别所有各方并自动翻译成一种目标语言的能力是一种可以使用的标准服务。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/86d8c9731cc30a0613dfcd15eb0b39ce.png)

来源:德罗尔·凯斯勒&[allispossible.org.uk](https://www.flickr.com/photos/wheatfields/4156011254)

# S2:活动

最后但并非最不重要的是活动分解,正如霍华德对数据新闻的定义所提供的:

1.  **采集**:与获取数据相关的活动,如找源、下载、收集、刮取等。
2.  **清理**:应对收集的数据进行审查,以发现收集过程本身的错误、缺失值和其他人为因素(如清除 bug、更改网站、误用调查、拼写错误等)。
3.  **组织**:干净的数据可能需要重新构建,并与其他数据源交叉关联,以生成适合分析的数据。通常收集的数据本质上是通用的,可以缩减为足以支持分析的子集。来自多个源的数据可以使用一个公共键进行连接。例如,房屋销售数据可以在房产地址上连接以提供地理编码位置,从而支持空间(距离)分析和基于地图的发布。
4.  **分析**:故事的角度需要得到数据的支持——这个简单的本质要求对数据进行分析并找到支持证据。这可以是一个简单的数字(增长的百分比),也可以是一个复杂的多变量关联(有色男性被截停和搜索更频繁)。
5.  **可视化**:数据可能以文本形式(自去年以来增长了 45%)或图形形式出现在最终故事中,图形形式通常由信息图、互动页面和其他媒体形式组成,统称为可视化。这可以从简单的条形图到实际的艺术形式。通常作为出版流程的一部分(面向读者),可视化也可以在分析活动中发挥作用,因为它允许记者获得以视觉方式表现自己的见解(使用时间增强的人类视觉模式识别能力)。
6.  **出版**:让最终读者了解故事是记者行为的最后一步。在现代背景下,这包括在线(包括社交网络)出版。掌握这项活动需要在线格式(HTML、Javascript)和社交网络礼仪的制作知识。一个相关的领域,SEO(搜索引擎优化),是前社交时代的遗留物,对有效阅读有一定的重要性。

这些活动与新闻行为(故事)的生命周期相关。一些活动和专业可能有额外的分解和特定于其性质的流程。例如,下面提供了一个**数据集亲密度**流,将在以后的文章中探讨:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/984e00fa4bf2ffdb079240fee6a601fd.png)

资料来源:Dror Kessler

# 链接和示例

为简洁起见,本文正文没有包含每个解构元素的示例。这个列表并不是框架本身的一部分,只是为了使它更容易访问。

*   **D1:风格角度** : [尺度](https://www.nytimes.com/interactive/2020/04/21/world/coronavirus-missing-deaths.html),[变化](https://www.belfasttelegraph.co.uk/news/uk/from-nine-mentions-a-year-to-9000-how-mps-caught-the-brexit-bug-38909792.html),[排位](https://www.economist.com/graphic-detail/2020/02/08/data-from-spotify-suggest-that-listeners-are-gloomiest-in-february),[变异](https://www.bbc.co.uk/news/uk-47696839),[探索](https://www.nytimes.com/interactive/2014/upshot/dialect-quiz-map.html),[关系](https://www.channel4.com/news/factcheck/high-immigration-nhs-crisis),[坏/开](https://www.tampabay.com/florida-politics/buzz/2020/01/05/how-the-pinellas-sheriffs-office-boosts-its-rape-stats-without-solving-cases/)。(来源:[在线新闻博客](https://onlinejournalismblog.com/2020/08/11/here-are-the-7-types-of-stories-most-often-found-in-data/))
*   **D2:数据来源** : [公布](https://data.gov.uk/),[收集](https://www.youtube.com/watch?v=eGt2EBQPdHg),[报废](https://chrome.google.com/webstore/detail/web-scraper-free-web-scra/jnhgnonknehpejjnehehllkliplmbmhn?hl=en),[被黑](https://en.wikipedia.org/wiki/List_of_data_breaches),[泄露](https://wikileaks.org/), [API](https://data.police.uk/docs/) 。
*   **D3:工具链** : [电子表格](https://www.youtube.com/watch?v=t0B0Tgz0b-0),[在线工具](https://app.datawrapper.de/), [Python](https://colab.research.google.com/) , [R](https://www.rstudio.com/) ,[命令行](https://cheatography.com/davechild/cheat-sheets/linux-command-line/), [API](https://aws.amazon.com/sdk-for-python/) ,[人工智能](https://journaliststudio.google.com/pinpoint/about)。
*   **S1:数据格式** : [XLS](https://data.gov.uk/dataset/5577629c-e7d5-4131-8a3f-7da2feb49bd8/expenditure-over-25000-for-nhs-wigan-borough-ccg) , [CSV](https://data.gov.uk/dataset/55feff51-9528-40e6-99f2-4245024250f0/historic-potholes-data) ,[HTML](https://en.wikipedia.org/wiki/List_of_largest_cities)([XML](https://www.w3schools.com/xml/xml_whatis.asp)/[RSS](https://archive.nytimes.com/www.nytimes.com/services/xml/rss/index.html)), [JSON](https://github.com/jdorfman/awesome-json-datasets) ,[纯文本](http://shakespeare.mit.edu/midsummer/full.html), [PDF](https://data.gov.uk/dataset/9b6aaf15-06ac-4556-9d85-55eb66a6a765/london-community-response-survey) ,[媒体](https://soundcloud.com/user-510438690/recorded-conversation-with-scammer)。
*   **S2:活动** : [集结](https://ifttt.com/),[清扫](https://openrefine.org/),[组织](https://www.data.cam.ac.uk/data-management-guide/organising-your-data),[分析](/a-beginners-guide-to-data-analysis-in-python-188706df5447),[可视化](https://flourish.studio/),[发布](https://pages.github.com/)。

# 摘要

本文描述了一个将数据新闻知识解构为几个主要筒仓并将其实践投射到三维空间的框架。

作者希望这一理论框架对该领域的实践者和研究者同样有用。本文的观点被作者用来为在职记者提供数据新闻培训。

# 高度专业化领域中的数据标签:我们如何以及在哪里获得它们?

> 原文:<https://towardsdatascience.com/data-labelers-in-highly-specialized-fields-how-and-where-do-we-get-them-26306a4952b9?source=collection_archive---------27----------------------->

## 毫不奇怪,人工智能的发展依赖于机器学习算法,这些算法需要大量精确标记的数据来提供可接受的结果。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2be6fff6ab11f3d20d3fab79d1d1b18b.png)

马库斯·温克勒在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

有许多方法可以获得带标签的数据,但大多数方法都使用人工标签。从内部路线到众包,贴标员需要学习一定的技巧和方法论,熟悉相关的贴标工具;然而,这样做之后,被标记的实际内容在大多数情况下是不言自明的。

虽然作为一名贴标机,你需要掌握一些软件的诀窍,并学习如何通过贴标任务导航,但你可能不会有问题识别颜色或形状之间的差异,有生命的与无生命的物体,或可食用的与不可食用的材料。但是如果我们谈论的是更高级的东西呢?比如航海工程和给船只和潜艇的不同部件贴标签?或者植物学,能够识别不同的植物种类以及它们细微的结构差异?或者医学和了解重要器官的详细解剖结构能够[识别潜在的健康问题和预测威胁生命的事件](https://www.fastcompany.com/90157967/this-ai-predicts-death-could-it-improve-end-of-life-care)?每一种情况都需要训练有素、经验丰富的专家来标记数据:没有其他选择。

**伟大的想法,更大的挑战**

根据来自包括硅谷在内的全球几个科技中心的、[【生化工程】](https://reader.elsevier.com/reader/sd/pii/S1369703X21001303?token=91767A1E6249E856BF06B8FA4B626B2CC13A4A3B906551E134514739976F0B7BAAD13F03FC70AEA9F857A1422CF68D4D&originRegion=eu-west-1&originCreation=20210924194046)和神经科学领域的一些最新尖端人工智能研究的说法,标记如此复杂的数据是一项艰巨的任务。这一挑战远未结束。其中一个原因是,机器需要大量的数据来学习和理解,以便能够在专业领域提供帮助。它不能只是任何数据,数据必须有完美的标签。在某些情况下,[生物诊断深度学习算法](https://www.biorxiv.org/content/10.1101/142760v2.full)需要扫描 1000 万种化合物来识别小分子结合物,其中每一种都需要至少 15000 个样本才能达到 90%的准确率,最终可以达到 99%。这是一大堆带标签的数据!

许多与人工智能打交道的医学专家表达了这种担忧。根据英国皇家马斯登的顾问分子病理学家 Katharina von Loga,M.D. 的说法,就细胞生物学和免疫学而言,标准化大规模医学数据以使其“适应算法”说起来容易做起来难。[医学博士 David Albert](https://www.alivecor.com/leadership-team)是 AliveCor Labs 的医生和医疗技术开发人员,他进一步解释说,ML 算法的精度取决于样本大小,而样本大小取决于能够进行专家标记的医疗保健专业人员的可用性。例如,在心脏病学方面,美国只有 3 万名执业专家,他们都忙得不可开交。同时,每个医学图像需要至少三个独立的意见来考虑可靠验证的标记数据。

所以,这是一个有足够数据的问题,同时也是一个有足够的人来熟练地标记这些数据的问题。虽然一些公司和研究机构已经扩大了他们的标注队伍,不仅包括年轻的专业人员,还包括来自 MTurk 等平台的群众演员,但仍然缺乏能够进行一致、高度专业化标注的数据注释者。对于如何解决这一困境,人们意见不一。

在最近的 [VLDB 研讨会](https://crowdscience.ai/conference_events/vldb21)上,作为实践者和研究者参与数据标注的演讲嘉宾展开了一场讨论。专家组关心的一个主要问题是:我们如何以及在哪里找到拥有高水平专业知识的特定领域的数据标注者?问题是,这些人首先是他们各自领域的专业人士——他们对数据标签并不特别感兴趣。

当然,有一些人可能实际上享受他们自己标记的成果,例如那些可能对人体了解很多的人,他们因此可以标记解剖数据,并且他们可能随后使用由这些数据驱动的软件来诊断疾病,作为他们日常职业的一部分。但总的来说,医疗专业人员不是数据标签员,反之亦然。那么,我们应该把这些活动分开,还是让它们相互补充呢?

**从熟练的专业人员到全职贴标机?**

与许多事情一样,这与动机有关。如果我们向高技能专业人员提供一些东西,他们会被吸引到数据标签领域吗?有人认为答案是肯定的。[ServiceNow 的可信人工智能应用研究科学家 Grace Abuhamad](https://www.linkedin.com/in/graceabuhamad/) 指出,有可能获得一个全职的内部贴标机团队,与产品开发人员和设计师一起工作。这些专业人员不会只在一个项目期间呆在那里——他们实际上是专注于狭窄的、高度技术性的领域的员工标签员。这看起来很合理,但是这种类型的设置有其局限性。

首先,必须有人全职做数据标签员。这意味着他们不能做任何其他事情。但是,一个公认的专业人士,比如说一个外科医生,会愿意放弃他们的实践,转而使用标签数据吗?这似乎不太可能。因此,我们可能在谈论一名研究生,或者刚刚开始职业生涯的人——即使相对较高的时薪和一封推荐信也不会激励一名成功的医生或建筑师在盛年放弃他们的实践。

[Toloka](https://toloka.ai/) 的首席执行官 Olga Megorskaya 解释说,雇佣并保留这样的专业人员作为全职的内部贴标员——即使是刚接受培训的——将要求他们的薪酬等于或高于他们(潜在的)主要职业,这对于数据贴标来说是非常昂贵的。事实上,成本会加倍高,因为有两个因素:(a)内部标记的成本,可以说是最不省时和最不具成本效益的数据标记方法,即使没有任何受过严格培训的专业人员的参与,以及(b)在最初的高成本之上雇用这些人。

这自然意味着这种解决方案本质上是不可扩展的,因为它在财务上是不可持续的。如果它不可扩展,那么从商业的角度来看,它就不能实现数据标记的主要目标之一。简而言之,建议的策略可能会提供急需的帮助,但它不能真正提供可以全面实施的大规模解决方案。

此外,奥尔加认为还有一个不同的问题。如果你把所有的时间都花在标记数据上,你的领域专长迟早会过时,因为你不再是你所在领域的从业者。在这个世界上,创新和行业颠覆越来越频繁地出现,事实上,你想成为游戏顶端的标签员的雄心可能会以落后于专业领域的专家为代价。这意味着你的专业知识将不会像你开始时那样重要,讽刺的是,最终你的标签也不会。

最重要的是,还有另一个明确的问题。拥有专门从事高技术领域的全职贴标员似乎表明,无论是谁在做贴标,都只是在一个领域。否则,主办公司需要雇用多个团队,即每个专业都有一个团队。毕竟,同一个标记团队能同时处理 fMRI 扫描和原油管道吗?这似乎太远了!因此,这反过来又增加了本已极其昂贵的企业的成本。唯一可行的选择是纯粹的利基标签,也就是说,一个数据标签公司——一个专业领域。

**替代方法:兼职和“在职”标签**

来自[西北大学](https://www.northwestern.edu/)的博士前病理学研究员 Mohamed Amgad 认为这些缺点可以通过改变策略来克服。首先,Mohamed 认为数据标注必须是一项兼职工作,一般来说如此,当涉及到高度专业化的领域时更是如此。第二,理论上,数据标签可以成为医疗实践的一个组成部分,而不是一个单独的努力。例如,当病理学家试图做出诊断时,他们总是使用某种形式的数据——无论是 X 射线还是 CT 扫描——这些数据现在都是数字的。更重要的是,他们处理这些数据,并在某种程度上不经意地“标记”这些数据,即使只是在他们的脑海中。

那么,是什么阻止了这些专业人士将他们的私人解释正式化,并创建一个现成的数据集或对现有数据集做出贡献呢?这实际上不会导致任何额外的时间或成本。即使它确实需要一些报酬,这种策略仍然会更快、更便宜,因为:(1)这些专业人员不必特意去做,以及(2)如果产生的数据集对他们未来的工作有帮助,他们可能不会反对。换句话说,这一倡议可以很容易地实施,但可惜的是,目前还没有人提出或听到它。

穆罕默德提出的另一个解决方案是利用研究生。医学领域以及许多其他领域的数据标签可以被视为计入特定资格的实习时间。这里的机制是透明的,很容易理解:研究生(甚至可能是本科生)可以做标记,获得他们的学分,全职医生可以使用这些数据在 AI 的辅助下运行他们的操作。当这些学生自己成为医生的时候,他们将有新一代的实习生来提供新标记的数据。这对每个人来说都是一个很好的安排。

[代尔夫特理工大学](https://www.tudelft.nl/)的助理教授杨洁认为,即使是由高技能专家兼职完成的贴标工作,也不是很多公司能负担得起的。像 Mohamed 一样,Jie 认为,与其说数据标签是一项独立的活动,不如说是将标签纳入熟练专家在日常工作中已经做的工作。换句话说,我们应该专注于从这些专家那里获得有用的知识,这些知识可以应用于数据标签,而不是试图从这些专业人员中制造纯粹的标签员。杰认为,这不仅仅意味着提供经济上的激励,甚至是职业前景,而是要吸引工作中人性化的一面。我们需要请这些专家通过在社区内共享信息来为他们各自的领域做出贡献。这就把我们带到了社会责任这个决定性的问题上。

**包容和社会责任**

数据标注领域已经到了必须正面解决社会公正问题的时候了。这标志着包含两个重要组成部分的 ML 和 AI 开发的质的新篇章。一个是对上述专业技术人员的社会责任和有意义的任务。另一个与来自发展中国家的群众演员有关,他们可以摆脱贫困。这两个方面都归结为一方面承担更多的社会责任,另一方面使用众包等方法来实现标签目标。值得注意的是,第一个使第二个成为可能。

首先,正如我们所听到的,对大众有意义和有用的东西的承诺可能比金钱和晋升更能激励高技能的专业人士。来自 Toloka 的 Olga 解释说,随着人工智能行业的发展,ML 模型将需要越来越复杂的数据,这就要求贴标机能够执行更具挑战性的任务。很快,我们将达到一个高度熟练的执行者将成为某些领域的数据标签先决条件的点。幸运的是,如果任务有价值,合格的专业人员愿意做出贡献。

最新的例子是[100 多万基因组计划](https://digital-strategy.ec.europa.eu/en/policies/1-million-genomes),该计划试图将多个国家聚集在一起“建立一个高质量的欧洲国家基因组参考群体网络”这是[欧洲战胜癌症计划](https://ec.europa.eu/health/sites/default/files/non_communicable_diseases/docs/eu_cancer-plan_en.pdf)的一部分,该计划旨在共享标记数据,尽管不一定是为了构建人工智能。当谈到人工智能时,专业人士的聚集也非常适用,众包可以提供一种简单可靠的方法来实现这一愿景。奥尔加进一步认为,例如,一个成功的律师不会同意花一整天的时间来标记数据,但他们可能会为了社会正义的事业而花一部分时间这样做。此外,如果这些数据最终将通过引入人工智能来消除他们自己工作中更常规的部分,这种可能性会大得多。换句话说,如果对每个人都有帮助,包括专业人士自己,他们贡献的社会责任方面就变得更加有效。

第二,社会责任也延伸到招募数据标签员的众包平台。这归结为向那些财政困难的人,即非洲、亚洲和拉丁美洲人均 GDP 低的国家提供收入机会。一位来自印度尼西亚的熟练贴标师 Novi Listyaningrum 是 [Institut Kesenian Jakarta](https://ikj.ac.id/) 的研究生,她解释道,Toloka 是一个她可以应用甚至提高她作为工业设计师的专业知识的地方,并且在这个过程中还可以赚很多钱。

据《福布斯》报道,这一对社会负责的职位也被其他老牌公司分享,包括总部位于硅谷的 Sama ,他们使用人在回路中的方法进行数据标注,并专门在发展中国家寻找数据标注者。因此,该公司可以向包括最不发达国家在内的全球一些服务最不发达地区的个人提供机会。令他们高兴的是,Sama 的贴标员每月收入是当地平均水平的四倍多。

**终审判决**

我们听到了许多不同的声音和论点,试图回答如何鼓励高度专业化领域的专家进行数据标注。所有的意见和建议可以归纳如下:

*   高度专业化领域的人工智能开发需要高素质的专业人员来做数据标注。
*   科学和医学领域需要大量的数据用于 ML 算法,并且需要对同一数据点的多种意见来认为标记的数据是经过验证的和可靠的。
*   组建一个由这类专业人士组成的内部团队提供了一个临时解决方案;然而,它太贵了,不具备商业可持续性和可扩展性。
*   如果走内部路线,这意味着要么贴上利基标签,要么雇佣多个团队:每个专业领域一个团队。
*   那些离开自己的专业领域从事全职数据标签工作的专家需要及时了解冲击其行业的最新创新和颠覆,以保持竞争优势。
*   对于高度专业化领域的数据标注,兼职和在职标注可能是更可持续的选择。
*   那些正在接受培训成为高素质专家的人(即学生)可以获得实习时间来标记数据,以换取学术学分。
*   医学等领域的一些专业人士已经在每天处理数据:这是一个让他们分享他们的发现的问题,为他们提供未来的人工智能援助,以减轻他们的日常任务。
*   西方的知名专家可能会被诱惑给数据贴上标签,不是通过金钱或晋升,而是通过提高社会意识并要求他们回馈社区。这可以(也应该)与前一步一起完成。
*   数据标签/众包平台也应该对社会负责,为世界贫困地区的大众表演者提供机会,并在那里与贫困作斗争。
*   众包有可能将区域社区聚集在一起,实现可持续数据管理、人工智能开发和后续多学科科学进步的共同目标。

# 数据标签:人工智能如何简化你的数据标签

> 原文:<https://towardsdatascience.com/data-labeling-how-ai-can-streamline-your-data-labelling-4f1ffb8a19e1?source=collection_archive---------18----------------------->

## Colab 上的 BYO ML 辅助标签工具,并尝试 Datature 的改变游戏规则的无代码数据标签工具

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b0eb4e81393ac86913d3ae94cc6ef0f3.png)

照片由来自 [Pexels](https://www.pexels.com/photo/gray-small-bird-on-green-leaves-70069/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 的 daniyal ghanavati[拍摄。图片作者。](https://www.pexels.com/@daniyal-ghanavati-10741?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)

读完这篇文章后的三大收获:

1.  如何在 Colab 上使用 PixelLib 创建自己的机器学习标签工具?
2.  了解 [Intellibrush](https://datature.io/intellibrush) 如何帮助您更快、更好地完成标签制作,并且无需任何代码。
3.  决定构建还是购买人工智能数据标签工具时的关键考虑因素

# 人工智能+人工注释=快速注释过程

典型的数据科学产品开发流程如下:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5bc12efaab613345c9401f9d8b891832.png)

典型的产品开发过程。图片作者。

作为整个产品流程的一部分,数据标签占据了大部分时间。当谈到数据标记时,我们使用人工标注器来帮助标记大量的非结构化数据,如图像或文本。不太关心隐私的公司可能会将他们的贴标工作外包给第三方贴标商。然而,如果标记的数据涉及敏感数据,如客户的个人信息或公司知识产权,外包不再是一种选择,公司面临着在内部建立自己的数据标记团队,这带来了一系列全新的挑战。

团队通常由多个数据标注者和一个数据工程师组成,其中标注者负责标注数据,并确保数据被清理并准备好用于模型训练。另一方面,数据工程师必须熟悉机器学习应用的最终用例,以提供贴标机要达到的标签一致性和基准的高度概述,并确保偏差保持在最低水平。他们可能会通过设置标签指南或跨不同的贴标机执行共识检查来建立基线标准,因为毕竟,垃圾进来就是垃圾出去,在这种情况下,像对象检测器这样的机器学习模型的性能在很大程度上取决于标签数据的质量。

但是,人工智能如何帮助标记数据,特别是对于药物研究这样需要高技能和训练有素的研究科学家的用例?这就是人工智能工具发挥作用的地方,传统的统计模型与预先训练的机器学习模型结合使用,以加快注释过程。智能标记工具的一个例子是 IntelliBrush,如下面的视频所示,只需单击一下,即可完成像素完美的掩膜注释,比常规的非智能工具快 10 倍以上!

照片由来自 [Pexels](https://www.pexels.com/photo/gray-small-bird-on-green-leaves-70069/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 的丹尼尔·加纳瓦蒂[拍摄。由](https://www.pexels.com/@daniyal-ghanavati-10741?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)[数据公司](https://datature.io/)提供的 ML 辅助工具(智能画笔)。作者视频。

# 构建您自己的 ML 辅助标签工具

现在我们已经看到了人工智能工具的能力,让我们试着构建我们自己的 ML 辅助工具。为了说明,我将使用图像分割作为一个例子。同样的概念也可以应用于其他机器学习任务。

这里,我们将使用 Colab 和 PixelLib。下面这篇文章给了我灵感,让我在 Colab 上构建一个图像分割工具,并使用 PixelLib 快速分割图像中的对象。

</how-we-built-an-easy-to-use-image-segmentation-tool-with-transfer-learning-546efb6ae98>  </real-time-image-segmentation-using-5-lines-of-code-7c480abdb835>  

## 概观

这里是整个管道的总结。在普通管道中,人工注释者可以通过标记接口直接检查图像。为了使机器学习成为标签过程的一部分,我们必须添加一个名为 ML 辅助标签模块的模块,该模块使用户能够直接在标签界面上修改机器预测的标签。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ef1d46c17faa751c146fab739576dc65.png)

我们的 ML 辅助标记工具的简单管道。图片作者。

## 图像分割模型

这个演示将使用 PixelLib,一个用于分割图像和视频中的对象的库。我选择 PixelLib 是因为它易于使用,并提供快速检测,这有助于减少花费在 ML 推理上的时间。

下面是使用 PixelLib 进行推理的代码

```
# install pixellib
pip install pixellib# download model pretrained weights
wget -N 'https://github.com/ayoolaolafenwa/PixelLib/releases/download/0.2.0/pointrend_resnet50.pkl"# instantiate model and load model weights
ins = instanceSegmentation()
ins.load_model("pointrend_resnet50.pkl", detection_speed='rapid')# inference
result = ins.segmentImage(img_path,show_bboxes=False)
```

可以从结果中提取遮罩,并将其应用于原始图像。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bd9ee16984122d5a6c39e068bd618b48.png)

照片由[像素](https://www.pexels.com/photo/animal-avian-beak-bird-416179/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)的[皮克斯拜](https://www.pexels.com/@pixabay?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)拍摄

## Colab 演示

下面是在 Colab 上构建 ML 辅助标签工具的代码

下面的 gif 展示了运行代码后用户界面的样子。你可以用套索选择器给鸟贴标签。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/38fd6d2bd08963f7be3f836733c7775e.png)

作者 Gif。

或者,您可以单击“ **ml 辅助的**按钮,机器学习模型将自动选择该鸟。然后,您可以使用套索选择器工具继续添加缺失的部分。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9df534fdfc3a2665aa1a18806ea33416.png)

作者 Gif。

您可以使用演示来了解 ML 辅助工具如何帮助您最小化标记工作,尽管如果您的团队有多个贴标机,这可能不太容易扩展。

根据演示,您可以看到 ML 辅助工具如何帮助您最大限度地减少标记工作。然而,对该工具的进一步实验使我总结出以下缺点。

1.  由于每个成员都必须单独加载和保存他们的原始图像文件和注释,因此实施是不可扩展的,特别是对于内部团队。
2.  PixelLib 使用 Mask R-CNN 模型和 COCO 数据集进行训练,因此可能无法准确检测到您的使用案例特有的自定义对象,如果该工具无法检测到自定义对象或公共数据集中不常见的对象,则无法实现拥有内部标签团队的目的。
3.  无法共享对数据集和标签的访问-如果您将 PixelLib 用于只有您需要访问图像和标签的辅助项目,则 PixelLib 可能会起作用-但是,在数据工程师、贴标签员和项目经理共同努力推动项目成功的组织中,情况往往并非如此。这可能会在模型迭代阶段造成问题,因为调试标签和图像无疑是乏味的。

你会注意到,我高度强调了工具的可用性和协作性——因为 ML 的制作通常是团队的努力,在孤岛中工作通常会导致延迟。请继续阅读,找出我在寻找数据标签工具时的三大考虑因素!

# 无需任何代码的快速注释

一些公司可能没有时间或专业知识来建立自己的标签软件,因此他们寻找现成的解决方案。

我被一家名为 [**Datature**](https://datature.io/) 的公司开发的产品吸引住了。Datature 是一个无代码的 MLOps 平台,为数据标注和模型训练提供基于云的工作流。该公司最近推出了一款名为 [**IntelliBrush**](https://datature.io/intellibrush) 的产品,这是一款人工智能数据标签工具,旨在帮助公司提高标签生产率和效率,以减少开发一个完全可用的计算机视觉模型所需的时间。我有机会试用他们的最新产品,我渴望与你分享我自己的经验。

如果您迫不及待地想试用这款最新产品,请在此注册:

<https://datature.io/intellibrush#sign-up>  

## 什么是 IntelliBrush?

IntelliBrush 是 Datature 的 Nexus 平台上的内置功能。它使用机器学习模型来预测您选择的对象的轮廓。使用此功能,用户只需点击 1-2 次即可快速获得像素完美的遮罩/边界框注释,而不是像使用正多边形工具那样需要在图像的边界上点击多次,或者在误差范围较大的情况下跟踪对象的轮廓。此外,我喜欢 IntelliBrush 的一点是,它会不断调整,以确保它随着时间的推移而改进,我甚至可以使用 Intelli-Settings 来选择粒度级别,当我的图像只包含一个对象或包含多个较小的对象时,这非常有用。点击此处查看各种物品:

以下是 IntelliBrush 自适应模式的一些亮点。作者视频。

如果你是一家公司或小型创业公司,正在寻找一个平台,使用你的定制数据来标记和训练计算机视觉模型,你可能想知道在投资人工智能辅助标记工具之前,你应该考虑哪些因素。以下是我认为需要考虑的 3 个重要标准,以及我为什么认为 Datature 的 IntelliBrush 是一个值得考虑的绝佳选择:

1.  **成本**。每当我们在内部开发软件系统时,我们必须考虑成本。这种成本的一个例子是雇用一组软件工程师开发标签工具,以及一组 UX 设计师设计一个用户友好的界面。此外,如果你希望建立一个像 IntelliBrush 这样的工具,可能有必要雇佣一个数据科学家团队来建立机器学习模型。因此,在选择标签平台时,考虑构建和维护软件的成本是必不可少的。Datature 的 Nexus 平台(有或没有 IntelliBrush)计划迎合各种业务,无论您是刚刚开始使用计算机视觉模型,还是有一个专门的贴标机团队正在寻找一个平台来处理大量的数据标签任务。他们确实有一个免费计划,附带了对 IntelliBrush 的有限访问,这对那些喜欢“先试后买”的团队来说非常好。
2.  **易用性**。市场上已经有 ML 辅助的解决方案,但有些需要你开发自己的机器学习模型来支持这些功能,这是另一个挑战,可以很容易地将你的开发时间表推迟几周或几个月。另一个需要考虑的重要事实是,专业的人工注释者往往时间紧张,没有能力花一整天的时间来标记数据——这就是为什么尽可能精简的界面会大大提高效率。
3.  **灵活性**。根据您的团队正在开发的模型类型,标注工具还应支持复杂多边形和边界框。此外,该工具不应该局限于常见对象,而是底层算法应该能够检测出以前从未见过的新数据。这是 IntelliBrush 的一个亮点,因为不需要预先训练,这意味着它也可以在任何自定义对象上工作!正如我上面提到的,演示只展示了 IntelliBrush 如何分割图像,但也可以支持其他几个任务,例如为对象检测模型生成边界框。

## 如何使用 IntelliBrush?

1.  登录您的[账户](https://datature.us.auth0.com/u/login?state=hKFo2SBhNXVtQV9YNkxxaUJuc2dPX1JWeUdPb2ZnOEJqN0I3c6Fur3VuaXZlcnNhbC1sb2dpbqN0aWTZIFdOcUlMbldPYUpraF9xN2xxbDZ6WnhIUnEzWDNFUXg3o2NpZNkgaXg2endaS2hkVmRsRlFLdjdMZjBvV2h3SldhOUtDYzU),创建一个新项目并上传您的图片
2.  打开基于 web 的注释器并创建您的第一个标签。
3.  选择右侧面板上的 IntelliBrush 或使用热键“T”。(IntelliBrush 应该在注册时激活。如果没有,可以在这里[申请](https://datature.io/intellibrush#sign-up)提前接入。)
4.  通过左键单击感兴趣对象的中心,该对象将立即被屏蔽。
5.  如果您对生成的遮罩不满意,可以通过右键单击来表示“不感兴趣”的区域,从而对遮罩进行编辑,并且可以根据需要进行多次细化。
6.  一旦您对遮罩满意,您可以按空格键提交标签。

看看下面的视频,看看它是如何工作的。我还用这个工具尝试了不同的图像!

如何在各种情况下使用 IntelliBrush 的示例。作者视频。

# 结论

如果您的团队经常因缺乏高质量的标注数据而停滞不前,那么 ML 辅助标注工具可能有助于提高您团队的生产力。如果你正在寻找一个快速准确的“现成”工具,IntelliBrush 是一个理想的候选人,因为它不需要事先的模型训练,甚至可以处理从未见过的图像。此外,该公司正在积极改进该工具,并计划在现有的协作标签功能的基础上继续进行 QA 检查的计划发布。最后,如果你对构建自己的计算机视觉模型感兴趣,这里有一些来自 [Datature](https://datature.io/) 的视频,可以帮助你使用 Nexus 平台启动自己的计算机视觉项目——所有这些都没有代码。

# 关于作者

Woen Yon 是新加坡的一名数据科学家。他的经验包括为几家跨国企业开发先进的人工智能产品。

Woen Yon 与少数聪明人合作,为当地和国际初创企业主提供网络解决方案,包括网络爬行服务和网站开发。他们非常清楚构建高质量软件的挑战。如果你需要帮助,请不要犹豫,给他发一封电子邮件到 wushulai@live.com。

他喜欢交朋友!请随时在 [LinkedIn](https://www.linkedin.com/in/woenyon/) 和 [Medium](https://laiwoenyon.medium.com/) 上与他联系

<https://laiwoenyon.medium.com/> 

# 来自 MongoDB 的 S3 数据湖

> 原文:<https://towardsdatascience.com/data-lake-in-s3-from-mongodb-addd0b9f9606?source=collection_archive---------3----------------------->

## 使用 Python 将 MongoDB 数据上传到 AWS S3 构建数据湖

我非常幸运能够结合我最热衷的话题来写我的学士论文;经济学(以拍卖理论的形式)、软件开发和数据分析。尽管我的论文是关于拍卖和投标策略的实证研究,但它涉及到使用网络爬行收集数据。然而,这是另一个帖子的另一个故事。问题是,在我的论文发表一年后,我仍然每月支付 [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) 的费用来存储我收集的数据,尽管我并没有使用它。是时候归档数据了。

在本文中,我不仅将向您展示我如何将数据从 MongoDB 移动到 AWS S3 进行冷存储归档,还将展示您如何将相同的原理用于数据管道来构建数据湖。根据您正在构建的现代数据堆栈的类型,您可能需要创建一个数据湖。一种常见的方法是利用 AWS S3 的廉价存储,一种常见的用例是在将数据接收到数据仓库进行处理和转换之前对数据进行暂存。例如,您可能有一个运行在 Snowflake 或 Redshift 中的数据仓库,这些数据仓库有从 AWS S3 读取或复制数据的简单方法。

# 规划

一如既往,我喜欢过度工程化的东西,构建抽象和可重用的代码。我没有编写一个从 MongoDB 读取所有记录、创建一个 JSON 文件并上传到 S3 的脚本,而是考虑了以下前提:

*   使用 YAML 配置文件来确定提取
*   遍历一个时间戳字段,比如`createdAt`
*   按一天中的时间进行细分提取,以避免过度消耗 RAM
*   使用带有分页的游标从 MongoDB 读取,以避免服务器开销
*   每个集合应该有自己的配置文件,以便能够定制它

## **配置文件**

我喜欢 YAML 的配置文件。它们是终极抽象。你可以运行一个极其复杂的 YAML 文件,任何人都可以根据自己的喜好对其进行修改,而无需理解其背后的逻辑。它们非常用户友好,易于使用。在这里使用它们的想法是,可以用它们以不同的方式提取不同的 MongoDB 集合。例如,我的 MongoDB 实例中的`auctions`集合并不是很大,大约有 16000 条记录。然而,`bids`收藏包含了超过 36 亿条记录。我可以配置这些不同的优化提取过程,避免消耗太多的内存。这也省去了我在脚本中硬编码变量的麻烦,每当我想要改变集合来提取和提高代码的可重用性时,就必须改变它们。

最终结果应该是一个脚本(`main.py`),它接受一个命令行参数作为配置文件的名称,例如`main.py auctions`用于运行`auctions.yaml`配置文件。该文件将确定 MongoDB 集合的名称、开始日期、结束日期以及我们希望如何按一天中的小时来分解提取。下面是一个配置文件的示例:

这将提取从`2020-03-01`到`2020-08-10`的带有`createdAt`字段的集合`catawiki_auctions`中的所有数据,并将在这两个日期之间的每一天使用 24 小时的时间间隔。

以下是脚本执行的概述,以及它是如何分解上传数据的:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/36871adfdcd094c08471c9bdc111b861.png)

将数据从 MongoDB 加载到 AWS S3 数据湖的脚本概述(图片由作者提供)

# 履行

## **AWS S3 斗**

第一步是创建一个 AWS S3 存储桶来存储数据,并创建一个 IAM 用户来使用 [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) 连接到 AWS。你可以查看这个关于创建 S3 桶的指南,但是它应该是相当简单的。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/952d14f680d8f2ec4f53a42b41c78946.png)

创建一个 AWS S3 桶用作数据湖(图片由作者提供)

现在,我们需要一些凭证,以便能够与 AWS S3 连接并上传我们的文件。这是使用 AWS IAM 管理的。在这里,您可以首先创建一个策略,以允许我们将要创建的用户访问我们已经创建的存储桶:

然后,您可以创建一个用户,并在选择权限时使用“直接附加现有策略”选项。这将允许您将我们创建的策略附加到用户。之后,您应该能够下载访问密钥 ID 和秘密访问密钥。这些是您需要使用 Boto3 调用 AWS APIs 来上传文件的凭证。

## **循环优化 RAM**

现在该看代码了。我把最终的脚本上传到了 Github,你可以在这里找到它。出于教学目的,我将该脚本作为一个单一的文件,但在其他情况下,我会将它分成几个实用模块,然后再导入到我们的主文件中。在任何情况下,你都可以看看它,它应该很容易理解,但我会在这篇文章中介绍最重要的部分,同时解释一些定义。

这个脚本最重要的方面是使用的循环和生成器。这样做的目的是优化 RAM,当使用 MongoDB 集合和许多文档在生产中运行这样的过程时,您可能会遇到 RAM 问题。在生产环境中的小型服务器上运行脚本时尤其如此。出于这个原因,我们经历了 3 个循环,允许我们划分从 MongoDB 获得的数据,并避免将其全部加载到内存中。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/251747b162a19a41d1f4c93adc256098.png)

将数据加载到数据湖时优化 RAM 的循环(图片由作者提供)

这些循环的另一个极其重要的部分是能够从错误或连接问题中恢复。如果在我们的代码中有一个网络错误或 bug,我们可以从它停止的地方重新开始这个过程,而不是必须清除并重新开始。

## **从开始日期迭代到结束日期**

我们首先从配置文件中定义的参数`start_date`到`end_date`进行迭代。这种迭代一次进行一天,和 Python 中的惯例一样,端点不是生成序列的一部分。该脚本定义了一个生成器来实现这个调用`date_range`。这个想法是你可以通过一个`start_date`、一个`end_date`和一个天数增量。它的工作方式与`range`发电机相同。

如果这听起来很有趣,你绝对应该看看 [Python 生成器](https://wiki.python.org/moin/Generators),它们非常方便。

## **从 00:00 迭代到 23:59**

现在我们每天都在迭代,我们可以从那天开始迭代不同的小时。例如,我们可以 6 小时(00:00 到 06:00,06:00 到 12:00,12:00 到 18:00,18:00 到 00:00)为一批,12 小时(00:00 到 12:00,12:00 到 00:00)为一批,或者以 24 小时为间隔一次性完成一整天。对于小的集合,这没有意义,我们可以使用 24 小时的时间间隔一次性加载一整天。但是,如果我们正在加载大量数据,那么提交数据提取并从可能的错误中恢复是有意义的。同时,这意味着我们可以并行处理我们的任务。例如,如果我们在气流中使用它来生成这样的 DAG:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0a9c7a465b8d548ecc95c4ac2f1941d3.png)

将数据上传到 S3 数据湖的示例气流 DAG(图片由作者提供)

## **批量接收 5K 文档的 MongoDB 数据**

最后,我们不希望同时向 MongoDB 服务器请求数百万个文档。在生产中也是如此,否则,你的工程团队可能会打电话给你,看看你在做什么。同时,正如已经提到的,我们还可以通过请求更少的文档和对结果分页来优化 RAM 的使用。最后,如果您计划稍后将这些文件接收到一个仓库(如 Snowflake)中,那么将记录分解成更小的文件实际上是很有用的。这允许您通过并行读取这些文件来并行接收。有关文件大小和雪花摄取的更多信息,请查看他们文档中的[一般文件大小建议](https://docs.snowflake.com/en/user-guide/data-load-considerations-prepare.html#general-file-sizing-recommendations)。

为此,我们再次使用 Python 生成器并迭代 MongoDB 游标。这允许我们一次获得 5K 个记录,而不必将它们存储在内存中,也不必将它们全部请求到服务器。5K 是完全可定制的,在这种情况下,我使用 5K 作为一个完全任意的数字,但你绝对可以增加它。事实上,YAML 文件允许使用一个`batch_size`属性来精确地配置它(默认为`5000`)。

## **文件上传到 S3**

之后,过程就简单了,我们只需从 MongoDB 中获取记录,并将它们存储在一个 JSON 文件中。注意我们正在执行的所有循环是很重要的,本质上,我们希望所有的循环都以某种方式在文件名中表示出来。如果我们做不到这一点,我们可能会一遍又一遍地覆盖同一个文件。此外,我还包含了数据提取日期的时间戳,这有助于在并行/分布式运行期间出现错误和重叠的情况下进行重新处理。

需要注意的一点是,MongoDB 有一些类型有点特殊,没有在 JSON 标准中定义,所以如果您试图用它们编写 JSON 字符串,您会得到一个序列化错误(“TypeError:ObjectId 类型的对象不是 JSON serializable”)。

您可以使用 PyMongo dumper 来解决这个问题:

还要注意,我使用了`.gz`文件扩展名,这是为了存储压缩的 JSON 数据:

最后,为了上传生成的文件,我们只需使用 Boto3 初始化一个 S3 客户端,并调用`upload_file`方法:

# 结论

虽然我的主要目标是将我在 MongoDB 中的数据归档到 AWS S3,但我希望我已经展示了如何使用这个相同的脚本来摄取数据以构建数据湖。这种类型的脚本可以很容易地扩展到在 [Airflow](https://airflow.apache.org/) 、 [Dagster](https://dagster.io/) 或 [Airbyte](https://airbyte.io/) 上运行,作为您的数据管道的一部分,从生产系统中提取数据并将其加载到您的数据湖或数据仓库中。事实上,这个脚本非常类似于我们在 [Sirena](https://sirena.app/) 使用的 Airflow DAGs 来提取数据并加载到 [Snowflake](http://snowflake.com/) 中。您甚至可以使用该脚本一次性重新处理数据,或者将所有内容打包成 CLI,将其 dockerize 并在 Kubernetes 中运行。该脚本非常简单,您甚至可以使用 Celery 以分布式方式运行它来并行提取。可能性是无限的。

# 数据泄露

> 原文:<https://towardsdatascience.com/data-leakage-5dfc2e0127d4?source=collection_archive---------22----------------------->

## 你会在训练数据中加入偏见吗?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3a25c8c51be09b9b2f17a768ba6df174.png)

图片来源:([https://pix abay . com/photos/water-water-pipes-饮用水-4803866/](https://pixabay.com/photos/water-water-pipes-drinking-water-4803866/) )

> 如果编码器适合整个数据集,则训练数据的编码会受到验证和测试数据的分布的影响。

你有没有想过为什么像 scikit-learn 这样的数据处理库把编码过程分成两个步骤:*()*和*变换()*?在这篇文章中,我们将探究这种模式背后的原因。

# 泄漏定义

监督算法的目的是对该算法以前未见过的数据进行预测。因此,当训练算法来预测验证和测试拆分时,从业者需要确保算法不会无意中获得关于这些拆分的信息。当这种弊端发生时,它被称为“数据泄漏”

# 泄漏是如何发生的

数据泄漏可能起作用的一个特定领域是数字(连续或非有序整数)数据的预处理(也称为编码)。

scikit-learn 中处理数字数据的实际编码器是 *StandardScaler* 。它以平均值 0 为中心在-1 和 1 之间调整数值。

例如,假设我们正在对波士顿市一年中的每日温度进行标准化:

*   平均温度(例如 52 华氏度)将被编码为零
*   高温(例如华氏 98 度)接近 1
*   和接近-1 的低温(例如-5 华氏度)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2af4422a659368b5f3f8438acf548d33.png)

图片来源:([https://unsplash.com/photos/0aqJNZ5tVBc](https://unsplash.com/photos/0aqJNZ5tVBc))

现在,我们可以在一个步骤中对整个数据集进行编码,如下所示:

```
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
encoded_dataset = scaler.fit_transform(dataset)
```

H 然而,你能想出为什么我们不想在这个标准化过程中包括我们所有的拆分(培训、验证、测试)的原因吗?如果我们的测试包含了一些来自寒流的极端温度会怎么样?

如果我们在编码中包括这些寒冷的日子,那么它会使我们的平均值(0 中点)降低,从而使我们的训练样本的编码比正常情况高一点。然后,算法的权重将被这些较高的训练输入值所偏置。本质上,算法的性能被夸大了,因为它暴露于训练样本中不存在的信息。

# 那么为什么要编码呢?

如果对数值型数据进行标准化的过程容易出现泄漏,那么为什么不能跳过呢?编码提供了两个主要好处:

***同等特征重要性*** —假设我们有两个特征: *exam_score* 和 *SAT_score* 【美国大学预科考试】。一方面,考试的最高分是 100 分,但另一方面,SAT 的最高分是 1600 分。如果我们不根据这两个特征的可能值范围对其进行归一化,那么算法最初会倾向于优先考虑 *SAT_score* 特征,因为它的值更大。然而,如果我们在 0 和 1 之间标准化这两个特征,那么它们在训练开始时将被同等对待。

***帮助防止梯度爆炸*** —当输入值接近零时,神经网络学习得更好。如果你不相信我,先试着训练一个 CNN,不管有没有缩放图像数据。原因是许多激活函数(例如,如下图所示的 sigmoid 曲线)在 1 和-1 处是渐近的(即饱和的)。由于渐近线,更高和更低的值不会对输出值产生有意义的影响。方便的是,大多数标准化函数输出接近 0 的值。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/796a821ef23b46cdf9ead49eec74d54a.png)

Sigmoid 曲线—图片来源:([https://en . Wikipedia . org/wiki/Sigmoid _ function #/media/File:Logistic-Curve . SVG](https://en.wikipedia.org/wiki/Sigmoid_function#/media/File:Logistic-curve.svg))

# 编码前分割

那么我们如何在编码过程中防止数据泄露呢?

关键是在执行标准化之前,将数据集分为训练、验证和测试部分。但是,我们不 *fit_transform()* 各自单独拆分。首先,我们*拟合()*我们的训练分割,然后我们*转换()*其他分割,如下所示:

```
scaler = StandardScaler()
scaler.fit(split_training)encoded_training   = scaler.transform(split_training)
encoded_validation = scaler.transform(split_validation)
encoded_test       = scaler.transform(split_test)
```

这种模式在交叉验证期间尤其难以应用,因为在重新采样期间,训练样本和验证样本会发生旋转。手动跟踪褶皱的预处理变得不切实际。

# 进入 AIQC

幸运的是, [AIQC](https://github.com/aiqc/aiqc) 的自动化 *Pipelines()* ,一个由这篇博文的作者创建的开源库,通过以下方式解决了这些挑战:

*   检测数字 sklearn 预处理器的使用
*   在分别对每个拆分和/或折叠进行*变换()*之前,对训练样本进行*拟合()*
*   保存每个 *fit()* 用于预测的下游解码

```
splitset = aiqc.Pipeline.Tabular.make(
    *# --- Data source ---*
    df_or_path = df *# --- Label preprocessing ---*
    , label_column = 'SurfaceTempK'
    , label_encoder = dict(sklearn_preprocess =   StandardScaler(copy=**False**)) *# --- Feature preprocessing ---*
    , feature_cols_excluded = 'SurfaceTempK'
    , feature_encoders = [
        dict(dtypes=['float64'], sklearn_preprocess=RobustScaler(copy=**False**)),
        dict(dtypes=['int64'], sklearn_preprocess=OneHotEncoder(sparse=**False**))
    ]
    , feature_reshape_indices = **None** *# --- Stratification ---*
    , size_test = 0.12
    , size_validation = 0.22
    , fold_count = **None**
    , bin_count = 4
)
```

如上所述,所有从业者需要做的是:

*   定义用于标签和功能的编码器
*   指定其验证和测试子集的大小
*   指定要使用的折叠数(如果有)

这使得从业者能够将更多的时间花在实际的分析上,而不是处理各种分割的编码。

> [**【https://github.com/aiqc/aiqc】**](https://github.com/aiqc/aiqc)

在总结中,我们已经了解到,当编码器适用于非训练数据时,会发生数据泄漏。这个问题可以通过分别编码每个分割/折叠来解决,但是手动这样做引入了另一个维度的数据争论,需要从业者跟踪。谢天谢地, *aiqc。Pipelines()* 可以用来自动化这个和其他预处理/后处理挑战。

# 向一个五岁的孩子解释数据血统

> 原文:<https://towardsdatascience.com/data-lineage-explained-to-my-grandmother-6545cad08c41?source=collection_archive---------11----------------------->

## 以及为什么所有的数据团队都在家谱上花费$$$的原因

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5b1ce86ad06a3e613bd1adfddc5a6851.png)

“数据谱系就像数据的家谱”。图片由 [Castor](http://www.castordoc.com) 提供

> *“如果我改变这个字段,我怎么知道我不会破坏下游的任何表?”*
> 
> *“财务仪表板似乎出错了。我可以在哪里查看哪些数据支持它?”*
> 
> *“如果我用另一个优化更好的表替换这个表,我需要用新的数据表更新哪些仪表板?”*

这些问题我都不知道问过自己多少次了。或者当我与数据工程师、分析工程师或数据主管交谈时,我听到过多少次这些话。在大多数公司,如果你问这些问题,人们会回答类似“检查源代码”或“问约翰,他知道”。问题是约翰通常是最好的工程师之一。他如此优秀的原因是他不会把时间花在回答 Slack 上无情的 pings 上。

这就是数据血统发挥作用的时候了。让我向您介绍一下数据血统。我将从解释什么是数据血统开始,然后解释最常见的用例,最后为精通技术的读者进行更深入的技术探讨。‍

重要提示:你在文章中走得越远,它就变得越专业。不要惊讶。

# 什么是数据血统?

数据血统就像一个家谱,但对 data'‍来说

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/af8318b4b5d69be035ec5417b01d0a28.png)

辛普森家族树。图片由 Xavier de Boisredon 提供。

‍Data 血统是一种追溯数据资产之间关系的技术。在数据世界中,您首先从各种来源收集原始数据(来自您网站的日志、支付等),然后通过应用连续的转换来提炼这些数据。为了构建一个数据表(我们称之为“子表”),您必须使用一个或多个其他数据表(我们称之为“父表”)。数据谱系有助于您重建数据的家族树。如果您有坏数据,您可以在数据系谱树中寻找“坏分支”,并从根本上解决它。‍

# 现实中的数据血统是什么样的?

数据血统可以势不可挡,如果你不知道你在看什么 at‍

数据沿袭的新接口往往更简单,每个可视化处理一个用例,以便业务专家更容易理解。‍Here's 是 Castor 中数据血统的一个例子。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/192507cc97e34ade13a690387a6bd8be.png)

数据表 SUPPORT_METRICS 的数据沿袭。图片来自 [Castor](http://www.castordoc.com) app 经许可。

# 为什么我们需要数据血统?

数据沿袭用例

首先,数据血统与其说是产品,不如说是技术。它是许多数据产品(数据目录、数据质量、数据管理等)背后的底层技术之一。

数据谱系如此流行的原因是有许多新的用例,无论是对于业务、工程、领导还是法律部门。让我试着解释一下最常见的用例。总的来说,数据沿袭有助于获得数据系统的鸟瞰图。

这里列出了所有的用例,我打算解释一下:

*   数据故障排除
*   影响分析
*   发现和信任
*   定义 Propagation‍
*   数据隐私法规(GDPR 和 PII 地图)
*   数据资产清理或技术迁移

‍

## 数据故障排除

“找到问题的根源”

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c6a6512fd5a5020fa35fc562f1323696.png)

端到端数据沿袭对于解决数据问题非常有效。形象灵感来自[彼得·扬达](https://petrjanda.substack.com/p/why-the-data-analyst-role-has-never)

‍Data 用户有时会在仪表盘或数据表中发现奇怪的行为。他们希望进行调查,以了解这是由于数据管道中的技术问题还是需要立即关注的业务问题。所有数据人员的梦想是,当真正出现问题的是数据管道时,避免对业务问题拉响警报(例如,“活跃用户”部分的收入下降)。

在上面的例子中,仪表板中的数据急剧下降。业务用户想知道为什么会发生这种情况。潜在的问题是:“我有业务问题还是数据管道问题?”。他可以检查所有上游数据的状态。在这种情况下,问题来自改变其 API 的数据源(app store)。这一变化打破了数据源的 ETL 工作。在几分钟内,用户就可以了解整个数据系统。

‍

## 影响分析

"我会弄坏首席执行官最喜欢的仪表板吗?"

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/28dcedfbfd0d8be526fd56a421c802cb.png)

数据沿袭有助于您可视化变更的影响。图片由 [Xavier de Boisredon](https://www.linkedin.com/in/xavier-de-boisredon/) 提供。

数据用户想要知道他们想要进行的更改对数据流和下游数据资源的影响。在大多数组织中,数据报告和仪表板由数据湖中的数据表提供支持。如果工程师做出改变,这可能会破坏数据管道和流程。因此,组织内的整体数据质量和信任度将大幅下降。

由于这种传承,工程师可以识别所有受影响的资源,并精心编写代码以最大限度地减少负面影响。如果有影响,他们可以识别受影响的数据资源,并向这些资源的活跃用户发送警告。

‍

## 发现和信任

“垃圾进来,垃圾出去。但是我怎么检查什么是进去的呢?”

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5339ef1747b040c02b854a23640753e2.png)

数据沿袭通过了解数据的来源来帮助您信任数据。图片由[泽维尔·德·布瓦雷东](https://www.linkedin.com/in/xavier-de-boisredon/)提供。

用户想要识别、理解和信任他们想要消费的数据资源(表、报告和仪表板)。当用户查看数据资源时,知道它来自哪里有助于信任它。俗话说“垃圾进来,垃圾出去”。了解“活跃用户”控制面板上的数据将为您提供如何阅读这些数据以及是否可以信任这些数据的信息。Lineage 会让您知道它被插入到一个“BI 批准”的表中,具有黄金评级,并帮助您更快地信任它。

‍

## 定义 Propagation‍

“我懒。要是我能写一次文档并传播它就好了”

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fd72731e274701c5e95bca76e7b2340d.png)

通过识别相同的数据点,数据沿袭可以帮助您在整个数据仓库中传播定义。图片由 Xavier de Boisredon 提供。

从治理的角度来看,数据沿袭被证明对于传播元数据非常强大。用户可以轻松地跨数据系统传播定义。

如果一个列在另一个表中使用,而没有进行任何转换,那么可以合理地假设在 99%的情况下定义是相同的。现在,假设您的数据目录连接到列级沿袭元数据,通过只记录源,您可以将定义治理的效率提高 10 倍。如果在数百个表中使用一个流行的列而不进行任何转换,您可以通过单击安全地传播定义和属性。

数据沿袭帮助来自大数据或企业公司的数据治理团队以可扩展的方式部署元数据管理工作。事实上,在一个拥有大数据资源和众多数据库的环境中,理解数据流及其来源是一项挑战。有许多重复的任务。

‍

## 数据隐私法规(GDPR 和 PII 地图)

“我无法保护我不知道自己拥有的东西”

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/203299144626b3cea1877c00214c70f7.png)

数据沿袭可以帮助您标记个人信息和跟踪访问权限。图片由 [Xavier de Boisredon](https://www.linkedin.com/in/xavier-de-boisredon/) 提供。

逻辑真的和上面的逻辑差不多。标记个人或敏感信息可能是一件非常痛苦的事情。今天,这是一项耗时的任务。由于沿袭,您可以了解和跟踪访问权限以及依赖性。通常你会意识到,你的角色策略中有一些弱点。您无权访问子表或父表,但可以访问中间表。这可能是正确的,但也可能是危险的,因为您可以重建/追溯敏感数据。

数据沿袭对于改善数据治理、访问权限管理和遵守 GDPR 法规来说非常强大。

‍

## 数据资产清理或技术迁移

“请告诉我!我该保留什么?”

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/83d7927dade6002b98a1238685930a8e.png)

数据沿袭有助于识别为最有价值的数据资源提供动力所需的资源。图片由 Xavier de Boisredon 提供。

数据团队有时希望转换技术。例如,一家企业公司从旧的本地 Oracle 数据库迁移到像雪花或 BigQuery 这样的云数据仓库。这些大规模迁移的成本非常高,因为一切都是相互关联的。甚至在开始这样一个项目之前,追溯依赖是一个业务关键的过程。

作为此过程的一部分,您需要确定可以删除的数据资源和要迁移的数据资源。这种鸟瞰图有助于引导建筑思维。‍

# 数据沿袭提供了数据流的鸟瞰图

它有助于追溯跨数据系统的关系

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/43389cf3be367a30d0d7f96b6b09ed49.png)

从数据源到 BI 工具的端到端数据沿袭系统。图片由 Xavier de Boisredon 提供。

‍A 几年前,沿袭主要是关于在数据湖或数据仓库中追踪关系。这意味着系统跟踪数据表之间的关系。现在数据血统是跨系统的。

这些表通常支持 BI 工具,如 Looker、Tableau、Mode、Metabase、PowerBI 等。对业务用户和工程师来说,绘制这个流程证明是非常强大的。事实上,业务用户可以轻松地检查数据的来源和流向,而工程师可以检查变化对业务的影响。‍

现在,从数据源(ETL)到业务报告的端到端沿袭是可能的,因为大多数 BI 工具都有 API,并且 BI 工具以标准化的方式在数据仓库上执行 SQL 查询。当数据目录提供商必须为每个新工具、语言和集成构建尽可能多版本的沿袭解析器时,他们现在可以构建沿袭引擎并等待定制最后一英里连接器。‍

# 数据血统何时以及为何变得如此流行?

数据沿袭最近获得了关注。这有几个原因。第一个是企业拥有更多数据,比 10 年前更快。对元数据管理工具的需求越来越大。第二,数据行业用工具和流程来构建自己。这使得云技术和公司的计算血统更加容易和可靠。最后一个原因是各大洲(GDPR、HIPAA 等)出现了苛刻的数据法规,这使得沿袭成为一种必须。

这三种结构性变化是复合趋势。它们将随着时间的推移急剧增长。公司将继续收集更多的数据,并招募更多的人来分析这些数据。数据行业将继续构建自身,并带来标准流程。如今,遵从数据法规对企业公司来说是一个更大的问题,但对中端市场和中小型企业来说很快就会成为问题,因为工具将使评估数据法规变得更容易。

出于所有这些原因,数据血统正在进入这个领域,您可能希望尽早开始投资这样一个工具。‍

# 深入研究数据谱系的技术方面

请注意——仅限数据血统专家。

## 表级血统和列级血统有什么区别?

数据沿袭流可以以不同的格式存在。您可以跟踪数据表或特定表中的列之间的父子关系。事实上,每个列都是用其他表中的其他列创建的,有时甚至是来自同一个表。

列沿袭是表沿袭的子集。如果不同表中的两列之间存在链接,则这两个表之间存在链接。相反的情况并不总是正确的。列沿袭在列级别提供父子关系,而不考虑下面的表。这是一种非常强大的血统,但随着连接数量的增加,很快就会变得非常难以想象。列级沿袭系统也特别难以计算。处理列沿袭的开销更大,耗时更长,并且需要更好的解析算法版本来理解这些变化。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/dd3a430d529917980dd2eac0b8601ba3.png)

列沿袭的示例。图片来自 [Castor](http://www.castordoc.com) app 经许可。

‍ **表级方法**

在下面的 SELECT SQL 语句中,我们正在使用另外两个表 *parent_table_1* (FROM 子句)和 *parent_table_2* (JOIN 子句)构建一个表 *child_table_1* 。这意味着,如果两个“父表”中的一个发生了变化或出现了问题,子表可能会受到变化或错误的影响。‍

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/723f053b7f45b8350352e078f0330c97.png)

可以被解析以查找父级和列级沿袭链接的 SQL 查询示例。图片由 [Xavier de Boisredon](https://www.linkedin.com/in/xavier-de-boisredon/) 提供

**列级方法**

在上面的 SELECT SQL 语句中,我们在 *child_table_1* 中构建了三列 *child_1* 、 *child_2* 和 *child_3* 。前两个“子列”与来自 *parent_table_1* 和 *parent_table_2* 的“父列”相同。有直接的血统依赖。

*child_3* 列是*parent _ table _ 1 . parent _ column 1*和*parent _ table _ 1 . parent _ column 1*的和。这里也有血统依赖。‍

# 更现代的数据堆栈分析?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c706fbedbabeed353f227726521f1fc8.png)

点击此处,了解更多关于现代数据堆栈[的性能指标评测和分析。](https://notion.castordoc.com/)

我们写了利用数据资产时涉及的所有过程:从现代数据堆栈到数据团队的组成,再到数据治理。我们的博客涵盖了从数据中创造有形价值的技术和非技术方面。

如果您是一名数据领导者,并希望更深入地讨论这些主题,请加入我们为此创建的[社区](https://notion.castordoc.com/unsupervised-leaders)!

*最初发表于*[T5【https://www.castordoc.com】](https://www.castordoc.com/blog/what-is-data-lineage)*。*

# 数据素养系列:维度建模

> 原文:<https://towardsdatascience.com/data-literacy-series-dimensional-modeling-5de34f747bb9?source=collection_archive---------40----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/61302c311bf7924cf4e5749a93a9d908.png)

Honey Yanibel Minaya Cruz 在 [Unsplash](https://unsplash.com/photos/bYOB7SrWo5w) 上拍摄的照片

## 本系列旨在以简单而有效的方式解释关于数据主体的不同主题。

# 介绍

通常,数据模型是如何将数据组织到数据库表中的表示。我知道,这不是一个严谨/学术的定义,但我在这里的唯一目标是明确的。对于一个给定的数据集合,代表一个业务流程,有许多可能的方法来组织和存储它们:我们是否将所有数据存储在一个大表中?或者 2 年,100 年,..?看情况。对于任何数据分析驱动的主题,从经典的商业智能到最疯狂的数据科学应用,一种非常舒适和有效的方式是使用维度建模。

主题将是:

*   什么是维度建模?
*   维度数据模型的概念
*   数据科学、ML、BI 为什么要用维度模型?

# 什么是维度建模?

维度建模是一种构建数据模型(一堆表,通常大约 10-15 个)的技术,为数据分析而优化。维度建模的目的是允许数据历史化,简化业务数据理解,最大化数据检索的速度,并提供一个用户友好的分析模型(如果与业务流程使用的操作数据库进行比较的话)(也称为在线交易系统,或“OLTP”)。

简单地说,OLTP 是直接存储业务事件产生的数据的任何数据库,例如商店中的结账交易,它简单地记录扫描的每件产品。很明显,对于严肃的分析来说,本机 OLTP 数据从来都不是很好,也不够完整。

假设您是一名数据科学家,需要根据以下模式中的 10 个表中的特性构建一个预测模型。纯粹的噩梦..

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0002cf5d1cc28824abfe295b38b002cc.png)

图片来自 https://meta.wikimedia.org

这就是维度模型可以发挥作用的地方:它被设计成允许快速阅读、总结、分析数值信息,如值、余额、计数、重量,以及聚合任何业务属性的度量。例如,销售分析按客户国家和产品类别计算总营业额。

相比之下,用于实时 OLTP 系统的关系模型针对添加、更新和删除数据进行了优化,以“记录”它们所服务的业务流程的所有事件。

这些维度和关系模型有其独特的数据存储方式,具有特定的优势。关系模型试图通过使用数据中的冗余来进行有效的数据捕获和存储。这意味着复杂的模型,有许多表格,不可读的模式,通常像埃及象形文字一样清晰。

另一方面,维度模型旨在以一种易于理解数据存储位置以及如何快速检索的方式来安排数据,从而实现敏捷的业务分析和报告。牺牲所有这一切是一个糟糕的存储空间优化,但谁在乎最终的模型是否像这个一样简单明了:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8b72c96fa4fd30bb391a208d87beb1ee.png)

作者截图:维度模型示例(星型模式)

# 维度数据模型的概念

## 事实和事实表

事实是业务流程的量化度量。

示例:对于销售业务流程,事实可以是每月总销售额。

为了模拟事实,我们需要构建一个表,其中包含:

*   一个或多个事实(数量、比率、重量、数量等)。)
*   相关维度表的关系列(接下来解释)。

## 维度和维度表

维度提供了围绕业务流程事件的上下文。一个过程的所有非数值数据都可以看作是维度。简单地说,它们告诉我们一个事实的“何时”、“何人”、“何事”和“何地”。

为了对维度建模,我们为流程中的每个业务概念构建一个维度表。示例:对于销售业务流程,维度将是

*   时间:销售交易日期
*   谁:客户信息(姓名、地址、类型、子类型等。)
*   地点:存储信息(名称、地址、部门、规模等。)
*   内容:产品信息(描述、类别、子类别、细分市场等。)

## 如何建立维度模型?

1.  **分析业务流程**:找出哪些度量值得了解(事实)及其上下文(维度)。示例:前面提到的销售流程可以通过查看其交易内容来完全建模。销售量、价格、产品、客户等。
2.  **定义粒度**:它描述了回答有关业务流程的任何问题的最精细的细节。例:待售粮食可以是单一销售交易。这样,我们的模型将能够表示单个销售细节和我们可能需要的任何汇总(按周、按月、按国家等统计)。)
3.  **确定维度和事实**数据。销售交易的事实可以是交易金额、产品数量、数量、单位成本等。维度:客户标识符、日期、渠道、市场类别、产品标识符、产品细分。
4.  **构建模型:**将每个业务流程的所有度量组织在一个事实表中,通常有几个(10–15)维度表链接到该事实表。每个维度表应该包含一个业务概念。示例:维度表 Customer(及其标识符、名称、地址等。),一个用于产品,另一个用于日历(日期),等等。

星型模式中的事实表是规范化的,而维度表是高度非规范化的,这意味着维度中的信息在记录间是高度冗余的。但这正是我们想要提高数据检索性能的地方,因为只有两个级别(事实表和维度表)上的简单连接,分析查询可以比多层连接更有效地运行。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8b72c96fa4fd30bb391a208d87beb1ee.png)

作者截图:维度模型示例(星型模式)

当谈到维度建模时,星型模式并不是唯一的可能性。一种常见的变体称为雪花模式,其中维度可以部分规范化。

# 数据科学、ML、BI 为什么要用维度模型?

*   维度和事实很容易用于分析。它们提供了任何复杂业务流程的直观表示。此外,每个维度都可以在多星型模式中使用:想象一个非常典型的维度客户,既可以用于对客户进行简单的描述性分析,也可以用于对其未来行为进行更复杂的预测性分析、细分、聚类,所有这些都使用同一个核心表。
*   维度模型允许数据历史化,这通常是操作数据库所不具备的。想象一下事务性或实时数据:一旦它们发生变化,它们的旧值就会丢失。通过使用时间维度,维度模型可以捕捉所有的历史变化(实际上这是它最初被发明的原因之一)。
*   如果必须在模型中引入一个新的维度,那么事实表只需要一个小的改动,对现有的维度没有影响。
*   维度模型针对快速数据检索进行了优化。本文没有描述的更复杂的主题,如索引和表分区,总是在维度模型中使用,以显著提高查询性能。

# 如何使用维度模型

作为一个维度模型的用户,你需要知道什么?无论您是需要仪表板、报告、ML 管道的数据,还是任何其他类型的数据分析,原则都是一样的:获取一个或多个事实,以及您想要用来聚合事实的所有维度。以某种方式组合它们(通过 SQL、R、Python,没关系,应用相同的概念),将事实视为主要数据,将维度视为次要数据。

简而言之:**“事实总是离开了联结的维度”!**

例如,使用上图中的星型模式模型,典型的查询会将 Sales 事实表连接到所有维度,并按感兴趣的属性聚合事实。如果我们想按年份和客户所在国家进行一些分析,SQL 可能如下:

从概念上讲,这与 R / Python 中的原则是一样的:事实是主表,事实必须作为辅助表连接。

## 真的这么简单吗?差不多了,还有几件事。

1.  **事实类型:**当您分析事实时,汇总它们是很自然的,例如,计算每月销售总营业额、按产品细分市场或市场或任何维度的平均销售额。但是事实并不总是能以我们想要的任何方式组合:你需要理解可加的、半可加的和不可加的事实。

*   *附加事实*可以在与事实表相关联的任何维度上求和。例如,销售额可以按客户、周期、产品进行汇总。
*   *半累加性*事实可以在某些维度上聚合。例如,移动信用余额在除时间之外的所有维度上都是相加的。
*   非相加的事实根本无法聚合。例如比率。

2.事实历史化:当我们查询事实表时,我们需要知道度量是如何存储的。有两种可能的方法,取决于您尝试测量的过程的性质。您需要了解它们,以避免在分析数据时出现错误,做出不正确的聚合。

*   *定期快照事实表*:定期捕获事实数据,以测量该周期结束时的情况。例如,如果你在每个月末查看你的银行账户,并把余额收集到一个表格中,你正在做一个周期性的快照历史化。这个时期自动成为你的一部分。定期快照是半累加的(我们不能按时间聚合)。
*   *累积快照事实表*:当某个事件发生时,这些事实被捕获。例如,如果您想查看一个月内的银行交易,您可以在每次交易完成时捕捉一个事实,甚至可以通过求和来计算总额。

**3。维度历史化:**我们如何反映维度属性的变化?换句话说:如果一个属性在我们的源数据中获得了一个新值,我们如何向维度表传播它?

例如,如果客户更改了国家或新产品替换了产品目录中的旧产品,我们如何让我们的“按国家销售”和“按产品营业额”分析适用于过去、现在和未来?总共有 8 种方法来处理尺寸的变化,也称为尺寸的“类型”。我只介绍前 3 种类型,这是我在真实环境中见过的唯一类型(理论上还有 5 种)。

*   维度“类型 0”:保留原始值,不需要更新。例如,保险公司可以为客户分配一个初始风险分数,该分数反映了非常初始的情况,并且需要永远保持这种状态。
*   维度“类型 1”:当加载新值时,它替换维度的属性值。例如,相同的保险公司可以具有客户的属性“最近风险分数”,该属性必须给出每个客户的最新风险分类,而对先前的值不感兴趣。
*   维度“类型 2”:进入维度表的新值在维度中创建新行,而不删除前一行。一些额外的列允许标记什么是当前有效值,并指示历史日期。

# 简而言之…

维度建模是对业务数据建模的一种简单方法,它将所有业务量化(数字)放在一个表中,将资格(描述、属性)放在其他表中。这为任何数据分析应用提供了许多优势。

下一步是什么?在这篇文章中,我只是提到了基本概念。如果你想了解实际设计的细节,一个好的起点是这里的和金博尔的书(他是现代维度建模之父)。

感谢阅读。

[随时订阅我的**【分享数据知识】**简讯**。**](http://eepurl.com/humfIH)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5b47b79478f6a5ce8d5d8ee3735a5b3c.png)

如果你想订阅《灵媒》,请随意使用我的推荐链接[https://medium.com/@maw-ferrari/membership](https://medium.com/@maw-ferrari/membership):对你来说,费用是一样的,但它间接有助于我的故事。

# 数据管理架构—整体数据架构与分布式数据网格

> 原文:<https://towardsdatascience.com/data-management-architectures-monolithic-data-architectures-and-distributed-data-mesh-63743794966c?source=collection_archive---------7----------------------->

## 这篇文章是软件工程师、数据工程师、数据科学家、MLOps 工程师、软件开发人员和数据库架构师的必读之作,他们有兴趣了解更多关于整体数据架构和分布式数据网格的知识。

# 介绍

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/cc1647e6b3958b1bf6874e62a19674e8.png)

作者图片

数据管理架构管理*组织如何收集、存储、保护、安排、整合和使用数据*。一个好的数据管理架构可以清晰地了解数据的各个方面,以及企业如何从数据中获得最佳收益,从而实现业务增长和盈利。相反,糟糕的数据管理架构会导致不一致的数据集、不兼容的数据孤岛和数据质量问题,从而使数据变得毫无价值或影响组织运行分析、数据仓库(DW)和商业智能(BI)活动的能力,尤其是大数据。

> 传统上,大多数组织更喜欢从中央数据团队和单一数据管理架构开始,在这种架构中,所有数据操作都是在单一的集中式数据平台上执行的。虽然整体数据架构相对容易建立,并且可以处理小规模的数据分析和存储而不会降低性能,但随着时间的推移,事情会变得不堪重负。此外,随着数据量和需求的增加,中央数据管理团队往往会成为瓶颈。

由 [Zhamak Dehghani](https://www.thoughtworks.com/profiles/z/zhamak-dehghani) 推出的分布式数据网格提供了一种调和并有望解决与以前的数据架构相关的挑战的方法,这些挑战通常被数据消费者和生产者之间的数据标准化挑战所阻碍。分布式数据网格将我们推向更强大、更敏捷、更精简、多功能的团队和领域驱动的业务结构。它以分散的方式结合了最佳的数据管理方法,同时保持数据即产品的观点、自助式用户访问、领域意识和治理。

> 这篇文章将帮助读者了解整体数据架构、与整体数据架构相关的挑战,以及分布式数据网格如何帮助组织将其分析数据转变为产品,并构建高度可伸缩、弹性和数据驱动的应用程序。目标受众是软件工程师、数据工程师、数据科学家、MLOps 工程师、软件开发人员和数据库架构师,他们有兴趣了解更多关于整体数据架构和分布式数据网格的知识。

# 整体数据架构

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/cae2eb3cbd2133226892d0b2dd8daec5.png)

作者图片

整体数据架构是一个框架,在这个框架中,应用程序数据从一个单一的集中式数据存储中进行存储、转换、操作、消费和管理。整体数据架构由一个大型平台团队管理,适合业务领域相对简单且数据环境不会不断变化的小型组织,但它们对不断发展的工程团队提出了一些挑战。让我们来看看其中的一些挑战。

T 他首先担心的是整体数据架构不能无限扩展,而且大多数整体数据库根本不能自动扩展。随着应用程序工作负载和数据量呈指数级增长,整体数据库逐渐变得缓慢、昂贵且难以维护。由一个中央团队管理的在一个地方消费和协调无处不在的数据的能力,对于具有快速和广泛变化的用例、多个数据源和数据消费者的组织来说,也会减弱。

其次,整体数据库通常有很高的延迟和吞吐量,这是由应用程序中不同的不相连的团队和方法的并发数据库读/写自然产生的。对于整体数据架构,在不改变整个数据管道的情况下响应新需求也是一项挑战。

第三,单一的数据架构缺乏模块性,并且受到技术同质化的影响。当一个整体数据库出现故障或无响应时,它会影响整个应用程序并停止所有与数据库相关的活动。此外,如果工程团队被迫为一个应用程序采用一个单一的数据库,就不会有太多的创新和实验空间。

最终,一个单一的数据架构自然会导致住院病人数据消费者、断开连接的数据生产者和积压的工程团队,他们背负着巨大的技术债务,在一个变化不断、企业需要快速创新的敏捷世界中努力奋斗。

*现在你理解了整体数据架构的意义和局限性。现在让我们来看一个更优化的数据架构,它主要解决与单片架构相关的挑战。*

# 分布式数据网格

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c1bc00820c88d9b42f70f56c7f790790.png)

作者图片

分布式数据网格是高度分散的,视图“ ***【数据即产品】、*** ”并支持分布式、 ***特定领域的数据所有者*** “负责以一种易于使用、用户友好的方式处理他们自己的数据产品和管道,同时增强不同位置的分布式数据之间的通信。 ***从很多方面来说,分布式数据网格就是微服务的平台版本。***

通过将整个数据架构分解成更小的、面向领域的、更加分散的组件,并让不同的团队管理每个领域,工程团队可以很容易地实现分布式数据网格的可伸缩性。这样,随着用例、数据源和访问模型多样性的增加,就可以更容易地向外扩展。它还允许团队构建高度可扩展、数据驱动的应用程序,并有效地使用数据来更好地改进营销活动、降低成本、优化业务运营和做出更明智的决策。

> 分布式数据网格为数据所有者提供了更大的灵活性、更高的生产率和自主权。通过将责任分配和分散给最接近数据的人,分布式数据网格降低了每个数据库的读/写速率,促进了数据创新,并消除了工程团队使用单个数据管道或数据存储来满足每个数据消费者需求的负担。在分布式数据网格中,每个团队可以自由决定如何收集、组织、存储和使用数据。

第三,分布式数据网格具有自助式的“基础设施即平台”和“联合计算治理”设计,支持领域自治,并为数据产品监控和治理、数据标准化、日志记录、警报、产品质量指标等提供与领域无关的、可互操作的通用方法。在分布式数据网格中,数据库故障的影响大大降低,每个团队都可以对他们的数据平台进行更改,引入新功能,并部署功能更新,而无需更改其他数据存储。

# 何时从整体式数据网格过渡到分散式数据网格

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c15363401181f662d159a8b34b062dca.png)

作者图片

**分布式数据网格并不是适用于所有组织和团队的灵丹妙药。**可以想象,整体数据架构也不会消失。在从单一数据架构过渡到分布式数据架构之前,组织需要做足功课,确保迁移对业务来说是一个明智的决策。

以下是组织及其团队在评估向分散数据网格过渡的准备情况时应该问的一些问题:

*   **数据团队的规模:**我们在数据团队中有多少数据工程师、数据分析师、数据科学家和产品经理?
*   **数据量:**我们的数据量有多大?它的增长率是多少?
*   **数据种类和来源:**我们有多少数据用例及来源?
*   **数据瓶颈:**数据团队解决技术债务的频率有多高(因此减缓了新数据产品的实施并使其成为瓶颈)?
*   **交付周期:**尽管我们的团队规模在增长,但是每个团队的成员是脱节的,还是他们缺乏领域知识?
*   **数据域的数量:**有多少职能团队依靠我们的数据存储做决策,我们有多少数据驱动的产品和特性?
*   **数据治理:**对于我们的组织来说,数据治理有多重要?在谁控制的问题上有政治内讧吗

> 通过提出这些问题并评估回答,组织可以确定是坚持传统的整体式架构还是转向分散式架构。一般来说,拥有基于微服务的应用程序、非常苛刻和复杂的数据基础架构要求、高数据量、大量数据源和域以及经常不堪重负的大型团队的公司将从数据网格中受益更多。否则,我认为分散的解决方案将是矫枉过正。

# 结论

组织需要采用一种新的方法来管理大规模数据,以增加和改善数据在生活和业务中的方方面面。尽管过去的技术进步解决了数据量和数据处理计算的规模问题,但它们无法解决其他方面的规模问题,例如数据源的激增、数据环境的变化、对变化的响应速度以及数据用户和使用案例的多样性。

数据网格架构解决了这些问题,并推动了组织结构和技术架构的新逻辑视图。通过从单一数据架构转移到分布式数据网格,组织和工程团队可以大幅缩短交付周期,更好地定位自己,以便在多个用例中高效地使用数据,并构建可扩展的数据驱动型应用程序,与当前向云原生架构和生态系统的转变保持一致。

# 数据管理是数据驱动型组织的重要组成部分

> 原文:<https://towardsdatascience.com/data-management-as-an-essential-part-of-a-data-driven-organization-bbf60ad122e3?source=collection_archive---------33----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/19b4eb023f82b0bd3ba07ae1b0eff771.png)

[https://unsplash.com/photos/ZOHa76txKfo](https://unsplash.com/photos/ZOHa76txKfo)

*数据科学领域至少在 10 年内快速发展,尽管时间很短,但数据文化已经开始成为主流。即使是石油和天然气或采矿等传统领域的企业公司,也已经将他们的思维模式从作为会计需求商品的数据提升到数据优先,甚至政府也宣布了国家数字战略。也许今天没有一家公司没有宣布他们是数据驱动的,每一个决策都是基于数据的。尤瓦尔·诺亚·哈拉里在他的书《德乌斯之家》中反思了数据宗教的兴起*

当一种数据文化正在兴起时,各种各样的专业出现了,今天我们不再怀疑何时会遇到首席数据官、数据分析师、计算机视觉工程师、数据工程师、商业智能专家、数据产品经理、数据管家等。与此同时,MLOps、DataOps 或 Data Governance 等整个方向似乎就在昨天兴起。一切都取决于数据,没有任何迹象表明数据发展有所放缓。

然而,在这次反思中,我会找出基本的定义:什么是数据管理,以及创建一个数据驱动的公司需要怎样的核心数据团队。

# 什么是数据管理

数据管理协会(DAMA)提供的官方定义将数据管理解释为在数据和信息资产的整个生命周期中交付、控制、保护和提高其价值的计划、策略、程序和实践的开发、执行和监督活动。

与此同时,Gartner 词汇表提供了一个实用的定义:数据管理由实践、体系结构技术和工具组成,用于在企业的各种数据主题领域和数据结构类型中实现一致的数据访问和交付,以满足所有应用程序和业务流程的数据消费需求。

换句话说,一般来说,数据管理是一个专注于为最终用户提供数据证明、安全性及其质量的领域。该领域的主要课题可分为:

*   **数据库管理** —关系数据库和 NoSQL 数据库的设计和维护是必不可少的,但同时对任何组织的用户都是隐藏的,当出现问题时,普通用户会知道。在开始从数据使用中获得收获之前,应该推出数据仓库或/和数据湖。随着数据文化的兴起,这个领域也在不断发展。然而,只有在关键业务流程中使用数据之后,业务用户才明白投资核心数据基础设施的重要性。
*   **数据整合** —从不同来源收集数据是任何分析的起点。这包括提取、加载和转换(ELT),它是 ETL 的一种变体,在将数据加载到目标平台时,它会保持数据的原始形式。
*   **数据治理、数据质量** — GIGO(垃圾输入,垃圾输出)是一个众所周知的概念,每个分析师都至少曾经面临过数据质量问题。清理和保持数据有序是数据驱动型组织的一个主要概念。如果你不确定所用数据的质量,你如何保证决策的质量。数据治理定义了应该做什么,数据一致性和完整性是该过程的关键指标。

因此,数据管理是发展数据驱动型组织的基础或起点。与此同时,最终用户或首席执行官可能会在进入数据分析和重新设计数据驱动的现有业务流程后感到努力。

# **数据分析 vs 数据管理**

记住这一点,让我们定义什么是数据分析。
Garner 词汇表解释了分析特定领域信息的过程,或/和将广泛的 BI 功能应用于特定内容领域(例如,销售、服务、供应链)的过程。

因此,正如我们在定义中看到的,数据分析至少是数据生命周期中产生商业价值的最后阶段,但不是最后阶段。数据字段之间有很大程度的重叠,但在我看来,主要的区别是数据管理更侧重于数据获取和准备,而不是数据分析流程对业务价值提取的响应。

尽管数据管理是任何分析项目的重要组成部分,但只有在核心业务流程中开始实施分析活动后,它才开始对整个组织变得重要。

# 安**数据团队的组织架构和演变**

当许多组织刚刚迈出数据驱动文化的第一步时,他们面临的主要问题是,他们应该将约会团队分成两个专门的团队,还是只有一个团队。

在我遇到的大多数情况下,这高度取决于两个要点:

*   提供业务连续性所需的数据量
*   您的企业客户有多渴

假设第一点非常清楚,但是第二点需要解释。业务需求的数量与公司的数据文化水平相关。这意味着当您的客户缺乏数据素养,不熟悉数据的力量,不了解他们可以如何以及用什么来改进他们的流程时,他们的需求不会有任何大的变化。

我只是强调,数据团队的发展包括与您的整个组织相同的流程部分,而不是一个结论。从一个由全栈分析师组成的小团队开始,他们能够独立创建数据管道、调查数据管道、创建仪表板、发现洞察力并为最终用户翻译。当商业用户在开发时,他们的需求也在增加,你必须拥有先进的技术和对其工作原理有深刻理解的人。在这个阶段,evolution 保持维护,对于一个小团队来说,成为整个企业分析堆栈的专家是非常困难的。出于这个原因,你将不得不对新人敞开团队的大门,并且可能会考虑离婚来分配深度锻炼。

# 数据操作熊猫-PySpark 转换指南

> 原文:<https://towardsdatascience.com/data-manipulation-pandas-pyspark-conversion-guide-abed50a818?source=collection_archive---------32----------------------->

## 使用 PySpark on Databricks 进行探索性数据分析(EDA)所需的一切

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ca705709bd91a9310cedf0cd600e9c58.png)

萨米·米提特鲁多在 [Unsplash](https://unsplash.com/s/photos/red-and-white-bricks?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的照片

在处理大数据时,Jupyter notebook 会失败。这也是一些公司使用 ML 平台如 Databricks,SageMaker,Alteryx 等的一个原因。一个好的 ML 平台支持从数据摄取到建模和监控的整个机器学习生命周期,从而提高团队的生产力和效率。在这个简单的教程中,我将分享我关于将 Pandas 脚本转换为 Pyspark 的笔记,这样您也可以无缝地转换这两种语言!

# 介绍

## **什么是火花?**

Spark 是一个开源的云计算框架。这是一个可扩展的、大规模并行的内存执行环境,用于运行分析应用。Spark 是处理 Hadoop 数据的快速而强大的引擎。它通过 Hadoop YARN 或 Spark 的独立模式运行在 Hadoop 集群中,它可以处理 HDFS、HBase、Cassandra、Hive 和任何 Hadoop InputFormat 中的数据。它旨在执行一般的数据处理(类似于 MapReduce)和新的工作负载,如流、交互式查询和机器学习。你可以在这里阅读更多关于 Mapreduce 的内容:[https://medium . com/@ francescomandru/Mapreduce-explained-45a 858 C5 ac1d](https://medium.com/@francescomandru/mapreduce-explained-45a858c5ac1d)(P . S 我最喜欢的解释之一!)

## **什么是数据块?**

Databricks 为您的所有数据提供了一个统一的开放平台。它为数据科学家、数据工程师和数据分析师提供了一个简单的协作环境。就数据服务而言,它是市场领导者之一。它由 Ali Gozii 于 2013 年创建,他是阿帕奇火花三角洲湖和 MLflow 的原始创造者之一。它来自一些世界上最受欢迎的开源项目的原始创建者,Apache Spark、Delta Lake、MLflow 和 Koalas。它建立在这些技术之上,提供了一个真正的湖屋架构,结合了最好的数据湖和数据仓库,形成了一个快速、可扩展和可靠的平台。专为云构建,您的数据存储在低成本的云对象存储中,如 AWS s3 和 Azure data lake storage,通过缓存、优化的数据布局和其他技术实现性能访问。您可以启动包含数百台机器的集群,每台机器都混合了您的分析所需的 CPU 和 GPU。

# 主要概念

**探索数据-** 下表总结了用于获得数据概览的主要函数。

```
 Pandas      |            PySpark               
 -------------------------|------------------------------------ 
  pd.read_csv(path)       | spark.read.csv(path)
  df.shape                | print(df.count(), len(df.columns)) 
  df.head(10)             | df.limit(10).toPandas()            
  df[col].isnull().sum()  | df.where(df.col.isNull()).count()
  df                      | Display(df)
```

# 数据预处理

*   **删除重复项-** 删除所选多列中的重复行
*   **过滤-** 我们可以根据一些条件过滤行
*   **更改列-** 更改列名,转换数据类型,创建新列
*   **条件列-****列可以使用下面的 R 命令针对一组特定的条件取不同的值**
*   ****排序-** 对数据进行排序**
*   ****日期时间转换-** 包含日期时间值的字段从字符串转换为日期时间**
*   ****Groupby -** 数据帧可以根据给定的列进行聚合**
*   ****Join()** -将列转换为逗号分隔的列表**
*   ****填充 nan 值-** 用值替换列中缺失的空值**

```
 Pandas       |              PySpark               
 -------------------------|------------------------------------         
  df.drop_duplicates()    | df.dropDuplicates()
  df.drop(xx,axis=1)      | df.drop(xx)
  df[['col1','col2']]     | df.select('col1','col2')
  df[df.isin(xxx)]        | df.filter(df.xx.isin()).show()
  df.rename(columns={})   | df.withColumnRenamed('col1','col2')
  df.x.astype(str)        |df.withColumn(x,col(x).cast(StringType())
  df.sort_values()        | df.sort() or df.orderby()
  np.datetime64('today')  | current_date()
  pd.to_datetime()        | to_date(column, time_format)
  df.groupby()            | df.groupBy()
  ','.join()         |','.join(list(df.select[col].toPandas()[col]))
  df.fillna(0)            | df.x.fill(value=0)
```

# **数据帧转换**

*   ****合并数据帧-** 我们可以根据给定的字段合并两个数据帧**
*   ****连接数据帧-** 将两个或多个数据帧连接成一个数据帧**

```
 Pandas        |             PySpark               
 -------------------------|------------------------------------ 
  df1.join(df2, on=,how=) | df1.join(df2,df1.id=df2.id, how='')
  pd.concat([df1, df2])   | df1.unionAll(df1,df2)
```

# **结论**

**希望这个简单的对比备忘单可以帮助你更快的上手 PySpark 和 Databricks。以上对比只是起点!更多细节和例子,请查看这个 [Pyspark 初学者教程页面](https://sparkbyexamples.com/)。当谈到学习任何新的语言或工具时,最好的学习方法就是实践。我强烈建议你自己仔细阅读 pyspark 代码,甚至可以在 [Databricks](https://databricks.com/) 上开始一个项目!😉**

**如果你觉得这很有帮助,请关注我,看看我的其他博客。敬请关注更多内容!❤**

**</10-tips-to-land-your-first-data-science-job-as-a-new-grad-87ecc06c17f7>  </how-to-prepare-for-business-case-interview-as-an-analyst-6e9d68ce2fd8>  </10-questions-you-must-know-to-ace-any-sql-interviews-2faa0a424f07> **

# 窗口函数和聚合函数:SQL 与 Python 熊猫

> 原文:<https://towardsdatascience.com/data-manipulation-sql-vs-pandas-116bb33a9abf?source=collection_archive---------25----------------------->

## 您希望在下一个数据科学项目中使用哪种工具?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3356f7cb5adc3d03b9782ba4a28c5bcb.png)

帕斯卡·米勒在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

# 背景

在任何数据科学项目中,数据清理和操作都是必不可少的。 **SQL** 和 **Pandas** 都是数据分析师和数据科学家常用的工具。

在下面的文章中,我将从数据操作的实现方面比较 SQL 和 Pandas。希望它对熟悉 SQL 并想了解熊猫的人有用,反之亦然。

# 窗口函数和聚合函数

在我们深入比较之前,让我快速回顾一下数据操作的两个主要函数。

**窗口函数**在一组称为**窗口框架**的行上实现。窗口框架是同一组中的所有行。在下面的例子中,我们按性别计算平均工资,结果在同一个性别组中重复。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/728e25a9d83d0d10bf266028d6a40515.png)

(作者创作)

**集合函数**的实现与窗口函数相同。但是返回的结果是没有重复的,所以最终输出中的观察数量将等于不同组的数量。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/07b069e68209e0a935668c481ede81cd.png)

(作者创作)

# **窗口功能**

## 创建一个新的行号列

熊猫和 PostgreSQL 都内置了**窗口函数**。在 Pandas 中,我们可以使用带有窗口函数的 **groupby** 操作,而在 PostgreSQL 中,我们可以使用 **Over (Partition by)** 。当实现窗口功能时,将产生一个新列,并且输出将具有与原始数据集相同的行数。

```
**Using Pandas**
df['new_column_name'] = df.groupby('gender').cumcount()+1**Using PostgreSQL**
SELECT *, 
   ROW_NUMBER() OVER(PARTITION BY gender) AS ROW 
FROM df
```

## 在组内创建计数/最大值/最小值/平均值/总和

在熊猫中,我们经常使用带窗口函数的**变换**,比如,count,max,min,avg,sum。

```
**Using Pandas**
df.groupby('gender')['salary'].transform('count')**Using PostgreSQL**
SELECT *,         
   COUNT(*) OVER(PARTITION BY gender) AS ct 
FROM df;
```

## 在组内创建运行总和

在熊猫身上,我们可以使用 **cumsum** 来计算运行总和。

在 PostgreSQL 中,我们可以使用 **Over (Partion by)** 和 **Order by** 来计算运行总和。如果指定了 ORDER BY,将在窗口中的每一行实现一个窗口函数。

```
**Using Pandas**
df.groupby('gender')['salary'].transform('cumsum')**Using PostgreSQL**
SELECT *,         
   SUM(salary) OVER(PARTITION BY gender ORDER BY age) AS avg 
FROM df;
```

## **在组内创建滞后/领先**

```
**Using Pandas**
df.groupby('gender')['salary'].transform(lambda x: x.shift(1)) df.groupby('gender')['salary'].transform(lambda x: x.shift(-1))**Using PostgreSQL**
SELECT *, 
   LAG(salary) OVER(PARTITION BY gender ORDER BY salary),
   LEAD(salary) OVER(PARTITION BY gender ORDER BY salary)   
FROM df
```

## 在组内创建排名

```
**Using Pandas**
df.groupby('gender')['salary'].rank('dense', ascending = False)**Using PostgreSQL**
SELECT *,         
   RANK() OVER(PARTITION BY gender ORDER BY salary) AS rank 
FROM df
```

# 聚合函数

## 折叠组内具有计数/最大值/最小值/平均值/总和的行

在 Pandas 中,有许多方法可以实现聚合函数。我在下面的代码片段中包含了 3 种不同的方法。

*   使用 **groupby** 将聚合函数作为默认函数运行
*   使用**应用**运行内置的聚合函数或带有**分组依据**的用户自定义函数
*   使用 **agg** 运行内置的聚合函数或用户定义的函数,更加灵活,例如命名新列和创建多个新列

在 PostgreSQL 中,用 **GROUP BY** 可以直接实现聚合函数。

```
**Using Pandas**
df.groupby('gender')['id'].size().reset_index()
df.groupby('gender').apply(lambda x: x['id'].size).reset_index()
df.groupby('gender').agg(count = pd.NamedAgg('id', 'size')).reset_index()**Using PostgreSQL**
SELECT gender, 
   COUNT(*) 
FROM df 
GROUP BY gender
```

## **在组内创建百分位数**

在 PostgreSQL 中,可以使用 GROUP(ORDER BY)中的**和 GROUP BY 中的**来计算组内的百分位数。

```
**Using Pandas**
 df.groupby(‘gender’)[‘salary’].quantile(0.9).reset_index()**Using PostgreSQL**
 SELECT gender, 
    percentile_disc(0.9) WITHIN GROUP(ORDER BY salary) 
 FROM df 
 GROUP BY gender
```

## 需要考虑的事项:

**使用哪种工具**取决于数据存储的位置、数据的格式以及我们想要如何使用它。

*   如果您正在处理的数据还不是面板格式,并且您需要将来自各种来源的数据拼凑在一起,Pandas 可能会更好。例如,当处理文本数据或从网站抓取数据时,数据很可能是非结构化格式的,使用 SQL 将非常困难。
*   如果您不熟悉数据,并且想要探索数据,如果您使用 Pandas 在数据库之外进行工作,您的数据库管理员会很感激。
*   如果你想做数据可视化和实现统计分析和机器学习模型,Pandas 可以与 Python 中的其他库很好地合作,例如, **Matplotlib,Scikit-Learn** , **TensorFlow** 等。
*   如果处理大量数据,可以配合其他库使用熊猫,比如 **Pyspark、Dask** 和 **Swifter** 等,充分利用自己的硬件力量。
*   如果您非常熟悉数据,并且确切地知道应该采取什么步骤来清理数据,例如过滤、连接、计算等,那么运行 SQL 来处理数据并导出最终数据以用于分析任务应该会更容易。
*   如果您从事前端项目,并且希望在不进行复杂数据操作的情况下访问后端数据库,那么使用 SQL 可能会更好。

# 最终注释:

我建议学习 Pandas 和 SQL,因为它们是数据科学领域的常用工具。当您与不同背景的人一起从事各种数据科学项目时,这种组合将为您提供更大的灵活性。

# 感谢您的阅读!!!

如果你喜欢这篇文章,并且想请我喝杯咖啡,请点击这里。

您可以注册一个 [**会员**](https://aaron-zhu.medium.com/membership) 来解锁我的文章的全部访问权限,并且可以无限制地访问介质上的所有内容。如果你想在我发表新文章时收到电子邮件通知,请 [**订阅**](https://aaron-zhu.medium.com/subscribe) 。

# 数据网格 101:入门所需的一切

> 原文:<https://towardsdatascience.com/data-mesh-101-everything-you-need-to-know-to-get-started-72087f5a7d91?source=collection_archive---------20----------------------->

## 数据团队关于最新行业趋势的初级读本:数据网格

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/56f05458cce36fae0b6a214f8ded509e.png)

图片由 [Shutterstock](http://www.shutterstock.com) 上的 [Nixx Photography](https://www.shutterstock.com/image-photo/building-structures-aluminum-triangle-geometry-on-1238648299) 提供,可与作者购买的标准许可证一起使用。

*你的公司想要建立一个数据网格。太好了!现在怎么办?这里有一个快速入门指南,可以帮助您入门,并防止您的数据基础架构变成一个热网格。*

自 2010 年初以来,微服务架构已经被许多公司采用(想想:[优步、](https://eng.uber.com/building-tincup-microservice-implementation/) [网飞](https://www.youtube.com/watch?v=CZ3wIuvmHeM)和 [Airbnb](https://www.infoq.com/news/2019/02/airbnb-monolith-migration-soa/) 等等),作为当今的软件范例,引发了工程团队对面向领域设计的利弊的讨论。

现在,在 2021 年,你很难找到一个数据工程师,他的团队不会争论是否从单一架构迁移到分散的[数据网格](https://martinfowler.com/articles/data-monolith-to-mesh.html)。

由 Thoughtworks 的 [Zhamak Dehghani](https://www.linkedin.com/in/zhamak-dehghani) 开发的 data mesh 是一种数据平台架构,通过利用领域驱动的自助式设计来支持企业中无处不在的数据。

随着公司越来越受数据驱动,数据网格非常适合现代数据组织的三个关键要素:

1.  **对越来越多的数据的需求**,这些数据被整个公司的利益相关者吸收和利用,而不是一个“数据辩论者”团队
2.  **数据管道越来越复杂**因为团队寻求用他们的数据做越来越智能的事情
3.  **[**标准化数据可观察性和可发现性层的兴起**](/data-catalogs-are-dead-long-live-data-discovery-a0dc8d02bd34) 了解数据资产在其生命周期中的健康状况**

**数据网格的潜力既令人兴奋又令人畏惧,就像之前的微服务架构一样,它激发了许多关于如何大规模运营数据的讨论。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9e1312f8641a2ced1a0795f730701111.png)**

**与在一个中央数据湖中处理 ETL 的传统整体式数据基础设施不同,数据网格支持分布式的、特定于域的数据消费者,并将“数据视为产品”,每个域处理自己的数据管道。数据网格的基础是标准化的可观察性和治理层,确保数据在任何时候都是可靠和值得信赖的。图片由蒙特卡洛提供。**

**为了指导您的数据网格之旅,我们整理了基本数据网格读物列表:**

# **基础知识**

*   **[**如何超越单片数据湖走向分布式数据网格**](https://martinfowler.com/articles/data-monolith-to-mesh.html) —扎马克·德格哈尼的原创作品是所有数据网格内容的圣杯。请将本文视为您了解数据网格标准其余部分的门户,激发您未来围绕在实践中实现设计时的机遇、挑战和关键考虑事项展开讨论的兴趣。她的架构图对于理解数据网格如何以新的姿态对抗集中式架构至关重要。**
*   **[**数据网格原则和逻辑架构**](https://martinfowler.com/articles/data-mesh-principles.html) —作为 Zhamak 第一篇文章的后续文章,本文深入探讨了如何大规模地实际实现数据网格,并后退一步解释了联合治理如何以及为什么对架构的成功至关重要。对数据网格的具体细节感兴趣的人的必读之作。**
*   **[**应用数据网格**](/data-mesh-applied-21bed87876f2)—Mercateo Gruppe 的数据分析和数据科学主管 Sven Balnojan 向读者介绍了数据团队如何通过从单一数据仓库和湖泊迁移到数据网格,将 DevOps、“数据即产品”的理念应用到他们的数据架构中。他还谈到了普通企业(在本例中是一家电子商务公司)可能如何进行这种迁移,以及如何适当地民主化数据所有权和访问。**

# **补充阅读**

*   **[在这本初学者指南中,我们将介绍一些关键的注意事项,特别是当它与设置网格以成功实现数据可观察性和可发现性相关时。](/what-is-a-data-mesh-and-how-not-to-mesh-it-up-210710bb41e0)**
*   **[**数据网格是否适合您的组织?**](https://read.hyperight.com/is-data-mesh-right-for-your-organisation/)**——**在 Hyperight 的最新专题中,他们采访了各种数据领导者和顾问,询问他们为什么(或为什么不)实施数据网格架构。TL;DR:如果您的团队已经采用了面向领域的方法来获得数据所有权,并在数据管理方面苦苦挣扎,那么数据网格可能是将您的组织带到下一个级别的正确架构。重要的一点是:倾向于自动化和数据运营的公司更有可能成功,而没有这样做的公司更有可能成功。**
*   ****数据网格简介:分析数据管理的范式转变** ( [第 1 部分](https://www.starburst.io/resources/datanova-2021/?wchannelid=d4oyeh306b&wmediaid=1z50qr8fh6)和[第 2 部分](https://www.starburst.io/resources/datanova-2021/?wchannelid=d4oyeh306b&wmediaid=3sb7nbjc7f) ) —将这两个视频视为 Zhamak 早期关于数据网格文章的额外背景。在 Starburst Data 的 SuperNova 会议的两场讲座中,Zhamak 更详细地介绍了她设计这种新模式背后的动机,以及一流的数据团队如何大规模应用数据网格(通过自动化)来为他们的公司提供更可靠、可操作的见解。**

# **主要来源**

*   **[**数据网格在实践中:欧洲领先的时尚在线平台如何超越数据湖**](https://databricks.com/session_na20/data-mesh-in-practice-how-europes-leading-online-platform-for-fashion-goes-beyond-the-data-lake)**—Zalando 的数据工程师 Max Shultze 和 ThoughtWorks 顾问 Arif Wider 讨论了这家时尚电子商务公司如何通过利用数据网格原则,将他们的“数据沼泽”转变为领域驱动的、可操作的数据湖。对于那些认真对待数据架构去中心化和消除数据工程瓶颈的人来说(不管你是否正在走向全网状),这是一个必须观看的节目。****
*   ****[**Intuit 的数据网格战略**](https://medium.com/intuit-engineering/intuits-data-mesh-strategy-778e3edaa017)**——Intuit 数据平台的首席架构师 Tristan Baker 讨论了 Intuit 决定实施数据网格架构的原因和方式,用他的话来说就是“减少混乱,提高生产力,回到让客户满意的业务上来。”Tristan 认为,主要挑战包括数据可发现性、数据可理解性和数据信任。通过将代码和数据组织为“数据产品”,Intuit 能够设置清晰的数据责任、服务所有权和目标结果。******
*   ******[**网飞数据网格:可组合数据处理**](https://www.youtube.com/watch?v=TO_IiN06jJ4)**——在 Flink Forward 2020 的这段视频中,网飞数据架构总监贾斯汀·坎宁安(Justin Cunningham)讨论了他的团队如何构建数据网格架构来专门处理可组合数据处理。与其他演讲和文章不同,本演讲深入探讨了他们如何应用数据网格框架来处理数据转换过程中的一个要素——在网飞系统之间移动数据。********

******这个列表并不详尽,但是它应该可以帮助您开始数据网格之旅。对于那些对构建数据网格感兴趣或者希望分享最佳实践的人,可以考虑加入 [**数据网格学习松弛小组**](https://launchpass.com/data-mesh-learning) 。******

****下次再见——祝您的数据网格充满魔力!****

*******贵公司是否在构建数据网格?伸出*** [***巴尔摩西***](http://montecarlodata.com/?utm_source=blog&utm_medium=medium&utm_campaign=data_mesh) ***带着你的经历、提示和痛点。*** [***我们希望收到您的来信!*T34**](http://www.montecarlodata.com)****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e73c65449550dde556cf3ac10825796a.png)****

# 数据网格——时尚还是流行?

> 原文:<https://towardsdatascience.com/data-mesh-fad-or-fab-d9c16bb7b048?source=collection_archive---------19----------------------->

## 爱它或恨它——它就在这里。因此,我们向其中一位专家请教了一些关于数据领域最热门话题的难题。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f97475076c6598f645fe50dbcf826aaa.png)

图片由[参孙](https://unsplash.com/@samsonyyc)在 [Unsplash](http://www.unsplash.com) 上提供。

在过去的一年里, [**数据网格**](https://martinfowler.com/articles/data-monolith-to-mesh.html) 席卷了数据社区。有些[人喜欢它](https://www.youtube.com/watch?v=31BTUYaVSqw),有些[人不太理解它](https://www.montecarlodata.com/decoding-the-data-mesh/),许多人已经[向一个](https://medium.com/yotpoengineering/our-journey-towards-an-open-data-platform-8cfac98ef9f5?source=rss----afbe60b11b62---4)迁移,即使他们还不知道。不管你在哪里跌倒,都很难忽视这种嗡嗡声。

对于那些不熟悉的人来说,[数据网格](/what-is-a-data-mesh-and-how-not-to-mesh-it-up-210710bb41e0)是一个文化和技术概念,它将数据所有权分布在产品领域团队中,具有集中的数据基础设施和分散的数据产品。随着分析变得越来越分散,以满足现代洞察力驱动的组织的需求,这种范式变得越来越普遍。虽然我不能代表这个概念的创造者 Zhamak Dehghani,但我发现 data mesh 特别引人注目,因为它雄心勃勃地描绘了当数据工程团队[不是分析的瓶颈](https://maximebeauchemin.medium.com/the-downfall-of-the-data-engineer-5bfb701e5d6b)时,数据民主化和自助工具可以实现什么,因为它们经常是这样。

> 自从 Zhamak 的文章第一次发表,以及我写了第一篇关于这个主题的文章之后,客户问我他们应该如何实现数据网格架构。很明显,水里有东西。

在过去的几个月里,经过数百次交谈,我发现了关于数据网的四件事:

1.  像任何组织转变一样,数据网格需要自上而下的支持才能成功。
2.  数据网格是由多种技术组成的,作为现代数据平台的一部分,这些技术层层叠加,您无法仅使用计算、存储和 BI 工具来构建数据网格。
3.  对于大多数数据领导者来说,结果(而不是过程)才是最重要的。数据网格作为一个概念仍处于萌芽状态,只要数据网格的基本原则保持不变,就没有正确或错误的“构建”方法。结果呢?大规模的数据民主化。
4.  数据网格反映了数据分析去中心化的更大趋势——这让我无比兴奋。

也许没有人像马马德·扎德那样对数据网格充满热情,他是 T2 Intuit T3 数据平台团队的前工程副总裁。Mammad 于 2000 年加入雅虎,担任高级架构师和开发人员,开始涉足数据基础设施领域。在[雅虎](https://www.yahoo.com/)的时候,他建立了一个分布式云商店和一个完整的端到端分布式监控框架。2009 年,他加入网飞,在云中建立他们新的身份和会员平台。2012 年,他加入 LinkedIn,担任分布式数据系统的负责人,帮助塑造所有实时数据基础设施需求的愿景。在因纽特工作期间,Mammad 负责领导[公司数据平台](https://medium.com/intuit-engineering/the-intuit-data-journey-d50e644ed279)背后的团队,在那里他们实现了 Intuit 数据基础设施的现代化,并开始实施其[数据网格](https://medium.com/intuit-engineering/tagged/data-mesh)战略。

**但是什么是数据网格,我们为什么要关心它?**

我最近和 Mammad 坐下来聊了聊数据网格。以下是 Mammad 对此感到兴奋的五个原因——他认为你也应该如此。

# 数据网格上的玛马德·扎德

## 数据网格分散了责任——这是一件好事

作为一个多年来一直与数据打交道并处理扩展数据解决方案的方法的人,我很清楚,当围绕数据的所有责任都由一个中央数据团队承担时,您能做的事情就只有这么多了。当需要专业技能和专业知识时,我们通常喜欢将新的复杂问题隔离到一个中心团队。这往往在垂直领域内工作得很好,在早期,数据分析有点像这样。但今天,数据分析、机器学习和获取优质数据是我们所做一切的核心,并以指数速度增长。我们需要一种新的组织方式,以及一种新的思考架构和基础设施的方式,以满足组织内数据生产者和消费者的需求。这意味着重组中央数据团队,并在工程领域中分配数据责任。

> 我认为,在某些方面,我们可以看到与移动技术之旅的相似之处。十年前,常见的是一个中央“移动团队”,所有的移动应用程序开发都将在这里进行。

然而今天,移动开发是每个产品开发团队不可或缺的一部分。这种将责任从专门的中心团队“转移”到领域开发团队的情况也可以在运营和质量工程中看到。

这是一件好事,因为它帮助我们更好地扩展,更重要的是,它将责任放到了正确的位置;产生数据的地方。领域团队是他们自己数据的专家,他们有责任确保高质量的数据能够提供给这些数据的消费者,通常是分析师和数据科学家。作为中央数据团队的一员,我们应该确保数据生产者和消费者都可以使用正确的自助式基础设施和工具,以便他们能够轻松完成工作。给他们配备合适的工具,让他们直接互动,不碍事。

这一切都很好,但我们还没有完全实现。到目前为止,工程领导者一直不愿意改变他们围绕数据、数据工程和数据科学的传统组织结构。部分原因是这仍然是一个相对较新的概念,成功的故事并不多。另一个主要问题是,我们还远远没有达到将这一责任推给领域团队所需的自助式、易于使用的基础架构即服务的水平。

Data mesh 正试图正面解决这些问题,这给了我很大的希望。数据网格的主要原则是域所有权、数据作为产品、自助式数据平台和联合治理,所有这些对于帮助我们在未来十年扩展数据分析和机器学习都是绝对必要的。

## 数据网格让数据成为一等公民

分散化的结果是数据成为开发团队的一等公民。数据网格引入了“数据产品”的概念,像产品的其他功能一样,它由领域工程团队拥有和操作。网格上的节点是这些分散的数据产品。

重要的是要记住,大多数组织仍然处于制定数据网格策略和数据产品的早期阶段。当我们重新思考我们的数据分析方法时,我们不可避免地需要重温一些妨碍我们的旧习惯。例如,从事务性数据库的内部收集分析数据是一条捷径,但却引入了很多复杂性。正如我之前所说的,工具也不太到位,这意味着开发和操作这些数据产品仍然需要专业技能。

> 随着时间的推移,两件事将会改变:1)新加入工作队伍的工程师将会更加熟悉数据技术,2)数据基础设施本身将会变得更好、更容易使用,并且完全自助。在这种情况下,拥有和运营一个数据产品类似于拥有和运营一个功能性的微服务。

需要明确的是,当我谈到将数据的责任交给领域团队时,我并不是说要指定一个单一的联系点,让领域中的一个人了解他们数据的一切。我说的是数据的极端所有权和完全责任,以确保他们的数据是相关的、可消费的、可访问的和可信的。换句话说,将数据视为一种产品。如果没有发生这种情况,网格就不能起飞。

## 数据网格将改善体验的责任推给了供应商

很多人都在问,数据网格是否只适合那些数据的复杂性和规模是个大问题的大型组织。我认为遵循数据网格的原则是好的架构,并且将是正确的事情,无论你是一个小的创业公司还是一个在一个巨大的数据湖中拥有大量遗留数据的大公司。

话虽如此,一旦您更深入地研究了网格的设计和实现,您会注意到工具的当前状态在很大程度上假设了一个中心数据块,并且没有很好地与标准开发实践集成,这使得现有的产品开发人员很难构建和操作他们的数据产品。对于数据平台提供商来说,这是一个围绕这种新体验重新思考其产品的机会。工程领导者可以在推动供应商优先考虑这一点方面发挥重要作用。

> 我还希望我们能在基础设施层面上看到更多的开放标准,以鼓励供应商远离他们封闭的花园,构建能够与其他供应商的其他组件进行互操作的工具。我认为拥有这种可互操作的解决方案市场对我们的行业至关重要。

在我看来,这种同类最佳的方法将允许工程领导者以最适合他们的方式设计和组合他们的基础架构,而不是局限于一家供应商。随着时间的推移,基础设施将变得更加智能,允许多面手开发人员自主轻松地构建和操作他们的数据产品。谁知道呢,也许在某些时候我们不会区分功能微服务和数据微服务(即数据产品)!

## 数据网格优先考虑整个组织的数据治理

作为其主要原则之一,数据网格提出了对联合治理设计的需求。这允许每个域为组织范围的数据策略实现适当的解决方案,以确保数据的可用性、质量、可信度和合规性。

你和你在蒙特卡洛的团队正在解决这个框架的一个关键组成部分,因为[数据可观察性](https://www.montecarlodata.com/what-is-data-observability/)在确保整个网格的[数据质量](https://www.montecarlodata.com/the-new-rules-of-data-quality/)中起着基础作用。我认为可观察性需要做好几件事:

*   它应该能够检测到网格中出现的任何异常
*   它应该是智能的、自动化的、有弹性的、非常可靠的
*   并且它应该有实时开放的 API 来以编程方式与之交互

尽管这听起来很简单,但这些问题很难解决。有一点我怎么强调都不为过,那就是对开放实时界面的需求。作为一名从业者,我希望能够消费由可观察性层生成的事件,并在检测到异常时立即构建自动化、自我恢复和通知。拥有强大的开放 API 允许工程师以前所未有的方式将东西缝合在一起,并在问题出现时解决问题,而不是等待供应商来填补空白。

## 数据网格使数据更接近产品工程

不考虑数据网格,数据和机器学习将成为每个人工作的一部分;它将成为产品工程团队的 DNA。这种转变正在顺利进行,非常令人兴奋,但同时也令人不安。

一方面,在未来十年,我们将看到由数据推动的指数级技术进步。另一方面,我们还不知道消费者会如何使用这些数据。这就是为什么我们需要确保我们有正确的范式,可以给我们规模和灵活性来改变。Data mesh 正试图解决这个问题。

数据网格将数据与产品开发作为一个整体更加一致,而不是作为一个专门的孤立的活动。过去,您拥有“独一无二”的数据库,它归应用工程师所有。分析师将不得不乞求和借用时间来运行他们的查询,通常是在下班后,因为这不是一个优先事项,它更多地被视为后台活动。随着数据重要性的增长,我们将自己划分为事务和分析领域,创建了集中式数据团队,并将所有的复杂性和责任委托给他们。虽然它在一段时间内有效,但我们现在正处于这种模式无法进一步扩展的阶段。这就是为什么我对数据网格的前景感到兴奋。

**对数据网格好奇?**

*联系* [***马马德·扎德***](https://www.linkedin.com/in/mammadz) *和* [***巴尔·摩西***](https://www.linkedin.com/in/barrmoses) *或* [***蒙特卡洛团队的其他成员***](https://www.montecarlodata.com/) *,了解像 Intuit 这样的公司如何以可观察性为目标大规模实施数据网格架构。*

*报名参加 Zhamak Dehghani 在* [***IMPACT:今年 11 月的数据可观察性峰会***](https://events.montecarlodata.com/impact-data-summit-2021?utm_source=blog&utm_medium=kolibri+data+mesh&utm_id=impact) *了解更多关于数据网格的信息!*

# 数据网状拓扑

> 原文:<https://towardsdatascience.com/data-mesh-topologies-85f4cad14bf2?source=collection_archive---------2----------------------->

## [行业笔记](https://towardsdatascience.com/tagged/notes-from-industry)

## 构建数据网格体系结构的设计考虑

我工作过的所有组织都了解数据的重要性,并且对下一代现代数据平台感兴趣或正在进行规划。他们的目标是从紧密耦合的数据接口和变化的数据流转向允许生态系统连接的架构:云分布式数据网格,它允许特定领域的数据并将“[数据视为产品](/data-domains-and-data-products-64cc9d28283e),使每个[数据域](/data-domains-where-do-i-start-a6d52fef95d1)能够处理自己的数据管道。这不同于从传统(单一)平台获取数据,传统(单一)平台通常紧密耦合,并且通常会降低从一个中央数据湖或中心获取、存储、转换和使用数据的速度。

分布式数据架构中的这种范式转变伴随着一些细微差别和注意事项,它们主要取决于组织成熟度和技能、组织结构、风险偏好、规模和动态。基于这些细微差别和考虑,可以使用不同的数据网格拓扑。

# **受控网状拓扑**

第一种模式是“受控网状拓扑”。在此模型中,正如您从下图中看到的,不同的数据域被分组并表示为节点。您可以将每个节点视为一个域,它可以将自己表示为其他域的数据提供者和/或数据消费者。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1ebd2e2e523b37d208a1d0b75e9b1f54.png)

图片由 Piethein Strengholt 提供

在此模型中,作为一般实践,节点是从[蓝图](https://docs.microsoft.com/en-us/azure/governance/blueprints/)中实例化的,蓝图包含实现数据价值创造所需的关键功能(例如,存储、监控、密钥管理、ELT、分析引擎和自动化)。每个节点都可以根据自己的特定需求,使用该蓝图中自己偏好的一组技术。根据需求,您可能希望允许蓝图的变化和不同版本,以适应不同领域的不同需求。

该架构的核心代表了保持控制的所有数据治理和管理解决方案。它托管数据目录、策略和安全实施、网格范围审计功能、监控以及用于部署和自动化的辅助服务。受控网格不同于其他拓扑模式,因为它强制所有数据分布集中路由。例如,在这个模型中的[数据域](/data-domains-where-do-i-start-a6d52fef95d1),在接收之后首先集中交付它们的[数据产品](/data-domains-and-data-products-64cc9d28283e)。

数据网格的重叠之处在于,集中分布的所有数据都是按域划分的,在逻辑上是隔离的,而不是集成的。数据转换仅在消费点完成。同样,你也可以为数据安全辩护:零信任模型继承自域,并通过元数据强制执行。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5d309bbf4e6957f9cf815376d5908f3b.png)

图片由 Piethein Strengholt 提供

治理网格方法的好处在于,它更好地解决了大型数据消费者的时变和非易失性问题。因此,您可以通过集中编排的时间段来管理时间旅行和数据交付。同时,如果出现数据质量问题,例如域之间的交叉标识符不匹配,您可以阻止任何数据分发。另一个好处是,您可以更高效地共享(中央)计算资源。例如,对于可伸缩性和消费域,您可以创建“历史数据处理即服务”通过这种中央服务,向所有消费者域提供了一个小型计算框架,通过该框架,他们可以根据数据交付协议安排创建历史数据,包括范围(每日、每周或每月)、时间跨度、属性和他们需要的数据集。对于云中的短期处理实例,您甚至可以使其非常经济高效。最后一个好处是避免了大量的网络流量。如果所有的域都以点对点的方式分发它们的数据,你将会看到私有链接和服务端点的爆炸式增长。从“中央缓存”分发将解决这个问题。

增强的控制和集中分发伴随着额外的开销和治理的代价。中央平台团队可能会成为瓶颈,减缓您的数据雄心。这是通向下一个模式的一个很好的桥梁。

# **协调网状拓扑**

第二种模式是协调网状拓扑,这个术语最早是由约翰·马林德创造的。在这种模型中,节点更多地依靠自己运行。数据分发是点对点的,但同时也受到控制。例如,这在实践中是如何工作的,一个节点首先集中发布它的元数据。这允许其他域通过发现中央元数据存储库来发现哪些数据在哪些节点上可用。接下来,在数据契约已经建立并且相应的安全端点已经由各自的域交付之后,数据可以在域之间分发。协调网格中的中央数据中心监管一切。它允许域名运行自己的平台,同时遵守共同的政策和标准。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e2663204eafe55ac5869d21b6a0c7419.png)

图片由 Piethein Strengholt 提供

这种模式的好处是不同领域具有更高的灵活性和自主性。该模型的缺点是网络流量更大,资源利用率更低,因为整个模型是联合的。它还需要更成熟的团队和优秀的自助式(云)基础设施来启动和运行。

# **高度联合的网状拓扑**

最后一种方法被称为高度联合网状方法。在这个模型中,域在不同的环境中实现它们自己的技术堆栈有很高的自主性。这为特殊领域、实验或需要快速上市的领域带来了更大的灵活性。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9509b2cd0a1a7e8ffbd6261f926ec1c7.png)

图片由 Piethein Strengholt 提供

在这种模式中,你甚至可以追求一种混合的治理模式:通过枢纽、点对点或这些方式的组合进行分配。具体地说,这意味着模型被改变,以给予域灵活性来选择、构建和运行它们自己的风格,例如,任何数据库或集成平台。这种联合方法中的域需要将它们的解决方案与中央治理能力挂钩。元数据(所有权、数据产品信息、共享协议等。)总是集中管理。这种方法对于从主实体分离的域可能是有用的。您甚至可以追求混合的目标操作模型:例如,一个中心团队可以提供最常用的功能,而其他领域或团队可以操作一些特殊的功能。如果元数据在那里,您将仍然拥有控制权和洞察力。

所有这些灵活性都伴随着昂贵的价格标签。监督端到端发生的事情将变得更加困难,这需要您构建更多独立于平台的抽象来监督和实施您的架构标准。这种模式还可能加剧关于谁控制数据和/或需要数据(平台)主权的政治内斗。

# **升级**

达到数据管理和分发变得非常成熟的成熟水平并不简单。这是一种文化转变,需要对集中化的能力进行投资并做出选择:没有单一的集成解决方案或平台可以满足所有的用例。建立这些能力需要标准化、最佳实践、传播知识和专业技能来支持开发和项目团队。建立这些集中的能力还需要单个团队放弃他们的授权,去决定集成模式和工具。这很可能引发抵制,你可能不得不做出政治选择。此外,这种数据环境的现代化需要一种务实的方法,因为脱离紧密耦合的环境是很困难的。通过从简单的数据流开始,慢慢地扩大规模,您的域和用户将认识到好处,并希望为新的架构做出贡献,为组织带来竞争优势。

任何分布式数据架构都需要企业视图。没有它,架构就不能实现它的全部潜力。自行部署数据服务并简单地用其他数据服务替换数据孤岛的团队面临着“数据蔓延”的风险可重用性、一致性和数据质量是新架构的重要方面。持续的沟通、承诺和强有力的治理是扩大规模所必需的。

我们在这篇博文中讨论的拓扑有助于我们大规模管理数据。如果你想了解更多,我推荐你去看看《规模化数据管理[*》这本书。*](https://learning.oreilly.com/library/view/data-management-at/9781492054771/)

# 有史以来最极化电影的数据挖掘

> 原文:<https://towardsdatascience.com/data-mining-for-the-most-polarizing-movies-ever-made-4d92d27d702?source=collection_archive---------24----------------------->

## 使用 Python 和统计学寻找有分歧的电影

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b5010df54273b8574970899831cf51de.png)

作者图片

有些电影你要么喜欢要么讨厌,没有折中。我们都可以想到一些分裂朋友和家人的电影,但有些人甚至努力整理了[列表](https://www.indiewire.com/2016/09/30-most-polarizing-movies-since-2000-under-the-skin-only-god-forgives-1201723584/)中最分裂的电影,如*【房间】*、*波拉特*和*拿破仑炸丨药*。对于这些电影,肯定普遍缺乏共识,但它们真的是有史以来最两极分化的电影吗?

IMDB 显示,超过一半(57.3%)的《房间》的[评分](https://www.imdb.com/title/tt0368226/ratings/?ref_=tt_ov_rt)要么是 1 分,要么是 10 分,虽然这肯定是一部很少有人能同意的电影,但我很好奇我们是否能做得更好。使用来自 IMDB.com 的 API 的数据,这一分析将挖掘成千上万部电影,以找到有史以来真正最极化的电影。

# 数据

IMDB,或者说是为门外汉准备的互联网电影数据库,是一个拥有数百万用户评分的网站。它也是一个 [API](https://imdb-api.com/) 的所在地,允许开发者提取这些数据并在各种应用中使用,比如为其他网站提供后端数据,或者在这种情况下,寻找两极分化的电影。IMDB 的[文档](https://imdb-api.com/api#UserRatings-header)中列出了几十个 API 调用来获取不同类型的数据,但“UserRatings”调用可以让用户在一个请求中获取一部电影的所有用户评级,如下面的*社交网络*所示。

然而,对于这些调用,我们需要每个电影的 title_id。这可以在每部电影页面的 url 中找到,但 IMDB 也非常有用地提供了从每个标题到文件**中每个 title_id 的映射,title.basics.tsv.gz**可以在他们的[网站](https://www.imdb.com/interfaces/)上下载。不幸的是,这个文件包含了 IMDB 上的*一切*(电视剧集、短片、视频游戏、迷你剧集等。)而且数据质量可能相当参差不齐。经过一些数据探索,我写了下面的代码片段来转换。IMDB 提供的 tsv 文件转换成更干净,更有用的。用于此分析的 csv 文件。

下面是用于电影到 title_id 映射的已清理数据的示例。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fe6ea67f23c896eea91b875b4dc3c377.png)

作者图片

有了正确的 movie-to-title_id 映射和正确的 API 调用来获取每部电影的收视率数据,然后我创建一个助手函数,它将获取给定电影所需的所有相关信息。这个函数对 IMDB 的 API 进行初始调用,将响应转换成 JSON 对象,然后从该对象解析出相关信息。

调用 API 的函数

通过遍历我清理的电影数据中的所有 281,459 个 title _ ids 并调用上述函数(以及一些错误处理),我们最终得到如下所示的数据帧:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8979d8ba9e24e678901f3cafc982f512.png)

作者图片

总之,由于进行每个单独调用所花费的时间长度以及 IMDB 对 API 调用的强制每日限制,提取这些数据需要大约两周的时间。

# 衡量标准

接下来,我希望找到一个衡量标准,在给定评级分布的情况下,从几十万部电影中找出最两极分化的电影。幸运的是,之前的研究([检测收视率的两极分化](https://www.researchgate.net/publication/322255985_Detecting_Polarization_in_Ratings_An_Automated_Pipeline_and_a_Preliminary_Quantification_on_Several_Benchmark_Data_Sets#pf9))已经解决了这个问题。*不幸的是*,研究人员通过特征化电影评级分布来解决这一问题,让“多名专家[手动]将每个项目分为极化或非极化类别”,然后在这个带标签的数据集上训练随机森林,最终计算每个分布的极化分数。因为我在 IMDB 的 API 上花费的 40 美元让我超出了预算 40 美元,所以我需要一种不同的方法。

经过一番头脑风暴,我想出了 3 个可能的指标来检测一个极化的 U 型分布:

> **标准差**:方差的平方根,即均值的方差的平均值。

下面我定义了三个函数,它们将获取汇总的评级信息,将其转换为数据分布,并计算该分布的汇总指标。将这些新特征添加到数据集中后,我检查了每个指标的极端最高值和最低值,以找出哪一个最能捕捉分布中的两极分化。*注意:感谢 GitHub 用户 Olivia Guest 已经编写了一个从 numpy 数组计算基尼系数的函数。*

创建指标的辅助函数

顺便提一下,与 for 循环相比,将这些函数作为 DataFrame.apply()方法的输入确实有助于加快在这种规模下显示数据的速度。当所有这些功能完成后,我绘制了至少有 5000 张选票的电影(以减少噪音),以及每个候选指标的最高或最低值:

**最极化的电影**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4d23691172c95ee7c8d81d1117782488.png)

作者图片

**最不两极分化的电影**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/63cbe1bfb820db86f6d3cfabed15d8a0.png)

作者图片

查看每个指标的定义以及每个指标中最极化和最不极化电影的两个图表,我选择使用峰度作为评论中极性的主要衡量标准。对我来说,它似乎在挑选两极分化的电影方面做得最好,喜欢或讨厌这些电影的人几乎各占一半,另一方面,它似乎发现有一致共识的电影比标准差或基尼不平等要好一点。

# 电影

在我看来,要让一部电影具有分裂性,必须有相当多的人不同意它,但 IMDB 上的绝大多数电影只有很少的评级(一部电影的评级中位数是 85)。为了找到有史以来最两极化的电影,我限制了 IMDB 上投票最多的前 5%的电影。如下图所示,这将我们限制在超过 8,049 票的电影。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/11e423b9dd3e82a997a12503713aed70.png)

作者图片

随着峰度作为我的极化指标和投票阈值的最终确定,我现在可以宣布有史以来最极化的电影是… [**库马利·塞伯 2**](https://www.imdb.com/title/tt8402090/) !总共 10,736 张选票中的 10,326 张(超过 96%!)无论是 10 分还是 1 分,这部电影的观众都有着难以置信的分化。这部电影讲述的是库马利处理他祖父所在社区的养老院可能被拆除的异常情况,受到了批评,比如“这是我看过的最糟糕的电影”。我甚至不能完成它、*这部电影是在浪费时间。看空烟囱更有益,*”但显然不是每个人都有这种感觉。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/be87621d370b1969926df5d2133d98f1.png)

作者图片

以峰度衡量,第二部最两极分化的电影是 [*国家之死:我们能第二次拯救美国吗?*](https://www.imdb.com/title/tt8564902/?ref_=nv_sr_srsg_0) 。这部电影比较了唐纳德·特朗普和亚伯拉罕·林肯担任总统期间的政治气候。显然,它还将民主党与纳粹党相提并论,这就很容易理解为什么这部电影如此两极分化。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4a97532e200b076ab0f0ad8a5b45158b.png)

作者图片

以一种更轻松的方式结束,我给 [*一个方向:这是我们*](https://www.imdb.com/title/tt2515086/?ref_=nv_sr_srsg_0) 在这些有争议的电影奖项中获得荣誉奖。一个 10 星评论家评论说“*显然是 10/10,爱 1d 和想念他们很多。此外,哈利可以得到我的心,zayn 的声音是另一回事*”而一位一星投票者回应道“*没有任何语言可以解释这部电影有多糟糕*。绝对难以置信。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/50ed940562f1266703c5a0810322e953.png)

作者图片

感谢您的阅读!要获得所有中型文章的完整访问权限,请点击[此处](https://eonofrey.medium.com/membership)!

# 数据建模 101:它是什么?

> 原文:<https://towardsdatascience.com/data-modeling-101-what-is-it-e9c688f0680b?source=collection_archive---------10----------------------->

## 什么是数据建模,如何使用,如何实践?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9ee10d34aec537faf5a52cc8a4455ca5.png)

托拜厄斯·菲舍尔在 [Unsplash](https://unsplash.com/s/photos/database?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的照片

不久前,我在一家受欢迎的航运公司的数据架构部门实习。去实习的时候,我甚至不知道那意味着什么。我后来发现,数据架构的很大一部分被称为数据建模。

在那里的时候,我学会了设计数据库,映射这些数据库中的列和表之间的关系,最重要的是,在一个图表中可视化这一切。在最近的一次工作面试过程中,其中一次技术面试只关注数据建模,这让我重新审视了所有这些。

为了准备这次面试,深入挖掘四年前我在实习期间学到的一切,这是一次很好的学习经历。如果你也遇到围绕这个话题的技术面试,以下是你需要知道的。

# 什么是数据建模?

数据建模是为将来会存储在数据库中的数据创建数据模型的过程。好吧,那么什么是数据模型呢?数据模型将数据组织成表,并描述这些表之间的关系。

例如,假设我们有一个服装店,需要创建一个数据库来存储库存和客户信息。您将创建一个包含各种表的数据模型,比如采购、客户信息、项目详细信息和库存信息。

我们将所有这些数据组织到表中并定义它们之间的关系的原因与访问数据的方式有关。将信息拆分到不同的表中,使得系统在检索这些数据时更加高效。

# 数据模型的类型

有三种不同类型的数据模型,每一种都具有一定的复杂性。

1.  概念数据模型

这是三个中最不专业的。它提供了您需要的不同表(也称为实体)以及该表中潜在的列(属性)的高级概述。

2.逻辑数据模型

这是一个更复杂的技术问题。该模型将包括实体之间的关系以及属性和实体的数据类型。

3.物理数据模型

这是在生成数据库本身之前创建的最后一个数据模型。这突出显示了数据库的实际模式,并包括前面的数据模型中提到的所有信息。

# 关系的类型

我前面提到过,数据模型可视化了实体之间的关系。数据模型中可以使用四种不同的关系。

1.  一对一

这意味着对于另一个实体的每个实例,只能存在一个实体。以我的经验来看,这种关系相当罕见。

2.一对多和多对一

这意味着一个实体可以有另一个实体的许多实例。例如,一个雇主可以有许多全职员工,但每个员工只能有一个全职雇主。

3.多对多

这意味着一个实体的许多实例可以有另一个实体的许多实例。例如,许多航空公司可以有许多客户,许多客户可以有他们坐过的许多航空公司。

# 主键和外键

在实体之间创建任何类型的关系时,您总是会有一个主键和外键。实体的主键是实体的唯一标识符。这通常是某种身份证号码。一个实体中的外键是另一个实体中的主键。

换句话说,只要另一个实体中有一个属性是另一个实体中的主键,就应该将其标记为外键。下面有一个例子可以帮助理解这个概念。

# 创建数据模型

创建数据模型时,理解数据是关键。跟踪哪个领域很重要?这个数据库的目的是什么?回答这些问题将使建模过程变得更加容易。

1.  你的实体是什么?

让我们回头看看我们的服装店例子。我们首先要确定我们的实体或表是什么。想想不同的更广泛的数据类别。我们需要一个购买实体来跟踪哪些客户购买了哪些商品。我们希望为客户提供一个实体,存储他们所有的个人信息,如姓名、地址和电话号码。我们还希望有一个实体来跟踪每件商品的信息,如唯一的 id,颜色,尺寸和服装类型。最后,我们希望有一个库存实体,这样我们就知道每件商品还剩多少。

2.这些实体中需要什么属性?

现在我们已经创建了实体,我们需要弄清楚在这些特定的实体中需要哪些属性。让我们先来看看购买。以下是我想到的与购买相关的信息:

*   唯一的采购 ID
*   购买日期
*   购买时间
*   采购人员的客户 ID
*   正在购买的项目的项目 ID
*   购买总成本

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/458b1cee1d3875b861f480205f93e72b.png)

作者图片

考虑哪个实体对每个属性最有意义是很重要的。考虑这些实体之间的关系也很重要。我们需要在这个购买表中包含 customerId 和 itemId,以访问客户和项目实体。这些将作为这个表中的外键和其他表中的主键。

此外,您还可以在此步骤中包括这些字段的数据类型。然而,这在面试中通常是不必要的。其他概念更需要证明。

现在测试一下你自己,看看你是否能填写我提到的其他实体的属性。不准偷看!

当你完成后,将你的结果与我下面的结果进行比较。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d0180dead9686ec47cb366ac42bc1940.png)

作者图片

3.所有这些实体是如何联系起来的?

现在,我们需要确保拥有将不同实体连接在一起所需的所有主键和外键。为了在一个查询中提取所有需要的数据,这是非常重要的。如果这些表不能正确地相互连接,您的数据库将不会有效或正确地构建。

让我们回顾一下主键和外键之间的区别。主键是实体的唯一标识符。客户 ID 充当客户实体的主键,项目 ID 充当项目实体的主键,采购 ID 充当采购实体的主键。

外键是在另一个实体中充当主键的字段,但不是您当前正在查看的实体。例如,customer ID 和 item ID 都充当 purchases 实体中的外键,因为它们是其他表的唯一标识符(主键),而不是 purchases 实体本身的唯一标识符。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e7e383b821d80968bf76fb6ba3056776.png)

作者图片

4.这些实体之间的关系类型是什么?

现在让我们重温一下我们之前讨论过的关系类型。我们需要弄清楚哪一个将适用于这些实体。

一次采购可以有很多客户吗?不,但是一个顾客可以有许多购买。客户和购买之间是一对多的关系。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4fcd69b1761db6a4a8d7b3f11f1b43f1.png)

作者图片

测试您的技能,并尝试将正确的关系添加到其余的实体中。完成后,向下滚动,将你的答案与我的答案进行比较。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f7c0b833644af941ad4a919c0e75d4de.png)

作者图片

Item 与 purchases 有多对一的关系,因为一个采购可以有多个 item,但是一个 item 只能有一个 purchase。

库存与项目有一对多的关系,因为一个唯一的 itemId 只能有库存信息,但多个项目可以有相同的库存信息。

通过思考不同的日常场景,您可以继续练习这些数据建模问题。电影院如何创建数据库?杂货店怎么样?想一想您每天接触到的必须有数据模型的业务。通常这类问题没有正确或错误的答案,只要确保你理解了概念,并能解释为什么你创建了某个实体。

祝你好运!请务必查看我的其他一些文章,为技术面试做准备,如[应对每个 SQL 面试问题的顶级技巧](/top-skills-to-ace-every-sql-interview-question-33356b08845a)和[如何使用 SQL 超前和滞后函数](/how-to-use-sql-lead-and-lag-functions-35c0db633c5e)。

# 中端市场公司的数据监控和可观察性基准

> 原文:<https://towardsdatascience.com/data-monitoring-and-observability-benchmark-for-mid-market-companies-154155f41dcb?source=collection_archive---------24----------------------->

## 现代数据堆栈的五大观察工具

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b62de8690b2fa7c3fdaf76dd3567d77e.png)

图片来自 [Castor](https://www.castordoc.com/blog/data-monitoring-and-observability) 的网站

现代组织比以往任何时候都更多地生产、收集和处理数据。一项针对数据专业人士的 [IDG](https://www.matillion.com/resources/blog/matillion-and-idg-survey-data-growth-is-real-and-3-other-key-findings) 调查显示,数据量正以平均每月 63%的速度增长。随着业务中数据的激增,我们用来移动这些数据的技术变得更加错综复杂,以至于我们完全看不到数据是如何处理的。结果,随着数据的移动,错误越来越多,我们最终得到的是无用的数据。谢天谢地,**可观察性**工具在过去几年里蓬勃发展,帮助公司重新获得对数据处理的控制权。今天,我们试图理解数据可观测性的概念,并理清可观测性工具的活跃生态系统。

‍The 的可观测性概念起源于控制理论,由鲁道夫·卡尔曼首创于线性动态系统。我们把它定义为一个系统的健康程度可以从它的输出中推断出来的度量。

数据可观察性是数据管道发展的结果。数据管道指的是负责将数据从一个系统转移到另一个系统的任何一组处理材料。它们是数据分析和数据科学活动的支柱,因为它们生成数据科学家和数据分析师使用的数据资产。直到 15-20 年前,数据管道还是相当基础的,为业务分析的稳定需求服务。商业智能团队需要对他们的财务状况、库存水平、销售渠道和其他运营指标进行历史测量。没什么大不了的。数据工程师使用 ETL(提取、加载、转换)工具来转换特定用例的数据,并将其加载到数据仓库中。由此,数据分析师使用 BI 软件创建了仪表板和报告,生活变得很美好。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/68f37272f704f8303f15c9df283cdff0.png)

传统数据管道—图片由 Louise de Leyritz 提供

‍In:近年来,我们见证了对数据需求的飞速增长。从数据分析师到业务用户,数据无处不在,每个人都在使用它。

为了确保数据用户完美地理解数据仓库中存在的所有数据,我们建议使用数据目录,如 [Castor](https://www.castordoc.com) 或 [Collibra](https://www.collibra.com) (取决于您的规模)。你可以在这里找到所有数据目录工具的[基准](https://www.castordoc.com/blog/data-catalog-benchmark-for-mid-market-companies)。

数据管道现在使用复杂工具(Spark、Kubernetes、Airflow)的组合运行,随着互联部件数量的增加,管道故障的风险也在增加。工具的多样性是必要的,因为它允许数据团队在其数据堆栈的每一层选择最佳平台。但是所有这些引擎的组合使得实际上不可能看到管道的不同部分。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d63523b9975ef22a97d23d09d3d6d0c7.png)

现代数据管道 Louise de Leyritz 图片

现代数据管道不仅复杂,而且还具有黑盒特性。你知道进去的是什么,出来的是什么,但你不知道中间发生了什么。只要出现想要的结果就好。但如果没有,那就非常令人沮丧。当数据集从管道中出来时,通常会留下奇怪的值、缺失的列、本应是数字的字段中的字母等等。结果,数据工程师花了几个小时绞尽脑汁想到底哪里出了问题,哪里出了问题,如何解决。Forrester 估计,数据团队将超过 40%的时间花在数据质量问题上,而不是致力于为企业创造价值的活动。所有这些都面临着巨大的压力,因为在客户演示中使用这种低质量数据的数据分析师正在被他的经理痛打一顿。这是最重要的部分。收集、处理和分析数据的全部目的是为了创造商业价值。如果没有对管道的可见性,错误就会累积,数据会恶化,业务价值也会被破坏。这就是数据可观测性技术的用武之地。它告诉你坐下来放松,因为它将揭示每个管道故障的根本原因。不再流泪,不再抓头,不再挨打。但实际上,它是如何工作的呢?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/eadd7920843aaffc941bfbba46e75a2c.png)

可观察性与监控——广告中的标识

数据监控经常与数据可观察性混淆在一起。这两个术语是共生的,这解释了它们之间界限的模糊性。数据监控是实现数据可观测性的第一步,也是可观测性的一个子集。比方说,你正在观察一个数据管道系统。监控的基本目的是使用一组预定义的系统指标和日志来了解您系统的状态,利用这些指标和日志来**获取有关事件的警报**。它要么告诉你“系统是健康的”,要么告诉你“有问题”。因此,监控应用程序允许您检测****已知的一组故障模式。它不能解决黑匣子的问题。**通过监控,您可以:**

*   **跟踪错误并在错误发生时立即得到通知**
*   **跟踪关于给定微服务消耗的资源数量的度量。**
*   **当您的系统遇到中断或故障时获得警报。**

**数据监控会标记您的数据问题,这很好。不利的一面是,识别问题只是旅程的开始,在了解管道中断的根本原因时,监控并不顺利。**

**数据可观察性带来了一种更主动的方法,通过提供系统操作的更深入的视图。它使用监控产生的数据和见解来全面了解您的系统、其健康状况和性能。**

**比方说,你拥有一家杂货店。每天早上,食品杂货都陈列在货架上,供顾客挑选。简单。监控的作用是提醒你产品可能出现的任何问题:当货架上有丢失的商品时,当产品洒得到处都是时等等。可观察性更进了一步,让你清楚地看到货架上货物堆积背后的供应链。如果你很容易理解为什么货架上的一件商品不见了,如果你能看到后面的房间里发生了什么,或者员工是如何把商品放在手推车上的,那么你的杂货店就是“可观察的”。**

**在数据领域,可观察性揭示了数据管道中发生的工作流,使您能够轻松地从结果导航到原因。借助可观察性,您可以:**

*   **了解请求所经历的服务,并**定位性能瓶颈****
*   **了解**请求失败的原因****
*   **观察特定的**微服务如何处理请求****
*   **识别错误或瓶颈发生时的**模式**,并利用洞察采取行动,以防止将来出现此类情况**

****监控是可观测性**的子集,你只能监控一个可观测的系统。监控告诉你“你的管道出故障了。”而可观察性告诉您“您有一个管道中断,因为一个 spark 作业由于一个无效行而失败”**

# **有哪些可观察性工具?**

**有三代可观察性工具:**

****第 1 代:**传统的 APM(应用管理性能)工具。这些工具是为软件工程师和开发人员创建的,但却是用于数据可观察性的第一批工具。**

****第二代:**数据可观测性工具。这些工具允许您深入数据问题的根源,并了解问题的根本原因。**

****第三代:**自动化数据观察。这些智能工具可以预测并自动修复问题,以免影响性能。**

**如果您正在寻找数据可观察性解决方案,我们在这里列出了所有工具及其产品[。](https://notion.castordoc.com/catalog-of-data-quality)**

# **可观察性 1.0:用于 DevOps 的 APM 工具**

**可观察性并不新鲜。在 DevOps 世界中,这是一个非常成熟的概念。现代组织从整体架构向微服务架构的转变导致了开发运维团队的兴起,这些团队消除了传统的开发和运营团队之间的障碍。DevOps 团队持续关注其系统的健康状况,确保应用程序和基础架构正常运行。**可观测性**的概念源于这一发展。**

**DevOps 团队使用应用管理性能(APM)工具来监控他们的系统和基础架构。APM 旨在检测和诊断复杂的应用程序性能问题,以保持服务水平。这些工具集合了三个监控组件来发现和解决系统故障:**度量、日志和跟踪。**这些通常被称为“可观察性的三大支柱”**

**‍**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/385823ec6a90653614538c709912a0cb.png)**

**软件监控的支柱—图片由 Louise de Leyritz 提供**

****指标:**指标是在给定时间间隔内测量的数值。它包括特定的属性,如时间、名称、KPI 和值。度量可以使用数学建模和预测来获得系统在一段时间内的行为知识。**

****日志:**日志是在特定时间发生的事件的文本记录。在日志中,您可以找到事件的注释、事件发生的时间以及事件的一些背景。**

****跟踪:**跟踪表示请求通过分布式系统的端到端旅程。即在不同微服务中执行的每个操作的记录。跟踪是日志的表示,单个跟踪可以提供对请求所经过的路径及其结构的可见性。**

**将这三个监控组件集成到一个解决方案中,使开发人员能够了解他们的系统。这些系统被称为**可观测的,**因为可以根据监测输出来推断它们的健康状况。**

**随着数据激增,需要有可观察的管道,数据工程团队使用如上所述的标准 APM 工具,试图获得对其数据堆栈的可观察性。**

**然而,APM 工具是专门为软件工程师和开发人员构建的,而不是为了监控数据管道。尽管一些公司将它们用作数据观察工具,但它们并不总是奏效。原因是,技术系统和数据管道天生不同。例如,对于数据管道,在进程成功运行之前遇到许多故障是完全正常的。APM 工具不能理解这一点,也不能理解数据管道逻辑的其他细微差别。使用 APM 工具来获得管道可见性的数据团队通常以错误的警报结束,这带来了不必要的混乱。**

# **可观察性 2.0:数据管道可观察性**

**为了获得数据管道上的可观察性,除了上述标准集之外,还需要监控一组额外的维度。APM 工具并不是为了数据的可观察性而设计的,它们已经逐渐被更好的工具所取代,用来监控与数据管道健康相关的组件。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/902edf52c51b96fbe865237fa365c9ea.png)**

**数据可观察性的支柱 Louise de Leyritz 的图像**

****数据质量:**数据质量有问题吗?您的数据集是否具有您期望的容量,或者是否有丢失的数据?你的数据分布正确吗?**

****时间表:**管道是否按计划运行?您的数据是最新的,还是更新计划中有故障?**

****依赖关系:**上游的数据问题将如何向下游传播?管道的不同部分是如何关联的?**

**这是接近数据可观察性支柱的一种方式。巴尔·摩西提出了另一个方案,她在其中概述了数据可观察性的五大支柱。可观测性数据“支柱”的数量并不那么重要。其思想是:您可以通过监视一定数量的组件来获得对堆栈的可观察性,这些组件将告诉您数据管道的健康状况。不同的可观测性解决方案将根据它们想要实现的可观测性的种类来监控管道的不同组件。这就是为什么选择适合您需求的解决方案非常重要。**

# **可观察性 3.0:自动化数据可观察性**

**第三代可观测性工具拥有广泛的自动化特性。这意味着这些工具根据提供给它们的数据集调整它们的监控方法,自动决定在哪里设置警报阈值。通过这种方式,您可以拥有可观察的管道,而不必经历为每个数据资产定义警报阈值的烦人任务。**

**使用机器学习模型,现代数据可观察性平台,如 [Bigeye](https://www.bigeye.com) 分析数据趋势,并自动推荐数据质量指标,以开始跟踪特定资产。您不必花时间定义对您的业务至关重要的所有指标和日志,因为这是自动实现的。更重要的是,现代工具可以预测数据质量指标,并根据预测自动调整警报阈值。这节省了时间,因为数据团队不必手动调整阈值。它还确保团队总是收到相关的警报。**

**一些解决方案,如 [databand.ai](http://databand.ai) 提出了自动化功能,如动态管道运行,旨在改善数据管道的性能。该功能使数据团队能够根据不断变化的数据输入、参数或模型分数运行不同版本的管道。**

# **您的组织使用哪种可观察性工具?**

**下面,你会发现一个可观察性工具的图景,它可以帮助你选择一个适合你公司需要的可观察性工具。我们从两个方面对解决方案进行了分类:**

*   **它们是否允许实时数据监控**
*   **他们是使用**管道测试**框架还是**异常检测**框架来调查数据的健康状况。**

****实时数据监控**指的是解决方案是否能够识别数据管道中发生的问题,从而有可能在加载坏数据之前停止管道。**

# **流水线测试与异常检测框架**

**并非所有的数据可观测性解决方案都是相同的。我们特别根据解决方案是使用管道测试还是异常检测框架来区分它们。**

**一个**流水线测试框架**允许数据工程师测试二进制语句。例如,列中的所有值是否都是唯一的,或者模式是否与某个表达式匹配。当测试失败时,数据被标记为“坏的”。有了这些信息,数据工程团队可以诊断质量差的数据,并采取必要的措施来解决问题。测试在管道中的不同步骤重复进行,这使得数据工程师可以很容易地看到数据在管道的哪个阶段/层损坏,并找到最合适的人来解决问题。**

**在**异常检测**框架中,该解决方案扫描数据资产,从这些数据中收集统计数据,并关注这些统计数据的行为变化。设置警报阈值(自动、手动或两者兼有),当统计行为显示数据有问题时,解决方案会向您选择的平台发送警报。有了这个框架,解决方案通常使用数据沿袭找到数据问题的根本原因,允许他们追溯数据经历的所有事件。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/13ea8f7498ad8cd7e5053e7ec8c125fd.png)**

**可用解决方案的基准—图片由 Louise de Leyritz 提供**

**要获得完整的数据可观察性工具基准测试和更多分类标准,请单击此处的。**

**订阅[我的简讯](https://louisedeleyritz.substack.com/)获取更多文章!**

# **更现代的数据堆栈基准?**

**点击查看更多关于现代数据堆栈[的性能指标评测和分析。我们写了利用数据资产时涉及的所有过程:从现代数据堆栈,到数据团队的组成,再到数据治理。我们的博客涵盖了从数据中创造有形价值的技术和非技术方面。](https://notion.castordoc.com)**

**在 Castor,我们正在开发一个数据文档工具 Figma,Slack generation。或者对 Fivetran,Looker,Snowflake,DBT 的狂热爱好者来说是数据方面的。我们将我们的目录设计得易于使用、令人愉快且友好。**

**想去看看吗?[联系我们](https://meetings.hubspot.com/xavier76),我们将向您展示一个演示。**

***原载于*[*https://www.castordoc.com*](https://www.castordoc.com/blog/data-monitoring-and-observability)*。***

# 机器学习中的数据噪声和标签噪声

> 原文:<https://towardsdatascience.com/data-noise-and-label-noise-in-machine-learning-98c8a3c8322e?source=collection_archive---------21----------------------->

## [思想和理论](https://towardsdatascience.com/tagged/thoughts-and-theory)

## 在现实世界中应用机器学习需要考虑机器学习中的噪声,下面是为什么以及如何处理它。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b3fd57cef03b57333e9dabeb4311f056.png)

1-自身图像:不对称标签噪声

# 动机

机器学习中为什么要关心数据噪声和标签噪声?
巨大的成就将机器学习带到了各种应用中。这将激励和加速研究和应用,因为我们现在可以致力于回答真正重要的问题——医学、心理学、犯罪学。然而,这些现实世界的应用往往比学术问题更嘈杂。以医学为例,观察者之间和观察者内部的高度可变性(医学样本中一个或多个医生的不同诊断)是一个众所周知的问题[1],尽管学术数据集也存在噪声[2]。另一方面,更大网络的趋势导致记忆而不是归纳的问题[3],这也包括记忆噪音。

这篇文章应该激励其他研究人员将数据和/或标签噪声纳入他们的考虑。它们很容易在现代框架(如 PyTorch)中实现,提高了可靠性和逼真的场景,如下所示。我的 github 知识库[4]为 PyTorch 中嘈杂的机器学习实验提供了一个简单的基础。

1.  数据和标签噪声介绍
2.  数据和标签噪声分布的描述
3.  防御数据和标签噪声
4.  未来的研究

# 数据和标签噪声介绍

数据和标签噪声是与真实数据集的假设偏差。因此,数据噪声反映了数据中的偏差,即图像和标签噪声反映了标签中的偏差。

## 对称标签噪声

随机选择的标签 I 的α%被改变为标签 j!= i(包括 I 在内的所有标签的改变也是可能的),遵循用于选择新标签的均匀分布(参见图 2)。这种类型的标签噪声反映了标签中的普遍不安全性,并且在α较小的情况下相对容易克服[5]。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ab0742bd7551a4904f40770e1e0eacb8.png)

2-自有图像:对称标签噪点

## 不对称标签噪声所有标签

所有标签 I 中随机选择的α%被切换到标签 i + 1,或者对于最大值 I 被切换到 0(见图 3)。这与现实世界中标签被随机破坏的情况一致,因为数据集中标签的顺序也是随机的[6]。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b3fd57cef03b57333e9dabeb4311f056.png)

3-自身图像:不对称标签噪声

## 不对称标签噪声单标签

随机选择的标签 0 的α%被切换到标签 4,而所有其他标签保持不变(参见图 4)。这是在两张复杂图像被混淆的情况下发生的。从技术上讲,这些图像位于决策边界附近。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/38c28b69cea877dbb61fbc153b2980a0.png)

4-自有图像:不对称标签噪声,单开关

## 语义标签噪声

特别是模糊的图像被扰乱到那一类,弱模型预测它是。为此,一组训练样本 d 被分成小组 X ⊂ D 和大组 Y ⊂ D。弱模型在 x 上被训练并在 y 上被测试。y 中每个图像的损失被排序,使得具有最高损失的那些图像的α%被选择(最困难的样本)。它们的标签被切换到来自弱分类器的预测标签。包括扰动标签的集合 Y’被添加到 X,从而在 D' [7,8]上训练模型。这种类型的标签噪声对于模型来说特别难以克服。它也接近于现实世界的应用,如医学成像,其中具有挑战性的案例会导致标签的模糊性[9]。

## 高斯数据噪声

将正态分布添加到测试图像中。相对于图像信噪比来计算其标准偏差和结果幅度。因此,对于每个图像,高斯噪声以相同的相对幅度被添加。这种噪声在现实应用中很明显,例如由于相机故障。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c0b3e4ac6fcc98c29fae40b34dbf037a.png)

自有公式(1):高斯数据噪声。SNR:信噪比

## 盐和胡椒数据噪声

随机选择的α 2 %的像素被切换到 0,α/2 %被切换到 1。这种噪声可能是由相机中的故障像素引起的,并且在图像处理中得到充分研究[10]。

## 斑点数据噪声

在雷达图像中常见的 eg,这是一种乘性噪声,其中将图像的α x N(μ,σ2)倍加到图像上,其中 N 是正态分布。

## 泊松数据噪声

等同于高斯数据噪声,可以添加泊松分布而不是正态(高斯)分布。据我所知,这种方法应用较少。

# 防御标签噪声和数据噪声

知道了数据集中的噪声类型,仍然需要变得可靠以抵抗噪声。在文献中,噪声标签和噪声数据被广泛考虑。简要描述了一些防御策略,尤其是针对噪声标签的防御策略。还有更多的技术需要发现和开发。

## 不确定性估计

这本身并不是真正的防御,但是不确定性估计在数据样本中产生了有价值的见解。任意的、认知的和标签噪声可以检测某些类型的数据和标签噪声[11,12]。反映预测的确定性是自治系统的重要资产,尤其是在嘈杂的真实世界场景中。置信度也经常被使用,尽管它需要校准良好的模型。

## 稳健损失函数

一个研究分支的目标是损失函数不会过度拟合噪声样本。广泛使用的交叉熵损失由于将负类归零而倾向于过度自信。MAE 是一个简单且相当稳健的损失函数,尽管相对较慢[13]。

## 强健的训练

一种方法是在训练策略中更多地考虑鲁棒性和泛化能力。特别是在非常嘈杂的环境中,早期停止已经被证明是一种有效的策略,不会记住噪音[14]

# 未来的研究

以下是一些关于研究空白的想法。总的来说,我希望这篇文章激发了噪声在更广泛环境中的使用。

## 进一步的噪声分布及其对模型的影响

研究进一步的噪声分布是非常有趣的。我之前研究的另一个例子是敌对噪音。类似于一个对立的例子,类损失最大化扰动被添加,有或没有跨越决策边界,从而切换标签。因此,当分类非常接近决策边界时,数据(例如图像)看起来仍然相同。类似于语义噪声,我认为它对模型来说是困难的,尽管通过认知的不确定性很容易检测到。

## 噪声的应用和影响

由于实际应用中存在数据和标签噪声,因此也应该在存在噪声的情况下研究旨在解决这些应用的方法。在研究实际应用时,我鼓励将此类噪声特性包括在内。

## 机器学习中的可靠性

随着机器学习被引入越来越多的领域,包括非常敏感的领域,可信度是一项重要的资产。最近的作品展示了模特是如何造成伤害和侮辱的。记忆噪音可以增加这种效果。由于这是我自己目前的研究领域,我只能鼓励读者研究机器学习模型的可靠性和可信度。

# 文献学

[1]j . g .埃尔莫尔、C.K .韦尔斯、C.H .李、D.H .霍华德和 A.R .费恩斯坦,1994 年。放射科医生对乳房 x 光片解释的可变性。新英格兰医学杂志,331(22),第 1493-1499 页。

[2]:诺斯卡特,C.G .,江,l .和庄,I.L .,2019。自信学习:估计数据集标签的不确定性。arXiv 预印本 arXiv:1911.00068。

[3]:张,c .,本吉奥,s .,哈特,m .,雷希特,b .和维尼亚尔斯,o .,2016。理解深度学习需要重新思考泛化。 *arXiv 预印本 arXiv:1611.03530* 。

【4】:【https://github.com/richtertill/noisy_machine_learning 

[5]: B. van Rooyen,A. K. Menon 和 R. C. Williamson,“用对称标签噪声学习:精神错乱的重要性”,CoRR,第 abs/1505.07634 卷,2015 年

[6]: G. Blanchard,M. Flaska,G. Handy,S. Pozzi 和 C. Scott,“非对称标签噪声分类:一致性和最大去噪”,2016 年

[7]: K. Lee,S. Yun,K. Lee,H. Lee,B. Li 和 J. Shin,“通过生成分类器处理噪声标签的鲁棒推理”,2019

[8]: J. Lee 和 S.-Y. Chung,“全体一致的强健训练”,2020 年。

[9]:欧文、拉杰普尔卡尔、M. Ko、Y. Yu、S. Ciurea-Ilcus、C. Chute、H. Marklund、B. Haghgoo、R. Ball、K. Shpanskaya、J. Seekins、D. A. Mong、S. S. Halabi、J. K. Sandberg、R. Jones、D. B. Larson、C. P. Langlotz、B. N. Patel、M. P. Lungren 和 A. Y. Ng

[10]: R. Pandey,“斑点噪声:建模与实现”,第 9 卷,第 8717–8727 页,2016 年 01 月。

[11]: Tomczack,a .,Navab,n .和 Albarqouni,s .,2019 年。学会评估标签的不确定性以保证质量。arXiv 预印本 arXiv:1909.08058。

[12]:肯德尔,a .,和 Y. Gal。"在计算机视觉的贝叶斯深度学习中,我们需要哪些不确定性?"神经信息处理系统进展,第 30 卷。2017.

[13]:张,z .和萨本库,M.R .,2018。训练带噪声标签的深度神经网络的广义交叉熵损失。arXiv 预印本 arXiv:1805.07836。

[14]: Song,h .,Kim,m .,Park,d .和 Lee,J.G .,2019。早期停止如何有助于抵抗标签噪声的泛化?。 *arXiv 预印本 arXiv:1911.08059* 。

# 使用 Python scikit 进行数据规范化-学习

> 原文:<https://towardsdatascience.com/data-normalization-with-python-scikit-learn-e9c5640fed58?source=collection_archive---------24----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/706a5682ed020f4675d093944d1ae999.png)

图片由[洛伦佐·卡法罗](https://pixabay.com/users/3844328-3844328/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=1863880)提供,来自 [Pixabay](https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=1863880)

在关于数据预处理的系列文章之后,在本教程中,我将讨论 Python `scikit-learn`中的数据规范化。正如在我之前的教程中已经说过的,数据标准化包括将不同尺度上测量的值调整到一个共同的尺度上。

规范化仅适用于包含数值的列。有五种标准化方法:

*   单一特征缩放
*   最小最大
*   z 分数
*   对数标度
*   剪报

在本教程中,我使用`scikit-learn`库来执行规范化,而在[我之前的教程](/data-preprocessing-with-python-pandas-part-3-normalisation-5b5392d27673)中,我使用`pandas`库来处理数据规范化。我使用了我之前教程中使用的相同数据集,因此可以比较结果。事实上,我们使用这两种方法获得了相同的结果。

无论如何,在本教程中我不处理日志缩放和剪辑,这将是未来教程的对象。

`scikit-learn`库也可以用来处理缺失值,正如我在[上一篇文章](/data-preprocessing-with-scikit-learn-missing-values-8dff2c266db)中所解释的。

本教程中描述的所有`scikit-learn`操作都遵循以下步骤:

*   选择预处理方法
*   通过`fit()`功能进行安装
*   通过`transform()`功能将其应用于数据。

`scikit-learn`库只对数组起作用,因此当执行每个操作时,dataframe 列必须被转换成数组。这可以通过`numpy.array()`函数来实现,该函数接收 dataframe 列作为输入。`fit()`函数接收数组的数组作为输入,每个数组代表数据集的一个样本。因此,`reshape()`函数可以用来将标准数组转换成数组的数组。

本教程描述的所有代码都可以从[我的 Github 库](https://github.com/alod83/data-science/blob/master/Preprocessing/Normalization/Data%20Preprocessing%20-%20Normalization%20with%20scikit-learn.ipynb)下载。

# 数据导入

作为数据集的一个例子,在本教程中,我们考虑由意大利 Protezione Civile 提供的数据集,该数据集与自新冠肺炎疫情开始以来登记的新冠肺炎病例数相关。数据集每天更新,可从[此链接](https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-regioni/dpc-covid19-ita-regioni.csv)下载。

首先我们需要导入 Python `pandas`库,通过`read_csv()`函数读取数据集。然后我们可以删除所有带有`NaN`值的列。这是通过`dropna()`功能完成的。

```
**import** pandas **as** pd
df **=** pd.read_csv('https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-regioni/dpc-covid19-ita-regioni.csv')
df.dropna(axis**=**1,inplace**=True**)
df.head(10)
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/585daffc07e9abade533aa31bf4ae30f.png)

作者图片

# 单一特征缩放

单一特征缩放将列中的每个值转换为 0 到 1 之间的数字。新值的计算方法是当前值除以列的最大值。这可以通过`MaxAbsScaler`类来完成。我们将缩放器应用于`tamponi`列,它必须转换为数组并进行整形。

```
**import** numpy **as** np
**from** sklearn.preprocessing **import** MaxAbsScaler
X **=** np.array(df['tamponi']).reshape(**-**1,1)
scaler **=** MaxAbsScaler()
```

现在,我们可以安装缩放器,然后应用变换。我们通过应用逆`reshape()`函数将其转换为原始形状,并将结果存储到 dataframe `df`的新列中。

```
scaler.fit(X)
X_scaled **=** scaler.transform(X)
df['single feature scaling'] **=** X_scaled.reshape(1,**-**1)[0]
```

`scikit-learn`库还提供了一个函数来恢复原始值,给定转换。这个函数也适用于本文后面描述的转换。

```
scaler.inverse_transform(X_scaled)
```

它给出了以下输出:

```
array([[5.000000e+00],
       [0.000000e+00],
       [1.000000e+00],
       ...,
       [5.507300e+05],
       [6.654400e+04],
       [3.643743e+06]])
```

# 最小最大

与单个要素缩放类似,最小最大值将列中的每个值转换为 0 到 1 之间的数字。新值计算为当前值和最小值之差除以列值的范围。在`scikit-learn`中,我们使用了`MinMaxScaler`类。例如,我们可以对列`totale_casi`应用 min max 方法。

```
**from** sklearn.preprocessing **import** MinMaxScaler
X **=** np.array(df['totale_casi']).reshape(**-**1,1)
scaler **=** MinMaxScaler()
scaler.fit(X)
X_scaled **=** scaler.transform(X)
df['min max'] **=** X_scaled.reshape(1,**-**1)[0]
```

# z 分数

Z-Score 将列中的每个值转换为 0 左右的数字。通过 z 得分变换获得的典型值范围为-3 到 3。新值计算为当前值和平均值之差除以标准偏差。在`scikit-learn`中,我们可以使用`StandardScaler`功能。例如,我们可以计算列`deceduti`的 z 值。

```
**from** sklearn.preprocessing **import** StandardScaler
X **=** np.array(df['deceduti']).reshape(**-**1,1)
scaler **=** StandardScaler()
scaler.fit(X)
X_scaled **=** scaler.transform(X)
df['z score'] **=** X_scaled.reshape(1,**-**1)[0]
```

# 摘要

在本教程中,我展示了如何使用`scikit-learn`库的`preprocessing`包来规范化数据集。我们可以通过手动应用公式来获得相同的结果,如我之前的教程[中所解释的那样。](/data-preprocessing-with-python-pandas-part-3-normalisation-5b5392d27673)

使用`scikit-learn`的主要优点如下:

*   您不需要提前知道公式,因为您有预打包的类来执行操作
*   您可以通过`inverse_transform()`功能恢复原始数据。

如果您想学习如何使用 scikit-learn 库执行数据预处理的其他方面,请继续关注…

如果你想了解我的研究和其他活动的最新情况,你可以在 [Twitter](https://twitter.com/alod83) 、 [Youtube](https://www.youtube.com/channel/UC4O8-FtQqGIsgDW_ytXIWOg?view_as=subscriber) 和 [Github](https://github.com/alod83) 上关注我。

# 专业人工智能开发的数据营养标签

> 原文:<https://towardsdatascience.com/data-nutrition-labels-for-professional-ai-development-a50d26d3d108?source=collection_archive---------27----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9eda7c0198887ab07f9a5d657bd9ef3a.png)

来源于美国美国食品药品监督管理局政府网站。

## 负责任的人工智能不仅仅是一套原则。期望是你会有证据证明他们被支持。

我们在[**LexisNexis Legal&Professional**](https://www.lexisnexis.com/en-us/home.page)的使命是让所有人都能获得法律信息。我们从超过 50,000 个公共来源收集文档和数据,管理着超过 2[Pb](https://searchstorage.techtarget.com/answer/Whats-bigger-than-a-Terabyte)的数据。因为这些文件代表了我们国家的成文法,所以我们完全按照它们的写法提供。我们小心翼翼地不采用任何要求我们改变内容的个人判断或道德标准。然而,支持对社会有积极影响的决策也是我们公司的核心使命。

> 是的,但是你们的科学家太专注于他们能不能做到,他们没有停下来想想他们是否应该。——伊恩·马尔孔博士,《侏罗纪公园》

**正如所有的技术进步都是出于好意,它们也可能被用来产生负面影响。例如,社交网络的发明源于将人们聚集在一起并创造更紧密的社会联系的积极愿望,但它现在可以用来羞辱、欺负甚至操纵社会。思考用例并试图确定长期的道德和社会影响应该是寻求开发[专业级人工智能](/is-your-ai-professional-grade-f402c6bc7213)的公司的一部分。**

**[责任人工智能](https://www.sciencedirect.com/science/article/abs/pii/S026736491930127X)是一个新兴的治理框架,专注于人工智能的道德使用和民主化。为了确保今天开发的人工智能保持道德和社会责任,许多公司开始采用一套人工智能原则。比如 [**谷歌**](https://ai.google/principles/) 和 [**微软**](https://www.microsoft.com/en-us/ai/responsible-ai) 都在自己的网站上公开发布了自己的 AI 原理。正在开发一套人工智能原则的公司将包括以下三个主题的一些变体:**

*   ****最大化积极的社会影响,同时最小化消极影响**(例如,在消除消极偏见的同时保持公平和包容性)**
*   ****透明度**(例如,解释人工智能系统如何运行和构建)**
*   ****人类责任**(例如,确保计算机和人工智能对人类负责)**

***但是仅仅说自己的公司有原则是不够的*。*专业人士的期望是,你会有证据表明他们得到了支持。***

**与当今大多数企业一样,LexisNexis 利用数据科学和人工智能为我们的客户构建智能分析和解决方案。我们的每个*智能*应用程序都依赖于从上述法律数据资产中获得的训练数据。因此,这些模型具有潜在加剧包含在训练数据中的任何负面偏差并通过模型表达它们的风险。**

**负责任的人工智能关注的一个领域是最小化负面偏见,特别是对受保护的社会阶层,如性别、种族或年龄的偏见。一种可能尝试的天真的方法是在他们的模型中不使用变量,如种族、性别或年龄。但是,如果训练数据是有偏差的,例如,偏向一种性别类型,仅仅从模型中排除变量仍然会导致有偏差的模型,因为这是训练数据中的所有信息。一个更好的方法是通过对数据进行分层或者在回归模型中包含社会阶层变量来控制这些影响。然而,使用这两种方法中的任何一种,都需要建模者对训练数据的来源和构成有一个透彻的理解。**

**不幸的是,数据科学模型开发中的大部分时间和精力都花在了模型选择和调整上,很少关注训练数据评估。更令人担忧的是,如果你查看任何应用程序的 [github](https://github.com/) 库,关于数据是如何收集和评估的训练数据和文档是不存在的。**

**在专业级人工智能开发中,我们想要改变这一点。**

**在 LexisNexis,我们认识到训练数据是模型中主要的驱动偏差。*在专业级人工智能开发中,我们要求数据科学家努力实现透明,并提供支持公司负责任的人工智能原则的实证评估。*为此,我们创建了一个轻量级解决方案,让我们的数据科学家在为面向客户的产品开发模型时使用。**

**首先,我们需要沿着关键的受保护类别对训练数据进行剖析。此外,我们列出了也可以用来近似这些类别的代理。例如,如果所有数据都来自佛罗里达州,那么它可能会偏向于比该国其他地区年龄更大的人群。下图显示了我们在分析过程中检查的几个类别和代理。在代理的情况下,很难确定它们可以代表的所有可能的类别,所以我们建议只报告它们在数据和/或原始计数中的存在。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2faf0b16cf55146093f8506241cc1999.png)**

**作者图片**

**虽然检查和分析训练数据对开发模型的数据科学家很有用,但是如果他们选择继续使用数据开发模型,那么该模型的消费者如何知道数据科学家知道什么呢?如果该模型是仅使用来自佛罗里达的数据开发的,它是否应该带有一个警告标签:**“小心!用佛罗里达数据开发的模型,如果在另一个州使用风险自担"**?**

***我们会争辩,是的!***

**嗯,不完全是这样。但我们确实认为,数据科学家不仅有责任测量,而且有责任报告他们的训练数据概况。正如我们前面提到的,大多数代码库不提供关于数据的细节。然而,他们有需求文档,列出了模型开发中使用的代码模块和版本。我们建议代码库也包含一个*训练数据清单文件*,或者我们喜欢称之为 ***数据营养标签*** 。下面是一个标准清单文件的示例,该文件存储在代码存储库的根文件夹中:**

```
**DataNutritionLabel.txt**## Source
[ Training data was queried on 2/10/2020 from 2018-2019 Case Law - CA, TX, FL ]## Protected Category Stats[ Male: Observed 70%, Expected 50%Female: Observed 30%, Expected 50%]## Proxies[ Zipcodes: Observed 7500, Expected 41,692Names: Observed]## Decision[ Include Weight Variable in model to adjust for protected cat skew]## Alternatives considered[ Any alternatives that were considered during the decision making process ]
```

**作为一名寻求开发负责任的人工智能的专业级数据科学家,不仅仅需要找到完美的数据和完美的模型。它要求人们思考和理解使用模型及其应用可能产生的社会和伦理影响。它涉及对训练数据的彻底评估和评价。它还可能需要涉及额外的主题专家和产品经理,以帮助考虑可能的应用程序和用例。最后,这意味着数据科学家对透明度负责;用于记录和共享该信息,以告知模型的未来开发人员和用户他们所使用的训练数据中的偏差。正如营养标签出现在你购买的每一种食品上,使你能够做出消费决定一样, ***我们建议这些训练数据清单成为支持数据科学模型的每个代码库的一部分。*****

# 数据可观察性及其重要性

> 原文:<https://towardsdatascience.com/data-observability-and-why-it-matters-e60fb1dc8eac?source=collection_archive---------28----------------------->

## [播客](https://towardsdatascience.com/tagged/tds-podcast)

## Kevin Hu 谈如何确保你的数据集不是问题

[苹果](https://podcasts.apple.com/ca/podcast/towards-data-science/id1470952338?mt=2) | [谷歌](https://www.google.com/podcasts?feed=aHR0cHM6Ly9hbmNob3IuZm0vcy8zNmI0ODQ0L3BvZGNhc3QvcnNz) | [SPOTIFY](https://open.spotify.com/show/63diy2DtpHzQfeNVxAPZgU) | [其他](https://anchor.fm/towardsdatascience)

*编者按:TDS 播客由杰雷米·哈里斯主持,他是人工智能安全初创公司墨丘利的联合创始人。每周,Jeremie 都会与该领域前沿的研究人员和商业领袖聊天,以解开围绕数据科学、机器学习和人工智能的最紧迫问题。*

想象一下,你正在经营一家盈利的企业,你的销售策略的一部分是偶尔向那些已经注册加入你的邮件列表的人发送大量电子邮件。在一段时间内,这种方法带来了可靠的新销售流,但有一天,这种情况突然停止了。发生了什么事?

你翻遍日志,寻找解释,但结果发现问题不在你的软件上;它和你的数据在一起。也许新来的实习生不小心给你数据集中的每个电子邮件地址添加了一个字符,或者打乱了你邮件列表上的名字,这样克里斯蒂娜就收到了一封写给“约翰”的邮件,反之亦然。这种故事的版本出人意料地经常发生,当它们发生时,成本可能是巨大的:收入损失、客户失望,或者更糟——不可逆转的信任损失。

今天,整个产品都是建立在数据集之上的,而这些数据集没有被适当地监控以发现关键故障,并且越来越多的产品在高风险的情况下运行。这就是数据可观察性如此重要的原因:能够跟踪任务关键型数据的来源、转换和特征,以便在问题导致下游损害之前发现问题。

这也是我们将与 Kevin Hu 对话的原因,他是全球首批数据可观测性创业公司之一 [Metaplane](https://www.metaplane.dev/) 的联合创始人兼首席执行官。Kevin 对数据管道有着深刻的理解,如果没有适当的监控,cap 就会出现问题。在这一集的 TDS 播客中,他和我一起谈论了数据的可观测性,为什么它很重要,以及它如何与负责任的人工智能联系起来。

以下是我在对话中最喜欢的一些观点:

*   Kevin 提出了他所谓的“数据可观察性的四个支柱”,这是一组维度,它们共同给出了数据集和数据基础架构健康状况的完整画面。这四个支柱是指标、元数据、沿袭和日志。度量传达有关数据集的信息,该数据集取决于它包含的特定样本,例如,列的平均值、标准偏差和偏斜度。元数据描述数据集的外部特征,从结构上更好地描述数据集:数据有多新,它有多少列,等等。谱系指的是应用于数据集中每个样本的转换的起源和历史(根据 Kevin 的说法,谱系是公司最容易纠结或完全忽略的四大支柱之一)。最后,日志捕获数据和现实世界之间的交互,无论是机器对机器的交互(例如数据复制)还是人机交互(例如数据团队创建新的模型或仪表板)。你可以在这里阅读 Kevin 关于数据可观察性四大支柱[的帖子。](http://The Four Pillars of Data Observability)
*   Kevin 指出,虽然数据可观测性和数据操作比软件工程中的同行落后了大约十年,但软件工程中的许多概念可以用来实现更好的数据可观测性,因此没有人需要在这里重新发明轮子。例如,他强调了这样一个事实,即数据血统可以使用数据版本控制工具进行跟踪,如 [dbt](https://www.getdbt.com/) ,这本身就是受软件领域版本控制工具的启发。
*   人工智能的新时代以在大型数据集上训练的高度规模化、多用途模型为特征。这些有时被称为“基础模型”,它们会产生新的安全风险:因为一个基础模型可以用于许多应用程序(例如,GPT-3,它可以翻译语言,撰写文章,代码等),它们可能成为基于它们构建的大型工具和服务生态系统的单点故障。这意味着我们在训练他们的时候需要特别小心:破坏一个用来训练基础模型的数据集的后果是非常严重的,这个基础模型的输出被数百万人消费。随着人工智能能力的增加,数据可观察性游戏的赌注也在增加。

你可以[点击这里](https://twitter.com/kevinzenghu)在 Twitter 上关注凯文。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/63d605a5dc38c0425796f00e6a14096b.png)

## 章节:

*   0:00 介绍
*   2:00 什么是数据可观测性?
*   8:20 数据集的内部和外部特征之间的差异
*   12:20 为什么数据如此难以记录?
*   17:15 追溯模型
*   22:00 日期的算法分析
*   五年内实现 26:30 的数据运营
*   33:20 与前沿人工智能工作的关系
*   39:25 软件工程和启动资金
*   42:05 较小规模的问题
*   46:40 需要解决的未来数据运营问题
*   48:45 总结

# 数据可观测性:如何大规模地固定数据质量

> 原文:<https://towardsdatascience.com/data-observability-how-to-fix-data-quality-at-scale-a79081d5b94d?source=collection_archive---------23----------------------->

## 引入一种新方法来防止分析仪表板损坏,并增强对您数据的信任。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2a41880a44380e2ad5db8e834a671280.png)

图片由 Shutterstock 提供。

*公司每年花费超过*[***1500 万美元***](https://www.gartner.com/smarterwithgartner/how-to-stop-data-quality-undermining-your-business/) *处理* [*数据停机*](https://www.montecarlodata.com/the-rise-of-data-downtime/) *,换句话说,在数据丢失、损坏或其他错误的时间段内,每 5 家公司中就有 1 家*<https://www.zdnet.com/article/companies-are-losing-revenue-opportunities-and-customers-because-of-bad-data-practices/>**因数据不完整或不准确而失去了一个客户。**

**好在* [***还有希望数据的下一个前沿:可观测性*** *。*](/data-observability-the-next-frontier-of-data-engineering-f780feb874b) *以下是全球电子商务公司 Yotpo 的数据工程师和 BI 分析师如何利用大规模数据可观察性来提高成本节约、协作和生产率。**

*[Yotpo](https://www.yotpo.com/) 与世界各地的电子商务公司合作,通过评论、视觉营销、忠诚度和推荐计划以及短信营销来帮助他们加速在线收入增长。*

*对于业务绩效总监 Yoav Kamin 和数据工程团队负责人 Doron Porat 来说,始终拥有准确可靠的数据是这项任务成功的基础。*

## *挑战:破损的数据管道和仪表板*

*从第一天起,Yotpo 就为支持公司多样化数据需求的内部团队投资了一个分布式数据平台,从生成营销报告到授权产品开发团队为他们的用户建立更好的服务。*

*在过去的几年里,Yotpo 呈指数级增长,在全球范围内扩张业务,并收购了包括 Swell Rewards 和 SMSBump 在内的公司。随着 Yotpo 的发展,数据源的数量和数据管道的复杂性也在增加。随着时间的推移,跟踪数据完整性、沿袭和质量变得越来越困难,这是可靠数据的三个关键特征。这种</the-rise-of-data-downtime-841650cedfd5>**的数据停机时间,换句话说,就是数据丢失、不准确或其他错误的时期,导致了耗时且成本高昂的数据消防演习,从而导致了 Yotpo 的业务绩效和数据工程团队之间的摩擦。***

> ***“一次又一次,我们的工作人员会找到我的团队,告诉我们数据是错误的,但我们根本不知道数据是如何泄露的,”多伦说。“我们很清楚,我们必须更好地控制我们的数据管道,因为我们不能让我们的数据消费者就数据问题向我们发出警报,并不断被意外捕获,没有人会以这种方式信任我们的分析。”***

***为了解决这个问题,Yotpo 需要一种更好的方法来管理数据健康和发现。最终,他们需要一种解决方案,能够在正确的时间为他们提供正确的信息,以便在数据管道和商业智能仪表板中的异常情况影响业务之前发出警报并加以预防。***

# ***解决方案:数据可观察性***

***为了帮助他们消除数据停机并释放数据的潜力,Yotpo 选择了 [**一种主动的数据可观察性方法**](https://www.youtube.com/embed/YKZ4Ikk8NiE) ,该方法将自动监控 Yotpo 数据生态系统的关键功能,包括数据新鲜度、分布、卷、模式和沿袭。***

***无需手动设置阈值,他们的团队就能快速获得以下问题的答案:***

*   ***我的表上次更新是什么时候?***
*   ***我的数据是否在可接受的范围内?***
*   ***我的数据完整吗?2000 排突然变成 50 排了?***
*   ***谁有权访问我们的营销表并对其进行了更改?***
*   ***我的数据在哪里损坏了?哪些表或报表受到了影响?***

# ***结果:通过在数据异常影响下游消费者之前捕捉它们来节约成本***

***开箱即用的数据可观测性使 Yotpo 能够概述他们的红移环境,包括所有数据资产、模式和表。他们的机器学习算法自动生成规则,通知数据停机监控和警报,提供即时价值。***

***![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e98a393008f61c08c409975a1b5541eb.png)***

***调整到 Yotpo 数据生态系统的 ML 算法在数据异常影响下游数据资产之前检测到它们。图片由巴尔·摩西提供。***

***数据可观察性对团队的影响的一个最近的例子是,当 Yotpo 的 Segment 实例中的一个错误数据点生成了比预期多 6 倍的行时,即使考虑了季节性和正常的数据波动。***

***Doron 说:“当峰值发生时,我们的数据可观察性引擎立即向我的团队发出警报,使我们能够在异常影响营销团队的下游数据消费者之前进行调查和故障排除。“因为我们马上发现了这一点,所以我可以放心,任何重要的业务指标都不会受到影响。”***

***由于数据工程团队在问题影响到他们的利益相关者之前就得到通知,他们能够修复他们的管道,并防止未来的异常危及他们数据的完整性。***

# ***结果:通过跟踪外地一级的传承改善了合作***

***数据可观察性对 Yotpo 的日常运营变得至关重要的另一个用例是,当 Yotpo 的业务应用程序团队(负责集成和维护 Salesforce 等内部运营系统的团队)想要用新的字段替换过时的字段时。他们的许多仪表板严重依赖于这一领域,因此他们必须提前为这一变化做好准备。***

***![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0f0ce9ad8e40033fb4df0437af0511dd.png)***

***数据可观察性使 Yotpo 能够了解关键数据资产的依赖性。图片由巴尔·摩西提供。***

***使用信息丰富的查询日志,数据可观察性有助于 Yotpo 了解 1)该字段的下游依赖关系是什么,2)谁在使用该表以及如何使用,3)哪些仪表板当前正在使用旧字段(沿袭),以及 4)在何处添加了新字段以跟踪此更新的进度。***

***“我们使用 lineage 来突出我们数据生态系统中的上游和下游依赖关系,包括 Salesforce,让我们更好地了解我们的数据健康状况,”Yoav 说。“我们不需要被动应对并在控制面板出现故障后进行修复,而是需要主动出击。”***

# ***结果:通过监视废弃数据集提高工作效率***

***![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8bb1c4f223e843022de9e728fd136bfc.png)***

***数据可观察性使 Yotpo 对重要数据集和表的健康状况有了更大的透明度。图片由巴尔·摩西提供。***

***此外,数据可观察性使 Yotpo 能够更加透明地了解<https://www.montecarlodata.com/how-to-solve-the-youre-using-that-table-problem/>**重要数据资产的相关性和使用模式,并在不同属性(如记录类型 ID 和特定数据集)被否决时通知他们。数据可观察性使他们能够跟踪新字段添加和使用的位置,以便您可以跟踪哪些仪表板需要更新。这些知识确保了 Yotpo 可以相信他们的数据是准确可靠的,即使他们的数据平台在不断发展。*****

*****“一旦你对你的数据失去信任,你就失去了可靠性,”多伦说。“有了数据可观察性,数据停机时间更少,数据可靠性更高。痛苦的模式更改和破损仪表板的日子已经一去不复返了。”*****

# *****Yotpo 数据可观测性的影响*****

*****对于 Yotpo 来说,数据可观察性使他们能够快速解决数据质量问题,因此他们可以开始相信他们的数据能够为业务提供可靠、可操作的见解。*****

*****“我们的高管依靠我团队的仪表盘来做出决策。有了数据可观察性,当数据发生变化时,我们确切地知道应该更新什么,因此没有停机时间,也没有消防演习。我们的决策者更高兴了,我晚上可以睡觉了,”Yoav 说。*****

*****除其他优势外,数据可观察性使 Yotpo 能够:*****

*   *****[**通过减少解决繁琐的数据消防演习的时间来增加成本节约**](https://www.montecarlodata.com/how-to-calculate-the-cost-of-data-downtime/) 并恢复对数据的信任,以便做出重要决策*****
*   *****[**数据工程和数据分析师团队之间更好地协作**](https://www.montecarlodata.com/why-hiring-a-data-analyst-wont-solve-your-business-problems/) 以了解数据资产之间的关键依赖关系*****
*   *****[**通过获得对数据资产的运行状况、使用模式和相关性的端到端可见性,提高效率和生产力**](https://www.montecarlodata.com/how-to-solve-the-youre-using-that-table-problem/)*****

*****有了数据可观测性,Yoav、Doron 和他们的数据团队已经做好充分准备,可以消除数据停机时间,并继续释放数据的潜力。*****

********有兴趣学习更多数据可观测性?*** [***巴尔摩西***](https://www.linkedin.com/in/barrmoses/) ***。********

********本文由*** [***会知更鸟***](https://www.linkedin.com/in/will-robins/) ***共同撰写。特别感谢 Yoav、Doron 和 Yotpo 数据团队的其他成员!********

# 数据可观察性:如何防止大规模数据管道破裂

> 原文:<https://towardsdatascience.com/data-observability-how-to-increase-trust-in-data-at-scale-105aa928eabe?source=collection_archive---------39----------------------->

## 介绍了解数据可靠性的新方法

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7d583dd3a79d5e40eb28b70041aaa260.png)

*图片由*[*foximage*](https://www.shutterstock.com/image-vector/business-intelligence-creative-idea-thievery-economic-1257488386)*于*[*Shutterstock*](http://www.shutterstock.om)*上,通过 Shutterstock 的标准许可批准使用。*

*公司每年花费超过*[***1500 万美元***](https://www.gartner.com/smarterwithgartner/how-to-stop-data-quality-undermining-your-business/) *处理* [*数据停机*](https://www.montecarlodata.com/the-rise-of-data-downtime/) *,换句话说,在数据丢失、损坏或出现其他错误的时间段内,超过 88%的美国企业* *因数据质量而遭受损失*

*幸运的是,数据工程的下一个前沿领域* [***还有希望:数据可观察性。***](/data-observability-the-next-frontier-of-data-engineering-f780feb874b) *以下是图书汇总订阅服务 Blinkist 的数据工程团队如何通过大规模的数据可观察性来提高成本节约、协作和生产率。*

Blinkist 在全球拥有超过 1600 万用户,它通过电子书订阅服务帮助时间紧张的读者将学习融入他们的生活。

[工程总监 Gopi Krishnamurthy 领导着负责数据工程、基础设施、云卓越中心、增长和货币化的团队。](https://www.linkedin.com/in/gopikrishnamurthy-digitalarchitect/)

> 对于 Blinkist 来说,拥有值得信赖和可靠的数据是其业务成功的基础。

## 挑战:损坏的数据管道影响增长、用户体验和可靠性

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e66fc82f49f7c2269b895abc22fbcbac.png)

*缺乏实时数据跟踪导致关键分销渠道的营销支出减少。图片由 Blinkist 提供。*

作为一家高速增长的公司,Blinkist 利用付费绩效营销来获得客户。他们的 2020 年战略——雄心勃勃的 40%增长目标——包括对脸书和谷歌等渠道的重大投资,这些渠道将根据 Blinkist 应用程序和渠道本身之间共享的行为数据自动优化活动。

当然,像 2020 年的许多公司一样,新冠肺炎疫情改变了一切。现在,历史数据无法反映受众日常生活的当前现实,实时数据变得至关重要——不仅是为了确定广告支出,也是为了了解用户如何与 Blinkist 应用和网络内容进行交互的当前状态。

这些数据中的任何不准确都可能影响决策,从活动支出到更新产品路线图。至关重要的是,不要错过任何创新的机会,从添加新功能到简化入职到测试新广告——因为围绕“改善通勤”的活动已经不再相关。

随着首席执行官和活动经理越来越依赖实时洞察来推动营销战略、预算支出和投资回报,Gopi 和他的团队正在努力解决数据停机问题,包括数据质量、仪表板更新延迟和管道中断等问题。

> “每周一,我们都会接到高管的电话,”戈皮说。“几乎每周一,我都会在电话中尝试回答为什么我们无法扩展,问题是什么,我们在跟踪数据方面面临多少问题…尝试解释问题的严重性,并尝试增强管理层利益相关者的信心。”

Gopi 估计他的团队花费了**50%的工作时间进行数据演习**,试图解决数据停机问题,同时重建与组织其他部门的信任。这是不可持续的——必须有所改变。

# 解决方案:端到端的数据可观察性

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/73bd3b2a555977c018c4f10b41aac1bb.png)

*Blinkist 利用数据可观察性在整个公司范围内恢复对数据的信任,进而确保营销支出得到合理分配。图片由 Blinkist 提供。*

于是在 2020 年秋天,Gopi 和他的团队重组,重新聚焦。他们建立了一个以 Spotify 推广的[深思熟虑的执行框架](https://spotify.design/article/from-gut-to-plan-the-thoughtful-execution-framework)为模型的计划,设定了一个明确的目标,在他们的公司建立对数据的信任。

Gopi 说:“这个框架的核心是数据可靠性工程,我们将[数据可靠性](/what-is-data-reliability-66ec88578950)视为一等公民,就像工程团队在过去十年中开始对待 DevOps 和站点可靠性工程一样。”

实现数据可靠性的基础是关注数据治理、数据质量和重构系统。

“当我们转向尝试引入数据可靠性工程原则时,数据可观察性对我们在短时间内轻松采用并满足这三个期望起到了关键作用,”Gopi 说

## 成果:通过自助工具和明确的数据可靠性 SLA,更快地解决数据事件

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4d8207c536d3dab8d1f3f887ec4a01a0.png)

*通过制定明确的数据可靠性服务级别协议和利用自助工具,Blinkist 能够在数据宕机影响下游消费者之前对其进行补救。图片由 Blinkist 提供。*

在无代码的情况下,他们的数据可观察性平台在不到两周的时间内建立并运行,提供了对其数据管道和关键资产运行状况的即时可见性,大大加快了事件响应时间。

“我们可以立即看到发生了什么,”戈皮说。“每天,我们都可以看到是否有一个破裂的管道,一个没有更新的表,或者一个因为在上游添加或删除了某些内容而改变了数据模型的表。”

随着 Gopi 和他的团队努力重建破裂的信任以及破裂的管道,他们与公司领导合作,建立对数据可靠性原则的共同理解,并制定具体的[数据 SLA(服务级别协议)](https://www.montecarlodata.com/how-to-make-your-data-pipelines-more-reliable-with-slas/)。

数据利益相关方也获得了访问数据报告的权限,从而提高了整个公司数据运行状况的透明度。

> “数据可观察性的自助服务功能有助于重建对数据的信任,因为用户看到了我们的行动:从红色警报到蓝色的“工作进行中”,再到绿色的“已解决”,Gopi 说。“他们知道谁应该负责,他们知道团队正在努力,一切都变得非常清楚。”

## 成果:通过对关键数据资产的自动监控和警报,每周节省 120 个小时的时间

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bbce78c0c596f2d365d368f08db7c704.png)

*数据可观察性为 Blinkist 提供了一个关于其数据资产真相的集中来源,包括浮现相关异常和跟踪血统到现场级别。图片由 Blinkist 提供。*

数据可观察性可检测 Blinkist 数据环境中的异常,使用机器学习算法来生成控制数据停机警报的阈值和规则。这种自动化监控为 Gopi 的团队节省了每个工程师每周 20 个小时的时间,这在内部开发是不切实际的。这为 Gopi 的团队带来了每周 **120 小时**的累计时间节省,现在这些精力可以用于构建他们的产品或其他创新。

“特别是考虑到我们正在工作的时间框架,数据可观察性平台不是我们可以建立的,”Gopi 说。“这基本上是数据可观察性背后的人工智能的力量——要建立这种工具,你需要有大量的内部知识来建立这些业务规则和创建这些警报。”

由于前面提到的自助式报告和数据 SLA,数据可观察性也有助于利益相关者更高效地工作。

例如,当渠道经理注意到营销活动表现不佳时,他们可以轻松访问数据报告,并查看数据可靠性 SLA 是否得到满足以及数据管道是否正常工作。如果是这样的话,他们可以排除不良数据这一罪魁祸首,并寻找其他解决方案,如更换广告创意或调整目标受众——而无需要求数据团队的同事付出时间或精力。

## 成果:通过防止数据管道和仪表板损坏增加收入

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7366c7b5e609a2945db6dccd1b626cb2.png)

*数据事件的自动警报确保了 Blinkist 的数据团队在管道破裂或仪表盘失效时第一个知道。图片由 Blinkist 提供。*

由于 Blinkist 能够更快地检测和解决数据停机问题,他们的营销渠道蓬勃发展,从而增加了收入。

“如果我们能够在 24 小时内发现并解决问题,脸书或谷歌就可以自动更正,永远不会缩减广告活动,”戈皮说。

> 随着更准确的分析和新近恢复的对数据的信任,Blinkist 营销人员现在能够迅速做出决策,优化他们的广告支出,以获得更好的目标和绩效。

“我们今年看到的增长规模是压倒性的,”Gopi 说。“虽然数据团队不能独享全部荣誉,但我绝对认为我们能够做到的事情——在数据可观察性和将透明度引入数据运营方面——改善了我们锁定受众和渠道的方式。”

# Blinkist 数据可观测性的影响

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fc6a0520ce8ee4501a38ed1e821d6538.png)

*数据可观察性恢复了人们对数据的信任,确保营销支出得到合理分配,进而增加收入。图片由 Blinkist 提供。*

> 数据可观察性帮助 Blinkist 增加了收入,节省了时间,并在整个组织中重建了数据的信任和透明度。随着损坏的数据管道得到控制,他们的数据工程师正专注于创新和解决核心业务问题,而不是救火。

除其他优势外,数据可观察性使 Blinkist 能够:

*   [**每位工程师每周节省 20 多个小时**、](https://www.montecarlodata.com/how-to-fix-your-data-quality-problem/)**通过消除对繁琐数据消防演习的故障排除需求**
*   **[**通过获得对数据资产的运行状况、使用模式和相关性的端到端可见性,提高效率和协作**](https://www.montecarlodata.com/how-to-solve-the-youre-using-that-table-problem/)**

**“数据可观察性通过在新鲜度、数据量和数据模型变化方面自动化异常检测,使生活变得更加轻松,”Gopi 说。“这对于我们在正确的时间采取行动并确保减少甚至防止数据宕机非常有帮助。”**

*****有兴趣了解数据可观察性如何帮助您获得更可靠的数据?伸出手去*** [***巴尔***](https://www.linkedin.com/in/barrmoses/) ***和*** [***蒙特卡洛!***](http://www.montecarlodata.com)**

*****特别感谢 Gopi 和 Blinkist 团队的其他人!*****

***本文由*[*Will Robins*](https://www.linkedin.com/in/will-robins/)共同撰写。**

# 数据可观察性:使用 SQL 构建数据质量监视器

> 原文:<https://towardsdatascience.com/data-observability-in-practice-using-sql-755dc6421f59?source=collection_archive---------11----------------------->

## 辅导的

## *如何构建自己的数据质量监控器,以识别数据管道中的新鲜度和分布异常*

由[瑞安·卡恩斯](https://www.linkedin.com/in/ryanothnielkearns/)和[巴尔·摩西](https://www.linkedin.com/in/barrmoses/)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f2a803c6e86c900f5864143c4dacb34b.png)

图片由[像素](http://www.pexels.com)上的 [faaiq ackmerd](https://www.pexels.com/@faaiq-ackmerd-383634) 提供。

*在本系列文章中,我们将介绍如何从头开始创建自己的数据可观察性监视器,映射到数据健康的五大支柱*</introducing-the-five-pillars-of-data-observability-e73734b263d5>**。本系列的第 1 部分改编自 Barr Moses 和 Ryan Kearns' O'Reilly 培训,* [***管理数据停机时间:将可观测性应用于您的数据管道***](https://www.oreilly.com/live-training/courses/managing-data-downtime/0636920508717/) *,这是业界首个关于数据可观测性的课程。关联练习在* [*这里*](https://github.com/monte-carlo-data/data-downtime-challenge) *可用,本文所示改编代码在* [*这里*](https://github.com/monte-carlo-data/data-observability-in-practice) *可用。**

*从空值和重复行,到建模错误和模式更改,数据可能由于多种原因而中断。[数据测试](/why-testing-your-data-is-insufficient-6914275a9762)通常是我们抵御不良数据的第一道防线,但是如果数据在其生命周期中出现问题,会发生什么呢?*

*我们将这种现象称为数据宕机,它指的是数据丢失、出错或不准确的时间段。[数据停机](/the-rise-of-data-downtime-841650cedfd5)提示我们提出如下问题:*

*   *数据是最新的吗?*
*   *数据是否完整?*
*   *字段是否在预期范围内?*
*   *零利率是高于还是低于它应有的水平?*
*   *模式改变了吗?*

*为了在数据中断时触发警报并防止数据停机,数据团队可以利用我们在软件工程领域的朋友们的一个屡试不爽的策略: [**监控和可观察性**](https://observability.workshop.aws/en/anomalydetection.html) 。*

*我们将 [**数据可观察性**](/what-is-data-observability-40b337971e3e) 定义为组织回答这些问题并评估其数据生态系统健康状况的能力。反映数据健康的关键变量,数据可观察性的五个支柱是:*

*   *新鲜度:我的数据是最新的吗?我的数据是否有未更新的时间间隔?*
*   ***分布**:我的数据在现场级别的健康程度如何?我的数据是否在预期范围内?*
*   ***卷**:我的数据接收是否达到预期的阈值?*
*   ***模式**:我的数据管理系统的正式结构改变了吗?*
*   ***血统**:如果我的部分数据宕机,对上下游有什么影响?我的数据源如何相互依赖?*

> *以这种概念性的方式谈论数据可观测性是一回事,但完整的处理应该拉开帷幕— **数据可观测性在代码中实际上是什么样子的?***

*很难完全回答这个问题,因为细节将取决于个人对数据仓库、数据湖、BI 工具、首选语言和框架等的选择。即便如此,使用 SQLite 和 Jupyter 之类的轻量级工具解决这些问题可能是有用的。*

*在本文中,我们将通过一个示例数据生态系统来创建我们自己的 SQL 数据质量监视器,并探索数据可观测性在实践中是什么样子的。*

*让我们来看看。*

# *实践中的数据可观测性*

**本教程基于我们奥莱利课程* [*练习 1*](https://github.com/monte-carlo-data/data-downtime-challenge/blob/master/exercise_text/ex1.md) *,* [*管理数据停机*](https://www.oreilly.com/live-training/courses/managing-data-downtime/0636920508717/) *。欢迎您使用 Jupyter 笔记本和 SQL 自行尝试这些练习。我们将在以后的文章中更详细地讨论,包括练习*[*2*](https://github.com/monte-carlo-data/data-downtime-challenge/blob/master/exercise_text/ex2.md)*[*3*](https://github.com/monte-carlo-data/data-downtime-challenge/blob/master/exercise_text/ex3.md)*和* [*4*](https://github.com/monte-carlo-data/data-downtime-challenge/blob/master/exercise_text/ex4.md) *。***

**我们的样本数据生态系统使用关于可居住外行星的[模拟天文数据](https://github.com/monte-carlo-data/data-observability-in-practice/blob/main/EXOPLANETS.db)。出于本练习的目的,我使用 Python 生成了数据集,对我在生产环境中遇到的真实事件的异常进行建模。这个数据集完全可以免费使用,如果您感兴趣的话,存储库中的 [utils 文件夹](https://github.com/monte-carlo-data/data-downtime-challenge/tree/master/data/utils)包含了生成数据的代码。**

**我使用的是 **SQLite 3.32.3** ,它应该可以通过简单的设置从命令提示符或 SQL 文件访问数据库。这些概念实际上可以扩展到任何查询语言,这些实现可以扩展到 MySQL、Snowflake 和其他数据库环境,只需做很小的改动。**

```
**$ sqlite3 EXOPLANETS.db
sqlite> PRAGMA TABLE_INFO(EXOPLANETS);
0 | _id            | TEXT | 0 | | 0
1 | distance       | REAL | 0 | | 0
2 | g              | REAL | 0 | | 0
3 | orbital_period | REAL | 0 | | 0
4 | avg_temp       | REAL | 0 | | 0
5 | date_added     | TEXT | 0 | | 0**
```

**`EXOPLANETS`中的数据库条目包含以下信息:**

**0.`_id`:对应行星的 UUID。
1。`distance`:距离地球的距离,以光年为单位。
2。`g`:表面重力为 *g* 的倍数,引力常数。
3。`orbital_period`:单个轨道周期的长度,以天为单位。
4。`avg_temp`:平均表面温度,单位为开尔文度。
5。`date_added`:我们的系统发现这颗行星并将其自动添加到我们的数据库中的日期。**

**请注意,由于数据缺失或错误,对于给定的行星,`distance`、`g`、`orbital_period`和`avg_temp`中的一个或多个可能是`NULL`。**

```
**sqlite> SELECT * FROM EXOPLANETS LIMIT 5;**
```

**请注意,这个练习是追溯性的—我们正在查看历史数据。在生产数据环境中,数据可观察性是实时的,并应用于数据生命周期的每个阶段,因此将涉及与此处略有不同的实现。**

**出于这个练习的目的,我们将为新鲜度和分布建立数据可观察性算法,但是在以后的文章中,我们将解决我们的五个支柱的其余部分——以及更多。**

# **新鲜**

**我们监控的数据可观察性的第一个支柱是新鲜度,它可以为我们提供重要数据资产上次更新时间的有力指示。如果一个整点定期更新的报告突然看起来非常陈旧,这种类型的异常应该给我们一个强烈的信号,表明有什么不对劲。**

**首先,注意`DATE_ADDED`列。当添加单个记录时,SQL 不存储元数据。因此,为了在这种追溯设置中可视化新鲜感,我们需要自己跟踪这些信息。**

**按`DATE_ADDED`列分组可以让我们深入了解`EXOPLANETS`每天是如何更新的。例如,我们可以查询每天添加的新 id 的数量:**

**你可以自己用[库中的`$ sqlite3 EXOPLANETS.db < queries/freshness/rows-added.sql`运行这个。我们得到以下数据:](https://github.com/monte-carlo-data/data-observability-in-practice)**

**基于我们数据集的这个图形表示,看起来`EXOPLANETS`每天持续更新大约 100 个新条目,尽管存在连续多天没有数据的间隙。**

**回想一下,对于新鲜感,我们想问“我的数据是最新的吗?”—因此,了解表更新中的这些缺口对于了解我们数据的可靠性至关重要。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5da9d7427fec6506ab3b9de6e052b7ee.png)**

**新鲜度异常!**

**这个查询通过为`DAYS_SINCE_LAST_UPDATE`引入一个度量来操作新鲜度。(注意:由于本教程使用的是 SQLite3,所以计算时差的 SQL 语法在 MySQL、雪花和其他环境中会有所不同)。**

**结果表显示“在日期 *X* ,在`EXOPLANETS`中的最新数据是 *Y* 天前的数据。”这是从表格的`DATE_ADDED`栏中无法明确获得的信息——但是应用数据可观测性为我们提供了发现它的工具。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5394e52f0d51a13c359f6ef7e06c76e0.png)**

**现在,我们有了检测新鲜度异常所需的数据。剩下要做的就是为 Y 设置一个**阈值** **参数**—*多少天算多*?参数将查询变成了检测器,因为它决定了什么算异常(读:值得警告),什么不算异常。(关于设置阈值参数的更多信息,请参阅后面的文章!).**

**新鲜度异常!**

**返回给我们的数据代表新鲜事件发生的日期。**

**在 2020 年 5 月 14 日,表中的最新数据是 8 天前的!这样的中断可能代表我们的数据管道中的一个破损,了解我们是否将这些数据用于任何有价值的事情将是很好的(如果我们在生产环境中使用这些数据,很有可能我们正在使用)。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5879c2147455536df70e00bc87328fd5.png)**

**请特别注意查询的最后一行:`DAYS_SINCE_LAST_UPDATE > 1;`。**

**这里,1 是一个 [**模型参数**](https://en.wikipedia.org/wiki/Parameter)**——这个数字并不“正确”,尽管改变它会影响我们认为是事件的日期。数字越小,我们将捕捉到的真正的异常就越多(高[召回](https://en.wikipedia.org/wiki/Precision_and_recall)),但是很有可能,这些“异常”中有几个不会反映真实的停机。数字越大,我们捕捉到的所有异常反映真实异常的可能性就越大(高[精度](https://en.wikipedia.org/wiki/Precision_and_recall)),但是我们可能会遗漏一些。****

****出于本例的目的,我们可以将 1 改为 7,从而只捕捉 2020 年 2 月 8 日和 2020 年 5 月 14 日两次最严重的停机。这里的任何选择都将反映特定的用例及目标,并且是在生产环境中大规模应用数据可观测性时反复出现的重要平衡。****

****下面,我们利用相同的新鲜度检测器,但是用`DAYS_SINCE_LAST_UPDATE > 3;`作为阈值。两个较小的中断现在没有被发现。****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9e1b6b39cad8ca755a8df18a0dc015b9.png)****

****请注意两次未检测到的停机—这两次停机之间的间隔必须少于 3 天。****

****现在我们设想相同的新鲜度检测器,但是现在用`DAYS_SINCE_LAST_UPDATE > 7;`作为阈值。除了两次最大的停电外,其他都没有被发现。****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6d5d0a1e385ebe44347e9b3eb4ccbf7f.png)****

****[就像行星](https://www.nasa.gov/vision/earth/livingthings/microbes_goldilocks.html)一样,最佳模型参数位于过低和过高值之间的“黄金地带”或“最佳点”。这些数据可观察性概念(以及更多!)将在后面的文章中讨论。****

# ****分配****

****接下来,我们想要评估我们的数据在现场级别的分布状况。分布告诉我们数据的所有期望值,以及每个值出现的频率。一个最简单的问题是,“我的数据`NULL`多久一次”?在许多情况下,某种程度的不完整数据是可以接受的——但是如果 10%的无效率变成了 90%,我们就想知道了。****

****该查询返回大量数据!这是怎么回事?****

****通式`CAST(SUM(CASE WHEN SOME_METRIC IS NULL THEN 1 ELSE 0 END) AS FLOAT) / COUNT(*)`,当按`DATE_ADDED`列分组时,告诉我们`SOME_METRIC`的`NULL`值在`EXOPLANETS`的每日批量新数据中的比率。通过查看原始输出很难获得某种感觉,但视觉可以帮助说明这种异常情况:****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/cf1af072521e71e045773f238784f024.png)********![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f6b12c7b99ac47db82ac5769d4a6f457.png)********![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/db091e827d9e77c0fe22ea719ff20090.png)********![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f0fffc05256a7a62b6266f3d3855dad0.png)****

****这些图像清楚地表明,我们应该检测零利率“峰值”事件。现在让我们只关注最后一个指标`AVG_TEMP`。我们可以用一个简单的阈值来检测最基本的零尖峰:****

****我们的第一个分布异常。****

****就检测算法而言,这种方法有点生硬。有时,我们数据中的模式足够简单,这样的阈值就能达到目的。然而,在其他情况下,数据会有噪音或有其他复杂因素,比如[季节性](https://en.wikipedia.org/wiki/Seasonality),这要求我们改变方法。****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bf02865d857d30e74d58142352544191.png)****

****例如,检测 2020–06–02、2020–06–03 和 2020–06–04 似乎是多余的。我们可以过滤出紧随其他警报之后的日期:****

****注意,在这两个查询中,关键参数是`0.9`。我们实际上是在说:“任何高于 90%的空率都是一个问题,我需要知道它。”****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bc31430926b132984a52d29f1e819951.png)****

****在这种情况下,我们可以(也应该)通过应用带有更智能参数的[滚动平均值](https://en.wikipedia.org/wiki/Moving_average)的概念来变得更智能一点:****

****一个澄清:注意在第 28 行,我们使用数量`AVG_TEMP_NULL_RATE — TWO_WEEK_ROLLING_AVG`进行过滤。在其他情况下,我们可能希望得到这个误差量的`ABS()`,但不是在这里——原因是如果一个`NULL`率“峰值”代表了从先前平均值的增加,那么它就更加令人担忧。每当`NULL`频率突然降低时,可能不值得进行监控,而检测`NULL`频率增加的价值是显而易见的。****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/907831f600e1e42a9b48d4734fd04478.png)****

****当然,还有越来越复杂的异常检测指标,如<https://en.wikipedia.org/wiki/Standard_score>**和 [**自回归建模**](https://en.wikipedia.org/wiki/Autoregressive_model) 超出了本文的范围。本教程只是为 SQL 中的现场健康监控提供了基本的框架;希望能给你自己数据的思路!******

# ******下一步是什么?******

******这个简短的教程旨在说明“数据可观察性”并不像其名称所暗示的那样神秘,并且通过一个整体的方法来理解您的数据健康状况,您可以在您的管道的每个阶段确保高度的数据信任和可靠性。******

******事实上,使用普通的 SQL“检测器”可以实现数据可观察性的核心原则,前提是保留一些关键信息,如记录时间戳和历史表元数据。还值得注意的是,对于随生产环境增长的端到端数据可观测性系统,ML 驱动的关键参数调整是强制性的。******

> ******请继续关注本系列的后续文章,这些文章将重点关注分布和模式中的异常监控、血统和元数据在数据可观察性中的作用,以及如何大规模地一起监控这些支柱以获得更可靠的数据。******

******在此之前,祝您没有数据宕机!******

*********有兴趣了解有关如何大规模应用数据可观测性的更多信息吗?伸出手去*** [***瑞恩***](https://www.linkedin.com/in/ryan-kearns-203686a9)*[***巴尔***](https://www.linkedin.com/in/barrmoses/) ***,以及剩下的*** [***蒙特卡洛团队***](https://www.montecarlodata.com/) ***。**********

******![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e73c65449550dde556cf3ac10825796a.png)******

# 数据可观察性,第二部分:如何使用 SQL 构建自己的数据质量监视器

> 原文:<https://towardsdatascience.com/data-observability-in-practice-using-sql-part-ii-schema-lineage-5ca6c8f4f56a?source=collection_archive---------18----------------------->

## 辅导的

## 使用模式和沿袭来理解数据异常的根本原因

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c408641e9dbba94d1a8ff456ac05b063.png)

图片由卢卡斯·佩泽塔在[像素](https://www.pexels.com/photo/black-telescope-under-blue-and-blacksky-2034892/)上提供。

*在本系列文章中,我们将介绍如何从头开始创建自己的数据可观察性监视器,映射到数据健康的五大支柱*</introducing-the-five-pillars-of-data-observability-e73734b263d5>**。第一部分可以在这里找到*<https://www.montecarlodata.com/data-observability-in-practice-using-sql-1/>**。***

***本系列的第二部分改编自 Barr Moses 和 Ryan Kearns' O'Reilly 的培训,* [***管理数据停机时间:将可观测性应用于您的数据管道***](https://www.oreilly.com/live-training/courses/managing-data-downtime/0636920508717/) *,这是业内首个关于数据可观测性的课程。关联练习可在* [*这里*](https://github.com/monte-carlo-data/data-downtime-challenge) *获得,本文所示改编代码可在* [*这里*](https://github.com/monte-carlo-data/data-observability-in-practice) *获得。***

**随着世界对数据需求的增加,强大的数据管道变得更加必要。当数据中断时——无论是由于模式更改、空值、重复还是其他原因——数据工程师需要知道。**

**最重要的是,我们需要在破坏影响到下游系统和消费者之前,尽快评估破坏的根本原因。我们使用“</the-rise-of-data-downtime-841650cedfd5>**”来指代数据丢失、出错或不准确的时间段。如果您是一名数据专业人员,您可能很熟悉提出以下问题:****

*   ****数据是最新的吗?****
*   ****数据是否完整?****
*   ****字段是否在预期范围内?****
*   ****零利率是高于还是低于它应有的水平?****
*   ****模式改变了吗?****

****为了有效地回答这些问题,我们可以从软件工程师的剧本中抽出一页: [**监控和可观察性**](https://observability.workshop.aws/en/anomalydetection.html) **。******

****回顾一下第 1 部分,我们将 [**数据可观察性**](/what-is-data-observability-40b337971e3e) 定义为组织回答这些问题并评估其数据生态系统健康状况的能力。反映数据健康的关键变量,数据可观察性的五个支柱是:****

*   ******新鲜度**:我的数据是最新的吗?我的数据是否有未更新的时间间隔?****
*   ******分布**:我的数据在现场级别的健康程度如何?我的数据是否在预期范围内?****
*   ******卷**:我的数据接收是否符合预期的阈值?****
*   ******模式**:我的数据管理系统的正式结构改变了吗?****
*   ******血统**:如果我的部分数据宕机,对上下游有什么影响?我的数据源如何相互依赖?****

****在本系列文章中,我们感兴趣的是揭开帷幕,研究数据可观测性是什么样子的——代码中的*。*****

****在[第一部分](https://medium.com/swlh/data-observability-building-your-own-data-quality-monitors-using-sql-a4c848b6882d)中,我们看了前两个支柱,新鲜度和分布,并展示了一点 SQL 代码如何操作这些概念。这些是我们称之为更“经典”的 [**异常检测问题**](https://en.wikipedia.org/wiki/Anomaly_detection)——给定一个稳定的数据流,是否有任何东西看起来不正常?良好的异常检测当然是数据可观测性难题的一部分,但不是全部。****

> ****同样重要的是 [***语境***](https://www.montecarlodata.com/data-teams-your-metadata-is-useless/) 。如果发生了异常,很好。但是在哪里?什么上游管道可能是原因?哪些下游仪表板会受到影响?我的数据的形式结构改变了吗?良好的数据可观察性取决于我们正确利用元数据来回答这些问题(以及许多其他问题)的能力,这样我们就可以确定根本原因并在问题变成更大的问题之前解决它。****

****在本文中,我们将研究两个数据可观察性支柱,它们旨在为我们提供这种关键的环境— **模式**和**血统**。同样,我们将使用像 Jupyter 和 SQLite 这样的轻量级工具,因此您可以轻松地构建我们的环境并亲自尝试这些练习。让我们开始吧。****

# ****我们的数据环境****

*****本教程基于奥莱利课程* [*练习 2 和练习 3*](https://github.com/monte-carlo-data/data-downtime-challenge/blob/master/exercise_text/ex2.md) *,* [*管理数据停机*](https://www.oreilly.com/live-training/courses/managing-data-downtime/0636920508717/) *。欢迎您使用 Jupyter 笔记本和 SQL 自行尝试这些练习。我们将在以后的文章中更详细地讨论,包括练习*[*【4】*](https://github.com/monte-carlo-data/data-downtime-challenge/blob/master/exercise_text/ex4.md)*。*****

****如果你读过这个系列的第一部分,你应该熟悉我们的数据。像以前一样,我们将使用关于可居住外行星的模拟天文数据。我们用 Python 生成了数据集,对我在生产环境中遇到的真实事件的数据和异常进行建模。这个数据集完全可以免费使用,如果您感兴趣的话,存储库中的 [utils 文件夹](https://github.com/monte-carlo-data/data-downtime-challenge/tree/master/data/utils)包含生成数据的代码。****

****我使用的是 SQLite 3.32.3,它应该可以通过简单的设置从命令提示符或 SQL 文件访问数据库。这些概念可以扩展到任何查询语言,这些实现可以扩展到 MySQL、Snowflake 和其他数据库环境,只需做很小的改动。****

****再一次,我们有了系外行星表:****

```
****$ sqlite3 EXOPLANETS.db
sqlite> PRAGMA TABLE_INFO(EXOPLANETS);
0 | _id            | TEXT | 0 | | 0
1 | distance       | REAL | 0 | | 0
2 | g              | REAL | 0 | | 0
3 | orbital_period | REAL | 0 | | 0
4 | avg_temp       | REAL | 0 | | 0
5 | date_added     | TEXT | 0 | | 0****
```

****系外行星中的数据库条目包含以下信息:****

****0.`_id`:对应行星的 UUID。****

1.  ****`distance`:距离地球的距离,以光年为单位。****

****2.`g`:表面重力为 g 的倍数,引力常数。****

****3.`orbital_period`:单个轨道周期的长度,以天为单位。****

****4.`avg_temp`:平均表面温度,单位为开氏度。****

****5.`date_added`:我们的系统发现这颗行星并自动将其添加到我们的数据库的日期。****

****注意,对于给定的行星,由于数据缺失或错误,一个或多个`distance`、`g`、`orbital_period`和`avg_temp`可能是`NULL`。****

****`sqlite> SELECT * FROM EXOPLANETS LIMIT 5;`****

****请注意,这个练习是追溯性的—我们正在查看历史数据。在生产数据环境中,数据可观察性是实时的,并应用于数据生命周期的每个阶段,因此将涉及与此处略有不同的实现。****

****看起来我们最早的数据是 2020-01-01(*注意*:大多数数据库不会存储单个记录的时间戳,所以我们的`DATE_ADDED`栏会跟踪我们)。我们的最新数据…****

```
****sqlite> SELECT DATE_ADDED FROM EXOPLANETS ORDER BY DATE_ADDED DESC LIMIT 1;
2020–07–18****
```

****…看起来来自 2020 年 7 月 18 日。当然,这是我们在过去的文章中使用的同一张表。如果我们想要探索模式和血统的更多上下文相关的支柱,我们将需要扩展我们的环境。****

****现在,除了`EXOPLANETS`之外,我们还有一个叫做`EXOPLANETS_EXTENDED`的表,它是我们过去的表的超集。把这些看作是在*不同时刻*的同一张桌子是很有用的。事实上,`EXOPLANETS_EXTENDED`的数据可以追溯到 2020 年 1 月 1 日…****

```
****sqlite> SELECT DATE_ADDED FROM EXOPLANETS_EXTENDED ORDER BY DATE_ADDED ASC LIMIT 1;
2020–01–01****
```

****…但也包含截至 2020 年 9 月 6 日的数据,比`EXOPLANETS`更远:****

```
****sqlite> SELECT DATE_ADDED FROM EXOPLANETS_EXTENDED ORDER BY DATE_ADDED DESC LIMIT 1;
2020–09–06****
```

# ****可视化模式更改****

****这些表之间还有一些不同之处:****

```
****sqlite> PRAGMA TABLE_INFO(EXOPLANETS_EXTENDED);
0 | _ID            | VARCHAR(16777216) | 1 | | 0
1 | DISTANCE       | FLOAT             | 0 | | 0
2 | G              | FLOAT             | 0 | | 0
3 | ORBITAL_PERIOD | FLOAT             | 0 | | 0
4 | AVG_TEMP       | FLOAT             | 0 | | 0
5 | DATE_ADDED     | TIMESTAMP_NTZ(6)  | 1 | | 0
6 | ECCENTRICITY   | FLOAT             | 0 | | 0
7 | ATMOSPHERE     | VARCHAR(16777216) | 0 | | 0****
```

****除了`EXOPLANETS`中的 6 个字段外,`EXOPLANETS_EXTENDED`表还包含两个附加字段:****

****6.`eccentricity`:行星围绕其主星的[轨道偏心](https://en.wikipedia.org/wiki/Orbital_eccentricity)。****

****7.地球大气的主要化学成分。****

****请注意,与`distance`、`g`、`orbital_period`和`avg_temp`一样,`eccentricity`和`atmosphere`都可能是给定行星的`NULL`,这是数据缺失或错误的结果。比如[流氓行星](https://en.wikipedia.org/wiki/Rogue_planet)轨道偏心率未定义,很多行星根本没有大气层。****

****还要注意,数据没有回填,这意味着从表格开始的数据条目(数据也包含在`EXOPLANETS`表格中)没有偏心率和大气信息。****

```
****sqlite> SELECT
   ...>     DATE_ADDED,
   ...>     ECCENTRICITY,
   ...>     ATMOSPHERE
   ...> FROM
   ...>     EXOPLANETS_EXTENDED
   ...> ORDER BY
   ...>     DATE_ADDED ASC
   ...> LIMIT 10;
2020–01–01 | |
2020–01–01 | |
2020–01–01 | |
2020–01–01 | |
2020–01–01 | |
2020–01–01 | |
2020–01–01 | |
2020–01–01 | |
2020–01–01 | |
2020–01–01 | |****
```

****添加两个字段是一个 [**模式** **变更**](https://www.educative.io/blog/what-are-database-schemas-examples) 的例子——我们的数据的正式蓝图已经被修改。当对数据结构进行更改时,会发生架构更改,手动调试可能会令人沮丧。模式更改可以表明关于数据的许多事情,包括:****

*   ****添加新的 API 端点****
*   ****假定已弃用但尚未弃用的字段****
*   ****列、行或整个表格的增加或减少****

****在一个理想的世界中,我们想要一个这种变化的记录,因为它代表了我们管道中可能出现的问题的一个向量。不幸的是,我们的数据库并没有自然地配置来跟踪这样的变化。它没有版本历史。****

****我们在[第一部分](https://medium.com/swlh/data-observability-building-your-own-data-quality-monitors-using-sql-a4c848b6882d)中查询个人记录的年龄时遇到了这个问题,并添加了`DATE_ADDED`列来应对。在这种情况下,我们将做一些类似的事情,只是增加了一个完整的表:****

```
****sqlite> PRAGMA TABLE_INFO(EXOPLANETS_COLUMNS);
0 | DATE    | TEXT | 0 | | 0
1 | COLUMNS | TEXT | 0 | | 0****
```

****在任何给定的日期,`EXOPLANETS_COLUMNS`表通过记录`EXOPLANETS_EXTENDED`中的列来“版本化”我们的模式。查看第一个和最后一个条目,我们看到这些列在某一点上确实发生了变化:****

```
****sqlite> SELECT * FROM EXOPLANETS_COLUMNS ORDER BY DATE ASC LIMIT 1;
2020–01–01 | [
              (0, ‘_id’, ‘TEXT’, 0, None, 0),
              (1, ‘distance’, ‘REAL’, 0, None, 0),
              (2, ‘g’, ‘REAL’, 0, None, 0),
              (3, ‘orbital_period’, ‘REAL’, 0, None, 0),
              (4, ‘avg_temp’, ‘REAL’, 0, None, 0),
              (5, ‘date_added’, ‘TEXT’, 0, None, 0)
             ]sqlite> SELECT * FROM EXOPLANETS_COLUMNS ORDER BY DATE DESC LIMIT 1;
2020–09–06 | 
[
              (0, ‘_id’, ‘TEXT’, 0, None, 0),
              (1, ‘distance’, ‘REAL’, 0, None, 0),
              (2, ‘g’, ‘REAL’, 0, None, 0),
              (3, ‘orbital_period’, ‘REAL’, 0, None, 0),
              (4, ‘avg_temp’, ‘REAL’, 0, None, 0),
              (5, ‘date_added’, ‘TEXT’, 0, None, 0),
              (6, ‘eccentricity’, ‘REAL’, 0, None, 0),
              (7, ‘atmosphere’, ‘TEXT’, 0, None, 0)
             ]****
```

****现在,回到我们最初的问题:模式到底是什么时候改变的?因为我们的列列表是按日期索引的,所以我们可以用一个快速的 SQL 脚本找到更改的日期:****

****以下是返回的数据,为了便于阅读,我对其进行了重新格式化:****

```
****DATE:         2020–07–19
NEW_COLUMNS:  [
               (0, ‘_id’, ‘TEXT’, 0, None, 0),
               (1, ‘distance’, ‘REAL’, 0, None, 0),
               (2, ‘g’, ‘REAL’, 0, None, 0),
               (3, ‘orbital_period’, ‘REAL’, 0, None, 0),
               (4, ‘avg_temp’, ‘REAL’, 0, None, 0),
               (5, ‘date_added’, ‘TEXT’, 0, None, 0),
               (6, ‘eccentricity’, ‘REAL’, 0, None, 0),
               (7, ‘atmosphere’, ‘TEXT’, 0, None, 0)
              ]
PAST_COLUMNS: [
               (0, ‘_id’, ‘TEXT’, 0, None, 0),
               (1, ‘distance’, ‘REAL’, 0, None, 0),
               (2, ‘g’, ‘REAL’, 0, None, 0),
               (3, ‘orbital_period’, ‘REAL’, 0, None, 0),
               (4, ‘avg_temp’, ‘REAL’, 0, None, 0),
               (5, ‘date_added’, ‘TEXT’, 0, None, 0)
              ]****
```

****通过这个查询,我们返回令人不快的日期:2020–07–19。像新鲜度和分布可观察性一样,实现模式可观察性遵循一种模式:我们识别发出管道健康信号的[有用元数据](/metadata-is-useless-535e43311cd8),跟踪它,并构建检测器来警告我们潜在的问题。提供一个类似于`EXOPLANETS_COLUMNS`的附加表是跟踪模式的一种方式,但是还有很多其他方式。我们鼓励您考虑如何为自己的数据管道实现模式更改检测器!****

# ****可视化血统****

****我们将世系描述为数据可观察性的 5 个支柱中最全面的一个,这是有充分理由的。****

> ****Lineage 通过告诉我们(1)哪些下游来源可能会受到影响,以及(2)哪些上游来源可能是根本原因,将事件联系起来。虽然用 SQL 代码“可视化”血统并不直观,但一个简单的例子可以说明它是如何有用的。****

****为此,我们需要再次扩展我们的数据环境。****

# ****简介:宜居****

****让我们向数据库添加另一个表。到目前为止,我们一直在记录系外行星的数据。这里有一个有趣的问题要问:这些行星中有多少可能有生命?****

****`HABITABLES`表从`EXOPLANETS`获取数据来帮助我们回答这个问题:****

```
****sqlite> PRAGMA TABLE_INFO(HABITABLES);
0 | _id          | TEXT | 0 | | 0
1 | perihelion   | REAL | 0 | | 0
2 | aphelion     | REAL | 0 | | 0
3 | atmosphere   | TEXT | 0 | | 0
4 | habitability | REAL | 0 | | 0
5 | min_temp     | REAL | 0 | | 0
6 | max_temp     | REAL | 0 | | 0
7 | date_added   | TEXT | 0 | | 0****
```

****`HABITABLES`中的条目包含以下内容:****

****0.`_id`:对应行星的 UUID。****

****1.`perihelion`:在一个轨道周期内[离天体最近的距离](https://en.wikipedia.org/wiki/Apsis#Perihelion_and_aphelion)。****

****2.`aphelion`:一个轨道周期内[到天体的最远距离](https://en.wikipedia.org/wiki/Apsis#Perihelion_and_aphelion)。****

****3.地球大气的主要化学成分。****

****4.`habitability`:一个介于 0 和 1 之间的实数,表示该星球有多大可能孕育生命。****

****5.`min_temp`:星球表面的最低温度。****

****6.`max_temp`:星球表面最高温度。****

****7.我们的系统发现这颗行星并将其自动添加到我们的数据库中的日期。****

****与`EXOPLANETS`中的列一样,`perihelion`、`aphelion`、`atmosphere`、`min_temp`和`max_temp`的值允许为`NULL`。事实上,`perihelion`和`aphelion`将是`EXOPLANETS`中任意`_id`的`NULL`,其中`eccentricity`是`NULL`,因为你使用轨道偏心率来计算这些度量。这解释了为什么这两个字段在我们的旧数据条目中总是`NULL`:****

```
****sqlite> SELECT * FROM HABITABLES LIMIT 5;****
```

****因此,我们知道`HABITABLES`依赖于`EXOPLANETS`(或者,同样地,`EXOPLANETS_EXTENDED`)中的值,并且`EXOPLANETS_COLUMNS`也是如此。我们数据库的依赖图如下所示:****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b3030f2a904b97915388549d5c867e96.png)****

****图片由[蒙特卡洛](http://www.montecarlodata.com)提供。****

****非常简单的血统信息,但已经很有用了。让我们在此图的上下文中查看`HABITABLES`中的异常情况,看看我们能了解到什么。****

# ****调查异常现象****

****当我们有了一个关键指标,比如`HABITABLES`中的可居住性,我们可以用几种方法来评估这个指标的健康程度。首先,某一天新数据的`habitability`平均值是多少?****

****看着这些数据,我们发现有些不对劲。`habitability`的平均值通常在 0.5 左右,但在记录的数据中后来减半至 0.25 左右。****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/74e57fceb91d3cd9193fb6ec98ba1f23.png)****

****分布异常…但是是什么引起的呢?****

****这是一个明显的分布异常,但是到底发生了什么呢?换句话说,这个异常的*根源*是什么?****

****为什么我们不像我们在第一部分中做的那样,看看适合居住的比率呢?****

****幸运的是,这里看起来没有什么不符合角色的:****

****但这看起来不像是我们问题的起因。如果我们看看另一个分布健康指标,零值比率**,会怎么样?******

******这里似乎有更明显的问题:******

******从历史上看,`habitability`实际上从未为零,但在后来的日子里,它平均飙升至近 40%。这具有降低磁场平均值的检测效果。******

******![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b43cf7ec74feb92979c277eed3a28548.png)******

******分布异常…但是是什么引起的呢?******

******我们可以修改我们在第一部分中构建的一个分布检测器,以在`habitability`场中获得可感知的零速率的第一个日期:******

******我通过命令行运行了这个查询:******

```
******$ sqlite3 EXOPLANETS.db < queries/lineage/habitability-zero-rate-detector.sql
DATE_ADDED | HABITABILITY_ZERO_RATE | PREV_HABITABILITY_ZERO_RATE
2020–07–19 | 0.369047619047619      | 0.0******
```

******2020 年 7 月 19 日是零利率开始显示异常结果的第一天。回想一下,这与`EXOPLANETS_EXTENDED`中的模式变更检测是同一天。`EXOPLANETS_EXTENDED`在`HABITABLES`的上游,所以这两起事件很有可能是有关联的。******

******通过这种方式,沿袭信息可以帮助我们识别事件的**根本原因**,并更快地解决它们。比较`HABITABLES`中对此事件的以下两种解释:******

1.  ******在 2020 年 7 月 19 日,表格`HABITABLES`中可居住性一栏的零比率从 0%跃升至 37%。******
2.  ******在 2020 年 7 月 19 日,我们开始跟踪`EXOPLANETS`表中的另外两个字段`eccentricity`和`atmosphere`。这对下游工作台`HABITABLES`有不利影响,每当`eccentricity`不为`NULL`时,经常将字段`min_temp`和`max_temp`设置为极值。反过来,这导致了零速率的`habitability`场尖峰,我们检测到这是平均值的异常降低。******

******解释(1)仅使用了发生异常的事实。解释(2)使用沿袭,根据表和字段之间的依赖关系,将事件放在上下文中并确定根本原因。顺便说一句,( 2)中的所有内容实际上都是正确的,我鼓励你去改变周围的环境,自己去理解发生了什么。虽然这些只是简单的例子,配备(2)的工程师会更快地*理解*和*解决*潜在的问题,这都归功于适当的可观察性。******

# ******下一步是什么?******

******跟踪模式更改和沿袭可以让您对数据的运行状况和使用模式有前所未有的了解,提供有关数据使用人、内容、位置、原因和方式的重要上下文信息。事实上,在理解数据停机的下游(通常是真实世界)含义时,模式和沿袭是两个最重要的数据可观察性支柱。******

******总结一下:******

*   ******观察我们数据的**模式**意味着理解我们数据的形式结构,以及它何时以及如何变化。******
*   ******观察我们数据的**血统**意味着理解我们管道中的上游和下游依赖关系,并把孤立的事件放在更大的背景中。******
*   ********数据可观察性**的这两个支柱都涉及跟踪适当的元数据,并以一种使异常可以理解的方式转换我们的数据。******
*   ******更好的可观察性意味着**更好地理解数据损坏的原因和方式**,减少检测时间和解决时间。******

******我们希望“上下文中的数据可观察性”的第二部分是有用的。******

******直到第三部分,这里祝你没有数据停机!******

*********有兴趣了解更多有关蒙特卡洛数据可观测性方法的信息吗?将手伸向*** [***瑞恩***](https://www.linkedin.com/in/ryan-kearns-203686a9)*[***巴尔***](https://www.linkedin.com/in/barrmoses/) ***,以及***[*蒙特卡洛团队****。***](http://www.montecarlodata.com)*******

*******本文由瑞安·卡恩斯和巴尔·摩西撰写。*******

# 压缩分区的数据优化

> 原文:<https://towardsdatascience.com/data-optimization-for-compacted-partitions-7ef1c8a89419?source=collection_archive---------44----------------------->

# TL;速度三角形定位法(dead reckoning)

借助基于使用模式和领域专家确定的高优先级列的智能数据优化,ORC 和 Parquet 等列数据能够创建更小的数据占用空间。这个存储操作是幂等的,不变的。根据数据当前的存储方式,节省的成本可能非常可观。在下面的案例中,我们在存储大小和查询持续时间方面实现了高达 70%的缩减。

# 介绍

因此,您已经创建了一个表。花了几个小时和几天来设置流和/或批处理管道,定义逻辑,解决错误和边缘情况,您已经成功了,祝贺您!您已经有了生产就绪的代码,并且正在用数据填充表分区。剩下的工作就是监控管道,收集统计数据,让用户构建他们的模型并报告任何问题,对吗?在这篇博文中,我们将在这样的假设下工作

1.  我们正在处理 Pb 级的大型数据湖:具有许多 GB 的分区和 TB 级的目录,
2.  潜在的问题与小的非最佳叶文件有关,与集群设置、架构等无关。

# 小活页文件

过了一段时间,我们的表已经写了许多小时、天、月等。我们的用户报告说,即使在访问单个分区时,表也很慢。经过调查,我们注意到管道正在分区中写入许多小的叶子文件。

小叶子文件问题是什么?

小文件是指比 HDFS 块大小小得多的文件。对于 parquet 和 orc 文件,大型数据的最佳文件大小在 512MB 到 1024MB 之间。由于我们处理的是大数据,我们的 HDFS 块大小将是 256MB。也就是说,我们的叶文件是块大小的 2–4 倍,这是最佳设置。

为什么我们会看到非最佳分区大小?

默认情况下,Spark 将在每个分区写入 200 个文件,因为`spark.sql.shuffle.partitions=200`会引入一个会产生混洗的动作。在仅映射写入中,文件的数量将与初始分区的数量相关。在下面的示例中,假设正在从数据工程/模型管道写入数据,该管道在写入数据之前应用了一些逻辑,从而引入了洗牌(对于大多数产生业务使用表的管道逻辑来说是常见的)。

但是,根据您的集群设置或用户指定的设置,该数字可能会更高或更低。假设我们的表是按日和小时划分的。对于给定的一天,我们有 24 个小时,每个分区在 10GB 到 25GB 之间。我们的叶文件将在 51.2MB 和 128MB 之间。

# 天真的方法

对于此表,我们保留了 90 天的滚动数据。该表包含 432,000 个不大于 128MB 的叶文件,我们知道平均每天的数据量约为 2TB,因此该目录约为 180TB。使用 3 因子复制,我们看到的数据占用空间为 540TB。根据我们的同事和/或以前的经验,我们知道我们需要建立一个数据压缩工作。要做到这一点,我们可以使用联合或重新划分,但重新划分的使用将涉及洗牌。我们应该使用哪一个?因为不需要洗牌而合并?考虑 8GB 的分区:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/15d683f67a494b22c7f519d043c9558b.png)

图片拍摄于[https://tech . true analytics . ai/posts/data-optimization-for-compacted-partitions/](https://tech.trueanalytics.ai/posts/data-optimization-for-compacted-partitions/)

在简单的方法中,我们设置一个全局联合或重新分区值,而不是每个分区的值。

有了 coalesce,我们的运行时间会更快,因为它不需要洗牌,数据大小也不会改变。但是,coalesce 不能保证它将数据平均分配到文件中,因此,我们不能使用值 8,这将导致文件大小介于 128MB 和 1024MB++之间,具体取决于使用全局值的最佳分区。

# 再分

对于重新分配,我们引入洗牌。不过,混洗的好处是,当 Spark 写入数据时,叶文件的大小将相对相等。一个有趣的值是分区的数量。如果重新分区将产生相同大小的叶文件,为什么我们不应该使用 8?由于重新分区会改变数据,如果数据有自然的顺序,列压缩的好处可能会被破坏。这意味着重新分区会产生 3 种潜在结果,它可以将数据打乱更好的自然顺序,数据将会减少,它可能不会立即影响数据大小,或者它可能会使数据变得更糟,实际上导致数据大小增加。

# 优化方法

怎样才能做得更好?首先,我们需要了解我们的数据。由此,哪些列对于模型构建、数据分析、过滤等是最重要的。使用该表时,某些列是否比其他列更重要?在过滤的情况下,我们不考虑分区列,因为当用户指定 where `partition_col = some_partition`时,分区修剪会处理这些列。

# 线性排序

对于线性排序,我们希望按照层次结构中最有影响力的列来编写数据。要确定感兴趣的列,最好咨询表所有者、该表的高级用户以及这些数据源的主题专家(SME)。此外,对多列进行线性排序时,优先级基于它们在子句中的指定顺序,也就是说,列表中第一列的影响比最后一列大。因此,只需要挑选少数几个(不超过 10 个,但我建议少于 10 个)列。

大约在 2020 年 3 月至 4 月,我们 True Analytics Tech 在我们最大的数据集上展示了线性排序的优势。我们查看了两周的数据。当我们在下图中谈论运行时间时,这是为了运行计数。在每种情况下,我们在 JVM 预热后收集 10 次运行的结果。在一个更复杂的运行时测试中,这里没有显示,我们聚集了一些数据,并将其连接回原始数据 2 周。在优化的数据上,它运行了大约 5 到 10 分钟。然后,我们用克隆数据(2 周)和表中的数据对它进行了测试。两者都花了 1 个小时才完成 50%。我们克隆了 2 周的数据来运行,因此我们可以确定较长的运行时间与表的完整大小无关。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ebff5f7be6380f3f2706dc8c1490c29f.png)

图片取自[https://tech . true analytics . ai/posts/data-optimization-for-compacted-partitions/](https://tech.trueanalytics.ai/posts/data-optimization-for-compacted-partitions/)

我们的数据占用空间减少了 77%,在 2 周的采样数据中,运行时间减少了约 90%。由于这一结果,我们决定在我们最大的数据集上全面应用这一点,并在 2020 年优化我们的传入数据和旧数据。

该表中的数据已经增长到每天大约 2TB,通过应用线性排序,我们每天能够减少 1.5TB 的数据占用空间,并且通过 3 因子复制,我们每天可以节省 4.5TB 的数据。下面,您将看到由数据模型团队生成的数据监控,他们对我们的一个较大的数据集进行压缩。我们在删除非最佳数据之前等待了 8 天,因此尚未清理的数据将显示大约 2.5TB,因为两个源都存在。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4e3f9a1d3c7262227f386bf415990170.png)

我们对此基础层的保留策略是 90 天,由此,我们有 3 个按小时、天、月派生的聚合层,目前我们将保留大约 1-2 年。我们在这张单个表格上展示的累计节省为 1.322PB。此外,我们的受众团队还优化了他们的数据存储,又节省了 1PB。也就是说,截至 2021 年 6 月 17 日,我们已经保存了 2.331PB 的数据。

在 True Analytics,我们在内部存储数据。然而,为了说明优化压缩流程的好处,我们来看看[亚马逊的定价层](https://aws.amazon.com/s3/pricing/)。我们将只关注存储节省,但请记住,最终用户将体验到运行时间的减少。对于新加坡地区,标准 S3 的成本是第一个 50TB 0.025 美元,第二个 450 TB 0.024 美元,之后 0.023 美元,这是每月的费用。对于亚马逊定价,我们基于 1 个因素;即 2.331 * 1024 / 3 = 795TB。通过减少数据占用空间,我们每月将节省 19,287.04 美元(623,164 泰铢)的成本。

# 空间填充曲线

空间填充曲线是我们可以用来优化数据的另一种广泛使用的方法。同样,我们希望确定最有影响的列,使用的列数规则在这里仍然适用。

空间填充曲线有多种风格:

*   阿砣
*   科赫
*   希尔伯特
*   莫顿

举几个大的例子。

为什么我们要使用空间填充曲线,而不仅仅是使用线性排序?如上所述的线性排序涉及多维索引,其中每个索引对查询结果的权重越来越小。如果您正在寻找存储数据的最佳方式,那么我们需要做的就是减少数据占用空间并能够将多维索引映射到一维。这就是空间填充曲线发挥作用的地方。这里我们来看一个在一组`(x, y)`坐标上使用莫顿曲线(Z 排序)的例子。考虑设置`{(1, 1), (1, 8), (2, 1), (3, 1)}`。这个集合目前按 x,y 线性排序,在 Z 排序中,会发生什么?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bd7821d987401bb4171c4645876f8233.png)

图片摘自[https://tech . true analytics . ai/posts/data-optimization-for-compacted-partitions/](https://tech.trueanalytics.ai/posts/data-optimization-for-compacted-partitions/)

如果我们根据比特交织的结果对数据进行排序,我们将得到`{(1, 1), (2, 1), (3, 1), (1, 8)}`。在 x 完全排序之前,y 在排序中起作用,允许其他变量列对排序后的数据产生影响。

当与表列统计一起使用时,空间填充曲线可以加快数据检索速度。发生这种情况时,查询可以跳过较大的数据块,从而最大限度地减少需要遍历的文件数量。在这里,在分析平台上,我们运行了 Z 排序,并将其与我们的原始和线性结果进行了比较。我们看到线性排序的数据占用空间减少了 16%。在这种情况下,我们的原始数据是 1.5TB,线性数据是 398GB,应用 Z 排序时是 334GB。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ff68f388d9b26bbc7196e7156e83447d.png)

我们还没有对带有表统计的大型数据集进行完整的性能测试。我们无法显示使用 Z 排序对数据的好处。然而,Amazon 和 Databricks 都有文章概述了使用 Z 排序时的性能提升。对于我们的用例,我们既没有使用 Amazon 集群,也没有在 Deltalake 中使用 Databricks 优化。一切都是内部构建的,用于我们的内部集群。

# 确认

我们运行了一个验证套件来验证数据优化在数据方面是一个等幂变换。首先,我们在原始数据和优化数据的列上运行计数、最小值、最大值等标准指标,最后对两个数据集进行哈希运算以生成校验和。

# 结论

在我们开始使用这种优化压缩的一年半时间里,我们已经在最大的数据集上节省了 50–70%的数据。这提高了我们的集群利用率,减缓了我们的服务器扩展速度,使我们的运营团队不必经常重新平衡节点,并实现了性能提升,使我们的数据模型和数据科学团队能够以更少的资源更快地运行他们的管道。然而,我们还没有完成。我们正在将数据压缩扩展到本地集群中的大多数数据集。

*原载于 2021 年 7 月 22 日*[*https://tech . true analytics . ai*](https://tech.trueanalytics.ai/posts/data-optimization-for-compacted-partitions/)*。*

# 多云未来的数据模式

> 原文:<https://towardsdatascience.com/data-patterns-in-a-multi-cloud-future-c2d21376a026?source=collection_archive---------25----------------------->

## 多重云正在成为常态。当您的数据分布在多个云和本地时,这对数据科学和数据工程意味着什么?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b50de84796301f5f24f605ef1af795ee.png)

弗兰基·查马基在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

对于任何组织来说,最重要的资产就是他们的数据。但这也是最难管理的资产。我已经写了[云计算如何发展](https://kishoregopalan.medium.com/the-multi-cloud-future-3-to-do-multi-cloud-you-should-first-think-multi-cloud-bf76d57660af)以适应世界经济和贸易的不断变化,以及为什么每个组织都必须有一个云计算战略。虽然跟上不断变化的动态对于企业的繁荣和发展非常重要,但它也带来了一系列新的挑战。

尤其是当您引入多个云平台,使您的企业数据分布在不同的云中时,它会如何改变数据科学等式?您是否仍然能够利用来自所有云和本地的所有数据来连接这些点,并从中提取有意义的分析?

Gartner 预测了,这并不奇怪,

> ***到 2021 年,超过 75%的大中型组织将采用多云和/或混合 IT 战略。***

随着我们与一些最大的企业合作,实现他们的云计算和云计算驱动的数据分析之旅,我们在谷歌看到了这一预测的现实已经展开。

在这篇文章和下一篇文章中,我们将讨论不同的数据模式,您可以在跨多个云的数据科学、数据工程和 BI 任务中采用这些模式。

**通过跨多个云连接数据实现商业智能**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9d237fe9300e2ed663f2bafb7cbad800.png)

作者图片

[Looker](https://cloud.google.com/looker) 是谷歌的云端商业智能和数据分析平台。Looker 的强大之处在于它能够连接到跨不同云或内部的多个数据源,并创建报告和仪表板。它的 LookML 有一套丰富的 API,可以让你在网站中嵌入数据、可视化和见解,并使用工作流集成,在 Looker 本身的基础上构建应用程序。

Looker 可以部署在各种位置,它不一定是谷歌云。如果仪表板上显示的大部分数据位于另一个云中或内部,那么 Looker 最好部署在靠近主数据源的地方。

**使用 BigQuery-Omni 访问多个云中的数据**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/416b704cd2430cbf750ce3b3a669312c.png)

作者图片

适用于查询 BigQuery 托管存储的相同控制机制可以应用于驻留在 AWS 中的数据。另一个有趣的模式是将 Looker 与 BigQuery Omni 结合使用。

我们来看看这个图和之前的图有什么不同。Looker 连接到 BigQuery,而不是从 Looker 连接到 Athena,这是查询 S3 存储桶中的数据所需要的。从技术上讲,它连接到控制平面,控制平面转到驻留在 AWS 中的数据平面,并根据 S3 存储桶中的数据处理查询。

使用这种模式的优点是,适用于查询 BigQuery 托管存储的相同控制机制可以应用于驻留在 AWS 中的数据,这将是一个更受控制和更简单的仪表板设置。从旁观者的角度来看,BigQuery Omni 的连接性与托管存储或 Google Cloud 上的联合数据源中的 BigQuery 表的连接性完全相同。当数据科学家或 BI 分析师无法通过 SQL 接口访问 Athena 或其他方式来查询 S3 存储桶中的数据时,这也会变得非常方便。BigQuery Omni 成为 SQL 引擎,从熟悉的 Google 平台控制它既方便又安全。

之前模式的其余部分保持不变——您仍然可以连接到其他数据源,包括 Google Cloud 上的 BigQuery 数据和本地数据仓库,并在同一个仪表板上可视化它,并构建相同类型的应用程序和工作流。

在下一篇文章中,我们将讨论一些更高级的架构模式,它们可以让您跨多个云运行您的分析。

# 数据视角——如何更理智地看待数据

> 原文:<https://towardsdatascience.com/data-perspectives-how-to-look-at-data-more-intellectually-31da4fd3afb6?source=collection_archive---------24----------------------->

## 关于堆栈和队列的概述和讨论,以及为什么了解它们有助于编程。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5a4fc10855db2e0ad5aec149adae8aac.png)

(src =[https://pixabay.com/images/id-1954920/](https://pixabay.com/images/id-1954920/)

# 介绍

至少从软件的角度来看,数据的概念在现代社会中根深蒂固。每个人至少知道数据的基本知识,我们知道如何保存它,我们知道如何使用它。作为数据科学家和计算机程序员,我们与数据的关系要复杂得多,有时甚至是浪漫的。我们可以用许多不同的方式来看待数据的概念,但通常情况下,在我们的计算机下发生的大量数据传输都远离用户。当然,无论用户是否是软件工程师,情况都是如此。

作为数据科学家,我们在不断学习,数据科学家当然需要学习的一件事就是数据。人们可以从很多不同的角度来看待数据。例如,让我们考虑一个软件工程师,他在查看数据框之前从来没有做过任何分析工作——他可能不知道关于他们正在查看的特性的许多事情。今天,我想揭示一些关于数据的观点,一些在数据科学领域取得成功的思考方式。使用这些想法和思维方式,人们可能会发现在不同的场景中处理数据要容易得多。

# №1:硬件视角

我想向大家展示的第一个视角是硬件视角。许多数据科学家在查看数据时擅长于其他角度,但从更面向硬件的角度查看数据可能会成为任何真正想要创建令人敬畏的东西的有抱负的工程师的绊脚石。不用说,如果你想在任何定制的机器学习网络上工作,你可能想首先了解它运行的硬件。

也就是说,以这种方式查看数据对于一个更注重分析的数据科学家来说可能有些不和谐。每当我们从不同的角度看问题时,我们都在看功能和观察结果,但在更面向硬件的角度,我们主要看的是书面存储器,更重要的是编程,我们的随机存取存储器,或 RAM。让我们从堆栈和队列的角度来看待数据,而不是将数据视为特征和观察值。

堆栈是内存中一堆数据的名称。这堆数据有几个不同的层次。它本质上只是一堆字节。例如,我们在一台计算机上有 4GB 的内存,这将是 4000 兆字节,或 4e+9 字节。每次内存被移动到堆栈时,一个新的“堆”被放在旧堆栈的顶部。在某种程度上,我们的筹码就像是一堆叠在一起的华夫饼。除此之外,每块华夫饼都是独一无二的。关于堆栈,要记住的最重要的事情是,当我们考虑到这一点时,它是没有组织的。我们可以添加华夫饼干,也可以去掉华夫饼干。如果我们想在中间放一个华夫饼干,我们需要在访问它之前把数据从上面拿走。每当我们从内存中删除一部分字节时,就称为弹出,当我们添加它时,我们采用注册表术语“推送数据”

队列就像一个堆栈,唯一的区别是最新的版本应该先放。理解数据是如何存储在内存中的肯定会应用到一个人的编程技能中。尤其是当一个人在用 C 或汇编这样的低级编程语言工作时。

# №2:软件视角

另一种在给定时刻查看数据的方式是从软件的角度。在我看来,这是纯分析视角和硬件视角之间的一个很好的中间点。在大多数情况下,以这种方式查看数据可能是最理想的,因为我们处理的数据类型通常不是简单的特性集。有时,数据甚至根本无法被解释,除非计算机正在这样做,例如分解。如果你对分解不太了解,我还有一篇文章解释了奇异值分解的数学细节,你可以在这里读到:

</deep-in-singular-value-decomposition-98cfd9532241> [## 深入奇异值分解

towardsdatascience.com](/deep-in-singular-value-decomposition-98cfd9532241) 

每当我们从软件的角度考虑数据时,我们都在处理文件,有时是数据类型,但通常不是结构化数据集。换句话说,这种思维方式经常在分析数据集之前就被使用了。如果有人对数据科学世界完全陌生,我可能会建议先从软件角度学习数据,因为该领域的大多数初级数据科学家最有可能以这种方式工作。

# №3:分析视角

最后一种看待数据的方式是从分析的角度。这是更典型的科学方法,但是对于那些对软件比对科学更感兴趣的人来说,这也是一个缺点。然而,分析视角非常重要,因为它允许数据科学家将他们的数据视为特征和观察结果,而不是位和字节。为了正确理解数据,与数据和数据本身的特性建立某种联系是必不可少的。

这部分数据的一个重要方面是理解该领域内部通常使用的语言。正如我们之前在我的文章中提到的,数据科学是许多不同领域和专业知识的混搭。虽然这是它如此有趣的部分原因,但一个重要的问题是所有这些职业对不同的事物都有自己的术语。也就是说,从分析的角度来看,我们不想作为软件工程师,而是作为数据科学家来看待事物。这些不是“列”和“行”,而是特性和它们各自的观察结果。

# 结论

数据是一种复杂的工具,不用说,它是数据科学领域的一个非常大的部分。在成功构建许多项目时,理解来自多个领域的数据是绝对重要的。在一些企业环境中,有些人可能只能勉强度日,而对他们所处理的数据的每一部分只有最低限度的了解,但是,为了成为比这些人更好的数据科学家,我认为在这方面扩展一点肯定是一个好主意。非常感谢您阅读我的文章!

# 了解如何使用 Kafka Connect 建立从 PostgreSQL 到 Cassandra 的数据管道

> 原文:<https://towardsdatascience.com/data-pipeline-between-postgresql-and-cassandra-using-kafka-connect-77d807bd2f59?source=collection_archive---------16----------------------->

## 关于如何使用 Kafka Connect 进行实时数据同步的教程

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7924977319946e1909e24e5aacbfb9f7.png)

昆腾·德格拉夫在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

[Apache Kafka](https://kafka.apache.org/) 通常作为整体数据架构的核心组件,其他系统将数据注入其中。但是,Kafka(主题)中的数据只有在被其他应用程序使用或被其他系统接收时才有用。尽管使用您选择的语言和客户端 SDK 可以使用 [Kafka 生产者/消费者](https://kafka.apache.org/documentation/#api)API[构建解决方案,但是 Kafka 生态系统中还有其他选择。](https://cwiki.apache.org/confluence/display/KAFKA/Clients)

其中之一是 [Kafka Connect](https://kafka.apache.org/documentation/#connect) ,它是一个平台,以可伸缩和可靠的方式在 [Apache Kafka](https://kafka.apache.org/) 和其他系统之间传输数据。它支持几个现成的连接器,这意味着您不需要定制代码来集成外部系统与 Apache Kafka。

本文将演示如何使用 Kafka 连接器的组合来建立一个数据管道,以便将关系数据库(如 [PostgreSQL](https://www.postgresql.org/) )中的记录实时同步到[Azure Cosmos DB Cassandra API](https://docs.microsoft.com/azure/cosmos-db/cassandra-introduction?WT.mc_id=data-12969-abhishgu)。

该应用程序的代码和配置可在 GitHub repo 中获得—[https://github.com/abhirockzz/postgres-kafka-cassandra](https://github.com/abhirockzz/postgres-kafka-cassandra)

# 这是一个高层次的概述…

…本文中介绍的端到端流程。

针对 PostgreSQL 表中数据的操作(在本例中适用于`INSERT` s)将作为`change data`事件被推送到 Kafka 主题,这要感谢 [Debezium PostgreSQL 连接器](https://debezium.io/documentation/reference/1.2/connectors/postgresql.html),它是一个 Kafka Connect **source** 连接器——这是使用一种称为 **Change Data Capture** (也称为 CDC)的技术实现的。

## 变更数据捕获:快速入门

这是一种用于跟踪数据库表中行级变化以响应创建、更新和删除操作的技术。这是一个强大的功能,但只有在有办法利用这些事件日志并使其对依赖于该信息的其他服务可用时才是有用的。

[Debezium](https://debezium.io/) 是一个开源平台,构建于不同数据库中可用的变更数据捕获特性之上。它提供了一组 [Kafka Connect 连接器](https://debezium.io/documentation/reference/1.2/connectors/index.html),这些连接器利用数据库表中的行级更改(使用 CDC)并将它们转换成事件流。这些事件流被发送到 [Apache Kafka](https://kafka.apache.org/) 。一旦变更日志事件在 Kafka 中,它们将对所有下游应用程序可用。

> *这与* [*卡夫卡连接 JDBC 连接器*](https://github.com/confluentinc/kafka-connect-jdbc) 所采用的“轮询”技术不同

## 第二部分

在管道的后半部分, [DataStax Apache Kafka 连接器](https://docs.datastax.com/en/kafka/doc/kafka/kafkaIntro.html)(Kafka Connect**sink**connector)将变更数据事件从 Kafka topic 同步到 Azure Cosmos DB Cassandra API 表。

## 成分

这个例子使用 [Docker Compose](https://docs.docker.com/compose/) 提供了一个可重用的设置。这非常方便,因为它使您能够用一个命令在本地引导所有组件(PostgreSQL、Kafka、Zookeeper、Kafka Connect worker 和示例数据生成器应用程序),并允许迭代开发、实验等更简单的工作流。

> *使用 DataStax Apache Kafka 连接器的特定功能,我们可以将数据推送到多个表中。在这个例子中,连接器将帮助我们将变更数据记录持久化到两个 Cassandra 表中,这两个表可以支持不同的查询需求。*

下面是组件及其服务定义的分类——你可以参考 GitHub repo 中完整的`docker-compose`文件[。](https://github.com/abhirockzz/postgres-kafka-cassandra/blob/master/docker-compose.yaml)

*   卡夫卡和动物园管理员使用 [debezium](https://hub.docker.com/r/debezium/kafka/) 图像。
*   Debezium PostgreSQL Kafka 连接器在[Debezium/connect](https://hub.docker.com/r/debezium/connect)Docker 图片中开箱即用!
*   为了作为 Docker 容器运行,DataStax Apache Kafka 连接器是在 debezium/connect 映像之上构建的。这个图像包括 Kafka 及其 Kafka Connect 库的安装,因此添加定制连接器非常方便。可以参考 [Dockerfile](https://github.com/Azure-Samples/cosmosdb-cassandra-kafka/blob/main/connector/Dockerfile) 。
*   `data-generator`服务将随机生成的(JSON)数据植入 PostgreSQL 的`orders_info`表中。可以参考[GitHub repo](https://github.com/Azure-Samples/cosmosdb-cassandra-kafka/blob/main/data-generator/)中的代码和`Dockerfile`

## 在继续之前,

*   安装[对接器](https://docs.docker.com/get-docker/)和[对接器组合](https://docs.docker.com/compose/install)。
*   [提供 Azure Cosmos DB Cassandra API 帐户](https://docs.microsoft.com/azure/cosmos-db/create-cassandra-dotnet?WT.mc_id=data-12969-abhishgu#create-a-database-account)
*   [使用 cqlsh 或托管 shell 进行验证](https://docs.microsoft.com/azure/cosmos-db/cassandra-support?WT.mc_id=data-12969-abhishgu#hosted-cql-shell-preview)

# 首先创建 Cassandra 键空间和表

> *使用与下面*相同的键空间和表名

```
CREATE KEYSPACE retail WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1};CREATE TABLE retail.orders_by_customer (order_id int, customer_id int, purchase_amount int, city text, purchase_time timestamp, PRIMARY KEY (customer_id, purchase_time)) WITH CLUSTERING ORDER BY (purchase_time DESC) AND cosmosdb_cell_level_timestamp=true AND cosmosdb_cell_level_timestamp_tombstones=true AND cosmosdb_cell_level_timetolive=true;CREATE TABLE retail.orders_by_city (order_id int, customer_id int, purchase_amount int, city text, purchase_time timestamp, PRIMARY KEY (city,order_id)) WITH cosmosdb_cell_level_timestamp=true AND cosmosdb_cell_level_timestamp_tombstones=true AND cosmosdb_cell_level_timetolive=true;
```

# 使用 Docker Compose 启动所有服务

```
git clone https://github.com/abhirockzz/postgres-kafka-cassandracd postgres-kafka-cassandra
```

正如承诺的那样,使用一个命令来启动数据管道的所有服务:

```
docker-compose -p postgres-kafka-cassandra up --build
```

> 下载和启动容器可能需要一段时间:这只是一个一次性的过程。

检查是否所有容器都已启动。在不同的终端中,运行:

```
docker-compose -p postgres-kafka-cassandra ps
```

数据生成器应用程序将开始将数据注入 PostgreSQL 中的`orders_info`表。你也可以做快速检查来确认。使用`[psql](https://www.postgresql.org/docs/current/app-psql.html)`客户端连接到 PostgreSQL 实例...

```
psql -h localhost -p 5432 -U postgres -W -d postgres
```

> *当提示输入密码时,输入* `*postgres*`

…并查询表格:

```
select * from retail.orders_info;
```

此时,您所拥有的只是 PostgreSQL、Kafka 和一个向 PostgreSQL 写入随机数据的应用程序。您需要启动 Debezium PostgreSQL 连接器来将 PostgreSQL 数据发送到 Kafka 主题。

# 启动 PostgreSQL 连接器实例

将连接器配置(JSON)保存到文件示例`pg-source-config.json`

```
{
    "name": "pg-orders-source",
    "config": {
        "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
        "database.hostname": "localhost",
        "database.port": "5432",
        "database.user": "postgres",
        "database.password": "password",
        "database.dbname": "postgres",
        "database.server.name": "myserver",
        "plugin.name": "wal2json",
        "table.include.list": "retail.orders_info",
        "value.converter": "org.apache.kafka.connect.json.JsonConverter"
    }
}
```

要启动 PostgreSQL 连接器实例,请执行以下操作:

```
curl -X POST -H "Content-Type: application/json" --data @pg-source-config.json [http://localhost:9090/connectors](http://localhost:9090/connectors)
```

要检查 Kafka 主题中的变更数据捕获事件,请查看运行 Kafka connect worker 的 Docker 容器:

```
docker exec -it postgres-kafka-cassandra_cassandra-connector_1 bash
```

一旦您进入容器外壳,只需启动通常的 Kafka 控制台消费者进程:

```
cd ../bin./kafka-console-consumer.sh --bootstrap-server kafka:9092 --topic myserver.retail.orders_info --from-beginning
```

> *注意,根据* [*连接器约定*](https://debezium.io/documentation/reference/1.3/connectors/postgresql.html#postgresql-topic-names) ,题目名称为 `*myserver.retail.orders_info*`

*您应该会看到 JSON 格式的变更数据事件。*

*到目前为止一切顺利!数据管道的前半部分似乎在按预期工作。对于下半年,我们需要…*

# *启动 DataStax Apache Kafka 连接器实例*

*将连接器配置(JSON)保存到文件 example,`cassandra-sink-config.json`,并根据您的环境更新属性。*

```
*{
    "name": "kafka-cosmosdb-sink",
    "config": {
        "connector.class": "com.datastax.oss.kafka.sink.CassandraSinkConnector",
        "tasks.max": "1",
        "topics": "myserver.retail.orders_info",
        "contactPoints": "<Azure Cosmos DB account name>.cassandra.cosmos.azure.com",
        "loadBalancing.localDc": "<Azure Cosmos DB region e.g. Southeast Asia>",
        "datastax-java-driver.advanced.connection.init-query-timeout": 5000,
        "ssl.hostnameValidation": true,
        "ssl.provider": "JDK",
        "ssl.keystore.path": "<path to JDK keystore path e.g. <JAVA_HOME>/jre/lib/security/cacerts>",
        "ssl.keystore.password": "<keystore password: it is 'changeit' by default>",
        "port": 10350,
        "maxConcurrentRequests": 500,
        "maxNumberOfRecordsInBatch": 32,
        "queryExecutionTimeout": 30,
        "connectionPoolLocalSize": 4,
        "auth.username": "<Azure Cosmos DB user name (same as account name)>",
        "auth.password": "<Azure Cosmos DB password>",
        "topic.myserver.retail.orders_info.retail.orders_by_customer.mapping": "order_id=value.orderid, customer_id=value.custid, purchase_amount=value.amount, city=value.city, purchase_time=value.purchase_time",
        "topic.myserver.retail.orders_info.retail.orders_by_city.mapping": "order_id=value.orderid, customer_id=value.custid, purchase_amount=value.amount, city=value.city, purchase_time=value.purchase_time",
        "key.converter": "org.apache.kafka.connect.storage.StringConverter",
        "transforms": "unwrap",
        "transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState",
        "offset.flush.interval.ms": 10000
    }
}*
```

*启动连接器:*

```
*curl -X POST -H "Content-Type: application/json" --data @cassandra-sink-config.json [http://localhost:8080/connectors](http://localhost:8080/connectors)*
```

*如果一切都已正确配置,连接器将开始从 Kafka 主题向 Cassandra 表泵送数据,我们的端到端管道将开始运行。*

*很明显你会想…*

# *查询 Azure Cosmos DB*

*检查 Azure Cosmos DB 中的 Cassandra 表。如果您在本地安装了`cqlsh`,您可以简单地像这样使用它:*

```
*export SSL_VERSION=TLSv1_2 &&\
export SSL_VALIDATE=false &&\
cqlsh.py <cosmosdb account name>.cassandra.cosmos.azure.com 10350 -u <cosmosdb username> -p <cosmosdb password> --ssl*
```

*如果没有,Azure 门户中的[托管的 CQL shell](https://docs.microsoft.com/azure/cosmos-db/cassandra-support?WT.mc_id=data-12969-abhishgu#hosted-cql-shell-preview) 也相当好用!*

*以下是您可以尝试的一些查询:*

```
*select count(*) from retail.orders_by_customer;
select count(*) from retail.orders_by_city;select * from retail.orders_by_customer;
select * from retail.orders_by_city;select * from retail.orders_by_city where city='Seattle';
select * from retail.orders_by_customer where customer_id = 10;*
```

# *结论*

*总之,您学习了如何使用 Kafka Connect 在 PostgreSQL、Apache Kafka 和 Azure Cosmos DB 之间进行实时数据集成。由于样品采用基于 Docker 容器的方法,您可以根据自己的独特要求轻松定制,冲洗并重复!*

## *以下主题可能也会引起您的兴趣…*

*如果您觉得这很有用,您可能还想浏览以下资源:*

*   *[使用 Blitzz 将数据从 Oracle 迁移到 Azure Cosmos DB Cassandra API](https://docs.microsoft.com/azure/cosmos-db/oracle-migrate-cosmos-db-blitzz?WT.mc_id=data-12969-abhishgu)*
*   *[使用 Azure Databricks 将数据从 Cassandra 迁移到 Azure Cosmos DB Cassandra API 帐户](https://docs.microsoft.com/azure/cosmos-db/cassandra-migrate-cosmos-db-databricks?WT.mc_id=data-12969-abhishgu)*
*   *[快速入门:构建一个 Java 应用程序来管理 Azure Cosmos DB Cassandra API 数据(v4 驱动程序)](https://docs.microsoft.com/azure/cosmos-db/create-cassandra-java-v4?WT.mc_id=data-12969-abhishgu)*
*   *Azure Cosmos DB Cassandra API 支持的 Apache Cassandra 特性*
*   *[快速入门:用 Python SDK 和 Azure Cosmos DB 构建 Cassandra 应用](https://docs.microsoft.com/azure/cosmos-db/create-cassandra-python?WT.mc_id=data-12969-abhishgu)*

# 自动驾驶汽车试驾结果|数据管道

> 原文:<https://towardsdatascience.com/data-pipeline-for-autonomous-vehicle-test-drive-results-4eabd9b73c49?source=collection_archive---------34----------------------->

## 自动驾驶汽车已经在公共道路上行驶了数百万英里。目前为止结果如何?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/95173f5466eb7877a341d65850d3c25e.png)

来源:[晏殊·李](https://unsplash.com/@yanshulee)通过 [Unsplash](https://images.unsplash.com/photo-1599831968677-d727629073a2?ixid=MXwxMjA3fDB8MHxzZWFyY2h8Mnx8c2VsZiUyMGRyaXZpbmclMjBjYXJ8ZW58MHx8MHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=600&q=60)

你是一个自动驾驶汽车(AV)爱好者吗?你想知道 AV 发展到什么程度了吗?你是否在一家影音公司工作,想知道自己的表现与竞争对手相比如何?

没有单一的答案,没有单一的来源。挖掘法规、安全标准、市场研究、业务案例接受脉冲、独立和关联的汽车子系统报告、算法基准、测试报告、燃烧率分析,等等。

需要一个以上的职位来全面分析所有这些问题。这篇文章占了一大块。它利用公开可用的数据,以定量的方式关注 AV 道路测试报告。它为您提供了代码和指南,以便您可以开始使用 AV 试驾结果数据管道(请记住,数据不是现成的可消费格式)。最后是对未来改进的思考和基于整合数据的简要分析。

系好你的安全带,跟着读…

**公开的 AV 试驾结果数据**

虽然 Udacity、加州大学伯克利分校、Nvidia 和更多机构以专门构建的格式公开提供了大量 AV 传感器数据来试验算法,但缺乏公开提供的 AV 测试结果数据来全面评估当前状况,甚至是公共政策!AV 测试分三个阶段进行:模拟、赛道测试和道路测试。道路测试是在现场部署 AV 之前的最后一英里,监管机构会查看道路测试数据。

加州车管所公布了 AV [碰撞报告](https://www.dmv.ca.gov/portal/vehicle-industry-services/autonomous-vehicles/autonomous-vehicle-collision-reports/)和[脱离报告](https://www.dmv.ca.gov/portal/vehicle-industry-services/autonomous-vehicles/disengagement-reports/)。在 CA 持有 AV 测试许可的公司向 DMV 提交报告。安全性是反车辆地雷可行性的首要标准。碰撞报告提供了直接的见解。脱离接触报告是一个替代指标。假设是,如果 AV 已经脱离,它就没有为无人驾驶做好准备。如果安全驾驶员因为 AV 没有完全遵循他/她的想法而担心,并且他/她启动了脱离,该怎么办?如果场景在模拟中运行,结果是安全的,但没有脱离,会怎么样?关键是这些报告并非没有缺陷。

> 那评价的备选选择是什么?目前没有。**除了加州,美国没有其他州公布过此类数据。**一些州,例如[亚利桑那州](https://azdot.gov/motor-vehicles/professional-services/autonomous-vehicle-notification-and-certification/company-and)、[佛罗里达州](https://flhsmv.gov/html/HSMVAutonomousVehicleReport2014.pdf)已经在 PowerPoint 演示文稿中分享了 AV 文学。

**了解加州车管所 AV 数据管道**

数据管道的目的是以可用于分析的格式访问数据。

谁可以使用数据管道?在 AV 行业工作的开发人员可以访问特定公司的丰富数据,但缺乏其他公司的数据。他们可以用它作为基准。市场研究公司和影音爱好者也可以使用它。

是否需要数据管道?脱离报告以 excel 格式提供,可由任何分析工具获取,并且不需要数据管道。由脱离度驱动的直觉本身就是一个有争议的话题。碰撞报告实际上是一个以 pdf 格式存储的表单。每年都有数百份碰撞报告提交。手动分析数据是不可能的。

数据管道在处理不同 AV 公司在不同日期提交的数百份多页表格后,生成一个整洁的 excel 文件。以下是字段/列标题列表和字段子集上的字段值片段。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/713561d5d2f9aa8375cd392e6f70d7b0.png)

字段列表(来源:作者)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/08e7d795b011a4b6f059d82517c0e9b5.png)

字段列表(来源:作者)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b0834d4caa4f458f1f7be4f799653192.png)

字段列表(来源:作者)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6f00098babc52db1fa988202bc2a721b.png)

字段值的片段(来源:作者)

上述输出的输入是从 [CA DMV](https://www.dmv.ca.gov/portal/vehicle-industry-services/autonomous-vehicles/autonomous-vehicle-collision-reports/) 站点下载的一堆 pdf 表单文件。下面的截图显示 1) Waymo、Cruise、苹果、Zoox、Aurora 购买了优步的自动驾驶设备,以及更多提交 AV drive 崩溃报告的 AV 公司 2)先睹为快 Lyft 提交的 pdf 表格。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7d1e7a9fb44de8d30d0d69da7e873c39.png)

输入=不同公司在不同日期的 pdf 表单(来源:作者)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f2d2fe7792ae5737c4bdaee592c6dee2.png)

在 Lyft 自动驾驶实验室提交给 CA DMV 的 pdf 表格中先睹为快(来源:作者)

**数据管道入门指南**

参见 [GitHub](https://github.com/manimalakumar/Autonomous-Vehicle-CA-DMV/tree/master) 。[自述文件](https://github.com/manimalakumar/Autonomous-Vehicle-CA-DMV/blob/master/README.md)包含分步指南。

有几点值得注意。这两种光学字符识别(OCR)技术都用于从表单中提取信息,它们相互补充。

空间用于自然语言处理(NLP)。表单中有一个描述部分,如下所示。并不是所有的影音公司都以同样的方式填写。如果有,速度和相关的对象值将被捕获到 excel 的速度<n>和上下文<n>字段中。在下面的截图中:1) Waymo 填写了自动驾驶车辆的速度。2)提取速度、动词和对应的名词对象,从而实现词性依存分析。图中显示了 spaCy 文档中的图表。这是一个有趣的实验。但由于数据的不一致性和 NLP 的复杂性,这部分并不是很有成果。</n></n>

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7ba5f5212afd1c331b740ac569fedb1e.png)

Waymo 在 CA DMV 表格中输入了 19 年 2 月 21 日撞车时 AV 速度的详细信息(来源:作者)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9201c8138f5386ee1c33dcc24f9822cd.png)

使用 spaCy 的依赖解析器可视化(来源: [spaCy 开发者文档](https://spacy.io/displacy-3504502e1d5463ede765f0a789717424.svg)

**AV 测试结果数据管道的未来改进**

让某样东西工作,测试它,让它变得更好。当前版本是最低可行版本。它允许按照碰撞报告的当前格式创建一个 excel 文件。

以下是未来改进的想法:

*捕捉多选选项。举例来说,天气可能同时下雨、有雾和刮风。表格可以通过勾选所有这些选项来填写。到目前为止,没有表单选择一个以上的选项,代码只支持一个选项。*

*自动收集输入文件*。从 CA DMV 网站下载文件需要一段时间。考虑使用网络爬虫和自动下载。爬虫可以第一次运行,然后以每季度或每年的频率收集新文件。代码应该只快速增量地处理新文件。

*拥有易于维护且健壮的代码库*。CA DMV 将来可能会改变表格的格式。这一特点强调了 AV 领域对标准的需求。这将要求不可避免的代码变更。目前在图像处理和最终格式检查时需要一些人工干预。代码应该没有任何人工干预。

*NLP 识别相关信息*:如果数据和管道继续有用,最后要改进的是准确和相关的文本提取。

**结果分析一瞥**

使用数据管道生成的 excel 文件,可以进行数据分析。下面是对 2019 年数据的分析;报告了 104 起事件。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/356a3fae32b48e6ea8468cc26ee573d0.png)

CA DMV AV 碰撞报告 2019 |损坏程度|碰撞时的速度(来源:作者)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e74749a4792359112af83e70cce12b93.png)

CA DMV AV 碰撞报告 2019 |碰撞类型| AV 碰撞前的移动(来源:作者)

> 在深入分析之前,看一下数据是值得的。数据有偏差。**所有记录都属于城市道路上的撞车和自动驾驶汽车。**没有关于高速公路驾驶或大型车辆(如自动驾驶卡车和公共汽车)的数据。

速度(mph)数据不足以推断结论,因为 75%的情况下没有报告速度。

令人惊讶的是,在预碰撞阶段,自动驾驶汽车直线行驶,然后发生碰撞。AV 在崩溃前停止似乎是一个常见的场景。AV 是否预见到了碰撞并停止了?还是在停车标志前停下来被撞了?当中等强度的碰撞发生时,AV 是否试图使其变得轻微?如果是,交换是什么?为了进一步了解情况,需要访问 AV 的事件日志和情况的原因分析。

有大量的追尾事故。汽车主机厂是否应该在车尾材料上进行创新和实验?

你注意到 AV 准备就绪的好消息了吗?虽然撞车确实发生了,但 70%的撞车是轻微的。让我们以积极的态度到达终点。

# 数据管道——可重用性、可扩展性

> 原文:<https://towardsdatascience.com/data-pipelines-design-patterns-for-reusability-extensibility-3df0af020c64?source=collection_archive---------14----------------------->

## 为质量、灵活性、透明度和增长发展数据管道

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/849a9ceaf7c3a57e0a2c43845f04dac5.png)

图片:[去飞溅](https://unsplash.com/@victor_g)

设计可扩展、模块化、可重用的数据管道是一个更大的主题,与数据工程密切相关,因为这类工作涉及处理不同层的不断变化,如数据源、接收、验证、处理、安全、日志记录和监控。这些层之间的变化速度各不相同,根据管道的抽象级别和设计,它们对数据管道的影响也各不相同。在本帖中,我们将讨论横切关注点,特别是日志和监控,并讨论一些用例及模式,它们可能为在管道中构建模块化和可重用性提供基础

为了在数据管道的层中获得一些上下文,并开始映射配置,这里有一个概念性视图:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/80725b3870d5402a8f233b2c004b3cf3.png)

图:作者数据管道高级架构

这是一个简化的视图,因为这些层可以用许多不同的方式表示,但是在一个提炼的形式中,管道可以被认为是摄取、处理和结果层。对于每一层,我们可以从功能的角度来考虑,因为图像显示了功能块。块的内容根据层的要求而变化。这有助于我们从可以表示管道 DAG 的模板和配置方面进行思考。例如,下面的 yaml 配置:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c772c69948cf5cae7f74b66ccce7b512.png)

图:为 DAG 层创作概念 Yaml 配置

接收、处理和结果层可以根据需求映射到不同的记录器和监视器。例如,在接收层,文件日志可以是 S3,事件日志可以是自定义的,监视器可以是 Stackdriver 和 Redash。但是,结果层可以作为数据狗映射到事件日志数据狗和事件监视器。

如果我们采用一个通用的管道,特别是查看日志和监控,这种表示将作为 Dag 方法实现,其中日志记录器和监控器将与 Dag 代码耦合。这涉及到更多的编码,它是脆弱的,难以重用的,并且违反了 SRP、DRY、Open Closed 的设计原则,使得整个管道不稳定和不可靠。如果我们将这个问题陈述扩展到监控和日志记录之外,我们将在不同的功能块中看到类似的问题—数据质量/验证、安全性/隐私等。

当我们看到问题的相似性时,这是识别共同主题的标志。例如,这里我们有特定于 DAG 和特定于功能(日志记录、监控)的职责。此外,我们希望消除这些之间的耦合,并增加这些之间的内聚力。这给了我们足够的背景来开始考虑设计模式。参考 [*设计模式:可重用面向对象软件的元素*](https://en.wikipedia.org/wiki/Design_Patterns)*“四人帮”(Gamma 等人)。对于我们的上下文,我们将展示这些模式如何在我们的设计中发挥作用。下图显示了适用于不同层的模式的管道 DAG 的高级视图:*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/104ad0d3f449c82c2f7c02732cb7cd08.png)*

*图:适用于不同 DAG 层的作者模式*

*第一组模式是创造性的或结构性的。它们允许我们将横切关注点的创建和结构分开,例如日志记录、来自 Dag 特定区域的监控。[工厂](https://en.wikipedia.org/wiki/Factory_method_pattern)和[抽象工厂](https://en.wikipedia.org/wiki/Abstract_factory_pattern)有助于从 Dag 代码中抽象和分离不同的记录器和监视器,允许 Dag 代码库在不依赖于日志记录和监视代码库的情况下发展*

```
*from loglib import LogConfigConst
from abc import ABC, abstractmethod
from boto3 import Session

class Logger(metaclass=ABC.ABCMeta):
    @abstractmethod
    def log(self,message):
        pass

class S3Logger(Logger):
    *""" log to AWS S3 """* _initialized = False
    _instance = None
    _s3session = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(S3Logger, cls).__new__(cls, *args, **kwargs)
        return cls._instance

    def __init__(self, *args, **kwargs):
        if self._initialized:
            return
        super(S3Logger, self).__init__(*args, **kwargs)
        #get the kwarg config that has details of S3 connection params -- Region, Public Key, Secret Key
        logconfig=kwargs["logconfig"]
        logConfigConst=LogConfigConst()
        #establish s3 session, use boto3
        self.__class__._s3session=Session(aws_access_key_id=logconfig[logConfigConst.AWS_ACCESS_KEY_ID],
                                          aws_secret_access_key=logconfig[logConfigConst.AWS_SECRET_ACCESS_KEY],
                                          region_name=logconfig[logConfigConst.AWS_REGION])
        self.__class__._initialized = True

    @classmethod
    def log(cls, message):
        #log to S3
        return*
```

**显示 Logger 和 LogFactory 类示例的代码示例:**

```
*class LogFactory:
    _dictlogger={}
    @classmethod
    def create_logger(config):
        logger=None
        if config.name == LogConfigConst.filelog.names.S3:
            logger=S3Logger(logconfig=config)
        elif config.name == LogConfigConst.eventlog.names.DataDog:
            logger=DataDogLogger(logconfig=config)
        elif config.name == LogConfigConst.databaselog.names.PostGresDB:
            logger=PostGresDBLogger(logconfig=config)
        return logger
    @classmethod
    def get_logger(cls,config):
        if cls._dictlogger[config.name] is None:
            cls.dict_logger[config.name] = cls.create_logger(config)
        return cls.dict_logger[config.name]*
```

*第二组模式是行为模式。它们允许我们在保持 SRP、DRY 和 SOLID 原则的同时指定行为。[装饰器](https://en.wikipedia.org/wiki/Decorator_pattern)模式广泛用于修改或添加现有函数的行为。正如我们在下面看到的,日志记录和监控是直接适用的。*

```
*import functools,sys,traceback
from loglib import LoggingFacade

class LoggingDecorator:

    def __init__(self,config):
        self.logFacade=LoggingFacade(config_template=config)

    def log_error(self,func=None):
        def error_log(func):
            @functools.wraps(func)
            def wrapper(*args, **kwargs):
                try:
                    # Execute the called function
                    return func(*args, **kwargs)
                except Exception as e:
                    error_msg = 'And error has occurred in '.join(func.__name__)
                    self.logFacade.log_filestore(error_msg)
                    raise e
            return wrapper
        return error_log

@LoggingDecorator.log_error
def push_exception_to_xcom(kwargs):
    *"""To push exception occuring from dag task to xcom ; this will be used in alert/reporting"""* exc_type, exc_value, exc_traceback = sys.exc_info()
    exception_details= ''.join(traceback.format_exception(etype=type(exc_type),value=exc_value, tb=exc_traceback))
    kwargs['ti'].xcom_push(key='exception_details', value=exception_details)*
```

**显示 LoggingDecorator 示例的代码示例:**

*当客户端或消费者需要更窄或特定的 api 时, [Facade](https://en.wikipedia.org/wiki/Facade_pattern) 模式非常有用。例如,由不同的记录器和监视器展示的 api 或方法的广泛集合不需要向 Dag 层展示。Facade 模式有助于定义对日志记录、监控层的访问或接口,如下所示*

```
*from loglib import LogConfigConst
from loglib.LoggerFactory import LogFactory

class LoggingFacade:
    _file_logger, _event_logger, _database_logger = None
    _initialized = False
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(LoggingFacade, cls).__new__(cls, *args, **kwargs)
        return cls._instance

    def __init__(self, *args, **kwargs):
        if self._initialized:
            return
        super(LoggingFacade, self).__init__(*args, **kwargs)
        #get the kwarg config that has config for all the loggers
        config=kwargs["config_template"]
        logconfig=LogConfigConst()
        for conf in config.loggers:
            if conf.type == logconfig.FILELOG:
                self.__class__._file_logger = LogFactory().get_logger(conf)
            elif conf.type == logconfig.EVENTLOG:
                self.__class__._event_logger = LogFactory().get_logger(conf)
            elif conf.type == logconfig.DATABASELOG:
                self.__class__._database_logger = LogFactory().get_logger(conf)
        self.__class__._initialized = True

    #filestore could be S3 or other providers
    @classmethod
    def log_filestore(cls,message):
        cls._file_logger.log(message)

    #event logger could be DataDog or other providers
    @classmethod
    def log_event(cls,message):
        cls.event_logger.log(message)

    @classmethod
    def log_database(cls,message):
        cls.database_logger.log(message)*
```

**显示 LoggingFacade 示例的代码示例:**

*当我们组合这些模式时,我们意识到设计原则的好处,因为职责的分离允许在多个级别上模块化代码库:Dag 级别、横切关注点级别(用于监控、日志记录的单独的包)、跨 Dag 级别(公共模板可以被抽象为例如领域特定的)。这提供了构建模块,用于将数据管道一般化,从编写定制代码转移到更通用的模块、模板、配置。不同的部分遵循它们的开发周期和部署包,与 Dag 代码库完全分离。虽然添加这些设计原则确实增加了抽象性和某种程度的复杂性,但是这对于在保持质量和速度的同时扩大管道开发来说是一个很小的代价*

*尽管数据工程领域在不断发展,DAG 管道设计和架构也面临着一系列挑战,但仍有一些关键原则可用于提高管道的稳定性、可靠性和可维护性。我希望您喜欢阅读这篇文章,并找到一些有用的信息应用到您的数据工程计划中。我期待您的评论和反馈。*

# 数据管道:什么,为什么,哪些

> 原文:<https://towardsdatascience.com/data-pipelines-what-why-and-which-ones-1f674ba49946?source=collection_archive---------9----------------------->

## 不同管道框架如何相互关联的示例和解释

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bd3e5b3ed905eeac67f9186c251fa19e.png)

克林特·王茂林在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

如果您在数据科学领域工作,您可能会在各种文章和教程中不断看到术语“数据管道”。您可能还注意到,术语“管道”可以指代许多不同的事物!有跨越 IT 堆栈不同部分的管道,特定工具的管道,以及特定代码库中的管道。例如,我工作的公司 UbiOps 也提供自己的管道形式。

跟踪所有这些不同的管道是什么,以及它们彼此之间有什么不同,可能会非常令人困惑。在本文中,我们将列出并比较一些常见的管道,并阐明 UbiOps 管道在总体情况中的位置。

# 什么是数据管道?

让我们从头开始,什么是数据管道?总的来说,数据流水线就是简单的**对数据执行的自动化操作链**。它可以将数据从 A 点带到 B 点,它可以是从多个来源聚合数据并将其发送到某个数据仓库的流程,或者它可以对检索到的数据执行某种类型的分析。基本上,数据管道有多种形状和大小。但是它们都有三个共同点:它们是自动化的,它们引入了可重复性,并且有助于将复杂的任务分解成更小的、可重用的组件。

您可能熟悉 **ETL** ,或者它的现代对应物 **ELT** ,它们是常见的数据管道类型。ETL 代表*提取、转换、加载*,它就是这样做的。ELT 管道提取、加载,然后才进行转换。它们是许多处理数据的公司使用的通用管道模式。尤其是当他们处理需要存储在数据仓库中的来自不同来源的数据时。ETL 或 ELT 管道是数据管道的子集。换句话说,每个 ETL/ELT 管道都是数据管道,但不是每个数据管道都是 ETL 或 ELT 管道。

在数据管道的另一端,我们有更侧重于分析的管道。这些通常出现在数据科学项目中。它们是处理传入数据的管道,这些数据通常已经以某种方式进行了清理,以提取洞察力。它不仅仅是加载和转换数据,而是对数据进行分析。

数据管道不局限于这种或那种类型,它更像一个光谱。一些管道完全专注于 ETL 端,另一些专注于分析端,还有一些两者兼而有之。建立数据管道有许多不同的方法,但最终最重要的是它要符合你的项目需求。

# 为什么需要数据管道?

好了,我们已经讨论了什么是数据管道,但是也许你仍然想知道它们的额外好处是什么。毕竟建立管道需要时间。出于几个原因,我可以保证这段时间花得很值。

首先,自动化管道最终会节省您的时间,因为您不必手动地一遍又一遍地做同样的事情。它允许您在可重复的任务上节省时间,因此您可以将更多的时间分配给项目的其他部分。

不过,使用自动化管道最重要的原因可能是,您需要思考、计划并在某个地方写下您计划放入管道的整个流程。换句话说:它迫使你预先做一个设计,并考虑必需品。反思过程并记录下来对于防止错误和允许多人使用管道非常有用。

此外,管道允许您将一个大的任务分成更小的步骤。这提高了效率、可扩展性和可重用性。这有助于针对他们必须做的事情优化不同的步骤。例如,有时不同的框架或语言更适合管道的不同步骤。如果它是一个大的脚本,你将不得不坚持一个,但是使用大多数管道工具,你可以为管道的每个单独部分选择最好的框架或语言。

最后,管道引入了再现性,这意味着几乎任何人、几乎任何地方都可以再现结果(当然,如果他们可以访问数据的话)。这不仅引入了安全性和可追溯性,还使调试变得更加容易。每次运行管道的过程都是相同的,所以每当出现错误时,您可以轻松地追溯步骤,并找出错误出在哪里。

# UbiOps 管道在这幅图中是怎样的?

如果你熟悉 [UbiOps](https://ubiops.com/product/) ,你会知道 ubi ops[也有流水线功能](https://ubiops.com/docs/pipelines/)。UbiOps 管道是模块化工作流,由称为**部署**的对象组成。每个部署都为 UbiOps 中的一段 Python 或 R 代码提供服务。每个部署都有自己的 API 端点,并根据使用情况进行动态扩展。通过管道,您可以将部署连接在一起,以创建更大的工作流。这种设置有助于模块化,允许您将应用程序分成小的独立部分,以便随着时间的推移构建更强大的软件。UbiOps 将负责这些部署之间的数据路由,整个管道将通过自己的 API 端点公开,供您使用。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2279c79bc41561bb05f508913c6bd5ea.png)

UbiOps 中的管道截图,图片由作者提供

当我们回顾我之前讨论的管道频谱时,UbiOps 更多地是在分析方面。最终,无论您在代码中指定什么,您都可以使用 UbiOps 管道,但它更多地意味着数据处理和分析,而不是在其他技术之间路由数据。

# 不同管道框架的比较

正如我前面提到的,有很多不同的管道框架,都有各自的优点和用例。在数据科学领域不断出现的几个例子是:Luigi、Airflow、scikit-learn 管道和 Pandas 管道。让我们看看它们的异同,并检查它们与 UbiOps 管道的关系。

Luigi 是 Spotify 为其数据科学团队打造的,用于构建数千个任务的长期运行管道,这些任务跨越数天或数周。它旨在帮助将任务整合到流畅的工作流程中。这是一个基于 Apache 的开源许可的 [Python 包。](https://github.com/spotify/luigi)

Luigi 的目的是解决通常与长时间运行的批处理相关的所有问题,其中许多任务需要链接在一起。这些任务可以是任何事情,但通常是长时间运行的事情,如 Hadoop 作业、向/从数据库转储数据或运行机器学习算法。

Luigi 有 3 个步骤来构建管道:

*   `requires()`定义任务之间的依赖关系
*   `output()`定义了任务的目标
*   `run()`定义每个任务执行的计算

在 Luigi 中,任务与提供给它们的数据错综复杂地联系在一起,这使得创建和测试一个新任务变得困难,而不仅仅是将它们串在一起。由于这种设置,也很难更改任务,因为您还必须单独更改每个相关任务。

**air flow** [air flow](https://airflow.apache.org/)最初是由 AirBnB 创建的,旨在帮助他们的数据工程师、数据科学家和分析师掌握建设、监控和改造数据管道的任务。气流是一个非常通用的系统,能够处理各种工具的气流。Airflow 将工作流定义为有向无环图(Dag),任务是动态实例化的。

气流围绕着:

*   **钩子**,是连接外部平台的高级接口(如 [Postgres 钩子](https://airflow.apache.org/docs/apache-airflow/1.10.6/_api/airflow/hooks/postgres_hook/index.html))
*   **操作符**,它们是成为 DAG 节点的预定义任务
*   **执行者**(通常是[芹菜](https://docs.celeryproject.org/en/stable/))远程运行作业,处理消息队列,并决定哪个工人将执行每个任务
*   **调度器**,负责触发预定的工作流,以及将任务提交给执行器运行。

有了气流,就有可能创建高度复杂的管道,这是很好的编排和监测。对于 Airflow 来说,最重要的因素是它与其他系统(如数据库、Spark 或 Kubernetes)良好连接的能力。

然而,气流的一个大缺点是它陡峭的学习曲线。要很好地利用气流,你需要 DevOps 知识。一切都是高度可定制和可扩展的,但是以简单性为代价。

**scikit-learn 管道** [scikit-learn 管道](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)与 Airflow 和 Luigi 有很大不同。它们不是编排不同服务的大型任务的管道,而是一个可以让您的数据科学代码更加清晰、更具可重复性的管道。scikit-learn 管道是 scikit-learn Python 包的一部分,该包在数据科学领域非常流行。

scikit-learn 管道允许您连接一系列转换器,后跟一个最终估计器。通过这种方式,您可以将模型训练或数据处理等特定步骤连接在一起。借助 scikit-learn pipelines,您的工作流程变得更加易于阅读和理解。正因为如此,发现数据泄露这样的事情也变得容易多了。

但是请记住,scikit-learn 管道只能与 scikit-learn 库中的转换器和估算器一起工作,并且它们需要在相同的运行时中运行。因此,这些管道与您在 Airflow 或 Luigi 中创建的编排管道非常不同。例如,使用 Airflow 或 Luigi,您可以在不同的工作节点上运行管道的不同部分,同时保持一个控制点。

熊猫管道
[熊猫管道](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pipe.html)是特定 Python 包管道的另一个例子,在本例中是熊猫。Pandas 是一个流行的数据分析和操作库。你的数据分析变得越大,你的代码也会变得越乱。Pandas 管道提供了一种清理代码的方法,允许您在一个函数中连接多个任务,类似于 scikit-learn 管道。

Pandas pipes 有一个标准:所有的步骤都应该是一个函数,一个数据框作为参数,一个数据框作为输出。只要遵循这个标准,您可以根据需要添加任意多的步骤。您的函数可以在数据帧后面带额外的参数,这些参数也可以传递给管道。

按照数据帧进,数据帧出的原则,Pandas 管道非常多样化。就用例而言,它们与 scikit-learn 管道相当,因此也与 Airflow 和 Luigi 有很大不同。它们也可能是管道,但类型完全不同。

**对比** 很明显,所有这些不同的管道都适合不同类型的用例,甚至可以很好地结合使用。例如,完全有可能在 UbiOps 管道的部署中使用 Pandas 管道,以这种方式结合它们的优势。让我们把前面提到的管道并排放在一起,勾勒出更大的图景。

在管道频谱中,Luigi 和 Airflow 位于更高级别的软件编排端,而 Pandas 管道和 scikit-learn 管道位于特定分析的代码级别,UbiOps 位于两者之间。Luigi 和 Airflow 是创建跨堆栈中多个服务的工作流或在不同节点上调度任务的绝佳工具。Pandas 管道和 scikit-learn 管道对于更好的代码可读性和更具重现性的分析来说是非常棒的。UbiOps 非常适合在 Python 或 r 中创建分析工作流。

UbiOps、Airflow 和 Luigi 之间有一些重叠,但它们都面向不同的用例。UbiOps 面向数据科学团队,他们需要以最少的开发运维麻烦将其分析流程投入生产。Luigi 面向长时间运行的批处理过程,其中许多任务需要链接在一起,这些任务可能持续几天或几周。最后,气流是三者中最通用的,允许您监控和协调复杂的工作流,但以简单性为代价。随着其多功能性和功能的增加,也带来了很多复杂性和陡峭的学习曲线。

scikit-learn 和 Pandas 管道实际上无法与 UbiOps、Airflow 或 Luigi 相提并论,因为它们是专门为这些库设计的。scikit-learn 和 Pandas 管道实际上可以与 UbiOps、Airflow 或 Luigi 结合使用,只需将它们包含在这些管道中各个步骤的代码运行中即可!

# 结论

数据管道是将自动化、可再现性和结构化引入项目的一个很好的方式。有许多不同类型的管道,每一种都有自己的优点和缺点。希望这篇文章有助于理解所有这些不同的管道是如何相互关联的。

# 使用 Apache Beam 的数据管道

> 原文:<https://towardsdatascience.com/data-pipelines-with-apache-beam-86cd8eb55fd8?source=collection_archive---------2----------------------->

## 利用 Beam 实施大数据

## 如何借助 Beam 实现数据管道

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b376856a27aa6c7ce1216f15145bbe6d.png)

[来源](https://pixabay.com/photos/binary-binary-code-binary-system-2910663/)

[Apache Beam](https://beam.apache.org/) 是 Apache 的最新项目之一,这是一个整合的编程模型,用于表达高效的数据处理管道,正如 Beam 的主网站[ [1](https://beam.apache.org/) 所强调的那样。在本文中,我们将更深入地研究这个特定的数据处理模型,并探索它的数据管道结构以及如何处理它们。此外,我们还将举例说明。

# 什么是阿帕奇光束

Apache Beam 可以表示为分布式数据处理的编程模型[ [1](https://beam.apache.org/) ]。它只有一个 API 来处理数据集和数据帧这两种类型的数据。当您建立束管线时,您并不关心您所建立的管线类型,无论您是建立批次管线还是串流管线。

就其侧面而言,顾名思义,它可以调节到任何位置。在 Beam 上下文中,这意味着开发您的代码并在任何地方运行它。

## 装置

要在 Python 中使用 Apache Beam,我们首先需要安装 Apache Beam Python 包,然后将其导入到其网页[ [2](https://beam.apache.org/get-started/quickstart-py/) ]上描述的 [Google Colab](https://research.google.com/colaboratory/faq.html) 环境中。

```
! pip   install apache-beam[interactive]
import   apache_beam as beam
```

## 什么是管道

管道通过改变输入来封装信息处理任务。

## Apache Beam 的体系结构

在本节中,将介绍 Apache Beam 模型的体系结构、它的各种组件以及它们的作用。主要是用于合并处理的 Beam 概念,这是 Apache Beam 的核心。Beam SDKs 是用户可以用来创建管道的语言。用户可以选择自己喜欢的、舒适的 SDK。随着社区的发展,新的 SDK 正在被整合。

一旦用任何支持的语言定义了管道,它将被转换成通用语言标准。这种转换由一组运行程序 API 在内部完成。

我想提一下,这种通用格式并不完全是语言通用的,但我们可以说是部分通用的。这种转换只是概括了核心转换的基本内容,这些内容对于所有人来说都是通用的,如映射函数、分组和过滤。

对于每个 SDK,都有一个相应的 SDK 工作人员,他们的任务是理解特定于语言的东西并解决它们。这些工人提供了一个一致的环境来执行代码。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/125ab4f4a6841eb7efa16e373de04845.png)

来源:图片由作者提供

对于每种语言的 SDK,我们都有一个特定的 SDK 工作人员。所以现在,如果我们有这个 runner 或 Beam API 和特定于语言的 SDK 工作器,我们使用哪个 Runner 就无关紧要了。任何跑步者都可以执行其指南页[ [4](https://beam.apache.org/contribute/runner-guide/) ]上提到的相同代码。

# 阿帕奇波束的特点

阿帕奇波束包括四个基本特征:

*   管道
*   p 集合
*   p 转换
*   跑步者

`Pipeline`负责读取、处理和保存数据。这整个循环是一个从输入开始直到输出的整个循环的管道。每个 Beam 程序都能够生成一条流水线。

光束的第二个特征是一个`Runner`。它决定了这条管道将在哪里运行[ [5](https://beam.apache.org/contribute/runner-guide/) ]。

光束的第三个特征是`PCollection`。它相当于 Spark 中的 RDD 或数据帧。管道通过从数据源读取数据来创建一个`PCollection`,之后,随着 PTransforms 被应用于它,更多的 PCollections 继续发展[ [6](https://beam.apache.org/documentation/programming-guide/) ]。

每个`PCollection`上的`PTransform`都会产生一个新的`PCollection`,使其不可改变。构造后,您将无法配置 PCollection 中的单个项目。在`PCollection`上的转换将产生一个新的`PCollection`。`PCollection`中的特征可以是任何类型,但必须是同一类型。然而,为了保持分布式处理,Beam 将每个元素编码为一个字节串,以便 Beam 可以将项目传递给分布式工作器,如其编程页面[ [6](https://beam.apache.org/documentation/programming-guide/) 中所述。

Beam SDK 包还作为所用类型的编码机制,支持自定义编码。此外,PCollection 不支持粒度操作。因此,我们不能对 PCollection 中的某些特定项目应用转换。我们使用所有的转换来应用于整个`PCollection`而不是某些方面[ [6](https://beam.apache.org/documentation/programming-guide/) ]。

通常,当读取或添加项目时,源通常会为每个新元素分配一个时间戳。如果`PCollection`持有有界数据,我们可以强调每个特性都将被设置为相同的时间戳。您可以显式指定时间戳,或者 Beam 将提供自己的时间戳。在任何情况下,如果源没有为我们指定时间戳,我们可以手动为元素指定时间戳。

光束的第四个特征是`PTransform`。它将一个样本`PCollection`作为数据源,并生成一个带有时间戳的相同的 PCollection。它们并行操作,同时进行诸如开窗、分配水印等操作。

# 梁的管道结构

在本节中,我们将使用 Python 实现 Beam 的管道结构。第一步从“给管道分配一个名称”开始,这是一行强制代码。

```
pipeline1 = beam.Pipeline()
```

第二步是通过读取任何文件、流或数据库来“创建”初始的`PCollection`。

```
dept_count = ( 
 **pipeline1**
 |beam.io.ReadFromText(‘/content/input_data.txt’)
 )
```

第三步是根据您的使用案例“应用”`PTransforms`。我们可以在这个管道中使用几个转换,每个转换都由管道操作符应用。

```
dept_count = (
 **pipeline1**
 |beam.io.ReadFromText(‘/content/input_data.txt’)
 **|beam.Map(lambda line: line.split(‘,’))
 |beam.Filter(lambda line: line[3] == ‘Backend’) 
 |beam.Map(lambda line: (line[1], 1))
 |beam.CombinePerKey(sum)**
 )
```

要请求一个转换操作,您需要对输入`PCollection`实现它。对于每个转换,都存在一个非专有的应用方法。我们可以通过`. apply '或`| '管道运算符来使用 apply 操作。

在所有转换之后,第四步是将最终的`PCollection`写入外部源。它可以是文件、数据库或流。

```
dept_count = (
 **pipeline1**
 |beam.io.ReadFromText(‘/content/input_data.txt’)
 |beam.Map(**lambda** line: line.split(‘,’))
 |beam.Filter(lambda line: line[3] == ‘Backend’) 
 |beam.Map(**lambda** line: (**line**[1], 1))
 |beam.CombinePerKey(sum)
 **|beam.io.WriteToText(‘/content/output_data.txt’)** 
 )
```

最后一步是运行管道。

```
pipeline1.run()
```

# 用 Python 生成变换操作

转换是每个数据处理结构的基本元素。Apache Beam 包含内置的转换,可以很容易地用封闭的形式应用,如 Beam 的主编程文档[ [6](https://beam.apache.org/documentation/programming-guide/) 中所述。让我们在接下来的章节中介绍这些转换。

## 从文本中读取

Beam 支持多种文件格式的“读”和“写”操作,如文本、 [Avro](https://avro.apache.org/) 、 [Parquet](https://parquet.apache.org/documentation/latest/) 。第一个转换是“ReadFromText”。这种格式将文本文件解析为换行符分隔的元素,这意味着默认情况下,文件中的每一行都将被视为单个元素。“ReadFromText”共有六个参数可供编辑,如果您希望在读取 Beam 的包模块页面[ [7](https://beam.apache.org/releases/pydoc/2.6.0/apache_beam.io.textio.html) ]上列出的文件时有完全的控制权。让我们来看看这些参数。

```
import apache_beam as beam
 reading = beam.Pipeline()

 content_read = (
 reading 
 **|beam.io.ReadFromText(‘/content/input_data.txt’)**
 |beam.io.WriteToText(‘/content/output_data.txt’)
 )

 reading.run()
```

首先是`file_pattern`。它指定输入文件的完整路径。当从一个目录中读取多个文件时,我们可以用*操作符来设置它。这个路径意味着它将读取所有以 input 关键字开始的文件。

第二个参数是`minimum_bundle_size`。此参数指定将源拆分成束时应该生成的束的最小大小。一个 PCollection 在内部被分成许多批,称为 bundle[[8](https://beam.apache.org/documentation/runtime/model/)]。它们在不同的机器上并行处理。这个参数的值决定了 PCollection 的最小包大小,它的参数应该是一个整数值。

第三个参数是`compression_type`。它处理压缩的输入文件,以防输入文件被压缩。我们不提供,因为 Beam 将使用提供的文件路径的扩展名来检测输入文件的压缩类型。例如,如果我们有一个. gzip 文件,那么输入路径将从这个路径检测压缩类型。但是,如果您希望自己处理压缩的输入文件,您可以显式地提供压缩类型。

第四个参数是`strip_trialing_newlines`,一个布尔字段。它指示源是否应该移除换行符。如果设置为“真”,则结束行被移除并且不被读取。如果设置为“假”,则不绘制结束线,并作为空行读取。默认情况下,其值为“True”。

第五个参数是`validate`。它还是一个布尔标志,用于确认文件在管道创建期间是否存在。如果设置为“真”,它将控制输入文件是否存在。如果没有创建管道,那么 Beam 将抛出一个错误。如果设置为“false ”, Beam 不检查文件是否存在,而是生成管道。在这种情况下,您将看到空的输出文件。建议将该参数设置为“真”。因此,其默认值为“True”。

最后一个参数是`skip_header_lines`。它帮助处理加载了头文件的文件。我们不希望处理标题,所以我们可以使用此参数跳过阅读它们。您可以在输入文件中提供想要忽略的行数。

## 从 Avro 读取

此操作用于读取一个或一组 Avro 文件。它有四个参数。`ReadFromAvro`的前三个参数与 ReadFromText 的参数相同。它的第四个不同的参数是“use_fastavro”。该参数接受一个布尔值,以从 Avro 文件[ [7](https://beam.apache.org/releases/pydoc/2.6.0/apache_beam.io.textio.html) ]中读取数据。由于该参数是强制性的,`ReadFromAvro`应将其设置为‘真’以使用该库。

```
import apache_beam as beam
import avro.schema
from avro.datafile import DataFileReader, DataFileWriter
from avro.io import DatumReader, DatumWriter

from apache_beam.io import ReadFromAvro
from apache_beam.io import WriteToAvro

schema = avro.schema.parse(open(“parquet_file.parqet”, “rb”).read())

parquet_write = beam.Pipeline()
 content_4 = ( parquet_write
 |beam.Create({‘dict1’:[24,45,68],’dict2':[32,54,75]})
 |beam.Map(lambda **element**: element)
 |beam.io.WriteToAvro(‘/content/output.avro’,schema=schema))

parquet_write.run()
```

# 阅读拼花地板

第三个输入变换是`ReadFromParquet`。该操作受益于读取拼花文件。前三个参数是与`ReadFromText`相同的参数,第四个是“columns”。该参数指定了`ReadFromParquet`将从输入文件[ [8](https://beam.apache.org/releases/pydoc/2.11.0/apache_beam.io.parquetio.html) ]中读取的列列表。

```
import apache_beam as beam
import pandas as pd
import pyarrow
from apache_beam.options.pipeline_options import PipelineOptions

parquet_data = pd.read_parquet(‘/content/parquet_data.parquet’, engine=’pyarrow’)parquet_schema = pyarrow.schema([])

schema_map = {
 ‘STRING’: pyarrow.string(),
 ‘FLOAT’: pyarrow.float64(), 
 ‘STRING’: pyarrow.string(),
 ‘DATE’: pyarrow.date64()
}

for item in parquet_data.schema:
parquet_schema = parquet_schema.append(pyarrow.field(item.name, schema_map[item.field_type]))

parquet_write = beam.Pipeline()
content = ( parquet_write |beam.beam.io.ReadFromParquet(‘/content/parquet_data.parquet’)
|beam.io.parquetio.WriteToParquet(‘/content/output5.parquet’,schema=parquet_schema))

parquet_write.run()
```

## 从 TFRecord 读取

拼花之后,最后一个文件 I/O 是`ReadFromTFRecord`。该操作读取 TensorFlow 记录。TFRecord 格式是一种用于存储二进制形式序列的简单格式。这些记录之所以出名,是因为它们被序列化,因此在网络上传输速度更快。这种格式还有助于捕捉任何数据预处理。要读取 TensorFlow 记录,我们有`ReadFromTFRecord` [ [9](https://beam.apache.org/releases/pydoc/2.11.0/apache_beam.io.tfrecordio.html) 。它有一个包含四个参数的列表。

它的三个参数与以前的类型相同。其他参数包括指定用于解码每个 TFRecord 的“编码器”名称的“编码器”。

这些是各种基于文件的读取转换。

```
import apache_beam as beam
from apache_beam.io.tfrecordio import ReadFromTFRecord
from apache_beam import coders

reading_tf = beam.Pipeline()
data_path = ‘/content/input_data’

content_read = (
reading_tf 
|beam.io.ReadFromTFRecord(data_path, coder=beam.coders.BytesCoder(), 
compression_type=’auto’, validate=True) |beam.io.WriteToText(‘/content/output_tfrecord.txt’)
 )reading_tf.run()
```

## 从 PubSub 读取

下一个主题是从消息队列中读取。梁整体支持[阿帕奇卡夫卡](https://kafka.apache.org/)、[亚马逊 Kinesis](https://aws.amazon.com/kinesis/) 、 [JMS](https://www.oracle.com/technical-resources/articles/java/intro-java-message-service.html) 、 [MQTT](https://mqtt.org/) 、 [Google Cloud PubSub](https://cloud.google.com/pubsub/docs) 。 [Java](https://www.java.com/download/) 支持其中的每一种;但是,Python 只支持 Google Cloud PubSub。我们有一个转换操作。它有一个大约五个参数的列表,如下所示。

```
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
import os
from apache_beam import windowproject = 'SubscribeBeam'
pubsub_topic = 'projects/qwiklabs-gcp-01-7779ab5fa77e/topics/BeamTopic'path = "C:\\Users\ersoyp\qwiklabs-gcp-01-7779ab5fa77e-2d40f7ded2a8.json"os.environ["GOOGLE_APPLICATION_CREDENTIALS"]=path  

input_file = "C:\\Users\ersoyp\data.csv"output_file = "C:\\Users\ersoyp\output.csv"
options = PipelineOptions()options.view_as(StandardOptions).streaming = Trueprocess = beam.Pipeline(options=options)output_file = '/content/outputs/'pubsub_data = ( process
                | 'Read from PubSub' >> beam.io.ReadFromPubSub(subscription= input_file)
                | 'Write to PubSub' >> beam.io.WriteToPubSub(output_file)
              )
final_file = process.run()
```

第一个参数是`topic`。对于这个参数,我们必须提供主题名称。然后,我们指定要发布的消息,Beam 将从这些消息中读取,如数据流文档[ [9](https://cloud.google.com/pubsub/docs/pubsub-dataflow) 中所述。

第二个参数是`subscription`。现有的发布-订阅订阅附加到特定的主题。以上两个参数是相互矛盾的。在这种情况下,我们提供一个主题作为参数。

第三个参数是`id_label`。它指定传入 PubSub 消息的哪个属性应被视为 Beam 的模块页面[ [10](https://beam.apache.org/releases/pydoc/2.8.0/_modules/apache_beam/io/gcp/pubsub.html) ]中指定的记录标识符。设置后,该属性的值将用于消息的重复数据删除。否则,如果不提供,Beam 将不保证数据的唯一性。

第四个参数是`with_attributes`。这是一个布尔型字段。如果设置为“True ”,则输出元素将是 objects 类型。如果设置为“False ”,输出元素将为字节类型。默认情况下,该参数设置为“假”[ [10](https://beam.apache.org/releases/pydoc/2.8.0/_modules/apache_beam/io/gcp/pubsub.html) ]。

最后一个参数是`timestamp_attribute`。因为 Beam 中的每个元素都附有时间戳。该参数是从 PubSub 转换中读取的,用于从 Google Cloud PubSub [ [10](https://beam.apache.org/releases/pydoc/2.8.0/_modules/apache_beam/io/gcp/pubsub.html) ]中提取消息。

## 创建转换

为了生成我们的数据,Beam 支持创建转换操作。我们可以生成各种形式的数据,如列表、集合、字典等。创建转换将在下面的示例中显示“创建转换”操作的一些状态。我们将简单地使用 create 生成数据,并将其写入输出文件。

要生成元素列表,请使用' beam.Create ',然后使用方括号,在方括号内,您可以指定用逗号分隔的项目。在下面的示例中,我们没有对生成的数据应用任何转换。

```
import apache_beam as beamcreate_transform = beam.Pipeline()content = (**create_transform**
            |beam.Create(['Beam create transform'])
            |beam.io.WriteToText('/content/outCreate1.txt')
          )create_transform.run()
```

作为第二个例子,可以创建一个列表。为此,我们生成一个数字列表。管线段应该在直线的最开始,前面没有空格。当我们创建管道或预期的缩进时,情况也是如此。它是无缩进的。

```
import apache_beam as beam

create_transform_2 = beam.Pipeline()

content_2 = (create_transform_2
            |beam.Create([10,22,38,47,51,63,78])
            |beam.io.WriteToText('/content/output2.txt')
           )create_transform_2.run()
```

如果您想要两列或更多列的数据,那么传递一个元组列表。它是一个键值元组。如果在元组中进一步应用映射转换,每个元素都表现为一个单独的列。

```
import apache_beam as beam

create_transform_3 = beam.Pipeline()

content_3 = (create_transform_3
 |beam.Create([(“DataScience”,10), (“DataEngineering”,20),(“ArtificialIntelligence”,30), (“BigData”,40)])
 |beam.io.WriteToText(‘/content/output3.txt’)
)create_transform_3.run()
```

对于字典,可以传递键值对。对于键值对,你用花括号传递它们。您可以使用圆形、方形和花括号来生成各种形式的数据。使用这些括号的不同组合,你会得到额外的数据。它在“beam.Create”操作的帮助下创建一个变换。

```
import apache_beam as beam

create_transform_4 = beam.Pipeline()content_3 = ( create_transform_4
       |beam.Create({'dict1':[24,45,68],'dict2':[32,54,75]})
       |beam.Map(lambda element: element)
       |beam.io.WriteToText('/content/output4.txt'))

create_transform_4.run()
```

## 写入文本

`WriteToText`将 PCollection 的每个元素作为一行写入输出文件。

第一个参数是`file_path_prefix`。它指定写入 PCollection 的文件路径。如果我们将其定义为一个参数,那么 Beam 将生成文件或者数据目录[ [11](https://beam.apache.org/releases/pydoc/2.1.0/apache_beam.io.html) ]中的项目。

```
beam.io.WriteToText(‘/content/output.txt’)
```

`num_shards`和`file_path_suffix`是第二个和第三个参数。我们文件的全名如下所示。

```
<prefix><num_shards><suffix>content-0000-of-0001-departments
```

第一部分,“内容”是一个前缀。第二个“0001 的 0000”属于“碎片数”。此参数指定作为输出写入的碎片数或文件数。如果我们将“number_of_shards”参数设置为 3,那么我们得到的文件将由 3 部分组成。当我们不设置这个参数时,服务将决定最佳碎片。

在本例中,“部门”代表由名为“文件名后缀”的参数控制的后缀。

第四个参数是`append_trailing_newlines`。此参数接受一个布尔值,该值指示输出文件是否应该在写入每个元素后写入一个换行符。即输出文件是否应该用换行符分隔。默认情况下,它被设置为“真”[ [12](https://beam.apache.org/releases/pydoc/2.16.0/apache_beam.io.textio.html) ]。

第五个参数是`coder`。它指定了用于编码每一行的编码器名称。

第六个参数是`compression_type`,一个字符串值。此参数用于处理压缩输出文件。

第七个参数是`header`。它指定一个字符串作为头写在输出文件的开头。

## 写信给 Avro

`WriteToAvro`的参数包括`file_path_prefix`、`file_path_suffix`、`num_shards`、`compression_type`,如刚才对`WriteToText`的解释。

```
import apache_beam as beam
from avro import schema
import avro
from apache_beam.io import ReadFromAvro
from apache_beam.io import WriteToAvro

schema = avro.schema.parse(open("avro_file.avsc", "rb").read())

create_transform_5 = beam.Pipeline()content_4 = ( create_transform_5
|beam.Create(['Beam create transform'])
|beam.Map(lambda **element**:   element)  **|beam.io.WriteToAvro('/content/output5.avro',schema=schema)**)create_transform_5.run()
```

`WriteToAvro`的第五个参数是`schema`。写入 Avro 文件需要指定模式。

第六个参数是`codec`。它是用于块级压缩的压缩编解码器。

第七个参数是设置为“真”的`use_fastavro`。你可以使用“fastavro 库”来加快写作速度。

最后一个参数是`mime_type`。如果文件系统支持指定的 MIME 类型,它将传递生成的输出文件的 MIME 类型。

# 写信给拼花地板

它用于将 PCollection 的每个元素写入 Parquet 文件。`file_path_prefix`、`file_path_suffix`、`num_shards`、`codec`、`mime_type`、`schema`的参数与`WriteToAvro`相同。

```
import apache_beam as beam
import pandas as pd
import pyarrow
from apache_beam.options.pipeline_options import PipelineOptions

parquet_data = pd.read_parquet(‘/content/parquet_data.parquet’, engine=’pyarrow’)parquet_schema = pyarrow.schema([])

schema_map = {
 ‘STRING’: pyarrow.string(),
 ‘FLOAT’: pyarrow.float64(), 
 ‘STRING’: pyarrow.string(),
 ‘DATE’: pyarrow.date64()
 }

for item in parquet_data.schema:parquet_schema =parquet_schema.append(pyarrow.field(item.name, schema_map[item.field_type]))

parquet_write = beam.Pipeline()
content = ( parquet_write
|beam.beam.io.ReadFromParquet(‘/content/parquet_data.parquet’) **|beam.io.parquetio.WriteToParquet(‘/content/output.parquet’, 
schema=parquet_schema**))

parquet_write.run()
```

第七个参数是`row_group_buffer_size`。它指定行组缓冲区的字节大小。行组可以被接受为 parquet 文件的一部分,它保存列输入的序列化数组。这是一项高级功能,用于调整拼花文件的性能。

第八个参数是`record_batch_size`。它指定了每个`record_batch`的记录数。记录批次可以定义为用于在行组缓冲区中存储数据的基本单位。该参数纯粹与拼花文件相关。

# 写入 TFRecord

它具有`file_path_prefix`、`file_path_suffix`、`num_shards`、`compression_type`参数,这些参数已经在上面的写操作中解释过了。

```
import apache_beam as beam
from apache_beam import Create
from apache_beam import coders
from apache_beam.io.filesystem import CompressionTypes
from apache_beam.io.tfrecordio import ReadFromTFRecord
from apache_beam.io.tfrecordio import WriteToTFRecord

reading_tf = beam.Pipeline()
data_path = ‘/content/input_data’

content_read = (reading_tf 
|**beam.io.ReadFromTFRecord(data_path, coder=beam.coders.BytesCoder(), compression_type=’auto’, validate=True**)
|**beam.io.WriteToTFRecord(data_path, compression_type=CompressionTypes.GZIP, file_name_suffix=’.gz’**)
)

reading_tf.run()
```

# 写入 PubSub

该操作将 PCollection 作为消息流写入 Google Cloud PubSub 服务。

```
import os
import apache_beam as beam
from apache_beam import window
from apache_beam.options.pipeline_options import PipelineOptionsproject = ‘SubscribeBeam’pubsub_topic = ‘projects/qwiklabs-gcp-01–7779ab5fa77e/topics/BeamTopic’path = “C:\\Users\ersoyp\qwiklabs-gcp-01–7779ab5fa77e-2d40f7ded2a8.json”os.environ[“GOOGLE_APPLICATION_CREDENTIALS”]=pathinput_file = “C:\\Users\ersoyp\data.csv”output_file = “C:\\Users\ersoyp\output.csv”options = PipelineOptions()options.view_as(StandardOptions).streaming = Trueprocess = beam.Pipeline(options=options)output_file = “/content/outputs/”pubsub_data = ( process
 | ‘Read from PubSub’ >> beam.io.ReadFromPubSub(subscription= input_file)
 | ‘Write to PubSub’ ‘ >> beam.io.WriteToPubSub(output_file)
 )final_file = process.run()
```

第一个参数是`topic`。它被用作写入输出的位置。

第二个参数是`with_attributes`,决定输入元素的类型。如果它被设置为“真”,那么输入元素将是对象类型。如果为“假”,则特征的格式为字节。

第三个参数是`id_label`。它为每个具有给定名称和新颖内容的 Cloud PubSub 消息设置一个属性。它可以在`ReadFromPubSub`和`PTransform`中应用该属性,以对消息[ [14](https://beam.apache.org/releases/pydoc/2.32.0/apache_beam.io.gcp.pubsub.html) ]进行重复数据删除。

第四个参数是`timestamp_attribute`。它被用作每个具有给定名称的云发布订阅消息的属性,其发布时间为 Beam 的模块页面[ [15](https://beam.apache.org/releases/pydoc/2.18.0/apache_beam.io.external.gcp.pubsub.html) 中提供的值。

# 地图变换

`Map` transform 将一个元素作为输入,一个元素作为输出。它对集合中的每个项目执行一对一的映射功能。该示例应该将整个字符串作为单个输入,基于逗号对其进行分割,并返回元素列表。

```
import apache_beam as beam

map_transform = beam.Pipeline()

content = ( map_transform
 |beam.io.ReadFromText(([‘data.txt’]))
 |beam.Map(lambda element: element)
 |beam.io.WriteToText(‘/content/output_1.txt’)
 )

map_transform.run()
```

# 平面图变换

功能方面`FlatMap`与`Map`几乎相同,但有一个显著的区别。虽然`Map`只能为单个输入输出一个元素,但`FlatMap`可以为单个组件发出多个元素。以下示例生成一个列表作为输出。

```
import apache_beam as beam

flatMap_transform = beam.Pipeline()

 content = ( flatMap_transform
 |beam.io.ReadFromText(([‘data.txt’]))
 **|beam.FlatMap(lambda element: element)**
 |beam.io.WriteToText(‘/content/output_1.txt’)
)

 flatMap_transform.run()
```

## 过滤变换

`filter`操作将过滤指定部门的元素。这个过滤函数将前面的列表作为输入,并返回匹配条件中所有需要的特征。

```
import apache_beam as beamfiltering = beam.Pipeline()

dept_count = (
 filtering
 |beam.io.ReadFromText(‘/content/input_data.txt’)
 |beam.Map(lambda line: line.split(‘,’))
 **|beam.Filter(lambda line: line[3] == ‘Backend’)** 
 |beam.Map(lambda line: (line[1], 1))
 |beam.io.WriteToText(‘/content/output_data.txt’)
 |beam.CombinePerKey(sum)
 )
 filtering.run()
```

# 管道分支操作

大多数管道只是用一对一的映射来表示操作的线性流程。在第一个 PCollection 之后,一个过滤操作产生一个新的 PCollection。在 PCollection 上,一个映射转换在队列中创建附加 PCollection,直到它被写入文件。

然而,对于大多数用例来说,您的管道可能非常复杂和分支。这种类型的管道在 Beam 中称为分支管道,我们可以使用同一个 PCollection 作为多个转换的输入。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/024d6190cbb41bd47acd52313d2af16c.png)

来源:图片由作者提供

以下是管道分支结构的实现示例流程。

```
import apache_beam as beambranched = beam.Pipeline()input_collection = ( 
branched 
 | “Read from text file” >> beam.io.ReadFromText(‘data.txt’)
 | “Split rows” >> beam.Map(lambda line: line.split(‘,’)))

 backend_dept = (input_collection
 | ‘Retrieve Backend employees’ >> beam.Filter(lambda record: record[3] == ‘Backend’)
 | ‘Pair them 1–1 for Backend’ >> beam.Map(lambda record: (“Backend, “ +record[1], 1))
 | ‘Aggregation Operations: Grouping & Summing1’ >> beam.CombinePerKey(sum))
 ai_dept = ( input_collection
 |’Retrieve AI employees’ >> beam.Filter(lambda record: record[3] == ‘AI’)
 |’Pair them 1–1 for HR’ >> beam.Map(lambda record: (“AI, “ +record[1], 1))
 |’Aggregation Operations: Grouping & Summing2' >> beam.CombinePerKey(sum))output =(
 (backend_dept , ai_dept)
 | beam.Flatten()
 | beam.io.WriteToText(‘/content/branched.txt’)
 )branched.run()
```

在上面的例子中,第一个 transform 操作在后端部门应用了一个过滤器,Transform B 过滤了 AI 部门的所有雇员。

# 用 Python 生成 ParDo 变换运算

ParDo 可以作为并行处理的转换机制[ [16](https://beam.apache.org/documentation/programming-guide/#applying-transforms) ]。

第一个是`Filtering`,数据集。您可以使用 ParDo 获取 PCollection 中的每个元素,或者将该元素输出到一个新的集合中,或者按照 Beam [ [16](https://beam.apache.org/documentation/programming-guide/#applying-transforms) ]的编程指南中的规定将其丢弃。

第二个是数据集中每个元素的`Formatting`或`Type Converting`。`ParDo`可用于对输入 PCollection [ [17](https://cloud.google.com/dataflow/docs/concepts/beam-programming-model) ]上的每个组件进行转换。

第三个是每个项目的`Extracting Individual Parts`。如果存在具有多个字段的元素集合,您可以使用`ParDo`或提取单个项目。

第四个是对 PCollection 的每一项执行`Computations`。我们可以将这个函数应用到 PCollection 的各个方面。

此外,我们可以利用 ParDo 以各种方式分割 PCollection。在下面的脚本中,我们使用了`Map`、`FlatMap`和`Filter`变换。当您应用一个`ParDo`转换时,您将需要以一个`DoFn`对象的形式提供用户代码。

在内部,`Map`和`FlatMap`也继承了`DoFn`类。为了实现代码中的`ParDo`,用`ParDo`替换`Map`和。“DoFn”类中有许多函数,我们只需覆盖其中的一部分,即流程函数。

```
import apache_beam as beam
 class EditingRows(beam.DoFn):

def process(self, element):
 return [element.split(‘,’)]

class Filtering(beam.DoFn):

def process(self, element):
 if element[3] == ‘Finance’:
 return [element] 

class Matching(beam.DoFn):

def process(self, element):
 return [(element[3]+”,”+element[1], 1)] 

class Summing(beam.DoFn):

def process(self, element):
 (key, values) = element 
 return [(key, sum(values))]

pardo = beam.Pipeline()
 department_operations= (pardo
 |beam.io.ReadFromText(‘data.txt’)
 |beam.ParDo(EditingRows())
 |beam.ParDo(Filtering())
 |beam.ParDo(Matching())
 |’Grouping’ >> beam.GroupByKey()
 |’Summing’ >> beam.ParDo(Summing()) 
 |beam.io.WriteToText(‘data/output_pardo.txt’) )
 pardo.run()
```

# 合成变换操作的生成

`CompositeTransform`顾名思义是一个内部有一系列内置转换的转换。

在管道中使用复合转换可以使您的代码更加模块化,更容易理解。在复合转换中,我们将多个转换组合成一个单元。为此,我们将创建一个类`CompositeTransform`,和 Beam 中的每个其他类一样,它应该继承其对应的基类。

```
import apache_beam as beam

class CompositeTransform(beam.PTransform):

def expand(self, columns):
 x = ( columns |’Grouping & Summing’ >> beam.CombinePerKey(sum)
 |’Filtering’ >> beam.Filter(Filtering))
 return x

def EditingRows(element):
 return element.split(‘,’)
 def Filtering(element):
 name, count = element
 if count > 30:
 return element
 composite = beam.Pipeline()
 input_data = ( composite 
 | “Reading Data” >> beam.io.ReadFromText(‘data.txt’)
 | “Editing Rows” >> beam.Map(EditingRows))frontend_count = (input_data
 | ‘Get Frontend Employees’ >> beam.Filter(lambda record: record[3] == ‘Frontend’)
 | ‘Matching one-to-one’ >> beam.Map(lambda record: (“Frontend, “ +record[1], 1))
 | ‘Composite Frontend’ >> MyTransform()
 | ‘Write to Text’ >> beam.io.WriteToText(‘/content/composite_frontend.txt’))

 ai_count = (input_data
 | ‘Get AI Employees’ >> beam.Filter(lambda record: record[3] == ‘AI’)
 | ‘Pairing one-to-one’ >> beam.Map(lambda record: (“AI, “ +record[1], 1))
 | ‘Composite AI’ >> MyTransform()
 | ‘Write to Text for AI’ >> beam.io.WriteToText(‘/content/composite_ai.txt’))composite.run()
```

为了创建复合变换,我们可以使用函数“Beam.PTransform”。这个 PTransform 是我们使用的每个 PTransform 的基类。PTransform 有一个需要重写的扩展方法。此方法将一个 PCollection 作为输入,将对其应用几个转换。要在我们的管道中使用这个转换,只需用它的惟一标签调用它的对象。

# 侧面输入和侧面输出

顾名思义,`side input`是可以贡献给`DoFn`对象的额外信息。除了输入“PCollection”之外,您还可以以侧面输入[ [19](https://beam.apache.org/documentation/patterns/side-inputs/) ]的形式将附加信息引入到`ParDo`或其子转换中,如`Map`、`FlatMap`。

让我们为侧面输入实现一个示例脚本。我们可以将侧面输入移动到`ParDo`转换。

```
import apache_beam as beam

side_inputs = list()

with open (‘id_list.txt’,’r’) as my_file:
 for line in my_file:
 side_inputs.append(line.rstrip())
 sideInput = beam.Pipeline()

class Filtering(beam.DoFn):def process(self, element, side_inputs, lower, upper=float(‘inf’)):
 id = element.split(‘,’)[0]
 name = element.split(‘,’)[1]
 items = element.split(‘,’)
 if (lower <= len(name) <= upper) and id not in side_inputs:
 return [items]

small_names =( sideInput
 |”Reading Data” >> beam.io.ReadFromText(‘data.txt’)
 |”Side inputs & ParDo” >> beam.ParDo(Filtering(), side_inputs,3,10) 
 |beam.Filter(lambda record: record[3] == ‘Frontend’)
 |beam.Map(lambda record: (record[0]+ “ “ + record[1], 1))
 |beam.CombinePerKey(sum)
 |’Write to Text’ >> beam.io.WriteToText(‘/content/side_inputs.txt’))

sideInput.run()
```

# 在 Apache Beam 中实现 windows

Beam 中的窗口可以说是其数据处理理念中的一个关键元素。窗口逻辑是任何流处理环境的关键概念。没有它,处理实时数据几乎是不可能的。

流式传输中有两种时间概念。这些是事件时间和处理时间。这些时间在处理过程中起着至关重要的作用,因为它们决定了窗口中要处理的数据。

`event time`可以表示为特定事件的时间。这个时间嵌入在记录中。所有生成和发送事件的源都嵌入了带有值的时间戳。

`processing time`可以描述为特定事件开始被处理时的处理时间。它是指执行相应操作的机器的系统时间。通过网络将信息发送到服务器需要一些时间,甚至是几毫秒或几秒钟。

## 翻滚的窗户

`tumbling window`的意思是一旦创建了一个窗口,窗口将继续处理数据,直到特定的时间过去。用户必须在创建窗口时分配该时间。一旦给定了指定的时间量,窗口将发出直到该时间的计算结果。

```
import apache_beam as beam

fixed_window = beam.Pipeline()

content = ( fixed_window
 |beam.Create({‘dict1’:[24,45,68],’dict2':[32,54,75],‘dict3’:[56,78,92]})
 |beam.Map(lambda element: element)
 |beam.WindowInto(window.FixedWindows(20))
 |beam.io.WriteToText(‘/content/output_1’)
)

fixed_window.run()
```

## 推拉窗

创建一个`sliding window`的基本原理类似于一个`tumbling window.`,一旦完成,窗口将继续执行数据,直到一段特定的时间过去;然而,这是一个不同之处,因为滑动窗口可以重叠。单个窗口可能会与另一个窗口的时间重叠。为此,多个窗口有可能重叠。最终,数据中的大多数元素将属于多个窗口。

```
import apache_beam as beam

sliding_window = beam.Pipeline()

content = ( sliding_window
 |beam.Create({‘dict1’:[24,45,68],’dict2':[32,54,75],‘dict3’:[56,78,92]})
 |beam.Map(lambda element: element)
 |beam.WindowInto(window.SlidingWindows(30,10))
 |beam.io.WriteToText(‘/content/output_2’)
 )

sliding_window.run()
```

## 水印

可以在事件时间戳上处理窗口。为了让 Beam 跟踪事件时间,会有一个额外的操作与之对应。如果我们用声明的时间定义一个窗口,那么应该有一些实体可以跟踪已经过去的指定数量的时间戳元素。测量事件时间进度的波束机制称为水印。水印声明流中已经过了指定的事件时间量。当前窗口不会接受时间戳小于当前水印值的任何元素。

# 用编码器进行编码操作

本节重点介绍 Beam 的数据编码机制。因此,您应该理解有两种数据模式。第一种是面向对象的,用户可以理解。另一种是机器可以理解的字节形式的序列化数据。

## Beam 中的编码器类别

在每个生态系统中,对象数据在通过网络传输时被序列化为字节串。对于目标机器,它们被反序列化为对象形式。在 Beam 中,当运行者执行您的管道时,他们需要具体化您的 PCollections 的中间数据,这需要将组件从字节格式转换为字符串。

编码人员不一定与数据类型有一对一的关系。一种数据类型可以有多个编码器。

## 波束中的数据编码

创建定制编码器的最重要的步骤在下面作为一个例子来实现。

```
import parquet
from apache_beam.coders import Coder
from apache_beam.transforms.userstate import ReadModifyWriteStateSpec

class ParquetCoder(Coder):
def encode(self, item):
 return parquet.dumps(item).encode()

def decode(self, item):
 return parquet.loads(item.decode())

def is_deterministic(self) -> bool:
 return Trueclass EncodeDecode(beam.DoFn):
 data_source = ReadModifyWriteStateSpec(name=’data_source’, coder=ParquetCoder())

def execute(self, item, DataSource=beam.DoFn.StateParam(data_source)):return DataSource
```

第一种方法是`Encode`。它接受输入值并将它们编码成字节串。

第二种方法是`Decode`,它将编码后的字节串解码成相应的对象。

第三种方法是`is_deterministic`。它决定该编码器是否按照 Beam [ [21](https://beam.apache.org/releases/pydoc/2.5.0/_modules/apache_beam/coders/coders.html) ]文档中的规定对值进行确定性编码。

# 阿帕奇光束触发器

Apache Beam 触发器提示窗口发出结果。如[ [22](https://beam.apache.org/releases/javadoc/2.6.0/org/apache/beam/sdk/transforms/windowing/Window.html) 和[ [23](https://beam.apache.org/releases/javadoc/2.5.0/org/apache/beam/sdk/transforms/windowing/Trigger.html) 所述,在对窗口结构中的元素进行分组的情况下,Beam 受益于触发器来决定何时转换每个窗口的聚合结果。即使你没有指定,每个窗口都有一个“默认触发器”。

您可以为您的窗口设置触发器来更改此默认行为。Beam 提供了几个预置的触发器供您选择。除此之外,您还可以创建自定义触发器。根据触发类型,您的窗口可以在水印穿过您的窗口之前发出早期结果,也可以在任何后期元素到达时发出后期效果。

## 事件时间触发器

`EventTimeTrigger`表现为`AfterMarkTrigger`。这些是传输窗口内容的默认触发器。当缺省窗口设置和缺省触发器一起使用时,缺省触发器精确地发出一次,并且后期数据被丢弃[ [24](https://beam.apache.org/releases/javadoc/2.5.0/org/apache/beam/sdk/transforms/windowing/AfterWatermark.html) ]。

```
import apache_beam as beam
from apache_beam import window
from apache_beam.options.pipeline_options import PipelineOptions, StandardOptions
from apache_beam.transforms.trigger import AfterWatermark, AfterProcessingTime, AccumulationMode, AfterCount

after_watermark_trigger = beam.Pipeline()

content = ( after_watermark_trigger
 |beam.Create({‘dict1’:[24,45,68],’dict2':[32,54,75], ‘dict3’:[56,78,92]})
 |beam.Map(lambda element: element)
 |beam.WindowInto(window.FixedWindows(20), 
trigger=AfterWatermark(
early=AfterProcessingTime(5),
late=AfterCount(5)),
accumulation_mode=AccumulationMode.DISCARDING)
 |beam.io.WriteToText(‘/content/after_watermark_trigger.txt’)
)

after_watermark_trigger.run()
```

## 处理时间触发器

第二个是`ProcessingTimeTrigger`俗称`AfterProcessingTime` [ [25](https://beam.apache.org/releases/javadoc/2.1.0/org/apache/beam/sdk/transforms/windowing/AfterProcessingTime.html) 。顾名思义,这个触发器在处理时间上运行。经过一定的处理时间后,触发器会提示窗口发出结果。执行时间受到系统日期的限制,最好是数据项的时间戳。此触发器有助于从窗口中触发早期结果,尤其是具有重要时间范围的窗口,如单个全局窗口。

```
import apache_beam as beam
from apache_beam import window
from apache_beam.options.pipeline_options import PipelineOptions, StandardOptions
from apache_beam.transforms.trigger import AfterWatermark, AfterProcessingTime, AccumulationMode, AfterCount

after_processing_time_trigger = beam.Pipeline()

content = ( after_processing_time_trigger
 |beam.Create({‘dict1’:[24,45,68],’dict2':[32,54,75], ‘dict3’:[56,78,92]})
 |beam.Map(lambda element: element)
 |beam.WindowInto(window.FixedWindows(20), trigger=AfterProcessingTime(10), accumulation_mode=AccumulationMode.DISCARDING) |beam.io.WriteToText(‘/content/after_processing_time_trigger.txt’))

after_processing_time_trigger.run()
```

## 数据驱动触发器

第三个是`DataDrivenTrigger`,名字叫`AfterCount`。它在现有窗口收集了至少 N 个元素后运行。如果用“N = 5”指定计数触发器,当窗口的窗格中有五个功能时,它将提示窗口再次发出结果。

```
import apache_beam as beam
from apache_beam import window
from apache_beam.options.pipeline_options import PipelineOptions, StandardOptions
from apache_beam.transforms.trigger import AfterWatermark, AfterProcessingTime, AccumulationMode, AfterCount

after_count_trigger = beam.Pipeline()

content = ( after_count_trigger
 |beam.Create({‘dict1’:[24,45,68],’dict2':[32,54,75], ‘dict3’:[56,78,92]})
 |beam.Map(lambda element: element)
 |beam.WindowInto(window.GlobalWindows(), trigger=AfterCount(5), accumulation_mode=AccumulationMode.DISCARDING)
 |beam.io.WriteToText(‘/content/after_count_trigger.txt’)
 )

after_count_trigger.run()
```

## 复合触发器

复合触发器是多个触发器的组合。它允许用谓词合并不同类型的触发器。它们允许同时使用多个触发器。光束包括以下类型[ [26](https://beam.apache.org/releases/javadoc/2.5.0/org/apache/beam/sdk/transforms/windowing/AfterEach.html) ]。

第一个是`Repeatedly`。该条件指定一个运行到无穷大的触发器。建议将`Repeatedly`与其他一些可能导致该重复触发停止的条件结合使用。下面添加了一个示例代码片段。

```
import apache_beam as beam
from apache_beam import window
from apache_beam.options.pipeline_options import PipelineOptions, StandardOptions
from apache_beam.transforms.trigger import AfterWatermark, AfterProcessingTime, AccumulationMode, AfterAny, Repeatedly

composite_repeatedly = beam.Pipeline()

content = ( composite_repeatedly
 | beam.Create({‘dict1’:[24,45,68],‘dict2’:[32,54,75], ‘dict3’:[56,78,92]})
 | beam.Map(lambda element: element)
 |beam.WindowInto(window.FixedWindows(20), trigger=Repeatedly(AfterAny(AfterCount(50), AfterProcessingTime(20))),
 accumulation_mode=AccumulationMode.DISCARDING)
 | beam.io.WriteToText(‘/content/composite_repeatedly’))

composite_repeatedly.run()
```

第二个是`AfterEach`。这种状态将多个触发器组合在一起,以特定的顺序一个接一个地触发。每当触发器发出一个窗口,过程就前进到下一个窗口。

第三个是`AfterFirst`。它使用多个触发器作为参数。当它的任何参数触发器被满足时,它处理窗口发出结果。它类似于多个触发器的“或”运算。

第四个是`AfterAll`。它保存多个触发器作为参数,并使窗口在其所有参数触发器都满足时发出结果。对于许多触发器来说,它相当于“与”运算。

第五个是`Finally`。它作为最终条件,使任何触发器最后一次触发,并且不再触发。

# Beam 中流式数据管道的结构

Beam 的核心思想是提供整合的大数据处理管道。正如其官方文档[ [6](https://beam.apache.org/documentation/programming-guide/) ]中所述,其和谐的本质用单个 API 构建了批处理和流管道。

当您创建您的`Pipeline`时,您还可以设置一些与之相关的配置选项,比如管道运行器,它将执行您的管道,以及所选择的运行器所需的任何运行器特定的配置。

您可以考虑通过硬编码来分配管道的配置参数。尽管如此,通常建议从命令行读取它们,然后将其传递给`Pipeline`对象。出于这个原因,如果我们可以构建一个从命令行获取运行器信息、输入输出文件路径信息的管道,那么我们的问题就解决了,我们可以说我们将获得一个通用管道。

```
import apache_beam as beam
import argparse
from apache_beam.options.pipeline_options import PipelineOptions, StandardOptions

parser = argparse.ArgumentParser() 

parser.add_argument(‘ — input’, dest=’input’, required=True, help=’/content/data.txt/’)parser.add_argument(‘ — output’, dest=’input’, required=True, help=’/content/output.txt/’)

path_args, pipeline_args = parser.parse_known_args() 

input_arguments = path_args.input 
output_arguments = path_args.output 

options = PipelineOptions(pipeline_args)
pipeline_with_options = beam.Pipeline(options = options)

dept_count = (pipeline_with_options
 |beam.io.ReadFromText(input_arguments)
 |beam.Map(lambda line: line.split(‘,’))
 |beam.Filter(lambda line: line[3] == ‘AI’) 
 |beam.Map(lambda line: (line[1], 1))
 |beam.io.WriteToText(output_arguments)
)

pipeline_with_options.run()
```

# 部署数据管道

Beam 将通过 Google PubSub 提供流媒体数据。为了在 Google PubSub 中处理流数据,我们需要创建一个项目,并获得它的“服务 _ 账户 _ 认证”密钥[ [27](https://cloud.google.com/dataflow/docs/concepts/streaming-with-cloud-pubsub) ]。

## 在 Google PubSub 中创建主题

首先,我们需要点击[https://cloud.google.com/](https://cloud.google.com/)主页右上角的按钮进入“控制台”。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e9c0536e29f65d3f862354825cec46a4.png)

来源:图片由作者提供

第二,谷歌云控制台将帮助你创建一个新项目。启动此项目可能需要几秒钟时间。创建项目后,您可以在“项目信息”部分查看“项目名称”。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a9aaba3d361d3bf9ec23cb3df75091fa.png)

来源:图片由作者提供

要获得其“服务身份验证密钥”,我们需要转到“IAM & Admin”部分下的服务帐户。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/33635c7c55d1c6cc18f294b0ae675b05.png)

来源:图片由作者提供

填写完必填字段后,我们可以点击“创建并继续”。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ed81ce614a19887762fa3a097a604147.png)

来源:图片由作者提供

或者,您可以在该身份验证密钥中授予您想要的权限。从选项中,继续“项目>编辑器”。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b13ac1dfb1ef1cbde385ea65aeb133e7.png)

来源:图片由作者提供

您可以通过单击“完成”按钮来完成初始化部分。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bb54e07a741fd732b1c77d9e1b9b06c1.png)

来源:图片由作者提供

要创建一个`. json '格式的密钥,您可以单击“密钥”选项卡,然后选择“添加密钥”下的“创建新密钥”。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fcdd2ab985649f026be0d4b34616f5bf.png)

来源:图片由作者提供

这是我们希望为服务帐户生成的密钥。下载并保存在一个非常安全的地方。任何拥有此密钥的人都可以查看您的项目。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/275284166fd3835ac66cdd3dbed24941.png)

来源:图片由作者提供

您将需要一个出版商、一个主题和一个订阅。发布者将发布关于某个主题的消息。为此,我们将使用“PubSub”。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5b4259322d675c73483b375485e0664a.png)

来源:图片由作者提供

我们已经创建了主题。一些统计数据是“发布消息请求计数”和“发布消息操作计数”。我们将在 publisher 脚本中使用这个主题路径。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d550497e928ef7a583e78a8173063410.png)

来源:图片由作者提供

您需要通过将订阅名称和“交付类型”填写为“拉”来创建订阅主题。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/53a11188564e0812b1087daa4526393c.png)

来源:图片由作者提供

在创建了主题和订阅之后,我们可以查看统计图表,该图表没有显示任何内容,因为我们还没有发布任何消息。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/21eeaae7695466e8be73a74eb399265a.png)

来源:图片由作者提供

假设您希望通过使用接口本身来发布消息。您可以点击“发布消息”并提供可选的消息属性作为键值对。这些属性用于发送有关消息的附加信息。对于“添加属性”,您可以添加“语言”作为关键字,添加“英语”作为其值。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b32505444b59d8d8dfabc5f6abc23f56.png)

来源:图片由作者提供

消息已发布,我们可以手动提取此消息,因为没有正在运行的订阅者。您可以选择您想要“拉”它的订阅。您可以选中“启用确认”按钮,在收到确认后发送确认。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fc87c1903c160a7e477f60d8dea5356c.png)

来源:图片由作者提供

然后,您可以点击“拉”。除了查看消息的属性之外,您还可以查看消息。我们可以观察到该消息已被确认。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b76c92a07b9bb1c7c3f5118ce962172b.png)

来源:图片由作者提供

整个活动中包括一些连接器,用于将客户的提供者连接到我们的发布者应用程序。这种方法在一些现实场景中使用,在这些场景中,他们希望我们逐行读取文件并进行处理,而不是对文件进行批处理。

创建的 PubSub 主题可以像下面这样在脚本中定义来使用它。您可以用您的特定路径替换引用的字符串。应该填写这些路径,以便在 Google Cloud 的指南页面[ [28](https://cloud.google.com/pubsub/docs/publisher) ]中提到的正确主题上发布消息。

```
import os
 from google.cloud import pubsub_v1

 project = ‘SubscribeBeam’

 topic_for_pubsub = ‘projects/qwiklabs-gcp-01–7779ab5fa77e/topics/BeamTopic’

 service_account_path = “C:\\Users\ersoyp\Documents\ApacheBeam\qwiklabs-gcp-01–7779ab5fa77e-2d40f7ded2a8.json”
 os.environ[“GOOGLE_APPLICATION_CREDENTIALS”] = service_account_path 

 data_path = “C:\\Users\ersoyp\Documents\ApacheBeam\data.csv”
```

## 用 GCP 处理数据管道

在上一节中,我们定义了 PubSub 主题和相关的“service_account_path”信息。在接下来的步骤中,我们将使用 PubSub 凭证通过 Beam 读写数据。我们一起来实施吧。

以下脚本定义了发布订阅主题路径、服务帐户路径、输入和输出文件路径。此外,我们添加了“GOOGLE_APPLICATION_CREDENTIALS”作为环境变量。在分配了这些路径之后,我们初始化了将要处理的射束管道。在输入和输出路径的帮助下,我们很容易从 Google Cloud PubSub 中读取数据,然后将结果写回给它。

```
import osimport os
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions, StandardOptions
from apache_beam import window
project = ‘SubscribeBeam’

pubsub_topic = ‘projects/qwiklabs-gcp-01–7779ab5fa77e/topics/BeamTopic’

path_service_account = “C:\\Users\ersoyp\Documents\ApacheBeam\qwiklabs-gcp-01–7779ab5fa77e-2d40f7ded2a8.json”

os.environ[“GOOGLE_APPLICATION_CREDENTIALS”] = path_service_account 

input_file = “C:\\Users\ersoyp\Documents\ApacheBeam\data.csv”

output_file = ‘C:\\Users\ersoyp\Documents\ApacheBeam\output.csv’

options = PipelineOptions()

options.view_as(StandardOptions).streaming = True

process = beam.Pipeline(options=options)

output_file = ‘/content/outputs/’

pubsub_data = ( process
 |’Read from Google PubSub’ >> beam.io.ReadFromPubSub(subscription= input_file)
 |’Write to Google PubSub’ >> beam.io.WriteToPubSub(output_file))

final_file = process.run()
```

## 向 GCP 订购数据管道

作为部署数据管道的最后一步,我们需要用 PubSub 创建一个“SubscriberClient”对象。订阅服务器初始化后,将被分配到相应的订阅路径。您可以使用下面的脚本查看实现。

脚本首先将“GOOGLE_APPLICATION_CREDENTIALS”指定为操作系统中的一个环境变量。分配的路径包括从 GCP IAM & Admin 界面生成的服务帐户密钥。之后,我们在“args”的帮助下创建一个订阅路径。然后,我们用 GCP 公共订阅创建一个 SubcriberClient。最后,我们将构建的订阅路径分配给 GCP 的订阅者。

```
from google.cloud import pubsub_v1
import time
import os

os.environ[“GOOGLE_APPLICATION_CREDENTIALS”] = ‘C:\\Users\ersoyp\Documents\ApacheBeam\qwiklabs-gcp-01–7779ab5fa77e-2d40f7ded2a8.json’

path_for_subcription = args.subscription_path

pubsub_subscriber = pubsub_v1.SubscriberClient()

pubsub_subscriber.subscribe(path_for_subcription, callback=callback)
```

# 监控数据管道

在上面的章节中,我们在 Google Cloud PubSub 的帮助下发布、处理和订阅了带有示例脚本的数据管道。由于我们使用了 GCP,我们可以使用谷歌云监控工具跟踪监控活动。

为此,我们可以通过使用此窗格选择监控来查看“概述”、“仪表板”、“服务”和“指标浏览器”。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8ce9f2110acc8bed415f2649c3512797.png)

来源:图片由作者提供

我们创建的任何指标都将添加到“指标浏览器”选项卡下。我们可以选择“资源类型”和“指标”来过滤出正确的数据。此外,我们可以使用“Group by”和“Aggregator”的聚合操作和“Alignment period”。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5b46f19b07648338d257a6d848afe09f.png)

来源:图片由作者提供

# 阿帕奇光束 vs 阿帕奇火花

阿帕奇梁生产各种环境下的管道。它只是分布式数据的另一种编程模型。与 Apache Spark 一样,Apache Beam 有 RDD 或数据帧来执行批处理,还有数据流来进行流处理。Beam 用 [Java](https://www.java.com/download/) 、 [Python](https://www.python.org/) 和 [Go](https://golang.org/) 语言实现。

另一方面,Apache Spark 是一个用于海量数据处理的综合引擎。它是在 2012 年开发的,最初只是为批处理而设计的。Spark 将流分成几个小批量,并处理这些小批量。

如果我们保持小批量,就好像我们在执行实时流数据。这就是为什么 Spark 被认为接近实时流处理引擎,而不是有效的流处理引擎。Spark 是用 Scala 语言实现的。也兼容 Spark 官方页面[ [29](https://spark.apache.org/docs/latest/streaming-programming-guide.html) ]中描述的 [Hadoop](https://hadoop.apache.org/) 平台。

# 最后的想法

在整篇文章中,在最初描述概念和用示例脚本实现解决方案的结构中呈现了广泛的主题。主题包括介绍 Apache Beam,然后在 Beam 中构建管道。标题包括但不限于:

*   Apache Beam 的体系结构
*   阿帕奇波束的特点
*   阿帕奇梁的管道结构
*   帕尔多变换
*   复合转换
*   侧面输入和侧面输出
*   在 Apache Beam 中实现 Windows
*   用编码器进行编码操作
*   阿帕奇光束触发器
*   流式数据管道的结构
*   部署数据管道
*   监控数据管道
*   阿帕奇光束 vs 阿帕奇火花

非常感谢您的提问和评论!

# 附加参考

*   阿帕奇光束:[https://beam.apache.org/documentation/](https://beam.apache.org/documentation/)
*   Apache Beam Pipeline:[https://Beam . Apache . org/documentation/pipelines/design-your-Pipeline/](https://beam.apache.org/documentation/pipelines/design-your-pipeline/)
*   阿帕奇火花:【https://spark.apache.org/documentation.html】的[,](https://spark.apache.org/documentation.html)[的 https://beam.apache.org/documentation/runners/spark/](https://beam.apache.org/documentation/runners/spark/)
*   阿帕奇弗林克:[https://ci.apache.org/projects/flink/flink-docs-master/](https://ci.apache.org/projects/flink/flink-docs-master/)
*   阿帕奇萨姆扎:[http://samza.apache.org/startup/quick-start/1.6.0/beam.html](http://samza.apache.org/startup/quick-start/1.6.0/beam.html)
*   谷歌云数据流:[https://Cloud . Google . com/data flow/docs/concepts/beam-programming-model](https://cloud.google.com/dataflow/docs/concepts/beam-programming-model)
*   大数据描述:[https://www . SAS . com/en _ us/insights/big-Data/what-is-big-Data . html](https://www.sas.com/en_us/insights/big-data/what-is-big-data.html)
*   Apache Beam |构建大数据管道的实践课程:[https://www . udemy . com/course/Apache-Beam-A-Hands-On-course-build-Big-data-Pipelines/](https://www.udemy.com/course/apache-beam-a-hands-on-course-to-build-big-data-pipelines/)
*   窗口累加模式,[https://beam . Apache . org/documentation/programming-guide/# triggers](https://beam.apache.org/documentation/programming-guide/#triggers)
*   谷歌云控制台,[https://console.cloud.google.com](https://console.cloud.google.com)

# 数据平台—将数据从您的传统系统中解放出来

> 原文:<https://towardsdatascience.com/data-platforms-liberate-data-from-your-legacy-systems-669b643e3124?source=collection_archive---------10----------------------->

## 数据分析的潜力经常被分散在公司各处的古老而多样的遗留系统所阻碍。然而,数据和运营不需要永远纠缠在一起。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/75f0ac52f9c8cada4a953ff30f921390.png)

米切尔·伦辛克在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

# 数据驱动的决策——销售宣传

数据从根本上改变了企业的运营方式,这种说法并不新鲜。无论是高频传感器数据、实时股票市场价格还是详细的用户日志,我们都以历史上前所未有的规模跟踪、收集和存储数据。原因是:这些大量的数据隐藏了价值。**数据驱动的决策**不仅仅是一个时髦词——高质量的数据真正允许采取有证据支持的行动,推动业务向前发展。

数据分析的发展一个接一个,速度惊人。我们将只存储*更多的*数据;更高的频率,更丰富的记录,更多的来源。不仅数据量增加,我们还在不断寻找新的方法来使用它。复杂的分析工具如雨后春笋般涌现,新的模式不断衍生,我们发现了以前从未想到的数据集之间的联系。要了解数据分析领域有多热闹,只需查看每天的媒体文章。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7089f44a41e12c819e8b97dd50626036.png)

马库斯·斯皮斯克在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

# 数据驱动的决策——现实

不幸的是,公司系统的发展速度非常不同。晦涩的编程语言和工具——几年甚至几十年前的——分散在团队和部门中。这些所谓的**遗留系统**很难升级,对于那些没有直接参与的人来说几乎不可能访问。我们可能在谈论数百甚至数千个应用程序。这样一系列系统不可能在一夜之间重新设计和现代化;这是一项浩大的工程,可能需要数年时间。

因此,大多数公司在他们想要做的和他们能够做的之间有很大的不匹配。这些数据可能会在公司的某个地方找到,但只对那些意识到这一点并碰巧熟悉系统的少数幸运者开放。这就是所谓的**筒仓结构**——当身处不同的公司筒仓时,从另一个筒仓获取见解是一个缓慢而痛苦的过程。

那么,我们如何在数据分析的革命性世界中导航,同时维护(或许逐步更新)我们的核心遗留系统呢?概念性的解决方案既简单又出色:简单地将数据层从 it 系统中分离出来。通过这种方式,我们可以利用大数据和高级分析的潜力,而不会彻底根除日常业务。这个我们数据的新家叫做**数据平台**。

# 什么是数据平台?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f911d40e8af09813d9802799cca01b1b.png)

一个不同的平台。[华纳](https://unsplash.com/@warnerl?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 拍摄的照片

Splunk 给出了数据平台的全面定义:

> “数据平台是一个完整的解决方案,用于接收、处理、分析和呈现由现代数字组织的系统、流程和基础设施生成的数据。”

正如所见,它不仅仅是一个保存公司所有原始数据的巨大数据湖。不,它是一个自己的生态系统,一个包含从应用程序检索数据到呈现给最终用户的一切的平台。

出于可伸缩性和弹性的考虑,这样的数据平台很可能位于云中,而不是内部。**云服务**设置简单,存储相对便宜,工具不断更新,服务往往可以采用现收现付的模式。为了利用未来几年的发展,建立适应变化的能力,并灵活地应对新的机遇,云可能是一条出路。

## 好处

数据平台的潜在优势非常丰富:

*   来自各种(分离的)系统和来源的数据可以汇集在一起。
*   不断从不灵活的遗留系统中检索最新信息。
*   最终用户处于控制之中。无论是数据科学家还是业务经理,您都可以使用您想要的工具来获得您想要的洞察力。
*   IT 部门不再是检索某些数据的瓶颈。不再有抽奖票,不再依赖 IT 设置的优先级。
*   可以将内部 IT 人才部署到他们能够增加最大价值的地方,而不是手动从旧系统中提取数据。
*   最先进的服务——如新的人工智能技术和[数字双胞胎](/need-help-making-decisions-ask-your-digital-twin-6e4cf328cb0)——可以在不需要与现有遗留系统集成的情况下进行部署。
*   未来的数据源可以连接到平台。一个设计良好的数据平台甚至可以处理合并和收购。
*   平台为未来的数据需求做准备。大数据带来了必须应对的挑战,如[速度、多样性、数量和准确性](https://medium.com/codex/ibms-introduction-to-data-science-in-10-minutes-2a684f1828d5)。

总之,数据平台使每个公司利益相关者能够随时随地访问和处理与决策相关的所有数据。只有这样,才能实现真正的**数据驱动型企业**。

## 怎么做?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ac70fd1531709098e07f553a151da4d9.png)

照片由[弗兰·雅克耶](https://unsplash.com/@fran_?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

正如您可能已经从其功能中推测的那样,建立一个数据平台并不是简单地安装一个软件包就能神奇地从公司系统中抓取所有数据的事情。BCG 声称——与改造遗留系统相比——建立一个数据平台只需一半的时间**和一半的成本 T10。提醒你;这仍然是一个很大的操作。**

该平台可以被视为工具和数据操作的集合,它们的结合为真正的数据驱动型企业奠定了基础。当然,这样的设计需要认真思考数据策略和清晰的路线图。

要列出构建数据平台所需的所有东西可能会太长,但下面是常见构建模块的概述和相应工具的示例:

*   **数据摄取工具**:数据必须从各种来源收集,具有不同的数量、格式和频率。无论是传感器数据、用户日志还是第三方数据库,都必须以某种方式获取。*(阿帕奇气流,歌手)*
*   **数据存储**:存储传统上是数据仓库*的领域,提供结构化但不灵活的数据表示。相比之下,数据湖*存储各种各样的非结构化数据。数据平台可能需要介于两者之间的东西(新兴数据 *lakehouse* ),在尽可能保留结构的同时处理各种数据。*(红移、亚马逊 S3、谷歌云存储)*
*   数据转换:当使用传统的数据库仓库时,转换归结为选择正确格式的正确数据。对于更奇特的数据,可能需要编排应用程序。 *(dbt,阿帕奇气流)*
*   **商业智能**:在管理和执行层面,平台应报告相关见解,可视化关键绩效指标和项目趋势。仪表板通常用于这些目的。*(力量匕,画面)*
*   **数据科学**:为了从数据中获得非预定义的洞察力,可以部署定制脚本和测试。然而,如今的云平台也托管了许多分析工具。 *(Python,R,Amazon Sagemaker)*

这些模块仅仅涵盖了平台的功能方面。还有其他需要注意的构建模块和主题,例如:

*   安全性:将所有公司数据捆绑在一个平台上自然会带来相当大的风险。在整个架构中,保持高标准的安全性至关重要。 *(IBM 安全卫士)*
*   **数据治理**:为了在系统中建立信任,所有的数据(以及执行的转换)都应该可以追溯到其源头。职责、隐私和数据编目等方面应该设计得很好。*(阿帕奇图集)*

一句话:数据平台不是一个可以尝试的噱头——建立一个数据平台是一项战略承诺,可以将数据转化为一项独立的公司资产。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5ba80fe6256f663df3ca49a227e81975.png)

数据平台和底层架构的概念布局[图片由作者提供]

## 值得吗?

数据分析不再是*唾手可得的东西* —明智决策的力量对于保持长期竞争力至关重要。在可预见的未来,数据可用性和分析将继续以比系统本身更快的速度增长。记住遗留系统的主要目的不是生成数据;它们是安排员工、处理交易、处理客户订单的系统。这些系统构成了公司的电子心脏。尽管如此,数据分析也不应该再被 90 年代的 VBA 脚本所束缚。只有一个解决方案——将数据从传统的笼子中解放出来。

# 外卖食品

*   数据平台将数据从操作系统中分离出来。它创建了一个单独的层,明确地将数据视为公司资产。
*   易于访问的实时数据对于成功的分析至关重要。最终用户需要能够基于相关信息做出数据驱动的决策,不受不灵活的遗留系统和孤岛结构的阻碍。
*   数据分析的发展远远超过内部系统的变化。构建独立的数据层利用了分析技术的进步,同时保留了运营系统的工作。
*   数据平台是一项长期的战略承诺。在前进之前,应该对业务一致性和平台架构进行充分的思考。

喜欢这篇文章吗?您可能还喜欢以下内容,在数字孪生环境中利用数据平台:

</need-help-making-decisions-ask-your-digital-twin-6e4cf328cb0>  

# 来源

<https://www.bcg.com/capabilities/digital-technology-data/digital-platform>  <https://www.mongodb.com/what-is-a-data-platform#:~:text=A%20data%20platform%20is%20an,layer%20for%20users%20and%20applications>  <https://www.splunk.com/en_us/data-insider/what-is-a-data-platform.html>  <https://builtin.com/big-data/big-data-platform> 

# 数据准备备忘单

> 原文:<https://towardsdatascience.com/data-preparation-cheatsheet-8201e1fcf9cf?source=collection_archive---------32----------------------->

## 通用特征工程/EDA 任务,已编译

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7e795f387759f02462a17acc7555ae41.png)

图片来自 [Unsplash](https://unsplash.com/photos/1K6IQsQbizI)

任何数据分析/科学任务中最耗时的部分就是正确地准备和配置数据。一个**模型的表现只和它所接收到的数据一样好**,而且数据可能需要经过大量的转换才能为模型训练做好准备。这些年来,我编写了一个 [**概念**](/using-notion-to-organize-your-data-science-learning-bbcb500364b6) 页面,突出了数据科学家为**数据准备**需要执行的许多常见任务。我在下面列出了几个例子,但是完整的例子可以在下面的[链接](https://www.notion.so/Common-Use-Cases-583a1537a87d433fb5359bd0c2c99eb9)中找到。随着我继续学习 EDA 或特性工程中反复使用的其他常用函数,我将继续扩展这个链接。

**注意**:所有这些例子都是用 Python 编写的,主要使用了 Pandas、Numpy 和 Sci-Kit 学习库。为了可视化,使用了 MatPlotLib 或 Seaborn。

# 目录

1.  检查数据帧中的缺失值
2.  删除列
3.  将函数应用于列
4.  绘制列的值计数
5.  按列值对数据帧排序
6.  基于列值删除行
7.  顺序编码
8.  用所有分类变量编码数据帧
9.  额外资源

# 检查数据帧中的缺失值

该代码块使用 **Pandas 函数** **isnull()** 和 **sum()** 给出数据集中所有列缺失值的汇总。

# 删除列

要删除一个列,使用 pandas **drop()函数**来删除您选择的列,对于**多个列**只需在包含列名的**列表**中添加它们的名称。

# 将函数应用于列

使用虹膜数据集

许多要素工程任务需要编码或数据转换,这可以通过传统的 Python 函数来完成。通过使用 pandas **apply()** 函数,您可以将您创建的函数应用于整个列,以创建新列或转换您选择的列。

# 绘制列的值计数

条形图

特征工程的一项常见任务是了解数据集的平衡程度。例如,在一个二元分类问题中,如果有将近 90%的一个类和 10%的数据点代表另一个类,这将导致模型在大多数情况下预测第一个类。为了帮助避免这种情况,特别要将你的反应变量的数量可视化。熊猫 **value_counts** ()函数使您能够获得一列中每个值的出现次数,然后 **plot()** 函数让您通过条形图直观地看到这一点。

# 按列值对数据帧排序

有时对于数据分析,您希望以特定的顺序可视化您的列,您可以在数据框架的 **sort_values()** 函数中添加多个列。

# 基于列值删除行

如果您希望根据另一列的值对数据进行子集划分,可以通过捕获一组特定行的**索引**来实现。通过创建这些序列,您可以使用 **drop** 函数来删除您已经确定的这些特定的行/索引。

# 顺序编码

[序号编码](https://machinelearningmastery.com/one-hot-encoding-for-categorical-data/)是对分类数据进行编码的多种方式之一。有各种各样的编码方法,比如一键编码等等,我已经在这里链接了[。**当您想要保留分类变量的顺序,并且如果您的列有一个固有的** **顺序**时,可以使用顺序编码。](https://www.analyticsvidhya.com/blog/2020/08/types-of-categorical-data-encoding/)

# 用所有分类变量编码数据帧

如果数据集只有分类列,您可能需要创建一个管道/函数来编码整个数据集。请注意,在使用此函数之前,您需要**确定您正在处理的每一列的顺序是否重要**。

# 额外资源

*   [熊猫小抄](https://www.datacamp.com/community/blog/python-pandas-cheat-sheet)
*   [Python GroupBy 语句](https://realpython.com/pandas-groupby/)
*   [EDA 备忘单](/data-visualization-cheat-sheet-with-seaborn-and-matplotlib-70cac11c6517)
*   [Python CheatSheet](https://elitedatascience.com/python-cheat-sheet)

— — —

数据争论是为模型训练/反馈准备数据的必要条件。Pandas、Numpy 和 Sci-Kit Learn 等 Python 库有助于在必要时轻松操作和转换数据。随着如此多的新 ML 算法进入该领域,理解如何为将要使用的模型准备数据仍然是必不可少的,无论是传统模型如逻辑回归还是领域如 NLP,数据准备都是必须的。

我希望这些例子中的一些对那些对他们的特定数据集执行任何 EDA 或特征工程的人有用并节省了时间。查看 [**概念链接**](https://www.notion.so/Common-Use-Cases-583a1537a87d433fb5359bd0c2c99eb9) 对于我记录的所有其他例子,这将继续更新。我附上了其他资源和特征工程的备忘单,我发现上面有帮助。请随时在 [Linkedln](https://www.linkedin.com/in/ram-vegiraju-81272b162/) 上与我联系,或者在 [Medium](https://ram-vegiraju.medium.com/) 上关注我,了解我更多的写作内容。分享任何想法或反馈,谢谢阅读!

# 地理空间分析的数据准备&用 Python 中的 Laguerre-Voronoi 进行 ML

> 原文:<https://towardsdatascience.com/data-preparation-for-geospatial-analysis-ml-with-laguerre-voronoi-in-python-71b9b418d8b6?source=collection_archive---------30----------------------->

## [实践教程](https://towardsdatascience.com/tagged/hands-on-tutorials)

## 人口和健康调查数据的加权 Voronoi 镶嵌,用于预测社会和经济福祉。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/cb9330afe462f5e39b6a35859572de43.png)

印度 GADM 边界 DHS 数据的拉盖尔-沃罗诺伊镶嵌

在这篇文章中,应用拉盖尔-Vornoi 镶嵌人口和健康调查(DHS)的数据进行了探讨。提出了清理和转换 DHS 数据的管道以及相关的 python 代码。

# 人口和健康调查数据

DHS 调查包含机密信息,这些信息有可能通过独特信息或 [PII](https://en.wikipedia.org/wiki/Personal_data) 来识别个人身份。为了避免这种情况, [DHS 项目](https://dhsprogram.com/)开发了一种方法来降低 GPS 坐标的精确度,这样就无法得到真实的居住地。在所有 DHS 调查中,记录一个聚类中人口居住地点的中心 GPS 坐标,并根据该聚类是*城市*还是*农村*应用单独的退化误差值。随机误差在农村地区最大为 5 公里,在城市地区最大为 2 公里,这将家庭识别的可能性降低了 10 倍。新的坐标列表可以被认为有一个圆形的误差缓冲区(5 公里或 2 公里),实际值位于其中。这种退化对进一步的数据分析和对这些数据的机器学习任务提出了挑战。全面准确地衡量经济福祉是研究和决策的基本投入。[世界资源研究所项目](https://www.solveforgood.org/proj/47/)的最终目标是能够利用遥感和 OpenStreetMaps 数据对印度最精细的空间微区域进行基于人口和健康调查的预测。

# 拉盖尔 Voronoi 图

在 1985 年推出的拉盖尔芙诺以图是平面上的 *n* 个点的芙诺以图概念到平面上的 *n* 个圆的拉盖尔几何概念的扩展。它是将欧几里得平面分割成由一组圆定义的多边形单元,也称为[功率图](https://en.wikipedia.org/wiki/Power_diagram)。本文中使用的图表是从下面的 [GitHub 要点](https://gist.github.com/sunayana/a3a564058e97752f726ca65d56fab529)中生成的。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bd99c41d3b6195eb4aba75b1ea2875af.png)

平面上 32 个点的功率图示例,其中每个点具有不同的半径。

# DHS 数据的拉盖尔 Voronoi 镶嵌

由于 DHS 数据中引入的退化性质,DHS 数据集的 Laguerre Voronoi 镶嵌是一种可行的模型,可用于创建国家地图的多边形分区,以进行进一步的数据分析。以印度为例介绍管道。

**预处理 DHS 数据**

*   请注意,地图上 0 度纬度(赤道)和 0 度经度(本初子午线)的交叉点位于大西洋中部,在西非海岸的几内亚湾。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8844c94935f267048300af52123e85a3.png)

显示赤道和本初子午线交点的图像

*   因此,来自任何国家特定的 DHS `GeoDataFrame` 的所有条目都可以被丢弃,其纬度和经度条目都为 0.0。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3ff837c4f7e1519526784f22c6e7c2f8.png)

DHSGeographicData 类处理 DHS 数据和成员方法 clean。

*   接下来,使用方法`DHSGeographicData.extract_dhs()`提取对计算拉盖尔-沃罗诺图重要的列。来自地理数据 [IAGE71FL.zip](https://dhsprogram.com/data/dataset/India_Standard-DHS_2015.cfm) 的印度 shapefile `IAGE71FL.shp`用于提取,并获得以下`GeoDataFrame`:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5e555f1033815eb1ff4cbfdddb4aa3dd.png)

提取步骤后的地理数据框,显示从 IAGE71FL.shp 中提取的列

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/dd3ab144f709796c5f528b8ee17a99a4.png)

由提取的地理数据框的几何列表示的纬度和经度点的绘图。

*   然后根据不同的地点是*城市*还是*农村*来分配权重,并使用`DHSGeographicData.get_sites_and_radii()`方法提取地点和权重。

# 生成加权 Voronoi

使用 [Laguerre-Voronoi GitHub 要点](https://gist.github.com/sunayana/a3a564058e97752f726ca65d56fab529)获得加权 Voronoi 镶嵌。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fa98b235e3a67f5b8873be8692455bed.png)

计算 DHS 数据的加权 Voronoi 单元图。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/86904eab4e6dc02a7f789f43addedc4e.png)

印度 DHS 聚类的加权 Voronoi 镶嵌图

# 将 DHS 数据与 Voronoi 单元相结合

接下来,将 DHS 地理数据框架与 Voronoi 像元相结合,使得 DHS 聚类中的每个点都被精确地分配一个 Voronoi 像元。目标是创建一个新的 ESRI 形状文件,其中的几何图形由 Voronoi 单元组成。成员方法`DHSGeographicData.combine_dhs_voronoi(poly_lst)`用于此

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/64fb615ec6f75cc6b4f32e36d8dd8b47.png)

DHSGeographicData 类的成员方法将 DHS 数据与 Voronoi 单元图结合起来。

# 裁剪具有 GADM 国家轮廓的组合地理数据框

[GADM](https://gadm.org/about.html) 网站用于下载特定国家的地图和空间数据。在最后一步中,DHS 数据和 Vornoi 像元的组合`GeoDataFrame`被从 GADM 下载的国家边界形状文件剪切。以下步骤用于裁剪`GeoDataFrame`并将最终输出存储到 shapefile 中以备后用。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8809711ca7946add5abb49dd32728505.png)

完整的管道

过程的所有步骤都可以在 [dhs_data_voronoi.ipynb](https://github.com/dai-mo/gis-laguerre/blob/master/examples/dhs_data_voronoi.ipynb) 中找到。下图显示了在国家边界处裁剪的 DHS 和 Voronoi 组合地理数据框架。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/afa9da33471756a89fa7e81bfbeb0d58.png)

从 [GADM](https://gadm.org/) 获得的与印度行政边界相交的组合地理数据框架

# 结论

空间划分是基于一组给定的约束条件,例如空间属性,例如自然或人文地理因素,将一个地理区域划分成有限数量的非重叠区域的过程。对于现有方法的概述,我们参考 to⁵.加权 Voronoi 是空间分割方法的一个例子。Voronoi 图被广泛用于处理人类地理问题。Voronoi 图的一些应用是在公共设施优化、城市规划和区域设计中。[在生态学](http://wiki.gis.com/wiki/index.php/Voronoi_diagram#Applications)中,Voronoi 图用于研究森林和林冠的生长模式,也可能有助于开发森林火灾的预测模型。在本项目中使用加权 Voronoi 图的原因是,一些社会和经济变量的空间结构反映了一个事实,即高变量值往往集中在其他高值附近,而低值出现在地理上彼此接近的位置。未来的工作将证明这种方法是否真的有助于预测社会和经济福祉。

# 关于我

我的专长是计算几何、几何处理以及 C++和 Python 的软件开发。目前,我正在发展与地理空间计算相关的机器学习领域的技能,并探索几何在这些领域的应用。我期待着在这一领域与社会相关项目的潜在合作。你可以在 [LinkedIn](https://www.linkedin.com/in/sunayanag/) 和 [Medium](https://medium.com/@sunayanag/about) 上和我联系。

# 承认

*   这项工作是作为 [Solve For Good](https://www.solveforgood.org/proj/47/) 项目的一部分完成的:使用机器学习、卫星图像和地面实况数据创建福祉数据层。

我要感谢:

*   [Gijs van den Dool](https://www.linkedin.com/in/gvddool/) 广泛讨论了 Voronoi 图及其在 GIS 中的使用,最终导致加权 Voronoi 图用于该项目。
*   [凯瑟琳·白金汉](https://www.wri.org/profile/kathleen-buckingham)&<https://www.wri.org/profile/rong-fang>[世界资源研究所](https://www.wri.org/)的房融
*   [卡洛斯](https://cmougan.github.io/)穆甘&罗汉·纳迪姆为好团队解决。

# 参考

[1] Imai,h .,Iri,m .和 Murota,K.(1985 年)。拉盖尔几何中的 Voronoi 图及其应用,SIAM 计算杂志,14(1),93–105。doi:10.1137/0214006

[2][DHS GPS 数据使用指南](https://dhsprogram.com/pubs/pdf/SAR8/SAR8.pdf)

【3】[纬度零度和经度零度是什么?](https://www.geographyrealm.com/zero-degrees-latitude-and-zero-degrees-longitude/)

[4]Devert Alexandre 关于[拉盖尔 Vornoi 图](https://gist.github.com/marmakoide/45d5389252683ae09c2df49d0548a627)的 GitHub Gist

[5]王,关,马,李(2014).基于加权平面的自适应晶体生长 Voronoi 图服务区划分:以广州市海珠区为例。应用地理,50,108–119。doi:10.1016

# 基于 MATLAB 的 WiDS 数据传输的数据准备

> 原文:<https://towardsdatascience.com/data-preparation-for-wids-datathon-using-matlab-d7e4d09ef78b?source=collection_archive---------39----------------------->

## 以 WiDS 2021 数据集为例分析和处理数据的资源指南

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/128bd8337cf466700e68df0891f4ebdd.png)

来源:https://www.kaggle.com/c/widsdatathon2021

# 介绍

在研究 [MATLAB 起始代码 WiDS Datathon](https://medium.com/mathworks/matlab-benchmark-code-for-wids-datathon-2021-b445e8c0e3f2) 时,我意识到对于今年的[数据科学中的女性(WiDS)问题](https://www.kaggle.com/c/widsdatathon2021/overview),数据清理、处理和特征选择将在开发精确模型中发挥最重要的作用。

在这篇博客中,我将提供一些概念和资源,你可以用来准备你的数据。这里我将使用 [WiDS 数据集](https://www.kaggle.com/c/widsdatathon2021/data)作为例子,但是您可以对您正在处理的任何数据集使用这些方法。以下方法的顺序可以根据您的直觉和数据要求进行更改。

# 导入数据集

由于内存不足问题,导入和分析大数据可能是一项挑战。在 MATLAB 中,您可以使用[数据存储库](https://www.mathworks.com/help/matlab/import_export/what-is-a-datastore.html)和[高数组](https://www.mathworks.com/help/matlab/tall-arrays.html)来加载和导入大数据。

[数据存储](https://www.mathworks.com/help/matlab/ref/datastore.html)是用于读取单个文件或文件或数据集合的对象。数据存储充当具有相同结构和格式的数据的存储库。当集合中的每个文件都太大而无法放入内存时,这是非常有用的,因为它允许您以较小的部分读取和分析每个文件中的数据,而这些部分可以放入内存。

[高数组](https://www.mathworks.com/help/matlab/ref/tall.tall.html)提供了一种处理由数据存储支持的数据的方法,该数据存储可能有数百万或数十亿行。高数组和表允许您以类似内存中 MATLAB 数组的方式处理大型数据集,而不是编写考虑数据巨大规模的专门代码。要创建高数组,首先创建一个引用数据的数据存储,然后使用 tall 函数将数据存储转换为高数组。

*参考文件:*

*   [使用高数组对大数据进行统计和机器学习](https://www.mathworks.com/help/stats/statistics-and-machine-learning-with-big-data-using-tall-arrays.html)
*   [使用高数组在 MATLAB 中分析大数据](https://www.mathworks.com/help/matlab/import_export/analyze-big-data-in-matlab-using-tall-arrays.html)
*   [读取并分析大型表格文本文件](https://www.mathworks.com/help/matlab/import_export/read-and-analyze-data-in-a-tabulartextdatastore.html)
*   [高数组逻辑回归](https://www.mathworks.com/help/stats/logistic-regression-with-tall-arrays.html)
*   [在 MATLAB 中处理大数据](https://www.mathworks.com/videos/working-with-big-data-in-matlab-1567681897209.html)
*   [高大阵列的可视化](https://www.mathworks.com/help/matlab/import_export/tall-data-visualization.html)

# 探索性数据分析

探索性数据分析旨在最大限度地洞察数据集以及数据集的底层故事和结构。它包括对数据进行初步调查的过程,以发现模式,提取重要变量,检测异常值和异常值,并通常使用统计数据和图形表示来测试假设。

以下是您在浏览数据时可以对数据执行的一些活动。

# 特征和目标变量

您会注意到[这个数据集](https://www.kaggle.com/c/widsdatathon2021/data)有许多重要的变量/列(180 个预测列,130157 个观察值)。太多的数据列会导致数据稀疏。基于一些领域知识和直觉,你可以决定哪些变量在预测一个特定患者是否患有糖尿病时可能不起重要作用。这也称为特征选择。在这个数据集中,我们的目标变量是“糖尿病”。

> 这一步主要需要领域知识,应该仔细分析以避免偏差、过度拟合和遗漏关键信息。

# 数据类型转换

你会注意到的另一个特征是变量有不同的数据类型。将分类数据类型转换为数值数据类型是一个很好的做法,这样可以使您的机器学习模型训练得更好。

*参考文件:*

*   [数据类型识别](https://www.mathworks.com/help/matlab/data-type-identification.html?s_tid=CRUX_lftnav)
*   [数据类型转换](https://www.mathworks.com/help/matlab/data-type-conversion.html)

# 数据处理

一旦你理解了数据,你的大部分时间将花在这个数据预处理阶段。数据需要预处理技术来确保准确、高效或有意义的分析。没有通用的步骤可以遵循,也没有强制性的检查来处理数据。然而,可以执行的事情很少:

*   **数据清理**是指寻找、删除和替换坏的或丢失的数据的方法
*   **检测局部极值**和突变有助于识别重要的数据趋势
*   **平滑**和去趋势是从数据中去除噪声和多项式趋势的过程,而缩放会改变数据的边界
*   **分组**和宁滨方法通过分组来识别数据特征

我将在下面更详细地介绍几个,我认为对 WiDS 数据集很重要的东西。

# 缺失数据和异常值

在该数据集中,您会发现有许多重要的变量缺少值。缺失值一般编码为“NA”、“Null”、“不可用”。大多数机器学习模型要求所有特征都是完整的,因此必须处理缺失值。我不建议通过简单的方法删除缺少值的行,尤其是在这个数据集中。因为它会删除大部分数据,并会造成信息丢失和偏差。删除数据的替代方法是输入值,用适当的替代值替换丢失的值。

离群值是与其余数据明显不同的数据点。异常值表示坏数据(收集不正确的数据)。您也可以替换和估算异常值。

下面是一些在 MATLAB 中清除缺失数据和异常值的不同方法的资源。

*   [使用随机森林算法估算缺失数据](https://www.mathworks.com/help/finance/impute-missing-data-using-random-forest.html?searchHighlight=data%20imputation&s_tid=srchtitle)
*   [数据平滑和异常值检测](https://www.mathworks.com/help/matlab/data_analysis/data-smoothing-and-outlier-detection.html)
*   [使用最近邻法估算缺失数据](https://www.mathworks.com/help/bioinfo/ref/knnimpute.html)
*   [数据科学教程](https://www.mathworks.com/videos/series/data-science-tutorial.html)

您也可以在 MATLAB Live Editor 中交互执行[数据预处理](https://www.mathworks.com/help/matlab/preprocessing-data.html)任务。

*   [在实时编辑器中清除异常数据](https://www.mathworks.com/help/matlab/ref/cleanoutlierdata.html)
*   [清除 Live 编辑器中丢失的数据](https://www.mathworks.com/help/matlab/ref/cleanmissingdata.html)
*   [在 Live 编辑器中找到变化点](https://www.mathworks.com/help/matlab/ref/findchangepoints.html)

# 处理多重共线性

该数据集的另一个挑战是多重共线性。当您的模型包含多个不仅与响应变量相关,而且彼此相关的因素时,就会出现多重共线性。在该数据中,许多变量彼此高度相关,这可能影响回归和分类练习的结果。以下是处理多重共线性的几种方法:

*   [特征选择](https://www.mathworks.com/help/stats/feature-selection.html) - *特征选择*通过仅选择测量特征(预测变量)的子集来创建模型,从而减少数据的维度。特征选择算法搜索预测器的子集,该子集最优地模拟测量的响应,服从诸如所需的或排除的特征以及子集的大小的约束。
*   [因子分析](https://www.mathworks.com/help/stats/perform-factor-analysis-on-exam-grades.html) —多元数据通常包括许多测量变量,有时这些变量会“重叠”,因为它们的组可能是相关的。因子分析是一种将模型与多变量数据拟合以估计相互依赖性的方法。
*   [主成分分析](https://www.mathworks.com/help/stats/principal-component-analysis-pca.html?searchHighlight=pca&s_tid=srchtitle) —主成分是一种回归方法,将预测因子的数量减少到一个较小的不相关成分集。该方法生成一组新的变量,称为主成分。每个主成分都是原始变量的线性组合。所有的主成分都是相互正交的,所以没有冗余信息。主成分作为一个整体形成了数据空间的正交基。
*   [正则化](https://www.mathworks.com/help/stats/regularization-1.html?searchHighlight=multicollinearity&s_tid=srchtitle)-为了减少多重共线性,我们可以使用正则化,这意味着保留所有要素,但减少模型系数的大小。两种常见的方法是:

1.  [岭回归](https://www.mathworks.com/help/stats/ridge-regression.html) —在岭回归中,我们增加λ的值,最重要的参数收缩一点,不太重要的参数**保持高值。**
2.  [套索正则化](https://www.mathworks.com/help/stats/lasso-regularization.html):在套索中,我们增加λ的值,最重要的参数收缩一点,不太重要的参数**接近于零。**

# 数据不平衡

您将在此数据集中观察到的另一个挑战是类别不平衡,即糖尿病患者的阳性和阴性类别及其特征没有类似数量的示例,这可能会阻止算法学习如何识别带有少数类别的模式。下面是一些你可以用来处理不平衡数据的方法。

*   [处理分类集成中不平衡的数据或不相等的误分类成本](https://www.mathworks.com/help/stats/classification-with-unequal-misclassification-costs.html)
*   [不平衡数据分类](https://www.mathworks.com/help/stats/classification-with-imbalanced-data.html?searchHighlight=data%20imbalance&s_tid=srchtitle)

# 后续步骤

[在此注册](https://airtable.com/shrLE1J7hVxuYAILv)开始在 WiDS 2021 挑战数据集上实施这些概念。如果您没有 MATLAB 许可证,[请在此处](https://www.mathworks.com/academia/student-competitions/wids-datathon.html)申请免费许可证。请在下面的评论中给出您的反馈或任何问题。

# 计算机视觉 2021 的数据准备工具

> 原文:<https://towardsdatascience.com/data-preparation-tools-for-computer-vision-2021-3ad4dbb95d84?source=collection_archive---------34----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/05bdddb0f0f04a42fb10adfe5f5af2fa.png)

计算机视觉前景 2021 的数据准备工具。图片作者。

***本文为计算机视觉 2021 提供了数据准备工具景观。目的是给出可用解决方案的概述,机器学习工程师可以使用这些解决方案来构建更好的模型并提高效率。下面详细解释了每个部分。***

热门的新人工智能创业公司每天都在涌现。然而,当涉及到机器和深度学习的实际使能技术时,资源相当匮乏。对于计算机视觉来说尤其如此。这就是为什么我决定建立一个数据准备工具和基础设施景观,以深入了解一家公司可以使用哪些产品和技术来提高其机器学习管道的效率。

为什么关注数据准备?很简单,因为数据准备通常占任何机器学习项目工作的 80%[1]。因此,手头拥有合适的工具至关重要。此外,人工智能模型只能与训练它的数据一样好。因此,专注于机器学习数据的前景早就应该出现了。我最近看到的这个 [Reddit 帖子](https://www.reddit.com/r/MachineLearning/comments/ifn7ua/d_what_are_the_untold_truths_of_being_a_machine/)说明了这种需求(见下面的截图)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/dbdc7aeee60707e5e695e0916c8996e9.png)

截图[作者 Reddit r/MachineLearning](https://www.reddit.com/r/MachineLearning/comments/ifn7ua/d_what_are_the_untold_truths_of_being_a_machine/g2rie2e/) 。

# 沿着价值链组织

重要的是要有一个类似于典型的机器学习开发管道的价值链的景观。这样做的原因是:( 1)很容易根据工具在价值链中的位置对它们进行分类,( 2)每个人都已经熟悉了工作流程。对于大多数机器学习项目来说,有 4 个步骤是相同的(见下图)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2237960dc3252cd7fc0da97c61a48852.png)

机器学习管道/价值链。图片作者。

这些步骤中的每一步都有不同的子步骤,我将在下面的专门章节中从数据收集开始更详细地讨论这些子步骤。

# 1.数据收集

数据收集是价值链中最关键的一步。当然,今天,可以使用许多免费的、学术的和公共的数据集来进行机器学习。迁移学习可以做很多事情。但是,许多公共数据集仅用于非商业用途。这就是为什么如果一个人想为特定的应用程序微调他们的模型,就需要自己的数据。本节试图更深入地了解这一步所需的工具。

## 五金器具

首先,我们需要硬件来收集、存储和处理数据。在这里,我们可以区分三组系统:(1)捕捉系统,例如相机、激光雷达传感器或麦克风,(2)存储系统(例如,[戴尔](https://www.dell.com/de-ch)、 [Klas](https://www.klasgroup.com/) ),以及(3)计算系统(例如,[英伟达](https://www.nvidia.com/de-de/)、[戴尔](https://www.dell.com/de-ch)、 [ARM](https://www.arm.com/) )。

第一组是如此之大,以至于它值得被包含在自己的风景中。这就是为什么我将避免在本文中详细阐述和包括捕获系统,因为这将超出范围。

(2)存储系统的专用硬件例如由[戴尔](https://www.dell.com/de-ch)、[希捷](https://www.seagate.com/de/de/)、 [Pravega](https://www.pravega.io/) 和 [Klas](https://www.klasgroup.com/) 提供。

(3)专门的计算系统例如由[英伟达](https://www.nvidia.com/de-de/)、[戴尔](https://www.dell.com/de-ch)和 [ARM](https://www.arm.com/) 提供。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f57cf379eb45b27c69025928b9be37b6.png)

例如:半合成伦理数据。物体是合成的,环境是真实的。图片来源:由 [RabbitAI](https://rabbitai.de/) 提供。

## 综合数据

一旦我们收集了真实世界的数据,我们可能会注意到数据不够,或者某些情况没有被充分覆盖。例如,对于自动驾驶来说,这可能是真的,因为事故场景很少被捕捉到。缺失的数据可以用专用工具生成。例如,对于全合成数据,存在[媒体](https://www.cvedia.com/),另一方面,对于半合成数据,可以使用 [RabbitAI](https://rabbitai.de/) 。

## 云存储

最著名的云存储提供商是[谷歌](https://cloud.google.com/)、[亚马逊](https://aws.amazon.com/)、[微软](https://azure.microsoft.com/)。尽管如此,重要的是要意识到,还有其他参与者试图通过智能数据湖解决方案进行创新。例子包括[数据砖块](https://databricks.com/de/)或 [QuBole](https://www.qubole.com/) 。

# 2.数据监管

数据监管是价值链中被低估的一步。这是一个预处理步骤,这可能是为什么许多人直接跳到更令人兴奋的行为发生的标签和培训的原因。主要目标通常是了解收集了什么类型的数据,并将其整理成一个平衡的高质量数据集。然而,通过良好的分析、选择和管理所能创造的价值是巨大的。当低准确性和高成本发生时,这里发生的错误将使你付出昂贵的代价。

## 探索和管理

不幸的是,在探索和管理未标记的原始数据方面,这个领域仍然相对空白。数据监管由清理、过滤和[处理数据](https://www.trifacta.com/data-wrangling/)等任务组成。这一点的重要性在于,许多公司只处理了大约 1%的收集数据。因此,这一步非常重要,因为这 1%(或任何其他百分比的已用数据)随后将用于训练模型。那么,如何确定使用哪 1%呢?有许多传统的解决方法,如回归(如随机森林)或原始采样方法,如随机、GPS 或基于时间戳的数据选择。然而,这个领域目前唯一提供替代方案的玩家是轻轻的。他们基于人工智能的解决方案提供了分析和智能选择方法。
除了可以处理未标记数据的[和](https://www.lightly.ai/)之外,还有针对行业的特定应用,例如自动驾驶,它利用传感器数据进行场景提取(参见场景提取部分)

## 版本控制和管理

有开源的数据版本控制解决方案,如 DVC,也有专有的解决方案,如 [roboflow](https://roboflow.com/) 或 [Pachyderm、](https://www.pachyderm.com/)或 [Dataiku](https://www.dataiku.com/de/) 。需要强调的是,支持的数据类型和提供者的关注点是不同的。Roboflow 和 [Lightly](https://www.lightly.ai/) 提供全面的平台解决方案,不仅仅是版本控制和管理,例如,DVC 只专注于版本控制。

## 场景提取

说到场景提取,我们看到了一个新兴领域。最老牌的玩家有 [SiaSearch](https://www.siasearch.io/) 、[鳞核](https://scale.com/nucleus)、 [Understand.ai](https://understand.ai/) 。

这也是许多数据注释公司通过人工劳动提供的任务。

## 匿名化

有许多开源解决方案(例如 [OpenCV](https://www.pyimagesearch.com/2020/04/06/blur-and-anonymize-faces-with-opencv-and-python/) )可用于匿名化。还有像 [Understand.ai](http://www.understand.ai) 这样专注于人脸和号牌的商业提供商。也有人努力实现“智能”匿名化。这意味着取代典型的模糊,添加了一个合成的覆盖层(例如,人脸或车牌),这不会损害机器学习模型的性能。据我所知,目前唯一提供这种解决方案的公司是 [Brighter AI](https://brighter.ai/de/) 。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a8bb9c70e053707770f40905056e54d3.png)

街上贴有标签的汽车。图片作者。

# 3.数据标记

这是一个竞争激烈的市场。近年来出现了许多玩家——其中一些甚至达到了杰出的独角兽地位,如 [Scale AI](https://scale.com/) 。也有一些公司已经存在了一段时间,如[阿彭](https://appen.com/)。如果更仔细地评估市场,可以确定三个不同的细分市场:(1)标记软件提供商,(2)标记服务提供商,以及(3)数据质量保证提供商。但是,也有可能有些玩家活跃在几个细分领域。在这种情况下,我将公司归因于其主要业务重点。

## 标签软件

几年前,构建标签软件主要是为了提供一个 UI,让它尽可能高效地在图像上绘制边界框。随着对语义分割图像注释需求的增长以及其他数据类型(如激光雷达、医学图像格式或文本)的出现,这种情况发生了巨大的变化。

今天,玩家沿着四个轴区分。一是通过行业专业化(如 [7V](https://www.v7labs.com/) 专注于医疗数据),二是通过自动化创新(如 [Labelbox](https://labelbox.com/) 、 [SuperAnnotate](https://superannotate.com/) 、 [Superb AI](https://www.superb-ai.com/) 专注于自动化标注)。第三,通过应用聚焦(如 [Segments.ai](https://segments.ai/) 聚焦图像分割)。第四,通过他们的商业模式,软件——标记界面和后端——是开放核心的,有付费网络平台和企业版本可用(例如, [Diffgram](https://diffgram.com/) )。

## 标签服务

毫无疑问,标签服务提供商市场是最大的参与者最拥挤的领域。它也是最大的市场,到 2024 年收入将达到 41 亿美元[2]。

一些知名的大玩家有:[阿彭](https://appen.com/)、 [Samasource](https://www.sama.com/) 、 [Scale](https://scale.com/) 、 [iMerit](https://imerit.net/) 、 [Playment](https://playment.io/) 、 [Cloudfactory](https://www.cloudfactory.com/) 。然而,也有更小的玩家,他们更专注于利基市场,如 [Humansintheloop](https://humansintheloop.org/) 、 [Labelata](https://www.labelata.ch/) 或 [DAITA](https://daita.tech/) 。

## 数据质量保证

去年出现的一个有趣的新领域,它专注于数据质量保证。这里的目标是找到错误标记的数据以及其他负面因素,如冗余数据或缺失数据,以提高机器学习模型的性能。

有些玩家提供这种服务,比如[incundai](https://www.incenda.ai/)或者工具,比如 [Aquariumlearning](https://www.aquariumlearning.com/) 。

# 4.模特培训

我们现在已经收集、管理和标记了我们的数据。但是,在我训练了一个模型之后,数据会怎么样呢?人们可能会认为这个过程已经完成,但这不是真的。与软件类似,机器学习模型需要用数据更新——猜猜怎么更新。因此,让我们来看看帮助我们实现这一目标的数据工具。

## 模型和数据优化

在部署之前验证和优化模型以及培训数据至关重要。应该评估的领域是模型性能、模型偏差和数据质量。为此,理解模型不确定或表现不佳的地方是至关重要的。为了更新模型,人们可以使用不同的技术,例如由水族馆学习或主动学习等公司提供的视觉评估,这由 Alectio 和[提供。主动学习是一个概念,用于查询您想要用于训练过程的新样本。换句话说,使用模型表现不佳的样本来查找相似的数据,以更新模型并使其更加稳健。](https://www.lightly.ai/)

这个领域的一些玩家有[阿莱克西奥](https://alectio.com/)、[轻飘飘](https://www.lightly.ai/)、[水族学](https://www.aquariumlearning.com/)、[神童艾](https://prodi.gy/)、[阿里扎](https://arize.com/)。

## 模型监控

一旦部署了模型,工作就会继续。有可能我们的 AI 系统(例如自动驾驶)遇到了从未见过的场景或情况。这意味着这些场景/样本在训练数据集中缺失。这种现象被称为数据或模型漂移[4]。这是一种危险的现象,也是为什么部署的模型需要持续监控的原因。

好在有很多玩家提供这样的解决方案:[阿里泽](https://arize.com/)、[提琴手](https://www.fiddler.ai/)、[水圈](https://hydrosphere.io/)、 [Superwise.ai](https://www.superwise.ai/) 、[浮潜](https://snorkel.ai/)。

## 合规与审计

不幸的是,法规遵从性和审计是一个经常被业界忽视的话题。结果是数据收集过程中的隐含偏差一直传播到应用程序的模型。重要的是要强调,没有任何借口来构建和部署不道德和不可持续的模型。公司必须意识到自己的责任,需要对开发基于深度学习的产品负责。如果他们行为不当,就应该受到惩罚。

行业内有几项自律倡议,其中包括 Google 提出的框架[3]。九名研究人员合作开发了该框架,包括谷歌员工安德鲁·斯马特、玛格丽特·米歇尔和蒂姆尼特·格布鲁,以及前人工智能伙伴关系研究员和现任人工智能研究所研究员黛博拉·拉吉。

然而,也有一些私人公司提供独立的第三方评论,如 [Fiddler](https://www.fiddler.ai/) 、 [AI Ethica](https://www.ai-ethica.com/) 、 [Yields.io](https://www.yields.io/) 和 [SAS](https://www.sas.com/de_ch/home.html) 。

# 结论

简而言之,三年前还没有出现的许多令人惊叹的工具。当时,公司必须自己开发所有工具,这使得机器学习开发非常昂贵。今天,多亏了众多的供应商,我们有可能变得更加高效和可持续。然而,仍然有很大的差距需要填补。近年来的焦点主要集中在数据标签软件和数据标签服务上,这是由大量风险投资资金推动的。这就是为什么在数据监管、质量保证以及模型验证、监控和法规遵从性领域仍有发展空间的原因。幸运的是,已经有玩家在那个领域工作,解决 AI 的新瓶颈。

我期待着今年看到更多的出现。

Matthias Heller,联合创始人 [Lightly.ai](https://www.lightly.ai/)

**PS:** 如果你最喜欢的工具不见了或者你觉得某个工具放错了地方,不要犹豫,来找我。

# 感谢

**感谢**至 [RabbitAI](https://rabbitai.de/) 为我提供半合成数据的示例图像。

**感谢**Mara Kaufmann、 [Philipp Wirth](https://medium.com/@philipp_74619) 、Malte Ebner、 [Kerim Ben Halima](https://kerim-ben-halima.medium.com/) 和 [Igor Susmelj](https://medium.com/@isusmelj) 阅读本文的草稿。

# 参考

[1]cognelytica,[AI 2020 CGR 的数据准备&标签-DLP20](https://www.cognilytica.com/2020/01/31/data-preparation-labeling-for-ai-2020/) (2020),第 3–4 页,公司出版物

[2]cognelytica,[AI 2020 CGR 数据准备&标注-DLP20](https://www.cognilytica.com/2020/01/31/data-preparation-labeling-for-ai-2020/) (2020),第 14–16 页,企业出版

[3]伊尼奥卢瓦·德博拉·拉吉、安德鲁·斯马特、丽贝卡·n·怀特、玛格丽特·米歇尔、蒂姆尼特·格布鲁、本·哈钦森、贾米拉·史密斯-卢德、丹尼尔·塞隆和帕克·巴恩斯。[弥合人工智能问责制差距:为内部算法审计定义端到端框架](https://dl.acm.org/doi/abs/10.1145/3351095.3372873) (2020)。p,33–44 DOI:https://DOI . org/10.1145/335 . 33353636736

[4] Samuel Ackerman,Eitan Farchi,Orna Raz,Marcel Zalmanovici,Parijat Dube,[检测数据漂移和离群值随时间的变化对机器学习模型性能的影响](https://arxiv.org/abs/2012.09258) (2020),

# 联系我们

如果这篇博文引起了你的注意,并且你渴望了解更多,请在 Twitter 和 Medium 上关注我们!如果您想了解更多关于我们在 Lightly 所做的事情,请通过 info@lightly.ai 联系我们。如果您有兴趣加入一个有趣的 rockstar 工程团队来帮助简化数据准备,请通过 jobs@lightly.ai 联系我们!

# 机器学习的数据预处理

> 原文:<https://towardsdatascience.com/data-preprocessing-for-machine-learning-ae3670fa31e9?source=collection_archive---------27----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/44969c0311e880f501e94f3891d84f67.png)

在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上由 [Aron 视觉](https://unsplash.com/@aronvisuals?utm_source=medium&utm_medium=referral)拍摄的照片

## 你输入的数据可能比你想象的更重要。

如果你是相当数量的程序员,那么你可能会对机器学习(ML)感兴趣。更具体地说,你可能会从听到或读到的关于人工智能行业成功的故事中受到启发:从无人驾驶汽车,到可以学习行走和跳跃的机器人,到有助于更好地做广告的自动化系统,到可以在没有投资者自主输入的情况下做出决策的交易机器人。未来当然是我们共同经历的一段激动人心又有些恐怖的旅程。

最近,技术的进步和开源/私人项目通过分散这个行业背后的大部分先进力量将 ML 领域带到了人们的手中。如果你听说过 TensorFlow、PyTorch、Sklearn、XGBoost 或 Keras 等名字,你就知道我在说什么了。随着社区的不断增长和大牌公司付出的难以逾越的努力,现在是进入机器学习、深度学习和人工智能(AI)的最佳时机。

在本文中,您不需要了解任何编程,因为我将讨论这个主题的高级概念,但是如果您已经很好地掌握了 Python 编程语言、Pandas 库和 NumPy 库,这不会有什么坏处。如果你没有,你可以在下面的我的媒体页面找到关于它们的教程和更多内容。

<https://medium.com/@third_eye_cyborg>  

在我看来,许多有志于机器学习的新手都忽略了一件事,那就是数据准备和预处理。我已经用模型工作了几天,甚至几个星期,试图让一切都按照我的预期运行,却发现这一直是我的输入数据。数据及其构造方式非常重要,准备/预处理工作可能极其细致和困难。这是因为不同类型的数量和您正在处理的数据的质量可能会因数据的类型和来源而有很大差异。您可以拥有稀疏数据或完整数据。原始数据或处理过的数据。您可能有缺少值的数据,或者没有排序的数据。可能性几乎是无穷无尽的。不过,最好理解的是,您不必理解处理特定数据集的每一种确切方法。更重要的是了解如何进行 EDA(探索性数据分析),以及如何处理扔给你的任何数据,首先了解和分析数据,然后了解如何处理数据以完成必要的预处理。

如果你正在寻找一条捷径,最好了解这条捷径。确保如果您复制并粘贴其他人的示例代码来进行预处理,它会做您认为它会做的事情。在对数据进行预处理之后,在将数据插入模型之前,我总是对数据进行健全性检查,以首先检查它是否符合我的人脑。了解您的数据以及您的模型正在获取、计算和输出这些数据,这将有助于您了解错误和常见的实践,并在整个过程中为您提供指导。

# 数据

那么,我们正在谈论的这个数据是什么呢?从广义上讲,数据是以数字方式收集并以算法可访问的方式存储的任何信息。这可能是由气象站的传感器获得的天气数据、卫星信息、股票市场数据、医疗数据或任何你能想到的可以存储在计算机中的数据。不过 ML 的关键是你的模型更适合大型数据集。这将该领域引向人类通常难以处理的大问题。如果使用正确,这将变得非常强大。

# 数据伦理

作为一名机器学习工程师或科学家,你会发现自己很想处理敏感或非法的数据。你必须在继续之前停下来,问问你自己你正在做的事情是否正确。此外,请记住研究所有可能适用于您试图处理的数据的地方、州和国家法律。请记住,机器学习领域是一个强大的领域,作为一名行动参与者,你应该始终了解你可能使用的项目、模型和数据以及你如何使用它们背后的道德、法律和隐私。

# 数据准备/预处理

如果从错误的角度来看,为机器学习模型准备数据可能会令人生畏。这个过程的第一步总是 EDA(探索性数据分析)。您的数据和接收数据的格式,以及您的编程语言,将决定您如何看待它。

如果您的数据已经在一个数据框架中,并且您正在使用 Python 来执行您的项目,那么您可以使用`.head()`。如果您接收的是 csv 或 json 格式,您可以使用 Python 中的 helper 函数将其转换为数据帧。在分析您的数据时,您应该检查是否有缺失值,数据的格式是否正确(大多数 ml 模型和库只接受数字数据,因此必须转换许多数据类型),以及数据的方差是否在可接受的范围内。您应该记下是否需要将任何计算聚合到数据集中。在详细检查之后,您应该知道您正在处理什么数据,以及需要做什么来清理它。有多种方法可以合并和重塑数据容器。有一些方法可以将计算结果聚合到一个数据集中。您可以通过多种方式重新格式化数据、处理缺失值、添加标签、分割、缩放、归一化等等。如果你期望从你的模型中得到满意的结果,这些主题中的每一个都应该被研究和理解到一个健康的水平。

# 结论

机器学习可能是令人兴奋的,老实说,探索和使用机器学习是一场爆炸,但重要的是不要忽视输入数据。如果你能在数据准备/预处理方面变得有效、高效和知识渊博,你很可能会在整合优秀的预成型机器学习模型的能力、理解和速度方面有所提高。这是一篇概念性更强的文章,旨在让人们意识到数据准备/预处理在机器学习领域的重要性。我希望任何感兴趣的人都学到了一些新东西。编码快乐!

# 使用距离函数的数据预处理

> 原文:<https://towardsdatascience.com/data-preprocessing-for-using-distance-functions-6263a5c2bd18?source=collection_archive---------42----------------------->

## 为了确保输入要素对距离函数的贡献成比例

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c72a848ff5d31b7f60a7b23c88945132.png)

[Ellen Qin](https://unsplash.com/@ellenqin?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍照

假设我们经营一个小吃摊,我们想根据顾客的饮料偏好对他们进行分类。我们将为每个客户创建一个特征向量,然后应用 k-means 等聚类算法。我们的餐厅出售 7 种饮料:可乐、零度可乐、雪碧、零度雪碧、芬达橙、芬达葡萄和咖啡。我们询问顾客对每种饮料的喜好,获得长度为 7 的特征向量,其值在 0 和 1 之间。考虑以下客户:

*   顾客 A 喜欢所有的汽水,但他不喜欢咖啡。对应的特征向量是[1,1,1,1,1,1,1,0]。
*   顾客 B 喜欢零卡路里的汽水,但是她不喜欢普通的汽水,也不喜欢咖啡。对应的特征向量是[0,1,0,1,0,0,0]。
*   顾客 C 只喜欢咖啡。对应的特征向量是[0,0,0,0,0,0,0,1]。

直觉上,我们会认为客户 A 和 B 有点相似,而客户 C 与 A 和 B 完全不同。然而,当我们计算特征向量之间的欧几里德距离时,我们得到:

*   |AB| = √4 = 2
*   |BC| = √3 ≈ 1.73

因此,客户 B 实际上离 C 比离 A 更近!注意,这个结果不限于欧几里德距离。如果我们使用其他的 *Lp-* 范数,比如曼哈顿距离,也会得到同样的结果。

## 特征对欧氏距离的贡献

这种反直觉结果的根本原因是与汽水相关的特征比与咖啡相关的特征多得多。然后,两个特征向量之间的欧几里德距离由它们在苏打相关特征上的差异决定,而在唯一的咖啡相关特征上的差异没有太大影响。为了进一步说明这一点,让我们为咖啡设计更多的特性。

我们用“喜欢黑咖啡”、“喜欢加糖的咖啡”和“喜欢加牛奶的咖啡”三个特征代替了“喜欢咖啡”这个单一特征。假设顾客 A 和 B 不喜欢任何一种咖啡,而顾客 C 喜欢所有种类的咖啡,他们对应的特征向量变成:

*   答:[1,1,1,1,1,1,0,0,0]
*   乙:[0,1,0,1,0,0,0,0,0]
*   C: [0,0,0,0,0,0,1,1,1]

它们的欧几里得距离是:

*   |AB| = √4 = 2 和之前一样,但是
*   |BC| = √5 ≈ 2.24

因此,客户 B 现在更接近客户 a。这是由于咖啡相关特征对客户 B 和 c 之间的欧几里德距离的贡献增加。

## 调整出资比例

回到最初的场景,我们将聚类算法应用于 7 维饮料偏好特征向量。假设客户 B 和 C 属于同一个集群,我们的下游应用程序不能很好地处理这个结果。除了调整我们的聚类算法,我们还可以通过增加由咖啡相关特征贡献的欧几里德距离的比例来调整聚类。有几种方法可以实现这一点:

1.  设计更多的咖啡相关的功能,正如我们在上面看到的
2.  删除一些与苏打水相关的功能
3.  扩大与咖啡相关的功能
4.  缩小与汽水相关的特征

(2)和(4)基本上与(1)和(3)相反。它们降低了汽水相关特征的重要性,从而使咖啡相关特征变得更加重要。

(3)和(4)是通常的特征缩放的变体。它们既不需要特征工程,也不需要特征选择,因此更加简便。对于通常的特征缩放,我们将诸如最小-最大归一化的缩放方法应用于每个特征,使得每个特征贡献相等。这里的不同之处在于,我们对每组要素应用了一种缩放方法,因此每组要素的贡献是相等的。

作为一个具体的例子,让我们选择(3)并扩大咖啡相关的功能。首先,我们注意到有 6 个与苏打水相关的特征,但只有 1 个与咖啡相关的特征,并且它们的值都在 0 到 1 之间。如果我们希望这两组特性的贡献相等,我们可以将咖啡相关的特性乘以√6。客户 A、B 和 C 的新特征向量是:

*   答:[1,1,1,1,1,1,0]
*   乙:[0,1,0,1,0,0,0]
*   C: [0,0,0,0,0,0,√6]

由此得出|BC| = √8 ≈ 2.83 大于|AB| = √4 = 2。

## 注意

1.  上述数据预处理步骤不限于聚类任务。它们可以应用于利用特征向量之间的距离的任何任务。
2.  在上面的例子中,我们认为咖啡相关特征的贡献太小,因此我们应用特征缩放。然而,有些情况下,我们实际上希望咖啡相关的功能只贡献一点点。也许我们的小吃摊会更加关注苏打水。也许我们会使用不同的数据集和不同的模型来分析顾客的咖啡偏好。无监督学习没有标签,大量的数据预处理步骤由下游应用和业务用例驱动。

## 常见问题

问:余弦距离有没有一些反直觉的结果?

答:是的。回想一下,顾客 A 喜欢所有的苏打水,但不喜欢任何一种咖啡。顾客 C 喜欢各种咖啡,但不喜欢任何汽水。现在假设我们有一个顾客 D,他喜欢各种饮料。直觉上,我们可能认为客户 D 与 A 和 c 的距离相等。然而,D 的特征向量是[1,1,1,1,1,1,1],并且

*   *cos _ dist*(AD)= 1–6/(√6 x√7)≈0.074
*   *cos _ dist*(AD)= 1–1/√7≈0.622

请注意,我们可以使用上一节中描述的方法之一,使客户 D 与 A 和 C 等距。

问:为什么我们在监督学习中看不到这些数据预处理步骤?

答:是因为 XGBoost、神经网络等流行的监督学习算法不计算特征向量之间的欧氏距离。如果我们使用监督学习算法,该算法利用特征向量之间的欧几里德距离(例如,k-最近邻),那么将需要上述数据预处理步骤。

## 进一步阅读

1.  我们缩放某些要素以获得新的距离值的方式可以被视为 Mahalanobis 距离的特例,并且与度量学习相关。快速介绍见[3]。
2.  一种提高基于欧几里德距离的聚类算法的性能的方法是使用核函数。例如,k-means 成为核 k-means,参见[1]和[2]的概述。可以将特征缩放合并到内核函数中。

## 参考

1.  R.Chitta,R. Jin,T.C. Havens 和 A.K. Jain[近似核 k 均值:大规模核聚类的解决方案](https://dl.acm.org/doi/abs/10.1145/2020408.2020558) (2011),KDD 2011
2.  迪伦、关和库利斯。[核 k 均值、谱聚类和归一化截集](https://www.cs.utexas.edu/~inderjit/public_papers/kdd_spectral_kernelkmeans.pdf) (2004),KDD 2004
3.  [http://contrib . sci kit-learn . org/metric-learn/introduction . html](http://contrib.scikit-learn.org/metric-learn/introduction.html)

# 自然语言处理中的数据预处理

> 原文:<https://towardsdatascience.com/data-preprocessing-in-nlp-c371d53ba3e0?source=collection_archive---------9----------------------->

## 用于文本简化的数据清理和数据扩充(不仅仅是)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5af0c8e6b0d791a14018df9b6f94e5bc.png)

不同模型在余弦相似性、源和目标长度方面的性能(图片由作者提供)

# 介绍

这是第二篇关于我使用变形金刚简化文本的文章。如果您还没有阅读第一篇文章,请随意阅读,但是理解这篇文章并不是强制性的。请随意查看该项目的 [GitHub repo](https://github.com/chrislemke/deep-martin) 。

数据预处理不仅经常被视为开发深度学习模型的更乏味的部分,而且也被低估了,尤其是在 NLP 中。所以现在是时候站出来支持它,给数据预处理应有的信任和重视了。正如在我的第一篇文章中一样,这篇文章的灵感来自于我从事文本简化的经历。它将展示一些技术——它们的优缺点以及背后的想法。

所以让我们开始吧!

# 数据清理

作为语言表示的文本是遵循例如句法和语义规则的正式系统。尽管如此,由于其复杂性及其作为正式和非正式交流媒介的作用,它还没有达到简单(预)处理所需的正式程度。这是我们在 NLP 中进行数据清洗要克服的障碍。同样,这也是我们需要数据清理的原因。

看一眼数据集就能很快弄清楚它到底是什么。对于文本简化方法,我使用了多个数据集。然后,有时你会发现这样的简化:

```
Castleton is a honeypot village in the Derbyshire Peak District , in England .
```

这篇关于卡斯尔顿小村庄的短文被简化为:

```
Derbyshire
```

这可能将文本缩短到最低限度,但我不认为这是简化。那么,我们如何才能克服这一点呢?计算余弦相似度可以告诉我们两个版本有多接近。幸运的是,有多个库可以帮助我们。为了计算余弦相似度,我们首先需要嵌入文本。如果你想了解更多关于单词嵌入的知识,有很多关于它的文章——我强烈推荐[这本](/introduction-to-word-embedding-and-word2vec-652d0c2060fa)。在本文中,我假设您理解向量嵌入。

对于 NLP 来说, [Gensim](https://radimrehurek.com/gensim/index.html) 是一个优秀且非常有用的项目。我们使用他们的 [Doc2Vec](https://radimrehurek.com/gensim/models/doc2vec.html) 库来创建文档嵌入。

我们在 *Doc2Vec* 中加载一个[预训练模型](https://github.com/jhlau/doc2vec)。然后,在使用 [scikit-learn](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.cosine_similarity.html#sklearn.metrics.pairwise.cosine_similarity) 库计算余弦相似度之前,我们推断向量。结果是一个浮点数告诉我们这两个文本有多接近:

```
0.04678984
```

这是我们所期望的。但不幸的是,Doc2Vec 以文字简洁的话表现不佳著称。“德比郡”甚至不是一个文本,而是一个单词。我们应该尝试另一个库,看看它的性能如何。

Spacy 是 NLP 中一个知名的库。它提供了词性标注、词汇化、停用词以及嵌入的功能。上面显示的代码给出了如下结果:

```
0.19534963
```

现在我们发现自己陷入了某种困境:两个不同的库,两种不同的结果。而且 *0.04678984* (Doc2Vec)和 *0.19534963* (Spacy)之间一点都不接近。如果我们看看他们使用的各种模型,我们可能会更好地理解这些差异。Doc2Vec 正在使用的模型是在英文版维基百科上训练出来的。另一方面,Spacy 正在使用在 [Commoncrawl 语料库](https://commoncrawl.org/)上训练的 [GLoVe](https://github.com/stanfordnlp/GloVe) s 单词向量。两种模型的嵌入大小 300 是相同的。为了测试,我们可以对源和目标使用一个相同的句子,然后看看两者的表现如何——我们期望的是非常接近 1:

Doc2Vec:

```
0.9235608
```

空间:

```
1.0000002
```

在这个简短的评估和信任 Spacy 已经用于许多其他任务之后,我们现在继续使用 Spacy。因此,不要忘记,这项工作是通过删除所有低余弦相似性的句子来清理数据集。但是我们怎么定义低呢?一种经验方法可以是查看数据集中具有低余弦相似性的记录,并找到可接受的阈值。

```
‘Toes are the digits of the foot of a tetrapod .’‘Toes are the digits of the foot of a animal .’
```

给了我们:

```
0.9701131
```

很明显,我们保持这个记录,对吗?现在,我们知道,但是让我们以后记住这一点。

这个怎么样:

```
‘It can cause a zoonotic infection in humans , which typically is a result of bites or scratches from domestic pets .’‘Pasteurella multocida was first found in 1878 in fowl cholera-infected birds .’
```

我们可以看到,这两个句子指的是同一个东西——多杀性巴氏杆菌。但是第二句话并不是第一句话的简化。两者结合在一起将会相互补充,这清楚地表明这不是一种简化。并且余弦相似度只有 *0.18766001* Spacy 证实了我们的假设。

但是 0.18766001 似乎是一个低门槛。所以我们继续寻找更高的目标。

```
‘Zax Wang was a member of short-lived boyband POSTM3N .’‘Wang was a member of POSTM3N .’
```

余弦相似度:

```
0.61018133
```

又对比了几次,得出了 0.6 的门槛。但是在我们开始清理我们的数据集和删除低余弦相似性的记录之前,我们必须谈论高相似性。如果我们的值> = 99 呢?这意味着这些句子彼此非常接近,甚至完全相同。这些记录不会帮助我们的模型学习简化文本,但会降低它的性能。因此,我们不仅删除余弦相似度低于 *0.6* 的记录,还删除相似度高于 *0.985* 的记录。结果是这样分布的:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2eb1d7600073dfc8e582ce011574c0f7.png)

使用这种方法,我们从数据集中删除了 40,000 多条记录。这不仅缩小了它,而且提高了它的质量。

下一步是什么?关于如何改进数据集,还有其他想法吗?Spacy 能做的不仅仅是创建嵌入。去掉停用词或者使用词汇化怎么样?

停用词被认为是一种语言中最常见的词。没有通用的清单。但是像 [NLTK](https://www.nltk.org/) 或者 Spacy 这样的图书馆提供了现成的。这个想法听起来很吸引人。但是我们对它有什么期望呢?存在许多方法,其中停用词的移除可以改善训练的性能,因此也改善模型的性能。在文本分类中,像“the”、“this”或“and”这样的词没有传递任何有价值的意思,因此没有有用的信息。但是,如果它们被视为句子语法的一部分,它们对于生成输出是至关重要的。换句话说:如果模型是一个序列到序列的模型,我们希望它能创建类似人类的句子,那么我们不能忽略停用词和语言中其他非信息部分。这同样适用于词汇化。这种对表达的屈折形式进行分组的语言过程可能只会删除少量的信息,但会扰乱处理自然语言的模型。此外,大多数预训练的标记化器没有在词条化的文本上训练——这是降低质量的另一个因素。

另一个吸引人的简单想法是删除太短的句子。这样,我们就可以删除像这样的不完整的简化:

```
Magnus Carlsen born Sven Magnus Carlsen on 30 November 1990 is a Norwegian chess Grandmaster and chess prodigy currently ranked number one in the world on the official FIDE rating list .
```

简化为:

```
Other websites
```

不知道这种奇怪的文字简化是如何产生的。但是这是为什么数据清理是必要的一个完美的例子,不是吗?删除短于——比如说——三个单词的句子会丢掉很多破记录。但幸运的是,我们已经在处理这件事了。无论如何,我们的余弦相似度算法将删除相似度仅为 *0.15911613* 的这句话。使用这种解决方案而不是按长度删除句子的一个优点是,我们保留了有效但非常短的文本。

余弦相似性方法(使用适当的阈值)似乎是一种简单而强大的方法,只需一步即可清理数据集以实现文本简化。

# 数据扩充—从无到有创建文本

当数据清理是更好的执行模型的圣杯时,数据扩充是国王的纪律。我承认这个有点夸张,但是特别是在 NLP 中,新数据的创建被证明是一个严峻的挑战。这是计算机视觉和自然文本处理再次分道扬镳的地方。虽然计算机视觉模型通常满足于获得已有图像的旋转、镜像或颠倒副本,但由于语言结构的原因,NLP 模型不幸地要求更高。但是让我们继续受到计算机视觉的启发。我们的方法应该是在现有文本的基础上创建新的文本。

```
The story about Abraham is a part of the Jewish , Christian and Islamic religions .
```

收件人:

```
The religions of Christian is a part about the Jewish , Abraham and Islamic story .
```

即使算法考虑了动词、名词、形容词等。(例如,使用 Spacy 的 POS-tagging),结果很容易是过多的垃圾。所以只要这不是机械土耳其人做的,这种方法提供好的结果似乎是不现实的。

但是除了这种语法上的修改,我们可以尝试一种更加词汇驱动的方法:同义词。由于 Python 的库集合过多,所以也有一个用于等价物。

首先,我们将看看 [PyDictionary](https://github.com/geekpradd/PyDictionary) 库:

这将打印:

```
['snake', 'moon', 'dry land', 'property', 'ice', 'catch', 'oddment', 'makeweight', 'ribbon', 'lot', 'stuff', 'peculiarity', 'web', 'physical entity', 'whole', 'hail', 'soil', 'terra firma', 'wall', 'floater', 'trifle', 'physical object', 'fomite', 'token', 'location', 'remains', 'part', 'formation', 'shiner', 'relic', 'paring', 'souvenir', 'portion', 'ground', 'charm', 'geological formation', 'earth', 'curiosity', 'small beer', 'neighbour', 'commemorative', 'vagabond', 'thread', 'good luck charm', 'film', 'vehicle', 'rarity', 'hoodoo', 'trivia', 'discard', 'curio', 'oddity', 'land', 'neighbor', 'unit', 'prop', 'filler', 'solid ground', 'growth', 'je ne sais quoi', 'head', 'triviality', 'draw', 'keepsake', 'finding']
```

伟大的开始!我们收到一个带有不同同义词的列表。即使我不得不承认“蛇”、“月亮”和“旱地”是“物体”的奇怪同义词也许我们应该试试另一个图书馆。接下来— NLTK:

```
[‘object’, ‘physical_object’]
[‘hope’]
```

这看起来更有希望。NLTK 为“object”找到了一个较小但更有用的同义词范围。更值得一试的是:

输出:

```
‘angstrom three-dimensional object rotates always around Associate in Nursing complex number line called angstrom rotation axis .‘‘angstrom three-dimensional object rotates around angstrom line called Associate in Nursing axis .’
```

有趣的是**有很多**的优化潜力🤔。检查余弦相似性以避免出现不合适的同义词可能如下所示:

```
‘A three-dimensional physical object rotates always around AN imaginary line called a rotary motion axis .’ ‘A three-dimensional physical object rotates around a line called AN axis .’
```

这种方法正朝着正确的方向发展。然而,该代码不是用于生产系统的。表演还不够好。但是我们看到同义词似乎打开了在现有文本的基础上创造新文本的可能性。还有其他的图书馆,比如[py-thesaurus](https://pypi.org/project/py-thesaurus/)——但是我们现在不会深入讨论它们。相反,我们将直接跳到下一个方法:来回翻译。

这个过程背后的想法很简单。我们把一篇文章翻译成另一种语言,比如说德语,然后再翻译回它的源语言。像往常一样,这应该是自动化的,所以我们可以使用[谷歌翻译](https://cloud.google.com/translate/docs?hl=en)或 [DeepL](https://www.deepl.com/pro#developer) 的 API。我不会在下面的例子中使用 API,而是使用他们的网站服务。让我们从[谷歌翻译](https://translate.google.com/?hl=en)开始玩吧:

源文本:

```
A three-dimensional object rotates always around an imaginary line called a rotation axis .
```

德语版:

```
Ein dreidimensionales Objekt dreht sich immer um eine imaginäre Linie, die als Rotationsachse bezeichnet wird.
```

重新翻译成英文:

```
A three-dimensional object always rotates around an imaginary line called the axis of rotation.
```

不算太坏。它至少改变了一点文本。DeepL 提供了类似的结果。它如何处理更长或更复杂的文本?这次我们尝试 DeepL:

源文本:

```
Carol I of Romania , original name Prince Karl Eitel Friedrich Zephyrinus Ludwig of Hohenzollern-Sigmaringen , later simply of Hohenzollern (April 20th , 1839) , German prince , was elected Domnitor Prince of Romania on April 20th , 1866 , following the overthrow of Alexandru Ioan Cuza .
```

德语版:

```
Carol I. von Rumänien , ursprünglicher Name Fürst Karl Eitel Friedrich Zephyrinus Ludwig von Hohenzollern-Sigmaringen , später einfach von Hohenzollern (20\. April 1839) , deutscher Fürst , wurde am 20\. April 1866 , nach dem Sturz von Alexandru Ioan Cuza , zum Domherrn Fürst von Rumänien gewählt.
```

重新翻译成英文:

```
Carol I of Romania , original name Prince Karl Eitel Friedrich Zephyrinus Ludwig von Hohenzollern-Sigmaringen , later simply von Hohenzollern (20 April 1839) , German prince , was elected Canon Prince of Romania on 20 April 1866 , after the fall of Alexandru Ioan Cuza .
```

非常好——它稍微改变了词汇和语法。这似乎是一个增加新文本的有用方法。还需要更多的尝试和研究来感受它的可靠性和潜在的改进,但这第一个非常短的见解看起来很有希望。

未来尝试的一些想法可能是,例如,在把它翻译回原来的地方之前,先把它翻译成两种不同的语言。如果我们使用不属于印欧语系的语言,也许效果会更好。还有更多的东西有待发现,我很乐观,我们可以找到一种合适的方法来扩充自然语言处理的文本。假设你对此有更多的想法或经验。请与我们分享!

以上是我关于 NLP 和文本简化的第二部分。下一部分将详细介绍如何实现和理解 transformer 架构。在那之前——再见。

# Python Pandas 中的数据预处理—第 6 部分删除重复项

> 原文:<https://towardsdatascience.com/data-preprocessing-in-python-pandas-part-6-dropping-duplicates-e35e46bcc9d6?source=collection_archive---------13----------------------->

## 数据预处理

## 使用 Python 熊猫库删除重复项的快速教程。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9e8e20fec5b559111441e62f18283caf.png)

图片来自 [Pixabay](https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=2548105) 的 [Gerd Altmann](https://pixabay.com/users/geralt-9301/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=2548105)

在这个简短的教程中,我将展示如何使用`pandas`库提供的`drop_duplicates()`函数从数据帧中删除重复项。去重是一种用于预处理数据的技术。数据预处理还包括:

*   [缺失值](/data-preprocessing-with-python-pandas-part-1-missing-data-45e76b781993?source=your_stories_page-------------------------------------)
*   [标准化](/data-preprocessing-with-python-pandas-part-4-standardization-ccd5b1608f1c?source=your_stories_page-------------------------------------)
*   [正常化](/data-preprocessing-with-python-pandas-part-3-normalisation-5b5392d27673?source=your_stories_page-------------------------------------)
*   [格式化](/data-processing-with-python-pandas-part-2-data-formatting-710c2eafa426?source=your_stories_page-------------------------------------)
*   [宁滨。](/data-preprocessing-with-python-pandas-part-5-binning-c5bd5fd1b950?source=your_stories_page-------------------------------------)

这个教程可以从我的 [Github 库](https://github.com/alod83/data-science/tree/master/Preprocessing/RemoveDuplicates)下载。

# 数据导入

首先,我导入 Python `pandas`库,然后通过`read_csv()`函数读取 CSV 文件。在本教程中,我利用了`cupcake.csv`数据集,该数据集包含在 Google Trends 上对单词`cupcake`的趋势搜索。数据是从[这个环节](https://trends.google.com/trends/explore?q=%2Fm%2F03p1r4&date=all)中提取出来的。我修改了原始数据集,以便包含重复的数据集。

```
import pandas as pddf = pd.read_csv('cupcake_duplicates.csv')
df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/da81f6ad8f73155590e1af467972f060.png)

作者图片

现在我列出数据帧中包含的记录数。我利用了`shape`属性,它显示了数据帧的行数和列数。

```
df.shape
```

它显示了以下输出:

```
(210, 2)
```

# 检查是否存在重复

为了检查一条记录是否重复,我可以利用`duplicated()`函数,如果一条记录有其他重复项,则返回`True`,否则返回`False`。

```
df.duplicated()
```

它给出了以下输出:

```
0      False
1       True
2       True
3      False
4      False
       ...  
205    False
206    False
207    False
208    False
209    False
Length: 210, dtype: bool
```

我还可以在数据帧的列子集上使用`duplicated()`函数。在这种情况下,我必须使用`subset`参数,它包含要检查的列的列表。

```
df.duplicated(subset=['Mese'])
```

现在我可以通过`True`记录的总和计算出重复的数量。

```
df.duplicated().sum()
```

它给出了以下输出:

```
6
```

# 删除重复项

现在,我可以通过`drop_duplicates()`功能删除副本。我可以使用不同的策略:

*   基于所有列删除所有重复项
*   基于某些列,删除所有重复项

在这两种策略中,我可以决定是否维护重复值的副本。这可以通过作为输入传递给`drop_duplicates()`函数的`keep`参数来完成。

```
df1 = df.drop_duplicates()
df1.shape
```

它给出了以下输出:

```
(204, 2)
```

这意味着已经从数据集中移除了 6 个元素,这对应于 6 个副本。

或者,我也可以删除第一个副本:

```
df2 = df.drop_duplicates(keep=False)
df2.shape
```

它给出了以下输出:

```
(201, 2)
```

我注意到有 9 条记录已经从数据集中删除。

作为一种额外的策略,我可以根据列的子集删除重复项。这可以通过使用`subset`参数来完成。

```
df3 = df.drop_duplicates(subset=["Cupcake"])
df3.shape
```

它给出了以下输出:

```
(78, 2)
```

在这种情况下,从数据集中删除了大量记录。

# 摘要

在这篇简短的教程中,我描述了如何使用 Python `pandas`从数据集中删除重复项。可以使用`drop_duplicates()`功能。根据所需的输出,可以向函数传递不同的参数。

如果你想了解我的研究和其他活动的最新情况,你可以在 [Twitter](https://twitter.com/alod83) 、 [Youtube](https://www.youtube.com/channel/UC4O8-FtQqGIsgDW_ytXIWOg?view_as=subscriber) 和 [Github](https://github.com/alod83) 上关注我。

# 相关文章

</data-normalization-with-python-scikit-learn-e9c5640fed58>  </data-preprocessing-with-python-pandas-part-5-binning-c5bd5fd1b950>  </data-preprocessing-with-python-pandas-part-4-standardization-ccd5b1608f1c>  

# 新到中?您可以每月订阅几美元,并解锁无限的文章— [点击此处](https://alod83.medium.com/membership)。

# 数据处理和分析:熊猫 vs SQL

> 原文:<https://towardsdatascience.com/data-processing-and-analysis-pandas-vs-sql-66b4f75db54d?source=collection_archive---------45----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9d3c521ad7330ae1fe6064b16fa60ab7.png)

照片由伊戈尔·沙巴林拍摄

SQL 是许多数据库中访问和操作数据的主要工具。它设计用于处理存储在数据库容器(称为表)中的表格数据,允许您有效地访问、分组、合并和分析不同表中的数据。反过来,Pandas 库被设计为高效地对加载到 Python 脚本中的数据集执行所有这些操作。所以,pandas DataFrame 是一个类似于 SQL 表的二维数据结构。

本文提供了 pandas 和 MySQL 示例,说明了如何使用这些工具来组合数据集,以及如何对其中的数据进行分组、聚合和分析。

# 准备您的工作环境

为了遵循本文提供的示例,请确保在 Python 环境中安装了 pandas 库。如果您还没有它,最简单的安装方法是使用 pip 命令:

```
pip install pandas
```

要使用 SQL 示例,您需要访问 MySQL 数据库。有关如何在您的系统中安装它的详细信息,请参考《MySQL 8.0 参考手册》中位于[https://dev.mysql.com/doc/refman/8.0/en/installing.html](https://dev.mysql.com/doc/refman/8.0/en/installing.html)的“安装和升级 MySQL”一章,或 MySQL 未来版本的相应章节。

一旦有了 MySQL 数据库,就需要在其中创建几个示例表。为此,您可以在 mysql >提示符下执行以下 SQL 语句:

```
CREATE DATABASE mydb;
USE mydb;CREATE TABLE stocks(
 dt DATE,
 symbol CHAR(10),
 price DECIMAL(10, 4)
);
```

此外,您需要安装一个 Python 驱动程序,以便从 Python 内部与 MySQL 服务器进行通信。这可以使用 pip 命令来完成,如下所示:

```
pip install mysql-connector-python
```

# 获取数据

要继续下去,您需要获得一些数据来处理。许多流行 API 的 Python 包装器将数据作为 pandas 对象返回。在下面的代码片段中,您通过 yfinance Python 包装器调用 Yahoo Finance API。特别是,您获得了几个报价机的股票价格数据。数据以熊猫数据帧的形式返回,将在文章示例中使用:

```
import pandas as pd
import yfinance as yf
stocks = pd.DataFrame()
symbols = ['MSFT','AAPL','TSLA','ORCL','AMZN']
for symbol in symbols:
 tkr = yf.Ticker(symbol)
 hist = tkr.history(period='5d')
 hist[‘Symbol’]=symbol
 stocks = stocks.append(hist[['Symbol', 'Close']].rename(columns={'Close: 'Price'}))
```

然后,您可能希望将相同的数据插入到 MySQL 数据库表中,以便可以对相同的数据集执行 SQL 示例。但是,在这样做之前,您需要执行一些转换:

```
#Preparing the data 
stocks = stocks.reset_index().rename(columns={'Date': 'Dt'})
stocks[‘Dt’] = stocks[‘Dt’].astype(str)
s = stocks.values.tolist()
```

在下面的代码片段中,您将数据插入数据库:

```
#Inserting the data into the database
import mysql.connector
from mysql.connector import errorcode
try:
 cnx = mysql.connector.connect(user='root', password='pswd',
 host='127.0.0.1',
 database=’mydb’)
 cursor = cnx.cursor()
 query_add_stocks = """INSERT INTO stocks (dt, symbol, price) 
 VALUES (STR_TO_DATE(REPLACE( %s, '-', '/' ), '%Y/%m/%d'), %s, %s)"""
 #inserting the stock rows
 cursor.executemany(query_add_stocks, s)
 cnx.commit() 
except mysql.connector.Error as err:
 print("Error-Code:", err.errno)
 print("Error-Message: {}".format(err.msg))
finally:
 cursor.close()
 cnx.close()
```

# 对数据集执行分组

使用 DataFrame.groupby()方法,您可以将 DataFrame 的数据拆分为具有一个或多个列的匹配值的组,从而允许您对每个组应用聚合函数。在下面的示例中,您按股票数据框架中的符号列进行分组,然后对形成的组中的符号列应用 sum()聚合函数:

```
print(stocks.groupby('Symbol').mean().round(2))
```

结果,您应该会看到类似这样的内容(当然,您会得到不同的数字):

```
Price
     Symbol 
AAPL 125.88
AMZN 3231.97
MSFT 245.61
ORCL 78.91
TSLA 583.09
```

如果使用以下 SQL 查询请求数据库中的股票表,也可以得到相同的结果:

```
SELECT
 symbol,
 ROUND(AVG(price),2) TOTAL_mean
FROM
 stocks
GROUP BY
 symbol
ORDER BY 
 symbol;
```

以下是输出:

```
+ — — — — + — — — — — — +
| symbol | TOTAL_mean |
+ — — — — + — — — — — — +
| AAPL | 125.88 |
| AMZN | 3231.97 |
| MSFT | 245.61 |
| ORCL | 78.91 |
| TSLA | 583.09 |
+ — — — — + — — — — — — +
5 rows in set (0.00 sec)
```

# 分析数据处理

要执行您的分析,您可能需要执行比调用单个聚合函数更复杂的数据聚合操作,如前面的示例所示。继续我们的股票价格数据集,假设您想要确定波动性最高和最低的股票。首先,您需要通过 ticker 对数据集中的数据进行分组。然后,您可以使用 lambda 机制将几个聚合函数应用于 groupby 对象:

```
print(stocks.groupby("Symbol").agg({(‘vol’, lambda x: 100*(x.max() — x.min())/x.mean())}).round(2))
```

所以你得到了每个股票的波动性:

```
Price
     vol
Symbol 
AAPL 2.08
AMZN 1.38
MSFT 3.36
ORCL 0.87
TSLA 7.37
```

对于 SQL,您可以使用以下 SELECT 语句获得相同的结果:

```
SELECT
 symbol,
 ROUND(100*((MAX(price) — MIN(price))/AVG(price)),2) volatility
FROM
 stocks
GROUP BY
 symbol
ORDER BY
 symbol;
```

以下是输出:

```
+ — — — — + — — — — — — +
| symbol | volatility |
+ — — — — + — — — — — — +
| AAPL | 2.08 |
| AMZN | 1.38 |
| MSFT | 3.36 |
| ORCL | 0.87 |
| TSLA | 7.37 |
+ — — — — + — — — — — — +
5 rows in set (0.00 sec)
```

有关更多示例,请查看我最近在 Oracle Connect 上发表的文章[如何使用 pandas 运行 SQL 数据查询](https://www.oracle.com/news/connect/run-sql-data-queries-with-pandas.html)和[使用 Python 和 pandas 编程滚动窗口数据分析](https://www.oracle.com/news/connect/using-python-pandas-time-series-data-analysis.html)。

# 数据产品和经济 2.0

> 原文:<https://towardsdatascience.com/data-product-economy-2-0-a4263471fb56?source=collection_archive---------21----------------------->

## 重新思考数据产品及其商业模式

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a1685a853c729feb77db8e7dc1c9e3d3.png)

丹尼尔·利维斯·佩鲁西在 [Unsplash](https://unsplash.com/s/photos/abstract-oil-paiting?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的照片

**TD;DR** —两种趋势正在定义数据产品和生态系统的未来。在这篇文章中,我讨论了新兴的数据共享范式、激励结构和准协作算法如何让公司保持相关性、生存、跨越,更重要的是,培养可持续的数据生态系统。

AI 复生已经 10 年左右了;公司开始经营用户数据已经有几十年了;自从人们为公平与强者斗争以来,已经有几千年了。数据产品一直是不公平合同的经纪人、财富的分割者和社会动荡的催化剂。

**你可能会想:**嗯,这听起来很适合介绍一部政治小说,但是**作为一名企业高管、产品经理或科技企业家,我有什么错,从中能得到什么?由于两个定义未来的趋势,我们现在必须重新思考如何处理数据产品并采取行动。否则,企业将失去客户,与监管机构发生纠纷,利润率也会受损。作为一个社会,我们将继续被困在一个不公平的契约中。**

## 但是等等,什么是数据产品及其影响?

**数据产品**是一种产生现金的产品或服务——[通常体现在移动和桌面应用](/designing-data-products-b6b93edf3d23)——它与用户互动,在过程中收集数据,不断完善数据,并通过自动决策算法增强未来的服务。

**用户**可以是客户,也可以是员工。**数据**可以是从用户、运营、系统和供应商那里获取的信息;它还包括所有派生数据(即,通过结合用户和运营数据的客户细分数据)。**自动决策算法**是基于规则的基本分析和高级机器学习(ML),它接收数据并输出用户可以看到并做出反应的东西。所有这三个要素必须协同工作,通过向用户提供更多服务或向其他人出售数据来为公司产生现金。

通过数据产品,我们创建了一个**“数据供应链”**,它建立在用户数据的丰富性、完整性和质量之上:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/331578473cbdc5d9267ffee5825eec16.png)

图 1 —数据供应链(今天),作者的分析

与咖啡行业类似,用户作为数据生产者(咖啡豆农民)创建和提供数据。公司用数据产品收获用户数据,然后提炼再卖给下游的数据购买者。价值在整个数据供应链中产生、交换和流通。

## **为什么数据产品很重要?**

**拥有数据产品的公司占据主导地位。**在过去 10 年中,专注于数据产品或使用数据产品来补充其现有产品的公司已经占领了市场。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8b010d1f828a543f9628bf7429a52a14.png)

图 2— [最大公司的有形与无形资产](https://ipcloseup.com/2019/06/04/21-trillion-in-u-s-intangible-asset-value-is-84-of-sp-500-value-ip-rights-and-reputation-included/)

更重要的是,无形资产的增长超过了传统资产,如办公室、设备和人员。数据是品牌、专利、关系等无形资产的关键要素之一。

**数据产品创造价值飞轮。在顶级公司,数据产品不仅能产生现金,还能产生更多更好的数据。这使得公司能够复合增长的用户获取和活动,收入和无形资产。**

**数据产品带来弹性。**大多数公司(如果不是全部的话)都受到了 COVID 的影响。在短短几个月内,数据产品公司(蓝色)反弹并保持增长,而其他公司(红色)仍在受苦。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/68d0fd362f4f33c206b6a1ca2f2cc364.png)

图 3-图 1 中公司的 S&P500 股票价格,从 COVID 开始,雅虎金融,截至 2020 年 12 月 30 日

## 是什么塑造了数据供应链的未来?

两个大趋势正在影响着企业在不久的将来将会(也必须)如何运作。一个是隐私,另一个是经济压力和新冠肺炎带来的加速数字化。这两种趋势都可能扰乱数据产品公司的运营方式,并为其他公司创造跨越式发展的机会。

**隐私觉醒。**全球最大的国家和市场正在实施越来越严格的隐私法。在欧盟,我们有 GDPR;在中国,我们有中华人民共和国网络安全法;在美国,我们有《加州消费者隐私法》(CCPA);在加拿大,政府正在通过数字宪章实施法案([DCIA](https://www.ic.gc.ca/eic/site/062.nsf/eng/00119.html))——一旦通过,如果不遵守,公司将被罚款全球收入的 5%。

除了自上而下的隐私法规,普通用户对公司如何管理他们的数据更加了解和敏感。最近的 WhatsApp 数据隐私反弹强烈表明,人们对隐私的期望越来越高(也越来越困惑)。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4a9f66f055f7dee22cc456df74827c5c.png)

图 4 —消费者对流行应用如何处理用户隐私的反应,2021 年 1 月 12 日— SensorTower

**COVID 捏推**。COVID 正在暂停我们的活动、交易和经济。许多公司正面临现金短缺。根据德勤的分析,没有政府的支持,这不会永远持续下去,许多公司可能只有[2-3 个月的现金跑道](https://www2.deloitte.com/content/dam/Deloitte/global/Documents/About-Deloitte/gx-COVID-19-managing-cash-flow-in-crisis.pdf)。因此,保存现金和发现新的机会来延长现金跑道成为当务之急。

半开玩笑地说, [COVID 已经取代 CTO](https://www.forbes.com/sites/peterhigh/2020/05/26/who-led-your-digital-transformation-your-cio-or-covid-19/?sh=423f4e855323),成为全球数字化转型的最强冠军。这意味着公司正在更快地推出更多的数据产品。这不是好事吗?是的,但这也意味着公司在未来变得更加依赖数据产品。因此,公司必须做得正确,并适应新的期望。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2192ce75eb808a5fbefc94e312e8512a.png)

图 5 — COVID 对数字化客户互动的影响,[麦肯锡 2020 年](https://www.mckinsey.com/business-functions/strategy-and-corporate-finance/our-insights/how-covid-19-has-pushed-companies-over-the-technology-tipping-point-and-transformed-business-forever)

**点点滴滴:**隐私和 COVID 趋势可能会影响数据供应链中的所有参与者。未来数据生态系统的工作方式将会非常不同。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/736577833bb4363ef4114ca72a4d94b6.png)

图 6 —数据供应链的挑战(未来),作者的分析

**未来会有什么不同?**首先,普通用户可能会对公司、数据产品以及他们共享的数据更加挑剔。这将限制推动数据生态系统其余部分的数据供应。其次,数据产品有新的隐私需求需要满足。这将需要重新设计和开发,以继续合法运营。最后,在某些情况下,由于隐私要求和他们过去收集的数据丢失,公司可能无法运行某些高性能算法。这意味着向下游数据消费者提供的产品和价值减少。

我们能做什么?从公司的角度来看,数据产品及其激励结构是控制服务、适应、保持相关性、竞争和跨越的两个因素。

## 数据产品 2.0 应该是什么样子?

当混乱隆隆作响时,机会就出现了。有三种**有前途的解决方案**,我将在本文中介绍,并在后续文章中分享更多细节。[如果你想一起探索更多,请继续关注 Medium](https://medium.com/@ianxiao) 或者在 [LinkedIn](https://www.linkedin.com/in/ianxiao/) 上联系我。

保护隐私。如果我们能够在更好地处理数据的同时遵守更严格的隐私要求,会怎么样?

遵守隐私条例是不容置疑的。但它经常与商业目标相冲突,并被视为创新的倒退。我相信有一种新的方式来实现这一点(而不是妥协的中间地带):我们可以使用隐私保护原则、数据工具和分析技术来允许公司运行传统用例,并探索新的创新方式,而不违背隐私承诺。 [Andrew Trask](https://www.linkedin.com/in/andrew-trask-3763ba15b/) 用一个医疗保健的例子很好地解释了它的工作原理。这开启了一个全新的应用领域。

**创建公平的(更)循环数据经济。**如果我们为创造更好、更多数据的用户付费呢?

简单来说,这意味着一种新的与用户分享利润的商业模式。类似于从储蓄账户获得利息或从投资中获得红利,利润分享安排可以创造一个透明、双赢和积极强化的数据生态系统。

作为数据所有者的个人获得了额外的收入流。公司、数据消费者获得更多更好的数据,并通过数据产品飞轮,实现比没有利润分享计划更高的经济价值。支付可以是现金、信用卡或其他形式的认可。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7fcd012969671862a9639ad3143e5045.png)

图 7— [杨](https://www.springer.com/gp/book/9783030630751)隐私保护范式下的利润分享模型

为用户的数据付费并不是一种新模式。忠诚产业已经发展出一种工作模式。机会在于采用类似的功能,并根据用户数据质量和影响来优化经济效益。数据利润分享模式将为公司竞争、创新,更重要的是,维持健康的数据生态系统开辟一条新的途径。

采用一种新的准协作方法来进行机器学习。为了实现利润分享结构,同时尊重生态系统参与者的隐私和专有数据资产,我们需要依赖一种新兴的协作算法,称为 [**【联邦学习】**](https://ai.googleblog.com/2017/04/federated-learning-collaborative.html) **(FL)** 。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d95fd61672cbdec2038fe84e063acd73.png)

图 8——涉及多家竞争中国银行的 FL 示例设计,[微众银行](https://www.fedai.org/cases/utilization-of-fate-in-anti-money-laundering-through-multiple-banks/)

FL 是一种新的计算和算法范式,它允许公司-合作伙伴和竞争对手-在他们没有(也不应该)访问的数据上训练他们的 ML 算法,并跟踪每个数据点对模型改进的贡献,以及最终的业务结果。

**迈向数据产品 2.0 的旅程值得投资吗?我们的未来仍在不可避免的变化中展开。让我们问自己一些尖锐的问题。**

## 数据产品 2.0 和商业模式的未来

*   如果用户可以从他们生成的数据中获得“数据利息”,就像投资在银行的钱一样,会怎么样?
*   如果人们对数据的兴趣是基于其质量和对消费者的影响而产生的,那会怎么样呢?
*   如果公司,甚至是竞争对手,可以在不侵犯隐私和暴露商业秘密的情况下共享数据,会怎么样?
*   如果政府使用市场驱动的方法和政策来鼓励正确使用和保护数据,会怎么样?
*   如果有了新的激励结构和联合学习,公司可以对数据资产进行整体估值,进行更好的会计核算,并在资产负债表上进行跟踪,情况会怎样?

我不知道这些问题的所有答案。我们作为商业和数据社区的集体,可以一起书写我们历史的下一个篇章。

让我们多想想这个。直到下一次。

GIPH

**喜欢你读的东西?**在[媒体](https://medium.com/@ianxiao)、 [LinkedIn](https://www.linkedin.com/in/ianxiao/) 或 [Twitter](https://twitter.com/ian_xxiao) 上关注我。还有,作为一名数据科学家,要不要学习商业思维和沟通技巧?看看我的“[对机器学习的影响](https://www.bizanalyticsbootcamp.com/influence-with-ml-digital)”指南。

以下是我的一些文章,你可能会感兴趣。

</data-science-is-boring-1d43473e353e>  </the-most-realistic-data-science-career-guide-d12c4af87cc8>  </build-full-stack-ml-12-hours-50c310fedd51>  </the-most-useful-ml-tools-2020-e41b54061c58> 

# 数据产品管理

> 原文:<https://towardsdatascience.com/data-product-management-ffa582f7e047?source=collection_archive---------6----------------------->

## 人工智能创造价值的缺失环节

***由 Nadiem von Heydebrand,CEO &联合创始人,***[*mind fuel*](https://www.mindfuel.ai/) ***和 Philipp Hartmann,主管 AI 战略,*** [*施戴*](https://www.appliedai.de/)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/41024826ab3011d339a6b0b7f65751cf.png)

Ashkan Forouzani 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

看看这些天人工智能和机器学习的应用,一个巨大的鸿沟似乎正在打开:一方面,大多数科技公司应用机器学习是常态。事实上,如果不使用机器学习,优步、Airbnb、Zalando 甚至抖音等公司的商业模式今天将不再有效。另一方面,在新冠肺炎疫情中,有一些大公司继续大量投资于数据和人工智能计划( [NewVantage Partners](https://www.newvantage.com/thoughtleadership) ),但只有少数公司报告他们的计划产生了重大的商业影响。大量已启动的 ML 项目仍然停留在 PoC 级别,无法达到投入生产的门槛—研究报告失败率在 80%到 90%之间。

这种在“传统”企业中缺乏影响力,失败项目占比高的原因是什么?当然,有各种各样的原因,例如,技能和人才的竞争,新技术的采用,当然,当你有一个完全数字化的产品而没有遗留的 it 系统时,更容易应用机器学习。但最重要的是,我们越来越频繁地观察到的一个主要原因是缺乏一种*AI*产品思维。许多人工智能计划忘记考虑一个计划为用户创造什么价值,因为人工智能具有内在的特征,使得在计划的早期阶段进行精确的规划相当困难。

这样的挑战针对当今团队中的两类人:

首先,**人工智能人员**目前大多具备技术技能,通常缺乏数字产品管理领域的知识及其流程和方法。

其次,**产品经理**需要了解数据产品的独特要求,以及机器学习功能是如何开发的,因为它们在某种程度上将成为未来任何数字产品的一部分。

我们认为,需要一个专门的学科和角色来使数据驱动的产品取得成功。我们称这个角色为*数据产品经理*。

**用户关心他的问题是否得到解决——而不是机器学习模型是否有 90%或 95%的准确率**

“传统”企业中的人工智能计划通常被组织为项目(T4),即使目标是开发“数据产品”。它们很大程度上遵循与大型企业中的其他计划类似的结构:应该根据特定的预算约束和时间限制交付预定义的范围。当期望的产出产生时,该计划被认为是成功的。同样,如果一个模型能够以一定的准确度预测某事,机器学习项目通常被认为是成功的。

这有什么问题,为什么?来自数据产品管理领域的项目可能会把你诱入陷阱:许多数据计划和开发——以项目模式管理——承担着忘记用户的风险。当这种情况发生时,最终会导致组织难以真正将数据产品应用到他们的业务流程、产品或服务中。因此,最终完成的项目逐渐消失,没有创造任何业务成果,没有为用户或业务增加真正的价值,也没有促进组织的数据文化。

当然,把用户放在第一位的意识对于人工智能来说既不是新的也不是特定的。然而,人工智能的固有属性使得产品思维的使用成为绝对必须:

首先,在人工智能和人工智能的世界中,组织只能在开发阶段后判断产品或解决方案的全部潜在结果。通常,在开发阶段开始之前,他们只能部分地确定典型的项目参数,如事先规定的产出、预定的结束日期和固定的预算。因此,有了产品思维,计划过程反映的是产品的概念,使用产品发现方法和假设。

其次,AI 解决方案永远不会“完成”或“最终交付”。它们需要与产品生命周期相当的连续交付和运营。因此,组织需要建立一个专门的团队(或多个团队)来负责特定的人工智能产品——就像他们为常规产品所做的那样。该团队负责产品的持续开发及其在组织内的完全集成和采用。

第三,为了充分利用数据产品的价值,必须将它们集成到更大的生态系统中,例如数字产品或平台。将功能集成到整个生态系统中是数字产品管理中的典型任务。

综上所述,AI 和机器学习解决方案的开发应该被认为是“真正的产品”,才能取得成功。说到“产品”,它不仅包括向外部客户提供的服务,还包括内部产品或服务,即任何类型的旨在从数据中创造价值的计划。

**利用慕尼黑再保险公司位置风险情报平台的产品思维**

世界领先的再保险公司慕尼黑再保险公司的例子也清楚地表明了采用产品思维的好处。

为了提供全新的客户体验,风险管理合作伙伴,一个专门从事风险管理解决方案和服务的部门,Munich Re 推出了其独特的 SaaS 风险评估和管理解决方案,以解决公司因自然灾害和气候变化而面临的物理和金融风险。在 2019 年成功上市后,对数据产品生命周期管理的需求迅速成为焦点。通过实施定制的数据产品管理方法,风险管理合作伙伴在以现代方式进一步开发解决方案的同时,还处于持续产品运营的地位。整个产品团队学会了保持竞争优势,以及如何满足客户需求,同时保持高满意度。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c59147b86e0d3de1ceafcaecdf9383da.png)

慕尼黑再保险公司的位置风险情报/慕尼黑再保险公司许可([https://www . Munich Re . com/en/solutions/for-industry-clients/Risk-suite . html](https://www.munichre.com/en/solutions/for-industry-clients/risk-suite.html))

通过建立跨职能团队,数据产品经理、产品负责人、数据科学家和软件工程师作为一个团队,在过去 12 个月内显著增加了客户群,并在成功的合作中推动了客户和 Munich Re 的业务。从项目组织转变为产品组织并实施数据产品管理有助于风险管理合作伙伴持续发现新功能,并在真正基于数据的业务模式中交付客户成果。

**负责价值创造流程——数据产品经理的角色**

每当与数据科学团队合作时,很快就会发现:人工智能和人工智能学科是工程科学专业的一部分。数据科学家和 ML 工程师通常习惯于关注他们开发的解决方案的技术可行性。这种视角有时会阻碍对确保成功的其他因素的了解,例如,业务案例是否有说服力,或者用户或客户实际需要什么。

从业务角度和用户角度考虑解决方案是产品管理的全部内容。产品管理的口头禅一直是平衡三个维度,即*可行性、生存能力和合意性*。虽然每个维度需要不同的技能,包含不同的工具和方法,但它的组合通常会导致产品成功,从而产生业务成果。

将产品管理原则应用于数据产品,很明显生态系统需要产品经理的一个额外维度:数据能力。该维度满足了对数据领域渊博知识和技能的需求。可数据性的观点评估现有产品想法的数据潜力,并将确定的假设整合到上面解释的产品管理咒语中。因此,通过结合*的可行性、生存力、合意性和数据性*,数据产品可以被概念化、设计,并以适当和成功的方式实现。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5589ac47e199e0b552a5ef2ccc188a3f.png)

数据产品管理人员的定义燃料组获得许可

**建立正确的团队,用产品思维解决人工智能产品**

所以,让我们建立一个未来的产品团队——一个跨职能的团队。为了能够为用户和客户创造价值,我们首先需要指定 AI 模型应该集成的环境:它是否会像数字产品或平台一样集成到另一个系统中?它是否会被部署到某个终端以供消费,例如以仪表板或技术服务的形式?它会作为微服务嵌入到各自的架构中吗?

让我们假设我们想要将它集成到一个数字产品中,这需要与负责的产品团队进行强有力的协作。这会导致以下团队设置:

● *数据产品经理*:他们在与数据产品团队密切合作的同时,通过在相关业务模型内调整业务案例假设,了解客户的需求和愿望,解释潜在的数据功能,从而在数字产品团队中搭建桥梁。

● *数据产品负责人*:数据产品负责人与数据科学团队一起负责数据产品的实现。他们拥有开发,并确保产品满足来自业务领域的所有需求。他们与数据产品经理密切合作,并与他紧密合作。

● *UX 设计师*:UX 设计师支持数据产品经理和数据产品负责人的责任团队,以结构化的方式了解客户的需求。他们创建客户洞察,测试和验证它们,并将其转化为清晰的技术需求和实现概念。在这一点上,重要的是要明白,为了满足用户对后期产品的期望,不仅仅是关于用户界面(前端)的视觉设计,而是关于整个用户体验。

● *数据科学家*:数据科学家摆弄数据。更具体地说,他们从组织内可用的大量数据中获得洞察力。利用他们出色的统计学知识,他们进行分析并发现数据中的模式和结构。他们可以验证和展示数据驱动的用例及假设。

● ML 工程师:ML 工程师实施人工智能系统。他们对整体解决方案负有技术责任,并管理 AI 产品的可扩展性、可再现性和整体质量。

● *数据工程师*:数据工程师与数据科学家和 ML 工程师密切合作,负责所谓的数据管道,从数据源提取数据并将其存储在适当的概念中。在大多数情况下,他们还拥有数据架构,并确保 AI 在可用技术栈上的技术可实现性。

● *DevOps 工程师*:devo PS 工程师搭建通向数字产品团队的技术桥梁。他们与其团队成员密切合作,负责集成部分,测试数据产品 end2end,并与数字产品的技术团队保持一致。

**你如何用产品思维触发创造人工智能产品的过程?**

从产出转向结果,从项目转向产品是一个巨大的进步。涉及到*变化*,高度*结构化*,流程操作*感。这是一种思维方式的转变,因此需要所有利益相关者的自律和一致性。如果你只是觉得有必要为你的人工智能产品开始一个产品思维,我们建议从三件简单的事情开始:*

1.  **命名并指定您想要生成**的*结果*:关于结果的讨论是正确的第一步。集思广益,讨论你希望在流程结束时看到什么样的实际结果,以及谁将从中受益。定义一个目标或 KPI,使其变得切实可行。
2.  **评估您的团队设置,重点关注活动**:每个产品都是不同的,每个用例都需要不同的技能。因此,团队总是有理论上定义的略微不同的角色。虽然角色可能是不同的,但是交付产品所需的活动是不同的,因此团队需要基于要覆盖的活动的数量来设计。在较小的产品中,活动由一个角色负责,例如,数据科学家负责 ML-工程师的活动,或者数据产品负责人负责数据产品经理的活动,每当产品扩展时,角色都需要拆分。
3.  **设计并引入数据产品生命周期过程**:真正的工作从数据产品推出并被用户或客户消费时开始。他们会提供反馈(如果你幸运的话),这些反馈需要整合到你的开发过程中。你的生命周期管理的专业程度和你能建立的连续性将严重影响成果创造过程,从而影响接受者对它的看法。

当你通过现有的各种方法和工具实现成果创造的可操作性时,一种产品思维模式迟早会出现和建立——数据产品的成功将会增长。最重要的是,你的用户或顾客会为此感谢你。

# 数据质量是一个商业问题

> 原文:<https://towardsdatascience.com/data-quality-is-a-business-matter-23e89b57fbbc?source=collection_archive---------40----------------------->

## [意见](https://towardsdatascience.com/tagged/opinion)

## *让我们开始讨论业务问题,而不是数据质量问题*

数据质量可能是一个由美国数据管理狂热分子创造和推崇的术语,但它是一个商业问题。最终,**一个组织中努力工作的员工从数据质量改进计划中获益最多**。我认为这一点怎么强调都不为过。在这篇博客中,我想强调从商业角度处理数据质量的步骤。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0579273c522d4d11acc751899c0da8de.png)

*努力工作的员工不应该沮丧——作者图片*

# **1。确定您的业务瓶颈**

看看您的业务流程中的瓶颈。倾听那些努力工作的员工,听他们说完。他们的挫折是什么?他们必须处理哪些问题?分解一下。例如,当员工因为没有收到正确的价目表而不得不等待时。或者因为找不到商业伙伴的电话号码而联系不上他。或者顾客抱怨是因为他们被收取了错误的价格。虽然这些听起来很小,但在规模上很重要。执行管理层会理解为什么这些是问题,它们是业务问题。然而,所有这些都根源于低数据质量。但这不应该是重点——把重点放在业务上。

# **2。定义你的框架**

下一步是定义你的框架。对你的业务至关重要的不同维度是什么?从商业角度来看这个问题。使用这些维度来报告您的改进计划的进展。把存在的问题拿出来分解。下面是一些要考虑的问题陈述及其相关维度。

> ***“我收到了错误的信息……”***

**准确性:**信息应该反映现实。如果你的库存显示还剩 10 件商品,实际上货架上应该有 10 件。

> ***“我在等待收到正确的信息……”***

**及时性:**数据应该在需要的时候可用。如果有人必须等待正确的信息出现,你就失去了效率。

> ***“我联系不上他们,因为我没有他们的电话号码”***

**完整性:**如果需要电子邮件地址和电话号码来联系业务关系,则在建立新关系时应始终填写这些信息。

> “B ***但是我的经理说定价不对…”***

一致性:一个字段应该包含它应该包含的内容。如果有人在寻找销售价格,他们应该找到有适当利润的销售价格。

> ***“我们的客户退订了我们的邮件列表,因为我们发送的太频繁了……”***

**唯一性:**信息应该存储一次。在多个地方维护相同的信息毫无意义,更不用说在同一个系统中了。一个地方,意味着更少的工作要维护。

> ***“实习生在最后一刻做了意想不到的变动……”***

正直:就像在新闻业一样,你应该能够信任你的信息来源。所以要确保只有授权的人才能编辑它。

# **3。有它支持你**

因此,您已经定义了对您的组织至关重要的挑战和相关维度。让 IT 支持您在 IT 应用程序中实施这些标准。下面强调了一些需要考虑的关键方面。

*   **输入控件:**如果您知道您希望在应用程序的特定字段中输入什么,请确保只能输入这些内容。像销售价格一样,应该是正确货币的数字。如果用户输入的内容与设定的标准不匹配,则无法保存。如果员工开始抱怨这些限制,倾听他们。这意味着他们有额外的需求:他们可能没有存储特定信息的地方。我经常遇到的一个例子是 CRM 系统中的名字。他们经常被有关他们状态的信息“污染”,比如“不活跃”或者“在名称字段中使用数字 10230 代替”。这将有助于存档或删除这些旧项目。
*   **参照表:**如果多人使用相同的信息,设置参照表支持他们。这些非常容易创建,可以为企业带来如此多的价值。它们可以像在浏览器中加入书签的 word 文档一样简单。考虑货币汇率、产品代码或国家代码的参考表。找东西,快速浏览到书签找到合适的信息。
*   数据存储上的数据剖析:数据剖析过程变得越来越标准化和可用。我们曾经使用自己的 SQL 脚本快速执行这些操作,但是现在 PowerBI 已经有了一个标准的数据分析特性。数据分析是识别数据外观的过程:例如哪些值是可用的,它们包含哪些字符,相同值出现的频率。例如,日期的格式是 2021 年 2 月 17 日还是 2021 年 2 月 17 日?

# **4。评估信息满足您业务需求的程度**

您从定义瓶颈开始。继续回到那些。这些瓶颈在多大程度上得到解决?问题还会出现吗?员工还在等信息吗?或者不得不打多个电话来确认信息?他们还在浪费时间寻找信息吗?如果是,请使用数据分析报告来确定差距所在。如果电子邮件地址和电话号码是必需的信息,请使用数据分析完整性检查来检查缺少了多少。将这种责任正式化:让某人定期做这件事。让它成为他们责任的一部分。指派问题负责人,并授权他们为这些问题制定解决方案。让某个人——在现场,实际上正在遭受这个问题的人——跟踪这个问题。如果您的组织已经指定了流程负责人,他们是一个很好的起点。

# **5。在源头清理数据**

当必须快速解决问题时,我们通常倾向于选择“快速解决”。在打了 5 个电话想弄清楚那个业务伙伴的电话号码后,下一个紧迫的任务来了,电话号码没有存储在 CRM 系统中。所以下一次,其他人可能会面临同样的问题。不要让这种事情发生。争取永久解决。不要让很多人经历同样的寻找正确信息的麻烦。一旦完成,确保它在源头得到纠正。

你的组织收集和存储的信息应该是准确的。它应该会增值。说点有意义的。在出现某种类型的数据分析或数据科学项目之前,数据质量通常不会成为一个问题,因为数据分析师或科学家开始将数据用于其最初预期之外的用途。如果那是事情变得明朗的时候,那就太晚了。企业很有可能在更早的时候就遇到这些问题,但是他们没有解决这些问题的方法。

我希望这篇博客能让你明白为什么数据质量是一个商业问题,以及你如何解决它。让我知道你的想法!

# 自然语言处理中的数据表示

> 原文:<https://towardsdatascience.com/data-representation-in-nlp-cc9460f855a7?source=collection_archive---------21----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/aef1de737181198d314923f26c3456a0.png)

来源:图片由作者拍摄

## 通过 *n-grams* 、 *tf-idf* 的理论途径,一键编码,单词嵌入。以及预先训练好的模特带来的惊喜。

## 介绍

> 自然语言处理寻求将语言映射到能够被机器学习方法处理的捕获形态、词汇、句法、语义或话语特征的表示。
> 
> Kamath,J. Liu 和 Whitake 2019

在进入算法方法论之前,有必要介绍一下理论的要素。许多当前的方法基于容易忘记的基本原理,因为它们的使用不是直接的。

本节将介绍经典的 NLP 方法,如 N-grams (Broder 等人,1997 年),tf-idf (Luhn 1957 年;Jones 1972)、一键编码(D. Harris 和 S. Harris 2012)和单词嵌入(Firth 1957 杰拉德·索尔顿 1962;g .索尔顿、黄和杨,1975 年;本吉奥等人,2003 年;Mikolov,Sutskever,Chen,G. Corrado 等,2013)。最后一个小节将处理预训练模型,特别是自变形金刚出现以来出现的模型(Vaswani 等人,2017 年)。

## N-grams

n 元语法指的是文本切割的粒度。当文本以记号的形式被切割时,它是由单个单词的集合的单个字母组成的。当文本被切割成几个词,两个,例如,这被称为二元等。

**举例**:

我是一名人工智能研究员,试图解释数据表示的 NLP 概念

*   **Unigram:** (I)、(am)、(an)、(AI)、(研究员)、(尝试)、(to)、(解释)、(NLP)、(概念)、(of)、(数据)、(表示)
*   **Bigram 或 2-grams: (** I,am),(am,an),(an,AI),(AI,research),(research,trying),(trying,to),(to,explain),(explain,NLP),(NLP,concepts),(concepts,of),(of,data),(data,representation)
*   **三元组或三字组:** (I,am,an),(am,an,AI),(an,AI,research),(AI,research,trying),(research,trying,to),(trying,to,explain),(to,explain,NLP),(explain,NLP,concepts),(NLP,concepts,of),(concepts,of,data),(of,data,representation)

这些 n 元语法中的每一个都被分配一个存在概率 **P(w|h)** 其中 ***w*** 是下一个单词,而 ***h*** 是历史(这是 ***w*** 在语料库中出现的次数)。

如果 **P(这|这水是如此透明以致于)**或者*是句子中的下一个词 ***这水是如此透明以致于*** 人们将不得不计算 ***w*** 跟随 ***h*** 的次数除以 ***h*** 。情商。1 显示了这个概率的计算。*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/03b2221ef70e0b5397a0a20fdf960256.png)*

*情商。1 下一个单词的概率*

*问题来自于统计每一次出现和每一种可能的变异所需的语料库的大小。历史 ***h*** 是一组可以注 ***w_1 的 ***N*** 字;w _ 2;w _ 3;…;w_N*** 。相关的概率因此被写成**P(w _ 1;w _ 2;w _ 3;…;w_N)** 。为了计算这个概率,我们必须使用*链概率定律*(等式。2:联合概率)。*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/041a7b66c5051a10cbe192a05c0377d5.png)*

*等式 2 联合概率*

*为了减少计算时间,需要将这个概率(近似值)减少到前面的几个字。*

*对于二元模型,概率减少到 **P(w|h) ~= P(w|w_1)** 其中 *w_1* 是前一个单词 *w* ,即:*

***P(这个|这个水是如此的透明以至于)~= P(这个|这个)***

*情商。3 给出了这种情况的概括。*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4a0acf6447d95fe10342a8ca445b4418.png)*

*等式 3*

*二元模型的概率基于前一个词的假设被称为**马尔可夫假设**或**马尔可夫过程**。马尔可夫模型是一类**概率模型**,它允许我们预测事件或词语,而不必依赖于大量历史。*

*二元模型将基于前一个单词,三元模型基于前两个单词,等等。对 N-gram 的概括给出了基于 **N-1** 先前单词的模型。*

*情商。4 代表这个概率:*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1e68311323cc366c70cd7c242d4f144d.png)*

*等式 4*

*等式 2 和等式 3 之间的差异由等式 2 示出。5*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/dfe9471957b009c2188d8836667e0b98.png)*

*等式 5*

*接近这一概率的方法是使用**最大似然估计** (MLE)方法(Stigler 2007)。原理是统计语料库中的出现次数,并在 0 和 1 之间归一化。*

*在二元模型的情况下,我们可以写出等式 6。*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/52842b6372fe9a6c88d013425ee380cb.png)*

*等式 6*

*这个等式的常见简化,但不是微不足道的简化,如(Daniel Jurafsky 和 J. H. Martin 2009Daniel Jurafsky 和 J. H. Martin 2020),就是**以单词 ***w_n-1*** 开头的二元组数之和可以用**单词*****w _ n-1***(Eq。7).***

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f06cecd434f6c3903eb3e5ecce29ff65.png)*

*等式 7*

*情商。7 可以用与二元模型相同的假设(MLE 方法)推广到 N 元模型。简化是用 N 元语法的出现次数代替出现次数的总和(等式)。8).*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b4f875adf5b5bcecd59ec4b5ce90532a.png)*

*等式 8*

*情商。8 通过语料库称为序列的**相对频率。***

*要记住的要点是,N-gram 序列越高,语料库的大小就必须越大。由于**链或加入概率**,该序列被**减少**。该计数由语料库中找到的 N 元文法的总和**来近似。***

## *TF-IDF*

*词频(TF)。在 NLP 中开始研究的一种方法是将文本、非结构化数据转换成单词(记号)的集合——一个“单词包”或“BoW”(z . s . Harris 1954)。因此,单词在这个集合(这个包)中是独立的,并且可以被计数以确定它们出现的频率(术语频率-TF ),称为权重。诸如冠词或连接词等频繁出现的词在文档中有很强的重现性,这使得 TF 更加完美。一个简单的方法是删除这些所谓的“无意义的”停用词。通常优选的是(等式 9)通过文档中单词的总和来归一化单词权重。*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a3c85fa9f920b10eaf7a4ed32fad28a8.png)*

*等式 9*

*其中 n_ij 表示要估计其 TF 的字,并且*

*![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1a2f5cba56162a92de46560de398b0bb.png)*

*文档 k 中单词的总和。*

***逆文档频率(IDF)** 。第二步是计算一个称为逆文档频率(IDF)的术语。情商。10 是用来计算的。它是文档数量 N 与存在术语***df _ I****的语料库中的文档数量之比的对数(以 10 为底)。换句话说,IDF 确定了语料库的所有文档中的稀有词的权重。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/69c02ab003c64c94ddf2ddee98343957.png)**

**等式 10**

**TF-IDF。情商的乘法。9 和情商。10 允许我们获得项-频率-逆-文档-频率(TF-IDF ),它在等式中示出。11.**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/650e59979688c5f6c37bcd03ecae7b0a.png)**

**等式 11**

**情商。11 可以重写,用等式的比值代替项 ***tf_i,j*** 。9.结果如公式 12 所示。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0e9f74b243f92485a089bad8abd328e9.png)**

**等式 12**

**IDF 部分非常重要,因为它允许纠正拼写错误。一般来说,如果一个单词拼写错误,如“example”而不是“example ”,其重要性与拼写正确的单词相同。TF-IDF 纠正了这些错误,因为拼写错误的单词的系数非常低。**

## **一键编码**

**另一种为机器表示文本的方式是创建一个名为“ **One-Hot encoding** ”的矩阵(D. Harris 和 S. Harris 2012Chollet 2017)。这个方法是每个单词的信息的二进制表示。有必要创建包含语料库的唯一单词的向量。然后,在文本的每个单词处,除了单词在单词向量中所处的位置之外,向量将被填充 0。因此,我们创建一个矩阵 ***n x m*** ,其中 ***n*** 是唯一单词的数量,而 ***m*** 是句子中单词的数量。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/aa7bfe792a0e1ad366354ff5ab742ad5.png)**

**图 1:从标记数据到独热编码表示的转换表示(Chollet 2017)**

**图 1 示出了标签编码矩阵和独热编码变换之间的变换。食物名称列中的数据被投影到特征(列)中,当索引对应于该特征时,其内容是包含 0 和 1 的向量。然而,这种方法有一些缺点:**

*   **大向量:向量的大小是语料库中唯一词的数量或语料库中最重要的词的数量(例如:最重要的 10,000 个词)。**
*   **向量中的信息很少:向量是仅包含 0 和 1 的向量,其中索引对应于所考虑的单词(稀疏向量)。**
*   **原始表示:向量不依赖于对数据执行的机器学习。**
*   **缺少上下文:每个向量仅包含所考虑的单词的信息,该单词是向量中包含的唯一信息,因此独立于上下文和单词在上下文中的含义。**
*   **内存大小:在随机存取存储器(RAM)中存储这样的矩阵可能变得无法容纳。**

## **词向量**

**最后一种表示叫做词向量或词嵌入。这种表述来自对语言结构的研究(Z. S. Harris 1954),并通过短语“*你应该知道它所保持的公司的一个单词*”(Firth 1957)而得到推广。从那时起,直觉导致了这样一种想法,即相似的单词应该在 n 维向量空间(其中 n 是任意数量的上下文单词)中投影出彼此非常接近的向量表示。**

**单词嵌入是单词在多维空间中作为实值(十进制)向量的表示或投影。这个多维空间包含计算相似度的特定单词(表 1)。单词嵌入的维数取决于多维空间的维数。维数通常设置为 300。与一位热编码的矩阵的维数相比,这个多维空间很小。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e5305cb7ceaae3972fff25cf476f0237.png)**

**表 1:单词嵌入表示。n 维空间的值为 300。**

**表 1 显示了词向量的结构。该索引包括将用来计算特征相似性值的单词(300)。例如,性别指数为男性给出的值为 1,为女性给出的值为-1,为国王给出的值为-0.95,为女王给出的值为 0.97,这三个值对于上下文中的性别来说是接近和相反的。单词 Apple 和 Orange 的值为 0,因为这些单词没有性别区分。**

**这样,每个特征将获得与所选索引的相似性度量,这将给出十进制值的向量或压缩信息的向量(与独热编码矩阵相比)。**

**这种小维度的容量允许在更受限制的上下文中估计值,以便不会对新单词组合产生零概率。对三元组也进行了类似的工作(Jelinek 和 Mercer 1980Katz 1987)来演示没有粒度的较小上下文的相关性。**

**特征向量或单词向量表示与向量空间相关联的单词的不同方面。概率函数被表示为基于前一个词的下一个词的条件概率的乘积。它们是通过神经网络算法最大化称为对数似然的成本函数而获得的(Vail、Valavanis 和 Conrad 1959Box 和 Jenkins 1976)。**

**因此,从给定语料库中的数据计算或“学习”单词向量(Bengio et al. 2003)。词嵌入是密集向量,不像一热编码(稀疏向量——多由 0 组成)(荣 2016;Chollet 2017)。**

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/749c2b270b47747a540d589e21721a8b.png)**

**图 2:独热编码矩阵表示和单词嵌入的比较(Chollet 2017)**

**图 2 显示了前面两种方法在表示上的差异。这种可视化允许理解单词嵌入的密集方面。**

**将单词表示为向量也允许应用数学运算符。例如,单词嵌入可以加减——Eq 给出了典型的英语示例。13(Turney 2006;Vylomova 等人,2016 年)。**

> **国王-男人+女人=王后(方程式 13)**

**这个操作是更一般的操作 A : B :: C:?(Turney 2006)表明,通过简单的数学运算,向量的上下文允许预测下一个单词。实际上,单词嵌入是为每个应用程序计算的,因为每个用例都不同。因此,有必要调整将计算密集向量的权重的神经网络层(该层被称为嵌入)。**

**然而,单词嵌入有很强的约束。这是偏见。Bolukbasi 等人 2016 年在他们的文章中证明了存在一种自然偏差。这种区分将存在于每个单词之间的相似度的计算中,并且可以根据趋势来偏置模型。这些偏差是模型预训练的文本(语料库)中存在的固有偏差(Garg 等人 2018;布鲁内特等人 2019;赵等 2019;库马尔等人 2020;Papakyriakopoulos 等人 2020)。**

## **预训练模型或语言模型**

****在注意力机制** (Graves、Wayne 和 Danihelka,2014 年)之前,开发预训练模型是为了克服低数据量(或泛化)的问题。当数据量很低或者非常低(几个文档到几十个文档)时,模型不能从数据中学习足够的信息来生成它自己的(准确的)单词嵌入。因此,可以使用预先训练的模型,这些模型的词向量是在大型语料库(几千兆甚至兆兆字节的数据)上计算的。这些大型语料库允许计算语言模型,即包含足够特征(参数)的通才预训练模型,以便能够推断单词的结构和代表性。**

**这些预先训练的模型通常使用共现方法(确定序列中单词关联的数量)来计算(Bengio 等人,2003)。研究和行业中使用的最著名的预训练模型有:**

*   ****Word2vec** (2013)(米科洛夫、陈等 2013;Mikolov,Sutskever,Chen,G. S. Corrado 等,2013;Mikolov、Yih 和 Zweig 2013),**
*   ****手套** (2014)(彭宁顿、索彻和 c .曼宁 2014),**
*   ****fastText** (2016) (Joulin,Grave,Bojanowski,Douze 等人 2016;茹林、格雷夫、博雅诺夫斯基、米科洛夫 2016;Bojanowski 等人,2017 年)**
*   ****埃尔莫** (2018)(乔希、彼得斯、霍普金斯 2018;彼得斯等人,2018 年)**

**性能与注意机制相当的不太知名的模型是 ULMFit (Howard 和 Ruder 2018 可以用不同语言的文档进行训练)和 MultiFit (Eisenschlos 等人 2020-ulm fit 的多语言版本)。这两个模型都有由被称为长短期记忆的记忆模型构成的结构(LSTM —霍克雷特和施密德胡伯 1997)。**

****后注意机制**。注意过程的起源来自 Graves,Wayne 和 Danihelka (2014)在《神经图灵机》一文中的观点。这些机制的目标是再现人类大脑在面对信息时的功能,无论是视觉、声音还是书面信息。大脑并不关注整个图像、声音或书面信息。它聚焦于某些区域,注意机制就是基于这个原理。**

**Bahdanau、Cho 和 Bengio (2016)实现了注意力机制,以补偿所谓的 ***seq2seq*** 模型(Sutskever、Vinyals 和 Q. V. 2014)的刚性,这些模型基于 ***编码器-解码器*** 架构(Rumelhart,G. E. Hinton 和 R. J. Williams 1986 乐存 1987;布尔拉德和坎普 1988 年;杰弗里·e·辛顿和泽梅尔 1993)。这些模型由两个组合的神经网络组成。第一个用于解构输入并将其主要信息存储在瓶颈层中,第二个用于重构信息以生成模拟输入。这些方法的问题来自于**瓶颈**层,它在架构中的大小是固定的,不允许长期存储信息和依赖关系(长句子)。**

**有三种类型的注意机制。第一个 ***自我注意*** 程、董、拉帕塔 2016(也叫 ***内注意*** )在每一步对句子的一部分进行聚焦,以获得同一个句子的整体表征。接下来是 ***软关注*** (Bahdanau,Cho,and Bengio 2016K. Xu 等人 2016),他们的目标是能够将整个句子或图像编码到位。优点是该模型简单且可微,但在计算方面非常昂贵。**

*****努力关注*** (Luong,Pham,and C. D. Manning 2015K. Xu et al. 2016)允许仅使用句子或图像的一部分,这被称为补丁。好处是只使用了**部分信息**,所以减少了推理时间。然而,由于这种局部性,模型必须使用更多的技术组合来训练,因为模型是不可区分的。**

**还有另外两种方法**全局和局部关注**。全局方法与软方法具有相同的行为,但局部方法使硬方法变得不同。**

**2017 年出现了**变形金刚** (Vaswani 等人 2017),这是软方法的改进,允许在没有 **RNN** 的情况下做 *seq2seq* 。这种结构被称为**自我关注**,在 RNN 中没有序列比对。在变形金刚的基础上,还出现了**多头注意力**机构。这种方法使得并行创建几个注意机制并线性连接所有输出成为可能,就像所谓的**集合**模型。目标是每个头部可以专注于注意力的子空间,以增加模型的准确性。**

**基于变形金刚的预训练模型的非详尽列表:**

*   ****伯特** (2018)(德夫林*等人* 2018)**
*   ****GPT-2** (2019)(拉德福德等人 2019)**
*   **多语种的伯特 ⁴ (2019 年)**
*   ****罗伯塔** (2019) (Y .刘*等* 2019)**
*   ****多语言的 XLM** (2019 年)(兰普尔和康诺 2019 年)**
*   **福楼拜(V1–2019)(h . Le 等人 2020)**
*   **卡门贝干酪 (2020 年)(马丁等人,2020 年)**
*   ****XLM-R** (2020 年)(康诺等人 2020 年)**
*   ****极限**2020(胡等 2020)**
*   **GPT 三号(2020 年)(布朗等人,2020 年)**
*   ****开关变压器** (2021) (Fedus、Zoph 和 Shazeer 2021)**

**型号的准确列表可以在[拥抱面](https://huggingface.co/)上找到。变形金刚的问题是学习过程和推理时间非常短。为了纠正这一点,2017 年以来发布了不同的架构:LongFormers (Beltagy,M. E. Peters 和 Cohan 2020),Fastformers (Kim 和 Awadalla 2020),Reformers (Kitaev,Kaiser 和 Levskaya 2020),Big Bird (Zaheer 等人 2021)。**

## **结论**

**通过这篇文章,我们回顾了 NLP 世界中不同的数据表示方法。我还介绍了预先训练的模型,当您拥有少量数据或要获得更精确的模型时,这些模型非常有用。NLP 环境的实际主导是注意机制方法,以变形金刚体系结构的形式出现。最广为人知和使用的预训练模型是 BERT,它除了用于谷歌搜索引擎之外,还用于日常生活。但是,许多辩论和建议,以及请愿书都是为了防止使用非常大的预训练语言模型,如 GPT-3 或现在的开关变压器(数万亿个参数)。人工智能世界中的一个重要浪潮是关于 Timnit Gebru 关于使用大型语言模型的危险的文章。**

## **参考**

**吴恩达在 Coursera 平台上的在线课程(MOOC) [单词表示的深度学习专业化](https://www.coursera.org/lecture/nlp-sequence-models/word-representation-6Oq70) —自然语言处理&单词嵌入部分期间展示的表格。
Lilian Weng 在博客上提供了一个极好的调查“ [Lil'Log](https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html) ”和[第二篇文章](https://lilianweng.github.io/lil-log/2020/04/07/the-transformer-family.html)
另一个资源是 Jay alam mar[*the illustrated transformer*](http://jalammar.github.io/illustrated-transformer/)
⁴[https://ai . Google blog . com/2020/08/language-agnostic-Bert-sentence . html](https://ai.googleblog.com/2020/08/language-agnostic-bert-sentence.html)
⁵[https://ai . Google blog . com/2008](https://ai.googleblog.com/2020/04/xtreme-massively-multilingual-multi.html)**

****文章****

*   **Bahdanau、Dzmitry、Kyunghyun Cho 和 Yoshua Bengio(2016 年)。*神经机器翻译通过共同学习对齐和翻译*。arXiv: [1409.0473](https://arxiv.org/abs/1409.0473)**
*   **Beltagy,Iz,Matthew E. Peters 和 Arman Cohan (2020)。 *Longformer:长文档转换器*。arXiv:2004.05150**
*   **Bengio,Yoshua 等人(2003 年 3 月)。*一个神经概率语言模型*。在:j .马赫。学习。第 3 号决议,第 1137-1155 页。刊号:1532–4435。**
*   **Bojanowski,Piotr 等人(2017 年)。*用子词信息丰富词向量*。《计算语言学协会汇刊》第 5 卷,第 135-146 页**
*   **博卢克巴斯、托尔加等人(2016 年)。男人对于电脑程序员就像女人对于家庭主妇一样?去除单词嵌入"。收录于:第 30 届国际神经信息处理系统会议录。乳头 16。西班牙巴塞罗那:柯伦联合公司,第 4356–4364 页。ISBN: 9781510838819。**
*   **h .和 y . Kamp(1988 年 9 月)。*多层感知器的自动关联和奇异值分解*。在:生物。cyber n . 59.4-5,第 291-294 页。刊号:0340–1200。**
*   **盒子,乔治。E.P .和 Gwilym M. Jenkins (1976 年)。时间序列分析:预测和控制。霍尔登日。**
*   **Broder,Andrei Z .等人(1997 年)。*网页的句法聚类*。计算机网络和 ISDN 系统 29.8。第六届国际万维网会议论文,第 1157-1166 页。刊号:0169–7552。**
*   **Brown,Tom B .等人(2020 年)。*语言模型是一次性学习者*。 [arXiv:2005.14165](https://arxiv.org/abs/2005.14165)**
*   **布鲁内特、马克-艾蒂安等人(2019 年 9 月)。*理解单词嵌入偏差的来源*。在:艾德。Kamalika Chaudhuri 和 Ruslan Salakhutdinov,第 97 卷。机器学习研究论文集。美国加州长滩:PMLR,第 803–811 页。**
*   **程、、、米雷拉·拉帕塔(2016)。*用于机器阅读的长短期记忆网络*。 [arXiv:1601.06733](https://arxiv.org/abs/1601.06733)**
*   **弗朗索瓦·乔莱(2017)。*用 Python 进行深度学习*。第一名。美国:曼宁出版公司 ISBN: 1617294438**
*   **Conneau,Alexis 等人(2020 年)。*大规模无监督跨语言表征学习*。 [arXiv:1911.02116](https://arxiv.org/abs/1911.02116)**
*   **Devlin,Jacob 等人(2019 年)。 *BERT:用于语言理解的深度双向转换器的预训练*。arXiv:1810.04805**
*   **艾森施洛斯、朱利安·马丁等人(2020 年)。 *MultiFiT:高效的多语言语言模型微调*。arXiv:1909 年。04761**
*   **Fedus,William,Barret Zoph 和 Noam Shazeer (2021 年)。*开关变压器:利用简单有效的稀疏性扩展到万亿参数模型*。arXiv:2101.03961 [cs。LG】。**
*   **弗斯博士(1957 年)。语言学理论概要,1930 年至 1955 年。网址:https://books.google.ca/books?id=T8LDtgAACAAJ。**
*   **加尔格、尼基尔等人(2018 年)。单词嵌入量化了 100 年来的性别和种族刻板印象。发表在:美国国家科学院院刊 115.16,e 3635–e 3644。刊号:0027–8424。DOI:10.1073/PNAS . 1720347115 . eprint:https://www .pnas。org/content/115/16/e 3635 . full . pdf . URL:https://www . PNAS . org/content/115/16/e 3635。**
*   **格雷夫斯、亚历克斯、格雷格·韦恩和伊沃·达尼埃尔卡(2014)。*神经图灵机*。arXiv:1410.5401 [cs。NE】。**
*   **哈里斯博士和哈里斯博士(2012 年)。*数字设计与计算机架构*。工程专业收藏。爱思唯尔科学。ISBN: 9780123944245。网址:https://books.google.ca/books?id=-DG18Nf7jLcC。**
*   **泽利格·哈里斯(1954)。*分布结构*。in:word 10.2–3,第 146–162 页。DOI:10.1080/00437956.1954。11659520.eprint:https : / / doi。org/10 . 1080/00437956 . 1954 . 11659520 . URL:https://doi . org/10.1080/00437956 . 1954 . 11659520。**
*   **辛顿,杰弗里 e 和理查德 s 泽梅尔(1993 年)。*自动编码器、最小描述长度和亥姆霍兹自由能*。第六届神经信息处理系统国际会议论文集。93 年的 NIPS。科罗拉多州丹佛市:摩根考夫曼出版公司,第 3-10 页。**
*   **Hochreiter、Sepp 和 Jürgen Schmidhuber (1997 年)。*长短期记忆*。摘自:神经计算 9.8,第 1735-1780 页。**
*   **霍华德、杰里米和塞巴斯蒂安·鲁德(2018)。用于文本分类的通用语言模型微调。arXiv:1801.06146 [cs。CL】。**
*   **胡,等(2020)。XTREME:一个评估跨语言通用化的大型多语言多任务基准。arXiv:2003.11080 [cs。CL】。**
*   **耶利内克,弗雷德和罗伯特 l .默瑟(1980)。*稀疏数据马尔可夫源参数的插值估计*。《模式识别实践研讨会论文集》。由…编辑作者:埃德扎德·s·盖尔塞马和拉维恩·卡纳尔。阿姆斯特丹:北荷兰,第 381–397 页。**
*   **卡伦·斯派尔克·琼斯(1972)。*术语特异性的统计解释及其在检索中的应用*。载于:文献杂志 28,第 11-21 页。**
*   **乔希、维杜尔、马修·彼得斯和马克·霍普金斯(2018)。*使用几十个部分注释的例子将解析器扩展到远处的领域*。arXiv:1805 .06556CL】。**
*   **Joulin、Armand、Edouard Grave、Piotr Bojanowski、Matthijs Douze 等人(2016 年 12 月)。 *FastText.zip: Com-pressing 文本分类模型*。**
*   **Joulin、Armand、Edouard Grave、Piotr Bojanowski 和 Tomas Mikolov (2016)。*高效文本分类的锦囊妙计*。arXiv:1607.01759 [cs。CL】。**
*   **朱拉夫斯基,丹和詹姆斯马丁(2020)。*言语和语言处理*(第三版。草稿)。英语(美国)。斯坦福大学网站。网址:https : / / web。斯坦福。edu/~茹拉夫斯基/SLP 3/(2020 年 3 月 11 日访问)。**
*   **朱拉夫斯基、丹尼尔和詹姆斯·马丁(2009 年)。*语音和语言处理*(第二版)。美国:普伦蒂斯霍尔有限公司国际标准书号:0131873210。**
*   **Kamath,u .,J. Liu 和 J. Whitaker (2019 年)。*NLP 和语音识别的深度学习*。斯普林格国际出版公司。ISBN: 9783030145965。网址:https://books.google.ca/books?id=8cmcDwAAQBAJ。**
*   **Kanis,Jakub 和 Lucie skorkovska(2010)。*通过信息检索性能的手段比较不同的词条化方法*。收录于:第 13 届国际文本、演讲和对话会议录。TSD 10 年。捷克共和国布尔诺:施普林格出版社,第 93-100 页。ISBN: 3642157599。**
*   **Katz,S. (1987 年)。*从语音识别器的语言模型组件的稀疏数据中估计概率*。摘自:IEEE 声学、语音和信号处理汇刊 35.3,第 400-401 页。DOI:10 .1109/TASSP.1987.1165125。**
*   **金英镇和哈尼哈桑阿瓦达拉(2020)。*快速成型器:高效的自然语言理解转换模型*。arXiv:2010.13382[cs。CL】。**
*   **基塔耶夫、尼基塔、祖卡斯·凯泽和安塞姆·列夫斯卡娅(2020)。*重整器:高效变压器*。arXiv:2001.04451 [cs。LG】。**
*   **Kumar,Vaibhav 等人(2020 年)。护士比外科医生更接近女性?减轻单词嵌入中性别偏见的近似性。arXiv:2006.01938 [cs。CL】。**
*   **Lample,Guillaume,Miguel Ballesteros 等人(2016 年)。*命名实体识别的神经架构*。In:CoRRabs/1603.01360。arXiv:1603.01360。**
*   **兰普尔、纪尧姆和亚历克西斯·康诺(2019)。*跨语言语言模型预训练*。arXiv:1901 .07291CL】。**
*   **乐,杭等(2020)。*福楼拜:法语无监督语言模型预训练*。arXiv:1912 .05372CL】。**
*   **Yann le Cun(1987 年 6 月)。*博士论文:Modeles connexionnistes de l ' apprentissage(联结主义学习模型)*。英语(美国)。居里大学(巴黎第六大学)。**
*   **刘,等(2019)。RoBERTa:稳健优化的 BERT 预训练方法。arXiv:1907.11692[cs。CL】。**
*   **卢恩,惠普(1957)。“文学信息机械化编码和搜索的统计方法”。摘自:IBM 研究与开发杂志 1.4,第 309–317 页。DOI:10.1147/rd.14.0309**
*   **Luong、Minh-Thang、Hieu Pham 和 Christopher D.Manning (2015 年)。基于注意力的神经机器翻译的有效方法。arXiv:1508.04025[cs。CL】。**
*   **马丁、路易斯等人(2020)。“卡门贝干酪:美味的法语模型”。《计算语言学协会第 58 届年会论文集》。DOI:10.18653/v1/2020 . ACL-main . 645 . URL:http://dx . DOI . org/10.18653/v1/2020 . ACL-main . 645**
*   **米科洛夫、托马斯、程凯等人(2013 年)。向量空间中单词表示的有效估计。arXiv:1301.3781 [cs。CL】。**
*   **米科洛夫、托马斯、伊利亚·苏茨基弗、程凯、格雷格·斯科拉多等人(2013 年)。“单词和短语的分布式表示及其组合性”。神经信息处理系统进展。由…编辑由 C. J. C. Burges 等人撰写,第 26 卷。CurranAssociates 公司,第 3111-3119 页。网址:https://proceedings . neur IPS . cc/Paper/2013/file/9aa 42 b 31882 EC 039965 f 3c 4923 ce 901 b—Paper . pdf**
*   **米科洛夫、托马斯、伊利亚·苏茨基弗、程凯、格雷格·科拉多等人(2013 年)。词和短语的分布式表示及其组合性。arXiv:1310.4546[cs。CL】。**
*   **Mikolov、Tomas、Wen-tau Yih 和 Geoffrey Zweig(2013 年 6 月)。“连续空格词表示法中的语言规则”。《计算语言学协会北美分会 2013 年会议记录:人类语言技术》。佐治亚州亚特兰大:计算语言学协会,第 746–751 页。网址:https://www . ACL web . org/prophet/N13–1090。**
*   **Papakyriakopoulos,Orestis 等人(2020 年)。“单词嵌入中的偏差”。摘自:2020 年公平、问责和透明会议论文集。胖*'20。西班牙巴塞罗那:计算机械协会,第 446–457 页。ISBN: 9781450369367。DOI:10.1145/3351095.3372843 . URL:https://DOI . org/10.1145/3351095.3372843。**
*   **彭宁顿、杰弗里、理查德·索彻和克里斯托弗·曼宁(2014 年 10 月)。“手套:单词表示的全局向量”。载于:2014 年自然语言处理经验方法会议录(EMNLP)。卡塔尔多哈:计算语言学协会,第 1532–1543 页。DOI:10.3115/v1/D14–1162。网址:https://www . ACL web . org/选集/D14-1162。**
*   **彼得斯,马修等人(2018 年 6 月)。“深层语境化的词语表达”。载于:计算语言学协会北美分会 2018 年会议录:人类语言技术,第 1 卷(长论文)。路易斯安那州新奥尔良:计算语言学协会,第 2227-2237 页。DOI:10.18653/v1/N18–1202。网址:https://www . ACL web . org/选集/N18-1202。皮雷、特尔莫、伊娃·施林格和丹·加雷特(2019)。多语伯特的多语水平如何?arXiv:1906.01502[cs。CL】。**
*   **拉德福德、亚历克等人(2019 年)。语言模型是无人监督的多任务学习者。**
*   **荣,辛(2016)。 *word2vec 参数学习讲解*。arXiv:1411.2738 [cs。CL】。**
*   **鲁梅尔哈特,丁顿和威廉姆斯(1986)。*通过错误传播学习内部表征*。并行分布式处理:认知微观结构的探索,第 1 卷:基础。美国麻省剑桥:麻省理工学院出版社,第 318–362 页。ISBN:026268053X。**
*   **Salton,g . a . Wong 和 c . s . Yang(1975 年 11 月)。“用于自动索引的向量空间模型”。在:Commun。ACM18.11,第 613-620 页。刊号:0001–0782。DOI:10.1145/361219.361220 . URL:https://DOI . org/10.1145/361219.361220。**
*   **杰拉德·索尔顿(1962)。*生成单词和文档关联的一些实验*。在:1962 年 12 月 4 日至 6 日,秋季联合计算机会议记录。AFIPS '62(秋季)。宾夕法尼亚州费城:计算机械协会,第 234-250 页。ISBN: 9781450378796。DOI:10.1145/1461518.1461544 . URL:https://DOI。org / 10。1145 /1461518.1461544.**
*   **斯蒂芬·斯蒂格勒(2007 年 11 月)。最大可能性的史诗故事。摘自:统计科学 22.4,第 598-620 页。刊号:0883–4237。DOI:10.1214/07- sts249。网址:http://dx . doi . org/10.1214/07-STS 249。**
*   **Sutskever、Ilya、Oriol Vinyals 和 Quoc V. Le (2014 年)。*用神经网络进行序列对序列学习*。arXiv:1409.3215 [cs。CL】。**
*   **彼得·特尼(2006 年 9 月)。*语义关系的相似性*。摘自:计算语言学 32.3,第 379-416 页。刊号:1530–9312。DOI:10.1162/coli . 2006 . 32 . 3 . 379 . URL:http://dx . DOI . org/10.1162/coli . 2006 . 32 . 3 . 379**
*   **Vail,S.V .,S. Valavanis 和 A.H. Conrad (1959)。*计量经济学:最大似然法简介*。经济学手册系列。麦格劳-希尔。网址:https://books.google.ca/books?id =ZRcYAAAAIAAJ。**
*   **Vaswani,Ashish 等人(2017 年)。你所需要的只是注意力。arXiv:1706.03762 [cs。CL】。**
*   **Vylomova,Ekaterina 等人(2016 年)。*Take and Take,Gaggleand Goose,Book and Read:评估向量差异对词汇关系学习的效用*。arXiv:1509.01692 [cs。CL】。**
*   **徐,开尔文等人(2016)。*展示、参与和讲述:视觉注意的神经图像字幕生成*。arXiv:1502.03044 [cs。LG】。**
*   **Zaheer,Manzil 等人(2021 年)。*大鸟:更长序列的变形金刚*。arXiv:2007.14062 [cs。LG】。**
*   **赵、解宇等(2019 年 6 月)。*语境化词语嵌入中的性别偏见*。载于:计算语言学协会北美分会 2019 年会议录:人类语言技术,第 1 卷(长短论文)。明尼苏达州明尼阿波利斯:计算语言学协会,第 629-634 页。DOI:10.18653/v1/N19–1064。网址:https://www . ACL web . org/选集/N19-1064。**

# 数据科学基础课程

> 原文:<https://towardsdatascience.com/data-science-101-91b9f852a01c?source=collection_archive---------24----------------------->

## 意见

## 每个用例的一步一步的过程

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e68dd8500d76d11220d9d722173bf764.png)

[绿色变色龙](https://unsplash.com/@craftedbygc?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/learning?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【1】上的照片。

# 目录

1.  介绍
2.  问题陈述
3.  数据收集
4.  探索性数据分析
5.  特征工程
6.  模型比较
7.  结果讨论
8.  摘要
9.  参考

# 介绍

所有的技术流程都有一定的趋势,数据科学也不例外。随着你在任何工作中获得越来越多的经验,你开始注意到一种趋势,这种趋势会使工作变得容易一些。本文的目标是使您的数据科学工作更加简化,因为我将在下面概述的过程适用于每一个数据科学用例(*或至少大多数*),对于那些不是 100%适用的用例,它仍然有希望对您有用。正如您将看到的,这个过程有六个主要步骤——主要针对模型的开发部分。它不一定用于将模型部署到生产环境中。这个过程强调了从您试图解决的问题到使用数据科学技术解决该问题的步骤。如果您想了解更多关于数据科学过程的六个步骤,请继续阅读下面的内容。

# 问题陈述

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ae5e9d94cffdf159967b7a8f1545f6f2.png)

照片由[艾米丽·莫特](https://unsplash.com/@emilymorter?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/question?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【2】上拍摄。

要构建数据科学模型或利用机器学习算法,您需要了解问题是什么。这一步也可以称为更符合“*业务用例*”的东西。在这一步,你最有可能体验到与利益相关者一起工作,从数据分析师、业务分析师、产品经理到公司的高级管理人员。

> 下面是一个糟糕的问题陈述的例子:

*   *“我们想预测 2022 年有多少人会购买我们的产品”*

> 下面是一个很好的问题陈述示例:

*   *“目前预测销量的方式不准确”*

虽然第一个例子有道理,但它没有突出问题,而是突出了一个可能的解决方案。重点首先应该是以最简单的形式理解问题。在此基础上,我们可以使用数据科学技术和模型提出可能的解决方案。

问题陈述的另一部分可以是定义目标的过程。例如,询问当前的销售预测准确度是多少,目标准确度是多少,以及模型是否能够达到目标准确度,以及不能完全达到目标准确度意味着什么,这将非常有用。

# 数据收集

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9ee10d34aec537faf5a52cc8a4455ca5.png)

托拜厄斯·菲舍尔在[Unsplash](https://unsplash.com/s/photos/data?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【3】上拍摄的照片。

关于本文中描述的整体数据科学过程,数据收集过程可能是从学术界到专业环境最远的一步。举个例子,在教育课程中,你可能马上得到一个已经被处理和研究过的数据集。对于工作环境或专业设置,您必须学习如何从外部来源或数据表中的内部来源获取数据。这一步可能需要相当长的时间,因为您需要浏览数据库中或跨数据库的几乎所有数据表。您最终获得的数据可能会使用不同来源的不同数据。最终数据最终将被读入数据帧,以便对其进行分析、训练和预测。

> 以下是一些获取数据的可能方法:

*   来自 Google Sheets
*   从 CSV 文件
*   来自 Salesforce
*   JSON 文件
*   数据库表
*   从其他网站
*   还有更多

# 探索性数据分析

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b97161918c08146ae8efb7797c633854.png)

照片由[Firmbee.com](https://unsplash.com/@firmbee?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/data?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【4】上拍摄。

数据科学过程中的这一步通常可以遵循相同的格式。此时,您将拥有主要的单一数据框架。出于数据科学问题的考虑,你需要将你的`X`特征与你的`y`目标变量——你试图预测的东西——分开。这些要素可以从一个到数百个,甚至更多,但最好从简单开始,首先分析数据集的主要要素(*您直觉上认为对模型预测有重要意义的要素*),然后大致了解所有要素。

您可以查看各种有助于定义您的数据的描述性统计数据,以下是一些描述您的数据的更简单、更常用的方法——通常使用`pandas`库:

*   `df[[‘feature_1’, ‘feature_n’]].head()` —数据的前 5 行
*   `df[[‘feature_1’, ‘feature_n’]].tail()` —数据的最后 5 行
*   `df[[‘feature_1’, ‘feature_n’]].describe()`-计数、平均值、标准差、最小值、25%、50%、75%、最大值-让您对数据和特定特征的分布有一个很好的了解
*   分析缺失的数据—有时这是意料之中的
*   数据异常
*   错误数据—不应为负值的负值,等等。

如果您想要一个大的快捷方式,您可以使用`pandas profiling`,它显示了关于您的数据框架的所有这些描述性统计数据,并且在短短几行代码中显示了更多内容[5]:

<https://pandas-profiling.github.io/pandas-profiling/docs/master/rtd/>  

# 特征工程

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f6c3205eeb0c3222da0a6c00e2347030.png)

由[杰斯温·托马斯](https://unsplash.com/@jeswinthomas?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/math?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【6】上拍摄的照片。

既然您已经浏览了数据,您可能想要设计您的要素。对我来说,该过程的这一步应该被称为“模型特征工程之前的*”——因为你不用模型来编辑你的特征。也就是说,您可以通过多种方式来使用您的功能。其中一些方法包括通过简单地将两个要素分割在一起来创建新要素,以及将要素组合在一起以创建聚合要素。*

> 以下是特征工程的一些例子:

*   加法/减法/除法等。创建新的功能
*   对要素进行分组以创建聚合要素
*   一个热编码
*   分类变量的目标编码,以减少数据框架的维数

# 模型比较

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/953ab85813c6f69300be9bfa9884d8eb.png)

罗伯特·阿纳施在[Unsplash](https://unsplash.com/s/photos/compare?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【7】上拍摄的照片。

如您所见,在开始讨论主要的'*数据科学*'部分之前,我们已经执行了几个步骤。在这一部分中,无论您是执行回归还是分类,在选择一个模型作为您的最终模型进行更新和增强之前,最好对几个模型进行比较。

例如,尽管为您的用例选择特定的机器学习算法似乎是显而易见的,但最好消除您的偏见,并获得一个基线,比如说 5 到 10 个常用算法。从那里,你可以比较每一个的好处,而不仅仅是准确性。例如,您可能希望将训练模型所需的`time`或它可能达到的`expensive`与数据的`transforming`要求进行比较。

> 以下是一些常见的数据科学模型比较方法:

*   手工编写几个算法,并创建一个表格或数据框架,并排显示彼此的优缺点
*   PyCaret
*   我倾向于用最基本的方法来比较模型,这样我就不会过多地使用某个特定的算法,以防我最终不使用它

# 结果讨论

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/46e02fa1faec94121192d9f60464d843.png)

照片由[阿里·萨阿达特](https://unsplash.com/@camsaadat?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/error?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【9】上拍摄。

在将您的模型实现到产品中之前,您需要与您的利益相关者讨论结果。你会看到你的精度意味着什么,或者你的损失度量,比如 RMSE——均方根误差。这些结果经常让不学习或不使用数据科学的人感到困惑,所以你的工作是使它们尽可能简单,以便利益相关者可以从你的结果中做出决定-例如,继续或不继续(*有时复杂的机器学习算法不是问题的答案*)。

> 在讨论结果时,请记住以下几点:

*   除了原始结果之外,使用可视化工具显示结果——使用 Tableau、Google Data Studio 等工具,或者在 Python 中创建自己的结果
*   按某些要素进行聚合,以突出显示误差较高或较低的地方,或者精度较高或较低的地方
*   解释如果有更多的数据、更多的时间或不同的算法,你会怎么做
*   解释这些结果对公司的业务和财务方面意味着什么——这种模式是省钱了,还是只是创建和运行需要钱?
*   你的模型使过程更快,更好吗?
*   它仅仅帮助内部用户还是帮助你公司产品的客户?

将数据科学模型纳入公司的生态系统时,有很多问题需要讨论。也就是说,最后一步是通过将模型投入生产来实现自动化。

# 摘要

这些主要步骤对大多数数据科学项目都很重要。之后发生的步骤通常涉及更多的机器学习操作——这意味着,现在你的模型被批准了,你可以通过让软件工程师、UX/UI 研究人员、更多的产品经理和统计学家参与 A/B 测试来将其实现到产品中。既然模型使用起来很有意义,那么你应该问的一个重要问题是,你将如何使用它?

*   *例如,你的模式是否会引起客户的负面或正面反应?*

正如您所看到的,在公司整合数据科学时,有许多事情需要考虑,但遵循这六个主要步骤可以为使用数据科学有效解决问题设定一个简单的大纲和攻击计划。

*总结一下,以下是你可以应用于每个数据科学用例的六个步骤:*

```
* Problem Statement* Data Collection* Exploratory Data Analysis* Feature Engineering* Model Comparison* Results Discussion
```

我希望你觉得我的文章既有趣又有用。如果您遵循数据科学实施的主要流程,请随时在下面发表评论,您同意还是不同意,您将删除或添加哪些步骤?你认为如果你在将来实施这个过程会有好处吗?

*请随时查看我的个人资料和其他文章,也可以通过 LinkedIn 联系我。我不隶属于上述任何公司。*

# 参考

[1]照片由[绿色变色龙](https://unsplash.com/@craftedbygc?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/learning?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)(2015)上拍摄

[2]照片由 [Emily Morter](https://unsplash.com/@emilymorter?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 在 [Unsplash](https://unsplash.com/s/photos/question?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄,(2017)

[3]Tobias Fischer 在 [Unsplash](https://unsplash.com/s/photos/data?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄的照片,(2017)

[4]照片由[Firmbee.com](https://unsplash.com/@firmbee?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/data?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)(2015)上拍摄

[5]熊猫简介—西蒙·布里格曼,[熊猫简介主页](https://pandas-profiling.github.io/pandas-profiling/docs/master/rtd/),(2021)

[6]照片由[杰斯温·托马斯](https://unsplash.com/@jeswinthomas?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/math?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)(2020)上拍摄

[7]罗伯特·阿纳施在 [Unsplash](https://unsplash.com/s/photos/compare?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄的照片,(2018)

[8] [Moez Ali](https://medium.com/u/fba05660b60f?source=post_page-----91b9f852a01c--------------------------------) , [PyCaret 主页](https://pycaret.org/),(2021)

[9]照片由[阿里·萨阿达特](https://unsplash.com/@camsaadat?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/error?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)(2020)拍摄

# 数据科学 101:数据科学项目的生命周期

> 原文:<https://towardsdatascience.com/data-science-101-life-cycle-of-a-data-science-project-86cbc4a2f7f0?source=collection_archive---------4----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2c0b24aff78d63891aa5eac833741515.png)

我第一次听到数据科学这个词是在大学里,当时我的导师 Francisca Oladipo 教授和 Dayo Akinbami 选修了一门名为**“数据科学导论”的课程。**

在进入大学之前,我不知道在计算机科学领域选择什么职业道路(**因为我心里有几个选择**)。但是,我很高兴我参加了数据科学入门课程。我至少可以说,它激励我找到了一条更好的道路,并开始了数据科学生涯,我感谢我已经走了这么远。

虽然我不是这篇文章的主题,但我认为您了解我是如何进入数据科学领域的很好。我也希望用我的故事来激励你,如果我能走到这一步,你可以做得更多。请注意,我才刚刚开始,我的愿景是在未来几年内成为世界级的数据专家(以所有标准衡量)。

> 我写这篇文章的主要目的是揭开“**数据科学**这个词的神秘面纱,帮助个人和企业理解它的含义以及构建数据科学模型所涉及的不同阶段。在后续文章中,我将讨论基于数据科学的角色以及成为顶尖数据科学家所需的技能。

我知道[我们不能都成为数据科学家](/have-all-scientists-become-data-scientists-b6536d38ced1)。然而,如果这篇文章至少能帮助一个人找到进入数据科学的正确途径,就像数据科学课程激励我开始学习一样,那我的快乐就完整了。

让我们一起来解决这个问题。

# 什么是数据科学?

术语“数据科学”是当今互联网上最常见的流行语之一,但它往往是一个难以理解的概念。如果你请三位专家解释数据科学的含义,你很可能会得到四种不同的定义。

出于本文的目的,我更愿意坚持这个定义:

“数据科学是一个多学科的研究领域,它结合了编程技能、领域专长以及统计和数学知识,以从数据中提取有用的见解和知识”。从事数据科学的人被称为“**数据科学家**”。他们结合了广泛的技能和现代技术来分析从传感器、客户、智能手机、网络和其他来源收集的数据。

让我们稍微分解一下。你还记得当你在电子商务平台上浏览一个产品时,你最终会看到一条相关产品放在产品详情的下面,标题是***购买该商品的客户还购买了……***或***经常一起购买***?这是亚马逊等大型零售商使用的一项伟大的数据科学技术,用于发现商品之间的关联,并向新老客户交叉销售。

我认为数据科学是当今最令人兴奋的领域之一,有太多的原因让它成为几乎每个行业或领域的流行语。**其中一个主要原因是,每个组织都有一个数据宝库,可以提供巨大的好处**。第二个原因是数据科学是推动数字经济的变革性和无价的技术,就像石油推动工业经济一样。

如果操作正确,数据科学会产生有价值的见解并揭示趋势,企业可以利用这些见解和趋势进行战略规划、优化业务流程、做出更明智的决策、创造更多创新服务和产品等等。典型的数据科学生命周期包括几个阶段。在下一节中,我将向您展示不同的阶段以及每个阶段涉及的内容。

# 数据科学项目生命周期

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c0698f386a2ad0cf993d91ace96048b7.png)

许多组织和个人都在谈论数据科学项目和产品,但只有少数人了解构建数据科学产品或模型的步骤。到目前为止,我发现只有少数组织拥有适合数据科学的基础设施。大多数现代企业需要经历重大转型才能从数据科学中受益。

在本文的剩余部分,我将讨论构建数据科学模型或产品所需的不同步骤。每个组织都可以采用这种方法,不管他们所处的位置或规模如何。

# 业务问题理解

在开始收集数据和建立机器学习模型之前,你要做的第一件事是**定义和理解你试图解决的问题**。您需要能够将业务需求转化为数据科学问题和可行的步骤。实现这一点的一个好方法是,与您希望改善或优化其业务或流程的合适人员接触,并提出适当的问题。

我认为数据科学产品或模型不应该孤立存在。相反,他们应该帮助企业转变现有的业务运营,改善业务流程,或者确定客户评价差和销售差的原因和可能的解决方案,等等。因此,真正了解业务问题并评估您是否可以使用数据科学解决它是有帮助的。这是因为并不是所有的商业问题都可以用数据科学来解决。对业务问题的更好理解增加了您构建伟大的数据驱动产品的机会,这些产品可以对组织产生积极的影响。

# 数据收集

理解问题后的下一步是**收集正确的数据集**。数据收集是必不可少的,如果没有高质量的数据或收集数据的机制,构建一个好的模型几乎是不可能的。

根据我的研究和与几位数据科学专业人士的互动,我可以明确地说,许多组织收集不可靠、不完整的数据,他们事后做的一切都是一团糟。一些组织甚至不知道要收集哪种数据,也不知道数据存放在哪里。

我相信要收集的数据取决于您试图解决的业务问题。例如,用于客户信用风险分析的完美数据通常应该包括人口统计数据、贷款信息、还款数据、交易报表或电信数据。对于同样的问题,收集顾客身高、鞋码或裤长的数据是相当不合适的。

随着 web 抓取、云数据收集工具和 web APIs 等现代技术的出现;像 MongoDB、PostgreSQL 和 MySQL 这样的数据库系统;而像 SQL、Python、R、美汤、Scrapy、Spark、Apache、e.t.c 这样的工具,可以随时随地提取有价值的数据。

# 数据清理和处理

仅仅收集原始数据而不进行处理是不够的。就像纯金一样,纯原始数据几乎没有用处。在收集了适当的数据集之后,**您需要在继续下一步之前充分清理和处理数据**。

在一个理想的世界里,你更有可能收集非结构化的、不相关的和未经过滤的数据。如果你在没有数据处理和清理的情况下继续构建 ML 模型,你的分析结果肯定没有任何意义。就这么简单:**坏数据产生糟糕的模型**,不管你如何调整参数或者优化你的模型的超参数。在很大程度上,分析的准确性和有效性高度依赖于数据的质量。

作为一名数据科学家,我遇到过几种形式的数据问题,包括重复值和空值、不一致的数据类型、缺失数据、无效条目、不正确的格式等等,我必须在继续之前解决这些问题。

值得注意的是,大多数数据科学家的时间都花在了数据收集、清理和处理上。一些数据专业人士甚至认为,数据项目花费了 80%的时间。如果您想要构建出色的数据科学模型,您需要找到并解决数据集中的缺陷和不一致。尽管数据清理是痛苦而繁琐的,但只要你专注于最终目标,你就会从中受益。

# 探索性数据分析

此时,您已经有了丰富的数据。您已经能够清理和处理尽可能有组织的数据。是时候**深入检查所有的数据特征、数据属性,建立对数据的信心,获得对数据的直觉,进行健全性检查,找出如何处理每个特征。e.t.c** 这整个过程被称为探索性数据分析(EDA)——*数据科学中的常用词之一。*

EDA 涉及多种形式的分析,包括单变量分析、双变量分析、缺失值处理、异常值处理、变量转换、特征工程和相关性分析。一个有效的 EDA 策略提供了一个合适的基础,您需要从您的原始特性集创建更好的、高度可预测的和稳定的预测器。

我喜欢 EDA 的原因之一是,它帮助我向数据提出几个问题,更好地探索和可视化不同的数据集以识别模式,并揭示在 ML 生命周期的后续步骤中有用的有价值的见解。这也让我有了创新和分析的思维。

# 模型建立和评估

模型构建和评估阶段是您对数据进行实际建模的阶段。事实上,许多数据科学家认为在这个阶段“真正的奇迹发生了”。在这一阶段,你要做的第一件事就是把上一步清理过的数据集分成训练集和测试集。

您应该使用训练集来构建预测模型,并评估模型在看不见的数据点(测试集)上的性能。最大似然问题通常分为有监督的和无监督的。监督学习包括建立一个模型,该模型可以使用一组称为预测器的特征来准确预测目标变量。而无监督学习是一种自学习方法,其中模型必须找到所有类型的未知模式和所有预测器之间的关系。

您可以使用几个评估指标来检查您的模型工作得有多好,并且要使用的指标的选择取决于您试图解决的问题的类型。我不会用那些机器学习术语来烦你。也许,我很快会写一篇关于监督和非监督问题的一些常见评价指标的文章。

根据评估结果,您可能需要调整模型的参数,以确保它能够很好地概括,并且在暴露于以前看不到的数据时能够很好地工作。这个过程被称为超参数调优,我相信随着您构建更多的模型并使用多个参数值进行练习,您会越来越擅长这个过程。

# 传达模型结果

在构建和评估模型之后,您需要交流模型结果并向风险承担者展示您的发现。

> 根据我的经验,我发现高层管理人员对你用来建立模型的花哨算法或使用的超参数数量不感兴趣。他们主要感兴趣的是了解他们可以用你的模式做什么,以及它将如何推动他们的业务向前发展。

因此,每个数据科学家都需要有良好的演示和数据讲述技能,以展示模型如何帮助解决生命周期第一阶段中确定的业务问题。在你的演示幻灯片上使用复杂的措辞和公式不会让你走得太远。但是通过以精确和简洁的方式展示你的模型的真正价值,高管们会更容易采用这个模型。

# 模型部署和维护

沟通通常不是数据科学项目生命周期的最后一个阶段。一旦涉众对您的模型结果感到满意,下一步就是部署模型。**机器学习模型不会永远驻留在本地机器上**。它需要为组织创造价值,而使用该模型做出实际的、数据驱动的决策的唯一方法是将其交付给最终用户。我喜欢 Luigi Patruno 在这篇[文章](https://mlinproduction.com/deploying-machine-learning-models/)-“**没有机器学习模型是有用的,除非它被部署到生产中**。

我真的不喜欢模型部署过程,因为它有时会变得非常繁琐。此外,它涉及到数据科学家、商业专家、软件工程师和 it 团队之间的许多来回。在这一节中,我要提到的最后一件事是模型维护。当我第一次涉足数据科学时,我一直认为数据科学家可以构建一个模型,部署它,然后在模型永远工作的同时放松下来。**但是,没过多久我就发现,就像机器需要维护一样,机器学习模型也需要维护**。

“**部署一次,永远运行**”的实践是不好的,因为几个因素可能会随着时间的推移影响 ML 模型的预测能力。**新冠肺炎疫情是不可预测事件**的一个很好的例子。我期望所有的组织已经更新或者已经计划更新他们在疫情之前建立的所有 ML 模型,以捕捉在疫情期间暴露的新的客户模式和行为。一般来说,每个组织都应该有一个模型升级策略,用于不断更新他们的数据和重新训练他们的 ML 模型— **可能是 3、6 或 9 个月的间隔**。

# 摘要

在这篇文章中,我解释了数据科学的含义。之后,我描述了数据科学项目生命周期的不同阶段,包括业务问题理解、数据收集、数据清理和处理、探索性数据分析、模型构建和评估、模型交流、模型部署和评估。

我假设您现在已经了解了数据科学的工作原理以及构建数据科学模型所需的步骤。如果您有进一步的问题或需要更多的澄清,请不要犹豫,在下面留下您的评论。在我的后续文章中,我将讨论行业中不同的数据科学角色,以及成为顶尖数据科学家所需的技能。

***感谢阅读。你可以与你的朋友和网络分享这篇文章。***

# 数据科学——对 Kaggle“谷歌 Play 商店应用”数据集的综合分析

> 原文:<https://towardsdatascience.com/data-science-a-deep-analysis-on-google-play-store-apps-from-kaggle-8283bbc508b0?source=collection_archive---------15----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/78c83307594cb471f0f4397e64ddfad9.png)

照片由[莫希·赛义德](https://www.pexels.com/@luckysam?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)从[派克斯](https://www.pexels.com/photo/mobile-phone-samsung-edge-samsung-galaxy-s6-edge-plus-50614/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)拍摄

数据科学可以概括为五个步骤:捕获、维护、处理、分析和交流。首先,我们收集具有有意义的变量的数据,这些变量导致适当的类。然后清理数据,以便于计算机读取和处理建模。接下来,我们应用算法来训练模型,并使用从 Kaggle 数据集获取的数据来测试它,并分析模型的性能。然后,我们查看结果,并试图提取任何相关的学习或信息。

# 项目的目标

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/56c25b5cb11b8654bd73e194bf98416a.png)

图片作者:Jonathan C.T. Kuo

我们的项目目标是通过查看应用程序信息及其评论来预测应用程序的安装数量。我们希望这个项目能够帮助应用开发者预测他们的安装数量,或者帮助投资者挑选下一个大的应用。公司可能会运行测试焦点小组,或者应用程序开发人员可能会收到测试人员的反馈,并获得一定数量的评论。我们利用这一点和一些关于应用程序的知识来预测它的成功。了解安装数量可以帮助开发人员和业务经理,因为他们可以预测利润。这个项目的结果可能会显示市场上应用程序评论的重要性,因为它可能是安装数量的决定因素之一。

# 原始表格

我们有两个来自 Kaggle 的应用评论数据集;一个是有信息的应用列表。它包含应用名称、类别、评级等信息。另一个是每个应用程序的评论列表,其中包含评论的特定内容是积极的、中立的还是消极的。不幸的是,我们不能直接使用这两个文件,因为它们没有连接。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/64de73751026096eb26b8c42cca07673.png)

应用程序及其信息列表|图片由 Jonathan C.T. Kuo 提供

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/59fd72e4f2a2935f1ffb7dc9cc7afda7.png)

根据应用程序的评论列表

# 擦桌子

首先,我们分析了哪个信息栏与 app 的安装次数无关。这是凭常识做的。我们删除了大小、最后更新日期、当前版本和 android 版本,因为它们不是发布前影响安装数量的因素。此外,我们已经删除了评级和评论数量,因为它们显然与应用程序安装相关,并且在发布前不会被知道。然后,我们还修剪了所有不合适字符的数据。

我们通过对常见关键字进行分类,将类别和流派结合起来,并将关键类别列表添加到列中,以便每个应用的类别/流派属性可以表示为真或假。此外,我们收集了每个应用的评论情绪,并计算了正面、中性和负面百分比的总数。最后,我们将这三列与现有的应用程序列表进行了合并。

现在我们准备好测试了。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ce47dfe37236327121e7288cfd360231.png)

图片作者:Jonathan C.T. Kuo

# 第一个结果

该直方图显示了清除数据后决策树的性能。我们使用了 python sci-kit learn 实现的决策树,也就是 CART。CART 类似于 C4.5 之类的现有决策树,但它锁定了二元决策和信息增益。我们发现这些结果有点令人失望,所以我们决定尝试其他模型。所以我们也建立了一些人工神经网络。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d3eb78909bc9167eaf9669f29186129b.png)

图片作者:Jonathan C.T. Kuo

我们可以看到,这些网络表现稍好,但仅略高于掷硬币。然而,我们仍然认为应该有可能超越这一点。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/eb852af21b77d21f57ae661ef1b86be4.png)

图片作者:Jonathan C.T. Kuo

我们知道这个数据包含了很多异常值。如果在训练集和测试集中没有足够的案例,离群值可能很难处理。该模型将无法预测如何解决这些情况。这就像你预测掷硬币总是正面,因为前两次都是正面。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8940c2a89122a3753303048bab7f36e8.png)

原始数据—类别计数|图片由 Jonathan C.T. Kuo 提供

对于类别属性,一些关键类别非常罕见,很少有应用程序拥有该特定类别,这成为一个离群值。

为了解决这个问题,我们删除了一些最不常用的类。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d1eabe24622120eb570183fd1dca58e5.png)

处理后的数据—类别计数|图片由 Jonathan C.T. Kuo 提供

看看安装数量的分布。我们可以看到,它们已被四舍五入,“安装数= 1000”非常小。这可能会给模型的训练带来问题。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ab8b748926fdabc4eeca40a71bec60ad.png)

原创类|图片由 Jonathan C.T. Kuo 提供

为了改善这种情况,我们可以删除这些行,使数据更正常。我们也可以把这些类组合起来,这样就没有出现次数太少的类了。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d1bc091768487c109d3c5bb4bc8e8082.png)

加工类|图片由 Jonathan C.T. Kuo 提供

我们可以对数据中的其他元素进行类似的处理,比如情感得分。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/19a4f3941ea348baf361319b3b0e2f9b.png)

图片作者:Jonathan C.T. Kuo

请看我们在 0.2 处切断这些情绪分布的尾部

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0983533733930e38a0053814296b70cb.png)

图片作者:Jonathan C.T. Kuo

我们对消极和中性也做同样的事情

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/de8a72fe645335deea5c832882e2f572.png)

图片作者:Jonathan C.T. Kuo

即使在删除离群值之后,仍然可能有误导模型的列,因此我们应该尝试从剩余的列中搜索最佳的属性集。我们需要找出哪些列在预测数据时最有用,或者找出哪些最没用。然而,我们不想测试所有可能的组合。该策略基于在训练数据中建立几个简单的模型,并观察它们的有效性。

为了搜索一组好的列,我们首先尝试删除训练数据的最差属性。因此,从选择所有属性,我们建立模型,我们删除其中一个属性。从他们的分数中,我们可以发现什么属性最弱。然后,我们可以继续这个过程,首先删除先前选择的属性,然后搜索剩余的属性。我们还可以通过测试一个属性的每个子集来选择单个最有价值的属性,然后保留最有价值的列。然后,我们可以测试包含最有价值的列的 2 的所有子集。第一种方法是每次调用 drop 方法时,从所有属性中选择最差的属性进行删除。第二种方法是从零开始选择单个最佳属性,这种方法正好相反,称为增益法。我们还分离了一部分训练数据,用于稍后重新测试这些子集。

现在,一旦我们有了这些列表,也有几种不同的方法可以应用这些知识。我们可以取列表中定义的最好的 n 个属性。这种分级方法可以选择算法认为的最佳子集,但它可能不可概括,因为它是在自己的训练数据中构建的。我们还可以查看所有子集测试分数,以选择最佳子集。这四种方法:*排名增益、排名下降、最佳增益、*和*最佳下降、*都可以应用,看哪一种最有效。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a683e18d9cd1ef1f0743dd17a6d8c6ab.png)

图片作者:Jonathan C.T. Kuo

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/152ca9d52cc5e4840e852ec99dae158c.png)

图片作者:Jonathan C.T. Kuo

该图显示,当我们移除异常值时,测试准确性似乎有所提高。例如,清理数据的最大准确度约为 51%,原始数据的最大准确度约为 42%。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f30bfdd3158bad86b7ae68180e1696a5.png)

图片作者:Jonathan C.T. Kuo

网络模型也是如此,最大精度提高了 6%左右。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/cf55ee3f6f1991fa8e61906cbeb20a94.png)

图片作者:Jonathan C.T. Kuo

然而,图表并没有真正显示真相。我们可以认为模型从回答选择题变成了判断题,因为我们减少了类别的数量。在多项选择中,随机猜测者的正确率预计为 25%,对或错,我们应该看到这一数字上升到 50%。例如,在我们之前的测试区域中,多数类包含 24%,所以多数猜测应该得到 24%,现在多数类是 35%。这意味着猜测多数类提高了 11%。由于对数据进行分类更容易,准确性应该会自动上升。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/662b58f506b205f49ed2a652521172fb.png)

图片作者:Jonathan C.T. Kuo

如果我们减去 11%的清理数据的准确性,我们可以看到没有改善。更糟糕的是,我们的方法似乎降低了准确性。所以让我们看看哪里出错了。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ef6484cd83b0fd75a2f410fbc80e5b7a.png)

图片作者:Jonathan C.T. Kuo

在移除异常值之前,我们可以查看情绪得分,看看它是否与安装数量有关。从下面三个图表——正面、中性和负面情绪得分与安装的关系,我们可以看到每个图表都有数据聚类在一起。有人会说这是一种趋势。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/18aa06fd46f51d1ce2c083f34c9ef32c.png)

图片作者:Jonathan C.T. Kuo

现在,一旦我们剔除了异常值。数据点分布更加均匀,似乎完全没有趋势。这个结果背后有两个原因。首先,可能根本没有趋势显示情感分数和安装数量之间的关系。第二,当我们进行第二次数据清理过程时,我们可能会删除包含所有趋势的异常值。然而,如果异常值是唯一的趋势,那么这些就不应该被认为是趋势。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d970f307d67e933281d5ac05e8903a20.png)

图片作者:Jonathan C.T. Kuo

然而,列的选择似乎有一些用处。我们可以看看这个由列归约算法发现的改进的图表。与此同时,大多数削减未能改善模型。然而,许多人成功地找到了改进模型的方法,并且在极端情况下达到了 10%。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f019005492ad450066a7bc4d1298f159.png)

改善树木形象的有效性

我们可以看到它对神经网络有类似的影响。他们建议挑选列的最有效方法是使用 drop 方法中的最佳子集、gain 方法中的最佳子集以及 drop 方法中的排序选择。这似乎是发现的唯一改进方法。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b040e961d0967f6c44f2b8871fec5fa6.png)

改善 ANN 形象的有效性

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c690cacbce253062c3d68f5c696b949b.png)

结论|图片由 Jonathan C.T. Kuo 提供

这个问题很复杂,因为似乎我们所做的一切都无法增加分数。这可能是因为人们并不真正知道他们想要什么,而且通常最好的产品,比如评论最好的产品,实际上做得并不好。我们可以从情绪图中看到,好评和安装之间似乎没有任何主要的相关性。这个项目本可以更成功,因为它早期关注的是回归问题,而数据在分组时可以变回数字。最后,我们对所有的类所能做的最好成绩是 56%的网络,最好的树是 42%。我们用缩减的类所能达到的最好结果是,用人工神经网络达到 62%,用树达到 52%。总的来说,达到 62%似乎是不成功的。这离多数猜测不远了。但是我们怀疑取得更好的结果并不容易;这些属性似乎都不能很好地预测安装情况。然而,称该项目彻底失败是不正确的。通过选择色谱柱,我们可以找到一些提高准确度的方法。相比之下,我们通过减少类的数量使问题变得更容易。它变得更加一致。对于那些寻求投资的人来说,一个更容易解决、成功率更高的问题将是一个更安全的赌注。

## 承认

我要感谢亚历克斯·麦克维和安德鲁·帕克为这个小组项目付出了很多努力。

# 数据科学:所有女性的新职业选择

> 原文:<https://towardsdatascience.com/data-science-a-new-career-choice-for-all-women-16fde14d9f6?source=collection_archive---------5----------------------->

## 不要让不确定性或无意识阻止你给自己这个机会。

对于处于人生任何阶段的所有女性来说,数据科学都是一个绝佳的职业选择,无论她们是刚刚起步、正在考虑职业转型还是打算重返职场。然而 ***做出这种选择的女性太少*** *。*

这就是为什么,尤其是如果你没有任何技能,你应该重新考虑你的选择。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/869705cfa7a026f0348bdd082299829a.png)

图片来源于 Shutterstock 标准许可 Anastasia Ulianova

你没听说吗?数据是新的石油。这个世界需要更多的人能够收集它,处理它,研究它,理解它,并将其转化为有用的见解。因此,数据科学的跨学科领域自 2012 年以来经历了 [650%的爆炸性就业增长也就不足为奇了。](https://economicgraph.linkedin.com/research/LinkedIns-2017-US-Emerging-Jobs-Report)

然而,即使有如此令人印象深刻的表现,估计只有 15-22%的数据专业人员是女性。

这有许多原因,其中最显著的是科学、技术、工程和数学(STEM)领域合格女性的持续短缺。但是我在这里的目的并不是探究为什么女性得到的蛋糕越来越小,而是为什么更多的女性应该首先考虑去挖掘这块蛋糕。

众所周知,尽管妇女在劳动力中占很大一部分,但她们仍然面临着重大挑战。性别薪酬差距、歧视、骚扰——仅举几个最紧迫的例子。虽然近年来听到了更多的声音,并采取了措施来改善这种情况,但这些问题在许多行业和世界各地仍然存在。因此,选择哪条职业道路对女性来说更加困难,她们还必须花时间仔细考虑适合自己的工作地点。

在我们的疫情和大流行后的世界中,这一点尤其重要。事实上,在过去一年里,社会目睹了新冠肺炎危机对劳动力中性别平等的强烈负面影响,一些令人痛苦的统计数据表明,数百万妇女被迫离职或接受减薪,许多人在家里承担了额外的无偿责任。

然而,有趣的是,对包括我自己在内的许多人来说,封锁的另一个后果是重新评估我们个人的目标和优先事项。根据大都会人寿开展的一项调查[,多达**四分之一的女性在此时考虑过转行**,五分之二的女性表示有兴趣从事 STEM 职业。](https://www.metlife.com/about-us/newsroom/2020/october/pandemic-leads-1-in-4-us-women-to-consider-career-change-2-in-5-considering-stem/)

尽管如此,对 STEM 的看法和不确定性仍然是女性考虑这样做的最大障碍之一。我想把这些吹走,通过做这个决定来帮助更多的女性改善她们的生活。

## **首先,什么是数据科学家,数据科学家做什么?**

如果你用谷歌搜索“什么是数据科学?”,维基百科会告诉你*“数据科学是一个跨学科领域,它使用科学方法、流程、算法和系统从结构化和非结构化数据中提取知识和见解,并将来自数据的可行见解应用于广泛的应用领域。”*

现在我就此打住——对于任何没有技术技能或经验的人来说,这可能是一个令人生畏的定义。所以让我来分解一下:

数据科学是一门**非常好学的**并且今天越来越有价值的技术技能,它结合了一些编程、统计和建模知识,以便处理不同类型的数据并从中提取有趣和有用的见解。数据科学家有一个使命,那就是找到数据讲述的故事,并理解它对他们的业务/问题/目标意味着什么。

在我们这个数据驱动的世界里,公司越来越依赖数据来做出更明智的商业决策,无论是识别导致企业流失或吸引客户的原因,个性化医疗保健建议,制作有针对性的广告,检测欺诈,甚至是寻找下一批世界级体育运动员(*咳,咳*钱球),或者对任何使用过约会应用程序的人来说,寻找爱情。

数据科学应用的例子不胜枚举。如果你仍然好奇,请查看 [**17 数据科学应用&示例**](https://builtin.com/data-science/data-science-applications-examples) 的链接。

**无论您的行业、问题、兴趣或激情是什么,您都可以确定有一种方法可以将数据科学应用于其中。**

你开始看到前方所有等待你的可能性了吗?

## 一.为什么数据科学是女性的绝佳职业选择?

当讨论数据科学作为积极的职业选择时,首先想到的最重要的原因是广泛听到的高薪和就业增长的承诺。事实上,看看 Glassdoor 上的数据(毫无疑问是由数据科学家整理的),在美国,数据科学家的全国平均工资约为 11.4 万美元,而一般人口的平均工资为 3.1 万美元。

这不是很有希望吗?

至于就业增长,如果自 2012 年以来可用职位的增加没有给你留下该领域不断增长的潜力的印象,那么想想 LinkedIn 在 2020 年新兴就业报告中告诉我们的内容,数据科学以 37%的增长率排名第三,排在人工智能专家(74%和基于数据科学)和机器人工程师之后:

> “数据科学是另一个连续三年位居新兴工作榜首的领域。这是一个在所有行业都持续显著增长的专业。”

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3c5718ba310224484daff8bb25aeff9c.png)

领英 [2020 新兴工作岗位报告](https://business.linkedin.com/content/dam/me/business/en-us/talent-solutions/emerging-jobs-report/Emerging_Jobs_Report_U.S._FINAL.pdf)摘录。

这种高需求对女性尤为重要的原因有两个:

(1)首先在于**技能集**的价值。正如疫情向我们展示的那样,女性比男性更有可能失业。但这并不一定与直接形式的歧视有关。在许多情况下,这仅仅是因为工作本身的性质不如男性所扮演的角色“有价值”或“必要”。

营销、通信、教育、零售都是当今女性占主导地位的行业。此外,公司的行政、人力资源和秘书职位也更有可能由女性担任。因此,当疫情发生危机时,这些职位或领域的妇女首当其冲。

然而,技术技能的高价值可以保护妇女免受这种伤害。如果你经历过类似的事情,学习并转到数据科学职位肯定会增加你的工作保留率的保护,无论是在危机时期还是裁员时期。

(2)高需求对女性如此重要的第二个原因是**它限制了将性别问题引入招聘决策的可能性。随着越来越多的公司希望招聘到分析职位,女性更有可能找到一个积极的工作场所,谈判一份有竞争力的薪水,而不是为了财务责任和稳定性而坚持一个不愉快或完全有害的环境。**

这并不是说你在找工作时不会被拒绝。不幸的是,这是我们迟早都要面对的现实,不管是哪个行业。然而,这确实意味着,如果你对目前的工作状况不满意,作为一名熟练的数据科学家,你不会像在其他领域那样努力寻找更适合你的价值观和需求的工作。

的确,许多在数据科学领域工作的女性似乎都同意,男性和女性的机会是一样的,而代表性的差异主要在于 STEM 领域受过培训的女性人数较少,而不是某种形式的歧视性观念或做法。

尽管人数仍然相对较少,但许多在科技行业工作的女性,尤其是在数据科学领域工作的女性,在过去几年里走到了一起,组成了支持性社区,相互联系,相互学习,分享故事,并鼓励更多女性加入该领域。

对于任何有兴趣从非技术领域转行的人来说,这可能是我作为一名女性在数据科学领域工作时最想强调的方面。有了这样一个令人难以置信的社区和如此多的励志故事,无论你是希望专业地建立关系网,希望有一位导师来提高你的技能,还是仅仅与有着相似兴趣甚至相同疑虑的人建立个人联系,都有大量的平台、活动和资源来支持你。

最后,作为一个真正的跨学科领域,数据科学中所学的技能适用于任何领域,因此在选择专业行业时具有更大的灵活性。也许你一直梦想在时尚界或体育界工作,或者也许对你来说重要的是你工作的影响,在这种情况下,你可以选择利用数据科学造福社会。

无论如何,花时间学习这些技能可以让你重新找回激情,同时让你在工作中有更大的发言权。

## 二。数据科学领域需要你

当然,不仅仅是数据科学是女性的好选择。作为企业决策过程的基础,以及人工智能的基础,数据科学领域本身也迫切需要更多的女性代表。

尽管从数据中学习的算法可能会产生尽可能接近“客观”的输出,但现实是它们是由人编程并基于历史数据进行训练的,这使它们对偏差极其敏感。这在数据选择过程中尤为重要。

考虑以下案例——公司 A 决定在招聘过程中开始使用人工智能算法。因此,它根据其历史数据训练算法,以根据以前的成功候选人找到并做出决策。现在,如果这些候选人中大多数是男性呢?还是某个种族的?还是一组更有特权的邮政编码?该算法将选取这些将影响其决策过程的模式,从而无意中延续歧视性做法,而不是消除它们。更糟糕的是,该公司可能会声称这些决定是合理的,因为它们是由机器做出的。

一个这样的现实生活中的例子是 2019 年底的苹果卡丑闻,当时客户注意到,它给予女性的信贷额度比男性少。

所以,一个团队的不同视角越多越好。当然,这一点不仅适用于性别问题,也适用于整个多样性问题。

有许多关于这个主题的文章,所以我不会在这上面花太多时间,但是如果你感兴趣,可以看看下面的[为什么世界需要更多女性数据科学家](https://www.cgdev.org/blog/why-world-needs-more-women-data-scientists)。

## 三。女性最大的障碍以及如何克服它们

如果你一直读到这个阶段,我希望我已经成功地点燃了你专业从事数据科学的兴趣。

你现在可能也在经历某种程度的自我怀疑,这对于处于这种情况的女性来说是很常见的。事实上,这种怀疑仍然是阻止或阻碍许多妇女进入该领域的最大障碍之一。但不一定非要这样。

好消息是,对 STEM(尤其是数据科学)感兴趣的女性所面临的大多数障碍完全是基于感知的。这一次,不是世界或社会告诉我们不能或不应该这样做。相反,个别女性正成为错误观念的受害者,这些错误观念认为她们无法在科技行业取得成功,认为*她们*不够聪明,不会编程,或者太老了,学不了,或者任何源于她们能力和/或环境的怀疑。

但事实是——这些都是恐惧的理由,因此完全是胡说八道。我们的大脑非常善于为自己找借口。每个人在生活的某个方面都经历过这种情况——可能是在尝试坚持新的锻炼计划或更健康的饮食时,也可能是在尝试学习新东西时。

不要听内心质疑的声音。你绝对够聪明。最有可能的是,你没有受过训练。还没有。

在考虑 STEM 领域时,人们往往会坚持这样一种误解,即在接受培训之前,必须已经知道如何编程或具备一些基本的技术技能或计算机知识*,才能确定他们是否会在自己感兴趣的领域取得成功。这是第一大障碍。*

然而,大多数人似乎忘记了,即使是最高级的软件工程师或数据科学家也曾经是完全的初学者。当然,我们都听说过天才少年在成年前成为计算机专家的故事,但这绝不意味着为了成为一名成功的数据科学家,有必要从小就对技术感兴趣。

诚然,我们不可能如自己所愿,成为爱因斯坦、史蒂夫·乔布斯或埃隆·马斯克。尽管如此,为什么女性如此迅速地认为这是一个零和问题,以说服自己不去尝试和学习?

2016 年,[哈佛大学计算机科学女性倡导委员会](https://www.thecrimson.com/article/2016/4/25/computer-science-gender-gap/)的一项研究发现了一个惊人的结论,即拥有八年编程经验的女性与零到一年编程经验的男性报告的自信水平相同。如果即使是经验丰富的专业人士也是如此,难怪完全的初学者会感到不知所措!

同样,情况也不一定如此。

关键是为你的水平找到合适的资源和合适的学习结构。幸运的是,有数不清的选择,许多适合完全的初学者,只需快速的谷歌搜索。在线课程、教育视频、训练营、全日制项目、非全日制项目、自学选项……选择权在你。

选择一个选项并提交。没有人会期望你在第一天就像专家一样立即开始分析数据。一旦你开始学习,一点一点地,你将开始积累知识和经验,你将习惯编程语法,最重要的是,随着你向前迈进的每一步,你的信心也将增长。

此外,就像找到合适的学习资源很重要一样,拥有适当级别的支持也很重要。就我个人而言,如果你对转型很认真,我建议你去找一个数据科学训练营。如果你正在寻找一个更轻松的选择,简单地把你的脚趾浸入水中,那么在线课程是一个很好的开始。支持和结构是必不可少的,尤其是帮助面对任何程度的自我怀疑。

当然,数据科学是一门复杂的技能,需要最低程度的学习投入。在这方面,另一个障碍出现了,另一个普遍的看法——编码很无聊。

就像波士顿咨询集团在他们的研究中所说的“是什么让女性远离数据科学?”,数据科学有一个实像问题。被广泛接受的惯例将技术/数据科学文化描述为极其聪明和书呆子似的。但是就像之前这里提到的每一个概念一样,这只是一个视角的问题。

数据科学本身不是一个目标,而是一套技能。因此,你是否感到无聊很大程度上取决于你决定如何运用它。自然,数据科学的某些方面比其他方面更乏味,例如数据收集和/或清理,但这对于任何技能组合来说不都是如此吗?

以烹饪为例——为了准备美味的饭菜,你必须获得原料,准备它们(清洗、去皮、切割、切丁等)。),并在开始变魔术之前准备好合适的工具,这可能是一个乏味的过程。然后,你必须学习食谱,尝试它,但是一旦你知道它,它就成为一种习惯。一旦这样做了,你就可以选择做什么了。你更愿意用你的技能来准备一顿地中海大餐吗?或者你更喜欢亚洲烹饪?最后,我们中的许多人即使不是业内顶尖的厨师,也能做出非常美味的饭菜。

这听起来与数据科学过程没有太大的不同,不是吗?挑战将是坚持学习过程,因为你练习如何准备你的原料(你的数据)和你可以应用于它们的食谱(模型)。

随着疫情继续强调和加速劳动力的变化,妇女保护自己变得越来越重要。正如彭博所强调的,[麦肯锡全球研究所](https://www.mckinsey.com/mgi/overview/in-the-news/how-covid-19-will-change-the-low-wage-labor-market-permanently)最近的一项研究表明[到 2030 年](https://www.bloomberg.com/news/articles/2021-02-18/100-million-workers-may-need-to-switch-occupation-by-2030-chart),世界上最大的 8 个经济体中超过 1 亿的工人可能需要改变他们的职业,其中大多数是受教育程度较低的人、妇女、少数民族和年轻人。由于在一个日益自动化和数字化的世界中,受影响的人将需要接受更高水平技能的“再培训”,我希望这篇文章将帮助更多的女性拓宽视野,并通过向数据科学的职业转变为自己创造新的更好的机会。

所以,问问你自己——你想在多大程度上改善你的职业状况?

最后,对于任何关心自己年龄的人,或者曾经怀疑自己学习新事物能力的人,我想分享一个链接给大家,这个链接是关于日本妇女 Masako Wakamiya 的有趣而鼓舞人心的故事,她在 81 岁时自学了编码,这样她就可以为老年人创建一个游戏应用程序。她第一次拿电脑是在 50 多岁的时候。**你还认为自己太老了,不适合尝试吗?**

*千里之行始于足下。让这个决定成为你的第一步。*

# 给受访者、硕士生和转行者的数据科学建议

> 原文:<https://towardsdatascience.com/data-science-advice-for-interviewees-masters-students-and-career-changers-ff691d3b961f?source=collection_archive---------28----------------------->

## 在与安捷伦数据分析经理迈克尔·吴的对话中

我最近偶然发现了符号连接,这是一个由经验丰富的数据从业者 Thu Ya Kyaw 和 Koo Ping Shung 运营的数据播客。这个播客引起了我的注意,因为嘉宾主要来自新加坡,东南亚新兴的科技中心之一(也是我的家乡。)

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b5920886d83ae260c66cc6bc28564d10.png)

安捷伦的迈克尔。经迈克尔许可发布的图像。

作为一家科技公司的数据分析师,我总是对其他科技公司分析师的工作感到好奇。因此,我收听了安捷伦迈克尔·吴的播客。

在本播客中,Michael 分享了他作为安捷伦数据分析师经理的角色,以及对硕士生的建议和对数据面试者的提示。

# 背景

Michael 来自安捷伦科技公司,该公司为研究实验室制造生命科学仪器和消耗品。在安捷伦,他的团队提供商业智能和数据科学解决方案。在此之前,他在新加坡管理大学获得了商业分析 IT 硕士学位和营销与运营管理学士学位。

*安捷伦*提供完整的科学解决方案,帮助客户在实验室、诊所、商业和他们寻求改善的世界中取得卓越的成果。

我们去面试吧!

# 作为一名数据分析经理,你的日常工作是什么样的?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5779155fc1cf128a6095979f8a0a9dd5.png)

由[卢克·切瑟](https://unsplash.com/@lukechesser?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

迈克尔主要负责三项工作。

1.  为利益相关者提供商业智能解决方案
2.  分析有助于安捷伦全球供应链的数据。
3.  通过发现问题和构建概念验证,寻找利用工业 4.0 发展公司的机会。

# 你发现了哪些有价值的技能?

对迈克尔来说,他选择的有价值的技能

1.  能够简单简洁地交流。利益相关者欣赏简洁。在一个甲板上,通常足以涵盖三个组成部分-什么是情况,数据说什么,什么是解决方案。
2.  机智。工具千变万化,可以互换。因此,拥有广泛的技能并能够掌握新工具是非常重要的。
3.  统计推理或分析故事。例如,能够处理数据并从趋势图中获得洞察力。

# 对于数据分析师或数据科学家,你在受访者身上期待什么?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/2e94d67ce6bc7257962899e05e199c73.png)

讲故事是做分析师的一部分。[农旺](https://unsplash.com/@californong?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

有趣的是,迈克尔强调良好的态度和软技能比技术技能更重要。事实上,这就是他所期待的

1.  **态度好。态度很重要,因为它是永恒不变的,它决定了这个人是否能与招聘经理或团队合作愉快。**
2.  **表现出解决问题和讲述故事的能力。在面试中,迈克尔寻找暗示,展示候选人如何处理问题和解决障碍。**
3.  **领域专长。**对于安捷伦(一家供应链公司)来说,供应链领域的专业知识为候选人赢得了信誉。
4.  **与利益相关者互动的能力。**
5.  **分析师在短时间内处理数据问题的能力。**这是因为分析师有时需要快速完成分析。
6.  受访者需要知道这份工作是否是你想要的,你是否能为这份工作获得良好的曝光率,是否能与经理合作愉快。

像许多其他公司一样,安捷伦也有技术筛选环节,包括三个问题。

当被问及候选人的首选教育背景时,Michael 提到硕士或博士并不是必需的。事实上,候选人不需要有计算机科学学位来通过简历筛选,只要他们展示了一些数据工作(对于像我这样的非计算机专业的人来说是个好消息!)

# 你是如何选择你的硕士项目的?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b21061c2b43db69e9778b2d645c0ea76.png)

大师的选择…照片由[粘土银行](https://unsplash.com/@claybanks?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

在考虑硕士课程时,迈克尔将他的决定标准分成(至少)四个部分。

*   **本地 vs 海外。迈克尔选择了当地的学位(在新加坡),因为这可以让他在当地建立人脉。**
*   兼职与全职。由于数据工作本身要求很高,他选择了全日制课程来专注于自己的学习。
*   学位与他的目标的相关性。他认为,SMU 的 IT 硕士课程是应用驱动的,而不是理论驱动的,更符合他的目标。
*   **教员。硕士项目的价值在于教师的智慧和他们能够回答的问题。**

# 对硕士生有什么建议吗?

当被问及他在 SMU 的时光时,迈克尔回顾了他的硕士研究,并给出了两条建议。

1.  **读书向上。**不做作业就去上课,适得其反。
2.  **在你的任务中建立独特的激情项目。** Michael 建议不要构建一般的项目,因为很容易找到类似的项目,这是简单复制他人代码的动机。一个独特的激情项目的例子是由他的朋友达伦完成的,他使用自然语言处理(NLP)预测了新万智牌卡的价值,以及它们是否会在未来的迭代中被削弱,准确度很高。

# 对试图转向数据科学的受访者有什么建议吗?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e9646f01c11d3196e9df8eac663c5ef7.png)

作为一个被采访者应该注意什么。照片由[克里斯蒂娜@ wocintechchat.com](https://unsplash.com/@wocintechchat?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

作为受访者,尽量避免那些

*   不确定他们雇佣数据分析师和科学家的原因。
*   在不合理的时间内期待结果

相反,寻找那些

*   理解数据科学是一个旅程,可能不会立即产生结果
*   仔细考虑你的背景,融入公司
*   在面试中与你进行智力交流。例如,迈克尔最棒的一次面试经历就是讨论他项目中的替代方法。

在签约某个角色之前,受访者还应该询问或了解以下内容

*   我有什么资源?
*   预期的交付成果是什么?
*   我有多少时间?

# 对那些考虑转行做数据的人有什么建议吗?

*   建立一个数据文件夹。迈克尔自己做了一个分析新加坡议会讨论的项目。
*   掌握数据可视化技能,并能够通过可视化进行有效沟通。迈克尔热衷于一个好的可视化应该有一个低的墨水数据比。
*   学会并练习商业故事技巧。一个可能的框架是麦肯锡的[情景、复杂和解决框架。](https://speakingsherpa.com/how-to-tell-a-business-story-using-the-mckinsey-situation-complication-resolution-scr-framework/)
*   提高你的商务写作能力。迈克尔推荐的一本书是斯特伦克和怀特的《风格要素》。

# 结论

在整个采访过程中,Michael 谈到了作为利益相关者进行有效沟通的重要性。事实上,作为数据团队和业务利益相关者之间的桥梁,数据分析师是见解的守门人,我们有责任仔细有效地传达这些见解。

如果你想与迈克尔保持联系,请随时通过他的 LinkedIn 与他联系。

<https://www.linkedin.com/in/michael-ng-59814011/> [## 迈克尔·吴-数据分析经理-安捷伦科技| LinkedIn

www.linkedin.com](https://www.linkedin.com/in/michael-ng-59814011/) 

如果你喜欢这篇文章,请在 LinkedIn 上联系我!我撰写关于学习数据科学、数据科学技巧和诀窍以及一般技术的内容。

<https://www.linkedin.com/in/travistang/> [## Travis Tang —数据分析师— Gojek

www.linkedin.com](https://www.linkedin.com/in/travistang/) 

请点击此处收听播客:

# 你可能也会喜欢…

</a-chat-with-grabs-senior-data-analyst-cliff-chew-64eda27a6fa6>  

# 确认

特别感谢 Michael,Koo 和 Thu Ya 允许发表本文。

# 2021 年的数据科学和人工智能书籍

> 原文:<https://towardsdatascience.com/data-science-and-ai-books-for-2021-b8665856cb9e?source=collection_archive---------18----------------------->

## 感兴趣的近期印刷出版物

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3e9f55fff70e7d01de35a6afe1fcf5bb.png)

[杨雅筑](https://unsplash.com/@sylviasyang?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍照

以下是目前以印刷形式提供的一些著名的数据科学出版物,按出版顺序排列。除了印刷书籍,我发现自己使用越来越多的在线培训资源、博客、视频和其他信息来源来跟上行业趋势,并需要提高各种主题的技能。似乎我们还没有完全准备好放弃书籍,所以在某些情况下,相同的内容创作者现在已经将印刷书籍添加到他们的产品中。

下面的书涵盖了从数学到商业战略,到模型建立和实现,再到人工智能的社会影响。它们可以在亚马逊上买到,也可以从你最喜欢的当地书店订购。我选择了亚马逊上评论数量较多的书籍,这些书籍自 2020 年初以来出版,涵盖了与数据科学、工程和人工智能相关的有趣主题。它们也都有数字格式。

## 书单

伊恩西提,马可和卡里姆·拉哈尼。*人工智能时代的竞争:当算法和网络统治世界时的战略和领导力。*哈佛商业评论出版社,2020 年。

*   本书重点关注数据驱动型决策的加速以及实体商业模式的数字化转型。这包括人工智能模型以及在新冠肺炎时代突然变得至关重要的更传统的库存预测。

汤普森、约翰和道格拉斯·兰尼。*建立分析团队:利用分析和人工智能改善业务*。帕克特出版社,2020 年。

*   这本书探讨了组织内构建数据科学团队管理的不同方式,以及高级管理层影响人员和项目成功的各种方式。创新项目取得成功所需的心态与其他商业计划截然不同,需要图表顶端的正确领导者。

马克·彼得·戴森罗斯。*机器学习的数学。*剑桥大学出版社,2020 年。

*   题目总结了这一条,如果你不熟悉统计和机器学习方法背后的数学,并且决心学习,这将帮助你从基本面中走出来。主题包括线性代数、微积分、线性回归的概率函数、主成分分析、高斯混合模型和支持向量机。

安德烈·布尔科夫。*机器学习工程*。True Positive Inc,2020。

*   实用机器学习模型开发和实现指南。许多优秀的数据科学家可能缺乏实现的经验,甚至认为它“超出了模型开发人员的范围”。包含的最佳实践和设计原则通常是通过参与项目生命周期的所有阶段在工作中学习的。这本书是一百页机器学习书的后续。

霍华德杰里米和西尔万.古格。使用 Fastai 和 PyTorch 的程序员的深度学习:没有博士学位的 ai 应用程序。奥莱利传媒,2020 年。

*   PyTorch 在深度学习模型开发方面越来越受欢迎,这本书将让你了解计算机视觉、NLP 和更多使用 fastai 的内容。这本书补充了他们的在线课程和代码,并有一个目标,即让更广泛领域的实践者而不是研究科学家能够建立深度学习模型。

劳伦斯·莫罗尼。*人工智能和编码员的机器学习:人工智能程序员指南*。奥莱利媒体,2020。

*   来自 Google 的 TensorFlow for images、NLP 和更多内容的介绍,包括有关 tensor flow Lite for mobile deployment 的部分。这本书是对 Coursera tensor flow 专业的一个很好的补充。

莫拉莱斯米格尔。*摸索深度强化学习。*曼宁出版公司,2020 年。

*   “探索”系列的一部分——追踪强化学习。作者隶属于佐治亚理工学院和他们的强化学习课程以及 Udacity nanodegree,现在介绍深度强化学习模型的应用。这本书是为机器学习建模者准备的,他们希望将强化学习添加到他们的工具包中。

拉克什马南,瓦利亚帕,萨拉罗宾逊和米哈尔穆恩。*机器学习设计模式:数据准备、模型构建和 MLOps 中常见挑战的解决方案*。奥莱利媒体,2020。

*   如果你不是工科出身,机器学习设计模式的概念可能是新的。但是定义公共模式和可重复的解决方案也是一个好主意,如果你使用模块化代码,我们都很熟悉。Lak 也很熟悉 Coursera 上的 Google 云平台课程,他和他的 Google 合著者一起给出了最佳实践和实际解决方案的解释。

哈福德,提摩西。*数据侦探:理解统计学的十个简单规则*。河源图书公司,2021 年。

*   畅销书《卧底经济学家》的作者解释了统计如何帮助我们知道什么该相信,什么不该相信,以及统计如何成为帮助我们理解世界的工具。我们对信息的情绪反应会影响我们处理和回应信息的方式,比如拒绝我们不愿意听到的证据。考虑到最近的政治气候,这本书似乎非常及时。

Rochwerger,Alyssa Simpson 和 Wilson Pang。真实世界人工智能:负责任的机器学习实用指南。狮冠出版社,2021 年。

*   人工智能在工业中的真实世界例子以及它如何出错,带有来自技术产品领导者的易读和非技术性的解释。随着模型的使用越来越广泛,偏见和负责任地使用人工智能的概念是商业领袖需要掌握的数据素养的一部分。

阿莫斯、大卫、丹·巴德、乔安娜·雅布隆斯基和弗莱彻·海斯勒。 *Python 基础:Python 3* 实用介绍。真正的 Python,2021。

*   realpython.com 团队的一本书,他们也发布了学习 python 的流行教程,帮助初学者尽快上手。

## 奖金簿

拉森埃里克。*人工智能的神话:为什么计算机不能像我们一样思考*。贝尔纳普出版社,2021 年。

*   这本书是本周出版的热点!这是一场关于一般人类智能与人工智能现状的讨论,以及在一个狭窄定义的专业领域(如何下棋)的进步并不一定意味着我们越来越接近类似人类的思维机器。所以,推迟一下机器人霸主即将到来的日子吧,那要等一段时间了。

## 摘要

我希望这能激励你开始阅读!祝你好运,我希望你在继续你的数据科学和工程之旅时,喜欢阅读这些书中的一本(或多本)。

# 数据科学和创造性破坏

> 原文:<https://towardsdatascience.com/data-science-and-creative-destruction-dcfc32688709?source=collection_archive---------38----------------------->

## 意见

## 数据科学将如何改变非科技公司的结构

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8b904345049911a6e4a02a36fd95e326.png)

伦敦经济学院图书馆在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

所谓创造性破坏,我们指的是提高效率并导致替代或缩小企业规模的过程。例如,汽车的发明使得马车夫的工作过时了。整个马车夫行业几乎全军覆没。
请注意,这种流程的目的是提高效率,替换或裁员只是流程的副作用。例如,那些发明汽车的人在寻找更快更方便的交通方式。马车夫被消灭是一个副作用。

自从信息技术(It)成为大多数企业的必要组成部分以来,已经过去了大约 50 年。我们指的是它的普通用法;即一个部门,根据公司的规模和类型,拥有一个或多个职位,如软件开发、网站设计、网络管理、数据库管理和报告开发。

传统上,大中型非技术企业的分析部分或多或少属于以下模式(见下图):我们有一组内部(内部或云)数据库。报告开发人员在这些数据的基础上构建了一组报告。在某些情况下,第三方工具连接到这些内部数据库。然后,我们有一组非技术“分析师”,他们接收这些报告,并使用 Excel 文件为分析业务问题提供解决方案,如预测、需求规划、装运等。我们所说的“分析师”是指 IT 部门之外提供这类解决方案的任何非技术人员。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/22a8ce291981e735467d7ef74875a3c5.png)

传统数据和分析(图片由作者提供)

这种传统的数据和分析方法效率非常低。
首先,这些“分析师”不懂 SQL,因此他们无法从内部资源获取数据,也无法转换数据。他们必须被信息技术填鸭式地提供数据。其次,他们不懂编程语言。因此,他们无法从外部资源获取数据(例如,抓取网站或使用 API)。出于同样的原因,他们无法实现解决方案的自动化,不得不一直依赖手动工作。
最后,也是最重要的一点,他们不具备为这些分析性业务问题提供最佳解决方案所需的理论知识。这些问题的最佳解决方案通常需要一种或多种技能的知识,例如优化算法、数学模型、统计分析和人工智能。

即使使用第三方工具来帮助他们提供更准确的解决方案,由于他们不知道这些工具(即算法)的内部工作原理,所提供的答案和过程仍然远非高效。这些工具被视为一个黑盒。他们提供数据,并获得输出,但是他们不能适当地调整它,而且通常涉及大量的手工工作。

出现的一个问题是“考虑到所有这些低效率,为什么这些非技术人员负责提供分析业务问题的解决方案?为什么精通技术的 IT 人员不提供这些解决方案?”
如果我们看看上面提到的传统 IT 角色(软件开发、网站设计等。),我们看到实际上这些角色都不具备所需的理论知识来为分析业务问题提供最佳解决方案。换句话说,尽管 IT 人员是技术人员,但由于不具备所需的理论知识,他们无法为分析性业务问题提供解决方案。

但在过去十年中,数据科学的出现改变了游戏规则。
数据科学家是为分析业务问题提供高效解决方案的最佳人选:

*   他们拥有所需的理论知识(数学、统计学、人工智能……)。
*   他们懂 SQL,所以可以从内部资源获取数据,转换数据。
*   他们知道编程,所以他们可以从外部资源获取数据,也可以自动化他们的解决方案。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fe3e63544c1bf040257a7d3a14dd24f1.png)

数据科学家简介(图片由作者提供)

数据科学正在引发一场范式转变。这是 It 中一个相当新的角色,它正在接管为分析性业务问题提供解决方案的角色;历史上由业务部门提供的东西,在 IT 部门之外,使用 Excel 文件或第三方工具,正如我们所讨论的,这是低效的。
因此,“分析师”(如上定义)的角色迟早会在非科技公司中消失(在科技公司中,他们从未存在过)。当然,我们仍然会有非技术性的角色,但是这些角色不会为分析性的业务问题提供解决方案。

虽然看起来很明显,数据科学家更适合为分析业务问题提供解决方案,但实际的转变一点也不容易。非科技公司长期以来都是这样运作的,也习惯了这种状态。这种结构性变化不是一夜之间发生的。另一个问题是,为了实现这种转变,您需要证明当前解决方案的低效性。但问题是,目前的解决方案大多是在本地存储的 Excel 文件中。这使得很难评估当前的解决方案。

尽管如此,这种变化迟早会发生。在一些非科技公司中,这种转变已经开始,其他公司必须向这种更高效的状态发展,否则,如果他们继续做过去几十年一直在做的事情,他们将会落后。

# 数据科学和文化物品

> 原文:<https://towardsdatascience.com/data-science-and-cultural-objects-50581f8d79f9?source=collection_archive---------28----------------------->

## 参考书目

## 超越的最新 TDS 文章

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8d39bef4586c82f30da744841e32f5c5.png)

蒙特利尔的夏天,作者图片。

正如我在[的介绍文章](https://cait-kindig.medium.com/a-short-introduction-40eb93ad6bb6)中提到的,我一直在寻找将数据科学世界与某种文化艺术品或趋势联系起来的 TDS 文章,从 19 世纪小说中的一致性到城市的公共交通网络。虽然我发现直白的教程或对人工智能未来的推测非常有用,但我总是会立即被与“现实世界”联系在一起的作品吸引下面我列出了过去两周特别让我印象深刻的 TDS 作品。

## [调色板转移的危险](/the-perils-of-palette-transfer-f2739b5e4d2c)作者[萨菲克·卡马鲁·阿兹曼](https://medium.com/@syaffers)

这篇长篇文章提供了对色彩数字复制的理解和指导,并通过一幅牡丹的照片演示了如何进行数字复制。作者对此做了一些阐述,但我发现有趣的是,一台机器如何能够如此容易地识别和复制色彩空间,这是如此之大,仍然非常未知。

## [Merlin sch fer](/create-a-spotify-playlist-for-yourself-and-your-partner-or-friend-8c224e3775d1)[为你自己和你的伴侣或朋友](https://ms101196.medium.com/)创建一个 Spotify 播放列表

在这里,作者反思了 Spotify 旨在结合两个用户音乐品味的 Duo Mix 订阅服务。谢弗和他的合作伙伴没有找到合适的功能,所以他自己做了一个!这首曲子是一个简单易懂的教程,教你如何重新创作二重唱组合,但这正是他和他的搭档想要的。

## 食物能帮助我们对抗新冠肺炎吗?由[瓜达卢佩·冈萨雷斯](https://ggonzalezp.medium.com/)

我们知道定期摄入足够的维生素 C 可以增强我们的免疫系统,但是在疫情期间我们应该吃什么呢?这篇文章基于[人类基因组学](https://humgenomics.biomedcentral.com/articles/10.1186/s40246-020-00297-x#Sec8)的一篇论文,“应用图形机器学习来预测食物中具有抗新冠肺炎特性的分子,基于它们针对新型冠状病毒-宿主基因-基因(蛋白质-蛋白质)相互作用组的能力。”结果呢?抗病毒超食物包括不同的浆果(黑醋栗、蔓越莓和蓝莓)、十字花科蔬菜(卷心菜、西兰花)、苹果、柑橘类水果(甜橙和柠檬)、洋葱、大蒜和豆类。所以囤起来!

## [由](/reverse-geocoding-with-nyc-bike-share-data-cdef427987f8) [Clif Kranish](https://medium.com/@ckranish) 使用纽约自行车共享数据进行反向地理编码

在纽约市骑自行车并不是大多数人想象的愉快经历,但作者试图改善物流体验,至少通过添加每个车站所在的区、街区和邮政编码。教程后面是对自行车旅行的起点和终点的简短分析,如果有什么不同的话,从交通的角度来看,知道这些总是好的。

## [一种混合整数优化方法来重新平衡自行车共享系统](/a-mixed-integer-optimization-approach-to-rebalancing-a-bike-sharing-system-48d5ad0898bd)

更多自行车内容!蒙特利尔 BIXI 是最初的城市自行车共享项目,在春夏秋三季是岛上的一种公共交通形式。王试图通过混合整数优化来解决碧溪的自行车不平衡问题(许多自行车停在城市的热门位置,一些车站空着)。该教程是彻底的,并在最后,为手头的问题提供了一个理论解决方案。作为一个“[以自行车为导向的青少年](https://www.facebook.com/groups/twmbots)”和蒙特利尔人,这是一个非常有趣和有启发性的阅读。

## [热烈讨论:利用气候数据预测冲突强度](/heated-discussions-predicting-conflict-intensity-using-climate-data-7084d623f8d2)作者[理查德·佩尔格里姆](https://richardpelgrim.medium.com/)

Pelgrim 在这篇文章中讨论了气候变化和全球武装暴力增加之间的相关性。他用大量的图表和地图来记录冲突发生的地点、频率以及随时间的变化。鉴于气候变化现在和过去都是一个社会问题,这篇文章提出了一个关于结果的特殊问题:在世界上冲突最严重的地区应该进行更多的研究。

## [塞犍陀·维韦克](/tweet-analysis-of-gamestop-during-the-stock-saga-cc10ce6158fc)在股票传奇中对#gamestop 的推特分析

2018 年,我的工作是通过 Twitter 过滤的时事对股市的影响,但我从未完全量化这种媒介的重要性。在这里,作者研究了#gamestop 推文对 1 月 25 日至 29 日股市的直接影响,并从他的数据中提供了有趣的结论和未回答的问题。

## [民主化的历史天气数据分析与 R](/democratizing-historical-weather-data-with-r-cc3c76dde7c5) 作者[萨比·霍尔瓦特](https://medium.com/@sabolch.horvat)

作为一个植物囤积者,这件作品瞬间引起了我的注意。这篇文章提供了一个非常深入的教程,讲述了如何根据五个不同的因素及其对应的地图来确定给定区域的最佳植物和作物。这些统计数据是按邮政编码计算的,所以大家有东西可以学。

下次见,阅读愉快!

# CBAM 天气模式的数据科学和可视化

> 原文:<https://towardsdatascience.com/data-science-and-visualizations-of-weather-patterns-with-cbam-41ec6380ed97?source=collection_archive---------26----------------------->

## 了解如何使用数据科学可视化和 CBAM 解释大量天气模式

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f68efa92f54d2e41ba63149695b6e706.png)

斯蒂芬·菲利普斯-Hostreviews.co.uk 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

数据科学是 21 世纪最热门的领域之一。“数据”是所有大型公司用来获取最有利可图的投资的最有价值的资产。有了正确数量和质量的数据,几乎任何任务都可以完成,以获得进一步的支持和客户满意度。

虽然数据科学处理数据元素的分析和研究的大多数基本方面,但数据科学的一个更重要的概念是包括探索性数据分析(EDA)的研究。简而言之,EDA 或数据可视化在理解所涉及的所有数据元素的工作程序以及分析所构建的模型产生的结果方面起着至关重要的作用。

探索性数据分析(EDA)和数据可视化是对我们可用的数据进行统计、图形和图表分析的最有效方法之一。数据可视化在分析天气模式的大量数据元素时非常有用。收集的所有数据有助于我们探索当前的气候条件和天气模式。

要了解和学习有关可视化技术的更多信息,请随时查看下面的文章,该文章涵盖了您的数据科学项目需要考虑的八种最佳可视化方法。

</8-best-visualizations-to-consider-for-your-data-science-projects-b9ace21564a>  

# 了解 CBAM 模式:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bb693aae090bf93e277859c2a254d9bf.png)

照片由 [NASA](https://unsplash.com/@nasa?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 拍摄

天气预报最具革命性的成就之一是由 ClimaCell 公司发射的 CBAM。换句话说,CBAM 被称为 ClimaCell 的定制大气模型,它改变了天气预报的前景。CBAM 提供的两个技术优势是微型和按需。

由于使用更常规和传统的模型,大多数天气预测和预报方法几十年来没有太大变化。使用的信息量很少,这些传统方法没有充分利用技术的真正潜力,导致只能预测部分数字。随着 CBAM 的引入,新的建模能力达到了新的高度,并在天气建模方面取得了巨大的成功。

CBAM 不仅采用传统的数据源,还将它们与所有可用的数据相结合,以提供前所未有的准确性和可靠性,从而实现最佳、高质量的天气预报。使用这种模式实现高性能和高分辨率的最佳公司之一是 tomorrow.io。它经过微调,可以在任何特定区域实现全球最佳结果,如上图所示。

# 为什么使用数据科学和 CBAM?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/741ee29ac798893b351ded996ca8dad2.png)

艾萨克·史密斯在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

CBAM 模型使用该公司的[天气 API](https://www.tomorrow.io/weather-api/) 来实现这种高分辨率性能。在我们深入讨论这个主题和研究一些代码之前,让我们首先了解它的好处以及它与其他模型的不同之处。然后,我们将看一个如何在地图上可视化全球降水的实际演示。

CBAM 革命成功的原因如下:

1.  高分辨率分析:该模型几乎考虑了周围环境中的每一个细节,包括所有基本的地形元素。几乎没有其他模型像 CBAM 一样接近高分辨率分析的速度,这使它成为更高分辨率可视化的最佳选择。
2.  虽然市场上大多数其他型号最迟每六小时更新一次天气分析和报告,但 CBAM 的更新频率为几分钟。
3.  虽然大多数其他模型对其覆盖的地方有地理限制,但 CBAM 覆盖了整个区域,使其可以在全球范围内使用。它可以在任何时间任何地点运作。它可以覆盖一个风力发电厂到几乎整个次大陆。
4.  这种模式最显著的优势是它拥有的随需应变的能力。它是高度定制和灵活的,允许用户为特定领域和任何特定用例进行可定制的天气预报,例如在地图上可视化全球降水。
5.  这个模型拥有的最后一个但也是最重要的好处是能够在任何给定的时间点访问最好的及时数据和信息。凭借他们的技术、数据科学和可视化,以及天气预报方法,CBAM 从数以亿计的专有观测中获得了惊人的结果。

# 示例代码:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/520ef14c798df35008589ba27c35f774.png)

美国地质勘探局在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

现在让我们进行一次实际演示,演示如何在地图上显示全球降水量。明天的[天气 API](https://www.tomorrow.io/weather-api/) 和[天气数据目录](https://www.tomorrow.io/data-catalog/)可以用来改进任何给定的预测结果。在这个演示中,我们将利用 JavaScript 对模型进行编码。这三个文件,即谷歌地图,Mapbox GL JS 和传单 JS,用于此目的。Tomorrow.io API 地图切片旨在轻松集成常见的交互式地图库,例如。初始化 google maps 的示例代码如下:

```
// get your key from app.tomorrow.io/development/keys
const API_KEY = 'add your API key here';// pick the field (like temperature, precipitationIntensity or cloudCover)
const DATA_FIELD = 'precipitationIntensity';// set the ISO timestamp (now for all fields, up to 6 hour out for precipitationIntensity)
const TIMESTAMP = (new Date()).toISOString();// initialize the map
function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 7,
    center: {
      lat: 42.355438,
      lng: -71.059914
    }
  });// inject the tile layer
  var imageMapType = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
      if (zoom > 12) {
        return null;
      }return `[https://api.tomorrow.io/v4/map/tile/${zoom}/${coord.x}/${coord.y}/${DATA_FIELD}/${TIMESTAMP}.png?apikey=${API_KEY}`](https://api.tomorrow.io/v4/map/tile/${zoom}/${coord.x}/${coord.y}/${DATA_FIELD}/${TIMESTAMP}.png?apikey=${API_KEY}`);
    },
    tileSize: new google.maps.Size(256, 256)
  });map.overlayMapTypes.push(imageMapType);
}
```

该代码用于根据您的方便地点设置地图,您可以在这里测试并可视化您的结果。为了在不需要额外编码的情况下直接访问项目,tomorrow.io 也从 [JSFiddle](https://jsfiddle.net/user/Tomorrow_io/fiddles/) 页面提供了这项服务。你也可以在这里随意试验。该代码来自以下[网站](https://docs.tomorrow.io/recipes/visualize-global-precipitation-on-a-map)。

# 结论:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bfdd3469185e4bac26b34bf344bee236.png)

照片由 [v2osk](https://unsplash.com/@v2osk?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

数据科学和数据可视化是当今时代最重要的词汇。有了适量的数据和适当的训练方法,任何伟大的模型都可以实现。一个这样的模型充分利用了所有可用的数据,通过可视化实现了天气预测的最佳结果,这就是明天的 CBAM

您可以使用此模型来获得所需的分辨率、覆盖范围和参数,因为它是全局微调的。你可以通过这种模式实现更多,这是任何人改善生活体验的必备工具!如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。

看看我的其他一些文章,你可能会喜欢读!

</best-pc-builds-for-deep-learning-in-every-budget-ranges-3e83d1351a8> [## 在各种预算范围内,最适合深度学习的电脑

towardsdatascience.com](/best-pc-builds-for-deep-learning-in-every-budget-ranges-3e83d1351a8) </17-must-know-code-blocks-for-every-data-scientist-c39a607a844d>  </15-numpy-functionalities-that-every-data-scientist-must-know-f6d69072df68>  </7-best-ui-graphics-tools-for-python-developers-with-starter-codes-2e46c248b47c>  </15-numpy-functionalities-that-every-data-scientist-must-know-f6d69072df68>  

谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!

# SaaS 分析公司的数据科学初创公司

> 原文:<https://towardsdatascience.com/data-science-at-an-analytics-saas-startup-d38500f8c2c6?source=collection_archive---------42----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3b8f7ded84600282e22711bc81cda4cf.png)

来源:[布拉姆瑙斯](https://unsplash.com/photos/N1gUD_dCvJE)

## 看看这个领域是如何发展的

我于 2020 年 10 月加入 Mode,担任数据科学总监。Mode 是 SaaS 分析领域的年轻竞争者之一。虽然我在 P2P 商务、传统商务、游戏、广告技术和数据科学公司呆过,但 SaaS 对我来说是一个新的挑战,也是我渴望学习的东西。

我来自一个非常不同的行业(一个广告技术/数据科学平台)以及在此之前的许多其他不同行业(视频游戏和电子商务),我正在体验一种全新的思考数据的方式,以及我们作为 SaaS 组织的数据科学家如何思考推动价值。

在我进入 Mode 的短暂时间里,我了解了分析和数据科学的一个新方面,以及长期分析在推动组织内部深度价值方面的重要性。我以前的许多角色包括战略和运营两个方面。SaaS 公司非常重视将使用数据与对企业健康和寿命的长期评估联系起来。

以下是我从之前的职业经历中学到的一些重要经验,我会在《风尚》定期实践这些经验:

**1) SQL 仍然和以前一样重要**。我第一次加入易贝是在 2004 年,当时我是一个初出茅庐的研发团队的一员,负责打造易贝快车。为了完成这项任务,我很快学会了 SQL,这项技能将在我的数据职业生涯中一直伴随着我。在那些日子里,SQL 是一种罕见的与“数据挖掘”和分析相关的技能集,被视为各种各样的黄金门票,因为公司试图利用数据(而不是纯粹的直觉)来帮助推动战略和运营决策。这段经历帮助我看到了树后的森林,当时谷歌和亚马逊开始产生重大影响,并保持超出早期互联网泡沫时期预期的关注。

在 Mode,我们目前几乎在数据分析、数据工程和数据建模的每个元素中都使用 SQL。ETL 工具已经发展到这样的程度,相对简单的 SQL 知识就足以用较少的工程设计来设计和构建数据管道。

**2) A/B 测试继续发展**。16 年前我在易贝的时候,我们很少甚至没有进行 A/B 测试,我们的大部分分析仍然是高度“销售交易”性质的——我们仍然没有将用户行为和参与度作为行动(点击、滚动)和用户流量的一个因素来衡量,而是理解关键的业务指标,如按类别分类的库存、出价和购买量、运输成本、平均销售价格等。换句话说,传统的零售指标。当时做了一些工作,试图通过网站标签来了解用户体验和参与度指标,但该技术仍处于萌芽状态,数据仓库系统过于昂贵,几乎不可扩展,也不够快,无法推动真正的价值。

从那时起,我们看到 A/B 测试已经超越了科学领域常见的统计分析和信噪比测定。它现在是用于优化前端接口和后端系统的可操作化工具。较大的科技公司会发现自己经常每月在他们的网站和平台的许多不同方面运行数百到数千个 A/B 测试。

3) **数据提供了产品设计和营销之间的关键**。离开易贝后,我在视频游戏行业呆了七年,在那里我领导数据实践团队,这个领域仍然是由自然驱动的创造性领域。游戏巨头在不同程度上使用数据,而羽翼未丰的社交和移动游戏初创公司几乎错误地使用了数据(还记得农业游戏吗?)来试图推动购买,并在一定程度上上瘾。我在大型游戏公司如 **EA、微软和世嘉**的大部分时间都花在宣传和销售数据上,以此来了解收购、游戏内行为、游戏平衡、资源使用、游戏经济和微交易(MTX)购买,以便更好地推动视频游戏的参与度和留存率。我与游戏设计师和营销团队密切合作,帮助理解这些事情,对游戏进行更新,并发起营销活动来支持新内容。

现在,我们看到在用户到达网站之前发生的事情之间的界限变得模糊。

获取体验已经成为端到端用户旅程的核心部分。我们已经看到 A/B 测试扩展到包括整个用户体验,从获取活动(广告文案、颜色、图像、行动号召)开始,到用户到达网站或产品后发生的事情,例如登录页面、消息传递、用户流、个性化甚至现场广告的 A/B 测试。所有这些都是为了改善更广泛的用户体验,方法是展示高针对性的广告,减少摩擦,增加转化(任何想要的行为,不仅仅是销售),以及通过定制的体验进行参与。Mode 已经开始了一个更宏伟的旅程,从端到端了解这一点,以便通过更加智能和更加数据驱动来改善收购、参与、销售和降低成本。但更重要的是,使用数据减少了整个流程中低效率的浪费,并改进了我们为客户创造价值的方式。

4) **多元检验和统计推断的功效**。我在 **Wooga 和 DeNA** 的社交和移动游戏领域的经历帮助我理解了多元测试和统计的力量,以大规模理解用户行为,并使用实时分析来*推动*特定行为。数据的面貌已经从理解企业和产品的表现转变为影响企业和产品的表现(这是亚马逊、谷歌和其他公司很早就知道的)。数据科学现在更广泛地出现在“数据领域”的前沿。

在 Mode,我们使用数据超越滞后分析(例如,“发生了什么?”)并使用数据更好地细分和预测用户行为(例如,“应该发生什么?”以及“会发生什么?”)为了在设计上更有思想,为用户提供他们所寻求的东西。

5) **预测智能可以帮助 SaaS 公司做出更好的决策,推动更好的结果**。2014 年,我来到了一家名为 **< intent >** 的广告技术/数据科学初创公司。他们的模型非常出色。如果我们可以实时预测用户使用微妙的行为指标(如每次搜索、点击和页面浏览)实时预订旅行的可能性,我们应该能够为这些用户开发用户体验,以推动他们获得他们*寻求*的体验,而不是他们*获得*的体验。事实证明,这项业务非常成功,对我个人非常有益,加深了我对预测智能、数据科学、用户体验、多元测试和在线商务的理解。

模式的核心是一个内容驱动的产品。由于大量内容由数据和业务分析师创建,并由跨组织的用户探索,我们可以开始思考什么样的内容是有价值的,用户如何参与这些内容,以及我们应该如何更容易地教育用户并引导他们了解有价值的内容。通过了解用户想要什么,我们可以预测他们将需要什么。

# 如何在 Azure 中做数据科学

> 原文:<https://towardsdatascience.com/data-science-azure-8785c8f718ac?source=collection_archive---------44----------------------->

## Azure services 将你的机器学习项目带到云端

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c0c6d3379d7890ea58507b9361dea8cf.png)

照片由[达拉斯里德](https://unsplash.com/@dallasreedy?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

## ⚠️读了我在⚠️博客中的[原帖](https://anebz.eu/data-science-azure)

如今,在自己的计算机上进行数据科学研究变得越来越困难。当然,普通计算机处理数据探索、分析和可视化没有问题。但是当涉及到模型训练时,除非你拥有一个 GPU 或者你使用的是经典的机器学习模型而不是神经网络,否则你的计算机可能会很难训练一个模型。包括 RAM 和计算长度。

一些人购买更多的内存、更强的处理器或 GPU。其他人使用已经预先训练好的模型,例如来自 Huggingface 的模型,这是一种非常用户友好的与大模型互动的方式。有些人甚至会买个 GPU,训练出大模型,发布在 Huggingface 上玩玩。但大部分人没有这些资源,于是转向云解决方案。

在这篇文章中,我将具体解释如何在 Azure 的帮助下完成不同的数据科学项目。虽然我在 AWS Sagemaker 方面的经验较少,但我将来也可能会在 AWS 上发表另一篇文章。

# 使用通用云资源

当你使用云服务时,你可以简单地使用一个虚拟机,并且只为你使用的时间付费。所有的云提供商都是如此,包括 AWS、Azure 和 GCP (Google)。您可以指定所需的计算能力和 RAM 的数量,当然成本也会相应变化。虚拟机属于 IaaS 类型,即基础架构即服务。云提供商负责底层基础设施:硬件、网络、冷却、通风、安全补丁。你只要拿着服务器,把它用在你的项目上,不用担心这些事情。

这项服务提供了很大的自由和灵活性,你可以安装任何你想要的操作系统,不同版本的软件,但这也意味着你必须知道如何安装库,框架等等。假设您安装了 PyTorch 和其他 Python 库,当您尝试训练您的模型时,您会得到 PyTorch 和另一个库之间的不兼容错误。没有来自 Azure 的人会帮助你,你必须自己找到答案。

这是与 IaaS 的权衡:它不是非常用户友好,您需要自己设置大部分的东西。您需要对您正在构建的工具有所了解。但如果你能做到这一点,你就拥有了最大的自由。

# 使用特定的云资源

近年来,云提供商为不同的应用开发了特定的云资源。大多数提供商提供网络应用、物联网、数据科学、数据库、大数据等服务。这些属于 PaaS 类型:平台即服务。它们比 IaaS 更加用户友好,云提供商为您安装软件,您主要选择您的应用程序类型、您想要的编程语言版本等等。在终端上打字更少,在网站上点击和选择选项更多。

这些服务对用户更加友好,例如,对机器学习知之甚少的人可以创建一个图像分类项目。有大量的教程,帮助按钮和整体指导,使过程尽可能简单和舒适。缺点是,这些服务不太灵活。您可能会发现自己正在使用这些服务中的一个,并且您想要查看您的数据的某个特定部分,但是该服务不允许这样做。确保可以为您使用的每个服务导出数据或模型。

特定的云资源非常适合进行大项目的试运行,或者快速实现小的个人项目。在这篇文章中,我将告诉你关于机器学习的 Azure PaaS 服务。

## 1. [Azure 定制视觉](https://www.customvision.ai/)

自定义视觉是计算机视觉非常好用的服务,是用图像进行深度学习。你至少要上传 20-30 张图片,给它们贴上标签(或者已经上传了标签的图片),然后训练一个模型。它包括一个非常有用的 REST API,这样你就可以向模型发出请求,并且可以从任何其他应用程序获得预测。

不幸的是,图像的标签网站不是很好,Azure 机器学习(下一节)的网站更具可定制性。但是对于一个快速的解决方案,自定义视觉是非常强大的。

有很多教程,比如关于[物体检测](https://docs.microsoft.com/en-us/azure/cognitive-services/Custom-Vision-Service/get-started-build-detector)。该服务有预先训练的模型,这意味着在上传很少的图像后,模型可以很快适应你的训练数据。

## [2。Azure 机器学习](https://azure.microsoft.com/en-us/services/machine-learning/#product-overview)

Azure Machine Learning 是 Azure 为机器学习提供的一个更加可定制、更加完整的解决方案。它仍然是一种 PaaS 服务,但比定制的 vision 更复杂。

[关于如何使用 AML](https://docs.microsoft.com/en-us/azure/machine-learning/overview-what-is-azure-ml) 的文章很多。您可以使用 SDK 或直接通过门户来构建 ML 项目。例如,[这篇文章](https://docs.microsoft.com/en-us/azure/machine-learning/tutorial-first-experiment-automated-ml)解释了如何在 Azure Machine Learning studio 中用无代码 AutoML 训练分类模型。

您可以使用文本构建 NLP 项目,或者使用图像构建计算机视觉项目。AML 包括为您标注数据的标签,以及在其上训练机器学习模型的能力。

在我看来,AML 的一个最好的特点是标签可以是 ML 增强的。当你给图像加标签时,有一个机器学习模型在后台学习你的标签。一旦你标记了足够多的图像,该服务将向你推荐标签,使标记更快更容易。你将不再需要从头开始贴标签,你只需要纠正自动化服务所犯的一些错误,并可能添加丢失的标签。这在进行对象检测项目时特别有用,因为每个图像有许多标签。加速贴标签是很大的帮助。

## 3. [Azure 文本分析](https://docs.microsoft.com/en-us/azure/cognitive-services/text-analytics/)

该服务是用于 NLP 的 API,特别是情感分析、关键短语提取、命名实体识别和语言检测。比如你可以[搭建一个 Flask 翻译 app](https://docs.microsoft.com/en-us/azure/cognitive-services/translator/tutorial-build-flask-app-translation-synthesis) 。

# 结论

Azure 有三个主要的机器学习服务:自定义视觉和文本分析非常用户友好,快速且易于使用。前者用于图像,后者用于文本。然而,如果您希望您的项目有更多的功能,它们可能太简单了。在这种情况下,我建议改用 AML。你有更多的权力来决定如何标记数据,以及如何训练数据。我特别喜欢 AML 的贴标服务。即使您不使用 AML 的模型训练方面,您仍然可以在那里标记您的图像,然后再导出。

如果您想要更强大的功能和对应用程序的控制,那么我推荐使用虚拟机。这需要你知道如何自己安装框架,但你将拥有最大的自主权。

感谢您的阅读!我很高兴在推特上聊天

# 没有透明度,数据科学就无法创新

> 原文:<https://towardsdatascience.com/data-science-cant-innovate-without-transparency-9e31f49fb95?source=collection_archive---------35----------------------->

## [商业科学](https://medium.com/tag/business-science)

## 错误信息和谎言正在扼杀人工智能的创新:以下是我们如何拯救它

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/17ef0bdf21c1f38a7771964e788a528d.png)

[大卫·普帕扎](https://unsplash.com/@dav420?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

这个月,我花了很多时间在商学院给非技术背景的人讲授数据科学、分析和人工智能。这些都是聪明的、见多识广的高管,所以我很惊讶他们对数据科学目前的可能性的一些误解,以及他们对技术的一些恐惧。

> 这个误传?它来自我们:数据科学家。

在我们热衷于倡导人工智能的可能性时,我们忽略了现实——这不利于发展。

最值得注意的是,这位首席执行官放弃了一个尖端的、经过验证的人工智能解决方案,而不是一个吹捧量子分析的竞争对手,尽管根据最乐观的估计,量子计算甚至在近十年内都不会是一个可行的解决方案。量子人工智能可能令人着迷,充满希望,但声称你的公司目前正在利用它获得比该领域其他公司更好的结果纯粹是谎言。句号。

作为一名数据科学家,你可能不想理会它。一家公司撒谎又怎样?

> 但这不仅仅是一家公司,也不仅仅是一个谎言。

天花乱坠的宣传和夸张的声明正在排挤该领域真正的创新者。如果我们不小心,**数据科学骗子会扼杀人工智能的创新**,让数据科学倒退数年。

# 炒作和谎言之间的一线之隔

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/130119766c90cf7cb033d0821916e5c6.png)

约翰·施诺布里奇在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 拍摄的照片

为了使人工智能产生最大的积极影响,它的使用必须是适当的和广泛的。**人们必须相信,解决方案能够做到他们声称的事情**,没有编码偏差、不准确的假设或其他对结果产生负面影响的结构性问题。这种社会信任正在逐渐消失。

事实上,[**只有大约三分之一的人**](https://business.uq.edu.au/files/47040/Gillespie%2C%20Lockey%20%26%20Curtis%20Public%20Trust%20in%20AI%20Report%20FINAL%202021.pdf) **相信自己可以依靠人工智能取得成果**。经过[年的过度宣传](https://thenextweb.com/news/hype-is-killing-ai-heres-how-can-we-can-stop-it),人们有理由怀疑人工智能甚至分析是否能够实现。

这不能完全归咎于数据科学家。乐观的主张进入营销和媒体,然后被进一步夸大和传播。然而,一些数据科学家故意吹嘘,甚至公然歪曲他们的技术能做什么。*他们利用自己说谎的意愿,超过了更诚实的经营者,同时* ***增加了对 AI*** *的不信任:这是一个致命的循环。*

# 真理还在穿鞋的时候,谎言已经走过了半个世界

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1dc3c69596c9edc4ad81e593dd664279.png)

波巴·约万诺维奇在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

公众对人工智能的负面看法越来越多。这种压力阻碍了人工智能投资,并增加了对过度限制性立法的需求。由于风险,越来越少的公司愿意投资人工智能,错过了他们可以从更有效地利用数据中获得的切实利益。复杂的问题变得更难解决。

然而,不仅仅是坏的人工智能损害了所有人工智能的声誉。虚假的人工智能声明限制了该领域真正创新者的成长。愿意做出最大不真实声明的人工智能公司通常会获得最多的客户和投资,但他们觉得没有必要推进技术。

当资金流向骗子时,创新就会放缓。研究需要时间和金钱:当它稀缺时,进步就会嘎然而止。

# 透明的解决方案

可悲的是,我们无法从数据科学中完全消除骗子。每个领域总会有机会主义者。然而,我们可以让公众更容易理解人工智能什么时候做它声称的事情。**我们通过** [**透明度**](https://hbr.org/2019/12/the-ai-transparency-paradox) **来做到这一点。**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1e61ae1c710a26b0ad16fb818431a034.png)

凯文·Ku 从[派克斯](https://www.pexels.com/photo/black-farmed-eyeglasses-in-front-of-laptop-computer-577585/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)拍摄的照片

我们需要让人们更容易理解人工智能技术可以现实地完成并超出预期的事情。我们还需要让用户对他们的数据和人工智能的结果有更多的控制权。最后,我们需要能够解释为什么 AI 会做出任何推荐,从而最小化分析的黑箱。

**透明度对于数据科学来说是一个** [**临界值**](https://ethics-of-ai.mooc.fi/chapter-4/2-what-is-transparency) **,但在单个公司层面却难以实施**。任何人都可以宣称透明,就像他们可以宣称有效的技术一样。这两种情况下的问题是:**很少有人对技术有足够的了解来正确评估索赔**。

# 拯救立法;拯救 AI

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a9e486a30766317596a8386add206ef5.png)

照片由[斯科特·格雷厄姆](https://unsplash.com/@homajob?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

解决方案:有效的人工智能立法。政府的角色是保护个人权利和修复市场失灵:这里指的是缺乏信任。

一种自下而上的人工智能立法方法主要专注于弥合这种信任的差距,这将大大有助于鼓励人工智能和数据科学的创新。当双方都是善意的,都想让世界变得更好、更有效率时,*所有的利益相关者都会从第三方权威那里受益,他们能够* ***区分可证实和不可证实的*** *主张*。

制药业证明了这种方法的有效性。当你购买一种药丸时,你可能不了解它背后的化学成分,但你知道在这种药丸背后有一个强大的监管框架,确保它无害且有效。监管框架也有助于真正提供良好创新的公司获得健康的利润,投资于良好的 R&D,并以这些创新为基础。

购买人工智能的人有类似的知识差距,需要同样的第三方保证。

> 是时候**从不诚实的演员手中拯救 AI,并制定一个** [**创新的立法框架**](https://openloop.org/lets-unlock/#europe-publication) **来重建信任**。

# 建立对人工智能的信任

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8e2fcbe4c024827c8a767c6dad5de792.png)

照片由 [Oleg Magni](https://www.pexels.com/@oleg-magni?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 从 [Pexels](https://www.pexels.com/photo/photo-of-two-people-shakehands-2058130/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 拍摄

人工智能立法目前正在欧盟定稿,美国和许多其他国家的政府正在讨论自己的模式。联合国甚至正在起草自己的法律文书和建议。任何想完全避免立法的人都将大失所望。

作为数据科学家,我们有责任*积极参与制定立法,解决人工智能信任的实际问题,同时鼓励创新*。

我一直在利用一切机会与参与[创建这些监管框架](https://pub.towardsai.net/an-open-loop-is-critical-for-innovative-ai-286569261bcb)的利益相关者交谈,鼓励自下而上的数据驱动方法,并关注真正的市场信任失败。但是我一个人做不到。如果你重视人工智能创新,是时候参与进来,帮助**建立人工智能法律,阻止坏人,允许我们其他人创新**。

PS 更多[商业科学](https://medium.com/tag/business-science)来自我的写作:

</how-not-to-fail-at-your-data-science-project-7e8c84305aa8> [## 如何(不)在数据科学项目中失败

towardsdatascience.com](/how-not-to-fail-at-your-data-science-project-7e8c84305aa8) </agile-is-the-watchword-8b500d8cd0db>  

```
Monthly Business Science in your inbox, new software, and University-level learning:[**Free access**](https://evouser.com/register)Questions? Please reach out on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)
```

# 数据科学职业:2021 年还有利可图吗?

> 原文:<https://towardsdatascience.com/data-science-career-is-it-still-lucrative-in-2021-f37d433d1da5?source=collection_archive---------29----------------------->

## 意见

## 数据科学就业市场的现状和前景

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/78da1fa0a18196911c6065d4fba00ada.png)

图片来源:[由 Pressfoto @ Freepik](https://www.freepik.com/photos/business) 创建

数据科学就业市场在过去十年里一直蓬勃发展。数据科学家是 IT 行业最受欢迎的技术专家之一。研究表明,在 2013 年至 2019 年期间,著名职位门户网站上的职位发布平均数量同比增长了约 30%,总体而言,数据科学就业市场同期增长了 344%[1]。事实上,在过去的十年里,每个人都认同《哈佛商业评论》[2]对数据科学职业的看法:21 世纪最性感的工作!

然而,数据科学就业市场的增长在 2020 年放缓,这使得许多数据科学人才想知道这个就业市场的前景。根据这项研究,与前一年相比,数据科学就业市场的增长在 2020 年放缓了 15%。最重要的是,数据科学的姐妹领域数据工程的就业市场在 2020 年以更快的速度增长[3]。这些统计数据可能是为什么大数据行业的一些专家现在认为数据工程将取代数据科学成为数据从业者的下一个热门职业[4]。有些人甚至认为,数据科学行业是一个已经破裂或即将破裂的泡沫[5]。

本文将讨论数据科学就业市场的现状及其未来。我们试图为您提供数据科学就业市场仍然有利可图的五个原因:

1.  **数据分析是一个快速增长的全球市场**

根据各种市场研究公司的数据,到 2026 年,人工智能(AI)软件市场的全球收入预计将增长超过 1260 亿美元。事实上,专家认为全球数据分析和人工智能市场将在未来五年内持续增长 30%-40%[6]。公司收入的这种增长水平意味着数据分析和人工智能软件公司必须继续雇用数据科学人才,以赶上市场的整体增长,这意味着市场上有更多的人才就业机会。

**2。疫情推动数据科学就业市场放缓,这可能是暂时的**

2020 年观察到公司为项目雇用数据科学人才的速度放缓,这让许多人认为数据科学是一个破裂的泡沫。然而,根据 Gartner [7]的一项调查,47%的企业决策者没有改变投资人工智能和机器学习技术的计划,其中 30%的人甚至正在计划增加投资。

此外,Gartner 认为,机器学习及其相关领域,如深度学习、计算机视觉、自然语言处理,都超出了他们膨胀的预期峰值[7],这对数据科学家来说是一个极好的消息。超越炒作曲线的峰值意味着公司开始制定关于机器学习和数据科学的现实计划。很快,数据科学可能会成为一种标准和职业,就像软件工程一样,总是有需求的。

</breaking-into-data-science-in-2021-is-it-still-easy-as-before-9bb6fe313a0f> [## 2021 年进军数据科学:竞争越来越激烈了吗?

towardsdatascience.com](/breaking-into-data-science-in-2021-is-it-still-easy-as-before-9bb6fe313a0f) 

**3。其他数据领域的增长有利于数据科学**

在线媒体上有一种说法,数据工程将取代数据科学在最热门工作中的位置[4]。然而,有人可能会说,其他数据相关领域的增长实际上对数据科学就业市场有利。任何从事大数据项目的人都知道,构建数据驱动的软件是一项团队工作。你可能需要召集一个由软件工程师、数据工程师、云和开发运维专家以及数据科学家组成的团队,共同构建高性能的人工智能软件。这就是为什么为从事人工智能产品的软件团队带来更多专家或自动化工具将有助于数据科学家专注于他们的实际工作,即进行数据分析,建立和优化高性能机器学习模型,以与业务利益相关者交流可操作的见解。

<https://medium.com/geekculture/working-as-a-data-engineer-1f53b04aff83> [## 作为数据工程师工作

medium.com](https://medium.com/geekculture/working-as-a-data-engineer-1f53b04aff83) </working-as-a-machine-learning-engineer-a364545ae93c>  

**4。后疫情时代的经济复苏需要专门的数据科学团队**

据预测,在后大流行经济中,公司将被迫采用更多的大数据分析和机器学习技术来实现增长。随着人工智能技术推动的自动化趋势,公司不得不聘请人工智能和数据科学专家来为其企业软件训练机器学习模型。此外,随着数据驱动战略的发展趋势,公司有动力开发更多的分析仪表板和工具来促进决策。一些专家可能认为这些任务可以通过现有的软件即服务和云解决方案实现自动化。但是,公司不太可能找到一种方法来消除从原始数据中获得有意义的商业见解或训练高性能机器学习模型所需的所有艰苦工作。因此,大流行后的经济增长将推动对所有数据从业者的需求,包括数据科学家和数据工程师。

**5。跨国公司仍然倾向于将技术开发留在内部**

许多专家认为,数据科学和机器学习的软件即服务和云解决方案越来越多,最终将使数据科学家的角色自动化。但是,如果我们看看全球公司,特别是财富 500 强公司内部完成的人工智能和机器学习项目,就会发现一种强烈的趋势,即把数据和专业知识留在内部。这可能是由于几个原因,如数据安全、商业秘密保护、复杂的功能需求或高水平的性能期望。因此,可以预见的是,财富 500 强公司将坚持内部开发定制的基于人工智能的软件解决方案,而不是采用现成的软件解决方案。这意味着将始终存在对数据科学家和机器学习专家的需求,他们具有企业思维,并可以在这些类型的公司的大规模 IT 项目范围内工作。

**TL;灾难恢复摘要:**

在过去十年中,数据科学就业市场一直在持续增长。但是,数据科学就业市场的增长放缓使得许多人才想知道他们是否必须将努力投入到其他领域。由于多种原因,我们认为 2020 年数据科学就业市场需求的放缓可能是暂时的,随着经济复苏,就业市场将会回升。此外,其他数据相关领域的发展,如数据工程、DevOps 和云计算,将增强这些专业知识在大型软件项目中的地位。总的来说,我们的结论是,数据科学职业和其他数据职业一样,仍然是一个非常赚钱的职业,也是就业市场上一项受欢迎的技能。

**参考文献:**

[1] [对数据科学家的需求正在激增,而且只会越来越多。](https://searchbusinessanalytics.techtarget.com/feature/Demand-for-data-scientists-is-booming-and-will-increase)
【2】[数据科学家:21 世纪最性感的工作,《哈佛商业评论》。](https://hbr.org/2012/10/data-scientist-the-sexiest-job-of-the-21st-century)
【3】[2021 年数据科学访谈报告,访谈查询。](https://www.interviewquery.com/blog-data-science-interview-report/)
【4】[我们不需要数据科学家,我们需要数据工程师,KDNuggets。](https://www.kdnuggets.com/2021/02/dont-need-data-scientists-need-data-engineers.html)
【5】[数据科学家 vs 数据工程师,Datacamp。](https://www.datacamp.com/community/blog/data-scientist-vs-data-engineer)
【6】[2018-2025 年全球人工智能(AI)软件市场收入,Statista。](https://www.statista.com/statistics/607716/worldwide-artificial-intelligence-market-revenues/)
【7】[2 大趋势主导 Gartner 人工智能炒作周期,2020,Gartner。](https://www.gartner.com/smarterwithgartner/2-megatrends-dominate-the-gartner-hype-cycle-for-artificial-intelligence-2020/)

**更多文章来自作者:**

</working-as-a-data-science-consultant-e626669ab72b>  </the-best-time-to-kick-start-your-data-science-career-4ca5e0b56ff>  

**关于作者:**

Pouyan R. Fard 是 Fard 咨询公司的首席执行官兼首席数据科学家。Pouyan 在数据科学、人工智能和营销分析方面拥有多年的公司咨询经验,从初创公司到全球公司。他曾与制药、汽车、航空、运输、金融、保险、人力资源和销售等行业的财富 500 强公司合作。

Pouyan 也在指导活跃在大数据行业的初创公司和人才。他的热情是通过职业培训培养下一代数据科学家,并帮助他们找到数据科学领域的顶级工作机会。

Pouyan 已经完成了关于消费者决策预测建模的博士研究工作,并对开发机器学习和人工智能领域的最先进解决方案保持兴趣。

# 数据科学编码遇上电子竞技

> 原文:<https://towardsdatascience.com/data-science-coding-meets-esports-9439d3ecf91e?source=collection_archive---------32----------------------->

## [社区聚焦](https://towardsdatascience.com/tagged/community-spotlight)

## 通过模因和现场比赛建立社区

*在 Community Spotlight 系列中,TDS 编辑与数据科学社区成员畅谈有助于推动该领域发展的激动人心的计划。今天,我们很高兴地分享* [*埃利奥特·冈恩*](https://medium.com/u/aad1101621dd?source=post_page-----9439d3ecf91e--------------------------------) *与尼克·万和梅格·里斯达尔的对话,他们是* [*切片*](https://www.notion.so/SLICED-Show-c7bd26356e3a42279e2dfbafb0480073) *的创作者:一场激动人心的新现场编码比赛,“就像电视节目 Chopped 但不是数据科学”。*

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7ece669cd9302167fc176b11e3895e86.png)

图片由 SLICED 提供

***尼克万*** *是《刀削面》的联合主持人和联合创作人。他是肯德基的数据科学经理,在*[*Twitch*](https://twitch.tv/nickwan_datasci)*负责流式切片和其他数据科学内容。你可以跟着他上* [*抽动*](https://twitch.tv/nickwan_datasci) *和上* [*推特*](https://twitter.com/nickwan) *。*

***梅格·里斯达尔*** *是《刀削面》的联合主持人和联合创作人。她在*[*Kaggle*](https://www.kaggle.com/)*(一家谷歌公司)领导产品。她住在洛杉矶。你可以在*[*Twitter*](https://twitter.com/MeganRisdal)*和*[*LinkedIn*](https://www.linkedin.com/in/megan-risdal-4617812a/)*上找到她。*

## 如果我必须用三个词来总结 SLICED,那就是:好玩、热情和专业。我认为这种氛围是通过 SLICED 的美学、制作价值观和主持风格传达出来的。你能多谈谈这个项目是如何起源和发展的吗?

尼克:我在做这些被称为数据闪电战的事情,我会给自己 30 分钟的时间来浏览一个我从未见过的数据集,同时做一个演示,然后聊天会给我的演示打分。这是相当古怪和愚蠢的,但人们真的会进入它。我一直希望有这样一个版本,人们可以像在数据闪电战中那样有竞争力地创建数据科学工作。我想到了电子竞技是如何给视频游戏注入新的生命的,我想也许有机会给现有的黑客马拉松理念注入竞争的火焰。所以在 Meg 和我谈论了一会儿 SLICED 之后,我们从我的社区里找了四个人来参加一个 4 集的试播季,它非常受欢迎。

**Meg:** Nick 和我在一次圆桌聊天中开始讨论 SLICED 的早期概念。我们开了一个关于 Chopped 的玩笑,但是对于数据科学(我们都喜欢烹饪!)这个想法一直伴随着我们。我们想,为什么不试试呢?我们做到了!在我们发展这个想法的时候,这最终成为了一个很好的合作伙伴。我带来了我在 Kaggle 工作的许多经验(当然也是关于竞争数据科学和社区),以及我的网络,用于建立宣传,招募参赛者,吸引观众和初始赞助商。

而且很高兴听到切片美学抢眼!在与我们的设计师, [Salt & Fog](https://www.instagram.com/saltandfog/) 的 Veronica Casson 合作时,我们在 SLICED 的品牌简介上花了很多心思。她做了出色的工作,帮助我们传达了一些我们希望是平易近人的,受欢迎的,充满乐趣的东西。在很大程度上,我们一直很有斗志,自己做了很多视频制作和社交媒体营销,这也是我们的巨大荣誉。不过最近,我们请来了托尼·佩莱瑞蒂为我们的剧集制作 YouTube 剪辑,这真的把事情带到了另一个层次。我们已经得到了很多关于制作的很好的反馈,并希望继续在这方面投资。

## 你认为 SLICED 是数据科学在线教育领域的一项创新举措吗?你如何将类似切片的东西放在现有内容旁边?

教育媒体往往有三个层次:教育内容(如操作指南或讲座)、教育娱乐(如比尔·奈或《地球星球》)和普通娱乐(如战斗机器人或《流言终结者》)。我的流被标记为寓教于乐。我个人并不认为这有直接的教育意义,因为我们并不是真的想要指导或教授任何东西,尽管有时它可能会以这种方式出现。我们没有简化切片(或我的任何流)上的任何概念;它真的不适合初学者。以美国宇航局发射火箭为例。他们是想教育人们天体物理学吗?不。不是说切片是把人送到他妈的太空的水平,但这是相似的。我们正在展示许多人在学习数据科学方面的劳动成果。在数据科学中这还不够。许多数据科学流旨在教育。像大卫·罗宾逊、朱莉娅·西尔格和格雷格·马修斯在疫情期间在 Twitch 上直播他的课程。有这些教育家,我根本不想步他们的后尘。

**Meg:** 正如 Nick 所说,SLICED 旨在为我们的观众和更广泛的数据科学社区带来乐趣和娱乐。它本身并不意味着直接的教育意义,但我希望它能激发人们发现数据科学的乐趣,这可能会激励他们想要学习新的东西。看到 SLICED 鼓励人们与我们的参赛者一起参与,在每周的挑战中一试身手,尝试他们在节目中看到的技术,写博客帖子(就像 Julia Silge 关于[在 tidymodels](https://juliasilge.com/blog/nyc-airbnb/) 中实施定制 RMSLE 指标的帖子)等,这真是太酷了。但是在一天结束时,让我兴奋的是社区建设和“做”(相对于学习)方面。

## 你认为切片是通过让观众观看专家的行动来弥合这一差距的一种方式吗?SLICED 是否有一个元目标,让学生学会如何学习或提出好问题?

对于生产级的专业数据科学来说,SLICED 并不是一个非常现实的设置(谢天谢地)。对于数据科学的新手来说,SLICED 更多的是一个机会,让他们看到专业的数据科学家是如何的不完美,没有记住每一个 API,等等。我们的参赛者现在非常清楚这可能是一次非常令人羞愧的经历!作为一个数据科学的新手,能够观察专家犯错误和迭代是非常非常有意义的。切片绝对提供了一个独特的机会来见证这一点。但我不会说有人应该指望通过观看该节目来学习如何做数据科学。对于那些确实想学习的人,我会鼓励他们参与 Kaggle,因为没有比实践更好的学习方法了。

**Nick:** 人们对我们这么说是因为它提供了一个了解合法行业专业人士流程的窗口。我们没有任何将切片教育化的目标,这只是一种乐趣,也是一种在新媒体中发展数据科学社区和文化的方式。对我们来说,社区远比教育重要。削球就像看人们打篮球或台球。在真实的游戏中你不会做这种事。切片是 trickshot 数据科学。它还以一种非常独特的方式向更多人介绍了 Kaggle。那真令人兴奋。我认为这很好,因为它利用现有的工具在数据科学领域创造新的东西。我们已经有了卡格尔和特维奇。两者并用,把它变成一个游戏节目,那些不了解 Kaggle 竞赛部分的人,现在他们可以接触到 Kaggle 上的其他竞赛。最终,我们希望看到更多的人在 Kaggle 上进行直播比赛。还有更多的开创性的事情要发生。有趣和有创造力的人可以通过看到这些平台的这些维度而受到启发,并真正用它做一些令人兴奋的事情。

## 比赛结束一天后,节目会对每位参赛者的笔记本进行预演。你能分享更多关于观看专家讲述过程的价值吗?

**梅格:**在直播节目中,尼克和我只能猜测为什么有人会以他们的方式做决定或处理问题。只有当你听到他们走过他们的方法时,你才能理解他们完整的思维过程。看到我们的选手在两集之间密切关注彼此的方式,这非常酷。不仅在赛后直播中,而且在使用[#切片标签](https://twitter.com/search?q=%23SLICED&src=typed_query&f=live)的 Twitter 上,在[尼克的不和](https://www.notion.so/Discord-2e92c1ad842746b9a731efce37cabcad)中,在博客帖子中,以及在参赛者自己的流中,都有很多对话。许多参赛者,如杰西·莫斯蒂帕克和大卫·罗宾逊,分享了他们的错误,以及如果有更多的时间和后见之明,他们会如何以不同的方式处理事情。在节目本身之外还有很多学习在进行,这也是 SLICED 的萌芽社区如此伟大的另一个原因!

尼克:上一季我们在这一集就这么做了。现在是四个人而不是两个人,在这一集里没有足够的时间深入了解每件事。有些看 SLICED 的人想要深度潜水。参赛选手非常愿意演练他们的代码。所以这是一个好的,幸福的婚姻,这是一件容易的事。从参赛者的角度来看,即使是他们也有更好的想法来表达他们第二天想要表达的东西,而不是现在。所以这既是一个时间/务实的事情,但也是他们有时间放松后更好更简洁的事情。

## 这个节目有特定的目标观众吗?你认为初学者和更高级的程序员在观看它的过程中有什么不同吗?

**尼克:**我们的特定目标受众是了解数据科学的人。无论是刚起步的人,还是在行业内摸爬滚打多年的人。如果他们了解数据科学,我们希望他们喜欢它。我们的观众被我和 Meg 以及我们参赛者的社区所驱使。我敢说看 SLICED 的人有一半会来,因为他们知道有一个人在编码。30-35%的人可能会来,因为他们看到他们尊敬的人在 Twitter 上宣传这部剧(使用 [#SLICED](https://twitter.com/search?q=%23SLICED&src=typed_query&f=live) !).剩下的 15%左右可能是当前的,现有的切片常客。这些人中的许多人不一定是我的其他流的常客。这很酷!

**Meg:** 爸爸妈妈也欢迎聊天(数据科学家与否)!但说真的,我不希望 SLICED 变得如此具有竞争力,以至于成为一个不受欢迎的利基市场。很明显,它的核心仍然是有竞争力的,我们希望忠于这一现实,但我们希望熟悉数据科学的每个人都感到有趣和兴奋。作为一项比赛(或者说一项运动),我们希望让人们每周都关注比赛,并参与到比赛的进程中来,这真的很有意义。但与此同时,我们希望它对那些只能偶尔去看一场演出的人来说是娱乐性和趣味性的。

## 有没有什么让你惊讶的事情?

尼克:社区。在试播季的时候很意外。在试播首映之前,我的最高观看人数是 80 人左右。所以打破那个记录是令人兴奋的。每周都有超过 50 人出现,这很令人惊讶。统计数据显示,我们平均每晚约有 100 人,有些地方会有 200 人。数据科学在内容方面可能非常枯燥。它并不总是视觉上令人兴奋,通常也不是关于数据科学内容背后的个性。切片提供了更多视觉刺激和突出数据科学传播者的机会。我认为这是人们每周不断出现的部分原因。

**梅格:**每周的电视剧都是让我惊喜的东西!这是真实的,每一集都不一样。排行榜的变动,紧张的技术难题,非常接近的分数,参赛者没有完全阅读文档(总是阅读文档!).这一切都以一种我们想写也写不出来的方式进行着。切片才是真正的真人秀!

现场直播期间有多少人参与 Kaggle,这也让我大吃一惊。尼克和我最初猜测我们可能会得到 2 或 3 人,这是一种方式了。事实上,我们只是打算将 Kaggle 用作我们的评分基础设施,但该平台已经成为切片社区的核心部分。每周我们都会看到更多的人加入进来。我们甚至看到人们在推特上分享他们在剧集之间玩着玩着。令人兴奋的是,人们真的对这个节目的额外维度产生了共鸣,因为它使 SLICED 的体验和社区更加丰富。

你可以在我们的网站和这个 [Twitter 帖子](https://twitter.com/MeganRisdal/status/1415063071928639491?s=20)中找到《切片》第一季的所有数据集。

## 你在第二季的什么地方看到了切片?你对下一步有什么设想吗?

梅格:我希望《切片》第一季能产生足够的宣传,在我们准备第二季的时候,真的能建立很多认知和期待。我们很乐意招募更多的人,既包括现有的参与者,也包括刚刚了解这个节目的新人。总的来说,我们想用和试播第一季一样的方式来处理第二季:我们学到了很多关于什么有效,什么无效,并做出了改进。我想在第一季结束后采用同样的方法来发展这部剧,因为它真的是关于如何为我们的观众、社区和参赛者创造最佳体验。

我还半开玩笑地说,当这部剧跳过鲨鱼的时候,我会做切片衍生剧和圣诞特辑。但说真的,我很想做一些专注于数据科学更小众领域的一次性剧集,比如 NLP 或计算机视觉。这将允许参赛者以更少的时间投入参与,让我们展示不同领域的专业知识,让我们对实验想法进行概念测试,以孵化整个赛季。如果你有什么想法,请随时给我和尼克在 Twitter 上或者在 [Discord](https://www.notion.so/Discord-2e92c1ad842746b9a731efce37cabcad) 发消息!我也很想做一集烹饪片。实际上尼克和我会在洛杉矶亲自剁碎。

**尼克:**对于《切片》第二季,我们还没有开始谈论它。我们只需要熬过第一季,然后回到白板前想出接下来的步骤。在我的频道上,我们希望在切片季结束后举行一次虚拟会议,所以这是我最直接的任务。下一季,我们希望在生产方面更上一层楼。看到我们已经能够做的事情以及人们对它的良好反应是很有趣的。我们肯定还没有到达可能的边缘。我们才刚刚开始。我们已经讨论了如何改进这个节目的想法。比如面对面切片或者在会议上切片。如果 SLICED 会像野火一样蔓延,就像 TED 演讲中的 TEDx 一样。在那里概念变成了它自己的。我在 Twitter 上看到一些人在考虑开始一场竞争性的数据清理比赛,切片式的。这是我喜欢看到的东西——切片不仅仅是我们的节目,而是许多不同风格的数据科学内容的开始。

## 有兴趣的读者如何参与进来?

**梅格:**我也希望看到更多的人和我们的选手一起在 Kaggle 上竞争!看到我们社区的热情真的很令人兴奋。也请在 Twitter 上分享你的 [#SLICED](https://twitter.com/search?q=%23SLICED&src=typed_query&f=live) 经历!我们希望看到这个节目如何激励你,以及你学到了什么,创造了什么。

尼克:看看我们的[概念网站](https://www.notion.so/SLICED-Show-c7bd26356e3a42279e2dfbafb0480073),那里有很多关于如何成为参赛者、注册成为实习生或赞助我们的信息。但老实说,最好的参与方式是在 Twitch 上观看我们的节目!

好奇想了解更多关于切片的知识吗?这里有两篇关于数据科学的帖子,分享了作者在竞赛中的经历。

*   "[观看#SLICED 的三个理由:实时数据科学竞赛](/three-reasons-to-watch-sliced-a-real-time-data-science-competition-8d5212ccf988)"(2021 年 6 月, *TDS* ): [Jin Hyun Cheong 博士](https://medium.com/u/ed25f2e73793?source=post_page-----9439d3ecf91e--------------------------------)分享了观看数据科学家现场解决新数据集如何既有教育意义又有娱乐性。
*   "[用 Python 预测桌游评分](/predicting-board-game-ratings-with-python-60c9de9ee067)"(2021 年 6 月,*TDS*):[Barrett Studdard](https://medium.com/u/4f34db0b270c?source=post_page-----9439d3ecf91e--------------------------------)分解出切片第 1 周的解决方案。

# 商业领袖的数据科学概念:项目生命周期

> 原文:<https://towardsdatascience.com/data-science-concepts-for-business-leaders-project-lifecycle-5b406306999f?source=collection_archive---------34----------------------->

## 如何成功实施数据科学项目

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/487b7a45ce1320bc7c1019f5596e3a57.png)

柴坦尼亚电视台在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 拍摄的照片

如今,每个人都追随数据潮流。公司争相收集更多数据、更优秀的人才,并承诺提供有用的见解。但是,当橡胶遇到道路时,即使有最新的技术和最聪明的头脑,有用的见解仍然具有挑战性。

根据 Gartner 的数据,85%的数据科学项目会失败。虽然这似乎令人震惊,但这一惊人的高比例的失败尝试准确地反映了我作为一名顾问在美国所看到的情况。作为企业领导者,我们需要了解数据科学项目失败的原因,并绕过成功实施的障碍。因此,首先,让我们看看数据科学项目面临的最常见障碍。然后我们将讨论如何最好地避免这些陷阱。

## 数据科学项目失败的原因

数据科学项目通常会因为以下三个原因中的一个或多个而失败:孤立的数据、人才短缺或沟通不畅。

**数据孤岛**

数据总是杂乱的。而且,我们产生的数据越多,混乱就越大。它分布在多个数据库系统中,有多种格式。但是,与数据多样性同样成问题的是数据所有者的贪婪。我们不都在同一家公司工作吗?为了公司的利益,我们不都在追求同样的目标吗?那为什么部门和团队这么不愿意共享数据呢?我不知道为什么,但结果是一个部门的数据不容易被另一个部门访问。当我们无法连接整个公司的数据时,寻找有用的见解就像在黑暗中寻找一种神秘的生物——你不会找到它。

**人才短缺**

数据科学人才短缺并不是什么新鲜事。这个问题已经存在好几年了,随着对数据科学专业人员需求的增加,这个问题似乎变得越来越严重。这有点像一个古老的难题,先有鸡还是先有蛋?为数据科学团队寻找人才的挑战分为两类:有才华的数据科学家,但他们都不具备特定于您公司的行业知识,或者您有知识渊博的行业人才,但没有数据科学技能。这是一个棘手的问题。为了实现*有用的*洞察力的目标,需要领域知识和数据科学技能。

</getting-your-analytics-team-right-b539206dac3d>  

**通信**

数据科学团队从不在真空中工作。他们总是为业务中的其他部门开发项目,并依靠 IT 将他们的解决方案部署到更大的技术堆栈中。数据科学团队和他们所服务的业务利益相关者之间的一个常见问题是项目的关键指标或结果的沟通不畅。这与任何公司项目没有太大的不同,但是因为它涉及数据、业务知识和数学模型,错误和误解无处不在。

一旦解决方案准备好投入生产,数据科学团队通常会将其交给 it 部门进行部署。不清楚他们的数据科学工作如何集成到生产管道中会导致部署失败。

其他罪魁祸首存在,但这些是一些最普遍的小妖精队遇到的。像任何其他类型的项目一样,利用生命周期方法可以帮助避免障碍,给我们的团队最大的成功机会。

## 数据科学生命周期

**第一阶段:发现**

数据科学项目的发现阶段经常被忽视。除了实际参与发现工作而不是跳过它之外,成功完成这一阶段的基本要素是领域知识。从行业之外或刚从大学毕业的人那里挑选数据科学家会给你的项目增加挑战。但是,即使您公司内部有一位经验丰富的数据科学家,让直接受该项目影响的部门的利益相关者参与进来也是必不可少的。

数据和业务需求的领域知识应该是项目的驱动力和成功的保证。实际使用目标数据的人比任何人都更了解它以及企业对它的使用。

在此阶段,项目团队必须:

*   建立一个至少包括一个问题的目标,以确保正确的数据收集。
*   识别数据源中需要的信息。这和数据本身是不一样的。请记住,信息比数据本身更高一级。
*   确定优先级、规格和预算。优先级将决定首先要完成的工作,以及如果项目超出了时间和资金限制,哪些项目将被削减。规范规定了我们将在其中运营和生产我们的可交付产品的界限。和往常一样,预算——包括金钱和时间——最终决定了我们项目的范围。
*   最后,确定我们是否有必要的资源来实现我们的目标。资源包括人员、技术、时间、金钱和数据本身。

在进入下一阶段之前,让我们简要讨论一下这些资源。

**人员:**这又回到了前面讨论的人才短缺障碍。在大多数情况下,我们可以从自己的组织内部找到资源来填补公司外部短缺的职位。起初这可能看起来不太直观,但对于我们公司内部拥有必要资质的人来说,学习缺少的必要技能比找到一个拥有技术技能的外部人员并教给他们所需的业务领域知识更容易。因此,如果我们缺少资源,让我们不要忘记在我们自己的墙内寻找目前坐在不同座位上的人。

**技术:**如果我们只有事务数据库系统,我们可能需要在深入项目之前获得一个分析数据库解决方案。我们是计划使用 T-SQL 来转换我们的数据,还是使用一些提供拖放式 GUI 方法的 ETL 软件?一旦我们完成了数据科学工作(Tableau、Power BI 等),报告将如何工作?我们将如何开展数据科学工作?在我们开始工作之前,需要确定 Python、R、SAS、另一种技术或一些混合技术。

**时间和金钱:**这些资源应该不需要讨论。如果我们没有时间或金钱投入这项工作,它将无法完成。

**数据:**这是大多数球队完全忘记的一个。我们是否拥有完成既定目标所需的数据?有时我们不会。公司通常在数据科学项目开始几周或几个月后才会意识到数据差距。尝试提前确定这些问题。当我们能够成功地做到这一点时,我们的项目就为成功做好了更好的准备。虽然这是一种可悲的情况,但上面提到的作为障碍的数据孤岛是访问所有必要数据的常见障碍。除了技术数据孤岛(技术阻止我们访问各种数据源)之外,部门间的政治也可能在数据孤岛问题中发挥作用。当技术成为问题时,通常有一个简单的解决方案来弥合数据孤岛。然而,政治可能更具挑战性。解决政治数据孤岛可能需要业务主管和合规部门参加部门领导之间的会议。虽然每个人通常都试图为公司尽最大努力,但对什么是最好的意见分歧会使这成为一个很难克服的障碍。通常,对隐私或专有信息的法律关注是政治分歧的焦点。在你开始之前,花点时间浏览这些水域。

请记住,此阶段的关键角色是:

*   利益相关者
*   商业分析师
*   数据科学家
*   数据分析团队代表

**第二阶段:准备数据**

准备数据本身就是一篇文章,也许在不久的将来就会成为一篇文章。但是现在,让我们考虑一下数据争论阶段的基础知识。

本质上,在发现阶段执行的数据规划是在这个阶段实现的。这将包括数据获取、来源和转换任务,以便为下一阶段(规划模型)提供必要的数据。

*   收集数据包括从正确的源系统中选择正确的数据到指定的粒度。来源可能包括任何东西,从交易数据到日志数据,从电子邮件到通过 web 找到的数据。收集方法也可能有所不同,通常由数据来源决定。从公开网站抓取数据将采用不同于从公司内部数据库提取数据的方法。这是业务分析师和数据团队成为无价资源的地方。通过合作,他们应该能够识别必要的数据、其源系统和所需的收集方法。
*   存储数据和收集数据一样具有挑战性。根据数据的六个 v,您的存储选项会有所不同。但是,同样,所有这些决定都是在第一阶段做出的。现在团队必须执行计划。通过我们的收集工作,来自各种来源的数据将最终出现在一个或多个存储解决方案中。这些存储系统是数据科学家在为我们的数据科学项目规划整体数据模型时将使用他们分析的数据的地方。
*   最后,需要授权访问源系统和适当的存储区域。如果不能正确访问这两者,数据工程师就无法将数据收集到存储系统中,数据科学家也无法从存储系统中检索数据。尽管这是一个常识,但它也是一个经常被遗漏的步骤,在一些组织中可能需要几个星期才能完成。

这一阶段的关键角色是:

*   数据科学家
*   数据分析师
*   数据分析经理
*   数据库管理员
*   IT 系统管理员

**第三阶段:规划模型**

在此阶段,我们开始探索数据,并将数据转化为问题的答案,如发现阶段所述。这需要查询存储系统中的数据并进行分析。通常,将数据聚集到不同于源的粒度是规划模型的结果。确定数据之间的关系以创建所需的答案也是此阶段工作的重要部分。请记住,这是典型的数据科学工作。此外,决定数据模型还将决定接下来阶段的数据结构和体系结构。对于数据团队的成员来说,这个阶段是一个全员参与的阶段。数据科学家擅长探索数据和发现模式,但需要更传统的数据团队成员来优化新模型的存储需求和性能。

此阶段的关键角色:

*   数据科学家
*   数据架构师
*   数据库管理员
*   数据工程师
*   数据分析经理

**第四阶段:建立模型**

既然我们已经计划好了模型,我们需要构建它。这是我们实现算法来开发用于训练和测试的数据集的地方。这一阶段的两个主要过程是:

*   使用各种建模技术来确定特定情况下的最佳模型。
*   运行模型,测试结果,并实施修订,以确保它适合此数据。

关键角色:

*   数据科学家
*   数据架构师
*   数据工程师
*   机器学习工程师

此阶段使用的常用工具:

*   r 和 Python
*   张量流
*   斯堪的纳维亚航空公司
*   数据砖
*   矩阵实验室

</data-science-concepts-for-business-leaders-the-basics-15fd17c18254>  

**第五阶段:实施模型**

在此阶段之前,我们所有的工作都是在沙盒或开发环境中完成的。现在,我们在这个阶段运行我们的模型。我们将它从开发环境转移到生产环境。我们的目标是提供一个可重复、可扩展的解决方案,从我们的源数据中获得无误的结果。

这包括自动从原始来源提取数据,将其转移到暂存数据存储位置,对其执行我们的数据科学模型,将结果数据保存在我们的报告系统使用的存储位置,通常还有一些常见报告。当然,我们希望其他人也能从我们对数据的辛勤工作中建立他们自己的报告。

实施的另一部分是对结果的持续监控和分析,以确保模型总是正确运行。如果出现任何问题,我们必须重新访问生命周期的早期阶段,以查明问题并纠正它。

Kye 角色:

*   数据工程师
*   数据库管理员
*   软件工程师
*   实施工程师
*   运营工程师
*   运营经理

常用工具:

*   亚马逊网络服务
*   Windows Azure
*   信息
*   数据机器人

**第六阶段:传达结果**

数据科学项目生命周期的最后阶段是以沟通为中心的。此阶段的任务包括:

*   确定流程每个阶段的关键成果和经验教训,并记录下来。
*   为交流目的,创建我们所获得的洞察力的可视化表示。
*   将所有内容打包成一份报告,供所有利益相关者使用和理解。

关键角色:

*   利益相关者
*   数据科学家
*   数据分析经理
*   商业分析师

</the-future-of-data-science-5825bde65637>  

## 结论

虽然沟通只在生命周期的最后阶段提到,但它应该在生命周期的每个阶段实时发生。关于问题、经验教训和与项目相关的新想法的定期交流将确保每个人都保持一致,并且项目成员之间的期望不会变得不一致。不断的沟通是克服本文开头概述的最后障碍的唯一途径。缺乏沟通也是最有可能将你的项目破坏成令人沮丧的失败的方式。

您可能还注意到发现阶段包含了生命周期中的大部分解释。这是故意的。第二到第六个领域被每个学科的专业人员更好地理解。第二到第五个领域是常见的数据科学和数据专业概念。第六个领域是常见的项目管理实践。虽然发现在项目管理和数据工作中也很常见,但对于数据科学项目来说,它通常是失败的阶段。

数据科学项目的生命周期与其他项目没有太大的不同。它比建筑项目更具周期性,因为数据输入通常会随着时间而变化,公司的问题也会变得更加微妙。虽然每次公司改变影响模型的东西时,每个阶段可能不会被完全重新访问,但是在更多的组织中,每个阶段将被定期以简略的形式重新访问。这使得遵循生命周期和保持持续的沟通对持续的成功至关重要。

祝你的下一个数据科学项目好运。

***罗德蓖麻*** *帮助公司获得正确的分析!他帮助国际组织和小型企业改善他们的数据分析、数据科学、技术战略和技术领导力。除了咨询,Rod 还喜欢公开演讲、教学和写作。你可以在*[*rodcastor.com*](https://rodcastor.com/)*和通过他的* [*邮件列表*](https://rodcastor.com/newsletter/) *了解更多关于 Rod 和他的工作。*

# 商业领袖的数据科学概念:基础

> 原文:<https://towardsdatascience.com/data-science-concepts-for-business-leaders-the-basics-15fd17c18254?source=collection_archive---------35----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c143cff4138b1cb14ead1b63e8dc8ed2.png)

杆式脚轮

## 你需要知道的基础知识

识别和应对趋势一直是成功企业的核心要素。如今,如果利用得当,数据是这些见解的主要来源。数据科学概念和方法帮助企业将原始数据转化为决策信息。小型企业所有者和大型企业的业务专业人员都可以从增加他们对数据科学概念的了解和熟悉中受益。数据科学的主题可以分为三个方面:基础、实现和影响。在本文中,我们将讨论数据科学的基础知识。

数据科学是一门学科,涉及收集数据、分析数据、从数据中获取意义,并以有用的方式呈现其意义。在讨论数据科学时,我们经常听到数据分析、数据挖掘、机器学习或大数据等术语。然而,数据科学的核心在于数据、分析需求和职能角色。

# 数据类型

## 大数据

由于数据科学的核心是数据,我们将从解释一些常见的数据类型开始。讨论数据时最常见的一个术语是大数据。**大数据**是需要专业工具来处理和分析的大量复杂数据的集合。大数据通常用六个 Vs 的某种组合来描述:

*   卷:这表示数据的数量。
*   速度:我们需要处理数据以保持其价值的速度。
*   多样性:数据有多种形式和来源。
*   准确性:准确性与数据容易出错的特性有关。这可能包括偏差、噪声、异常、真实性以及最终的可靠性和可信度。
*   价值:如果我们不能从数据中提取价值,它就没有意义。我们能从哪些数据中获得什么价值?
*   可变性:你的数据有效期有多长?你应该保留它多长时间?它的意义或形状有变化吗?

## 数据表单

除了大数据的六个 v,数据还以三种**形式**存在:结构化、非结构化和半结构化。这些表单决定了数据的组织方式。一些形式具有高度的组织性,而另一些则没有。

*结构化*数据拥有高度的组织性。它很容易进行有效的分析。关系数据库是结构化数据的一个例子。表格、列和行定义了数据的结构,使其对分析师有用。其他形式的结构化数据,如 NoSQL 变体,可能使用标记系统来组织数据,而不是更传统的表、列、行方法。

*非结构化*数据没有以任何有用的方式进行组织,并且不符合预定的数据模型。非结构化数据的一个例子是基于文本的数据。

*半结构化*数据并不驻留在数据库中,而是包含组织元素。常见的例子包括逗号分隔值(CSV)、XML 和 HTML 文件。

## 开放和专有数据

除了数据可能采取的形式之外,它还可以分为两类,定义其可用性、所有权和使用权。

</how-to-implement-a-successful-data-cleaning-process-701e565e6575>  

*开放数据*任何人都可以免费使用。这些数据集经常用于 Kaggle 比赛或其他训练场所。通常用于文本分类实践的安然电子邮件数据集也是开放数据的一个例子。

另一方面,*的专有数据*归个人或组织所有。它受版权和潜在的其他法律方法的保护。一些专有数据可以从信用机构或研究公司购买使用。

## 数据来源

数据的类型也可以通过其来源来确定。*来自社交媒体平台的社交数据*,来自销售产品或服务的*交易数据*,或来自传感器或特定设备的*机器源数据*——通常称为物联网。

这些只是许多可能的数据来源的几个例子。

## 数据仓库

最后,从原始来源收集数据并进行处理后,数据被存储在某个位置供分析师使用。这些**数据仓库**有多种形式。一些最常见的是:

*   数据湖—数据湖用于以结构化和非结构化形式存储大量数据。当保留数据的需求不确定时,通常使用 Lakes。数据可以以原始形式存储,直到对其价值做出决定。如果数据有足够的价值可以保留,可以将它结构化并存储在数据湖的另一个区域。访问数据湖中的数据可能会很慢而且很麻烦。存储如此多的数据也很昂贵。
*   数据仓库—最常见的存储方法之一,数据仓库用于商业智能、报告和数据可视化。数据的结构便于快速方便地检索。向数据仓库添加信息比在关系数据库中慢,因为它的主要目的是帮助分析过程。
*   数据集市——通常,数据集市特定于需要以特定方式存储唯一数据子集的部门或团体。也许按地区、部门和团队的销售数据是按日、月、季度和年存储和计算的。数据集市通常是数据仓库的子集。
*   关系数据库——这是典型的数据库。用于为应用程序、记录保存或其他公共用户界面存储数据,这些应用程序、记录保存或公共用户界面需要访问数据或存储其生成的数据的位置。通常,存储在特定关系数据库中的数据来自一个来源,比如一个应用程序。这些数据是结构化和组织化的,重点是代表相关应用程序或源在数据库中添加、删除和更改信息的速度。

# 分析需求

在执行数据分析时,需要考虑三种类型的分析需求:描述性分析、预测性分析和规定性分析。

*描述性分析*最常见。任何利用分析的公司都至少在执行这种类型的分析。描述性分析使用数据来总结过去的行为。例如,每个部门的平均销售额、月环比销售额增长或按产品划分的库存短缺。这种类型的分析信息丰富,有助于制定商业决策。

*预测分析*利用数据预测未来行为。它表示特定行为在给定时间范围内发生的可能性。也许你正试图确定你预计在下个季度流失多少客户,或者指定所需的库存水平以满足下个月的订单需求,或者计算销售人员在下一年辞职的可能性。

*规定性分析*使用数据预测可能的结果,并根据这些结果提供行动建议。这是唯一一种试图回答“我们应该做什么?”这个问题的分析类型其他类型为决策者提供信息,但决策本身不在分析范围内。

</getting-your-analytics-team-right-b539206dac3d>  

# 职能角色

数据科学需要大量的技能。在一个员工身上找到所有必要的技能非常具有挑战性,尽管许多分析团队都是这样开始的。无论您的小型数据科学部门是只有一个人还是一个团队,必要的技能都被划分为职能角色。随着你工作的发展,这些角色将分别由一个或更多的人来担任。

*   数据科学家——这是这个学科的名字,也是人们梦寐以求的头衔。数据科学家必须拥有所需技能的最佳组合。这些包括与数据相关的技能,如清理、转换和聚合数据。他们还需要很强的数学技能,包括统计学。此外,他们需要熟悉预测建模和数据可视化工具。一个合理的工具集应该包括 R、Python 和 SQL。
*   数据架构师——架构师设计数据模型和带有必要安全元素的相关数据流。
*   统计学家——小组中的数学天才。对统计理论和方法以及相关平台和语言,如 R、s as 或 MATLAB,有很强的了解。统计学家将为预测模型处理数据。通常,数据科学家的角色会与这个角色合并。
*   数据库管理员—该角色管理和维护驱动分析的数据库。DBA 通常会实现数据架构师的设计,并且更了解您的组织正在使用的特定数据库——SQL Server、Oracle 或 CosmoDB。有时候,这个角色可以与数据架构师合并。
*   数据工程师——数据工程师是 ETL 大师。ETL 是将数据从源系统收集到对分析有用的最佳分析形式的核心。提取、转换、加载是一个常见的数据缩写词,指的是从一个系统中提取数据,改变其外观(结构、聚合、数据清理等),然后以新的形式将数据加载到新的存储系统中。例如,从他们的 Google Ads 活动中提取营销部门的所有社交媒体数据,从 Salesforce 实例中提取该活动的新客户,以创建一个仅包含这些数据的新表。
*   数据分析师—该角色分析数据,并找到共享有用信息的有效方法。有用的技能是数学、Excel、数据可视化工具和商业知识。
*   机器学习工程师-该角色负责采用数据科学家开发的模型,并创建一个可用于生产的版本,该版本还可以根据公司的真实数据量进行扩展。

除了这些最常见的数据科学职能角色之外,还存在其他角色。如果您对这个关于角色讨论的简短版本感兴趣,请查看这篇文章。

</the-future-of-data-science-5825bde65637>  

所有这些职能角色都与其他角色相互作用。这个团队还必须与其他团队互动。组织结构决定了这些职能角色是放在同一个部门还是其他部门。关键部分是所需功能的存在和功能之间的通信。

# 摘要

数据科学是一个广阔的研究领域。这篇简短的文章奠定了有用知识的基础,有助于商业领袖和专业人士更好地理解和讨论数据科学。三个核心领域是数据类型、分析需求和功能角色。对于那些希望在公司内部影响数据科学的人来说,能够完全理解这三个知识领域内的讨论将会改变游戏规则。

***罗德蓖麻*** *帮助公司获得正确的分析!他帮助国际组织和小型企业改善他们的数据分析、数据科学、技术战略和技术领导力。除了咨询,Rod 还喜欢公开演讲、教学和写作。你可以在*[*rodcastor.com*](https://rodcastor.com/)*和通过他的* [*邮件列表*](https://rodcastor.com/newsletter/) *了解更多关于 Rod 和他的工作。*

# 面向专业人士的数据科学课程

> 原文:<https://towardsdatascience.com/data-science-curriculum-for-professionals-46d131675602?source=collection_archive---------9----------------------->

## 从电子表格 Gnome 到人工智能向导的完整路线图

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bef468a9c38c983818e83b2e1582ea60.png)

按作者分列的数字

如果你最终决定走从 Excel 复制粘贴到可复制数据科学的道路,那么你需要知道最佳路线。好消息是,有大量的免费资源可以让你到达那里,还有令人敬畏的在线社区可以帮助你。坏消息是,选择利用哪些资源可能会变得非常困难。这是一个没有废话的指南,你可以毫不后悔地遵循,这样你就可以花更少的时间担心这条小路,而花更多的时间徒步旅行。这是基于我从一个从未上过统计课的可再生能源项目工程师到一个主要数据平台的负责人的经历。

# **你在这里**

在这个旅程的起点,你会发现一群受过教育的人出于需要而不是激情进行数据分析。他们被训练成工程师和商业分析师,他们挑选最简单的软件来运行他们的方程式。电子表格很漂亮,因为它们非常直观。你可以通过方程式的每一步,从字面上看到并隐喻性地感受到这些数字。构建主电子表格是一个私密的过程。(不信我?当有人向你展示他们的新模板时,试着批评他们的配色方案。)然而,一旦从原型转向全面的数据分析,电子表格很快就会达到极限。一旦你遇到一个需要花一整天来修复的循环引用,当你需要打开大文件时,开始计划你的休息室,或者花一周时间试图重新创建一个别人完成的分析,是时候继续前进了。在您旅程的第一步,您希望删除电子表格的手动步骤,加快它们的速度,并使公式更容易跟踪。你想开始编程。

## 第一次跋涉:选择一种编程语言

你现在面临着一生中最重要的决定。大多数有抱负的数据科学家从未跨越这个巨大的障碍。你打算先学什么编程语言?为了减少你的焦虑,你应该知道没有错误的答案;这就像在一只小狗和一辆新车(或者对你们中的一些人来说是一只猫和一辆摩托车)之间做出选择。虽然有大量的编程语言可供选择,但此时我只推荐两种:Python 和 r。

你可以花几个月的时间阅读关于哪一个更好的文章,但他们最终说的都是一样的。所以,给自己省点负担,让这成为你最后一次纠结这个话题。这个指南是严肃的,记得吗?我会直截了当地告诉你。

如果你要和任何人合作,而他们已经做出了选择;选择相同的语言。那样生活会更轻松。假设您正在为您的团队开辟这条道路(这很棒),我可能会推荐您选择 r。该语言是专门为使非计算机程序员的生活更容易而设计的,学习社区令人难以置信。更重要的是,RStudio IDE(集成开发环境;编辑代码的地方),比使用 Python 更容易上手。(对于任何在大学使用过 Matlab 的人来说,这感觉就像在使用 Matlab。)也就是说,Python 是软件工程师更流行的语言,当你开始构建机器学习应用程序时,它在“真实世界”中使用得更多一些。

我个人开始自学 Python 来进行普通的计算机编程,并陷入了许多令人沮丧的事情中(比如该死的 PATH 变量),这使得开始时进展缓慢。当我开始学习数据科学时,我转到了 R,并且非常享受这种体验。最近,我钻研了 Python 的数据科学包,现在经常在两者之间来回切换(这是一件令人惊讶的容易的事情)。

如果你想给这个话题更多一点公正,你应该读一下这篇文章,这篇文章深入了更多的细节。然后,你应该挑一个开始。

## 第二次跋涉:基本的统计数据和整洁的数据

一旦你选择了一种语言,你需要选择 IDE 和学习材料。如果你选择 R,使用 RStudio,阅读加勒特·格罗勒蒙德和哈德利·威克姆的《数据科学的 R》(通常缩写为 R4DS)。如果您选择了 Python,请下载 JupyterLab(使用 Anaconda)并阅读 Jake VanderPlas 的“Python 数据科学手册”。这两本书都可以在网上免费获得。

这两本书都将带你从完全的新手到超越电子表格的能力,使你能够处理各种各样的项目。所以,去做吧。举一个让你非常沮丧的数据分析过程(也许是不得不将数据从一堆 CSV 复制到一个模板中,也许是需要一堆电子表格并在它们之间复制/粘贴数据的过程,等等。)并编写一个 R/Python 脚本来帮您完成。当你遇到困难时,向社区寻求支持。

推动我前进的最大一步是理解整洁数据的概念。出于这个原因,我推荐阅读 Hadley Wickham 的“整洁数据”一文,并在您的代码中使用它的原则。

此外,到目前为止,做任何数据分析最有趣的部分是创建令人敬畏的可视化。确保你花了很多时间玩你的情节。这就是你如何让别人觉得你的代码比他们的电子表格更好。

最后,既然你现在正在做更深入的数据分析,回顾一下公司统计的原理可能是有益的。我推荐大卫·斯皮格尔哈特的《统计学的艺术》。这是一本非教科书,讲述了统计数学背后的思维模式,它更适用于编程人员,而不是深入数学本身。

# 第一个目的地

你成功了!通过这些非常简单的步骤,你现在可以称自己为数据分析师了。现在,您可以在 Excel 中做任何事情,甚至更多。分析数据现在相当快,你自动化了枯燥的东西,你有更多的乐趣来制作图表。对许多人来说,这是你想去的最远的地方。然而,接下来的几个步骤将会看起来非常诱人…如果你以前觉得很有趣,那就等到你制作第一个仪表板的时候吧。

## 第三次旅行:仪表盘

看看闪亮的 R 画廊([https://shiny.rstudio.com/gallery/](https://shiny.rstudio.com/gallery/))。或者对你来说,看看 Dash Enterprise App Gallery(【https://dash-gallery.plotly.host/Portal/】T2)这些是仪表板,在这里你可以将所有数据分析的结果合并到一个位置,这样你的业务领导就可以对你的工作感到敬畏,并根据数据做出明智的决策。(挺好听的口头禅,对吧?)更进一步,仪表板可以是 web 应用程序,允许团队的其他成员通过 GUI(图形用户界面)运行您的代码。有没有一款软件是你的团队目前正在使用的,但却让你抓狂?你可以重新创建它,但是只做你想做的事情,而不做其他事情,这样会大大减少你的点击次数。这个程序的输出可以是一个漂亮的 PDF 报告。

长话短说,仪表板是兴奋剂。你想掌握制作这些。从你的一个分析开始,把它的结果变成一个仪表板,然后在此基础上继续发展。对 R 使用 Shiny 包,对 Python 使用 Dash 包。有大量的文档可以帮助您,包括 Hadley Wickham 的《掌握 Shiny》一书,但与基础数据科学书籍不同,我不建议您从头到尾阅读它们。当你不确定如何做某件事的时候,就去编码并使用它们来帮助你。同样,学习社区是你的朋友。

## 第四次旅行:包,GitHub,开源,环境

既然你的同事已经被你的仪表盘迷住了,并且羡慕你的自动化脚本,你就需要开始合作了。首先,你可能会通过电子邮件或文件共享与他人共享你的代码,以便在他们的计算机上运行。类似地,每次开始新的分析,你可能会复制上一次的分析,并开始到处修改,以适应新的数据。每个人都是这样开始的,但是很快就变得一团糟。另外,您希望有一种更好的方法来跟踪代码的变更,并让其他人共同编辑它。要处理所有这些,您需要将代码转换成一个包,放在 GitHub 上。然后,每个人都可以访问代码,你甚至可以让它开源,让你与世界合作。

学习如何做到这一点的最佳资源是 Hadley Wickham 的“R Packages”和官方的 Python 打包文档([https://packaging.python.org/overview/](https://packaging.python.org/overview/))。GitHub 的指南也是学习如何使用他们的平台(【https://guides.github.com/】T2)的绝佳资源。

你第一次为你的团队开发一个应用,管理本地环境会给你带来很多挫折。我的意思是,每个人的计算机都将安装不同的文件,并且操作系统中的细微差别会迫使在他们的“环境”中运行的代码的行为与你的不同。这是一件很难理解的事情,并且偏重于计算机科学而不是基础数据科学。我尽可能地避免学习环境管理,但是一旦我学了,我的生活就轻松多了。无论是主动还是被迫,你都需要自己去学习。我从来没有找到一个很好的资源来学习这个,所以我在这里做了一个,推荐你阅读。

# 第二目的地

现在,您已经将数据分析技能提升到了一个新的高度。您可以为开源代码做出贡献,并且您现在已经具备了解决同事问题的必要技能。你可以领导一个高效的数据分析师团队。有了这些力量,你就在寻找真正推动商业价值的方法,所以高管们再也不能忽视你的工作了。

## 第五次旅行:高级统计和机器学习

如果你想真正开始为你的公司创造价值,你需要超越简单的线性回归和计算平均值。你需要开始钻研高级统计和(buzz-word-alert!)机器学习。这是一次比较陡峭的跋涉。盲目尝试开源的机器学习模型是可能的,但这有点像玩火。你应该真正明白你在做什么,否则计算机会试图颠覆你的动机,让你变得疯狂。我不是说你必须理解进入每个模型的所有数学,但是你应该对数学试图完成的事情感到舒服。你还想开始从数据中收集更大的推论,识别出你用外行的眼光错过的模式。你应该学习更多统计学的细微差别,以确保你能负责任地得出结论。这确实是关于大国需要大国责任的部分。学好这些工具,你就能做好事。

最好的机器学习资源是 Coursera 上的机器学习课程,由斯坦福大学教授、机器学习名人吴恩达教授。你可以在 github 上找到用 Python 和 R 而不是 Octave(他在课程中使用的编程语言)写的作业。接下来的另一门精彩课程是麻省理工学院深度学习导论(6。S191)类。这是一门麻省理工学院的课程,每年结束后都会向公众开放。本课程使用 Python 和一个名为 TensorFlow 的包。(注意,深度学习是机器学习的一种,是人工智能的一种。你所说的部分取决于你想给谁留下深刻印象。)

Coursera 上一个很棒的上层统计学课程是约翰霍普金斯大学的“统计推断”(使用 R)或者密歇根大学的“使用 Python 的推断统计分析”。

## 第六次旅行:云计算、数据管道

在某种程度上,本地托管您的所有进程不再有意义。这可能是因为需要大量的计算能力,需要将大量来源的数据聚合到一个位置,或者需要连续运行的应用程序而不是一次性的分析。在这种情况下,您将转向云计算,这意味着您必须找到一种方法将数据放入云中。此时,您可能会从数据分析师/科学家转型为数据工程师。这里面有很多东西,其中大部分是特定于云托管提供商的。为了避免这种情况,你可以使用 RStudio Cloud 之类的东西,它会为你做所有这些麻烦的事情。否则,你将需要温习许多计算机科学概念,如分区、复制和网络。

为了更深入地介绍云服务,我写了这篇文章。其他一些有用的资源是谷歌云实验室(或亚马逊、微软等类似的材料。)和 Martin Kleppmann 的《设计数据密集型应用程序》一书。

对于任何希望利用云的处理能力,但不希望实际托管应用程序的人来说,你绝对应该看看 Google Colab 笔记本。这些使你能够在云上运行 Jupyter 笔记本电脑,而不是在你自己的电脑上运行,不需要复杂的设置。它非常适合共享代码,而不必处理本地环境问题。

# 第三目的地

你到达了数据科学的圣地。你可以申请的一些头衔是生产数据科学家或机器学习工程师。你现在已经具备了为大型科技公司工作所需的技能,但你在行业中拥有的专业知识让你有别于标准的数据科学家,这让你的才能非常有吸引力。利用这一点来清楚地给你的公司带来价值,这样你的价值就会得到赏识。

# 来世

接下来有无数条路可供你选择。你可以深入研究神经网络和开源人工智能库,将人工智能世界带入你的行业。或者,你可以集中精力进行前端编码,学习 javascript、HTML 和 CSS,将你已经开始构建的网络应用提升到下一个水平。或者你可以掌握数据信息图和设计,以便更好地交流你的分析结果。或者你可以做无数其他的事情。既然你已经学会了如何在云中进行数据科学,天空不再是你的极限。

# 数据科学推动 UX 研究,改善 NFT 拍卖体验

> 原文:<https://towardsdatascience.com/data-science-driven-ux-research-to-improve-nft-auction-experience-e9dde1fb3d1d?source=collection_archive---------35----------------------->

## 当我在 artblocks.io 平台上参与 NFT 拍卖时,我利用 mempool 来获得用户行为和情绪的更好代理

用户体验(UX)描述了人们在与系统或服务交互时的感受,包括可用性、设计、营销、可访问性、性能、舒适性和实用性。唐·诺曼曾经说过,

> *“万物皆有个性;一切都发出情感信号。即使这不是设计者的意图,浏览网站的人也会推断个性和体验情感。糟糕的网站有着可怕的个性,并向用户灌输可怕的情绪状态,通常是在不知不觉中。我们需要设计一些东西——产品、网站、服务——来传达我们想要的个性和情感。”*

以太坊的性格是极其高深莫测,容易被误解的人。更糟糕的是,大多数用户在使用你的界面或钱包时,甚至不认为这是与以太坊的互动。如果你曾经参加过艺术街区拍卖的实时聊天,你会注意到,拍卖一结束,至少有十几个人抱怨说,他们没有得到一个薄荷糖是 Metamask 的错。我认为在过去的一年中,以太坊上的许多 dapps 的 UX 在产品交互和交易的可解释性方面都有了很大的提高。在很大程度上,dapps 不会在你签署交易后就给你留下一个 loading spinner。

即使 dapps 的设计在不断改进,我也不确定 UX 的研究已经深入到什么程度了。当我看到关于各种协议的数据分析或研究时,用户大多被视为同质的。随着我看到的 Uniswap V3 流动性提供商和 Rabbithole Questers 的一些分析,这种情况有所改变,但即使是这些人也仍然非常关注刚刚确认的链上交易。从我自己的经验来看,大多数的情绪和行为怪癖都发生在我提交、等待、加速或取消交易的时候。对于某些应用程序,用户可能会在提交交易后离开,去做其他事情。但对于像 art block auctions 这样的产品,他们会留在附近,直到确认发生,可能会检查任何他们可以更新的东西,并伴有复合焦虑。

我认为,通过开始更多地利用内存池,我们可以更好地理解用户行为和摩擦。[内存池](https://compassmining.io/education/what-is-a-mempool/)是节点临时存储未确认事务的地方。这意味着如果您提交、加速或取消交易,那么这些操作将首先显示在 mempool 中。需要注意的是,来自 mempool 的数据并不存储在节点中,所以不能像查询已确认的事务那样查询历史数据。从这里,您可以看到他们提交了几笔交易,交易速度加快了很多倍,但远没有达到所需的油价,最终在 20 个街区后看到了确认。我相信这是用户体验和他们在整个过程中可能感受到的情绪的一个很好的代理。如果我们了解不同的用户群体在这个周期中的行为,我们就可以找出如何补充他们的决策或缓解他们的焦虑。据我所知,几乎只有以太坊基金会、所有核心开发人员和一些钱包团队出于 UX 的原因利用 mempool 数据。

**UX 研究论文:**通过观察一段时间以来用户通过拍卖的行为以及他们的钱包历史,我们可以开始为不同的用户群体提供行为特征。从这里,我们可以确定要尝试和缓解的主要问题。我们将使用 [Blocknative](https://www.blocknative.com/) 获取一个月的 Artblocks 拍卖数据,并使用 [Dune 查询](https://dune.xyz/)对这些地址的历史进行分层。

这篇文章将比我以前的一些文章更具技术性,因为我相信这项工作可以而且应该相当容易地推广。*我想强调的是,我的背景不是 UX 研究,我纯粹是在试验我认为隐秘的 UX 研究可能会是什么样子。*

# 数据来源和预处理所有拍卖数据

*如果您对技术方面不感兴趣,请跳到下一节特性工程*

# Blocknative 和 Mempool 数据流

使用 Blocknative 的 Mempool explorer,您可以过滤提交给特定合同或来自特定钱包的交易。在我的例子中,我想听 Artblock 的 NFT 合同的白名单中的 minter 合同。你可以在这里找到我使用的[流,如果你想使用完全相同的设置,可以把它保存下来。](https://tinyurl.com/yftus9h2)

您可以使用下面的查询[在其子图](https://thegraph.com/legacy-explorer/subgraph/artblocks/art-blocks)中找到白名单中的 minter 地址:

```
{
  contracts(first: 2) {
    id
    mintWhitelisted
  }
}
```

获得所有购买的订阅过滤器有三个步骤:

1.  使用“创建新订阅”按钮添加新地址
2.  点击地址旁边的“ABI”按钮添加 ABI。在我的例子中,我只需要“购买”功能。

```
{
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_projectId",
        "type": "uint256"
      }
    ],
    "name": "purchase",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "_tokenId",
        "type": "uint256"
      }
    ],
    "stateMutability": "payable",
    "type": "function"
  }
```

1.  为`methodName`匹配`purchase`添加过滤器(确保不要使用全局过滤器)

最后,您的设置应该如下所示:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7389448333f16a1f633a3e537fcbc969.png)

为了存储这些数据,我创建了一个 ngrok/express 端点来存储在本地运行的 SQLite 数据库中。我已经创建了一个 [GitHub 模板,包含复制这个设置的步骤](https://github.com/andrewhong5297/blocknative_stream_to_sql)。这里要记住的最重要的一点可能是,在 Blocknative account 页面中将 POST 端点作为 webhook 添加时,您需要将它作为 ngrok URL 的一部分。

# 关键预处理功能

**多个交易哈希**

当您加速或取消一个事务时,原始的事务散列将被新的事务替换。这意味着,如果您想在整个生命周期中跟踪用户的事务,您需要将新的事务散列与原始事务散列进行协调。假设您将一个事务加速了五倍,您将总共有六个散列(原始散列+五个新散列)。我通过获得一个从`tx_hash`到新的`replaceHash`的字典映射来解决这个问题,然后递归替换。

```
replaceHashKeys = dict(zip(auctions["replaceHash"],auctions["tx_hash"])) #assign tx_hash based on replacements, just to keep consistency. 
replaceHashKeys.pop("none") #remove none keydef recursive_tx_search(key):
    if key in replaceHashKeys:
        return recursive_tx_search(replaceHashKeys[key])
    else:
        return keyauctions["tx_hash"] = auctions["tx_hash"].apply(lambda x: recursive_tx_search(x))
```

**区块编号问题**

被丢弃的事务的`blocknumber`为 0,所以为了处理这个问题,我用`timestamp`按升序对我的数据帧进行了排序,然后做了一个反向填充,这样 0 将被它被丢弃的正确的`blocknumber`所替换。这是对特征工程的重要修正。

```
auctions = auctions.sort_values(by="timestamp",ascending=True)
auctions["blocknumber"] = auctions["blocknumber"].replace(to_replace=0, method='bfill') #deal with dropped txs that show as blocknumber 0
```

**在主要拍卖期之外处理薄荷糖**

对于大多数项目,艺术家会在拍卖向公众开放之前铸造一些作品。有些项目不会马上销售一空,所以在拍卖开始几天后,你还会得到薄荷糖。我的分析集中在关键的拍卖时段,主要是前 30 分钟。为了去掉上面的两个薄荷案例,我基于`blocknumber`去除了异常值。

```
to_remove_indicies = []
for project in list(set(auctions["projectId"])):
    auction_spec = auctions[auctions["projectId"]==project]
    all_times = pd.Series(list(set(auction_spec.blocknumber)))
    to_remove_blocktimes = all_times[(np.abs(stats.zscore(all_times)) > 2.5)]
    if len(to_remove_blocktimes)==0:
        break
    to_remove_indicies.extend(auction_spec.index[auction_spec['blocknumber'].isin(to_remove_blocktimes)].tolist())
auctions.drop(index=to_remove_indicies, inplace=True)
```

**增加荷兰拍卖价格**

对于数据集中除项目 118 之外的所有项目,使用了荷兰拍卖价格格式。我使用一个 [dune 查询](https://dune.xyz/queries/113834)获取薄荷价格数据,然后将它合并到数据集上。在拍卖期间,我必须对有 mempool 操作但没有确认的块使用向前和向后填充。

```
auction_prices = pd.read_csv(r'artblock_auctions_analytics/datasets/dune_auction_prices.csv', index_col=0)
auctions = pd.merge(auctions,auction_prices, how="left", left_on=["projectId","blocknumber"],right_on=["projectId","blocknumber"])
auctions.sort_values(by=["projectId","blocknumber"], ascending=True, inplace=True)
auctions["price_eth"].fillna(method="ffill", inplace=True)
auctions["price_eth"].fillna(method="bfill", inplace=True)
```

# 每次拍卖的特征工程

如果你对技术方面的内容不感兴趣,只需阅读粗体部分,跳过其余部分。

在数据科学中,要素是从更大的数据集中计算出来的变量,用作某种模型或算法的输入。所有特征在`preprocess_auction`函数中计算,并在每个拍卖中计算*,而不是将所有拍卖组合成一个特征集。*

**第一组特性是交易状态的总和**,是一个简单的`pivot_table`函数:

*   `number_submitted`:提交交易总数
*   `cancel`:以取消结束的交易数
*   `failed`:以失败告终的交易计数
*   `dropped`:以丢弃结束的交易数
*   `confirmed`:已确认结束的交易数

我前面提到,由于各种问题,一些数据没有被捕获用于拍卖,这些交易从数据集中删除。

**下一组特征包括它们的气体行为。**这里的关键概念是捕捉他们的交易天然气与每区块平均确认天然气的距离(移动 1 个区块)。然后,我们可以为整个拍卖中汽油价格距离的平均值、中值和标准差创建特征。有一堆转置和索引重置来使`blocknumber`列按正确的顺序排列,但重要的函数是`fill_pending_values_gas`,它向前填充捕获的动作之间的汽油价格。这意味着,如果我在`blocknumber` 1000 使用 0.05 ETH 的 gas 放入一个事务,并且我的下一个操作直到`blocknumber` 1005 才加速到 0.1 ETH gas,那么这个函数将用 0.05 ETH 填充 1000-1005 之间的块。

```
def fill_pending_values_gas(x):
    first = x.first_valid_index()
    last = x.last_valid_index()
    x.loc[first:last] = x.loc[first:last].fillna(method="ffill")
    return x
```

**第三组功能是计算拍卖中采取行动的总数和频率。**这里,我们从每个块的总操作(加速)的枢纽开始,通过一些特殊的计算来获得每个事务的第一个挂起实例:

```
get_first_pending = df[df["status"]=="pending"] #first submitted 
get_first_pending = get_first_pending.drop_duplicates(subset=["tx_hash","status"], keep="first")
auctions_time_data = pd.concat([get_first_pending,df[df["status"]=="speedup"]], axis=0)
time_action = auctions_time_data.pivot_table(index=["sender","tx_hash"], columns="blocknumber",values="status",aggfunc="count") \
                    .reindex(set(df["blocknumber"]), axis=1, fill_value=np.nan)
```

从这里开始,我们分三步到达`average_action_delay`:

1.  我们计算每个块的动作数量(是的,有些人在同一个块中多次加速事务)
2.  我们丢弃没有动作的块,然后取剩余块号之间的差。我们为每个块采取的每个额外动作加 0。
3.  取差值和加零的平均值,得到`average_action_delay`

```
def get_actions_diff(row):
    row = row.dropna().reset_index()
    actions_diff_nominal =list(row["blocknumber"].diff(1).fillna(0))

    #take the blocks with muliple actions and subtract one, then sum up. 
    zeros_to_add = sum([ actions - 1 if actions > 1 else 0 for actions in row[row.columns[1]]])
    actions_diff_nominal.extend(list(np.zeros(int(zeros_to_add))))
    actions_diff = np.mean(actions_diff_nominal)
    if (actions_diff==0) and (zeros_to_add==0):
        return 2000 #meaning they never took another action
    else:
        return actions_diff
```

`total_actions`要简单得多,因为它只是整个枢轴上的动作的总和。

```
time_action["total_actions"] = time_action.iloc[:,:-1].sum(axis=1)
```

**最后一个与时间相关的特征是** `block_entry`,这是一个重要的特征,因为引入了荷兰式拍卖。从本质上来说,这跟踪了从一开始事务是在哪个块上提交的。

```
get_first_pending["block_entry"] =   get_first_pending["blocknumber"] - get_first_pending["blocknumber"].min()entry_pivot = get_first_pending.pivot_table(index="sender",values="block_entry",aggfunc="min")
```

`price_eth`也被添加为一个特性,它与`block_entry`点相关联。

**最后一组特征基于 Dune 查询,特别是自第一次交易以来的天数、交易中使用的总气体量以及交易总数。**为了获得正确格式的地址数组,在读入 SQL 数据后,我使用了下面一行代码:

```
all_users = list(set(auctions["sender"].apply(lambda x: x.replace('0x','\\x'))))
all_users_string = "('" + "'),('".join(all_users) + "')"
```

对此的 dune 查询相当简单。我把地址串粘贴在`VALUES`下,做了一些 cte 得到我想要的特性。在最后的`SELECT`中,我还试图添加每个地址的 en。你可以在这里找到查询:[https://dune.xyz/queries/96523](https://dune.xyz/queries/96523)

最后,我们只合并每个钱包的活动天数、总用气量和交易总数数据。

```
auctions_all_df = pd.merge(auctions_all_df,wh,on="sender",how="left")
auctions_all_df.set_index(["sender","ens"],inplace=True)
```

*完成所有这些后,我们终于准备好运行一些有趣的无监督学习算法,并尝试验证我们对用户组的假设。*

# 聚类和可视化用户组

在我开始这个项目之前,我期望看到以下用户组出现在数据中:

*   **定了就忘:**这里应该有两类人,一类人定了一个很高气的交易,一类人定了一个一般/低气的交易,然后剩下的拍卖都不碰。
*   **加速:**这里也应该有两类人,一类是经常加速并直接将交易更新为气价因素的人,另一类是经常加速但气价基本不变的人。

我对验证这些组非常感兴趣,看看每个组有多大,看看在许多拍卖过程中是否有用户在组之间移动。最简单的方法是使用无监督的机器学习,根据所有特征的可变性来识别用户组的聚类。从本质上讲,这就像观察一个州的收入分布,然后根据不同的收入集中程度、地理坐标和年龄将其分割成子分布。请注意,这不是宁滨,在那里分布被分割成相等的范围-而是基于整个范围内的观测密度来计算的。我们将采取的方法被称为“无监督的”,因为我们的数据集没有任何现有的标签,而不是像回归那样有一个预测值,可以被验证为正确或错误。

我决定使用的算法叫做 [k-means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) ,其中 k 代表你期望识别的聚类数。每个集群都有一个“质心”,就像一个圆心。有多种方法可以计算出多少个聚类是最优的,我使用的两种方法是肘点和轮廓分数。这两种提问方式都很奇特,

> *“每个额外的聚类是否有助于增加聚类的密度(计算为聚类中各点到质心的平均距离)并保持聚类之间足够的间隔(两个聚类之间没有重叠)?”*

我发现,在保持高轮廓分数(大约 0.55)的同时,3 个集群在大多数惯性改进方面是最佳的。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/67e744941b036029a4d57f4e53c709ed.png)

本次分析使用了 6 次拍卖

选择了集群之后,我们希望能够可视化并验证它们的存在。有超过 15 个变量,所以我们需要减少维数来绘制它。降维通常依赖于主成分分析或 t-SNE 算法,在我们的例子中,我选择了 t-SNE 算法。不要太担心理解这一部分,这些算法本质上捕捉所有特征的方差,以给我们 X 和 Y 分量,最大化点彼此之间的传播。

**让我们看看 8 月 4 日的项目 118,LeWitt 发电机发电机:**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0097fa728bfd0fe8d59941ba51eeff8a.png)![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5a2bb2578fa6450d44a408ffa59c7526.png)

这些是使用 KDE 计算的每个变量的聚类子分布。这些颜色与上面集群中的颜色相匹配。

在查看了每个变量的子分布和一些数据示例之后,我能够对集群进行分类。橙色集群是速度最快的一组,同时平均提交的天然气交易量也略低。蓝色和绿色簇表现出彼此相似的行为,但是蓝色簇中的地址通常比绿色簇中的地址具有更少的历史。

纵观全局,似乎最初关于“加速”和“设置高和设置低”分别产生两组的假设是错误的。相反,我们有一个“加速”组(橙色)和一个“一劳永逸”组(蓝色和绿色在行为上是一样的)。我认为“一劳永逸”组中的新钱包(蓝色)和旧钱包(绿色)可能在实际用户中有很多重叠,用户只是创建了新钱包来竞标更多的薄荷糖。基于他们的不耐烦和低于平均水平的油价,“加速”群体在我看来要么是缺乏经验,要么是比其他用户更贪婪。*令我惊讶的是,提速组在所有投标人中所占的比例更小,因为我原本预计提速组将占投标人的 60-70 %,而不是 30%。*

**现在,这项用户行为研究真正有趣的地方是将项目 118(设定价格为 0.75 ETH)与项目 140(荷兰拍卖,价格从 1.559 ETH 降至 159 ETH)进行比较。**

**这是项目 140 的分组,8 月 21 日的良好振动:**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c39af091c6243b83fbd0f41916b71770.png)![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e64e4bed3b119a4a7d322a394544237e.png)

我们可以看到,现在大多数聚类可变性来自于`block_entry`、`price_eth`和所有的`gas_behavior`特征。这与项目 118 的主要变量有很大的不同。在 118 中,设定价格意味着人们以相当均匀的分布进入拍卖(剩下的数量似乎并不重要),而“加速”组则无休止地采取行动——可能非常焦虑。

在项目 140 中,我们在`average_action_delay`或`total_actions`中没有看到相同的行动差异,相反,我们看到可能是同一个“加速”组在很晚的阶段进入区块,并设定远低于平均水平的天然气价格,如在`average_gas_behavior`中所见。绿色集群可能代表比橙色集群更有经验的用户,但是他们的行为仍然在橙色和蓝色之间转换。如果我试着将这一点映射到 118 中的集群,我相信“加速”组现在是“贪婪”组(橙色),它进入较晚,出价较低。“一劳永逸”的群体很好地映射到“早抢”群体(绿色和蓝色),他们都表现出很好的耐心和足够的天然气投标安全网。

我称 Orange group 为“贪婪”不仅仅是因为他们的行为,还因为他们的交易失败率。

对于项目 118,失败率属于“加速”组,而“一劳永逸”组的失败率在 10-15%以内。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a1ef99ed645ccea5338889aef0edb16a.png)

percent_lost takes(取消+放弃+失败)/ number_submitted

对于项目 140,“贪婪”集群的失败率约为 69%,而“早期抢占”集群的失败率约为 5-15%。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/08d293811b2f14848aeda5393f55a176.png)

总的来说,我对此的理解是,这个群体的坏习惯被放大了——在我看来,我们在焦虑→贪婪之间做了权衡。这可能使拍卖压力较小,但最终导致更多用户感到不安(由于失败的薄荷糖)。

*我确信可以进行更细致的分析,根据工厂/策划/游乐场或艺术家本身进一步细分拍卖。随着社区的不断发展,这只会变得更加有趣和复杂,情绪在单次拍卖和未来的拍卖中都会发挥更大的作用。*

*这项对多个拍卖的研究帮助我们验证了我们的假设,了解了用户群的比例,并了解了用户的好或坏行为是如何随着时间(和其他参数)而变化的。现在我们需要将它插入到产品周期流程的其余部分。*

# 我们将何去何从:

我选择 Artblocks 拍卖而不是混合平台的原因是因为我想寻找一个界面和项目类型的可变性最受控制的地方。这应该给了我们相当一致的用户和行为类型。

这只是 UX 研究周期的开始,所以理想情况下,我们可以继续以下步骤:

1.  使用无监督的机器学习算法来识别用户群(集群),并查看有多少人在进入拍卖时犯了“错误”。*这是我们今天讨论的步骤。*
2.  创建一个新的用户界面,例如竞价屏幕上的[直方图视图,或者显示大多数人通常何时进入/拥挤拍卖以及价格的历史数据。向用户提供当前和历史背景的任何东西,尤其是那些来自速度集群的用户。](https://twitter.com/andrewhong5297/status/1423020670825504768)
3.  对于每次拍卖,通过创建的算法运行内存池/钱包数据,以查看用户组是否发生了变化,以及特定用户是否“学会”以不同的方式参与拍卖(即,他们是否在用户组之间移动)。*我认为,如果做得好,这一步可以发现最大的价值。使用 ENS 或其他标识符来帮助补充这一分组也将有极大的帮助*
4.  根据结果,继续迭代用户界面和设计。您还可以运行更明智的 A/B 测试,因为您甚至可以根据用户的最后一个集群(或者对新用户使用标签传播)做出有根据的猜测,从而确定要显示哪些屏幕。

**荷兰拍卖式的变化也是第二步的一个例子,我们能够看到用户行为的明显转变。**虽然这种 A/B 测试通常侧重于提高参与度或转化率,但我们在这里针对用户的学习和改进能力进行了优化。如果在多平台环境中迭代,这可能会变得更加健壮,这样我们就可以在生态系统级别上研究某人是如何学习的(甚至可以用兔子数据和用户简档进行补充)。由于我的 Artblocks 用户研究都是基于公开来源的数据,它可以被任何其他拍卖/销售平台复制和补充。 **Crypto 可能是第一个拥有同步透明的用户组和 UX 研究的行业,应用于产品和学术界。** Nansen wallet 标签已经向这一目标迈进了一步,但当来自不同产品的团队从不同方面和方法建立这一目标时,情况就不同了。

我最终的设想是使用数据建立以下用户角色(其中包含子组/级别):

*   我想买一辆 Fidenza,所以我可以通过私人销售购买,自己在拍卖会上出价,在 prtyDAO 竞价拍卖中出价,或者用 [fractional.art](https://fractional.art/) 购买其中的一小部分
*   总的来说,我喜欢 Fidenza,所以我会买 NFTX Fidenza 索引令牌或在 [fractional.art](https://fractional.art/) 策划的一篮子 NFT 艺术作品
*   我已经是一名收藏家了,所以我想用我已经拥有的一套精选的 NFT 和 ERC20s 交换或竞标 Fidenza(使用 genie-xyz 交换)。
*   我喜欢通过最初的造币厂和二级市场购买的热潮,并大量参与像 Artblocks live mints 这样的拍卖。

我希望你觉得这个项目有趣和/或有帮助,我从中获得了很多乐趣。感谢 Blocknative 的人们为我牵线搭桥,感谢 Artblocks 的社区回答了我的许多拍卖问题。和往常一样,如果你有任何问题或想法,请随时联系我们!

你可以在这里找到包含所有数据和脚本的 GitHub repo。这个脚本可能有点难读,因为我还在重构和清理它。当我分析八月的最后几次拍卖的新模式时,这里的脚本和一些分析可能会更新。

*本帖首次发表于*[*ath . mirror . XYZ*](https://ath.mirror.xyz/l_-4fQ08cpxUZpn9V9S5R27wfKvNgdnrXlZAWZWvdlg)*,请务必订阅并关注我的*[*Twitter*](https://twitter.com/andrewhong5297)*以获取我的最新加密和数据科学内容。*

# 数据科学环境

> 原文:<https://towardsdatascience.com/data-science-environments-adfeb5dadd7a?source=collection_archive---------25----------------------->

## 你的编程问题背后的黑暗秘密

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9a244423372486886656fca77d69d10b.png)

作者照片

在学习数据科学时,环境管理一直是我的眼中钉。无论是让以前运行的代码再次工作,还是尝试与团队的其他成员共享我构建的应用程序,或者想知道为什么我的命令提示符不再工作,我都只是在低声咒骂的同时学习了编程管理。为了避免熬夜和头痛,这里对什么是程序环境以及数据科学家如何让程序环境为他们工作而不是反对他们进行了分析。

# **定义**

程序环境是程序运行的软件和硬件的集合。这样的句子可能有点令人生畏,但概念相当简单。如果你试图在一台旧电脑上运行一款计算密集型视频游戏,这台电脑的硬件可能无法处理这款游戏。每次尝试玩游戏时,运行速度可能会非常慢,甚至会崩溃。视频游戏是为具有更复杂硬件的程序环境而设计的。或者,任何 Python 或 R 程序员都知道,必须先安装一个包,然后才能加载它。当您安装这个包时,您将它添加到 Python / R 解释器的软件环境中,这样它就可以在您想要使用它的时候加载代码。对于数据科学家来说,软件环境问题远比硬件问题更常见。

> 一个程序的软件环境只是程序可以“看到”的文件的集合

一个程序的软件环境只是程序可以“看到”的文件的集合当您安装一个包时,您从一个公共位置下载文件,并且您将这些文件保存在您的计算机上 Python / R 代码知道要查看的位置。当某些代码具有“依赖性”时,这意味着它需要您将依赖的代码从这些包文件加载到环境中,以便可以利用它。

# **常见问题及其解决方案**

软件环境中最令人沮丧的例子之一是路径变量。如果要从命令行运行 Python,需要在操作系统的 PATH 变量中指定要运行的 Python 版本。当您将 python 添加到 PATH 变量中时,您只是告诉您的计算机 Python 解释器可执行文件的位置。如果您没有将这个位置添加到 PATH 变量中,那么当您告诉它运行时,您的计算机将找不到 python 解释器。这将导致“‘python’未被识别为内部或外部命令”错误。或者,如果您的 PATH 变量上有多个 python 解释器(如 Python 3.8 和 Python 3.9),那么它每次都会选择一个特定的版本(基于一组依赖于您的操作系统的规则),而它可能不是您期望的版本。

数据科学项目管理的第二个最令人沮丧的问题回到了包依赖上。当您与他人共享您的代码时,他们的环境中安装的包可能与您自己的环境中安装的包不同。如果您的代码依赖于他们没有的特定包,这可能是一个问题。解决这个问题的方法是用一个“包管理器”(如 CRAN、PIP 或 Conda)来分发您的代码,它将确保有人在下载您的包时,在他们的环境中有他们需要的确切的包来运行您的代码。

为了进一步解决这个问题,如果您有一个旧的数据分析需要一个版本的包,而另一个分析使用该包的新版本,会发生什么呢?为了保持数据分析的可重复性,您需要知道您运行的代码在每次运行时都会做同样的事情。随着包的不断开发,它们有时会改变行为,这可能会导致您在使用包的最新版本运行旧数据分析时获得意外的结果。

为了解决这个问题,你可以使用一个“环境管理器”,它可以保存不同的编程环境,并在每个环境中安装不同的包。然后,您可以指定哪个环境是运行数据分析的正确环境。最流行的包/环境管理器之一是 Conda(由 Anaconda 公司维护)。在他们出现之前,用 Python 进行数据科学的环境管理是相当令人沮丧的。

## 环境经理的神奇秘诀是什么?

再次澄清一下,编程环境就是程序可以访问的文件的集合。如果您需要一个安装了软件包版本 1 的环境和另一个安装了版本 2 的环境,那么环境管理器需要确保软件包的两个版本都安装在您计算机上的某个地方,然后它将只让软件包的正确版本对在每个环境中运行的代码可见。当您的代码告诉它的环境加载一个包时,导入的文件将是对应于该特定环境可见的包版本的文件。每个环境应该只有一个对它可见包版本。

# **虚拟机**

环境管理器对于虚拟机的概念至关重要。虚拟机(VM)可以被认为是计算机内部的一台计算机(初始风格)。与这里提到的所有东西一样,虚拟机只是一种文件管理方法。虚拟机是一个程序,它将自己与计算机上的所有其他文件隔离开来;它甚至可以运行不同的操作系统。(例如,MacOS 计算机可能有一个运行 Windows 操作系统的虚拟机。)

当您想要在另一台计算机上重新创建一个编程环境时,虚拟机是非常有效的,因为您不需要了解该计算机当前的依赖关系。您可以设置一个虚拟机,使其拥有您自己计算机的虚拟机上的可见文件。由于这个原因,数据科学大量使用虚拟机;它们确保结果的重现性。基于云的应用程序是虚拟机的另一个常见示例。开发人员认为他们的虚拟机将与托管他们应用程序的服务器上的任何其他代码隔离开来。

要指定应该如何配置虚拟机的环境,您可以使用一个配置文件(使用 Conda 时为. yml 文件),该文件指定在设置虚拟机时要在虚拟机中安装的所有软件包。现在,当您共享一个数据分析时,通常会共享“配置”文件,该文件设置了运行代码的环境以及代码本身。

# **集装箱/码头工人**

将生产应用程序部署到云中时,可能会花费大量时间来创建环境配置,然后在各种服务器计算机上设置它们。为了简化这一点,容器诞生了。创建容器的公司 Docker 仍然是今天部署容器的最受欢迎的选择,所以您会经常在这里互换使用术语 Docker 和 container(有点像面巾纸和纸巾)。

容器很像虚拟机,但是它们少了一层。每个虚拟机都有自己的操作系统,就像一台真正独立的计算机一样工作。容器与除了操作系统之外的一切都是隔离的,这使得它们更加“轻量级”(体积更小,因为与 VM 相比,每个容器中的代码更少)。容器也可以由运行在操作系统之上的一个程序(Docker 引擎)来协调,这允许开发人员以非常分散的块来构建一个协调在一起的应用程序,而不是一个必须处理许多不同任务的大型应用程序。这就像当每一个突击队员的恐龙同步进入一个超级恐龙,终极战斗机器。Docker 的网站有很多很棒的材料来进一步概述容器的区别和好处。

# **那么这对你来说意味着什么?**

作为数据科学家,要使用所有这些信息,您应该:

1.清理路径变量。谷歌如何做到这一点。不过,要小心你从中删除的内容。它*会*回来缠着你。

2.充分利用 Anaconda 这样的环境管理器。在协作时,您和您的团队应该使用相同的环境。有一个大家共享的标准配置文件。

3.将您的代码转换成具有依赖关系的包。即使您在 Github 上共享这些内容,而不将它们提交给包管理器,当您开始一个新的分析或通过包共享代码时,这也将使事情变得简单得多。甚至仪表盘都可以变成包。

4.如果你在云中运行你的代码,欣赏虚拟机(甚至容器)为你做的工作。

# 结论

理解数据科学环境迫使数据分析师走出他们的舒适区,比许多人希望的更深入地研究软件工程原理。然而,这是一个必须面对的邪恶,因为这样做将极大地提高您共享代码的能力,并节省您花费在调试上的时间。幸运的是,对于数据科学家来说,这些概念实际上非常熟悉;都是文件管理而已。

# 政府中的数据科学实验

> 原文:<https://towardsdatascience.com/data-science-experiments-in-government-f61c692e2ac3?source=collection_archive---------21----------------------->

## [社区聚焦](https://towardsdatascience.com/tagged/community-spotlight)

## 德国卫生部塑造数据基础设施和立法

*在 Community Spotlight 系列中,TDS 编辑与数据科学社区成员畅谈有助于推动该领域发展的激动人心的计划。今天,我们很高兴地分享*[*Elliot Gunn*](https://medium.com/u/aad1101621dd?source=post_page-----f61c692e2ac3--------------------------------)*与*[*Lars Roem held*](https://medium.com/u/ea4059de5473?source=post_page-----f61c692e2ac3--------------------------------)*,* ***艾主任&数据*** *在* [***健康创新中心***](https://hih-2025.de/en/home/) ,*德国卫生部的一个数字化工作队的对话*

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/48da8234983afee2e857a8698a4c1851.png)

hih 团队,与德国卫生部长 Jens Spahn(中)。拉斯·罗姆赫德从右数第三。(图片由 hih 提供)

Lars Roemheld 是德国卫生部数字化工作小组的 AI 数据主任。他之前在人工智能专家 QuantCo 担任高级职位,在那里他使用机器学习为美国和欧洲的金融、零售和医疗保健组织开发反欺诈和定价解决方案。作为一名数据科学家和哲学家,他拥有斯坦福大学和海德堡大学的学位。Lars Roemheld 是因果推理、机器学习以及越来越多的政府奇妙运作方面的专家。你可以在[*Twitter*](https://twitter.com/LarsRoemheld)*和*[*Medium*](https://medium.com/@lars.roemheld)*上关注他。*

健康创新中心(hih)有一个有趣的使命陈述:“hih 是联邦卫生部的智囊团、陪练和实施支持者。”您能分享更多关于数据科学团队在 hih 的工作吗?它在哪些方面充当“陪练”?

健康创新中心(hih)是作为政府的一项实验而创建的:为了创建一个“数字任务组”,卫生部在 2019 年创建了一个小型专家小组,他们全职为该部工作,但也作为一个独立的智库。这种设置被证明是有效的:设计为一个有时间限制的项目,并提供市场价格补偿,hih 将一个多元化的专业团体聚集在一起进行“政策工作”。

在过去的几年里,与该部合作的特点是灵活的距离——我们的办公室距离该部只有两个街区,并且有更多的创业氛围。有时,这意味着我们要和部里的同事日夜坐在一起。其他时候,我们能够在政府规范之外保持一种更加“自由思考”的氛围。

在数据科学领域,我们的工作大致分为三类:政策支持、决策者教育和动手项目。医疗保健中的人工智能是一个令人兴奋的领域。但由于它相对较新,政府对其技术的深入理解仍然相对匮乏。我们围绕数据访问和数据共享、数据标准的互操作性、医疗设备测试、责任和公平等主题,帮助形成思维和立法。

真正让 hih 的工作与众不同的是跨职能、跨学科的团队:我们汇集了医生、药剂师、IT 经理、记者、数据科学家、律师和经济学家。创建具有如此不同的现实世界背景的项目舱,使我们能够迅速提出务实的解决方案,这对于任何一个单独的学科来说都是很难看到的。

政府智囊团如何识别有前途的项目?与一个独立的智库相比,当一个智库嵌入政府内部时,它所能完成的事情有什么独特之处吗?

被安排在部里对我们来说完全不同:我们不是一个游说组织,我们的产出不以政策文件来衡量。相反,我们能够直接支持该部同事的工作。

政府往往以令人震惊的孤立方式工作:即使在同一个部里,一个部门往往不知道另一个部门在做什么。作为这些结构中的局外人,我们有幸“天真地”跳过了许多规范,并跨职能将人们联系起来。

**你认为哪些与健康相关的项目最好由像 hih 这样的政府机构来解决,而不是由 AI 和 DS 中的营利性机构来解决?**

深度技术工作的实际工作可能最好留给行业专业人士去做。然而,在医疗保健和其他领域,这些专业人员需要基础设施来做好他们的工作。政府必须发挥作用,以公平和安全的方式提供这种基础设施。一些例子:

*   允许获得代表性的培训,尤其是测试数据,同时保护公民的隐私权。这通常比仅仅在互联网上发布一个 csv 文件要复杂得多:匿名化、联合学习和基于查询的系统是所使用的一些方法。有一天,我们可能会看到对测试数据代表性的定量检查。
*   尤其是基于深度学习的医疗应用,往往带有一定的黑箱味道。作为负责保护患者免受医疗事故(数字或其他形式)的监管机构,如何决定哪些算法可以进入医疗设备市场,哪些不可以并不简单。我们需要对医疗人工智能的安全和负责任的发展提出可靠的要求,以遏制夸张的营销主张。相反,可信的需求可以帮助遵从的软件制造商解决来自已建立的医疗保健世界的怀疑。
*   几乎在任何地方,准政府机构都设计了强制“报销”的经济体系——谁在医疗保健中得到多少钱,以及什么服务和产品。这在本质上是困难的,因为支付者(保险)通常不同于消费者(病人),而且激励可能是不一致的。这并不新鲜;但新一代人工智能医疗设备为节约成本和减少浪费带来了新的机遇和挑战。

我认为在医疗保健领域实施 ML 项目是一项具有挑战性的工作。hih 是否与其他利益相关者合作?它是如何自我扩展的?

作为我们使命宣言的一部分,我们与广泛的合作伙伴合作:从政府机构到创业公司和学术界。

在高层次上,我不认为联邦政策有伸缩性的问题——为立法的细节贡献好的想法可以让想法在全国范围内快速“伸缩”。也就是说,立法过程有时会让人感觉缓慢。但总的来说,我很惊讶在过去的四年里,由于正确的领导,部里有多少“灵活的立法”是可能的。

**你能告诉我们团队特别引以为豪的一个项目吗?**

我想强调三个非常不同的项目:

1.德国去年为医疗保险公司报销的数字医疗应用创建了首个快速通道。超过 24 种所谓的“地高辛”现在可以由德国各地的医生开出,下载到智能手机上,并由保险公司支付。从数据隐私到患者安全和成本,hih 团队帮助克服了法律和实践挑战。

2.新冠肺炎对车队来说是一个特殊的,当然也是意想不到的挑战。很早以前,我们邀请了一群学者和软件制造商来集思广益,寻找潜在的数字解决方案。从这个群体中,诞生了使用蓝牙进行联系追踪的想法。从概念验证开始,我们在 Corona-Warn-App (CWA)项目的整个开发过程中为其提供支持。最终,德国的 CWA 成为全球首批具有隐私意识的联系人追踪应用之一,作为政府开源项目发布;所有可用的证据表明,该应用程序有助于减缓新冠肺炎感染。

3.德国的公共医疗保险系统为大约 7500 万患者提供服务。这使得德国医疗保健索赔数据集成为世界上最大和最具代表性的数据集之一。从明年开始,该数据集将通过所谓的“Forschungsdatenzentrum”提供给学术研究,这实际上是 BfArM 大学的一个基于查询的系统。

你喜欢什么样的 DS/ML 写作,你更希望看到什么?

我喜欢有“真实”感觉的报告——太多的博客文章从 Kaggle 风格的干净数据开始,没有历史或“数据生成过程”真正的数据科学不是这样工作的:有人在创建数据,你有测量误差,如果你非常仔细地看,你仍然可以看到实习生在 2016 年意外删除的那些行。我认为真正优秀的项目能够很好地理解现实世界,并能够将其映射到正确的数据科学工具。我经常发现,一个理由充分的损失函数选择,或者一个聪明的数据选择模式,或者一个现成的迁移学习想法,比如何实现最后 3%的准确率更有见地。

**你对未来几个月或几年的 DS/ML 社区有什么希望?**

我希望围绕技术的炒作会减少,对数据生成过程的同情会增加。这是否意味着理解医院的医生、护士和流程,或者财务数据中的偏见,或者照片数据库中的虚假陈述。就我个人而言,我对因果推理领域非常感兴趣:部分原因是因为想法、技术和应用。但也许更重要的是,因为因果世界观迫使我们作为数据科学家首先考虑我们试图解决的确切问题。

想在健康创新中心了解更多关于数据科学的知识吗?在 [LinkedIn](https://www.linkedin.com/company/health-innovation-hub/) 、 [Twitter](https://twitter.com/hih2025) 和 [YouTube](https://www.youtube.com/channel/UC7biqAPHlOdh24GcLKifUkw) 上关注他们。这里有其他文章分享了利用机器学习造福社会的项目案例研究。

*   "[自然中的因果推理:弹性定价](/causal-inference-example-elasticity-de4a3e2e621b)"(2021 年 7 月,TDS): Lars Roemheld 介绍了一个如何在行业中使用因果推理的例子,应用于真实世界的数据集。
*   [为什么新冠肺炎危机可能会给医疗保健系统带来一线希望](https://hih-2025.de/en/why-the-covid-19-crisis-may-have-a-silver-lining-for-the-health-care-system/)(hih):hih 团队分享了一个案例研究,即德国联邦当局如何与一家初创公司合作,启动一项基于人群的研究项目,以应对新冠肺炎病毒。

# 未来数据科学的重点领域

> 原文:<https://towardsdatascience.com/data-science-focus-areas-for-the-future-5ae43ced5cd7?source=collection_archive---------14----------------------->

## 把你的宝贵时间花在哪里,以保持受欢迎

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/645e424518677bd83267a617ea36bf3d.png)

保罗·斯科鲁普斯卡斯在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

最终,我们现在所知的数据科学家头衔将会消失,拥有专业知识或技能将使你有资格获得工作,并使你与众不同。根据你的兴趣或你想在哪里工作,把你的宝贵时间花在以下一个(或两个)领域表明你有学习的意愿,并且会适合你的时间表。我描述的重点领域是我认为数据科学将分成的四大领域。话虽如此,通读描述,并问自己每一部分的问题,看看它是否是一个很好的适合。

## 计量经济学和预测

长期以来,基于历史趋势的预测一直是开展业务的重要组成部分。无论是使用季节平均值还是行业知识,预测未来总是有许多应用的用例。数据科学家有很好的人才组合,他们符合符合预测模型的要求,但他们并不总是拥有有效沟通他们在经济和金融方面的结果的教育背景。

要想知道这个领域是否适合你,问自己以下问题:

*   我喜欢讨论市场的当前和未来状态吗?
*   我想测试假设来显示是什么推动了销售或消费吗?
*   我对经济学有学术兴趣吗?
*   我喜欢时间序列和预测问题吗?
*   我喜欢为其他人解释模型和特性的影响吗?

如果你对这些问题中的一个或多个回答“是”,考虑学习计量经济学和金融学。如果你没有经济学的教育背景,可以试试看大学教材的老版本(省$吧)。你的回归训练会给你一个良好的基础。

## 计算机视觉和自然语言处理(NLP)

从对象检测到语音识别,数据科学家已经成为支持公司在这些领域需求的人才。虽然几乎每个人都对计算机视觉和 NLP 感兴趣,但精通这一领域是专业的,需要一些额外的训练和努力。

要想知道这个领域是否适合你,问问自己:

*   我想知道计算机是如何解读图像的吗?
*   我对用于对象检测的前沿模型架构感兴趣吗?
*   我想知道各种层类型(密集连接、嵌入式、递归)在神经网络中是如何工作的吗?
*   我想看自然语言处理白皮书吗?
*   我是否投入大量时间做研究、继续教育和自学?

如果你对这些问题中的一个或多个回答“是”,考虑追求计算机视觉和自然语言处理。机器学习、计算机视觉和 NLP 的培训前景丰富多样(书籍和在线课程)。

## 工程和 MLOPs

随着更多适合的模型开始投入生产,部署和维护模型的知识缺口出现了。一个 100%准确的模型只存在于你的机器上,它的有用性接近 0%。对于许多当前的数据科学家来说,ETL(提取、转换和加载)和 ML 功能与需求的打包是一个灰色区域,并不总是包含在培训计划中。Auto-ML 功能增加了设计用于消费的有用模型被考虑用于生产的频率。在我看来,这是一个重点领域,将成为最有利可图的工作和薪酬。

要想知道这个领域是否适合你,问自己以下问题:

*   我想为其他数据科学家管理模型的部署吗?
*   我需要 Docker 或 Kubernetes 的专业知识吗?
*   ETL 和数据存储是我感兴趣的话题吗?
*   我想和软件工程师和 web 开发人员紧密合作吗?
*   我想成为预测传递和消费的专家吗?

如果您对这些问题中的一个或多个回答“是”,请考虑参加 MLOPS。我会开始学习数据工程和软件工程的最佳实践。

## 主题专业知识和产品管理

嵌入某个产品或业务领域的数据科学家最终会学到很多关于这些领域的知识。公司内部有些职位需要数据科学家,但实际上是能够利用数据做更多事情的分析师。为了增加你在这一领域的价值,擅长管理业务领域的数据科学方面并表现得像一个产品经理可能会对你有所帮助。这样,您不仅仅可以执行计划中的任务,这些任务可能是也可能不是数据科学任务。

要想知道这个领域是否适合你,问问自己:

*   我想了解业务流程、产品或服务的一切吗?
*   我有兴趣拥有一个带有机器学习或人工智能组件的产品吗?
*   我想对开发、构建和部署产品所需的资源负责吗?
*   我是否有兴趣确保高级分析和机器学习输出与业务级别 KPI 和目标保持一致?

如果你对这些问题中的一个或多个回答“是”,考虑从事产品管理,花更多的时间了解你当前组织的产品或流程。

## 结论

如果你有这样的天赋和时间,请享受成为一名全能大师的乐趣。虽然有些人有能力做到这一点,但其他人可能会考虑将他们的时间集中在上述重点领域之一。我相信这样做会让你为一个需要具备更多特定技能的数据科学家的就业市场做好准备。

# 广告细分市场的数据科学:超越相似建模

> 原文:<https://towardsdatascience.com/data-science-for-ad-segments-moving-beyond-look-alike-modeling-fc0b97ed8bb6?source=collection_archive---------4----------------------->

## *分段分类、转换预测和隆起建模*

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/29fcd0d525fc50fd78738e74e179bfb2.png)

图片由 [Chuttersnap](https://unsplash.com/@chuttersnap) 在 [Unsplash](https://unsplash.com/)

外观相似的建模是最流行的方法之一,用于扩大广告片段的大小,以增加广告客户的覆盖范围。[脸书于 2013 年在其平台上引入了外观相似建模](https://www.adweek.com/performance-marketing/lookalike-audiences/),一些广告技术提供商在其产品中提供了外观相似建模版本。然而,正如我们将在本帖中展示的,看起来相似的模型在实践中经常导致脆弱和不准确的片段。各种其他机器学习(ML)方法——包括分类和提升——几乎总是比看起来相似的模型产生更好的性能。由于这些限制,我们认为只有在其他技术不可用的情况下,才应该谨慎使用 Look Alikes。

**什么是长相相似的细分市场?**

顾名思义,相似模型的目标是找到与一组已知用户“看起来”相似的受众。创建一个基本的外观相似的片段通常需要指定两条信息-

*   **种子集:**长相相似的受众应该基于哪一组用户?
*   **细分规模:**受众应该有多大?更大的受众意味着更广泛的影响,但与你的种子集的总体相似性更小。

例如,广告客户可以使用 1,000 个已知房主的集合(种子集合)来建立与这些房主相似的 50,000 个外观相似(细分规模)的受众。

**相似模型的局限性**

外观相似建模因其简单性和可用性而广受欢迎,但它也带来了严重的限制,往往会阻碍广告的表现。

从技术角度来看,外观相似建模通常是通过一种被称为 [PU 学习](https://en.wikipedia.org/wiki/One-class_classification)的[半监督](https://en.wikipedia.org/wiki/Semi-supervised_learning) ML 方法来完成的。这意味着,使用关于种子集(即*正* *集*)中用户的信息来学习相似模型,而不考虑属于种子集*不*的用户(*负* *标签*)。

这有助于使看起来相似的模型易于使用——所有人需要的是一个积极标签的种子集,以建立一个细分市场。但这也意味着,如果你不注意如何定义你的细分市场,看起来相似的模型容易产生偏见。具体来说,外观相似模型将搜索种子集中用户共享的任何特征,即使该特征不是该集合的唯一特征。

为了说明,让我们考虑一个例子。假设一家商业银行刚刚推出了一款新的商业贷款产品,并希望在我们的网站上向一万名小企业主(SBO)做广告。这是我们掌握的数据-

*   该网站有 100 万活跃用户
*   在这 100 万用户中,有 10 万人注册了个人资料,并在注册时指定了自己的职位
*   在这 10 万用户中,有 2000 人表示他们是小企业主(SBO)

我们的目标是使用这 2k 个 SBO 的种子集来构建一个看起来相似的模型,该模型(a)分析种子集的现场行为模式,以及(b)找到 8k 个其他相似的用户。但问题是——小企业所有权并不是种子用户共享的唯一特征;他们也都是注册用户。由于注册用户的行为可能与未注册用户非常不同,我们的模型可能会抓住这一差异,并预测完全由注册用户组成的相似受众,无论他们是否是小企业主。

这种类型的错误在涉及外观相似建模的实际场景中很常见——模型会找到种子集共有的特征,但与我们想要实现的目标无关。ML 指标可能显示出很强的培训绩效,但活动在现实世界中表现不佳。

其他基于 ML 的方法有助于规避外观相似建模的这些限制,从而带来更好的活动结果。这些方法包括分类、转换预测和提升,我们将在本文的剩余部分进行介绍。

**备选方案 1:分类**

[分类](https://en.wikipedia.org/wiki/Binary_classification#:~:text=Binary%20classification%20is%20the%20task,basis%20of%20a%20classification%20rule.)是一种常见的机器学习类型,它试图划分两组数据:正集和负集。应用于广告环境,分类类似于 Look Alike,因为其目标是预测哪些用户类似于种子细分。但是通过学习关于在那个片段中谁*是*和谁*不是*的信息,分类通常会导致更好的结果。

让我们回到上面的例子,涉及一家银行向 SBOs 做广告。外观相似建模是不够的,因为我们的种子集包含了注册用户形式的隐藏特征。这一特性被证明是统一种子集行为的主导因素,因此与小企业所有权相关的微弱信号被忽略了。

假设我们使用一个分类模型-

*   **正集:**职务等同于“小企业主”的注册用户
*   **否定集:**职称不等于“小企业主”的注册用户

通过包含我们知道不是 SBO 的其他注册用户的信息,我们迫使模型根据相关因素区分用户:他们可能是小企业主吗?这两个集合都包含注册用户,因此模型不能简单地依赖于注册用户与未注册用户的行为来划分这两个群体。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/82a4b42ceac6941bd4bc5f4169ae8aea.png)

作者图片

**备选方案#2:转换预测**

分类可以帮助提高你的广告片段的质量,但它们仍然有改进的空间。特别地,广告的目标通常是驱动特定的用户行为,这是基于用户特征的分类模型不能直接优化的。行为预测有助于解决这一差距,使您能够针对最有可能采取特定行动的用户开展活动,例如参与广告,或进一步降低销售漏斗。鉴于近年来点击付费和转化付费广告的兴起,这种策略尤其有效。

为了真实地描述这些预测,让我们假设商业银行现在想要运行一个针对点击优化的新广告,以便收集销售线索。对于那些有兴趣点击广告的人来说,一部分可能的 SBO 可能是一个不错的代理,但它并不完美——不可避免地会有一些 SBO 不在贷款市场上,而其他人目前不是 SBO,但正在考虑创业,可能有兴趣了解更多关于银行贷款产品的信息。直接预测哪些用户可能会点击广告可以帮助回避这些问题。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/dc0d8cced9ba909dea064c5acfd43606.png)

作者图片

**备选方案#3:隆起预测**

如果银行的最终目标是影响下游客户的行为,而不是简单地推动点击量,[提升](https://marketingtechnews.net/news/2021/jan/27/its-time-to-stop-wasting-marketing-spend-and-start-using-uplift-models/)预测可能会更有效。提升建模旨在预测每个客户可能会对特定的干预(例如,有针对性的广告)做出何种反应。即使在可能点击的用户中,广告的效果(就获得贷款的可能性而言)也可能因不同用户而异。对一些人来说,广告可能会说服他们购买。对其他人来说,这可能没有影响。其他人可能会对银行及其产品留下更坏的印象,并且将来不太可能贷款。提升可以帮助识别这些群组,以确保广告只针对那些它将帮助推动增量交易的用户。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6bfd91316f8a9e718c4cf87d84532704.png)

作者图片

**结论**

第三方 cookies 的消亡预示着企业必须充分利用第三方数据的力量。幸运的是,广告技术行业继续经历大量与数据相关的创新。特别是,机器学习技术帮助广告商创建了比以往任何时候都更有针对性、覆盖面更广的广告活动。大多数企业现在都熟悉外观相似建模,但在实践中,其他 ML 技术往往会产生更好的结果。通过将更先进的 ML 技术与独特的第一方数据相结合,组织能够提供真正与众不同的优质广告产品。

# 区块链的数据科学:了解当前形势

> 原文:<https://towardsdatascience.com/data-science-for-blockchain-understanding-the-current-landscape-c136154c367e?source=collection_archive---------2----------------------->

## 数据科学和区块链技术是天生的一对。但是到底有多少和什么样的真实世界的应用程序呢?

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7804030971b654df4bdeccce5eb17d97.png)

在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上由[zdenk macha ek](https://unsplash.com/@zmachacek?utm_source=medium&utm_medium=referral)拍摄的照片

B 锁链技术是当今的热门话题,尤其是随着最近[去中心化金融](https://en.wikipedia.org/wiki/Decentralized_finance)的繁荣,比特币和其他加密货币的指数增长,以及正在进行的 [NFT](https://en.wikipedia.org/wiki/Non-fungible_token) 热潮。从数据科学家的角度来看,区块链也是一个令人兴奋的高质量数据来源,可用于使用统计和机器学习来解决各种有趣的问题。但这些问题到底是什么?区块链行业是否有足够的需求来培养数据科学家?本文试图回答这些问题,对数据科学和区块链技术的交叉领域的现状和趋势进行了全面的概述。

*免责声明*:我既不附属于也不支持本文提及的任何公司。提及这些公司及其产品仅用于说明目的。

# 首先是术语

术语“*数据科学*”没有普遍接受的定义。在这里,我将坚持我最喜欢的[定义](https://hackernoon.com/what-on-earth-is-data-science-eb1237d8cb37),它是由 [Cassie Kozyrkov](https://medium.com/u/2fccb851bb5e?source=post_page-----c136154c367e--------------------------------) (谷歌决策情报主管)提出的:

> "数据科学是让数据变得有用的学科."

这是一个包罗万象的定义,因此对数据科学的实践方式进行更详细的划分会有所帮助。Kozyrkov ( [2018](https://hackernoon.com/what-on-earth-is-data-science-eb1237d8cb37) )根据数据科学应用支持的决策数量提出了以下分类:

*   *数据挖掘/描述性分析* —探索性分析,以识别数据中有趣的、先前未知的模式,并对导致这些模式的潜在过程提出假设。这里*还没有决定*要做——我们只是在手边的数据集中“寻找灵感”。
*   *统计推断*——做出*一个或几个*关于世界的风险可控的结论,这些结论超越了被分析的数据集。
*   *机器学习/人工智能* —构建“决策配方”,可以(重新)用于以自动化的方式做出*许多决策*。

尽管这些类型的数据科学项目之间的差异并不总是那么明显,但让我们接受这种分类法,因为它足以满足我们的目的。

根据[维基百科](https://en.wikipedia.org/wiki/Blockchain),

> 区块链是一个不断增长的记录列表,称为*块*,它们使用加密技术链接在一起

区块链被实现为分散的、分布式的、只写的数据库,运行在对等计算机网络上。传统上,区块链一直被用作*总账*来记录加密货币交易(例如,比特币、以太坊、Dash 等)。).然而,如今这项技术正在获得许多其他用例。

区块链上的交易发生在两个或更多的*地址之间——由字母数字组成的字符串,充当用户的假名,作用类似于电子邮件地址。一个真实的人,区块链的用户,可以拥有多个地址。此外,一些区块链(例如,比特币)鼓励其用户为新交易创建新地址,以保持高度的匿名性。*

区块链上本地生成的记录被称为*链上数据*。在他们的分析过程中,这些记录通常会增加来自任何外部来源的*非链数据*(例如,拥有某些区块链地址的实体的名称有时可以从公共论坛和[网站](https://ens.domains/)中收集到)。

类似于陈等人( [2020](https://arxiv.org/pdf/1909.06189.pdf) ),我们将与相关的数据科学应用分为两类——【为】、【在】。第一种类型的应用对链上数据和可能的链外数据做一些有用的事情,但是不一定部署在区块链的基础设施上(例如,部署在云提供商的基础设施上的基于链上数据的仪表板)。第二种类型的应用程序是区块链本身的一部分。

“在区块链”应用程序可以部署为 [*智能合同*](https://ethereum.org/en/developers/docs/smart-contracts/) 。简而言之,智能协定是一段代码,它驻留在自己的地址上,并执行某些预定义的逻辑来响应特定于协定的触发器。智能合约可以用各种编程语言编写,既有通用的也有专用的,比如 [Solidity](https://docs.soliditylang.org/en/latest/) 或 [Vyper](https://vyper.readthedocs.io/en/stable/) 。

# 数据科学和区块链技术是天生的一对

与传统数据源(例如,集中控制的企业数据库)相比,区块链在设计上提供了几个对数据科学应用非常重要的优势:

*   *高数据质量*:所有新记录都经过严格的、区块链特有的验证流程,该流程由众多“[共识机制](https://www.investopedia.com/terms/c/consensus-mechanism-cryptocurrency.asp#:~:text=A%20consensus%20mechanism%20is%20a,systems%2C%20such%20as%20with%20cryptocurrencies.)中的一个提供动力。一旦经过验证和批准,这些记录就变得不可改变——没有人可以出于任何目的修改它们,无论是善意的还是恶意的。区块链数据通常结构良好,其模式也有据可查。这使得处理此类数据的数据科学家的工作变得更加容易,也更容易预测。
*   *可追溯性*:区块链记录包含跟踪其来源和背景所需的所有信息,例如,哪个地址发起了一项交易,交易发生的时间,转移的资产金额,以及接收该资产的地址。此外,大多数公共区块链都有“探索者”——任何人都可以在网站上查看各自区块链上产生的任何记录(例如,见[比特币](https://www.blockchain.com/explorer)、[以太坊](https://etherscan.io/)和[涟漪](https://livenet.xrpl.org/)探索者)。
*   内置匿名功能:区块链不要求用户提供任何个人信息,这在一个保护个人隐私已经成为现实问题的世界里非常重要。从数据科学家的角度来看,这有助于克服与一些法规(例如,欧洲的 [GDPR](https://www.legislation.gov.uk/eur/2016/679/article/5) 法规)相关的难题,这些法规要求在处理之前对个人数据进行匿名处理。
*   *大数据量:*很多机器学习算法需要大量的数据来训练模型。这在成熟的区块链不是问题,他们提供千兆字节的数据。

# 从区块链收集数据很棘手,但还是有选择的

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c51606fef47c32c9c727d0804484b421.png)

照片由[爆裂](https://unsplash.com/@burst?utm_source=medium&utm_medium=referral)上[未飞溅](https://unsplash.com?utm_source=medium&utm_medium=referral)

收集与手头问题相关的数据是数据科学家在区块链相关项目中可能遇到的第一个障碍。使用前面提到的浏览器网站很容易检查单个区块链记录。然而,*程序化地*收集适用于数据科学目的的大型数据集可能是一项艰巨的任务,可能需要专业技能、软件和财政资源。有三个主要的选择可以考虑。

## *选项 1——使用其他人已经准备好的数据集*

作为其 [BigQuery 公共数据集](https://cloud.google.com/bigquery/public-data/)计划的一部分,谷歌云[为](https://cloud.google.com/blog/products/data-analytics/introducing-six-new-cryptocurrencies-in-bigquery-public-datasets-and-how-to-analyze-them)[比特币](https://console.cloud.google.com/bigquery?utm_source=bqui&utm_medium=link&utm_campaign=classic&project=betspeed-1192&d=crypto_bitcoin&p=bigquery-public-data&page=dataset)、[比特币现金](https://console.cloud.google.com/bigquery?utm_source=bqui&utm_medium=link&utm_campaign=classic&project=betspeed-1192&d=crypto_bitcoin_cash&p=bigquery-public-data&page=dataset)、 [Dash](https://console.cloud.google.com/bigquery?utm_source=bqui&utm_medium=link&utm_campaign=classic&project=betspeed-1192&d=crypto_dash&p=bigquery-public-data&page=dataset) 、 [Dogecoin](https://console.cloud.google.com/bigquery?utm_source=bqui&utm_medium=link&utm_campaign=classic&project=betspeed-1192&d=crypto_dogecoin&p=bigquery-public-data&page=dataset) 、[以太坊](https://console.cloud.google.com/bigquery?utm_source=bqui&utm_medium=link&utm_campaign=classic&project=betspeed-1192&d=crypto_ethereum&p=bigquery-public-data&page=dataset)、[以太坊经典](https://console.cloud.google.com/bigquery?utm_source=bqui&utm_medium=link&utm_campaign=classic&project=betspeed-1192&d=crypto_ethereum_classic&p=bigquery-public-data&page=dataset)、 [Litecoin](https://console.cloud.google.com/bigquery?utm_source=bqui&utm_medium=link&utm_campaign=classic&project=betspeed-1192&d=crypto_litecoin&p=bigquery-public-data&page=dataset) 和 [Zcash](https://console.cloud.google.com/bigquery?utm_source=bqui&utm_medium=link&utm_campaign=classic&project=betspeed-1192&d=crypto_zcash&p=bigquery-public-data&page=dataset) 提供了完整的交易历史。使用 SQL 可以轻松查询这些数据集,并且可以导出结果以供进一步分析和建模。方便的是,大多数数据集都使用相同的模式,这使得重用 SQL 查询更加容易。见[叶夫根尼·梅德维杰夫](https://medium.com/u/b6a4cbbd2e57?source=post_page-----c136154c367e--------------------------------)在 Medium 上的帖子以获取教程。

还存在可用于研究和开发目的的静态区块链数据集。以下是几个例子:

*   [椭圆数据集](https://www.kaggle.com/ellipticco/elliptic-data-set),比特币图的子图,由 203769 个节点(交易)和 234355 条边(有向支付流)组成。这些节点被标记为“合法”、“非法”或“未知”。该数据集由[椭圆](https://www.elliptic.co/)公司发布,旨在激发学术界和密码界对建立更安全的基于加密货币的金融系统的兴趣(Bellei[2019](https://medium.com/elliptic/the-elliptic-data-set-opening-up-machine-learning-on-the-blockchain-e0a343d99a14);韦伯等人 [2019](https://arxiv.org/pdf/1908.02591.pdf) 。
*   BigQuery 中的 [Medalla 数据集由](https://console.cloud.google.com/bigquery?page=dataset&d=crypto_ethereum2_medalla&p=public-data-finance&project=betspeed-1192) [Nansen.ai](https://nansen.ai/) 公司公开,作为[以太坊基金会](https://ethereum.org/en/eth2/get-involved/medalla-data-challenge/)于 2020 年举办的 [Medalla 数据挑战赛](https://ethereum.org/en/eth2/get-involved/medalla-data-challenge/)的一部分。该数据集包括描述以太坊[信标链](https://ethereum.org/en/eth2/beacon-chain/)上的[块和块验证器](https://research.nansen.ai/ethereum-2-0-etl-and-medalla-data-in-google-bigquery/)的变量。
*   [CryptoKitties 数据集](https://github.com/cryptocopycats/kitties),它包含了来自著名的以太坊[游戏](https://www.cryptokitties.co/)的数千只“数码猫”的属性。
*   [数据集](https://github.com/epicprojects/blockchain-anomaly-detection)由里德和哈里根( [2012](https://arxiv.org/abs/1107.4524) )以及法姆和李( [2017a](https://arxiv.org/pdf/1611.03942.pdf) , [2017b](https://arxiv.org/pdf/1611.03941.pdf) )用来检测比特币区块链上的异常交易。

## *选项 2 —使用区块链特定的 API 或 ETL 工具*

BigQuery 公共数据集确实涵盖了主要的区块链项目,但是如果感兴趣的区块链不在其中呢?好消息是,基本上所有的区块链都通过各自的 [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) 和/或[web socket](https://en.wikipedia.org/wiki/WebSocket)API 提供了一种与网络交互的编程方式。参见例如查询[比特币](https://www.blockchain.com/api)、[以太坊](https://infura.io/)、 [EOS](https://developers.eos.io/manuals/eos/latest/nodeos/plugins/chain_api_plugin/api-reference/index) 、 [NEM](https://docs.nem.io/en/nem-apis) 、 [NEO](https://docs.neo.org/docs/en-us/reference/rpc/latest-version/api.html) 、 [Nxt](https://nxtdocs.jelurida.com/API) 、[涟漪](https://xrpl.org/data-api.html)、[恒星](https://developers.stellar.org/api/)、 [Tezos](https://tzstats.com/docs/api#tezos-api) 、 [TRON](https://www.trongrid.io/) 、 [Zilliqa](https://dev.zilliqa.com/docs/apis/api-introduction) 的 API。

幸运的是,通常存在方便的客户端库,它们抽象出特定 API 的复杂性,并允许数据科学家使用他们喜欢的语言——Python 或 r。这种 Python 库的例子包括`[bitcoin](https://pypi.org/project/bitcoin/)`(比特币)、`[trinity](https://trinity.ethereum.org/)`和`[web3.py](https://web3py.readthedocs.io/en/stable/)`(以太坊)、`[blockcypher](https://github.com/blockcypher/blockcypher-python)`(比特币、莱特币、Dogecoin、Dash)、`[tronpy](https://pypi.org/project/tronpy/)`(创)、`[litecoin-utils](https://pypi.org/project/litecoin-utils/)`(莱特币)等。R 包的例子比较少但确实存在:`[Rbitcoin](https://cran.r-project.org/web/packages/Rbitcoin/index.html)`(比特币)`[ether](https://cran.r-project.org/web/packages/ether/index.html)`(以太坊)`[tronr](https://github.com/next-game-solutions/tronr)` (TRON)。

<https://levelup.gitconnected.com/introducing-tronr-an-r-package-to-explore-the-tron-blockchain-f0413f38b753>  

除了 API,还可以考虑使用专用的 ETL 工具从区块链收集数据。这个领域一个著名的开源项目是“[区块链 ETL](http://blockchainetl.io/) ”,这是一个由 [Nansen.ai](https://nansen.ai/) 开发的[Python 脚本集合](https://github.com/blockchain-etl)。事实上,正是这些脚本将数据输入到前面提到的 BigQuery 公共数据集。

虽然原生区块链 API 和开源 ETL 应用程序给了数据科学家很大的灵活性,但在实践中使用它们可能需要额外的努力和数据工程技能:设置和维护本地或基于云的区块链节点、执行脚本的运行时环境、存储检索数据的数据库等。相关的基础设施要求也可能产生大量成本。

## 选项 3 —使用商业解决方案

为了节省时间、精力和与基础设施相关的成本,还可以选择区块链数据收集的商业解决方案。此类工具通常使用跨多个区块链统一的模式,通过 API 或支持 SQL 的接口提供数据(例如,参见 [Anyblock Analytics](https://www.anyblockanalytics.com/) 、 [Bitquery](https://bitquery.io/) 、 [BlockCypher](https://www.blockcypher.com/) 、 [Coin Metrics](https://coinmetrics.io/) 、[Crypto API](https://cryptoapis.io/)、 [Dune Analytics](https://duneanalytics.com/) 、 [Flipside Crypto](https://flipsidecrypto.com/) )。这有助于各种比较分析,并且至少在理论上,使得开发在整个区块链可互操作的数据科学应用成为可能。

# 我们生活在描述性区块链分析的时代

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9dd025d59c7d4b5594b510be37db3929.png)

科迪·菲茨杰拉德在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

区块链仍然是一项新技术,可以说,我们才刚刚开始理解它提供的数据的价值。在这个早期阶段,能够有效地收集、总结和可视化数据,也就是执行描述性分析,是至关重要的。毫不奇怪,迄今为止,描述性区块链分析的大多数用例都围绕着加密货币和监管合规性。已经开发了许多调查工具来帮助加密货币企业、金融机构、监管机构和执法部门完成以下常见任务:

*   跟踪和可视化地址之间的*资金流动*,以便例如发现被盗资金、揭露加密货币价格操纵、揭露窃贼身份以及防止洗钱;
*   *标记*区块链地址并将它们链接到现实世界的实体(例如,“暗网市场”、“勒索软件”、“诈骗”、“矿池”、“赌博应用”、“加密货币交易所”等)。);
*   *实时提醒*链上事件,如可疑交易、[大额资金转移、](https://whale-alert.io/)受制裁地址的活动;
*   使用统一数据模式的跨区块链搜索;
*   计算和可视化*定制链上* *指标*;
*   执行*自定义* *数据查询*。

调查性区块链分析领域的一些最大玩家包括 [AnChain.ai](https://www.anchain.ai/) 、 [Bitfury](https://bitfury.com/) 、 [CipherTrace](https://ciphertrace.com/) 、[chain analysis](https://www.chainalysis.com/)、 [Coin Metrics](https://coinmetrics.io/) 、 [Dune Analytics](https://duneanalytics.com/) 、 [Elliptic](https://www.elliptic.co/) 、 [Glassnode](https://glassnode.com/) 、 [Nansen.ai](https://www.nansen.ai/) 。

# 机器学习和区块链:很多学术研究,没有那么多现实世界的实现

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/19d420fea554b9ee3e2c164f2a5069d3.png)

在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上[科学高清](https://unsplash.com/@scienceinhd?utm_source=medium&utm_medium=referral)拍摄的照片

有大量的学术研究应用机器学习来解决各种与区块链相关的问题。刘等人( [2021](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9364978) )在他们的综述论文中,将这些问题分为以下三个主题(类似的讨论也可参见陈等人 [2020](https://arxiv.org/pdf/1909.06189.pdf) )。

*   *加密货币价格预测—* 这个话题是迄今为止最受欢迎的话题,考虑到散户和[机构投资者对加密货币日益增长的兴趣,这并不奇怪。大多数已发表的研究试图预测比特币或以太坊的未来价格,无论是绝对值还是价格方向(上涨或下跌)。这已经通过从简单的逻辑回归到 XGBoost 和基于深度学习的方法的算法完成(例如,Greaves 和 Au](https://cryptofundresearch.com/)[2015](http://snap.stanford.edu/class/cs224w-2015/projects_2015/Using_the_Bitcoin_Transaction_Graph_to_Predict_the_Price_of_Bitcoin.pdf);阿拜等人[2019](https://arxiv.org/pdf/1908.06971.pdf);巴里与起重机[2019](http://ceur-ws.org/Vol-2563/aics_5.pdf);陈等 [2020](https://e-tarjome.com/storage/btn_uploaded/2020-08-23/1598154911_11132-etarjome%20English.pdf) )。模型输入通常包括链上变量(如活动地址数量、交易量、[挖掘难度](https://en.bitcoin.it/wiki/Difficulty)、[交易图](https://ciphertrace.com/glossary/transaction-graph/)指标)和链外变量(如交易所的交易量)的组合。总的来说,神经网络(特别是那些基于 LSTM 架构的网络)已经被发现优于基于树的算法,尽管即使在表现最好的模型中,预测的准确性也只比随机猜测高一点点。
*   *地址身份推断***——*按照设计,区块链地址所有者的身份通常是未知的。然而,能够将某些地址分类到预定义的组中,或者更好的是,将它们与现实世界的实体联系起来,可能具有巨大的价值。对于涉及非法活动的地址尤其如此,如洗钱、毒品分销、勒索软件、庞氏骗局、人口贩运,甚至恐怖主义融资。在几项研究中,地址分类问题已通过监督学习得到成功解决,这些研究开发了二元分类器(如 Weber 等人的前述论文 [2019](https://arxiv.org/pdf/1908.02591.pdf) )或多类分类器(如梁等人的[2019](https://www.researchgate.net/profile/Linjing-Li/publication/332786441_Targeted_Addresses_Identification_for_Bitcoin_with_Network_Representation_Learning/links/5cd3f04492851c4eab8cb540/Targeted-Addresses-Identification-for-Bitcoin-with-Network-Representation-Learning.pdf));另见哈列夫等人 [2018](https://scholarspace.manoa.hawaii.edu/bitstream/10125/50331/1/paper0444.pdf) ,尹等人[2019](https://www.researchgate.net/profile/Raghava-Rao-Mukkamala/publication/332118587_Regulating_Cryptocurrencies_A_Supervised_Machine_Learning_Approach_to_De-Anonymizing_the_Bitcoin_Blockchain/links/5d0925f9458515ea1a709729/Regulating-Cryptocurrencies-A-Supervised-Machine-Learning-Approach-to-De-Anonymizing-the-Bitcoin-Blockchain.pdf);米哈尔斯基等人 [2020](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9114987) )。各个模型是使用链上数据和各种标准机器学习算法开发的。有趣的是,与加密货币价格预测研究相比,基于树的方法(特别是随机森林)往往优于基于深度学习的算法(刘等人 [2021](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9364978) )。*
*   **异常检测* —区块链可能遭受多种恶意攻击和欺诈行为(如穆巴拉克等人[2018](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8371010);拉胡蒂等人 [2018](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8528406) ),通过分析交易模式有可能发现这一点。由于异常交易的数量自然很少,这个问题已经用经验导出的规则或无监督的机器学习方法来解决,例如*k*-均值聚类、一类 SVM、Mahalanobis 基于距离的标记和隔离森林(例如,Camino 等人[2017](https://ieeexplore.ieee.org/document/8215741);Pham 和 Lee [2017a](https://arxiv.org/pdf/1611.03942.pdf) , [2017b](https://arxiv.org/pdf/1611.03941.pdf) 。刘等人( [2021](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9364978) )的结论是,这些研究中的大多数都存在低召回率,因此需要进一步研究。与此同时,Tann 等人( [2019](https://arxiv.org/pdf/1811.06632.pdf) )已经建立了一个高度准确的基于 LSTM 的二元分类器,用于检测智能合约中的代码漏洞。*

*除了上面描述的用例,许多研究人员已经提出甚至实验性地测试了机器学习驱动的区块链平台,旨在改进现有的电子健康记录管理系统,实现供应链中更好的可追溯性,增加[物联网](https://en.wikipedia.org/wiki/Internet_of_things)网络的安全性等。(萨拉赫等人[2018](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8598784);陈等【2020】)。几篇论文还提出了基于区块链的平台和协议,用于机器学习模型的集体训练和传播(例如,Marathe 等人的“dine MMO”2018 年,Kurtumlus 和 Daniel 的“DanKu 协议”2018 年[和 Harris 和 Waggoner 的“区块链上的分散和协作 AI”](https://arxiv.org/pdf/1802.10185.pdf)[2019 年](https://arxiv.org/pdf/1907.07247.pdf))。*

*尽管在学术文献中看到了大量实验机器学习驱动的区块链系统的例子,但这种系统的实际实现仍然很少。这有很多原因,既有数据相关的,也有基础设施方面的(Salah et al. [2018](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8598784) )。例如,使用监督学习的区块链地址去匿名化需要足够大的*标记的*训练数据集。然而,高质量的标签通常只能用于一小部分地址,这阻碍了监督学习的使用(但请参见 Rodriguez [2019](https://medium.com/intotheblock/practical-machine-learning-for-blockchain-datasets-understanding-semi-and-omni-supervised-learning-2a2611695b2) 讨论可能的解决方案)。*

*得益于常用的纯文本格式[、](http://dmg.org/pmml/v4-4-1/GeneralStructure.html)、【PFA】、 [ONNX](https://onnx.ai/) (王 [2018](https://arxiv.org/ftp/arxiv/papers/1903/1903.08801.pdf) ),许多机器学习算法有可能通过智能合约部署在。然而,部署一些更复杂的算法,如在 GPU 上训练的基于张量流的深度神经网络,仍然是一项不平凡的任务。*

*由于交易的低带宽和高成本,缺乏技术标准和互操作性协议,以及需要外部数据的可信供应商(也称为“T8”甲骨文”),在区块链部署和使用机器学习模型也可能很困难(Salah et al. [2018](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8598784) )。*

*然而,包括 [Algorithmia](https://algorithmia.com/research/ml-models-on-blockchain) 、 [AnChain.ai](https://anchainai.medium.com/our-ai-detects-your-ai-revealing-the-secret-world-of-blockchain-bots-part-2-tron-e6ad38522f9c) 、 [Bitfury](https://medium.com/meetbitfury/bitfury-ai-opens-offices-in-italy-and-netherlands-c2482685121c) 、 [Fetch.ai](https://fetch.ai/) 、 [IBM](https://www.ibm.com/blogs/blockchain/2021/01/blockchain-in-2021-accessibility-authenticity-and-ai/) 、 [IntoTheBlock](https://www.intotheblock.com/) 、 [SingularityNET](https://singularitynet.io/) 等在内的许多公司声称,他们正在他们的区块链产品中使用机器学习。毫无疑问,在不久的将来,我们将会看到更多这样的公司和产品。在其他发展中,通过甲骨文提供的链外信号,使智能合同“更智能”的更简单方法将极大地促进这种增长——C[hainlink](https://chain.link/)和 P [rovable](https://provable.xyz/) 已经提供了各自的解决方案。*

# *结论:如果你想成为一名区块链数据科学家,现在是最佳时机*

*区块链技术有可能改变许多行业和业务流程。在他们最近的文章中, [Forbes Technology Council](https://www.forbes.com/sites/forbestechcouncil/) 为区块链确定了 13 个不断发展和新兴的用例,包括艺术家的权利管理、跨行业数据整合、去中心化金融、供应链管理、用户认证和密码管理、电子健康记录等。所有这些发展都需要一批能够“让数据变得有用”的专家,也就是数据科学家。有趣的和未解决的区块链数据科学问题的范围是巨大的。此外,这些问题中有许多尚未形成。因此,如果你正考虑以数据科学家的身份进入区块链这个激动人心的世界,这个时机再好不过了。本文中提到的许多公司已经为数据科学家提供了空缺职位——请查看他们网站上的“职业”部分!*

# *在你走之前*

*我提供数据科学咨询服务。[取得联系](mailto:sergey@nextgamesolutions.com)!*

# 骑自行车的数据科学-如何计算与斯特拉发 GPX 路线的高差和距离

> 原文:<https://towardsdatascience.com/data-science-for-cycling-how-to-calculate-elevation-difference-and-distance-from-strava-gpx-route-cff147033c16?source=collection_archive---------22----------------------->

## **第 3/6 部分——计算点与点之间的高差和距离,并用 Python 可视化高程剖面图**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/57cfe0a9d4a0473f30e039f59b72693e.png)

照片由[孙铁麟·瓦达斯](https://unsplash.com/@hunterrtomi?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

[上周](https://betterdatascience.com/data-science-for-cycling-how-to-visualize-gpx-strava-routes-with-python-and-folium/)您学习了如何使用 Python 和 Folium 可视化 GPX Strava 路线,而在之前的[周,您已经了解了如何分析和解析 Strava GPX 路线。今天,我们将通过计算高程差和数据点之间的距离来更进一步。我们还将可视化一条路线的高程剖面,并将其与 Strava 生成的剖面进行比较。](https://betterdatascience.com/data-science-for-cycling-how-to-read-gpx-strava-routes-with-python/)

我们有许多事情要谈,所以让我们直入主题吧。首先,我们将加载数据集并计算高程差。

不想看书?请观看我的视频:

你可以在 [GitHub](https://github.com/better-data-science/data-science-for-cycling) 上下载源代码。

# 如何读取 Strava 路径数据集

我们今天不会为 GPX 文件费心,因为我们已经有提取到 CSV 文件的路线数据点。首先,我们将导入几个库——Numpy、Pandas 和 Haversine(`pip install haversine`)——还有 Matplotlib,以便稍后可视化:

从这里,加载路径数据集:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/12c8c2f8c932f76a5194f3d96977baf3.png)

*图片 1-Strava 路线数据集(图片由作者提供)*

总共有 835 个数据点,我们有每个数据点的高程数据。怎么才能得到点与点之间的高差?让我们接下来讨论这个问题。

# 如何从 Strava 路线计算高程差

您可以使用 Pandas 的`diff()`函数来计算第 N+1 行和第 N 行之间的差异。如果您将它应用到`elevation`列,您将获得各个点之间的高程差异。第一个差值将是`NaN`,但这是意料之中的,因为在它之前没有数据点。

使用下面的代码片段计算高差,并将其存储到单独的列中:

```
route_df['elevation_diff'] = route_df['elevation'].diff()route_df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/8d4ece7e7cc5fa986bddc211a75233cf.png)

*图片 2-具有高差的路径数据集(图片由作者提供)*

说白了,第二个点位于第一个点上方 1.86 米处。但是点与点之间的实际距离是多少呢?1.86 米的高度极难骑过 10 米,但骑过 100 米却相当容易。

接下来,您将计算两点之间的距离。

# 如何计算 Strava 路线中各点之间的距离

计算自行车路线上数据点之间的距离是很棘手的。也许最好的方法是使用一些谷歌的地图 API——但这些 API 不是免费的,通常只在公路上运行良好。这是山地自行车道的一个限制因素。此外,发出近千个 API 请求至少需要几分钟。

最好的自由和快速的选择是使用**哈弗线距离**。它计算球体上两点之间的大圆距离,给出它们的纬度和经度。想要更深入地了解理论和数学,请随意阅读官方的[维基百科文章](https://en.wikipedia.org/wiki/Haversine_formula)。

我们的 GPX 斯特拉发路线长 36.4 公里,有 835 个数据点。平均来说,两点之间的距离大约是 43.6 米。Strava 路线看起来非常平滑,所以我希望在直路上看到更少的数据点,在小径上看到更多的点,因为它们有很多急转弯。有理由预计哈弗线距离会有所偏离,但希望不会太大。

首先,让我们定义一个函数来计算哈弗线距离。它接受两个纬度和经度组合,并返回它们之间的距离(以米为单位):

```
def haversine_distance(lat1, lon1, lat2, lon2) -> float:
    distance = hs.haversine(
        point1=(lat1, lon1),
        point2=(lat2, lon2),
        unit=hs.Unit.METERS
    )
    return np.round(distance, 2)
```

下面的代码片段打印了数据集中第一个点和第二个点之间的距离:

```
haversine_distance(
    lat1=route_df.iloc[0]['latitude'],
    lon1=route_df.iloc[0]['longitude'],
    lat2=route_df.iloc[1]['latitude'],
    lon2=route_df.iloc[1]['longitude']
)
```

您应该看到`87.59`被打印到控制台上。没有办法通过 Strava 验证,但是希望它是准确的。

我们现在将计算所有数据点之间的距离。下面的代码片段做到了这一点,也跳过了第一行,因为它前面没有数据点。完成后,距离存储在新列中:

```
distances = [np.nan]for i in range(len(route_df)):
    if i == 0:
        continue
    else:
        distances.append(haversine_distance(
            lat1=route_df.iloc[i - 1]['latitude'],
            lon1=route_df.iloc[i - 1]['longitude'],
            lat2=route_df.iloc[i]['latitude'],
            lon2=route_df.iloc[i]['longitude']
        ))

route_df['distance'] = distances
route_df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c25f9c28bcece94b049aa9eac9d8b8e6.png)

*图片 3-带有数据点之间距离的路径数据集(图片由作者提供)*

探索这些新列很有趣。例如,我们可以计算路线的总仰角增益。怎么会?通过对数据集进行子集化,从而只保留具有正`elevation_diff`的行,然后对提到的列求和:

```
route_df[route_df['elevation_diff'] >= 0]['elevation_diff'].sum()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/12ff6a8cf52d378e77c1c1c58e68d382.png)

*图片 4 —斯特拉发路线的总海拔增益(图片由作者提供)*

这个数字有点不准确,因为官方的斯特拉发路线称这里海拔 288 米。

接下来让我们检查总距离。根据 Strava 的说法,这条路线长 36.4 公里。我们将对`distance`列求和并比较结果:

```
route_df['distance'].sum()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/feaaac1507efd5bf2f2d05d7f6d8f7e4.png)

*图片 5 —以米为单位的路线总距离(图片由作者提供)*

我们完全符合简单的哈弗森距离!

我们得到的数字与 Strava 上的数字相匹配,因此通过 Python 进一步探索数据集是有意义的。在下一节中,您将看到如何可视化高程剖面,我们将把它与 Strava 上的高程剖面进行比较。

# 如何可视化 Strava 路线的高程剖面

高程剖面图顾名思义显示了不同距离处的高程。你可以用它来查看哪里有山,这样你就知道如何调整你的骑行速度。我们需要两个额外的列来可视化高程剖面——高程差的累积和以及距离的累积和:

```
route_df['cum_elevation'] = route_df['elevation_diff'].cumsum() 
route_df['cum_distance'] = route_df['distance'].cumsum() route_df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/640968fd8d2efa6885c5f1bef437f435.png)

*图 6——高度和距离的累积和(图片由作者提供)*

我们需要这些,因为我们想做一个线图。`cum_distance`将位于 X 轴上,而`cum_elevation`将位于 Y 轴上。两者都必须是累积的,因为我们希望看到整个路线,而不是一个点。

在可视化之前,让我们去掉缺失的值。最好用零填充它们,因为这对该数据集最有意义:

```
route_df = route_df.fillna(0)route_df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fba8cae7499beb0b2852a0846a79761c.png)

*图 7 —输入缺失值(图片由作者提供)*

您将在以后的文章中需要这个数据集,所以将其转储到一个 CSV 文件中:

```
route_df.to_csv('../data/route_df_elevation_distance.csv', index=False)
```

最后,我们将使用 Matplotlib 来可视化高程剖面。距离和高度都以米为单位,所以请记住:

```
plt.plot(route_df['cum_distance'], route_df['cum_elevation'], color='#101010', lw=3)
plt.title('Route elevation profile', size=20)
plt.xlabel('Distance in meters', size=14)
plt.ylabel('Elevation in meters', size=14);
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c1b9b01c745918d5f5a6858808afe694.png)

*图片 8 —路线立面图(图片由作者提供)*

有两个相对较小的爬坡彼此靠近,其余的路线几乎是平坦的。让我们将它与来自斯特拉发的官方高程剖面图进行比较:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ea0f6975ed9e16ab947e094c79458368.png)

*图片 Strava 上的路线立面图(作者提供的图片)*

斯特拉瓦的团队花了更多的时间来调整视觉效果,但情节看起来几乎相同!来自 Strava 的更宽,但这并没有任何实际的区别。另外,斯特拉发把 Y 轴显示为海平面以上的高度,而我们从零开始。

总的来说,我们对几行代码做了相当不错的工作。接下来让我们总结一下。

# 结论

现在,您已经知道了如何计算数据点之间的高程差和距离,以及如何可视化高程剖面。起初听起来工作量很大,但是 Python 有一个库,几乎可以容纳你能想到的任何东西。这些看似复杂的计算归结为一个函数调用。在下一篇文章中,您将了解如何根据高程和数据点之间的距离计算路线坡度,敬请关注。

以下是整个系列的链接——我会在发布文章时添加网址:

*   [第 1 篇:从 Strava 加载并分析 GPX 文件](https://betterdatascience.com/data-science-for-cycling-how-to-read-gpx-strava-routes-with-python/)
*   [第 2 条:用圆形标记和多边形线可视化来自 Strava 的 GPX 文件](https://betterdatascience.com/data-science-for-cycling-how-to-visualize-gpx-strava-routes-with-python-and-folium/)
*   [第三条:计算点与点之间的高差和距离,可视化路线的高程剖面图](https://betterdatascience.com/data-science-for-cycling-how-to-calculate-elevation-difference-and-distance-from-strava-gpx-route)
*   第 4 条:根据点之间的高程差和距离计算路线坡度
*   文章 5:计算和可视化梯度剖面——在梯度范围内循环的距离
*   文章 6:创建一个 web 应用程序,分析并可视化用户从 Strava 上传的 GPX 文件

*喜欢这篇文章吗?成为* [*中等会员*](https://medium.com/@radecicdario/membership) *继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。*

<https://medium.com/@radecicdario/membership>  

# 保持联系

*   注册我的[简讯](https://mailchi.mp/46a3d2989d9b/bdssubscribe)
*   在 YouTube[上订阅](https://www.youtube.com/c/BetterDataScience)
*   在 [LinkedIn](https://www.linkedin.com/in/darioradecic/) 上连接

*原载于 2021 年 12 月 20 日 https://betterdatascience.com**T21*[。](https://betterdatascience.com/data-science-for-cycling-how-to-calculate-elevation-difference-and-distance-from-strava-gpx-route/)

# 自行车运动的数据科学-如何从斯特拉发 GPX 文件计算路线坡度

> 原文:<https://towardsdatascience.com/data-science-for-cycling-how-to-calculate-route-gradients-from-a-strava-gpx-file-2fc559980186?source=collection_archive---------24----------------------->

## [自行车运动的数据科学](https://towardsdatascience.com/tagged/data-science-for-cycling)

## **第 4/6 部分——使用 Python 计算并可视化 Strava 路线 GPX 文件的坡度**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a35a7f96aa580d562efc893fb6582c67.png)

照片由[帕特里克·亨德利](https://unsplash.com/@worldsbetweenlines?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄

[上周](https://betterdatascience.com/data-science-for-cycling-how-to-calculate-elevation-difference-and-distance-from-strava-gpx-route/)你已经看到计算 Strava 路线的高差和距离是多么容易。这是朝着正确方向迈出的一步,因为今天您将需要高程和距离数据。骑自行车的人喜欢谈论的一件事是坡度。这些代表你所骑的路面的坡度。

事实证明,利用基本的 Python 和数学技能,您可以毫不费力地估算出它们。我们今天有很多内容要讲,所以让我们直接开始吧。

不想看书?请观看我的视频:

你可以在 [GitHub](https://github.com/better-data-science/data-science-for-cycling) 上下载源代码。

# 如何读取 Strava 路径数据集

我们今天不会为 GPX 文件费心,因为我们已经将路线数据点、高程和距离提取到一个 CSV 文件中。首先,导入通常的疑点并调整 Matplotlib 的默认样式:

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (16, 6)
plt.rcParams['axes.spines.top'] = False
plt.rcParams['axes.spines.right'] = False
```

从这里,加载路径数据集:

```
route_df = pd.read_csv('../data/route_df_elevation_distance.csv')
route_df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/cb2d8c7022a69e070ef13fbf6df5ba9c.png)

图片 1-包含距离和高程数据的 Strava 路径数据集(图片由作者提供)

如果您没有这种格式的路径数据集,请阅读上周的文章。概括地说,在这条 36.4 公里的路线上总共有 835 个数据点,因此数据点之间的平均距离为 43.6 米。

我们可以使用高差和距离数据来估计 835 个单独路段的平均坡度。

# 如何从 Strava 路线计算坡度

坡度只不过是你所骑行的表面的坡度。我们的数据非常有限,因为我们只有分布在 36 公里范围内的 835 个数据点。我们会尽最大努力,但从这一点上你将看到的一切都只是一个估计。

我们可以通过将两个数据点之间的高程差除以所经过的距离并将结果乘以 100 来估计两个数据点之间的平均梯度。

让我们用第二个数据点的硬编码值来测试这个逻辑(在 87.59 米的高度上增加了 1.86 米):

```
(1.86 / 87.59) * 100>>> 2.1235300833428474
```

从路线起点到第二个数据点的平均坡度为 2.1%。这意味着,如果相同的坡度继续,在 100 米的距离后,你将获得 2.1 米的高度。

这只是一个平均值,所以记住这一点。该路段的前 15 米可以具有 10%的坡度,而剩余的 72 米可以完全平坦。另一方面,整个 87 米路段可能有一个完美分布的 2.1%的坡度。**重点是**——我们无法确切知道,以上逻辑是我们能做到的最好的。

让我们将它应用于整个数据集。我们将跳过第一行,因为没有什么可以与之比较。渐变通常四舍五入到小数点后一位,但这是惯例,不是要求。请随意添加更多内容。

```
gradients = [np.nan]for ind, row in route_df.iterrows(): 
    if ind == 0:
        continue
    grade = (row['elevation_diff'] / row['distance']) * 100
    gradients.append(np.round(grade, 1))

gradients[:10]
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6ec755019673aed6b0b9b1200e71100f.png)

图片 2-前十个估计梯度(图片由作者提供)

计算完成—现在让我们来看一下 835 个数据点的平均梯度:

```
plt.title('Terrain gradient on the route', size=20)
plt.xlabel('Data point', size=14)
plt.ylabel('Gradient (%)', size=14)
plt.plot(np.arange(len(gradients)), gradients, lw=2, color='#101010');
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0060c4fa223aaf2aaba4f9049f4dba61.png)

图片 3-估计的平均路线坡度 v1(图片由作者提供)

路由文件似乎有问题。单个数据点有超过 1200%的梯度,这是不可能的。理论上,这将意味着你在 100 米的距离后获得 1200 米的高度。

我们将通过添加一个条件来缓解这个问题——如果估计的平均梯度大于 30%,我们将在列表中添加`NaN`。这条路线没有 30%以上的坡度,这样的坡度总体来说极其罕见。

```
gradients = [np.nan]for ind, row in route_df.iterrows(): 
    if ind == 0:
        continue

    grade = (row['elevation_diff'] / row['distance']) * 100

    if grade > 30:
        gradients.append(np.nan)
    else:
        gradients.append(np.round(grade, 1))
```

让我们看看它是什么样子的:

```
plt.title('Terrain gradient on the route', size=20)
plt.xlabel('Data point', size=14)
plt.ylabel('Gradient (%)', size=14)
plt.plot(np.arange(len(gradients)), gradients, lw=2, color='#101010');
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5ab364f95e8adace5af5fa603eab445d.png)

图片 4-估计的平均路线坡度 v2(图片由作者提供)

这是朝着正确方向迈出的一步,但我们现在有几个缺失的数据点。事情是这样的——有一个简单愚蠢的解决办法。

# 如何从 Strava 路线内插不正确的坡度

首先,我们将把计算的梯度分配给一个新的数据集列:

```
route_df['gradient'] = gradients
route_df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1e898bece5b96ce5e8ecb73ea717ea3f.png)

图片 5-包含坡度信息的路径数据集(图片由作者提供)

让我们看看缺少的值在哪里:

```
route_df[route_df['gradient'].isna()]
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6dc6d94f361fb117fe444923bfff565a.png)

图像 6-数据集中所有缺失的梯度值(作者提供的图像)

我们可以忽略第一个,因为它是因为完全不同的原因而丢失的。我们得处理另外两个。为了理解这种方法,让我们将第二行与周围的几行隔离开来:

```
route_df[401:406]
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/013be77f8c84bf8fcab577186bf81144.png)

图 7-缺失梯度值周围的数据点(作者图片)

我们将使用**插值**来估算缺失值。它会用前后数据点的平均值替换缺失值。例如,缺失值之前的缺失渐变为 0,之后为-5.9。插值梯度将为-2,95,如`(0 + (-5.9)) / 2 = -2.95`:

```
route_df[401:406].interpolate()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/22873bed9e4c5e1bc631d42d404ecb8b.png)

图 8-单个数据点的插值渐变(图片由作者提供)

使用下面的代码片段对整个数据集应用插值,并用零填充第一行缺少的值:

```
route_df['gradient'] = route_df['gradient'].interpolate().fillna(0)route_df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/917fcffee0adc5c19ca644aa6faa05d6.png)

图 9-带有插值梯度列的数据集

最后,我们将可视化梯度,看看这次线是否连接:

```
plt.title('Terrain gradient on the route', size=20)
plt.xlabel('Data point', size=14)
plt.ylabel('Gradient (%)', size=14)
plt.plot(np.arange(len(route_df)), route_df['gradient'], lw=2, color='#101010');
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fe70180c07def0c461897c58bdaf43d6.png)

图片 10-估计的平均路线坡度 v3(图片由作者提供)

现在一切看起来都很好,这意味着我们准备好进一步分析梯度。我们将在下一篇文章中讨论这个问题,但是现在请将数据集保存到 CSV 文件中:

```
route_df.to_csv('../data/route_df_gradient.csv', index=False)
```

这就是我今天想讲的。接下来让我们总结一下。

# 结论

现在,您已经知道了如何计算和可视化 Strava route GPX 文件的梯度。你必须承认——这比听起来容易。任何东西都可以归结为任何人都能理解的小学数学。下面的文章将使事情稍微复杂一些,因为我们将把我们的焦点转移到渐变剖面上。简而言之,我们想知道在不同梯度范围内循环的距离,但现在还不用担心。

以下是整个系列的链接——我会在发布文章时添加网址:

*   [第 1 篇:从 Strava 加载并分析 GPX 文件](https://betterdatascience.com/data-science-for-cycling-how-to-read-gpx-strava-routes-with-python/)
*   [第二条:用圆形标记和多边形线可视化来自 Strava 的 GPX 文件](https://betterdatascience.com/data-science-for-cycling-how-to-visualize-gpx-strava-routes-with-python-and-folium/)
*   [第三条:计算点与点之间的高差和距离,可视化路线的高程剖面图](https://betterdatascience.com/data-science-for-cycling-how-to-calculate-elevation-difference-and-distance-from-strava-gpx-route)
*   [第四条:根据点与点之间的高差和距离计算路线坡度](https://betterdatascience.com/data-science-for-cycling-calculate-route-gradients-from-strava-gpx)
*   文章 5:计算和可视化梯度剖面——在梯度范围内循环的距离
*   文章 6:创建一个 web 应用程序,分析并可视化用户从 Strava 上传的 GPX 文件

*喜欢这篇文章吗?成为* [*中等会员*](https://medium.com/@radecicdario/membership) *继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。*

<https://medium.com/@radecicdario/membership>  

# 保持联系

*   注册我的[简讯](https://mailchi.mp/46a3d2989d9b/bdssubscribe)
*   在 [YouTube](https://www.youtube.com/c/BetterDataScience) 上订阅
*   在 [LinkedIn](https://www.linkedin.com/in/darioradecic/) 上连接

*原载于 2021 年 12 月 28 日 https://betterdatascience.com*<https://betterdatascience.com/data-science-for-cycling-calculate-route-gradients-from-strava-gpx/>**。**

# 自行车运动的数据科学——如何使用 Python 阅读 GPX 斯特拉发路线

> 原文:<https://towardsdatascience.com/data-science-for-cycling-how-to-read-gpx-strava-routes-with-python-e45714d5da23?source=collection_archive---------5----------------------->

## [自行车运动的数据科学](https://towardsdatascience.com/tagged/data-science-for-cycling)

## 第 1/6 部分——介绍 GPX,探索和想象斯特拉发路线

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/444702721437e993bf20e1183e45fed6.png)

照片由[阿莱西奥·索格蒂](https://unsplash.com/@asoggetti?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在 [Unsplash](https://unsplash.com/s/photos/bike?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄

我喜欢骑自行车,也喜欢用 Strava 来记录我的训练活动。作为一个数据呆子,我对他们的锻炼分析有点失望。当然,你可以分析速度、功率、节奏、心率等等——取决于你可用的传感器——但我真正怀念的是深度梯度分析。

现在,数据科学中的梯度和循环不一定代表同一件事。在自行车运动中,基本上就是你所骑的路面的坡度。作为一个又高又重的骑手,我觉得爬坡很有挑战性,所以更深入的坡度分析会很有帮助。例如,我想看看我在 3%和 5%之间走了多远,10%以上走了多少,以及在这之间的所有事情。你明白了。

Strava 不提供这种功能,所以我决定使用我的 Python 技能从头开始计算。

加入我的 6 篇文章的迷你系列,以 GPX 文件格式的速成课程开始,以比 Strava 更深入地显示你的训练数据的仪表板结束。

不想看书?请观看我的视频:

你可以在 [GitHub](https://github.com/better-data-science/data-science-for-cycling) 上下载源代码。

# GPX 数据科学速成班

Strava 可让您以 GPX 文件格式导出您的训练和路线。简单地说,GPX 代表 *GPS 交换格式*,它只不过是一个带有地理信息的文本文件,比如纬度、经度、海拔、轨迹、路点等等。

导出的 Strava route GPX 文件包含许多在不同时间拍摄的点,每个点都包含纬度、经度和高程。简单地说,你确切地知道你在哪里,你的高度是多少。这对于计算渐变和渐变范围是必不可少的,我们将在两篇文章中讨论。

如果您正在跟随,前往 Strava 并下载您保存的任何路线(*导出 GPX* 按钮):

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d804fcf019d16b662dbbc11bdc6948fe.png)

*图片 1——克罗地亚萨格勒布的往返斯特拉瓦路线(图片由作者提供)*

创建路线需要付费的 Strava 订阅,因此出于安全考虑,我不会与您共享我的 GPX 文件。使用路线或训练日志中的任何 GPX 文件。如果你没有使用 Strava,只需在网上找到一个 GPX 的样本文件,它应该仍然可以工作。

GPX 的文件准备好了吗?太棒了——接下来让我们看看如何用 Python 来读。

# 如何用 Python 读取 GPX 文件

你需要一个专用的`gpxpy`包来用 Python 阅读 GPX。用 Pip 安装它:

```
pip install gpxpy
```

您现在可以启动 Jupyter 或任何其他代码编辑器来开始了。首先,让我们先解决库导入的问题:

使用 Python 的上下文管理器语法读取和解析 GPX 文件:

请注意,您必须更改路径以匹配您的系统和 GPX 文件名。如果一切顺利,现在应该可以用 Python 获得这个文件了。

但是里面是什么?让我们看看:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6dcc25d186b0ecec247dc130c22b5273.png)

*图片 2——GPX 文件的内容(图片由作者提供)*

它是一个特定的 GPX 对象,具有轨迹名称和分段,其中每个分段包含数据点(纬度、经度和海拔)。我们将在下一节中更深入地研究这些函数,但是首先,让我们探索几个有用的函数。

例如,您可以提取 GPX 文件中的数据点总数:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f2eefd21e3f9bb40dd4198edc68ea314.png)

*图 3—GPX 文件中数据点的总数(图片由作者提供)*

总共有 835 个点,每个点包含纬度、经度和高程数据。那以后会有用的。

您还可以获得高度范围:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/238be4d6a7b0689eb9bbbce0cd962c73.png)

*图片 4——最低和最高海拔(图片由作者提供)*

说白了,这就意味着乘坐的最低点在海拔 113,96 米,而最高点在海拔 239,16 米。

您还可以提取获得和失去的总海拔米数:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7fe2ab76e774a35be96a347425525467.png)

*图片 5 —获得和失去的总高度(图片由作者提供)*

我的路径代表一个往返行程,因此应该看到相同或几乎相同的值。最后,您可以用 XML 格式显示 GPX 文件的内容:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f3a5140f9cc50e3f9f941bb79357ad9e.png)

*图片 XML 格式的 GPX 文件(图片由作者提供)*

它不是超级可读的,但是如果您有 XML 处理管道,它可能会派上用场。

这是最基本的。接下来,您将看到如何提取单个数据点,并将它们转换成可读性更好的格式——Pandas data frame。

# 如何用 Python 分析 GPX 文件

你可以通过运行`len(gpx.tracks)`来检查你的 GPX 文件有多少个音轨。我的只有一个,我可以用 Python 的列表索引符号来访问它:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a1056c9f2d3f5b5788b3c04b1ecabb9e.png)

*图片 7 —访问单个音轨(作者图片)*

我们不关心轨道的名称,因为在这种情况下它是任意的。我们真正关心的是细分市场。和音轨一样,我的 GPX 文件在这个音轨上只有一个片段。以下是访问它的方法:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f11d98d65f1fd4239d176bff669975d0.png)

*图片 8 —访问单个片段(作者图片)*

现在,您可以通过访问`points`数组来访问各个数据点。以下是我的前十条路线:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6b07a6b50f5a173956feea91587f1ab8.png)

*图 9 —访问单个数据点(作者图片)*

这就是我们找乐子所需要的。现在,您将看到如何从 GPX 文件中提取单个数据点:

这不是你见过的最漂亮的代码,但是它完成了任务。让我们打印前三个条目来验证我们所做的一切都是正确的:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/dfabc894a55bed114bfb8d24990dc7f7.png)

*图 10 —提取的数据点作为字典列表(按作者分类)*

你知道字典列表有什么特别方便的吗?你可以马上把它转换成熊猫的数据帧:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a5c89bf92c6c9aa3960a7fd4499a26df.png)

*图 11 —提取的数据点作为熊猫数据帧(图片由作者提供)*

你必须承认——那相当容易!我们将在下面的文章中需要这个数据集,所以让我们把它转储到一个 CSV 文件中:

这就是我们今天要做的基本分析和预处理。我还将向您展示如何使用 Matplotlib 来可视化这个数据集——只是为了看看我们是否在正确的轨道上。

# 如何用 Python 和 Matplotlib 可视化 GPX 文件

在下一篇文章中,我们将使用 Python 和 Folium 进行路线可视化,但今天我想向您展示如何使用 Matplotlib 进行基本的可视化。你肯定看不到地图,但是定位点应该类似于图 1 中的路线。

提示:不要把图的尺寸画得太宽,因为这会让地图看起来很奇怪。

复制以下代码以可视化路线:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d6fb13f37be9f1b7c669029021d80ccb.png)

*图片 12 —使用 Matplotlib 的路线可视化(图片由作者提供)*

谁知道呢——这和我们在*图 1* 中看到的一样,没有考虑明显的问题。在下一篇文章中,您将了解到地图和路线可视化的全部内容。

# 结论

现在,您已经成功地从 Strava 导出了一个 GPX 路线/训练文件,用 Python 对其进行了解析,并提取了纬度、经度和海拔等关键特征。这只是冰山一角,在接下来的文章中,您可以期望了解更多编程和数据科学在自行车运动中的应用。

这里有一个简短的概述来激励你——我会在发布文章时添加网址:

*   [第 1 篇:从 Strava 加载并分析 GPX 文件](https://betterdatascience.com/data-science-for-cycling-how-to-read-gpx-strava-routes-with-python/)
*   [文章 2:用圆形标记和多边形线可视化来自 Strava 的 GPX 文件](https://betterdatascience.com/data-science-for-cycling-how-to-visualize-gpx-strava-routes-with-python-and-folium/)
*   第 3 条:计算点与点之间的高差和距离,可视化路线的高程剖面
*   第 4 条:根据点之间的高程差和距离计算路线坡度
*   文章 5:计算和可视化梯度剖面——在梯度范围内循环的距离
*   文章 6:创建一个 web 应用程序,分析并可视化用户从 Strava 上传的 GPX 文件

感谢阅读,敬请期待更多内容!

喜欢这篇文章吗?成为 [*中等会员*](https://medium.com/@radecicdario/membership) *继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。*

<https://medium.com/@radecicdario/membership>  

# 保持联系

*   注册我的[简讯](https://mailchi.mp/46a3d2989d9b/bdssubscribe)
*   在 YouTube[上订阅](https://www.youtube.com/c/BetterDataScience)
*   在 [LinkedIn](https://www.linkedin.com/in/darioradecic/) 上连接

# 自行车运动的数据科学——如何使用 Python 和 Folium 可视化 GPX 斯特拉发路线

> 原文:<https://towardsdatascience.com/data-science-for-cycling-how-to-visualize-gpx-strava-routes-with-python-and-folium-21b96ade73c7?source=collection_archive---------32----------------------->

## [自行车运动的数据科学](https://towardsdatascience.com/tagged/data-science-for-cycling)

## **第 2/6 部分——使用令人惊叹的 Python 库轻松可视化 Strava 路线**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/63db4b04e68ca3fbc84ff67f901235aa.png)

照片由 [Flo 吉田](https://unsplash.com/@flo_karr?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 拍摄

上周[你了解了所有关于 GPX 的数据。您还以 GPX 格式导出了 Strava 路径,用 Python 加载了它,并提取了关键数据点,如纬度、经度和海拔。今天你将使用这些点在地图上画出路线!](https://betterdatascience.com/data-science-for-cycling-how-to-read-gpx-strava-routes-with-python/)

我们将开始用 Matplotlib 可视化 Strava 路线,但是我们将很快过渡到一个更专业的库——follow。如果您还没有安装它,请使用 Pip 安装它(pip install folium)。我们开始吧。

不想看书?请观看我的视频:

你可以在 [GitHub](https://github.com/better-data-science/data-science-for-cycling) 上下载源代码。

# 如何读取 Strava 路径数据集

我们今天不会为 GPX 文件费心,因为我们已经有提取到 CSV 文件的路线数据点。首先,我们必须导入几个库——主要是熊猫和叶子——还有 Matplotlib,用于基本的路线可视化:

```
import folium
import pandas as pdimport matplotlib.pyplot as plt
plt.rcParams['axes.spines.top'] = False
plt.rcParams['axes.spines.right'] = False
from IPython.display import display
```

现在,您可以加载路径数据集:

```
route_df = pd.read_csv('../data/route_df.csv')
route_df.head()
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/098747b80a463a2f517316e62112376b.png)

图片 1-Strava 路径数据集(图片由作者提供)

数据集中有 835 个数据点,这对于代表性的路线可视化来说绰绰有余。让我们从 Matplotlib 开始,讨论为什么这不是一个好主意。

# 如何用 Matplotlib 可视化 Strava 路线

您可以使用 Matplotlib 将纬度和经度点可视化为散点图,X 轴为经度,Y 轴为纬度。这非常有限,因为您将只能看到路径本身,而没有基础地图:

```
plt.figure(figsize=(14, 8))
plt.scatter(route_df['longitude'], route_df['latitude'], color='#101010')
plt.title('Route latitude and longitude points', size=20);
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d6fb13f37be9f1b7c669029021d80ccb.png)

图 2-使用 Matplotlib 的 Strava 路线可视化(图片由作者提供)

出于这个原因,我不推荐 Matplotlib 或任何其他用于显示地图的非专业可视化包。有许多专门的解决方案,但我发现 leav 是最容易使用的一个。

# 如何使用 leav 可视化 Strava 路线

[follow](https://python-visualization.github.io/folium/)是一个用于可视化地理空间数据的 Python 库。它只是一个[传单](https://leafletjs.com/)的包装器,一个用于绘制交互式地图的开源 JavaScript 库。

在显示地图之前,必须知道一些事情。它们是地理位置(纬度和经度)、缩放级别和切片(地图的外观)。我们还将添加高度和宽度,这样地图就不会太大:

```
route_map = folium.Map(
    location=[45.79757947, 15.9007929],
    zoom_start=13,
    tiles='OpenStreetMap',
    width=1024,
    height=600
)
display(route_map)
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fdd1ca7382ad09217a68e66404831f3e.png)

图 3 —克罗地亚萨格勒布的一张空白树叶地图(图片由作者提供)

简单吧?这是一张克罗地亚萨格勒布西部的空白地图,因为那是我的路线所在。向地图添加数据点非常简单,基本上就是迭代数据集,并在每个纬度和经度组合处添加一个圆形标记。我们将保留默认参数,唯一要改变的是圆的半径:

```
route_map = folium.Map(
    location=[45.79757947, 15.9007929],
    zoom_start=13,
    tiles='OpenStreetMap',
    width=1024,
    height=600
)for _, row in route_df.iterrows():
    folium.CircleMarker(
        location=[row['latitude'], row['longitude']],
        radius=3,
    ).add_to(route_map)display(route_map)
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f3f18f60126a90ff3337bb2be8431026.png)

图 4-用圆形标记可视化 Strava 路线(图片由作者提供)

现在我们有进展了。唯一的问题是——路径通常不会用圆圈标记来表示。这有点问题,因为我们只有数据点。我们可以将它们连接成一条多边形线,但这样做需要提取地理位置信息作为元组列表:

```
route_map = folium.Map(
    location=[45.79757947, 15.9007929],
    zoom_start=13,
    tiles='OpenStreetMap',
    width=1024,
    height=600
)coordinates = [tuple(x) for x in route_df[['latitude', 'longitude']].to_numpy()]
folium.PolyLine(coordinates, weight=6).add_to(route_map)display(route_map)
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1730dc89910c488725764d3da17928cb.png)

图 5-用多边形线可视化 Strava 路线(图片由作者提供)

本质上,您需要编写的代码更少,地图最终看起来更好——双赢。

但是如果你对过于详细的地图不满意呢?好消息是,您可以根据自己的喜好调整平铺参数。这是一个卡通、轻盈、简约的瓷砖选项示例:

```
route_map = folium.Map(
    location=[45.79757947, 15.9007929],
    zoom_start=13,
    tiles='CartoDBPositron',
    width=1024,
    height=600
)coordinates = [tuple(x) for x in route_df[['latitude', 'longitude']].to_numpy()]
folium.PolyLine(coordinates, weight=6).add_to(route_map)display(route_map)
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4c8f6bc422db7a514e8f2a91400bb741.png)

图 6-更改地图分块(1)(图片由作者提供)

你也可以反其道而行之,就是用一个黑暗的主题。为此,请将 tiles 参数更改为 CartoDBDark_Matter:

```
route_map = folium.Map(
    location=[45.79757947, 15.9007929],
    zoom_start=13,
    tiles='CartoDBDark_Matter',
    width=1024,
    height=600
)coordinates = [tuple(x) for x in route_df[['latitude', 'longitude']].to_numpy()]
folium.PolyLine(coordinates, weight=6).add_to(route_map)display(route_map)
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/09ba78c1513d6e53c9c60eec61e4dde5.png)

图 7-更改地图分块(2)(图片由作者提供)

一开始看起来有点奇怪,但是你可以让它工作。例如,将多边形线条颜色更改为白色,会使其更加突出。

您可以通过检查文档字符串来浏览其他图块,以下是可用选项:

```
folium.Map?
```

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/c7444d20df9baa10493efbdb69d619c3.png)

图 8-foylus 中可用的地图切片(图片由作者提供)

除了 Mapbox 之外的一切都是可用的,因为 Mapbox 需要一个 API 键。我们将坚持免费选项,因为它们已经足够好了。

# 结论

这就是你要做的——如何使用 have 轻松可视化 GPX 斯特拉发路线。我们不会用地图做任何更复杂的事情,因为这本身就非常适合我们的需求。在下一篇文章中,您将了解如何计算高程差和数据点之间的距离,并在后面的文章中了解更多内容。

以下是整个系列的链接——我会在发布文章时添加网址:

*   [第 1 篇:从 Strava 加载并分析 GPX 文件](https://betterdatascience.com/data-science-for-cycling-how-to-read-gpx-strava-routes-with-python/)
*   [第二条:用圆形标记和多边形线可视化来自 Strava 的 GPX 文件](https://betterdatascience.com/data-science-for-cycling-how-to-visualize-gpx-strava-routes-with-python-and-folium/)
*   第 3 条:计算点与点之间的高差和距离,可视化路线的高程剖面
*   第 4 条:根据点之间的高程差和距离计算路线坡度
*   文章 5:计算和可视化梯度剖面——在梯度范围内循环的距离
*   文章 6:创建一个 web 应用程序,分析并可视化用户从 Strava 上传的 GPX 文件

喜欢这篇文章吗?成为 [*中等会员*](https://medium.com/@radecicdario/membership) *继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。*

<https://medium.com/@radecicdario/membership>  

# 保持联系

*   注册我的[简讯](https://mailchi.mp/46a3d2989d9b/bdssubscribe)
*   在 YouTube[上订阅](https://www.youtube.com/c/BetterDataScience)
*   在 [LinkedIn](https://www.linkedin.com/in/darioradecic/) 上连接

*原载于 2021 年 12 月 13 日 https://betterdatascience.com*<https://betterdatascience.com/data-science-for-cycling-how-to-visualize-gpx-strava-routes-with-python-and-folium/>**。**

# 全球野生动物贩运的数据科学

> 原文:<https://towardsdatascience.com/data-science-for-global-wildlife-trafficking-2faffa765b19?source=collection_archive---------20----------------------->

## [变更数据](https://towardsdatascience.com/tagged/data-for-change)

## 对非法贩运进口到美国的野生动物进行广泛而深入的分析

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6edfcce17d2dd8120932507229794ea0.png)

由 [NASA](https://unsplash.com/@nasa?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

这个项目由 Alex Hardy、Raya Abourjeily 和我 Ani Madurkar 共同完成。

这个故事将讨论我们的项目作为一个整体,包括识别问题,限定假设,证明方法,评估结果,等等。它不会包含代码片段,所以如果你对 code/Tableau 仪表板设计感兴趣,那么我建议你查看我们的 Github repo 或在 Tableau Public 上下载相应的 Tableau 仪表板。

[莱米斯 Tableau 仪表盘](https://public.tableau.com/app/profile/raya.abourjeily/viz/LEMIS/Overview)

[Panjiva Tableau 仪表盘](https://public.tableau.com/app/profile/raya.abourjeily/viz/Panjiva/Overview)

[简化应用](https://github.com/AniMadurkar/Machine-Learning-for-Global-Wildlife-Trafficking)

# 目录

1.  问题陈述
2.  与领域专家合作
3.  Tableau 中的探索性数据分析
4.  从 LEMIS 预测行动/部署
5.  聚集来自潘吉瓦的货物
6.  那又怎样?
7.  工作说明书

# 问题陈述

在过去十年中,非法贩运野生动物已经升级为一场国际危机,对许多国家造成了严重的保护问题和对全球安全的威胁。非法野生动物贸易受到高额利润(估计价值为每年 78-100 亿美元)的驱动,破坏了各国的安全协议(白宫,2014 年)。

此外,由于人口的增长,对野生动物的需求也在增长,这使得本已脆弱的物种濒临灭绝。像许多非法贸易一样,非法野生动物贩运通常是通过黑市渠道进行的,最终隐藏在可信的供应链路线中。

这使得黑市交易者可以从非法活动中获利并逃避惩罚,而最终消费者(动物园、博物馆等)则可以从中获利。)似乎正在收购合法来源的野生动物产品。目前,破坏这些非法供应链的努力往往依赖直觉,而不是数据驱动的解决方案,从而能够采取积极措施制止非法贩运。

非法野生动物贸易网络很复杂,但通过数据科学,我们计划为应对这一挑战的解决方案提供新的见解。先进的数据分析可以帮助我们找出事件之间的联系,并标记公司可能在不知情的情况下运输非法野生动物货物的风险区域,这有助于使公司更加负责任,并实现美国打击野生动物贩运的国家战略。

# 与领域专家合作

由于这个社会公益问题对我们所有人来说都是一个新问题,我们需要与专家合作,并经常获得他们的反馈。与领域专家的密切合作使我们能够确保我们的解决方案是有价值和可行的。

我们的主要联系人是尼尔·卡特博士。这一摘录直接来自他的网站,“尼尔·卡特博士的跨学科研究考察了在全球变化背景下野生动物和人类之间相互作用的复杂动力学特征(例如,提供生态系统服务,冲突)。他的工作涉及从地方到全球的野生动物保护问题,利用多种空间技术和工具,让不同的利益攸关方参与进来,并为决策提供信息”。

为了确保我们能够恰当地传递价值,我们每周都要举行站立会议来展示进展情况,并与 Neil 一起制定下一步战略。他让人们意识到之前在这一领域所做的一些值得注意的数据工作:

1.  [与非法杀害大象相关的全球趋势和因素:尸体遭遇数据的层次贝叶斯分析](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0024165)

2.[剖析非法象牙贸易:象牙扣押数据分析](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0076539#s5)

3.[侦查非法木材交易](https://dac-wwf.cs.vt.edu/)

通过频繁的讨论,我们很快注意到这个数百万美元的问题缺乏有效的数据解决方案。虽然数据工作可能在某个地方进行,但结果似乎并不普遍,因此对执法官员和保护工作者的价值有限。我们发现这种知识共享的缺乏造成了研究人员和官员之间的隔阂。

Neil 的关系帮助我们联系到 Robert (Bob) Herndon,他在肯塔基州的美国 UPS 运输总部工作,专门研究野生动物(动物和产品)。我们进行了一次半正式的用户调查访问,以便更好地理解这个问题,并了解他对这个问题的看法。Bob 证实了我们的怀疑,即知识共享的差距使他和他的同行在每天评估 120 多万个包裹时非常依赖直觉。由于丰富的经验,Bob 能够快速扫描带有运输信息的文档,以确定可能需要搜索非法材料的可疑货物。我们与 Bob 的讨论给了我们很大的希望,数据可以成为这个领域中人们的有用工具,特别是因为他每天都依靠自己的直觉和专家经验来评估大量数据。即便如此,他和他的同事们还是非常希望拥有能够扩展他们直觉的自动化和可扩展的解决方案。

我们还连线了尼尔的同行之一梅雷迪思·戈尔医生。戈尔博士的网站上写道:“我用风险概念来建立对人类与环境关系的新理解。我的研究旨在为行动建立证据。我的大部分活动可以被描述为关于野生动物贩运、非法伐木、捕鱼和采矿等保护问题的[趋同研究](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=11&cad=rja&uact=8&ved=2ahUKEwi-ztSSy7reAhVK4oMKHbWcBvEQFjAKegQIBRAB&url=https%3A%2F%2Fwww.nsf.gov%2Fod%2Foia%2Fconvergence%2Findex.jsp&usg=AOvVaw2kuNh4Leev1l8fMjEUAqO2)。她广博的知识跨越多个领域,这帮助我们确定了该领域研究人员&的两个突出需求:

1.  **易于访问的广泛数据分析,可帮助领域专家提出正确的问题**
2.  **一套广泛的大数据解决方案,提供可解释和可操作的结果**

我们决定将我们的解决方案专门针对这两种需求。对于我们的短期项目来说,并没有什么道德上的考虑需要我们警惕。我们考虑的主要因素是将领域专家的需求放在我们工作的最前沿,并确保我们的假设得到他们经验的验证。

# 我们的方法

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/fe92c6e169586d8f11f1fea346a64daf.png)

作者/项目团队提供的图片

我们利用两个数据集来提供以下见解:( 1)哪些特征可以预测一批货物是否因含有非法野生动物产品而被成功扣押;( 2)这些扣押模式是否可以使用一个更大的、公开的(通过 fee)对美国的货运数据库来揭示其他隐藏的非法贸易动态。 [LEMIS 数据集](https://data.nal.usda.gov/dataset/data-united-states-wildlife-and-wildlife-product-imports-2000%E2%80%932014)包括美国进口野生动物及其衍生产品 15 年(2000-2014)的标记数据,最初由美国鱼类和野生动物管理局收集。 [Panjiva 数据集](https://panjiva.com/)是通过付费 Panjiva 账户手动下载的,它包括与 HS 编码 01、02、03、04 和 05 的野生动物相关的进口货物(2007-2021 年)的未标记数据,因为这些数据代表动物&动物产品。两个数据集中都没有敏感数据。LEMIS 中的标签/目标变量代表给定货物的结果:废弃、清关、再出口或扣押。虽然 Panjiva 的数据主要用于评估非法贸易动态中的潜在缉获模式,但未标记的数据迫使我们使用自己的主观解释和背景来评估结果。

我们对这两个数据集进行了联合分析,主要是因为 LEMIS 数据的日期仅为 2000 年至 2014 年,而 Panjiva 允许我们访问美国最近的进口数据。此外,Panjiva 数据显示了更多的货物分类账信息,如收货人、港口等补充数据。勒米斯没有太多这方面的资料,但确实有运送货物的补充数据,如分类群、属等。

我们创建了两个 ETL 脚本,它们从每个数据源读入文件,并输出一个干净的文件,以便于其他下游任务。在我们清理完文件后,我们将每个文件发送到 Tableau 仪表板,可以在 Tableau Public 上查看。清理后的文件还用于 Streamlit 上基于网络的机器学习应用程序。

Tableau 仪表板旨在彻底探索每个数据集。我们创建了各种可视化,允许用户从多个维度和角度探索每个数据集。尽管我们的数据质量有限,但我们希望创建一个开放的探索性仪表板,帮助领域专家提出有效的问题。

Streamlit 应用程序旨在预测来自 LEMIS 的行动/处置(目标变量),并对来自 Panjiva 的货物进行聚类。用户能够通过选择不同的超参数快速迭代各种监督/非监督模型,然后使用 Lime、特征重要性、词云等技术评估模型。

随着时间的推移,我们希望将我们最好的模型预测输出到 Tableau 中,以便能够使用我们的预测,而不仅仅是模型评估。

LEMIS Tableau 仪表板:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/59acb488ff47dd2118b91b85382a6429.png)

作者/项目团队提供的图片

Panjiva Tableau 仪表板:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5b6d1f142da3bb7201e8ccd203958a67.png)

作者/项目团队提供的图片

简化应用程序:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0fa74151a156b1ccc71f776f6724736d.png)

作者/项目团队提供的图片

# Tableau 中的探索性数据分析

因为我们在这个项目中与来自不同背景的利益相关者合作,所以数据的可视化能够被他们容易地探索和访问是极其重要的。为了实现这一点,我们创建了两个交互式的公开可用的 Tableau 仪表板,每个数据集一个,允许最终用户通过可视化和过滤器的各种组合来浏览数据。每个仪表板都包含一个主页,它提供了数据集的大图概述,以及几个其他选项卡,允许用户通过不同的角度分析数据。这些包括但不限于:货物的来源和去向,货物中的野生动物产品类型,被拒绝的货物与清关的货物的百分比。

**莱米斯仪表盘**

*   **概览选项卡:**LEMIS 数据集中的发货概览。
*   **国家标签**:深入查看货物的原产国、出口国和进口港。
*   **分类群&描述标签:**深入查看装运中野生动物产品的描述、分类群和通用名。
*   **拒绝发货标签**:根据某些属性重点查看被拒绝的总发货百分比。

**Panjiva 仪表盘**

*   **概览选项卡**:Panjiva 数据集中发货的大图概览。
*   **国家页签**:重点关注起运地、起运目的地地区、装货港和卸货港地区。
*   **收货人标签**:关注发货人和收货人的详细信息

每个仪表板上的所有可视化都可以作为仪表板其余部分的过滤器,这允许根据每个用户的需求对仪表板进行定制。特别是对于 LEMIS 仪表板,用户可以根据货物是被拒绝还是作为进口货物被接受进入美国进行过滤,并且可以比较每种类型的货物的属性有何不同。

作为创建这些仪表板的一部分,我们咨询了主题专家和最终用户,以确保仪表板满足他们的需求。反过来,我们收到了关于如何在下一次迭代中改进仪表板的可操作的反馈。戈尔博士告诉我们,不仅要关注装运了什么,还要关注 T2 是如何装运的。这方面的一个例子是查看一起装运的不同产品的共现情况,这是我们的仪表板目前没有解决的问题。戈尔博士建议我们进一步探讨的另一个重要课题是与各种野生动物贸易政策相比较的趋势分析。她指出,“自 2018 年以来,罚款和制裁大幅增加”,了解野生动物贸易是否以及如何受到影响将是有益的。总的来说,通过进行用户访谈,我们能够确保我们的仪表板是用户友好的,并满足他们的目标,同时收集有关如何在未来改进我们的仪表板的信息。

这两个仪表板都可以通过以下链接在 Tableau Public 上访问:

*   [雷米斯仪表盘](https://public.tableau.com/app/profile/raya.abourjeily/viz/LEMIS/Overview)
*   [Panjiva 仪表盘](https://public.tableau.com/app/profile/raya.abourjeily/viz/Panjiva/Overview)

# 从 LEMIS 预测行动/部署

## **目标**

该分析的目标是有效地预测 LEMIS 数据中给定货物的行动/处置。这种分析在短期内的预期用户是未来的研究人员,他们希望了解导致货物被丢弃、清关、再出口或被扣押的区别特征。随着时间的推移,我们看到了这种应用程序在实时应用中的潜力,以帮助官员自动化他们的直觉,同时每天评估数百万个包裹。

## **数据清理&操作**

第一个数据清理步骤包括将主 LEMIS 文件连接到一个以代码作为键/值对的文件。这允许我们将两列(单位和价值)分解成一系列列(重量(千克)、体积等)。).经过进一步的分析,我们注意到这个数据集中的很多数值度量都是空的,最终都被删除了。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f0f3b4d91f368f3e3c1ad7e6c8703a93.png)

作者/项目团队提供的图片

我们最后还将这个数据集中的 action 和 disposition 字段组合在一起,作为我们的目标变量。行动只能是清关和拒绝,但处置表示在给定货物(如果被拒绝)可以被放弃、重新出口、扣押或清关之后发生的事情。在这里创建一个目标列会产生一个明显的多分类问题。

## 特征工程

LEMIS 也有多种分类学特征,如分类群、纲、属、种。这些列中有许多空值,但是由于我们问题的性质,丢失数据对我们来说是很有意义的。对于我们的用例,我们的数据集已经以相对干净的状态提供。这让我们可以假设丢失的数据不是由于一些系统错误或一些不需要的东西,而主要是由于未知的信息。因此,我们用“unknown”替换了空值,并创建了一个“complete_percent”列,它表示分类中有多少列被填充。我们的假设是,这将有助于我们的模型更有效地辨别非法运输。这是因为我们假设运送非法货物的人会将许多字段留空(即未知),以掩盖非法产品的来源和身份。最后,我们将分类法列组合成一个字符串,这使我们能够使用文本矢量化。

尽管大多数数字字段都是空的,但我们确实找到了相当数量的值条目。价值特征的问题在于,由于高价值装运,存在许多异常值。我们通过 winsorizing 字段解决了这个方法。这使我们能够设置 0.05 和 0.95 的限值,将异常值限制在这些限值范围内。

我们最后的特性工程步骤包括使用 SMOTE 来平衡我们的目标类。我们的数据集中有大量的清除样本,因此我们对少数类进行了向上采样以确保平衡。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b08e3e0c722925d8bb2939fb5f5ea48f.png)

作者/项目团队提供的图片

在建模之前,我们对分类变量进行热编码,对数值变量进行稳健缩放,并对文本变量进行计数矢量化。一个热门的编码对于分类标签是有意义的,因为没有一个对它们有合理的层次结构,某些类别应该有更高的价值。鲁棒定标器在处理数据集中的异常值方面表现良好,因为它移除了中值并通过 IQR 进行归一化。最后,计数矢量化对文本功能有意义,因为它不是真正的“自由文本”字段,简单地计数分类的出现次数就足够了。

为了尽可能避免数据漂移,我们拟合并转换了训练数据,并且只转换了验证/维持集。

## 模型开发和评估

为了建模,我们尝试了一系列 5 种不同的监督模型。我们从简单的逻辑回归开始,慢慢地发现了模型学习中的障碍。我们转向利用 SGDClassifier,它能够使用梯度下降来优化学习的性能和速度。尽管这种方法表现得更好,但即使在对各种超参数应用网格搜索交叉验证后,我们也无法在评估中获得明显更好的指标。然后我们转向使用基于树的方法,比如决策树、随机森林,最后是极端梯度提升树(XGBoost)。

在反复迭代和在维持集上测试我们的模型之后,我们发现 XGBoost 能够产生最强的结果。这也适用于大多数 Kaggle 板上被视为最成功的模型,从而再次证实了我们的怀疑。引用 XGBoost 网站的文档,“XGBoost 是一个优化的分布式梯度增强库,旨在高效、灵活和可移植。它在[梯度提升](https://en.wikipedia.org/wiki/Gradient_boosting)框架下实现机器学习算法。XGBoost 提供了一种并行树提升(也称为 GBDT,GBM),可以快速准确地解决许多数据科学问题。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9a18d2b94122e479364c28201df57f50.png)

作者/项目团队提供的图片

即使在平衡数据集上训练,我们的模型实际上在检测其他类上表现得相当好。我们仍然发现,由于我们的模型中有如此大量的清关发货,我们的模型达到了一定的平稳状态。由于数据集中存在大量的空值(或未知值),并且地理位置的行动/处置规则或标准各不相同,我们推断我们的模型只会比我们现有的数据稍微好一点。由于这些不同的规则,Cleared 和 Reexport 使我们的模型有点混乱是有道理的;由于大多数航运中心和港口不想储存大量“可疑”货物,在混乱时期再出口比丢弃或扣押更容易。与鲍勃的讨论告诉我们,这个决策边界似乎依赖于官员的主观直觉。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a5a78966ab37790794306edaf88bc9b9.png)

为了正确评估我们的模型性能和可扩展性,我们使用交叉验证和评估指标来利用学习曲线。

这反映了类似的理论,我们有更多的数据/例子似乎有助于我们的模型有效地考虑有多少他们被清除。即使对我们的数据集进行上采样,我们也只有有限数量的独特场景来产生我们的各种目标类。

从我们的模型中提取出系数,我们可以获得全局特征重要性,以查看模型能够辨别的内容对于区分类别是重要的。我们还可以按数据类型划分特性,以查看每种特性的重要性。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/a3eddb87125c6387904697ab040e3090.png)

作者/项目团队提供的图片

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/25a5eb63d2c7b1fbfd43d9da73cceb8b.png)

作者/项目团队提供的图片

我们开始看到某些通用名称出现在顶部,如“爬虫”和“珊瑚虫”,同时外国公司被列为“未知”也是一个重要特征。未知的外国公司很有趣,因为它符合我们的直觉:如果我们没有在舱单上看到外国公司(收货人)等重要字段,我们会发现货物相当可疑。我们还看到我们的模型选取了一些港口,如德尔里奥、朱诺号、布朗斯维尔等。我们与领域专家的讨论让我们清楚地看到,每个港口或航运中心都可以有一系列有效遵循的指导方针和法规。有些可能更容易通过非法运输,而有些则可能不容易。虽然我们不能使用这些特性的重要性来得出这些是“坏”端口的结论,但我们可以将此作为进一步调查的有教育意义的启发。

最后,我们使用 LIME 来简化多分类模型的可解释性。将我们的预测加载到一个 LIME 解释器中,我们生成一个随机的错误预测,看看模型正在学习什么。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/bcffa9a57e2ef559bd9c1eacf922cdae.png)

作者/项目团队提供的图片

一个错误的预测不足以得出明智的结论,但我们可以看到我们在全球特征重要性中看到的某些特征,如爬行动物和朱诺号港,有助于模型检测到它“应该”被捕获而不是清除。

关于这些模型的领域专家的进一步咨询将允许我们建立结果的有效性,并为我们指出模型迭代的下一步。我们可以展示高级数据解决方案在这一领域的价值,并阐明拥有一个强大而透明的系统,与专家的直觉合作,快速做出大规模决策的巨大价值。

从 Streamlit 中的 LEMIS 预测行动/处置可通过以下链接访问:

*   [简化应用](https://github.com/AniMadurkar/Machine-Learning-for-Global-Wildlife-Trafficking)

# 聚集来自潘吉瓦的货物

## **目标**

该分析的目标是在 Panjiva 数据结构中发现有趣的模式。与前面的目标相似,该分析的预期用户是希望了解装运之间关系的未来研究人员。在没有标签数据的情况下,我们希望能够提供包装之间的共性,这说明了对什么可能是非法的或不是的洞察。

## **数据清理&操纵**

对分类数据的分析表明,许多数据缺失。数据集中的大部分数据似乎都是自由格式的文本,所以我们很早就决定缺失的数据实际上包含有价值的信息。与我们对 LEMIS 数据集所做的类似,我们有选择地将包含空值的突出列重新标记为“未知”。然而,数据集中有一些列几乎从未被填充,所以我们被迫完全删除一些对建模没有意义的列。

## **特色工程**

我们想要探索两个特性集。第一种( **manifest clustering** )是严格处理用户提供的信息,使用最少的操作。第二个(**单词嵌入**)是关于描述装运内容的自由格式文本字段。

**货单聚类:**这里的想法是货单包含一些关于货物的事实信息(收货人、入境口岸、重量等。).该数据集包含混合的分类和连续数据类型,我们希望基于该事实信息进行聚类,以提供发货之间的关系。分类列被改为分类代码,而数字数据被标准化和规范化。

每个分类列都与其他列进行了相关性检查。通过手动检查删除了彼此高度相关的列。创建了最后一个特征来表示每批货物中缺失的列的百分比。这里的想法是,丢失列的数量可能在将包裹聚集在一起时起重要作用,因为非法运输可能隐藏信息。此外,个别装运的缺失数据用值-2 编码,而不是丢弃(如果缺失数据被丢弃,则几乎不会留下任何数据行;如上所述,缺失数据确实包含该领域中有意义的信息)。

**单词嵌入:** Panjiva 数据还包含一个自由形式的描述字段。我们希望根据用户*声称*在包中的内容将包聚集在一起。通过与我们的领域专家会面,我们了解到非法贸易通常隐藏在真实贸易中。所以用户不得不对货物中的东西撒谎。通过对这些自由形式的数据进行聚类,并将其与上面的货运清单信息相结合,研究人员有望识别出不寻常的包裹。为了做到这一点,我们创建了两个单词嵌入。我们使用了计数矢量器和 tf-idf 矢量器。在矢量化之前,我们执行了以下预处理,以确保我们使用足够的文本进行矢量化:

1.  停止单词删除
2.  数字删除
3.  单字母删除
4.  转义字符移除('/n,/r 等)
5.  移除包含任何数字的单词

步骤 3、4、5 都是在矢量化的多次迭代之后完成的。手动检查每个矢量化迭代,以查看哪些频率(术语/文档/等)是重要的,并编辑标记化,直到表示出有意义的单词。

## **模型开发&评估**

**清单聚类:**对于清单特征集,我们希望探索将分类变量和连续变量混合在一起的模型(我们也只检查了连续模型,但是通过与领域专家的讨论,我们了解到这些模型价值较低)。探索了不同的模型类型,直到为了处理大型数据集的性能和能力而选择了 [KPrototypes 集群](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.15.4028&rep=rep1&type=pdf)。KMeans 不用于任何分类数据,因为它将使用分类代码作为连续表示,这在数学上是不准确的。使用肘方法,我们确定了 5 个聚类组,充分解释了聚类之间的关系:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b5910d3ee8a395f53daf3004fb7ad642.png)

作者/项目团队提供的图片

聚类之间的分离也进行了视觉检查,虽然多维空间的二维表示具有挑战性,但我们相信大多数表示确实显示了聚类之间的良好分离,这表明我们在特征创建步骤中的假设是可靠的。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d7c78cf87842c6daa1171b4ace1700a1.png)

作者/项目团队提供的图片

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/267a8e6cf684e233fb5afa27178d6508.png)

作者/项目团队提供的图片

有趣的是,每个集群的装运数量并不相等,如下所示:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0831f0cea780646df8485b493502b6fb.png)

作者/项目团队提供的图片

这并不意外,因为这项研究的目标是为研究人员找到独特的装运进行调查。我们认为这是因为我们有许多与野生动物和产品相关的类似物品被运输。很可能,即使是非法运输也被贴上“频繁”运输的标签,以避免被怀疑和标记。

**单词嵌入:**在创建模型之前,我们想要检查矢量器本身的性能。为此,创建了余弦相似性度量。使用 NearestNeighbors 模块,根据整个数据集中前 10 个最接近的匹配检查了许多随机包。下面是一些结果示例(每个示例中的第一行是正在比较的行):

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/0bdc8408acbd91be1ef687f88f2dacf4.png)

作者/项目团队提供的图片

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/63148f395b42d4dbf6017cf7bab23da0.png)

作者/项目团队提供的图片

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/d2f32d00e93f079b538c118b4b5d9563.png)

作者/项目团队提供的图片

可以看出,矢量器似乎很好地解析了自由形式的字段。从这里开始,在矢量化的语料库上构建 KMeans 模型来对装运进行聚类。如 **a)** 所述,肘法用于确定适当的集群数量:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/41c55948885f785b03717e3638c2e94e.png)

作者/项目团队提供的图片

虽然没有像以前那样立即出现瓶颈,但我们确实看到更多集群的收益递减。我们为剩下的分析选择了 50 个集群,但是我们让研究人员通过 Streamlit 应用程序进行实际选择。

然后对每个集群的模型性能进行上下文检查。单词云的建立既是为了检查模型的性能,也是为了给研究人员一个每个集群包含什么的指示。下面可以看到一些示例:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/eecc7533e553afe15e7e7fbb0a3d9c01.png)

作者/项目团队提供的图片

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f137ea93fb3adca5407aa3701659fa23.png)

作者/项目团队提供的图片

我们希望使用这些词云来表示特定的日期范围和地理位置,以缩小我们关注的货物清单的范围。我们还要求 Bob 为我们未标记的 Panjiva 数据集提供一个“可疑”标签,这将为我们的模型能够辨别哪些聚类提供重要的见解。

可通过以下链接访问 Streamlit 中来自 Panjiva 的集群装运:

*   [简化应用](https://github.com/AniMadurkar/Machine-Learning-for-Global-Wildlife-Trafficking)

# 那又怎样?

亚历克斯、拉亚和我都相信,尽管前沿的模型、算法和工具既有趣又令人兴奋,但最重要的是你用数据为世界的某个方面提供了什么价值。由于尼尔·卡特博士和他慷慨地分享他的时间和知识,我们碰巧进入了全球野生动物贩运的世界。在这个世界上,我们花了大部分时间去了解他们面临的问题和他们的真实经历。我们发现他们的数据需求主要围绕以下方面:

1.  **易于访问的广泛数据分析,可帮助领域专家提出正确的问题**
2.  **一套广泛的大数据解决方案,提供可解释和可操作的结果**

我们希望我们的 Tableau 仪表盘和 Streamlit 应用程序能够提高人们对这个世界上突出问题的认识。大规模提供易于访问的高级分析可以帮助未来的研究人员和从业人员提出更好的问题,并利用证据调查非法贩运。我们希望它能够激励他们公开分享和使用数据,因为它对于将当前的解决方案从反应式转变为指令式具有巨大的价值。

# 工作说明书

ETL 脚本— Ani Madurkar

数据操作—所有团队成员

数据可视化和特征工程—所有团队成员

Tableau 中的探索性数据分析— Raya Abourjeily

从 LEMIS-Ani Madurkar 预测行动/部署

聚集来自 Panjiva 的货物— Alex Hardy

数据科学团队负责人— Ani Madurkar

特别感谢尼尔·卡特博士为我们贡献了这么多时间。我们的进步很大程度上归功于他的专业知识和热心帮助。

# 永久的数据科学:一种新型的数据马拉松

> 原文:<https://towardsdatascience.com/data-science-for-good-a-new-type-of-datathon-abeaedb37916?source=collection_archive---------17----------------------->

## 通过解决面向社会的问题来寻找最好的数据科学家

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/edf0a7b3ed6862b30923f34c04812118.png)

索菲亚·瓦尔科娃在 [Unsplash](https://unsplash.com/s/photos/buildings?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的照片

数据科学的绝大多数信息很可能与私营部门(如科技公司)和实现企业目标的编程技能相关。然而,在全球范围内,我们一直面临着多重社会挑战,如气候危机,清洁能源,野生动物保护,可持续发展的城市和许多其他问题。

事实上,联合国在其网站上有一个专门讨论“大数据促进可持续发展”的栏目**【1】**。类似的数据科学技术有助于实时了解人们的生活和福祉,并有针对性地为弱势群体提供干预措施。现代数据来源(*例如*卫星数据)、新技术和新分析方法,在负责任地应用时,可以使循证决策更加敏捷和高效。此外,它能够以公平和包容的方式衡量可持续发展目标的进展**【2】**。总的来说,有大量的机会将数据科学用于好的方面。

## **什么是世界数据联盟?**

[世界数据联盟](https://worlddataleague.com/) ( **WDL** )是一个最近成立的团队,致力于数据领域,希望看到数据科学对社会问题的真正影响。他们相信社区的力量,相信当数据专业人员共同努力改善世界时,取得重大成果是可能的。

他们拥有创建技术和非技术社区、为技术社区组织难忘的活动以及特定竞赛的经验。他们的目标是创建一个数据科学家的全球社区,共同竞争解决面向社会的问题。WDL 有四个关键支柱推动其社会驱动的目的:

*   *全球视角。他们认为知识多样性对解决全球问题至关重要。没有年龄、国籍、性别、种族之分;我们应该只关注解决方案。*
*   *支持数据科学家。*数据领域每天都在增长和发展,WDL 希望为数据科学家的发展做出贡献,就像他们为解决社会问题做出贡献一样。
*   *不扯淡政策*。解决社会问题必须脱离政治、销售产品和其他商业驱动的目标。所有的结果都将公之于众。
*   *作为一个联盟工作。WDL 的*任务是寻找并加冕世界上最好的数据科学家。他们将通过发起竞赛来解决面向社会的问题。

## **它是如何工作的?**

比赛分为六个阶段。每个小组应该有三到四名成员。此外,每个团队应该要么有一个国籍,要么是一个完全国际化的团队。申请阶段已经开始,将于 3 月 15 日结束。

然后,从 3 月 16 日到 30 日,选拔阶段开始了。WDL 竞赛要求最低的技术经验,包括基本的编程和数据科学技能)。他们将选出最多 50 支队伍。

在选拔阶段之后,联赛从 4 月 1 日开始,持续到 5 月 31 日。他们将选择一个主题(一个社会挑战)分成四个子领域,每个领域都成为比赛的一个新阶段。每个阶段将有两周时间,每次只允许提交一份提案。WDL 会记录分数,并在每个阶段结束时更新排行榜。

在一系列激烈的挑战后,WDL 将总结并宣布前 10 名决赛选手。从 7 月 15 日到 17 日(为期三天的活动),决赛选手将竞争解决一个社会问题。8 月,他们将宣布获胜者,并开放所有结果、数据和代码。

## **我有什么好处?**

嗯,很多。首先,你将有机会对重大社会问题产生全球性影响。因此,你将帮助拯救生命,支持我们的环境和子孙后代。第二,有一系列的奖品:

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/3a0fdd100e89e6c97ca924f7bf2d8bba.png)

竞赛奖品;图片由 [WDL](https://worlddataleague.com/) 提供。

## **准备申请?**

查看他们的网站了解更多细节和如何申请。第一个挑战是关于数据驱动的城市。根据联合国的数据,预计到 2050 年,68%的世界人口将居住在城市地区。目标是帮助实现第 11 个联合国可持续发展目标——可持续发展的城市和社区**【5】**。

## **结论**

数据科学的持续增长带来了许多机会和熟练的专业人员。然而,大多数努力和数据都是针对私营部门的。世界数据联盟通过发起一场激动人心的比赛来推动全球变化,为数据专业人士带来了一个全新的视角。作为一名数据和技术爱好者,你将有机会处理现实生活中的数据并解决社会问题:在第一个例子中,你和你的团队成员将专注于可持续发展的城市。因此,无论你是一名经验丰富的数据专业人士,还是仅仅[将职业生涯转向数据科学](/switching-career-to-data-science-in-your-30s-6122e51a18a3),这都是你一直在寻找的机会[脱颖而出](/what-makes-a-data-scientist-stand-out-e8822f466d4c),并产生重大的社会影响。

**感谢阅读。这里有一些你可能会喜欢的文章:**

</switching-career-to-data-science-in-your-30s-6122e51a18a3>  <https://medium.com/swlh/how-to-boost-your-coding-skills-c1911f78e63c>  </machine-learning-is-like-football-e3e3ace8ce7a>  

**参考文献:**

**【1】UN**[https://www . UN . org/en/sections/issues-depth/big-data-sustainable-development/index . html](https://www.un.org/en/sections/issues-depth/big-data-sustainable-development/index.html)

**【2】SDGs**[https://www . un . org/sustainable development/sustainable-development-goals/](https://www.un.org/sustainabledevelopment/sustainable-development-goals/)

**【3】https://worlddataleague.com/**[WDL](https://worlddataleague.com/)

**【4】成长中的城市**[https://www . un . org/development/DESA/en/news/population/2018-revision-of-world-urbanization-prospects . html](https://www.un.org/development/desa/en/news/population/2018-revision-of-world-urbanization-prospects.html)

**【5】第 11 个联合国可持续发展目标**[https://www . global goals . org/11-Sustainable-city-and-communities](https://www.globalgoals.org/11-sustainable-cities-and-communities)

# 政府绩效数据科学

> 原文:<https://towardsdatascience.com/data-science-for-government-performance-ec5300e4b0b?source=collection_archive---------32----------------------->

## [变更数据](https://towardsdatascience.com/tagged/data-for-change)

## 将您的数据科学项目建立在现有政府流程的基础上

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6e2611f681e1e0c0eda4a6251b6f8ae0.png)

由 [Carlos Muza](https://unsplash.com/@kmuza?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

这几年我听过这种对话的几个版本:

“我们已经很好地构建了后端数据库。它既稳定又灵活。我想增加一些处理速度,以确保移动访问和拉动不会减慢我们的速度,尤其是在我们构建了前端之后。

“我们为前端做了什么?人们可以使用移动应用程序来获取他们想要的任何数据,这怎么样?”

“我在考虑一系列交互式仪表盘。人们可以根据自己感兴趣的东西进行操作。”

“我认为无论我们建造什么,我们只需要向人们展示它在哪里,但我相信,一旦他们看到我们为他们汇编的数据,他们就会使用它”。

在整个对话过程中,我一直在想我不能参与,因为我不理解数据的用例。我不明白到底是谁在使用这些数据,使用的目的是什么。

在不了解这些东西的情况下,我也不能帮助头脑风暴前端解决方案。

我无法权衡当前的数据、分析和可视化是否足够。

因为,同样,我不明白*谁*在使用这个项目,以及*出于什么目的。随着这些对话的继续,我越来越确信数据科学团队也不知道这些事情…*

随着我在数据科学领域的工作越来越多,在研究上花费的时间越来越多,我越来越坚持认为我们应该将数据科学视为一种工具,而不是一种解决方案。

这在公共部门尤其如此,在公共部门,政府有许多不同于私营部门的动机、限制和考虑。

公共部门的问题和挑战是不同的。要么是因为政府试图完成或解决的事情的性质,要么是因为基于价值观的政治现实妥协塑造了公共部门的大部分面貌。公共部门的项目不是为了盈利,而是出于政治原因,提供私营部门没有的服务。

我参与了许多公共领域的数据科学项目,团队专注于让后端变得正确,开发一个独特而华丽的前端,并不断搜索更多数据,更多处理数据的方法。"我们可以在这里使用自然语言处理吗?",“这部分的预测算法怎么样”…“我打赌我们能得到更多的数据。”

在一些对话中,我从未听到团队谈论数据科学项目将如何实际使用。谁是该产品的最终用户。他们要用它做什么。

根据我的经验,从数据收集和处理到分析方法和前端设计,这些问题必须贯穿一切。

不幸的是,我也是这些项目的接收方。一个满意的数据科学团队向策略或运营团队演示了一个他们认为即将完成的项目,但我不知道他们希望我们如何使用它。我不明白他们怎么能走得这么远,却没有和我们商量一下,看看他们是否在正确的轨道上。

最终,这通常会导致大量的返工。或者在合同领域,交付一个很少被使用并且没有被维护的产品。

## 了解性能信息

公共部门数据科学团队必须了解所在部门的需求和限制。我认为,实现这一点的一个有用方法是将数据科学项目建立在现有公共部门流程和理论的基础上。

让我们从简单的开始,看看性能信息和描述性分析。

与私营部门的商业智能、关键绩效指标或业务分析不同,公共部门的绩效信息和绩效管理有许多独特的考虑因素和定义。

在过去的三十年里,绩效管理越来越受欢迎,越来越重要。它诞生于并赖以生存的理念是,政府需要由数据驱动,尽可能高效和有效——否则就需要改革或关闭。

多年来,绩效管理采取了不同的形式,但其基本理论基于两个标准。首先,政府项目必须能够设定标志着成功的战略目标,然后它们需要创建和收集绩效信息来衡量它们走向成功的进程。其次,政府管理者必须被赋予自主权,并被授权根据这些数据做出必要的领导决策,以引导他们的计划走向成功。

绩效管理系统已经由顾问立法、授权、提议,并通过“冠军计划”和“最佳实践”来实现。因此,大多数政府机构和项目现在对绩效信息和绩效管理有一定程度的基础设施、熟悉程度和经验。

## 利用现有能力和买入

这一背景是理解如何将数据科学流程整合到公共项目中的关键。此路径已经存在,因此在此基础上构建。与尝试设计、获得认可和获得额外资源来创建独立的数据科学项目相比,这是一个更容易的切入点。

> 而不是问“我们如何为这个群体建立一个数据科学项目?”,而是思考“我们如何使用数据科学来进一步支持这个群体的现有流程?”

## 了解主要考虑事项

一旦您找到了利用数据科学的自然切入点,请花些时间阐明并更好地理解现实目标。例如,虽然政府对绩效管理有强烈的支持和要求,但也有实际的限制。

一个关键的考虑因素是受众的性质。理论上,绩效信息的受众是国会、行政领导和拨款者。然而,研究表明,这些实体除了证明他们基于政治的信念和对项目或项目应该如何运行的意见之外,很少使用性能信息。

研究人员发现,绩效信息最成功的实施和使用是在机构或分机构一级。所以把注意力放在这些观众身上。

研究还发现了许多与更成功地使用项目数据相关的条件,如参与型和支持型领导,他们看到了绩效信息的价值;重新关注新目标的组织(相对于实施现有目标和使命);以及组织中是否存在足够的资源和数据科学能力。

还有其他的,但是这三个很重要。它们看起来很基本,但在开始新的数据项目之前,关注这些条件的存在是很重要的,希望组织能够在数据可用时“赶上”。

## 政治的现实

另一个关键的考虑是,即使是内部受众也不能将绩效信息视为客观的决策数据。许多研究人员已经证明,公共部门需要将关于政策和项目的主观数据与基于价值观的政治现实交织在一起。

知道了这一点,我建议不要争取规定性分析项目——因为它们通常不允许决策者所需的主观性和灵活性。相反,应力求提供准确的描述性统计数据,为决策和政策讨论提供信息。

由于数据利益相关者的可变性和复杂性,这一点也很重要。为了掌握这一点,要理解公共部门绩效管理的前景和广度,尤其是你正在从事的特定项目。

在联邦政府和许多州政府,这些绩效信息都是公开报告的。也许原始数据也向公众提供,但通常也有必要在预算请求和理由中纳入指标和分析。

这给受众增加了一个复杂的层次,因为虽然拥有准确的数据很重要,但如何计数、测量和报告这些数据是有限制的。定义数据的最准确方法可能不符合以特定方式计数和报告数据的法律要求,也不符合另一个实体希望它如何通知他们的计划或监督。

你现在感觉怎么样?这些要求和考虑事项都需要在您的数据科学团队讨论如何收集和显示数据之前解决?

但我不能强调这些设计步骤对于确保你的仪表板、KPI 或分析对项目或政策团队和领导层实际上是最有用的有多重要。

这些也不是不可能完成的任务,许多都遵循私营部门的类似做法,只需要对公共部门的特定方面稍加修改。

关键是,公共部门不仅希望数据科学帮助制定政策和交付计划,在许多情况下,法律要求使用数据科学。好处是了解如何设计和实施您的数据科学项目,以符合这些公共部门的规则和标准,从而使其有效。

在以后的文章中,我将从数据科学的角度介绍一些指导公共部门绩效信息和管理的具体规则和要求。

# 教育数据科学——一场值得期待的革命

> 原文:<https://towardsdatascience.com/data-science-for-personalized-learning-bad7385bc7c4?source=collection_archive---------29----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/69ce3a0186f772775a5082bc850ae81e.png)

蒂姆·莫斯霍尔德在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片

> **教育是你可以用来改变世界的最强大的武器——纳尔逊·曼德拉**

教育是创造更美好世界和提高生活质量的第一步。不可否认,它有足够的力量来改变这个世界,从促进社会平等、应对气候变化到消除贫困。但在当今世界,学习危机仍然是最大的全球性挑战之一。

“最近发展区”的概念是一种学习和发展理论,它认为每个人都有一系列技能,这些技能被认为是最近的,因为他们需要一些指导和适当的帮助来独立获得技能。这就是个性化学习发挥作用的地方。

个性化学习是一种教育方法,旨在了解学习者当前的知识状态,并根据每个学生的优势、需求和技能定制学习,以支持他们的学习旅程。然而,在整个过程中,评估在实施持续的评估和反馈机制以改善学习方面起着关键作用。传统上,评估包括测试学习者知识/技能的一套问题,并提供定量反馈。他们专注于有效地评估考生,但未能提供任何反馈。这就需要一种新的评估方法来应对这一挑战。

教育中任何评估的目的都是了解学习者当前的知识状态,包括他们知道什么和不知道什么,并提供适当的反馈。学习者可以处于学习旅程的不同阶段,对不同的主题有不同的理解水平。所有人需要的是及时的评估和反馈,以衡量他们的进展,并进入正确的轨道。因此,一刀切的评估方法不能有效地实现这一目标,还可能导致学习成绩不佳。随着现有技术的进步,有很大的潜力转向更个性化和适应性更强的考试,使教育和学习更有效和更有意义。

适应性评估是一种新的范式,有可能弥合这一差距。它可以被定义为根据每个学习者的表现为其量身定制的评估。它确保根据学生的理解水平对他们进行测试。这些评估的主要目的是确定学生的核心能力以及他们需要培训的薄弱领域,并提供有用的反馈,同时制定个性化的学习计划,以建议采取适当的行动来填补知识缺口。

适应性应用程序的优势包括快速有效地识别学习差距,促进自学,提供关于个人进步而非竞争进步(同龄人之间的进步)的反馈,以及识别概念性理解和清晰度较低的领域,以便学生知道在哪里关注。适应性应用程序作为一个支持系统,减少沮丧的机会。

评估不应该像传统学习那样只在结束时进行,还应该从一开始就进行,并贯穿整个教学过程。

学习周期中的 3 个评估阶段包括:
***1 .课程开始时的适应性预测试*** (诊断阶段)在课程开始时确定学习者的当前知识。
***2。在课程中途进行适应性测试*** (形成性评估),以确定学生在课程期间难以理解的主题或概念,以便对教学方法进行调整
***3。课程结束时的适应性测试*** (终结性评估)对学生进行有效的评估和评分

以下是一些适应性评估方法,我认为可以通过利用当今的技术来实现:

**3.1 基于学习能力的自适应**
Rasch 模型是自适应评估应用中最简单的模型之一,其中学习者的反应行为由项目反应理论(IRT)模型建模。学习者行为被表示为称为能力的单个特征,并且该项目基于难度来表征。因此,学习者解决任务的概率仅仅基于这两个特征,即他们的学习能力和项目难度。这是一个最大似然估计问题,其中学习者的能力是目标变量,给定每个项目的难度参数。

**3.2 基于知识的适配**
该适配基于知识空间理论。与基于项目反应理论的系统一样,该领域由一组测试项目定义。基于 IRT 的系统大多是二分法和一维的,其中学习者的技能是基于单个主题进行评估的。相反,基于知识的适应测量一组被称为知识状态的技能,知识状态被定义为学习者能够解决的一组项目。这种方法允许逐步测试技能集,而不是单个问题。

**3.3 基于情感和认知状态分析的适应**

基于情感和认知因素的自适应学习系统是基于模糊理论的。它由 4 个模块组成,即学习模块、测试模块、学习状态记录模块和专家系统模块。学习模块包含模块内容,测试模块进行测试以评估单个学生的知识。学习状态记录模块以系统日志的形式记录学生的学习行为。专家系统模块分析情感表现并建议合适的学习材料。为了评估学生的情感表现,基于系统日志来评估诸如集中程度、耐心和意愿之类的特征。这些特征基于应用中的实验技术被量化。例如,注意力水平是根据他们在阅读材料时对弹出窗口的反应速度来评估的。

**3.4 基于能力的适应**
有学习障碍的学生有独特的优势和需求。对于阅读困难的学生,自适应评估应用程序可以利用文本到语音转换技术来帮助学生读出评估问题。对于有写作困难的学生,可以利用语音转文本、拼写检查和单词预测软件等技术来简化评估过程。它可以通过将测试的形式从文本改为基于口头的来进一步调整,并且评估可以是 MCQ 的形式或一个单词的答案,以减少写作量。对于有计算障碍的学生来说,他们很难管理时间,问题可以被分成更小的单元,并以逻辑顺序呈现给他们。

**3.5 作为推荐系统的自适应评估应用**
基于推荐器的自适应评估应用使用基于内容和混合(基于内容和协同过滤)的推荐技术来预测学生表现。预测模型将 3 个特征作为输入来预测每个问题的学生表现。这些特征包括问题的难度、用户的问题难度、给定他的能力和猜测概率。结果表明,结合协同过滤的矩阵分解方法给出了最准确的预测。

**3.6 多阶段测试**
多阶段测试结合了基于计算机的测试(静态问卷)和计算机自适应测试(自适应问卷)的优点。在这个框架中,测试被分为不同的阶段。它类似于 CAT,但不同于 after each item,它根据前一阶段的综合表现来定制评估。每个阶段包含几个代表不同难度水平的小测验/模块。在完成给定阶段的模块后,根据他们的表现,学生将进入下一阶段难度适当的模块。

**3.7 基于游戏的适应性评估(隐形评估)**
该方法采用基于游戏的学习框架方法,该方法使用以证据为中心的设计(ECD)根据学生的游戏表现对其进行评估。这些游戏旨在适应特定班级或一组学生的学习大纲和课程。在游戏过程中,学生在执行复杂任务的同时产生一系列动作,展示技能或能力,如科学探究技能、创造性解决问题、交互式解决问题、适应挑战、组织和系统思考技能,这些都需要评估。

在目前新冠肺炎疫情的情况下,世界上大多数教育机构已经转移到网上。由于面对面的师生互动不再存在,确定和评估学生的理解就更加困难了。这场全球危机暴露了当前教育体系中的重大漏洞,并表明传统的教育指导和评估方法是多么无效。目前,迫切需要在线自适应评估工具,能够在整个课程期间提供学生学习进度的实时反馈。通过这些系统收集的信息可用于为学生、教师和课程开发人员提供即时可行的见解,以实现有效学习。

随着人工智能领域技术进步的现状,将人工智能集成到在线自适应评估系统中可以引导现有学习系统的重大转变。

# 数据科学促进可持续发展

> 原文:<https://towardsdatascience.com/data-science-for-sustainability-b912d5fb5d24?source=collection_archive---------7----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/9f4d80f6941fe94bdc984fdc061be786.png)

在 [Unsplash](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上 [Sierra Dungan](https://unsplash.com/@sierrduh?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 的照片

## 如何应用数据科学造福人类和地球,而不仅仅是商业

**数据科学** 和**可持续发展**是两个似乎无处不在的流行语。[每个人](https://knowledge.wharton.upenn.edu/article/whats-driving-demand-data-scientist/)都想用数据做*某事*。科技公司并不是唯一利用数据来优化流程、产生有价值的见解和创造新产品的公司。与此同时,在可持续发展领域,政府、公司和个人都在努力应对气候危机。人们正朝着一个更加公正的未来努力,减少不平等,为世界上更多的人带来更多的繁荣。

数据科学通常用于解决[业务问题](https://builtin.com/data-science/data-science-applications-examples)。这些包括检测欺诈、优化运输路线和预测需求。然而,越来越多的组织和个人要求更多。数据和数据科学应该用来解决我们面临的生存问题。越来越多的平台为了社会利益推广数据。各种[黑客马拉松](https://data-teams-unite.devpost.com/)和[竞赛](https://www.drivendata.org/)试图解决社会问题。

这篇博文介绍了数据科学和可持续发展的交集。我将举例说明**如何利用数据科学来改善我们和后代的生活**。使用数据创造积极的社会影响的方式有很多。首先,我想强调一些引人注目的使用案例。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/e7cc46ece3b24360c6c54217624c834b.png)

由[迪米特里·阿尼金](https://unsplash.com/@anikinearthwalker?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

# 什么是可持续发展?

对于不熟悉可持续发展概念的人,我将提供一个简单的概述。围绕可持续发展的[术语](https://www.researchgate.net/publication/223250145_Review_of_sustainability_terms_and_their_definitions)包括**各种相关概念**和定义。最常用的术语之一是*可持续发展*。它在 1987 年的[布伦特兰报告](http://www.un-documents.net/our-common-future.pdf)中首次提出,描述如下:

> 可持续发展是既满足当代人的需求,又不损害后代人满足自身需求的能力的发展。

**三个同样重要的领域**也是[可持续发展](https://circularecology.com/sustainability-and-sustainable-development.html)的特征。这些因素包括*环境*、*社会*、和*经济*因素。所有这些领域的目标、需求和问题都必须得到解决。只有这样,才能确保地球、社会和经济的可持续发展。联合国已经制定了与这些领域相关的 17 个可持续发展目标。同时实现这些目标将确保今天和未来的繁荣与和平。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/77c52e903320154e8d1de9246dd1862b.png)

由 [Markus Spiske](https://unsplash.com/@markusspiske?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

# 数据科学如何支持可持续发展?

可以通过各种方式利用数据科学来实现可持续发展。以下示例与**衡量影响、管理资源、气候变化和健康&平等**相关。

## **了解我们的立场**

上面我提到了联合国制定的 [17 SDGs](https://sdgs.un.org/goals) 。有目标是好事。但是你需要量化相关的指标来确定你的进展。这就是为什么[我们的世界在数据](https://ourworldindata.org/)中创造了 [**SDG 追踪器**](https://sdg-tracker.org/) 。它利用了来自联合国和其他国际组织的数据。跟踪系统提供数据可视化和指标解释,明确目的是让政府对其承诺负责。

然而,由于缺少数据,无法全面评估几个目标。这突出了这些宏观指标存在的[数据可用性问题](https://sustainabledevelopment.un.org/content/documents/95519_Ebikeme%20et%20al.__Open%20Data%20in%20a%20Big%20Data%20World__challenges%20and%20opportunities%20for%20sustainable%20development.pdf)。 [**开放数据**](https://blogs.worldbank.org/digital-development/new-discussion-paper-how-open-data-can-drive-sustainable-development) **平台和应用**的开发因此至关重要。数据收集和将现有数据转化为机器可读格式是绘制现状图所必需的。可持续发展目标全球伙伴关系是支持和协调这些努力的一个机构。

关于数据科学如何应用于理解我们现在所处的位置,还有更多例子:

*   [Bayes Impact](https://www.bayesimpact.org/en/) 解决了**加州市民与警察**暴力冲突的数据缺口。他们的[开源 web 工具](https://www.bayesimpact.org/en/focus/justice)简化了执法机构捕获和报告这些数据的过程。这可以作为重建社区和警察之间信任的起点。
*   卫星图像用于收集与减少贫困和饥饿相关的数据<https://fsi-live.s3.us-west-1.amazonaws.com/s3fs-public/fse_research_brief_final.pdf>**。这个数据否则很难**收集。根据天气条件和作物生长情况来估计作物产量是可能的。可以确定特别脆弱的人群,并且可以有效地有针对性地提供帮助。****

**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/27ce4f94704176dd583847938a7000ef.png)**

**劳拉·米图拉在 [Unsplash](https://unsplash.com/s/photos/waste?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄的照片**

## ****管理资源和浪费****

**塑料垃圾是一个严重的环境问题。世界各国已经开始禁止使用一次性塑料制品。然而,并不是所有的塑料都能被减少。此外,现有的废物也需要处理。不幸的是,我们的许多废物最终都流入了海洋。这给海洋生态系统带来了严重的问题。**

**[海洋清理](https://theoceancleanup.com/) [研究出](https://theoceancleanup.com/great-pacific-garbage-patch/)海洋中最大的近海塑料带。他们以塑料片和图像的形式收集数据。在计算和数学方法的帮助下,他们分析了数百万个数据点。他们使用**图像识别**来识别漂浮在这个塑料区周围的是什么类型的垃圾。他们还利用图像和收集的塑料垃圾估算了塑料碎片的总重量。(你可以申请成为清理海洋的志愿者。)**

**我们还必须改变我们的行为,以减少我们对地球的负面影响。然而,改变个人消费模式以购买更可持续的产品可能很困难。研究和比较各种选择非常耗时,因此经常会对可持续选择造成障碍。减少努力不是很好吗?一个[研究项目](https://www.cdrc.ac.uk/research/ethical-and-sustainable-consumption-2/)正试图解决这个问题。一个名为**的人工智能购物助手**正在开发中,用于帮助识别网上购物中的道德产品。**

****使用数据科学管理资源和浪费的其他示例**如下所示:**

*   **[**图像识别** **可用于分类回收设施中的**](/how-to-build-an-image-classifier-for-waste-sorting-6d11d3c9c478) 。**
*   ****预测可回收利用的塑料废物****可以填补重大的数据空白。公司需要更好地了解可用数量。只有这样,更多的回收塑料才能用于新产品。当前的回收塑料市场缺乏透明度和信息。****
*   ****[**卫星数据和图像识别**](https://www.nature.com/articles/s41598-020-62298-z) 可用于识别导致塑料进入海洋的河岸和沿海塑料热点。****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/7bae11dd0690d49102f3768aaecadb8f.png)****

****安德斯·吉尔登在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片****

## ******减缓和适应气候变化******

****交通部门是造成气候变化的一个重要因素。它负责 [16%的全球总排放量](https://ourworldindata.org/emissions-by-sector)。大多数导航系统会向驾驶员建议最短的路线。但是这并不总是最省油的方法。因此,一项现有的[研究工作](http://www.buffalo.edu/transinfo/Research/transportation-operations/greennavigation.html)正在开发一个系统,该系统可以建议**使用最少燃料的路线**。这导致了排放的减少。****

****然而,提高效率是不够的。个人驾车出行需要减少,代之以公共交通、骑自行车或步行。**移动性数据可用于** [**分析出行模式**](https://www.mdpi.com/2071-1050/10/10/3489/htm) **。**这些可以告知公共交通基础设施,使其[更加人性化](https://www.wri.org/blog/2016/02/real-time-transit-data-good-people-and-cities-whats-holding-technology-back)。在[市区](https://www.researchgate.net/publication/258241546_Patterns_of_sustainable_mobility_and_the_structure_of_modality_in_the_Randstad_city-region),可以调整时间表、容量和可用的运输选项。这可能会促使更多的人转向更可持续的交通方式。****

****减轻或减少气候变化的影响非常重要。然而, [**极端天气事件**](https://cmccclimate.medium.com/predicting-extreme-weather-events-f56170446860) 的数量将会上升。这使得适应气候变化越来越重要。极端天气事件的预测[对于识别最有可能遭受最严重袭击的地区是必要的。可以及早组织救助,必要时可以疏散人群。](https://news.developer.nvidia.com/deep-learning-accurately-forecasts-extreme-weather-events/)****

****以下是有助于减缓或适应气候变化的进一步例子:****

*   ****数据科学可以帮助在[以多种方式](https://www.kdnuggets.com/2019/09/top-10-data-science-use-cases-energy-utilities.html)创造**更可持续的能源部门**。[一个例子](https://arxiv.org/abs/1504.02424)是通过动态能源管理支持[智能电网](https://www.iea.org/reports/smart-grids)。例如,这包括生产计划和预测。****
*   ****[机器学习](https://www.spglobal.com/en/research-insights/articles/how-can-ai-help-esg-investing)帮助投资者选择最**社会和环境可持续的公司**同时盈利。将资金从污染者转移到对社会负责的公司,有助于为可持续的商业行为提供资金,并迫使落后者采取更多行动。****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/4e0e83552fa6f14f9f60bb124644cf30.png)****

****乔安娜·科辛斯卡在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片****

## ****为一个更加公正的世界做出贡献****

******由于冠状病毒疫情,数据科学和医疗保健的交叉领域**可能是最知名的领域之一。成千上万篇关于这个话题的文章已经发表。他们分析疫情的影响或者帮助研究人员理解数据。此外,移动性数据已用于[分析封锁措施的效果](https://www.covid-19-mobility.org/data-info/)。但是数据科学可以在更多的方面为医疗保健做出贡献。****

****我已经提到了为什么交通基础设施和模式需要改变。然而,交通数据也可以用来**增加包容性**。世界资源研究所在 T2 列举了无数数据如何帮助提高城市平等的例子。印度尼西亚的三宝垄市利用从移动数据中获得的见解。他们在公共交通站安装了更多的路灯。他们增加了座位,并普遍改善了弱势群体的通道。这有助于更加平等。它还鼓励向更环保的交通方式转变。****

******更多有助于健康、平等和其他社会问题的例子**列举如下:****

*   ****50x2030 计划[帮助低收入国家**建立农业数据系统**。这些包含来自家庭和商业农场的信息。这些数据可用于为政策决策提供信息,并以最佳方式进行农业投资。最终目标是战胜饥饿。](https://www.50x2030.org/about)****
*   ****世界银行的 SABER 项目收集并评估教育系统的数据。它旨在提高教育质量。各国可以通过以循证标准为依据的政策来加强其教育系统。****

****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/69cd8023946cb98a407ea617cb140c02.png)****

****照片由[杰瑞米·托马斯](https://unsplash.com/@jeremythomasphoto?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄****

# ****结束语****

****为了确保子孙后代在一个健康的星球上过上和平繁荣的生活,我们仍有许多工作要做。上述例子展示了数据科学可以提供帮助的令人信服的方式。****

****但是你怎么能帮上忙呢?也许在你的下一个项目中,你可以分析一些[社会相关数据](https://www.kaggle.com/laiyipeng/data-science-in-developing-countries)。还有许多致力于将数据应用于公益事业的计划。他们中的一些人愿意接受志愿者的帮助。您还可以考虑在现实生活中是否可以在您的社区中使用您的数据科学技能。****

****也许这些选项目前都与你无关。**良好的第一步是意识到我们面临的一些环境和社会问题**,数据科学可以用来帮助解决这些问题。****

****你想在媒体上阅读更多高质量的故事吗?考虑注册一个支持我和其他媒体作者的会员。****

****<https://medium.com/@julia.nikulski/membership> **** 

****你是否处于项目之间,不知道下一个项目该做什么?查看我的**指南,了解如何开发独特的数据科学项目创意**。****

****</5-steps-to-develop-unique-data-science-project-ideas-6c2b3a0014b> ****

# 心脏数据科学

> 原文:<https://towardsdatascience.com/data-science-for-the-heart-c654135ceee5?source=collection_archive---------19----------------------->

## 心血管疾病数据分析和预测建模

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/ed70545aa209cd0e56795c63085dce5f.png)

[李东旻](https://unsplash.com/@alexleegdp?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍照

# **简介**

这种数据探索和预测分析的目的是为了更好地了解哪些健康因素影响患者的心脏病风险。为此,将对数据进行介绍,并对数据集中的健康因素进行图形分析。将介绍预测建模过程,给出逻辑回归预测模型评估的背景。该评估将包括审查混淆矩阵中的性能指标。最后,将通过一个具体的例子来解释模型的计算,以说明这些因素是如何推动预测的。

# **数据集解释**

为该项目选择的心脏病数据集来自 [UCI 机器学习库](https://archive.ics.uci.edu/ml/datasets/heart+disease)。该数据集由 461 名患者的数据组成,描述了个体的健康因素和心脏病的诊断。本项目中使用的数据集中的 12 个健康因素概述如下。

1 **。年龄** —以年为单位的患者年龄

2.**性别** —患者的性别

*   *0 表示母*
*   *1 表示公*

3. **CP** —患者胸痛类型

*   *1 表示典型心绞痛*
*   *2 表示非典型心绞痛*
*   *3 表示非心绞痛性疼痛*
*   *4 表示无症状患者*

4.**trest bps**——以毫米汞柱为单位的静息血压

5.**胆固醇**——血清胆固醇,单位为毫克/分升

6.**空腹血糖** —空腹血糖

7.**静息心电图** —静息心电图结果

*   *0 表示正常*
*   *1 表示有 ST-T 波异常*
*   *2 表示可能或明确的左心室肥大*

8. **Thalach** —达到最大心率

9.**Exang**——运动诱发心绞痛

*   *0 表示无*
*   *1 表示是*

10. **Oldpeak** —运动相对于休息诱发的 ST 段压低

11.**斜率**——运动 ST 段峰值的斜率

*   *1 表示上坡*
*   *2 指示平面*
*   *3 表示下坡*

12.**心脏** —心脏病的诊断

*   *0 表示缺席*
*   *1 表示存在*

为了进行分析和预测建模,对数据进行处理,以便对年龄、静息血压和血清胆固醇因素进行分组。

# 数据分析

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6c3bf139948e269a980fe626bc8ba406.png)

图 1 中的上表为理解数据集中的健康因素如何相互关联提供了基础。在年龄栏中,trestbps(静息血压)和 thalach(达到的最大心率)是与年龄最相关的因素。随着患者年龄的增加,他们的静息血压趋于增加,而他们达到的最大心率趋于降低。年龄和有氧运动之间的相关性是正相关的,但是这种相关性不是很强,其值为 0.176。

特别感兴趣的是表格中关于心脏疾病诊断的那一行。这一行显示了有氧运动和其他健康因素之间的相互关系。与有氧运动相关性最强的一些因素是 cp、thalach、exang、oldpeak 和 slope,它们在数据集说明部分有定义。虽然年龄和性别与心脏因素没有很强的相关性,但这并不是说不能从这些因素中得出结论。通过观察年龄和性别分组之间的趋势,分析这些因素如何与心脏因素相互作用,揭示了患者的年龄和性别如何在统计上影响心血管疾病的总体风险的额外信息。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/97ae397e0f3ff12c1b998914cf31847b.png)

数据样本包括总共 461 名患者,其中 124 名为女性,337 名为男性。在分析数据时,考虑患者性别之间的样本大小差异是很重要的,因为整个人群的趋势将向更大群体的方向转变。数据集中患者的年龄范围从 30 岁到 79 岁。上图 2 显示了按性别和年龄分列的患者人数。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/5ea6dcb734424335aee7b79ca88a0c18.png)

按年龄分组在上面的图 3 中,数据显示心血管疾病的百分比通常随着患者年龄的增加而增加。一个异常值是在 70-79 岁的人群中,心血管疾病患者的比例从 60 多岁的 69.2%下降到 70 多岁的 58.8%。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/f76f3341e9583291bba8794637355a2a.png)

如上图 4 所示,男性和女性之间的心血管疾病比例存在很大的不平衡。在该数据集中,男性患者患心血管疾病的可能性是两倍多,66.5%的男性患有该疾病,而女性只有 29.8%。

使用从分别按性别和年龄查看数据中获得的知识,下面的图 5 结合了这两个因素,给出了一个更详细的视角。数据显示,男性患者和老年患者更有可能患有心血管疾病,图 3 和图 4 也显示了这一点。图 5 进一步详细说明了年龄和心血管疾病之间的关系,这种关系在男性和女性中都是成立的,并且不仅仅在作为一个整体的样本人群中观察到。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b7c0256ef0efa3934a669082155d8a14.png)

一个异常值是 70 多岁的女性,60 多岁女性的患病率从 41.7%下降到 0%。在图 3 中,这是导致 60 多岁到 70 多岁的男女患者之间疾病百分比显著下降的因素。应该注意的是,对于男性来说,年龄和更高的心血管疾病百分比之间的相关性适用于数据集中的所有年龄组。

对于一个边远的女性年龄组,应该注意的是该组的样本量是所有组中最小的。图 2 显示只有 1%的数据样本,461 名患者中的 5 名是 70 多岁的女性。与所有其他年龄和性别群体相比,这一比例非常低,30 多岁的女性除外。

虽然年龄和性别是数据集中最容易获得的健康因素,但它们不是本次数据探索中使用的唯一测量方法。例如,血压是患者患心血管疾病风险的一个重要因素。下图 6 是按性别和血压分组的。血压分类是基于哈佛健康出版社的指南。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/640fecb62b904220bd425e2d0ed91327.png)

对于女性和男性来说,较高的收缩压测量值与较高的心血管疾病风险相关。一个异常值是[130,139]收缩压分组中的男性,患有该疾病的患者百分比下降了 0.3%,从之前的[120,129]分组的 61.7%降至 61.4%。

对于女性来说,各组之间心血管疾病风险的变化相当稳定,而对于男性来说,这种变化随着血压分组的增加而增加。女性和男性群体之间疾病风险的平均变化分别为 12.73%和 10.85%。

图 6 继续显示了数据集中女性和男性心血管疾病发病率的差异。收缩压读数在[90,119]之间(被认为是正常测量值)的男性患心血管疾病的可能性仅比最高血压分组[180,200]中的女性低 3.4%,最高血压分组被认为是高血压危象患者的测量值。

# **数据集资源**

可以在下面的 [GitHub 存储库](https://github.com/SulemanBazai/Cardiovascular-Disease-Data-Analysis-and-Predictive-Modeling)中找到清理后的数据集,以及用于创建上述图表的数据透视表。请随意下载该文件,以进一步将数据分割成不同的可视化效果。还有许多额外的列代表健康因素,这些因素在本次讨论中没有具体深入地可视化,但在逻辑回归预测模型中使用。

# **预测模型流程**

本研究中使用的预测模型是逻辑回归模型。在这种情况下,逻辑回归是一种有效的模型,因为被预测的因变量要么为真,要么为假,要么为 0。预测值为真或 1 表示预测患者患有心血管疾病。false 值或 0 表示预测患者不会患病。对心脏数据点的预测基于给定的输入,即数据集中的 11 个其他健康因素。

用于构建、训练和测试逻辑回归模型的软件是 [Orange](https://orangedatamining.com) ,这是一个开源的机器学习和数据可视化工具包。图 7 显示了详细描述模型设置和模型性能评估执行的可视化。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/af620cada4d53e2764afe0b6cd68c101.png)

简单总结一下这种可视化

1.  数据集被加载到工作空间中,由**数据文件**小部件表示
2.  数据被送入**数据采样器**,采样器将数据分成两组
3.  集合 1 是**训练数据**,包括大约 85%的总数据
4.  第二组是**测试数据**,约占总数据的 15%
5.  训练数据被输入到**逻辑回归**模型小部件中以构建模型
6.  逻辑回归模型和测试数据被映射到**预测**小部件,在那里根据测试数据评估模型
7.  生成**混淆矩阵**以进一步分解模型的性能
8.  **解释预测**小部件映射逻辑回归模型,以及训练和测试数据,以解释哪些特性对单个实例的预测贡献最大,以及它们是如何贡献的

# **使用混淆矩阵的模型评估**

用于描述模型性能的评估度量是混淆矩阵。混淆矩阵中的两个可能类别是 0 和 1,或者假和真。预测值为 0 或假,表示模型预测患者没有心血管疾病。预测值为 1 或 true 表示模型预测患者患有心血管疾病。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b57c26f3d08e9847af1a629d17df854f.png)

有了这些知识,可以定义以下术语

1.  **真阴性**(TN)——模型预测为 0 的情况,即患者没有心血管疾病,并且患者没有该疾病
2.  **真阳性**(TP)——模型预测 1、患者患有心血管疾病且患者确实患有该疾病的情况
3.  **假阴性**(FN)——模型预测值为 0 的病例,即患者没有心血管疾病,而患者确实患有该疾病
4.  **假阳性**(FP)——模型预测 1,患者确实患有心血管疾病,而患者并未患病的情况

根据这些定义,一个完美的模型将使每个案例都属于真阴性或真阳性类别,而没有案例属于假阴性或假阳性类别。因此,构建模型时的目标应该是减少 FN 和 FP 案例。

对于预测心血管疾病的特定情况,降低 FN 等级是至关重要的,因为在这些情况下,患者被预测没有患病,但确实患病。如果根据这种预测做出治疗决定,这些患者可能无法接受心血管疾病的适当治疗或药物治疗。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/1b02b34bfe453d8bc536d3fc9b2fc87e.png)

上面的混淆矩阵显示了对测试数据进行评估时逻辑回归模型的 TN、TP、FN 和 FP 值。总共有 77 名患者包含测试数据,约占总数据集的 16.7%。为了评估模型的性能,将定义一些额外的术语及其相应的值。

1.**准确性** —模型总体正确的频率

*   *(TN+TP)/总计= (37 + 26)/77 = .818*

2.**回忆** —当实际值为 1 时,模型预测为 1 的频率

*   *TP/(TP+FN)= 26/(26+6)= . 813*

3.**精度** —当预测值为 1 时,模型正确的频率是多少

*   *TP/(TP+FP)= 26/(26+8)= . 765*

4. **F1 得分** —召回率和准确率的加权调和平均值

*   *这个分数往往比单独的准确度更有用,因为它同时考虑了 FP 和 FN*
*   *2*(召回*精度)/(召回+精度)= 2 *(0.813 * . 765)/(. 813+. 765)= . 788*

5.**零错误率** —如果模型总是预测为 0,那么模型出错的频率

*   *0 是上述*混淆矩阵测试数据中的多数类
*   *(实际 1)/合计=(FN+TP)/合计= (6 + 26)/77 = .416*

这些度量通过对混淆矩阵的评估,总结了逻辑回归模型的性能。从召回可以看出,该模型正确地捕获了 81.3%的患有心血管疾病的患者。从精度可以看出,当模型预测患者患有心血管疾病时,该预测在 76.5%的情况下是正确的。

零错误率为 41.6%,一个总是预测 0 的模型,即患者没有心血管疾病,在 58.4%的时间里是正确的。这可以用作比较实际逻辑回归模型的基线指标。由于准确率为 81.8%,召回率为 81.3%,精确度为 76.5%,F1 值为 78.8%,很明显,逻辑回归模型在统计上优于总是预测患者没有疾病的基本模型。

# **预测解释**

图 10 是一个预测解释视图,它基于模型解释了特性对单个实例的预测的贡献程度。解释中的目标类别是 1,意味着模型正在评估患者是否被预测患有心血管疾病。如果特征贡献总计超过 0 . 5,则心血管疾病的预测将是 1。类似地,如果特征贡献总计低于. 5,则对于没有心血管疾病的患者,预测将是 0。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/37c08b154fb52ad2df22bbd9220f5e44.png)

从图中可以看出,灰框中的. 35 是模型计算出的概率,表示患者没有被预测到患有该疾病。对于预测,贡献最大的特征是患者的性别、运动诱发的心绞痛类别、胸痛类别和胆固醇组类别。本例中的患者是女性,由性别=0 = 1 指定。在这些类型的情况下,分类要素以格式 feature-name=feature-value = 0/1(假/真)标注。

与患者为女性相关的蓝条中的 0.29 表明该因素将患该疾病的计算概率降低了 29%。类似地,exang=0 = 1 表明患者没有运动诱发的心绞痛,将计算出的患病概率降低了 12%。

红色条中的 0.06 与胆固醇组 3 有关。这表明,处于这一胆固醇分组中的患者患心血管疾病的计算概率增加了 6%。胆固醇分类是基于梅奥诊所的指南。

# **结论**

这种对心脏病的数据探索和预测分析已经确定了哪些健康因素在统计上影响患者的疾病风险,以及这些因素对风险的影响程度。图形分析和预测解释都表明,即使是来自患者的有限数量的健康数据也可以提供一个模板来了解他们的疾病风险。

混淆矩阵中的评估支持了这种理解,其导致了 81.8%的总体模型准确性。该模型的召回率为 81.3%,即当患者确实患有疾病时,该模型预测患者患有该疾病的频率。模型的精确度,即当预测值为患者患有疾病时,模型正确的频率为 76.5%。从这种表现可以得出结论,导致心脏病的健康因素可以被识别并用于更好地了解患者的疾病风险。

# 从零开始的数据科学

> 原文:<https://towardsdatascience.com/data-science-from-scratch-95bcda8d4897?source=collection_archive---------12----------------------->

## 意见

## 从零开始学习数据科学的可行建议

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/29520b41a1274e44ff1f334e1d9aecdd.png)

[马克·埃德尔](https://unsplash.com/@m______________e?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/nothing?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【1】上拍照。

# 目录

1.  介绍
2.  现在掌握 Python 或 R Essentials
3.  练习 5-10 种机器学习算法
4.  向非数据科学家解释建模
5.  摘要
6.  参考

# 介绍

虽然可能有一些从零开始的数据科学方法,但我想谈谈我的看法,并思考如果我重新开始,我会做些什么。就我而言,我从零开始,主修一个非数据科学的领域,开始我的本科学位。在我经历了第一份职业后,我决定从事数据科学,并在当时的工作中尽可能多地学习和应用与数据分析、数据科学和编码有关的知识。我没有四年的软件工程背景,所以我认为我过去研究数据科学的方法可以引起很多人的共鸣。话虽如此,有些事情我可能会采取不同的做法,但总的来说,我对自己从零开始数据科学生涯的方式感到高兴,并希望成功地将一些智慧传递给你。

# 现在掌握 Python 或 R Essentials

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/6c9a72356d0c9ab23a84be6097dcaa7c.png)

由[亚历克斯·丘马克](https://unsplash.com/@ralexnder?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/python?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【2】上拍摄的照片。

一些学生或专业人士有多年的软件工程或软件开发背景,向数据科学的编码方面过渡会很容易。然而,仍然有很多人没有这样的背景,特别是如果他们真的是从零开始。在我的经历中,我一边学习代码,一边学习统计,同时还学习常见的机器学习算法。要重新来过,我建议你只专注于编程,不要担心数据科学,直到后来,这取决于你的时间表。您可以选择 Python 或 R 作为主要编程语言之一开始,通常只有一种语言会是您职业生涯中使用的主要语言。

*除了先学习 Python 和 R essentials,学习 SQL 也很重要。*

但是在本文中,让我们把重点放在 Python 和 R 上。这两种语言实际上更多的是一种偏好,而不是一种要求,因为一些公司会允许你使用其中一种,甚至是另一种语言。然而,我认为这两者在数据科学职业中非常突出,数据科学中的工具也是如此。例如,Python 和 r 语言中有大量的数据科学文档、库、包和教程。我相信在与软件工程师、你可能正在开发的应用程序以及它的一般编写方式合作时,它会工作得很好。

> 什么时候应该使用 Python 而不是 R?

*   如果你和其他软件工程师一起工作,很可能他们也使用 Python
*   你学习代码概念的方法也可以应用到其他编程语言中(*面向对象编程*
*   在我看来,更具扩展性

> 什么时候应该在 Python 上使用 R?

*   可视化库偏好
*   是统计学家
*   时间序列算法
*   专注于研究
*   数据挖掘技术

最终归结为偏好,这不仅仅是你的偏好,也是你公司的偏好——也就是说,他们可能更喜欢你具体使用 Python 或 R(主要是*,因为其他人已经在使用一个而不是另一个了*)。

> 您将从以多种方式更快地学习 Python 或 R 中受益:

*   一旦你最终从事数据科学,你可以更容易、更快地应用库和包——这意味着你可以在算法最重要的时候专注于算法
*   一旦你从事数据科学,你就可以更容易、更快地应用代码
*   一旦你在事业上有所发展,你就不必回去继续学习基础知识了

交错学习的方法可能对一些人比对其他人更有利,但对我来说,我认为交错学习更好,因为它可以让你一次专注于数据科学的一个方面,所以当你找到工作时,你不是一个大师,而是所有大师。

# 练习 5-10 种机器学习算法

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/b86b55e78aecb1373b939f6d234fe9a8.png)

照片由[卢卡·布拉沃](https://unsplash.com/@lucabravo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在[Unsplash](https://unsplash.com/s/photos/forest?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【3】拍摄。

外面有无数的机器学习算法,所以知道所有这些算法可能会让人不知所措。我建议从学习最常见、最流行、最有竞争力的算法开始。很有可能,你的老板不会告诉你使用哪种算法,所以知道何时使用哪种算法是你工作的关键部分。当您掌握了 5-10 种算法后,您可以将类似的算法应用到相同的用例中,并了解使用其中一种算法的优势。

> 以下是选择特定机器学习算法时需要考虑的一些事情:

*   训练和推理/预测时间
*   数据需要的组织方式
*   它能很好地处理数字和分类数据吗?
*   你知道你的目标标签吗,数据/问题是有监督的还是无监督的?
*   你的公司已经使用过了吗?成功了吗?
*   培训要花多少钱?
*   您能否将其部署为内置算法,还是需要对其进行定制?
*   你从事哪个行业?
*   你需要多久训练和预测一次?

既然您已经知道如何用 Python 或 R 编写代码,那么您将需要掌握机器学习算法,既然您已经知道要考虑什么,那么我们可以出于各种原因来考虑一些最流行的算法:

```
** not in any paritulary order*1\. Logistic Regression (a simpler algorithm, however, I have not seen many use this one in practice, moreso in academia)2\. Random Forest3\. LightGBM4\. XGBoost5\. CatBoost6\. K-Means7\. K-Nearest Neighbors 8\. Support Vector Machines
```

有可能上面的这些算法之一可以解决您的大多数数据科学用例。当然,还有其他一些重要的例子,但是从零开始的主要部分是了解那些流行的例子,因为它们将被很好地记录,包括无数可以学习的例子。

# 向非数据科学家解释建模

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2021/-/raw/master/docs/img/19af6a8e18cfb0fcc5400bbe47eb53b5.png)

在[Unsplash](https://unsplash.com/s/photos/explain?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)【4】上 [Standsome Worklifestyle](https://unsplash.com/@standsome?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 的照片。

作为一名数据科学家,你会经常用到这种技能。这一点当然很重要,但是,解释或教学也能让你以最好的方式学习。当你解释一些事情时,你可以很快意识到你**做的**和**不知道的**,所以如果你及早实践,你可以成功地从头到尾走完数据科学,不仅对你自己,而且对其他人。

# 摘要

虽然本文可能没有涵盖从头开始数据科学所需要做的一切,但它给出了从零开始成为数据科学的步骤和概念的好主意。编码和编程很重要,在学习数据科学的过程中有时可以忽略,机器学习算法才是重点。这两者都很重要,在获得数据科学领域的工作之前,你应该掌握这两者。最后一点建议很简单,但对你的学习至关重要。向非数据科学家解释数据科学概念和常见实践可以让您以一种易于理解的方式向自己和他人总结您的所有学习。

数据科学的另外两个重要步骤是统计和 SQL,我在本文中没有详细介绍,但它们对实践仍然至关重要。

> 总而言之,下面是一些你可以从头开始数据科学的步骤:

```
Master Python or R Essentials NowPractice 5–10 Machine Learning AlgorithmsExplain Modeling to a Non-Data Scientist** as well as practice Statistics and SQL*
```

我希望你觉得我的文章既有趣又有用。如果您同意从头开始数据科学的这些步骤,请随时在下面发表评论,为什么或为什么不同意?现在,您还可以采取或已经采取了哪些措施来帮助您在数据科学领域取得成功?

请随时查看我的个人资料和其他文章,也可以通过 LinkedIn 联系我。

# 参考

[1]2017 年[马克·埃德尔](https://unsplash.com/@m______________e?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在 [Unsplash](https://unsplash.com/s/photos/nothing?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄的照片

[2]亚历克斯·丘马克在 [Unsplash](https://unsplash.com/s/photos/python?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄的照片,(2021)

[3]Luca Bravo 在 [Unsplash](https://unsplash.com/s/photos/forest?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄的照片,(2016)

[4]照片由 [Standsome Worklifestyle](https://unsplash.com/@standsome?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 在[Unsplash](https://unsplash.com/s/photos/explain?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)(2020)上拍摄
posted @ 2024-10-16 09:05  绝不原创的飞龙  阅读(17)  评论(0编辑  收藏  举报