TowardsDataScience 博客中文翻译 2020(九百六十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

可视化高维微生物组数据

原文:https://towardsdatascience.com/visualizing-high-dimensional-microbiome-data-eacf02526c3a?source=collection_archive---------22-----------------------

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

来源:wallpapercave.com/dna-background

第 2 部分—基因组数据科学系列

本文是将机器学习应用于生物信息学数据的系列教程的一部分:

第一部分—数据采集&预处理

第 2 部分—降维

为了跟进,你可以在这里下载我们的 Jupyter 笔记本,或者继续阅读并输入下面的代码。

介绍

无监督的机器学习方法可以让我们在没有给定明确标签的情况下理解和探索数据。一种无监督的机器学习方法属于聚类家族。获得相似数据点的组或簇的一般概念可以告知我们数据中的任何潜在结构模式,例如地理、功能相似性或社区,否则我们不会事先知道这些信息。

我们将把我们的降维技术应用于从 UCSD 的 Qiita 平台获取的微生物组数据。如果您还没有这样做,请参阅本教程系列的第 1 部分了解如何获取和预处理您的数据,或者在这里下载我们的笔记本。在我们继续前进之前,我们需要这个。基本上,我们的微生物数据集的列代表细菌 DNA 序列的数量,我们的行代表单个细菌群落的样本。这种类型的数据表可以从 Illumina NGS 测序数据经过各种生物信息学数据清理和转换后创建。我们期望来自不同环境的样本具有不同的微生物特征,因为细菌群落受其环境的影响。我们为本文处理的数据是从多伦多、弗拉格斯塔夫和圣地亚哥采集的样本,它们应该各不相同。我们希望将这种隐藏在细菌组成中的差异可视化。

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

预计这三个不同地点的细菌群落是独特的,我们希望通过高维微生物组数据来可视化这一点。图片来源:Pexels,由用户修改。

为了将这种复杂、稀疏和高维的宏基因组数据可视化为我们的眼睛可以在二维计算机屏幕上解释的东西,我们将需要大幅减少我们的维度大小,或者换句话说,我们数据中的特征数量。我们的数据集有 25,000 列,这些列目前代表了每种生物体的一部分基因序列以及它们在我们的微生物组中的数量,相反,我们希望绘制“最重要的特征”的概念。本文探讨了应用于微生物组数据的 3 种不同的维度减少和可视化技术,并解释了这些可视化可以告诉我们关于我们的数据中固有的结构的信息。

所有可视化都是用 python 和 Matplotlib 和 Seaborn 绘图包制作的,pandas 用于构建数据框。

出于演示的目的,由于我们实际上有这个数据集的标签,我们可以通过为对应于不同地理位置的每个点分配不同的颜色来确认我们的数据集是否产生了良好的可视化效果。在现实中,如果你已经在采用无监督的机器学习方法,你通常不会有这种情况。

主成分分析

我们的第一种降维技术,也是最常用的一种,叫做主成分分析(PCA)。PCA 试图将特征空间减少到数据中发现的变化的表示。它通过获取所有数据点并旋转到清晰显示最大可变性的轴来实现这一点。这个轴被称为你的“第一主成分”。从数学上来说,这条线的位置穿过数据的质心,同时也最小化了每个点到这条线的平方距离。它也是数据变化最大的轴。重新排列数据后,我们将把所有数据点折叠到该维度上。一旦这一步完成,我们冲洗和重复,记住,每次我们找到一个新的主成分,新的线将总是垂直于前一个主成分。看这里(https://setosa.io/ev/principal-component-analysis/)对 PCA 的形象化解释。

为了进行 PCA,我们可以在我们之前构建的特性表上运行下面的代码。

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

来源:作者图片

如果给我们一些标签来检查我们的维数减少情况(提醒一下,在现实中这是不能保证的),我们可以用颜色重新绘制我们的 PCA:

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

当我们将数据从 1,894 个特征转换为 2 个特征时,我们可以看到数据被放入两个可辨别的维度。然而,一旦我们在数据的地理来源被揭示后查看数据的真正含义,我们会发现这种可视化技术并没有给我们一个地理数据的良好表示。不幸的是,当应用于微生物组数据产生的稀疏水平时,这种常见技术就分崩离析了。

*需要注意的是,应用 PCA 后,我们可以得到各种形状的图。为了解释你可以得到的不同形状,我们建议你看看这个帖子这里

t-SNE

另一种用于探索像我们的微生物组数据这样的高维数据的技术是使用一种被称为 t-分布式随机邻居嵌入 t-SNE 的东西。与 PCA 不同,它通过使用线性方法试图在我们的低维表示中保持不同的数据点相距很远,t-SNE 试图通过试图保持相似的数据点靠近来处理位于非线性低维流形上的数据。

t-SNE 通过最小化两个分布之间的差异来工作。第一个分布来自我们在原始高维输入空间中对象的成对相似性。第二个分布是我们在相应的低维嵌入中对象的成对相似性。本质上,我们试图最小化原始高维空间和相应的低维空间的这两种分布之间的差异。

要运行 t-SNE,让我们使用 scikit-learn 的实现,并在之前的功能表上运行它:

在我们继续之前,让我们提出几个要点。t-SNE 的一个参数是我们用来计算特征实例之间距离的度量。默认值是欧几里德距离,但是因为我们使用计数作为每行的条目,所以我们将使用一个称为 Jaccard 距离的度量。实质上,Jaccard 距离度量是两个集合中的计数数量除以任一集合中的数量,乘以 100,然后从 1 中减去所有这些。它从技术上衡量样本集之间的差异。

我们可以在 t-SNE 中调整的另一个重要的超参数是困惑。从本质上说,困惑让我们能够平衡我们在数据中对本地和全球关系的重视程度。我们选择坚持困惑=30 的默认设置,但是我们强烈推荐这次探索 t-SNE 和困惑这里

让我们绘制 t-SNE 嵌入的结果,显示一个没有标签的图(同样,就像你在真实的无监督场景中所期望的那样)和一个有已知标签的图:

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

当标签被揭示时,我们可以看到,这种嵌入是我们微生物组遗传数据中存在的潜在地理结构的体面代表,正如从相同地理区域获取的数据点在它们自己的象限中所证明的那样。接下来,我们将转向 UMAP,这是一种我们发现对这类数据最有效的技术。

我们将用于表示高维微生物组宏基因组数据的最后一种降维技术称为一致近似和投影(UMAP)。UMAP 改进了 t-SNE 的性能,不仅在明显更短的时间内更好地处理更大的数据集,而且保留了更多的原始数据全局结构。为了更深入地比较 t-SNE 和 UMAP,我们在这里推荐这个教程。

UMAP 的数学基础集中在首先构建一个加权图,其中边权重表示点之间连接的可能性。这是由从每个点向外扩展的半径和具有重叠半径的连接点决定的。随着每个点的半径增加,其连接的可能性降低。

类似于 t-SNE,我们也可以调整与 UMAP 相关的超参数,以平衡我们在低维嵌入中的局部和全局结构。我们的 n_neighbors 参数对应于用于构建原始图形的最近邻点的数量,低值强调局部结构,高值强调全局结构。

第二个主要参数是 min_dist 的参数。该参数表示我们在低维嵌入中想要的点之间的最小距离,低值给出更紧密包装的点组,而较大值给出更松散包装的点组。我们建议在这里使用交互式可视化来获得对 UMAP 超参数的直观感受。

现在让我们用 UMAP 创建新的低维嵌入:

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

…并且带有标签:

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

正如我们可以看到的,一旦我们应用颜色来显示我们的标签,似乎 UMAP 在将基础地理结构从我们原始的高维宏基因组数据集传递到上面的低维可视化方面做得更好,图中的每个“轮辐”或“花瓣”代表该地区的当地微生物群落,也称为那些微生物组。

结论

微生物组数据因其固有的高维度和稀疏性而呈现出独特的挑战。为了降低维数,我们应用了三种技术:主成分分析,t-SNE 和 UMAP。在对类似数据进行分组方面,如具有类似地理来源的微生物样本,UMAP 表现最好。

在上面的基础上,我们可以使用这些 2D 嵌入结合我们最喜欢的聚类算法来从数据中推断类别。我们可以尝试将维度减少到任意数量的维度,然后在此基础上应用聚类,而不是将维度减少到两个维度。使用聚类方法对微生物组数据进行分类是我们可能在下一篇文章中讨论的主题。

这一系列教程的两位合著者是尼古拉斯·帕克 & 蒙迪·雷默,他们都是旧金山大学数据科学硕士项目的毕业生。

如果您想联系我们,请联系我们:

蒙迪·雷默 领英
个人博客
推特

尼克·帕克 领英
个人博客

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

PCA,SNE 霸王龙和 UMAP。用户创建的图像。

通过数据收集和清理可视化休斯顿暴力犯罪趋势

原文:https://towardsdatascience.com/visualizing-houston-violent-crime-trends-via-data-collection-and-cleaning-64592a8bac25?source=collection_archive---------43-----------------------

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

黄昏时分的休斯顿市区。 Pixabay 供图。

暴力犯罪是表明社会疾病的症状之一。这在很大程度上是因为一个社会及其政府未能提供人类繁荣所必需的要素:食物、住所、教育、职业培训和获得身心保健。与此同时,犯下滔天罪行和轻微罪行的人都具备这些基本条件。在本文中,我将使用暴力犯罪统计的例子来说明 Python 中的基本数据科学方法。特别是,我将关注我的家乡德克萨斯州休斯顿的暴力犯罪数据。

本文的目标是展示

  1. 数据采集:网页抓取将文件下载到本地目录
  2. 数据清洗:仅提取并存储所需值
  3. 数据可视化:绘制数据揭示趋势

免责声明:我不会逐行检查执行上述三个步骤所需的代码。我希望代码块的截图能够帮助您理解:(1)如何对数据文件执行 web 抓取(2)读取 Excel 文件并将其转换为 Pandas dataframes (3)在 Pandas 中执行标准的数据清理操作(4)使用 matplotlib 库绘制 Pandas dataframes 中存储的数据。

一、利用网页抓取和浏览器自动化进行数据收集

首先,我们去休斯顿警察局犯罪统计网页

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

休斯顿警察局 2009 年至 2018 年每月犯罪统计网页。

每月犯罪统计数据有 Access 和 Excel 两种格式。我将使用 Excel 文件。当您单击 Excel 链接时,包含该月统计数据的 Excel 文件会下载到您的本地计算机上。下面是 2009 年 6 月数据的前几列的示例。

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

2009 年 6 月休斯顿犯罪数据

在继续讨论数据科学之前,让我们花一点时间来思考上述每一个事件所带来的痛苦,再花一点时间来思考无数未报告的此类事件。

请注意,有些行的日期不在 2009 年 6 月。这可能是由于以前的事故在以后的日期得到报告。我们必须在数据清理和处理步骤中处理这些情况。为了开始收集数据,我们注意到所有的 Excel 链接都有 URL,当被访问时会启动相关文件的下载。所以首先我们需要收集上面网页上所有的 Excel 链接网址。我们将使用请求bs4 (也称为 BeautifulSoup)库来完成这项工作。使用以下函数可以获得 Excel 链接。

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

功能,以刮除每月犯罪统计网页上的 Excel 文件的所有网址

该函数将两个 URL 作为输入:一个主页 URL 和一个基本 URL 。因为这两个 URL 是固定的,所以可以在名为 config.py 的配置文件中定义它们。以下是它们的定义:

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

网页抓取步骤的固定网址

有了链接,我们需要编写浏览器自动化代码来访问它们,并将它们下载到我们选择的目录中。这个特殊数据集的一个障碍是文件名和扩展名是两种不同的格式。此外,包括字符串NIBRS _ Public _ Data _ Group _ A&B在内的较长文件名的文件具有更复杂的结构,并且在使用 Pandas 库导入时会产生官样文章。由于这些文件仅包含数据集中 114 个月中的最后 6 个月,我们现在将忽略这些文件。为了适当地忽略它们,我们将它们保存在一个名为凌乱的子目录中。这里有一个从 URL 链接下载文件到本地目录的功能

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

从 HPD 罪案统计网页下载 Excel 文件的功能

其中 data_dir 是下载目录的路径,字典 m_dict 用于在 3 个字符的字母和 2 个字符的数字字符串之间进行转换,表示由

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

忽略乱七八糟的文件,其他都是格式 mm-yyyy.xlsx 。我想把它们改成格式 yyyy-mm.xlsx ,这样文件系统在按字母数字排序时会按时间顺序列出它们。下面的函数将完成这个任务

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

现在,非混乱文件按时间顺序列出,混乱文件存储在子目录中。

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

我们的数据收集步骤现在已经完成。为了组织代码,我将上面显示的所有函数放入一个名为 helper_funcs.py 的文件中,并导入了请求操作系统bs4 库。然后,我创建了另一个名为 data_collection.py 的文件来处理这个数据收集步骤。下面的屏幕截图提供了该文件的全部内容

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

网页抓取和文件重命名的完整代码(又名数据收集)

二。用熊猫清理数据

现在我们准备清理数据并提取信息的子集。我们希望使用 read_excel 函数将单个电子表格导入到 Pandas 数据框中。当我直接尝试这样做时,我遇到了以下文件重要子集的错误:

警告文件大小(3085901)不是 512 +扇区大小的倍数(512)
警告
OLE2 不一致:SSCS 大小为 0,但 SSAT 大小为非零

为了绕过这些错误,我在这里找到了下面的 hack ,它需要导入 xlrd 库。

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

一旦我们将电子表格转换成 Pandas 数据框架,我们需要删除所有无关信息的列。在这种情况下,我们只对发生日期、犯罪类型和犯罪次数感兴趣。我们还将只记录暴力犯罪,因此将删除与非暴力事件相关的行。被认为是暴力和非暴力的犯罪列举如下

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

我们稍后会把“严重人身攻击”改名为“人身攻击”。以下是数据集(2009 年前后)开头的许多文件共有的所有列名的列表

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

我们感兴趣的列子集是[‘日期’,‘犯罪类型’,‘犯罪数量’]。为简单起见,我们将把“冒犯类型”列重命名为“冒犯”,将“冒犯数量”重命名为“#”。然而,在浏览数据时,我注意到并非所有最后一栏都标有“犯罪数量”。事实上,以下是本专栏所有备选名称的详尽列表:

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

为了处理这些不规则性,我们将查找上述项目的任何出现,并将它们重命名为’ # '。这个问题正在处理,我们现在可以删除无关的列。以 2009 年 6 月的数据为例,下面是熊猫数据框架的打印结果,其中删除了一些列

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

以下函数将从 Excel 文件中创建一个 Pandas 数据框,并生成一个三列数据框作为输出,如上图所示

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

请注意 inplace=True 参数的用法。这在将数据帧传递给函数时是必要的,因为它告诉 Pandas 更新原始数据帧,而不是创建一个副本并保持原始数据帧不变。最后一行是行条目重命名,而不是删除列。

数据清理操作中剩下的两个步骤是:(1)删除无关的行,以及(2)合计给定月份中发生的所有违规行为。为了删除无关的行,我们使用下面的代码删除与非暴力犯罪相关的行和包含空条目的行

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

现在我们需要合计每个月的暴力犯罪。在此之前,有几件事需要做。

首先,对于一些数据文件,与进攻类型相关的字符串包含额外的空格,需要清理。下面的代码将完成这个任务。

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

第二,我想重新格式化事件日期的存储方式,因为我不想在演示如何将数据分成多列的同时使用 Pandas 的时间戳对象。下面的代码有两个函数:第一个函数将日期转换成数字格式,而第二个函数将数字信息拆分成年份和月份列。第二个函数也会删除缺少日期值的行。

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

我们的数据清理操作的最后一步涉及总结给定类型的所有违例,并将它们存储在输出数据帧中。下面的函数 append_monthly_sum 实现了这一点:

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

将所有这些放在一起,我们创建一个名为 data_collection.py 的文件来执行上述步骤。首先,我们导入库和函数,然后创建一个空的 Pandas 数据框架,并遍历目录中的所有数据文件

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

在循环内部,对于目录中的每个文件(对应于当月发生的犯罪统计数据),我们调用上面定义的函数

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

一旦所有月份都被添加到输出数据帧中,我们就可以使用 to_pickle 命令将数据帧导出到 pickle 文件中。我们现在已经成功清理了数据。

三。使用 matplotlib 进行数据可视化

清理完数据后,让我们绘制九年数据期内每月报告的暴力犯罪事件,以直观地捕捉时间序列动态。我们将使用 matplotlib 库绘制数据。当然,还有更好的开源绘图库。特别是,我发现库有更广泛的功能,更简单的语法和更漂亮的自然外观。但是,在写的时候,我用的是 matplotlib。

在进入这个数据可视化步骤的最终代码版本之前,让我们先来看一下每月攻击数据的图表。

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

从 2009 年 6 月到 2018 年 5 月德克萨斯州休斯顿每月报告的攻击次数

我们可以看到,每个月的数据都有很大的波动。使用移动平均线来消除这些波动会更容易确定数据的总体趋势。为了查看原始数据和平滑趋势,我绘制了月度数据和移动平均值。

下面是计算一个名为 data 的数组的移动平均值的函数,该数组带有大小为 w_sizen _ w 个窗口。

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

下面是针对给定犯罪类型绘制月度和移动平均数据的函数:

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

我们将所有内容放在一个名为 data_visualization.py 的文件中,该文件简单地循环所有暴力犯罪类型并应用该函数。

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

在名为 Photopea、的免费在线照片编辑器中稍加欺骗,插入一个图例,这里是每种暴力犯罪类型的最终情节。

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

数据可视化的全部目的是获得关于整个时间序列数据集的直觉。事实上,上面的图表有助于我们确定每种犯罪类型发生的总体趋势。以上情节讲述的故事是:

(1) 袭击事件在 2009 年 6 月后的 80 个月开始的快速增长期之前,下降了最初水平的三分之一。

谋杀案在整个九年期间大致保持不变。然而,前 60 个月有所下降,随后又有所上升。

在前 70 个月里,强奸案基本保持不变。之后,每月的事件数量急剧增加,到 2018 年 5 月,几乎是初始值的两倍。这一趋势令人担忧,需要调查其根源

在最初的两年里,的抢劫案几乎减少了一半。随后,它们反弹,并以略低于最初月值的价格稳定下来。

可视化不同的 ML 模型如何在特征空间中操作

原文:https://towardsdatascience.com/visualizing-how-different-ml-models-operate-in-the-feature-space-c6caa8a96375?source=collection_archive---------44-----------------------

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

直观地理解每个机器学习模型的本质

我记得当我学习机器学习模型时——KNN、逻辑回归、SVM、决策树等等——我只学习了理论。因为所有这些算法都涉及大量的数学,大多数人只学到了肤浅的理论。但是,往往对一个模型的理解还不够深入,理解不了算法的本质。

每个机器学习模型如何在特征空间中操作可以用三个机器学习问题来可视化——识别聚类、环带问题和棋盘问题。通过这些可视化,将实现对每个机器学习模型如何在特征空间中操作的更深入理解。

所有人物由作者创作。

识别集群

在这个问题中,每个机器学习模型必须将一个二维点分类到五个聚类中的一个,标记为 0 到 4。

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

决策树算法创建一个规则系统,将特征空间分成几个区域。该算法划分特征空间的一个直接引人注目的方式是,它创建了几个“不自然”的区域,因为决策树算法创建了水平和垂直线条的复杂系统,而不是线条清晰。这可以归因于算法用来划分空间的规则系统——例如,具有 0 < y < 5 和-6 < x < -1 的数据点。

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

随机森林算法类似于决策树分类器,但是区域的组织更加精确。而决策树算法将中左区域中的一段空白空间分类为类别 2(绿色),即使它确实属于任何区域。因为随机森林算法包含几个决策树的智慧,所以区域被更好地划分,但也更详细,以捕捉已经复杂的模型集合的更大复杂性。

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

支持向量机(SVM)算法的性质决定了比决策树和随机森林算法更平滑的线,在决策树和随机森林算法中,对角线实际上不是线,而是非常复杂和长的垂直和水平移动序列。因此,它实现了随机森林的目标,而没有增加方差(过拟合)。

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

K-最近邻算法类似于随机森林算法,但由于其算法本质上严重依赖于少量的唯一数据点,因此方差增加了。虽然在其他机器学习问题上,KNN 可能并不强大,但它在识别几何轮廓清晰的聚类方面似乎表现不错。

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

六种流行的机器学习算法的并排比较很能说明每种算法在特征空间上如何操作的本质。

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

环形问题

在环带问题中,分类器必须区分环带内的区域和环带外的区域,其中环带由两个圆定义。成功解决环形问题的模型可以处理非线性数据和同类的分离区域。

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

正如前面在聚类识别问题中所看到的,决策树试图仅使用由严格的水平线和垂直线界定的区域来重新创建环。它的许多异常,包括在右上角断开。这是决策树过度拟合能力和偶尔无法识别看似明显的模式的一个强有力的可视化表示。

随机森林算法可以通过利用大数定律的导数来避免这种缺陷,并通过增加集合中投票者的数量来提高准确性和理解性。很明显,随机森林算法认识到了环的连续性——然而,环周边的颗粒噪声表明该算法缺乏泛化能力。

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

KNN 算法能够形成环的形状,但是外部和内部参数中的噪声细节再次显示了对数据点的过度依赖和缺乏理解。SVM 同样理解环带的连续性,并且几乎完美地描绘了环带的内周。即使角点是线,但看数据,也不能怪算法画了线性边界。

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

逻辑回归和朴素贝叶斯在环带问题上都失败了,显示出太多的偏差和太少的方差。两种算法都将整个特征空间归为一类。

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

环空问题模型的横向比较;

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

棋盘问题

棋盘问题是一个高方差问题,其中二进制类在棋盘空间中交替出现。

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

决策树、随机森林和 KNN 算法都是非常高方差的算法,展示了基于给定数据构建棋盘的强大能力。但是,请注意,他们无法将棋盘图案推广到任何大小的棋盘——在棋盘的顶部和右侧,颜色一致的矩形向前扩展到无穷远。

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

应该注意到 SVM 在高方差问题上表现不佳。由于 SVM 只能分配有限数量的支持向量,它能做的最好的事情就是将棋盘空间分成四个区域。

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

与环形问题一样,逻辑回归和朴素贝叶斯在棋盘问题上失败,预测整个棋盘的一个类。与 SVM 一样,这些低方差算法在需要如此多复杂区域划分的任务中失败了。

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

这些算法中没有一个能够有效地划分棋盘并推广到比训练空间更大的空间。神经网络已经能够在这方面显示出希望;也就是说,在例如 20×20 的棋盘上进行训练,并且能够在例如 40×40 的棋盘上继续该模式。棋盘问题的一个解决方案是画对角线,这是一种神经网络能够识别的模式。

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

棋盘问题算法的并列比较;

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

感谢阅读!

希望这些来自三个完全不同的问题的可视化能够说明每个算法的本质,以及它如何划分特征空间以实现减少错误的目标。

创建这些问题和其他合成数据问题的代码和解释可以在这里找到。

识别星团代码圆环问题棋盘问题

使用 Python 中的桑基图可视化应用内用户旅程

原文:https://towardsdatascience.com/visualizing-in-app-user-journey-using-sankey-diagrams-in-python-8373a7bb2d22?source=collection_archive---------3-----------------------

应用程序开发人员和营销人员 DIY 指南

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

TL;DR: Sankey 图可以在二维空间显示多种类型的数据,这使它们成为可视化您的应用程序或网站用户旅程的一个很好的工具。本文将帮助您开始用 Python 构建自己的 Sankey 图表(在此 要点 中找到代码)。

盯着图表想知道你应该从中得到什么是令人沮丧的。就数据类型而言,可视化越恰当,受众就越容易理解数字背后的故事。并且可以推断的信息越丰富。

作为领先的游戏应用移动广告公司 Adikteev 的数据分析师,我一直在寻找一种方法来展示我们客户的应用内用户旅程,Sankey diagrams 是实现这一目标的绝佳数据可视化工具:

  • 像任何组织或层次结构图一样,Sankey 图可以表示一组节点之间的顺序关系。如果不是按时间顺序排列的不同步骤或阶段之间的关系,那么什么是用户旅程呢?
  • 桑基图的每个节点之间的链接宽度与流量成比例,查看者可以一眼看出完成特定旅程的用户比例。

Sankey 图可以在两个维度上显示不同的数据类型:节点的数量和链接的宽度。在用户旅程的情况下,节点的数量可以传递应用内事件的数量和时间顺序信息,链接的宽度可以显示从特定应用内事件转移到另一个应用内事件的用户比例。

更一般地说,桑基图可用于绘制网站流量、工厂能源流量……甚至拿破仑的俄罗斯战役地图:

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

查尔斯·密纳德绘制的拿破仑 1812 年灾难性的俄国战役地图。作为一个法国人,我不得不在文章中提到拿破仑。

当涉及到用户旅程分析时,这些图表可以让您一目了然地确定哪些是最频繁触发的事件,以什么顺序触发,或者从操作 A 到操作 b 有什么不同的路径。这些是营销人员、决策者或您的客户可能感兴趣的信息。

但是当构建具有三个或更多节点级别的 Sankey 图时,事情会变得混乱。您不希望花费数小时来绘制点并手动链接它们,如果您需要分析多个旅程或定期更新分析,就更是如此。在处理大型数据集时,Python 非常方便,两个 Python 库可以在这里帮助我们:

  • Pandas:用于数据分析的最著名和最常用的 Python 库之一。如果你不熟悉熊猫,但对 SQL 有一些概念,我推荐这篇伟大的文章
  • Plotly :一个 Python 图形库,允许创建交互式的、出版物质量的图形。

本文的其余部分是使用 Pandas DataFrames 和 Plotly 的 Sankey graphing object 在 Python 中进行自己的用户旅程分析的分步指南。

使用 Pandas 和 Plotly 在 Python 中绘制用户旅程的快速指南

还在吗?太好了!

我们将描绘一个非常简单的应用程序的用户旅程。为了清楚起见,这个应用程序只包含 4 种类型的事件:installsopenssignuppurchase

这是在安装后用户旅程的第四个应用内事件中截断时的样子:

如果您尝试将鼠标悬停在链接和节点上,您会看到您可以获得更多关于传入和传出流的详细信息,以及从一个事件到另一个事件的平均时间。

要完成本次研讨会,您需要:

  • Python 3.6 安装完毕;
  • Plotly python 包:我们将使用 plotly.graph_objects 来创建图表;
  • Pandas :我们将使用 Pandas 的 DataFrames 属性和一些常用的 Pandas 函数;
  • 或者,您可以安装 Seaborn 和 Plotly 的 chart_studio 包。 chart_studio 会让你发布你的图表,而 Seaborn 会让你生成酷酷的调色板来定制你的图表。

你需要一些数据。你会在这里找到一组原始数据来帮助你开始。这个数据帧的头部看起来像这样:

我们将在图表中加入以下信息:

  • 用户旅程的每个应用内事件:图表的节点将代表所有应用内事件,从安装到第 n 个事件。在这里,我们将进行到第 10 个事件。
  • 每个用户的事件漏斗:每次我们看到一个用户完成了一个应用内的事件,我们会把这个事件和他之前的事件联系起来。我们将只查看安装程序的数据,这样每个用户的第一个事件就是一个安装事件。随着我们观察到更多的用户完成同一系列的应用内事件,链接的宽度将会增加。
  • 两个事件之间的平均时间:我们还将计算每个用户的每个事件之间的时间,以便能够计算漏斗的每个步骤之间的平均时间。

本教程的第一步是准备和清理数据集:

  • 删除time_install列,在event_nametime_event列增加虚拟install事件;
  • 在新的rank_action列中计算每个事件在用户级别的排名;
  • 增加next_actiontime_to_next action列;
  • 在本教程中,我们将只保留每个用户第 10 个事件之前的行,但是如果您愿意,可以随意保留更多的事件!

您现在应该有一个新的数据帧,如下所示:

Plotly 的 Sankey 数据结构由两个 Python 字典组成:nodelinklink dict 将四个 Python 列表作为参数:

  • source:每个流的源节点列表。为了让每个事件流都有一个源,我们需要将每个事件的唯一索引和每个事件等级的唯一索引添加到这个列表中。
  • target:目标节点列表。我们将使用next_event列将每个源事件映射到它的目标事件。
  • value:包含每个流量的流量信息的列表。每次我们将一个源映射到一个目标时,我们都会进行计数,并将这个计数添加到value列表中。
  • label:悬停每个链接时显示的元数据列表。这里,我们想知道从一个源事件到一个目标事件的用户数量,以及他们这样做所花费的平均时间。

node字典采用以下两个参数:

  • label:包含节点名称的列表(在我们的例子中,是事件的名称);
  • color:包含节点颜色信息的可选列表。

查看 Plotly 的文档以了解关于每个参数的更多信息。

首先,我们将在用户旅程的每一步为每个事件创建一个唯一的source_index,记录每个事件的名称。Python 字典可以做到这一点,看起来会是这样的:

1: {
    'sources': ['install'], 
    'color': [(80, 190, 151)],
    'sources_index': [0]
  },
2: {
    'sources': ['signup', 'purchase', 'reopen'],
    'color': [(228, 101, 92), (191, 214, 222), (252, 200, 101)],
    'sources_index': [1, 2, 3]
  },
3: {
    'sources': ['reopen', 'purchase', 'signup'],
    'color': [(252, 200, 101), (191, 214, 222), (228, 101, 92)],
    'sources_index': [4, 5, 6]
  }
}

第一级键是每个事件的等级。排名#1 只包含install作为来源,因为我们只查看新安装者的数据。

我们存储一个唯一的source_index,而不是事件的名称,因为事件在旅程中可能会出现多次。我们还为每个事件赋予了一个独特的颜色,并将这个 dict 命名为 nodes_dict。

下面是实现这一点的脚本:

然后,我们需要计算漏斗的每一步(即每一个rank_event),每个用户从一个源到一个目标有多少次,并使用我们的time_to_next列记录花费了多长时间。

这里,Python 字典将再次完成这项工作——这次我们将把它命名为 links_dict 。第一级键将是我们的源索引,第二级键是每个流的目标索引。从排名 N+1 的源索引中检索排名 N 的目标索引:

{
  0: { # source index
    1: { # target index
      'unique_users': 14991,
      'avg_time_to_next': numpy.timedelta64(192..., 'ns')
    },
    2: {
      'unique_users': 3879,
      'avg_time_to_next': numpy.timedelta64(393..., 'ns')
    },
    ...
  },
  1: {
    4: {
      'unique_users': 3158,
      'avg_time_to_next': numpy.timedelta64(495..., 'ns')
    },
    5: {
      'unique_users': 4843,
      'avg_time_to_next': numpy.timedelta64(303..., 'ns')
    },
    ...
  },
  2: {
    5: {
      'unique_users': 1426,
      'avg_time_to_next': numpy.timedelta64(14524260000000000, 'ns')
    },
      ...
  },
  3: {...}

对于每个用户的事件序列,我们需要:

  • 1)读入 nodes_dict 序列中每个事件的唯一source_index
  • 2)同样,读取每个事件的下一个事件的source_index(从等级 N+1 的源索引中检索等级 N 的目标索引)并将其存储到一个target_index变量中。
  • 3)检查source_indextarget_index的组合是否已经是 links_dict 的一个键。如果没有,我们将创建它。如果是,我们将增加唯一用户的数量,并添加time_to_next信息。稍后,通过将time_to_next除以独立用户的数量,我们将得到从一个事件到另一个事件的平均时间。

该脚本如下所示:

在能够绘制我们的 Sankey 图之前,我们需要从我们的字典中创建targetssourcesvalueslabelscolors列表,这些列表将作为参数在绘图函数中传递。这可以通过迭代我们的 nodes_dictlinks_dict 轻松实现:

安全了。现在一切都准备好了,我们只需绘制图形。我们可以用linethickness参数给节点添加一些样式,并利用hovertemplate来重新表述悬停的元数据,以满足我们的需求。update_layout Plotly 功能允许我们调整图表的大小、标题文本、字体大小和背景颜色。

如果你想把它发布到网上,你需要创建一个 Plotly 账户并设置你的凭证。如果你想保持离线,你也可以在笔记本或 Chrome 上渲染你的图表。

如果你喜欢这个故事,请在 Medium 上关注我!感谢阅读。

使用 H2O 可视化大型数据集

原文:https://towardsdatascience.com/visualizing-large-datasets-with-h2o-ffe9af40371b?source=collection_archive---------26-----------------------

了解如何使用 H2O 聚合器函数有效地减少数据量。

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

梅尔·普尔在 Unsplash 上的照片

探索性数据分析是任何数据处理管道的基本部分之一。然而,当数据量很大时,这些可视化就变得模糊了。如果我们要绘制数百万个数据点,就不可能区分各个数据点。在这种情况下,可视化的输出看起来很舒服,但是对分析人员来说没有统计上的好处。研究人员设计了几种方法来驯服海量数据集,以便更好地进行分析。这篇短文将着眼于 H2O 图书馆如何聚集大规模数据集,然后可以轻松地可视化。

目标

H2O 是一个完全开源的、分布式内存机器学习平台,具有线性可扩展性。通过使用 Python 和 R 社区,H2O 支持大多数领先的和广泛使用的机器学习算法。我们将使用一个公开可用的 航空公司数据集 来证明我们的观点。这是一个包含超过 500 万条记录的庞大数据集,非常适合这种情况。

先决条件

在继续操作之前,请确保您的系统上安装了最新版本的 H2O。我们将使用 H2O 3.32——H2O 的最新版本恩斯特·策梅洛命名。关于安装库的详细说明可以在文档的 下载&安装 部分找到。

可视化大数据

现在让我们看看如何利用 H2O 来可视化一个大型数据集。

1️⃣.初始化 H2O 集群

H2O 有一个 R 和 Python 接口以及一个名为 Flow 的 web GUI。然而,在本文中,我们将使用 H2O 的 Python 接口。每个新会话都从初始化 python 客户端和 H2O 集群之间的连接开始。

一个集群是一组协同工作的 H2O 节点;当作业提交到集群时,集群中的所有节点都处理作业的一部分。

要检查是否一切就绪,请打开 Jupyter 笔记本,键入以下内容:

% matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')import h2o
h2o.init()

这是一个本地的 H2O 集群。在执行单元时,一些信息将以表格形式打印在屏幕上,显示节点数量、总内存、Python 版本等。

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

用户运行 H2O . init()(Python 中)| Image

2️⃣.第一次看数据👀

接下来,我们将导入航空公司数据集并进行快速浏览。

path = "https://s3.amazonaws.com/h2o-public-test-data/bigdata/laptop/airlines_all.05p.csv" airlines = h2o.import_file(path=path)
  • 让我们检查数据集的前十行。
airlines.head()

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

按作者排列的数据帧|图像的前十行

我们上面所说的叫做 H2O 框架。类似于Pandas’ dataframe 或者R’s data.frame。一个关键的区别是
数据通常不保存在内存中。相反,它位于一个(可能是远程的)H2O 集群上,因此 H2OFrame 仅仅代表该数据的一个句柄。

我们还可以使用如下所示的.describe()命令查看数据集的快速统计摘要

airlines.describe

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

按作者统计的数据帧|图像摘要

3️⃣.可视化数据

数据集大约有 500 万行和 31 列。现在让我们快速绘制一个Year列的直方图,看看数据中是否有某种模式。

%matplotlib inline
airlines["Year"].hist()

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

航班频率|作者图片

有趣的是,直方图显示我们没有某些年份的数据。这就是 EDA 带给分析的力量。它有助于快速查明数据集中的异常,如缺失值、异常值等。

接下来,让我们画出DepartureArrival time的对比图,看看两者之间是否有关系。这次我们将绘制一个散点图,这样我们就可以看到各个点。

# Convert H2O Frame into Pandas dataframe for plotting with matplotlibairlines_pd = airlines.as_data_frame(use_pandas = True)plt.scatter(airlines_pd.DepTime, airlines_pd.ArrTime)
plt.xlabel("Departure Time")
plt.ylabel("Arrival Time") 

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

Scatterplot of DepartureArrival time | Image by Author

如上所述,我们确实得到了一个散点图,但是很难辨别出各个点。大量的重叠点使得很难看出数据中的总体趋势。

H2O 3 号的聚合器救援方法

仅仅查看整个数据没有多大意义。相反,我们可以研究一部分数据,只要它反映了整个数据集的属性。这就是 H2O-3 的聚合器 方法的用武之地。H2O 聚合器方法是一种基于聚类的方法,用于将数值/分类数据集缩减为行数较少的数据集。

“聚合器方法的行为就像任何其他无监督模型一样。您可以忽略列,这些列将在距离计算时被删除。

聚合的输出是一个新的聚合框架,可以在 R 和 Python 中访问。

为什么不能用随机抽样来代替?

这种方法优于随机抽样,因为聚合器将保持数据的形状。随机抽样经常会导致异常值被意外删除。

使用 H2O-3 的聚合器减少数据量

现在让我们将数据的大小减少到 1000 个数据点。我们将首先创建一个包含大约 1000 条记录的聚合框架,然后使用这个聚合框架创建一个新的数据框架。

from h2o.estimators.aggregator import H2OAggregatorEstimator# Build an aggregated frame with around 1000 records
agg_frame = H2OAggregatorEstimator(target_num_exemplars = 1000)
agg_frame.train(training_frame=airlines)# Use the aggregated model to create a new dataframe using aggregated_frame
small_airlines_data = agg_frame.aggregated_frame

让我们来看看新数据帧的尺寸

small_airlines_data.dim[979, 32]

事实上,我们现在有大约 1000 个数据点,但是我们也有一个额外的列。如果您注意到,列数增加了一。让我们看看新数据帧的所有列。

small_airlines.head()

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

作者新创建的聚合数据帧|图像

如上所述,创建了一个新的计数列。聚合器将异常值保持为异常值,但是将密集的聚类聚集到样本中,并附带显示成员点的计数列。

可视化简化的数据帧

现在让我们想象一下新的数据帧。我们将创建与上面相同的散点图来比较两者。

small_airlines_pd = small_airlines.as_data_frame(use_pandas = True)
plt.scatter(small_airlines_pd.DepTime, small_airlines_pd.ArrTime)
plt.xlabel("DepTime")
plt.ylabel("ArrTime") 

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

Scatterplot of DepartureArrival time — Reduced dataframe| Image by Author

正如预期的那样,这一步花费的时间要少得多,而且输出的数据点清晰易辨。

正在关闭集群

完成实验后,记得使用下面的命令关闭集群。

h2o.cluster().shutdown()

结论

在本文中,我们研究了一种使用 H2O 聚合器方法将数值/分类数据集缩减为行数更少的数据集的方法。在如上所述的情况下,我们需要可视化大数据集,这种用途是显而易见的。如果你有兴趣深入挖掘,论文— 威尔金森,利兰。“可视化离群值。”(2016)——一定会引起你的兴趣。本文提出了一种新的检测多维异常值的算法,将帮助您理解聚合器方法的功能。

承认

感谢 H2O.ai 的高级客户数据科学家 Megan Kurka ,为本文编写代码。代码已经与 H2O 3 库的其他实现一起公开发布。

可视化线性、脊形和套索回归性能

原文:https://towardsdatascience.com/visualizing-linear-ridge-and-lasso-regression-performance-6dda7affa251?source=collection_archive---------24-----------------------

使用黄砖可视化分析模型性能

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

亨特·哈里特在 Unsplash 上的照片

机器学习是对通过经验自动改进的计算机算法的研究。根据问题和我们正在处理的数据集,有大量的机器学习算法。

机器学习模型性能是选择特定模型的最重要因素。为了选择机器学习模型,我们可以查看某些指标,这些指标可以帮助我们选择具有最高准确性和最小误差的最佳模型。除了所有这些因素,显示模型性能的最重要因素是不同类型的可视化。我们可以使用预测误差和残差图等可视化工具来选择性能最佳的模型。

Yellowbrick 是一个开源 python 库/包,它扩展了 Scikit-Learn API,使模型选择和超参数调整更加容易。在引擎盖下,它使用的是 Matplotlib。

在本文中,我们将探讨如何使用可视化技术(即使用 Yellowbrick 创建的残差图和预测误差)来可视化线性、岭和套索回归的模型性能。

安装 Yellowbrick

像任何其他库一样,我们将使用 pip 安装 yellowbrick。

pip install yellowbrick

导入所需的库

我们将使用 sklearn 库下定义的线性、岭和套索回归模型,除此之外,我们将导入 yellowbrick 进行可视化,并导入 pandas 来加载我们的数据集。

from sklearn.linear_model import LinearRegression, Lasso, Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from yellowbrick.regressor import PredictionError, ResidualsPlot
import pandas as pd

正在加载数据集

在本文中,我们将探索一个包含跨国公司销售数据的简单数据集,您可以使用任何包含回归相关数据的数据集。让我们加载数据集,看看有哪些属性。

df = pd.read_csv("Advertsisng.csv')
df.head()

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

数据集(来源:作者)

分割测试和训练数据

为了将数据集分为测试和训练,我们首先需要定义特征和目标变量。定义功能和目标后,我们将使用标准缩放器缩放数据,然后使用 sklearn 拆分数据。

X=df.iloc[:,0:3]
y=df.iloc[:,3]
#Scaling The data
scaler = StandardScaler()
scaler.fit(X)
X = scaler.transform(X)
#Splitting the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)

创建模型可视化

现在我们将创建模型并使用该模型来创建可视化。我们将创建的可视化是:

a.预测误差

预测误差图显示了数据集的实际目标与模型生成的预测值的对比。这让我们可以看到模型中的方差有多大。

b.残差图

在回归模型的上下文中,残差是目标变量的观测值(y)和预测值(ŷ)之间的差,即预测的误差。残差图显示了垂直轴上的残差和水平轴上的因变量之间的差异。

1.线性回归

model1 = LinearRegression()
visualizer = PredictionError(model1)
visualizer.fit(X_train, y_train)  
visualizer.score(X_test, y_test)  
visualizer.poof()

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

预测误差(来源:作者)

visualizer = ResidualsPlot(model1)visualizer.fit(X_train, y_train)  
visualizer.score(X_test, y_test)  
visualizer.poof()

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

残差图(来源:作者)

2.套索回归

model2 = Lasso()
visualizer = PredictionError(model2)
visualizer.fit(X_train, y_train)  
visualizer.score(X_test, y_test)  
visualizer.poof()

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

套索预测(来源:作者)

model2 = Lasso()
visualizer = ResidualsPlot(model2)
visualizer.fit(X_train, y_train)  
visualizer.score(X_test, y_test)  
visualizer.poof()

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

套索残差(来源:作者)

3.里脊回归

model3 = Ridge()
visualizer = PredictionError(model3)
visualizer.fit(X_train, y_train)  
visualizer.score(X_test, y_test)  
visualizer.poof()

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

山脊预测(来源:作者)

model3 = Ridge()
visualizer = ResidualsPlot(model3)
visualizer.fit(X_train, y_train)  
visualizer.score(X_test, y_test)  
visualizer.poof()

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

岭残差(来源:作者)

这就是我们如何为不同的模型创建残差图和预测误差图。通过分析这些图,我们可以选择性能最佳的模型。

在我们数据集的上述图中,我们可以看到,根据我们创建的图,性能最好的模型是线性回归,因此对于这个给定的数据集,我们将使用线性回归进行预测,因为它的准确性高,误差小。

类似地,我们可以将 yellowbrick 用于不同的机器学习模型性能可视化。你可以尝试不同的数据集,找到最适合你的数据的模型,尝试一下,让我知道你对这个故事的反应。

在你走之前

感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。

使用大查询自由可视化实时大数据源

原文:https://towardsdatascience.com/visualizing-live-big-data-sources-freely-with-big-query-28c9b5ad985d?source=collection_archive---------32-----------------------

构建第一个仪表板的指南

从大数据查询构建您的第一个可视化的指南

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

来源( Unsplash )

对庞大的数据集进行数据分析需要几个小时

没有付费订阅,我无法找到实时数据源

可扩展性是数据分析中的一个问题。现在大数据时代,分析 Pb 级数据的技能弥足珍贵。但是,我们在大学期间学习的大多数工具是不够的。大多数时候,我们使用小规模数据集,这并不能测试我们扩展解决方案的技能。

想象 MySQL 和 Excel 作为给定的数据源。Excel 是很好的电子表格分析工具,但是它们最多允许 1,048,576 行和 16,384 列。MySQL 可以对超过这些容量的数据集运行查询,但连接、聚合和可视化大型数据集的速度很慢。

为什么我们不把它们平行地分割、聚合和具体化呢?

一个常见的解决方案是设计数据仓库ETL 管道(提取、转换和加载),它们将物化的更小的聚合数据集开发为具有大量处理单元的输入流。

这就是 Hadoop 等 MapReduce 工具试图完成的任务。它通过对数据集进行分片并使用多线程运行操作和聚合来加速这些作业。它适用于大数据,但很难从头开始构建一个健壮的管道。

我们需要开始的是一个工具来编码、重新编译、重新部署和重新运行工作,而不需要大量的努力来构建和维护;一个拥有众多工人的加工中心,具有故障保护功能,可扩展,损耗最小。

欢迎来到谷歌大查询

教程

我将向您展示如何在不到 10 分钟的时间内将 Google BigQuery 公共数据集导入仪表板。

我们将使用实时公共数据集(JHU·科维德数据集)进行实验,这将为您快速介绍如何将该数据集导入仪表板(谷歌数据工作室)。

请随意跟随本教程或直接访问仪表板,在这里您可以复制并亲自尝试。

**附言:**如果您想要一种简单的方式来开发和部署您的仪表板即服务。我也为 Dash & Plotly 提供一个教程。它们是构建在 Matplotlib 和 Flask 之上的 python 库,是构建 web 应用程序的有用框架。

什么是谷歌大查询

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

使用 Google BigQuery 访问公共数据集

Google Big Query 是一个完全托管的无服务器数据仓库,可以专注于分析,而不是管理基础架构。它允许您可伸缩地托管您的数据。

Google BigQuery 是由 Google 大表和 Google 云平台组成的企业数据仓库。每个技术层都是无服务器的,可扩展到所有数据大小。从 Excel 电子表格到数 Pb 的流数据,它都能很好地工作。

大查询非常适合大数据,因为它可以自动管理复制的分布式存储。它可以接收多个自定义存储,然后查询大型分析。

BigQuery 是一个分布式数据存储,用于为流式工作流建立数据仓库和数据集市。BigQuery 擅长防止每个数据产品的可配置访问权限层的泄漏。

方便的是,谷歌已经有了实时公共数据集,如 JHU 实时数据连接,供我们查询。

好处

自动扩展大型数据集的计算能力。

BigQuery 连接到 Google 云平台,该平台在一个池中拥有数千个 CPU 来处理请求和作业。

当您执行 BigQuery 时,它会立即赋予您部署每个单元来计算一小部分数据的能力。然后,BigQuery 将这些数据合并在一起并进行聚合。

换句话说,BigQuery 使用类似的 Map Reduce 算法,提供了巨大的集群,而不需要太多的麻烦和配置。全部免费。

托管大量公共实时数据集(犯罪、出租车、COVID 等)。

BigQuery 通过谷歌云公共数据集计划向公众开放。

谷歌已经付费托管这些数据集,并提供这些数据集的公共访问。您可以免费访问每月 1TB 的查询数据集,这些数据集为您的投资组合托管大中型项目。

定期更新实时数据(数据新鲜度)

这有助于您配置将实时数据直接更新到可视化中的频率。

这个想法是为了缩短用户交互和用户影响您的仪表板或分析之间的时间。因此,您可以优化计算能力以及仪表板带来的影响。

例如,如果您关注每天的出租车收入。让它成为每日新鲜感可能是有意义的。但是,如果你关注的是出租车的供给/需求流量。每小时更新一次是有道理的。

使用 BigQuery 公共数据集

首先打开谷歌数据工作室

在“报告”页面上,从模板部分开始。单击空白报告模板。谷歌大查询处理不同的数据集,你可以直接分析并立即加入。

点击 BigQuery

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

选择 BigQuery

单击公共数据集→我的第一个项目→选择数据集

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

获取公共数据集 JHU Covid 案例

打开公共数据集,我的第一个项目,搜索 jhu(约翰·霍普斯金大学 Covid 数据集)

确认您的数据字段和类型

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

获取字段和列

如果你看一看,你会发现有各自类型的字段。这些数据类型包括分类数据、数字数据和顺序数据,默认聚合是所有数字的总和。

调整实时数据馈送频率(数据新鲜度)

在顶部,您可以点击数据新鲜度,然后您可以调整新鲜度。Google 已经为您建立了数据连接,因此您可以直接配置其新鲜度。

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

操纵数据新鲜度

一旦你完成了。点击右上角的创建报告,进入 Data Studio 网站。这样,您就可以将仪表板连接到一个实时的大型公共数据集进行探索。

最后,您应该会得到以下结果,您可以进一步将其制作成仪表板。

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

从 BigQuery Covid (JHU)数据集构建数据仪表板

全部免费。

最后的想法

在本教程中,我们学习了 Google BigQuery 获取实时数据集的 3 个最大优势:

  1. **可扩展性:**扩展大型数据集的计算能力
  2. **存储库:**实时公共数据集(犯罪、Covid 等)的存储库
  3. **数据新鲜度:**直接为您的可视化配置实时数据

有了它,您可以将实时数据导入 dashboard,拖放交互式可视化和令人惊叹的样式,并与您的同事和经理轻松分享。

一如既往,如有任何问题,请通过 LinkedIn联系我。如果时间允许,我很乐意回答你的问题。

索利·德奥·格洛丽亚

关于作者

文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。

除了在谷歌的工作,Vincent 还是《走向数据科学媒体》的特约撰稿人,为全球 50 万以上的观众提供有抱负的 ML 和数据从业者的指导。

在空闲时间,文森特在佐治亚理工学院攻读硕士学位,并为铁人三项/自行车旅行进行训练。

最后,请通过 LinkedIn Medium Youtube 频道 联系文森特

使用 Geopandas 在地图上可视化印度针对女性的犯罪

原文:https://towardsdatascience.com/visualizing-map-of-crime-against-women-in-india-using-geopandas-2d31af1a369b?source=collection_archive---------11-----------------------

本文向我们展示了一种使用 GeoPandas:一个 Python 库在印度地图(或者您可以选择任何国家)上绘制邦或地区统计数据(就像这里使用的一样,即印度针对女性的犯罪)的简单方法。

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

图片提供:雷纳萨莫拉,[Pinterest 邮报]。于 2020 年 2 月 18 日从https://in.pinterest.com/pin/626563366894685267/检索

简介:

大家好,这篇文章演示了如何在印度各邦的 choropleth 地图上绘制针对女性的犯罪数据。

根据谷歌字典的解释:“choropleth 地图是一种利用预先定义的区域内的阴影、颜色或符号放置的差异来表示这些区域内特定数量的平均值的地图。”

地质公园:

Geopandas 是一个不需要太多代码就可以创建 choropleth 地图的库!它可以将文件作为数据帧读取,这通常称为地理数据帧。地理数据框架很像熊猫数据框架,因此两者通常配合得很好。更多关于 https://geopandas.org/的地质公园

形状文件:

shapefile 是一种简单的非拓扑格式,用于存储地理要素的几何位置和属性信息。shapefile 中的地理要素可由点、线或面(区域)表示。

本文中用于绘制印度地图的带有邦边界的形状文件可以从链接下载,而带有地区边界的形状文件可以从链接下载。

使用 Pip 安装:

您可以使用 pip 安装 Geopandas 库,如下所示:

pip install geopandas
pip install descartes

descartes 是 geopandas 的依赖项,必须显式安装,所以别忘了也安装它。

实施:

我们在 5 个简单步骤中解释了 Python 的整个实现

假设我们有一个名为 state_wise_crimes.xlsx 的 excel 文件,其中包含印度所有的州名以及针对女性的犯罪总数,如下所示:

+-------------------+----------------------------+
|    state_name     | Total Crimes against Women |
+-------------------+----------------------------+
| Andhra Pradesh    |                    15931.0 |
| Arunachal Pradesh |                      384.0 |
| Assam             |                    23258.0 |
| Bihar             |                    13891.0 |
| Chhattisgarh      |                     5720.0 |
| .....             |                      ..... |
+-------------------+----------------------------+

我们按照以下步骤创建 chloropeth 图

第一步:将 excel 文件读入熊猫数据帧:

df = pd.read_excel('state_wise_crimes.xlsx')

步骤 2:读取地理数据框架中带有地区边界的印度地图 shape file:

fp = "Igismap/Indian_States.shp"
map_df = gpd.read_file(fp)

第三步:通过州名连接两个数据帧:

merged = map_df.set_index('st_nm').join(data_for_map.set_index('state_name'))
merged.head()

第四步:为 Matplotlib 创建图形和轴,并设置标题

fig, ax = plt.subplots(1, figsize=(10, 6))
ax.axis('off')
ax.set_title('State Wise Crime against women in India in 2015', fontdict={'fontsize': '25', 'fontweight' : '3'})

第六步:最后,绘制绿色地图

merged.plot(column='Total Crimes against Women', cmap='YlOrRd', linewidth=0.8, ax=ax, edgecolor='0.8', legend=True)

输出: 输出应该是这样的

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

您还可以使用下面的代码片段将输出保存为图像:

fig.savefig("State_wise.png", dpi=100)

类似地,我们可以使用形状文件一节中提到的形状文件来绘制地区的 chloropeth 地图。您可以从此链接下载包含针对女性的地区性犯罪的 excel 文件。

的输出如下所示:

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

我们也可以对任何一个邦做同样的事情,就像我对马哈拉施特拉邦所做的那样。
为此,我们可以通过添加一行来使用用于分区可视化的相同形状文件:

map_df = map_df[map_df['NAME_1']=='Maharashtra']

输出如下所示:

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

Github 链接:

你可以在这里得到完整的代码:

[## yasersakkaf/Visualize-Women-Harrasment-in-India-using-geo pandas

GeoPandas 图书馆的实现,用于可视化印度各邦和各地区的妇女遭遇。…

github.com](https://github.com/yasersakkaf/Visualize-Women-Harrasment-in-India-using-GeoPandas)

总结:

在本文中,我们看到了如何使用 GeoPandas 库来绘制印度的 chloropeth 地图,以描述 2015 年各邦和各地区针对女性的犯罪。

有了合适的数据集和形状文件,我们可以对其中的任何国家或州做同样的事情。

参考文献:

[## 让我们做一张地图吧!利用 Geopandas、pandas 和 Matplotlib 制作 Choropleth 地图

所以你想用 Python 做地图。我们开始吧!

towardsdatascience.com](/lets-make-a-map-using-geopandas-pandas-and-matplotlib-to-make-a-chloropleth-map-dddc31c1983d) [## 什么是 shapefile?

shapefile 是一种简单的非拓扑格式,用于存储的几何位置和属性信息…

desktop.arcgis.com](https://desktop.arcgis.com/en/arcmap/10.3/manage-data/shapefiles/what-is-a-shapefile.htm)

在 R 中使用 ggeffects 可视化边缘效果

原文:https://towardsdatascience.com/visualizing-marginal-effects-using-ggeffects-in-r-4e7fb0569040?source=collection_archive---------10-----------------------

数据集中关键变量边际效应的图解指南。

这是一个众所周知的困境:你知道你的变量 X1 影响你的变量 Y,你可以在回归分析中显示出来,但很难用图形显示出来。原因是还有一个变量影响着 Y,即 X2,只有在考虑了 X2 的影响后,X1 对 Y 的影响才显现出来。因此,你需要一种方法来显示 X1 如何影响 Y,同时考虑 X2 的影响。

这就是边际效应派上用场的地方。它们使您能够显示感兴趣的自变量的变化如何影响因变量,同时将所有其他自变量考虑在内。更具体地说,您可以使用 ggeffects 包来可视化关键变量的边际效应。

下面的教程将使用 base R 中可用的 sales 数据集。它包含教授的薪水数据和其他几个会直观地影响他们薪水的变量。

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

也许有人拿着他或她的薪水?亚历山大·密尔斯在 Unsplash 上拍摄的照片

您只需输入以下命令就可以加载它。

df=Salaries

我们想回答这个数据集中的关键问题:教授的性别会影响他们的薪水吗?

天真地,人们可以通过简单地运行下面的回归模型来尝试回答这个问题:

fit1=lm(salary~sex,df)
summary(fit1)

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

单看产量,似乎性别影响一个教授的工资。此外,当绘制性别对工资的影响时,这种影响似乎是显著的。

#install and load ggplot
install.packages("ggplot2")
library(ggplot2)#plot the relationship
ggplot(df,aes(y=salary, x=sex))+
  stat_summary(fun.y="mean", geom="bar",position="dodge")+
  stat_summary(fun.data = mean_se, geom = "errorbar", position="dodge",width=.8)+
  labs(
    x="Sex",
    y="Salary",
    title="The Effect of Sex on Salary"
  )

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

性别对工资的影响

然而,问题是:是性别导致了这种差异,还是性别与更直接的薪水预测因素相关?这个问题在回归中很容易回答。一种方法是增加更多的协变量来检验是性别还是其他原因导致了这种差异。

fit2=lm(salary~sex+yrs.since.phd+yrs.service+rank+discipline,df)
summary(fit2)

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

第二次回归的输出

正如你所看到的,性别的边际效应现在是微不足道的,这意味着在这个数据集中,性别不是工资的实际预测因素,而是与数据集中的其他变量之一相关,这些变量可以概括为资历和学术学科的指标。

所以我们知道性别不是工资的重要预测因素。但是如果我们要绘制性别和薪水之间的关系——如上图所示——看起来好像性别是一个实际的薪水预测因素。如果我们想在考虑所有其他协变量后,绘制性别对工资的实际影响——即绘制边际影响——会怎么样?这就是 ggeffects 发挥作用的地方。

因此,我们安装并加载 ggeffects,如果我们还没有这样做的话。

install.packages("ggeffects")
library(ggeffects)

然后,我们使用 ggeffects 包中的 ggpredict 函数,预测数据集中每个性别的边际效应。我们将输出保存为一个整洁的数据帧,命名为 dummy。

dummy=ggpredict(fit2, terms = "sex")

然后,我们使用 ggplot 来绘制这些边际效应。

ggplot(dummy, aes(x=x, y=predicted)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_errorbar(aes(ymin = conf.low, ymax = conf.high), alpha = .9,position = position_dodge())+
  labs(
    x="Sex",
    y="Salary",
    title="The Marginal Effect of Sex on Salary"
  )+scale_x_continuous(breaks=c(1,2) ,labels = c("Female", "Male"))

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

性别对工资的边际影响

在控制了所有其他预测因素后,我们现在可以绘制出性别对工资的实际边际影响。

觉得这个故事有趣?在 Medium 上关注我看我的其他故事!

使用热图可视化多元线性回归

原文:https://towardsdatascience.com/visualizing-multiple-linear-regression-with-heatmaps-3f69f1652fc4?source=collection_archive---------35-----------------------

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

图片来自 PixabayDavidRockDesign

介绍

不管你对数据科学和统计世界有多了解,在某个时候,你可能至少听说过回归。作为多元回归快速课程的前奏,您应该对简单线性回归有所了解。如果你不是,你可以从这里开始!否则,让我们开始多元线性回归。

我们在简单线性回归和多元线性回归之间的区别仅仅是帮助我们理解因变量的解释变量的数量。

多元线性回归是数据科学家非常流行的统计技术,也是数据科学家使用的许多更复杂方法的基础。

多元线性回归

在我关于简单线性回归的帖子中,我给出了使用一个数字变量——平方英尺来预测房价的例子。

这篇文章与我的另一篇关于多元线性回归的文章非常接近,区别在于解释因变量的变量的数据类型。那篇帖子用一个数字&一个分类变量解释了多元线性回归;也称为平行斜坡模型。

下面我们将介绍的内容将让我们深入了解一个多元线性回归模型,在该模型中,我们使用多个数字变量来解释我们的因变量,以及我们如何有效地利用热图进行可视化。尽情享受吧!

让我们建立一个回归模型

类似于我们在前面提到的文章中所构建的,我们将创建一个线性回归模型,其中我们添加了另一个数字变量。

我们正在处理的数据集是西雅图房价数据集。数据集的记录级别是按房屋和详细价格、平方英尺数、床位数、浴室数等。

在这篇文章中,我们将尝试通过数据集中其他数值变量的函数来解释价格。

说到这里,让我们开始吧。与其他帖子类似,我们使用sqft_living来预测price,只是这里我们将添加另一个变量:bathrooms

fit <- lm(price ~  sqft_living + bathrooms,    
          data = housing)
summary(fit)

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

回归模型中包含各种数字解释变量在语法上和数学上都很简单。

可视化限制

虽然从技术上讲,您可以将数字变量一个接一个地分层到同一个模型中,但这很快就会变得难以可视化和理解。

在我们的模型中,我们需要评估三个独立的维度。

接下来,我们将回顾不同的方法来可视化越来越复杂的模型。

打开热图

我们可视化的目的是理解给定变量之间的相互关系。对于两个数值变量,简单的散点图是非常直观的选择。目前,我们包括第三个变量,事情有点混乱。

我们将回顾的第一个选项是热图。这种覆盖散点图的可视化形式很好地传达了我们的模型输出如何随着解释变量组合的变化而变化。

首先,我们需要创建一个网格,将两个变量的所有独特组合结合起来。这将是关键,因为我们希望对我们的模型如何随解释变量变化有一个详尽的了解。

一旦我们做到了这一点,我们就可以给它们中的每一个分配预测,给我们一个清晰的指示,表明我们对数值变量的所有潜在组合的预测。

下面我将使用 table 函数来了解值的范围,以便创建序列,如您在下面的代码中所见。或者,您也可以将给定变量的所有唯一出现的情况传递给 expand.grid 函数,比如 so data.frame(table(housing$sqft_living))[1]

我们使用 expand.grid 创建一个包含各种变量组合的数据框架。

table(housing$bathrooms)
table(housing$sqft_living)all_combinations <- expand.grid(sqft_living = seq(370, 13540, by = 10), bathrooms = seq(0.75, 8, by = 0.25))

现在我们有了数据框架,让我们使用broomaugment函数生成预测。

combos_aug <- augment(fit, newdata = all_combinations)

让我们开始视觉化。

housing %>%
ggplot(aes(x = sqft_living, y = bathrooms))+
  geom_point(aes(color = price))

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

在这里,我们看到了解释变量之间的分散,颜色梯度分配给因变量价格。

让我们添加我们的瓷砖。我们看到与上面相同的代码,我们只是现在包含了带有模型预测的geom_tile函数,.fitted

housing %>%
ggplot(aes(x = sqft_living, y = bathrooms))+
  geom_point(aes(color = price))+
  geom_tile(data = combos_aug, 
            aes(fill = .fitted), alpha = 0.5)

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

如您所见,我们可以看到一个更明显的梯度在 x 轴上穿过sqft_living。也就是说,我们还可以看到 y 轴上bathrooms的一些梯度。同样,我们可以看到,在图表的右下方,点颜色渐变所显示的价格要暗得多/低得多。

结论

创建一个包含大量不同解释变量的模型非常容易。这是否会对给定的变量产生更深的理解是个问题。虽然这是一个简单的例子,但我希望它能对你理解一些更复杂的多元线性回归模型有所帮助。

在这篇文章中,我们讨论了以下内容:

  • 多元线性回归定义
  • 构建 mlr 模型
  • 可视化/解释限制
  • 将热图与散点图结合使用

如果这有帮助,请随时查看我在datasciencelessons.com的其他帖子。祝数据科学快乐!

三维可视化多元回归

原文:https://towardsdatascience.com/visualizing-multiple-regression-in-3d-a1e7aba7a007?source=collection_archive---------30-----------------------

如何更好地理解高维数据集?

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

图片由 Mediamodifier 来自 Pixabay

介绍

不管你是否接触过数据科学&统计学,至少,你很可能听说过回归。在本帖中,我们将讨论多元回归,作为前兆,你肯定希望对简单的线性回归有所了解。如果你不熟悉,你可以从这里开始!否则,让我们开始多元线性回归。我最近谈到了用热图可视化多元线性回归,如果你已经读过这篇文章,请随意跳到这篇文章的建模部分,在那里我们将构建我们的新模型,并介绍plotly包和三维可视化。如果你还没有读过,这是另一个可视化多元回归的有用方法。

多元线性回归

我们在简单线性回归和多元线性回归之间的区别仅仅是帮助我们理解因变量的解释变量的数量。

多元线性回归是数据科学家非常流行的统计技术,也是数据科学家使用的许多更复杂方法的基础。

在我关于简单线性回归的文章中,我给出了一个用一个数字变量——平方英尺来预测房价的例子。

这篇文章是我们探索线性回归不同实现的系列文章的一部分。在我们探索平行斜坡模型的帖子中,我们创建了一个模型,在这个模型中,我们使用平方英尺来预测价格,以及它是否是一个滨水房产。这里我们将做一些类似的事情,但是我们将使用多个数字输入来创建我们的模型。

让我们开始建模

类似于我们在前面提到的文章中所构建的,我们将创建一个线性回归模型,其中我们添加了一个新的数值变量。

我们正在处理的数据集是西雅图房价数据集。数据集的记录级别是按房屋和详细价格、平方英尺数、床位数、浴室数等。

在这篇文章中,我们将尝试通过数据集中其他数值变量的函数来解释价格。

说到这里,让我们开始吧。与我们之前构建的类似,我们使用sqft_living来预测price,只是这里我们将添加另一个变量:sqft_basement

fit <- lm(price ~  sqft_living + sqft_basement,    
          data = housing)
summary(fit)

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

回归模型中包含各种数字解释变量在语法上和数学上都很简单。

可视化限制

虽然从技术上讲,您可以将数字变量一个接一个地分层到同一个模型中,但这很快就会变得难以可视化和理解。

在我们的模型中,我们需要能够评估三个独立的维度。

正如我之前提到的,这里我们将使用plotly的 3d 绘图工具来加深理解。

让我们和plot_ly一起玩吧!

让我们首先可视化sqft_livingprice来熟悉语法。

plot_ly(data = housing, x = ~sqft_living, y = ~price, opacity = 0.5) %>%
  add_markers()

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

如你所见,语法与 ggplot 没有太大的不同。首先指定数据,然后跳入美学,而不必明确声明它们是美学。上图是一个简单的二维散点图。

让我们在三维空间中想象一下!

plot_ly(data = housing, z = ~price, x = ~sqft_living, y = ~bathrooms, opacity = 0.5) %>%
  add_markers()

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

类似于我们之前所做的,我们只是将price移动到 z 轴,现在包括了sqft_basement。这个绘图工具的有趣之处在于它不是静态的,你可以点击并拖动旋转你观察绘图的角度。显然这里你只是看到了一个截图,但是让它在你自己的机器上运行来体验一下plotly的全部灵活性。当您在 RStudio 中运行这个命令时,您的Viewer窗口将会填充这个可拖动/可移动的可视内容,这有助于解释更大维度的数据集。

添加平面

当从二维转移到三维时,事情就变了。如果你有线性代数的背景,这可能会引起共鸣。简单来说,如果你有一个单一的维度,那么你就有一个点。如果你有两个维度,你有一条线。如果你有三个维度…你就有一个平面

考虑到这一点,让我们用一个平面来形象化我们的多元线性回归模型。

首先,我们需要创建一个矩阵,其中包含所有可能的模型输入以及每种情况下的模型预测。

下面我为我们的xy创建一个向量。然后我们将它们传递给outer函数,在这里我们声明将它们传递给通过拟合我们的模型定义的线性回归函数的操作。

x <- seq(370, 15000, by = 10)
y <- seq(0, 15000, by = 10)plane <- outer(x, y, function(a, b){fit$coef[1] + 
    fit$coef[2]*a + fit$coef[3]*b})

现在我们有了我们的飞机,让我们把它添加到我们的视觉。

plot_ly(data = housing, z = ~price, x = ~sqft_living, y = ~sqft_basement, opacity = 0.5) %>%
  add_markers() %>%
  add_surface(x = ~x, y = ~y, z = ~plane, showscale = FALSE)

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

再说一次,你必须自己跳进去和plotly一起玩。

你做到了!您已经将一个平面添加到您的 3D 散点图中,该平面代表我们的回归公式与不同输入sqft_lot & sqft_basement之间的关系,但是我们仍然有一个问题…这如何帮助我们?

你曾经在你的 2D 散点图上加过回归线吗?如果是,意图是什么?

你可以在你的图中添加一条线来表示“最佳拟合”是什么样子,但是对于给定的x值,我们可以预测y,这也是很有用的。飞机给了我们这一切。对于xy的给定值,z是什么?

结论

我们在短时间内做了很多工作。多元线性回归模型会很快变得越来越复杂。我希望将此功能添加到您的工具集中,您将能够更好地理解您正在处理的数据和模型。给一个模型加载我们能接触到的每一个变量并不是非常困难,但是它确实提出了这样一个问题:它是否解决了我们的目标。它是否有助于我们在参与建模过程时开始获得的那种理解?

在短短的几分钟内,我们讲述了:

  • 多元线性回归定义
  • 构建 mlr 模型
  • 可视化/解释限制
  • 使用 3D 绘图和平面来解释我们的数据和模型

如果这有帮助,请随时查看我在 datasciencelessons.com 的其他帖子。祝数据科学快乐!

用李萨如曲线可视化音乐音程

原文:https://towardsdatascience.com/visualizing-musical-intervals-with-lissajous-curves-351248ee30ff?source=collection_archive---------47-----------------------

可视化确定完美/不完美的音乐音程

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

照片由马尔特·温根Unsplash 上拍摄

我喜欢音乐——弹吉他总能让我从日常生活中的压力中解脱出来。音乐最神奇的一面是,多个独立的音符是如何组合成一个和弦的——这个和弦比单个部分的总和还要大。但是是什么让某些和弦听起来和谐而其他的不和谐呢?最终,它归结为和弦中音符频率的比率。为了看到这一点,我们可以使用一个叫做李萨如曲线的函数。

李萨如曲线

以朱尔斯·安托万·李萨如命名的李萨如曲线由以下参数方程定义:

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

使用上述等式绘制的曲线对 ab 的值非常敏感,本质上是一种不协调的度量。比率 a/b 也在视觉上对应于李萨如曲线中的叶片数。此外,当这个比例不合理时,图将出现旋转。让我们看看如何使用它来可视化不同的和弦音程。

在 Python 中定义函数

对于这个分析,我们将用 Python 创建可视化,所以首先我们应该导入相关的包:

如果你使用 Jupyter 来生成你的动画,你需要添加行%matplotlib notebook来使用交互式后端。

现在,我们可以为我们的李萨如曲线定义函数——我们将使用简化形式的方程,其中系数 AB 都将设置为 1,我们将设置𝛿 = 0,因此在 x 项中没有偏移。

在我们的函数中,输入t将是我们传递给sincos的时间值数组,而ab将是我们之前讨论过的常数,它们代表了不协调的度量。

让我们对常规参数进行一些调整——我们将移除四个轴棘并更改绘图的字体属性:

我以前写过一篇文章在这里关于 Python 动画情节的基础,但是我们将快速浏览这里的所有步骤。首先,我们要创建一个空图,并创建一个对该图的变量引用,然后我们可以使用它在动画过程中更新数据。

现在,我们需要创建动画函数——该函数将索引i作为输入,并在每次调用时使用该信息更新绘图。在我们的例子中,我们将改变基于i的值绘制的时间间隔,这样不和谐和“不稳定”的图将随着时间范围的变化而发生视觉变化。在下面的代码中,我已经将 ab 的值都设置为等于 1。

在上面的例子中,在第一次迭代中,我们绘制从 0 到 8π的t值,随后的迭代从 8π到 16π,依此类推。我们实际上是在绘制一个时间尺度,并在更新动画时滑动整个时间尺度。

最后,我们可以用下面的代码调用动画:

frames —我们使用range(10)来传递来自[0,9]的值列表

interval —我们将每 100 毫秒移动一次时间刻度

repeat —我们将不断重复播放动画

为了美观,我们将去掉 x 和 y 刻度标记,并将 x 轴标签设置为代表我们选择的 ab 的值。

xlabel中的\n是一个转义换行符——通过添加这些字符,我们将在单独的行上打印出 ab 的值。因为我们有一个多行轴标签,所以我们可以添加以下行来确保整个标签可见:

现在,对于 a = b = 1 这个简单的例子,我们得到如下结果(记住这实际上是一个动画!).

writer —用于创建动画的后端(为此我们使用pillow)

fps —每秒帧数(因为我们每 100 毫秒调用一次 animate,所以我们应该将这个值设为 10 来匹配)

dpi —用于制作动画的图像分辨率(每英寸点数)

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

当我们的两个频率相同时,我们得到的是一条不随时间变化的线。请记住,“看起来更简单”的数字是 ab 的低整数比的结果,在这种情况下,它们都等于 1。此外,由于该比率是一个有理数,我们不希望该图随时间旋转。

音乐频率的第二个自然泛音是它的倍频,也称为八度。通过将 a 的值改为 2,我们得到如下动画:

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

由于 ab 的比值现在是 2,我们的李萨如曲线中有 2 个凸角,并且由于 a/b 是有理数,我们没有旋转。在古希腊,毕达哥拉斯就曾使用这样的“纯音程”来调整音符,以产生一个音阶。

毕达哥拉斯调音

毕达哥拉斯调音系统使用两个纯音程来确定整个音阶:八度音阶(2:1)和完美五度音阶(3:2)——你可以在本文这里找到更多信息。通过反复应用这两个比率,我们可以生成音阶中的所有音符。举个例子:

从基频、八度、五度开始:

(1/1), (3/2), (2/1)

相对于当前五度音程寻找新的完美五度音程:

(3/2) * (3/2) = (9/4)

因为这个值大于我们的八度音程(2/1),我们除以这个比率(2)使它回到我们的音程:

(3/2) * (3/2) *(1/2) = (9/8)

我们现在的规模是:

(1/1), (9/8), (3/2), (2/1)

其中(9/8)现在代表一个新音符——大调第二音符

我们一遍又一遍地继续这个过程,直到我们生成了音阶的所有音符——只看大调音阶的音符,我们得到:

根: (1/1)

大调第二: (9/8)

大调第三: (81/64)

完美 4 档 : (4/3)

完美 5 档 : (3/2)

大 6:(27/16)

大七: (243/128)

八度: (2/1)

我们可以通过使用支线剧情和绘制每个动画来可视化所有这些笔记!我们将制作如下的支线剧情:

add_subplot(xyz)x是行数,y是列数,z是感兴趣的支线剧情(从左上角开始,逐一遍历每行)

现在,我们的动画函数必须同时更新所有的支线剧情:

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

勾股调音中主要音阶音程的李萨如曲线

还是那句话,上面的情节都是动画的,所以我们可以看到没有一个是“不稳定”的。然而,正如我们之前看到的,曲线的复杂性代表了整个数字比率,我们看到大 3 度和大 7 度的复杂性很高。虽然后一个音程听起来不和谐(因为它们对应于两个连续的半音),但大三度应该不会。其实这其实是对使用毕达哥拉斯调音音阶的主要批评!大三度音是如此的不协调,以至于会导致大和弦听起来不和谐。

性情平等

通常用来解决这个问题的调音系统是十二音平等律,其中相邻音符之间的比率不再由纯音或整数比率来定义,而是相等的。为此,我们取 2 的十二次方根,因为每 12 个半音频率加倍(八度)。

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

使用这个系统的结果是,因为我们不再使用纯音音程,所以我们所有的音符都只是稍微走调,不像毕达哥拉斯系统,在毕达哥拉斯系统中,许多音程都是完美的,一些大整数的比率会导致不和谐。然而,相对音程可以提供比毕达哥拉斯的和弦听起来不那么不和谐的和弦。

现在,让我们像对毕达哥拉斯调音一样,用平等的音律来想象大调音阶。我们需要构建大调音阶的半音如下:

**词根:**原始频率

**大调第二:**第二半音

大调第三:第四半音

全四度:五度半音

全五度:七度半音

**大调第六:**第九半音

**大调第七:**第十一半音

**八度:**第十二个半音(或倍频)

下面是我们如何在动画函数中实现它的一个例子:

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

勾股调音中主要音阶音程的李萨如曲线

我们看到八度以外的所有音程现在都不稳定了!即使是平均律系统中的五度音程也不再是完美的五度——然而,我们注意到大三度现在比在毕达哥拉斯调音的情况下不那么不和谐了。这就是为什么对于像钢琴这样的乐器来说,在飞行中微调音符是不可能的(例如,在管乐器中),同等调和的音符是更可取的。

结束语

我希望这篇文章对展示我们如何使用动态 Python 可视化来判断音乐和弦中的“不和谐”有用。本文中的所有代码都可以在这个 Github 资源库中找到。

我感谢任何建议或反馈!你可以在 Twitter 上关注我,或者在 LinkedIn 上联系我,获取更多文章和更新。

可视化我的 LinkedIn 网络

原文:https://towardsdatascience.com/visualizing-my-linkedin-network-c4b232ab2ad0?source=collection_archive---------3-----------------------

一目了然地看到我的整个网络

来自金的便利,承蒙吉菲

这就是我在现实生活中参加社交活动时的感受。然而,使用 LinkedIn 建立我的人际网络是一种完全不同的体验——我甚至通过给平台上的人发短信获得了一份实习工作。所以我真的很看重这个平台,非常看重。

LinkedIn 的不足之处

但是 LinkedIn 在一个主要方面让我失望了,真的很难理解你的网络。我的意思是,LinkedIn 没有提供任何方便的统计数据或可视化工具来让你了解你的 LinkedIn 领域,这使得你很难最大限度地利用它。

在探索你自己的 LinkedIn 网络时,这几乎是最好的了。

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

我的网络->连接->使用过滤器搜索

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

用于搜索的所有过滤器

您可以使用一些过滤器,但仅此而已。你不能把你的整个网络看做一瞥或任何统计摘要,所以很难对你的数据进行理解。

我觉得可视化我的网络,将有助于我最终了解我的 LinkedIn 足迹——谁在其中,他们在哪里工作,是否多样化等等。在这成为他们平台上的一个功能之前,我希望你会受到启发,积极主动地想象你自己的网络,最终了解你网络中的 500 多个联系是由什么样的人组成的。

获取我的 LinkedIn 数据

如果我想可视化我的网络,第一步是获取我的网络数据。你可能认为这有一个 API,你是对的。但是 LinkedIn 的 API 使用起来并不那么简单——访问连接数据需要多个权限,这是有充分理由的。但是我所需要的可视化我的网络就是我的数据。LinkedIn 非常好,可以让下载你自己数据的过程变得相当简单——不需要 API,只需下载一个好的旧 csv 文件。

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

您可以在个人资料的“设置和隐私”部分找到它

有趣的部分到了——可视化!

所以现在数据可用了,我需要开始分析它——我的首选工具是可信赖的 Jupyter 笔记本

这是我下载的 Connections.csv 文件的前几行。

import pandas as pd
df = pd.read_csv('Connections.csv')
df.head()

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

它列出了我的网络中每个人的电子邮件、当前职位和公司,以及他们何时成为我的网络的一部分。但是打印 csv 的行显然不是可视化或理解我的网络的最佳方式。

为了让我的整个网络一目了然,我将使用 Plot.ly 的树形图。

import plotly.express as px
px.treemap(df, path=['My Network', 'Company', 'Position'], width=1200, height=1200)

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

用 Python 中的 Plot.ly 制作

让我们仔细看看…

我最近才发现树状图,我很高兴我发现了它们,因为它如此优雅地捕捉了 LinkedIn 网络数据。

该图将我的关系网分为一个等级结构——关系网、关系网中的公司以及在这些公司中的职位。每个区块的大小表明有多少人属于该组。因此,公司磁贴越大,它在我的网络中所占的比例就越大。公司内部的瓷砖也是如此。这让我探索我的网络构成变得如此容易和有趣。

但是我还没说完。通过切换代码中的几个参数,我可以探索以位置为中心的网络视图,而不是以前可视化的以公司为中心的视图。

px.treemap(df, path=['My Network', 'Position', 'Company'], width=1200, height=1200)

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

也是用 Python 中的 Plot.ly 制作的

我们可以再仔细看看。

解读数据

在玩了太长时间的可视化游戏后,我开始思考他们在说什么。

比较以公司和职位为中心的树形图给了我一个有趣的见解。在公司焦点中,我可以看到明显的主导公司,如摩根大通、HKUST 和高盛。但立场聚焦,显示了更民主的观点。目前有几个主要职位:软件工程师、分析师和助理——但大图显示了更多样化的存在(更多的小盒子和更少的笨重盒子)。这让我很惊讶,因为这违背了我最初的直觉“工作种类比公司少”。相反,小众角色比我预想的要多得多,它们压倒了公司的多样性(至少在我的网络中)。

就个人而言,这些树状图也让我意识到我的 LinkedIn 网络比我想象的更加多样化。看着我的推荐和我最近添加的人,我经常认为一些公司和肯定一些职业构成了我的网络的大部分。但这与事实相去甚远,因为我现在意识到,我的大部分人际网络是由公司和职业组成的,它们只包含一两个人。

本质上,这些发现是一个…

来自朋友,承蒙吉菲

自己尝试代码

你可以修改代码,并通过直接进入活页夹环境这里与可视化交互。

你也可以通过访问代码库,这里是

如果你有任何问题、批评或赞美,请随时在推特、 LinkedIn 或下面联系我😄

可视化参数化量子分类器。

原文:https://towardsdatascience.com/visualizing-parameterized-quantum-classifiers-e5dfb0c584ba?source=collection_archive---------62-----------------------

一个量子位数据的情况。

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

这篇文章的目的是解释在 1 个量子位的情况下量子态的参数化二进制分类器。这个简单的例子允许我们有一些很好的可视化,甚至一些分析表达式。

第一部分将陈述结果并显示数字,而技术证明将留给第二部分。所以如果你不喜欢方程,你可以在第一部分之后停止阅读。

我鼓励每个不熟悉球坐标的人看看这里的,因为这是这篇文章的核心。

这个帖子不是对量子计算的介绍,这里的是关于它的最清晰的视频。这里是更详细的文章。

所有的图形都是用库 QuTip 创建的。

可视化和结果

布洛赫球

量子态可以表示为一个复矢量|ψ> = 𝑎|0>+𝑏|1>,比如|𝑎| + |𝑏| = 1。它也被定义为一个全局相位,我们可以用𝜃 ∈ [0,π]和ϕ∈ [0,2π]写出|ψ> = cos(𝜃/2)|0>+e^(iϕ)sin(𝜃/2)|1>。这对夫妇(𝜃,ϕ)在 R^3 的单位球面上定义了一个点,这种量子位的表示被称为布洛赫球面。

这是一个用布洛赫球表示的量子态的例子。蓝色表示状态|0 >,红色表示状态|1 >,绿色表示状态 1/√2 (|0> + |1 >)。

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

量子态的二元分类器。

正如在一个经典的分类问题中,我们假设每个量子态都与{0,1}中的标签 y 相关联。我们观察到一组称为训练集的状态的标签,我们希望构建一个函数来预测一个新的量子状态的标签。我们希望构造一个参数化的酉算子 U(⍺) 比如

u(⍺)|ψ(x)>=√p(y = 0)|0>+p(y = 1)| 1>

通过测量量子态来估计概率。然后可以计算一个成本函数,并用经典优化器更新参数

我们不会在这篇文章中讨论这个问题,我们的目标是可视化参数化分类器在 Bloch 球上的效果。

分类器的基本属性

幸运的是,在一个量子位的情况下,幺正算符非常简单,可以用 3 个参数来完全表征。一般形式由下式给出。

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

这意味着我们只需要查看这个矩阵族就可以找到我们的候选分类器。此外,我们可以证明参数ϕ对最终概率没有影响。它把我们简化成最后的形式。

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

边框的属性

边界由一组点定义,P(y=0) = P(y=1) = 1/2。在一个量子位上的二进制分类器的情况下,这个边界是一个将布洛赫球体切割成两个相等半球的圆。一个半球包含分类为 0 的所有量子态,另一个半球包含分类为 1 的所有量子态。

形象化

现在让我们想象一下分类器的结果是什么样的。对于下面的每张图,我们用红色和蓝色标出了由量子模拟器计算出的分类区域。边界用黑色画,知道圆的方程式。

下面是 𝜃 = 0𝜃 = π的结果,两种情况下λ = 0。完全翻转 𝜃 不会改变平面图(x,y)中边界的位置,但是标签会反转。

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

我们现在来看看λ = 0 时的 𝜃 = π/2。边界已经从平面(x,y)旋转到平面(y,z)。

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

现在,更一般的数值有 𝜃 = π/6,并且λ = 0,λ = 3π/2。在保持 𝜃 不变的同时修改λ,就像围绕 z 轴旋转球体。

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

数学

现在让我们详细证明我们以前见过的一切。

证明ϕ不影响概率。

设|ψ> =*⍺|*0

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

u |ψ> = cos(𝜃/2)| 0>+e^(iϕ)sin(𝜃/2】| 1>+(-sin(𝜃/2)e(iλ)β)|0>+e(iϕ+iλ)cos(𝜃/2)β|1>=【cos(𝜃/2】+(-sin(Iλ/2)e(Iλ)β)]| 0>+【e(Iε)sin(Iλ/2)】

我们现在取与|1 >相关的振幅的模平方。

而我们有p(y = 1)= |e(iϕ)sin(𝜃/2)*⍺*+e(iϕ+iλ)cos(𝜃/2)β| =|e^(iϕ)| |sin(𝜃/2)+e^(iλ)cos(𝜃/2)β| =|sin(𝜃/2)+e^(iλ)cos(𝜃/2)β|

因此,分类概率独立于ϕ.

边界的等式。

让|ψ> = cos(𝜃/2)|0>+e^(iϕ)sin(𝜃/2)|1>,让我们考虑如下定义的酉 u(θ,λ)。

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

这就像前一段中设定的ϕ=0。

于是,我们知道被分类为 1 的概率是:

**p(y = 1)=|sin(θ/2)cos(𝜃/2)+e^(iλ+iϕ)cos(θ/2)sin(𝜃/2)|用他们的表达式替换 和β时。请不要把这个ϕ和上一段中的那个混淆了。

扩展完整的表达式给了我们

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

我们可以利用 cos +sin =1 的事实来简化最后两项,并且可以利用等式 sin(2⍺*)= 2cos(*⍺)sin(⍺).)来简化第二项

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

然后我们用 sin(⍺/2) = (1-cos(⍺))/2 和 cos(⍺/2) = (1+cos(⍺))/2)和我们有

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

边界例如 P(y=1) = 1/2。因此,它的集合是(𝜃,ϕ如 cos(λ+ϕ)sin(θ)sin(𝜃)-cos(θ)cos(𝜃)= 0。

边界方程:

cos(λ+ϕ)sin(θ)sin(𝜃)—cos(θ)cos(𝜃)= 0

然后我们将证明这个方程刻画了以原点为中心的单位球面上的一个圆。

球坐标中圆的方程

以原点为圆心的单位球面上的圆,完全可以用一个法向量来表征,如下图所示。设×ᵤ**=(𝜃ᵤ,)这个向量的坐标。

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

设(𝜃,ϕ)为圆的一点。与 x 的正交性可以写成 :

sin(𝜃ᵤ)cos(ϕᵤ)sin(𝜃)cos(ϕ)+sin(𝜃ᵤ)sin(ϕᵤ)sin(𝜃)sin(ϕ)+cos(𝜃ᵤ)cos(𝜃)= 0

sin(𝜃ᵤ)sin(𝜃)(cos(ϕᵤ)cos(ϕ)+sin(ϕᵤ)sin(ϕ))+cos(𝜃ᵤ)cos(𝜃)= 0

通过使用三角加法公式,

sin(𝜃ᵤ)sin(𝜃)cos(ϕᵤ+ϕ)+cos(𝜃ᵤ)cos(𝜃)= 0

我们最后的圆方程式是:

sin(𝜃ᵤ)sin(𝜃)cos(ϕᵤ+ϕ)+cos(𝜃ᵤ)cos(𝜃)= 0

通过识别 cos(λ+ϕ)sin(θ)sin(𝜃的术语)—cos(θ)cos(𝜃)= 0(上一段),我们有ϕᵤ=λ,还有𝜃ᵤ=π-θ.**

因此,边界是一个圆,给定初始幺正参数,我们可以计算这个圆的方程。

这就是,一些量子分类器的可视化,以及即将出现的证据。Maria Schuld 等人在本文中对参数化量子分类器进行了全面解释。

欢迎分享您的反馈,您可以在 LinkedIn 上联系我,或者发布对文章的回应。

使用 HERE traffic api 可视化实时交通模式

原文:https://towardsdatascience.com/visualizing-real-time-traffic-patterns-using-here-traffic-api-5f61528d563?source=collection_archive---------14-----------------------

虽然谷歌地图显示的是实时交通状况,但却无法访问底层的交通数据。HERE technologies 提供各种基于位置的服务,包括提供交通流量和事故信息的 REST API。

这里有一个非常强大的免费增值账户,允许多达 25 万次免费交易。然而,虽然有一些不错的开发人员文档,但缺乏关于如何准确提取交通信息并进行分析的在线教程。在本文中,我将介绍使用 python 和 xml 解析从道路网络获取交通数据的基本过程。这是 2019 年 12 月随机周四下午 1:30 至 4:30 之间 DC 高速公路交通数据的 GIF 图:

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

下午 1:30-4:30 的 DC 交通 gif 图显示了这里的交通流量数据。资料来源:塞犍陀·维维克

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
import matplotlib.cm as cmimport requests
#import dill
from bs4 import BeautifulSoup
#from datetime import datetime
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import XML, fromstring, tostringpage = requests.get('https://traffic.api.here.com/traffic/6.2/flow.xml?app_id=BLAH&app_code=BLAH2&bbox=39.039696,-77.222108;38.775208, -76.821107&responseattributes=sh,fc')
soup = BeautifulSoup(page.text, "lxml")
roads = soup.find_all('fi')

首先,您需要在这里注册,并生成应用 id 和应用代码凭证(上例中的 BLAH 和 BLAH 2)——这非常简单。接下来,你需要找出你想要查找交通流量的道路网络区域,你可以在谷歌地图中点击某个位置,然后右键单击“这里有什么?”这将给出稍后长坐标。这里,traffic API 需要对应于左上和右下的 2 个 lat long 对,以便给出矩形边界框内包含的道路上的交通流量信息。响应属性是将包含在 API 响应中的信息。在上面的示例中,“sh”表示 shapefile 属性,这很重要,因为它们给出了道路的几何图形,而“fc”表示函数类,对于以后仅过滤高速公路或街道等非常有用。最后一行代码给出了一个 XML 文档,其中每个孩子代表一个特定的路段,每个路段都有一个唯一的形状文件。

a1=[]
loc_list_hv=[]
lats=[]
longs=[]
sus=[]
ffs=[]
c=0
for road in roads:
    #for j in range(0,len(shps)):
    myxml = fromstring(str(road))
    fc=5
    for child in myxml:
        #print(child.tag, child.attrib)
        if('fc' in child.attrib):
            fc=int(child.attrib['fc'])
        if('cn' in child.attrib):
            cn=float(child.attrib['cn'])
        if('su' in child.attrib):
            su=float(child.attrib['su'])
        if('ff' in child.attrib):
            ff=float(child.attrib['ff']) if((fc<=2) and (cn>=0.7)):
        shps=road.find_all("shp")
        for j in range(0,len(shps)):
            latlong=shps[j].text.replace(',',' ').split()
            #loc_list=[]
            la=[]
            lo=[]
            su1=[]
            ff1=[]

            for i in range(0,int(len(latlong)/2)):
                loc_list_hv.append([float(latlong[2*i]),float(latlong[2*i+1]),float(su),float(ff)])
                la.append(float(latlong[2*i]))
                lo.append(float(latlong[2*i+1]))
                su1.append(float(su))
                ff1.append(float(ff))
            lats.append(la)
            longs.append(lo)
            sus.append(np.mean(su1))
            ffs.append(np.mean(ff1))

上面,我按照功能等级≤2(表示高速公路)过滤了所有道路,cn 表示置信度,0 表示低置信度,1 表示最高置信度。总的来说,这个 DC 高速公路系统有大约 5000 个路段。

fig=plt.figure()
plt.style.use('dark_background')
#plt.plot(np.linspace(0,10,10),np.linspace(0,10,10))
plt.grid(False)
for i in range(0,len(lats)):
    if(sus[i]/ffs[i]<0.25):
        plt.plot(longs[i],lats[i], c='brown',linewidth=0.5)
    elif(sus[i]/ffs[i]<0.5):
        plt.plot(longs[i],lats[i], c='red',linewidth=0.5)
    elif(sus[i]/ffs[i]<0.75):
        plt.plot(longs[i],lats[i], c='yellow',linewidth=0.5)
    else:
        plt.plot(longs[i],lats[i], c='green',linewidth=0.5)
    #print(i)
#plt.xlim(-77.055,-77.015)
#plt.ylim(38.885,38.91)
plt.axis('off')
plt.show()

最后,我绘制了道路上所有的交通速度,用棕色、红色、黄色、绿色表示最差到最少的交通,类似于谷歌地图。一个缺点是没有检索以前数据的选项,这都是实时的:/。

还有很多其他的服务。例如,TomTom 提供的路段数据与这里非常相似,只不过它是距离给定经度位置最近的单个路段的速度信息。但是要获得整个区域,需要熟悉缩放级别和平铺网格。对于缩放级别 0,世界显示在一个单幅图块上。在缩放级别 22,世界被分成 2^44 瓷砖。弄清楚像 DC 这样的特定位置如何对应于哪一个瓦片是一件非常头痛的事情。Waze 似乎也有一些选择来获得它的流量数据,但是你需要注册成为 Waze 的合作伙伴,这是一个完全不同的过程。

所以你去,你现在可以可视化实时交通和模式!还有很多更酷的事情可以做,例如将这与事件数据相结合,以预测交通如何基于事件而变化。或者与 fleet 或 Mapbox 等网络地图平台配合使用,让它看起来更漂亮。基于位置和交通的服务将继续存在。想想优步、Lyft、波导、亚马逊快递等。所有这些公司都需要实时位置和交通信息。在不久的将来,自动送货卡车车队可能会依靠这些信息做出明智的决定。前途无量!

关注我 如果你喜欢这篇文章——我经常写复杂系统、物理学、数据科学和社会的界面。

如果你还不是中会员,想支持我这样的作家,可以通过我的推荐链接随意报名:https://skanda-vivek.medium.com/membership

可视化正则化与 L1 和 L2 规范

原文:https://towardsdatascience.com/visualizing-regularization-and-the-l1-and-l2-norms-d962aa769932?source=collection_archive---------13-----------------------

为什么最小化规范会导致正则化?

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

作者图片

如果你上过机器学习的入门课,你肯定遇到过过度拟合的问题,并了解过正则化和规范的概念。我经常看到纯粹通过查看公式来讨论这个问题,所以我想我会尝试使用一些直观的例子来更好地了解为什么最小化范数会导致正则化,以及 L1 和 L2 之间的差异。

必备知识

  • 线性回归
  • 梯度下降
  • 对过拟合和正则化的一些理解

涵盖的主题

  • 为什么最小化范数会诱导正则化?
  • L1 标准和 L2 标准有什么区别?

正规化概述

使用线性回归的例子,我们的损失由均方误差(MSE)给出:

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

我们的目标是尽量减少这种损失:

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

为了防止过度拟合,我们想要添加一个偏向不太复杂的函数。也就是给定两个可以合理拟合我们数据的函数,我们更喜欢简单的一个。为此,我们添加了一个正则项,通常是 L1 范数或平方 L2 范数:

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

因此,例如,通过将平方 L2 范数添加到损失和最小化,我们获得岭回归:

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

其中λ是正则化系数,它决定了我们需要多少正则化。

为什么最小化范数会诱导正则化?

**最小化范数有助于降低函数的“复杂性”。**从数学上讲,我们可以看到 L1 和 L2 范数都是权重大小的度量:L1 范数的绝对值之和,L2 范数的平方值之和。所以更大的权重给出了更大的范数。这意味着,简单地说,最小化范数鼓励权重变小,这反过来给出了“更简单”的函数

让我们用一个例子来形象化这一点。让我们假设我们得到一些类似这样的数据:

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

作者图片

我们应该选择什么函数来拟合这些数据呢?有许多选择,这里有三个例子:

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

作者图片

这里我们有一个 2 次多项式拟合和两个不同的 8 次多项式,由以下等式给出:

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

前两个(是“更简单”的函数)最有可能更好地概括新数据,而第三个(更复杂的函数)显然过度拟合了训练数据。这种复杂性是如何体现在规范中的?

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

作者图片

我们可以看到,线[c]的均方误差为 0,但其范数相当高。相反,线[a]和[b]具有稍高的 MSE,但是它们的规范低得多:

  • 线[a]具有较低的范数,因为与[c]相比,它具有明显较少的参数
  • 线[b]具有较低的范数,因为尽管有相同数量的参数,它们都比[c]小得多

由此我们可以得出结论,通过将 L1 或 L2 范数添加到我们的最小化目标,我们可以鼓励具有较低权重的更简单的函数,这将具有正则化效果,并帮助我们的模型更好地推广新数据。

L1 标准和 L2 标准有什么区别?

我们已经看到,为了降低函数的复杂性,我们可以完全去掉一些权重(将它们设置为零),或者使所有权重尽可能小,这就是 L1 和 L2 之间的区别。

为了理解它们如何不同地操作,让我们看一看它们如何根据权重的值而变化。

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

作者图片

左边是给定重量 w 的 L1 和 L2 范数图,右边是相应的范数斜率图。正如我们所看到的,L1 和 L2 都随着 w 值的增加而增加。然而,当 L1 范数以恒定速率增加时,L2 范数以指数形式增加。

这很重要,因为正如我们所知,当进行梯度下降时,我们将基于损失函数的导数来更新我们的权重。因此,如果我们在损失函数中包含一个范数,范数的导数将决定权重如何更新

我们可以看到, L2 范数随着 w 变小,范数的斜率也变小,这意味着更新也将变得越来越小。当权重接近 0 时,更新会变得非常小,几乎可以忽略不计,所以权重不太可能变成 0。

另一方面,用 L1 范数斜率是常数。这意味着随着 w 变小,更新不会改变,所以我们会因为权重变小而得到相同的“奖励”。因此,L1 规范更有可能将一些权重降低到 0。

概括一下:

  • L1 范数将一些权重驱动到 0 ,导致权重稀疏。这对于内存效率或者当需要特征选择时是有益的(即我们只想选择某些权重)。
  • 相反, L2 规范减少所有权重,但不会一直减少到 0 。这不太节省内存,但如果我们想要/需要保留所有参数,这可能是有用的。

觉得这个故事有帮助?考虑 订阅 到媒体支持作家!

在 Python 的 Plotly 中可视化德国汽车供应商的收入

原文:https://towardsdatascience.com/visualizing-revenues-of-german-car-suppliers-in-pythons-plotly-9c90610af4f1?source=collection_archive---------55-----------------------

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

初升的太阳从升起

如今,数据无处不在,让每个人都能访问数据是必不可少的一步,不管他们的专业背景如何。

手动分析表格数据是极其讨厌的,肯定不会引起任何人的注意。

事情不一定要这样。

完全相同的数据可以以奇特的方式可视化,甚至非数据科学家也渴望一睹这些令人钦佩的情节。

如果每个人眼前都有一个有意义的图表,而不是枯燥的表格,那么用数据来销售一个故事就会变得容易得多。

与表格相比,拥有一个漂亮而干净的图表可以更快地浏览手头的数据,提供更好的交互机会,并且看起来非常漂亮。

让我们点燃蜡烛。

这篇文章使用了listen campion,)的一小段数据,这是一家提供特定市场列表的领先公司,对于可视化和分析目的来说是最佳的。非常感谢它的团队为我提供了这个列表,并允许发表对它的分析。

当以正确的方式可视化数据时,用数据说服人们会变得简单。我的正道是 Python 的 Plotly 库。与 matplotlib 相比,它的视觉效果一流,响应速度也很快,因此它是我在 Python 中实现可视化的首选库。

首先,我们必须对手头的数据有一个概念,所以让我们检查一下我们的代码片段提供了什么:

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

关于手头数据集的信息

令人兴奋的是,德国 20 大汽车供应商名单。二十个条目足够小,甚至对人类友好,但是,想想一个有几千个条目的列表,事情会变得很快变得很糟糕。这就是为什么 Python 和 Plotly 是分析和可视化数据的好方法。

该数据集包括公司地址、员工人数、2015 年至 2018 年的收入、首席执行官、联邦州、联系人等信息。

为了在世界地图上显示这些公司,有必要以经度-纬度格式提取它们的地理位置。幸运的是,我们有一个给定的地址,可以进一步用来获得地理坐标。因此,谷歌地理位置 API 来得非常方便。初次登录时,您还可以获得最初的 300 美元,这对于任何较小的项目来说都足够了。

那么,让我们得到这些地址的地理坐标(经度,纬度):

import googlemaps
gmaps = googlemaps.Client(MAPS_KEY)def get_coordinates(plz_string):

convert zip code into geo coordinates.Input:
plz_string: string with the zip code + country location, i.e. 75242 Germany, or 94086 USA

   try:
      lon = location[0][“geometry”][“location”][“lng”]
      lat = location[0][“geometry”][“location”][“lat”]
   except:
      lon = None
      lat = None
      print(“Something went wrong with: {}”.format(plz_string))
   return lat, londf[‘location’] = df[“PLZ”].apply(lambda x: str(x) + “, Germany”)
df[‘lat / lon’] = df[‘location’].apply(lambda x: get_coordinates(x))

这太神奇了,在几分钟内,我们已经将邮政编码转换成地理坐标,这使我们能够在地图上标出确切的位置。

现在我们有了这些简洁的坐标,让我们进入这篇文章的核心,用最好的方式使用 Plotly 的功能。

我为建议和改进而高兴,也为你指出的每一个代码垃圾而高兴。

Plotly 提供了各种可以使用的地图,如 chloropleth 地图、地图框或散点图。我将利用后者。

现在的问题是,你想把公司总部的位置形象化吗?因此,我将从我们的数据中列出的他们过去两次录音(2018-2017)的收入差异入手。我还根据联邦州、公司规模或他们运营的分支机构进行了可视化。查看我的 github,包括整个笔记本

然而,为了简单和美观,我将只带您进行收入发展之旅。请随意实现其他版本或提出更有创意的想法来可视化该数据集。

在我向你展示情节之前,请记住,这些是汽车供应商,没有谷歌或亚马逊。他们的收入可能会让你震惊。

scale = 56
revenue = go.Figure()for diff in list(df[colName]):
    ## create sub dataframe containing the 16 federal states in Germany
    df_sub = df[df[colName] == diff]
    ## plot the bubbles on the map
    revenue.add_trace(go.Scattergeo(
        locationmode = 'geojson-id',
        lon = df_sub['longitude'],
        lat = df_sub['latitude'],
        name = df_sub['Unternehmen'].values[0],
        hovertemplate = "<b>{} </b><br><br>".format(df_sub['Unternehmen'].values[0]) +
                        "Rev. Difference: {}<br>".format(diff) +
                        "# Employees: {}<br>".format(df_sub["Mitarbeiter"].values[0]) ,
        marker = dict(
            ## scale the bubble size properly, to at least have a size of 5
            size = diff/scale if (diff/scale) > 6 else 7,
            line_color='rgb(40,40,40)',
            line_width=0.4,
            color = df_sub['color'],
            sizemode = 'area'
        )))## get the layout right
revenue.update_layout(
        #title_text = 'Revenue Difference [in Mio. €] from 2017 to 2018 of selected automotive suppliers',
        showlegend = True,

    geo = go.layout.Geo(
        resolution = 50,
        scope = 'europe',
        showframe = False,
        showcoastlines = True,
        landcolor = "rgb(229, 229, 229)",
        countrycolor = "white" ,
        coastlinecolor = "white",
        projection_type = 'mercator',
        ## limit our projection to Germany only
        lonaxis_range= [ 5.0, 15.0 ],
        lataxis_range= [ 47.0, 55.0 ],
        ## center the projection at Germany's center coordinates
        center = {"lat": 50.757958, "lon": 10.266271},
        domain = dict(x = [ 0, 1 ], y = [ 0, 1 ])
    )
)
## enable and disable all the configurations we do not want to display
config = dict({'scrollZoom':True, 
               'displayModeBar':False,
               'showLink':False, 
               'displaylogo': False,
               'editable': False})## Save Plot on plotly account
py.plot(revenue, filename = 'revenue difference map', auto_open=True, showLink=False, config=config)
revenue.show()## Also possible to save it as HTML and host it on github
#pio.write_html(revenue, file=’biggest firms.html’, auto_open=True)

现在我们已经有了一张所有 20 家公司的整洁地图,可以根据它们各自的公司名称进行过滤,如果有一条显示每家公司在记录年份的收入增长的线形曲线,那就太棒了。

要做到这一点,我们必须对我们的数据框架做一点小小的调整,将其变成不同的形状,我们将每家公司的记录年份作为 x 轴,将 2015 年至 2018 年的收入作为 y 轴。

这是在下面完成的,我们循环遍历每一家公司,并强迫它进入正确的形状。如果你是虐待狂,那么这个解决方案可能适合你,然而,聪明的人会找到更有效的方法来达到同样的结果。

cols = ['Unternehmen', 'Umsatz 2015 (in Mio. €)', 'Umsatz 2016 (in Mio. €)', 'Umsatz 2017 (in Mio. €)', 'Umsatz 2018 (in Mio. €)']
revenue_plot = df.loc[:, cols]
## extract all the years, cast it to int and reverse the list to get [2015, 2016, 2017, 2018]
years = [ int(ele[0]) for ele in list(filter(None, [ re.findall('\d+', string) for string in df.columns ]))][::-1]revenue_cruve = go.Figure()
for i in range(len(revenue_plot)):
    plot_df = pd.DataFrame(
        {'Company': [revenue_plot.iloc[i, 0] for j in range(len(years))],
         'Year': years,
         'Revenue': list(revenue_plot.loc[i, ["Umsatz 2015 (in Mio. €)", 'Umsatz 2016 (in Mio. €)', 'Umsatz 2017 (in Mio. €)', 'Umsatz 2018 (in Mio. €)']]) },
        columns = ['Company', 'Year', 'Revenue'])
    revenue_cruve.add_trace(go.Scatter(
                    x=plot_df['Year'],
                    y=plot_df['Revenue'],
                    name=plot_df['Company'][0],
                    text =  '<b>{}</b> <br>'.format(plot_df['Company'][0]) +
                            'Revenue {}: {} <br>'.format(plot_df['Year'][0], plot_df['Revenue'][0]) +
                            'Revenue {}: {} <br>'.format(plot_df['Year'][1], plot_df['Revenue'][1]) +
                            'Revenue {}: {} <br>'.format(plot_df['Year'][2], plot_df['Revenue'][2]) +
                            'Revenue {}: {}'.format(plot_df['Year'][3], plot_df['Revenue'][3])
    ))revenue_cruve.update_traces(mode="markers+lines",
                            hovertemplate = None                           )

revenue_cruve.update_layout(
    width = 1100,
    height = 800,
    legend_title='<b> Company </b>',

    yaxis=dict(
        title_text="Revenue in Mio. €",
        titlefont=dict(size=22),
    ),
    xaxis = dict(
        tickmode = 'linear',
        tick0 = years[0],
        dtick = 1)
)
config = dict({'scrollZoom':True, 
               'displayModeBar':False,
               'showLink':False, 
               'displaylogo': False,
               'editable': False})py.plot(revenue_cruve, filename='revenue firms curve', auto_open=True, config=config)
revenue_cruve.show()

现在,我们甚至有了每家公司的收入线曲线图,之后我们还可以进行筛选。这使得一切更容易分析,我们不必手动仔细检查每一行。正如你可能看到的,20 家公司会很快变得混乱不堪。减少混乱的另一个好方法是添加一个带有 Plotly 的下拉按钮来选择感兴趣的公司。不幸的是,我还没有这样做,但这是一个很好的实践,以培养我们刚刚学到的东西。

可视化方法对于在公司范围内共享信息也非常方便,例如在时事通讯中。每个员工只需简单浏览一下就能获得关键信息。

就是这样,我希望你今天学到了一些新东西,这篇文章不会太无聊。无论如何,如果你有一些建议或发现错误,请让我知道。该代码可在我的 github 账户中获得。

感谢阅读!

想象 Soundcloud.com 的非法毒品卖家

原文:https://towardsdatascience.com/visualizing-sellers-of-illicit-narcotics-on-soundcloud-com-5b3bb9331b4b?source=collection_archive---------52-----------------------

使用 Tableau 了解网上毒贩

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

介绍

许多网上药品销售发生在暗网市场——隐藏在暗网上销售非法商品的平台。然而,在 Instagram 和 Snapchat 等地方,这些商品的销售开始从暗网过渡到表面网。

这些卖家在网络上宣传他们的 Instagram 和 Snapchat 个人资料。这种情况发生在流行的在线音乐流媒体网站 Soundcloud 的评论区。下面是一个评论的截图,可识别的信息被编辑,广告大麻,可卡因和迷幻药。

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

图片来自声音云

可视化这些广告可以提供对这个市场如何运作、谁是主要参与者以及他们卖什么的洞察。

管道

为了可视化这些数据,开发了一个 python 框架的变体,它可以抓取 Soundcloud 评论,并从广告销售麻醉品的评论中提取 Snapchat 和 Instagram 帐户。最初的框架包括两个组件:一个 web scraper 和一个 account extractor。关于这个框架的文章可以在这里看到。

为了收集 Soundcloud.com 的评论,开发了一种网络刮刀。这个抓取器抓取给定歌曲的 Soundcloud 评论,并将用户、评论文本、歌曲名称和歌曲 url 存储在一个 csv 文件中。对于这些可视化,Soundcloud 上排名前三的歌曲是刮出来的:Playboi Carti 的@MEH,Baby Jesus 的 Find My Way,Lil Mosey 的 Blueberry Faygo。一共刮了 17048 条评论。

因为该帐户提取器组件仅收集 Snapchat 和 Instagram 帐户名称,所以需要开发用于不同可视化的新组件,以便提取所需的数据。

词云

为了使用广告非法麻醉品销售的评论中的文本创建单词云,开发了一个新的组件来提取评论,将评论的文本转换为向量,并将它们导出到包含单个单词列表的 csv。还提供了停用词列表,以消除可视化中的无用词。使用的停用词是:

“我”、“我”、“我的”、“我自己”、“我们”、“我们的”、“我们的”、“我们自己”、“你”、“你的”、“你的”、“你自己”、“你们自己”、“他”、“他”、“他的”、“自己”、“她”、“她的”、“她自己”、“它”、“它”、“它”、“它本身”、“他们”、“他们”、“他们的”、“他们的”、“他们的”、“他们的”、“自己的”、“自己”、“什么”、“哪个”、“谁”、“这个”、“那个”、“这些”、“那些”、" am “、“是”、“是”、“是”、“是”、“有”、“有”、“有”、“有”、“有”、“有”、“做”、“做了”、“做了”、“一个”、“安”、“这个”、“但是”、“如果”、“或者”、“因为”、“作为”、“直到” “上”、“下”、“进”、“出”、“上”、“关”、“过”、“下”、“再”、“进一步”、“然后”、“一次”、“这里”、“那里”、“当”、“哪里”、“为什么”、“如何”、“所有”、“任何”、“两者”、“每一个”、“几个”、“更多”、“大多数”、“其他”、“一些”、“这样”、“没有”、“也没有”、“只有”、“自己的”、“相同的”、“所以”、“比”、“太”、“非常”、” s “、” t "、“能”、“将”、“刚刚”、“唐”、“应该”、“现在”

重复评论的数量

为了直观显示非法麻醉品销售广告的重复评论数量,开发了一个新组件来提取评论并将评论文本存储在 csv 文件中。

总评论中的药品广告评论数

为了直观显示广告销售非法麻醉品的评论的百分比,开发了一个新的组件来识别广告销售非法麻醉品的评论,并将这些评论标上“是”字,将其他评论标上“否”字。

词云

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

Soundcloud.com 评论广告非法毒品的词云

上述单词云通过从被识别为非法麻醉品销售广告的评论中计数出 1977 个单词来可视化前 50 个单词。最常见的广告药物是大麻、可待因、四氢大麻酚汽化筒(称为“手推车”)、蘑菇、Xanax 和未知的处方药(“药丸”)。许多评论还提到了科罗拉多州和加利福尼亚州,暗示毒品,很可能是大麻,来自这些地方,或者至少广告上是这样说的。看起来,这些卖家中的许多人会小心翼翼地将药物邮寄给顾客。

重复评论的数量

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

通过计数过滤的非法麻醉品广告的 Soundcloud.com 评论计数> 2

上图显示了多次发布的评论,评论文本完全相同。该图表仅包括出现 1 次以上的注释。在 57 条不同的评论中,只有 5 条被评论了 10 次以上,17 条被评论了两次以上。这有助于识别市场中的潜在关键参与者。

总评论中的药品广告评论数

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

与其他评论相比,宣传非法麻醉品的 Soundcloud.com 评论的数量

从 Soundcloud.com 收集到的 17,048 条评论中,有 222 条是销售毒品的广告。这占所有评论的 1.3%,这意味着 Soundcloud 上每 100 条评论中就有 1 条以上为药物销售做广告。虽然这个数字看起来很低,但考虑到 Soundcloud 上的评论应该与毒品销售无关,这实际上是非常惊人的。

讨论

从 Soundcloud.com 的评论中寻找非法毒品的卖家似乎是一个很有前途的研究领域。这些评论相当普遍,有 1.3%的评论是关于三首为毒品销售做广告的歌曲。此外,这些评论集中在一些海报上,为谨慎运输做广告,并且通常为大麻、可待因、四氢大麻酚蒸发筒、蘑菇、Xanax 和未知处方药的销售做广告。

我将继续这项研究,并在下面发表更多文章。另外,你可以在下面找到我关于这个框架开发的文章。

  1. 识别 Soundcloud.com 的非法毒品卖家

使用 geojson 热图可视化空间数据

原文:https://towardsdatascience.com/visualizing-spatial-data-with-geojson-heatmaps-1fbe2063ab86?source=collection_archive---------22-----------------------

热图是一种很好的可视化方式,但在地图上绘制它们可能是一个挑战。了解如何使用 geojsoncountour 创建自定义 geojson 数据来创建身临其境的地图。

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

华沙房地产价格[兹罗提/平方米]

您是否曾经处理过空间数据,并面临过必须在过度拥挤的散点图或局限于行政边界(如地区)的等值线图之间做出选择的挑战?

作为一名房地产行业的数据科学家,我经常处理空间数据,但是,我一直在努力寻找可视化空间数据的最佳方式,以便能够轻松地从大型数据集中掌握关键的空间要素。

Plotly 或 Folium 提供的基本功能受到限制,所以我决定研究一下如何在地图上创建自定义热图,我想在本文中与您分享。从 2020 年 5 月起,我将致力于华沙超过 1 万个房地产报价的数据集,你可以通过下面的链接从我的 GitHub 下载。

GitHub 上有完整的代码和数据来源:https://GitHub . com/Jan-Majewski/Project _ Portfolio/blob/master/03 _ Real _ Estate _ pricing _ in _ Warsaw/03 _ 02 _ Data _ viz ualization . ipynb

对于交互式可视化,我推荐使用 nbviewer 链接:https://nb viewer . jupyter . org/github/Jan-Majewski/Project _ Portfolio/blob/c 770 f 21 DC 410 b 1495 DBD F5 b 9 F4 f 443 ECD 4d 986 ba/03 _ Real _ Estate _ pricing _ in _ Warsaw/03 _ 02 _ Data _ viz ualization . ipynb

1.介绍

使用的数据可以从 GitHub 下载

df = pd.read_excel(r"[https://raw.githubusercontent.com/Jan-Majewski/Project_Portfolio/master/03_Real_Estate_pricing_in_Warsaw/Warsaw_RE_data.xlsx](https://raw.githubusercontent.com/Jan-Majewski/Project_Portfolio/master/03_Real_Estate_pricing_in_Warsaw/Warsaw_RE_data.xlsx)")

由于数据的特性比这个项目所需的要多得多,所以让我们只选择关键的 8 列。

key_columns=['Id', 'Area', 'Price', 'latitude', 'longitude',
      'City','district']df**=**df[key_columns]df.head(10)

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

首先,让我们探索使用基本 Plotly 要素可视化空间数据的最常见方法。

1.1 .基本散点图框

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

地图上的散点图可能是可视化空间数据的最常见和最简单的方式。你得到坐标,设置一个特征为颜色,这就是你的地图。乍一看,它甚至看起来非常有效,但是如果你正在处理一个更大的数据集,它会变得过于拥挤,你实际上看不到下面的地图。

1.2 网格散点图框

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

我们可以通过舍入坐标并计算每个图块的平均值来创建网格,从而简化散布。它看起来更容易阅读,但我们也失去了很多细节。

格网图基于通过裁剪纬度和经度、创建纬度 _ 模式和经度 _ 模式要素以及对数据进行分组以创建测向图而汇总的数据。

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

2.使用 geojson 定制热图

由于对之前的结果不满意,我决定寻找基于等高线图创建热图的方法。

对我来说,最好的解决方案是一个 4 步过程:

  • 在 matplotlib 中创建等高线图
  • 使用 geojsoncountour 库将其转换为 geojson
  • 从 geojson 提取值到 df_contour
  • 使用 plotly 创建 choropleth 地图

2.1 用 matplotlib 计算我们的图

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

价格密度等值线图

我们得到了一个非常好的等高线图,现在我们需要做的就是把它转换成 geojson,这样它就可以和 plotly 兼容了。

警告!为等值线图选择边界时,请确保每个图层至少有一个数据点。如果最大值和最小值太宽或者步长太小,并且其中一个图层为空,则可能会使整个 geojson 在 plotly 中根本不出现。

2.2 .将等高线图转换为 geojson

要将等高线图转换为 geojson,您需要 geojsoncontour 库。

pip install geojsoncontour

2.3.创建 viz 之前的最后一步是将 geojson 的价格提取到 DataFrame 中

由于 plotly 需要一个数据帧,其中的值用于 geojson 中空间对象的填充颜色,我们需要通过迭代 geojson 字典中的“features”键来提取它们。该键包含一个字典列表,热图的每一层都有一个字典。该值作为“title”键存储在子字典的“properties”键中。让我们还将“id”键添加到列表中的每个字典,以将空间对象与数据帧行相匹配。

2.4 最终创建热图

现在我们有了创建一个漂亮的热图所需要的一切。我们来策划吧!

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

房地产价格密度的最终热图

我建议参考页面顶部的 nbviewer 链接,以探索缩放和深入研究最有趣的情节区域的全部可能性。

3.摘要

我希望本教程能帮助你使你的空间可视化更有效,更容易一目了然地抓住关键的洞察力。

这种类型的可视化适用于各种数据,其中空间要素是关键驱动因素之一。总结一下,享受一个类似的基于谷歌通勤数据的 viz。如果您对分析感兴趣,本文顶部引用的笔记本也使用 Google API 处理提取和处理驾驶时间数据。

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

华沙早晨通勤时间

用 Matplotlib 和熊猫可视化 2019-20 英超联赛赛季

原文:https://towardsdatascience.com/visualizing-the-2019-20-english-premier-league-season-with-matplotlib-and-pandas-fd491a07cfda?source=collection_archive---------26-----------------------

2019-20 英超联赛积分榜背后的统计数据是什么?

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

照片由 KAKUDMIUnsplash 上拍摄

当我们急切地等待 6 月 17 日英超联赛赛季的重新开始时,我们可以从这个 Kaggle 数据集来看看这个赛季迄今为止的故事。作为一名利物浦球迷,我希望本赛季在英超联赛时代第一次以冠军结束(在一个历史性的、破纪录的赛季中)。

在过去的一年里,利物浦以 25 分的领先优势高居榜首,只需要 6 分就能确保夺冠,统治了英格兰足坛。让我们看看相对于他们的预计总分,他们的表现如何。首先,我们将导入可视化所需的包:

# Import packages
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patheffects as pe
import pandas as pd
import numpy as np

稍后,我们将使用matplotlib.patheffects包来进行文本注释(来标记单个数据点)。

导入团队数据

从 Kaggle 下载数据集后,我们将有两个数据文件:

  1. epl2020.csv —包含特定团队的数据,如进球、失球、成绩、积分等。
  2. players_1920.csv —包含特定球员的数据,包括个人进球、卡牌、助攻、扑救等。

我们的第一个可视化是查看表格中每个团队的实际积分值与他们的预期总积分(基于基于他们表现的预测)的比较。为此,我们将使用epl2020.csv中的团队级数据。

# Load team data
filename = './epl2020.csv'
data_epl = pd.read_csv(filename)

现在,让我们看看我们可以访问该文件中的哪些数据:

data_epl.columns>>> Index(['Unnamed: 0', 'h_a', 'xG', 'xGA', 'npxG', 'npxGA', 'deep', 'deep_allowed', 'scored', 'missed', 'xpts', 'result', 'date', 'wins', 'draws', 'loses', 'pts', 'npxGD', 'teamId', 'ppda_cal', 'allowed_ppda', 'matchtime', 'tot_points', 'round', 'tot_goal', 'tot_con', 'Referee.x', 'HS.x', 'HST.x', 'HF.x', 'HC.x', 'HY.x', 'HR.x', 'AS.x', 'AST.x', 'AF.x', 'AC.x', 'AY.x', 'AR.x', 'B365H.x', 'B365D.x', 'B365A.x', 'HtrgPerc', 'AtrgPerc', 'matchDay'], dtype='object')

那可是好多列啊!但是为了比较实际分数和预期分数,我们只需要其中的两列:xptspts

积分总计

由于我们加载的数据集包含每场比赛的结果,球队名称将在teamId列中重复多次,因此我们将所有唯一的球队名称收集到一个列表中:

# Get unique team names
teams = data_epl.teamId.unique()

现在,使用我们的独特团队列表,我们可以通过对数据帧中对应于特定团队的列求和来计算实际和预期的总积分。我们的做法如下:

# Get the actual and expected points for each team
actual_pts = {}
expected_pts = {}for team in teams:
  actual_pts[team] = data_epl[data_epl['teamId'] == team].pts.sum()
  expected_pts[team] = data_epl[data_epl['teamId'] == team].xpts.sum()

在上面的代码片段中,我们已经使用 Python 字典为预期和实际总点数创建了一个查找表,所以现在我们可以直接使用这些数据结构,以及我们的唯一团队名称列表(teams)来绘制我们的总点数。

我们要做的最后一件事是对数据进行数字排序——在这种情况下,我们要根据实际总点数和预期总点数之间的差异进行排序。这样做的目的是将我们的数据集分成超额完成(即比预期多的分数)和未完成的团队。为此,我们创建了一个名为pts_difference的新字典,并使用这些值对我们的团队列表进行排序。

pts_difference = {team: actual_pts[team] - expected_pts[team] for team in teams}
sorted_teams = sorted(pts_difference.keys(), key=pts_difference.get)

现在我们有了数据,我们可以创建我们的可视化。首先,我们将编辑一些总体绘图参数:

# Plot parameters
mpl.rcParams['font.family'] = 'Avenir'
mpl.rcParams['font.size'] = 16mpl.rcParams['axes.linewidth'] = 0
mpl.rcParams['axes.facecolor'] = '#ededed'mpl.rcParams['xtick.major.size'] = 0
mpl.rcParams['xtick.major.pad'] = 10
mpl.rcParams['ytick.major.size'] = 0
mpl.rcParams['ytick.major.pad'] = 10

现在我们可以开始拼凑我们的情节了。首先,我们想区分超水平团队和低水平团队。为此,我将使用一个名为PuOr的内置色图,并获得两种极端的颜色来对应超额完成(橙色)和未完成(紫色)。

# Create figure
fig = plt.figure(figsize=(8,6))
ax = fig.add_axes([0, 0, 1, 1])# Get colors
colors = plt.get_cmap('PuOr', 2)

现在,我们可以绘制我们的数据。为此,我将使用一个计数器变量yval来对应垂直方向上团队条目之间的间距。该变量将在循环的每次迭代中递增。在循环过程中,我们首先根据实际和预期总点数之间的差异检查使用哪种颜色。一旦我们做到这一点,我们将实际的总点数绘制成实心圆,将预期的总点数绘制成空心圆,然后用虚线将两者连接起来。

由于我们绘制数据的方式,很难使用内置的matplotlib图例函数。我们将使用插图自己创建一个。在这种情况下,我只是绘制一个填充和未填充的圆,并标记它们。我们通过用fig.add_axes([x, y, width, height])创建 axes 对象来指定图例的大小,其中(x, y)是左下角。

最后,我们可以更新记号和标签以对应每个团队:

# Add grid
ax.grid(color='white', linewidth=2)# Points labels
ax.set_xticks(np.arange(0, 110, 10))# Team labels
ax.set_yticks(np.arange(0, len(sorted_teams), 1))
ax.set_yticklabels(sorted_teams)# Set axis limits
ax.set_xlim(0, 100)# Set axis labels
ax.set_xlabel('Points')

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

纯粹基于对预期积分的预测,利物浦本赛季似乎明显超额完成了任务。事实上,如果利物浦和曼城都按照他们的预测比赛,利物浦实际上会在积分榜上排名第二!这是一个很好的例子,说明了在足球场上,不管有多少统计数据,结果最终是如何决定的。

评分和创意

对于这些可视化,我们将使用来自第二个数据文件的特定于玩家的数据:

# Load player data
filename_players = './players_1920.csv'
data_pl = pd.read_csv(filename_players)

正如我们对团队数据所做的那样,让我们看看数据框中所有可用的列:

data_pl.columns>>> Index(['Unnamed: 0', 'assists', 'bonus', 'bps', 'clean_sheets', 'creativity', 'element', 'fixture', 'goals_conceded', 'goals_scored', 'ict_index', 'influence', 'kickoff_time', 'minutes', 'opponent_team', 'own_goals', 'penalties_missed', 'penalties_saved', 'red_cards', 'round', 'saves', 'selected', 'team_a_score', 'team_h_score', 'threat', 'total_points', 'transfers_balance', 'transfers_in', 'transfers_out', 'value', 'was_home', 'yellow_cards', 'full', 'team'], dtype='object')

就像我们为团队所做的一样,让我们将独特的玩家名字收集到一个列表中。玩家的名字可以在标签为full的栏中找到。

players = data_pl.full.unique()

在这组图像中,我们感兴趣的是球员的得分和创造力,所以我们将统计他们的进球和助攻数。由于单纯的进球和助攻数据显然会对那些没有踢过那么多比赛的球员产生偏见,我们希望每 90 分钟对这些数据进行标准化。唯一的问题是,当一名球员只打了很少几场比赛时,这个平均值就会上升——因此,为了考虑这种影响,我们将确保我们名单中的每名合格球员都至少打了 10 场比赛(900 分钟)。

像我们的团队数据一样,我们正在用每 90 分钟的平均值填充两个字典,player_assistsplayer_goals,只有出场超过 900 分钟的球员才被计算在内。

现在,我们需要从高到低对球员进行排序——字典本质上不包含任何排序信息,因此我们可以创建一个正确排序的球员姓名列表。在这种情况下,我们希望收集前 20 名进球者和助攻者。

top_players_goals = sorted(player_goals.keys(), key=player_goals.get, reverse=True)[:20]top_players_assists = sorted(player_assists.keys(), key=player_assists.get, reverse=True)[:20]

在上面的代码片段中,我们使用通过调用player_goals.get获得的值对字典的键(球员名字)进行排序。我们必须使用reverse=True,因为我们希望统计数据从最高到最低排序。最后,我们只将列表中的前 20 个元素作为我们的前 20 名玩家。

在我们绘图之前,我想创建一个名为updated_names的字典,它包含格式为“First Initial”的更短形式的玩家名字。姓氏”,所以“Sadio Mané”变成了“S. Mané”。此外,数据集不处理重音字符,因此我必须手动更改名称来解决这个问题。

现在我们可以绘制数据了!

首先,我们可以收集每个团队的团队颜色作为分散点的颜色——我从这个网站获得了每个团队颜色的十六进制代码。

为了看到这些颜色,我们可以为每个团队绘制一个色板图。我们首先创建一个图形,遍历每个独特的团队,并创建一个填充的多边形。然后我们增加一个计数器变量y_val,它向上移动下一个颜色样本。我们还对团队名称进行了排序,以便它们按字母顺序出现:

axes.fill_between(x, y1, y2)x是要绘制的 x 值数组,y1是底部的 y 值,y2是顶部的 y 值。

现在,我们要删除 x 记号,将 y 记号改为按字母顺序排列的团队名称:

# Remove x-ticks
ax.set_xticks([])# Set y-ticks to team names
ax.set_yticks(np.arange(0.5, 20, 1))
ax.set_yticklabels(sorted(teams, reverse=True))

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

所以现在我们有了正确的球队颜色,我们可以回去绘制每 90 分钟的进球和助攻的图表。我们将首先使用以下代码片段绘制前 20 名进球得分者的数据:

我们找到前 20 名中每个球员的球队,并用各自的球队颜色画出一个点。然后,我们通过将 x 值偏移 0.01,将玩家的名字放在该点旁边。最后,为了提高可读性,函数text.set_path_effects()允许我们在每个名字周围放置一个粗的白色轮廓(前景色为w或白色,linewidth为 5)。

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

我们看到沙治·奥阿古路是一个多产的得分手,每 90 分钟得分超过一次,而他的曼城队友里亚德·马赫雷斯,虽然也是前 20 名得分手,但每 90 分钟的助攻数也明显高于其他人。

我们可以用下面的代码对 90 后前 20 名助教做同样的练习:

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

我们看到每 90 分钟的三名顶级助攻手都是曼城球员——里亚德·马赫雷斯、凯文·德·布鲁恩和戴维·席尔瓦。从前两个情节来看,曼城在球场上并不缺乏创造力。实际上,我们可以通过查看数据集中的creativity指标来对此进行量化。与前两个例子类似,我们可以从所有玩家数据中收集所有创造力的总和:

现在,我们可以使用下面的代码来绘制创造力值。我们使用ax.barh(y, length)来创建一个水平条形图——y的值是横条的垂直位置,length是特定横条的长度。

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

从助攻数据来看,曼城无疑拥有最高的创造力指数。这似乎表明(并且可以通过观看他们的比赛来证实)曼城的防守是薄弱环节,也是他们迄今为止总得分不足的原因。

守门员

让我们看看守门员的表现——我们将创建对应于扑救和不失球的字典,并按照每 90 分钟的扑救次数进行排序(同样,我们仅限于踢了 900 分钟或更长时间的球员)。我们采用前 22 个条目,因为通过检查,在这一点之后,我们开始在我们的列表中获得外场球员:

我们这次的绘图将在 x 轴上显示干净的纸张,在 y 轴上显示每 90 分钟节省的纸张。我们使用下面的代码片段,它与我们之前在目标和辅助图中使用的代码片段非常相似:

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

平衡良好的球队往往会把他们的 GKs 放在这个图的右下象限——他们的防守足够稳健,他们的守门员不必面对大量的射门,所以他们不必做出太多的扑救,可以保持不失球。毫不奇怪,积分榜前三名的球队都有自己的守门员——艾利森·贝克尔(利物浦)、埃德森·莫赖斯(曼城)和卡斯帕·舒梅切尔(莱斯特)。在另一个极端,乌戈·洛里斯(托特纳姆)被迫做出名单上任何门将中最多的 90 次扑救,这也意味着最少的不失球。这表明他没有从他的防守线上得到太多的帮助,而是被迫承受许多对手进攻的冲击。

结束语

我希望这篇文章是有帮助的,试图可视化数据,以了解更多关于正在进行的英超联赛赛季的故事,而不仅仅是联赛排名。这篇文章的所有分析都可以在这个 Github 仓库中找到。

感谢您的阅读!我感谢任何反馈,你可以在推特上找到我,并在 LinkedIn 上与我联系以获得更多更新和文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值