TowardsDataScience 博客中文翻译 2019(一百四十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据:大小不重要…对吧?

原文:https://towardsdatascience.com/data-size-doesnt-matter-right-4f989ab7fbda?source=collection_archive---------21-----------------------

斯堪的纳维亚北部的萨米部落有 180 到 300 种不同的词语来描述雪、雪的种类、雪的痕迹以及雪的用途。侍酒师用几十个不同的词来描述葡萄酒,包括华丽的、松弛的、烘烤的、木炭的和激光似的。同样,数据科学家有许多概念来讨论数据、数据类型和数据的用途。

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

Photo by Franki Chamaki on Unsplash

我怀疑大多数人认为数据讨论是深奥的。我每天都和痴迷于数据的人在一起,我每天都听到他们抱怨数据。有些事情,所有优秀的数据科学家都知道,普通人类甚至不会怀疑。只是为了好玩,这里有几个金块。

首先,数据是有用途的。对工作有用的数据是信号。不相关的数据就是噪音。有时当任务改变时,噪音变成了信号。反之亦然。然而,并不总是清楚哪些数据是有用的,哪些是无用的。目的可能不清楚。客户或项目经理可能没有解释我们试图实现的目标。也许他们不了解自己,只是在寻找一些模糊定义的“洞察力”

gif from giphy.com

即使目的很明确,一些数据的有用性仍然是有争议的。假设我们试图预测销售点的美元净销售额。销售点的总销售额数据有用吗?前制造商单位销售呢?从 ERP 中提取数据时,通常会有许多不同概念的数据。这是有充分理由的,会计部门需要能够跟踪所有维度,这对他们来说是有意义的。然而,在数据科学的背景下,只有当总销售额与净销售额之比被认为是问题的一个要素时,同时拥有净销售额和总销售额才是有趣的。在许多其他情况下,我们将只使用一个销售术语,例如净销售额,并放弃其他数据维度。

第二,是数据的数量问题。数据科学家喜欢有许多观察结果,这意味着已经观察到相同变量的许多数据点。拥有大量的观察数据让数据科学家的生活更加舒适。算法的选择再也不用想太多了。如果有足够的观察值,任何现成的算法都可以很好地拟合。如果数量巨大,我们快乐的数据科学家就有机会玩 Spark 集群,使用深度学习算法。她的朋友们会嫉妒死的。最好的是,当数据量很大时,算法需要花费大量的时间来训练。这意味着有更多的时间喝咖啡休息和在线阅读博客。的确,拥有大量的数据观测是一件幸事。

第三,这是数据科学家的噩梦:拥有大量数据,但数据的形式多种多样。拥有大量变量会增加虚假相关性和过度拟合的风险。正如纳西姆·塔勒布所说,给他足够多的股票代码,他就能找到一个回报与你的血压精确相关的股票。这就是所谓的维数灾难。有解决这个问题的方法,但它们都有问题。数据科学家可以花时间进行探索性的数据分析,以减少要使用的变量数量。那是艰苦的工作。她可以找到一个更好的模型来适应这种情况,或者调整当前模型的超参数。那也是更多的工作。或者,她可以使用流形方法来减少数据的维数。然而,有许多方法可用。她应该默认 PCA 吗?如何证明这种选择是正确的?更糟糕的是,现在她已经使用了 PCA,她失去了一些模型的可解释性。这个模型变得更加难以想象和解释。事实上,拥有大量的数据变量是一种诅咒。

第四,变量的类型。如果数字变量是数据科学的超级模特,那么二进制变量就是邻家女孩,分类变量就是丑小鸭。数字变量是数字,如 3.14 或 2.7474。关于数值变量的一切都很可爱。我们可能仍然需要扩展和标准化,但这很容易。二进制变量也可以。然而,分类变量是丑陋的。他们需要一些严肃的整形手术才能有用。我们勇敢的数据科学家可以尝试一键编码。这是一种将一个分类变量转换成许多二进制变量的方法,但它增加了变量的总数,这是一个如上所述的诅咒。嵌入是完美的极端改造。然而,说起来容易做起来难。并不总是清楚哪种嵌入方法将提供最好的性能提升,这是额外的工作。

gif from giphy.com

第五,存在数据缺失的问题。假设一个调查回答者跳过了一个问题。我们应该如何处理丢失的数据点?令人愤怒的是,大多数算法根本不能容忍丢失数据。这意味着遗漏的点需要以某种方式猜测和输入。大多数初学者学会在有疑问时使用其他观察值的平均值。在现实世界中,这往往会导致灾难。正态分布变量在教科书中是标准的,但在商界却是奢侈品。如果变量不是正态分布,那么使用平均值可能是错误的。然后呢?中位数,众数?我们是否需要使用另一个模型来学习联合分布,以便输入更好的值?如此多的头痛。为什么客户不能给我们高质量的数据?

你怎么想呢?还有什么是数据科学圈里的常识,却不被别人怀疑的?

数据故事—飞机飞行

原文:https://towardsdatascience.com/data-stories-plane-flights-292b1cce38da?source=collection_archive---------33-----------------------

透过我旅行的棱镜看我的 2019 年(以及那对我说了什么😂

我一直对数据中存在的故事感兴趣,这些数据是我们在生活中创造的。在过去的几个月里,我的朋友 Maxy Lotherington 一直在做一个名为“日常数据 Vis”的媒体系列,她启发并激励我开始通过我产生的数据来审视我的生活。(在这里查看她的文字:*,她的* 表情反应 片段是我最近读过的最喜欢的东西之一)。

如果是 12 月,我会记录下我在 2019 年乘坐的每一次飞机飞行。我的朋友说我从来不在镇上闲逛,在某种程度上,我想知道这有多真实(以及我实际上旅行了多少)。对于那些今天有很多事情的人来说,剧透一下——我确实有点沉迷于旅行,今年我已经累积了很多英里。

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

A map of all of my travels for the past year — as you can see, I’m a fairly frequent flier along the West Coast of the United States, mainly because I live in Portland, my company headquarters is in the Bay, and I have a ton of family in LA

我追踪到的

我在 2019 年跟踪了我旅行的大量数据:

  • 一般信息:预订日期、到达日期(如果不同)、旅行日期、出发时间、到达时间、出发时间、到达时间、预订日期、旅行日期、直达航班?每次旅行的费用,我是否支付了费用,每段路程的费用(如果不同)。
  • 计算信息:预订日期和旅行日期之间的天数,旅行之间的时间。
  • 机场和航班信息:出发机场、到达机场、飞行持续时间、飞行产生的二氧化碳、飞行里程、航空公司、航班号

我没追踪到的是

  • 延误。我找不到关于我的哪个航班被延误的一致的事实来源,所以下面所有的航班都是基于延误永远不会发生的想法(如果你最近坐过飞机,你知道这是错误的,但那是另一天的问题)。
  • 我在 2019 年支付的旅行,但将在 2020 年进行。

🌎那么我到底旅行了多少?

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

很多。不算打车时间、等待登机时间,以及在飞机上度过的其他各种时间,我在 T21 的飞行时间为 95 小时 12 分钟(大约占我一年时间的 1%)

我的端到端里程数出来是39490 英里,查看我的飞行信息显示我产生了 5597.07 公斤的 CO2 ,这是用这个工具计算出来的。(超过 6 吨的二氧化碳,几乎是一个正常人年排放量的 1.5 倍😬)

📅这是不是意味着你从来没回家过?

我的大多数朋友现在都很清楚,如果他们想和我一起做计划,我很有可能不在城里。我在某种程度上对此感到不快,所以我想我应该看看这些数据,看看这到底是真是假。

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

不幸的是,事实证明他们是对的。在我可能在波特兰度过的 365 天中(我在一个被计入地理位置偏好的地方度过了超过 6 个小时的清醒时间),我在城里度过了 270 天(整整 74%)。换个角度想想,平均每个月我会离开一周。

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

2019 年 Vivek 的一个普通周六看起来是这样的:醒来,淋浴,吃点东西,去机场(一般来说是 PDX,但我没有歧视),飞行 241.37 英里,寻找新的冒险,家庭时间,或任何激起我兴趣的东西。另一方面,周四平均只有 28.15 英里的空中旅行,这将使我从 PDX 到塞勒姆(俄勒冈州首府)机场的半路上。(在你担心我因为不能在办公室工作而被解雇之前,我花了 2019 年的时间远程工作,所以我可以在周一飞回家😂

平均来说,我的旅行间隔时间是 9 天 8 小时 5 分钟,其中两次旅行间隔时间最长的是 46 天 11 小时 34 分钟,最快的周转时间是 22 小时 30 分钟。

💸那么你一定破产了??

你没有完全错,但你也没有错。由于我非常强大的谷歌航班游戏,以及我注册的航班交易数量,我没有在 2019 年把所有的钱都花在航班上,但我确实在航班上花了 2323.25 美元。(每次飞行大约需要 110.63 美元)。这还不包括我工作支付的机票,或者我使用的礼品卡/旅行信用卡。然而,我并没有节省我的钱包,我在出发前 30 天预订了我的普通航班——如果你把我去新墨西哥州的旅行计算在内,这个数字就下降到 23 天,我提前 3 个月预订了机票。

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

不过,让我感到惊讶的一件事是,周二实际上不是我预订航班最便宜的日子,事实上我可能会在未来预订周三的航班更好(周一和周六非常低,因为它们主要包括我在欧洲各地的瑞安航空航班,但即使将这些从数据集中剔除,也导致周二的航班比周三更贵)。此外,我莫名其妙地去了 365 天,预订了 23 次旅行,却没有在周四预订任何东西,我也不完全确定是怎么回事。

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

如果我们根据上面的图表假设预订日没有显著影响机票价格,那么当我们查看航班当天会发生什么呢?我们在这里看到的是,与一周中的其他任何一天相比,我在周六乘坐的航班数量在一定程度上可以解释为比周五的航班便宜多少——记住,我在周五离开之前一周花了 450 美元乘坐往返航班前往欧洲。

🛩:你是说你有很多航空里程?

不幸的是,这也不是真的,是的,我经常坐飞机,这意味着我有很多里程,但我是一个糟糕的品牌忠诚度飞行员——当我预订航班时,我唯一真正的考验是它有多贵,我不会花更多的钱乘坐任何航空公司的飞机(尽管我以前和阿拉斯加航空公司很亲近😍).

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

TL;速度三角形定位法(dead reckoning)

我在 2019 年飞了很多次,更具体地说,绕地球飞了 1.53 圈,实际上我很少长时间呆在波特兰,但我看到了很多很酷的东西,有趣的人,并有一些很棒的经历,所以总而言之,我会接受它。

我现在要去做二氧化碳抵消捐赠,但如果你想告诉我你有多喜欢(或讨厌)这个,请随时在 LinkedIn 上给我留言。👋

选择最佳机器学习方法的数据结构评估

原文:https://towardsdatascience.com/data-structure-evaluation-to-choose-the-optimal-machine-learning-method-eec66076f97a?source=collection_archive---------18-----------------------

一组关于数据相关性分析如何在解决回归任务时帮助节省时间的示例。

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

Photo by Spencer Watson on Unsplash

没有单一的 ML 方法。为了选择一个适合您的目的,作为开发人员,您需要了解项目中将使用的数据的性质。在这篇文章中,我将分享我在机器学习系统开发方面的经验,描述选择最佳预测模型的步骤。

我很幸运能够围绕一个正在进行的项目进行研究,这个项目是设计师和建筑师最大的市场,位于 Arcbazar.com。这是一个竞赛平台,它允许需要房屋建造或改造的客户在他们的预算范围内获得想要的建筑设计。虽然它比从设计工作室订购便宜,但在该平台上,客户还可以从来自世界各地的参与者提供的大量设计项目中进行选择。同时,Arcbazar 让任何专业水平的设计师都有机会获得认可,展示他们的创造力,并赢得奖金。

挑战

任务是为市场创建一个人工智能驱动的奖励建议系统,帮助客户决定设计师获奖者的奖项。

对于每个项目,客户可以自由设定不低于最低要求奖励的任何价格。由于所有人都是不同的,我们应该考虑到客户的决定是基于复杂的主观动机:预算、情绪、时间限制、需求、估计、期望等。这意味着机器学习系统应该解决一种社会心理任务。

第一步。数据准备

这个平台有一个大数据库,里面有设计师获奖的已完成的比赛。这个数据库成为机器学习系统的知识来源。数据库结构重复表单中的字段,这些字段必须由客户在开始设计师竞赛之前填写。

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

这个表单有七个字段:三个下拉菜单、三个文本字段(字符串类型)和一个数字字段(设置截止日期)。在表单的最后一个字段(开始比赛),客户设置奖励价格。

金额是所有项目特征字段的函数,并且以准连续的方式变化。在机器学习理论中,这种类型的任务被称为回归。表单中的字段总数可以表示为一个线性方程:

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

其中:

  • y 是奖励金额;
  • a、b、c——是从下拉菜单中表示项目特征的变量;
  • d、e、f——是表示文本描述字段的变量;
  • g —是代表天数的变量;
  • w1…w7 —方程的系数或参数。

通过分析表单字段的数据,我区分了三个类别:

  1. 结构化下拉菜单(前三个图);
  2. 非结构化描述字段;
  3. 数值字段。

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

下拉列表的值通常有索引。我用这些值索引替换了文本值。为了最大限度地减少计算时间,在开发的第一阶段,我用一个具有字符总数的数字替换了树文本字段。这个假设让我们保留一个更大的数据集。从后验来看,额外的场对模型拟合数据集的方式有一点积极的影响。

转换后的数据集可由一个五变量公式表示:

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

第二步。选择机器学习方法

在这一步中,我想使用 Python 编程语言的 Scikit-learn 库在一系列实验中找到最佳的机器学习方法。在测试过程中,我改变了 5 个特征数据集的分割比,对于测试子集,分割比从 10%变为 50%。此外,对标准化和非标准化数据进行了所有评估。标准化并没有给模型精度带来明显的提高。

我从预测与对象关联的连续值属性的基本方法开始。这种方法称为线性回归。但是,预测奖励和实际奖励的分布具有决定系数 R 平方= 0.29。在回归中,该系数是回归预测与真实数据点接近程度的统计度量。R 平方为 1 表示回归预测完全符合数据。

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

回归方法组中的套索回归给出了非常接近线性回归的分布,R 平方为 0.29。

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

让出一步,我决定使用人工神经网络。多层感知器即使有 500 个隐藏层,在 R 平方= 0.05 的这一系列实验中显示出最弱的结果。

mlpreg = MLPRegressor(hidden_layer_sizes=(500,), activation=’relu’,
         solver=’adam’, alpha=0.001, batch_size=’auto’,
         learning_rate=’adaptive’, learning_rate_init=0.01,
         power_t=0.5, max_iter=1000, shuffle=True, random_state=9,
         tol=0.0001, verbose=False, warm_start=False, momentum=0.9,
         nesterovs_momentum=True, early_stopping=False,
         validation_fraction=0.1, beta_1=0.9, beta_2=0.999,
         epsilon=1e-08)

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

然而,我们的数据集有一个对应于多级下拉列表的结构。这种可视化有助于理解数据集的相互联系。

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

One client’s choice is a decision tree, many choices — decision forest

当从下拉列表中选择值时,客户从他的“决策树”中的一个分支移动到另一个分支(在图中:级别 1–2–3)。这就是为什么决策树回归给出了更大的 R 平方(0.32)。

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

决策树回归器的一个更复杂的发展,来自 Sklearn ensembles 的随机森林回归器,给出了 R 平方的最好结果——0.37。

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

结论

了解跨数据的相互依赖性有助于选择最合适的算法。

决策树和随机森林方法具有相同的基础,比其他方法更接近数据集的本质。

所选数据集中的数据字段集不足以获得更好的拟合。它创建了一个假设,即文本描述字段包含客户在设置奖励时的隐藏动机。

在本文的第 2 部分,我将公开我对使用自然语言处理技术升级预测系统的见解。

用 Python 理解堆的 6 个步骤

原文:https://towardsdatascience.com/data-structure-heap-23d4c78a6962?source=collection_archive---------7-----------------------

搜索算法的重要数据结构

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

Photo by Rick Mason on Unsplash

今天我将解释堆,它是基本的数据结构之一。还有,著名的搜索算法像 Dijkstra 的算法或者 A都使用堆。A可以出现在常用于时间序列模式识别的隐马尔可夫模型 (HMM)中。请注意,这篇文章不是关于搜索算法的。我将解释堆是如何工作的,以及它的时间复杂度和 Python 实现。麻省理工开放式课程的讲座真的帮助我理解了一堆。所以我遵循了那堂课的解释方式,但我做了一点总结,并添加了一些 Python 实现。这篇文章的结构如下,基于麻省理工学院的讲座。我们开始吧!

  1. 堆概述
  2. 表现
  3. 如何建立一个堆
  4. 时间复杂度
  5. 履行
  6. 堆排序

1.堆概述

堆是优先级队列的的一种常见实现。优先级队列包含具有一定优先级的项目。您总是可以按照优先级顺序从优先级队列中取出一个项目。根据优先级取出项目是很重要的。当你环顾学术会议上的海报展示时,很有可能你是为了挑选一些展示而设置的。或者你会在去观光之前列出一个优先列表(在这种情况下,一个项目将是一个旅游景点。).堆栈和队列也包含项目。如果某个项目是最后一个添加到堆栈中的项目,则可以从堆栈中取出该项目。这是先进后出(费罗)。对于队列,如果一个项目是第一个添加到队列中的项目,您可以从队列中取出该项目。这是先进先出(FIFO)。您可以将这些视为特定类型的优先级队列。这是因为堆栈中插入项的优先级增加,队列中插入项的优先级降低。

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

2.表现

堆是树结构的一种,用二叉树来表示。我把图像堆在下面。您可以通过指针或数组来实现树结构。在这篇文章中,我选择使用如下的数组实现。就空间复杂性而言,数组实现比指针实现有更多的好处。数组的索引对应于下图中的节点号。

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

上面的堆叫做一个最小堆,每个节点的值小于或等于子节点的值。 我们称这种情况为堆属性。

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

在最小堆中,当您查看父节点及其子节点时,父节点总是具有最小值。当一个堆有相反的定义时,我们称它为最大堆。在下面的讨论中,我们称最小堆为堆。

您可以使用以下索引访问数组中的父节点或子节点。

  • 根节点| i = 1,数组的第一项
  • 一个父节点|parent( i ) = i / 2
  • 一个左子节点|left( i ) = 2 i
  • 一个右子节点| right(I)= 2I+1

当您查看索引 4 的节点时,树中节点的关系对应于下面数组的索引。

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

父节点按父( i ) = 4 / 2 = 2 对应索引 2 的项。子节点分别对应索引 8 和 9 的项目,左( i ) = 2 * 2 = 4,右( i ) = 2 * 2 + 1 = 5。

3.如何建立一个堆

从任意数组构建一个堆需要两个操作。

  1. min_heapify|使某个节点及其后代节点满足堆属性。
  2. 从任意数组中产生一个堆。

我们可以通过对每个节点重复应用 min_heapify 来构建一个堆。

3.1 分钟 _ 健康

min_heapify 中,我们用它的子节点交换一些节点来满足下面这两个特性下的堆属性;

  1. 某些节点及其子节点不满足堆属性,
  2. 子节点及其后代节点满足属性。

树形结构具有以下两个特征。

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

看看被橙色方块包围的节点。我们发现 9 比 2 和 3 都大,所以这三个节点不满足堆属性(node 的值应该小于等于其子节点的值)。请检查下面的橙色节点。

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

然而,看看蓝色的节点。这些节点满足堆属性。

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

这里我们定义 min_heapify ( 数组索引)。这个方法有两个参数,数组,索引。我们假设该方法将数组 [ 索引的节点与其子节点交换,以满足堆属性。

让我们看看 min_heapify 是如何从上面的树形结构中产生一个堆的。首先我们调用min _ heap ify(array,2)将索引 2 的节点与索引 4 的节点交换。

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

在将min _ heap ify(array,2)应用到子树之后,子树在下面发生变化,并满足堆属性。这个子树是蓝色的。

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

如果子树将索引 2 的节点与索引 5 的节点交换,子树将不会满足如下所示的堆属性。因此子树与父节点交换子树中具有最小值的节点,以满足堆属性。

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

回到正确交换的树。当我们看橙色的节点时,这个子树不满足堆属性。

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

所以调用min _ heap ify(array,4)使子树满足堆属性。

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

现在,这个子树通过将索引 4 的节点与索引 8 的节点交换来满足堆属性。

上面的这些操作从无序的树(数组)中产生堆。

3.2 构建 _ 最小 _ 堆

下面的伪代码代表了 build_min_heap 是如何工作的。

build_min_heap(array)
    for i=n/2 downto 1
        do min_heapify(array, i)

该函数使用 for 循环迭代除叶节点之外的节点,并将 min_heapify 应用于每个节点。我们不需要将 min_heapify 应用于 n /2+1 之后的索引项,它们都是叶子节点。我们在下面的橙色节点中应用了 min_heapify。

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

每个节点在满足能够应用 *min_heapfiy 的条件下可以满足堆属性。*这是因为该函数从底部(倒数第二层)到顶部(根节点层)迭代节点。例如,该函数首先将 min_heapify 应用于索引 4 和索引 5 的节点,然后将 min_heapify 应用于索引 2 的节点。因此,当应用 min_heapify 时,索引的节点及其后代节点满足堆属性。

4.时间复杂度

我们来考虑一下 *build_min_heap 的时间复杂度。*首先我们认为 min_heapify 的时间复杂度,它是 build_min_heap 的一个主要部分。

min_heapify 重复交换数组中项目的操作,该操作以固定时间运行。因此 min_heapify 的时间复杂度将与重复次数成正比。在最坏的情况下, min_heapify 应该重复操作树的高度倍。这是因为在最坏的情况下,min_heapify 会用最深的叶子节点交换根节点。假设 h 为根节点的高度, min_heapify 的时间复杂度将需要 O ( h )的时间。

min_heapify 在各深度的时间复杂度如下所示。节点的数量也显示在右侧。

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

从图中可以看出 build_min_heap 的时间复杂度将是内部节点的时间复杂度之和。最终的时间复杂度变成:

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

所以我们应该知道树的高度来得到时间复杂度。

每个深度的节点数之和会变成 n 。所以我们会得到下面这个等式。

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

上面的等式代表几何序列,所以我们可以变形它,得到树的高度如下:

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

最后我们得到 O ( n )作为 build_min_heap 的时间复杂度。同样,我们得到 O (log n )作为 min_heapify 的时间复杂度。

5.履行

这里我们用 Python 实现了 min_heapifybuild_min_heapmin_heapify 实现如下。

def min_heapify(array, i):
    left = 2 * i + 1
    right = 2 * i + 2
    length = len(array) - 1
    smallest = i if left <= length and array[i] > array[left]:
        smallest = left
    if right <= length and array[smallest] > array[right]:
        smallest = right
    if smallest != i:
        array[i], array[smallest] = array[smallest], array[i]
        min_heapify(array, smallest)

首先,该方法计算索引为 i 的节点及其子节点中值最小的节点,然后将值最小的节点与索引为 i 的节点进行交换。当交换发生时,该方法将 min_heapify 应用于被交换的节点。

Python 中一个列表(一个数组)的索引从 0 开始,访问节点的方式会有如下变化。

  • 根节点| i = 0
  • 父节点|父节点( i ) = ( i -1) / 2
  • 左子节点| left(I)= 2I+1
  • 右子节点| right(I)= 2I+2

变量最小具有最小值节点的索引。如果最小的不等于 i ,这意味着该子树不满足堆属性,该方法交换节点并对最小的的节点执行 min_heapify

build_min_heap 的实现和伪代码差不多。

def build_min_heap(array):
    for i in reversed(range(len(array)//2)):
        min_heapify(array, i)

for 循环不同于伪代码,但行为是相同的。这个 for 循环还从倒数第二层节点到根节点迭代节点。

6.堆排序

Heapsort 是一种使用堆的排序算法。用 min_heapifybuild_min_heap 真的很容易实现。分拣流程如下。请注意,排序的顺序是升序。

  1. build_min_heap 从任意数组构建一个堆。
  2. 将数组中的第一项与最后一项交换。
  3. 从数组中移除最后一项。
  4. 运行 min_heapify 到第一项。
  5. 回到步骤 2。

在堆中,最小的项是数组的第一项。步骤 3 之后的数组满足应用 min_heapify 的条件,因为我们在将第一项与最后一项交换之后移除了最后一项。根据这一特性,我们可以通过重复步骤 2 到 4 对数组进行排序。

heapsort 实现将如下所示。

def heapsort(array):
    array = array.copy()
    build_min_heap(array) sorted_array = []
    for _ in range(len(array)):
        array[0], array[-1] = array[-1], array[0]
        sorted_array.append(array.pop())
        min_heapify(array, 0) return sorted_array

heapsort 的时间复杂度是O(nlogn因为在最坏的情况下,我们要重复 min_heapify 数组次数中的项数,也就是 n

在 Python 的heapq 模块中,已经实现了对堆的一些操作。我遵循了麻省理工学院讲座中的方法,实现与 Python 不同。如果你想知道 Python 的具体实现,请访问这里的源代码。例如,这些方法是用 Python 实现的。

  • heapq.heapify |对应 build_min_heap
  • heapq.heapop |对应交换项目,移除最后一个项目, min_heapify 立刻*。*

通过使用上述方法,我们可以实现如下的堆排序。请注意,它与官方文件中的heap sort 的实现不同。

import heapqdef heapsort(array):
    h = array.copy()
    heapq.heapify(h)
    return [heapq.heappop(h) for _ in range(len(array))]

所以这个帖子到此为止。感谢您的阅读!

参考

数据:深度学习时代的困境与机遇

原文:https://towardsdatascience.com/data-the-predicament-and-opportunity-in-the-deep-learning-era-256f4b4fef?source=collection_archive---------24-----------------------

介绍

随着深度学习已经渗透到几乎每一个学术学科,并催生了无数的初创企业和新的工业应用,很多人可能会问:所谓的“深度学习”的极限在哪里,深度学习的未来会是什么样子?而下面是我个人的回答:数据

正如我们所知,深度学习的兴起有三个支柱:强大的计算能力、大模型容量和大数据。然而,随着计算能力和模型容量的稳步增长,最大数据集的大小似乎保持不变。

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

[1]

这主要是由于标注足够大、足够多样且足够干净(即具有高标签质量)的数据集的高成本和难度。此外,还有一些标注成本极高的任务,比如医学。这也为域数据集的快速增长设置了限制。

然而,在传统的(强)监督学习设置中,训练一个具有足够好性能的模型需要大量的标记数据。这让我们陷入了数据匮乏的困境。

在我看来,主要有三个方向可以解决数据匮乏的困境:

  1. 充分利用给定的数据集:更好的数据采样策略[2],更大的模型容量[3]…
  2. 放大标注数据集量:数据标注;
  3. 利用更多的知识:自我监督学习/预训练,弱监督学习/预训练,迁移学习(预训练)。

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

Modified from Stanford AI lab blog pic

正如你将看到的,它们中的许多与其他的交织在一起。虽然强(传统)监督学习仍然是主流,但在不久的将来,所有方法都将变得越来越重要。在这篇文章中,我将简要概述这些方法,并对更有前途的方向提供一些我的看法。

明智地使用数据

这种类型的方法并不试图增加数据集的大小,而是试图充分利用我们已经拥有的数据。我不会对此进行太详细的描述,因为一般来说,几乎所有当前的论文都属于这一类别:模型架构的改进、损失设计、优化算法……这些都是试图充分利用给定数据集的各种努力——提取其中的所有知识,并学习良好的表示或模型。

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

From [4]

然而,有一个有趣的研究方向,旨在“在数据集层面”更好地利用数据集。也就是说,他们试图使用不同的数据采样策略来帮助训练一个更少偏差、更稳健的模型。例如,[2] [4]试图处理数据集的长尾分布,这是现实世界分布的一种典型形式。这些方法通常采用不同的再平衡策略,例如基于每个类别的观察值数量或特征空间几何形状(例如,聚类结果)的再采样和再加权。

在许多数据集固定的实际应用程序中,这种类型的方法是可以帮助您解决问题的唯一且最适用的方法。

扩大数据集大小

当我们想要在一个新的应用场景中训练一个模型时,总是不可避免地要先构造一个带标签的数据集;当我们无法获得满意的结果时,最直接的方法就是扩大标记数据集的大小。为了构建或扩大带标签的数据集,我们需要数据标注。

自从机器学习的引入,数据标注就出现了。多年来,各种大型数据集被构建:Pascal-VOC[5],ImageNet[6],LSUN[7],COCO[8],mega face[9]…许多在线注释服务也是可用的,如 LabelMesupervisor . ly等,尽管它们通常不节省成本。同时,也有许多新的数据注释方法被提出[10][11][12]。这些最新的方法通常将机器作为注释的一部分,或者使用它来自动化注释的一部分,或者帮助人类注释者。这些方法不仅大大加速了标注过程(实例分割速度提高了 3-6 倍[10][12]),而且还提高了传统标注的质量。

然而,尽管数据标注方法取得了很大进展,但目前还没有对其进行系统的学习或研究,也没有可靠的基准。这使得不同的数据标注方法难以相互比较,也使得研究者无法系统地研究如何改进数据标注方法。我将在下一篇文章中讨论更多,因为这是我们正在努力做的。

扩大数据集的另一个方向是用较低质量或较高抽象级别的数据进行标注——弱标注。例如见下图。对于像素级实例分割的任务,有三个较低级别的注释可能也有帮助:人级别、点级别和边界框级别。较低级别的注释节省了大量时间。换句话说,给定相同的预算,我们可能希望获得更多的低层次注释数据,并获得更好的最终结果。然而,这种直觉仍然需要一个评估标准或基准来阐明。

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

利用更多的知识

这是一个活跃的研究领域,每天都有新的有趣的方法被开发出来。实际上来说,迁移学习已经证明了它在计算机视觉和自然语言处理中的重要性,因为现在不使用 ImageNet 或类似 BERT 的预训练模型听起来有些鲁莽[13]。优势是显而易见的:你用更少的数据训练得更快。例如,在 ULMFit[14]中,作者发现预训练可以节省达到相同性能所需的大约 10 倍的数据。

然而,仍然有许多问题是目标语言无法解决的,如细粒度分类、自然语言生成等。此外,当适应的数据集规模较大时,迁移学习的好处变得小得多[14]。毕竟,在一个新的应用环境中,迁移学习是不适用的。然而,考虑到它的简单性和实用性,迁移学习无疑是利用其他数据源知识的最常用方法。

也有一些研究人员旨在利用大量未标记的数据集。半监督学习是一个非常活跃的领域。其思想是使用结构假设(聚类假设和流形假设)来自动利用未标记的数据。在最近的一篇文章[15]中,作者表明半监督学习有可能取代监督学习,并大大减少需要完全注释的数据量。

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

The hope of the future of semi-supervised learning [15]

然而,目前,在 SSL 实用化之前仍然存在一些挑战。第一个是未标记数据的不可控偏差,这将在[16]的第 4 节中详细讨论。另一个问题是 SSL 深受类别分布不匹配之苦,有标签和无标签的数据应该有相同的标签空间,否则准确率会大大下降。这极大地限制了 SSL 的使用范围。此外,据报道[17]在许多设置中,在不同的标记数据集上预训练分类器,然后仅在感兴趣的数据集的标记数据上重新训练,可以胜过所有 SSL 算法。这意味着 SSL 方法要变得实用还有很长的路要走。

另一种试图利用未标记数据集的方法叫做自我监督学习。其核心思想是在没有明确的人工监督的情况下,从数据本身学习表示。它与 SSL 的不同之处在于,它不需要标记数据,而是使用各种假设来创建监管信号[18][19]。在[18]中,作者表明,通过扩大预训练数据、模型容量和问题复杂性,人们可以在很大程度上匹配甚至超过监督预训练在各种任务上的性能,例如对象检测、表面法线估计(3D)和使用强化学习的视觉导航。这表明自我监督学习是一个很有前途的研究方向。然而,在图像分类和低镜头分类任务中,监督预训练模型仍然是更好的。从作者的角度来看,当前的自我监督方法不够“硬”,不足以充分利用大规模数据,并且似乎没有学习有效的高级语义表示。

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

From [18]

自我监督学习的另一个缺点是,它比其他形式的训练需要更多的领域知识,因为它需要专家来设计自我监督的方式,这可能因任务而异。这似乎让我们离真正的智能学习形式越来越远。

最后,我想讨论一下弱监督学习【20】【21】和预训练【22】。如前所述,在某些情况下,微弱的监控信号也能产生良好的效果。数据集的大尺寸似乎可以补偿噪声或其标签的低质量。另一个优势是,可以设计标记函数并自动获得大量弱监督数据,尽管这类似于自我监督方法的方式——使用领域专业知识来设计自己的规则!即使没有完全自动化,弱监督的数据注释也可以节省大量时间,这可以转化为更大量的弱标记数据,并可能有利于前面提到的最终性能。

然而,像自监督学习一样,设计弱监督学习及其标注算法需要大量的领域专业知识。此外,该方法本身仍然需要在更实际的任务中证明其有效性,特别是在噪声/低质量/抽象如何影响性能,以及数据集的大小可以足够大方面,尽管它们在[22]的分类设置中有部分讨论。

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

From [22]

弱监督预训练并不是什么新东西,而是在其他任务中使用弱监督预训练模型。在图像分类和对象检测中,利用这种思想的模型已经显示出超过监督预训练的 ImageNet 模型[22]。可以预期,在不久的将来,这个领域的研究,连同相应的数据标注研究,将会腾飞。

结论

在本帖中,我们将讨论解决数据匮乏困境的不同方法。对于每种方法,我们讨论了它的优点和缺点,并介绍了一些最近的研究和讨论。

虽然最后一部分中的算法和方法听起来可能更吸引人,但从实际的角度来看,数据注释,无论是强还是弱,都是大多数情况下最有效的解决方案。并且数据注释基准的引入和数据注释方法的开发可以将成本降低到可负担的规模,以便很快注释非常大的数据集。因此,我认为,在不久的将来,社区要做的最重要的事情是在数据注释研究以及如何利用不同监管级别中注释的数据集方面投入更多精力。

要有数据!

参考资料:

[1]孙辰、阿比纳夫·什里瓦斯塔瓦、绍拉布·辛格和阿比纳夫·古普塔,重新审视深度学习时代数据的不合理有效性

[2]基于有效样本数的类别平衡损失

[3]用于图像识别的深度残差学习

[4]小张,,严东文,,于乔,程损为深度人脸识别用的长尾

http://host.robots.ox.ac.uk/pascal/VOC/

http://www.image-net.org/

https://www.yf.io/p/lsun

http://cocodataset.org/#home

[9]http://megaface.cs.washington.edu/

[10]Rodrigo Benenson,Stefan Popov,Vittorio Ferrari,使用人类注释器的大规模交互式对象分割

[11]Olga Russakovsky,李-,,两全其美:
面向对象标注的人机协作

[12]大卫·阿库纳、黄玲、阿姆兰·卡尔、桑佳·菲德勒,“用多边形有效标注分割数据集——RNN ++

[13] NLP 的 ImageNet 时刻已经到来http://ruder.io/nlp-imagenet/

[14]杰瑞米·霍华德,塞巴斯蒂安·鲁德,用于文本分类的通用语言模型微调

[15]安静的半监督革命https://towards data science . com/The-Quiet-Semi-Supervised-Revolution-edec 1 e 9 ad 8c

[16]半监督学习,Olivier Chapelle,Bernhard schlkopf 和 Alexander Zien,麻省理工学院出版社

[17] Avital Oliver,Augustus Odena,Colin Raffel,Ekin D. Cubuk & Ian J. Goodfellow,深度半监督学习算法的现实评估

[18] Priya Goyal,Dhruv Mahajan,Abhinav Gupta,Ishan Misra,自我监督视觉表征学习的标度和基准

[19]亚历山大·科列斯尼科夫,翟晓华,卢卡斯·拜尔,再论自我监督的视觉表征学习

[20]Armand Joulin,Laurens van der Maaten,Allan Jabri,Nicolas Vasilach,来自大量弱监督数据的电子学习视觉特征

[21]阿历克斯·拉特纳、帕罗马·瓦尔马、布雷登·汉考克、克里斯·雷和哈兹实验室的其他成员,弱监督:机器学习的新编程范例https://ai.stanford.edu/blog/weak-supervision/

[22]Dhruv Mahajan,Ross Girshick,Vignesh Ramanathan,,Manohar Paluri,,Ashwin Bharambe,Laurens van der Maaten,探索弱监督预审的局限性

AI/ML 项目中的数据翻译周期

原文:https://towardsdatascience.com/data-translation-cycles-in-ai-ml-projects-2ff4445802cd?source=collection_archive---------25-----------------------

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

Photo by ev on Unsplash

在 AI/ML 项目中从潜在有价值的数据到有益信息的转换

越来越多的工程师面临着人工智能(AI)和机器学习(ML)相关项目数量的增加。许多人工智能/人工智能项目似乎是面向算法的,但是开发人工智能/人工智能产品的每个过程都是以任何涉及数据的过程为中心的。AI/ML 项目中的工程师需要更多地了解如何在 AI/ML 项目中创建和使用数据。这篇文章可能会帮助初级/中级工程师或数据科学家理解为 AI/ML 产品准备的数据本身。

什么是数据?

定义引自网络词典,因为更新周期比纸质资料快。数据基于信息,因此信息的定义也在下面描述。

信息是一种刺激,在某种语境下对接受者有意义。当信息被输入并存储在计算机中时,它通常被称为数据。经过处理(如格式化和打印)后,输出数据可以再次被视为信息。

数据本身的定义就在这里。

在计算中,数据是已经被转换成高效移动或处理形式的信息。相对于今天的计算机和传输介质,数据是信息转换成二进制数字形式。数据可以用作单数主语或复数主语。原始数据是一个术语,用于描述最基本的数字格式的数据。

这两种定义的含义可以绘制成如图 1 所示的图片。作为人类的接收者在我们周围的环境中感知信息,测量信息,并将其转化为定性/定量信息,以便容易地识别信息的含义。可以容易地被计算机识别的接收信息被处理,具有新见解的新信息被创建,并被传递到接收器。

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

Figure 1 created by Jesse Tetsuya

接收者的翻译测量

将信息转化为数据的测量类型可以是下图 2 中的灰色方框。

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

Figure 2 created by Jesse Tetsuya

分类数据是定性数据,由名义数据和序数数据组成。为了将这样的数据传递给代码并使用数据进行分析,必须将分类数据转换成数字,如二进制数据或任意编号标签。

另一方面,数字数据是定量数据,由离散和/或连续数字组成。离散数字包括可计数的数字,如学生人数,它可以等于名义或顺序数据的计数输出。连号分为两种:区间刻度和比例刻度。两者的区别在于**数据是否有“真零”和数字有无减号。**严格来说,连续变量的规模不是根据数字有无负号来决定的,但是度量的方式很容易理解。

描述数据的三种方式

描述数据的三种方式是 **1)数据结构,2)数据类型,3)数据格式(=文件格式)。**本节将根据常用的 python 语法对它们进行简单总结。不包括不常用的 python 语法信息。

1.数据结构

  • 列表/字典/序列/元组/集合(示例如下)

列表和词典

**>>>** tel = {'jack': 4098, 'sape': 4139}
**>>>** tel['guido'] = 4127
**>>>** tel
{'jack': 4098, 'sape': 4139, 'guido': 4127}
**>>>** tel['jack']
4098
**>>> del** tel['sape']
**>>>** tel['irv'] = 4127
**>>>** tel
{'jack': 4098, 'guido': 4127, 'irv': 4127}
**>>>** list(tel)
['jack', 'guido', 'irv'

序列和元组

**Sequences
>>>** t = 12345, 54321, 'hello!'
**>>>** t[0]
12345**Tuples
>>>** t
(12345, 54321, 'hello!')
**>>>** *# Tuples may be nested:*
**...** u = t, (1, 2, 3, 4, 5)
**>>>** u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
**>>>** *# Tuples are immutable:*
**...** t[0] = 88888
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
**>>>** *# but they can contain mutable objects:*
**...** v = ([1, 2, 3], [3, 2, 1])
**>>>** v
([1, 2, 3], [3, 2, 1])

设置

**>>>** basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
**>>>** print(basket)                      *# show that duplicates have been removed*
{'orange', 'banana', 'pear', 'apple'}
**>>>** 'orange' **in** basket                 *# fast membership testing*
True
**>>>** 'crabgrass' **in** basket
False

2。数据类型

  • 字符串/整数/浮点/布尔

3.数据格式

  • 数据存储/RDBS/CSV/JSON/Excel/HTML/Text/Image

将数据转化为有价值信息的过程

在 AI/ML 项目的情况下,工作流可以描述为如图 3 所示。

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

Figure 3 created by Jesse Tetsuya

首先,根据上一节提到的数据转换测量收集并格式化输入数据。输入的数据可以是 RDBS、CSV、JSON、Excel、HTML、文本、图片等。如前一节所述。

之后,这些输入数据被导入机器学习 API。机器学习 API 通常由与相关的三个程序代码组成,即访问数据的准备代码、预处理数据和机器学习算法。在将数据传递到机器学习模型之前,需要根据算法对数据结构和数据类型进行不同的操作和处理。

最后,对于人类来说没有明确表示有价值意义的输入数据通过图 3 所示的机器学习 API 被转换成有价值的信息。然后,它作为有用的信息被人类接收。

参考

[## 什么是信息?-WhatIs.com 的定义

信息是一种刺激,在某种语境下对接受者有意义。当信息被输入和存储时…

searchsqlserver.techtarget.com](https://searchsqlserver.techtarget.com/definition/information) [## 什么是数据?-WhatIs.com 的定义

在计算中,数据是指已经被转换成可有效移动或处理的形式的信息…

searchdatamanagement.techtarget.com](https://searchdatamanagement.techtarget.com/definition/data)

数据科学的数据类型

原文:https://towardsdatascience.com/data-types-for-data-sciences-65dcbda6177c?source=collection_archive---------4-----------------------

大数据和数据科学现在在每个人的脑海里。但并不是每个人都清楚地知道并非所有的数据都是相同的,并对数据科学中可用的应用程序和技术类型有清晰的认识。数据科学、人工智能和机器学习通常被认为是相当等同的。为了理解所有数据科学技术并不等同,理解并非所有数据都是相同的是至关重要的。

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

这张幻灯片是我这个月在巴黎大数据公司演讲的主要幻灯片。

这种会议充满了多年来为公司创造软件来更好地管理他们的数据以便更好地管理他们的业务的人。当谈到人工智能或机器学习这两个当今重要的时髦词汇时,我觉得有些混淆,似乎它们都或多或少被视为等同。我希望澄清,不同类型的数据存在,有不同的需求,这可能受益于不同类型的科学。

流行语。

**大数据。**随着数据量的显著增长,我们现在谈论大数据。

数据科学。我们不希望只是管理数据,存储数据,并将其从一个地方移动到另一个地方,我们希望使用数据,并利用科学方法围绕数据做出巧妙的事情。这就是数据科学。简而言之,数据科学*“利用科学的方法、流程、算法和系统,从各种形式的数据中提取知识和洞见”。*这是明确的定义,有不同类型的方法、流程和算法。

**机器学习。**机器学习是最适合大量数据的数据科学技术之一,因为它使用数据来提取知识。其他数据科学技术,如决策优化,由于是基于领域知识,因此不太消耗数据。只有一个数据集和一个业务问题的公式,您就可以开始使用决策优化。另一方面,机器学习沉迷于数据。更多的数据,更多的学习,更好的结果。

**人工智能。*这似乎是新的最重要的流行语,但实际上这是纯粹的复古。根据维基百科,这仅仅是“机器展示的智能”*。机器像人一样聪明的想法已经存在多年了。我们现在更加谦虚,认为人工智能是机器代替人类自动化非物理过程所做的任何事情(事实上,我们也降低了对人类智能的期望)。我们中的一些人多年来一直在做某种人工智能,进行规则自动化或决策优化。

人工智能炒作的好处是,我的孩子现在认为我有一份有趣的工作,而他们多年来认为我的工作只是无聊的数学。

数据类型

在看哪种科学对一个问题有益之前,我需要看一下涉及哪些类型的数据。让我们回顾一下我强调的四种类型。

我将使用典型的和众所周知的供应链问题的例子来说明,其中我想计划在我的工厂生产多少产品,在我的仓库储存多少,以及向我的商店交付多少。

已知数据

首先是我所说的“已知数据”。这是我确信的数据,或者至少我可以认为是已知的。

在供应链运作问题中,给定链的拓扑结构,已知不同节点的生产和存储能力。顾客想要购买多少商品是未知的数据。竞争将使用什么价格是未知的数据。我想生产和储存多少产品是未知的数据。

已知数据的领域对应于描述性分析。我将从操作系统中提取这些数据,我将组织它,我将探索它,我将显示它。

这些数据非常有价值。如果我不知道我的生产工厂或仓库的属性,我就不能做任何认真的计划。并不是所有的数据都是“有价值的”,这是“好数据”的概念,也不是“数据越多越好”。如果数据没有结构化,它将更难使用。所以好的数据是有价值的,我们可以购买。并非所有的数据都是开源的,获取和转售好的数据是一项伟大的事业。

未知数据

我们可以在已知数据中找到的结构实际上是附加数据。这是我们最初不知道的数据,我们可以从已知的数据中提取。我们可以分类,我们可以构造,我们可以预测

在我的供应链例子中,基于大量已知的历史数据,我可能预测下个月我的不同商店或市场会有多少需求。

这是预测分析的领域。

如前所述,这个区域由已知数据提供信息。预测和分类不是来自水晶球,而是从历史数据中推断出来的。没有已知数据,就无法提取任何未知数据。预测就像一个额外的维度,你无法从你的已知数据中看到,但它已经存在,你可以用某种特定的眼镜看到。

预测将取决于你所拥有的已知数据的质量和种类。这就是大家都在说的偏差问题。

他人的决定

下一个数据区域是其他人将要设置的数据。

在我的供应链例子中,一个重要的数据集与竞争有关:我的竞争对手将在哪里销售什么,以什么价格销售,这是他们的决定,不是我的。

在某些情况下,与前面的区域有一些重叠。在市场上做出决策时,如果市场具有某些特征,我们可以预期结果将遵循预测模型可以提取的趋势。但在其他一些情况下,这可能真的是某人的个人决定,他可能有一个策略并做出不可预测的决定。例如,一个竞争对手可以决定下个月开一家有特价的新店。这将严重影响我的销售计划。

虽然新闻中充斥着专注于人工智能的公司的故事,让计算机在游戏中玩游戏并战胜人类,但在我看来,这个领域在实践中并不是最重要的,存在工业、运输、供应链、生产等问题。

大多数情况下,博弈都是基于多步博弈。如果没有多个步骤,使用不可预测的策略是没有意义的。如果我做了一些不同的事情,这是因为我希望用对手无法预测的事情来迷惑他,或者让他以某种方式做出反应。这是博弈论的领域。如果我考虑的是一般的对手,那么我会考虑对手的可预测的反应,当然我会使用可预测的策略,因此这属于前面的领域。

你的决定

最后,还有一组与您的决策相对应的数据。

我根据自己的原则和目标做出决定。

这是规定性分析的领域。

以我的供应链为例,除了我想设定的价格之外,我将决定我想在我的工厂生产多少,我想在我的仓库储存多少,我想向我的商店交付多少。

有不同的方法来做决定,虽然机器学习在某些情况下可以非常强大地规定要做什么,但这个领域仍然是决策优化的王国。

通过决策优化,一个数学引擎被输入我的业务描述(规则和目标),以及一个特定的案例(我的系统的当前情况,对未知数据的一些预测),该引擎将推导出对我来说什么是最优的决策集。决策优化是一种基于知识的技术。

请注意,在实践中,现实生活中的问题确实包括来自所有这些类别的数据,但是虽然已知数据总是数据的一个非常重要的部分,但是其他类别的数据量可能会因问题而异。这就是为什么清楚地理解这些类型的数据非常重要,以便能够选择使用哪种类型的数据科学技术。

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

数据科学的类型

我强调的每一个领域都不完全符合数据科学中的一种技术。这些区域对应于我们想要对数据执行的处理类型,它们对应于意图。在这里,我主要关注我认为更重要的两个问题,也是更容易混淆的地方:

一方面,未知数据的区域对应于预测分析,其中意图是从已知数据预测未知信息(数据或数据结构),并且存在不同的技术,从使用回归技术的众所周知的预测模型,到最近的机器学习和神经网络。

另一方面,我的决策的区域对应于规定性分析。同样,这并不仅仅与一种数据科学技术相关,而是与一个目的相关:规定针对当前情况采取的下一个最佳行动。

在某些情况下,机器学习可能是最好的技术,但在大多数情况下,决策优化(过去称为运筹学或数学规划)在技术上仍是该领域的主导者。这是因为决策优化对日常决策有着直接的影响:它告诉你在面对成千上万种可能性的选择时该怎么做。它是你决策的专家顾问。今天的报纸对此报道不多。

在另一篇文章中,我用一个常见的日常场景来介绍不同的现有技术。

结论

所以我的结论是,我们要小心,不要把数据和数据科学直接和人工智能、机器学习联系起来。

当我们面对一个包含大量数据的复杂问题时,需要考虑不同类型的数据。对于不同类型的数据,我们可能希望执行不同的操作,尽管我们希望应用人工智能和数据科学,但我们应该考虑不同类型的数据科学和不同的技术,使用最适合数据和我们考虑的意图的技术。

对于复杂的问题,涉及到两到三种类型的数据,我们可能需要使用和组合两到三种不同类型的数据科学技术。这就是为什么像 Watson Studio 这样的平台可以提供不同类型的工具,包括决策优化,来帮助你处理这些问题。

参见这篇文章,了解决策优化如何集成到 Watson Studio 中。

试试 IBM Watson Studio

【alain.chabrier@ibm.com 号

【https://www.linkedin.com/in/alain-chabrier-5430656/

@AlainChabrier

R 中的数据类型

原文:https://towardsdatascience.com/data-types-in-r-8124c3b2afe6?source=collection_archive---------34-----------------------

了解 R 中最常见的数据类型

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

Photo by Luke Chesser

介绍

T 这篇文章展示了 r 中不同的数据类型。要从统计学的角度了解不同的变量类型,请阅读“变量类型和示例”。

R 中存在哪些数据类型?

R 中有 6 种最常见的数据类型:

  1. 数字的
  2. 整数
  3. 复杂的
  4. 性格;角色;字母
  5. 因素
  6. 逻辑学的

R 中的数据集通常是这 6 种不同数据类型的组合。下面我们将逐一探讨每种数据类型的更多细节,除了“复杂”数据类型,因为我们关注的是主要的数据类型,这种数据类型在实践中很少使用。

数字的

R 中最常见的数据类型是数字。如果值是数字或者值包含小数,则变量或序列将存储为数字数据。例如,默认情况下,以下两个系列存储为数字:

# numeric series without decimals
num_data <- c(3, 7, 2)
num_data## [1] 3 7 2class(num_data)## [1] "numeric"# numeric series with decimals
num_data_dec <- c(3.4, 7.1, 2.9)
num_data_dec## [1] 3.4 7.1 2.9class(num_data_dec)## [1] "numeric"# also possible to check the class thanks to str()
str(num_data_dec)##  num [1:3] 3.4 7.1 2.9

换句话说,如果你给 R 中的一个对象分配一个或几个数字,默认情况下它将存储为数字(带小数的数字),除非另外指定。

整数

整数数据类型实际上是数值数据的一种特殊情况。整数是没有小数的数字数据。如果您确定您存储的数字永远不会包含小数,则可以使用此选项。例如,假设您对 10 个家庭样本中的孩子数量感兴趣。该变量是一个离散变量(如果您不记得什么是离散变量,请参见变量类型的提示),并且永远不会有小数。因此,由于使用了as.integer()命令,它可以存储为整数数据:

children##  [1] 1 3 2 2 4 4 1 1 1 4children <- as.integer(children)
class(children)## [1] "integer"

请注意,如果您的变量没有小数,R 会自动将类型设置为整数而不是数字。

性格;角色;字母

存储文本时使用数据类型字符,在 r 中称为字符串。在字符格式下存储数据的最简单方法是在文本段周围使用"":

char <- "some text"
char## [1] "some text"class(char)## [1] "character"

如果您想强制将任何类型的数据存储为字符,您可以使用命令as.character()来完成:

char2 <- as.character(children)
char2##  [1] "1" "3" "2" "2" "4" "4" "1" "1" "1" "4"class(char2)## [1] "character"

注意""里面的一切都会被认为是字符,不管看起来像不像字符。例如:

chars <- c("7.42")
chars## [1] "7.42"class(chars)## [1] "character"

此外,只要变量或向量中至少有一个字符值,整个变量或向量都将被视为字符:

char_num <- c("text", 1, 3.72, 4)
char_num## [1] "text" "1"    "3.72" "4"class(char_num)## [1] "character"

最后但同样重要的是,虽然空格在数字数据中无关紧要,但在字符数据中却很重要:

num_space <- c(1)
num_nospace <- c(1)
# is num_space equal to num_nospace?
num_space == num_nospace## [1] TRUEchar_space <- "text "
char_nospace <- "text"
# is char_space equal to char_nospace?
char_space == char_nospace## [1] FALSE

从上面的结果可以看出,字符数据中的一个空格(即在""中)使它成为 R!

因素

因子变量是字符变量的特例,因为它也包含文本。但是,当唯一字符串的数量有限时,会使用因子变量。它通常代表一个分类变量。例如,性别通常只有两个值,“女性”或“男性”(将被视为一个因素变量),而名字通常有很多可能性(因此将被视为一个字符变量)。要创建因子变量,使用factor()功能:

gender <- factor(c("female", "female", "male", "female", "male"))
gender## [1] female female male   female male  
## Levels: female male

要了解因子变量的不同级别,使用levels():

levels(gender)## [1] "female" "male"

默认情况下,级别按字母顺序排序。您可以使用factor()函数中的参数levels对等级重新排序:

gender <- factor(gender, levels = c("male", "female"))
levels(gender)## [1] "male"   "female"

字符串可以用as.factor()转换成因子:

text <- c("test1", "test2", "test1", "test1") # create a character vector
class(text) # to know the class## [1] "character"text_factor <- as.factor(text) # transform to factor
class(text_factor) # recheck the class## [1] "factor"

字符串已经被转换为因子,如其类型为factor的类所示。

逻辑学的

逻辑变量是只有两个值的变量;TRUEFALSE:

value1 <- 7
value2 <- 9# is value1 greater than value2?
greater <- value1 > value2
greater## [1] FALSEclass(greater)## [1] "logical"# is value1 less than or equal to value2?
less <- value1 <= value2
less## [1] TRUEclass(less)## [1] "logical"

也可以将逻辑数据转换成数字数据。使用as.numeric()命令从逻辑转换为数字后,FALSE值等于 0,TRUE值等于 1:

greater_num <- as.numeric(greater)
sum(greater)## [1] 0less_num <- as.numeric(less)
sum(less)## [1] 1

相反,数字数据可以转换为逻辑数据,所有值的FALSE等于 0,所有其他值的TRUE

x <- 0
as.logical(x)## [1] FALSEy <- 5
as.logical(y)## [1] TRUE

感谢阅读。我希望这篇文章能帮助你理解 R 中的基本数据类型及其特殊性。如果您想从统计学的角度了解更多关于不同变量类型的信息,请阅读文章“变量类型和示例”。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

相关文章:

原载于 2019 年 12 月 30 日https://statsandr.com

机器学习的数据理解:评估与探索

原文:https://towardsdatascience.com/data-understanding-for-machine-learning-assessment-exploration-aca1aadc1cb6?source=collection_archive---------16-----------------------

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

高质量的数据是任何数据科学项目的基础。为了获得可操作的见解,必须获取和清理适当的数据。数据理解有两个关键阶段:数据评估和数据探索。

数据评估

理解数据的第一步是数据评估。这应在项目启动前进行,因为这是验证其可行性的重要步骤。此任务评估哪些数据可用,以及这些数据如何与业务问题保持一致。它应该回答以下问题:

  • 有哪些数据可用?
  • 有多少数据可用?
  • 你能接触到你试图预测的基本事实和价值吗?
  • 数据将采用什么格式?
  • 它在哪里?
  • 如何访问数据?
  • 哪些领域最重要?
  • 如何连接多个数据源?
  • 使用这些数据报告了哪些重要的指标?
  • 如果适用,数据如何映射到当前完成任务的方法?

主要考虑事项

收集地面实况数据

如果您希望使用机器学习进行预测,您很可能需要一个带标签的数据集。对于你的每个例子,你需要机器学习模型应该学习预测的正确的值,或者适当的类别;这就是所谓的地面真相。这可能是您已经可以获得的,因为它是一个动作或事件(例如,指示客户是否搅动的值),或者它可能是您需要收集的东西(例如,电子邮件的主题)。

如果地面真相需要被收集,或者被人工标注,那么应该制定一个计划来理解这将如何实现,以及完成它所需要的时间和努力。应该仔细考虑这一点,因为这可能太耗时,因此成本很高,使项目不可行。

数据关联

写下所有可用的不同数据点,并评估机器学习模型使用这些数据进行预测是否直观。*有证据证明这些数据点和你希望实现的目标之间有联系吗?*如果你向机器学习模型添加不相关的特征,你就是在添加噪音,让算法寻找不存在的联系。这可能会导致性能下降。

相反,如果一个人今天正在承担这项任务,探索他们用什么来做决定。这些数据可以在模型中使用吗?构建模型时,最好从简单开始——先只使用明显的功能,看看效果如何,然后再添加那些你不太确定的功能。这允许您评估附加功能是否增加了价值。

数据量

要成功建立一个机器学习模型,你必须有足够的数据。没有严格的公式来计算应该使用多少,因为它取决于问题的复杂性和你使用的算法。

一个经验法则是确保您的示例数量至少是您的模型需要训练的参数数量的十倍。对于逻辑回归或线性回归模型,参数的数量对应于要素的数量(因为每个要素都有一个权重)加一(因为您的偏差)。而对于深度学习,每个神经元都有一个待训练的权重,每一层都有一个额外的偏差。

您还可以使用预测的输出来估计您需要的样本数。如果你使用传统的机器学习方法(随机森林,逻辑回归)来分类你的数据,你需要每一类的数百个例子(最好更多)。而使用深度学习技术,所需的示例数量显著增加;通常每节课需要上千个。当处理回归问题(预测数字输出)时,您可以将这些问题进行分类,以确保每个范围都有足够的示例。

最后,尽量确保你的特征也有很多变化。例如,如果您正在预测房价,并且您的输入之一是 neighborhood,您希望确保您很好地覆盖了所有街区,以便模型可以了解这如何影响价格。

道德规范

在项目开始时考虑工具的潜在危害是很重要的。这些危害可能是由于只为一个狭窄的用户群体设计,没有足够的子群体代表性,或者人类贴标机偏向特权群体。

机器学习发现并归纳数据中的模式,因此可以复制偏差。如果一个群体的代表性不足,机器学习模型可以学习的例子就更少,导致这个群体中那些个体的准确性降低。

当大规模实现这些模型时,可能会导致大量有偏见的决策,伤害大量的人。确保您已经评估了风险,并准备好了减轻风险的技术。

数据探索

一旦您可以访问数据,您就可以开始数据探索。这是为您的数据创建有意义的摘要的阶段,如果您不熟悉这些数据,这一阶段尤其重要。这也是你应该测试你的假设的时候。活动类型和可能要问的问题包括:

  • 计算记录的数量—这是您所期望的吗?
  • 什么是数据类型?你需要为机器学习模型改变这些吗?
  • 寻找缺失的价值——你应该如何处理这些?
  • 验证每列的分布情况—它们是否符合您预期的分布情况(如正态分布)?
  • 搜索异常值—您的数据中有异常吗?所有值都有效吗(例如,年龄不小于 0)?
  • 验证您的数据是否平衡-您的数据中是否代表不同的组?你希望预测的每一类都有足够的例子吗?
  • 您的数据中是否存在偏见——您的数据中的子群是否比其他子群更受青睐?

主要考虑事项

缺失值

理想的数据集应该是完整的,每个观察值都有效。然而,在现实中,您会遇到许多“NULL”或“NaN”值。

处理缺失数据的最简单方法是删除所有有缺失值的行,但是有价值的信息可能会丢失,或者您可能会引入偏差。因此,重要的是要努力理解缺失值是否有原因或模式。例如,特定人群可能不会回答调查中的某些问题;移除它们将阻止这些群体中的学习趋势。

删除数据的替代方法是输入值;用适当的替代值替换缺失的值。对于连续变量,通常使用均值、中值或众数。而对于分类数据,它通常是模式或新类别(例如“NA”)。如果列中有很大比例的值丢失,您可能希望将它们完全删除。

离群值

异常值是与其他观察值显著不同的数据点。一旦您确定了异常值,您还应该调查是什么导致了它们。

离群值可能表示坏数据:收集不正确的数据。如果是这种情况,您可能希望移除或替换这些数据点(类似于您如何估算缺失数据的值)。或者,这些值对于您的机器学习模型可能是有趣和有用的。

一些机器学习算法,如线性回归,可能对异常值敏感。因此,您可能希望只使用对异常值更鲁棒的算法,如随机森林或梯度增强树。

不平衡数据

如果每个类没有相似数量的示例,则数据集是不平衡的。这在欺诈检测等分类问题中很常见;大多数交易是正常的,而一小部分是欺诈性的。

机器学习算法从例子中学习;它拥有的例子越多,它对自己发现的模式就越有信心。如果数据不平衡,模型可能无法识别哪些模式与少数民族类别相关联。

在处理不平衡数据时,必须小心使用性能指标。例如,在我们的欺诈示例中,准确性可能会产生误导:如果 99.9%的交易不是欺诈,那么通过简单地将所有交易标记为“非欺诈”,而无需搜索进一步的模式,模型就可以达到 99.9%的准确性。您可能希望考虑其他指标,如精确度、召回率或 F1 分数。

要素也可能不平衡,从而阻止算法了解这些类别如何影响输出。例如,您有一个主要包含一个子群体的数据集,而这个群体之外的客户使用您的产品却没有获得成功的结果。为了防止这种形式的偏差,您应该计算不同类别的准确性指标。

后续步骤

在你彻底理解了你的数据之后,希望你已经准备好进入下一步数据准备:清理、转换&特征工程

使用 DVC 和 GitHub 进行数据版本控制和机器学习过程控制

原文:https://towardsdatascience.com/data-version-control-machine-learning-process-control-using-dvc-github-c629511e95b5?source=collection_archive---------33-----------------------

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

DVC workflow

即使我们今天在机器学习(ML)方面取得了所有的成功,特别是深度学习及其在商业中的应用,数据科学界仍然缺乏组织项目和跨各种 ML 项目有效协作的良好实践。

提高机器学习工作流的生产率是必要的。作为 K 集团诊断公司的一名数据科学家,我要处理数百千兆字节的数据。对于数据科学家来说,管理和跟踪数据确实非常困难。数据跟踪对于任何数据科学工作流都是必不可少的。对数据版本化的需求是极端的,因此数据版本控制(【https://dvc.org】)对于任何数据科学家来说都是非常重要的工具。对于您的数据科学项目来说,这是一个非常方便和有用的工具。主要原因是,

  • DVC 跟踪 ML 模型和数据集: DVC 旨在使 ML 模型可共享和可复制。
  • **ML 项目版本控制:**版本控制机器学习模型、数据集和中间文件。
  • **ML 实验管理:**利用 Git 分支的全部力量来尝试不同的想法,而不是代码中草率的文件后缀和注释。
  • **部署&协作:**使用推/拉命令将一致的 ML 模型、数据和代码束移动到生产、远程机器或同事的计算机中,而不是特定的脚本。

这里的主要优势是,我们可以使用亚马逊 AWS S3,微软 Azure 和其他数据/资源管理系统。我们可以配置这些系统来存储、读取、写入和快照数据。设置和使用非常简单,

  1. 使用安装 DVC,(假设您已经准备好 python 环境)
pip install dvc

2.执行 DVC 初始化,(假设您在 Github 存储库中,如果不是,则执行)

git initdvc init

3.现在让我们假设我们的项目有“数据”文件夹,其中有各种数据目录(通过 AWS S3 连接和下载)

├── data   
│    ├── exp1
│       ├── x1.png
│       ├── y1.png
│    ├── exp2
│       ├── x2.png
│       ├── y2.png
│    └── exp3
│       ├── x3.png
│       ├── y3.png
│    └── exp4
│       ├── x4.png
│       ├── y4.png

第一次使用这些数据后,我们将执行以下步骤。

dvc add ./data/exp1 && git add ./data/exp1.dvcdvc add ./data/exp2 && git add ./data/exp2.dvcdvc add ./data/exp3 && git add ./data/exp3.dvcdvc add ./data/exp4 && git add ./data/exp4.dvc

这将创造。每个文件夹的 dvc 文件,该文件将被提交到 GitHub,这样我们就知道哪个版本的模型使用哪个版本的数据。

在这之后,如果我们使用远程数据存储,我们需要推动 dvc 变化,

dvc push filename 

该命令将推送最近的更改并将更新缓存,让我们来做,

dvc status

这将检查数据中的任何潜在变化,如果有的话,它将跟踪它,我们可以提交它。

DVC 让合作变得非常容易。合作者可以用同样的方式设置它,或者他们可以用“dvc pull filename”命令提取数据。

此过程还适用于包含比当前持久存储在数据文件夹中的数据多得多的数据版本,因为 dvc 在其缓存中存储不同版本之间任意大小的差异,因此可以通过其 checkout 命令重新创建数据目录的较旧或较新状态。当然,结账也可以是另一个方向。

关于命令的更多信息,请访问它们的文档这里

要将 DVC 与亚马逊 AWS S3 配合使用,请访问 https://dvc.org/doc/user-guide/external-dependencies

最好的总体亮点和特点是,

  1. 它是 Git 兼容的!DVC 运行在任何 Git 存储库之上,兼容任何标准的 Git 服务器或提供商(GitHub、GitLab 等)。数据文件内容可以由网络可访问存储或任何支持的云解决方案共享。DVC 提供了分布式版本控制系统的所有优势——无锁、本地分支和版本控制。
  2. 这是存储不可知论。你可以使用 S3、谷歌云和 Azure。
  3. 它附带了度量跟踪,并包含一个命令来列出所有分支,以及度量值,以跟踪进度或选择最佳版本。
  4. 与语言和框架无关
  5. 为 ML 管道框架提供端到端支持。
  6. 它可以跟踪故障!
  7. 它也兼容 HDFS,蜂巢和阿帕奇火花。

所以试试吧,让你的生活变得轻松!点击这里开始吧!作为一名数据科学家,我强烈推荐每个数据科学家在他们的 ML 管道中使用它。

使用 DVC 进行数据版本控制。作者有什么要说的?

原文:https://towardsdatascience.com/data-version-control-with-dvc-what-do-the-authors-have-to-say-3c3b10f27ee?source=collection_archive---------4-----------------------

数据版本化是数据科学项目中最被忽视的特性之一,但这必须改变。在这里,我将讨论一个最近的播客,它是为此目的的最佳工具的创造者之一, DVC

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

If your data project looks like this, you have to read this article.

数据操作在数据科学中非常重要,我认为数据科学家应该更加关注数据操作。这是数据科学项目中较少使用的功能。目前,我们通常对代码进行版本控制(用 Git 之类的东西),越来越多的人和组织开始对他们的模型进行版本控制。但是数据呢?

在下一篇文章中,我将详细介绍如何将 Git 和 DVC 以及其他工具结合使用,对数据科学(和科学)项目中的几乎所有内容进行版本控制。

最近,DVC 项目创始人德米特里·彼得罗夫在播客上接受了托比亚斯·小萌的采访。init 一个 Python 播客。在这篇博文中,我提供了一份采访的文字记录。你可能会对 DVC 背后的想法以及 Dmitry 如何看待数据科学和数据工程的未来感兴趣。

你可以在这里收听播客:

[## 机器学习项目的版本控制

采访 DVC 的创造者,了解它如何提高协作并减少数据科学上的重复工作…

www.pythonpodcast.com](https://www.pythonpodcast.com/data-version-control-episode-206/)

TL;速度三角形定位法(dead reckoning)

我们需要更加注意如何组织我们的工作。我们需要更多地关注我们如何构建我们的项目,我们需要找到我们浪费时间而不是做实际工作的地方。作为一名数据科学家,变得更有组织性、更有生产力是非常重要的,因为今天,我们仍然处于蛮荒的西部。

文字记录

免责声明:这份文字记录是我听播客并写下我所听到的内容的结果。我用了一些软件来帮助我转录,但大部分工作是由我的耳朵和手来完成的,所以如果你能改进这个转录,请随时在下面留下评论:)

托比亚斯:

你的主持人一如既往的托拜厄斯·梅西,今天我要采访德米特里·彼得罗夫关于 DVC,一个机器学习项目的开源版本控制系统。德米特里,你能从自我介绍开始吗?

德米特里:

当然可以。嗨,托拜厄斯。很高兴参加你的节目。我是德米特里·彼得罗夫。我有数据科学和软件工程的混合背景。大约 10 年前,我在学术界工作,有时我会说,我从事机器学习超过 10 年,但你可能知道,10 年前机器学习主要是线性回归和逻辑回归(笑)。这差不多就是我一直在做的。

后来转行做软件工程。我写一些生产代码。那时候数据科学还不是个东西。大约五年前,我转回定量领域。我成为了微软的数据科学家。我看到了现代数据科学的样子。最近,我,我实际上又回到了软件工程。今天我们在研究 DVC,我主要是为机器学习开发工具。

托比亚斯:

你还记得你是如何第一次接触 Python 的吗?

德米特里:

我想这发生在 2004 年。这是偶然发生的,我在我的硕士项目期间得到了一个实习机会,我参与了一个 Python 项目,这是我的第一个脚本语言。当然,至少在我的函数式编程课上我不算,它是由 Python 2.2 驱动的,然后我们切换到 2.3。

我花了许多不眠之夜调试 Python 2 中的 Unicode 问题(笑),如果你使用 Python 2,你可能知道我在说什么。后来我发现自己在从事的每个研究项目中都在使用 Python。我们还在用 MATLAB 进行机器学习。10 年前,Python 非常流行,我们使用普通的 C 语言来表示低级软件,让我们想象一下,当驱动器跟踪一些信号时,但一般来说,Python 是我实验室的主要语言,当我作为软件工程师工作时,我的主要语言是 C++。所以,我仍然使用 Python 进行自动化的特别项目。

那时有很多关于 Python 和 Perl 的讨论,对我来说这不是一个问题。所以在我回归数据科学的过程中,我一直使用 Python。Python 成为我的主要语言,因为它是当今人们使用的顶级语言之一。我们为数据科学家构建工具,我们使用 Python。

托比亚斯:

你一直在做的一个工具是名为 DVC 或数据版本控制的项目,你能先解释一下它是什么以及这个项目是如何开始的吗?

德米特里:

DVC 它基本上是机器学习项目的版本控制系统,你可以认为 DVC 是一个命令行工具,它是 ML 的一种 Git,它给你什么。它给出了三个基本的东西。首先,它可以帮助您跟踪我们的大型数据文件,例如,10 GB 数据文件、100 GB 数据集、ML 模型,它还可以帮助您版本化管道、机器学习管道,这与数据工程管道不同。这是一个轻量级版本的管道,DVC 帮助你组织你的实验,并使它们自我描述,描述,自我记录,基本上,你知道,一切,一个模型是如何产生的,你需要运行什么样的命令,作为这个实验的结果产生了什么样的指标。

您将在 Git 历史中拥有所有这些信息。DVC 从技术角度帮助你浏览你的实验,我们使用 Git 作为基础。所以它 DVC 工作在 Git 和云存储之上。你可以使用 S3,你可以使用谷歌存储或 Azure,或者只是随机的 SSH,服务器你存储数据,DVC 基本上编排 Git 和云存储。

你还问,DVC 是如何开始的。这其实是另外一个故事。因为最初,当我们开始这个项目的时候,我们没有想到用 Git 来代替 ML。我们想的是数据科学经验,什么是最佳实践,我们受到数据科学平台想法的启发,你可能听说过米开朗基罗,优步的数据科学平台,你可能听说过多米诺数据实验室。

今天,实际上,每个大型技术公司都有自己的数据科学平台,因为他们需要以某种方式在大型团队中工作,对吗?他们需要合作。软件工程工具集对于 ML 项目或数据科学项目来说并不完美。但是当我们在看这个平台的时候,我们在想,未来的平台应该是什么样子,我们应该如何创建一个数据科学家可以使用的平台,这个平台可以被广泛采用,高度可用。我们提出了这个想法,未来数据集平台的原则。它必须是开源的,这是你可以像社区驱动一样的方式,这是你可以创建一个每个数据科学家都可以使用的公共场景的方式。

如果它必须是分布式的,这很重要,因为有时你在你的桌面上工作,因为你有 GPU,例如,有时你仍然需要你的笔记本电脑工作。有时你需要云资源来运行一个特定的模型,例如,你需要大量的内存。无处不在很重要。

根据这个原则,我们想出了这个主意,为什么我们不重用 Git 作为我们工具的数据科学平台的基础。然后我们意识到这非常接近版本化的想法,我们只需要版本数据集,我们需要版本实验。DVC 就是这样开始的。

托比亚斯:

你提到用于常规软件项目的传统版本控制系统对于机器学习来说是不够的,因为需要能够跟踪数据集以及代码本身和一些结果模型。那么你能不能介绍一下与 DVC 一起工作的整个工作流程,以及它与软件工程项目的常规 Git 工作流程有何不同,后者可能侧重于 Django 应用程序。

德米特里:

首先,我们需要了解软件工程和机器学习的区别是什么。机器学习是由实验驱动的,问题是,你有一堆实验,你有几千个,有时几百个实验,你需要和你的同事就实验进行交流。基本上是和自己,因为明天你就不记得今天发生了什么。在一个月内,你不可能记得你今天做了什么,以及为什么这个想法产生如此差的结果,你需要像在许多情况下一样跟踪每件事。你可能会遇到这样的情况:你的一个同事来到你的办公室,说——嘿,你知道吗?我花了两天时间尝试这个想法。你知道吗,这不管用。你会说,是的,我试过了,两周前我试过同样的想法。我知道,没用。很难交流这些想法,因为你只有几十个,有时几百个。这就是区别。你需要一个框架来交流大量的想法,大量的实验。

在软件工程中,工作流是不同的。您的 idea 功能请求和错误修复数量有限。我可以说一句有争议的话——在软件工程中,你几乎从来不会失败。如果你决定实现一些问题,实现一些特性,或者修复一个错误,你创建一个分支。十有八九,分支会被合并到主流。你可能会在你生产的软件的质量方面失败,你可能会在预算方面失败,因为你认为它就像一个一天的项目,而你最终花了两个星期来实现这个功能。但最后还是会合并。

在数据科学中,你尝试了 10 个想法,其中一个效果最好,其余的都没用。但是你仍然需要沟通所有这些。DVC 基本上帮助你做到这一点,它帮助你版本化你的实验,你的实验的度量,你看到产生的度量,你看到用于这个特定实验的代码,这个特定版本的数据集。

例如,这比 Excel 电子表格工作得更好。因为今天,许多团队只使用 Excel 电子表格来跟踪他们的实验。这就是自我记录实验的基本区别,清晰的合作实验方式,以及观察结果的方式。

数据版本化是一件独立的事情,对实验来说很重要,是实验的必备。有时人们使用 DVC 只是为了数据版本控制,通常,例如,在部署端工作的工程师,他们使用 DVC 来部署模型。有时他们,数据工程师,数据科学家使用 DVC 只是为了版本化数据集。有时人们用 DVC 代替 LFS,因为 LFS 有一些限制,而 DVC 是为几十或几百千兆字节优化的。

托比亚斯:

对于您正在进行的实验类型,我知道一些输入可以采用特征工程的形式,您可以尝试提取数据的不同属性,或者更改您正在调整的超参数,以尝试获得模型的特定输出。因此,您能否讨论一下 DVC 如何能够跟踪这些以及它所支持的一些通信范例,以确保您不会因为无法提前识别特定的功能集、超参数和数据输入都已一起尝试过,而与他人重复相同的工作,从而浪费时间和精力?

德米特里:

哦,从数据文件的角度和数据集的角度来看,DVC 只是跟踪他们。所以你的特点是,基本上 DVC 把每个文件都当作一个 blob,我们通常不涉及数据文件的语义和数据文件的结构。模特也一样。所以模型只是二进制的。DVC 能理解模型被改变了,它能理解二进制文件的这个特定版本是在这个特定步骤上产生的。这个特定的输入被消费了,但是它没有进入特性内部,没有进入数据的语义。

托比亚斯:

就整体沟通模式而言,当数据科学家在通过 DVC 管理的项目中工作时,他们会关注哪些事情,以确保他们不会重复这项工作,以及他们会识别的任何类型的信号,如果只使用 Git 本身,这些信号会丢失吗?

德米特里:

首先,实验的结构。这是数据科学中非常重要的,你需要知道。我的意思是,不仅仅是在数据科学领域。在工程案例中也是如此。您需要了解使用了哪种代码,您的代码的确切版本是什么,以及所使用的数据集的确切版本是什么。这就是你如何相信你三周前做的实验。

还有一点就是度量。如果您知道这一点,那么这个版本的数据集的代码会产生它所创建的信任度的特定值。如果您在 Excel 电子表格中看到这个结果,您不需要再次重做这项工作,它可能有一些差异,对吗?这可能是您流程中的一个错误。你可能会重复做同样的事情。

对于文档,您可以只使用 Git 提交。当您提交您的结果时,这意味着您提交了管道,您提交了您的数据集和输出结果的一个版本,您放置了一个消息。Git 中的消息,因为它是非常简单的文档形式。这其实是一个非常强大的。DVC 所做的基本上是为数据项目服务。因为在我们的常规工作流程中,您可以提交代码,但您与数据没有联系,您与您的输出指标没有明确的联系。有时你甚至没有与你的管道连接。因为该提交可能与一个特定的改变相关,所以将执行管道的一个特定部分,而不是整个管道。

托比亚斯:

至于您正在跟踪的指标,您能否谈一谈这些指标是如何获取的,以及它们在整个评估和实验周期中的一些考虑因素,以确保模型产生您期望的输出类型和整个项目?

德米特里:

DVC 是一个数字不可知的工具,也是框架不可知的。DVC:它也是度量不可知论者。这意味着我们以简单的文本文件形式来跟踪指标。您的指标是带有一些头文件的 TSV 文件,或者 CSV 文件或 JSON 文件。当你刚刚输出我们有一个五个指标的值,DVC 允许你查看你的整个实验,哪些指标是产生的,你可以发现这个想法,例如,哪个失败了,因为指标不完美,实际上产生了一个更好的另一个指标有一个好的方法。你可能需要深入研究这个实验。

所以它向你展示了你的分支,你的提交的度量,它基本上帮助你通过度量导航你复杂的 Git 结构树。这是一种数据驱动的方式来浏览您的 Git 存储库。在一个数据项目中,您可能有数千个提交,数十万个分支。DVC 基本上帮助你通过这个复杂的结构导航。这就是我们需要指标的原因,这就是 DVC,它特别支持指标。

托比亚斯:

是否有一个内置的支持来搜索这些指标值并跨分支进行比较?或者,你需要在每个项目的基础上,实现一个特定的函数调用,来决定,在不同的比较中,它是正值还是负值。

德米特里:

今天,我们基本上展示了这些指标。如果你需要导航,你需要正确地实现一些东西,但是如果我们实现一些逻辑指标特定的逻辑,例如,显示这个特定指标的最大值,我不会感到惊讶。告诉我这些指标组合的最大值,就像这样。

托比亚斯:

除了通常用于常规软件应用程序的版本控制。还有许多其他类型的工具有助于确保您正在构建的项目是健康的,并且您没有代码退化。所以类似于林挺或者单元测试支持的东西。我想知道,当你在构建机器学习项目时,应该考虑哪些相邻的问题?你和 DVC 的工作或者你的其他项目有什么联系吗?

德米特里:

这是个很好的问题。因为,一般来说,数据项目中的工具集与软件项目中工具集的状态不同。大概一个月前,在西麦肯锡的一次采访中。他说,在数据科学方面,我们仍然处于蛮荒的西部。这实际上是正在发生的事情(笑),我们对许多场景没有很大的支持。

但从工具的角度来看,我今天看到的是,它在算法方面已经相当成熟了。因为我们有 PyTorch,我们有 TensorFlow,我们有一堆其他算法,比如基于随机树的算法。今天,有一场在线监控工具的竞赛。例如 TensorBoard,你可以在训练时在线报告你的指标,并查看现在训练阶段的实际情况。这对深度学习尤其重要,因为算法仍然很慢,我想说,它们是这个领域的一堆商业产品,而 MLflow 是开源项目之一,正变得越来越受欢迎,它可以帮助你跟踪你的指标并可视化训练过程。这是当今的一种趋势。

另一个趋势是如何可视化你的模型,如何理解你的模型里面有什么。同样,有很多工具可以做到这一点,但是这个工具的状态仍然不完美。就单元测试而言,你可以只使用常规的单元测试框架。但我不能说它对 ML 项目真的有效,具体来说,我多次看到的是单元测试或者可能不是单元,而是数据工程师的功能测试。在数据工程部分,当一组新的数据进入你的系统时,你可以获得基本的指标,并确保指标没有漂移,它们不是指标的大变化。这就是单元测试,或者至少是测试在数据世界中的工作方式。但是总体来说,工具仍然处于蛮荒的西部。

托比亚斯:

接下来是内置于 DVC 中的数据版本。当我通读文档时,它提到实际的数据文件本身存储在外部系统中,如 S3,或谷歌云存储或类似 NFS 的东西。因此,我想知道您是否可以谈谈 DVC 实际上是如何管理这些数据的不同版本以及它能够跟踪的任何类型的增量更改,或者您在构建该系统并将其与您使用的软件控制集成的过程中面临的任何困难或挑战,Git for in the overall project structure?

德米特里:

是的,当然,我们不会将数据提交到存储库(笑),我们通常会将数据推送到您的服务器、您的云中,您可以重新配置数据以将其放入云中。如前所述,我们将数据视为二进制 blobs。对于每个特定的提交,我们可以为您带来实际的数据集,以及所有正在使用的数据工件。我们对每个文件不做任何区分,因为你需要理解文件的语义才能做区分,对,这不是区分。在 Git 中,让每个文件都与众不同是有意义的。

在数据科学中,你需要知道你使用的数据文件的确切格式。然而,我们将目录作为独立的结构类型来跟踪。如果您有一个包含 100.000 个文件的目录,然后您在目录中添加了几个文件并提交这是您数据集的新版本,那么我们知道只有一小部分文件发生了更改,比如说修改了 2000 个文件并添加了 1000 个文件,然后我们在 diff 上进行版本化,这样您就可以每周轻松地在数据库中添加标签,而不用担心目录的周期,我们会进行这种优化。

另一个优化,我们做的重要优化是优化您的工作空间。当 Git 从我们的内部结构中签出文件时,它会在您的工作空间中创建一个副本,但是在数据世界中,有时这是没有意义的,因为您不想创建 100 个副本,比如说千兆字节的数据,另一个副本。我们通过一些参考来优化这个过程。

所以你没有数据集的副本。因此,您可以轻松处理数百 GB 或数十 GB 的数据,而无需担心这个问题。

托比亚斯:

对于正在参与现有项目的人来说。他们只是第一次检查存储库的状态,是否有能力说我只想下载代码,我还没有准备好下载所有数据,或者我只是想下载数据的子集,因为正在处理数百 GB 数据集的人不一定希望在他们的笔记本电脑上安装所有这些数据,因为他们正在进行这些实验。我很好奇,当您在本地工作时,当您训练模型时,整个工作流是什么样子,它如何处理这些大型数据存储库并与之交互,以确保它不会完全填满您的本地磁盘。

德米特里:

这是一个好问题。我们做这种精细拉动,我们也优化这一点。作为一名数据科学家,你可以决定你到底需要什么。例如,如果您想要部署您的模型,它可能在 100 兆字节以内,您可能不需要为 100 GB 的数据集浪费时间,这是为了产生模型而使用的。

然后,您可以在数据文件上指定任何内容,比如用代码和元数据克隆一个新的存储库。然后说我只需要一个模型文件。所有的模型文件将被传送到你的生产系统到你的部署机器上,并且是相同的数据集。

托比亚斯:

我已经谈到了一些其他项目,人们正在构建它们,例如 Quilt 或 Pachyderm,它们内置了对数据版本的支持。我想知道您目前是否有任何与这些系统集成的计划,或者只是为 DVC 的数据存储部分增加额外支持所涉及的整个过程?

德米特里:

对于一些系统集成可以很容易地完成,例如,Pachyderm 这是一个项目,它主要是关于数据工程。他们对我们的管道有一个概念,有点像数据工程管道。DVC can 可用于数据工程流水线。它有 ML 管道的概念,一个轻量级的概念。它是专门为机器学习工程师优化的,它没有数据工程管道的所有这些复杂性,但它可以很容易地用作单步和工程管道。

我们已经多次看到,当人们采取,例如 DVC 管道,并把内部气流作为一个单一的步骤。有了这种设计,其实是一个很好的设计,因为你给了 ML 工程师和数据科学家一个轻量级的工具,所以他们很容易产生一个结果。他们可以更快地迭代以创造他们的工作。你有一个生产系统,DVC 可以很容易地注入其中。

有一个术语我不记得是哪个公司用的了。网飞,可能——甲板内甲板;这意味着你有一套数据管道,你有一套解决特定问题的 ML 平台,然后基本上在数据工程平台中注入许多 ML 平台。因此,从这个角度来看,没有集成的问题,没有集成到厚皮动物或气流或其他系统的问题。关于被子数据,他们做版本控制,他们也和 S3 一起工作,潜在地我们可以做我们可以和他们集成。我们正在思考这个问题,我们正努力做到以消费者为导向,以客户为导向。今天最大的需求可能是与 MLflow 的集成,因为 MLflow 在在线指标跟踪方面表现非常好。有时人们喜欢使用 MLflow 进行跟踪,在线跟踪指标,使用 DVC 对数据文件进行版本控制。这是我们今天正在思考的整合之一。

托比亚斯:

就 DVC 本身的实际实现而言,我知道它主要是用 Python 编写的。您提到,这在很大程度上是因为它正在成为数据科学家的通用语言。所以我想知道,现在你是否在 DVC 的整体实施和维护方面更进一步,如果你认为这仍然是正确的选择?如果你今天重新开始,在语言选择、系统设计或整个项目结构方面,你会做哪些不同的事情?

德米特里:

我认为 Python 是这类项目的好选择,有两个主要原因。第一,我们的目标是数据科学家,他们中的大多数人都熟悉 Python。我们期望数据科学家为我们的代码库做出贡献。如果你用 C 或 C++,或 Golang 编写这类项目,很可能你不会看到社区的很多贡献。因为社区讲不同的语言。对我们 for works 完美来说,数据科学家正在贡献代码,这很棒(笑)。

第二个原因是编程 API。之前,我们考虑通过 API 创建一个 DVC,这是使用 DVC 的另一种选择。如果你用 Python 写代码,它有点开箱即用,你可以重用 DVC 作为一个库,并将其注入到你的项目中。如果你将使用一种不同的语言,这只会产生一些开销,你需要考虑将这些转换成一种更好的形式。这些就是原因。到目前为止,我们是快乐的 Python,它工作得很好。

托比亚斯:

你提到能够使用 DVC 也是一个图书馆。所以我想知道是否有你见过的特别有趣或意想不到或新奇的用例,无论是在那个库用例中,还是在它最初设计的面向命令行的方式中?

德米特里:

有时候你们这些人会要求库支持,因为他们需要实现一些更疯狂的场景(笑)。例如,我可以说,人们使用 DVC 来构建自己的平台,如果你想要数据科学平台,他们希望构建持续集成框架,当 DVC 在你的本地经验和 CI 经验之间发挥所有这种粘合剂的作用时,他们要求库,但我们有一个如此棒的命令行支持命令行工具集,人们只需切换回命令行体验。但是有一天,如果有人将 DVC 仅仅作为一个图书馆,我不会感到惊讶。

托比亚斯:

我还对您谈到的将 DVC 集成到数据工程管道中的能力很感兴趣,因为只需包装一个实施步骤就可以运行模型培训部分。因此,我想知道您是否可以就此以及您所看到的一些具体实现多谈一点?

德米特里:

是啊,绝对的。这其实是一个很好的问题。我相信数据工程师需要管道,对吗?。数据科学家和机器学习工程师需要管道。但事实是,他们的需求完全不同。数据工程师确实关心稳定的系统,如果它失败了,系统需要做些什么,它必须恢复。这是数据工程框架的主要目标。

在数据科学中,情况正好相反。你总是失败(笑)。当你想出一些主意,你写代码运行一个失败的分数,你觉得它失败了,等等。你的目标是建立一个框架来快速检查想法,快速失败。这是 ML 工程师的目标。这是一个很好的实践来分离两个框架有两种管道框架。一个是稳定的工程,第二个是快速,轻量级的实验管道,如果你愿意的话。

当你把这两个世界分开时,你就大大简化了 ML 工程师的生活。他们不需要处理复杂的东西,我们不需要浪费时间去理解气流是如何工作的,Luigi 是如何工作的,他们只是生活在他们的世界里,制作模型,一旦模型准备好了,他们需要一种清晰的方式来将这条管道注入数据管道。为了做到这一点,您可以构建一个非常简单的工具。我记得当我在微软工作的时候,我花了大概几个小时来生产我的管道。因为我有一个独立的工作流程,所以我有一个独立的 ML 管道工具。这个很好用。我相信在这种未来的工程师中,我们需要把这两件事分开。

托比亚斯:

我还对 DVC 提供的部署功能感兴趣,只要它能够将模型投入生产,或者在产生错误输出的情况下恢复模型的状态,或者预测是它提供的结果给业务带来问题,或者只是在生产中运行机器学习模型所涉及的一些整体工具和工作流, 特别是度量跟踪,以了解模型何时需要重新训练,并完成构建和部署这些模型的整个过程。

德米特里:

是的,部署,我们正等着得到它,因为它接近业务。还有一个关于 ML 模型部署的小趣事。有时候是这样的——一个软件工程师和一个数据科学团队,我们能不能对我们的模型做更多的检查,不是对上一个模型,而是对上一周的模型?数据科学家喜欢——是的,当然,我们有数据集,你需要五个小时来重新训练它(笑)。

花五个小时是没有任何意义的,在软件工程工作世界中,它不是这样工作的。你需要准备好所有可用的东西。你需要马上复习,因为等五个小时意味着浪费做生意的钱。

DVC 基本上帮助你组织这个过程,它帮助,它基本上在你的产生一个模型的数据科学家和拿模型和部署模型的 ML 工程师之间创造一个共同的语言。因此,下一次,有了适当的数据管理,你甚至不会要求数据科学家给你一个以前的模型,你应该在你的系统中拥有 DVC 或 DVC 的一切,不管你需要什么,都是可用的工件。

从在线指标跟踪的角度来看,这实际上是一个独立的问题。因为当你在生产中谈论度量跟踪时,它通常意味着在线度量。这通常意味着基于用户反馈的指标。这是另外一个问题。所以 DVC 主要是关于部署或不部署,主要是关于开发阶段。它基本上不会对在线指标做任何事情。

托比亚斯:

所以你实际上是在 iterative.ai 的主持下构建和维护这个项目,这实际上是一家风险投资支持的公司。所以我很好奇,对于你的投资者来说,总的价值等式是什么,使得他们值得为你构建和发布这个开源项目的努力提供资金。以及你对业务的总体战略。

德米特里:

你会惊讶(笑)投资者对今天的开源项目如此感兴趣,尤其是去年开源项目非常成功。去年,Mulesoft 被数百万或数十亿收购,对不起,去年弹性搜索上市。纯粹是开源公司。

而当你做开源的时候,通常意味着你在做 it 基础设施。在许多情况下,你做的是 IT 基础设施,它们有利于盈利。对于一个成功的开源项目,那些将开源项目货币化的公司,理解你的商业模式是非常重要的,因为开源有一些共同的模式。

一种是服务模式,一种咨询模式。第二件事是开放核心模式,当你构建软件,并为企业生产一个具有高级功能的软件,或一个不同版本的软件,作为产品。

第三个模型是生态系统。当你构建一个产品,一个开源产品,并创建服务作为一个独立的产品。一个例子可能是 Git 和 GitHub,当他们有开源和 SaaS 服务时,这是绝对不同的产品,是绝对不同的体验和用例。你需要明白你适合哪种模式。对于成功的项目是很多希望在这种企业感兴趣的这种经验。

最初,我开始了这个项目,因为它是我最喜欢的项目,持续了大约一年。然后我在想——如何把这件事做大,如何在这件事上花更多的时间,如何找到更多的资源来做这件事。很明显,这个项目如果成功,将会有一些企业在这个领域赚钱。我们为什么不做这个业务,它打造一个产品,把这个产品货币化。所以我会说,这是现代开源世界的自然之路。

托拜厄斯:

就构建和维护 DVC 项目和社区的整体经验而言,我想知道您在这个过程中发现了哪些最有趣、最具挑战性或最意想不到的经验教训。

德米特里:

我学到的一课,实际上,我认为这是通常的商业课。所以当你建立你的项目时,你知道你做什么,你知道,你的路线图,你知道你的目标,你只是在建立,但有一天用户来找你。他们要了很多不同的东西。

然后你就有了紧张,你的愿景,你的计划和用户的需求之间的紧张。今天,我们每天都会收到用户的一些请求,所以我们每天有 10 个请求(笑)。平衡这些东西不容易。因为如果你按照人们的要求去做,你就没有时间制定你的路线图了。事实上,你没有时间去解决和实现人们要求的每一件事。所以你需要学会如何区分事情的轻重缓急。你需要学会怎么说,有时候对用户说不,说我们会这么做,但很可能不是现在。所以这并不容易做到。这是你在过程中需要学习的。正如我所说的,开源软件的体验和商业环境中的体验是一样的。我已经看过很多次了。

托拜厄斯:

展望你为 DVC 计划的工作,我很好奇你在路线图上有什么类型的特性或改进。

德米特里:

在不久的将来,我们将发布对数据集版本化和 ML 模型版本化的更好支持。我们正在向 DVC 介绍新来者,这简化了你今天的体验。一些公司正在使用 mono-repos,里面有一堆数据集。我们需要新的命令来做得更好,有时是因为这些数据集以不同的速度发展。有时,您需要使用数据集一个版本,一个版本使用其他版本。所以基本上,这是我们正在采取的步骤之一。

数据集的另一个用例是交叉存储库引用。其他公司没有使用单一回购,而是使用一系列回购。例如,他们可能有 10、20 个数据集的回复,还有 20 多个模型的回复。他们需要交叉引用数据集,这是我们要实施的下一个命令,以支持这种交叉引用、跨存储库的情况。这是我们不远的将来。

从长远来看,下一步将是实现更多的特性来更好地支持实验,特别是当人们处理诸如超参数调整这样的场景时。他们需要做 1000 次实验。他们仍然需要控制他们。他们不想有 1000 个分支(笑)。这是我们需要改进的体验。我们对如何做到这一点有一个明确的计划。这差不多是未来半年的事了。最终,我们相信 DVC 可以成为这个平台,当人们可以在一个团队中在相同的环境下工作,并相互分享想法。在未来,我们相信我们可以创造体验,当人们可以分享想法,甚至在公司之间,团队之间,伟大的体验。

我相信这是 DVC 的美好未来。

托比亚斯:

你在 DVC 做的工作或机器学习项目的整体工作流程中,有没有其他方面是我们还没有讨论的?你认为我们应该在节目结束前讨论一下吗?

德米特里:

我不知道他们有什么要补充的。但是我相信,我们需要更加注意如何组织我们的工作。我们需要更多地关注如何构建我们的项目,当我们浪费时间而不是做实际工作时,我们需要找到更多的地方。作为一名数据科学家,这对于提高组织能力和工作效率非常重要,因为今天我们仍然处于蛮荒的西部,这需要尽快改变。注意这一点很重要,理解这个习题集也很重要。

托比亚斯:

好吧。好吧,对于任何想跟进你正在做的工作或者想取得联系的人,我会让你把你的首选联系信息添加到展示笔记中。因此,我将把我们带到图片中,本周,我将选择一个我最近开始使用和试验的工具,名为 otter.ai。

它被宣传为一种语音笔记服务,可以将你的会议笔记或你自己的记忆笔记转录到文本中,以便于搜索。我一直在尝试用它来为播客制作转录。所以我期待着开始更频繁地使用它,并开始录制节目。所以,如果你正在寻找一个能以合理的价格自动生成副本的工具,那绝对值得一试。就这样,我会把它传给你来认识你。你这周有照片吗?

德米特里:

所以我认为开源部分和开源与风险投资是我们将要讨论的问题。事实上,我没有什么特别的建议,但是今天天气很好。春天刚刚开始。所以只是花更多的时间在城市或城镇之外的地方走走。

托比亚斯:

好的,非常感谢你今天抽出时间和我一起讨论你在 DVC 做的工作,并为机器学习生命周期的整体项目开发添加一些更好的结构。所以谢谢你。我希望你今天过得愉快。

德米特里:

哦,谢谢你,托拜厄斯。谢谢你。

结论

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

https://dvc.org/

我们需要测试和版本控制来理解我们在做什么。当我们编程时,我们一直在做很多不同的事情,我们在测试新的东西,尝试新的库等等,把事情搞砸并不罕见。这是数据科学的道路,快速失败,迭代成功。

DVC 是我们目前拥有的控制数据项目的最佳工具之一,正如你所看到的,它可以与其他伟大的工具相连接。我希望这篇采访和文章能帮助你开始使用它们。

如果您有任何问题,请在此写信给我:

[## 法维奥·瓦兹奎-科学与数据公司创始人/首席数据科学家| LinkedIn

加入 LinkedIn ‼️‼️重要提示:由于 LinkedIn 技术限制,我现在只能接受连接请求…

www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)

祝学习愉快:)

数据可视化 101:开发图表最重要的规则

原文:https://towardsdatascience.com/data-visualization-101-the-most-important-rule-for-developing-a-graph-2f9a6cdeb8c5?source=collection_archive---------41-----------------------

记住图表是视觉句子

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

Photo by kreatikar

我想每个人都见过糟糕的图表,一堆乱七八糟的条、线、饼状图,或者你害怕看到的东西。也许你已经做了一个,当你今天看着它,想知道你到底在想什么。

这些图表违反了数据可视化中最基本的图表制作规则:

这条规则适用于图表的所有用途,无论你是数据科学家、数据分析师、T2 统计学家,还是仅仅为了好玩给你的朋友制作图表。

在小学,你的语法老师可能会解释说,一个句子,最基本的,表达了思想或观点。图表是视觉句子:它们应该陈述一个且只有一个关于数据的想法或观点。

当你看一个图表时,你应该能够用一句话说出图表在说什么:比如“A 组比 B 组强”,或者“Y 开始有所提高,但现在正在下降。”如果你不能,那么你有自己的运行图。

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

Photo by Linux Screenshots (CC BY 2.0)

例如,上面的图表试图表达太多的陈述:试图描述近一个世纪以来二十二个不同国家的移民模式。在这些数据中可能有有用的陈述,但是作为一个图表的表示阻止了观察者/读者能够容易地破译它们。

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

Photo from Andrew Guyton (CC BY-SA 2.0)

同样,这张图显示了太多的镜头尺寸,无法有意义地表达一个单一的、连贯的想法,让读者/观众难以确定应该关注哪个领域。

潜在异议 1:但是我对数据有比一句话更多的话要说。

太好了!然后提供一个以上的图表。说出你需要说的关于数据的一切;为你的每一个陈述使用一个图表。

不要陷入一张图统治一切的谬论:试图用一张图来表达你对数据的所有陈述,结果却是一团看不懂的混乱。创建多个易读的图表,每个图表一次展示一个要点。将所有内容浓缩在一张图中只会让你的观众无法判断你到底要说什么。

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

Photo from TymonOziemblewski

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

Photo from kreatikar

潜在异议#2:我希望观众自己解释这些发现,而不仅仅是传达我自己的想法/结论。

公平点。在展示/交流数据时,有一段时间可以展示你自己的见解,也有一段时间可以开放式地展示信息,让你的观众/读者自己去解读。对于前者,图表是工具,对于后者,使用表格。除了其他潜在用途之外,表格还为读者/查看者传达了广泛的信息,以便他们自己进行解释。

还记得上面第一个关于来自欧洲各地的美国移民的例子吗?表格(见下文)可以更容易地传达信息,并允许读者跟踪他们想了解的任何地方、模式或问题。您是否希望报告大量信息,以便读者可以为自己的目的所用?那么表格是比图表更好的起点。

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

Photo from Michael Waskom

有些情况下,我倾向于分享我的见解/分析,而其他情况下,我倾向于鼓励我的读者/观众形成他们自己的结论,但由于大多数情况下需要两者的结合,我通常会结合图表和表格。当我可以的时候,我试着在文档或幻灯片中放一些小的表格,当我不能的时候,在附录中放一些完整的表格。

潜在异议 3:我的主要观点有多个分点。

许多句子也有表达单一思想所需的多个要点,这并不妨碍句子结构有意义地捕捉这些思想。这种子点的奇特语法单词是子句。尽管有些句子简单明了,只有一个主语和谓语,但许多句子(就像这个句子)需要多组主语和谓语来表达思想。

同样,一些图形化的想法需要多个从属或复合的子点,有一些类型的图形允许这样做。考虑联合地块,如下图所示。为了充分展示两个变量之间的关系和组合分布,它们还在上方和右侧显示每个变量的单独分布。这样,观众可以看到两种分布如何影响组合分布。因此,它像一个从句一样在边上显示每个变量的分布。

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

Photo from Michael Waskom

这些都是需要制作的高级图表,因为就像多部分句子一样,你必须仔细地呈现分论点,以明确要点是什么。同样,多部分句子需要仔细考虑如何连贯地组织多个分句。我打算稍后写一篇文章,更详细地描述如何开发这些多部分图。

一般规则仍然适用于这些更复杂的图形:

如果不能,请不要使用/显示该图表。我们的大脑非常善于凭直觉判断一个句子是否承载一个思想,所以用这个来判断你的图是否有效。

原文发布于此:https://ethno-data . com/data-visualization-graphing-making-no1-rule/。关于该网站和其他文章的更多信息,请访问https://ethno-data.com/

也感谢《数据科学》杂志发表这篇文章。更多关于他们工作的细节,请看

数据可视化:人类认知的催化剂

原文:https://towardsdatascience.com/data-visualization-a-catalyst-to-human-cognition-4c851e8f7b2?source=collection_archive---------32-----------------------

理解可视化和叙事可视化的基础如何帮助模式识别和决策的概念交响乐

数据可视化从一开始就存在了。从描绘原始生活方式的洞穴绘画,到查尔斯·密纳德关于拿破仑进军的信息图,可视化已经被用来传达抽象的思想和历史时代,并将它们转化为有形和可行的概念。这是一个整合的过程,它有局限性,只有当我们的眼睛能够解码它,我们的大脑能够理解它时,它才是有用的。那么,到底是什么让人类的思维立即与所呈现的洞察力联系起来呢?

数据可视化是外部认知的一种形式——帮助内部认知做得更好,并推动它看到模式。大脑喜欢模式,因为它是在呈现的信息中“看见”关系。所以,当 Jacques Bertin 第一次提出图形编码或者我们现在所知道的数据可视化的想法时,他恰当地说它是“传达意义的符号系统”。他们努力帮助交流,并使用八个视觉编码变量跳过三个层次的信息。

这三个级别的信息是:

1.基本信息—了解单个数据点

2.中间信息—了解一组数据点

3.总体信息——着眼于更大的图景,您可以结合起来形成所有数据点的模式

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

Three levels of information processing

理解并能够通过这些级别的信息操纵数据包括调整流程。在初级和中级之间过渡的情况下,可以使用处理例程。应用处理程序是你能够处理和理解初级信息的地方,通过识别一个接一个呈现给你的所有信息并在此基础上建立,从而打开中级信息。在此之后,可以通过使用下面提到的视觉编码的 8 个变量来形成数据可视化。这使人们能够回答通过视觉分析过程提出的问题,在视觉分析过程中,人们可以识别问题或目标,然后相应地构造数据以处理它并在不破坏的情况下简化它。这个过程使用了信息的力量和 Bertin 视觉编码的八个变量,为出于交流目的对数据进行恰当的认知处理创造了条件。

Bertin 的视觉编码的八个变量是:

1.转换为位置的 x 和 Y (2 个变量)

2.大小

3.价值

4.纹理

5.颜色/色调

6.方向

7.形状

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

The 8 visual variables. Size and Value translate to Z variables. [image:https://www.axismaps.com/guide/general/visual-variables/]

因此,当一个人可以处理这些以创建可视化而不破坏数据和模式时,它导致理想认知条件的安排,其中大脑致力于决策和/或识别图像内的关系。

让我们从数据中辨别一些模式,以理解如何回答“哪些灾难可能会影响全国各地的康菲炼油厂?”这将有助于我们了解人类思维如何在这种外部认知工具的帮助下处理数据。

首先,必须处理原始数据以消除异常和空值,这样才能创建一个可行的数据文件来处理信息,而不会产生异常值。在这里,我可以用美国各地的灾难数据集来做这件事。然后,我使用 Tableau 这款出色的可视化工具创建了一张地图,您可以在地图上以点的形式看到不同的灾难——这种级别的信息几乎是以自上而下的方式处理的,您可以看到所有灾难的全貌,并且在定义中可以包括炼油厂所在的所有位置以及哪些灾难可能会影响它们。看看我在下面创建的可视化。你将能够看到我在可视化中使用了位置、大小以及色调/颜色的变量。

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

Points depicting disasters around the United States using color and size

这些价值观在美国大陆上被表现出来,以呈现一个叙事过程的开端,在这个过程中,你将故事设定在哪里,故事在哪里发生。在此之后,我进一步处理可视化,以打开与我的问题的细节相关的信息。我介绍了康菲石油公司在美国各地的炼油厂的位置,同时在某种意义上用灰色显示不同的灾难,以吸引观众对炼油厂位置(x,y)的注意。这有助于视觉化的过程,让人类的思维一次专注于一条信息,创造一个焦点。

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

Bringing the focus to Conoco-Phillips refinery locations surrounding the disaster data

现在,我将把认知集中在这些炼油厂所在的州,我还将添加它们周围的数据集中的灾难。这要求我使用位置、大小、颜色/色调的变量,同时也标记精炼厂,通过使用 Tableau 中给出的工具提示属性来帮助观众记住精确的位置。

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

States, disaster types, and refinery locations

最后,在叙事可视化过程中,必须有一个冲突的解决方案。因此,当我们第一次打电话来定义目标/问题时,我们现在将通过我们已经采取的步骤来回答这个问题。通过我展示的图像,我试图回答哪些灾难可能会影响康菲炼油厂的问题。完成上述步骤后,我又采取了一个额外的步骤,根据这些灾难在这些州发生的频率对它们进行排序。这是通过使用 Tableau 计算字段实现的。结果并不令人惊讶,但在叙事可视化过程中,随着信息水平的使用和 Bertin 的八个编码变量-它要求采取解决方案的席位。我制定了一个更容易被大脑整理和分析的决议。使用颜色/色调,这种多地图可视化的外部认知辅助启动了内部认知过程。它允许大脑以图像的形式理解科学和数据。下面是贯穿整篇文章的冲突解决方案。

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

Prominent disasters surrounding Conoco-Phillips refineries, ranked.

有了这个,认知过程立即识别出哪些灾难正在影响康菲炼油厂所在的州。它认识到了我们从视觉化一开始就一直试图辨别的模式。因此,正如谚语所说,“一张图片胜过千言万语”,这个创建和分解可视化以回答一个中心问题的过程实际上相当于一千个数据点!

总之,通过视觉分析过程和叙事视觉分析,人们可以很容易地发现,三个层次的信息和视觉编码的八个变量共同构成了任何数据可视化的基础。他们本质上是必要的和复杂的,他们互相利用以给出更大的图景。它们是启动我们头盖骨内无限和不可量化器官的内部认知过程的火花塞。在一个技术处于知识和想象力前沿的世界里——创造了理想的混沌形式,这些数据可视化对人类思维具有特殊的重要性。他们就像一个超级英雄,通过组织和处理模式来拯救世界。你看,大脑喜欢模式,反过来也喜欢视觉化。所以,想象一下,当一个嵌入模式的外部信息帮助我们更容易地做出决策时,人类认知的兴奋程度。这就像带一个小孩去糖果店,但在这种情况下,糖果是统计数据表示,以创建不同类型的可视化。最棒的是。它们都服务于人类思维的一个共同目的——它们交流不可交流的事物,并且从时间开始就一直在这样做。

参考资料:

雅克·贝尔坦。图形和图形信息处理。w·德·格鲁埃特,1981 年。

数据可视化—高级散景技术

原文:https://towardsdatascience.com/data-visualization-advanced-bokeh-techniques-e33f92537415?source=collection_archive---------18-----------------------

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

散景交互式地图、数据表、文本输入和文档布局

如果你想创建强大的数据可视化,那么你应该考虑使用散景。在之前的文章“如何使用 Python 和散景创建交互式地理地图”中,我演示了如何使用散景创建交互式地理地图。本文将更进一步,演示如何使用交互式地图以及使用散景布局组织的数据表和文本字段来创建用于显示数据的交互式仪表板。

首先,让我们来看看文章《T2》中的成品:小心 Zillow,Jestimate 来了!”:

点击这里观看三藩市 2018 Jestimates!

关于代码的一句话

该项目的所有代码、数据和相关文件都可以在 my GitHub 访问。该项目分为两个 Colab 笔记本。一个运行线性回归模型(为可视化创建数据),另一个使用 Heroku 上的 Bokeh 服务器生成交互式可视化。

安装并导入

让我们从图表所需的安装和导入开始。Pandas、numpy 和 math 是用于清理和争论数据的标准 Python 库。geopandas、json 和 bokeh 导入是映射所需的库。

我在 Colab 工作,需要安装 fiona 和 geopandas。当您在 Colab 中开发应用程序时,您需要将这些安装保存在代码中。然而,一旦你开始用散景服务器测试,你将需要注释掉这些安装,因为散景不能很好地与魔术命令(!idspnonenote)一起工作。pip 安装)。

# Install fiona - need to comment out for transfer to live site.
# Turn on for running in a notebook
%%capture
!pip install fiona

# Install geopandas - need to comment out for tranfer to live site.
# Turn on for running in a notebook
%%capture
!pip install geopandas# Import libraries
import pandas as pd
import numpy as np
import math

import geopandas
import json

from bokeh.io import output_notebook, show, output_file
from bokeh.plotting import figure
from bokeh.models import GeoJSONDataSource, LinearColorMapper, ColorBar, NumeralTickFormatter
from bokeh.palettes import brewer

from bokeh.io.doc import curdoc
from bokeh.models import Slider, HoverTool, Select, TapTool, CustomJS, ColumnDataSource, TableColumn, DataTable, CDSView, GroupFilter
from bokeh.layouts import widgetbox, row, column, gridplot
from bokeh.models.widgets import TextInput

初步代码

由于本文的重点是交互式仪表板的创建,我将跳过以下步骤,这些步骤在我的上一篇文章“如何使用 Python 和 Bokeh 创建交互式地理地图”中有详细介绍。

  1. 准备制图数据和地理数据框 geopandas.read _ file()
  2. 创建颜色条查找表— format_df 数据帧
  3. 为 GeoJSONDataSource-JSON _ Data 函数创建 JSON 数据
  4. 创建绘图函数— make_plot 函数
  5. 颜色栏-颜色栏,make_plot 函数的一部分
  6. 悬停工具—悬停工具

数据加载、清理和争论

我将简要讨论应用程序中使用的数据,如果你有兴趣,可以查看完整的清洗和争论这里

应用程序中使用了两个数据框架:用于显示每个街区 2018 年总统计数据的街区数据,以及由我的文章“中的线性回归代码生成的 2018 年销售的每个单独房产的显示数据。

邻域 _ 数据数据帧

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

neighborhood_data DataFrame

显示 _ 数据数据帧

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

display_data DataFrame

应用程序的主要代码

让我们看一下应用程序的主要代码,然后一步一步地详细介绍。

### Start of Main Program

# Input geojson source that contains features for plotting for:
# initial year 2018 and initial criteria sale_price_median
geosource = GeoJSONDataSource(geojson = json_data(2018))
original_geosource = geosource
input_field = 'sale_price_mean'

# Initialize the datatable - set datatable source, set intial neighborhood, set initial view by neighborhhood, set columns
source = ColumnDataSource(results_data)
hood = 'Bernal Heights'
subdist = '9a'
view1 = CDSView(source=source, filters=[GroupFilter(column_name='subdist_no', group=subdist)])
columns = [TableColumn(field = 'full_address', title = 'Address')]

# Define a sequential multi-hue color palette.
palette = brewer['Blues'][8]

# Reverse color order so that dark blue is highest obesity.
palette = palette[::-1]

#Add hover tool to view neighborhood stats
hover = HoverTool(tooltips = [ ('Neighborhood','@neighborhood_name'),
                               ('# Sales', '@sale_price_count'),
                               ('Average Price', '$@sale_price_mean{,}'),
                               ('Median Price', '$@sale_price_median{,}'),
                               ('Average SF', '@sf_mean{,}'),
                               ('Price/SF ', '$@price_sf_mean{,}'),
                               ('Income Needed', '$@min_income{,}')])

# Add tap tool to select neighborhood on map
tap = TapTool()

# Call the plotting function
p = make_plot(input_field)

# Load the datatable, neighborhood, address, actual price, predicted price and difference for display
data_table = DataTable(source = source, view = view1, columns = columns, width = 280, height = 280, editable = False)
tap_neighborhood = TextInput(value = hood, title = 'Neighborhood')
table_address = TextInput(value = '', title = 'Address')
table_actual = TextInput(value = '', title = 'Actual Sale Price')
table_predicted = TextInput(value = '', title = 'Predicted Sale Price')
table_diff = TextInput(value = '', title = 'Difference')
table_percent = TextInput(value = '', title = 'Error Percentage')
table_shap = TextInput(value = '', title = 'Impact Features (SHAP Values)')

# On change of source (datatable selection by mouse-click) fill the line items with values by property address
source.selected.on_change('indices', function_source)

# On change of geosource (neighborhood selection by mouse-click) fill the datatable with nieghborhood sales
geosource.selected.on_change('indices', function_geosource)

# Layout the components with the plot in row postion (0) and the other components in a column in row position (1)
layout = row(column(p, table_shap), column(tap_neighborhood, data_table, table_address,
              table_actual, table_predicted, table_diff, table_percent))

# Add the layout to the current document
curdoc().add_root(layout)

# Use the following code to test in a notebook
# Interactive features will not show in notebook
#output_notebook()
#show(p)

步骤 1 —初始化数据

散景提供了几种处理数据的方法。在典型的散景交互式图形中,数据源是 ColumnDataSource。这是散景中的一个关键概念。然而,当使用地图时,我们使用 GeoJSONDataSource。我们将同时使用两者!

# Input geojson source that contains features for plotting for:
# initial year 2018 and initial criteria sale_price_median
geosource = GeoJSONDataSource(geojson = json_data(2018))
original_geosource = geosource
input_field = 'sale_price_mean'

# Initialize the datatable - set datatable source, set intial neighborhood, set initial view by neighborhhood, set columns
source = ColumnDataSource(results_data)
hood = 'Bernal Heights'
subdist = '9a'
view1 = CDSView(source=source, filters=[GroupFilter(column_name='subdist_no', group=subdist)])
columns = [TableColumn(field = 'full_address', title = 'Address')]

我们将希望加载的数据年份(2018)传递给 json_data 函数。然后,json_data 函数从 neighborhood_data 中提取所选年份的数据,并将其与映射数据合并,为散景服务器返回转换为 json 格式的合并文件。我们的 GeoJSONDataSource 是 geosource。initial_field 用 sale_price_mean 初始化。

我们的 ColumnDataSource,Source,用 results_data 初始化,列数据源视图(CDSView),view1,用 Bernal Heights 邻域(subdist=9a)初始化。CDSView 是一种过滤数据的方法,允许您显示数据的子集,在本例中是 Bernal Heights 邻域。datatable 的列被初始化以显示属性的完整地址。

步骤 2——初始化颜色条、工具和地图绘制

# Define a sequential multi-hue color palette.
palette = brewer['Blues'][8]

# Reverse color order so that dark blue is highest obesity.
palette = palette[::-1]

#Add hover tool to view neighborhood stats
hover = HoverTool(tooltips = [ ('Neighborhood','@neighborhood_name'),
                               ('# Sales', '@sale_price_count'),
                               ('Average Price', '$@sale_price_mean{,}'),
                               ('Median Price', '$@sale_price_median{,}'),
                               ('Average SF', '@sf_mean{,}'),
                               ('Price/SF ', '$@price_sf_mean{,}'),
                               ('Income Needed', '$@min_income{,}')])

# Add tap tool to select neighborhood on map
tap = TapTool()

# Call the plotting function
p = make_plot(input_field)

ColorBar 调色板、HoverTool 和 TapTool 被初始化,并且调用 make_plot 函数来创建显示中间价格邻域热图的初始地图图。

步骤 3——用初始数据填充数据表和文本字段

# Load the datatable, neighborhood, address, actual price, predicted price and difference for display
data_table = DataTable(source = source, view = view1, columns = columns, width = 280, height = 280, editable = False)
tap_neighborhood = TextInput(value = hood, title = 'Neighborhood')
table_address = TextInput(value = '', title = 'Address')
table_actual = TextInput(value = '', title = 'Actual Sale Price')
table_predicted = TextInput(value = '', title = 'Predicted Sale Price')
table_diff = TextInput(value = '', title = 'Difference')
table_percent = TextInput(value = '', title = 'Error Percentage')
table_shap = TextInput(value = '', title = 'Impact Features (SHAP Values)')

使用源(从 results_data 填充的 ColumnDataSource)、视图(针对 Bernal Heights 过滤的 view1)和列(仅使用 full_address 列的列)填充 datatable。Bokeh 中的 TextInput 小部件通常用于从用户那里收集数据,但也可以很好地显示数据!所有的 TextInput 小部件都用空格初始化。

第四步——回调函数

这是交互性发挥作用的关键功能。散景小部件使用事件处理程序基于回调原理工作。on_change 或。on_click —提供自定义交互功能。然后,这些事件处理程序调用表单函数(attr,old,new)中的自定义回调函数,其中 attr 是指已更改属性的名称,old 和 new 是指属性的以前值和更新值。

# On change of source (datatable selection by mouse-click) fill the line items with values by property address
source.selected.on_change('indices', function_source)

对于数据表来说,这很容易,只需使用 source 的selected . on _ changeevent _ handler,并在用户单击数据表中的一行时调用函数 function_source ,将该行的索引传递给它。然后,根据从数据表中选择的索引,从源(results_data)更新 TextInput 值。

def function_source(attr, old, new):
    try:
        selected_index = source.selected.indices[0]
        table_address.value = str(source.data['full_address'][selected_index])
        table_actual.value = '${:,}'.format((source.data['sale_price'][selected_index]))
        table_predicted.value = '${:,}'.format((source.data['prediction'][selected_index]))
        table_diff.value = '${:,}'.format(source.data['difference'][selected_index])
        table_percent.value = '{0:.0%}'.format((source.data['pred_percent'][selected_index]))
        table_shap.value = source.data['shap'][selected_index]

    except IndexError:
        pass

对于地图,我希望能够单击一个街区,并根据所选的街区填充数据表。奇怪的是,没有内置。HoverTool 的 on_click 事件处理程序。很明显,HoverTool 知道它在哪个街区盘旋,所以我自己建了一个!

我意识到有一个 TapTool,在用地图测试后,我发现它是一个选择工具。换句话说,当您在地图上的多边形上单击鼠标时,它实际上使用邻域 id 作为索引来选择多边形!这也会触发。geosource 中的 on_change 事件处理程序。因此,使用与数据表相同的基本方法:

# On change of geosource (neighborhood selection by mouse-click) fill the datatable with nieghborhood sales
geosource.selected.on_change('indices', function_geosource)

对于地图,使用 geosource 的selected . on _ changeevent _ handler,并在用户单击某个邻域时调用函数 function_geosource ,向其传递该邻域的索引。基于新的索引(邻域 id/subdistr_no),将 CDSView 重置为新的邻域,用视图中的新数据重新填充 datatable,并将 TextInput 值设置为空。

# On change of geosource (neighborhood selection by mouse-click) fill the datatable with nieghborhood sales     
def function_geosource(attr, old, new):
    try:
        selected_index = geosource.selected.indices[0]
        tap_neighborhood.value = sf.iloc[selected_index]['neighborhood_name'] 
        subdist = sf.iloc[selected_index]['subdist_no']
        hood = tap_neighborhood.value

        view1 = CDSView(source=source, filters=[GroupFilter(column_name='subdist_no', group=subdist)])
        columns = [TableColumn(field = 'full_address', title = 'Address')]

        data_table = DataTable(source = source, view = view1, columns = columns, width = 280, height = 280, editable = False)
        table_address.value = ''
        table_actual.value = ''
        table_predicted.value = ''
        table_diff.value = ''
        table_percent.value = ''
        table_shap.value = ''

        # Replace the updated datatable in the layout
        layout.children[1] = column(tap_neighborhood, data_table, table_address, table_actual, table_predicted,
                                    table_diff, table_percent)

    except IndexError:
        pass

步骤 5 —布局和文件

散景提供了几个布局选项来安排地块和部件。布局的三个核心对象是 row()、column()和 widgetbox()。这有助于将屏幕想象成一个由行、列组成的网格。widgetbox 是小部件的容器。在应用程序中,组件在一行中排列成两列:

  1. 第一列-包含绘图 p(地图)和文本输入微件 table _ shap(Shapley 值)。
  2. 第二列—包含数据表 tap_neighborhood 和其余的 TextInput 小部件。
# Layout the components with the plot in row postion (0) and the other components in a column in row position (1)
layout = row(column(p, table_shap), column(tap_neighborhood, data_table, table_address,
              table_actual, table_predicted, table_diff, table_percent))

# Add the layout to the current document
curdoc().add_root(layout)

然后,该布局被添加到文档中进行显示。

我欢迎建设性的批评和反馈,请随时给我发私信。

在推特上关注我

这篇文章最初出现在我的 GitHub 页面网站上

这是探索三藩市房地产数据系列文章的一部分

旧金山房地产数据来源:旧金山 MLS,2009–2018 年数据

数据可视化和真实性艺术

原文:https://towardsdatascience.com/data-visualization-and-truthful-art-324b13a2ad34?source=collection_archive---------21-----------------------

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

阿尔贝托·开罗的《真实的艺术》是一本关于数据可视化的极好的书,我怎么推荐都不为过。

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

的真实艺术中,Cairo 解释了良好数据可视化的原则。何描述了当你使用数据可视化时,应该作为你基础的五个品质:真实、实用、漂亮、有洞察力和启发性。Cairo 也给出了一些有偏见和不诚实的可视化的例子。

数据-油墨比

在我深入探讨“伟大可视化的五个品质”之前,我想介绍另一个相关的概念:数据-墨水比率,由爱德华·塔夫特在定量信息的可视化展示中引入。

Tufte 将数据油墨比定义为数据油墨量除以打印图形所需的总油墨量。现在,我不认为他要求我们测量纸上的墨水量。相反,Tufte 建议我们删除那些不会给图形添加新信息的元素。

也许最著名的减少数据墨水的例子之一是由加拿大艾伯塔省埃德蒙顿的一家信息、可视化和设计公司 Darkhorse Analytics 创造的。Darkhorse 收集了四个如何提高数据-墨水比的例子。他们的主要概念是“裸露的数据看起来更好”和“移除以改善”

黑马的这个动画非常具有说明性:

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

伟大可视化的五个品质

根据开罗的说法,这五种品质并不是相互独立的。所有不同的品质都是相互关联的,它们与所有其他的品质相互作用。

真实的

我们需要倡导真实的数据。基于数据分析的真相可能是主观的。但作为数据科学家,我们应该尽最大努力保护真相。这些方法帮助你达到真实:

  • 首先,当你清理和总结数据时,要对自己诚实。仔细考虑你对原始数据所做的每一个修改。你遮住了什么吗?实践开罗所说的“自我欺骗”——理解你自己头脑中的诡计。对数据科学家来说,质疑自己的能力至关重要。我们可以如此专注于寻找模式,以至于我们以与所描述的现象不真实的方式减少或呈现数据。
  • 第二,记住你的义务是对观众的。使用行业公认的数据科学和信息可视化技术来揭示特定的数据。通过批准的流程和系统从数据中获得答案是数据科学的定义。让您的数据可视化适应您的受众,而不是相反。并考虑观众的阅读能力和理解水平。

功能的

考虑你的视觉化是否有用。数据-墨迹比有助于增加可视化的功能。我将在另一篇文章中讨论这个问题。有很多增加功能的试探法,比如用户测试。

美丽的

这听起来可能有点奇怪,但是美观对数据可视化很重要。要达到美,你需要了解你的受众。“情人眼里出西施”是一个常见但准确的表达。对美的不同理解是基于人们的生活经历和其他方面,如性别和文化。对于任何数据科学家来说,创建一个被观众认为漂亮的可视化效果都是一项伟大的成就。

富有洞察力的

好的可视化不仅仅是从表格或文件中复制数据。它以可视化格式显示相关数据,揭示趋势或关系。当洞察力被成功可视化时,观众会“啊哈!”瞬间。

数据科学写作新手的一个常见做法是为他们拥有的每一份数据都附上一张图表。过多的信息是不必要的,会导致读者疲劳。正确的数字能很快说明研究的结果。

有启发作用的

虽然听起来差不多,但是启发和有见地是不同的概念。Cairo 说这种品质是由前面四种品质组成的:真实、实用、美丽和有洞察力。启蒙意味着每一个重要的组成部分都被成功地结合起来,产生一个新的有价值的启示。

社会责任呢?

Cairo 还提出了一个问题,即社会责任是否是伦理数据可视化中需要考虑的一个方面。这个问题没有明显的答案。谁能判断对特定科学知识的压制或选择性释放是有害的还是有帮助的?

创造意义,而不是欺骗

最重要的是,要有意图创造有意义的视觉效果,识别欺骗和不道德的工作。数据科学家负责以适合其技能和目的的方式,将正确的信息呈现给正确的受众。毫无疑问,应用 Cairo 的五大可视化品质将有助于产生具有事实和相关价值的数据可视化。

参考

  • 阿尔贝托·开罗,《真实的艺术:用于交流的数据、图表和地图》
  • 黑马分析博客,2018 年 7 月。

用于 EDA(探索性数据分析)的数据可视化

原文:https://towardsdatascience.com/data-visualization-for-eda-exploratory-data-analysis-f001a1bf0087?source=collection_archive---------10-----------------------

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

(By: Alberto Lucas López, National Geographic, Source)

请花 1 分钟时间看看上面的图片。油画《心灵的框架》呈现了巴勃罗·毕加索在数万幅作品中触及的主题。12 大主题分散在整个画面上,通过使用不同的形状(与毕加索名作高度相关的形状)和颜色来分隔。然后,这些主要主题被进一步细分为更多形状和颜色的子部分,并且这些子部分用每个特定的对象进行了注释。总之,色彩、形状、线条和面积传达了毕加索“思想框架”的全貌。

使用大量的数据,这幅画的作者总结了 12 个主题,并将其细分到每一个单独的对象中。毕加索的作品被收集、学习、重组,作品背后的信息(本例中的主题)通过可视化和呈现的方式传达出来。对我来说,收集数据和探索信息是数据分析的主要过程,而将信息可视化就是我们所说的数据可视化。数据分析有助于我们深入了解情况,通过挖掘数据,从而发现数据“矿”中的“黄金”,讲述隐藏的故事。同时,数据可视化使我们能够更有效地交流故事。

尽管数据可视化通常是数据分析过程的可交付成果之一,但数据科学家通常会在获得数据框后绘制数据框。在这里,我想和大家分享我在探索性数据分析过程中的数据可视化经验。从一开始就绘制数据可以帮助我们理解数据集。

我正在查看的数据集之一是发布在 Kaggle 网站上的电影分析项目。我正在使用的数据可视化 Python 库是“ Plotly ”,这是一个基于 plotly.js 的开源库,它基于 d3.js (这被认为是数据可视化的“硬核”技术之一)。

在电影数据帧中,有 4803 行电影,20 列电影特征,包括每部电影的收入、标题、上映日期、预算、制作公司、运行时间、平均投票、投票计数。其他信息可能也是有用的,但是到目前为止,这些功能主要集中在。

单变量数据分析

当查看数据框时,我们会想到直观地检查主要特征,在这种情况下可能是收入和预算。为了分析简单变量,我们可以看看它的单变量分布。在大多数情况下,直方图是找出单个变量分布的一种极好的方法。如下图所示,直方图对每个值进行分类,并对每个分类中出现的值进行计数(每个分类代表一个值范围)。因此,有时需要更多地考虑箱大小的确定。通过绘制直方图,我们可以观察到收入和预算的分布都是指数衰减变量(这意味着更多的电影具有更低的预算和收入)。只有少数电影是高预算高收入的。

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

双变量数据分析

因为我们已经分别检查了收入和预算的分配,所以我们可能想要评估这两个变量之间的关联。要做到这一点,散点图通常是一个很好的选择。从图中,我们可以找到代表预算和收入的每个点(每部电影)。有趣的是,一些数据点位于 x 轴或 y 轴上,表明这些电影要么获得零预算,要么获得零收入,这没有意义。因此,作为一名数据科学家,我们可能会仔细考虑是否应该将这些数据视为无效数据并丢弃它们,或者视为可接受的并保留它们。此外,这在分布中并不直接可见,因为箱包含一定范围的值,但不太能说明每个值的确切位置。

通过使用交互式绘图,我们甚至可以将光标移动到每个点来检查电影标题。

我们也可能对平均投票数和计票数感兴趣(我起初对这个感兴趣,因为当我看到一部糟糕的电影时,它会敦促我回顾它,给它一个差星。我想看看我是不是唯一会这么做的人)。然而,散点图显示,大多数电影(高票数)位于 6 和 8 之间。它可能被解释为实际上很少有人会做我通常做的事情,但是,它也可能被解释为人们在决定是否花时间看电影之前了解电影的评论,这样坏电影往往会被更少的人观看或评论。

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

线剧情

在大多数情况下,当描述一些值随时间序列的变化时,线形图是简单明了的。如下图,线表示运行时间随时间的变化,点表示每部电影的运行时间。虽然这可能不是一个使用线形图的好例子,因为我们通常使用一条线来表示一个对象的值的变化。如果我们可以将电影视为一个整体,那么剧情可以被解释为所有电影的运行时间趋势。根据这个线图,我们可以得出这样的结论:随着时间的推移,电影运行时间的方差在增加。

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

箱形图

当查看一个变量的分布时,我们可以绘制直方图。当我们看到五个变量时,它们可能在图中重叠,但有时仍然是可以解释的。如果我们有太多的变量呢?要查看值的分布,我们可以引入箱线图,它可以显示平均值、最小值、最大值、75%和 25%的值。箱线图提供了一种呈现不同变量并快速比较其分布的方法。如下图所示,图中并排显示了十家主要制作公司的预算和收入。我们可以快速检查这十家公司的值的分布。我们可以了解到迪斯尼公司的预算不那么有限,派拉蒙电影公司也制作了一些非常卖座的电影。

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

散布矩阵

与散点图不同,散点图为我们选择的每个特征的每个组合绘制散点图。它让我们快速检查每个特征之间的相关性。具体来说,对角散布矩阵表示变量的直方图。

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

我希望你会发现这个分享是有帮助的。所有的代码都可以通过回购共享。请随时在下面留下任何评论或建议。

谢谢你的时间和欢呼!

面向所有人的数据可视化第 1 部分

原文:https://towardsdatascience.com/data-visualization-for-everyone-pt-1-68b443d29b87?source=collection_archive---------9-----------------------

第二部分

第 1 部分:收集、存储和版本控制

介绍

我的背景是在 AEC (建筑、工程和&建筑)行业——这个行业在采用和应用新的变革性技术方面一直落后于其他大多数行业。随着现代向数据驱动的企业框架的转变,这一挑战今天依然存在。尽管我们的目标是以逻辑为导向的,但我们“右脑思考”的历史仍有一些教训可供我们今天借鉴。AEC 行业依靠沟通成为最有效和最成功的方式。无论是精致内部空间的渲染还是复杂释放阀的模型开启,我们都依赖某种形式的交流来传达我们的想法。在这样做的过程中,我们在各自的交流分支中变得独特而高度熟练。

我们的目标是将这些知识和流畅转化为另一个交流领域:数据可视化。在今天的实践中,数据无处不在。一些实践可以奢侈地收集数据,并投入时间从中提取信息和见解,但许多其他实践必须敏捷,并在日常工作中找到机会,这将增强他们的过程。本文将通过关注数据收集和可视化,并通过为我们中间的修补者提供易于使用的入门工具和更复杂的解决方案,来解决等式的两个方面。

数据可视化是一个广阔的领域,背后有大量的工作。虽然我们不能体现所有的经验,但我们可以很好地将我们独特的行业专业知识与 it 的精选部分结合起来,以进一步提高我们沟通和合作的能力。

数据收集

在能够考虑数据可视化之前,首先我们必须确保我们有足够有意义的数据通过可视化产生价值。收集过程通常是公司和团队试图做出“数据驱动”决策的第一个障碍。收集干净、系统化的数据需要在时间和技术方面进行前期投资,才能真正有价值。这似乎是一个令人望而生畏的障碍,特别是对于较小的团队和组织,但幸运的是,今天有一个完整的解决方案可供我们使用,涵盖了广泛的时间/成本投资要求。

由于“收集”在组织和行业之间可能是一个非常不同的过程,本文将着眼于收集媒介和 AEC 行业的机会。然而,同样的概念可以应用于其他市场,数据源是区分因素。

回顾的主题

  1. 矿车
  2. Ideate 的 BIMLink
  3. 耐热玻璃
  4. 蚱蜢发电机
  5. Visual Studio

商业解决方案

如果由于时间限制和/或缺乏特定领域的知识,您目前没有从您的工作中收集数据,您可能会在处理数据提取和收集的成熟商业解决方案中找到价值。这些产品通过将核心逻辑打包到易于理解和使用的接口中,消除了对特定领域知识的需求。不利的一面是,这些产品和服务是有成本的,这可能就像最初缺乏该领域的专业知识一样令人望而却步。

目前市场上有许多这样的产品,本指南将仅重点介绍几个关键产品作为示例。强烈建议您继续研究这一领域的产品,因为它们变化非常快。

优点:节省时间,不需要“专家”使用
缺点:成本,有限定制

矿车(试验场)

Minecart 是 Proving Ground 的全方位服务数据解决方案。他们不仅从 BIM 模型中提取数据,还准备模板仪表板和可视化。这是该领域最全面的服务之一,因此可以应用于任何团队或组织,无论他们是否拥有数据科学专业知识。实施成本是基于服务的,这意味着它会根据公司要求、定制级别、知识/培训需求以及许多其他因素而有很大差异。因此,我们鼓励团队了解他们的需求范围,并向服务提供商寻求最准确的价格信息。

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

Minecart Concept (Image Credit: Proving Ground)

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

Sample Dashboard Output (Image Credit: Proving Ground)

BIMLink (Ideate)

Ideate 的 BIMLinkAutodesk Revit 最受欢迎的数据提取解决方案之一。该工具允许用户从 BIM 模型中选择要导出和格式化/过滤的属性,并且只有在模型中已经有有价值的数据时才是有效的。与 Minecart 不同,这个工具只是一个数据提取应用程序。因此,值得注意的是,在数据导出之后,团队仍然需要至少具有一些关于数据管理和可视化的特定领域知识的人来实现该数据的全部价值。

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

Ideate BIMLink Concept (Image Credit: Ideate)

定制解决方案

如果现有的商业解决方案不能满足您的数据需求,那么探索定制解决方案可能是值得的。定制解决方案是团队或组织自己构建的解决方案——根据他们工作的特定需求对其进行定制,并相应地管理他们的数据。定制解决方案的缺点是,根据特定需求对其进行定制是一个耗时的过程——一旦大规模部署,这些工具的创建和维护都将成为大量的时间投资。创建和维护还伴随着对知识的需求——与商业解决方案提供给用户的“前台”或后台知识相同。

有无限多的工具和平台可以列在这个类别中,供开发人员用来创建解决方案,但我们将只重点介绍一些与我们的 AEC 行业更相关的工具和平台。

优点:可定制、无订阅/费用、可扩展
缺点:时间、需要特定知识、维护

PyRevit(伊朗埃赫桑-内贾德)

PyRevit 是 Ehsan Iran-Nejad 的开源软件项目,允许用户使用 Python 为 Autodesk Revit 创建脚本甚至插件。默认情况下,PyRevit 附带了许多工具,但它真正的强大之处在于用户能够使用 Python 语言的可访问且强大的语法来原型化和构建自己的逻辑。使用 Python 可用的许多库和包,任何人都可以创建数据挖掘脚本,甚至是成熟的数据提取应用程序。

使用这个工具的额外好处是,数据科学长期以来一直倾向于 Python。该语言的可访问性和“非个人化”特性使其成为数据处理、分析、清理甚至可视化的自然选择。因此,学习 Python 使用 PyRevit 提取数据只会让您在提取之后从事更令人兴奋的工作!

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

Prototyping & Creating Custom Solutions With Python

蚱蜢和迪纳摩(麦克尼尔/欧特克)

GrasshopperDynamo可视化编程接口,允许用户创建类似于编码/软件开发的业务逻辑,无需编写文本代码。这些接口使得那些没有特定领域知识的人更容易原型化和创建逻辑例程、自动化和其他功能。

除了它们为创作提供的灵活性之外,它们还提供了许多软件包,可以从 BIM 模型或 CAD 文件中提取数据。通过这两种方式,用户还可以选择使用可视化编程界面,或者使用基本的 UI 组件创建更加人性化的界面。在这两种情况下,可视化编程简化和民主化了对大量计算资源的访问,其中许多资源对于数据提取或处理是有用的。

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

Visual Programming Makes Brings Custom Solutions Within Reach

Visual Studio(微软)

Visual Studio 是一个集成开发环境,它允许开发人员构建。使用 C#NET 应用程序(以及许多其他应用程序/语言)。对于我们的用例,我们可以使用 Visual Studio 为 Autodesk Revit 或 McNeel 的 Rhino 等软件构建成熟的插件,这些插件可以将我们的数据提取到我们选择的任何格式或平台。与 Python 不同,C#不太容易理解,尤其是如果用户没有任何编码/开发经验的话。尽管不太友好,但它确实提供了编译语言的显著性能提升,因此对于大型数据集和/或大型应用程序非常有用。

除了创建成熟的应用程序,C#和 Visual Studio 还可以用于创建可视化编程接口的节点和组件,如 GrasshopperDynamo 。尽管这种语言在数据科学工作流中并不十分流行,但是通过这种方法,您可以获得一些额外的价值,通过可视化编程接口为他人创建更易于访问/消化的资源。

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

Microsoft Visual Studio IDE Interface

数据版本控制和存储

在收集/提取数据后,另一个挑战出现了—保持所有内容都是最新的,或者至少知道什么是过时的以及什么时候过时的。这种挑战与组织或团队的规模成比例,个体成员打破了既定的实践和标准,倾向于快速的“解决方案”。

在当今数据快速增长的环境下,许多公司已经开始在组织层面解决这个问题。微软的 SharePoint/OneDrive 和谷歌的 Docs 产品已经慢慢迁移到一个完整的云存储系统,完成了语义版本化、标记和其他基础设施,这些基础设施系统化和组织了我们放入其中的数据。除了“office”解决方案之外,Google、Amazon 和 Microsoft 等数据库提供商也为他们的数据库产品增加了类似的复杂性,使它们比以往任何时候都更容易使用。

在这种产品创新的环境下,我们必须谨慎选择我们的方法,不要被不符合我们特定需求的功能和服务分散了注意力。像以前一样,我们可以从广泛的解决方案中进行选择,从全定制到全用户就绪。

回顾的主题

  1. OneDrive
  2. 谷歌驱动
  3. MongoDB
  4. 燃烧基地

商业解决方案

有许多现成的解决方案可用于存储和版本化数据。最常见的格式是基于文件的,文件集合构成一个完整的数据集,每个文件的版本代表数据集的历史。即使使用基于文件的方法,我们也可以应用许多最佳实践,让我们超越太熟悉的“Data _ final 2 . CSV”范式,并帮助我们从数据中提取更多价值。

优点:快捷/易用、有效&直观
缺点:局限于文件,缺乏标准/一致性

OneDrive 和 Google Drive(微软/谷歌)

OneDriveGoogle Drive 都是云文件存储解决方案。它们还能很好地与各自的、更广泛的产品生态系统集成在一起(微软的 Office 套件、谷歌的 G 套件和 T20)。除了在云中存储我们的文件之外,它们还允许我们共享、消费和保存我们文件的历史记录。这非常有用,因为最终的数据可视化需要共享/消费,而保留历史对于询问数据集的更深层次的问题非常有用。

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

OneDrive File Versioning

尽管这两者都很容易获得并且被广泛使用,但这也使得它们在存储数据时存在风险。数据需要一致性才是有用的—格式化、清理等。对于基于文件的系统,在确保数据符合标准方面,用户是最终的责任点。因此,如果团队/组织中的用户在使用这项技术时不承担这一责任,存储的数据可能对最终的应用程序没有什么用处。

定制解决方案

在当前的技术市场上,定制数据库解决方案“多如牛毛”。这对消费者来说非常好,因为这意味着当我们试图将技术与组织需求相匹配时,我们可以从一系列选项中进行选择。与前面的主题一样,本指南不会涵盖所有可能的数据库解决方案,但会重点介绍一些关键产品,它们在定制能力和民主化访问能力之间提供了良好的平衡。

优点:标准化是内置的,能够扩展,可以广泛集成
缺点:成本高,需要调校&维护

MongoDB

MongoDB 是一个基于云的数据库,是当今市场上最受欢迎的产品之一。它的受欢迎程度来自于其全面的文档、开发人员友好的语法以及用于管理数据的图形界面等附加工具。MongoDB 数据库可以接受许多不同类型的数据,并且可以与数据集的大小并行扩展。此外,它与大多数主要的编程语言、框架和语法都有接口,这使得它很容易成为任何定制软件解决方案的“插件”。

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

MongoDB Sample App Flow

Firebase(谷歌)

Firebase 是另一个基于云的数据库,提供了与 MongoDB 相同的功能(如上所述)。它与 MongoDB 和目前市场上其他数据库解决方案的不同之处在于它的实时特性。这种功能本质上意味着应用程序或开发人员不必在每次更新时都请求整个数据集,而只需维护一个到数据库的实时(监听器)链接。这使得它成为频繁变化的数据集的首选,并要求用户了解这些变化。跟踪建筑物的房间面积或计算机械散流器是一个很好的例子,这些信息在设计师或工程师每次处理模型时都会发生变化。

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

Google Firebase Realtime Database Functionality

总结和第 2 部分

我们已经讨论了很多内容,但是我们还没有进入“有趣”的部分。本文的第 2 部分将利用我们在这里建立的强大基础深入到可视化过程中。尽管数据收集和存储可能不是流程中最有趣或最吸引人的部分,但它们是最重要的部分,因为它们直接关系到我们数据可视化和信息交流的最终有效性。如果没有一致可靠的数据来源,我们根本没有机构来询问或回答我们希望能够回答的问题。

第二部分

每个人的数据可视化 Pt 2

原文:https://towardsdatascience.com/data-visualization-for-everyone-pt-2-d7f80b49e17d?source=collection_archive---------14-----------------------

第 1 部分

第 2 部分:创建和管理可视化

介绍

我的背景是在 AEC (建筑、工程、&建筑)行业——这个行业在采用和应用新的变革性技术方面一直落后于大多数其他行业。随着现代向数据驱动型企业框架的转变,这一挑战今天依然存在。尽管目标以逻辑为导向,但我们的“右脑”历史有一些教训我们今天可以借鉴。AEC 行业依靠沟通才能最有效、最成功。无论是精致内部空间的渲染还是复杂释放阀的模型,我们都依赖某种形式的交流来传达我们的想法。通过这样做,我们变得越来越有个性,也越来越擅长我们各自的交流分支。

我们的目标是将这些知识和流畅性转化为另一个交流领域:数据可视化。在今天的实践中,数据无处不在。一些实践可以奢侈地收集这些数据,并花时间从中提取信息和见解,但许多其他实践必须敏捷,并在日常工作中寻找机会,以加强其流程。本文将通过关注数据收集和可视化来解决这两方面的问题,并为我们中的修补者提供易于使用的入门工具和更复杂的解决方案。

数据可视化是一个广阔的领域,背后隐藏着大量的工作。尽管我们不能体现其中的每一课,但我们可以很好地将我们独特的行业专业知识与精心策划的部分结合起来,进一步提高我们的沟通和协作能力。

数据可视化

现在已经收集并存储了数据(第 1 部分),我们可以开始考虑它的表示和通信。为了策划这种交流,我们首先必须了解我们的目标是什么,或者更简单地说,我们想通过询问数据来回答什么问题。在这种情况下,数据探索不应与数据可视化混淆。如果我们天生不熟悉数据,我们可能会采取探索性的步骤来更好地理解数据,但这个过程应该与我们希望通过可视化实现的精心策划的交流分开。

一旦我们制定了一组我们希望用数据来回答的问题,我们就可以开始将工具和技术与问题相匹配。与我们之前的主题一样,我们可以采用各种各样的解决方案来回答我们的问题,这里我们将只重点介绍一些最受欢迎或最有用的解决方案。

商业解决方案

不久前,商业解决方案还局限于这一领域。仅在 5-10 年前,Excel 中的数据透视表被认为是可视化和呈现数据的标准。现在,我们有了像 Tableau 和 PowerBI 这样的工具——专门致力于创建和管理数据驱动的演示的工具。这一领域的创新在很大程度上是由金融部门推动的,但这并不意味着我们不能利用其他行业的创新来提高效率。

优点:节省时间,不需要特定领域的知识,产品质量更高

缺点:成本,定制有限

(舞台上由人扮的)静态画面

Tableau 是一个商业智能(BI)平台/应用程序,允许用户使用熟悉的图形用户界面创建动态和交互式数据可视化。与其他 BI 工具相比,Tableau 具有更陡峭的学习曲线,但也提供了更多定制和管理数据可视化的机会。这种权衡适用于我们将在本指南后面讨论的其他数据可视化平台,包括商业和定制解决方案。

除了更陡峭的学习曲线,Tableau 还有一个非常重要的相关成本。因此,它只对完全致力于这种类型的工作流的团队和组织有财政意义。还有一个免费版本,但它要求用户在互联网上发布他们的数据集,这在与大多数客户和合作伙伴合作时既不可取也不可能。

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

Sample Tableau Dashboard

微软公司

PowerBI 是另一个 BI 平台,它提供了与上面讨论的 Tableau 非常相似的功能。这两个平台的主要区别在于它们的可访问性和成本。PowerBI 旨在对任何人和每个人都有用——它不依赖数据科学或数据可视化知识来允许用户创建出色的视觉效果。相反,它简化了许多与数据的交互,并让用户通过简单的操作进行创建和探索。没有任何经验的普通用户可以在几个小时或最多几天内启动并运行 PowerBI。面对 Tableau 的同一个用户可能需要至少一个星期,如果不是更多,才能真正有效。(此信息纯属轶事/经验,并非测量的统计数据)。

PowerBI 还提供免费和付费版本,但与 Tableau 不同,免费版本是可用的。PowerBI 的免费层限制了该应用程序的一些功能,如多作者协作和自定义数据源定义,但总体而言,它在很大程度上是相同的产品,几乎任何规模的团队都可以有效地使用。付费版本可以与 Office365 订阅捆绑在一起,因此,如果您的组织已经提供了这种服务,这可能比单独购买成本更低。

PowerBI 的缺点是定制限制。因为这个工具是如此的用户友好和易于使用,所以缺乏深度定制和更“强大”的功能。对于普通的数据集和用户来说,这可能不是一个问题,但对于试图专注于美学或试图争论真正大规模数据集的团队来说,这个工具会带来问题。

谷歌数据工作室(谷歌)

谷歌数据工作室是这一领域的新玩家,是更广泛的 G 套件的一部分。这是商业解决方案中成本最低的产品,因此可能最适合较小的团队和组织。它也非常容易访问,并提供非常强大的免费计划,这使它成为原型开发或尝试数据科学和数据可视化的最佳选择。

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

Sample Google Data Studio Dashboard

定制解决方案

数据可视化领域的定制解决方案正在迅速发展壮大!代码库和开源贡献不断地使这个领域变得更容易被程序员和软件开发人员访问和使用,从而将这些类型的工作流注入到他们的项目中。我们在这里讨论的主要库植根于 Python 和 JavaScript 语言——2019 年最流行的两种编程语言。

尽管编码对新手来说可能是令人生畏的,但应该注意的是,许多这些库的存在是为了简化与工作的交互。仅仅因为有人可能想探索一个定制的解决方案,并不意味着它的每个部分都需要定制-他们可以选择一个“更高级”的库,该库抽象出他们不需要控制或定义的大量数据。

优点:定制、无购买成本、可扩展性、互操作性

缺点:维护,需要知识创造,时间

JavaScript 库

JavaScript 是数据可视化的一个很好的自然选择。由于它是在浏览器中运行的,所以它提供了在许多不同平台上接触观众的机会——移动、网络甚至桌面。出于同样的原因,在创建和管理可视化时,它允许高度的定制和交互性。如果我们可以控制屏幕/网页上的单个元素,我们就可以轻松地将数据点绑定到它们,并在这些点之间创建关系,进而创建有意义的视觉信息,供我们消费并转化为见解。这个用例中 JavaScript 的另一个好处是它的流行。随着继续保持“世界上最流行的编程语言”的头衔,这也意味着先例和例子随时可供学习。这可能看起来不是一个巨大的好处,但是由于许多这些库在本质上是【低级】,例子和先例对于快速开发是至关重要的,尤其是如果开发人员没有数据科学或前端背景的话。

JavaScript 没有给人留下深刻印象的地方是数据处理和操作过程。由于天生是单线程,当与 Python、Go 甚至 C#/C++之类的编译工具相比时,它在性能方面往往表现不佳。除了性能之外,也没有一个庞大的科学团体像 Python 那样致力于开发实用程序、库和包。仍然有大量的实用程序来完成这项工作,但是有时仅仅是为了可视化而处理数据就感觉像是一场艰苦的战斗。

著名的 JavaScript 库

D3.js

  • 非常低级、陡峭的学习曲线
  • 非常通用/模块化
  • 高度可定制
  • 样品

Charts.js

  • 高水平,非常小的学习曲线
  • 有限的定制,但是有很多开箱即用的功能
  • 样品

Three.js

  • 非常低的水平,非常陡峭的学习曲线
  • 3D 可视化成为可能
  • 有限样本作为三维数据仍是一个新兴领域

ECharts

  • 高水平、小的学习曲线
  • 受欢迎程度有限
  • 样品

顶点图表

  • 高水平、小的学习曲线
  • 有限的可视化选项
  • 样品

谷歌图表

  • 高水平、小的学习曲线
  • 有限的定制选项
  • 样品

Python 库

Python 在这方面的优势和劣势几乎与 JavaScript 截然相反。虽然 JavaScript 并没有针对科学计算和数据处理进行优化,但是 Python 不仅如此,而且得到了一个为 Python 数据科学创建和支持开源工具的庞大社区的支持。像 SciPyNumPyPandas 这样的库使得数据准备变得更快、更简单、更少挫折。使用 Python 堆栈的另一个好处是,使用相同的堆栈可以进行大量的机器学习开发。了解可视化工作流的语言和工具可以很容易地为 ML/AI 工作流设置一个。

就弱点而言,很难指出 Python 在数据可视化方面的具体方面——对于这个用例来说,它已经相当全面了。一个挑战是交付和共享创建的可视化。因为 JavaScript 是网络语言,所以将可视化嵌入到网络或移动体验中是很简单的,但是使用 Python,分发必须更仔细地计划。科学计算社区的一个流行媒介是 Jupyter,它也可以用于这个用例。

织女星/织女星建兴

  • 中级,中等学习曲线
  • “语言”输出格式是 JSON,而不是常规的 Python
  • 样本

散景

  • 中级,中等学习曲线
  • 与 Python 科学计算社区完美集成
  • 样品

牛郎星

  • 高水平、小的学习曲线
  • 围绕织女星的伟大的高层包装,提供互动
  • 样品

  • 高水平、小的学习曲线
  • 非常少的代码获得有价值和可用的可视化。大型社区。
  • 样品

阴谋地

  • 高水平、小的学习曲线
  • 在商业 Python 应用程序中日益流行
  • 样品

摘要

追求数据可视化有很多不同的途径。积极的一面是,选择范围很广——从非常用户友好到完全低级和可定制。消极的一面是做出选择会很困难。做出选择应该是个人的决定-它应该与您的目标、组织的目标以及大规模实施这些解决方案之一所需的时间和培训的现实相一致。但最重要的是,它应该是关于沟通。我们可以集体“沉迷”于数据,我们同样可以欣赏华丽的数据驱动的图形,但我们也必须保持专注,即我们正在创造和交流信息以实施变革。实现这一目标需要的不仅仅是精通技术。

用 Kumu.io 实现网络制图中的数据可视化

原文:https://towardsdatascience.com/data-visualization-in-network-mapping-with-kumo-io-fe23d0986f3c?source=collection_archive---------18-----------------------

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

网络映射是一种非常有效的方式来显示网络中的关键变化点或关键利益相关者。Kumu.io 是一个免费的初学者友好的网络地图数据可视化平台。

在本教程中,我们将向您展示如何在 10 分钟内完成简单的网络映射可视化,而无需编写一行代码。

步骤 1:数据集配置

我们将使用 Kaggle 上的 特朗普的世界 数据集,其中包含 1500 多个与特朗普家族、他的高级顾问或他的内阁人选有联系的人/组织。

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

Kaggle’s Dataset

在这个数据集中,我们有三个工作表可以使用:

  1. 每一行代表一个人和另一个人之间的联系。
  2. **Person_Org.csv**:每行代表一个人和一个组织之间的联系。
  3. **Org_Org.csv**:每行代表一个组织与另一个组织之间的联系。

在将数据导入 Kumu 之前,我们需要构建电子表格,以便 Kumu 能够读取。我们需要将每个电子表格的第一列标题改为From,第二列改为To,第三列改为Type

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

Example

你也可以从谷歌电子表格中导入数据。点击此处查看将数据导入 Kumu 的更多说明。

第二步:在 Kumu.io 上注册

只需创建一个免费的、无限制的公共项目的个人帐户。

步骤 3:创建新项目

Kumu 提供了四个模板:系统、涉众、SNA 和其他。

因为我们在这个样本中的目标是描绘唐纳德·特朗普的系统中涉及的人和组织,以及他们的关系。所以我们打算在本教程中使用Stakeholder

点击查看其他模板描述

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

Kumu provides four templates

我们首先为Person_Person.csv数据集创建一个映射Person-to-Person Ties

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

Create a map

步骤 4:导入数据

点击页面下方的绿色加号按钮->选择Import - >选择您的文件(本例中为Person_Person.csv ) - >点击Import spreadsheet - >点击Save import

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

Import data spreadsheet

我们现在可以看到数据被自动绘制成网络图。

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

Imported Succesfully

你可以移动鼠标或点击右边的按钮来放大和缩小,并探索。

步骤 5:定制可视化

默认的贴图不能给我们太多简单灰点的信息。所以我们要做一些配置,让它的信息量更大。

1。设置点的尺寸

我们想知道谁是特朗普网络中的关键利益相关者。

在页面右下方,找到Blocks图标,选择Social Network Analysis

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

我们需要统计每个人的联系,所以我们选择了Degree指标,然后点击Discover the connectors/hubs

度中心性是最简单的中心性度量,计算一个元素拥有的连接数。一般来说,度数高的元件是本地连接器/集线器,但不一定最好连接到更大的网络。

我们现在得到了拥有最高联系的人的结果。

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

Degree Centrality

关闭区块,在页面右侧,点击Settings

SIZE BY下,选择degree,将量程改为between 0.5 and 20。点击SAVE

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

Configure SIZE BY

现在,我们可以很容易地通过圆点的大小来区分人脉较广的人。

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

2。为照片设置圆点

灰点仍然不足以有效显示谁是关键利益相关者。我们需要为他们添加照片。

点击一个点。在左侧Profile部分,点击摄像头标志并粘贴人物图像 url。

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

Set photos for dots

这是为点添加照片后的可视化效果。它变得比默认的绘图信息丰富得多。

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

现在我们完成了Person-to-Person Ties地图。

现在让我们转到Org_Org.csv数据集。从导入数据到配置点尺寸,重复上述步骤。你会得到一个类似下图的可视化效果。

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

3.配置点颜色

我们不想使用令人眼花缭乱的组织的图片作为他们的点。我们将使用简单的颜色来区分它们。

Settings中,通过 degree设置颜色,将颜色更改为RdBu或任何你喜欢的调色板。然后,viz 将看起来像这样:

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

4.向点添加标签

我们还想给点添加标签来显示组织名称。

Settings页面中,点击MORE OPTIONS,选择Customize view defaults。在**Element defaults**下,将Element label position改为center

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

Element defaults

**Font defaults**下,将Font color改为白色,并增加Font size

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

Font defaults

现在我们完成了Org-to-Org Ties地图。

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

Org-to-Org Ties

而现在你可以自己用最后一个数据集**Person_Org.csv** 练习了!

参考

  1. Kumu.io
  2. 特朗普的世界数据集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值