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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

去学数据科学?让我们试试。

原文:https://towardsdatascience.com/go-for-data-science-lets-try-46850b12a189?source=collection_archive---------14-----------------------

谷歌的 Golang 能搞定数据科学吗?让我们找出答案。

*数据科学能从静态类型、编译的编程语言中受益吗?*这就是我们将在本文中探讨的。

Go 或 Golang 是一种非常类似于 C 的编程语言,但是提供了内存安全、垃圾收集和结构化类型。它是由谷歌在 2007 年设计的,目的是在多核、联网机器和大型代码库的时代提高生产力。

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

图片来源:维基共享资源

作者注: 我不是围棋编程语言方面的专家。下面你将阅读一篇观点文章,展示该语言处理数据的选项。欢迎在评论区发表你的想法。

但是我们作为数据科学家为什么要关心围棋呢?

我很高兴你问了。大多数开发人员对 Python 有一种爱恨交加的关系,其中“爱”的部分来自于它易于学习和编写,“恨”的部分来自于它非常慢并且是动态类型的。

因此,Go 可能是解决 Python 问题的语言之一。

本文的目的不是向您展示如何在您的机器上安装和配置 Go,而是向您展示 Go 如何处理数据读取数据操作,因此您可以将它与您选择的语言进行比较,看看它是否值得进一步探索。

目标读者是任何对 Python/R 有足够经验的人。我所说的“足够经验”是指你知道如何编写代码,并且你能够看到这两种语言的缺点。

这篇文章的结构如下:

  1. 设置和导入
  2. 读入 CSV 数据
  3. 数据帧
  4. 数据过滤
  5. 结论

是的,完整的代码可以在这里找到。事不宜迟,我们开始吧!

设置和导入

首先,我们将做一些必要的事情:声明一个包,导入一些库,并声明 main 函数。

与 Python 相比,这有点像样板文件,而且所有要执行的代码都必须在main函数中。请随意考虑这是赞成还是反对。

在我们开始学习与数据科学相关的东西之前,我们的 main.go 文件应该是这样的:

这就是开始前需要的所有样板文件。在下一节中,我们将下载并读入 CSV 数据,在接下来的一节中,我们将把它转换成 DataFrame 对象,这样就可以很容易地操作它。

读入 CSV 数据

没有数据就没有数据科学。因此,任何打算用于数据科学的编程语言都必须具有数据读取和处理能力。

有了 Go,我们可以使用 OS 模块读入逗号分隔的数据。为了演示,我们将使用著名的虹膜数据集,代表来自各种花卉物种的数据。

要读取 CSV,我们可以使用以下代码片段:

例如,如果找不到文件,os.Open命令会导致错误。这就是为什么以某种方式处理这个错误是个好主意。但是如果您现在将这个irisCsv打印到控制台,您将不会得到您所期望的结果:

&{0xc000088780}

我们将在 net 部分解决这个问题,在那里文件将被转换成数据帧。

数据帧

如果您曾经使用 Python 或 R 进行过数据科学方面的工作,那么您肯定对数据帧的概念很熟悉。为了执行任何与数据相关的工作,我们需要将 CSV 转换成 DataFrame 格式。在这样做之前,我们需要安装dataframe库:

go get github.com/kniren/gota/dataframe

现在我们可以很容易地将它包含到我们的导入中——只需将所有内容放在 imports 部分的go get之后。从这一点来看,将irisCsv转换成数据帧的过程再简单不过了:

df := dataframe.ReadCSV(irisCsv)

如果您现在将它打印到控制台上,您会看到类似这样的内容:

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

挺酷的吧?

在下一节中,我们将探索如何实际处理这些数据——如何过滤数据、选择子集等等

数据过滤

现在,这是你一直在等待的部分。对你们大多数人来说,这一部分可能是成功或失败的时刻。如果 Go 能够很好地处理数据操作,考虑到它对 Python 的所有非数据科学相关的东西,它可能值得进一步探索。

事不宜迟,让我们看看如何打印出数据帧的前几行**——与 Python 和 Pandas 的head()相同。**

执行此代码将导致以下结果:

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

结果显然与使用 Python 获得的结果相同,但是 Python 在这里是明显的赢家,至少在开发的便利性和速度方面是如此。

接下来,我们将深入研究过滤

假设您只对 virginica 物种感兴趣,并希望将它们存储到特定的变量中。你可以这样做:

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

现在,这比 Python 中的输入要多得多,但是你不能否认代码不干净和不言自明。要是没有这么多打字要做就好了。

同样,您可以过滤掉其他操作符。这里我们选择过滤掉所有sepal.length等于或小于 7:

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

太好了。对于最后一个示例,让我们看看如何选择感兴趣的列:

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

此外,如果你问我,我会说这不是最干净的解决方案,但是这更多的是与 Go 语法有关,而不是 Go 处理数据的能力。这实际上可能对你有好处,取决于你习惯哪种类型的语法。

这篇文章到此为止,让我们在下一部分给出结论和一些结束语。

结论

老实说,我还没有像探索 Python 那样深入地探索过 Go 编程语言。然而,我们仍然做了一些有益的工作。

以下是我最后的想法:

  • *在熟悉数据和/或设计解决方案原型时,我会使用 Go 吗?*绝对不是——它只是没有考虑探索性数据分析。
  • *我会翻译最终的 Python 解决方案来获得更好的性能吗?*也许。

我说的“可能”是指收益大于成本,收益是速度的提高,成本是进行转换所需的时间。是的,Python 比 Go 慢,但是在某些情况下,你可能不会从额外的速度中获益太多。

你用过 Go 做数据科学吗?或者其他不是 Python,R,或者 Julia 的语言?请在下面的评论中告诉我。

感谢阅读。

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

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

参考

[1]https://en . Wikipedia . org/wiki/Go _(programming _ language)

力量 BI 101 去,得到他们,夏洛克!像专家一样在 Power BI 中进行数据分析

原文:https://towardsdatascience.com/go-getem-sherlock-doing-data-profiling-in-power-bi-like-a-pro-44f448730e6c?source=collection_archive---------44-----------------------

成为一名“数据侦探”听起来对你没有吸引力?检查为什么你应该重新考虑你的立场

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

克莱门特·尼维斯关于 Pexels.com 的照片

你喜欢阅读犯罪故事吗?就我个人而言,我崇拜他们。而且,当我年轻的时候,我非常崇拜夏洛克·福尔摩斯和赫丘里·波罗,以至于我长大后想成为像他们一样的人:)

这两个角色最适合演什么?他们可以准确无误地剖析人们,基于这种剖析收集事实,所以最后,一切看起来如此简单和明显——就像任何人都可以做到那样!

老实说,我的侦探技能甚至不足以在那份“工作”中取得成功。但是,我决定分析数据,而不是分析人…

什么是数据分析?

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

柯克·赖在 Unsplash.com 拍摄的照片

根据 Ralph Kimball 的说法,数据剖析是对数据源内容的系统的预先分析。这句话中有多个关键词,但我们只关注其中的几个:

  • 在开始使用数据之前,你必须了解你的数据
  • 您必须检查数据的所有方面,从检查内存占用和基数到复杂的业务规则(系统性的)
  • 您应该对源数据执行数据剖析——在数据仓库领域有一句名言:垃圾进,垃圾出!简而言之,如果您的数据本身质量不好,您就不能指望您的报告能显示准确的数字

有多种类型的数据分析技术:

  1. 完整性 —我的列中有多少空白/空值?
  2. 唯一性 —我的列中有多少个唯一值(基数)?我有副本吗?允许有重复吗?
  3. 值分布 —记录在特定属性的不同值之间的分布
  4. 范围 —查找列内的最小值、最大值、平均值

为什么我需要数据分析?

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

Andrea Piacquadio 在 Pexels.com 的照片

执行数据分析的主要好处是提高数据的质量。这样,例如,您可以发现电话号码列中是否有字母,或者邮政编码是否与预期模式不匹配。

此外,您还可以捕捉数据中是否出现了异常值。简单地想象一下,您有一个包含不同水果的单独价格的列——假设它的范围在 1 到 1000 之间。但是,突然之间,您注意到 1.000.000 的值(有人犯了一个错误,或者其他什么原因)。现在,假设您的报告显示了水果的平均价格!我打赌你不会想到苹果、桔子或香蕉的平均价格只有几千美元:)

了解您的数据

最后,在将数据呈现在用户面前之前,你应该了解这些数据。因为,根据数据分布和列的其他特征,您可以更容易地决定使用哪些可视化,或者是否有必要应用一些额外的步骤来进行数据清理或数据转换。

研究数据的细微差别并发现底层结构中的异常,可以使您的报告更出色,同时也更准确。

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

照片由 Unsplash.com 的 Edo Nugroho 拍摄

利用 Power BI 进行数据分析

我最喜欢 Power BI 的一点是,它为您提供了一种可能性,不仅可以创建吸引人的可视化效果,还可以在此之前塑造您的数据。

也就是说,当涉及到数据分析时,Power BI 可以提供很多功能。更重要的是,它使您能够以非常用户友好的方式执行数据分析,因为它有一些内置的功能,可以使您的“数据夏洛克”工作更加容易。

我将与您分享一些我在日常工作中应用的关于数据分析的技巧。

我喜欢做的第一件事是在 Power BI Desktop 的 model 选项卡中打开数据模型:

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

这样,我就熟悉了这些表,我可以识别关键列、表之间的关系、关系类型(1:1,1:M;活动/不活动)等。这让我对数据模型有了一个很好的了解,所以我可以在以后专注于具体的事情。

下一步是打开 Power Query 编辑器,大部分数据分析都在这里进行。那么,让我们来看看它是如何做到的:

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

在“视图”选项卡下,打开“列分布”、“列配置”和“列质量”选项。一旦您选择了一个特定的列,您应该能够看到您的数据分析。更重要的是,它以一种很好的、人类可读的方式显示,因此您可以快速获得底层数据的详细概述!

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

这样,Power BI(或者更准确地说,Power Query)可以帮助您发现数据中的异常值、异常或任何其他意外的“行为”。

现在让我们来看看所有这些视觉效果显示了什么:

  • 列质量 显示有效数据与错误数据及空数据的百分比。在一个完美的世界里,100%的数据都是有效的,但是现实中很难做到
  • 列分布 显示列内的数据分布,同时也显示不同的和唯一的值的数量。这两者是不一样的:不同的值包括重复值和空值,而唯一值不包括。因此,非重复值是总数,而唯一值则表示这些值中有多少不是重复值或空值。
  • 列概要 显示列的更深入的概述,包括行数,以及在特定列中导入数据时是否有错误。您还可以检查空行的数量,与列中的最小值和最大值相同。这在您分析一个数字列时特别有用,因为您可以快速发现任何可能的异常值(请回忆一下我们之前关于水果价格的例子)

此外,当应用于数字列时,列统计信息还将包括零和 NULLs 的数量,以及一些统计函数,如平均值、标准偏差和偶数与奇数之间的分布。

拥有所有这些统计信息可以帮助您理解数据分布,并在您决定额外转换或清理数据时为您提供支持。

结论

现代数据仓库面临的最大挑战之一是实现最高水平的数据质量。这条道路上的第一步(也是最重要的一步)是数据概要分析。

回到我们开始的地方——夏洛克·福尔摩斯和赫丘里·波罗——因为他们能够在调查过程中发现细微的差别并识别出一些不寻常的行为(异常值),这最终为他们带来了成功!

总结:花点时间成为“夏洛克”或“波洛”,然后再将注意力转移到在报告中构建漂亮的视觉效果上。

感谢阅读!

成为会员,阅读 Medium 上的每一个故事!

订阅此处获取更多有见地的数据文章!

基于 AdaBoost、随机森林和 XGBoost 的时间序列预测

原文:https://towardsdatascience.com/go-highly-accurate-or-go-home-61828afb0b13?source=collection_archive---------8-----------------------

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

照片由杰米街Unsplash

我们能从不能给我们很好预测结果的数据科学项目中学到什么

编辑:这篇文章之前的标题是“去高度精确还是回家?”

kaggle 上浏览笔记本,或者阅读那些数据科学项目的故事,在这些故事中,人们获得了高度准确的结果,完美地解决了潜在的业务问题,这对于数据科学领域的初学者来说可能会非常沮丧,因为他们在自己的项目中可能达不到这样的结果。但是这些闪亮的笔记本和博客帖子实际上并没有讲述事情的全部。

获得好的结果实际上意味着大量的工作。除非您一开始就有一个非常全面的数据集,否则您将需要运行多个周期来研究、添加和探索数据、设计和选择要素、转换要素以及运行和调整模型。即使经过多次尝试,您的模型可能仍然表现平平。那么该不该放弃这个项目,以“浪费时间”来归档呢?

绝对不行!

在下面的段落中,我想分享我自己在一个具有挑战性的项目中的工作经历,这让我学到了关于数据科学的宝贵经验。

TL;博士:

  • 不要期望马上得到很好的预测结果
  • 时间序列预测是非常困难的,通常情况下,简单的模型或传统的统计方法会比先进的机器学习模型产生更好的结果
  • 超参数调整不会将坏的或不相关的数据变成很好的预测;回到你正在使用的功能,试着理解哪些应该删除、重新设计、改造或添加
  • 理解你为什么使用某些算法;将它们与其他人进行对比,并能够解释它们的优缺点
  • 使用一个简单的基线模型来比较你的结果
  • 从黑客到理解

该项目

该项目的目的是使用来自 Capital Bikeshare 的数据预测美国 DC 大都会地区的自行车共享需求。有一整套研究只是处理这样一个问题,即如何知道人们何时想在一个城市的某个位置租一辆自行车,以避免车站自行车供应过剩和短缺。我希望通过专注于基于树的集成算法(AdaBoost、random forests 和 XGBoost)之间的比较来解决需求预测问题,并避免我在 kaggle 和其他地方发现的自行车共享预测的许多实现中普遍存在的前瞻偏差。因此,我预测了整个城市第二天的自行车共享客户数量。

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

图片由 Pablo Valerio 拍摄,来自 Pixabay

你可以在我的 GitHub 上找到这个项目的实现。我使用了 Capital Bikeshare 的自行车共享数据、NOAA 国家气候数据中心的历史天气数据和 DC 人力资源部的信息。自行车共享数据的范围从 2011 年 1 月 1 日到 2018 年 12 月 31 日,是一个提供日常自行车需求的连续时间序列。合并数据集后,保留了一个日期特征、十九个分类特征(假日和天气类型特征)和六个数字特征(平均值、最小值、最大值、观测温度、风速和降雨量)以及目标变量(t0 时的客户数量)。

我将简要概述我的 EDA 的部分内容(通过对自行车共享研究的全面文献综述了解),建模和评估方法,然后回顾这个项目教给我的经验教训,我希望将这些经验教训传递下去。

探索性数据分析

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

显示目标随季节分布的箱线图

根据季节绘制的目标分布图显示,租赁自行车的人数与一年中的时间有明显的联系。在春天,当与夏天和秋天相比相当寒冷时,自行车共享需求将会降低。

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

显示数值天气特征和目标之间的皮尔逊相关系数的热图

相关系数表明,最低温度与目标温度、最高温度与目标温度之间存在较强的相关性。我决定同时使用这两个特性。风速和降雨量与目标只有微弱的相关性,但是,我想保留这些特征,因为它们可能对模型仍然有用(特别是考虑到皮尔逊相关性仅显示线性关系)。为了避免前瞻偏差,即使用只有在未来才可用的数据来预测未来的数据,我使用了滞后的天气数据。我为过去 8 天的天气趋势的平均值和标准差设计了新的特征。用不同的时间滞后运行我的模型显示,8 天产生了最好的结果。我还将 t-1 时的最高温度编码为一个分类变量,表示一天是非常冷、冷、凉、暖还是热。

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

根据天气类型显示目标分布的箱线图

我没有使用原始数据集中包含的 18 种不同的天气类型,而是根据目标变量的相似分布将它们组合成 4 个分类变量。我还设计了这些变量的 8 天滞后的均值和标准差。

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

显示目标在不同工作日的分布的箱线图

工作日实际上似乎对顾客数量没有太大影响。然而,基于树的集成模型应该能够很好地处理有噪声的数据,所以我保留了这些特征,并在删除它们之后再次运行我的模型来比较结果。

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

目标的部分自相关图

因为我使用的是时间序列数据,所以目标值也可以设计成特性,实际上也应该如此!从偏相关图中我们可以看出,昨天的客户数量与今天的客户数量有很强的相关性。我添加了 t-1 的客户数量作为一个特征,还添加了过去 8 天的平均值和标准差。

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

总客户目标变量的时间序列

在进行时间序列预测时,统计学告诉我们,我们需要确保我们的数据是平稳的,才能得到准确的结果,这意味着需要去除任何季节性或非季节性的趋势。我使用了 ADFKPSS 测试来发现目标不是静止的。我比较了预测非平稳和平稳目标变量的模型的性能,以了解非平稳性对预测结果的影响。

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

模型中使用的最终特征以及应用于它们的转换

我总共使用了 25 个特征来预测需求。

建模

与其他机器学习算法相比,基于树的集成模型具有多重优势:易于理解;他们的成绩比底层的弱学习者要好;它们没有正态分布假设,可以处理混合数据类型;它们对过拟合、离群值、噪声、多重共线性和输入缩放具有很强的鲁棒性(更多详情,请查看本文本文);与支持向量机或神经网络等最大似然算法相比,它们在计算上相对便宜。因此,我使用 AdaBoost、random forests 和 XGBoost 来预测自行车共享需求,并确定这三个模型中的哪一个最适合这种类型的数据集。作为性能基准,我使用了最后一个值方法,该方法预测明天的需求(t0)将与今天的需求(t-1)相同。

关于实现和调整的超参数的更多细节,你可以参考我的 Jupyter 笔记本中的代码。

估价

在我的评估中,我根据曾等人(2016) 使用的方法使用了三种不同的指标:平均误差(MAE)、均方根误差(RMSE)和均方根对数误差(RMSLE)。MAE 显示的是预测值与真实值的平均偏差,而 RMSE 则对偏差进行平方,对较大偏差的惩罚比对较小偏差的惩罚更重。RMSLE 对低估的惩罚比对高估的更重。这使得自行车共享需求成为一个有趣的指标,因为你通常希望在共享站有更多而不是更少的自行车供人们租赁。

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

自行车共享需求预测汇总结果

查看这些结果并将高级 ML 算法与基准和目标值范围进行比较,所有三个模型都表现得相当好。原始基线模型甚至优于 MAE 上的所有调优模型。此外,这些模型在预测中平均每天偏离 1500 人。考虑到在分析的整个 8 年期间,平均每天只有 7,726 个客户,这些预测性能并不太好。

那么,我们如何解释这种表现,我们又能从中学到什么呢?

**时间序列预测与前瞻偏差:**预测时间序列很难,因为有很多因素可以影响明天的价值。此外,你需要更多的统计背景知识,以避免陷阱。最重要的是,要有一个有意义的模型,你需要避免前瞻偏见。在我的模型中,我使用了滞后的天气数据来解释前瞻偏差。然而,由于天气多变,趋势数据可能没那么有用。使用天气报告/预报数据来预测需求可能更好。但由于这些信息很难获得,尤其是过去较长时期的信息,所以我决定使用历史天气数据。

除了这方面的前瞻偏差,我们还需要确保我们不会引入随机性。时间序列需要连续有序。我们不能将数据随机分成训练集和测试集。相反,我们应该使用时间序列片段来避免我们用在预测时无法知道的信息来预测目标。此外,当使用 bagging 或 bootstrapping 算法时,如随机森林和 XGBoost,确保您实际上不引导,因为这将再次在我们的预测中引入随机性和前瞻偏差(默认情况下, XGBoost 不引导,而 r 和随机森林引导)。前瞻偏差是你在 kaggle 上看到的类似项目的其他实现实际上产生更好结果的原因:在训练和测试期间,它们表现得更好,而在现实生活中,它们实际上可能会失败。

统计以及如何知道它们什么时候重要:即使不使用传统的统计方法来做时间序列预测,仍然需要很好地理解一个时间序列所附带的底层统计假设。在不了解自相关的情况下,您会查看目标值的偏相关来确定这是一个很好的工程特性吗?如果没有意识到平稳性,您会转换您的数字特征和目标变量来解释季节性和非季节性趋势吗?因为我以前没有做过时间序列预测,不确定平稳性的影响,我简单地用运行了所有预测平稳非平稳目标的模型,并对它们进行了比较。我发现只有 AdaBoost 在处理静态数据时表现稍好。因此,当趋势仍然包括在目标中时,ML 算法似乎不容易不准确。但在未来,如果我不确定结果会是什么,我会尝试两种选择。

**简单基线模型:**与 3 ML 算法相比,最后一个值方法的性能并没有差很多。这怎么可能呢?如上图所示,今天和昨天的目标值高度相关。因此,如果我使用一个模型,简单地从昨天的值来预测今天的目标,那么它会表现得相当好。这表明,即使你有一个考虑到各种特征的花哨的多元 ML 模型,你实际上也不一定能够胜过非常简单的基线模型或更传统的统计模型,如 ARIMA 。特别是在时间序列预测中,越复杂并不总是越好。

**反复试验:**不仅超参数调整对提高性能很重要。如果您有坏的或不相关的特征,调整不会保存您的模型。特征选择和工程对改进欠拟合模型至关重要。当比较工作日特征的包含和移除时,查看 AdaBoost 的性能,其显示了良好特征选择的重要性以及该算法对噪声数据的明显弱点。AdaBoost 是唯一一种在去除工作日特征后有所改进的算法。功能选择和工程是一个漫长的试错过程。但是,用不同的特征来测试你的模型,以确定哪些特征实际上有助于你的预测,哪些特征不利于你的预测,这一点很重要。识别其他有用数据集和要素的研究部分至少与调整超参数一样重要。

**理解 ML 算法:**不要因为你在 kaggle 上看到很多人在做 XGBoost 就去实现它。思考不同算法的优缺点,通读介绍这些算法及其伪代码的实际科学论文,并相互比较。通过这个项目和实际阅读分别介绍 AdaBoost、random forests 和 XGBoost 的论文,我实际上理解了如何对比这些基于树的集成算法。只有这样,你才能更好地理解为什么某些算法可能比其他算法执行得更好。在我的例子中,XGBoost 很可能表现得更好,因为它增加了正则化超参数,避免了过度拟合。虽然随机森林通过使用 bagging/bootstrapping 训练样本来减少过拟合,但这对于我们想要避免随机性的时间序列数据没有帮助。

**理解性能指标:**结合使用 MAE、RSME 和 RMSLE 可以让你知道你的模型可能有哪些弱点。因为最后一个值方法的 MAE 较低,但是 RMSE 和 RMSLE 高于任何调整的 ML 模型,这表明 ML 模型更经常适度地过度预测目标,而最后一个值方法更严重地低估。尤其是具有最低 RMSLE 的随机森林,过度预测的频率高于不足预测的频率。这对于需求预测模型来说可能是更好的,因为在车站有更多的自行车可供出租比更少的自行车更好。

结论

XGBoost 是三种基于树的集成算法中性能最好的模型,并且对过拟合和噪声更加鲁棒。它还允许我们忽略这个特定数据集中的平稳性。但是,成效还是不大。为了获得更好的自行车共享需求预测结果,需要在特征选择和工程上花费更多的时间。因为模型不适合,很可能需要包括不同的和/或更多的特征。但是,更传统的统计方法,如 ARIMA,也不应该放弃,因为他们可能会产生更好的结果。为了使它对现实世界的应用更有用,一个更长的预测范围和一个特定站点而不是整个城市的预测将是有价值的。

其中一些见解你可能已经很熟悉了,在我在 Udacity 攻读数据科学纳米学位期间,我了解到了理解性能指标、ML 算法和特征选择的重要性。但是这个特别的项目提醒了我,作为一名数据科学家,超越仅仅是黑掉 T5 的 T4,开始理解 T7 对你的成长是多么重要。此外,我以前没有做过时间序列预测,在处理这类数据时学到了很多潜在的陷阱。

并不是你接触的每个项目都会立即带来高预测性能。这往往需要大量的时间、研究和反复试验。但是,即使表现一般的模型也能告诉我们很多关于我们试图解决的潜在数据和业务问题,并指导我们如何改进我们的预测。

注:这篇博文的内容基于我写的一篇未发表的研究论文。

你想在媒体上阅读更多高质量的故事吗?考虑注册一个支持我和其他媒体作者的会员。

[## 通过我的推荐链接加入 Medium-Julia Nikulski

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@julia.nikulski/membership)

如果你想更深入地了解本分析中使用的基于树的集成算法,请查看我关于 AdaBoost、random forests 和 XGBoost 的指南。

[## AdaBoost、随机森林和 XGBoost 的终极指南

它们是如何工作的,有何不同,何时应该使用?

towardsdatascience.com](/the-ultimate-guide-to-adaboost-random-forests-and-xgboost-7f9327061c4f)

Go,Neo4J,还有 AWS Lambda…

原文:https://towardsdatascience.com/go-neo4j-and-aws-lambda-4cdd1af8886d?source=collection_archive---------64-----------------------

以及让它们一起工作的本质

我几乎每天都与 Neo4j 一起工作,作为一名 Python 开发人员,我通常将他们两人结合在一起编写我的大部分逻辑。然而,在过去的几天里,自从我开始使用 Golang,我似乎对它产生了强烈的亲和力。

我想使用 AWS Lambda 构建一个简单的服务,对我的 Neo4j 数据库执行简单的查询,并决定使用 Go 来改变一下。得知 Neo4j 有官方的 Go 驱动程序,我明显松了一口气。但是最初的几次尝试完全失败了。

不过不要担心,好消息是,你肯定可以一起使用 AWS Lambda、Go 和 Neo4j。只有几个额外的步骤需要首先执行。

问题是…

是的,Neo4j 有一个 官方驱动给 Golang

不,不是纯围棋写的。

这是什么意思?neo4j-go-driver 依赖名为“ Seabolt ”的 C 库通过 bolt 协议连接到数据库实例。

这意味着在开始执行 Neo4j 的 Go 代码之前,您必须显式地安装这个库。此外,seabolt 反过来要求在您的本地系统上安装 **OpenSSL(对于 Windows 是 TLS)**才能正常工作。

在本地机器上安装 OpenSSL 和 Seabolt 非常容易。事实上,OpenSSL 预装在许多操作系统中。(我使用的 Linux 系统已经有了 OpenSSL,我所要做的就是按照这些指令 安装 Seabolt)

当我们想要使用 AWS Lambda 复制同样的东西时,挑战就出现了。Go 作为一种静态类型语言首先被编译成二进制文件,然后作为 Lambda 函数的处理程序。通常,如果所有的依赖项都是基于 Go 的,或者如果您在本地系统上工作,这不会导致任何问题。

然而,在我们的例子中,Go 二进制依赖于外部 C 目标文件,并在运行时链接它们。但是我们如何让这些 C 文件对 lambda 函数可用呢?

解决方案

在花了相当多的时间在互联网上寻找可能的解决方案后,我找不到任何具体的东西,尤其是围棋。大多数解决方案都是针对 python 的(因为某些 python 库也使用 C 依赖),我几乎想回到我的老朋友 Python。但是,即使语言不同,概念是相同的。

进入 AWS Lambda 层…

从最简单的意义上来说, Lambda 层是一段可以被不同服务共享的代码。通常,一个层将由大多数功能所需的重量级依赖项组成。在我们的例子中,我们将把我们的 C 依赖打包在一起,并使用层使它们对 lambda 函数可用。

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

包括 lambda 函数示例和安装说明的完整代码在我的 GitHub 库的中。

步骤 1:打包 C 库

由于 AWS 经常使用基于 CentOS 的容器来部署 lambda 函数, Docker 成为下载和编译 C 依赖项的明显选择。

我们使用lambda-base映像作为基础映像创建一个定制的 docker 映像,并在其上安装我们所有的依赖项。

安装海锚的文件

基本映像已经安装并配置了 OpenSSL。现在唯一需要的图书馆是 Seabolt。

Seabolt 作为下载。tar 包并提取到 docker 映像中的 /usr/local/lib64 目录。为了使它对 Lambda 函数可用,我们将内容移动到 /opt/lib 目录,这是运行时链接期间搜索的目录之一。(这是在名为 LD_LIBRARY_PATH 的环境变量中指定的)

一旦构建了映像,我们需要将 /opt/lib 文件夹的内容转储到本地系统上的一个文件夹中,该文件夹稍后将被转换为一个层

打包依赖项的脚本

运行这个脚本将创建一个名为图层的目录,其中包含。所以在层/lib 文件夹中的文件是针对 Seabolt 的。

步骤 2:创建一个层

现在,我们要做的就是创建一个层。有两种方法可以做到这一点。首先,我们使用 AWS 控制台或 CLI 创建一个层,并将层/目录的内容作为. zip 文件上传。

另一种方法是使用 无服务器框架 ,它会为你做所有的工作。你所需要的只是一个文件调用 serverless.yml 来指定你的层的细节。

用于创建图层的 serverlee.yml

从您的工作目录中运行 run serverless deploy

你将为你新创建的层获得 ARN URL ,你可以很容易地将它附加到你的 lambda 函数上。

下一步:创建自己的 Go 处理函数

一旦成功地创建了这个层,您就可以继续创建您的自定义处理函数来与 Neo4J 通信。

GitHub 库包括一个示例处理函数,它在 Neo4j 中创建一个简单的节点,这个节点是使用无服务器框架部署的。关于如何使用 Go 和 serverless 创建 Lambda 函数的更多参考,这是一个有用的链接,可以从开始。

感谢阅读!

出去锻炼还是不锻炼?让数据科学来决定

原文:https://towardsdatascience.com/go-out-for-exercise-or-not-let-data-science-decide-34f8f28ce7b4?source=collection_archive---------30-----------------------

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

SorbyphotoPixabay 上拍摄的照片

决策树机器学习算法简介

作为最流行的经典机器学习算法之一,决策树在可解释性方面比其他算法更直观。让我们考虑下面的对话。

杰德:“我们明天应该出去跑步吗?”
克里斯:“天气怎么样?”
杰德:“我用手机查一下。今天是晴天!”克里斯:“听起来不错!那温度呢?”
玉:“嗯……35 度”
克里斯:“哎呀,太热了。我更喜欢去室内游泳池游泳。”

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

我们一生中做了很多决定。如果我们想一想为什么会做出那些决定,大多数时候背后都有一个“决策树”,如上图所示。这就是为什么决策树可能是最直观的非常接近人脑的机器学习方法。

决策树的构建模块

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

PublicDomainPicturesPixabay 上拍摄的照片

决策树作为机器学习模型是如何构建的?构建决策树有几种不同的流行算法,但它们必须包括两个步骤:构建树和修剪树。

构建决策树

为了构建决策树,算法需要生成三种类型的节点:

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

  • 根节点:决策树只有一个根节点,位于树的顶端。
  • 内部节点:这些节点位于其父节点和子节点之间。
  • 叶节点:这些节点永远不会有子节点,它们是决策树做出的“决定”。

然后,很明显,问题变成了典型的决策树算法如何生成/决定这些类型的节点:

  • 对于根节点,应该创建哪个功能?
  • “条件”是如何决定将父节点拆分成子节点的?
  • 何时停止生成更多的分支并以叶节点结束?

这些在不同类型的决策树算法之间是不同的,这将在后面的部分中讨论。

修剪决策树

这听起来像是一旦树建好了,我们就完成了,但并不是真的。大多数时候,我们必须修剪树木,以避免“过度适应”。

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

如上图所示,我们假设每个分割红色样本和蓝色样本的边界都是一个分割决策树中节点的条件。事实证明,左边的树似乎过于适合训练示例。修剪后的树,我们期待它成为正确的东西。

过拟合的原因通常是训练数据集小,被认为分裂的“特征”太多。决策树模型最有趣的特征是它们可以与训练数据集完美拟合,即 100%正确地对训练数据集进行分类。然而,这不是我们想要的,因为这几乎意味着我们构建的树已经失去了泛化能力。换句话说,它不能用于实际问题,只能用于训练数据集。

通常,有两种类型的树修剪机制:

  • 预修剪

建造时修剪树木。也就是说,在拆分节点并将更改应用到树之前,测试拆分是否会提高测试数据集中的分类准确性。如果有,继续做这个分支。否则,该当前节点将不会被分割,从而成为叶节点。

  • 后期修剪

该算法首先建立决策树。然后,从叶节点向后到根节点,评估每个分支以测试分裂的影响。如果这个分支在测试数据集上没有提高太多的性能,或者有时甚至可以提高性能,那么就去掉它。

算法将如何构建决策树

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

照片由菲洛娜Pixabay 上拍摄

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

不管我们将使用哪种算法来构建决策树,将使用的两个常见且重要的标准是纯度

纯洁

理解什么是纯洁是相当容易的。也就是说,对于一个单一的特征,它所对应的决策有多纯粹。让我们使用上面的样本数据集来演示。

  • 当天气多雨时,所有的决定都是“不”(100%纯度)
  • 当天气晴朗时,2 个决定是“否”, 1 个是“是”

因此,我们可以说第一套的纯度高于第二套。

熵几乎是熵的反向概念。它是由 Claude Shannon [1]首先提出的,是一个从热力学转移到信息论的概念。一般是指信息的“不确定性”。公式如下所示:

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

不要被公式吓到,它在我们的语境中非常简单。集合“ X 是节点集合中的一切,“ xᵢ 是指每个样本的具体决策。因此,“【p(xᵢ】)”是某个决策要做出的集合的概率。

让我们用我们在纯度概念解释中用过的同一个例子。

  • 当天气多雨时,两个决定都是“否”(100%纯度)

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

  • 当天气晴朗时,2 个决定是“否”, 1 个是“是”

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

结果符合直觉。基于训练数据集,当天气下雨时,我们肯定不会出去跑步。换句话说,给定天气是雨天,根本不存在“不确定性”,所以熵为 0。

信息增益

在理解了纯度和熵的概念之后,我们可以用它们来构建我们的决策树。最经典、最基本的决策树算法之一叫做“ID3”。它根据一个叫做“信息增益”的概念来分割节点,信息增益是通过减去父节点和所有子节点的熵来计算的。公式如下。

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

在哪里

  • “T”是父节点,“a”是“T”的属性集
  • 符号“|T|”表示集合的大小

同样,不要被公式吓到。我们用一个例子来演示一下。假设我们想使用“天气”作为我们的根节点。我们需要计算它的信息增益。

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

从上图中,我们可以很容易地计算天气节点(在此上下文中是父节点)及其子节点“晴天”、“多云”和“雨天”的熵,如下所示:

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

因此,使用“天气”作为根节点的信息增益可以计算为:

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

同样,我们可以用同样的方法计算另外两个特征的信息增益:温度和风级。

使用温度作为根节点的信息增益是 0.522,对于风级,它是 0.306。因此,我们应该使用天气作为根节点,因为它具有最高的信息增益,为 0.592。

一旦根节点被决定,剩余的内部节点将继续使用信息增益,直到每个分支到达叶子节点,即决定。

ID3 算法的缺点(信息增益)

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

照片由 geraltPixabay 上拍摄

好的。如果你理解了上面提到的所有内容,你就已经理解了如何使用 ID3(信息增益)算法构建决策树。然而,ID3 算法有一些明显的缺点。

假设我们有另一个特性“日期”。显然,“约会”功能在决定我们是否应该出去跑步时可能不是很有用。然而,普通 ID3 算法倾向于选择具有更多不同值的特征作为靠近树根的节点。这意味着我们最终可能会得到一个以无用特征作为重要节点的树。

当然不会每次都这样,但有可能。因此,有更多的机器学习算法如 C4.5 和 CART 被提出来提高决策树的性能。

我会不断更新不同种类的机器学习和数据挖掘算法。所以,有兴趣的话以后继续关注。

C4.5 算法:

[## 不要像这样使用决策树

展示 ID3 中信息获取的局限性以及使用 C4.5 的优势

towardsdatascience.com](/do-not-use-decision-tree-like-this-369769d6104d)

摘要

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

Pixabay 上由 viarami 拍摄的照片

在本文中,我介绍了一个非常流行和经典的机器学习算法——决策树的基础知识。决策树模型的主要构件包括构造和修剪。之后,我介绍了最基本的决策树算法 ID3。我们已经学习了什么是纯度和熵,这些有用的概念在构建决策树中起着重要的作用。ID3 利用信息增益来构造决策树,这是非常直观和易于解释的。然而,它确实有缺点,这些缺点将在其他类型的算法中得到改进。

我的下一篇文章将是关于 ID3 之上的其他流行的决策树算法,以克服它的一些缺点。希望这些文章能帮助你更多地了解机器学习/数据科学学科!

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入灵媒会员来支持我和成千上万的其他作家!(点击上面的链接)

参考

[1]香农,C. E. (1948 年)。交流的数学理论。贝尔系统技术期刊27 (3),379–423。

保护自己:数字健康的数据保护和数据安全

原文:https://towardsdatascience.com/go-secure-yourself-data-protection-and-data-security-for-digital-health-192f886bb145?source=collection_archive---------21-----------------------

每个人都希望自己的健康数据保密。毕竟,它可以揭示你生活中一些最敏感的细节。

对黑客来说,健康数据也比信用卡数据更有价值。但是很多时候,它没有得到适当的保护。

这样做需要结合数据保护和数据安全。这些概念经常被混淆,但我觉得大家,尤其是实际用户,应该更好理解。

介绍

毫无疑问,隐私、数据保护和数据安全密切相关,如下图所示。

但它们绝对不是同义词。

隐私是一项基本人权,涵盖了个人生活的方方面面。《欧洲人权公约》第 8 条涵盖了这一点。

数据保护是关于谁可以访问个人数据的法律控制。例如,《一般数据保护条例》(GDPR)谈到“在处理个人数据方面保护自然人”。数据安全更通用。这是关于技术控制通过使用安全和访问控制来限制对任何数据的访问。数据安全是增强数据保护的重要工具。

然而,正如您将看到的,数据保护需要许多额外的措施。在这篇博客中,我将关注数据保护和数据安全。

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

隐私、数据保护和数据安全之间的关系

什么是数据保护?

近年来,数据保护越来越重要。世界各国都在收紧数据保护法。

GDPR 于 2018 年生效,保护每个欧盟公民的个人数据,无论这些数据保存在哪里。自 2018 年 5 月 25 日开始执行以来,企业已经收到罚款或受到执行行动。在本文中,我们看了三个关键案例,并从这些案例中吸取了一些重要的经验教训。在美国, HIPAA (健康保险流通与责任法案)已经保护健康数据将近 25 年了。在这里,你可以了解 HIPAA 和 GDPR 的区别。最近,加州消费者保护法( CCPA )将 GDPR 式的保护延伸到了加州的许多消费者。其他地方也有类似的法律,比如巴西的《LGPD 法》和南非的《POPI 法》。有关所有法律、法规&标准的快速概述,请查看本免费白皮书

数据保护与个人数据有关

数据保护只涉及个人数据,也称为个人识别信息PII

根据数据保护法,公司和其他实体不受任何保护。 GDPR 将个人数据定义为:

“……与已识别或可识别的自然人(“数据主体”)有关的任何信息;可识别的自然人是指可以直接或间接识别的人,特别是通过参照身份识别特征,如姓名、身份证号、位置数据、在线身份识别特征,或该自然人的身体、生理、遗传、精神、经济、文化或社会身份所特有的一个或多个因素。”

这意味着任何与个人无关的数据(如匿名数据)都不在 GDPR 的覆盖范围内。

大多数数据保护立法赋予人们收集、存储和分发个人信息的特定权利。通常,与健康、性、宗教信仰等相关的敏感数据。获得额外保护。例如,GDPR 在第 9 条中规定了敏感(特殊)数据类别的数量。

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

GDPR 下的数据分类

虽然大多数数据保护法涵盖所有形式的数据,但有些法律仅涵盖特定类型的数据。例如,HIPAA 仅与个人健康信息或 PHI 相关。

数据主体权利

数据保护法基于隐私是一项基本人权的理念。

GDPR 走得更远,给予数据主体与个人数据相关的 8 项基本权利:

  1. 知情权。
  2. 进入权。
  3. 权利整风。
  4. 被删除/被遗忘的权利。
  5. 权利限制处理。
  6. 数据可移植权。
  7. 反对的权利。
  8. 与自动决策和分析相关的权利。

CCPA 也给予类似的权利。在大多数情况下,这些权利要求应用程序开发人员实施技术措施,如审计日志记录、同意跟踪和数据导出。

然而,有些权利,如被遗忘的权利,也需要法律咨询和专业知识来纠正。

实施数据保护

数据保护通常需要组织和技术措施的结合。

GDPR 的核心特征之一是,公司在处理个人数据时需要法律依据。这意味着您通常需要在处理数据之前获得许可(同意)。

您还必须实施合适的技术措施。然而,GDPR 并没有具体说明这些是什么。

这是因为并非所有企业都拥有同等的资源,并非所有数据都面临同等的风险,而且数据安全性在不断发展。相反,GDPR 谈到了“考虑到最先进的技术”和“通过设计和默认来保护数据”。

在欧盟和美国,也有法律义务公布任何数据泄露的细节。

根据 GDPR,即使您不确定违规行为是否已经发生,您也必须在 72 小时内通知您当地的数据保护机构。

您还有义务通知其数据可能受到影响的任何人。在美国,针对经济和临床健康的健康信息技术( HITECH )法案要求对影响 500 人以上的任何违规行为进行通知。然而,CCPA 没有这样的要求,而是依靠用户提交投诉。

什么是数据安全?

数据安全是控制或限制数据访问的任何措施的总称。重要的是,它涵盖了所有形式的数据,而不仅仅是 PII 或 PHI。

数据安全有三个主要方面。首先,您需要实际保护数据,通常使用某种形式的加密。其次,您需要保护您的网络和服务器免受访问。第三,您需要对用户进行身份验证,并检查允许他们访问哪些数据。

数据安全有很多标准,包括 NISTISO 27001和 T2 网络安全框架。

数据加密

加密包括使用加密算法和密钥来保护您的数据。数据应该在静态(存储中)和动态(例如,当您将数据从用户设备传输到后端)时进行加密。

加密有很多种形式,这里就不赘述了。但是有两个关键概念你应该知道。

首先是对称加密。这里,相同的密钥用于加密和解密数据。这在某些方面就像传统的机械锁。另一种是非对称或公钥加密。这里,您使用一个(公共)密钥来加密数据,使用另一个(私有)密钥来解密数据。数据一旦加密,就只能用私钥解密。当然,如果你不能保证(私有)密钥的秘密,所有的加密都是无用的。

物理和网络安全

许多数据安全威胁是基于物理或网络的。数据泄露的一种典型形式是,员工不小心将一个未加密的 USB 密钥留在了餐厅或火车上。另一个是从服务器上物理盗窃硬盘。

在任何数据安全风险评估中,都必须考虑这样的物理威胁。作为最低要求,所有磁盘都应该加密以防止被盗。

网络威胁包括未经授权访问您的系统、拒绝服务(DoS)、勒索软件和病毒。这里的主要保护来自专业硬件,如负载平衡器、防火墙和入侵防御系统。一些公司甚至完全禁止访问公共互联网,以确保系统安全。如果你与这里的专家交谈,你可能会听到像非军事区(DMZ)、入侵检测和红方网络这样的术语。

认证和访问控制

难题的最后一块是控制和监控谁可以访问哪些数据。这通常被称为 AAA(认证、授权和计费)。

认证包括检查用户的身份。传统上,这是通过用户名和密码完成的。

但是越来越多的公司使用多因素身份认证。这可能只是简单地向您的手机发送一个代码,但它可能涉及物理认证令牌。它甚至可能涉及生物识别,如指纹、虹膜扫描或面部识别。

授权是您检查(经过身份验证的)用户可以访问哪些数据的地方。理想情况下,这应该是非常细粒度的,默认应该是限制访问。

这有助于防止网络钓鱼和类似的攻击,黑客试图通过操纵用户并获取他们的访问详细信息来访问您的系统。

会计经常被忽视,但是,它非常重要。这是关于记录所有访问数据的尝试(成功的和不成功的),对用户帐户的任何更改(密码更改、权限更改等)。),以及任何未经授权或有潜在风险的网络活动。目的是确保如果你真的有数据泄露,你确切地知道发生了什么,哪些数据受到了影响

需要注意的是,仅仅因为某人对某个数据有访问权限,并不意味着他们被允许访问该数据。

在这种情况下,数据保护施加了比数据安全更严格的控制。例如,一名医生的接待员能够访问患者记录,但如果他们只是因为爱管闲事而决定随机检查他们朋友的记录,这将违反数据保护。

保护敏感数据

如页面上方的图片所示,一些数据被视为更加敏感。像这样的敏感数据必须特别安全地存储,防止任何未经授权的访问。

GDPR 规定,您的系统必须实现隐私设计,考虑到最先进的技术,以确保数据得到保护。HIPAA 在安全规则中给出了精确的指导。

我总是建议人们采取两个关键步骤来保护健康数据。首先,他们应该假名它。这意味着将个人详细信息和健康数据存储在不同的位置,并使用一个假名来连接它们。第二件事是使用一种强大的加密形式。如果您需要访问数据,您应该使用应用程序级加密(有时称为记录级加密),这意味着每个用户的数据都使用唯一的密钥来保护。

如果您实际上不需要访问数据,您应该使用端到端加密。在这里,数据实际上是在终端设备上加密和解密的。

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

如果一切都出错了呢?

每家数字医疗公司都应该将数据安全和数据保护放在首要位置。如果你做错了,你将面临一系列的风险。

首先,如果发生任何数据泄露事件,公司会受到负面宣传的影响。在某些情况下,他们甚至会看到自己的名誉受到不可挽回的损害。

其次,对于初创公司来说,这种糟糕的公关会吓跑投资者,并可能危及你的生存。第三,你可能会收到巨额罚款。

例如,在 GDPR,罚款可达全球年营业额的 4%,在€可达 2000 万英镑,以较高者为准——我们已经看到€开出了超过 1 亿英镑的罚单。

HIPAA 还征收高达数百万美元的罚款(每份健康记录的丢失或被盗都是有代价的)。如果这还不够可怕,一些数据泄露使公司老板面临刑事指控的风险,特别是当涉及敏感数据时。

结论

希望您现在对数据保护和数据安全之间的区别有所了解。正如我上面解释的那样,数据安全就是保护任何类型的数据免受未经授权的访问。数据保护是指保护个人数据不被访问和滥用。只有具备良好的数据安全性,才能实现数据保护。然而,它也需要组织措施,如隐私政策和同意管理。在我写的关于这个话题的免费电子书中阅读更多。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

走向无堡垒:使用会话管理器访问私有 EC2 实例

原文:https://towardsdatascience.com/going-bastion-less-accessing-private-ec2-instance-with-session-manager-c958cbf8489f?source=collection_archive---------8-----------------------

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

伊恩·巴塔格利亚在 Unsplash 上拍摄的照片

在本帖中,我们将设置一个私有 EC2 实例(在私有子网中),并使用 SSM 会话管理器来访问托管 Jupyter 笔记本服务器的实例。然后,我们将通过 AWS 会话管理器使用 PostForwarding 从本地机器访问我们的服务器。

我们将在不打开入站端口或的情况下设置这个基础设施,设置堡垒主机管理 SSH 密钥**!。**

为什么使用会话管理器?

众所周知,我们不能直接连接到一个私有 EC2 实例,除非有 VPN 连接或直接连接或其他与 VPC 的网络连接源。连接到 VPC 私有子网上的 EC2 实例的一种常见方法是使用一个 Bastion 主机

堡垒主机是一种服务器,其目的是提供从外部网络(如互联网)到私有网络的访问。由于面临潜在的攻击,堡垒主机必须将渗透的机会降到最低。使用堡垒主机时,首先登录到堡垒主机,然后登录到目标私有实例。使用这种方法,只有堡垒主机会有一个外部 IP 地址。

然而,也有一些缺点:

  • 您需要在您的堡垒中允许 SSH 入站规则
  • 您需要在您的私有 EC2 实例上打开端口,以便将它连接到您的堡垒
  • 您将需要管理您的用户的 ssh 密钥凭证:您将需要为每个用户生成一个 SSH 密钥对,或者为您的用户获得相同 SSH 密钥的副本
  • 成本:bastion 主机也有相关的成本,因为它是一个正在运行的 EC2 实例。即使是一台 t2.micro 也要 10 美元/月左右。

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

堡垒主机架构,以便访问私有实例。使用 Lucid.app 设计

会话管理器可用于访问私有子网内不允许互联网进入的实例。AWS SSM 提供了通过其本地服务在您的系统上建立外壳的能力,或者通过将它用作其他协议的隧道,例如安全外壳(SSH)。优势:

  • 它将记录会话期间发出的命令以及结果。如果您愿意,可以将日志保存在 s3 中。
  • Shell 访问完全包含在身份和访问管理(IAM)策略中,您不需要管理 SSH 密钥
  • 用户不需要使用堡垒主机和公共 IPs。
  • 不需要打开安全组中的端口

先决条件

会话管理器插件

您需要为 AWS CLI 安装会话管理器插件,以便使用 CLI 启动和结束将您连接到受管实例的会话。

你可以点击这里查看如何为不同的操作系统安装插件!

网络结构

在创建 EC2 实例之前,您需要一个带有公共和私有子网的 VPC。由于将在我们位于私有子网的实例上托管一个 Jupyter 笔记本,它将需要互联网访问(,以便我们可以安装和更新 Python 包)。

为了让我们的私有子网访问互联网,我们将使用 NAT 网关。此外,为了启用 internet 连接,此网关确保 internet 不会启动与实例的连接。

将使用的网络配置如下所示:

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

网络配置。使用 Lucid.app 设计

您可以直接在 AWS 控制台上创建网络,也可以使用 Terraform 构建网络,您可以在此处查看 Terraform 代码。

配置您的 EC2 实例

我们的实例将部署在没有公共 IP 地址配置的私有子网上,因为我们不需要它。

为了允许会话管理器访问我们的实例,需要附加以下 IAM 角色:*amazonsmsmanagedinstancecore。*该策略授予实例核心 Systems Manager 功能所需的权限。

对于 VPC 安全组,我们**不需要包含任何入站规则,**只允许出站流量。

VPC 安全集团

EC2 实例

会话管理器—启动会话

完成所有设置后,您可以从命令行访问您的实例:

$ aws ssm start-session --target {YOUR_TARGET_INSTANCE_ID}

需要注意的是,连接是在没有打开 EC2 安全组的任何端口和没有 Bastion 主机的情况下成功建立的!

下图显示了我们正在使用的实际配置:

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

会话管理器架构。使用 Lucid.app 设计

会话管理器有内置的审计日志 : AWS 会话管理器默认提供审计日志;因此,根据必要的安全性和合规性规定,每个命令都被记录并存储在 CloudWatch 日志或 S3 存储桶中。

您还可以在控制台上拥有会话历史记录:

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

AWS 系统管理器控制台的屏幕截图。https://aws.amazon.com/console/?nc1=h_ls

会话管理器—端口转发

许多客户使用 SSH 隧道来远程访问不公开在公共互联网上的服务。基本上, SSH 客户端在一个已配置的端口上监听连接,当它接收到一个连接时,它通过隧道将该连接连接到一个 SSH 服务器。服务器连接到一个配置好的目的端口,可能与 SSH 服务器在不同的机器上。

OpenSSH 中,使用-L选项配置本地端口转发:

ssh -L 9999:localhost:8888 user@instance

这个例子以用户user的身份打开一个到instance的连接,打开本地计算机上的端口 9999,从那里转发所有东西到localhost:8888

AWS 系统管理器会话管理器的端口转发允许您在私有子网中部署的实例之间安全地创建隧道,而不需要在服务器上启动 SSH 服务,打开安全组中的 SSH 端口,也不需要使用 bastion 主机。

端口转发以访问运行在私有实例上的 Jupyter 笔记本服务器

在这篇文章中,我们不会讨论如何在 EC2 实例上设置 Jupyter 笔记本服务器,但是你可以在这个链接上找到所有需要的信息。

满足先决条件后,您可以使用 AWS CLI 创建隧道:

$ aws ssm start-session --target {YOUR_TARGET_INSTANCE_ID} --document-name AWS-StartPortForwardingSession --parameters "portNumber"=["8888"],"localPortNumber"=["8888"]

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

截图来自 Jupyter 笔记本控制台,一个开源软件https://jupyter.org

OBS: 我在使用 Jupyter 笔记本服务器的时候,遇到了一个非常高的延迟问题;我想可能是因为会话管理器的端口转发。如果你正面临同样的问题,请留下你的评论。

结论

在这篇文章中,我们看到了如何使用会话管理器访问私有 EC2 实例,而不需要向实例安全组添加入站规则、管理 SSH 密钥以及使用另一个实例作为堡垒主机。我们还学习了如何使用会话管理器来使用 Post Forwarding。

这篇文章中使用的所有地形代码都可以在这里找到!

参考

[## 如何记录通过堡垒主机建立的 SSH 会话

堡垒主机是一种服务器,其目的是提供从外部网络到专用网络的访问,例如…

aws.amazon.com](https://aws.amazon.com/blogs/security/how-to-record-ssh-sessions-established-through-a-bastion-host/) [## 使用会话管理器连接 EC2 私有实例-无堡垒

Savings Plan 是一种新的灵活的 AWS 模型,用于节省使用计算服务的费用。它适用于 EC2 服务…

www.1cloudhub.com](https://www.1cloudhub.com/connect-ec2-private-instance-using-session-manager-go-bastion-less/) [## 离开堡垒主机第 2 部分:AWS - Netskope

引言这篇文章是一个系列的第二篇,关于在每个主要的云…

www.netskope.com](https://www.netskope.com/blog/leaving-bastion-hosts-behind-part-2-aws) [## 什么是 AWS NAT 网关?

NAT 网关,也称为网络地址转换网关,用于启用私有子网中的实例…

www.knowledgehut.com](https://www.knowledgehut.com/tutorials/aws/aws-nat-gateway) [## SSH 端口转发-示例,命令,服务器配置

SSH 端口转发是中的一种机制,用于将应用程序端口从客户端机器隧道传输到服务器机器,或…

www.ssh.com](https://www.ssh.com/ssh/tunneling/example) [## 使用 AWS 系统管理器会话管理器| Amazon Web Services 的新端口转发

我越来越多地看到客户采用不可变的基础架构模式:他们重建和重新部署一个…

aws.amazon.com](https://aws.amazon.com/es/blogs/aws/new-port-forwarding-using-aws-system-manager-sessions-manager/) [## 使用 AWS Systems Manager 会话管理器| Ibexlabs 改进系统管理

会话管理器是 AWS 的完全托管系统管理器服务中的一项功能,它允许您连接您的 EC2…

www.ibexlabs.com](https://www.ibexlabs.com/improving-systems-management-with-aws-systems-manager-session-manager/)

超越 99% — MNIST 手写数字识别

原文:https://towardsdatascience.com/going-beyond-99-mnist-handwritten-digits-recognition-cfff96337392?source=collection_archive---------3-----------------------

了解如何通过各种技术优化神经网络,以达到人类水平的性能。

MNIST 手写数字数据集被认为是计算机视觉的“Hello World”。大多数神经网络的标准实现在正确分类手写数字方面达到了 98-99%的准确率。

除了这个数字,每增加一个小数都很难提高准确率。让我们看看如何通过高级优化推动模型预测准确率超过 99%。

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

MNIST 手写数字数据集(来源:维基百科)

注意到

MNIST 数据集由 60,000 个训练样本和测试集中的 10,000 个样本组成。对于那些想在真实世界数据上学习技术和模式识别方法而不需要在数据预处理方面花费太多精力的人来说,这是一个很好的数据集。

由于本文的目的是学习优化方法来提高我们的分类器的准确性,我们将数据集重新分组为 48,000 个训练示例和 28,000 个测试示例,以减少可用于训练的数据,如 Kaggle 所做的那样,并使问题变得更难。

图像预处理

通过从每个像素中减去训练集的平均活性并除以它们的标准偏差,对所有图像进行标准化。众所周知,每幅图像都由 0 到 255 之间的像素值组成。如果没有标准化,原始像素值在输入到网络中时会由于不稳定的输入特性而减慢学习速度。

# Standardization
# Vector 'X' contains all the training examples. mean_px = X.mean().astype(np.float32)
std_px = X.std().astype(np.float32)
X = (X - mean_px)/(std_px)

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

归一化图像有助于学习算法更快地收敛

模型

LeNet-5 (LeCun et al .,1998)没有从零开始建立模型。基于梯度的学习应用于文档识别)卷积神经网络被用作基线标准模型。

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

LeNet-5 架构,LeCun 等人,1998 年。“基于梯度的学习应用于文档识别

这是一个简单的模型,由一个卷积层和两个 max-pooling 层组成,后面是两个完全连接的层,最后是十个类的 softmax。

经过 30 个周期的训练,训练正确率为 99.98%,设定正确率为 99.05%。对于一个 1998 年发布的模型来说,准确性似乎相当不错。然而,该模型同时存在高方差和高偏差问题,测试集准确率低于 98.74%。让我们逐一解决这两个问题。

贝叶斯错误率是任何分类器的最低可能错误率。

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

拟合不足的代表

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

过度拟合的代表

作为参考,可避免的偏差代表模型对数据的欠拟合,而方差代表过拟合。当我们微调模型时,我们的目标是最小化这两者。

数据集中的一些图像非常模糊,因此,假设贝叶斯误差不是 0%,而是在(0.2–0.3)%左右。

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

模糊图像的例子

减少方差

  • 数据扩充 —训练集中的一些图像在两个方向上随机旋转 10 度,缩放 10%,并在两个方向上移动 10%。
    直觉 —它有助于显著降低模型的方差,因为模型也看到了一些不规则的手写数字。
  • L2 正则化 —在某些卷积层中使用了超参数为 0.005(λ)的正则化。
    直觉 —在下面我们神经网络的损失函数的方程中,通过增加第二项,我们对损失函数的惩罚更多。较高的损失导致权重相对较小,这“简化”了模型以减少过度拟合。

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

通过调整超参数“lambda”(在我们的例子中为 0.005),惩罚损失函数

  • 漏失规则化 —在汇集层和一些全连通层之后增加了三个超参数为 25%的漏失层。
    直觉——通过在训练时随机丢弃 25%的神经元,我们试图通过简单地不过度依赖任何特定神经元来产生输出,让网络更好地泛化。

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

Srivastava,Nitish 等人,“辍学:防止神经网络过度拟合的简单方法”,JMLR,2014 年

  • 批量归一化 —在我们的情况下,它在每组层(ConvNet + MaxPool &完全连接)之后执行,以稳定网络并使学习算法更快收敛。
    直觉 —类似于标准化数据集中的图像,标准化各层的激活“减少”隐藏单元之间的移动,并允许各层独立地学习更多内容。

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

通过减去平均活动并除以方差来归一化图层的输出

  • 可变学习率 —当学习率可变时,性能显著提高。一旦模型检测到它的学习“停滞”,在我们的例子中,在等待两个时期后,学习率下降了 0.2 倍。
    直觉——通过动态降低学习率,帮助算法更快收敛,更接近全局最小值。
variable_learning_rate = ReduceLROnPlateau(monitor=’val_loss’, factor = 0.2, patience = 2)

处理偏差

处理偏差相对简单,因为网络在训练集上表现很好。为了将训练集的准确度提高到 99.6%以上,使用了以下技术。

  • 更多层 —最初的 LeNet-5 网络由两个卷积层组成。在新网络中,增加了两个具有相同超参数的卷积层。
  • 深层网络 —卷积层中的滤波器数量显著增加,从前两层的 6 个增加到 32 个,后两层的 16 个增加到 64 个。由于卷积层体积的增加,隐藏在密集层中的数量也增加,以容纳更大的输入。

直觉——更深更密的网络让模型可以学习手写数字更复杂的特征。

将所有这些放在一起

让我们把所有东西组装成一个模型。为此,我使用了 Keras 来构建模型,但是也可以使用其他框架。

总而言之,我们使用两个卷积层,然后是两次池化层(一次分别有 32 个过滤器和 64 个过滤器)和三个全连接层,最后有 10 个类的 softmax 单元。批处理规范化,L2 正则化和辍学是在层间完成的,如下面的代码所示。

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

我们改良的 LeNet-5

model = Sequential([# Layer 1
Conv2D(filters = 32, kernel_size = 5, strides = 1, activation = ‘relu’, input_shape = (32,32,1), kernel_regularizer=l2(0.0005)),# Layer 2
Conv2D(filters = 32, kernel_size = 5, strides = 1, use_bias=False),# Layer 3
BatchNormalization(),# — — — — — — — — — — — — — — — — #
Activation(“relu”),
MaxPooling2D(pool_size = 2, strides = 2),
Dropout(0.25),
# — — — — — — — — — — — — — — — — ## Layer 3
Conv2D(filters = 64, kernel_size = 3, strides = 1, activation = ‘relu’, kernel_regularizer=l2(0.0005)),# Layer 4
Conv2D(filters = 64, kernel_size = 3, strides = 1, use_bias=False),# Layer 5
BatchNormalization(),# — — — — — — — — — — — — — — — — #
Activation(“relu”),
MaxPooling2D(pool_size = 2, strides = 2),
Dropout(0.25),
Flatten(),
# — — — — — — — — — — — — — — — — ## Layer 6
Dense(units = 256, use_bias=False),# Layer 7
BatchNormalization(),# — — — — — — — — — — — — — — — — #
Activation(“relu”),
# — — — — — — — — — — — — — — — — ## Layer 8
Dense(units = 128, use_bias=False),# Layer 9
BatchNormalization(),# — — — — — — — — — — — — — — — — #
Activation(“relu”),
# — — — — — — — — — — — — — — — — ## Layer 10
Dense(units = 84, use_bias=False),# Layer 11
BatchNormalization(),# — — — — — — — — — — — — — — — — #
Activation(“relu”),
Dropout(0.25),
# — — — — — — — — — — — — — — — — ## Output
Dense(units = 10, activation = ‘softmax’)])

结果

该模型被训练 30 个时期,并给出以下结果。

  • 训练准确率达 99.82%
  • 开发设置准确率为 99.62%
  • 测试集准确率为 99.41%

包裹

提到的优化极大地有助于推动模型的准确性突破 99%的大关。

我们可以注意到,随着测试集中精度的下降,仍然有一些过度拟合的迹象。请随意尝试,并尝试进一步减少差异。如果你认为还有其他方法可以改进模型,请留下评论。

所有的代码和结果都可以在 GitHub 这里找到。

参考

[1] LeCun 等,基于梯度的学习应用于文档识别 (1998),IEEE 学报,1998 年 11 月

[2]吴恩达等人,改进深度神经网络:超参数调整、正则化和优化,Coursera 课程

[3] Y. Ghouza,CNN Keras 简介— 0.997(前 6%) (2017),Kaggle 数字识别器竞赛

[4] Srivastava,Nitish 等人,辍学:防止神经网络过度拟合的简单方法,(2014) JMLR

从 Stata 到熊猫

原文:https://towardsdatascience.com/going-from-stata-to-pandas-706888525acf?source=collection_archive---------23-----------------------

开始、探索和可视化。专为熟悉或曾经熟悉 Stata 的人设计的指南。

由三部分组成的单一指南,概述

本指南是为想开始学习熊猫的 Stata 用户准备的。它是使用 Stata 用户熟知的示例和工作流编写的。此外,本文引用了许多 Stata 用户都知道的数据。

在本指南的第 1.1 部分中,我回顾了 Stata 用户可能希望开始探索使用 Python 和 Pandas 的各种原因。

在下一节,即第 1.2 部分,我将演示交叉列表和汇总统计,它们将帮助您开始数据探索过程。

最后,在第 1.3 部分中,我举例说明了各种简单的可视化方法,它们将帮助您继续数据探索过程。

第 1.1 部分:所以,您安装了 Python 和 Pandas,但是您不确定接下来的步骤。

Stata 和 Pandas 都为数据操作、可视化、统计等提供了完整(或接近完整)的平台。Stata 声称是…

一个完整的集成软件包,可满足您的所有数据科学需求,包括数据操作、可视化、统计和可再现的报告。(stata.com

熊猫声称是…

一个开源、BSD 许可的库,为 Python 编程语言提供高性能、易于使用的数据结构和数据分析工具。(【pandas.pydata.org】T4)

Stata 用户可能想学习熊猫的原因

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

Stata &熊猫营销图片。

一个合作者正在使用熊猫。你是 Stata 用户,但你合作的研究小组不是。他们用熊猫。在同一个沙盒里,你决定学习熊猫。

你已经决定要扩展你的技能。准备好迎接新的挑战了吗?也许你读过 Stata 书店的几本书。您已经创建并发布了用户编写的程序(Stata 用户称之为)。也许你甚至已经在波士顿学院统计软件组件(SSC)档案库发布了一个或多个程序到用户社区的首选存储库中。很明显,你已经准备好扩展你的技能了。

您无法访问 Stata。或者你预期失去 Stata 的访问权。Stata 是专有的,它的许可费用很高。如果你已经失去或预计失去访问 Stata 的权限,并且你对为自己购买许可证不感兴趣(尽管它很有价值),Pandas 是一个不错的选择。

**其他原因。**为什么一个 Stata 用户可能想学习熊猫并不重要。本指南是一个不可知论的指南,承认两种语言各有优缺点。在我的工作中,我经常发现一个人继承另一个人留下的东西。

本指南假设您已经安装了 Python 和 Pandas

为了避免重新发明轮子,本指南除了建议 Stata 用户考虑安装用于科学研究的 Anaconda 发行版之外,不讨论 Python 或 Pandas 的安装。

本指南中给出的示例和解释已经使用 Anaconda 发行版进行了测试。具体来说,这里给出的例子是在 Jupyter 笔记本中创建的,这是 Python 的 Anaconda 发行版中包含的软件。

使用 Stata 著名的汽车数据集示例。我之前已经讨论过这个数据集,它对于测试或训练是有用的。在 Jupyter 笔记本中加载该数据集通常会是这样的:

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

运行 Python 3 内核的 Jupyter 笔记本。使用 Stata 示例汽车数据集的熊猫插图。

接下来在第 1.2 部分,我将演示交叉列表和汇总统计,这将帮助您开始数据探索过程。在最后一节,第 1.3 部分,我将演示简单的可视化,让您继续数据探索过程。

第 1.2 部分:安装 Python 和 Pandas 之后,接下来是您的步骤。

加载自动数据集

在 Stata 中加载汽车数据集很容易:sysuse auto。在 Python 中,这个过程可以分两行完成。但是为了使代码更易读,我把它分成三行:

import pandas as pdauto = 'http://www.stata-press.com/data/r15/auto2.dta'
df = pd.read_stata(auto)

就是这样!简单。如果你是一个新的熊猫用户,如果你正在跟随祝贺!您已经将第一个数据集加载到内存中。

你会注意到的第一件事是,在 Python 中工作,很少有“输出”输出是语言提供的信息,用来帮助验证命令是否完成了您想要它做的事情。关于这方面的更多信息,请参见我的相关文章合并数据:熊猫丢失输出

在 Python 中,这种反馈要少得多。验证您是否正确加载了汽车数据集。试试代码df.head()大致相当于 Stata 的list in 1/5。以下是您应该看到的内容:

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

运行 Python 内核的 Jupyter 笔记本。使用 Stata 汽车数据集的熊猫插图。

交叉制表

交叉列表法是最简单的分析技术之一。这种技术包括将两个或多个分类变量之间的出现次数制成表格。

Stata 的局限性在于,涉及两个或三个以上分类变量的交叉列表是有限的。对熊猫来说,三个或更多种类是没有问题的。

与汽车数据集的双向列表:

pd.crosstab(df['rep78'], df['foreign'])

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

运行 Python 内核的 Jupyter 笔记本。两个变量(维修记录和制造来源)的交叉列表。使用 Stata 汽车数据集的熊猫插图。

仔细看,这个表格遗漏了一些数据。为了让 Stata 在其交叉表中包含缺失的数据,跟在tab命令后面的mi选项将提供更完整的数据视图。把它放在一起,在 Stata 它会是tab foreign rep78, mi

在 Pandas 中,需要两行来显示更完整的数据视图:

# Specify a new category among the repair records.
df['rep78'].cat.add_categories('No Record', inplace=True)# Generate a tabulation using the fillna() method.
pd.crosstab(df['foreign'], df['rep78'].fillna('No Record'))

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

运行 Python 内核的 Jupyter 笔记本。两个变量的交叉列表(维修记录和制造来源,包括缺失数据)。使用 Stata 汽车数据集的熊猫插图。

汇总统计数据

Stata 中的汇总统计并不复杂。查看连续变量的最快方法之一是键入sum。通过汽车数据集,您可以:

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

Stata 汽车数据集的汇总统计数据。

在 Pandas 中,最接近这种输出的命令是df.describe().transpose(),它将给出:

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

运行 Python 内核的 Jupyter 笔记本。跨行显示变量名的汇总统计信息,沿列显示统计信息。使用 Stata 汽车数据集的熊猫插图。

大多数 Pandas 用户会使用df.describe(),它在输出的顶部显示变量名,在每行显示统计数据。作为一名 Stata 用户,我添加了transpose()方法,该方法旋转输出以更好地匹配我习惯的 Stata 惯例。

另外,熊猫的默认输出也给出了第 25、50 和 75 个百分点。当然,第 50 百分位是最有用的中间值。Stata 的默认输出中没有提供这些额外的统计数据。

如果你正在跟随并且感觉冒险,通过执行以下来测试你的直觉:

df[['price','mpg','foreign']].groupby('foreign').describe()

看看你是否能正确预测输出会是什么。此外,努力调整代码以进行定制,以便您可以探索价格(price)或里程数(mpg)之外的其他变量。

接下来的第 1.3 部分演示了各种简单的可视化,让您可以继续数据探索过程。

第 1.3 部分:交叉列表和总结数据后,进行简单的可视化。

直方图和散点图得到升级

我最喜欢在熊猫而不是 Stata 中进行数据探索的一个部分是散点图和直方图的组合——在同一个图中。

直方图一次显示一个变量的分布。散点图说明了两个或多个变量之间的关系。

Pandas 提供了对 jointplot 的访问,它将散点图和直方图的优点结合成一个。再次使用 Stata 的汽车数据集:

import pandas as pd
import seaborn as sns
%matplotlib inlineauto = 'http://www.stata-press.com/data/r15/auto2.dta'
df = pd.read_stata(auto)sns.jointplot(x='weight',y='mpg',data=df, kind='scatter')

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

运行 Python 内核的 Jupyter 笔记本。说明英里数(mpg)和汽车重量(以磅为单位)之间关系的联合图。使用 Stata 汽车数据集的熊猫插图。

这个可视化探索了里程(在纵轴 y 上以每加仑英里数表示)和车辆重量(在 x 轴上以磅数表示)之间的关系。与直觉和一般理解一致,可视化表明,随着车辆重量增加,车辆里程减少。

这个连接图显示了这两个变量(体重和 mpg)之间的关系,以及这些变量的分布情况。作为一个额外的奖励,这个可视化显示了这两个变量的皮尔逊相关系数及其 p 值。

配对图

此外,pairplot 可以方便地比较数据集内的许多变量。配对图提供了散点图矩阵,类似于典型的相关矩阵。下面将比较里程(mpg)、重量(weight)、长度(length)、价格(price):

sns.pairplot(df[['mpg','weight','length','price']])

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

运行 Python 内核的 Jupyter 笔记本。说明里程(mpg)、重量(weight)、长度(length)和价格(price)之间关系的 Pairplot。使用 Stata 汽车数据集的熊猫插图。

为了增加分类比较,这里我们将比较国外制造和国内制造,我们可以调整代码以包括几个附加参数:

sns.pairplot(df[['mpg','weight','length','price','foreign']],
             kind='scatter', plot_kws={'alpha': 0.5}, 
             hue='foreign')

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

运行 Python 内核的 Jupyter 笔记本。说明里程(mpg)、重量(weight)、长度(length)和价格(price)之间关系的 Pairplot。在这个可视化中,我们还比较了国外和国内的制造来源。使用 Stata 汽车数据集的熊猫插图。

在添加了额外的论点之后,这些论点产生了一种视觉效果,可以让你比较国内制造的车辆和国外制造的车辆,新的模式开始出现,这可能会为进一步的分析提供信息。

[## 加入我的介绍链接媒体-亚当罗斯纳尔逊

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

adamrossnelson.medium.com](https://adamrossnelson.medium.com/membership)

结论

本文分为三个部分,旨在帮助 Stata 用户考虑如何过渡到 Python 和 Pandas。如果目标不是过渡,本指南将帮助 Stata 用户开始学习一种新工具,可以补充您在 Stata 中正在进行的工作。Stata 和熊猫各有优缺点。

在最基本的层面上,一旦你对 Stata 的熟练程度达到了中级或更高级,那么通过学习 Python 和 Pandas 来增加你的技能是值得的。本文展示了将帮助您开始数据探索过程的技术。

第 1.1 部分回顾了 Stata 用户可能希望开始探索使用 Python 和 Pandas 的各种原因。第 1.2 和 1.3 部分演练了使用 Stata 流行的汽车数据集进行数据探索、分析和可视化的基本示例。

感谢阅读

感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelsonLinkedIn:亚当罗斯尼尔森

通过网络搜集职位空缺,找到我在数据科学世界中的位置。

原文:https://towardsdatascience.com/gone-to-find-myself-finding-where-i-am-in-the-data-science-world-by-web-scraping-job-postings-bf416dbfb6fa?source=collection_archive---------41-----------------------

发现自己在数据科学中,在数据科学中。

这是一个有趣的练习,包括对招聘信息和由 tf-idf 和 t-SNE 主演的简历进行文本分析,以找到最适合我的工作角色。

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

Unsplash 上由 Aron 视觉拍摄的照片

关于许多“数据科学”职位的实际工作由什么组成,存在相当大的争议。作为一名数据科学家,看到从分析师到科学家再到工程职位的招聘信息会感到非常困惑,因为实际的职位描述可能与你对该职位的理解大相径庭。这场不匹配给我带来了毕业时的生存危机和此后许多不眠之夜。我是数据科学家吗?…一个机器学习工程师?

我属于数据科学吗?

结合这一事实,许多公司不知道他们真正想雇用什么样的数据专业人员,你就会明白为什么数据科学的工作描述可以无处不在。

我的目标很简单。我能在网上搜集招聘信息,按标题分类,然后看看我是否能得到一些有意义的可视化信息,告诉我自己在这个领域的最终位置吗?我能找到属于我的地方吗?

第一幕——一个网络掠夺者的故事

首先,我收集了数据科学的职位名称。为了增加趣味,我还加入了统计学家和定量分析师。下面的列表并不完整,它包含了我搜集到的条款:

  • 数据科学家
  • 数据工程师
  • 数据分析师
  • 机器学习工程师
  • 统计员
  • 定量分析师
  • 研究科学家

显然这是一个有点缺陷的列表。还有很多标题,我的选择有点武断。前五个是相对常见的术语,而后两个稍微不常见。我决定坚持使用这些作为概念验证,我很乐意在评论中听到你的建议。

我决定用 python 库请求beautifulsoup 抓取 indeed.com 是我最好的选择。在浏览了网站并摆弄了用户界面后,我想我应该先收集个人职位描述的链接,然后一个一个地查找。

上面的代码片段首先收集可用描述的数量,并一次收集 50 个链接。因为 Indeed.com 会自动将你与不相关或半相关的职位进行匹配,所以我做了一个检查,只在职位名称实际上是职位发布的一部分时才继续。对 storedescription()的调用只抓取实际的工作描述,并将其存储到一个文本文件中。

我将跳过一些细节,但最重要的是,它给了我一个职位列表和几个包含纯文本职位描述的文件夹。在这七个文件夹之间,我有 577 个文本文档。

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

每个职位一个文件夹。

第二幕——理解招聘启事

兴奋地,我打开了其中一个招聘启事。承蒙美声组的帮忙,文本基本没问题,但仍有一些有限的预处理要做。一些句子的结尾变坏了,这是一个应该在标记化之前解决的问题。

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

从 Indeed.com 收集的示例描述(原始)

为了清理这一点,我添加了一个快速和肮脏的预处理脚本。

我有点担心如何进行。我想用 t-SNE 将描述绘制成类。我经常处理高维数据,但通常是以单词嵌入和张量的形式。又长又稀疏的向量让我害怕。如果我只为每个文档取一个简单的单词包向量,我将有一个巨大的向量,这可能会很麻烦。使用 tf/idf 可能会缓解一些常见术语的问题,但不会降低我的数据的维度。我想我会继续使用 SVD ,但是感觉应该有一个更简单的途径来实现我想要的可视化。

然后我找到了 Yellowbrick ,这是一个用于机器学习可视化的库,旨在补充 Scikit-Learn。使用 Yellowbrick,我可以在一行中完成奇异值分解和 t-SNE,如下所示:

这导致基于 577 个文档(= 577 个职位发布)的以下可视化

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

看哪!一个直接来自笔记本的 SNE 霸王龙图。

为了清楚起见,我把这些类的名字编辑成了下图。

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

同样的图,聚类标记为。名字大致放在各组集中的位置上。

这说明了什么是相当惊人的。统计学家几乎都聚集在一起,偶尔有数据科学家或分析师也在附近。有趣的是,研究科学家作为一个相邻的集群是明显可识别的。这表明这些工作可能是相当相关的,但仍然有足够的不同,可以被视为独立的集群。去研究科学家吧!

这几乎就像一个光谱。中间地带由数据分析师占据,他们在统计学家和数据科学家之间架起了一座桥梁。数据科学家和数据工程师相当混杂,其中工程师有一些巩固的基础。机器学习工程师似乎比数据科学家更关注数据工程师。数据科学家的小集群出现在边缘,这可能表明数据科学的不同风格。说真的,数据科学家这个角色似乎无处不在。

定量分析师在地图边缘形成他们自己的集群。这是意料之中的,因为它是一个相当独特的利基市场。有趣的是,一些分析师和科学家加入了他们的行列。这可能表明,那些寻找定量分析师职位的人也应该考虑看看数据科学和数据分析师的职位。

第三幕——我属于哪里?

风景很清晰,但我属于哪里?因为我已经有了招聘信息的文本描述作为我的数据,所以我真正需要的是把我的简历放在一个类似的纯文本格式中,并把它添加到一个文件夹中。然后,我可以简单地再次运行脚本来找出我在哪里。

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

我为“杰弗里”班做了一个文件夹存放我的简历。

不幸的是,有一个与 t-SNE 相关的随机元素,当我再次运行脚本时,我无法重现相同的情节。然而,数据的大致方向应该相同。也就是说,集群应该出现在相对于彼此或多或少相同的位置,但是在不同的方向和位置。

快速重新运行脚本显示,我的简历夹在数据工程、机器学习工程和数据科学家之间。也许在工程方面会多一点。我的简历上有几个软件工程实习和项目,所以这有一定的意义。不幸的是,我正好处在所有不同学科之间的争议区域的中间。最近的邻居是几个数据科学空缺,两个 ML 工程空缺,并在一群数据工程师附近。

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

暂时就这样了。如果你想看看我用的笔记本,你可以在这里找到。我还没有上传我搜集的文本数据,所以你得自己收集。我很喜欢写这个有趣的练习,也很感谢你在下面的反馈。当然,这与“适当的”方法相去甚远,我建议如果你重现它,不要太在意结果。

Good Grams:如何为您的问题找到预测性的 N-Grams

原文:https://towardsdatascience.com/good-grams-how-to-find-predictive-n-grams-for-your-problem-c04a5f320b39?source=collection_archive---------31-----------------------

找出哪些单词对你的问题有预测性是很容易的!

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

图片来源:肯德里克·米尔斯

介绍

如今,NLP 感觉就像是应用 BERT 并获得关于你的问题的最先进的结果。很多时候,我发现抓住一些有用的信息词汇也会有所帮助。通常,我会让一个专家来找我,说这五个词对这门课很有预测性。然后我会用这些词作为特征,瞧!你得到了一些性能上的改进或者更多的可解释性。但是如果你没有领域专家,你会怎么做呢?我喜欢尝试的一件简单的事情是在 TF-IDF 特性上训练一个简单的线性模型,并取前 n 个单词或 n-grams:)。

在这篇博文中,我们将:

  1. 使用 SciKit-Learn 训练一个简单的模型,获得最丰富的 n-gram 特征
  2. 然后在具有不同数量特性的模型上运行一些性能比较。

希望在本教程结束时,您将拥有一个有趣的新工具来揭示文本分类的良好特性。让我们开始吧。

TLDR

使用 SciKit-Learn 的 TfidfVectorizer 上的线性分类器,然后按权重对特征进行排序,取最上面的n。您还可以使用 TfidfVectorizer,通过使用词汇参数来为您的模型提取 n 元语法的子集。

动机

对文本进行分类的一个非常成功的方法是寻找与问题相关的预测词或短语。在说电影评论情绪的上下文中,我们可以查找单词“好”、“优秀”、“伟大”或“完美”来找到好的评论,而“坏”、“无聊”或“糟糕”来找到坏的评论。作为好的和坏的电影评论的主题专家,我们很容易想出这些特征。

通常情况下,我不是一个主题专家,对我来说很难确定什么是好的预测词或短语。当这种情况发生时,我已经标记了数据,有一个快速的方法来找到描述性的单词和短语。只需训练一个线性模型,进行权重排序!

训练一个简单模型

SciKit-Learn 使得训练线性模型和提取相关权重变得非常容易。让我们来看看在 IMDB 情感数据集上训练一个模型。

df = pd.read_csv("IMDB_Dataset.csv")
df["split"] = np.random.choice(["train", "val", "test"], df.shape[0], [.7, .15, .15])
x_train = df[df["split"] == "train"]
y_train = x_train["sentiment"]
x_val = df[df["split"] == "val"]
y_val = x_val["sentiment"]classifier = svm.LinearSVC(C=1.0, class_weight="balanced")
tf_idf = Pipeline([
     ('tfidf', TfidfVectorizer()),
     ("classifier", classifier)
 ])tf_idf.fit(x_train["review"], y_train)

这个模型只需要几秒钟的训练时间,但是只用单字就可以得到相当不错的 F 值 0.88。

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

有了这个新模型,我们只需从 TF-IDF 转换器中获取系数名称,从 SVM 中获取系数值,就可以找到最具预测性的特征。

coefs = tf_idf.named_steps["classifier"].coef_
if type(coefs) == csr_matrix:
    coefs.toarray().tolist()[0]
else:
    coefs.tolist()feature_names = tf_idf.named_steps["tfidf"].get_feature_names()
coefs_and_features = list(zip(coefs[0], feature_names))# Most positive features
sorted(coefs_and_features, key=lambda x: x[0], reverse=True)# Most negative features
sorted(coefs_and_features, key=lambda x: x[0])# Most predictive overall
sorted(coefs_and_features, key=lambda x: abs(x[0]), reverse=True)

通过访问管道中名为 step 的“分类器”,我们可以获得模型赋予每个特征的权重。创建管道时,我们命名流程中的每一步,这样我们就可以用这个named_steps函数来访问它们。大多数 SciKit-Learn 模型都有一个.coef_参数,该参数将返回模型的系数,我们可以用它来找到最具预测性的模型。为了方便起见,我对稀疏矩阵做了一些类型检查,因为这些类型的词法特征可能非常非常稀疏。特征名存储在我们管道的tfidf步骤中,我们以与分类器相同的方式访问它,但是调用get_feature_names函数。

我们的十大积极词汇是:

[(3.482397353551051, 'excellent'),
 (3.069350528649819, 'great'),
 (2.515865496104781, 'loved'),
 (2.470404287610431, 'best'),
 (2.4634974085860115, 'amazing'),
 (2.421134741115058, 'enjoyable'),
 (2.2237089115789166, 'perfect'),
 (2.196802503474607, 'fun'),
 (2.1811330282241426, 'today'),
 (2.1407707555282363, 'highly')]

我们的十大负面词汇是:

[(-5.115103657971178, 'worst'),
 (-4.486712890495122, 'awful'),
 (-3.676776745907702, 'terrible'),
 (-3.5051277582046536, 'bad'),
 (-3.4949920792779157, 'waste'),
 (-3.309000819824398, 'boring'),
 (-3.2772982524056973, 'poor'),
 (-2.9054813685114307, 'dull'),
 (-2.7129398526527253, 'nothing'),
 (-2.710497534821449, 'fails')]

使用我们的“好”功能

既然我们已经发现了一些“好”的特征,我们可以构建更简单的模型,或者在类似领域的其他问题中使用这些特征。让我们建立一些简单的规则,如果这些预测词中的任何一个出现在评论中,将返回 1,否则返回 0。然后仅用这 20 个特征重新训练模型,看看我们做得如何。

为了做到这一点,我创建了一个简单的 SciKit-Learn 转换器,它将 n-grams 列表转换为 regex 规则,NLTK 的 tokenizer 可以搜索这些规则。不是超级快(那是轻描淡写,真的很慢。您应该使用 TfidfVectorizer 中的词汇参数,后面会有更多介绍。)但是它很容易阅读并完成工作。

这段代码有三个主要部分。

第 11 行将一个表示 n-gram 的元组(比如(" good “、” movie ")转换成一个 regex r “”,NLTK 可以用它在文本中搜索特定的 n-gram。它基本上只是一个列表理解,用一个 foldl 将单词连接成一个正则表达式,遍历所有的 n 元语法。

第 13–26 行通过遍历输入中的每一个句子,或者在本例中进行回顾,并将每个正则表达式应用于该句子,来执行转换。如果正则表达式找到了什么,它会在列表中与触发的 n-gram 对应的位置放置一个 1。这将产生一个带有 1 和 0 的向量,表示哪个 n 元语法出现在哪个句子中。

第 28–29 行允许我们像以前一样获取相关的特性名称。只是方便而已。

有了这个新的便捷的转换器,我们可以使用前十个最好的和后十个最差的单词来重新训练我们的模型。

n_grams = [('excellent',), ('great',), ('perfect',),
           ('best',), ('brilliant',), ('surprised',),
           ('hilarious',), ('loved',), ('today',),
           ('superb',), ('worst',), ('awful',),
           ('waste',), ('poor',), ('boring',),
           ('bad',), ('disappointment',), ('poorly',),
           ('horrible',), ('bored',)]
classifier = svm.LinearSVC(C=1.0, class_weight="balanced")
rules = Pipeline([
     ('rules', RuleTransformer(n_grams)),
     ("classifier", classifier)
 ])rules.fit(x_train["review"], y_train)

这 20 个特征使我们的 F1 减少了大约 0.13,这看起来很多,但是我们只使用了最初的 65,247 个单词的 0.03%。这真是太棒了!这 20 个特征编码了我们数据中的大部分信息,我们可以将它们用作其他管道中的特征!

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

用于规则提取的 TfidfVectorizer

我在上面构建了规则矢量器,但是我们可以通过使用 tfidf 矢量器并传入一个词汇表参数来获得相同的结果。最初的 SciKit-Learn 矢量器接受一个名为“词汇”的参数,该参数接受一个将单个单词或由空格分隔的 n 元语法映射为整数的字典。为了获得相同的效果,我们可以运行:

top_feats = sorted(coefs_and_features,
                   key=lambda x: abs(x[0]),
                   reverse=True)[:20]
vocab = {x[1]: i for i, x in enumerate(top_feats)}
TfidfVectorizer(vocabulary=vocab)

这里我们得到了特性的排序列表,然后我们创建了一个从特性名称到整数索引的映射,并将其传递给矢量器。如果你对地图的样子很好奇,大概是这样的:

{"great": 0,
 "poor": 1,
 "very poor": 2,
 "very poor performance": 3}

n-gram 是通过在单词之间添加一个空格来表示的。如果我们使用上面的代码代替我们的 RuleTransformer,我们将在很短的时间内得到相同的结果。

要取多少特征?

这 20 个字似乎很有力量。他们可以从一开始就为我们提供 79 F1,但也许 20 不是正确的功能数量。我们可以通过对越来越多的顶级功能运行我们的分类器并绘制 F1 来找出答案。

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

这向我们表明,在大约 13k 的最具预测性的词之后,该模型开始收敛到最佳 TF-IDF 单字性能。因此,我们只需 20%的原始功能集就能获得相同的性能!继续使用这些 13k 功能是一个更有原则的数字,我们仍然可以大幅减少原始功能的数量。

结论

如果我们纯粹着眼于词汇特征、特定单词及其数量,那么这可能是发现有用单词和短语的好方法。语言远比你使用的词语要复杂得多。在设计实际系统时,查看各种信息很重要。使用 BERT,使用句法特征,比如句子是如何分析的。语言不仅仅是生字,还有很多东西,但是希望这个小技巧可以帮助你在遇到困难的时候找到一些好的单词。

好的管道,坏的数据

原文:https://towardsdatascience.com/good-pipelines-bad-data-e55d9ba17920?source=collection_archive---------12-----------------------

如何开始信任你公司的数据?

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

Unsplash 上的 Element5 数码拍摄

现在是 2020 年,我们仍在使用“照片和书面记录”来验证数据。在最近的 爱荷华州选举 中,数据不一致侵蚀了对结果的信任。这只是许多最近的、突出的、无孔不入的例子之一""

数据宕机指的是数据不完整、错误、丢失或不准确的一段时间,我所知道的几乎每个数据组织都在与之作斗争。事实上,这篇【HBR】的文章 引用了一项研究,该研究发现,由于糟糕的数据,公司平均每年损失 1500 万美元。在这篇博文中,我将介绍一种管理数据停机时间的方法,这种方法已经被业内一些最好的团队所采用。

那么,衡量数据停机时间意味着什么呢?

为了解开这个谜团,我们先来看看什么叫做“停机时间”。数据宕机指的是数据“停机”的任何时间,即数据团队发现自己对常见问题的回答是“不”的时候,这些问题包括:

  • 该报告中的数据是最新的吗?
  • 数据是否完整?
  • 字段是否在合理范围内?
  • 我对上游来源的假设仍然成立吗?
  • …以及更多

或者换句话说… 我能相信我的数据吗?

实时回答这些问题很难。

大大小小的数据组织都面临着这些问题,因为(1)跨数据管道持续跟踪这些信息需要大量资源;(2)在最好的情况下,信息被限制在已经被费力地装备的数据的一个小的子集;以及(3)即使在可用的情况下,筛选这些信息也是非常乏味的,以至于团队经常事后才发现数据问题。

事实上,数据消费者(产品经理、营销专家、高管、数据科学家甚至客户)通常会在需要使用数据的时候发现数据宕机。不知何故,这总是发生在周五下午晚些时候…

为什么我们对数据基础设施的性能了如指掌,却对数据是否正确知之甚少?

这里一个有用的推论是借鉴基础设施可观测性的世界。几乎每个工程团队都有工具来监控和跟踪基础设施,并保证其按预期运行。这通常被称为可观察性——根据输出来确定系统健康状况的能力。

优秀的数据团队在数据可观察性方面进行投资,即确定系统中的数据流是否健康的能力。可观察性带来了在问题影响数据消费者之前检测问题的机会,然后在几分钟内查明并修复问题,而不是几天或几周。

那么,是什么造就了伟大的数据可观测性呢?根据 100 多个数据团队的经验,我们确定了以下几点:

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

每个支柱都包含一系列问题,这些问题总体上提供了数据运行状况的整体视图。

  • ***新鲜度:*数据是最近的吗?最后一次生成是什么时候?包含/省略了哪些上游数据?
  • ***分布:*数据是否在可接受的范围内?格式是否正确?完成了吗?
  • ***卷:*数据都到了吗?
  • ***模式:*什么是模式,它是如何变化的?谁做了这些改变,原因是什么?
  • ***沿袭:*对于给定的数据资产,受其影响的上游来源和下游资产是什么?谁是生成这些数据的人,谁依赖这些数据来做决策?

不可否认,数据可能会因为各种各样的原因以各种各样的方式被破坏。令人惊讶的是,我们一次又一次地发现,如果对这些支柱进行跟踪和监控,几乎任何有意义的数据宕机事件都会浮出水面。

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

坏数据的好故事

原文:https://towardsdatascience.com/good-tales-of-bad-data-91eccc29cbc5?source=collection_archive---------50-----------------------

当数据中断而无人听到时,它会发出声音吗?

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

本文中的所有插图均由马丁·阿隆索·拉戈提供。

遇见茱莉亚。她是一名数据工程师。Julia 负责确保您的数据仓库和湖泊不会变成数据沼泽,并且一般来说,您的数据管道处于良好的工作状态。

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

Julia 很高兴什么都没发生,但像任何优秀的工程师一样,她知道这几乎是不可能的。所以,她只是想第一个知道问题何时出现,这样她就可以解决它们。

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

见见泰德。他是数据分析师。Ted 被他的公司称为“SQL 大王”,因为他是他们的营销、客户支持和运营团队的查询负责人。他是 Tableau 的专家,知道所有 Excel 的窍门。泰德也很高兴什么都没发生,和朱莉娅一样,知道这是不可能的。然而,Ted 不希望糟糕的数据毁了他的分析,让他和他的利益相关者的生活变得痛苦(后面会有更多)。

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

见见亚历克斯。亚历克斯是一个数据消费者。她可能是数据科学家、产品经理、营销副总裁,甚至是你的 CEO。Alex 利用数据做出更明智的决策,无论是她的新产品应该叫什么名字,还是她应该穿哪双幸运袜去参加明天的董事会议。

Alex,或者公司的其他人,如果不能信任他们的数据,就无法完成他们的工作。我们将这种现象称为数据停机。 数据宕机 指的是数据不准确、丢失或出现其他错误的一段时间,无人幸免,有点像死亡和税收。然而,与死亡和税收不同的是,如果立即采取行动,数据停机是可以很容易避免的。

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

当原始数据被您的数据管道消费时,它本身就是抽象的和无意义的。如果有数据停机,这真的无关紧要,因为除了 Julia,没有人真正利用它来传递数据。问题是,她并不总是知道数据是否被破坏。

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

随着数据在管道中移动,它变得更加具体。一旦它到达公司的商业智能工具,Ted 可以开始使用它,将以前模糊和抽象的东西转化为 Excel 电子表格、Tableau 仪表板和其他美丽的知识容器。

然后,Ted 可以将这些数据(现已接近成熟)转化为可供公司其他部门使用的见解。现在,Alex 可以使用这些数据创建营销宣传材料、pdf 和客户资料,这些数据经过精心处理,非常具体,必将拯救世界。或者是?

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

随着数据错误沿着管道向下移动,数据宕机的严重性会增加。有越来越多的 ted 和 Alexs 使用这些数据,他们中的许多人都不知道他们所看到的是对的、错的还是介于两者之间,直到为时已晚。

你可能会问,什么时候太晚了?

为时已晚的是,Julia 在周一凌晨 3 点被 Ted 呼叫,他的上级经理兼销售副总裁 Alex 打电话给他,就在几分钟前,他还在谈论第二天早上应该向他们的首席执行官提交的一份不可靠的报告。当你浪费了时间、损失了收入、侵蚀了 Alex 和其他人宝贵的信任时,就太晚了。

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

从 Julia 的原始表格中获得的数据越具体、越远,影响就越严重。我们称之为数据焦虑的锥体

灾难降临了,朱莉娅不知道为什么,更不用说它已经发生了。如果她能在数据宕机发生时立即抓住它,而不是通过 Alex 和她的其他数据消费者(在焦虑的圆锥下),灾难就可以避免。

最糟糕的是,她正在做一生一次的梦。棉花糖云,巧克力喷泉瀑布,没有空值。与她周一凌晨 3 点面对的现实完全相反。

听起来很熟悉?是的,我支持你。

如果您经历过数据停机,我们希望听到您的反馈! 伸手 向巴尔亮出自己的好消息坏数据。

本文由 巴尔摩西&马丁阿隆索拉戈 共同撰写。

再见邻居

原文:https://towardsdatascience.com/goodbye-neighbor-c47dc68508da?source=collection_archive---------58-----------------------

紧密结合的社区中的变化如何损害我们的国家,以及数据科学可以做些什么来帮助我们。

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

照片由联合国新冠肺炎回应Unsplash

在他的《消失的邻居:美国社区的转变》一书中,作者马克·邓克尔曼哀叹美国社区的崩溃和几个世纪以来维持这个国家结构和凝聚力的结构的瓦解。这些紧密联系在一起的社区,通过亲密关系和情感联系在一起,一度形成了美国例外论的核心。这些纽带的侵蚀产生了新的社区,由共同的信仰联系在一起。社区中这种巨大变化的影响在很大程度上是负面的。医生和律师、杂货商和水管工之间的偶然联系曾经促进了跨社会经济的辩论,而紧密结合的社区现在鼓励群体思维、结党营私和派系斗争。

这种亲密关系的解体有利于志同道合的关系,导致了共和党和民主党、宗教和世俗、经济困难和富裕之间日益深刻的分歧。它改变了城市规划的方式、科学交流和理解的方式、学术论文如何被同行评议的方式、人们是否享受商业上的成功,并且它促成了平衡的主流新闻的崩溃,有利于未经过滤的偏见。我们国家的两极分化从数据中清晰可见,政党之间的差距随着有偏见的媒体的扩张而同步增长。

人类是群居动物,我们理所当然地享受与他人的亲密关系。这些紧密的联系可能来自我们生活中的许多方面。传统的是通过家庭、学校、社交俱乐部、教堂,以及共同的困难,包括也许是最密切的联系:在一起打过仗的人之间。积极的紧密联系是那些跨文化、跨社会经济和跨意识形态的联系。这些纽带建立在早期美国社区自然发生的邻近和相互依赖的基础上。虽然帮派一直伴随着我们,但任何人都知道,并非所有家庭成员的想法都一样。现在,不幸的是,人们有可能为了一种新的家庭而抛弃血缘和近亲家庭,这种新的家庭基于共同的意识形态。

虽然意识形态团体并不新鲜,但技术已经有效地消除了加入这些团体的任何障碍,包括与属于主张暴力侵害妇女、少数民族、其他民族甚至推翻政府的团体相关的任何耻辱。否认气候变化或进化论等主流科学观点,鼓吹极端主义观点和政策,以及犯罪行为的兄弟姐妹变得越来越容易。

更世俗的紧密组织可以在其他环境中形成,包括工作场所、宗教团体和学校。这些志趣相投的群体倾向于通过排斥不同的人和强化彼此的先入为主的观念来强化彼此在群体中的包容感。虽然看起来是良性的,但这些团体甚至比意识形态团体更具破坏性。他们通过拒绝从多个角度解决问题来扼杀创造力,将那些与众不同的人排除在“外部群体”之外,并制造不信任和次优的工作和学习环境。它们甚至可能成为欺凌、骚扰和旁观者不作为的温床,让这两种情况继续存在。

数据科学是解决邻居消失问题的关键。虽然过去永远不会回来,但未来不一定是排外和意识形态分裂的未来。我们今天看到的红蓝州、富人和穷人之间的裂痕,只是通讯中断和群体间交叉授粉的结果。如同植物一样,思想的自花授粉削弱了我们。它损害了我们作为一个国家在全球舞台上的领导能力。它造成了我们国家政府的僵局,并鼓励浪费和无效的政策妥协。毫无疑问,目前的事态不会自行消失。为了在左派和右派、富人和穷人、少数人和多数人、宗教和世俗、警察和警察之间实现新的对话,我们需要分析这些群体在每种组织中的位置、他们的信仰、他们关注的问题,然后开发打破他们之间障碍的方法。

社交网络分析表明,紧密联系的社区与松散但高度联系的社区(如工作场所)行为不同。虽然工作场所可以包含紧密结合的社区,但项目团队往往是松散结合的,因为它们是人工构建的。在大型组织中,随着时间的推移,内群体和外群体会自然形成[3]。当来自不同群体的人组成项目团队时,这些群体可能会引起问题,并对协作造成反社会障碍。群体内形成往往会导致排斥行为,以及避免寻求对问题的多种观点。在这方面,大数据有助于识别此类群体并确定包容性的障碍。它还可以为内群体和外群体提供交叉互动的方法,这可能会产生更大的包容性和培养更多的创造力。查看组织中个人之间的通信,可以确定组内成员关系。虽然隐私是一个问题,但社交网络分析不需要暴露身份信息(尽管大多数组织都会监控内部通信)。重要的一点是确定哪些地方联系紧密,哪些地方联系松散,并在工作场所的不同人群之间建立额外的联系和互动机会。

紧密团结的群体行为也是科学机构内部的一个问题。当两个紧密结合的结构松散地联系在一起时,科学团体的社会网络就会出现两极分化[4]。通常,一组比另一组更成功,做出更好的决策,而另一组由于不信任另一组,尽管结果和决策更糟,但仍保持其立场。这些两极分化的迷人之处在于,一旦这两个群体形成,比如共和党和民主党,或者保守派和自由派,两极分化就很稳定。该图保留了两个组。例如,在 20 世纪 90 年代,治疗莱姆病的医生分成两个阵营:一派认为莱姆病是一种短期疾病,只需要一个疗程的抗生素,另一派认为它是一种慢性疾病,需要长期使用抗生素。这种分歧导致了现在所谓的莱姆战争,在这场战争中,双方互不信任,双方阵营间的指责像燃烧的箭一样互射。不幸的是,这种两极分化会让双方都更难做出好的决定,因为他们必须与对方保持距离。

在反科学阵营中,群体思维行为鼓励成员在面对与其信念相反的证据时收紧成员关系。因此,科学导致这些群体变得更加封闭。当面对与他们的观点相矛盾的图表时,人们会更加坚持自己的信念。他们寻求相反的错误知识,而且很容易找到。脸书、推特和非传统的新闻来源提供了丰富的替代事实来缓解认知失调,确保人们永远不必改变他们的想法。无论是反疫苗论调、否认气候变化、阴谋论,还是关于冠状病毒的虚假信息,信息的存在是因为人们在寻找它。他们希望这是真的。

跨国公司有时利用这些团体作为武器来攻击对他们的利益不利的科学。例如,忧思科学家联盟发表了一篇揭露埃克森美孚公司如何利用大烟草公司的剧本资助一场攻击气候科学的虚假信息运动的文章[6]。这场运动的一部分是“资助一系列前沿组织,为一群直言不讳的气候变化反对者创造一个广阔的平台。”从本质上讲,mega corp 向许多组织输送了 1600 万美元,这些组织都在宣传少数科学叛教者的错误信息,给人一种这些逆向思维者在社区中拥有广泛支持的印象[7]。

催产素已被证明有助于让关系紧密的群体变得更加包容。在 2017 年的一项研究中,在一项双盲对照研究中,催产素结合积极的社会线索被证明可以减少仇外心理[8]。总的来说,难民和移民的涌入以及领导人发出的混杂信号鼓励了仇外心理。基于国籍或文化的群体内和群体外行为的加剧会鼓励暴力以及更微妙形式的歧视。因此,重要的是要减轻。虽然研究人员依赖于鼻内注射,但拥抱和其他形式的社交接触也可以促进催产素的自然产生。然而,很难看到人们都吸食催产素或随意拥抱彼此。

许多意识形态团体并不紧密,这是社交网络和文本分析可以提供的一条关键信息。对反疫苗父母的多项研究表明,公共宣传活动是无效的。当面对疫苗有效性和安全性的科学证据时,父母们更加确信疫苗是有害的[9][10]。在去年发表的一项关于脸书反疫苗运动的研究中,研究人员发现反疫苗网络大多是“小世界”,意思是由更长的链接相互连接的集群。大多数成员是妇女。文本分析显示,话语主要围绕着对政府结构性压迫的愤怒,典型的阴谋论者。然而,一个重大发现是,反疫苗团体并不紧密[11]。他们是而不是相互支持的高度关联的团体。相反,他们通过意识形态和短暂的评论松散地联系在一起。换句话说,大多数反 vaxxers 倾向于喜欢或分享页面,但不一定得到太多支持。这表明,有效的宣传活动可能不是全球性或全国性的广告闪电战,而是针对有孩子的妇女倾向于加入或联系(或吸引她们加入此类团体)的紧密团体,利用与更大社区的外部社会联系。由于许多反对疫苗的父母都是在家上学的人,但在家上学的人很少都反对疫苗,瞄准在家上学的群体可能是一个好的开始。

虽然阴谋论团体往往存在于主流之外,但主流政治观点的两极分化是一个更大的问题,一个目前正在将这个国家撕成碎片的问题。2012 年,在总统选举前夕,《纽约时报》在“消失的战场”中报道说,这个国家被沿海的纯蓝州和内陆的纯红州所主导[12]。然而,学术界和公众的一个普遍误解是,Twitter、博客、脸书和其他社交媒体往往被分为左翼和右翼,它们之间很少进行民事辩论。该理论认为,社交媒体让用户能够通过算法过滤掉任何观点不一致的新闻来源。近年来,许多研究试图建立社交媒体“回音室”的模型,但没有分析该假设是否成立。然而,2014 年一项被高度引用的研究和 2015 年的一项后续研究表明,社交媒体使用的增加导致人们接触不同意见的可能性增加。这是一个好消息,因为它表明,尽管社交媒体有很多缺点,但它有利于恢复过去失去的一些跨意识形态的联系。虽然偶遇在现实生活中不太常见,但在网上我们往往会遇到我们的朋友、家人和同事。此外,人们更有可能在网上分享他们的政治观点,而不是面对面。然而,社交媒体公司可以做得更多,例如使用类似麻省理工学院推荐系统的东西,有目的地向用户呈现可能与他们不同的意见[15]。因此,数据科学可以帮助调整算法,以减少两极分化的意见领域之间的冲突。

看起来,这些过去的社区远没有消失,可能正在向网上转移。与此同时,对失去这些社区的道德恐慌可能被夸大了。正如 17 世纪哲学家托马斯·霍布斯在他的班级利维坦中哀悼的那样,《迷失与拯救……再一次:关于失去社区的道德恐慌占据了社交媒体》的作者认为“在我们讨厌智能手机之前,我们讨厌城市”【17】。两千年前,苏格拉底和柏拉图抱怨说,书写的发明正在腐蚀人们[18]。今天的美国正在经历类似的剧变。

这并不意味着美国今天所面临的问题没有一个是真实的,也不意味着它们不是源于文化的转变,从城市化到 24 小时媒体渠道的增长,再到中产阶级化所带来的社会的日益隔离。这也不意味着不需要做任何事情来阻止困扰我们国家的尖酸刻薄的浪潮。这是社交网络分析和数据科学展示正在发生的事情和前进方向的地方。

社交媒体非但不是美国文化消亡的罪魁祸首,反而可能是它的救星。尽管脱口秀、有线新闻和从布莱巴特到沙龙的在线新闻渠道能有效地维持它们的意识形态泡沫,但社交媒体的漏洞要多得多。大多数人与他们在学校、教堂和其他宗教组织、工作、家庭中认识的人保持社会关系,所有这些领域曾经构成了美国主街的支柱。他们可能并不都彼此同意,许多人可能会寻求更多的意识形态社区,但是,鉴于他们的单维度和这种社区在微小差异下分裂的趋势,他们远不是可靠的情感支持来源。说到相互支持,人们会像往常一样,向网上的朋友和家人求助。随着越来越多的人上网并与他人联系,随着社交媒体找到鼓励跨意识形态对话的方式,美国可能会回到一个更加和平和富有成效的时代。

[1]邓克尔曼,M. J. (2014)。消失的邻居:美国社区的转变。美国:诺顿。

[2]多尔蒂,卡罗尔。《关于美国两极分化的 7 件事》皮尤研究中心 (2014 年)。

[3]工作中的大数据:数据科学革命和组织心理学。(2015).联合王国:泰勒和弗朗西斯。

[4]科学中的群体思维:贪婪、病态利他主义、意识形态、竞争和文化。(2020).德国:斯普林格国际出版公司。

[5]贝克,J. (2017)。这篇文章不会改变你的想法。大西洋13

6 忧思科学家联盟。(2007).烟雾,镜子&热空气:埃克森美孚如何利用大烟草公司的策略制造气候科学的不确定性。忧思科学家联盟。

[7]塑造信息,扭曲科学:影响科学政策的媒体策略:众议院科学技术委员会调查和监督小组委员会听证会,第 110 届国会,第一次会议,2007 年 3 月 28 日。(2007).美国:美国政府印刷局。

[8]尼娜·马什、德克·舍勒、贾斯汀·s·范斯坦、霍尔格·格哈特、萨布丽娜·斯特朗、沃尔夫冈·迈尔、勒内·赫勒曼。催产素和社会规范减少仇外心理。美国国家科学院院刊 2017 年 8 月,201705853;DOI:10.1073/PNAS。56676.88868688666

[9] Nyhan,Brendan 等,“疫苗推广中的有效信息:一项随机试验。”儿科 133.4 (2014): e835-e842。

[10]海伦·贝德福德。“在对疫苗犹豫不决的父母中,支持疫苗的信息可能会适得其反.” BMJ 循证医学19.6(2014):219–219。

[11]史密斯、内奥米和蒂姆·格雷厄姆。"描绘脸书的反疫苗运动."信息、传播&社会22.9(2019):1310–1327。

[12]利普塔克(2012 年 11 月)。消失的战场。纽约时报,SR1。

[13] Lee,Jae Kook 等,“社会媒体、网络异质性和意见极化”传播学杂志64.4(2014):702–722。

[14] Choi,Jihyang 和 Jae Kook Lee。"调查新闻分享和政治兴趣对社交媒体网络异质性的影响."人类行为中的计算机44(2015):258–266。

[15] Musco,Cameron,Christopher Musco 和 Charalampos E. Tsourakakis。"最小化社会网络中的两极分化和分歧."2018 环球网大会议事录。2018.

[16]汉普顿,基思·n .和巴里·韦尔曼。“迷失和拯救……再次:关于失去社区的道德恐慌占据了社交媒体。”当代社会学47.6(2018):643–651。

[17]霍布斯,托马斯。利维坦。联合王国,新名词,1676 年。

[18]柏拉图的菲德鲁斯。(2009).(n.p.): Agora 出版公司

用自然语言处理检测自杀帖子

原文:https://towardsdatascience.com/goodbye-world-4cc844197d51?source=collection_archive---------34-----------------------

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

插图:何

机器学习和 NLP 如何帮助国家自杀预防策略

坐在床上。唱了整首歌,还哭了一会儿。。。请停止这悲伤的举动。他妈的让它停下。

17 岁的维多利亚将此记录在笔记本电脑上的秘密日记中。几周后,她从新加坡一栋公寓楼的 10 层楼高的楼顶坠落,结束了自己的生命。

她的死亡是全球每年 80 万自杀死亡的惊人数据的一部分。世界卫生组织建议各国制定国家自杀预防战略,包括发起旨在“早期识别易受自杀风险影响的群体”的倡议。

基于文本的数据,如维多利亚日记中的文字和在线自杀援助社区线索,可能只是早期识别有自杀风险的个人的线索。

寻找虚拟的自杀笔记

遗书曾经是一个人结束自己生命的最后交流方式。但社交媒体和 Reddit 等在线社区的兴起为个人创造了安全和匿名的空间,让他们变得脆弱,分享他们对自己精神健康的想法和自杀的计划。

我们的项目旨在使用自然语言处理(NLP)工具来分析来自两个支持社区的文本数据,并了解虚拟遗书中使用了哪些单词。在机器学习分类器的帮助下,我们旨在准确识别有自杀风险的个体。

有细微差别的两个子街道

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

显示每个子编辑中单词使用频率的单词云。出现的次数越多,单词就显得越大。

为了解决我们的问题陈述,我们需要选择两个子主题,这两个子主题将为我们提供合适的数据来识别处于风险中的个体。虽然大多数抑郁症患者不会死于自杀,但美国卫生与公众服务部表示,与没有抑郁症的人相比,患有严重抑郁症的确实会增加自杀风险

在 Reddit 上,我们发现了两个抑郁症和自杀的支持社区。快速浏览这些帖子可以发现,这些帖子确实是寻求帮助的在线空间。因此,很好的论坛让我们产生关于人们精神状态的真实文本数据。

这是我们的两个子主题和它们的标语(暗示了它们的使命陈述):

r/depression——“因为没有人应该独自在一个黑暗的地方”
(63.3 万成员)

r/suicide watch——“对任何有自杀想法的人的同伴支持”(20 万成员)

子网格的特征

  • 活跃帖子—两个子网站每天都有超过 100 个帖子,回应者提供他们的帮助和对他们想法的评论。****
  • 低钓鱼率 —很少有钓鱼帖子寻找产品广告或制造“垃圾邮件”。
  • 主要基于文本的数据——不像其他 Reddit 主题,如 r/青少年,迷因主导了对话(对 NLP 项目不会是有用的数据),这两个子主题几乎没有发布图像。
  • 相同但不同——虽然两个子主题都是同行支持论坛,但 r/SuicideWatch 中使用的语言似乎对它们更具紧迫性和直接性。这里使用的短语包括:“现在差点开枪自杀”“我想得冠状病毒而死”。识别一个有抑郁想法的人和一个有自杀风险的人所使用的语言之间的差异,对于一线的专业人士,如咨询师、教育家和精神病学家来说是有用的。**

方法

  • 数据收集——我们的旅程从通过 Reddit 的 API 收集数据开始(这个 API 只允许我们在每个 subreddit 上获得大约 1000 个独立的帖子)。
  • 清理 —我们的下一步是清理并考虑数据集中缺失的值。在自杀观察中,一个常见的情况是用户只在标题栏中输入内容,而将帖子栏留空。
  • 预处理 —我们将构建一个预处理功能,帮助将文本转换为小写,删除标点符号,将相关单词简化为一个常见的基本单词。
  • 探索性数据分析(EDA) —使用计数矢量器,我们分析了每个子主题中最常用的词,以便更好地理解我们的数据(使用的词相似,但有一些细微的差异)。
  • 试听模型 —使用交叉验证的网格搜索,我们对不同的分类器模型进行评分,如 K-最近邻和多项式朴素贝叶斯,最终确定了最终的生产模型(TF-IDF 矢量器+多项式朴素贝叶斯)。

文本分析

作为 EDA 流程的一部分,我们分析了帖子、标题和用户名中的词频。以下是一些发现:

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

来自 r/depression 子编辑帖子的前 20 个单词

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

自杀观察子编辑帖子中的前 20 个单词

  • 许多相似的词——我们在我们的“前 20 个词”中看到大量相似的词,来自两个子主题,如 wa,want,like,feel,lifepeople 。这可能会使我们的模型难以区分这两个子网格。但这也是令人鼓舞的,因为这种相似性表明,我们为自己提出的问题实际上可能是一个挑战,而数据科学可能对这个挑战有用。
  • 想要和感觉的区别——有趣的是,在 r/SuicideWatch 的帖子中,最热门的词是“想要”,与“感觉”相比,它的使用次数超过了两倍。在 r/depression 中,最常用的词是“感觉”,同样,它的使用次数是“想要”的两倍。
  • 一次性账户占主导地位——有 67 个账户名称(1897 个)包含“一次性”一词。一次性帐户是那些想保持匿名的用户使用的临时帐户。考虑到心理健康这一敏感话题,这是可以理解的。
  • 大麻链接——420,或“420”,大麻代码进入了我们的抑郁症前 20 名。在未来的项目中,在我们的帖子中寻找与药物使用的联系可能是值得的。
  • 男性符号——我们的抑郁症前 20 名名单被用户名中的“先生”、“男人”、“男孩”、“男人”所占据。在我们所有的作者名单中,男性相关的名字(68 个)比女性相关的名字(15 个)要多。这与我们的目标没有很强的联系,但值得注意的是,自杀研究中有一个性别悖论,它观察到女性有更多自杀想法而男性自杀更频繁的现象。

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

“散点图”显示了每个子编辑帖子中的文本频率。每个点代表一个单词。图右上方的点表示在两个子数据中频繁出现的单词。

员额长度

r/depression 帖子的平均长度比 r/SuicideWatch 短了将近 130 个字。虽然,正如我们从下面的散点图中看到的,这些数字可能会被 r/SuicideWatch: 一些极长的帖子和完全空白的帖子中的异常值扭曲。

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

创建可靠的分类器

我们决定将我们的标题、用户名和帖子合并到一个单一的特征中,以馈入生产模型,这是一个词频率-逆文档频率矢量器和多项式朴素贝叶斯分类器的组合。

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

不同模特试镜的结果。

TF-IDF 矢量器为我们选择的特征中的单词(或者在我们的例子中,前 70 个单词)分配分数。TF-IDF 将对文档中出现频率过高的单词进行处罚。

“单词得分”矩阵然后被转移到多项式朴素贝叶斯分类器中,该分类器基于给定单词落入某一类别的概率的计算来进行预测。

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

我们的生产模型之所以被选为最接近的竞争对手(哈希矢量器),是因为它具有稍高的召回分数。

召回/灵敏度测量正确阳性标记(在自杀监视中)与所有真正处于自杀监视中的人的比率。因为这是我们项目的目标,模型在这个指标上表现良好对我们来说很重要(也许是最重要的)。

该模型也被证明泛化能力很好,从其训练到测试集分数只有 0.02 的变化。

维多利亚的日记

在评估我们的结果后,我们将我们的模型应用于维多利亚日记的摘录,她的父母提供了这些日记,作为心理学家杰西·白令为他的书自杀:我们为什么自杀所做的研究的一部分。**

将我们的模型应用于维多利亚的作品,可以让我们看到我们的模型——根据在线社区的数据训练——是否可以很好地推广到一个看不见的测试集。在这种情况下,个人的话。

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

这个柱状图展示了我们的模型对《维多利亚的日记》中的条目所做的预测。如果我们只看“纯”日记条目(即不包括信件、遗书和诗歌),该模型将 70.6%归类为“自杀”类别。

我们的数据集还包含了维多利亚的遗书,在她身上发现的。这是一个清晰而简短的信息:“如果我大脑受损,我不想活下去。我不想成为植物人”。我们的模型将此归类为“自杀”类别。

利用社会心理学家罗伊·鲍梅斯特的理论,白令将维克日记的不同部分绘制成六个不同的渐进阶段,从“达不到期望”(第一阶段),到“高度自我意识”(第三阶段),再到最后的“去抑制”。

该模型没有显示出任何与鲍梅斯特的六阶段范式相匹配的清晰模式(即,更多的自杀分类在后期阶段)。但这可能是因为我们每个阶段只能访问大约 10 个条目。获得更大的数据集将是有趣的,像 Bering 这样的研究人员已经将这些数据集分为不同的阶段。

在分析模型应用的结果时,我们必须首先解决数据中存在的一些“噪声”。尽管我们的模型是在在线支持社区的帖子上训练出来的。我们觉得用在维多利亚的日记条目上很合适,因为维多利亚也写得像是在给第三个人写信(事实上,她把日记命名为洛林)。

然而,有些参赛作品是维多利亚的诗。她诗歌中的许多句子(如涂着尘垢的木炭街道。生锈的灯柱下闪闪发光的水珠。)用比喻代替“直接引语”。因此,我们的模型对她日记中的诗做出决定可能是不准确的。(注意:在我们数据中的六首诗中,模型预测其中一半属于“自杀”类别)**

然而,像维多利亚的诗可能是这个项目未来迭代的潜在研究领域。创造性写作样本可能是个人(例如,教室里的学生)透露他们私人想法的一种方式。

评估和未来发展

  • TF-IDF 矢量器挑选的热门词汇 —需要注意的是,矢量器对“感觉”的加权高于“想要”,尽管(如我们之前的 EDA 中所见),“想要”在自杀帖子中出现的次数多于“感觉”。这可能是因为 TF-IDF 对出现过多的单词进行了处罚。尽管如此,这组单词可能是建立其他模型的良好起点,这些模型可能能够预测自杀个体的存在,例如教师的子编辑。
  • 双重发帖现象——在我们的探索性数据分析中,我们注意到大约有 26 例个人在两个子帖子上发帖。我们看的例子是一个用户,@thambletrascan3 月 4 日在 r/depression 上发帖说“我不想死,但我也不想再活下去了”。一天后,@thathumbletrashcan 访问了 r/SuicideWatch 论坛并发布了“我终于有勇气实现我的计划了……你们所有人都不用再和我打交道了”鲍梅斯特假设一个人分六个阶段“跌入自我消亡的深渊”。透过鲍梅斯特的理论来研究双重发帖可能会发现 Redditors 之间基于阶段的进展的联系。
  • 调查男性自杀事件 —根据新加坡撒马利亚人组织的数据,2018 年男性占所有自杀事件的 71%以上。这与我们在用户名中男性符号的 EDA 发现是一致的。未来的项目可以更深入地研究男性自杀问题。这可能与石油/天然气、银行和科技等男性主导的高压力行业的公司有关。
  • 抑郁症的复杂性 —抑郁症是复杂的,有层次的。与具有领域知识的专家合作可能有助于我们模型的未来发展,这些专家可以帮助我们筛选出可能与自残/强迫症/焦虑等其他疾病相关的因素?

参考

自杀的性别差异。维基百科,维基媒体基金会,2020 年 2 月 9 日,https://en . Wikipedia . org/wiki/Gender _ differences _ in _ sudditive。

了解自杀-快速的事实。新加坡撒玛利亚会,3 月 10 日。2020 年,https://www.sos.org.sg/learn-about-suicide/quick-facts

斯旺森巴雷特。“自杀的两面”《纽约客》,《纽约客》,2019 年 1 月 17 日,www . New Yorker . com/books/under-review/The-two-faces-of-suite。

预防自杀:全球当务之急。世界卫生组织,2014。

美国卫生与公众服务部。"抑郁会增加自杀的风险吗?"hhs.gov,2015 年 8 月 21 日,www . hhs . gov/answers/mental-health-and-substance-abuse/does-depression-increase-risk-of-自杀/index . html

百玲杰西。自杀:我们为什么自杀。芝加哥大学出版社,2018 年。

代码&触点

github
https://github.com/hesamuel/goodbye_world

数据集
https://github.com/hesamuel/goodbye_world/tree/master/data

领英
https://www.linkedin.com/in/samuel-he/

电子邮件
samuelhezhengbang@gmail.com

用于乳腺癌检测的谷歌人工智能击败了医生。

原文:https://towardsdatascience.com/google-ai-for-breast-cancer-detection-beats-doctors-65b8983352e0?source=collection_archive---------9-----------------------

谷歌开发的人工智能检测乳腺癌的准确率更高

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

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

人工智能的目标是创造能够以智能(类似人类)的方式运行的算法、机器人和技术。谷歌的一个人工智能工具显示了检测乳腺癌的技能,这些技能与训练有素的医生的技能类似,如果不是更好的话。

在《自然》杂志发表的一项研究中(见此处),谷歌开发的一种人工智能(AI)改善了乳腺癌的早期检测过程,减少了假阴性和假阳性。

问题是

乳腺癌是女性癌症死亡的第二大原因。乳腺癌的一个关键方面是早期检测,这可以大大改善乳腺癌的预后。从 40 岁到 50 岁的女性经常被建议去做乳房 x 光筛查。尽管这些措施有助于早期检测,但由于难以正确解释筛查图像,仍可能存在假阴性的情况。

假阴性是指医生错误地诊断为阴性,而实际上患者患有乳腺癌。这只会使乳腺癌在发展过程中变得最难治疗,一旦肿瘤的可见性增加,就会被发现。

用于乳腺癌检测的人工智能工具解释道:

谷歌开发的人工智能分析了 X 射线图像,即乳房 x 光照片,并将美国女性的假阴性率降低了 9.4%,假阳性率降低了 5.7%。而对英国女性来说,它减少了 2.7%的假阴性和 1.2%的假阳性。

虽然这个系统在大多数情况下都优于医生,但也有其他情况下,医生标记了 AI 模型错过的乳腺癌。

谷歌开发的这个新的人工智能工具只是计算机视觉领域许多新技术发展中的一个。这个领域在最近几年有了很大的进步。在过去的 10 年里,算法更有能力检测对象和分析大型视觉数据集。深度学习领域(机器学习的一个分支)带来了所谓的神经网络,作为分析大型复杂数据集的一种方法。此外,卷积神经网络(CNN)是计算机视觉领域的一场巨大革命。

除了谷歌人工智能能够比医生更准确地检测乳腺癌,CNN 还允许许多其他应用,如人脸识别,监控,生物识别和自动驾驶。

计算机视觉问题主要是定位、图像分类和目标检测等任务。

根据研究论文,这是人工智能的结构:

“人工智能系统由三个深度学习模型组成,每个模型都在不同的分析水平上运行(单个病变、单个乳房和整个病例)。每个模型为整个乳房 x 线照相术病例产生 0 到 1 之间的癌症风险评分。系统的最终预测是三个独立模型预测的平均值。”

乳腺癌检测问题是一个图像分类问题。其中乳腺癌图像必须被分类为阳性或阴性。根据研究论文的补充信息,该信息涉及为该人工智能开发的算法,实现了 CNN。

这对未来意味着什么(结论)

人们很容易认为机器时代即将到来,但事实上,这些工具仅仅是工具。最终,它们将被医生(放射科医生)用来提高诊断水平。一旦被医生完全采用,这种对科学的贡献肯定会拯救生命。

毫无疑问,对于计算机视觉领域来说,这是一个充满希望的时代,计算机视觉是人工智能的一个非常重要的分支。

谷歌分析数据导入——4 种方式

原文:https://towardsdatascience.com/google-analytics-data-import-4-ways-8aeb8eb20738?source=collection_archive---------25-----------------------

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

来源: Unsplash

了解如何使用 Google Sheets 插件、API 和 Apps 脚本以及开箱即用的解决方案将成本数据手动导入 Google Analytics

如果您使用多个广告服务和平台来宣传您的产品,将所有广告数据组合在一个界面中是一个好主意。这带来了一些巨大的优势:

  1. **节省时间。**你不需要永远在谷歌广告、脸书、Instagram 和其他服务之间切换来评估广告工作的效率。
  2. **2。允许您比较一个系统中所有服务的性能。**除了成本数据,您还可以将广告服务的其他信息发送到 Google Analytics,以深入分析您的活动、广告和关键词。通过比较所有流量来源的浏览量、广告成本、CTR 和 roa,您可以使用这些数据来决定您的渠道是否有回报并重新分配您的预算。

您可以转到收购—活动—成本分析,在 GA 报告中查看这些数据。

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

图片由作者提供

**3。让您使用谷歌分析的附加功能。**如果您将成本数据导入 Google Analytics,您可以在不同的归因模型中使用这些数据,并将计算结果与 ROI 进行比较,以正确地对您的营销渠道进行评分。

这些结果也可以在 GA: 转换—归因—模型比较工具中跟踪。

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

图片由作者提供

如何将成本数据导入 Google Analytics

将成本数据从 Google Ads(以前的 AdWords)导入 GA 非常容易,因为这两个服务之间有一个本地集成。要从其他广告服务导出成本数据,您可以执行以下操作之一:

  • 通过 GA 界面手动导入。
  • 使用 Google Sheets 的特殊插件导入。
  • 通过 API 和 Google Apps 脚本使用半自动导入。
  • 使用现成的解决方案。

我们将仔细查看不需要 IT 专家任何帮助的选项(如 API 替代方案),以便您可以了解更多有关如何在 GA 中导入成本数据以及使用现成解决方案的信息。

请注意,我们提到的所有四个选项都需要在您的活动中使用正确的正确的 UTM 标签:

  • 必需的:utm_source,utm_medium,utm_campaign。
  • 可选:utm_term,utm_content。

一旦用户点击你网站的链接,UTM 标签的值就会被发送到谷歌分析。

1.通过谷歌分析导入成本数据

使用这种方法,你必须用广告服务中的数据填写一个 CSV 文件,并在每次需要报告时手动上传到 Google Analytics。如果您有两个或三个频道,并且您希望每个月都有这些频道的数据,这种手动方法很好。但是当涉及到几十个渠道时,就变得非常复杂和耗时。

将成本数据导入 Google Analytics 有三个步骤。

第一步。在谷歌分析中创建一个数据集。

进入管理面板—数据导入—创建:

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

图片由作者提供

然后选择成本数据,点击继续:

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

图片由作者提供

命名您的数据集,并选择要将成本数据上传到的 GA 视图。点击继续:

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

图片由作者提供

现在,通过选择从广告服务导出到 Google Analytics 的参数来确定数据集结构。有三个自动填写的必填字段:日期、来源和介质。还有一组字段至少需要一个参数:点击数、成本和印象数。

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

图片由作者提供

第三组字段是可选的。在这里,您可以添加使用 UTMs 收集的任何额外信息,例如,关键字或广告内容。

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

图片由作者提供

导入行为下,选择当导入的数据重复时,例如当关键字已经上传到 GA 时,您想要做什么。如果要将新数据添加到现有数据中,选择求和。如果想用新数据替换现有数据,选择覆盖。接下来,保存更改,您将在数据导入菜单中看到一个新的数据集:

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

图片由作者提供

第二步。创建要上传的 CSV 文件。

一旦你创建了数据集,你需要准备一个 CSV 文件,用广告服务的成本、点击和其他指标的数据填充它,并上传到 Google Analytics。不要忘记在 CSV 文件中使用与步骤 1 中的数据集中相同的数据结构。你可以在谷歌分析帮助中阅读更多关于如何正确建立上传成本数据的文件。

第三步。将 CSV 文件上传到 Google Analytics。

此时,您的数据已经收集完毕,CSV 文件也准备好了。现在该送 GA 了。为此,导航回数据导入并点击上传文件:

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

图片由作者提供

在您的计算机上选择包含成本数据的 CSV 文件,并确认上传:

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

图片由作者提供

如果 CSV 文件填写正确,您将看到状态为“已完成”。处理数据并将其添加到您的报告中大约需要 24 小时。

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

图片由作者提供

如果您在导入数据时看到错误,请在 Google Analytics 帮助中查看可能的问题和解决方案

2.使用 Google Sheets 插件导入成本数据

如果您已经在 Google Sheets 中收集了成本数据,您可以避免 CSV 文件带来的麻烦。只需使用免费的 OWOX BI 数据上传插件,将您的成本数据从 Google Sheets 直接发送到 Google Analytics。如果上传的数据中有任何错误,插件会建议如何更正。

要使用 OWOX BI 数据上传插件导入数据,您需要在 GA 中创建一个数据集,并下载和安装该插件。接下来,打开一个结构合理的成本数据表(类似 GA 中的数据集,点击附加组件OWOX BI 数据上传上传数据:

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

图片由作者提供

然后在 GA 中选择您想要上传费用的帐户、web 属性和数据集,并单击验证&上传

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

图片由作者提供

太好了,24 小时后,您将在 GA 报告中看到添加的数据。

3.使用 API 和 Apps 脚本导入成本数据

这个数据导入选项是半自动的。下面是如何设置的:在 GA 中创建一个数据集,同时在 Google Sheets 中创建一个成本数据表,剩下的工作将由 Google Apps 脚本完成。查看本指南以了解更多关于通过 API 导入的信息。

但是,请记住此选项的缺点:

  • 有大量现成的脚本,但你必须配置它们,并知道正确的应用程序脚本语法来使用它们。
  • 你必须手动或通过另一个 API 和应用程序脚本在 Google Sheets 中收集数据,甚至使用特殊服务。
  • 你必须坚持某种格式,否则你会在数据中看到错误或不确定性。

4.通过特殊服务自动导入成本数据

大多数电子商务项目使用其他广告平台和谷歌广告。因此,这些项目必须仔细跟踪他们的成本,以快速反应和重新分配他们的营销预算。这就是为什么手动上传数据肯定太耗时。但是有工具可以解决这个问题,帮助营销人员和分析师摆脱常规工作。下面是我们对这个问题的解决方案,我们称之为 OWOX BI Pipeline

目前,您可以使用 BI Pipeline 从脸书、Instagram、LinkedIn、Criteo 和 Yandex 自动将数据导入 GA。直接,Yandex。Market、MyTarget、AdRoll、Trafmag、Bing Ads、Twitter Ads、Sklik、Outbrain、Yahoo Gemini 和 Hotline。

OWOX BI 还可以扩展缩短的链接,识别广告活动中的动态参数,检查 UTM 标签,并通知您标签中的任何错误。最重要的是,Pipeline 将您使用的广告服务货币转换为 GA 中的货币。

如果您需要分析之前一段时间的数据,可以在 OWOX BI 设置中设置一个特殊选项,从 GA 获取过去六个月的历史数据。

此外,如果广告服务的数据有任何变化,Pipeline 会追溯更新上传到 GA 的数据(最多 21 天)。感兴趣了吗?在 7 天的试用期内,您可以免费试用所有这些功能。

但是关于 BI 管道的优点已经足够了。下面说说怎么用吧。您首先需要 GA 中的数据集,然后设置 OWOX BI 管道。

如果你还没有 OWOX 商业智能项目,用你的谷歌账户设置它。然后导航到管道,创建一条管道,选择数据源:

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

图片由作者提供

接下来,提供对广告服务的访问:

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

图片由作者提供

并提供访问您的 Google Analytics 帐户的权限:

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

图片由作者提供

在 Google Analytics 中选择数据集以上传成本数据:

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

图片由作者提供

现在设置导入数据的开始日期(默认情况下,是当前日期)。您可以将其更改为过去或未来的日期。现在选择一个视图并点击创建:

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

图片由作者提供

哒哒!管道已设置就绪。数据将在大约 36 小时后在 GA 报告中提供。OWOX BI 需要 12 个小时来处理数据,GA 需要 24 个小时来处理数据。

自由职业者协会

如果我只需要单个活动的数据,该怎么办?

您可以使用此活动的数据创建一个 CSV 文件,并将其手动上传到 GA。自动导入只能让您上传多个活动的数据。不过,您可以设置过滤器来查看您需要的活动信息。为此,在 g a 中创建数据集时选择活动参数:

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

图片由作者提供

之后,进入采购—活动—成本分析,将活动设置为主要维度,查看跨活动的报告。

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

图片由作者提供

如果我需要的参数比 GA 中的数据导入允许的多怎么办?

如果你需要成本数据模式中没有的信息,你可以从 Google BIgQuery 的广告服务中收集和组合数据。OWOX BI Pipeline 允许您从脸书 Ads 向 BigQuery 发送完整的数据(参见数据模式)。

如何将成本数据从没有与 OWOX BI Pipeline 集成的来源导入 GA?

BI Pipeline 使用广告服务的官方 API。对于不提供 API 或者没有与 OWOX BI 集成的服务,有一个手动上传选项。它不同于 GA 手动上传方法,因为您不必形成和上传 CSV 文件,您可以在 OWOX BI 界面中完成。

我如何计算 roa 并考虑不在 GA 中的退款和已完成订单?

您必须使用 BigQuery 将来自 CRM 的已完成订单数据与来自 ad services 和 GA 的数据进行合并。这也将允许您建立一个基于漏斗的归因模型,并在考虑离线订单时评估您的活动。

结论

为了比较你的广告渠道的表现,你需要在一个单一的系统中收集数据,如谷歌分析。导入成本数据的最佳方式取决于您使用的广告服务数量以及您需要广告服务报告的频率。

如果您使用两三个广告服务,并且不经常需要报告,您可以手动将成本数据上传到 GA。否则,考虑使用 OWOX BI 之类的特殊服务来自动上传成本数据。

谷歌分析数据与 R

原文:https://towardsdatascience.com/google-analytics-data-with-r-32caf8956c94?source=collection_archive---------14-----------------------

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

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

**目标:**以编程方式检索营销分析自动化的谷歌分析数据。

访问 Google Analytics API 来检索 GA 记录是构建端到端营销分析套件的基本要求之一。我们可以通过下面列出的四个主要步骤来实现这一目标:

  1. 在 Google Cloud 中生成客户端 ID 和密钥。
  2. 更新。伦美龙变量。
  3. 导入相关库并在本地刷新 GA 令牌。
  4. 最后,在 r 中构建 GA 数据集。

第一步。在 Google Cloud 中生成客户端 ID 和密钥

步骤 1.1。创建谷歌云项目:登录 谷歌云控制台 创建项目。

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

创建谷歌云项目(图片由作者提供)

第 1.2 步。谷歌分析报告 API:一旦你创建了项目,导航到项目的 API 和服务部分,并启用“谷歌分析报告 API”。

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

谷歌分析报告 API 1(图片由作者提供)

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

谷歌分析报告 API 2(图片由作者提供)

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

谷歌分析报告 API 3(图片由作者提供)

第 1.3 步。配置 OAuth 同意屏幕:如果您是第一次设置 Google Cloud 项目,您必须在生成凭证之前配置 OAuth 同意屏幕。确保在项目范围中选择分析报告 API,在同意屏幕中输入应用程序名称和支持电子邮件。

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

配置 OAuth 同意屏幕 1(图片由作者提供)

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

配置 OAuth 同意屏幕 2(图片由作者提供)

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

配置 OAuth 同意屏幕 3(图片由作者提供)

第 1.4 步。创建 OAuth 客户端 ID:配置 OAuth 同意屏幕后,创建 OAuth 客户端 ID 凭据。以 JSON 文件的形式下载客户机 ID 和密钥,并将其存储在当前的工作目录中。

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

创建 OAuth 客户端 ID 1(图片由作者提供)

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

创建 OAuth 客户端 ID 2(图片由作者提供)

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

创建 OAuth 客户端 ID 3(图片由作者提供)

第二步。更新。Renviron:编辑。Renviron 通过整合最新的谷歌云项目证书

第 2.1 步。打开。Renviron 在 R 中使用以下命令并更新参数:

usethis:: edit_r_environ()

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

更新。伦美龙(图片由作者提供)

第三步。GA 认证:启动一个 R 会话并提前导入所有相关的库

googleAnalyticsR 和 googleAuthR 是列表中的必备。确保在加载 googleAnalyticsR 和 googleAuthR 包之前使用’ gar_set_client()'函数。此外,指出 gar_auth()函数中“刷新令牌”的位置。

googleAuthR:: gar_set_client( "C:\\Users\\Sree\\gcp_client.json")library(googleAnalyticsR)
library(googleAuthR)
library(tidyverse)
library(lubridate)
library(dplyr)googleAuthR::gar_auth(token = "sc_ga.httr-oauth")

在执行上述命令时,您将能够通过自动刷新令牌经由 R 成功登录到 Google Analytics 报告数据库。

第四步。Google 分析报告 API:在 R 中构建 GA 报告

第 4.1 步。从 GA 获取视图列表:

确定您需要从谷歌分析的视图的完整列表。通过使用 googleAuthR 包中的“ga_account_list()”函数或通过从 Google Analytics 本身识别他们来获取他们的 ViewId。

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

谷歌分析报告 API(图片由作者提供)

my_accounts <- ga_account_list()
viewId <- (my_accounts$viewId)

第 4.2 步。通过查询 Google Analytics 报告服务器构建数据集:

为了便于说明,我在这里构建了一个循环,为 Google Analytics 中设置的所有视图顺序下载数据。

ga_data_final <- data.frame()for (i in viewId) {
  ga_data_temp <- 
    google_analytics(i, 
                     date_range = c(GoogleA_Start, GoogleA_End),
                     metrics = c("sessions"),
                     dimensions = c("date"
                                 ,"channelGrouping"
                                 ,"deviceCategory"
                                 ,"source"),
                     anti_sample = TRUE,
                     #slow_fetch = TRUE,
                     max = c("-1"))
  ga_data_temp$viewId <- i
  ga_data_final <- rbind(ga_data_final, ga_data_temp)
}

第 4.3 步。清理数据集:

GA_export <- 
  left_join(ga_data_final,my_accounts, by = "viewId") %>%
  select(date,channelGrouping,deviceCategory,source,sessions,Country) %>%
  mutate(channelGrouping_refined = if_else(
  channelGrouping == 'Organic Search','SEO',
  if_else(channelGrouping == 'Paid Search','PPC Search',
  if_else(channelGrouping == 'Display', 'PPC Display',
  if_else(channelGrouping == 'email,email','EDM',
  if_else(channelGrouping == '(Other)', 'Unspecified', channelGrouping  
  )))))) %>% select(date,channelGrouping,deviceCategory,source
  ,sessions,channelGrouping_refined,Country)rm(my_accounts,ga_data_final,ga_data_temp,i, viewId)

第 4.4 步。发布数据集:

这是谷歌分析报告服务器最终输出的快照。

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

发布数据集(按作者分类的图像)

最后,将带有时间戳的数据集发布到平面文件或云数据库中。

GA_data <- 
  GA_export %>%
  write_csv("GA_data.csv")

第五步:接下来是什么?

这只是营销分析自动化的开始。因为我们可以在此基础上做更多的事情,比如:

1)在虚拟机上自动化 R 脚本,并将增量数据存储在云数据库中。

2)重复相同的过程,建立一个自动化的跨渠道数据湖,带来增量脸书广告/谷歌广告/推特广告数据集。

3)使用时间序列预测来预测来自每个平台的用户会话/指标。

4)最后,构建一个 BI 仪表板,从平面文件/云存储中检索数据,以可视化端到端营销分析套件。

关于作者

[## Sreejith Sreedharan - Sree

数据爱好者。不多不少!你好!我是 Sreejith Sreedharan,又名 Sree 一个永远好奇的数据驱动的…

srees.org](https://srees.org/about)

如果您在理解 r 中 GA 自动化的基础知识方面需要任何帮助,请随时联系我。希望这有所帮助:)

BigQuery 中的谷歌分析 3:入门

原文:https://towardsdatascience.com/google-analytics-in-bigquery-1-getting-started-ef0991484787?source=collection_archive---------23-----------------------

如果你在知道谷歌分析有其局限性之前使用过它。对于报告、过滤器、细分市场和预定义的维度/指标,您只能做这么多。通过将原始数据导出到 BigQuery,我们可以轻松地避开这些问题,并运行各种对于用户界面的报告来说过于复杂或过于具体的分析。但是原始数据也有一些缺点:模式有点不寻常,分析师可能会发现嵌套方法一开始有点挑战性。

我想开始一系列文章,在这些文章中,我将在开放数据上展示如何开始使用 BigQuery 中的谷歌分析表。我将讲述这个结构是什么样子,如何理解它,以及如何处理它的嵌套数据——首先是初级水平,稍后我想更详细一些。在第一篇文章中,我将首先向您介绍最常见的领域。

我假设你知道基本的分析 SQL。比如用SUM()[GROUP BY](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#group-by-clause)聚合值。你也应该知道[LEFT JOIN](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#left-outer-join)[CROSS JOIN](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#cross-join)的区别。如果你以前从未使用过 BigQuery,下面是如何在沙盒模式下开始的指南和一个关于 web 界面的指南。如果你需要一点关于 SQL 的复习,你可以尝试一下 SQLbolt 来获得一个简单的交互式教程,而不需要注册或支付任何费用。

当然,如果你跟着做,这些文章的效果会更好,我写这些文章是因为我知道你会跟着做。

建立

首先,从谷歌商品商店查找谷歌分析数据。每个人都有查看权限,但是为了查询数据,您的计费项目必须允许在美国查询数据。您可以在左上角选择您的计费项目:

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

确保此项目可以查询美国的数据

要将 BigQuery 公共数据项目固定到您的项目列表中,打开项目页面,点击中间右侧的“固定项目”。我们将在这个项目中使用的数据集叫做[google_analytics_sample](https://console.cloud.google.com/bigquery?folder&p=bigquery-public-data&d=google_analytics_sample&page=dataset)

要开始,只需单击数据集中的表组,如下图所示:

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

包含 366 个表的表组—这里选择了表 ga_sessions_20170801。

现在,单击右侧的“查询表”,一个查询框架出现在您的查询编辑器中,您可以轻松地修改它:

该查询应该为计数返回一个值。

谷歌分析数据结构 1 —简单数据类型

谷歌分析数据每天导出一张表,无论是流还是当天导出。该名称遵循ga_sessions_YYYYMMDD的模式,其中最后一部分被替换为 Google Analytics 中导出视图的时区设置的日期。这意味着一个表中的所有数据都来自这个时区的某一天!组合不同时区的数据时要小心。现在,我们来看看实际数据。

将 BigQuery 表视为平面表是一个好主意。是的,没错——尽管到处都在谈论臭名昭著的“嵌套数据”,但在开始理解它们时,将它们视为普通的关系表是有意义的。例如,表 ga_sessions_20170801 :如果您只查看包含简单数据类型(且未被否决)的字段(列),您会得到以下列表:

  • 访问号码 (int64)
  • visitId (int64)
  • visitStartTime (int64)
  • 日期*(字符串)*
  • fullvisitorid (字符串)
  • clientId (字符串)
  • 频道分组*(字符串)*
  • 社会管理类型*(字符串)*
  • 用户标识*(字符串)*

仅此而已。一些字符串和一些整数。让我们揭开它们的神秘面纱。并且在我们开始之前,设置一个书签到 导出模式 以备将来参考。在开发查询时,您将需要它来查找概念。这个参考资料加上跟踪开发人员编写的参考资料将有助于您理解数据。

表格中的每一行等于一个会话(或一次访问)。因此,我们的第一个字段 visitNumber 试图告诉我们这是哪个会话。不过,如果你在追踪网站,要小心:visitNumber 通常来自 cookie,而 cookie 可能是错误的。最好把这个领域当作一个粗略的估计。

在这里运行这个查询查看结果!

但是什么是会话呢?我们可以将“会话”定义为 Google Analytics 称之为“命中”的一组服务器请求。会话从一次点击开始,并在以下情况下结束

  • 超过超时阈值(在视图设置中设置)
  • 点击包含新的营销活动信息——会话可以来自搜索引擎、广告、合作伙伴、其他渠道或直接
  • 午夜(因为创建了一个新表)

我们将在以后的文章中了解更多关于点击的信息!

字段名 visitId 可能会让您认为它允许您将它用作会话 Id。但事实并非如此。visit id 和 visitStartTime ,实际上都是以秒为单位的 UTC 时间戳,表示会话开始的时间*(第一次点击的时间)!区别就在这里:还记得一个会议是如何在午夜分成两个会议的吗? visitStartTime 给出这一行的时间,而 visitId 给出前一天表中这一行的时间!如果没有午夜分割,则两个字段都包含相同的值*😗*

运行这个查询来查看结果!

当你计算超过多天的会话时,这种差异当然是非常重要的。

使用 通配符表 有一种轻松的方法。您基本上是在表名中使用一个*作为通配符。这将添加伪列_table_suffix,它包含您用通配符替换的表名的所有部分。如果你替换日部分ga_sessions_201708*,它包含字符串形式的所有日,例如0102。如果替换更多的ga_sessions_2017*,则包含更多的08010731,以此类推:

运行此查询并修改它以了解更多信息!

因为字段日期包含本地日期,所以在整个表中它是相同的值。所以当我们数的时候,我们得到了桌子的数量。

再来说说 fullVisitorIdclientId :客户端 Id 是 fullVisitorId 的未哈希版本,但并不总是完全匹配。仅在加入其他营销数据时使用客户 id。使用 fullvisitorid 用于识别客户端(浏览器 cookies 或应用安装),因为该 id 与谷歌用户分析数据一致。如果你在一个标准的非用户 id 视图中,那就是。

既然我们可以识别客户,我们也可以识别他们的会话,因为每个客户一次只能有一个会话——我们结合 fullVisitorIdvisitStartTime 来获得与 Google Analytics 中相同的数量:

运行这个查询来查看不同之处!

如果你将 fullVisitorIdvisitId 结合起来,然后分别计算几天的访问量,你会得到一个更准确的访问量,因为午夜时段被忽略了——但这个数字不会出现在谷歌分析中,所以要准备好回答同事的问题,将你的数字与谷歌分析用户界面中的数字进行比较。

字段 channelGrouping 包含该会话的营销渠道。请注意,通道可以从以前的会话中继承!这取决于你在活动超时上的谷歌分析设置——标准设置是六个月!要检查该值是否被继承,请查看字段traffic source . istruedirect,并咨询您的营销团队如何解释他们的活动超时选择。

字段 userId 只有在您将 Google Analytics 中的视图设置为用户 Id 视图时才相关,因为这样做的缺点是只跟踪那些实际上有用户 id(通常是登录 id)的会话。公司通常在自定义维度中跟踪登录 ID。我们稍后将了解自定义尺寸!

谷歌分析数据结构 2 —结构

结构是我们的第一个复杂数据类型:键值对列表*。如果你熟悉 JSON:它们基本上是对象,在{ "key 1" : "value X", "key 2" : "value Y"}或 Python 中它们被称为字典。*

在 BigQuery 中,它们被称为结构,或者有时——如果你在 web 界面中查看表模式——它们被称为RECORD。这完全是一回事。请不要把它们和数组混淆——有包含RECORD的数组——但是RECORD也可以独立存在!

区别在于模式:如果它说REPEATED,那么它是一个数组,如果不是,那么它只是一个单个的数组。

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

通过寻找“重复的”来识别数组—“重复的记录”意味着“数组中的结构”

对我们来说,这意味着我们有几个包含子字段的字段,但都是单个的RECORD。它们通常可以被视为普通的列。这里没什么可怕的。

虽然不能GROUP BY或聚合一个结构,但是可以GROUP BY一个结构的子字段(除非它本身是一个结构或数组)。让我向您展示我的意思—我们的表中有以下结构:

  • 总计包含本次会话的合计值
  • 流量来源告诉我们流量的来源
  • 设备包含客户端信息
  • 地理网络包含关于客户端地理位置的最佳猜测

它们非常自我描述,并且有很好的文档记录。确保您了解它们的子字段的值是如何被跟踪的——与您的开发人员交谈并阅读他们关于这些字段的限制的实现文档。例如,由于 IP 匿名化,地理位置可能会非常不准确。

总计可以节省计算时间。您可以使用点运算符.来访问子字段,如下所示:

运行并修改此查询以了解如何查询结构!

总计的子字段包含两种类型的字段:

  1. 统计总量,比如点击数、交易数和浏览量。
  2. 条件集合,如 totals.visits1NULL,表示某一组条件是否成立。

totals.visits 表示该会话是否包含交互。是的,存在没有交互的会话的用例:有时你想跟踪应用程序的安装,这将向 Google Analytics 发送一个没有交互的点击,Google Analytics 将围绕它建立一个完整的会话。这些以及类似的情况会导致非交互式会话,您可以使用WHERE totals.visits = 1忽略这些会话。记住 GIGO 原则,确保你的追踪开发者将这些点击设置为非交互,否则,你最终会有很多不应该被认为是非交互的会话。

totals . bounds表示该会话是否只有一次浏览量。小心这个数字,因为它不适用于应用程序流量。为此,你需要建立自己的反弹标准,例如检查totals.screenviews = 1

还有 totals.newVisits ,其工作原理与 totals.visits 类似,也可用于简单计数SUM(totals.newVisits)或作为条件语句,例如WHERE totals.newVisits = 1

device.deviceCategory 也是一个有趣的分类:谷歌分析自动将客户分为移动桌面(包括笔记本电脑)和平板。他们并没有真正公开他们是如何做的,所以对照用户代理检查一下,看看它是否对你的情况有意义。这个字段很有用,因为这三个类别的用户体验不仅在接收方面不同,在提供输入方面也不同。如果你的团队也在跟踪 CSS 断点,当你的分析问题在 UX 领域时,它可能会给你更好的分段。

现在您已经知道了这些标准字段是如何工作的以及在哪里可以找到它们,接下来您可以进入有趣的部分:数组。它们将在下一篇文章中介绍——希望在那里见到您!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值