从冯·诺依曼到记忆增强神经网络
直观的高层次概述
2014 年,两项并行的研究工作推出了记忆增强神经网络(MANNs):神经图灵机和记忆网络从那时起,他们扩展到了一个更广泛的主题,跨越了这些最初的实现。然而,我将坚持高层次的直观概述。这篇文章旨在将过去 7 年的研究浓缩成一篇 7 分钟的文章,去掉那些没有通过时间考验的特定于论文的术语和实现细节。
记忆增强神经网络(MANNs) 是冯诺依曼架构的可微分版本。n 通用存储器与模型参数的其余部分分开,并且与 RAM 类似,存储长期信息。
大象有惊人的记忆力。在一个例子中,23 年后,两只在一起表演的马戏团大象相遇时欢欣鼓舞。大象也认出了曾与它们相处数十年的人类。Tobias Adam 在 Unsplash 上拍摄的照片
传统的冯诺依曼架构区分了 CPU(中央处理器)和三级内存:寄存器 —非常快,但存储能力仅限于几个值;主存储器*(例如 RAM)——速度更快,有足够的存储空间来容纳运行程序的指令和数据,以及外部存储器(例如硬盘)——速度较慢,但有空间存储计算机使用的几乎所有数据。*
记忆增强神经网络(MANNs) 是冯诺依曼架构的可微分版本(下一节将详细介绍)。神经网络的主体可以被认为是 CPU。某些架构,如 RNNs(递归神经网络),具有类似于寄存器的内置存储器,存储短期信息。神经存储器与模型参数的其余部分分离,并且与 RAM 类似,存储长期信息。它由内存插槽阵列(即矩阵)组成,最常见的是存储信息的连续表示(文本、图像等)。)
神经记忆与外部世界的相互作用由控制器调节。图 1 中的 Graves 等人【1】
通过读写操作直接与神经存储器交互的组件称为控制器。在早期的工作中,控制器与模型的其余部分(即记忆之外的所有参数)相吻合,因此它充当了记忆与“外部世界”之间的接口。它通常被实现为一个递归神经网络。最近,随着基于变压器的大规模架构的出现,控制器只是该模型的一个小子集,并协调存储器与网络其余部分之间的通信。
什么是可区分的架构?
曼恩是可微分的,冯诺依曼架构不是——但这到底意味着什么?您可能还记得以下定义:
实变量的可微函数是其导数存在于其定义域内每一点的函数——维基百科。
实变量的函数的导数衡量函数值(输出值)对其自变量(输入值)变化的敏感度— 维基百科。
函数在特定点的导数。图片来自维基百科。
冯·诺依曼体系结构执行不可微运算。例如,考虑一个读操作:当 CPU 从 RAM 中取出下一条指令时,它指定一个地址(输入)并接收回一条指令(输出)。因此,输入域是无符号整数,所以运算不是在实数变量上定义的。根据上面的定义,微分是不可能的。
使操作可区分:软读取和写入
RAM 读取不可区分的核心原因是它们在离散的地址空间上操作。神经记忆提出了一种调整:
不是从单个条目中读取,而是从所有条目中执行加权读取。
对于每个存储槽 i ,控制器指定一个实值权重 wᵢ ,使得所有权重总和为 1。这将读取操作的输入从单个整数值(地址)改变为一个实数值的向量(每个插槽的权重),这是区分性的第一个要求。请注意,这个修改后的操作更加通用:当一个权重设置为 1.0,所有其他权重设置为 0.0 时,我们实际上是从一个条目中读取。同样的推理也适用于写操作:我们用一个加权值 wᵢ * x. 来更新每个条目 i ,而不是将值 x 写入单个内存槽
由于权重 wᵢ.的连续性质,这些操作被称为 软读和写这与硬读写 RAM 形成对比,在硬读写 RAM 时,控制器会对要操作的内存插槽做出硬决定。
计算软权重:基于内容与基于位置的寻址
RAM 的访问基于位置—读操作指定要读取的确切地址。神经存储器通常是基于内容来访问的——查询指定要读取什么,而不是从哪里读取。
控制器如何计算每个插槽的重量 wᵢ ?
首先,关于术语的说明:计算权重的机制 wᵢ 通常被称为内存寻址,因为它决定了哪些内存插槽被寻址*,以及对每个插槽的关注程度。可以基于内容或位置对神经存储器进行寻址。*
作者插图。
利用基于内容的寻址,权重 wᵢ 反映了槽 i 的内容在解析传入查询时的相关程度。例如,对于问答任务,内存查询可以是实际问题的嵌入。然后,控制器必须向上移动作为候选答案的内存插槽。最常见的是, wᵢ 是槽 i 中的内容嵌入和查询之间的点积或余弦相似性。最后,通过 softmax 对所有权重进行归一化,使其总和为 1。
利用**基于位置的寻址、、**,权重、反映了应该对位置 i 给予多少关注,而不管其内容如何。这种技术不太常见;它是由谷歌 DeepMind 的神经图灵机[1]在 2014 年推出的,然后在他们的 2016 年迭代 MANNs [3]中放弃了。最初的理由是,对于某些需要算术运算的任务,如添加两个变量 x 和 y ,重要的是控制器能够从内存中检索操作数 x 和 y 而不管它们的确切值。
降低计算成本:稀疏读写
*使读取和写入可区分会带来计算成本。现在,每个查询都在线性时间 O(N) 内解决,其中 N 是内存槽的数量(相比之下,硬读取和写入需要常数 O(1) 时间)。当网络的输入是长度为 L 的序列(例如文本文档)时,通常对序列中的每个元素进行一次查询——这使得成本高达 O(NL)。训练时,软读写也是内存低效的;计算整个内存的梯度需要复制一份。
后续研究集中在将 O(N) 成本降低到 O(log N) (Rae 等人【2】)或 O(sqrt N) (Lample 等人【4】)。虽然这两种方法非常不同,但它们的共同点是对内存的子集进行操作,而不是对所有条目进行操作。换句话说,他们将非零权重 wᵢ 的数量限制为一个小常数 k(介于 2 和 8 之间),并且仅在非零权重的槽上应用梯度下降。
当前事态
记忆增强的神经网络已经在人工任务(例如,它们学习将序列复制给定次数)、一些自然语言任务(问答、机器翻译)和一些计算机视觉任务(字符识别)中显示出有希望的结果。然而,它们尚未成为主流。在多个方向都有有趣的研究机会:降低它们的计算成本,加快训练速度,了解它们在什么情况下最有用,以及将它们与最先进的变压器集成。
参考
- 格雷夫斯等人,神经图灵机 (2014)
- Rae 等人,利用稀疏读写扩展记忆增强神经网络 (2016)
- 桑托罗等人,使用记忆增强神经网络的一次性学习 (2016)
- Lample 等人,带有产品密钥的大型存储层 (2019)
37 天内从零到全栈 web 开发
以及如何更快地完成它
乔恩·泰森在 Unsplash 上的照片
我是
西蒙。整整一年前,我完成了我的第一个 LinkedIn 学习 Python 课程。我这么做是因为它有市场,而不是因为我喜欢它。我不打算成为一名全栈式的 web 开发人员,或者任何类型的程序员。如果你问我,我宁愿做一个口袋妖怪训练师。
这是
我是如何在 37 天内学会所有技能,构建一个 web 应用程序并将其部署到现场的。我不能回答生活中所有的重大问题,也不能告诉你复活节彩蛋在哪里。然而,如果你是第一次、第一次或第二次尝试,这是一个可以帮助你做得更好的指南。
在线教程告诉你的太少了:他们给你代码,却没有告诉你任何东西的意思,或者警告你有错误。当出现问题时,StackOverflow 会告诉你太多:你必须仔细阅读那些告诉你所有事情的帖子,从如何与你的操作系统进行对话到 Linux 早餐吃了什么。
这就是我来这里的原因。我不会给你所有的代码或者解释如何把你的 Mac 变成汽车人。相反,我会带你了解你的项目应该如何进展,给你指出相关的资源,解释绝对的基础知识,并强调要避免的重要错误。以此作为时间表和补充资源,你应该比我用更少的时间就能拥有制作一个像我这样的 web 应用程序所需要的一切。
注意:我所做的最适合于动态网站(例如,与用户交互,执行功能,产生不同的输出)。如果你想制作静态网站(即拥有不变的内容,如文本和图像),这将是不值得的麻烦——选择 Wordpress 或 Squarespace 这样的网站建设者,以获得最佳投资回报。
Crackshort 的主页——作者图片
我建造了
Crackshort.co,一个使用技术指标回溯测试可定制交易策略的应用。外行:你选择一些股票,一些根据价格变动产生买卖信号的指标,一些管理交易的规则,然后用历史数据测试这个策略。
你可能不是为了营销信息而来的,所以我就不多说了,但是绝对欢迎你来看看这个 37 天项目的成果,也许还可以进行一两次回溯测试。现在,让我们进入你来的目的。
5 月 19 日,我完成了我的第一门 Django 课程——图片来自作者
接下来的一周,我创建了我的本地 Django 项目文件夹——作者图片
我在 6 月 23 日注册了数字海洋,并在两天后(第 37 天)发布了我的网络应用——图片由作者提供
内容
如果链接没有按预期工作,请在新标签中打开它们
- 堆栈
- 视力
- 流程
- 本地构建:让它在你的计算机上工作
- 骨架站点:用 Django 创建基本结构
- App-ify:把静态网站变成一个带 I/O 的 App
- 美化:做设计和前端工作
- 部署:将其连接到互联网
- 更新:维护一个可靠的更新过程
1.堆
在这 37 天的开始,我对 Python 的基础很熟悉,也就是说,我可以编写函数,使用字典,进行文件输入/输出,使用导入的库,等等。我对 Mac 终端也有一点的接触,即我可以使用 cd 、 ls 、 pip 命令。这在以后变得非常重要。
在那之前,我一直专注于在 Jupyter 中做数据分析,所以对 pandas 和 numpy 很熟悉。后一点并不是 web 开发的先决条件,但对于我的项目来说是非常必要的。
我也曾在大约 4 年前的一个在线课程中尝试过 HTML/CSS。这几乎没用,但我相信它确实给了我一点点提升前端学习曲线的动力。不然我就有了零前端经验。
我用的堆栈。徽标属于各自的创作者。
我学会使用的栈如下,从后端到前端(左上右下):
- 后端 IaaS: 数字海洋
- 后端操作系统: Ubuntu Linux
- 后端数据库: PostgreSQL
- 后端语言: Python + Django
- 后端服务器: NGINX + Gunicorn
- 前端:Bootstrap+HTML/CSS/JavaScript
- 其他资源/工具:终端(用于部署期间的编码和 Git)name cheap(用于域名)LinkedIn Learning+stack overflow(用于字面上的一切) Git + Github (SCM,或源代码管理)
提醒一下——这是一个非常实用的演练,所以我不会详细解释每个工具的概念和基本原理。实际上我对他们中的大部分一无所知,仅仅足以让一个网站工作。
2.视力
该应用的愿景是:创建一个模块化回溯测试引擎,允许用户:1)选择一个回溯测试领域(股票和日期范围),2)选择最多 2 个技术指标,3)定义这些指标和止损规则之间的关系,4)选择如何确定每笔交易的规模,5)运行回溯测试,并生成策略结果和一些指标。
应用程序工作流程-按作者分类的图片
该网站的愿景是:制作一个网站,接受用户输入,通过执行计算的 Python 应用和输出一些输出,然后在相同的网页上传递这些输出。
这一愿景告诉我们,我们需要一个独立的 Python 应用程序,它使用单个命令运行并返回单个结果,还需要一个交互式动态网站,它允许用户通过表单输入值。
3.过程
下面是我的过程概述。我犯的主要错误,其中一些花费了我很多时间,用斜体表示。
- 在本地用 Python 构建应用程序
- 用 Django 创建静态网站
- 实现应用程序的输入和输出系统
- 开始使用 Git 进行版本控制
- 美化前端
- 通过 AWS 部署(失败)
- 迁移到 PostgreSQL
- 通过数字海洋部署
- 创建应用程序更新流程并运行多次更新
如果我再做一次,我会遵循以下工作流程:
- 本地构建:从一开始就使用 Git/Github 在本地用 Python 构建应用程序
- 骨架站点:用 Django 创建静态网站,迁移到 PostgreSQL
- App-ify :实现 App 的输入输出系统
- 美化:学习 HTML/CSS/JS,美化前端
- 部署/更新:使用数字海洋,仅在必要时更新
现在,我将更详细地解释理想的工作流程以及如何避免我所犯的错误。
4.本地构建:让它在您的计算机上工作
你需要:
Python,Git/Github,终端(基本)
请参考:
结果:
可以在文本编辑器中运行的应用程序
时间线:
第 0 天
这是您运用基本 Python 技能的地方。在开始创建网站之前,我已经花了很多周的时间来规划、构建和构建本地应用程序,因为就我的技能水平而言,这是一个大项目。
回溯测试平台的功能类似于交易实践的射击场——当用户走进来时,他们可以定义他们的目标(股票),定制他们武器的部分(策略)并选择载入什么(指标)。因此,该应用程序需要有一个预定义的策略,指标和规模方法目录,用户可以从中选择。Backtrader 库提供了应用程序的主要基础设施,交互式经纪人 API (IBPy)最初提供了数据。后来,我改用了 IEX 云 API,因为 IBPy 在本地连接到我的 IB Trader 工作站软件,不能在线工作。
成功运行的应用程序的后期版本——图片由作者提供
我在 Jupyter 笔记本中开发了整个项目,这有点不方便,因为所有的脚本后来都必须转换成。py 文件,然后才能作为 web 应用程序的一部分运行。话虽如此,我还是推荐。对于那些没有尝试过 Jupyter 的人来说,它允许您运行和调试组织到单元中的单独代码,而不是一次运行整个脚本。这对于像我这样经常出错的低技能编码人员以及必须处理大量数据的脚本来说非常有帮助。
饭桶
我很晚才知道,但是使用 GIT/GITHUB。如果你像我一样自学成才,很有可能没人把 Git 塞到你脸上,所以我来做这个荣誉。作为初学者,以下是您需要知道的所有内容:
- SCM 是版本控制软件,Git 是 SCM。
- 简单地说,Git 存储库是一种存储设备,在做了一些更改后,您可以偶尔发送(“推送”)代码文件。
- SCM 跟踪每一次上传(“提交”),所以如果你想的话,你可以回到以前的版本。
- 如果你和其他人一起工作,你也可以从 repo 下载(“克隆”)整个项目,或者从 repo 获得(“拉”)一个更新的版本来覆盖你的本地文件。
- 如果你正在构建一个大的新特性,在一个“分支”上进行编码,这样就不会影响到项目其余部分所在的“主”上,然后在特性准备好的时候将两者“合并”。
Github 是一个在线 Git 回购平台。使用 Git 或 Github 很重要,因为它让你和你的项目有条理——当我开始使用它时,我已经进入了 web 开发阶段,但它让我安心地知道我的更改正在被跟踪,并帮助我从里程碑的角度思考我的进展。此外,一旦你的应用上线,更新它是至关重要的——稍后将详细介绍。如果你还没有,开始使用 Git/Github ( 阅读这里的教程文档,或者阅读罗杰·杜德勒的这份入门指南)。
- 如果你有一个现有的项目,你想推送到一个新的 Github repo:不要添加许可证和自述文件到它上面;在您第一次推进项目后添加它们。它们一开始并不在你的本地项目中,所以如果你试图把你的文件推上来,你会遇到一个错误(见 StackOverflow )。
最终,我把这个项目分成几个部分。py 文件,创建了一堆自定义类,并使应用程序工作。该应用程序的最终结构如下:
粗略的项目结构—作者提供的图片
此时,我可以将输入定义为 FiringRange.py 中的变量,并调用 fire()来运行整个回溯测试,这将在 print()中返回结果。
5.骨架网站:用 Django 创建基本结构
你需要:
Django (basic),PostgreSQL (basic)
请参考:
Django 文档、、LinkedIn 上的“学习 Django”、、LinkedIn 上的“建立个人投资组合”
结果:
一个“网站”,你可以从你的本地主机运行,有一个 PostgreSQL 数据库
时间线:
第 1 天—第 4 天
Django 是一个用 Python 编写的全栈库,它使得创建一个网站结构变得非常快速和容易,如果你完全按照这个过程来做的话。我强烈推荐它,并强烈推荐这个 LinkedIn 学习路径,它包含了整个构建过程中我需要的所有基础知识和工具。Django 的课程无处不在,大多数都能达到目的,但是无论你选择哪一个,都要密切关注,因为有一些小的、容易被忽略的细节会使整个项目停顿下来。
同样,我不会教你 Django,因为这些课程做得更好,但当你参加这些课程时,请确保你特别注意URLs . py、views.py 和模板如何相互关联、如何配置 settings.py、和如何使用 manage.py 访问数据库、运行本地主机和组织静态文件。
因为 Django 的组件是如此错综复杂地联系在一起并且相互依赖,所以您需要有这个基本的图片来避免可能破坏整个链的小错误(例如,视图名称中的输入错误)(例如,URL 找不到要调用的视图)。Settings.py 在部署期间变得特别重要。这里有一个使用我的网站的两个页面的快速概述,动态回溯测试页面(链接到应用程序)和静态关于页面。
我的 Django 项目的基本流程。在这个阶段,你还不需要担心应用程序(firing range . py)——图片由作者提供
有了这个基础,开始你的项目。
- 在您的项目中创建应用程序
- 创建基本的网址:如主页,回测页面,关于页面。
- 创建调用相应模板的基本视图
- 创建仅包含一些占位符 html 文本的模板
- 运行服务器并在浏览器中转到 localhost
准系统代码
您将获得什么—按作者分类的图像
数据库
现在考虑数据库是很重要的,因为它以后会节省你的时间和脑细胞。这很重要,我为这部分做了个标题。
Django 默认使用 SQLite。然而,在生产中(当你的网站上线时),你最终会使用 MySQL 或 PostgreSQL。我使用 PostgreSQL 的原因是:
- 它被用在 LinkedIn 学习课程中
- 它成功了(实际上并不容易——继续读下去)
为了更好地解释数字海洋的数据库选择,请点击这里。更重要的是,当我尝试用 AWS 部署时,我遇到了很多数据库问题,首先是 SQLite,然后是 PostgreSQL ,这最终让我彻底放弃了 AWS。PostgreSQL 和 DigitalOcean 一起工作,所以我坚持使用它。
知道了这一点,我会在这个阶段将我的 Django 项目迁移到 PostgreSQL,而不是在我已经创建了实例和模型之后,我需要额外的步骤来移动。
- SQLite-AWS 问题:AWS Elastic Beanstalk 虚拟机无法找到 Django 所需的 SQLite 版本,我对此无能为力(参见 StackOverflow )
- PostgreSQL-AWS 问题:AWS Elastic Beanstalk 虚拟机首先无法安装 psycopg2,因为它找不到 pg_config ( 参见 StackOverflow ),然后当我安装它时,它找不到 psycopg2
- 对于 Mac 用户:PostgreSQL 需要 psycopg2。psycopg2 需要 pg_config。如果您试图用 pip 安装 psycopg2,pg_config 会阻止您。这个 StackOverflow 页面有所有的答案,但是对我来说最快的解决方法是自制(在答案列表中向下滚动一点)
- 如果你已经有了 SQLite 数据库,现在想转移到 PostgreSQL(像我一样):这个 Github 要点是你需要的神奇修复。
相信我的话,如果你认为 PostgreSQL 是对的,现在就迁移你的项目。为此,遵循 DjangoGirls 教程或 LinkedIn 学习 Django 路径中的建立个人投资组合课程。LinkedIn 课程更详细地介绍了 PostgreSQL。
6.App-ify:把静态网站变成有 I/O 的 App
你需要:
Django(中级;模型、表单、POST/GET 请求)
请参考:
Django 模型文档, Django 表单文档, Django 模板文档,LinkedIn 上的“Django:表单”
结果:
本地“网站”的形式,传递输入到一个应用程序,并显示输出
时间线:
第 5 天—第 14 天
静态网站结构完成后,我们将插入 Python 应用程序并为网站提供 I/O。这将使您深入 Django 领域,所以请准备好花大量时间学习 Django 文档和课程。
在我们现有的 Django 生态系统中,我们需要实现模型和表单:
- 我们输入变量的模型(策略、指标、尺寸)
- 一个输入模型,它定义了每个回溯测试的所有输入——它将有与上述模型链接的策略、指标和大小字段
- 我们的用户将填写的模型表单,其中表单字段对应于输入模型
- 保存回溯测试结果的输出模型
模型是保存在数据库中的数据表;模型中的每一列都是一个数据字段,每一行都是模型的一个实例。然后,这些模型可以与外键相链接。同样,在线课程将很好地解释基础知识,但这里是我的模型如何相互关联。
关系数据库—作者图片
上面,输入模型将策略、指标和 Sizer 模型实例作为其字段的输入。回溯测试 ID 是分配给每组输入的任意数字。在应用程序返回一组输出后,输出以相同的 ID 保存在数据库中,这样每组输出都可以追溯到用户的输入。
下面是这些模型如何与表单和我们现有的 Django 工作流的其余部分相关联。
来回传递表单—作者的图像
视图-模板关系看起来很复杂,但这仅仅是因为我特别想在表单本身所在的页面上显示回溯测试的结果。更详细地说:
- 回溯测试视图调用网页模板首先为用户呈现一个空表单
- 当用户点击“提交”时,网页通过 POST 请求将输入发送到 Backtest 视图(一种处理数据的 HTTP 方法,更多信息请点击
- Backtest 视图检查它是否是有效的 POST 请求,将其保存到输入模型,然后将其发送到 FiringRange.py 应用程序
- 回溯测试视图接收输出,将其保存到输出模型,并将其发送回同一个网页模板
- 如果收到结果,网页模板被告知不要重置表单,并在指定的空间显示输出
如果您希望输出显示在不同的页面上,POST 请求将被发送到不同的视图,这将呈现不同的“结果”模板,但过程是相同的。这是我做的:
用户第一次进入时的新表单—按作者排序的图像
用户提交表单后出现输出—作者提供的图像
当然,这是已经 CSSed 的版本。我在这个阶段混合了很多前端工作,因为我没有耐心,但是我会建议不要这样做,因为必须同时学习 HTML/CSS 和 Django 会大大降低我的速度。
你的网站应该是这样的。资料来源:熊伟·弗雷塔斯
此外,我还实现了一个结果页面和一个编辑特性。如果用户点击“详细结果”按钮,他们将被定向到一个单独的页面,其中包含使用散景为他们刚刚运行的回溯测试生成的图表。在这个结果页面的底部有一个“编辑回溯测试”按钮,如果用户想要返回并对这个特定的运行进行更改。
特定回溯测试运行的结果页面-作者图片
如果用户点击“编辑”,回溯测试视图再次被调用*,并给出用户想要编辑的回溯测试的 ID。回溯测试视图在输入数据库中找到该特定 ID 的输入,并再次呈现回溯测试模板*,但是这一次,将这些输入输入到表单中,而不是显示一个新的表单。**
编辑功能-按作者分类的图像
这是我的回溯测试视图最终的样子:
****7。美化:做设计和前端工作
你需要:
Django,引导程序,HTML/CSS/JS
请参考:
LinkedIn 上的引导文档(示例)、“建立个人投资组合”
结果:
一个好看的,带互动 JavaScript 的本地品牌网站
时间线:
第 15 天—第 24 天
取决于你喜欢什么,这可能是最痛苦或最不痛苦的阶段。我不会在这里阐述太多,因为不会有太多问题,当涉及到美学时,我们都有不同的优先考虑。
我建议看一下引导演示**(上面的链接),选择一两个,打开页面源代码,将整个 HTML 文档复制到你的模板中。这是让你的网站看起来像样并给它一些结构的最快方法,这个过程在“建立个人作品集”课程中有很好的解释。**
我用 Bootstrap 的封面作为我的主页,Navbar 为我的其余页面进行了修复。使用 Django 的“extends”标签,我制作了一个包含 Navbar、通用 CSS 属性和一个空“block”的“base”模板,然后简单地将它应用到我的每个模板中。这是我非常简单的关于页面。
Bootstrap 的卡片(见上例)和网格也很有帮助。卡片使得对内容进行分组和格式化变得非常容易,网格系统使得整个页面布局变得非常快速。
我花了大部分时间在回溯测试输入表单的前端工作。我使用 Django 脆皮形式来快速使它看起来更好——见熊伟·弗雷塔斯的教程。然后,我开始使用 Javascript 和 JQuery 使表单具有响应性。
输入示例 1:使用止损,只有一个指标—作者图片
首先,我需要表单根据用户的策略选择来显示/隐藏止损和指标字段。其次,我需要指标的参数字段来显示/隐藏和更改它们的标题**,以告诉用户他们选择的指标需要什么参数。参考上面和下面的例子来看看这些变化。**
输入示例 2:无止损,使用两个指标—作者图片
对于这些特性,我基本上必须学习基本的 Javascript 和 JQuery 语法,我并不期望深入其中,但我会指出来,以便您做好心理准备。让策略和使用止损字段分别显示/隐藏指标和止损字段相对容易。
上面的代码将事件处理程序附加到文档中的“usestops”和“strategy”元素,这些事件处理程序检查它们的输入是否已被更改为某些值,并相应地显示/隐藏其他元素。使用这个 on()处理程序(在这里了解更多信息)证明比另一个常用的 JQuery 方法**document ready()**)好得多。见下文。
Ready()仅在文档对象模型(DOM)准备好用于 JavaScript 时运行一次,而 on()随时跟踪事件。Ready()对大多数页面都适用,但对我的页面不适用,因为我的表单可以被访问:
- 当用户第一次加载回测页面时
- 用户点击“提交”后,结果出现在旁边
- 在用户点击“编辑”并返回回测页面后
在第二种情况下,文档不会重新加载并再次准备好。
参数字段的更改实现起来要繁琐得多,我就不赘述了,因为您可能不需要这样做,但要点是:
- ****在我的指标模型中增加了字段,为每个指标指定:多少个参数,调用哪些参数,参数的默认值
- 在我的回溯测试视图中增加了一个功能,即获取指标模型中的所有对象**,使用 json.dumps()和 DjangoJSONEncoder 将其打包到 JSON 中,然后**将其发送到回溯测试模板****
- 将 JS/JQuery 添加到我的回溯测试模板中,解析 JSON 以获取指标信息,并使用 more on()方法,检查用户对指标的选择,以相应地显示、隐藏和覆盖表单的参数字段
品牌宣传
最后,烙印。在项目的这一点上,这可能不是你的首要任务,因为你的网站还没有上线,但我还是建议你这么做,因为最终确定网站名称和标志意味着你不必在以后对 CSS 做大的改动,你锁定一个域名。
我对域名搜索所花费的时间以及它对我品牌选择的限制程度感到惊讶,但由于我有一些品牌设计和开发的经验,这并没有造成太大的问题。如果你不知道,这里有一个 2 分钟的品牌速成班:
头脑风暴网站名称。Crackshort 以“射击场”开始,因为我用这个比喻来弄清楚如何使这个回溯测试引擎完全模块化,所以我想用这个想法。我列出了 40 多个名字(当然大部分都是垃圾)。
品牌名称的其他想法:你自己的名字(哈利剃刀,著名的阿莫斯饼干,JP 摩根),主要功能(Suitsupply,脸书),一个形容词(Gamefreak),一个地方(每家报纸,大学和熟食店),真实单词(Twitter,Medium,Crunchyroll),杜撰单词(Zapier,Trello),双关语(Crackshort)
检查域。由于域名的可用性,我的列表缩小到了‘marks mind’,‘Boolsai’(因为 bulls.ai 可能很酷,但已经有人用了),‘Tryfire’,‘Stracer’,‘Tincker’,‘triffy’和‘crack short’。你知道我选了什么。如果你是游戏,现在购买域名给你额外的踢完成这个项目。
超级配色方案—作者图片
做一个配色。这有助于标识,你可以马上将它们插入到你的基本 CSS 中。良好的做法是有一个良好的明暗范围,并侧重于两个主要的对比色-我的是橙色(中心)和海军蓝(右)。在某处记下这些颜色的 RGB/hex 代码,以便参考。
比较金融/交易/教育领域的品牌(Crackshort 在中间)。各自创作者的徽标
为徽标进行头脑风暴/情绪板。徽标可以大致分为文字型和图片型。组合也可以。文字徽标更快(只需选择一种字体并键入名称),但表达性和记忆性较差。如果你选择文字,至少要做一个“完整”版本和一个“缩略图”版本(就像上面 Quantopian 的 Q)。
我选择制作一个带有矢量插图风格的图形标志,以便在金融/交易/教育领域脱颖而出,我觉得在这个领域,品牌一直是文本化的和“安全的”,经常出现图表或烛台之类的图像(Quantopian 除外)。虽然我的网站的事物是整个射击场的隐喻,但我不想将这个品牌与突击步枪和子弹联系起来,所以我选择了左轮手枪枪膛的图像,而噱头将是一个切除的部分,使它看起来像一个 c。
Photoshopping 作者图片
最终—作者提供的图像
活动中的收藏夹图标—作者提供的图片
最后,加上你的配色方案,把它放到你的网站上,你就可以开始了。如果你做了一个 favicon,这是一个出现在浏览器标签中的小东西,你会得到加分。最简单的方法是将你的标志图像放入一个 favicon 生成器以获得一个 ICO 文件,然后将一个<链接>标签放入你的 HTML <头>中。如果您复制了一个 Bootstrap 模板,那么应该已经有一个 favicon 部分,您可以在其中替换代码,如下所示。不要忘记运行 collectstatic 来获取您的。静态文件夹中的 ico 文件。
Bootstrap 的默认中的 Favicon 代码—用 wherever your。ico 文件是—作者提供的图像
8.部署:将其连接到互联网
你需要:
数字海洋,终端(基本)
请参考:
结果:
一个实时网站(在一个定制的 IP 地址上,或者更好,在你的域名上)
时间线:
第 25 天—第 33 天
部署阶段很可能是最痛苦的一步,因为可能会出现无数的问题。如果你有一个非常简单的单页应用程序,如果你仔细遵循每一步,你应该没问题。如果你的应用程序很复杂,有很多依赖,祈祷星星排成一行。
从我对选项的一点点了解来看,如果你想要最少的步骤,就选 Heroku ( 姜戈女孩教程)。如果你想要最便宜的,就用 AWS 弹性豆茎** ( AWS EB 教程)。如果你想要最实际的**,就用数字海洋** ( 数字海洋教程)。为了更深入的比较,阅读这个顺时针方向的软件帖子。请注意,这里的动手并不意味着乏味,它意味着当出现问题时,很可能是你的错,因此可以由你来解决。**
我第一次尝试使用 AWS EB first,由于数据库遇到了障碍。如果您之前错过了数据库部分,以下是主要部分:
- SQLite-AWS 问题:AWS Elastic Beanstalk 虚拟机无法找到 Django 所需的 SQLite 版本,我对此无能为力(参见 StackOverflow )
- PostgreSQL-AWS 问题:AWS Elastic Beanstalk 虚拟机首先无法安装 psycopg2,因为它找不到 pg_config ( 参见 StackOverflow ),然后当我安装它时,它找不到 psycopg2
- 对于 Mac 用户:PostgreSQL 需要 psycopg2。psycopg2 需要 pg_config。如果您试图用 pip 安装 psycopg2,pg_config 会阻止您。这个 StackOverflow 页面有所有的答案,但是对我来说最快的解决方法是自制(在答案列表中向下滚动一点)
- 如果你已经有了 SQLite 数据库,现在想转移到 PostgreSQL(像我一样):这个 Github 要点是你需要的神奇修复。
另外,即使我在 EB 设置中选择了 Python 3.7,它也一直回到 3.6。AWS 有一套强大的服务,但在初始化、破坏和终止无数环境和应用后,我决定减少损失。然而,脱离生态系统比进入生态系统要困难得多——如果你想在尝试过 AWS 之后断开它,请确保你查看了你的帐户的账单部分,并手动终止你在每个 AWS 服务中运行的每个对象/实例/进程。****
去数字海洋。我按照 LinkedIn 的教程(在‘参考’中),几乎没有问题。在 DigitalOcean 上,你在他们的服务器上创建你自己的 Linux 虚拟机,就像一台远程控制的计算机**——你上传你的项目文件,然后使用终端命令,配置和部署。如果你是一个像我一样的 Mac 用户,你会感觉像是在做你已经在这个项目中做过的事情,但是是通过终端。对我来说,这比学习亚马逊的 EB 语法和阅读数百行日志来找出代码出错的地方要直观得多。**
当然没有完美的过程。在 DigitalOcean 中也出现了 psycopg2 问题,但这次因为我拥有了对虚拟机的**完全控制,一个简单的 sudo 安装 ( 参考这篇 StackOverflow 帖子中的顶部答案)让我获得了继续 Postgres 所需的软件包。另请注意 DigitalOcean 根据未知标准要求一些新用户进行身份验证。我不得不上传 ID 和一张自己的照片,这是一个烦恼,但批准在分钟内给予。**
DigitalOcean 需要你自己配置 Gunicorn 和 NGINX,但是步骤很简单,在上面链接的 DigitalOcean Django 教程中有解释。除了知道 Gunicorn 是一个 WSGI 服务器,NGINX 是一个 web 服务器之外,你不需要知道任何关于它们的信息(阅读这个可以快速了解一下),但是如果你感兴趣的话,你可以阅读他们的文档。
关于自定义域名:在这一点上,我还没有购买域名,因为我很便宜,但如果你这样做了,你就不用在应用程序上线后更新新的域名了。我在廉价网上买的,因为 Crackshort.co 和。我查过的其他网站(Google domains,GoDaddy,Name.com)都比这里便宜。
此外,如果你想保护你的品牌,或确保用户不会拼错你的网址,并最终在其他地方,购买多个域名,并重定向到另一个。我买了 Crackshort.co 和 Crackshort.com,因为我喜欢的声音。co 但是。com 仍然是最受欢迎的。
廉价主机记录设置(我的 IP 编辑)——来自 Namecheap.com 的截图
一旦你购买了你的域名,你必须进入 DNS 设置,如上所述,并创建主机记录**,将“@”和“www”主机(即 https://crackshort.co 的和 https://www.crackshort.co)指向你的网站(如果是 DigitalOcean,是 Droplet 的)IP 地址。**
最后,一定要设置 SSL 认证(外行:把你的‘http’改成‘https’),因为这在当今互联网基本是必须的。对于 DigitalOcean/Ubuntu/NGINX 堆栈,您拥有 shell 访问和超级用户(sudo)权限,因此使用 Certbot 获得 SSL 非常简单。否则,大多数主机提供商提供 SSL 证书(对于 Namecheap 来说,这是额外的费用)。
看到左上角那个胜利的 https 了吗?—作者图片
9.更新:维护一个可靠的更新过程
你需要:
数字海洋,Django,Git,谷歌
请参考:
结果:
一个实时网站,您可以随时更新
时间线:
第 34 天—第 37 天
Crackshort.co 正在直播。现在你会认为一切都结束了,但事实并非如此。有几件事你需要考虑。
首先也是最重要的,版权/copyleft 。如果你在你的应用程序中使用了开源代码(如果你照着做的话,你肯定会这么做),在那些库上搜索许可证。在 Github repos 中,这在 About 部分和许可证文件中非常明显。大多数开源代码都在 GPL 许可下,但我不会在这里提供法律建议,所以看看你所使用的是否需要你提供信用或公开你的源代码。这里有一个 GNU 的快速解释。
更新过程
二、如何更新你的 app。我在网上找到的关于这方面的资源很少,但是这个过程的重要性不可低估。这是 DigitalOcean 用户感到困惑的地方,但对 AWS EB 来说并非如此。后者,后端工作打理;在对项目做了一些更改并提交给 Git 之后,您所要做的就是从终端运行一个“eb deploy”命令。
如果你在 DigitalOcean 上,后端工作是你的问题,这是你有纪律地推进 Github 得到回报的地方。参考“参考”中链接的 StackOverflow 帖子。基本流程是:
- 为本地调试配置 settings.py
- 对您的项目进行更改
- 进行迁移:运行python manage . py make migrations
- 为实时部署重新配置您的设置
- 将项目提交给本地 Git,并将推送到远程 Github repo
- 使用 ssh 命令登录您的数字海洋虚拟机
- 激活您的项目所使用的虚拟环境
- cd 到您的项目目录中,并从 Github repo 中拉出**
- 迁移:运行 python manage.py 迁移
- 静态:运行python manage . py collect static
- 重启 Gunicorn 服务器:运行 sudo 服务 gunicorn 重启
补遗:
-
你可以用 Fabric 或 Ansible 来自动化这整个过程,但这不是我的专长,如果你不经常更新,你也不需要这样做
-
如果你在设置中设置一个自定义变量,你的生活会变得更轻松。像这样在本地和实时配置之间切换:
-
建议在本地进行迁移,但是在服务器上迁移,因为迁移是源代码的一部分,不应该在服务器上被篡改;确保本地数据库和服务器数据库相同
-
即使在这次更新中没有创建新的静态文件,也只需运行 collectstatic,因为您可能会忘记
-
一旦完成更新,您不需要重启 NGINX,因为没有对 web 服务器做任何更改,只是对应用程序做了更改(由 WSGI 服务器负责)
因为有这么多的移动部件,而我对每件事都知道得很少,所以我保留了一个. txt,在那里我为自己列出了这些说明。
货币铸造
你没有白白地花 37 天,但是如果你想要除了你妈妈之外的任何流量,你需要让你的网站在谷歌上被索引。在谷歌搜索框中输入“site:yoursite.com ”,看看它是否被索引了。在谷歌搜索控制台上创建一个账户,并按照设置说明进行操作。在这里,您将获得关于您的网站是否被索引和在搜索中排名的基本信息。
要“请求”索引,你应该给谷歌你的网站地图。Django 让创建一个网站地图变得非常简单——阅读网站地图文档或跟随本教程。请注意,您需要在 Django 项目中设置站点地图和站点应用程序— 如果没有站点,您生成的站点地图将不会链接到您的域(您将得到一个包含“example.com”的 XML 文件,其中应该包含您的域)。
你的站点地图 XML 应该是什么样子——作者图片
完成后,将您的 sitemap.xml URL 上传到 Sitemaps 下的搜索控制台,然后等待。之后,谷歌至少需要几天时间来发现和索引你的网站,所以你需要耐心。一旦你被编入索引,有很多方法可以让你的网站在搜索中排名更高,但我还是不会深入讨论,因为相关的资源非常丰富。
在等待的时候,建立一个谷歌分析账户。你需要将谷歌的标签代码添加到你的页面中,但这是值得的,因为你将获得访问者的详细信息,以及他们是如何访问你的网站的。
除了在谷歌搜索中上市,不要忘记其他营销平台,如社交媒体广告和产品搜索。如果你在社交媒体上做广告,一定要小心,不要让你的网站在我的手机浏览器上发疯。
谁会在手机上回测交易策略呢?—作者图片
有几种方法可以开始用你的网站赚钱。最直接的是 Google AdSense ,Google 读取你网站上的内容并自动附上相关广告。然而,这最适合博客;如果你的网站是我这样的 app,上面不会有太多内容,Google AdSense 会拒绝你。
您可以研究的其他方法有:
- 创建付费墙
- 让它免费增值
- 销售其他产品(电子书或附属产品)
- 直接在市场上销售广告空间(但大多数时候你需要经过验证的流量来赚钱)
- 靠快乐用户的捐赠过活
- 或者写一篇 6000 字的博客,希望你能从纽约的早餐车上赚到足够买一小杯咖啡的钱
关于页面的准确性—作者提供的图像
结论
如果你在这里成功了,你现在要么是一个全新网站的所有者,要么是我的女朋友。感谢你参加我的 37 天快速跑,我希望你能学到一些东西,让你从零筹码到满筹码的旅程比我的旅程更轻松、更愉快。
也就是说,很少有什么事情比看到你的应用被人们使用更令人满足的了。找个时间到 Crackshort.co 来喝杯咖啡吧(你请客)。
主要参考文献
- 课程/教程:成为 Django 开发者(LinkedIn Learning)在数字海洋上部署 Django
- Docs: Git , Django , Bootstrap
- stack overflow:SQLite-AWS 版本控制, PostgreSQL-AWS psycopg2 ,用 pip 安装 psycopg 2,移动 Django 数据库,更新应用
Frontpage Slickdeals 与 Pandas 和 Plotly Express 进行数据分析
Slickdeals.com 是一个受欢迎的交易和优惠券网站。我将展示 web 抓取并使用 Slickdeals 数据集执行数据分析
来自 Pexels 的 Andrea Piacquadio 的照片
人们喜欢在购物时省钱。这些交易信息是有价值的用户行为数据,从中可以检索出有趣的问题和答案。Slickdeals.com 是最受欢迎的交易和优惠券网站之一。Frontpage Slickdeals 是社区成员或 Slickdeals 的编辑在过去 24 小时内推荐的交易。交易范围涵盖各种类别,价格从免费到数千美元不等。
在本文中,我们将探索来自 Slickdeals 的数据集,并使用 Pandas 和 Plotly Express 执行数据分析。我希望这篇文章可以提供一些收集原始数据的有趣例子,以及如何使用 Pandas 和 Plotly Express 进行数据分析和可视化的一些见解。
数据收集
作为一名数据专家,我们需要与数据打交道。执行任何类型的 web 分析的挑战性任务之一是时间。由于任何网站的可用数据都是最新的,因此很难追溯之前发生的事情或进行任何类型的时间旅行分析。例如,在 Slickdeals 主页上,如果我们看到一个有 46 个赞的热门交易,我们不知道它会多快到达这里。在这种情况下,web 抓取工具非常有助于为此目的收集数据。详细内容见文章中的一篇如何发现网络抓取的最佳交易
为了收集足够的数据,我以 15 分钟的间隔运行了两周的网络抓取程序,这应该能够捕捉到不同日期和时间的变化。你可以在这里找到两周的数据。
数据解析和清理
在从网络上收集数据一段时间后,我们处于解析和清理阶段。这里,我们添加了包含列名的原始数据,并将日期时间列的格式从字符串更改为日期格式。pandas 提供的一个便利功能是read_csv
功能,我们可以直接从网络上获取数据,并将其转换为 CSV 文件。
url=”https://raw.githubusercontent.com/ChengzhiZhao/jupyter-notebooks/master/slickdeals_data_file.csv"df=pd.read_csv(url,header=None,names=['datetime','store','title','item_url','deal_price','original_price', ‘like’, ‘comments’])df[‘datetime’] = pd.to_datetime(df[‘datetime’])
数据解析和清理(按作者)
收集数据的数据分析
顶级交易是什么?
在这个 Slickdeals 数据集上可以提出一些有趣的问题。其中一个项目是"在 frontpage 交易中最受欢迎的交易是什么?”。为了找到答案,从 Slickdeal 数据集,我们可以比较一笔交易在 Slickdeals 主页上出现的次数。由于网络抓取每 15 分钟发生一次,显示的时间越长,该项目成为最受欢迎的项目的可能性就越大。
然后,我们可以使用下面的代码对所有的标题进行分组并执行计数,然后按降序对计数进行排序,这里的排序将确保 Plotly Express 按顺序显示行。
frequency_frontdeal = df.groupby(['title'])['title'].agg(['count']).reset_index(drop=False).sort_values(by=['count'],ascending=False)
苹果 AirPods Pro
为了形象化,我们可以使用 Plotly Express 为前 20 项交易创建一个漂亮的条形图。
fig = px.bar(frequency_frontdeal.head(20), x=’title’, y=’count’)
fig.show()
从上面的结果来看,“ 苹果 AirPods Pro ”显然被认为是前两周头版头条中的最佳交易。但是我们算重复的了吗?接下来我们将揭晓答案。
顶级交易的趋势是什么样的?
由于“苹果 AirPods Pro ”是唯一的交易,我们选择这一个进行进一步分析,让我们深入研究并探索这种情况下的趋势。为了更好地了解这项交易的受欢迎程度,其中一个衡量标准是有多少人点击了“喜欢”按钮。Slickdeals 可能会使用“喜欢”按钮作为其推荐功能之一。探索“喜欢”的数量随着日期和时间的增加而增加可能是令人兴奋的。
airpod = df[df[‘title’]==’Apple AirPods Pro w/ Wireless Charging Case’].sort_values(by=[‘like’])
fig = px.line(airpod, x=’datetime’, y=’like’)
fig.show()
然而,在图表上绘制数据后,图表看起来很奇怪,我们原本预计会有一条完美的曲线表明增长,但上面的图表看起来像是数字跳回和强制。好像是在流行的起点,我们跟踪了两个数据点。那么问题来了,“有没有重复数据?
来源:网络来自 knowyourmeme
答案是“是的,原因是 Slickdeals 有两个来自不同商店但标题相同的交易。我们可以看到,威瑞森无线公司在 4 月 17 日第一次在头版刊登了这笔交易。几天后,Google Shopping 赶上来了,也在指定时间段内列在了首页。然后谷歌购物开始了。目前还不清楚 Slickdeal 执行重复数据删除流程的算法是为了优先处理第一笔交易,还是其中一笔交易刚刚输掉了竞争。但我们可以从下面的图表中看到,威瑞森的交易持续时间更长,也更受欢迎。为了验证我们的假设,我们可以在折线图中显示这两家商店,color
是一个参数,我们可以设置它来拆分数据,以显示在不同的组中。
airpod.groupby('store')['store'].count()
# store
# Google Shopping 96
# Verizon Wireless 473# With store
fig = px.line(airpod, x='datetime', y='like',color='store')
fig.show()
两个商店一个交易标题(按作者)
热门交易的点赞和评论之间有关联吗?
在frequency_frontdeal
中,我们可以获得前十行,并在图表中绘制它们。然后我们可以观察点赞数和评论数之间的关系。
fig = px.line(transformed_top10_df, x=’datetime’, y=’count’, color=’type’,facet_row=”title”)
fig.show()
喜欢和评论(按作者)
从上图中,我们可以看到评论和喜欢的两种情况都表现出相似的趋势。有些产品的评论甚至比赞还多,这可能是关于这些交易的多条讨论线索,也可能是这笔交易登上头版的另一个原因。
完整代码
最终想法
我们可以执行更多的分析,并从 web 抓取程序中收集更多的字段。从网上收集数据进行分析既简单又便宜。然而,收集数据进行详细分析需要一些时间。我们可以设置一个运行在树莓 Pi 上的网页抓取工具,收集数据。这种解决方案比从第三方购买数据更加灵活。这篇文章展示了使用 Pandas 和 Plotly Express 来分析我们从 web 上获取的数据并执行分析是多么容易,我希望它展示了一种不同的数据收集和分析方法。
希望这个故事对你有帮助。本文是我的工程&数据科学系列的部分,目前包括以下内容:
数据工程和数据科学故事
View list47 stories
你也可以 订阅我的新文章 或者成为 推荐媒介会员 可以无限制访问媒介上的所有故事。
如果有问题/评论,请不要犹豫,写下这个故事的评论或者通过 Linkedin 或 Twitter 直接联系我。
用循环学习率的力量给你的神经网络加油
永远不要限制你的神经网络的能力。让它探索自己的学习能力
来源:https://unsplash.com/photos/WE_Kv_ZB1l0
介绍
为训练神经网络选择最佳学习速率是一项单调乏味的任务,通常是通过反复试验来完成的。
但是,如果你能为你的神经网络提供一系列的学习率值呢?最好的部分是,有一种方法可以在甚至不开始实际训练你的神经网络的情况下,获得最佳的学习速率范围。
多酷啊。
这些很酷的技术是由 Leslie N. Smith 在他的论文 中介绍的,用于训练神经网络 的循环学习率。
通过使用本文中讨论的技术,我们可以在更少的迭代中获得更好的结果。
论文的摘要清楚地说明了这一点:
用循环学习率而不是固定值进行训练可以提高分类精度,而不需要调整,并且通常迭代次数更少
摘要中的陈述得到了针对自适应学习率等其他技术进行的几个实验的支持。
在 CIFAR-10 数据集上使用循环学习率进行训练时,获得了以下结果:
来源:https://arxiv.org/abs/1506.01186
通过循环学习率方法在大约 25,000 次迭代时实现了通过其他方法在 70,000 次迭代时获得的相同精度。
现在,让我们直接进入论文的细节。
这个所谓的循环学习率是什么?
大多数情况下,在传递学习率时,我们只是给神经网络一个固定的值。
但是在使用循环学习率时,我们传递的是最小学习率和最大学习率。
例如,考虑最小学习率为 0.001,最大学习率为 0.01。在训练过程中,学习率将从 0.001(最小学习率)变化到值 0.01(最大学习率),然后再次从 0.01(最大学习率)变化到 0.001(最小学习率),并且该过程继续,直到训练完成。
就像一个循环过程,从最小值开始到最大值,然后又回到最小值。就这么简单。
显然,你可能会有一个问题。
学习率从最小值到最大值需要多少次迭代或多少个时期,反之亦然?
这个问题的答案是步长。
如果步长为 100,那么学习率从最小值到最大值需要 100 次迭代,再需要 100 次迭代才能回到最小值。
作者图片
如上图所示,学习率从最小值 0.0001 开始,在 100 次迭代后达到最大值 0.001,并在接下来的 100 次迭代中再次返回到最小值。
一个完整的周期是返回最小值所需的时间。在上图中,等于 200 次迭代。
一个完整的周期= 2*(步长)
Torch7 代码中给出的实现循环学习的速率是:
Torch7 循环学习率代码
epochCounter —迭代次数
被占领土。LR —学习率的最小值
maxLR —学习率的最大值
但是让我们把上面的代码转换成 numpy:
循环学习率的数值实现
现在,让我们测试我们的 numpy 实现是否按预期工作。为此,让我们运行一个 For 循环,并检查学习率是否像前面讨论的那样从最小移动到最大。
测试我们功能的代码
通过运行上面的代码,我们得到一个如下所示的图:
作者图片
正如预期的那样,我们的学习率从最小值开始,在指定的步长内上下线性移动。
上述技术被称为三角策略。本文还介绍了另外两种技术:
- 三角形 2 —三角形策略和三角形策略之间的唯一区别在于,在每个完整周期结束时,基本学习率和最大学习率之间的差值减半。
- exp_range —这里的学习率从最小值到最大值变化,但唯一的区别是每个边界值(最小值和最大值)以 gamma^iteration(gamma 的指数因子下降,直到迭代。
使用循环学习率训练模型
既然你对什么是循环学习率有一个确切的概念,让我们用循环学习率来训练一个模型,看看它是否比一个单一学习率的模型表现得更好。
为了使我们的实验更快,我们将使用来自 MNIST(改进的国家标准和技术研究所)数据集的一个小子集。让我们从实验开始:
- 导入必要的模块。
导入必要的模块
2.下载 MNIST 数据集。
下载 mnist 数据集
正如我所说的,我们将只下载完整的 MNIST 数据集的一小部分。
3.现在,我们将创建一个自定义数据集类。
自定义数据集类
4.使用 PyTorch 数据加载器构建所需的转换并加载数据集。
加载数据
由于下载的 MNIST 数据集是张量形式的,PyTorch 数据类只接受 PIL(Python 图像库)图像,我们需要将数据集转换成 PIL 图像,并将其转换成张量,然后输入数据加载器。
数据集以这样的方式分割,8000 个数据点用于训练,其余的用于验证(大约 2000 个数据点)。
5.现在让我们创建一个验证函数来计算我们的模型在验证数据上的损失和准确性。
验证功能
6.现在,让我们创建我们的模型。
构建模型
我们将使用 resnet18(没有预训练的权重)作为具有交叉熵损失和 adam 优化器的模型。
7.现在我们都准备好训练我们的模型了。
使用循环学习率进行训练
在数据加载器的每次迭代中,我们将使用循环学习率函数来更新优化器中的学习率值,这个函数是我们之前使用 numpy 实现的。
在上面的代码中,我们使用的步长等于训练数据加载器的两倍,学习率边界在 1e-3 和 1e-2 之间。
我们还将在每次迭代后存储精度值,以便将结果与使用单一学习率训练的另一个模型进行比较。
9.现在,我们将快速创建和训练另一个模型,但只有一个学习率值。
我们将使用之前使用的相同数据集来训练模型。
8.现在,让我们比较我们的模型训练 4 个时期的结果和另一个模型训练 8 个时期的结果,但是具有单一学习率,即 0.001(Adam 优化器的默认值)。
用于比较结果的代码
在上述代码中,术语“acc1”是用单一学习率训练的模型的精度值,术语“acc”是用循环学习率训练的模型的精度值。
上面的代码给出了如下图:
作者图片
从上面的图中可以清楚地看出,使用循环学习率(红线)训练的模型比使用固定学习率(蓝线)训练的模型获得了更高的精度,即使迭代次数更少。
寻找最佳学习率范围
正如我之前说过的,有一种技术可以使用一种技术找到最佳的学习速度范围。这种技术被称为论文中提到的“LR 范围测试”。
有一种简单的方法来估计合理的最小和最大边界值,只需在几个时期内对网络进行一次训练。这是一个“LR 范围测试”。
这是通过将最小学习率设置为小值(如 1e-07)并将最大学习率设置为高值来实现的。然后对模型进行一些迭代训练,然后对每个学习率获得的损失进行绘图。
这在 fastai 库中很好地实现了,但是也有同样的 PyTorch 实现。
但是为此,我们需要使用 pip 安装一个名为 torch-lr-finder 的库,如下所示:
pip install torch-lr-finder
现在我们可以测试学习率的最佳范围,并将其传递到我们的模型中。
我们将通过我们的模型、损失函数、优化器和设备(cuda 或 cpu)来初始化学习率查找器。
我们通过训练数据加载器、验证数据加载器、最小学习率(非常低的值)和最大学习率(非常高的值)来开始学习率范围测试。
运行上面的代码后,我们得到一个带有学习率建议的图,如下所示:
作者图片
从图中,我们可以看到损失值从大约 3e-4 的值继续减小到 1e-3 的值,因此这些值可以用作我们的学习率的最小和最大值。学习率查找器建议的最佳学习率是 5.21e-04,也在此范围内,如果您希望以单一学习率训练模型,可以使用该学习率。
使用 PyTorch 的学习率计划程序
PyTorch 提供了一个学习率调度器来改变学习率,如上所述。
因此,让我们使用 PyTorch 的学习率调度程序来训练一个模型,该模型具有与我们之前使用的相同的架构、超参数、优化器和损失函数。
让我们从 PyTorch 导入学习率调度器,快速构建模型。
正在初始化 CyclicLR 计划程序
现在,我们将训练我们的模型,并使用学习率调度程序来更新学习率。
使用调度器训练模型并更新学习率
从上面的代码中可以看出,在数据加载器的每次迭代之后,学习率会使用调度器进行更新。
在 4 个时期之后,该模型给出了与使用我们构建的循环学习率函数训练的模型相同的准确度(98.2638)。
作者图片
📎需要记住的一些要点是:
- 将学习率从最小值(低值)增加到最大值(高值)可能会有短期的负面影响,但从长期来看,它会产生更好的结果。
- 循环学习率有助于在训练时摆脱鞍点。
- 最好将步长设置为数据加载器在单个历元内迭代次数(或训练数据加载器的长度)的 2-10 倍。
- 最好在周期结束时停止训练,也就是说,当学习率最低时。
- 一个经验法则是将最小学习速率保持在最大学习速率的 1/3 或 1/4。
- 无论何时开始一个新的数据集或架构,学习率范围测试都是获得最佳学习率值或最佳学习率范围的好方法。
结论
这是一个非常棒的技术,可以用在你日常的神经网络训练中。
如果你仍然怀疑循环学习率的能力,那么你一定要看看这篇论文的实验部分,你也应该尝试自己的循环学习率实验,以了解它的能力。
您可以将这种技术与其他方法(如自适应学习率技术)结合起来,以获得强大的模型。
有许多技术在深度学习爱好者中并不流行,这些技术可能会提高您的模型的泛化能力,或者减少训练模型的时间,从而节省您的大量宝贵时间。
如果您希望获得本文中讨论的完整代码,您可以在这个资源库中找到它。
fastText 和 Tensorflow 来执行 NLP 分类
www.camptocamp.org 登山路线分类
fastText 是脸书在 2017 年发布的最先进的开源库,用于计算单词嵌入或创建文本分类器。然而,嵌入和分类器只是数据科学工作中的构建模块。之前有许多准备任务,之后有许多验证任务,并且有许多基于这些工具的候选架构。让我们根据 CampToCamp.org、、、、的登山运动社区站点的数据,制定一个完整的用例。作为深度学习引擎,我们将使用 Tensorflow 2 / Keras。至于验证,我们将使用 UMAP,一个从高维流形到 2D 平面的投影工具。
任务
www.camptocamp.org 是一个山地运动的社区网站。这是一个生动的信息来源,并已成为法国和瑞士阿尔卑斯山的参考。该网站有四个主要部分:一个关于路点和路线的知识库,一个郊游的实时反馈,事故报告和一个论坛。
我们的任务是基于路线数据:给定文本描述,设计并训练一个分类器来标记与十种可能性中的路线相关的活动类型:徒步旅行、山地自行车、滑雪旅行、雪鞋、四种类型的攀登(岩石、冰、山地和混合)、via-ferrata 和 slack-lining。所有与飞行相关的活动(滑翔伞、跳伞……)都没有被列为路线,滑降/度假滑雪也不是该网站的目的。
CampToCamp.org 用户界面中,突出显示了要执行的分类任务
如果每条路线是一个组合,或者如果它有一个冬季和一个夏季变量,则可以用多个活动来标记。每条路线最多有三个活动标签。随着标签的设置,这是一个监督下的训练。
数据
我们将使用从www.camptocamp.org到法国阿尔卑斯山中北部的路线描述(上阿尔卑斯省、伊泽尔省、萨瓦省、上萨瓦省的行政区域)。由于 Camp To Camp 是国际性的,我们希望将重点放在法语版本的描述可能较长且准确的地区。
www.camptocamp.org有一个开放的 Web API [5],虽然没有文档说明,但是通过查看来自网页的 XHR 请求,很容易理解。
路线描述的字长直方图
总共提取了 14,074 条路线。富文本功能(HTML)被删除。610 被删除,因为它们没有法语描述。在用 fastText 或 Tensorflow 计算嵌入之前,标点符号被去掉。
可以进行更多的数据清理和清除,例如非常短的描述或英文描述(语言不匹配),但这是一个parti推进这种数据质量。
预先计算的法语语言模型
文本的嵌入表示,也称为矢量化,在 Mikolov 等人于 2013 年发起的自然语言处理(NLP)中非常常见[3]。它已经在 Word2Vec 这个术语下普及了。有几个著名的实现和预训练模型,例如 GloVe [4]。 fastText 是最先进的算法之一,也是矢量器的实现,它利用了许多改进,比如 Skip-grams,或者连续词包(CBOW)和子词元语法[1]。
预计算嵌入在名称语言模型下交付。鉴于人类语言的复杂性,语言模型训练需要数 GB 的数据。对于 fastText ,提供了 157 种语言模型【2】,这与之前的其他库非常不同。
让我们从法语开始,观察在登山活动中使用的术语的结果。
例如, corde (绳子)被发现靠近:
- cordes (复数形式)
- Corde (首字母大写)
- 科德。(带标点)
- 小绳(小绳子)
- 绳索(绳索套装)
- 菲塞尔(小绳子的同义词)
- 桑乐(扁绳、扁带)
- 记录者(动词)
- 菲林(同义词)
- 小母鸡(小母鸡)
这个单独的观察给了我们一些关于什么是接近的线索(同义词,其他形式,密切相关的对象),以及一些词汇的遗留问题:标点符号,大小写。这个案例没有简单的解决方法,因为一些常用词可能指某个特定的地点,如勃朗峰(即 w 白山)。
fastText 也从三元组中计算类比:计算前两个单词之间的距离,并从第三个单词的相同距离处提取词汇。它并不总是导致有意义的联想,但仍然是相当准确的。例如,用单词滑雪者(去滑雪)滑雪(运动或物体) vélo (自行车),类比输出为:
- 佩达勒(踩踏板,骑自行车)
- promener , balader (挂出)
- 佩达兰特(脚踏)
- 还有意义不大的那种带标点符号的同义词: vélo。a,韦洛。、佩达勒、自行车、韦洛。-,velo
嵌入的 2D 投影
关于嵌入的另一个观点是单词云从高维空间(对于法国模型是 300 维)到 2D 平面的投影。最常见的投影机制是主成分分析(PCA),但还有更先进的技术,如 t-SNE [6]和 UMAP [7]保留项目之间的局部距离。请注意,t-SNE 或 UMAP 的预测是不稳定的:对相同数据的多次运行会导致不同的输出
下面是帆船、自行车和登山运动中一些词汇的嵌入情况。登山和帆船运动被很好地分开,骑自行车在它们之间传播,就像 carte (地图)和 corde (绳索)一样。
现在让我们来设计从攀岩到滑雪的更具体的登山活动词汇:
这幅图像几乎没有结构。即使是看起来很接近的事物,如缆车变体( télésiège、téléski、télécabine )也不总是聚集在一起。
分类
现在让我们执行一个更完整的机器学习任务:根据活动对来自 CampToCamp.org 的路线描述进行分类:徒步旅行、爬山(在岩石上、冰上、混合、在山上、via-ferrata)、滑雪、山地自行车和雪鞋。
每条路线都可以标记多个活动,问题是多类多标签。实际上,大多数路线有 1 个活动,最多有 3 个活动。
比较了四种分类器模型:
-
fastText 法国计算嵌入模型,然后是卷积神经网络(CNN)
-
fastText 建立在语料库上的分类器(多项式逻辑)
-
fastText 建立在语料库上的嵌入,用于向 CNN 提供信息
4.CNN 在第一阶段计算嵌入
经过测试的分类器架构
实现提示
语料库序列(路线描述)在 300(超过 80%更短)或 600 个单词(超过 95%更短)处被填充和截断。
卷积在序列字和嵌入的二维平面上。该架构是经典的漏斗形状(特征空间在网络中越深越小),初始计算层是卷积的,最终层是密集的。主要参数是:
- 层数
- 盘旋的宽度
- 汇集或步幅参数
- 正规化,主要利用辍学
损失是在 sigmoid 激活的输出处应用的分类交叉熵。在训练期间,还通过分类准确度来评估表现。
挑战之一是过度拟合,因为与样本数量相比,参数总数仍然相当高。另一个挑战是,1 类(滑雪旅游)比其他类(占总数的 40%)大得多,而 4 / 10 类低于 5%。如下图所示,除了与一个或多个主要活动相关的活动之外,模型很好地处理了这个问题。例如,雪鞋旅行介于滑雪旅行和夏季徒步旅行之间(大多数人实际上更喜欢滑雪旅行而不是雪鞋旅行)。
真实活动密度(多标签合计> 100%)和使用模型 2(快速文本分类器)的前 1 名预测
测试和验证
与训练数据集相比,测试数据集的验证精度略有不同。它根据以下规则计算前 1 名、前 2 名和前 3 名的准确度:
- Top-1 基于具有最高概率的预测类别,并检查该类别是否在该序列的标签中
- Top-2 基于两个最高的预测概率,并与标签进行比较。在应用于给定序列的标签号是 1 的情况下,由于应用了两个候选类别,所以前 2 个匹配比前 1 个更容易。在将 2 个或更多个标记应用于序列的情况下,与前 1 个统计量的差异不如前一种情况有利。
- 前 3 名与前 2 名相似,但概率最高
根据这一指标,第一个模型表现稍差,而所有其他模型表现相似。这 3 个模型之间的排序取决于初始化和训练测试数据集的划分。这意味着由 fastText 生成的简单高效的分类器的性能与更复杂的 DNN 一样好。
4 个调查模型的前 1 到前 3 名准确度
被错误分类的路径的描述长度直方图类似于所有路径的描述长度直方图。
错误分类的路径描述长度的直方图
让我们检查模型 4 的最后一个 DNN 层输入端的估计值。维数是 64,与取出 10 个候选类的概率(sigmoid 激活)的最后一层的输出相比,它通常更有趣。
由预测的 top-1 活动着色的最后一个 CNN 图层输入投影
路线通常在对应于活动的群中被很好地分开。令人惊讶的是,有一个集群相当遥远,与“徒步旅行”有关。
将颜色编码改为最高精度的“通过”或“失败”,我们看到失败遍布各处,但在簇的薄连接处具有更高的浓度。
由预测的 top-1 活动的准确性着色的最后一个 CNN 图层输入投影
阅读路线描述的一些失败是显而易见的:它很短,不完整,不精确,分类器用纯粹的可能性分配活动。
分类失败,路线描述设置为“完成”
这一点通过观察奇怪的偏远的徒步旅行路线群得到了验证。它由描述为“Info”的路由组成,这可以很容易地被规则检测到,但是分类器已经将它们困住了。
描述设置为“信息”的徒步旅行路线聚类
其他一些更令人不安,如下面的一个,其中活动在描述中被明确命名:
使用包含要预测的活动名称的描述进行分类失败
如果分类器能够更好地理解这种语言的微妙之处,它还可以改进,就像这个旅程描述一样:
分类失败时,描述分析起来相当复杂,并且需要良好的语言模型
结论
对于这个中等复杂度的任务, fastText 简单分类器表现良好,并且计算成本远低于完整语言模型的训练、嵌入的计算和通过 CNN 的分类的关联。
如果任务更复杂,比如计算几个输出(例如:路线的活动和难度),这个分类器可能不够灵活。
哪种嵌入?
我们已经评估了三种构建和使用嵌入的方法,并提供给神经网络:
1.模型 1:使用带有快速文本的预先计算的语言模型
2.模型 3:使用 fastText 从语料库中构建模型并计算嵌入
3.模型 4:直接拟合神经网络中的嵌入
如果语料库的语言不具体,或者如果像偏见这样的伦理问题很重要,第一种解决方案是最好的。
第二种解决方案是同时利用语料库的特定语言和对 fastText 的优化(例如:子词 Ngrams,其对于词汇表之外的词更健壮,因此具有更好的泛化能力)
第三种解决方案是利用嵌入和分类器的组合优化,但是并不比其他方案执行得更好。它还表明 Tensorflow 和类似的工具正在迅速成为执行机器学习的通用工具。没有太多的工程复杂性,定制的解决方案被创建。然而,它缺乏可解释性,如下图所示,这些嵌入是在登山词汇上生成的。
Keras 对登山词汇的嵌入
笔记本电脑
参考
[1] Bag of Tricks for Efficient Text Classification, J. Armand, G. Edouard, B. Piotr, M. Tomas, 2017, Proceedings of the 15th Conference of the {E}uropean Chapter of the Association for Computational Linguistics: Volume 2, Short Papers ([https://www.aclweb.org/anthology/E17-2068/](https://www.aclweb.org/anthology/E17-2068/))[2] Learning Word Vectors for 157 Languages, G. Edouard, B. Piotr, G. Prakhar, J. Armand, M. Tomas, 2018, Proceedings of the International Conference on Language Resources and Evaluation (LREC 2018)} ([https://arxiv.org/abs/1802.06893](https://arxiv.org/abs/1802.06893), [https://fasttext.cc/docs/en/crawl-vectors.html](https://fasttext.cc/docs/en/crawl-vectors.html))[3] Efficient Estimation of Word Representations in Vector Space, T. Mikolov, K. Chen, G. Corrado, J. Dean, 2013 (https://arxiv.org/abs/1301.3781)[4] GloVe, Global Vectors for Word Representation , J. Pennington, R. Socher, C.D. Manning, 2014 ([http://www.aclweb.org/anthology/D14-1162](http://www.aclweb.org/anthology/D14-1162))[5] REST API for [www.camptocamp.org](http://www.camptocamp.org), Github ([https://github.com/c2corg/v6_api](https://github.com/c2corg/v6_api))[6] Visualizing Data using t-SNE, L. Van der Maaten, G. Hinton, Journal of Machine Learning Research, 2008 (http://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf)[7] UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction, McInnes, Healy, Melville, 2018, ([https://arxiv.org/abs/1802.03426](https://arxiv.org/abs/1802.03426))
用优化器优化神经网络训练综述
通过调整 Tensorflow 中的优化器来加速深度神经网络训练
图片由 Greg Rosenke 在 Upsplash 上拍摄
训练深度神经网络是一项极其耗时的任务,尤其是对于复杂的问题。对网络使用更快的优化器是加快训练速度的有效方法,而不是简单地使用常规的梯度下降优化器。下面,我将讨论并展示 5 种流行的优化器方法的训练结果/速度:动量梯度下降和内斯特罗夫加速梯度、AdaGrad、RMSProp、Adam 和 Nadam 优化。
使用不适当的优化器的一个危险是,模型需要很长时间才能收敛到全局最小值,否则它将停留在局部最小值,导致更差的模型。因此,知道哪个优化器最适合这个问题将会节省您大量的培训时间。
优化器调优的主要目的是加快训练速度,但它也有助于提高模型的性能。
1.梯度下降
计算关于每个θ的相关成本函数的梯度,并得到指向上坡的梯度向量,然后使用下面的等式在与向量方向相反的方向(下坡)前进:
作者图片
因此,梯度下降优化器的速度仅取决于学习率参数(eta)。在一个小的学习率下,GD 会在一个平缓的表面上以小而不变的步伐向下,在一个陡峭的表面上以稍快的步伐向下。因此,在一个大型神经网络中,它会重复数百万个缓慢的步骤,直到达到全局最小值(或陷入局部最小值)。因此,运行时间变得非常慢。
在每个历元之后,精确度慢慢增加
还有其他版本的梯度下降,如批量梯度下降(在完整数据集上运行)、小批量梯度下降(在数据集的随机子集上运行)、随机梯度下降— SGD (在每一步选择一个随机实例),并且都有优点和缺点。批量梯度下降可以以非常慢的速度达到全局最小值。小批量梯度下降比 BGD 更快地到达全局最小值,但是更容易陷入局部最小值,并且与其他两个相比,SGD 通常更难到达全局最小值。
2.动量优化
让我们想象一下,当一个球从山顶滚下斜坡到山脚时,它会开始缓慢,然后随着动量的增加而增加速度,最终以很快的速度达到最小值。这就是动量优化的工作原理。这是通过添加一个动量向量 m 并用来自动量向量(m) 的这个新权重来更新θ参数来实现的
梯度下降不考虑以前的梯度。通过添加动量向量,它在每次迭代后更新权重 m 。动量β 是控制终端速度有多快的参数,通常设置为 0.9,但应该从 0.5 调整到 0.9。因此,动量优化器比 SGD 收敛得更好更快。
# Implement Momentum optimizer in Tensorflow
optimizer=keras.optimizers.SGD(lr=0.001, momentum=0.99)
动量收敛更快,最终达到比 SGD 更好的结果
3.内斯特罗夫加速梯度
动量优化器的另一个变体是 NAG。
代价函数的梯度在位置θ+βm 处测量(而不是原始动量优化中的θ)。这背后的原因是动量优化已经指向了正确的方向,所以我们应该使用稍微靠前的位置(大约在θ的下一个位置)来适度加快收敛速度。
# Implement Nesterov Accelerated Gradient optimizer in Tensorflow
optimizer=keras.optimizers.SGD(lr=0.001, momentum=0.9,nesterov=True
NAG 仅取得了比最初势头稍好的结果
4.阿达格拉德
一种自适应学习速率方法,在这种方法中,算法在陡坡上比在缓坡上走得更快。 AdaGrad 在简单的二次问题中表现良好,但在训练神经网络时表现不佳,因为它往往会变慢得太快,并在达到全局最小值之前停止。由于这个缺点,我通常不使用 AdaGrad 用于神经网络,而是使用 RMSProp ,这是 AdaGrad 的替代方案。
5.RMSProp —均方根 Prop
这是最常用的优化器之一,它延续了阿达格拉德的想法,试图最小化垂直移动,并在水平方向朝着全局最小值更新模型。
Adagrad 对第一次迭代的梯度求和,这就是为什么它通常不会收敛到全局最小值,而 RMSProp 会累加前一次迭代的梯度:
# Implement RMSProp optimizer in Tensorflow
optimizer=keras.optimizers.RMSprop(lr=0.001, rho=0.9)
RMSProp 比 Adagrad 收敛得更好,Adagrad 在平稳状态下会丢失
6.圣经》和《古兰经》传统中)亚当(人类第一人的名字
Adam 优化器是 momentum 和 RMSProp 优化器的组合。换句话说,它考虑了过去梯度的指数衰减平均值和过去平方梯度的指数衰减平均值。
有了这些特性,Adam 适合处理具有复杂数据和大量特征的复杂问题上的稀疏梯度。
# Implement Adam optimizer in Tensorflow
optimizer=keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999)
7.那达慕
亚当的另一个变化是那达慕(使用亚当优化与内斯特罗夫技术),导致比亚当稍快的训练时间。
# Implement Nadam optimizer in Tensorflow
optimizer=keras.optimizers.Nadam(lr=0.001, beta_1=0.9, beta_2=0.999)
Adagrad、RMSProp、Ada、Nadam 和 Adamax 是自适应学习率算法,对超参数的调整要求较少。如果模型的性能没有达到您的预期,您可以尝试换回动量优化器或内斯特罗夫加速梯度
最后的话🖖
总之,大多数时候,自适应学习速率算法在速度方面优于梯度下降及其变体,尤其是在深度神经网络中。然而,自适应学习率算法不能确保绝对收敛到全局最小值。
如果您的模型不是太复杂,只有少量的特征,并且训练时间不是您的优先事项,使用动量、内斯特罗夫加速梯度或 SGD 是最佳起点,然后调整学习率、激活函数、改变初始化技术来改进模型,而不是使用自适应学习率优化器,因为后者会阻碍不收敛到全局最小值的风险。
比较不同优化器模型的损失
- 常规 SGD 或常规梯度下降需要更多时间收敛到全局最小值。阿达格拉德经常在达到全局最小值之前过早停止,所以它最终成为最差的优化器。
- 利用时尚 MNIST 数据集,亚当/那达慕最终表现优于 RMSProp 和动量/内斯特罗夫加速梯度。这取决于型号,通常,那达慕比亚当表现更好,但有时 RMSProp 表现最好。
- 以我的经验,我发现 Momentum,RMSProp ,和 Adam (或 Nadam )应该是模型的初试。
摘要
你可以在这里找到源代码。
通过调整初始化、激活函数和批量归一化来提高深度神经网络性能和训练速度的详细说明在这里是。
全栈数据科学:下一代数据科学家
这篇博客文章讲述了如何成为一名机器学习数据科学家,以跟上行业不断变化的需求。
多年来,数据科学一直是一个引人注目的领域,吸引了受过正规教育的年轻人,他们拥有计算机科学、统计学、商业分析、工程管理、物理、数学或数据科学方面的学士、硕士或博士学位。然而,人们对数据科学有很多误解。不再只是机器学习和统计。这些年来,我和很多数据科学的有志之士谈论过进入这个领域。为什么会有关于数据科学的大肆宣传?还是统计学和机器学习能帮你打入这个领域?还会是未来吗?即使我和你们都在同一条船上,但我现在正经历着对进入这一领域的下一代数据科学家的需求是如何塑造的。我不打算教你如何进入数据科学,因为互联网上的许多人已经在做了。
图片来自 Datanami 的 shutterstock
为什么有这么多关于数据科学的宣传?
每个人都想进入数据科学领域。几年前,该领域存在一个供需问题:在 DJ Patil 博士和 Jeff Hammerbacher 提出数据科学这个术语后,数据科学家的供应减少了,需求增加了。但是现在,2020 年,情况有了转机。受过正式/mooc 教育的数据科学爱好者的流入量增加了,需求也增长了,但没有增长到那种程度。这个术语已经变得越来越宽泛,包含了从事数据科学所需的大多数支持功能。我想引用 KD nuggets 中我最喜欢的一句话:
“数据科学就像青少年性行为:每个人都在谈论它,没有人真正知道如何做,每个人都认为其他人都在做,所以每个人都声称自己在做。”
玩笑归玩笑,以下是我认为数据科学接管了所有炒作的一些原因:
- 数据科学家头衔背后的秘密
- 高工作满意度
- 巨大的业务影响
- 许多工作网站将其评为最热门的工作(Glassdoor 评选的美国最近 3 年最热门的工作)
- 前沿发展
- 不断涌入的数据生成
- 感谢许多优秀/不太优秀的学校和训练营提供数据科学学位
- 数据很美!(不是字面意思:p)
自称数据科学家的人?
有人要说了,那我就来撒点目前行业情况的真相吧。由于对闪亮的数据科学家头衔的需求和声望的增加,许多公司已经开始将数据科学家头衔与产品分析师、商业智能分析师、商业分析师、供应链分析师、数据分析师和统计学家交换,因为人们正在离开他们的工作,以获得公司提供的数据科学家头衔。这完全是因为这个词语上的微小变化,许多角色都得到了尊重。因此,公司已经开始扭曲头衔,以同样的方式,使它更闪亮,更受欢迎,比如数据科学家-分析,产品数据科学家,数据科学家-增长,数据科学家-供应链,数据科学家-可视化,或数据科学家-等等。。
大多数追求教育/在线培训的人都有一个误解,即所有数据科学家都建立了花哨的机器学习模型,但这并不总是正确的。至少这是我开始攻读应用数据科学硕士学位时的情况,我认为大多数数据科学家都在进行机器学习,但当我进入美国的实习和就业市场时,我才知道真正的真相。推动人们追求数据科学的力量是由于围绕人工智能及其商业影响的炒作。
下一代数据科学家—机器学习
对于那些想在 2020 年以数据科学家的身份从事应用机器学习的人来说,ML(这是我如何命名这个头衔的,因为它不是数据科学家-分析:p),没有博士学位,现在有更多的东西,而不仅仅是知道将机器学习应用于数据集,今天几乎任何人都可以做到这一点。根据我的经验,还有一些其他重要的事情,可以帮助你在面试过程中确定数据科学家的角色,甚至获得入围名单:
- 分布式数据处理/机器学习:获得技术实践经验,如 Apache Spark ,Apache Hadoop,Dask 等。可以帮助您证明您可以大规模创建数据/ML 管道。对它们中的任何一个都有经验应该是不错的,但是我推荐 Apache Spark(Python 或 Scala 版本)作为首选。
- 生产 ML/数据管道:如果你能获得使用 Apache Airflow 的实践经验,这是一款用于创建数据和机器学习管道的标准开源作业编排工具。这是目前在行业中使用的,所以,建议学习并获得一些围绕它的项目。
- DevOps/Cloud : DevOps 被大多数数据科学有志者所忽视。如果你没有一个基础设施,你将如何构建 ML 管道?在你的本地机器上构建笔记本或运行代码并不像我们在课程中做的那样容易。您编写的代码应该可以跨您或您团队中的其他人可能创建的基础设施进行伸缩。许多公司可能还没有布局好 ML 基础设施,可能正在找人开始。熟悉 Docker 、 Kubernetes ,用 Flask 这样的框架构建 ML 应用程序应该是你的标准练习,即使是在你的课程中。我喜欢 Docker,因为它是可扩展的,你可以构建基础设施映像,并在 Kubernetes 集群上的服务器/云上复制相同的东西。
- 数据库:了解数据库和查询语言是必须的。SQL 很容易被忽视,但它仍然是行业标准,无论是在任何云平台还是数据库上。开始在 leetcode 上练习复杂的 SQL,这将有助于您在 DS 概要文件中进行部分编码面试,因为您将负责从带有持续预处理的仓库中引入数据,这将减轻您在运行 ML 模型之前的预处理工作。大多数特征工程可以在使用 SQL 将数据导入模型的过程中完成,这是许多人忽略的一个方面。
- 编程语言:数据科学推荐的编程语言有 Python、R、Scala、Java。认识他们中的任何一个都没问题,可以做到这一点。对于 ML 类的角色,面试过程中会有现场编码环节,所以你需要在任何你觉得舒服的地方练习——leet code、Hackerrank 或者任何你喜欢的东西。
所以,这个时候,只知道机器学习或统计是不会让你进入数据科学做 ML 的,除非你很幸运,在行业中有一些很好的关系(你显然应该做网络,这非常重要!)或者你名下已经有了一份出色的研究记录。商业应用和领域知识往往来自经验,除了在相关行业实习之外,无法事先学到。
我到底怎么了?
两个月前,我作为一名数据科学家从研究生院一毕业就加入了媒体巨头 ViacomCBS,除了研究助理和实习之外,我没有任何全职的行业经验。我在这里的职责包括从构思-开发-生产构建 ML 产品,我使用上面列出的大部分东西。希望这能对所有有志的数据科学家和试图打入这个领域的机器学习工程师有所帮助。
在 gmail dot com 的[我的名字][我的名字]上提问,或者在 LinkedIn 上联系。
什么是全栈数据科学家?
角色范围和所需技能
图片由 FreeSVG 上的openclipbart提供。许可:公共领域
全栈数据科学家是一个百事通,从头到尾在数据科学生命周期的每个阶段进行设计和工作。
全栈数据科学家的范围涵盖了数据科学业务计划的每个组成部分,从识别到培训,再到部署为利益相关者带来好处的机器学习模型。
数据科学生命周期的基本阶段
全栈数据科学家可以拥有的数据科学生命周期的基本阶段:
- **商业问题。**除非以研究为导向,否则所有数据科学项目都应该从一个问题开始,这个问题可以通过提高效率、自动化或新功能为企业增加价值。
- 数据收集/识别。机器学习需要高质量的数据来建立高质量的模型以供使用。
- 数据探索与分析。在建立模型之前,必须对数据进行分析和理解。
- 机器学习。根据给定的数据训练一个模型来解决业务问题。
- 模型分析和验收。分析模型结果和行为。与利益相关者分享以获得批准。
- 车型部署。让最终用户可以访问模型。
- 模式监控。确保模型在未来的行为符合预期。
万金油:技能组合
列出的高级技能也是成功的数据科学计划的关键。值得强调的是软技能,没有它,数据科学技术可能无法提供价值。
商业头脑
全栈数据科学家必须能够识别和理解可以使用数据科学工具包解决的业务问题(或机会)。
为了优先考虑对他们的组织最有价值的项目和过程流,他们必须理解他们的组织的需求和目标。
最终,如果一个模型不能提供价值,企业就不会在乎它有多酷或多准确。
合作
全栈数据科学家不在真空中工作。他们必须与利益相关方合作,找出可以通过数据科学解决的现有问题或低效之处。一旦发现问题,合作对于确保结果可接受并满足他们的需求是至关重要的。此外,与 SME(主题专家)的协作使他们能够快速工作,例如在组织中查找数据源。
沟通
通过口头和书面媒介与企业进行有效的沟通,可以更好地协作,并向最终用户“销售”模型。这意味着用通俗易懂的语言为非技术受众量身定制数据科学理念、结果和价值。在某些情况下,最终用户在选择使用该模型之前,必须理解并信任它。
识别数据源和 ETL
没有数据就无法训练模型。数据常常不容易获得;需要找到、提取、转换并加载到正确的位置。
编程;编排
一个完整的堆栈数据科学家必须能够编写干净、高效的面向对象的代码,并在生产中可靠地工作。理想情况下,这样的代码应该是模块化的,每个函数或类都要通过单元测试来验证。
数据分析和探索
这种技能是必不可少的,因为没有数据理解就无法建立有用的机器学习模型。
机器学习和统计
或许这是一个既定事实——没有机器学习或统计学,这项工作就不是“数据科学”。一个全栈数据科学家必须能够用合适的机器学习算法进行实验,来解决机器学习问题。
值得强调的是,尽管简单,但有时在机器学习解决方案上实现逻辑或业务规则会给业务带来直接价值。机器学习模型可能需要几周或几个月的时间才能正确,而业务规则目前可能“足够好”。
模型部署/数据工程
最后,全栈数据科学家必须具备将模型管道部署到生产中的技能。模型管道允许最终用户用数据查询模型或以期望的方式访问预先生成的模型结果。如果不存在部署机制,他们必须能够设计和设置这个管道。
如果一个模型没有被部署(或者可能在业务分析中被呈现),那么它是没有用的,并且不提供业务价值。
无主之物:挑战
上一节列出的技能多种多样。
面对如此多样的需求,一个完整的数据科学家不可能掌握所有的技能,尤其是随着技术、算法和工具的进步。相反,这个人必须挑选哪些元素对手头的项目最有用,最值得关注。
全栈数据科学家的两个关键基本技能是设计系统或流程的能力和快速掌握新技术的能力。
好处
另一方面,全栈数据科学家是一个(或两个)数据科学团队。
对于刚接触数据科学的组织来说,他们可以在不立即建立完整团队的情况下创造商业价值。为了最有效地工作,全栈数据科学家应该能够选择和应用正确的工具。
外卖食品
全栈数据科学家在两个方面超越了典型的数据科学家角色:
- 将业务需求与机器学习(或非机器学习)解决方案联系起来
- 将模型部署到“生产”
这两个要素是任何组织从数据科学中获取价值的关键——解决正确的问题并让最终用户能够访问它们。
进一步阅读
14 分钟阅读关于数据科学构成要素的市场观点,数据科学家将继续发展,并经常…
ckmanalytix.com](https://ckmanalytix.com/the-full-stack-data-scientist/)
全栈数据科学家还是大数据项目的超级英雄?
数据科学就业市场的新兴趋势
来源:Pexels.com/@picography
曾经有一段时间,拥有扎实的数学、概率统计、线性代数和一些机器学习背景,再加上出色的数据分析和演示技能,就足以在数据科学领域取得成功。商业智能专家的传统角色已经成熟为数据科学。然而,近年来,数据科学家的工作描述已经从纯粹的数据分析转变为包含更多来自大数据、机器学习和云技术的技能,而不是传统的分析。此外,拥有前端和后端软件开发和 DevOps 方面的丰富专业知识对于数据科学工具箱来说也越来越必要。
如今,以敏捷的方式交付由人工智能(AI)驱动的端到端软件正成为市场的新需求,而不仅仅是一项不错的技能。的确,数据科学不仅仅是数据分析;这是大数据、机器学习和软件工程的结合。两种主要类型的数据科学项目主要与商业分析或开发人工智能软件有关。
对于业务分析项目,数据科学家通常必须访问大数据基础架构并创建数据管道,以从数据中提供可操作的见解。通常,在这些项目中开发的软件是以分析仪表板的形式,为业务决策者即时提供可操作的见解,并帮助他们进行数据驱动的决策。对于软件开发,数据科学家需要使用他们的大数据工程、数据科学、机器学习工程和软件开发技能,在运营软件中部署预测模型。
随着数据科学领域越来越成熟,市场需求和数据科学家技能之间的差距正在扩大。公司高管不再满意每个季度都在 PowerPoint 演示文稿中向他们提供可操作见解的人。尽管如此,他们仍然需要每天访问他们的实时仪表盘,以进行数据驱动的决策。这可能就是为什么对分析仪表板的需求在过去几年中稳步增长的原因。
随着人工智能和大数据分析的现成云解决方案的进步,创建机器学习模型等数据科学日常任务有时会被精通数据的软件开发人员甚至非 IT 人员接管。有时,这种组合对企业来说甚至更好,因为最终,他们需要的是一个部署好的可操作的软件,而不是 Jupyter 笔记本中的高精度模型。
这些因素携手并进,使得数据科学家成长为“全栈”专家成为必要。面对将数据科学和机器学习解决方案部署到企业软件中以及使用大数据和 DevOps 框架的压力,创造了新的全栈数据科学家。如果一个数据科学家建立了一个准确率高达 99%的机器学习模型,这不是一个现成的软件,它对雇主来说已经不够好了!
自然选择选择可以向世界展示自己的人工智能算法,即使这些算法不太智能,也不太适合特定的用例。数据科学家必须学习这些技能中的大部分,才能在竞争中生存下来,并保持他们在行业中薪酬最高、最受尊敬的专家。未来,雇主认为的独角兽数据科学家将成为一种规范,数据科学家必须加快步伐,满足市场需求,以保持竞争优势。
引文: “全栈数据科学是新常态吗?”
关于作者:
Pouyan R. Fard 是 Fard Consulting &数据科学圈的创始人& CEO。Fard Consulting 是一家位于法兰克福的精品咨询公司,为各行业的公司提供服务。Pouyan 在数据科学、人工智能和营销分析方面拥有多年的公司咨询经验,从初创公司到全球公司。他曾与制药、汽车、航空、运输、金融、保险、人力资源和销售等行业的财富 500 强公司合作。
Pouyan 还带领数据科学圈团队在雇主和数据科学人才之间建立职业枢纽。DSC 的使命是通过职业培训培养下一代数据科学家,并帮助雇主找到大数据领域的顶尖人才。
Pouyan 已经完成了关于消费者决策预测建模的博士研究工作,并对开发机器学习和人工智能领域的最先进解决方案保持兴趣。
一个 Twitter 线程中的全栈开发
将你的想法变成现实的端到端步骤
你好,我是尼克🎞 on Unsplash
当形式追随功能
人有想法。很多想法。但是他们有多少次把这些想法变成现实呢?我们脑袋里的东西和创造的东西有明显的区别。
大部分人不做软件。这包括实际软件团队中的许多人。如果你现在不编码,你会认为创建工作软件是别人的工作。也许你想自己开始学习(或重新学习),但认为这需要太长时间,太具技术挑战性,或者只是你不感兴趣。
想法通常以图画、便利贴、模型和“可点击的应用程序”的形式存在,所有这些都可以捕捉想法,但很难验证可行的东西。在一个人的想法和自然允许发生的事情之间有一个过渡点,通过这个过渡,创新实际上发生了。在形式和功能之间有一个美丽的对应,只有一个真正的工作软件才能展示出来。
不做软件的人没有任何借口。不管你的兴趣是什么,如果你想看到你的想法变成现实,那么你需要开发软件。鉴于当今工具的抽象水平,完整的软件可以被快速地创建出来。
软件开发不是给计算机“编程”,而是制作一些真实的东西,与人互动,成为工作经济的一部分。
我最初在 Twitter 上用一个线程写了这篇文章,以展示任何人创建端到端的软件应用程序是多么容易。
有许多错误的机会守门人。你需要正规教育、在线课程或多年丰富经验的假设显然是错误的。每个人都有能力把他们的想法拼凑成实际可行的东西。
让我们开始吧。
这些碎片
你只需要一个浏览器,一个记事本,和你电脑的终端(PC 上的命令提示符)。构建所有应用程序需要几个高级步骤:
- 一页
- 风格
- 布局
- 互动元素
- 事件
- 计算机网络服务器
- 获取/存储数据
人们很少从头开始写程序了。那太慢了。今天我们使用图书馆。我们将使用 JavaScript 和 Python 库。我会用 Azle 做前端的东西(DISCLAIMER
: 我创建了 Azle,但是你可以用任何 JS 库,后端的东西用 Flask。
让我们从我们的页面开始。
页面总是有一个index.html
文件。进入 Azle 主页,点击左上角的 STARTER HTML 图标。复制和粘贴这个到记事本或者任何你想要的编辑器(我会用 TextWrangler ),然后保存文件为index.html
(在你的桌面上)。
从 Azle 中抓取启动 HTML 文件。
每个 web 应用程序都有一个index.html
文件。它是当你加载一个网站或网络应用程序时,你的浏览器指向的页面。让我们把这个文件放在一个叫做my_app
的文件夹中,然后把你的index.html
文件拖到这个文件夹中:
如果右击index.html
文件并选择您的浏览器,您可以查看该页面。这样做将弹出打开您的浏览器,并显示一个空白页。
让我们用样式页面。从 Azle 中获取style_body
代码,然后将粘贴到你的index.html
文件中(在create_azle
函数内):
不要像 Reddit 一样,因为自己丑就觉得自己很酷。去拿一些极简的十六进制代码,把你的页面设计成 2020 年的样子。没有什么比俄罗斯粉彩更能体现我的现代感:
点击上的选择你喜欢的颜色。用新颜色替换style_body
功能中的背景颜色。我会选择比斯开。我们也不想使用标准的浏览器字体,因为唯一比看起来像 Reddit 更糟糕的是看起来像 Craigslist。
谷歌字体 救场。我会选择 Ubuntu。好看又现代。
当然,我们需要让我们的谷歌字体可用。让我们在调用我们的style_body
函数之前加载。在文档中搜索中的“字体”找到load_font
功能):
az.load_font("Ubuntu")
我还将style_body
函数中的min-width
属性设置为 1150px,这样当我调整浏览器大小时页面不会挤压。因为我们只是原型制作一个应用程序,所以我们不关心响应度。
我们的代码现在应该是这样的:
因为这些都在我们的index.html
文件中,我们可以刷新浏览器并查看结果:
这里有 码笔 如果想玩代码的话。尝试更改背景的颜色。当然,改变字体不会有什么影响,因为我们没有显示任何文本。
每当你在本文中看到 CodePen 时,点击它打开一个标签,显示我们当前代码的实时交互版本。根据自己的喜好调整这些值。
我们正在取得进展…
当然,我们的页面上什么都没有。让我们改变这一点。我们将添加一个部分来保存我们的内容。使用add_sections
功能添加 1 个部分:
…刷新您的浏览器:
Azle 的默认部分颜色是蓝色,但是当然,我们可以根据需要改变它。
尝试更改部分的数量。
让我们回到俄罗斯,看看我们是否能找到比蓝色更好的颜色。使用style_sections
函数(位于add_sections
函数的正下方)来设置新部分的样式。为了样式化一个元素,我们必须使用它的类名和实例号来定位它。我们知道我们的部分的类名叫做“my_sections ”,因为我们只创建了一个部分,所以它一定是第一个实例。我们的style_sections
函数看起来像这样:
我将选择苹果谷作为我的部分背景色。我还加了一个6px
的border-radius
来圆角。我将height
设置为auto
,这允许 HTML 元素根据元素内部的内容进行增长和收缩。
因为我们想在页面上安排事情,我们将使用布局。这些只是网格;放置在页面上的框,我们用文本、按钮、滑块、输入等填充。我将使用add_layout
功能添加一个 2 行 1 列的布局:
看起来是这样的:
我希望第一排能守住我的头衔。我将通过使用另一个style_layout
函数将定位到我的布局的第一行来将第一行的高度更改为60px
,该函数直接位于上一个函数的下方:
注意我是如何定位行“my_layout_rows”和第一个实例(行 1)的类名的。刷新浏览器以查看不同之处:
我们在样式函数的花括号中添加的所有内容都是标准的 CSS 样式。当你试图找出如何实现你想要的风格时,只需在网上搜索合适的 CSS。随着时间的推移,你会学到许多造型技巧。
让我们继续展示我们之前加载的 Ubuntu 字体,为我们的应用程序添加一个标题。我们瞄准布局的第一个单元格,使用add_text
函数添加文本:
让增加标题的字体大小,并使居中对齐:
目前为止还不错。现在事情变得更有趣了,因为我们的下一步是向我们的应用程序添加交互元素。
让我们在第二个单元格中添加另一个布局来容纳我们的交互元素。复制我们之前使用的相同布局代码,粘贴在底部。目标我们最初布局的第二个单元格,使用 1 行 2 列,将背景涂成奶油色(或者任何你喜欢的颜色)。我们将add_layout
和style_layout
作为函数添加到前面代码的正下方,如下所示:
注意,我还使用了style_layout
函数的column_widths
属性在列宽之间进行 20/80 分割。
这款应用看起来太“线性”了。让我们通过将边框的border
设置为0
来从最近的布局中移除边框:
这样更干净。然而,我仍然希望我们内部布局的两个单元之间有某种分离。让我们从俄罗斯调色板中为第二个单元格“Squeaky”着色:
请注意,我们的应用程序不再需要任何边框,因为颜色单独划分了我们的布局单元格。让我们通过移除外部布局的(我们添加的第一个)边界来使它最小化和平滑。
这里是此时的密码本。
现在我们准备添加我们的交互元素。我们没有从我们想要创造的任何模型开始,这很好。但是现在可能是一个好时机去思考我们想要的是什么。
当今大多数有趣的应用程序都是数据驱动的。我们可以获取什么样的有趣数据,我们可以使用什么样的模型?当我写这篇文章时,每个人都在想着新冠肺炎。让我们获取新冠肺炎的数据,并使用一个模型来预测病例。
***通常的免责声明 * * * * *别傻了,用这个模型来做关于疫情的现实生活决策。这只是为了演示的目的。
我们想要公开可用的数据,理想情况下作为“ RESTful 服务”(“REST API”)交付。REST APIs 将数据和功能“通过网络”传递到我们的浏览器中,使得创建有趣的应用程序变得更加容易,而无需编写大量代码。
如果有人提供新冠肺炎数据作为 REST API,这意味着我们不必自己存储/管理数据;我们可以直接用它
我在这里找到了一个:https://about-corona.net它是免费的,不需要认证。
REST APIs 有“端点”,我们用浏览器指向这些端点来获取实际数据。查看文档后,我找到了我们将使用的端点:
[https://corona-api.com/timeline](https://t.co/pvWimRKAi3?amp=1)
这给出了全球死亡**、、确诊和痊愈**病例的总数。
任何时候你想看 REST API 的数据是什么样子,只需打开你的浏览器到端点:
为了在我们的应用程序中使用数据,我们不像上面那样访问它,而是使用 JavaScript摄取数据,并将结果解析成某种有用的形式。但首先,让我们回到我们的模型。现在我们已经看到了数据,我们可以考虑我们的应用程序可能的外观和行为。
一个肮脏的模型是我们锚定我们的方法所需要的。这是我用谷歌幻灯片创作的草图:
用户选择一种类型(死亡、已确认、已康复),结果显示在右侧的图表中。然后,用户选择一个“地平线”(未来几天),并单击 FORECAST 在后端运行一个模型,其结果在返回时也会可视化。
有了数据和模型,我们可以开始添加交互 UI 元素。我们需要一个下拉菜单,一个滑块,一个按钮,以及一个线图。先说前 3 个。我将在第一个内部布局单元格中添加一个新布局,以帮助定位我们的元素:
请注意,我将border
设置为1
,这样我就可以看到新的布局:
现在让我们在这些新的单元格中添加我们的 UI 元素。从 Azle 的文档中我们可以得到我们需要的代码。
添加 下拉菜单、滑块和按钮代码到我们的应用程序中:
嘣,现在我们有了 UI 元素:
让我们为我们的应用程序定制这些元素。我们知道下拉列表中需要的选项(死亡、已确认、已康复)。现在添加:
让我们为预测留出最多30
天的时间。将默认值设置为 1 周(7
天),最小值为1
天,最大值为30
天:
让我们将元素居中,将边框从最近的布局中移除。
我们将在新的style_layout
函数前使用all_
前缀,将中心对齐一次应用于所有 3 个单元格:
我还将布局上的边框设置为 0
,因为我们不再需要它。
开发时在 1 和 0 之间切换边框。
halign
和center
确保所有 3 个单元格的内容水平对齐。
现在让我们将添加我们的线图可视化。
现在开始看起来像一个真正的应用程序。对于折线图,我们将使用另一个名为 的库。Plotly 构建在 D3.js 之上,这是一个用 Javascript 编写的行业标准可视化库。
Telsa Motors 和 Standard & Poors 等组织将 Plotly.js 开发与 Chart Studio Enterprise 配对,后者…
t.co](https://t.co/ROsNy5974s?amp=1)
虽然您可以学习 D3.js 本身,但 Plotly 提供了一个抽象层,使开发(更)快速。点击 Plotly 网站上的折线图选项:
我们将将折线图代码复制到我们的应用程序中。首先,我们需要使这个库可用。使 JS 库对应用程序可用的最简单的方法是通过 CDN (内容交付网络)。我们只需将适当的 URL 添加到我们的index.html
文件的头中。我们从 Plotly 的入门页面找到了这个 URL:
现在我们可以在我们的应用程序中使用任何 Plotly 的视觉效果。从 Plotly 的网站上抓取的折线图代码并将其放入一个名为draw_line_chart
的函数中,就像这样:
将它放在index.html
文件中的任何地方,主create_azle
函数之外(所以在底部的任何地方,但是仍然在<script>
标签之内)。看看下一个密码本就知道了。
如果我们调用我们的draw_line_chart
函数,它将在 id 为my_div
的元素中绘制我们的折线图。当然,我们现在没有这样的元素,所以让我们创建一个 HTML 元素来存放我们的情节。
我们将使用 Azle 的add_html
函数。我将给 div 一个名为“hold_chart”的 id:
让我们回过头来,将前面的draw_line_chart
函数中的‘my div’改为’hold _ chart,这样它就能正确定位目标。
我们需要一种方法来调用我们的draw_line_chart
函数。让我们点击预测按钮来绘制我们的折线图。
为了将事件添加到 Azle 的 UI 元素中,我们使用了add_event
函数。让我们向预测按钮添加一个点击事件,如下所示:
如果我们现在单击“预测”按钮,我们将看到绘制的折线图:
看起来很棒。这是最新的密码本。
Plotly 提供了许多现成的东西。我们得到了工具提示、缩放、平移,以及一系列可定制的选项。在 raw D3 里自己做这些并不好玩。
折线图显示的数据只是 Plotly 提供的模拟数据。显然,我们想获得真实的数据。让我们现在做那件事。
我前面提到过,我们将使用 JavaScript 获取其余数据,并将结果解析成某种有用的形式。关于构建依赖提取数据的应用程序,一个重要的事实是数据必须在使用之前可用。
虽然这听起来很明显,但当一个人刚刚开始学习软件开发时,很容易忽略这一点。例如,当我们的用户第一次加载我们的应用程序时,我们希望显示折线图。但是这个线图依赖于可用的数据。
为了确保我们的应用程序的任何部分都可以使用数据,我们使用了所谓的“异步代码”异步代码在调用我们选择的函数之前会一直等待,直到发生了什么事情(例如,数据已经被获取)。
在我们的例子中,我们希望获取新冠肺炎数据,等待直到它在我们的应用程序中可用,然后绘制我们的折线图。JavaScript 通过它的“获取”API 使这一切成为可能。使用 fetch,我们只需指向 REST 服务提供的 URL,并告诉它一旦收到数据该做什么。
让我们使用 fetch 将我们的新冠肺炎数据引入我们的应用程序。我们如何使用它?一个简单的谷歌搜索把我带到了今年的,这很好地解释了这个问题。它告诉我们像这样使用 fetch:
让我们将粘贴到我们的代码中,使用我们在上面找到的新冠肺炎 URL(就在我们的 Plotly 代码之后):
刷新您的浏览器。应用程序本身看起来没有任何不同。但是如果我们打开“浏览器控制台,我们可以看到我们获取的新冠肺炎数据。通过在屏幕上的任意位置右击并点击检查,打开浏览器控制台。然后单击控制台。
你会看到一个物体坐在控制台上。这是我们获取的新冠肺炎数据(注意,我们在上面粘贴的获取 API 显示 console.log(data))。重复单击此对象以查看其结构:
这看起来比我们第一次指向新冠肺炎网址时出现在浏览器中的要好得多。现在我们可以解析这个数据对象,使用它的内容来填充我们的折线图。为此,我们需要对绘制折线图的方式做一点小小的改变。
检查我们之前添加的折线图代码,我们可以看到它使用“跟踪”将原始数据转换为线条。我们需要将获取结果中的数据放入跟踪对象的 x 和 y 属性中:
让我们编写一些 JavaScript 来解析获取的结果。我们需要:1。了解源结构;2.了解目的地结构。我们可以像前面一样,通过在浏览器控制台中检查数据来理解源结构。
目的结构是 Plotly 需要的 trace 对象。我编写了以下函数来获取从 fetch 检索的原始数据,并将其转换为 Plotly 所需的跟踪结构:
函数是我们在软件中对代码进行分组的方式。它们有一个名字,接受参数,并返回一些结果。函数有助于保持代码的模块化和可维护性。
这里重要的是理解这不是解析数据的和方式。这是一种方式。您必须尝试使用 JavaScript,直到找到合适的为止。在线搜索如何解析 JavaScript 对象、遍历对象并返回新的结构。
我的get_dates_and_cases
函数接受提取的数据,一个选择(例如死亡),循环遍历它的内容,提取我需要绘制的片段,并返回 Plotly 的对象。我将编写另一个函数,用我们准备好的数据绘制折线图。
我们可以删除我们添加的原始 Plotly 代码,并使用该函数来代替。它使用我们的第一个函数来准备跟踪数据,然后像往常一样绘制折线图。
请确保保留我们添加的“hold _ chart”div,以便绘图有地方可去。
回想一下,我们的获取代码只获取数据,但不处理数据。一旦数据到达,让我们的 fetch 函数绘制我们的折线图。将我们的原始获取代码更改为如下所示:
最后,移除对当前位于我们的add_event
函数中的draw_line_chart
的调用。我们一会儿再把它加回去。还有,现在还不用担心az.hold_value.fetched_data = data
线。我们稍后再解释。
您当前的代码应该是这样的: CodePen 。
注意,在 CodePen 中,我在 fetch 函数周围包装了一个
setTimeout
。这只是增加了一点延迟,以确保绘制图形时元素在屏幕上。一旦我们在下一步将 fetch 函数移到我们的add_event
内部,这就不是问题了。
我们的 covid 数据现在显示在折线图中。重要的是,只有从 REST API 中完全提取数据后,才会绘制折线图。概括地说,我们使用 JavaScript 中的异步代码从 API 获取数据,然后在数据准备好之后创建一个可视化。
我们还编写了两个函数来准备原始数据和绘制结果。我们越来越接近了:
…尽管我们还没有讨论数据存储。
我们的下一步是允许用户选择一个选择(死亡、确诊、痊愈)来相应地重新绘制折线图。让我们存储返回的数据,这样我们可以在需要时使用它,而不必每次都重新提取数据。
我将把返回的数据保存在一个 JavaScript 对象中。我将像这样使用 Azle 的名称空间:
在浏览器控制台中键入 az.hold_value.fetched_data
,然后点击回车。您可以看到,我们可以通过简单地使用这个对象随时访问我们的新冠肺炎数据。
首先,我们想在用户从下拉列表中做出选择时重新绘制折线图。让我们使用 Azle 的“change
”事件来实现这一点。
为了添加一个事件到我们的元素中,我们使用 Azle 的add_event
函数,就像我们之前对按钮所做的一样,目标是选择的元素,就像我们对样式所做的一样:
如果您刷新浏览器并从下拉列表中进行选择,您应该会看到提示选择。
现在我们只需要重绘折线图而不是调用 alert。我们之前写的draw_line_chart
函数已经准备好了。它已经将数据和选择作为参数,并相应地重新绘制图形。所以我们需要做的就是将draw_line_chart
添加到下拉菜单的add_event
函数中:
注意,我们使用的是存储在az.hold_value.fetched_data
中的数据。我们还使用了一个叫做grab_value
的新 Azle 函数;这允许我们获取用户在元素上选择的任何值(像往常一样,用class name
和class instance
定位)。
让我们看看它是否有效:
太美了。
这是目前的代号。
向其他元素添加事件也是同样的方式。但是这些元素涉及到调用一些后端模型来使用我们的新冠肺炎数据进行预测。因此,在添加其他事件之前,让我们开始处理后端模型。
对于“后端”,我们需要一台服务器来支持计算我们的预测所需的繁重工作。我们可以使用云提供商,如数字海洋或亚马逊网络服务,但是因为我们只是在原型制作想法,我们将使用我们自己的本地计算机。
让前端与后端通信需要一个 web 服务。web 服务将允许我们向服务器发送请求并接收一些回报。这就是我们所需要的,因为我们想从我们的前端给一个后端模型数据,并返回一个预测。
我们将使用一个名为 Flask 的轻量级 web 框架来用 Python 构建我们的 web 服务。让我们现在做那件事。一开始,我们创建了我们的index.html
文件。让我们将另一个文件添加到同一个文件夹中,将其命名为predict.py
:
我只是复制了 index.html 文件,并删除了内容,使一个空的predict.py
文件。
现在我们将添加一些基本的 Flask 代码到我们当前空白的predict.py
文件中。Flask 的文档中有一个快速入门指南,向我们展示了设置所需的最少代码:
我们将需要更多的东西,比如额外的库,以使我们的 web 服务适合我们的目的。下面是我们的predict.py
文件的样子:
在 JavaScript 中,我们使用“cdn”向应用程序添加额外的库,而在 Python 中,我们使用import
语句。上面我们正在导入 Flask,以及“request”和“jsonify”库,这将使我们能够从前端接收数据和向前端发送数据。
我们还设置了一个“路由”,它是我们服务的“端点”。回想一下我们在从 REST API 获取新冠肺炎数据时对端点的讨论。如果你认为我们正在开发自己的 REST API,那么你是对的:)
如今,企业软件中的许多后端机制都以服务的形式提供,作为 REST APIs 使用。这使得修补各种功能以及维护和扩展应用程序变得更加容易。
在我们的predict.py
文件中的“route”下面,我们创建了一个函数。Python 函数看起来和 Javascript 函数不一样,但思想是一样的;一段可以接受参数并返回值的模块化代码。我给我们的函数预测员打了电话。
最后,我们在文件末尾指定“端口”。端口是一个编程的停靠点,它允许外界访问我们的本地系统。我选择了 5000 端口。如果您愿意,您可以选择不同的号码(如果它已经被使用,您的电脑会告诉您)
让我们启动我们的 web 服务,看看它是否工作。如果一切顺利,我们将添加我们的预测模型,并开始为我们的应用程序提供真实的预测,以进行消费和可视化。
到目前为止,我们只是使用浏览器和记事本来创建我们的应用程序。但是现在我们需要直接与我们的操作系统对话,为此我们必须使用终端(PC 上的命令提示符)。
我用的是苹果电脑,所以你在这里看到的一切都会在苹果电脑上。但是同样的一般步骤也适用于 PC。开放终端。在 Mac 中,最快的方法是通过键入“command +空格键”和键入“终端”来使用 Spotlight 搜索:
在终端打开的情况下,通过运行以下命令进入我们的my_app
目录:
cd Desktop/my_app/
…然后按回车键。现在键入:
ls
…然后再次按回车键。
你应该可以看到 index.html 和predict.py
文件。很难相信我们的整个应用程序只有 2 个文件。
由于当今工具中可用的抽象级别,我们只需要最少的代码来创建一个完整的应用程序。
现在,通过运行以下命令来启动我们的 web 服务:
python predict.py
…然后按回车键。
您现在正在运行一个 web 服务,将您的 Python 代码公开给任何能够与之通信的应用程序。考虑到现在 Python 中有这么多高性能的库,这很酷。想想你能创造什么!
我们的后端在" localhost “, port 5000 上被服务,带有一个端点叫做” predict_covid “,接受参数叫做” x “和” y "。要“通过网络”传递所有这些信息,我们可以构建以下 URL:
[http://localhost:5000/predict_covid/?x=100&y=400](http://localhost:5000/predict_covid/?x=100&y=400)
这是在浏览器中使用 URL 时与 REST API 通信的标准方式。那个?标记在第一个参数名之前,而&在第二个参数名之前。在浏览器中打开一个新标签,将上面的 URL 添加到顶部,然后按回车键。您应该看到以下内容:
我们的 web 服务只是返回我们为“x”和“y”传递的值。不太令人兴奋,但它确实证明了我们的 web 服务是有效的。
让我们把它们端到端地连接起来,这样我们用 JavaScript (Azle)编写的前端应用程序就可以向我们的 web 服务(而不是浏览器)传递数据,并从其接收数据。如果我们成功了,剩下唯一要做的事情就是用 Python 构建一个好的预测模型。
我们需要将以下数据传递到我们的后端:
- 下拉选择
- 滑块值
- 日期和案件数量
注意:我们可以在后端获取 covid 数据,而不是通过网络传递它,但是这样我们会获取数据两次。因为我们只预测几个日期和值,所以使用已经从前端获取的数据更有意义。
我们已经知道如何使用 Azle 的grab_value
函数从 UI 元素中“获取”值。我们还在我们的az.hold_value.fetched_data
对象中很好地构造了我们获取的数据。
要将它发送给我们的 web 服务,我们可以再次使用 JavaScript 的fetch
API。相反,让我们在按钮的事件监听器中使用 Azle 的call_api
函数:
下面是正在发生的事情的分类:
我们在按钮上添加了一个“事件监听器”,就像我们之前在下拉菜单上做的一样。我们还在事件的函数属性中添加了 Azle 的call_api
,指定了 Flask 服务的 URL,“x”和“y”参数,以及数据返回时的警告。
刷新浏览器并点击预测按钮:
我们的应用程序正式与我们的后端服务进行交互,向我们的 Python 代码传递数据,并从它接收响应。让我们用我们需要发送的实际数据来替换参数“x”和“y ”,并从滑块值中添加预测范围。
在这里,我从现有的get_dates_and_cases
函数中获取滑块值以及“x”和“y”数据。
我们现在已经安排好了我们的活动:
最后,我们来建立一个预测模型,根据用户选择的类型(死亡、确诊、痊愈)和层位进行预测。经过一番搜索,我找到了一个名为 Prophet 的库,它是由脸书开源的。
脸书最近也发布了他们的神经先知版本。
Prophet 是一个时间序列预测库,有一个针对 Python 的快速入门指南,应该可以让我们开始运行。
我们最终的predict.py
文件从前端接收数据(我们已经知道如何做),准备 Prophet 库所需的数据(如他们的文档中所指定的),训练预测模型,进行预测,并返回结果。
所有这些都在大约 10 行代码中。还不错!(这种抽象又为我们工作了)。
在我们的index.html
文件中,我添加了两个新的函数来为第二次跟踪准备数据(显示预测)。您会看到它与我们为 trace 1 编写的非常相似。我还将新的draw_forecast
函数添加到了我们的call_api
函数的done
属性中。
看看最后的index.html
看看变化。您应该将最后的更改视为熟悉的代码。如果有什么东西看起来很陌生,在网上搜索一下,了解一下为什么它会被添加进来。
让我们最后一次刷新浏览器,看看完整的应用程序。
我们实现了最初清单上的所有目标:
在唱完之前,我想添加一个微调器,当用户点击预测时,他们就知道要等待结果。我还希望 Plotly 图表是透明的,这样我们就可以看到我们有漂亮的蓝色背景。最后,我要改变我们的应用程序的标题,因为它是真实的。
你可以在这里找到最终代码:
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
t.co](https://t.co/8xS6zvu9e3?amp=1)
而这里是 决赛 CodePen 。请注意,因为 CodePen 没有运行我们的后端 web 服务,所以您不会看到预测。但是在您的本地机器上一切都应该正常工作。
这些是构建任何应用程序的主要部分。有了这些技能,你就可以进入软件开发的世界(或者只是把它作为一种爱好来构建东西)。
就是这样。这篇文章可能看起来很长,但是考虑到你刚刚用所有的主要部分制作了一个完整的应用程序,还不算太糟糕。如果你遇到困难,可以在推特上联系我。我们将一起研究代码。不要停在这里。试试其他库。其他用例。其他任何东西。只是建造。
再说一次,机会的唯一看门人是你自己。
全栈熊猫
Python 数据分析
流行数据分析库的鲜为人知的功能
查尔斯·雷在 Unsplash 上的照片
我所知道的最有价值的商品是信息——戈登·盖柯
我确信我的大多数读者都熟悉 Python 中流行的 Pandas 库。该库提供数据结构来帮助操作关系数据。
Pandas 是一个在数据科学从业者中非常受欢迎的库。Hackr.io 被评为十大数据科学库之一。我本人在工作和个人数据科学项目中广泛使用熊猫。
本文将展示这个库的一些鲜为人知的功能。
注:如果你没有太多和熊猫相处的经历,我强烈推荐你阅读下面这本书:
获取在 Python 中操作、处理、清理和处理数据集的完整说明。针对 Python 进行了更新…
shop.oreilly.com](http://shop.oreilly.com/product/0636920050896.do)
用于数据分析的 Python是入门熊猫和 Numpy 的绝佳入门读物。这本书是由熊猫图书馆的创建者韦斯·麦金尼写的。
我个人收藏的 Python 数据科学电子书
内存使用
熊猫图书馆提供两种类型的数据结构,即系列和数据帧。
这两个都有一个方法,分别叫做[pandas.DataFrame.memory_usage(](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.memory_usage.html?highlight=memory_usage#pandas.DataFrame.memory_usage))
和[pandas.Series.memory_usage()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.memory_usage.html?highlight=memory_usage#pandas.Series.memory_usage)
。这些方法提供了这些数据结构的内存使用度量。
请注意,当我们添加了deep=True
选项时,这些数字是如何不同的。这是因为默认情况下,memory_usage()
方法忽略了对象的数据类型。通过设置deep=True
,我们为熊猫对象检索精确的内存占用度量。
在处理非常大的数据集时,跟踪内存使用情况非常关键。通常,机器学习研究人员会从事新型机器学习模型的原型制作。在这样的过程中,一个常见的错误是忽略硬件容量。跟踪内存消耗有助于压缩使用,从而确保顺利的原型开发周期。
表达式评估
Pandas 库支持对其数据结构进行非常快速的矢量化操作。通常,业余数据科学家会使用 Python 的标准运算符对大型数据集进行数值计算。
使用 Pandas 提供的[pandas.eval()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.eval.html?highlight=eval#pandas.eval)
方法可以更有效地执行这样的计算。表达式是通过构造等效字符串来创建的。
为了说明这一点,让我们创建几个各有 100 万行 x 100 列的样本数据帧,并比较计算简单算术所需的时间。
如果我们观察使用 python 操作符与pandas.eval()
计算简单加法运算所花费的时间,Pandas 方法花费的时间几乎少了 5 倍。
与标准 Python 操作符相比,pandas.eval()
方法不仅耗时更少,而且执行计算时消耗的内存也更少。这是因为 Python 操作为每个中间子操作分配内存。例如,在上面的代码中,内存被分配给df_A + df_B
的输出,然后被添加到df_C
等等。
相反,在pandas.eval()
中,整个表达式一次求值。这有助于加速计算,尤其是对于非常大的数据。除了算术运算,pandas.eval()
还支持众多其他运算。
请随意尝试不同类型的操作,以加速您的数据分析项目。
询问
除了表达式求值器,Pandas dataframe 还有一个名为pandas.DataFrame.query()
的查询方法。当使用这种方法时,从 SQL 背景过渡到 Python 的数据科学家将会特别激动。
query()
方法为我们提供了过滤数据帧的非常有效的方法。类似于eval()
方法,query()
方法将字符串形式的表达式作为输入。
查询方法是一种极其简单但功能强大的处理数据的方法。它的好处与eval()
相似,花费的时间更少,消耗的内存也更少。
在传统方法中,上面的查询用 Python 写成这样:
df[(df[‘adults’] > 2) && (df[‘lead_time’] < 40)]
我们可以清楚地看到,与 query 相比,传统方法看起来相当丑陋。因此,在代码审查期间,查询方法也使审查者的生活更加轻松。
插入文字
熊猫有很多方法来处理缺失值。一些比较流行的方法包括isna()
、dropna()
、fillna()
法。
除了前面提到的方法,Pandas 还有一个pandas.interpolate()
方法,在丢失的数据点执行插值。
当需要对数值缺失值进行快速插补时,这种方法非常有用。此外,interpolate()
还可以帮助估计数组中其他两个数值项之间的值。插值在输入法序列分析中有重要的应用,我们不会在这篇文章中讨论。
插值前与插值后
interpolate()
拥有一套强大的数据插值方法。该方法充当流行的 Python 科学计算库 SciPy 的插值方法的包装器。
我强烈推荐阅读这个方法的 API 参考,以便更好地理解它是如何工作的。
测试
通常情况下,数据科学博客(包括我的博客)包含的内容与花哨的算法、库、数学/统计有关,很少提及软件工程原理,如设计和单元测试。因此,我惊喜地发现 Pandas 拥有专注于软件测试的方法。
像pandas.testing.assert_frame_equal
这样的单元测试方法可以形成数据分析的单元测试管道的一个组成部分。
在上面的例子中,我们得到一个断言错误作为输出,因为原始数据帧df
的副本中的一列的数据类型发生了变化。
同样,我们可以使用pandas.testing
方法来测试维度、索引、列名等。我们的数据。
下次你为你的个人/专业数据科学项目开发一个测试驱动的开发环境时,记得结合这些方法。😇
式样
Pandas 的另一个我直到最近才知道的特性是造型 API。对于涉及使用 html 笔记本渲染器(如 Jupyter Notebooks )交流发现(EDA)的数据科学项目,样式 API 尤其方便。Pandas 中的样式提供了一种创建演示就绪表格的方法,以有效地交流见解。
上表是从 Kaggle 上的 FIFA 19 数据库中随机抽取前 100 名足球运动员(基于“总体”栏)创建的。在这个子集上,我们应用pandas.DataFrame.style
的方法来呈现上面显示的漂亮输出。
代码如下:
我们看到,使用 style 中的方法,我们能够使用很少几行代码创建数据表的直观表示。
例如,值和工资列在每个单元格中都有水平条形图,显示一名足球运动员相对于其他运动员的价值和工资。
让我惊讶的是,在保留数据集原始结构的同时,突出显示这些关键信息是多么容易。每个像素呈现更多的信息,而无需添加单独的可视化。
结论
Pandas 是 Python 在数据科学中受欢迎的最大因素之一。这个图书馆的能力真是令人难以置信。
尽管我已经虔诚地使用 Pandas 两年多了,但我并不知道它提供了许多隐藏的功能。希望以后能进一步探索,发现更多俏皮的功能。
本文中使用的其他数据集可以在 Kaggle 这里找到。
代码发布在我的 Github 这里。
如果你喜欢这篇文章,请在 Medium 上关注我。另外,请随时在 LinkedIn 上与我联系。最后,在这些困难时期保持安全。下次见。✋
参考资料:
[1]https://pandas . pydata . org/pandas-docs/stable/reference/index . html # API
[2]https://pandas . pydata . org/pandas-docs/stable/user _ guide/index . html
[3]https://www.kaggle.com/karangadiya/fifa19/data
https://www.kaggle.com/jessemostipak/hotel-booking-demand
https://pythonspeed.com/datascience/
冠状病毒封锁下的儿童有趣的人工智能活动
发现人工智能如何轻松地让您的锁定不那么无聊!
你好,我是尼克🍌 on Unsplash
冠状病毒正使整个地球陷入停顿,既然孩子们将有充足的时间与父母呆在一起,为什么不利用这段时间尝试一些有趣的活动,同时教给他们一些人工智能(AI)呢?
我知道人工智能有时会令人望而生畏,但是下面的例子是为了便于父母使用而特别选择的。你还在等什么?
沃洛德梅尔·赫里先科在 Unsplash 拍摄的照片
liza 是第一批被创造出来的聊天机器人之一(1964)。聊天机器人的工作原理是输入一些东西,它会给你一个答复。答复有些有限;不过,和它聊天还是很好玩,也很安全。正因为如此,强烈推荐给还在学习读写的孩子。
伊莉莎可以在这里找到https://tinyurl.com/AIEx-Eliza
Mitsuku 是目前存在的最先进的聊天机器人之一。它获得了各种奖项,可以谈论大多数话题。由于它是一个先进的聊天机器人,建议年龄较大的儿童使用,因为它可以处理冠状病毒、世界历史等成熟的话题。因此,建议较小的儿童在监护人的陪同下使用。
在这里可以找到三月https://tinyurl.com/AIEx-Mitsuku
语句生成器获取一个图像作为输入,并为该图像创建一个标题。它通过理解组成图像的对象并给它们一个标签来做到这一点。然而,人工智能并不完美,有时它会犯一些错误。可以要求孩子们纠正句子生成器的标题。
句子生成器可以在这里找到https://tinyurl.com/AIEx-See
乔恩·泰森在 Unsplash 上的照片
T hing Translator 给一个物体拍照,并用自然语言(如西班牙语、意大利语等)给我们描述。)我们的选择。孩子们可以很容易地使用它来学习如何使用他们在学校学习的一种外语来发音家里发现的东西。
翻译的东西可以在这里找到https://tinyurl.com/AIEx-Translator
E 莫吉清道夫 Hun t 使用人工智能通过移动设备的摄像头来识别现实世界中的表情符号。它从展示一把钥匙的图片开始,孩子必须在房子里四处寻找一把真正的钥匙。然后,人工智能将使用移动设备的摄像头来验证他是否正确。这个游戏可以帮助小孩子了解房子周围发现的不同物体。
表情符号寻宝游戏可以在这里玩https://tinyurl.com/AIEx-Emoji
Quick,Draw!是一种游戏,用户必须画出某样东西,人工智能必须猜出它是什么。这个游戏适合任何年龄的孩子。
快速抽奖可以在这里玩https://tinyurl.com/AIEx-Draw
影子艺术可以让孩子们仅仅用手来学习如何制作影子木偶。然后,人工智能将通过你的移动设备的摄像头来看他们的手,并决定它是好还是不好!
这里可以使用皮影艺术https://tinyurl.com/AIEx-ShadowArt
桑迪·米勒在 Unsplash 上拍摄的照片
I 一张智能的纸展示了一个程序如何玩井字游戏,并通过遵循简单的规则赢得胜利。
Manuel n Geli 在 Unsplash 上拍摄的照片
emi-conductor 可以让你像真正的指挥一样管理一个真正的管弦乐队。一个人所要做的就是看着移动设备的摄像头并移动他的手!
reddiemeter 是一个卡拉 ok 人工智能,它允许你唱佛莱迪·摩克瑞的歌,然后评价你有多好。这个游戏不仅对正在学习阅读的孩子来说很有趣,对所有的家庭来说也很有趣!
可以在 https://tinyurl.com/AIEx-Freddy 找到测速仪
另一方面,成年人实际上可以通过玩游戏来帮助科学家打败新冠肺炎。点击此链接了解详情。
如果你不知所措,或者只是想联系我,请在下面留下评论,或者通过以下社交媒体账户之一给我发消息🐦推特,🔗 LinkedIn 或者😊脸书。
Alexei DingliProf 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他已经出版了几本同行评审的出版物,并且是马耳他的成员。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。
给 Python 程序员的有趣的情人节“礼物”创意
杰西·戈尔在 Unsplash 上的照片
写一些代码为你的情人做些酷的东西。
情人节就要到了。我还没决定给我妻子买什么礼物。挑选合适的礼物对我来说通常是一项非常具有挑战性的任务,因为我在爱情领域不是一个有创造力的人。大多数时候,我只是用礼品卡送她一些花,因为我只是不想再次犯下送她体重秤的错误,这让她真的很生气,尽管我认为一个支持蓝牙的数字不锈钢智能秤真的很酷。
今年,我想我会做一些不同的事情。在过去的几年里,我开始比以前更多地使用 Python,并且发现一些有趣的项目只需要几行代码就可以完成。在这篇文章中,我想分享三个很酷的迷你项目,它们有可能成为礼物的创意。然而,只是一个快速的免责声明,使用它们的风险由你自己承担,因为这是一个所谓的“书呆子”或“极客”的建议:)
展示你的心
你要做的第一件简单的事情是使用numpy
和mtaplotlib
库画一个心形。因此,首先请确保你已经在你的电脑上安装了这两个软件,比如使用 pip
工具安装它们。将以下代码复制并粘贴到您自己的 Python IDE 中。
如您所知,我们使用公式(x**2+y**2–1)**3-x**2*y**3=0
,其中**表示符号后数字的幂,以生成一系列构成心形的点。
运行上面的代码,你会看到一个如下的红心。你可以用代码来改变尺寸,分辨率,甚至颜色!如果你足够大胆地使用这个礼物的想法,我会把这些任务留给你:)
创建动画图像
另一件有趣的事情是使用imageio
库创建动画图像,它可以从单个静态图像生成动画图像。如上所述,您的计算机需要安装imageio
库。
在你的相册中,找到 10 张或更多适合情人节的图片,放在一个名为“source_images”的文件夹中。在您的 IDE 中运行以下代码。
实际上,您也可以从视频剪辑中创建动画图像。更详细的说明可以参考我的上一篇文章。
创建单词云
我想分享的最后一个想法是,你可以为你爱的人创建一个单词云。为此,我们将使用wordcloud
、imageio
和matplotlib
库。
我编写了一个函数,它接收一个字符串、一个为单词云提供蒙版的图像文件以及所创建的单词云的目标图像文件。此外,我还编写了另一个函数,可以生成色调、饱和度相同但亮度不同的随机红色。我选择了红色,因为这是情人节的主题颜色。
下面提供了完整代码。
就我个人而言,对于字符串,我只是列出了一堆我们已经访问过或计划在不久的将来访问的城市和国家,我创建了一个名为words
的变量来存储这些名称。为了验证概念,我选择了我们从第一个想法中创建的心形图像,保存图像名为plt.savefig(‘heart.png’)
。
>>> words = 'Paris, France, Houston, Vegas, Italy, America, Rome, Austin, Seattle, Miami, London, Boston, Beijing, Shanghai, Macau, Moscow, Venice, Germany, Australia, Netherlands, Detroit'
>>> generate_word_cloud(words, 'heart.png', 'word_cloud.png')
运行上述代码后,创建了如下图。
外卖食品
上述迷你项目只是向你展示了一些有趣的想法,这些想法可能会被用于你的情人节。请通过尝试不同的参数组合来探索这些选项。另外,你可以把这些想法结合在一起,就像我在第三个想法中做的那样。比如你可以制作多个字云,和一些真实的图像混合在一起,创造一些更加个性化的动画形象。
情人节快乐!
参考
有许多数学曲线可以产生心形,其中一些已经在上面说明过了。第一个…
mathworld.wolfram.com](http://mathworld.wolfram.com/HeartCurve.html) [## 使用 Python 创建动画图像
没有 Photoshop?没问题!了解如何从静态图像列表或视频中轻松创建动画图像…
medium.com](https://medium.com/swlh/python-animated-images-6a85b9b68f86) [## 使用自定义颜色-word cloud 1 . 6 . 0 . post 16+gf E0 b 6 ff 文档
编辑描述
amueller.github.io](https://amueller.github.io/word_cloud/auto_examples/a_new_hope.html)
ARMA、VAR 和 Granger 因果关系的乐趣
使用 Stata、R 和 Python
杰克·希尔斯在 Unsplash 上的照片
将你在日食期间看到的东西与夜晚的黑暗相比较,就像将海洋比作一滴泪珠。~温迪·马斯
温迪大概是在暗示,在昏暗的月蚀中,视觉的清晰度比普通的夜晚要清晰得多。或者,与裹尸布时期的黑暗相比,普通的夜晚算不了什么。同样,我觉得时间序列的概念会一直模糊不清,直到数学让它变得更容易理解。即使在日常生活中使用合法数学的重复出现实际上类似于模糊,然而通过数学证明澄清时间序列的强度与利用可测量的统计工具来对抗和设想一些信息相比不算什么。然而,在我的读者跳入大海之前,我希望他们今天能留下“泪珠”。解释是每个夜晚都有月亮,而在晚霞中漫步正是感性的,直到科学交出一些光来看透。这篇文章背后的动机是通过各种工具精确地看到一点时间序列(就像每个夜晚一样),期望数字澄清的模糊不清是不常见的和遥远的,但无疑是重要的,以另一种方式看一看天空。
议程
文章议程,图片来源:(图片来自作者)
白噪声
在文学术语中,白噪声是所有频率的声音同时产生的声音。这是可以听到的,我们也一定听到了。这里有一个链接如果我们还没有。在我们的例子中,白噪声是满足三个条件的时间序列;均值为零、方差不变且序列中两个连续元素之间不相关的序列。白噪声序列是不可预测的,因此表明它不需要任何进一步的分析。为了测试第三个条件,我们通常使用 ACF(自相关函数)图,它测试两个连续观察值之间的相关性。如果相关性不为零,那么该滞后处的棒线将穿过每一侧的边界线。
R 视图
白噪音系列,图片来源:(图片来自作者),图片工具:R
第一个系列具有近似零均值和 1 方差,而第二个系列具有近似 0.5 均值和 0.7 方差。ACF 图没有跨越阈值边界的波段,除了第 0 个滞后(这是观察值与其自身的相关性)。第二个系列的 ACF 图具有明显的滞后相关性。视觉上,我们也可以验证第二系列中的变化。
R代码
Python 视图
白噪音系列,图片来源:(图片来自作者),图片工具:Python
Python 代码
哪个看起来更简单?哪一个更像满月?
平稳性
所有的碱都是碱,但不是所有的碱都是碱。~学校化学
平稳时间序列遵循与白噪声序列几乎相似的条件。固定系列必须满足三个条件:具有恒定平均值、恒定方差且无季节性模式的序列。基本上,一个统计性质如均值、方差、自相关等都随时间恒定的序列。因此,所有白噪声序列基本上是平稳的,但所有平稳序列并不总是白噪声,因为均值可以是大于零的常数。任何时间序列建模的关键步骤是在尝试拟合模型之前将原始序列转换为平稳序列。无需等待日食,公平地说,这类似于在拟合 OLS 模型之前高斯马尔可夫假设是必要的。谢伊·帕拉奇在这里做了出色的工作解释了稳定的原因海洋确实是无限的。底线是用非平稳数据估计模型可能会产生不正确的模型估计。接下来我们来看一些非平稳序列的例子。
非平稳时间序列例子,图片来源:(图片来自作者),图片工具:R,图片代码:链接
流行的平稳性测试
在我们测试平稳性条件之前,最好的事情是了解可以将原始时间序列转换为平稳序列的流行方法。最传统和方便的方法被称为“差异”和“增长率”。还有更多定制的方法,如“去除趋势分量”、“电平移动检测”等,这些方法默认情况下都包含在当今高端时间序列特定的机器学习包中。
差异是从序列中去除随机趋势或季节性的一种非常常见的做法。一阶差分意味着在滞后 1 时简单地取当前和先前观测值的差,而二阶差分在滞后 2 时做同样的事情。增长率方法(有时称为一期简单回归)主要用于金融或宏观经济数据(如人均 GDP、消费支出)。它采用与前一时间段相关的当前观察值的对数(例如 log[xt÷xt-1])。
增广的 Dickey-Fuller (ADF)是最常用的平稳性检验,它遵循自己的增广的 Dickey-Fuller 分布,而不是常规的 t 分布或 z 分布。零假设是数列不平稳,而替代假设是数列平稳。
R 中的 ADF 测试
ADF 测试,图片来源:(图片来自作者),图片工具:R,链接到数据
R 代码
Python 中的 ADF 测试
ADF 测试,图片来源:(图片来自作者),图片工具:Python,链接到数据
Python 代码
我们是否注意到使用这两种工具我们得到了相同的 结果 ,然而在 R & Python 中从 ADF 测试中获得的 p 值仍然有一些差异?嗯,一个可能的答案是两个软件使用的默认延迟是不同的。
在 Stata (Dickey-Fuller)中进行 DF 测试
DF 测试,图片来源:(图片来自作者),图片工具:Stata,链接到数据
滞后=0 时的 ADF 检验成为 Dickey-Fuller 检验。结果可能或可能不总是相似的,但是,在这个特定的例子中,我们观察到相似性(即,原始序列不是静止的,而变换后的序列是静止的)。在使用 Stata 时,零假设是相同的,即数列不平稳,而替代假设是数列平稳。判定规则是,如果检验统计量的绝对值小于 5%临界(来自 ADF/DF 分布),那么我们不能拒绝零,并得出序列不是平稳的结论。因此,上图左侧的两个图表的绝对值小于检验统计量,因此我们无法拒绝零假设。
Stata 代码
ARMA 过程
自回归(AR)模型意味着序列的当前值取决于序列的过去值。对于一个简单的 AR(1)模型,假设序列的当前值取决于它的第一个滞后。参数系数值、相应的标准误差及其 p 值暗示了相关性的强度。假设误差项正态分布,均值为零,方差为σ平方常数。而移动平均(MA)模型意味着一个序列的当前值取决于该序列过去的误差。AR 模型可以表示为无限 MA 模型,反之亦然。ARMA 是一种混合模型,其中当前值考虑了序列中的 AR 和 MA 效应。
基本的 Box-Jenkins 流程图,图片来源:(图片来自作者)
George Box 和 Gwilym Jenkins 提供了一个工作流来预测时间序列数据。尽管该系统具有各种其他表示和定制,但是基本的概述将保持几乎相似。根据问题的性质和预测算法的复杂程度,此工作流可以扩展到分析工作台中的每个细节级别。上面的流程图是我的代表,只是为了记住主要步骤,我敦促我的读者在处理越来越多的时间序列问题时,也做出自己的流程图。
在我让我的读者更进一步之前,我想提一下,阿卡克信息准则(AIC)、贝叶斯信息准则(BIC)或汉南-奎因信息准则(HQIC)在帮助选择最佳模型方面做了同样的工作。我们总是努力寻找一个不太节俭的模型(具有较少的参数),但同时选择上述度量的相对较小的值。IC 越小,残差越小。虽然 AIC 是最常见的,但 BIC 或 HQIC 在惩罚更多参数方面对大数据更先进和更强大。
Stata 中的 ARMA
ARMA(2,1)的输出,图像源:(来自作者的图像),图像工具:Stata,链接到数据
模型迭代输出,ARMA,图片来源:(图片来自作者),图片工具:Stata,链接到数据
ARMA 过程的 Stata 代码
AIC,BIC 得分图,GDP 增长率,ARMA,图片来源:(图片来自作者),图片工具:Python,链接到数据
AIC 在 ARMA (4,2)最小,BIC 在 ARMA (2,0)最小。BIC 提出了一个不太节俭的模型,有 3 个参数,而 AIC 模型有 8 个参数。ARMA(2,0)的 sigma 系数为 0.0052,大于 ARMA(4,2)的 0.0049。ARMA(2,0)的最大对数似然为 461.51,低于 ARMA(4,2)的 466.40。然而,以五个额外参数为代价,我们可能选择 ARMA(2,0) 。适马是模型假设的恒定标准差,用于模型在幕后使用的创新或随机冲击(不相关的零均值随机变量)。在 Stata 中,它是 sigma,但在 R 中,同样的东西显示为 sigma 的平方。
ACF 和残差图,ARMA(2,0),图像源:(来自作者的图像),图像工具:Stata,链接到数据
用于检查模型残差中自相关的 Stata 代码
R 中的 ARMA
ACF 图,GDP 增长率残差,ARMA(p,q),图片来源:(图片来自作者),图片工具:R,链接到数据
AIC,BIC 得分图,GDP 增长率,ARMA,图片来源:(图片来自作者),图片工具:R,链接到数据
ARMA 适马估计,GDP 增长率,ARMA,图片来源:(图片来自作者),图片工具:R,链接到数据
虽然我们的目标是获得一个随机冲击方差最小的模型,但是选择红线意味着相对大量的参数。这样做的成本高于蓝线,因为蓝线需要维护的参数较少。
ARMA 过程的 r 代码
Python 中的 ARMA
ACF 图,GDP 增长率残差,ARMA(p,q),图片来源:(图片来自作者),图片工具:Python,链接到数据
AIC,BIC,HQIC 得分图,GDP 增长率,ARMA,图片来源:(图片来自作者),图片工具:Python,链接到数据
ARMA 过程的 Python 代码
对 ARMA 的观察
图片来源: (图片来自作者),图标来源:( Stata , R , Python )
易于访问:这一点非常清楚,因为 Stata 是一个经过授权的设备,R 和 Python 都是开源的。从今以后,接触任何开源工具都比坐等授权编程简单。
用户友好性:Stata 提供了一个图形用户界面(GUI ),这也是它对学徒或过渡人员更有吸引力的原因。它就像 SPSS、SAS 或 Eviews。它类似于 SPSS、SAS 或 Eviews。我以某种方式了解了我在学习上的差距,我需要学习的主题,以及可用技术的目录。相反,R 和 Python 都是脚本工具,除非我主动,否则它们不会交互。任何前端有图形用户界面的设备在开始的时候都不那么笨拙。结构变得更加精炼,不像在脚本工具中偶然发现的那样。焦点从解释输出转移到首先实际获得输出。我想这是任何此类工具价格高昂的主要原因。
易学性:上述用户友好性的优势无疑使通过 Stata 学习变得简单而有趣。然而,在这种情况下,R & Python 的顺序可能不是固定的,因为它也取决于一个人接触该工具的顺序。我先接触了 R,后来接触了 Python,然而,事情也可能与大多数人相反。
可视化:python 可视化工具的舒适性及其魅力是毋庸置疑的,因为它是一个开源的免费软件。相反,R 显然是接班人。然而,不知何故,我从这个以及其他一些练习中感觉到,尽管与默认的 plot 方法相比,ggplot 可以挽救很多次,但是一开始就利用 python 会更好。如果 python 中有类似于 R 时间序列绘图功能的东西,可以自动调整 x 轴标签,那就更好了。他们确实停用了 sns.ts plots 并引入了 sns.lineplot(),但它并不是每次都与 r 匹配。
ARMA 估计:Stata 在这种特定情况下估计得更好。警告消息“可能的收敛问题:最优给定码= 1”在通过 R 的 ARIMA/ARMA 估计中非常常见,但在大多数情况下,它确实会生成除 p 值和标准误差之外的大多数输出。除此之外,异方差校正的标准误差有些难以实现,除非手动编码。与 R 不同,在 python 中可以很容易地访问异方差校正的标准误差,但是,statsmodels.tsa.arima_model 中的 ARIMA 函数通常会令人惊讶地停止工作。它迫使我们改用 SARIMAX。这就是为什么我们得到的 ARMA(1,1)与 Stata 或 r 中的 ARMA(2,0)非常接近。普通 ARMA/ARIMA 不允许由于滞后多项式反演而覆盖强制平稳性或可逆性。理想情况下,ARMA 过程也可以转换为滞后多项式项,并且它不能放在此函数中,这与 SARIMAX 不同。详细讨论可以在这里找到。
可伸缩性:在大多数情况下,python 比任何其他工具都更受青睐。在这种特定情况下,我不知何故发现了在各阶之间迭代以估计模型系数的过程,并且在 5 乘 5 矩阵上绘制残差相对比 R 更容易、更轻便。老实说,在这个示例中使用 R 也很有趣,我无意贬低这个几乎同样强大的工具。
向量自动回归
乍一看,VAR 似乎是单变量自回归模型的简单多变量推广。乍一看,它们被证明是现代宏观经济学中的关键实证工具之一。~Del Negro 和 Schorfheide
研究人员发现,( p,q)阶的 ARMA 过程可以转化为§阶的 AR 过程。因此,任何两个或多个序列的 AR§过程都可以转化为 VAR§过程。在我们上面的例子中,我们看到了两个不同的序列,120 个时间点的人均 GDP 和消费支出。这两个单独的序列会有自己的 ARMA(p,q)过程。基于 Box-Jenkins,我们推导出,一旦我们在每个序列中实现平稳性,我们可以在 AR§和 MA(q)的不同值上迭代该序列,并选择 ARMA(p,q)的阶数,其中我们具有最小的 AIC、BIC 或 HQIC。在这种情况下,人均 GDP 的平稳序列是 GDP 增长率,根据我们使用的工具,它遵循 ARMA(2,0)或 ARMA(1,1)。此外,平稳的消费支出序列可以是其增长率遵循 ARMA(1,0)过程。
AIC,BIC 得分图,消费增长率,ARMA,图片来源:(图片来自作者),图片工具:R,链接到数据
当我们要处理多个线性时间序列时,需要向量自回归的基本框架。如果我们考虑两个序列 X 和 Y,那么 VAR 运行两个回归模型。第一个方程组根据 X 和 Y 的过去滞后值以及 X 的一些误差项来回归 X。类似地,在第二个方程组中,我们根据 Y 和 X 的过去滞后值以及 Y 的一些误差项来回归 Y。滞后的阶数可以从 0 阶到 p 阶,就像 AR§模型或 ARMA(p,q)模型一样。如果我们有 3 个多元线性时间序列要处理,那么我们将有 3 个回归方程组,如果我们有 4 个多元线性时间序列要处理,那么我们将有 4 个回归方程组,因此如果有 k 个多元线性时间序列要处理,那么我们将有 k 个回归方程组。
VAR(2)模型,图片来源:(图片来自作者),图片灵感:链接
格兰杰因果关系
1956 年,诺伯特·维纳引入了一个概念,即在测量两个线性时间序列时,如果一个人可以通过使用两个序列的过去信息来预测第一个序列,而不是仅使用第一个序列的过去信息而不使用第二个序列,那么他可以推断第二个序列导致了第一个序列。第一个实际工作是由克莱夫·格兰杰完成的,此后这种方法被命名为格兰杰因果关系。经济学家格韦克在 1982 年也做了进一步的发展,被称为格韦克-格兰杰因果关系。因此,这一概念进一步扩展了风险值模型的使用案例,人们可以从统计上检验一个时间序列是否是另一个时间序列的原因。如果我们有证据证明第一个数列格兰杰因果第二个数列,我们可以推断第一个数列是因,第二个数列是果。话虽如此,效果必须取决于原因的过去价值。此外,在存在结果的过去值的情况下,原因的过去值必须有助于识别结果的当前值。
Stata 中的 VAR
VAR(1)的输出,图像源:(来自作者的图像),图像工具:Stata,链接到数据
模型迭代输出,VAR,图片来源:(图片来自作者),图片工具:Stata,链接到数据
VAR 模型估计的 Stata 代码
AIC 在 VAR(1)最小,AIC = -1870.592。
BIC 在 VAR(1)最小,BIC = -1853.92。AIC 和 BIC 都提出了 VAR(1)模型。
VAR(1)上的拉格朗日乘数测试,图片来源:(图片来自作者),图片工具:Stata,链接到数据
上述测试类似于我们在发现 ARMA 模型后看到的 ACF 相关图。目标几乎类似于检查来自模型的误差之间是否有任何相关性。换句话说,我们不希望任何给定时间点的误差项与其滞后误差值之间有任何修正。这个检验的无效假设是错误没有序列相关性,而另一个假设是错误有序列相关性。决策规则是,如果 p>0.05,那么我们无法拒绝零假设,并得出错误确实没有序列相关性的结论。测试代码如下所示。
用于检查模型残差中自相关的 Stata 代码
Stata 中的格兰杰因果关系
一旦 VAR 模型被识别和估计,我们可能要测试 VAR(1)模型的因果关系假设。零假设是自变量和因变量之间没有短期因果关系。另一个假设是自变量和因变量之间存在短期因果关系。判定规则是如果 p <0.05 then reject the Null and conclude there is causality, else conclude there is no short-run causality.
VAR(1) Stability Test, Image Source : (Image from Author), Image Tool: Stata, 将链接到数据
建议在因果关系检验之前检查所选的 VAR 模型是否稳定。如果模型不稳定,那么它可能意味着要么进入模型的序列不是平稳的,要么需要进行长期因果关系的协整检验,这实质上意味着建立一个向量误差修正模型。然而,在这种情况下选择的 VAR(1)是稳定的。
VAR(1)的 Granger 检验,图片来源:(图片来自作者),图片工具:Stata,链接到数据
检验格兰杰因果关系的 Stata 代码
在 VAR(1)中,我们观察到有确凿的证据表明,总体而言,GDP 增长率与消费支出增长率之间存在一定的因果关系。有趣的是,反之亦然(从消费增长到 GDP 增长)并不成立。
因此,我们有证据表明,GDP 的增长率是消费支出增长率的格兰杰原因。话虽如此,效果(消费支出增长率)必须取决于原因(GDP 增长率)的过去值。此外,原因的过去值(国内生产总值增长率)必须有助于在存在结果的过去值(消费支出增长率)的情况下确定结果的当前值。
R 中的 VAR
VAR 模型选择,图片来源:(图片来自作者),图片工具:R,链接到数据
基于信息准则可变滞后阶数选择的 r 码
在 Stata 中,我们对 p 从 1 到 5 的范围迭代 VAR 模型,并逐个收集信息标准度量的值。然而,在 R 中,包“vars”允许我们提及我们想要使用的滞后的数量,它将根据信息标准为我们提供最佳顺序。我们在 ARMA 案例中已经看到,每个工具都不会评估相同的信息标准值,因此在某些度量的建议顺序上可能会有一些差异。在这种情况下,我们看到 AIC 提出了一个 VAR(3)模型,而不是 Stata 提出的 VAR(1)。然而,BIC(也称为 Schwarz IC)和 HQIC 提出了 r 中的 VAR(1)模型。因此,我们现在将 VAR(1)模型拟合到我们的联合收割机系列,并查看其输出。
VAR(1)的输出,图像源:(来自作者的图像),图像工具:R,链接到数据
风险值模型估计的 r 代码
一旦我们估计了 R 中的模型并简要查看了输出,就该测试模型产生的误差是否具有序列自相关了。这个检验的无效假设是错误没有序列相关性,而另一个假设是错误有序列相关性。决策规则是,如果 p>0.05,那么我们无法拒绝零假设,并得出错误确实没有序列相关性的结论。
VAR(1)上的序列相关检验,图片来源:(图片来自作者),图片工具:R,链接到数据
用于检查模型残差中自相关的 r 代码
我们现在知道 VAR 模型的误差没有序列相关性。因此,我们不需要重新考虑 VAR 的模型顺序,这意味着我们可以测试因果关系。
VAR(1)的 Granger 检验,图片来源:(图片来自作者),图片工具:R,链接到数据
在 VAR(1)中,我们发现有确凿的证据表明,总体而言,GDP 增长率与消费支出增长率之间存在一定的因果关系。有趣的是,反之亦然(从消费增长到 GDP 增长)并不成立。
注:即时因果关系是为了测试原因的未来值(国内生产总值增长率)是否必须有助于在存在效果的过去值(消费支出增长率)的情况下确定效果的当前值
检验格兰杰因果关系的 r 代码
Python 中的 VAR
VAR 模型选择,图片来源:(图片来自作者),图片工具:Python,链接到数据
基于信息准则可变滞后阶数选择的 Python 代码
我们得到了与 r 几乎相同的建议。我们现在将 VAR(1)模型拟合到我们的联合收割机系列,并查看其输出。
VAR(1)的输出,图片来源:(图片来自作者),图片工具:Python,链接到数据
用于 VAR 模型估计的 Python 代码
一旦我们在 Python 中估计了模型并简要查看了输出,就该测试模型产生的误差是否具有序列自相关了。这个检验的无效假设是错误没有序列相关性,而另一个假设是错误有序列相关性。决策规则是,如果 p>0.05,那么我们无法拒绝零假设,并得出错误确实没有序列相关性的结论。在 Python 的例子中,我们确实得到了 p 值 0.15,因此我们得出错误没有序列相关性的结论。
用于检查模型残差中自相关的 Python 代码
我们现在知道 VAR 模型的误差没有序列相关性。因此,我们不需要重新考虑 VAR 的模型顺序,这意味着我们可以测试因果关系。
Python 代码检查格兰杰因果关系
在 VAR(1)中,我们观察到有确凿的证据表明,总体而言,GDP 增长率与消费支出增长率之间存在一定的因果关系。有趣的是,反之亦然(从消费增长到 GDP 增长)并不成立。
我们也可以使用相同的函数和不同的参数在 Python 中执行即时因果关系测试。
对 VAR &因果关系的观察
风险值估计:在估计风险值(1)模型时,所有三种工具的反应相似。我没有发现哪一个能大幅度地战胜另一个。在几乎所有的工具中,选择风险值滞后阶数的基本结构,通过风险值模型估计建议的滞后阶数,从而测试自相关性、因果性和稳定性,似乎是轻量级的。
VAR 模型的输出:后模型估计 Stata 生成的输出或者 R 的汇总结果相对来说比 Python 更详细。例如,Python VAR 输出不提供相应系统方程的模型方程。为了从残差自相关结果、稳定性或因果关系中获得结果,我发现 Python 要求单独输入属性值,这与 Stata 或 r 相比有点麻烦。
这篇文章的目的不是传达数学证明的疏忽,而是更多地关注掌握 ARMA 或 VAR 技术的实践。在有经验的人员的帮助下探索正式的教科书,然后冒险进行实践练习是非常重要的。然而,我的意图是帮助我的读者在他们的计划阶段,我们一直在寻找一个起点,然后迷路。本文有趣的部分是通过不同的工具尝试样本数据,并注意其中的差异或相同之处。有趣的是,在发现这样的问题并决定对问题建模之前,我们的工具箱中应该有不止一个工具。
参考文献
瑞财金融时间序列分析
Shumway&Stoffer时间序列分析及其应用
分享时间序列分析知识的网络和开放视频平台
原始数据来源,经合组织数据库
anind ya s .Chakrabarti教授,经济领域,IIM-艾哈迈达巴德
如果你能看透时间的种子,说哪些谷物会生长,哪些不会,请告诉我。~威廉·莎士比亚