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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

产品经理机器学习指南:平衡计分卡

原文:https://towardsdatascience.com/a-product-managers-guide-to-machine-learning-balanced-scorecard-344cd37ab4a7?source=collection_archive---------28-----------------------

研究表明,只有一小部分机器学习(“ML”)项目会产生商业影响。在这篇文章中,我将探索和分享我自己的经验建立记分卡,以最大限度地提高 ML 项目的成功。

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

安德烈斯·达利蒙提Unsplash 上拍摄的照片

在亚马逊从事顶线/底线战略时,我的一个重点是获得设计和构建 ML 模型的工作知识。例如,我学会了使用神经网络来建立图像分类。构建 ML 模型并观察其结果对我来说绝对是一件令人着迷的事情。不管 ML 有多吸引人,或者将会变得多么吸引人,我目前还没有转变成数据科学家或应用科学家的计划。产品管理是我的热情所在,但我总是发现自己被数学和 ML 的应用所吸引!当我在亚马逊找到一个具有领先 ML 特性的角色时,我欣喜若狂。我喜欢产品管理和 ML 之间的最佳平衡点。

“我们 ML 这个东西吧!”

分享我在亚马逊担任 ML 产品经理期间学到的五条经验:

1.角色 —第一个也是最明显的教训是,知道如何建立一个 ML 模型与领导一个 ML 产品是不同的。

  1. ML 项目与软件相关项目 —领导一个传统的软件相关项目与领导 ML 项目是不同的。科学方法(即观察、假设、测试、学习等。)仍然适用于传统软件和 ML 项目。然而,与传统的软件模型相反,ML 完全依赖于与业务问题相关的数据的质量和数量。一旦克服了数据的局限性,就有了损失、优化和评估的复杂性。我提到评估业务价值来源和客户价值主张的模糊性了吗?

3.复杂程度——“你只需要在这个产品中启动 ML 特性”并不像听起来那么简单。理解并尊重这些年来因为 ML 而需要重新调整的技术架构。你挖得越多,发现的骨骼就越多。

4.业务影响——计算一个 ML 模型的业务影响是极其模糊的。企业需要“展示资金”作为产品经理,你要拿出量化的价值。识别、理解和评估正确的假设起着关键作用。当然,这需要与更广泛的组织保持一致。

5.客户影响 —使用 ML 验证客户影响可以在没有 ML 的情况下完成。我了解到,我们可以验证一个 ML 模型的有效性和影响,而无需构建一个 ML 模型。向后工作!构建模拟(各种格式)来测试这些假设。拥有一些验证数据可以增强组织的信心,并帮助其他人团结在事业周围。

冰山一角

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

亚历山大·哈弗曼Unsplash 上拍摄

总结一下我学到的经验:ML 给商业利益相关者增加了大量的不确定性。推出 ML 产品时出现的问题是:它能给企业带来好处吗?存在什么证据?假设是什么?有哪些财务风险?谁受它的影响最大?实现有多复杂?用于训练 ML 模型的数据是否真正代表生产?我们有足够的标签吗?这些只是冰山一角。在推出 ML 产品的整个过程中,还会出现更多类似的问题。

构建记分卡

如你所见,在领导一个 ML 产品时,需要在任何给定的时间同时理解和管理几个领域。在读 MBA 期间,我读过一个案例研究和一篇关于构建平衡计分卡概念的文章。大约 30 年前,罗伯特·S·卡普兰和大卫·P·诺顿为管理商业的各个方面提供了这个解决方案。他们建议使用平衡计分卡从四个重要的角度来看待业务:

  • 客户如何看待我们?
  • 我们必须擅长什么?
  • 我们能持续改进并创造价值吗?
  • 我们如何看待股东?

“把平衡计分卡想象成飞机驾驶舱里的刻度盘和指示器。对于导航和驾驶飞机的复杂任务,飞行员需要关于飞行许多方面的详细信息。他们需要有关燃油、空速、高度、方位、目的地以及总结当前和预测环境的其他指标的信息。”

我们能否采用平衡记分卡的概念并对其进行定制,以管理机器学习产品?以下是我从自己的经历中总结出的记分卡:

1。数据,数据,数据

是啊!夏洛克!我同意没有粘土就不能砌砖。没有正确的数据,我们无法构建 ML 解决方案。所以,让我们从数据开始,数据,数据。理解和积累适合您项目的数据是无可替代的。根据您在项目中所处的位置,与您的应用科学家坐下来了解他们对数据的限制。认真对待这些问题,并召集你的团队来解决这些问题。制定一个计划,逐步建立数据。这是一个说明我的数据记分卡的表格。

2。给我钱

ML 工作与业务单位的顶层指标紧密相关。将 ML 输出链接到 topline 对于项目的持续成功至关重要。当利益相关者表达对潜在影响的担忧时,理解被质疑的假设,并制定计划来确认这些假设。收集证据,向风险承担者展示模型的影响。结合莫斯科项目框架,以避免范围蔓延,即使在计算影响时也是如此。

3.内部记分卡

通过清晰的沟通流程减少跨职能部门的歧义。每个人都投入了大量精力来沟通项目中各个里程碑的状态。

4.顾客

客户为你的项目制造了一个很好的共鸣板,尽早让他们参与进来,然后逆向工作。这对于任何一个产品经理来说都应该是显而易见的一步,我就不拿这个来烦你了。

邀请您:

仅仅专注于推出 ML 解决方案而没有一个平衡的方法会让你走上一条循环的道路。利用上述平衡计分卡提高推出正确解决方案的几率。问题列表和记分卡的类型越来越多。请随意在你的项目中使用这些记分卡。我邀请您分享其他对您有帮助的记分卡或相关问题。祝你一切顺利!

引文:

[1]:弗莱明、雷蒂卡和菲尔·费施特。“如何避免你隐约出现的机器学习危机。”HFS 研究,2018 年 7 月。https://1 PCL 3 wzgyqw 5 KF 62 erficswwpengine . net DNA-SSL . com/WP-content/uploads/2018/07/RS _ 1807 _ HfS-POV-machine learning-crisis . pdf .

[2]:卡普兰&诺顿。(1992).平衡计分卡——推动绩效的衡量标准。《哈佛商业评论》,71–79 页。检索自https://HBR . org/1992/01/the-balanced-score card-measures-the-drive-performance-2

产品经理的机器学习指南:云机器学习

原文:https://towardsdatascience.com/a-product-managers-guide-to-machine-learning-cloud-machine-learning-ca5d7209a4fa?source=collection_archive---------64-----------------------

为什么获得亚马逊网络服务机器学习专业(“AWS ML”)认证是获得云机器学习关键要素实用知识的最佳起点之一。

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

本杰明·艾略特在 Unsplash 上拍摄的照片

当我第一次开始学习 ML 时,我发现自己陷入了一个无尽迷宫中令人失望的死胡同。很长一段时间,我从来没有非常成功地接触过机器学习组件,因为我总是被困在的迷宫中,而循环、理解、容器和函数。当时,缺乏进展令人沮丧。我的许多死蟒的回复默默地证明了这一点。

为了在开始漫长而艰苦的学习 ML 的旅程之前形成一个良好的心智模型,我们必须首先获得一个整体的观点,然后挖掘更详细的目标。类似于绘制森林地图,第一步是查看森林的景观,然后是查看森林的树木(即树干和大树枝),然后也只有在那时,你才会注意森林的树叶和树枝。

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

图像来源

在这个学习曼梯·里的迷宫中,我觉得自己好像在和树叶和树枝打交道。我想在被杂草、树枝和树叶缠住之前看到森林的全景。我发现 AWS ML 认证给了你一个有利的视角来看待 ML 的广阔森林。如果这些观点鼓舞了你,那么你将有力量和动力不放弃旅程。通过这个测试是激励和验证。

值得吗?

这不是一个廉价的测试。它需要 300 美元和几个月的课后学习。在准备考试之前,我谷歌了一下“AWS ML 认证值得吗?”。我没有找到一个明确回答这个问题的答案:“值得吗?”。以下是为什么这项测试值得进行以及它能提供什么的一些考虑因素:

这是一个易于应用的基于案例的测试: 我真正喜欢这个测试是因为它是基于案例的。它给出了一个场景,并询问如何将各种 ML/AWS 解决方案应用于该场景。当测试呈现各种情况时,它扩展了你的批判性思维和你可以用 ML/AWS 做什么的可能性。有时我发现自己在说:“哦,哇!你能做到吗?”,“嗯,我从来没有想到这一点”。看到可能性是很有趣的。你不能在这次考试中死记硬背。类似于 ML 的核心思想,概括知识是关键。这种基于案例的方法提高了人们为给定的商业问题选择和证明适当的 ML 方法的能力。

为理解算法提供了优秀的框架: Sagemaker 内置了 17 种算法。您可以看到算法的本质,特定算法将解决的问题的类型,它的学习类型,它的超参数,数据输入模式,文件类型(Record-IO,CSV,JSON,Text),实例类的类型(CPU 与 GPU)。了解算法的不同特征,使你能够表达基本 ML 算法背后的直觉。此外,您将了解损失函数,优化模型性能,并学习评估模型输出。要快速阅读这三个核心观点,请阅读本文:

[## 产品经理机器学习指南:核心思想

在进入机器学习的树叶和小树枝之前,先了解一下树干和大树枝。

towardsdatascience.com](/a-product-managers-guide-to-machine-learning-core-ideas-ba837885d5a)

给出了基础后端知识的极好的鸟瞰图: 为了构建、设计和部署 ML,它需要 DevOps。在为考试而学习的时候,你会看到大多数 AWS 后端系统和服务。您将体验到这些服务是如何相互作用来获取、培训、测试和部署 ML 解决方案的。这种公开使您能够识别适当的 AWS 服务来实现 ML 解决方案。这些服务可以是 Sagemaker、Kinesis、EMR、EC2、Glue、Athena、KMS、S3、Apache spark 等。随着更多的接触(实践经验),设计和实现可扩展的、成本优化的、可靠的和安全的 ML 解决方案将成为一种直觉而不是一个谜。

有了新的心智模型,我最好和我的应用科学家和工程师讨论: 获得你同事的信任是值得的。作为准备工作的一部分,部署您自己的 ML 模型并观察它的工作是值得的。

**本测试还将拓展你的职能技能,这些技能不受公司/行业的限制:**本测试考察的核心理念可应用于各种行业,如医疗、公共政策、金融等。

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

最后,这个测试的范围和深度是巨大的。要学的东西太多了。我推迟了两次考试,因为我担心我的准备不充分。这是一个复杂的课题和艰难的考验。因为旅程的每一步都很艰难,所以当我通过测试时,胜利的感觉是真实的!知道自己能做难的事情,是值得的。

邀请:

这个测试也将拓展你的职能技能,这是公司/行业不可知的。下面我提供了我使用过的资源。

资源:

哪些资源帮助我准备了考试,我将如何评价我从这些资源中获得的价值(下面提供了这些资源的所有链接):

  1. SageMaker Docs (40%):核心信息在这里。重读这些。
  2. Udemy 课程(30%):该课程涵盖了文档中没有的细节。有时会有点干,但你能熬过去。我使用模拟测试进行基准测试。
  3. AWS 常见问题解答(20%):这些将各种系统和服务联系起来。
  4. 随机 AWS 在线技术深度挖掘视频(10%):我必须深入挖掘容器、超参数、分布式学习等。

资源链接

[## 亚马逊 SageMaker 是什么?

亚马逊 SageMaker 是一个完全托管的机器学习服务。有了 Amazon SageMaker,数据科学家和开发人员可以…

docs.aws.amazon.com](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) [## AWS 认证机器学习专业 2020 -动手!

对通过 AWS 认证机器学习专业考试(MLS-C01)感到紧张?你应该害怕!毫无疑问…

www.udemy.com](https://www.udemy.com/course/aws-machine-learning/)

AWS 常见问题解答

[## AWS |常见问题

从以下产品和技术常见问题列表中选择。浏览这些常见问题,找到常见问题的答案…

aws.amazon.com](https://aws.amazon.com/faqs/)

我的认证

验证码:55X5DDYKMJQQ14W7

[## 亚马逊-证书验证-证书矩阵

请输入位于 AWS 证书右下角的验证码。单击提交以验证…

aws.amazon.com](http://aws.amazon.com/verification)

产品经理机器学习指南:核心思想

原文:https://towardsdatascience.com/a-product-managers-guide-to-machine-learning-core-ideas-ba837885d5a?source=collection_archive---------45-----------------------

在进入机器学习的树叶和小树枝之前,先了解一下树干和大树枝。

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

辛金·托马斯在 Unsplash 上的照片

语境

对于产品经理来说,通过机器学习来推动业务影响的需求越来越大。在写这篇文章的时候,我作为亚马逊的高级产品经理正在发布 ML 驱动的产品/特性。在这段时间里,我花了很多时间在日常工作中学习和使用 ML 概念。希望我的经历能对你的学习有所启发,在“产品经理机器学习指南”系列中,我将记录我的收获。

这篇文章是为那些产品经理而写的,他们想比核心 ML 过程概念更深入一点:设定目标、获取数据、分割数据、培训、验证、测试、评估和发布。

文章:路线图

以上面提到的 ML 过程为背景,我发现 3 个核心概念是 ML 的主干和大分支。

3 个核心概念是 1)损失 2)优化和 3)评估。

你不必知道这些概念的细枝末节。我将使用简单的视觉和语言来交流这些线性回归算法的概念。

免责声明——每一个主题都是如此广泛和详细,以至于人们可以就每个主题写一本书。本文是对主要思想的简单介绍。

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

图 1:核心概念

介绍

“要做的工作”理论也可以应用于机器学习。在我们进入 3 个核心概念之前,让我们花点时间来理解——线性回归算法的工作是什么?为什么我们要雇佣这个算法?

线性回归算法的目的是在数据点之间定位一条线(图 1:蓝点)。目标是我们想要学习信息 *X,称之为特征,有关于 y ( 称之为目标/标签),*以便我们可以预测一个新的或未知的 Xy 。这里 X 和 y 本质上是定量的。

例如:我们能多准确地估计出 X 对 *y 的影响?*广告(X)对销售额(y),房间数(X)对房价(y),身高(X)对体重(y)等。如果只有一个特征,它被称为简单线性回归,我们在 X 和 y 之间拟合一条线。如果有许多 X s ,它被称为多元线性回归,你在 Xsy 之间拟合一个平面。

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

图 2:拟合模型的简单图示

如图 2 所示,该算法遍历了许多不同的线,为我们提供了一个最佳模型。即使是小孩也能看出最合适的是最合适的。

fit 作业的输出是什么?

线性回归模型的输出是一个等式,该等式捕获了 Xs 关于 y 的信息。当模型准确地学习到参数β时,就会发生这种情况。如图 3 所示。企业需要这些参数来了解如何分配有限的资源或产生影响。

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

图 3:多元线性回归

嗯,模特怎么知道最合适的?

之前我说过,一个孩子可以看出图 1 中最右边的拟合是最佳拟合。但是怎么做呢?这样的结论背后的直觉是什么。这种直觉可以通过观察实际值(蓝点)和预测值(线上的一点)之间的距离来捕捉。

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

图 3:损失的简单说明

失败

实际值和预测值之间的距离越大,预测就越差。你是说——啊!这就是所谓的损失,一种糟糕预测的惩罚。任何算法都有一种或多种类型的损失。这些也被称为损失函数。我们将在这里检验的线性回归模型使用了一个称为平方损失的损失函数。单个示例的平方损耗如下:

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

图 4:平方损失

我们希望降低模型无法对未知数据产生良好预测的风险,因此我们引入了训练集和测试集的概念。这些不同的数据集将引入方差的概念(模型为不同的数据集生成不同的拟合),即过拟合和欠拟合等。我们想使模型不被训练集的特性所影响,这一意图向我们介绍了另一个叫做正则化的概念。正则化建立在残差平方和的基础上,这是我们最初的损失函数。

  • 普通回归:残差平方和-(1)
  • 岭回归,也称为 L2 正则化,通过惩罚权重平方来最小化模型的复杂性:(1) + λ *权重平方和-(2)
  • Lasso 回归,也称为 L1 正则化,通过使无信息系数等于零来最小化模型的复杂性:(1)+λ*绝对权重之和| — (3)
  • 弹性网= (1) + (2) + (3)

最佳化

我想你可能会问这个问题——在数据点之间放置线可能有成千上万种变化。这是如何实现的?为了形象化,请看图 5。图 5 的目的是展示为了得到合适的拟合,实际上会发生什么。

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

图 5:拟合的变化

你可以找到关于这个主题的大量书籍,这些书籍可以填满一个小型图书馆。作为一名产品经理,我不需要也不期望我知道这些书中描述的优化的枝叶。这个想法很简单——优化。如果你有一个送报路线,你就优化了路线,也就是说,在最少的时间内送更多的报纸。如果你有孩子,你会选择制造最少混乱的玩具。如果你是一个 ML 模型,你优化拟合产生最小损失函数。

在我们的例子中,我们最小化实际 y 和预测y之间的平方距离。这个最小化损失的过程可能需要几毫秒到几天。有不同的方法来优化我们寻找最小平方和的过程。也就是说,有各种优化算法来完成目标。例如:1)梯度下降 2)随机 GD 3) Adagard 4) RMS Prop 等是一些优化算法,仅举几个例子。按照惯例,大多数优化算法都与最小化有关。

例如,在图 6 中,我们可以使用梯度下降到损失函数的最低点,该点将成为图 3 中输出方程的截距和其他参数。

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

图 6:参数的错误率

估价

一旦损失被确定并减少,我们就到达了最后的核心概念:评估。通常,这是业务所有者会面并熟悉模型性能以实现业务目标的地方。

在线性回归中,可以根据均方误差(损失函数)评估模型,越小越好,R 平方,调整 R 平方,越高越好。

  • R - 平方测量线性回归模型中自变量(X)解释的因变量(Y)的变化比例。
  • 调整后的 R - 平方根据模型中独立变量的数量调整统计数据。

邀请

机器学习的应用令人敬畏。不要让数学和词汇阻止你追求机器学习。如你所见,核心概念是熟悉和基本的。正如产品经理需要机器学习一样,它需要充分利用机器学习的产品经理。我希望这些核心观点能帮助你在与你的 ML 团队合作时思考正确的问题。

基于 fastText 的文本分类生产机器学习流水线

原文:https://towardsdatascience.com/a-production-machine-learning-pipeline-for-text-classification-with-fasttext-7e2d3132c781?source=collection_archive---------35-----------------------

了解如何在多个步骤中组织您的 ML 代码,并使用 Valohai 创建受版本控制的 ML 管道。

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

带有执行和工件的数据谱系图。

在生产中做机器学习的时候,模型的选择只是众多重要标准中的一个。同样重要的是正确定义问题,收集高质量的数据并构建机器学习管道。

本文着重于为一个流行的问题构建一个机器学习管道:文本分类。管道获取带标签的数据,对其进行预处理,自动调优 fastText 模型,在所有数据中重新训练模型,并输出度量和预测以进行迭代。

我使用 Valohai 创建一个 ML 管道,并对每一步进行版本控制。最后,只需点击几下鼠标,您就可以在云上运行管道,并探索每个中间结果。

构建生产就绪基线

在 Kaggle 竞赛中,你在一个确定的问题和一个冻结的数据集上工作。你对排行榜上的好成绩有所了解。

在现实世界的应用中,数据集不断发展,模型会定期重新训练。例如,在文本分类中,添加新的标签数据和更新标签空间是很常见的。

为了构建 ML 管道,我使用了来自 BBC 新闻的 2225 份文件的数据集,分为五个主题:商业、娱乐、政治、体育和科技。数据集为每个文档分配一个标签,这就是所谓的多类问题。

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

您可以在任何包含两列的 CSV 文件上运行管道:文本和标签。如果您想为多标签问题训练它,您可以添加具有相同文本和不同标签的额外行。

使用快速文本进行文本分类

脸书在 2016 年宣布 fastText 是一个高效的文本分类和表示学习库。官方快速文本文件中报告的一些优势:

  • 在标准多核 CPU 上几分钟内训练 10 亿个单词。
  • 在不到一分钟的时间内对 312K 个类别中的 50 万个句子进行分类。
  • 创建对拼写错误具有鲁棒性的子词向量。
  • 包括易于使用的 CLI 和 Python 绑定。

2019 年,脸书为 fastText 添加了自动超参数调谐,我将它作为管道中的一个步骤。

集成 fastText 和 Valohai

我用 Click 为每个 ML 步骤创建一个命令,这是一个 Python 库,它修饰函数,将它们转换成命令。每个命令接受数据和参数,并生成数据和指标

例如,autotune 命令在训练分割上训练几个模型,以找到验证分割上的最佳参数。

检查 Github 中所有 commands.py 代码。

get_input_pathget_output_path 函数在本地和 Valohai 云环境上返回不同的路径。 train_supervised 方法接受参数来限制训练的持续时间和模型的大小。保存最佳参数,以便以后根据所有数据重新训练模型。

为了在云中运行 autotune 命令,我将它添加到 valohai.yaml.

检查 Github 中的所有 valohai.yaml 代码。

创建机器学习管道

Valohai 管道是一个版本控制的步骤集合,在图中表示为节点。每个数据依赖导致步骤之间的边缘。

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

文本分类管道有 5 个步骤:

  1. 预处理:对 fastText 使用的原始数据进行预处理。
  2. 拆分:将预处理后的数据拆分成训练、验证和测试数据。
  3. 自动调优:在验证数据上找到最佳参数。
  4. 训练:用所有数据上的最佳参数训练最终模型。
  5. 测试:获取测试数据的度量和预测。

与执行类似,管道在 valohai.yaml 文件中由两部分声明:节点和边缘。

检查 Github 中所有的 valohai.yaml 代码。

一旦声明了管道,就可以运行它,并通过单击它来检查每个管道节点。下面您可以看到自动调优节点的详细信息。

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

Valohai 管道是声明性的,很容易与您的代码集成。对于动态管道,可以将 Valohai 与气流整合。

自动跟踪数据沿袭

数据沿袭图显示了执行和工件之间的数据依赖关系。在 Valohai 中,您可以跟踪每个依赖项,以便更快地调试管道。

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

Valohai 生成的数据谱系图。

迭代问题、数据和模型

自动调优步骤是获得良好结果的关键。F1 分数从默认参数的 0.3 变为测试数据集的最终 F1 分数 0.982。中间结果由 fastText autotune 命令记录,可以在日志中读取。最终得分记录在 JSON 中,并由 Valohai 存储为执行指标。

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

但是只看一个指标不足以知道你的模型是否工作良好。最有趣的信息在 test_predictions.csv 文件中。它包含模型在 222 条记录的测试数据集上产生的 4 个错误。

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

反复讨论这个问题

第四个错误将 0.59 的概率分配给商业标签,而不是 0.39 的政治标签。探究全文可以发现,文章谈到了这两个话题。该观察可能导致对问题进行迭代,以变成多标签,并分配高于概率阈值的所有标签。

对数据进行迭代

总的来说,标记的数据是高质量的。我们可以认为一些 p@1 较高的误差是对标记数据的修正。在另一个具有由不同过程产生的标记数据的数据集中,模型预测可用于校正标记数据

在模型上迭代

如果最终指标对您的业务案例不满意,可以添加新功能,并培训不同的模型。但是我认为最好从正确的问题定义和数据开始。这些是你的 ML 管道的成分。

使用 Valohai 在您自己的数据集上尝试 fastText

自己在云端运行管道很容易。下面的按钮将邀请您注册/登录到您的 Valohai 帐户,并创建一个项目来尝试这个管道。

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

创建项目后,请按照以下步骤操作:

  1. 在设置选项卡>常规选项卡中,将默认环境设置为微软 Azure F16s v2(无 GPU)
  2. 在 Pipeline 选项卡中,使用蓝图 fasttext-train 创建一个管道。
  3. 点击创建管道运行管道。

当管道运行时,您可以单击图中的每个节点,并查看日志和输出。管道完成后,您可以单击一个节点,并通过单击 Trace 按钮获得数据谱系图。

恭喜你,你已经运行了你的第一个 ML 管道!现在你可以用你自己的数据来尝试一下,为你的文本分类问题获得一个基线:

  1. 在数据选项卡>上传选项卡中,上传数据集。数据集应该是一个包含两列的 CSV 文件:文本和标签。
  2. 在运行管道之前,单击预处理节点。在输入部分,用步骤 1 中上传的数据替换默认输入数据。

结论和下一步措施

在多个步骤中组织你的 ML 代码是创建受版本控制且易于调试的生产机器学习管道的关键。CLI 是 ML 代码工业化的一个流行选择。

对于文本分类等常见问题,fastText 是一个强大的基线构建库。有了 Valohai 你就有了一个版本控制的机器学习管道,你可以在你的数据上运行。在另一篇文章中,我重用了管道来将 400 万个 Reddit 帖子分类到 4k 个子编辑中

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

有用的资源

人工智能的一个难题

原文:https://towardsdatascience.com/a-puzzle-for-ai-eb7a3cb8e599?source=collection_archive---------19-----------------------

我如何教一个 AI 玩 2048

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

作者图片

嗨!我叫 Rinat Maksutov,在俄罗斯埃森哲技术公司的智能工程服务部门工作,负责定制开发项目。在我在埃森哲的漫长职业生涯中,我经历了许多不同的领域:移动开发、前端、后端,甚至是带有机器学习的数据科学。然而,我的故事不会是关于工作,而是关于一个爱好。我真的很喜欢通过我个人喜欢的项目来学习和探索新的领域。今天我将告诉你其中的一个——我如何教一个强化学习(RL)代理玩著名的益智游戏“2048”。这篇文章故意不包含代码、数学、最先进的方法和该领域的最新发现,所以对 RL 非常熟悉的人不会为自己发现任何新东西。这篇文章是给大众的一个故事,讲述了我是如何给自己设定一个不寻常的目标并实现它的。

我们公司在持续的员工培训上投资巨大。例如,去年推出了一个项目,员工可以免费参加 Udacity 上的一个纳米学位课程(纳米学位是一系列课程和一个最终项目)。我已经在这个平台上做过深度学习 Nanodegree,所以这次我决定上强化学习的课程。

该课程很好地揭示了 RL 的基础,但有一个很大的缺点:该课程提供的教育项目是基于现成的任务——在这些任务中,代理运行的环境已经由某人为您编写好了。也就是说,您只需实现学习算法并调整超参数,以达到目标分数并通过考试。

因此,在完成课程后,你将无法完全应用 RL 并解决你自己的问题,因为你只学习了这个领域的一部分。以及如何为代理人正确地构建环境、如何为其正式化任务、如何为各种行为正确地分配奖励等问题——留在括号之外,你必须自己解决(所有这些术语的含义,我将在下面解释)。

为了弥合这一差距,我试图解决一些以前没有人解决过的问题(至少在 RL 的帮助下),并用它来研究为代理人构建环境的各个方面。作为这样一个任务,一个机械简单的益智游戏 2048 被选中(你可以在这里的浏览器中玩它:https://play2048.co/或者在谷歌 play 或应用商店搜索你的智能手机)。在这个游戏中,玩家通过在四个方向(上、下、右、左)之一移动细胞,需要将具有相同值的细胞组合起来,并尝试收集具有最大可能值的细胞。当你进行移位时,一个新的 2(概率为 0.9)或 4(概率为 0.1)出现在随机的自由单元格上。当场上没有空的格子,并且玩家不能组合任何格子时,游戏结束。

尽管名字如此,2048 并不是游戏中最大的单元格值。经过适当的训练,您可以得到值 4096、8192 个单元格等等。理论上可能的最大单元值是 131,072,即 2 ^ 17:

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

来源:维基百科

但是获得这个值是非常困难的。这是因为这个游戏没有一个策略可以保证获得尽可能多的分数。只有一种策略能增加你实现它的机会。粗略地说,它包括定义两个优先的垂直方向(例如,向下和向右),大多数移动只在这些方向上移动细胞,很少在其他方向上移动。因此,较大的值将在四个角中的一个角上彼此靠近地“累积”,并且将它们组合起来以获得甚至更大的值将会方便得多。

为什么这个策略不能保证胜利?

  1. 空的单元格被随机地填入两个或四个新的数字——也就是说,你可能很幸运,一个“方便”的单元格会被填满,或者它可能不幸运,一个单元格会被填满,使你不容易收集到所需的组合。
  2. 收集每个下一个值的复杂性(所需的步骤数)近似呈指数增长。而且越深入,它就越依赖于新价值的“成功”出现,错误行为的代价就越高。

因此,代理人的任务将是学习这种策略,以便在每一步选择最有可能在未来允许的行动,以在游戏中获得单元的最大可能值。

强化学习的小介绍

上面我写道,我不会让你沉浸在 RL 的理论中,但仍然值得简要回顾一下主要观点。强化学习是机器学习的一个领域,其目标是教会智能体在某种环境下执行必要的动作。这里的代理是一个虚拟实体(程序、模型),它接收其运行环境的当前状态作为输入。然后,根据这种状态,它选择最有价值的动作,将其传达给环境,并从环境接收反馈和新的状态。如此循环,直到环境达到最终状态。

在代理的引擎盖下,可能存在一些数学模型,该模型基于环境的当前状态来确定哪个动作将是最佳的。最初,一般来说,代理人不知道什么样的环境给他,以及它的行动如何影响它。代理人通过所谓的“奖励”接收来自环境的反馈。这是一个数字,代理可以通过它来判断所选择的动作有多正确。代理的任务是学习一种“策略”——一种在代理存在于环境中的整个时期内使代理的报酬最大化的行动策略。这种奖励正是“强化”,这意味着正确的行为得到积极奖励的支持,错误的行为受到消极奖励的阻碍。因此,通过多次迭代,代理(或者更确切地说,模型)开始更准确地预测每个可能的行动的潜在回报,并选择最有价值的行动。

Udacity 有一个有趣的小狗训练类比。你给它一个命令,起初它不明白你想要什么。它开始执行随机的动作来响应你的命令:吠叫、跳跃、仰卧、跑来跑去。当它随机选择正确的动作时,你就给了它一个奖励。狗意识到,你很可能希望它按照这个指令做那个动作。这样反复几次——命令——动作——好吃,之后狗就确信了所选动作的正确性。

近年来,大量关于人工智能的大型媒体故事都与强化学习有关:AlphaGo 算法的胜利,在专业水平上玩星际争霸,等等。但你需要明白,在强化学习领域仍有许多未解决的问题,其中一个主要问题是所学技能对其他任务的可移植性差,以及学习的高度不稳定性,这甚至会受到环境最轻微变化的影响。也就是说,如果算法在一个游戏中学习玩得很好,那么它很可能在另一个游戏中显示糟糕的结果。在这个方向上有一些进展,但距离相对通用的算法还有很长的路要走,最有可能的是,开发它们在经济上尚不可行。

另一个重要的问题是,在实践中,很少有任务可以借助强化学习来解决。与花时间训练代理相比,实现解决问题的已知算法通常更容易、更快、更可靠。由于这个原因,强化学习还没有像机器学习的其他领域一样受到重视。

事实是,传统上机器学习用于自动化任务:1)难以算法化,2)由受过充分训练的人容易执行,但是 3)需要人花费大量时间来完成任务。例如,在图像识别任务中,一个人可以很容易地确定想要的对象是否在上面,但是很难编写一个足够可靠并且或多或少通用的算法来确定对象,同时,对于大量的图像,一个人将在很长的时间内完成这项工作。或者,例如,欺诈检测:受过训练的人将能够通过交易序列识别可疑活动,但他们的搜索和分析将花费大量时间,并且这项任务也很难用普遍预定义的规则集来描述。

现在我们从这个角度来看强化学习。这个领域的目的是教一个代理在特定的环境中行动,也就是说,根据当前的情况做出决定。没有多少任务符合这一想法——主要是在控制某些东西的领域,例如,装配线上的机械臂,路上的汽车,星际争霸中的一群 zergs,等等。但是通常人们已经知道了达到预期结果的规则或策略。我们不希望一个装配线上的操作者在开始做正确的事情之前,先学会把一个零件放在正确的位置上几万个周期,然后毁掉几万个产品。编写一个在装配过程的每一步精确定位机械臂的程序要安全得多。我们不希望汽车行驶数百万公里,并通过一周内的罚款来了解每个路标的意思——最初输入这些知识要快得多,也更可靠。这就是为什么强化学习仍然是一个非常实验性的领域,它的实际应用很少。三年前的一篇关于这个话题的精彩文章仍然很有意义,并且很好地描述了这个问题,我建议你读一读。介绍到此结束,我们回到我们的任务。

耙子和自行车

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

博罗米尔的另一个迷因。图片作者。

到达 cell 2048(虽然对于一个或多或少有经验的玩家来说,2048 根本不是一个成就)是一个漫长的尝试、错误、失望、最愚蠢的 bug、灵感和喜悦的旅程。

起初,一切看起来都很简单:我们从我在 Udacity 上的作业中获得了实现 Deep Q-network 的现成代码,将其稍加修改以适应我们自己的环境,一切都会迎刃而解。太天真了。

这样你就能理解 3 个月的实验都花在了什么上(如果什么都不清楚,你可以对子弹的数量感到惊讶,并进一步滚动):

环境状态表示

  • 独热编码向量(16 个单元*每个单元 18 个可能的状态)

也试过:

  • 具有“原样”单元格值的向量
  • 具有 Log2 像元值的向量
  • 卷积网络的 4 乘 4 矩阵

奖励

  • 当前步骤中棋盘上折叠单元格的 log2 值之和减去移动单元格的罚分和错误移动的罚分

也试过:

  • 板上单元格值的总和
  • 所有时间内折叠单元格值的总和
  • 整个时间内折叠单元格的 log2 值之和

训练

  • 每场比赛后 10 次训练迭代,批次大小为 1024,初始ε: 0.05,递减因子为ε: 0.9999,

也试过:

  • 每场比赛后 1、3、5、20 次训练迭代
  • 从 1.0 到 0.01 的不同ε值(行动的因子随机化)

经验的积累和运用

  • 缓冲 100,000 个最近的动作

也试过:

  • 随机经验抽样(无优先顺序)
  • 5 万和 20 万的缓冲
  • 通过棋盘上的总和、最大单元格、错误值、奖励(包括行动分配的平衡)来确定经验优先级

协助学习(作弊)

也试过:

  • “从中间开始”:每 N 集让代理人在一个随机产生大细胞的环境中发射,以便让他熟悉他以前从未达到过的价值观。
  • “平行宇宙”:除了一个选定的步骤,其余 3 个可能的步骤被计算并保存在历史中,以便在训练中有更多可比较的例子

什么被最大化

  • 提前两步折扣奖励

也试过:

  • 下一步中的帐户
  • 所有后续步骤中的折扣分数
  • 下一步奖励

神经网络

  • 5 层:288–3x 1024–4,ReLU 和 Adam 优化器激活

也试过:

  • 2,4 个隐藏层
  • 其他优化器和激活
  • 隐藏层中有 256,512 个神经元
  • 不同的学习率值
  • 卷积网络

如果神经网络配置和训练参数是一个人每次都必须处理的非常标准的事情,当你解决深度学习中的一个问题时,那么其他的都是强化学习特有的。

我不得不面对的第一件事是在培训代理人方面毫无进展。这与代理人从环境中接收的信息有关。

代理的环境

为游戏编写棋盘逻辑变得非常简单,只需要几个小时。几个简单的矩阵技巧,引擎就准备好了。它根据选定的操作执行单元格的“折叠”和移动,填充新的单元格并计算点数。因此,环境的当前状态由一个简单的 4x4 矩阵描述,其中每个单元包含相应单元的值。由于我使用了常规的全连接神经网络,因此在将环境状态发送到神经网络之前,必须将其转换为 1x16 向量:

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

游戏板转型。作者图片

第一个问题出现了。当代理到达 512 单元时,训练质量停止增长。不管我怎么训练它,它都不能收集更多的了。这里的问题出在单元格的值上,它有一个巨大的范围:从 0 到几十万。让专家们见谅,但这里对这种行为的原因有一个非常松散的解释——我故意简化,以便大致思路清晰。

每个输入值都是神经网络的信号。这个信号的强度与输入值成正比,神经网络输出端的误差也将与其成正比。药剂到达的细胞越大,来自这些大细胞的信号就越强,而来自较小细胞的信号就越弱。然而,发现小像元的数量级比大像元多,并且它们比大像元更重要,因为通过正确收集小值可以获得大值。事实证明,代理学习收集的值越大,它开始与较小的细胞一起工作就越差,因为它们的信号对于神经网络来说越来越弱。

事实证明,解决这个问题相当简单。我只是将这些值放到了一个更统一的尺度上:单元格值的 log2。然后指数增长的值变成了一个普通的序列:

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

也就是说,在每次移动之前,计算当前棋盘的每个单元格的 log2,然后将这个矩阵输入到神经网络中。这个技巧使得克服值 512 的上限并达到 1024 成为可能。但是学习过程仍然非常缓慢。很明显,这种环境对于神经网络来说信息不够丰富。

在某种程度上,我认为代理并不真正关心单元格的值。将一种价值观转化为另一种价值观的机制才是重要的,也就是说,一种新的价值观是从另外两种相同的价值观中产生的。我们可以用下面一行来补充我们的表:

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

对代理人来说,唯一的意义就是 a + a = b,b + b = c,等等。,而不是 a、b、c 后面藏着什么值(这里的“+”不是加法,同样是“折叠”)。这意味着单元格的值不能被视为数值,而是分类值。因为我们知道一个单元的最大可能值,所以每个单元可以表示为一个独热编码向量。也就是说,对于每个单元,不使用它的值,而是使用 18 维的向量,其中所有值都是零,并且只有一个值等于 1,该值的位置对应于我们可能的值之一。这样的向量——通过细胞的数量。我仍然不清楚为什么,但正是这个,而不是数字表示,帮助代理更快地达到更高的值。

报酬

最初,奖励简单地计算为棋盘上所有单元格的值之和。看起来这个分数将是代理人进步的引擎,因为通过分数的逐渐增加,人们可以判断是否选择了正确的行动,这可以用作奖励。事实证明不是。原因就在于游戏的机制。

就拿《太空入侵者》这种非常简单的游戏来说吧。几年前,谷歌对其代理进行了这方面的培训。

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

来源:维基百科

在这个游戏中,每击中一个外星人,分数就会增加。即动作(“出手”)、环境中的结果(“命中”)与分数之间有直接关系。

在 2048 年,这种方法不起作用。原因如下。假设您有两个相邻的值相同的单元格。你把它们折叠起来,然后…黑板上的分数没有改变。因为它们的值分别等于新单元的值。也就是说,在执行了正确的动作之后,代理人将不会得到积极的强化,也不会学到任何东西。此外,在每个动作之后,一个新的随机单元格被填充值 2 或 4。因此,无论代理执行什么操作,它都会收到一个值作为响应,该值等于[计数到步骤+ 2 或 4]。显然,这些信息不足以理解代理人如何选择动作。正因为如此,训练实际上没有进展。

因此,该奖项必须以不同的方式实现。起初我试图给它的不是棋盘上细胞的当前值,而是游戏开始以来折叠细胞的值。现在代理人有了一个更可靠的参考点,训练进行得更快了:代理人看到哪个动作大大增加了分数,哪个没有。但即使如此,训练并没有像我希望的那样快,所以这个想法提出了一个更具体的指标:只给出当前步骤中崩溃细胞的总价值作为奖励。这使它能够清楚地了解什么样的行动应该导致什么样的结果,并大大加快学习过程。

但是还有一个与游戏机制相关的细节。向两个相反的方向移动的回报将是相同的,但棋盘将处于不同的状态,并将在接下来的步骤中导致不同的后果。但是更重要的是,如果你记得的话,转变应该主要发生在选定的方向上。也就是说,如果我们收集右下角的细胞,那么只有在特殊情况下才应该进行左移。因此,我们可以假设向右移位的预期报酬较大,向左移位的预期报酬较小。这意味着我们不仅需要预测当前步骤的预期回报,还需要预测下一步的预期回报。

为了训练模型来预测奖励,我使用了“玩过”游戏的历史记录——以前游戏的每一步都保存在一个特殊的缓冲区中,用于训练。首先,我尝试使用从当前步骤到游戏结束的所有奖励的总和作为预测的目标值。此外,离当前的一步越远,其回报的总和权重就越小。为此,我将它乘以一个几何递减级数的相应序数值。但是这种方法,由于动作变化太多,给出了糟糕的预测。然后我把预测深度限制在当前步骤,权重为 1.0,下一步权重为 0.1。查看日志,我发现随着时间的推移,对潜在回报和最有价值的行动的预测实际上变得越来越接近实际发生的情况。但是,这个模型还是经常在非优先方向上移动,从而破坏了棋盘上的局面。有必要以某种方式“劝阻”行为者不要做出对自己有害的行为,而这是在惩罚的帮助下完成的。

惩罚

这种方法在 RL 中经常使用,这样代理不仅可以学习如何执行任务,还能以最简单的方式完成任务。为了告诉它哪些步骤是精益的,哪些是浪费的,你需要把这些信息放在奖励里。在我的例子中,我决定在每次移动时惩罚代理,因为所有的细胞在选择的动作后都移动了(也就是说,改变了它们的位置)。移动的细胞越多,惩罚就越高。也就是说,如果它在右下角累积了较大的值,并继续向右或向下移动,则只有新单元格的值会成为它每一步的惩罚。如果它突然决定向上或向左移动,那么不仅新的细胞会移动,所有集中在右下角的细胞也会移动,惩罚将是巨大的。随着时间的推移,代理人意识到,最大的奖励不仅是在它折叠更大的细胞时获得的,而且是在它移动最少数量的细胞时获得的——这迫使它坚持所选择的策略,并且只有在特殊情况下才会在“非优先”方向上采取步骤——当预期的奖励(包括罚款)确实更高时。

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

在每个游戏中所选移动方向的份额分配。图片作者。

在这张图片上,我们可以看到策略是如何逐渐向正确的方向变化的:在第一场游戏中,移动的方向被均匀地选择,但随后“优先”的方向出现了——向右和向下。

特工的行为还有一个搞笑的瞬间,大大拖慢了训练进度。正如我上面写的,代理人并不知道游戏规则。因此,它不知道,如果你已经把所有的细胞都压到了棋盘的右边,就不可能再移动了,比如说,向右移动。也就是说,即使你做了这样的移动,棋盘上的任何东西都不会改变。在某些时候,神经网络出于某种原因决定,最有利可图的移动是没有一个细胞移动的移动,因为如果没有移动,那么就不会有惩罚。也许是因为它们的大小,轮班惩罚比没有得到倒塌细胞的奖励更糟糕。因为在这样的移动之后,棋盘没有改变,所以下一步的输入保持不变。当然,选择了相同的动作。如此反复数千次,直到“随机”移动发生(在每次迭代中,以非常低的概率——十分之一或百分之一——随机移动而不是计算的移动,以便,除了别的以外,摆脱这样的循环)。这个问题本来可以通过调整惩罚和奖励来解决,但我只是决定非常严厉地惩罚“不可能”移动的代理,它很快就放弃了这样做。

结果

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

哇信号。图片作者。

绿色图表显示了每场游戏中的最大单元格值。离群值—在一个游戏中,单元格的最大值是 2048。

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

去 2048 号牢房。图片作者。

为了学会组装细胞 2048,代理必须玩六万多一点的游戏。然而,一个重要的细节是,一个单一的成就并不意味着代理已经学会了持续地做这件事。请看绿色图表的开头,您可以看到代理是如何学习到达 1024 单元的。起初有同样的爆发,然后 1024 越来越频繁地出现,然后在 3 万场比赛后的某个地方,代理人开始非常自信地达到 1024。所以如果我们说代理人真的“学习”如何收集 2048,那么,外推模式,我们可以估计代理人将需要超过一百万场比赛来巩固这一技能,并奔向下一个目标——4096。

你可能已经厌倦了阅读,所以我用 20 分钟的 cell 2048 聚会视频(从 16:40 开始)来结束我的长篇阅读:

我在我的笔记本电脑上进行训练,所以花了大约两天时间才得到这个结果。但是正如我上面写的,2048 年在这个游戏中远远不是极限。因此,如果你有计算能力和时间,这是很有可能达到更大的细胞-采取我的代码在 GitHub 和尝试训练自己的代理人!如果你设法击败我的成就,请在评论中发送你的结果的 gif 和链接。感谢阅读!

Google 云平台发布/订阅的并发消费者通用框架

原文:https://towardsdatascience.com/a-python-implementation-of-concurrent-consumers-for-google-cloud-platform-pub-sub-991ae8b9841d?source=collection_archive---------29-----------------------

一个示例展示了如何将消息发布到 Pub/Sub,并使用 Python 多处理模块构建一个服务来同时使用这些消息

这个博客也可以在 Linkedin 找到。

本博客将向您介绍谷歌云平台(GCP)中的实时消息队列,即 Pub/Sub。首先,我将解释什么是消息队列,以及我们何时需要消息队列。其次,我将向你介绍 GCP 酒吧。之后,我将展示如何向 GCP 发布消息。最后,我将解释一个使用 Python 中的多处理模块实现的并发消费者。我将在这一部分花大部分时间,因为它是使用 Python 多处理模块的并发消费者的通用代码框架,可以在您的项目中无需任何修改地重用。

我们什么时候需要消息队列?

消息/任务队列接收来自一个或多个应用程序的消息,另一方面将这些请求/消息分派给多个分布式工作器来消费这些任务。在此过程中,产生任务并将其发布到任务队列中的应用程序称为生产者,而从任务队列中接收和消费任务的工作者称为消费者。一个好的任务队列应该能够支持分布式的工人/生产者,并以可接受的延迟分派任务。

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

GCP 发布/订阅的并发消费者示例

在后台运行异步任务的应用程序中需要任务队列,如下所示。我们有一个前端用户界面,用户通过点击提交按钮触发一系列的工作。这些作业需要异步运行,因为它们非常耗时。作为一个解决方案,我们在这个项目中需要一个任务队列,以守护模式将从生产者(即这个场景中的前端 UI)接收的任务分派给消费者。您可以提出一个解决方案,将从前端接收的任务信息记录在一个 MySQL 表中,然后让工人使用 MySQL 表中的任务。嗯,MySQL 表不适合做任务队列的原因有很多。在 MySQL 表作为任务队列的那种情况下,(1)你的工作人员需要从 MySQL 服务器上一遍又一遍的查询表,这会给你的服务器带来很大的负担,可能会影响你的其他 MySQL 操作。(2)也可能发生两个工作者试图同时消耗相同的任务,尽管使用适当的锁定逻辑,这种概率很小。(3)由于 MySQL 服务器不是分布式的,所以这种设计是不可扩展的。因此,我们应该考虑在这个场景中使用任务队列。

什么是谷歌云平台 Pub/Sub?

谷歌云平台(GCP) Pub/Sub 是一个消息队列管理系统。它类似于芹菜消息队列,但好处是您不需要构建和维护基础设施。在 GCP 发布/订阅中,一个主题是一个接收生产者发布的消息的任务队列。对于一个主题,我们可以创建一个或多个订阅。发布/订阅会将主题中的所有消息发送给每个订阅。多重订阅适用于有多个应用程序使用相同的消息但目的不同的情况。在我们的场景中,单一订阅就足够了。现在你可能会想,如果只有一个订阅,我们怎么会有多个消费者。嗯,订阅不是消费者,在 Pub/Sub 中表示为订阅者。一个订阅可以有多个分布式订阅者,因此发布/订阅会将消息分派给这些订阅者,以便他们可以并发地使用异步任务。

本文将实现一个消费者/订阅者从发布/订阅请求多个消息,并并发运行工作器。要在实际项目中扩大规模,您只需要在不同的计算引擎中运行多个连接到同一个订户的消费者。

如何向 GCP 发布消息?

请参阅以下伪代码作为示例。类似的例子也可以在 GCP 的 GitHub 中找到。

这里,我们在对 Pub/Sub 的单个调用中批量处理多个消息,以提高吞吐量,因为在我们的场景中,延迟并不是那么关键。 BatchSettings() 如果批量消息的大小达到 10240 字节或每 60 秒发布一次。在*from _ service _ account _ JSON()*中,我们使用 gcp_key 文件作为对 gcp 的认证。并且每次 message_data 发布后,都会触发一个回调函数 log_pub_result() 来显示其发布状态。这里注意,在 Python3 中, PublisherClient 只接受字节串作为数据类型,这就是为什么我们需要将“ message_data ”编码为“ utf-8 ”。

在我们的示例中,Rest API 将触发这个 publisher 模块,以便发布从前端接收到的消息。

如何接收 GCP 酒馆/订阅的消息?

从 Pub/Sub 接收消息的方法有两种: pullpush 。在的情况下,订阅者/消费者向 Pub/Sub 发送请求以拉消息,而 Pub/Sub 基于消息的发布率向订阅者/消费者推送消息。在我们的场景中,我们将实现消费者从发布/订阅获取消息,因为我们可以控制吞吐量,延迟对我们来说并不重要。在拉取过程中,我们还可以控制每次从服务中拉取的消息数量,这样我们就可以控制单个订阅者/消费者中并发工作人员的数量。一旦消息被发送给订户/消费者,在处理该消息时,它将不会被再次发送给其他订户/消费者。但是,如果消息在确认窗口内没有被确认,那么发布/订阅将考虑再次调度它。因此,在任务完成后确认消息并在任务完成前更新确认窗口非常重要。

使用 Python 多重处理模块的并发消费者通用代码框架

在这一部分中,我将解释使用 Python 中的多处理模块实现的并发消费者的通用代码框架。因为我们的任务是 CPU 受限的,所以我们将使用 Python 中的多处理模块实现并发订阅者/消费者。(1)我们将首先为每个员工分配一条消息/任务。我们将等待所有的工人完成他们的任务。(3)当我们等待工作者时,我们将定期检查消息的确认窗口是否需要每隔一段时间更新。(4)一旦工作者完成其任务,我们将确认该消息。在这样的实现中,如果在消息运行期间抛出任何异常,则消息将不会被确认,这样,发布/订阅将在以后再次将它们分派给订阅者。

然后我将详细解释守护程序服务。完整的示例代码可以在我的 GitHub 中找到。为守护进程服务实现了两个文件, service.pyinternal/subscriber.pyservice.pymain 函数和任务组成,而 internal/subscriber.py 由从 Pub/Sub 提取消息并启动并发工作器的所有助手函数组成。 internal/subscriber.py 中的代码对于 Pub/Sub 的并发消费者来说是通用的,这些代码无需任何修改就可以在其他项目中重用。

我们先来看看驱动部分,也就是 service.py 中的 main 函数。在这个例子中,它配置了日志,但这与我们的主题无关。除了日志部分,它除了 start_service() 之外什么都不做。

start_service() 函数由 python decorator 包装,它是实现我们的任务的地方,例如示例中的 run_step1()run_step2() 。需要提到的一点是 start_service() 的输入参数。很容易知道“ message ”是从 Pub/Sub 接收的消息,分配给这个 worker,而“ return_vals 是一个字典,用于与 worker 的调用函数进行通信。

装饰器“ listen ”在 internal/subscriber.py 中实现。为了解释 service.py 的作用,我需要展示它的实现。

基本上,“ listen ”接收一个函数作为输入参数,并返回一个新函数 subscriber_wrapper() ,该函数包装了原始函数。因此, service.py 试图启动的服务是包装器:

首先,它通过 connect_to_queue() 连接到 GCP 发布/订阅。然后运行死循环,直到守护程序服务被终止。在循环中, process_messages() 将拉取消息并启动 workers 来完成 start_service 中实现的任务。在所有工作器完成这一轮的任务后,守护进程服务会休眠一段时间,然后反复启动下一轮,直到被杀死。

在上面的解释中,我们实际上使用了普通函数来代替装饰器。在我们的实现中引入装饰器的原因是因为“ listen 中的包装器可以重用,因此我们使用装饰器将它包含在 internal/service.py 中。

现在我们来看 connect_to_queue() ,就是连接 GCP Pub/Sub,没什么特别的。同样,我们使用 json 密钥文件作为对 GCP 的认证。

现在让我们来近距离观察一下 process_messages()

它首先从发布/订阅中提取 8 条消息。并调用 start_workers() 衍生出 8 个进程,在每个进程中运行 start_service()

start_workers() 中使用了多重处理模块。对于每条消息,都会产生一个单独的进程来运行 start_service() (作为参数“ fn ”)函数。如前所述, return_vals 是使用多重处理 管理器创建的,用于与工人通信。注意"workers[worker]=(message . ack _ id,msg_data,1,worker_num)" 记录每个 worker 的消息的 ack_id ,以便在任务完成后用于确认消息。

让我们回到 process_messages() 。创建并启动 8 个进程后,主进程将继续监控这 8 个进程,直到全部完成。在每一轮监控过程中,它都会检查每一个工蚁,看它是活着还是不活着。如果它已经死了,那么我们将检查由 return_vals 返回的任务状态。如果任务完成,没有任何异常,那么我们将需要确认消息,否则不要确认,稍后 Pub/Sub 将再次调度它。

如果工作者仍然活着,那么我们需要检查是否需要扩展确认窗口。否则,在确认窗口到期后,当工作进程仍在处理该消息时,Pub/Sub 将再次调度该消息。如果工作者已经运行了太长时间并且超过了 SLA,那么我们将终止工作者而不延长确认窗口。请注意,每次我们将确认窗口延长 ACK_DEADLINE_SECONDS 秒,这应该大于监控工人的睡眠间隔ACK _ SLEEP _ INTERVALS _ SECONDS。否则,可能会发生确认窗口没有及时更新的情况。

结论

希望现在你已经清楚地了解为什么我们需要任务队列,什么是 GCP 发布/订阅,我们可以用它做什么。此外,希望在 internal/service.py 中实现的代码可以在您自己的项目中重用。

轻松创建统计数据的 Python 包

原文:https://towardsdatascience.com/a-python-package-to-create-stats-figures-with-ease-503cf6ec0b26?source=collection_archive---------57-----------------------

Statsfig 可以用一行代码创建分布图和盒须图

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

作者创造的形象。

**Table of Contents**[**Introduction**](#52fd)1\. [Installation](#8ea6)
2\. [List of Functions](#678c)
3\. [Bernoulli distribution: bernofig()](#86cc)
4\. [Binomial Distribution: binofig()](#fac1)
5\. [Box and Whisker Plot: boxplot()](#299a)
6\. [Chi-square Distribution: chifig()](#1c71)
7\. [Exponential Distribution: expofig()](#912f)
8\. [Gamma Distribution: gammafig()](#ce92)
9\. [Normal Distribution: normcdf](#f25a)
10\. [Poisson Distribution: poisfig()](#53fe)
11\. [Uniform Distribution: uniformfig()](#b08e)
12\. [Terminal](#21fd)[**Conclusion**](#5040)

介绍

有时,您可能需要幻灯片或课程的分布图。由于您没有使用数据,您需要一个快速的解决方案。

Python 包 Statsfig 可以用一行代码创建不同的分布图。

我将向您展示创建每个图形是多么容易。

装置

使用pip:

pip install statsfig

然后导入。

import statsfig as sf

功能列表

您可以使用 11 种功能。十个分布函数和一个图。

函数名称和描述。

伯努利分布:伯诺菲格()

bernofig()函数创建了一个伯努利分布,下表显示了所有参数。

伯诺菲格参数。

默认函数的概率为 0.5,大小为 1000。

fernofig()默认函数。

下面的例子显示了概率为 0.6,不同的颜色,没有网格。

具有不同概率、颜色和网格的 bernofig()。

二项式分布:二项式()

binofig()函数创建了一个二项式分布,下表显示了所有参数。

binofig()参数。

默认函数的概率为 0.5,大小为 1000。

binofig()默认函数。

以下示例的概率为 0.7,数字为 30 次试验,向右移动 1。

具有不同参数的 binofig()示例。

[## 如何在 Docker 上运行 Jupyter 笔记本

不再有 Python 环境和包更新

towardsdatascience.com](/how-to-run-jupyter-notebook-on-docker-7c9748ed209f)

盒须图:盒图()

这是唯一一个不是分布图的。

boxplot()功能创建一个盒须图,下表显示了所有参数。

boxplot()参数。

默认函数的info参数有以下值。

{‘bplot 1’:[-9, -4, 2, 4, 9], ‘bplot 2’:[-5, -2, 1, 3, 8], ‘bplot 3’:[1, 4, 6, 8, 10]}

info必须有带name:[min, lower quartile, median, upper quartile, max]的字典形式。

boxplot()默认函数。

如果只想显示一个盒须图,可以这样做:

具有不同参数的 boxplot()示例。

改变vert=False水平显示图形。

具有不同参数的 boxplot()示例。

卡方分布:chifig()

chifig()函数创建卡方分布,下表显示了所有参数。

chifig()参数。

默认函数的自由度为[1,4,6,7]。

chifig()默认函数。

您可以通过使用 python 列表更改dof参数来更改自由度,如下所示。

具有不同参数的 chifig()示例。

指数分布:指数函数()

expofig()函数创建一个指数分布,下表显示了所有参数。

expofig()参数。

默认函数的标准差为 1,大小为 1000。

expofig()默认函数。

您可以通过将hist参数更改为False来隐藏直方图。

具有不同参数的 expofig()示例。

Gamma 分布:gammafig()

gammafig()功能创建伽马分布,下表显示了所有参数。

gammafig()参数。

默认函数的形状参数为 5,大小为 1000。

gammafig()默认函数。

你可以通过改变color参数来改变颜色。您可以使用字符{'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}中的一个,它们是蓝色、绿色、红色、青色、品红色、黄色、黑色和白色的缩写。您也可以使用十六进制 RGB 或 RGBA 字符串(如'#4287f5''#4287f580')。

具有不同参数的 gammafig()示例。

正态分布:normcdf

normcdf()函数创建正态分布,下表显示了所有参数。

normcdf()参数。

默认函数的平均值为 0,标准差为 1。

normcdf()默认函数。

如果您愿意,可以将大多数参数更改如下:

具有不同参数的 normcdf()示例。

改变下四分位数lb和上四分位数ub,可以找到两个值之间的概率。

另一个不同参数的 normcdf()示例。

norm pdf _ STD normpdf_std()函数创建具有不同标准差的正态分布。下表显示了所有参数。

normpdf_std()参数。

默认函数显示的自由度为[1,2,3,4]。

normpdf_std()默认函数。

您可以使用 Python 列表来更改不同自由度的val参数。

具有不同参数的 normpdf_std()示例。

normpdf _ mean normpdf_mean()函数用不同的平均值创建正态分布。下表显示了所有参数。

normpdf_mean()参数。

默认函数有[0,1,2,3]用于显示平均值。

normpdf_mean()默认函数。

您可以按如下方式更改标题、x 轴最小值和最大值:

具有不同参数的 normpdf_mean()示例。

泊松分布:泊松分布()

poisfig()函数创建泊松分布,下表显示了所有参数。

poisfig()参数。

默认函数的值为 4μ,大小为 1000。

poisfig()默认函数。

具有不同参数的 poisfig()示例。

均匀分布:uniformfig()

uniformfig()函数创建均匀分布,下表显示了所有参数。

uniformfig()参数。

默认函数的大小为 1000,从 10 开始,宽度为 20。

uniformfig()默认函数。

在这里,我们正在改变颜色,网格,以及图形的宽度和长度。

具有不同参数的 uniformfig()示例。

末端的

您也可以从您的终端创建一个图形。

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

从终端创建图形。

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

结论

我希望你发现用 Statsfig 软件包创建图形要容易得多。我很想听听关于这个包的任何意见。欢迎在下面留言,或者通过推特联系我。

请继续关注下一篇文章。

通过 成为 会员,获得媒体上所有故事的访问权限。

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

https://blog.codewithshin.com/subscribe

对 DICOM 文件进行排序的 Python 脚本

原文:https://towardsdatascience.com/a-python-script-to-sort-dicom-files-f1623a7f40b8?source=collection_archive---------12-----------------------

这个脚本将帮助您理解和组织您的医学图像数据集

这篇文章是我之前介绍 DICOM 文件的后续文章。特别感谢我的好朋友吉安·马可·康特博士帮助我写这篇文章。

简单回顾一下,DICOM 文件是存储医学图像的主要格式。所有临床算法必须能够读写 DICOM。但是这些文件很难组织。DICOM 文件在文件头中保存了与图像相关的信息,文件头可能很大。文件分为 4 层:

  1. 病人
  2. 研究
  3. 系列
  4. 情况

在本教程中,我将分享一些 python 代码,这些代码读取一组 DICOM 文件,提取标题信息,并将文件复制到分层的文件夹结构中,以便轻松加载数据科学任务。

有许多很好的资源可以用来使用 Python 或其他语言解析 DICOM。 DicomSort 有一个灵活的 GUI,可以根据文件头中的任何字段来组织文件(DicomSort 也可以作为一个带有“pip install dicomsort”的 Python 包获得)。我还想感谢这个报告让我开始阅读 DICOM 像素数据集的代码。最后,这篇伟大的论文中有一节是关于图像压缩的,我在这里简单地提一下。

最终,我决定编写自己的实用程序,因为我喜欢确切地知道我的代码在做什么,它还提供了对 DICOM 头的介绍,这是任何从事医学成像项目的数据科学家的基本知识。

我已经为 CT 和 MRI 检查验证了这个代码;它应该适用于任何设备——所有 DICOM 文件都会报告患者、研究和系列信息。

所需的代码包

这段代码使用 Python 包 PyDicom 来读写 Dicom 文件。

我想简单提一下 GDCM 包。DICOM 文件可能在存储期间或通过 DICOM 接收器传输期间进行图像压缩。例如,在我们的机构,所有的 DICOMs 都有 JPEG2000 压缩。GDCM 是一个基于 C 的包,允许 PyDicom 读取这些加密文件。它以 conda 包(“conda install gdcm”)的形式提供,或者使用 cmake 从源代码构建。我在下面的代码中偷偷添加了几行代码,使用 GDCM 来解压缩像素数据,这样我以后就不用担心了。

更新——自从写了这篇文章,我开始使用比 GDCM 更容易安装的pylibjpeg包。我在文章末尾补充了更多的信息。

代码演练

完整的、不间断的代码版本在本文末尾。

首先,我们指定哪个目录包含我们的 DICOM 文件(“src”),以及它们将被复制到哪里(“dst”)。请注意,该文件是复制的,而不是移动的,因此我们最终将存储每个文件的 2 个副本。我们将不分先后地阅读 DICOM 文件——每个文件在文件头中都包含足够的信息,可以准确地识别它来自哪里。

对于列表中的每个文件,我们将使用 PyDicom 包将文件头作为字典加载。

我们将在患者研究系列级别对 DICOM 文件进行分类(有关这些术语含义的更多信息,我鼓励您通读我的之前的介绍)。我还添加了一个额外的级别,即研究日期,如果您希望对同一患者进行多项研究,这将是非常有用的信息。

有两个字段分别与患者研究系列相关联:一个唯一标识符(UID) 和一个文本描述。您将看到的大多数 DICOM 数据集都是使用 uid 排序的。尽管 uid 总是唯一的,但是它们会导致很长的文件夹树,不容易理解。我已选择将每个文件保存在文本描述下,同时保留患者 ID 以提供一层匿名性(尽管患者姓名仍将出现在标题中)。

在几个数据集上使用这段代码,我还没有遇到过病历报告系列信息丢失的情况,但是在极小的可能性下,我们会用“NA”替换它。

最后,我将包含一个小函数,用于清理“禁止”字符的文本描述,删除空格,并将文本转换为小写,这使得目录名更加清晰。

文件名将由设备 (CT、MRI 等)连接而成。)、系列 UID实例号。我将包含研究 UID ,但是这会产生一个很长的文件名。

最后,我将删除任何 JPEG2000 或任何其他文件压缩。这是使用 GDCM 包完成的,它是一个可选的包,可以安装在 PyDicom 的下面。这不是 100%万无一失的(像 DICOM 的大部分内容一样),因此我的新手尝试/例外语句:

脚本的其余部分创建了我们的分层文件夹树。同样,我增加了一个额外的按研究日期排序的级别。否则,可能很难区分我们单独的病历报告,并且如果两份病历报告有相同的描述,所有系列将被集中在一个文件夹中。

使用数据集上的代码

为了测试这段代码,让我们在数据集上运行它。我选择了 2019 年 RSNA·卡格尔比赛,该比赛以诊断颅内出血的头部 CT 为特色。

现在,所有的文件都保存在一个目录中,这也是数据最初可用的方式。让我们看看这个脚本是否能帮助我们组织它:

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

图一。该代码按照患者、日期、研究描述和系列描述(右)将我们的非结构化 DICOM 文件列表(左)解析为嵌套的文件夹结构。文件也根据设备、系列 UID 和实例号进行重命名。图片作者。

虽然文件列表很长,我们只能看到最上面的文件夹,但是请注意,文件已经按照患者 ID (已被取消识别)扫描日期、以及系列研究描述进行了分类,这些描述告诉我们一些关于我们正在查看的图像的信息。此外,这些文件已被重命名为模态系列 UID实例号,以便于按行排序。

完整代码

更新—用于文件压缩的新软件包

自从写了这篇文章,我遇到了比我上面提到的 GDCM 包更容易安装和配置的 pylibjpeg 包。

Pylibjpeg 有几个依赖项,下面是我从我的 requirements.txt 中复制的列表

pylibjpeg
pylibjpeg-openjpeg
pylibjpeg-libjpeg
pydicom

如何建立量化交易市场数据仓库

原文:https://towardsdatascience.com/a-quantitative-trading-market-data-infrastructure-4ca7578e0291?source=collection_archive---------15-----------------------

如何组织从 Polygon.io 获得的数据的回顾和示例

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

图片由 Pixabay 的 Pexels 提供

为什么交易基础设施战略是相关的

定量金融需要大量的数据工程。一旦您开始处理小于每日数据的时段,这一点尤其正确。通过数据工程,我定义了用于检索、存储、解析、确保质量和向最终客户分发数据的方法、技术、软件、程序和基础设施。

虽然这个领域的光芒不及获得成功交易策略的算法,但它是一个重要的部分,必须正确处理。这种基础设施的设置是专业操作的一部分,也是业余人员和专业人员在该领域的不同之处之一。定义正确的基础设施是业务运营的一部分,在利用量化交易赚钱的中长期旅程中扮演着重要角色。

不同的方法

有不同的方法来满足这种数据工程的需要。所有方法都同样有效,但它们之间存在明显的权衡,了解您的资源和环境以选择正确的方法非常重要。我将描述我所看到的,这些信息来自我的实验,从行业人士那里收集的信息,由富有的量化交易者提供的信息,以及我从成熟的交易公司收集的信息(主要是自营交易和商品,不幸的是,我不知道这个行业有多少参与者)。

供应商环境方法

不需要高速或精细时间粒度来移动大量交易资本的大公司可以选择专有环境(如微软生态系统)来移动和存储数据。通过这样做,你可以指望友好的编程环境,无论何时需要定制任何东西(C#和 Python),通过 Azure 和微软 ETL 工具集成云存储,以建立一个易于维护的数据管道——微软这么说的——。这种方法的优点是对所有事情都使用相同的技术,并且您可以期望不同组件之间的平滑集成。使用商业解决方案还提供了供应商支持,这总是好的。作为一个权衡:它是昂贵的,您依赖于一个供应商,它涉及经常性成本,并且某些活动不能正确地完成,因为您正在使用通用工具。我在一家信誉卓著的商品交易公司看到过这种方法。如果你需要处理高速的或者非常定制的或者 ML 密集型的策略,这可能不是最好的环境。

全 Python 方法

业界广泛使用的另一种方法是构建纯 Python 解决方案。对于那些在过去读过其他文章的人来说,你可能已经知道我个人对 Python 的感觉是复杂的。Python 的一个优点是非常容易编码,并且可以使用许多 ML 库,Jupyter 笔记本可以简化结构的维护,并且它促进了程序的自文档化。这不是最佳解决方案,但在混合环境中,我真的认为它可以在运营方面提供真正的好处。我一直在想,Python 无论从性能还是速度上来说都不是一个好的选择,但是编码高级别的可维护软件层却是极好的。更短的开发时间和更容易的团队协作的好处胜过性能障碍。有经验的 Python 开发人员也可以采用其他方法来提高 Python 的速度,尽管您正在将 Python 推向超越其本质的极限。我看到这种方法在一家规模较小、声誉卓著的对冲基金公司得到了非常成功的应用。

C++/Java 方法

另一种方法是使用 C++或 Java 作为环境,开发一个定制的框架来处理数据。这是公司在一天内或高频率操作大量数据时使用的方法。对于分笔成交点数据,您可能至少在基础设施的某些领域需要这种方法。关于要使用的具体语言,C++是旗舰机构公司的首选,但 Java 可以以更低的运营成本使用,我已经看到非常成功的小公司用 Java 交付所有东西。事实上,你可以拥有与 C++几乎相同的性能,但是比 C++更容易管理语言和开发/调试环境。我最近在用 Java 做很多东西,因为我不是一个特别好的程序员。交易软件的某些方面用 C/C++语言来表示要好得多(具体来说,我发现用 C 为 OHLC 和分笔成交点数据定义数据结构比用 Java 更自然)。在交易中使用 Java 总是涉及到以一种对 Java 程序员来说不太自然的方式编码,因为你需要总是从低级编程和性能的角度来考虑,因此 C 语言背景是有益的。

存储替代方案

数据本身可以(并且通常存储在)数据库中,但这可能是一个错误。SQL 和非 SQL 方法都可以使用。我不再将 SQL 用于市场数据——我最开始使用它——但这是因为我现在的重点是用很少的工具进行日内策略,所以我必须处理大量非常同质的数据。关系数据库在这方面没有任何价值。另一种方法是使用 CSV 文件(是的,它们被广泛使用,这是有原因的)或其他纯文本方法(比如我使用的方法,我将在后面描述)。这种方法的优点是可以轻松地使用、检查和访问数据,并且有效地消除了另一个维护点和难点:数据库。

这些描述的方法的共同点是它们通常依赖于给定的语言或技术,而不是系统工程方法。这并不意味着不涉及某些系统工程,但往往不是主要的方法。

另一种方法可以被成功使用,特别是对于个体交易者、资源有限的小型对冲基金或小型自营交易公司(或初创公司)。声明:这种方法会伤害感情,因为它提倡重复使用 40 年的老技术。

UNIX:基于文件的协作小工具方法

在追求简单性的过程中,我尽可能地去除了许多层和软件,同时也减少了需要交付的定制代码的数量。任何有助于实现这一目标的因素都有助于降低运营费用,减少需要完成的总工作量和维护量。在思考这个问题时,我发现,基于 UNIX 系统工程而不是基于 DevOps 或基于编程语言的基础设施,重用文件和小型协作工具的经典 UNIX 方法可能非常有利于设置操作。

我总是使用 UNIX 这个词,因为我使用 FreeBSD,但它同样适用于 Linux。

有一本 1985 年由 Kernighan & Pike 写的名为《UNIX 编程环境》的书。它是一本非常古老的书,C 代码甚至是 K & R pre-ANSI 风格,但在 C 编程社区中仍然广为人知;这可能是你能阅读的理解什么是真正的 UNIX 的最好的一本书:一个编程环境,可以轻松地重用小程序和工具,不费吹灰之力地构建解决方案。

诸如广泛的文件使用(“一切都是文件” UNIX 方法)这样的概念已经在很大程度上被抛弃,以包含更复杂的结构和解决方案。但是你总是可以停下来花一分钟思考一下:你真的需要一个数据库吗?或者你只是假设你需要一个数据库,因为每个人都这么告诉你?你真的需要一个基于 API 的云存储吗?或者你可以使用一个普通的文件系统——它可以完美地备份或存储在云上,这没什么不对的。您真的需要使用最新的流行框架在 Python 中编写 API 访问代码吗?或者在您的数据文件系统上安装一个 HTTP 服务或远程文件服务器就足够了吗?第一个选项甚至允许构建一个 REST 访问系统,而无需编写任何代码。

这些问题通常不受有偏见的专业人士的欢迎,尤其是那些专攻某项技术或语言的专业人士,因为它用简单的工具和零维护的方法来挑战当前普遍膨胀的实践。

零维护对于像我这样已经达到一定年龄(经验)的人来说非常重要,因为我们在过去已经犯过建造复杂东西的错误。对于缺乏资源和团队的小型企业,部署简单的解决方案是必要的。

我将在以下部分描述如何建立一个 1 秒钟的外汇数据基础设施服务。这是我的最新基础设施设置的一部分,用于回测和分析外汇中的量化策略,我将说明依靠 UNIX 系统中的小型合作工具的混合环境如何能够加快操作。

业务需求:定量分析

在我上次的定量分析中,我想使用外汇数据,使用 1 分钟的汇总数据。一分钟汇总数据意味着我想探索价格信息如何取代交易量信息(交易量信息在外汇交易中并不总是可用)。这来自于合并市场概况(其中时间和价格等于利息或价值)和成交量概况(其中成交量等于利息或价值)的市场概念。因此,时间和价格可以取代成交量,因此可以用来成功驾驭市场(这是我的前提,也是我想要分析的,它可能是错的,也可能是对的,但听起来是合理的)。

要获得 1 分钟的市场概况,我们需要一定的粒度,最好是分笔成交点数据,但让我们假设 1 秒钟的价格信息就足够了(同样,这是我们的前提、假设或公理,可能是对的,也可能是错的)。

这是我的业务需求:分析 1 分钟蜡烛线以上的市场概况信息是否可以用来控制市场。这种业务需求转化为技术或基础设施需求:我需要能够在我的分析中轻松消耗外汇市场 1 分钟蜡烛线的市场概况。

因此,我需要存储每 1 分钟分组一次的数据,并可能在以后处理这些数据并生成包含聚合信息的附加文件。

任何技术需求的背后,总要有一个业务需求。在任何技术解决方案的背后,都必须有完整的成本/资源分析,包括项目和运营费用。这些基本检查并不总是专门为只具有技术背景的人进行的,他们可能对中长期运营成本没有自然的了解。

从 Polygon.io 收集市场数据

无论是历史数据还是实时数据,您总是需要一个数据提供者。如果您要使用数据,将数据存储在本地(或您的私有云)作为缓存是有意义的,但专用数据公司将比您更好地确保连续性和可靠性,最终,您需要访问市场数据,并且您可以不支付(或者即使您可以支付也没有意义)交易所市场访问费和相关的项目成本。

让我们检索欧元兑美元的 1 秒钟数据,让我们看看用于此的 Polygon.oi API:

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

polygon.io API 从 Forex 检索 1 秒钟的买卖价格信息

有几种方法可以检索和存储这些数据,通常想到的第一种方法是使用编程语言和数据库。所以 Python 和 SQL 可能是一个选项。由于 Polygon.io 返回的记录数量被限制为 10.000,您将需要执行几次调用来填充偏移量参数,直到您检索到所有信息,因此某些编程是明确需要的。信息也以 JSON 的形式被检索,但是我们肯定不想存储或处理 JSON,因为它非常低效。

以下是我对这项任务的建议:

技巧 1:定义如何存储数据

这里我不会使用任何数据库。相反,我将把所有的出价/要价信息作为空格分隔的值存储在一个文件中。由于我们显然需要某种随机访问,我们将在每个自然日将这些数据分离到一个文件中。20 年来,这造成了最多 7300 个文件,这无疑是任何现代操作系统所能处理的极限数字。

技巧 2:简化时区

时区很重要,它们通常是一个挑战和难点。我发现最好的选择是简化它们:我总是使用东部时间。我这样做是因为大多数数据供应商在这个时区提供数据(即使是欧洲的工具/资产)。我这样做是因为就交易而言,纽约的现金交易时段可能是一天中最重要的时段(或者至少是相关的时段)。我这样做是因为知道你所有的数据,不管是什么,都是以东部时间存储的,这非常简单。

提示 3:不要担心会议开始的时间

我应该根据纽约的现金交易时段来分组我的数据吗?也许是的。但是根据我存储数据的经验,使用东部时区的自然日要好得多。如果你想分析一个特定的时间(例如 9:30 以后),你可以在你的分析中这样做。但数据应在自然天数内保存。为什么?我这样做只是因为根据我的经验这是最容易做到的事情。你可能会提出异议,如“亚洲时段可以包括前一个自然日的结束和当前自然日的开始”或“我想处理常规和延长的交易时间,延长的时间跨越两个自然日”,等等。所有的反对意见都是有效的,但是,我发现的最简单的答案,即使在处理这些问题时,也总是一样的:按照东部时间的自然天数来存储你的数据。

技巧 4:在目录中排列文件

UNIX 世界的一个伟大成就是目录结构。用吧,免费,零维护。因此,将你的文件按年、年、月或年、月、日分类。在我的例子中,我选择了后者,因为我打算进一步部署更多包含聚合信息的文件。

因此,如果您想要 2019 年 4 月 3 日的欧元美元数据,您已经知道它位于*/data/EURUSD/2019/04/03/EURUSD . 2019 . 04 . 03 . tape .*中,如果您想要读取它,您只需在该文件上执行 cat 即可显示其内容:

memmanuel@almaz:~ % head /data/EURUSD/2019/06/27/EURUSD.2019.06.27.tape 
1.13735 1.13745 1561593600000
1.13717 1.13761 1561593600256
1.13719 1.13761 1561593600560
1.13718 1.13760 1561593600791
1.13719 1.13761 1561593602595
1.13719 1.13761 1561593602995
1.13740 1.13770 1561593603000
1.13718 1.13760 1561593603222
1.13719 1.13761 1561593603521
1.13735 1.13743 1561593605000

看到了吗?它简单得令人尴尬,而且方便。

技巧 5:将数据存储为固定大小的字段

不要在 CSV 中存储数据,使用固定大小的字段。这种差别很细微,但对以后的性能有很大的好处。在前一种情况下,字段是可变长度的(1.1373 和 1.13732),在第二种情况下,您为每个字段定义精确的长度,并在需要时填充零(1.13730 和 1.13732)。在上面的例子中,我们知道 EURUSD 有 5 个小数位和 1 个自然位,所以每个价格正好有 7 个字符。这简化了 C 和 Java 中低级例程的使用,这将使您的回溯测试数据检索更快。不要使用逗号,因为在 UNIX 中,列通常由空格分隔,并且当列由空格分隔时,手动检查文件更容易,通过这样做,您可以始终使用 CSV 技术,但也可以通过读取固定宽度的字段来获得性能。

技巧 6:编写一个简单的工具来检索一个自然日

编写一个简单的、自包含的命令行工具来检索给定日期的所有数据并存储它。因为您已经定义了每天的数据去向,所以您可以很容易地做到这一点。令人惊讶的是,你甚至不需要编写任何程序来检索数据,有人,比你我都聪明,已经编写了一个名为 curl 的工具,它将为你检索数据。您仍然需要一个小脚本来迭代请求,因为每天可能会有超过 10000 条记录。你可以用 Python 或者 shell 脚本来实现,如下例所示。注意重用现有工具是如何简化编程的:

  1. 我们用 curl curl消费 REST 服务。
  2. 我们使用jq将 JSON 转换成文本文件。
  3. 我们使用awk.将数字转换成固定宽度

从 Polygon.io 下载每日外汇数据的示例命令行工具。用 Bash 编写,可以用 Python 或 Perl 编写。它使用 curl、jq 和 awk 来简化某些任务。

这就是 UNIX 的设计用途:只做一件事的小工具。

技巧 7:构建重用基本命令的助手命令。

每天检索数据真的很耗时。所以你可以写一个命令来检索一整年的数据。在这种情况下,用 Python 解析日期更容易,所以用 Python 编写命令。它只是在循环中调用前一个。

这个工具最好用 Python 编写,因为处理日期更容易。它遵循构建小工具的 UNIX 方法,只解决一个具体的需求。

摘要

在这篇文章中,我简要回顾了通常是如何根据存储财务数据进行回溯测试的,我还介绍了一种非常简单的检索和存储数据的方法。下一步是对数据进行预处理,以获得您想要的分析(在我的例子中,我希望及时分析出价/要价和价格分布,因此我将相应地生成更多的文件)。这篇特定文章的要点是,通过执行这些简单的步骤,我们已经有效地将数据的检索和存储从我们的策略分析中分离出来(只用了两个简单的工具)。不仅如此,我们还定义了一种存储数据的方法,这种方法非常容易交流、理解和记忆,并且无需维护。解耦在任何软件项目中都非常重要,因为这是制造可重用组件和避免未来问题的最佳策略。

使用普通文件存储数据不会让所有人都满意。“文件太多”、“文件描述符太多”、“速度慢”(未经测试)、“有更好的选项”、“缺乏功能”、“不够酷”。但是最后,你会发现很难找到一个人提出不使用文件的真正好处(在某些情况下可能存在)。

不要被复杂的亚马逊 AWS 或任何最新的云存储 API 所困扰。大多数情况下,您不需要这种复杂性。

这些文件很紧凑,很容易按自然日寻址。您可以很容易地定位任何特定的时间,因为每个文件都有固定宽度的记录,大约 80k 字节,这很容易解析,如果您真的需要跳转到特定的位置,也很容易实现搜索算法(不过我认为将整个文件读入内存更容易)。

在下一个聚合阶段,使用您的分析所需的特定聚合数据创建新文件,这强化了这一点。普通列固定宽度文件可以在每种语言或工具(Octave、R、Python、C、Java、sed、awk 等)中使用,如果考虑到每条记录(行)的长度总是相同的话,它甚至会非常有效。

在自营交易运行分析和对历史数据进行回溯测试的情况下尤其如此。主要关心的可能是访问时间,但是回溯测试和分析通常涉及对顺序数据的大量计算*,因此磁盘访问时间通常可以忽略不计。如果没有,数据总是可以放在缓存的 RAM 文件系统中,这解决了问题*,而无需编写一行代码*。*

如果需要远程访问数据,可以使用简单的 NFS,或者部署 HTTP 服务器来分发文件。只需几行配置,您将拥有一个 REST 服务,而无需编写一行简单的代码。从中可以看出,UNIX 有许多旨在简化和重用的工具和服务,不管这项技术看起来有多古老:编程并不总是解决问题的答案。

补充说明:如果您正在处理聚集的基本 OHLC 数据,那么根本不存储数据并向数据提供者请求按需数据可能是一种选择。但通常情况下,你总是想用数据、自定义计算或聚合来做事情。或者你正在迭代大量的数据,所以通常情况下,我发现你总是需要下载数据并在本地访问它。

随机森林回归快速肮脏指南

原文:https://towardsdatascience.com/a-quick-and-dirty-guide-to-random-forest-regression-52ca0af157f8?source=collection_archive---------15-----------------------

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

图片由来自 Pixabay斯蒂芬·凯勒拍摄

随机森林回归的实践方法

作为机器学习实践者,我们会遇到各种各样的机器学习算法,我们可以应用它们来构建我们的模型。在这篇文章中,我将尝试给你一个关于随机森林模型如何从头开始工作的概念的直觉。该算法可用于计算回归和分类问题。

首先,我们将熟悉一些重要的术语,如集成学习和引导聚合,然后我将尝试给你一个算法的直觉,最后,我们将使用随机森林回归器建立我们自己的机器学习模型。

在开始这篇文章之前,我建议你看一下我以前关于决策树的文章这里,这对于任何期待学习这个算法的人来说都是至关重要的先决条件。

集成学习:

假设你想看一部关于网飞的网络连续剧。你会登录你的账户,观看弹出的第一个网站,还是浏览几个网页,比较评分,然后做出决定。是的。很有可能你会选择第二个选项,而不是直接下结论,你也会考虑其他选项。

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

图片来自维基共享资源

这正是集成学习的工作方式。集成学习是一种将来自多个机器学习算法的预测结合起来的技术,可以比任何单独的模型都更准确地预测。简而言之,集合模型是由许多模型组成的模型。有许多综合技术,如堆垛、装袋、混合等。让我们详细看看其中的几个。

增压

顾名思义,Boosting 是一种通过将单个弱学习者分组以形成单个强学习者来促进学习的技术。这是一个连续的过程,每个后续模型都试图纠正前一个模型的错误。后续模型依赖于前一个模型。

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

图片来自奥莱利媒体

自举聚合

Bootstrapping 是一种采样技术,其中我们从原始数据集创建观察值的子集。这种技术也被称为装袋。所用子集的大小与原始集的大小相同。在这种技术中,通过组合各种预测模型的结果来获得一般化的结果。为打包创建的子集的大小可能小于原始集。

决策树的问题

尽管决策树是一种有效的回归模型,但仍有一些差异会阻碍决策树的顺利实现。其中一些如下所述:

  1. 数据的微小变化可能会导致一组完全不同的数据,从而导致模型给出不正确的预测。
  2. 决策树对它们被训练的数据非常敏感,对训练集的微小改变会导致明显不同的树结构**。**
  3. 决策树倾向于寻找局部最优解,而不是考虑全局最优解。

为了解决这些问题,兰登森林公司来了。

随机森林

随机森林是一种监督学习算法,它使用集成方法(bagging)来解决回归和分类问题。该算法通过在训练时构建大量决策树并输出各个树的预测均值/模式来运行。

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

图片来自 Sefik

随机森林背后的基本概念是群体的智慧,其中大量不相关的模型作为一个委员会运作,将胜过任何单个的组成模型。

这背后的原因是,这些树相互保护,避免各自的错误。在一个随机森林中,个体树之间没有相互作用。随机森林充当一种估计算法,它聚合许多决策树的结果,然后输出最佳结果。

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

图片来自简单统计

现在我们有了什么是随机森林的要点,我们将尝试构建我们自己的随机森林回归器。构建这个回归模型的代码和其他资源可以在这里找到。

第一步:导入所需的库

我们的第一步是导入构建模型所需的库。没有必要在一个地方导入所有的库。Python 给了我们在任何地方导入库的灵活性。首先,我们将导入 Pandas、Numpy、Matplotlib 和 Seaborn 库。

#Import the Libraries and read the data into a Pandas DataFrameimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snstest = pd.read_csv("california_housing_test.csv")
train = pd.read_csv("california_housing_train.csv")

一旦导入了这些库,我们的下一步将是获取数据集并将数据加载到我们的笔记本中。对于这个例子,我采用了加州住房数据集。

第二步:可视化数据

成功加载数据后,我们的下一步是可视化这些数据。Seaborn 是一个优秀的库,可以用来可视化数据。

#Visualise the dataplt.figure()
sns.heatmap(data.corr(), cmap='coolwarm')
plt.show()sns.lmplot(x='median_income', y='median_house_value', data=train)
sns.lmplot(x='housing_median_age', y='median_house_value', data=train)

第三步:特征工程

特征工程是利用领域知识通过数据挖掘技术从原始数据中提取特征的过程。对于这个模型,我选择了只有数值的列。为了处理分类值,应用了标签编码技术。

#Select appropriate featuresdata = data[[‘total_rooms’, ‘total_bedrooms’, ‘housing_median_age’, ‘median_income’, ‘population’, ‘households’]]
data.info()data['total_rooms'] = data['total_rooms'].fillna(data['total_rooms'].mean())
data['total_bedrooms'] = data['total_bedrooms'].fillna(data['total_bedrooms'].mean()

当特征数量非常大时,特征工程变得更加重要。特征工程最重要的用途之一是减少过度拟合,提高模型的准确性。

步骤 4:拟合模型

选择所需参数后,下一步是从 sklearn 库中导入 train_test_split,该库用于将数据集拆分为训练和测试数据。

#Split the dataset into training and testing dataimport train_test_split
X_train, X_test, y_train, y_test = train_test_split(train, y, test_size = 0.2, random_state = 0)y_train = y_train.reshape(-1,1)
y_test = y_test.reshape(-1,1)

在此之后sklearn.ensemble 中导入 RandomForestRegressor ,并且模型适合训练数据集。参数 n_estimators 决定了森林中树木的数量。默认情况下,该值设置为 100。

from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(n_estimators = 500, random_state = 0)
rfr.fit(X_train, y_train))

如果 bootstrap 设置为 true,则子样本大小由 max_samples 参数控制,否则将使用整个数据集来构建每棵树。

随机森林的优势

  1. 它可以在大型数据集上高效运行。
  2. 随机森林比其他算法有更高的准确率。
  3. 它有一个有效的方法来估计缺失数据,并在大部分数据缺失时保持准确性。

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

图片来自维基百科

随机森林的缺点

  1. 随机森林可能会导致某些数据集过度适应有噪声的回归任务。
  2. 对于分类变量具有不同层数的数据,发现随机森林偏向于那些具有更多层数的属性。

至此,我们已经到了这篇文章的结尾。我希望这篇文章能帮助你理解随机森林回归的本质。如果你有任何问题,或者如果你认为我有任何错误,请联系我!您可以通过邮箱LinkedIn 与我联系。

建立和测试股票交易策略的快速简单的方法

原文:https://towardsdatascience.com/a-quick-and-easy-way-to-build-and-test-stock-trading-strategies-bce2b58e6ffe?source=collection_archive---------15-----------------------

回溯测试、数据、度量、实时实现和缺陷

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

照片由像素皮克斯拜拍摄

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

算法交易策略开发

回溯测试是量化交易的标志。回溯测试采用历史或综合市场数据,测试算法交易策略的盈利能力。这个主题需要统计学、计算机科学、数学、金融和经济学方面的专业知识。这就是为什么在大型量化交易公司里,对相关学科有丰富知识(通常是博士水平)的人会有特定的角色。专业知识的必要性不可低估,因为它将成功(或看似成功)的交易策略与失败的交易策略区分开来。我这篇文章的目标是将我认为的基本回溯测试过程分成几个不同的部分…

  • **一、**回溯测试引擎
  • **二。**历史和综合数据管理
  • **三。**回溯测试指标
  • **四。**现场实施
  • **五、**战略发展中的陷阱

回溯测试引擎

主回溯测试引擎将使用名为 backtrader 的库在 Python 中构建。Backtrader 使得建立交易策略并根据历史数据立即实施变得非常容易。整个图书馆以脑波强化器课程为中心。顾名思义,您可以将此视为回溯测试的大脑或引擎。

我决定构建一个函数,这样我就可以动态地参数化回溯测试的不同方面(并最终构建一个管道)。我们需要讨论的下一门反向交易课程是策略课程。如果您查看我为存放 Cerebro 实例而构建的函数,您会看到它将一个策略作为输入——这需要一个 backtrader 策略类或子类。Strategy 类的子类正是我们将用来构建自己的策略的。如果你需要一个多态和继承的复习者或者不知道那是什么意思,请看我的文章 3 分钟内的 3 个 Python 概念。让我们为我们的回溯测试建立一个策略…

在主策略中,我在上面的策略子类中创建了我们在做交易决定之前有兴趣了解的字段。假设每日数据频率,我们在后推过程中每一步可以访问的字段是…

  • 开盘当日价格
  • 当日收盘价格
  • 日低价格
  • 日价格高
  • 日交易量

不需要天才就能明白,你不能用最高价、最低价和收盘价来做最初或当天的交易决定,因为我们无法实时获得这些信息。但是,如果您想存储它并访问以前的信息,这是很有用的。

你现在脑子里的大问题应该是数据从哪里来

这个问题的答案在反向交易库的结构中。在运行容纳 Cerebro 的函数之前,我们将添加我们想要进行回溯测试的所有策略和一个数据馈送——其余的都由 Strategy 超类处理,因为 Strategy 超类保存了容纳所有市场数据的数据系列。

这让我们的生活变得异常轻松。

让我们通过制定一个简单的只做多均值回归风格的交易策略来结束主策略课。为了访问一个数据点,我们覆盖了下一个函数并添加了交易逻辑…

每天都会得到一个根据我们将买入或卖出股票的数量计算出来的 z 值(与平均值的标准偏差数)。请注意,是的,我使用当天的收盘价来做决定,但我也使用当天的收盘价作为我交易的进场价格——使用第二天的开盘价更明智。

下一步是将策略添加到我们容纳大脑实例的功能中…

在上面的代码中,我将提供给函数的策略添加到了 Cerebro 实例中。这超出了本文的范围,但是我觉得有必要把它包括进来。如果我们进行回溯测试的策略需要额外的数据(一些 AI 模型),我们可以在 args 参数中提供它,并将其添加到策略子类中。

接下来,我们需要找到历史数据或合成数据的来源。

历史和综合数据管理

我将历史和合成市场数据作为同义词使用,因为一些研究人员发现合成数据无法与其他市场数据区分开来(因此其生成性更丰富)。出于这个例子的目的,我们将使用 backtrader 提供的 YahooFinance 数据提要,同样使实现变得非常容易…

向我们的回溯测试中添加一个数据馈送是如此容易,这几乎是荒谬的。数据对象使用 backtraders YahooFinanceData 类根据符号、fromdate 和 todate 检索数据。之后,我们只需将这些数据添加到脑波机实例中。backtrader 架构的真正魅力在于实现了数据自动放置在其中,并通过添加到 Cerebro 实例的每个策略进行迭代。

回溯测试指标

有很多指标可以用来评估交易策略的表现,我们将在这一部分介绍一些。同样,backtrader 使得添加分析器或性能指标变得极其容易。首先,让我们为我们的 Cerebro 实例设置一个初始现金值…

我们可以使用多种指标来评估风险、回报和绩效,让我们来看看其中的一些…

夏普比率

正如《show Billions》中提到的,每单位风险的回报率,夏普比率。定义如下…

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

几次失败和假设。它基于历史表现,假设正态分布,经常被用来错误地比较投资组合。然而,它仍然是任何策略或投资组合的主要部分。

系统质量号

这是一个我一直喜欢使用的有趣指标,因为它包括了特定时期的交易量。计算方法是将 SQN 乘以交易次数,然后将乘积除以 100。下面是不同细分市场、地区和行业的价值图表。

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

图片来自万瑟普

现在,让我们将这些指标添加到脑波强化器中,并运行回溯测试…

现在,我们所要做的就是运行上面的代码,我们会根据我们指定的指标获得我们策略的性能…

这是输出…

Starting Portfolio Value: 100000.002018-01-30, 160.95
2018-01-30, BUY CREATE, 160.952018-01-31, 161.4
2018-02-01, 161.74
2018-02-02, 154.72
2018-02-02, BUY CREATE, 154.72
2018-02-05, 150.85
2018-02-05, BUY CREATE, 150.85
2018-02-06, 157.16
2018-02-07, 153.792018-02-08, 149.56
2018-02-09, 151.39
2018-02-12, 157.49
2018-02-13, 159.07
2018-02-14, 162.0
2018-02-15, 167.44
2018-02-16, 166.9
2018-02-20, 166.332018-02-21, 165.58
2018-02-22, 166.96
2018-02-23, 169.87
2018-02-26, 173.23
2018-02-27, 172.66
2018-02-28, 172.42018-03-01, 169.38
2018-03-02, 170.55
2018-03-05, 171.15
2018-03-06, 171.0
2018-03-07, 169.41
2018-03-08, 171.26
2018-03-09, 174.2
2018-03-12, 175.89
2018-03-13, 174.19
2018-03-14, 172.71
2018-03-15, 172.92
2018-03-16, 172.31
2018-03-19, 169.67
2018-03-20, 169.62
2018-03-21, 165.77
2018-03-21, BUY CREATE, 165.77
2018-03-22, 163.43
2018-03-22, BUY CREATE, 163.43
2018-03-23, 159.65
2018-03-23, BUY CREATE, 159.652018-03-26, 167.22
2018-03-27, 162.94
2018-03-28, 161.14
2018-03-29, 162.4
2018-04-02, 161.33
2018-04-03, 162.99
2018-04-04, 166.1
2018-04-05, 167.252018-04-06, 162.98
2018-04-09, 164.59
2018-04-10, 167.69
2018-04-11, 166.91
2018-04-12, 168.55
2018-04-13, 169.12
2018-04-16, 170.18
2018-04-17, 172.522018-04-18, 172.13
2018-04-19, 167.25
2018-04-20, 160.4
2018-04-23, 159.94
2018-04-24, 157.71
2018-04-25, 158.4
2018-04-26, 158.952018-04-27, 157.11
2018-04-30, 159.96
2018-05-01, 163.67
2018-05-02, 170.9
2018-05-03, 171.212018-05-04, 177.93
2018-05-07, 179.22
2018-05-08, 180.08
2018-05-09, 181.352018-05-10, 183.94
2018-05-11, 183.24
2018-05-14, 182.81
2018-05-15, 181.15
2018-05-16, 182.842018-05-17, 181.69
2018-05-18, 181.03
2018-05-21, 182.31
2018-05-22, 181.85
2018-05-23, 183.02
2018-05-24, 182.812018-05-25, 183.23
2018-05-29, 182.57
2018-05-30, 182.18
2018-05-31, 181.57
2018-06-01, 184.84
2018-06-04, 186.392018-06-05, 187.83
2018-06-06, 188.482018-06-07, 187.97
2018-06-08, 186.26
2018-06-11, 185.812018-06-12, 186.83
2018-06-13, 185.29
2018-06-14, 185.39
2018-06-15, 183.48
2018-06-18, 183.392018-06-19, 180.42
2018-06-20, 181.21
2018-06-21, 180.2
2018-06-22, 179.68
2018-06-25, 177.0
2018-06-25, BUY CREATE, 177.002018-06-26, 179.2
2018-06-27, 178.94
2018-06-28, 180.24
2018-06-29, 179.862018-07-02, 181.87
2018-07-03, 178.7
2018-07-05, 180.14
2018-07-06, 182.64
2018-07-09, 185.172018-07-10, 184.95
2018-07-11, 182.55
2018-07-12, 185.61
2018-07-13, 185.9
2018-07-16, 185.5
2018-07-17, 186.022018-07-18, 185.0
2018-07-19, 186.44
2018-07-20, 186.01
2018-07-23, 186.18
2018-07-24, 187.53
2018-07-25, 189.292018-07-26, 188.7
2018-07-27, 185.56
2018-07-30, 184.52
2018-07-31, 184.89
2018-08-01, 195.78
2018-08-02, 201.51
2018-08-03, 202.09
2018-08-06, 203.14
2018-08-07, 201.24
2018-08-08, 201.37
2018-08-09, 202.96
2018-08-10, 202.35
2018-08-13, 203.66
2018-08-14, 204.52
2018-08-15, 204.99
2018-08-16, 208.0
2018-08-17, 212.15
2018-08-20, 210.08
2018-08-21, 209.67
2018-08-22, 209.682018-08-23, 210.11
2018-08-24, 210.77
2018-08-27, 212.5
2018-08-28, 214.22
2018-08-29, 217.42
2018-08-30, 219.41
2018-08-31, 221.952018-09-04, 222.66
2018-09-05, 221.21
2018-09-06, 217.53
2018-09-07, 215.78
2018-09-10, 212.882018-09-11, 218.26
2018-09-12, 215.55
2018-09-13, 220.76
2018-09-14, 218.25
2018-09-17, 212.44
2018-09-18, 212.79
2018-09-19, 212.92
2018-09-20, 214.542018-09-21, 212.23
2018-09-24, 215.28
2018-09-25, 216.65
2018-09-26, 214.92
2018-09-27, 219.34
2018-09-28, 220.112018-10-01, 221.59
2018-10-02, 223.56
2018-10-03, 226.282018-10-04, 222.3
2018-10-05, 218.69
2018-10-08, 218.19
2018-10-09, 221.212018-10-10, 210.96
2018-10-11, 209.1
2018-10-12, 216.57
2018-10-15, 211.94
2018-10-16, 216.612018-10-17, 215.67
2018-10-18, 210.63
2018-10-19, 213.84
2018-10-22, 215.14
2018-10-23, 217.172018-10-24, 209.72
2018-10-25, 214.31
2018-10-26, 210.9
2018-10-29, 206.94
2018-10-30, 207.98
2018-10-31, 213.42018-11-01, 216.67
2018-11-02, 202.3
2018-11-02, BUY CREATE, 202.30
2018-11-05, 196.56
2018-11-05, BUY CREATE, 196.562018-11-06, 198.68
2018-11-06, BUY CREATE, 198.68
2018-11-07, 204.71
2018-11-08, 204.02018-11-09, 200.06
2018-11-12, 189.99
2018-11-12, BUY CREATE, 189.99
2018-11-13, 188.09
2018-11-13, BUY CREATE, 188.092018-11-14, 182.77
2018-11-14, BUY CREATE, 182.77
2018-11-15, 187.28
2018-11-16, 189.362018-11-19, 181.85
2018-11-20, 173.17
2018-11-20, BUY CREATE, 173.17
2018-11-21, 172.972018-11-23, 168.58
2018-11-26, 170.86
2018-11-27, 170.48
2018-11-28, 177.042018-11-29, 175.68
2018-11-30, 174.73
2018-12-03, 180.84
2018-12-04, 172.88
2018-12-06, 170.952018-12-07, 164.86
2018-12-10, 165.94
2018-12-11, 165.0
2018-12-12, 165.46
2018-12-13, 167.27
2018-12-14, 161.91
2018-12-17, 160.41
2018-12-18, 162.49
2018-12-19, 157.42
2018-12-20, 153.45
2018-12-20, BUY CREATE, 153.45
2018-12-21, 147.48
2018-12-21, BUY CREATE, 147.48
2018-12-24, 143.67
2018-12-24, BUY CREATE, 143.67
2018-12-26, 153.78
2018-12-27, 152.78
2018-12-28, 152.86
2018-12-31, 154.34
Final Portfolio Value: 100381.48
Return:  OrderedDict([('rtot', 0.0038075421029081335), ('ravg', 1.5169490449833201e-05), ('rnorm', 0.003830027474518453), ('rnorm100', 0.3830027474518453)])
Sharpe Ratio:  OrderedDict([('sharperatio', None)])
System Quality Number:  AutoOrderedDict([('sqn', 345.9089929588268), ('trades', 2)])

实时实施

这与其说是一部分,不如说是我用来实施交易策略的资源的集合。如果你想向前迈进,并在现实市场中实施你的策略,看看这些文章…

算法交易策略陷阱

  • **不了解策略中盈利的驱动因素:**有些人认为,不管财务或经济驱动因素如何,如果你能获得足够的数据,并以这样的方式激发数据,你就能制定出盈利的交易策略。我年轻的时候也是这样,对算法交易比较陌生,也比较幼稚。事实是,如果你不能理解你自己的交易算法的本质,它永远不会盈利。
  • 不了解如何分割历史数据或合成数据来搜索和优化策略:这是一个大问题,后果是可怕的。我在大学的一个同事告诉我,他开发了一个有 300%回报的交易系统。很自然地,我马上就知道他完全把一个模型过度拟合到了历史数据上,并且从来没有在实际数据中实现过。问了一个关于他优化过程的简单问题,证实了我的怀疑。
  • **不愿意接受下跌日:**这个很有意思,对新手的影响似乎比经验丰富的交易者更大。老兵们知道会有低潮,会有损失,但是最重要的目标是赢的比输的多。这个问题通常出现在部署中——假设其他流程
  • **不愿意让以前盈利的系统退役:**损失控制,请了解风险管理和损失控制。你的系统是成功的,这太棒了——这意味着你理解了设计过程,并且可以再做一次。不要纠结于它做得有多好看看*它做得有多好。*这与理解您战略中的盈利驱动因素有所重叠——如果您理解了系统不再盈利的原因,您就会知道何时以及为何该淘汰系统。

因果推断估计的快速比较

原文:https://towardsdatascience.com/a-quick-comparison-of-causal-inference-estimates-d7995592025?source=collection_archive---------28-----------------------

有许多方法来估计因果效应的大小,这里我们使用一个最小复杂因果结构来检查这些估计是否一致。

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

来源: Fascinadora 通过 shutterstock (SL)

1。简介

作为一名实验行为科学家,我一直认为理解统计关系的因果方向性是实证科学的核心。我接受过经典实验设计的培训,在这种设计中,研究人员被认为对环境有完全的控制权,他们主要担心的是如何在时间或空间上定位不同的实验条件(例如拉丁方设计)。然而,一旦你离开受控实验室实验的安全性,推断因果关系就成了一个大问题,很容易危及你结论的内在有效性。幸运的是,在过去的几十年里,统计因果关系的研究在理论和方法上都取得了巨大的进步,现在因果推断正在成为数据科学家工具箱中一个相当常见的工具。为了跟上当前的方法,我做了一个快速回顾,我对过多的估计因果效应的方法感到有些惊讶。在这个项目中,我将列出我在文献中发现的最常见的方法,将它们应用于一个简化的因果问题,并比较观察到的估计值。这种比较旨在作为一个简要的高层次概述,而不是作为因果推理的教程。关于这个主题的简要介绍,我推荐 Pearl 等人(2016 年),关于深入的报道,感兴趣的读者可以查看 Pearl (2009 年)、Morgan 和 Winship (2015 年)或 Jason Roy 教授的在线课程(Roy,2020 年)。

2。因果模型示例

当使用统计方法推断因果关系时,通常我们感兴趣的是原因 X 对结果 y 的影响程度。当我们只观察这些变量时,或者如果随机化存在挑战(例如选择偏差),我们通常需要考虑更广泛的变量集。在图 1 中,我给出了一个假设例子的因果图。这个例子包括三种主要类型的附加变量,帮助我们得到一个无偏的估计:后门,前门和工具变量。

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

图一。在存在其他变量的情况下,原因 X 影响结果 Y 的假设性图形因果模型。如果我们测量这三个集合中的任何一个,就可以估计 X 对 Y 的因果影响:{X,Y,BD}、{X,Y,IV}或{X,Y,FD}

假设 X 是一个二元变量,表示至少每周锻炼的效果(如果锻炼,X = 1;否则 x = 0 是连续测量的预期寿命。X 对 Y 的影响完全由变量 FD ( 前门标准)调节,在我们的例子中,该变量可以是体重指数。此外,Y 和 X 都受到变量 BD ( 后门标准 ) 的影响,在我们的情况下,这可能是一些遗传因素,它们不直接影响 FD。最后,X 还受到 IV ( 工具变量)的影响,在我们的示例中,它可能是靠近体育设施。

我们可以用以下模型实例化这个因果图:

IV = U

BD = U

X = { 0,if IV — BD + U <= 0

1, if IV — BD + U > 0}

FD = X + U

Y = 65 + FD + BD + U

模型 1:实例化图 1 中图形模型的结构因果模型。U 分量是均值为 0 且 SD = 2 的正态分布误差项(或来自外部变量的输入)。

出于当前模拟的目的,我从模型 1 中随机生成了 10,000 个实例,在下一部分中,我将使用不同的统计方法来估计 X 对 Y 的因果影响。

以下是相关代码:

generate_df <- function(n = 1000, path_weights) {
 #generate data frame from path_weights
 a <- path_weights
 sd_noise = 2
 iv <- rnorm(n, sd = sd_noise)
 bd <- rnorm(n, sd = sd_noise)
 x <- rnorm(n) + a[1]*iv + a[2]*bd
 x <- ifelse(x<=median(x), 0, 1)
 lm(x~iv + bd) %>% summary
 fd <- (rnorm(n, sd = sd_noise) + a[3]*x ) 
 lm(fd ~ x) %>% summary()
 y <- (65 + rnorm(n, sd = sd_noise) + a[4]*fd + a[5]*bd ) 
 lm(y ~ fd + bd) %>% summary()
 id <- rnorm(n)
 df <- data.frame(
  id = id, x = x, y = y, iv = iv, fd = fd, bd = bd)
 return(df)
}
path_weights <- c(1,-1,1,1,1)
df <- generate_df(n = 10000, path_weights)

3。简单估计(观察 X 和 Y)

X 对 Y 的因果效应的简单估计可以简单地从 X 预测 Y 的回归系数中获得。在这个例子中,因果效应是 b_naive = -0.97,令人惊讶地表明运动缩短了预期寿命近一年。

naive_fit <- lm(y~x, data = df)
summary(naive_fit)

当研究人员确信没有需要考虑的 BD 变量时(例如,当 X 被随机分配或好像被随机分配时),简单估计是有用的。然而,对于大多数观察性研究和准实验性设计来说,天真的估计通常不是很有用。

4。后门变量调节(观察 X、Y 和 BD)

如果除了 X 和 Y 之外,您还可以测量 BD,那么您可以计算 X 对 Y 的因果影响的无偏估计,从而避免天真估计存在的问题。这里 BD 只是一个变量,但是它也可以是一组满足后门标准的变量。在回顾文献时,我发现了以下五种方法来估计因果关系,同时调整后门变量:

4.1 协变量

估计 X 对 Y 的因果影响的一种方法是运行回归模型,从 X 预测 Y,并将 BD 作为协变量。对于大多数受过线性回归训练但没有因果推理训练的研究人员来说,这通常是最直观的方法。

covariates_fit <- lm(y~x+bd, data = df)
summary(covariates_fit)

将这种方法应用于我们模拟的数据,我们发现 X 对 Y 的因果效应是 b _ 协变量= 1.01。根据这一分析,如果你锻炼,你会多活一年。请注意,这个估计不仅不同于天真的估计,两个估计实际上具有相反的符号,并导致相互矛盾的结论(查看辛普森悖论

4.2 直接匹配

上述协变量调整也可以通过直接匹配治疗组和对照组参与者的 BD 分数来完成。主要思想是,匹配程序将通过仅比较在 BD 分数上已经相似的对照组和治疗组受试者来消除 BD 对因果估计的影响:

greedymatch <- Matching::Match(Tr = df$x, M = 1, X = df[,”bd”])
matched <- df[unlist(greedymatch[c(“index.treated”, “index.control”)]),]
t.test(matched$y[matched$x == 1],matched$y[matched$x == 0], paired = TRUE)

当使用这种方法时,我们得到 b_direct_match = 1.05,这与我们使用协变量方法时观察到的结果非常接近。

4.3 倾向评分匹配

如果你需要考虑多个 BD 变量,找到好的匹配可能会非常困难(查看维数灾难)。取而代之的是,你可以使用倾向分数匹配,在这里你首先计算在治疗组中的概率(也称为倾向分数,查看这篇论文或者这篇博客文章),然后根据这些概率匹配参与者。

ps_fit <- glm(x~bd, data = df, family = “binomial”)
df$ps_score <- ps_fit$fitted.values
logit <- stats::qlogis # rename the function for clarity
greedymatch <- Match(Tr = df$x, M = 1, X = logit(df[,”ps_score”]), caliper = .2)
matched <- df[unlist(greedymatch[c(“index.treated”, “index.control”)]),]
t.test(matched$y[matched$x == 1],matched$y[matched$x == 0], paired = TRUE)

因果效应估计为 b_ps_match = 1.05,这实际上与前面的调整方法相同。

4.4 治疗权重的逆概率

您也可以使用加权回归,其中权重基于治疗的概率。具有高倾向分数的对照参与者和具有低倾向分数的治疗参与者接收更高的权重,调整由于 BD 变量引起的治疗/对照失衡。

df$weight <- ifelse(df$x == 1, 1/df$ps_score, 1/(1-df$ps_score))
iptw_fit <- lm(y ~ x, data = df, weights = weight)
summary(iptw_fit)

模拟数据的估计值为 b_iptw = 0.92,非常接近之前的估计值。

4.5 双重稳健估计

这是一种更先进的方法,为模型的错误设定提供了更多的空间。为了获得因果效应的无偏估计,正确指定倾向评分模型或结果回归模型就足够了。

dr_fit <- drgee::drgee(oformula=y~bd,
 eformula=x~bd,
 iaformula=~bd, olink=”identity”, elink=”identity”,
 estimation.method=”dr”,
 data=df)
summary(dr_fit)

因果效应是 b _ doubly _ robust = 1.01,也非常类似于之前的其他调整方法。

5。工具变量(观察 X、Y 和 IV)

如果你知道 BD 存在,但是你无法测量它,怎么办?如果您可以测量变量 IV,您仍然可以估计 X 对 Y 的因果影响。这种方法称为工具变量法,其中工具 IV 对 Y 的影响以 X 为中介,可用于估计 X 对 Y 的影响。运行这种分析的常用方法称为两阶段回归,其中第一阶段我们在工具 IV 上回归 X,第二阶段我们在第一阶段的残差上回归结果 Y。

stage1_fit <- stats::lm(x~iv, data = df)
df$stage1_predict <- predict(stage1_fit, type = “response”)
stage2_fit <- stats::lm(y~stage1_predict, data = df)
summary(stage2_fit)

在我们的例子中,工具变量法估计 X 对 Y 的因果影响为 b_iv = 0.96,非常接近于 BD 调整法。

6。前门调节(观察 X、Y 和 FD)

即使我们既不能测量 IV 也不能测量 BD,仍然有可能计算出 X 对 y 的因果影响的无偏估计。前门调整允许我们通过测量 X 对 FD 和 FD 对 y 的影响来实现这一点。

x_fd_fit <- lm(fd~x, data = df)
fd_y_fit <- lm(y~fd + x, data = df) # here x is included to block back-door effects
x_fd_fit$coefficients[2]*fd_y_fit$coefficients[2]

使用前门调整,我们估计 X 对 Y 的因果效应为 b_fd = 1.03。

7。跨方法协议

虽然我理解为什么有些方法应该返回相等或非常接近的估计值,但我仍然发现 X 和 Y 的因果关系可以用如此多的方法来估计,这既令人吃惊又有点令人困惑。为了检查不同方法的一致性,我基于图 1 中的因果图运行了一系列模拟。我使用了与模型 1 中概述的相同类型的关系,但对于每个模拟,我随机分配了一个随机回归系数,绝对值范围从 0.3 到 3。作为参考,对于较弱的关系(系数设置为 0.3),FD 和 BD 一起解释了 Y 中 8%的方差,而较强的关系(系数设置为 3)解释了 68%的方差(基于 R)。

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

图二。这里讨论的八种因果推断方法的因果效应估计值之间的相关性。

我运行了 2000 次模拟,每次有 2000 行。对于每个模拟,我用上面列出的方法计算了 X 对 Y 的因果影响的八个不同的估计。图 2 描述了不同方法之间的一致性。如图所示,这两种方法基本一致,皮尔逊相关系数远高于 0.9。天真估计也与其他方法正相关,但它经常低估或高估真正的因果关系。

8。警告和进一步观察

当前项目的目标是为估计因果影响的主要方法提供一个快速的总体示例,并证明这些方法在结果上基本一致。然而,这个例子非常简短,忽略了许多重要的细节,其中一些我需要明确提到:

  • 在这里,我把因果关系作为一个单一的概念,然而有不同类型的因果关系。例如,工具变量估计局部平均治疗效果,而这里应用的其他方法估计(边际)平均治疗效果。这两种影响不一定相等。
  • 虽然图 1 中的因果图和随后的模型是基于各种理论原则和假设,但我只提供了外部参考,在此不做讨论。
  • 这里的不同方法在估计上基本一致,但这部分是由于我用来生成数据的简单模型。例如,我没有包括异质性治疗效果,不平衡组或偏斜分布,所有这些都会降低方法间的一致性。
  • 匹配方法对所使用的特定算法以及 X 和 BD 之间的关系强度很敏感。
  • 在试验因果关系的数量时,我注意到较弱的因果关系与方法间的一致性的显著下降有关。工具变量估计值尤其受到弱统计关系的影响(check Bound,Jaeger 和 Baker,1995 年)

9。结论

我发现赶上因果推理领域既具有挑战性又令人兴奋。对于一个新手来说,这个领域可能看起来支离破碎,不一致,并且经常专注于抽象的理论而不是应用。然而,除了这些最初的印象,令人着迷的是发现理论和方法逐渐趋同,并为研究人员提供了过多的创造性工具来寻找因果关系。将这些工具中最常见的放在一起,帮助我看到了理论和方法的融合,我希望它可能对其他研究人员和数据科学家有所帮助。

参考文献

奥斯汀市(2011 年)。减少观察性研究中混杂效应的倾向评分方法介绍。多元行为研究,46(3),399–424。

Bellemare,M. F .,& Bloem,J. R. (2019)。如何使用前门标准评估治疗效果?

邦德、杰格、D. A .、贝克、R. M. (1995 年)。当工具和内生解释变量之间的相关性较弱时,工具变量估计的问题。美国统计协会杂志,90(430),443–450。

邦德、杰格、D. A .、贝克、R. M. (1995 年)。当工具和内生解释变量之间的相关性较弱时,工具变量估计的问题。美国统计协会杂志,90(430),443–450。

摩根公司和温希普公司(2015 年)。反事实和因果推断。剑桥大学出版社。

珀尔,J. (1993 年)。专家系统中的贝叶斯分析:评论:图形模型,因果关系和干预。统计科学,8(3),266–269。

j .珀尔(2009 年)。因果关系。剑桥大学出版社。

j .珀尔、m .格里穆尔和 N. P .朱厄尔(2016 年)。统计学中的因果推断:初级读本。约翰·威利的儿子们。

《因果关系速成班:从观察数据推断因果关系》。coursera.org,网址:https://www.coursera.org/learn/crash-course-in-causality

一个快速的深度学习方法:用 Python 中的 Keras 进行时间序列预测

原文:https://towardsdatascience.com/a-quick-deep-learning-recipe-time-series-forecasting-with-keras-in-python-f759923ba64?source=collection_archive---------5-----------------------

在本教程中,我们将讨论/比较三个不同的人工神经网络(DNN、RNN 和 LTSM)在同一个单变量数据集上的表现——一家电子商务公司的广告日常支出。

目录

  1. 简介
  • 时间序列分析
  • 为什么选择深度学习
  • 进行深度学习的过程

2.车型

  • DNNs
  • RNNs
  • LSTM

3.对比车型

4.期末总结

1.1 时间序列分析

详细说明在我以前的帖子这里

1.2 为什么选择深度学习

我们知道统计模型可以预测时间序列。但是,这些方法有一些限制:

  1. 需要完成数据进行培训。某些缺失值会导致模型的性能非常差。尽管有一些方法可以处理丢失的值,但是很难做到
  2. 通常,处理单变量数据集,应用于多变量数据集具有挑战性
  3. 对缺失值敏感

深度学习方法能够应对上述挑战:

  1. 对缺失值不敏感
  2. 合并外生变量的容易程度(适用于单变量数据集和多变量数据集 )
  3. 捕捉非线性特征交互
  4. 自动特征提取

我将简要解释神经网络方法的关键组件/概念,并展示如何用 python 代码中的 Keras 一步一步地应用神经网络。对于每个模型,我将遵循 5 个步骤来展示如何使用 Keras 建立一个预测时间序列的基本网络。

  1. 预处理
  2. 定义神经网络形状和模型编译
  3. 拟合模型
  4. 估价
  5. 可视化预测

现在,让我们编码吧!

首先,快速浏览一下数据集:2017 年 1 月 1 日至 2019 年 9 月 23 日的广告日支出包括 996 天。数据集的前五行:

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

数据帧的前五行

绘制滚动平均值以可视化趋势/季节性,并运行 Dickey-Fuller 测试以检查数据集的平稳性,与我们在之前的教程第一部分和第二部分中所做的一样。

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

模式 1: DNN

一个深度神经网络(【DNN】)是一个 人工神经网络 ( )在输入层 和输出层*—来自维基*

如何对时间序列数据应用 DNN?这里的关键思想是:我们把时间序列看作线性模型:{X(i) …X(i+t)}~Y(i+t+1)。在该格式中,显示了使用 t 步输入时间序列来预测下一步 Y(i+t+1)。

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

带有一个隐藏层的简单 DNN

在图中,我显示了一个隐藏层的 DNN 结构。接下来,让我们看看如何在我们的广告支出数据上实现这个模型。

第一步:数据预处理

导入 convert2matrix 的辅助函数来修整数据集,以便创建 DNN 的二维输入形状。一个完全连接的网络——RNN 和 LTSM 的主要区别

将数据集分为测试数据集和训练数据集。

第二步:定义神经网络形状并编译模型

我建立了一个非常简单的 DNN,只有一个隐藏层。

第三步:拟合模型

model=model_dnn(回看)

history=model.fit(trainX,trainY,epochs=100,batch_size=30,verbose=1,validation_data=(testX,testY),callbacks =[early stopping(monitor = ’ val _ loss ',patience=10)],shuffle=False)

第四步:模型评估

打印出误差指标并生成模型损耗图。

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

从上面的图表中,很明显我们过度拟合了我们的模型,因为模型在 40 个时期后几乎没有做任何事情。

步骤五。可视化预测

通过调用以下命令检查预测图:

预测 _ 绘图(测试,测试 _ 预测)

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

从图上看,尽管它错过了一些波峰和波谷,但它能够捕捉总体趋势和季节性,而无需任何参数调整或归一化预处理。

模式 2: RNN

***RNN(递归神经网络)*处理的序列不同于之前显示的全连接 DNN。

这里的关键思想:时序数据集是序列。

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

有两个隐藏层的 RNN

我们将在下面的案例研究中看到这个 RNN 形状。

第一步:数据预处理

RNN 输入形状:(批量大小,窗口大小,输入特征)

导入助手函数以创建矩阵

第二步:定义神经网络形状并编译模型

建立了一个有两个隐藏层的 RNN 模型。

第三步:拟合模型

模型=模型 _rnn(回望)

history=model.fit(trainX,trainY,epochs=100,batch_size=30,verbose=1,validation_data=(testX,testY),callbacks =[early stopping(monitor = ’ val _ loss ',patience=10)],shuffle=False)

第四步:模型评估

打印出误差指标并生成模型损耗图。

产量低于

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

从上面的图表中,很明显我们过度拟合了我们的模型,因为模型在 20 个时期后几乎没有做任何事情。

第五步。可视化预测

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

一般来说,预测看起来不错,测试误差较小。尽管它错过了一些高峰和低谷,但它能够捕捉总体趋势和季节性。

模式 3:LSTM——RNN 家庭的一员

LSTM(长短期记忆),由四个主要部件构成:输入门、输出门、存储单元和遗忘门

  • 输入门:控制向单元格状态添加信息。换句话说,输入门将考虑哪些信息应该添加到单元状态,以确保添加重要信息而不是冗余信息或噪声。
  • 内存 单元格 : (1)控制可以删除或刷新的值(2)包含可能需要保存的值,作为许多其他时间步骤的附加信息。
  • 输出门:控制从当前单元状态中选择有用的学习信息作为输出。
  • 遗忘门:控制从细胞状态中删除 LTSM 学习不再需要或不太重要的信息。这有助于优化 LSTM 网络的性能。

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

我修改了 https://en.wikipedia.org/wiki/Long_short-term_memory 的原始图片

第一步:数据预处理:

LSTMs 对输入数据的规模很敏感。在预处理步骤中,我应用了 scikit-learn 模块中的 MinMaxScaler 预处理类来标准化/重定数据集。

导入助手函数以创建矩阵

将数据集的范围重新调整为 0–1。

将数据集分为训练数据集和测试数据集。为 LSTM 创建输入三维输入形状。

第二步:定义神经网络形状并编译模型

这里,一个非常简单的两层 LTSM 没有隐藏层

第三步:拟合模型

model=model_lstm(回望)

history = model.fit(trainX,trainY,epochs=100,batch_size=30,validation_data=(testX,testY),callbacks =[early stopping(monitor = ’ val _ loss ',patience=10)],verbose=1,shuffle=False)

这里有一个小提示:通常,当 LSTM 表现出过度适应时,尝试 GRU(门控循环单元)是 LSTM 的“简化版”。

第四步:模型评估

打印出误差指标并生成模型损耗图。

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

从上面的图表中,很明显我们过度拟合了我们的模型,因为模型在 20 个时期后几乎没有做任何事情。

通过在本文中比较不同模型的误差度量,我们得到了更好的结果(LSTM 显示了更小的误差度量)。迄今为止,LSTM 的表现优于其他两款车型。我们预测大约 2 个月(具体来说是 65 天),MAE 等于 3744。换句话说,2 个月的预测广告支出将比实际支出少大约 3744 美元。平均每月花费 250 万美元以上。这是一个非常好的预测!此外,这是对我另一篇文章中的统计模型结果的一大改进。

第五步。可视化预测

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

尽管它不能完美地捕捉所有的波峰和波谷,但在这个用例中,它确实比 DNN 或 RNN 模型做了更好的预测。

总结

到目前为止,我展示了在这个用例中使用深度学习来预测单变量时间序列数据。实际上,深度学习可以做得更多!我们可以通过添加其他特征(如星期几、节假日、经济影响等)将单变量时间序列数据转换为多变量时间序列,这对于应用于传统的统计模型来说是一个挑战。

除了为输入数据添加更多特征之外,还可以考虑其他过程来改进神经网络。

  • 增加嵌入输出大小
  • 添加批量标准化图层
  • 尝试不同的学习率,激活功能,其他超参数
  • 稍后添加辍学
  • 尝试其他模式,如 GRU 或切换到有线电视新闻网
  • 等等。

参考资料:

* [## 用于视觉识别的卷积神经网络

计算机视觉在我们的社会中已经变得无处不在,在搜索、图像理解、应用程序、地图绘制…

cs231n.stanford.edu](http://cs231n.stanford.edu/) [## keras-team/keras

mnist_mlp.py 在 mnist 数据集上训练一个简单的深度多层感知器。py 在…上训练一个简单的 convnet

github.com](https://github.com/keras-team/keras/tree/master/examples)*

k 均值聚类

原文:https://towardsdatascience.com/a-quick-easy-k-means-clustering-tutorial-3ccee4ea7d5b?source=collection_archive---------49-----------------------

一个简单快捷的基本机器学习工具教程

作者安德鲁·科尔

数据至少是模糊的。它包含无限的信息宝藏,而解开这些信息需要同样模糊的方法。但是,和任何事情一样,必须有一个起点。分类是最有效的机器学习方法之一,它试图根据数据已有的特征将数据分类到特定的组中。然而,我们并不总是知道这些特征是什么,这就是问题所在。我们甚至不知道我们在数据集里看到了什么,我们只是呆呆地盯着它,而它也在看着我们。

幸运的是,有 ML 分类方法可以帮助解决这个模糊的问题。机器学习以两种状态存在:

  • 监督学习:算法从已经包含标记数据的训练数据集中“学习”。训练数据集包含输入输出数据,这是模型验证自身性能的方式。例如,我们有一个医院病人,我们知道他表现出症状 X、Y 和 Z,他们患有疾病 1。输入数据表示三种症状,而输出表示患者确实患有疾病 1。因为输入和输出是已知的,我们可以利用监督机器学习。
  • 无监督学习:算法用未知的结果来推断数据中的模式。你不能真正地将数据归类到一个结果中,因为你甚至不知道结果的值可能是什么。例如,您有一家拥有 100,000 名客户及其购买历史的企业,您希望了解这些客户的人口统计分组,以便更好地调整您的业务模型。无监督学习方法在这里会更合适,因为它们将有效地将那些客户“分组”到仅基于可用数据的相似分组中。

K 均值聚类—模型

我们将深入探讨如何创建一个基本的无监督学习模型,以及如何评估其成功的教程。无监督学习有许多应用,但我们将特别关注其中一个:聚类。聚类实质上将分散所有的数据点,并根据它们的特征对它们进行分组。目标是进行分组,使得类内相似性高(聚类内的相似性),同时保持类间相似性低(聚类间的相似性)。

聚类的主要目标是将数据点分组在一起,而不知道这些数据点实际上是什么。

利用 k-均值聚类,我们确定有 k- 个聚类中心。通用算法流程如下:

1.数据将围绕整个数据集中预定数量的中心点进行分组。

2.每个单独的数据观测值将被分配到距离中心点“最近”的聚类(欧几里德距离)。

3.各个聚类中心点将被重新计算,因为它们周围都有它们的观测值

4.现在,根据一些“规则”,观察值被重新分配给其中一个集群(见下面的 Init )

5.这个过程是迭代的,所以如果观测点的重新分配可以实现更近的距离,它就会发生。如果没有,模型就完成了。

为了开始建模过程,我们导入必要的库并生成随机数据:

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

在这里,我们可以清楚地看到有 5 到 7 个清晰的数据点或数据簇。K-Means 算法现在将计算并试图找到“K”个聚类的中心点。我们将定义‘k’= 7。算法本身有些简单:

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

与任何机器学习模型一样,有大量的参数选项来帮助调整您的模型以适应您的数据(括号中的参数选项)。

  • n_clusters: 这是你的“k”值。该参数告诉算法将数据分组到多少个聚类中,因此需要计算多少个中心点。没有确定的方法来预先确定准确的 k 数,因此模型的迭代是必要的,并且最佳执行结果度量(我们稍后将讨论)将告诉您哪个数用于您的最终模型。
  • init: 这是你初始化函数的“规则”方法( k-means++: 默认;选择初始聚类中心以追求更快的收敛;**随机:**选择 k-随机观测值来选择初始中心; ndarray: 此参数允许您提供自己的初始中心点)
  • **算法:**指定聚类时使用的算法( full: “全期望最大化”);在每次迭代中,出现 E 步(将点分配到最近的中心点)和 M 步(根据聚类元素更新聚类均值);**埃尔坎:**效率更高;使用稀疏数据时不可用;自动:根据给定数据自动拾取满/elkan)

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

上述代码的结果如下图所示。7 个聚类中每个聚类正中心的黑点代表每个聚类的计算中心点。

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

K 均值聚类:评估指标

如前所述,聚类是一个迭代过程。没有很好的方法来预先确定我们应该在我们的模型中使用多少 k-clusters,因此我们必须运行多个模型,然后比较结果指标。sk-learn 库中可能有许多指标,但我们将重点关注两个:

  • **方差比(Calinski-Harabasz 评分)😗*这是一个聚类内的点的方差比。方差比率得分越高=模型性能越好。

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

  • **剪影评分:**评分越高=模特越好

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

a = 一个数据样本与同一个聚类中所有其他点之间的平均距离

b = 一个数据样本与下一个最近聚类中所有其他点之间的平均距离

值得注意的是,这两个指标都不一定比另一个“更好”。然而,重要的是,一旦你选择了一个评估指标,你就要坚持在所有模型中使用相同的指标。

剪影得分:k = 7

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

卡林斯基-哈拉巴斯评分(方差比):k = 7

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

现在我们有了 k=7 个集群的模型性能指标,我们将再次迭代模型,这次使用 k = 6。一旦新模型被拟合和预测,我们将比较指标。无论哪个更高,都将是性能更好的模型。代码如下:

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

当您比较两个生成的模型图时,我们无法真正区分两个中心,除了右上的浅紫色样本簇(x = -5,y = 0.0)这一事实。因此,我们必须比较评估指标,以确定哪个分数更好。让我们使用剪影分数作为我们的比较(同样,一旦你选择了一个指标,你必须在所有的模型迭代中使用它)。

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

结论

我们现在有两个指标进行比较。

  • k = 7;轮廓得分= 0.70
  • k = 6;轮廓得分= 0.68

k=7 的轮廓分数高于 k=6,因此 k=7 是性能最好的模型。

Python 中一种快速、简单的数据反透视方法

原文:https://towardsdatascience.com/a-quick-easy-way-to-unpivot-data-in-python-ea31dc707ae7?source=collection_archive---------10-----------------------

在熊猫中使用融化功能

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

让我们学习如何在熊猫身上融化数据(来源:Nik Piepenbreier)

在之前的一篇文章中,我们看了一下在 Python 中执行三个常见的 Excel 任务。今天我们来看看一个函数,虽然在 Excel 中是可能的,但它隐藏得很好,有点笨拙。我说的是 Excel 中的“非透视”数据。

为什么取消数据透视?

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

让我们让下载的数据更有用!资料来源:Nik Piepenbreier

Python 和 Excel 使得分析数据和以跨表格式呈现分析变得非常容易。但是如果您只接收那种格式的数据呢?为了进行更有意义的分析,通常需要花费大量时间来重新格式化数据。我们称这个过程为“非旋转”。

开始取消透视数据

让我们通过运行以下命令将数据集加载到 Pandas 数据帧中:

import pandas as pd
df = pd.read_excel('[https://github.com/datagy/mediumdata/raw/master/pythonexcel.xlsx](https://github.com/datagy/mediumdata/raw/master/unpivot.xlsx)')

如果你想探索 Excel 中的数据,你可以在这里下载文件。

我们可以通过编写以下代码打印出列名:

print(df.columns)

这将返回:

['Product', 'Quarter 1', 'Quarter 2', 'Quarter 3', 'Quarter 4']

本质上,我们希望将所有的季度放在一个列中(称为季度),并将销售额放在一个单独的列中。熊猫融化功能使这变得非常容易。我们可以简单地写:

df = df.melt(id_vars = 'Product', var_name = 'Quarter', value_name = 'Sales')

让我们稍微分解一下:

  • id_vars :标识要用作标识符变量的列
  • value_vars :要取消透视的列。如果为空(如这里的情况),则使用除了那些在 id_vars 中标识的列之外的所有列
  • var_name :为取消透视的列指定一个名称
  • 值名称:为值列指定一个名称

当我们现在打印出 df 时,我们看到它以如下方式返回:

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

我们融化的数据框。资料来源:Nik Piepenbreier

在 Excel 中取消数据透视

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

在 Excel 中取消数据透视。资料来源:Nik Piepenbreier

现在,假设我们想在好的、旧的 Excel 中做这件事。我们该怎么做呢?在 Excel 2016 之前,这需要下载 Power Query 插件。从该版本开始,附加组件的功能被内置到主版本中。让我们从打开数据集开始。从那里开始:

  1. 选择数据选项卡
  2. 选择表格后,在获取和转换数据中选择表格/范围
  3. 切换到变换菜单
  4. 选择要取消透视的列
  5. 单击取消透视列
  6. 在主页选项卡上选择关闭并加载
  7. 享受你的数据!

感谢阅读这篇文章!请务必查看我的其他帖子,包括轻松学会如何!!)用 Python 做 3 个高级 Excel 任务

CARTO BigQuery Tiler 的快速实验!

原文:https://towardsdatascience.com/a-quick-experiment-with-the-carto-bigquery-tiler-b2ab37e48006?source=collection_archive---------59-----------------------

从 BigQuery 和 CARTO BigQuery Tiler 的实践教程开始。

我和我的朋友、共同主持人、数据黑客同事朱莉 ( 推特),以及 CARTO 的帮助下创建的!

你好,世界!

最近,CARTO 推出了 BigQuery Tiler,我们有机会出席 2020 年空间数据科学大会,一睹 Tiler 的风采。

我们做了一个报告!

我们为这个演示创建了几个演示,我们想把它作为一个“你好,世界”的练习分享给 tiler!我们已经将数据和查询/代码加载到了一个 Github 库中,欢迎您尝试一下。当第一次构建这些组件时,我们发现了许多关于许多不同组件的有用信息,但试图将它们联系在一起并不总是直截了当的,因此这包括了我们在此过程中吸取的许多经验教训,并给出了从数据创建到可视化的完整端到端示例。

在运行演示之前,需要回顾一些要点。readme 文件中列出了它们,但这里也值得重申一下:

  • 这是演示代码,旨在用于学习,而不是用于生产。它不是受支持的产品,因此随着时间的推移,情况可能会发生变化和损坏,我们将尽力修复它!
  • 如果这是你第一次使用谷歌云,一定要开始你的免费试用并创建你的项目!
  • 这使用了 Google BigQuery ,会产生成本。请务必通过定价页面了解您的项目将如何产生成本,如果这是您的第一个项目,请务必了解 Google Cloud 试用和免费等级
  • 这也使用 CARTO BigQuery Tiler。你需要成为测试版的一员。在这里找到关于这个的更多信息。
  • 当然,你还需要一个卡通账户
  • 对于在 Google Cloud 和 BigQuery 的命令行中完成的任务,您可以利用预先安装了命令行工具的云外壳,或者您可以将 Google Cloud SDK 安装到您的本地(或虚拟)机器上。
  • 在命令行中,确保通过运行gcloud auth login来设置您的用户,并运行gcloud init来设置您的默认项目。

加载数据

阅读完这些信息并设置好项目后,就可以加载数据集了。有两个数据集要加载; NIFS 火灾周界数据来自 OpenAQ 的数据。继续克隆/下载 Github 库,并按照readme 中的步骤加载数据。完成后,BigQuery 中应该有下面的表:

  • geo.geo_dataset_nifs_perimeters
  • geo.geo_dataset_openaq_demo
  • geo.geo_dataset_osm_planet_features_buildings
  • geo.tileset_openaq_wildfire
  • geo.tileset_osm_planet_features_buildings

可视化 OpenStreetMaps (OSM)数据

当加载地理数据集时,您可以直接在 BigQuery 界面中预览它们(T4 ),看看它们是什么样子。一旦你创建了一个 tileset,你也可以预览它们,但因为它是原始的 tileset 数据,它可能不会有太大的意义。您可以使用 QGIS、deck.gl 和 Carto 的在线查看器等工具来可视化切片集。Carto Online Viewer 是一个基于 web 的 tilesets 可视化工具,可以让您快速查看数据的外观。当加入测试版时,它的文档会让你知道如何设置在线查看器,使用本教程中创建的 OSM tileset 就是一个很好的例子。如果您已经加入了测试版,并且可以访问它,那么现在是使用geo.geo_dataset_osm_planet_features_buildings表进行尝试的好时机。

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

CARTO Online Viewer 中的 OSM tileset 将如下所示。(图片由作者提供)

可视化 NIFS 和 OpenAQ 数据

为了制作演示中使用的第二个示例,我们使用 deck.gl 在网页中创建可视化效果。我们还使用了 codepen.io 来测试和显示网页和可视化效果,但是您也可以将代码粘贴到 Github Gist 中,并使用bl.ocks.org来呈现它,或者如果您有自己喜欢的编辑和服务工作流,请使用它!

为了显示 NIFS 野火多边形,我们使用了cartossqllayer下拉数据并将其可视化。这意味着您还必须在 CARTO 中创建一个数据集才能使用它。在 CARTO 仪表板中,转到数据页面,创建一个新的 BigQuery 数据源,并使用您用来访问 Google Cloud 的帐户进行身份验证。在向导中,在 BigQuery 中选择存储您的geo数据集的项目,将输出命名为geo_dataset_nifs_perimeters,并使用以下查询:

SELECT geom, IncidentNa as INCIDENT_NAME, GISAcres as ACRES FROM `geo.geo_dataset_nifs_perimeters`

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

BigQuery 数据的 CARTO 向导。(图片由作者提供)

选择不同步下一页中的数据(这只是静态数据的一次性提取,因此不需要同步),并将数据导入!这将为您提供一个来自 BigQuery 的 CARTO 新数据集,您可以使用它。

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

闪亮的新数据!(图片由作者提供)

该数据集现在可用于查询。包含源代码的 HTML 页面在[/2_fire_perimeters/index.html](https://github.com/slagathorr/sdsc20-bqtiler-demo/tree/main/2_fire_perimeters)的 Github 资源库中,需要做一些改动。

首先是 API 键。确保获得您的 CARTO API 密钥,授予其访问geo_nifs_perimeters数据集的权限,并使用这些凭证来填充 index.html 文件中第 259 和 260 行的变量。

您还需要获得一个 Google Maps API 密钥,因为我们将它用作可视化中的底图。按照指令获取您的 API 密钥,然后将其插入到第 9 行的 API 调用中。

最后,您需要为 BigQuery 中的 tilesets 添加数据访问。为此,我们使用了多视图层。在第 268 行中,用 tileset 的 URL 模板替换url占位符。在 BigQuery Tiler 文档的“使用 QGIS”一节中,有一节介绍了如何获取生成模板的 URL。您将得到一个包含大量信息的 JSON 响应,但是所需的 URL 将是第一个对象,看起来像这样:

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

原谅我的涂鸦。(图片由作者提供)

用生成的新 URL 替换urls,您应该可以开始了!您将获得一个可视化效果,显示任何给定野火质心 100 公里范围内的 OpenAQ 中的测量点,并与野火本身的多边形分层。

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

空气测量点和地图上的野火多边形。(图片由作者提供)

应该就是这样了!希望您能够浏览所有这些内容,作为 CARTO BigQuery Tiler 的介绍,以及可视化这些数据集的一些选项,这很有帮助。如果您遇到任何问题,请务必让我们知道。如果您有任何希望分享该功能帮助的使用案例,我们也很乐意听到!请务必在这里或在 Twitter ( @brian_suk@juliepricetech )上发表评论,为我们呐喊!谢谢,祝映射愉快!

深度学习中激活函数的快速指南

原文:https://towardsdatascience.com/a-quick-guide-to-activation-functions-in-deep-learning-4042e7addd5b?source=collection_archive---------13-----------------------

深度学习中所有主要激活功能的快速讨论。

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

作者图片

在这篇文章中,我将给出一个在神经网络中使用的一些最常见的激活函数的快速概述。但在讨论它们之前,让我们先讨论一些与激活函数相关的基本概念。

内容-

  1. 为什么我们需要激活函数?
  2. 为什么我们总是在神经网络中选择非线性激活函数?
  3. 通用逼近定理
  4. 消失和爆炸梯度问题
  5. 激活功能-
  • Sigmoid 函数
  • Softmax 函数
  • 双曲正切值
  • 热卢
  • 泄漏 Relu
  • 嗖嗖
  • 参数化 Relu
  • ELU
  • Softplus 和 Softsign
  • 卢瑟
  • 格鲁
  • 线性激活函数

6.如何决定应该使用哪个激活函数?

7.结论

8.信用

为什么我们需要激活函数?

正如我们所知,在人工神经元中,输入和权重是给定的,由此计算出输入的加权和,然后将其提供给激活函数,该函数将其转换为输出。所以基本上激活函数被用来将输入映射到输出。这种激活功能有助于神经网络学习数据中的复杂关系和模式。现在的问题是,如果我们不使用任何激活函数,让一个神经元给出输入的加权和作为输出,会怎么样。在这种情况下,计算将非常困难,因为输入的加权和没有任何范围,根据输入,它可以取任何值。因此,激活功能的一个重要用途是将输出限制在特定范围内。激活函数的另一个用途是在数据中添加非线性。我们总是选择非线性函数作为激活函数。让我们看看,为什么它很重要。

为什么我们总是在神经网络中选择非线性激活函数?

非线性意味着不能从输入的线性组合中产生输出。非线性在神经网络中很重要,因为线性激活函数不足以形成通用函数逼近器。如果我们在深度神经网络中使用线性激活函数,无论我们的网络有多深,它都将等同于没有隐藏层的线性神经网络,因为这些线性激活函数可以组合起来形成另一个单一的线性函数。因此,基本上我们的整个网络将被简化为一个单一的神经元,以组合的线性函数作为其激活函数,而这个单一的神经元将无法学习数据中的复杂关系。由于大多数现实世界的问题非常复杂,我们需要神经网络中的非线性激活函数。没有非线性激活函数的神经网络将只是一个简单的线性回归模型。

然而,在神经网络的最后一层,我们可以选择线性激活函数。

通用逼近定理

直接引用维基百科-

普适逼近定理指出,由人工神经元构成的前馈网络可以很好地逼近 Rⁿ.紧集上的任意实值连续函数

简而言之,这个定理表明神经网络可以学习任何连续函数。现在的问题是是什么让它这样做。答案是激活函数的非线性。

消失和爆炸梯度问题-

在反向传播期间的神经网络中,每个权重接收与误差函数的偏导数成比例的更新。在某些情况下,这个衍生项非常小,以至于更新非常小。特别是在神经网络的深层,通过各种偏导数的相乘来获得更新。如果这些偏导数非常小,那么总的更新变得非常小,接近于零。在这种情况下,权重将不能更新,因此将有缓慢或没有收敛。这个问题被称为消失梯度问题。

类似地,如果导数项非常大,那么更新也将非常大。在这种情况下,算法将超过最小值,并且不能收敛。这个问题被称为爆炸梯度问题。

有各种方法可以避免这些问题。选择合适的激活函数就是其中之一

激活功能-

1.Sigmoid 函数-

Sigmoid 是一个“S”形数学函数,其公式为-

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

来源:维基百科

这是 sigmoid 函数的图表。你一定在学习逻辑回归的时候遇到过这个函数。尽管 sigmoid 函数非常受欢迎,但由于以下原因,它并不常用

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

乙状结肠函数(来源:维基百科)

优点-

  1. Sigmoid 函数是连续且可微的。
  2. 它将输出限制在 0 和 1 之间
  3. 非常明确的二进制分类预测。

缺点是

  1. 它会导致渐变消失的问题。
  2. 它不是以零为中心。
  3. 计算成本高

示例-

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

作者图片

2.Softmax 函数-

Softmax 函数是 sigmoid 函数对多类设置的推广。它通常用于多类分类的最后一层。它取一个“k”实数的向量,然后将其归一化为一个概率分布,该概率分布由对应于输入数的指数的“k”个概率组成。在应用 softmax 之前,一些向量分量可能是负的,或者大于 1,并且可能不等于 1,但是在应用 softmax 之后,每个分量将在 0-1 的范围内,并且将等于 1,因此它们可以被解释为概率。

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

来源:维基百科

优点-

它可用于多类分类,因此可用于神经网络的输出层。

缺点是

这在计算上是昂贵的,因为我们必须计算大量的指数项。

示例-

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

作者图片

3.双曲正切值

双曲正切或简称为“tanh”由以下各项表示

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

作者图片

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

作者图片

它非常类似于 sigmoid 函数。它以零为中心,范围在-1 和+1 之间。

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

来源:维基百科

优点-

  1. 它在任何地方都是连续且可微的。
  2. 它以零为中心。
  3. 它会将输出限制在-1 到+1 的范围内。

缺点是

  1. 它会导致渐变消失的问题。
  2. 计算开销很大。

示例-

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

作者图片

4.Relu-

整流线性单元通常称为整流器或 relu

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

作者图片

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

图像来源

优点-

  1. 容易计算。
  2. 不会导致渐变消失的问题
  3. 由于不是所有的神经元都被激活,这造成了网络的稀疏性,因此它将是快速而有效的。

缺点是

  1. 导致爆炸梯度问题。
  2. 不在零中心。
  3. 可以永远杀死一些神经元,因为它总是给负值 0。

示例-

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

作者图片

为了克服 relu 激活中的爆炸梯度问题,我们可以设置它的饱和阈值,即函数将返回的最大值。

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

作者图片

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

图片来源

5.泄漏的 Relu-

漏 relu 是 relu 函数的改进。Relu 函数在每次迭代中会杀死一些神经元,这就是所谓的死亡 relu 条件。Leaky relu 可以克服这个问题,它不会给负值 0,而是使用相对较小的输入分量来计算输出,因此它永远不会杀死任何神经元。

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

来源:维基百科

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

图片来源

优点-

  1. 容易计算。
  2. 不会导致渐变消失的问题
  3. 不会导致将死的问题。

缺点是

  1. 导致爆炸梯度问题。
  2. 不在零中心

示例-

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

作者图片

6.参数化 Relu-

在参数化 relu 中,它不是为负轴固定一个速率,而是作为一个新的可训练参数传递,网络可以自行学习以实现更快的收敛。

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

来源:维基百科

优点-

  1. 网络将自己学习最合适的α值。
  2. 不会导致渐变消失的问题

缺点是

  1. 难以计算。
  2. 性能取决于问题。

在 Tensorflow 中,参数化 relu 被实现为自定义层。示例-

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

作者图片

7.嗖嗖-

swish 函数是通过 x 乘以 sigmoid 函数得到的。

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

来源:维基百科

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

图像来源

swish 功能是谷歌大脑团队提出的。他们的实验表明,在几个具有挑战性的数据集上,swish 往往比 Relu 的深度模型工作得更快。

优点-

  1. 不会导致渐变消失的问题。
  2. 被证明比 relu 略胜一筹。

缺点是

计算成本高

8.ELU-

指数线性单元(ELU)是 relu 的另一种变体,它试图使激活接近零,从而加快学习速度。它比 relu 具有更好的分类精度。elu 具有负值,使得激活的平均值更接近于零。

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

来源:维基百科

优点-

  1. 不会导致将死的问题。

缺点是

  1. 计算开销很大。
  2. 没有避免爆炸梯度问题。
  3. 阿尔法值需要决定。

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

作者图片

9.Softplus 和 Softsign

Softplus 功能是-

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

来源:维基百科

它的导数是一个 sigmoid 函数。

软设计功能是-

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

图像来源

Softplus 和 Softsign 用得不多,一般而言,relu 及其变体比它们更受欢迎。

优点-

  1. 不会导致渐变消失的问题。

缺点是

  1. 计算开销很大。
  2. 比 Relu 慢。

示例-

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

作者图片

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

作者图片

10.卢瑟-

卢瑟代表比例指数线性单位。卢瑟被定义为-

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

图片来源

其中 alpha 和 scale 是常量,其值分别为 1.673 和 1.050。选择 alpha 和 scale 的值,使得只要权重被正确初始化,输入的均值和方差在两个连续层之间保持不变。卢瑟被证明比 relu 更好,并具有以下优点。

优点-

  1. 不会导致渐变消失的问题。
  2. 不会导致死亡的问题
  3. 比其他激活功能更快更好。

示例-

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

作者图片

11.线性激活-

正如我们之前讨论的,我们应该在神经网络中使用非线性激活函数。然而,在用于回归问题的神经网络的最后一层,我们可以使用线性激活函数。

示例-

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

作者图片

如何决定应该使用哪个激活函数

  • 由于消失梯度问题,应避免使用 Sigmoid 和 tanh。
  • 还应避免使用 Softplus 和 Softsign,因为 Relu 是更好的选择。
  • 对于隐藏层,应该首选 Relu。如果它导致了将死的 relu 问题,那么应该使用它的修改版本,如 leaky relu、elu、SELU 等。
  • 对于深度网络,swish 比 relu 表现更好。
  • 对于回归的最终图层,线性函数是正确的选择,对于二元分类,sigmoid 是正确的选择,对于多类分类,softmax 是正确的选择。在自动编码器中应该使用相同的概念。

结论-

我们已经讨论了所有流行的激活函数及其优缺点。还有很多激活功能,但我们并不经常使用。我们也可以定义我们的激活函数。这里讨论的一些激活函数从未用于解决现实世界的问题。他们只是为了知识。大多数情况下,对于隐藏层,我们使用 relu 及其变体,对于最终层,我们根据问题的类型使用 softmax 或线性函数。

学分-

  1. https://keras . io/API/layers/activations/# layer-activation-functions
  2. https://www . analyticsvidhya . com/blog/2020/01/fundamentals-deep-learning-activation-functions-when-to-use-them/
  3. https://towards data science . com/everything-you-need-know-to-know-about-activation-functions-in-deep-learning-models-84ba 9 f 82 c 253
  4. https://towards data science . com/comparison-of-activation-functions-for-deep-neural-networks-706 AC 4284 c8 a
  5. https://missing link . ai/guides/neural-network-concepts/7-types-neural-network-activation-functions-right/
  6. https://en . Wikipedia . org/wiki/Rectifier _(neural _ networks)
  7. https://mlfromscratch.com/activation-functions-explained/#/
  8. https://en . Wikipedia . org/wiki/Universal _ approximation _ theory

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

作者图片

那都是我这边的。感谢阅读这篇文章。使用的少数图片的来源被提及,其余的是我的创作。请随意发表评论,建议改正和改进。通过 Linkedin 与我联系,或者你可以给我发邮件,地址是 sahdevkansal02@gmail.com。我期待听到您的反馈。查看更多这样的文章我的媒体简介。

内容概要:本文详细介绍了CCF-GESP认证的学习资源与知识点指南,分为官方资源与平台、知识点学习与解析、备考策略与工具、实战项目与进阶资源以及学习工具推荐五个部分。官方资源包括CCF数字图书馆提供的免费真题库、一站式学习平台和GESP官网的最新真题下载及考试环境说明。知识点学习部分涵盖Python、C++和图形化编程(Scratch)的核心内容与实战案例。备考策略方面,提出了基础、强化和冲刺三个阶段的分阶段计划,并强调了在线题库模拟测试与社区交流的重要性。实战项目与进阶资源则为不同编程语言提供了具体的应用场景,如Python的智能客服机器人和C++的并行编程与嵌入式开发。最后,推荐了多种学习工具,如代码编辑器VS Code、模拟考试平台和社区支持渠道。 适合人群:准备参加CCF-GESP认证考试的考生,特别是对Python、C++或Scratch编程语言有兴趣的学习者。 使用场景及目标:①帮助考生系统化地学习官方资源,熟悉考试形式和内容;②通过分阶段的备考策略,提高应试能力和编程技能;③利用实战项目和进阶资源,增强实际编程经验和解决复杂问题的能力。 阅读建议:建议考生按照文章中的分阶段备考策略逐步推进学习进度,充分利用官方提供的资源进行练习和模拟测试,并积极参与社区交流以获取更多备考经验和疑难解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值