TowardsDataScience-博客中文翻译-2020-一百一十六-

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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 的禅:Python 设计原则指南

原文:https://towardsdatascience.com/the-zen-of-python-a-guide-to-pythons-design-principles-93f3f76d088a?source=collection_archive---------11-----------------------

写出干净漂亮的代码!

用 Python 写干净的代码

一位 Python 爱好者曾经写过 20 句格言,说明如何用 Python 编写漂亮而干净的代码。这些格言被称为“Python 的禅宗”,在 Python 开发人员中引起了轰动。蒂姆·彼得斯为 Python 的设计写下了这些 BDFL(仁慈的终身独裁者,Python 创始人吉多·范·罗苏姆的昵称)的 20 条指导原则,但最后一句警句留给了范罗森。

直到今天,共有 19 句格言,罗森说最后一句格言是“一些奇怪的蒂姆·彼得斯在开玩笑。”但是,这些格言是什么意思呢?。让我们开始吧!

Python 之禅

漂亮总比难看好。
明的比暗的好。
简单胜于复杂。
复杂总比复杂好。
扁平比嵌套好。
稀不如密。可读性很重要。特例不足以特殊到打破规则。
虽然实用性战胜了纯粹性。错误永远不会无声无息地过去。
除非明确消音。
面对暧昧,拒绝猜测的诱惑。应该有一种——最好只有一种——显而易见的方法来做这件事。虽然这种方式一开始可能并不明显,除非你是荷兰人。
现在总比没有好。
虽然永远也不会比现在*好。如果实现很难解释,这是个坏主意。
如果实现容易解释,可能是个好主意。名称空间是一个非常棒的想法——让我们多做一些吧!

您可以通过键入以下命令在 Python IDE 中打开“复活节彩蛋”:

进口这个

漂亮总比难看好

作为一名开发人员,编写代码并使其运行并不是唯一要做的工作。Python 以可读性和简单性著称。那么,为什么要篡改呢?编写干净易读的代码是一门艺术,它受到其他程序员的欣赏,并让他们理解每一点。

def collatz(num):
    if num%2 == 0:
        return num//2
    else:
        return 3 * num + 1

number = input("Enter a number: ")
while number != 1:
    number = collatz(int(number))
    print(number)

在上面的代码中,不需要添加“else”。在这一点上感觉没有必要。另外,为了使它更好、更干净,你可以这样做:

def collatz(num):
    if num%2 == 0:
        return num//2

    return 3 * num + 1

显性比隐性好

这句格言不言自明。这意味着最好使代码更加详细和明确。这样做将使代码可读。隐藏代码功能可能会产生影响,因为其他程序可能无法理解代码。

简单比复杂好

当你可以构建一个简单的代码时,为什么要构建一个复杂的代码呢?

def recursion_reverse(s):
    if(len(s)==1):
        return s
    else:
        return recursion_reverse(s[1:]) + s[0]

original_string = "ABC"
print("Reversed String : ", recursion_reverse(original_string))

您也可以只用两行代码来完成。

my_string = “ABCD”
reversed_string = my_string[::-1]

复杂比复杂好

上面的格言说简单比复杂好。现在这个说“复杂比复杂好”。越来越混乱了!一个复杂的问题可能需要复杂的技术来解决,但它不应该是复杂的。

代码的复杂性让其他程序员感到困惑。即使程序很复杂,也要尽量保持简单的一面,易于阅读和理解。复杂的代码会耗费精力和时间!而且,程序员不能浪费时间。

扁平比嵌套好

编码人员喜欢为每个功能创建子模块。比方说,我构建了一个名为“垃圾邮件”的模块,添加了子模块“foo ”,并在其中添加了“baz”。

现在,从 baz 访问另一个子包将类似于:

from spam.foo.baz import eggs

嵌套和等级制度不是增加组织而是官僚主义!

稀疏胜于密集

有时,我们倾向于只用一行代码做所有的事情。您可能会得到正确的输出。但是,可读性呢?有人不用偷看很久就能看懂吗?

print('\n'.join("%i bytes = %i bits which has %i possible values." % (j, j * 8, 256 ** j - 1) for j in
                (1 << i for i in range(8))))

同样的东西可能被分成几部分,也可能被写成得到同样的结果。散布代码是一件令人愉快的事情,而密集的代码会激怒同事。

可读性计数

每次你被代码卡住的时候,你会去 StackOverflow 吗?那么,你看什么代码呢?可读的还是复杂的!

据说代码读的比写的多。所以,为了读者的缘故,请开始编写可读的代码,因为它受到我们的程序员同事的喜爱。

特例不足以违反规则

程序员必须坚持良好的“编程实践”。比方说,您导入了一个库,但是它不符合良好的编程实践。它必须帮助你完成任务,但请记住,库和语言应该总是遵循最佳的“编程实践”,并以其一致性而闻名。

虽然实用性战胜了纯粹性

与上面的“特例并不特殊到足以打破规则”的格言相反,这一条表明给定的规则集可能有一个例外。这里的关键词是“可能”。

错误永远不会无声无息地过去

当一个函数返回 None 时,就是你陷入无声错误陷阱的时候。最好是得到错误,而不是无声的错误。如果您避免这样的错误,它可能会导致错误,并进一步导致崩溃。

这就是为什么在代码中使用“try-except”语句变得很重要。无论你认为哪里有可疑的事情发生,你都必须添加这个组合,并了解这些无声的错误。

除非明确静音

有时您想忽略代码中的错误,最佳做法是显式地消除错误。

面对暧昧,拒绝猜测的诱惑

计算机做我们想让它们做的事情。尽管如此,这些机器让我们变得迷信。计算机代码行为不正常总是有原因的。只有你的逻辑才能解决它。因此,打破猜测和盲目尝试解决方案的诱惑,直到代码工作。

应该有一种——最好只有一种——显而易见的方法来做这件事

在 Perl 编程中,有一种说法是这样的——“有不止一种方法可以做到这一点!”用三四码做同样的事情,就好比有了双刃剑。不仅要花时间去写,而且每个人都必须能够毫无问题地阅读你的 3-4 种方法。这种实践中的灵活性不值得庆祝。

尽管这种方式一开始可能并不明显,除非你是荷兰人

关于 Python 的创造者吉多·范·罗苏姆,这句格言说,除非你是代码的创造者,否则语言规则不容易学习或记忆。一个关于 BDFL 的笑话!

现在总比没有好

这个小格言说,陷入无限循环或永无止境循环的代码比没有陷入无限循环或永无止境循环的代码更糟糕。

虽然永远也不会比现在更好

等待一个程序结束比提前终止它并得到不正确的结果要好。这句格言和上面那句“现在总比没有好”既相似又矛盾。

如果实现很难解释,这是个坏主意

如果你正在向某人解释你的代码,而向你的熟人或同事解释变得很困难,那么你的代码有问题。绝对不简单,很复杂!

如果实现很容易解释,这可能是个好主意

与上面的格言正好相反,这句格言只是说一个简单的,可读的代码很容易解释。如果你能够做到,你就在正确的轨道上。

名称空间是一个非常棒的想法——让我们多做一些吧!

在 Python 中,名称空间基本上是一个系统,每个对象都有一个唯一的名称。这是访问每一个底层对象的好方法。

a = 2
print('id(a) =', id(a))

a = a+1
print('id(a) =', id(a))

print('id(3) =', id(3))

它输出:

id(a) = 9302208
id(a) = 9302240
id(3) = 9302240

Python 组织变量的方式令人难以置信。这就是名称空间很酷的原因!

结论

Python 太神奇了!这就是为什么数百万开发人员使用它,用它编码,用它分析数据,用它建立模型。为它制定的指导方针只是激励程序员编写简单、易读、干净的代码。下次你坐着编码时,试着遵循这些指导方针。

参考文献

  1. PEP 20—Python 的禅

编码快乐!

Zoom 数据科学家访谈

原文:https://towardsdatascience.com/the-zoom-data-scientist-interview-261fdfbe18cd?source=collection_archive---------56-----------------------

图片来自pix abay

Zoom Video Communications,Inc .是一家美国通信技术公司,成立于 2011 年,总部位于加利福尼亚州圣何塞。该公司通过基于云的软件平台提供视频会议和在线聊天服务,有助于转变实时协作体验。与其他竞争对手不同,Zoom 通过由高清视频会议、移动性和网络会议组成的三合一平台提供统一的会议体验。

在 Zoom,数据在理解和改善用户体验方面发挥着不可或缺的作用,数据科学团队是公司成功的基础。最近,Zoom 宣布了一项“智能会议”功能,为其视频会议服务提供自动转录,为用户节省了记录和共享会议笔记的时间。

为了实现这一壮举,Zoom 采用了语音到文本转录:一种基于语音的人工智能技术,利用先进的机器学习技术,可以识别会议中每个人的个人语音模式。正如这项新功能所证明的那样,Zoom 一直在做开创性的工作,为新的甚至是经验丰富的数据科学家提供一个成长平台。

Zoom 的数据科学家角色

图片来自pix abay

Zoom 是一家快速发展的公司,主要依靠数据科学来做出影响增长、推动创新和改善客户体验的决策。数据科学家以及数据工程师、数据架构师、数据分析师和数据库工程师在维护这一标准中扮演着不可或缺的角色。

Zoom 的数据科学家利用数据和数据技术来识别和了解业务趋势和机会,以提高新产品和现有产品以及最终用户的满意度。尽管该公司有一个中央数据科学团队,但个人角色和职能可能略有不同,可以根据团队和分配的产品/项目进行定制。因此,必要的资格可以从标准数据分析和可视化知识到机器和深度学习重技能。

所需技能

虽然 Zoom 为新数据科学家的成长提供了一个大型平台和生态系统,但它也是高技能和经验丰富的数据科学家寻求加入已经在世界范围内产生影响的专业人士行列的原因。平均而言,Zoom 雇佣至少有四年(高级别 6 年以上)数据处理行业经验的专家来帮助决策。

其他相关要求包括:

  • 经典机器学习、深度学习、强化学习/控制系统、概率论、统计学、因果推理、时间序列预测、优化和动态编程的实践经验。
  • 计算机科学、统计学、经济学、数学、物理、运筹学或其他定量领域的学士/硕士/博士
  • 很强的编程语言技能,尤其是 Python,Scala 和 Java。
  • 对分析和可视化工具(如 Tableau)有丰富的经验。
  • 具有 SQL、Python 库和 R 的经验,能够执行复杂的模型。
  • 具有构建数据管道、高效 ETL 设计、实施和维护的经验。

Zoom 的数据科学家团队

Zoom 的术语“数据科学”涵盖了广泛的领域专业知识,包括数据科学家、数据工程师和数据架构师。虽然有一个专属的数据科学团队,但数据科学家也可以被分配到其他内部团队,或跨职能合作以实现预期目标。团队在整个组织中不断扩大,尽管一般角色有时可能会重叠,但主要职责在很大程度上依赖于所分配的团队。

以下是 Zoom 的一些数据科学团队及其一般职责。

  • 数据科学团队:分析当前的数据设计,以优化和提供结构改进来应对业务增长,并提供见解和新的数据流程来帮助预测建模。其他角色还包括在关键项目上与产品经理、数据工程师、系统架构师和销售/营销团队进行跨职能协作。
  • 信任和安全工程:利用数据识别趋势,进行根本原因分析,并发现潜在的改进机会。设置、监控和维护关键指标,以评估安全计划的服务和有效性。编写复杂的 SQL 查询、R 或 Python 代码来构建数据模型,为分析框架和仪表板提供支持。利用先进的机器学习、计算机视觉和数据挖掘技术来开发高度可扩展的工具、模型和预测增长的算法。作为这个团队的一员,你还可以在关键项目上与内部团队进行跨职能合作,包括产品工程师、产品经理、数据工程师、运营、法律、合规和营销经理。
  • 销售分析:编写 Python 或 R 代码和 SQL 查询来构建模型,以维持分析框架和仪表盘。提供数据卫生和完整性,并基于产品使用和计费数据构建预测模型。角色还包括构建和维护数据可视化,以便在多级组织之间有效地交流关键销售指标和 KPI。
  • 数据科学(机器学习):研究、设计和开发新的机器学习解决方案和算法,以开发新功能和改进现有产品。广泛研究数据聚类、分割、过滤、评估、自动化和预测建模,以释放新的增长机会。与工程师、数据分析师和产品经理合作,开发和改进增长模型。

如果你正在寻找更多关于数据科学相邻领域的信息,一定要查看我们关于研究科学家及其在技术中的作用的新文章

面试过程

图片来自pix abay

面试过程遵循标准的技术招聘流程。首先是在 Zoom 会议上与人力资源部门进行初次面试,然后会给你邮寄一份后续的带回家的挑战。如果您通过了带回家的挑战,您将被邀请到现场与业务主管、人力资源主管和数据科学团队领导进行一系列面试。

初始屏幕

这是一次标准的探索性讨论,由人力资源负责。在整个面试过程中,面试官会告诉你更多关于工作角色、团队和整个公司的信息。你也可以讨论你的技能和你过去参与的项目。

示例问题:

  • 给我介绍一个你过去做过的机器学习项目。
  • 如果和队友有矛盾你会怎么做?
  • 你从现在的职位中学到了什么?

在线数据挑战

在最初的 Zoom 会议之后,你会收到一份带回家的数据挑战,主要由机器学习、数据挖掘和数据结构问题组成。将有多达 15 个问题,分配一个半小时完成。

现场面试

现场面试是面试过程的最后一个阶段。它包括与业务负责人、人力资源负责人和数据科学团队负责人的三轮连续面试。Zoom 的数据科学现场面试是行为和技术面试的混合,旨在测试候选人在数据科学的长度和宽度方面的知识,以及产品感知知识。

问题通常是基于数据集的案例研究,类似于现实生活中的缩放案例,跨越基本的统计概念、机器学习和设计。(使用这些技巧在这里练习您的案例研究。)

试试面试查询上的一个模拟面试问题。

缩放数据科学家面试问题

浏览以下步骤并导入所需的 Python 库——不要担心,如果您忘记了一个,可以稍后导入。

2)从 csv 文件加载数据

3)执行基本命令来理解数据

  1. Bin 具有以下特性:

a)“当前项目”分为[0 至 11]、[11 及更多]

b)进入[0 至 14.99]、[14.99 至 500]、[500 至 5K]、[5K 及更多]的“mrr_entry”

c)“帐户 _ 年龄”分为[0 至 90]、[90 至 180]、[180 至 360]、[360 及更多]

d)将“期限内剩余天数”分为[0 至 30]、[30 至 360]、[360 及更多]

5)将“churn_next_90”设置为您的目标列

6)将“zoom_account_no”设置为 ID 列,这不应该是一个功能

7)将“ahs_date”设置为日期列,这不应该是一个功能

8)将来自步骤(4)的入库特征和以下特征视为分类特征:

a)'销售组',

b)'员工人数',

c)“核心产品”

9)使用您喜欢的方法和 ML 算法进行特征选择。选择 10 个特征并继续步骤(10)。

10)将新数据帧(具有 10 个特征)分成测试和训练子集

11)使用与第(9)部分不同的算法,并为参数调整执行交叉验证方法。打印出结果。

12)基于来自(11)的结果,在训练子集上拟合你的模型

13)使用测试子集测试您的拟合模型

14)打印来自步骤(13)的特征重要性、准确性得分(roc_auc_score)和混淆矩阵(crosstab)

15)使用 pickle 保存训练好的模型

最终注释和提示

Zoom 数据科学家面试遵循标准的技术面试流程。问题是标准的和定制的——特定于个人角色的要求。面试问题混合了统计学、案例研究、编码、行为和产品意识。

最后,理解视频会议空间并不是必须的,但它有助于了解 B2B 工作空间公司在做什么。这也意味着在微软、Slack 或其他类似公司的背景有助于通过面试。

感谢阅读!

原载于 2020 年 10 月 19 日 https://www.interviewquery.com。****

深度学习的理论和实践方面,10 个笔记本/项目,适合初学者

原文:https://towardsdatascience.com/theoretical-and-practical-aspects-of-deep-learning-with-10-notebooks-projects-for-beginners-e0b282eefdbc?source=collection_archive---------62-----------------------

图片来自 TechTalks本·迪克森

动机

如今,各个工作领域的人都在谈论大数据。但是,它们是什么样的数据呢?它是否只针对一个分类问题处理数百万个数据?还是以无人监管的方式对它们进行聚类?为了理解这一点,让我们看一个简单的例子。谷歌有数十亿用户使用他们的各种服务,手机,应用程序,网络服务等等。谷歌必须分析他们的兴趣和位置,向他们展示合适的广告。通过图像处理将用户的照片和视频聚集在应用程序中,并听取用户的声音以提供更好的虚拟助手,这只是我们在这里可以计数的一些过程。你能想象谷歌一天之内从数十亿用户那里收集数据吗?更有趣的是,谷歌在这一领域并不孤独,其他公司也存在于这一领域,如亚马逊,这是当今最大的电子商务网站。因此,他们应该更频繁地更新服务,因为用户的兴趣和行为每天都在变化。为了处理海量数据,他们需要更强大、更高效的算法。

深度学习允许我们处理各种数据类型,如图像、文本、音频剪辑、视频等。目前,许多应用程序依赖深度学习的能力进行面部识别、对象检测、虚拟助理,甚至音乐创作。如果你知道机器学习,你应该记得一些分类的基本最大似然算法,如逻辑回归(LR),随机森林(RF),或支持向量机(SVM)。同样,线性回归、套索和岭作为回归变量。他们都是伟大的算法,他们救了我们很多次。然而,一些缺点使得它们不如神经网络有效。例如,逻辑回归使用单个 sigmoid 输出函数进行二元分类,当我们有许多参数要处理时,这使得提取更多信息的能力下降。另一方面,SVM 可以使用你的 CPU 中的一个内核,这对于拥有多个内核的 CPU 来说是没有意义的。此外,当出现相对大量的数据时,需要花费很多时间甚至数周来完成训练过程。但是,如果我告诉你有可能通过深度学习创建更高效、更强大的模型,会怎么样呢?由于神经网络,我们可以在几分钟内快速构建许多层和多个单元来评估我们的数据集,而常规的 ML 算法需要几天时间。因此,神经网络加快了游戏的步伐,我们不仅生成了强大而且更有效的模型来处理我们想要处理的几种数据类型。

介绍

在学习过程中,项目覆盖了一个重要的地方,以保持我们的理论知识新鲜,并将我们的理解推向更深的阶段。出于这个原因,实践将与学习各种机器学习模型和技术的理论方面一样重要。在本文中,我想分享一些应用的深度学习项目及其理论方面,我的评估和解释,供初学者和希望在这一领域进行更多实践的人使用。

项目由深度学习领域不同主题的四个知识库组成,包括从密集连接层到 1D 卷积网络的十个笔记本/项目。在本文的最后,我将推荐两个很好的来源,以学习深度学习技术的不同观点以及它们背后到底发生了什么开始。如果你是一个初学者,我强烈建议你在开始纠结这些项目之前先完成两个共享的资源。但是,请耐心阅读这篇文章的结尾,因为当你完成共享资源和本文的项目时,项目的描述可能会让你对你将学到的东西有更好的直觉。

存储库和笔记本

与存储库类似,我想将笔记本放入本文的四个部分中,在每个部分下,笔记本和相应的描述将被共享。先说第一个;

第 1 部分:分类和回归分析

图片来自维基百科

计算机能理解手写的字母或数字吗?为了回答这个问题,我们从美国国家标准与技术研究所(NIST)的数据库中收集了 MNIST 数据集。MNIST 是这个时代最著名的数据集之一。数据集包含灰度 60000 训练和 10000 测试手写数字图像。加载 MNIST 数据集是本笔记本的第一部分。然后,观察图像的阵列表示,以便更好地直观了解模型如何处理图像。在这本笔记本中,数据集已经用一个简单的密集连接的顺序模型进行了评估。然而,就在创建顺序模型之前,通过将每个像素除以 255 对图像进行预处理,然后,创建顺序模型和评估结果的步骤紧随其后。

波士顿住房数据集的回归分析

照片由奥斯曼·拉纳Unsplash,编辑。

我们无法总是找到足够大的数据来训练我们的模型,波士顿住房数据集可能是其中之一。在这个数据集中,我们有 506 个住宅样本,其中包括 404 个训练和 102 个测试部分。拥有这样一个有限的数据集为获得小的错误率带来了挑战。在此笔记本中,波士顿房屋的价格已在加载和规范化数据集后通过回归模型进行了预测。在编译模型时,均方误差(MSE)、平均绝对误差(MAE)和均方根误差(RMSE)已作为评估矩阵和损失函数涵盖。由于 Keras 使用随机初始权重和一些其他参数创建模型,这导致每次训练得到不同的结果。为了得到准确的分数,数据被分成 10 部分,并且对于每个步骤,其中的 9 部分被用作训练数据,而 1 部分被用作测试部分。这个过程也被称为 K 倍交叉验证。

第二部分:情感分析

IMDB 数据集

照片由杰瑞米·叶Unsplash 上拍摄

事实上,在一部电影上映后,我们会直接寻找关于它的书面命令,以回答它是否真的值得我们花费时间?因此,IMDb 分数和用户命令在电影上映与否中扮演着决定性的角色。作为一个人,不可能阅读和评估每个命令。然而,使用情感分析有助于我们利用计算机的能力来评估所有的命令。对于情感分析的根本解释,它在句子中寻找最常用的词,并在这种情况下确定它是好还是坏。在这本笔记本中,预处理数据的情感分析技术,和惩罚模型与 L2 正则化和辍学,已经涵盖。

路透社新闻数据集

Matthew Guay 在 Unsplash 上拍摄的照片

现在随着科技的发展,我们都在手机或者平板上看新闻。虽然像谷歌新闻一样,每个资源中有各种新闻类别,但只有基于我们兴趣的特定主题才会显示给我们。为了主要了解谷歌如何对新闻进行分类并向我们展示,我们将在本笔记本中使用路透社的新闻数据集。路透社新闻数据集包含 46 个不同主题的简短新闻专线,如技术、经济等。它由路透社于 1986 年出版。在这本笔记本中,新闻专线已经使用情感分析技术进行了分类,具有密集连接的层和辍学。

第 3 部分:探索卷积神经网络

对于人类来说,即使在很小的时候,也很容易区分物体并进行分类。然而,从计算机的角度来看,这个过程并不容易。为了赋予机器这种能力,我们使用 NxN 矩阵作为过滤器,在卷积神经网络中从图像中捕捉不同的模式。因此,计算机可以根据物体的形状和颜色来区分它们。此外,当在卷积层中使用更多的滤波器时,由 ConvNets 发现的模式数量增加。

带 ConvNets 的 MNIST 数据集

之前,MNIST 数据集仅使用密集连接的图层进行评估。在基于卷积的结构中,模型只比较数字,并试图找到它们之间的统计意义。然而,使用 ConvNet 性能很好,因为它以可视化的方式处理图像,以提取更多的模式。在本笔记本中,卷积层和池层将用于捕捉 digit 的图像模式,以获得更好的准确性。

猫狗分类

纪尧姆·德·日耳曼Unsplash 拍摄的照片

狗对猫,以及他们的战斗…在这本笔记本中,我们将从图像中对猫和狗进行分类。原始的狗与猫数据集包含 25000 个带标签的猫和狗图像,在 Kaggle 中每类 12.500 个。⁴:但是,我们将只用其中的 4000 台。放心吧!Keras 有很多内置的函数和类,让我们的生活变得更加轻松。ImageDataGenerator 是其中之一,可以简单地从具有给定形状的目录中加载数据集。此外,当我们没有足够的数据来训练我们的模型时,它还应用数据扩充。此外,您可以从 Keras 加载并使用预训练的模型进行迁移学习。在本笔记本中,涵盖了数据扩充、从预训练模型中提取特征以及微调主题。

可视化网络

通常,人们认为没有办法将 ConvNets 可视化。但是,如果我告诉你,有可能看到卷积网络是如何观察我们的世界。从 ConvNets 的激活功能中提取模式有助于我们检查它们如何从图像中学习。此外,我们还可以检测他们在看哪里,以预测图像的目标。在这本笔记本中,这些图案被提取出来作为视觉效果。

第四部分:探索序列模型

词语嵌入

在情感分析中,模型只是在句子中寻找单词的出现。由于这个原因,我们可以很容易地通过写单词的同义词来愚弄他们,因为他们倾向于偏向某些单词。还有,他们对“不好”、“不坏”等词的连接不敏感。为了防止这种情况,今天研究者和从业者大多使用单词嵌入技术。因为单词嵌入可以让我们通过为每一个单词设置多维权重向量来赋予单词意义,使它们像男人→国王,女人→女王一样接近。在这个笔记本中,预训练的“手套”字嵌入用于嵌入层。⁶然后,用它来评估 IMDb 数据集。

气温预报

图片来自伯克利 CS188:人工智能简介

在本笔记本中,我们将看到一个在您的设备上使用温度预测应用程序的示例。我们将了解他们实际上是如何预测未来温度的,以及我们应该对这些类型的序列数据集应用何种预处理技术。为了这个问题,从 2009 年到 2016 年,Jena Climate 每 10 分钟收集一次数据集。每个样本有 14 个参数,如空气温度、压力、湿度等 11 个参数。在本笔记本中,已经创建了生成器功能来准备具有相应目标的训练、验证和测试数据。此外,门控递归单元(GRU),⁸,这是最常见的 RNN 算法之一)也包括在内。

1D·康文内特

虽然最常见的 RNN 算法,如长短期记忆(LSTM)和门控递归单元(GRU)在记忆 sequences,⁹方面做得很好,但在长序列中训练它们在计算上是昂贵的。由于这个原因,1DConvNets 用于从序列中捕获一些模式,并通过减少像 2DConvNets 这样的 RNN 层的输入参数来带来更高的计算效率。因此,1DConvNets 和 LSTM 在 Keras 中的实现已经包含在本笔记本中。

建议和结论

在结束本文之前,我想提一下两个很好的资源。其中一个是 Andrew Ng 的“深度学习专业化”,其中包含 5 个非常棒的课程,通过⁰的 homeworks 提供深度学习技术的理论方面,另一个是 Francois chollet(keras 的创作者)的“用 Python 进行深度学习”,这是一本非常好的书,我主要用来准备笔记本和撰写本文。

简而言之,在这个故事中,我们看到了深度学习的各种观点,从简单的分类问题到未来预测。在当今由大数据管理的世界中,深度学习是处理几种数据类型的重要时代。如今,我们不仅使用数据来对一些东西进行分类,我们还使用它们通过生成网络来生成图像、视频剪辑和人声。对于深度学习的未来,最近已经采取了在医学中使用它的步骤,例如从乳腺组织病理学图像中诊断乳腺癌或从 X 射线图像中检测肺癌。但还是有更多的东西等着你去发现。此外,我们可能会在空间科学领域看到更多。由于 Space-X 的猎鹰 9 号项目具有可重复使用的两级火箭设计,现在,从火箭起飞到分离模块自动着陆,都可以使用机器学习能力。

参考资料:

1.https://keras.io/api/datasets/mnist/

2.【https://keras.io/api/datasets/reuters/

3.泽勒医学博士和弗格斯研究中心(2014 年 9 月)。可视化和理解卷积网络。在欧洲计算机视觉会议(第 818-833 页)。斯普林格,查姆。

4.https://www.kaggle.com/c/dogs-vs-cats

5.Mikolov,Chen,k .,Corrado,g .,& Dean,J. (2013 年)。向量空间中单词表示的有效估计。 arXiv 预印本 arXiv:1301.3781

6.Pennington、r . Socher 和 c . d . Manning(2014 年 10 月)。Glove:单词表示的全局向量。在2014 年自然语言处理经验方法会议论文集(第 1532-1543 页)。

7.https://S3 . Amazon AWS . com/keras-datasets/jena _ climate _ 2009 _ 2016 . CSV . zip

8.Chung,j .,Gulcehre,c .,Cho,k .,和 Bengio,Y. (2014 年)。门控递归神经网络在序列建模中的经验评估。 arXiv 预印本 arXiv:1412.3555

9.Hochreiter,s .,& Schmidhuber,J. (1997 年)。长短期记忆。神经计算9 (8),1735–1780。

10.https://www.coursera.org/specializations/deep-learning

11.https://www.manning.com/books/deep-learning-with-python

心智理论和人工智能

原文:https://towardsdatascience.com/theory-of-mind-and-artificial-intelligence-231927fabe01?source=collection_archive---------23-----------------------

AI 能理解人类甚至自身的行为吗?

Liam Charmer 的照片

我们的大脑是一个复杂且尚未被完全理解的系统。只要有书面证据可以证明,哲学家们就一直在努力弄清楚我们的大脑是如何运作的。在这种情况下,可能出现的一些最有趣的问题与发现他人(甚至自己)头脑中正在发生的事情的可能性有关。给定足够多的可观察变量,人类行为是可预测的吗?

这种思考刺激心理学家发展出所谓的“心理理论”(ToM),正如 AI Goldman 所描述的[1]:

“心理理论”是指将心理状态归因于自我和他人的认知能力。同样能力的其他名称包括“常识心理学”、“天真心理学”、“民间心理学”、“读心术”和“心理化”。[……]他们[人]或他们的认知系统,是如何对他人的精神状态,即无法直接观察到的状态,形成信念或判断的?

提出了不同的经验测试(例如2,[3]),以检查可观察的输入是否可以导致精神状态预测,以及了解精神状态是否允许预测未来的行动(行为)。虽然心理学家仍在争论理解人类的心理状态是否可能,但汤姆已经吸引了人工智能研究人员的注意。

心智理论和人工智能

Jr Korpa 拍摄的照片

人工智能在过去十年中发展迅速,利用了增加的计算能力,特别是深度神经模型取得的突破。虽然这种结果很强大,但在特定的环境中是可以实现的,而且所获得的模型只能在它们被设计为擅长的任务中表现良好。下一步将是设计一个能够处理各种不同问题的人工智能,并在与不同实体互动的同时进行学习,正如机器人领域 10 大公开挑战中的 2 个所强调的那样[4]:

(vi)机器人学人工智能(AI)的基本方面,包括学习如何学习,结合高级模式识别和基于模型的推理,用常识开发智能。

(八)社会互动了解人类社会动态和道德规范,能够真正融入我们的社会生活,表现出同理心和自然的社会行为。

将 ToM 的概念和思想与合成智能系统相结合已被证明是解决这些问题的可行选择,并且在考虑多智能体 AI 系统和人机交互问题时变得尤其相关。在这个前提的基础上,已经建立了不同的工作,例如,在[5]中使用贝叶斯 ToM 框架,甚至在[6]中使用逆向强化学习来“逆向工程”可观察的行为。下面我对 DeepMind 和谷歌大脑的研究人员提出的一种不同的方法进行评论。

ToMnet

在[7]中,作者描述了被称为心理机器理论的东西。其思想是将 ToM 视为一个元学习问题(即学会如何学习),以实现一个人工系统,该人工系统具有关于它以前从未见过的代理将如何行为的先验知识,并收集关于该代理如何与环境交互的数据,以创建包含特定代理行为的特殊性的个体模型。

与其他方法不同,目标是使用有限的数据自主学习,而不是断言一个生成模型,观察代理的行为,并对其算法进行逆向工程。实验包括 ToMnet 与 gridworld 中遵循不同策略的代理交互,在 grid world 中,每一步都可能有一组离散的可能动作。首先,代理遵循一个随机的策略,然后代理被训练有对环境的完全可观测性,最后代理被训练有不同种类的部分可观测性。

结果表明,ToMnet 实现了它的目标:当观察新的代理时,学习适用于平均行为和特定模型的通用模型。不幸的是,在更具挑战性的情况下,代理之间需要相当大的通信信道来实现这样的结果。随着模型和方法的进一步改进,预计在处理更复杂的环境和代理之间没有直接通信的情况下,将获得同样令人印象深刻的结果。

这项工作和其他作者结合心智和人工智能理论概述的可能性令人着迷。毕竟,能够理解复杂人工系统的行为可能是理解我们大脑的重要一步。

参考

[1] Goldman,Alvin I .《心理理论》《牛津认知科学哲学手册》 1 (2012)。

2拜伦-科恩、西蒙、艾伦·m·莱斯利和乌塔·弗里斯。"自闭症儿童有“心理理论”吗?"认知21.1(1985):37–46。

[3]维默、海因茨和约瑟夫·佩纳。"关于信念的信念:错误信念在幼儿理解欺骗中的表征和约束作用."认知13.1(1983):103–128。

[4]杨,光忠,等.“科学机器人学的重大挑战”科学机器人 3.14 (2018): eaar7650。

[5]贝克、克里斯、丽贝卡·萨克斯和约书亚·特南鲍姆。"贝叶斯心理理论:联合信念-愿望归因建模."认知科学学会年会论文集。第 33 卷。№33.2011.

[6] Ng、Andrew Y 和 Stuart J. Russell。"逆向强化学习的算法." Icml 。第一卷。2000.

[7] Rabinowitz,Neil C .等人,《机器心理理论》 arXiv 预印本 arXiv:1802.07740 (2018)。

主成分分析理论及其在 Python 上的实现

原文:https://towardsdatascience.com/theory-of-principal-component-analysis-pca-and-implementation-on-python-5d4839f9ae89?source=collection_archive---------52-----------------------

来源: summitlife

主成分分析背后的原理和数学以及在 Python 上的实现

当处理一个包含大量数据的复杂科学项目时,其中每个例子都由许多特征描述,您可能想要可视化数据。事实上,在 1D、2D 或 3D 中可视化很容易,但如果你想可视化由 100 个特征组成的数据,你在 100D 中看不到任何东西。所以你必须降低维度,把你的数据放在一个维度等于或者小于 3D 的空间里。这可以使用主成分分析(PCA)来完成。PCA 的另一个非常好的用途是加速你的机器学习算法的训练过程。你的特征越多,你的机器学习算法就越复杂,它需要学习的参数就越多。因此,计算时间将越长。现在,很明显,如果你减少数据的大小,学习算法所需的时间将会大大减少。但是,您可能会想,如果我们减少变量的数量,那么我们将会丢失数据中的大量信息,结果也将完全不准确。这是 PCA 算法的主要挑战,我们将在本文中看到如何确保良好的准确性。

为了说明这种情况,我将使用 MNIST 数据库是一个手写数字的大型数据库。

在本文中,我将向您展示 PCA 背后的理论以及如何在 Python 上实现它。我也会给你一些何时使用这种方法的提示。

主成分分析背后的数学

在主成分分析算法中,目标是找到投影数据的 k 个向量,以便最小化投影误差。这 k 个矢量将是投影数据的 k 个方向。这里,k 对应于你的最终维度:如果你想在一个 2D 维度空间中查看你的数据,那么 k 将等于 2。

我们如何找到这些 k 向量?

让我们称 描述我们的数据的矩阵。PCA 涉及将相互依赖的变量(在统计学中称为“相关的”)转换成彼此不相关的新变量。这些变量被称为主成分,将描述数据所传达的信息。我们需要查看协方差矩阵,因为协方差是两个随机变量的联合可变性的度量。但是为什么要协方差呢?让我们想想如何从数据中学习。你看着均值,变量是如何远离或接近均值的。这本质上是协方差:与平均值的偏差。因此,在主成分分析中,我们必须计算数据矩阵的协方差,并寻找收集最多信息的方向或向量,以便我们可以保留 PI 并去除其余的。但事情并没有那么简单,我们将一步一步来看,看看我们是如何做到的。

1.数据的标准化

该步骤的目的是标准化连续初始变量的范围,以便它们中的每一个对分析的贡献相等。

更具体地说,在 PCA 之前进行标准化是至关重要的,因为后者对初始变量的方差非常敏感。也就是说,如果初始变量的范围之间存在较大差异,则范围较大的变量将优于范围较小的变量(例如,范围在 0 和 100 之间的变量将优于范围在 0 和 1 之间的变量),这将导致有偏差的结果。因此,将数据转换为可比尺度可以防止这个问题。

数学上,这可以通过减去每个变量的每个值的平均值并除以标准偏差来完成。回想一下,Ais 是描述我们的数据的矩阵,因此每行是一个例子,每列是一个特征。让我们设定 n 等于特征的数量 et m 等于示例的数量。因此矩阵 A 是一个矩阵 mxn。

2.协方差矩阵和对角化

协方差矩阵由以下公式给出:

然后,我们需要对角化协方差矩阵。我们称 S 为对角矩阵。u 和 V 将是变换矩阵。因此,我们有:

如果你听说过 PCA,你可能听说过 SVD 。SVD 用于奇异值分解,这就是我们在 A 上应用的内容。SVD 理论表明,矩阵 A 存在以下分解:

其中 UV 是分别从 aa【ᵀ】和 a【ᵀa】中选择的具有标准正交特征向量正交矩阵。s’是对角矩阵,其中 r 元素等于 XX 或 X ᵀ X. 对角元素由奇异值组成。

并且我们有 S' = S. 下一步是重组特征向量以产生 U 和 V. 为了标准化解决方案,我们对特征向量进行排序,使得具有较高特征值的向量出现在具有较小值的向量之前。

与特征分解相比,奇异值分解适用于非方阵。 UV 对于 SVD 中的任何矩阵都是可逆的。

3.降维

降维的思想是保留 k 个最能描述数据的特征向量。因此,我们有:

然后我们添加零空间,它已经与第一个 r v 和 u 正交,从简化 SVD 到完全 SVD。

4.如何选择 k 个特征向量

我们需要应用一个公式来保持总方差的某个百分比。假设我们希望保持方差的 99%,那么我们有如下结果:

现在我们已经看到了 PCA 背后的数学原理,我们将在 Python 上实现它。

Python 上的实现

我们将使用的数据集在这里可访问。因此,首先我们导入数据和我们需要的不同库。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pylab as plt# import the data
data = pd.read_csv("train.csv")# some pre-processing on the data
labels = data['label'].head(1500) # we only keep the first 1500 *#* Drop the label feature and store the pixel data in A and we keep 
# only the first 1500
A = data.drop("label",axis=1).head(1500)

1.数据的标准化

from sklearn.preprocessing import StandardScalerstandardized_data = StandardScaler().fit_transform(A)

2.协方差矩阵和对角化

首先,我们计算 a 的协方差矩阵

covar_matrix = np.matmul(standardized_data.T , standardized_data)

然后,我们计算特征值和相应的特征向量。但是这里我们只计算最高的两个。

*# the parameter 'eigvals' is defined (low value to heigh value)* 
*# eigh function will return the eigen values in ascending order*

values, vectors = eigh(covar_matrix, eigvals=(782,783))

然后,我们将原始数据样本投影到由我们刚刚计算的两个主特征向量形成的平面上。

new_coordinates = np.matmul(vectors.T, sample_data.T)

然后,我们将标签附加到 2d 投影数据,并创建一个数据帧,然后使用 seaborn 并绘制带标签的点:

new_coordinates = np.vstack((new_coordinates, labels)).T

*# creating a new data frame for plotting the labeled points.*
dataframe = pd.DataFrame(data=new_coordinates, columns=("1st_principal", "2nd_principal", "label"))# plot
sn.FacetGrid(dataframe, hue="label", size=6).map(plt.scatter, '1st_principal', '2nd_principal').add_legend()
plt.show()

类别之间有很多重叠,这意味着 PCA 不太适合高维数据集。很少几个阶层可以分开,但大多数都是混合的。 PCA 主要用于降维不用于可视化。为了可视化高维数据,我们通常使用 T-SNE。

我们也可以使用 Python 中的 PCA 模块来实现:

*# initializing the pca*
**from** **sklearn** **import** decomposition
pca = decomposition.PCA()*# configuring the parameteres*
*# the number of components = 2*
pca.n_components = 2
pca_data = pca.fit_transform(standardized_data) pca_data = np.vstack((pca_data.T, labels)).T

*# creating a new data frame which help us in plotting the result data*
pca_df = pd.DataFrame(data=pca_data, columns=("1st_principal", "2nd_principal", "label"))# plot the data
sns.FacetGrid(pca_df, hue="label", size=6).map(plt.scatter, '1st_principal', '2nd_principal').add_legend()
plt.show()

3.降维

在这一节中,我们想找到描述我们的数据所需的特征向量的数量。因此,我们需要计算每个特征值的显著性,然后计算累积方差。我将特征值的重要性定义为:

**# initializing the pca**
from sklearn import decomposition
pca = decomposition.PCA()
**# PCA for dimensionality reduction (non-visualization)**pca.n_components = 784
pca_data = pca.fit_transform(standardized_data)# then we calculate the significance but the absolute value is not necessary as the eigen values are already positive
significance = pca.explained_variance_/ np.sum(pca.explained_variance_)cum_var_explained = np.cumsum(significance) *# Plot the PCA spectrum*
plt.figure(1, figsize=(6, 4))

plt.clf()
plt.plot(cum_var_explained, linewidth=2)
plt.axis('tight')
plt.grid()
plt.xlabel('n_components')
plt.ylabel('Cumulative_explained_variance')
plt.show()

4.如何选择 k 个特征向量

让我们回顾一下我们在第一部分看到的内容:

因此,我们绘制了该分量方差的累积和。这里 300 个成分解释了几乎 90%的差异。所以我们可以根据要求的方差来降维。

主成分分析法的优点和用途

PCA 是一种降维的方法,但是可以要求成分独立:独立成分分析 ( ICA )。
PCA 是一种无监督线性方法,大多数无监督技术并非如此。
由于 PCA 是一种降维方法,它允许将数据投影到 1D、2D 或 3D 中,从而将数据可视化。这对加速训练过程也非常有用,因为它大大减少了特征的数量,从而减少了参数的数量。

我希望你已经找到了你在这篇文章中寻找的东西,并祝你未来的项目好运!

如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名灵媒成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金,你仍然要支付 5 美元。谢谢大家!!

[## 通过我的推荐链接加入媒体-乔纳森·莱班

阅读乔纳森·莱班的每一个故事(以及媒体上成千上万的其他作家)。您的会员费直接支持…

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

PS:我目前是伯克利的工程硕士学生,如果你想讨论这个话题,请随时联系我。 这里的 是我的邮箱。

没有事实,只有解释

原文:https://towardsdatascience.com/there-are-no-facts-only-interpretations-abc70a48014b?source=collection_archive---------31-----------------------

冠状病毒危机说明了了解您的数据的重要性

弗里德里希·尼采,数据专家(图片版权 Adobe)

“没有事实,只有解释”,不管怎么说,这是尼采的观点。这可能看起来很奇怪:数据,以其明显的精确性、结构性和清晰性,可能看起来就是客观确定性的定义,但那是一种错觉。现实是,数据总是收集数据的人如何看待世界的主观和不完美的表达。

冠状病毒的爆发就是一个很好的例子。一方面,这是一场极其明显的危机。病例和死亡人数每天都在公布,开源数据集可供任何人分析和建模。然而,尽管如此,即使是最基本的问题也很难找到好的答案。

在这篇文章中,我将概述我在思考数据时使用的一些问题,然后将它们应用于开源冠状病毒数据集,以了解它们如何影响我们回答一些常见问题的能力:病毒有多危险,政府在管理危机方面做得如何?

关于数据的问题

如果你不监管你的数据,没人会监管。马特·波波维奇在 Unsplash 上的照片

为什么要收集这些数据?

在收集数据时,必须做出许多决定,包括收集什么,遗漏什么,以及如何解释各种情况。理解为什么要收集数据,对于帮助你理解导致这些数据出现在你面前的决策是至关重要的,并且应该支配你对这些数据的思考方式。由试图向你推销某种东西的人建立的数据集应该与由更中立的人建立的数据集有所不同。为关键流程或基础设施提供数据的数据集不同于在服务器上放置了一两年而无人查看的数据集。

而且,不知道为什么,你会一直问自己“等等,他们为什么要这么做?!"当你在数据中发现各种各样的小精灵和奇怪的东西时。

数据有多完整?

没有真正“完整”的数据集,因为数据创建过程必然涉及决定不收集关于某些实体或这些实体的属性的信息。总是有更多的事情可以衡量,所以思考数据中你没有看到的和你看到的是至关重要的。

通常,您将处理抽样数据,因为收集整个人口的数据要么不可行,要么成本太高。在这种情况下,理解如何以及为什么以这种方式对数据进行采样,以及所选择的采样方法的一致性是至关重要的。通常,为用途 A 选择的采样方法使其对用途 B、C 和 D 无效,我们将在稍后考虑冠状病毒死亡率时看到这一点。

数据收集过程有多准确?

数据准确性会受到任何因素的影响,包括测试准确性、生成数据的系统的稳定性,或者人工数据收集者的知识和动机。请记住,仅仅因为数据都在同一个表中,就不能保证它们都同样准确;一些可能维护得很好,很精确,而另一些却一团糟。

人为错误或偏见是如何进来的?

有时候,收集数据的人知识渊博、细心、资源丰富,并且有足够的时间做好他们的工作。其他时候那是…事实并非如此。类似地,在有强烈动机看到某些结果的地方,许多人很难完全抵制将数据推向那个方向的冲动。然后总是有好的老式欺诈…

数据收集是否一致?

以上几点都不一定随着时间、地点或数据收集者而一致。数据收集团队的新领导或利益相关者可能意味着数据收集政策的改变。不断发展的技术或更广泛的背景可能会改变数据收集的方法或规模。它也可能只是一个简单的错误,在 6 个月内发现,修复不能追溯。

冠状病毒数据

“我们的数据世界”网站有很多优秀的图表,这些图表每天都来自于“T2”欧洲疾病预防和控制中心。还有其他网站,但它们都有相似的来源:按国家收集的报告病例和死亡病例。

为什么要收集这些数据?

在这种情况下,数据主要由每个国家的卫生当局收集,以告知相关国家政府病毒是如何传播的,以及对其卫生服务造成的压力。

这意味着数据往往侧重于影响卫生系统的病例,更适合每个国家政府的需要,而不是着眼于全球一致性。这并不是说没有调整实践的努力,但国家政府的需求将是第一位的。

数据有多完整?

众所周知,在许多国家,检测的可获得性有限,因此数据远不具有代表性。顺便提一句,这一点在确定国家处于感染曲线的哪个位置时至关重要:它们达到峰值了吗,还是已经超出了它们的检测能力?

测试通常不是随机进行的。相反,只有出现症状的病例(有时只有非常严重的症状)才会接受检测。这使得任何关于死亡率的推论都非常可疑。

同样,在死亡统计上,不同的国家对冠状病毒死亡的统计也不同。一些人只统计了住院死亡人数,其他人则包括护理院和其他非住院死亡人数,这可能会对总数产生非常大的影响。

数据收集过程有多准确?

没有一种病毒测试是完全准确的,冠状病毒测试和其他任何测试一样都有假阳性和假阴性率。有许多可用的测试,其中一些似乎比另一些更不准确,所以我们需要小心的比较使用不同测试的人群。

另请注意,此数据中的日期粒度是根据报告日期确定的,这可能会给出一个奇怪的工作日/周末周期,因为并非所有来源都在周末报告(不,病毒不会在周末休息)。

人为错误或偏见是如何进来的?

疫情是一场巨大、可怕的全球性危机,在这场危机中,本已捉襟见肘的卫生基础设施正在迅速适应巨大的问题。错误是意料之中的。

一些国家的报告做法可能也不完全透明。例如,淡化数字的指责指向了中国俄国

数据收集是否一致?

不同国家(或州)的数据收集并不一致:不同的测试策略、不同的测试和不同的死亡测量方法都意味着我们通常不会进行比较。这并不是说,努力保持指标一致的国家之间的指标永远不具有可比性,但我们应该假设情况并非如此,直到出现其他情况。

我们还预计,随着更多(更好)测试的出现,以及政府调整其指标以更好地反映他们对危机的理解,一个国家内的指标会随着时间的推移而变化(例如,在报告的总数中包括养老院死亡人数)。

总之,这是一组非常粗略的数据,我们需要非常小心地从中得出结论。让我们来看几个问题,看看这对我们得出结论的能力有什么影响。

冠状病毒有多危险?

在我们深入研究之前,值得注意的是,这种病毒的感染率和死亡率与你在疫情的个人风险不同。如果你足够幸运躲过了病毒,但却遭遇了一场车祸,通常需要 5 分钟才能到达的救护车花了 50 分钟才到达,你很可能成为疫情的受害者,如果不是病毒的话。这些“附带”死亡并非微不足道,早期分析表明它们可能是许多国家报告死亡人数的两倍或更多(尽管其中一些将是上文提到的未报告的病毒死亡)。

此外,这个问题隐含地假设有一种病毒株有一个死亡率,而可能有多种病毒株有不同的死亡率

尽管如此,还是让我们把注意力放在病毒本身的死亡率上。快速浏览一下 4 月 21 日的数据报告中的世界,我们看到 169859 例死亡和 243 万例病例;这给了我们 7.0%的死亡率。

正如我们已经提到的,事情并没有那么简单。由于政府如何管理检测,使用何种检测,以及如何记录死亡人数,病例和死亡人数都严重失真。理清这些扭曲对全球数据集的影响将非常棘手,如果不是不可能的话。

当然,我们会及时回答这个问题,研究已经在进行中(谢天谢地,死亡率比 7% 低得多)。我的观点是,即使我们手边有大量每日更新的全球数据,我们仍然会得到可能相差一个数量级的答案。相反,对于这个特殊的问题,我们需要精心制作一个定制的数据集,一个随机抽样和一致跟踪的数据集。

让我们试试另一个问题,看看我们的进展是否更好。

政府应对危机的能力如何?

如上所述,重点通常是直接由冠状病毒导致的死亡,所以如果一些反病毒措施无意中导致其他地方的死亡,我们需要一段时间才能知道。不过,现在让我们先把这个问题放在一边,再次关注病毒死亡率。此外,关于我们是否应该比较绝对数字或每百万死亡/病例数,也有一些争论。鉴于我对比较瑞士(人口 900 万)和美国(人口 3.28 亿)很感兴趣,我将从人均水平来看:

数据来自:https://ourworldindata.org/coronavirus(快照拍摄于 2020 年 4 月 19 日)

正如广泛报道的那样,西班牙显然正处于艰难时期。英国、法国和意大利的曲线几乎完全相同。美国还没有达到西班牙、意大利或英国的梯度。瑞士看起来像德国,但更糟,韩国仍然是积极的局外人。

那么,对于这些国家之间不同的战略和能力,我们能得出什么结论呢?除了告诉每个人要像韩国那样(提前做好充分准备),很难对他们措施的有效性做出有信心的判断,锁定“实力”和死亡人数之间没有明显的模式。如前所述,我们不知道不同的数据收集做法如何加剧或隐藏这些国家之间的差异。

此外,为了正确回答这个问题,我们需要大量的额外数据,以了解人口密度、病毒变异、人口统计数据、吸烟率、气候等因素在多大程度上影响了传播和死亡率,以及那些可归因于政府政策的因素,如检测、口罩、封锁和社会距离。只有当我们控制了这些因素后,我们才能指出具体的决策和政策,看看它们真正产生了什么样的影响。

这里的要点是不要让无能的政府逃脱责任;一些政府似乎确实在方向盘上睡着了。更确切地说,关键是尽管我们手边有大量的数据,但我们发现自己需要更多的背景和不同的数据来正确回答这个问题。

所有的装备,不知道

我们越来越幸运地拥有大量的数据和很酷的工具。虽然这是一件很棒的事情,但它肯定会让我们更容易陷入分析和数据科学的最糟糕的习惯:跳入我们并不真正理解的数据,并快速制作一堆很酷的图表和指标来展示给所有人。

虽然不是特别性感,但花几个小时(是的,几个小时)真正理解你正在处理的数据,以及它与你试图解决的问题的关系,是伟大的分析和,嗯,看起来闪闪发光的垃圾之间的区别。您会惊讶地发现,您开始处理的数据实际上根本不是您需要的。

数据科学就像烹饪,神奇之处在于配料。照片由西德·瓦克斯Unsplash 上拍摄

我希望这篇文章中列出的问题有助于你完成这个过程。毫无疑问,它们并不详尽,您可能有自己喜欢使用的。底线是:不要将数据视为客观事实,而更像是创建数据的人认为在当时记录重要且可行的东西的反映。换句话说,分析和数据科学就像烹饪,你可以让几乎任何东西在锅里冒泡,但如果你没有正确选择配料,你可能不想吃结果。

没有像应用数据科学这样的数据科学

原文:https://towardsdatascience.com/there-is-no-data-science-like-applied-data-science-99b6c5308b5a?source=collection_archive---------20-----------------------

FastAI 的杰瑞米·霍华德如何向我推销面向大众的应用数据科学

介绍

前阵子我听了莱克斯·弗里德曼对法斯泰杰瑞米·霍华德的采访。在那次采访中,他分享了自己的激情:让神经网络变得非常容易使用,从而让更多的人能够接触到它们。他认为,通过增加试图解决相关问题的人数,从长远来看,更多的问题将会得到解决。他引用的例子是一位精通技术的医生使用深度学习来解决具体的医疗问题。

在这篇文章中,我想阐述我认为一个可访问的应用深度学习平台需要什么。此外,我想深入研究更基础的研究和应用深度学习之间的关系。

照片由 Antoine DautryUnsplash 上拍摄

是什么让深度学习系统变得触手可及

抽象层次

一个可访问的系统需要正确处理的最重要的方面之一是接口的抽象层次。对于术语抽象,我指的是用户在使用深度学习系统时必须处理的信息的数量和类型。从用户那里抽象出不需要的信息和细节使得信息负载更易于管理。哪些信息被认为是不需要的,这当然是设计这种界面的关键挑战。

例如,当我们训练一个 CNN 来执行图像识别时,应用用户不需要知道梯度下降如何精确地拟合神经网络的系数。如果有好的自动评估方法,也不应该要求用户调整神经网络内部的设置。当然,在理想的系统中,如果用户需要,可以访问底层细节。

软件管理的稳定性和易用性

安装和更新系统应该很容易。此外,软件应该非常稳定和可预测。奇怪的错误和意想不到的行为是不关注 it 的用户的祸根:他们只是想完成工作,而不是花几天时间小心翼翼地建立一个工作系统。

最近钻研强化学习,结果用了试剂。该系统比研究人员编写的代码进步了一大步,但它肯定不是一个像 sklearn 那样可访问且健壮的系统。如果你不能全身心投入到试剂中,那么缺乏可及性会使你很难工作。这限制了我的可用性,因为我一周只能奉献一天。将深度学习工具交到兼职用户手中,尤其是领域专家,有很大的潜力让很多现实世界的问题得到解决。

合理的资源使用

从较小的数据集和回归等工具到较大的数据集和深度学习,所需的计算资源量呈指数级增长。大公司和研究小组可以投资大量的这种计算,但这对于普通用户来说是不可行的。FastAI 的一个关键设计原则是,它应该在单个 GPU 上运行,这使得投资变得可行,因为您只需要一台像样的游戏或工作站 pc。

基础研究呢

随着所有这些关于应用深度学习重要性的讨论,核心研究呢?霍华德的一个挫折是,深度学习研究社区过度关注算法的小增量更新。让学习过程加快百分之五,稍微调整一下网络架构以提高性能。他真的想解决现实世界的问题,而不是拘泥于细枝末节。

当然,如果没有研究,所有花哨的算法和工具都不会首先存在,让 FastAI 捡起来。在我看来,我们两者都需要:研究人员发明解决问题的新方法,行业人士和领域专家可以采用这些工具,并将它们应用到新的环境中。像 FastAI 这样的工具对帮助行业和领域专家做到这一点大有帮助。

最后,你对可访问的深度学习系统有什么想法?我们应该把这些工具放在群众手中,还是应该留给专家?

如果你喜欢这篇文章,你可能也会喜欢我的一些更长的文章:

在桑港,年轻选民并不过剩

原文:https://towardsdatascience.com/there-is-no-surplus-of-younger-voters-in-sengkang-8c3056b236a7?source=collection_archive---------45-----------------------

获胜的工人党团队缺乏特殊的人口优势——这对他们来说是个好兆头

许多最近 关于 2020 年新加坡大选结果的评论都集中在新加坡国会选区的结果上,由相对年轻的候选人组成的反对党工人党(WP)团队出人意料地获得了一个新的 4 人团体代表选区(GRC ),这被预示为与有争议的选区有有益的人口结构匹配。该团队年龄最大的候选人 Jamus Lim(44 岁)和最年轻的 Raeesah Khan(26 岁)在某种程度上代表了更大的竞选轨迹本身,jam us 在竞选开始时的电视辩论中真诚的理想主义赢得了广泛的赞誉,而 Raeesah 在竞选结束时的社交媒体帖子中关于种族和宗教偏见的指控可能适得其反,反而暴露了更大的系统性歧视问题。 言论管制的不公平和其他权力失衡在新加坡政治中,这些问题被认为对年轻选民有着特殊的共鸣。 但是,事实上,年轻的选民在全国范围内从执政的人民行动党(PAP)中脱颖而出,并在选举结果中证明了对 Sengkang 的决定性作用,因为他们在那个选区应该占主导地位?

将选区映射到人口统计数据

确定新加坡选区的人口构成有点棘手,因为选区的界限会随着每次选举而变化,政府机构公布的数据也不符合这些选区。但是,可以执行粗略的映射。统计部门每年公布新加坡常住人口的人口统计数据,这些数据被划分为由新加坡城市规划机构——新加坡城市再发展局(URA)划定的所谓的规划区。每个规划区可以进一步细分为子区。使用地理空间软件,当选举边界与这些分区的边界重叠时(两者都是公开 可用,人们发现选举分区大体上可以被表征为分区的集合。在下面的例子中,我们可以看到,僧康镇 GRC 实际上由 Anchorvale、Compassvale、Rivervale 和僧康镇中心的规划分区组成。

由 Sengkang GRC 界定的分区(黄色)。红色代表选区边界,灰色代表分区边界

这种映射绝不是精确的——人们发现分区边界经常渗透到其他选区。然而,这些不一致很少是致命的。我们可以使用一个简单的经验法则——如果分区的至少大部分可以在选举区内划定,并且分区的划定区域居住有住宅物业(如 URA 总体规划覆盖图所确定的),则分区被包括在内。因此,Compassvale 分区包含在 Sengkang GRC 内,尽管其部分区域延伸至邻近的 Ang Mo Kio 选区,因为这些区域不包含住宅物业。

由 Sengkang GRC 界定的分区(黄色)。蓝色多边形表示 Plan 2014 年土地利用总体规划划定的居住区

(为了透明和可再现性,我已经 发布了我的映射 ,如果有任何争议,您可以在评论中联系我。)

由于统计局按分区公布人口数据,一旦绘制地图(一个相当繁琐的手工过程)完成,通过汇总过程确定每个选区的人口构成就变得相当简单(只要有所需的人口特征)。这样,我们就可以计算出一个选区中属于每个主要年龄组的居民的比例。我使用了以下简单的三方约定:

  • 年轻选民:20 *至 35 岁(含)的常住人口
  • 老年选民:65 岁及以上常住人口
  • 中年选民:35 岁至 65 岁的常住人口

年轻居民,而不是年轻选民

根据 2018 年公布的统计数据,我们发现,作为该选区总常住人口的一部分,与 WP 竞争的其他选区相比,甚至在全国范围内:

WP 竞选选区中 20-35 岁居民的比例

20 岁至 35 岁的居民占参康选区的 21.1%,与 WP 竞争的其他选区相似,与全国 20.7%的比例没有太大差别。有人可能会说,我对年轻选民的定义是限制性的,我们还应该包括 35-40 岁,甚至 40-45 岁的年龄段:

WP 竞选选区中 20-45 岁居民的比例

我们在这里开始看到一些分离,与全国 35.9%的年龄在 20 到 45 岁之间的居民相比,在僧康有 39.7%的居民。但是,所有这些选民真的够“年轻”吗?更确切地说,桑岗作为一个年轻城镇的普通形象最明显的表现是,它还没有达到投票年龄的年轻居民的比例高于平均水平

WP 竞选选区中 20 岁以下居民的比例

与全国 20.5% 的 20 岁以下人口相比,在圣康集居地,20 岁以下人口仅占四分之一多一点( 25.3% )。此外,僧康的老年居民比例较低:

65 岁及以上居民在 WP 竞选选区的比例

与全国 13.7%的比例相比,僧康镇只有 8.7%的 65 岁及以上居民。

别忘了丰戈尔西

显而易见的是,在僧康选区并不存在年轻选民过剩的情况,相反,有年幼子女的家庭过剩。基于这些数据,如果没有庞大而负债的老年人选票作为选举缓冲,重新描述由*这一特殊人口群体推动的僧康起义可能会很有吸引力。人们甚至可以讲一个半可信的故事,讲述沉浸在社交媒体方式中并投资于进步事业的在校青年如何以某种方式影响他们的父母投票给工人党!但这是为了逃避一个不方便的数据点,即丰郭尔西 SMC** 是 WP (61.0%的人民行动党)争夺的唯一表现最好的人民行动党选区,20 岁以下居民的比例甚至更高(30.3%比全国 20.5%),老年居民的比例更低(6.2%比全国 13.7%)。不可能出现这样的情况,在与竞争的反对党选择相同的 WP 的情况下,有年幼孩子的父母的人口统计和这个人口统计在一个选区决定性地转向反对执政党,而在另一个选区团结向他们。***

愚蠢的模特

事实上,一个简单的关于人民行动党在 WP 竞争选区的投票份额的广义线性模型显示,20 岁以下的年轻居民比例较高的影响实际上是非常积极的:

WP 竞选选区 PAP 选票份额的广义线性模型。“挑战者”表示人民行动党是否是选区中的挑战者(相对于现任者)。为了获得变量效应的比值比,取估计值的指数,例如 PAP 成为挑战者的效应是 exp(-0.299) = 0.74 或比值减少 26%。

在这里,选区中 20 岁以下的居民的比例每超过全国比例1 个百分点就会导致 22%的比例增加(估计优势比为 1.22),使得人民行动党赢得该选区的几率从大约 50-50 增加到 54-46。有趣的是,选区中 65 岁及以上的居民比例每比全国比例****增加 1 个百分点就会导致优势增加 22%(估计优势比为 1.22)——相反,这意味着低于平均水平的老年居民比例会降低优势。因此,在丰国西部和胜康之间,一个简单的人口统计模型显示了选区中高于平均水平的年轻居民比例和低于平均水平的老年居民比例之间的拉锯战,丰国西部年轻居民比例高得多,大大抵消了老年居民比例低的优势,为人民行动党提供了健康的获胜优势。该模型预测的人民行动党投票份额实际上非常接近实际结果:**********

WP 竞争选区的实际与拟合 PAP 投票份额,使用 PAP 挑战者地位、20 岁以下居民人口比例和 65 岁及以上居民人口比例的 3 因素模型

奥卡姆剃刀

我真的相信,正如这个模型所暗示的那样,有年幼子女的家庭在 WP 争夺的选区里不顾传统智慧,向人民行动党靠拢?一点也不。首先,该模型只适合 6 个数据点(6 个 WP 竞争选区),容易过度拟合。这次演习的目的是证明,确定一个特定的人口优势来解释 WP 在 Sengkang 的胜利是具有挑战性的,因为人们必须考虑到相邻的 Punggol West 的人口过剩的相反趋势。这一结论已经在关于执政党对选举结果进行更深入分析的公开声明中得到暗示。

相反,更简洁的解释是国家层面的战略投票。所有的人口群体,不仅仅是年轻选民或年轻家庭的选民,都果断地离开了 T2 的执政党,但仅仅是在桑港。无论选举中出现了什么突出的问题——对议会中声音多样性的渴望,对高压政治策略的拒绝,甚至是 Jamus Lim 的个人声望——僧康的居民集体承担起了国家责任,并确保这些观点得到代表,但在丰郭尔西和其他地方,类似的选民做出了不同的决定。

这对工人党和新加坡来说是个好兆头。基于年龄的政治两极分化的建议,年轻选民无可挽回地远离执政党,而老年人仍然是人民行动党的坚实的压舱石,可能还为时过早。相反,即使是同一个反对党参与竞选,同样的人口也会根据选区的不同而投出不同的票。来自桑港工人党的新议员不应该把自己视为派系人口利益的承担者,而应该把自己视为集体民族意愿的承担者——一种寻求替代但可信的政治代表、对执政党的制衡以及拒绝政府中的专制冲动的意愿。新加坡的选民,不仅仅是胜港的选民,而是全体选民,都发出了自己的声音。

*虽然新加坡法定投票年龄为 21 岁,但为了简化计算,年轻选民的定义包括 20 岁的居民。

容器和无服务器计算之间正在进行一场战争

原文:https://towardsdatascience.com/theres-an-ongoing-war-between-containers-and-serverless-computing-f2ba5379ae26?source=collection_archive---------37-----------------------

但是最好的选择可能是同时使用两者

归根结底,容器和无服务器技术都是在服务器上运行的。但是用户体验却大不相同。克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片

W W 开发人员的工作是什么?当然是写软件。但情况并非总是如此。

过去,每个应用程序都有自己的服务器。由于每台服务器的资源有限,开发人员不得不经常考虑不要让服务器的容量超载。如果一个应用程序需要在不同的服务器上运行,整个过程都必须重新设置。

企业很快意识到这相当低效:一方面,开发人员不高兴,因为他们不得不担心代码以外的其他事情。另一方面,每当一个应用程序没有占用 100%的服务器容量时,就会有大量计算资源闲置。

快进到今天:你上一次担心服务器架构是什么时候?可能有一段时间了。

这并不意味着我们摆脱了所有关于内存、RAM、存储等等的考虑。尽管开发人员越来越多地摆脱了这些问题,但这个过程还远远没有结束。

到目前为止,我们还没有走到虚拟化之路的尽头,再也不用担心服务器了。目前还不清楚哪种技术将会胜出。会是虚拟机吗?集装箱?还是无服务器计算?这是一个正在进行的辩论,也是一个值得详细研究的问题。

[## 无服务器是 Kubernetes 的末日吗?

对两种技术进行比较,以结束孰优孰劣的争论。

towardsdatascience.com](/kubernetes-serverless-differences-84699f370609)

虚拟机的出现

进入 20 世纪 60 年代,那时虚拟机(VM)第一次被发明出来。人们不再一次为一个应用程序使用裸机服务器,而是开始考虑在一台服务器上运行多个操作系统(OS)。这将允许多个应用程序分别运行,每个应用程序都有自己的操作系统。

在 IBM 和其他公司,他们实现了仅仅是:他们模拟物理服务器,也就是说,他们对它进行虚拟表示。所谓的虚拟机管理程序负责为虚拟机分配计算资源,并确保虚拟机不会相互干扰。

这样不仅可以更有效地利用一台服务器的计算资源。您还可以在许多不同的服务器上运行应用程序,而不必每次都重新配置它。如果服务器没有安装正确操作系统的虚拟机,您可以克隆另一个虚拟机。

除此之外,虚拟机可以使服务器更加安全,因为您可以扫描它们以查找恶意软件。如果你发现了一些,你可以在一个更早的版本中恢复虚拟机,这基本上消除了恶意软件。

考虑到这些优势,虚拟机主宰这个领域也就不足为奇了,裸机应用程序非常罕见。Linux 和 Ubuntu 是许多虚拟机中常见的客户。Java 和 Python 运行在精简版的虚拟机上,这使得开发人员可以在任何机器上执行他们的代码。

如果没有虚拟机,Python 和 Java 将无法在任何地方部署。在 Unsplash科普高清照片

战场 1:虚拟机对容器

虚拟机模拟它所运行的硬件。相比之下,容器只是模拟一个操作系统,通常是 Linux。这就是为什么它不包含运行它的硬件的虚拟副本。

像虚拟机一样,容器离不开操作系统、应用程序及其库和依赖项。但是放弃硬件仿真的结果是容器更加轻量级、快速和可移植。这就是为什么容器只需要几秒钟就能启动,而虚拟机通常需要几分钟。

另一方面,容器并不总是像虚拟机一样安全。如果恶意软件进入容器化的系统并进入操作系统,它就有可能劫持整台机器。

相比之下,虚拟机将不同的操作系统彼此分开。因此,即使恶意软件侵入了某个虚拟机的操作系统,该虚拟机上的所有其他虚拟机也不会受到攻击。这增加了额外的安全级别,例如在处理机密数据时,这可能是至关重要的。

与容器相比,虚拟机的另一个优势是可以使用不同的操作系统。当然,这需要做更多的工作,因为您可能需要在每个操作系统上分别实现错误修复。但是如果你有一个应用程序应该运行在除了 Linux 之外的任何系统上,容器就不是一个好的选择。

另一方面,容器非常适合任何具有微服务架构的东西,也就是说,单个应用程序由许多较小的服务组成,这些服务只是松散耦合的,可以独立执行。每个单独的服务都可以放在自己的容器中。然后,开发人员需要注意的唯一事情是容器之间的正确通信。

[## 使用 Docker-Compose 将您的整个数据科学环境(或任何您想要的东西)容器化

用一个简单的文件和几个命令行从多个交互的容器中构建应用程序。

towardsdatascience.com](/containerize-your-whole-data-science-environment-or-anything-you-want-with-docker-compose-e962b8ce8ce5)

战场 2: Docker 对 Kubernetes

有一种技术与集装箱引擎同义:码头工人。但是在同一个句子中还有另一项经常被提及的技术: Kubernetes 。那么到底发生了什么 Docker 和 Kubernetes 是朋友还是敌人?

正如微软所说,比较 Docker 和 Kubernetes 有点像比较苹果和苹果派。Docker 是一种容器和开源技术的文件格式,可以在任何地方运行应用程序。Kubernetes 协调和调度许多容器,并确保它们相互之间正常通信。

Docker 有自己的容器编排服务 Docker Swarm。然而,赢家很明显:Kubernetes 比 Docker Swarm 更广泛。Kubernetes 可以在整个机器集群上运行,而 Docker Swarm 只能在单个节点上运行。

因此,除非您在单个节点上部署容器,或者不需要 Kubernetes 带来的复杂性,否则没有必要再考虑 Docker Swarm。如果你认为容器编排,想想 Kubernetes。

除了管理容器之外,Kubernetes 还允许您编排一个虚拟机集群(是的,虚拟机),并根据可用的计算资源和每个容器的要求,安排容器在选定的虚拟机上运行。

你没听错:VMs、Docker 和 Kubernetes 在一个工作流中。到目前为止,这听起来不像是一场战斗,更像是一部交响乐。但是等等,因为还有一个要来。

关于虚拟机、容器和无服务器的争论远未结束。克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片

战场 3:容器对无服务器

如果虚拟机将物理硬件从开发人员手中拿走,而容器消除了对操作系统的任何担忧(我说的是 Docker plus(可选的 Kubernetes)这样的容器),那么无服务器将使这一旅程又向前迈进了一步。

您可以在下图中看到这一点:使用无服务器,开发人员甚至不必担心他们的应用程序何时以及如何执行,他们应该将它放在哪个容器中,或者它将消耗多少计算资源。当然,他们仍然需要编写应用程序,但在他们上传到 AWS Lambda、Aurora 或 CloudFront 服务后,他们就可以收工了。

他们的代码将会休眠,直到被执行。您只需为您真正使用的机器时间付费,这使得整个事情非常经济。相比之下,您需要为 Docker 支付月费,为 Kubernetes 支付每个集群每小时的费用,不管您使用了多少。

然而,这并不意味着无服务器为王。这是一项相当新的技术,目前无论你去哪里都有限制。

例如,目前很难在无服务器上完成 A/B 测试,或者让其他复杂的部署选项工作。另外,无服务器需要一些时间来初始化代码。所以如果你需要你的应用程序非常快,你应该使用容器。

此外,无服务器还带有计算资源方面的限制。所以如果你有一个占用大量内存或者运行很长时间的任务,你最好使用容器。

虚拟化是如何发展的。IaaS,“基础设施即服务”,是虚拟机的一个时髦词汇。CaaS 代表“容器即服务”,FaaS 代表“功能即服务”,也就是无服务器计算。图片由作者提供,参考 DigitalCloud

未来会怎样

所有这些对无服务器的限制都不是天生的,所以我们可以期待无服务器在未来几年赢得更多容器市场。它也越来越受欢迎,因为它比容器编排对初学者更友好,非常容易扩展,并且在工作负载方面非常灵活和经济。

因此,无怪乎无服务器架构市场预计将在未来几年内增长两倍,到 2025 年总收入将超过 210 亿美元。但这并不意味着虚拟机和容器会消亡。

在十年左右的时间里,我们不太可能看到无服务器技术。看看虚拟机就知道了,它已经存在了半个世纪,现在仍在大量使用。相反,我们很可能会看到更多的容器与无服务器的共生,就像容器和虚拟机一起工作一样。像 AWS Fargate 这样的服务已经可以让你将容器和无服务器无缝地结合起来。

所有这些解决方案——虚拟机、容器和无服务器——都是好的解决方案,都有其特定的优势和劣势。尽管它们有时会在重叠的空间上竞争,但好消息是你可以混合搭配它们来满足你的需求。

大型科技公司的虚拟化之旅还远未结束。除了提高开发者效率,我们甚至不知道目的地会是什么样子。但是所有的迹象都表明,这是一条有趣、迷人且相当有利可图的未来之路。

据我们所知,无服务器可能不是最后一步。谁知道,真的,将来我们会玩什么技术?

商业没有水晶球

原文:https://towardsdatascience.com/theres-no-crystal-ball-for-business-f0b93df92ab9?source=collection_archive---------57-----------------------

新的思维模式是预测未来的关键吗?

照片由 标注 Boss

预测未来很难。我很确定这一点,因为我从来没有赢过强力球,你也没有。

尽管如此,作为商业领袖,我们需要了解市场和我们的客户是如何变化的,以便做出有效的决策。获得市场和行为洞察最常见的方法是通过数据,但大多数人使用历史数据的简单模型来预测未来的行为。无论我们是处于“典型的”市场时期,还是像现在这样剧烈动荡的时期,这都是不够的。你需要创造性地思考你的数据和你的预测来选择智能模型,以便你的预测尽可能有用。

有许多技术和工具可以用来为你的业务创建有用的预测,我将介绍一些常见预测的例子,以及如何实现它们。具体来说,我们将涵盖:

  1. 当数据非常嘈杂时,如何预测收入等指标
  2. 如何预测客户行为,如流失

预测收入

照片由Robynne Hu拍下

让我先提出一个警告。 预测未来【1】不是一门精确的科学。它永远不会百分之百准确。即便如此,预测提供了有价值的指导,并且随着你使用它的时间越长,它还会继续改进。应用更好的建模方法可以极大地改善任何业务的总体结果。**

预测建模很困难,因为真实世界数据很复杂。例如,给定一个每日收入数据(其中每个点是一天),尝试预测下一周每天的收入(参见图 1)。

图一。嘈杂的收入数据

像大多数真实世界的数据一样,这些数据中隐藏着模式和趋势,这使得外推变得困难。

像线性回归这样的基本技术可以绘制出一个总体趋势线,但不能预测下周的每一天。我们可以使用像双指数平滑这样的高级技术,但是它们很难实现。

幸运的是,有一种更简单的方法来模拟我们对下周的预测。

****重复周期意味着我们可以独立地关注一周中的每一天,而不是试图从整体上理解数据。例如,仅使用星期一向我们展示了星期一的趋势和模式实际上是一条直线(参见图 2)。

图二。仅周一的独立线性外推

通过为一周中的每一天创建单独的趋势线,我们可以以相当高的准确度为下周的每一天构建一个收入模型(参见图 3)。

图三。由一周中每一天的单独预测组成的完全构建的预测

如果你像大多数企业一样,你不需要每天预测收入。那很好。该模型处理遵循共同周期的周、月或季度数据。

但是,你可能有一个非典型周期的业务或季节性业务,如旅游业。那也很好。如果你的业务数据没有明确的周期或趋势,你可以使用趋势线或更高级的建模技术退回到一般预测。****

预测销售额

了解销售渠道是企业面临的最常见挑战之一。为了预测收入,了解销售漏斗非常重要。但是,我们如何预测通过漏斗顶部进入的销售线索量呢?实现这一点的一种方法是实施销售线索评分。

****销售线索评分是对销售线索进行排序的过程,从“最热”到“最冷”这使您可以将资源分配给“热门”销售线索,同时在销售漏斗中移动较冷门的销售线索时,保持与它们的不同接触程度。

使用销售线索评分来预测未来收入始于数据收集。相关数据可以包括关于潜在公司或个人的人口统计信息、对购买数据的洞察和行为指标。

例如,有用的公司级人口统计数据可能包括公司的行业或规模。个人人口统计信息可以是一个人在公司的职位和角色、他们的预算或权力级别。行为指标可以包括一个人打开你的电子邮件或参加网上研讨会的次数。

使用这些数据,您可以为每个销售线索分配点数。你甚至可以给“冷淡”的行为减分,比如退订邮件列表。

虽然传统的评分机制很有帮助,但它并不能预测销售线索是否会转化。然而,有一些机器学习技术可以帮助你。更基本的方法之一是所谓的逻辑回归。逻辑回归类似于线性回归,只是您试图预测的变量是一个二元结果,在这种情况下,客户是否会转换,而不是一个连续值。

无论是哪种技术,它们都将依赖于高质量的历史数据,这些数据用于训练你的预测模型——越多越好!当您对销售线索进行评分并处理结果时,您会希望不断地重新评估您正在收集的数据的属性,以及您如何对您的评分进行加权,以查看您是否能够更好地预测未来的结果。

所以,如果我们不想失去客户,我们应该让他们都高兴,对不对?

当然,但是这比听起来要难。没有一种产品能让所有人都同样开心,而且总有新的竞争对手伺机而动,试图抢走我们的客户。如果有办法知道哪些顾客最危险,那就太好了,这样我们就可以专注于让他们更开心。

幸运的是有,它被称为流失预测。

流失预测的工作方式很像销售线索评分,但它不是估计销售线索转化为客户的可能性,而是估计客户流失的可能性。同样的公司/个人人口统计数据(例如,公司规模)在这里也是合适的。然而,行为数据需要更新,以包含关于客户如何参与您的产品的信息。

产品使用:客户登录了多少次?他们与你的产品互动的节奏是怎样的?客户中有多少用户在使用你的产品?客户是否改变了他们的服务级别(升级或降级)?你与客户的关系持续多久?

支持:客户提交了多少张支持票?每张罚单的严重程度如何?门票的基调是什么?罚单解决得有多快?

社交:客户在社交媒体上提到过你吗?客户是否向您推荐过其他公司?你被允许在你的网站上使用客户的标志吗?客户是否愿意为您提供案例研究进行宣传?

有了所有这些定义的属性和收集的数据,你就能够对你的所有客户进行评分,并很好地判断哪些客户可能会留下来,哪些会流失。

正如预测中的一切一样,没有水晶球会完美地告诉你未来会发生什么。目标是找到你的企业最可靠的领先指标,让你有足够的时间调整你的战略计划,以免为时过晚。

[1] A. Wieckowski,预测未来 (2018),哈佛商业评论

3 个神奇的熊猫提高记忆效率的窍门

原文:https://towardsdatascience.com/these-3-tricks-will-make-pandas-more-memory-efficient-455f9b672e00?source=collection_archive---------46-----------------------

你应该马上开始使用这三个技巧,停止使用不必要的工具。

照片由 Aaron BurdenUnsplash

M 任何数据分析任务仍然在笔记本电脑上执行。这加快了分析的速度,因为您已经准备好了熟悉的工作环境和所有的工具。但是你的笔记本电脑很可能不是拥有 x-GB 主内存的“最新野兽”。

然后一个记忆错误让你大吃一惊!

Gif 来自 Giphy

你该怎么办?用 Dask?你从来不使用它,这些工具通常有一些怪癖。你应该要求一个火花集群吗?或者说火花在这一点上是不是有点夸张的选择?

冷静…呼吸。

Gif 来自 Giphy

在考虑使用另一种工具之前,问自己以下问题:

我需要所有的行和列来执行分析吗?

在您开始之前,这里有几个您可能感兴趣的链接:

- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)

上面的一些链接是附属链接,如果你通过它们购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。

技巧 1:阅读时过滤行

在一种情况下,您不需要所有行,您可以分块读取数据集并过滤不必要的行以减少内存使用:

iter_csv = pd.read_csv('dataset.csv', iterator=True, chunksize=1000)
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])

分块读取数据集比一次全部读取要慢。我建议只对大于内存的数据集使用这种方法。

技巧 2:阅读时过滤列

在一种情况下,您不需要所有的列,您可以在读取数据集时使用“usecols”参数指定必需的列:

df = pd.read_csv('file.csv', u*secols=['col1', 'col2'])*

这种方法通常会加快读取速度并减少内存消耗。因此,我建议对每个数据集使用。

技巧 3:结合两种方法

Gif 来自 Giphy

这两种方法的伟大之处在于,您可以将它们结合起来。因此过滤要读取的行并限制列数。

要升级你的熊猫游戏,看看我的熊猫系列:

[## 熊猫数据分析系列

从提示和技巧,如何不指南到与大数据分析相关的提示,熊猫文章的精选列表。

medium.com](https://medium.com/@romanorac/pandas-data-analysis-series-b8cec5b38b22)

但是我需要所有的列和行来进行分析!

Gif 来自 Giphy

那你应该试试 Vaex

Vaex 是一个高性能的 Python 库,用于懒惰的核外数据帧(类似于 Pandas),以可视化和探索大型表格数据集。它每秒可以计算超过 10 亿行的基本统计数据。它支持多种可视化,允许对大数据进行交互式探索。

[## 如何在几秒钟内处理数十亿行的数据帧

您应该知道的另一个用于数据分析的 Python 库——不,我不是在说 Spark 或 Dask。

towardsdatascience.com](/how-to-process-a-dataframe-with-billions-of-rows-in-seconds-c8212580f447)

在你走之前

推特上关注我,在那里我定期发关于数据科学和机器学习的推特。

照片由Courtney hedgeUnsplash 上拍摄

这些是 2020 年的大数据趋势。

原文:https://towardsdatascience.com/these-are-the-big-data-trends-2020-49c4db330ba1?source=collection_archive---------13-----------------------

大数据和分析是公司在竞争激烈的环境中生存的重要资源。今年,以下大数据趋势将对当前的 IT 环境产生影响。

D 数据来源和 AI 应用变得越来越复杂和全面。因此,2020 年将是大数据领域创新和进一步发展的又一年。最相关的趋势总结如下:

大数据变成宽数据

在大数据环境中,可扩展的云概念消除了限制公司的本地 IT 基础架构。今年的一个主题是“宽数据”这意味着 IT 部门越来越多地关注由不一致或格式不正确的数据和数据孤岛所创建的分散的、广泛分布的数据结构。

在过去的五年中,各种数据类型的数据库数量增加了一倍多,从大约 160 个增加到 340 个。受益最大的公司是那些能够在未来将数据整合成有意义的综合体的公司。

数据能力即服务

数据综合和数据分析的结合将进一步发展数据的有效利用。用户在阅读、工作、分析和交流数据时得到帮助是至关重要的。

为了实现这一目标,公司必须通过使用提供软件、培训以及支持 SaaS 模型(软件即服务)的合作伙伴来专门提升员工的数据知识。这不仅通过优化集成 DataOps 和自助分析改进了数据知识,还支持数据支持的决策。

数据运营和自助服务分析

借助现代自助工具,数据分析已经在业务层面成功实施。借助 DataOps,现在可以为数据管理提供灵活的解决方案。这意味着用户现在能够通过使用自动化和面向过程的技术显著提高数据管理的速度和质量。

实时数据集成、变更数据捕获(CDC)和流数据管道等技术为此奠定了基础。通过这种方式,运营数据管理中的 DataOps 和业务方面的自助服务分析在整个信息价值链中建立了一个顺畅的流程。借助数据运营和自助服务(2020 年的主要趋势之一),可以有效利用分散在整个公司的数据。

数据的“筛选”

虽然数据分析在最近几年取得了惊人的进展,但专家认为最重要的里程碑仍在我们面前:沙扎明数据。以前在手机上被称为“Shazam”的流行应用程序,可以识别正在播放的歌曲并提供相关信息,现在正在扩展到其他领域。这意味着,在 2020 年,我们也将体验到 shazaming 作为企业数据解决方案的应用。算法将支持分析系统识别数据模式和异常,并为进一步分析提供新数据。

专家们相信,在未来,数据解决方案不仅包括搜索、仪表板和可视化,还包括与运动传感器等数字设备通信的替代输入技术。沙扎明提供了巨大的机会,但也有被滥用的危险。

改进的语音处理

大数据、人工智能、物联网和机器学习(ML)实现了人类和技术交互的扩展维度。在自然语言处理(NLP)的帮助下,程序能够理解人类说的或写的语言。

由于 NLP 用于以人类语言交流内容,因此即使是未经训练的用户也可以与这种智能系统进行交互。除此之外,NLP 也是一个强大的工具,用于识别客户的需求,并根据这些需求开发产品和服务。

智能元数据目录

元数据是包含其他数据特征信息的结构化数据。这允许大量数据或原始数据被本地化、捕获、合成,最重要的是,在分布的和不同的数据库中被自动处理。

基于机器学习的智能功能用于数据准备、数据项目中的协作以及优化的工作流程。由于保留了整个上下文,因此信息更容易访问,也可用于未来的项目。

由于对智能元数据目录的需求不断增长,到 2020 年,它们将越来越多地配备人工智能,以实现主动、自适应和更快的数据供应。

关于气候变化和宇宙的研究

大数据解决方案可以为气候变化辩论做出决定性贡献。数据材料可以来自气象研究所、各种地球科学或粒子物理研究机构,甚至来自海洋研究的数据集。为了逼近从大爆炸到现在宇宙时间的事件,必须包括难以想象的大量输入。

实时分析变得更加有趣

数据密集型流媒体或实时数据分析流媒体将在 2020 年获得相当大的发展势头,不仅适用于大型的全球相关体育赛事。例如,金融世界可以通过复杂的网络连接传输数 Pb 的实时数据,并与无数其他设备进行通信。

但是,监测地震、厄尔尼诺和其他自然灾害关键研究的组织也将越来越依赖于使用机器人过程自动化(RPA)、人工智能和机器学习的大数据来提供可靠的预测。

油田模拟

石油行业是大数据分析和前所未有的计算能力的大受益者之一。这给了石油公司更好的工具来评估地震传感器产生的大量数据。

高保真成像技术和用于模型模拟的新算法为正在研究的储层的潜力提供了更大的清晰度。有了更精确的信息,他们可以最大限度地降低识别和测绘油藏的风险,同时优化管理和运营成本。

你认为我错过了重要的部分吗?在评论里留下你的看法…大家一起讨论…

图片经由pix abay

这些数据科学产品组合将让您惊叹不已并深受启发(2020 年中期版)

原文:https://towardsdatascience.com/these-data-science-portfolios-will-awe-and-inspire-you-mid-2020-edition-728e1021f60?source=collection_archive---------1-----------------------

使用这些来改进您自己的数据科学产品组合,学习新技能或发现新的有趣项目。

查尔斯·德鲁维奥在 Unsplash 上拍摄的照片

为什么是投资组合?

数据科学是一个艰难的领域。它结合了数学和统计学,计算机科学和黑魔法。截至 2020 年年中,这也是一个蓬勃发展的领域,每一个招聘广告都有无数的申请者蜂拥而至。此外,正如我提到的——现在是 2020 年年中,肆虐的疫情把一切都拖得更低了。

建立一份课程完成证书的清单也不会让你走得很远,除非你有一些真正的学术证书(硕士/博士)。像 m 课程和 d 课程这样的 MOOC 证书很不错,但是我还没有听到太多这样的例子。le 也不再是过去的样子了。它的自由竞争已经成为无用的过度拟合模型的墓地,真正的竞争由难以与之竞争的团队主导,无论如何对个人投资组合的用途有限。

那么,如何在网上建立个人档案呢?我个人的想法是,就像一个著名的乐队曾经说过的那样,你可以走自己的路。

不要试图去做别人做过的事情,做你感兴趣的项目,而是建立一个你工作的文件夹,并把它放在那里让全世界看到你做了什么,以及你能做什么。

Ricardo Gomez AngelUnsplash 上拍摄的原始照片

说了这么多,我很感激说起来容易做起来难。没有多少数据科学家也是设计师/前端开发人员,他们并不总是热衷于学习额外的技能,也不一定有时间去学习。

幸运的是,我们不必总是重新发明轮子。不像过去的文件夹是字面上的……文件夹满是光滑的纸页,或者简历只会出现在人力资源部的桌子上,许多令人惊讶的文件夹可以在网上找到。这些都是无价的资源,为什么不充分利用呢?

学习/灵感

除了将它们作为我们自己投资组合的参考,这些网站也是学习和想法的极其宝贵的资源。

这些作者的许多项目是实用的、有趣的和原创的。在我看来,它们也是很好的补充学习工具。例如,当我考虑在我的工作中或者为我的客户应用这个工具时,看到一个 ML 工具的实际应用提供了学习理论方面的背景。

我已经说得够多了——让我们深入了解这些令人惊叹的作品,看看它们到底是如何有用的。

这显然只是众多优秀投资组合中的一些随机选择。如果你同意/不同意我的想法,请在评论中告诉我你最喜欢的

大卫·文丘里

大卫·文丘里肯定会给这些狗打分(http://davidventuri.com/portfolio)

几年前,我在研究数据科学课程时第一次遇到了大卫·文丘里。他写了一篇名为“ 我辍学去创建我自己的数据科学硕士学位——这是我的课程表 ”的博文。

这个帖子来自 2016 年 4 月,它确实经受住了时间的考验,截至 2020 年 8 月,已经在媒体上获得了 8000 多次点击!

从那以后,他做了更多的事情。他为 DataCamp 创建了课程,包括一个 Scala 课程,Tableau 课程的一部分,以及一个使用 MLB(棒球)Statcast 数据的课程。

他甚至创建了一门名为“与卡戴珊上下:使用熊猫的 Python 项目”的课程。谁会想到单词 Python 会出现在单词 Kardashians 的旁边,而不是指最近的丑闻或对宠物的糟糕选择?

没错。这个人很有才华。

他的作品集网站恰当地反映了这种广泛的才华,展示了他作品中内容类型的广度和题材的多样性。

大卫·文丘里的作品集(http://davidventuri.com/portfolio)

文丘里网站上的标题按照终端客户的类型组织其内容。它们的范围很广,从为 DataCamp 或 Udacity 创建的课程、项目和内容,到一系列个人项目,包括 FreeCodeCamp 的文章、体育分析和少量网络应用。

然而,在看了一会儿这个网站之后,给我留下深刻印象的是,它清晰地展示了他能够产生的产出的确切类型。换句话说:

文丘里产品组合的每一部分都实现了一个营销目的。

MOOCs 很容易——毕竟,他是一位经验丰富的课程制作人。

但接下来的部分包括两个非常不同的视频,以突出他的制作技巧和在摄像机前的舒适感。一个是教学视频,一个是高制作…狗视频(巧妙的营销视频)。

他的个人项目是为了突出用明亮的链接表示的输出媒介。他的输出被分段,链接到“代码”、“演示”或“网站”中的一个。这允许查看者在项目的上下文中立即看到感兴趣的输出。

甚至他的书面作品也被明确归类为“报告”、“文章”或“帖子”,明确承认了预期的受众类型。有人读了这篇文章,很明显会得到一个相关的样本产品,而不是一堆按主题分类的“写作样本”。(这确实让我怀疑他是否对招聘信息进行了搜集或分析,从而得出了这一分类。)

点击这里查看他的作品集。

汉娜·韩嫣

汉娜·韩嫣的作品集网站(【https://www.hannahyan.com】T4)

作为一名数据可视化极客,这个网站立即让我充满了喜悦和羡慕。

她主页上展示的大部分项目都是可视化的(我可以补充说,非常精彩)。每个项目都由一个图像表示,鼠标悬停在图像上会显示关于它的更多详细信息,如下面的动画所示。

因此,在访问网站的几秒钟内,读者就有机会看到她制作的一系列可视化效果,以及她在使用从 R、D3.js 或 P5.js 到 Tableau 的各种工具方面的技术实力。

我个人也非常喜欢干净的布局和简单一致的界面。浏览它只是一种享受。

汉娜·韩嫣的视觉化作品集的一些例子(https://www.hannahyan.com)

点击每个项目,读者会看到一篇关于观想的文章。

她还有一个专门的数据科学作品集,放在一个单独的页面上。

韩的几个数据科学项目()——看那只狗!

显然,这种布局旨在传达比可视化页面更多的关于每个数据科学的信息。通过像她所做的那样将项目按类型分开,她能够为读者实现每一页的视觉一致性。这可能也表明,一般来说,读者(潜在客户)只对可视化或数据科学中的一个感兴趣,而不是两个都感兴趣。

点击查看她的作品集

多恩·马丁

在进入下一个投资组合示例之前,坐下来,喝一杯,振作精神。

多恩·马丁的网站(【https://donnemartin.com/】T4)

多恩·马丁自称是脸书的一名软件工程师,但是看了他的网站和 GitHub 页面,我很确信他是一名时间旅行者或者是某种能够延长时间的巫师。稍后我会回到这一点,但现在,看看下面的动画,通过他的主网站滚动。

他的投资组合网站的方法与我们之前看到的完全不同。他采取的方法是让人群的声音(即 GitHub 明星)来说话,好家伙——他们是不是大声

他随便标榜 20k+星的多个个人项目!

多恩·马丁的作品集页面(https://donnemartin.com/#portfolio)

他的 GitHub 页面本身就非常令人印象深刻。既然在讨论数据科学作品集,那就来看看他的回购数据科学笔记本吧。

记得我说过我认为马丁可能是个巫师吗?每当我们回到焚烧女巫和男巫,这个数据科学笔记本回购将是我对马丁的主要证据提交。

我只是不明白他什么时候可能有时间创造所有这些,除非他有能力让时间变慢。这只是一个样本——实际上是一个非常小的样本,是他在这次回购中提供的笔记本。

多恩·马丁的笔记本回购(https://github . com/donne Martin/data-science-ipython-notebooks)

这是一个密集的列表,但是按照使用的主要库来分组,它作为一个展示做得很好。甚至在打开他的任何一个笔记本或者阅读这些笔记本的摘要之前,这个列表就很容易地展示了他的职业道德、技能广度以及沟通和教学的能力。

你可以轻而易举地花上几天或几周时间浏览马丁的作品集——就我个人而言,我不认为这样做是个坏主意。点击查看

克劳迪娅·滕·胡普

克劳迪娅·滕胡普的网站(【https://www.claudiatenhoope.com】T2

Hoope 的网站干净整洁,易于阅读。我想强调的这个投资组合网站的一个关键区别是,它明确地兼作招聘/咨询页面,有她的每日价格等。

她是一名自由职业者,所以她有必要向潜在客户详细说明她提供的具体服务。她在这里使用的语言也表明,它们是为那些不一定熟悉数据科学的人准备的。

这是一个很好的提醒,让我们思考我们发布的每条信息的目标受众是谁,并相应地调整内容。

克劳迪娅·滕胡普的服务页面(【https://www.claudiatenhoope.com】T4)

看看吧——她的页面是这里

朱莉娅·尼库尔斯基

朱莉娅·尼库尔斯基的作品集网站(http://julianikulski.com/portfolio)

这是另一个优秀的作品集网站,这次是由朱莉娅·尼库尔斯基创建的。与其他人一样,她在这里列出了一些很棒的项目,每个项目都有一个英雄形象,并附有简短的描述和关键技能。

我不会写太多关于它的东西——因为主要的布局似乎和其他一些相似,而且我不懂德语!

一个非常有趣(非常元)的亮点是一篇题为“如何建立一个数据科学组合网站”的帖子,如果你正在阅读这篇文章,你可能会发现相关内容!

感谢阅读——这只是我在网上找到的一小部分网站。如果你有自己喜欢的,或者对这篇文章有(建设性的)批评,请在评论中或者在推特上告诉我!

另外,如果你喜欢这个,比如说👋/继续关注,或点击此处获取更新。ICYMI:我还写了这篇比较 Plotly Dash 和 Streamlit 的文章:

[## Plotly Dash 与 Streamlit——哪个是构建数据仪表板 web 应用程序的最佳库?

用于共享数据科学/可视化项目的两个顶级 Python 数据仪表板库的比较——

towardsdatascience.com](/plotly-dash-vs-streamlit-which-is-the-best-library-for-building-data-dashboard-web-apps-97d7c98b938c)

这是关于可视化数据中隐藏的关系,以 NBA 的数据为例:

[## 如何用 Python 可视化数据中的隐藏关系 NBA 助攻分析

使用交互式快照、气泡图和桑基图操纵和可视化数据,使用 Plotly(代码和数据…

towardsdatascience.com](/how-to-visualize-hidden-relationships-in-data-with-python-analysing-nba-assists-e480de59db50)

他们都有皇冠

原文:https://towardsdatascience.com/they-all-got-crowns-fbe4c29641c8?source=collection_archive---------25-----------------------

亲教会媒体在 Unsplash 上拍摄的照片

揭露流行天后之间的竞争,并对他们的实力进行探索性的数据分析

如果你和我一样,是那种认真对待流行音乐的人,那么你很可能已经卷入了关于流行女歌手的激烈讨论。更多的时候,关于这个问题的争论最终导致女性之间的对立,并加深了音乐行业根深蒂固的厌女症。

参与这种试图寻找“最佳”流行女歌手的讨论可能不会有结果的原因之一是,就像其他人一样,他们都有自己的优势和劣势。用一个人的力量去比较所有其他人不仅没有抓住重点,而且没有给予他们足够的信任,因为他们经历了所有的事情,为我们这些粉丝带来了如此惊人的作品。

因此,我们不打算集中讨论这个问题。

我们不能否认音乐围绕着我们个人的喜好和经历。因此,你将在下面读到的不仅是对这些艺术家作品的一个证明,也是一个反思的时刻,它是如何引起你如此大的共鸣,以至于你愿意为捍卫它而战。

通过这样做,并真正开放和好奇,我们不仅对我们的音乐品味获得了更详细的知识,而且将这种错误的比较叙事改写为更尊重的比较叙事,同时提高和提升了所有这些令人惊叹的女性。

为了做到这一点,我们从 Spotify 和 Genius 收集了数据,我们将深入研究九位流行天后(碧昂斯、泰勒·斯威夫特、爱莉安娜·格兰德、蕾哈娜、Lady Gaga、麦当娜、玛丽亚·凯莉、布兰妮·斯皮尔斯和凯蒂·佩里)的完整唱片目录,使用十二个变量来分析他们的歌曲(可跳舞性、歌曲时长、语速、能量、歌词情感、声音情感,等等)。对此分析,我们只是认为这些艺术家的个人项目。

走吧。

玛丽亚·凯莉——轻柔的歌曲,努力的工作

自从 1990 年玛丽亚·凯莉(Mariah Carey)出道以来,MC 不仅拥有最大的歌曲和专辑目录,而且在所有被考虑的艺术家中,她歌曲的制作比例也是最大的。

作者提供的图片

看看玛丽亚·凯莉的目录,很明显她一直比她的同龄人更擅长声学探测项目。随着她在charm branch的巅峰声学作品,像 Through The Rain 这样的歌曲证明没有必要忙于制作来让她的声音闪耀。

作者提供的图片

另一方面,玛丽亚可以很容易地过渡到更流行的流行音乐和 R&B 潮流,不完美天使的回忆录有她最热门的作品之一,痴迷。即使有更多的重磅制作,像我想知道什么是爱这样的歌曲表明,剥离下来的歌曲仍然非常适合她(即使是封面)。

TL;英雄博士

在这里,当你感到希望破灭时,我们有 Hero来帮助你,这是一个完美的例子,说明由玛丽亚创作和制作的强大的原声歌曲如何能让人真正找到自己的力量。

碧昂斯——多才多艺

很难定义埃永西,正如人们所料,我们对女王 B 的发现也有多面性。

鉴于碧昂斯在当前流行乐坛对说唱、嘻哈和 R&B 的重要性,她在歌曲中使用大量词汇也就不足为奇了,正如我们在下面看到的。

autor 提供的图像

在声学上,我们也可以从一个名为 speechiness 的变量中察觉到这一点,speechiness 是一种音乐特征,可以识别一个音轨中存在的口语词。

碧昂斯是迄今为止最健谈的流行女歌手,这一特征在她的专辑《B'day》中达到顶峰,在那里我们可以听到她的说唱技巧的完美例子。

作者提供的图片

下面我们看到一个试图抓住艺术家多面性的尝试。为了做到这一点,我们找到艺术家的平均表现(关于所有变量),然后检查每首音乐离这个表现有多远。对于一个更加多才多艺的艺术家来说,简单地平均其所有目录并不能做到公平,这种从歌曲到平均值的计算距离往往会更高——碧昂斯就是这种情况。

作者图片

作为这种声音和抒情广度的一个例子,我们可以看看,例如柠檬水。在里面,我们可以听到从乡村(爸爸课程)到摇滚(不要伤害自己)的一切,R & B、嘻哈、流行和民谣也混合在一起。

这种多才多艺当然不是一个小壮举,它肯定是一件很难单独实现的事情。证明这一点的是碧昂斯愿意与才华横溢的作家和制片人合作,以帮助实现她的愿景。当考虑到她创作和制作的所有歌曲时,几乎就好像她为每首新歌带来了至少一位新制作人和两位新作者。

作者图片

最后,但同样重要的是,碧昂斯热爱爱情。她 74%的歌曲都使用这个词。

作者图片

TL;博士-等一下

这首歌是与 15 个人合作创作的,是对真正多才多艺的描绘,因为它源于另一首流行经典歌曲的推文(Yeah Yeahs 的地图)是她最常用的 5 首歌曲之一,也是与“典型”碧昂斯声音最遥远的 10 首歌曲之一。另外,这是关于爱情的。或者至少,告诉他们他们不像我爱你一样爱你。

泰勒·斯威夫特——伟大的悲伤歌词

正如泰勒自己所知道的,正如《美国小姐》中所展示的,她的主要强项是歌词。正如人们所料,能够以如此个人和亲密的方式讲述故事,泰勒是少数几位从她的目录中写下一切的艺术家之一。

作者图片

除此之外,当你听到她的歌时,很明显这些通常不是快乐的歌。事实上,当我们分析她的歌词(歌词情绪)和她的声音(效价)上描绘的情感时,很明显泰勒的力量围绕着悲伤的歌词和悲伤的声音。

作者图片

下面,当我们分析这种情感之间的关系是如何在她的作品中演变的,我们可能会发现一些惊喜。

虽然这是她最黑暗的声音,但也是她正面歌词的巅峰。通过扮演她最没有歉意的坏婊子角色,像我做了坏事看到泰勒对自己变坏感觉良好这样的歌曲,都贯穿着肮脏和沉重的节奏。

她的其他项目通常会反其道而行之。虽然有一个比名声更轻的声音,但所有这一切听起来至少比一般的流行天后更悲伤一点。不过,就歌词而言,没有人像斯威夫特小姐那样写悲伤的波普作品。例如,1989 年的《T21》尽管有一部更倾向于流行音乐的作品,但歌词却很悲伤,比如《走出困境》和《你所要做的就是留下来》。值得注意的一件事是,即使是在风格转变的过程中,泰勒也发挥了她的抒情天赋,让它适合她要做的任何事情。

作者图片

TL;放逐博士(专长。Bon Iver)

尽管泰勒已经给了我们很多启示,但她的写作天赋仍然让我们惊叹。为了证明这一点,我们在这里有,这是她最新项目民俗中的一首歌,它位列泰勒最悲伤歌曲(歌词和声音)的前五名。

蕾哈娜——变坏的好女孩

我们不需要数据就能相信蕾哈娜是最差的流行女孩,对吗?看在上帝的份上,她有一整张专辑可以证明这一点。此外,除了成为流行音乐中最露骨的女人之外,人们还能指望一个被铁链和鞭子打倒并兴奋不已的人做什么呢?

作者图片

这可能是流行音乐最有预兆的举动,蕾哈娜从扮演好女孩的三张专辑,成为所有流行天后中歌曲最露骨的专辑(R 级),她随后的项目在露骨方面都保持在平均水平以上。

作者图片

那么,她是 f单词的冠军就不足为奇了。*

作者图片

TL;博士——脑中的爱

毫无疑问,蕾哈娜向我们展示了她不害怕弄脏自己。 爱在脑中, 虽然 是她选择向我们展示她脆弱的一面的场合之一,即使如此,它仍然让我们如此美好。

凯蒂·佩里——糖热潮

aty Perry 以她完美的流行歌曲而闻名。凯蒂·佩里(Katy Perry)的歌曲通常会让那些听它的人瞬间陷入闪电战,但最终却让我们感到乏味。她的秘密是什么?显然,节奏——衡量一首歌的节拍有多“快”的指标,用每分钟节拍数(bpm)来衡量。

**

作者提供的图片

从上面的图表中可以看出,凯蒂·佩里倾向于使用更快的节拍,这种倾向是从她的第一个项目一个男孩开始建立的,此后逐渐衰退,在她的最新项目见证中达到最低点。

尽管节奏有所放缓,但在她的每个项目中都能找到高节奏的歌曲。举几个:我吻了一个女孩,e . t .咆哮与魔鬼共舞。**

事实证明,凯蒂知道我们都可以用高潮来度过低谷。当我们分析她的歌曲听起来像什么以及它们实际上说什么时,我们发现她是假快乐歌曲的女王:那些有快乐节拍的歌曲,但一旦你真正注意歌词,就会真正融入你的感情。

作者提供的图片

作者图片

作者图片

凯蒂也是文字女王。虽然她的歌曲遵循相当传统的流行规则,但她将概念作为歌曲主要思想的吸引力(孔雀、烟火、幽灵、海啸、钟摆、轮盘都是这种例子)可能有助于解释为什么她是词汇最多样化的艺术家。

最后,但同样重要的是,如果没有一些好的歌曲跟着唱,流行热潮会是什么样的呢?

凯蒂肯定知道这一点,她没有让我们失望。她的歌曲中有 75%有这个词在里面。哦耶!

TL;DR —热 N 冷

为了不隐晦地表现出来,我们可以在 热 N 冷 上找到佩里所有最大的优点。除了快乐和快速的节奏,各种反义词的使用及其优柔寡断的爱情的沮丧信息可能会给你带来你需要的苦乐参半的甜味。

Lady Gaga —高电压

当你听到 Lady Gaga 的歌时,你有什么感觉?通常这就像电击穿过你的身体,让你想起来做点什么,对吗?可变的能量是与这种音乐强度相关的,对于感觉快速、响亮和嘈杂的歌曲来说更高。**

不足为奇的是,Lady Gaga 在这一类别中独占鳌头。

作者提供的图片

作为高能径赛的一个例子

考虑到她所有的工作,这位女士只给了我们更多一点平静,在她的更倾向于乡村的乔安妮。在那之前和之后,只有一次又一次的震惊,在《生来如此》上达到了顶峰。娶夜,ScheiBe,Judas天生如此都是能量听起来是什么样子的绝佳例子。****

但这并没有结束。尽管 Lady Gaga 的声音让我们感觉像触电一样,但她也很擅长让我们在第二次聆听时感到愤怒或悲伤。当考虑到抒情的内容时,很明显她想要的是什么:让我们同时跳舞和哭泣。

作者图片

正如她最新专辑中真正强调的那样,色彩学,歌曲像爱丽丝塑料娃娃在舞池中打动了我们,但也谈到了脆弱的感情,感到被困,被利用和愤怒。所以,下次你跳舞的时候,试着注意歌词,这样至少你可以很好地利用它们。**

TL;DR —电话

对于那些有点忙的人来说, 电话 将帮助你了解 Lady Gaga 的一切:高电压歌曲,对讨厌的男孩极度鄙视。

布兰妮·斯皮尔斯——跳舞吧

如果你想跳舞,该找谁?是布兰妮,婊子。

作者提供的图片

她是这群人中最适合跳舞的,她的大多数项目在可跳性方面都远高于平均水平。在停电时达到她的舞蹈巅峰,歌曲如给我更多我的一部分展示了为什么当布兰妮的歌曲在任何地方播放时都很难保持安静。**

即使是她不太适合跳舞的项目,布兰妮·琼,也仅仅是因为更多情感流行歌曲的出现,比如香水。伴随着这些更平静的流行歌曲,她最受欢迎的歌曲之一是:工作母狗。**

当我们考虑歌词背后的情感时,很明显布兰妮的专长是让我们随着积极的信息起舞,无论是性感的感觉还是绝望的爱。

作者图片

TL;DR——有毒

作为一首歌,绝对应该有一个警告:它每次都会让你跳舞,它是有史以来最伟大的流行歌曲之一,它会让你感到性感和活力。**

爱莉安娜·格兰德——开槽,是的

E 尽管阿丽亚娜的审美散发出喜欢惹麻烦的纹身女孩的氛围,但从声音上来说,她拥有天后中最华丽的节拍,倾向于慢节奏的歌曲。不过,不要难过,如果她的一首歌让你进入状态,就像生活中所有美好的事情一样,它会很快结束:她的歌曲往往比大多数歌曲结束得快,让我们想要更多。**

********

作者图片

作者图片

尽管如此,正如我们在旁边的图表中所看到的,Ariana 继续倾向于较慢的节奏,我们看到,自从她的第一个项目your Truly 以来,她已经变得有点快了。在里面,我们可以听到一些她最棒的歌曲。**

当你考虑她的演变时,我的一切走得更快,因为她在像 Bang BangBreak Free 这样的歌曲中追求更流行和电子的声音。**

********

作者提供的图片

阿丽亚娜的另一个巨大优势是她的声音和演讲能力。领先于更多的说唱歌手,像sweeterdaily这样的歌曲展示了即使时间很短,她也能说很多。****

还有一点:她喜欢“耶”好吧。她唱的 74 首歌让她(和我们)每次都兴奋不已。

TL;美国国家航空航天局

给你一些空间,并帮助把这一切绑起来: NASA 。在 Ariana 的前 5 名最慢的堵塞,结束很快,有一些“耶”的组合,它在交付速度上排名前 15,每分钟 220 个词。

麦当娜——创新

作为今天成为流行歌手的女性之一,麦当娜经历了她职业生涯的许多阶段也就不足为奇了,她的声音也是如此。当我们分析她的演变和每件作品从她过去的唱片到那时的差异时,我们可以看到,考虑到她的整个旅程,她是创新更多的艺术家。

作者图片

查看以下每位艺术家的轨迹:

与过去的唱片目录/作者图片相比,最具创新性的专辑

作者图片

在她的 14 张专辑中,色情、光线和硬糖是她唱片目录上的主要飞跃。这可以归因于与她以前作品的不同之处,包括在编曲中使用乐器,歌词中更积极的语气以及舞蹈性的增加。**

即使你从这三个项目中的每一个项目中分析一首歌,你也能很容易理解为什么它们如此不同。以她的第一个项目麦当娜和一首标志性歌曲如假日为例。例如,合成器带来的感觉良好的天真氛围与情色更性感的舞蹈氛围非常不同。我们可以看到的另一个亮点是硬糖的 4 分钟,它沉重的节奏和明显的嘻哈影响。****

TL;博士——挂断了

显然,麦当娜太难在一首歌中描述,但 挂了, 可能是我们能得到的最接近 。即使等待的人时间过得很慢,但如果你在等的是麦当娜,那也是值得的。她可以,也一定会再次创新。

如果你更喜欢柔和、多变、伟大的歌词、诅咒、高能、流行音乐、慢歌、舞曲或创新的声音,那就是你的选择。每个艺术家都有值得喜爱的地方;因此,如果你不知道,就要明白这与他们无关。

绝对是关于你的。

如何不用 REST API 搭建机器学习 Web App

原文:https://towardsdatascience.com/things-i-wish-i-had-known-how-to-build-a-machine-learning-web-app-without-rest-api-f6ead0d058a6?source=collection_archive---------70-----------------------

(图片作者)

我希望我已经知道的事情:

使用 Streamlit

所以几周前,我的一个朋友正在做这个项目,使用 OpenCV 进行物体检测,她应该给它一个客户端。她在 GET/POST 请求之间挣扎了很久,最终放弃了这个项目。

我们都在某个时候遇到过这种情况,我们努力将我们的 ML 模型集成到我们的应用程序中。那一刻,我意识到许多数据科学/机器学习爱好者可能不知道这个行业的福利,称为 Streamlit!

那么…是什么?

Streamlit 是一个开源应用框架,它可以帮助数据科学家和机器学习工程师在几个小时内创建漂亮、高性能的应用!全是纯 Python。全部免费。

我应该用它是因为?

这是一个最小框架,也是目前构建强大的数据/机器学习应用的最快方式!

支持机器学习爱好者使用 Flask、Django 或其他工具部署而无需

我再也不用担心那些回调了!

我再也不用担心那些 HTML 标签了!

经过简化的数据缓存加速了计算流水线!

让我们立即开始吧!

Streamlit 搜索每次保存的更改,并在您编码时即时更新应用程序。代码从上到下运行,总是从一个新的状态开始,绝对不需要回调。这是一个轻松而健壮的应用程序模型,让你以令人难以置信的速度构建丰富的 ui。

你只需要做以下事情:

该设置

还有万岁!几秒钟后,示例应用程序将在默认浏览器的新标签中打开。

另外,确保你已经安装了 Python 3.6 或更高版本。你可以在这里找到文档。

因此,事不宜迟,让我们开始制作一个功能齐全的多分类器机器学习 Web 应用程序。

进口货

进口货

加载和分割我们的数据集

在这个工作站中,我们从mushrooms.csv文件中加载我们的蘑菇数据集,并将数据集分成通常的 7:3 (70%用于训练,30%用于测试)。这是一个关于蘑菇是否可食用或有毒的二元分类数据集。你可以在这里找到数据集

在这里,@st.cache()是一种缓存机制,它允许我们的 web 应用程序即使在从 web 加载数据、操作大型数据集或执行昂贵的计算时也能保持响应。

装载弹药

所以每次你用@st.cache装饰器标记一个函数,它告诉 Streamlit,“嘿,你需要检查一些东西!”比如:

  1. 函数的输入参数
  2. 函数中使用的任何外部变量的值
  3. 函数的主体和
  4. 缓存函数中使用的任何函数的主体。

Streamlit 通过哈希来记录这些组件的变化。可以把缓存想象成一个简单的内存中的键值存储,其中键是上述所有内容的散列,值是通过引用传递的实际输出对象。

情节

所以我们从 sklearn 库导入了两条简单的曲线和一个混淆矩阵。我们通过metrics_listplot_metrics,这将是客户选择的一个或多个选项。每个评估指标各自的功能如下:

评估指标

多重分类器

很高兴你能坚持到这里!现在我们到了最激动人心的部分。我们会给我们的客户,选择多个分类器!

对于这个应用,我们将使用支持向量机(SVM)逻辑回归随机森林分类器。

支持向量机(SVM)

支持向量机中,我们总是旨在增加的余量。永远记住,正则化参数( C)的值越大,余量越小。

如果客户选择 SVM,他们将可以通过内置小部件单选按钮、多选数字输入来定制超参数,如正则化参数(C)内核内核系数

超参数

定制好超参数后,我们准备好通过点击侧边栏上的分类按钮来训练我们的 SVM。

训练和绘制结果

逻辑回归

逻辑回归是一种机器学习分类算法,用于预测分类因变量的概率。

如果客户选择逻辑回归,他们可以选择定制超参数,如正则化参数(C)迭代次数,通过内置部件,如滑块数字输入

逻辑回归

随机森林分类器

随机森林分类器被认为是一种高度准确和稳健的方法,因为有大量决策树参与该过程。它在随机选择的数据样本上创建决策树,从每棵树上获得一个预测,并通过投票选择最佳解决方案。

如果客户端选择随机森林分类器,他们可以选择定制超参数,如森林中的棵数最大值。树的深度通过内置小部件单选按钮数字输入构建树时的自举样本

随机森林分类器

浏览器

您的浏览器上会有这样的内容:

浏览器

现在你可以看到 Streamlit 的真正力量了。因此,没有正式的机器学习或编码背景的人可以使用你的 web 应用程序,只需通过触摸和点击控件来训练模型,并观察不同分类器的表现。

在这个基础项目中,只有少数内置函数投入使用。您可以随时探索更多并扩展您的机器学习 Web 应用程序的功能。

关于这个项目的完整代码,可以参考我的 GitHub。

保持安全直到下一次:3

我希望在加入 Metis 新加坡数据科学训练营之前就知道的事情

原文:https://towardsdatascience.com/things-i-wish-i-knew-before-joining-metis-singapore-data-science-bootcamp-8768b9e9fda2?source=collection_archive---------19-----------------------

作为一个没有编码或统计背景的人,我在新加坡 Metis 数据科学训练营的亲身经历。

这并不意味着是一篇短短的 5 分钟的阅读(如果你想深入了解自己的处境,也不应该是这样)。剧透:每一天都是一场艰苦的战斗。

实际上,我在梅蒂斯训练营,2019 年 10 月 7 日至 12 月 27 日,彩色。图片来自 me.me

训练营结构

Metis 新加坡数据科学训练营是一个为期 12 周的密集计划,重点是 Python 编程,通过完成 5 个项目,您可以了解探索性数据分析(EDA)、统计建模和大数据工具。

众所周知,这些训练营非常紧张——事实也的确如此。想象一下将 1-2 年的信息压缩到 3 个月内。

每一天,我都从结对编程练习开始,抓紧时间休息 5 分钟,然后立即去上课。我会停下来吃午饭,然后回来上更多的课,通常在下午 3-4 点左右结束。

虽然课程已经结束,但我的一天还没有结束。无论我有多少空闲时间,我都在努力跟上我前一天(甚至更早)学到的概念,同时,在两周的期限内从事自我启动的项目。整个周期重复了整整 3 个月。

虽然这非常困难,但我不能说我完全没有从中受益。在训练营之前,我是一个自学狂(Youtube,LeetCode,阅读数据科学文章),并认为自己进展顺利。直到我进入训练营,这严重挑战了我的观点。我很高兴我这么做了,因为我会被困在我的小泡泡里,以为一切都很好,而事实上并不是这样。训练营让我意识到在数据科学领域还有很多要学,并让我具备了足够的知识来合法地自己开始。**

不要低估训练营

这是 极其 的统计和数学密集型,这些是我希望在加入之前就知道的事情,也是我给你的建议,不是 好有 而是 必须有 才能加入一个。

你必须拥有的东西

照片经由Amazon.com。差不多总结了你在营地必须要有的东西。购买并携带这个杯子参加训练营,获得额外积分

1.你一定喜欢图表

惊喜惊喜。这是一个与数据相关的字段。显然,你的大部分发现,如果不是全部的话,将会以图表的形式出现。你必须喜欢看图表,使用它们,调整它们(条形图,折线图,散点图等)。)而且你一定要喜欢与他们分享你的发现。

2.你怀疑一切

你质疑一切,想要验证呈现给你的事实/数字背后的真相。这一点很重要,因为你在一个数据相关的领域,你想知道你得到的数据是否有效。

如果这听起来像你,那就完美了,因为统计学作为一种工具,可以让你对数据集进行理解、量化以及测试有效性,这让你相信你的假设是正确的,你的模型是可行的。这就引出了我的下一个观点。

3.你必须很好地掌握统计学

你还必须知道如何(或者至少欣赏)以一种实用的方式应用统计学。在训练营只有 3 个月的时间,每天超快的节奏不会等到你完全理解了一个概念,第二天你就会被另一个人扇耳光。这也引出了我的下一个观点。

4.你必须有很好的数学技能

我说的是微积分,像 log,ln,微分方程等等。为了理解统计概念并理解如何使用它们,你需要对数学有很好的理解。如果你不这样做,你会开始意识到随着每一天的流逝,你会被遗忘在尘埃中。

如果你没有这些,我会说你会经历一段艰难的旅程。在加入之前,我甚至不知道什么是线性回归,如果你想让你的钱发挥最大作用并在训练营中生存下来,我建议你至少获得统计和数学的中级水平。

如果你认为你已经准备好了,而且前面提到的 4 点都很有趣,那就完美了!我们可以继续讨论如何应对接下来的 3 个月。

跟上训练营的步伐

1。有疑问时询问

如果你不知道也不问,你只是在伤害自己,因为如果你不知道,你会一直一无所知。如果你不知道内容,这并不荒谬(我的意思是——这就是你报名参加训练营的原因,对吗?).只有当你知道自己有疑虑却不去澄清时才是荒谬的。

2.你必须接受 不知道一切

我的意思不是说你没有尽最大努力,当你有知识失误时可以松懈——而是要意识到,在你开始进入下一步之前试图抓住的一切会导致你 太慢 会导致你最终什么都不做。

这甚至阻碍了我开始一个项目。在开始我的项目之前,我想知道每一点代码,首先学习线性回归,用一整套知识武装自己。结果,我只剩下很少的时间去做任何实际的工作 接近尾声 产生了不尽人意的结果

你永远不会在人生的每个阶段都知道所有的事情,也永远不会做好充分的准备。我从未想过我会如此老套地使用一句被滥用的名言,但正如耐克所说的那样,

“照做就是了”

真的——去做吧。会有很多时候你什么都不知道,这没关系。这就是你在训练营的原因。如果有什么,你可以随时咨询谷歌。你将会使用新的代码,即使你把它输入到你的 Jupyter 笔记本里,你也完全不知道,这没关系。因为你 学会后你会用它。

3.你必须有 的勇气 才能遵守纪律并坚持到底

你每天都必须前进。

最好的学习方法是通过一个 的迭代过程 。当你开始一个项目时,你会遇到许多障碍。尽管这很痛苦,但你不得不忍受不知道会发生什么——有时甚至不知道如何搜索答案,甚至不知道正确的问题。挺好的。坚持原则,坚持到底。如果你不知道,不要停留在原地。

试着问问题。试试谷歌搜索。尝试与人交谈,尝试咨询你的同学、你的讲师,甚至前一批学生(黑乌鸦(詹姆斯·吴)爱德华·宾基帮了我大忙)。你会交到很多朋友,其中你最好的朋友是谷歌(说真的,谷歌是救命恩人。哦,还有 StackOverflow)。

在你解决了项目中的一个问题后,你会有一种巨大的成就感——然后立刻又陷入一个新的问题中(顺便说一下,这很正常)。这就引出了我的下一个观点...

4.你必须热爱持续学习

这个领域的事物是不断运动、变化的。老实说,编码曾经是独角兽技能。现在几乎每个人都可以编码。你必须保持领先,要想领先,你必须不断学习。你 拥有 去热爱学习的过程。

5.理解项目设计是一个迭代过程

苹果不是一天建成的,你在这个夏令营中着手的任何项目也不是。理解项目是一个持续的、建立在先前尝试基础上的过程。

你可以有一个令人印象深刻的最终目标,你想从你的项目中得到什么,并画出一个巨大的甘特图,你想如何去完成它,但现实是,会有很多障碍阻止你这样做(事情永远不会 100%按照计划进行)。

如果不能在第一次尝试中创造出令人惊奇的东西,不要如此犹豫。专注于 完成 先做简单的事情,做完之后再改进!

图片来自我自己的训练营课堂笔记

我认为上面的图像最好地呈现了项目设计的概念。制造汽车的想法从来都不是源于拥有汽车本身。它产生于对更好的交通选择的日益增长的需求和需要的总体想法。

同样,你的项目将遵循一个与此非常相似的过程。一个关于要实现什么的总体想法,在创建了第一个成品之后,你对它进行改进(甚至可能创建一个不同于你最初设想的产品)。

唷,训练营听起来有很多工作要做。

是的,是很多。这就是为什么它被称为训练营。并且知道这将会很难——没关系。你并不孤单。如果你一定要知道,这段时间我受了很多苦。想想看,熬夜到凌晨 4 点,为你的演示排练和制作幻灯片,在醒来淋浴、梳洗和去 Metis 做演示之前,只睡两个小时。

****但确实变好了。因为随着每个项目的通过,你变得更加精通编码,更加熟悉 Python 及其语法,使用适当的统计软件包,并且在演示和交流方面变得更好(我必须说,这很棒,因为我喜欢和人说话)。这个过程是痛苦的,但当你回顾过去时,你会为你所取得的成就感到骄傲——熬过了那个疯狂而紧张的时间表,并且 拥有 5 个数据科学项目

就像我怎么强调项目设计是一个迭代的过程,你的学习也是。这里有一些提示,你可以在做项目时记住,同时跟上快节奏的教学大纲。

秘诀 1:早点开始,提前学习

保持领先于教学大纲。即使你还没有在课堂上讲述统计概念(使用哪种模型)或项目中要使用的编程语法,请继续阅读,并在课程计划的同时完成项目。

红色条=课程进度。灰色条=井..最理想的是你。图片来自 geeksaresexy.net

你是铺设铁轨的阿高,火车是课程。事情是这样的。完成你的项目,直到你在课堂上了解到你的新统计模型的那一刻,你准备好在课程结束时把它放进你的项目中。

技巧 2:多任务

时间管理将是一个巨大的问题,因为这个营地的最后期限很紧。然而,这些截止日期并不一定会成为你的败笔。

你的项目总是以一个 演示 和一个 博文 结束(不像这个,傻瓜。像我的其他关于我的项目的博客文章。不要等到你写完所有的代码和分析之后才开始写。

当你的模型训练的时候,或者当你运行一个很长的网页抓取器的时候,同时做你的幻灯片和写你的博客文章。发挥你的创造力,把零碎的工作放进去!

提示 3:甚至在夏令营开始前就决定项目想法

训练营的毕业要求是完成教学大纲中的所有 5 个项目,其中 4 个是自我发起和自我领导的项目,每个项目都有一个总体的统计概念,希望你在学会这些概念后展示出来(请遵循提示 1:早点开始,提前学习)。

项目二:线性回归
项目三:监督学习
项目四:自然语言处理
项目五:激情项目(随便你)

我建议在进入训练营之前,想出一些你想做的事情的想法,因为你的大部分时间将会花在学习训练营的材料上,而不是花在为项目做些什么的头脑风暴上。

它不需要非常具体,因为你可以在训练营进行的过程中完善这些想法(你也可以和你的教练和同学一起讨论这些想法)。但是,如果你不想为做什么而大惊小怪,同时又要跟上训练营中技术含量很高的材料,你至少要知道自己想做什么。

好的,谢谢,但是这仍然没有给我一个具体的想法,我应该做什么项目

记住你为什么在这个营地。你这样做是希望就业吗?你这样做只是为了提高技能吗?或许引用技术带头人的一句话可以对此有所启发。

“我不擅长编码,但我最起码的代码是有商业价值的。”

好的,这实际上并不是一字不差的,但很大程度上是从他的视频中推断出来的。你的代码/项目给世界带来了什么价值?一个好的编码者不是一个记忆存储器(一个记住编码语言中所有语法的人),而是一个知道他的产品能给世界带来什么价值的人。同样,你的项目应该是人们可以从中看到价值的项目。问自己这些问题:

  • 雇主希望看到什么?
  • 我想提供什么商业价值?
  • 我对这个世界有什么迫切的问题,答案是什么?其他人能从这些知识中受益吗?

思路可以参考这个。如果没有,也非常欢迎你来探索我写的关于我在夏令营期间完成的项目的博客

如果你对我到目前为止所说的一切没有一丝一毫的担心,那太好了!在野营之前去度假,因为那 3 个月将会是一次非常棒的旅行。如果没有,忘记这个假期,投入你的时间尽你所能为它做好准备,因为…那 3 个月将会是一段非常棒的旅程。

个人外卖

我还想补充一点,在我个人看来,只有当你已经决定要从事数据科学职业时,你才应该参加数据科学训练营。如果这是你的职业,当你还在 探索 的时候就不会了。否则,在训练营的每一天都将是折磨。已经有学生退学了(我不是想吓唬你,只是告诉你实际发生了什么)。

从实践中学习,而不是通过阅读

如果训练营的时间密集型结构教会了我什么的话,那就是你通过做来学习,而不是通过阅读。****

如果你不能用这些知识做任何有价值的事情,那么积累所有的 Coursera 或 Udemy 认证就毫无意义。向世界展示你能做的。正如 JomaTech 所说,**

***“如果你做了一个有趣的分析,但没有人阅读你的分析…你真的做了分析吗?”

非常明智。

我个人打算通过从事侧重于现实世界应用的项目来丰富我的学习。在这个过程中,我相信我会遇到很多我不知道的东西,我会学到解决问题的东西,而不是学到很多没用的东西。

有时候你真的需要冷静下来

我知道我说了很多关于集训营紧张,多任务,勤奋和有纪律的学习,以及领先于教学大纲的事情。但事实是:没有人能连续三个月每天工作 18 小时。倦怠在训练营中很常见。有时候你得吃点镇静剂。**

每个项目结束后,给自己一个奖励。休息一天来恢复精神,和你的同学一起喝点东西,随便什么。只要断开你自己与物质的联系,然后在你完成充电后再回来。

最后谢谢

我真的想说,我非常幸运,周围都是了不起的同学(他们远远超出了我的技能水平),当我在课程中遇到任何困难时,他们都非常有帮助地指导我。

我们也打了很多比赛(我们喝了很多酒),这有助于抵消训练营的压力。

感谢你的阅读,如果你想联系我,你可以通过我的 Linkedin 或者 xianjinseow92@gmail.com 联系我。

干杯!

制作第一个 ML 模型之前需要知道的事情

原文:https://towardsdatascience.com/things-to-know-before-you-make-your-1st-ml-model-5ce48c9657f?source=collection_archive---------42-----------------------

一系列重要但通常被遗忘的细节。

如果你已经完成了你的第一个关于机器学习的 MOOC(在 Coursera 上也叫做吴恩达),并且想在这个领域探索更多的机会,或者你是一个一直在观察数据科学和 ML 的人,并且想看看这个领域是否适合你,你就在正确的地方(实际上)学习了一些配方的成分,这些成分将帮助你在 ML 上大放异彩。

把 ML 分成几个部分,你现在应该关心的三个部分是-

  • 数据,因为这是“数据”科学,
  • 模型背后的数学,
  • 编程。

在本文中,最大的关注点将放在数据上,所以我们先讨论另外两个。

模型背后的数学原理

在第一次运行 model.fit()和 model.predict()之前,没有必要知道算法是如何工作的,但是为了利用算法的实际能力,您需要了解它是如何工作的。逻辑回归是一种广义线性模型,因此输出连续数据的线性回归模型可以很容易地修改为给出类别作为结果。精度测量或参数值,一切都是某种形式的数学函数。

图模特合体()和模特预测()(图片来源)的火炬手

所以下一个问题是,“要知道多少数学知识?”这个问题的答案多少取决于你的目标是什么。如果你想成为一名研究人员,改善目前最先进的模型,你显然需要知道进入你的机器学习模型的每一点数学知识,因为这是你如何改善现有的,通过找到新的数学函数,对数据进行处理以产生更好的结果。如果你只是想在你的模型上得到足够好的符合你目标的预测,知道足够多的数学知识来完成这个项目就足够了。

编程

在你已经弄清楚你想要解决的问题和它的类型(分类、回归、聚类、排序等等)之后,ML 模型的编程就开始了。),做了必要的预处理,决定了从哪个算法开始。获得一个好的起点是很重要的——阅读任何相关的前期工作并编写代码;一旦你获得了一个基线精度,尝试不同的算法或建立在相同的基础上。这有助于理解正在发生的事情,以及下一步你需要做什么来实现你的目标。

图像来源

尽可能多地记录下来,因为 6 个月后你很可能会忘记工作流程背后的逻辑。无论是编码者还是阅读代码的人,遵循良好的编码实践总是有帮助的。

数据

这是在很大程度上决定 ML 模型成功的部分,所以在这里花费最多的时间是最有意义的。

制作有用模型的先决条件是了解机器学习中使用的术语。

一个标签是我们预测的东西——简单线性回归中的 y 变量。

一个特征是一个输入变量——简单线性回归中的 x 变量。

一个例子是数据 x 的一个特殊实例。

这总是有助于更好地报告和记录模型,也有助于纠正错误。你可以通过谷歌查阅机器学习词汇表

现在你可以开始了,ML 项目工作流程中的第一件事就是问题陈述。专注于传统编程难以解决的问题。思考你试图解决的问题实际上是否需要机器学习,这是一个很好的实践。如果你是从一场卡格尔比赛开始,你已经有了目标。但是,如果你想在真实世界的数据集上工作,首先制作最基本的情节,尝试找出变量之间的模式和关系,并基于这些推理,为自己构建一个问题陈述。这就是统计项目通常被处理的方式。

有时,我们可以得到客户的要求,使用特定的算法来解决问题。比如说,手头的数据是一个城市在一定时期内的日平均气温的时间序列。这里的问题陈述是使用监督学习来预测或预报 6 天的平均温度。

抽样资料

在这里,给出的只是一系列需要以某种方式转换成特征和标签的值。某一天的温度与前几天的温度并不完全不同。如果今天的气温是 20 摄氏度,明天就不可能是 10 摄氏度或 15 摄氏度,除非在非常情况下,否则气温一定接近 20 摄氏度。这个想法可以用来做我们的工作。

使用滑动窗口方法,前两个温度可用作当前温度(标签)的特征。考虑的特征数量也可以增加,并且任何监督算法都可以应用于这个问题。

定义问题陈述基本上就是弄清楚你想做什么,以及你想怎么做。这篇文章提供了更多关于这方面的信息。

既然需要解决的问题已经清楚了,解决问题的第一步就是探索性数据分析或 EDA。简单地说,EDA 正在了解数据集,寻找差异、缺失值、趋势和模式,如果有的话;一般理解,这样您就可以回答关于数据集的任何描述性问题,而不必每次都进行查找。

Daniel Bourke 的文章提供了一份很好的 EDA 清单。

来源

在任何 ML 项目中,可视化都是关键。假设两个变量 x 和 y 具有以下属性,你能想到多少个差异巨大的数据集???

看哪,安斯康贝的四重奏!!!

图像来源

虽然 4 个数据集共享相同的描述性度量,但它们彼此完全不同。给定的准确度为 67%的回归线将无法为第二或第四数据集提供良好的预测。

如果你觉得 EDA 只对表格数据集有帮助,你可以阅读 Andrej Karpathy 关于手动分类 CIFAR10 数据集的观察。

EDA 的另一个需要注意的方面是数据集中存在的要素的数据类型的重要性。如果您浏览任何网站,从必要的标签收集的数据有时是字符串格式的,这可能会被忽略,然后在训练模型时导致问题。同样,不是每种算法都适用于每种数据类型。因此,查看数据类型并选择适合 ML 模型的数据类型是一个很好的实践。

有时数据集不够大,因此可能不适合某些最大似然算法。除非明确指定,否则并不总是需要使用一种特定的算法;选择适合你的目标。对于简单的分类任务,使用决策树可以提供比 5 层神经网络更好的准确性,并且花费更少的时间。

ML 工作流中的一个主要组成部分是将数据集分成训练、测试和/或验证数据集。如果这些例子不是随机的或者是连续的,那么就需要仔细地进行划分,否则模型中就会出现偏差。你还需要确保分类任务中的职业平衡。

来源

图片来源

2015 年,这一案件曝光,当时谷歌照片应用程序的对象识别功能将两名黑人标记为大猩猩。这是一个真实世界的场景,其中一个产品是失败的,因为它是在一个数据集上训练的,该数据集对于某些类来说具有相当高的不平衡性。作为一名开发人员,没有人希望处于这样的境地,因此,一点点额外的关心总是有帮助的。

最近,在构建更好的模型方面,研究人员和数据科学家非常关注的一个概念是特征工程。

特征工程是将原始数据转换为能够更好地向预测模型呈现潜在问题的特征的过程,从而提高对未知数据的模型准确性

-杰森·布朗利,在探索功能工程,如何设计功能以及如何做好它

2014 年,在 DrivenData 举办的一场比赛中,参赛者需要构建一个机器学习算法,该算法可以自动将标签贴在不同的购买商品上,从而了解学校如何花钱来定制策略建议,以改善学生、教师和管理人员的成果。

如果你想到一个有潜力赢得比赛并成为最好的算法,你会想到哪些?胜出的模型是逻辑回归,它包含了许多精心创建的特性。这证明了特性工程的力量,也是你应该去看看的一个原因。你可以在这里了解更多关于这个挑战的信息

现在你有了一个问题陈述和一个干净的工程数据集,你可以开始你的第一个 ML 模型了。有一件事永远不会被说得太多,那就是这个领域为尝试新的和不同的想法提供了很大的空间。随着难以置信的数据量的产生,构建新的有用的应用程序或改进现有应用程序有着巨大的空间和机会。请记住,在数据科学中,没有解决问题的正确方法,只要符合您的目的并能为您带来期望的结果,帮助您以诚实的方式成长和学习,就是正确的方法。

页(page 的缩写)你可以在这里找到一个很好的资源来学习这个话题。

关于波士顿住房数据集,你不知道的是

原文:https://towardsdatascience.com/things-you-didnt-know-about-the-boston-housing-dataset-2e87a6f960e8?source=collection_archive---------9-----------------------

我们都一直在用不正确的数据训练我们的机器学习模型。哎呀!

晚上的波士顿。照片由莫希特·辛格在 Unsplash 拍摄

如果你正在学习数据科学,你可能会碰到波士顿住房数据集。事实上,我敢打赌你会尝试谷歌如何拟合一个线性回归模型,而不是 T2。Scikit-learn 甚至允许您直接使用sklearn.datasets导入它,以及其他经典数据集。

波士顿住房数据集很小,尤其是在当今的大数据时代。但是曾经有一段时间,整齐地收集和标记的数据是非常难以访问的,所以像这样一个公开可用的数据集对研究人员来说是非常有价值的。虽然我们现在有像 Kaggle 和开放政府倡议这样的东西,给了我们大量的数据集可供选择,但这一个是机器学习实践的主要内容,就像巧克力是分手。

数据集中的 506 行中的每一行都描述了波士顿的一个郊区或城镇,它有 14 列,包含诸如每个住宅的平均房间数、师生比和人均犯罪率等信息。最后一行描述了业主自住房屋的中值价格(这不包括出租的房屋),当我们使用它进行回归任务时,它通常是我们试图预测的行。

scikit-learn 对数据集的描述,包括列的名称和描述。看到语言有什么问题吗?我们将在下面解决这个问题。来源

怎么变得如此无处不在?

这个数据集中包含的数据是由美国人口普查局收集的,它首次出现在统计分析的历史上,是由小大卫·哈里森和丹尼尔·l·鲁宾菲尔德撰写的一篇论文,名为享乐房价和对清洁空气的需求 [1]。研究人员有一个假设,即人们愿意为清洁的空气支付更多的钱——因此有了“享乐定价”这个术语,在这种情况下,它被用来描述人们分配给因素的货币价值,这些因素不是房地产固有的,而是其周围地区的——但对于如何衡量它存在争议。哈里森和鲁宾菲尔德担心:

虽然有几项研究使用了[住房市场方法]来估计空气质量改善的需求,但他们很少关注结果对程序中隐含的假设的敏感性。

一切开始的地方。来源

为了证明他们的观点,他们需要一个包含大量变量的干净的数据库和一个精确的空气污染测量方法。他们在“1970 年波斯顿标准大都市统计区(SMSA)人口普查区域的数据”中发现了这一点。他们强调数据的质量以符合他们的目的:

我们的数据库优于其他数据库,因为它包含大量的邻域变量(隔离空气污染的独立影响所必需的)和更可靠的空气污染数据。

这可能是它如此受欢迎的原因。接下来它被用于 Belsley,Kuh & Welsch (1980),‘回归诊断:识别共线性的有影响的数据和来源’2,并且从那以后它一直被用于基准算法。

原始数据集的一些问题以及如何修复它们

语言

首先,一个社会学的考虑。当我们转到数据集的规范描述时,在列‘B’下,它说:‘1000(Bk—0.63)其中 Bk 是城镇中黑人(原文如此)的比例。这种语言已经过时,可能具有攻击性,因此在描述该数据集时请避免使用。“非裔美国人”或“黑人”是更容易接受的称呼。

经过检查的数据

至于数据的质量,数据集相当强大,但并不完美。当你绘制数据散点图时,你会很快注意到房价似乎被限制在 50 英镑。这是因为人口普查局审查了数据。审查数据意味着限制变量可能值的范围。在这种情况下,他们决定将价格变量的最大值设置为 50k USD,因此任何价格都不能超过该值。

来源:我自己的分析

这就是为什么,当你可视化数据时,你会看到一个天花板,将你的数据点拉平到 50。实际上,这些价格可能更高。奥蒂斯·w·吉利在他关于哈里森和鲁宾菲尔德数据的论文中列出了属于这一类别的 16 个案例【3】。

几十年后,很可能无法找出这些房产的实际价格。尽管这在总数中只占很小的比例,但注意它对算法训练结果的潜在影响是很重要的。

数据不正确

更重要的是,Otis W. Gilley 还根据原始普查数据重新检查了所有数据,并发现中值列中的八个中值是简单的,根本就是错误的!

这是他的发现:

资料来源:Gilley (1996 年)关于哈里森和 Rubinfeld 的数据

吉利继续修正数据集,运行快乐定价的原始论文的计算,并检查结果是否仍然成立。幸运的是,对于数据科学的历史来说,没有重大的变化。

R2 测量的拟合优度在使用修正的观测值时有所上升。然而,系数的大小变化不大,原始回归的定性结果仍然有效。

尽管如此,从现在开始,数据科学和研究团体最好使用修正的数据,以避免对结果的任何潜在影响。但是,有没有一种简单的方法可以做到这一点呢?是啊!

好消息是,罗杰·比万、雅各布·诺沃萨德和罗宾·洛夫莱斯发布了一个修正的波士顿住房数据库,其中包括原始中值价格(在原始列名“MEDV”下)和修正后的中值价格(称为“CMEDV”)。它们还包括以前没有的数据,即每次观测的纬度和经度,这使得更多的绘图成为可能。我认为这应该是我们未来几年新的波士顿住房参考数据集,这就是为什么我在 scikit-learn 的 git 存储库上做一个 pull 请求来解决这个问题。希望它能很快为每个人所用。

波士顿住房数据集的未来

像“hello world”或“foo,bar,baz”一样,波士顿住房数据集已经成为常用词汇的一部分。它将继续如此,不仅因为完全标记的机器学习数据集仍然不容易找到,而且因为使用相同的数据集几十年来测试不同的算法允许科学家控制那个变量并强调算法性能的差异。

通过本文中描述的小改进和考虑,这个经典数据集在统计学和数据科学的未来仍然有一席之地,并且肯定会在未来几年继续作为一块画布来磨练新手和有经验的实践者的技能。

波士顿橡子街。来源

参考资料:

[1] Harrison,David & Rubinfeld,Daniel,享乐房价与对清洁空气的需求。环境经济与管理杂志 (1978),环境经济与管理杂志

2 D. A. Belsley,E. Kuh,R. E. Welsch,回归诊断:识别有影响的数据和共线性来源 (1980),Wiley 编辑。

[3] O. W. Gilley,关于 Harrison 和 Rubinfeld 的数据 (1996),环境经济与管理杂志

利用 Tableau 中的内置功能之前(和之后)的思考

原文:https://towardsdatascience.com/think-before-and-after-you-drag-and-drop-tools-in-tableau-b19a28b9c5d6?source=collection_archive---------79-----------------------

演职员表:https://unsplash.com/photos/46juD4zY1XA

在最近一次与利益相关方的互动中,我的任务是收集相关数据,并报告我们的一个关键流程指标(KPI)的逐月变化。由此产生的分析将成为高级管理人员演示文稿的一部分,解释我们团队最近在数据收集和奖励流程方面的修改如何影响整体企业绩效。

我与团队的讨论主要围绕我们拥有的历史数据的“数据报告”方面。虽然我过去一直利用 Tableau 来准备临时报告,但我总是尝试添加客户没有明确要求的见解。如果可以的话,是“意想不到的,未说出口的洞察力”。

添加带有预测值的见解

我心想,逐月报告是我探索客户并为其增加价值的又一次机会。由于这是一个时间序列数据,我计划利用 Tableau 的预测功能

图 Tableau 分析窗格下的预测功能

图预测的月环比变化(浅蓝色)

Tableau 允许您进一步深入预测描述细节(右键单击预测行)。预测功能还为我们提供了预测线周围 95%的估计区域(上面的浅蓝色区域)(这可以手动配置为 90%、95%或 99%的置信区间)。

我们能在报告中包括预测吗?

由此产生的预测,乍一看,看起来像一个完美的预期结果,根据我们过去的表现,预测在未来几个月的得分增加。

我另有决定。原因如下

通常情况下,虽然预测预报或聚类算法等令人兴奋的功能可能看起来像是对我们报告的巨大补充,但外部因素如组织变革、高级管理层的决策、员工行为的变化或计算标准的变化,以及有时像新冠肺炎这样前所未有的变化可能会也可能不会影响我们未来几个月的指标。

我知道未来几个月我们将要实施的一些变革。Tableau 作为一种工具,并不知道我们上面讨论的这些外部因素,因此主要只关注季节性因素来做出这些预测。因此,数据分析师有责任在将某个功能纳入报告之前权衡使用该功能的利弊。

一个特性不应该因为存在而被包含,应该在需要的时候被利用

如果你喜欢这篇文章,请添加“鼓掌”并在 Medium 和 LinkedIn 上关注我。

在监督学习任务中使用主成分分析之前,请三思

原文:https://towardsdatascience.com/think-twice-before-you-use-principal-component-analysis-in-supervised-learning-tasks-70fbb68ebd0c?source=collection_archive---------13-----------------------

因为它通常弊大于利

布鲁斯·马斯在 Unsplash 上的照片

主成分分析(PCA)是最流行的机器学习技术之一。它降低了给定数据集的维度,使数据集更易于处理,计算成本更低,同时保留了大多数模式和趋势。这使得 PCA 成为探索性数据分析的优秀工具。然而,我们声称在监督学习任务中使用 PCA,特别是在流水线中,例如

*data* → *PCA* → *supervised learning algorithm*

通常弊大于利。我们将在本文中解释主要问题。

PCA 不考虑标签

我们简单回顾一下 PCA 是如何工作的。粗略地说,主成分分析将数据集几何投影到更少的维度上,其中新的变量称为主成分。这是以这样的方式完成的,即主分量是正交的,并且具有最大可能的方差。下图显示了一个玩具示例,其中二维数据被投影到一维空间,

其中水平虚线对应于最大变化的方向。请注意,PCA 是一种不受监督的方法,这意味着它在计算中不使用任何标签。

让我们进一步假设上面的玩具例子属于二进制分类任务,并且两个类被着色为红色和黑色。

我们可以很容易地看到,纵坐标将是一个强大的特征,在分类红色类。不幸的是,如果我们应用 PCA,那么这样的特征将会消失。发生这种现象是因为标注可能与特征的方差不相关。即使真实世界数据集不会如此极端,PCA 仍然很容易丢弃强分类信号。

主成分通常是不可解释的

大多数监督学习算法,从逻辑回归、基于树的算法到神经网络,都能够评估输入特征的重要性。这些重要特性非常有价值,因为它们

  1. 帮助用户发现漏洞和问题,如数据泄漏
  2. 指出进一步探索和特征工程可能有益的领域
  3. 指明哪种数据更值得获取

诸如此类。然而,这是基于功能是可解释的假设,允许用户采取相关的行动。

例如,假设我们知道卧室的数量是我们当前模型在预测房价时最重要的特征。然后我们可以尝试获得更多关于卧室大小、卧室窗户数量等数据。

另一方面,考虑我们的模型的输入特征是主成分的情况,主成分是原始特征的线性组合。即使我们知道最重要的特征是由

0.18 * number_of_bedroom + 0.15 * house_size + ......

我们很难决定后续行动。

PCA 不是尺度不变的

基于树的算法,如随机森林和 XGBoost,可以说是最好的现成监督学习算法,部分原因是它们对特征的缩放不变。事实上,它们甚至对于特征的单调变换是不变的。当我们的数据集包含不同单位的要素时,这尤其有用。例如,我们可能在人口普查数据集中有年龄、身高、体重和工资。我们不需要担心我们应该使用千克还是磅作为重量,如何标准化工资,因为我们基于树的算法将简单地以相同的方式工作。

然而,如果我们有一个 PCA 管道,后面跟着一个监督学习算法,那么我们需要再次担心特征缩放和归一化。这是因为五氯苯甲醚对比例敏感。即使我们使用需要特征缩放和归一化的监督学习算法,也需要额外的小心。盲目标准化所有特征可能会扭曲数据,并由于噪声看起来很大而产生变化,扭曲主成分的计算。

常见问题

问:在监督学习任务中,应该使用什么来降低数据集的维度?

答:我们可以首先计算例如每个特征和标签之间的皮尔逊相关系数或斯皮尔曼相关系数。然后我们丢弃那些与标签不相关的特征。

我们也可以训练一个像 Lasso 这样的简单模型,只保留重要度高的特征。 scikit-learn 文档有一个全面的特性选择方法列表。

问:在有监督的学习中,我们可以使用 PCA 吗?

答:PCA 对于探索和理解数据集非常有用。对于 PCA 之后是监督学习算法的管道,由于上面列出的原因,它们不适合模型迭代。然而,对于快速构建模型性能基准这样的任务,它们是很方便的。

进一步阅读

  1. [1]提供了五氯苯甲醚的简短总结。关于 PCA 局限性的数字很有启发性。
  2. 2是 PCA 的综合教程。它包含数学细节以及对算法各方面的直观理解,并有许多很好的例子的帮助。

参考

  1. J.Lever,M. Krzywinski 和 N. Altman。主成分分析 (2017),自然方法 14 641–642
  2. J.史伦斯。主成分分析教程 (2014),arXiv

认为升级您的工具将使您的数据可视化更有效?再想想。

原文:https://towardsdatascience.com/think-upgrading-your-tool-will-make-your-data-visualisation-more-effective-think-again-885266eca8c7?source=collection_archive---------35-----------------------

不是你用什么,而是你怎么用。

YanC 在 iStockphoto 拍摄的图像

随着 Tableau、PowerBI 和 Qlik 等强大的现代化数据可视化工具越来越多,很容易认为升级您的工具集将使您的仪表盘和图表更具吸引力和影响力。但是有效的数据呈现是关于你如何可视化它,而不是你用什么工具来构建视觉。

令人瘫痪的选择问题

让我先说我喜欢 Tableau。可笑的是。那是一见钟情。它不仅仅是易用性和冷静,最小化的用户界面和视觉效果。这是一个邪教般的社区,会议的能量和兴奋,对极客世界的公开庆祝和对数据的热爱。

图片由的画面

我上几个工作场所都没用 Tableau,就买了个人副本在家用!这并不像听起来那么疯狂,我有一个数据 viz side hustle——尽管我认为我会不顾一切地购买它!

相比之下,我对 Excel 作为可视化工具的热爱花了更长的时间,也许是几十年。这更像是一种爱恨交加的关系,只是因为我(被迫)花时间学习如何绕过它的限制,我才了解到它隐藏的潜力。

Katarzyna Bialasiewicz 在上的照片

强力 Excel

今天的 Excel 比过去的 Excel 更友好、更好,但就数据可视化而言,它的默认设置仍然不够好。在 Excel 中制作一个专业外观的图表是完全可能的,也不会太难,但确实需要额外的努力,有时甚至需要蛮力。

现代 BI 和数据可视化平台,如 Tableau、PowerBI 和 Qlik,使构建图表和仪表盘变得更加简单快捷。他们的图表默认值是按照最佳实践数据可视化来设计的,因此比以往任何时候都更容易制作出看起来非常专业的东西。

但是专业的视觉效果并不一定有效。

那么,如果不是工具,那么是什么让你的数据视觉有效呢?斯蒂芬·诺曾经说过:

“数据可视化是抽象信息的图形显示,有两个目的:理解和交流。”—斯蒂芬·诺

呈现数据是为了向观众传达信息。正如斯蒂芬·诺什明智地指出的那样,要想有效,它必须:

  1. 有意义,而且
  2. 传达关键信息

这里的关键是,它需要有意义,并向你的观众(而不是你)传达信息。为了实现这一目标,您需要考虑您的受众对数据的熟悉程度以及他们的数据素养水平。如果观众不知道如何阅读,就没有必要展示一个巧妙的替代图表类型。以这张和弦图为例,它在视觉上和信息上都令人惊叹,但我怀疑我的经理或她的经理是否知道如何理解它。

图像由数据到 Viz

讲道理还不够

条形图是准确的,并且被所有人普遍理解,但这并不使它们成为传达所有类型信息的最佳图表类型。谷歌一下'图表选择器,你会找到 100 个好资源。更深入地看,它们都有一个共同点——它们根据需要传达的信息类型(比较、关系、分布等)对图表类型进行分组。).

聚集柱形图和条形图是条形图的自然延伸,也是性能仪表板的主要部分,例如,它们在传达差异方面并不特别有效!

哇,什么?!我的仪表板上全是簇状条形图和柱形图!是的,是时候重新考虑这个选择了。原因如下…

认知负荷

他们做了工作,但做得不好。认知负荷是这里的区别。条形图旨在有效地传达一个值或比较一系列值。然而,对于一系列成对的值,他们要求观众比较每一对的值,确定差异,记住它,然后继续下一对,再下一对。那是许多工作。相比之下,哑铃图直接关注每对数值之间的差异——工作量更少,效率更高!

查看我在 Excel 中创建哑铃图的步骤(超级简单!).

如果你的听众需要思考,如果兴趣的洞察力不是立即显而易见的,那么你的观想就没有它需要的那么有效。

图表选择并不是你减少认知负荷的唯一手段(尽管它是最有力的手段)。使用深思熟虑的风格选择,如:

  • 清除杂物
  • 标记值或使用轴,但不能两者都用
  • 直接标记您的系列,而不是使用图例
  • 故意使用颜色来强调兴趣点,淡化其他数据

帮助引导你的听众快速找到最重要的信息。加尔·雷诺兹说得好…

重要的不是你用什么,而是你如何使用它

当你改变你的工具时,数据可视化的基础不会改变。设计选择、合适的图表类型、减少认知负荷、考虑受众的知识和数据素养是关键的差异化因素。好的工具可以产生坏的图表,而“坏”的工具可以产生好的图表。

不是你用什么,而是你怎么用!

想成为 Azure 数据科学家助理(DP-100)吗?让我们讨论一下云认证

原文:https://towardsdatascience.com/thinking-about-becoming-an-azure-data-scientist-associate-dp-100-lets-32f8766df21e?source=collection_archive---------5-----------------------

读完本文后,您将对云认证和 DP-100 有更深刻的理解

Flaticon 积分

0.a)这个认证值吗?

在你开始评判我并担心我可能患有“确认偏见综合症”(我参加了考试并通过了,所以我可能会试图找到每一个理由来说这是有史以来最好的证书)之前,我想告诉你,你不需要这样做!

在这里你不会遇到类似“好好学习,成为最优秀的,像我一样!”或者“非常难,只有有经验的数据科学家才能通过。”您将要阅读的内容将尝试提出正确的问题,即数据科学云认证对您和整个行业可能意味着什么。

如果你在这里决定你是否要读这篇文章,我会提前向你描述这篇博文的走向:这将是关于你的,而不是我的。

我真诚地相信,在你做出这个决定之前,我们需要解决的问题更多的是“它是否适合我?”问题比“这是一个好的还是坏的徽章吗?”(和往常一样,现实比单纯的善恶更复杂,你不觉得吗?).

0.b)那这是怎么回事?

好吧,如果你对这个自命不凡的介绍感兴趣,让我告诉你我们将如何试图回答这个认证对你来说是不是一个好的步骤。在这里,您可以看到我们议程的图示:

Flaticon 参考:(f 第一第三

不管我们喜不喜欢,我们不能否认我们是生态系统的一部分,这个生态系统有它自己的趋势和现象,我们必须关注。如果我们避开这一部分,我们可能会低估问题。

在第一部分中,我们将描述数据科学的背景以及行业中的实际情况。了解我们周围正在发生的事情将使我们有机会了解在不久的将来,证书是否是或可能是有价值的。

此外,正如你可能知道的,为了知道某样东西是否很适合你,你还需要探索你试图赋予自己的这种东西的特性。

在第二部分,我将描述这个测试的特点,让你知道如果你想通过的话,你应该掌握或学习什么知识。我会尽我所能让你对考试的内容有一个大致的了解,所以我会避免简单的描述,比如重新表述认证技能大纲

在第三部分(达到这一点时,我们将已经知道从证书中可以期待什么),我们将了解您是否适合您的特定情况,以及您何时应该再次考虑获得此徽章。了解关于你的事情将帮助我们分析这个拼图的剩余部分:你。你的职业阶段、目标和动机给了我们讨论的最后也是最关键的部分。

1.a)数据科学生态系统

了解数据科学领域的一般背景是评估证书是否值得的必要条件。如果您听过“走向数据科学”播客,您会知道行业对话正越来越多地转向与部署、生产化和软件开发相关的主题。另一方面,最先进的模型和学术讨论并不是最热门的话题(以下截图说明了一切)。

在这里你可以找到这本书,而在这里可以找到播客。

这么说,我并不是说理解模型不重要。其实是必不可少的,但是如果这些话题现在不是最火的,那是因为以前讨论就在那里,有扎实的知识(你可以看到标准课程先试着教你这个)。

MLOps 的入侵是对人工智能行业最重大的打击之一。它变得如此受欢迎是因为它旨在修复过去几年数据科学中出现的所有问题。您可能已经知道数据科学在生产中遇到的问题。然而,如果你不这样做,成功率是令人震惊的。

况且《离开学术界走向工业界》这一集反映了一个临界点:机器学习正在远离学术界,这是一件好事!如果他们发现了一些不寻常的东西,行业自然会大量采用。还是那句话,你不再需要博士学位了;即使没有学位,你也可以被雇佣并创建伟大的人工智能应用程序(书上也是这么说的)。

谷歌趋势

正如你在谷歌趋势图表上看到的,MLOps 获得关注的速度令人难以置信,但通常的术语和模型(深度学习、随机森林和 xgboost)是稳定的。

谷歌趋势

另一方面,云平台正在遵循 MLOps 原则开发越来越多的集成,如版本化数据和模型,或创建 Kubernetes 集成,如 AKSEKS 。他们的目标是让你的体验更舒适,他们做得非常出色。有了这个,你就容易在机器学习端到端周期的每个部分使用他们的平台。

前三大云提供商的增长有一个微妙的正斜率,如果我们想知道这一趋势会发生什么,Gartner 是一个很好的来源。在他们的“【2020 年数据和分析十大趋势”中,他们描述了云服务对于 90%的数据和分析创新至关重要。所以,云不会去任何地方。

1.b)数据科学云证书的背景

新工作要求中有证书吗?嗯,在阅读了一堆关于数据科学家最受欢迎的技能的文章后,我可以说雇主要求这项技能,但证书只是一个“很好的东西”

当我们谈论 IT 认证时,在大多数情况下,您将被测试您的技术领域有多好。尽管如此,技术几乎总是与另一个特定的领域知识相关。

架构云认证就是一个例子。在其中,你需要知道如何使用这些云工具的细节,但是你也需要能够理解一般的架构原则。

很难界定评估将在多大程度上测试技术及其特定领域的知识。典型的场景是在测试的大部分时间里尝试测量技术,并且在需要的时候测量特定领域的专业知识。

但是当我们谈论数据科学时,画这条线比通常更难,因为进行机器学习项目需要对周期中的所有阶段有深刻的理解,这意味着该过程的每个不同部分都有特定的用例。

Flaticon 参考:(第二第三第四

因此,我们可以保证技术应用程序是如此紧密地与现实生活中的场景联系在一起,总是假设一些专业领域的知识。这就是为什么我认为这个考试(和其他云机器学习证书)最终会试图衡量你在两个方面的技能:技术使用和数据科学技能。

这就像当你决定变得更健康时,你对你的教练说:“给我一个百分比,告诉我应该在营养上花多少时间,在锻炼上花多少时间。”好吧,你不能用这个做一个饼状图!因为两者都是必须的,所以你不能在一个中思考而没有另一个。

2.a)那么 DP-100 呢?

在 Microsoft 考试页面上,您可以找到以下内容:

“Azure 数据科学家应用他们的数据科学和机器学习知识,在 Azure 上实现和运行机器学习工作负载;特别是使用 Azure 机器学习服务。这需要在 Azure 上为数据科学工作负载规划和创建合适的工作环境,运行数据实验和训练预测模型,管理和优化模型,并将机器学习模型部署到生产中。”

这很有趣,因为这几乎是 MLOps 所代表的完整定义。考试很好地了解了 MLOps 趋势,我认为这很好,因为你将学习机器学习项目中的大多数操作步骤。

这种分析的另一个重要方面是所提的问题,以及它们将在多大程度上衡量你的技术掌握程度和机器学习专业知识。

在一个非常高的层面上,有一个很好的问题组合来测试你在这两个方面的知识:你会发现一些问题需要对数据科学过程的理解,而不是对技术的理解,另一些问题将测试你关于 Azure 机器学习工具的细节,而几乎没有关于数据科学的任何东西,大多数时候,你需要理解这两个方面。

2.b)鉴于该考试将测试您的数据科学知识,它做得有多好?

嗯,我认为同时测试你的数据科学能力和一种技术是雄心勃勃的(甚至试图在一次测试中测试你的数据科学技能可能是荒谬的)。正因为如此,我想说,尽管这个测试确实测试了你在机器学习方面的知识,但很难确定一个通过测试的人了解数据科学的所有知识。

这可能正是数据科学云认证仍然不被雇主看好的原因之一。你可能是 Azure 数据科学家助理,但很难确定你是否拥有作为机器学习工程师所需的所有技能。

2.c)那么技术问题呢

关于这项特殊技术的问题完成了这项工作。它们是根据真实的用例场景创建的。这给测试注入了一些真实感,我认为当你想测试在特定环境下使用技术的能力时,这是非常重要的。

他们测试你是否知道如何在不同的场景下应用该技术,因为如果你学会如何使用 Azure 机器学习软件开发工具包(SDK)是不够的。

我认为这个证书的技术方面是最强的,因为在你的学习道路上,你会发现自己经常在屏幕前点头,对 Azure 如何很好地连接所有点以将机器学习模型投入生产印象深刻。

3)我适合吗?

在进入具体的案例之前,让我给你一个这个认证的概述。正如我们之前所讨论的,数据科学生态系统在不断发展,并期待您根据新的环境提供不同的新事物。

知道如何将模型转换成真正的生产系统正在成为一项宝贵的资产,微软知道这一点。他们有团队牢记这些原则,致力于改进 Azure 机器学习服务。此外,正如我们所看到的,云基础设施将在很大程度上被分析行业采用。

由于刚刚暴露的原因,如果你在数据科学和 Azure 方面有一些经验,这个认证可能会给你一点点推动,你需要扩展你的技术技能。

但是在这个认证的一般推荐之后,让我举一些白旗和红旗。如你所知,这篇文章是关于如何“匹配”这个考试,根据你职业生涯的阶段和你参加这个考试的原因,这个证书现在对你来说可能是正确的,也可能不是。

3.a)一些危险信号

朱利亚·梅在 Unsplash 上的照片

如果你正在进行数据科学的第一步,我可能会说你不是这个证书的最佳人选,这与你通过它的能力无关。这对你来说会比一个有经验的数据科学家更难,但不是不可能。你可以学习每一个命令,做每一个实验,记住所有的机器学习生命周期,你可能会通过。

问题是,你将无法理解为什么每一件作品都以那种特定的方式使用,如果你不能将这一点与你过去的经验结合起来,这些知识就不会以正确的方式解决。

所以如果你刚刚开始,你应该把你的学习时间用在基础上。你应该开始了解一些算法,学习通用框架,并做你的第一个动手项目。这里有一篇关于这个的很棒的帖子

另一个危险信号是,如果你期待快速的财务回报。我这么说是什么意思?如果你认为这会直接给你一份新工作或加薪,你可能会感到失望。因为不能保证雇主会看了你简历上的证明就立刻雇佣你。

所以,如果你想快速获得加薪或者找份新工作,可能有更好的短期选择。但是如果你的目标是中期目标,你学习新工具的能力,以及在新的工作方式中不断挑战自己的能力,将会得到高度赞赏。呀!我前进得很快,这是下一节的一部分!。

3.b)最适合!

你参加这个考试最重要的动力应该是你学习和成长的欲望。我知道这可能听起来很老套,但是,正如我们之前讨论的,这个证书本身不会让你直接获得你梦想的工作。因为对雇主来说还是没那么重要。

如果你的动机是学习,你不需要那么多蓝色的经验。不过,很明显,你需要比有经验的人多一点的实践。但是我觉得如果你自己准备的正确的话,应该是可以通过的。

我想说的另一个要点是关于成为“云不可知者”,这描述了你的能力超越了任何云。如果您实现了这一点,这意味着您可以独立于云提供商运行工作负载。如果你是一名顾问,或者如果你想的话,这应该很好。

照片由 Nghia LeUnsplash (云不可知论者?)

有趣的是,这个概念可能会误导人们,拒绝学习任何云技术,只是在他们被迫学习时才学习。所以,不要这样做,成为真正的“云不可知论者”的唯一方法是了解他们的每一个优点和缺点。

另一种情况可能是你在 Azure 上做机器学习有很多经验。如果是这样的话,我认为你参加这个考试也很好!我以为我很了解 Azure 服务。尽管如此,看看实验和问题,你可能会巩固你的知识,在寻找其他云提供商认证的过程中,了解用于在线测试的平台对你来说是很好的。

回头见!

我视认证为助推器。你可能想学习一些新的东西,我认为当你有一个具体的目标时会容易得多。

我真的希望你喜欢或发现这篇文章有用。我正在考虑创建一个关于 DP-100 的指南,所以如果你想要,请让我知道并支持这篇文章。

如果你喜欢,请在媒体Linkedin 上关注我。如果你想给我写信,我最近在 Twitter 。我很乐意与你交谈!

如果你想多读一点,看看我最近的一些帖子:

[## 交易的概率机器学习方法+ MACD 商业理解

在文章的最后,你会知道如何用概率的方式构造一个交易问题。此外,您将…

towardsdatascience.com](/probabilistic-machine-learning-approach-to-trading-macd-business-understanding-6b81f465aef6) [## 具有两个以上特征的聚类?尝试用这个来解释你的发现

使用 Plotly 的 line_polar 将向我们展示一种令人兴奋的聚类解释方法。此外,我们将看到…

towardsdatascience.com](/clustering-with-more-than-two-features-try-this-to-explain-your-findings-b053007d680a)

关于实验设计的思考

原文:https://towardsdatascience.com/thinking-about-experimental-design-f7f3090c7b6d?source=collection_archive---------59-----------------------

不言而喻(但经常被遗忘)的实验基础

照片由 Pexels 上的 Pixabay 拍摄

最近,当我浏览我最喜欢的数据科学媒体和 LinkedIn 订阅源时,我发现越来越多的文章鼓励(重新)关注基本面:概率、统计和假设检验。在这个关于实验设计的简短系列中,我希望对实验设计过程给出一个直观的(数学精简版)概述,突出其细微差别,以及一些相关的统计主题,包括随机抽样、分布和测试统计。这个系列深受 LinkedIn 课程和 Monka Wahi 的实验设计数据科学的影响,既是为了给读者提供信息和娱乐,也是为了我自己的学习。尽情享受吧!

答:简介:

作为一名有抱负的数据科学家,我发现自己经常深入研究详细介绍最新深度学习算法应用的文章。也许是机器学习算法的可访问性增加(适用于单行代码 model.fit )或人工智能承诺的有效性和生产率的雄心勃勃的飞跃,吸引了我和一代有抱负的数据科学家,并激励我们专注于复杂的设计。不幸的是(或者幸运的是),许多现实世界的数据问题不需要使用这些算法;一些问题可能会避开这些算法的使用,而倾向于更多的资源轻量级、可解释的解决方案。

在这篇介绍中,我将尝试为实验设计奠定基础,这是统计学&科学交叉的一个基本元素,不涉及复杂的数学或算法。

B .实验设计的目标:

在我的大学生涯中,我在一门关于调查统计的课程中接触到了实验和假设检验。在课堂上,我操纵预先确定的实验结果/问题的公式和数字,以展示对概念的理解。然而,作为一名现实世界的数据分析师/科学家,工作中必不可少的一部分是识别问题和设计实验,这是由学术界的教授和教科书完成的任务。因此,尽管直接研究 A/B 测试的统计数据或不同测试统计数据的分析会更有趣,但还是让我们回顾一下实验设计的基础。

重要的是要注意实验是耗时和资源密集型的;并不是所有的商业计划和/或决策都需要实验。事实上,实验应该主要用于调查变化、增量、变化的未知影响。听起来小得令人失望?当我们认识到一个实验的目标时,这并不奇怪:

实验的目标是比较不同条件对感兴趣的事件的影响,并提供对内在因果关系的洞察。

为了合理地衡量各种条件之间的影响,条件之间的差异应该是可比较的、具体的,最重要的是,由实验的研究者/所有者控制。此外,如果实验是为了增加任何商业价值,条件应该代表具有不明显价值的权衡(如果更简单的分析和商业意识支持特定的方向,没有必要使实验统计过于复杂)。作为一个简单的、人为的例子,考虑一个柠檬水摊位的经理尝试他们的柠檬水应该使用的杯子的颜色以最大化销售。杯子的颜色代表控制的 条件,对于消费者的价值是非显而易见的,最终销售代表利益事件

测试杯子颜色对售出的柠檬水杯子的影响的简单实验。图片作者。图标:由 Fernanda Giaccio &制作,由 Iconathon 制作,我们在新项目上

实验的最后一个要素是它的时间框架。继续我们的柠檬水例子:如果销量是红杯子柠檬水销量的两倍,我们能说蓝杯子更好吗?然而,如果我告诉你,我们卖了两周蓝色杯子的柠檬水,而我们只卖了一周红色杯子的柠檬水,会怎么样?为了保持指标的可比性,应该在相似的时间内使用不同的条件。

在一项实验中:

1。多种情况下有相似的结果

2。研究人员控制和/或分配参与者的条件

3。使用可比的时间框架很重要

C .转化率指标&转化率:

一个实验需要有一个定量的方法来比较不同条件下的结果——我称之为转换度量的感兴趣的度量。在我们的柠檬水示例中,,我们可以使用销售额或售出的杯子数作为我们的转换指标。然而,即使在这个简单的例子中,根据我们的业务目标,我们也可以考虑无数的额外转换指标:我们柠檬水摊位周围的客流量、售出的柠檬水数量、订单提前销售与面对面销售的数量(我们的弹出式摊位已经升级为包括电话和在线订单),等等。

在任何情况下,在确定目标转换度量后,通常的最佳实践是将度量从计数转换为速率,并在设定的时间范围内固定该速率。转化率:

1。提供相对于计数的长期稳定性

2。简化跨时间段和场景的性能比较。

3。通过将指标与运营战略联系起来,促进更清晰的目标

确定我们的转换度量似乎很简单;然而,决定我们的转换指标的分母需要更多的关注和技巧。在决定分母时,有两件事要记住:它的大小和它的精度。

虽然更大的分母像附近的客流量一样,随着时间的推移会产生更低、更稳定的利率,但它可能无法准确代表符合条件的人群——并非所有路过的人都对柠檬水感兴趣。

这可以与更小的分母相比较,比如在我们商店停留的人数——聊天、拍照(我们的摊位非常 IG-friendly)或看菜单,这些人可能有更不稳定的比率,但可能更准确地反映了感兴趣的人群。

你应该数每个路过的人,还是只数那些在你的摊位前驻足的人?没有正确的答案,因为这取决于你试图衡量什么。照片由 Abby Chung 在 Pexels 上拍摄。

D.结论

在这篇短文中,我只强调了实验的基本要求和让你开始思考实验设计的最初步骤。这些步骤中的每一步都包含了大量我没有提到的批判性思考和仔细的考虑。

在下一篇文章中,我们开始用实数分析这些概念:定义基线度量和探索/选择测试统计。

要了解更多关于指定和操作转化指标以及简单具体例子的信息,我强烈推荐观看旺卡·瓦希在 LinkedIn Learning 上的实验设计的数据科学

[1]:莫妮卡·瓦希。(2020).实验设计的数据科学。领英学习。https://www . LinkedIn . com/learning/the-data-science-of-experimental-design

因果思维

原文:https://towardsdatascience.com/thinking-causally-3727ec002d29?source=collection_archive---------54-----------------------

安德烈斯·西蒙在 Unsplash 上拍摄的照片

如何回答反事实问题——如果我们改变某些东西,会发生什么?

数据科学任务有三种类型:描述、预测和因果推理。我们工作的大部分重点放在预测上,这是正确的——这通常是赚钱的地方。然而,因果推理是重要的。对于我们这些从事研究的人来说尤其如此。然而,为了预测反事实,如果我们改变一些事情会发生什么,我们必须在我们的统计中变得更加正式。

混杂因素

首先,我们必须了解什么是混杂因素。混杂因素是影响我们的自变量和因变量的第三个变量,它不在自变量和因变量之间的因果路径上,从而产生虚假关联。因此,如果我们考虑三个变量,吸烟、心脏病和死亡,心脏病将位于吸烟和死亡之间的因果路径上,因此它是而不是一个混杂因素。

然而,如果我们考虑三个变量,吸烟,年龄和死亡,年龄会影响吸烟的概率,年龄也会影响死亡的概率。最后,吸烟不在吸烟和死亡之间的因果路径上(即,吸烟不会导致年龄,所以年龄不在中间)。所以,年龄是一个混杂因素

这是什么意思?这意味着,如果年龄是我们唯一的混淆因素,并且我们不努力根据年龄调整,我们对吸烟导致死亡的因果影响的估计就会有偏差。

有两种主要的方法来处理混杂因素。第一个是在设计阶段。这里我们可以使用随机化。这意味着有 50%的机会(实际上不一定是 50%,但这通常更容易)开始吸烟,然后看看不吸烟和吸烟组之间的死亡差异。这就是我们的因果。这控制了已知和未知的混杂因素。然而,进行随机化并不总是实际的或道德的。

第二种方式是在分析阶段。在这里,我们可以通过将混杂因素添加到我们的回归模型中来调整混杂因素。这将允许我们把吸烟的系数解释为在混杂因素不变的情况下吸烟对死亡的因果影响。我们还可以使用更复杂的 倾向评分方法 。这仅控制已知混杂因素的

但是,你不能把你认为与结果相关的每一个变量都放进去。如果你这样做,你可能会得到碰撞器偏差,我们稍后会看到。你只能而且必须调整与暴露结果相关的变量,这些变量不在暴露和结果之间的因果路径上。

有向无环图

我们如何记录我们的因果假设?提前。在查看数据之前,我们必须指定我们认为的混杂因素,以避免数据窥探偏差。你可以通过观察其他人做了什么,并利用关于这个问题的常识来做到这一点。

有向无环图。(图片由作者提供)

然后我们可以画出一个有向无环图 (DAG)。这是一个图,其中变量是我们的节点,两个顶点 A → B 之间的有向边意味着 A 导致 B

获得我们的因果估计

假设我们正确地指定了我们的因果 DAG,我们现在可以获得我们的因果估计。如果只是三个变量的情况,我们可以简单地将混杂因素添加到我们的回归模型中。在我们的例子中,吸烟的估计现在是吸烟对死亡的因果影响。然而,如果有 3 个以上的变量,我们就很难看出应该调整什么。特别是,我们可能会通过调整不正确的事情而引入偏差。

为了确定我们应该调整什么,我们可以应用 d 分离算法。这是一种算法,它寻找我们可以调整的最小变量集,这样,如果两者之间没有真正的关系,我们的暴露和结果将是有条件独立的。这是一个非常繁琐的手动应用算法。不过我们可以用一些软件比如 DAGitty 来做到这一点。

来源:Polzer 等人,2012 年。https://link.springer.com/article/10.1007/s00784-011-0625-9

假设我们有一个非常复杂的 DAG。d 分离表明,我们必须调整年龄、酒精、糖尿病、肥胖、社会心理、性别、吸烟、运动,以获得牙齿缺失对死亡率的因果影响(当然假设 DAG 是正确的!).

结论

希望这给了你一点关于因果思考的洞察力。有一些优秀的书籍,比如朱迪亚·珀尔的《为什么》,如果你想读更多的话,她在这个领域做了惊人的工作。由此得出的关键点是,在没有随机化的情况下,有可能获得因果估计。它需要用 DAG 仔细指定因果模型,并且需要您正确地指定您的模型。这超出了本文的范围,但是除了正确识别混杂因素之外,您还必须正确指定您的模型。这意味着对计数数据使用泊松回归模型,测试混杂因素之间是否存在相互作用,测试暴露/混杂因素对结果的影响是否是线性的,如果不包括多项式项。

一旦你做了所有这些,你就有了因果估计。小心地用你所做的假设来陈述。只有你的假设是正确的,才能解释为因果,人们可能不同意你的假设。

当然,你要考虑是要进行因果推断,还是仅仅进行预测。如果你只是对预测感兴趣,你可能不需要这种形式。然而,如果你关心反事实,如果你改变了什么会发生什么,那么你应该关心这个。

同样,挑战你的因果假设也是值得的。如果你把你的 DAG 的结构改成另一个看似合理的 DAG,看看你的 AB 的因果效应有多稳定。

概率思维——高级

原文:https://towardsdatascience.com/thinking-probabilistically-advanced-9ebf9b94c803?source=collection_archive---------71-----------------------

让我们试着理解条件概率和贝叶斯定理背后的直觉。

使用 Canva 创建

在我之前的文章中,我讨论了概率背后的直觉和一些相关的基本术语。现在让我们试着理解一些概率中的高级概念。像往常一样,让我们用现实生活中的例子来试着理解这些概念。

条件概率

很久很久以前,在一个叫约翰的小镇上。约翰了解了影响那个村庄近 1%人口的致命的条件性病毒。忧心忡忡的约翰去医院做检查。不幸的是,约翰的条件病毒测试呈阳性。约翰怀疑测试是否有误,但医院告知测试准确率为 95%。这对约翰来说意味着什么?

请注意,测试可能有两种错误的方式。

假阳性— 一个人可能对某种疾病检测呈阳性,而他/她却没有。
假阴性 —一个人可能对某种疾病检测呈阴性,他/她确实有。

测试正确的另外两种情况是-

真阳性 —一个人检测呈阳性,而确实患有该疾病。
真阴性 —一个人检测结果为阴性,且没有这种疾病。

该测试有 95%的准确率意味着…

树形图(使用 Canva 设计)

根据以上信息,你有多确定约翰得了这种病?
一)他几乎可以肯定有这种病。他可能得了这种病。一半对一半。他可能没有这种病。(选择一个答案,暂时记在心里。)

这里我们得到一些信息 I(测试 95%准确),基于这些信息,我们预测事件 E(约翰患病)的概率,可以用 P (E|I)表示。

现在,让我们想象这个测试是为那个村子里的每个人进行的。结果如下-

使用 Canva 创建

现在让我们看看消极的结果。只有一个受病毒影响的人测试呈阴性,这看起来很好。现在看看积极的结果。这里我们看到大量的人是虚惊一场。(假阳性= 99 意味着 99 个健康个体被检测为阳性,这非常糟糕)。

从上表我们可以看出,检测呈阳性的总人数是 118 人。在 118 人中,只有 19 人被真正感染,其余 99 人是被错误诊断为阳性的健康人。现在,如果你被检测为阳性,被感染的概率大约是 16%。(答案的证明后面会有。)
选择了选项 D 的人给自己竖起大拇指吧!如果测试结果呈阳性,那么真的被感染的可能性非常小。

现在,基于新的信息 I(整个村庄的测试统计),事件 E(约翰患病)发生的概率 P(E|I)完全改变了。(我猜你们大多数人都没有想到这一点!)

一般来说,当我们面对新信息时,我们对不确定信息的信念会改变。

我们每天都会基于不确定性做出很多判断。例如,我们根据天气预报、外面的天气以及朋友的建议等信息来做出关于天气的决定。我们根据我们在报纸上读到的内容、我们对球队实力的了解以及与朋友的讨论来决定我们认为谁将赢得一场体育赛事。条件概率是一种简单的量化我们对给定信息下的不确定事件的信念的方法。对于两个事件 A 和 B

独立事件

如果一个事件的发生不影响另一个事件,则称这两个事件是独立的。例子-在第一次掷骰子时得到 6 与在第二次掷骰子时得到 1 是独立的。对于独立事件—
P(A∩B) = P(A)⋅P(B)

从属事件

如果一个事件的发生确实影响到另一个事件,那么这两个事件就被称为是相关的。示例-从袋子中取出弹珠。每次我们移除某个颜色的弹珠,移除相同颜色弹珠的概率都会发生变化。对于依赖事件—
【p(a∩b)=p(a)⋅p(b|a】

互斥事件

如果两个事件 A 和 B 互斥,那么它们不可能都发生,也就是说(A ∩ B)是不可能事件(而不可能事件的概率永远是 0)。示例-当我们掷出普通的六面骰子时,得到 5(事件 A)和 3(事件 B)。不可能同时得到 5 和 3。对于互斥事件—
P(A∩B)=0

现在,如果我们只想求 P(T+),一个随机选择的人得到正结果的概率呢?当某人获得肯定结果时,有两种可能的情况:

  1. 这个人感染了条件性病毒,并得到阳性结果。
  2. 此人未感染条件性病毒,并得到阳性结果。

在第一个场景中,请注意发生了两个事件:此人感染了病毒,并被检测为阳性(病毒∩ T+)。

在第二个场景中,发生了两个事件:这个人没有携带病毒,并且被检测为阳性(没有病毒∩ T+)。

由于只有两种可能的场景,我们可以把事件 T+理解为事件(病毒∩ T+)和(无病毒∩ T+)的并集:

T+=(病毒∩T+)∩(无病毒∩ T+)

我们已经知道:P(A∪B)= P(A)+P(B)—P(A∪B)

事件(病毒∩ T+)和(无病毒和 T+)是互斥的(它们不能同时发生),因为一个被检测为阳性的人不能同时携带和不携带病毒。这就意味着我们可以用:P(A∪B)=P(A)+P(B)
来计算它们并的概率(P(A∪B)= 0 表示互斥事件)。

P(T+)=P(病毒∩ T+)+P(无病毒∩ T+)

病毒和 T+是相关事件,因为测试结果取决于一个人是否携带病毒。因此 p(病毒∩ T+) = P(病毒)* p(t+|病毒)
(对于相关事件 P(A∩B)=P(A)⋅P(B|A))

P(T+)=P(病毒) P(T+|病毒)+ P(无病毒) P(T+|无病毒)**

p(T+)= 0.01 * 0.95+0.99 * 0.05 = 0.059

我们看到 P(T+)——检测阳性的概率——只有5.9%。这主要是因为首先感染病毒的概率非常低。

贝叶斯定理

使用 Canva 设计

在上图中,先验概率是指在接受检测前患病的概率。我们发现 P(E) ie。P(T+) = 0.059 以上。这个公式最难的部分是找出先验概率。在我们的案例中,正如我们在上面讨论的,1%的人口受到条件病毒的影响,我们可以认为先验概率为 0.01。
P(E|H) = P(T+ | H) = 19/20 = 0.95。

现在 P(H | E)=(0.95 * 0.01)/0.059 = 0.16 = 16%(这里是我上面提到的证明)。16%被称为后验概率

Bayes 最初考虑了一个思维实验,他坐在桌子前,让他的助手在桌子上扔一个球。现在,这个球可以落在桌子上的任何地方,他想知道它在哪里。所以他让他的助手扔上另一个球,并告诉他下一个球是在第一个球的左边,右边,顶部还是底部,Bayes 会记下并要求越来越多的球扔在桌子上。贝叶斯意识到的是,通过这种方法,他能够更新他对第一个球在哪里的想法。当然,他永远无法确定球的准确位置,但随着每一个新的证据,他可以越来越准确,这就是我们如何看待世界。我们并不完全理解它,但是随着我们获得证据,我们提高了理解能力。

让我们考虑一个人,他在山洞里呆了半辈子,突然第二天看到了日出,觉得‘每天都这样吗?’随着时间的推移,这个人明白了世界就是这样运转的。因此,贝叶斯定理并不是一个只能使用一次的公式,而是可以多次使用的,每次都可以获得新的证据,更新某事为真的概率。

现在让我们回到约翰身上。让我们假设约翰去了另一家医院做测试,第二次测试结果也是阳性。现在概率发生了什么变化?我们将应用相同的公式,但改变一个变量。我们将使用后验概率而不是先验概率来计算新的概率。

P(H|E) = (0.95 * 0.16)/0.059 = 2.5,大于 100%,这意味着约翰肯定受到条件病毒的影响。

结论

在本文中,我试图通过举例说明来讨论条件概率和贝叶斯定理背后的直觉。我希望你今天带了新东西回家!

如果你有什么建议,我很乐意听听。在我的下一篇文章中,我将解释广泛使用的假设检验概念。在那之前,呆在家里,保持安全,继续探索!

如果你想联系,请在 LinkedIn 联系我。****

概率思维—基础

原文:https://towardsdatascience.com/thinking-probabilistically-fundamentals-da956e5ca077?source=collection_archive---------84-----------------------

除了统计学,让我们通过理解相关术语和案例研究来学习概率语言。

使用 Canva 设计

在过去的几个世纪里,科学和工程取得了惊人的进步。我们现在能够从地球上发射宇宙飞船,并预测它将在某个时间和地点到达火星。然而,看起来并不是所有的事情都像宇宙飞船的轨迹一样容易预测。

以扔硬币为例——虽然听起来很荒谬,但我们无法肯定地预测硬币会正面朝上还是反面朝上。这是因为抛硬币是一种非常复杂的现象。结果取决于多种因素——投掷的力度和角度、落地角度、硬币落地的表面等。

使用 Canva 设计

尽管我们无法预先知道掷硬币的结果,但我们至少能够估计硬币正面或反面落地的概率(几率)。这听起来像是一种限制,在某种程度上确实如此,但是估计概率是一种非常强大的技术,它可以使我们构建重要的应用程序,包括:

  • 图像识别系统(用于自动驾驶汽车、医疗诊断等。)
  • 收件箱的垃圾邮件过滤器。
  • 统计假设检验。

术语

每当我们不能确定地预测结果时,我们就在和一个随机实验打交道。

抛硬币是一种随机实验,就像抽彩票号码或掷骰子一样。术语“实验”可能会让你想到科学,但这个术语在这里有更广泛的含义——随机实验是任何我们无法确定预测结果的过程。

一个结果是随机实验可能终止的任何结果。例如,滚动六面骰子的所有可能结果是 1、2、3、4、5 和 6。

虽然我们不能预测随机实验的结果,但我们至少可以估计与结果相关的概率(机会)。抛硬币有两种可能的结果,我们可以估计硬币正面或反面落地的概率。

一般来说,对于任何事件 E (就像一枚硬币正面朝上落地),我们可以通过下面的公式找到它的概率:

当我们通过执行一次或多次实验来计算事件的概率时,我们计算事件的实验 —或经验概率 —。

我们假设,我们把一枚硬币抛 300 次,发现 P(H) = 46%。然后,我们将一枚硬币抛 5000 次,发现 P(H) = 51%。但是如果不同的投掷次数给出不同的概率值,那么 P(H) 的真实值是多少?

为了回答这个问题,我们要做一个思维实验,假设我们已经知道 P(H) 的真实概率是 50%。我们还假设得到反面的机会是一样的,所以 P(T) = 50%

利用这些假设,我们将使用 Python 模拟一次抛硬币 10,000 次,并观察 P(H) 如何随着抛硬币次数的增加而演变。

上面我们看到,对于最初的 1000 次左右的投掷, P(H) 的值变化很大,最大值为 1.0,最小值约为 0.45。但是,随着投掷次数的增加, P(H) 的值趋于稳定。

有趣的是, P(H) 稳定在 P(H) 的真值附近,我们假设为 P(H) = 50% = 0.50。这表明投掷硬币的次数越多, P(H) 就越接近真实值。

现在我们明白,正确计算经验概率需要我们多次进行随机实验,这在实践中可能并不总是可行的。估计概率的一个更简单的方法是从假设随机实验的结果有相同的发生几率开始。这允许我们使用下面的公式来计算事件发生的概率 E :

当我们在假设结果发生的几率相等的情况下计算一个事件的概率时,我们说我们在计算一个事件的理论概率。

例如,掷硬币的可能结果有两种:正面或反面。设 H 是硬币正面落地的事件,而 T 是硬币反面落地的事件。我们可以用上面的公式求出 P(H)P(T) :

P(H)=1/2=0.5

P(T)=1/2=0.5

理论上的概率更容易计算,但在实践中,假设随机实验的结果发生的几率相等并不总是有意义的。例如,在一场板球比赛中,我们可以看到双方获胜的概率。这并不总是 50-50,而是根据条件、历史等不断变化。

假设在掷出六面骰子时,我们将得到 1 到 6 之间的任何数字(包括 1 和 6)。结果是 1,2,3,4,5 和 6,所以我们有 100%的机会得到 1 到 6 之间的某个数字。然而,使用我们的公式,我们发现概率只有 16%:

p(1 到 6 之间的数字)=1/6=0.16=16%

要解决这个问题,我们需要将上面的公式更新为:

排列组合

在英语中,我们使用术语组合而不考虑顺序。例 1——我的水果沙拉是芒果、香蕉和苹果的组合。
例 2——我的保险箱密码组合是 472。

在例 1 中,顺序是不重要的。先放香蕉还是先放苹果,都是一样的水果沙拉。但是在示例 2 中,顺序非常重要。742 是我保险箱的错误密码。

当顺序很重要时,它就是排列。
当顺序无关紧要时,它就是组合。

当我们有一组 n 对象,但我们只取了 k 对象时,

案例研究——彩票成瘾手机应用

一家旨在预防和治疗赌博成瘾的医疗机构希望建立一个专用的移动应用程序,以帮助彩票成瘾者更好地估计他们的中奖机会。该研究所有一个工程师团队将构建应用程序,但他们需要我们创建应用程序的逻辑核心并计算概率。

对于该应用程序的第一个版本,他们希望我们专注于 6/49 彩票(您将获得一张由 1-49 的 6 个数字组成的彩票,如果您彩票上的 6 个数字都与抽奖相符,您将获胜)并构建功能,使用户能够回答以下问题:

  • 单票中大奖的概率有多大?
  • 如果我们玩 40 张不同的彩票(或者其他任何数字而不是 40),中大奖的概率是多少?

让我们定义两个贯穿始终的函数。

现在我们需要找出给定彩票中奖的概率。我们将编写一个函数one_ticket_probability(),它将接受一个包含 6 个数字的列表(每张彩票包含 6 个数字)作为输入,并将打印获胜的概率。

彩票迷通常在一张彩票上玩多张彩票,认为这可能会大大增加他们中奖的机会

现在让我们编写一个函数,允许用户计算任意数量的不同彩票的中奖几率(彩票总数为 13983816)。

上面选择的案例研究摘自 dataquest.io.

结论

我们讨论了概率背后的直觉,以及在不确定的情况下概率是如何有用的。我们还试图理解基本术语,并在彩票案例研究中应用我们所学的知识。在接下来的文章中,我们将讨论最常用的假设检验概念。希望你今天带了一些新概念回家!呆在家里,注意安全!

这改变了你“看待”量子计算的方式

原文:https://towardsdatascience.com/this-changes-the-way-you-see-quantum-computing-53fcebcac479?source=collection_archive---------26-----------------------

探索量子观察者效应

本帖是本书的一部分: 用 Python 动手操作量子机器学习

作者弗兰克·齐克特的图片

一个量子位是一个两能级的量子系统,除非你观察它,否则它是|0⟩和|1⟩量子态的叠加。(这里有更多关于量子位状态的内容)。一旦你观察到它,测量01的概率是不同的。在物理学中,这被称为观察者效应。它说仅仅观察一个现象不可避免地会改变这个现象本身。例如,如果你在测量你房间的温度,你就带走了一点能量来加热温度计中的水银。这种能量的损失会使你房间的其余部分降温。在我们所经历的世界中,观察的影响通常可以忽略不计。

但是在量子力学的亚原子世界里,这些效应很重要。它们很重要。仅仅观察一个量子比特,它的状态就会从|0⟩态和|1⟩态的叠加变成任意一个值。因此,即使是观察也是我们在开发量子电路时需要考虑的对系统的操纵。

这是一个简单量子电路的代码。

加权初始状态

当您运行代码时,您将看到以下输出。

作者弗兰克·齐克特的图片

我们的电路由一个量子位组成(第 6 行)。它有初始状态[1/sqrt(2), 1/sqrt(2)](第 9 行),我们用它初始化量子电路(第 12 行)。

这是狄拉克和这种状态的向量符号:

我们添加一个模拟后端(第 15 行),执行电路并获得结果(第 18 行)。result对象提供了get_counts函数,该函数提供了我们量子位的最终(观察到的)状态的概率。

让我们看看我们的电路。QuantumCircuit提供了渲染电路图图像的draw功能。提供output=text作为命名参数,以获得图像的 ASCII 艺术版本。

绘制电路

作者弗兰克·齐克特的图片

该图在左边显示输入,在右边显示输出,以及它们之间的操作。

这里看到的是我们的单个量子位(q)及其初始化值(1/sqrt(2)=0.707)。这些值既是我们电路的输入,也是输出。当我们执行这个电路时,我们的result-函数计算|0⟩和|1⟩.叠加态的量子比特因此,在任一状态下,我们都有 50:50 的机会捕捉量子位元。

让我们看看,如果我们把量子位作为电路的一部分来观察,会发生什么。

测量电路

作者弗兰克·齐克特的图片

“哇哦?!"

我们得到一个 100%概率的结果状态1。那不可能是真的。让我们重新运行代码...(我知道,做同样的事情却期待不同的结果是精神错乱的表现)

作者弗兰克·齐克特的图片

又来了。100%测量概率…等等…是状态0

不管你多长时间运行一次这段代码,你都有 100%的概率得到0或者1。事实上,如果您多次重新运行代码并计算结果,您会看到 50:50 的分布。

听起来很可疑?是的,你说得对。让我们看看我们的电路。

作者弗兰克·齐克特的图片

我们的电路现在包含一个测量。这是一个观察。它将我们的量子位拉出叠加态,让它坍缩成0 1。当我们后来得到结果时,已经没有什么量子了。这是一个独特的价值。这是电路的输出(右边)。

我们是否观察到一个0或一个1现在是我们量子电路的一部分。

底部测量线的小数字并不能描述量子位的价值。这是测量的指标。它从 0 开始计数。下一次测量将会有数字 1、2 等。

有时候,我们称测量为量子位元状态的崩溃。这个概念强调测量的效果。与经典编程不同,在经典编程中,您可以随时检查、打印和显示位的值,而在量子编程中,它会对您的结果产生影响。

如果我们不断地测量我们的量子位来追踪它的值,我们会让它保持在一个明确的状态,不是0就是1。这样的量子比特和经典比特没有什么不同。我们的计算很容易被经典计算所取代。在量子计算中,我们必须允许量子位元探索更复杂的状态。因此,只有当我们需要提取输出时,才使用测量。这意味着我们经常把所有的测量放在量子电路的末端。

测量作为一种操作

但是测量如何改变状态呢?用数学术语来说,测量是一种操作。(这里有更多关于量子位操作的内容)

在量子电路中,我们称操纵算子为“门”。单量子比特门是将单个量子比特转换成另一个(可能是相同的)量子比特的线性操作器。门是在这些状态之间改变量子位的操作。

当我们测量一个量子位时,它会坍缩到01。让我们用数学术语更仔细地看看这个观察结果。

顾名思义,量子态矢量就是矢量。我们如何改变向量?对,通过乘法。

我们知道|0⟩说我们的量子比特在被观察时会产生值0。|1⟩说我们的量子位在被观察时会产生值1。我们知道这一点

是矢量。

量子态的量度是概率。概率是一个单一的数字,称为标量。向量相乘有不同的方法。但是矢量乘法的一种特殊方式会产生标量。这叫内积。它是由列向量|0⟩乘以行向量⟨0|.得到的

内积定义为:

向量的内积

之前的文章中,我们介绍了狄拉克符号和它的“ket”——表示向量的构造(/kɛt/) (|0⟩)。现在,我们介绍“胸罩”结构(/brɑː/) (⟨0|).胸罩是一个行向量。

那么,从|0⟩测量出1的概率有多大呢?让我们构建内积来找出答案:

而且测到0的概率有多大?

太好了!尽管这是非常数学化的,但它说明了我们如何从量子态中获得一个值。用状态向量乘以行向量。

结论

在这篇文章中,我们探索了量子观察者效应。我们知道了一个量子叠加系统是如何通过测量来改变的。虽然观察者效应也存在于我们所经历的世界中,但它通常可以忽略不计,我们也不需要在意。

但是在量子力学的亚原子世界里,这很重要。这对量子计算很重要。如果你在量子电路中一遍又一遍地测量你的量子位,你会把它保持在受控状态01

为了利用量子计算机提供的可能性,你必须让你的量子位保持在叠加态,直到你的计算结束。你不能一直观察你的量子位

…尽管这个小东西做的事情很有趣…

本帖是本书的一部分: 用 Python 动手做量子机器学习

在这里免费获得前三章。

这个功能可以让你的熊猫编码明显更快

原文:https://towardsdatascience.com/this-function-can-make-your-pandas-code-significantly-faster-d018fb5045a9?source=collection_archive---------16-----------------------

更准确地说是快了 35 倍

熊猫是一个很棒的图书馆,但它不是最快的。不过,有一些方法可以让它变得更快,那就是为正确的任务使用正确的工具。今天我们将探索这些工具中的一个,它将使日常任务显著加快。

照片由阿德里安·匡威Unsplash 上拍摄

没有必要再写引言部分了,所以让我们快速浏览一下文章的结构,然后继续有趣的内容。这篇文章分成几个部分:

  • 数据集和问题概述
  • 不可行的解决方案
  • 首选解决方案
  • 结论

所以事不宜迟,让我们开始吧!

数据集和问题概述

为了演示,我们需要两个图书馆,那就是 NumpyPandas 。该数据集是完全虚构的,显示了特定日期 3 种产品的销售情况。日期被分成 3 列,只是为了让计算机更难处理。

不管怎样,这是数据集:

这里没有什么特别的,但是我们有相当多的数据— 100K 行。下面是前几行的样子:

我们知道某一天卖出了多少件商品,但不知道单价,所以让我们快速声明一下:

厉害!以下是我们的最终目标(针对每一行):

  • YearMonthDay组合成一个变量
  • 用单价乘以销售量来计算每天的利润
  • 将这两个变量作为键值对添加到一个列表中

我们也想尽快完成这项工作。有多种方法可以解决这个问题,但其中只有一种是最佳的。

在我们宣布这种类型任务的可行方法之前,让我们先探讨一下不要做什么。

不可行的解决方案

正如上一节所讨论的,我们有相当多的工作要做。这并不意味着计算机需要很长时间才能完成。你会惊讶于这一切完成得有多快。

但是首先,让我们探索两个选项中最糟糕的一个,那就是使用iterrows函数遍历数据帧行并执行计算。

代码如下:

因此,我们已经完成了前面几节中描述的所有任务,完成这些任务几乎用了 8 秒钟。

你可能会认为事情没那么糟,但是等着看我们下一步做什么吧。

首选解决方案

如果你觉得iterrows不错,那就等着见itertuples吧。这是一个类似的函数,用于遍历数据帧的行,但是它的速度要快得多。

我们将执行相同的任务并比较执行时间。itertuples处理元组,所以我们不能使用括号符号访问 DataFrame 值。这是唯一的区别。

总之,代码如下:

这只花了 0.218 秒就完成了!这是 35 倍的降幅,非常显著。在这个玩具示例中,可能没有那么多,因为 8 秒钟并不是很长的等待时间,但这很容易扩展到数百万或数千万行。

记住——在执行类似的任务时,请始终使用itertuples

在你走之前

这是我第二次讨论这个主题,但这一次数据集和问题任务对于计算机和开发人员来说要繁重得多,所以我觉得值得分享。

不要认为这 35 倍的速度提升是有保证的,因为结果可能会有所不同,这取决于任务的类型和您的硬件。尽管如此,iteruples每次都应该比iterrows表现得更好。这才是最重要的。

加入我的私人邮件列表,获取更多有用的见解。

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

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

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

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

这位谷歌科学家教授人工智能以构建更好的人工智能

原文:https://towardsdatascience.com/this-google-scientist-teaches-ai-to-build-better-ai-8a8fcf6ea6b8?source=collection_archive---------5-----------------------

独家 TDS 采访

TDS 就 AI visionary 在谷歌大脑的前沿研究、深度强化学习如何工作等问题采访了她。

面试官:TowardsDataScience.com 项目负责人 Haebichan Jung

受访者: Azalia Mirhoseini ,博士,谷歌大脑的技术负责人和高级研究科学家。《麻省理工评论》评选的“35 名 35 岁以下的创新者/远见者”之一。

本次采访发生在 2019 年 11 月 多伦多机器学习峰会(TMLS)

欲了解更多仅限 TDS 的面试,请点击此处查看:

[## 仅限 TDS 的面试

阅读《走向数据科学》中关于 Tds 采访的文章。分享概念、想法和代码。

towardsdatascience.com](https://towardsdatascience.com/tagged/tds-interview)

你能告诉我们你的专业背景吗?

我在莱斯大学获得了电子和计算机工程的硕士和博士学位。我致力于大规模数据分析模型和机器学习的算法、硬件/软件代码设计。当我的博士论文快结束时,深度学习开始起步,我将我的注意力转向了深度学习。

后来,我看到了谷歌大脑驻留计划的传单。目标是让有深度/机器学习以外背景的人成为该领域的研究人员。我在那里已经 3 年半了。

顺便说一下,我注意到在机器学习社区中有一件非常普遍的事情,那就是很多人对计算机视觉、NLP、机器人、机器学习和游戏的研究非常感兴趣。

因此,我对为系统和计算机设计做 ML 感到非常兴奋,因为这些是机器学习的最大推动者。深度学习的许多成功都归功于我们现在拥有的更好的硬件和系统,这是 10 年前所没有的。

你能给我们举一些系统/芯片在人工智能进步中的作用的例子吗?

当然,这些就像 Tensorflow 和 Pytorch 一样强大,人们可以很容易地进入它们来训练自己的 DL 模型。其他重要的方面是芯片和硬件,如 GPU 和 TPU。

TPU 或张量处理单元也是非常强大的硬件,用于运行我们以前没有的 ML 算法。这些类型的系统使深度学习成为今天的样子。

[## 云 TPU |谷歌云

以前所未有的速度训练和运行机器学习模型。机器学习产生了商业和研究…

cloud.google.com](https://cloud.google.com/tpu/)

此外,如果你看看人工智能的趋势,我们会注意到,我们真的需要更好的计算机硬件才能跟上人工智能的计算需求。所以我认为的方式是使用机器学习本身来帮助人工智能,并设计下一代系统和芯片。

开发这些系统是你在谷歌大脑的主要职责吗?

2018 年,我和我的同事安娜·戈尔迪(Anna Goldie)在谷歌大脑(Google Brain)成立了系统机器学习团队。我们团队的主要重点是利用人工智能来设计和优化下一代系统和芯片。我们关注的研究类型主要是深度强化算法——使我们能够解决大规模优化问题的顺序决策优化方法。

你所说的顺序决策过程是什么意思?

举个例子,在机器人任务中,假设一个机器人想要到达一个目标。机器人位于二维网格上,想要四处移动。决策序列是关于机器人首先移动到哪里的决策(左、右、直行、障碍物等)。).

所以你要按顺序做出一系列决定。你采取一个行动,那就是向右走。然后你采取下一步行动。你的行动取决于你之前采取的行动。

你的最终目标是采取一系列行动,以最少的移动次数尽可能快地达到目标。顺序决策任务与你如何优化一系列决策有关,这样你就能以一种优化的方式达到你的目标回报函数(不管是什么)。

在这个过程中,优化是如何发生的?

我会在政策优化(强化学习)的背景下告诉你。你可以想象你有一个代表你的政策的神经网络模型。开始时:

  1. 该模型用随机权重初始化。它对你的环境一无所知。但是渐渐地,
  2. 该模型采用您的问题的当前状态,并输出您所采取的行动的概率分布。假设你有 4 个动作(上、下、左、右)。你采取这些行动,衡量你离目标有多近,就像一个奖励函数。
  3. 你现在有了这个中间奖励函数,你一直采取下一个行动,直到你达到目标。
  4. 中间奖励函数集合中的最终奖励函数可用作反馈,以返回并更新代表您的策略的神经网络的参数。

术语策略在这里是什么意思?

这里的策略是指强化学习模型。之所以称之为“策略”,是因为它需要一个输入状态和一组操作。它预测给定状态下的动作。所以才叫政策。

你能阐明在没有目标变量的情况下,仅仅依靠奖励函数,优化是如何发生的吗?

是的,这里没有标签,但是我们仍然有问题输入的状态,最后,我们想优化奖励函数。在许多这样的策略优化算法中,我们所做的是,我们训练一个策略来优化预期的奖励函数,给定它对给定状态预测的行为分布。

换个话题,你能告诉我们你另一个令人兴奋的深度学习研究吗:稀疏门控的专家混合层?

这是我和一群优秀的同事加入谷歌大脑时做的第一个项目。这一层背后的想法是,如果你研究深度学习模型(transformer,convolutions,LSTMs),许多这些模型都相对密集。

密集意味着输入的例子要经过整个网络,从开始到结束。在所有输入示例中,我们用相同的计算量处理每个输入。

这项工作背后的想法是,我们可以有一个专家联盟,其中每个专家都由神经网络本身来表示,这些专家可以专门研究训练数据集中不同类型的数据。所以当你在整个模型中传递一个例子时,这个例子通过这个神经网络的某些路径,一直到最后,但不是通过所有的东西。

https://arxiv.org/pdf/1701.06538.pdf

这种模式有很多优点。首先,我们可以拥有大量能够从海量数据中学习的模型。这意味着我们可以有很多参数。我们建立的一个模型有数十亿个参数,我们在上面训练了数十亿个数据点。

它的优点在于它的简单性,因为一个例子只能看到模型的一小部分。我们可以假设总共有 1,024 名专家,但该示例只涉及 4 或 8 名专家。所以我们有了这个大容量模型,但是应用于每个样本的计算能力仍然非常小。然而,这个大模型可以从我们拥有的大量数据和大量参数中集体学习,它可以用来对知识进行编码,并用于训练模型。

所以重复一遍,稀疏门控专家混合层是:

一个与全球模型集成的层,你有一大群专家(又名神经网络)在研究数据的不同部分。但是为什么你的方法被称为稀疏选通,是因为我们不是在看每一个专家,而是几个专家,但是你仍然能够像所有不同的专家一样得到相似的结果?

或者有更好的结果!它之所以被命名为稀疏门控,是因为我们和这些专家一起训练我们所谓的门控器。专家层的输入首先到达 Gater,Gater 决定哪些专家应该处理这个输入。这些专家中很少有人会收到任何对此门户网站的意见。把 Gater 想象成通过一些专家传递输入的例子。这就是为什么它被称为稀疏门。

是的,正如你所说,我们有这些专家层和 Gater,你可以将它嵌入到深度学习模型中,比如 LSTM。令人惊讶的是,我们不仅可以更快地获得结果或达到同样的精度,我们还可以获得更好的结果。一部分是因为我们可以处理更多的数据,另一部分是因为稀疏选通 MOE 的正则化效应,使模型更好地推广到看不见的测试数据。

能详细说说正规化吗?

退学就是做正规化的一个例子。你可以认为教育部在某种意义上类似于辍学。除了它是以一种更结构化的方式使用的,在这种方式中,我们也利用了稀疏性的好处来提高计算效率。

所以我们有所有这些模型,每次 Gater 查看它为一个例子得到的任何激活,并把它传递给少量的模型。而在密集层中,你可以看到所有的模型都通过它。在这里,我们通过设计空投了大量的专家。

这项研究令人兴奋的是,你们解决了条件计算试图解决但无法解决的问题。你能告诉我们更多关于这个的信息吗?

解释一下,这是一个条件计算的原因是,尽管大多数其他深度学习模型的输入都经过整个网络,但在这里,我们通过 Gater 模型与网络的其余部分联合调节输入。

我们通过 Gater 对其进行调节,将其限制在神经网络的某些路径上。这样,我们的专家或模块在训练数据的不同部分变得专业化,这有助于他们更好地处理和评估数据。

[## 条件计算

条件计算指的是一类算法,其中每个输入样本使用模型的不同部分…

nervanasystems.github.io](https://nervanasystems.github.io/distiller/conditional_computation.html)

你能告诉我们更多关于谷歌大脑的信息吗?团队是如何构成的,人们做什么样的工作?

这是一个伟大的团队,我们拥有大量优秀的研究人员和工程师,他们合作得非常好。我们专注于重要和真正困难的问题。和这个团队一起工作,解决我们所做的一类问题,是一件非常有趣的事情。

我想说我们有良好的学术文化。我们积极参与出版物和顶级会议。我们真的鼓励我们的研究人员发表和合作。

[## 大脑团队-谷歌研究

关于团队研究自由谷歌大脑团队成员制定自己的研究议程,团队作为一个整体…

谷歌研究](https://research.google/teams/brain/)

与此同时,许多激动人心的工作来自谷歌大脑。一个例子是谷歌翻译,这是基于 LSTM/序列-2-序列的方法,真的很神奇。他们彻底改变了 NLP 机器翻译的方式。

[## 了解 RNN 和 LSTM

什么是神经网络?

towardsdatascience.com](/understanding-rnn-and-lstm-f7cdf6dfc14e)

你能和杰弗里·辛顿一起工作吗?

事实上,我关于专家混合的论文是和杰弗里·辛顿一起写的。能够和他一起工作,我感到非常幸运。他是一个了不起的人,和他在一起是一种享受。同时也是最卑微的人。

来自 TDS 观众的最后一个问题:人工智能的未来是什么?AI 是工具还是 AI 是产品?未来更有可能的场景是什么?

我对 AI 非常肯定。相信 AI 会帮助到大家。当然,在工业界,他们可能有机会接触到其他人可能没有的计算和数据。与此同时,我觉得即使没有大量数据,也可以做很多工作和研究,因为这样你就可以围绕我们现有的限制进行创新。我们在学术界经常看到这种情况。

因此,我认为学术界和工业界有机会蓬勃发展,同时在这个人工智能时代,如果我们做一些伟大的事情,例如自动驾驶汽车,我个人认为这对每个人都很好,让他们有更多的时间去追求其他事情和在其他领域创新。

完整的采访,请点击查看视频:

[## Haebichan Jung - Medium

阅读容格在媒介上的作品。“走向数据科学|芯片领域的数据科学家”项目负责人…

medium.com](https://medium.com/@haebichan)

这是猪崽子。

原文:https://towardsdatascience.com/this-is-hogwild-7cc80cd9b944?source=collection_archive---------18-----------------------

在 PyTorch 中加速您的神经网络训练

我目前正在攻读分布式机器学习领域的博士学位。我注意到并行过程在日常机器学习中并不常用。因此,我想谈谈 PyTorch 的多重处理。在这篇博文中,你将会了解到野猪!算法,用于以并行方式运行随机梯度下降(SGD)。由于列出的论文涵盖了所有必要的数学知识,我就不赘述了。相反,我将用 PyTorch 解释一般的想法并给出一个非常简单的例子。

Unsplash 上由 James Wainscoat 拍摄

为什么平行?

如果你曾经在你的机器上自己训练过神经网络,你可能已经注意到了这样做所消耗的时间和计算能力。尤其是在使用大数据集进行计算机视觉或其他高维训练数据时。麻省理工学院最近的一篇文章显示,训练一个人工智能算法可以产生大量的碳(链接到文章)。这说明了 AI 模型训练所需要的必要力量。因此,如果花费的时间太长,应该使用减少总训练时间的并行过程。

猪猡!解释

一个可能的算法是 Hogwild!它利用计算机上的并行进程同时异步运行 SGD。异步对于减少不必要的空闲时间很重要,在空闲时间里没有计算,但是仍然消耗能量。

数据管理

利用猪八戒!并行训练会话中的每个参与过程负责数据的一个分区,例如,具有 8 个并行过程会将数据集分成 8 个相等的部分,而每个过程被分配给一个部分。此外,在共享内存或单独的服务器上,会创建一个可由所有进程访问的初始模型。

更新

一旦训练开始,每个进程从共享内存加载模型的当前状态,并开始读取它们的第一批数据分区。与标准 SGD 一样,每个过程都在计算该批次的梯度。梯度现在被直接写入共享模型,而不会阻塞其他过程。一旦写入,就加载新的模型参数并使用下一批参数。由于缺少分块,共享模型有时会接收到旧的梯度,人们可能会认为这是一个缺点。霍格维尔德的研究者们!然而,可以显示训练甚至受益于非阻塞方式。

分布式 Hogwild!

利用猪八戒!在分布式计算机上,集群具有巨大的通信开销,因为在每一批之后,梯度需要通过网络发送。因此,Hogwild++被开发出来,它通过将进程(即每台计算机)组织成一个环来减少开销。训练时,通过那个环发送一个令牌。令牌带有全局模型。每当一个令牌到达一个节点时,模型权重之间的差被计算并用于以非平凡的方式更新模型。欲了解更多详情,本文最后有链接。

PyTorch 中的实现

这个代码例子是受这个链接的启发,给出了一个如何实现标准 Hogwild 的例子!PyTorch 中的算法。

首先,我们用卷积层实现了一个简单的图像分类模型。该模型返回在训练期间使用 NLLLoss 时有用的 LogSoftmax。

**class** Model(nn.Module):
    **def** __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(500, 10)
        self.fc2 = nn.Linear(10, 10)

    **def** forward(self, x, **kwargs):
        batch_size = x.shape[0]
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(batch_size, -1)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        x = F.log_softmax(x, dim=1)
        **return** x

此外,我们定义了一个训练函数,它以一个模型和一个数据加载器作为输入参数。在这个函数中,使用了 Adam 优化器和前面提到的 NLLLoss。这个培训功能是 PyTorch 程序的标准实现。参与 Hogwild 的每个流程!会同时叫它。

**def** train(model, data_loader):
    optimizer = optim.Adam(model.parameters())
    criterion = nn.NLLLoss()

    **for** data, labels **in** tqdm.tqdm(data_loader):
        optimizer.zero_grad()
        loss = criterion(model(data), labels)
        loss.backward()        
        optimizer.step()

并行设置发生在下一个代码部分。在这里,我们定义了并行进程的数量,实例化了模型,并通过一个方法调用 share_memory 将其推送到共享内存中。使用的数据集是 CIFAR10 数据集,可在 torchvision 包中获得。

我们对流程进行循环,并为每个流程定义一个数据加载器。数据加载器拥有一个分布式采样器,它知道进程的等级并处理数据的分布。因此,每个进程都有自己的数据分区。多重处理包调用每个进程内的训练函数并等待,用加入命令,等待进程结束。

**import** torch.multiprocessing **as** mpnum_processes = 4
model = Model()
model.share_memory()

dataset = CIFAR10(
            **"data"**,
            train=**True**,
            download=**True**,
            transform=transforms.Compose([
                transforms.ToTensor(),
                transforms.Normalize(
                    mean=[0.485, 0.456, 0.406],
                    std=[0.229, 0.224, 0.225]
                )
            ])
        )processes = []
**for** rank **in** range(num_processes):
    data_loader = DataLoader(
        dataset=dataset,
        sampler=DistributedSampler(
            dataset=dataset,
            num_replicas=num_processes,
            rank=rank
        ),
        batch_size=32
    )
    p = mp.Process(target=train, args=(model, data_loader))
    p.start()
    processes.append(p)
**for** p **in** processes:
    p.join()

在训练期间,所有的进程都可以访问共享模型,但是只在它们自己的数据分区上训练。因此,我们将训练时间减少了大约 4,这是总训练过程的数量。

完整的代码可以在我的 GitHub 库中找到。

结论

分配机器学习的训练变得更加重要。尤其是随着训练数据和数据复杂度的增加。总的来说,分布式训练节省了大量时间,并且还可以使用智能分配技术来减少消耗的能量。代码示例显示,使用 PyTorch 应用并行机器学习训练非常容易。

资源

猪猡!:https://papers . nips . cc/paper/4390-hog wild-a-lock-free-approach-to-parallelism-random-gradient-descent . pdf

http://www.stat.ucdavis.edu/~chohsieh/wildSGD.pdf

如果我有自己的时间,我会这样学习数据科学

原文:https://towardsdatascience.com/this-is-how-i-will-learn-data-science-if-i-got-back-my-own-time-e9148c909ce9?source=collection_archive---------69-----------------------

感觉不知所措和筋疲力尽让我在释放数据科学技能方面表现不佳。这是我在过去两年开始数据科学之旅时得到的信息。

Jef Willemyns 在 Unsplash 拍摄的照片

简介

数据科学是一个快速发展的领域,我是说真的。感谢计算的力量,海量的数据,揭示数据中模式的算法,以及互联网上的轻松社区,这些给了我们很多学习数据科学和机器学习的学习资源。这个领域也被归类为一个多学科领域,你应该知道编程,统计,以及你遇到的领域知识(如生物学,经济学,城市规划等。).甚至哈佛都说这个领域是 21 世纪最性感的工作,因为数据对公司和人们的影响。

快速成长意味着你要学很多东西,但是你要学多少呢?从在线课程中进行机器学习就够了吗?或者我也应该读研究论文?这些步骤很好,但没那么有用。让我给你讲讲我在过去两年学习这个领域的故事。

故事

当我的学长邀请我和他以及他的朋友一起参加数据科学竞赛时,我开始接触数据科学。没有进一步,我说是的,但我第一次做这个项目,我不知道我做了什么。我只是太盲目了,当时只是说是,但没有完全理解。虽然我不是很懂,但至少我懂数据科学本身的工作流程。简而言之,我们在比赛中获得了第三名,这是我在校园生活中的第一个成就。

在我赢得那些课程后,我变得渴望学习更多关于数据科学的知识,买了很多课程(说真的,不要买太多!),参加研讨会,观看 MOOCs,还阅读 Twitter 以扩展我在该领域的知识。做这些事情改变了我对数据科学如何影响我们社会的看法,我从中获得了很多见解,但有一个大问题。我一个单项都做不了!

Jef Willemyns 在 Unsplash 拍摄的照片

我感到很沮丧,也不知所措,因为大量的学习资源出现在我面前,但我不觉得我能做这些事情。突然,我停止参加任何比赛,休息了一小会儿。在那次中断之后,我回来参加比赛,与我的朋友一起参加另一场数据科学比赛。那段时间,我不想学任何东西,相反,我只是专注于我将要做的工作流程。如果我发现自己成了一个障碍,我会试着利用互联网寻找答案。你猜怎么着突然间,我的技能提高了很多,而不是通过互联网上的许多课程来学习。正因为如此,我的团队进入了半决赛,但遗憾的是,由于冠状病毒,比赛被推迟了。没关系,至少在那之后我的技术有了进一步的提高,我也因此获得了自信。

从那次经历中,我总结了一些东西,可以给那些想学习数据科学的人一些建议,

学习基本面!

如果你想开始你的数据科学之旅,这很重要。你必须学习统计学、程序设计和用于实施这一过程的基本工具。不要学太多,否则你会精疲力尽,也会因为大量的资源而不知所措。

阅读!

无论是论文、文章、书籍,甚至是来自专家的推文。我建议使用 Twitter 来增强你的知识,并深入了解现在发生的事情,说真的,Twitter 让我对数据科学和人工智能有了更多的了解。

做一些项目!

通过做项目,你会提高你的技能很多。我的意思是,你将根据你的项目学习一套新的技能。这样做,会让它粘在你的脑袋上,而不是让你去上一门关于那个技能的课程,但是没有一个有意义的东西可以使用。

结论

我老实告诉你,学习数据科学和机器学习并不容易。但是,如果你想学习它,就有效地学习它!只要学习基础知识,然后做一些项目,相信我,你的技能会比以前提高很多。如果你在你的时间里增加一些阅读,这将增加你的洞察力,并驱使它们进入一个让你兴奋的项目。学习曲线会很陡,会有起伏,但如果你成功了,你会感到自豪,会更加欣赏自己。

这就是如何训练更好的变形金刚模型

原文:https://towardsdatascience.com/this-is-how-to-train-better-transformer-models-d54191299978?source=collection_archive---------11-----------------------

大规模训练,然后压缩

如何训练更快、更高性能的变压器

Samule 孙Unsplash 上的照片

F 两年多以来,在大型文本语料库上训练的 transformer 模型是所有自然语言处理中最先进的。研究人员和从业者继续通过发明更好的架构或在更多数据上训练更大的模型来拓展边界。事实上,在其他条件相同的情况下,很少有人会不同意在更多数据上训练更大的模型可以提高性能。但是如果时间或资源有限呢?

普遍的看法是接受精度的打击,训练更小的模型。更小的模型不仅训练和推理更快,而且更便宜,对吗?

伯克利人工智能研究所(BAIR)最近的研究表明情况并非如此。较大的模型训练速度更快,可以更有效地压缩,从而减少推理时间。因此,作者得出结论认为

“资源受限训练的最佳策略是训练大型模型,然后大量压缩它们”

与通常的实践相反,在资源约束设置中,训练大型模型是最佳的[ 来源

体型越大,训练速度越快

作者用以下模型进行了实验:

  • 用于自我监督语言建模的 RoBERTa 模型的版本;和
  • 用于机器翻译的标准变压器型号。

在每个实验中,作者根据模型的深度(2-24 层)和宽度(隐藏尺寸 128-2024)来改变模型的尺寸。

更深的模型更快实现更好的性能[ 来源

主要结果是较大的模型:

1 样本效率更高:在更少的梯度步骤后,它们获得了更好的结果(在语言建模任务上更低的复杂度,在翻译任务上更高的 BLEU 分数)

即使调整挂钟时间后,较大型号的训练速度更快。也就是说,训练时间的减少远远抵消了模型规模增加带来的计算开销的增加。

更宽的型号实现更好的性能更快[ 来源

较大的模型压缩得更好

更大的模型不仅训练更快,预测也更快。这是因为它们更具可压缩性,因此您可以将它们调整到与小模型相同的推理成本,同时实现更高的准确性。

为了得到这个结果,作者以两种方式压缩他们的模型:

  • 量化:它们以不同的精度格式(低至 4 位)存储参数,以节省计算时间和内存空间;和
  • 修剪:它们迭代地将 15%的最低幅度参数清零,然后再次微调,以减少操作次数和内存占用(因为权重矩阵现在很稀疏)。

作者发现:

1 对于这两种压缩方法,较大的型号提供了更好的精度-效率权衡:压缩时精度下降低于较小的型号;和

2 两种压缩方法都可以在很少附加 计算 开销的情况下进行。

较大的模型通常在任何压缩级别都能获得更好的精度[ 来源

我们何时以及为什么会取得这些成果?

虽然有大量的文献说明为什么更大的模型获得更高的测试精度,但很少有人研究它们是否以及为什么收敛得更快。作者对为什么会出现这种情况给出了一些解释:

1 这些结果适用于大型数据集(在这种情况下,过拟合问题不大)。根据经验,模型越大,减少训练误差的速度越快。由于对于大型数据集,泛化差距(训练和测试误差之间的差异)不是一个问题,因此较大的模型也可以更快地减少测试误差。作者指出

“MLM 任务中的挑战不是过度拟合,而是拟合数据——即使 80 亿个参数模型也不会过度拟合大型预训练语料库”

当将训练数据集减少到其原始大小的 1%或 5%时,作者发现训练大模型的好处消失了。

2 较大的型号使用计算的效率更高。在训练大型模型完成掩蔽语言建模等任务时,瓶颈不是计算,而是内存&存储。因此,较大的模型更有效地利用可用的计算。

3 较大的型号获得较小的压缩误差。作者表明,对于大模型,量化&修剪产生的参数比小模型更接近原始(未修剪)模型的参数。

这有什么关系?

这篇论文构成了一个潜在的范式转变,在资源约束下如何训练模型。这具有明显的经济效益:花在训练模型上的时间和金钱更少,同时实现更高的性能。

应该注意的是,在上述所有实验中,作者除了选择模型深度和宽度之外,没有进行任何超参数优化。然而,在现实世界的设置中,好的超参数是未知的,因此花费了大量的时间和资源来寻找最佳设置。

这篇论文的发现之所以重要还有另一个原因。搜索好的超参数,或者只是简单地训练最终模型,可能需要许多 GPU 小时,因此可能会有大量的碳足迹。通过减少训练一定精度的模型所需的时间,减少排放是可能的。如果你有兴趣了解更多关于你的碳足迹的信息,请查看 Mila 实验室的 ML CO₂计算器工具。

[1]:李,Eric Wallace,,,Kurt Keutzer,Dan Klein 和 Joseph E. Gonzalez,大规模训练,然后压缩:重新考虑模型大小以实现变形金刚的高效训练和推理 (2020)。

2: Alexandre Lacoste,Alexandra Luccioni,Victor Schmidt 和 Thomas Dandres,量化机器学习的碳排放 (2019),NeurIPS 2019 的气候变化 AI 工作坊

这就是数据科学家的样子

原文:https://towardsdatascience.com/this-is-what-a-data-scientist-looks-like-aefa5c658d54?source=collection_archive---------39-----------------------

数据科学家:他们是谁?他们知道什么?他们知道事情吗?让我们来了解一下!

Unsplash 上拍摄的 ThisisEngineering RAEng

早在 2012 年,哈佛商业评论提出数据科学家是 21 世纪的 最性感的工作。从那以后,炒作越来越多。但是一个数据科学家的背景是什么?如果你正在寻找一份数据科学家的工作,你可能会遇到这样的招聘信息:从统计学博士到拥有多年软件工程工具经验。所以我想知道,数据科学家的教育背景是什么,与一般的开发人员有什么不同?

开发者世界仍然是一个男性主导的行业。作为一名从事技术工作并有计算机科学背景的女性,在之前的工作中,我是一个大约 15 人的团队中唯一的女性软件工程师。因此,除了教育背景之外,我很想知道数据科学家是否比其他类型的开发人员在该领域的女性代表性方面做得更好。

最后说钱的问题。围绕数据科学家的所有言论会转化为银行里更多的美元吗?数据科学家的工资真的比其他开发人员高吗?数据科学家的高工资与什么相关?

为了回答所有这些问题,我对 2019 年的堆栈溢出开发者调查进行了数据分析。数据集在此公开

让我们看看我们发现了什么!

数据科学家的教育背景如何,与一般的开发人员有何不同?

我们想知道数据科学家完成的最高教育水平是什么,以及来自计算机科学和软件工程以外背景的数据科学家是否比一般开发人员多。

与其他开发人员相比,是否有更多的数据科学家拥有高于学士学位(硕士或博士)的学位?

数据科学家相对于一般开发人员的最高教育水平

在这里,我们看到了数据科学家和一般开发人员之间的明显区别。大约 60%的数据科学家获得了硕士或博士学位,而在所有开发人员中,这一比例约为 30%。

非 CS 背景的数据科学家比其他开发者多吗?

数据科学家与一般开发人员的本科专业

同样,我们可以看到数据科学家和其他开发人员之间的差异,这是意料之中的。不到一半的专业数据科学家完成了计算机科学相关的专业,相比之下,所有开发人员中有 61%完成了该专业。大约 14%的数据科学家学过数学,13%学过自然科学,而开发人员的相应比例一般约为 4.5%。

数据科学家和任何角色的开发人员在他们参加过的非学位教育类型上有什么不同吗?

其他类型的教育(在线课程、训练营等..)对比

一般来说,数据科学家和开发人员之间没有太大的区别。超过五分之四的专业开发人员和数据科学家已经自学了一种新的语言、框架或工具,这是这两个群体最受欢迎的其他教育类型的选择。至于第二个最受欢迎的选择,我们注意到一个小差异,70%的数据科学家参加了在线课程,相比之下,57%的开发人员参加了在线课程。

数据科学家的性别差距比其他角色小吗?

认同的性别受访者百分比

我们清楚地看到,男性明显多于女性,所有开发人员和数据科学家之间的差异非常小。参与调查的男性专业开发人员总数为 58387 人,而女性专业开发人员为 4669 人。在所有专业开发人员中,只有 8%8%和 8.3%的数据科学家是女性。因此,为了更好地了解男性和女性在不同开发人员角色中的表现,我们将按开发人员角色对数据进行分组。

不同开发人员角色的男女比例

该图显示了不同开发人员角色的男女比例。蓝线显示的是平均值,比率为 12.5,意味着在所有开发人员职位中,男性比女性多 12.5 倍

虽然最初,我们无法看出数据科学家中的性别差距是否比开发人员中的性别差距更小,但当我们按角色划分时,我们看到女性数据科学家与男性数据科学家的比例为 1:12,这是最好的比例之一,前端开发人员(11.8)和数据分析师(12.7)。另一方面,图表显示,在某些角色中,性别差距变得更大:开发运维专家的比例最差(32.1),其次是系统管理员(29.7)和站点可靠性工程师(28.4)。

结果显示,的数据科学家和前端开发人员的女性员工比例最高,其次是数据分析师。尽管这一比例与其他开发者相比被认为是不错的,如 DevOps 专家,他们中男性的比例是女性的 32 倍要想缩小行业中的性别差距,还有很长的路要走。

如果不赚钱,那就没有意义。

现在是时候深入研究数据集中最有趣的数据部分了,看看数据科学家的工资是否真的比其他开发人员高,以及与高工资有什么关系。我们想回答的问题有:

  • 数据科学家的薪酬是否比同等经验的其他角色高?
  • 教育水平和工资有什么关系?博士工资高吗?
  • 与其他教育背景相比,软件工程背景是否会导致数据科学家的工资更高?
  • 哪种职位组合的薪酬更高?什么规模的公司给数据科学家的报酬更高?

工资分配

数据科学家的薪酬分配

在我们开始之前,我们看了一下工资的分布情况,这是非常不正常的。薪金,计算为使用 2019 年 2 月 1 日的汇率转换为美元年薪的薪金,假设 12 个工作月和 50 个工作周有几个极高的值,使分布向右倾斜,因此我选择忽略阈值以上的值。由于数据不是正态分布的,我们将在分析中使用中位数而不是工资的平均值,因为它更具代表性。

剔除异常值后数据科学家的薪酬分配

数据科学家的报酬比其他开发人员高吗?

TL;是的博士。

按开发人员角色划分的平均工资与平均专业经验的比例

所有类型的开发人员的年薪中值为 5.85 万美元,数据科学家的年薪中值为 6.6 万美元。对于所有开发人员来说,他们在专业编码方面的经验越多,薪水越高。然而,某些类型的开发人员在相同的经验水平下会比其他角色获得更高的报酬。

上图显示,数据科学家是收入最高的角色之一,另外还有数据工程师、开发运维专家和站点可靠性工程师。在 x 轴上,我们有专业编码经验的平均年数,在 y 轴上是以美元为单位的全球年薪中值,而气泡的大小对应于每个角色的受访者数量。请注意,我选择只分析整个行业中可用的开发人员角色的子集,尽管数据集中有更多的开发人员角色,如高管或教育工作者。

特别有趣的是在平均职业经验最少的开发人员中,数据科学家是薪酬最高的角色

这促使我们更深入地研究数据,看看不同职位不同工作年限的薪酬趋势。

按开发人员角色划分的每个专业经验级别的工资中位数

分析不同年专业编码经验的薪酬趋势,我们可以看到数据科学家是所有经验级别中薪酬第二高的角色 ,仅次于站点可靠性工程师,其次是数据工程师和开发运维专家。

数据科学家的高薪与什么相关?

特别是,我们试图了解以下特征如何与专业数据科学家的高薪相关联:

  • 教育水平
  • 本科专业
  • 公司规模
  • 角色头衔的组合
  • 将编程作为一种爱好
  • 为开源项目做贡献

为了做到这一点,我们使用了线性回归模型,并获得了系数最高的前 20 个特征。

与数据科学家薪酬相关的 20 大特征

与高工资关联最大的特征是居住国家。毫不奇怪,美国、瑞士、以色列、丹麦、加拿大、澳大利亚、德国和英国都在支付最高的国家之列。其他居住国,如俄罗斯和印度,与薪水呈负相关。

就学历而言,一个博士学位(博士,Ed。d 等。)以及数据科学家的高薪。

然而,当一个数据科学家的头衔与一个学术研究员的头衔结合在一起时,我们观察到了工资的负相关性。

所以,博士确实工资高一些……只要你完成!

公司的规模似乎也对薪水有影响。为拥有超过一万名员工的组织工作或作为自由职业者与薪水呈正相关。

所以,要么做大…要么回家!

最后,对于数据科学家来说,本科专业不是薪酬的最大关联之一,编码作为一种爱好或为开源项目做贡献的频率也不是。

结论

总结分析的关键要点:

与其他开发人员角色相比,数据科学家拥有不同的教育背景。

  • 60%的数据科学家完成了硕士或博士学位,相比之下,一般开发人员中只有 30%完成了硕士或博士学位。
  • 48%的数据科学家完成了 CS 相关的学位,相比之下,一般开发人员的这一比例为 61%。

数据科学家是性别最平衡的开发人员角色之一,但还有很长的路要走。

  • 在所有的开发者角色中,都存在着巨大的性别差距。然而,数据科学家和前端开发人员的男女比例最好,为 1 比 12,几乎是 DevOps 专家的 3 倍。

数据科学家的薪酬高于其他开发人员角色。

  • 从绝对值来看,数据科学家的全球平均年薪为 6.6 万美元,而所有开发人员的平均年薪为 5.85 万美元。总体而言,数据科学家是收入最高的职位之一,仅次于 SREs、DevOps 和数据工程师。
  • 在平均职业经验最少的开发人员中,数据科学家的工资最高。在所有不同的经验级别中,数据科学家也是薪酬第二高的角色

薪资相关性

  • 与薪水最相关的特征是居住的国家,美国、瑞士、英国、加拿大、澳大利亚等国家与薪水呈正相关
  • 薪水与拥有博士学位、为员工超过 1 万人的公司工作或成为自由职业者之间存在正相关关系。
  • 当数据科学家的角色与学术研究人员的角色相结合时,就会出现负相关。

感谢您的阅读!

随时联系 Linkedin 或查看Github*上的代码。*

注:该分析是作为 Udacity 的数据科学纳米学位项目 的一部分进行的。

这就是机器学习模型的样子

原文:https://towardsdatascience.com/this-is-what-a-machine-learning-model-looks-like-613f4ec89abf?source=collection_archive---------55-----------------------

可视化机器学习如何做出决策和预测。

机器学习算法如何理解变量之间的复杂关系,即使是领域专家有时也不能完全理解?在我的文章机器学习和真实状态中,我从阿姆斯特丹的真实状态列表中收集了数据,以了解在这个(非常昂贵的)城市租金价格是如何确定的。

在所有的转换之后,我的数据集最终达到了惊人的 327 列和将近 4000 行。对于一个人来说,查看所有这些数据并试图理解真实的国有市场正在发生什么几乎是不可能的。但是对于机器学习模型来说,它只需要三分钟来训练自己,测试它的假设,并告诉我它在 10 倍于的情况下做得有多好。

对于初学者来说,理解随机森林算法如何做出决策的细节是非常技术性的。它怎么知道增加一个 sq。一套特定街区的公寓,有一定数量的卧室,可以在你的月租金上增加 x 欧元?更令人印象深刻的是,它如何能以 98%的准确率估算出整个城市中各具特色的每套公寓的租金价格?所有这一切,在三分钟之内??

为了更容易理解模型是如何工作的,我们可以将模型的决策树形象化:它对数据做出的决策的集合,基于它们在模型中的测试方式。这是我在最初的文章中包含的数字:

这只能说明我们的模型可能工作得非常努力。但是除此之外就没那么有用了。让我们更仔细地看看这个决策树:

如果我们走到树的绝对顶端,我们可以看到一切开始的地方。该模型在数据中随机选取了一个点,在这种情况下,公寓的面积小于或等于 156 平方米,这是它的第一次分割。缩小我们可以看到这是树的“母亲”分裂:

让我们仔细看看树的以下部分(分支):

在这里,我们开始分割公寓,如果它们被真实的国家机构 Vesteda Noord West 列出(因为它是一个二元变量,如果它小于 0.5,就意味着它是 0,大于 0.5,就意味着它是 1)。在右边部分,我们有没有被该机构列为的公寓,在左边部分,我们有那些被列为的公寓。如果你感到困惑,不要担心:把它想象成模型在问一个问题,如果答案是数据点将会向右,如果答案是数据点将会向左。在这里,我们提出了一个负面的问题:这个公寓不是这个机构列出的吗?

让我们看看那家中介列出的公寓(在左边)。如果公寓的纬度小于或大于 52.4,我们进一步分割公寓,如果它们不小于 52.4(左图),我们按照它们小于 4.9 的经度分割,如果它们不小于 4.9(左图),我们最终只有两个样本,估计误差为零,租金估计为每月 2300 英镑。

对于每一个其他的分裂,我们可以做同样的练习。终点(模型不会进一步分割自己的地方)包含公寓价格的模型估计,也称为模型的

希望这有助于你理解机器学习的迷人力量。感谢您的阅读!

这是数据科学家在 2020 年经历的事情

原文:https://towardsdatascience.com/this-is-what-data-scientists-are-undergoing-in-2020-cb137ddfc6dc?source=collection_archive---------74-----------------------

在当前情况下,对数据科学职位有什么期望。

卢卡斯·布拉塞克在 Unsplash 上的照片

根据《哈佛商业评论》, 2012 年,数据科学家的职位被认为是 21 世纪最性感的工作。此外,美国劳工统计局的一份报告显示,预计到 2026 年,数据科学需求的增长将创造约 1150 万个工作岗位。既然世界正在经历恐慌和不确定时期,在经济萎缩和市场混乱的情况下,检验这些预言的可靠性是值得的?

今天的数据科学家类似于 20 世纪 80 年代和 90 年代华尔街的定量分析师。

谈到人才招聘,我总是喜欢提到 LinkedIn,因为该平台最近见证了求职者和招聘者流量的迅速增长。请记住,LinkedIn 是最早将数据科学融入实践的企业之一。现在,让我们来谈谈数据,根据 LinkedIn 的数据,从 3 月 27 日开始,数据科学的招聘数量有所下降。这是一个标志着危机达到企业层面的时期。

资料来源:伯奇工厂

如下图所示,数据科学职位发布在其他平台上有所减少,如 indeed 以及。

资料来源:伯奇工厂

话虽如此,大数据和数据科学人才招聘机构 Burtch Works 与国际分析研究所(International Institute of Analytics)之间的一项合作调查显示,从 3 月到 4 月,一个月的时间框架内,企业是如何应对危机的。乍一看,我们可以看到新冠肺炎对人员配备和招聘的影响在短短一个月内增加了一倍多,这表明如果美国的封锁限制仍然不放松,将会产生长期影响。

资料来源:伯奇工厂

好消息是,大多数受影响的组织都实施了减薪政策。尽管裁员、休假、冻结招聘和减少工作时间仍然是受影响机构的选择,但数据科学家仍有可能至少享受他们的分析职位,与其他替代方案相比,这是最好的情况。

资料来源:伯奇工厂

此外,揭示当前危机对大学毕业生的影响也非常重要。Burtch Works 再次设法接触到即将开始数据科学职业生涯的美国大学教授和学生。不幸的是,这些数字相当令人震惊。

我们可以看到,新冠肺炎严重侵蚀了数据科学职位和应届毕业生的就业机会。绝大多数学生报告说受到了影响,从开始日期延迟到工作机会被取消,只有微不足道的 10%的学生没有受到影响。

资料来源:伯奇工厂

Burtch Works 的定量招聘专家琳达·伯奇(Linda Burtch)联系了北卡罗来纳州立大学(North Carolina State University)的高级分析主任迈克尔·拉帕(Michael Rappa),后者是一个世界级的项目,他能够分享该项目关于新冠肺炎效应对其毕业生的一些数据。

数据中最引人注目的数字是,2019 年和 2020 年,每个学生的工作机会分别从 2.5 个缩减到 2.1 个。

再次,Cappa 能够在 LinkedIn 上分享 2018 年至 2020 年危机对入门级职位空缺的影响。我们可以看到,数据科学家的平均职位空缺下降到不到 1000 个,这对新数据科学家来说是一个相当大的威胁。我们还必须认识到,如果实际情况保持不变,这一趋势还会进一步下跌。

虽然冠状病毒对大多数行业来说是一场灾难,但一些可以远程工作的 IT 企业,如网飞、Steam(游戏业务)和 Zoom,随着人们越来越依赖他们的服务,他们的利润正在飙升。例如,根据 Analytics Insights 的数据,Zoom 的科学家吹嘘他们的平均年薪为 111,000 美元。这是数据科学家的一线希望,我认为在这个前所未有的时代,数据科学家应该投资的最佳实践是磨练他们的技能,为最轻微的职位空缺做好准备。

经过七周的数据科学学习,我的随机森林模型

原文:https://towardsdatascience.com/this-is-what-seven-weeks-of-learning-data-science-looks-like-94c0c6666383?source=collection_archive---------38-----------------------

一步一步的演练我的改进二手车价格预测

马特·霍华德Unsplash 上拍照

"千里之行始于足下。"

在我记忆中的很长一段时间里,我想成为一名数据科学家,但从未付诸行动。七周前,我迈出了第一步,承诺在 52 周内每周学习和写关于数据科学的博客。在我的第一周,我建立了一个随机森林模型来预测二手车的价格(见这里)。这或多或少是我的准则…

import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn import preprocessing
df1 = pd.read_csv("../input/craigslist-carstrucks-data/craigslistVehicles.csv")*### Clean/Prep Data ###* 
df1 = df1[df1['price'] < 99999.00]
df1 = df1[df1['price'] > 999.99]

*# 2\. Removing any rows where year is blank or <1900*
df1 = df1[df1['year'] > 1900]
df1 = df1.dropna(axis=0, subset=['year'])

*# 3\. Removing any rows where manufacturer is blank*
df1 = df1.dropna(axis=0, subset=['manufacturer'])

*# 4\. Removing any rows where odometer is blank or < 999,999*
df1 = df1.dropna(axis=0, subset=['odometer'])
df1 = df1[df1['odometer'] < 899999.00]

*# 5\. Removing any rows with blanks*
df1 = df1.dropna(axis=0)*### Data Modelling ###*
y = df1.price
used_car_features = ['year', 'odometer', 'manufacturer', 'make', 'transmission','lat','long','fuel']
X = df1[used_car_features]

le = preprocessing.LabelEncoder()
X = X.apply(le.fit_transform)

train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=0)

used_car_model = RandomForestRegressor(random_state=1)
used_car_model.fit(train_X, train_y)

我的代码效率很低,我错过了很多步骤,而且它不是最好的模型——但它是一个开始!从那以后,我学习并撰写了各种数据科学主题,包括:

这个星期,我想重温 Kaggle 的二手车数据集来应用我的新知识,建立一个更好的随机森林模型!

我把我的项目分成三部分:

  1. 探索性数据分析
  2. 数据建模
  3. 特征重要性

探索性数据分析

了解我的数据

*# Importing Libraries and Data*
import numpy as np
import pandas as pd *# data processing, CSV file I/O (e.g. pd.read_csv)*
import os
for dirname, _, filenames **in** os.walk('/kaggle/input'):
    for filename **in** filenames:
        print(os.path.join(dirname, filename))

df = pd.read_csv("../input/craigslist-carstrucks-data/vehicles.csv")*# Get a quick glimpse of what I'm working with*
print(df.shape)
print(df.columns)
df.head()

在处理数据科学问题时,我总是做的第一件事是了解我正在处理的数据集。使用 df.shapedf.columnsdf.head() ,我能够看到我正在处理的特性以及每个特性需要什么。

探索分类数据

df.nunique(axis=0)

我喜欢用 df.nunique(axis=0) ,看看每个变量有多少个唯一值。利用这个,我可以看到是否有什么不寻常的事情,并找出任何潜在的问题。例如,如果它显示有 60 个州,这将引发一个红旗,因为只有 50 个州。

探索数字数据

df.describe().apply(lambda s: s.apply(lambda x: format(x, 'f')))

对于数字数据,我使用 df.describe() 来快速浏览我的数据。例如,我可以立即看出价格、的问题,因为最低价格是 0 美元,最高价格是 3,600,028,900 美元。

稍后,您将看到我是如何处理这些不切实际的异常值的。

包含太多空值的列

NA_val = df.isna().sum()

def na_filter(na, threshold = .4): *#only select variables that passees the threshold*
    col_pass = []
    for i **in** na.keys():
        if na[i]/df.shape[0]<threshold:
            col_pass.append(i)
    return col_pass

df_cleaned = df[na_filter(NA_val)]
df_cleaned.columns

在继续我的 EDA 的其余部分之前,我使用上面的代码删除了超过 40%的值为 null 的所有列。这使我剩下下面的专栏。

移除异常值

df_cleaned = df_cleaned[df_cleaned['price'].between(999.99, 250000)] *# Computing IQR*
Q1 = df_cleaned['price'].quantile(0.25)
Q3 = df_cleaned['price'].quantile(0.75)
IQR = Q3 - Q1

*# Filtering Values between Q1-1.5IQR and Q3+1.5IQR*
df_filtered = df_cleaned.query('(@Q1 - 1.5 * @IQR) <= price <= (@Q3 + 1.5 * @IQR)')
df_filtered.boxplot('price')

在使用四分位(IQR)方法移除价格的异常值之前,我决定将价格的范围设置为更现实的数字,这样标准差将被计算为比 9,575,025 更现实的数字。

IQR 也称为中间值,是一种统计离差的度量,可用于识别和移除异常值。IQR 范围规则的理论如下:

  1. 计算 IQR (=第三个四分位数-第一个四分位数)
  2. 找出范围的最小值(=第一个四分位数- 1.5 * IQR)
  3. 找出范围的最大值(=第三个四分位数+ 1.5 * IQR)
  4. 删除任何超出此范围的值。

你可以在上面的方框图中看到,我使用这种方法显著缩小了价格的范围。

df_filtered.describe().apply(lambda s: s.apply(lambda x: format(x, 'f')))

使用。describe() 同样,我们可以看到价格范围似乎比最初更现实,但年份和里程表似乎有点偏离(例如,2021 年的最大值)。

我使用下面的代码将年份范围设置为 1900–2020,将里程表设置为 0–271,341.5。

*# cant be newer than 2020*
df_filtered = df_filtered[df_filtered['year'].between(1900, 2020)]*# = 140000 + 1.5 * (140000-52379)*
df_filtered = df_filtered[df_filtered['odometer'].between(0, 271431.5)]

删除剩余的列

df_final = df_filtered.copy().drop(['id','url','region_url','image_url','region','description','model','state','paint_color'], axis=1) *#removing region since lat/long mean same thing*
df_final.shape

通过部分使用我的直觉,部分猜测和检查,我删除了以下几列:

  • urlidregion_urlimage_url: 它们与正在进行的分析完全无关
  • 描述:描述可能能够使用自然语言处理,但超出了这个项目的范围,被忽略
  • 地区,州:我去掉了这些,因为它们本质上传达的是和经纬度一样的信息。
  • model :我去掉了这个,因为有太多不同的值,无法将其转换为虚拟变量。此外,我不能使用标签编码,因为值是无序的。
  • paint_color :最后我在进行了特征重要性(稍后你会看到)后去掉了这个。由于特征重要性表明 paint_color 在确定价格中的重要性很小,所以我移除了它,模型的准确性提高了。

可视化变量和关系

import matplotlib.pylab as plt
import seaborn as sns

*# calculate correlation matrix*
corr = df_final.corr()*# plot the heatmap*
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))

清理完数据后,我想可视化我的数据,并更好地理解不同变量之间的关系。利用 sns.heatmap() ,我们可以看到价格正相关,里程表价格负相关——这个有道理!看来我们走对了路。

df_final['manufacturer'].value_counts().plot(kind='bar')df_cleaned['type'].value_counts().plot(kind='bar')

出于我自己的兴趣,我使用条形图绘制了一些分类属性(见下文)。为了更好地了解数据集,您还可以做更多的可视化工作,如散点图和箱线图,但我们将进入下一部分,数据建模!

数据建模

虚拟变量

df_final = pd.get_dummies(df_final, drop_first=True)
print(df_final.columns)

为了能够在我的随机森林模型中使用分类数据,我使用了 pd.get_dummies()。这实质上是将变量的每个唯一值转换成它自己的二进制变量。例如,如果制造商之一是本田,那么将创建一个名为“manufacturer_honda”的新虚拟变量,如果是本田,它将等于 1,否则等于 0。

缩放数据

from sklearn.preprocessing import StandardScaler
X_head = df_final.iloc[:, df_final.columns != 'price']

X = df_final.loc[:, df_final.columns != 'price']
y = df_final['price']
X = StandardScaler().fit_transform(X)

接下来,我使用标准缩放器缩放数据。Prasoon 提供了一个很好的答案在这里为什么我们要缩放(或标准化)我们的数据,但本质上,这样做是为了我们的自变量的缩放不会影响我们模型的组成。例如,的最大数字是 2020,里程表的最大数字超过 20 万。如果不把数据按比例放大,里程表的一个小变化会比的同样变化产生更大的影响。

创建模型

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error as mae

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=0)
model = RandomForestRegressor(random_state=1)
model.fit(X_train, y_train)
pred = model.predict(X_test)

我决定使用随机森林算法有几个原因:

  1. 很好地处理了高维度,因为它采用了数据子集。
  2. 它非常通用,只需要很少的预处理
  3. 避免过度拟合是很棒的,因为每个决策树都有低偏差
  4. 它允许您检查特性的重要性,您将在下一节看到!

检查模型的准确性

print(mae(y_test, pred))
print(df_final['price'].mean())model.score(X_test,y_test)

总的来说,我的模型在平均价格为 12600 美元左右的情况下实现了 1590 美元的 MAE,准确率为 90.5%!

MAE 和平均价格

模型的准确性

特征重要性

feat_importances = pd.Series(model.feature_importances_, index=X_head.columns)
feat_importances.nlargest(25).plot(kind='barh',figsize=(10,10))

我花了很多时间寻找特性重要性的最佳定义,Christoph Molnar 提供了最佳定义(见此处)。他说:

我们通过计算置换特征后模型预测误差的增加来衡量特征的重要性。如果打乱某个特征的值会增加模型误差,则该特征是“重要的”,因为在这种情况下,模型依赖于该特征进行预测。“如果改变某个特征的值而不改变模型误差,则该特征是“不重要的”,因为在这种情况下,模型在预测中忽略了该特征。”

鉴于此,我们可以看到决定价格的三个最重要的特征是年份、驱动(如果是前轮驱动的话)、里程表。特性重要性是向非技术人员合理化和解释你的模型的好方法。如果您需要降低维度,它对于特征选择也非常有用。

我的项目到此为止!我希望这能激励那些想进入数据科学的人真正开始。我还有很长的路要走,但我觉得到目前为止我已经取得了很大的进步。更多即将推出。

感谢阅读!

如果你喜欢我的工作,想支持我…

这就是为什么你应该忽略 IHME 的预测

原文:https://towardsdatascience.com/this-is-why-you-should-ignore-ihmes-forecasts-4634a4db0e85?source=collection_archive---------33-----------------------

IHME 在疫情走向的问题上误导了我们。看看你是否同意数据证明了这一点。

周五,IHME 健康指标和评估研究所发布了三个新的死亡预测。他们最有可能的情况是,到 1 月 1 日,美国将有 41 万人死于新冠肺炎病毒。这些预测已经被各大新闻媒体广泛报道(美国消费者新闻与商业频道NBCNPR今日美国圣荷西水星报等。).

只有一个问题。IHME 过去的预测误差高达百分之几百。在许多情况下,他们的预测实际上比根本没有预测还要糟糕,因为他们对疫情的走向产生了误导性的想法。

IHME 对 1 月份的预测也好不到哪里去。事实上,它们是如此的不切实际,以至于我怀疑它们是否真的基于科学,或者科学是否已经从属于其他议程。

在这篇文章中,我将提供关于 IHME 早期预测的不准确性的数据,并且我会给你更多的理由去忽略他们对一月份的预测。

数据:IHME 的国家预报记录

我领导着大约 20 个组织中的一个,这些组织向疾病预防控制中心提交死亡预测,用于疾病预防控制中心的集合模型,这是疾病预防控制中心记录的预测。IHME 和卡耐基梅隆大学、哥伦比亚大学、约翰霍普金斯大学、麻省理工学院、马萨诸塞大学阿默斯特分校、加州大学洛杉矶分校以及其他一些大学的团队也做出了贡献。

这是一家精英公司,而在这家精英公司中,IHME 的预测充其量看起来也只是平庸。

我最近完成了一份州级死亡预测的评估报告,该报告于 8 月 3 日提交给 CDC,涵盖了 8 月 2 日至 29 日期间的死亡预测。在此期间,IHME 的平均成绩为 C-;整体预测准确性明显低于领先群体。

图 1 显示了 IHME 各州在 8 月 3 日提交给 CDC 的第 1-4 周累积州级预测中的表现,即 8 月 2 日至 29 日期间的表现。

一个准确的预测模型几乎所有的点都在中间两条 25%的深色线之间。IHME 有一半以上的时间都没有达到这个目标。IHME 有一个季度的预测失误超过 100%。

图 1—8 月 2 日至 29 日期间 IHME 州死亡人数预测。

尽管这些成绩平平,但它们实际上比 IHME 之前的表现有了的进步。在 7 月的可比时期(7 月 5 日至 8 月 1 日),IHME 的四周州级死亡预测平均误差为 191%。如图 2 所示,IHME 在这一时期处于 CDC 预测组的下半部分,明显比最佳组差。

图 2 —预测模型对 7 月 5 日至 8 月 1 日期间各州死亡人数预测的表现。

正如 the 月份散点图所示(图 3),超过三分之一的预测至少有 2 倍的误差。无论是最高预测还是最低预测都没有显示在图表上,因为它们超出了图表上显示的 500%误差范围。

图 3—IHME 7 月 5 日至 8 月 1 日期间的州死亡率预测。

IHME 7 月份的预测非常糟糕——听着——如果你把他们 8 月份的预测应用到 7 月份的预测中,这些预测实际上比他们 7 月份的预测要好。图 4 显示了它的样子。

图 4—IHME 8 月份的预测适用于 7 月份。

当你对错误时期的预测比对正确时期的预测更准确时,是时候承认你不太擅长预测了。

更多数据:IHME 的国家预报记录

在国家层面,IHME 的预测与其他预测模型的比较如图 5 所示,图 5 显示了 7 月 5 日至 8 月 1 日的国家预测。目标是靠近中间的黑色 0%线。诚然,其他群体表现更差,但这并不意味着 IHME 的预测是准确的。IHME 的预测差了将近 50%,他们预测范围的上限比下限低了 25%。

图 5 —预测模型对 7 月 5 日至 8 月 1 日期间的全国预测。

对于刚刚结束的一周(截至 9 月 6 日的一周),IHME 的最新预测比大多数团体的预测都要差(图 6)。IHME 的预测在短短一周内错过了 20%;大多数其他预测组要准确得多。

图 6—8 月 31 日提交的截至 9 月 5 日的一周的国家预测。

这些都不是新的。从疫情开始,IHME 的预测就很糟糕。四月份,T2 对 IHME 95%预测区间的评估发现,根据预测,49%到 73%的实际死亡人数超出了预测区间。这个数字应该是 5%。正如《评论》所评论的那样,这比它应该达到的程度还要糟糕一个数量级。

IHME 一周的预测差了 20%。他们一个月的预测差了 50%。离明年 1 月还有 4 个月,他们的预测还会差多少?很容易想象它们有百分之一百或更多的不准确。

IHME 1 月份的预测背后是什么?

IHME 的预测如此糟糕的一个原因是他们的假设近乎荒谬。让我们来看看需要发生什么才能让 IHME 的 410,000 人死亡的预测成为现实。

首先,他们的预测要求美国在接下来的四个月里,比疫情开始以来的死亡人数还要多。在接下来的 115 天中的每一天,我们将不得不平均每天超过 1800 例死亡——这比我们迄今为止的死亡人数多了 100 天。

其次,过去六周的长期趋势需要立即逆转。每天的死亡率需要增加到上周的 225%,尽管事实上最近几周死亡率一直呈下降趋势大约每周 10%,而且事实上自 7 月中旬以来阳性测试也呈急剧下降趋势(图 7)。**

图 7

第三,对于 IHME 最有可能发生的情况,在接下来的四个月里,政府官员需要避免注意到死亡人数已经增加了一倍多,他们也不需要采取任何纠正措施。公共官员需要坚持不懈地忽视科学家的报告,忽视媒体上令人担忧的故事,忽视选举年来自另一个政党的批评,忽视选民越来越强烈的关于死亡率正在翻倍的抱怨。

你觉得这听起来合理吗?是不是听起来最有可能?当然不是。

这是不会发生的。

是什么让 IHME 认为它会成功呢?

科学是 IHME 唯一的考虑吗?

IHME 有能干的科学家。有能力的科学家真的能说服自己,在死亡率翻倍的情况下,整个国家将沉睡四个月,无所事事——在他们最有可能的场景中?

这种情况不太可能发生。甚至不仅仅是不太可能。几乎不可能

那么,为什么 IHME 的科学家会把这种情况描述为最有可能是**

我认为有两个问题。

首先,正如本文中的数据所显示的,他们真的不擅长预测。他们需要改进。

第二,我不认为他们真的相信他们(糟糕的)预测。他们不能真的相信到 1 月 1 日死亡人数会增加到 41 万,而政府官员却无所作为。相反,我相信他们是在用他们的预测来督促政府官员确保死亡人数不会上升到那个水平。如果这是真的,他们已经不再作为科学家发挥作用,而是开始作为一个政治行动团体发挥作用。

这是这个世界现在最不需要的。我们已经有相当一部分公众质疑科学或者干脆不相信它。事实上,这些人说得有道理。冠状病毒的大部分科学还没有“定论”。科学家有许多不同的理论和观点。仍然有许多“未知”或“部分已知”在这种情况下,让一群科学家打着科学的幌子提出他们的政治行动议程,从而进一步模糊这一问题是无益的。

IHME 需要发展与他们的预测受到的关注程度相称的预测技能。当他们这么做的时候,他们应该记住,如果我们希望人们对科学有任何信心,科学家需要保持科学,把政治留给政治家。

更多详情请访问新冠肺炎信息网站

我领导的团队将 CovidComplete 预测纳入疾病预防控制中心的集合模型。更多的预测和美国和州级数据,请查看我的新冠肺炎信息网站。

我的背景

在过去的 20 年里,我专注于理解软件开发的数据分析,包括质量、生产率和评估。我从处理噪音数据、坏数据、不确定性和预测中学到的技术都适用于新冠肺炎。

这可能会让你在美国的某些情况下开车时三思而行。

原文:https://towardsdatascience.com/this-might-make-you-think-twice-about-driving-in-certain-circumstances-in-the-u-s-9fc6d625c346?source=collection_archive---------64-----------------------

美国交通事故的探索性数据分析

让我们从事实开始

美国每年有超过 38,000 人死于交通事故。美国的交通死亡率是每 10 万居民中有 12.4 人死亡。另有 440 万人伤势严重,需要医疗救助。在美国,交通事故是 1-54 岁人群死亡的主要原因。

事故发生 。它们随时都可能发生,但是如果我告诉你它们在特定的时间更容易发生呢。当然,相关性并不意味着因果关系,但观察分布并推断其原因仍然很有趣。

为了分析美国的交通事故,我使用了来自 Kaggle 的数据集,其中包含全国范围内的车祸数据,涵盖了美国的 49 个州。事故数据是从 2016 年 2 月到 2019 年 12 月收集的,使用了几个数据提供商,包括两个提供流式交通事件数据的 API。大约有 300 万条记录和 49 个特征。

print('These features are:',df.columns.values)These features are: ['ID' 'Source' 'TMC' 'Severity' 'Start_Time' 'End_Time' 'Start_Lat'
 'Start_Lng' 'End_Lat' 'End_Lng' 'Distance(mi)' 'Description' 'Number'
 'Street' 'Side' 'City' 'County' 'State' 'Zipcode' 'Country' 'Timezone'
 'Airport_Code' 'Weather_Timestamp' 'Temperature(F)' 'Wind_Chill(F)'
 'Humidity(%)' 'Pressure(in)' 'Visibility(mi)' 'Wind_Direction'
 'Wind_Speed(mph)' 'Precipitation(in)' 'Weather_Condition' 'Amenity'
 'Bump' 'Crossing' 'Give_Way' 'Junction' 'No_Exit' 'Railway' 'Roundabout'
 'Station' 'Stop' 'Traffic_Calming' 'Traffic_Signal' 'Turning_Loop'
 'Sunrise_Sunset' 'Civil_Twilight' 'Nautical_Twilight'
 'Astronomical_Twilight']

df.describe()

df.describe(include=['object'])

通过调用描述我们的数据,我们可以告诉很多关于我们的数据框架。例如,大多数事故发生在加利福尼亚。天气状况大多是晴朗无风的白天。大多数事故发生在 I-5 N 公路上。平均降雨量非常少,事故发生地的平均能见度为 9 英里。

哪些州事故最多?

按严重程度分类的每个州的事故数量。

print('The top 10 States with the highest accidents are:',df['State'].value_counts()[0:10].index.values)The top 10 States with the highest accidents are: ['CA' 'TX' 'FL' 'SC' 'NC' 'NY' 'PA' 'MI' 'IL' 'GA']

到目前为止,加州的事故最多。

美国前 15 大城市的事故数量

虽然加州事故最多,但与美国所有其他城市相比,休斯顿是事故最多的城市。

大多数事故发生在什么时候?

一天中每小时的事故数量。

大多数事故发生在早上 7 点至 8 点,最少发生在晚上 11 点至凌晨 3 点。似乎最严重的事故整天都在发生。

过滤到前 4 个州的事故数量。

在加利福尼亚州,我们可以看到大多数事故实际上发生在下午 3-6 点左右,而在德克萨斯州和佛罗里达州,高峰是在一天的开始(大约 7-8 点)。

天气会影响事故的严重程度吗?

乍一看,很难判断天气是否与更严重的事故有关。更有意义的是,根据每种天气条件的严重程度来看事故的比例。

每种天气条件的严重程度比例。

可以理解的是,最严重的事故都与恶劣天气有关。

地理绘图

必须利用坐标!我在 python 上使用了 plotly 来生成这些地理地图。我能够通过标绘美国的县 FIPS 代码来做到这一点(关于这一点的更多信息可在下面获得)。

除了边缘的州,事故似乎很少发生。

南加州的事故最多。

在预测事故发生的地点时,什么特征最重要?

使用 XGBoost 运行模型,在不使用任何位置数据的情况下对事故的 FIPS 代码进行分类(即预测事故将在哪里发生)。

特征重要性如下所示。XGBoost 通过计算每个特征在模型中的所有增强回合(树)中被分割的次数,然后将结果可视化为条形图,其中特征根据它们出现的次数进行排序。

使用 XGBoost 的特性重要性

对事故区域进行分类的最重要的特征是气压、持续时间和温度

结论

在本帖中,我们回顾了美国的交通事故,我们发现:

  • 哪个州和城市的事故最多?
  • 事故发生的时间分布。大多数事故发生在工作前后(早上 6-8 点和下午 4-6 点)
  • 天气是否影响事故的严重程度。
  • 与事故发生地点相关的重要特征

希望你已经获得了一些洞察力!注意安全,尤其是如果你在南加州开车。

如果你想了解更多关于这个分析的内容,看看我的代码,然后看看我下面的 github repo:)

[## 迈克尔·拉曼/美国-事故

所有必需的包都在 requirements.txt 文件中,我在 Kaggle 上看到了这个数据集,它有很多…

github.com](https://github.com/michaelarman/US-Accidents)

参考

Moosavi、Sobhan、Mohammad Hossein Samavatian、Srinivasan Parthasarathy 和 Rajiv Ramnath。"一个全国性的交通事故数据集.", 2019.

Moosavi、Sobhan、Mohammad Hossein Samavatian、Srinivasan Parthasarathy、Radu Teodorescu 和 Rajiv Ramnath。"基于异质稀疏数据的事故风险预测:新数据集和见解."《第 27 届 ACM 地理信息系统进展 SIGSPATIAL 国际会议论文集》,ACM,2019。

[## 美国郡地图

正在收集 geopandas==0.3.0 正在下载…

plotly.com](https://plotly.com/python/county-choropleth/)

这个模型一点用都没有

原文:https://towardsdatascience.com/this-model-is-for-the-birds-6d55060d9074?source=collection_archive---------27-----------------------

用康奈尔大学的鸟类数据进行深度学习实验

计算机视觉在过去十年中取得了显著的进步,这主要是通过人工神经网络(俗称深度学习)的进步实现的。技术进步和更复杂的网络设计的结合已经导致神经网络在分类、对象检测和分割的问题上具有最先进的并且通常比人更好的准确性。

深度学习架构的传统基准通常是在相同的六个左右的图像数据集上进行的。这有一个明显的优点,即允许进行比较,但缺点是所有的基准模型都是针对同一个小问题集进行训练的,这就留下了这些基准的泛化能力如何的问题。除了作为必要的有限图像样本之外,所有的训练和验证图像都必须经过策划,并且可能不反映在真实世界中发现的图像种类。

我更喜欢去野外。字面上。如果你要学习一项新技术,而这是我第一个深度学习的项目,最好是找到一个有趣的应用。我想不出比物种探测更有趣的应用了。处理一类生物的图像有一些特殊的挑战。近年来,出现了一个流行的细粒度图像分类数据集集合,它专注于分类问题,需要检测细微差异才能正确识别图像。识别鸟类是一个很好的例子。确切的数量还有待讨论,但鸟类的数量大约在 10,000 种左右,其中近三分之二是雀形目鸟类(即鸣禽。)对于所有这些种类来说,它们的体型有着显著的一致性,一些种类的区别仅在于翅膀或头部的颜色略有不同。那是大草原麻雀还是夜莺麻雀?这并不总是容易分辨的。

Vesper Sparrow(康奈尔实验室的莱恩·沙恩/麦考莱文库 ML41643251 )和萨凡纳·斯派洛(康奈尔实验室的唐·布雷查/麦考莱文库 ML55502961 )。

毛茸茸的啄木鸟怎么样?如果不仔细观察鸟嘴,即使是经验丰富的观鸟者也会感到困惑。

绒毛啄木鸟(康奈尔实验室的埃文·利普顿/麦考利库 ML47227441 )和长毛啄木鸟(康奈尔实验室的内特·布朗/麦考利库 ML52739271 )

为了有助于精细视觉分类的研究,康奈尔鸟类学实验室发布了由 404 种鸟类的 48562 张图像组成的 NABirds 数据集。其中许多物种进一步细分为雄性/雌性、成年/幼年、繁殖/非繁殖等类别,总共有 555 类。我的目标是确定如何在这 555 个具有不同模型架构的类上获得最佳的预测精度。

数据在训练和验证之间大致平均分配(23,929 次训练和 24,633 次验证)。每节课的训练图像数量变化很大,大约四分之一的课有 60 张图像,一些稀有品种的图像数量为个位数(白翅黑眼灯芯草 4 张,雌丑小鸭 5 张)。)

培训示例的分发。

验证图像的分布类似于训练图像的分布。具有很少训练图像的类往往很少访问验证集。

图像大小也是相当可变的,这将是一个问题。超过一半的人的宽度为 1024,大多数人的高度在 600 到 900 之间(大多数人在 700 到 800 左右)。深度学习的小批量训练要求所有输入具有相同的维度。我将尝试不同的裁剪和大小调整策略。

每个图像还带有一个边框,覆盖图像中包含鸟的部分。每个图像有一只鸟,因此每个图像有一个盒子。作为本练习的一部分,我不会尝试预测边界框,但我会在训练和一些验证的预处理中使用它们

带边框的鸟图像。从纳伯德数据集。

型号选择

本文将重点介绍一些更简单的技术,用于在细粒度分类问题上获得良好的准确性。首先,也是最明显的,是图像分辨率。就其本质而言,细粒度分类问题依赖于检测细微的细节,如果图像分辨率降低太多,这些细节可能会丢失。我拍摄了三种图像分辨率大小,224x224,300x300 和 600x600。这些是 EfficientNetB0、EfficientNetB3 和 EfficientNet B7 的默认分辨率,这是我决定在实验中使用的三种模型架构。所有网络都在 ImageNet 上进行了预训练。

这是我考虑的第二个可变因素,模型大小。EfficientNet 是基于一种架构的一系列模型,但深度(层数)、宽度(每层的通道数)和输入分辨率统一缩放。原 EfficientNet 论文提出八个网络;出于时间的考虑,我只用了三种:小号、中号和大号。(在任何人问我为什么用 B3 而不是 B4 作为媒介之前,这是一个掷硬币的问题。)所有模型都在 ImageNet 上进行了预训练。

我探索的第三个参数是学习率。我不会假装已经对可能的学习率空间进行了彻底的搜索,如果这种事情是可能的话,但我认为我有一些合理的见解。坚持一个共同主题的一些变化,我从 1e-3 的学习率开始,每 4 个或每 8 个时期减少 0.94 倍。每 4 个时期丢弃一次是微调网络的标准过程;每 8 个丢弃一个是一种适应,以考虑更大的批量大小,从而通过使用 TPU 允许每个时期更少的步骤。

预处理训练数据

机器学习的基本思想是,通过一组代表性的训练数据和一个具有可调参数的模型,训练数据可用于找到一组参数,这些参数允许模型在给定一组新数据时做出准确的预测。在图像分类的情况下,“代表”这个词比较棘手。所有可能的图像的空间,即使是一个特定的主题,是如此之大,以至于几乎不可能考虑所有的可能性。还有实际的考虑。神经网络的任何输入都必须具有一定的分辨率,用于小批量训练的张量框架需要固定的输入分辨率,并且存储器方面的考虑限制了分辨率的精细程度。

好消息是这些限制仍然允许很大的灵活性。数据扩充可以人为地增加训练数据的大小。在数据集的情况下,像 NABirds,输入图像大小变化,调整大小和重新缩放算法现在是标准的。计算能力,尤其是 TPU 的计算能力,现在可以使用相对精细的分辨率作为输入。

还应该补充的是,当从高分辨率到低分辨率时,可以保留许多信息。在这些啄木鸟图像中,分辨率依次降低了两倍。这种鸟的性质,如果不是它的确切种类,在前四张照片中仍然很清楚。即使在图片五中,啄木鸟仍然是一个合理的猜测。只有在最低分辨率下,观众才会陷入猜测。

当然,这样做的一个原因是啄木鸟在前景中。如果这只鸟占据了图片的一小部分,可识别性会下降得更快。下面的 Parula 仅在前四幅图像中可见。

从纳伯德数据集

有许多预处理方案已经成为深度学习的标准。在切换到 EfficientNet 之前,我一直在使用 inception 架构,并坚持使用 Inception 预处理方案的变体。加载图像后,会进行随机裁剪。这种作物必须符合以下条件:

  • 它必须包含至少 50%的边界框。这是为了避免种植没有太多鸟类的作物。
  • 它必须包含至少 10%的总图像。
  • 它的长宽比必须在 4:3 和 3:4 之间。

然后调整裁剪的大小以适合输入尺寸,根据型号可以是 224x224、300x300 或 600x600。由于原始裁剪可能不是一个完美的正方形,这将导致一些挤压或拉伸失真,但仅足以在输入中引入一些变化。

下一个预处理阶段采用这个正方形并执行一系列随机的颜色调整,改变色调、亮度、饱和度和对比度。在很大程度上,这可以被视为针对不同的照明条件调整图像。图像也以 0.5 概率水平翻转。

前两个预处理阶段后的图像示例如下。

NABirds 数据集的原始数据

最后的预处理步骤是对 EfficientNet 的输入值进行标准化。

响应变量也经过预处理。作为对过度拟合的适度防御,我应用了标签平滑程序,如 InceptionV3 论文中所述。

预处理验证数据

图像分类模型的一个肮脏的小秘密是,它们的验证准确性非常依赖于如何选择验证集。我曾经有一个模型的验证准确性从 90%下降到 70%,仅仅是因为我忘记了更改输入分辨率。顺便说一下,这是这个项目的灵感。

在这个实验中,我选择了四个独立的验证预处理步骤。我考虑的主要方法是获取验证图像并重新缩放它们以适合训练图像的大小。这是评估验证集的标准方法,除了中心裁剪(我认为简单地删除图像的一部分没有好处),以及我决定用黑色边框填充,而不是挤压和拉伸图像以适应正方形输入。

其他三种策略及其基本原理如下:

  • 重新缩放边界框中的图像部分,以适合训练图像的大小。这种策略给我的图像更接近于训练集,但这是一种欺骗,因为它需要边界框的先验知识,这在现实世界的应用程序中很少出现。
  • 使用未经预处理的原始图像,只对输入进行归一化处理。在某些方面,这是理想的情况;传入任何图像,模型都会产生一个输出。由于图像大小不一,我只能使用批量大小为 1 的值,而且我只能这样做,因为验证集很小。
  • 使用边界框内的原始图像,除了归一化之外不进行任何预处理。作为自然学家的狂热用户,我知道在感兴趣的生物体周围裁剪图片通常是获得良好身份的最佳方式。正如我们将看到的,从图像中去除无关的细节,即使分辨率没有任何变化,也会对精度产生很大的影响。

以下是四种验证输入的示例(不按比例)。

NABirds 数据集的原始数据

模特培训

训练是使用谷歌 Colab 与 TPU 后端完成的。使用的标准小批量大小是 512 (64 * 8 个内核),尽管在图像大小或神经网络太大而无法将 512 个批量放入内存的情况下,我将它减少了两倍(即 256、128,甚至 64)。这通常发生在处理 600x600 图像和/或 EfficientNetB7 时。所有模型都被训练了 300 个纪元,尽管我认为较大的模型仍有改进的空间。优化器是带有默认参数的 Adam,损失函数是标准分类交叉熵。

标准验证数据结果

学习率每 4 个时期衰减的模型的验证结果。

学习率每 8 秒衰减一次的模型的验证结果。

结果的大致轨迹在意料之中。输入分辨率越高,模型越好。模型越大,模型做得越好。第一个有趣的结果是分辨率比模型大小更重要。从 224x224 增加到 300x300 通常价值约 6 个百分点的验证准确性,从 300x300 增加到 600x600 通常价值约 8 个百分点。这在所有的模型尺寸上是相当一致的。

相反,保持分辨率不变,但增加模型大小,只能增加 3-5 个百分点。这在所有输入分辨率中都是一致的。

我的理论是,学习速率衰减越慢(每 8 个周期而不是每 4 个周期)对更大的小批量工作越好,但这个理论是不正确的。较慢的衰减率总是导致精度稍低,通常约为 0.5%。

其他验证数据的结果

正如所料,裁剪对验证准确性有很大的影响。仅使用边界框中的输入,而不是使用完整的图像,但重新缩放以匹配训练输入,将获得高达 14%的准确性,通常至少为 9–10%。这种效果在 224x224 分辨率和较小的模型中最为明显,但即使对于较高的模型和分辨率也很明显。

全球平均池(亚历克西斯·库克

标准与边界框裁剪

为了理解为什么精度在裁剪后持续增加,考虑现代深度学习模型的最后几个阶段是有益的。最后一个阶段通常是全局平均池、可选的批量标准化和剔除层,以及最终的密集输出层。全局平均池层的输入是 HxWxD 张量(L 和 W 是高度和宽度,D 是通道数),输出是通过对所有通道进行平均计算得到的 D 长度向量。可以说,组成输入张量的每个 D 长度(HxW)向量是处理原始图像子集的卷积网络的最后一层。的确,这是物体检测的基本思想;对每个 D 长度向量运行分类模型,以确定是否存在对象。在这种情况下,每个 D 长度向量编码了每种鸟类出现在输入图像部分的可能性。如果一只鸟占据了图像的大部分,就像使用裁剪输入时一样,大部分 D 长度向量将对其进行编码,因此它们的平均值也将对其进行编码。如果鸟在图像的一小部分中,大多数 D 长度向量将是不确定的,并且在全局汇集之后的最终平均值将类似地被混淆。

标准与无预处理精度。

如果我不使用裁剪过的图像,而是使用没有调整大小或比例的原始图像,精度会下降,下降的量通常与上一个示例中上升的量相同。唯一的例外是在 600x600 分辨率上训练的模型。由于该分辨率最接近原始图像大小,因此在这种情况下,训练集和验证集最接近。与标准模型相比,精确度的提高可能是因为没有调整图像的大小以适应预定的输入。其他模型的精度下降可归因于上述相同的平均程序。

要考虑的最后一种情况是,边界框内的裁剪图像被提交给模型,但没有调整大小。在很大程度上,这比提交图像的标准方法更准确,但不如裁剪和调整大小。一个明显的例外是以最高分辨率训练的最大模型,其精度下降了两位数。我对为什么会发生这种情况的最佳猜测是,由于该模型是在高分辨率图像上训练和预训练的,因此边界框内的小图像使其混淆。即使模型是正确的,softmax 输出也很少具有高置信度。

结论

从这个实验中我们可以得出什么结论。显而易见的是,较大的模型比较小的模型更好,并且较高的图像分辨率比较低的分辨率更好。这两个结论都不令人惊讶,但图像分辨率比模型大小对精确度的影响更大这一事实值得注意。这意味着,如果智能地选择训练输入,在像 EfficientNetB0 这样的小模型上实现高精度是可能的。而如果能训练出小的精确模型,就可以投入生产。

更有意义的结论是,选择如何预处理验证输入很重要。理想情况下,验证输入应该与最终产品应用程序中预期的输入类型相匹配。培训和验证中需要批量输入可能是一个限制因素,但是尽可能接近生产输入应该是理想的。这可能会也可能不会告知如何选择训练数据。

进一步工作

上述结果仍有改进的余地。在撰写本文时,我正在用吵闹学生来代替 ImageNet 权重。到目前为止,这似乎让我的准确度提高了 1-2 %,更大的模型提高的幅度更大。

最初的 EfficientNet 模型使用自动增强来预处理训练输入。这表明我选择的初始风格预处理,虽然更容易实现,但可能并不理想。我目前正致力于将自动增强的一个实现和空白中的 RandAugment 翻译成 Tensorflow 2,这样我就可以很容易地将其插入到我的培训管道中。我期望精确度有适度的提高。

NABirds 带有边界框,到目前为止我只是间接地使用了它。显式边界框检测器将具有明显的价值。随着最近发布的 EfficientDet ,一个使用 EfficientNet 作为主干的对象检测架构家族,一个类似于这个的实验,但是评估检测和定位将是有价值的。

参考文献

[1]格兰特·范·霍恩、史蒂夫·布兰森、瑞安·法雷尔、斯科特·哈伯、杰西·巴里、帕诺斯·伊皮罗蒂斯、彼得罗·佩罗娜和塞尔日·贝-朗吉。与公民科学家一起构建鸟类识别应用程序和大规模数据集:细粒度数据集集合中的小字。在CVPR2015 年。

2谭明星和郭可乐。反思卷积神经网络的模型缩放。在 2019 年 ICML

[3] C.Szegedy,V.Vanhoucke,S.Ioffe,J.Shlens 和 Z.Wojna .重新思考计算机视觉的初始架构。 arXiv 预印本 arXiv:1512.00567 ,2015。

量子化学计算的深度学习

原文:https://towardsdatascience.com/this-post-introduces-fermi-net-which-uses-deep-learning-to-perform-quantum-chemical-calculations-801a85e7ffda?source=collection_archive---------27-----------------------

关于这篇文章和论文的摘要

这篇博文介绍了利用深度学习进行量子化学计算的费米网[1]及其物理背景。

这篇论文于 2019 年 5 月 27 日由大卫·普法乌等人提交给 arXiv。论文概述如下。

费米网是一种用于量子化学计算的神经网络。量子化学计算是通过能量最小化来优化波函数,但神经网络负责波函数的近似。它结合了许多物理约束,如 Hartree-Fock 近似、无限频率边界条件和反对称性,并且能量计算也是基于物理计算的。费米网对任何系统都给出了很好的结果,而我们必须用传统的量子化学计算来改变每个系统的方法。通常涉及计算分子的量子化学计算和涉及计算材料的从头计算非常昂贵,可能需要几天或几周的计算时间。但是,由于每个系统的最佳近似方法是不同的,并且需要迭代探索。费米网为所有系统提供了良好的结果,潜在地消除了这种迭代计算的需要。

关键洞察力

本文的三个主要观点如下。特别地,包括第二物理约束的想法在普通物理计算中是常见的(例如,恒定能量),并且在使用神经网络的研究中的类似概念可以在例如具有 ODE 积分器的哈密尔顿图网络中找到2

  1. 神经网络负责量子化学计算的波函数近似部分
  2. 许多物理约束,如波函数的反对称性、电子自旋和无限远的边界条件
  3. 预训练以匹配 Hartree-Fock 近似的波函数

物理背景(量子力学和量子化学计算)

如果要计算物质的物理性质(比如电子状态),就需要描述电子的状态。我们熟悉的运动方程无法描述电子等小物体的状态,所以我们需要用到一种叫做量子力学的东西。

由于钉扎和迈斯纳效应而漂浮在空中的磁铁。没有量子力学就无法解释这种现象。这张图片引自 https://commons.wikimedia.org/w/index.php?curid=2911413。

在量子力学中,电子的状态由一个复函数描述,即“波函数”。“波函数”粗略地说就是电子的轨道。下面这个方程,叫做薛定谔方程,是量子力学中的一个基本方程,表示波函数与能量的关系(哈密顿量,右边的 H-hat),其中ψ是波函数。

薛定谔方程。ψ是波函数。

在基于薛定谔方程(和各种近似)的凝聚态物理领域,称为“第一性原理计算”的物理模拟用于研究材料的电子状态。

从理论上讲,物质的电子状态是从“第一性原理”的立场出发,基于物质的原子序数和结构来模拟的。粗略地说,“第一原理”是“如果你有原子序数和关于结构(成键状态)的信息,你应该能够描述物质的电子状态,而不需要从实验结果中获得经验参数。”

然而,如果我们想要严格地计算一种材料的电子状态,我们需要计算材料中阿伏伽德罗(6x10)个电子的阿伏伽德罗数之间的相关性。由于这实际上是不可能的,我们在实践中使用各种近似法。其中之一是 Hartree-Fock 近似(使用 Slater 行列式的近似),它用于本文的预训练。

Hartree-Fock 近似考虑了电子的半对称性。因此,量子力学有时把作为波函数(粗略地说,电子的轨道)的矩阵表达来处理。改编自[1]。

模拟物质的方法是通过顺序计算找到结构中最稳定(能量最小)的电子态。为什么我们需要最小化能量的直观解释是,低能量是物质保持那种状态的最高概率。

物质和内能的概念图。由于能量较高的物质更不稳定,它们最终会稳定在能量最低或最稳定的物质上。物质的性质是通过顺序计算找到物质稳定存在的状态(在从头算/量子化学计算中,是电子的状态,或者波函数)来计算的。

具体来说,依次重复“计算物质的电子态和内能→然后更新电子态使能量降低”的程序,寻找能量最低的电子态。

类似的概念是量子化学计算,计算分子的电子状态。虽然从头计算主要涉及固体和表面状态,但量子化学计算主要涉及分子。本文将量子化学计算与神经网络相结合。

从头计算非常昂贵。简单的材料几分钟就能算出来,但这类材料一般不研究。通常最有希望的目标是复杂的材料和物质的表面状态。由于它们涉及计算包含许多原子的细胞,即使使用超级计算机,它们也可能需要几天到一周的时间。

问题表述

基本上,他们在量子化学计算方面做了同样的事情,但在这项研究中,他们将波函数的近似留给了神经网络。他们对神经网络所做的是一样的:最小化能量。在正常的量子化学计算中,我们将括号中的哈密顿量最小化如下。类似地,我们可以使用神经网络对波函数进行同样的最小化。

用波函数计算能量的方法。他们把波函数的近似留给参数为θ的神经网络。改编自论文[1]。

用波函数计算能量的方法。他们把波函数的近似留给参数为θ的神经网络。改编自论文[1]。

逼近波函数的神经网络

费米网的全貌如下。输出是几个原子核(位置 R)和电子(位置 R)的波函数ψ。典型特征是每个电子-全核相互作用和每个电子-电子相互作用以相应的(位置方式)方式传播。

费米网的全貌。输出是几个原子核(位置 R)和电子(位置 R)的波函数ψ。改编自论文[1]。

首先,让我们放大输入层和第一个中间层(下图)。输入层分为两部分:上部处理电子-原子核相互作用,下部处理电子-电子相互作用。

输入层和第一中间层的放大图。输入层分为两部分:上部处理电子-原子核相互作用,下部处理电子-电子相互作用。请注意,它们不是混合每个交互,而是将每个交互的元素传播到下一层,同时保持每个交互的元素完好无损。由这个博客作者绘制。

请注意,它们不是混合每个交互,而是将每个交互的元素传播到下一层,同时保持每个交互的元素完好无损。以这种方式,在构建ψ时,在神经网络中提取每个相互作用和其他相互作用之间的关系。此外,电子-原子核相互作用通过固定输入位置间接给出了关于电子自旋的网络信息。

接下来,让我们仔细看看中间层是如何处理的。下图是从中间层 l 传播到中间层 l+1 的过程。它主要分为两部分:第一部分取总和,第二部分决定中间层的组成。

从中间层 l 传播到中间层 l+1 的过程。它主要分为两部分:第一部分取总和,第二部分决定中间层的组成。请注意,它们不是混合每个交互,而是将每个交互的元素传播到下一层,同时保持每个交互的元素完好无损。[1]中图 1 的放大下侧。

请注意,在求和部分的前半部分,他们在为每次旋转做这个过程。在电子-核相互作用部分的上部,对每个自旋↑电子-核相互作用和自旋↓电子-核相互作用进行求和。在电子-电子相互作用的下部,对自旋↑电子-电子相互作用和自旋↓电子-电子相互作用进行求和。由于电子的性质因自旋而异,我们通过改变自旋来增加一个物理约束。

中间层的组成如下。下面的等式是电子 I 的中间层 l 的表示

中间层的内容。从左至右:自旋↓中电子-核相互作用中间表象的所有电子之和,自旋↓中电子-核相互作用中间表象的所有电子之和,自旋↓中电子 I 和电子-电子相互作用中间表象的电子之和,自旋↓中电子 I 和电子-电子相互作用中间表象的电子之和,电子 I 的中间表象.改编自[1]。

如上式所示,它们结合了每一次旋转的中间层的潜在表象之和,得到了中间层的表象。从左到右:自旋↑中电子-核相互作用中间表象的所有电子之和、自旋↓中电子-核相互作用中间表象的所有电子之和、电子 I 的中间表象和自旋↑中电子-电子相互作用的中间表象之和、电子 I 和自旋↓中电子-电子相互作用的中间表象之和、电子 I 的中间表象。

接下来,我们来看最后一层。最后一层看起来如下。在这里,他们增加了物理约束,即电子的波函数可以用行列式来表示,并且波函数在无穷远处趋于零。

费米网的最后一层。[1]中图 1 的放大右侧。

通过对在最终中间层中计算的电子 j 所属的波函数φI 添加线性变换来计算最终层,然后考虑与原子核 m 的各向异性,取衰变项的乘积。

最后一层的程序。w 和 g 是权重和偏差,π是控制各向异性衰减的 3x3(可学习)参数,α是自旋(↑或↓),k 是轨道的组合。指数的肩项施加了物理约束,当 r 趋于无穷大(无限远)时,波函数趋于零。改编自[1]。

此外,他们在波函数中增加了 Hartree-Fock 近似的约束,如下式所示。下图中名为“det φ”的部分表示取φ矩阵行列式的操作。虽然我没有深入细节,但这意味着他们添加了电子波函数的属性作为物理约束。被称为费米子的粒子,包括电子,对于电子的交换具有反对称的性质(电子交换时符号反转),这种性质有时用行列式来表示波函数。这里就不赘述了,如果你感兴趣,可以参考尼尔·w·默明等人的《固体物理学》等书。这里 k 是轨道组合的 ID。

Hartree-Fock 近似考虑了电子的半对称性。由于矩阵方程的性质,对于电子 X_i 和 X_j 的交换,符号是相反的。

其他创新

他们使用 KFAC 的修改版本,这是一个二阶优化方法,而不是一阶优化方法,如亚当。它显示了压倒性的趋同。

优化进展第一排原子,H2,LiH 和氢链与 KFAC(蓝色)对亚当(橙色)。KFAC 的质量优势是显而易见的。(注释和图表摘自[1])

此外,在主训练之前,进行预训练以预先学习波函数,使得它与固体物理中典型的近似方法 Hartree-Fock 近似相匹配。

使用 Hartree-Fock 近似进行预训练,以学习费米网络波函数φ,从而匹配 Hartree-Fock 近似的波函数φ^HF,以便它们在主训练期间不会陷入坏解。2 方程改编自[1]。

结果

这里是用费米网研究的结果。首先,下表显示了基态能量的结果。费米网做的相当不错。

第一排原子的基态能量、电离势和电子亲和力。最接近每个原子精确基态能量的 QMC 方法(费米网,传统的 VMC 或 DMC)以粗体显示。Be、N 和 Ne 的电子亲合势没有计算,因为它们的阴离子不稳定。(注释和图表摘自[1])

其结果与计算孤立分子的传统 CCSD(T)方法的结果相当。

双原子和小分子平衡几何的基态能量。费米网捕获的关联能量相对于精确能量(如果有的话)或 CCSD(T)的百分比在最右栏中给出。(标题和图表摘自[1])

接下来,他们计算了一个氮分子的离解曲线,这显然与 UCCSD(T)不太匹配,但费米网给出了与 ACPF 先生相同的精确度。

氮三键的离解曲线。与实验数据的差异在主面板中给出。在最大 UCCSD(T)误差的区域,费米网预测与高精度 r12- MR-ACPF 结果相当。(注释和图表摘自[1])

最后,这里有一个计算 H10 链的例子。底部是非常精确的 MRCI+Q+F12 CBS 的微分,不如 AFQMC CBS 精确,但费米网相当精确。

H10 链条。除了费米网之外的所有能量都来自 Motta 等人。绝对能量(插图)无法用肉眼区分。与高精度 MRCI+Q+F12 结果的差异显示在主面板中,其中阴影区域表示基础组外推误差的估计值。耦合团簇和常规 VMC 能量中的误差在中等原子间距时很大,但是费米网在所有间距下仍然与 AFQMC 相当。(标题和图表摘自[1])

这项研究的影响

现实情况是,第一性原理计算使用多种近似,即使他们说的是“第一性原理”,最佳近似方法取决于系统。此外,它可能包括任意参数,如 LDA+U。如果开发这种方法,我们可能能够开发一个与系统无关的通用电子结构模型。

结论

我介绍了费米网,用神经网络近似量子化学计算中的波函数。费米网的优点是,我们可以对任何类型的系统获得一致的好结果,而我们必须用传统的 QMC 方法改变每个目标的方法。

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

关于我

推特,我发布一句话的论文评论

https://twitter.com/AkiraTOSEI

每周/每月机器学习新闻

(例如)https://medium . com/analytics-vid hya/aki ras-ml-news-week 43-2020-C4 ad 1 CFA 5 de 7

每周机器学习时事通讯

[## 阿基拉的 ML 新闻杂志

关于我:制造工程师/机器学习工程师/物理学硕士/ ExaWizards Inc. _ _ _ _ _…

www.getrevue.co](https://www.getrevue.co/profile/akiratosei)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

参考

  1. 大卫·普法乌等.多电子薛定谔方程的深度神经网络从头算解,arXiv:1909.02487 (2019)
  2. 带有常微分方程积分器的哈密顿图网络。arXiv:1909.12790,2019

这应该是个人数据科学项目的第一步

原文:https://towardsdatascience.com/this-should-be-the-first-step-of-a-personal-data-science-project-660eb230225e?source=collection_archive---------13-----------------------

使用虚拟环境

无论你已经是一名数据科学家,还是你想成为一名数据科学家,你都可能有过为了乐趣而从事数据科学项目的经历。随着项目数量的增长,您需要采取一些重要的步骤来确保这些项目不会相互冲突。

问题是

假设你正在做两个项目。第一个是您从 GitHub repo 克隆的东西。它使用 TensorFlow 1.0,pandas 0.17,Python 3.5。你安装了这些并开始你的项目,一切都很顺利。

你现在开始你的第二个项目。这个用的是 TensorFlow 2.0,pandas 1.0,Python 3.7。这里的问题是,如果你安装了所有这些软件,它会中断你之前依赖于旧版本的项目。

解决方案

你需要的是一个虚拟的环境。虚拟环境将帮助您隔离项目的软件,以便您在一个环境中的工作不会影响您在另一个环境中的工作。创建虚拟环境应该发生在大多数数据科学项目的开始。幸运的是,用 Anaconda 很容易做到这一点。如果您还没有安装 Anaconda,我建议您现在就安装,因为它是最流行的数据科学平台之一,支持 VS Code、RStudio、Jupyter Notebooks 和 Spyder。我将带您通过 Anaconda 界面和命令行创建和管理虚拟环境。

使用 Anaconda Navigator 管理环境

一旦你打开 Anaconda,这是你应该看到的主屏幕。

这里我们看到了 Anaconda 附带的应用程序,其中包括一些流行的数据科学 ide。对于您创建的每个虚拟环境,您需要安装这些应用程序才能使用它们。安装后,下方的按钮将从绿色的“安装”变为蓝色的“启动”。

默认情况下,您在名为 base 的环境中工作。在应用程序的上方,你会注意到“应用程序开启”后面有一个下拉菜单。从这个下拉菜单中,您可以选择您创建的任何环境。现在你应该只有基础环境。

接下来,单击导航器左窗格中的环境。

这里我们看到了一个环境列表,我的环境只是有一个基础。在列表的底部,我们有 4 个选项可供选择。

  • 创建:用于创建环境。
  • 克隆:用于复制环境。
  • 导入:用来带入别人的环境。
  • 删除:用于删除环境。

在右侧的窗格中,我们可以看到我们在当前环境中安装的所有软件包,并通过单击软件包名称旁边的框来安装新的软件包。

现在,让我们通过单击您的环境列表下的“创建”按钮来创建一个新环境。现在我们可以选择我们的环境的名称,以及您想要使用的 python 和 R 的版本。在我的例子中,我想使用 python 3.7,并将我的环境命名为 First_Environment。

现在,我可以从右侧的窗格中搜索并安装该环境的任何软件包。请记住,您为此环境安装的任何东西都只能安装在此环境中。您需要为新环境再次安装软件包。

我建议为你做的几乎每个项目创建一个环境,并以那个项目命名这个环境。

命令行的基础知识

即使您不管理虚拟环境,能够使用命令行也是一项有价值的技能。要访问命令行,请在 Windows 上搜索“命令提示符”应用程序,在 Mac 上搜索“终端”应用程序。

我首先在终端中键入“ls”(在 Windows 上是“dir”),然后按回车键。这给了我一个当前文件夹中的文件和目录的列表,这个文件夹叫做工作目录。目录只是文件夹的另一种说法。

接下来,我想用“cd”命令更改目录。输入“cd 文档”会把我带到文档目录。在那里,我可以用“mkdir”命令创建一个新目录。我做了一个名为“ProjectB”的文件夹来存储我们的新项目。你应该用 cd 进入这个目录。“pwd”命令将打印工作目录(您所在的文件夹)。这对于在文件系统中导航很有用。

使用命令行管理环境

要使用 python 版创建名为“EnvironmentB”的环境,您需要在命令行中键入以下内容。

现在,要使用这个环境,您需要键入“source activate EnvironmentB ”,或者如果您使用的是 Windows,只需键入“activate EnvironmentB”。

您会注意到,在激活此环境后,命令提示符旁边括号中的环境名称已经更改。这有助于了解你所处的环境。现在,如果你需要安装一个应用程序,比如 jupyter,你可以用“conda install”加上包名来完成。

现在要使用 jupyter,只需运行 jupyter-notebook。在安装软件包的下一步,运行 pip,它将只为活动环境安装软件包。使用包名后跟==来获得特定的版本。

接下来,“conda list”可以为您提供一个列表,列出您在当前环境中安装的所有软件包。

最后,“conda env list”给出了您的环境列表。

导入/导出环境

在此之前的所有信息对于组织你的工作都很重要。能够导入和导出环境对于组织团队合作非常重要。要保存您的环境,请使用“conda list ”,但要将输出保存到 txt 文件中。

这个 txt 文件可以共享,并用于在其他人的机器上复制您的环境。这对于创造可复制的作品大有帮助。

这里总结了使用虚拟环境的基础知识。希望这能防止你的项目互相冲突,也能防止“它在我的机器上工作”这句话在你的办公室里被使用。

An AI Wrote This On Its Own In Seconds!

原文:https://towardsdatascience.com/this-story-was-completely-written-by-an-ai-cb31ee22feae?source=collection_archive---------48-----------------------

Grover, the AI Model that Can Generate Fake News

Photo by Morning Brew on Unsplash

The Article

“When we started working on artificial intelligence in the ’90s,” remembers Peter Ghavami, a New York-based consultant with consulting firm McKinsey & Company, “we had no idea how big a role it would play. All the problems that were going to be solved by AI were at the cutting edge of human cognitive capacity.”

Maybe that’s because tech companies didn’t know it back then. Those efforts began after the advent of the PC in the mid-1980s, a decade before Microsoft and the rest of the world really woke up to the power of AI. Today, AI is taking on myriad new roles. It is working behind the scenes to keep factories running, doing medical diagnoses and diagnosing emotional disorders, speeding up deliveries, identifying people in images at the Olympics and photo-matching over 10 million foreign flags. AI is also being deployed for heavy-duty political campaigns and sold on to countries trying to develop a countrywide infrastructure.

Still, AI doesn’t operate on a linear schedule. Rapid advances in data, and in the computational power it requires, led to an explosive growth period. These days, computers can reliably identify a stock market drop in a matter of milliseconds. It’s easy to get lost in that pace. The problem for those outside the companies developing and deploying AI is how do they keep up? Ghavami and a group of a dozen executives from McKinsey spent the past year working with AI pioneers like Google, IBM, and Stanford.

The good news is that self-driving cars and other ways to reduce traffic accidents are far more complicated than what we’ve come to think of as “wearable,” says Michael Jackson, a senior research scientist at Google who worked on the search giant’s self-driving cars.

“There are many, many hours of driving that have yet to be mapped,” Jackson says.

The other side of the evolution of the technology is that the biggest race to develop AI comes from a company that remains far away from Silicon Valley — an Asian powerhouse that is also the nation with the deepest R&D and the most expensive software engineers.

China is a major influencer in AI. XXX, the president, has characterized the rise of AI as a national security threat — or perhaps a challenge to freedom of expression — that will be used to weaponize or censor content online.

AI has to work at the corporate level, too. It is in the interests of big companies to have it both understand their problems and be able to predict what they will be concerned about in the future.

“如果没有人工智能的人类级应用,许多问题将无法大规模解决,”斯坦福大学人工智能教授 Charley Wragg 说,他是麦肯锡合作项目的负责人。换句话说,它将留给算法来解决它们的人类主人未能解决的问题。

是的,人类不应该在没有某种程度的国家监督的情况下工作,加瓦米说。

“与此同时,如果我们希望人们变得异常和超人,”加瓦米说,“理解他们为什么如此擅长某事以及具体是如何做到的也很重要。”

在罗塞塔石碑年,这个教训占据了中心舞台。

是的,你刚刚读到的一切都是由人工智能生成的!

是怎么做出来的?

这段文字是由艾伦人工智能研究所的格罗弗自动生成的。这是我给它的输入:

仅仅使用这几个输入,Grover 就能够自己生成一整篇文章。

格罗弗是什么

Grover 是作为制造假新闻的工具而被创造出来的。为什么?原来研究人员创造它是为了抵御假新闻。

通过这些系统,研究人员能够检测人工智能生成的文本的习惯和特征。希望通过进一步的研究,可以开发出自动系统来检测人工智能生成的文章。

你可以在这里阅读更多关于它为什么被创造的信息。但这里有一段摘录解释了为什么 Grover 能帮助我们发现假新闻,

“与直觉相反,对 Grover 的最佳防御竟然是 Grover 本身,准确率高达 92%,证明了公开发布强生成器的重要性。”

为了澄清,就准确性而言,研究人员指的是 Grover 检测人工智能生成的假新闻的准确性。

我们越来越多地看到政府和坏人用假新闻、假政策评论和对边缘思想的支持充斥社交媒体,作为宣传工具的工具。

Grover 等语言模型将有助于在自动化系统中检测和标记这些帖子,并随着时间的推移越来越准确。这对于脸书、推特和 Reddit 等大型社交媒体网站尤为重要,在这些网站上可以很容易地部署有针对性的宣传。

像 Grover 这样的工具是如何创建的(GPT-2)

Grover 使用了一种类似于 GPT-2 架构的语言模型,并接受了从《纽约时报》到 BBC 新闻的数百万条真实新闻的训练。

GPT-2 是由 OpenAI 专门创建的,能够从用户提供的输入(通常是一两句话)中生成连续的文本。GPT-2 本身在 800 万个网页上接受训练,拥有超过 15 亿个参数。这相当于大约 40GB 的纯文本数据。

GPT-2 可以推广到以下应用:

  • 回答问题
  • 完成文本
  • 阅读理解
  • 摘要
  • 等等..

如果你想深入了解 GPT-2,这里有一个视频是关于它是如何被训练的,

GPT-2 的美妙之处在于,它在无监督的机器学习的帮助下,自己学会了这一切。

这意味着模型可以只使用提供给它的文本来学习,不需要标记任何数据。它通过使用统计文本预测来实现这一点。在阅读几个单词后,模型会根据下一个单词应该是什么的概率和过去几个单词的上下文来预测下一个单词。然后,它可以通过查看它是否与训练数据中的下一个单词匹配来检查它的答案。

虽然 GPT-2 是最先进的语言模型,但它还没有达到人类的水平,但随着研究的进展,有一天它可能会远远超过我们。

如果你喜欢这篇文章,看看我的其他一些!

[## 可共享的 Jupyter 笔记本!

最后,团队可以轻松地共享和运行代码

towardsdatascience.com](/sharable-jupyter-notebooks-bf3ec9c2e0be) [## 数据可视化:动画条形图!

Excel 和 After Effects 中的数据可视化和动画

towardsdatascience.com](/data-visualization-animate-bar-graphs-df9ca03a09f2)

这个虚拟机节省了我的时间

原文:https://towardsdatascience.com/this-virtual-machine-is-saving-my-time-23076f592b94?source=collection_archive---------32-----------------------

在 Google 云平台之上的 Linux 虚拟机中部署您的 Python 脚本,以便与您的投资保持联系

UnsplashAltumCode 拍摄的照片

在本地运行 Python 脚本时,您有没有遇到过困难?很一般吧?下面让我列举一些苦苦挣扎的例子:

  • 局部存储器
  • 网络可用性
  • 电脑始终开启

由于我一直在从事一个需要频繁执行的 Python 项目,上面的例子是鼓励我寻找如何摆脱本地处理的主要例子。

这是为什么呢?因为我并不总是登录我的计算机,即使如此,我也不想每 15 分钟(或任何其他频率)执行一次我的 Python 脚本。

这个场景让我定义了以下项目结构:

项目设计—作者

为了做到这一点,我邀请您查看以下课程,在这些课程中,我介绍了有关每个项目要素的步骤和主要信息:

  • 谷歌表单(1)和 API (2)
  • 谷歌云平台(3)和 Linux 虚拟机(4)

PS:我将不同的元素分组如上,因为我认为这样更容易跟踪流程。第一组向您展示我们的目标是什么,并预测我们的 API 支持。后一组涵盖了 Google 平台上所需的操作,然后是 Linux VM 本身(包括 Python 脚本)。

1.谷歌工作表

就像刚才说的,我们来看看这个 Python 项目是什么。目标是每 15 分钟更新一次所拥有股票的当前价格(来自巴西市场)。

正如会议的标题所示,最初的数据可以在 Google Sheets 上找到。下面,您可以看到该项目中考虑的数据:

Google Sheets 的原始数据

让我们检查每一列:

  • 股票:公司的交易代码(截至 8 月 25 日,它被认为是 IBOV 中涉及最多的谈判股票)
  • 数量:拥有的数量
  • 账面价格:资产在购买时的价格(被认为是 7 月 31 日收盘时的股票价格)
  • 价格:当前价格(每次执行应用程序时)
  • 单位损益:“账面价格”-“价格”
  • 总损益:“单位损益“*”数量”
  • 总损益(%):"损益"/("账面价格" * "数量")

你可能会问自己 Python 在这里会做什么。答案是:更新“价格”一栏。通过这样做,从属列将相应地更新。

其他字段是:

  • 上次更新:Python 将在每次运行时更新这个单元。这有助于我们检查 Python 是否正在“触及”Google Sheets
  • IBOV:这是巴西最重要的金融市场指数。被用作 Python 脚本的参考(将在后面进一步解释);
  • 总计:汇总总结果。

直到这里,本地存储的挣扎点才得以解决。

2.应用程序接口

正如在上一节课中简要提到的,Python 需要“触及”Google Sheets。这是通过启用一些 Google APIs 来实现的,以便授权和认证 Python 应用程序在 Google Sheets 上“访问、读取和写入数据”。

在下面的文章中,我介绍了启用上述 API 的一步一步。我邀请你检查那里的详细步骤。

[## 如何让 Python 访问 Google Sheets

继续使用 Python 管理在线电子表格内容

medium.com](https://medium.com/better-programming/how-to-enable-pythons-access-to-google-sheets-e4264cdb545b)

我们已经完成了第一部分,这使您能够了解将要管理的数据。

现在,让我们看看部署应用程序本身所需的操作。

3.谷歌云平台

谷歌云平台被用作这个项目的云基础设施服务。像其他云服务一样,谷歌的平台为你提供计算资源即服务。

为了使用这些计算资源,您需要:

3.1.在谷歌云平台上创建一个项目;

3.2.实例化虚拟机。

让我们逐一检查一下。

3.1.在谷歌云平台上创建一个项目

您可以通过一个步骤创建项目:

3.2.实例化虚拟机

单击左侧栏菜单中的“计算引擎”>“虚拟机实例”。然后,单击“创建实例”并选择一些可用的参数:

正如您从上图中看到的,有一些参数与您的虚拟机资源的物理位置以及您正在考虑的 vCPUs 数量有关。请评估这对于你的情况是否合理。对于这个项目来说,下面这些已经足够了。值得一提的是,谷歌目前正在提供一些积分来使用这项云服务,然而,这是一项收费服务。

上图很重要,因为它定义了这个项目(Debian)正在考虑的一个特定的 Linux 发行版。

定义这些参数并单击“Create”后,您应该能够在您的虚拟机实例页面上看到以下条目:

通过按启动 SSH 连接,Linux 终端将被打开。

4.Linux 虚拟机

由于 Infra 和 API 都已启用,现在是时候设置您刚刚实例化的 Linux VM 了。

主要步骤是:

4.1.部署 Python 脚本

4.2.设置执行周期。

它们是如何工作的?

4.1.部署 Python 脚本

重要的事情先来。让我们检查一下您的环境中是否已经安装了任何 Python 版本。

您可以导航到/usr/bin 并检查是否已经安装了 Python 版本。然而,更简单的方法是只输入python3并检查环境是否将它识别为一个系统命令:

从上面可以看出,已经安装了 python3(版本 3.5.3)。然而,pip3,这个用于新软件包安装的命令,还没有被识别。所以,让我们使用sudo apt install python3-pip 来安装它(确保在安装过程中按下 Y 键)。

让我们通过键入pip3 --version来检查它是否已经安装:

现在一切都好了。

让我们导航到要创建的目录。py 文件:

在这个例子中,我在/home/lucasnunesfe9上创建了一个名为 pythonScript 的新目录(在这个例子中,“lucasnunesfe9”是云服务用户名。一定要用你的)。

访问这个新目录并创建您的。py 文件:

键入nano myScript.py之后,您应该编写 Python 脚本本身:

import gspread
from oauth2client.service_account import ServiceAccountCredentials
from datetime import datetime

我们从导入所需的库开始:

  • [gspread](https://gspread.readthedocs.io/en/latest/)用于处理 Google Sheets 中的数据;
  • [oauth2client](https://pypi.org/project/oauth2client/)需要通过 API 进行认证和授权;
  • [datetime](https://docs.python.org/3/library/datetime.html)脚本运行时需要打印。
scope = ['https://www.googleapis.com/auth/drive']#this variable reads the json file that holds your credentials 
credentials = ServiceAccountCredentials.from_json_keyfile_name('**/home/lucasnunesfe9/pythonScript/your_file_name.json**', scope)gc = gspread.authorize(credentials)#spreadsheet file named "example"
sps = gc.open('example')#first worksheet = 0
wks = sps.get_worksheet(0)

以上部分足以确保您可以连接到 Google Sheets。请确保给出指向您的的完整路径。json 文件(这个文件还需要创建)。

#updates current time
dt_string = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
wks.update_cell(2,1,dt_string)#this function will loop through the column reference until it finds "IBOV" cell value
def getLastRow(reference):
    #i = reference cell's position
    i = wks.find(reference).row #loops i trough a static column (reference)
    while wks.cell(i, wks.find(reference).col).value != "IBOV":
        i += 1 #subtract the last iteration
    return (i - 1)#this function writes the Google Finance API's formula in each cell of the column "Price"
def currentPrice (reference): #loops i from the reference row to the referece value until getLastRow value
    for i in range(wks.find(reference).row+1,getLastRow("Stock")+1): #writes current Stock price available from Google Finance API according to colum 1 ("Stock" column)
        #preserve needed Google Finance's syntax
        wks.update_cell(i,wks.find(reference).col,"=GOOGLEFINANCE
("+"\""+wks.cell(i,1).value+"\""+")")#running both functions
currentPrice("Price")

上面的部分是真正执行我们需要的部分。总之,它更新脚本执行的时间,并遍历所有股票以更新它们的当前价格。为了实现后者,我们使用了 Google Finance API。

写完脚本后,按 Ctrl + Shift,再按 Y,再按 Enter。这将保存您的 myScript.py 文件。

现在让我们创建。json 文件,就像刚刚用。py 文件:

一定要遵循我在本文开头分享的教程。你可以查看更多关于这方面的详细内容。json 文件(很简单)。然后,将内容粘贴到。json 文件,Ctrl + Shift,然后 Y,然后回车。

让我们设置您将要执行 Python 脚本的重复周期。

4.2.设置执行周期

对于这个任务,我们将使用 crontab 作业

首先,进行一次理智检查。让我们看看是否已经为您的用户使用crontab -l创建了任何 crontab 作业:

什么都没有…让我们用crontab -e创建一个新的:

类型1。将会打开以下窗口。直接跳到最后一行:

最后一行是什么意思?

正如屏幕上给出的解释,每个部分表示一个时间单位:

  • */15:每 15 分钟一次
  • 13-20:世界协调时 13 时至 20 时。该范围涵盖巴西金融市场开放期间(巴西的时区为 UTC - 3)
  • *:一个月中的每一天(dom)
  • *:每月(周一)
  • MON-FRI:周一至周五

因此,每 15 分钟的工作日,在 13 和 20 之间,我位于/home/lucasnunesfe9/pythonScript/myscript.py的脚本将由python3执行。再说一次,保存文件。

等待,直到您的脚本应该被执行,然后,键入sudo service cron status | tail -n 1:

您可以看到 crontab 已经执行(注意,这并不一定意味着 Python 脚本已经正确执行)。

那么,Google Sheets 发生了什么?

第一次执行 Python 后的“Google Sheets ”( 15 小时 45 分)

看起来不错…再来一次:

然后:

第二次执行 Python 后的“Google Sheets ”( 16h 00)

工作正常!

现在,剩下的问题,网络可用性和保持电脑始终开机的需要,也都解决了。

这会改变你对甘斯的看法

原文:https://towardsdatascience.com/this-will-change-the-way-you-look-at-gans-9992af250454?source=collection_archive---------8-----------------------

GAN 学习和模式崩溃的实时可视化

西安·莫洛伊插图

给手机用户的一个警告:这篇文章中有一些厚的 gif 图片。

一个伪造者和一个侦探走进一家酒吧

除非你在过去的几年里一直生活在岩石下,否则你肯定听说过围绕着生成性敌对网络(GANs)的喧嚣。特别是,他们创造新的、照片般逼真的图像的能力令人震惊。考虑以下图像:

来自 pg-GAN 的输出(来源:英伟达)

以上的人都不存在。这些“照片”是由 NVIDIA 的 GANs 技术的渐进增长创建的,只是越来越多的 GAN 开发中的一个例子。

GAN 技术背后的基本前提很简单:两个网络,一个生成器和一个鉴别器,被串联训练。鉴别器显示来自训练数据的真实样本(例如照片)和由生成器创建的假样本,并且任务是将真品与赝品分开。与此同时,生成器的任务是创建假样本,骗过鉴别器将其归类为真样本。发生器能够产生不同的输出,因为它接受随机噪声作为输入,通常以 100 个正态分布值的向量形式。在这种情况下,生成器可以被视为从某个潜在空间到样本空间的映射,而鉴别器可以被视为用于测量由生成器描述的样本空间中的分布和真实样本的真实分布之间的散度的工具。

众所周知,甘人很难训练。在模式崩溃、无法收敛、循环和许多其他问题之间,GANs 有许多失败模式,并以挑剔著称。GAN 训练背后的中心思想是生成器创建样本,鉴别器告诉生成器它出错了什么。为了指导生成器,鉴别器必须能够将样本域中的每个点映射到该点是真实样本的概率。这听起来可能很简单,但像深度学习中的大多数事情一样,它在幕后相当复杂。为了帮助演示 GAN 训练的复杂性,我为一个非常简单的问题的训练过程创建了可视化效果。

问题是

图 1:目标函数的输入空间(左)和相应的输出(右)。输入空间通常被称为潜在空间,输出空间被称为样本空间。

考虑图 1 所示的映射。2D 输入空间([-1,1],[-1,1])被映射到一个螺旋,其中输入(潜在)空间中的 x 位置确定该点沿螺旋的距离(在样本空间中),y 位置确定该点在螺旋中的横向位置。下面是目标函数将随机输入转换为螺旋的可视化效果:

图 2:应用于随机输入的目标函数的动画

因此,眼前的任务是训练一个能够从这种螺旋分布中产生点的 GAN。由于原始函数具有两个自由度,GAN 将被给予 2D 随机噪声作为输入。

解决办法?

我训练了一个 GAN 600 步的训练步骤,每走一步就观想一遍。发生器和鉴别器都有三个带泄漏 ReLU 激活的全连接层。使用 Adam 优化器及其默认参数,生成器和鉴别器的学习率都设置为 0.001。训练过程如图 3 所示;事情很多,所以让我们一个小组一个小组地过一遍。

图 3:GAN 训练过程的动画。左上:发生器和鉴频器的损耗和精度。顶部中心:训练步骤。右上:真实样本和生成样本。左下角:潜在空间的鉴别器输出。右下:样本空间的鉴别器输出。

左上角:精确度和损耗

在左上角的面板中,您可以看到每个训练步骤的生成器和鉴别器的损耗(二进制交叉熵)和精度。两个损失都在 ln(0.5)=0.69 范围内徘徊,这表明鉴别器对其预测完全没有信心。生成器精度(,它如何有效地欺骗鉴别器)通常是 100%,偶尔会下降到 0%,然后反弹到 100%。

右上:真假样品

在每个训练步骤之后,绘制真实分布(蓝色)和生成分布(红色)。正如你所看到的,在大多数步骤中,发电机输出已经减少到一个非常小的范围内波动。特别值得注意的是,红色输出斑点在很大程度上保持不变,直到发生器精度降低或损耗增加,此时它会飞到范围的另一部分。

左下角:潜在空间鉴别器输出

左下方图解了潜在空间中每个点的鉴别器输出,其中深蓝色表示鉴别器认为“肯定是真的”,深红色表示“肯定是假的”,白色表示鉴别器没有想法。换句话说,该空间中的每个点都由生成器转换,然后由鉴别器分类,因此该面板说明了生成器如何有效地将潜在空间的每个部分映射到现实输出。

右下角:样本空间鉴别器输出

该面板与左下方的面板非常相似,只是它显示的是样本空间而不是潜在空间。该面板中的每个点对应于样本空间中的一个 2D 点,颜色代表鉴别者对该点真实存在的信心。换句话说,它是由发生器产生的任何给定点相对于目标函数的相对频率的可视化。

这是怎么回事?

你在上面的 gif 中看到的简单来说就是模式崩溃;发生器输出已经崩溃到一个很小的样本区域,鉴别器认为这些样本可能是真实的(图 3,右上图)。当鉴别器得知这个区域中的大多数点是假的时,生成器简单地转移到鉴别器认为是真实的另一个区域。这一点从右下面板可以明显看出;蓝色区域是鉴别者认为更可能是真实的区域。因此,驱动发生器在该区域产生样本。尝试移动光标,使其始终位于右下角面板的最蓝区域;您会发现您的光标和右上角面板中的红色斑点沿着相同的轨迹围绕该范围移动。

你可能会认为生成器没有能力学习目标函数。我想可能是这种情况,但是这里有一个生成器通过监督回归学习目标函数的可视化,类似于图 3 中右上的面板:

图 4:生成器通过监督回归学习目标函数的动画

你可能还会说,鉴别器没有学习目标函数的能力。我也认为可能是这种情况,但这里是鉴别器学习目标函数和均匀噪声之间的决策边界的可视化,类似于图 3 中的右下角面板:

图 5:鉴别器通过监督分类学习由目标函数(蓝色)或均匀噪声(红色)产生的点的相对概率的动画。

最后,你可能会说 GAN 只是需要更多的时间来达成一个解决方案。不幸的是,即使经过几千步的训练,GAN 仍然表现出与前 600 步完全相同的行为。这个过程看起来非常像下面这样:

图 6:模式崩溃阵痛中的甘(艺术家印象,来源:吉菲)

这里的主要问题是对鉴别器性质的误解。在讨论 GANs 时,鉴别器通常被描述为能够预测给定样本是真是假。事实并非如此。鉴别器实际上做的是分类一个给定的样本是来自真实的数据集还是由生成器创建的。这种区别很微妙,但请考虑下图:

图 7:目标分布(蓝色,两者)与均匀噪声(红色,左侧)和发生器输出(红色,右侧)

在左边,我们看到两类:真实样本(蓝色)和随机噪声(红色)。识别每个点上每个类的相对概率有助于形成一个信息丰富的鉴别器(事实上,这就是图 5 中的鉴别器是如何被训练的)。在右边,我们还可以看到两个类:真实样本(同样是蓝色),以及生成器的输出(红色)。基于该数据训练的鉴别器是没有用的;它将得出结论,在那个小的红色区域内的任何样本都可能是由发生器产生的,而该区域之外的任何样本都可能是真实的样本。由此推断,鉴别器决定即使在范围的角上的点也可能是真实的样本,尽管它从未在该区域中见过样本。这鼓励生成器在那些极端区域产生点。最终,鉴别器了解到这个新区域很可能都是伪点,而不知道原来的区域同样大部分是伪点,因为伪点不再在那里产生

更好的解决方案

关于模式崩溃的问题已经做了大量的研究,但是没有办法把所有的都放在一篇文章里。我们将应用一些常用技巧来改进训练:降低生成器学习率和 Adam 优化器的β1 参数。在最初的训练过程中(图 3),我对生成器使用了 0.001 的学习率。我使用 0.0002 的学习率重复了这个过程,并将β1 从 0.9 减少到 0.5:

图 8:GAN 训练过程的动画。如图 3 所示,但是使用了更好的优化器参数

在这里,生成器在探索样本空间方面做得更好,这反过来又导致了一个信息更丰富的鉴别器。如果我们允许 GAN 训练 600 步而不是 600 步,我们会看到以下结果:

图 9:以降低的学习速率训练 GAN 600000 步的结果

正如您所看到的,在这种情况下,鉴别器(右下角面板)比图 3 中了解到了更有用的相对分布,这导致了更有效的生成器(右上角面板)。在左下角的面板中,我们看到在潜在空间中有两个区域,生成器未能映射到欺骗鉴别器的样本,暗红色的垂直线;生成器将这些区域中的点映射到螺旋的负空间。这些区域的原因如下所示:

图 10:经过训练的生成器将随机输入映射到已学习的螺旋分布的动画

动画清楚地显示了平滑的潜在空间在这两个区域被切割,不像图 2 中所示的平滑函数。在潜在空间中靠近在一起但在线的相对侧的点在样本空间中彼此相距很远;线上的点介于两者之间,大多位于目标分布之外。尽管最简单的解决方案是让一个维度对应于沿着螺旋(长度)的位置,而另一个维度对应于螺旋(宽度)内的横向位置,但是 GAN 反而陷入了一些涉及极端轮廓的局部最小值。这是 GANs 的一个常见问题,我们认为相似的特征在潜在空间中可能相差甚远,反之亦然。

结束语

gan 通常应用于高维图像数据,因此很容易舍本逐末。即使是生成模型的hello worldMNIST,也存在于 784 维空间。在一个简单的二维问题上训练一个 GAN,并使过程的所有方面可视化,是获得对 GAN 整体的直观理解的有效方法。和往常一样,如果你花时间去想象一切,你会对你的发现感到惊讶。

撰写本文时使用的所有代码,包括 GAN 培训和可视化,都可以从以下 github repo 获得:

[## ConorLazarou/培养基

GAN 学习产生螺旋时的可视化效果

github.com](https://github.com/ConorLazarou/medium/tree/master/12019/visualizing_gan_spiral)

这会让你明白数据科学到底有多难

原文:https://towardsdatascience.com/this-will-make-you-understand-how-hard-data-science-really-is-f4330bb8f672?source=collection_archive---------11-----------------------

照片由 Unsplash 上的 Nikko Macaspac 拍摄

TL;博士:很难

每天,人们都试图不辜负计算机科学专家,并试图进入数据科学领域。

有多难?需要什么?我从哪里开始?

在这篇博客中,我将总结我在这个 Kaggle 笔记本中做第一个数据科学项目时面临的 3 个最大挑战:

  1. 你什么都不知道
  2. 数据准备至关重要且耗时
  3. 解释您的结果

观点是我自己的。

在进入任何细节之前,有一个相当重要的部分,人们似乎在解释过程中忽略了,或者它们只是他们的小代码片段的一部分。为了使用任何高级库,您必须将它们导入到您的工作区中。最好将它们收集在练习册的顶部。

我下面的例子:

你什么都不知道

对于我的第一个数据科学项目,我创建了一个关于在阿姆斯特丹开办 Airbnb 的简短博客。我只用了基本的数据分析方法和回归模型。

回归模型可能是数据科学最基本的部分。典型的线性回归函数如下所示:

这将返回几个输出,然后您将使用这些输出来评估您的模型性能。

数据科学家使用的技术超过 40 种。这意味着我只使用了 2.5%的模型。

我会很慷慨的。鉴于我 8 年前在大学里学的统计学课程,在进入这个项目时,我已经知道了那个回归模型的大约 10%。这意味着我只知道我所知道的全部知识的 0.25%。然后加上非常大量的我不知道我不知道的东西。

我在数据科学领域的知识世界看起来是这样的:

作者图片

这还不够糟糕,你会发现像这样的文章,准确地描述了你所有的缺点。

这个当前的项目花费了我大约 4 周的时间,可以说这是学习新数据科学模型的平均速度。我将花费大约 4 / 0.25% = 800 周的时间来学习到目前为止我听说过的所有模型,并可能再增加 5 倍的时间来学习(可能甚至不接近)数据科学领域的一切。

未来 15 到 75 年的学习。

学习后的我:

唐纳德·蒂尔在 Unsplash 上的照片

数据准备

我在谷歌从事数据工作已经超过 5 年了。

可惜我以前的经验都是在 SQL 和数据科学家是熊猫的大粉丝。他们真是动物爱好者。

这里的挑战是双重的:1)知道做什么,2)知道如何去做。

即使有下面描述的帮助,数据准备部分也要花费你 80%甚至更多的时间。

知道该做什么

操纵数据以准备在模型中摄取的方法是无穷无尽的。它深入到统计学的底层,如果你想成为一名伟大的数据科学家,你需要彻底理解这一点。

准备好多次运行这些步骤。我将给出几个对我每一步都有效的例子。

清理数据质量问题

如果您的数据样本大小允许,您可能应该去掉数据中的任何 NaN 值。它们不能被回归模型吸收。要计算每列 NaN 值的比率,请使用以下公式:

np.sum(df.isnull())/df.shape[0]

要删除所有具有 NaN 值的行,请使用以下命令:

df.dropna()

我遇到的另一个数据质量问题是将 True 和 False 数据作为字符串,而不是布尔数据类型。我用这个 distutils.util.strtobool 函数解决了这个问题:

在开始这个项目之前,请不要假设我真的知道如何使用 Lambda 函数。

我读了很多书才稍微理解了一点。我非常喜欢这篇关于“什么是 python 中的 lambda 函数以及为什么您应该现在就开始使用它们”的文章

最后,我的价格数据是一个由$符号和逗号组成的字符串。我找不到一种优雅的方式来编码解决方案,所以我笨拙地采用了这种方式:

剔除异常值

首先检查是否有异常值,箱线图非常有用:

sns.boxplot(x=df[‘price’])

发挥想象力,使用修改后的 z 值(来自 StackOverflow 的答案)来剔除异常值:

或者根据您的喜好强制实施硬编码条件,如下所示:

df = df[df['price'] < 300]

归一化&组合变量

不要与正态分布混淆。

标准化是将各个列缩放到相同数量级的过程,例如从 0 到 1。

因此,你必须只考虑这一步,如果你想结合某些变量,或者你知道它会影响你的模型。

Sklearn 中有一个预处理库。它有助于实现这些数据准备方面的一些内容。

我发现很难规范化某些列,然后将它们整齐地放回我的数据框架中。因此,我将在下面分享我自己的组合床/卧室/住宿变量的完整示例:

为变量创建正态分布

单独查看所有数据输入变量并决定如何转换它们以更好地符合正态分布是很有用的。

我已经用这个 for 循环:

一旦你知道你想要转换哪个,考虑使用一个 box cox 转换像这样:

请注意返回 box cox 转换所使用的 lambdas 列表是多么重要。当你解释结果时,你需要这些来反演你的系数。

标准化

StandardScaler 假设您的数据在每个要素中已呈正态分布(参见上述 box cox 变换示例),并将对其进行缩放,以使分布现在以 0 为中心,标准差为 1。

我的完整例子如下:

创建虚拟变量

分类变量可能包含数据集中一些最有价值的信息。为了让机器理解它们,你需要把每一个唯一的值翻译成一列 0 或 1。

如果是该值,则为 1,否则为 0。

有几种方法可以做到这一点。我用过以下方法:

多重共线性

在将某些输入变量放入模型之前,您可以检查它们之间是否存在相关性。

您可以像我下面的例子一样检查多重共线性,并尝试去掉一些您认为不会增加任何额外价值的变量。

这将有望防止一些特征值和特征向量问题。

得到特征值和特征向量的底部可能会花费你另外 15 年的时间。小心行事。

你可以通过主成分分析(更常用于图像识别)进入降维的兔子洞。

此外,这篇关于功能选择的文章非常令人大开眼界。

坦白地说,在这个项目中,我没有时间学习所有这些先进的方法,但是在将数据科学应用到我的工作项目之前,我想更好地理解以上所有内容。

知道如何去做

作为一个荷兰人,我为 Python 的起源感到非常自豪。这是一种非常强大和容易理解的语言。

根据这篇文章中的,基础训练平均需要 6-8 周。

因此,以我 4 周的经验,我甚至还没有学会基础。在这个弱点之上,我试图在上面添加几个不同的专用库包,比如 SeabornSklearnPandas

"不管你做什么项目,它们都是基础性的."

感谢所有的 Stackoverflow 和自助出版工程师,你们拯救了我生命中的许多时间。

特别是,吉姆是我新的最好的朋友。

复制代码并从所有这些文章中学习,它们是您在一天结束时工作代码的最大希望。

让我总结一下关于上述三个库的三篇最有用的文章:

  1. Seaborn: 如何使用 Python Seaborn 进行探索性数据分析
  2. 熊猫:关于“熊猫”Python 库的快速介绍
  3. sk learn:Scikit-learn(sk learn)简介

花些时间和你的新朋友在一起:

照片由 chuttersnapUnsplash 上拍摄

解释您的结果

在上一步中,您很有可能对数据进行了某种程度的处理,以至于无法对其进行解释。

根据我的项目文章,上市价格被 boxcox 转化,并且产出中的 1 美元不像真正的 1 美元。

对我来说,最简单的方法是衡量与标价关系的相对强度,而不是评论系数的实际值。你可以在我的视频中看到结果。

更合适的解决方案是将 box cox 和其他变换反转回正常状态,例如:

Inv_BoxCox 用于 BoxCox 变换

**from** **scipy.special** **import** boxcox, inv_boxcox
**>>>** y = boxcox([1, 4, 10], 2.5)
**>>>** inv_boxcox(y, 2.5)

希望您记得在我的 box cox 转换示例中保存 lambda_list。因为 2.5 是你求逆变换的 lambda 值。

标准缩放器的逆变换:

最后,您需要非常精通您的评估指标。

有许多评估指标,如 RMSE系数/ p 值

大多数机器学习模型都带有评估指标。Sklearn 中的 LinearRegression 也是如此:度量

在我的例子中,我主要关注 R 平方和 RMSE:

让 RMSE 看起来很有价值的一件事是平等的模特之间的比赛场地。

我可以很快看出,在这个问题上使用自动化机器学习并没有改善我的模型。 H2O 汽车相当容易实现:

这东西太疯狂了。它遍历许多不同的模型(在我的例子中,max=20 ),并返回一个模型排行榜。

然而,如前所述,这并没有提高我的 RMSE 多少。

“这仍然完全取决于你输入的丰富程度”

也请非常小心,并寻求更多有知识的人的帮助。

利用你的资源,打电话给朋友:

路易·汉瑟Unsplash 拍摄的照片

结论

在本文中,我试图让您了解数据科学到底有多难。

  1. 我们看了看我还需要学习的内容。大约只有 15 到 75 年…
  2. 然后,我们查看了数据准备,发现这是一个非常令人头疼的问题,会占用您大约 80%的时间
  3. 最后,我们发现解释你的结果可能最好留给一个更博学的人。打电话给朋友!

忠于成长心态,不要让这阻止你。

你还不是数据科学家。

开始你的第一个项目!

汤普森取样

原文:https://towardsdatascience.com/thompson-sampling-fc28817eacb8?source=collection_archive---------2-----------------------

婴儿机器人强化学习指南

多武装匪徒:第 5 部分

国立癌症研究所Unsplash 上拍摄的照片

概观

在本系列的最后几部分中,我们一直在寻找解决多臂强盗问题的越来越复杂的方法。我们现在已经到了我们要看的所有方法中最后也是最复杂的一个: 汤普森采样

如果您还不熟悉 bandit 问题及其术语,您可能想先看看本系列的前几部分,如下所示:

bandit 算法和测试框架的所有代码都可以在 github 上找到: Multi_Armed_Bandits

概述

机器人宝宝在商场走失。利用强化学习,我们想帮助他找到回到妈妈身边的路。然而,在他开始寻找她之前,他需要从一组电源插座充电,每个插座的电量略有不同。

使用多臂强盗问题中的策略,我们需要在最短的时间内找到最好的插座,让机器人宝宝充电上路。

机器人宝宝进入了一个充电室,里面有 5 个不同的电源插座。每个插座返回的电荷数量略有不同。我们希望在最短的时间内给机器人宝宝充电,所以我们需要找到最好的插座,然后使用它,直到充电完成。

这和多臂强盗问题是一样的,除了我们不是在找一个能给出最好回报的吃角子老丨虎丨机,而是在找一个能给出最多电量的电源插座。

汤普森取样

到目前为止,我们所看到的解决强盗问题的所有方法都是基于从这些行动中得到的平均回报来选择他们的行动的。Thompson 采样(有时也被称为贝叶斯强盗算法)采用了一种稍微不同的方法;它并不只是改进对平均回报的估计,而是对其进行扩展,从获得的回报中建立一个概率模型,然后从中抽取样本来选择行动。

通过这种方式,不仅获得了对可能的奖励的越来越精确的估计,而且该模型还提供了对该奖励的一定程度的信任,并且这种信任随着收集的样本越来越多而增加。随着越来越多的证据可用,这个更新你的信念的过程被称为 贝叶斯推断

伯努利·汤普森采样

作为介绍,并且为了使事情更容易处理,让我们简化电源插座问题。现在,不是每个插座返回不同数量的电荷,而是每个插座要么返回一些电荷,要么不返回电荷;奖励只有两个可能的值:当选择的插座充电时为 1,当不充电时为 0。当一个随机变量只有两种可能的结果时,其行为可以用 伯努利分布 来描述。

所以现在,不是每个插座的电荷量不同,而是每个插座产生电荷的概率也不同。我们希望找到返回电荷概率最高的插座,而不是给出电荷最多的插座。

如前所述,汤普森抽样产生了一个回报概率模型。在这种情况下,当可用的奖励是二元的(赢或输,是或否,收费或不收费)时,那么 贝塔分布 是对这种类型的概率建模的理想选择。

(有关贝塔分布和伯努利分布之间关系的更多信息,请查看这篇精彩的文章:
贝塔分布——直觉、例子和推导)。

贝塔分布有两个参数,' α '(阿尔法)和' β '(贝塔)。用最简单的术语来说,这些参数可以分别被认为是成功和失败的计数。

此外,贝塔分布的平均值由下式给出:

**

图 5.1:不同α和β值的β分布。

最初,我们不知道任何给定的插座产生输出的概率是多少,所以我们可以首先将' α 和' β '都设置为 1,这将产生一条平坦的线**(在图 5.1* 中显示为平坦的红色线)。***

这个对套接字产生输出的概率的初始猜测被称为 先验概率;它是在我们收集到任何证据之前特定事件发生的概率,在这种情况下,用 Beta 分布 Beta(1,1) 表示。

一旦我们测试了一个套接字,并获得了回报,我们就可以修改我们对该套接字返回一些电荷的可能性的信念。这个新的概率,在收集了一些证据之后,被称为。这也是由 Beta 分布给出的,但是现在' α '和' β '的值用返回的奖励值更新。

因此,如果一个套接字返回一些电荷,奖励将是 1,并且' α 【T1 '(成功次数的计数)将增加 1。失败次数的计数, β ,不会增加如果没有获得奖励,则“ α ”将保持不变,而“ β ”将增加 1。随着收集的数据越来越多,贝塔分布从一条直线变成了一个越来越精确的平均回报概率模型。通过保持' α 和' β 的值,汤普森采样算法能够描述估计的平均回报和该估计的置信水平。

与在每个时间步选择具有最高估计回报的动作的贪婪算法相反,即使该估计的置信度较低,Thompson sampling 也从每个动作的 Beta 分布中进行采样,并选择具有最高返回值的动作。由于不经常尝试的动作分布很广(参见图 5.1 中的蓝色曲线),它们有更大范围的可能值。以这种方式,当前具有低估计均值回报,但是比具有较高估计均值的插座测试次数少的插座可以返回较大的样本值,因此成为在该时间步长的所选插座。

在上图中,蓝色曲线的估计平均回报低于绿色曲线。因此,在贪婪选择下,绿色会被选择,而蓝色插座永远不会被选择。相比之下,Thompson 采样有效地考虑了曲线的整个宽度,对于蓝色插座,可以看出其延伸超过了绿色插座的宽度。在这种情况下,可以优先选择蓝色插座,而不是绿色插座。

随着插座试验次数的增加,估计平均值的可信度也增加。这反映在概率分布变窄,采样值将从更接近真实平均值的一系列值中提取(见图 5.1 中的绿色曲线)。结果,探索减少了,开发增加了,因为具有较高回报概率的插座将开始以增加的频率被选择。

另一方面,具有低估计平均值的插座将开始被不太频繁地选择,并且将倾向于在选择过程的早期被丢弃。因此,他们真正意义可能永远不会被发现。因为我们只对找到返回奖励的概率最高的套接字感兴趣,并且尽可能快地找到它,所以我们不关心是否从未获得性能差的套接字的完整信息。

伯努利套接字实现

正如我们在本系列的前几部分中进行的套接字实验一样,我们将使用一个基本的套接字类,在此基础上,我们为正在研究的算法添加特定的功能。然后,使用这个新类,我们通过一组实验运行它,对所有的 bandit 算法使用相同的测试工具。电源插座基类和附带的测试系统的全部细节在本系列的第二部分中给出,所有代码可以在 github 上找到。

如上所述,Bernoulli Thompson 采样的实现显示在bernoulllithompsonsocket类中:

在这个类中,我们将' α 和' β '初始化为 1,以给出均匀分布。然后,在更新时,如果套接字返回奖励,我们简单地递增' α ,否则我们更新' β '。

sample ”函数使用“ α ”和“ β ”的当前值作为其参数,从 Beta 分布中提取一个值。

实验结果

下面的图 5.2* 显示了每个电源插座的 Beta 分布演变,我们使用了更简单的概率电源插座。*

为了简单起见,我们将插座的数量减少到三个,测试时,这些插座返回一些电力的真实概率分别为 0.3(绿色)、0.7(红色)和 0.8(蓝色)。

图 5.2:对 3 个概率电源插座使用 Beta 分布的 Thompson 抽样,真实概率为 0.3、0.7 和 0.8。

在上面的图 5.2* 中,虚线显示了 0.3、0.7 和 0.8 的真实平均值。图例显示每个插座的试验次数以及这些试验的成功次数。*

图 5.2 中的要点如下:**

  • 在时间步长 0(未示出),所有β分布的 αβ 值将被设置为 1,以给出平坦均匀的分布。
  • 由于所有插座具有相同的初始分布,在时间步骤 1 中,蓝色电源插座被任意选择。当测试时,它给出一个奖励,所以它的 α 值增加 1,它的概率密度曲线向右移动。绿色和红色插座尚未测试,因此保留它们最初的平坦分布(绿色曲线隐藏在红色曲线后面)。
  • 在第二个时间步,蓝色插座再次被选中,它再次返回奖励。蓝色曲线稍微向右挤压一些,因为这个插座已经测试了两次,并且两次都返回了奖励,所以这个插座每次被选中都会返回奖励的可能性仍然存在。
  • 到第五次试验时,蓝色插座再次被选中,但这次它没有给出奖励。结果,它总是返回值的概率下降到零(概率= 1.0)。另一方面,绿色套接字现在已经测试了两次,还没有返回值,因此它的概率密度曲线向左移动,在概率=0 时具有最高值,因为这个套接字仍然有可能永远不会返回奖励。
  • 在 15 次尝试中,红色插座已经尝试了几次。因为它返回了一次奖励,所以它的平均奖励概率估计为 0.5。在这个阶段,蓝色插座已经被尝试了 11 次,并在其中的 6 次尝试中返回了奖励,给它一个略高的估计奖励概率 0.54。因此,在贪婪系统中,蓝色套接字将是被选择的套接字,然而,因为红色套接字比蓝色套接字被尝试的次数少,所以可以看到它具有宽得多的概率密度曲线,这给了它比蓝色套接字优先被选择的好机会。
  • 一个插座被测试的次数越多,我们对它的估计就越有信心,它的概率密度曲线就变得越窄。最佳插座将被更频繁地使用,次优插座的测试将逐渐减少。在我们测试的最后,当蓝色插座比其他两个插座中的任何一个受到更多的尝试时,可以看到这种行为。还可以看出,绿色插座最终在两次试验中获得了回报。因此,这不再可能是一个从不返回回报的套接字,所以这种情况发生的概率(返回回报的概率= 0)下降到零。
  • 还可以看出,无论是蓝色还是红色插座都没有以它们的真实平均概率为中心的概率密度曲线。如果测试运行了更多的时间步长,那么蓝色曲线将最终停留在真实的平均值上,但是红色插座将具有大大减少的试验次数(如果有的话),因此可能永远不会找到它的真实值。如上所述,这不是一个问题,因为我们只对找到最佳插座感兴趣,而不是其他插座的真实平均值。

高斯汤普森采样

到目前为止,我们使用的简化套接字问题是掌握贝叶斯汤普森抽样概念的好方法。然而,要将这种方法用于我们实际的套接字问题,其中套接字不是二进制的,而是返回可变数量的电荷,我们需要稍微改变一下。

在前一个问题中,我们使用 Beta 分布来模拟套接字的行为。选择这一点是因为简化的套接字输出只有两种可能的结果,收费或不收费,因此可以用伯努利分布来描述。当从伯努利分布中得出的值(可能性值)乘以从贝塔分布中得出的值(先验概率),那么结果值(后验概率)也具有贝塔分布。当这种情况发生时,使得与先验相乘的可能性产生与先验具有相同分布类型的后验,该先验被称为 共轭先验

对于我们的标准套接字问题,每个套接字返回一个由正态分布描述的实数值。如果我们假设我们知道我们的套接字的方差(实际上是 1,因为我们在代码中使用了未经修改的 numpy randn 函数),那么从 Wikipedia 上的 共轭先验表中,我们可以看到共轭先验也具有正态分布。如果我们不知道分布的方差,或者我们使用不同的分布,那么我们只需要从表中选择一个共轭先验,并相应地调整我们的算法。

因此,我们可以使用正态分布来模拟套接字的输出,并通过更新其均值和方差参数来逐步完善该模型。如果不使用方差,而是使用精度‘τ’(τ),其中精度只是方差的一倍(精度τ= 1/方差),那么我们可以使用简单的更新规则来更新平均值' μ₀ 和总精度' τ₀ ',由下式给出:

**

哪里;

  • τ '是实际套接字输出的精度,在我们的例子中是 1。
  • n 是插座测试的次数。
  • '是该插座每次测试“I”时接收到的输出(相当于我们到现在为止使用的奖励“ Rᵢ ”)。
  • μ₀’是估计的平均值(用于模拟输出的分布的平均值)。
  • τ₀’是用于模拟输出的分布的总精度。

乍一看,这看起来相当吓人,但它基本上说的是,我们有两个参数' μ₀ 和' τ₀ ',我们将在每次测试插座时更新它们,就像我们对伯努利插座的' α 和' β '所做的那样。除了在这种情况下,那些参数代表插座的成功和失败的次数,而' μ₀ '和' τ₀ '代表估计的平均值和精度,代表估计平均值的置信度。

此外,我们还可以做一些其他的简化:

  • 我们知道从插座返回的电荷量的方差为 1,因此精度' τ '也是 1。因此,套接字精度的更新简单地是 τ₀ = τ₀ + n,其中 n 是套接字已经被测试的次数,所以每次套接字被测试,我们简单地将其精度增加 1。
  • 对于估计的平均值,分子包含插座产生的所有输出的总和,乘以“ τ ”。正如我们在第 1 部分的 样本平均估计 一节中所看到的,保留奖励总额并不是一个好主意,因为这可能会增长到一个不可收拾的规模。然而,在我们的基本插座实现中,我们总是计算' Qₜ(a)' 、在时间步长 't '、【t29 的动作估计值' a ,其由下式给出:

  • 在这个等式中,‘rᵢ是在采取行动’a时在每个时间步获得的奖励,与上面更新等式中使用的术语“ xᵢ 相同。因此,我们可以简单地用' nQₜ(a)' 代替更新方程中的求和,最终得到以下简化的更新方程:

通过这些简化,我们驯服了可怕的数学!现在很清楚,我们需要做的就是保持对每个插座的回报的平均值和精度的估计,然后使用 2 个简单的规则来更新这些值。当这些等式被翻译成代码时,事情变得更加清楚。

高斯套接字实现

高斯汤普森采样套接字的相关代码如下所示。这保留了我们在以前的套接字类型中使用的所有基本功能,并为用于建模套接字输出的后验分布添加了参数和更新功能。

请注意,在这个更新函数中,我们用' self.n * self '替换了所有观察到的奖励的总和。问’。这给了我们完全相同的价值,而不必保留奖励总额,如前所述,奖励总额可能会增长到无法控制的规模。

上面等式中给出的两个更新函数转化为更新函数中显示的简单代码行。

其他需要注意的要点是:

  • ' sample '函数不是简单地返回' Q ',即套接字奖励值的估计值,而是返回一个从正态分布中采样的值,我们使用该值来模拟套接字输出(后验,平均值为' self.μ_0 ,精度为' self.τ_0 ')。
  • 与用于模拟二进制输出的插座输出的贝塔分布一样,我们希望我们的先验分布从接近均匀分布的分布开始,给出平坦的概率分布曲线,因此有可能返回具有广泛可能值的采样值。所以,最初我们把后验概率的精度设为一个很小的值( self.τ_0 = 0.0001 )。以这种方式,尚未尝试的套接字将更有可能被选择,很像乐观-贪婪算法。

如果你回头看看基本电源插座的代码,当插座被采样时,它返回的电荷量由围绕其真实平均值的正态分布给出:

在上面的 charge 函数中,numpy " randn "函数从均值为 0、方差为 1 的正态分布中返回一个随机值。通过将真实插座奖励值' q '加到这个值上,我们移动平均值以使分布集中在插座的实际输出上。

在 Thompson 套接字的示例函数中,可以看到一个非常相似的函数:

除了在这种情况下,法线以自身μ_0、后验平均值为中心。*另外可以看到 randn 现在除以后验精度 self.τ_0 的平方根。记住精度只是方差的一倍,方差是标准差的平方。因此,除以精度的平方根等于乘以标准差。这改变了分布的宽度,随着更多样本的出现,分布宽度减小,我们对估计的平均值变得更有信心。*

实验结果

与之前的伯努利实验一样,我们已经观察了 1000 多次的插座选择,如下面的概率密度曲线所示。由于后验分布从几乎平坦的曲线开始,在前 5 次试验中,5 个插座中的每一个都被测试一次。在此之后,插座 4(显示为红色曲线)主导进一步的试验。在测试结束时,它有一条以值 12(真实插座奖励值)为中心的又高又细的曲线,表明对该值的高度信任。

在前 200 次测试中,唯一一个被测试超过一次的插座是插座 5(紫色曲线,它的真实插座奖励是 10)。然而,它只测试了 3 次,因此具有小而粗的分布曲线,表明其值的可信度较低。

图 5.3:对 5 个电源插座使用正态分布的 Thompson 采样,真实回报值分别为 6、4、8、12 和 10。

图 5.3* 可以清楚地看到 Thompson 采样是如何快速定位并利用最佳插座的,而其他插座基本上未被测试。通过这种方式,算法设法返回一个大的、接近最优的累积奖励。*

汤普森抽样后悔

下面的图 5.4* 显示了使用 Thompson 采样算法处理我们的标准插座选择问题时获得的遗憾。*

正如在 UCB 算法中看到的,遗憾几乎为零,这意味着几乎总是选择最好的套接字。这也可以在累积奖励与时间的关系图中看到,其中实际获得的奖励与最优奖励非常接近,以至于被图上的这条曲线所掩盖。正如高斯汤普森采样的概率密度曲线所示,该算法快速锁定最佳动作,然后无情地利用这一点,导致非常低的后悔水平。

与 UCB 算法一样,汤姆逊采样可以被显示为具有对数遗憾,其中遗憾的值随着时间的推移下降到几乎为零。

(由于行动的数量非常少,而且每个插座的奖励值也不同,我们的实验中没有看到后悔的对数下降,因为我们已经接近零后悔了。)

图 5.4:标准插座选择问题的 Thompson 抽样遗憾。

要更深入地了解 Thompson 采样,请查看其用途和数学框架:

  • [汤普森采样教程](http://A Tutorial on Thompson Sampling Daniel J. Russo1)丹尼尔·j·鲁索等**

摘要

解决 bandit 问题的算法需要找到一种方法来平衡开发和探索之间的权衡。他们需要寻找最佳行动,同时努力利用他们已经获得的信息。

在简单的方法中,如 Epsilon-Greedy,这种权衡是通过主要使用当前给出最多回报的动作,并通过不时随机尝试一些其他动作来添加简单的探索来实现的。在更复杂的解决方案中,如 UCB,同样,平均回报最高的行动最常被选中,但这是由置信度来平衡的。这确保了不经常被选择的动作将得到测试。

汤普森取样采用了一种不同于其他方法的方法。它不是简单地维持对奖励的估计,而是逐步完善每个行为的奖励概率模型,并通过从该分布中取样来选择行为。因此,有可能得到一个行动的平均回报值的估计,加上该估计的置信度。正如我们在实验中看到的,这使它能够快速定位并锁定最佳行动,从而获得接近最佳的累积回报。

但是汤普森采样是最好的强盗算法吗,更重要的是,它是我们应该用来给婴儿机器人充电的算法吗?要知道这些问题的答案,你需要等到这个系列的最后一部分,当我们有强盗算法去头对头在最后摊牌!

***< Part 4:                                                   Part 6 >** [**UCB Bandit Algorithm**](/the-upper-confidence-bound-ucb-bandit-algorithm-c05c2bf4c13f)[**A Comparison of Bandit Algorithms**](/a-comparison-of-bandit-algorithms-24b4adfcabb)*

补充

我们已经研究了 Thompson 采样背后的理论,并研究了它如何应用于几个简单的问题。要了解如何进一步扩展,当数据来自具有未知均值和方差的正态分布时如何工作,请查看下面的文章…

* [## 使用共轭先验的 Thompson 采样

多武装匪徒:第 5b 部分

towardsdatascience.com](/thompson-sampling-using-conjugate-priors-e0a18348ea2d)*

以为你爱 Python?等到你遇到铁锈

原文:https://towardsdatascience.com/thought-you-loved-python-wait-until-you-meet-rust-64a06d976ce?source=collection_archive---------1-----------------------

意见

小众现象如何连续第五年成为 StackOverflow 最受欢迎的语言

有时候旧东西比你想象的更令人向往。妮可·盖里在 Unsplash 上的照片

“T “过去的技术拯救未来。”这是《铁锈》的创作者格雷顿·霍尔(Graydon Hoare)对他想要实现的目标的描述。

这是 Rust 的关键标志之一:使用学术界熟知但在当代编程语言中很少实现的技术。古老、可靠、有时被遗忘的技术。但最重要的是,它工作得非常好。

这些技术主要用于一件事:安全。

听起来很无聊?如果你问社区,它不是。根据今年的 StackOverflow 开发者调查,多达 86.1%的 Rust 开发者喜欢这种语言,这使它成为自 2016 年以来最受欢迎的语言。

你会认为软件开发人员是这个星球上最具创新精神的人。然而,Rust 与“快速移动并打破东西”咒语正好相反。然而,Rust 开发人员几乎肯定会学到他们以前从未听说过的概念。

从一些开发人员对代数数据类型的系统编程的新奇感到 Rust 自己的内存安全方法:每个开发人员都可以找到新的、非常有用的东西来学习。还有更多理由让爱上铁锈。

[## 你想学 Rust 但是不知道从哪里开始

Rust 初学者的完整资源

towardsdatascience.com](/you-want-to-learn-rust-but-you-dont-know-where-to-start-fc826402d5ba)

更高的内存安全性,无需垃圾收集

每种编程语言都面临着一个挑战,那就是如何安全有效地管理计算机内存。例如,Python 有一个垃圾收集器,在程序运行时不断寻找不再使用的内存并清理它。

在其他语言中,如 C 和 C++,程序员必须显式地分配和释放内存。因为所有与内存相关的问题都在程序运行前被清除了,所以这种方法对优化性能更好。

另一方面,内存是开发人员需要一直考虑的另一件事。这就是为什么用 C 写一个程序要比用 Python 长得多的原因之一,即使它在一天结束时做同样的事情。

Rust 走的是另一条路:内存是在编译时通过所有权系统分配的。这是一个干净利落的方法,可以确保不用的数据被清理掉,而不用强迫程序员一直考虑分配和释放内存。

Rust 使用旧技术进行有效的内存管理。安迪·福肯纳在 Unsplash 上的照片

基本上,所有权是三个规则的集合:

  1. Rust 中的每个值都有一个名为 owner 的变量。
  2. 一次只能有一个所有者。
  3. 当所有者超出范围时,该值将被丢弃,从而释放内存。

一个简单的例子是在 Rust 中指定一个向量:

fn main() {     
    let a = vec![1, 2, 3];     
    let b = a;                 
    println!("a: {:?}", b); 
}

在第二行中,创建了拥有者为a的向量[1, 2, 3]。此后,b成为了载体的主人。因为在 print 语句中调用了正确的所有者,所以该程序在执行时会编译并返回预期的结果:

a: [1, 2, 3]

另一方面,您可以尝试用它以前的所有者a来调用 vector,就像这样:

fn main() {
    let a = vec![1, 2, 3];
    let b = a;
    println!("a: {:?}", b, a);
}

在这种情况下,编译器抛出一个错误,因为第三行中已经删除了a。这个主题还有很多更深入的内容,但这是基本的想法。

相比之下,Python 会在第二种情况下运行。它的垃圾收集器只有在最后一次被调用后才会丢弃a,这对开发人员来说很好,但从内存空间的角度来看就不那么好了。

在 C 语言中,事情会稍微复杂一点:你必须为a分配内存空间,然后将它指向 vector,然后为b分配更多的内存空间,将b指向a,最后当你完成时,释放由ab占用的空间。

从这个意义上说,Rust 对内存的处理方式是开发速度和性能之间的折衷。虽然它不像 Python 那么容易编写,但是一旦你理解了所有权的概念,它也不会像 C 语言那样笨拙。

另一方面,效率是相当惊人的:例如,开发团队 Tilde 在 Rust 中重写了一些 JavaHTTP 片段后,设法减少了 90%的内存使用量

谁说铁锈不能吸引人?安娜斯塔西娅·塔拉索娃在 Unsplash 上拍摄的照片

静态打字不难看

这几乎是动态类型化和静态类型化之间的宗教战争。虽然用动态类型的语言来开发软件要容易得多,但是代码很快就会变得不可维护。这就是为什么 Python 代码与 C 语言相比很难维护的原因之一。

另一方面,必须声明每个变量的类型 C-style 会变得相当烦人。如果你曾经试图在 C 语言中使用一个返回float类型的函数中使用一个double,你就会明白我的意思。

Rust 走的是中间路线:它是一个静态类型系统,但它只需要程序员指定顶级类型,如函数参数和常数。在函数体内,允许 Python 风格的类型推断。

Rust 的一个特别有用的特性是它也有一个None类型。这允许您在编译时处理异常,从而保证程序在最终用户处平稳运行。考虑这个例子,我们可以得到一个人的全名,而不管他是否有中间名:

fn get_full_name(fname: &str, mname: Option<&str>, lname: &str) -> String { 
    match mname {
        Some(n) => format!("{} {} {}", fname, n, lname),
        None => format!("{} {}", fname, lname),
    } 
}fn main() {
    println!("{}", get_full_name("Ronald", None, "McDonald"));
    println!("{}", get_full_name("Dwight", Some("P."), "Eisenhower"));
}

虽然其他语言中也存在各种版本的None变通办法,但它以一种简洁的方式展示了 Rust 的雄心:不使事情变得太难编写,同时尽可能保持代码的持久性和可维护性。

一种巧妙的系统编程方法

虽然 Python 是一种通用编程语言,但 Rust 和 C 一样,绝对适合系统编程。虽然 Rust 不是为最终用户开发应用程序的理想语言,但它非常适合构建为其他软件提供服务的软件。

因此,效率是核心问题。零成本抽象就是最好的证明,它在解释代码的同时将内存使用保持在最低水平。正如 C++的发明者比雅尼·斯特劳斯特鲁普,:“你不用的东西,不用付钱。更进一步:你所使用的,你不可能比手工编码更好了。”

例如,考虑在 Python 中将 1000 以内的所有整数相加:

sum(range(1000))

每次代码运行时,它都会进行 1000 次迭代和添加——您可以想象这会降低代码的速度。相比之下,在 Rust 中考虑同样的事情:

(0..1000).sum()

这编译成常数499500。实际上,内存使用已经减少了 1,000 倍。

虽然这些抽象也存在于 C 语言中,但是 Rust 大量使用了它们——事实上,一个目标是尽可能多地向语言中添加零成本的抽象。从这个意义上说,Rust 有点像 next-level C。

c 已经存在了 40 多年,Rust 的目标也是如此。Rust 非常强调向后兼容性,以至于今天你仍然可以在 Rust 1.0 中运行代码。同样,如果你今天编写 Rust 代码,二十年后你仍然可以运行它。锈也不会生锈!

[## Rust-Powered 命令行实用程序可提高您的工作效率

您腰带下的现代快速工具

towardsdatascience.com](/rust-powered-command-line-utilities-to-increase-your-productivity-eea03a4cf83a)

一个小而不可思议的社区

Dropbox 强调安全性和可持续性,所有漂亮的细节都说明了这一点,难怪 Dropbox 用 Rust 重写了许多核心结构。Rust 的第一个大赞助商 Mozilla 在里面写了 Firefox 的重要部分。微软认为 C 和 C++ 对于关键任务软件不再安全,并在 Rust 上投入了越来越多的资金。

不仅仅是大公司,对 Rust 的热爱也转化到了个人程序员身上。尽管到目前为止,StackOverflow 的调查对象中只有 5%的人使用 Rust,但是这些开发者对这种语言非常感兴趣。

这是有原因的。不仅语言规范和编译器都考虑得很周全。有[rustup](https://rustup.rs)来安装和管理工具链。Cargo 是一个命令行工具,每个 Rust 安装都附带它,可以帮助管理依赖关系、运行测试和生成文档。

crates.io 供用户分享和发现图书馆,还有 docs.rs 供用户记录。有来自 Clippy 的编译器 lints 和来自 rustfmt 的自动格式化。

除此之外,还有官方和非官方的聊天,子编辑,用户论坛,StackOverflow 问题,以及世界各地的会议。对于一个把友好放在一切之上的社区,还有什么可要求的呢?

缺点是:在你会走之前需要先跑

Rust 令人沮丧的一点是高昂的启动成本。虽然在大多数语言中,你需要一到两天的时间来提高效率,但在 Rust 中,这更像是一两周的时间。

这是由于许多其他语言没有使用的新概念,以及编译时通常会有许多错误的事实。你需要在第一天就处理所有的异常,而不能像在 Python 中那样,只是写一段临时代码,然后运行并添加异常。

此外,由于 Rust 仍然很新,并不是所有你想要的库都已经存在了。除了官方文档和关于 StackOverflow 的各种问题,也没有那么多教程。

好消息是,一旦你学会了这些概念并编译好了你的程序,它就会像魔法一样运行。另外,考虑到向后兼容性,它应该还能工作 20 年。

考虑到你的代码的可持续性,以及 Rust 得到许多大公司支持的事实,尽管有缺点,一两周的前期学习可能是值得的。

这种铁锈不会使你的船沉没。马特·拉默斯在 Unsplash 上拍摄的照片

底线:无所畏惧地黑客

生锈是多于安全。但很难否认,它的许多核心概念旨在消除内存泄漏和其他安全问题。在这个软件决定一切的时代,安全是必须的。

每种即将到来的语言可能都有一席之地: Go 正在越来越多地占据 Python 和 Java 的空间, Julia 正在数据科学领域追赶 Python,Rust 正在 Python 和 C++领域成长。让 Rust 与众不同的是它不可思议的社区,它的创新特性,以及它被设计成可以在未来几十年内工作的事实。

还有很多工作要做,而 Rust 只能完成其中的一小部分。今天的新语言很有可能会存在一段时间,尽管其他语言也会在未来几年出现。但是如果我必须把我的牌放在一种语言上,Rust 将是一个安全的赌注。

编辑:正如Ketut Artayasa和推特用户don dish 指出,比雅尼·斯特劳斯特鲁普是 C++的发明者,而不是 C,这在这个故事的最初版本中是错误的。此外,当 C++的意思是 C#已经被提及。这一点也已得到纠正。

从数据和交易看新冠肺炎的影响力

原文:https://towardsdatascience.com/thoughts-on-covid-19-through-data-and-deals-85274cf9b826?source=collection_archive---------52-----------------------

透过科技第一的镜头审视冠状病毒如何永远改变了全球消费者行为和产品创新。

永远不会太安全!(图片由作者提供)

不用说,疫情破坏了我们 2020 年的所有计划。在宏观层面上,美国的失业率已经达到了历史最高水平,华尔街的股票已经暴跌,引发了一种恐慌的模式,这种恐慌可以与大萧条相媲美,我们敬爱的科技巨头上周已经迫不及待地开始工作。从微观层面来看,我们可能会在碰头会上笨手笨脚,不舒服地写在线考试,购买价格过高的卫生纸

这是一系列研究行业的第一部分,特别是通过技术优先的视角,研究一种名为 Corona 的病毒如何永远改变了全球消费者行为和产品创新。其目的是基于历史数据和推断预测,提供一个全面的行业概述。

第一部分:娱乐

我将分别考察电影和电视、音乐、播客、体育和游戏领域(预计会有重叠,因为科技让界限变得模糊)。我将总结我个人注意到的趋势,并以数据为依据。将有运行编辑。随着新冠肺炎的不断发展,我热衷于跟踪变化。根据数据和我的分析,我会对未来的前景做出预测,并提出我不知道答案的问题。

对于那些不擅长长篇阅读的人,我写了一篇并不短的 TLDR。参见最后一节。

电影和电视

2020 年 3 月 4 日,Quibi 完成了新一轮融资,使他们的总融资额达到了自 2018 年初创公司成立以来的 18 亿美元。在推出前一个月,独角兽公司宣传了其独特的 TurnStyle 观看技术,以及好莱坞明星主演的 175 场演出。所有 Quibi(“快速咬”)集将保持在 10 分钟以下。该公司和投资者认识到了这个新数字时代的一个转变,用户越来越喜欢消费短小、移动友好的内容。这一假设无疑是雄心勃勃的,不幸的是,它的高调遭到了新冠肺炎的反对。

在这个曾经风光无限的机构背后,是媒体巨头首席执行官杰弗瑞·卡森伯格。他在该行业拥有数十年的专业知识,并执导了迪士尼大片,如《狮子王》和《阿拉丁》。尽管签下了像勒布朗·詹姆斯和詹妮弗·洛佩兹这样的巨星,但上个月只有极少数的人下载了 Quibi)。

Quibi 是一个典型的例子,根据标准的创业剧本,它拥有成功所需的一切。一个能够执行愿景的强大团队,来自顶级风投的巨额投资,以及来自家喻户晓的品牌的签约,以产生公众对产品的关注。但是时机不对。

也就是说,Quibi 提出的论点肯定是有道理的。比以往任何时候都更重要的是,我们正在见证消费者对在手机上观看简短、随意的视频的巨大需求。根据研究公司 App Annie 的调查,Tik Tok 成为下载量最大的应用,全球安装量超过 20 亿。虽然不是“电影”行业的传统参与者,但抖音在改变和满足消费者对内容的持续时间、主题和类型的新口味方面发挥着重要作用。在家庭避难所订单之前,抖音正在崛起,但许多人认为,其爆炸性增长是由在家容纳无聊和精通技术的年轻人推动的。未来,我们能看到抖音制作的原创内容吗,类似于 Snapchat 的 Snap Originals ?今年早些时候,当病毒导致电影院关门和空无一人的时候,中国的同行豆音已经冒险在这个平台上首映完整版电影。

抖音的中文应用开始变得越来越像一个电影流媒体平台。(来源:斗印)

Quibi 卖点的第二部分是相信观众享受严格的纯移动观看体验。不用说,随着世界在国内捆绑在一起,这一趋势变得难以证实。根据尼尔森的一份报告,在美国,电视的总使用量预计将增长近 60%。在这种情况下,制作手机专用视频的制作人无法适应更大的屏幕。此外,尼尔森发现这些电视消费者一般更喜欢故事片和新闻,而不是轻松的内容。

要跟踪的重要趋势是,当前对短格式视频内容的偏好是否会持续,以及人们在户外跋涉后是否会继续看电视。

用户在 Instagram 上与朋友一起观看。(来源:Instagram 新闻稿)

另一方面,新冠肺炎引入了一些新的消费趋势。首先,社交和团体观看。这样做的选项一直存在(网飞派对扩展创建于 2019 年 1 月),但当我们都被限制在室内时,社交的需求大大促进了这一趋势。脸书用 Instagram 上的“共同观看”功能回应了,允许用户在一起观看 IGTV 或视频时进行视频通话。在某种程度上,这取代了看电影、网飞和与朋友一起放松的社交体验。随着用户被迫尝试这些新技术解决方案来与世界各地的亲人联系,这就提出了一个问题——这是否会对公司在制作新内容时考虑社交功能产生持久的需求?像网飞这样的流媒体服务可以很容易地嵌入一个类似家庭聚会的功能,允许朋友们在观看同一节目的同时聊天和社交。

自新冠肺炎疫情爆发以来,我注意到的第二个趋势是互动和自制视频内容的兴起。影响者和名人不再是利用直播功能和应用的主要用户。正常的网友都在 Instagram Live 和 Twitch 上跳来跳去。例如,舞蹈工作室正在举办在线课程,老师们可以直接从家里在社交媒体上直播。结果,毫无疑问,设置了一个更加非正式和随意的环境。Tory Lanez 是一名来自多伦多的艺术家,自隔离以来一直很忙- 在 Youtube Live 上举办了一场 2 小时的虚拟音乐会,并开始了“隔离电台”系列,这位说唱歌手邀请德雷克和威肯等明星谈论粉丝们希望的任何事情。托里的这些无脚本直播打破了 Instagram 直播观众 31 万的记录。Kehlani,一个突破性的 R & B 艺术家,在隔离期间也变得有创造力。她在后院拍摄了自己的专辑封面音乐视频。她的“隔离风格”音乐视频由凯拉尼在自己与世隔绝的家中亲自拍摄,迄今为止已经获得了超过 1100 万的点击量。尽管该视频的质量和制作预算明显低于正常水平,但粉丝们对其内容赞不绝口——表示他们喜欢看到更私人和亲密的一面。事实上,一些粉丝非常喜欢她自制的内容,以至于他们受到启发创作了自己的版本。

《好消息》的拍摄现场(来源:约翰·卡拉辛斯基/Instagram )

2020 年 3 月,吉姆·哈尔珀——我是说,约翰·卡拉辛斯基开始了一个名为“一些好消息”的网络系列,在那里他分享快乐的消息,并通过变焦电话采访他的名人朋友。这几集的剪辑起伏不定,克拉辛斯基在他的家庭办公室里放松,他女儿在他身后画了一个“SGN”的标志。然而,一些人评论说,克拉辛斯基的节目可以轻松地与任何专业制作的深夜电视节目相媲美。NBA 冠军多伦多猛龙队的中锋赛尔吉·伊巴卡停止了他的病毒式烹饪节目“你有多饿?”露天看台报道。相反,塞尔日展示了一个才艺展示的想法,这让他能够与有才华的粉丝联系,只在 Instagram Live 上。节目“你有多有才华?”类似于《一些好消息》中的寒意和《检疫广播》中低于平均水平的制作质量。

到目前为止,人们还是比较喜欢随意和亲密的自制内容。与拥有惊人预算的 4KHD 视频相比,用户忽略了这些内容较差的制作质量,并通过捐赠或参与生活本身积极做出贡献。我不禁想到,业余视频制作背后的流行是否会为工作室或网络未来不那么严肃和正式的节目制作铺平道路。本周,维亚康姆抢先报道了仅仅 8 周大的“一些好消息”,这是一个强有力的信号。

“我把所有的问题都归咎于冠状病毒,”卡曾伯格先生在接受《纽约时报》采访时就 Quibi 的低消费者兴趣表示。“一切。”

音乐

华纳音乐集团本周宣布,他们计划上市,对三大唱片公司之一的估值为 133 亿美元。华纳并不是唯一从音乐流媒体时代获益的公司。过去几年,由于 Spotify 和 Apple Music 等服务,整个音乐行业出现了复苏。然而,新冠肺炎有它自己的优点和缺点。

8 周内美国流媒体数据的变化。(来源:Axios )

三月份,美国的音乐流媒体连续三周下降,最低时达到 8.8%。月底,广告牌报道美国专辑销量下降了 29%。随着酒吧和零售店等公共场所的关闭,拉丁和嘻哈等流行和乐观音乐流派的数量急剧减少。相反,尼尔森音乐的一份报告显示,儿童音乐、民间音乐和古典音乐经历了一次回归——三月份的听众人数分别增长了 3.8%、2.9%和 1.5%。由于新冠肺炎效应,听众的行为正在发生变化。在同一份报告中,47%的受访者承认他们选择少听音乐,因为他们将时间分配给了其他形式的娱乐(如电视)。 Axios 呼应了这项研究指出用户在疫情期间更有可能放弃音频内容。

Coachella 是最大和最著名的音乐节之一,将于 2020 年 4 月的两个周末举行。三月,出席者醒来后得知原本由特拉维斯·斯科特主演的电影节被取消,或者至少被推迟到十月。从全球来看,从音乐节到巡演的音乐活动都被彻底取消了。自然,这对艺术家、组织者和场馆来说都是巨大的收入来源。

疫情将艺术家和媒体机构之间的合作推向了一个新的高度。由全球公民和世界卫生组织举办的虚拟音乐会“同一个世界:一起在家”吸引了 2100 万观众,同时在 ABC、CBS、ABC、CW、BBC、亚马逊 Prime Video、Hulu Plus、Instagram、Twitter、雅虎播出。与此同时,Travis Scott 与游戏公司 Epic Games 合作,在广受欢迎的视频游戏《堡垒之夜》上为超过 1230 万观众举办了一场音乐会。

由于公共活动不可能,音乐家们不得不寻求创造性的措施,通常是数字解决方案,来帮助赚钱。疫情无疑打开了大门,或者至少为内容创作者建立合作伙伴关系和协作提供了一个坚实的理由。经历过新技术带来的便利、规模和效率的艺术家可能会选择和他们呆在一起,即使新冠肺炎放松了。我们能想象一场使用新颖全息技术的现场音乐会吗?

对 Travis Scott 的堡垒之夜演唱会好评如潮。(来源:推特)

不幸的是,吃亏的是场地,不太灵活,成本更高。本地场馆,尤其是较小的仓库式场地面临的风险最大。这些场馆的商业模式通常为新兴艺术家提供亲密人群,在这段艰难时期,这种模式将使他们难以维持下去。在美国,11 个独立场馆告诉《纽约时报》,他们在没有政府援助的情况下最长可以存活 6 个月到一年。当地场馆不仅是艺术和文化的重要贡献者,也为年轻和有抱负的艺术家提供了接触粉丝的渠道。如果我们失去了场地,这些音乐家必须在社交媒体上投入更多,并探索其他数字途径来连接和分享他们的音乐。

尽管听众人数在下降,但这些突然的变化有利于音乐流媒体公司。音乐人及其唱片公司的收入越来越依赖于流媒体音乐和随之而来的版税支出。据报道,像 Spotify 这样的公司与三大唱片公司:环球、索尼和华纳的关系一直很冷淡。由于缺乏其他盈利方式,尤其是对那些没有 6 位数品牌代言合同的小艺人来说,音乐流媒体成为了一个非常重要的收入来源。随着艺术家越来越依赖流媒体服务,Spotify 等公司对唱片公司的谈判实力成倍增加。

2019 年,流媒体占环球音乐集团录制音乐收入的 61%。相比之下,Spotify 积极推进播客和其他非音乐项目,缓解了其对大型唱片公司的长期依赖。随着流媒体服务获得对唱片公司的影响力,这可能是他们开始支持自己的艺术家系列的最佳时机。Spotify 为艺术家提供了丰富的资源,但长期以来,人们一直怀疑 Spotify 会扩展业务,签约自己的音乐人,这对唱片公司构成了重大威胁。

最后,对音乐流媒体服务的严重依赖只会培养出同质化的艺术,而不是独特的人类灵魂。在这篇名为“创造力的自动化”的文章中,我分析了遵从 Spotify 的风险和不利之处

播客

这是一个很短的部分,针对目前仍感觉像音乐流的子集的不断增长的音频力量。

本月早些时候,Spotify 与乔·罗根签约,达成了一笔价值 1 亿美元的交易,独家出版他在国际上著名的 10 年播客《乔·罗根的经历》。此外,随着在最近一年花费超过 6 亿美元收购 Ringer、Gimlet Media、Anchor 和 Parcast,该公司已经显示出他们渴望领导播客世界。

起初,播客被视为新冠肺炎的直接受害者。根据 Podtrac 的数据,没有长途通勤,播客听众的数量在三月下降了 20%。然而,根据 Voxnest 的一份新研究报告,随着人们慢慢适应隔离,播客收听已经反弹。在许多国家,播客的收听基本上还未被开发,如意大利和西班牙,令人惊讶的是,在家提供了发现这种形式的机会。因此,播客已经证明了其作为一种独立的娱乐和媒体形式的潜力和能力。随着广告支出正常化,广告客户可能会越来越多地将音频视为一项有前途的营销投资

美国播客广告收入预测。(资料来源:彭博)

一个有趣的趋势是听众对喜剧类型播客的坚定偏爱。我预计会有相当多的听众转向基于新闻的播客,例如 NPR 的冠状病毒每日播客,但喜剧仍然停留在的头号位置,因为它是之前的。这告诉我,大多数时候,人们转向播客纯粹是为了娱乐和放松。不像上面提到的电视,它对时事表现出弹性和极大的敏感性。这种见解可能会影响未来的播客节目和决策。

总的来说,这是一个令人兴奋的领域,与市场潜力相比,它仍处于起步阶段。我期待着跟踪播客的势头,以及可能出现的创造力和合作伙伴关系。

比赛

老实说,庞大的游戏产业本身就应该有一个独立的部分。尽管如此,我将着重强调面向消费者的游戏趋势。

视频游戏市场正在蓬勃发展。在暗淡的市场中,任天堂正在增加其交换机生产以满足需求的激增,游戏平台 Steam 创纪录地有 2000 万并发用户登录,全球视频游戏市场预计价值 1590 亿美元

从去年开始,我就一直在观察手机游戏的前景。几乎没有受到新冠肺炎的影响,移动游戏收入预计将比 2019 年的预测增长 55.6%,到 2024 年将达到惊人的 980 亿美元。根据游戏产业的说法,新的数字比新冠肺炎之前对市场的预测高出 40 亿美元。随着人们被隔离在家中,我原本预计手机游戏会减少,而游戏机游戏会因此增加。然而,值得注意的是,在游戏机不被视为标准的亚洲国家(中国 [从 2000 年至 2015 年禁止销售视频游戏主机](http://anned sale of video game consoles) ),移动游戏填补了消费者的空白。

接下来,我分析了吸引最多用户的游戏类型。自疫情以来,游戏品味有所改变吗?在某种程度上。截至 2020 年 5 月, Sensor Tower 指出在全球封锁期间帮助人们联系的游戏正在经历上升。尽管如此,下载量最多的游戏仍然被超休闲和休闲游戏占据,比如《拯救女孩》从全球来看,用户在玩游戏时根本没有勒紧裤腰带。总收入最高的手机游戏是腾讯的 PUBG Mobile 和 Honor of Kings,这两款游戏在 4 月份分别获得了约 2.252 亿美元和 1.56 亿美元的收入。这与已确定的消费者对播客的偏好相一致,消费者更有可能纯粹为了娱乐而选择手机游戏,并选择投资硬核游戏的样本。****

疯狂流行和古怪的手机游戏,拯救女孩。(来源 :苹果应用商店)

我也见证了社交和多人游戏的上升趋势。禁止面对面的聚会促使人们尝试用电子游戏来消磨时间和保持联系。像 Jackbox 这样为一群朋友玩而建的公司,其流量“堪比一年中非常繁忙的感恩节周末”,首席执行官 Mike Bilder 说。因此,游戏开发商正在调整以适应新的现实,并加入新的或修改后的功能,让游戏玩家可以在舒适的屏幕上轻松社交。问题变成了——这是一个持久的消费者转变,还是我们暂时都感到孤独和无聊?

我与 Riot Games 的一名高级工程师进行了交谈,他提到,在公司的各个层面,一个持续的挑战是确保一款游戏拥有强大的社区和忠诚的追随者。他分享说,他相信大多数游戏玩家看重的是视频游戏社区,而不仅仅是游戏本身。对于 Riot 的《英雄联盟》( League of Legends)来说,这当然是正确的,它宣扬了一个庞大而专注的社区。从许多方面来看,新冠肺炎博彩业的繁荣表明了我们对归属感和社区意识的需求。这对享受用户数量收费的游戏巨头来说是一个好消息,因为新用户不太可能离开或退出游戏,即使在疫情之后,因为他们已经成为社区的一部分。

传统视频游戏价值链。(图片由作者提供)

最后,我想谈谈游戏公司构建价值链的增长趋势。在过去,传统的价值链会看到游戏工作室开发商将他们的作品发送给像艺电这样的出版商。从那里,游戏被列在像 Steam、Xbox 或 PlayStation 这样的市场上。正如哈佛商学院的教授在《哈佛商业评论》的播客中关于史诗游戏的讨论,随着角色的方便组合,链条中的界限正在迅速模糊。凭借虚幻引擎和 UE4 Marketplace,Epic 现在已经吸收了开发商、发行商和零售商的角色。随着许多工作室因新冠肺炎的增长而壮大,我怀疑游戏公司建立自己的生态系统并彻底消除中间商只是时间问题。

运动

不用说,这个空间实际上完全依赖于现场活动。本赛季各种职业体育联盟的取消,如 NBA,让球迷们无所事事,无精打采。

新冠肺炎时代的 ESPN 编程?(来源:Youtube )

付费电视生态系统中的每一个人,从消费者、分销商(康卡斯特,美国电话电报公司)、网络所有者(迪士尼,美国电话电报公司的华纳媒体)到广播频道所有者(辛克莱),都在失去没有体育直播的那一份蛋糕。4 月初,NBA、WNBA 和 ESPN 联手,试图通过明星球员配对骑马对抗来提供一种类似于现场篮球比赛的方式。霍斯吸引了 686,000 名观众。以一个月前举行的全国大学体育协会(NCAA)三月疯狂竞赛为基准,每年平均吸引 1000 万观众

如果职业联赛不打算很快在电视上重现,我们会看到网络合作伙伴或行业整合的增加吗?

“有线电视捆绑的真正粘合剂是直播体育,如果没有直播体育,价值定位就开始分崩离析,”美国消费者新闻与商业频道的莫菲特纳森研究分析师 Craig Moffett 说。

观看《马》的粉丝对此不以为然。(来源:推特)

有一次,NBA 敦促他们的球员准备在空荡荡的体育场打比赛,只允许“必要的工作人员”进入。“我们玩游戏没有粉丝?不,那是不可能的,”勒布朗·詹姆斯评论道。体育以不可逆转的重要方式为文化和身份做出了贡献。自 1995 年以来,多伦多猛龙队的超级球迷,也被称为巴蒂亚导航,参加了猛龙队的每一场主场比赛。当猛龙队晋级冠军时,不仅仅是他对球队的奉献和忠诚使他在加拿大成为病毒式的轰动。我们爱他,因为他代表了我们所代表的一切:一个多元化和勤劳的城市。因此,只有在这样的时候,我们才意识到球迷、球员和真正的比赛是多么不可分割。如果去掉观众,谁来给玩家赋能?主场比赛还有什么优势和意义?

我认为科技将会在拉近球迷与现场体育比赛的距离方面发挥重要而必要的作用。理解这一使命并站在解决这一使命最前沿的公司将成为体育界最新的领导者。NBA 已经与微软签约以改善球迷观看联盟的个性化体验。

2020 年 5 月,苹果以估计 1 亿美元收购了 VR 事件公司 NextVR 。从表面上看,这家科技巨头收购一家专注于活动编程领域的初创公司似乎有些奇怪。对该交易的深入分析将揭示出包括体育在内的所有直播活动的未来极其令人兴奋和充满希望的预览。next VR 与 NBA、美国职业棒球大联盟(Major League Baseball)和美国国家橄榄球联盟(NFL)建立了主要合作伙伴关系NextVR 是众多重新想象与新兴技术融合的直播体育的创业公司之一。Second Spectrum 开发了一款强大的机器学习软件,旨在通过人工智能和增强现实来彻底改变体育运动。凭借作为 NBA 官方供应商的合同,这家初创公司声称其技术可以最好地计算实时数据并显示统计数据,如特定球员在比赛中抢篮板或投篮的可能性。此外,类似视频游戏的覆盖层可以在游戏过程中嵌入,例如爆炸或烟火动画。当然,没有一个直播制作人能够以那样的速度和准确度更新内容。“但人工智能是,”联合创始人说

正如体育媒体顾问公司的创始人兼首席执行官道格·帕尔曼所说,“毫无疑问,年轻人的消费模式正在发生变化。”从社交媒体算法到网飞推荐,每天围绕在我们周围的个性化数量越来越多,令人震惊。到目前为止,体育在提供符合专业标准的个性化和互动内容方面已经落后了。目前的 NBA 9 年合同将于 2024-25 赛季到期。到那时,很可能连流媒体网络也会跃跃欲试,提出自己的竞价。渐渐地,正如我之前提到的,我看到娱乐领域越来越多的交叉。 NBA 总裁亚当·席尔瓦同意“[新消费者]想要塑造产品,以符合他们想要消费的东西。”正是通过像 Second Spectrum 这样的技术,可以帮助直播运动实现这一目标。

脸书新推出的游戏直播配套应用 Venue 的截图。(来源:苹果应用商店)

当我写这篇文章时,脸书的新产品体验(NPE)团队本周放弃了他们的第三个应用,名为 Venue ,这是一种围绕现场活动吸引粉丝的新方式。Venue 旨在充当体育赛事伴侣的“第二屏幕”,比如本周日的纳斯卡比赛,这将是脸书测试的第一场赛事。据报道,应用程序用户可以互相聊天,参与互动投票或提问。脸书的一举一动都受到业内人士的密切关注,因此我相信 Venue 正在围绕体育和直播活动设定完美的方向。

最近在四月,日本首相安倍晋三发出了严厉的警告,世界上最大的体育赛事可能不得不完全取消。当东京奥运会第一次被宣布推迟到 2021 年时,上了年纪的运动员表示失望和担心他们的身体要再保持一年的训练高峰。如果奥运会永远取消,我们可能不会看到许多获得奖牌的运动员重返 2024 年夏季奥运会。短跑运动员贾斯汀·加特林(39 岁)、艾莉森·菲利克斯(35 岁)都计划在东京奥运会后退役。2021 年,网球传奇罗杰·费德勒和小威廉姆斯将年满 40 岁。相反,如果东京 2021 成功进行,我想知道运动员的能力是否会因长达一年的延迟而降低,或因新合格新秀的加入而更具竞争力?

和游戏一样,我认为运动也需要建立一种强烈的社区意识。在我举的 Superfan 的例子中——他的存在和声音团结了全世界的猛龙球迷,提供了一种归属感。 Stadium Live,一款 8 个月前开发的移动应用,原本是一款直播体育赛事的辅助应用。当运动被取消时,团队必须迅速调整。相反,他们把自己打造成一个社区中心,让各种水平和热情的体育爱好者聚集在一起。职业体育游戏的缺席充斥着真正的应用程序用户在玩 FIFA 和 2k 等运动,而其他人则在观看应用程序。Stadium Live 的联合创始人兼首席技术官 Paul Xu 告诉我,他们的每日活跃用户和下载量因此大幅增加。因此,当职业体育回归时,我们必须在新生体育社区的基础上再接再厉,并认识到对于体育组织的整体发展而言,它们不是补充性的,而是强制性的。****

总之,体育有一些重要的东西,适用于所有形式的娱乐,我想与大家分享。体育游戏从来不仅仅是与其他联盟或网络竞争。事实上,他们不只是与不同类型的视觉流媒体内容竞争。最终,它们会与音乐会、遛宠物、家庭桌游之夜竞争。任何形式的娱乐或消遣,只要能够取代消费者心目中的首选,都是一个具有威胁性的竞争者。具体到体育赛事,随着直播赛事被无限期搁置,最忠实的球迷会发现自己被一系列竞争选项所诱惑。强调社区和互动对于建立对竞争对手的防御能力至关重要。关键是利用现有的技术和创意,重新吸引球迷享受升级的体育观看体验。

Zzzz ( 来源:Unsplash )

TLDR:

电影和电视

  • 目前,消费者对在手机上观看简短、随意的视频有着巨大的需求。要跟踪的重要趋势是,当前对短格式视频内容的偏好是否会持续下去,以及人们在户外跋涉后是否会继续看电视。
  • 新冠肺炎引发的新趋势是社交和团体观看,以及自制视频内容的兴起。它服务于这样的问题——这是否会产生一种持久的需求,让公司在制作新内容时考虑社交功能?此外,业余视频制作背后的流行会为工作室或网络未来不太正式的节目铺平道路吗(维亚康姆抢先报道了自制的“一些好消息”)?

音乐

  • 由于新冠肺炎,听众的行为正在发生变化。音频流整体下降,但就个别而言,非常规或小众类型的音乐流上升。
  • 疫情将艺术家和媒体机构之间的合作推向了一个新的高度。疫情无疑巩固了内容创作者建立伙伴关系和协作的理由。经历过新技术带来的便利、规模和效率的艺术家可能会选择和他们呆在一起,即使新冠肺炎放松了。
  • 我们正在失去当地的音乐场所,这是艺术和文化的重要贡献者。他们还提供了一个渠道,让年轻和有抱负的艺术家接近他们的粉丝。
  • 这些突然的变化有利于音乐流媒体公司。随着艺术家越来越依赖流媒体服务,Spotify 等公司对唱片公司的谈判能力成倍增加。Spotify 大举进军播客和其他非音乐领域,缓解了其对大型唱片公司的长期依赖。随着流媒体服务获得对唱片公司的影响力,这可能是他们开始支持自己的艺术家系列的最佳时机。
  • 最后,对音乐流媒体服务的严重依赖只会培养出同质化的艺术,而不是独特的人类灵魂。在这篇文章中,我分析了遵从 Spotify的风险和不利之处。

播客

  • 播客收听在 5 月份已经基本正常化。播客已经证明了其作为一种独立的娱乐和媒体形式的潜力和能力。随着广告支出正常化,广告客户可能会越来越多地将音频视为一项有前途的营销投资。
  • 数据表明,大多数时候,人们转向播客纯粹是为了娱乐和放松。不像电视对时事表现出弹性和极大的敏感性。这种见解可能会影响未来的播客节目和决策。
  • 与我认为有能力实现的巨大增长相比,播客领域仍为时过早。

赌博

  • 手机游戏一如既往地蓬勃发展。同样感谢那些游戏机不被视为标准的国家,手机游戏填补了消费者的空白。
  • 在全球封锁期间,帮助人们联系的游戏正在兴起。游戏的消费者数据与对播客的偏好一致,消费者更有可能纯粹为了娱乐而选择手机游戏,并选择投资硬核游戏的样本。
  • 社交和多人游戏(如 Jackbox)有一个向上的轨迹。
  • 比起游戏本身,游戏玩家更看重游戏社区。在许多方面,新冠肺炎游戏的繁荣表明了我们对社区意识的需求。这对享受用户数量收费的游戏巨头来说是个好消息,因为如果新用户已经成为社区的一部分,即使在疫情之后,他们也不太可能离开或退出游戏。
  • 由于新冠肺炎的增长,许多工作室正在扩张,我怀疑游戏公司建立自己的生态系统并彻底消除中间商只是时间问题。

运动

  • 到目前为止,任何直播运动副本的首次亮相都以惨败告终(例如 NBA 马)。如果职业联盟不打算很快在电视上重现,我们会看到网络合作或整合的增加吗?
  • 新冠肺炎再次证明了球迷、球员和真实的比赛是多么的不可分割。我预测,技术将在拉近球迷与现场体育比赛的距离方面发挥重要而必要的作用。理解这一使命并站在解决这一使命最前沿的公司将成为体育界最新的领导者。许多初创公司正在重新想象与新兴技术融合的直播体育。
  • 到目前为止,体育在提供符合专业标准的个性化互动内容方面已经落后了。这需要改进(脸书 NPE 团队的场地是一个开始)。
  • 社区很重要。当体育直播回归时,我们必须在新生的体育社区的基础上发展,并认识到它们不是补充,而是体育组织作为一个整体蓬勃发展的必要条件

总体

  • 在疫情之后,如果组织、艺术家和传统公司选择进一步探索新兴技术在多大程度上有助于增强他们的产品,我不会感到惊讶。新冠肺炎变相地成为了怀疑者和风险规避者实施数字解决方案的推动者。这让许多人发现了技术可以提供的轻松、便利和规模。
  • 娱乐机构永远无法计算他们的竞争对手。体育游戏从来不仅仅是与其他联盟或网络竞争。最终,他们与现场音乐会、桌游之夜和公园散步竞争。任何形式的娱乐或消遣,只要能够取代消费者心目中的首选,都应该被认为是一种有价值的威胁。是什么让别人转而选择你的产品?花时间在体验中建立社区和个性化对于建立粘性和抵御竞争对手的能力至关重要。

感谢阅读!

我还经营一份时事通讯《快照》,报道我们都很好奇的科技公司的简介:【https://diane.substack.com/

希望被困在家里能激励我今年创作出 1 篇以上的作品,获得多产作家的头衔。

其他由我创作的一年一次的作品:

创造力的自动化 & 一看机器人学

关于寻找数据科学项目的思考

原文:https://towardsdatascience.com/thoughts-on-finding-a-data-science-project-d4b74893f50?source=collection_archive---------68-----------------------

有时候你需要在工作中把一个项目交给别人,这没什么。

照片来自像素上的加布里埃拉·帕莱

让我们面对它;我们的项目是我们的宝贝。他们离我们很近,我们想继续为他们工作,我们看到了他们的价值。每个项目都增加了我们提供的数量,我们并不总是想分享这些工作。但是,如果有人走过来,想从你这里拿走你的新项目怎么办?你会让他们这么做吗?

在工作中,我开始从事一个项目,以一种新的方式结合分析结果并分析它们的表现。我认为这可能是一个令人兴奋的项目,并让我熟悉我们迄今为止的分析。当我开始这个项目时,我主持了几次与不同人群的会议,以了解他们的用例以及他们最终将如何使用代码。我想确保我尽可能地理解以一种可用和可扩展的方式开发作品的架构。我没有准备的是这个项目的最后一次会议。

最后一次会议包括两名数据科学家,他们将是代码的最终用户,还有一名软件开发人员,我认为他可能对如何推进这项工作有一些很好的见解。我没有准备好让他们取消会议并要求尽快打电话。这个电话是为了表达他们对提议的工作的兴奋,以及他们在找到一个将为团队提供价值的激情项目后的感受。打完这个电话后,我开发了一系列用户故事,这些故事将用于他们现在拥有的这个功能。我们在当天晚些时候见了面,在下一次 sprint 之前,我们已经计划好了他们将如何开始开发这段代码。

经过多次会议,对手头工作的讨论,以及一次冲刺规划会议,我认为我将从事的项目不再是我的了。这没关系。坐下来反思这种情况后,我明白了一些事情。

你可以放下你认为你会做的项目。

项目在工作场所来来去去,但有时那些项目会去找其他开发人员或数据科学家。你需要退后一步,明白什么时候可以放手,让别人来承担这项工作。在我的例子中,很明显,这个开发人员已经找到了他们热爱的东西,并且他们觉得可以为团队提供价值。我没有保留这个项目,而是让他们承担工作并享受其中。要明白这些时刻会来到你身边,你需要决定接下来的步骤。你是把项目交给别人,还是自己留着?

你会发现你需要支持你的团队的时刻,你应该支持他们。

这一刻是我第一次意识到,作为团队领导,我需要确保我的队友的声音被听到。后退一步来评估情况,并与该开发人员一起定义工作范围,这使我们能够彼此一对一地交谈。这段时间允许对拟议的工作进行公开和坦诚的讨论。我们讨论了这项工作如何使团队受益,以及开发人员与其他人和他们的工作相比感觉如何。

坐下来听听这个人对情况的看法,让我更深入地了解了他们是如何看待这个团队以及他们的贡献的。很明显,他们开始感觉到他们没有提供足够的有价值的工作,即使我们之外的其他团队也在利用他们的贡献。后退一步,认清这些时刻。与你的同事交谈,更好地了解他们对工作的感受。他们认为自己贡献不够还是自己的工作不被重视?你能做些什么来和他们合作吗?你可能不知道所有的答案,但你可以开始对话。

允许其他人参与你的项目可能有助于你进一步的工作。

在退出这项工作,让其他人接手之后,我们继续讨论最终产品如何用于不同的用例。这些讨论引出了我脑海中的一个原始用例,我们谈得越多,我就越能看到一个新项目的远景在发挥作用。最后,由其他开发人员接管的工作让那个人很高兴,因为他们的项目对团队很有价值。这项工作让我为设想的下一个项目写了更多的用户故事,并规划了未来的冲刺,将开发人员的工作纳入其中。

摘要

总而言之,我放弃了一个我想做的项目,它给了我比我所要求的更多的东西。随着项目的开始,我得到了一个快乐的开发人员,他们正在为一个充满激情的项目而工作,并且在他的开发被添加后,为未来的工作规划了一个新的项目。至于我自己,我转向了其他给我带来一些独特挑战的事情。

  • 退一步,理解你可能不会总是做你认为你会做的事情。一个项目可能会交给另一个人,或者完全停止。它发生了,它会没事的。
  • 与你的队友交谈。他们可能对自己为团队做出的贡献或增加的价值有某种感觉。你可能不知道所有的答案,但你可以开始对话。
  • 允许他人从事他们热爱的工作可能会给你带来积极的或意想不到的结果。你可能会发现新的工作用例,新的项目想法来自它们,甚至是意想不到的挑战。

有时候需要把一个项目让给别人,也没关系。

数千个 CSV 文件,Keras 和 TensorFlow

原文:https://towardsdatascience.com/thousands-of-csv-files-keras-and-tensorflow-96182f7fabac?source=collection_archive---------20-----------------------

操作方法

如何应对这个地狱的指南

我有大约 15 000 个 CSV 文件,每个文件有 6 000 行,我需要使用所有这些数据训练一个神经网络:总共大约 90 000 000 个实例。真正的机器学习就是这个样子!

我希望我能节省你的时间,告诉你如何使用generatorstf.data.Dataset和其他有趣的东西来训练神经网络。

他们喜欢你。图片作者:丹尼斯·希洛夫(就是我)。

介绍

没有办法将所有这些数据连接到一个文件或一个数组中,因为它会非常庞大。

因此,处理这个庞大数据阵列的唯一方法是分批处理:

  1. 我们得到一份文件清单
  2. 我们把它分成训练和测试数据集
  3. 然后,我们使用一些东西将数据分批放入 Keras

简单的部分

心寒,那真的很容易。重要通知:所有文件都应该在一个目录中,这样代码才能运行。

棘手的第一部分

分批处理有几种方法。

例如,方法之一是使用generator。它是一个返回迭代器的函数,我们可以遍历它的值:一次一个值。

默认情况下,Keras 允许我们将这个generator传递给.fit

所以让我们写迭代器吧!

很简单:你传入了files数组和batch_size,相应的inputoutput现在被返回。

然后,您可以通过以下方式初始化您的生成器:

batch_size是一次返回多少行。通常,您可以像初始化单个 CSV 中的行数一样初始化它,但是如果这个数字太大,那么就设置一个不那么大的值(我不知道,例如 5 000)。

你符合一个模型。

callback_list是监测训练的某个参数开始下降是否太慢,没有理由继续训练的东西。

steps_per_epoch告知何时需要开始新的纪元。如果您不提供它,Keras 将不会知道您的数据长度,并将在日志中打印“未知”。

use_multiprocessing表示是否要在多个线程中处理数据。

workers是若干个这样的线程。这个数字应该小于 CPU 的核心数。

x是你的发电机。因为它既返回输入又返回输出,所以我们不设置y

verbose是日志有多详细。

因为你有几个过程预处理数据进行训练,他们把这些数据添加到 Keras 的某个地方,让他们训练神经网络。而max_queue_size指定了已存储但尚未处理的数据数量的限制。您应该设置它,因为没有必要预处理超过 Keras 一次可以消耗的数据:您的数据集非常大,内存将会过载。

epochs是 Keras 对数据集进行迭代的次数

validation_data是你将要用来验证准确性的数据。

validation_stepssteps_per_epoch意思相同。

棘手的第二部分

所以你试着开始训练,你看…你看…

图片作者:丹尼斯·希洛夫(就是我)

现在让我们更深入:我们将使用tf.data.Dataset。处理数据集是一件特殊的事情:实际上,这也是不言自明的。

在我们的generator中有一个简单的方法可以做到这一点Dataset

我们用generator传递这个 lambda,因为它应该是一个可执行的东西,我们需要在generator中传递一些参数。

output_types是你的generator在输入和输出中产生的东西。换成你的。

output_shapes是输入和输出的形状。换成你的。

重要: **NOT** [[None, 129], [None, 3]], **NOT** [(None, 129), (None, 3)]. **It is** ([None, 129], [None, 3])

我们没有设置,因为我们不想设置第一维。

最后一档

.fit中的x替换为等于train_dataset并将validation_data替换为等于test_dataset

现在开始训练,它应该工作得很好。

结尾部分

希望我已经帮助了一些人,祝你们的项目好运,伙计们:)

实际上,如果你现在不知道如何使用这篇文章——把它保存在某个地方以备后用,因为有一天你肯定会需要它。

这个巨大的 CSV 编号及其正确处理的问题出现在我的项目 Facel 的开发过程中。

我们开发了一种设备,用于监控健康参数(机体疲劳、眼睛疲劳、压力、有效性和注意力水平),并根据耳后 2 个点的信号控制小工具(例如,眨眼 3 次并停止音乐)。

我们以 98%的准确率检测 12 种面部表情(眨眼、动眉毛等)。

目前,我们正在迪拜设计周的主要节目之一 GlobalGradShow 上展出。全世界毕业生的 100 个最具创新性的项目在那里展示,所以很酷。

我们还赢得了全球创业挑战赛的俄罗斯赛段,并参加了詹姆斯·戴森奖(世界主要工业设计竞赛之一)的世界赛段。

请随时通过 LinkedIn电子邮件电报:)联系我

深层 RL 的三个方面:噪声、高估和勘探

原文:https://towardsdatascience.com/three-aspects-of-deep-rl-noise-overestimation-and-exploration-122ffb4bb92b?source=collection_archive---------23-----------------------

噪音的两面。噪音是有害的,它会导致系统性的高估。然而,噪声可能是有用的,例如用于探索的噪声。

资料来源:123rf.com

深度强化学习模型中,我们触及了噪声的各个方面。第一部分讨论高估,即噪声产生的有害属性。第二部分处理用于探索的噪声,这是有用的噪声。在附录中,我们将再看一个噪声的例子:自适应噪声

第一部分。我们将看到研究人员如何试图克服模型中的高估。第一步是将动作选择动作评估分离。双 DQN 中实现。第二步与行动者-批评家架构相关:这里我们将价值神经网络(批评家)与策略神经网络(行动者)解耦。 DDPGTD3 都采用这种架构。

第二部分。探索是学习的一大挑战。的主要问题是的探索噪音。 我们涉及的车型有 DQN双 DQN、T42、和 TD3 。使用一些噪声参数的神经网络模型具有更多的探索能力,并且在深度 RL 算法中更加成功。

附录。我们考虑简单的无梯度算法爬山。该算法将 自适应噪声 直接添加到输入变量中,即添加到确定神经网络的权重矩阵中。

第一部分。努力克服高估

DQN双 DQN 算法在离散动作空间的情况下证明是非常成功的。然而,已知这些算法遭受高估。这种有害的属性比低估要糟糕得多,因为低估是不会累积的。让我们看看研究人员是如何试图克服高估的。

高估在DQN

问题是在计算目标值***Gt*** 时使用了最大化运算符。假设***Q*(*S*_{*t*+1*}*, *a*)**的评估值已经被高估。然后从 DQN 关键方程(见下文)中,代理观察到***Q*(*S*_*t*, *a*)** 的误差也会累积。

DQN 关键方程 Q(s_t,a_t)

在这里,[***Rt***](/how-the-bellman-equation-works-in-deep-reinforcement-learning-5301fe41b25a) 是当时的奖励[***t***](/how-the-bellman-equation-works-in-deep-reinforcement-learning-5301fe41b25a)***;***``[**Gt**](/how-the-bellman-equation-works-in-deep-reinforcement-learning-5301fe41b25a)是累计奖励也称为TD-target;* Q(s,a) 是形状**[space x action]**Q-值表。*

Thrun 和 Schwartz 在“Issues in use Function Approximation for Reinforcement Learning”(1993)中观察到,使用函数逼近器(即神经网络)而不仅仅是查找表(这是 Q -learning 的基本技术)会对输出预测产生一些噪声。他们给出了一个例子,其中高估渐进地导致次优政策。

脱钩于双 DQN* *

2015 年,哈塞尔特等人。艾尔。在“ 使用双 Q 学习的深度强化学习 ”中显示,估计误差会驱使估计值上升并远离真正的最优值。他们假设减少高估的解决方案:双 DQN* 。*

双 DQN* 中所做的重要事情是将动作选择从动作评估中分离出来。让我们弄清楚这一点。*

DQN 和双 DQN Gt 公式

  • DQNGt 公式:用于动作选择Q-***Q*(*S*_*t*, *a*)**(红色)和用于动作评估*(蓝色)的 Q-***Q*(*S_t, a*)**同一个神经网络**和***θ_t***确定。*
  • Gt 双 DQN 公式:用于动作选择Q 值和用于动作评估Q- 值由两个不同的神经网络确定,神经网络的权重向量分别为***θ_t******θ'_t.*** 这些网络称为当前和*目标。*

然而,由于缓慢变化的策略,对当前目标* 神经网络的值的估计仍然过于相似,并且这仍然导致一致的高估。*

优评建筑DDPG**

DDPG第一个尝试使用Q-连续动作空间 DQN 模型学习技术的算法之一。 DDPG 代表 深度确定性政策梯度 。在这种情况下,我们不能在所有操作中使用 Q 值的最大化算子,但是,我们可以使用函数逼近器,一个代表 Q 值的神经网络。我们假设存在某个函数***Q*(*s, a*)**,该函数相对于动作自变量***a.***是可微的,然而,对于给定的状态***S_t*** ,在所有动作***a*** 上找到**argmax(*Q*(*S*_*t*, *a*))**意味着我们必须在每个时间步求解优化任务。这是一项非常昂贵的任务。为了克服这一障碍,来自 DeepMind 的一组研究人员在作品“ 用深度强化学习进行连续控制 ”中使用了演员-评论家架构。他们使用了两个神经网络:一个和之前一样,在DQN:Q——网络代表Q——值;另一个是演员函数* 𝜋( s ) ,它提供 a *,值函数***Q*(*s, a*)**的最大值如下**:***

演员功能t57】𝜋(s)

第二部分。探索是学习的一大挑战

为什么要探索?

除了高估之外,深 RL* 还有一个问题,难度不亚于。这就是探索。我们不能无条件地相信 q 表的最大值或 a* = 𝜋(s).的值为什么不呢?首先,在训练初期,对应的神经网络还是“年少无知”,其最大值与现实相差甚远。其次,也许而不是最大值会引导我们在艰苦训练后找到最优策略。*

在生活中,我们经常要解决以下问题:走别人走过的路——风险小,回报少;或者冒着巨大的风险走上一条未知的新路——但是,在某种程度上,大获全胜是可能的。也许它会超级棒,你不知道。

勘探与开采

Exploitation 是指代理使用积累的知识来选择接下来的动作。在我们的例子中,这意味着对于给定的状态,代理找到最大化Q-值的以下动作。探索表示随机选择后续动作。

没有规则可以决定哪种策略更好:探索还是开发。真正的目标是在这两种策略之间找到真正的平衡。正如我们所见,平衡策略在学习过程中会发生变化。

探险于 DQN双 DQN**

DQN双 DQN* 中保证充分探索的一种方法是使用退火[**ε**](/a-pair-of-interrelated-neural-networks-in-dqn-f0f58e09b3c4)-贪婪机制。对于第一集,以小概率选择开发,例如**0.02**(即,将非常随机地选择动作),以概率**0.98**选择探索。从一定数量的剧集**Mε**开始,以最小概率**ε_m,**进行探索,例如**ε_m*=* 0.01,**,以概率**0.99.** 选择开发,探索的概率公式**ε**可以实现如下:*

退火**ε**——贪婪机制,探索概率公式* **ε***

其中***i*** 为集号。设**Mε = 100, ε_m = 0.01.** 那么探索的概率**ε** 如下:

概率从 1 逐渐降低到 **ε_m =** 0.01

探险DDPG**

在具有连续动作空间的 RL 模型中,应用代替**ε**-贪婪机制。这种方法用于PPO等连续控制算法。【DDPG】(Lilli crap et al .,2015) 的作者通过将从噪声进程***N*** 中采样的噪声添加到演员策略**𝜋(s)**中,构造了无向探索策略**𝜋’** :******

政策**𝜋(s) with exploration noise**

其中 N奥恩斯坦-乌伦贝克给出的噪声,相关噪声过程。在TD3 论文作者(藤本 et。艾尔。,2018)提出使用经典的高斯噪声,这是引用:

…我们使用偏离策略的探索策略,添加高斯噪声 N(0;0:1)到每个动作。与 DDPG 的原始实现不同,我们使用不相关的噪声进行探索,因为我们发现从奥恩斯坦-乌伦贝克(乌伦贝克&奥恩斯坦,1930)过程中提取的噪声没有提供性能优势。

DDPG 的一个常见故障模式是,学习到的Q-函数开始高估Q-值,然后策略(actor 函数)导致重大错误。

探索中的 TD3 中的

名称 TD3 代表孪生延迟深度确定性TD3 保留了 DDPG 中使用的演员-评论家架构,并增加了 3 个新属性,极大地帮助克服高估:**

  • TD3 维持着一对影评人 Q 1 和 Q 2(因此得名“双胞胎”)以及一个演员。对于每个时间步长, TD3 使用两个 Q 值中较小的一个。****
  • TD3 更新策略(和目标网络)的频率低于 Q 函数更新(每两次 Q 函数(批评者)更新一次策略更新)
  • TD3 给目标动作添加探测噪音。 TD3 使用高斯噪声,而不是像 DDPG 中的奥恩斯坦-乌伦贝克噪声。

【PyBullet 料斗试验中的探测噪音

PyBullet 是基于Bullet Physics SDK的用于机器人学的 Python 模块和 Deep RL让我们看看 HopperBulletEnv,它是 PyBullet 与铰接体相关的环境之一:**

受过训练的特工

如果达到的分数超过 2500,则 HopperBulletEnv 环境被视为已解决。在使用 HopperBulletEnv 环境的 TD3 试验中,我得到了**std = 0.1****std = 0.3**的以下结果:

HopperBulletEnv 的两次试验,TD3,噪声标准值= 0.1 和 0.3

这里,**std**TD3 中勘探噪声的标准差。在两次试验中,阈值 2500 都没有达到。然而,我注意到以下奇怪之处。

  • 在试验**std = 0.3**中,在 2500 附近有很多值(然而小于 2500 ),同时平均值一直在下降。对此的解释如下:小值的数量多于大值的数量,并且这些数量之间的差异增大。
  • **std = 0.1**试验中,平均值达到较大值,但总的来说,这些值会降低。同样,这是因为小值的数量比大值的数量多。
  • 在我看来,非常小的值的流行与太大的噪声标准偏差有关。然后我决定把**std**减少到**0.02**,这足以解决环境问题。

HopperBulletEnv 带 TD3,噪声标准值= 0.02

App。具有自适应噪声的爬山算法

张量的先行者

我们举例说明应用于 翻筋斗环境爬山算法的特性。这里的神经网络模型非常简单,不使用张量(没有 PyTorch ,没有 Tensorflow ),神经网络只使用形状最简单的矩阵**[4 x 2]**,那就是张量的前身。**

爬山算法中的类策略

爬山算法寻求最大化目标函数 **Go**,在我们的特定情况下,它是累积折扣奖励:**

累计折扣奖励

其中***γ***折扣**0 < *γ <* 1** ***Rk***为该集时间步***k*** 获得的奖励。Python 中的目标函数**Go**如下所示:**

***discounts** **= [gamma**i for i in range(len(rewards)+1)]
Go = sum([a*b for a,b in zip(discounts, rewards)])***

一如既往地在深 RL 中,我们试图超过某个阈值。对于横竿-v0* 来说,这个阈值分数是**195**,对于横竿-v1 来说是**475**爬山是一种简单的无梯度算法(即,我们不使用梯度上升/梯度下降方法)。我们试图通过使用特定的自适应噪声仅改变目标函数**Go**的参数来爬上曲线的顶端。但是,我们的目标函数的自变量是什么呢?***

**Go**的参数是权重矩阵,它决定了我们模型中的神经网络。第 0-5 集的权重矩阵示例如下:

第 0-5 集神经网络的权重向量【4x 2】

自适应噪声标度

我们的模型的自适应噪声缩放实现如下。如果目标函数的当前值比为目标函数获得的最佳值更好,我们用**2**除以噪声标度,并且该噪声被添加到权重矩阵中。如果目标函数的当前值比获得的最佳值差,我们将噪声标度乘以**2**,并且该噪声被添加到权重矩阵的获得的最佳值。在这两种情况下,噪声标度被添加了对于矩阵的任何元素都不同的一些随机因子。**

噪音等级和剧集评分图

对于cart pole-v1如果权重矩阵初始化为非零小值(见左上矩阵),则集数= **112**。注意,如果权重矩阵被初始化为零,则情节数从**112**增加到**168**。同样适用于 Cartpole-v0**

关于具有自适应噪声缩放的 Cartpole-v0/Cartpole-v1 的更多信息, 参见 Github 上的项目**

噪声等级的更通用公式

正如我们在上面看到的,噪声比例根据目标函数是低于还是高于获得的最佳值而自适应地增大或减小。这个算法中的噪声尺度是**2**。在论文 中参数空间噪声的探索 作者考虑了更一般的公式:

自适应噪声标度

其中***α*** 是噪声尺度,***d*** 是扰动和非扰动策略之间的某个距离度量,***δ*** 是阈值。在附录 C 中,作者考虑了算法 DQNDDPGTPRO 的距离函数***d*** 的可能形式。

参考文献

***[1] S.Thrun 和 A.Schwartz,使用函数逼近进行强化学习的问题,(1993),卡内基梅隆大学,机器人研究所

2 H.van Hasselt 等人。艾尔。,采用双 Q 学习的深度强化学习(2015),arXiv:1509.06461***

[3] T.P. Lillicrap 等,深度强化学习的连续控制(2015),arXiv:1509.02971

[4]李玉玺,深度强化学习:概述(2018),arXiv:1701.07274v6

[5] S.Fujimoto 等人,在 Actor-Critic 方法中解决函数近似误差(2018),arXiv: arXiv:1802.09477v3

[6]带参数噪声的更好探索,openai.com,https://open ai . com/blog/Better-Exploration-with-Parameter-Noise/

***[7] M.Plappert 等著《用于探索的参数空间噪声》,OpenAI,arXiv:1706.01905v2,ICLR 2018

【8】B . Mahyavanshi 著《爬山入门|人工智能》,Medium,2019***

[9]深度确定性策略梯度,OpenAI,Spinning Up,https://Spinning Up . open ai . com/en/latest/algorithms/ddpg . html

***【10】机器学习中的随机是什么意思?(2019),机器学习掌握,
https://machinelingmastery . com/random-in-Machine-Learning/

【11】c . Colas et .艾尔。、GEP-PG:深度强化学习算法中的解耦探索与利用(2018),arXiv:1802.05054***

[12]https://en.wikipedia.org/wiki/奥恩斯坦-乌伦贝克_ 过程,奥恩斯坦-乌伦贝克过程

[13] E.Lindwurm,直觉:探索与利用(2019 年),走向数据科学

[14] M.Watts,用于新闻推荐的强化学习介绍(DDPG 和 TD3)(2019),TowardsDataScience

[15] T .斯塔福德,学习的基础:探索-开发权衡(2012 年),https://tomstafford.staff.shef.ac.uk/?p=48

***[16]子弹实时物理模拟(2020),https://pybullet.org/wordpress/

【17】R . Stekolshchik,一对相互关联的神经网络在 DQN (2020),走向数据科学***

[18] R.Stekolshchik,贝尔曼方程在 Deep RL 中是如何工作的?(2020 年),走向数据科学

人工智能产品生命周期的三大挑战

原文:https://towardsdatascience.com/three-challenges-of-the-ai-product-lifecycle-810fcd4d5085?source=collection_archive---------29-----------------------

从事人工智能产品的工作——无论是零售、物联网还是营销——数据科学家都面临着类似的挑战。这些挑战中有些是许多技术领域的共性,有些是人工智能特有的,因为它的独特方式模糊了最先进的研究和应用开发之间的界限。让我们看看在业务规范、分析的迭代开发和测试领域中这些挑战的三个典型例子。

业务需求规范

挑战

我们数据科学从业者最常谈论的话题之一是如何制定业务需求的问题。这可能会带来各种各样的挑战,取决于人们的观点。在一个极端,我们通常喜欢宣称,是企业的负责人(首席执行官、董事会、营销团队、销售团队、产品经理等)。)不知道自己想要什么。这是一个令人沮丧的地方。另一方面,我们经常自夸(没有一丝自怜的意思)业务部门委托我们建造类似于时间机器或传送管的东西。你可以想象,这也不是一个令人羡慕的地方。

作者利用https://imgflip.com/创造的模因

解决方案

虽然这两个问题表面上看起来明显不同,但其根本原因实际上是相同的。简单来说,每个开发项目都有价值和成本。商务人士通常知道事物的价值。但在 AI 领域,成本要事先想清楚困难得多。这太难了,甚至对我们来说都是一个挑战,只要想想你有多经常在 scrum poker 中为一个故事而努力想出要显示的数字。在开发阶段有太多的未知,尤其是当我们瞄准前沿的时候。尽管如此,我们数据科学家是拥有最多信息的人,因此对开发成本有最广泛的看法,所以我们有义务分享我们所知道的。当然,业务领导可能会反对,所以我们可能会被迫接受一个不太复杂的解决方案。然而,如果没有企业和研发之间的双向沟通联系,企业要么会停滞不前(见问题 1),要么会匆忙做出决定,选择将自己的命运押在一些显然有价值的事情上(但可能无法实现,见问题 2)。因此,作为数据科学家,我们不应该只是等待规范的到来。当务之急是我们要忘记瀑布般的需求文档,开始这样的双向对话,这将产生一个既可行又有价值的产品。

相关的一点是“及时决策”的概念。决策通常是开发过程中代价高昂的步骤;当你决定使用神经网络而不是简单的线性回归时,你就对可能的解决方案做了一个重要的限制。随着时间的推移,限制可能是积极的,也可能是消极的。因此,至关重要的是,在我们有足够的信息来很好地预测其效果之前,推迟实施限制。通常,这只是在变得“太晚”的时刻之前。当然,这导致了开发过程中固有的不确定感,但是知道潜在的原因应该有助于接受它。

分析的迭代开发

挑战

一旦企业决定进行开发,另一组问题就会出现。这样的迭代开发通常远离研究人员的头脑,导致诸如我要么实现深度卷积网络来分类图像,要么问题将无法解决我为什么要费心实现一个基线解决方案,它会像什么样执行?在学术实践中,很难反驳这些观点。主要关注的是新奇感,而不是投入的时间。虽然这种动机是每天推动科学超越其界限的力量,但新奇本身是没有价值的。在科学领域不顾一切地寻找 novum 甚至会适得其反(参见复制危机)。

解决方案

在数据科学中,主要关注的是创造价值。新奇本身并不是一种价值,更重要的是,价值不仅仅是你工作的结果。为了更好地突出这一点,我举个例子。在数据科学中,我们经常会遇到这样的情况,我们知道对于一个挑战会有一些真正好的解决方案…如果我们有更多的标签数据就好了。至少在一个特定的案例中,我的团队就是这种情况。我们告诉销售/营销人员,如果他们给我们更多的数据,我们可以给出他们想要的预测。他们告诉我们,当我们给他们更精确的预测时,他们才能得到更多的数据。恶性循环。对于一个资金不足的项目来说,这很可能是死刑判决,数据科学家因为缺乏数据而抱怨,销售人员因为缺乏结果而抱怨。抱怨仍然消耗资源(成本),但没有创造价值,因此项目将被取消。在我们的案例中,幸运的是,我们很快就明白了,价值最好理解为我们可以今天提供的洞察力,而不是我们可以假设获得更多数据的洞察力。因此,我们用一个简单得多的模型解决了部分问题,并给出了更好(但远非最佳)的销售预测。这反过来使他们能够带给我们更多的数据。所以在下一次迭代中,我们能够去寻找更复杂的模型。

时间——无论是运行程序、进行研究还是执行开发项目所花费的时间——在商业数据科学中至关重要。也许你正在做一个资金充足的项目,所以短期内资金不足不会影响你。尽管如此,即使你正在研究一些新的课题,世界上可能有数十家甚至数百家其他公司也在研究同样的课题。你不必总是第一,但跟上速度并在每个关卡都保持领先是至关重要的。这是因为产品开发不是短跑而是马拉松,所以你的开发风格也必须像马拉松运动员一样。马拉松不是在各个方向上的突然大跳跃;它是关于在很长一段时间内保持一个可预测的、稳定的步调。

作者利用https://imgflip.com/创造的模因

测试和验证

挑战

你有一个清晰的业务需求,你有一个很好的开发流程,什么会出错呢?你试图以一种结构化的方式进行创新。努力实现成本和价值的可预测性很容易抑制采用不太可预测的方法的动机。因此,尽可能多地从客户那里获得反馈至关重要,这样我们才能了解什么对他们最有价值。这样,我们可以将开发引向更昂贵但也更有价值的方向。这种反馈以测试的形式实现。对人工智能产品的测试是必不可少的。开发一个成熟的人工智能产品需要大量的时间和金钱,所以开发一些不直接解决业务需求的东西是一种巨大的浪费。

解决方案

数据科学问题通常非常复杂,以至于你必须从解决这些问题的真正挑战中抽离出来。在这里,我使用抽象这个词,意思是我们使用过去的数据,这些数据(可能以某种方式)被过滤,(可能以某种方式)被标记;我们用它来代替未来可能出现的未经选择、未经过滤和未标记的数据。虽然这听起来微不足道,但也是你必须时刻牢记的事情。忘记这一点会导致诸如“但是它在我的测试集上显示出非常好的适合性”的讨论。我从未听说过一个模型是基于其在抽象(训练-验证-测试集)情况下的性能投入生产的,而没有监控其性能是否也适用于具体情况。

在许多情况下,数据科学家选择习惯性地查看测试集和交叉验证分数上的指标,而忘记了归纳比那些数字重要得多。事实上,您看到的数字(例如 F1 分数)并不是您模型的实际准确性。您看到的 F1 分数只是真实的、全人群 F1 分数的估计值。有趣的是,很难判断取样的 F1 分数与总体 F1 分数有多远。数据科学家必须依靠他们的经验,甚至是直觉。具有讽刺意味的是,在一个我们如此痴迷于数字的领域,仍有如此多的空间留给专家直觉。

然而,不试图量化这种直觉是一种不好的做法。让我解释一下我的意思。当我看到 F1 的分数为 0.98 时,我应该开始担心,因为这个数字对于大多数现实世界的场景来说都太高了。可能是我犯了一个错误,我的测试样本出现在训练集中,或者有一个功能,当它可用时,可以准确地预测输出类。假设我检查了这两个潜在的原因,并注意到是后者,所以我冷静下来并提交代码。

这里怎么了?我有一个很好的直觉,调查了它,并确保模型是正确的。没错……但是除了这件轶事,没有任何关于这次探险的文献记载。这意味着下一次别人训练一个新的迭代模型时,她必须再次经历同样的发现(参见精益文献中的重新学习是浪费的来源)。因此,调查的理想结果是,我将测试集分成两部分:一部分有确定的特性,另一部分有没有该特性的例子。我甚至可能为他们设定不同的 F1 衡量标准。通过这种方式,我可以将我的专家直觉传达给从事该产品的后续数据科学家。

感谢雅诺斯·迪文伊亚当·塞波对这篇文章第一版的有益评论。

自我隔离时要探索的三项数据科学技术:什么是 Docker、Airflow 和 Elasticsearch?

原文:https://towardsdatascience.com/three-data-science-technologies-to-explore-while-you-self-isolate-what-is-docker-airflow-and-78969ba4f5fe?source=collection_archive---------9-----------------------

扩展您的数据科学技术堆栈

Unsplash 上由米米·蒂安拍摄的照片

强制入住两周!

像许多其他州(甚至国家)一样,明尼苏达州被命令呆在家里,以帮助拉平新冠肺炎感染率曲线。除了让我的狗散散步,为了打发接下来几周待在家里的时间,我还准备了一些流媒体服务、乐高、拼图、视频游戏和一大堆要学习的新技术。在我要学习的技术列表中,排在首位的是一些我没有在项目中使用过,但我在工作中会用到的技术:

Docker
气流
弹力搜索

这些技术生态系统都有一个坚实的社区,如果你对数据科学和机器学习感兴趣,每个都值得研究。我将简要概述每项技术,以帮助您决定首先研究哪项技术!

Docker 是什么?

多年来,我一直在文章和视频中看到 Docker 这个名字,但我没有花时间去研究它,因为它看起来很复杂。由于这项技术在办公室里广泛使用,我最终不得不使用它,陷入了一个兔子洞,然后我决定是时候尽可能多地学习 Docker 了!我发现 Docker 被吹捧为一种技术,它不仅简化,而且通过容器化的概念和实践加速了从开发到部署的一切。

https://docs.docker.com/

Docker 于 2013 年作为开源软件发布,已经成为一个非常受欢迎的工具,因为有人估计大约 50% 的全球组织都在使用容器化的应用程序。这告诉我,这是一项很受欢迎的技能,也是我心理“工具箱”的一大补充让它如此被接受和强大的是,Docker 可以将一个应用程序及其依赖项打包到一个容器中,该容器可以在 Docker Hub 上共享,并在任何 Linux 服务器上运行。它极大地简化了部署! Docker Hub 与 GitHub 的相似之处在于它是一个存储库,但 Docker Hub 不是代码文件的 repos,而是 Docker 文件和容器的 repo。

容器是 Docker 的关键组件之一,也是我进入该技术领域后首先了解到的事情之一:

容器是一个标准的软件单元,它封装了代码及其所有依赖关系,因此应用程序可以快速可靠地从一个计算环境运行到另一个计算环境。

Docker 容器不像虚拟机(VM)那样消耗虚拟化硬件所需的资源,使它们更加轻量级和灵活。容器设计为使用主机操作系统的内核,每个容器都有一个独立的用户空间,因此多个容器可以在一台主机上运行,如下图所示:

集装箱化应用(码头文件)

除此之外,Docker 还在继续发展,并且有一个强大的社区支持它。尽管我只使用了几天,但我喜欢它的简单。虽然在 Windows 上使用 Docker 越来越容易,但 Docker 是为 Linux 设计的,所以我一直在 Ubuntu 和 CentOS 上使用它。如果你想尝试 Docker,很容易在网上找到便宜的 Linux 虚拟机。点击安装说明和文档的链接,了解更多信息:

[## Docker 引擎概述

Docker Engine 是一种开源容器化技术,用于构建和容器化您的应用程序。码头工人…

docs.docker.com](https://docs.docker.com/install/)

什么是气流?

创建于 Airbnb 的Airflow 作为一个开源数据工作流管理平台,让人们使用 Python 通过有向无环图(Dag)编程定义和调度管道和工作流。它帮助定义和创新了代码工作流行业。

https://airflow.apache.org/

DAG 是您想要运行的所有任务的集合,以反映它们的关系和依赖性的方式进行组织

请注意下面工作流中任务的方向相关性:

DAG 示例

可以通过用户界面(UI)监控工作流。很容易调出日志并查看 DAG 失败的地方,这使得 UI 非常有用。让 Airflow 如此吸引人并被数据科学社区接受的原因是,可以使用一个 Python 脚本来定义任务和依赖关系,并且 Airflow 管理 Dag 的实际调度和执行。可以使用触发器运行 Dag,也可以按定义的计划运行 Dag。因为它是 Python,所以它很适合使用其他库和 Python 特性。

UI 树形视图示例

要启动并运行 Apache Airflow,文档建议使用 Pip 来安装它。如果你在 Linux 机器上,确保有 python3-dev 包来正确安装气流。例如,Ubuntu 应该是这样的:

sudo apt-get install -y python3-dev

Airflow 有一个坚实的开发社区,是数据科学和数据工程领域的一个工具。这绝对值得研究,尤其是如果您熟悉 Python 并执行大量数据工程或 ETL 的话。在教程和文档中查找有关如何设置 Dag 的更多信息:

[## 教程-气流文档

本教程将带您了解一些基本的气流概念、对象及其用法,同时编写您的…

airflow.apache.org](https://airflow.apache.org/docs/stable/tutorial.html)

什么是 Elasticsearch?

其核心是一个使用 Java 和 Apache Lucene 库开发的全文搜索引擎。它以 JSON 格式存储非结构化数据,如 NoSQL,是一个高度可扩展的解决方案,允许您高效地存储、搜索和分析大数据。根据 DB-Engines 排名,Elasticsearch 是最受欢迎的搜索引擎技术之一,这表明它是一项需要了解的宝贵技能!

https://www.elastic.co/

如果你正在寻找一个可以消磨时间的技术平台,弹性生态系统不仅仅是搜索!弹性堆栈由一个名为 Kibana 的数据分析平台、一个名为 Logstash 的数据收集器和日志引擎以及一个名为 Beats 的数据发送器集合组成。这四个通常被称为弹性堆栈,拥有大量的功能和工具,包括用于无监督学习的内置机器学习算法!

基巴纳的异常检测

进入弹性堆栈的另一个原因是因为它可以很容易地与 Python 接口。由于 Elasticsearch 提供了 REST API,因此可以使用 Python 请求与 Elasticsearch 集群进行交互。否则,可以使用 pip 安装一个 API 包装器:

pip install elasticsearch

由于 Elasticsearch 是开源的,所以可以很容易地下载和安装。它可以在 Windows、Mac 和 Linux 上使用。在官方文档中找到安装说明和教程。

[## 开始使用 Elasticsearch、Kibana 和 Elastic Stack | Elastic

不熟悉 Elasticsearch?只需下载几个步骤,您就可以使用 Elasticsearch 进行搜索和分析,使用……

www.elastic.co](https://www.elastic.co/start)

选择一种技术并开始学习!

所讨论的每一项技术都有助于学习,并且都需要很长时间才能掌握。它们都是具有响应性社区的流行生态系统,并且是满足数据科学技术堆栈中特定需求的工具。Docker 是一个很好的学习工具,尤其是对开发运营感兴趣的人。如果专注于 ETL 工作流或数据工程管道,Airflow 是一个很好的学习工具。 Elastic Stack 是一个功能强大的平台,可以使用记录和分析大数据的工具来搜索非结构化数据。每种技术都很容易设置,特别是对 Python 和 Linux 有一点经验的人。

如果由于冠状病毒,这三种技术还不足以满足你在室内花费时间学习的渴望,请查看我的其他教程,学习 SQL、Dash 和 Git 等技能!

[## 学习 SQL 技术:在 SQL Server 中选择数据和更多内容

SQL 语句介绍和查找重复数据的查询。学习 SQL

medium.com](https://medium.com/@erickleppen01/learn-sql-techniques-selecting-data-and-more-in-sql-server-624f81dd16b2) [## Python 中的仪表盘,适用于初学者和使用 Dash 的其他人

使用 Python 中的 Dash 初学者教程构建一个基本的和高级的仪表板

medium.com](https://medium.com/swlh/dashboards-in-python-for-beginners-and-everyone-else-using-dash-f0a045a86644) [## 适用于 Github 初学者和其他人的简单 Git 工作流程

当我在我参加的数据分析编码营开始我的第一个小组项目时,我们必须挑选一个“Git 大师”

towardsdatascience.com](/a-simple-git-workflow-for-github-beginners-and-everyone-else-87e39b50ee08)

谢谢大家!

—埃里克·克莱本

我经常使用的三个数据集作为例子

原文:https://towardsdatascience.com/three-datasets-i-often-use-as-examples-c70ec5b2f793?source=collection_archive---------34-----------------------

这篇文章强调了三个数据集,我把它们作为自己或他人的例子。

TLDR:在科技领域内外,游戏空间有时被亲切地称为沙箱。本文概述了三个数据集,它们经常作为沙盒示例,供我和工作中的其他人以及在其他环境中使用。

介绍

在建立数据驱动的文化时,能够促进共享数据驱动词汇的使用以及数据驱动对话的发展的一个成功策略是创造游戏空间。参与数据驱动的对话的重要性在于,它们建立了对数据相关思想和主题的共同理解。除了共同的思想、语言、习俗、惯例等等,文化是什么?

一个大沙箱的图像。信用:pixabay.com。

本文首先解释什么是数据集。然后,本文提供了三个数据集的摘录和描述,这三个数据集是我经常使用或提供给他人作为共享沙盒游戏空间的。

数据集

维基百科将数据集定义为“数据的集合”。对于构建共享的数据驱动词汇表、参与数据驱动的对话以及建立或发展数据驱动的文化来说,这个定义过于简单。前一篇文章给出了一个更好的定义:数据集是以表格格式存储的观察值的集合,其中每行是一个观察值,每列包含一个与观察值的特征相关的数据点。

汽车

这个数据集来自 Stata 公司,它是一种流行的统计编程语言 Stata 的开发者。在一篇配套文章中,我使用这个汽车数据集来说明为什么研究人员和数据科学家有时将列称为维度或变量

在图 1a 中,每个车型对应一行。然后,对于每种车型,都有一个特定的可观察特征列,如每加仑英里数(mpg)、重量(weight)、长度(length)等。

图 1a:使用 Stata 命令行界面生成的 Stata Corp .输出的自动数据。

为了建立这个数据集,一名或多名科学家参考了最左边一栏中列出的每个品牌和型号的信息目录。然后对于每一列,科学家观察那辆车的特征。这些特征观察的结果随后被记录在数据集的列中。

要在 Python 中自己探索 Stata 的自动数据集,请使用此处显示的代码。从 Pandas 可以将自动数据集导出到 CSV,如图所示。

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

iris 数据集是规范的,被广泛引用。许多人在展示广泛的分析技术时,使用这种虹膜数据作为例子。图 2 显示了这个数据集的专家。图 2 中还显示了将加载并显示该数据摘录的代码。

图 2:加载并显示标准 Iris 数据集的摘录。Python 命令行界面产生的输出。

在这个数据集中,每朵花都有一个观察值。每个观察有一行(每个花一行)。为了建立这个数据集,科学家们收集了花朵,然后观察了各种特征,如萼片长度和宽度以及花瓣长度和宽度。与所有为研究或分析而正确配置的数据集一样,每个感兴趣的可观察特征有一列,每个观察值有一行。

高等教育机构

图 3a 显示了来自综合中学后教育数据系统(IPEDS)的数据摘录。这个数据可以从国家教育统计中心公开获得。我维护着一个讨论这些数据的 GitHub.com知识库

图 3a:摘自国家教育统计中心(NCES)综合中学后教育数据系统(IPEDS)的数据。比较了杜克大学和威斯康星大学麦迪逊分校。使用 Stata 命令行界面生成的输出。

在这个数据中,有一个针对每个机构和每年的观察值。加上年份一栏,这个数据集也可以称为面板或纵向数据集。Auto 和 Iris 数据集将被称为横截面数据集。一般来说,横截面数据代表一个单一的时刻。面板数据集代表同一受试者随时间的多次重复观察。

鉴于此数据包括每行、每个机构(每年)的一个观察值,因此它已针对分析进行了优化,其中分析单位将是一段时间内的高等教育机构。具体的可观察特征有几列。在这种情况下,机构类型(部门)、机构规模(instsize)和机构状态(stabbr)等。

我喜欢将这个数据集用于演示目的,因为它是许多人可以关联的数据。例如,我两次是威斯康星大学的校友,两次是杜克大学的员工。因此,我非常了解这两个机构,当我构建原型、完成、投入生产或者传播任何给定的分析时,可以将它们用作测试用例。我在下面的图 3b 中展示了威斯康辛大学和杜克大学的比较。

图 3b。两个机构对比的例子。这张图显示,每个校区的男生比例似乎向相反的方向漂移。y 轴的刻度显示,每个校区男生比例的总体变化是+/-3%。

我维护着一个工具,从美国教育部的网站 IPEDS 上获取数据,然后以一种为研究和分析目的而优化的方式组合这些数据

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

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

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

结论

本文试图以简单的方式解释什么是数据集。有了这个简单的定义,可以推广到许多研究和分析任务,个人和组织可以更好地参与高质量的数据驱动的讨论。

在建立、构建和维护数据驱动文化的过程中,作为一个群体,努力定义关键术语和短语(如“数据集”)的含义是一项重要任务。

在讨论了什么是数据集之后,本文给出了三个数据集的例子,我和其他人经常把它们称为模型数据集。拥有一个或多个模型数据集对个人和团队都很有用,因为它们提供了一个共享的沙箱,可以在其中测试关于数据的想法和观点。这些共享的沙箱促进高质量的数据驱动的讨论,然后支持建立、构建和维护数据驱动的文化。

感谢阅读

如果你喜欢我要说的,可以在 adamrossnelson.medium.com 的找到更多。

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

机器学习的三个重要步骤

原文:https://towardsdatascience.com/three-important-steps-in-machine-learning-bb551723dbd3?source=collection_archive---------56-----------------------

意见

大多数数据科学家失败在哪里?

机器学习不仅仅是选择正确的算法和建模。大多数机器学习爱好者将对机器学习过程的理解仅限于建模过程。即使对于早期的专业人士来说,在现实世界中实现整个机器学习过程可能也需要一些时间。这一切都要归功于无处不在的机器学习教程(使用高度清洁的数据作为教程数据集),对机器学习过程的理解往往局限于清洁数据、建模模型和测试模型。

马库斯·温克勒在 Unsplash 上的照片

那么,有哪些步骤是大多数新手忽略的呢?让我们一个一个来看看。

  1. 大图
    这是机器学习中最首要也是最重要的一步,然而很多初学者完全忽略了这一步,从而将机器学习的目的限制在他们的项目中。“大局”中首先要明白的是“为什么”的问题?为什么要在项目中使用机器学习是高级专业人员应该回答的最重要的问题。然后,机器学习的目的决定了机器学习的过程。正是因为这个原因,建议产品经理、首席执行官和其他高级专业人员学习人工智能和机器学习的基本概念。
    在回答了“为什么”的问题后,可以进一步决定机器学习是否值得在项目中付出努力。从零开始启动机器学习系统的成本和时间可能会非常高,因此在这一步花费大量时间几乎总是有益的。
    机器学习专业人士应该了解问题的现有解决方案,看看机器学习的成本是否值得。其他问题,如如何使用它(具体在哪个过程中)以及何时使用它也同样重要。因此,大局应该很好地传达给所有团队成员,ML 专业人员也应该在这一步花足够的时间。
  2. 数据洞察 在意识到机器学习的需求后,进行探索性的数据分析。探索性数据分析是机器学习过程中最被低估的步骤之一。通常,花在 EDA 上的时间比需要的时间要少。EDA 有助于从数据中获得新的见解,了解数据中有趣的模式,并了解数据中的异常值。从数据中获得的洞察力帮助我们在进行特征工程和 ML 建模时朝着正确的方向前进。人类看到的图案可能是如此独特,计算机永远也不会发现。机器学习系统应该学习一般模式,而不是离群值的模式,因此通过了解更多关于离群值和异常数据的信息,我们可以获得更清晰的数据,从而进行更好的训练。
    要充分利用 EDA,可视化技能非常重要。正确的可视化技术有助于看到模式,否则很难弄清楚。这一步既是艺术也是科学。
  3. 监督维护
    大多数实时机器学习系统都有持续的数据流。无论数据以何种形式出现,其分布都会发生变化。例如,随着客户行为的改变,客户简档权重也应该改变。因此,应该有随着时间更新模型的规定。然而,模型更新系统应该对坏的/错误的数据具有鲁棒性。由于机器学习系统是“垃圾进,垃圾出”,因此在检测这种攻击并使系统抵抗这种恶意尝试时应该小心。一般来说,机器学习系统是为长期使用而设计的,因此只有在适当的监督和维护下,它们在这种情况下才是合适的。

该列表并不详尽。其中一些步骤可能也是不必要的。数据科学家根据特定的机器学习问题来确定优先级。一些机器学习问题可能是建模密集型的,而一些可能是预处理密集型的。有些人可能从领域知识中受益匪浅,而有些人可能根本不需要任何领域知识。这篇文章提供了机器学习过程中可能缺少的环节,而不是一个放之四海而皆准的指南。

3 款出色的 Julia 编辑器— VSCode、Juno 和 Jupyter 笔记本

原文:https://towardsdatascience.com/three-julia-editors-8cb085f9c065?source=collection_archive---------29-----------------------

Visual Studio Code,Juno 和 Jupyter 笔记本都是开发 Julia 代码的绝佳环境。

三个 ide 的截图。除特别注明外,所有图片均由作者提供。

Julia 是一门年轻的语言,所以对它的支持不像对其他更成熟的语言如 Java 或 Python 那样全面。然而,虽然可能没有大量的开发环境可供使用,但是您可以选择一些好的环境。

我将向你们介绍我的最爱。这不会是一个全面的指南,只是一个简要的概述,但我希望是有用的。

编辑器或 IDE 的选择在某种程度上是主观的,所以我在这里选择讨论的三个环境必然反映了我自己的偏见。

它们都是开源的,因此是免费的,它们是:微软的 Visual Studio 代码,Juno,它是由 Julia 语言的人自己开发的,基于 Atom 编辑器,最后是 Jupyter 笔记本。

VSCode 徽标,鸣谢:微软

所有这些环境都支持多种语言,并且每个环境都需要自己的插件或扩展来定制它以支持 Julia。

Juno 和 VSCode 是相当传统的 ide,这种东西可以用于许多类型的软件或 web 开发。Jupyter Notebooks 不是一个传统的 IDE,它更多地与数据科学和 Python 语言联系在一起,但它也非常适合 Julia(以及其他语言)。也就是说,你可能不想用 Jupyter 开发大型的 Julia 程序;它更适合数据科学家或数据记者可能想要使用的相对较短的例程。

我将在最后介绍 Jupyter,在这两种传统的 ide 中,我将从可能与 Julia 语言联系最紧密的 ide 开始。

朱诺

(更新:似乎不再开发 Juno,开发工作已经转移到 VSCode 的 Julia 扩展上)

如果你去茱莉亚语言主页(【julialang.org】T2,你会被邀请做的一件事就是下载茱莉亚普罗软件包。这是捆绑了 Julia 语言的 Juno IDE。你需要注册才能下载 JuliaPro,但它是免费的。

或者,如果您已经有了 Julia,您可以非常简单地下载和配置 Juno。这是我选择的路线,它由几个简单的步骤组成。首先,下载 Atom 编辑器,然后从编辑器中下载并安装'Uber-juno' Juno 扩展,完成后告诉 Juno 扩展 Julia 二进制文件在哪里。

Atom 徽标,鸣谢:Atom

点击 Julialang 网站上的 Juno 链接可以获得完整的说明,这非常简单,尽管在我的 Linux 机器上,安装扩展需要一些时间。如果你有一台相当新的电脑,有相当大的内存,你可能不用等太久。

当您启动 Juno 时,您会看到看起来像普通的 Atom 编辑器,但在窗口左侧添加了 Juno 菜单和 Juno 控件。

要运行一个文件,只需从文件菜单中打开它,然后点击运行图标(就像一个播放按钮),就会发生两件事。首先启动一个 Julia 控制台或 REPL(您也可以手动启动),然后程序将运行,任何输出都发送到控制台。

一个警告:我第一次运行一个程序时,花了很长时间来启动 Julia,所以你可能需要耐心。随后的运行要快得多。

下面,您可以看到 Juno 运行简单绘图程序的屏幕截图。控制台没有输出,但是您可以看到该图是在它自己的窗口中绘制的。

正如您对相当复杂的 IDE 所期望的那样,Juno 具有代码完成功能、调试器,并且您可以在 REPL 中编写交互式命令。

虚拟代码

和 Juno 一样,第一次运行也花了一些时间。后续运行更快,这可能是我的想象,但感觉 VSCode 可能比 Juno 稍快。

Jupyter 笔记本

Jupyter 不是一个传统的 IDE。它由可以是代码或文本的单元组成,可以单独执行。在下面的屏幕截图中,您可以在单个代码单元中看到相同的绘图程序,输出——图表——就在它的下方。

通常,在第一个单元格下面会打开另一个单元格,并执行下一位代码。这些代码单元之间可以散布文本单元(文本在 Markdown 中),因此允许创建由富文本和程序代码组成的完整的可执行文档。

你不会使用 Jupyter 来开发常规程序,但是对于想要操作和分析数据的数据科学家或数据记者来说,它是一个很好的工具。

要使用 Jupyter 作为 Julia 的工具,您需要下载并安装两者(您还需要 Python 来运行 Jupyter)。同时安装 Jupyter 和 Python 最简单的方法是使用 Anaconda——我已经写了一篇关于这方面的文章,所以与其重复我自己,不如看看这个:用 Anaconda 设置 Jupyter 笔记本进行数据可视化

默认情况下,Jupyter 使用 Python 语言。为了让 Jupyter 了解 Julia,启动 Julia,您将会在这样的窗口中看到命令提示符(它与您在编辑器中看到的 REPL 相同):

然后在提示符下键入以下内容,并按下:

using Pkg

这告诉 Julia 您将使用包管理器。然后键入以下内容并点击:

Pkg.add("IJulia")

IJulia 是一个为 Jupyter 和 Julia 牵线搭桥的包裹。您可能需要等待它下载和安装。

一旦你安装了 IJulia,你可以关闭 Julia 窗口。当您启动 Jupyter 时,您将能够打开一个新的 Julia 笔记本,而不是 Python(尽管 Python 仍将是一个选项)。

汇编

Julia 相对于 Python 的一个优势就是速度快。如果您有大量的处理工作要做,这是非常好的。然而,速度来自于将 Julia 代码编译成低级代码,这本身就需要时间。

这种编译发生在你第一次运行一个程序的时候,所以第一次运行比随后的运行要长得多:如果你第二次运行同一个程序,你会发现它快得多。

哪一个?

我使用 Jupyter 来开发 Python 和 Julia 代码,特别是针对这样的文章。我喜欢使用原型法的方式,一次写一小段代码,尝试一下,然后继续下一部分。

在这两个 ide 中,你都可以运行代码块,并且以类似的方式工作,但是,当然,你不能包含文本单元格。

因此,如果我在写一篇文章或一份报告,需要我用描述性的文字构建小代码,那么我肯定会使用 Jupyter。另一方面,如果我正在编写一个独立的程序,我会使用普通的 IDE,Juno 或 VSCode。

老实说,我不能决定哪一个是最好的,这就是为什么我用所有三个!

为什么不把它们都试一试,看看哪种最适合你。

您可能还会对以下内容感兴趣:

[## 用 Julia 和 VSCode 实现数据可视化

使用 Julia 和免费的 VSCode IDE,您可以用很少的编程知识制作令人印象深刻的数据可视化。

towardsdatascience.com](/data-visualization-with-julia-and-vscode-168a69f7ddf8) [## 使用 Julia 语言和 Jupyter 笔记本开始数据可视化

使用 Julia 和 Jupyter,您几乎不需要任何编程知识就可以制作出令人印象深刻的数据可视化。

towardsdatascience.com](/starting-data-visualization-with-the-julia-langauge-and-jupyter-notebooks-289bc9f0cd09)

原载于 2020 年 6 月 6 日 https://projectcodeed.blogspot.com**

人工智能的三大领域及其工业应用

原文:https://towardsdatascience.com/three-major-fields-of-artificial-intelligence-and-their-industrial-applications-8f67bf0c2b46?source=collection_archive---------4-----------------------

探索大数据和人工智能

人工智能是一门研究和发展模拟人类智能延伸和扩展的理论、方法、技术和应用系统的新技术学科。人工智能研究的目标是让机器执行一些需要智能人类才能完成的复杂任务。也就是说,我们希望机器可以代替我们解决一些复杂的任务,不仅仅是重复的机械活动,而是一些需要人类智慧参与的活动。在这篇文章中,我将解释人工智能技术的三个主要方向,即语音识别、计算机视觉和自然语言处理。

照片由德鲁·格拉汉姆Unsplash 上拍摄

语音识别

语音识别让电脑会听,包括我们日常生活中能接触到的 iPhone 上的 Siri 在谷歌语音输入中,你可以说一句话,这句话就会变成文本;对着谷歌地图说我要去哪里,它就能自动为你生成导航。这些是语音识别的一些应用。语音识别可以分为三个方面:

  • 语音合成,包括在线和离线语音合成;
  • 语音识别,包括语音听写等方面;
  • 语义理解就是用神经网络提取语音的意思,包括语音评价和我们常用的一些机器翻译的一些特征。

计算机视觉

计算机视觉让计算机看得见。我们希望计算机能取代人眼的一些功能。比如有一种非常有用的文档分析技术,叫做 OCR。我们可以让计算机扫描文件并阅读它。例如,我们可以获得一张发票,以便计算机可以立即扫描它,然后从发票中提取我们关心的金额、税率和其他信息。计算机视觉在智能医疗诊断领域有一些研究。虽然现在还没有商用,但相信未来会有广阔的应用场景。与此同时,在军事领域,无人机正在取代人类的观察,为导弹测量弹道。

计算机视觉的流行方向是:

  • 物体识别和检测。电脑可以快速检测出我们通常从照片中看到的东西。例如,如果我们拿出一张旅游区的风景照片,我们可以立即识别上面的植物、人、动物或车辆,计算机也是如此。

【Schreibtisch-mit-Objekten.jpg https://en . Wikipedia . org/wiki/Object _ detection #/media/File:Detected-with-YOLO

  • 物体运动跟踪。我们已经在某一帧上捕捉到一个物体的图像。在随后的视频中,我们可以持续跟踪这个物体的变化和状况。这不是一项容易的任务。很难准确地识别一个物体,因为它会受到阳光和光线的不断变化。

另一个是电脑的看图说话功能。比如给定一张图片,计算机可以识别出图片中包含的内容,然后说出一些预先做好的内容。现在很多展厅已经在用这种技术了。它可以预制解释词和引导词。参观者只需用手机或其他设备扫描展品或展区内的一些指定位置,就能听到相关的导游词。

自然语言处理

从现在开始,我们的电脑可以听我们说什么,看我们看到什么。但是我们想要更多。我们更喜欢与计算机交互,使用自然语言进行交流,这是自然语言处理的目的。自然语言处理现在用于机器翻译、信息检索和对话系统。

计算机翻译:主要包括机器同声翻译。

信息检索:举个例子,当我告诉电脑我要找什么,那么它就可以帮我搜索相关的东西。

智能客服:我们通过语音与电脑互动,让它回答我们的问题。

自然语言处理没那么简单。相对来说比较难。我们必须解决以下问题。第一个是语言中的歧义,有时一个句子可以有两种或两种以上的含义或理解方式。比如“我去银行了。”银行可能是存放钱的地方,也可能是河边。

维多利亚博物馆在 Unsplash 拍摄的照片;由福斯托·维尔卡Unsplash 拍摄的照片

另外,我们需要解决语言的健壮性问题。我们在日常说话中经常会说一些错别字,或者说的话少,或者说的话比原意多,这些都会影响语言的稳健性。此外,也可能有其他昵称,可能是指同一个人。

另一种是知识依赖。我们通常用知识图来解决知识依赖问题。就说大鸭梨吧(中文意思是大梨),它是一种水果,也是北京一家非常有名的烤鸭店的名字。和七天一样,它可以代表时间,也可以代表酒店的名字。这些都依赖于一些背景知识,我们需要用知识库或者知识图谱来解决这个问题。

另一个是语境。根据对话的上下文,我们可以准确地判断要说什么。比如“我想吃大鸭梨”,“大鸭梨”可能代表一种水果。“我们去大鸭梨吧”,那么“大鸭梨”就代表一家餐厅。在不同的对话语境中,不同的表达方式表现出一些不同的含义。

摘要

在我们转移到人工智能的工业应用之前,让我们总结一下我们在上面部分学到的东西。我们学习了语音识别。计算机可以听到我们并做出一些反应,例如将我们的话翻译成文本。然后我们研究了计算机视觉,它让计算机看见。计算机可以通过查看图像来识别图像中的一些对象,也可以在连续的图像中跟踪一个对象的变化。这些是计算机解决的一些热门话题。然后,最后我们学习了自然语言处理,就是计算机不仅要听到我们说的话,还要理解我说的话,然后才能给我们一些反馈。

人工智能的行业应用

下面从民用安防、交通运输、公共安全、自动驾驶汽车、智能机器人、电信行业等领域介绍人工智能的相关应用。

公民安全

首先,我们来给大家讲一下民用安防领域。随着智能家居的普及,人工智能逐渐在民用安防中发挥作用。比如一个家庭安防摄像头,可以从视频中学习,通过日常拍摄来识别哪个是我们家的。我们家进入视频监控范围,不会触发报警。但是,当外人非法进入时,它会立即提醒我们,比如给我们发短信,或者发出很大的报警声。以上是智能安防摄像头的一些简单应用。

塞巴斯蒂安·肖尔兹(努基)在 Unsplash 上拍摄的照片

运输

在交通领域,我们可以通过人工智能分析交通的视频,并利用这些数据进行决策。我们可以分析当前道路是否拥堵,情况如何,然后使用人工智能自动做出决定。比如让 AI 调整交通信号中的时间来指挥交通,或者实施大范围的交通联动调度,提高整个城市的运行效率。

照片由 chuttersnapUnsplash 上拍摄

公共安全

在公共安全领域,人工智能利用图像识别和人脸识别也有特别明显的应用。比如我们在海量视频信息中发现了嫌疑人的线索;或者给定某些特征,人工智能从视频中提取与特征匹配的人或物品的信息,这是快速而准确的。

照片由 chuttersnapUnsplash 上拍摄

自动驾驶仪

人工智能在自动驾驶领域也有很多应用。自动驾驶其实需要很多技术,包括对环境的感知。我们通过相关摄像机、激光测距仪、微传感器、车载雷达等一系列设备感知周围环境。,然后通过人工智能把这些信息整合在一起,判断周围环境如何。在收集了行为决策所需的所有信息后,基于环境感知的结果,需要使用人工智能来决定汽车接下来应该做什么,是应用刹车还是加速器。最后一个是动作控制模块。在 AI 做出决定后,它必须将该决定传递给运动控制模块来控制汽车,例如实际踩下刹车或实际踩下油门。

智能机器人

智能机器人在服务行业、教育行业、医疗行业有着巨大的应用潜力。例如,现在许多银行都有自动问答机器人,它可以引导来银行办理业务的人,或排队取号,或简单介绍一些业务,这提高了银行的效率,也方便了客户,大多数人去银行办理业务。

Unsplash 上由 Austin Distel 拍摄的照片

人工智能在电信行业的应用

人工智能在电信行业有哪些应用?电信行业也在迎来人工智能时代的到来。许多移动公司抓住了时代的机遇,开发和建设了人工智能核心能力的网络平台。这个人工智能网络平台具有大数据分析和机器学习功能。它自动检测移动网络的状况,自动排除故障,并执行流量分类、异常检测和预测。同时,您可以优化资源的利用率,并进行相关的网络优化,以提高移动网络的智能性,并通过优化提升用户体验。
中国移动还自主研发了智能手机客服问答机器人,利用机器学习、深度学习、自然语言处理等人工智能技术,实现业务流程自动化,更加智能地回答用户问题,解决业务咨询、业务办理、流量查询等方面的问题,如客户关怀、网络覆盖、计费等相关服务。
此外,在订户方面,人工智能和机器学习也将帮助电信运营商解决描述和分析用户信息、提高转化率、分析内容使用趋势、网络活动等功能。借助人工智能和数据分析,运营商还可以在合适的时间识别目标客户,为客户提供各种服务。
移动公司还专注于五大领域:网络、安全、管理、客户服务和市场营销,利用人工智能技术扩大应用规模。

照片由7 班档拍摄

在网络领域,人工智能技术已在网络自助服务机器人、智能 VoLTE 语音质量测量、智能家庭宽带安装等方面实现大规模应用。
在安全领域,反诈骗系统已经可以拦截诈骗电话,国内每月拦截量超过 1400 万。
在管理领域,合同和票据的审核点也已经实现。智能机器取代了人工审核,每年可以节省上亿的成本。
在客服领域,智能客服问答机器人目前每个月可以回答超过 2.1 亿次。
电信企业结合自身在垂直行业的业务优势,积极布局各行业的 AI 应用,包括智能教育、智能医疗、智能交通、智能工业、智能农业等方面。

摘要

最后,我们总结了这一部分的学习内容。这一部分我们学习和了解了民用安防领域的人工智能安防摄像头。通过视频识别,交通领域的人工智能可以用机器学习为我们的交通提供决策依据,甚至自动决策。在公共安全领域,图像的识别可以为治安案件的侦破和嫌疑人的定位提供快速的依据。自动驾驶汽车不仅使用人工智能技术让汽车感知周围环境,还让汽车决定下一步做什么,并操纵车辆达到自动驾驶的目的。智能机器人在我们的生活中也很常见。他们通常扮演客服的角色来帮助我们。最后,简要介绍了人工智能在电信行业的应用和发展,重点介绍了移动公司使用的人工智能网络平台和人工智能客服机器人。

如果你想对大数据和人工智能有一个大概的了解,也可以看看下面的文章:

[## 人工智能的基本概念及其应用

机器学习,深度学习,强弱人工智能,神经网络简介:BP 和…

medium.com](https://medium.com/towards-artificial-intelligence/basic-concepts-of-artificial-intelligence-and-its-applications-294fb84bfc5e) [## 大数据及其应用的发展与趋势

关于大数据的发展和趋势及其在电信行业和其他领域的应用

towardsdatascience.com](/the-development-and-trend-of-big-data-and-its-applications-5dd8c52e1df6) [## 大数据及其应用的发展与趋势

关于大数据的发展和趋势及其在电信行业和其他领域的应用

towardsdatascience.com](/the-development-and-trend-of-big-data-and-its-applications-5dd8c52e1df6)

比较文本数据的三种方法可立即提升您的分析效果

原文:https://towardsdatascience.com/three-methods-for-comparing-text-data-to-instantly-boost-the-impact-of-your-analysis-99efb99c6f40?source=collection_archive---------36-----------------------

马里乌斯·马萨拉尔在 Unsplash 上的照片

我们将使用 gensim、nltk 和 spaCy 来创建和可视化符号化向量、余弦相似性和实体-目标关系,以实际发布数据分析师职位。

(数据和完整的 Jupyter 笔记本演练可以在这里找到)。)

如果你正在寻找一份数据分析师或科学家的工作,同时也在努力学习 NLP——准备好一石二鸟吧!对于这篇文章,我将使用 Indeed.com“数据分析师的 1000 个招聘信息作为我的文档集(语料库)。我选择了数据分析师,因为与数据科学家相比,会有更多种类的职位和要求。这些列非常简单明了:

在我们深入研究代码之前,让我们停下来思考一下为什么我们要分析文本数据,从开始。对我来说,通常有两个原因:

  1. 我想在我的语料库中找到最大的重叠区域,即文档之间的关系和变化是什么
  2. 我正在我的语料库的子集中寻找一组关键词或值,即文档中的主题或讨论点是什么

在这两种情况下,重点是帮助我缩小研究范围,节省我自己通读所有内容的时间。当然,这些方法也有助于构建机器学习管道,因为在开始训练模型之前,分析可能会导致文本数据中的错误或偏见。

我将回顾的三种方法是:

  1. 基于 PCA 和 t-SNE 的符号化向量的欧氏距离
  2. 一组语料库的正态和软余弦相似度
  3. 从非结构化文本数据中提取结构化关系

欧几里得距离

让我们从基础开始,使用 nltk 方法标记数据:

然后应用 CountVectorizer(把这想象成 one-hot 编码)以及 Tfidf transformer(把这想象成对编码进行加权,这样更频繁的单词得到更低的权重)。

最终,我们可以将其放入 PCA 模型,并使用 Seaborn 的 KDE 图绘制前两个成分:

如果你还没有分类,密度图比散点图更好,尤其是在处理大型语料库的时候。

这对于仅仅根据单词的用法来初步了解情况是很有帮助的。然而,由于我们没有在此基础上分层任何类别,如行业或工资,我们不会从这一步获得太多的洞察力。

正常和软余弦相似性

对于基于覆盖大型语料库的欧几里德距离的 PCA,您通常不会最终找到强关系或聚类。这是因为尚未考虑单词的语义,此外,一些帖子有两行长,而另一些帖子有多个段落。我们可以用余弦相似度或者单词向量之间角度的度量来解决这两个问题。

余弦相似度有两个主要选项。第一种选择是在应用了所有与我们之前所做的相同的标记化步骤之后,对单词向量进行余弦相似度计算,并创建一个矩阵。很简单:

把这想象成 Seaborn 的配对图

第二步或更进一步,在先前的单词嵌入模型相似性矩阵和我们刚刚计算的正常相似性矩阵之间,利用 L2 归一化进行内点积,以获得软余弦矩阵(本质上试图更好地捕捉描述中单词的语义)。我们可以使用 gensim word2vecFastText预训练的单词嵌入模型轻松做到这一点。如果您对嵌入模型不熟悉,可以把它想象成根据使用上下文的相似程度给出相似度分数的单词(即,紧接在它前面和后面的两个单词)。

如果你将这个软余弦值与上面的正常余弦值进行比较,你会看到很大的差异。

如果我们采用cosine.mean().mean(),我们得到的平均相似度是 0.80,这是有意义的,因为这些都是数据分析师的帖子。采用相同的 PCA 和密度图,我们得到:

添加了标准化和语义分层之后,我们现在可以深入到某些最密集的区域,看看那里聚集了哪些帖子。

在图 x(-1,1)和 y(-0.5,-0.1)的区域使用上述搜索功能,然后应用gensim summary得出:

*Manage and consolidate all Operational Spreadsheets.Work with management to prioritize business and information needs.Locate and define new process improvement opportunities.Collaborating with the executive team to understand the analytical needs of our multichannel operations and developing data-driven insights that are both strategic and operational.Formulating and championing insights on specific business tactics such as inventory forecasting and gaps analysis to drive those insights into action.What You Need to Succeed:-  to  years of experience working in Inventory Analyst role or Warehouse Master Data Management.- Bachelor's degree or higher education in Computer Science, Information Technology, Statistics, Business Administration or a closely related field.- Sound knowledge of inventory control practices & supply chain- Advanced Excel spreadsheet knowledge: Pivot Table, VLOOKUP, Various Formula- Familiarity with SAP and Warehouse Management System is a plus.Other Skills:-Exceptional written and oral communication skills.- Eye for detail and have a strong analytical skills.- Ability to priorities work effectively.- Able to balance/challenge conflicting objectives.- Able to see the bigger picture beyond the scope of their role.- Able to challenge the current status quo and being open minded towards new and different ways of doing things.- Tackles new problems in a timely manner. Pharmapacks, is a leading e-commerce company with a proprietary tech platform that empowers Brands with a complete and cost-effective logistics, fulfillment, marketing and sales solution.*

虽然 81 个帖子的摘要可能读起来不完全一致,但您可以看到该领域侧重于物流/库存环境中的数据和 excel 电子表格管理。因为我已经存储了网址,如果我感兴趣,我可以继续申请这 81 个帖子!

来自文本的结构化关系和数据

许多有用的数据隐藏在报告和文章中,而不是表格中。例如,招聘信息通常会在职位的简要描述上列出要求和薪水。

我将把这个分析的重点放在招聘要求的技能和任务上。我们可以通过将句子解构为词类,然后标注主客体以及它们之间的关系来做到这一点。

举个例子,

“该职位将是(公司名称)的第一个此类职位,因此,担任该职位的人必须能够并乐于承担建立和维护内部跟踪和报告程序的全部责任”

可以使用 spaCy 的英语模型分解为部分和依赖项:

请参阅 jupyter 笔记本,以更好地了解这种依赖性

通过利用创建实体对和关系的函数(基于这篇有用的文章),我们可以更好地了解数据分析师需要完成什么类型的任务。对找到的关系进行value_counts()分析可以得出:

找到的顶级关系

过滤“提供”并创建一个网络图,我们可以得到:

您可以看到,仅“提供”一项,就有各种各样的问题

知识图适用于“提供”,因为只有 100 次提及,但对于更多的关系可能会有所不同。我们可以看到,分析师被期望提供从潜在业务风险到行动计划和临时报告的所有信息。

结论

我希望这有助于您理解如何更好地处理文本数据。有了这三个工具,我们很快就确定了“数据分析师”的角色定位,以及你应该为他们准备的一些能力和任务。如果您想使用这些技术查看更深入的分析,请查看本文

如前所述,数据和完整的 Jupyter 笔记本演练可以在这里找到。

今天,每个人工智能爱好者都需要尝试三款移动应用

原文:https://towardsdatascience.com/three-mobile-apps-every-ai-enthusiast-needs-to-try-out-today-3665b96b5a2a?source=collection_archive---------41-----------------------

保罗·花冈在 Unsplash 上的照片

我们的世界正在以超快的速度前进,这不是什么新闻。技术正在改变一切;我们生活、交往和做生意的方式。处于这一变革前沿的关键技术之一是人工智能(AI)。人工智能已经从研究实验室进入我们的生活。从帮助我们变得更有生产力到帮助我们轻松翻译外语,人工智能正在融入我们的日常生活。我把三个强大的移动应用放在一起,我相信每个人工智能爱好者今天都需要尝试一下。

谷歌镜头

谷歌镜头是一个有趣的应用程序,每个人都会在某个时候发现它很有帮助。这是一个人工智能应用程序,使用智能手机摄像头来检测图片中的对象,并根据检测到的内容提供操作。

我已经用这个程序做了很多有趣的事情,你也可以试试。

  • 扫描二维码。这是很基本的。
  • 在应用程序中识别和购买相机拍摄的相似物品。这个功能太酷了。使用计算机视觉,该应用程序识别应用程序捕获的对象,并在线提供类似的对象。
  • 将图片文本转换为可编辑文本。一点也不差。这类似于 OCR,只是它也适用于手写。
  • 跨语言自动翻译。这个功能太神奇了。它用新的语言替换了摄像机对准的表面上的文字。把它指向任何文本,你就可以得到几种语言的翻译。我在我的优步应用程序上把英语翻译成我的母语(约鲁巴语)。

谷歌镜头在行动…

水獭。艾

Otter.ai 是一款语音转文本工具,可以实时将您的语音或声音转换为文本。我认为这是惊人的相当好的准确性。它可以用于几个方面,例如,我用它写了文章的这一部分。我还尝试了其他一些事情:

  • 做会议笔记。不错是吗?如果你厌倦了写会议记录,那么 Otter 已经来帮你了
  • 通过识别关键词总结会议记录。
  • 使用输出转录视频以进行进一步分析,如 Python 中的情感分析或关键字分析。

谷歌也有一个类似的应用程序,名为 Live transcribe,这是一个为聋人和重听人设计的无障碍应用程序。

虚拟助手

虚拟助手?我们已经有他们一段时间了,那么他们到底是怎么上榜的呢?嗯,这可能是因为不是每个人都花时间探索现有的功能和这些应用程序更新的很酷的新功能。

我将在本文中重点介绍谷歌助手。像其他助手比如 Siri,Alexa,Cortana 等。,它是一个对话式、语音激活的数字助理,可以代表用户执行操作,并提供上下文信息。一些支持它的人工智能技术包括语音识别和自然语言处理。列出一份全面的功能列表有点困难,尤其是因为新功能不断增加。不过,我整理了几个。

“好的,谷歌…”。借助语音识别功能,助手可以:

  • 打电话和发短信
  • 打开应用程序
  • 告诉你天气
  • 播放音乐
  • 设置提醒
  • 寻找地点
  • 帮助您导航到特定位置
  • 控制你的智能家居——控制智能灯、电视、智能恒温器等。

凭借自然语言处理的能力,该应用程序会自动将航班、酒店和餐厅预订等事件添加到谷歌日历中。对于航班,该应用程序还可以帮助跟踪航班(例如,如果是亲人的航班),甚至可以捕捉延误。这个应用程序可以做很多其他的事情。

看看今天人工智能能做什么很有趣。过去二十年的进步相当惊人,我们期待看到更多人工智能的惊人应用。老实说,这些应用离完美还很远,但仍然很迷人。我相信每个人工智能爱好者都应该检查它们,并与它们一起玩。如果你像我一样,除了对这些应用着迷,你还会尝试识别驱动这些应用的人工智能领域。

三个月计划学习机器学习背后的数学

原文:https://towardsdatascience.com/three-month-plan-to-learn-mathematics-behind-machine-learning-74335a578740?source=collection_archive---------8-----------------------

为期 3 个月的计划,学习机器学习背后的数学知识

Unsplash 上拍摄的 ThisisEngineering RAEng

在这篇文章中,我分享了一个 3 个月的计划,学习机器学习的数学。我们知道,几乎所有的机器学习算法都利用了线性代数、微积分、概率&统计等概念。一些先进的算法和技术也利用了诸如测量理论(概率论的超集)凸和非凸优化等主题。为了理解机器学习算法并在机器学习及其相关领域进行研究,数学知识成为一项要求。

我在这篇文章中分享的计划可以用来准备数据科学面试,强化数学概念,或者开始研究机器学习。该计划不仅有助于理解机器学习背后的直觉,还可以用于许多其他高级领域,如统计信号处理、计算电动力学等。

按照计划,我通过了微软的数据科学实习面试,并收到了微软 2021 年的录用通知。我的采访经历可以在下面这篇文章里看到:

[## 我在微软的数据科学采访

这是一年中的这个时候(即七月),当软件公司来到各种印度工程学院…

towardsdatascience.com](/my-data-science-interview-with-microsoft-6b7ec840b80e)

除此之外,人们应该了解在顶级会议/期刊上发表的论文,这些论文可能在早期就已经铺天盖地了。这也有助于开始研究生涯。

该计划主要分为四个部分

  1. 线性代数
  2. 概率论
  3. 多变量微积分
  4. 多元统计

线性代数

照片由 Isaac QuesadaUnsplash 上拍摄

线性代数是机器学习和深度学习中需要的最重要的概念之一。学习线性代数的最佳课程是吉尔伯特·斯特朗博士在麻省理工开放式课程上的 35 个讲座。对于完全初学者来说,完成本课程最多需要一个月的时间。但是因为大多数做机器学习的人都知道线性代数和矩阵的介绍。他们应该能够在每节课 2 小时内完成。除了讲课,一个人还应该努力完成课程中给出的作业和考试,以进行适当的练习。本课程最重要的技能是将多维向量可视化并理解它们之间的关系。向量的可视化是数据科学中最重要的技能之一。

为了更好地理解线性代数中的可视化,可以观看 YouTube 频道“3 blue 1 brown”上传的播放列表“线性代数的本质”。该频道还有其他通过可视化描述数学之美的视频。

概率论

(来源:pxfuel.com)

概率是理解不确定性背后的科学的一套原则。有了足够的观测数据,不确定性可以用确定性原理来建模。概率论最好的课程是约翰·齐茨克里斯博士关于麻省理工开放式课程的讲座。本课程讨论概率论的基础知识,并讨论泊松过程、马尔可夫链、中心极限定理等等。作业和考试也可以在麻省理工开放式课程上找到,而且你应该完成所有的作业和考试来测试课程中学到的概念。也为相同的提供了解决方案。如果你是一个喜欢从教科书中学习的人,那么你可以去看看《概率导论》这本书,第二版。“由 Bertsekas、Dimitri 和 John Tsitsiklis 负责,本课程的陪同人员。

多元微积分

https://cdn . pix abay . com/photo/2017/10/05/19/39/differential-calculus-2820657 _ _ 340 . jpg

了解多变量微积分对于理解许多机器学习算法至关重要,因为大多数机器学习算法使用不止一个参数(深度学习中有数百万个),因此计算梯度和反向传播矩阵不能仅通过单变量微积分来完成。因此,多元微积分的知识对于机器学习是必不可少的。

在学习多变量微积分之前,先复习一下单变量微积分的概念。关于这个主题最好的课程之一是由丹尼斯·奥鲁博士讲授的关于 T2 麻省理工开放式课程。此外,一如既往,本课程的练习作业和考试。课程讨论拉格朗日乘子,偏微分方程,向量场,通量等。关于这个话题有一系列由“ 3blue1brown ”制作的短(5-10 分钟)视频播放列表,使用可视化来解释这个话题。强烈建议观看视频,以便更好地理解。

多元统计

照片由克里斯·利维拉尼Unsplash 上拍摄

许多机器学习算法在多变量设置中使用统计学的概念。这些主题的概念来源于高维特征空间的线性代数和概率统计。学习这个题目没有指定的课程。但是,建议您通过以下任何一种资源来了解该主题:

  • 本书的第 4、7、8 章由r . Johnson:应用多元统计分析。
  • 本书的第 2、3、11 章由T . w . Anderson:多元统计分析导论。

Unsplash粘土堤的照片

现在,你可以高枕无忧,回头看看你在三个月的计划中学到了什么。但这不是结束。

现在拿任何会议论文或者任何高级机器学习书籍或者在线课程等。大多数人已经看过吴恩达博士的机器学习课程。现在,你可以尝试在斯坦福观看 CS229 的原版讲座,尝试用数学的严谨深入理解机器学习概念。

此外,你可以阅读下面提到的任何一本书来学习机器学习:

  1. 模式识别和机器学习书由克里斯托弗主教。
  2. 计算思维和数据科学导论。
  3. Tommi Jaakkola 教授的机器学习。

如果任何人对此有任何问题,请随时讨论。

Python 中的三个“开箱即用”的 Web 内容抓取应用程序

原文:https://towardsdatascience.com/three-out-of-box-web-content-scraping-applications-in-python-e342a6836ba4?source=collection_archive---------44-----------------------

照片由哈尔·盖特伍德Unsplash 拍摄

你不需要通过使用它们来学习刮削

相信你一定知道,Python 的一个常见应用就是从网页中抓取内容。通常,你需要学习使用像 Scrapy 或 BeautifulSoup 这样的库来完成这项工作。

然而,你有没有想过有一种 Python 库“开箱即用”地提供这种特性?当然,对于某些网站来说。

在本文中,我将介绍 3 个为您做这件事的库。你不需要学 Scrapy,我保证。只需很少的几行代码,你就能立刻从这些网站上获得你想要的信息。

TD;分升

  1. 你好

这个库帮助你直接从 StackOverflow 中提取答案。

[## 格列茨/豪多伊

你是黑客程序员吗?你是否发现自己经常在谷歌上搜索如何完成基本的编程任务?假设你…

github.com](https://github.com/gleitz/howdoi)

2.维基百科(一个基于 wiki 技术的多语言的百科全书协作计划ˌ也是一部用不同语言写成的网络百科全书ˌ 其目标及宗旨是为全人类提供自由的百科全书)ˌ开放性的百科全书

您可以使用这个库从维基百科下载和解析信息。

[## 戈德史密斯/维基百科

Wikipedia 是一个 Python 库,使得访问和解析来自 Wikipedia 的数据变得容易。搜索维基百科,获取文章…

github.com](https://github.com/goldsmith/Wikipedia)

3.报纸 3k

从带有一些内置 NLP(自然语言处理)功能的新闻网站下载文章。

[## Newspaper3k:文章抓取和管理— newspaper 0.0.2 文档

受到对其简单性的要求的启发,并因其速度而受到 lxml 的支持:“报纸是一个了不起的 python 库,用于…

newspaper.readthedocs.io](https://newspaper.readthedocs.io/en/latest/)

你好

照片由凯拉·杜洪Unsplash 上拍摄

你写代码吗?我想肯定是的。否则,你不应该在这里看我的文章。那么,你 99%都用过 StackOverflow 吧?

有人开玩笑说,程序员就是那些从 StackOverflow 复制代码并粘贴到他们项目中的人。我不敢说这是真的,但绝对 StackOverflow 对我们很重要。

有了 Python 库“howdoi”,你不需要打开浏览器搜索你的问题。作者在自述文件中说,这将减少你分心的机会。老实说,当我第一次看到这个论点时,我仍然不相信这是一个有用的库,直到我尝试了它。跟我来。

要安装这个库,只需运行pip install

pip install howdoi

在 Python 代码中,导入这个库,

from howdoi import howdoi

然后,使用字典构建查询。

query = "python how to send POST request with json body"
args = {
    'query': query.split(' '),
    'pos': 1,
    'all': False,
    'link': False,
    'color': True,
    'num_answers': 1
}

在本词典中:

query获取关键字列表。在本例中,我用一个句子编写了我的查询,并将其拆分为关键字。

pos每次搜索都会有一个问题排序列表,这个参数让你选择位置。直觉上,很多时候我们应该选择 1 号,才能得到比较靠谱的答案。

all显示整个答案文本(True)或只显示有用的答案(False)。

link如果为真,将只显示一个链接,因此您必须使用浏览器查看。

color将尝试在答案中对代码进行着色以提高可读性。

num_answers如果> 1,将立刻返回更多答案。

一旦构建了参数字典,我们只需将它传递给howdoi函数来获得输出。

output = howdoi.howdoi(args)
print(output)

让我们运行它!

是不是很酷?图书馆即时为你呈现答案。当然,当你有一个相对主观的问题时,这可能并不完美。然而,当你有一个简单的编码问题时,它可以非常简洁和准确。再来几个试试。

如何合并到熊猫数据框?

如何在 Python 中改变两个变量的值?

如何在 Python 中加入字符串列表?

我必须在这里停下来。我可以整天玩这个:)

维基百科(一个基于 wiki 技术的多语言的百科全书协作计划ˌ也是一部用不同语言写成的网络百科全书ˌ 其目标及宗旨是为全人类提供自由的百科全书)ˌ开放性的百科全书

照片由卢克·切瑟Unsplash 上拍摄

是的,这个库叫做“维基百科”。

您想快速定义术语吗?这个库允许您通过一行代码从维基百科中转储自然语言术语的定义或摘要。

首先,使用pip安装。

pip install wikipedia

然后,将其导入到您的代码中。

import wikipedia

定义一个术语如下。

wikipedia.summary("Hatsune Miku")

那太长了吗?想有一个简洁的定义?然后,把答案限制在一句话之内。

wikipedia.summary("Hatsune Miku", sentences=1)

例如,您有一个要定义的术语列表,使用这个库可以在几秒钟内定义所有的术语。

# Create a list with terms
terms = ['Python', 'Java', 'PHP', 'C++']# Define the terms in another list
definitions = [wikipedia.summary(term, sentences=1) for term in terms]# Combine them into a dictionary
dictionary = dict(zip(terms, definitions))# Print the dictionary
from pprint import pprint
pprint(dictionary)

如果是一个模棱两可的术语呢?库抛出一个异常,你可以捕捉并处理它。

当然,这个库的更多功能等着你去尝试。例如,您可以

  • 获取 HTML 格式的整个网页,这样你就可以应用你定制的解析器了
  • 获取页面的标题,这样可以帮助你标准化你的术语
  • 获取页面上的链接,允许您进行更多的深入研究

报纸 3k

absolute visionUnsplash 上拍摄的照片

与前两个相比,这个库可能更有用。一个典型的网络抓取应用就是下载最新的新闻,并从中提取有用和有趣的信息。

例如,您可能会下载关于某个特定主题的新闻,并在稍后执行一些情感分析。或者,试图找到所有关于一些股票市场上市公司的新闻文章,使用 NLP(自然语言处理)技术进行一些自动化调查,以方便您的投资。

通常,上述示例用例将从开发一个 web 抓取器/爬虫开始。但是,有了 Newspaper3k,可以简化很多。

还是那句话,我们用pip来安装。

pip install newspaper3k

然后,让我们导入它并构建一个针对特定新闻网站的刮刀。

import newspapersite = newspaper.build('[https://www.news.com.au/'](https://www.news.com.au/'))

一旦我们构建了 scraper 对象,我们就可以填充它的所有最新消息。

for article in site.articles:
    print(article.url)

这个库中有许多内置的解析特性。例如,获取新闻文章的标题:

# Let's just get the first news article as example
article = site.articles[0]
article.title

一旦你使用article.download()下载文章并由article.parse()解析,你将能够从新闻文章中提取更多的信息。

需要 NLP 功能?是的,它也有一些内置的。需要澄清的是,Newspaper3k 使用了nltk,这是另一个执行 NLP 功能的 Python 库,当你安装 Newspaper3k 库时,这个库会自动安装。但是,我发现nltk需要使用一个叫做punkt的子包。我的情况是默认不安装这个子包,需要在nltk手动下载。放心,一点都不复杂。下面是启用新闻文章的 NLP 特性的所有代码。

# import nltk and download "punkt" package
import nltk
nltk.download('punkt')article.nlp()

那么,它有什么样的 NLP 功能呢?获取文章关键词怎么样?

还记得我们上面那篇文章的全文吗?以下是全文:

太长了,读不下去。我们来总结一下。

article.summary

如果你愿意,现在你可以用 Python 来构建你的带有摘要功能的报纸刮刀。

摘要

照片由艾拉·贾尔迪姆Unsplash 上拍摄

这里是我推荐的三个“开箱即用”的 web 抓取库。我称它们为网络抓取库,但是正如你所看到的,它们不仅仅是抓取器。

这三个库的特点正是我热爱 Python 的原因之一。编程本身及其蓬勃发展的社区创造了如此多优秀的高级包装器,为我们的应用程序提供了便利。

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

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

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

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

赢得 2020 年大选的三条途径

原文:https://towardsdatascience.com/three-paths-to-victory-in-the-2020-election-ff41e029664?source=collection_archive---------36-----------------------

使用来自机器学习模型的见解

凯勒·琼斯在 Unsplash 上拍摄的照片

在我的上一篇文章中,我分享了一个回归模型,该模型预测了民主党在 2020 年大选中在每个州的投票份额。该模型预测了一个非常接近的结果——民主党以微弱优势(279-259)获胜。

鉴于竞争如此激烈,选举可能取决于每个政党如何在 50 个州投资有限的时间和资源。下面,我使用模型中的预测来讨论获得 270 张选举人票的策略。

模型预测

在开始分析之前,下面是对 2020 年大选各州预测的可视化:

每个州被分为五类——“强共和党”、“瘦共和党”、“掷硬币”、“瘦民主党”和“强民主党”。

使用前四次选举的模型预测,我们发现民主党很少失去“强民主党”和“瘦民主党”州,很少赢得“强共和党”和“瘦共和党”州:

如果我们假设预测的政党赢得了这些选举,民主党将获得 182 张选举人票,需要再获得 88 张选举人票才能达到 270 张的目标。

下面是他们应该从中抽取的“抛硬币”状态:

必赢之地:科罗拉多和弗吉尼亚

科罗拉多和弗吉尼亚总共有 22 张选举人票,是最有可能支持民主党的州。很难说这些不应该成为 2020 年提名人的主要关注点。

这两个州在 2008 年都被奥巴马击败,民主党在接下来的两次选举中获胜。

值得注意的是,2018 年的国会选举结果对民主党有利,他们在弗吉尼亚州和科罗拉多州分别获得了 56%和 55%的选票。两者都是分析期间(1976 年至 2018 年)的历史新高。

然而,民意调查显示,特朗普在弗吉尼亚州略微领先四名领先的民主党候选人中的三名。

这进一步加强了这一点——科罗拉多州和弗吉尼亚州预计将非常接近,他们值得民主党人花时间和精力来确保胜利。

随着在每个州的胜利,民主党的神奇数字从 88 下降到 66。

现在,让我们探索获得这 66 张选票的三条胜利之路:

路径#1 — 收回锈带

2016 年大选最大的惊喜之一是特朗普在锈带地区的表现,他赢得了密歇根州、威斯康星州和宾夕法尼亚州,并差点赢得明尼苏达州。

当我们随着时间的推移观察这些状态时,我们发现 2000 年和 2016 年都有类似的模式。像特朗普一样,在 1996 年比尔·克林顿相对较大的胜利之后,布什在这方面表现得相当好。因此,我认为 2016 年的结果令人惊讶,但并非史无前例。

同样值得注意的是,特朗普公司认为他们有足够的机会赢得这些州,他们在选举前在这些州进行了竞选活动。他们是对的。在很大比例的未受过教育的白人的支持下,川普能够在 2016 年赢得铁锈地带。

然而,到了最后,胜利的差距只有一分钟——密歇根州领先 10,000 票,威斯康星州领先 23,000 票,宾夕法尼亚州领先 43,000 票。

接下来,民主党最直接的胜利之路就是赢回这些州。除了在那里花费时间和金钱之外,他们还应该精心制作他们的竞选信息,记住没有受过教育的白人可能会决定这个地区,因此从他们的词典中删除像“可悲的”这样的词。

如果民主党赢得密歇根州(16 票)、威斯康星州(10 票)和宾夕法尼亚州(20 票),他们将获得 46 张选举人票。剩下的 20 个州可能会与希拉里在 2016 年赢得的州一起——明尼苏达州(10 个)、内华达州(6 个),以及缅因州(4 个)或新罕布什尔州(4 个)将使民主党获得 270 个席位。

路径二——南方的惊喜

南方有几个州在“活动”。佛罗里达(29 张)和北卡罗来纳(15 张)近年来在两党之间摇摆不定——总共价值 44 张选举人票。自 1996 年以来,亚利桑那州(11 人)和佐治亚州(16 人)每次选举都支持共和党,但近年来最有可能转向蓝色。

该模型预测民主党在佛罗里达、北卡罗来纳和亚利桑那的得票率都在 2%以内。

这三个州在国会选举中的民主党投票份额都有所增加。最引人注目的是,民主党人 Kyrsten Sinema 成为 40 年来第一个赢得亚利桑那州参议员席位的人。

如果民主党赢得佛罗里达州、北卡罗来纳州和亚利桑那州,他们将获得 55 张选举人票。把内华达州(6)、缅因州(4)和新罕布什尔州(4)也算在内,民主党可能会在没有中西部北部支持的情况下取得胜利。

路径 3——德克萨斯州的一切都更大

最后一条道路是一个极其冒险的政治策略,但也是一个有趣的思维练习:尝试拿下德克萨斯

但这可能吗?让我们来看看德克萨斯州在之前的大选中的结果:

自 1976 年吉米·卡特获胜以来,民主党最接近的一次是在 1992 年,当时比尔·克林顿赢得了 48%的选票,民主党或共和党都获得了选票。然而,第三党派候选人、德克萨斯人罗斯·佩罗赢得了 22%的选票,这可能会给希拉里带来额外的帮助。

自 2004 年以来,德克萨斯州的民主党选票份额从 38%上升到 45%。希拉里·克林顿——她在 2008 年几乎每个州的表现都比奥巴马差——在德克萨斯州表现更好。

此外,人口结构的变化可能有利于民主党人,他们现在正在努力吸引年轻和拉丁裔选民。

另一方面,德克萨斯州是一个大州,民主党需要比 2016 年多 80 万张选票才能获胜。这可能需要民主党人将大部分精力投入到这个州——这一策略可能会适得其反。

如果他们设法在德克萨斯州取得胜利,民主党只需要额外的 28 张选举人票,这是他们仅从佛罗里达州或几个摇摆州获得的总数。

外卖食品

  1. 2020 年的选举预计将非常接近,16 个州预计民主党将在 5%的差距内获胜。
  2. 不管他们更广泛的战略是什么,民主党人应该专注于保护科罗拉多州和弗吉尼亚州,因为它们值得大量的选举人票,应该最容易在摇摆州中获胜。
  3. 最简单的胜利之路是赢回密歇根州、威斯康星州和宾夕法尼亚州。如果民主党采取这种方式,他们应该把绝大部分精力放在这些州,避免分散精力。这可能是最有效的短期策略,可能导致民主党微弱的胜利。
  4. 在一个稍微更具侵略性的方法中,民主党可以通过改变佛罗里达州、北卡罗来纳州和亚利桑那州来试图从南部获胜。这涉及到更多的风险,但对党来说可能有更好的长期效果。这也增加了在选举中以更大优势获胜的可能性。
  5. 最后,最具侵略性的策略是试图颠覆德克萨斯。那里的巨大努力可能会导致令人震惊的胜利,改变未来几年的政治格局。

每个 ML 产品经理必须回答的三个问题

原文:https://towardsdatascience.com/three-questions-every-ml-product-manager-must-answer-35d73127cd5d?source=collection_archive---------18-----------------------

上周,我们在旧金山举办了第二次月度人工智能下午活动。从小型初创公司到大型科技公司,每天都在处理消费或企业机器学习(ML)产品的五位产品经理加入了我们的讨论,并进行了热烈而多样化的讨论。

安德烈·木桐Unsplash 上拍摄的照片

我们涵盖了广泛的不同主题,从最适合 ML 的问题类型,管理 ML 产品的独特挑战,用例选择以及优先顺序,构建 ML 产品的常见错误,与 ML 研究人员或工程师合作的最佳实践,以及作为 ML PM 取得成功所需的基本技能。

以下是我最喜欢的一些对话。

如何处理 ML 产品的可解释性问题?

之前的文章中,我谈到了可解释性和可解释性问题是如何对管理 ML 产品构成重大挑战的。与软件程序不同,我们不为 ML 算法定义一套规则。而是定义目标函数,提供训练数据,让神经网络自己学习。

[## 如何管理机器学习产品—第 1 部分

为什么管理机器学习产品这么难?为什么你应该关心?

towardsdatascience.com](/how-to-manage-machine-learning-products-part-1-386e7011258a)

这就是为什么 ML 对于人类难以向机器解释的问题特别有用。然而,这也意味着 ML 模型的行为就像暗箱一样,我们不知道它们实际上是如何工作的。为了解决这些问题,研究人员一直在寻找在开发黑盒模型之前、期间或之后解释黑盒模型的方法。

然而,即使我们能够实现更好的可解释性,ML 仍然涉及更多的不确定性,并且它不会是像软件编程那样为机器编写规则的确定性过程。因此,对于 ML PMs 来说,更重要的问题是:我们如何向用户传达不确定性?

在人工智能时代,用户体验(UX)将比以往任何时候都更加重要

根据最近的行业研究,三分之一的医疗保健人工智能 SaaS 公司正在从事诊断工作。但是 ML 的不确定性和缺乏可解释性使得它更难获得临床医生和家庭的信任。

慢性病筛查初创公司 Remedy 的产品战略负责人迈克·吴(Mike Ng)给出了一个将 ML 变成 UX 问题的有力例子,Remedy 利用可解释的深度学习和强化学习技术。

“我们没有直截了当地陈述预测,而是将它框定为‘由于原因 A、B 和 c,该患者比正常人有 5 倍的可能性出现某种程度的下降’。”这样,您就可以呈现由模型预测的有用信息,以便医生可以用来做出决策。

因为 ML 更具概率性,显示每个预测的置信水平也是设定正确预期的一种方式。与其替用户做决定,不如考虑呈现数据,让用户自己做选择。

允许用户提供反馈也很重要。即使模型在 95%的情况下预测正确的结果,仍然有 5%的情况下模型出错。我们需要能够优雅地处理错误

如何识别 ML 的正确用例?

ML 可以用来解决各种各样的问题,但是,就核心而言, ML 最适合做决策或预测。我们可以进一步将 ML 应用程序分为三种类型:

  • 检测和检查,例如银行或保险中的欺诈检测
  • 模式识别,例如推荐、排名、个性化
  • 高维认知,例如人工智能机器人、自动驾驶汽车

[## 如何管理机器学习产品——第二部分

最佳实践和我一路走来学到的东西。

towardsdatascience.com](/how-to-manage-machine-learning-products-part-ii-3bdabf91eae4)

作为一个产品经理,你应该知道 ML 可以用来做什么,更重要的是,你应该在什么时候避免在产品中使用 ML。例如,如果你的产品需要高精度或完全透明,你可能要考虑使用其他方法来解决你的用户问题。

然而,理解 ML 的用例只是第一步。要将客户需要的解决方案实际产品化,需要产品经理将两类人联系起来:一类人对 ML 了解很多,但对客户需求了解较少,另一类人拥有大量领域知识,想要整合 ML,但不知道从哪里开始。

这两组人说的不是同一种语言。作为一名产品经理,你将花费大量的时间与工程师/科学家一起工作,以了解 ML 的潜力和局限性。您还将经常与客户交谈,以确定他们的痛点,并思考您的团队可以构建哪些解决方案来解决客户的问题。寻找您的客户正在使用管道胶带的地方,并应用 ML。

与 ML 研究人员、科学家或工程师合作的最佳实践是什么?

在我们回答这个问题之前,你的目标是什么?

如果你的公司想发表更多的论文,那么拥有一个纯粹的研究团队是有意义的。然而,大多数公司都在努力制造产品,而不是做研究。如果你清楚地表明你专注于应用科学,你可能会吸引更多有类似想法的人,那些想制造实际产品的人。

其次,一旦你有了合适的人,确保他们与公司的其他人保持联系,这样我们就能在制造什么产品的问题上达成一致。例如,将您的 ML 研究人员与工程师放在同一个团队中,这样团队就可以构建早期原型来测试关键功能并进行迭代。

因为 ML 产品的性质,我们想给 ML 科学家更多的时间和空间去探索和实验。但是我们需要帮助团队专注于客户需要的和愿意支付的东西。这就是为什么我们需要对探索进行时间限制,并鼓励团队尽早地测试模型,并且从头到尾频繁地

小组讨论中提出的另一个有趣的观点是,ML 不仅需要技术上的改变,还需要组织上的改变。作为 ML 项目经理,你可以帮助其他利益相关者理解为什么构建 ML 产品是具有挑战性的,并帮助解决潜在的冲突。

就像我在我的上一篇文章中提到的,“认识开发 ML 和软件产品之间的区别。没有放之四海而皆准的方法。需要时,随时调整你的冲刺过程、计划或组织。”

例如,定义数据策略不是数据科学家的职责。这是一个战略决策,项目经理和高管甚至需要在构建 ML 产品之前就达成一致。你的公司在获得训练模型对抗竞争对手所需的专有数据方面有防御优势吗?还是行业巨头已经主导了大部分数据?

仅仅让工程和产品团队了解问题是不够的。你的公关或营销了解 ML 产品的本质吗?利弊?我们所做的权衡呢?做出错误预测的后果和代价是什么?公司准备好回答所有这些问题了吗?

我们的下一次活动将在三月的第一周举行。如果您想获得所有未来活动的通知或收到我们私人 AI & ML PM 脸书小组的邀请,请在此订阅。如果你有任何建议,请发电子邮件到 bastiane.huang@gmail.com 给我。

我们连线吧!如果你喜欢读这篇文章,请在这里订阅我的个人博客!

Bastiane Huang 是 OSARO 的产品经理,OSARO 是一家总部位于旧金山的初创公司,致力于开发软件定义的机器人。她曾在亚马逊的 Alexa 小组和哈佛商业评论以及该大学的未来工作倡议中工作。她写关于人工智能、机器人和产品管理的文章。跟着她到这里

本帖已在www.productschool.com社区发布。

实现有效数据项目的三个策略

原文:https://towardsdatascience.com/three-strategies-towards-effective-data-projects-eed29ad05ded?source=collection_archive---------44-----------------------

如何使您的数据科学项目符合业务需求?

图片由 Hebi B. 发自 Pixabay

许多数据科学项目没有投入生产,这是为什么?毫无疑问,在我看来,数据科学是一种高效的工具,具有令人印象深刻的性能。然而,一个成功的数据项目也是关于有效性的:做正确的事情正如 Russell Ackoff 在“变革型领导的系统观点”中所写的。

成功的解决问题需要为正确的问题找到正确的解决方案。我们失败更多的是因为我们解决了错误的问题,而不是因为我们用错误的方法解决了正确的问题——罗素·L·艾可夫(1974)

你如何专注于你的项目,并确保它们将为公司带来价值?你是否在战略性地思考如何让你的项目取得成果?

注意:我将使用高尔夫——一项战略性运动——作为一个说明性的类比。

OKR:设定你承诺要实现的目标

目标和关键成果(OKR) 已被成功的组织采用,以推动巨大的增长(英特尔、谷歌……)。它们最初是由约翰·杜尔登引入的,旨在提高创造价值的关注度。

总的想法是设定激励你的目标。想象一下,你对高尔夫球充满热情,下周五有一场大型比赛。在过去的几年里,没有人在球场的 18 个洞里有超过 15 个洞表现出色。设定自己去赢得它是一个很好的目标——它是具体的、雄心勃勃的,并且在给定的时间发生。然后你设定关键结果,它可以衡量你在这个目标上的表现。在这个高尔夫示例中,他们可能是:

  • 在 18 洞当中,至少有 16 洞达到标准杆数(进洞的理想杆数)。
  • 避免把球扔进沙坑超过三次——因为你知道你不擅长摆脱它们。
  • 比赛前进行 20 分钟的练习——因为你通常会用冰冷的肌肉打出一些糟糕的投篮。

检查所有的关键结果是一个很好的指标,你可能会赢。

在另一个场景中,为一家大银行工作,设想你的任务是建立一个准确率为 80%的贷款风险模型。以下是一些可能的关键结果:

  • 通过 XX/YY/ZZZZ 获得 80%的客户还款行为数据。
  • 通过 AA/BB/CCCC 测试三种可解释的模型类型。
  • 定义并跟踪四个指标,以跟踪模型的性能并了解模型的错误之处。

OKRs 可以用来集中注意力在任何事情上。我发现它们有助于定义我的项目目标:构建一个模型或一个应用程序,什么时候足够好?瞄准关键结果带来清晰。失败成为一种学习经历,激发更好的 OKRs 定义和工作。另一方面,成功是显而易见的,你应该享受它。

必读题目:衡量什么重要 作者约翰·杜尔登。

动力传动系统方法

动力系统方法是数据产品定义的综合策略。下图显示了其基本步骤:

高尔夫示例中的传动系统方法——来自 M. Koutero 许可的库存的元素。

在一个新项目中,我们可能会问自己:

  • 目标

设定目标包括回答以下问题:它是否为企业增加了价值?它与当前的路线图一致吗?应该什么时候做?它打开了新的视角吗?

  • 杠杆

最终产品中的哪些元素在我的控制之下?我可以改变产品的价格吗?推荐页的排名?…

  • 数据

给定目标和杠杆,我可以使用什么样的数据?什么是合规性问题?

  • 模型/模拟

模拟应该表明你的数据中是否有足够的信息与你的杠杆相结合来达到你的目标。在贷款模式示例中,您能以更低的风险推动更多销售吗?

每一步也是退出点。如果你无法单独或集体找到解决方案,这可能意味着不值得你花时间,你应该把注意力放在别的事情上。

必读专题: 设计伟大的数据产品by【杰瑞米·霍华德】Margit ZwemerMike Loukides****

决策智能

决策智能是一个更加通用的学科,处理如何在复杂的情况下建立给定目标的策略。一般流程整合了外部原因、多重因果联系和反馈循环等概念。创建因果图的团队可以理性地决定一个策略,并清晰地理解手头的问题。人们可能会将决策智能理解为 OKRs 和驱动系统方法之间的扩展合并。

因果图初级读本——根据 M. Koutero 的许可,包含来自库存的元素。

在上面的小例子中,一旦你选择了一个球杆,球是会飞得高(希望飞得远)还是会在地上滚动意味着风或多或少会影响。呆在地面上可能更安全,但是只拍小镜头,你会需要更多的镜头。有一个好的策略意味着你会找到一个合理的平衡来实现你的目标和目的。

在 OKR 关于风险贷款模式的例子中,我们将在这里进行更深入的调查。在某些类型的客户身上犯错误的贷款模式会对资产净值造成危害吗?负责验证贷款的员工会不会只依赖这个模型,变得不那么善于思考,在棘手的情况发生时也不太可能调整自己的行为?因果图使你能够理解你的决定的间接后果。如果您认为获得正确的干净数据并构建一个模型以用于生产通常是一项需要几个月的任务,那么是否不值得花一些时间来解释您这样做的原因呢?

对于工程师和科学家来说,这与指定一个经典的数字产品的限制和目标性能没有太大的不同,只是拓宽了视角。我感兴趣的是对决策制定的关注(“我应该构建这个产品吗?如何构建?”)将业务和技术人员放在一起,以确保在整个生态系统的范围内,下一步是正确的。

必读专题: 链接 作者洛里安·普拉特

战略并不局限于领导者、经理、产品经理等的自上而下的实践。我认为这是任何工作的一部分,在引擎盖下达成妥协并有一些战略性的思考。也许这些框架有时过于详细,但其核心是,它们从一个简单的问题开始,我们可以问自己:我为什么要做这个项目?

作为一个超越人工智能炒作的领域,我们不能停留在一个孤立的系统中,在没有明确显示其价值的情况下扩展我们的专业化水平。缺少的中层专业人士在这项任务中可能很重要(保罗·r·道赫蒂——埃森哲的 CTIO 和洛里安·普拉特)。他们是否会成为决策智能专家数据战略家数据产品经理将是一个语义问题,并在该领域建立新的实践。****

___________

参考资料:

  • 阿科夫,R,L: 1998 年,变革型领导的系统观点(系统实践和行动研究)。**
  • Ackoff,R. L.: 1974 年,重新设计未来:解决社会问题的系统方法**
  • Doerr,J: 2018,衡量什么是重要的:谷歌、博诺和盖茨基金会如何通过 OKRs (组合企鹅)震撼世界。**
  • 普拉特,L: 2019,链接(翡翠出版有限公司)。**

面向有抱负的分析师的三大技术平台

原文:https://towardsdatascience.com/three-tech-stacks-for-aspiring-analysts-5cde49a22337?source=collection_archive---------28-----------------------

分析/数据科学

初学者构建技术堆栈指南

来源

在今年夏天的实习期间,我花了大量的时间在办公室之外学习新的技术技能,同时完善我的旧技能。当我即将结束营销自动化/分析实习时,我有幸与之共事的终身市场分析师有着非常深厚的技术背景,并教会了我一些我以前从未想过的事情。

当我开始我的分析和数据科学之旅时,我有一个非常小的技术堆栈。这并不是说知道一百万种语言和工具会有所帮助,而是我体验过的工具与分析和数据科学几乎没有关系。现在,每种技术都有其独特的价值,但是,我想就我从我的同事以及我自己的同事那里看到的不同技术提供一些观点!

你们中的许多人会发现,我的技术并不是世界上最先进的。我不是人工智能专家或机器学习大师,因为我仍在学习,并将在相当一段时间内,甚至在大学毕业后。然而,到目前为止,我所学到的东西已经能够帮助我,所以我希望给任何自学或从商业学科转向分析和数据科学的人一些指导。让我们开始吧!

免责声明:我不是全职的数据专家,我只是简单地转述我从暑期实习和个人实践中获得的经验。这并不是要告诉你你到底需要知道什么,而是从我的经历中给你一些实用的建议。高级技术信息请查看 走向数据科学 。如果你对一些帮助你开始分析的建议感兴趣,请继续阅读!

一、新手技术栈

  1. 微软优越试算表
  2. (舞台上由人扮的)静态画面
  3. 结构化查询语言

这就是你开始工作所需要的一切!你不需要马上了解 Python 或者 NoSQL 数据库。我艰难地了解到,在开始编码和建模之前,你需要知道如何提出问题,如何超越数字,以及如何像数据专家一样思考。每一个伟大的音乐家在学习乐器之前都会学习基本的音乐理论,就像数据专家在学习工具之前会学习专业一样。在我调整了我在许多不同工具中的许多课程之后,我把它带回到这三个工具上。老实说,这可能是入门级分析中最常用的三种工具。在我的实习中,大多数从事建模和机器学习的专业人士都至少有 7-10 年的职业生涯,而这只是他们的专长。我实习的所有分析师和数据科学家都在某种程度上使用这三个工具。您可以使用这三个工具完成所有的分析、ETL 和数据库管理。现在他们是最快的还是最好玩的?我个人喜欢 SQL,但在大多数情况下,它不像 Python 或其他高级工具那样令人兴奋。然而,这些工具是开始学习基本概念的好方法!

二。初级技术堆栈

  1. 微软优越试算表
  2. (舞台上由人扮的)静态画面
  3. 结构化查询语言
  4. Python(新手/初学者)
  5. 功率 BI

在您花一些时间了解分析和数据科学中的不同概念(如数学、统计、工作流)并提出正确的问题后,您就可以开始实施 Power BI 和 Python 等工具了。当我第一次开始学习 Python 时,我的一位导师说,“Python 是一个非常强大的工具,但也非常令人难以置信。对于数据科学,学习基础知识,然后开始一次学习一个不同的包。当你看到不同的元素如何结合在一起形成一门伟大的语言时,Python 就有意义了”。所以对我来说,我掌握了 Python 的基础知识,比如语法、循环、数据类型等等。之后开始做熊猫,Matplotlib,Numpy。这是我建议首先学习的三个软件包,因为它们简单易学,但是功能强大,并且在您将要做的许多工作中都可以使用。

“Python 是一个非常强大的工具,但也令人难以置信。对于数据科学,学习基础知识,然后开始一次学习一个不同的包。当你看到不同的元素如何结合在一起形成一门伟大的语言时,Python 就有意义了”

三。中级/高级技术堆栈

  1. 微软优越试算表
  2. (舞台上由人扮的)静态画面
  3. 结构化查询语言
  4. Python(中级/高级)
  5. 功率 BI
  6. 雪花
  7. 火花
  8. NoSQL

我想以一句警告的话开始:你不需要了解这些工具中的每一个!Excel、Tableau/Power BI、Python 和 SQL 是分析师和数据科学家的主要工具,也是我自己技术堆栈的一部分。在你对这些工具有了扎实的知识和经验之前,我不会将任何其他东西加入你的堆栈。也就是说,一旦你觉得你已经掌握了上述工具,那么将是一个很好的时机来添加其他东西,这取决于你认为你会需要什么。你打算在数据库工作吗?像 MongoDB 这样的 NoSQL 工具是开始学习的好工具。数据仓库?雪花是个不错的选择。ETL 还是机器学习?火花是一个受欢迎的最爱。对我个人来说,我将更深入地研究雪花,因为我知道我的职业生涯将从数据仓库开始。请注意,我没有说我正在学习所有三个新工具,只是其中一个。当您发现不同工具的用例时,那将是您开始获得更多的时候。“如果你不使用它,你就会失去它”,这是一个真实的事情,所以不要陷入拥有最大的技术堆栈的陷阱!公司更希望你有三种你非常了解的工具,而不是十种你一无所知的工具。

四。我的个人技术资料

如你所见,我不是机器学习专家或数据库专家。我的工具箱里有一些工具,但是我还有很多东西要学。然而,我把这个放在这里是为了告诉你,一旦你开始做了,你将会一帆风顺,并且在做的过程中不断增加新的东西。我学习这些工具并不一定只是为了学习它们,我学习每一个工具是因为我要么处于需要这些工具的情况下,要么处于这些工具是我唯一能得到的情况下。不要陷入你想要学习的不同工具中,学习分析和数据科学的过程和工艺,因为这就是它的全部!

结论

希望这在某种程度上有所帮助!这并不是要告诉你你到底需要学习什么,而是给你一张地图,你可以在那里规划自己的旅程。慢慢来,一次学习一种工具,在需要的时候选择不同的工具。我保证,如果你慢慢来,这个过程将会是愉快和充实的。稳扎稳打赢得比赛!一定要在个人项目和编码挑战中练习这些技能,这样你就可以巩固你所学到的东西。所以深呼吸,打开你的网络浏览器,开始学习吧!我们对这个世界有太多的不了解,尤其是在新冠肺炎期间,这个世界需要分析师和数据科学家的帮助来理解和理解我们面临的不同问题。上面的图片应该是可以下载的,所以当你决定下一步应该学什么的时候,可以随意下载它们作为指导。快乐学习!

看看我的其他一些故事吧!

成功实习的 10 个秘诀

我作为营销分析实习生学到的东西

营销分析实习生的一天

要联系我或接收更多内容,请在 Twitter 上关注我@BMNAnalytics

您可以做三件简单的事情来改进任何 Power BI 报告的设计

原文:https://towardsdatascience.com/three-things-to-instantly-improve-the-design-of-any-power-bi-report-25a9e8d58f6f?source=collection_archive---------52-----------------------

如何使用风格指南、图标和登录页面来推进您的商务智能游戏

PowerBi 是一个强大的工具。但是,和许多复杂的产品一样,它也有一些局限性。对于几乎所有这些问题,您都可以采取一些变通办法,使您的开发和典型用户的生活更加轻松。来说说他们吧。

1.样式指南

颜色。咩。无聊。但同时你也不希望你的报告看起来像一堆垃圾,不是吗?你不希望你在 2020 年开发的报告看起来像是在 Windows 95 时代创建的。为什么?因为现在每个人都习惯于好看的界面、好看的设备、好看的工具和网站,它们 a)功能性强,b)用户友好,c)简单美观。

Windows 95 与 macOS

所有公司都有自己的风格指南或品牌手册,基本上都是 pdf 格式的文档,有一套解释你的品牌如何运作的规则。对我们来说,最重要的是颜色,我们必须使用使我们的报告看起来像一个品牌。一个例子。如果你正在为 Spotify 做一份报告,让它看起来像 Spotify 本身。使用合适的标志,使用正确的颜色,为图表添加与品牌一致的颜色,瞧。你的报告将看起来现代、专业,没有人会意外地认为这是关于脸书的报告。但是这里还有一个免责声明,因为我知道你现在想说什么。是的,应用程序本身处于黑暗模式。我知道,没关系。但是说到可读性,光模式对你的眼睛来说更容易。Spotify 应用程序不是为阅读和分析数据而设计的。PowerBI 则相反。

2.核标准情报中心

你解锁你的手机,看到图标。你打开一个 Instagram 应用程序,看到图片和图标作为导航。你打开 Spotify(不,他们不会为此付钱给我,但他们可以💸)要搜索艺术家,你只需点击放大镜,放大镜是一个被广泛认可的图标,象征着搜索功能。图标是任何用户界面(UI)中最受欢迎的构件之一。请告诉我,如果你在谷歌图片中输入“Power BI report”,为什么前 14 个例子的报告根本没有使用图标?

前往 https://www.google.com/search?q=power+bi+report查看!

那么,为什么您应该在 Power BI 报告中使用图标呢?它们能很好地抓住用户的注意力,提升用户体验(UX)。它们提供功能并创建好看的报告。

假设您正在寻找一个 KPI。总收入。哪个磁贴能更快吸引你的注意力?上面写着“总收入”的那个还是上面写着“总收入”和一个美元符号的那个?

但是要小心!需要考虑两件事:

  1. 不要走上去掉任何标签,只用图标代替的道路。只有图标的界面是不好的界面。将一个标签和一个图标结合起来,让用户体验更好。
  2. 与图标保持一致。还记得我之前说的品牌书或者风格指南吗?有可能有人想到了,图标就在那里,在营销或设计部门,等着你。沉住气,在你去网站上挑选图标之前,比如 Flaticon 去看看有没有图标。

3.登录页面

谁不喜欢标签呢(我这里说的不是浴缸)?这是一种简单有效的报告切换方式。数据科学家通过使用 Excel 对它们很熟悉,我们在 Power BI 中使用它们,所以为什么要改变它呢?答案很简单,而且在政治上非常正确——有些人可能对使用 Excel 有不好的记忆。有些人认为它是邪恶的😼

那么,为什么不改善报告的整体用户体验,并创建一个登录页面,用户可以从该页面导航到任何可用的报告,而无需使用选项卡呢?这就是流程。

用户总是从登录页面开始。从这里,她可以决定她对什么报告感兴趣。要打开特定的报告,用户只需点击它。报告打开。如果用户想要查看其他报告,她可以单击公司名称并返回到登录页面。

那么为什么呢?因为这是互联网上每一个网站都有的模式。你点击图标(或名称)返回主页。这里没什么新鲜的。一切都很清楚,每个只使用过一次互联网的人都知道它是如何工作的。那么为什么不在 PowerBI 中重用这种模式呢?

关于作者 我是一名资深 UX 和产品设计师,喜欢人、数据和金毛。选择你的毒药,在 LinkedInTwitterMedium 上关注我。

三个有用的熊猫方法

原文:https://towardsdatascience.com/three-useful-pandas-methods-f05addd926c3?source=collection_archive---------41-----------------------

读取、选择和写入数据

来源

Pandas 是一个非常有用的 python 库,它支持数据读取、从数据生成统计数据、转换数据等等。在这篇文章中,我将讨论我作为数据科学家经常使用的三种方法。

我们开始吧!

读取数据

我们将讨论的第一种方法是熊猫中的 CSV 文件读取方法。如果我们有一个。csv '文件,我们可以使用' read_csv()'将数据读入 Pandas 数据帧。Pandas 数据框是一个包含行和列的表格数据结构。对于我们的示例,让我们将 Reddit —数据是美丽的 CSV 文件(可在这里找到)读入熊猫数据框:

import pandas as pd
df = pd.read_csv("r_dataisbeautiful_posts.csv")

为了显示我们已经成功地读入了数据,我们可以打印前五行:

print(df.head())

对于其他文件扩展名,还有其他方法。例如,我们用' read_html()'来表示。' html '文件,' read_excel()' for '。xls '文件,' read_parquet()',for '。镶木地板的文件和更多。你可以在 pandas 这里找到 IO 工具的完整列表。

现在我们将继续选择熊猫的数据。

选择数据

假设我们想从我们之前看到的 Reddit — Data is Beautiful 数据集中选择前 500 行数据。我们可以使用。iloc[]'方法按索引选择前 500 行。我们还可以打印选择前后数据框的长度:

print("Length of data frame before row selection: ", len(df))
df = df.iloc[:500]
print("Length of data frame after row selection: ", len(df))

我们也可以使用'基于我们选择的列中的值来选择数据。loc[]'。让我们选择“num_comments”值(注释的数量)大于或等于 50 的数据,并打印结果:

print("Length of data frame before filtering: ", len(df))
df = df.loc[df.num_comments >= 50]
print("Length of data frame after filtering: ", len(df))

我们还可以打印“num_comments”的一组值,以验证我们所做的更改:

print(set(df['num_comments']))

我们看到所有的唯一值都大于 50。

将数据写入文件

类似于 Pandas 中用于读取数据的工具套件,有几种方法可以将数据写入文件。假设我们想将之前处理的过滤后的数据帧写入 a’。csv。我们可以使用。to_csv()”方法将结果写入。“csv”文件:

df.to_csv("new_file_r_dataisbeautiful_posts.csv")

然后,我们可以将数据读入数据框:

new_df = pd.read_csv("new_file_r_dataisbeautiful_posts.csv")

并打印结果:

print("Length of new data frame: ", len(new_df))

这正是我们所期待的。

结论

总之,在这篇文章中,我们讨论了三种对熊猫有用的方法。我们讨论了如何使用“read_csv()”方法来读取。csv 文件转换成数据帧。接下来,我们讨论了如何通过行和列值选择和过滤数据。最后,我们演练了如何将过滤后的数据帧写入新的。csv 文件。我希望你觉得这篇文章有用/有趣。这篇文章的代码可以在 GitHub 上找到。感谢您的阅读!

机器学习平台的三种分类方法

原文:https://towardsdatascience.com/three-ways-to-categorize-machine-learning-platforms-924cf1588163?source=collection_archive---------37-----------------------

照片由https://unsplash.com/@image_conscious提供

机器学习(ML)平台有多种形式,通常只解决 ML 问题空间的一个或几个部分。那么,如何理解那些自称为 ML 平台的不同平台呢?

机器学习平台有多种形式,从标记数据到可视化数据,从训练模型到监控部署的模型。所有这些不同的因素,以及更多因素,构成了人们所说的机器学习平台,因此作为技术评估人员,您有责任了解围绕机器学习的核心概念,以便您知道什么样的平台最适合您的需求。这篇博文将介绍三种看待 ML 平台的方式。

什么是机器学习平台?

机器学习(ML)平台是允许您自动化或外包部分数据科学工作的服务或工具。然而,他们这样做的方式可能会非常不同。一个库,比如 MLFlow ( https://mlflow.org/),,)就是一个平台,同理,那一个分析平台 H2O(【https://www.h2o.ai/】)就是一个平台。花几分钟时间阅读这两个产品,你会发现它们用完全不同的方法解决了完全不同的问题。那么一个外行人怎么能比较这两个平台呢?

首先,我们来定义一下机器学习中的标准问题。在更高的层面上,机器学习可以分为三个部分:

让我们来看看其中的每一个,看看它们需要什么。

数据管理

数据本身可以分为表格数据(例如包含客户信息的数据库)和非结构化数据(例如我们产品在不同场景下的图像)。机器学习中的数据管理与收集、预处理(ETL)、标记、注释和探索数据等问题有关。每一项挑战都需要不同的工具。

模型开发

模型训练可以分为特征提取和训练。根据您是在构建 AutoML 解决方案、使用预先存在的模型、构建传统的机器学习模型(如决策树)还是在大型非结构化数据上构建深度学习模型,培训也会有所不同。对于每种情况,对基础设施、框架和协作工具都有不同的需求。

预测服务

预测服务的两个主要类别是其部署方式,要么作为软件的一部分,要么作为可从服务访问的外部访问点。模型也可以用于批量推理(当对预测的需求是零星的时候)或实时推理(当需求是恒定的时候)。在预测服务中要考虑的其他问题是模型的 AB 测试、新模型的金丝雀服务、模型的回滚、模型陈旧性等等。

摘要

从主要的三个机器学习管道类别可以看出,需求和支持这些需求的工具有很大的不同。整个工具链中的进一步维度来自机器学习团队的背景。具有软件工程背景的数据科学家倾向于重视允许他们在 IDE 中开发模型的工具,而最近学习分析和数据科学的学生更习惯于交互式 web 界面,如 Jupyter 笔记本。此外,来自您使用的云提供商或您可能拥有的内部 GPU 集群的公司内部工具链也会影响可以使用的工具。

因此,假设对你来说最好的工具与你的竞争对手不同是公平的。

最初发表于【https://blog.valohai.com】

创建 Dockernized LaTeX 环境的三种方法

原文:https://towardsdatascience.com/three-ways-to-create-dockernized-latex-environment-2534163ee0c4?source=collection_archive---------6-----------------------

LeTeX + Docker + VSCode 远程容器入门

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

**Table of Contents**[**Introduction**](#7f9b)1\. [Setup](#cdb9)
2\. [Method 1: tianon/latex](#3fca)
3\. [Method 2: Remote-Containers](#7949)
4\. [Method 3: Creating your container](#1707)
5\. [How to switch Remote containers](#2ca1)
6\. [Opening a PDF](#9b9a)[**Conclusion**](#95c4)

介绍

我们可以在任何环境下运行 Docker 应用程序,Linux、Windows 或 Mac。Docker 为最常用的操作系统和应用程序提供了一组官方基础映像。Docker 允许您完全控制您的环境,安装您需要的东西,从 Dockerfile 删除和安装。

在本文中,我将向您展示如何在 Docker 和 VSCode 远程容器扩展上使用 LaTeX 的三种方式。第一部分使用 tianon/latex 图像,第二部分使用qmc gaw/latexdevcontainerDocker 图像。最后,我们基于 qmcgaw/latexdevcontainer Docker 映像创建我们的映像。

设置

如果你愿意,你可以从你的电脑上删除 LaTeX。

对我来说,我需要跑步:

$ brew uninstall mactex

请安装 Docker 桌面VSCode 的远程容器LaTeX-Workshop VSCode 扩展

VSCode 扩展 Microsoft Remote —容器。作者图片

VSCode 扩展 LaTeX 研讨会。作者图片

[## 使用 Latex 时如何自动更新 PDF

使用 latexmk 和 VSCode 自动更新 PDF 的指南

towardsdatascience.com](/how-to-auto-update-pdf-when-working-on-latex-ad9eeabdb7a1)

方法 1:天农/乳胶

拉 tianon/latex 图像:

$ docker pull tianon/latex

按 SHIFT+CMD+P 打开 settings.json:

VSCode SHIFT+CMD+P .图片作者。

并添加以下内容:

{
    // ... YOUR OTHER SETTINGS ... // latex
    "latex-workshop.docker.enabled": true,
    "latex-workshop.latex.outDir": "./out",
    "latex-workshop.synctex.afterBuild.enabled": true,
    "latex-workshop.view.pdf.viewer": "tab",
    "latex-workshop.docker.image.latex": "tianon/latex",
    // End
  }

创建一个 tex 文件,并输入以下内容:

\documentclass{article}
\begin{document}An Example for a very \tiny{tiny} \normalsize \LaTeX \ document.\end{document}

您可以通过单击构建图标或在 Mac 上使用 OPTION+CMD+B 来构建 LaTeX 文件。

单击构建图标。图片作者。

此后,每当你保存一个文件,它会自动更新 PDF。

保存时,文件将被更新。图片作者。

现在你在 Docker 上运行 LaTeX。

方法 2:远程容器

Visual Studio Code Remote-Containers 扩展允许您使用一个 Docker 容器作为全功能开发环境。它允许您打开容器内(或装入容器中)的任何文件夹,并利用 Visual Studio 代码的完整功能集。项目中的一个 devcontainer.json 文件告诉 VS 代码如何使用定义良好的工具和运行时堆栈来访问(或创建)开发容器。—来自在容器内展开

在您的目录中,创建[.devcontainer/devcontainer.json](https://github.com/qdm12/latexdevcontainer/blob/master/.devcontainer/devcontainer.json) 并添加以下内容:

{
    "name": "project-dev",
    "dockerComposeFile": ["docker-compose.yml"],
    "service": "vscode",
    "runServices": ["vscode"],
    "shutdownAction": "stopCompose",
    "workspaceFolder": "/workspace",
    "postCreateCommand": "",
    "extensions": [
        "james-yu.latex-workshop",
        // Git
        "eamodio.gitlens",
        // Other helpers
        "shardulm94.trailing-spaces",
        "stkb.rewrap", // rewrap comments after n characters on one line
        // Other
        "vscode-icons-team.vscode-icons",
    ],
    "settings": {
        // General settings
        "files.eol": "\n",
        // Latex settings
        "latex-workshop.chktex.enabled": true,
        "latex-workshop.latex.clean.subfolder.enabled": true,
        "latex-workshop.latex.autoClean.run": "onBuilt",
        "editor.formatOnSave": true,
        "files.associations": {
            "*.tex": "latex"
        },
        "latex-workshop.latexindent.args": [
            "-c",
            "%DIR%/",
            "%TMPFILE%",
            "-y=\"defaultIndent: '%INDENT%',onlyOneBackUp: 1\"",
        ]
    }
}

在设置中,我们允许用 ChkTeX 列出 LaTeX,递归地删除子文件夹中的 LaTeX 辅助文件,并在构建时删除 LaTeX 辅助文件。

如果你愿意,你可以在 vs code > Preferences > Settings > Extensions > LaTeX 中看到更多设置。

LaTeX 的 VSCode 设置。作者图片

创建[.devcontainer/docker-compose.yml](https://github.com/qdm12/latexdevcontainer/blob/master/.devcontainer/docker-compose.yml) 并添加以下内容:

version: "3.7"services:
  vscode:
    image: qmcgaw/latexdevcontainer
    volumes:
      - ../:/workspace
      - ~/.ssh:/home/vscode/.ssh:ro
      - ~/.ssh:/root/.ssh:ro
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=
    cap_add:
      - SYS_PTRACE
    security_opt:
      - seccomp:unconfined
    entrypoint: zsh -c "while sleep 1000; do :; done"

我们用qmcgaw/latexdevcontainer作为image。它使用 texlive 2020 基本方案和 latexmk 将 LaTeX 编译成 PDF。它使用LaTeX ident在保存时格式化,并使用 chktex 用于 LaTeX 林挺。

您具有以下结构:

目录结构。作者图片

点击左下方的绿色图标,或者在 Visual Studio 代码中打开命令调板(CMD/CTRL+SHIFT+P),选择Remote-Containers: Open Folder in Container...,选择你的项目。

绿色远程容器图标。作者图片

选择远程-容器:打开容器中的文件夹…作者图像

它将提取 Docker 图像,在本例中为qmcgaw/latexdevcontainer,并在后台运行一个容器。

结果来自 docker images,docker PS-a . images by Author

一旦完成,你会在 VSCode 的左下方看到“Dev Container”。

左下方显示开发容器。作者图片

如果您需要安装 LaTeX 包,您可以在 VSCode 终端中使用tlmgr:

$/workspace tlmgr update --self
$/workspace sudo apk add xz
$/workspace tlmgr install lastpage
$/workspace texhash

容器中的终端命令。作者图片

创建一个简单的 tex 文件:

\documentclass{article} 
\usepackage{lastpage}
\begin{document}
An Example document.
\[
 \frac{4}{12}
\]
\end{document}

当你保存它时,它会创建一个 PDF 文件。

保存 tex 文件创建 PDF 文件。作者图片

方法 3:创建容器

qmcgaw/latexdevcontainer是创建 docker 文件并在映像中安装所有包的一个很好的起点。这里有一个例子。

创建一个新目录,并在其中创建一个 Dockerfile 文件:

FROM qmcgaw/latexdevcontainer
ARG USERNAME=vscode
USER root
RUN tlmgr update --self && \
    tlmgr install latexindent latexmk && \
    tlmgr install mathexam setspace adjustbox xkeyval collectbox enumitem lastpage && \
    texhash
USER ${USERNAME}

这将更新tlmgr并安装我需要的所有软件包。我们可以使用tlmgr install ...添加任何乳胶包。

我们从这个 Dockerfile 文件构建一个图像。

$ docker build -t shinokada/latexexam .

我从 Docker 文件所在的目录运行这个命令。

让我们检查一下我们刚刚创建的图像。

$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
shinokada/latexexam        latest              7035f718823c        32 seconds ago      401MB
qmcgaw/latexdevcontainer   latest              85b911aaea3e        3 weeks ago         382MB

它比 qmcgaw/latexdevcontainer 多 19 MB。

可以推送到 Docker Hub,这样以后就可以用了,还可以分享给别人。

$ docker login
...
$ docker push shinokada/latexexam
...

我们将更新.devcontainer/docker-compose.yml文件,以便 VSCode 使用我们新的 Docker 映像。

version: "3.7"services:
  vscode:
    image: shinokada/latexexam
    volumes:
      - ../:/workspace
      - ~/.ssh:/home/vscode/.ssh:ro
      - ~/.ssh:/root/.ssh:ro
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=
    cap_add:
      - SYS_PTRACE
    security_opt:
      - seccomp:unconfined
    entrypoint: zsh -c "while sleep 1000; do :; done"

唯一不同的是image: shinokada/latexexam

来更新一下.devcontainer/devcontainer.json。我们将输出 PDF 到/out目录。我们使用和以前一样的文件,并添加一行:

...
"settings": {
        // General settings
        "files.eol": "\n",
        // Latex settings
        "latex-workshop.chktex.enabled": true,
        "latex-workshop.latex.outDir": "./out",
        ...

让我们创建一个名为 percent.tex 的样本 tex 文件。

您的目录结构如下:

目录结构。作者图片

然后像之前一样选择“打开容器中的文件夹”。它将启动开发容器。

保存 percent.tex 文件,看到在out目录下创建了一个 PDF。

目录外。作者图片

创建的 PDF。作者图片

如何切换远程容器

当您更改.devcontainer目录中的文件时,您需要重建一个容器。选择“远程-容器:重建容器”。

当您切换到另一个容器时,使用 Remote-Containers:重建容器。作者图片

如果上述方法不起作用,您可能需要先选择“远程容器:本地重新打开”,然后选择“远程容器:打开容器中的文件夹”。

打开 PDF

您可以在 VSCode 选项卡或 web 浏览器中查看 tex 文件。请注意,你需要从一个 tex 文件。如果您尝试从另一种类型的文件中打开它,它将不起作用。

乳胶工作坊查看乳胶 PDF 菜单。作者图片

结论

qmcgaw/latexdevcontainer的大小是 382MB,比tianon/latex小很多。您可以通过创建 docker 文件并使用FROM指令指定您正在构建的父映像来定制您的映像。

即使tianon/latex的文件大小很大,但是使用它的好处是不需要安装包。它已经有了大部分的标准包。

比较图像大小。作者图片

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

https://blog.codewithshin.com/subscribe

参考

在 tf.keras / TF2 中使用自定义验证指标的三种方式

原文:https://towardsdatascience.com/three-ways-to-use-custom-validation-metrics-in-tf-keras-tf2-bb9c40a3076?source=collection_archive---------17-----------------------

如何在 TensorFlow 2 中使用自定义验证指标

照片由 Unsplash 上的米切尔·布茨拍摄

Keras 提供了一系列指标来验证测试数据集,如准确性、MSE 或 AUC。然而,有时您需要一个定制的指标来验证您的模型。在这篇文章中,我将展示三种不同的方法来实现您的指标并在 Keras 中使用它。

虽然最初 Keras 中只包含少数指标,但现在已经有了很多不同的指标。对于 TensorFlow 2 捆绑的 Keras 版本,所有指标都可以在 tf.keras.metrics 中找到。

使用 tensorflow 插件

Tensoflow 插件库提供了一些额外的指标。在开始自己实现之前,最好检查一下你的度量标准是否可用。要使用 tensorflow 插件,只需通过 pip 安装即可:

pip install tensorflow-addons

如果您没有找到您的指标,我们现在可以看看这三个选项。函数、回调和度量对象。

简单的度量函数

在 Keras 中定义指标最简单的方法是简单地使用函数回调。该函数有两个参数。第一个参数是地面实况(y_true ),第二个参数是来自模型的预测(y_pred)。在运行验证时,这些参数是张量,所以我们必须使用 Keras 后端进行计算。

import tf.keras.backend as K
def matthews_correlation(y_true, y_pred):
    y_pred_pos = K.round(K.clip(y_pred, 0, 1))
    y_pred_neg = 1 - y_pred_pos

    y_pos = K.round(K.clip(y_true, 0, 1))
    y_neg = 1 - y_pos

    tp = K.sum(y_pos * y_pred_pos)
    tn = K.sum(y_neg * y_pred_neg)

    fp = K.sum(y_neg * y_pred_pos)
    fn = K.sum(y_pos * y_pred_neg)

    numerator = (tp * tn - fp * fn)
    denominator = K.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn))

    return numerator / (denominator + K.epsilon())

将此函数用于 Keras 模型:

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=[matthews_correlation])

调用 fit()现在输出:

245063/245063 [==============================] - 63s 256us/step - matthews_correlation: 0.0032 - val_matthews_correlation: 0.0039(Note that the name is the function name, while for validation data there is always the val_ prefix)

使用回调的间隔评估

如果您想要每 N 个时期在一个单独的数据集上评估模型,您可以使用自定义回调。在这种情况下,使用来自 scikit-learn 的 AUC 分数。

from sklearn.metrics import roc_auc_score
from tf.keras.callbacks import Callback

class IntervalEvaluation(Callback):
    def __init__(self, validation_data=(), interval=10):
        super(Callback, self).__init__()

        self.interval = interval
        self.X_val, self.y_val = validation_data

    def on_epoch_end(self, epoch, logs={}):
        if epoch % self.interval == 0:
            y_pred = self.model.predict_proba(self.X_val, verbose=0)
            score = roc_auc_score(self.y_val, y_pred)
            print("interval evaluation - epoch: {:d} - score: {:.6f}".format(epoch, score))

为了用这个评估设置训练模型,对象的实例作为回调传递给 Keras。

ival = IntervalEvaluation(validation_data=(x_validate, y_validate), interval=10)
model.fit(x_train, y_train,
          batch_size=8196,
          epochs=25,
          validation_data=[x_test, y_test],   
          class_weight=class_weight,
          callbacks=[ival],
          verbose=1 )

结果是这样的:

interval evaluation - epoch: 0 - score: 0.545038
interval evaluation - epoch: 10 - score: 0.724098
interval evaluation - epoch: 20 - score: 0.731381

扩展 tf.keras.metrics.Metric

最后,可以扩展度量对象本身。(从堆栈溢出到 Geeocode 的积分)

class CategoricalTruePositives(tf.keras.metrics.Metric):
    def __init__(self, num_classes, batch_size,
                 name="categorical_true_positives", **kwargs):
        super(CategoricalTruePositives, self).__init__(name=name, **kwargs)
        self.batch_size = batch_size
        self.num_classes = num_classes    
        self.cat_true_positives = self.add_weight(name="ctp", initializer="zeros")
    def update_state(self, y_true, y_pred, sample_weight=None):     
        y_true = K.argmax(y_true, axis=-1)
        y_pred = K.argmax(y_pred, axis=-1)
        y_true = K.flatten(y_true)
        true_poss = K.sum(K.cast((K.equal(y_true, y_pred)), dtype=tf.float32))
        self.cat_true_positives.assign_add(true_poss)
    def result(self):
        return self.cat_true_positives

与第一个例子只有一个显著的不同。结果函数返回,update_state 方法必须被覆盖(这是计算发生的地方)。它还需要一个额外的参数(sample_weight)。最后用 re result 方法返回结果张量。

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=[CategoricalTruePositives(num_classes, batch_size)])

我们已经看到了实现定制验证指标的三种不同方式。希望这有助于决定哪种方式适合您的用例,并且不要忘记检查您的度量是否已经在 tf.keras.metrics 中的大量预定义的度量中可用。

这篇文章最初发表于digital-thinking . de(2018 年 12 月 19 日)

用 R 整理数据

原文:https://towardsdatascience.com/tidy-data-with-r-f3d078853fc6?source=collection_archive---------43-----------------------

来自 StockSnap山姆·沃克的照片

为什么你应该在它上面投资更多,为什么这使你的分析变得容易得多

介绍

在现实世界中,数据并不干净。清理数据是分析前的一个重要步骤,因为我们用于分析的程序不能使用任何不干净的数据,因此我们必须首先清理它。就清理而言,我指的是诸如缺失值、非正态分布、离群值、离散化等。

在我们清理完这些数据后,我们可以用它来进行分析。尽管它已经很干净了,但这并不意味着数据本身已经很整洁了。在本文中,我将向您展示一些不整齐的数据,以及为什么我们应该在进行分析或建模之前先整理数据的原因。

为什么?

让我们谈谈为什么。给定这些数据,这是来自约翰·霍普斯金大学的新冠肺炎数据,包括来自世界各国和地区的确诊、死亡和康复病例数。我给你看确认的数据,

library(readr)
confirmed <- read_csv("[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv)")
head(confirmed)

数据

在每一行中,数据都包含从 2020 年 1 月 22 日到最近日期的位置和日期等信息。假设我们有兴趣可视化一个国家的线图,例如印度尼西亚。我们该怎么做?首先,我们确定 x 轴和 y 轴,然后我们可以制作情节,但可笑的是,它并不那么容易,为什么?我们想要的 x 轴,在这个例子中是日期,是数据集的列名。然后,要获取 y 轴,我们必须通过过滤指定数据的位置,然后获取数据上的值,最后绘制一个图。

x <- as.Date(colnames(confirmed)[5:length(colnames(confirmed))], format="%m/%d/%y")
y <- confirmed[confirmed$`Country/Region` == "Indonesia", 5:length(colnames(confirmed))]
plot(x, y)

基于代码的情节

这不容易也不吸引人,对吧?这不是一种整洁的分析方式。tidyverse 库,如 ggplot2、tidyr、dplyr 等。支持使用整齐的数据。这就是为什么我们必须先整理数据的原因。因此,我将向您介绍使用 tidyr 整理数据的概念。但是等等,什么是整齐的数据?

什么?

整齐的数据是一组规则,用于格式化数据集,以便更好地进行分析。规则是:
1。每个变量都放在它们的列上,
2。每个观察值被放置在它们的行上,
3。每个值都放在它们的单元格中

图来自数据科学的 R,作者加勒特·格罗勒蒙德和哈德利·威克姆

怎么会?

回到我们的数据,数据本身不符合上面的要求。在该示例中,日期变量作为一行放置。然后,每一列由该日期每个国家的值组成。这样,我们必须将日期作为列,然后与之对应的值也成为列。这被称为旋转,我们将数据集从长变高。为此,我们将使用 tidyr 包中的 R 函数 pivot_longer。

library(tidyr)**# Pivot the data set**
confirmed_tidy <- confirmed %>%
  pivot_longer(5:(length(colnames(confirmed))), names_to = "date", values_to = "total")**# Specify the names of the column**
colnames(confirmed_tidy) <- c("province", "country", "lat", "long", "date", "total")**# Convert to date format**
confirmed_tidy$date <- as.Date(confirmed_tidy$date, format="%m/%d/%y")confirmed_tidy

整洁的数据

Pivot_longer 函数通过指定列的索引返回一个更高的数据集。整理完数据集后,现在我们可以更容易地进行分析了。我给你举个例子,我想画出这些国家的线图,印度尼西亚,马来西亚,泰国,新加坡和越南。有了这个整洁的数据集,我们可以轻松做到这一点。首先,我们使用 dplyr 库根据东盟国家对其进行过滤,然后我们根据它绘制一个线图,并使用 ggplot2 库根据变量指定每个轴和颜色。代码本身看起来像这样,

library(dplyr)
library(ggplot2)asean <- c("Indonesia", "Singapore", "Vietnam", "Malaysia", "Thailand")**# Filter the data based on the list**
confirmed_tidy %>%
  filter(country %in% asean) %>%
  **# Create the plot**
  ggplot(aes(x=date, y=total, color=country)) +
  geom_line(size=1.5) +
  ggtitle("COVID-19 Cases", subtitle = "Indonesia, Malaysia, Singapore, Thailand, Vietnam")

这个图是根据整理好的数据绘制的

简单明了,不是吗?有了这个例子,我们就没有理由不投入一点时间来使我们的数据更加整洁。有了更整齐的数据,我们就可以很容易地进行分析和建模。

参考资料:

[1] Hadley Wickham 和 Garrett Grolemund, R for Data Science: Import,Tidy,Transform,Visualize,and Model Data (2017) ,O'Reilly Media,Inc .

使用 R Markdown 整理邮件合并

原文:https://towardsdatascience.com/tidy-mail-merge-using-r-markdown-7c5a2ee1995e?source=collection_archive---------34-----------------------

卡罗尔·郑在 Unsplash 上的照片

实践教程

因为自动化枯燥的东西不只是 Python 才有的!

在现代社会,企业的生死取决于电子邮件。电子邮件(你还记得我们以前用连字符连接吗?)是大多数行业的主要通信工具,也可能是所有行业的关键外部通信工具。

从数据科学的角度来看,电子邮件很无聊,太平常了,不值得关注。但是关于电子邮件,有一件事我们可以说,但对于 streamlit 仪表板我们不能说,那就是如果我们用电子邮件向利益相关者发送消息,他们几乎肯定至少会看一眼。像仪表板这样的被动资源需要分析消费者选择并获得他们想要的结果。但是电子邮件可以主动推送给决策者。这是一个很小的差别,但不应该被低估。

有了电子邮件报告手机嗡嗡声和你的分析会得到关注!

当然,这并不意味着我们作为数据科学家想要花很多时间起草电子邮件。我们更愿意阅读媒体上的文章?).因此,我们希望通过电子邮件为任意长的收件人列表自动定制分析报告。

有趣的是,文字处理器在几年前用邮件合并打印解决了这个问题。细节因供应商而异,但实际上您可以用姓名、地址和其他特定于邮件的细节填充一个表,然后为表中的每条记录打印(或保存到文件中)一条单独的消息。虽然 wordperfect 在 1990 年能做的事情很明显,R 在 2020 年也能复制,但令人惊讶的是,使用 tidyverse、R markdown 和 R package blastula 通过电子邮件向任意长的人发送定制分析列表是多么容易。

这些家伙在 1990 年有一首热门歌曲!

举一个具体的例子,假设我们的任务是每天向三个人发送 covid19 新的阳性检测结果。我们将从https://covidtracking.com/获取数据,并创建一封友好的电子邮件,在底部附上每个州的图表,这样我们的数据消费者就不必费力查看他们所在州的当前情况。这将避免每个同事需要打开单独的文件或访问特定的门户网站。我们可以快速轻松地设计出一个流程来创建类似这样的电子邮件:

您收件箱中的 ggplot 图形!

虽然这种形式不会赢得任何美学奖项,但它非常干净,非常低调。而且,由于我们将把 R markdown 渲染成一个 html 文件,如果我们愿意进入 html,它是 100%可定制的(也许使用这里的指针)。

我们需要创建的第一个文件是邮件模板。在这种情况下,这将是一个使用输出类型 blastula_email 的 R markdown 文档,我们成功的一个关键因素是在文件顶部的 YAML 头块中创建参数,以便我们可以用每个收件人不同的细节来填充这些值。

文件的其余部分非常简单,包括一个用于提取数据的块、一个用于观众的文本块和一个 ggplot 调用。

这里的另一个关键组件是一个 R 脚本,它将接受一个收件人列表及其相关细节(在本例中是他们所处的状态、他们的姓名以及与每个人一起使用的签名),然后将 markdown 文件转换成适合他们每个人的消息,并发送出去。tidyverse lmap()函数(来自 purrr 包)允许我们将每个人的详细信息存储在 tibble 的一行中,然后应用 blastula 函数来编织和通过电子邮件发送消息,而无需任何显式循环。

现在,我们仍然不得不承认发送这些邮件并不是完全自动的,因为每天我们都必须运行我们的 R 脚本。但是 1)这意味着运行一个脚本,而不是潜在地写几十封电子邮件,2)我们可以使用一个任务调度器来使它成为一个“无按钮”的过程(奇妙的 taskscheduleR 包将在 Windows 机器上帮助实现这一点)。

我鼓励每个人都使用调度作业来实现全自动解决方案,但是即使没有这一步,我们也可以用一百行代码每周节省几个小时。

有人曾经问爸爸:“但是你想节省时间做什么呢?”你打算用它做什么?"“工作,如果你最喜欢的话,”爸爸说。"为了教育,为了美丽,为了艺术,为了快乐。"他从夹鼻眼镜的上方看过去。"对曼波蒂-佩格来说,如果那是你的心所在。”
欧内斯廷 按打便宜

在我看来这是一个胜利!

基于时间的交叉验证

原文:https://towardsdatascience.com/time-based-cross-validation-d259b13d42b8?source=collection_archive---------3-----------------------

柯蒂斯·麦克牛顿在 Unsplash 上的照片

当我们的数据不是时间序列,但仍然有一个非常重要的时间维度时,会发生什么?这是一个用于基于时间的交叉验证的 Python 解决方案,具有所有必需的输入和一个匹配 scikit-learn 方法的输出。

训练和评估机器学习模型通常需要一个训练集和一个测试集。在大多数情况下,训练和测试拆分是随机进行的,取 20%的数据作为测试数据,模型看不到,其余的用于训练。

在处理与时间相关且动态变化的环境时,环境的特征会随着时间的推移而变化,因此最好使用基于时间的分割来提供统计上稳健的模型评估,并最好地模拟真实场景。为此,我们应该使用基于时间的交叉验证,这是一种来自时间序列领域的方法,它形成了一种“滑动窗口”训练方法。

基于时间的交叉验证方法

这种方法在时间序列领域是众所周知的,其中我们有一个信号,它是在连续的等间隔时间点上获得的序列。

但是,当我们的数据不是时间序列,但仍然有一个非常重要的时间维度时,会发生什么呢?

需要基于时间的交叉验证的问题示例

我们想预测订单的交货时间。每条记录都是一个订单,由一组特征来表示,以创建数据表。我们知道每个订单发生的时间,并且几个订单可以在同一天下达。关于这个问题的详细解释可以在我之前的博客中找到。在这种情况下,我们的目的是根据上个月的订单训练一个新模型,然后应用它来预测下周订单的交货时间。
为了最好地模拟真实世界,我们应该使用一个月的数据来训练我们的模型,然后用下一周的新数据来测试它们。为了创建稳健和通用的模型,我们应该使用几个时间分割点,并应用基于时间的交叉验证。我们的最终测试结果将是所有测试窗口的加权平均值。

我们需要注意 3 个重要方面:

1.基于时间的训练\测试分割 -在每次分割中,测试指标必须高于之前。

2.我们希望选择我们的训练\测试集大小,以便模拟真实世界的场景,在这些场景中,我们将在一段时间内训练一个模型,然后在接下来的时间内应用它。例如,根据上个月的数据训练模型,并应用它来预测未来一周的数据。

3.枣事。就我们的意图而言,每个集合中记录的数量并不重要。重要的是以天为单位的窗口大小。我们希望分割数据,以便每个窗口都包含 X 天的数据。

其他部分解决方案

Scikit-learn 有时间序列分割方法,但是它有几个缺点。假设我们的数据是按时间排序的,这种方法以一种“滑动窗口”的方式将它分成训练集\测试集,但是它不允许我们选择集的大小,我们只能选择我们想要多少个分裂。Scikit-learn TimeSeriesSplit 还假设每个日期有一个观察值,因此没有解决上面的 2 和 3。

另一个解决方案是 Germayne 建议的,并在他的博客中提出。他很好地解释了整个方法以及与 Scikit-learn 方法的区别。这个解决方案的输入之一是训练集大小(称为初始)和测试集大小(称为范围),但是它创建包含固定数量的记录的集。出于我们的目的,我们应该创建包含固定天数的集合。这个解决方案没有解决第 3 点。

建议的解决方案

因此,我为基于时间的训练和测试分割编写了自己的解决方案,它不仅允许我们选择相关的集合大小,还解决了根据天数(而不是根据记录)考虑窗口大小的重要方面。

返回的 CV splits 像任何其他 scikit-learn 交叉验证器一样工作,并且可以与它们的任何方法一起使用。

请注意,您的数据框必须有一列包含每条记录的日期,因为此解决方案利用了数据的日期。

参数:

  • train_period: int,default=30
    包含在每个训练集中的时间单位数。
  • test_period: int,default=7
    每个测试集中包含的时间单位数。
  • freq: string,default='days'
    输入参数的频率。可能的值有:天、月、年、周、小时、分钟、秒。

方法:

get _ n _ splits(self)
返回交叉验证器中的拆分迭代次数

split (self,data,validation_split_date=None,date_column='record_date ',gap=0)
返回类似于 sklearn 交叉验证器的元组列表(train_index,test_index)。

  • 数据:pandas DataFrame
    您的数据包含一个指示记录日期的列
  • validation _ split _ date:datetime . date
    执行拆分的第一个日期。这是第一个测试集开始的日期。
  • date_column:字符串
    每条记录的日期
  • gap: int
    如果测试集没有紧跟在训练集之后,则训练集和测试集之间有gap天的间隔

示例-如何使用

关闭

建议的解决方案对我过去遇到的各种问题非常有效。请让我知道它是如何为你工作的,如果你认为可以做更多的调整来改进这个类。

特别感谢 Noga Gershon 与我分享了她应对相关挑战的经验。
感谢 Noga 和 Idan Richman-Goshen 提供的出色的技术反馈以及对本文的校对和评论。

可持续发展的时候到了

原文:https://towardsdatascience.com/time-for-sustainable-development-26ba969f5b46?source=collection_archive---------35-----------------------

为什么数据和人工智能在这个旅程中至关重要

全球目标为更大的可持续性提供了一个框架——图片由 Pine Watt 提供,Unsplash

由黑人的命也是命运动领导的 2019 年和 2020 年的冠状病毒疫情和 2020 年的民权危机凸显了我们当今社会的一些主要局限性。

虽然我们的经济正以越来越快的速度增长,但许多发展领域仍未得到充分考虑。发展的不同方面之间相互联系的全球视野将有助于实现生活条件的可持续改善。

“[可持续发展是:]满足当代人需求的发展,同时保护地球的生命支持系统,这是今世后代的福祉所依赖的。”[1]

17 项可持续发展目标

SDG 涵盖了 17 个相互关联的目标,这些目标定义了跨越发展的社会经济环境维度的全球可量化目标。[1]它们旨在成为一套通用的指标和参考框架,供国际社会在 2030 年之前用来推动政策和实施。

这些目标是联合国在 2015 年制定的,作为千年发展目标的后续行动,为减少极端贫困的全球伙伴关系提供了一个框架。

这一新框架支持向更可持续发展的长期过渡。它促进了问责制,同时也促进了全球合作。它是一个工具,用于指导决策,但其本身并不是一个说明性和可操作的指南。因此,成员国和机构可以根据自己的背景、资源和可用的科学证据自由地推行政策和计划。

联合国确定的 17 个全球目标2,使用 17 个 SDG 图标图像[7]

相互联系和问责制

全球目标强调了 17 个目标是如何相互关联的。贫困的增加有可能导致卫生条件的下降和健康挑战的增加。与此同时,由于贫困,接受教育更加困难,暴力行为可能更容易出现。同样,气候变化危及野生动物(陆地和水下),并将增加人与人之间已经存在的不平等。这解释了为什么格里戈斯 D、斯塔德-史密斯 M、加尼 O 等人 [1]建议应特别重视地球生命支持系统减贫

“因为如果生态系统崩溃,经济本身也会死亡”莱昂纳多·迪卡普里奥,联合国和平使者

可持续发展领域可以被认为是一个各部分相互联系的大有机体。经济存在于社会之中,而社会又存在于地球的全球生态系统之中。这一框架强调,经济离不开社会,而社会离不开周围的环境。

地球的经济、社会和全球生态系统之间的相互联系

从愿景到实际行动和持久变化

全球目标已被定义为激励领导者。然而,17 个总体目标和 169 个具体目标本身并不足以引发持久而有影响力的决策。为了走向更可持续的国家和企业,我们需要意识到什么样的变化会产生持久的影响。这需要全球伙伴关系(目标 17)以及集中化和轻松获取信息。

研究人员、科学家、企业家和创新者群体每天都在创造大量的知识、想法和新产品,这在一定程度上有助于实现可持续发展目标。然而,还需要做大量的工作来收集知识和信息,并使其为利益相关者和决策者所用。

例如,如果决策者想知道:我可以做些什么来改善教育,同时减少人口中的不平等?一组清晰的科学和商业证据应随时可用,以支持解决方案的头脑风暴。

因此,一些额外的信息将有助于利益相关者采取可持续的变革:

  • 对与目标相关的历史数据的良好集中访问
  • 情景指导对不同政策或业务变化的影响,以及对不同目标的积极和消极影响的证据
  • 集中汇总与目标相关的 研究专利

特别强调不同情景的相互联系和相互影响。

利用数据和人工智能实现可持续发展目标

人工智能将在改善知识获取方面发挥重要作用。特别是,文本挖掘自然语言处理将有助于理解研究团体、行业和政府每天发布的不断增长的信息量。

趋势扫描仪

由联合国开发计划署(开发署)、瑞典 RISE 研究所和 AI for Good 基金会牵头的一项倡议是 Trendscanner。这个可视化浏览器将物联网、城市化、大数据等主要当前趋势映射到 SDGs,并汇集相关报告文件

与可持续发展目标联系最多的趋势类别,来源:https://sdg.trendscanner.online/

SDG 数据目录

考虑到这一点,我们与 James H .和 AI for Good Foundation 一起,正在建立可持续发展数据目录,这是一个开放的、可扩展的全球数据库,包含数据集、元数据和研究网络,通过挖掘数百万已出版的开放存取学术著作自动构建。SDG 数据目录关注数据发现和数据共享问题,以加快可持续发展目标的进展

下面的系统设计中总结了生成此目录的过程。从收集研究论文信息的开放存取数据库中,创建了一个已发表论文的大型数据集(在我们的第一个版本中有 500 万篇论文)。然后对这些论文进行解析,提取出数据集提及的和与之相关的元数据。

SDG 数据目录的系统设计

提取阶段使用一个灵活的 web-scraper,它是可伸缩的、轻量级的,并且具有版权意识。该过程在 PDF 检索中有 65%的成功率。

信息提取管道的主要组件是命名实体识别模型,它识别数据集名称、数据集描述、所有者、样本数量以及其他引用和文档元数据。

分类器和 NER 模型都利用了一种主动学习策略。他们从一些手动注释开始,逐渐利用这些注释来训练模型,建议不确定性最高的注释示例,注释更多的实例,并提高任务的整体准确性。多亏了 Prodigy 软件,这才成为可能。

下一步,我们希望在 SDG 数据目录之上构建查询和可视化层。最终,我们希望为创造一个易于导航的类似维基百科的体验,来记录有用的数据

数据的公平化

虽然创建的科学数据数量巨大,但许多研究出版物并不包含所用数据集以及如何访问它们的详细描述。这有多种解释。首先,一些数据集具有很大的科学价值,但不会因此而得到认可,因此科学家可能更愿意将它们保密,以开发它们的分析潜力。[5]此外,许多数据集被私人持有,并被商业实体作为竞争优势保留。

公平数据项目在地球、空间和环境科学领域的承诺声明[6]就是为了解决这个问题而创建的。公平数据代表可发现可访问可互操作,以及可重用。这一承诺使得在这些领域的大多数期刊上发表时,如果不包括以支持公平原则的方式使用的数据集,就更加困难。

让数据公平将在几个方面改善研究和科学。这是向开源和最新发现的可用性迈进的一步,将使大多数科学出版物更具可复制性和可比性。

我们构建 SDG 数据目录的工作有助于使 SDG 数据公平

从原始公平数据到决策

结论

如果不是可操作的可持续发展指南,至少全球目标是一种通用语言,世界各地的公司、非政府组织和政府都可以用来制定政策和决策。作为科学家、研究人员、创新者和企业家,我们的职责是在目标和导致必要变化的决策之间架起桥梁。

没有合适的智能系统,就不可能跟上新发现的步伐

参考

[1] 格里戈斯、大卫等“政策:为了人类和地球的可持续发展目标。”性质 495.7441 (2013): 305。

2联合国网站,可持续发展部分。https://www . un . org/sustainable development/sustainable-development-goals/

科恩、大卫、莱斯·阿特拉斯和理查德·拉德纳。“主动学习提高概括能力。”机器学习15.2(1994):201–221。

[4]神童软件:https://prodi.gy/

[5] 施托尔,s .,雅梅,l .,卡特彻-格申费尔德,j .,汉森,b .,勒恩哈特,k .,诺塞克,b .,等人(2019) 。让科学数据变得公平。性质 570,27–29。

[6]地球、空间和环境科学领域的承诺声明。https://copdess . org/enabling-fair-data-project/commitment-statement-in-the-earth-space-and-environmental-sciences/

[7]使用 17 个 SDG 图标图片:https://www . un . org/sustainable development/WP-content/uploads/2019/01/SDG _ Guidelines _ AUG _ 2019 _ final . pdf

时间序列分析:基本概念

原文:https://towardsdatascience.com/time-series-analysis-basic-concepts-1d9a090d7d8c?source=collection_archive---------28-----------------------

顺序很重要。

UnsplashNeONBRAND 拍摄的照片

时间序列是按时间顺序排列的一系列值。我们可能会在几乎任何领域遇到时间序列数据。天气预报、汇率、销售数据、声波只是几个例子。时间序列可以是表示为有序序列的任何类型的数据。

例如,下图是一个遵循上升趋势的简单时间序列:

这是一个单变量时间序列,这意味着在每个时间步长都有一个值。我们还有多元时间序列,它在每个时间步都有多个值:

时间序列中的模式

到目前为止,我们看到的图中的时间序列遵循一个趋势,这意味着总体方向向上或向下。这只是我们在时间序列中可以观察到的模式之一。

另一个常见的模式是季节性,它表示重复观察到的或可预测的间隔的模式。例如,零售商店的销售数据通常显示季节性。销售额会在特定时间或特殊日期增加或减少。让我们看一个例子:

我们通常会遇到组合了多种模式的时间序列,例如趋势和季节性。很可能还会有一些噪音:

到目前为止,我们已经看到了遵循某种模式的平稳时间序列数据。然而,生活充满了惊喜,因此很可能一些事件打破了这种模式,产生了非平稳时间序列。比如冠状病毒就是这么大的事件,搞乱了很多格局。

时间序列并不总是遵循某种模式或包含季节性。有些过程只产生随机数据。这种时间序列被称为白噪声,这使得几乎不可能做出准确的预测。

时间序列分析的应用

时间序列分析的一个常见应用是预测,这意味着根据过去的值预测未来的模式。对企业来说,有准确的预测是非常重要的。例如,如果需求预测准确,零售企业可以优化库存。它还提高了客户满意度,因为客户的需求将毫无例外地得到满足。能够未雨绸缪是一笔宝贵的财富。

在预测分析中,我们用已知数据(训练数据)训练模型,并期望模型预测新的、以前未见过的数据(测试数据)。这个训练和测试的过程被称为监督学习,因为我们用已知的(标记的数据)来监督模型。当处理正常数据时,我们可以将其随机分为训练和测试子集。但是,在处理时间序列时,我们不能随意分割。我们将一个时间点定义为分割点,将整个数据集分成训练和测试子集。由于时间序列数据是连续的,测试集遵循训练集。

注意:如果时间序列有季节性,重要的是训练集和测试集都包含整数个季节。例如,在上图中,训练集包含 3 个季节,测试集包含 1 个季节。如果我们在一个季节内的某一点进行分割,模型可能无法很好地捕捉趋势或季节性。

我们有时需要预测过去。考虑一个从时间 t 到(t+400)的时间序列。通过分析这些数据,我们可以尝试预测从时间(t-40)到(t-1)的序列。这是一种预测是什么产生了我们所拥有的数据。有时在某些时间点会有缺失的数据,我们可能也需要预测那些缺失的点。这个预测过去数据或缺失点的过程被称为插补

另一个应用是异常检测,这意味着检测时间序列数据中的异常活动。考虑一个网站流量的时间序列数据。正常趋势中的峰值可能表示恶意攻击。另一个例子是零售店销售的意外高峰,这可能是由于冠状病毒等事件。异常检测是一种无监督学习,其中模型试图找到数据中的结构并检测异常值。

下图显示了时间序列数据中异常的峰值。请记住,异常可能并不总是那么容易被发现。

语音识别任务也是用时间序列数据完成的。对声波进行分析,以捕捉某些单词,从而构建完整的语音。

时间序列分析是数据科学领域的一个广阔领域。对时间序列分析的全面理解需要机器学习、统计学方面的知识,当然还有领域专业知识。为了理解时间序列的特征及其应用,我们刚刚介绍了一些基本概念。我计划继续撰写关于时间序列分析的文章,从简单的概念到高级的分析技术。敬请关注以下帖子。

感谢您的阅读。如果您有任何反馈,请告诉我。

时间序列分析:创建合成数据集

原文:https://towardsdatascience.com/time-series-analysis-creating-synthetic-datasets-cf008208e014?source=collection_archive---------13-----------------------

如何创建具有不同模式的时间序列数据集

UnsplashNeONBRAND 拍摄的照片

时间序列是按时间顺序排列的一系列值。我们可能会在几乎任何领域遇到时间序列数据。天气预报、汇率、销售数据、声波只是几个例子。时间序列可以是表示为有序序列的任何类型的数据。

在之前的一篇文章中,我介绍了时间序列分析的基本概念。在本帖中,我们将创建不同模式的时间序列数据。合成数据集的一个优势是,我们可以测量模型的性能,并了解它在真实生活数据中的表现。

在时间序列中观察到的常见模式有:

  • 趋势:整体上升或下降的方向。
  • 季节性:重复观察到的或可预测的间隔的模式。
  • 白噪声:时间序列并不总是遵循某种模式或包含季节性。有些过程只产生随机数据。这种时间序列称为白噪声。

注意:图案并不总是平滑的,通常包含某种噪声。此外,时间序列可以包括不同模式的组合。

我们将使用 numpy 生成值数组,使用 matplotlib 绘制系列。让我们从导入所需的库开始:

import numpy as np
import matplotlib.pyplot as plt%matplotlib inline

我们可以定义一个函数,将数组作为输入并创建绘图:

def plot_time_series(time, values, label):
    plt.figure(figsize=(10,6))
    plt.plot(time, values)
    plt.xlabel("Time", fontsize=20)
    plt.ylabel("Value", fontsize=20)
    plt.title(label, fontsize=20)
    plt.grid(True)

时间序列趋势

第一个图是最简单的一个,是一个有上升趋势的时间序列。我们用一个斜率为时间和值创建数组。然后将这些数组作为参数传递给我们的函数:

time = np.arange(100)
values = time*0.4plot_time_series(time, values, "Upward Trend")

时间序列中的季节性

我们现在可以绘制一个带有季节性的时间序列。我们需要一个重复相同模式的系列。

# Just a random pattern
time = np.arange(50)
values = np.where(time < 10, time**3, (time-9)**2)# Repeat the pattern 5 times
seasonal = []
for i in range(5):
    for j in range(50):
        seasonal.append(values[j])# Plot
time_seasonal = np.arange(250)
plot_time_series(time_seasonal, seasonal, label="Seasonality")

这只是一个随机的模式。请随意使用 numpy 尝试不同的模式。

噪音

让我们给这些值添加一些噪声,因为在现实生活中,我们更可能处理有噪声的数据,而不是平滑的曲线。

我们可以使用 np.random.randn 函数创建随机噪声。然后将该噪声添加到原始的季节性序列中:

noise = np.random.randn(250)*100
seasonal += noisetime_seasonal = np.arange(250)plot_time_series(time_seasonal, seasonal, label="Seasonality with Noise")

多种模式

我们可能会在时间序列中看到不同模式的组合。例如,以下时间序列包含上升趋势和季节性。当然,也有一些噪音。

seasonal_upward = seasonal + np.arange(250)*10time_seasonal = np.arange(250)
plot_time_series(time_seasonal, seasonal_upward, label="Seasonality + Upward Trend + Noise")

白噪声

有些过程只是产生不遵循任何模式的随机数据。这种时间序列被称为白噪声,很难分析和预测。让我们创建一个白噪声的例子:

time = np.arange(200)
values = np.random.randn(200)*100plot_time_series(time, values, label="White Noise")

非平稳时间序列

到目前为止,我们已经看到了连续遵循某种模式的时间序列。这种时间序列称为平稳。然而,生活充满了惊喜,所以我们可能会遇到一些打破模式的事件,并创建非平稳时间序列。例如,冠状病毒是一个非常大的事件,它打乱了许多模式,企业需要更新他们的时间序列分析。让我们创建一个示例:

big_event = np.zeros(250)
big_event[-50:] = np.arange(50)*-50non_stationary = seasonal_upward + big_eventtime_seasonal = np.arange(250)
plot_time_series(time_seasonal, non_stationary, label="Non-stationary Time Series")

我们在时间点 210 之后引入了一个大事件,效果可以在之后看到。

时间序列分析是数据科学领域的一个广阔领域。对时间序列分析的全面理解需要机器学习、统计学方面的知识,当然还有领域专业知识。在这篇文章中,我们介绍了如何创建合成数据集。我们可以使用这些数据集来检查我们建立的模型的性能。在早先的一篇文章中,我解释了时间序列分析中的基本概念,以理解时间序列的特征及其应用。我计划继续撰写关于时间序列分析的文章,从简单的概念到高级的分析技术。敬请关注以下帖子。

感谢您的阅读。如果您有任何反馈,请告诉我。

面向初学者的时间序列分析

原文:https://towardsdatascience.com/time-series-analysis-for-beginners-8a200552e332?source=collection_archive---------13-----------------------

人口时间序列

如果你正在冒险进入数据分析和机器学习的世界,你可能已经发布了时间序列分析是多么重要。不管怎样,我会尽量提供一个温和的介绍。

完成本文后,您应该能够:

  1. 定义什么是时间序列
  2. 从非时间序列数据中识别时间序列数据
  3. 识别和描述时间序列的组成部分。
  4. 提及一些用于时间序列预测的模型

定义

时间序列是按时间顺序记录的一系列数据点,通常在连续的等节奏时间点采集。

时间序列数据可以是每年、每月、每周、每小时甚至每分钟。

时间序列分析包括分析时间序列数据的方法,以提取有意义的统计数据和其他数据特征。它与时间序列预测 不同,后者是使用模型根据之前观察到的值来预测未来值。而时间序列分析大多是统计,随着时间序列预测进入机器学习。时间序列分析是时间序列预测的预备步骤。

时序数据的例子

  • 股票价格、销售需求、网站流量、每日气温、季度销售额

时间序列不同于回归分析,因为它的与时间相关的性质。

  1. 自相关:回归分析要求数据中很少或没有自相关。当观察值不是相互独立时,就会发生这种情况。例如,在股票价格中,当前价格并不独立于先前价格。
  2. 季节性,这是我们将在下面讨论的一个特征。

时间序列分析和预测是基于这样的假设,即被预测变量的过去模式将 持续不变 到未来。

时间序列分析为什么重要?

因为时间序列预测很重要!商业预测、对过去行为的理解和对未来的规划,尤其是对政策制定者而言,严重依赖于时间序列分析。

时序数据与非时序数据

如果时间是唯一区分一个观测值和另一个观测值的因素,那么它很可能是一个时间序列数据集。不是每一个收集的时间数据都代表一个时间序列。观察结果必须依赖于时间。

时间序列的组成部分

  • 趋势:是事物发展或变化的大致方向。趋势可以是向上的(上升趋势)或向下的(下降趋势)。在给定的时期内,增加或减少并不总是必要的。

看涨

  • 季节性:定期重复出现的可预测模式。季节性通常在一年或更短时间内观察到。

能源需求的季节性

上例中的能源需求在冬季较高,在夏季较低,这与气候季节相吻合。这种模式每年重复,表明时间序列中的季节性。

另一个例子是零售业,商店在一年的最后一个季度经历了高销售额。

  • 周期:当一个序列遵循非季节性的涨跌模式时出现。周期性变化本质上是周期性的,像商业周期一样不断重复,有四个阶段(i) 高峰 (ii) 衰退 (iii) 低谷/萧条 (iv) 扩张

季节性不同于周期性,因为季节性周期是在一个日历年内观察到的,而周期性影响的持续时间可能短于或长于一个日历年。

  • **不规则波动:这些是由于突发原因而发生的变化,是不可预测的。例如,由于战争、洪水、地震、农民罢工等导致的食品价格上涨。

何时不用时间序列分析

  1. 当值是常数时,这意味着它们不依赖于时间,所以 1,数据不是时间序列数据,2,这是没有意义的,因为值永远不会改变。
  2. 函数形式的值,例如 sin x、cos x 等。同样,在使用函数计算数值时,使用时间序列分析是没有意义的。

建模和评估技术

虽然本文的重点不是预测,但我将提到一些用于建模的技术。

**建模:朴素逼近、移动平均、简单指数平滑、霍尔特线性趋势模型、自回归综合移动平均(ARIMA)、SARIMAX 等。

**评估:均方差(MSE)、均方根误差(RMSE)等。

现在您已经知道什么是时间序列及其特征,通过分析时间序列数据集来巩固您的知识。这篇文章涵盖了练习新技能所需的不同类型的时间序列数据!你也可以利用这个免费短训班进行深度报道。

机器学习的时间序列分析

原文:https://towardsdatascience.com/time-series-analysis-for-machine-learning-with-python-626bee0d0205?source=collection_archive---------3-----------------------

趋势、异常值、平稳性、季节性

摘要

在描述统计学中,时间序列被定义为一组按时间排序的随机变量。研究时间序列是为了解释一种现象,确定趋势、周期性、季节性的组成部分,并预测其未来值。我认为它们是经济学领域和数据科学(股票价格、经济周期、预算和现金流……)之间结合的最佳例子。

通过这篇文章,我将一步一步地解释时间序列分析标准方法,并展示一些有用的工具(python 代码),这些工具可以很容易地用于其他类似的情况(只需复制、粘贴和运行)。我将带着注释遍历每一行代码,以便您可以轻松地复制这个示例(下面是完整代码的链接)。

我们将使用 Kaggle 竞赛“预测未来销售”(链接如下)的数据集,其中为您提供每日历史销售数据,任务是预测销售的产品总量。该数据集呈现了一个有趣的时间序列,因为它与现实世界中的用例非常相似,因为我们知道任何产品的日常销售都不会是固定的,并且总是受到季节性的严重影响。

说到这里,本教程的主要目的是在设计和测试用于预测的模型之前,了解时间序列分析 的基本步骤(注意,本文假设了该主题的基本知识,所以我不会过多地进行定义,但我会插入所有有用的超链接)。特别是,我们将了解:

完整代码 (Github):

[## mdipietro 09/data science _ 人工智能 _ 实用工具

github.com](https://github.com/mdipietro09/DataScience_ArtificialIntelligence_Utils/blob/master/time_series/example_forecast.ipynb)

数据集 (Kaggle):

[## 预测未来销售

Coursera 课程“如何赢得数据科学竞赛”的期末项目

www.kaggle.com](https://www.kaggle.com/c/competitive-data-science-predict-future-sales)

设置

首先,我们将导入以下库

**## For data**
import **pandas** as pd
import **numpy** as np**## For plotting**
import **matplotlib**.pyplot as plt**## For outliers detection**
from **sklearn** import preprocessing, svm**## For stationarity test and decomposition**
import **statsmodels**.tsa.api as smt
import **statsmodels**.api as sm

然后我们将数据读入熊猫数据帧

dtf = pd.read_csv('data.csv')dtf.head()

原始数据集有不同的列,但是出于本教程的目的,我们只需要下面的列:日期和售出产品的数量(item_cnt_day)。换句话说,我们将创建一个 pandas Series (名为“sales”)的每日频率日期时间索引,仅使用每日销售额

**## format datetime column**
dtf["**date**"] = pd.to_datetime(dtf['**date**'], format='**%d.%m.%Y**')**## create time series**
ts = dtf.groupby("**date**")["**item_cnt_day**"].sum().rename("**sales**")ts.head()

ts.tail()

所以时间序列范围从2013–01–012015–10–31,它有 1034 个观测值,一个平均值 3528,和一个标准差 1585 。它看起来是这样的:

ts.plot()

我们现在开始吧,好吗?

趋势分析

趋势是时间序列的组成部分,代表时间序列中低频的变化,高频和中频的波动已被滤除。

这种分析的目的是了解数据中是否有趋势,以及这种模式是否是线性的。这项工作的最佳工具是可视化

让我们写一个函数,它可以帮助我们理解时间序列的趋势和运动。我们希望在图中看到一些滚动统计数据,例如:

  • M 移动平均值:前一个 n 数据的未加权平均值(也称“移动平均值”)
  • 布林线:高于移动平均线的 k 倍 n 周期标准差的上带,低于移动平均线的 k 倍 N 周期标准差的下带。
**'''
Plot ts with rolling mean and 95% confidence interval with rolling std.
:parameter    
  :param ts: pandas Series    
  :param window: num - for rolling stats
  :param plot_ma: bool - whether plot moving average
  :param plot_intervals: bool - whether plot upper and lower bounds
'''**
def plot_ts(ts, plot_ma=True, plot_intervals=True, window=30,
            figsize=(15,5)):   
   rolling_mean = ts.rolling(window=window).mean()    
   rolling_std = ts.rolling(window=window).std()
   plt.figure(figsize=figsize)    
   plt.title(ts.name)    
   plt.plot(ts[window:], label='Actual values', color="black")    
   if plot_ma:        
      plt.plot(rolling_mean, 'g', label='MA'+str(window),
               color="red")    
   if plot_intervals:
      lower_bound = rolling_mean - (1.96 * rolling_std)
      upper_bound = rolling_mean + (1.96 * rolling_std)
   plt.fill_between(x=ts.index, y1=lower_bound, y2=upper_bound,
                    color='lightskyblue', alpha=0.4)
   plt.legend(loc='best')
   plt.grid(True)
   plt.show()

当数据集至少有一整年的观察时间时,我总是从一个 30 天的滚动窗口开始:

**plot_ts(**ts, window=30**)**

观察图中的红线,您可以很容易地发现一种模式:时间序列遵循线性下降趋势,每年一月都有严重的季节性高峰。当使用至少 1 年的滚动窗口时,趋势变得明显

**plot_ts(**ts, window=365**)**

如你所见,这是一个明显的线性下降趋势。这在模型设计中很有用,因为大多数模型要求您指定趋势组件是否存在,以及它是线性的(也称为“加法”)还是非线性的(也称为“乘法”)。

离群点检测

离群值是位于一组数据值的统计分布尾部的数据值。

本节的目标是找出异常值并决定如何处理它们。在实践中,通常使用传统的确定性方法,如绘制分布图,并将高于或低于选定阈值的每个观察值标记为异常值。例如:

**## Plot histogram**
ts.hist(color="black", bins=100)

**## Boxplot** ts.plot.box()

这种方法特别适用于您非常熟悉您的数据,并且您已经知道它遵循什么样的过程和分布,因此什么阈值更适用的情况。然而,我个人发现让机器学习算法在任何时间序列数据集上为我做这件事都更容易。

让我们编写一个函数,使用 scikit-learn 库中的聚类算法自动检测时间序列中的异常值:单类支持向量机,它学习分布的边界(称为“支持”),因此能够将位于边界之外的任何点归类为异常值。

**'''
Find outliers using sklearn unsupervised support vetcor machine.
:parameter
    :param ts: pandas Series
    :param perc: float - percentage of outliers to look for
:return
    dtf with raw ts, outlier 1/0 (yes/no), numeric index
'''**
def find_outliers(ts, perc=0.01, figsize=(15,5)):
    **## fit svm**
    scaler = preprocessing.StandardScaler()
    ts_scaled = scaler.fit_transform(ts.values.reshape(-1,1))
    model = svm.OneClassSVM(nu=perc, kernel="rbf", gamma=0.01)
    model.fit(ts_scaled) **## dtf output**
    dtf_outliers = ts.to_frame(name="ts")
    dtf_outliers["index"] = range(len(ts))
    dtf_outliers["outlier"] = model.predict(ts_scaled)
    dtf_outliers["outlier"] = dtf_outliers["outlier"].apply(lambda
                                              x: 1 if x==-1 else 0)
    **## plot**
    fig, ax = plt.subplots(figsize=figsize)
    ax.set(title="Outliers detection: found"
           +str(sum(dtf_outliers["outlier"]==1)))
    ax.plot(dtf_outliers["index"], dtf_outliers["ts"],
            color="black")
    ax.scatter(x=dtf_outliers[dtf_outliers["outlier"]==1]["index"],
               y=dtf_outliers[dtf_outliers["outlier"]==1]['ts'],
               color='red')
    ax.grid(True)
    plt.show()
    return dtf_outliers

有了这个函数,我们将能够发现异常值,但是一旦发现异常值,我们该如何处理呢?这里没有最优策略:没有与其他观察值显著不同的数据点时,时间序列预测更容易,但删除这些点会极大地改变数据的分布。如果您已经决定排除异常值,最方便的方法是通过插值来移除它们。

让我们编写一个函数,在检测到异常值后,通过对异常值前后的值进行插值来移除异常值。

**'''
Interpolate outliers in a ts.
'''**
def remove_outliers(ts, outliers_idx, figsize=(15,5)):
    ts_clean = ts.copy()
    ts_clean.loc[outliers_idx] = np.nan
    ts_clean = ts_clean.interpolate(method="linear")
    ax = ts.plot(figsize=figsize, color="red", alpha=0.5,
         title="Remove outliers", label="original", legend=True)
    ts_clean.plot(ax=ax, grid=True, color="black",
                  label="interpolated", legend=True)
    plt.show()
    return ts_clean

现在让我们使用这些函数。首先,我们检测异常值:

dtf_outliers = **find_outliers(**ts, perc=0.05**)**

然后处理它们:

**## outliers index position**
outliers_index_pos = dtf_outliers[dtf_outliers["outlier"]==1].index**## exclude outliers**
ts_clean = **remove_outliers(**ts, outliers_idx=outliers_index_pos**)**

出于本教程的目的,我将继续讨论原始时间序列(包括异常值),但是去除异常值并在干净的时间序列(没有异常值)上建立模型也是一个好策略。

平稳性检验

平稳过程是一种随机过程,其无条件联合概率分布随时间推移不发生变化。因此,均值和方差等参数也不会随时间变化,因此平稳时间序列更容易预测。

有几种方法可以确定一个时间序列是否是平稳的,最常见的是很好的可视化,查看自相关和运行统计测试。

最常见的测试是 Dickey-Fuller 测试(也称为“ADF 测试”),其中零假设是时间序列有一个单位根,换句话说,时间序列不是平稳的。我们将通过比较 p 值和选定的阈值(α)来测试是否可以拒绝零假设,因此,如果 p 值较小,我们可以拒绝零假设,并假设时间序列是平稳的,置信水平为 1-α(从技术上讲,我们不能说它不是):

来源

让我们编写一个函数,将所有这些方法放在一起,并显示一个由以下内容组成的图形:

  • 95% (α=0.05) ADF 测试的结果(将打印在输出图的标题中)。
  • 第一张图将绘制数据的前 x%的平均值和方差,这是一个图形测试:如果时间序列的属性是常数,我们将看到 1-x%的数据在平均值附近徘徊,并在前 x%的观测值的方差范围内
  • 最后两个图描绘了 PACFACF
**'''
Test stationarity by:
    - running Augmented Dickey-Fuller test wiht 95%
    - plotting mean and variance of a sample from data
    - plottig autocorrelation and partial autocorrelation
'''**
def test_stationarity_acf_pacf(ts, sample=0.20, maxlag=30, figsize= 
                              (15,10)):
    with plt.style.context(style='bmh'):
        **## set figure**
        fig = plt.figure(figsize=figsize)
        ts_ax = plt.subplot2grid(shape=(2,2), loc=(0,0), colspan=2)
        pacf_ax = plt.subplot2grid(shape=(2,2), loc=(1,0))
        acf_ax = plt.subplot2grid(shape=(2,2), loc=(1,1))

        **## plot ts with mean/std of a sample from the first x%** 
        dtf_ts = ts.to_frame(name="ts")
        sample_size = int(len(ts)*sample)
        dtf_ts["mean"] = dtf_ts["ts"].head(sample_size).mean()
        dtf_ts["lower"] = dtf_ts["ts"].head(sample_size).mean() 
                          + dtf_ts["ts"].head(sample_size).std()
        dtf_ts["upper"] = dtf_ts["ts"].head(sample_size).mean() 
                          - dtf_ts["ts"].head(sample_size).std()
        dtf_ts["ts"].plot(ax=ts_ax, color="black", legend=False)
        dtf_ts["mean"].plot(ax=ts_ax, legend=False, color="red",
                            linestyle="--", linewidth=0.7)
        ts_ax.fill_between(x=dtf_ts.index, y1=dtf_ts['lower'], 
                y2=dtf_ts['upper'], color='lightskyblue', alpha=0.4)
        dtf_ts["mean"].head(sample_size).plot(ax=ts_ax,
                legend=False, color="red", linewidth=0.9)
        ts_ax.fill_between(x=dtf_ts.head(sample_size).index, 
                           y1=dtf_ts['lower'].head(sample_size), 
                           y2=dtf_ts['upper'].head(sample_size),
                           color='lightskyblue')

        **## test stationarity (Augmented Dickey-Fuller)**
        adfuller_test = sm.tsa.stattools.adfuller(ts, maxlag=maxlag,
                                                  autolag="AIC")
        adf, p, critical_value = adfuller_test[0], adfuller_test[1], 
                                 adfuller_test[4]["5%"]
        p = round(p, 3)
        conclusion = "Stationary" if p < 0.05 else "Non-Stationary"
        ts_ax.set_title('Dickey-Fuller Test 95%: '+conclusion+
                        '(p value: '+str(p)+')')

        **## pacf (for AR) e acf (for MA)** 
        smt.graphics.plot_pacf(ts, lags=maxlag, ax=pacf_ax, 
                 title="Partial Autocorrelation (for AR component)")
        smt.graphics.plot_acf(ts, lags=maxlag, ax=acf_ax,
                 title="Autocorrelation (for MA component)")
        plt.tight_layout()

让我们运行它:

**test_stationarity_acf_pacf(**ts, sample=0.20, maxlag=30**)**

Dickey-Fuller 检验的结果表明,时间序列可能是平稳的,因为我们可以以 95%的置信度拒绝非平稳性的零假设(p 值为 0.015 < α of 0.05). However, this does not match with the “eye test” as we can see that the time series moves away from the mean after January 2015. Moreover, we couldn’t reject the null hypothesis of non-stationarity with a confidence level of 99% (p-value of 0.015 > α为 0.01),并且自相关无法收敛到零。

对时间序列进行差分后,我们将运行相同的测试。差异可以通过消除观察水平的变化来帮助稳定平均值,从而消除(或减少)趋势和季节性。基本上,我们将应用以下转换:

diff[t] = y[t] — y[t 滞后]

现在让我们尝试用 1 个滞后来区分时间序列,并再次运行之前的函数

diff_ts = ts - ts.shift(1)
diff_ts = diff_ts[(pd.notnull(diff_ts))]**test_stationarity_acf_pacf(**diff_ts, sample=0.20, maxlag=30**)**

这一次,我们可以用 95%和 99%的置信度拒绝非平稳性的零假设(p 值为 0.000)。我们可以得出结论,最好假设时间序列不是平稳的。

关于自相关图,显然每 2 天有一个负的季节性,这意味着在一周的开始有较少的销售,每 7 天有一个正的季节性(周末有更多的销售)。

季节性分析

季节性成分是时间序列中的变化部分,代表年内波动,在时间、方向和幅度方面年复一年或多或少是稳定的。

最后一部分的目标是了解哪种季节性影响数据(如果每 7 天出现一次波动,则为每周季节性;如果每 30 天出现一次波动,则为每月季节性,以此类推)。

这对于分析会议之后的模型设计部分至关重要。特别是,当使用季节性自回归模型时,您必须指定每个季节的观察次数:我说的是 SARIMA (p,D,q)x(P,D,Q,s) 中的参数“s”

statsmodel 库中有一个超级有用的函数,允许我们分解时间序列。该函数将数据分为 3 个部分:趋势、季节性和残差。

让我们用 7 天的季节性来绘制时间序列的分解图

decomposition = **smt.seasonal_decompose(**ts, freq=7**)**
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid   
fig, ax = plt.subplots(nrows=4, ncols=1, sharex=True, sharey=False)
ax[0].plot(ts)
ax[0].set_title('Original')
ax[0].grid(True) 
ax[1].plot(trend)
ax[1].set_title('Trend')
ax[1].grid(True)  
ax[2].plot(seasonal)
ax[2].set_title('Seasonality')
ax[2].grid(True)  
ax[3].plot(residual)
ax[3].set_title('Residuals')
ax[3].grid(True)

我通常选择导致较小残差的季节性参数。在这种情况下,尝试使用 2 天、7 天和 30 天,每周季节性(s = 7)的结果更好。

结论

本文是一篇教程,讲述在开始构建预测模型之前,如何使用统计和机器学习来分析现实世界的时间序列。这种分析的结果对于设计能够很好地适应时间序列的模型是有用的(这将在下一个教程中完成,顶部的链接)。特别是:

  • 我们可以在预测模型中加入线性趋势成分
  • 我们可以在包含异常值的原始数据和不包含异常值的已处理数据上训练模型,并测试哪一个表现更好
  • 我们知道时间序列不是平稳的,因此我们应该使用 AR-I-MA 模型而不是 ARMA 模型
  • 我们可以在我们的预测模型中包含一个每周的季节性因素。

我希望你喜欢它!如有问题和反馈,或者只是分享您感兴趣的项目,请随时联系我。

👉我们来连线👈

本文是使用 Python 进行时间序列预测系列的一部分,另请参见:

[## 时间序列预测:ARIMA vs LSTM vs 预言家

基于机器学习和 Python 的时间序列预测

medium.com](https://medium.com/analytics-vidhya/time-series-forecasting-arima-vs-lstm-vs-prophet-62241c203a3b) [## 随机游走时间序列预测

基于机器学习和 Python 的时间序列预测

medium.com](https://medium.com/analytics-vidhya/time-series-forecasting-with-random-walk-58e84c93058b) [## 简单参数曲线拟合的时间序列预测

预测新冠肺炎疫情什么时候会停在你的国家

medium.com](https://medium.com/analytics-vidhya/how-to-predict-when-the-covid-19-pandemic-will-stop-in-your-country-with-python-d6fbb2425a9f)

涡轮风扇发动机预测维修的时间序列分析

原文:https://towardsdatascience.com/time-series-analysis-for-predictive-maintenance-of-turbofan-engines-1b3864991da4?source=collection_archive---------7-----------------------

艾萨克·史密斯在 Unsplash 上拍摄的照片

探索美国宇航局的涡轮风扇数据集

使用分布滞后模型预测剩余使用寿命

<免责声明:我的目的是展示模型开发过程中不同方法和选择的效果。这些影响经常使用测试集来显示,这被认为是(非常)不好的做法,但有助于教育目的。>

欢迎来到“探索 NASA 的涡轮风扇数据集”系列的另一部分。这将是对 FD001 的第三次分析,在 FD 001 中,所有发动机在相同的操作条件下运行,并产生相同的故障。

最初,我们假设发动机的剩余使用寿命(RUL)呈线性下降。在我的上一篇文章中,我们通过截取任何大于 125 的值来重新检验这个假设。剪切 RUL 将基线线性回归提高了 31%(从 31.95 的 RMSE 到 21.90 的 RMSE)。然后,我们切换到支持向量回归,并挤出另外 6%的改善,总 RMSE 为 20.54。

今天,我们将重点关注时间序列分析,以预测发动机何时需要保养。但是,在进入时间序列部分之前,我们首先必须回顾几个处理步骤。我们开始吧!

加载数据

首先,我们将导入一些库并读取数据。

train.head()的结果

看起来不错。接下来,计算线性递减 RUL(稍后添加裁剪),并删除无信息列。

RUL 在击穿时可以认为是 0,我们天真地假设 RUL 是一个线性函数。意味着在击穿前的 10 个周期时 RUL 是 10,在击穿前的 50 个周期时是 50,等等。

很好,现在我们来讨论一下我们的方法。

方法

此数据集的时间序列分析和预测可以通过以下三种方法之一完成:

  1. 预测传感器值并设置“报警”阈值。当预测传感器越过该阈值时,部件劣化到即将击穿的状态。对于当前数据集使用这种方法有一些注意事项。
    (a)每个传感器都必须单独建模,因此我们无法利用传感器之间的相互作用。
    (b)它需要大量的领域知识来设置适当的阈值,并且
    (c)它不直接通知我们关于我们的目标特性,剩余使用寿命(RUL)。
  2. 向量自回归(VAR)型模型。这些类型的模型可以处理多变量时间序列,但是模型最初会产生 X 和 Y 变量的滞后。通常,在时间序列中,Y 的过去值在确定 Y 的未来值时起着很大的作用。但是,由于我们假设 Y 的值在训练集中保持不变或线性下降,因此将这些自定义目标纳入模型并使用它们进行预测会严重影响模型结果,并过分强调 Yt-1 对 Yt 的影响。您可以编写一些自定义代码,将滞后 Y 变量的权重系数设置为 0,但在我看来,有一种更简单的方法。
  3. 分布式滞后模型。基本上,这是一个回归模型,您可以完全控制为每个变量添加多少滞后。

在创建分布式滞后模型时,我们可以使用时间序列和回归分析中的许多工具和测试。但是,我们将从小处着手,并根据需要增加复杂性。

我们要实现的模型的基本形式如下:

Yt = a + B1*Xt + B2*Xt-1 + … + Bn*Xt-n

其中a是截距,B1Bn是系数。Xt-1Xt-nXt的滞后变量,分别滞后 1 到 n,Yt是当前时刻t的目标变量。
注意:为了与之前的帖子保持一致,我们预测 Yt 的 RUL,如果你想预测下一个 time_cycle (Yt+1)的 RUL,你可以简单地将目标移动一位,如下所述

添加滞后变量

我们可以使用熊猫移动函数来添加滞后变量。

您可以看到滞后列包含以前时间戳的数据。例如,第 2 行附加了时间 0 和 1 的数据。这就是我们如何从一行中表示的多个时间实例中获取数据,这是供我们的模型使用的一种方便的表示。

现在让我们将这个原则应用到我们的数据集。我们删除由于添加滞后变量而引入 NaN 值的行,并拟合新的回归模型。

# returns
# train set RMSE:39.367692351135005, Variance:0.6709929595362338
# test set RMSE:31.423109839706022, Variance:0.42820706786532714

太好了!增加一个滞后已经给了我们的基线模型一个小的改进,基线模型的 RMSE 是 31.95。上面的例子展示了我们试图实现的基本目标。

更正:在上面的例子中,我忘记删除 index_names。当这些被丢弃时,结果与基线相比没有改善。感谢宣昂刘指出这一点!幸运的是,这对整个流程几乎没有影响,添加更多的滞后将开始改善结果(正如您可以在下面进一步阅读)

让我们将这个功能封装在两个函数中以备后用,一个用于添加从 1 到 n 的滞后,另一个用于添加特定的滞后。

在应用时间序列分析和回归时,需要考虑一些假设,现在让我们来看看这些假设。

平稳性

平稳性意味着时间序列的统计特性,如均值和方差不随时间变化,此外,协方差(时间序列的分布)不应依赖于时间(见下图 1)。

这些统计属性保持不变很重要,因为许多统计模型依赖这些属性进行预测。因此,如果均值、方差或协方差随时间变化,模型将无法准确预测下一个值[1]。

图一。展示平稳与非平稳数据

幸运的是,有测试来检查数据的平稳性,如果测试没有通过,也有方法使时间序列平稳。

为了测试平稳性,我们将使用扩展的 Dickey-Fuller 测试,您可以查看[1–5]了解更多信息。目前,adf 检验统计量和 p 值是最重要的。测试统计越负,信号越稳定。当 p 值低于 0.05 时,可以假定时间序列是平稳的。让我们在一台发动机的立柱上进行这个测试。

# returns
# single unit, single column test results
# adf: -2.276666927948019 
# pvalue: 0.17960380425358546
# Significant: False

检验统计是负的,但不显著。我们可以对数据进行一次差分,以试图消除趋势并再次测试[6]。

# returns
# single unit, single column test results after differencing
# adf: -14.824168539718967 
# pvalue: 1.9431018596392618e-27
# Significant: True

更好的是,p 值现在是< 0.05 allowing us to assume stationarity.

注意:重要的是要考虑你如何实现你的测试,例如测试一个传感器列的平稳性有所有 100 个引擎的时间序列。所有引擎一起形成稳定的信号,但是单个引擎的信号不是稳定的!(见图 2)

图 2:(上图)单一特征的所有引擎的数据被认为是固定的。(中间)同一特性的单个发动机的数据不被认为是稳定的。(底部)在对信号进行一次差分后,相同特征的单个引擎的数据被认为是稳定的。

由于我们事先不知道每个发动机的每个传感器的时间序列在达到稳定之前需要差分多少次,所以最好创建一些函数来为我们处理这些步骤。我们将使用 p 值作为假设平稳性的决定性因素。

应用我们目前所拥有的

我们应用这些函数来使我们的数据稳定。

intermediate_df.head()的结果

让我们拟合一个新的线性回归来了解静态数据对模型性能的影响。

# returns
# train set RMSE:51.63375613791181, Variance:0.4340864011385228

由于使数据静止,训练 RMSE 变得相当糟糕。这可以解释为数据不再具有趋势,从而难以拟合回归线。当添加滞后变量时,性能将再次提高,因为这将告知模型传感器值随时间的变化之间的关系。

接下来,我们可以开始搜索,以确定要添加多少滞后才能获得最佳模型结果。

AIC:寻找正确的滞后数

赤池信息准则(AIC)是一种反映模型质量的度量,常用于时间序列分析。它同时考虑过拟合和欠拟合。当训练多个相似的模型时,可以比较 AIC 分数用于模型选择[7]。较低的分数通常会更好,但通常会在复杂性和模型质量改进之间进行权衡。让我们训练一些具有 0 到 n 个滞后的模型,并计算 AIC 来确定最高质量的模型。

具有 0–30 个滞后的回归模型的评估度量表

我们正在寻找 AIC 中的一个转折点,通过增加更多的滞后来表明模型改进的收益递减。然而,根据度量表,并不清楚要添加多少滞后,因为度量似乎在稳步提高。让我们尝试绘制 AIC 的任何视觉问题。

AIC 变化率与添加的滞后 nr 的关系图

根据图表,质量改进在 14 个滞后之后似乎停滞不前。对我来说,这表明模型复杂性和质量之间的平衡已经达到,因为增加更多的滞后(复杂性)不再能实质上提高模型质量。

添加同一变量的多个滞后的一个问题是引入多重共线性的可能性,接下来让我们检查一下。

多重共线性

当多元回归模型中的独立变量高度相关时,就会出现多重共线性[8]。由于时间序列的性质,即上一个时间点的值与下一个时间点的值存在内在联系,因此添加滞后变量时引入多重共线性的可能性很大。多重共线性会影响模型的系数和稳定性,增加新数据出现错误结果的可能性。让我们通过计算方差膨胀因子(VIF)来测试我们模型的多重共线性,根据经验法则,低于 5 的 vif 值被认为是安全的[9]。

计算的 vif 的前 20 个结果

我们的模型似乎深受 vif 值远大于 5 的多重共线性之苦。在寻找减少多重共线性的方法时,我发现 statsmodels 用于计算多重共线性的方法可能会受到缩放的严重影响[10]。这将是一个相当简单的修复,所以让我们实现一个缩放转换,并希望我们不必进一步寻找解决我们的问题。

缩放后计算的 vif 的前 20 个结果

好多了!我们现在有所有组件来训练、预测和评估,以找到最佳模型。

组合、预测和评估

我们首先重复确定要添加的滞后数量的过程。

AIC 变化率与缩放特征后添加的滞后 nr 的关系图

在增加缩放比例后,这个点有一点点移动,模型质量的提高现在停滞在 9 个滞后而不是 14 个。

让我们把我们的管道放在一起,用 9 个滞后来训练我们的模型,看看它的表现如何。从现在开始,我们还将加入剪辑后的 RUL。

# returns
# train set RMSE:20.80233928213837, Variance:0.7523208224684113
# test set RMSE:21.14895857012398, Variance:0.7409888687595052

21.14 的 RMSE 并不坏,但我认为我们可以再挤出一点。目前,我们的模型使用连续滞后变量。然而,相邻的 lag 不一定必须保存不同的信息。例如,在滞后 6、7 和 8 的传感器值的变化可能是最小的,因此对模型来说不是真正的信息。当增加滞后之间的时间步长时,传感器值的变化变得更加明显。例如,滞后 5、10 和 20 处的传感器值可能相差很大,足以提供信息。注意,通过增加更高的滞后变量,你也丢弃了更多的数据行,所以需要考虑一个折衷方案。

当发动机恶化并接近故障时,传感器中有明显的趋势,这在单个时间步长之间是可区分的。所以就我个人而言,在增加滞后之间的时间步长之前,我选择保持前几个滞后连续。让我们尝试一些变化,看看哪个得分最高。

# Results of different lags and test RMSE
# RMSE = 21.76, lags = [1,2,3,4,5]
# RMSE = 21.14, lags = [1,2,3,4,5,6,7,8,9]
# RMSE = 21.06, lags = [1,2,3,4,5,10,20,30]
# RMSE = 20.85, lags = [1,2,3,4,5,10,20]

当然还有更多的可能性,但通过最少的测试,并考虑到增加更多连续滞后带来的停滞不前的改善,滞后[1,2,3,4,5,10,20]在 RMSE 为 20.85 时表现最佳。这些结果非常接近我们上次的支持向量回归(RMSE = 20.54)。

最后,我觉得分布式滞后模型对于解决这个用例的可能方法是一个有价值的补充。它在模型开发过程中提供了很大的灵活性和控制力,同时也易于业务人员进行解释和说明。完整的笔记本你可以查看我的 github 页面这里

我要感谢 Wisse Smit 和 Maikel Grobbe 对我的文章的评论。下次我们将深入研究生存分析。你能找到表现更好的特定滞后(不完全连续)的组合吗?请在下面的评论中告诉我!

参考资料:
【1】https://medium . com/open-machine-learning-course/open-machine-learning-course-topic-9-time-series-analysis-in-python-a 270 CB 05 E0 b 3
【2】https://en . Wikipedia . org/wiki/Augmented _ Dickey % E2 % 80% 93 fuller _ test
【3】https://www . stats models . org/stable/generated/stats models。

时间序列分析-处理时区

原文:https://towardsdatascience.com/time-series-analysis-handling-time-zones-b6fcb324c7b?source=collection_archive---------26-----------------------

如何处理熊猫的时区问题

图源

你坐过从东到西的长途飞机吗?如果你有,你知道那是什么感觉。假设飞机下午 1 点起飞,10 个小时到达目的地。飞机一着陆你就往外看。天还亮着,好像你只飞了一个小时。你查一下当地时间。现在才下午 3 点。这感觉像是你生命中最漫长的一天。

由于地球的形状和运动,地球上不同的部分同时从不同的角度接收阳光。当你在德国喝咖啡的时候,你在美国的朋友可能正准备睡觉。根据阳光调整时间是不可避免的,因为如果可能的话,我们希望白天有阳光,晚上睡觉。因此,出现了一个叫做“本地时间”的概念。也就是根据太阳光束的角度计算的时间。为了使用方便,地球被划分为不同的地区,这些地区被称为“时区”。有些国家的领土上只有一个时区,而有些国家却有多个时区。在这个时区的小介绍之后,让我们开始真正的话题。

在时间序列分析中我们如何处理时区?

时间序列数据包括附加到连续时间戳的数据点。时间序列数据的来源是周期性的测量或观察。时间序列数据的分析对于许多行业中的关键任务是必不可少的。在这篇文章中,我将重点介绍时区,但是如果你想学习时间序列分析的基础知识,你可以从以下几点开始:

[## 熊猫的时间序列分析

如何处理和操作时间序列数据

towardsdatascience.com](/time-series-analysis-with-pandas-e6281a5fcda0)

我们生活在一个全球化的世界里。大公司通常希望在位于不同时区的许多不同国家开展业务。数据是公司的宝贵资产,需要正确分析。对于时间序列分析,忽略时区将是一个严重的错误。在这篇文章中,我将讲述时区的关键概念,以及如何在熊猫身上处理它们。

让我们从导入相关库开始:

import numpy as np
import pandas as pdimport datetime
import dateutil
import pytz

然后我们创建一个简单的时间序列数据:

dates = pd.date_range('2019-01-01','2019-01-10')

默认情况下,熊猫的时间序列对象没有指定的时区:

#date_range object
dates.tz is None
True#Timestamp object
date = pd.Timestamp('2019-01-01')
date.tz is None
True

我们可以使用 tz_localize 方法给这些对象分配一个时区:

dates_lcz = dates.tz_localize('Europe/Berlin')dates_lcz.tz
  <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>

Pytz vs dateutil

注意:Pandas 通过标准库的 pytzdateutil 库或 datetime.timezone 对象支持时区。

要分配时区,请执行以下操作:

  • 传递 pytz 或 dateutil 时区对象,或者
  • 传递奥尔森时区字符串

pytz 时区字符串的一个示例是“美国/太平洋”。dateutil 的相同时区字符串是“dateutil/US/Pasific”。您可以使用以下命令检查整个时区字符串列表:

  • 从 pytz 导入公共时区
  • 从 pytz 导入所有时区

我们还可以使用关键字参数 tz 创建一个带有时区的时间序列对象:

#using pytz
date_pytz = pd.Timestamp('2019-01-01', tz = 'Europe/Berlin')
date_pytz.tz
    <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>#using dateutil
date_util = pd.Timestamp('2019-01-01', tz = 'dateutil/Europe/Berlin')
date_util.tz
  tzfile('/usr/share/zoneinfo/Europe/Berlin')

没有时区的时间序列的数据类型是 datetime64[ns]。如果指定了时区,则数据类型变为 datetime64[ns,tz]:

dates = pd.date_range('2020-01-01', periods = 5, freq = 'D')dates_tz = pd.date_range('2020-01-01', periods = 5, freq = 'D', tz='US/Eastern')

我们可能还需要将时间序列数据转换到不同的时区:

date_berlin = pd.Timestamp('2019-01-01', tz = 'Europe/Berlin')date_converted = date_berlin.tz_convert('US/Central')

注:世界协调时

协调世界时(UTC)是一种时间标准,不同国家的当地时间根据 UTC 来描述。例如,马来西亚的当地时间是 UTC + 8。关于 Pandas 的时间序列分析,所有时间戳都存储在 UTC 下。当您转换时间戳对象的时区时,新对象有自己的日期和时间,但它被认为与原始对象相同。

让我们通过检查前面示例中的 date_berlin 和 date_converted 进行确认:

date_berlin == date_converted
True

删除时区信息

我们还可以使用 tz_localize(None)tz_convert(None) 删除时区信息:

date = pd.Timestamp('2020-02-01', tz='US/Eastern')date
  Timestamp('2020-02-01 00:00:00-0500', tz='US/Eastern')date.tz_localize(None)
  Timestamp('2020-02-01 00:00:00')

要减去时间戳,它们必须在同一个时区或不在同一个时区:

date1 = pd.Timestamp('2020-02-01 15:00', tz='US/Eastern')date2 = pd.Timestamp('2020-02-01 09:00', tz='US/Pacific')

我们可以去掉时区,做减法:

date1.tz_localize(None) - date2.tz_localize(None)Timedelta('0 days 06:00:00')

感谢您的阅读。如果您有任何反馈,请告诉我。

如果你想了解更多关于熊猫的时间序列,你可以随时在熊猫官方网站上查看用户指南

时间序列分析、建模和验证

原文:https://towardsdatascience.com/time-series-analysis-modeling-validation-386378cd3369?source=collection_archive---------4-----------------------

时间数列预测法

用 Python 实现 ARIMA 时间序列预测的端到端项目

背景

本文是时序数据系列的第四篇文章。我们首先讨论了各种探索性分析和数据准备技术,然后构建了一个健壮的 T2 模型评估框架。最后,在我们的上一篇文章中,我们讨论了在转向机器学习算法之前必须探索的广泛的经典预测技术。

现在,在当前的文章中,我们将把所有这些知识应用到现实生活的数据集中。我们将从头到尾完成一个时间序列预测项目,从导入数据集、分析和转换时间序列到训练模型,以及对新数据进行预测。我们将完成这个项目的步骤如下:

  1. 问题描述
  2. 数据准备和分析
  3. 建立评估框架
  4. 静态检查:增强的迪基-富勒试验
  5. ARIMA 模型
  6. 残差分析
  7. 偏差校正模型
  8. 模型验证

问题描述

问题是预测每月航空乘客的数量。在这个练习中,我们将使用航班乘客数据集。该数据集描述了一段时间内航空公司乘客的总数。单位是以千为单位的航空乘客数量的计数。从 1949 年到 1960 年有 144 个月的观测。下面是数据集前几行的示例。

样本数据集

你可以从这里下载这个数据集。

这个项目的 Python 库

我们需要以下库来完成这个项目。这些名字是不言自明的,但是如果你没有得到任何一个也不用担心。随着我们的深入,你会理解这些库的用法。

import numpy 
from pandas import read_csv 
from sklearn.metrics import mean_squared_error
from math import sqrt
from math import log
from math import exp
from scipy.stats import boxcox 
from pandas import DataFrame
from pandas import Grouper
from pandas import Series
from pandas import concat
from pandas.plotting import lag_plot
from matplotlib import pyplot
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.arima_model import ARIMAResults
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.gofplots import qqplot

数据准备和分析

我们将使用 read_csv()函数将时间序列数据作为 series 对象加载,这是一个一维数组,每行都有一个时间标签。查看数据以确认数据已经被正确加载总是有好处的。

series = read_csv('airline-passengers.csv', header=0, index_col=0, parse_dates=True, squeeze=True)
print(series.head())

让我们通过查看汇总统计数据来开始数据分析,我们将快速了解数据分布。

print(series.describe())

我们可以看到观察值与我们的预期相符,平均值约为 280,我们可以考虑我们在这个系列中的水平。其他统计数据,如标准差和百分位数,表明数据分布很广。

下一步,我们将可视化线图上的值,这个工具可以提供很多关于问题的见解。

series.plot()
pyplot.show()

这里,线图表明,随着时间的推移,航空乘客有增加的趋势。我们还可以观察到每年旅行模式的系统性季节性,季节性信号似乎随着时间的推移而增长,这表明了一种倍增关系。

这种见解给了我们一个提示,数据可能不是静态的,我们可以探索一个或两个级别的差异,使其在建模之前是静态的。

我们可以通过年线图来证实我们的假设。

对于下面的图,创建了不同年份的独立数据组,并绘制了 1949 年至 1957 年间每年的线图。您可以创建此图任意年数。

groups = series['1949':'1957'].groupby(Grouper(freq='A'))
years = DataFrame()
pyplot.figure()
i = 1
n_groups = len(groups)
for name, group in groups:
  pyplot.subplot((n_groups*100) + 10 + i)
  i += 1
  pyplot.plot(group)
pyplot.show()

我们可以通过按年查看数据集的线图来观察季节性是一个年周期。我们可以看到每年年末都有所下降,从 7 月到 8 月有所上升。这种模式存在多年,再次建议我们采用基于季节的建模。

让我们探索观察的密度,以进一步了解我们的数据结构。

pyplot.figure(1)
pyplot.subplot(211)
series.hist()
pyplot.subplot(212)
series.plot(kind='kde')
pyplot.show()

我们可以观察到该分布不是高斯分布,这种认识鼓励我们在建模之前探索一些数据的对数或幂变换。

让我们按年分析月度数据,了解每年观察值的分布情况。

我们将通过盒须图进行分析。

groups = series['1949':'1960'].groupby(Grouper(freq='A'))
years = DataFrame()
for name, group in groups:
  years[name.year] = group.values
years.boxplot()
pyplot.show()

数据的分布(蓝框)表明了多年来的增长趋势,这也表明了我们对数据非平稳性的假设。

分解时间序列以更清楚地了解其组成部分——水平、趋势、季节性和噪声。

根据我们目前的分析,我们有一种直觉,我们的时间序列是乘法的。所以,我们可以假设一个乘法模型来分解这个序列。

result = seasonal_decompose(series, model='multiplicative')
result.plot()
pyplot.show()

我们可以看到,从序列中提取的趋势和季节性信息验证了我们早期的发现,即序列具有增长趋势和每年的季节性。残差也很有趣,显示了在该系列的早期和后期的高度可变性。

建立评估框架以构建稳健的模型

在进行模型构建练习之前,我们必须开发一个评估框架来评估数据和评估不同的模型。

第一步是定义验证数据集

这是历史数据,因此我们无法收集未来的更新数据来验证该模型。因此,我们将使用同一系列的最后 12 个月作为验证数据集。我们将这个时间序列分成两个子集—训练和验证,在整个练习中,我们将使用这个名为“数据集”的训练数据集来构建和测试不同的模型。所选模型将通过“验证”数据集进行验证。

series = read_csv('airline-passengers.csv', header=0, index_col=0, parse_dates=True, squeeze=True)
split_point = len(series) - 12
dataset, validation = series[0:split_point], series[split_point:]
print('Train-Dataset: %d, Validation-Dataset: %d' % (len(dataset), len(validation)))
dataset.to_csv('dataset.csv', header=False)
validation.to_csv('validation.csv', header=False)

我们可以看到,训练集有 132 个观察值,验证集有 12 个观察值。

第二步是开发基线模型。

时间序列预测的基线预测也称为简单预测。在这种方法中,前一个时间戳的值是对下一个时间戳的预测。

我们将使用步行向前验证,这也被认为是时间序列世界的 k 倍交叉验证技术。您可以在我以前的一篇文章“构建预测模型的评估框架”中详细探讨这种技术。

series = read_csv('dataset.csv', header=None, index_col=0, parse_dates=True, squeeze=True)
X = series.values
X = X.astype('float32')
train_size = int(len(X) * 0.5)
train, test = X[0:train_size], X[train_size:]

这是我们的简单模型的实现和单步预测的向前验证结果。

history = [x for x in train]
predictions = list()
for i in range(len(test)):
  yhat = history[-1]
  predictions.append(yhat)
  obs = test[i]
  history.append(obs)
  print('>Forecast=%.3f, Actual=%3.f' % (yhat, obs))
# display performance report
rmse = sqrt(mean_squared_error(test, predictions))
print('RMSE: %.3f' % rmse)

作为一种性能衡量标准,我们使用了 RMSE(均方根误差)。现在,我们有了一个基线模型精度结果,RMSE: 40.350

我们的目标是建立一个比基线更精确的模型。

静态检查—增强的迪基-富勒试验

我们已经从探索性数据分析中获得了一些证据,证明我们的时间序列是非平稳的。

我们将使用这个扩展的 Dickey-Fuller 检验来证实我们的假设。这是一个统计测试,它使用自回归模型,并在多个不同的滞后值上优化信息标准。

检验的无效假设是时间序列不是平稳的。

由于我们有一个强烈的直觉,即时间序列不是平稳的,所以让我们创建一个具有不同值的新序列,并检查这个转换后的序列的平稳性。

让我们创建一个差异系列。

我们将从当前值中减去前一年的同一个月的值,得到这个新的序列。

def difference(dataset, interval=1):
  diff = list()
  for i in range(interval, len(dataset)):
    value = dataset[i] - dataset[i - interval]
    diff.append(value)
  return Series(diff)
X = series.values
X = X.astype('float32')# differenced datamonths_in_year = 12
stationary = difference(X, months_in_year)
stationary.index = series.index[months_in_year:]

现在,我们可以对差异序列进行 ADF 检验,如下所示。

我们将使用 adfuller 函数来检验我们的假设,如下所示。

result = adfuller(stationary)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value in result[4].items():
  print('\t%s: %.3f' % (key, value))

结果表明,检验统计值-3.048011 小于临界值-3.488 的 1%。这表明我们可以拒绝显著性水平小于 1%的零假设。

拒绝零假设意味着时间序列是平稳的。

让我们来看一下差异数据集。

我们可以看到图中的模式看起来是随机的,不显示任何趋势或季节性。

stationary.plot()
pyplot.show()

使用差分数据集作为我们的 ARIMA 模型的输入是理想的。我们知道这个数据集是固定的,因此参数' d '可以设置为 0。

接下来,我们必须决定自回归(AR)和移动平均(MA)参数的滞后值。

这些参数也分别称为 p 和 q。我们可以使用自相关函数(ACF)和偏自相关函数(PACF)来识别这些参数。

pyplot.figure()
pyplot.subplot(211)
plot_acf(stationary, lags=25, ax=pyplot.gca())
pyplot.subplot(212)
plot_pacf(stationary, lags=25, ax=pyplot.gca())
pyplot.show()

ACF 显示了 4 个月的显著滞后,这意味着 p 的理想值是 4。PACF 显示了 1 个月的显著滞后,这意味着 q 的理想值是 1。

现在,我们有了 ARIMA 模型所需的所有参数。

  1. 自回归参数(p): 4
  2. Integrated (d): 0 ( )如果我们考虑将原始观察结果作为输入,我们可以使用 1。我们已经看到我们的系列在一级差分后转变为平稳
  3. 移动平均参数(q): 1

让我们创建一个函数来反转差值

因为我们是在差异数据集上建模,所以我们必须通过添加前一年的同一个月的值来恢复原始比例的预测值。

def inverse_difference(history, yhat, interval=1):
  return yhat + history[-interval]

使用人工识别参数的 ARIMA 模型

history = [x for x in train]
predictions = list()
for i in range(len(test)):
  # difference data
  months_in_year = 12
  diff = difference(history, months_in_year)
  # predict
  model = ARIMA(diff, order=(3,0,1))
  model_fit = model.fit(trend='nc', disp=0)
  yhat = model_fit.forecast()[0]
  yhat = inverse_difference(history, yhat, months_in_year)
  predictions.append(yhat)
  # observation
  obs = test[i]
  history.append(obs)
  print('>Forecast=%.3f, Actual=%.3f' % (yhat, obs))
# report performance
rmse = sqrt(mean_squared_error(test, predictions))
print('RMSE: %.3f' % rmse)

我们可以看到,与基线相比,误差显著减少。

我们将进一步尝试使用网格搜索来优化参数

我们将评估具有不同参数(p,d,q)值的多个 ARIMA 模型。

# grid search ARIMA parameters for time series
# evaluate an ARIMA model for a given order (p,d,q) and return RMSE
def evaluate_arima_model(X, arima_order):
  # prepare training dataset
  X = X.astype('float32')
  train_size = int(len(X) * 0.66)
  train, test = X[0:train_size], X[train_size:]
  history = [x for x in train]
  # make predictions
  predictions = list()
  for t in range(len(test)):
    # difference data
    months_in_year = 12
    diff = difference(history, months_in_year)
    model = ARIMA(diff, order=arima_order)
    model_fit = model.fit(trend='nc', disp=0)
    yhat = model_fit.forecast()[0]
    yhat = inverse_difference(history, yhat, months_in_year)
    predictions.append(yhat)
    history.append(test[t])
  # calculate out of sample error
  rmse = sqrt(mean_squared_error(test, predictions))
  return rmse
# evaluate combinations of p, d and q values for an ARIMA model
def evaluate_models(dataset, p_values, d_values, q_values):
  dataset = dataset.astype('float32')
  best_score, best_cfg = float("inf"), None
  for p in p_values:
    for d in d_values:
      for q in q_values:
        order = (p,d,q)
        try:
          rmse = evaluate_arima_model(dataset, order)
          if rmse < best_score:
            best_score, best_param = rmse, order
          print('ARIMA%s RMSE=%.3f' % (order,rmse))
        except:
          continue
print('Best ARIMA%s RMSE=%.3f' % (best_param, best_score))
# load dataset
series = read_csv('dataset.csv', header=None, index_col=0, parse_dates=True, squeeze=True)
# evaluate parameters
p_values = range(0, 5)
d_values = range(0, 2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
evaluate_models(series.values, p_values, d_values, q_values)

网格搜索输出

我们通过网格搜索找到了最佳参数。我们可以通过使用建议的参数(1,1,1)来进一步减少误差。

RMSE: 10.845

残差分析

最后一项检查是分析模型的残差。理想情况下,残差的分布应该遵循均值为零的高斯分布。我们可以通过从实际值中减去预测值来计算残差,如下所示。

residuals = [test[i]-predictions[i] for i in range(len(test))]
residuals = DataFrame(residuals)
print(residuals.describe())

然后简单地使用 describe 函数来获得汇总统计信息。

我们可以看到,模型中有一个很小的偏差。理想情况下,平均值应该为零。我们将使用该平均值(0.810541)来修正预测中的偏差,方法是将该值添加到每个预测中。

偏差校正模型

作为对模型的最后改进,我们将产生一个有偏差的调整预测。下面是 Python 的实现。

history = [x for x in train]
predictions = list()
bias = 0.810541
for i in range(len(test)):
  # difference data
  months_in_year = 12
  diff = difference(history, months_in_year)
  # predict
  model = ARIMA(diff, order=(1,1,1))
  model_fit = model.fit(trend='nc', disp=0)
  yhat = model_fit.forecast()[0]
  yhat = bias + inverse_difference(history, yhat, months_in_year)
  predictions.append(yhat)
  # observation
  obs = test[i]
  history.append(obs)
# report performance
rmse = sqrt(mean_squared_error(test, predictions))
print('RMSE: %.3f' % rmse)
# errors
residuals = [test[i]-predictions[i] for i in range(len(test))]
residuals = DataFrame(residuals)
print(residuals.describe())

偏差校正输出

我们可以看到误差略有减少,平均值也向零偏移。图表还显示了高斯分布。

在我们的例子中,我们有一个非常小的偏差,所以这种偏差校正可能没有被证明是一个重大的改进,但在现实生活中,这是一个重要的技术,在任何偏差存在的情况下,在最后进行探索。

检查残差中的自相关

作为最后的检查,我们应该调查残差中是否存在任何自相关。如果存在,意味着模型有改进的机会。理想情况下,如果模型拟合良好,残差中不应留有任何自相关。

这些图表表明,模型中已经捕获了所有的自相关,并且残差中不存在自相关。

所以,我们的模型通过了所有的标准。我们可以保存这个模型以备后用。

模型验证

我们已经完成了模型,现在可以将它保存为. pkl 文件供以后使用。偏置号也可以单独保存。

这包括预测所需的系数和所有其他内部数据。

npy:这是存储在 NumPy 数组中的偏差值。

bias = 0.810541
# save model
model_fit.save('model.pkl')
numpy.save('model_bias.npy', [bias])

加载模型并对验证数据集进行评估

这是本练习的最后一步。我们将加载保存的模型和一个偏差数,并对验证数据集进行预测。

# load and evaluate the finalized model on the validation dataset
validation = read_csv('validation.csv', header=None, index_col=0, parse_dates=True,squeeze=True)
y = validation.values.astype('float32')
# load model
model_fit = ARIMAResults.load('model.pkl')
bias = numpy.load('model_bias.npy')
# make first prediction
predictions = list()
yhat = float(model_fit.forecast()[0])
yhat = bias + inverse_difference(history, yhat, months_in_year) predictions.append(yhat)
history.append(y[0])
print('>Forecast=%.3f, Actual=%.3f' % (yhat, y[0]))
# rolling forecasts
for i in range(1, len(y)):
  # difference data
  months_in_year = 12
  diff = difference(history, months_in_year)
  # predict
  model = ARIMA(diff, order=(1,1,0))
  model_fit = model.fit(trend='nc', disp=0)
  yhat = model_fit.forecast()[0]
  yhat = bias + inverse_difference(history, yhat, months_in_year)
  predictions.append(yhat)
  # observation
  obs = y[i]
  history.append(obs)
  print('>Forecast=%.3f, Actual=%.3f' % (yhat, obs))
# report performance
rmse = sqrt(mean_squared_error(y, predictions))
print('RMSE: %.3f' % rmse)
pyplot.plot(y)
pyplot.plot(predictions, color='red')
pyplot.show()

我们可以观察验证数据集的实际值和预测值。这些值也绘制在线图上,显示了我们的模型的一个有希望的结果。

实际与预测—验证数据集

您可以在我的 Gist 资源库中找到完整的代码。

摘要

本教程可以作为你的单变量时间序列具体问题的模板。在这里,我们学习了任何预测项目中涉及的每个步骤,从探索性数据分析到模型构建、验证,最后保存模型以备后用。

您应该探索一些额外的步骤来改善结果。您可以尝试对原始序列进行 box cox 转换,并将其用作模型的输入,对转换后的数据集应用网格搜索以找到最佳参数。

感谢阅读!请随时分享任何意见或反馈。

希望你发现这篇文章信息丰富。在接下来的几篇文章中,我将讨论一些高级的预测技术。

参考

[1] Galit Shmueli 和 Kenneth Lichtendahl,实用时间序列预测与 R:实践指南,2016 年。

2杰森·布朗利,https://machinelearningmastery.com/

[3]https://scikit learn . org/stable/modules/generated/sk learn . model _ selection。TimeSeriesSplit.html

[4]https://www . stats models . org/stable/user-guide . html #时序分析

Chipotle 的下一步是什么?

原文:https://towardsdatascience.com/time-series-analysis-of-chipotles-yelp-reviews-with-natural-language-processing-75e11bf3074f?source=collection_archive---------35-----------------------

Chipotle 的 Yelp 评论的时间情感分析

词云 Chipotle 的 Yelp 评论中出现频率最高的词

这个作品是基于我们团队加州大学戴维斯分校 MSBA 项目的机器学习课程的最终项目(浩浩杰克叶黄毅军李玉婷)。利用自然语言处理,我们用时间序列方法分析了 Chipotle 在 Yelp 上的评论。我们首先对 Chipotle 进行市场调查,以确定其价值、问题和战略因素。然后,我们通过情感分析研究这些关键因素,并揭示 Chipotle 业务的趋势和见解。

背景和目标

Chipotle Mexican Grill 由 Steve Ellis 于 1993 年创立,是一家声誉卓著的快速休闲连锁餐厅,每天为 100 多万顾客提供德州-墨西哥美食。Chipotle 采用溢价定价策略,以合理的价格为客户提供最优质的产品。它的品牌建立在“诚信食品”的承诺和关键价值观上,如食品的新鲜度和食材的高质量采购。根据 CSI Market 的数据,凭借这些战略因素,Chipotle 成功地在竞争中获得了一席之地,并占据了餐饮业 2.4%的市场份额。

然而,自 2015 年以来,由于诺如病毒、大肠杆菌和沙门氏菌等一系列健康问题导致美国大量消费者患病,Chipotle 开始失去客户其收入在 2015 年和 2016 年大幅下降。在幕后,消费者对 Chipotle“诚信食品”的承诺失去了信任。据路透社报道,2018 年,Chipotle 关闭了多达 65 家表现不佳的商店,以努力改造和提高盈利能力。

为了重新赢得顾客,Chipotle 实施了几项措施,比如建立新的安全协议和推出新的菜单。它还试图通过引入手机应用程序和在线订购来克服客户等待时间的问题。随着 Chipotle 顺应电子商务的大趋势,变得越来越数字化,我们建议它采取更加数据驱动的方法来改善其业务。通过分析 Yelp 上的评论,Chipotle 可以找到关于其业务关键方面或趋势的宝贵见解,并相应地制定策略来增加收入。

数据描述和处理

数据描述

对于这个项目,我们利用了 Yelp 开放数据集。我们首先使用业务 id 合并业务表和评论表。然后我们过滤合并后的表,只包含 Chipotle Mexican Grill 上的 9590 条评论。

自然语言处理

我们为每篇评论标注情感。使用 TextBlob ,我们计算每条评论的情感分数,从-1 到 1。我们将“正面”情绪分配给具有正面情绪分数的评论,“负面”情绪分配给负面分数,“中性”情绪分配给 0 分。接下来,我们对每个评论文本应用停用词移除、否定处理和词条化。

过滤掉不相关的列后,最终的数据集有 9590 行,日期、星级、评论文字、情感评分、情感 5 列。

探索性数据分析

我们先看 Chipotle 的星级。通过可视化月度平均星级评分,我们看到 Chipotle 的评分自 2011 年以来一直稳定下降,从 4.0 降至 2.5。

Chipotle 的月平均星级

然后,我们可视化所有星级组的评论数量。我们注意到,在所有群体中,一星和二星评论的数量增长最为显著,这可能导致 Chipotle 的整体星级下降。

不同星级组中的评论

我们还创建了评论观点的可视化。

有史以来,正面情绪评论的数量是负面情绪评论的两倍。

正面/负面情绪评论的数量

此外,我们验证了情绪得分随着星级的增加而增加。

查看星级评定组之间的情感分布

评论情感的时间序列分析

在以前的 EDA 中,我们揭示了评论的情绪与星级评定密切相关,因此也与业务绩效密切相关。现在,我们感兴趣的是确定对评论情绪贡献最大的因素。我们认为这些因素是 Chipotle 应该注意的关键方面。在这种分析中,我们将这些因素识别为出现频率与星级密切相关的单词。

我们首先通过查看 Chipotle 过去采取的商业策略,建立一个词汇库,或感兴趣的词汇库(WOI ):

1.建立新的安全协议(WOI: 新鲜,安全,等)。)

从健康危机中吸取教训,Chipotle 建立了新的安全协议,将公司定位为“食品安全行业的领导者这样的协议包括一些规则,比如在新鲜农产品被使用前对其进行分支。

2.推出新的菜单项目(WOI: 菜单,卷饼,等。)

Chipotle 推出了新的菜单项目,如油炸玉米饼和油炸玉米饼。为什么会突然改变?是不是 Chipotle 想在有限的菜单中解决自己的缺点?还是顾客对它的主食墨西哥卷饼失去了兴趣?

3.介绍移动和在线订购(WOI: 线下、线上、移动、等)。)

2014 年,Chipotle 推出了一款移动点餐应用,让顾客在来到餐厅前几分钟点餐并付款。这有助于减少客户排队的时间,改善他们的订购体验。

现在,我们将所选 WOIs 出现率的变化与每月星级的变化一起可视化。正面和负面评审中 WOIs 的出现率正式定义如下:

其中 s 表示评论情绪(s = / ), R 指单篇评论, N 为有情绪 s 的评论总数, I 为指标函数。

我们分析发生率,而不是原始发生数,因为评论的总数每月都在变化。因此,该指标测量在任一情绪类别的评论中 WOI 的归一化频率。我们还决定只分析 2012 年之后的评论,因为 2012 年之前没有足够的评论。

我们从三个方面解释了 WOI 度量的可视化:WOI 在正面/负面评论中的出现率随时间的变化以及 WOI 在两个评论中的出现率的比较。

1.正面评价中 WOI 出现率的变化

如果一个词曾经有很高的阳性率,我们可以说它是企业的强项。正比率的下降表明餐厅在这方面正在失去优势。根据下图,Chipotle 应该调查其菜单项的新鲜度及其墨西哥卷饼产品的质量。

如下图所示,Chipotle 的关键值“新鲜”在正面评论中的出现率下降了一半,从 0.3 降至 0.15。

正面评价中“新鲜”的每月出现率

这同样适用于 Chipotle 最重要的产品“墨西哥卷饼”,其出现率从 0.4 降至 0.2。

正面评价中“墨西哥卷饼”的每月出现率

2.负面评论中 WOI 出现率的变化

负面评价出现率较高的 WOI 表明 Chipotle 在这方面可能表现不佳。从下图中可以看出,从 2012 年开始,“线”的出现率增加。但从 2015 年开始下降。我们可以推断,2015 年的转折点是由 Chipotle 在 2014 年推出其移动点餐 app 引起的,该 app 旨在减少 line。从这个意义上说,Chipotle 通过数字订购减少顾客等待时间的策略是成功的。展望未来,Chipotle 应该继续推行这一举措。

负面评价中“线”的月出现率

3.两种综述中 WOI 发生率的比较

如果一个 WOI 在正面评论中的出现率比负面评论中的出现率高,我们说它带有正面情绪。因此,当一个本身中立的 WOI 在正面评论中的出现率高于负面评论时,它可以被视为该业务的一个积极方面。反之亦然。

“在线”和“应用程序”都是中性词,但在负面评论中的出现率始终高于正面评论。这表明 Chipotle 在数字商务渠道中表现不佳。它需要改进其移动订购应用程序和在线订购系统,以增强客户的购买体验。

商业见解和建议

根据我们的分析结果,我们在配料质量、等待时间和数字订购方面向 Chipotle 提出了建议。

通过可视化关键词“新鲜”随时间的出现率,我们发现“新鲜”正在慢慢消失在正面评论中。这表明,从消费者的角度来看,Chipotle 正在失去其在采购新鲜食材方面的优势。因此,Chipotle 应该调查其原料的新鲜度和质量,以重新获得战略优势。就其菜单产品而言,Chipotle 需要调查其最重要的产品墨西哥卷饼的当前质量,这种产品在正面评价中越来越少。Chipotle 需要调查为什么它的主食对顾客失去了吸引力。

另一方面,等待时间和排队显然是 Chipotle 的一个问题。我们的市场研究和数据分析都指出,“线”是导致顾客对 Chipotle 产生负面情绪的一大因素。为了解决这一问题,Chipotle 已经寻求在线订购和移动应用订购等数字渠道来改善这一问题。我们的情感分析显示,移动点餐应用的推出对等待时间产生了一些积极的影响。然而,这还不够。我们发现“在线”和“应用程序”在顾客评论中的负面影响更大,表明顾客对 Chipotle 的数字订购体验不满意。有鉴于此,Chipotle 需要改进其在线订购系统和移动应用程序,以便更好地解决等待时间问题并改善客户购买体验。

结论

在这篇博客中,我们比较了用户评论中词出现的变化,以揭示导致 Chipotle 的 Yelp 评级变化的关键因素。结合市场研究和 NLP 工具,我们揭示了对 Chipotle 业务状况的宝贵见解,并相应地提出了建议。这种分析管道也可以应用于其他衰退业务的评估,以形成见解和行动。

里约热内卢暴力事件的时间序列分析

原文:https://towardsdatascience.com/time-series-analysis-of-violence-in-rio-de-janeiro-310067976b7?source=collection_archive---------59-----------------------

警察造成的平民死亡人数如何影响该州的暴力犯罪率

乔治·弗洛伊德的死在美国争取人权和反对种族主义的斗争中留下了深刻的印记。发布在互联网上的令人震惊的视频展示了事件是如何发生的,使得世界各地的人们走上街头,要求结束种族主义和适当的警察行为。考虑到这一点,我决定寻找更多关于巴西如何与这些话题相关的数据,并找到了 BBC 的这份出版物,其中显示了2019 年里约热内卢州警察杀人的记录。

里约热内卢因是世界上最美丽的地方之一而闻名。不幸的是,它也被认为是一个非常暴力的城市,有很高的犯罪率和公共安全问题。

里约热内卢 Pixabay 摄于 Pexels

在英国广播公司的文章中,可以读到安全机构在过去实施的“对抗政策”,以帮助降低凶杀率。

所以我决定自己查看里约热内卢州的整体暴力数字,看看警察杀人数量的增加是否反映了暴力犯罪率的实际下降。

数据分析

我将把研究重点放在需要当局密切关注的更暴力的犯罪上:任何犯罪情况下的强奸、绑架和平民死亡。这项研究将包括时间序列趋势分析、相关性验证和时间序列预测。变量描述如下。

图例:

  • pol_kil是被警察杀死的人数。
  • rape是官方公布的强奸受害者人数
  • kidnap是特定时期绑架案件的总和
  • deaths是在犯罪情况下丧生的平民人数。这是数据集所有涉及平民死亡的列的总和。
  • anomes分别是案件发生的年份和月份。

经过适当的预处理后,可以将时间序列绘制成图表进行初步验证。由于自 1991 年以来没有收集所有变量的数据,一些图表中会出现一些直线。

作者图片

可以从这些变量的时间序列中获得一些信息:

  • 警察杀人——据 BBC 报道,警察造成的平民死亡人数正在显著增加。这是自 1991 年开始记录这一数据以来的最高数字。
  • 强奸——从 2003 年到 2019 年,该州每月官方公布的强奸案件增加了一倍多。实际的强奸数量在增加吗?还是这些年来更多的受害者开始报案并提出指控?结果可以有多种解释,结论也完全不同,因此批判性思维是基础,必须提出额外的数据来支持任何新的理论。根据现有信息,也不可能说强奸案件正在随着时间的推移而减少。相反,公共机构应该检查更多的数据,如果犯罪率确实在上升,他们需要从根本上采取行动。
  • 绑架——案件也呈上升趋势,但我们可以在图表中看到峰值,显示与平均行为相比,月与月之间的变化很大。
  • 死亡——2007 年至 2013 年,犯罪事件中的死亡人数大幅减少。然后震荡,从 2016 年开始再次回升。如果我们看看强奸的时间序列,2016 年也是趋势发生变化的一年。

对此很感兴趣,我在网上快速搜索了一下 2016 年里约热内卢的公共安全,想起了一个重要的事实:那是里约热内卢举办奥运会的一年。许多出版物,比如路透社的这篇文章,讨论了在安全措施方面的投资是多么糟糕,而这些投资仅仅足以掩盖奥运会期间的暴力事件。奥运会结束后,资源明显减少,随之而来的是暴力犯罪又卷土重来。这是这个数列的一个可能的理论。

但自 2007 年以来,死亡人数一直在减少,因此对奥运会的投资只是故事的一部分。有趣的是,从 2007 年到 2013 年,暴力犯罪的死亡率随着警察杀人的减少而下降。对 2007 年至 2013 年的安全政策历史进行更详细的调查,有助于开发新的想法,并改善打击犯罪的工作。

现在,抛开每年的长期趋势不谈,逐月变化可以更好地理解。下图显示了研究中每个变量每年的总病例数。

在强奸、绑架和谋杀的受害者中,每年有超过 1 万人直接受到里约热内卢暴力事件的影响。在巴西的一个州,每天有超过 27 人经历将结束他们生命或严重改变他们生命的事件。这还不包括抢劫、伤害以及这种情况带来的心理影响。

在第一张图表中,我们还可以看到在警察行动中死亡的人数从 2013 年的 416 人增加到 2019 年的 1814 人。6 年增加到 4.36 倍。然而,在这段时间内,暴力犯罪的趋势并没有下降。2019 年的数字与 2013 年几乎相同。

所以,我决定看看变量之间的相关性。如果有任何迹象表明其中一个方面的变化可以反映在其他方面,我会在相关矩阵中看到它。

作者图片

表中最强的相关性是死亡和年数之间的相关性,这表明犯罪事件中的死亡总数正在随着时间的推移而减少。但这种相关性是对整个数据集的分析,从 1991 年到 2019 年,所以这与最近几年没有严格的关系。当我们审视警察杀人时,没有迹象表明这与犯罪率的任何变化有很强的相关性。

然后我决定用现有的数据来看看这些数字未来几年的趋势。在预测中,我只使用了 2012 年对抗政策开始后的汇率。我还使用扩展的 Dickey-Fuller (ADF)测试来测试时间序列的平稳性,以确保模型具有代表性。在对数据集做了一些转换后,我将自回归综合移动平均(ARIMA)模型应用于警察杀人事件,并将其绘制在图表中。

作者图片

该模型似乎很好地预测了结果,并且没有显示出未来几年斜率变化的迹象。这意味着,如果不采取重大行动改变里约热内卢的公共安全方式,未来几年可能会有越来越多的人在警察行动中丧生。

结论

这项研究的目的是了解里约热内卢州过去几年实施的“对抗政策”是否有助于降低犯罪率。对里约热内卢州的暴力犯罪数量进行简要分析后,我们可以得出几个问题和结论:

  • 6 年来,警察与嫌疑犯对峙时的杀人事件增加了 4 倍多。这不是随机变化,因此可能是不同安全程序或措施的结果。
  • 官方公布的强奸案数量正在增加,但是在得出实际暴力增加的结论之前,还需要更多的数据。在这种类型的犯罪中,子通知被认为是一个问题,其结果也可能意味着更多的受害者站出来报案。然而,不能忽视这些数据,安全机构必须采取行动,确保强奸率不会上升。
  • 绑架案件在几个月和几年内波动很大,因此不可能根据现有数据将最近的下降归因于任何原因。需要更多的信息,以确保这不是一个常见的原因变异。
  • 如果我们分析自 1991 年以来的整个数据集,犯罪情况下的平民死亡有减少的趋势。然而,自 2013 年警察杀人事件开始增加以来,T4 没有减少的迹象。被警察杀害的人数与强奸、绑架和刑事案件中的死亡人数之间也没有很强的相关性。
  • 最好的假设是,犯罪率和警察杀人都是其他因素的因变量,如街上警察的数量、与罪犯对峙的次数以及关键地区主要警察行动的数量。然而,重要的是要再次记住,从 2007 年到 2012 年,死亡率持续下降,警察杀人事件也持续下降,因此有比使用暴力更好的替代方法来解决这个问题。
  • 运行时间序列预测分析我们可以看到被警察杀害的人数预计在未来几年还会上升。由于新冠肺炎的隔离,2020 年肯定会是一个例外,但需要采取实际行动来确保数字不会回升。乔治·弗洛伊德死后的抗议活动可能会引发新的讨论和新的想法,以更好地解决里约热内卢的暴力问题。

公共安全问题涉及数百个变量,解决方案不仅需要公共安全机构的巨大努力,也需要整个政府的巨大努力。这一分析的目的是用一些额外的数据来扩展 BBC 文章中的讨论,并可能提出新的理论,这些理论可以在我们通往更加平等与和平的社会的道路上进一步研究。利用现有的数据集可以进行许多其他分析,所以我鼓励人们和组织这样做,并把相关信息带给人们。在这一代人中,个人的个人观点可以影响成千上万的人,我真的相信我们必须透过表面,依靠数据来解决我们社会的问题。

如果你想了解分析的更多细节,你可以查看我的 GitHub 中的完整研究。在接下来的几周里,我会发布一些非常好的文章,如果你喜欢这篇文章,请查看我的媒体LinkedIn 个人资料!感谢您的阅读!

Tensorflow 中多元数据的时间序列分析

原文:https://towardsdatascience.com/time-series-analysis-on-multivariate-data-in-tensorflow-2f0591088502?source=collection_archive---------19-----------------------

杰森·布里斯科在 Unsplash 上的照片

什么是时间序列分析

通俗地说,时间序列分析处理的是主要用于从过去的值预测未来值的时间序列数据。应用范围可以从预测股票、原油等商品的价格、汽车等产品的销售、洗发水等快速消费品的销售,到预测特定地区的空气质量指数。时间序列可以分为单变量和多变量时间序列。单变量时间序列数据仅由随时间记录的单个观察值组成,而多变量时间序列由与我们感兴趣的主题相关的多个观察值组成。本文的重点将放在多元数据上。

从 Kaggle 获取数据:

为了执行时间序列分析,我们需要数据来构建我们的模型;为此我们将参考来自 kaggle 的公开可用数据集。对于本文,我们将使用印度主要城市过去五年的空气质量指数数据,在链接中提供。要将数据直接下载到 Google Colab,您可以参考以下链接:

[## 在 Google Colab |数据科学和机器学习中下载 kaggle 数据的最简单方法

针对我们社区的活动和主题| Kaggle 论坛

www.kaggle.com](https://www.kaggle.com/general/74235) [## 在 Google Colab 中设置 Kaggle

一个简单的新手教程

towardsdatascience.com](/setting-up-kaggle-in-google-colab-ebb281b61463)

如果您遵循了必要的步骤,您应该在下载的数据中看到以下文件。我们对 city_day.csv 文件感兴趣。

让我们选择分析所需的数据。我们将选择与德里市相对应的最近两年的数据。该数据有 1948 行和 15 列,包括我们想要为其建立模型的 AQI。

通过检查数据,我们发现我们的数据包含缺失值。因此,在开始分析之前,我们用每一列的平均值填充缺失值,去掉不必要的列。

现在我们已经有了数据,让我们进入下一部分。

时间序列的组成部分

顾名思义,时间序列数据由单个或多个观测值/变量组成,这些观测值/变量是在一个确定的时间间隔内顺序记录的。时间序列数据有多个方面,我们将通过执行一些探索性数据分析来了解这些方面:

季节性

在时间序列数据中,季节性是指数据中以固定间隔(通常少于一年)出现的周期性变化。一些例子是,圣诞节期间零售/电子商务销售的高峰,冬天期间保暖衣服销售的增加,等等。季节性可以通过查看图表本身来发现。下面的代码呈现了一个图表,看着它,我们可以说,尽管有几个波峰和波谷,但它们并不是以固定的间隔出现的,因此数据不是季节性的。

趋势

在时间序列数据中,趋势是指数据的总体趋势,无论是随着时间的推移而增加还是减少(长期方向)。看上面的图表,我们可以说数据的总趋势是既不增加也不减少,而是一个恒定的趋势。

不规则

不规则或随机成分是无法预测的。大多数情况下,它们持续时间短,不重复,并且由于不可预见的事件而发生。

周期性

当上升和下降模式存在,但不是在一个固定的时间间隔,然后它被称为周期性。一个例子可以是考虑一个国家的 GDP 数字,当绘制在一个相对于时间的图表上时,它会在衰退期间看到巨大的下降,如 1929 年、2000 年和 2008 年,但这些间隔不是固定的。因此,从上图中,我们可以说我们的数据是周期性的。

自相关

它意味着当前值与其过去值的相关性。自相关函数衡量当前序列与其滞后序列(过去值)的相似程度。AQI 指数的 ACF 图在蓝色区域上方显示尖峰,这表明该序列是自相关的。同样,您也可以检查数据集的其他系列的自相关。

平稳性:

如果一个时间序列的相应统计特性(如均值、标准差和自相关)在整个时间内保持不变,则称该时间序列是平稳的。为了检验多元时间序列的平稳性,我们对以数组形式返回特征值的时间序列进行 Johansen 协整检验。如果特征值小于 1,则称该级数是平稳的。

johansen 协整检验的特征值

因为我们得到的值小于 1,所以这个数列是平稳的。

LSTMs 在时间序列数据建模中的应用

递归神经网络(RNNs)是一种用于建模时间序列和自然语言等数据序列的神经网络。常规神经网络将一些信息 x 作为输入,并输出一个值 y。一层的输出不会馈入另一层。

RNNs 通过将一层的输出环回至另一层来克服这一缺点。

这意味着 RNNs 应该能够基于先前数据的上下文来预测接下来会发生什么,但是在实践中,RNNs 仅在该上下文和预测之间的差距很小时才解决该问题,并且如果该差距变得很大,则表现很差。幸运的是,长短期记忆解决了这个问题,它是一种特殊类型的 RNNs。

如上所述,RNNs 记住了序列中的每个信息,这导致了消失梯度的问题。在反向传播期间,梯度变得如此之小,以至于隐藏层在更新时学习得非常少。LSTMs 解决了这个问题,同时只记住相关信息并丢弃其他信息。rnn 只有一个激活功能,而 LSTMs 有一系列激活功能和门,通过它们来执行这个任务。

现在我们对 LSTMs 和它们的用途有了一些了解,让我们继续构建我们的模型。

数据准备

到目前为止,我们已经将超过 100 个数据加载到我们的机器中进行建模.经过一些检查,我们发现我们的数据不包含任何 NULL 或 NaN 值。当我们通过机器学习建模执行时间序列分析时,我们需要将数据转换为因变量(y)和自变量(X)的形式。这里我们的因变量是空气质量指数和其他变量,如 PM2.5、PM10、NO、NO2…..等等都是自变量。

我们将缩放数据以更快地处理它,并消除由于数据范围造成的偏差。现在我们需要按照 80:20 的比例将数据分为训练数据和测试数据。请注意,由于我们正在执行时间序列分析,我们不能将数据随机分为训练和测试,正如我们在建立其他机器学习模型时所做的那样,否则,该模型将找到最重要的本质,即时间。

创建和拟合模型

我们将使用 Tensorflow 库顶部的 Keras API 来构建我们的模型。下面是我们模型架构的蓝图。

model.add(LSTM(hidden_nodes, input_shape=(timesteps, input_dim)))
model.add(Dropout(dropout_value))
model.compile(loss, optimizer)

LSTM 网络的输入形状

hidden_nodes: 隐藏层的神经元个数。我们将取出 250 个神经元

剔除:用于减少模型的过拟合。根据经验,它被设置为 20%。

编译:编译函数将接受损失和优化器等参数。这里我们将把平均绝对误差作为误差度量,把 Adam 作为优化算法。

历元期间的训练和测试损失

预测并比较这些值:

在拟合模型之后,我们将在测试数据上检查我们的模型的性能。由于我们在拟合模型之前先对数据进行了归一化处理,因此我们必须对其进行反向缩放,以恢复原始比例的值。

现在我们已经有了测试数据集和原始测试数据的预测值,让我们通过计算 RMSE 并将它们绘制在一起来比较两者。

火车 RMSE: 41.096

测试 RMSE: 30.493

对于我们的模型来说,训练和测试数据上的 RMSE 没有太大差异,这是一个很好的指标。请注意,每次构建和运行模型时,您可能会获得不同的 RMSE 值。

时间序列预测可以说是单步或多步预测,这取决于它能够预测未来的时间步数。基于从我们的训练数据训练的模型,我们预测对应于测试数据的时间框架的未来值,因此它是多步预测。还记得我们在文章开头看到的 AQI 的图表吗,根据模型的预测,图表看起来是这样的:

结论:

  1. 在本文中,我们看到了如何使用 RNN-LSTM 建立一个多元时间序列模型,因为他们擅长从序列数据中提取模式。

2.时间序列数据不应该被随意划分为训练集和测试集,因为这样会失去其最重要的本质,即时间。

3.传统的时间序列预测方法如 ARIMA 方法有其局限性,因为它只能用于单变量数据和一步预测。

4.在各种研究中观察到,深度学习模型在多元时间序列数据上优于传统的预测方法。

5.由于提供的数据包含季节性,我们可以进一步降低数据的季节性,以便我们的模型可以专注于潜在的信号。

您可以在这里找到本文的完整代码

时间序列分析—第一部分/第二部分

原文:https://towardsdatascience.com/time-series-analysis-part-i-3be41995d9ad?source=collection_archive---------11-----------------------

入门

从独立同分布到相依非平稳数据

澳门图片社Unsplash 上拍摄的照片

17 世纪热那亚大议会的选举和 21 世纪全世界的股票价格有什么共同点?它们在某种程度上是随机的,人们在它们上面下注(见[1])。从简单的概率游戏到复杂的衍生品,人们试图(现在仍然试图)通过模拟随机性来赚钱。

18 和 19 世纪概率论的突破包括伯努利大数定律和德莫维尔-拉普拉斯定理(中心极限定理的早期版本)。两者都基于对给定观测值的强有力假设。随着现代概率论的发展,这两个结果被推广到许多方向,并被证明在相当弱的假设下成立。今天,从业者和数据科学家可以利用时间序列分析的各种工具,即允许数据的时间依赖性,甚至允许基本数据生成过程的分布变化的方法。

对于数据科学家来说,能够处理时间序列尤其重要,因为在高层次上,生产中的任何机器学习模型的质量都是时间序列,因此应该进行相应的分析。

在这个小型系列的第一部分中,我们介绍了理解 i.i.d. 数据和时间序列之间的差异所需的基本概念。

在下一部分的中,我们将对独立性和稳定性这两个常见假设进行测试,并查看它们在 Python 中的实现。

独立性ˌ自立性

让我们去一个可以说是概率论和统计学中许多理论出现的地方:一个赌场。如果我们玩轮盘赌,一轮的结果似乎不会影响下一轮的结果。任何给定数字的概率都是 1/37,因为总共有 37 个数字。同样的数字下一轮再出现的概率还是 1/37。如果连续出现 10 个“红”,下一轮出现另一个“红”的概率与之前相同,即 18/37,因为有 18 个红色和 19 个非红色数字。几轮轮盘赌的结果是独立

相反,当用一副普通的扑克牌玩扑克,并且我们的第一张牌是黑桃 a 时,抽到另一张黑桃 a 的概率应该为零。否则,那里会发生一些事情…无论如何,从一副牌中抽牌的结果是相关的

上面的例子说明了独立的概念。数学上,两个实值随机变量 XY 如果联合概率“因式分解”是独立的,即 P(X ≤ x,Y ≤ y) = P(X ≤ x) P(Y ≤ y) 对于任意实数 xy 。如果概率没有因选择 xy 而分解,则随机变量是相关的。这看似数学上的吹毛求疵,却是一个非常重要的概念,因为单个概率 P(X ≤ x)P(Y ≤ y) 比联合概率更容易处理。如果我们处理的不仅仅是两个,而是 n 个随机变量,那就更是如此了。

图 1:具有不同方差的独立数据,x 轴:时间,y 轴:数据值——作者图片

相同分布

回到我们新喜欢的地方,赌场,我们可以观察更多。特定事件的概率,例如轮盘赌桌上的“红色”,在每个轮盘赌桌上是相同的。类似地,某张牌的概率,比如黑桃 a,在任何牌桌上都是一样的。在两种情况下,分布都是相同的。

再次,有一个数学定义将这个概念形式化:两个实值随机变量 XY同分布如果 P(X ≤ z) = P(Y ≤ z) 对于任意实数 z 。同样,这一数学特性极大地简化了统计分析。

图 2:相同分布和相关的数据,x 轴:时间,y 轴:数据值——作者图片

时间序列

满足独立同分布两个条件的随机变量序列 X(1),…,X(n) 称为独立同分布I . I . d .。统计学中的许多重要结果,如中心极限定理,都是首先为独立同分布随机变量制定的。在某些情况下,独立同分布数据的假设可能是合理的,但在许多领域,感兴趣的数据既不是独立的,也不是同分布的。

例如,股票今天的价格取决于昨天的价格,股票的波动性可能会随着时间的推移而变化,这意味着基础分布的变化。

图 3:谷歌股票的美元价格,x 轴:时间,y 轴:股票的美元价格——作者图片

在这些情况下,我们希望放松独立同分布数据的强假设,并拥有一种对既不是独立的也不是同分布的数据有效的方法,这就是时间序列发挥作用的地方。

一个时间序列是由时间索引的随机变量的集合,例如 X(1),…,X(n) 。特别地,随机变量可以是相关的,并且它们的分布可能随时间而改变。由于这个定义不能确保大量的结构,我们需要一些额外的假设来推导出有意义的结果。

图 4:具有相关数据和时变平均值的时间序列,x 轴:时间,y 轴:时间序列的值——作者图片

平稳性(强、弱、局部)

时间序列的定义并不意味着对基本分布的任何限制。所以理论上,这种分布在任何时候都可能完全改变。这种行为不允许太多的统计推断,并且经常受到平稳性假设的限制。如果一个时间序列的分布不随时间变化,则称其为平稳

例如,在定量金融中,在有效市场假设下,对数收益通常被假定为平稳的。

更正式地说,一个由整数索引的时间序列 X(i)(强)平稳的,如果对于任何实数 x₁、x₂,…、xₖ 和任何整数 t₁、…、tₖh 它保持p[x(t₁]≤x₁、x(t₂)≤x⊙、…,x(t𔔭)≤x𔔭]= p

在实践中,许多时间序列是平稳的,如某些 ARMA 模型,大量的文献都是基于这一假设。然而,在其他情况下,这种假设可能过于严格。因此,平稳性的第一个松弛是弱平稳性,这基本上意味着期望值和协方差结构不随时间改变。形式上,一个方差有限的时间序列 X(i)弱平稳如果 E[X(I)]= E[X(0)和 E[X(I)X(I+h)]= E[X(0)X(h)对于任意时刻 i 和任意整数 h 请注意,平稳性意味着弱平稳性,而不是相反。

我们在实践中遇到的大多数时间序列可能是(弱)平稳的,或者可以通过差分或其他变换转换成平稳的时间序列。然而,还有第三个不太为人所知的概念,我想简单地提一下,但不涉及太多细节。考虑一系列 i.i.d .误差 ε(1),ε(2),…,ε(n) 和一个连续函数 μ 。那么 X(i,n) = μ(i/n) + ε(i) 显然不是平稳的。但是,它可以通过一族平稳时间序列进行局部近似,即对于任何 u 使得 i/n 接近于 uX(i,n) 接近于 Y(i|u) = μ(u) + ε(i) 。该模型是称为局部平稳的更大时间序列类别的一部分,文献中对局部平稳性有不同的定义,允许使用不同的方法(参见2、[3]或[4])。每当基本分布平稳变化时,局部平稳时间序列自然出现。一个重要的例子是全球气候,它随着时间逐渐变化。

依赖结构

不仅时变分布,而且相关结构也给统计分析带来了额外的挑战。很难直接测量随机变量之间的相关性,因此我们经常使用它们的相关性作为代理。如果两个随机变量 XY 的协方差 Cov( X,Y )为零,则它们不相关。根据经验,协方差越大,两个随机变量的相关性越强。注意,两个随机变量的独立性意味着不相关,但反之则不然。

为了测量整个时间序列的相关性,我们使用类似的方法。对于整数索引的时间序列 X(i) ,我们将长期方差定义为

对于平稳时间序列,和中的(自)协方差不依赖于 i 和σ ( i )=σ。如果 X(i) 是一个独立同分布的随机变量序列,那么长期方差就是简单的方差 Var( X(i) )。我们将在后面看到长期方差所起的作用类似于中心极限定理中的方差。当然,长期方差定义中的级数是否收敛还不清楚。事实上,我们说一个时间序列是短程相关如果该序列收敛并且长期方差存在。如果长期方差发散到无穷大,则时间序列是长期相关的

直观上,如果过去的事件对当前时刻时间序列的值只有很小的影响,则时间序列是弱相关的。例如,去年的温度对今天的温度影响很小,而昨天的温度影响较大。

有不同的概念暗示弱相关性,例如不同的混合条件弱物理相关性累积条件。对于应用中的大多数时间序列,这些条件应该得到满足,并且使用基于它们的方法是合理的。

包裹

到目前为止,我们已经看到了独立性和同分布的概念,以及从独立同分布数据到时间序列的推广。在这个小系列的第二部分中,我们将使用中心极限定理来进一步探索独立同分布数据和时间序列之间的差异。

作为数据科学家,我们日常使用的许多工具都是基于独立性或平稳性的假设。在这些情况下,确保假设得到满足是至关重要的。在下一部分中,我们将看到如何在实践中测试这些假设。

[1] D. R. Bellhouse,热那亚彩票(1991 年),统计学家。Sci。6,第 2 号,第 141 至 148 页。doi:10.1214/ss/1177011819。https://projecteuclid.org/euclid.ss/1177011819
【2】r .达尔豪斯,关于局部平稳过程的 Kullback-Leibler 信息散度(1996),随机过程及其应用,62(1),139–168。
[3]周,吴文波,非平稳时间序列的局部线性分位数估计(2009),统计年鉴,37(5B),2696–2729。
[4] M. Vogt,局部平稳时间序列的非参数回归(2012),统计年鉴,40(5),2601–2633。

时间序列分析:重采样、移位和滚动

原文:https://towardsdatascience.com/time-series-analysis-resampling-shifting-and-rolling-f5664ddef77e?source=collection_archive---------3-----------------------

如何重新组织时间序列数据

时间序列数据有许多定义,所有这些定义都以不同的方式表示相同的含义。一个直截了当的定义是,时间序列数据包括附加到连续时间戳的数据点。时间序列数据的来源是周期性的测量或观察。我们观察很多行业的时间序列数据。仅举几个例子:

  • 一段时间内的股票价格
  • 每日、每周、每月销售额
  • 过程中的定期测量
  • 一段时间内的电力或天然气消耗率

克里斯·利维拉尼在 Unsplash 上的照片

机器学习的进步增加了时间序列数据的价值。公司将机器学习应用于时间序列数据,以做出明智的商业决策,进行预测,比较季节性或周期性趋势。欧洲粒子物理研究所的大型强子对撞机(LHC)通过对亚原子粒子的测量产生了大量的时间序列数据。所以,它无处不在。处理好时间序列数据对于这类领域的数据分析过程至关重要。Pandas 是由 Wes Mckinney 创建的,旨在提供一个高效灵活的工具来处理财务数据。因此,对时间序列数据进行处理是一个非常好的选择。

在这篇文章中,我将介绍三种非常有用的操作,它们可以对时间序列数据进行操作。

  • 重采样
  • 改变
  • 旋转

我们先导入数据。我将使用 Kaggle 上的加密货币数据集

和往常一样,我们从导入我们需要的库开始:

import numpy as np
import pandas as pdimport matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("darkgrid")
%matplotlib inline

这是一个巨大的数据集,但我将只使用莱特币的开盘价,这足以证明如何重采样,移动和滚动窗口的工作。

df = pd.read_csv("crypto-markets.csv", parse_dates=["date"], index_col="date")df = df[df.slug == "litecoin"][["open"]]df.shape
(2042,1)df.head()

在处理时间序列数据时,最好使用日期作为数据帧的索引。

重采样

重采样基本上意味着用不同的频率表示数据。假设我们有一个每分钟都进行测量的温度传感器。如果我们不需要分钟级的精度,我们可以取一小时内 60 分钟测量值的平均值,并显示每小时的温度变化。这是下采样,意味着转换到较低的频率。

可以使用 resample()asfreq() 函数进行重采样。

  • 重采样:根据指定的频率和聚合函数聚合数据。
  • Asfreq :根据指定的频率选择数据,并在指定的间隔结束时返回值。

让我们看看它在真实数据集上的样子。

fig, ax = plt.subplots(3, sharex=True)df[-500:].plot(figsize=(12,8), ax=ax[0], title="Original Data",
legend=False)df[-500:].resample('10D').mean().plot(figsize=(12,8), ax=ax[1], 
title="Down-sampled to 10-day periods",legend=False)df[-500:].resample('30D').mean().plot(figsize=(12,8), ax=ax[2],
title="Down-sampled to 30-day periods",legend=False)

带重采样的下采样()

如您所见,随着频率的增加,下采样使数据更加平滑。

使用 asfreq()进行下采样

Asfreq 选择指定间隔结束时的值,as 重采样聚合(通常是平均值)指定间隔内的值。

顾名思义,上采样是下采样的反义词。频率增加了。当我们增加频率时,会有一些数据丢失。

我们可以将这些缺失值留空(缺失),或者选择一种方法来填充这些缺失值,如向前填充或向后填充。

换挡

LumenSoft TechnologiesUnsplash 上拍摄的照片

时间序列数据分析可能需要移动数据点来进行比较。移位t 移位功能及时移位数据。

  • 移位:移位数据
  • tshift:移动时间索引

shift 和 tshift 之间的区别可以用可视化来更好地解释。让我们从数据集中抽取一个样本并应用移位:

data = df.iloc[:20,:]

我们现在可以绘制原始数据和移位版本:

fig, ax = plt.subplots(nrows=3, figsize=(10,6), sharey=True)
fig.tight_layout(pad=2)data.plot(ax=ax[0], title="Original Data", legend=None)
data.shift(5).plot(ax=ax[1], title="Shifting Data", legend=None)
data.tshift(5).plot(ax=ax[2], title="Shifting Index", legend=None)

根据任务的不同,我们可以移动数据点或索引。

matplotlib 的 tight_layout 函数允许使用 pad 参数调整子情节之间的间隙。

滚动

滚动是对时间序列数据非常有用的操作。滚动意味着创建一个指定大小的滚动窗口,并对该窗口中的数据执行计算,当然,该窗口会滚动数据。下图解释了滚动的概念。

值得注意的是,计算是在整个窗口都在数据中时开始的。换句话说,如果窗口的大小为三,则第一次聚合在第三行完成。让我们将大小为 5 的滚动应用于我们在上一部分中创建的示例数据帧:

滚动后 2013 年 5 月 2 日的值是原始数据中前 5 个值的平均值。2013–05–03 上的值是原始数据中第二到第六个值的平均值,依此类推。

时间序列数据是预测分析旨在解决的许多问题的核心。因此,如果你打算在预测分析领域工作,你肯定应该学习如何处理好时间序列数据。

感谢阅读。如果您有任何反馈,请告诉我。

使用 Python 中的 Pandas 进行时间序列分析

原文:https://towardsdatascience.com/time-series-analysis-using-pandas-in-python-f726d87a97d8?source=collection_archive---------1-----------------------

对季节性、趋势、自相关等关键词的额外介绍。

来源:迷因生成器

马上,时间序列数据不是你的平均数据集!您可能已经处理过住房数据,其中每一行代表一所特定房屋的特征(例如总面积、卧室数量、建造年份),或者学生数据集,其中每一行代表学生的信息(例如年龄、性别、以前的 GPA)。在所有这些数据集中,共同点是所有样本(或数据集中的行)通常都是相互独立的。这些数据集与时间序列数据的区别在于,在后者中,每一行都代表一个时间点,因此很自然地,数据有一些固有的排序。典型的时间序列数据看起来是这样的:

在上面的数据集中,我们记录了 1991 年 1 月的每一天的一些(比如温度)。当然,除了温度之外,您还可以在特定的一天收集更多的值,比如当天的湿度或风速。

让我们开始研究数据吧!

我们将使用公开的数据集开放电力系统数据。你可以在这里下载数据。它包含 2006-2017 年的电力消耗、风力发电和太阳能发电。

将数据集加载到 Jupyter 笔记本:

url='[https://raw.githubusercontent.com/jenfly/opsd/master/opsd_germany_daily.csv'](https://raw.githubusercontent.com/jenfly/opsd/master/opsd_germany_daily.csv')
data = pd.read_csv(url,sep=",")

我们的数据看起来是这样的:

图一

将数据转换为正确的格式

如果你读过我以前的文章,你就会知道正确的日期时间格式的重要性。同样,当处理时间序列时,如果我们将Date列表示为一个时间戳,就会变得容易得多。时间戳是 pandas 处理日期和时间的主要数据结构。pandas 函数to_datetime()可以帮助我们将字符串转换成适当的日期/时间格式。

*# to explicitly convert the date column to type DATETIME*
data['Date'] = pd.to_datetime(data['Date'])
data.dtypes

我们现在将继续使用set_index()调用将该列设置为数据帧的索引。

data = data.set_index('Date')
data

如果将它与上面图 1 中的输出进行比较,您会注意到数据帧的索引不再在 0 到 4382 的范围内。取而代之的是,现在这些指数是各自收集数据的日期。

我们也可以明确地检查索引:

data.index

这里要注意一个有趣的事情是freq = None。这意味着不知道数据是按小时、天、分钟等收集的。然而,仅仅通过目测这些指数,我们可以看到这些数据似乎是按天收集的。将这些信息显式地放入数据框也是很好的,我们将很快看到如何做到这一点!但首先快速绕道…

如果我想将日期和时间都设为索引,该怎么办?

您会遇到这样的数据集,在收集数据时,日期时间被记录为单独的列。将它们设置为数据索引的一个简单而巧妙的技巧是:

  • 连接这两列,但在它们之间留一个空格。
    空间很重要!!
  • 使用to_datetime()将这个串联的列转换成时间戳。
  • 使用set_index()将该串联列设置为索引。
df['Datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'])
df = df.set_index('Datetime')

或者,您可以在读取文件时将它们设置为索引,如下所示:

pd.read_csv('xyz.csv', parse_dates = [['Date','Time']], index_col = 0)

缺失值插补

正如我们前面提到的,快速浏览一下数据表明它是以 24 小时(或一天)的间隔收集的。但是,数据反映的是freq = None。我们可以纠正如下:

data_freq = data.asfreq('D')
data_freq

注意:pandas 中可用的频率包括每小时一次(' H ')、日历每天一次(' D ')、商业每天一次(' B ')、每周一次(' W ')、每月一次(' M ')、每季度一次(' Q ')、每年一次(' A ')以及许多其他频率。

我们在上面所做的就是说“嘿,数据是以一天为间隔收集的,因此每一行都是新的一天”。所以从技术上讲,我们应该有从 2006 年到 2017 年所有天的电力消耗、太阳能生产、风力生产等的数值。

如果我们的数据中缺少某些天,上面的代码将插入空行,并且在这些行的每一行中,对应于列的值都将是NaNs.为了避免这些NaN值,我们可以告诉as.freq函数如何填充这些空值

data_freq = data.asfreq('D', method = 'ffill')
data_freq

ffill是指正向填充。这意味着当某一列为空时,它将被前一行中的值替换。举个例子:

在上表中,向前填充空值将产生以下数据帧:

这种向前填充的技术在某种程度上是有意义的——如果我们不知道今天的耗电量,我们总是可以假设它与昨天相同。

类似地,填充时间序列数据集中的缺失数据可以通过以下方式实现:

data = data.ffill().head()

请记住,对于时间序列数据,用中位数或平均值替换缺失数据并不是一个好主意。存在更好的替代方案,例如向前填充、向后填充、线性插值、最近邻居的平均值等。

最后,在修复了频率类型并输入缺失值后,查看我们的数据集,我们发现我们的数据集与以前一样(没有添加新行。我猜不管是谁做的数据收集工作都做得很出色!)

您可能想知道为什么仍然有一些空值,尤其是在数据集的开头。原因是这些已经被向前填充了,但是因为第一行的值是空的,所以我们看不出有什么不同。

重采样

重采样简单地指的是某个时间段内的数据聚合。其性能类似于 SQL 中的 group by 函数,即首先将数据拆分到时间仓中,然后在每个仓上执行一些计算。例如,给定我们的每日数据,我们可以按月或年对其进行重采样(或 bin)并生成一些相关的统计数据,如最小值、最大值或平均值。

每周重新取样

要计算电力消耗、风力和太阳能生产的周平均值:

data_columns = ['Consumption', 'Wind', 'Solar', 'Wind+Solar']
data_weekly_mean = data[data_columns].resample('W').mean() # W stands for weekly
data_weekly_mean

如果你注意到输出中的指数,你会发现它们有一周的间隔,我们有 2006 年 1 月 1 日,接着是 2006 年 1 月 8 日,等等。上面标记为 2006–01–01 的第一行包含时间框 2006–01–01 到 2006–01–07 中包含的所有数据的平均值。

每月重新取样

类似地,要计算电力消耗、风力和太阳能生产的月最大值:

data_columns = ['Consumption', 'Wind', 'Solar', 'Wind+Solar']
data_monthly_max = data[data_columns].resample('M').max() # W stands for weekly
data_monthly_max

滚动窗户

这与我们刚刚学习的重采样过程非常相似。区别在于在其上执行一些聚合功能的仓)是重叠的。

  • 每周重采样的箱:1 月 1 日-1 月 7 日;1 月 8 日至 1 月 14 日、1 月 15 日至 1 月 21 日等等
  • 每周滚动的箱柜:1 月 1 日-1 月 7 日;1 月 2 日至 1 月 8 日、1 月 3 日至 1 月 9 日等等。

要计算 7 天滚动平均值:

data_columns = ['Consumption', 'Wind', 'Solar', 'Wind+Solar']
data_7d_rol = data[data_columns].rolling(window = 7, center = True).mean()
data_7d_rol

在上面的命令中,center = True表示时间框,比如 1 月 1 日到 1 月 8 日,滚动平均值将被计算并放置在框的中心附近,即 1 月 4 日。为了更清楚,让我们检查一下上面代码的输出:

如您所见,2006 年 1 月至 2004 年的平均消费值(1361.471 英镑)是通过对 2006 年 1 月至 2006 年 1 月至 2007 年的值进行平均计算得出的。同样,2006 年 1 月至 2005 年的平均消费值(1381.300 英镑)是通过平均 2006 年 1 月至 2006 年 1 月至 2008 年的值计算出来的。

按照同样的逻辑,要计算 2006 年 1 月 1 日的平均消费值,我们需要计算 2005 年 12 月 29 日至 2006 年 1 月 4 日的平均值。但是,缺少 2005 年的数据,因此我们获得了前几行的空值。

使用滚动方法可视化数据趋势

滚动方法对于评估我们数据集中的趋势非常方便。但是首先,什么是趋势?

趋势是时间序列的平滑长期趋势。随着时间的推移,它可能会改变方向(增加或减少)。

一个增长趋势是这样的:

图 3

可视化这些趋势的一个简单方法是使用不同时间尺度的rolling方法。

让我们以年度为尺度(365 天)使用滚动平均值来查看我们的数据集中的电力消耗趋势:

data_365d_rol = data[data_columns].rolling(window = 365, center = True).mean()

让我们将我们的结果可视化,以便更好地了解趋势。我们将根据每日和 7 天滚动平均值绘制年度趋势图:

fig, ax = plt.subplots(figsize = (11,4))*# plotting daily data*
ax.plot(data['Consumption'], marker='.', markersize=2, color='0.6',linestyle='None', label='Daily')*# plotting 7-day rolling data* ax.plot(data_7d_rol['Consumption'], linewidth=2, label='7-d Rolling 
Mean')*# plotting annual rolling data*
ax.plot(data_365d_rol['Consumption'], color='0.2', linewidth=3, label='Trend (365-d Rolling Mean)')*# Beautification of plot*
ax.xaxis.set_major_locator(mdates.YearLocator())
ax.legend()
ax.set_xlabel('Year')
ax.set_ylabel('Consumption (GWh)')
ax.set_title('Trends in Electricity Consumption')

观察 365 天的滚动平均时间序列,我们可以看到,电力消费的整体年度趋势相当稳定,2009 年和 2013 年左右的消费量较低。

去趋势时间序列

有时,从我们的数据中移除趋势是有益的,特别是当趋势非常明显时(如图 3 所示),这样我们就可以评估季节变化(几分钟后会详细介绍)或时间序列中的噪声。移除趋势(或去趋势)还可以简化建模过程并提高模型性能。

有趋势的时间序列称为非平稳
没有趋势或趋势被移除的时间序列被称为平稳

去趋势时间序列用作学习算法的输入,例如 ARIMA(用于分析和预测时间序列数据的 Python 库),或者也可以用作机器学习算法的附加输入。

如何从时间序列中去除趋势?

我们可以使用一种叫做differencing的方法来消除这种趋势。这实质上意味着创建一个新的时间序列,其中
时间(t)的值=时间(t)的原始值-时间(t-1)的原始值

差分对于将你的时间序列转化为平稳的时间序列非常有帮助。

用于差分的 Python 代码

要创建时间序列的一阶差分:

*# creating the first order differencing data*
data_first_order_diff = data[data_columns].diff()

左:原始数据集;右图:数据集的差异去趋势版本

左边是原始数据集,右边是去趋势差异的版本。查看“消耗”列,我们可以看到 2006–01–02 年的值现在已从 1380.521 变为 311.337,这是通过减去 2006–01–02 年和 2006–01–01 年的消耗值获得的(1380.521–1069.184 = 311.337)。

一般来说,差分时间序列告诉我们的不是特定时间点的实际值,而是它与前一时间点的值有多少差异。这意味着当我们绘制这个差分时间序列时,这些值中的大部分将位于 x 轴的任一侧(或y=0)。

绘制不同时间序列的图像:

start, end = '2017-01', '2017-06'

fig, ax = plt.subplots(figsize=(11, 4))

ax.plot(data_first_order_diff.loc[start:end, 'Consumption'],
marker='o', markersize=4, linestyle='-', label='First Order Differencing')ax.set_ylabel('Electricity Consumption (GWh)')
ax.legend();

首先,我们没有任何趋势,所以你可能很难看出趋势是否已经消除。但你不一定要相信我的话!当您对自己的数据执行一阶差分时(如左图所示,该数据具有趋势分量),您应该能够看到类似于右图的变换:

左:非平稳时间序列(有趋势);右图:平稳时间序列(去趋势)

页(page 的缩写)s:如果一阶差分无法消除趋势,您可以使用公式进行二阶差分:
(t)时的值= t 时的原始值—2 * t-1 时的原始值+t-2 时的原始值

P.P.S .:二阶差分得到的时间序列有 N — 2 个观测值。这是因为不能为前两个观察值创建差值(没有什么可以从中减去)。

季节性(或周期性)

如果时间序列以相等的间隔重复,比如每 12 个月、每 1 周、每 4 个月等等,那么它就是周期性的。

让我们检查一下我们的时间序列是否有季节性因素。

plt.figure(figsize=(11,4), dpi= 80)
data['Consumption'].plot(linewidth = 0.5)

似乎我们的消费时间序列每 12 个月重复一次。我们可以在每年的年初和年末看到一个高峰,在仲夏月份看到一个低谷。

我们可以深入研究某一年,看看是否有任何周季节性。这里我们来看两个月的数据:2010 年 1 月和 2010 年 2 月:

data.loc['2010-01': '2010-02','Consumption'].plot(marker = 'o', figsize=(11, 9))

如你所见,周线振荡非常明显。周末的耗电量通常较低,而工作日的耗电量则相当高。

自相关

自相关是一种分析季节性的技术。它描绘了时间序列在不同时间滞后时与其自身的相关性。

很困惑吗?

通过使用教程这里的,我学到了一种理解自相关的非常直观的方法。它基本上是说,如果你把一个时间序列向前或向后移动 12 个月(滞后= 12),它会以某种方式映射到自身。自相关是判断这种映射有多好的一种方式。如果非常好,这意味着时间序列和移位的时间序列几乎相似,并且在该时间滞后处的相关性会很高。自相关的概念捕捉到了一个时间序列与其自身的这种移动版本的相关性(大声喊出雨果·鲍恩-安德森这个精彩的解释,我在这里重复了一遍)。

用 Python 绘制时间序列的自相关

plt.figure(figsize=(11,4), dpi= 80)
pd.plotting.autocorrelation_plot(data.loc['2012-01': '2013-01', 'Consumption']);

在我展示剧情之前,最好能给我一些关于如何阅读剧情的建议。在 x 轴上,你有滞后,在 y 轴上,你有时间序列在滞后时的相关程度。如果原始的消费时间序列每两天重复一次,您将会在自相关图中看到滞后 2 天的峰值。

从图中,我们可以看到在第 7 天的滞后时有一个相关性高峰,然后在第 14 天再次出现,依此类推。这意味着时间序列每 7 天重复一次,即每周一次。这种模式会在 3 个月后(大约 100 天)消失。随着你越走越远,相关性越来越小。

上面图中的虚线实际上告诉了你相关的统计意义。上升到虚线之上或下降到虚线之下的每个尖峰被认为是统计上显著的。

因此,我们可以确定消费序列是真正的自相关的,滞后一周。

注意:为了简洁,我们只绘制了时间序列数据子集的自相关图。如果我们要扩展到包括完整的数据集,自相关图看起来还是一样的。

从时间序列数据中提取重要特征

有时,提取每个时间戳(即我们数据的每一行)的月份、星期几、日期等是很重要的。由于我们已经有了日期时间格式的索引集,提取这些元素变得非常容易:

*# Extract the year, month, date separately using the index set*
data['Year'] = data.index.year
data['Month'] = data.index.month
data['Weekday_Name'] = data.index.weekday_name

我们还可以将这些附加特征作为模型的输入。但是在 Python 中的时间序列建模的第 2 部分中会有更多的介绍(希望下周)。

这些附加功能对于数据集的探索性分析也很有用。例如,我们可以画出每个月的中值功耗。

import seaborn as snsfig, axes = plt.subplots(3, 1, figsize=(11, 10), sharex=True)for name, ax in zip(['Consumption', 'Solar', 'Wind'], axes):
    sns.boxplot(data=data, x='Month', y=name, ax=ax)
    ax.set_ylabel('GWh')
    ax.set_title(name)
    *# Keep the x-axis label for only the bottom subplot*
    if ax != axes[-1]:
        ax.set_xlabel('')

希望这篇热情洋溢的时序数据介绍足以让您入门。在本文的第 2 部分中,我们将学习如何开发预测模型来预测某一天的用电量。在第三部分,我们将进行一个案例研究,分析呼叫中心产生的时间序列数据,主要是分析(可怕的)放弃率的增加。

直到下次:)

我喜欢写循序渐进的初学者指南、操作指南、面试问题、ML/AI 中使用的解码术语等。如果你想完全访问我的所有文章(以及其他媒体上的文章),那么你可以使用 我的链接**这里* 注册。*

* [## 数据科学家的 Python 高效编码指南

我每天用来编写干净代码的技巧和窍门

towardsdatascience.com](/data-scientists-guide-to-efficient-coding-in-python-670c78a7bf79) [## 了解 Python 导入,init。py 和 pythonpath —一劳永逸

了解如何导入包和模块(以及两者之间的区别)

towardsdatascience.com](/understanding-python-imports-init-py-and-pythonpath-once-and-for-all-4c5249ab6355) [## 使用 Scikit、Pandas 和 Numpy 进行时间序列建模

直观地利用季节性来提高模型准确性。

towardsdatascience.com](/time-series-modeling-using-scikit-pandas-and-numpy-682e3b8db8d1) [## 在数据科学面试中解释你的 ML 项目的逐步指南。

在结尾有一个额外的样本脚本,让你谨慎地展示你的技术技能!

towardsdatascience.com](/step-by-step-guide-to-explaining-your-ml-project-during-a-data-science-interview-81dfaaa408bf) [## 使用 Python 中的 Keras 构建人工神经网络的初学者指南

创建网络架构、训练、验证和保存模型并使用它进行推理的提示和技巧。

towardsdatascience.com](/beginners-guide-to-building-artificial-neural-networks-using-keras-in-python-bdc4989dab00)*

自动时间序列分析。R 中的 Arima

原文:https://towardsdatascience.com/time-series-analysis-with-auto-arima-in-r-2b220b20e8ab?source=collection_archive---------6-----------------------

使用自动 Arima 的 ARIMA 误差回归

随着最近一波数据分析和数据科学工具的出现,预测、预测、聚类和建模变得太容易了。使用复杂的方法强制迭代不同的模型来挑选最佳的模型,这是现在常见的做法,而且非常容易做到。就拿像 xgboostrandomforest 这样的算法来说吧,这些算法迭代数百种可能性,在几分钟内挑选出最佳结果。它们总是停留在一个点上,我们有时想当然地认为这是算法能做到的最好的结果,并且它已经为我们的预测找到了最好的解决方案。但是,为了让所有这些自动算法发挥最大能力,在将数据输入算法之前,需要考虑几个步骤。这篇文章将探讨如何利用 R 中的预测包中的 ARIMA 自动选择算法,并将提供一个操作时间序列数据并为建模和预测做好准备的建议性指南。

ARIMA 组件的简要说明:

ARIMA 是自动回归(AR)综合(I)移动平均(MA)的缩写,表示 ARIMA 模型有三个组成部分。我将在这篇文章中非常简要地介绍这些组件,如果你需要更深入地理解这些概念,我建议你使用这些 资源,它们可以从免费获得

ARIMA 模型可以用两种形式表示:非季节性模型,其中模型以(p,d,q)的形式显示订单,其中:

p =自回归模型的阶数

d =差分的阶数

q =移动平均线的阶数

自回归模型(AR):

自回归模型类似于回归模型,但在这种情况下,回归变量是具有特定滞后的同一个因变量。

差异(一):

为了让 ARIMA 发挥最佳性能,它需要数据保持稳定。这意味着平均值和方差在整个集合中是恒定的。差分用于转换数据,使其保持不变。

移动平均线(MA):

移动平均线广泛应用于时间序列分析,是一个已经广为人知的概念。它包括获取特定滞后的一系列点的平均值,可以表示为:

来源:【https://otexts.com/fpp2/moving-averages.html】

其中 m = 2k +1,

k =所用点前后平均值中使用的值的数量,以及

t =计算趋势周期的时间。

在 ARIMA,使用移动平均模型

季节性 ARIMA 款(SARIMA):

这些模型考虑到了数据的季节性,并在季节性模式上执行相同的 ARIMA 步骤。因此,如果数据每个季度都有一个季节性模式,那么 SARIMA 将得到所有点的(P,D,Q)顺序和每个季度的(P,D,Q)顺序。

带有 ARIMA 误差的回归模型:

现在真正的交易开始了。ARIMA 模型非常适合利用历史数据盲目预测未来。但是,有时候我们不需要盲目预测,有时候我们有变量可以帮助我们预测未来的行为。回归模型在这种情况下是理想的。

那就让我们客观地看待这件事吧。假设您有带有季节模式的时间序列数据,该数据具有可用作回归变量的属性。这里有一个例子:以 FRED 记录的从 1999 年第四季度到 2019 年 Q1 期间的电子商务总销售额和美国零售总额的季度数据为例,我们看到电子商务数据比美国零售总额先被汇总和报告,因此让我们使用电子商务数据作为回归变量,美国零售总额作为因变量来预测 2019 年 Q2 的美国零售销售额。

现在让我们比较两个数据集。通过计算每个季度的增长百分比,我们可以将数据标准化并比较它们的行为。这看起来是这样的:

资料来源:数据摘自 https://fred.stlouisfed.org/tags/series?美联储经济数据网站 1999 年第四季度至 2019 年 Q2 ( )同期数据 t =季度% 3br 交易+交易)。

如你所见,两组数据之间有明显的滞后,但这种滞后似乎是一致的。这是使用带有 ARIMA 误差的回归模型的完美场景,因为它包含了这种方法的两个优点:包含趋势的大量季节性数据和提供与因变量一致相关性的回归变量。在这种情况下,R 中预测包的 auto.arima 允许我们相对容易地实现这种类型的模型。这是我们的指南真正开始的地方。

首先,我们让 auto.arima 完成它的工作,为我们的数据选择最佳模型。然后,我们使用默认参数拟合 auto.arima 模型。该模型旨在使用零售变量作为回归变量来预测 2018 年第二季度和 2019 年第二季度之间美国的总销售额。

#Fitting an auto.arima model in R using the Forecast packagefit_basic1<- auto.arima(trainUS,xreg=trainREG_TS)
forecast_1<-forecast(fit_basic1,xreg = testREG_TS)

使用零售销售数据作为回归变量来预测美国总销售额,拟合 ARIMA 误差的回归模型的结果。

现在我们来看看模型的残差。残差将告诉我们模型是否能够捕捉数据提供的所有信息。

一个故事的三个图表:1)残差的时间序列图,2)前 20 个滞后的 ACF 图,3)残差的分布。

似乎模型在残差中留下了信息。第一个也是最后一个图表向我们展示了残差看起来并不是白噪声,而是在它们之间有一些相关性,第二个图表证实了这一点。前 12 个滞后超过由自相关函数建立的阈值。让我们通过以下 4 个步骤调整我们的模型来解决这个问题:

1。STL 分解:

Auto.arima 能够决定用于训练模型的数据是否需要季节差异。然而,有时数据可能无法清楚地表达其行为,auto.arima 需要在正确的方向上推动才能理解它。这就是 STL 分解派上用场的地方。STL 作为一个附加过程工作,其中数据被分解成趋势、季节性和余数,并且数据的每个组成部分可以被分开进行分析。

通过将数据分解成这三个部分,我们能够通过测量每个部分的强度来衡量它在整个数据中的权重。因此,例如,我们可以测量数据的季节性强度,并使用以下公式获得分数:

来源:https://otexts.com/fpp2/seasonal-strength.html

高于 0.64 的季节性强度一直被视为强劲,是我用来决定数据是否具有足够季节性强度的阈值。更多关于这个的可以在这里找到

使用这个阈值,我们可以告诉 auto.arima 何时开始研究季节性模型。下面是一个使用我们零售数据的例子:

使用 STL 分解,我们可以测量数据的季节性和趋势部分的强度。

正如您在所提供的表格中看到的,数据具有很高的季节性。因此,如果我们知道 ARIMA 必须是季节性的,那么让我们告诉 auto.arima 从哪里开始。

auto.arima 函数具有 arima 函数每一阶的参数,这些参数由它们在(P,D,q) (P,D,Q)表示中的值来表示。因此,让我们用季节模式的一阶差分来强制 auto.arima 迭代 arima 模型。我们可以通过将参数 D=1 指定为 auto.arima 函数的参数之一来实现这一点。

注意:在大多数情况下,auto.arima 能够做到这一点,而无需任何规范,因为它使用 u-test 来决定是否使用 SARIMA 模型,但在某些情况下,尤其是在可用数据有限且季节性不明显的情况下,该函数可能需要我们的帮助。这在使用 auto.arima 对具有不同特征的多个数据集进行预测时非常有用,通过测量季节性强度,我们可以指定 auto.arima 函数从何处开始查找。

2。近似值:

下一个参数是近似参数。这个非常简单,但是有很大的不同。auto.arima 挑选最佳模型的方法是拟合几个模型并计算其 AICc 得分。得分最低的模型获胜。但是,为了使函数能够更快地找到解决方案,算法会跳过一些步骤并逼近结果,以便拟合更少的模型。这在包含大量数据的数据集上很有用,但会牺牲性能以提高速度。将此参数更改为 FALSE 会使 auto.arima 更加努力地寻找正确的解决方案。

3。λ:

更好地理解数据和处理异常值或大范围数据的一种方法是转换数据。对于时间序列,go to 变换技术是 Box Cox 变换。Box Cox 转换有助于确定基于 lambda 转换数据的最佳方式。

这里的 Lambda 用于表示为数据选择最佳转换的数字。数据的最佳变换是使数据最接近正态分布的变换。

公式 为一盒考克斯变换。如果值不为 0,则使用幂变换,如果值为 0,则使用对数变换。

在 R 中,这个简单的步骤可以帮助您为数据选择理想的λ:

Lambda<- BoxCox.lambda(trainUS)

然后我们的 auto.arima 函数让我们指定 lambda 的值作为它的一个参数。

auto.arima(trainUS, xreg = trainREG_TS,D=1, approximation = FALSE, **lambda = Lambda**)

4。均值和漂移:

这两种其他方法允许将常数添加到模型中,并允许考虑更复杂的模型。下面简单介绍一下这两者。

漂移:仅当差值大于 0 时可用,并允许拟合具有变化平均值的模型。

平均值:允许考虑具有非零平均值的模型。

默认情况下,R 将它们设置为 FALSE,再次选择速度而不是性能。将这些参数设置为 TRUE 允许模型更努力地工作,但是要小心过度拟合。

决赛成绩

好了,现在我们知道了:

  1. 最初的 auto.arima 模型在残差中留下了大量信息。
  2. auto.arima 可以通过调整几个参数来更好地工作。
  3. 并且可以转换数据以避免数据中的趋势影响最终结果。

让我们试着用所有学到的信息重新调整我们的数据,看看我们会得到什么:

#Fitting the model with the new parametersfit_complex1<- auto.arima(trainUS,xreg=trainREG_TS,D=1,approximation = F,allowdrift = T,allowmean = T,lambda = Lambda)forecast_complex1<-forecast(fit_complex1,xreg = testREG_TS)checkresiduals(fit_complex1)

现在很明显,这个模型能够从数据中获取更多的信息,从而产生更好的结果。

accuracy(f = forecast_complex1,x = testUS)

使用零售销售数据作为回归变量来预测美国总销售额和新参数,拟合 ARIMA 误差的回归模型的结果。

要记住的事情:

有几件事需要记住。

  • 时间序列数据具有连续性和相关性,任何缺失值都会严重影响您的模型。
  • SARIMA 模型在处理高度季节性的数据时非常有效,但是对于线性或高度非结构化的时间序列数据,有更好的方法。在这些情况下,像 FB Prophet、树模型或神经网络这样的方法可以比 SARIMA 执行得更好。
  • 你的模型的输出和你的输入一样好。只有当变量之间存在明显的相关性时,在 ARIMA 模型中加入回归变量才有意义。
  • ARIMA 模型中的残差反映了模型的性能,在对其进行评估时应予以考虑。函数 检查残差ACFPACF 便于跟踪您的模型在残差中留下的信息。

**本文使用的代码可在此处获得

熊猫的时间序列分析

原文:https://towardsdatascience.com/time-series-analysis-with-pandas-e6281a5fcda0?source=collection_archive---------8-----------------------

如何处理和操作时间序列数据

图源

时间序列数据有许多定义,所有这些定义都以不同的方式表示相同的含义。一个直截了当的定义是,时间序列数据包括附加到连续时间戳的数据点。时间序列数据的来源是周期性的测量或观察。我们观察很多行业的时间序列数据。仅举几个例子:

  • 一段时间内的股票价格
  • 每日、每周、每月销售额
  • 过程中的定期测量
  • 一段时间内的电力或天然气消耗率

机器学习的进步增加了时间序列数据的价值。公司将机器学习应用于时间序列数据,以做出明智的商业决策,进行预测,比较季节性或周期性趋势。欧洲粒子物理研究所的大型强子对撞机(LHC)通过对亚原子粒子的测量产生了大量的时间序列数据。所以,它无处不在。处理好时间序列数据对于这类领域的数据分析过程至关重要。Pandas 是由 Wes Mckinney 创建的,旨在提供一个高效灵活的工具来处理财务数据。因此,对时间序列数据进行处理是一个非常好的选择。

熊猫时间序列数据

时间序列数据可以是特定日期、持续时间或固定定义间隔的形式。

时间戳可以是一天中的日期,也可以是给定日期中的纳秒,具体取决于精度。例如,“2020–01–01 14:59:30”是一个基于秒的时间戳。

Pandas 提供灵活高效的数据结构来处理各种时间序列数据。下表显示了基本的时间序列数据结构及其相应的索引表示:

对于任何题目,学好基础是根本。休息可以通过练习来积累。让我们探索熊猫的时间序列数据功能。像往常一样,我们首先导入库:

最基本的时间序列数据结构是时间戳,可以使用 to_datetimeTimestamp 函数创建:

在现实生活中,我们几乎总是处理连续的时间序列数据,而不是单个的日期。Pandas 也使得处理时序数据变得非常简单。例如,如果我们将多个日期传递给 to_datetime 函数,它会创建一个 DatetimeIndex ,它基本上是一个日期数组。

我们不必遵循特定的格式来输入日期。to_datetime 将不同格式的日期转换为标准格式。通过传递单个日期的列表来创建时间索引似乎不太方便。当然,还有其他方法来创建时间索引。

我们可以使用 date 和 to_timedelta 函数创建日期索引:

“2020–02–01”作为起点,to_timedelta 创建一个具有指定时间增量的序列。在上面的例子中,“D”用于表示“日”,但还有许多其他选项可用。你可以点击查看整个列表

我们也可以使用 date_range 函数从头创建时间索引:

  • 使用开始和结束日期

  • 使用开始或结束日期和周期数(默认为“开始”)

默认频率是“天”,但有许多选项可用。

注:“M”表示一个月的最后一天,而“MS”代表“月初”。

我们甚至可以从默认频率中推导出频率:

Pandas 还提供了 period_rangetime delta _ range函数来分别创建 PeriodIndex 和 TimedeltaIndex:

我们已经学习了如何创建时间序列数据,但是熊猫还可以对时间序列数据进行许多其他操作。我还将介绍移位重采样滚动时间序列数据。

移位时间序列数据

时间序列数据分析可能需要移动数据点来进行比较。移位t 移位功能及时移位数据。

  • 移位:移位数据
  • tshift:移动时间索引

shift 和 tshift 之间的区别可以用可视化来更好地解释。让我们首先用时间序列数据创建一个样本数据框架:

然后,我们可以在同一张图上绘制原始数据和移位数据,以查看差异:

订单:原始数据,班次,t 班次

重采样

时间序列数据的另一个常见操作是重采样。根据任务的不同,我们可能需要以更高或更低的频率对数据进行重新采样。熊猫很好地处理了这两种操作。重采样可以通过重采样asfreq 方法完成。

  • asfreq 返回指定间隔结束时的值
  • 重采样创建指定内部的组(或箱),并允许您对组进行聚合

用例子会更清楚。让我们首先创建一年的时间序列数据。

asfreq('M') 返回每月最后一天的值。我们可以通过检查 1 月底的值来确认:

resample('M') 创建月份的箱,但我们需要应用聚合函数来获取值。让我们来计算每月的平均值。我们还可以通过比较一月份的平均值来确认结果:

滚动

滚动是对时间序列数据非常有用的操作。滚动意味着创建一个指定大小的滚动窗口,并对该窗口中的数据执行计算,当然,该窗口会滚动数据。下图解释了滚动的概念。

值得注意的是,计算是在整个窗口都在数据中时开始的。换句话说,如果窗口的大小为三,则第一次聚合在第三行完成。让我们对我们创建的数据帧应用大小为 3 的滚动:

关于时间序列分析的更多信息

如果你想了解更多关于时间序列分析的知识,这里有一个我的相关帖子列表:

结论

预测分析在数据科学领域非常有价值,时间序列数据是预测分析旨在解决的许多问题的核心。因此,如果你打算在预测分析领域工作,你肯定应该学习如何处理时间序列数据。

感谢您的阅读。如果您有任何反馈,请告诉我。

我关于数据操作和分析的其他帖子

参考文献

用 Prophet 进行时间序列分析:航空乘客数据

原文:https://towardsdatascience.com/time-series-analysis-with-prophet-air-passenger-data-6f29c7989681?source=collection_archive---------24-----------------------

使用 Prophet 进行时间序列分析

来源:图片由 Free-Photos 来自 Pixabay

Prophet 是脸书开发的一个预测模型,它通过对季节性、假期和变点等因素进行特殊调整来预测时间序列。

让我们通过构建一个预测航空乘客数量的 Prophet 模型来进一步研究这个问题。

背景

数据集来源于旧金山国际机场关于航空公司月度客运量统计的报告,该报告可从 data.world(原始来源:旧金山开放数据)获得,如下文参考资料部分所示。

具体来说,对航空公司荷航 (enplaned)调整后的乘客人数进行过滤,作为从 2005 年 5 月到 2016 年 3 月期间的时间序列进行分析。

来源:Jupyter 笔记本输出

正如我们所看到的,时间序列显示了一个相当稳定的模式(其中有一个恒定的均值,方差和自相关。

我们不会在这里正式测试这种情况,但同样明显的是,数据集中似乎存在显著的季节性——即在特定时间间隔发生的时间序列趋势的显著变化。

从时间序列的视觉检查来看,似乎这种转变大约每八个月左右发生一次。

模型结构

记住这一点,让我们开始构建预测模型。

第一步是正确格式化数据,以便使用 Prophet。

train_dataset= pd.DataFrame()
train_dataset['ds'] = train_df['Date']
train_dataset['y']= train_df['Adjusted Passenger Count']
train_dataset.head(115)

来源:Jupyter 笔记本输出

以下是将用作测试集的数据帧(我们试图预测的时间序列的一部分),时间间隔定义为每月:

future= prophet_basic.make_future_dataframe(periods=14, freq='M')
future.tail(15)

来源:Jupyter 笔记本输出

我们首先定义一个模型如下:

prophet_basic = Prophet()
prophet_basic.fit(train_dataset)

这是一个预测图:

forecast=prophet_basic.predict(future)
fig1 =prophet_basic.plot(forecast)

来源:Jupyter 笔记本输出

以下是预测的组成部分:

fig1 = prophet_basic.plot_components(forecast)

一些观察结果:

  • 我们可以看到,从 2007 年到 2009 年,这一趋势有显著增长,此后乘客人数趋于平稳。
  • 我们还观察到,乘客数量似乎在大约 5-9 月份达到最高,之后我们会看到今年剩余时间乘客数量的下降。

请注意,我们直观地观察到季节性似乎出现在数据集中。然而,考虑到我们正在处理一个月度数据集——在这种情况下,我们不会使用 Prophet 来明确地模拟季节性。

这有两个原因:

  1. 如果我们使用每日数据,对季节性的检测会更准确——但我们没有这样做。
  2. 在这种情况下,假设年度季节性可能不是特别准确。检查数据集显示,虽然某些季节变化每年都会发生,但其他季节变化每 6 到 8 个月就会发生一次。因此,在这种情况下,在模型中明确定义季节性参数可能弊大于利。

变革点

转折点代表时间序列中的重大结构转变。

例如,新冠肺炎疫情爆发后航空乘客数量的大幅下降,将代表着数据中的重大结构性转变。

例如,当适当的参数设置为 4 时,这是模型上显示的变化点。

pro_change= Prophet(n_changepoints=4)
forecast = pro_change.fit(train_dataset).predict(future)
fig= pro_change.plot(forecast);
a = add_changepoints_to_plot(fig.gca(), pro_change, forecast)

来源:Jupyter 笔记本输出

我们看到,模型中显示的重大转折点出现在 2007 年至 2009 年之间。

有趣的是,虽然 2009 年的乘客数量确实出现了显著下降,但平均而言,这一时期的乘客数量仍高于 2005 年至 2007 年,这表明航空旅行的总体需求(至少对于从旧金山出发的荷航航班而言)在近十年内实际上有所增长。

模型验证

现在,预测模型已经建立,预测的乘客数量与测试集进行比较,以确定模型的准确性。

将变点设置为 4 ,我们获得以下误差指标:

  • 均方根误差:524
  • 平均预测误差:71

来源:Jupyter 笔记本输出

平均每月 8,799 名乘客(与该数字相比,误差非常低),表明该模型在预测每月乘客人数方面表现良好。

然而,重要的是要注意,模型精度受到变点参数的显著影响。

让我们看看当变点被修改时,RMSE 会发生什么。

来源:作者的计算

我们可以看到,随着更多变点的引入,RMSE 急剧下降——但是 RMSE 在 4 变点处最小化。

结论

在本例中,您看到了:

  • 如何使用 Prophet 进行时间序列预测
  • 如何使用 Prophet 分析趋势和季节性波动
  • 变点在确定模型准确性中的重要性

希望你发现这有用,并感谢任何想法或反馈!

免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。

参考

时间序列分析与理论、图表和代码第 1 部分

原文:https://towardsdatascience.com/time-series-analysis-with-theory-plots-and-code-part-1-dd3ea417d8c4?source=collection_archive---------2-----------------------

A .先有理论

1。 什么是时间序列?

时间序列 是以固定的时间间隔记录的一系列观测值。

根据观测频率的不同,时间序列通常可以是每小时、每天、每周、每月、每季度和每年。有时,你可能也有秒和分钟的时间序列,比如,每分钟的点击量和用户访问量,等等。

大多数问题使用时间序列数据。任何随时间顺序观察到的事物都是时间序列。

时间序列数据的示例包括:

  • 每日股票价格
  • 每月海水温度
  • 公司的季度销售额
  • 公司年度利润

时间序列分析包括了解序列固有性质的各个方面,以便您更好地了解信息,从而创建有意义且准确的预测。

时间序列分析是开发序列的预测之前的准备步骤。你对数据了解得越多,预测就越准确。

2。预测任务的基本步骤

  1. 问题定义。这通常是预测中最困难的部分。仔细定义问题需要了解预测的使用方式,谁需要预测,以及预测功能如何适应需要预测的组织。一个预报员需要花时间和每个参与收集数据、维护数据库和使用预测进行未来规划的人交谈。
  2. 收集信息。至少需要两种信息:(1)统计数据,和(2)收集数据和使用预测的人积累的专业知识。通常,很难获得足够的历史数据来拟合一个好的统计模型。偶尔,由于预测系统的结构变化,旧数据会变得不太有用;那么我们可以选择只使用最新的数据。然而,请记住,一个好的统计模型将处理系统中的进化变化;不要不必要地丢弃好的数据。
  3. 探索性分析。总是从绘制数据开始。有一致的模式吗?有显著的趋势吗?季节性重要吗?有商业周期存在的证据吗?数据中有没有异常值需要有专家知识的人来解释?可供分析的变量之间的关系有多强?已经开发了各种工具来帮助进行这种分析。
  4. 选择和拟合模型。要使用的最佳模型取决于历史数据的可用性、预测变量和任何解释变量之间的关系强度,以及预测的使用方式。比较两个或三个潜在模型是很常见的。每个模型本身都是基于一组假设(显式和隐式)的人工构造,通常涉及一个或多个必须使用已知历史数据进行估计的参数。
  5. 使用和评估预测模型。一旦选择了模型并估计了其参数,就可以使用该模型进行预测。只有在预测期的数据可用后,才能正确评估模型的性能。已经开发了许多方法来帮助评估预测的准确性。在使用和实施预测方面也存在组织问题。

3。时间序列图形

首先要做的是导入数据。它们通常是. csv 格式。它们可以有一列显示日期,多列显示测量值。当有多个样本时,数据集可以有一个 sample_id 列,对于每个唯一的 id,日期将重复。这种格式称为面板数据

在任何数据分析任务中,接下来要做的事情是绘制数据。图表使数据的许多特征可视化,包括模式、异常观察、随时间的变化以及变量之间的关系。在数据图中看到的特征必须尽可能地结合到要使用的预测方法中。正如数据类型决定了使用什么样的预测方法一样,它也决定了什么样的图表是合适的。

从图中我们可以观察到几个时间序列模式:

  • 趋势。当数据长期增加或减少时,趋势存在。它不必是线性的。当趋势可能从上升趋势变为下降趋势时,有时趋势被称为“改变方向”。
  • 季节性。当时间序列受季节性因素(如一年中的某个时间或一周中的某一天)影响时,会出现季节性模式。季节性总是有一个固定和已知的频率。
  • 循环往复。当数据呈现非固定频率的上升和下降时,出现一个周期。如果模式不是基于固定日历的频率,那么它是循环的。因为与季节性不同,周期性效应通常会受到业务和其他社会经济因素的影响。

  1. 每月的房屋销售(左上)显示了每年内强烈的季节性,以及一些大约 6-10 年的强烈周期性行为。这段时间的数据没有明显的趋势。
  2. 美国国债合约(右上)显示了 1981 年芝加哥市场连续 100 个交易日的结果。这里没有季节性,但有明显的下降趋势。可能,如果我们有一个更长的序列,我们会看到这种下降趋势实际上是一个长周期的一部分,但当只在 100 天内观察时,它似乎是一种趋势。
  3. 澳大利亚季度发电量(左下)显示出强劲的增长趋势,具有很强的季节性。这里没有任何循环行为的证据。
  4. 谷歌收盘价(右下角)的每日变化没有趋势、季节性或周期性行为。有些随机波动似乎不太容易预测,也没有强有力的模式来帮助开发预测模型。

B.让我们编码、绘图和学习

导入库

导入数据

前 5 个条目

数据是每月的,有两个变量。一个用于海面温度,一个用于海面盐度。

1。时间图

对于时间序列数据,首先明显的图形是时间图。也就是说,观察值是相对于观察时间绘制的,连续的观察值用直线连接。

在这些图中我们可以看到:

  • 奇怪的值,比如离群值和需要解释的值,因为它们不同于季节性或趋势。
  • 缺失观察值的时间段
  • 数据的波动。例如,盐度波动在 2008 年有所增加。
  • 趋势季节性周期性行为。例如,温度具有很强的季节性,没有趋势或循环行为。

在缺少观察值的情况下,我们可以用各种方法来填充它们,例如:

  • 反向填充
  • 线性内插法
  • 二次插值法
  • 最近邻居的平均值
  • 季节性对应平均值

月度数据显示每年都有一定的季节性。没有循环行为,也没有趋势。

2。季节性地块

季节图类似于时间图,只是数据是根据观察数据的单个“季节”绘制的。每个季节的数据是重叠的。

季节性剧情中我们可以瞬间看到:

  • 更清楚的季节模式,如果它存在的话。
  • 确定模式变化的年份。
  • 识别大的跳跃或下降。

趋势和季节性曲线图中我们可以看到:

  • 趋势和季节性更加明显。例如,虽然我们可以说盐度在以前的地块中有季节性,但现在更明显的是它有季节性。
  • 有异常值的年份或月份。
  • 比较年份或月份更容易。

3。季节性子系列图

另一种强调季节模式的绘图是将每个季节的数据收集在单独的迷你时间绘图中。

它执行 groupby 以更清楚地查看季节性月份。

4。时间序列组件

时间序列数据可以表现出多种模式,将时间序列分成几个部分通常是有帮助的,每个部分代表一个基本的模式类别。当我们将一个时间序列分解成组件时,我们通常将趋势和周期组合成一个单一的趋势-周期组件(有时为了简单起见,称为趋势)。因此,我们认为时间序列由三部分组成:趋势周期部分、季节部分和余数部分(包含时间序列中的任何其他部分)。

如果我们假设一个加法分解,那么我们可以写

,其中 yₜ是数据,Sₜ是季节分量,Tₜ是趋势周期分量,Rₜ是余数分量,所有这些都在周期 t 内。或者,乘法分解可以写成

如果季节性波动的幅度或围绕趋势周期的变化不随时间序列的水平而变化,则加法分解是最合适的。换句话说,当趋势看起来更加线性,季节性和趋势成分看起来在一段时间内保持不变时,我们应用加性模型。当季节模式的变化或趋势周期的变化似乎与时间序列的水平成比例时,乘法分解更为合适。换句话说,当我们以非线性速率增加(或减少)时,乘法模型更合适。乘法分解在经济时间序列中很常见。这个分解叫做 ETS 分解(误差/趋势/季节性)。

将所有这些数字绘制在一起,可以让我们立即深入了解这些数据。

我希望这篇文章在你穿越时间和系列的旅程的开始(或者没有)对你有所帮助。

继续第 2 部分学习平稳性、自相关、滞后散点图、简单移动平均线、指数加权移动平均线、双重和三重指数平滑。

参考:非常感谢精彩的 udemy 课程对时间序列分析的介绍!

时间序列分析与理论、图表和代码第 2 部分

原文:https://towardsdatascience.com/time-series-analysis-with-theory-plots-and-code-part-2-c72b447da634?source=collection_archive---------32-----------------------

在第一部分中,我们看了:

  • 什么是时间序列
  • 预测任务的基本步骤
  • 时间序列图形,包括时间图、季节图和季节子序列图
  • 时间序列成分和分解。

一切都伴随着理论和代码。

在第 2 部分,我们将继续我们的旅程:

  • 平稳性
  • 自相关
  • 滞后散点图
  • 简单移动平均线
  • 指数加权移动平均
  • 双重和三重指数平滑

让我们先看一下我们的数据集的第一行。

海面温度和盐度的月数据。

1.平稳性

平稳时间序列的性质不依赖于序列被观察的时间。因此,具有趋势或季节性的时间序列并不是平稳的 —趋势和季节性会影响时间序列在不同时间的值。另一方面,白噪声序列是稳定的——当你观察它时,这并不重要,它在任何时间点看起来都应该差不多。

具有周期行为(但没有趋势或季节性)的时间序列是平稳的。这是因为周期不是固定长度的,所以在我们观察序列之前,我们不能确定周期的波峰和波谷在哪里。也就是说,序列的统计属性(如平均值、方差和自相关性)是恒定的。

大多数统计预测方法都是针对平稳的时间序列而设计的。预测过程的第一步通常是进行一些转换,将非平稳序列转换为平稳序列。预测平稳序列相对容易,预测结果也更可靠。

我们知道,如果预测值(X 个变量)彼此不相关,线性回归效果最好。因此,平稳化序列解决了这个问题,因为它消除了任何持久的自相关,从而使预测模型中的预测因子(序列的滞后)几乎独立。

为了使成为一个时间序列静止我们可以:

  • 将序列差分一次或多次(用当前值减去下一个值)
  • 取序列的对数(有助于稳定时间序列的方差。)
  • 以 nₜₕ根为例
  • 以上各项的组合

但是首先,为了测试时间序列是否平稳,我们可以:

  • 看时间图。
  • 将序列分成两部分,并计算描述性统计数据。如果它们不同,那么它就不是静止的。
  • 执行被称为单位根检验的统计检验,如增广迪基富勒检验 (ADF 检验)、科维亚特科夫斯基-菲利普斯-施密特-申-KPSS 检验(趋势平稳)和飞利浦佩龙检验(PP 检验)。

最常用的是 ADF 因此,如果 ADF 检验中的 P 值小于显著性水平(0.05),您拒绝零假设,序列是平稳的。

这将输出:

ADF 测试统计的输出。

数列是平稳的。然而,p 值=0.04967,我们可以应用差异来查看其效果。

为了使数列看起来稳定,需要三阶差分。

2.自相关

正如相关性测量两个变量之间线性关系的程度一样,自相关测量一个时间序列的滞后值之间的线性关系,例如 yₜ和 yₜ₋₁.之间的线性关系如果一个序列是显著自相关的,这意味着该序列以前的值(滞后)可能有助于预测当前值。

部分自相关在去除影响两个变量的其他变量的影响后,测量一个变量的线性相关性。也就是说,滞后 k 处的部分自相关是未被滞后 1 至k1 考虑在内的 y ₜ和 y ₜ+yₜ₊ₖ之间的自相关。我们本质上绘制出前一天/前一个月的残差与当天的真实值之间的关系。一般来说,我们预计偏相关会很快下降。

60 个月的自相关和偏相关(海表温度)。

对于自相关,y 轴是值与其滞后时间之间的相关值。滞后在 x 轴上。零滞后的相关性为 1,因为它与自身完全相关。该图显示了 6ₜₕ和 12ₜₕ月份以及之前和之后月份的高度自相关性。

3.滞后散点图

探索每个观察值和该观察值的滞后之间的关系的一种有用的图称为散点图。

Pandas 对此有一个内置的函数,叫做滞后图。它在 x 轴上绘制了时间 t 时的观察值,在 y 轴上绘制了 lag1 观察值(t-1)。

  • 如果这些点沿着从图的左下角到右上角的对角线聚集,这表明正相关关系。
  • 如果这些点沿着从左上到右下的对角线聚集,这表明负相关关系。
  • 这两种关系都很好,因为它们可以被建模。
  • 越靠近对角线的点表示关系越强,越远离对角线的点表示关系越弱。
  • 中间有一个球或分布在图中表明关系很弱或没有关系。

4.移动平均数

移动平均是对时间 t 的趋势周期的估计,通过对 t 的 k 个周期内的时间序列值进行平均来获得。时间上接近的观测值也可能在数值上接近。因此,平均值消除了数据中的一些随机性,留下了平滑的趋势周期成分。

基本的 SMA 有一些弱点:

  • 较小的窗口会导致更多的噪音,而不是信号。
  • 它将总是滞后于窗口的大小。
  • 由于求平均值,它将永远不会达到数据的最大峰值或谷值。
  • 它并不真正告诉你未来可能的行为,它真正做的只是描述你的数据的趋势。
  • 极端的历史值会显著扭曲 SMA。

窗口=3 的初始数据和简单移动平均。

简单移动平均线有一个变种叫做指数加权移动平均线 (EWMA)。

它将允许我们减少来自 SMA 的滞后效应,并且它将把更多的权重放在最近发生的值上(通过将更多的权重应用到最近发生的值,因此得名)。应用于最近值的权重量将取决于 EWMA 中使用的实际参数和给定窗口大小的周期数。

初始数据、简单移动平均和简单指数平滑

5.双重和三重指数平滑

简单指数平滑仅使用一个平滑因子α (alpha),双指数平滑添加了第二个平滑因子 β (beta),用于处理数据趋势。与 alpha 因子一样,beta 因子的值介于零和一之间(0 < β ≤10 < β≤1)。这里的好处是,模型可以预测未来的增长或下降,而水平模型只能根据最近的计算来工作。

我们还可以处理趋势中不同类型的变化(增长/衰退)。如果时间序列显示直线倾斜趋势,您可以使用加法调整。如果时间序列显示指数(曲线)趋势,您可以使用乘法调整。

三重指数平滑,与 Holt-Winters 关系最密切的方法,增加了对数据中趋势和季节性的支持。

初始数据,双重和三重指数平滑。

就是这样!感谢您的阅读,下次见!

参考资料:

自动取款机现金需求预测:时间序列回归模型

原文:https://towardsdatascience.com/time-series-and-regression-methods-for-forecasting-atms-filling-in-cc6d5f7dde1e?source=collection_archive---------12-----------------------

机器学习在 ATM 取现需求预测

使用时间序列和回归模型进行需求预测

作者图片

自动取款机中的烟灰需求需要准确的预测,这与其他自动售货机没有什么不同。唯一的区别是现金产品需要在一段时间内补充。如果预测是错误的,它会导致大量的成本。在高预测和高未使用的情况下,ATM 中存储的现金会给银行带来成本。银行根据其与货币运输公司的政策支付不同的重新填充费用。银行通常为重新填充支付大量的固定费用,为安全运输安排支付额外的额外费用。

一些银行可能会在自动取款机中储存比实际需求多 40%的现金,而且银行可能在全国范围内拥有数千台自动取款机。因此,业务运营的小优化将有助于高收益。

业务用例

自动柜员机不应装满大量现金,这可能会带来低运输/物流成本,但高冷冻和高保险成本。另一方面,如果银行没有适当的机制来跟踪使用模式,那么频繁地重新填充 ATM 将降低冻结和保险成本,但会增加物流成本。

我们的目标

很明显,每天的现金提取量是时间序列。因此,在这个典型的现金需求预测模型中,我们将展示时间序列和回归机器学习模型,以解决上述用例的问题。我们将针对单个自动柜员机(也可以将一组自动柜员机作为单个自动柜员机处理)的需求,为给定的数据集开发一个模型。

我们必须记住,从 ATM 机提取现金不仅仅是时间相关的。可能存在季节性,例如:1)人们倾向于在周末的周五或 2)月底领工资时取款,或 3)在每个月的 7-10 日之间,一些人会领养老金。因此,开发 ATM 网络现金需求预测模型是一项具有挑战性的任务。此外,每台 ATM 的时序现金需求随时间波动,并且经常与用户的非平稳行为叠加。

数据加载

我们有 2011 年到 2017 年的每日交易数据。实际取款(total _ amount _ extracted)包括从自动柜员机提取实际金额的所有交易。这些交易实际上反映在 ATM 机的可用余额中。

为了简单起见,我们在这里没有进行任何数据挖掘活动。建议进行广泛的挖掘工作,从数据中提取隐藏的信息。此外,建议消除可能导致多重共线性问题的不重要要素。

模拟每日现金需求

我们将尝试拟合几个时间序列模型,并为我们的数据找到最佳拟合模型,这将允许预测未来的需求。有很多机器学习模型可供选择,决定从哪里开始可能会令人生畏。一般来说,从简单的、可解释的模型(如线性回归)开始是一个好主意,如果性能不够好,就转向更复杂但通常更精确的方法。因此,受到塞尔维亚银行的[案例分析](http://Broda, P., Levajković, T., Kresoja, M., Marčeta, M., Mena, H., Nikolić, M., & Stojančević, T. (2014). Optimization of ATM filling-in with cash.) 的启发,其中时间序列分析和线性模型被用于获得每个 ATM* 的每日现金需求预测,我们选择从一个简单的线性模型开始我们的用例。*

我们在这里的特征中既有数字变量也有分类变量。观察箱线图,我们没有观察到分类变量对现金提取的任何显著影响。

*plt.figure(figsize=(14,6))
plt.subplot(1,2,1)
data['total_amount_withdrawn'].hist(bins=50)
plt.title('Total amount withdrawan')
plt.subplot(1,2,2)
stats.probplot(data['total_amount_withdrawn'], plot=plt);
data['total_amount_withdrawn'].describe().T.round()*

我们可以从直方图中看到,中心在 60 附近。数据集中的大多数值(提取的总金额)接近 60 万,而更远的值(14 万)很少,这也符合我们的心理模型。分布大致对称,提取的值落在大约 100 和 100,000 之间,这可以从图表上方所示的统计汇总中得到验证。

OneHotEncoding

下面的代码片段将数字特征分开,选择分类特征并对这些特征使用一键编码,然后将两个集合连接在一起。这听起来像是复杂的工作,但却相对简单明了。

*# Copy the original data
features = df.copy()# Select the numeric columns
numeric_subset = df[['trans_date_set','trans_month','trans_year','prevweek_mean', 'total_amount_withdrawn']]# Select the categorical columns
# dropped atm_name
categorical_subset = df[['weekday','festival_religion', working_day',  'holiday_sequence']]# One hot encoding
categorical_subset = pd.get_dummies(categorical_subset)# Join the two dataframes using concat
features = pd.concat([numeric_subset, categorical_subset], axis = 1)*

OHE 之后,我们有 27 列(特征)的 2244 个观察值。

通常测试集的大小范围是数据的 25- 35 %,尽管没有关于大小的硬性规定。我们必须记住,随着训练数据集规模的缩小,训练模型的性能会下降。从训练集中提取太多数据可能会对最终性能造成不利影响。

*X = features.copy().drop(columns = ['total_amount_withdrawn', 'trans_date_set', 'trans_month','trans_year', 'working_day_H', 'working_day_W'])
y = features['total_amount_withdrawn'].copy()Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, shuffle= False, test_size = 0.2, random_state = 42)
print('length of Xtrain and Xtest: ', len(Xtrain), len(Xtest))
print('length of ytrain and ytest: ', len(ytrain), len(ytest))*

线性回归

我们考虑了一个线性模型的形式:

其中 αi 为数据中待估计模型的参数, hi 为现金需求历史的不同统计。该模型针对特定日期 d 进行评估。值 li 是元参数,控制统计 hi 的计算,如所考虑的历史长度。

我们总是可以使用训练数据来拟合最小最大缩放器,然后在预测之前将该缩放器应用于测试数据。此外,可以测试线性模型附加正则化参数。

*linear = LinearRegression()
linear.fit(Xtrain, ytrain)# make predictions
lin_pred = linear.predict(Xtest)# Prediction vs Actual
linpred = pd.DataFrame(lin_pred[-10:]) # predicting last 10 values
linpred.rename(columns = {0: 'lin_predicted'}, inplace=True) # renaming the column
linpred = linpred.round(decimals=0) # rounding the decimal values
d = pd.DataFrame(data['total_amount_withdrawn']).tail(10) # calling last 10 values of original amt wothdrawn
linpred.index = d.index # mapping the index of both dataframe
linok = pd.concat([linpred, d], axis=1)
linok['accuracy'] = round(linok.apply(lambda row: row.lin_predicted /row.total_amount_withdrawn *100, axis = 1),2)
linok['accuracy'] = pd.Series(["{0:.2f}%".format(val) for val in linok['accuracy']],index = linok.index)
linok = linok.assign(day_of_week = lambda x: x.index.day_name())*

**

我们在这里看到,线性回归预测平均超过 100%。

XGBoost 回归

虽然我在这里扩展了 ohe 的使用,但是在实践中应该小心谨慎。

虽然基于回归的模型,我们通常使用 ohe 特征,但我们应该小心使用决策树算法。理论上,决策树能够处理分类数据。然而,它的 scikit-learn 实现仍然要求所有特征都是数字的。一种可能的解决方案是使用不同种类的编码(标签/目标编码)或处理分类特征的实现,如 h2o 库中的随机森林。

**

下面,我们绘制了预测值和实际值,以及这些值的组合,以获得更好的可视性。与 LinReg 相比,XGBoost 模型做得相当好,并且使用默认参数,与 LinReg 的大约 50%相比,平均应计率超过 90%。

变量重要性图如下所示:

*shap_values = shap.TreeExplainer(xgb).shap_values(Xtest)
shap.summary_plot(shap_values, Xtest, plot_type="bar")*

轻型 GBM

LightGBM 通过整数编码的分类特征提供了良好的准确性。它通常比一位热编码执行得更好。

*X = df.iloc[:, 2:10].copy()
y = df.iloc[:, 10].values# Transform categorical features into the appropriate type that is expected by LightGBM
for c in X.columns:
col_type = X[c].dtype
if col_type == 'object' or col_type.name == 'category':
X[c] = X[c].astype('category')# Splitting the dataset into the Training set and Test set
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle= False, test_size = 0.2, random_state = 42)
print('length of X_train and X_test: ', len(X_train), len(X_test))
print('length of y_train and y_test: ', len(y_train), len(y_test))*

我们的平均预测在这里是相当准确的。虽然这个模型漏掉了一些日子,但是平均来说,这个预测比 XG 模型要好。

**

CatBoost

像 LGB 一样,CatBoost 也显示了几乎相似预测结果。

**

观察 LightGBM 和 CatBoost 如何从训练集中决定重要的特征总是很有趣的。但是,我将在另一篇文章中讨论这个问题。

对比分析

企业可能会有兴趣看到最终的表格报告。根据这里观察到的结果,选择 Catboost 或 LightGBM 建模方法进行进一步优化是可行的。

我们上面的练习是为了举例说明。在机器学习练习中,有三个更广泛的部分:(1)数据提取和挖掘,这有助于确定特征(这通常需要大约 60-70%),(2)确定和拟合包括超参数优化的模型(这通常需要 10-15%),(3)准确性度量和测试需要 10-15%的时间)。因此,我们看到第一阶段对于机器学习生命周期的成功至关重要。

这里,我们分析了一台特定的自动柜员机。对于多台柜员机,可以使用聚类方式进行现金需求预测,这带来了额外的优势:

  1. 提高了现金需求预测的准确性,这是因为在预测具有类似的一周中现金提取季节性模式的 ATM 中心组的 ATM 每日现金需求时,计算复杂性降低了,
  2. 运营成本的潜在巨大节约,因为类似的现金补充模式可用于属于同一集群的 ATM 中心。

结论

LightGBM 和 CatBoost 在没有对给定数据集进行任何优化的情况下表现出了良好的预测能力。然而,有相当多的金融机构和使用案例可用于简单的线性回归或复杂的神经网络。作为一名分析顾问,当我们解决一个业务问题时,我们想到的第一个问题是我们能否使用线性规划(LP)来解决。考虑到 LP 更快的处理时间和清晰的可见性,它在商业中非常受欢迎。甚至 LP 也可以用来一次解决多个目标。

在这里,自动柜员机提款预测的关键是捕获和处理历史数据,以洞察未来。然而,现金需求天生具有高方差和非平稳的随机过程,这会影响许多方法的可靠性。此外,对现金的需求不仅受时间的影响,而且它遵循不同的趋势,这使得建模更加困难。比如节假日如何影响 ATM 的使用,取决于柜员所在的位置。根据取款金额和取款交易次数,可根据需求(如高、中、低)将多台 ATM 分为几大类。集群级别的补充计划可以为在类似地理区域运行的 ATM 节省大量运营成本。

我可以到达 这里

参考:

  1. 加雷斯,詹姆斯;丹妮拉·威滕;哈斯蒂,特雷弗;罗伯特·蒂布拉尼(2015)。统计学习导论。纽约:施普林格

基于“异常化”库的时间序列异常检测

原文:https://towardsdatascience.com/time-series-anomaly-detection-with-anomalize-library-67472003c003?source=collection_archive---------23-----------------------

时间序列异常检测的 3 个简单步骤

照片由 Samantha GadesUnsplash 上拍摄

时间序列数据具有广泛的应用案例,从跟踪关键绩效指标(KPI)和了解业务趋势到高级建模和预测。异常检测就是这样一种有用的应用。信用卡欺诈检测等业务应用需要强大的技术,这些技术可以将时间序列数据作为输入,并实时识别异常情况。

异常检测是一个经过充分研究的领域,有许多可用的工具和技术。有很多用于异常检测的 R 包,例如tsoutlierAnomalyDetection.,但是,我最近开始相信[anomalize](https://cran.r-project.org/web/packages/anomalize/index.html)是最直观、最易于使用的库——对于新手和高级数据科学家都是如此。

所以今天这篇文章的目的是用三个简单的步骤来演示anomalize异常检测库的实现。

让我们开始吧。

步骤 1:安装库并准备数据

就像任何其他机器学习算法一样,准备数据可能是异常检测中最重要的一步。但是从积极的方面来看,您可能一次只使用一列。因此,与其他机器学习技术中的数百个特征不同,您可以只关注用于建模的一列。

确保您完成了通常的数据清理和准备程序,例如处理丢失的值等。一个重要的步骤是确保数据集最终在一个tibletbl_time 对象中。

让我们首先安装我们将需要的库:

# install libraries
library(anomalize)
library(tidyverse)
library(tibbletime)
library(tidyquant)

对于这个演示,我们运气不错,不需要数据处理。我们将使用tidyquant库获取股票价格数据。

# fetch data
data <- tq_get('AAPL',
               from = "2019-09-01",
               to = "2020-02-28",
               get = "stock.prices")# take a peek
head(data)

第二步:执行anomalize

首先,让我们用刚刚获取的数据实现anomalize,然后讨论发生了什么。

# anomalize 
anomalized <- data %>% 
  time_decompose(close) %>%
  anomalize(remainder) %>%
  time_recompose()

这里很少发生什么事情,库接收输入数据并对其应用三个独立的函数。

首先,time_decompose()函数将时间序列数据的“收盘”列分解为“观察”、“季节”、“趋势”和“余数”分量。

其次,anomalize()函数对“余数”列执行异常检测,并在 3 列中给出输出:“余数 _l1”、“余数 _l2”和“异常”。这里的最后一列是我们想要的,如果观察结果是异常的,那么它是“是”,对于正常的数据点,它是“否”。

异常实现的输出

最后一个函数time_recompose()通过重新组合之前创建的“trend”和“season”列,将所有内容重新整理好。

步骤 3:绘制异常数据

实际上,我们的异常检测已经在前一步完成了。但是我们仍然需要将数据和异常现象可视化。让我们这样做,并直观地检查出异常值。

# plot data with anomalies
anomalized %>%
  plot_anomalies(time_recomposed = TRUE, ncol = 3, alpha_dots = 0.25) + labs(title = "AAPL Anomalies")

这个图非常直观。每个点是数据集中观察到的数据点,红色圆圈是模型识别的异常。阴影区域是余数的上限和下限。

下一步是什么?

如果到目前为止,您已经通过三个简单的步骤成功地实现了复杂的异常检测技术。这很简单,因为我们使用了默认参数,没有做任何改变。正如我们在上图中看到的,这个开箱即用模型在检测异常值方面表现得非常好。但是,您可能会遇到复杂的时间序列数据,这需要通过在步骤 2 中调整参数来提高模型性能。您可以阅读模型文档快速入门指南来了解参数、它们的作用以及如何&何时改变它们。

如果你喜欢这篇文章,你可以在 Twitter 或 LinkedIn 上关注我。

基于“真实世界”数据的时间序列异常检测

原文:https://towardsdatascience.com/time-series-anomaly-detection-with-real-world-data-984c12a71acb?source=collection_archive---------22-----------------------

图片来自这里

时间序列异常检测是一个非常困难的问题,尤其是在处理“真实世界”数据时。为了说明我所说的“真实世界”数据的含义,让我们假设你正在与多个客户合作,每个客户都在进行不同的纵向研究。客户希望您在研究进行过程中帮助他们检测数据中的异常,以便他们有可能修复这些异常并提高数据收集质量。你可能已经知道这是一个多么困难的问题。首先,不像你可能在 Kaggle 竞赛中看到的那样,数据可能没有被标记(也就是说,你实际上不知道什么是异常,什么不是),这实际上很常见!也许客户端没有资源来创建带标签的数据集。第二,在这种情况下,每个客户端都运行不同的研究,很可能每个客户端的数据集中都有不同的要素,不允许一个模型用于所有客户端。第三,纵向研究通常运行起来非常昂贵,因此,每个客户的数据集可能相对较小。最后,由于这些研究都还在进行中,可能会有很多“缺失数据”在这种情况下,我所说的缺失数据是指不同的受试者将处于研究的不同阶段,其中一些受试者可能只完成了两次随访,而另一些受试者可能已经完全完成了研究。

简而言之,在这个例子中,有很多东西对我们不利:我们有(1)未标记的数据,(2)具有不同特征的数据集,(3)小数据集,以及(4)具有大量缺失数据的数据集。对于许多数据科学家来说,这听起来像是一场噩梦!但是我们仍然有办法在数据中发现价值并发现异常。在这里,我简单介绍一下我最近使用的一种方法,我发现这种方法可以拾取合理的信号。不幸的是,目前,我不能公布这个项目的细节,但我希望你也尝试这个方法,让我知道它是如何工作的。

该方法

我最近成了隔离森林的忠实粉丝。隔离森林是一种集成学习方法,是随机森林的近亲。与随机林类似,隔离林使用决策树,您可以在其中对功能进行决策拆分。随机林和隔离林的最大区别在于,在隔离林中,拆分是随机的。通常所做的是隔离林选择随机特征并在特征中进行随机分割,直到所有数据点都被隔离;这个过程要用你想要的任意多的树进行几次。我们假设如果一个数据点需要很多分裂才能隔离,那么它不是异常的(下图左图),但是如果一个数据点需要很少的分裂,那么它就是异常的(下图右图)。隔离林的输出是异常分数,它指示数据点被认为有多异常。从这个算法的描述中你可能可以看出,这是一种无监督的异常检测方法,这对于我们来说是必要的,因为我们没有标记的数据。这是一个非常简单的方法,但是效果相当好!此外,隔离林包含在 scikit-learn 中,因此相对容易实现。

图来自原创隔离林纸

好吧,听起来隔离森林解决了我们很多问题,对吧?没有。我们仍然有“缺失数据”的问题让我们回到目前仍在进行的纵向研究,我们在研究中的不同点有受试者。你可能知道,大多数机器学习算法都不能包含缺失数据,所以处理缺失数据的一个常用方法是用中位数来估算缺失值(或者为分类数据创建一个新的类别)。这在许多情况下可能很好,但是在我们的例子中,假设有许多受试者仍然处于研究的早期,那该怎么办呢?对于这些受试者,我们可以用他们尚未完成的访问的中值来估算缺失值,并在我们的数据集上运行隔离森林。然而,如果你这样做,你可能会注意到完成很少访问的受试者从未出现异常,这仅仅是因为我们通过用中位数来估算缺失值,使他们看起来更正常。这可不好!我们希望检测任何受试者中可能出现的异常,无论他们是在研究的早期还是已经完成了研究。

那么我们能做什么呢?这个问题有一个相对简单的解决方案。我们对完成每次访问的受试者运行单独的隔离森林。例如,假设一项研究有五个受试者。受试者 1、3 和 5 已经完成了六次就诊,而受试者 2 和 4 只完成了前三次就诊。我们要做的是使用受试者 1、3 和 5 的所有六次访问的数据运行隔离林,并输出异常分数。然后,对于受试者 2 和 4,我们仅使用前三次就诊的数据,并且也包括来自其他受试者的数据(仅来自前三次就诊的数据),但是我们仅输出受试者 2 和 4 的异常分数。这种方法极大地减少了我们需要用中值估算缺失值的数据点的数量,因此,允许所有数据点潜在地被认为是异常的。太好了!

模型解释

如果你读过我的前一篇博文,你就会知道我热衷于模型解释。理解驱动预测的特征对于解决业务问题通常至关重要。例如,回到纵向研究的例子,如果你发现一个受试者是异常的,你可能会想知道为什么他们是异常的,如果可能的话,试图解决导致他们异常的任何问题。那么我们如何解释一个隔离森林模型呢?这种方法非常类似于我在之前的博文中讨论的特性重要性分析方法。首先,我们正常运行隔离林并输出异常分数——这些是基线异常分数。然后,我们选取一个特征,调整其值,在隔离林中重新运行数据集,并输出异常分数。我们对数据集中的每个要素执行此过程。然后,将每个混洗特征的异常分数与基线分数进行比较。我们可以推断,如果异常分数有很大的变化,那么这是检测异常的一个重要特征。这甚至可以在单个受试者的水平上进行检查,其中我们可以检查来自单个受试者的异常分数的变化。非常简单,我发现给出了一个合理的输出!

结论

好了,你知道了。我承认这种方法并不完美,而且有许多替代方法,但是我想分享一种我发现相当有效的方法。非常欢迎反馈和替代想法!

基于 TensorFlow 2 和 Keras 的人体活动识别时间序列分类

原文:https://towardsdatascience.com/time-series-classification-for-human-activity-recognition-with-lstms-using-tensorflow-2-and-keras-b816431afdff?source=collection_archive---------7-----------------------

了解如何使用 Python 中的 Keras 和 TensorFlow 2 从加速度计数据中对人类活动进行分类

图片由 Fitsum Admasu 提供

TL;DR 了解如何使用 Keras 中的 LSTMs 对来自加速度计传感器的时间序列数据进行分类

可以使用时间序列数据从加速度计数据中识别用户活动吗?你的手机/腕带/手表已经在做了。你能做得多好?

我们将使用从多个用户处收集的加速度计数据来构建一个双向 LSTM 模型,并尝试对用户活动进行分类。您可以在任何具有加速度计的设备(几乎是所有智能设备)上部署/重用经过训练的模型。

计划是这样的:

  • 加载人员活动识别数据
  • 为分类建立 LSTM 模型
  • 评估模型

在浏览器中运行完整的笔记本

GitHub 上的完整项目

[## 用 Python 进行机器学习的黑客指南

这本书给你带来了机器学习的基础,使用工具和技术来解决现实世界…

leanpub.com](https://leanpub.com/Hackers-Guide-to-Machine-Learning-with-Python)

人类活动数据

我们的数据是通过受控的实验室条件收集的。它是由无线传感器数据挖掘实验室提供的。

论文中使用的数据:使用手机加速度计的活动识别。看看这篇文章,感受一下一些基线模型的表现。

加载数据

让我们下载数据:

!gdown --id 152sWECukjvLerrVG2NUO8gtMFg83RKCF --output WISDM_ar_latest.tar.gz 
!tar -xvf WISDM_ar_latest.tar.gz

原始文件缺少列名。另外,其中一列有一个多余的“;”在每个值之后。让我们来解决这个问题:

(1098203, 6)

该数据具有以下特征:

  • user_id -执行活动的用户的唯一标识符
  • activity -当前活动的类别
  • x_axisy_axisz_axis -每个轴的加速度计数据

我们能从数据中学到什么?

探测

我们有六个不同的类别。让我们看看他们的分布:

散步和慢跑严重过剩。您可以应用一些技术来平衡数据集。

我们有多个用户。每个用户有多少数据?

大多数用户(除了最后 3 个)都有相当多的记录。

不同类型的活动是什么样子的?让我们看看前 200 条记录:

坐着很好,很放松。慢跑怎么样?

这看起来更有弹性。很好,可以通过观察数据对活动类型进行分离/分类(至少对于这两种活动的样本)。

我们需要找出一种方法,将数据转换成序列,以及每个序列的类别。

预处理

我们需要做的第一件事是将数据分成训练数据集和测试数据集。我们将使用来自 id 低于或等于 30 的用户的数据。其余的将用于培训:

接下来,我们将缩放加速度计数据值:

请注意,我们仅在训练数据上拟合缩放器。我们如何创建序列?我们将稍微修改一下create_dataset函数:

我们通过使用序列中所有类别的模式来选择标签(类别)。也就是说,给定一个长度为time_steps的序列,我们将它归类为最常出现的类别。

以下是创建序列的方法:

让我们看看新序列的形状:

(22454, 200, 3) (22454, 1)

我们已经大大减少了训练和测试数据的数量。让我们希望我们的模型仍然能够学到一些有用的东西。

最后一个预处理步骤是类别编码:

完成预处理!我们的模型在识别用户活动方面会有多好?

人类活动分类

我们将从一个简单的双向 LSTM 模型开始。你可以试着增加复杂度。请注意,该模型的训练速度相对较慢:

实际的训练过程很简单(记住不要乱来):

我们的模型有多好?

估价

培训过程如下:

你当然可以提出一个更好的模型/超参数并加以改进。它能多好地预测测试数据?

[0.3619675412960649, 0.8790064]

~88% 准确率。对于一个又快又脏的模特来说还不错。让我们来看看混淆矩阵:

我们的模型混淆了楼上和楼下的活动。这是意料之中的。此外,在开发真实世界的应用程序时,您可能会将这两者合并,并将其视为一个类/类别。回想一下,我们的数据集中也存在着严重的不平衡。

结论

你做到了!您已经建立了一个模型,它可以从 200 条加速度计数据记录中识别活动。你的模型在测试数据上达到了 ~88% 的准确率。以下是您采取的步骤:

  • 加载人员活动识别数据
  • 为分类建立 LSTM 模型
  • 评估模型

您学习了如何构建双向 LSTM 模型并对时间序列数据进行分类。接下来还有更多关于 LSTMs 和时间序列的有趣内容:)

在浏览器中运行完整的笔记本

GitHub 上的完整项目

参考

[## 用 Python 进行机器学习的黑客指南

这本书给你带来了机器学习的基础,使用工具和技术来解决现实世界…

leanpub.com](https://leanpub.com/Hackers-Guide-to-Machine-Learning-with-Python)

原载于https://www.curiousily.com

基于深度学习的时间序列分类

原文:https://towardsdatascience.com/time-series-classification-with-deep-learning-d238f0147d6f?source=collection_archive---------2-----------------------

用于时间序列分类的最重要的深度学习算法的架构和实现细节的概述

图片来自https://www . pexels . com/it-it/foto/borsa-commercio-cres cita-dati-159888/

为什么要进行时间序列分类?

首先,重要的是要强调为什么这个问题在今天如此重要,以及为什么理解深度学习在这个领域的作用和潜力是非常有趣的。

近年来,时间序列分类已经成为数据科学中最具挑战性的问题之一。这是因为任何使用数据的分类问题,只要考虑到某种排序的概念,都可以被视为时间序列分类问题。

时间序列存在于许多现实世界的应用中,包括医疗保健、人类活动识别、网络安全、金融、营销、自动疾病检测、异常检测等。近年来,随着时态数据可用性的显著提高,许多领域对基于时间序列的应用产生了浓厚的兴趣,并提出了许多新的算法。

除了基于深度学习的算法之外,所有这些算法在执行分类之前都需要某种特征工程作为单独的任务,这可能意味着一些信息的丢失和开发时间的增加。相反,深度学习模型已经在内部纳入了这种特征工程,对其进行了优化,并消除了手动操作的需要。因此,他们能够以更快、更直接、更完整的方式从时间序列中提取信息。

应用程序

我们来看看时间序列分类的一些重要应用。

心电图记录可用于发现各种心脏问题,并以时间序列形式保存。区分正常心脏的心电图和患有疾病的心脏的心电图,并识别疾病,是一个时间序列分类问题。

如今,许多设备都可以通过简单的手势来控制,而无需物理接触。为此,这些设备记录一系列图像,用于解释用户的手势。从这个图像序列中识别正确的手势是一个时间序列
分类问题。异常检测是对与大多数数据明显不同的异常事件或观察结果的识别。

通常,异常检测中的数据是时间序列,例如与电子设备相关的量值的时间趋势,被监控以检查设备是否正常工作。区分正常操作的时间序列和有一些异常的设备的时间序列,并识别异常,是一个时间序列分类问题。

问题定义

现在我们给出一个时间序列分类问题的正式定义。假设有一组具有相同结构的对象(例如相同大小的实数值、向量或矩阵等)。),以及不同类的固定集合。我们将数据集定义为一组对(对象,类),这意味着每个对象都与一个确定的类相关联。给定一个数据集,分类问题是建立一个与新对象相关联的模型,该新对象具有与其他对象相同的结构,根据与每个类相关联的对象的特征,建立属于可能的类的概率。

单变量时间序列是实值的有序集合,而 M 维多元时间序列是由 M 个长度相同的不同单变量时间序列组成。时间序列分类问题是数据集的对象是单变量或多变量时间序列的分类问题。

感知器(神经元)

在介绍不同类型的深度学习架构之前,我们回忆一下它们使用的一些基本结构。首先,我们介绍感知器,这是许多机器学习算法的基本元素。它受到生物神经回路功能的启发,因此也被称为神经元。

此图显示了感知器的架构。感知器有一个或多个输入值,每个输入值都与一个权重相关联。

作者图片

感知器的目标是计算输入值的加权和,然后对结果应用激活函数。最常见的激活函数是 sigmoid、双曲线正切和 rectifier:

作者图片

激活函数的结果被称为感知器的激活,并代表其输出值。

多层感知器

现在我们介绍多层感知器(MLP),它是许多深度学习架构中用于时间序列分类的构建模块。它是一类前馈神经网络,由几层节点组成:一个输入层、一个或多个隐藏层和一个输出层。每个节点都连接到其所在层、前一层和下一层的所有节点。为此,我们说多层感知器是完全连接的。隐藏层和输出层的每个节点都是一个感知器。

作者图片

多层感知器的输出是通过依次计算其感知器的激活而获得的,连接输入和输出的函数取决于权值。

多层感知器分类

多层感知器通常用于分类问题:给定一个数据集(我们记得它是对(对象,类别)的集合),它可以计算任何新对象属于每个可能类别的概率。为此,首先我们需要以更合适的方式表示数据集中的对(对象、类):

  • 每个对象必须被展平,然后用一个向量表示,这将是训练的输入向量。
  • 数据集中的每个类都必须用其独热标签向量来表示。独热标签向量是大小等于数据集中不同类的数量的向量。数组的每个元素对应一个可能的类,除了与所代表的类相关的值外,每个值都是 0 ,即 1 。独热标签向量将是训练的目标。在此图中,我们可以看到一个简单的热标签向量示例:在原始数据集中,列类有三个不同的值,具有一个热标签向量的数据集有三列,每个类一列。

作者图片

这样,我们获得了一个新的数据集对(输入向量,目标),我们为训练做好了准备。在这个过程中,MLP 使用了一种称为反向传播的监督学习技术,它对数据集的输入向量进行迭代:

  • 在每次迭代中,使用当前输入向量计算 Mlp 的输出。
  • 输出是一个向量,其分量是属于每个类别的估计概率。
  • 使用成本函数计算模型的预测误差。
  • 然后,使用梯度下降,在反向传递中更新权重以传播误差。

因此,通过迭代地向前传递,然后反向传播,以最小化训练数据损失的方式更新模型的权重。在训练之后,当多层感知器的输入是对应于具有给定结构的对象的向量(也不存在于数据集中)时,输出是其分量是属于每个类别的估计概率的向量。

现在,自然的问题是:为什么不使用多层感知器进行时间序列分类,把整个多元时间序列作为输入?答案是,多层感知器和许多其他机器学习算法一样,对于时间序列分类来说效果不佳,因为时间序列的长度确实会影响计算速度。因此,为了获得时间序列分类的良好结果,有必要提取输入时间序列的相关特征,并将它们用作分类算法的输入,以便在非常低的计算时间内获得更好的结果。

深度学习算法相对于其他算法的一大优势是,这些相关特征是在训练期间学习的,而不是手工制作的。这极大地提高了结果的准确性,并大大缩短了数据准备时间。然后,在许多层用于提取这些相关特征之后,许多深度学习架构可以使用像 MLP 这样的算法来获得所需的分类。

时间序列分类的深度学习

作者图片

该图显示了用于时间序列分类的通用深度学习框架。它是实现非线性功能的几个层的组合。输入是一个多元时间序列。每一层都将前一层的输出作为输入,并应用其非线性变换来计算自己的输出。

这些非线性变换的行为由每层的一组参数控制。这些参数将层的输入链接到其输出,并且是可训练的(像多层感知器的权重)。通常,最后一层是多层感知器或岭回归器。

本文提出了 3 种不同的时间序列分类深度学习架构:

  • 卷积神经网络,这是用于时间序列分类问题的最经典和最常用的架构
  • 初始时间,这是一种基于卷积神经网络的新架构
  • 回声状态网络,这是另一种基于递归神经网络的最新架构

卷积神经网络

卷积神经网络是一种深度学习算法,它将图像或多变量时间序列作为输入,能够通过应用程序可训练的过滤器成功捕获空间和时间模式,并使用可训练的权重为这些模式分配重要性。与其他分类算法相比,卷积神经网络中所需的预处理要低得多。虽然在许多方法中滤波器是手工设计的,但是卷积神经网络具有学习这些滤波器的能力。

作者图片

如图所示,卷积神经网络由三个不同的层组成:

  • 卷积层
  • 汇集层
  • 全连接层

通常,在完全连接层之前交替几个卷积层和池层。

回旋层

卷积运算之所以得名于回旋神经网络,是因为它是这类网络的基本构造块。它对输入的一系列特征映射与一个滤波器矩阵执行一次卷积,以获得一系列不同的特征映射作为输出,目的是提取高级特征。

卷积由一组滤波器定义,它们是固定大小的矩阵。当对具有相同大小的输入要素图的子矩阵应用过滤器时,结果由过滤器的每个元素与子矩阵的相同位置的元素的乘积之和给出(我们可以在此图中看到这一点)。

作者形象

一个输入要素图和一个过滤器之间的卷积结果是在输入要素图的宽度和高度上应用过滤器获得的有序要素图,如图所示。

作者形象

卷积层执行每个滤波器和每个输入特征映射之间的卷积,获得一系列特征映射作为输出。如已经强调的,过滤器的值被认为是可训练权重,然后在训练期间被学习。

必须为卷积层选择的两个重要参数是步长填充

跨步

Stride 控制过滤器如何围绕一个输入要素图进行卷积。特别是,stride 的值表示一次必须移动多少个单位,如图所示。

作者形象

填充

填充指示在应用卷积过滤器之前,要在输入要素图外部添加多少额外的列和行,如图所示。新列和新行的所有单元都有一个伪值,通常为 0。

作者形象

之所以使用填充,是因为当对输入要素图应用卷积滤波器时,其大小会减小。然后,经过应用许多过滤器的大小可以变得太小。增加额外的行和列,我们可以保留原来的大小,或使其减少较慢。

当在应用卷积滤波器之后获得的特征图的大小小于输入特征图的大小时,我们将该操作称为有效填充(Valid Padding)。当输出大小等于或大于输入大小时,我们将此操作称为“相同填充”。

汇集层

池操作的目的是实现要素地图的降维,尽可能多地保留信息。这对于提取旋转和位置不变的主要特征也是有用的。其输入是一系列特征地图,其输出是具有较低维度的一系列不同的特征地图。

池化应用于每个输入要素地图的宽度和高度上固定大小的滑动窗口。有两种类型的池:最大池和平均池。正如我们在图中看到的,对于每个滑动窗口,池操作的结果是其最大值或平均值,分别用于最大池或平均池。

作者图片

最大池也作为噪音抑制剂,完全丢弃嘈杂的激活。因此,它的性能通常比平均池要好。对于混合层,还必须指定步幅和填充。

池操作的优点是对卷积输出频带进行下采样,从而减少隐藏激活的可变性。

全连通层

全连接层的目标是学习卷积层和汇集层的输出所表示的高级特征的非线性组合。通常全连接层是用多层感知器实现的。

经过几次卷积和合并操作后,原始时间序列由一系列特征图表示。所有这些特征图被展平成列向量,这是原始输入多元时间序列的最终表示。扁平列连接到多层感知器,其输出具有与时间序列的可能类别数量相等的神经元数量。

反向传播应用于训练的每次迭代。在一系列时期内,由于其主要的高级特征,该模型能够区分输入时间序列并对其进行分类。

超参数

对于卷积神经网络,神经网络有许多超参数要指定。最重要的如下:

  • 卷积滤波器数量- 显然太少的滤波器无法提取足够的特征来实现分类。然而,当滤波器已经足以表示相关特征时,更多的滤波器是无能为力的,并且使得训练在计算上更加昂贵。
  • 卷积滤波器大小和初始值 -较小的滤波器收集尽可能多的局部信息,较大的滤波器代表更多的全局、高级和代表性信息。过滤器通常用随机值初始化。
  • 池化方法和大小 -如前所述,有两种类型的池化:最大池化和平均池化,最大池化通常表现更好,因为它也可以作为噪声抑制。汇集大小也是要优化的一个重要参数,因为如果汇集大小增加,维度减少得更多,但丢失的信息更多。
  • 权重初始化 -权重通常用小随机数初始化,以防止死神经元,但也不能太小,以避免零梯度。均匀分布通常效果很好。
  • 激活函数 -激活函数将非线性引入模型。通常选择整流器、sigmoid 或双曲线正切。
  • 时期数 -时期数是整个训练集通过模型的次数。如果计算性能允许,这个数字应该增加,直到测试误差和训练误差之间有一个小的间隙。

履行

使用 Keras 构建卷积神经网络非常容易。Keras 是一个简单易用但功能强大的 Python 深度学习库。在 Keras 中构建卷积神经网络只需几个步骤:

  • 首先声明一个顺序类;每个 Keras 模型都是使用 Sequential 类构建的,它表示层的线性堆栈,或者使用 model 类,它更灵活。由于 CNN 是层的线性堆栈,我们可以使用更简单的顺序类;
  • 在顺序类中添加所需的卷积、最大池和密集 Keras 层;
  • 指定卷积层的过滤器数量和过滤器大小;
  • 指定池层的池大小。

为了编制模型,Keras 需要更多信息,即:

  • 输入形状(一旦输入形状被指定,Keras 自动推断后面层的输入形状);
  • 优化器(例如随机梯度下降或 Adagrad);
  • 损失函数(例如均方误差或平均绝对百分比误差);
  • 指标列表(例如准确度)。

在 Keras 中训练模型实际上只包括调用函数 fit() 指定所需的参数,即:

  • 训练数据(输入数据和标签),
  • 要训练的时期数(整个数据集的迭代次数),
  • 验证数据,在训练过程中使用它来定期测量网络相对于以前未见过的数据的性能。

使用训练好的模型进行预测很容易:我们将一个输入数组传递给函数 predict() ,它返回一个输出数组。

初始时间

最近推出了一种叫做初始时间的深度卷积神经网络。这种网络具有很高的精度和很好的可扩展性。

初始网络架构

初始网络的架构类似于卷积神经网络的架构,不同之处在于卷积层和汇集层被初始模块取代。

作者图片

如图所示,初始网络由一系列初始模块组成,之后是一个全局平均池层和一个全连接层(通常是一个多层感知器)。此外,每三个初始模块添加一个剩余连接。每个残差块的输入通过快捷的线性连接进行传输,以添加到下一个块的输入,从而通过允许梯度的直接流动来缓解消失梯度问题。

初始模块

初始网络的主要构件是初始模块,如图所示。

作者图片

它由 4 层组成:

  • 第一层是瓶颈层,它降低了输入的维度。这也减少了计算成本和参数数量,加快了训练速度,提高了泛化能力。
  • Inception 模块的第二个主要组件是一组不同大小的并行卷积层,作用于相同的输入特征映射。例如,在该图中,有三种不同的卷积,过滤器尺寸为 10、20 和 40。
  • 第三层是最大池,它引入了对小扰动不变的模型的能力。
  • 第四和最后一层是深度级联层,其中每个独立并行卷积和最大池的输出被级联以形成当前初始模块的输出多元时间序列。

通过堆叠多个初始模块并经由反向传播训练滤波器的值,由于使用不同大小的滤波器,网络能够提取多个分辨率的潜在分层特征。这是 Inception 模块的巨大优势,因为它允许内部层挑选和选择与学习所需信息相关的过滤器大小。这对于识别在不同输入要素地图上可能具有不同大小的高级要素非常有帮助。

感受野

理解初始网络的关键参数是它的感受野。与全连接网络不同,初始网络中的神经元仅依赖于输入特征图的一个区域。这个区域被称为神经元的感受野。显然,底层神经元所依赖的区域比顶层神经元要小。然后,底层神经元被期望捕捉时间序列的局部结构,而顶层神经元被期望识别更复杂的模式。

对于时间序列数据,初始网络的总感受野由该公式定义,其仅取决于滤波器的长度 k_i 和网络的深度 d (即初始模块的数量):

研究初始网络的准确性如何随着感受野的变化而变化是非常有趣的。为了改变感受野,我们可以改变过滤器的长度或网络的深度。

大多数情况下,需要更长的过滤器来产生更精确的结果。这是因为较长的过滤器比较短的过滤器能够以更高的概率捕获较长的模式。相反,通过增加更多层来增加感受野并不一定会提高网络的性能,尤其是对于训练集较小的数据集。因此,为了提高精度,通常最好增加过滤器的长度,而不是增加更多的层。

初始时间架构

许多实验已经表明,单个初始网络有时在准确性上表现出很大的差异。这可能是因为随机权重初始化所带来的可变性。

为了克服这种不稳定性,通常初始时间被实现为许多初始网络的集合,并且每个预测具有相同的权重。以这种方式,该算法提高了他的稳定性,并且显示出已经提到的高准确性和非常好的可扩展性。

特别地,不同的实验表明,它的时间复杂度随着训练集大小和时间序列长度线性增长,这是一个非常好的结果,因为许多其他算法相对于相同的幅度平方增长。

履行

《盗梦空间》的完整实现可以在 GitHub(https://github.com/hfawaz/InceptionTime)上找到。实现是用 Python 写的,使用 Keras。该实现基于 3 个主要文件:

  • 文件 main.py 包含运行实验所需的代码;
  • 文件 inception.py 包含了 inception 网络实现;
  • 文件 nne.py 包含了集合一组初始网络的代码。

特别是,实现使用已经提到的 Keras 模块类,因为 InceptionTime 的一些层并行工作,不像卷积神经网络使用顺序类,因为它们的层都是串行的。

实现初始模块构建块的代码与针对卷积神经网络描述的代码非常相似,因为它使用 Keras 层进行卷积和最大池化,因此它可以很容易地用于或包含在基于 Keras 的代码中,以便实现定制的架构。

递归神经网络

回声状态网络是一种递归神经网络,因此对它们做一个小的介绍可能是有用的。递归神经网络是组织成连续层的神经元样节点的网络,具有类似于标准神经网络的架构。事实上,像在标准神经网络中一样,神经元被分为输入层、隐藏层和输出层。神经元之间的每个连接都有相应的可训练权重。

不同之处在于,在这种情况下,每个神经元都被分配到一个固定的时间步长。隐藏层中的神经元也在依赖于时间的方向上被转发,这意味着它们中的每一个都仅与具有相同分配时间步长的隐藏层中的神经元完全连接,并且与分配给下一个时间步长的每一个神经元单向连接。输入和输出神经元仅连接到具有相同指定时间步长的隐藏层。

作者图片

由于一个时间步长的隐藏层的输出是下一个时间步长的输入的一部分,神经元的激活是按时间顺序计算的:在任何给定的时间步长,只有分配给该时间步长的神经元计算它们的激活。

递归神经网络很少用于时间序列分类,主要是由于三个因素:

  • 这种体系结构的类型主要设计用于预测时间序列中每个元素的输出。
  • 当在长时间序列上训练时,递归神经网络通常会遇到消失梯度问题,这意味着隐藏层中的参数要么不会改变太多,要么会导致数值不稳定和混沌行为。
  • 递归神经网络的训练很难并行化,并且计算量也很大。

回声状态网络被设计成通过消除计算隐藏层的梯度的需要、减少训练时间和避免消失梯度问题来减轻递归神经网络的问题。事实上,许多结果表明回声状态网络确实有助于处理混沌时间序列。

回声状态网络

如图所示,回声状态网络的架构由输入层、称为储层的隐藏层、降维层、称为读出的全连通层和输出层组成。

作者图片

  • 贮存器是回声状态网络的主要构件,并且像稀疏连接的随机递归神经网络一样组织。
  • 降维算法通常用主成分分析来实现。
  • 读出通常实现为多层感知器或岭回归器。

输入层和储层之间的权重以及储层中的权重是随机分配的,不可训练。读数中的权重是可训练的,因此网络可以学习和复制特定的模式。

蓄水池

作者图片

如前所述,储层的组织类似于稀疏连接的随机递归神经网络。储层连接到输入层,由一组内部稀疏连接的神经元和自己的输出神经元组成。在储罐中有 4 种类型的砝码:

  • 输入层和内部神经元之间的输入权重
  • 内部权重,将内部神经元相互连接;
  • 内部神经元和输出之间的输出权重
  • 反向传播权重,将输出连接回内部神经元。所有这些权重都是随机初始化的,对于每个时间步长都是相等的,并且是不可训练的。

与 RNNs 一样,由于一个时间步长的输出是下一个时间步长输入的一部分,因此每个时间步长都单独计算水库的输出。在每个时间步长,计算每个内部和输出神经元的激活,并获得当前时间步长的输出。

ESNs 的最大优点是库创建了输入到更高维表示中的递归非线性嵌入,但是因为只有读出中的权重是可训练的,所以训练计算时间保持很低。

降维

许多实验表明,选择正确的降维方法可以在不降低精度的情况下减少执行时间。此外,降维提供了正则化,提高了模型的整体泛化能力和鲁棒性。

在大多数情况下,训练时间随着子空间维度几乎线性地增加,而只要子空间维度低于某个阈值,准确度就快速增加,然后在该阈值之后,准确度显著减慢并保持几乎恒定。因此,该阈值是子空间维度的最佳选择,因为使用更高的值,我们将具有更长的执行时间,而精度没有相应的提高。

履行

在 GitHub(https://GitHub . com/FilippoMB/Reservoir-Computing-framework-for-multivariate-time-series-class ification)上可以获得回声状态网络的 Python 完整实现。代码使用了 Scikit-learn 和 SciPy 库。包含在文件模块中的主类 RC_classifier。py 允许建立、训练和测试储层计算分类器,即回声状态网络所属的算法家族。

储层所需的超参数必须进行优化,以获得执行时间所需的精度和性能;最重要的是:

  • 水库中神经元的数量;
  • 非零连接权重的百分比(通常小于 10%);
  • 连接权重的水库矩阵的最大特征值。

其他层中最重要的超参数是:

  • 降维层算法(对于多元时间序列数据可以是零或张量 PCA
  • 降维层后的子空间维度;
  • 用于分类的读出类型(多层感知器、岭回归或 SVM);
  • 时期数,即优化过程中的迭代次数。

实现模型的训练和使用的代码结构非常类似于为卷积神经网络描述的结构。

结论

卷积神经网络是时间序列分类中最受欢迎的深度学习技术,因为它们能够通过使用可训练的过滤器成功捕捉空间和时间模式,并使用可训练的权重为这些模式分配重要性。

使用 CNN 的主要困难是它们非常依赖于训练数据的大小和质量。特别是,时间序列的长度会降低训练速度,对于混乱的输入时间序列或相同相关特征可能具有不同大小的输入时间序列,结果可能不像预期的那样准确。为了解决这个问题,最近提出了许多新的算法,在这些算法中,初始时间和回声状态网络的性能优于其他算法。

InceptionTime 源自卷积神经网络,并在最重要的构建模块(初始模块)中使用有效的降维来加速训练过程。此外,它在处理输入时间序列方面表现得非常好,在输入时间序列中,相同的相关特征可能具有不同的大小。

回声状态网络基于递归神经网络,并且由于它们非常稀疏地连接,并且它们的大部分权重先验地固定于随机选择的值,因此加快了训练过程。由于这一点,他们在快速训练后表现出色。此外,它们对处理混沌时间序列非常有帮助。

因此,总之,高精度和高可扩展性使这些新架构成为产品开发的完美候选。

作者

我关于走向数据科学的文章:https://medium.com/@marcodelpra

我的 LinkedIn 个人资料:【https://www.linkedin.com/in/marco-del-pra-7179516/

领英集团 AI 学习:https://www.linkedin.com/groups/8974511/

参考

  1. Hassan Ismail Fawaz、Benjamin Lucas、Germain Forestier、Charlotte Pelletier、Daniel F. Schmidt、Jonathan Weber、Geoffrey I. Webb、Lhassane Idoumghar、Pierre-Alain Muller、Franç ois Petitjean。 InceptionTime:寻找 AlexNet 进行时间序列分类
  2. 菲利普·玛利亚·比安奇、西蒙·斯卡达潘、齐格鲁德·洛克斯、罗伯特·杰森。多变量时间序列表示和分类的油藏计算方法

时间序列数据挖掘技术及其应用

原文:https://towardsdatascience.com/time-series-data-mining-techniques-and-applications-5159b8ad26ec?source=collection_archive---------24-----------------------

预测、异常检测、预测分析、计量经济学等等

UnsplashNeONBRAND 拍摄的照片

所有行业都生成并使用时间序列数据来做出重要的商业决策。

使用过去的数据,杂货连锁店想知道一年中的哪个时间对特定产品的市场需求最大;呼叫中心需要预测未来的呼叫量,以便保持足够的人员配备;信用卡公司密切关注欺诈交易,所有这些商业决策都受益于时间序列数据的使用。

因此,本文的目的是讨论一些关键的应用案例,以及在不同行业的时间序列数据分析中使用的技术类型。

1。了解过去

时间序列数据点是过去的快照。了解历史事件、模式和趋势是所有企业追踪的一些基本指标。他们希望了解自己过去的表现有多好,以及未来的发展方向。如今,随着“大数据”数量的不断增长以及对近实时洞察的需求,时间序列分析正成为商业决策的重要组成部分。以下是历史数据帮助决策的几种方式:

  • 衡量和跟踪关键绩效指标(KPI)
  • 识别影响产品需求的特殊事件
  • 跨产品类别和位置比较 KPI
  • 了解趋势并获得业务方向的早期指示
  • 识别季节性和长期商业周期
  • 影响企业绩效的假设因素
  • 审查政策变化的影响

通过时间序列数据对历史事件的基本理解不需要花哨的建模,只需绘制数据与时间的关系就可以产生非常强大的洞察力。在过去,电子表格足以创造强大的视觉故事和洞察力。如今,大多数统计和数据分析工具(例如 Python、Tableau、PowerBI)可以很好地处理时间序列数据,以创建时间序列图表、仪表板等。

历史数据揭示了重要的见解——趋势、季节性、商业周期等等

2.预测未来

时间序列数据的另一个引人注目的用途是预测——对短期、中期和长期的未来进行预测。企业每天通常面临的许多预测问题都有时间维度,这也是时间序列数据对于预测如此重要的原因。以下是不同领域的一些预测应用:

  • 政府对人口增长进行预测,以发展足够的公共基础设施
  • 气候科学家重建历史数据,并用它们来预测未来的气候
  • 公用事业公司预测未来需求以进行必要的业务扩张
  • 企业预测其产品的未来需求,以确保充足的产品库存

时间序列预测是数据科学和机器学习技术的重要组成部分,涉及拟合统计/机器学习模型来进行预测。这些工具很简单,从历史趋势向未来的外推,到复杂的随机自回归模型,如 ARIMA[阅读:时间序列预测:从天真到 ARIMA 和超越 ]。长期短期记忆(【LSTM】)和计量经济学等深度学习模型正日益增加预测实践的复杂性。

使用 ARIMA 根据历史数据预测零售额(来源)

3.专业业务应用

3.1 异常检测

异常(或异常值)是数据中任何不寻常的观察结果。鉴于客户的历史交易行为,如果信用卡交易的突然激增是意料之外的,则可能被视为异常。类似地,如果在任何交易/数据点的时间序列图中有尖峰和下降,这些也可以被视为异常值。

异常检测是一个经过充分研究的领域,有许多可用的工具和技术。有几个 R 包专门用于异常检测,如[tsoutlier](https://cran.r-project.org/web/packages/tsoutliers/tsoutliers.pdf)[AnomalyDetection](https://github.com/twitter/AnomalyDetection).下面是一些商业应用:

  • 金融:信用卡和金融交易中的欺诈检测
  • 网络安全:根据计算机网络中的异常流量检测网络入侵
  • 医疗保健:基于读取心跳脉冲的心电图(ECG)记录的异常患者状况
  • 天文学:在对恒星和星系的特征和特性的观察中发现异常值。最著名的可能是引力波探测

LIGO 的引力波探测:异常探测的一个例子(来源:维基百科

3.2 比较分析

比较分析是一种显示与时间相关的观察结果之间的相似性和差异的方法。它还可以用来比较多个实体的性能。例如,绘制不同国家的人口增长时间序列数据可以揭示一个国家与另一个国家相比的重要信息。

显示北欧国家人口增长的比较时间序列图(资料来源:世界银行)

3.3 相关性分析

相关性通常被理解为两个随机变量之间的关系,并且通常在双变量散点图中可视化。两个随机时间序列变量同样可以揭示相关性/关联性。通过绘制多元时态数据,很容易识别两个特征之间的关联(例如,销售额与利润)。这种关联可能意味着因果关系,也可能不意味着因果关系,但这是寻找与输出变量相关的特征并在统计分析中使用它们的良好起点。

除了可视化时间序列图之外,还有用于测量时间序列相关性的定量指标— 皮尔逊系数就是这样一种指标。

3.4 经济计量分析

预测分析是一个成熟的技术领域,它大量利用统计学和机器学习来预测未来的结果。该领域还从一个专门的经济学子学科— 计量经济学中汲取方法。高级统计分析,如面板数据模型(如固定和随机效应模型)严重依赖多元纵向(时间序列)数据集。下面是一些计量经济学的应用:

结论

时间序列数据在所有应用领域提供了丰富的分析和应用可能性。历史分析、预测、异常检测和预测分析只是这些可能性中的一部分。随着新工具和技术的发展,新的分析领域也在出现。人工神经网络(如 LSTM)和计量经济学是时间序列数据分析的前沿领域。有经验和有抱负的数据科学家可以通过利用这些工具,或者开发新的工具,为他们的领域做出巨大贡献。

时序分解和 Statsmodels 参数

原文:https://towardsdatascience.com/time-series-decomposition-and-statsmodels-parameters-69e54d035453?source=collection_archive---------5-----------------------

注:本文于 2020 年 7 月 11 日更新,以反映对stats modelsPython 模块的新更改,并包括乘法模型的结果。

时间序列分解是将时间序列数据分离成其核心部分的过程。这些组成部分包括潜在趋势(平均值的总体上升或下降)、季节性(循环周期)和剩余的随机残差。几乎所有你会遇到的时间序列都不是自然平稳的,这意味着均值、方差或协方差将依赖于时间。这就是为什么数据科学家在应用模型之前必须从时间序列数据中识别和分离趋势和季节性。

您可以通过应用变换、减去滚动平均值和差分来手动移除趋势,以使您的数据保持平稳,或者您可以使用 Python 的 statsmodels 库来识别趋势和季节性。

在过去的几周里,我已经讨论了一些时间序列主题,我将在这里建立这些主题,包括 OHLC 可视化时间序列数据 EDA趋势分析平稳性

分解

所有的时间序列数据都可以分解成四个核心部分:平均值、趋势(即增加的平均值)、季节性(即重复的循环模式)和残差(随机噪声)。趋势和季节性并不总是出现在与时间相关的数据中。残差是除去趋势和季节性之后剩下的东西。时间序列模型假设数据是平稳的,只有剩余分量满足平稳性条件。

Python 的 statsmodels 库有一个用于时间序列分解的方法叫做seasonal_decompose()。我利用过去五年标准普尔 500 指数的历史日平均收盘价来说明时间序列分解。数据来自于 UniBit API (注意:由于 API 的限制,在后面的部分我只使用三年的价格)

过去五年的标准普尔 500 指数历史价格——由 UniBit API 提供

我将数据存储在 pandas dataframe 中,并使用.set_index()方法将索引设置为 date 列。然后,我确保日期索引列的数据类型是 pandas datetime 对象。您需要确保您的数据是正确的格式,UniBit API 以年-月-日(即 2015–01–20)的格式提供日期。

seasonal_decompose()方法最多可以接受六个参数。我关注数据本身、模型类型和频率(文档中的周期)。我使用了 pandas 数据框架的调整后收盘价列,其中的索引是一个 datetime 对象。模型类型参数可以是加法乘法,这取决于数据的季节性幅度是否与水平(平均值)相关。如果季节性的振幅独立于水平,那么你应该使用加法模型,如果季节性的振幅依赖于水平,那么你应该使用乘法模型。

加法与乘法时间序列数据。请注意右边乘法数列中季节性变化的扩大。Source“加法和乘法季节性——你能正确识别它们吗?”由尼古拉·考伦茨

您可以对数据的图形可视化进行初步的视觉浏览,以确定哪种模型类型与您的数据相匹配,在本文中,我将测试这两种模型。

频率参数

我处理的最后一个参数是频率参数。(注:statsmodels 的 *seasonal_decompose()* 方法的 *frequency* 参数已被弃用,替换为 *period* 参数)。我没有想到必须选择这个参数,因为它是可选的,季节分解方法与教程中的数据配合得非常好,我最初使用时没有指定这个参数。当我将该方法应用于 S & P 500 数据帧时,我收到了以下错误:

当我对标准普尔 500 数据应用季节分解方法时,出现了错误

我搜索了一些为什么会出现这个错误的原因,一个 GitHub 对话讨论了一个熊猫系列的[inferred_freq](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DatetimeIndex.inferred_freq.html)属性,另一个讨论了一个最近用seasonal_decompose()方法出现的 bug 。这个错误也出现在我正在关注的 Jason Brownlee 的教程的评论部分。对于观察值不一致的时间序列数据,可能会出现问题,周末在日常数据中缺失。这是我最初使用的教程数据和标准普尔 500 指数调整后的每日收盘价之间的唯一区别。

那么,如何为频率参数选择合适的值呢?在这些 GitHub 对话的评论部分,几个用户指定了一个他们可以合理解释的频率。Brownlee 的指导链接到 Rob J. Hyndman 和 George Athanasopoulos 的书《预测:原理和实践》。作者在他们关于经典分解的文章中也给出了选择这个参数的相似的逻辑理由。我对我的时间序列数据测试了三个频率:5、20 和 253。五个因为那是一周有多少个交易日,一个月有 20 个交易日,一年有 253 个(注意:你的数据中必须有至少两倍于你想要测试的频率的观察值;即如果你想将频率设置为 253 那么你至少需要 506 观测值)

加性模型

我比较了具有三个频率值的加性模型的 Dickey-Fuller 检验结果,周期为 5 天的模型具有最小的 p 值:

标准普尔 500 数据的季节分解,采用加法模型,周期设置为 5。

季节性分解方法将数据分解为三部分,趋势、季节性和随机残差分量。周期设置为 5 的序列的剩余分量是稳定的,因为 4.576743e-21 的 p 值远小于 0.05

乘法模型

然后,我比较了具有三个相同频率值的乘法模型的 Dickey-Fuller 测试结果,周期为 5 天的模型再次具有最小的 p 值:

使用乘法模型对标准普尔 500 数据进行季节性分解,周期设置为 5。

周期设置为 5 的序列的剩余分量是稳定的,因为 3.053408e-20 的 p 值远小于 0.05

结果比较

在三个测试周期中的两个周期,Dickey-Fuller 测试的 p 值对于乘法模型是最小的;20 和 253 天。表现最好的模型是周期设置为 5 天的加性模型。只有 253 天的 p 值高于 0.05,结果如下:

不同时期标准普尔 500 指数数据的 Dickey-Fuller 检验结果比较

摘要

Statsmodels 的季节性分解方法巧妙地将时间序列数据分解成多个部分。数据科学家和统计学家必须使用逻辑来证明为加法和乘法季节分解模型选择的周期,因为自动推断序列频率的方法并不总是可靠的。然而,statsmodels 包含的包大大减少了猜测的需要。

我的这个项目的资源库可以在这里找到,这个具体文章使用的文件是time _ series _ removaling _ trends _ and _ decomposition . ipynb

初学者的时间序列预测

原文:https://towardsdatascience.com/time-series-essentials-fe6727ab6a94?source=collection_archive---------15-----------------------

关键概念、民间智慧和常见错误

乔治·霍丹在 Needpix 上的图片

不幸的是,数据科学导论经常被分成回归/分类/聚类。应该有第四大类:时间序列。

时间序列很难建模。它们与典型的平面表格数据完全不同。当我们不把时间序列作为一个独特的问题来讨论时,数据科学的新人会在不了解模型如何完全失败的情况下,不经意地应用标准的回归算法。

这篇文章主要是针对新手的,但是有经验的建模者可能会得到一些有用的信息。这是解决常见基本错误的系列文章的一部分,例如误解了 t 检验从 pairs 图中得出不必要的结论

重点将放在 ARIMA,它的表现非常好,因为它很容易调整,非常适合初学者。虽然许多其他文章提供了时间序列的介绍,但本文通过讨论 1)民间智慧和 2)要避免的常见错误增加了价值,奇怪的是,许多指南中都没有这些内容。

为了简单起见,我们将使用经典的航空乘客数据。这篇文章的目标是交流思想;复杂的数据会模糊概念。

自相关

自相关是时间序列中最重要的概念。正是这一点让建模变得如此困难。

许多模型假设误差是不相关的,并且是独立的。例如,你点击一个广告不应该影响你的邻居是否点击同样的广告。

在时间序列中,当前值取决于过去的值。如果今天的温度是华氏 80 度,明天的温度很可能是华氏 80 度左右,而不是华氏 40 度。

如果您交换表格数据中的第一个和第十个观察值,数据一点也没有改变。如果你交换一个时间序列中的第一个和第十个观察值,你会得到一个不同的时间序列。秩序很重要。不考虑自相关几乎和这个永恒经典一样傻。

我们经常使用自相关函数(ACF)图和部分 ACF 图来检查自相关。x 轴具有分数滞后,因为我们的时间序列包含月数据,这里的滞后 1 表示前一年的同一个月。滞后 k 处的 ACF 只是时间 t 和时间 t-k 处的值之间的相关性,例如,滞后 1 和 2 处的 ACF:

cor(
  passengers, 
  shift(passengers, n = 1L), 
  use = 'complete.obs'
)
cor(
  passengers, 
  shift(passengers, n = 2L), 
  use = 'complete.obs'
)

我用的是 data.table 的 shift()函数。PACF 是在控制了所有以前的滞后之后剩下的相关性。例如,如果您想要获得滞后 3 的 PACF,您可以使用第一个和第二个滞后进行回归拟合,然后计算残差的相关性:

adjustment <- lm(
  passengers~shift(passengers, n = 1L)+
    shift(passengers, n = 2L)
)
cor(
  residuals(adjustment), 
  shift(passengers, n = 3L)[-(1:2)], 
  use = 'complete.obs'
)

从频率主义者的角度来看,时间序列建模的一个主要目标是从残差中移除自相关,以便残差是合理的 iid 白噪声。

你不能只看 RMSE 或者任何你喜欢的指标来选择时间序列模型。这是分析师犯下的最大罪过。始终绘制残差的时间序列,并检查残差的 ACF/PACF。我们稍后再讨论这个。

有些人错误地认为,你可以只根据 ACF 和 PACF 来选择最佳的时间序列模型。这是真的只有对于纯 AR 或纯 MA 工艺,但那些是罕见的。这些主要是诊断图。

平稳性

平稳性是第二个关键概念,通常用来表示时间序列具有恒定的均值和方差。回想一下飞机乘客时间序列:

这显然不具有恒定的意义。一个常见的技巧是求一阶差,从时间 t 的观测值中减去时间 t-1 的观测值:

这个数列有常数均值,但不是常数方差。如果我们认为时间序列遵循指数增长,我们可以取 log(Y)和 difference:

这个系列现在表现得更好了。在使用经典时间序列预测方法时,将此过程作为 EDA 的一部分。当序列呈指数(倍增)增长时,对数变换有意义。

很多时间序列模型都需要平稳性,尤其是关于常数均值的部分。这么想吧。只要平均值是恒定的,我们可以预测接近平均值的某个地方,我们将大致正确;否则,我们不知道这个系列在未来会有什么结局。

季节性趋势分解

季节性趋势分解对于可视化很有用,但通常不能用于预测。这个方法很容易理解。对于周-季数据,我们可以:

  1. 计算 7 日移动平均线(从 t-3 到 t+3)。这是你的趋势。
  2. 从你的数据中减去趋势。然后取一周中每一天的平均值(星期一、星期二……)。这是你的季节性成分。
  3. 从原始观测值中减去趋势和季节性之后,剩下的就是残差。

第一步要非常仔细地看。趋势是一个移动平均线,你实际上需要未来的观察来估计趋势。

我见过一些人执行分解,然后训练一个模型来预测趋势,因为这样“更容易”。呃,不。首先,这是“作弊”,因为它人为地降低了 RMSE。其次,趋势是吸收了未来值的移动平均线——大量数据泄露。

ARIMA

ARIMA(p,d,q)有三个分量:

  1. AR(p)自回归。这使用滞后值。例如,AR(2)使用时间 t-1 和 t-2 的观测值来预测时间 t 的值。这可以被视为时间序列的持久结构部分。
  2. I(d)集成。这是你需要使数列变得稳定的次数。如果完成,AR 和 MA 组件使用差异系列。
  3. MA(q)均线。这使用残差的滞后值。例如,MA(2)使用时间 t-1 和 t-2 的残差来预测时间 t 的值。这可以视为时间序列的局部趋势。

我们经常用(2,1,2)来表示一个 ARIMA 模型,它有 AR(2),I(1)和 MA(2)三个分量。根据经验,任何超过(2,1,2)的都可能是过度拟合。(超级重要!)如果你要拟合一个(1,1,6)模型,你最好添加一个季节性因素(下一节)。

ARIMA 很容易调整,因为我们只需要尝试 3 x 2 x 3 = 18 个可能的模型,然后选择最好的一个。I(2)可能发生在一些科学过程中,但大多数业务数据只需要 I(1)。

参数不直观,但模型具有某些含义。值得注意的是(1,1,2),阻尼趋势模型。你可以把这个模型看作是对观察到的趋势进行外推,但是进行了一些正则化(我们知道正则化在实践中效果很好)。有人认为,( 1,1,2)应该是 ARIMA 的默认设置,因为它在很多情况下都能很好地工作。当您拥有非常少的数据时,例如新推出的产品,衰减趋势尤其明显。

ARIMA 在短期预测方面确实很难被击败,但在长期预测方面却失败了,因为许多时间序列需要 MA 成分。假设你有马①。你可以用 t 时刻的观测残差来预测 t+1,但是你没有 t+1 时刻的残差来预测 t+2。如果你需要做长期预测,看看脸书的先知之类的东西。

我不喜欢 r 中的 auto.arima()函数,前面我提到过时间序列模型不应该只在单一指标上进行评估。具有最低 AIC 或 BIC 的模型可能具有表现不佳的残差;我们希望从具有良好残差的模型中挑选出具有最佳度量的模型。

此外,auto.arima()默认情况下在(2,1,2)之外搜索,因此它可以挑选不必要的复杂模型——并且由于搜索空间更大,它使用试探法,因此您可以陷入局部最优。

我们之前看到,记录的值与一阶差分相结合会产生一个稳定的分布,所以让我们应用对数变换并搜索参数,排除过去 14 个月(应该是 12 个月,但我没有重新运行整个测试集)的数据:

library(forecast)log_passengers <- ts(log(passengers), frequency = 12)
train <- ts(
  log_passengers[1:(length(log_passengers) - 14)], 
  frequency = 12
)placeholder <- list()
i <- 1
for(p in 0:2){
  for(d in 0:1){
    for(q in 0:2){
      model <- Arima(train, order = c(p, d, q))
      placeholder[[i]] <- c(p, d, q, AIC(model))
      i <- i + 1
    }
  }
}
performance <- do.call('rbind', placeholder)
colnames(performance) <- c('p', 'd', 'q', 'AIC')

最低的 AIC 来自(2,1,1)。这里我们检查残差的 ACF 和 PACF:

这些都不令人满意,尤其是滞后 1 时的峰值。下一个最好的 AIC 来自(1,1,2):

由于滞后 1 处的尖峰,这些也不令人满意。看看原始的时间序列,我们显然需要一个季节性的组成部分。我们有月度数据;峰值对应于年度(12 个月)季节性。

萨里玛

SARIMA(p,D,q)×(P,D,Q)m 的工作方式与 ARIMA 类似,但有季节性成分。你可以把它想成是两个模型的组合:一个滞后步长为 1 (t-1,t-2,…),一个滞后步长为 m (t-m,t-2m,…)。但是为了获得更精确的理解,你应该学习后移符号,因为 D 和 D 部分有一些相互作用。

就像 ARIMA 一样,我们可以测试所有可能的参数值,将它们保持在(2,1,2)以内。m 取决于你的时间序列的粒度。对于每小时的数据,尝试一天 24 小时中 m = 24 对于每日数据,尝试 m = 7,一周 7 天;而对于月度数据,尝试 m = 12。SARIMA 的最大限制是它只允许一个季节性项。当你有每日数据时,有理由相信有每周和每年的季节性,但遗憾的是,我们只能将其中一个纳入模型。一种变通方法是加入傅立叶项,如果时间序列不是大致稳定的,这在 SARIMA 框架中可能是一个难题。

总之,找到合适的环境。让我们冒险进入末日金字塔:

placeholder <- list()
i <- 1
for(p in 0:2){
  for(d in 0:1){
    for(q in 0:2){
      for(P in 0:2){
        for(D in 0:1){
          for(Q in 0:2){
            model <- tryCatch({
              Arima(train,
                    order = c(p, d, q),
                    seasonal = c(P, D, Q)
                    )
            }, error = function(err){
              Arima(train,
                    order = c(p, d, q),
                    seasonal = c(P, D, Q),
                    method = 'CSS'
                    )
            })
            placeholder[[i]] <- c(p, d, q, P, D, Q, AIC(model))
            i <- i + 1
          }
        }
      }
    }
  }
}
performance <- do.call('rbind', placeholder)
colnames(performance) <- c('p', 'd', 'q', 'P', 'D', 'Q', 'AIC')

这比以前运行得慢多了,因为我们必须考虑 18 x 18 = 324 个参数组合。这里我们必须使用 tryCatch,因为有时默认的优化算法不起作用。我们最终以(2,1,2) × (1,0,1)12 作为最佳模型。

这些诊断图看起来很好。但是我们仍然需要检查残差。这里有一个比较,显示了增加季节性带来的改善:

ACF 和 PACF 图看起来很好,残差看起来很像白噪声。还有一件事我们不能忘记检查:预测的合理性:

有时其他诊断看起来不错,但预测看起来真的很差。这看起来不错。

其他人可能会选择不同的模型。只要所有的诊断看起来都没问题,那就没问题。记住所有的模型都是错的,但有些是有用的。不要纠结于“真实”的模型,要确保模型是有用的。

消除预测偏差

这部分是很常见的错误。我们取了时间序列的对数,所以要创建预测,我们只需要取指数,对吗?未必。选择归结为我们是想要中值(最小化 MAE)还是平均值(最小化 MSE)。在这里,预测中位数也可以解释为最小化%误差(kinda)。有时,业务环境希望最小化 MSE,而分析师忘记了让模型预测平均值。

在模型假设下,时间序列的对数具有正态分布的残差。换言之,残差遵循对数正态分布。分布的平均值是 exp(μ + 0.5 σ),而不是 exp(μ),后者是中位数。σ项可以通过计算残差的方差来估计。

您可以保留原始时间序列并在 Arima()中转换它,而不是手动获取时间序列的日志:

Arima(..., lambda = 0, biasadj = TRUE)

预测会自动计算 exp(μ + 0.5 σ)。

这是我们带有偏差调整的 SARIMA 模型:

model <- Arima(
  subset(passengers, start = 1, end = 132),
  order = c(2, 1, 2),
  seasonal = c(1, 0, 1),
  lambda = 0,
  biasadj = TRUE
)
plot(forecast(model, 12, biasadj = TRUE), 
     ylim = c(300, 700), xlim = c(1959, 1961))
par(new = TRUE)
plot(passengers, add = TRUE, 
     ylim = c(300, 700), xlim = c(1959, 1961))

如果你问我的话,我会说,这个预测看起来真的很不错。

时间序列回归

有时称为(S)ARIMAX,其中 X 代表外部回归量。程序很简单:

  1. 拟合 y~x1+x2+…
  2. 对残差进行 ARIMA 拟合

就是这样。

第一步其实超级棘手。不幸的是,就其本质而言,时间序列有一个共同的混淆因素:时间。你可以得到在训练数据上表现良好的模型,但是由于虚假相关性,该模型是无意义的。独立随机漫步通常是强相关的!

rw1 <- cumsum(rnorm(100, 0, 1))
rw2 <- cumsum(rnorm(100, 0, 1))
plot(
  rw1, 
  type = 'l',
  main = paste0(
    'Correlation = ', round(cor(rw1, rw2), 2), 
    ', p approx. ', round(cor.test(rw1, rw2)$p.value, 2)),
  ylim = c(min(c(rw1, rw2)), max(c(rw1, rw2))))
lines(rw2)

一些计量经济学模型要求趋势平稳性,即每个时间序列在去除(线性)趋势后变得平稳。这是一个相对简单的检查,但我除了大多数序列不是趋势平稳的。

我们将这一概念概括为协整。简单地说,如果所有的时间序列(Y 和 X)都是 I(1),那么步骤 1 中的回归必然会产生 I(0)残差。或者,如果所有时间序列都是 I(2),那么步骤 1 中的回归必然会产生 I(1)或 I(0)残差。不,你不能欺骗说“这个 I(1)序列在再求一次差后仍然是静止的。”那还是我①。

如果时间序列不是协整的,那么就不能进行时间序列回归。思考一下协整在概念上意味着什么。假设 Y 是一只狗,X 是它们的主人。

如果 Y 和 X 是协整的,那么这条狗就被拴住了。狗可以在皮带半径范围内的任何地方行走,但它是依附于它的主人的。如果我们知道主人在哪里,我们就知道狗在哪里。

如果 Y 和 X 不是协整的,那么这条狗就没有被拴住。它可以逃跑,探索整个城市。知道了主人的位置并不能告诉我们狗的大概位置。时间差越大,不确定性越大。可能狗刚跑了,未来五分钟还在街区内;但是一个小时后,我们不知道它在哪里。

在商业环境中,大多数时间序列是 I(1)。检查回归残差是否平稳。如果不是,那么你需要一个比 ARIMA 更先进的模型(脸书先知是可能的候选人)。

关于通用机器学习的注记

如果时间序列是稳定的,随机森林和其他树算法可以工作。他们使用外部回归来捕捉季节性,而不对残差应用(S)ARIMA。

然而,当时间序列有趋势时会发生什么呢?理解机器学习算法如何在引擎盖下工作绝对至关重要。

考虑一棵有一个裂口的树,X 和 Y 都有向上的趋势。拆分说“如果 X > x,预测 Y = yhigh 否则预测 Y = ylow”。它预测一条平坦的线。即使你的 X 提供了一个趋势,一个预测只是看到 X > x,并预测在 Y = yhigh 处是一条平线。树木无法学习趋势。

改善这种情况的一种方法是,如果可能的话,对原始时间序列进行差分,使其变得平稳。然后,您可以通过采用最近的观察点并添加预测的累积和来进行预测。然而,由于该算法不理解序列相关性,预计会看到长串的预测不足/预测过度。

关于季节性的说明

如果你的时间序列看起来“大致平稳”——具有细微周期的平坦——那么你可以添加傅立叶项来表示季节性。例如,我们不期望转换率有一个大的恒定趋势,但它可能有很强的每日和每周季节性。你可以在这上面训练一个逻辑回归。

如果您有每小时的数据,请尝试添加:

  • 使用预测因子 sin(2πkt/24)和 cos(2πkt/24)的每日季节性
  • 使用预测值 sin(2πkt/(247))和 cos(2πkt/(247))的每周季节性

其中 t 是时间,k = 1,2,3,…您可以使用正则化来选择 k。

实际制约因素

有时人们会犯一个可爱的错误,忘记了模型的最终目的是预测。如果业务要求你预测未来 7 天,你最好确保你使用的任何回归变量都可以提前 7 天获得。如果使用任何外部回归变量,请确保将其滞后。

模型验证

交叉验证对于获得样本外误差的感觉是惊人的。当然,CV 因其在超参数调整中的作用而受到关注,但对于我们许多人(咳嗽 Bayesians 咳嗽)来说,我们使用 CV 来评估模型的泛化能力,而不是选择超参数。

我见过有人在时间序列上使用常规 CV。 CV 完全无效,因为自相关是一个东西。

对时间序列进行交叉验证有两种主要方法,每种方法都有不同的假设。

第一个是留在未来之外交叉验证 (LFOCV)。例如,我们可以使用 t = 1:36 来训练模型,并预测未来的 12 个步骤并记录误差。然后使用 t = 1:48 进行训练,并预测未来的 12 步。那么 t = 1:60。诸如此类。

理想情况下,我们预测未来的 1 步,并用 t = 1:36、1:37、1:38 等重新调整模型。然而,这实际上是 LOOCV 且计算非常昂贵。使用 12 的增量是出于方便,比如选择 k = 5 或 10。

二是使用推拉窗。这里我们固定了训练数据和幻灯片的长度,所以 t = 1:36,13:48,25:60 等等。这篇文章对这两种方法进行了很好的可视化。

哪个更好?这取决于时间序列的行为有多“粘”。如果行为看起来一致,那么 LFOCV 工作得更好,因为您将使用所有的数据来训练最终的模型。如果行为更加不稳定,并且会随时间变化,那么滑动窗口会更好,因为每次您做出预测时,模型都会根据您最近的数据子集进行训练。

(啊,之前忘了提了。与表格数据不同,更多的数据不一定意味着更好的预测。如果您的时间序列不断改变行为,只使用最近的子集是更明智的。还有动态 AR 模型,但这些超出了本文的范围。)

请记住,我们的目标是评估模型在野外漫游时的表现,因此我们希望尽可能接近模型部署时的情况。

评估指标

我们还没有讨论评估指标。就我个人而言,我真的不喜欢 MAPE 和梅。根据你的时间序列,优化这两个中的任何一个都会引入系统偏差——预测值太低。

在 MAPE 的例子中,预测不足的误差最多是 100%,而预测过度的误差是无限的。

在 MAE 的例子中,如果你有指数增长,中间值会比平均值低很多。

如果企业关心百分比误差,尝试使用 log(预测/实际)代替。换句话说,预测日志时间序列的残差。当取指数时,其平均值会产生一个“更合理”的百分比误差。

如果企业关心平方误差,那么你应该在偏差调整预测的基础上计算 RMSE。

超越

如果你是时间序列的新手,想了解更多,我建议浏览一下《预测:原则与实践》这本书,这是一本免费的在线教材,作者是 Rob Hyndman,他是 R's forecast package 的作者。它更侧重于理解和应用,而不是数学,这对新手来说是完美的。

像 ARIMA 这样的模型的一个主要缺点是缺乏可解释性。滞后值的系数很难解释。此外,尽管 ARIMA 能做出很好的短期预测,但它无法预测更长期的情况。脸书的先知包通过提供季节性趋势分解式方法解决了这两个问题。他们线性推断趋势进行预测。

如果你正在寻找高级的时间序列方法,我建议学习一下贝叶斯结构时间序列 (bsts)模型。它们是状态空间模型——把它们想象成隐马尔可夫模型,更加灵活,能够处理连续的潜在状态。这类模型非常有前途,原因如下:

  • 它明确说明了测量误差。像 ARIMA 这样的频率主义方法假设测量是完美的,所以在做预测时,模型会传播测量误差。如果你那么喜欢 ARIMA,它可以被公式化为一个状态空间模型。
  • 可以应用于因果推断。我相信谷歌的 CausalImpact 是准实验最有用的软件包。这对于衡量营销活动的影响非常有用。
  • 它允许动态回归。许多模型用一组系数来拟合训练数据,并假设这些系数是静态的。当我们建模的内容不断变化时,我们可能希望让系数随时间变化。
  • 它以一种巧妙的方式结合了正规化。它使用尖峰和厚片先验,一个质量为 0 的点加上一个高斯。它类似于 elasticnet,但允许 0 的后拉伸。

为时间序列预测奠定基础

原文:https://towardsdatascience.com/time-series-forecasting-968192b3781a?source=collection_archive---------11-----------------------

时间数列预测法

关于时间序列 EDA 和使用 Python 进行数据准备的教程

背景

时间序列预测是机器学习的一个重要领域,各行各业都有很多涉及时间成分的用例,如零售商下周的需求预测、解决劳动力优化问题的呼叫量预测、预测能源消耗、用于主动灾难管理的天气预报等等。时间序列分析和预测也可以用于异常检测。

什么是时间序列预测,它与其他机器学习问题有何不同?

在这两种类型的问题中,时间都扮演着重要的角色,历史数据被用来训练预测未来的模型。两个机器学习数据集都是观察值的集合。那么,有什么区别呢?

在正常的机器学习数据集中,所有的历史观测值都被同等对待,而时间序列是一系列观测值,它们是按时间顺序捕获的,因此时间序列增加了观测值之间的顺序依赖性。

让我们了解一些常见的符号。

  • t-n:之前的时间或滞后,如 t-1 是之前的时间,也称为 1 的滞后
  • t:当前时间
  • t+n:未来的时间,例如 t+1 是要预测的下一个时间

时间序列组件

在任何机器学习问题中,我们都从探索性分析开始,以更好地理解数据,这有助于选择适当的算法。同样,在时间序列中,我们将序列分解为 4 个组成部分:水平、趋势、季节性和噪声,以便更好地理解数据。

水平、趋势和季节性被进一步归类为系统成分,因为它们以一致的模式表征基础数据,并且可以建模,而噪声是一种非系统成分,因为它具有随机变化,不能直接建模。

让我们来看看这 4 个组件。

  1. 级别 :级别描述系列的平均值
  2. 趋势 :趋势是序列在两个相邻期间之间的变化,这是可选成分,不一定出现在所有序列中
  3. :季节性描述了一段时间内的短期循环行为,这也是一个可选的组成部分,不一定出现在所有序列中
  4. 噪声 :模型无法解释的随机变化,在所有系列中都有所体现

一个系列被认为是这四个部分的组合,它们可以相加或相乘地组合,让我们通过下面的例子来理解这一点。

共同趋势和季节性的例子

  • 加法模型:yₜ =水平+趋势+季节性+噪声
  • 乘法模型:yₜ =水平 x 趋势 x 季节性 x 噪音

预测方法是如何工作的?

这些方法试图隔离系统部分并量化非系统部分,即噪声。系统部分有助于生成点预测,而噪声水平有助于估计相关的不确定性。

我们已经简要介绍了时间序列。在接下来的章节中,我们将讨论将时间序列分解为系统和非系统部分并检测初始模式的各种技术。

时间序列数据准备和分析

预测的第一步也是最重要的一步是描述时间序列的性质,并调查潜在的问题,这些问题必须在应用任何预测方法以获得有效结果之前加以注意。

我们将通过一些开源数据集和一些随机生成的数据集来逐一讨论所有这些步骤。我们将在 Google Colab 中使用 Jupyter 笔记本。

  1. 加载和浏览时间序列数据
  2. 特征工程
  3. 数据可视化
  4. 重采样
  5. 电力转换
  6. 探索时间结构

首先,让我们下载以下数据集,打开 Jupyter 笔记本,并导入这些 python 函数。

1.加载和浏览时间序列数据

加载时间序列数据

我们通常将数据集作为 pandas 数据帧来加载,这里我们可以使用 read_csv()函数将时间序列数据作为一个 series 对象来加载,这是一个一维数组,每行都有时间标签。

我们不应该忘记指定一些参数,以确保数据作为一个系列正确加载。下面我们来看看这些参数。

  • 标头:“0”指定标头信息可供使用。
  • parse_dates: 'True '帮助 pandas 识别第一列中的数据包含需要解析的日期。但是总有一些奇怪的格式需要手动定义,在这种情况下,添加 date_parser()函数是更好的方法。
  • index_col: '0 '暗示我们的第一列,即时间序列列包含我们的索引信息
  • 挤压:“真”暗示熊猫,我们只有一个专栏,我们想用这个作为系列

探索时间序列数据

加载后,建议浏览一下数据,我们可以使用 head()函数来查看前五条记录,也可以指定前 n 条记录来查看。

验证给定系列中的观察值的数量以避免任何错误总是一个好主意。

我们可以通过查询不同的时间间隔来分割时间序列。例如,让我们看看 1981 年 1 月以来的所有观测数据。

与其他机器学习问题一样,计算和查看汇总统计数据也是时间序列数据探索中的一个重要步骤,它让我们了解值的分布和传播。describe()函数将帮助我们计算这些统计数据。

2.特征工程

时间序列数据必须转换为监督学习数据集,才能用任何机器学习算法建模。正如我们在上面看到的,时间序列没有任何因变量和自变量。我们必须构建一个数据集,其中包含要预测的目标变量和用于预测的输入变量。

创建滞后要素

这是将时间序列预测问题转化为监督学习问题的经典方法。在这种方法中,一个时间(t)的值被用来预测下一个时间(t+1)的值。

在 Pandas 中,可以通过 shift()函数创建滞后要素,这通过将数据集移位 1 来创建列 t,并且没有移位的原始序列表示 t+1。

我们可以看到,在我们的监督学习问题中,前一个时间步长(t+1)是输入(X),下一个时间步长(t)是输出(y)。这个概念被称为滑动窗口方法。我们可以看到,第一个观察值没有可用于预测序列的输入,最后一个观察值没有已知的输出(y)。因此,我们必须丢弃这些行。

类似地,我们可以如下创建多个滞后特征。

使用汇总统计数据作为特征

此外,我们可以使用一些滞后值的汇总统计数据作为特征,例如前面几个值的平均值。这可以通过 rolling()函数来实现。

或者,我们可以使用每个时间戳的所有先前值的汇总统计数据作为我们预测模型的特征。这些特性可以通过扩展()函数来创建。

日期和时间作为特征

与任何其他监督学习数据集类似,许多日期相关的特征可以从时间戳中导出,例如一天中的小时、一周中的天、月、季度、工作日和周末、公共假日等。我们经常发现它非常有用。

3.数据可视化

时间序列自然会产生相当流行的可视化效果,甚至在我们引入数据科学之前,我们都见过股票市场运动的折线图。除了线形图之外,还有很多可视化的东西。我们将在本节中学习这些工具。

线形图

线形图可能是时间序列最流行的可视化方式。在该图中,x 轴表示时间,y 轴表示观察值。

比较不同时间间隔的相同时间间隔的折线图通常很有帮助,例如每天、每月和每年。在下面的例子中,我们比较了 10 年中 365 天的最低日温度。让我们按年份将数据分组,并为每一年创建一个线图。

直方图和密度图

另一个重要的可视化是观察值的分布。一些线性时间序列预测方法假设正态分布的观测值。我们可以通过绘制原始观察值的直方图和密度图来检查这一点,如果需要,可以对原始值的记录等转换变量重复这一检查。

盒须图

另一种有助于总结观察值分布的图是盒须图。此图有助于检测系列中的任何异常值。

我们可以在每年的水平上使用这些并排的箱线图来比较时间序列中的每个时间间隔。

热图

热图是一个神奇的可视化工具,我们可以用它来可视化不同颜色的温度分布。它不言自明,较大的值用暖色(黄色)显示,较小的值用冷色(绿色)显示。

滞后散点图

时间序列建模假设当前观察值和先前观察值之间存在关系,这也称为滞后 1。我们可以在散点图上显示这种关系。

通常,分析多个滞后值之间的关系很有帮助。我们可以在一个循环中运行相同的代码来绘制多个滞后。

自相关图

观察值和它们的滞后之间的相关性强度可以用自相关图来量化。在时间序列中,它也被称为自相关,因为我们计算的是同一序列的滞后值的相关性。

4.重采样时间序列

有时我们的观测频率不对,观测频率可能高于或低于我们期望的预报频率。例如,一个企业需要一个每日预测,但它有每小时或每月的观察。在这种情况下,以下两种技术可以帮助我们根据业务目标修正频率。

上采样

这是增加采样频率的过程,例如从每周一次增加到每天一次。在下面的例子中,我们将从每月到每天对数据进行插值。Pandas 系列对象提供了一个 interpolate()函数,该函数提供了一系列简单和复杂的方法。这里我们使用线性方法。

让我们将线性插值数据可视化。

我们可以尝试另一种流行的插值方法,即多项式或样条来连接值。我们必须指定多项式中的项数。

我们可以想象新的情节,这创造了更多的曲线,看起来更自然。

向下采样

降低采样频率,例如从每天一次降低到每周一次。销售数据是月度的,但业务需要季度预测。让我们根据业务需求对数据进行重新采样。

可视化重新采样的数据。

5.电力转换

数据转换是机器学习问题中一种常用的方法,用于提炼原始特征以提高它们的重要性。类似地,在时间序列预测中,我们使用各种数学变换去除噪声并改善信号。

在这一节中,我们将首先使用随机生成的数据讨论这些技术,然后将该技术应用于开源数据。

多项式变换

具有二次或三次增长趋势的时间序列可以通过将原始数据转换为平方根或立方根来实现线性。

我们用三次函数随机生成一个数列,检查一下变换效果。

现在,将这些数据转换成立方根,我们可以观察到这个系列看起来是正态分布的。

对数变换

有时我们会遇到具有更极端趋势的数据,更好的说法是指数趋势,这样的时间序列数据可以通过取原始值的对数而变成线性。这称为对数变换。

让我们使用下面的代码从指数分布中生成数据。

同样,我们可以通过取原始值的自然对数将这些数据转换回线性。

博克斯-考克斯

在现实生活中,我们经常会遇到没有明确趋势的观察结果,在得出适当的转换方法之前,必须测试不同的转换。幸运的是,我们有这种统计技术来分析给定的序列,并根据下面的 lambda 值自动执行最合适的转换。这些是 lambda 和相应变换的一些常见值。

常见的 Box-Cox 变换

首先,我们将根据我们的直觉手动转换,接下来,我们将使用 box-cox 转换并查看差异。

手动转换

在可视化原始线图后,我们假设取一个对数将是一个理想的变换,并指定λ= 0。我们可以看看对数转换的时间序列图。

Box-Cox 变换

现在,我们将依靠 Box-Cox 来选择一个理想的 lambda 并对其进行相应的转换。

我们可以看到 lambda 值接近 0,该图看起来也类似于手动转换,但仔细观察直方图,我们可以看到新的直方图看起来更正常。

6.探索时间结构

我们已经探索并准备了时间序列数据,进行了必要的转换,现在是时候研究时间结构了,包括数据的预测能力。

白噪声

这是时间序列预测中的一个重要概念。如果序列是白噪声,这只是一系列随机数,无法预测。

要检测白噪声,必须调查以下条件。

  • 检查序列是否有零均值
  • 检查方差是否随时间保持不变
  • 检查滞后值的相关性是否为 0

让我们探索一下可以帮助我们检测白噪声的统计工具。

  1. 汇总统计:检查和比较不同时间间隔的整个时间序列的平均值和方差。
  2. 折线图:折线图会给我们一个关于不一致均值和方差随时间变化的基本概念。
  3. 自相关图:检查滞后观测值之间的相关性强度。

我们将使用合成创建的白噪声时间序列数据来讨论上述工具。我们将使用均值为 0、标准差为 1 的高斯分布来创建这个变量。

现在,查看汇总统计数据,均值接近 0,标准差为 1,这在本例中是意料之中的。在现实生活中,查看该摘要后,系列可以分布在多个子系列中,并且可以比较各自的统计数据,以发现一段时间内均值和方差的任何不一致性。

接下来我们来看这个数据的折线图,它看起来不像任何时间序列,这只是随机数的集合。

带有钟形曲线的直方图证实了均值为 0、方差为 1 的高斯分布。同样,我们可以验证不同时间间隔的分布。

最后,我们可以使用自相关图来研究滞后观测值之间的相关性强度。

我们可以看到滞后观测值之间没有关联。因此,我们可以得出结论,这个序列是白噪声,不能很好地预测。

随机游动

让我们讨论另一个概念,它可以帮助我们理解时间序列预测的可预测性。随机游走是一系列从一个时间段(t)到下一个时间段(t+1)的变化是随机的。有一种误解认为随机漫步是一个类似白噪声的随机数序列。让我们看看这有什么不同。

用于生成随机游走的过程强制从一个时间步长到下一个时间步长的相关性,我们可以通过以下等式来理解这种相关性,其中 X(t)是序列中的下一个值,X(t-1)是前一个时间步长的值,e(t)是下一个时间步长的白噪声。

X(t) = X(t-1) + e(t)

让我们通过麻省理工学院的网站来理解这一点。

要理解最简单的随机行走是一维行走。假设下面的黑点位于一条数字线上。黑点从中心开始。

https://www . MIT . edu/~ kardar/teaching/projects/chemotization(Andrea Schmidt)/random . htm

然后,它以相等的概率向前或向后迈一步。它每次都向前或向后迈进一步。让我们称第一步为 a₁,第二步为 a₂,第三步为 a₃,依此类推。每个“a”要么等于+1(如果向前一步),要么等于-1(如果向后一步)。下图是一个黑点,走了 5 步,最后在数轴上-1 结束。

https://www . MIT . edu/~ kardar/teaching/projects/chemotization(Andrea Schmidt)/random . htm

现在,我们将使用相同的方法模拟随机行走,并将这些观察结果绘制在一条线上。

我们可以看到这个形状看起来像真实股票指数的运动。

现在,让我们探索可以帮助我们识别任何时间序列中的随机游走的工具

自相关图

我们知道随机游走是如何产生的,因此通过它的设计,我们期望与先前的观察有非常高的相关性,并且这种相关性将逐渐降低。

增强的 Dickey-Fuller 检验,以确认序列的非平稳性

随机游走被创建的方式,期望序列是不稳定的,即,均值和方差随时间的不一致性。

该检验的无效假设是时间序列是非平稳的。检验统计量是正的,远远高于临界值,这意味着我们将不得不拒绝时间序列是非平稳结构的零假设。

我们可以通过一阶差分使时间序列平稳,然后再分析其特征。

这种差异线图还表明,除了一系列随机数之外,没有其他信息可供使用。

最后,我们可以通过自相关图看到模式,并确认滞后观测值之间没有关系。

我们已经看到随机漫步也像白噪声一样不可预测;我们可以做出的最佳预测是使用前一个时间步长的值来预测下一个时间步长,因为我们知道下一个时间步长是前一个时间步长的函数。这种预测方法也被称为天真预测,

分解时间序列

我们在本文开始时讨论了时间序列的四个组成部分(水平、趋势、季节性和噪声),在这一部分,我们将探索自动分解工具。

我们知道时间序列是这四个部分的组合,通过分解,我们将时间序列分解成这些单独的部分,以便更好地理解数据并选择正确的预测方法。

Statsmodels 库在一个名为 seasonal_decompose()的函数中提供了简单的或者经典的分解方法的实现。它要求我们指定模型是加法模型还是乘法模型。我们应该在仔细检查了线图之后指定这个信息。

加法分解

我们可以随机生成一个具有线性增长趋势的时间序列,并将其分解为一个可加模型。让我们看看下面的例子,我们可以看到趋势成分是序列中最主要的成分,没有季节性。残差图显示零噪声,我们的简单方法可能没有分离噪声,我们可以测试一些高级方法,如 STL 分解。

乘法分解

以下示例将航班乘客数据集分解为一个乘法模型。

我们可以看到,从序列中提取的趋势和季节性信息似乎是合理的,数据中也有噪声,从图中可以观察到序列早期和后期的高可变性时期。

摘要

我们试图为时间序列预测问题建立一个坚实的基础。我们学习了时间序列的基础知识,并通过可视化发现见解和差异,如何纠正一些数据差异,以及通过特征工程和功率转换优化时间序列数据以实现准确预测。

虽然我们使用单变量时间序列讨论了所有的技术,但是这些技术可以容易地应用于多变量时间序列预测问题。

感谢您的阅读,希望您发现这篇文章内容丰富。在接下来的几篇文章中,我将讨论不同的预测技术,我将从经典技术开始。

参考

[1] Galit Shmueli 和 Kenneth Lichtendahl,实用时间序列预测与 R:实践指南,2016 年。

*2杰森·布朗利,【https://machinelearningmastery.com/ *

* [## 随机漫步

随机漫步一维数学什么是随机漫步?随机漫步是这样一个过程…

www.mit.edu](https://www.mit.edu/~kardar/teaching/projects/chemotaxis(AndreaSchmidt)/random.htm)*

时间序列预测和因果分析与脸书先知和谷歌因果影响

原文:https://towardsdatascience.com/time-series-forecasting-and-causal-analysis-in-r-with-facebook-prophet-and-google-causalimpact-22046fbcb49a?source=collection_archive---------38-----------------------

蒙特利尔犯罪预测与 COVID 锁定影响的联合研究

这篇文章将是我每年 R 潜水的一部分;想法将是在时间序列预测和因果推断中使用两个 R 库。

我想写一篇文章已经很久了,但是我从来没有找到时间/资源来写它,主要是因为我缺少一个真正的数据集来写它,但是猜猜 2020 年是哪一年来拯救我。从经济死亡率的角度来看,在此次 COVID /封锁期间,该事件对我们社会的大部分影响是负面的。不过,我在想蒙特利尔封锁期间。在人群中可能有一些与病毒传播无关的积极影响(例如,比人们烘烤更多)。我的研究引导我找到了多个数据集,但最吸引我眼球的是蒙特利尔的犯罪活动。

这篇文章的观点是:

  • 深入数据集
  • 使用脸书先知构建 2019 年的犯罪预测器
  • 评估锁定对有因果影响的犯罪的影响

这篇文章的所有代码都可以在这个 资源库 Github 中找到。

数据探索

这个实验用的数据集是这里(不好意思说英语的,数据挺公开的从网站上的描述,在license Creative Commons CC-BY 4.0下);这是 2015 年至 2020 年 8 月间所有犯罪的清单。每起犯罪都与大的类别相关联,并且有关于地点、一天中的时刻等信息。

很快就有了蒙特利尔每天犯罪数量的图表。

图来自作者

时间序列有点嘈杂,但我们可以注意到信号的某种趋势,随着时间的推移,信号逐渐减弱,这在周线视觉中更加明显。

图来自作者

从这个角度来看,蒙特利尔的犯罪似乎没有季节性(比如夏天的犯罪比冬天多)。

数据集上的犯罪类别有:

  • 车辆盗窃
  • 恶作剧
  • 抢劫
  • 车内/车上盗窃
  • 闯入
  • 谋杀

有一个关于不同种类的犯罪随时间演变的次要情节。

图来自作者

对不同类别没有真正的季节性影响,但值得注意的是,每年的下降似乎是由车内/车上盗窃、恶作剧和闯入造成的。

对于本文的下一步,我们将关注每周犯罪,以便于分析。

脸书先知图书馆的时间序列预测

项目《脸书先知》由脸书开发,2017 年出版;文章包含模型设计的所有细节,但主要是它应该知道的内容:

  • 建立在线性回归的基础上;这是 GAM 型号的变体。
  • 这种模型预测的输出由趋势、季节和假日分量组成,以处理信号随时间的演变。

你可以用 python 或者 R 来使用这个库,快速入门文档很好用。就设置而言,您需要对输入数据进行一点格式化(列名、格式),但这很简单。提醒一下,目标是根据 2015 年到 2018 年的数据,建立 2019 年蒙特利尔每周犯罪的预测系统。

这是建立在 Prophet 上的模型提出的预测。

图来自作者

预测看起来没那么糟糕,而且它抓住了长期下降的趋势。该模型提供了信号的高低投影。从模型中,前面提到的每个组件都是可访问的;例如,有趋势成分或季节性。

图来自作者

图来自作者

使用 Prophet,可以添加外部因素,如可能影响信号的特定事件的节日,这相对容易做到。

在 Prophet 的论文中,该模型被描述为分析师的预测系统,该系统可能没有时间浏览所设计的模型,并且可以快速构建预测系统并添加外部特征,而无需考虑模型的参数。

是时候用 Google 的因果影响包走得更远了。

谷歌影响下的因果分析

这是谷歌开发的 2015 年的一个项目;第篇文章给出了关于这个库的更多细节,但是我强烈推荐看看 Kay Brodersen(这个包的作者之一)的这篇演讲,它是如此清晰,以至于在它的基础上建立一个解释将是浪费时间。

需要记住的重要一点是,该软件包提供了以下功能

  • 通过快速添加一些特征来建立模型,从而预测时间序列
  • 评估预测和现实之间的差异;这是一个因果推断,用来估计一个事件的影响

正如在介绍中提到的,让我们用这个包来评估蒙特利尔的封锁对犯罪的影响。这个分析的协议非常简单;首先,我用数据训练了一个模型。为了进行训练,我们需要拥有与犯罪无关的特征(例如,拥有被捕人数听起来是个坏主意)。

我决定使用蒙特利尔的天气(由每周平均温度/降水量及其周方差设计),因为它似乎与犯罪无关。作为参考,NASA 有一个令人兴奋的资源叫做 NASA power ( 这些数据来自 NASA 兰利研究中心的 power 项目,该项目由 NASA 地球科学理事会应用科学计划资助,数据似乎非常开放)存储每日天气信息(感谢@juliettetroadec 的帮助)。这是一张温度和降水量平均值随时间变化的曲线图。

图来自作者

这是锁定期预测系统的一个可视化视图(从黑色垂直线开始)。

图来自作者

该软件包提供了分析预测结果与现实结果的能力,在本例中,在 2020 年 3 月 15 日到 2020 年 6 月 15 日之间,并在报告中总结比较结果。

图来自作者

从这份报告中,有意思的摘录如下:

  • 在这种情况下,相对效果是减少 29%(在 22-36%之间)
  • 测量的显著性,在这种情况下,我们可以说有 99.89%置信度的影响

我决定把分析扩展到所有的犯罪,结果就有了。

图来自作者

封锁似乎对减少恶作剧、抢劫、闯入和车辆盗窃产生了积极影响,但封锁对车辆盗窃和死亡犯罪没有影响,因此这种封锁至少有一些好处。
最后,我决定比较先知模型和因果模型的预测。

图来自作者

与预言者相比,因果影响提供了更广泛的预测范围。

结论

本文的一些要点:

  • 这是一个潜水休息极好机会;我对这种语言有某种斯德哥尔摩综合症,一开始我很讨厌,但后来开始喜欢上了
  • 禁闭也有一些好处

更严重的是,我认为应该保留的是

  • Prophet 可以直接用于建立一个简单的基线模型来预测时间序列
  • CausalImpact 包提供了快速进行影响分析的能力(对于 Pythonista,有一个 python 实现,但是它没有使用相同的模型)。
  • 有替代因果影响的方法,比如微软的Dow why软件包

我对做这个项目很感兴趣,我想我会在未来写另一篇关于时间序列预测的文章,但更多的是从各种模型的评估角度(比如 ARIMA 或 LSTM)。

这篇文章的所有代码都可以在这个 资源库 Github 中找到。

原载于 2020 年 9 月 9 日 https://www.the-odd-dataguy.com

现实生活中的时间序列预测:用 ARIMA 进行预算预测

原文:https://towardsdatascience.com/time-series-forecasting-in-real-life-budget-forecasting-with-arima-d5ec57e634cb?source=collection_archive---------3-----------------------

关于如何使用 ARIMA 进行预测的深入示例

我们被可以用时间序列来描述的现象所包围。这是一种奇特的说法,许多事情或事件可以被描述为在某个时期发生的一系列观察结果。

这听起来仍然很复杂,所以这里有几个可以用时间序列表示的“事物”的例子

  • 股票价格
  • 特定地区的天气状况
  • 家庭用电量
  • 心率监测
  • 商店的总销售额

但是时间序列不仅仅是随着时间推移而发生的事情。有几个因素造就了它们的现状:

  1. 趋势时间序列中的值是越来越高还是越来越低?
  2. 季节性数据集中是否存在受季节影响的模式?例如,在线销售是在假期增加还是冰淇淋销售在夏天增加而在冬天减少?
  3. 周期我们能看到独立于时间框架的某种变化模式吗?意义并不依附于某个季节。
  4. 不规则性还有哪些可能影响数据的随机因素?

如果我们了解这些组成部分,并有足够大的数据集,我们可以使用过去的观察,即历史数据,以及我们知道的关于时间序列的其他信息来预测它在未来的行为。比如天气预报,或者下个月的销量预测。

新年决心是件大事,因为今年才刚刚开始,这是设定目标的最佳时机。

你的新年计划是更有理财意识,所以你决定制定一个月度预算。问题是,你不知道该在哪里划线。

当然,每月的开销并不总是恒定的,但有些模式可能会在一年中出现,比如在圣诞节期间和休假时花更多的钱。

我们可以把我们的月支出想象成一个时间序列,可以用时间来衡量。

所以你开始挖掘旧的银行对账单来创建你的支出数据集。

美丽的虚拟数据

厉害!一段时间内✅的每月费用✅值

让我们预测一下!嗯…没那么快😁

慢下来,直到它停下来

为了建立一个时间序列模型,一个可以用来预测未来值的模型,数据集需要是稳定的

这意味着首先我们需要删除序列可能具有的任何趋势,这样数据集就具有以下属性:

  1. 平均值为常数
  2. 方差为常数,即时间序列中不同点的方差相同。这个性质通常被称为同质性
  3. 两个数据点之间的自协方差不依赖于时间,一个在时间 t1,另一个在时间 t2。这些数据点之间的自协方差仅取决于 t1 和 t2 之间的差异

我的时间序列是平稳的吗?

和许多数据问题一样,这个问题的答案是一个两步过程:1)绘制数据,2)测试你的假设

绘制数据

在开始任何分析之前,抽查数据并更加熟悉它是非常重要和有价值的。如果您花一些时间查看数据,您会发现更容易发现应该删除或单独分析的数据质量问题或异常值。

每月费用数据集的图表

测试你的假设

您可能无法通过简单地查看数据集来判断它是否是静止的。这种情况下,真的不好说!

这就是迪基-富勒测试可以帮助我们的地方。这是一个统计检验,其中零假设表明对于给定的序列有一个单位根,而替代假设表明序列是平稳的

像在任何其他统计测试中一样,如果 p 值小于或等于显著性水平(通常为 1%、5%或 10%),我们将拒绝零假设。让我们将显著性水平设为 1%,这样我们就可以 99%的置信度拒绝零假设。

为了使我们的时间序列稳定,p 值必须≤ 0.01。

测试时间序列是否平稳

☹️却不是这样

因此,我们必须转换数据集,并再次执行 Dickey-Fuller 测试。数学中常用的一种变换是对数变换,因为它不会影响数据的属性。这意味着我们将计算时间序列中每个数据点的对数。

对数变换后测试时间序列是否平稳

我们还没有到达那里,我们的时间序列不是静止的。

下面是我用来运行 Dickey-Fuller 测试的代码,带有进行对数变换的选项。

# log_dataset: boolean indicating if we want to log-transform the dataset before running Augmented Dickey-Fuller testdef adf_test(dataset, log_dataset):
  ds = datasetif log_dataset:
    ds = dataset.apply(lambda x: log(x))
    ds.dropna(inplace=True) result = adfuller(ds) print('Augmented Dickey-Fuller Test')
  print('test statistic: %.10f' % result[0])
  print('p-value: %.10f' % result[1])
  print('critical values') for key, value in result[4].items():
    print('\t%s: %.10f' % (key, value))

我们的时间序列仍然不是稳定的

我们已经测试了原始数据集和经过对数变换的数据集,但是我们的时间序列仍然不是静态的。

我们还有其他选择吗?我们可以应用其他技术来转换数据,而不改变其属性:

  1. 差分将每个数据点减去序列中特定时间点的值,例如,总是减去下一个周期的值
  2. 分解 这种技术将分离出开始时提到的时间序列的每个组成部分(趋势、季节性、周期、不规则性)并提供残差

在我们的例子中,我们将尝试区分数据集。

区别

因为求差是减法,所以让我们保持简单,从求每个数据点与它之前的数据点的差开始,即求连续值的差。

# data: our dataset
# column_name: column to differencepd.DataFrame(data=np.diff(np.array(data[column_name])))
n_diff_dataset.columns = [column_name]

# dropping NAN values
n_diff_dataset.dropna(inplace=True)

再次运行 Dickey-Fuller 检验,我们看到我们仍然不能以 1%的显著性水平拒绝零假设。

连续值差分后的 Dickey-Fuller 检验结果

p 值≤ 0.01。数据集是固定的🎉🎉🎉

让我们来看看平稳的时间序列。

二阶差分后的时间序列——终于平稳了!

n 阶差分和季节差分

差分后,我们的时间序列最终是平稳的。但是如果情况不是这样,我们可以继续对时间序列进行差分。

差异并不意味着你要减去 n 个前期的值,或者减去滞后值。这就是季节差异。

季节性差异

这个名字透露了一点。如果您对数据集应用季节差异,您将减去同一季节的前一个数据点。

在我们的示例中,我们处理的是月度数据,因此每年都对应于包含 12 个月的季节。因此,计算任何给定年份的一月份的季节性差异,意味着用当前值减去上一年一月份的值。

概括地说,它看起来像这样

季节性差异

在每月费用的例子中,一个季节是一年,所以 n=12

n 阶差分

这就是我们对数据集所做的,我们应用了一阶差分。这实际上意味着将时间序列中的每个数据点减去它之前的时间段中的数据点,如 lag=1。

一阶差分

但是如果我们继续保持差异呢?嗯,我们实际上只是不断区分不同之处🤯🤯🤯

在这种情况下,看数学实际上有帮助!让我们以二阶差分为例,这里我们差分两次。

二阶差分

通过查看该公式,现在更有意义,并且更容易看出n-阶差分并不意味着n 周期的滞后,而是实际执行差分运算 n

如果需要对数据集进行任意次数的微分,可以使用 numpy 中的 diff 方法并设置参数 n.

现在,回到预测📈

时间序列建模

有几种方法可以对时间序列进行建模,最常用的有:

简单移动平均线

使用这种方法,你是说预测是基于 n 个先前数据点的平均值。

指数平滑法

它以指数方式降低了先前观测的权重,因此越来越老的数据点对预测的影响越来越小。

ARIMA:自回归综合移动平均数

这是我们将要使用的方法。

ARIMA 模型可以分解成三个不同的部分,每个部分都有一个代表时间序列特征的参数。

1。自回归:AR(p)

自回归模型将随机过程解释为线性组合,因此输出变量线性依赖于其先前值和随机变量。

简而言之,这是一个基于先验值或滞后的模型。

如果你在预测一只股票的未来价格,AR 模型将会根据这只股票以前的价格做出预测。

如果我们看看数学,我们可以用参数 p 来描述 AR(p)模型:

参数 p 表示自回归项的数量,即线性组合中的项数。

2。综合:I(d)

这个名字具有误导性,但这实际上与数据集被差分的次数有关,这由参数 d 的值表示。

3。移动平均线:MA (q)

与自回归模型相似,在移动平均模型中,输出变量被解释为线性,但这次是过去误差的平均值。

综上所述, ARIMA(p,d,q) 的公式如下。

但是现在的问题是我们如何确定使用哪些参数?

ARIMA(p,d,q)的提货参数

我们已经知道需要对数据集进行多少次差分,所以参数 d 的值是 1。

但是我们还是要搞清楚 pq 的值。为此,我们将寻找自相关、AR(p)和移动平均、MA(q)曲线。

自相关(AR)曲线

这是通过测试时间序列中的数据点在不同滞后(即,在时间上的处)与其自身之间的相关性来完成的。

为此,我们将使用自相关函数图,简称 ACF 图。

利用 ACF 图,我们可以发现自相关(AR)曲线

  • ACF 数据点是正弦或指数衰减的
  • PACF 有一个尖峰信号,或几个连续的尖峰信号,然后突然切断

移动平均(MA)曲线

为了确定移动平均曲线,我们将使用 ACF 的子集,部分自相关函数图,通常称为 PACF 图。

PACF 表示不同滞后的自相关,但它移除了低阶相关,即 1 和滞后-1 之间的所有相关,因为它们之间的一切都将是内在相关的。

使用 ACF 图,我们可以发现自相关(AR)曲线,当我们看到 AR 曲线描述的反转时:

  • PACF 数据点是正弦或指数衰减的
  • ACF 有一个尖峰,或几个连续的尖峰,然后突然切断

最重要的是,图中的尖峰必须具有统计显著性,这意味着它们在置信区间的区域之外。这个置信区间要么用水平线表示,要么用面积图中的面积表示,这取决于您使用的软件。

让我们一起来看看 ACF 和 PACF 的情节。

数据集的自相关和偏自相关图

滞后= 0 时的 ACF 和 PACF 通常为 1,因为每个数据点总是与其自身相关。

分析 ACF 图,我们可以看到任何稍微超出置信带的尖峰,因此我们假设 AR(2)。

至于图,我们可以在滞后=2 处看到第一个尖峰,因此我们将选择 MA(2)。

我们有自己的模型,ARIMA(2,1,2)🙌

为了适应模型,我决定将数据集分为训练和测试子集,使用最后 30%的观察值作为测试数据。

# split dataset between training and testing
cutoff_30pct = len(y) — int(len(y)*0.3)
y_train = diff_dataset[y_col][:cutoff_30pct]
y_test = diff_dataset[y_col][cutoff_30pct:] # building the model with the parameters we've discovered and fitting it to the training set
model = arima_model.ARIMA(y_train, order=(2,1,2)) 
arima_model_fit = model.fit(disp=-1)
print(arima_model_fit.summary())

ARIMA 的结果(2,1,2)

AICBIC 值用于比较不同模型应用于同一数据集时的拟合质量。在我们的例子中,我们没有比较多个模型,所以我们不会过多关注这些值。

为了理解这个特定模型的质量,我们需要使用工具箱中的其他指标。

这个模型对我们的数据集有好处吗?

为了评估模型的质量,我们首先将预测值与测试子集中的实际值进行比较。

将实际值与预测值进行比较

从这里我们可以看到,绿色的预测值与橙色的实际值相比有些偏差。

根据整个数据集进行预测时,这一点变得更加清晰。

fig, ax = plt.subplots(figsize=(15,7))
model = arima_model.ARIMA(differenced_dataset, order=(2,1,2)) 
arima_model_fit = model_all.fit(disp=0)
# dynamic=False meaning in-sample lagged values are used for prediction
arima_all_fit.plot_predict(dynamic=False)

针对整个数据集进行预测

好吧,我们知道我们的预测有点偏差,但是偏差有多大呢?

为了了解实际值和预测值之间的差异,我们可以使用平均绝对误差。

arima_mae = mean_absolute_error(y_test.values, forecast)
print('Mean absolute error %.2f' % arima_mae)

我们的 ARIMA(2,1,2)的平均绝对误差为 235.89,这意味着这些值平均相差 235.89 个单位。

这可能意味着:

  • 没有足够的数据来做出准确的预测
  • ARIMA 参数可以进一步调整
  • ARIMA 可能不是这个问题的最佳模型,一个想法是尝试简单的线性回归或指数平滑,并比较 AIC 和 BIC

结论

在我们一直在做的例子中,数据是随机生成的,并做了一些调整来创建一个趋势,所以这个结果可能会稍微有些偏差。本文的主要目标是通过不同的步骤来拟合 ARIMA 模型。

有了真实数据,你需要在你的问题的特定背景下观察平均绝对误差和残差。

这听起来可能有点模糊,但在数据科学中,上下文和您对该问题的了解非常重要。如果你预测一家价值数百万美元的公司的月收入,相差 235 美元可能并不重要。另一方面,如果你预测一个家庭的月预算是 235 美元,那就更令人担忧了。

希望你喜欢阅读这个例子,并愉快的预测📈

感谢阅读!

基于 Python ARIMA 的许可证使用时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-on-license-usage-using-arima-with-python-c7317d13c0ac?source=collection_archive---------37-----------------------

自动化许可证使用情况收集、ML 模型的网格搜索、预测未来使用情况、在达到阈值之前发出警报

克里斯·利维拉尼在 Unsplash 上的照片

假设你需要买卫生纸。你会怎么做?你不是每天都买,可能一个月一次,甚至三个月一次。你不希望你买的太少,很快就需要再买。不希望你买太多,堆很多马桶。那你会怎么做?

首先,你会检查可用的卫生纸数量,然后你会预测你一个月会用多少,并购买相应数量的卫生纸。听起来是不是很熟悉的过程?是的,它是。许多公司重复这一过程进行采购。电信公司需要定期购买的常见项目之一是许可证。

摄盒装水更好Unsplash

背景:许可证购买

在移动网络中,有各种执行特定网络功能的网络元件。每个网络元件具有许多许可证控制的项目,以限制特定资源的功能和容量。例如,电信供应商将控制 LTE 附加用户的数量,即可以连接到移动网络的手机数量。如果运营商想要同时服务更多的用户,他们必须从他们的供应商那里购买相应的许可证。就像卫生纸,用完了就需要重新买。然而,在移动运营商内部,标准的购买程序可能很漫长,需要花费几个月的时间。因此,作为一个工程部门,当我们从供应商那里购买许可证时,我们需要精确地预测几个月后许可证的使用情况。

以前的工作流程

在过去,首先,我们手动收集许可证使用记录。设备供应商通常提供一个 GUI,在其中我们可以根据他们自己的人机语言(MML)语法键入命令,以在屏幕上显示当前的许可证使用情况。然后我们把信息复制下来,以 Excel 的形式保存下来。这是一项令人讨厌的工作,有时负责人员可能会忘记显示或 Excel 文件损坏。我们也不能经常这样做,因为太耗费人力了。

项目前的手动程序

幸运的是,设备供应商还允许我们 telnet 到一台叫做网络管理系统(NMS)的机器上。我们可以键入特殊的命令来与它下面的不同网络元素进行交互。

显示许可证使用情况的 MML 命令

新的自动化工作流程

为了自动化这个过程,我们使用 python 库包 telnetlib 来收集许可证使用情况。telnetlib模块提供了实现 Telnet 协议的Telnet类。使用tn = Telnet(NMS_IP, NMS_Port)建立连接后,我们可以使用tn.write()功能发送命令。我定义了一个发送命令的函数,如下所示。

发送命令功能

获取您需要的许可证数据的流程是,首先,您需要登录到 NMS,然后您需要注册您想要检查的网元,如下所示:

登录并注册网元

当我们键入显示许可证使用情况所需的命令时,系统会返回一个文本表格,我们将每行分成两个空格。然后,我们将每一行作为一个元组添加到一个名为 data 的列表中。

发送命令以获取许可证使用数据

然后我们将输出结果解码成有用的数据帧。我们将数据库表设计为遍历的,因为如果网络元素已经升级,可能会添加或删除许可证项目。每次修改表模式是不可行的:首先,每周在不同的网络元件上有几次升级,其次,我们不能知道先前的升级添加或移除了哪些许可项目。我们最终确定了以下栏目:

result_time :采集时间; object _ name:网元的名称; 资源名称 :许可项目名称; total _ resource:许可证容量,即该许可证允许的最大数量; used _ resource:该时刻许可项的占用量; 用法 :简单用 _ 资源除以总 _ 资源。

这种结构能够在不改变数据库模式的情况下添加或删除任意许可项。

(注:这是一项繁琐的工作,因为每个网络元素都有其命令和显示格式。我们需要一个一个定制。)

最后,我们收集了所有许可证项目!总共超过 60 个网络元素中的 1742 个不同项目。

许可证使用自动化和人工智能预测的整个工作流程

预测许可证使用情况

有了数据后,我们现在可以使用 ARIMA 模型进行预测。ARIMA(自回归综合移动平均)是一种用于分析和预测时间序列数据的机器学习模型。这符合我们预测依赖于时间的许可证使用的目的。更多细节可以在这篇文章中找到:如何用 Python 创建 ARIMA 时间序列预测模型作者杰森·布朗利

[## 如何用 Python 创建用于时间序列预测的 ARIMA 模型

一个流行的和广泛使用的时间序列预测的统计方法是 ARIMA 模型。ARIMA 是…的首字母缩写

machinelearningmastery.com](https://machinelearningmastery.com/arima-for-time-series-forecasting-with-python/)

我们使用 StatsModels 执行网格搜索,从总共 63 个组合中找到(p,d,q)的最佳参数集。

p = [0,1,2,4,6,8,10]
d = [0,1,2]
q = [0,1,2]

我们对 60 个网络元素和 1742 个许可证进行了循环,并运行了近一周的网格搜索!

用于网格搜索的代码

之后,我们有了每个许可证的最佳参数,并每天进行预测。过去,我们只能选择一些重要的许可证项目,并且只能预测每个季度的使用情况,这令人难以置信。但是现在,我们可以每天预测我们的许可证使用情况,并在许可证使用出现危险时向我们发出警报。

网络容量许可证使用的仪表板

如果许可证使用率在 1 个月内达到 80%,我们会收到红色警报。必须立即采取行动。否则,如果许可证使用率在 3 个月内达到 80 %,它将发出橙色警报,最后,如果使用率在 6 个月内达到 80%,我们将收到黄色警报。

结论

这个项目极大地减少了我们收集许可证使用数据的工作量,我们建立了一个提醒系统,提醒我们在许可证用完之前购买它。

要了解这个项目的更多信息,请点击查看我的 Github 链接

时间序列预测:使用 ARIMA 模型预测股票价格

原文:https://towardsdatascience.com/time-series-forecasting-predicting-stock-prices-using-an-arima-model-2e3b3080bd70?source=collection_archive---------0-----------------------

在这篇文章中,我将向你展示如何使用预测 ARIMA 模型来预测特斯拉的股票价格

ARIMA 模型在测试集上的性能

1.介绍

1.1.时间序列和预测模型

时间序列预测模型是能够根据以前的 观测值****来预测** 未来值的模型。时间序列预测广泛用于非平稳数据非平稳数据被称为其统计属性(如平均值和标准偏差)不随时间保持不变,而是随时间变化的数据。**

这些非平稳输入数据(用作这些模型的输入)通常被称为时间序列。时间序列的一些例子包括随时间变化的温度值、随时间变化的股票价格、随时间变化的房屋价格等。因此,输入是一个信号(时间序列),它是由在时间上连续进行的观察所定义的。****

时间序列是按时间顺序进行的一系列观察。

时间序列的一个例子。作者用 Python 创作的情节。

****观察:时序数据记录在离散时间刻度时间刻度上。

****免责声明:已经有人尝试使用时间序列分析算法来预测股票价格,尽管它们仍然不能用于在真实市场中下注。这只是一篇教程文章,并不打算以任何方式“指导”人们购买股票。

2.自回归综合移动平均(ARIMA)模型

用于时间序列预测的一种著名且广泛使用的预测方法是自回归综合移动平均(ARIMA)** 模型。 ARIMA 模型能够捕捉时间序列数据中一套不同的标准时间结构。**

术语

让我们来分解这些术语:

  • ****AR:<>表示模型使用一个观测值和一些预定义数量的滞后观测值(也称为“时间滞后”或“滞后”)之间的依赖关系。
  • I: < Integrated > 是指该模型采用原始观测值的差分(例如,它从前一时间步的一个观测值中减去一个观测值),以使时间序列平稳。马**:**
  • MA:<>表示模型利用了残差与观测值之间的关系。****

模型参数

标准 ARIMA 模型期望 3 个自变量作为输入参数,即 p、d、q

  • p 是滞后观测值的**个数。**
  • d 是差分的**度。**
  • q 是移动平均线窗口的**大小/宽度。**

如果你想在交互式路线图和活跃的学习社区的支持下自学数据科学,看看这个资源:https://aigents.co/learn

3.获取股票价格历史数据

感谢雅虎财经 T21,我们可以免费得到数据。使用以下链接获取特斯拉:https://finance.yahoo.com/quote/TSLA/history?的股价历史周期 1=1436486400 &周期 2=1594339200 &间隔=1d &过滤器=历史&频率=1d

您应该看到以下内容:

点击下载并保存。csv** 文件本地保存在您的计算机上。**

数据是从 2015 到现在( 2020 )!

4.Python 工作示例

所需模块:Numpy,Pandas, Statsmodels ,Scikit-Learn

4.1。加载&检查数据

我们的进口:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
from pandas.plotting import lag_plot
from pandas import datetime
from statsmodels.tsa.arima_model import ARIMA
from sklearn.metrics import mean_squared_error

现在让我们加载特斯拉股票历史数据:

df = pd.read_csv("TSLA.csv")
df.head(5)

  • 我们的目标变量将是关闭值。

在建立 ARIMA 模型之前,让我们看看我们的数据中是否有一些交叉相关。

plt.figure()
lag_plot(df['Open'], lag=3)
plt.title('TESLA Stock - Autocorrelation plot with lag = 3')
plt.show()

特斯拉股票-滞后= 3 的自相关图

我们现在可以确认 ARIMA 将是一个适用于这种类型数据的好模型(数据中存在自相关)。

最后,让我们用来描绘股价随时间的演变。****

plt.plot(df["Date"], df["Close"])
plt.xticks(np.arange(0,1259, 200), df['Date'][0:1259:200])
plt.title("TESLA stock price over time")
plt.xlabel("time")
plt.ylabel("price")
plt.show()

4.2。建立预测 ARIMA 模型

接下来,让我们的数据分成一个训练** (70 %)和测试 (30%)的集合。对于本教程,我们选择以下 ARIMA 参数:p=4,d=1,q=0。**

train_data, test_data = df[0:int(len(df)*0.7)], df[int(len(df)*0.7):]training_data = train_data['Close'].values
test_data = test_data['Close'].valueshistory = [x for x **in** training_data]
model_predictions = []
N_test_observations = len(test_data)for time_pointin range(N_test_observations):
    model = ARIMA(history, order=(4,1,0))
    model_fit = model.fit(disp=0)
    output = model_fit.forecast()
    yhat = output[0]
    model_predictions.append(yhat)
    true_test_value = test_data[time_point]
    history.append(true_test_value)MSE_error = mean_squared_error(test_data, model_predictions)
print('Testing Mean Squared Error is {}'.format(MSE_error))

守则摘要

  • 我们将训练数据集分为训练集和测试集,并使用训练集来拟合模型,并为测试集上的每个元素生成预测。****
  • 考虑到差分和 AR 模型对先前时间步观测值的依赖性,需要一个滚动预测程序。为此,我们在收到每个新的观察结果后重新创建 ARIMA 模型。
  • 最后,我们在一个名为历史的列表中手动跟踪所有的观察值,该列表以训练数据为种子,并且在每次迭代中向其追加新的观察值。

检验的均方误差为 7。38860 . 68686886861

测试集的 MSE 相当大,表明精确预测是一个困难的问题。但是,这是所有测试集预测的平均平方值。让我们可视化预测,以更好地理解模型的性能。

test_set_range = df[int(len(df)*0.7):].indexplt.plot(test_set_range, model_predictions, color='blue', marker='o', linestyle='dashed',label='Predicted Price')plt.plot(test_set_range, test_data, color='red', label='Actual Price')plt.title('TESLA Prices Prediction')
plt.xlabel('Date')
plt.ylabel('Prices')
plt.xticks(np.arange(881,1259,50), df.Date[881:1259:50])
plt.legend()
plt.show()

ARIMA 模型在测试集上的性能

没那么糟吧?

我们的 ARIMA 模型产生了可观的结果。就训练/拟合时间和复杂性而言,该模型提供了良好的预测准确性,并且与其他替代方案相比相对较快。

那都是乡亲们!希望你喜欢这篇文章!

敬请关注并支持这一努力

如果你喜欢这篇文章,并且觉得它有用,那么关注我就可以看到我所有的新帖子。

有问题吗?把它们作为评论贴出来,我会尽快回复。

您可能也会喜欢我以前的文章:

LSTM 时间序列预测:利用 LSTM 模型预测股票价格

** [## LSTM 时间序列预测:使用 LSTM 模型预测股票价格

在这篇文章中,我将向你展示如何使用预测 LSTM 模型来预测股票价格

towardsdatascience.com](/lstm-time-series-forecasting-predicting-stock-prices-using-an-lstm-model-6223e9644a2f)

时间序列预测:利用脸书先知模型预测股票价格

[## 时间序列预测:用脸书的先知模型预测股票价格

使用可从《先知脸书》公开获得的预测模型预测股票价格

towardsdatascience.com](/time-series-forecasting-predicting-stock-prices-using-facebooks-prophet-model-9ee1657132b5)

参考

[1]https://en . Wikipedia . org/wiki/auto regressive _ integrated _ moving _ average

其他员额

[## 最佳免费数据科学资源:免费书籍和在线课程

最有用的免费书籍和在线课程,适合想了解更多数据科学知识的人。

medium.com](https://medium.com/@seralouk/the-best-free-data-science-resources-free-books-online-courses-9c4a2df194e5) [## 用新冠肺炎假设的例子解释 ROC 曲线:二分类和多分类…

在这篇文章中,我清楚地解释了什么是 ROC 曲线以及如何阅读它。我用一个新冠肺炎的例子来说明我的观点,我…

towardsdatascience.com](/roc-curve-explained-using-a-covid-19-hypothetical-example-binary-multi-class-classification-bab188ea869c) [## 支持向量机(SVM)解释清楚:分类问题的 python 教程…

在这篇文章中,我解释了支持向量机的核心,为什么以及如何使用它们。此外,我还展示了如何绘制支持…

towardsdatascience.com](/support-vector-machines-svm-clearly-explained-a-python-tutorial-for-classification-problems-29c539f3ad8) [## PCA 清楚地解释了——如何、何时、为什么使用它以及特性的重要性:Python 指南

在这篇文章中,我解释了什么是 PCA,何时以及为什么使用它,以及如何使用 scikit-learn 在 Python 中实现它。还有…

towardsdatascience.com](/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e) [## 关于 Python 中的最小-最大规范化,您需要知道的一切

在这篇文章中,我将解释什么是最小-最大缩放,什么时候使用它,以及如何使用 scikit 在 Python 中实现它

towardsdatascience.com](/everything-you-need-to-know-about-min-max-normalization-in-python-b79592732b79) [## Scikit-Learn 的标准定标器如何工作

在这篇文章中,我将解释为什么以及如何使用 scikit-learn 应用标准化

towardsdatascience.com](/how-and-why-to-standardize-your-data-996926c2c832)**

时间序列预测:使用 LSTM 模型预测股票价格

原文:https://towardsdatascience.com/time-series-forecasting-predicting-stock-prices-using-an-lstm-model-d0056cd5e055?source=collection_archive---------15-----------------------

在这篇文章中,我将向你展示如何使用预测 LSTM 模型来预测股票价格

作者创作的人物。

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

1.介绍

1.1.时间序列和预测模型

传统上,大多数机器学习(ML)模型使用一些观察值(样本/例子)作为输入特征,但是在数据中没有时间 维度

时间序列预测模型是能够根据先前 观测 预测 未来值的模型。时间序列预测广泛用于非平稳数据非平稳数据被称为其统计属性(如平均值和标准偏差)不随时间保持不变,而是随时间变化的数据。

这些非平稳输入数据(用作这些模型的输入)通常被称为时间序列。时间序列的一些例子包括随时间变化的温度值、随时间变化的股票价格、随时间变化的房屋价格等。因此,输入是一个信号(时间序列),它是由在时间中连续进行的观察定义的

时间序列是按时间顺序进行的一系列观察。

时间序列的一个例子。作者用 Python 创作的情节。

观察:时序数据记录在离散 时间 刻度上。

免责声明(在我们继续之前):已经有人尝试使用时间序列分析算法来预测股票价格,尽管它们仍然不能用于在真实市场中下注。这只是一篇教程文章,并不打算以任何方式“指导”人们购买股票。

2.LSTM 模式

长短期记忆 ( LSTM )是一种用于深度学习领域的人工递归神经网络(RNN)架构。与标准的前馈神经网络不同,LSTM 有反馈连接。它不仅可以处理单个数据点(例如图像),还可以处理整个数据序列(例如语音或视频输入)。

LSTM 型号能够储存一段时间的信息。

换句话说,它们有记忆能力。记住 LSTM 代表长短期记忆模型。

当我们处理时间序列或顺序数据时,这个特性是非常有用的。当使用 LSTM 模型时,我们可以自由决定存储什么信息,丢弃什么信息。我们使用“门”来实现。对 LSTM 的深入理解超出了这篇文章的范围,但是如果你有兴趣了解更多,看看这篇文章末尾的参考资料。

如果你想在交互式路线图和活跃的学习社区的支持下自学数据科学,看看这个资源:https://aigents.co/learn

3.获取股票价格历史数据

感谢雅虎财经我们可以免费获得的数据。使用以下链接获取特斯拉的股价历史记录:https://finance.yahoo.com/quote/TSLA/history?周期 1=1436486400 &周期 2=1594339200 &间隔=1d &过滤器=历史&频率=1d

您应该看到以下内容:

点击下载并保存。csv 文件本地保存在您的计算机上。

数据从 2015 到现在( 2020 )!

4.Python 工作示例

需要的模块:Keras,Tensorflow,Pandas,Scikit-Learn & Numpy

我们将构建一个多层 LSTM 递归神经网络预测一系列值中的最后一个值,即本例中的特斯拉股票价格。

加载数据检查它们:

import math
import matplotlib.pyplot as plt
import keras
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from keras.layers import *
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
from keras.callbacks import EarlyStoppingdf=pd.read_csv("TSLA.csv")
print(‘Number of rows and columns:’, df.shape)
df.head(5)

上述代码的输出

下一步是数据分割成训练测试集合,以避免过度拟合,并能够调查我们模型的泛化能力。要了解更多关于过度拟合的信息,请阅读本文:

[## 你的模型是否过拟合?或者不合身?python 中使用神经网络的示例

过拟合,欠拟合,泛化能力,交叉验证。一切都简单解释了。我还提供了一个…

towardsdatascience.com](/is-your-model-overfitting-or-maybe-underfitting-an-example-using-a-neural-network-in-python-4faf155398d2)

要预测的目标值将是“收盘时的股价值。

training_set = df.iloc[:800, 1:2].values
test_set = df.iloc[800:, 1:2].values

模型 拟合之前,归一化数据不失为一个好主意。这将提高性能。您可以在此阅读更多关于最小-最大缩放器的信息:

[## 关于 Python 中的最小-最大规范化,您需要知道的一切

在这篇文章中,我将解释什么是最小-最大缩放,什么时候使用它,以及如何使用 scikit 在 Python 中实现它

towardsdatascience.com](/everything-you-need-to-know-about-min-max-normalization-in-python-b79592732b79)

让我们构建具有 1 天滞后时间(滞后 1)的输入要素:

# Feature Scaling
sc = MinMaxScaler(feature_range = (0, 1))
training_set_scaled = sc.fit_transform(training_set)# Creating a data structure with 60 time-steps and 1 output
X_train = []
y_train = []
for i in range(60, 800):
    X_train.append(training_set_scaled[i-60:i, 0])
    y_train.append(training_set_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
#(740, 60, 1)

现在我们已经将数据整形为以下格式(#值、#时间步长、#1 维输出)。

现在,该建立模型了。我们将建立有 50 个神经元的 LSTM4 个隐含层。最后,我们将在输出层分配 1 个神经元用于预测标准化的股票价格。我们将使用 MSE 损失函数和 Adam 随机梯度下降优化器。

注意:以下需要一些时间(~ 5 分钟)。

model = Sequential()#Adding the first LSTM layer and some Dropout regularisation
model.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
model.add(Dropout(0.2))# Adding a second LSTM layer and some Dropout regularisation
model.add(LSTM(units = 50, return_sequences = True))
model.add(Dropout(0.2))# Adding a third LSTM layer and some Dropout regularisation
model.add(LSTM(units = 50, return_sequences = True))
model.add(Dropout(0.2))# Adding a fourth LSTM layer and some Dropout regularisation
model.add(LSTM(units = 50))
model.add(Dropout(0.2))# Adding the output layer
model.add(Dense(units = 1))# Compiling the RNN
model.compile(optimizer = 'adam', loss = 'mean_squared_error')# Fitting the RNN to the Training set
model.fit(X_train, y_train, epochs = 100, batch_size = 32)

装配完成后,您应该会看到类似这样的内容:

准备测试数据(重塑它们):

# Getting the predicted stock price of 2017
dataset_train = df.iloc[:800, 1:2]
dataset_test = df.iloc[800:, 1:2]dataset_total = pd.concat((dataset_train, dataset_test), axis = 0)inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].valuesinputs = inputs.reshape(-1,1)
inputs = sc.transform(inputs)
X_test = []
for i in range(60, 519):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))print(X_test.shape)
# (459, 60, 1)

使用测试集进行预测

predicted_stock_price = model.predict(X_test)
predicted_stock_price = sc.inverse_transform(predicted_stock_price)

现在让我们来看看结果:

# Visualising the results
plt.plot(df.loc[800:, ‘Date’],dataset_test.values, color = ‘red’, label = ‘Real TESLA Stock Price’)
plt.plot(df.loc[800:, ‘Date’],predicted_stock_price, color = ‘blue’, label = ‘Predicted TESLA Stock Price’)
plt.xticks(np.arange(0,459,50))
plt.title('TESLA Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('TESLA Stock Price')
plt.legend()
plt.show()

5.结果

使用滞后 1(即一天的步长):

观察:2020 年 3 月因新冠肺炎封锁而大幅下跌!

我们可以清楚地看到,我们的模型表现得非常好。它能够准确地跟踪大多数不可接受的上涨/下跌,但是,对于最近的日期戳,我们可以看到,与股票价格的实际值相比,模型预期(预测)的值较低。

关于滞后的一个注记

本文中最初选择的延迟为 1,即使用 1 天的步长。这可以通过修改构建 3D 输入的代码来轻松改变。

示例:可以更改以下两个代码块:

X_train = []
y_train = []
for i in range(60, 800):
    X_train.append(training_set_scaled[i-60:i, 0])
    y_train.append(training_set_scaled[i, 0])

X_test = []
y_test = []
for i in range(60, 519):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

采用以下新代码:

X_train = []
y_train = []
for i in range(60, 800):
    X_train.append(training_set_scaled[i-50:i, 0])
    y_train.append(training_set_scaled[i, 0])

X_test = []
y_test = []
for i in range(60, 519):
    X_test.append(inputs[i-50:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

在这种情况下,结果如下所示:

那都是乡亲们!希望你喜欢这篇文章!

看看我在另一篇文章中用来预测谷歌股价的脸书先知模型。

[## 时间序列预测:用脸书的先知模型预测股票价格

使用可从《先知脸书》公开获得的预测模型预测股票价格

towardsdatascience.com](/time-series-forecasting-predicting-stock-prices-using-facebooks-prophet-model-9ee1657132b5)

也可以看看我最近用 ARIMA 模型写的文章:

[## 时间序列预测:使用 ARIMA 模型预测股票价格

在这篇文章中,我将向你展示如何使用预测 ARIMA 模型来预测特斯拉的股票价格

towardsdatascience.com](/time-series-forecasting-predicting-stock-prices-using-an-arima-model-2e3b3080bd70)

参考

[1]https://colah.github.io/posts/2015-08-Understanding-LSTMs/

2https://en.wikipedia.org/wiki/Long_short-term_memory

敬请关注并支持这一努力

如果你喜欢这篇文章并且觉得它有用,关注我就可以看到我所有的新帖子。

有问题吗?把它们作为评论贴出来,我会尽快回复。

最新帖子

[## 时间序列预测:用脸书的先知模型预测股票价格

使用可从《先知脸书》公开获得的预测模型预测股票价格

towardsdatascience.com](/time-series-forecasting-predicting-stock-prices-using-facebooks-prophet-model-9ee1657132b5) [## 最佳免费数据科学资源:免费书籍和在线课程

最有用的免费书籍和在线课程,适合想了解更多数据科学知识的人。

medium.com](https://medium.com/@seralouk/the-best-free-data-science-resources-free-books-online-courses-9c4a2df194e5) [## 用新冠肺炎假设的例子解释 ROC 曲线:二分类和多分类…

在这篇文章中,我清楚地解释了什么是 ROC 曲线以及如何阅读它。我用一个新冠肺炎的例子来说明我的观点,我…

towardsdatascience.com](/roc-curve-explained-using-a-covid-19-hypothetical-example-binary-multi-class-classification-bab188ea869c) [## 支持向量机(SVM)解释清楚:分类问题的 python 教程…

在这篇文章中,我解释了支持向量机的核心,为什么以及如何使用它们。此外,我还展示了如何绘制支持…

towardsdatascience.com](/support-vector-machines-svm-clearly-explained-a-python-tutorial-for-classification-problems-29c539f3ad8) [## PCA 清楚地解释了——如何、何时、为什么使用它以及特性的重要性:Python 指南

在这篇文章中,我解释了什么是 PCA,何时以及为什么使用它,以及如何使用 scikit-learn 在 Python 中实现它。还有…

towardsdatascience.com](/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e) [## 关于 Python 中的最小-最大规范化,您需要知道的一切

在这篇文章中,我将解释什么是最小-最大缩放,什么时候使用它,以及如何使用 scikit 在 Python 中实现它

towardsdatascience.com](/everything-you-need-to-know-about-min-max-normalization-in-python-b79592732b79) [## Scikit-Learn 的标准定标器如何工作

在这篇文章中,我将解释为什么以及如何使用 scikit-learn 应用标准化

towardsdatascience.com](/how-and-why-to-standardize-your-data-996926c2c832)

和我联系

时间序列预测:用脸书的先知模型预测股票价格

原文:https://towardsdatascience.com/time-series-forecasting-predicting-stock-prices-using-facebooks-prophet-model-9ee1657132b5?source=collection_archive---------4-----------------------

在这篇文章中,我将向你展示如何使用脸书数据科学团队公开发布的预测模型来预测股票价格

作者用 Python 创建的图。

1.介绍

1.1.时间序列和预测模型

传统上,大多数机器学习(ML)模型使用一些观察值(样本/实例)作为输入特征,但数据中没有时间 维度

时间序列预测模型是能够根据先前 观测 预测 未来值的模型。时间序列预测广泛用于非平稳数据非平稳数据被称为统计属性(如平均值和标准偏差)不随时间保持不变,而是随时间变化的数据。

这些非平稳输入数据(用作这些模型的输入)通常被称为时间序列。时间序列的一些例子包括随时间变化的温度值、随时间变化的股票价格、随时间变化的房屋价格等。因此,输入是一个信号(时间序列),它是由在时间中连续获得的观察值定义的。

时间序列是按时间顺序进行的一系列观察。

时间序列的一个例子。作者用 Python 创作的情节。

观察:时序数据记录在离散时间刻度时间刻度上。

免责声明(在我们继续之前):已经有人尝试使用时间序列分析算法来预测股票价格,尽管它们仍然不能用于在真实市场中下注。这只是一篇教程文章,并不打算以任何方式“指导”人们购买股票。

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

如果你想在交互式路线图和活跃的学习社区的支持下自学数据科学,看看这个资源:https://aigents.co/learn

1.2 预测模型:脸书的预言家

最常用的预测模型是 自回归 模型。简而言之,自回归模型规定输出变量线性依赖于它自己以前的值和一个随机项(一个不完全可预测的项)。

最近,为了开发一个可以在时间序列数据中捕捉季节性的模型,脸书开发了著名的 Prophet 模型,每个人都可以公开获得。在本文中,我们将使用这个最先进的模型: Prophet 模型。 Prophet 通过实现 加法回归 模型,能够捕捉每日每周每年的季节性以及假日** 效果。**

Prophet 模型背后的数学方程式定义为:

y(t) = g(t) + s(t) + h(t) + e(t)

  • 其中,g(t)代表趋势。Prophet 使用分段线性模型进行趋势预测。
  • s(t)代表周期性变化(每周、每月、每年)。
  • h(t)代表假期的影响(回想一下:假期影响业务)。
  • e(t)是误差项。

Prophet 模型拟合过程通常非常快(即使对于成千上万的观察),并且不需要任何数据预处理。它还处理缺失数据和异常值。

在本文中,我们将使用先知模式来预测谷歌未来的股价。

我们开始吧!

——我的邮件列表只需 5 秒:https://seralouk.medium.com/subscribe

-成为会员支持我:https://seralouk.medium.com/membership

2.获取股票价格历史数据

感谢雅虎财经我们可以免费获得的数据。使用以下链接获取谷歌的股价历史:https://finance.yahoo.com/quote/GOOG/history?周期 1=1433548800 &周期 2=1591833600 &间隔=1d &过滤器=历史&频率=1d

您应该看到以下内容:

如何下载股价历史?

点击下载并保存。csv 文件本地保存在您的计算机上。

数据是从 2015 到现在( 2020 )!

3。Python 工作示例

现在有了数据,就来考察数据,建立模型,预测股价吧!

3.1。加载&检查数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# Load the dataset using pandas
data = pd.read_csv("/Users/loukas/Downloads/GOOG.csv") 
data.head(5)

上面的代码应该打印出以下内容:

数据集的前 5 行。

现在,让我们打印一些统计数据,如上述特征(列)的平均值、中值、最小值、最大值和标准偏差值。

data.describe()

过去 5 年(2015–2020)收盘时的均值股价为 983.45!真的很高!

3.2。建立预测模型

现在让我们继续建模。我们将使用日期收盘价格作为我们模型的特征。

# Select only the important features i.e. the date and price
data = data[["Date","Close"]] # select Date and Price# Rename the features: These names are NEEDED for the model fitting
data = data.rename(columns = {"Date":"ds","Close":"y"}) #renaming the columns of the datasetdata.head(5)

最后一个 python 命令应该返回数据集的前 5 行。您应该会看到类似这样的内容:

这里,ds是日期,y谷歌 股票价格。

在本教程中,我们不会将数据分成训练测试集,而是使用所有数据来拟合模型,然后要求模型预测未来值,即 2021 年的股价。

通常人们将数据分为训练和测试,因为他们不想在测试集上训练模型。如果我们隐藏一个测试集,那么模型将会预测看不见的数据的值。在这种情况下,我们也能够测量模型的误差。

接下来,我们从 fbprophet 模块导入 prophet 类,然后创建一个 Prophet 类的对象。

旁注:模型的 github 页面是这样的:https://github.com/facebook/prophet

要在您的控制台上安装模块类型:pip install fbprophet

from fbprophet import Prophetm = Prophet(daily_seasonality = True) # the Prophet class (model)
m.fit(data) # fit the model using all data

安装后,您应该会看到:

优化正常终止:
检测到收敛:相对梯度幅度低于公差

3.3。策划预测

现在,对于最后一步,我们将要求模型预测未来值,然后将预测可视化。

future = m.make_future_dataframe(periods=365) #we need to specify the number of days in future
prediction = m.predict(future)
m.plot(prediction)plt.title("Prediction of the Google Stock Price using the Prophet")
plt.xlabel("Date")
plt.ylabel("Close Stock Price")
plt.show()

该模型使用所有数据进行训练(黑点),并且预测从 2020 年 6 月到 2021 年 6 月的未来股票价格!蓝色阴影是置信区间。

结论:根据模型预测,2021 年 6 月谷歌股价似乎会在 1600 左右。

注:在这种情况下,我们无法测量模型的误差。如果有人想这样做,那么他们应该将数据分为训练集和测试集,仅使用训练集拟合模型,预测测试集的价格,然后使用测试集的基本真实价格值来衡量误差。

观察:2020 年 3 月因新冠肺炎封锁而大幅下跌。

奖金

3.4。绘制趋势、周、季、年和日成分图

如果您想要查看预测组件,即趋势、周、季、年和日组件,那么您可以使用以下命令。

m.plot_components(prediction)
plt.show()

结果

根据估计的趋势,我们可以看到,通常股票价格在一月(见第 3 副图)最高,多在周三(见第 2 副图)的最高。最后,第 1 个子图显示了股票价格在不久的将来(在 2020 年 6 月和 2021 年 6 月之间)的增长。

那都是乡亲们!希望你喜欢这篇文章!

也看看我最近用 LSTM 模型写的文章:

[## LSTM 时间序列预测:使用 LSTM 模型预测股票价格

在这篇文章中,我将向你展示如何使用预测 LSTM 模型来预测股票价格

towardsdatascience.com](/lstm-time-series-forecasting-predicting-stock-prices-using-an-lstm-model-6223e9644a2f)

也可以看看我最近用 ARIMA 模型写的文章:

[## 时间序列预测:使用 ARIMA 模型预测股票价格

在这篇文章中,我将向你展示如何使用预测 ARIMA 模型来预测特斯拉的股票价格

towardsdatascience.com](/time-series-forecasting-predicting-stock-prices-using-an-arima-model-2e3b3080bd70)

参考

[1]https://Facebook . github . io/prophet/docs/quick _ start . html # python-API

https://en.wikipedia.org/wiki/Additive_model

敬请关注并支持这一努力

如果你喜欢这篇文章,并且觉得它有用,那么关注我就可以看到我所有的新帖子。

有问题吗?把它们作为评论贴出来,我会尽快回复。

最新帖子

[## 最佳免费数据科学资源:免费书籍和在线课程

最有用的免费书籍和在线课程,适合想了解更多数据科学知识的人。

medium.com](https://medium.com/@seralouk/the-best-free-data-science-resources-free-books-online-courses-9c4a2df194e5) [## 用新冠肺炎假设的例子解释 ROC 曲线:二分类和多分类…

在这篇文章中,我清楚地解释了什么是 ROC 曲线以及如何阅读它。我用一个新冠肺炎的例子来说明我的观点,我…

towardsdatascience.com](/roc-curve-explained-using-a-covid-19-hypothetical-example-binary-multi-class-classification-bab188ea869c) [## 支持向量机(SVM)解释清楚:分类问题的 python 教程…

在这篇文章中,我解释了支持向量机的核心,为什么以及如何使用它们。此外,我还展示了如何绘制支持…

towardsdatascience.com](/support-vector-machines-svm-clearly-explained-a-python-tutorial-for-classification-problems-29c539f3ad8) [## PCA 清楚地解释了——如何、何时、为什么使用它以及特性的重要性:Python 指南

在这篇文章中,我解释了什么是 PCA,何时以及为什么使用它,以及如何使用 scikit-learn 在 Python 中实现它。还有…

towardsdatascience.com](/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e) [## 关于 Python 中的最小-最大规范化,您需要知道的一切

在这篇文章中,我将解释什么是最小-最大缩放,什么时候使用它,以及如何使用 scikit 在 Python 中实现它

towardsdatascience.com](/everything-you-need-to-know-about-min-max-normalization-in-python-b79592732b79) [## Scikit-Learn 的标准定标器如何工作

在这篇文章中,我将解释为什么以及如何使用 scikit-learn 应用标准化

towardsdatascience.com](/how-and-why-to-standardize-your-data-996926c2c832)

和我联系

时间序列预测策略

原文:https://towardsdatascience.com/time-series-forecasting-strategies-c9bafaf5d1a6?source=collection_archive---------59-----------------------

Unsplash 上的 Tabea Damm 拍摄的照片

有大量的文章详细描述了各种数据预处理技术,并解释了如何使用机器学习算法,甚至是关于模型性能估计和选择。在我之前的 帖子 中,我谈到了从头开发一个预测模型,并为参与该主题的项目经理提供了一些提示。然而,当使用测试实例时,我面临着关于什么策略可以预测未来的信息的缺乏。为了填补这个空白,我提供了三种常见方法的解释。希望有用。

因此,在本文中,我们打算跳过数据准备的一部分,直接进入特征生成,因为时间序列分析的前面步骤不依赖于已经选择的策略。

让我们回顾一下他们的拳头。

整个项目的代码可以在 GitHub 资源库 中找到

第一种策略—“基于先前预测值创建新特征”

在那里,我们提前 1 个时间步长进行预测,并根据之前的预测值生成未来的模型特征。只有在前几个预测中,我们使用实际的例子。这种方式使我们能够预测未来的价值,无论我们想要什么。在这种情况下,预测范围变得无限。然而,另一方面,这也有一个缺点,因为每次下一次预测观测都会累积以前观测的误差。因此,进一步的预测值远离历史值,那么模型精度就变得更差。

我们预测一个步骤,然后将预测值添加到数据集中,并重用它来生成新的步骤,就像下图所示。

正如我上面提到的,我们将在数据集的顶部添加每个新的预测值,因此我们必须调整将生成要素的函数以遵循这种方法。

第二种策略—“预测未来 K 个分笔成交点”

我们可以预测向前 K 步。只有当预测范围小于我们拥有的数据时,这才是可能的。这很重要,因为我们将只使用历史观察值来生成未来值。

但是,在我们开始进行预测之前,我们必须定义要预测多少步,并意识到我们拥有为未来值生成特征所需的历史点数量。

这种策略的主要好处是仅使用真实数据来生成预测。与此同时,可以预测的时间步长数量有限。此外,我想你已经猜到,我们越是走向未来,我们的历史观察就变得越没用,这就是这种方法的局限性。

第三个策略——“有创意”

您可以通过结合第一种和第二种策略来创建任何单独的模型。

例如,使用一个模型预测一个步骤,使用另一个模型预测两个时间步骤,依此类推。

在下面的例子中,我们通过重用在第二个策略中训练过的模型来预测 K 步,然后从第一个策略中启动模型。

结论

我认为,首先也是最重要的是,策略选择的偏好应该取决于您想要预测的步骤数量和要达到的预测准确度水平。选择适合你的或者创造你自己的。感谢您的时间,请分享您的想法或任何反馈。

利用季节性 ARIMA 模型进行时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-using-a-seasonal-arima-model-57127cb8b655?source=collection_archive---------20-----------------------

Python 教程

时间序列预测中最广泛研究的模型之一是 ARIMA(自回归综合移动平均)模型。ARIMA 模型有许多变体,它们采用相似的概念,但稍有改动。一个特别的例子是季节性 ARIMA (SARIMA)模型。SARIMA 模型在生成时间序列预测时考虑了季节性。本教程涵盖了使用 Python 生成和调整 SARIMA 模型的基础知识,旨在预测具有季节性的时间序列。

算法背景

首先,简单介绍一下 SARIMA 模型的工作原理。由于 ARIMA 模型构成了萨里玛模型的主干,因此理解 ARIMA 模型的工作原理是有益的。它包括以下步骤:

  1. 差分时间序列中的滞后读数,从而使时间序列平稳。
  2. 使用时间序列中指定数量的滞后观测值来预测时间序列的未来行为。这一步包括两个模型的组合:自回归(AR)模型和移动平均(MA)模型。每个主题的一些背景:

AR 模型。AR 模型使用变量以前值的线性组合来预测变量( 1 )。我们将订单为 p 的 AR 模型描述如下:

自回归(AR)模型。图片由(1)提供

在上式中,ε项代表随机误差项。 y(t-p) 项表示时间序列中前一个 p 值。phi 值在每个时间步长都是常数。phi 值随着远离点 t(序列中的最新值)而减小。因此,滞后值越接近预测值(在序号 t 处),phi 值越大,时间步长对预测的影响越大。

【马】马典范。 移动平均模型类似于 AR 模型,只是它是前面误差项的线性组合( 2 )。我们描述如下:

移动平均线(MA)模型,承蒙(3)

在上面的等式中,ε项是误差项,ε(t)是时间步长 t 处的误差项,以此类推。像上面的 AR 方程一样,phi 参数在每个时间步长都是一个常量值。类似地,phi 值随着远离时间 t 移动更多的时间步长而减小。

ARIMA 模型参数

ARIMA 模型包括三个主要参数——pqd 。这些参数代表以下内容( 4 ):

  • p :自回归模型的阶数(滞后项的个数),在上面的 AR 方程中描述。
  • q :移动平均线模型的阶数(滞后项的个数),在上面的 MA 方程中描述。
  • d :使时间序列平稳所需的差值数。

SARIMA 模型参数

萨里玛模式建立在 ARIMA 模式的基础上。它包括 pqd 参数,还包括一组额外的参数来说明时间序列的季节性。该参数集— PQD 和附加参数 m — 定义如下( 5 ):

m :模型的季节性。例如,如果时间序列的季节性每年重复一次,那么 m = 12。如果季节性是每季度一次,那么 m = 4(意味着季节性模式每四个月重复一次)。

P :季节性自回归模型的阶。

Q :季节移动平均线模型的阶。

D :应用于时间序列的季节差异数。

时间序列

在本教程中,我们将使用美国地热能发电的月度时间序列。数据可以通过能源信息管理局(EIA)的 API 直接拉入 Python 中(参见 本教程 了解更多关于使用 EIA 的 API 的背景)。时间序列的快照如下所示,单位为百万千瓦时:

月时间序列,地热能发电净发电量。单位为百万千瓦小时。

我们使用下面的代码来检索和可视化我们的时间序列:

在我们生成 SARIMA 模型之前,让我们分解时间序列以确保它显示季节性。我们使用季节性分解函数,可通过 statsmodels.tsa 包获得。此函数允许我们将时间序列分解为趋势、季节和残差部分:

分解地热能净发电量时间序列

如上图所示,时间序列明确显示了季节性,每 12 个月(每年)重复一次。

构建萨里玛模型

既然我们已经执行了一些初步的数据探索,让我们构建和调整一个 SARIMA 模型来预测时间序列。

超参数选择

我们通过强力选择最适合萨里玛模型的 pdqPDQ 超参数——我们对不同的模型超参数变量进行采样,直到找到最佳的模型组合。在生成每个模型后,我们使用其 AIC 和 BIC 分数来衡量其性能。AIC 或 Akaike 信息标准是一种将一组统计模型的质量相互比较的度量标准( 6 )。类似地,BIC 或贝叶斯信息标准是一种用于比较不同模型的贝叶斯统计。当使用 AIC 或 BIC 指标比较模型时,我们将 AIC 和 BIC 得分最低的模型作为最佳选择。

在下面的代码片段中,我们生成不同的超参数变量来运行 SARIMA 模型,并返回一个列表进行循环:

在上面的代码片段中,我们使用sarima _ parameter _ search()函数生成不同超参数组合的列表,作为 seasonal _ pqd _ combinationspdq 变量返回。季节性变量的默认值为 12,表示季节性模式每 12 个月(每年)重复一次。

趋势变量有 4 个可能选项——“n”、“c”、“t”和“ct”。该变量控制时间序列的多项式趋势;' n '表示没有趋势(默认),' c '表示趋势是恒定的,' t '表示随时间的线性趋势,' ct '既恒定又线性( 8 )。

pdq 变量可以在 0 和 search_range 限制(不含)之间变化。在上面的代码中,我将 search_range 设置为 2,因此参数范围在 0 和 1(含)之间变化。这意味着相关 AR 和 MA 模型的滞后项的最大可能数量是 1,差分的最大可能阶数是 1。

** [## 如何网格搜索 SARIMA 超参数进行时间序列预测

季节性自回归综合移动平均模型是一种模拟单变量时间序列的方法

machinelearningmastery.com](https://machinelearningmastery.com/how-to-grid-search-sarima-model-hyperparameters-for-time-series-forecasting-in-python/) [## 如何使用 SARIMA 模型用 Python 预测销售额

从统计学和 python 到时间序列预测的分步指南

towardsdatascience.com](/how-to-forecast-sales-with-python-using-sarima-model-ba600992fa7d)

培训 SARIMA 模型

让我们首先将数据分成训练集和测试集。这样,我们可以使用训练集构建模型,并使用测试集评估其性能:

在上面的代码片段中,我们使用了标准的 75/25 数据分割(分别是训练和测试)。我们将时间序列中前 75%的数据点作为训练集,后 25%的数据点作为测试集。

注意:当生成我们的训练和测试集时,我们必须只使用一个分割,因为数据必须保持其连续性。这是因为 SARIMA 模型依赖于数据序列来进行预测。

最后,是时候建立我们的 SARIMA 模型了。我们循环遍历每个可能的超参数配置,生成一个 SARIMA 模型。我们使用每个可能模型的 AIC 参数来衡量模型性能。记住——我们想要 AIC 分数最低的模型:

在上面的代码片段中,我们使用了 seasonal_arima_model() 函数来构建 SARIMA 模型。如果模型构建成功,那么模型摘要将打印在控制台中,并返回模型及其相关的 AIC 和 BIC 分数。

我们在一个循环中调用季节性 arima 模型()函数,在这里我们对每个超参数配置进行采样。我们设置了一个默认的 AIC 值 100,000,000,000(非常高),当我们找到一个具有较低 AIC 分数的模型时,替换它。当我们在循环中移动时,我们在具有最低相关 AIC 分数的模型上保留一个标签,并保存该模型及其超参数配置(在 best_modelbest_orderbest_seasonal_order 变量下)。我们将循环结束时存储在 best_model 下的 SARIMA 模型作为具有最佳超参数配置的最终模型。

解释模型结果

循环完成后,最佳模型配置及其摘要将打印在 Python 控制台中:

最佳 SARIMA 型号配置

萨里玛(1,1,1)x(1,1,1,12)模型摘要

上面的模型摘要包含“协方差类型”图,该图描述了每个变量对预测的影响。我们有四个主要的滞后 AR 和 MA 变量。第一组 AR 和 MA 变量滞后 1 个时间步长( ar)。马。L1 ,而第二组滞后 12 个时间步( ar)。S.L12ma。S.L12

查看图中的P>ABS(z)项,所有变量读数为 0。这很好,因为我们希望 P 值尽可能接近 0。使用 0.05 作为统计显著性的截止值,我们所有的滞后 AR 和 MA 项都会显著影响模型预测。

测试模型性能

现在我们有了 SARIMA 模型,让我们使用测试数据来评估它的性能!

在下面的代码片段中,我们预测测试集的值,预测出测试集中出现的步骤总数。然后,我们使用均方根误差(RMSE)和平均绝对误差(MAE)指标将预测值与实际值进行比较。RMSE 和梅的分数越低,模型就越适合。如果预测值与实际值完全匹配,则 RMSE 和 MAE 都等于 0。

关于均方根误差和平均绝对误差的更多信息,请查看 此链接

预测的 RMSE 和梅产量

运行上面的代码片段,该模型的输出 RMSE 和 MAE 分别约为 868 和 860。

在计算了 RMSE 和梅伊指标后,我们将预测值与实际值进行对比。这为我们提供了模型性能的直观度量:

时间序列指数 t 下的时间序列预测值与实际时间序列值。预测的置信区间用灰色表示。

请看上图,该模型在预测 140 个时间步长的时间序列方面做得很好。这都快十二年了!我们可以看到预测的季节性,这是由 ar 说明的。S.L12ma。模型中的 S.L12 术语。

我的用季节性 ARIMA 模型生成和预测的教程到此结束。

查看本教程中使用的完整代码。

另外,看看我的其他一些时间序列分析文章:

[## 使用 Python 分析电价时间序列数据:时间序列分解和价格…

欢迎来到科技兰多博客!本教程涵盖了时间序列分解和向量自回归(VAR)…

techrando.com](https://techrando.com/2019/07/19/analyzing-electricity-price-time-series-data-using-python-time-series-decomposition-and-price-forecasting-using-a-vector-autoregression-var-model/) [## 使用 Python - Tech Rando 进行变化点检测简介

我的很多工作都大量涉及时间序列分析。我使用的一个很棒但不太为人所知的算法是…

techrando.com](https://techrando.com/2019/08/14/a-brief-introduction-to-change-point-detection-using-python/) [## 时间序列中离群点检测的无监督机器学习方法

在这篇文章中,我将介绍一些我最喜欢的检测时间序列数据中异常值的方法。有许多不同的…

techrando.com](https://techrando.com/2019/08/23/unsupervised-machine-learning-approaches-for-outlier-detection-in-time-series/)

资源

  1. https://otexts.com/fpp2/AR.html
  2. https://new online courses . science . PSU . edu/stat 510/lesson/2/2.1
  3. https://otexts.com/fpp2/MA.html
  4. https://people.duke.edu/~rnau/411arim.htm
  5. https://new online courses . science . PSU . edu/stat 510/lesson/4/4.1
  6. https://www . statistics show to . data science central . com/akai KES-information-criterion/
  7. https://www . statistics show to . data science central . com/Bayesian-information-criterion/
  8. https://www . stats models . org/dev/generated/stats models . TSA . statespace . sarimax . sarimax . html

最初发表于 2020 年 1 月 4 日https://techrando.comT22。**

python 中自动 ARIMA 的时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-using-auto-arima-in-python-bb83e49210cd?source=collection_archive---------0-----------------------

演示如何利用 python 中的自动 ARIMA 功能,使用“pmdarima”包预测未来

照片由 Isaac Smith 在 Unsplash 上拍摄

时间序列分析是任何数据科学家的核心技能之一,在分析领域工作的任何人经常会遇到根据过去和现在的数据预测未来的情况。

什么是时间序列?

它是在特定时间基本上以相等间隔进行的一系列观察。它用于根据过去的观察值预测未来值。在时间序列分析中,您可能会观察到趋势性、季节性、不规则性和周期性。

在这种数据集的情况下,每次只观察到一个变量被称为“单变量时间序列”,如果每次观察到两个或两个以上的变量被称为“多变量时间序列”。

在本文中,我们将重点关注使用 python 中的自动 ARIMA 功能来预测销售额的单变量时间序列,这与 r 中的自动 ARIMA 功能非常相似

为什么使用汽车 ARIMA?

通常,在基本的 ARIMA 模型中,我们需要提供必要的 p、d 和 q 值。我们使用统计技术,通过执行差分来消除非平稳性并绘制 ACF 和 PACF 图来生成这些值。在自动 ARIMA 中,模型本身将生成适合数据集的最佳 p、d 和 q 值,以提供更好的预测。

让我们开始安装吧…

请注意,这个包最初命名为“金字塔”,后来改为“pmdarima”。确保您正在安装“pmdarima”软件包。

👉步骤 1:安装“pmdarima”包

你可以用下面的命令从你的 Jupyter 单元安装这个包。

!pip 安装 pmdarima

为了确保软件包构建正确,请使用下面的命令进行测试。

从 pmdarima.arima 导入 auto_arima

还要注意,这个包依赖于其他几个 python 包,要了解更多关于设置的信息,请参考这个[ 链接

我们正在使用的数据集是从 1964 年到 1972 年的每月明智香槟销售。你可以在这里得到数据集

👉第二步:准备数据

读取数据集后,确保没有空值,并将“Month”变量的数据类型更改为 datetime 对象。此外,使用 set_index 方法将 dataframe 的索引设置为该变量。

销售数据的前几行

👉第三步:理解模式

为了理解数据的模式,我们可以简单地用。plot()方法。

销售数据中的季节性模式

从上面我们可以观察到,数据存在季节性。从 1964 年到 1972 年,每年都有一个销售高峰。

👉步骤 4:平稳性测试

平稳性是时间序列中的一个重要概念,任何时间序列数据都应该在进行建模之前进行平稳性测试。

我们使用“扩展的 Dickey-Fuller 检验”来检查数据是否是平稳的,这在“pmdarima”包中是可用的。

从上面我们可以得出结论,数据是非平稳的。因此,我们需要使用“综合(I)”概念,在时间序列中用值“d”表示,以使数据在构建自动 ARIMA 模型时保持平稳。

👉第五步:训练和测试分割

拆分为定型数据集和测试数据集,以在定型数据集上构建模型,并使用测试数据集进行预测。

绘制训练和测试数据集

👉第六步:建立汽车 ARIMA 模型

自回归(p) - >自回归项数。

积分(d) - >平稳性所需的非季节性差异数。

移动平均(q) - >预测方程中滞后预测误差的个数。

在自动 ARIMA 模型中,注意小的 P,D,Q 值代表非季节性成分,大的 P,D,Q 代表季节性成分。它的工作类似于超调谐技术,以找到不同组合的 p、d 和 q 的最佳值,并且最终值将通过考虑较低的 AIC、BIC 参数来确定。

这里,我们尝试使用范围从 0 到 5 的 p、d、q 值来从模型中获得更好的最优值。该模型中还有许多其他参数,要了解更多功能,请访问此链接[ 此处

自动 ARIMA 模型参数

自动 ARIMA 模型的追踪

下面是模型的总结。

ARIMA 模式概述

👉第七步:测试数据预测

使用在前面步骤中建立的训练模型根据测试数据预测销售。

根据测试数据预测的销售额

绘制培训对比测试对比预测销售

测试数据集的 R2 分数

总结

在本文中,我们学习了如何使用自动 ARIMA 模型的功能,如果您想从模型本身生成 p、d 和 q 值,这种方法将会很方便。在基本的 ARIMA 或萨里玛模型中,您需要进行差分并绘制 ACF 和 PACF 图来确定这些值,这非常耗时。

然而,如果你是时间序列的新手,建议你使用统计技术并实现基本的 ARIMA 模型来理解 p、d 和 q 值背后的直觉。

您可以从我的 GitHub [ here ]获得数据集和完整代码

感谢阅读,快乐学习!🙂

时间序列预测 vs .数据意义上的预测辩论!—行业需求是什么

原文:https://towardsdatascience.com/time-series-forecasting-vs-the-data-sense-prediction-debate-what-industry-demands-807ef1ae0db2?source=collection_archive---------33-----------------------

我如何在预测冠状病毒爆发时实现 1.4%的 MAPE

“每一个在中国和其他地方受苦的人,愿上帝加强受害者和他们的家庭,引导他们度过这段艰难的时光。请遵循世卫组织网站中的建议,保持安全并受到保护

乔·塞拉斯Unsplash 上拍照

在这个技术和变革的时代,商业智能和数据科学是两个最经常出现的术语。虽然两者都是建立在数据的基础上,但却完全不同。商业智能是收集、整合和分析当前数据以推动未来决策的过程,而数据科学更多的是分析数据以预测未来的结果。关于这两个术语的不同造词有多种版本,然而,归根结底是数学+商业+技术的结合!

我们今天要谈论的四件事

  • 问题陈述☄
  • 方法-解决方案框架☀
  • 验证机制▥
  • 什么是对的或错的?☺ ☹

问题陈述☄

“我们都知道 2019-nCoV(冠状病毒)的爆发,以及它的致命性。世界卫生组织目前正在密切监测局势,并努力制定一项全球战略准备。每天发布一份 情况报告 跟踪确诊病例数、死亡数、痊愈数、新增病例数等。想象一下这样一种情景,对未来疫情的估计可以帮助各国在今天实施战略措施。战略措施包括建立保健中心、储备医疗必需品、传播意识等等。我们将努力预测确诊病例的数量,直到下周末”。

世卫组织——给公众的建议

* [## 为什么质量和感觉检查在数据科学中如此重要?

世界卫生组织和 Kaggle 的 2019-nCoV(冠状病毒)数据库如何讲述同一个故事…

towardsdatascience.com](/why-quality-sense-checks-are-so-important-in-data-science-7ef80da760c3)

方法-解决方案框架☀

为了预测确诊病例的数量,了解可能影响疫情的几个因素是很重要的。让我们看看下面的信息图。

“考虑到目前无法获得所需的数据粒度,实施这些因素来开发回归或 ARIMAX 模型似乎很困难”,但是,可以采用基于进展/商业智能的方法来预测未来结果。

上述因素,如果不在模型中使用,也可以用来验证模型结果。例如,我们最终预测武汉的确诊病例数会更高,我们需要验证预测的数字。我们可以对武汉的人口统计进行初步研究。如果我们看到一个确定/证实武汉患有糖尿病和心力衰竭的老年人数量比周围省份高得多的场景,我们肯定可以验证我们的预测值;这两个因素总是高度相关的。

我已经在分析行业工作了 5 年,我看到过这样的场景,当一个简单易懂的解决方案可以轻松实现时,我们却把过程复杂化了。想象一下这样一个场景,您被要求预测销售额,因为您的业务伙伴想要一个基线数字来计划下一年的预算。你可以一直致力于开发一个时间序列模型,但是你的商业伙伴能够理解 P-D-Q 框架意味着什么或者 ACF-PACF 图代表什么吗?

在你开发一个模型☃之前,想简单点

一个模型并不一定意味着,你开始使用复杂的数学来创建一些等式。对于任何时间序列数据,第一步是查看这三个组成部分:

  • 趋势 —变量的大小是否随时间线性增加?例如,确诊病例的增长是否会随着时间的推移而增加?
  • 水平 —变量在一段时间内的平均值是多少?例如,过去 6 天的平均增长率是多少?
  • 季节性——在特定的时间间隔内,我们会看到类似的价值模式吗?—我们是否在特定日期观察到类似的趋势,即每周一确诊病例/增长数字较高?

现在怎么办?

  • 绘制确诊病例数与时间的关系图。 检查线性、非线性趋势
  • 如果趋势存在, 寻找增长的同方差或异方差;增长数字是随时间增长还是像随机噪声一样分布不均
  • 如果数字有增长趋势,看看是增加还是减少; 计算 alpha;α可以定义为增长随时间变化的比例
  • 任何时间序列数据都应该使用最近的事件进行预测。快速 PACF(部分自相关)图可用于理解从 t(n)到 t(n-1)时间间隔的不同确认数字的相互作用。PACF 图基本上用于理解我们是否可以使用最近值 的组合 的当前值来预测下一个结果

* [## 冠状病毒爆发会有多糟糕?—预测疫情数字

数据分析师的观点—您应该知道的 4 件重要事情

towardsdatascience.com](/how-bad-will-the-coronavirus-outbreak-get-predicting-the-outbreak-figures-f0b8e8b61991)

我通过使用截至 2020 年 1 月 31 日的最近 6 天的数据来调整模型参数,以得出 alpha 值。

验证机制▥

平均绝对百分比误差(MAPE)是我们预测模型精确度的统计度量。它以百分比的形式测量这种精度,并且可以计算为每个时间段的平均绝对百分比误差减去实际值除以实际值。它基本上帮助我们识别

  • 我们的预测和实际值有多大的差异?即差异的大小
  • 我们是低估了还是高估了?

MAPE 越低,模型结果越好。世界卫生组织每天发布一份情况报告,报告中的数值被用来验证模型数据。

什么是对的或错的?☺ ☹

什么顺利!☺

  • 1.4%的 MAPE;适合任何型号的验证
  • 简单易懂的解决方案,没有复杂的方法

什么不顺利!☹

  • MAPE 随着时间而增加。不适合用于预测长期值的模型
  • 无法纳入可能有助于改善预测结果的外部因素*

这种爆发的致命性还有待观察,但利用现有的数据,如果我们能够确定高风险区,我们就可以迅速采取行动,对爆发进行一些抵抗。这就是数据科学家和分析师需要携手合作并帮助社区传播更多意识的地方。

关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;你可以和我在 上联系 中。*

用 2D 卷积进行时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-with-2d-convolutions-4f1a0f33dff6?source=collection_archive---------6-----------------------

在本文中,我将向您展示一种我在其他地方没有见过的时间序列预测方法。我怀疑这是一个新方法,但由于我还没有看到一篇关于它的伟大文章,这里是它。

数据集

我在这个项目中使用的数据来自全球能源预测竞赛,由我的家乡大学北卡罗来纳大学夏洛特分校举办。你可以在这里找到更多关于它的信息:【http://www.drhongtao.com/gefcom/2017】T2

你需要知道的是这些数据是来自一个能量网格的各种读数。我们的目标是利用这些数据点预测电网的实时能源需求。数据点还包括露点和干球温度,因为空调是能源消耗的巨大驱动力。

我们的目标变量是 RTDemand:我们正在工作的电网的实时能源需求。数据有明确的每日周期。这是我们三天的数据:

3 天每小时一次

在太阳下山、所有人都睡着的半夜,我们的功耗达到最低。我们早上醒来,开始工作,当太阳达到峰值强度时,我们的功耗达到最大。我认为每天的下降对应于通勤时间。

如果我们再放大一点,我们可以看到清晰的自相关和天数趋势,就像你在天气中看到的一样。这是大约 3 周的数据:

目标变量的 3 周

如果我们进一步缩小,查看一整年的数据,我们还可以注意到一个更大的季节性趋势:

这是一个非常好的时间序列预测数据集。

单变量纯时间序列模型

对于时间序列预测来说,我们将需要做出导致目标结果的时间序列。在我们的例子中,我选择 72 小时作为时间序列的长度。这意味着我们模型的输入是代表过去 72 小时数据的 72 个独立数字,我们希望从我们模型得到的目标输出是第 73 小时的预测。我认为 72 小时是一个很好的长度,因为它可以很好地捕捉当地的趋势和昼夜循环。

让我告诉你我所说的时间顺序是什么意思。这是 X 的前 3 天,我们对模型的输入:

array([[12055., 11430., 10966., 10725., 10672., 10852., 11255., 11583.,
        12238., 12877., 13349., 13510., 13492., 13314., 13156., 13364.,
        14632., 15653., 15504., 15088., 14579., 13882., 12931., 11883.,
        10978., 10406., 10089.,  9982., 10031., 10289., 10818., 11444.,
        12346., 13274., 13816., 14103., 14228., 14154., 14055., 14197.,
        15453., 16531., 16410., 15954., 15337., 14347., 13178., 12106.,
        11400., 11059., 10959., 11073., 11485., 12645., 14725., 15863.,
        16076., 16222., 16358., 16362., 16229., 16123., 15976., 16127.,
        17359., 18818., 18724., 18269., 17559., 16383., 14881., 13520.], [11430., 10966., 10725., 10672., 10852., 11255., 11583., 12238.,
        12877., 13349., 13510., 13492., 13314., 13156., 13364., 14632.,
        15653., 15504., 15088., 14579., 13882., 12931., 11883., 10978.,
        10406., 10089.,  9982., 10031., 10289., 10818., 11444., 12346.,
        13274., 13816., 14103., 14228., 14154., 14055., 14197., 15453.,
        16531., 16410., 15954., 15337., 14347., 13178., 12106., 11400.,
        11059., 10959., 11073., 11485., 12645., 14725., 15863., 16076.,
        16222., 16358., 16362., 16229., 16123., 15976., 16127., 17359.,
        18818., 18724., 18269., 17559., 16383., 14881., 13520., 12630.], [10966., 10725., 10672., 10852., 11255., 11583., 12238., 12877.,
        13349., 13510., 13492., 13314., 13156., 13364., 14632., 15653.,
        15504., 15088., 14579., 13882., 12931., 11883., 10978., 10406.,
        10089.,  9982., 10031., 10289., 10818., 11444., 12346., 13274.,
        13816., 14103., 14228., 14154., 14055., 14197., 15453., 16531.,
        16410., 15954., 15337., 14347., 13178., 12106., 11400., 11059.,
        10959., 11073., 11485., 12645., 14725., 15863., 16076., 16222.,
        16358., 16362., 16229., 16123., 15976., 16127., 17359., 18818.,
        18724., 18269., 17559., 16383., 14881., 13520., 12630., 12223.]])

数组中的每个数字都是 RTDemand 的读数:这个特定的发电站在那个小时需要多少千瓦的电力。三个大阵列中的每一个都有 72 小时的数据。如果你仔细观察这三组 72 个读数的前 8 个左右,你会注意到每组新的 72 个读数都是向前移动了一个小时的系列。因此,这些 72 长度的输入数组中的每一个都代表了该能源电网实时需求的过去 72 小时的读数。

然后,我们希望预测第 73 个小时,因此我们的 y 数组将如下所示:

array([[12630.],
       [12223.],
       [12070.]])

注意,如果你看上面第二个 X 数组中的最后一个条目,它也是我们 Y 中的第一个条目,第三个 X 数组中的最后一个条目是我们 Y 中的第二个条目。对于第一个 X 数组,我们试图预测 Y 系列中的第二个值。

数据转换

一旦我们加载并窗口化了数据,我们接下来需要将它转换成一个合适的集合来训练机器学习模型。首先,我将缩放所有输入变量。稍后,我们将考虑使用数据集的所有 12 个输入,但现在我将只介绍一个变量。我将而不是缩放我的目标变量,我的 Y,因为我觉得它以最小的成本使得监控模型的进展更容易。接下来,我们将把它分成培训/测试部分:

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X = scaler.fit_transform(X)split = int(0.8 * len(X))
X_train = X[: split - 1]
X_test = X[split:]y_train = y[: split - 1]
y_test = y[split:]

最后,我们的形状有点偏离。我们将使用的模型的输入是(样本、时间步长、特征)。在第一个模型中,我们仅使用时间窗口目标变量作为输入。所以,我们只有一个特征。我们的 X_train.shape 当前为(样本,时间步长)。在上面的训练/测试拆分之后,我们现在将重塑它:

X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1))
X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], 1))
X_train.shape
(61875, 72, 1)

即 61,875 个样本,每个样本由 72 个每小时读数和 1 个特征组成。准备好摇滚了。

基准车型:

首先,一个基准。我们的优化指标将是均方误差/均方根误差。所以首先我们需要知道这个数字是好是坏。我们还会考虑 R,不过如果有冲突,我们只会使用均方误差作为损失函数和优化目标。

对于基准模型,我们将看到我们得到的均方误差和 R 的读数。这里的基准模型将猜测我们的时间序列中的前一个值。下面是一些代码,可以快速阅读这个模型:

# Benchmark model
prev_val = y_test[0]
sse = 0for n in range(0, len(y_test)-1):
 err = y_test[n] — prev_val
 sq_err = err ** 2
 sse = sse + sq_err
 prev_val = y_test[n]mse = sse / n
mse

对于我们的测试数据集,这产生了 411,577.17 的答案,其平方根是 641.54。对此的一种解释是,平均而言,该基准模型在给定的一小时内下降了 641.54 兆瓦。下面是基准模型与真实结果的对比图。

这不是一个容易被击败的模型,尽管它非常简单。

1-可变 LSTM 模型:

现在我们已经建立了数据集,我们可以开始使用机器学习模型进行预测。

预测时间序列的一种常用方法是 LSTM 模型。这将提供一个很好的基准学习模型来与我们的卷积模型进行比较。以下是使用 LSTM 模型进行设置和预测的一些代码:

def basic_LSTM(window_size=5, n_features=1):
 new_model = keras.Sequential()
 new_model.add(tf.keras.layers.LSTM(100, 
               input_shape=(window_size, n_features),
               return_sequences=True,
               activation=’relu’))
 new_model.add(tf.keras.layers.Flatten())
 new_model.add(tf.keras.layers.Dense(1500, activation=’relu’))
 new_model.add(tf.keras.layers.Dense(100, activation=’linear’))
 new_model.add(tf.keras.layers.Dense(1))
 new_model.compile(optimizer=”adam”, loss=”mean_squared_error”) 
 return new_modells_model = basic_LSTM(window_size=window_size, n_features=X_train.shape[2])ls_model.summary()Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 72, 100)           40800     
_________________________________________________________________
flatten (Flatten)            (None, 7200)              0         
_________________________________________________________________
dense (Dense)                (None, 1500)              10801500  
_________________________________________________________________
dense_1 (Dense)              (None, 100)               150100    
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 101       
=================================================================
Total params: 10,992,501
Trainable params: 10,992,501
Non-trainable params: 0

训练后,我们可以评估模型:

ls_model.evaluate(X_test, y_test, verbose=0)
1174830.0587427279from sklearn.metrics import r2_score
predictions = ls_model.predict(X_test)
test_r2 = r2_score(y_test, predictions)
test_r2
0.8451637094740732

我们得到的结果还可以,但不是一流的。具体来说,我们得到了比以前的基准模型更高的误差。下面的图表可以让你了解它预测了什么:

如你所见,它预测了相当多的可变性,但最终结果并不理想。问题似乎是在上午的“下降”过程中出现了相对较大的误差。我还发现这个模型非常不可靠,经常将其损失函数降低到 nan,并且不产生任何输出。

引入 1D 卷积方法

另一种预测时间序列的方法是使用 1D 卷积模型。1D 卷积使用滤波窗口,并在数据上循环该窗口以产生新的输出。根据卷积窗的学习参数,它们可以像移动平均线、方向指示器或模式检测器一样随时间变化。我用一些图片来解释一下方法。

第一步

这里我们有一个包含 8 个元素的数据集,过滤器大小为 4。滤波器中的四个数字是 Conv1D 层学习的参数。在第一步中,我们将滤波器的元素乘以输入数据,并将结果相加,产生卷积输出。

第二步

在卷积的第二步中,窗口移动一步,重复相同的过程以产生第二个输出。

1D 卷积的最后一步

这个过程一直持续到窗口到达输入数据的末尾。在我们的例子中,一个输入数据序列是我们之前设置的 72 小时的数据。如果我们添加选项 padding =“same”,我们的输入数据将在开头和结尾用零填充,以保持输出长度等于输入长度。上面的演示使用了线性激活,这意味着最后一个多色数组是我们的输出。但是,您可以在这里使用大量的激活函数,这些函数将通过一个额外的步骤来运行这个数字。因此,在我们下面的例子中,将有一个 ReLU 激活函数应用于这个最后的输出,以产生最终的输出。

给定我们之前描述的数据设置,下面是设置和运行 1D 卷积的代码:

def basic_conv1D(n_filters=10, fsize=5, window_size=5, n_features=2):
 new_model = keras.Sequential()
 new_model.add(tf.keras.layers.Conv1D(n_filters, fsize, padding=”same”, activation=”relu”, input_shape=(window_size, n_features)))
 # Flatten will take our convolution filters and lay them out end to end so our dense layer can predict based on the outcomes of each
 new_model.add(tf.keras.layers.Flatten())
 new_model.add(tf.keras.layers.Dense(1800, activation=’relu’))
 new_model.add(tf.keras.layers.Dense(100))
 new_model.add(tf.keras.layers.Dense(1))
 new_model.compile(optimizer=”adam”, loss=”mean_squared_error”) 
 return new_model

我们的数据集看起来是这样的:

univar_model = basic_conv1D(n_filters=24, fsize=8, window_size=window_size, n_features=X_train.shape[2])univar_model.summary()Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d (Conv1D)              (None, 72, 24)            216       
_________________________________________________________________
flatten_1 (Flatten)          (None, 1728)              0         
_________________________________________________________________
dense_3 (Dense)              (None, 1800)              3112200   
_________________________________________________________________
dense_4 (Dense)              (None, 100)               180100    
_________________________________________________________________
dense_5 (Dense)              (None, 1)                 101       
=================================================================
Total params: 3,292,617
Trainable params: 3,292,617
Non-trainable params: 0

注意这里我有 24 个卷积窗,滤波器大小是 8。因此,在我们的例子中,输入数据将是 72 小时,这将创建一个大小为 8 的窗口,并且将有 24 个这样的过滤器。因为我使用了 padding="same ",所以每个过滤器的输出宽度将是 72,就像我们的输入数据一样,输出的数量将是 24 个卷积数组。展平产生 72 * 24 = 1,728 长度数组输出。从上面继续我们的样本卷积,它看起来像这样:

展平如何工作

那么,相对于一个 LSTM 和一个愚蠢的模型,这个方法是如何工作的呢?

好吧,所以它比 LSTM 好一点,但它仍然达不到最初的基准模型“只是猜测以前的值”。当我们看这个图表时,我们可以看到这个模型中明显的偏差:

1 变量 Conv1D

添加更多数据

在我们的例子中,我们只使用我们想要预测的特征作为输入变量。然而,我们的数据集有 12 个可能的输入变量。我们可以把所有的输入变量叠加在一起,用它们来做一个预测。由于许多输入变量与我们的输出变量有中度到强烈的相关性,所以应该可以用更多的数据做出更好的预测,对吗?嗯,在 1D 卷积中有一点问题。

多元 Conv1D

我相信这就是 1D 卷积窗应用于多序列输入的情况。如果我是对的,那么添加更多的数据集将会“模糊”任何一个特定输入变化的影响,反而会产生一个不太准确的模型。

如果我想将不同的数据序列堆叠到我的模型中,我首先必须通过相同的窗口处理来运行它,以产生一组观察值,每个观察值包含变量的最后 72 个读数。例如,如果我想在第 1 列中添加变量 DADemand(提前一天的需求,此时来自前一天的需求),我将对其执行以下操作:

(DADemand, _) = window_data(gc_df, window_size, 1, 1)scaler = StandardScaler()DADemand = scaler.fit_transform(DADemand)split = int(0.8 * len(X))DADemand_train = DADemand[: split — 1]DADemand_test = DADemand[split:]DADemand_test.shape
(61875, 72, 1)

然后,我可以对我的所有 12 个变量继续这个过程,并像这样把它们堆成一个集合:

data_train = np.concatenate((X_train, db_train, dew_train, DADemand_train, DALMP_train, DAEC_train, DACC_train, DAMLC_train, RTLMP_train, RTEC_train, RTCC_train, RTMLC_train), axis=2)data_test = np.concatenate((X_test, db_test, dew_test, DADemand_test, DALMP_test, DAEC_test, DACC_test, DAMLC_test, RTLMP_test, RTEC_test, RTCC_test, RTMLC_test), axis=2)data_train.shape(61875, 72, 12)

这是 61,875 个例子,每个例子都是 12 个不同时间序列的 72 小时单独读数。我们现在将通过一个 Conv1D 网络来运行它,看看我们会得到什么结果。如果回顾一下我们用于创建这些模型的函数,您会注意到其中一个变量是要素的数量,因此运行该函数和 LSTM 的代码与使用现有代码创建模型一样简单,只是使用了新的堆叠数据、拟合、评估和绘制。这就是事情的经过:

呦喂。

正如所料,我们在这里的表现实际上随着额外的变量而下降,我相信是因为模糊效应。当我坐在一个沉闷的午夜,虚弱而疲惫地沉思时,我找到了解决这个问题的办法。

2D 卷积

好了,这里我们需要的是一个卷积窗口,它可以查看我们的特征,并找出哪些特征是好的。它基本上应该是这样的:

我需要什么

在做了一些研究后,这个形状可以通过一个形状为(1,filter_size)的 2D 卷积窗口来实现,在上图中,filter_size=3。回到我们的能源预测问题,我们有 12 个特征。为了让它进入 2D 卷积窗,我们实际上需要它有 4 个维度。我们可以得到另一个维度:

data_train_wide = data_train.reshape((data_train.shape[0], data_train.shape[1], data_train.shape[2], 1))
data_test_wide = data_test.reshape((data_test.shape[0], data_test.shape[1], data_test.shape[2], 1))data_train_wide.shape(61875, 72, 12, 1)

我对这个 2D 窗口的各种形状做了一些测试,发现一次做两个功能效果最好:

def basic_conv2D(n_filters=10, fsize=5, window_size=5, n_features=2):
 new_model = keras.Sequential()
 new_model.add(tf.keras.layers.Conv2D(n_filters, (1,fsize), padding=”same”, activation=”relu”, input_shape=(window_size, n_features, 1)))
 new_model.add(tf.keras.layers.Flatten())
 new_model.add(tf.keras.layers.Dense(1000, activation=’relu’))
 new_model.add(tf.keras.layers.Dense(100))
 new_model.add(tf.keras.layers.Dense(1))
 new_model.compile(optimizer=”adam”, loss=”mean_squared_error”) 
 return new_modelm2 = basic_conv2D(n_filters=24, fsize=2, window_size=window_size, n_features=data_train_wide.shape[2])m2.summary()Model: "sequential_4"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 72, 12, 24)        72        
_________________________________________________________________
flatten_4 (Flatten)          (None, 20736)             0         
_________________________________________________________________
dense_12 (Dense)             (None, 1000)              20737000  
_________________________________________________________________
dense_13 (Dense)             (None, 100)               100100    
_________________________________________________________________
dense_14 (Dense)             (None, 1)                 101       
=================================================================
Total params: 20,837,273
Trainable params: 20,837,273
Non-trainable params: 0

好的,这个模型非常庞大。在我的普通 CPU 上,每个纪元花了大约 4 分钟进行训练。当它完成后,我对它进行了评估并绘制了图表,我的朋友像买彩票一样得到了回报:

YOWZA

这款车型与我们之前的车型相比如何?

布丁中的证据

因此,这个模型远远优于所有以前的模型,并以巨大的优势击败了我们的基准“哑模型”。

但是等等,还有更多!

好吧,就像你没有想到的奖金模型:如果我们使用类似的想法,但也是一次卷积超过 8 小时,过滤形状为(8,1),会怎么样?

下面是下一个更深层的代码:

def deeper_conv2D(n_filters=10, fsize=5, window_size=5, n_features=2, hour_filter=8):
 new_model = keras.Sequential()
 new_model.add(tf.keras.layers.Conv2D(n_filters, (1,fsize), padding=”same”, activation=”linear”, input_shape=(window_size, n_features, 1)))
 new_model.add(tf.keras.layers.Conv2D(n_filters, (hour_filter, 1), padding=”same”, activation=”relu”))
 new_model.add(tf.keras.layers.Flatten())
 new_model.add(tf.keras.layers.Dense(1000, activation=’relu’))
 new_model.add(tf.keras.layers.Dense(100))
 new_model.add(tf.keras.layers.Dense(1))
 new_model.compile(optimizer=”adam”, loss=”mean_squared_error”) 
 return new_model

这种模式表现也很好:

根据我们的损失指标/优化目标,该模型的表现优于任何其他模型:

我们的最终结果!

您可以在以下位置找到所有相关代码以及样本数据集:【https://github.com/walesdata/2Dconv_pub

你可以在这里找到更多关于我和我在做什么的信息:【https://www.linkedin.com/in/john-wales-62832b5/

基于 SARIMA 模型的时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-with-a-sarima-model-db051b7ae459?source=collection_archive---------0-----------------------

预测加州大学伯克利分校一栋建筑的每日电力负荷

图片来源:艾琳娜·朱科娃

背景

你好。在本文中,我将使用 SARIMA 模型运行一个电力负荷预测示例。为加州大学伯克利分校的一栋建筑收集了三年的每日电力负荷数据,以根据该建筑从 2016 年 1 月到 2019 年 10 月的电力使用情况创建模型。该模型将预测 2019 年 11 月的日负荷,其有效性将使用平均绝对百分比误差来衡量。详细介绍该流程时,将涵盖以下主题:

  1. 平稳性(差分和增强的 Dickey-Fuller 检验)
  2. ACF 和 PACF 图
  3. 网格搜索和 AIC
  4. 向前走验证
  5. MAPE
  6. 外生变量

EDA 和平稳性检查

在建模之前,我们先来看看一些数据,看能不能提取出什么有意义的信息。

图 1:每日电力负荷示例

看上面的图 1,数据中有一个非常清晰的周趋势。当一周中上课时,电力负荷很高,而在周末,电力负荷较低。在确定 SARIMA 参数时,这一见解将会派上用场。

对于许多类型的时间序列模型,验证您的数据是平稳的是很重要的。简而言之,数据需要满足以下要求,以确保稳定性:

  • 常数平均值
  • 恒定方差
  • 恒定自相关结构(当前值取决于过去值)
  • 没有周期性成分

从上面的 EDA 中可以清楚地看到,数据包含周期性的成分,因此需要应用转换来使数据保持稳定。在这种情况下,我们将应用第一个差异和每周季节差异。下面的图 2 显示了对数据进行差异处理后的相同日期范围;它不再包含周趋势。

图 2:首次差异和季节差异后的日负荷

验证数据平稳性的一种快速简单的方法是通过扩展的 Dickey-Fuller 检验。这可以通过下面的代码来完成:

from statsmodels.tsa.stattools import adfulleradf, pvalue, usedlag_, nobs_, critical_values_, icbest_ = adfuller(train)

该测试的零假设(p 值> 0.05)是数据不是稳定的。根据上面代码的输出,p 值被计算为~ 0,所以我们可以拒绝零假设,说数据实际上是稳定的。开始做模特!

萨里玛模型参数— ACF 和 PACF 图

简单介绍一下, SARIMA 款是带有季节性元素的 ARIMA 款。根据公式萨里玛( pdq )x( PDQ、s ),这些型号的参数如下:

  • p 和季节性 P :表示自回归项的个数(平稳序列的滞后)
  • d 和季节性 D :表示为了平稳化系列必须进行的差分
  • q 和季节性 Q :表示移动平均项的个数(预测误差的滞后)
  • s :表示数据中的季节长度

采用两种方法来确定理想的萨里玛参数: ACF 和 PACF 图,以及网格搜索。使用 ACF 和 PACF 图作为起点,缩小到几个潜在参数,然后使用网格搜索来确定最佳参数。我们来看看吧!

ACF 和 PACF 图是使用下面的代码生成的,可以在下面的图 3 中看到。

import matplotlib.pyplot as plt
import statsmodels.api as smfig, ax = plt.subplots(2,1)
fig = sm.graphics.tsa.plot_acf(train, lags=50, ax=ax[0])
fig = sm.graphics.tsa.plot_pacf(train, lags=50, ax=ax[1])
plt.show()

图 3: ACF 和 PACF 图(x 轴=滞后数,y 轴=相关性)

可以看出,在滞后 1 和滞后 7(每周季节性成分)的 ACF 图中有显著的负尖峰。在 PACF 图中,在滞后 1 和 2 处有显著的负尖峰(即滞后衰减较慢),在滞后 7、14、21 等处也有显著的负尖峰。这些特征暗示了一个潜在的参数起点 SARIMA(0,1,1)x(0,1,1,7)

  • pP 都等于 0(在 ACF 和 PACF 图中没有显著的正尖峰)
  • dD 都等于 1(首差和季节差)
  • qQ 都等于 1(显著的负尖峰,PACF 衰减更平缓)
  • s 等于 7(每周季节性成分)

使用这些参数,模型与数据拟合,然后评估模型残差的一组新的 ACF 和 PACF 图。参见下面的代码:

model = sm.tsa.statespace.SARIMAX(train, order=(0,1,1), 
                                  seasonal_order(0,1,1,7))
                                 .fit(max_iter=50, method='powell')res = model.residfig, ax = plt.subplots(2,1)
fig = sm.graphics.tsa.plot_acf(res, lags=50, ax=ax[0])
fig = sm.graphics.tsa.plot_pacf(res, lags=50, ax=ax[1])
plt.show()

残差的 ACF 和 PACF 图见下图 4。除了在滞后 7 时,没有显著的峰值。这些参数是模型的一个可接受的起点,可以使用网格搜索进一步改进。

图 4:模型残差的 ACF 和 PACF 图

SARIMA 模型参数—网格搜索

以(0,1,1)x(0,1,1,7)为起点,建立网格搜索来测试许多不同的参数组合。值得关注的是那些 p = 0、1 或 2,q = 1 或 2 的模型。可以用来比较各模型相对质量的一个度量是 AIC (阿凯克信息准则),这是一个样本外预测误差的估计量;较低的 AIC 分数表明模型更具预测性。参见下面生成不同参数组合列表的代码,以及测试每个组合并打印相应 AIC 分数的 SARIMA 模型管道:

import itertools#set parameter range
p = range(0,3)
q = range(1,3)
d = range(1,2)
s = range(7,8)# list of all parameter combos
pdq = list(itertools.product(p, d, q))
seasonal_pdq = list(itertools.product(p, d, q, s))# SARIMA model pipeline
for param in pdq:
    for param_seasonal in seasonal_pdq:
        try:
            mod = sm.tsa.statespace.SARIMAX(train,
                                    order=param,
                                    seasonal_order=param_seasonal)
            results = mod.fit(max_iter = 50, method = 'powell')print('SARIMA{},{} - AIC:{}'.format(param, param_seasonal, results.aic))
        except:
            continue

在这种情况下,用 pP = 1 和 qQ = 2 获得了最低的 AIC 分数,因此要使用的最终 SARIMA 模型参数是 SARIMA(1,1,2)x(1,1,2,7)

与 MAPE 一起进行验证和评估

如本文背景所述,SARIMA 模型正在预测 2019 年 11 月的日用电负荷。虽然简单的训练/测试分割对于时间序列是可能的(在我们的例子中,测试数据是 2019 年 11 月的实际负荷数据),但更可靠的选择是向前行走验证,其中测试数据被分割多次。参见下面的代码;在第一次遍历中,根据模型对训练数据的拟合,预测 11 月第一周的日负荷。在第二次遍历中,将 11 月第一周的实际日负荷添加到训练数据中,重新调整模型,并预测 11 月第二周的负荷。11 月的第三和第四周遵循同样的程序。

平均绝对百分比误差(MAPE)是一个可用于评估 SARIMA 模型的指标。对于每个预测数据点,计算与相应测试点的绝对差值,然后除以测试点。平均百分比给出了 MAPE。请参见下面的代码,了解向前遍历验证和 MAPE 计算。

# data = entire dataset
# n_test = point where data is split into training and test setsdef walk_forward_validation(data, n_test): predictions = np.array([])
    mape_list = []
    train, test = data[:n_test], data[n_test:]
    day_list = [7,14,21,28] # weeks 1,2,3,4 for i in day_list:
        # Fit model to training data
        model = sm.tsa.statespace.SARIMAX(train, order=(1,1,2), 
                                          seasonal_order(1,1,2,7))       
                                         .fit(max_iter = 50,
                                          method = 'powell')

        # Forecast daily loads for week i
        forecast = model.get_forecast(steps = 7)
        predictions = np.concatenate(predictions, forecast, 
                                     axis=None) # Calculate MAPE and add to mape_list
        j = i-7
        mape_score = (abs(test[j:i]-predictions[j:i])/test[j:i])*100
        mape_mean = mape_score.mean()
        mape_list.append(mape_mean) # Add week i to training data for next loop
        train = np.concatenate((train, test[j:i]), axis=None)return predictions, mape_list

我们的模型预测的 MAPE 为 9.74%。还不错!让我们将预测和实际数据一起绘制出来,看看它们在视觉上是如何比较的。请参见下面的图 5。

图 5:每日负载预测与实际每日负载

预测似乎很好地遵循了每周的趋势,尽管在一个月中的一些日子里有相当大的误差。仔细看看,这些都是假期(特别是 11 日的退伍军人节,以及月底的感恩节假期)。

外变量

提高模型性能的一个快速方法是添加一个外生变量,该变量考虑了全年的假期。Python 有一个“假日”包,可以导入并用于确定日期是否为假日(可以指定美国假日)。

到目前为止,我们一直使用的 SARIMAX 模型只是将外生变量作为一个额外的参数。请参见下面的代码摘录:

model2 = sm.tsa.statespace.SARIMAX(train, holiday_ex_var, 
                                   order=(1,1,2), 
                                   seasonal_order(1,1,2,7))
                                  .fit(max_iter = 50, 
                                   method = 'powell')

通过 walk_forward_validation 函数运行这个模型,我们得到的 MAPE 为 7.04% 。这比最初的型号提高了 25%以上!请参见下图 6,了解与实际日负荷相比的最新预测。退伍军人节和感恩节负荷预测有了明显的改进;加入假日变量是有益的!然而,仍有改进的余地,因为在感恩节假期的其他日子里仍有明显的误差。这里不探讨减少这些误差的方法。

图 6:每日负荷预测(带有外部变量)与实际每日负荷的对比

结论

总的来说,我们经历了一个电力负荷预测问题,并涵盖了一些重要的时间序列主题。检验平稳性、分析 ACF 和 PACF 图、执行验证以及考虑外生变量都是实现 SARIMA 模型时必不可少的。

这个项目扩展到 70 多栋加州大学伯克利分校的建筑,并创建了一个交互式 Tableau 仪表板来显示预测;这里可以查看。下面还可以看到一段录制的演示。点击此处进入该项目的 github repo。

希望这个概述是有帮助的。下次见!

R 中 ARIMA 模型的时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-with-arima-model-in-r-77f4e2ae7abb?source=collection_archive---------15-----------------------

帕特里克·亨德利在 Unsplash 上的照片

从勘探到预测 1970 年至 2015 年的二氧化碳排放数据。

C 气候变化是真实的。更糟糕的是,人类的活动对环境并不友好,例如使用化石燃料作为交通工具、燃煤发电机、水泥生产等。这些活动的影响之一是气温上升和臭氧层消耗。

众所周知,发达国家,尤其是欧洲,正在减少导致气候变化的排放量。如果我们想象一些欧洲国家的时间序列,它没有显示出明显的增长,它有同样的排放量,甚至在某些情况下排放量减少,特别是俄罗斯联邦在 1991 年苏联解体后。它显示几乎没有明显的增长。

当我们看发展中国家时,情况就不同了。如果我们从东盟国家的角度来看这个图,它不时地显示出轻微的线性增长。正如你在下面看到的,

基于这个问题,本文将向您展示如何使用 R 中的 ARIMA 模型来预测欧盟委员会的 CO2 排放时间序列数据,您可以在此处获得数据以及我们为什么要使用该模型。

通过分析和预测排放物的产生量,我们可以知道已经产生了多少排放物,这对于制定什么样的政策来减少其增长是非常有用的。

注意:

这与我之前的文章不同,我之前的文章预测印度尼西亚的 CPI 是一个平稳的数据。在这种情况下,我将使用印度尼西亚的二氧化碳排放量向您展示如何处理非平稳数据。

但是等等,平稳和非平稳数据有什么区别?

平稳与非平稳数据

平稳数据和非平稳数据的区别在于时间的均值和方差。

静态数据在时间上具有恒定的均值、方差和相关性。而非平稳数据具有随时间变化的均值、方差和相关性。

还是一点想法都没有?好吧,看看这些可视化的东西:

回想一下我上一篇文章中的 CPI 图,这是一个平稳的数据。原因是 CPI 值不会随着时间的推移而增加,换句话说,无论它是否增加,都不存在趋势。

这是马来西亚随着时间的推移产生的二氧化碳排放量。正如我们所见,它显示了一些线性趋势。我们可以说,均值、方差和相关性随着时间的推移而增加。这就是为什么它是非平稳数据。

我希望你现在至少能理解平稳和非平稳时间序列数据之间的区别。

行动(或活动、袭击)计划

在我们进行分析之前,我会告诉你我是如何处理这些数据的。以下是我完成的步骤:

  1. 数据探索
  2. 型号识别和诊断
  3. 预测

分析

介绍

在建立模型之前,我们首先要知道数据。它看起来如何,与其他国家的模式有何不同,等等。我将描述什么是真正的数据集以及数据集中包含的信息。

该数据集代表了从 1970 年到 2015 年的二氧化碳排放总量。它记录了世界上所有国家的数量。欧洲委员会联合研究中心记录的 CO2 量是来自化石燃料使用和工业过程使用的排放,例如水泥生产、化学过程、非能源使用等等。这不包括生物质燃烧和其他农业相关活动,如森林火灾和农业废物燃烧。

探测

因为我已经告诉过你们一些国家的二氧化碳排放量,我将向你们具体展示印度尼西亚的二氧化碳排放量。这里展示了它的可视化,

正如我们在这里看到的,它随时间呈线性趋势。这是一个不稳定的数据,因为均值、方差和相关性会随着时间而变化。在 1970 年,二氧化碳排放量仅为 30.066 千吨,而在 2015 年,二氧化碳排放量为 502.961 千吨。

这是一个很大的变化。根据这些数据,我们希望使用 ARIMA 模型进行预测,以了解如果政府政策不变,未来几年的排放量是多少。

模型识别

因为这不是一个平稳的时间序列,我们必须找到与以前的值有差异的数据。

如果差分数据具有平稳特性,则可以使用 ARMA 模型对其建模。因此,我们可以从中找到模型的完美滞后。

为此,我们必须将该值作为一个时间序列对象,然后查看应用于 diff 函数的时间序列的结果。下面是代码的样子,

**indo <- df %>%
  filter(nation == "Indonesia") %>%
  pivot_longer(2:47, names_to = "year", values_to = "co2")indo.ts <- ts(indo$co2, frequency = 1, start = 1970)
indo.ts # Create Time Series Plot from 
plot(diff(indo.ts))**

这是它的可视化结果,

基于这种可视化,我们可以看到差异数据具有稍微更稳定的属性,并且没有趋势。因此,我们可以使用这些差异数据来找出哪些 AR 和 MA 参数适合我们的 ARIMA 模型。

为了找到适合我们的 ARIMA 模型的 AR 和 MA 的参数值,我们可以使用 ACF 和 PACF 函数来找到最佳值,

这是一个函数,我们可以看到 ACF 和 PACF 图,

**library(astsa)
acf2(diff(indo.ts), max.lag = 40)**

这是结果,

根据这个图,我们知道,ACF 和 PACF 函数略有下降,不会很快达到 0。因此,我们可以假设它将参数 p 与 1 一起使用,参数 q 也与 1 一起使用。所以,适合的 ARMA 模型是 ARMA(1,1)。

为了使模型成为 ARIMA 模型,我们只需添加另一个参数,即代表数据差异的 d。因此,我们的 ARIMA 模型将是 ARIMA(1,1,1),其中每个参数代表 p、d 和 q。p 是 AR 模型参数,d 是数据的差异量,q 是 MA 模型参数。

模型诊断

如果其他模型之间没有显著变化,ARIMA(1,1,1)将是我们的模型。在这种情况下,我们将尝试 ARIMA(2,1,1)和 ARIMA(1,1,2)来查看参数是否具有显著的 p 值。

我们可以简单地通过使用下面的函数来诊断这个模型,

**# ARIMA(1, 1, 1)
sarima(indo.ts, 1, 1, 1)# ARIMA(2, 1, 1)
sarima(indo.ts, 2, 1, 1)# ARIMA(1, 1, 2)
sarima(indo.ts, 1, 1, 2)**

这是每个参数的 p 值,

从左到右:ARIMA(1,1,1),ARIMA(1,1,2),ARIMA(2,1,1)

正如我们在这里看到的,ARIMA(1,1,1)在其参数上具有显著的 p 值。那么,ARIMA(1,1,2)和 ARIMA(2,1,1)这两个模型的 p 值都不显著。通过改变它的参数对模型没有任何影响。因此,我们可以用 ARIMA(1,1,1) 模型。

在我们为数据选择了最佳模型之后,我们还要诊断另一件事,那就是残差。以下是 sarima 函数的残差分析结果。

如果我们要使用这个模型,残差必须具有正态分布,并且其值的每个滞后之间没有相关性。基于这一可视化,我们可以看到残差没有任何显著的自相关性,正如我们从 ACF 图中看到的那样,大多数点也在直线上对齐,正如我们从 Q-Q 图中看到的那样,并且 Ljung-Box 统计 p 值没有越过蓝线。因此,我们可以用这个模型来做预测。

预测

如果我们想做一些预测,我们可以使用 sarima.for 函数来做。这个函数的每个参数都包括数据、我们要预测的时间,然后设置代表我们的 ARIMA 模型的 p、d 和 q 参数。

在本例中,我们想知道未来 35 年的二氧化碳排放量是多少,以及 2050 年的二氧化碳排放量是多少。

这是用来做预测的函数,

**sarima.for(indo.ts, n.ahead = 35, 1, 1, 1)**

这是它的视觉效果,

正如我们在这里看到的,黑点代表我们的数据,红色代表预测结果。正如我们在这里看到的,预测结果也显示了红线之间的灰色边界。它基本上表示预测结果的标准误差。该边界上没有大的边界,因此该模型具有良好的结果。

根据预测结果,我们知道 2050 年将产生约 904.186 千吨的二氧化碳排放量。这是一个巨大的二氧化碳排放量。因此,政府应该考虑如何减少排放的政策,这样才能对抗气候变化,使我们的地球更适合居住,而不是因为我们的活动而破坏地球的状况。

结论

总之,ARIMA 模型是对非平稳时间序列数据进行预测的良好模型。

我知道,这个模型并不完美,但至少它给出了未来的价值。知道这一点真的很重要,尤其是如果你是一个政策制定者,通过知道这个结果,你将知道制定什么样的政策。

我将引用这段话来结束这篇文章,以提醒我们,

“所有的模型都是错误的,但有些是有用的”——乔治·博克斯

参考

[1] Stoffer,D. S. & Shumway,R. H. 时间序列:一种使用 R (2019)的数据分析方法,Taylor & Francis Group。
【2】Hyndman,R.J. & Athanasopoulos,G. 预测:原理与实践 (2018),第 2 版,OTexts。

感谢您阅读我的文章,您也可以在下面查看我以前的文章:

**** [## R 时间序列分析导论

从探索,到预测。使用印度尼西亚 2002 年 12 月至 2020 年 4 月的消费者价格指数(CPI)数据

towardsdatascience.com](/introduction-to-time-series-analysis-with-r-a2f97650baa3) [## 我推荐你先学习 Python 的 3 个理由

如果你想从数据科学开始而不是先学 R

towardsdatascience.com](/3-reasons-why-i-recommend-you-to-learn-python-first-8e72ed4a6c65) [## 更高的准确性并不意味着更好的机器学习模型性能

我们可以定量地衡量机器学习模型的性能,但不仅仅是准确性,还有很多…

towardsdatascience.com](/greater-accuracy-does-not-mean-greater-machine-learning-model-performance-771222345e61)****

具有自回归过程的时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-with-autoregressive-processes-ba629717401?source=collection_archive---------5-----------------------

Python 中时间序列分析的 AR(p)过程实践教程

伊莲娜·科伊切娃在 Unsplash 上的照片

介绍

在本实践教程中,我们将讨论使用自回归过程进行时间序列建模的主题。

本文将涵盖时间序列分析中的以下关键要素:

  • 自回归过程
  • 尤尔-沃克方程
  • 平稳性
  • 扩充的迪克-富勒试验

确保准备好 Jupyter 笔记本,以便跟进。代码和数据集可在这里获得。

我们开始吧!

了解如何使用更复杂的模型,如 SARIMAX、VARMAX,并应用深度学习模型(LSTM、CNN、ResNet、自回归 LSTM)进行时间序列分析,并使用 Python 中的应用时间序列分析

自回归过程

一个自回归模型使用目标过去值的线性组合进行预测。当然,回归是针对目标本身进行的。数学上,AR(p)模型表示为:

自回归模型

其中:

  • p:这是命令吗
  • c:是常数
  • ε:噪声

AR(p)模型非常灵活,可以模拟许多不同类型的时间序列模式。当我们模拟自回归过程时,这是很容易想象的。

通常,自回归模型仅适用于平稳时间序列。这限制了参数φ的范围。

例如,AR(1)模型会将 phi 限制在-1 和 1 之间。随着模型阶数的增加,这些约束变得更加复杂,但是在 Python 中建模时会自动考虑这些约束。

AR(2)过程的模拟

让我们用 Python 模拟一个 AR(2)流程。

我们从导入一些库开始。并非所有这些都将用于模拟,但它们将是本教程其余部分所必需的。

from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.tsa.stattools import pacf
from statsmodels.regression.linear_model import yule_walker
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
import numpy as np%matplotlib inline

我们将使用 ArmaProcess 库来模拟时间序列。它要求我们定义我们的参数。

我们将模拟以下过程:

AR(2)过程

因为我们正在处理一个 2 阶的自回归模型,我们需要定义滞后 0,1 和 2 的系数。

此外,我们将取消移动平均线过程的影响。

最后,我们将生成 10 000 个数据点。

在代码中:

ar2 = np.array([1, 0.33, 0.5])
ma = np.array([1])simulated_AR2_data = ArmaProcess(ar2, ma).generate_sample(nsample=10000)

我们可以绘制时间序列:

plt.figure(figsize=[10, 7.5]); # Set dimensions for figure
plt.plot(simulated_AR2_data)
plt.title("Simulated AR(2) Process")
plt.show()

您应该会得到类似这样的结果:

模拟 AR(2)过程的图

现在,让我们来看看自相关图(相关图):

plot_acf(simulated_AR2_data);

AR(2)过程的相关图

你可以看到系数在慢慢衰减。这意味着它不太可能是一个移动平均过程,这表明时间序列可能可以用一个自回归过程来建模(这是有意义的,因为这正是我们正在模拟的)。

为了确保这是正确的,让我们绘制偏自相关图:

plot_pacf(simulated_AR2_data);

AR(2)过程的偏自相关图

正如你所看到的,滞后 2 之后,系数并不显著。因此,部分自相关图对于确定 AR(p)过程的阶数是有用的。

您还可以通过运行以下命令来检查每个系数的值:

pacf_coef_AR2 = pacf(simulated_AR2_data)
print(pacf_coef_AR2)

现在,在真实的项目设置中,可以很容易地找到 AR(p)过程的阶,但是我们需要找到一种方法来估计系数φ

为此,我们使用了尤尔-沃克方程。这个方程允许我们在已知阶数的情况下估计 AR(p)模型的系数。

rho, sigma = yule_walker(simulated_AR2_data, 2, method='mle')
print(f'rho: {-rho}')
print(f'sigma: {sigma}')

尤尔-沃克系数估计

如你所见,Yule-Walker 方程在估算我们的系数方面做得不错,非常接近 0.33 和 0.5。

AR(3)过程的模拟

现在,让我们模拟一个 AR(3)过程。具体来说,我们将模拟:

AR(3)过程模拟

类似于之前所做的,让我们定义我们的系数并生成 10 000 个数据点:

ar3 = np.array([1, 0.33, 0.5, 0.07])
ma = np.array([1])simulated_AR3_data = ArmaProcess(ar3,ma).generate_sample(nsample=10000)

然后,我们可以将时间序列可视化:

plt.figure(figsize=[10, 7.5]); # Set dimensions for figure
plt.plot(simulated_AR3_data)
plt.title("Simulated AR(3) Process")
plt.show()

您应该会看到类似如下的内容:

模拟 AR(3)过程

现在,看看 PACF 和 ACF:

plot_pacf(simulated_AR3_data);
plot_acf(simulated_AR3_data);

AR(3)流程的 PACF 和 ACF

你可以看到,对于 PACF 函数来说,滞后 3 之后的系数并不像预期的那样显著。

最后,让我们使用尤尔-沃克方程来估计系数:

rho, sigma = yule_walker(simulated_AR3_data, 3, method='mle')
print(f'rho: {-rho}')
print(f'sigma: {sigma}')

尤尔-沃克系数估计

同样,估计值相当接近实际值。

项目—预测强生公司的季度每股收益

现在,让我们将自回归过程的知识应用到项目设置中。

目标是模拟强生公司 1960 年至 1980 年间的每股季度收益(EPS)。

首先,我们来读一下数据集:

import pandas as pddata = pd.read_csv('jj.csv')
data.head()

数据集的前五行

现在,前五行对我们来说不是很有用。让我们绘制整个数据集,以获得更好的可视化表示。

plt.figure(figsize=[15, 7.5]); # Set dimensions for figure
plt.scatter(data['date'], data['data'])
plt.title('Quaterly EPS for Johnson & Johnson')
plt.ylabel('EPS per share ($)')
plt.xlabel('Date')
plt.xticks(rotation=90)
plt.grid(True)
plt.show()

强生公司 1960 年至 1980 年间的每股收益

厉害!现在我们可以看到数据有明显的上升趋势。虽然这对公司来说可能是一个好迹象,但就时间序列建模而言,这并不好,因为这意味着时间序列不是平稳的。

如前所述,AR(p)过程仅适用于平稳序列。

因此,我们必须对数据进行一些转换,使其保持稳定。

在这种情况下,将取对数差。这相当于取每个值的对数,减去前一个值。

# Take the log difference to make data stationarydata['data'] = np.log(data['data'])
data['data'] = data['data'].diff()
data = data.drop(data.index[0])
data.head()

绘制转换后的时间序列:

plt.figure(figsize=[15, 7.5]); # Set dimensions for figure
plt.plot(data['data'])
plt.title("Log Difference of Quaterly EPS for Johnson & Johnson")
plt.show()

强生公司季度每股收益的对数差异

现在,似乎我们消除了这种趋势。然而,在用 AR(p)过程建模之前,我们必须确保我们的序列是平稳的。

因此,我们将使用扩展的 Dicker-Fuller 检验。这将给我们统计上的信心,我们的时间序列确实是平稳的。

ad_fuller_result = adfuller(data['data'])
print(f'ADF Statistic: {ad_fuller_result[0]}')
print(f'p-value: {ad_fuller_result[1]}')

ADF 测试的结果

由于我们得到一个大的负 ADF 统计量和小于 0.05 的 p 值,我们可以拒绝零假设,说我们的时间序列是平稳的。

现在,让我们通过绘制 PACF 来找到该过程的顺序:

plot_pacf(data['data']);
plot_acf(data['data']);

PACF 和 ACF

正如你所看到的,在滞后 4 之后,PACF 系数不再重要。因此,我们将假设一个 4 阶的自回归过程。

现在,我们将利用这些信息,通过 Yule-Walker 方程来估算系数:

# Try a AR(4) model
rho, sigma = yule_walker(data['data'], 4)
print(f'rho: {-rho}')
print(f'sigma: {sigma}')

尤尔-沃克系数估计

因此,该函数近似为:

请注意,此等式模拟了转换后的序列。

结论

恭喜你!您现在了解了什么是自回归模型,如何识别自回归过程,如何确定其顺序,以及如何使用它来模拟现实生活中的时间序列。

提高您的时间序列分析技能,并学习 Python 中时间序列分析的最新最佳实践:

干杯🍺

基于深度学习和注意机制的时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-with-deep-learning-and-attention-mechanism-2d001fc871fc?source=collection_archive---------1-----------------------

入门指南

用于时间序列预测的最重要的深度学习算法的架构和实现细节的概述

图片来自https://images . unsplash . com/photo-1506555191898-a 76 bacf 004 ca?IX lib = r b-1 . 2 . 1&ixid = eyjhchbfawqiojeymdd 9&auto = format&fit = crop&w = 500&q = 60

动机

时间序列预测在许多领域一直是一个非常重要的研究领域,因为许多不同类型的数据都存储为时间序列。例如,我们可以在医学、天气预报、生物学、供应链管理和股票价格预测等领域找到大量的时间序列数据。

鉴于近年来数据可用性和计算能力的不断增长,深度学习已成为新一代时间序列预测模型的基础部分,并取得了优异的效果。

虽然在经典的机器学习模型(如自回归模型(AR)或指数平滑)中,特征工程是手动执行的,并且通常还会考虑领域知识来优化一些参数,但深度学习模型仅直接从数据中学习特征和动态。得益于此,他们加快了数据准备的过程,并能够以更完整的方式学习更复杂的数据模式。

随着不同时间序列问题在许多不同领域的研究,近年来开发了大量新的体系结构。开源框架的日益普及也简化了这一过程,它使得新的定制网络组件的开发更加容易和快速。在这篇文章中,我们总结了时间序列预测最常见的深度学习方法。

应用程序

让我们看看时间序列预测的一些重要应用。

股票价格预测- 许多先进的时间序列预测模型被用于预测股票价格,因为在历史序列中存在大量噪声和高度不确定性的信息,这些信息可能依赖于不总是与股票市场密切相关的几个因素。

天气预测——时间序列预测模型被广泛用于
提高天气预测的准确性。

预测交通 -旅行规划应用程序使用时间序列预测模型来预测道路上的交通,以便更准确地决定到达所选目的地的最快方式。

许多公司使用时间序列预测模型来预测他们在哪个月可以预期更高的流动率,以便他们可以实施最佳的员工保留计划。

文本生成- 当我们在智能手机上写文本时,它会查看最后写的单词和键入的字母,并建议接下来的字母甚至整个单词。

时间序列组件

首先,解释时间序列的主要组成部分是很重要的。

长期趋势

长期趋势是数据的总体方向,忽略任何短期影响,如季节变化或噪音。

季节性

季节性是指在整个时间序列期间重复的周期性波动。

平稳性

平稳性是时间序列的一个重要特征。如果时间序列的均值、方差和协方差不随时间发生显著变化,则称该时间序列是平稳的。有许多变换可以提取非平稳过程的平稳部分。

噪音

每组数据都有噪声,即由于不可控因素导致的随机波动或变化。

自相关

自相关是时间序列与其自身的滞后版本之间的相关性,用于识别时间序列数据中的季节性和趋势。

基于传统机器学习的时间序列预测

在谈论时间序列预测的深度学习方法之前,回忆一下用于解决这个问题的最经典的机器学习模型是 ARIMA 模型和指数平滑是有用的。

ARIMA 主张在建立时间序列的复合模型时结合自回归(AR)和移动平均(MA)方法。这个模型非常简单,但可能会有好的结果。它包括说明季节性、长期趋势、自回归和移动平均项的参数,以便处理数据中嵌入的自相关。

在指数平滑法中,预报是在加权平均值的基础上进行的,就像在 ARIMA 模型中一样,但是在这种情况下,不同的递减权重被分配给每个观测值,随着我们离现在越来越远,对观测值的重视程度越来越低。

传统机器学习的劣势

众所周知,这些传统的机器学习模型有许多局限性:

  • 缺少值确实会影响模型的性能;
  • 他们不能识别数据中的复杂模式;
  • 它们通常只在分步预报中有效,在长期预报中无效。

时间序列预测的深度学习

使用深度学习进行时间序列预测克服了许多不同方法的传统机器学习缺点。本文提出了 5 种不同的时间序列预测深度学习架构:

  • 递归神经网络(RNNs),时间序列预测问题最经典、最常用的架构;
  • 长短期记忆(LSTM) ,其是为了克服消失梯度问题而开发的 RNNs 的进化;
  • 门控循环单元(GRU) ,那是 RNNs 的另一种进化,类似于LSTM;
  • 编码器-解码器模型,这是为了解决输入序列与输出序列长度不同的问题而引入的 RNNs 模型;
  • 注意机制,它是编码器-解码器模型的一种进化,其开发是为了避免忘记序列的较早部分。

递归神经网络

递归神经网络是组织成连续层的神经元样节点的网络,具有类似于标准神经网络的架构。事实上,像在标准神经网络中一样,神经元被分为输入层、隐藏层和输出层。神经元之间的每个连接都有相应的可训练权重。

不同之处在于,在这种情况下,每个神经元都被分配到一个固定的时间步长。隐藏层中的神经元也在时间相关的方向上被转发,这意味着它们中的每一个都仅与具有相同分配时间步长的隐藏层中的神经元完全连接,并且与分配到下一个时间步长的每一个神经元单向连接。输入和输出神经元仅连接到具有相同指定时间步长的隐藏层。

由于一个时间步长的隐藏层的输出是下一个时间步长的输入的一部分,神经元的激活是按时间顺序计算的:在任何给定的时间步长,只有分配给该时间步长的神经元计算它们的激活。

体系结构

作者图片

权重-RNNs 中,时刻 t 的输入向量通过权重矩阵 U 连接到时刻 t 的隐层神经元,隐层神经元通过权重矩阵 W 连接到时刻 t-1t+1 的神经元,隐层神经元连接到输出所有权重矩阵在每个时间步都是常数

输入- 向量 x(t) 是网络在时间步长t的输入

隐藏状态- 向量 h(t) 是时间处的隐藏状态,是网络的一种内存y;它是基于当前输入和前一时间步的隐藏状态计算的:

输出— 矢量 y^(t) 是网络在时间 t 的输出:

学习算法

学习过程的目标是从真实值 y(t) 的输入 x(t) 开始,找到给出 y^(t) 的最佳预测的最佳权重矩阵 UVW

为了实现这一点,我们定义了一个目标函数,称为损失函数并表示为 J,,它量化了整个训练集的实际值和预测值之间的距离。它是由

在哪里

  • 成本函数 L 评估单个时间步长上的实际值和预测值之间的距离;
  • m 是训练集的大小;
  • θ 模型参数的向量。

使用这两个主要步骤使损失函数 J 最小化:通过时间的向前传播向后传播这些步骤迭代多次,迭代次数称为历元数。**

前向传播 -使用固定参数 UWV ,数据通过网络传播,在每个时刻 t ,我们使用之前定义的公式计算 y^ (t) 。最后计算损失函数。

通过时间的反向传播- 相对于不同的参数计算成本函数的梯度,然后应用下降算法以便更新它们。每个输出端的梯度既取决于同一时间步的元素,也取决于前一时间步的存储器状态。

递归神经网络的优势

一般来说,RNNs 解决了时间序列预测的传统机器学习模型的许多问题。

  1. RNNs 的性能不会受到丢失值的显著影响。
  2. RNNs 可以发现输入时间序列中的复杂模式。
  3. RNNs 在预测多于几步的情况下给出了良好的结果。
  4. RNNs 可以对数据序列进行建模,以便可以假设每个样本都依赖于前一个样本。

递归神经网络的缺点

  1. 当在长时间序列上训练时,rnn 通常会遭受消失梯度爆炸梯度问题,这意味着隐藏层中的参数要么不会改变太多,要么会导致数值不稳定和混沌行为。这是因为成本函数的梯度包括影响其记忆能力的 W、的幂。
  2. 上面描述的内在循环网络存在记忆力差的问题,在预测未来时不能考虑过去的几个因素。
  3. 递归神经网络的训练很难并行化,并且计算量也很大。

鉴于这些缺点,RNNs 的各种扩展被设计来修整内部存储器:双向神经网络、LSTM、GRU、注意力机制。在金融等特定领域,扩大记忆可能至关重要,在这些领域,最基本的是尽可能多地记忆历史,以便预测接下来的步骤。

长短期记忆(LSTM)

长短期记忆网络(LSTM)已经被开发出来,通过改善网络内的梯度流来克服标准 RNN 中的梯度消失问题。这是通过使用 LSTM 单元代替隐藏层来实现的。如下图所示,一个 LSTM 单元包括:

  • 一个信元状态,它带来整个序列的信息并代表网络的存储;
  • 一个忘记门,它决定从先前的时间步骤中保留什么;
  • 一个输入门,它决定从当前时间步长添加什么相关信息;
  • 一个输出门,决定当前时间步长的输出值。

类似于 RNNs,时间 t 的输入向量通过权重矩阵 U 连接到时间 t 的 LSTM 单元,LSTM 单元通过权重矩阵 W 连接到时间 t-1t+1 的 LSTM 单元,LSTM 单元连接到时间t的输出向量矩阵 WU 被分成子矩阵( WfWiWgWo;Uf* 、 UiUgUo )连接到 LSTM 单元的不同元件,如下图所示。所有权重矩阵在时间上是共享的。*

作者图片

细胞状态在处理过程中传递相关信息,因此来自前一时间步的信息也会到达每个时间步,从而减少短期记忆的影响。在所有时间步骤的训练中,门学习哪些信息是重要的,应该保留或忘记,并将它们添加到细胞状态中,或从细胞状态中删除。

通过这种方式,LSTM 允许恢复内存中传输的数据,解决了消失梯度问题。LSTM 可用于分类、处理和预测具有未知持续时间的时间滞后的时间序列。

忘记大门

第一道门是遗忘之门。这个入口决定哪些信息应该被删除或保存。来自先前隐藏状态的信息和来自当前输入的信息通过 sigmoid 函数传递。输出接近 0 意味着信息可以被遗忘,而输出接近 1 意味着信息必须被保存。

输入门

第二个门是输入门。这用于更新单元状态。最初,先前的隐藏状态和当前输入作为输入被给定到 sigmoid 函数(输出越接近 1,信息越重要)。它还将隐藏状态和当前输入传递给一个 tanh 函数,以将值压缩在-1 和 1 之间,从而改善网络的调谐。然后, tanhsigmoid 的输出被逐元素相乘(在下面的公式中,符号表示两个矩阵的逐元素相乘)。 sigmoid 输出决定哪些信息对 tanh 输出是重要的。*

细胞状态

输入门激活后,可以计算单元状态。首先,前一时间步的单元状态按元素乘以遗忘门的输出。当单元状态中的值乘以接近 0 的值时,这提供了忽略这些值的可能性。然后,输入门的输出被逐元素添加到单元状态。输出是新的单元状态。

输出门

第三个也是最后一个门是输出门,它决定下一个隐藏状态的值,该值包含有关先前输入的信息。首先,将先前的隐藏状态和当前输入相加,并传递给一个 sigmoid 函数。然后,新的单元状态被传递给 tanh 函数。最后, tanh 输出与 sigmoid 输出相乘,以决定隐藏状态应该包含什么信息。输出是新的隐藏状态。然后,新的单元状态和新的隐藏状态被带到下一个时间步骤。

门控循环单元(GRU)

GRU 是新一代的递归神经网络,非常类似于 LSTM。为了解决标准 RNN 的消失梯度问题,GRU 使用了更新门重置门。这两个门决定什么信息应该被传递到输出。这两个门可以被训练以保持来自实际时间步长之前的许多时间步长的信息,而不随时间推移清洗它,或者移除与预测无关的信息。如果仔细训练,GRU 甚至可以在复杂的情况下表现得非常好。

如下图所示,一个 GRU 单元包括:

  • 一个复位门,它决定有多少来自先前时间步骤的信息可以被遗忘;
  • 一个更新门,它决定必须保存多少来自先前时间步骤的信息;
  • 一个存储器,它携带整个序列的信息并代表网络的存储器。

作者图片

复位门

第一个门是复位门。它决定了如何将新的输入与以前的记忆结合起来,决定了可以忘记多少以前时间步骤的信息。首先,执行输入 x(t) 和存储器h(t-1)之间的加权和,该存储器保存先前 t-1 步骤的信息。然后应用 sigmoid 激活函数将结果压缩在 0 和 1 之间。

更新门

第二个门是更新门。它有助于模型确定有多少来自先前时间步骤的信息需要传递到未来。这真的很强大,因为模型可以决定复制过去的所有信息,并消除消失梯度问题的风险。计算它的公式类似于复位门的公式,但是不同之处在于权重和门的用途(在存储器的计算中会很清楚)。

当前内存

存储器内容使用复位门来存储来自过去的相关信息。为了获得它,首先计算复位门 r(t) 的输出与前一时间步 h(t-1) 的最终存储器之间的逐元素乘法,然后执行结果与输入 x(t) 之间的加权和。最后,应用非线性激活函数 tanh

最终记忆

作为最后一步,网络需要计算 h(t) ,即保存当前单元信息的向量,并将其传递到下一个时间步骤。它决定了从当前内存内容 h ~ (t) 中收集什么,从前面的步骤 h(t-1) 中收集什么。它是通过在更新门 z_th_(t-1) 之间以及 (1-z_t)h~(t) 之间应用逐元素乘法来计算的,最后在两个结果之间执行 yhr 加权求和。**

RNN、LSTM、GRU 的执行情况

RNN、LSTM 和 GRU 可以使用 Keras API 实现,该 API 旨在易于使用和定制。Keras 中存在以下 3 个 RNN 层:

  • keras.layers.SimpleRNN
  • keras.layers.LSTM
  • keras.layers.GRU

它们允许您快速创建重复模板,而不必做出困难的配置选择。此外,可以定义一个具有所需行为的自定义 RNN 细胞层,允许以最少的代码灵活地快速测试各种不同的原型。在 Tensorflow 网站上,可以找到使用这些图层的说明和许多示例。

编码器-解码器模型

在 RNN、LSTM 和 GRU,每个输入对应于同一时间步的一个输出。然而,在许多实际情况下,我们希望在给定不同长度的输入序列的情况下预测输出序列,而不需要每个输入和每个输出之间的对应关系。这种情况称为序列到序列映射模型,是众多常用应用的基础,例如语言翻译、语音设备和在线聊天机器人。

为了解决序列到序列* 映射模型,引入了递归神经网络的编码器-解码器模型。编码器-解码器将一个序列作为输入,并生成最可能的下一个序列作为输出。顾名思义,该模型由两个子模型组成:*

  • **编码器,负责逐步通过输入时间步骤,并将整个序列编码成称为上下文向量的固定长度向量;
  • **解码器,负责在从上下文向量中读取时步进输出时间步长。

作者图片

编码器

编码器是几个递归单元的堆叠,这些递归单元可以是简单的 rnn、LSTM 单元或 GRU 单元。每个单元接受输入序列的单个元素,从该元素收集信息并将其向前传播。

使用所选择的递归单元的函数来计算隐藏状态向量 h(t) 。该函数以适当的权重应用于先前的隐藏状态 h(t-1) 和输入向量x(t)**

最终隐藏状态向量 h(t) 包含来自先前隐藏表示和先前输入的所有编码信息。

上下文向量

上下文向量是从模型的编码器部分产生的最终隐藏状态,并表示解码器的初始隐藏状态。它封装了所有输入元素的信息,以帮助解码器做出准确的预测。

解码器

解码器由几个循环单元的堆栈组成。每个递归单元从前一个单元接受一个隐藏状态 s(t-1) ,并产生和输出 y^(t) 以及它自己的隐藏状态 s(t)

隐藏状态 s(t) 是根据所选递归单元的功能计算的:

使用当前时间步 s(t) 处的隐藏状态以及相应的权重,使用 softmax 函数来计算输出 y^(t) ,以便创建概率向量:

优点和缺点

该模型的强大之处在于它可以将不同长度的序列相互映射,因为输入和输出是不相关的,它们的长度可以不同。这开启了一系列全新的问题,现在可以使用这种架构来解决。

这种技术适用于小序列,但是当序列的长度增加时,很难将长序列总结成单个向量,然后 model 在处理最后部分时经常忘记输入序列的前面部分。这就是为什么许多实验表明,随着序列大小的增加,该模型的性能下降。

注意机制

注意机制是深度学习中的主要前沿之一,并且是编码器-解码器模型的进化,开发该模型是为了提高对长输入序列的性能。

主要思想是允许解码器在解码期间选择性地访问编码器信息。这是通过为解码器的每个时间步长构建不同的上下文向量、根据编码器的前一隐藏状态和所有隐藏状态来计算它、为它们分配可训练的权重来实现的。

这样,注意机制对输入序列的不同元素赋予不同的重要性,对更相关的输入给予更多的注意* 。这解释了模型的名称)。*

作者图片

编码器

编码器操作非常类似于编码器-解码器模型的相同操作。在每个时间步长,每个输入序列的表示作为前一个时间步长和当前输入的隐藏状态的函数进行计算。最终隐藏状态包含来自先前隐藏表示和先前输入的所有编码信息。

上下文向量

注意机制和编码器-解码器模型之间的主要区别在于,为解码器的每个时间步长 t 计算不同的上下文向量 c(t)

为了计算时间步长 t 的上下文向量 c(t) ,我们进行如下。首先,对于编码器的时间步长 j 和解码器的时间步长 t 的每个组合,所谓的对准分数 e(j,t)* 用以下加权和计算:*

在这个方程中, Wₐ,uₐ, Vₐ 为可训练权重,称为注意力权重。权重 Wₐ 与编码器的隐藏状态相关联,权重 Uₐ 与解码器的隐藏状态相关联,权重 Vₐ 定义计算校准分数的函数。

对于每个时间步长 t ,在编码器时间步长 j 上使用 softmax 函数对分数 e(j,t) 进行归一化,得到注意力权重* α(j,t)*

注意力权重α(j,t) 捕捉时间步长 j 的输入对于解码时间步长 t 的输出的重要性。上下文向量 c(t) 根据注意力权重计算为编码器所有隐藏值的加权和:

该上下文向量允许对输入句子中更相关的输入给予更多关注* 。*

解码器

现在上下文向量 c(t) 被传递给解码器,解码器计算下一个可能输出的概率分布。这种解码操作适用于输入中出现的所有时间步长。

然后根据递归单元函数计算当前隐藏状态 s(t) ,输入上下文向量 c(t) ,隐藏状态 s(t-1) 和输出前一时间步的 y^(t-1) :

因此,使用这种机制,该模型能够找到输入序列的不同部分和输出序列的相应部分之间的相关性。

对于每个时间步长,将 softmax 函数应用于加权隐藏状态来计算解码器的输出:

优势

  • 正如已经提到的,注意机制在存在长输入序列的情况下也给出了好的结果。
  • 由于注意力权重,注意力机制还具有比其他深度学习模型更易解释的优势,其他深度学习模型通常被认为是黑盒,因为它们不具有解释其输出的能力。
  • 此外,注意机制在 NLP 模型中给出了突出的结果,因为它允许记住输入中的所有单词,并在制定响应时识别最相关的单词。

履行

注意机制可以使用 TensorFlow 和 Keras 开发,并很容易与其他 Keras 层集成。在 Github 上可以找到许多实现,例如:

https://github.com/uzaymacar/attention-mechanisms

https://github.com/philipperemy/keras-attention-mechanism

在这些环节,也有很多关于情感分类、文本生成、文档分类、机器翻译的例子。

结论

递归神经网络是用于时间序列预测的最流行的深度学习技术,因为它们允许在许多不同的问题中对时间序列进行可靠的预测。rnn 的主要问题是,当应用于长序列时,它们遭受消失梯度问题。

LSTM 和 GRU 是为了通过使用门来减轻 RNNs 的消失梯度问题而创建的,门通过序列链来调节信息流。LSTM 和 GRU 的使用在诸如语音识别、语音合成、自然语言理解等应用中给出了显著的结果。

递归神经网络的编码器-解码器模型是序列到序列映射问题中最常见的技术,其中输入序列与输出序列的长度不同。

注意机制是编码器-解码器模型的发展,其诞生是为了解决编码器-解码器模型在长序列存在时的性能下降,对每个时间步长使用不同的上下文向量。它在许多领域都取得了显著的效果,例如自然语言处理、文本分类、文档分类等。

作者

我关于走向数据科学的文章:https://medium.com/@marcodelpra

*我的 LinkedIn 个人资料:【https://www.linkedin.com/in/marco-del-pra-7179516/ *

领英集团 AI 学习:https://www.linkedin.com/groups/8974511/

基于图卷积神经网络的时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-with-graph-convolutional-neural-network-7ffb3b70afcf?source=collection_archive---------5-----------------------

结合图和递归结构的商店物品需求预测

米歇尔·比特托在 Unsplash 上的照片

时间序列预测任务可以通过以下不同的方法来完成。最经典的是基于统计和自回归方法。更棘手的是基于 boosting 和 ensemble 的算法,在这些算法中,我们必须产生大量有用的手工制作的滚动周期特征。另一方面,我们可以找到神经网络模型,使其开发更加自由,提供可定制的顺序建模和更多。

递归和卷积结构在时间序列预测中取得了巨大成功。该领域中有趣的方法是通过采用最初在 NLP 中固有的转换器和注意力架构来给出的。图形结构的使用似乎不常见,其中我们有一个由不同节点组成的网络,这些节点通过某种链接相互关联。我们试图用时间序列的图形表示来预测未来。

在本文中,我们执行了一项销售预测任务,其中我们利用图形卷积神经网络,利用我们的数据的嵌套结构,这些数据由不同商店中各种商品的不同销售系列组成。

数据

该数据集是从 Kaggle 上过去的比赛中收集的。商店商品需求预测挑战赛以每日格式提供了各商店销售的不同商品的 4 整年的销售数据。我们有 10 家商店和 50 种产品,总共 500 个系列。每个产品在每个商店都有销售。我们的范围是每天为所有项目提供准确的未来预测。

每个商店中商品 10 的销售额

我们掌握的数据很少:只有销售额以及商品和商店的数字编码。这仍然足以让我们强调一个基本的层次结构。我们需要做的就是在项目级别对系列进行分组,这样我们最终得到 50 个组(项目),每个组由 10 个系列组成(每个商店销售的项目);上图描述了一个组的示例。

在经典图网络中,所有相关信息都存储在一个名为邻接矩阵的对象中。这是数据中所有关联的数字表示。我们上下文中的相邻矩阵可以通过根据所有商店中给定商品的销售序列计算的相关矩阵来检索。

序列重新划分在我们的方法中是基本的,因为我们决定像递归架构一样处理数据,这也将是我们模型的一部分。

模型

我们的模型接收来自所有商店的销售序列和从相同序列获得的相邻矩阵作为输入。序列通过 LSTM 层,而相关矩阵由图卷积层处理。它们在 Spektral 中实现,这是一个基于 Tensorflow 构建的很酷的图形深度学习库。它提供了各种类型的图层。我们使用最基本的一种,图卷积。它在可学习的权重、外部节点特征(与相邻矩阵一起提供)和我们的相关矩阵之间进行一系列卷积运算。不太可能,目前 Spektral 不支持 Window,所以我必须手动提取我感兴趣的类并创建我的 Python 可执行文件。

我们的网络看起来如下:

def get_model(): opt = Adam(lr=0.001) inp_seq = Input((sequence_length, 10))
    inp_lap = Input((10, 10))
    inp_feat = Input((10, X_train_feat.shape[-1])) x = GraphConv(32, activation='relu')([inp_feat, inp_lap])
    x = GraphConv(16, activation='relu')([x, inp_lap])
    x = Flatten()(x) xx = LSTM(128, activation='relu',return_sequences=True)(inp_seq)
    xx = LSTM(32, activation='relu')(xx) x = Concatenate()([x,xx])
    x = BatchNormalization()(x)
    x = Dropout(0.5)(x)
    x = Dense(128, activation='relu')(x)
    x = Dense(32, activation='relu')(x)
    x = Dropout(0.3)(x)
    out = Dense(1)(x) model = Model([inp_seq, inp_lap, inp_feat], out)
    model.compile(optimizer=opt, loss='mse', 
                  metrics=[tf.keras.metrics.RootMeanSquaredError()]) return model

如前所述,在开发递归网络时,数据的处理一如既往。这些序列是固定时间段内所有商店中所考虑商品的销售情况的集合。

在我们的例子中,下一步是在相同的序列上计算商店间销售额的相关矩阵,它代表我们的相邻矩阵。与它们一起提供了一些手工制作的特征(如平均值、标准偏差、偏斜度、峰度、回归系数),这些特征由我们根据每个序列的存储进行计算,代表我们在网络中的节点特征。

给定样本协方差或相关矩阵,我们可以基于频谱卷积的一阶近似,应用拉普拉斯归一化来估计邻接矩阵,这使得能够使用高效的逐层传播规则(如这里的所述和在频谱中实现的)。

给定相关矩阵的拉普拉斯归一化过程

训练是用前两年的数据计算的,而剩下的两年分别用于验证和测试。我为每个商店训练了一个模型,所以我们最终得到了总共 10 个不同的神经网络。

在训练程序结束时,悬挂物的预测由相关模型检索。误差计算为测试数据的 RMSE,报告如下。

RMSE 为每个商店计算了测试集上的所有项目

同样,很容易提取 desired stores 中商品的预测,直接操作我们的嵌套数据结构。

测试数据预测

摘要

在这篇文章中,我在一个不常见的场景中采用了图形神经网络,比如时间序列预测。在我们的深度学习模型中,图依赖将自身与循环部分相结合,试图提供更准确的预测。这种方法似乎很适合我们的问题,因为我们可以强调我们的数据中的基本层次结构,我们用相关矩阵进行数字编码。

查看我的 GITHUB 回购

保持联系: Linkedin

参考文献

用 Python 中的 SARIMA 进行时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-with-sarima-in-python-cda5b793977b?source=collection_archive---------2-----------------------

关于使用 Python 使用 SARIMA 进行时间序列建模的实践教程

摩根·豪斯尔在 Unsplash 上的照片

在之前的文章中,我们介绍了移动平均过程 MA(q) ,和自回归过程 AR(p) 。我们将它们结合起来,形成了 ARMA(p,q)和 ARIMA(p,d,q)模型来模拟更复杂的时间序列。

现在,给模型添加最后一个组件:季节性。

本文将涵盖:

  • 季节性 ARIMA 模型
  • 使用真实数据的完整建模和预测项目

Github 上有笔记本数据集

我们开始吧!

关于 Python 中时间序列分析的完整课程,涵盖统计和深度学习模型,请查看我新发布的 课程

萨里玛模型

到目前为止,我们还没有考虑时间序列中季节性的影响。然而,这种行为肯定存在于许多情况下,如礼品店销售或飞机乘客总数。

季节性 ARIMA 模型或萨里玛的写法如下:

萨里玛符号

你可以看到我们为时间序列的季节性部分添加了 P、D 和 Q。它们与非季节性成分的术语相同,因为它们涉及季节性周期的后移。

在上面的公式中, m 是每年或一段时间内的观察次数。如果我们分析季度数据, m 等于 4。

ACF 和 PACF 图

AR 和 MA 模型的季节性部分可以从 PACF 和 ACF 图中推断出来。

在 SARIMA 模型中,只有一个阶为 1、周期为 12 的季节性移动平均过程,表示为:

  • 在滞后 12 时观察到峰值
  • PACF 季节滞后的指数衰减(滞后 12,24,36,…)

类似地,对于仅具有阶为 1、周期为 12 的季节性自回归过程的模型:

  • ACF 季节性滞后的指数衰减(滞后 12,24,36,…)
  • 在 PACF 中,在滞后 12 时观察到峰值

系统模型化

建模过程与非季节性 ARIMA 模型相同。在这种情况下,我们只需要考虑额外的参数。

使时间序列平稳和根据最低 AIC 选择模型所需的步骤仍留在建模过程中。

让我们用真实世界的数据集来涵盖一个完整的示例。

项目—为强生公司的季度每股收益建模

我们将重温强生公司的季度每股收益(EPS)数据集。这是一个非常有趣的数据集,因为有一个移动平均过程在起作用,而且我们有季节性,这是用 SARIMA 进行一些练习的完美时机。

和往常一样,我们首先导入所有必要的库来进行分析

from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
from tqdm import tqdm_notebook
import numpy as np
import pandas as pdfrom itertools import productimport warnings
warnings.filterwarnings('ignore')%matplotlib inline

现在,让我们读入数据帧中的数据:

data = pd.read_csv('jj.csv')

然后,我们可以显示一个时间序列图:

plt.figure(figsize=[15, 7.5]); # Set dimensions for figure
plt.plot(data['date'], data['data'])
plt.title('Quarterly EPS for Johnson & Johnson')
plt.ylabel('EPS per share ($)')
plt.xlabel('Date')
plt.xticks(rotation=90)
plt.grid(True)
plt.show()

强生公司季度每股收益

很明显,时间序列不是静态的,因为它的平均值在整个时间内不是恒定的,我们看到数据中的方差在增加,这是异方差的标志。

为了确保这一点,让我们绘制 PACF 和 ACF:

plot_pacf(data['data']);
plot_acf(data['data']);

PACF 和 ACF

同样,不能从这些图中推断出任何信息。您可以使用扩展的 Dickey-Fuller 测试进一步测试平稳性:

ad_fuller_result = adfuller(data['data'])
print(f'ADF Statistic: {ad_fuller_result[0]}')
print(f'p-value: {ad_fuller_result[1]}')

ADF 测试结果

由于 p 值很大,我们不能拒绝零假设,必须假设时间序列是非平稳的。

现在,让我们取对数差,努力使它保持稳定:

data['data'] = np.log(data['data'])
data['data'] = data['data'].diff()
data = data.drop(data.index[0])

绘制新数据应给出:

plt.figure(figsize=[15, 7.5]); # Set dimensions for figure
plt.plot(data['data'])
plt.title("Log Difference of Quarterly EPS for Johnson & Johnson")
plt.show()

强生公司季度每股收益记录表

厉害!现在,我们仍然在上面的图中看到季节性。因为我们处理的是季度数据,所以我们的周期是 4。因此,我们将在 4:

# Seasonal differencingdata['data'] = data['data'].diff(4)
data = data.drop([1, 2, 3, 4], axis=0).reset_index(drop=True)

绘制新数据:

plt.figure(figsize=[15, 7.5]); # Set dimensions for figure
plt.plot(data['data'])
plt.title("Log Difference of Quarterly EPS for Johnson & Johnson")
plt.show()

完美!请记住,虽然我们在 4 个月的时间内取了差值,但季节差值(D)的顺序是 1,因为我们只取了一次差值。

现在,让我们再次运行扩展的 Dickey-Fuller 测试,看看我们是否有一个平稳的时间序列:

ad_fuller_result = adfuller(data['data'])
print(f'ADF Statistic: {ad_fuller_result[0]}')
print(f'p-value: {ad_fuller_result[1]}')

事实上,p 值足够小,我们可以拒绝零假设,我们可以认为时间序列是平稳的。

看看 ACF 和 PACF:

plot_pacf(data['data']);
plot_acf(data['data']);

我们可以从 PACF 中看到,我们在滞后 1 处有一个显著的峰值,这表明 AR(1)过程。此外,我们在滞后 4 处有另一个峰值,表明 1 阶的季节性自回归过程(P = 1)。

查看 ACF 图,我们仅在滞后 1 处看到一个显著的峰值,表明存在非季节性 MA(1)过程。

尽管这些图可以让我们大致了解正在进行的过程,但最好测试多个场景,并选择产生最低 AIC 的模型。

因此,让我们编写一个函数来测试 SARIMA 模型的一系列参数,并输出一个性能最佳的模型位于顶部的表:

def optimize_SARIMA(parameters_list, d, D, s, exog):
    """
        Return dataframe with parameters, corresponding AIC and SSE

        parameters_list - list with (p, q, P, Q) tuples
        d - integration order
        D - seasonal integration order
        s - length of season
        exog - the exogenous variable
    """

    results = []

    for param in tqdm_notebook(parameters_list):
        try: 
            model = SARIMAX(exog, order=(param[0], d, param[1]), seasonal_order=(param[2], D, param[3], s)).fit(disp=-1)
        except:
            continue

        aic = model.aic
        results.append([param, aic])

    result_df = pd.DataFrame(results)
    result_df.columns = ['(p,q)x(P,Q)', 'AIC']
    #Sort in ascending order, lower AIC is better
    result_df = result_df.sort_values(by='AIC', ascending=True).reset_index(drop=True)

    return result_df

请注意,我们将只测试参数 P、P、q 和 q 的不同值。我们知道季节和非季节积分参数都应该是 1,季节长度是 4。

因此,我们生成所有可能的参数组合:

p = range(0, 4, 1)
d = 1
q = range(0, 4, 1)
P = range(0, 4, 1)
D = 1
Q = range(0, 4, 1)
s = 4parameters = product(p, q, P, Q)
parameters_list = list(parameters)
print(len(parameters_list))

你应该看到我们有 256 种不同的组合!现在,我们的函数将根据我们的数据拟合 256 种不同的 SARIMA 模型,以找到 AIC 最低的模型:

result_df = optimize_SARIMA(parameters_list, 1, 1, 4, data['data'])
result_df

结果表

从表中可以看出,最佳模型是:SARIMA(0,1,2)(0,1,2,4)。

我们现在可以拟合模型并输出其摘要:

best_model = SARIMAX(data['data'], order=(0, 1, 2), seasonal_order=(0, 1, 2, 4)).fit(dis=-1)
print(best_model.summary())

最佳模式总结

在这里,你可以看到表现最好的模型同时具有季节性和非季节性移动平均过程。

根据上面的总结,您可以找到系数的值及其 p 值。请注意,从 p 值来看,所有系数都是显著的。

现在,我们可以研究残差:

best_model.plot_diagnostics(figsize=(15,12));

模型诊断

从正常的 Q-Q 图,我们可以看到,我们几乎有一条直线,这表明没有系统偏离正常。此外,右下角的相关图表明残差中没有自相关,因此它们实际上是白噪声。

我们已经准备好绘制模型的预测图,并预测未来:

data['arima_model'] = best_model.fittedvalues
data['arima_model'][:4+1] = np.NaNforecast = best_model.predict(start=data.shape[0], end=data.shape[0] + 8)
forecast = data['arima_model'].append(forecast)plt.figure(figsize=(15, 7.5))
plt.plot(forecast, color='r', label='model')
plt.axvspan(data.index[-1], forecast.index[-1], alpha=0.5, color='lightgrey')
plt.plot(data['data'], label='actual')
plt.legend()plt.show()

模型预测

瞧啊。

结论

恭喜你!您现在了解了什么是季节性 ARIMA(或 SARIMA)模型,以及如何使用它进行建模和预测。

通过以下课程了解有关时间序列的更多信息:

干杯🍺

使用 SQL 进行时间序列预测——比您想象的要简单

原文:https://towardsdatascience.com/time-series-forecasting-with-sql-its-easier-than-you-think-1f5b362d0c81?source=collection_archive---------9-----------------------

是的,SQL 现在可以做到这一点。

时间序列预测是我通常用 Python 做的一项任务。你可能已经习惯了其他语言,比如 R 或者 Julia ,但是我敢打赌你从来没有想到过这种类型的任务。如果是这样的话——继续读下去——你会惊讶地发现只用 SQL 就能完成这么多事情。

晨酿Unsplash 上拍摄的照片

我以前写过关于使用 SQL 执行分类任务的文章,所以如果你对此感兴趣的话,一定要看看:

[## 使用 SQL 进行机器学习——比你想象的要简单

当 Python 不是一个选项时该做什么。包括代码。

towardsdatascience.com](/machine-learning-with-sql-its-easier-than-you-think-c6aae9064d5a)

时间序列不同于一般的机器学习任务。你不可能训练一次模型,在生产中用几个月。时间序列模型必须使用完整的历史数据进行训练,并且新的数据点可能每小时、每天、每周或每月都会出现—因项目而异。

这就是为什么在硬件资源有限的情况下,在数据库中进行训练是有益的。 Python 几乎总是会比数据库消耗更多的资源。

我们将再次使用甲骨文云。这是免费的,所以请注册并创建一个 OLTP 数据库实例(版本 19c,有 0.2TB 的存储)。完成后,下载云钱包并通过SQL Developer——或任何其他工具建立连接。

这将花费你至少 10 分钟,但这是一件相当简单的事情,所以我不会在这上面浪费时间。

厉害!让我们继续数据加载。

数据加载

在进行任何类型的预测之前,我们需要一些数据。任何时间序列教程的事实上的标准数据集是航空乘客数据集。下载它,并在安全的地方保存一分钟。

我们需要创建一个保存数据集的表,接下来我们就这么做。下面是 SQL 语句:

CREATE TABLE airline_passengers(
    air_period DATE,
    air_passengers INTEGER
);

我们现在可以通过导入数据功能加载数据集:

当弹出一个模态窗口时,只需提供下载的 CSV 文件的路径,然后点击几次 Next 。使用您的最佳判断选择列,并选择日期格式为YYYY-MM

完成后,我们的数据集就可以使用了:

厉害!我们现在可以继续进行模型训练和预测。

模特培训

我们的数据集有 144 行。我们不会对其整体进行模型训练。我们将保留最后 12 行用于评估。

从训练开始,我们需要创建一个指向训练数据的VIEW。方法如下:

CREATE OR REPLACE VIEW src_passengers AS
    SELECT * FROM airline_passengers 
    WHERE air_period < TO_DATE('1960-01-01', 'YYYY-MM-DD');

src_passengers视图现在保存了前 132 行——这正是我们想要的。

接下来,我们将声明一个处理模型训练的简短的PL/SQL片段:

DECLARE
    v_setlst DBMS_DATA_MINING.SETTING_LIST;
BEGIN
    v_setlst(DBMS_DATA_MINING.ALGO_NAME) := DBMS_DATA_MINING.ALGO_EXPONENTIAL_SMOOTHING;
    v_setlst(DBMS_DATA_MINING.EXSM_INTERVAL) := DBMS_DATA_MINING.EXSM_INTERVAL_MONTH;
    v_setlst(DBMS_DATA_MINING.EXSM_PREDICTION_STEP) := '12';
    v_setlst(DBMS_DATA_MINING.EXSM_MODEL) := DBMS_DATA_MINING.EXSM_HW;
    v_setlst(DBMS_DATA_MINING.EXSM_SEASONALITY) := '12';

    DBMS_DATA_MINING.CREATE_MODEL2(
        model_name => 'AIRLINE_PSG_FORECAST',
        mining_function => 'TIME_SERIES',
        data_query => 'SELECT * FROM src_passengers',
        set_list => v_setlst,
        case_id_column_name => 'air_period',
        target_column_name => 'air_passengers'
    );
END;
/

让我们把这个片段分解一下,让它更容易理解:

  • DBMS_DATA_MINING.ALGO_NAME -时间序列预测算法类型,指数平滑是目前唯一可用的算法
  • DBMS_DATA_MINING.EXSM_INTERVAL -表示数据集的间隔。我们的数据按月间隔存储,因此有了EXSM_INTERVAL_MONTH
  • DBMS_DATA_MINING.PREDICTION_STEP -做出多少预测。12(一年)不错
  • DBMS_DATA_MINING.EXSM_MODEL -本质上是指数平滑模型的超参数组合。我选择使用三重指数平滑法或霍尔特-温特斯法。这里是可用算法的完整列表。
  • DBMS_DATA_MINING.EXSM_SEASONALITY -表示一个季节持续多长时间

声明之后,我们可以在DBMS_DATA_MINING.CREATE_MODEL2过程的帮助下创建一个时间序列模型(顺便说一下,这是一个很好的命名约定)。以下是解释:

  • model_name -任意,随心所欲命名型号
  • mining_function -设置为TIME_SERIES,原因很清楚
  • data_query -模型如何获得训练数据
  • set_list -之前声明的设置列表,告诉 Oracle 如何实际训练模型
  • case_id_column_name -包含日期值的列的名称
  • target_column_name -包含数值的列的名称(我们试图预测的内容)

就是这样!如果你能理解这一点,你就知道如何用 SQL 训练时间序列模型。

您现在可以运行PL/SQL代码片段了。需要几秒钟才能完成。完成后,您可以继续下一部分。

模型评估

让我们看看我们的模型表现有多好。为此,我准备了以下声明:

SELECT
    a.case_id AS time_period,
    b.air_passengers AS actual,
    ROUND(a.prediction, 2) AS predicted,
    ROUND((b.air_passengers - a.prediction), 2) AS difference,
    ROUND((ABS(b.air_passengers - a.prediction) / b.air_passengers) * 100, 2) AS pct_error
FROM 
    dm$p0airline_psg_forecast a, 
    airline_passengers b
WHERE 
    a.case_id = b.air_period
AND a.case_id >= TO_DATE('1960-01-01', 'YYYY-MM-DD');

它将实际数据与 Holt-Winters 算法所做的预测进行比较,并比较绝对误差和百分比误差。以下是上述 SQL 语句的输出:

厉害!就我们投入的工作而言,我们的模型并没有那么糟糕。让我们在下一部分总结一下。

在你走之前

这工作量很大——不要争论了。尽管如此,我们仍有改进的方法。一个想法立即浮现在脑海中——创建一个将返回最佳算法的函数。

您可以将所有可能的算法存储在一个数组中,然后在遍历数组的同时训练一个模型,跟踪每个模型的性能。但这是另一个话题了。

感谢阅读。

加入我的私人邮件列表,获取更多有用的见解。

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

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

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

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

原载于 2020 年 9 月 22 日 https://betterdatascience.com

Python 代码中基于统计模型的时间序列预测

原文:https://towardsdatascience.com/time-series-forecasting-with-statistical-models-in-python-code-da457a46d68a?source=collection_archive---------9-----------------------

在我之前的文章中,我展示了使用脸书先知 Python API(可用的统计模型之一)预测数字广告支出是多么容易。在第二部分中,我们将更多地讨论如何应用统计方法进行时间序列分析。

问题:根据 2 年多的历史每日广告支出,预测未来 2 个月的数字广告支出。

下面快速浏览一下数据文件(从 2017 年 1 月 1 日到 2019 年 9 月 23 日的每日广告支出)

创建培训和测试数据集:

目录

  1. 介绍
  • 时间序列分析
  • 什么是流行的统计模型
  • 单变量统计时间序列建模的关键要素

2.ARIMA

  • ACF 和 PACF 图
  • 萨里玛
  • 案例研究:用 SARIMA 预测广告支出

3.美国教育考试服务中心

  • 美国教育考试服务中心
  • 霍尔特-温特季节方法
  • 案例研究:用霍尔特-温特季节平滑法预测广告支出

4.对比模型

5.结案摘要

1.1 时间序列分析

细节在我之前的帖子中解释过,这里

1.2 我们可以使用什么时间序列统计模型?

a.单变量统计时间序列建模(例如,平均和平滑模型、有/无季节项的 ARIMA 模型)

b.多变量统计时间序列建模(如外部回归变量、风险值)

c.附加或组件模型(如第一部分中涉及的脸书预言家)

d.结构时序建模(例如,贝叶斯结构时序建模、分层时序建模)。

在本文中,我将重点解释萨里玛和霍尔特-温特斯。

1.3 关键组件

我们需要我们的数据平稳性,这意味着(1)常数均值(2)常数方差(3)自协方差不依赖于时间,如果我们想使用时间序列数据的统计建模。

那如果我的数据不符合这个统计假设呢?换句话说,非平稳数据是什么样的?

非平稳数据背后的两个共同特征是:( 1)趋势~均值不随时间变化;( 2)季节性~方差不随时间变化;( 3)自协方差依赖于时间。

去趋势化和消除季节性的方法有哪些?

  • 转换(例如,日志、sqrt 等)
  • 平滑(例如,滚动平均等)
  • 差异
  • 分解
  • 多项式拟合(例如,拟合回归模型)

2.1 ARIMA 模型中的关键术语

格式:ARIMA(p,d,q) — (1) p: AR 项(2) d: (3) q: MA 项

图片来自https://www.slideshare.net/21_venkat?

  • AR(自回归)项将序列中的下一步描述为前一时间步观察值的线性函数。
  • I(积分)项,序列的差分预处理步骤,使序列稳定。
  • MA(移动平均)项将序列中的下一步描述为前一时间步平均过程的残差的线性函数。

模型的符号包括将 AR (p)、I (d)和 MA (q)模型的阶指定为 ARIMA 函数的参数,例如 ARIMA(p,d,q)。ARIMA 模型也可以用来开发 AR、MA 和 ARMA 模型。

那我们怎么确定 p,d,q 呢?

2.2 ACF 和 PACF 图

ACF(自相关函数)描述了时间序列与其自身滞后版本之间的相关性(例如,Y(t)与 Y(t-1)的相关性)

PACF(部分自相关函数)提供了由每个连续滞后项解释的附加相关性。

  1. 用 PACF 图确定 p
  2. 使用 ACF 图确定 q

[## 识别 ARIMA 模型中 AR 和 MA 项的顺序

非季节性 ARIMA 模型说明(pdf 文件)季节性和非季节性 ARIMA 模型幻灯片(pdf 文件)介绍…

people.duke.edu](https://people.duke.edu/~rnau/411arim3.htm)

2.3 萨里玛

SARIMA(季节性自回归综合移动平均)在季节性水平上结合了 ARIMA 模型。

格式:SARIMA(p,D,q) (P,D,Q)s 其中 s 代表季节周期。

2.3 案例研究:用 SARIMA 预测广告支出

我创建了 test _ stationarity 来检查平稳性。

该函数绘制了滚动平均值和标准差,并通过进行增强迪基-富勒测试输出 p 值。

检查原始数据:test _ stationary(df1[' Spend ']。dropna())

与临界值相比,时间序列是非平稳的。

让我们做一个对数转换:df1[' log _ Spend ']= NP . log(df1[' Spend '])

test _ stationary(df1[' log _ Spend ']。diff(1)。dropna())

太好了。利用对数变换,时间序列在 5%的阈值处是平稳的。

让我们尝试第一个差异:test _ stationary(df1[' Spend ']。diff(1)。dropna())

令人印象深刻。结果是事件更好:时间序列在 1%的阈值处是稳定的,具有一阶差分。

建立 SARIMA 模型,预测 2019 年 7 月 23 日至 2019 年 9 月 23 日两个月的广告支出

现在,让我们通过从sk learn . metrics import mean _ squared _ error,mean_absolute_error 计算 mse 和 mae 来检查该模型的性能

让我们想象一下预测:

SARIMA 模型能够捕捉趋势和每周季节性,但在 MAE 为 5813 的波峰和波谷上有点偏离。

3.指数平滑(ETS)

因为时间序列数据在一段时间内自然是随机的,我们通常希望平滑数据,为此我们将使用 ETS,使用指数方法为过去的观察值分配较少的权重。在 wiki 上有一个像样的解释。

类似地,我们也希望通过应用 ETS 将时间序列分解成趋势(T)、季节(S)和不规则或误差(E)分量。

三种常见的 ETS 类型:

  • 线性:双指数平滑:
  • 加法:三重指数平滑
  • 乘法:也称三重指数平滑

来自:https://www . stat . Berkeley . edu/~ arturof/Teaching/stat 248/lab 10 _ part 1 . html

3.2 霍尔特-温特斯季节性方法

热冬季节法是三重指数平滑法的一种。它有三个关键部分:(1)一个水平(2)一个趋势(3)季节成分霍尔特-温特斯加法和霍尔特-温特斯乘法。

3.3 案例研究:用霍尔特-温特季节平滑法预测广告支出

建立热冬附加模型,预测 2019 年 7 月 23 日至 2019 年 9 月 23 日两个月的广告支出

通过从 sklearn.metrics 导入 mean_squared_error,mean_absolute_error 计算 mse 和 mae

H-W 模型能够捕捉趋势和每周季节性,但在 MAE 为 6055 的波峰和波谷上有点偏离。

4.比较这两个模型

让我们在同一个图中可视化两个模型的预测。

从图中,我们可以看出 SARIMA 模型比 Holt_Winter 模型表现稍好,MSE 和 MAE 都较低。尽管这两个模型都不能完美地捕捉到波峰和波谷,但在这种情况下,它们仍然对业务有用。根据数据,平均每月广告支出为 200 万美元以上。然而,基于这两种模型的平均寿命约为 6000。换句话说,对于一个平均每月广告支出为 200 万美元的企业来说,两个月的广告支出预测将下降约 6000 美元。这是一个相当不错的预测!

5.结案摘要

在本文中,单变量预测方法在广告支出数据上表现良好。但是用这些方法组合/合并新的信号,例如事件、天气,并不容易。这些统计方法对缺失数据也非常敏感,通常不能很好地预测长期数据。

在下一篇文章中,我将展示如何使用深度学习来预测同一数据集上的时间序列!

有用的参考资料:

[## 实验 10,第 1 部分-指数平滑

首先,我们区分方法和模型。预测方法是一种算法,它提供一个点…

www.stat.berkeley.edu](https://www.stat.berkeley.edu/~arturof/Teaching/STAT248/lab10_part1.html) [## 指数平滑法

指数平滑是一种使用指数窗口平滑时间序列数据的经验法则…

en.wikipedia.org](https://en.wikipedia.org/wiki/Exponential_smoothing) [## ARIMA 模型介绍

非季节性 ARIMA 模型说明(pdf 文件)季节性和非季节性 ARIMA 模型幻灯片(pdf 文件)介绍…

people.duke.edu](https://people.duke.edu/~rnau/411arim.htm)

时间序列土地覆盖挑战:深度学习视角

原文:https://towardsdatascience.com/time-series-land-cover-challenge-a-deep-learning-perspective-6a953368a2bd?source=collection_archive---------15-----------------------

针对 TiSeLaC 挑战的不同 DL 架构快速回顾

蒙彼利埃大学在 2017 年提出的 TiSeLaC 挑战[1】(TiSeLaC 针对时间序列土地覆盖)在于预测卫星图像时间序列中的土地覆盖类像素。

照片由 Kelly LacyPexels

目录

  1. 什么是时间序列卫星图像
  2. TiSeLaC 数据集呢?
  3. TiSeLaC 分类任务
  4. 结论

1.什么是时间序列卫星图像?

时间序列卫星图像是对卫星图像时间维度的补充。换句话说,它是一系列定期拍摄的卫星图片,以便不仅使用图片中嵌入的空间信息,而且使用时间维度来进行预测,无论这些预测是分类、检测还是分割。

X. Yang 和 C. P. Lo 2在 2002 年对卫星图像时间序列进行了历史上最引人注目的使用,他们揭示并量化了在亚特兰大加速城市发展的背景下森林的损失和城市扩张。

2.TiSeLaC 数据集呢?

这些卫星图片是 2014 年以 30 米分辨率拍摄的 23 张 2866 * 2633 像素的留尼汪岛图片。这些像素中的每一个都由 10 个特征组成:7 个表面反射率,代表每个独立多光谱带(OLI)的测量值:超蓝、蓝、绿、红、NIR、SWIR1 和 SWIR2。我们还发现了 3 个互补的辐射指数,分别是归一化差异植被指数归一化差异水指数以及最后的亮度指数

带有 10 维细节数据的图形像素(来源: 托马斯·迪·马蒂诺 )

有这么多波段,我们只能想象波段之间的潜在相关性。我们现在将深入探索性数据分析。

2.1 探索性数据分析

这里要注意的第一件重要的事情是,在每幅图像包含的 2866*2633 个像素中,只有 81714 个像素被保留在训练集中,测试集中有 17973 个像素。这意味着我们不处理整个图像,因为只有像素的子集被处理和分析。

以下动画显示了每个像素的蓝色、绿色和红色分量随时间的变化:

使用 RGB 波段的卫星数据的 23 天 gif 动画(来源: 托马斯·迪·马蒂诺 )

此外,为了对每个类栅格有一个总体了解,我通过计算 23 天中每一天的 10 个波段各自的平均值和标准差,为每个类创建了一个图。

“每一类”的时间序列意味着(来源: 托马斯·迪·马蒂诺 )

正如我们在那里看到的,一些不同的类别看到它们的特征随着时间的推移被高度扰乱(例如类别或岩石和裸露土壤是最明显的)。相反,森林类和农作物类的结果相当稳定。

每个类别的特征变化中的这种明显多样性是一个“好迹象”,对于自动分类器来说,能够将它们彼此区分开应该不会太难。然而,这些结果充其量是一般化的,可能会产生误导,它们只是提供了关于数据多样性的见解,但并不能证明分类任务(或至少是高度精确的分类)会很容易。

我们现在将探索类的分布。TiSeLaC 组织者对像素进行的二次采样的第一个目的是平衡等级分布。然后,我们希望看到一个稍微平衡的数据集:

训练集的类的柱状图(来源: 托马斯·迪·马蒂诺 )

我们看到,数据集实际上是倾斜的,因为“其他作物”类的训练样本少于 2000 个,而城市地区、森林和稀疏植被都是向上采样的。

对于测试集,我们有:

训练集的类的条形图(来源: 托马斯·迪·马蒂诺 )

我们在这里有一个有点类似的图,每个类都比训练集中的少 4 到 6 倍,除了“其他作物”在测试集中更少。

2.2 分类问题的初步提示

由于这个数据集是由二次抽样数据组成的,在某种程度上,只有一些像素被保留,我们不能像图像处理一样处理这个问题,因为我们只能访问图像的一部分。

然而,我们可以从信号处理的角度来看问题,更具体地说,可以从时间序列分类的角度来看问题,由于像素坐标数据,时间序列分类具有关于所述时间序列在空间中的定位的额外信息。

3.TiSeLaC 分类任务

一旦我们采取了时间序列分类的方向,我们就可以比较最近流行的针对时间序列文学的深度学习的不同模型。

3.1 多重单峰网络:多通道深度卷积神经网络

最受欢迎的模型之一是在[3]中开发和研究的多通道深度卷积神经网络(即 MCDCNN)。这种架构希望通过在输入的每个维度上独立(即并行)应用卷积来利用多模态时间序列数据的不同特征之间的假定独立性。

我自己用 Python 和 Keras 实现了一个。

首先,我描述了 10 个通道各自的架构:

然后我用一个连接层将它们混合成一个模型。

对于训练过程,我使用了一个 SGD ,其学习率为 0.01 ,一个衰减为 0.0005,一个批量为 64 个实例,以及 120 个时期

考虑到 TiSeLaC 组织者使用的 F1 评分标准,我得到了 0.867 的

然而,对这个数据集的评估是,我们正在处理多模态时间序列。

3.2 多模式网络:时代-CNN

事实上,人们可能会认为指数的值与反射率测量值相关。这一点在“岩石和裸土”类地块中尤为明显,在第 11 天左右,多条带中的峰值非常明显。

这个想法在[4]中被赵 B、陆 H、陈 S、刘 J 和吴 D 讨论过,他们引入了时间的概念。该模型在多个方面不同于 MCDCNN:

  • 它使用 sigmoid 输出层的 MSE 损失,而不是通常的分类交叉熵softmax 输出层
  • 它使用平均池代替通常的最大池;
  • 在最后一个卷积层之后不存在池层

我在 Keras 和 Python 中实现的 Time-CNN 如下:

这一次,我使用了 1e-3 的学习率,没有衰减的 Adam 优化器,128批量和 100 个时期的(使用提前停止,通常在 50 个时期左右停止训练过程)。****

通过这种技术,我取得了 0.878 的 F1 分数,这是正确的,但仍然不令人满意。

正如我们所看到的,两个模型在考虑如何完成这项任务时采取了完全不同的角度:一个模型假设时间序列是不相关的,而另一个模型认为 10 个时间序列是一个独特的实体。这就是我认为使用这两种想法并将它们合并到一个模型中会有所帮助的地方。

3.3 多模式和多单模式架构的组合

这个想法在[5]中被 TiSeLaC 竞赛的一组研究人员深入探讨,他们的解决方案获得了冠军。我的实现深受他们工作的启发,虽然我没有达到与他们相同的性能(原因是他们使用像素的预处理空间特征表示以及通常的时间序列,并使用不同初始化的多个模型的打包技术完成),但我仍然设法获得了令人满意的分数。

我的架构如下:

我提议的最终网络架构,由 3 种不同模型组合而成(来源: 托马斯·迪·马蒂诺 )

所提出的架构使用 3 种不同的模型,从左边的多变量模型、中间的 10 个单变量模型和右边的用于位置信息的聚集模型开始。

第一个模型是单变量模型,仅包含 3 个卷积层,中间没有池层。

第二个模型使用 10 个单变量模型,具有不同的连接级别,以处理在网络的不同级别设计的功能,有点类似于 UNet 或 ResNet 会做的事情。

然后,第三个模型仅通过预处理和缩放的像素坐标到达最终的完全连接的层。

然后,将这些特征提取模型输出中的每一个连接起来,用通常的全连接层进行分类:

有了这个架构,我获得了 0.930 的 F1 分数,0.001学习率,256** 的批量, 50 个历元和一个默认参数为Adam 优化器。**

TiSeLaC 排行榜(来源: TiSeLaC 网站 )

有了这个分数,我的解决方案将位于 GIT 团队之上。然而,它仍然需要通过在高性能计算机上运行可能的 GridSearch 算法以及为像素位置找到一个好的预处理思想来彻底调整超参数,而不是简单的缩放过程。

4.结论

通过这个项目,我们看到了如今的 DL 架构在对时间序列数据进行分类时是多么有效,以及如何将单峰和多峰分析结合起来以获得更好的性能。

作为一个更普遍的结论,我们已经看到深度学习在处理序列方面有多好。

最后一点,我想感谢 TiSeLaC 竞赛的组织者公开了这个数据集。通过这种方式,我已经能够处理它,并了解更多关于构建不需要数百万个参数的高效模型的信息。

整个代码和执行程序都保存在我的个人 GitHub 上的一个 Jupyter 笔记本里,在 这个链接 。去看看!

文献学

[1] R. Gaetano,D. Ienco。 TiSeLaC:时间序列土地覆盖分类挑战数据集。法国蒙彼利埃的 UMR·泰蒂斯。2017

2 X .杨,C. P. Lo。使用时间序列的卫星图像检测佐治亚州亚特兰大大都市地区的土地利用和土地覆盖变化。国际遥感杂志。第 1775-1798 页。2002.

[3]郑,刘,陈,葛,赵。利用多通道深度卷积神经网络进行多元时间序列分类。计算机科学前沿。2014.

[4]赵 B,陆 H,陈 S,刘 J,吴 D. 卷积神经网络用于时间序列分类。系统工程与电子学杂志。第 162-169 页。2017 年 2 月。

[5]迪毛罗、韦尔加里、巴西尔、文托拉、埃斯波里图。用于卫星图像时序分类的深度时空表示的端到端学习。2017。

大气 CO2 浓度(ppm)的时间序列建模,1958–2019

原文:https://towardsdatascience.com/time-series-modeling-for-atmospheric-co2-concentration-ppm-1958-2019-8425fadcb927?source=collection_archive---------14-----------------------

R +中季节性 ARIMA 建模的分步方法(源代码)

在本帖中,我将介绍历史二氧化碳浓度(1958 年至 2019 年)的时间序列建模。季节性 ARIMA 建模将用于建立模型。Rmarkdown 格式的源代码可以在作者的 GitHub 链接这里找到。知道人们常说二氧化碳浓度应该在本世纪下半叶开始之前达到 460 ppm 以下,具体来说,这篇文章试图回答这个问题:

  • 如果二氧化碳浓度的当前趋势继续下去(一切照旧),那么在本世纪下半叶达到 460 ppm 的可能性有多大?

好,我们开始吧!

初始化

首先要做的是导入这个分析中需要的包(如果您还没有安装它们,请预先在 R 中安装这些包):

library(tidyverse)
library(forecast)
library(lubridate)
library(car)
library(scales)
library(patchwork)
library(kableExtra)

数据导入:

本分析将使用在夏威夷莫纳罗亚天文台测量的“1960/3–2019/12”期间的月 CO2 浓度(ppm)数据。此数据的链接可从以下网址获得:

https://www.esrl.noaa.gov/gmd/ccgg/trends/data.html

现在,要读取 R 中的数据,必须考虑几点:

  • 数据有注释,这不是我们分析的兴趣。因此,我们用*comment.char = '#' *,
  • 数据有 7 列,但其中一些列(如年和月标签)尚未写入数据,因此在导入时,我们分配以下列名(年、月、时间、Co2_con、插值、趋势、天)。
  • 使用空格分隔列,因此 sep =“”将被添加到代码中。
  • 因为我们包含了列名,所以可以包含 header = F。
data <- read.delim('ftp://aftp.cmdl.noaa.gov/products/trends/co2/co2_mm_mlo.txt', comment.char = '#', header = F, sep = '', col.names = c('Year','Month','Time','Co2_Concentration','Interpolated','Trend','Days'))

使数据整洁:

查看任何 NA 值:

which(is.na(data))## integer(0)

好,我们有完整的测量数据!但是,在读取数据时我们看到一些-99.99 的值!—注意,如注释中所述,这些值是在测量不可用时的值,因此对于这些点(741 次测量中的 7 次),我们使用插值列:

data_cc <- data %>% 
    mutate(
        Co2_Con = case_when(
            Co2_Concentration == -99.99 ~ Interpolated,
            TRUE ~ Co2_Concentration
        )
    )

让我们看看列类型:

sapply(data_cc, class)##              Year             Month              Time Co2_Concentration 
##         "integer"         "integer"         "numeric"         "numeric" 
##      Interpolated             Trend              Days           Co2_Con 
##         "numeric"         "numeric"         "integer"         "numeric"

我们可以看到列类型采用了适当的格式,但是我们可以添加名为 Date 的新列,它以标准的时间序列格式给出测量日期。

数据转换

这里 Lubridate 包提供了一个简单的方法来转换我们的列到日期:

data_cc$Date <- ymd(paste0(data$Year, " ", data$Month, " ", "15"))

此外,我们可以在我们想要做的分析中看到,我们不需要所有的列,因此我们可以选择我们分析中需要的列:

data_cc_sel <- data_cc %>% 
    select(Year, Month, Date, Co2_Con )

此外,我们需要有一部分数据,以测试我们基于训练数据开发的模型-因此,在这里,我们认为 2017 年、 2018 年2019 年的数据是测试数据,其余的是训练数据。

data_cc_sel_test <- data_cc_sel %>% 
    filter(Year > 2016)
data_cc_sel_train <- data_cc_sel %>% 
    filter(Year <= 2016)

数据可视化

现在,让我们先把数据可视化,

ggplot(data_cc_sel,aes(Date, Co2_Con)) +
    geom_line(color='blue') +
    xlab("Year, Month") +
    scale_x_date(date_labels = "%Y-%m", date_breaks = "5 year") +
    theme(axis.text.x = element_text(face = "bold", color = "#993333", 
                           size = 12, angle = 45, hjust = 1)) +
    ylab("CO2 Concentration (ppm)") +
    #scale_x_continuous(breaks = trans_breaks(identity, identity, n = 10))
    scale_y_continuous() +
    theme(axis.text.y = element_text(face = "bold", color = "#993333", 
                           size = 10, hjust = 1),axis.title.y = element_text(size = 10))

现在,有时使用“拼凑”包将所有总数据集、训练和测试一个接一个地绘制出来也很好:

p1 <- ggplot(data_cc_sel,aes(Date, Co2_Con)) +
    geom_line(color='blue') +
    xlab("Year, Month") +
    scale_x_date(date_labels = "%Y-%m", date_breaks = "5 year") +
    theme(axis.text.x = element_text(face = "bold", color = "#993333", 
                           size = 12, angle = 45, hjust = 1)) +
    ylab("CO2 Concentration (ppm)") +
    #scale_x_continuous(breaks = trans_breaks(identity, identity, n = 10))
    scale_y_continuous() +
    theme(axis.text.y = element_text(face = "bold", color = "#993333", 
                           size = 10, hjust = 1),axis.title.y = element_text(size = 8)) p2 <- ggplot(data_cc_sel_train,aes(Date, Co2_Con)) +
    geom_line(color='blue') +
    xlab("Year, Month") +
    scale_x_date(date_labels = "%Y-%m", date_breaks = "5 year") +
    theme(axis.text.x = element_text(face = "bold", color = "#993333", 
                           size = 12, angle = 45, hjust = 1)) +
    ylab("CO2 Concentration (ppm)") +
    #scale_x_continuous(breaks = trans_breaks(identity, identity, n = 10))
    scale_y_continuous() +
    theme(axis.text.y = element_text(face = "bold", color = "#993333", 
                           size = 10, hjust = 1), axis.title.y = element_text(size = 8)) p3 <- ggplot(data_cc_sel_test,aes(Date, Co2_Con)) +
    geom_line(color='blue') +
    xlab("Year, Month") +
    scale_x_date(date_labels = "%Y-%m", date_breaks = "1 year") +
    theme(axis.text.x = element_text(face = "bold", color = "#993333", 
                           size = 12, angle = 45, hjust = 1)) +
    ylab("CO2 Concentration (ppm)") +
    #scale_x_continuous(breaks = trans_breaks(identity, identity, n = 10))
    scale_y_continuous() +
    theme(axis.text.y = element_text(face = "bold", color = "#993333", 
                           size = 10, hjust = 1), axis.title.y = element_text(size = 8)) (p2 | p3 ) /
      p1

建模:

在时间序列分析中,关于趋势,我们需要知道的前三件事是:

  • 数据是静态的吗?
  • 回答:不是,我们在图中看到了清晰的趋势,因此 CO2 浓度的特性取决于时间(例如,数据的平均值取决于时间,是非平稳的)。
  • 数据有季节性吗?
  • 回答:是的,我们在数据中肯定能看到季节性。现在,知道了数据的非平稳性和季节性,它建议使用季节性差异来建模数据。要回答,
  • 自相关函数和偏相关是怎样的?

这是来自预测包的 ACF 和 PACF 的图:

Co2_train <- ts(data_cc_sel_train$Co2_Con, start = c(1958,3), frequency = 12)
Co2_train %>% ggtsdisplay()

很明显,数据显示需要差分(因为 ACF 不会下降到零),现在我们对进行普通差分,滞后时间为 12:

Co2_train %>% diff(lag=12) %>% diff() %>% ggtsdisplay()

现在,情况有所好转,我们基本上消除了这种趋势。我们以 ARIMA(p,D,q)(P,D,Q)[12]中的 d=D = 1 开始模型(原因是我们在上面的图中区分了季节性和非季节性部分。)

现在,我们必须有一些 P,Q,P,Q 的起始参数。所以,让我们看看上面的 ACF 和 PACF:

  • 在季节性滞后中,ACF 中有一个显著的尖峰,表明可能存在 MA(1)项。所以,起点是 Q = 1
  • 在非季节性差异数据的图中,ACF 图有三个尖峰,这可能暗示季节性 MA(3)项,q=3。

因此,我们开始使用 ARIMA(0,1,3)(3,1,1)[12]并在 AR 和 MA 项中进行变化。这里,在保持阶常数(D,D)的同时,我们使用 AICs 值来判断模型的质量。(尽量减少 AIC)

aicsvalue <- function(p,q,P,Q) {
  fit <- Arima(Co2_train, order=c(p,1,q),seasonal=list(order=c(P,1,Q),period=12),
                  lambda = "auto"
              )
  return(fit$aicc)
}model_eva <- data.frame(Model_name=c("ARIMA(0,1,3)(3,1,1)[12]","ARIMA(0,1,1)(3,1,1)[12]","ARIMA(1,1,0)(1,1,0)[12]",
                                     "ARIMA(1,1,2)(1,1,0)[12]","ARIMA(1,1,3)(0,1,1)[12]","ARIMA(1,1,1)(1,1,0)[12]",
                                     "ARIMA(1,1,1)(1,1,0)[12]","ARIMA(1,1,0)(1,1,1)[12]","ARIMA(1,1,1)(0,1,1)[12]" ), AICc=c(aicsvalue(0,3,3,1),aicsvalue(0,1,3,1),aicsvalue(1,0,1,0),                                                            aicsvalue(1,2,1,0),aicsvalue(1,3,0,1),aicsvalue(1,1,1,0),                                                           aicsvalue(1,1,1,0),aicsvalue(1,0,1,1), aicsvalue(1,1,0,1)))

基于以上分析,将选择ARIMA(1,1,1)(0,1,1)[12],但是我们需要检查残差以避免任何过拟合和欠拟合,以查看 Ljung-Box 测试残差是否类似白噪声。

(fit_minaicc <- Arima(Co2_train, order=c(1,1,1),seasonal=list(order=c(0,1,1),period=12),
                  lambda = "auto"
              ))
checkresiduals(fit_minaicc, lag=36)
fit_minaicc$aicc

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,1)(1,1,1)[12] with drift
## Q* = 32.406, df = 30, p-value = 0.3489
## 
## Model df: 6\.   Total lags used: 36

现在,我们可以看到残差非常类似于白噪声,p 值也很高,模型通过了 Ljong-Box 测试。(然而,必须提到的是,一些 ACF 刚刚达到蓝线的边界,然而,我不认为它会对预测产生实质性影响——有时很难让模型通过所有测试。)

然而,这并不是模型选择的终点。这里比较一下模型在测试数据上的表现。我们寻求最小化 RMSE 的模型。

Co2_test <- ts(data_cc_sel_test$Co2_Con, start = c(2017,1), frequency = 12)
mm <- accuracy(forecast(fit_minaicc,h=35)$mean, Co2_test )

本节比较了上一节中提供的 9 种车型的 RMSE 值。

rmse_eva <- function(p,d,q,P,D,Q) {
  fit <- Arima(Co2_train, order=c(p,d,q),seasonal=list(order=c(P,D,Q),period=12),
                  lambda = "auto", include.drift = T
              )
  mm <- accuracy(forecast(fit,h=35)$mean, Co2_test)
  return(mm[2])}rmse_eva <- data.frame(Model_name=c(
"ARIMA(0,1,3)(3,1,1)[12]","ARIMA(0,1,1)(3,1,1)[12]","ARIMA(1,1,0)(1,1,0)[12]",
"ARIMA(1,1,2)(1,1,0)[12]","ARIMA(1,1,3)(0,1,1)[12]","ARIMA(1,1,1)(1,1,0)[12]",
"ARIMA(1,1,1)(1,1,0)[12]","ARIMA(1,1,0)(1,1,1)[12]","ARIMA(1,1,1)(0,1,1)[12]"
 ), RMSE=c(                        
rmse_eva(0,1,3,3,1,1),rmse_eva(0,1,1,3,1,1),rmse_eva(1,1,0,1,1,0),                                                  rmse_eva(1,1,2,1,1,0),rmse_eva(1,1,3,0,1,1),rmse_eva(1,1,1,1,1,0),                                                  rmse_eva(1,1,1,1,1,0),rmse_eva(1,1,0,1,1,1),rmse_eva(1,1,1,0,1,1)))

结果表明,模型 ARIMA(1,1,1)(0,1,1)[12]没有最小 RMSE 值,但它非常接近最小值,但它在 AICc 值中是最小的。最后,已知模型残差遵循白噪声,选择模型 ARIMA(1,1,1)(0,1,1)[12]来预测包装,因为它的参数较少且简单,同时保持最小的 AIC。(注意:如果标准被设置为 RMSE,这可能会导致我们的模型非常复杂,有许多参数)

Co2_train %>%
  Arima(order=c(1,1,1),seasonal=list(order=c(0,1,1),period=12),
                lambda = "auto"
              ) %>%
  forecast(h=400) %>%
  autoplot() +
    ylab("H02 sales (million scripts)") + xlab("Year") +
  autolayer(Co2_test)

让我们放大模型预测和测试数据,以直观地查看模型性能:

prediction <- forecast(fit_minaicc,h=35) 
data_cc_sel_test$prediction <- prediction$mean
data_test_pre_tidy <- gather(data_cc_sel_test, "type", "Co2", -Year,-Month,-Date)## Warning: attributes are not identical across measure variables;
## they will be droppedggplot(data_test_pre_tidy,aes(Date, Co2,color=type)) +
    geom_line() +
    xlab("Year, Month") +
    scale_x_date(date_labels = "%Y-%m", date_breaks = "1 year") +
    theme(axis.text.x = element_text(face = "bold", color = "#993333", 
                           size = 12, angle = 45, hjust = 1)) +
    ylab("CO2 Concentration (ppm)") +
    #scale_x_continuous(breaks = trans_breaks(identity, identity, n = 10))
    scale_y_continuous() +
    theme(axis.text.y = element_text(face = "bold", color = "#993333", 
                           size = 10, hjust = 1), axis.title.y = element_text(size = 8))

洞察力:

现在,给定开发的模型,我们想要回答的问题是:

给定开发的模型,2050 年达到 460 ppm 的几率有多大?要回答这个问题,我们首先需要建立 2050 年二氧化碳浓度的累积分布:

prediction1 <- forecast(fit_minaicc,h=396, level = c(80,90)) 
p10 <- prediction1$upper[396,2]
p50 <- prediction1$mean[396]
sd_calc <- (p10-p50)/1.28Co2_con_2050 <- rnorm(10^6,p50,sd_calc)
cdf_co2_con_2050 <- ecdf(Co2_con_2050)
cdf_co2_con_2050_data <- data.frame(Co2_con_2050)
ggplot(cdf_co2_con_2050_data, aes(Co2_con_2050)) + stat_ecdf(geom = "step", color='blue') +
  geom_vline(xintercept = 460, color='red') +
  geom_hline(yintercept = cdf_co2_con_2050(460), color='red') +
  theme(axis.text.x = element_text(face = "bold", color = "#993333", 
                           size = 12, angle = 0, hjust = 1)) +
  scale_x_continuous(breaks=c(400,425,450, 460,475,500,525, 550), limits = c(425,525)) +
  scale_y_continuous(breaks=c(seq(0,1,0.1)), limits = c(0,1)) +
  ylab('Cumulative Distribution') +
  xlab("Co2 Concentraion(ppm) at 2050")## Warning: Removed 238 rows containing non-finite values (stat_ecdf).

现在,有了累积分布,我们可以问这个问题:

  • 到 2050 年,二氧化碳浓度(ppm)保持在 460 以下的概率有多大?
cdf_co2_con_2050(460)
## [1] 0.089823

可以看到,答案是 9%左右。

使用 Scikit、Pandas 和 Numpy 进行时间序列建模

原文:https://towardsdatascience.com/time-series-modeling-using-scikit-pandas-and-numpy-682e3b8db8d1?source=collection_archive---------0-----------------------

直观地利用季节性来提高模型准确性

图片由作者

欢迎学习时间序列分析的第 2 部分!在本帖中,我们将通过建模时间序列数据来学习我们的方法。这是我上一篇关于时间序列数据的文章的延续。

在我们之前的博客文章中,我们讨论了什么是时间序列数据,如何格式化这样的数据以最大化其效用,以及如何处理缺失数据。我们还学习了如何按月、周、年等对时间序列数据进行重采样,并计算滚动平均值。我们深入研究了趋势、季节性、一阶差分和自相关等概念。如果你熟悉大部分的东西,你就可以开始了。如果你需要复习,你可以在谷歌上快速搜索这些话题,或者在这里阅读我之前的文章。

在我们开始之前说几句话:

毫无疑问,还有其他更好的用于时间序列预测的软件包,比如 ARIMA 的或者脸书的专有软件 Prophet 。然而,这篇文章的灵感来自一个朋友的带回家的作业,该作业要求她只能使用 Scikit、Numpy 和 Pandas(否则将面临立即取消资格!).

让我们深入我们的数据集

我们将使用公开的数据集开放电力系统数据。你可以在这里下载数据。它包含 2006-2017 年的电力消耗、风力发电和太阳能发电。

url='[https://raw.githubusercontent.com/jenfly/opsd/master/opsd_germany_daily.csv'](https://raw.githubusercontent.com/jenfly/opsd/master/opsd_germany_daily.csv')
data = pd.read_csv(url,sep=",")

Date列设置为索引后,我们的数据集看起来是这样的:

*# to explicitly convert the date column to type DATETIME*
data['Date'] = pd.to_datetime(data['Date'])
data = data.set_index('Date')

定义建模任务

预测的目标

我们的目标是从这个时间序列数据集中预测Consumption(理想情况下是未来未知的日期)。

训练和测试设备

我们将使用 10 年的数据进行培训,即 2006-2016 年,使用去年的数据进行测试,即 2017 年。

工作指标

为了评估我们的模型有多好,我们将使用 R-squared 和均方根误差(但将打印所有相关指标,以便您进行最终通话)。

助手功能

为了打印与回归任务相关的所有性能指标(比如 MAE 和 R-square),我们将定义regression_results函数。

import sklearn.metrics as metrics
def regression_results(y_true, y_pred): *# Regression metrics*
    explained_variance=metrics.explained_variance_score(y_true, y_pred)
    mean_absolute_error=metrics.mean_absolute_error(y_true, y_pred) 
    mse=metrics.mean_squared_error(y_true, y_pred) 
    mean_squared_log_error=metrics.mean_squared_log_error(y_true, y_pred)
    median_absolute_error=metrics.median_absolute_error(y_true, y_pred)
    r2=metrics.r2_score(y_true, y_pred) print('explained_variance: ', round(explained_variance,4))    
    print('mean_squared_log_error: ', round(mean_squared_log_error,4))
    print('r2: ', round(r2,4))
    print('MAE: ', round(mean_absolute_error,4))
    print('MSE: ', round(mse,4))
    print('RMSE: ', round(np.sqrt(mse),4))

特征工程

作为基线,我们选择了一个简单的模型,该模型基于以下因素预测今天的消费价值

  • 昨天的消费值和;
  • 昨天和前天的消费值之差。
*# creating new dataframe from consumption column*
data_consumption = data[['Consumption']]*# inserting new column with yesterday's consumption values*
data_consumption.loc[:,'Yesterday'] = 
data_consumption.loc[:,'Consumption'].shift()*# inserting another column with difference between yesterday and day before yesterday's consumption values.* data_consumption.loc[:,'Yesterday_Diff'] = data_consumption.loc[:,'Yesterday'].diff()*# dropping NAs*
data_consumption = data_consumption.dropna()

定义训练集和测试集

X_train = data_consumption[:'2016'].drop(['Consumption'], axis = 1)
y_train = data_consumption.loc[:'2016', 'Consumption']X_test = data_consumption['2017'].drop(['Consumption'], axis = 1)
y_test = data_consumption.loc['2017', 'Consumption']

时间序列数据的交叉验证

在数据科学面试中经常出现的一个问题是:你会对时间序列数据使用哪种交叉验证技术?

你可能会被有史以来最受欢迎的 K 倍交叉验证所吸引(相信我,直到最近——不要问最近!—我不知道除了 K-fold 之外还有 CV 技术。不幸的是,这不是正确的答案。原因是,它没有考虑到时间序列数据有一些自然的顺序,标准 k 倍交叉验证中的随机化没有保持这种顺序。

对时间序列数据进行交叉验证的一个更好的替代方法(比 K-fold CV)是正向链接策略。

在正向链接中,假设有 3 个折叠,训练集和验证集看起来像:

  • 折叠 1:培训[1],验证2
  • 折叠 2:培训[1 2],验证[3]
  • 折叠 3:培训[1 2 3],验证[4]

其中 1,2,3,4 代表年份。这样,连续的训练集是它们之前的训练集的超集。

幸运的是,sklearn 有一个使用TimeSeriesSplit实现这种列车测试分割的规定。

from sklearn.model_selection import TimeSeriesSplit

TimeSerieSplit函数将分割数作为输入。由于我们的培训数据有 11 个独特的年份(2006 -2016),我们将设置n_splits = 10。这样我们就有了整洁的训练和验证集:

  • 折叠 1:培训[2006],验证[2007]
  • 折叠 2:培训[2006 年 2007 年],验证[2008 年]
  • 折叠 3:培训[2006 年 2007 年 2008 年],验证[2009 年]
  • 折叠 4:培训[2006 年 2007 年 2008 年 2009 年],验证[2010 年]
  • 折叠 5:培训[2006 年 2007 年 2008 年 2009 年 2010 年],验证[2011 年]
  • 折叠 6:培训[2006 年 2007 年 2008 年 2009 年 2010 年 2011 年],验证[2012 年]
  • 折叠 7:培训[2006 年 2007 年 2008 年 2009 年 2010 年 2011 年 2012 年],验证[2013 年]
  • 折叠 8:培训[2006 年 2007 年 2008 年 2009 年 2010 年 2011 年 2012 年 2013 年],验证[2014 年]
  • 折叠 9:培训[2006 年 2007 年 2008 年 2009 年 2010 年 2011 年 2012 年 2013 年 2014 年],验证[2015 年]
  • 折叠 10:培训[2006 年 2007 年 2008 年 2009 年 2010 年 2011 年 2012 年 2013 年 2014 年 2015 年],验证[2016 年]

抽查算法

*# Spot Check Algorithms*models = []
models.append(('LR', LinearRegression()))
models.append(('NN', MLPRegressor(solver = 'lbfgs')))  #neural network
models.append(('KNN', KNeighborsRegressor())) 
models.append(('RF', RandomForestRegressor(n_estimators = 10))) # Ensemble method - collection of many decision trees
models.append(('SVR', SVR(gamma='auto'))) # kernel = linear*# Evaluate each model in turn*
results = []
names = []
for name, model in models:
    *# TimeSeries Cross validation*
 tscv = TimeSeriesSplit(n_splits=10)

 cv_results = cross_val_score(model, X_train, y_train, cv=tscv, scoring='r2')
 results.append(cv_results)
 names.append(name)
 print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))

*# Compare Algorithms*
plt.boxplot(results, labels=names)
plt.title('Algorithm Comparison')
plt.show()

KNN 和 RF 表现同样出色。但我个人更喜欢 RF,因为这种集合模型(将多个‘个体’(不同的)模型结合在一起,并提供卓越的预测能力。)几乎可以开箱即用,这也是它们非常受欢迎的原因之一。

网格搜索超参数

我在之前的文章中讨论了网格搜索超参数的必要性。

超参数的最佳组合使模型的性能最大化,而不会导致高方差问题(过度拟合)。

执行网格搜索的 Python 代码如下:

from sklearn.model_selection import GridSearchCVmodel = RandomForestRegressor()
param_search = { 
    'n_estimators': [20, 50, 100],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [i for i in range(5,15)]
}tscv = TimeSeriesSplit(n_splits=10)
gsearch = GridSearchCV(estimator=model, cv=tscv, param_grid=param_search, scoring = rmse_score)gsearch.fit(X_train, y_train)
best_score = gsearch.best_score_
best_model = gsearch.best_estimator_

如果你注意到上面的代码,我们已经通过设置scoring = rmse_score定义了一个自定义 计分器,而不是使用 sklearn 中定义的通用计分指标之一。我们将自定义计分器定义如下:

from sklearn.metrics import make_scorerdef rmse(actual, predict):predict = np.array(predict)
    actual = np.array(actual)distance = predict - actualsquare_distance = distance ** 2mean_square_distance = square_distance.mean()score = np.sqrt(mean_square_distance)return scorermse_score = make_scorer(rmse, greater_is_better = False)

根据测试数据检查最佳模型性能

y_true = y_test.values
y_pred = best_model.predict(X_test)regression_results(y_true, y_pred)

这对初学者来说并不坏。让我们看看是否可以进一步改进我们的模型。

特征工程回报

到目前为止,我们一直使用(t-1)th日的值来预测t日的值。现在,让我们也使用(t-2)天的值来预测消耗量:

*# creating copy of original dataframe*
data_consumption_2o = data_consumption.copy()*# inserting column with yesterday-1 values*
data_consumption_2o['Yesterday-1'] = data_consumption_2o['Yesterday'].shift()*# inserting column with difference in yesterday-1 and yesterday-2 values.*
data_consumption_2o['Yesterday-1_Diff'] = data_consumption_2o['Yesterday-1'].diff()*# dropping NAs*
data_consumption_2o = data_consumption_2o.dropna()

重置列车和测试装置

X_train_2o = data_consumption_2o[:'2016'].drop(['Consumption'], axis = 1)
y_train_2o = data_consumption_2o.loc[:'2016', 'Consumption']X_test = data_consumption_2o['2017'].drop(['Consumption'], axis = 1)
y_test = data_consumption_2o.loc['2017', 'Consumption']

检查使用“新”预测器的“最佳”随机森林是否表现更好

model = RandomForestRegressor()
param_search = { 
    'n_estimators': [20, 50, 100],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [i for i in range(5,15)]
}tscv = TimeSeriesSplit(n_splits=10)
gsearch = GridSearchCV(estimator=model, cv=tscv, param_grid=param_search, scoring = rmse_score)gsearch.fit(X_train_2o, y_train_2o)
best_score = gsearch.best_score_
best_model = gsearch.best_estimator_y_true = y_test.values
y_pred = best_model.predict(X_test)regression_results(y_true, y_pred)

好消息!!我们已经显著降低了 RMSE 和 MAE 值,而 R 平方值也上升了。

特征工程反击

让我们看看增加太阳能生产的价值是否在某种程度上有利于预测电力消耗。

data_consumption_2o_solar = data_consumption_2o.join(data[['Solar']])data_consumption_2o_solar = data_consumption_2o_solar.dropna()

重置训练/测试+网格搜索+检查性能

X_train_2o_solar = data_consumption_2o_solar[:'2016'].drop(['Consumption'], axis = 1)
y_train_2o_solar = data_consumption_2o_solar.loc[:'2016', 'Consumption']X_test = data_consumption_2o_solar['2017'].drop(['Consumption'], axis = 1)
y_test = data_consumption_2o_solar.loc['2017', 'Consumption']model = RandomForestRegressor()
param_search = { 
    'n_estimators': [20, 50, 100],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [i for i in range(5,15)]
}tscv = TimeSeriesSplit(n_splits=5)
gsearch = GridSearchCV(estimator=model, cv=tscv, param_grid=param_search, scoring = rmse_score)gsearch.fit(X_train_2o_solar, y_train_2o_solar)
best_score = gsearch.best_score_
best_model = gsearch.best_estimator_y_true = y_test.values
y_pred = best_model.predict(X_test)regression_results(y_true, y_pred)

瞧,现在模型的性能更好了。

可变重要性图

imp = best_model.feature_importances_
features = X_train_2o_solar.columns
indices = np.argsort(imp)plt.title('Feature Importances')
plt.barh(range(len(indices)), imp[indices], color='b', align='center')
plt.yticks(range(len(indices)), [features[i] for i in indices])
plt.xlabel('Relative Importance')
plt.show()

正如我们所见,太阳能发电量并不像其他基于时间的预测指标那样是一个强大的电力消耗预测指标。

特征工程的最后阶段

如果你阅读了我前一篇博文第一部分的叙述,你会记得我们的数据集有一些季节性因素,更准确地说是每周季节性。因此,将给定日期前一周的消费值作为模型的输入更有意义。这意味着,如果模型试图预测 1 月 8 日的消费值,它必须获得 1 月 1 日的消费信息。

data_consumption_2o_solar_weeklyShift = data_consumption_2o_solar.copy()data_consumption_2o_solar_weeklyShift['Last_Week'] = data_consumption_2o_solar['Consumption'].shift(7)data_consumption_2o_solar_weeklyShift = data_consumption_2o_solar_weeklyShift.dropna()

重置训练/测试+网格搜索+检查性能

X_train_2o_solar_weeklyShift = data_consumption_2o_solar_weeklyShift[:'2016'].drop(['Consumption'], axis = 1)
y_train_2o_solar_weeklyShift = data_consumption_2o_solar_weeklyShift.loc[:'2016', 'Consumption']X_test = data_consumption_2o_solar_weeklyShift['2017'].drop(['Consumption'], axis = 1)
y_test = data_consumption_2o_solar_weeklyShift.loc['2017', 'Consumption']model = RandomForestRegressor()
param_search = { 
    'n_estimators': [20, 50, 100],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [i for i in range(5,15)]
}tscv = TimeSeriesSplit(n_splits=10)
gsearch = GridSearchCV(estimator=model, cv=tscv, param_grid=param_search, scoring = rmse_score)gsearch.fit(X_train_2o_solar_weeklyShift, y_train_2o_solar_weeklyShift)
best_score = gsearch.best_score_
best_model = gsearch.best_estimator_y_true = y_test.values
y_pred = best_model.predict(X_test)regression_results(y_true, y_pred)

我们又做了一次..误差进一步减小,r 平方增加。我们可以继续添加更多相关的功能,但我想你现在已经明白了!

特征重要性图

正如我们正确假设的那样,第(t-7)天的价值比第(t-1)天的价值具有更强的预测力。

结论

在本文中,我们学习了如何对时间序列数据建模,对时间序列数据进行交叉验证,以及微调我们的模型超参数。我们还成功地将预测功耗的 RMSE 从 85.61 降低到 54.57。

在本系列的第 3 部分中,我们将进行一个案例研究,分析呼叫中心生成的时间序列数据,主要是分析放弃率的(可怕)增量。敬请关注…

直到下次:)

我喜欢写循序渐进的初学者指南、操作指南、面试问题、解码 ML/AI 中使用的术语等。如果你想完全访问我的所有文章(以及其他媒体上的文章),那么你可以使用 我的链接**这里* 注册。*

* [## 检测语音数据中的情感:使用 Huggingface 微调 HuBERT

构建自定义数据加载器、实验日志、改进指标的技巧和 GitHub repo,如果您想了解…

towardsdatascience.com](/fine-tuning-hubert-for-emotion-recognition-in-custom-audio-data-using-huggingface-c2d516b41cd8) [## 了解 Python 导入,init。py 和 pythonpath —一劳永逸

了解如何导入包和模块(以及两者之间的区别)

towardsdatascience.com](/understanding-python-imports-init-py-and-pythonpath-once-and-for-all-4c5249ab6355) [## 处理时序带回家的作业:Python 中的一个案例研究

利用呼叫中心分析改善客户支持

medium.com](https://medium.com/@vishi2020/tackling-the-time-series-take-home-assignment-a-case-study-in-python-b2a3bd78d956) [## 数据科学家的 Python 高效编码指南

我每天用来编写干净代码的技巧和窍门

towardsdatascience.com](/data-scientists-guide-to-efficient-coding-in-python-670c78a7bf79)*

用 ARIMA 时间序列建模预测未来房价

原文:https://towardsdatascience.com/time-series-modeling-with-arima-to-predict-future-house-price-9b180c3bbd2f?source=collection_archive---------12-----------------------

从 0 到 1 的时间序列分析和建模

艾萨克·史密斯在 Unsplash 上拍摄的照片

时间序列曾经是我在研究生院时试图避免的话题,因为我的同龄人分享的课程非常理论化,课堂上讨论的所有案例都与金融有关,不幸的是,我当时对金融不感兴趣。多亏了我的数据科学训练营,我又有了一次接触时间序列的机会,我发现它在许多情况下都非常实用和有用。这一次,我使用时间序列分析和模型来预测投资布鲁克林的 5 个最佳邮政编码,我和我丈夫打算在那里购买一套公寓。在这篇博文中,我将分享你需要知道的关于时间序列的基础知识,以及我是如何一步步用 ARIMA 模型预测房价的。

首先我要打下一个时间序列建模项目的架构。我将在后面的章节中详细解释。

第一步:数据处理

第二步:数据探索和可视化

第三步:确定模型方法和 KPI

步骤 4:在训练集上开发模型,并使用测试集进行验证

第五步:微调模型并进行预测

请记住,时间序列只是在一段时间内以一致的时间间隔测量的一系列定义明确的数据点。时间序列分析帮助我们理解隐藏的模式,有意义的特征和数据的统计。

第一步:数据处理——将原始数据转换成以时间为索引的时间序列

在处理来自 Zillow.com 的数据集时,我必须首先选择该城市,并使用 pd.melt 将数据框从宽格式重塑为长格式,然后转换为时间序列数据。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inlinedfm.set_index('Month', inplace = True)

第二步:数据探索和可视化——季节分解、与 ACF 和 PCAF 的自相关等。

通过可视化,我们可以识别数据中潜在的趋势和故事。我们来看看布鲁克林的房价随着时间的变化。

从 1996 年到 2007 年可以看到总体上升趋势,随后从 2008 年到 2010 年年中出现波动。2011 年开始,房价更加稳定,再次持续上涨。我们可以非常自信地说,2008 年的房地产市场崩溃是这次波动的原因,我们确实希望跳过这段时间,以便对未来有一个更准确的预测。

2011 年后趋势更加稳定

我们关心的有三个重要特征:平稳性、季节性和自相关性

平稳性

大多数时间序列模型都假设时间序列是平稳的,这意味着时间序列的统计特性如均值、方差等是平稳的。保持不变。理想情况下,我们希望有一个平稳的时间序列来建模。 Dickey-Fuller 检验可以用来检验一个时间序列是否平稳。注意零假设是:时间序列不是平稳的。

from statsmodels.tsa.stattools import adfullerdftest = adfuller(ts)

季节性

季节性是指在一段固定时间内重复的周期性变化和模式。有时,季节性可以与上升或下降趋势相结合。季节性分解总是有助于检测数据集中的季节性、趋势和任何噪声。以布鲁克林住房数据为例:

from statsmodels.tsa.seasonal import seasonal_decomposedecomposition = sm.tsa.seasonal_decompose(month_avg, model='additive')trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid*# Plot gathered statistics*
plt.figure(figsize=(12,8))
plt.subplot(411)
plt.plot(month_avg, label='Original', color='blue')
plt.legend(loc='best')
plt.subplot(412)
plt.plot(trend, label='Trend', color='blue')
plt.legend(loc='best')
plt.subplot(413)
plt.plot(seasonal,label='Seasonality', color='blue')
plt.legend(loc='best')
plt.subplot(414)
plt.plot(residual, label='Residuals', color='blue')
plt.legend(loc='best')
plt.tight_layout()

布鲁克林月平均房价的季节分解

从上面的图表中我们可以清楚地看到,随着每年的季节性,有一个上升的趋势。下一步是用 Dickey-Fuller 测试来测试我们的残差。

自相关

自相关有助于我们研究每个时间序列观测值如何与其最近(或不太最近)的过去相关联。很容易得出,明天的房价极有可能和今天的房价有关。 ACF(自相关函数)PACF(偏自相关函数)是两个强有力的工具。ACF 将时间序列的自相关表示为时滞的函数。PACF 试图移除观测值和先前时间步长的观测值的自相关中存在的间接相关性

检查所有邮政编码的月平均价格的 ACF 和 PACF。

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from matplotlib.pylab import rcParamsrcParams['figure.figsize']=7,5
plot_acf(month_avg); plt.xlim(0,24); plt.show()
plot_pacf(month_avg); plt.xlim(0,24); plt.ylim(-1,1);plt.show()

ACF 显示该时间序列与之前的时间周期具有自相关性,然而,PACF 没有显示出显著的偏相关。

如果我们从当前月份的值中减去 3 个月前的值,换句话说,这是一个滞后 3 的差值。我们可以在 PACF 图中看到,当滞后=2 时,存在负的偏自相关,这意味着滞后-1 差异在时间序列数据中是显著的。

plot_acf(month_avg.diff(periods=3).bfill()); plt.xlim(0,24); plt.show()
plot_pacf(month_avg.diff(periods=3).bfill()); plt.xlim(0,24); plt.ylim(-1,1);plt.show()

步骤 3:决定模型方法和 KPI

由于我们的数据集不是静态的,并且存在季节性成分,因此使用 SARIMA 模型——季节性 ARIMA(带有外生回归量的季节性自回归综合移动平均)是合理的。在不深入研究方法论的情况下,我现在将重点关注重要的参数。

根据公式 SARIMA( pdq )x( PDQ,s ),这些型号的参数如下:

  • p 和季节性 P :表示自回归项(平稳序列的滞后)的个数
  • d 和季节性 D :表示为了平稳化系列必须进行的差分
  • q 和季节性 Q :表示移动平均项的个数(预测误差的滞后)
  • s :表示时间序列的周期性(4 表示季度,12 表示年度)

KPI:使用 AIC 选择最佳参数集

第四步:开发模型并用测试集验证模型

由于布鲁克林的 Zillow 数据集中有 29 个邮政编码,我决定首先在 3 个样本邮政编码上构建 SARIMA 模型,然后遍历所有其他邮政编码。

我首先创建一个数据帧列表,每个数据帧都有一个邮政编码的信息。

zip_dfs = []
zip_list = dfm.RegionName.unique()
for x in zip_list:
    zip_dfs.append(pd.DataFrame(dfm[dfm['RegionName']==x][['MeanValue']].copy()))

然后定义 P,D,Q 和 P,D,Q,s 取 0 到 2 之间的任意值

p = d = q = range(0,2)
# Generate all different combinations of p, d and q triplets
pdq = list(itertools.product(p,d,q))
# Generate all different combinations of seasonal p, d and q triplets
pdqs = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]

萨里玛模型

ans = []for df, name in zip(zip_dfs, zip_list):
    for para1 in pdq:
        for para2 in pdqs:
            try:
                mod = sm.tsa.statespace.SARIMAX(df,
                                                order = para1,
                                                seasonal_order = para2,
                                                enforce_stationarity = False,
                                                enforce_invertibility = False)
                output = mod.fit()
                ans.append([name, para1, para2, output.aic])
                print('Result for {}'.format(name) + ' ARIMA {} x {}12 : AIC Calculated = {}'.format(para1, para2, output.aic))
            except:
                continue

然后将所有结果存储到数据框中

result = pd.DataFrame(ans, columns = ['name','pdq','pdqs','AIC'])

按最低 AIC 排序,以找到每个邮政编码的最佳参数

best_para = result.loc[result.groupby("name")["AIC"].idxmin()]

对部分数据进行动态预测,并与真实值进行比较

#Make Prediction and compare with real values
summary_table = pd.DataFrame()
Zipcode = []
MSE_Value = []
models = []
for name, pdq, pdqs, df in zip(best_para['name'], best_para['pdq'], best_para['pdqs'], zip_dfs):ARIMA_MODEL = sm.tsa.SARIMAX(df,
                                 order = pdq,
                                 seasonal_order = pdqs,
                                 enforce_stationarity = False,
                                 enforce_invertibility = False,
                                 )

    output = ARIMA_MODEL.fit()
    models.append(output)

    #get dynamic predictions starting 2017-06-01
    pred_dynamic = output.get_prediction(start=pd.to_datetime('2017-06-01'), dynamic = True, full_results = True)
    pred_dynamic_conf = pred_dynamic.conf_int()
    zip_forecasted = pred_dynamic.predicted_mean
    zip_truth = df['2017-06-01':]['MeanValue']

    sqrt_mse = np.sqrt(((zip_forecasted - zip_truth)**2).mean())

    Zipcode.append(name)
    MSE_Value.append(sqrt_mse)

summary_table['Zipcode'] = Zipcode
summary_table['Sqrt_MSE'] = MSE_Value

第五步:预测未来

下一步将是使用完整的数据集来预测未来的值。我用 3 年作为例子。

#Final Model 
forecast_table = pd.DataFrame()
current = []
forecast_3Yr = []

for zipcode, output, df in zip(Zipcode, models, zip_dfs):
    pred_3 = output.get_forecast(steps = 36)
    pred_conf_3 = pred_3.conf_int()
    forecast_3 = pred_3.predicted_mean.to_numpy()[-1]
    current.append(df['2018-04']['MeanValue'][0])
    forecast_3Yr.append(forecast_3) forecast_table['Zipcode'] = Zipcode
forecast_table['Current Value'] = current
forecast_table['3 Years Value'] = forecast_3Yr forecast_table['3Yr-ROI']=(forecast_table['3 Years Value'] - forecast_table['Current Value'])/forecast_table['Current Value']

这是我的最终结果:

  • 11220 年:南日落公园(3 年投资回报率:17%-87%)
  • 第 11205 名:克林顿·希尔(3 年投资回报率:16%-78%)
  • 11203 年:东弗拉特布什(3 年投资回报率:8%-78%)
  • 11224 年:科尼岛(3 年投资回报率:-0.5%-76%)
  • 11217 年:博勒姆山(3 年投资回报率:6%-61%)

下一步

该模型纯粹基于时间序列,因此预测可能不太准确,因为显然还有许多其他因素影响房价,如经济、利率、房屋市场安全得分等。

如果要考虑其他因素,线性模型会更理想。

感谢阅读!让我知道你的想法。

有用的资源:

利用 Python 和自动 ARIMA 预测季节性时间序列

关于时间序列你需要知道的一切

用脸书预言家进行时间序列建模

原文:https://towardsdatascience.com/time-series-modeling-with-facebook-prophet-57f146a11d0d?source=collection_archive---------10-----------------------

分析和可视化时间序列数据的快速入门方法

当试图理解时间序列时,有太多的东西需要考虑。数据的总体趋势是什么?受季节性影响吗?我应该使用什么样的模型,它的性能如何?

所有这些问题都会让时间序列建模变得有点吓人,但也没那么糟糕。最近在为我的数据科学训练营做一个项目时,我尝试了脸书预言家,一个由……你知道,脸书开发的用于时间序列建模的开源包。我发现使用我的数据运行它非常快速和容易,所以在这篇文章中,我将向您展示如何做到这一点,并分享一个我编写的使用 Prophet all-in-one 进行建模和验证的函数。请继续阅读!

时间序列建模:基础

简而言之,时间序列建模就是寻找因变量和时间之间的关系。许多现实世界的数据可以以时间序列的形式出现:股票价格、温度、二氧化碳水平、我在万圣节每小时吃的零食数量等等。如果您想要预测时间序列中接下来会发生什么,那么您需要识别并消除时间对数据的影响,以便您可以将预测精力集中在任何潜在的、非基于时间的模式上。

实际上,这意味着您应该:

  • 识别数据随时间变化的总体趋势。价值观总体上是上升还是下降?还是他们徘徊在一个中间点?
  • 识别数据中任何重复的、季节性的模式。价值观是否每年夏天都会飙升,每年冬天都会跌至低谷?值在工作日还是周末更高?“季节性”趋势可能发生在任何时间尺度上(年、月、日、小时等)。),只要它在你的总时间段内重复。
  • 测试去除趋势和季节性后剩余的数据是否是平稳的。如果你的时间序列是平稳的,它的均值、方差和协方差从一项到下一项将是常数,而不是随时间变化。大多数时间序列模型都假设您提供给它们的数据是稳定的,因此如果您希望模型按预期工作,这是一个重要的步骤。

接下来往往是某种形式的 ARIMA (自回归综合移动平均线)建模。ARIMA 类似于线性回归,但是我们的解释性特征是我们比较每个数据点的过去时间点。

要在 Statsmodels 中运行一个 ARIMA 模型,你需要计算出有多少以及哪些过去的时间点用于比较,这可能会变得棘手且耗时。要找到最佳组合,您可能需要多次运行您的模型,每次都使用不同的术语组合(使用网格搜索或随机搜索),然后选择产生最佳结果的一个。当您考虑更多选项时,这样做所需的时间会成倍增加!

脸书先知

脸书预言家在幕后自动化了其中的一些过程,所以你需要做的预处理和参数选择更少(你出错的机会也更少)。你可以想象,脸书对他们用户活动中基于时间的模式非常感兴趣,所以他们建立了 Prophet,使其在处理多种规模的季节性方面特别强大。Prophet 还被设计为可供开发人员和非开发人员使用,这意味着它易于编写,并且可以为您提供有吸引力的图表和方便的预测数据表,而您只需付出很少的努力。Prophet 真正希望从您那里得到的是特定格式的数据,我将在下一节介绍这一点。

为先知做准备

请记住,我在 Python 中使用 Prophet,所以如果您在 r 中使用它,情况可能会有所不同。当 Prophet 读取您的数据帧时,它会查找两个特定的列。一个必须称为“ds”并包含您的 datetime 对象,另一个必须称为“y”并包含您的因变量。确保您的数据是“长”格式,即每行代表一个时间点。

为了更容易理解,我将使用 Statsmodels 的数据集,记录 1958 年至 2001 年莫纳罗亚天文台的二氧化碳水平。正如你将看到的,这个数据既有上升趋势,又有很强的季节性模式。

# Load needed packages
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from fbprophet import Prophet as proph

# Load the "co2" dataset from sm.datasets
data_set = sm.datasets.co2.load()

# load in the data_set into pandas data_frame
CO2 = pd.DataFrame(data=data_set["data"])
CO2.rename(columns={"index": "date"}, inplace=True)

# set index to date column
CO2.set_index('date', inplace=True)

CO2.head()

现在,日期是这个数据框架的索引。

请注意,我并没有马上将我的数据帧放入 Prophet 的正确格式中;我想先用它做些事情。

二氧化碳水平每周记录一次,但假设我对月间隔更感兴趣。我将重新取样为每月一次:

# Resample from weekly to monthly
co2_month = CO2.resample('MS').mean()

# Backfill any missing values
co2_month.fillna(method='bfill', inplace=True)

co2_month.head()

现在数据代表月平均二氧化碳水平。

看看趋势和季节性:

# Plot co2_month
plt.plot(co2_month.index, co2_month.co2)

一路曲折到达顶端!

好吧,这是一个可怕的二氧化碳水平上升,但让我们继续。在使用 Prophet 之前,我们需要创建“ds”和“y”列。

# Reset the index to make the dates an ordinary column
co2_month.reset_index(inplace=True)

# Rename the columns
co2_month.columns = ['ds', 'y']
co2_month.tail()

我们有 526 行月度二氧化碳数据,为 Prophet 做了适当的标记。

现在我们准备好迎接一些预言了!

包装该函数

我想预测二氧化碳将如何随时间增长,但我也想知道我的模型表现如何。我可以用我所拥有的数据来做这件事,方法是分离出数据的一部分,预测这部分的值,然后将预测值与实际值进行比较。在这种情况下,我将去掉最后 10%的数据(53 个月)用于验证:

# Split the data 90:10
co2_train = co2_month[:473]
co2_test = co2_month[473:]

我为自己编写了一个函数,它可以接受我的训练数据、验证数据和整个数据集,并返回以下内容:

  • 我的训练数据和预测的图表;
  • 将我的预测与来自验证数据集的实际值进行比较的图;
  • 显示基于整个数据集的长期预测的图;
  • 显示整个数据集中总体趋势和季节性的图。

我的函数打印这些图,并返回包含要与验证数据和长期预测进行比较的预测的数据帧。如果您想要分析模型预测的精确值,这些会很有用。

这是我的函数:

# Define a function to do all the great stuff described above
def proph_it(train, test, whole, interval=0.95, forecast_periods1, 
             forecast_periods2):
    '''Uses Facebook Prophet to fit model to train set, evaluate  
    performance with test set, and forecast with whole dataset. The 
    model has a 95% confidence interval by default.

       Remember: datasets need to have two columns, `ds` and `y`.
       Dependencies: fbprophet, matplotlib.pyplot as plt
       Parameters:
          train: training data
          test: testing/validation data
          whole: all available data for forecasting
          interval: confidence interval (percent)
          forecast_periods1: number of months for forecast on 
              training data
          forecast_periods2: number of months for forecast on whole 
              dataset'''

    # Fit model to training data and forecast
    model = proph(interval_width=interval)
    model.fit(train)
    future = model.make_future_dataframe(periods=forecast_periods1, freq='MS')
    forecast = model.predict(future)

    # Plot the model and forecast
    model.plot(forecast, uncertainty=True)
    plt.title('Training data with forecast')
    plt.legend();

    # Make predictions and compare to test data
    y_pred = model.predict(test)

    # Plot the model, forecast, and actual (test) data
    model.plot(y_pred, uncertainty=True)
    plt.plot(test['ds'], test['y'], color='r', label='actual')
    plt.title('Validation data v. forecast')
    plt.legend();

    # Fit a new model to the whole dataset and forecast
    model2 = proph(interval_width=0.95)
    model2.fit(whole)
    future2 = model2.make_future_dataframe(periods=forecast_periods2, 
                                          freq='MS')
    forecast2 = model2.predict(future2)

    # Plot the model and forecast
    model2.plot(forecast2, uncertainty=True)
    plt.title('{}-month forecast'.format(forecast_periods2))
    plt.legend();

    # Plot the model components
    model2.plot_components(forecast);

    return y_pred, forecast2

请注意,我的函数被设置为按月处理数据,图中将有反映这一点的标题。您可以重构函数来处理不同规模的数据,但这符合我的目的。

快跑,先知,快跑!

让我们在三个数据集(训练、验证和整体)上运行这个函数。因为我任意保留了最后 10% (53 个月)的数据进行验证,所以我也任意预测超过 10 倍的数据,即 530 个月,也就是 44 年多一点。

# Run the wrapper function, supplying numbers of months for forecasts
short_term_pred, long_term_pred = proph_it(co2_train, co2_test, co2_month, 53, 530)

该功能现在将开始打印出图。这是前 90%的数据集以及对后 10%的预测:

现在我们可以将预测值与过去 53 个月的实际值进行比较:

现在利用所有可用数据进行长期预测。自然,95%的置信区间会随着时间的推移而急剧扩大。二氧化碳水平可能会降低……但也可能会升高。

这些是 Prophet 的“组件图”,它分解了数据中的趋势和季节性。看起来二氧化碳水平往往在春季达到年度最高,在秋季达到最低。

我现在可以直观地分析这些漂亮的图,如果我想看预测值本身,我手头也有。

这就是全部了!我在一个关于预测未来几年俄勒冈州房价上涨的项目中使用了这个函数。你可以在 GitHub 上查看代码。

感谢阅读!

跨贴自【jrkreiger.net】

时间序列模型

原文:https://towardsdatascience.com/time-series-models-d9266f8ac7b0?source=collection_archive---------1-----------------------

AR,MA,ARMA,ARIMA

图片由皮克斯拜的 Gerd Altmann 提供

AR、MA、ARMA 和 ARIMA 模型用于根据为同一观测记录的先前时间点的历史数据来预测(t+1)的观测。但是,有必要确保时间序列在观测超时期间的历史数据上是平稳的。如果时间序列不是平稳的,那么我们可以在记录上应用差异因子,看看时间序列的图形是否是平稳的超时周期。

ACF(自相关函数)

自相关函数考虑了所有过去的观察值,而不考虑其对未来或当前时间段的影响。它计算 t 和(t-k)时间段之间的相关性。它包括 t 和(t-k)时间段之间的所有滞后或间隔。相关性总是使用皮尔逊相关公式来计算。

PACF(部分相关函数)

PACF 确定时间段 t 和 t-k 之间的部分相关性。它没有考虑 t 和 t-k 之间的所有时滞。例如,让我们假设今天的股价可能取决于前 3 天的股价,但它可能没有考虑昨天的股价收盘。因此,我们通过忽略两个时隙 t 和 t-k 之间的不重要的时滞,只考虑对未来时间周期有直接影响的时滞

如何区分何时使用 ACF 和 PACF?

让我们以一个村庄一年的糖果销售和收入为例。假设村里每 2 个月有一个节日,我们取出 12 个月的糖果销售和收入的历史数据。如果我们把时间画成月份,那么我们可以观察到,在计算糖果销售额时,我们只对隔月感兴趣,因为糖果销售额每两个月增加一次。但如果我们要考虑下个月的收入,那么我们就必须考虑去年全年的收入。

因此,在上述情况下,我们将使用 ACF 来找出未来产生的收入,但我们将使用 PACF 来找出下个月销售的糖果。

AR(自回归)模型

作者图片

在 t 的时间周期受到在不同时隙 t-1,t-2,t-3,…..先前时间点的影响由该特定时间段的系数因子决定。任何特定公司 X 的股票价格可能取决于时间序列中所有以前的股票价格。这种模型计算过去时间序列的回归,并计算序列中的当前或未来值,称为自回归(AR)模型。

yt = β₁y-₁+β₂yₜ-₂+β₃yₜ-₃+…………+βₖyₜ-ₖ

考虑一个牛奶分销公司的例子,该公司每月在该国生产牛奶。考虑到去年生产的牛奶,我们想计算本月生产的牛奶量。我们首先计算当月所有 12 个滞后期的 PACF 值。如果任何特定月份的 PACF 值大于某个有效值,则只有这些值会被考虑用于模型分析。

例如,在上图中,值 1,2,3 到 12 显示了在给定滞后 t 的情况下,当月牛奶产量的直接影响(PACF)。如果我们考虑两个高于阈值的显著值,则该模型将被称为 AR(2)。

移动平均线模型

作者图片

t 处的时间周期受到在各个时隙 t-1、t-2、t-3、…的意外外部因素的影响..这些意想不到的影响被称为误差或残差。先前时间点的影响由该特定时间段的系数因子α决定。任何特定 X 公司的股票价格可能取决于一夜之间发生的公司合并,或者该公司因破产而关闭。这种模型计算过去时间序列的残差或误差,并计算序列的当前或未来值,称为移动平均(MA)模型。

yt = α₁ɛₜ-₁+α₂ɛₜ-₂+α₃ɛₜ-₃+…………+αₖɛₜ-ₖ

考虑一个在我生日时分发蛋糕的例子。假设你妈妈让你带糕点去派对。每年你都会错过判断参加聚会的邀请数量,并根据要求结束或多或少的蛋糕数量。实际和预期的差异导致了误差。因此,您希望避免今年的错误,因此我们对时间序列应用移动平均模型,并根据过去的总体错误计算今年所需的糕点数量。接下来,计算时间序列中所有滞后的 ACF 值。如果任何特定月份的 ACF 值大于一个重要值,则只有这些值将被考虑用于模型分析。

例如,在上图中,值 1、2、3 到 12 显示了当前月份糕点计数的总误差(ACF ),考虑到时间 t 和当前月份之间的所有滞后,给出了滞后 t。如果我们考虑高于阈值的两个重要值,那么该模型将被称为 MA(2)。

ARMA(自回归移动平均)模型

作者图片

这是一个由 AR 和 MA 模型组合而成的模型。在该模型中,预测时间序列的未来值时考虑了先前滞后和残差的影响。这里,β表示 AR 模型的系数,α表示 MA 模型的系数。

yt = β₁yₜ-₁+α₁ɛₜ-₁+β₂yₜ-₂+α₂ɛₜ-₂+β₃yₜ-₃+α₃﹍-̿+……+β﹍ y﹍+α﹍*﹍-̿*

考虑上面的图表,其中 MA 和 AR 值标有各自的有效值。让我们假设我们只考虑来自 AR 模型的 1 个重要值和来自 MA 模型的 1 个重要值。因此,ARMA 模型将从其他两个模型的组合值中获得,其数量级为 ARMA(1,1)。

ARIMA(自回归综合移动平均)模型

作者图片

我们知道,为了应用各种模型,我们必须首先将序列转换成平稳时间序列。为了达到同样的目的,我们应用差分或积分方法,从时间序列的 t 值中减去 t-1 值。在应用第一差分之后,如果我们仍然不能获得平稳的时间序列,那么我们再次应用二阶差分。

ARIMA 模型与 ARMA 模型非常相似,除了它包括一个称为积分(I)的因子,即在 ARIMA 模型中代表 I 的差分。因此,简而言之,ARIMA 模型是已经应用于模型的许多差异的组合,以使其稳定,先前的滞后数以及残差,以预测未来值。

考虑上面的图表,其中 MA 和 AR 值标有各自的有效值。让我们假设我们只考虑来自 AR 模型的 1 个重要值和来自 MA 模型的 1 个重要值。此外,该图最初是不稳定的,我们必须执行一次差分操作,以便转换成稳定的集合。因此,将从其他两个模型的组合值以及积分算子获得的 ARIMA 模型可以显示为 ARIMA(1,1,1)。

结论:

所有这些模型都给了我们对任何特定时间序列的洞察力或至少足够接近的预测。此外,哪种型号完全满足用户的需求也取决于用户。如果与其他模型相比,任何一个模型的错误率都较小,那么我们最好选择给出最接近估计值的模型。

希望这篇文章能帮助你更好地理解事情!!

基于 LSTM 的时间序列价格异常检测

原文:https://towardsdatascience.com/time-series-of-price-anomaly-detection-with-lstm-11a12ba4f6d9?source=collection_archive---------1-----------------------

强生、JNJ、Keras、Autoencoder、Tensorflow

自动编码器是一种无监督学习技术,尽管它们是使用监督学习方法训练的。目标是最小化基于损失函数的重建误差,例如均方误差。

在本帖中,我们将尝试使用 LSTM 自动编码器来检测约翰逊&约翰逊的历史股价时间序列数据中的异常。

数据可以从雅虎财经下载。我选择的时间段是从 1985 年 9 月 4 日到 2020 年 9 月 3 日。

使用 LSTM 自动编码器检测强生股票价格数据异常时,我们将遵循的步骤:

  1. 用强生公司从 1985 年 9 月 4 日到 2013 年 9 月 3 日的股票价格数据训练一个 LSTM 自动编码器。我们假设没有异常,它们是正常的。
  2. 使用 LSTM 自动编码器重建 2013 年 9 月 4 日至 2020 年 9 月 3 日测试数据的误差。
  3. 如果测试数据的重建误差高于阈值,我们将该数据点标记为异常。

我们将分解一个 LSTM 自动编码器网络来逐层理解它们。

数据

LSTM _ 自动编码器 _ 异常. py

可视化时间序列

viz_timeseries.py

图 1

预处理

  • 列车测试分离

火车 _ 测试. py

  • 使数据标准化

标准化. py

  • 创建序列

结合TIME_STEPS将输入数据转换成三维数组。根据 LSTM 网络的要求,阵列的形状应为[samples, TIME_STEPS, features]

我们希望我们的网络有 30 天的记忆,所以我们设置了TIME_STEPS=30

create _ sequences.py

建立模型

  • 我们定义了重建 LSTM 自动编码器架构,其期望具有 30 个时间步长和一个特征的输入序列,并且输出具有 30 个时间步长和一个特征的序列。
  • RepeatVector()重复输入 30 次。
  • 设置return_sequences=True,那么输出仍然是一个序列。
  • TimeDistributed(Dense(X_train.shape[2]))加在最后得到输出,其中X_train.shape[2]是输入数据中的特征数。

LSTM _ 自动编码器. py

图 2

训练模型

LSTM _ 自动编码器 _ 火车 _ 模型. py

图 3

plt.plot(history.history['loss'], label='Training loss')
plt.plot(history.history['val_loss'], label='Validation loss')
plt.legend();

图 4

model.evaluate(X_test, y_test)

确定异常

  • 在训练数据上找到 MAE loss。
  • 将训练数据中的最大 MAE 损失值作为reconstruction error threshold
  • 如果测试集中一个数据点的重建损失大于这个reconstruction error threshold值,那么我们将把这个数据点标记为异常。

LSTM _ 火车 _ 损失. py

图 5

test _ 测试 _ 损失. py

图 6

测试 _ 损耗 _ vs _ 阈值. py

图 7

anomalies = test_score_df.loc[test_score_df['anomaly'] == True]
anomalies.shape

如您所见,测试集中有 22 个数据点超过了reconstruction error threshold

可视化异常

plot_anomalies.py

图 8

模型发现 3 月份出现一些低价异常,4 月份出现高价异常。据详细记载, JNJ 股票在 3 月份触及 2020 年低点,但由于对其冠状病毒疫苗的乐观预期,不到一个月之后迅速回升至高点。

Jupyter 笔记本可以在 Github 上找到。祝你一周愉快!

参考资料:

[## LSTM 自动编码器简介-机器学习掌握

LSTM 自动编码器是一个使用编码器-解码器 LSTM 的序列数据自动编码器的实现

machinelearningmastery.com](https://machinelearningmastery.com/lstm-autoencoders/) [## 基于 Keras 的时间序列数据异常检测

由 Coursera 项目网提供。在这个动手介绍异常检测的时间序列数据与 Keras…

www.coursera.org](https://www.coursera.org/projects/anomaly-detection-time-series-keras) [## Keras 文档:使用自动编码器的时间序列异常检测

作者:pavithrasv 创建日期:2020/05/31 最近修改时间:2020/05/31 描述:检测时间序列中的异常…

keras.io](https://keras.io/examples/timeseries/timeseries_anomaly_detection/)

posted @ 2024-10-16 09:02  绝不原创的飞龙  阅读(456)  评论(0)    收藏  举报