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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

重新审视统计学

原文:https://towardsdatascience.com/statistics-revisited-5541f0bb9c4b?source=collection_archive---------20-----------------------

入门

在这里,我将尽力把统计概念分解成各种容易理解的方式,同时作为我学习过程中的总结笔记。

人口诉样本

很多时候,我们进行小样本的调查,仅仅是因为调查整个人口是不可行的。然后,这个样本允许我们对实际人口进行推断。统计学的研究很大程度上回答了这个问题:我能有多大的信心相信样本结果说的是人口的真相?

这种对总体进行归纳的方法叫做推断统计学。在此之前,让我们回顾一下我们在早期学校生活中会遇到的一些基本的描述性统计数据。

描述性统计

平均值、中值和众数是寻找数据集中平均值的常见方法。以下是更好地描述和可视化数据集的一些其他方法:

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

方程式[1]

算术平均值是通过将数据集中所有数字的总和除以数据集中的数字计数获得的。一个常见的例子是确定班上学生的平均身高。

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

方程式[2]

虽然不如算术平均值直观,但在处理百分比时,可以很容易地联系到几何平均值。例如,确定一段时间内投资的平均回报。

数据集的众数是出现最频繁的值,而中位数是有序数字列表中的中间数字。与中位数的概念相似,四分位数将有序的数字列表分成四个相等的部分,所需的四分位数位于中断位置。

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

作者图片

为了更好地显示数据集中数字的分布,可以使用箱线图快速显示最大值、最小值和四分位数位置。箱线图的不同形状揭示了数据中的偏斜度。箱线图也有助于识别是否存在异常值。

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

作者图片

数据集的范围提供了其可变性的非常基本的概述,即各个点围绕平均值分布的程度。衡量可变性的更好方法是计算其方差和标准差。

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

方程式[3]

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

方程式[4]

虽然这些方程可能看起来吓人,但方差只是取每个数据点和平均值之间的差的平均值。差值被平方以消除正值和负值的影响。由于方差现在具有大得多的量级(由于平方函数),标准差取方差的平方根,使得它变得与数据集“相关”。

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

作者图片

从上面的例子可以看出,计算出的方差和标准差分别是 146.58 和 12.11。将这两个值与原始数据集值进行比较,与方差值 146.58 相比,平均值 12.11 的分布可被认为更“相关”。

推理统计

既然我们已经在一定程度上概括了描述性统计,让我们重温一下之前被问到的问题:我能在多大程度上相信样本结果真实地反映了总体情况?

假设我们想确定一个新生婴儿的平均体重。通过收集 8 个婴儿的体重样本,发现样本均值为 3.2kg。另一个由 20 个婴儿组成的样本显示样本均值为 3.4kg。直观地说,我们应该更相信哪个均值?

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

方程式[5]

这个例子说明了估计误差的概念——在确定总体参数时,我们的“最佳猜测”应该是什么。从方程[5]可以看出,当样本量 N 增大时,标准差减小,其中 s 为样本的标准差。这在一定程度上表明了样本均值可能存在多大的变化。

既然知道样本之间和样本内部也存在差异,那么点估计(即取特定值的总体参数)似乎不是一个可行的选择。取而代之的是引入了一个置信区间,它是一个数字范围,人口参数被认为落在这个范围内。

形状像钟形曲线的正态分布通常用于确定置信区间。这是因为**中心极限定理(CLT)带来的独特观察。**CLT 指出,如果总体有一个有限的均值和标准差,当用替换从总体中取出足够大的随机样本时,样本均值的分布将近似呈正态分布。

值得注意的是,我们不一定知道人口数据遵循什么分布。类似地,每个样本将遵循一个未知的随机分布。然而,当抽取足够多的样本时,由于中心极限定理,它们的平均值将遵循正态分布。下图说明了这一点。

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

作者图片

从创建的正态分布图中,我们可以直观地看到估计的总体均值在哪里。标准差是通过将每个样本平均值视为一个数据点来计算的。然而,如果只有一个样本,并且假设分布为正态分布,则可以根据等式[5]将标准偏差估计为平均值的标准误差。

为了构建置信区间,我们需要首先将正态分布转换为 z 分布,或者称为标准化正态分布。这样,分布最终将取平均值 0 和标准差 1。

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

方程式[6]

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

作者图片

在正态分布中,平均值、中值和众数相等,曲线关于平均值对称。曲线下的总面积为 1,表示 100%的概率。z 分数是沿 z 轴的值,对应于平均值的标准偏差数。在不同的 z 分数下,z 表确定由这些分数限定的总面积。面积还表示位于此区间内的观测值的百分比,有时称为 p 值。因此,我们可以用表示为置信区间的概率置信度来估计统计量。

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

作者图片

如果样本量 n 很小(< 30), and/or the population standard deviation is unknown, we use a t-distribution instead. Also having a bell shaped curve, the t-distribution has a lower peak and fatter tails compared to a z-distribution, resulting in a more conservative confidence interval given the same significance level. We can think of this as a way of penalizing the estimate since less reliable information is provided.

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

Image by author

Instead of referring to the z-table, the t-table is used instead. One point to note when using the t-table is that the degrees of freedom (D.O.F) is used instead, where **D.O.F = n -1)。**D . o . f 是指最终计算中可自由变动的数值数量。在这种情况下,D.O.F = n -1,因为在已知样本均值和样本标准差的情况下,n 中的最后一项必须是固定值。

置信区间和显著性水平的概念在统计学和机器学习技术中被广泛使用。虽然它确实以相对较高的置信度提供了总体参数的一系列估计值,但当平均值实际上位于规定的置信区间之外时,就有可能出现误差。更多内容将在我下一篇关于**假设检验的文章中介绍。**敬请期待!

使用统计学改进线性回归

原文:https://towardsdatascience.com/statistics-supporting-linear-models-bfc24fb9781f?source=collection_archive---------6-----------------------

关于线性回归的数学基础以及如何使用它来提高拟合优度的详细帖子。

当试图解决复杂问题时,简单而复杂的方法往往被低估。这个故事旨在展示线性回归仍然非常重要,以及我们如何提高这些算法的性能,成为更好的机器学习和数据科学工程师。

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

Unsplash 上的 Pietro Jeng 拍摄

作为机器学习领域的新生,你首先要学习的是简单的一元线性回归。然而,在过去的十年左右,基于树的算法和神经网络在商业规模上盖过了线性回归的重要性。这篇博文的目的是强调为什么线性回归和其他线性算法仍然非常重要,以及如何提高这些基本模型的性能,以便与 XGBoost 和 Random Forests 等大型复杂算法竞争。

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

线性回归-最佳拟合线(图片由作者提供)

如何提高线性模型的性能:

许多自学成才的数据科学家首先通过学习如何实现各种机器学习算法来开始编写代码,而没有真正理解这些算法背后的数学。通过理解这些算法背后的数学,我们可以了解如何提高它们的性能。

线性回归背后的数学对模型将接收的数据做了一些基本假设:

  • 没有异质
  • 无多重共线性
  • 自相关
  • 正态分布
  • 线性

让我们更深入地研究其中的一些假设,并找到改进我们模型的方法。

线性度:

线性模型试图通过给定的数据点拟合一条直线。它看起来类似于下面给出的图表。

然而,这种模型无法拟合不是线性绘制的数据点。考虑一个关系 y = x + c ±(噪声)。这个函数的图形是抛物线。拟合一条穿过该图的线不会得到很好的拟合。

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

(图片由作者提供)

我们需要通过应用指数、对数或其他变换来变换独立变量,以获得尽可能接近直线的函数。

这意味着,通过平方每一项,将自变量从 x 变为 x,我将能够拟合一条穿过数据点的直线,同时保持良好的 RMSE。

因此,在建立最终模型之前,我们需要弄清楚我们的自变量是与每个因变量直接相关,还是与这些变量的变换直接相关。

无异方差(恒定方差)

考虑这样一种情况,你受雇于一份月薪 3000 美元的工作,而你的生活费用总计 2950 美元。你每个月只剩下 50 美元可以在闲暇时花。你可以选择花掉这笔钱或者存起来。无论如何,这不会立即带来显著的变化。您的银行余额变化很小(在 0 到 50 美元的范围内)。10 年后,你现在是一家跨国公司的首席执行官,月薪超过 10 万美元。你的生活费用总计 25,000 美元。现在你可以选择花掉剩下的 75,000 美元或者只花掉其中的一部分。月底你银行余额的变化可能在 0 到 75000 美元之间。与 10 年前相比,这里的范围要大得多。随着时间的推移,你能存的最少和最多的钱之间的差额也在增加。

线性回归假设数据点之间的方差不作为因变量的函数而增加或减少。

图表应该看起来更像这样,以符合良好的线性模型。

在这种情况下,线性模型的标准误差将不可靠。

如何检测:

  • 戈德费尔特-量子试验

此函数返回 F 统计量和 p 值。

  • 布鲁施-帕甘试验

该函数返回拉格朗日乘数统计量、p 值、f 值和 f p 值。

无多重共线性

考虑一个问题陈述,其中要求您根据地块的长度、土地面积以及与学校和公共基础设施的距离来预测房地产的成本。这里很明显,两个独立变量(图的长度和面积)直接相关。随着长度的增加,面积也增加。这种相关性会影响线性回归的性能。

如何识别这一点:

  • 使用皮尔逊相关。

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

皮尔逊相关热图[图片由作者提供]

如何解决这个问题:

  • 删除两个变量中的一个
  • 创建一个函数,使用相关特征创建一个新的自变量,并删除相关特征。

分布正态性

这是人们在建立线性模型之前通常会忘记的最重要的因素之一。数据集中的连续变量需要服从高斯分布,这一点很重要。

高斯分布它是一种关于均值对称的概率分布,表明接近均值的数据比远离均值的数据出现的频率更高。在图表形式中,正态分布将显示为钟形曲线。

偏离高斯分布的度量称为偏斜。可以使用 scipy 模块在 python 中计算分布的偏斜度。

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

Seaborn distplot 图[图片由作者提供]

在上图中,黑线是指我们希望达到的高斯分布,蓝线代表给定数据在变换前的核密度估计(KDE)。

修正数据的偏斜度可以极大地提高线性模型的准确性。

可应用于固定偏斜度的变换:

  • 对数转换:如果数据是右偏的,即分布在右端有一个长尾,这种方法效果最好。

  • 指数变换:用幂“c”提升分布,其中“c”是任意常数(通常在 0 到 5 之间)。

  • Box-Cox 变换:这种变换在至少 80%的情况下修正了偏斜度。这无疑是修复偏斜的最有力的工具。这里λ是用于将非正态分布拟合为正态分布的值。如果您想要执行逆 box-cox 运算来获取初始数据,您将需要该值

  • 倒数变换:用它的倒数/逆来替换这些值。

自相关:

自相关的教科书定义是:

自相关是指数据中不同观察值的相同变量之间的相关程度。

让我们借助一个例子来理解这一点。自相关的概念经常在时间序列数据的上下文中讨论,其中观察发生在不同的时间点,因此我们将以一个虚构的公司(XYZ 公司)的股票价格为例。在过去的三天里,这家公司的股票价格一直稳定在 50 美元左右。从这个数据中,我们可以推断第 4 天的股价将很有可能在同样的 50 美元左右。但是,这不能从现在开始 2 个月左右说。这种类型的数据被称为自相关数据,在这种数据中,彼此距离较近的数据点比距离较远的数据点相关性更强。

对线性回归的影响:

  • 这将影响直线的拟合优度,因为自相关会影响标准误差。然而,这些系数是无偏的。
  • 在存在自相关的情况下,诸如 p 值、t 值和标准误差的统计测量将是不可靠的。

如何检测自相关的存在:

  • Durbin-Watson 检验:这是通过比较连续的误差项来检查它们是否彼此正相关/负相关。1.5–2.5 之间的值会告诉我们,自相关在该预测模型中不是问题。

使用 python 计算 Durbin-Watson 评分

杜宾-沃森检验中的 0-1.5 表示显著正相关,而 2.5+表示显著负相关。

然而,当连续但等间距的数据点之间存在自相关时,该测试无法检测到自相关。(例如:每周五的股票价格为 52.50 美元±0.5 美元)。

  • Breusch-Godfrey 测试:这比之前的测试稍微复杂一些。简单地说,这个测试要求你建立一个模型,计算每个数据点的误差项,并尝试预测时间 t 时的误差项,作为所有前面的误差项的函数。

该测试也可以使用 statsmodels 模块来执行。点击链接查看他们的官方测试文档。

结论

我希望这个故事对你有所启发。祝您在数据科学之旅中好运

统计:用数据可视化讲述故事

原文:https://towardsdatascience.com/statistics-telling-stories-with-data-visualization-904ceddf2afb?source=collection_archive---------37-----------------------

图片说千言万语。数据的可视化为人类思维创造基于洞察力的行动做好了准备。

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

Unsplash 上由 Adeolu Eletu 拍摄的照片

在我早先的帖子中,我已经写了关于有效使用表格从原始数据中获取洞察力的文章。无论表格在捕捉数据的细微差别方面多么有效,有时太多的数字会使它看起来很麻烦。在这种情况下,你如何从数据中分辨出一个故事?在本文中,我将尝试提出一些有效的技术来图形化地表示数据。

在我开始之前,一个有效的问题是,当提到“图片”或“视觉”时,你会想到什么?我猜是某种艺术形式。你会想到挂在你房间墙上的肖像或者更著名的艺术作品,比如蒙娜丽莎等。挖掘数据也是一样,这是一件艺术品,完全取决于你如何最好地利用图像向你的观众传达一个驱动点。这完全取决于你想要解决的最终目标。

因此,任何一篇博客文章都很难给你一个准确的方向,告诉你在每种情况下应该画什么样的图表。相反,这篇文章将:

  1. 解释可视化的需求
  2. 描述有效可视化所需的步骤
  3. 演示数据可视化操作
  4. 简单概述如何使用最常用的工具之一——MS PowerPoint 来创建这些可视化效果

将使用它的读者需要使用他/她自己的直觉,并随着经验的增长来让这些人讲述故事。

为什么我们需要可视化?

世界正面临海量数据。你可能会多次听到类似“数据是新的石油”或“是核能”这样的话。但是,全世界每秒钟产生的数万亿个数据点对您来说意味着什么?很可能只是一串数字。是的,在某个时间点上,你可以用表格来总结,但是超过这个时间点,大脑就处理不了了。有没有更简单的理解方式?为什么我们不利用足够的图像或者本质上的数据可视化呢?数据可视化可以以有效的方式排列数据,使人类更容易理解数据的组成,突出任何模式或异常值,将一组数据与另一组数据进行比较,并确定它们之间的任何关系(如果有的话)。

做得好的视觉化可以讲述一个故事。2020 年,任何人脑海中浮现的数据都是新冠肺炎。如果在任何时间点,你想知道感染在任何国家(比如印度)的进展情况,最简单的方法就是查看每日确诊病例图表:

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

图 1:印度每日新冠肺炎确诊病例

看图表,想一想在这个简单的表示中你能看到什么?印度从 2020 年 1 月底的 0 例增加到 5 月中旬的每天约 3500 例感染。从 3 月底到 4 月初,病例开始略有增加。虽然 4 月份稳步增长,但 5 月份的大幅增长令人担忧。所以,看看仅仅画一个线形图是如何让你想到至少 3 个观察值的!想想成千上万的数据点,也就是成千上万人的新冠肺炎测试结果,这些数据点已经被这条简单的曲线概括出来了!

如果你想添加更多的信息会怎样?不如我们想知道随着时间的推移,复苏的进展如何?看着图表,思考你能推断出的见解。此外,请注意图表和纵轴标题是如何改变的,以讲述故事的关键。添加了图例,以解释哪条曲线显示确诊病例与恢复。

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

图 2:印度每日确诊和恢复的新冠肺炎病例

让我们再举一个例子。你有没有想过,在 LinkedIn 上,当你有成千上万的联系人和关注者时,有没有一种方法可以了解他们在职业和社交方面是如何与你联系在一起的?LinkedIn 有一张地图可以让你看到它们。看看下面的视频,由 DJ Patil 解说,讲述了在 2014 年之前,他们如何通过酷炫的可视化让您能够更好地了解您的网络连接:

视频:昔日的 LinkedIn 网络地图

虽然上述功能已于 2014 年停止使用,但它曾是 LinkedIn 最酷的功能之一。然而,一些最近的开源工具,如 Python,可以创建一些类似的视觉效果,如果不是完全相同的话。

我们谈到了数据可视化的细微之处。但是有没有什么缺点?看看新冠肺炎的图表。它是否显示每天确诊和/或康复病例的确切数量?它无法向你展示政府、科学家和一线医护人员等特定群体工作可能需要的准确数量或精确度,这可以通过表格表示法获得。然而,它们提供了一个近似的理解,这对于一个更大的群体来说是有好处的,他们正在跟踪感染增长并祈祷“曲线变平”。同样,一个好的视觉化的故事需要很长时间来创作。

如何开始?

在一个满是观众的房间里,当你想分享一条信息时,你有时可能想在白板上画图。那你脑子里在想什么?或许,传达你的信息的最好方式是什么?最容易传达信息的绘画形式是什么?所以,你可以想象你需要遵循几个步骤:

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

图 3:实现有效可视化的步骤

数据可视化在行动

为了观察各种类型的视觉化活动,我们需要理解它们在不同情况下的必要性。以下是它可以对您的数据做的三件重要的事情:

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

图 4:可视化有什么帮助?

让我们先从第一件事开始,**分解组件。**这些时候,你有数据,你希望了解它是由什么组成的。例如,如果您希望了解工厂中工人的构成,以下是几种可视化方法:

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

图 5: 饼状图显示万名员工中不同年龄员工的比例

接下来, 100%堆积柱形图(如下图 6) 可以显示一个组中的子组。在这个例子中,我们可以很容易地找到年龄组内的性别构成。注意我们如何通过更好地使用颜色来更好地推断。

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

图 6: 100%堆积柱形图,显示各年龄组中男性与女性的百分比

此外,请注意这些图表如何帮助在比例的基础上比较(我们的第二个关注领域,根据图 4)。如果需要基于绝对差异的比较,类似图 7 的堆积柱形图(非 100%) 会有所帮助。

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

图 7:堆积柱形图,显示各年龄组中男性与女性的数量

条形图是柱形图的扩展,在柱形图中,条形水平移动,而不是垂直移动。另外,看一下树形图进行构图对比:

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

图 8:显示通过积累以及与其他组比较的构成的树形图

用于定量数据的其他非常重要的绘图技术有面积图瀑布图

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

图 9:面积图

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

图 10:瀑布图

我们已经看到了一些图表,展示了如何将数据分解为粒度成分,以及一些比较这些成分数据的方法。还有一些其他方法可以比较不同时间和不同静态点的数据成分。看看上面图 1 和图 2 中的新冠肺炎感染和恢复计数图表。这些是折线图,这些图比较感染和恢复的数量如何随时间变化,或者比较两个时间点

也可以使用简单的柱形图来显示一段时间内以及某个时间点的比较。例如,在 XYZ 公司的员工中,您可能想知道他们在哪个州上学:

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

图 11:条形图

请注意,如果您想要绘制多个信息,但这些信息遵循相同的单位刻度,您可以在水平轴上为每个类别或时间点创建多个条形图。

让我们转到可以通过可视化展示的统计分析。第一种类型始终是显示数据分布的直方图。例如,如果您希望了解 XYZ 公司工人的身高分布,直方图将给出相同的解释:

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

图 12:工人身高分布直方图

请注意,这看起来很像柱形图,但本质上,与柱形图有很大的不同。首先,直方图显示分布,而柱形图比较类别或时间段,目的是不同的。接下来,直方图可以处理连续形式的数据,其范围被分组到多个区间中。

破译数据的分布给你一个特定变量的可能值,比如身高和它们出现的频率**。如果您要为工人订购防护装备,您可以使用直方图大致了解订购数量,而不是测量 10,000 名工人中每个人的准确身高,这非常耗时。**

虽然像身高这样的变量通常遵循 正态分布 (类似钟形曲线的形状),但现实生活中有许多其他变量并不如此。举例来说,让我们考虑一下,如果工人在工作中受伤,他们可以提出工伤保险索赔。

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

图 13:显示工人保险索赔分布的直方图

现在我们已经看到了分布图,可视化在统计分析中的另一个重要用途是理解关系,这将我们带到散点图

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

图 14:散点图

另一个用于数据统计分析的非常有用的图表是箱线图(或有时称为“箱线图”)。它可以使用多种度量来描述数据,如最小值、第一个四分位数、中值、第三个四分位数和最大值。例如,如果您想了解 XYZ 公司的 3 种产品的数据,在您收到对某一产品的第一次投诉之前过了多少个月呢?假设您收集了 5000 台便携式冷却器、智能逆变器和中央空调系统的数据。你如何代表?

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

图 15:箱线图

虽然上面解释的技术有助于在许多情况下可视化数据,但是还有许多其他创新的方式来可视化数据,如人口统计图(参见下面的示例)、热图等。拥有多个仪表盘构建器和开源工具,如 Tableau、Qlikview、R-Shiny、Python 等。可以创建许多具有这种可视化效果的很酷的仪表板。回顾这些工具超出了本文的范围,但是我们将看看一个常用的工具,Microsoft PowerPoint,它可以构建这些图表的大部分。

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

图 16:使用微软 PowerPoint 的世界地图

使用常用工具创建可视化

上面显示的所有图表都是用微软的 PowerPoint 制作的,如果你使用的是微软 Office 系统,PowerPoint 是一个非常常用的工具。因此,你实际上不需要购买花哨的工具来使用可视化创建有效的故事。然而,这对于中等规模的数据集来说是正确的。如果您的数据很大,那么可能需要寻找能够处理大小的替代方法。下面是在 PowerPoint 中创建可视化效果的一步一步的简单方法:

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

图 17:使用 Microsoft PowerPoint 开发可视化

结论

在本文中,我们看到了使用图片从数据开发多个故事的多种技术。当你有大量的数据流,并且你不打算钻研复杂的数学时,数据的可视化可以训练你的思维来推断重要的结论。虽然现在有多种工具来开发可视化,但要从中等大小的数据开始,除了 Microsoft Excel 和 PowerPoint 等常用工具之外,不需要任何东西。随着当今世界数据量的不断增长,构建一个能够轻松查看数据并理解可见模式的策略以更好地制定分析方法是势在必行的。所以,选择今天你最容易得到的数据集,看看你能创造出什么样的视觉效果!

留守家园——新冠肺炎的故事

原文:https://towardsdatascience.com/stayathome-a-story-of-covid-19-6aeeba2b6c?source=collection_archive---------75-----------------------

居家养老运动的趋势与前景分析

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

来源https://unsplash.com/@anastasiiachepinska

冠状病毒病(新冠肺炎)是由一种新发现的冠状病毒引起的传染病来源。2019 年 12 月下旬,中国武汉市报告了首例新型冠状病毒病例[ 来源 ],此后该病毒在全球范围内传播。因此,世卫组织宣布它将在 2020 年 3 月 11 日前成为全球疫情。截至 2020 年 5 月 23 日,在 188 个国家和地区报告了超过 520 万例病例,超过 338,000 人死亡,约 205 万人已经康复。自从疫情公告以来,许多国家已经决定完全或部分封锁他们的国家,许多人在家里学习、工作和祈祷,这导致了在家活动。想了解更多关于冠状病毒的信息,请看cdc.gov

家庭旅馆

2020 年,StayAtHome 已经成为世界各地的一项运动,作为各国政府为缓解新冠肺炎疫情而限制人口流动的行动。这场运动命令社会呆在家里,除了必要的任务。一个几乎相似的术语是一级防范禁闭,但一些权威人士认为一级防范禁闭有可能被误解,人们会认为它包括挨家挨户的检查。

本文的目的是了解人们对居家养老活动的趋势和看法

数据源

本文使用的数据都是包含 #stayathome 或短语**“呆在家里”的推文。新冠肺炎首例病例于 2019 年底报告,并于 2020 年初开始引起世界关注。因此,数据收集的时间范围在 2020 年 1 月 1 日到 2020 年 5 月 20 日之间**。收集的推文仅限于英语推文。收集的推文总数为 3571374 条。在收集的数据集上应用了一系列数据清理步骤,如删除重复、删除转发和提及。数据清洗后的推文总数为3570271

趋势

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

图 12020 年 1 月 1 日至 2020 年 5 月 10 日与 StayAthHome 活动相关的推文总数趋势

自 2020 年 3 月 9 日以来,与 StayAtHome 运动相关的推文数量开始增加,并于 2020 年 3 月 23 日达到峰值。高峰出现在许多国家在接近该日期时做出重要决定的时候。随着冠状病毒病例达到 1600 例,澳大利亚于周一(2020 年 3 月 23 日)开始一级防范。英国首相鲍里斯·约翰逊告诉英国公众:“你必须呆在家里。”2020 年 3 月 23 日星期一。美国的一些州也宣布在 2020 年 3 月 22 日至 24 日进行封锁,如康涅狄格州马萨诸塞州密歇根州纽约州威斯康星州堪萨斯市堪萨斯州俄勒冈州。此外,还有其他国家在接近该日期时做出了同样的决定,如希腊、利比亚和德国[ 消息来源 ]。

在 2020 年 3 月 23 日之后,趋势是下降的,最低数字发生在 2020 年 5 月 10 日,这是数据收集时间范围的最后一天。随着澳大利亚等几个国家放松封锁,这一数字预计将进一步下降。

相关标签

图 2 显示了与#StayAtHome 本身旁边的 StayAtHome 活动相关的前 25 个标签。确认#StayAtHome 与#covid19 和#冠状病毒高度相关。许多人试图通过使用#stayhomesavelives、# socialdistancing 和#staysafe 来提醒社会。标签中的另一个发现是关于地点的,例如#NHS 代表英国,#indiafightscorona 和# jantacurfew 来自印度。此外,在疫情爆发期间,人们还在推特上谈论复活节、音乐/艺术表演和在家工作。

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

图 2stay home 活动的相关标签

主题建模

上一节通过标签讨论了推文的背景。通过文本本身来理解推文会很有趣。一种方法是进行主题建模。

主题建模是一种用于发现出现在文档集合中的抽象“主题”的统计模型。有许多不同的算法可用于执行主题建模,如 LDADMMNMF双项等。LDA 将用于此写作。如果你对 LDA 的技术方面感兴趣,我建议你阅读论文,或者下次我可能会写另一篇关于它的文章。

如前所述,趋势自 2020 年 3 月 9 日开始增加,因此,在执行主题建模时,将仅使用自 2020 年 3 月 9 日以来的 3,451,390 条推文。在执行 LDA 时,其中一个步骤是定义主题的数量。从 2 到 20 个主题的可能数量的列表被应用于该算法,并且最佳模型是具有 8 个主题的 LDA。以下是每个话题的热门词汇。

话题一: 时间、工作、制作、小孩、日子、学校、妈妈、孩子、家、父母、好、吃、人、夜、爱、年、事、神、食物、思念 话题二: 订单、关闭、测试、工人、人、面具、必备、ppl、罚款、到期、警察、增加、健康、办公室、医院、穿、组、开、打、走 trump,reopen,start,wanna
话题 4: 天,时间,今天,观看,制作,玩,享受,好,爱,自由,伟大,阅读,学习,在线,展示,明天,星期,快乐,开始,直播 话题 5: 人,病毒,传播,政府,停止,死亡,covid,电晕,制作,封锁,国家,告诉,唐,冠状病毒 更新、支持、总、三月、花费、关注、服务、每日、数字、积极 话题 7: 停留、安全、家庭、健康、家庭、拯救、周末、拯救 _ 生活、爱情、消息、covid、洗手、希望、避免、每个人、保护、关怀、生活、时间、美好 话题 8: 人、工作、唐、做、家、天

解读

此解读纯属作者角度。

主题 1 包含孩子、日子、学校、妈妈、孩子、父母可能与学校关闭和需要在家照顾他们的父母有关。

主题 2 包含测试、人员、口罩、必需品、医院、佩戴可能代表新冠肺炎测试,高度鼓励人们佩戴口罩以帮助防止疾病传播

主题 3 包含州、州长、扩展、开放、抗议、发布、特朗普可以代表美国的封锁扩展,并向美国总统发布关于打开封锁的抗议

主题 4 包含日、时间、观看、玩、享受、在线、表演可以表示与游戏和表演相关的常见家庭活动。

主题 5 包含人、病毒、传播、政府、停止、死亡、covid、电晕、制造、战斗、疫情、倾听、规则、公共可能代表来自用户的声音以对抗疫情

主题 6 包含病例、covid、视频、分享、死亡、帖子、安全、团队、更新、支持、总计、三月、花费、服务、每日、数量、阳性可以代表阳性或死亡病例数量的更新,尤其是在 2020 年 3 月期间。

主题 7 包含**、安全、家庭、健康、家庭、储蓄、周末、储蓄 _ 生活、爱、消息、covid、洗手、避免、保护、护理、生活、时间、好**可以与在家中保持安全和健康以及通过洗手避免新冠肺炎相关。

主题 8 包含人物、工作、家庭、薪酬、周可能与在家工作有关

话题比例

尽管 LDA 假设一个文档包含不止一个主题,但是如果每条 tweet 都用其主导主题来标记,那将会很有趣。通过这样做,可以计算出每个主题的 tweets 数量。

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

图 3 基于主导话题的推文比例

这表明,与在家工作相关的话题(话题 8)和来自用户的反对疫情的声音(话题 5)占总推文的 40%以上。这与许多人由于这场危机被迫在家工作的事实相一致,人们倾向于在社交媒体上讨论新冠肺炎的传播,并希望这场疫情能够尽快结束。

评论

如果你有兴趣进一步分析这个数据集,我在这里发布了数据集

资源: Github

如果您有任何反馈或进一步的讨论,请通过 LinkedIn 联系我。

#StayAtHome —他们是对的吗?

原文:https://towardsdatascience.com/stayathome-are-they-right-99f764a0b1de?source=collection_archive---------52-----------------------

我们在哪里,我们将会在哪里?西班牙数据案例研究。

每天新闻和媒体都告诉我们,建议呆在家里——但是我们有办法从数学上证明或否定这种说法吗?我们将处理西班牙的数据,但这些原则可以适用于任何国家。

在这篇文章中,我们将用基本的数学来证明或反驳这种说法——但是如果你不喜欢数学,也有图表

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

疾控中心Unsplash 上拍摄的照片

呆在家里的整个想法是避免不必要的社会接触,并与外界保持距离。通过这样做,我们大大降低了疾病的增长率。

但是这有多重要呢?

事实证明,很多。

在继续之前,请记住我不是任何类型的医学专家,下面写的一切都是基于纯(简单)数学。此外,使用的数据集可以从这里下载。

案例:西班牙

我不住在西班牙,也没有亲近的人住在那里,但事实证明,西班牙现在是欧洲“最热”的地方。

在写这篇文章的时候,我们已经有了截止到 2020 年 4 月 3 日的累积数据。到目前为止,西班牙有 119.199 例确诊病例。让我们快速想象一下病毒随时间的移动:

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

从这里开始,谁知道多久曲线会开始看起来像你的平均逻辑曲线。

但是,在得出结论之前,我们需要更多信息,我们还对某个时间段的平均增长率感兴趣,比如说过去 7 天。这可以通过简单地将今天的确诊病例数除以昨天的数字来获得,结果应该接近于 1。

在指数增长阶段,如果我们比较 4 月 2 日和 4 月 3 日,这个数字将一直大于 1,大约为 1.06——这意味着 4 月 3 日西班牙的确诊病例比前一天多了大约 6%。

一旦西班牙接近拐点,我们可以预计增长率将持续在 1 左右,并从那里开始走下坡路。

如果你感兴趣,以下是西班牙的增长因素:

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

我们可以清楚地看到这个因素在减少,但是谁知道接下来会发生什么。

现在让我们做一点数学计算。

计算出的生长因子是过去 7 天生长因子的平均值,我们将用它来证明呆在家里、保持个人卫生和避免社交聚会是多么重要。生长因子的平均值大致为 1.0888

对你来说,这听起来可能没什么——但这就是为什么你错了。如果西班牙在接下来的 30 天内有大致相同的 8.88%的日增长率,则确诊病例的预期数量可以计算如下:

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

其中:

Xt:今天确诊病例数

n:未来的天数

α:平均增长率

一旦我们输入数字,就会得到一个惊人的结果:

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

这意味着,如果不采取额外措施让人们留在室内,增长率保持大致不变,我们可以预计,30 天内,仅在西班牙,就有 153 万人受到感染!请记住,只有当一切都保持不变时,这才是**,这很可能不会发生。**

然而,如果我们遵循政府制定的规则(或实施新的、更严格的规则),设法将平均增长率降低到比如说 1.05,情况就会大大改善:

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

嗯,这个数字无论如何都不小,但是 515K 听起来比 1.53M 好多了。

带回家的点

总之,如果你对数学不感兴趣,我有别的东西给你。我已经准备了一张(可能)很好看的图表,显示了西班牙在 3 种不同增长率下的确诊病例数:

  • 1.0888 —过去 7 天的平均值
  • 1.05 —之前讨论过的一个
  • 1.03 —更优的比率

这是图表:

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

现在,不可否认的是,更多的人会被感染,不幸的是,更多的人会死亡——但是通过实施更严格的规则,我们可以确保增长不会遵循红色曲线,而是在蓝色和绿色曲线之间的某个位置。

感谢阅读,保重,待在家里。

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

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

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

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

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

为您的数据科学事业保持动力

原文:https://towardsdatascience.com/staying-motivated-for-your-data-science-career-e845f18421e1?source=collection_archive---------81-----------------------

我们可以长期保持动力

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

汤姆·希尔斯在 Unsplash 上的照片

有一天,你起床完成 Coursera 的作业,参与关于人工智能的社交媒体讨论和/或从事那个项目,无论是来自 Kaggle 还是你自己的项目,你说你会放在你的简历上……你第二天醒来,突然之间昨天的动力消失了,你真的找不到它了。

我不知道是否每个学习数据科学的人都会经历一次动机的低迷。尽管如此,我还是做了。

太可怕了。我非常沮丧和担忧,不知道“我的现实会不会和我脑海中的形象一致”。情况变得如此糟糕,以至于我甚至不想看到任何人谈论任何与数据科学有关的事情,所以我停用了我的 Twitter 账户,我停止了收听播客,我买的所有书籍都在我跺脚时蒙上了灰尘。

等等!!

我不鼓励你做同样的事情。如果我预先知道我缺少什么,以及推动我们行业的领导者去追求他们的梦想的驱动力是什么,那么我可能不会有那个小阶段——尽管,如果我没有那个阶段,我今天可能不会写这篇文章。我从我的经历中学到的是我希望与你分享的,因为它是我每天醒来渴望面对生活的基础。

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

照片由安特·汉默斯米特Unsplash 拍摄

理解动机

要深入了解什么是动机,这些信息足以填满一般大小的自助书籍,但是如果要我总结什么是动机,我会将其描述为*“在试图达到目标时,不断驱使我们克服挑战和障碍的力量或缺乏”。当我们缺乏动力时,在几次失败的尝试后或面对艰难的挑战时,放弃几乎是不可避免的。*

我们常常没有给予动机与它在我们生活中的影响相称的尊重。事实是,如果我们不利用我们的动机,那就很难超越并真正享受我们每天所做的事情。

“动机不像电灯开关,动机是一种流动”——未知。

我们可以阅读所有我们想要的埃里克·托马斯的名言,但不清楚动机从何而来,如何运作,我们就会不断地缺乏我们真正想要的东西。

概念化动机

现在最合理的问题是“动机从何而来?”想想太阳吧——它可以自我维持并持续很长时间。这是我们在听播客,或者联系顶级凯格勒时希望达到的动机。这并不持久,它更像是一杯酒——我从来没有喝过酒,所以我不知道任何酒的名字——而不是范式的转变。

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

戴维·蒙涅在 Unsplash 上的照片

太阳内部由三个主要部分组成:核心,辐射区和对流区。在这个例子中

**地核:**地核位于太阳的中心,是太阳最热的区域。在这个地方,会发生核聚变反应,为太阳提供能量。

辐射区:辐射这个名字的意义在于描述能量通过这一层以光子和热能的形式向外传播的方式。

**对流区:**对流这个名称也描述了能量流动的主要模式。辐射带附近的热物质上升,冷却了太阳表面,然后又冲向辐射带,形成了所谓的对流。我们称太阳表面(严格来说太阳没有表面)为光球层,这是光线逃逸的地方。

注意:观看下面的视频,获得更深入的直觉。由于我不是一个合格的天文学家,我只是出于好奇才了解它。

那么这和我们的激励系统有什么关系呢?

“最终变成光的电磁辐射就是在地核内部形成的.”

我们可以将太阳的内部构成与我们的动机系统联系起来,如下所示:

  1. 核心目的
  2. 辐射层—驱动因素
  3. 对流层——识别

我们的激励系统有几层,一直延伸到表面。我们可以看到表面,虽然真正的能量从哪里来才是核心。

“从为什么开始”——西蒙·西内克

激励系统

核心:目的

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

塞尔吉奥·皮德蒙特Unsplash 上拍摄的照片

就像太阳一样,我们的核心是巨大能量被召唤并流向外层的地方,这就是为什么我之前把动机描述为一种流动——它从内向外流经各层。我们可以把我们的核心定义为我们的“为什么”或者更好的“目的”。

明确我们为什么会增强聚集在我们核心的能量,这是我们动力系统中最热的区域——能量随着向外层的流出而减少。然而,为了获得清晰,我们必须问自己明确的问题。是的,没错,回答正确的问题会给我们一个更清晰的目标,让我们与那些消极的人区分开来。

为什么我想成为一名数据科学家?

为什么我想成为一名卡格尔大师?

为什么我想开始定期写关于人工智能的博客?

这些问题需要一定程度的自我意识,因为这些问题的答案应该带来意义和进展,因为这些是动力的持续因素或“让火燃烧的东西”。当一件事有意义时,它会给对我们重要的人或事增加价值,而进步是我们继续前进的动力。

当能量从目的中释放出来时,它应该被导向某些东西

辐射层:驱动

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

照片由丹金Unsplash 上拍摄

不断看到问题?这些是我们激励系统中的驱动力。他们放大了核心,我们的目的。例如,看到所有正在努力进入数据科学领域的人,在你的投资组合中没有任何数据科学项目,或者希望提高你的数据科学技能以获得更好的薪酬工作(甚至最终可能创办自己的公司),这些都可能是驱动因素。

驱动力很重要,因为它们为你的超越创造了有利的环境。你可以看到需要修复的地方,然后进去。你的司机的重要性也可能会在你内心产生一种紧迫感,例如,你可能会因为疫情而处于失业的边缘,但你有一个依赖你的家庭。这些是司机!

对流层—识别

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

MD 杜兰Unsplash 上的照片

这就是已经过渡到数据科学的天文学家可能会让我明白的地方,因为对流描述了由较热且密度较低的材料上升的趋势以及较冷且密度较高的材料在重力影响下下沉的趋势导致的流体内部的运动,从而导致热量转移——来源于牛津词典。然而,当我将对流区描述为动机系统的一部分时,我主要指的是产生光的对流区的表面——即光球层。

这是我们动机系统的最外层,包括任何形式的外部认知,它可能是我们动机的一种形式。例如,我们可能需要数据科学社区的尊重、表扬、赞美、加薪、鼓励、反馈等。这些都在产生光的对流层的表面。

如果你记得我之前提到过对流——当辐射带附近的物质上升到太阳表面,然后又下降。我们得到的认可又下降了,这让我们看到了更困难的问题,为我们提供了更多改进的空间。

当我们看着激励我们的人时,这就是我们所看到的。通常,我们试图将我们的动机建立在这一点上,并向内工作,现在你可能会发现这并不是它是如何工作的!

结论

如果我们要为我们的数据科学事业创造持久和自我维持的动力,我们必须能够从我们正在做的事情中获得意义。不仅如此,它必须是有趣的,并且尽可能与工作无关。一个快乐的数据科学家不是在工作,而是在尽自己的一份力量让世界变得更美好。

如果您认为我遗漏了什么,或者您想向我指出什么,或者如果您仍然不确定什么,您的反馈是有价值的。发个回应!

然而,如果你想和我联系,我在 LinkedIn 上是最活跃的,我也很乐意和你联系。

[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…

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

您可能感兴趣的其他一些故事:

[## 数据科学家如何更快地学习

学会学习的有效策略

towardsdatascience.com](/how-to-learn-faster-for-data-scientist-cfd96d317ce6) [## 当你试图成为一名数据科学家时感到沮丧的原因

将最优秀的人与众不同的隐藏技能

towardsdatascience.com](/the-reason-youre-frustrated-when-trying-to-become-a-data-scientist-2d2b8b402811) [## 学习数据科学的 3 个阶段

了解学习的 3 个阶段,以及我们如何将其有效地应用于数据科学学习

towardsdatascience.com](/3-stages-of-learning-data-science-9a04e96ba415)

蒸汽推荐系统

原文:https://towardsdatascience.com/steam-recommendation-systems-4358917288eb?source=collection_archive---------22-----------------------

这篇文章是关于 Steam 网站上的推荐系统的。

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

梁、谢一凡在浏览

的销售网站时。我们沉迷于那些商家的种类和品种。由于网站的设计,我们可以很容易地点击和购买。有时候,这种购买看起来很烦很晕,人们被困在商家里,找不到他们的 gorals,很多平台有成千上万的用户和游戏。因此,大多数网站都致力于让每个用户都喜欢和适合商家,让每个用户都有良好的游戏体验。

本文将游戏售卖平台“Steam”的推荐系统设计成五个部分,分别是基于人气、基于质量、基于内容、协同过滤、规模上的推荐。我们将介绍我们的项目从获取数据,建立模型,以及我们使用的算法和我们最终得到的结果。

下面是 GitHub 上这个项目的源代码链接:

https://github . com/AlbertNightwind/Steam-recommendation-system

关于蒸汽的介绍

什么是 Steam
Steam 是一个在线、跨平台的游戏分发系统,拥有约 7500 万活跃用户,总计约 1.72 亿个账户,托管超过 3000 款游戏,这使其成为本文介绍的这类作品的理想平台。该数据集包含超过 3000 个游戏和应用程序的记录。

Steam 是由 Valve 提供的视频游戏数字发行服务。它于 2003 年 9 月作为一个独立的软件客户端推出,作为 Valve 为其游戏提供自动更新的一种方式,并扩展到包括第三方发行商的游戏。Steam 还扩展到了一个在线网络和移动数字店面。

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

https://store.steampowered.com/search/?filter = globaltopsellers&OS = win

数据集
我们使用了 NumPy、pandas、requests、sys 的一个包,通过 Steam Spy 的 API 获取我们需要的数据,并使用 JSON 进行存储。
目的
根据游戏的受欢迎程度、游戏描述的相似程度、游戏的质量、玩家对游戏的偏好,向游戏玩家推荐相应的游戏,使 steam 获得更高程度的客户满意度

建立推荐系统的步骤
第一部分:基于人气的推荐
对于 Steam 网站的新用户来说,他/她所知道的都不算什么,也许让那些新用户了解这个网站最高效的方法就是给他们一些其他以前用户拥有的最受欢迎的游戏。而且这些热门游戏没有时间限制。自从他们出现在这个网站上,他们一直是受欢迎的游戏。

1.在做推荐之前,我们首先需要提取 app_id、游戏名称、拥有者、价格,所以我们需要做的第一步是通过请求访问 steam API,提取两周前 100 名游戏的相关数据,通过 JSON 将数据保存为 CSV 格式,以备后用。接下来,我们将使用 pandas 将数据转换为数据帧格式。

2.我们根据拥有者的数量对游戏进行降序排列(在这一部分,我们认为默认拥有者最多的游戏在这里最受欢迎)

以下是 Steam 网站上热门项目的所有者排名,其中一些实际上不是游戏而是软件:

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

按所有者数量列出的顶级项目

Part2:基于质量的推荐
由于 Steam 是一个非常全面的网站,所以很直接的我们就可以得到其拥有者最热门的游戏,这对于冷启动用户来说是一个很好的开始。但是这种方法是否能让一些普通用户满意呢?也许答案不是“是”。那些受欢迎的游戏总是有更多的用户,更多的正面或负面评论。从商业角度来看,游戏所有者被事实所说服。他们更关心游戏的质量,而不是销量。然而,一些游戏有更多的所有者,也许是因为媒体的宣传,著名的游戏工作室以及 Steam 网站本身。总的来说,因为玩家对于游戏的配合,网络游戏总是比非网络游戏拥有更多的用户。从普通用户的角度来看,他们中的许多人更关心这个游戏是否得到大多数留下评论的用户的积极评价。因此,所有评论的积极评论率(我们这里对“基于质量”的定义)可以很好地评估这款游戏在用户中是否具有良好的质量。

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

用户评论最多的 10 款游戏

1.我们首先还提取 app_id、游戏名称、所有者价格、正面评论和负面评论。然后我们把它们存储在 JSON 里,分别列出了每款游戏的所有评论,因为 app_id 是不可变的。这样就可以观察每款游戏的正面评价和负面评价的数量。

2.接下来,我们将每款游戏的评论集合起来,在原始数据框中增加了两列,分别是正面评论数和负面评论数,但正面评论数和负面评论数是独立的,也就是说,如果 A 的正面评论数相对低于游戏 B,但游戏 A 的总评论数远低于游戏 B,在这种情况下,显然游戏 A 的正面率更高。为了让分析更准确,更直观,我们增加了一栏好评率,也就是用好评数除以总评论数,这样我们就很容易在商品评论中看到一个好评的比例。

在这一步的最后,我们根据游戏的好评度对它们进行了排序。排序后,游戏对应的 ID 保持不变。

结果是:

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

按正比率排序的游戏

第三部分:基于内容的推荐

对于第 3 部分,我们认为该项目将集中于游戏的描述,因为游戏的描述不是直接从 Steam API 访问的,我们必须访问 Stem 网站来浏览这些描述。

因此,我们通过唯一的游戏 id 来访问每个游戏的描述,因为每个游戏都有一个通用的网站标准格式,我们首先复制通用的 HTTP 格式,然后我们将这些通用的 HTTP 格式与每个游戏的唯一 id 连接起来,然后将它们与每个游戏的数据帧存储在一起。然后我们通过 HTTP 请求访问它们,并首先将它们存储到一个新的 DataFrame 列中。
在这一部分中,我们想用对每一款游戏的描述来分析两款游戏之间的相似性,并根据相似性向玩家推荐合适的游戏。(如果玩家 A 喜欢玩游戏 A,并且游戏 A 和游戏 B 有很高的相似度,我们假设玩家 A 会喜欢游戏 B)

1.我们首先组装链接,我们可以得到游戏的描述。

这一步的结果是:

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

游戏及其 HTTP 描述

2.接下来,我们使用漂亮的汤包来解析这些游戏的描述,我们首先移动我们不需要的项目,如停用词和一些会妨碍我们的符号。

然而,从 HTTP 请求中得到的每个结果都是 HTTP 文本,其中包括许多 HTTP 标签和格式。为了看到纯粹的游戏描述,我们绝对需要删除它们。因此,我们在这里使用 python 的正则表达式。通过正则表达式对数据进行清洗后,得到了数据描述列。每个游戏的信息,后面是游戏描述。我们得到的一个清晰的描述是:

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

下一步,我们将使用这些游戏描述来提出我们的建议。诚然,这里的游戏描述是代表“内容”的。

由于基于内容的模型与这些内容文本相联系,它与自然语言处理领域有一些内在的联系,我们将在这里重点介绍一个基本的自然语言处理模型 TF-IDF,它专注于内容文本中每个单词的权重。每个单词的权重将不仅通过其在该内容文本上的频率来加权,而且通过所有文本集的频率来加权,并且 TF-IDF 的算法是:

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

https://www . search engine journal . com/TF-IDF-can-it-really-help-your-SEO/331075/

以下是每个游戏描述示例中每个单词的 TF-IDF 值:

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

TF-IDF 值格式

在我们得到每个单词的 TF-IDF 值后,这里使用线性核来计算这个游戏的描述 TF-IDF 权重和其他游戏的描述 TF-IDF 权重。由于 python 中的 Tf-IDF 矢量器会产生一些“文本中的单词权重”矢量,下图显示了这些矢量的一个示例,这里我们有一个包含两个文本的文本:“这是非常奇怪的非正式形式,这非常好”,如图所示,第一个数字是文本编号,第二个数字是这个示例文本集中单词的编号。然后就是这个词在这篇课文里的 TF-IDF。这里将使用值线性核来乘以这些向量。线性核的基本原理是:如果有两个维数相同的矩阵,这些矩阵中相同位置的一些大值会使它们的乘法结果在线性核计算的最终矩阵中仍然很大。

然后我们会把线性核计算出来的这些结果做一个序列,如果结果高,我们会把它们作为这个游戏最相关的推荐。这里我们列出了 10 大推荐。

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

基于内容的 10 大推荐

推荐结果在主观和客观上都比较激进,比如对于游戏《传送门 2》,最相似的游戏是自己,然后是《传送门 1》,反之亦然。同样,对于游戏《传送门 2》的其中一个推荐《Left 4 Dead 2》,我们也可以看到另一个推荐是《Left 4 Dead》。这是一个有趣的现象,因为对于一个游戏的所有推荐,这些推荐在人类认知中仍然彼此具有内在的关系。

第四部分:协同过滤推荐

数据获取
我们通过随机搜索用户的 steam 名称(也就是说我们假设了一些任意的名称,比如“43”等)来获得这些链接。)并将他们的 steam ids 与网站格式放在一起。然后我们得到所有这 10 个链接,包括用户的个人资料。https://steamidfinder.com/该网站将通过粘贴 Steam_ID 或一个随机的用户名让我们访问用户的个人资料,我们需要这样做,因为有时我们无法在 Steam 网站上通过用户名访问用户。

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

用户的个人 steam 信息链接

然后我们使用 requests.get()通过这 10 个链接获取播放时间信息。

数据修改

然而,steam 网站和 steam API 上都没有关于这些用户持续评分的记录。实际上,在 Steam 平台上,用户只给出“推荐”或“不推荐”,也就是二元评价,正面和负面,即使在用户网站上,仍然没有一星到五星等连续评分的机制。为了获得关于用户-游戏交互的连续评分,我们必须假设一种用户游戏评分交互机制。因为用户对游戏的关注度可以通过游戏的播放次数来反映。我们可以假设播放时间是关于用户兴趣的相当有说服力的信息。

因此,这里我们假设游戏时间中位数是兴趣的一个非常重要的部分。为了比较平均游戏时间,我们将比较每个用户在该游戏上的平均游戏时间和所有用户在该游戏上的平均游戏时间,然后我们将使用算法将这两个平均游戏时间的比较分成从 1 到 5 的范围,这将帮助我们填写连续评分数据框。

至于用户玩一个游戏的平均时间,我将它们与这个游戏的用户总玩时间进行比较。考虑到大多数用户会给游戏一个正面评价,如果他们玩这些游戏的时间不是很长,他们仍然喜欢这个游戏,除非这个游戏相当糟糕,这里我们选择“永远前 100”,所以他们都是非常受欢迎的游戏,他们大多数都有相当高的正面率,超过 90%。因此,我给出了一个积极的评级标准。在本节中,我假设如果一个用户的游戏时间大于这个游戏所有用户的游戏时间中位数(游戏时间中位数)。我假设这个用户对这个游戏的评分是 5;如果用户的游戏时间小于中值游戏时间但大于中值游戏时间的 0.8 倍,则评级被假定为 4;如果用户的游戏时间小于中值游戏时间的 0.8 倍,但大于中值游戏时间的 0.5 倍,则评级被假定为 3;如果用户的游戏时间小于中值游戏时间的 0.5 倍但大于中值游戏时间的 0.1 倍,则评级被假定为 2;如果用户的播放时间小于 0.1 乘以中值播放时间,则评级被假定为 1。

由于该用户的档案列表中没有“不玩时间”游戏,我认为该用户没有表达他/她对该游戏的偏好,该游戏的评分为 0。

现在,我们有了从 1 到 5 的连续评级,并将它们与其他信息一起存储为数据帧格式,数据帧如下所示:

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

这是我们使用余弦相似度时,第 7 项的推荐结果。

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

第五部分:大规模推荐及结果评估

在这一部分中,我们仍然使用我们在第 4 部分中修改的数据。

在这一部分,我们将重点介绍大数据平台上的推荐,这次我们选择 Spark ALS 作为在大数据平台上运行的算法。Spark ALS 可以将每个输入会话放入一个特殊的数据结构 Spark RDD。在我们的项目中,我们使用一种输入数据格式,它由 User_id、game_id 和用户对这个游戏的评价组成。这三个特征将被视为 CSV 数据列,然后它们将被 spark 会话读取。在这一部分中,每个用户的播放时间数据,不能通过 Steam API 获得,因此,我们必须访问每个用户的个人资料,但是,对于那些没有设置他们的资料或使他们的资料私人化的人,我们不能从他们那里获得播放时间信息。因此,我们必须一个接一个地访问那些公共配置文件,并获得我们所需要的信息。因此,在这一部分中,数据集可能比先前建议的数据集小得多

火花 ALS

ALS 是一种矩阵分解算法,它将一个高维的用户-项目交互矩阵分解成两个低维矩阵,在这个用户矩阵中,行代表用户,列是潜在因素。在项目矩阵中,行是潜在因素,列代表项目。在论文[5]中,因式分解矩阵模型学习将评级矩阵因式分解成用户和项目表示,这允许模型为用户预测更好的个性化项目评级。

通过矩阵分解,不太知名的项目可以像流行项目一样具有丰富的潜在表示,这提高了推荐系统推荐不太知名项目的能力。我们使用基于隐式评级的交替最小二乘法(ALS)来构建推荐模型。

结果
对于 spark 推荐的结果,我们通过 user_id 和推荐次数设计了一个个性化的推荐,然后 part 会给出 Spark ALS 计算的关于该用户在这 10 款游戏上的模拟评分。如前所述,我们必须按照用户 ID 逐一查看 steam 网站上的每个公共用户资料,然后获取数据,因此数据集的容量不是很大。随着越来越多的用户的原始评分数据被输入到 Spark 工作流程中,该用户对 Spark 制作的热门项目的模拟评分将会更高,这些模拟评分按降序分组。

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

Spark ALS 制作的推荐结果数据框架

评估

在包含游戏评级的游戏推荐之后,我们使用 RMSE 作为我们推荐的结果评估。随着数据集的扩大,RMSE 评价将得到改善。这意味着我们的推荐会有更高的用户评分。

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

结论
在这个项目中,我们只使用了一些基本的技术来模拟一个推荐系统。一个成熟的推荐系统不仅由单一的技术组成,还包括商业策略。
由于实际情况混合了许多复杂的因素,我们构建了一个模型,使多种技术能够叠加。如果要完成一个更加完善的推荐系统,我们需要更多的探索和研究。

未来工作

在未来,我们将深入研究协同过滤及其在几个评估中的表现。一些复杂的算法,如 PCA 和 SVD 可以很好地补充我们的推荐系统。我们将考虑二元评级和连续评级的建议。然后,我们仍然希望对游戏描述数据使用更多的 NLP 文本分类。

感谢您的阅读!欢迎任何反馈。万事如意!

参考

[1]https://galyonk . in/some-things-you-should-know-on-steam-5 eaffcf 33218?gi=6052b30aa193

[2]https://towards data science . com/large-scale-jobs-recommendation-engine-using-implicit-data-in-py spark-CCF 8d F5 d 910 e

[3]https://spark . Apache . org/docs/2 . 2 . 0/ml lib-collaborative-filtering . html

[4]https://spark . Apache . org/docs/2 . 2 . 0/ml-collaborative-filtering . html # cold-start-strategy

[5]https://towards data science . com/prototyping-a-recommender-system-step-by-step-part-2-alternating-least-square-als-matrix-4a 76 c 58714 a 1

[6]https://towards data science . com/python-data-预处理-使用-熊猫-data frame-spark-data frame-and-考拉-dataframe-e44c42258a8f

调查性新闻的偷拍:一把双刃剑

原文:https://towardsdatascience.com/steeling-faces-for-investigative-journalism-a-double-edged-sword-8d7d3719ad5?source=collection_archive---------53-----------------------

人脸识别技术的开源研究与验证介绍(上)

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

一个伪造的 VK 资料偷走了我的脸,可以通过 FindClone 发现

偶然发现了自己的脸。我注册了 FindClone.ru,这是一项俄罗斯服务,允许任何有电话号码的人搜索 VK 社交媒体账户的个人照片(俄罗斯的脸书)。你提供一张照片,他们会告诉你照片是谁。

FindClone 在新闻调查中非常有用。我用它来工作。王高·托勒在他给 Bellingcat 的曝光中提到过它(看它的行动。Bellingcat 俄国问题负责人克里斯托·格罗泽夫用它揭露了一名 GRU 黑客的身份。

我想知道 FindClone 在我自己的脸上有什么可以提供的。我上传了一张旧的个人资料图片,看,有一个匹配。有人偷走了我的脸,把它变成了他们的。

有趣的是,我的出生日期与模仿者使用的日期相差不远(但年份完全错误,真实的我更年轻,眨眼)。还有,模仿者说他是单身,我不是。叶夫根尼甚至有了一个追随者,一个名字为埃琳娜·阿贡科娃的账户,她因违反 VK 的条款和条件而被屏蔽(我想知道那个账户是否也是假的)。

这位叶夫根尼 T10 使用的我的图像是在伦敦南岸的英国 BFI 拍摄的。就是左上方那个,穿白领衬衫的我(周围有浅绿色圈)。我用一个英国电话号码注册了 FindClone,添加了我的照片,直到出现了一些建议。有一个真正的阳性匹配和一些奉承的假阳性。例如,我与波拉特(第 7 排,来自电影海报图片)和瑞安 _ 雷诺兹(第 5 排,来自古龙水包装盒)的脸匹配。

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

我用一个电话号码注册了 FindClone,添加了我的图片。有一个真正的阳性匹配和一些奉承的假阳性。我被配上了波拉特(第 7 排)和瑞安 _ 雷诺兹(第 5 排)的脸

有人偷了我的照片,我并不沮丧,但我认为这仍然是不可思议和不道德的。更令人恼火的是,FindClone 的面部识别算法将我与波拉特和瑞安·雷诺兹匹配起来(他们两个我都不喜欢)。

作为一名对虚假信息和假新闻感兴趣的调查记者,我对 FindClone 和面部识别的潜在价值很感兴趣。

警察用面部识别软件监视我们。作为道德调查记者和公民,我们现在可以密切关注他们(当然,只能在合法的范围内)。

在线冒充有多普遍,尤其是在虚假的社交媒体账户中?很常见。典型的服务挣扎。像 Tinder 这样的在线约会服务做得最多。虚假的个人在平台之外撒谎。脸书收紧了使用真实身份的要求。

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

脸书重新注册时的注意事项(2018 年出台的新名字政策,不允许使用假名字)。更多信息点击这里

作为一名调查记者,建立一个欺骗账户是在收集到足够的信息之前保持不被发现的一种方式(这也相当常见)。当研究一个有争议的故事时,保持低调会有所帮助,直到你的包里有足够的证据给你的编辑。

当你这么做的时候,帮你自己一个忙,在选择一个假的个人资料/名字/图片(或者根本没有图片)的时候要有创造性。作为调查记者,我们仍然必须尊重他人的隐私。

股票图像配置文件

用股票图片伪造社交媒体个人资料非常普遍。让我们想象一下,我们被迫用假身份报名参加 VK。错误的做法是使用免费股票图片平台的股票图片,如 Dreamstime(我希望你能得到更广泛的点击,这里。不要做)。这是假账户中的一个流行选项。

FindClone 可以对我们的调查有所帮助。让我们搜索“猛男垃圾背景男性时尚”。我知道,很具体。但是请原谅我。我们在屏幕上看到这个人,一个面部特征鲜明的金发男模特。

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

在免费股票图片平台 Dreamstime 上搜索。一个照片模型出现了(我这样做是因为我知道 VK 有很多假冒这个人的假账户)。在你寻找和描写谁的时候要合乎道德。

让我们前往 FindClone 并上传模特的图片。

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

你看到我看到的了吗?这家伙不仅是一个受欢迎的股票图像模型。大量可能是虚假的账户利用他的脸来冒充(虚假)身份。如果你正在调查虚假信息和虚假社交媒体账户——你发现了一系列最近建立的 Twitter 账户,你想检查一下——比较股票照片可能会给你第一手线索。

这是因为模仿者和恶作剧者也可能只是懒惰的人类(除非他们不是人类或懒惰)。

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

一名伊朗秘密特工的假资料(来源:SECUREWORKS)

一个简单的面部检查可能有所帮助的著名例子是 Mia Ash 的案例。这是一个假的女性资料,结果是一个伊朗黑客。伪装得很差,但很好(我知道这一点,因为我调查了当时的情况,并采访了 SecureWorks 的专家)。

参与此案的专家表示,“黑客组织不辞辛苦地建立一个如此长时间运行的、有血有肉的角色”是很罕见的。但是,如果与其他公开来源的数据相比,这些图像可能很容易引起争议。

通过搜索我收到的男性股票模型的 VK 帐户结果,我们找到了一张,似乎是我们男人的真实私人照片。它显示他和两个熟人或朋友在一起。我们可以分析背景来检查图像是在哪里拍摄的。我忍住了,因为我尊重这个家伙的隐私,他没做错什么。

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

俄罗斯社交媒体平台 VK 上的一名男性股票模特(左)和朋友们在一起

简而言之,FindClone 非常强大,可以支持对可疑帐户的验证。这对于虚假社交媒体账户分析非常有用。我最近遇到了一个案例,一个声称对我的工作感兴趣的客户找到了我。他或她只在 Linkedin 上与调查记者交朋友,没有任何记录(无论是在新闻方面,还是在任何其他方面),并且几乎与另一个同名、相同教育背景、来自相同地区的账户完全匹配。给账号背后的人指出来之后(我们聊了一会儿),这个账号就在平台上神秘消失了。巧合吗?有可能。但是机会是如此的渺茫。值得谨慎。

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

一个名为 Robinson Zhang 的人伪造了 Linkedin 个人资料帐户,他说他在 R&C 资本公司工作,“一家总部设在香港的国际咨询公司”(纽约时报报道)

有证据表明,Linkedin 成为间谍机构招募特工的首选工具。《纽约时报》的一项调查发现,有证据表明中国特工利用该平台联系外国公民,其中也包括前政府官员。但是要小心,误报的可能性总是存在的(Linkedin 上有一大堆其他罗宾逊·詹的个人资料)。

为开源调查创建自己的面部识别系统有多容易?

这太简单了,简单得令人害怕。让我们更进一步,从我通过 FindClone 找到的图像(在我身上)建立一个面部识别数据库。让我们假设你遇到了一张新面孔,并想检查它是否与你的人的图像数据库中的条目相匹配(这是我第一次上传到 FindClone 的我自己的图像)。

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

我很快从 FindClone 结果中截取了 23 张图片。第 24 个是我知道是我的那个(被叶夫根尼·普利什金偷走)。

我们快速安装 一个叫做 face_recognition 的 python 库。这是目前最简单和最容易的孩子玩即插即用的面部识别软件。

我们运行以下命令,将 FindClone 搜索结果中的图像(FindClone 中的“known_images”文件夹)与“new”图像(My_Image 文件夹中的 my image)进行比较。

$ face_recognition。/known_images 文件夹/。/My_Image 文件夹/

当我运行这个命令时,我得到了五个选项。一张是假冒的 VK 社交媒体账户从我这里偷走的脸。其他的都很接近。换句话说,我们将可能的 me 的命中列表减少到了一堆可以看到的帐户。

如果您使用成百上千个可能匹配的图像进行调查,并且想要减少嫌疑人的列表,这可能会很有用。

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

我得到了 Ben_New(上传的图像)和 Ben(数据库中的图像)之间的正确匹配

仅供参考(可以说是一个愚蠢的标题,引用了 1982 年詹姆斯·邦德的电影)

在我的 Medium 账户上,我出现了一张照片,照片中我的半张脸被一条鲜红色的条纹遮住,这是我在公共场合戴口罩的承诺。

如果我们对来自我的媒体账户的图片和其他五张图片(来自谷歌图片的随机媒体)进行测试,这个系统足以产生匹配。

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

这个算法足够复杂,可以定位我扔给它的五幅图像中的两幅。

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

甚至连眼镜都不重要

事实上,眼镜和口罩并不是匹配人脸的大障碍,我不必解释这对于#OSINT 调查来说是多么不可思议的强大(同样,对于执法领域来说也是如此)。

想象一下,对于一个戴着口罩或留着大胡子的人,你只能从糟糕的视频片段中获取一个图像。你仍然可以将它与你的嫌疑人资料库中的一组图像进行匹配。

“胡子、青春、帽子”测试

让我们看看胡子是否重要。我也有一张我年轻得多的照片。头饰像帽子一样重要吗?

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

面部识别匹配各种干扰因素

我戴着帽子的图片很容易与我从网上得到的另一堆图片匹配。

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

冬帽形象搭配我戴鹿角的和留胡子的。

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

胡须的形象与戴着冬帽的形象相匹配

我十岁时的形象无人能比。这稍微限制了#OSINT 调查的使用。但是总有变通的办法,比如让人变老(一个在线工具叫做 C hangemyface ,例如,如果你正在寻找一个年长的人,但是你手头只有一张他们年轻时的照片)。

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

我的自画像与那堆照片中的错误图像匹配,但它仍然是匹配的

**其他发现:**我找不到穿蓝色西装的自画像的直接匹配(要么是验证我糟糕的绘画技巧,要么是人工智能的问题?,我不确定)。但它确实为自拍和戴眼镜的黑白照片找到了匹配。

这要么是难以置信的好,要么是难以置信的坏。python 库声称,它在 Wild benchmark(这是一个用于人脸验证的公共基准,也称为配对)中的标记人脸上具有 99.38%的模型准确率。

我注意到,一般来说,系统很难匹配有胡子的人。同样,如果你在网上搜索一些去除胡须或添加胡须的方法(我可以想象,化妆也有类似的例子。您可以在某些地方将其添加到图像中)。

此外,如果您的图像得到多个匹配,可以增加或减少容差值,以使面部比较更严格/不严格。你甚至可以计算“面部距离”,以防你采用数据驱动的方法。还有吨的其他例子。我建议您仔细阅读它们,以防在您的 OSINT 调查中偶然发现一个特定的用例(再次强调,当您这样做时,请站在道德的角度)。

例如,您可以运行一个视频,当 python 库在您的存储库中找到一个熟悉的面孔时,它会提醒您。如果你有一个很长的视频,比如人群中的示威者或警察,这可以节省你大量的工作(一个漂亮的视频讲解器提供了这个教程,展示了如何用 python 库操作相机)。

布法罗警察部队案件

6 月 4/5 日,新闻媒体报道称,一名和平的老年抗议者被布法罗警察推搡,摔倒在地,开始流血。这是一起不必要的、无法形容的警察暴行。在撰写本报告时,受害者仍处于危急状态。

两名警官被停职,两名警官现在被指控犯有重罪袭击。两名警官被认出,一名被记者认出,因为他制服上的姓名标签在录像中清晰可见(亚伦·托加尔斯基)。但还有第三个官员,他也是整个视频的关键人物(视频是由当地电台 WBFO 拍摄的)。

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

第三名军官的姓名牌仍然未知:更新:姓名牌应该是“J. LOSI”

当他跑向另外两个警察时,他是进入现场的一个人,似乎在帮助推那个抗议者。

他也是那个将试图跪下来帮助/检查流血抗议者状况的警察拉回的人。在他的头盔上,这位警官写了“PL1”。

该视频迅速火了起来。这位官员的形象非常模糊。让我们看看 python 系统是否可以将 Robert McCabe(一号警官)和 Aaron Torgalski(二号警官)的面部——由伊利县地方检察官办公室提供——与第三名警官进行匹配。

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

面部识别算法正确地指出了第三名警官(仍未确认身份)和另外两名警官之间的区别(纽约时报发布的照片)

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

正确:前两个被指控的警官和第三个不匹配

我们还可以在手头的视频上测试面部识别算法,测试另一张模糊的图像。事件发生后,有一张照片是从不同的角度拍摄的,我推测是记者/摄影师拍摄的。

很明显是同一个人(J. Losi)。但是想象一下对比图像来自一张模糊的 Instagram 或脸书照片(仅供参考,我检查了整个水牛城警察局的 Instagram 和脸书账户,这些家伙不在那里。在他们的网站上,也没有这个人的照片。如果你有线索,请联系我。

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

我们将一位摄影师拍摄的图片(左图)与视频截图(右图)进行比较

该算法能够进行正确的连接。

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

我们看到面部识别算法在一群同事中找到了合适的警察

我们现在看到了面部识别软件有多么强大,我们可以自由和无限制地使用它。我们测试了它在不同方面的表现以及存在的问题。现在是时候做你自己的新闻调查了。

更新:

这个故事的快速更新。第三个军官,名字标签不可读的那个,叫约翰·洛西。名牌上写着 j .洛西。这位警官也出现在另一张照片中,他正和其他警官一起跪下。让我们快速检查一下算法是否能从视频中识别出他。

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

我们找到匹配的了。尽管有头盔,该算法可以将 Losi 从视频锁定到其他图像。

澄清:我想强调的是,这一分析并不是要指责第三名警官(尽管,很明显,他拉起了他的同事——他打算检查受害者——警官罗伯特·麦凯布,让他继续前进)。从视频中无法直接看出 Losi 是否有意推搡受害者。他本可以首先阻止罗伯特·麦凯布推被害人。我不是来评判这个的。所有这些工作表明,确认身份和面孔之间的联系并使这一过程自动化是可能的。

结论:一把双刃剑

很明显,这类软件需要进行一些道德斗争。将这样一个强大的工具放在罪犯或任何怀有恶意的国家黑客和机构手中(或计划继续限制记者)是很危险的。

但是,对于开源调查,我们需要务实,我们已经看到了该系统在哪些方面以及如何表现出色。

**令人担忧的一面:**可怕的是,任何人都可以根据自己的意愿构建面部识别系统。从公共网站(如社交媒体平台)收集数据从来都不是一件难事。但是专业人士可以扩大规模。这是个问题。

社交媒体公司试图让任何人都更难从社交媒体账户上窃取图像和个人信息。

脸书现在明确地在他们的 robots 文件(该文件告诉搜索引擎爬虫可以或不可以从脸书请求哪些页面或文件)的开头警告你。上面写着“除非你有明确的书面许可,否则爬脸书是禁止的。”

Instagram 以图像为主,与我们在帖子中谈到的面部图像识别设置相关。其他#OSINT 专家(特别是杰克·克雷普斯)提到了 Instalooter ,一个抓取 Instagram 图片的工具。我不确定它是否还在运行,但是如果你在办案的话,它可能会有所帮助。

专家指出,除了 2018 年脸书的数据封锁,Instagram 还受到了数据访问限制,使其不那么可靠(再次强调,如果你这样做,保护人们的隐私,保持理智)。

GDPR 也值得考虑。专家强调,如果你试图从社交媒体平台上抓取个人数据,被起诉的几率会增加。你,一个守法的侦探,不应该对此掉以轻心。在欧盟,个人必须给你许可(明确同意)。否则,在 GDPR 治下搜集欧盟居民的个人数据是非法的。

但我们不要自欺欺人。如果专业机构或精通技术的黑客想在社交媒体上保存图片,总有办法做到(我们记者应该密切关注这种操作)。

FindClone 的更多信息:FindClone 是一个相当温和的在线面部识别应用程序版本。它取代了一个专业(也更令人担忧)的选项,一个叫做 SearchFace 的服务。过去,SearchFace 为有问题的角色提供了一个平台,告知出演色情电影的女性的家人,分享她们的秘密。这是不道德的,充其量是不道德的。肇事者这样做是为了引起“道德上的愤怒”,声称性行业的女性是腐败和欺骗性的。“有人可以利用这样一项服务来轻易攻击无辜的人,这令人深感担忧。

作为用户服务的 SearchFace 去年被关闭,但此后其背后的组织似乎又活跃起来。它现在正在积极推广其追捕新冠肺炎锁定破坏者的能力,这是另一个潜在的问题/不道德/不道德的努力。

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

广告声称,NtechLab 解决方案的算法在识别违反隔离的人方面表现出了很大的有效性,同时跟踪潜在传染性和及时通知各自当局之间的社会互动。

我不同意他们的观点,即面部识别应该商业化,以追捕那些违反封锁规则的人。这是一个调查记者可能想要更深入研究的话题。

感谢你阅读这篇文章。如果你有问题/想法/意见,请通过我的质子邮件账户联系:techjournalism11@protonmail.com

自然语言处理中的词干,是什么?

原文:https://towardsdatascience.com/stemming-of-words-in-natural-language-processing-what-is-it-41a33e8996e2?source=collection_archive---------13-----------------------

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

词干提取是几乎所有自然语言处理(NLP)项目中最常见的数据预处理操作之一。如果你是这个领域的新手,即使你遇到过这个词,你也可能不知道这是什么。您可能还会混淆词干化和词汇化,这是两种类似的操作。在这篇文章中,我们将通过一些例子来看看词干到底是什么。我希望我能用简单的语言为你解释这个过程。

堵塞物

简单来说,词干化就是去掉一个词的一部分,或者说把一个词简化为它的词干或者词根的过程。这可能不一定意味着我们将一个单词减少到它的字典根。我们使用一些算法来决定如何砍掉一个单词。在很大程度上,这就是词干化与词干化的不同之处,词干化是将一个单词简化为它的词典词根,后者更复杂,需要非常高的语言知识水平。我们可能会在另一篇文章中讨论词汇化。在这篇文章中,我们将坚持使用词干并看几个例子。

假设我们有一组单词—发送、已发送和正在发送。这三个单词都是同一个词根的不同时态。所以在我们词干之后,我们将只有一个词——发送。类似地,如果我们有单词——ask、ask 和 asked——我们可以应用词干算法来获得词根— ask 。词干就是这么简单。但是(总有但是),很遗憾,没那么简单。我们有时会有并发症。而这些并发症被称为过梗欠梗。让我们在接下来的章节中了解更多。

过度堵塞

过度词干化是一个过程,其中一个单词的大部分被砍掉,超过了所需的部分,这反过来导致两个或更多的单词被错误地缩减为同一个词根或词干,而它们本应被缩减为两个或更多的词干。比如大学宇宙。一些词干算法可能会将两个单词都简化为词干 univers ,这意味着两个单词的意思相同,这显然是错误的。因此,当我们选择词干提取算法以及尝试优化模型时,我们必须小心谨慎。你可以想象,词干下是相反的。

底部堵塞

在词干提取中,两个或多个单词可能被错误地简化为多个词根,而实际上它们应该被简化为同一个词根。例如,考虑单词“数据”和“基准”有些算法可能会把这些词分别简化为 datdatu ,这显然是错误的。这两者都必须简化为同一个词干 dat 。但是试图优化这样的模型可能会反过来导致词干过多。所以我们在处理堵塞时必须非常小心。

我希望这有助于理解什么是词干以及词干的两种不同的错误。如果对此还有任何困惑,请在下面的评论中告诉我,我会尽力消除你的任何疑问。

原载于 2020 年 2 月 19 日我的 个人博客

词干化与词汇化

原文:https://towardsdatascience.com/stemming-vs-lemmatization-2daddabcb221?source=collection_archive---------2-----------------------

将单词截断到其词根或基本单位

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

词干化和词汇化是自然语言处理领域中的文本规范化技术,用于为进一步处理准备文本、单词和文档。在这篇博客中,您可以通过一种非常实用的方法来研究词干化和词汇化,包括词干化和词汇化的背景、应用,以及使用 Python nltk 包(Python 提供的自然语言包)对单词、句子和文档进行词干化和词汇化的方法

在自然语言处理中,你可能希望你的程序承认单词“kick”和“kicked”只是同一个动词的不同时态。这可以是将不同种类的单词简化为核心词根的概念。

堵塞物

词干化是产生词根/基本词的形态变体的过程。词干程序通常被称为词干算法或词干分析器。

通常,当搜索文本中的某个关键词时,如果搜索返回该词的变体,会有所帮助。例如,搜索“船”也可能返回“船”和“划船”。在这里,“boat”将是[boat,boater,boating,boats]的词干。

词干法是对相关单词进行编目的一种有些粗糙的方法;它基本上是从字母的末端开始,直到到达词干。这在大多数情况下工作得相当好,但不幸的是,英语有许多需要更复杂过程的例外。事实上,spaCy 没有包含词干分析器,而是选择完全依赖于词汇化。

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

波特·斯特梅尔

最常见也是最有效的词干提取工具之一是马丁·波特在 1980 年开发的波特算法。该算法采用了五个阶段的单词缩减,每个阶段都有自己的一组映射规则。在第一阶段,定义简单的后缀映射规则,例如:

*# Import the toolkit and the full Porter Stemmer library*
import nltk

from nltk.stem.porter import *p_stemmer = PorterStemmer()words = ['run','runner','running','ran','runs','easily','fairly']for word in words:
    print(word+' --> '+p_stemmer.stem(word))

输出

run --> run
runner --> runner
running --> run
ran --> ran
runs --> run
easily --> easili
fairly --> fairli

注意词干分析器如何将“runner”识别为名词,而不是动词形式或分词。此外,副词“容易地”和“相当地”源于不寻常的词根“easili”和“fairli”

雪球斯特梅尔

这有点用词不当,因为 Snowball 是由 Martin Porter 开发的词干语言的名字。这里使用的算法更准确地称为“英国斯特梅尔”或“斯特梅尔”。它在逻辑和速度上都比最初的 Porter stemmer 稍有改进。由于 nltk 使用名称 SnowballStemmer,我们将在这里使用它。

from nltk.stem.snowball import SnowballStemmer

*# The Snowball Stemmer requires that you pass a language parameter*
s_stemmer = SnowballStemmer(language='english')words = ['run','runner','running','ran','runs','easily','fairly'for word in words:
    print(word+' --> '+s_stemmer.stem(word))

输出

run --> run
runner --> runner
running --> run
ran --> ran
runs --> run
easily --> easili
fairly --> fair

在这种情况下,词干分析器的表现与波特斯特梅尔相同,只是它用“fair”更恰当地处理了“fairly”的词干

词干有它的缺点。如果给定了标记 saw,词干化可能总是返回 saw,而词汇化可能返回 see 或 saw,这取决于标记是用作动词还是名词

词汇化

与词干化相反,词汇化不仅仅是减少单词,而是考虑一种语言的全部词汇,对单词进行词法分析。“was”的引理是“be”,“mice”的引理是“mouse”。

词汇化通常被认为比简单的词干提取更能提供信息,这就是 Spacy 选择只使用词汇化而不使用词干提取的原因

词汇化查看周围的文本来确定给定单词的词性,它不对短语进行分类。

*# Perform standard imports:*
import spacy
nlp = spacy.load('en_core_web_sm')def show_lemmas(text):
    for token in text:
        print(f'{token.text:{12}} {token.pos_:{6}} {token.lemma:<{22}} {token.lemma_}')

这里我们使用一个 f 字符串通过设置最小字段宽度和添加 lemma 哈希值的左对齐来格式化打印的文本。

doc = nlp(u"I saw eighteen mice today!")

show_lemmas(doc) 

输出

I            PRON   561228191312463089     -PRON-
saw          VERB   11925638236994514241   see
eighteen     NUM    9609336664675087640    eighteen
mice         NOUN   1384165645700560590    mouse
today        NOUN   11042482332948150395   today
!            PUNCT  17494803046312582752   !

请注意,“saw”的引理是“see”,“mice”是“mouse”的复数形式,然而“18”是它自己的数字,而不是“8”的扩展形式。

结论

关于引理化需要注意的一点是,用一种新语言创建一个引理化器比用词干算法更难,因为在引理化器中我们需要更多关于语言结构的知识。

词干化和词元化都产生词尾变化单词的基本分类,因此唯一的区别是词干可能不是一个实际的单词,而词元是一个实际的语言单词。
词干提取遵循一种算法,对单词进行分步处理,这样速度会更快。然而,在词汇化中,你也使用语料库来提供词汇,这使得它比词干化慢。此外,你可能必须定义一个词类来得到适当的引理。

以上几点表明,如果速度是集中的,那么应该使用词干,因为词条分类器扫描语料库会耗费时间和处理。这取决于您正在处理的问题,它决定了应该使用词干分析器还是词法分析器。

感谢何塞·波尔蒂利亚在整个期间给予的帮助

注意 GitHub repo 中给出了所有解释的代码,并提供了更多示例,以增强您的知识并更好地掌握这个主题。此外,关于停用词和词汇的额外概念也包括在内。点击下面的链接:-

[## jn aditya-beri/词干化 vs .词汇化

通过在 GitHub 上创建一个帐户,为 aditya-beri/Stemming-vs-lemma 化开发做出贡献。

github.com](https://github.com/aditya-beri/Stemming-vs-Lemmatization.git)

这只是对什么是词干化和词汇化以及它们如何工作的一个小小的窥探。如有任何疑问和澄清,请随时回复本博客。

使用 Azure 在云上部署 ML 模型的分步方法

原文:https://towardsdatascience.com/step-by-step-approach-of-deploying-ml-model-on-cloud-with-azure-b7139cde7683?source=collection_archive---------36-----------------------

详细解释了如何使用 Flask app 将 GitHub repo 链接到 Azure 来部署 ML 模型

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

照片由 Waldemar Brandt 在 Unsplash 上拍摄

耶!!我建立了我的第一个 ML 模型,接下来我要做什么??我如何以及在哪里部署它?🙄

任何绝对的初学者在构建他们的第一个机器学习模型后都可能会遇到上述问题,本文将揭开如何在云上部署模型并实时检查结果的神秘面纱。

在这里,我将向您介绍一种在 Azure 上部署模型的可行方法,一旦您获得了 web 应用程序的 URL,您就可以与任何人共享它,它将全天候运行在服务器上😎

如今有了各种各样的工具,有许多不同的方法来部署一个模型。下面是我们将在本文中使用的工具。

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

下面是我们将要执行的步骤。

👉第一步:创建一个 ML 模型

这里我们关注的是部署的步骤,而不是训练模型的步骤。因此,我采用了一个样本数据,并在 Jupyter Notebook 中建立了一个线性回归模型。目的是当收入和家庭规模为独立变量时,预测每月的食品杂货支出。

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

完成线性回归模型后,将其另存为。pkl 文件以如下二进制模式写入。对于完整的数据集(Expenses_Prediction.csv)和代码(LR_Model.py),点击此处

pickle.dump(lr_model, open(‘E:\\lr_model.pkl’,’wb’))

👉第二步:创建 HTML 表单

为了预测费用,我们需要从表单中提供的新输入值中收集数据,然后使用我们的线性回归模型来预测输出,并在表单中显示结果。因此,我们正在创建一个简单的 HTML 表单,它将在浏览器中显示如下。

你可以在这里找到代号为 index.html 的代号

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

👉第三步:创建烧瓶应用

Flask 是一个用于在 Python 中构建 web 应用的框架。为了托管 HTML 表单,我们需要创建 Flask web 应用程序。要安装 Flask,请使用命令! pip 安装烧瓶

下面是理解 flask app 代码的快照,该代码名为 app.py。你可以在这里获得代码

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

将所有文件放在同一个文件夹中,您就可以在本地系统中测试这个 web 应用程序了。打开 Anaconda 提示符,进入 files 文件夹,输入 python app.py

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

复制网址( http://127.0.0.1:5000/ )并粘贴到你的网络浏览器中,点击回车。一旦提供了输入值,就可以预测费用。

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

如果您能够做到这一点,现在是时候在云上部署 web 应用程序了。

👉步骤 4:创建配置文件。

我们需要创建以下两个配置文件来继续部署。

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

Procfile*:*在 Procfile 中提到下面单行代码,这个文件不应该有任何扩展名。这是将要首先执行的文件。它使用 Gunicorn,这是一个用于 WSGI 应用程序的纯 Python HTTP 服务器,它充当 web 应用程序和 web 服务器之间的纽带。确保保存的文件没有扩展名。

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

***requirements . txt:***在此提及你所有的库及其依赖关系。txt 文件及其版本如下。

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

👉第五步:在 GitHub Repo 中提交文件。

GitHub 中创建一个帐户,并将所有文件上传到一个存储库中。如果您以前没有创建过存储库,请查看这里的内容

请确保将您的 index.html 放在模板文件夹中。你可以从我的 GitHub [ 这里 ]查看文件

👉第六步:将 GitHub Repo 链接到 Azure 并部署。

使用链接[ 此处 ]在 Azure 中创建您的免费帐户。

按照以下步骤将 GitHub repo 链接到 Azure

登录后,点击“应用服务

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

点击添加。如下填写 Web 应用程序中的详细信息。创建一个新的“资源组”。在实例详细信息中输入“名称”。点击审核+创建

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

点击创建后,你会看到下面的消息。点击“转到资源”。

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

点击左侧窗格中的部署中心

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

点击 GitHub 。第一次连接 GitHub,Azure 会要求授权。连接后,点击继续。

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

点击“应用服务构建服务”并继续。

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

在代码部分,“组织”会在连接 GitHub 后自动更新。选择所需的储存库并继续。

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

单击完成。

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

这将需要几分钟的时间来完成,同时您会看到状态为正在运行

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

完成后,您将看到状态为“成功”。点击左侧窗格中的概述

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

从右上角复制“ URL ”并粘贴到您的网络浏览器中。

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

你可以看到这个网址是用 Azure 域创建的。提供输入值并单击预测按钮。你可以看到预计的费用。

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

*又来了,耶!!你的机器学习模型现在运行在云上。*👍

总结

本文的目的是让您轻松理解部署,谁正试图迈出在云中部署模型的第一步。稍后,您可以探索各种方法,比如为自动部署创建管道,以及在云上训练模型,等等。作为数据科学专业人员,应该了解运行模型的端到端方法。

你可以从我的 GitHub 档案中获得完整的代码和文件

感谢阅读,快乐学习!🙂

逐步 AWS EC2 设置教程

原文:https://towardsdatascience.com/step-by-step-aws-ec2-set-up-tutorial-eae94213fd15?source=collection_archive---------33-----------------------

本文非常简单地介绍了设置 AWS EC2 实例的过程。我们会经历

  1. 实例初始化。
  2. 安装必要的软件和机器学习包。
  3. 将文件从本地文件传输到远程实例

对 AWS EC2 的快速解释将有助于我们了解我们在做什么。亚马逊弹性计算云(EC2)是亚马逊云计算平台亚马逊网络服务(AWS)的一部分。AWS 允许人们租用虚拟计算机来运行他们自己的程序和应用程序。AWS“实例”是一个虚拟机,由用户启动,并配置有任何所需的软件。用户可以根据需要创建、启动和终止他们的服务器实例,按秒为活动服务付费,并指定他们的代码部署和数据存储的地理位置,因此有了术语“弹性”

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

通过 Pixabay 将图像放大 200 度

1.设置 EC2 实例

首先,打开位于 https://console.aws.amazon.com/ec2/的亚马逊 EC2 控制台,点击“运行实例”。您应该会看到下面的页面出现。单击启动实例。

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

我笔记本电脑的截图

选择您想要使用的虚拟机类型。Amazon 机器映像是预先配置的虚拟机,充当您的实例的模板。

如果你是 Mac 用户,选择一个 64 位的 Linux AMI 是个好主意。

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

我笔记本电脑的截图

如果你知道你将在你的虚拟机上运行深度学习模型,那么就有专门针对这个目的的 ami。当然,可以设置基本的 Amazon Linux AMI 来运行这些相同的模型。

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

我笔记本电脑的截图

您还可以更改您的地理位置,以更改要部署的实例的位置。不同地理位置的价格会略有不同,我用的是 us-east-1。

接下来,选择实例类型来设置实例的存储和大小。T2.micro 默认设置为类型,符合亚马逊免费层的条件。我发现我总是在 t2.micro 实例上耗尽内存,所以要考虑需要多少内存。

接下来,单击 Review and Launch,让 AWS 向导为您设置默认配置。

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

我笔记本电脑的截图

接下来,检查您的实例,并根据需要修改安全组。点击启动!

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

我笔记本电脑的截图

您必须指定一个密钥对。如果您已经有了一个 AWS 密钥对,您可以选择使用那个密钥对。如果没有,您将选择创建新的密钥对。输入密钥对的任意名称。然后,单击下载密钥对。这将是您能够下载该密钥对的唯一时间。将它移动到某个安全的位置,或者某个你不会删除它的地方。您需要这个密钥对来允许您进入您的实例。就当是密码吧。现在,启动您的实例!

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

我笔记本电脑的截图

既然您的实例已经启动,接下来我们必须通过 SSH 连接到实例。在 EC2 实例仪表板上,单击实例名称旁边的按钮,然后单击 Actions。Actions 下应该会出现一个下拉菜单,然后单击 Connect。

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

我笔记本电脑的截图

您将看到此窗口,用于连接到您的实例。

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

我笔记本电脑的截图

打开“终端”并转到储存您的密钥对的文件夹。运行 chmod 命令来更改您的密钥对的权限。然后,运行 ssh 命令进入您的实例。每次重新启动计算机以进入实例时,都需要重新运行 chmod 命令来修改密钥对的权限。

2.软件安装

现在,简单的部分!接下来就是安装需要的软件和机器学习包,比如 Python3,Conda,Pytorch 等。从这里开始,我假设我们从基本的 Amazon Linux AMI 开始,因为深度学习 AMI 往往已经安装了这些包。

Yum 是 Amazon Linux AMI 上的默认安装程序。

$ sudo yum update 
$ sudo yum install emacs

要安装 pip,请使用:

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python3 get-pip.py

安装 Anaconda。

$ cd /tmpcurl -O [https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh](https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh) $ sha256sum Anaconda3-5.3.1-Linux-x86_64.sh $ d4c4256a8f46173b675dd6a62d12f566ed3487f932ba
b6bb7058f06c124bcc27 Anaconda3-5.3.1-Linux-x86_64.sh $ bash Anaconda3-5.3.1-Linux-x86_64.sh $ source ~/.bashrc (or open up a new terminal)

让我们得到 Numpy 和 Scipy。

conda update -n base -c defaults condaconda install numpy scipy

还有 Pytorch。

conda install pytorch torchvision -c pytorch

最后,Git!

sudo yum install git-all

现在,我们准备运行代码。

3.传输文件

要在本地目录和远程实例之间传输文件,可以运行

$ scp -i /path/my-key.pem /path/to/file [ec2-user@publicDNS.compute-1.amazonaws.com:~/path/to/location](mailto:ec2-user@publicDNS.compute-1.amazonaws.com:~/path/to/location)

然而,对于在特定的本地位置传输许多文件,我更喜欢使用 FileZilla。从 https://filezilla-project.org/下载 FileZilla。

在文件下,点击站点管理器。

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

我笔记本电脑的截图

在站点管理器窗口中,单击新建站点。将协议设置为 SFTP。将主机设置为您的公共 DNS。这个公共 DNS 可以通过进入 EC2 实例管理控制台,点击您的实例,并在描述框中复制公共 DNS (IPv4)下的条目。将端口设置为 22。用户将是 ec2 用户。最后,导航到本地计算机上保存的密钥对文件。单击连接。

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

我笔记本电脑的截图

现在,您可以将文件从本地文件拖到远程 EC2 实例。

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

我笔记本电脑的截图

输出文件同样可以通过 FileZilla 或 scp 传输回您的本地机器。

现在,您可以 SSH 到您的实例中,虚拟地运行您的所有代码!

资源:

[1]https://docs.aws.amazon.com/transfer/latest/userguide

使用 Plotly Express 的逐步条形图

原文:https://towardsdatascience.com/step-by-step-bar-charts-using-plotly-express-bb13a1264a8b?source=collection_archive---------25-----------------------

回答“我在看什么?”

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

布兰登·莫温克尔Unsplash 上拍摄的照片

作为一名有抱负的数据科学家,我喜欢摆弄数据集,解开隐藏在行和列背后的故事。我做的第一件事就是用条形图来显示数据。这让我熟悉了信息,并制定了未来分析的游戏计划。

如果您还不是会员,请在此获得您的中级会员资格!

数据集

我决定找一个简单的数据集,让我可以专注于绘图而不是清理。我发现“一见钟情结婚”数据集符合我的需求,因为它有一个健康的组合数字分类数据。这个电视节目已经成为一种隔离的罪恶快感。在这个系列中,两个人被随机配对,他们可以在一个梦想的地方度假三周后决定结婚与否。数据集可以在这里找到。

导入库

第一步是导入我将使用的所有库。是一个用于在 Python 中创建静态、动画和交互式可视化的库。 Plotly Express 是 Plotly v.4 的一个新的高级 Python 可视化库,允许使用简单的语法绘制复杂的图表。

一旦库被导入,我就使用 read_csv() 函数加载我的文件,并将其转换成熊猫数据帧。

import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplotsdf = pd.read_csv("Data/mafs.csv")

让我们来看看数据框

当我有了我的熊猫数据框架后,我会做两件事。首先,我查看标题名和存储在每一列中的变量类型。

print(df.info())

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

图由作者提供

这告诉我,在我的数据集中有 17 列,一些存储’ 对象 ‘类型,我喜欢把它们看作字符串,还有’ int64 '类型,它们是简单的 64 位整数存储。

其次,我查看数据帧的第一行。

print(df.iloc[0])

通过将 index [0]改为任意整数,我也可以找到任意行的信息。

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

图由作者提供

这告诉我,在这个电视节目中,参赛者杰米·奥蒂斯-赫纳在比赛时 27 岁,职业是护士。更重要的是,这位选手在电视节目中决定结婚,至今仍是已婚。幸运的女孩!

*“是对否”*简单条形图

我的第一反应是绘制出同意结婚的人和愿意保持单身的人的数量。该信息可在“决策”栏中找到,该栏中的值为“是”或“否”。

df1 = df.groupby(["Decision"]).count().reset_index()

fig = px.bar(df1**,** y=df.groupby(["Decision"]).size()**,** x="Decision"**,** color='Decision')
fig.show()

通过使用 groupby() 函数,我能够对数据集中的行进行洗牌,以便按照决策结果对它们进行组织。剩下要做的唯一一件事就是选择 x 轴和 y 轴来产生所需的信息。

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

图由作者提供

从图表中可以清楚地看到,70%的参赛者在三周后决定结婚,这是一个惊人的高成功率。也许这就是这部剧已经播了 10 季的原因吧!

“每个地点的婚姻”堆积条形图

我想做的第二件事是看看地理位置是否会影响成功夫妇的数量。为此,我在 x 轴上标出了位置,在 y 轴上标出了“是”和“否”的数量。

df2 = df.groupby(['Location'**,**'Decision']).size().reset_index(name='Decision_qt')
df2_yes = df2[df2['Decision']=='Yes']
df2_yes.set_index('Location'**,** inplace=True)

fig = px.bar(df2**,** x="Location"**,** y="Decision_qt"**,** color='Decision'**,** barmode='stack')
fig.show()

同样,使用 groupby() 函数,我首先根据位置对我的行进行分组,然后进行决策,本质上是在一个组内创建一个组。我还创建了一个名为 Decision_qt 的附加列,它保存每个位置的“是”和“否”答案的数量。

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

图由作者提供

除了芝加哥和达拉斯(所有参赛者都决定在那里结婚!)我们可以看到,地点对情侣的成功率影响不大。在这一点上,我要补充的是,我们只在每个地点调查大约 6 到 12 个人,更大的样本量会产生更可靠的信息…

已婚与离异比率条形图

现在,接下来我想调查的是在节目中结婚后离婚的人数。为了绘制这个比率,我需要遵循三个简单的步骤。

准备第一个数据集

我创建了一个 dataframe ’ df_married’ ,它根据位置和状态对行进行分组。我还创建了一个额外的列‘Maried _ Qt ’,每行包含已婚人口的总数。最后,我修改这个数据集,只保留已婚参与者的行。

df_married = df.groupby(['Location'**,**'Status']).size().reset_index(name='Married_qt')
df_married = df_married[df_married['Status']=='Married']

准备第二个数据集

现在我想统计每个地点的参与者总数。这也是通过使用 groupby() 函数并使用 size() 函数对每个组中的行求和来实现的。

df3 = df.groupby(['Location']).size().reset_index(name='Participants_qt')

执行除法和绘图

为了执行分割,我们首先必须将两个数据帧的索引设置为位置(比率是在同一城市结婚和离婚的夫妇之间取得的)。除法的结果保存在名为“ ratio_Married ”的列中

# Division
df_married.set_index('Location'**,** inplace=True)
df3.set_index('Location'**,** inplace=True)df3['ratio_Married'] = (df_married['Married_qt'] / df3['Participants_qt'])# Plotting
df_married.reset_index(inplace = True)
df3.reset_index(inplace = True)
fig = px.bar(df3**,** x='Location'**,** y='ratio_Married'**,** color='Location'**,** barmode='stack')
# fig.show()

绘图时,从数据帧 df3 中分别在 x 轴和 y 轴选择数据帧对应的位置和比率列。

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

这个剧情没有前两个乐观。超过 50%同意结婚的夫妇后来离婚了。在亚特兰大和南佛罗里达,没有一个参赛者仍然和他/她的对手结婚…

分步子情节特征

这花了我一点时间才弄明白,这就是为什么我超级兴奋地分享!当试图比较和对比图或条形图时,创建支线剧情会非常有用。当东西放在一起时,潜在的关系可以很容易地显现出来。

为了制作一个有多个支线剧情的图形,第一步是指定支线剧情的数量和它们的位置。在我的例子中,我选择让我的数据在同一行不同列(并排)。类型*“xy”*表示坐标系(例如也可以是极坐标)。

subfig = make_subplots(rows=**1,** cols=**2,** specs=[[{"type": "xy"}**,** {"type": "xy"}]])

现在我们创建两个子图,指定它们的轴和值。

第一个副情节

这和文章开头的是对否条形图一样。需要注意的是,plotly express 只支持 series。这意味着我需要使用 pd 将我想要绘制的信息从熊猫数据帧转换成一个系列。系列() 功能

df4 = df.groupby(["Decision"]).size().reset_index(name='Total_YesNo')
y1=pd.Series(df4['Total_YesNo'])

subfig.add_bar(row=**1,** col=**1,** y=y1**,** x=["Yes"**,** "No"])

第二副情节

在第二张图中,我绘制了每个位置的是对否的比率。x 轴和 y 轴值被转换成序列,并传递到子图上进行绘制。

df5 = df.groupby(['Location']).size().reset_index(name='Participants_qt')
x2=pd.Series(df5['Location'])
y2=pd.Series(df3['ratio_YesNo'])

subfig.add_bar( row=**1,** col=**2,** x=x2**,** y=y2)
subfig.show()

结果!

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

Github 知识库

所有代码都可以在 Github 上的 Married.py 文件中找到

非常感谢你的阅读!

如果你喜欢我的作品,如果你能在这里跟随我,我将不胜感激。

如果您对如何改进有任何问题、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。

一步一步:建立一个有气流的数据管道

原文:https://towardsdatascience.com/step-by-step-build-a-data-pipeline-with-airflow-4f96854f7466?source=collection_archive---------2-----------------------

构建气流数据管道,以监控错误并自动发送警报电子邮件。故事提供了详细的步骤,并配有截图。

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

构建气流数据管道

每次我们部署新软件时,我们会每天检查两次日志文件,看看在接下来的一两周内是否有问题或异常。一位同事问我,有没有办法监控错误,如果某个错误出现 3 次以上,就自动发送警报。我现在正在跟踪气流过程,这是一个用气流构建数据管道来监控异常的完美用例。

什么是气流?

Airflow 是一个开源的工作流管理平台,它于 2014 年 10 月在 Airbnb 开始,后来被开源,在 2016 年 3 月成为 Apache 孵化器项目。气流设计遵循“配置即代码”的原则。[1]

在 Airflow 中,DAG(或有向非循环图)是您想要运行的所有任务的集合,以反映它们的关系和依赖性的方式组织。[2]

Airflow 使用 Python 语言创建其工作流/DAG 文件,对于开发者来说非常方便和强大。

分析

我们的日志文件保存在服务器上,有几个日志文件。我们可以通过 sftp 命令获取它们。将所有日志文件下载到一个本地文件夹后,我们可以使用 grep 命令提取所有包含异常或错误的行。以下是错误日志的示例:

/usr/local/air flow/data/2020 07 23/log in app . log:140851:[[]]23 Jul 2020/13:23:19196 错误 session id:u 0 ukvlfdnmsmicbuozo 86 LQ 8 ocu =[log in app]Dao。AbstractSoapDao-getNotificationStatus-服务异常:Java . net . sockettimeoutexception:读取超时

接下来,我们需要逐行解析错误消息并提取字段。和上面的例子一样,我们想知道文件名、行号、日期、时间、会话 id、应用程序名、模块名和错误消息。我们将把所有这些信息提取到一个数据库表中,稍后,我们可以使用 SQL 查询来汇总这些信息。如果任何类型的错误发生超过 3 次,它将触发发送电子邮件到指定的邮箱。

整个过程非常简单,如下所示:

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

监控错误日志的工作流

气流操作员

气流提供了很多有用的运算符。操作符是一个单一的任务,它提供了一种实现特定功能的简单方法。例如, BashOperator 可以执行 Bash 脚本、命令或命令集。 SFTPOperator 可以通过 SSH 会话访问服务器。此外,气流允许任务之间的并行,因为一个操作符对应一个任务,这意味着所有操作符可以并行运行。Airflow 还提供了一种非常简单的方法来定义任务之间的依赖性和并发性,我们将在后面讨论它。

履行

通常,气流在 docker 容器中流动。阿帕奇在 Docker Hub 发布气流图像。一张更受欢迎的气流图由 Puckel 发布,配置良好,随时可用。我们可以从 Puckel 的 Github 库中检索 docker 文件和所有配置文件。

安装 Docker 客户端并提取 Puckel 的存储库后,运行以下命令行启动 Airflow 服务器:

docker-compose -f ./docker-compose-LocalExecutor.yml up -d

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

第一次运行气流

第一次运行脚本时,它会从 Docker Hub 下载 Puckel 的 Airflow 镜像和 Postgres 镜像,然后启动两个 Docker 容器。

气流有一个很好的 UI,可以从 http://localhost:8080 访问。

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

气流 UI 门户

从 Airflow UI 门户,它可以触发 DAG 并显示当前运行的任务的状态。

让我们开始创建 DAG 文件。创建新的 DAG 非常容易。首先,我们定义一些默认参数,然后用 DAG 名称 monitor_errors 实例化一个 DAG 类,DAG 名称将显示在 Airflow UI 中。

实例化新的 DAG

工作流的第一步是从服务器下载所有日志文件。Airflow 支持运行任务的并发性。我们为一个日志文件创建一个下载任务,所有的任务可以并行运行,我们将所有的任务添加到一个列表中。 SFTPOperator 需要一个 SSH 连接 id,我们将在运行工作流之前在 Airflow 门户中配置它。

创建下载任务

之后,我们可以刷新 Airflow UI 来加载我们的 DAG 文件。现在我们可以看到我们的新 DAG - monitor_errors -出现在列表中:

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

气流中显示的新 DAG

单击 DAG 名称,它将显示图形视图,我们可以在这里看到所有的下载任务:

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

图表视图中的所有下载任务

在我们触发 DAG 批处理之前,我们需要配置 SSH 连接,以便 SFTPOperator 可以使用这个连接。点击管理菜单,然后选择连接来创建一个新的 SSH 连接。

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

创建 SSH 连接

要在不输入密码的情况下访问 SSH 服务器,需要使用公钥登录。假设公钥已经放入服务器,私钥位于 /usr/local/airflow/。ssh/id_rsa 。将密码字段留空,并将以下 JSON 数据放入额外字段。

{
  "key_file": "/usr/local/airflow/.ssh/id_rsa",
  "timeout": "10",
  "compress": "false",
  "no_host_key_check": "false",
  "allow_host_key_change": "false"
}

好了,让我们启用 DAG 并触发它,一些任务变成绿色,这意味着它们处于运行状态,其他任务保持灰色,因为它们在队列中。

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

任务正在运行

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

所有任务完成

当所有任务完成后,它们以深绿色显示。让我们检查下载到 data/ 文件夹中的文件。它将创建带有当前日期的文件夹。

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

所有日志都下载到该文件夹中

看起来不错。

接下来,我们将提取日志文件中包含“异常的所有行,然后将这些行写入同一文件夹中的文件(errors.txt)中。 grep 命令可以在一个文件夹的所有文件中搜索某些文本,也可以在搜索结果中包含文件名和行号。

Airflow 检查 bash 命令返回值作为任务的运行结果。如果没有发现异常,grep 命令将返回 -1 。Airflow 将非零返回值视为失败任务,然而事实并非如此。没有错误意味着我们都很好。我们检查 grep 生成的 errors.txt 文件。如果文件存在,无论它是否为空,我们都将此任务视为成功。

创建 grep_exception 任务

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

grep 异常

刷新 DAG 并再次触发它,图形视图将如上所述进行更新。让我们检查文件夹中的输出文件 errors.txt。

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

在 errors.txt 中列出最后 5 个异常

接下来,我们将逐行解析日志,提取我们感兴趣的字段。我们使用一个 PythonOperator 通过一个正则表达式来完成这项工作。

使用正则表达式解析异常日志

提取的字段将保存到数据库中,供以后查询使用。Airflow 支持任何类型的数据库后端,它在数据库中存储元数据信息,在这个例子中,我们将使用 Postgres DB 作为后端。

我们定义了一个 PostgresOperator 来在数据库中创建一个新表,如果这个表已经存在,它将删除这个表。在真实的场景中,我们可能会将数据追加到数据库中,但是我们应该小心,如果由于某种原因需要重新运行某些任务,可能会将重复的数据添加到数据库中。

在 Postgres 数据库中创建一个表

要使用 Postgres 数据库,我们需要在 Airflow 门户中配置连接。我们可以修改现有的 postgres_default 连接,这样在使用 PostgresOperatorpostgreshawk时就不需要指定连接 id。

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

修改 postgres_default 连接

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

配置 postgres_default 连接

太好了,让我们再次触发 DAG。

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

解析错误日志

任务成功运行,所有日志数据都被解析并存储在数据库中。Airflow 提供了一种查询数据库的便捷方式。在“数据分析菜单下选择“临时查询,然后输入 SQL 查询语句。

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

即席查询

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

Postgres 数据库中的错误日志

接下来,我们可以查询表并统计每种类型的错误,我们使用另一个 PythonOperator 来查询数据库并生成两个报告文件。一个包含数据库中的所有错误记录,另一个是统计表,以降序显示所有类型的错误。

定义任务以生成报告

好的,再次触发 DAG。

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

生成报告

文件夹中会生成两个报告文件。

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

两份报告

在 error_logs.csv 中,它包含数据库中的所有异常记录。

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

报告所有例外情况

在 error_stats.csv 中,它列出了出现的不同类型的错误。

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

报告不同类型的异常

在最后一步,我们使用一个分支操作符来检查错误列表中的最高出现次数,如果它超过阈值,说 3 次,它将触发发送电子邮件,否则,静静地结束。我们可以在气流变量中定义阈值,然后从代码中读取该值。这样我们就可以在不修改代码的情况下更改阈值。

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

在气流中产生一个变量

定义任务以检查错误号

branch pythonooperator返回下一个任务的名称,要么发送电子邮件,要么什么都不做。我们使用 EmailOperator 发送电子邮件,它提供了一个方便的 API 来指定收件人、主题、正文字段,并且易于添加附件。我们用 DummyOperator 定义一个空任务。

电子邮件任务和虚拟任务

要使用电子邮件操作符,我们需要在 YAML 文件中添加一些配置参数。这里我们定义 Gmail 帐户的配置。您可以在这里输入您的密码,或者使用应用程序密码作为您的电子邮件客户端,这样可以提供更好的安全性。

- AIRFLOW__SMTP__SMTP_HOST=smtp.gmail.com
- AIRFLOW__SMTP__SMTP_PORT=587
- AIRFLOW__SMTP__SMTP_USER=<your-email-id>@gmail.com
- AIRFLOW__SMTP__SMTP_PASSWORD=<your-app-password>
- AIRFLOW__SMTP__SMTP_MAIL_FROM=<your-email-id>@gmail.com

到目前为止,我们创建了工作流中的所有任务,我们需要定义这些任务之间的依赖关系。气流提供了一种非常直观的方式来描述依赖性。

dl_tasks >> grep_exception >> create_table >> parse_log >> gen_reports >> check_threshold >> [send_email, dummy_op]

现在,我们完成了所有的编码部分,让我们再次触发工作流来看看整个过程。

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

当任何类型的错误数量超过阈值时发送电子邮件

在我们的例子中,有两种类型的错误,它们都超过了阈值,它将在最后触发发送电子邮件。邮件附有两份报告。

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

电子邮件提醒

我们将阈值变量更改为 60,并再次运行工作流。

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

将阈值更改为 60

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

工作流结束,不发送电子邮件

如您所见,它不会触发发送电子邮件,因为错误数小于 60。工作流无声地结束。

让我们回到 DAG 视图。

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

DAG 视图

它列出了所有活动或非活动 DAG 以及每个 DAG 的状态,在我们的示例中,您可以看到,我们的 monitor_errors DAG 成功运行了 4 次,在最后一次运行中,15 个任务成功,1 个任务被跳过,这是最后一个 dummy_op 任务,这是预期的结果。

现在,我们的 DAG 计划每天运行,我们可以根据需要更改计划时间,例如每 6 小时或每天的特定时间。

Airflow 是一个强大的 ETL 工具,它被广泛应用于许多一级公司,如 Airbnb,Google,Ubisoft,Walmart 等。它也受到主要云平台的支持,如 AWS、GCP 和 Azure。它在数据工程和数据处理中发挥着越来越重要的作用。

密码

https://github.com/kyokin78/airflow

参考

[1]https://en.wikipedia.org/wiki/Apache_Airflow

[2]https://airflow.apache.org/docs/stable/concepts.html

[3]https://github.com/puckel/docker-airflow

无需编码的逐步花卉分类

原文:https://towardsdatascience.com/step-by-step-flower-classification-without-coding-c652a7f73251?source=collection_archive---------57-----------------------

如何不用写一行代码就部署一个人工智能模型

弗朗切斯科·帕尔马和艾萨克·罗萨写的

今天,你可以在高速公路上开着自己的无人驾驶汽车看报纸,在没有收银员的情况下购买食品杂货。但是,如果你去看医生、律师或农民,还没有智能机器能显著地帮助他们的核心活动。在没有做出判断的情况下,这似乎有点怪异。

难以获得新技术和缺乏专家是远未解决的问题。然而,对于传统的专业类别、学术研究人员和主题专家来说,有大量的数据分析用例

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

照片由 Hitesh ChoudharyUnsplash 上拍摄

好消息是,今天用于开发人工智能应用的部分最先进技术已经公开。开源库和深度学习框架的兴起使这种技术的传播成为可能。通过迁移学习我们可以用比以往更少的图像或文本数据来训练执行深度学习模型。这意味着医生可以在他们的 X 射线图像上使用自动驾驶汽车中使用的相同模型。如果你有兴趣,你可以看看 Fast.ai抱脸是如何工作的。

然而,对这些框架的访问仍然局限于具有编码技能的人。因此,技术的成熟度和潜在用户的可访问性之间的不平衡产生了对无代码人工智能越来越大的影响。

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

当然,根据定义,无代码使它不那么复杂。由于它没有编写人工智能应用程序复杂,所以它没有同样的影响力和能力。

无论是现在还是将来,无代码平台都不可能完美地取代一个组织良好的数据专家团队。

无代码 AI 的主要限制是它的严格性。无代码程序不是根据客户需求定制的,可能不支持特定问题所需的工作量。另一个限制是难以运用商业知识来提高绩效或施加约束。

除了它的局限性之外,在过去的几年中,对无代码解决方案的关注无疑一直在上升。您可以在此处找到对现有供应商的详细回顾。

在本文中,我们将在一个花卉分类项目中试用乔托Giotto 是一个基于云的无代码平台,允许用户非常容易地开发、部署和共享基于他们自己的数据问题构建的人工智能应用。它分为五个步骤(从数据选择到部署),用户可以选择一些参数或自动完成整个过程。到目前为止,它支持图像分类问题,但是其他数据类型和任务据说很快就会出现。

数据和问题

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

正确标记文件夹对使用 Giotto 很重要

无代码人工智能并不意味着神奇的人工智能:提供良好的数据仍然是一个优先事项,否则模型性能很容易下降。

在这个例子中,我们使用花的图像对 102 种植物进行了分类。分类的目标是能够通过在程序中上传植物的花的图片来正确地评估植物的种类。

数据集由 5400 幅花的图像组成,每类大约 50 幅图像,总共 102 个类。给定一幅图像,问题是正确分类它的类别,即花的种类。数据组织在子文件夹中,每个子文件夹包含单独/不同类别的图像。为了能够使用 Giotto,尊重这样的文件夹结构是至关重要的*(上图)*。数据可在这里获得。

数据选择

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

第一步:数据选择,导入数据。(视频:1:40)

登录并创建项目后,系统会提示我们选择数据类型和任务。对于我们的应用程序,我们选择了图像和图像分类。

导入数据后,我们可以在可视化步骤中快速浏览一下。

预处理

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

第二步:预处理。所有数据扩充方法的可视化。(视频:2 分 25 秒)

深度学习模型工作得很好,但众所周知它们是数据饥渴的。即使我们在解决迁移学习的问题上迈出了一大步,一个模型通常会在有大量特定任务图像的情况下表现得更好。数据科学中使用的一个技巧是对原始图像进行修改,以人为增加数据集的大小。使用 Giotto,可用的修改包括裁剪、缩放、亮度、旋转等。

没有试图成为一个明显的队长,一个更光明的雏菊仍然是雏菊。只要我们试图区分雏菊和其他花,用原始雏菊和更亮的雏菊喂养模型应该会增加模型可以学习的雏菊样本的数量。因此,在大多数情况下,这也会提高其性能。

此外,在某些情况下,通过从数据中去除系统噪声,数据扩充也可能有益于模型。想象一下,如果你用一个数据集训练机器,其中所有的雏菊面朝右,所有的向日葵面朝左。一旦机器学会了,如果你给它一个面朝右的向日葵的图像,它可能会告诉你这是一朵雏菊。旋转(翻转)工具避免了这种情况,使机器的花面向两侧。

即使为您的数据选择所有的转换非常诱人,但这并不总是最好的主意。例如,如果你正在对颜色很重要的东西进行分类,处理亮度可能会导致性能下降。

在我们的案例中,我们选择了所有可用的数据扩充,因为它们都不会对模型的执行产生不利影响。

在下一个可视化步骤中,你可以看看修改后的图像样本*(上图)*。如果一个转换看起来不好,你可以随时回来删除它。

型号选择

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

第四步:型号选择。选择正确的设置对我们的模型正常运行至关重要(视频:2:50)

在模型选择中,主要有两个选择:**模型类型和超参数。**目前,Giotto 分别支持不同的 resNet 大小和一个历元数范围。

**resNet 的大小基本上就是网络的层数。**例如,resNet 34 将代表 34 层神经元。一般来说,“越深越好”适用于模型选择,前提是您为模型提供足够的数据。然而,较大的网络也可能导致较大的运行时间和成本。

历元数是整个数据集通过神经网络的次数。或者换句话说,网络“看到”数据的次数。乔托有一个很酷的提前停止规则:如果从一个时期到下一个时期,表现没有改善,训练就停止了。

最后,您可以选择最适合您的问题需求的度量标准。在可能的选择中,我们有准确性、AUC、F1 分数等等。

至于所有的步骤,如果你不知道选择什么参数,你可以直接自动选择并得到结果。

在我们的例子中,我们选择了具有 10 个时期的 resNet34。

结果

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

第四步:结果。通过检查性能报告,我们评估设置的充分性。(视频:3:02)

一旦模型完成运行,您就可以可视化它的性能。花些时间仔细检查这里的所有细节是很重要的。

首先是对任务的总结,主要描述了所使用的数据。然后是模型总结,它概括了之前选择的模型参数。最后,我们得到了训练的实际性能,如准确性、最难分类的图像和混淆矩阵。也可以下载 PDF 格式的摘要。

在我们的例子中,机器用我们的设置训练只花了 7 分钟。结果是令人满意的,在 1180 幅图像的验证集上测量的准确率为 95%。

部署

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

第五步:部署。在我们的例子中,我们选择运行一个 web 应用程序,而不是 docker。(视频:4:13)

现在模型已经训练好了,您有两个选择。您可以将它作为 Docker 映像下载并离线使用,也可以将其部署在一个用户友好的 web 应用程序中,以便与其他用户轻松共享。一旦部署(web 应用程序或 Docker),该模型可用于对看不见的图像进行分类。

在我们的案例中,我们将模型部署在一个 web 应用程序上,您可以在这里访问(密码:Loveflowers8)。

结论

我们已经证明,在几分钟内完成令人满意的图像分类任务,而无需编写一行代码是可能的。结果是一个可以在新图片上使用并与其他用户分享的网络应用程序。

无代码 AI 很可能永远不会取代数据科学家。然而,对于缺乏人工智能最新技术的人来说,它仍然是一个可靠和用户友好的替代选择。

参考文献:

** [## 当今使用的人工智能的 10 个有力例子

机器还没有接管。至少现在还没有。然而,它们正在渗入我们的生活,影响着我们如何…

www.forbes.com](https://www.forbes.com/sites/robertadams/2017/01/10/10-powerful-examples-of-artificial-intelligence-in-use-today/#19b198fb420d) [## 无代码/低代码人工智能:新的商业模式和数据科学家的未来

无代码 AI 和低代码平台:正在使用什么商业模式,数据科学家的未来是什么?

towardsdatascience.com](/no-code-low-code-ai-new-business-models-and-future-of-data-scientists-a536beb8d9e3) [## 乔托

停止编码。启动人工智能

giotto.ai](https://giotto.ai/)**

规划 A/B 测试的逐步过程

原文:https://towardsdatascience.com/step-by-step-for-planning-an-a-b-test-ef3c93143c0b?source=collection_archive---------28-----------------------

起草 A/B 测试的初学者终极指南

介绍

继我之前的 帖子 关于通过实验发展科学文化的重要性之后,我将解释如何恰当地计划一个实验。我希望这篇博文可以作为那些不确定该做什么的人的起点。

为了避免这篇文章太长,我将只涉及计划过程,我将在以后的博客文章中涉及实验的其他方面。规划过程包括:

  1. 设定假设
  2. 获取度量的基线数字
  3. 最小可检测效应
  4. 功效分析(确定完成实验所需的样本量)
  5. 估计实验的持续时间
  6. 与利益相关者讨论

我将只讨论使用频率主义方法的最简单和最常见的实验形式(即 A/B 测试,也称为双变量测试),这对大多数人或组织来说已经足够了。

第一步:从假设开始

就像我们在学校被认为的那样,一个实验从一个假设开始。你可能有多个假设想要测试,但总是有一个主要的。这里我举两个例子:

  1. 你在一家电子商务公司工作,你认为在结账时显示折扣金额可以提高结账率。
  2. 您不再需要提供电话号码和地址来注册会员。你认为这会提高转化率。

我个人认为将这些陈述转换成更多的统计形式是很有用的,因为这些陈述更清晰,并且减少了在衡量具体指标时出错的机会。例如,在第一种情况下,我会写:

【检出率(单尾)
【h₀:】对照组和治疗组的检出率没有差异。 治疗组的 H₁:检出率比对照组的检出率高**。**

我们希望拒绝零假设,并得出结论:治疗组的检出率在统计学上显著高于对照组。(斜体格式)

在大多数情况下,会有一些您想要测量的次要指标,您也可以用相同的格式来写它们。虽然总是想要衡量改善是很常见的,但是你也应该总是考虑你的治疗可能带来的不利影响**。例如,在第二种情况下,我还会考虑将付费会员转化为次要指标,我可能会假设新的注册过程对一些人来说可能显得不安全,并阻止他们成为付费会员。然后,我会将我的二级指标写成:**

【付费会员转化率(双尾)
【h₀:】对照组和治疗组的付费会员转化率没有差异。 H₁:对照组和治疗组的付费会员转换率存在差异。

我们希望不会拒绝零假设,并得出治疗组和对照组的付费会员转换率之间不存在统计学显著差异的结论。**

因此,实验不应该被认为是一种测量治疗是否带来改善的方法,它也可以用来测量治疗是否造成伤害。

步骤 2:获得当前度量的基线

这是很重要的,因为它将是我们所需样本量计算的一部分。其次,它帮助我们了解当前的数字。

第三步:对你来说什么是有意义的效果尺寸?

给定足够的样本量,我们通常能够找到两组之间有统计学意义的差异,即使只有非常微小的差异。这是因为我们估计的置信区间随着样本量的增加而减小。下图显示了在不同样本量下,一个均值为 0.1 的分布和另一个均值为 0.15 的分布。这很直观,因为随着样本量的增加,我们对均值的估计更有信心,这也是分布变窄的原因。这也意味着,如果您想要有把握地检测两个群体之间的微小差异,对样本量的要求会增加。

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

说明分布如何随着样本量的增加而变窄。

因此,决定什么样的改变被认为是有意义的,足以让你采取行动,这是非常重要的。例如,如果您发现通过在结账页面显示折扣金额,结账率在统计上显著提高了 0.05%(从 15.3%到 15.35%)。你真的应该实施改变吗?这也就是通常所说的最小可检测效应(MDE ),我将在以后的文章中详细介绍。

决定一个有意义的效果大小并致力于此,可以防止你在实验后偏离最初的计划。如果 1%的变化是一个足够好的信号,可以向所有人推广这种疗法,那么要确保只有当效果超过 1%时你才会这么做。

尽管理论上人们不应该这样做,但是由于样本大小的要求会随着 MDE 的变化而变化,我发现在考虑 MDE 时,考虑我的实验中可以得到的估计样本大小是很有用的。如果我不希望在我的实验中有太多的样本,我就不能把我的 MDE 设置得太小。

步骤 4:执行功率分析

这可能是其他文章中讨论最少的部分。设置目标显著性值、目标统计功效和分配比率(通常为 1),并计算在特定分配比率下,在目标显著性值和统计功效下检测所需 MDE 所需的样本量。

***目标显著性值,𝛂:当零假设正确时,我们拒绝零假设的概率为𝛂 %,常见值为 0.01、0.05 和 0.1,取决于犯此类错误的成本,成本越高,您的𝛂应该越低。

目标统计功效,1-𝜷:当 MDE 有实际的显著变化时,我们有%的 1-𝜷机会未能剔除空值,常见值为 0.8,0.85,0.9 和 0.95,0.99。这取决于当有实际变化时错过这种变化的代价有多大,代价越高,你的𝜷应该越低,因此目标统计功效越高。***

分配比率:治疗组与对照组的比率,在给定固定样本量的情况下,通常设定为 1 表示最高统计功效。

设置好这些实验参数后,我会拿出这个表,里面包含了一个实验计划的精华。

+----------------------------+---------------+
| Metric                     | Checkout Rate |
| Estimated Baseline Value   | 0.15          |
| Target Value (Effect Size) | 0.18 (0.081)  |
| Target Significance Value  | 0.05          |
| Target Statistical Power   | 0.95          |
| Allocation Ratio (N2 / N1) | 1             |
| Number of groups           | 2             |
| Total Sample Size Required | 6618          |
+----------------------------+---------------+

以下是计算所需样本量的 3 种方法:

  • Python
import math
from statsmodels.stats.power import TTestIndPoweralpha = 0.05
p = 0.15
p2 = 0.18
var_base = p * (1 - p)
var_target = p2 * (1 - p2)
cohen_d = (abs(p2 - p) / math.sqrt((var_base + var_target) / 2))analysis = TTestIndPower()
analysis.solve_power(effect_size=cohen_d, power=0.95, nobs1=None, ratio=1.0, alpha=alpha, alternative='larger')# Output 3308.6546478905598
  • R
library(pwr)alpha = 0.05
p = 0.15
p2 = 0.18
var_base = p * (1 - p)
var_target = p2 * (1 - p2)
cohen_d = (abs(p2 - p) / sqrt((var_base + var_target) / 2))
pwr.t.test(d = cohen_d, sig.level = alpha, power = 0.95, type = "two.sample", alternative = 'greater')# Output
Two-sample t test power calculation 

              n = 3308.654
              d = 0.08088928
      sig.level = 0.05
          power = 0.95
    alternative = greater

NOTE: n is number in *each* group

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

G*Power 软件截图

在决定所需的样本量时,我经常给误差留有余地,因为在实验过程中有很多事情可能出错。当这些错误发生时,您可能需要移除一些实验样品,以防止它们影响您的结果。例如,可能有另一个营销活动引入了有利于对照组的偏见。

如果您在实验过程中意识到这些事件,这是很好的,然后您可以从您的实验样本中排除这些事件,这样您的实验仍然会运行,直到它达到目标样本大小。但我经常发现,直到实验结束后,才意识到所有这些运动的部分是不可能的。然后你会意识到,在排除这些无用的样本后,你没有足够的样本量来结束这个实验。多给多少空间将取决于你对正确执行实验的信心。

步骤 5:估计实验的持续时间

给定所需的样本量,估计在给定流量或容量的情况下,需要多长时间才能达到目标样本量。根据经验,通常会有一些季节性影响,如一周中的某一天或一天中的某个小时。例如,根据这些季节性因素,你的实验对象对治疗的反应可能不同。因此,如果你认为你可以在几天内达到你的样本量,我会建议在大多数情况下扩展到一周甚至两周,以获得更稳健的结果。

如果需要几个月才能达到目标样本量,那么您可能需要增加 MDE 来减少所需的样本量。这样做的好处是你可以节省时间,但坏处是你的治疗必须有足够大的影响,让你自信地拒绝你的无效假设。

第六步:与利益相关者讨论

与你的工程师讨论如何进行实验。常见问题包括:

  1. 要记录哪些额外事件?
  2. 如何给用户分配治疗?
  3. 如何将这些事件传输到您的数据仓库中进行实验监控?
  4. 实验过程中会出现什么问题,你有什么后备计划?

结论

在这篇博文中,我描述了如何设计一个简单的双变量实验的一步一步的过程。我希望这篇博文能帮助你开始在你的团队中计划一些实验。但是,我没有涉及更多的方面,我希望将来能涉及这些方面,例如:

  1. 实验过程中需要监控的常见事项
  2. 实验中常见的陷阱
  3. 超过 2 个实验变量
  4. 全因子实验设计
  5. 实验的常用统计检验

最后但同样重要的是,适当地计划你的实验以减少在实验过程中出错的机会,或者更糟的是,以错误的结果结束实验,这是极其重要的。开始时计划好这些可能很费时间,但是你练习得越多,最终会越快。

如何挽救亏损的交易策略?(第一部分)

原文:https://towardsdatascience.com/step-by-step-forex-trading-strategy-optimisation-part-1-b1516753b42e?source=collection_archive---------22-----------------------

一步一步的教程来拯救一个看似有希望的交易策略

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

戴维·冯迪马尔在 Unsplash 上拍摄的照片

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

这些天网上外汇交易大师的数量之多,让我无法在 YouTube 上推荐。获得兰博基尼金像奖有那么容易吗?在这篇博客中,我将讲述我是如何优化一个很好的老式均线交叉策略的,这个策略在我的案例中肯定是行不通的,并试图使它成为一个有利可图的策略。在开始优化我们的策略之前,我们将从创建我们的交易系统开始,获取我们需要的数据,定义我们的进场逻辑,评估表现。事不宜迟,让我们一头扎进去;当然,在我注意到之前,我的蓝宝已经在去我车库的路上了(除了我甚至没有车库)

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

来源: 9GAG

免责声明:我目前没有用这个策略交易,这个博客也不是一个财务建议。请自担风险使用。

系统交易

交易系统,一个听起来非常花哨和复杂的词,实际上只不过是一套精确的规则,可以自动定义进场和出场逻辑,所有这些都不需要任何人为的努力。由于规则集的精确本质,系统测试可以用历史数据集进行可靠的测试,也称为回溯测试。通过观察统计上有代表性的和重复的过去的行为,我们就能够估计系统交易策略盈利的信心水平。

交易系统通常由几个部分组成:

  1. **数据连接:**数据为王。没有数据,我们就无法制定和评估战略。我们最多只能猜测。根据你的交易策略,你也许可以使用每日数据,这些数据可以从 https://www.investing.com/的网站免费获得。如果你正在做日内交易,就像我打算在这个系列的博客中做的那样,你肯定需要更精细的数据。为此,您需要从 OANDA、Interactive Brokers 等经纪人那里获取数据。
  2. **特征工程:**众所周知,金融时间序列是异方差的(基础数据方差变化的统计说法)。因此,价格时间序列本身无法提供稳健的进入和退出逻辑。特征工程是为以后定义进入和退出逻辑而生成附加特征的过程。这些特征的例子可以是移动平均线、指数移动平均线等。
  3. **进入信号&条件:**信号和条件非常相似,但概念不同。以 MACD 交叉为例,每当线交叉,这将是一个进入信号。然而,只有在所有条件都满足的情况下才会开仓,也就是说,价格需要高于 200 周期移动平均线才能确认趋势。
  4. **出舱信号&条件:**如果出舱为我们登陆月球创造了机会,出舱则确保我们的飞船足够稳定,能够持续整个旅程。好吧,也许这不是一个好的比喻,但好的退出逻辑可以救我们的小命。当趋势失去动力时,它锁定利润;在任何亏损的交易让我们损失惨重之前,它减少了我们的损失。说到退出逻辑,一般有四个不同的概念:(1)止损,(2)跟踪止损,(3)止盈,(4)进场时间。

数据采集

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

理论上,交易系统可以在任何市场或具有内在货币价值的流动商品上发展。在这篇博文中,我们将使用 GBP。美元作为我们的基础资产。我们从 OANDA v20 API 获取了从 2014 年 1 月到 2020 年 9 月大约 6 年的 30 分钟分笔成交点数据。这个过程实际上很简单:(1)在 OANDA 创建一个练习帐户,(2)在这里生成一个访问令牌(当然要安全地存储它),以及(3)按照 Vladimir 这里的指示操作。或者,您也可以从 backtrader 获取数据,我将在另一篇博客文章中介绍这一点。

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

我们从 OANDA 下载的数据集的收盘价

初始交易策略

既然我们已经对数据进行了分类,是时候制定我们的策略了。这次我们要用均线交叉。但是为了增加趣味,我们将使用三角移动平均线(TMA ),而不是简单的移动平均线(SMA)。众所周知,SMA 非常容易受到异常值的影响。另一方面,TMA 是更平滑的趋势线。虽然平滑的移动平均线会增加价格运动和信号之间的滞后,但它也最小化了假突破的风险,因为趋势会在进场信号到来之前得到更好的确认。那么,我们如何计算这个 TMA 呢?一个 n 周期 TMA 其实只是过去 n 个 n 周期 SMA 的平均值。听起来像是绕口令,但让我加入一些数学公式来描绘这幅图:

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

n 周期简单移动平均线

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

n 周期三角形移动平均线

换句话说,TMA 和 SMA 之间有几个关键区别:

  1. TMA 是平均值的平均值;而 SMA 是平均值;
  2. TMA 对价格变化的反应比 SMA 慢;
  3. TMA 有时可以让你在一个趋势中停留更长时间,产生更大的利润;另一方面也是如此。

让我们为我们的 30 分钟数据集创建两个 TMA 序列,周期分别为 3 和 30。现在,我们可以随机选择周期,并逐步优化它们,直到我们达到最优。

df['fast_tma'] = df['Close'].rolling(3).mean().rolling(3).mean()
df['slow_tma'] = df['Close'].rolling(30).mean().rolling(30).mean()

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

英镑的收盘价。2014 年 1 月 5 日至 2014 年 1 月 10 日的美元,含 3 期 TMA 和 30 期 TMA

我们从简单的交易逻辑开始,慢慢增加复杂性,这通常是个好主意。通过这种方式,我们可以在调整交易策略之前更好地理解交易策略的行为和潜力。首先,让我们只定义进场信号,并在相反的信号产生时退出:

  • 多头进场:当(1)快速 TMA 已经穿过慢速 TMA 上方,并且(2)当前价格位于交叉杆的高点时,1 手的未平仓头寸
  • 短线进场:当(1)快速 TMA 已经穿过慢速 TMA 下方,并且(2)当前价格处于交叉杆的低点时,开仓 1 手

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

第一个信号的假突破;价格跌破交叉杆低点后的短线进场

不在交叉点处进场的直觉是测试趋势,让回撤更接近较慢的 TMA 系列,潜在地筛选假突破,只和长期趋势交易。如上图所示,2014 年 1 月 3 日上午有一个多头设置,但由于达到了多头进场价格,该设置从未被触发。假突破后很快出现下跌趋势,当价格跌破交叉杆的低价时,就会触发空头设置。

评估和滑动

有了初步的策略,让我们来看看性能。我们将使用 2014 年 1 月 1 日至 2019 年 12 月 31 日的数据进行评估(即样本内数据),并在我们完成战略优化后,将 2020 年的精彩数据用于未来分析(样本外数据)。重要的是,我们从我们的回溯测试中保留一个前进集,以避免过度拟合,并增强我们最终策略的健壮性。相反,如果我们拥有样本数据集中的所有数据,我们就可以针对整个数据集中的每个趋势变化优化我们的时间策略。虽然这可以提供惊人的评估结果,但这绝不是现实的,因为精确的模式不会重复。这种在未来未知数据中策略表现的显著恶化被称为过度拟合。

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

我们对样本内和样本外数据集的划分

如果我们将初始交易策略应用于样本内数据集,假设我们交易 1 手英镑。每输入一个美元(即 100,000 单位的货币),我们将得到以下数字:

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

6 年内利润超过 17,000 美元。我们已经在去月球的路上了吗?

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

振作起来,我们要在水下潜水 900 天。我们能屏住呼吸那么久吗?

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

甜蜜黑暗主题中我们战略的关键人物

乍一看,这种交易策略似乎已经相当可行了。然而,如果我们更多地关注水下图表,它显示了我们距离峰值股本的百分比有多低,我们可以注意到该策略有一个相对较长的复苏周期,最长的一个周期跨越 2.5 年。想象一下,处于负面情绪中,两年多都没有恢复,这听起来肯定不像是最有趣的过山车。如果我们接着研究表格中的一些交易数据,似乎会对我们的诊断有更多的见解:

  1. 利润百分比&平均值。成功交易中的棒线:盈利百分比计算为所有盈利交易的百分比,而平均值。成功交易中的棒线是根据我们的成功头寸在市场中的 30 分钟棒线的平均数计算的。由于平均获利棒线几乎是相反棒线的 4 倍,我们可以说这个策略在长期趋势中运作良好。这也解释了为什么长期趋势之间的周期波动更大,因此对于我们的趋势跟踪策略来说,这也解释了为什么成功率相对较低。话虽如此,如果我们的风险管理做得好,低胜率仍然是合理的。
  2. 利润系数:计算为毛利润对毛亏损的绝对值。所以,越高越好;与此同时,利润系数低于 1 是一个大禁忌。正如我们在表中看到的,当进入多头头寸时,我们的策略相当糟糕。公平地说,可怜的英镑正在贬值,所以趋势对我们不利。但是,这仍然暗示了我们可以将外部进入信号收紧一点,以避免误报。
  3. 比率平均值。赢:平均。损耗:以 Avg 的绝对值计算。在平均值上赢得交易。成功交易,可以作为我们回报风险比的代表。能够以超过 2 的比率盈利并不太坏,因为这意味着我们可以承受每赢一笔交易就输两笔交易。鉴于我们甚至没有优化任何止损或获利策略,这个数字预计会增加。

现在我们有了初步的诊断,是时候加入一些现实的东西了,也就是佣金和滑点。这些基本上分别是,经纪的零花钱和网络延迟的补偿。如果我们总共支付 3 点的费用(0.5 的佣金和 2.5 的滑点),那么之前 50 美元的利润交易将变成仅仅 20 美元的利润,但是,嘿,20 美元就是 20 美元!玩笑归玩笑,让我们来看看我们更真实的权益曲线、水下图表和其他汇总统计数据。

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

残酷的现实打在我们的脸上。

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

哎唷…用这种策略,我们永远不会在真正的市场中获利…

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

老实说,这些数字看起来很可怕。但是,不要对自己(自己)太苛刻,如果市场这么好打,巴菲特就不会是这样的传奇。另外,我们只选择了两个任意的输入参数,没有止损,也没有获利。

步骤 1:优化输入参数

为了挽救我们糟糕的策略,我们必须首先为 TMAs 找到一组更可行的参数。在下图中,我们使用快速 TMA 周期和慢速 TMA 周期的不同组合重新运行了回溯测试。如果我们的快速 TMA 周期为 1,慢速 TMA 周期超过 50,看起来这个策略实际上是有利可图的。

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

不同 TMA 参数组合的性能

确定了最佳参数的大致区域后,让我们进行更精细的网格搜索。从下图可以看出,当快速 TMA 的周期为 1,慢速 TMA 的周期为 62 时,该策略表现最佳。但是请注意,样本内数据的最佳性能并不意味着样本外数据的最佳性能。当谈到优化策略时,最好有一个更稳定的策略,而不是一个对样本数据来说可能过拟合的策略。经验丰富交易系统开发人员默里·鲁杰罗曾经说过:

如果你不喜欢相邻的数字,你就有问题了,因为很可能你会得到相邻的一组参数的结果。

因此,我们不选择慢 TMA 周期为 62,而是选择 65,其中相邻参数具有相似的利润。

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

跳过高峰,走向稳定的高原

参数排序后,即使考虑了 3 个点的滑点和费用,我们的策略仍然盈利,如下图所示:

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

现在,我们又在谈论绿色了

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

哦,不太好,超过 3 年的下降

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

从红色到绿色,这是一个非常大的进步。看看这些数字,我们可以看到,通过增加慢速 TMA 的周期数,赢仓的平均棒线数增加了 50%以上,这与拥有更慢的慢速 TMA 来捕捉更长趋势的直觉相符。我们还可以看到,我们的风险回报比从 2.11 增加到了 3.88。另一个亮点是我们的最大提取比例将从 40%降至约 14%。然而,我们的策略仍远未达到可交易的水平,其最长提款期为 1167 天。

第二步:优化进入时间

由于外汇市场昼夜不停地运转,在一天的不同时间有不同的参与者,从 APAC 到欧洲,然后到美洲,再回到 APAC。这就带来了一个问题,什么时候进入英镑是最好的?美元市场。众所周知,这一对的大部分货量来自欧洲和美洲。如果我们能为进场信号找到一个最佳的时间滤波器,我们也许能驾驭这些大交易量驱动的趋势。让我们看看,如果我们对进场信号应用 4 小时窗口滤波器,我们的策略表现如何。(例如,09:30 意味着仅允许从 09:30 到 13:30 的进入信号)

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

再说一遍,让我们跳过高峰,走向稳定的高原

同样,尽管从 05:00 GMT 到 09:00 GMT 的进入信号为我们提供了样本内数据的最佳性能,但我们宁愿选择更稳定的选择。在这种情况下,我们的选择将是 13:00–17:00,相邻参数显示类似的利润。

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

PNL 变得更加稳定

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

我们仍然需要在超过 2.5 年的时间里削减开支

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

通过将条目限制在 13:00 GMT 到 17:00 GMT,我们已经将最大提款百分比降低到大约 10%,提款期减少到大约 980 天。仔细观察这些数字,我们可以看到进场限制正在帮助我们做多,平均净利润从每手-8 美元增加到每手+22 美元,同时损害了短期表现。这可能意味着我们需要开发另一种策略来优化短期性能。

结论(迄今为止)

在这篇博客中,我们已经讲述了如何开发一个简单的 TMA 交叉交易策略,这个策略在理论上看起来是有利可图的,直到我们把 3 点的佣金和滑点计算在内。通过优化 TMA 参数和进场时间窗口,我们挽救了这个看起来很糟糕的策略,并使其再次盈利。以下是一些高水平的结果:

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

通过优化我们看似无望的战略,我们成功做到了:

  1. 提高我们战略的利润系数,
  2. 提高我们的回报风险比,
  3. 提高策略进入长期趋势的能力
  4. 降低最大提取百分比,以及
  5. 缩短最大提款期

也就是说,这一战略还远未准备好部署。我们仍有超过 2.5 年的缩减期,6 年的总利润为 18.57%,因此我们仍有很大的改进空间。在本系列的后续部分中,我们将继续在以下几个方面改进这一策略:

  1. 带止损和跟踪止损逻辑的风险管理
  2. 基于获利逻辑的风险管理
  3. 蒙特卡罗法分析
  4. 向前分析
  5. 更多

[## 如何挽救亏损的交易策略(第二部分)

通过风险管理改进交易策略的逐步指南

medium.com](https://medium.com/datadriveninvestor/how-to-save-a-losing-trading-strategy-part-2-8d4f713068eb)

放弃

本报告中表达的想法和观点仅代表我个人,不一定代表我公司的观点。本报告旨在提供教育,不应被理解为个人投资建议,也不应被理解为购买、出售或持有任何证券或采取任何投资策略的建议。

参考文献

柯林斯(2004 年)。。瓦森多夫联合公司。

Tomasini,e .,& Jaekle,U. (2019 年)。交易系统第二版:系统开发和投资组合优化的新方法。)。哈里曼之家。

在你走之前…

感谢你加入我的第一个媒体博客。让我知道你在评论中的想法,以及这篇文章如何改进。如果你能通过 embed affiliate 链接获得书籍以支持该系列,我们将非常感激。暂时,保持坚强,继续相信我们的蓝宝就在眼前;我们将在博客的下一部分继续这个旅程。

再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值