TowardsDataScience 博客中文翻译 2019(五百零八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

走向社会数据科学

原文:https://towardsdatascience.com/towards-social-data-science-f90c5c020855?source=collection_archive---------9-----------------------

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

@sebastiandumitru unsplash

数量越多,责任越大

将社会科学和数据科学结合起来并不是一种新的方法,然而在经历了几次曝光之后*(以及巨额罚款)*大型科技公司开始意识到自己的处境。似乎研究机构,尤其是欧洲的研究机构,很乐意促进这种转变。本文是(1)数据科学的广义定义;(2)快速浏览社会数据科学;(3)从表面上看,相对而言,社会数据科学学科目前有多新。

1.广义定义的数据科学

让我们首先考虑什么是数据科学,然后继续解释为什么添加了社交的这个新术语是有用的。作为一个简短的免责声明,我并不是说数据科学对社会问题一无所知,不是社会性的或有重要的见解。相反,它是一个特殊的研究领域,可以与其他学科互补或混合。

数据科学 是运用科学的方法、流程、算法和系统,从结构化和非结构化数据中提取知识和见解的多学科领域。

It 可以更具体地定义为拥有三种互补角色的强大技能组合的人:

  • 专家分析师
  • 机器学习工程师
  • 统计员

然而,研究工程和数据科学家都可以使用。艾伦·图灵研究所似乎跨越了这两种模式。

今年早些时候,一些作者在的《走向数据科学》中提出了一个关于数据科学中模糊性和解释的关键问题。托马斯·尼尔德认为它需要被分解成专门的学科。Cassie Kozyrkov 认为数据分析中存在心理陷阱,导致了解释问题。我很感兴趣地看到两篇文章使用了相同的罗夏测试图像——墨迹测试感知。

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

Two of my favourite authors writing about ambiguity in data science

凯西的观点尤其引人注目:“你确定你最近的数据顿悟不是伪装的 apop hany(T1)吗?” Apophenia 暗指人类普遍倾向于在随机信息中寻找模式。她认为大脑处理墨迹就像处理数据一样,一旦你获得了“洞察力”,你将很难不去发现它。

出于某种原因,罗夏测试经常被质疑为伪科学和不科学。事后看来,拍一张整洁的照片,带给不同的人,并用它来诊断问题似乎是一个相当严重的错误。多年来,这种方法被用于从法庭到精神健康机构的各种场合,有时会产生广泛的负面后果。我们喜欢整洁的图片,然而它们并不总是给人以正确的印象。

2.社会数据科学

让我来陈述一个显而易见的事实:数据科学与社会科学有着不同的关注点。有一个巨大的研究领域是大多数计算机科学家不会学习或关注的。培养计算机工程师或程序员的技能需要时间和大量的努力,这个领域有各种子领域,但是它有传统可能不同

社会科学是一个学科门类,关注社会和社会中个人之间的关系。社会科学作为一个整体有许多分支。这些社会科学包括但不限于:人类学、考古学、传播学、经济学、历史学、音乐学、人文地理学、法学、语言学、政治学、心理学、公共卫生和社会学。

在 7 月 26 日发表的另一篇名为《人工智能和数据科学的十大角色》的文章中,她再次引用了凯莉的话,将社会科学家列为第八位:

“我们没有意识到社会科学家有多么有价值。他们通常比数据科学家更有能力将决策者的直觉和意图转化为具体的指标。”

谷歌首席决策情报工程师凯西·科济尔科夫

然而,她的观点似乎是基于对编程一无所知或知之甚少的社会科学家,意在作为一种扩充工程团队的方式。然而,这让我们想到了社会科学和计算机科学的结合。

艾伦图灵研究所(ATI) 是英国国家数据科学和人工智能研究所,成立于 2015 年。它是以艾伦·图灵的名字命名的,艾伦·图灵是英国数学家和计算机先驱,通常被认为是计算机科学的创始人之一。计算机科学是研究与数据交互的过程,可以用程序的形式表示为数据。

ATI 的一个研究领域是社会数据科学。他们试图通过两个主题来解决与大量数据相关的挑战:(1)在不同的社会和时间尺度上发展人类行为的基础理论;(2)确定方法上的挑战和解决方案,使社会数据科学能够在关键应用领域提供稳健可信的结果。

其目标是:

  • 培养足够数量的社会科学家、数据科学家和社会数据科学家
  • 通过学术、商业、非政府组织和政府利益相关者的定期会议,与数据基础设施和培训投资及政策制定者建立关系。

据我所知,目前有三所大学开设了理学硕士课程。一个是牛津大学伦敦政治经济学院哥本哈根大学。哥本哈根大学网站上对社会数据科学的描述如下:

社会数据科学是一门结合了社会科学和计算机科学的新学科,其中大数据的分析与社会科学理论和分析相关联。

与社会数据科学相关的研究领域很多。它们可以基于从例如社交媒体收集的数字数据、注册数据、客户数据或者基于人们留下的其他类型的数字痕迹,例如通过他们个人使用互联网、他们使用智能电话和其他数字服务。这些庞大的数据集也可以与通过人类学实地工作等收集的定性数据相结合。
哥本哈根大学社会科学教员检索到 7 月 19 日

3.社会数据科学的学科有多新?

截至 2019 年 7 月 19 日,维基百科上没有关于该主题的页面。

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

在我写作的时候,只有一篇关于媒体的文章提到了社会数据科学,我可以通过搜索找到。这篇文章是去年写的,现在关于这个话题的文章可能比我想象的要多得多。

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

Picture taken the 19th of July 2019

将数据科学与社会科学的理论相结合的想法并不一定是一种新的方法。然而,计算机科学和社会科学以这种方式的结合也许可以说代表了一种有趣的新形式——值得探索。

这是第 500 天的第 47 天

什么是#500daysofAI?
我在挑战自己,写下并思考未来 500 天的人工智能话题。一起学习是最大的快乐,所以如果你觉得一篇文章引起了你的共鸣,请给我反馈。感谢您的阅读!

走向跨包容的人工智能

原文:https://towardsdatascience.com/towards-trans-inclusive-ai-a4abe9ad4e62?source=collection_archive---------19-----------------------

性别二进制算法的问题是

人工智能像设计它们的人一样“思考”——对性别有一种二元的、非规范性的概念。他们排斥变性人,强化性别陈规定型观念。更糟糕的是,世界各国政府花费数十亿美元将顺式性别歧视人工智能扩展到政府机构等新行业和图像识别等新应用,而很少考虑它们的性别影响。计算机科学界、技术界和政府机构应该对他们算法的性别影响承担更多责任。他们需要学会使用酷儿和跨性别理论来分析算法的性别影响,然后将这种学习应用于社会中人工智能算法的设计、部署和监控。

背景

人工智能算法通常是两种类型之一:机器学习算法或专家系统。机器学习是人工智能的一个子领域,算法从训练数据中学习以做出决策。该领域的三位先驱,Yann LeCun、Geoffrey Hinton 和 Yoshua Bengio 最近因他们的工作获得了图灵奖。这证明了机器学习算法在图像识别、无人驾驶汽车和语言翻译等众多应用中的强大功能。专家系统是更简单的算法,由领域专家创建的 if-then 规则组成。例如,由医生创建的算法可以执行以下规则"如果患者显示 X 和 Y 症状,进行 Z 干预"。

我对以性别作为输入或输出的机器学习算法感兴趣。这里有两个例子:

自动性别识别(AGR) —输入是某人的图片、视频或社交媒体帖子。输出是他们预测的性别,问题是只限于男性或女性。

脸书的广告推荐算法 —输入是用户的个人资料,包括他们的性别身份。输出是一个脸书新闻提要广告。

性别歧视 AI——性别输出

自动性别识别是顺性别歧视和跨性别歧视。顺性别歧视是一种假设,即某人出生时分配的性别与其性别认同相匹配,并且性别认同不会随着时间的推移而改变。ARG 的顺性别歧视排斥跨性别者和性别酷儿,强化了“真正的”男人和女人的性别刻板印象。 自动性别识别不应该做 。跨性别者和性别酷儿的认同向我们表明,性别既不是由性别决定的,也不是二元的,更不是不可改变的。假设其他暴力抹去这些群体的经验。

对看起来不像“真正的”男人或女人的人的压迫——无论他们是否认为自己是跨性别者——是他们与人工智能定期互动的一部分。例如,在同工同酬日,柏林运输公司(BVG) 向“真正的”女性提供机票折扣。BVG 指出,“在柏林乘坐地铁、公共汽车或电车的女性将比男性少支付 21%的费用……这是为了突出德国日益扩大的性别薪酬差距。”BVG 试图让人们意识到德国严重的薪酬差距,却忽视了跨性别和性别不合群的人。BVG 的工作人员被授权对乘客的性别身份做出决定,这是他们本不该拥有的权力。如果一名跨性别女性因为 BVG 的工作人员不相信她的性别身份而被拒绝打折机票,会怎么样?现在想象一下,不是 BVG 的员工来做这些关于性别身份的决定,而是一台相机和一个人工智能算法。整个柏林的火车站都安装了摄像头来进行面部识别。一个人工智能算法现在有权决定任何在柏林乘坐公共交通工具的人的性别身份,这是一个非常可怕的想法。一个可能的跨性别替代方案是向自我认定为非独联体男性的人发放折扣票,这将使人们意识到独联体男性与其他性别之间的薪酬差距。当然,一些独联体国家的人会滥用这一制度,但跨性别的薪酬差距信息将会清晰响亮。

一般来说,人工智能算法不应该对性别身份做出决定。使用性别作为人工智能算法的输出是不科学的,因为性别身份是在个人的权威之下。这不是看身体或外在表情就能决定的。如果一个组织需要知道某人的性别身份,他们应该问,而不是推断。

性别歧视人工智能——性别输入

脸书广告算法有提供基于自我认同的性别的歧视性广告的历史。其中一个例子是脸书算法拒绝女性观看在线招聘广告。然而,脸书算法并不是唯一一个使用性别输入做出性别歧视决定的算法。有一种广告牌广告算法,它使用隐藏的摄像头来猜测路过的人的性别,然后向他们提供广告。被认为是男性的人会收到比萨饼的广告,而被认为是女性的人会收到沙拉的广告。将性别化的输入纳入人工智能算法,更有可能做出顺性别歧视和性别歧视的决定。

由于上面的例子,还不清楚是否有一种负责任地使用性别输入的方法。也许我们可以找到一种方法,负责任地使用性别身份来提高一些算法的能力,而不会对女性、跨性别者和性别酷儿造成伤害,但也许不会。当然,唯一有效的性别输入是打破 M 或 F 性别二元结构的自我识别的性别。我们需要回答的问题是“性别输入是提高了算法性能还是仅仅延续了性别刻板印象?”

用人工智能缩放性别歧视

我们正在通过扩大人工智能在社会中的作用来克服顺性别歧视,同时忽略它的偏见。由于在公共和私营行业的广泛使用,AI 算法在社会上越来越普遍。美国、中国和其他国家的政府每年花费数十亿美元资助人工智能的研究和开发。杰出的人工智能研究者吴恩达称之为下一个电力时代,科技行业正等待人工智能将世界变得更好。然而,人们很少意识到人工智能系统如何对跨性别者、同性恋者和异性恋者产生异规范效应。

现在很多行业都在使用人工智能。临床决策支持系统被医生用于医疗保健中的一系列任务,自动决策系统被市政府用于预测刑事再犯和进行预测性警务。这一趋势只会继续,因为机器学习研究人员正在扩展算法的能力,像亚马逊网络服务(AWS)和谷歌云平台(GCP)这样的云计算平台正在让非专家更容易使用人工智能系统。部署人工智能算法所必需的人力资本正在增长。

唐纳德·特朗普(Donald Trump)最近签署了一项行政命令,建立了“美国人工智能倡议——这将要求联邦机构向人工智能(AI)研究、培训和推广投入更多资源”。对行政命令最大的批评?它没有足够的资金来跟上中国、韩国和加拿大的人工智能项目,这些项目涉及数亿美元的多年战略。

我们必须承认人工智能不断扩大的作用。人工智能算法不再是政治中立的。他们做出的决定会对社会产生巨大而复杂的影响,可能会产生性别偏见,特别是对跨性别和性别不一致的人。研究、设计和使用人工智能算法的人必须理解这一点,这样他们才能负责任地推动人工智能在社会中的应用。

怎么修

人工智能系统的透明使用。人工智能算法的设计者声称的“商业秘密”和普遍缺乏公开披露阻止了公众、记者和学者探索人工智能算法的性别影响。最迫切需要这种透明度的是公共机构使用的自动决策系统。NYU AI Now 部门的一个团队设计了一个算法影响评估,为公共机构负责任地使用人工智能算法提供了一个框架。

重视跨知识。我们需要解决创建、使用和部署人工智能算法的社区中预先存在的性和性别观念。例如,设计 AGR 算法的人机交互研究人员分享了他们算法的性别歧视观点。从广义上讲,有影响力的人工智能社区包括机器学习研究人员、数据科学家和技术高管,所有这些人都主要由顺式性别男性组成,他们通常对性别有二元概念。为了使人工智能系统的专家审计有效,审查算法的人必须了解机器学习/人工智能的技术方法和跨性别观点。两个领域都有专长的人很少。这里有一个关于跨性别观点的简短阅读列表,可能有助于分析人工智能算法的性别影响:

1.让我们从出生证明上删除性别身份

2.反肯定的语言不仅仅是一种礼貌

3.一名变性人工智能研究人员对面部识别软件的噩梦场景

4.边飞行边运输

致谢

我要感谢 Davy Knittle 在撰写这篇博文中发挥的核心作用。他在跨性别研究方面的专业知识以及对人工智能和性别话题的兴奋使这篇博文成为现实。

走向幸福,数据科学(第 1 部分)

原文:https://towardsdatascience.com/towards-well-being-with-data-science-part-1-7f8035f73aa?source=collection_archive---------10-----------------------

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

Credit: EUFIC

我用我的苹果健康数据来衡量我目前的状态,并设定未来的健身目标。

在过去的几周里,我一直好奇如何在自己的生活中使用数据。在我的日常工作中,我使用数据来帮助在企业环境中做出更好的决策,所以我想,为什么不使用我当前可用的数据来设定更健康生活的指标和目标呢?

在这些系列中,我将经历 A .介绍,b .探索数据 c .分析&绘图,d .测试,e .结论。

A.介绍

苹果健康

这是什么?这是苹果提供的描述:

健康应用程序可以轻松了解您的健康状况,并开始实现您的目标。它整合了来自 iPhone、Apple Watch 和您已经使用的第三方应用程序的健康数据,因此您可以在一个方便的地方查看您的所有进展。它还推荐了其他有用的应用程序来完善你的收集——让你的健康变得前所未有的简单。

[## iOS -健康

健康应用程序可以更容易地跟踪你的健康和健康数据,集中在四个方面:活动,睡眠…

www.apple.com](https://www.apple.com/ios/health/)

动机

我目前有一部 iPhone X,附带苹果健康应用。它还有健康记录 API,您可以连接到它并从中提取更多有趣的数据,但是出于各种目的,我们将在本文中使用一个更简单的方法。

据我所知,苹果健康也包含在以前的 iPhone 型号中,所以如果你有一个旧版本的手机,你不会被排除在外。此外,如果你有一个苹果手表,你就有了额外的指标,如:心率监测、心电图、跌倒检测、生命体征、血压等。

苹果健康应用程序有交互式可视化功能,可以查看你的数据,所以我这么做主要是为了自娱自乐。我必须说,它缺乏工具来拥有一个聚合视图,所以我想我可以使用一些 python 库来可视化我当前的表单。

下载数据

在转换数据之前,您需要从 Apple Health 文件中导出数据文件。虽然有几种方法可以做到这一点,但我用电子邮件给自己发送了数据导出。为此,只需在手机中导航:苹果健康>健康数据>个人资料图标>导出健康数据

为了转换数据,我使用了 markwk 的“苹果健康提取器和数据分析”工具。更多信息见链接:

https://github . com/markwk/QS _ ledger/tree/master/apple _ health

markwk 代码的第一个脚本允许您将 XML 文件转换为 CSV,我将它加载到 Jupyter Notebook 中:

# %run -i ‘apple-health-data-parser’ ‘export.xml’ 
%run -i ‘/Users/stephenhyungilkim/qs_ledger-master/apple_health/apple-health-data-parser.py’ ‘/Users/stephenhyungilkim/apple_health_export/export.xml’

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

该脚本将代码分成几个部分,包括:

身高、体重、步数、步行距离、跑步、燃烧的积极能量、飞行攀爬、锻炼数据。

B.探索数据

任何数据分析项目的第一步,我们必须寻求理解数据的不同维度以及文件包含的内容!先说其中一个特点,步骤:

steps = pd.read_csv("/Users/stephenhyungilkim/apple_health_export/StepCount.csv", parse_dates=["startDate"], index_col="startDate")
steps.describe()

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

figure 1

这给了我们一些关于数据的一般统计。例如,我们可以看到有 6833 个“步”的实例,平均值是 374 步…但是推荐的平均值不是每天 10,000 步吗?😮

steps.tail()

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

figure 2

在图 2 中,我们可以看到我在导出之前的最新数据。我们可以得出的一些信息是,数据源来自我的 iPhone 设备’,我们也有值。不过,我开始为自己辩护,因为数据似乎表明我非常懒惰。一天只走 34 步可能吗?

然后,我意识到 34 步并不是一天的总数,因为“开始日期”在同一天内有多次。我回到我的手机上查看我那天的总步数,令我欣慰的是,它超过了 34 步。

len(steps)

这再次证实我们有 6833 项记录。

steps.columns

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

figure 3

在图 3 中,我们可以看出有 8 个特性,但是对于我们的时间序列用例,我们可以保留’和’开始日期,并删除所有其他的特性(我将在更深入的研究后马上这么做)。

steps.value.sum()

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

figure 4

图 4 显示了我们在给定范围内采取的所有步骤的总和。10,000 步大约相当于 5 英里,所以你们可以算一下。这可能看起来很多,但是请记住,对于健康来说,每天的数字比总和更重要。每天都要踩这些台阶,对吧?

steps.value

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

figure 5

图 5 开始看起来有点像时间序列,其中我们有一个数据和值。这是有希望的,似乎是可以策划的。我确实意识到,如果我想要一个每日视图,我将需要每天进行聚合,而不是使用 startDate 特性。正如我们之前提到的,我们仍然需要去掉其他特性。

steps_new = steps.drop(['sourceName','sourceVersion','device','type','unit','creationDate','endDate'], axis=1)

上面的代码从数据帧中删除了不必要的特性。

type(steps_new)

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

figure 5

为了让我们处理时间序列,我们需要相应地修改数据。上面的代码向我们展示了我们正在处理什么类型的数据。请注意,当我使用’ read_csv ‘时,我确保’ startDate ‘是日期时间(不是字符串或任何其他值),并且’ startDate '是索引列。

其他维度

因为还有 6 个维度,所以我迭代相同的代码来理解数据。考虑到我的身高保持不变,像“身高”这样的一些特征看起来并不令人兴奋。为了保持连续性,我将继续探索这个步骤的维度。

C.分析和绘图

虽然有几个有趣的列,但我们应该主要关注“值”和“开始日期”。这些将是我们的线图的轴,所以请查看我的“健康”的时间序列表示。

steps_new.plot()
plt.title('How Many Steps Has Stephen Taken?')
plt.ylabel('Steps')
plt.xlabel('Date')

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

figure 6

这是一个有趣的第一个图…我们可以看到从 10 月到 11 月中旬的巨大活动。我立刻有了一些初步的想法。那段时间比较暖和,当我导出数据时,我确实注意到它正在从三四个来源检索数据。我的 iPhone,我的高尔夫 GPS 应用程序,我的 nike run 应用程序,我的 Fitbit,直到它坏掉。我最初的想法是,在那几个月里,我更多地使用了所有这些设备,因此我看到了峰值。

我的第一部分结论是:

第 1 部分到此结束。在第 2 部分中,我将更深入地研究这个情节,讨论时间序列的考虑因素,并在我们的数据中使用一个叫做 ARIMA/博克斯詹金斯方法的模型。我还会谈到时间序列因素,如趋势、季节性、均值和方差。

对我的朋友 WH 大声喊出来,是他启发了我去做这件事!虽然我确实想公开他的名字以保护他的隐私,但他之前的数据探索,包括使用 python 绘制他在纽约最常去的地方的地图,以及使用苹果公司的“屏幕时间”应用程序监控他的数字福祉,都激励我将数据很好地用于我自己的个人生活。

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

走向幸福,数据科学(第二部分)

原文:https://towardsdatascience.com/towards-well-being-with-data-science-part-2-bcaf1db96064?source=collection_archive---------22-----------------------

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

Credit: EUFIC

请参考(第 1 部分)来看看我们在前面的故事中涵盖了什么。

[## 走向幸福,数据科学(第 1 部分)

我用我的苹果健康数据来衡量我目前的状态,并设定未来的健身目标。

towardsdatascience.com](/towards-well-being-with-data-science-part-1-7f8035f73aa)

现在…我们说到哪了?

上次,我们停止了用 matplotlib 可视化数据。我们还讲述了一些介绍性的材料,探索了表层的数据,并借助可视化开始了更深入的分析。我们注意到有 6 个不同的特征可以分析,但是我们决定把重点放在“步骤上,因为它更容易衡量,也更有趣。

在《迈向幸福》的第 2 部分,我们将从数据科学出发,继续我们的旅程,解决 C 分析和绘图(续)、d 测试和 e 结论。

C.分析和绘图(续)

答看完上一张图表后,我意识到我必须重新采样数据。为什么,你会问吗?还记得我提到过“*start date”*不是一个每日集合,而是每当设备检测到我的运动时创建的吗?这意味着每天测量的步数是不一致的。

以下代码将其重新采样为每日格式:

steps_new = steps_new.resample('D').sum()steps_new.head()

现在,如果我们再看,我们可以看到这是一个日常视图。这确保了我们每天都有一致性,以做出公平、公正的比较和更准确的绘图。

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

figure 1

我还想检查是否有重复的数据。接近 40,000 步对我来说似乎有点可疑…

steps.sourceName.unique()

测绘

让我们再画一次。

steps_new.plot()
plt.title(‘How Many Steps Has Stephen Taken?’)
plt.ylabel(‘Steps’)
plt.xlabel(‘Date’)
plt.figure(figsize=(12,8))

我擅自改变了风格。我是 fivethirtyeight 的忠实粉丝,他们在 matplotlib 中有一种风格可以选择。注意我之前的图和这张图在风格上的不同:

plt.style.use(‘fivethirtyeight’)

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

figure 2

图 2 是我所有数据的图表。只做 2018 年的怎么样?

steps_new[‘2018’][‘value’].plot()

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

figure 3

将数据分成 2018 年和 2019 年有助于我理解数据中的峰值。我能够“放大”数据集的特定部分。例如,在 2018 年的 10 月和 11 月,天气很好,所以我花了更多的时间在外面做运动,比如慢跑和散步。

我怀疑假期在年底占据了我的大部分时间,这意味着我锻炼得更少了,也不太“灵活”。至于 8 月之前的数据,我在 8 月购买了 iPhone,因此没有该月之前的数据。

2019 年至今怎么样?

steps_new[‘2019’][‘value’].plot()

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

figure 4

更多分析

对于 2019 年,我在 2 月底和 3 月初之间旅行,所以作为一名游客,我走了很多路,并反映在图表中!查看之前日期的天气信息并将其映射到我的步骤会很有趣(这需要一点工作,因为我必须获取每个位置和日期的天气数据…所以可能在不久的将来当我感觉更有效率时:P)。

通常,有三种类型的时间序列结构:单变量、外部回归和多变量。在我们的例子中,它是单变量的,因为我们有一个带时间戳的数字向量,我们的预测模型将基于历史数据,以查看我采取了多少步骤。我们正在处理时间戳/索引和有序的单变量数据,因此我们可以应用时间序列模型进行预测,因为它有特定的顺序。

时间序列分析

既然我们已经确定我们的数据集适合于时间序列分析,我们需要确定一些特征。这四个特征有助于我们在建模之前确定使用哪个模型以及执行哪些步骤。

季节性:如果我在夏季看到同样的高峰,而在冬季看到较低的活动,我敢说存在季节性,但鉴于我只有> 1 年的数据,我想假定事实并非如此。从逻辑上讲,我会在春天和夏天多走路是有道理的…

趋势:我看不出有什么趋势。线图中没有真正的向上或向下移动。这意味着我们有一个恒定的平均值,这是缺乏趋势的结果,而不是水平的变化。

**可变性:**是与均值的偏差,数据集中没有一致性。如果我们拆分数据集,您可以说 2019 年低约为 5,000,高约为 20,000,2018 年低约为 0,高约为 25,000。

**平均值:**平均值似乎在 10,000 步左右,我们将在应用平滑器时对此进行更多探索。

D.测试

一旦我们深入研究了特征,我们需要看看时间序列统计:自相关(ACF 和 PACF 图)和平稳性(增强的 Dickey-Fuller 测试)。为了分析这些统计数据,我们将进行一些测试。

平稳性

现在,我们将执行扩展的 Dickey-Fuller 测试来测试平稳性。记住,平稳性回答了这个问题:**数据在整个时间序列中具有相同的统计特性吗?方差,均值,自相关?**ADF(单位根测试之一,还有其他几个)非常强大,因为它消除了自相关并测试平稳性。

让我们进行测试:

# Test for Stationarity
def stationarity_test(timeseries):
    """"Augmented Dickey-Fuller Test
    Test for Stationarity"""
    from statsmodels.tsa.stattools import adfuller
    print("Results of Dickey-Fuller Test:")
    df_test = adfuller(timeseries, autolag = "AIC")
    df_output = pd.Series(df_test[0:4],
                          index = ["Test Statistic", "p-value", "#Lags Used",
                                   "Number of Observations Used"])
    print(df_output)

分析结果。如果 p < 0.05,则静止。测试统计、p 值、使用的滞后=过去多长时间

stationarity_test(steps_new)

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

figure 5

p 值确实小于 0.05,因此我们的数据集是稳定的。

自相关

自相关回答了这样一个问题:早期的观察会影响后期的观察吗?为了验证这一点,我们使用了 ACF 和 PACF 图。

ACF 和 PACF

ACF 显示滞后之间的自相关。PACF 对所有早期的滞后进行了调整,因此,我们看到了两个图表之间的差异。蓝色区域是置信水平界限。CI 外的标记暗示自相关。95%的信心。

# Classic ACF and PACF Plots for Autocorrelation
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf# Autocorrelation and partical autocorrelation in the Steps dataset
# Two plots on one sheet
%matplotlib inline
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = plot_acf(steps_new, lags=20, ax=ax1)
ax2 = fig.add_subplot(212)
fig = plot_pacf(steps_new, lags=20, ax=ax2)

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

figure 6

没有多少数据集在突出显示的蓝色区域之外。这很好。

预言;预测;预告

我应用平滑器来消除数据中的一些巨大尖峰,这是预测之前的。请注意,数据集现在变得更加“平坦”:

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

figure 7

我们将使用自回归综合移动平均模型进行预测。我邀请您在此了解更多信息:

https://machine learning mastery . com/ARIMA-for-time-series-forecasting-with-python/

python 包“statsmodel”使我们很容易使用它,但你仍然必须知道如何正确选择参数。对于我们的数据集,我们将研究两种不同的 ARIMA 模型,并对它们进行比较。ARIMA 模型为您提供了模型诊断和预测功能。

以下是我的模型的诊断:

# ARIMA Model Setup
from statsmodels.tsa.arima_model import ARIMA
# Model Diagnostics
results_AR.summary()

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

figure 8

AIC 和 BIC 都是模式选择和比较的标准。点击此处阅读更多内容:

[## AIC 对 BIC

我经常用 AIC 和 BIC 这样的合适标准来选择模特。我知道他们试图平衡良好的契合度与…

www.methodology.psu.edu](https://www.methodology.psu.edu/resources/aic-vs-bic/)

因为我们的数据是每月一次,所以我们来预测未来 5 个月的情况:

# ARIMA forecasts
# Setting up
model_AR4 = ARIMA(steps_new, order=(4, 0, 0)) 
results_AR4 = model_AR4.fit()# model 1
Fcast400 = results_AR4.predict(start = ‘08/19/2018’,
 end = ‘08/19/2019’)# setup 2
# Arima(2,0,2) model and its fitted values
model303 = ARIMA(steps_new, order=(3, 0, 3)) 
results_M303 = model303.fit()# model 2
Fcast303 = results_M303.predict(start = ‘08/19/2018’,
 end = ‘08/19/2019’)

形象化

# Comparing the forecasts via data visualization
plt.figure(figsize = (12, 8))
plt.plot(steps_new, linewidth = 2, label = “original”)
plt.plot(Fcast400, color=’red’, linewidth = 2,
 label = “ARIMA 4 0 0”)
plt.plot(Fcast202, color=’blue’, linewidth = 2,
 label = “ARIMA 3 0 3”)
plt.legend()

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

figure 9

这两个模型的预测似乎都表明,在接下来的 5 个月里,我将徘徊在 10,000 步以上。现实是,数据会更加不稳定,但我很高兴看到我在现实生活中有多接近/远。

E.结论

你可能会说,好吧,那又怎么样?通读这些很酷(或者不是!哈哈),但这怎么是迈向幸福的一步呢?

幸福是每个人个人的、持续的追求,我只分析了幸福的几个组成部分中的一个特征。在这个练习中,我的希望是在我的锻炼计划中增加目标,让自己负起责任。然而,我希望我能把我自己放在一些不同的衡量标准中,以看到进步、持续的健康和繁荣。

我认识到它的局限性,但我并不打算概括说幸福仅仅是由锻炼组成的,更不用说采取措施了。心理健康、财务健康、社会福祉、精神繁荣、营养等等都是等式的一部分。除了运动之外,还应该考虑冥想、睡眠、正念等活动。

我对这个过程做了很多改进。例如,我可以将我过去的数据与天气进行映射,并在那里看到相关性。这可能有点棘手,因为我还必须考虑每个日期戳的位置。

量化情绪、压力等无形因素,以及饮食(热量摄入、宏指令)、水摄入和睡眠时间等有形因素,也可以影响和补充预测。我提到的一些数据源现在很容易获得,但仍然是分散的,还没有找到一个设备来捕获所有这些数据。构建一个全面的、可定制的仪表板也会很有趣。

使用大数据和利用云计算来获得更多宏观分析也是非常有趣的。除了个性化体验,看到总体趋势将是有益的。

这让我不得不说…谢谢你阅读,我邀请你自己尝试这段代码!需要考虑的一些警告是:

位置和生活方式:这两个因素的数据会有所不同。有些人走路多,而有些人开车多。一个简单的例子是纽约对洛杉矶。通勤模式不同,这只是一个方面。

设备:我用的是 iPhone,但 Fitbit、Apple Watch、Garmin 和其他设备追踪的指标更全面。

追寻艾的足迹

原文:https://towardsdatascience.com/tracing-the-footsteps-of-ai-part-2-the-modern-history-d0d5fb586fd0?source=collection_archive---------25-----------------------

现代人工智能的旅程,从小说到科学

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

Photo by Tim Swaan on Unsplash

人工智能在我们的想象中已经存在了很长时间。机器人是潘多拉等古希腊神话的核心。犹太文化中有这些神秘的魔像。令人惊叹的卡拉库里娃娃在日本传统中占有重要地位。

在 17 世纪,一些哲学家认为应该把思想放入物质中。他们提出了各种理论。勒内·笛卡尔相信精神和身体的二元论。他的观点否定了智能机械化的可能性。

莱布尼茨有不同的观点。他认为人类所有的思想都可以用几个基本符号进行数学表达。为此,他提出了逻辑字母表的特征普遍性。

从不记得的时代起,人工智能和机器人就出现在小说中。说到几个,一个实验室制造的生物是玛丽·雪莱的弗兰肯斯坦的核心。 R.U.R. (Rossum 的万能机器人)于 1921 年首映,将“机器人”一词引入文学。

这为 AI 奠定了哲学基础。现在,让我们谈谈使人工智能发生的具体科学工作。这样具体的历史来自“新”时代。这个领域是在 1956 年才建立的。著名的图灵测试是在 1950 年提出的。说到这里,让我们开始吧。

该设置

与人工智能相关的科学工作在 20 世纪 50 年代和 60 年代突然兴起。这是由一些先前的作品建立起来的。伯特兰·罗素和阿尔弗雷德·诺斯·怀特海于 1913 年出版了《数学原理》**。大约同一时间,乔治·布尔提出了他的 思想法则 这些奠定了数理逻辑的基础。

真正的交易始于一个 15 岁的离家出走的男孩冲进鲁道夫·卡尔纳普的办公室。卡尔纳普已经是一位有影响力的哲学家了。那时,他在芝加哥大学教书。他曾出版过 语言的逻辑句法。这个男孩未经允许就进来指出了这篇作品中的错误。鲁道夫肃然起敬。这个男孩很特别。他甚至没等介绍自己。经过几个月的寻找,鲁道夫终于找到了那个在大学里游荡的无家可归的男孩。

小沃尔特·哈里·皮茨是他的名字。三年前,他起草了一封给伯特兰·罗素的信(是的,当时他 12 岁)。他指出了上述原则中的问题。拉塞尔印象深刻,邀请皮茨去读研究生。但那时,他正在英国剑桥大学教书。沃尔特住在美国的底特律。

所以当罗素加入芝加哥大学时,我们的孩子做了决定,来加入他。他没有在那里注册为学生。即便如此,沃尔特还是获得了认可。很快,他参加了大学的讲座。

沃尔特的生活非常有趣。我会再写一篇文章来讨论这个问题,这样我们就不会离题太远了。

回到船上,1942 年,沃尔特·皮茨遇到了沃伦·麦卡洛克。麦卡洛克邀请皮茨去他家做客。他们相信莱布尼茨的理论允许所有人类思想的机械化。因此,他们试图为人类神经系统的神经科学构建一个模型。他们在 1943 年发表了关于这个问题的开创性论文。他们将它命名为 “神经活动中内在思想的逻辑演算。这篇论文是对人工智能领域的无价贡献。他们提出了一个简单的模型,称为麦卡洛克-皮茨神经元。它仍然在每个机器学习课程中讲授。他们提出的想法是今天几乎所有先进人工智能的基础。

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

Warren McCulloch (L) and Water Pitts ®. Image credits: https://www.timetoast.com/timelines/iinteligencia-artificial

诺贝特·韦纳的控制论和克劳德·香农的信息论出现在 1948 年。控制论是对“动物和机器中的控制和交流”的研究信息论是对信息的“量化、存储和交流”的研究。都影响了人工智能领域。

控制论提供了对生物和机械智能的直接研究。这个概念在未来被证明是无价的。信息论提供了基本的数学。

此后不久,艾伦·图灵于 1950 年提出了 T2 图灵测试。他描述了一种确定机器是否“智能”的方法简而言之,图灵测试是这样的:一个人同时与另一个人和一台机器对话。这个人必须识别出这两者中的哪一个是机器。如果人做不到这一点,机器就会通过“模仿游戏”。尽管图灵测试在现代系统中的应用范围太窄,但它在当时是一个重要的时刻。艾伦·图灵的名字使得这篇论文,以及这个领域更受欢迎。

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

The Turing Test. Image credits: wikipedia commons

1956 年,达特茅斯举办了一次会议。它的主要座右铭是探索智能化的概念。这些参与者后来成为人工智能领域最著名的人物。其中最重要的是马文·明斯基,他在 1951 年建造了第一台神经网络机器 SNARC。在接下来的几十年里,他将成为人工智能世界中最著名的名字。

克劳德·香农也出席了会议。未来的诺奖得主司马贺艾伦·纽厄尔亮相他们的逻辑理论家它将继续解决罗素的《数学原理》中前 52 个定理中的 38 个。

约翰·麦卡锡也是人工智能的先驱之一,他提出了“人工智能”这个名字与会者表示同意。这就是人工智能的诞生。

河流,当它流动时(1956-1974)

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

Photo by Jon Flobrant on Unsplash

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

Semantic Net. Image credits: wikipedia commons

由于这次会议,人们对人工智能的兴趣增加了。有许多创新。纽维尔和西蒙在 1959 年创造了一个“通用问题解决程序”。理论上,它可以解决任何形式化的问题。James Slagle 创造了 SAINT(符号自动积分器)来解决大一的微积分问题。这些节目令人印象深刻。

自图灵测试以来,自然语言是人工智能的一个重要领域。丹尼尔·鲍勃罗的项目学生能够解决高中的文字问题。语义网的概念很快就出现了。它是不同概念以及它们之间关系的映射(如图)。几个成功的项目就是建立在这个基础上的。约瑟夫·韦森鲍姆在 1966 年创造了伊莱扎。它能够与人类进行真实的对话。

***人工智能领域发生了这么多事情,研究人员有点太兴奋了,提出了这样的说法:
*——Newell 和 Simon,1958:“10 年内,数字计算机将成为国际象棋世界冠军”。并且,“在 10 年内,数字计算机将会发现并证明一个重要的新数学定理。”
——h . a .西蒙,1965: “在 20 年内,机器将能够做任何人能做的工作。”
——明斯基,1967: “在一代人之内……创造‘人工智能’的问题将得到实质性的解决。”
——明斯基,1970: “三到八年内,我们将拥有一台具有普通人一般智力的机器。”

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

credits: gfycat.com

因此,该领域获得了大量资金。高级研究计划局(ARPA,后更名为 DARPA)向麻省理工学院的团队拨款 220 万美元。当时的 DARPA 主席决定他们应该“资助人,而不是项目!”发展了一种自由的研究文化。这使得研究人员可以从事他们认为正确的任何项目。

瀑布,当它落下时(1974-1980)

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

Photo by Štefan Štefančík on Unsplash

1969 年,马文·明斯基和西蒙·派珀特出版了他们的书,书名为它强调了感知器的优势和劣势(神经网络的单体)。****

然而,他们的批评对联结主义领域来说是致命的。他们强调了感知器无法操作基本的异或电路。

因此,象征性人工智能的替代方法出现了爆炸性增长。但是,这种方法没有提供任何显著的结果。在 20 世纪 70 年代,人工智能研究人员显然对人工智能过于乐观。他们承诺的目标还没有实现,还有很长的路要走。

研究人员意识到他们有基本的限制。有计算上的限制。人工智能被应用于简单的问题。但是现实生活中的场景对系统来说太复杂了。这些算法要探索的可能性是天文数字。这就导致了组合爆炸的问题。然后,还有一个经典的问题“如何给计算机常识。”这就是常识推理的问题。

这让出资人很失望。人工智能的资金因此消失,研究停滞不前。由于法律修订,DARPA 不再允许黑客文化的研究。捐款人对人工智能领域变得冷淡。从 1974 年到 1980 年这段时间被称为“艾冬”。

复兴(1980 年至 1987 年)

日本政府在 1981 年对人工智能研究采取了强硬立场。它为其“第五代计算机项目拨款 8.5 亿美元。它以人工智能为中心。设想中的计算机可以交谈,翻译语言,解释图片,并表达类似人类的推理。

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

The WABOT-2. Credits: https://robots.ieee.org/robots/wabot/

日本的研究很有前途。1980 年,早稻田大学开发出机器人 WABOT-2 。它可以和人类交流。它还可以阅读乐谱和演奏电子琴。日本的成功促使其他政府和机构重新审视人工智能领域。

与此同时,联结主义领域重新出现。1982 年,Hopfield 给出了一种可以学习和处理信息的新型神经网络。杰弗里·辛顿和大卫·鲁梅尔哈特推广了反向模式自动差速器。这种技术是非凡的,至今仍是机器学习的关键。

与此同时,人工智能以“专家系统”的形式获得了商业上的成功。这些系统对特定主题有深入的了解。CMU 的人们在 1980 年建立了一个名为 XCON 的专家系统。它在数字设备公司使用。到 1986 年,它每年为公司节省 4000 万美元。

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

The PC revolution. Image credits: Seattle Business Journal, October 1981

不幸的是,第二个艾冬季(1987-1993)

在 20 世纪 80 年代末,另一场革命掩盖了人工智能领域的成功和发展。苹果和 IBM 同时生产越来越强大的电脑。个人电脑革命开始了。台式电脑比基于人工智能的 Lisp 机器更便宜,功能更强大。价值 5 亿美元的整个产业在一夜之间被摧毁。事实证明,人工智能在 XCON 机器等专家系统上的成功过于昂贵,难以维持。

专家系统出现了几个问题。他们无法学习。他们是“脆弱的”(也就是说,当给他们不寻常的输入时,他们可能会犯奇怪的错误)。他们成为几年前发现的问题的牺牲品。例如,这包括资格问题。专家系统的实用范围变得有限。

DARPA 的新领导层决定,人工智能不是“下一波”。他们将资金投向那些似乎更有可能产生立竿见影效果的项目。

1991 年,日本第五代计算机项目的目标没有实现。研究人员再次低估了他们的困难。

到 1993 年底,已有 300 多家人工智能公司关闭、破产或被收购。这有效地结束了 AI 的第一次商业浪潮。

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

Photo by Mervyn Chan on Unsplash

流动

个人电脑革命的迷雾开始消退。现在有了更多的计算能力。此外,随着个人电脑开始变得普遍,大型数据集变得可用。这些都有助于人工智能的发展。

我们正在解决之前强调的一些问题,打破限制我们的东西。随着计算能力的增强,我们正在挑战可能的极限。有了大型数据集,我们能够提取越来越多的知识。实用的人工智能算法开始变得有意义。

一种被称为“智能代理”的新范式在 20 世纪 90 年代被接受。智能代理是一个感知其环境并采取行动以最大化其成功机会的系统。人们希望有一天我们能够让这些智能代理相互交流。这将给我们带来更多功能和智能的系统。

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

Credits: Peter Morgan/Reuters

人工智能社区对在人工智能中使用数学有不同的看法。“scruffies”认为智力太复杂,不适合数学。他们认为我们人类很少在决策中使用逻辑。另一方面,“neats”认为用逻辑寻找最佳解决方案是未来的方向。

更新、更热门的人工智能版本使用了复杂的数学工具。这些数学算法获得了广泛的成功。Russell 和 Norvig (2003)因此称之为“neats 的胜利”

很快在 1997 年,IBM 的超级计算机“深蓝”打败了加里·卡斯帕罗夫。他是当时的世界冠军。纽维尔和西蒙所说的 1968 年将会发生的事情最终在 1997 年发生了。

今天下棋的计算机比任何人类棋手都强得多。人类达到的最高 Elo 评级是 2882。计算机引擎(即使是那些可以在你的电脑上运行的引擎)达到 3000 Elo 额定值是正常的。历史最高值超过了 3350 点。

2005 年,斯坦福大学开发了一种自动驾驶机器人。它赢得了 DARPA 大挑战。它沿着一条未经训练的沙漠小道行驶了 131 英里。

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

Image credits: https://www.wired.com/wp-content/uploads/blogs/geekdad/wp-content/uploads/2011/02/jeopardy-watson.jpg

2011 年 2 月,IBM 决定在“危险边缘”智力竞赛节目中测试其 IBM Watson。它以显著优势击败了两位最伟大的危险冠军。

随着互联网的发展和社交媒体的出现,数据量激增。科技公司需要对这些数据进行智能操作。因此,人工智能的应用成为一种必然。现在,谷歌使用机器学习对结果进行排序。YouTube 推荐使用 ML 算法的视频。亚马逊推荐你带 ML 的产品。脸书的新闻提要是 ML 生成的。事实上,Tinder 使用 ML 算法为你找到匹配。

随着这场人工智能的迷你革命,这项技术已经站稳了脚跟。它实际上是不可替代的。人工智能领域只需要展望超级机器的未来。尽管人工智能进步的影响仍有争议,但一场全面的人工智能革命是不可避免的。

用 tensornets 在 tensorflow python 中实现 YOLOv3

原文:https://towardsdatascience.com/track-vehicles-and-people-using-yolov3-and-tensorflow-4f3d0e5b1b5f?source=collection_archive---------12-----------------------

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

Spectacular architecture and a splendid view! source:https://pixabay.com/en/architecture-buildings-cars-city-1837176/

从对象检测到生成对抗网络 (GAN),深度学习显示了它的威力。物体检测从很好的老式人工设计的特征检测器发展到现在的基于深度学习的卷积神经网络(CNN)物体检测器,如 R-CNN、 YOLO 。使用 CNN 的检测通过预测对象的边界框坐标来近似图像中对象的位置,而分割通过预测图像中对象的边界来更进一步。在本文中,我们将逐步运行一个车辆检测网络,使用在 MS-COCO 数据集上训练的 YOLOv3,该网络可以检测大约 90 种不同类别的对象。有了这个网络,我们将能够检测和跟踪汽车,公共汽车,卡车,自行车,人和更多!要找到更多有趣的人工智能文章,请点击这里。

1。了解张量网

下载 YOLOv3 的暗网权重并让它在 tensorflow 上运行是一项相当繁琐的任务。但是我们两分钟后也要做同样的事情!你怎么问?

嗯,李泰勋先生将各种流行网络的权重转换成 tensorflow 的格式,并发布了一个名为“Tensornets”的 PyPi 库。Tensornets 使迁移学习和运行推理成为可能,只需“10 行”直观代码。

查看他的 Github 页面:https://github.com/taehoonlee/tensornets

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

Some of the models available in tensornets

2。装载 YOLO

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

You Only Look Once source:https://pixabay.com/photos/yolo-sparklers-new-year-1758212/

YOLOv3 是 YOLOv2 的改进版本,具有更高的精确度和地图得分,这也是我们选择 v3 而不是 v2 的主要原因。

让我们开始吧。

首先,我们需要安装“tensornets”库,使用方便的“PIP”命令可以很容易地做到这一点。“pip install tensornets”就可以了,但是你也可以从 GitHub 上下载来安装。在开始使用代码之前,请确保安装了 Tensorflow。

启动您最喜欢的 IDE 并导入 tensorflow 和 tensornets。除此之外,我们还需要 OpenCV 和 numpy 来帮助导入图像和视频。我们使用“时间”来监控网络处理一帧所需的时间。

import tensorflow as tf
import tensornets as nets
import cv2
import numpy as np
import time

一旦我们导入了必要的库,我们继续为网络和模型本身创建输入占位符。

inputs = tf.placeholder(tf.float32, [None, 416, 416, 3]) 
model = nets.YOLOv3COCO(inputs, nets.Darknet19)

两行完成了加载权重和图形的繁重任务,“就两行”。

3。运行推断

现在是时候创建一个 tensorflow 会话并对视频进行推理了。下面几行定义了我们要跟踪的对象的类别和它们的 MS-COCO 索引。

classes={'0':'person','1':'bicycle','2':'car','3':'bike','5':'bus','7':'truck'}
list_of_classes=[0,1,2,3,5,7]#to display other detected #objects,change the classes and list of classes to their respective #COCO indices available in their website. Here 0th index is for #people and 1 for bicycle and so on. If you want to detect all the #classes, add the indices to this listwith tf.Session() as sess:
    sess.run(model.pretrained())

    cap = cv2.VideoCapture("D://pyworks//yolo//videoplayback.mp4")
    #change the path to your directory or to '0' for webcam
    while(cap.isOpened()):
        ret, frame = cap.read()
        img=cv2.resize(frame,(416,416))
        imge=np.array(img).reshape(-1,416,416,3)
        start_time=time.time()
        preds = sess.run(model.preds, {inputs: model.preprocess(imge)})

4。结果

继续前进。一旦视频帧被传送到网络,它就会返回边界框并将其封装在“preds”对象中。现在,我们可以从“preds”对象中获取检测到的类及其坐标。

print("--- %s seconds ---" % (time.time() - start_time)) #to time it
        boxes = model.get_boxes(preds, imge.shape[1:3])
        cv2.namedWindow('image',cv2.WINDOW_NORMAL)cv2.resizeWindow('image', 700,700)

        boxes1=np.array(boxes)
        for j in list_of_classes: #iterate over classes
            count =0
            if str(j) in classes:
                lab=classes[str(j)]
            if len(boxes1) !=0:
#iterate over detected vehicles
                for i in range(len(boxes1[j])): 
                    box=boxes1[j][i] 
                    #setting confidence threshold as 40%
                    if boxes1[j][i][4]>=.40: 
                        count += 1    

                        cv2.rectangle(img,(box[0],box[1]),(box[2],box[3]),(0,255,0),3)
                        cv2.putText(img, lab, (box[0],box[1]), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), lineType=cv2.LINE_AA)
            print(lab,": ",count)

        #Display the output      
        cv2.imshow("image",img)  
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

这将在一个新窗口中显示带有名称标签的被跟踪车辆!

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

Et voila!

就是这么做的!

YOLOv3 在英伟达 GTX 1060 6GB 上运行时的速度约为 12 fps,在英伟达 Titan 上可以达到 30 fps。随着功能强大的边缘计算设备的兴起, YOLO 可能会取代 Mobilenet 和其他不如 YOLO 精确的紧凑型物体探测网络。卷积网络可以做的不仅仅是物体检测。语义分割、图像生成、实例分割和更多

跳转到这里深入研究 YOLO 文件,并了解其优雅的架构和工作。

解读 YOLO 文件的实质细节

机器学习无疑正在改变数字世界的面貌。而且几乎每个行业都会很快受到 AI 的冲击。

为了更深入地探索人工智能,请进入 HackerStreak

在 GitHub 上找到完整的代码https://GitHub . com/baakcshu/Vehicle-and-people-tracking-with-yolov 3-

有什么问题吗?向我开枪。

## 在 Linkedin 上找到我

原载于https://hackerstreak.com

使用 MLflow 跟踪 ML 实验

原文:https://towardsdatascience.com/tracking-ml-experiments-using-mlflow-7910197091bb?source=collection_archive---------5-----------------------

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

Photo by Elevate on Unsplash

演示 MLflow 如何改善您的 ML 建模体验

简介

如果你熟悉构建机器学习模型,无论是在工作中还是作为一种爱好;您可能遇到过这样的情况,您构建了大量不同的模型,具有不同的代码库,并且当您优化代码和调整模型以提升准确性时,需要跟踪大量的图表或笔记本和指标。

你并不孤单。【1】

我认为,这些年来,随着我在数据科学领域的实践,我遇到了很多人们倾向于处理这个问题的方法。我的 go to 方法通常是一个 excel 表。它易于使用,易于可视化,易于传达给外部各方。

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

Tracking experiments on a spreadsheet

我也见过有人试图以编程方式将指标存储在数据库表中。但是这些可能会变得非常混乱(不是说 excel 表格本身不混乱,但是如果我需要运行一些命令来添加一个新的指标——我会说从长远来看这是不可持续的

一旦有多人在研究同一个机器学习问题,事情就会变得更加棘手。一些基本规则需要在项目执行前设定,否则跟踪将变得很麻烦。成熟的人工智能团队很可能已经解决了这个问题,但我想象早期阶段的初创公司在处理这种协调工作时会有一些问题(如果他们能够负担得起让多个数据科学家从事同一件事情)。

这是一个如此大的问题,以至于催生了一些致力于解决这个特殊问题的公司。我知道的一些例子是:

  1. 海王星 ML:https://neptune.ml/

2.权重和偏差:https://www.wandb.com/

3.彗星 ML:https://www.comet.ml/

为了简洁起见,我将不涉及它们实际上有什么特性,它们是如何工作的,也不涉及它们的定价模型。一些更侧重于基于深度学习的实验,而另一些则覆盖更广的范围。我在这里想强调的一点是,这个问题已经大到人们实际上为了某种解决方案而付钱给其他人。

值得一提的是 TensorBoard,但它似乎是明确针对 Tensorflow 和深度学习的(我本人不是一个重度 TensorBoard 用户,请在评论部分与我分享你所知道的内容,以便让大家受益)。

MLflow

另一个选择是 MLflow。由 Databricks 开始,它基本上是一个用于整个机器学习生命周期的开源平台 (一字不差地摘自他们的网站)。

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

What they mean by covering the entire ML lifecycle [2]

这就把我们带到了本文的焦点——跟踪指标。

我的 MLflow 环境

在我目前的工作场所,我们最常用的工具之一是数据块。最近几个月,他们增加了 MLflow 功能。作为一个渴望学习如何更好地跟踪事物的人,这是一个尝试的绝佳机会。我的 MLflow 跟踪演练的上下文将基于此(也就是 Databricks 用户)。

对于非 Databricks 用户,MLflow 可以单独设置并连接到您的环境。应该存在相同的功能。查看他们的文档了解更多细节。

实验

为了展示我目前如何在工作中使用 MLflow,以及为什么我觉得它很有用,我将在 Kaggle 内核[3]上使用它,作者使用加密货币数据集进行了一些数据分析和预测实验。一些小的改动把从[3]中取出的原始代码变成了数据块(主要是为了能够可视化图形),但本质上是一样的。

注:最近刚开始用 MLflow,很有可能会漏掉一些东西。

我在这篇文章中使用的笔记本可以参考这里的。笔记本有两个版本可用—*“*前的“T11”表示最初移植到 Databricks 的 Kaggle 内核,而“后的“T13”包含用于跟踪的附加代码。

要用 MLflow 开始一个实验,首先需要使用mlflow.set_experiment命令,然后是实验文件的存储路径。

接下来,你可以开始思考在你的分析/实验中,你想要跟踪什么。MLflow 将这些分为 3 个主要类别:

  1. 参数(通过mlflow.log_param())。参数是您在调整模型时更改或调整的变量。
  2. 度量标准(使用mlflow.log_metric())。度量是调整参数后想要测量的值。被跟踪的典型指标可以是 F1 分数、RMSE、MAE 等项目。
  3. 工件(使用mlflow.log_artifact())。工件是您希望存储的任何其他项目。我跟踪的典型工件是 png 图,即特性重要性变量列表。有时我也存储模型(腌 scikit 学习模型)。(更新:我突然想到,你也可以保存你正在使用的原始/转换/训练/测试/验证数据集。多酷啊。)

MLflow 跟踪是围绕运行的概念组织的,这些运行是某段数据科学代码【4】的执行。(接下来,我们将使用斜体 **run** )来表示这个 run 概念)

在每一次运行中可以跟踪的其他事情是代码版本、开始和结束时间以及源文件。参考文件了解更多细节。

跟踪参数和指标

在笔记本的第 37 单元中,作者试图反复探索不同的参数组合,以获得最适合我们数据的 ARIMA 模型。让我们使用这部分代码,并跟踪正在使用的参数和正在生成的指标。

为了开始我们的运行,我们使用mlflow.start_run().,然后将qsps参数以及model.aic度量记录到 MLFlow。运行以上代码将在 MLFLow UI 中使用以下结果。

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

Each row of result is generated for each run.

如果我们要点击进入其中一个运行,我们将进入以下窗口。

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

Detailed page for each MLflow run

从上面可以看出,我们只跟踪了每次运行的有限数量的参数和指标。既没有被记录的艺术品也没有标签。如果有的话,我们可以选择添加我们自己的注释。记录的其他内容包括日期、用户(在我的例子中是我的数据块 ID)、运行 ID、持续时间和源。

运行被提交给 Git

我发现后者非常有用,因为它实际上将正在运行的笔记本提交到 Git 中。我目前不确定这如何转化为 MLflow 的自设置版本,但在我的情况下,单击 source 链接会将我带回到 Databricks 中的笔记本提交版本(如下)。

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

Opening the Revision History reveals that this notebook was committed by MLFlow (ie. “Taken by MLflow”)

现在让我们试试别的。

存储图和其他文件

按照前面的例子,我们构建了多个模型,以确定我们应该用于 ARIMA 模型的最佳参数。在我们的下一个例子中,我们将存储一些与模型相关的工件;即模型概要和一些情节。

让我们为我们的 SARIMAX 模型这样做。

从上面的代码中可以看出,登录工件需要比平常多一点的工作。该文件不能直接将图保存到 MLflow 中,而是必须先存储在某个地方,然后才能发送到 MLflow 的 S3 存储桶中。

在我的例子中,文件首先保存到本地 Databricks 集群,然后复制到 MLflow 的 S3 存储桶(在本例中也在 Databricks 内)。或者,也可以为每个实验定义一个外部 S3 存储桶,并将所有相关文件存储在那里。)

作为参考,下面是存储的工件在 UI 中的显示方式。

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

Artifact 1

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

Artifact 2

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

Artifact 3

对我来说,这相当简化和标准化了通常只存储在笔记本上的情节和摘要的集合。虽然让它们存在于 notebook 中是可以的,但是 notebook 可以按单元运行,而不是从上到下完整运行,这意味着某些图实际上可以作为很晚才发生的操作的结果而生成(或者在开发过程中可以完全删除)。由于存储在 MLflow 中的图与 Git 中提交的代码相关联,我们现在有了一种更好的方法来确保实验及其结果以可重复的方式被记录。

保存模型

MLflow 还允许您保存正在训练的模型。这可以通过将其作为工件登录到 MLflow(通过[log_model](https://www.mlflow.org/docs/latest/python_api/mlflow.sklearn.html#mlflow.sklearn.log_model)())或者直接登录到本地文件系统(通过[save_model](https://www.mlflow.org/docs/latest/python_api/mlflow.sklearn.html#mlflow.sklearn.save_model))来完成。

回溯测试

我最喜欢的 MLflow 特性之一是它的指标可视化。为了更好地突出这一点,我将使用内核的最后一部分[3],并对其进行修改,以便在部署运行一段时间(即滑动窗口验证)。

在上面的例子中,我们建立了一个 3 个月的时间窗口,并在 10 个滑动窗口的时间段内评估模型的 RMSE 得分,其中每个向前移动是 1 个月。每次评估时,我们还会将比较图记录到 MLflow 中,以备将来参考和验证。

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

Plot are captured across multiple sliding window

深入研究 RMSE 指标,我们可以看到它在 10 个时间步长内的表现。我们可以看到,该模型通常在一段时间内是稳定的,直到在第 5 次迭代时达到峰值。如果我们回头参考上图中比特币价格的波动性,这是相当令人期待的。

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

Performance of the SARIMA model over time

摘要

在这篇文章的过程中,我谈到了每个机器学习实践者都面临的问题——如何整齐地组织和跟踪多个建模实验结果。

MLflow 是实现这一目标的众多工具之一。在本文中,我通过运行几个例子强调了它的几个特性,这些例子说明了如何在日常建模工作中使用它来帮助数据科学从业者。

从短期来看,良好管理的结果有助于团队沟通和协作——这对远程团队来说尤其重要。

从长远来看,对建模活动及其可交付成果进行适当的治理有助于保留学到的知识和发现,减少错误,并确保过去的研究和结果可以被其他团队或其替代者复制。

这篇文章中使用的代码可以在我的 github 这里找到。

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

Throw away those ugly spreadsheets you’re currently using. Pretty sure it’s not making you happy. (source)

参考

  1. https://medium . com/@ u39kun/managing-your-machine-learning-experiments-and-make-repeatable-in-tensor flow-py torch-BC 8043099 DBD
  2. https://www . slide share . net/databricks/ml flow-infra structure-for-a-complete-machine-learning-life-cycle
  3. https://www . ka ggle . com/taniaj/cryptocurrency-price-forecasting

4.https://mlflow.org/docs/latest/tracking.html

追踪社交网络的演变

原文:https://towardsdatascience.com/tracking-social-networks-evolution-15313fe53ab3?source=collection_archive---------36-----------------------

一种跟踪社区出生、死亡、合并和分裂的算法

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

在社交网络中,社区无处不在:人们上同一所学校,在同一家公司工作,喜欢同一部电影,去同一家餐馆,等等。为了方便起见,我们认为拥有相似特征、偏好或历史的人属于同一个社区

当社区拥有唯一的 ID 时,很容易跟踪他们的历史。例如,我们确切地知道一个学生什么时候被大学录取,什么时候毕业。这是因为学校名称充当社区的事实上的 ID,并且该 ID 不会改变。

当社区没有 id 时,挑战就出现了。ID 可能会丢失,因为这些现象是自然的。当两只蚂蚁随机选择一个地方开始一个蚁群时,它们不会声明一个唯一的名称,例如切萨皮克湾蚁群,以使数据科学家的工作更容易。有时,邪恶的实体会故意隐藏他们的目的(一群黑客计划摧毁你的服务器)。未能跟踪这些社区可能代价高昂。

当社区没有 ID 时,一个简单的方法是创建一个 ID。我们将第一个社区称为。如果出现另一个社区,我们称之为 B 。我们会一直分配新的 id 直到世界末日!

如果这能解决问题,我就不会写这篇博客了。虽然简单,但它留下了许多未解之谜。当两个社区合并时会发生什么?我们是否应该将合并后的社区视为拥有新 ID 的新社区?一个社区分裂成两个/三个/四个会怎么样?我们需要一种更优雅的方式来处理所有边缘情况。此外,我们应该能够追溯一个社区的历史,看看何时发生合并或分裂,谁是参与者。

所以有一天我在回家的路上想到了这个算法。用英语解释很简单。它优雅到足以解决所有的边缘情况。用大约 80 行 SQL 就可以轻松实现。所以我提出一个简单的名字:核心追踪算法。

直觉

一个图由顶点组成。顶点代表一个实体,在许多情况下,代表一个用户帐户。边表示两个顶点之间的某种连接。例如,如果两个帐户有相同的电话号码,我们可以在它们之间画一条边。

社区检测算法帮助你有效地发现社区。常见的算法有连通分量鲁汶模块化标签传播。这些算法都有很好的文档记录,并有开源的实现。所以这里就不细说了。核心跟踪方法足够通用,可以与任何社区检测算法一起工作。

社区检测算法为每个社区分配一个随机的字符串 ID。当两个人拥有相同的团体 ID 时,你知道他们属于同一个团体,但是 ID 不是持久的。如果您明天再次运行社区检测算法,这两个人将接收到不同的社区 ID,即使他们仍然属于同一个社区。

为了使临时 ID 持久化,我们需要从每个社区中挑选一个 代表顶点 来携带持久 ID。当然,我们希望代表是社区的稳定成员。我们不希望它突然变得与众不同。于是在每个社区中,我把边数(度数)最高的顶点标记为核心,因此得名核心追踪算法。

举例来说,在这个博客中,每个社区都用不同的颜色标记。每个社区的核心由一个带边框的圆圈标记。非核心顶点没有边界。不属于任何社区的顶点被标记为灰色。

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

Community cores have degree 4 (brown), 4 (blue), 5 (pink), 4 (green) respectively

核心跟踪算法

对于每个时间步长,运行以下六个步骤:

  1. 使用您选择的任何算法检测社区。
  2. 从之前的时间步继承核心顶点的社区 ID。这些顶点被称为幸存核心。
  3. 合并现在属于同一团体的任何幸存核心。合并后的社区继承数字上最小的社区 ID。
  4. 幸存核心的团体 ID 传播到属于幸存核心团体的所有顶点。
  5. 解散不再符合有效社区资格的社区。
  6. 发现现在有资格成为有效社区的新社区。分配社区 ID,从曾经使用过的最大的ID 开始递增。**
  7. 为所有有效社区重新分配核心顶点。如有必要,中断联系。
  8. 缓存有史以来最大的社区 ID。

让我们通过一个扩展的例子来剖析这个算法。

时间步长 1:第一次运行

当我们第一次运行算法时,我们不需要做任何特别的事情。步骤 2 不会继承任何核心顶点,因此跳过步骤 2-5(图中未显示)。只有步骤 1、6 和 7 是重要。在下图中,步数标记在每一帧的右下角。

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

时间步长 2:新顶点寄存器

出现一个新顶点,并且没有边将其连接到任何现有顶点。它被独自留下。另一个新的顶点出现,并加入粉红色的社区。

  • 第 0 帧是从先前时间步长的末尾复制的(颜色变灰)。
  • 框架 1 是在注册了两个新帐户之后更新的图表。
  • 第 2 帧继承核心顶点。
  • 第 4 帧传播核心顶点的社区 ID。
  • 算法的第 3,5,6,7 步并不重要。

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

时间步骤 3:顶点离开社区

一个顶点决定离开粉红社区,现在只有两个成员。核心顶点度从三降到二。

  • 帧 0 是从先前时间步长的末尾复制的。
  • 帧 1 是当前图形。顶点离开粉红社区后。
  • 第 2 帧继承核心顶点。
  • 第 4 帧传播核心顶点的社区 ID。
  • 算法的第 3,5,6,7 步并不重要。

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

时间步 4:核心顶点移动

这两个独立的顶点都加入了粉红色社区。

  • 帧 0 是从先前时间步长的末尾复制的。
  • 帧 1 是更新的图形。
  • 第 2 帧继承核心顶点。
  • 第 4 帧传播核心顶点的社区 ID。
  • 第 7 帧为每个社区重新指定核心顶点。粉色社区核心已经更新,现在有 3 级了。
  • 算法的第 3,5,6 步并不重要。

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

时间步骤 5:顶点迁移

一个顶点直接从粉色社区跳到蓝色社区。

  • 帧 0 是从先前时间步长的末尾复制的。
  • 帧 1 是更新的图形。
  • 第 2 帧继承核心顶点。
  • 第 4 帧传播核心顶点的社区 ID。
  • 第 7 帧为每个社区重新指定核心顶点。请注意,两个顶点的度数为 2。 核心可能不可调职。 我们只需要一种一致的方式来打破束缚,例如按账号 ID 的字母顺序,或者按注册日期的升序。
  • 算法的第 3,5,6 步并不重要。

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

时间步骤 6:社区合并

两个社区合并,合并后的社区 继承旧社区的 ID 。因为我们在数字上增加了社区 ID。合并的团体总是继承组成团体中最小的团体 ID。我们假设蓝色社区比较老。

  • 帧 0 是从先前时间步长的末尾复制的。
  • 帧 1 是更新的图形。
  • 第 2 帧继承核心顶点。
  • 帧 3 发现两个幸存的核心属于同一个社区。检测到合并。所以我们忽略了新社区的核心,保留了最老的(这很容易推广到 N 路合并)。
  • 第 4 帧传播核心顶点的社区 ID(现在全部为蓝色)。
  • 算法的第 5,6,7 步并不重要。

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

时间步骤 7:社区分裂

蓝色社区分裂成三个较小的社区和一个独立的顶点。

  • 帧 0 是从先前时间步长的末尾复制的。
  • 帧 1 是四路分割后的更新图。
  • 第 2 帧继承核心顶点。
  • 第 4 帧传播核心顶点的社区 ID。
  • 帧 6 检测到两个新的社区,它们被分配了新的社区 ID 和颜色(以前从未使用过)。
  • 第 7 帧为所有社区重新指定核心顶点。如有必要,中断联系。
  • 算法的第 3 步和第 5 步无关紧要。

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

时间步骤 8:社区解散

两个社区解散了。一般来说,独立的顶点不是有意义的社区。但是这一步让我们有更大的自由来定义什么是社区。例如,我们可以设置最小规模为 5 的社区作为有效社区。

  • 帧 0 是从先前时间步长的末尾复制的。
  • 帧 1 是两个社区解散后的更新图。
  • 第 2 帧继承核心顶点。
  • 第 4 帧传播核心顶点的社区 ID。
  • 帧 5 分解无效社区。
  • 算法的第 3,6,7 步并不重要。

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

算法亮点

社区 id 不仅是持久的,而且是有意义的。较小的身份证号码意味着较老的社区。该特性反映了关系数据库中的自动递增索引。这一点由 step 8 来保证,step 8 花费恒定的内存来跟踪曾经使用过的最大 ID。

在扩展示例中,我使用了 连通分量 算法来检测社区,因为它在视觉上是直截了当的。在实践中,您可以将任何社区检测算法切换到步骤 1。

在扩展的例子中,我使用了中心性 来分配社区核心。有不同的度量中心性的方法:接近度、中间度、调和度、特征向量。您可以将任何社区检测算法切换到步骤 7。**

在极端的情况下,核心可能直接离开社区。在这种情况下,旧社区被解散,剩余的顶点成为一个全新的社区。这显然是不可取的。所以我们需要选择一个中心性度量来最小化一个核心顶点直接离开的概率。

分析洞察力

在运行该算法足够的迭代次数后,无论您使用社区还是个人顶点作为分析单位,它都会产生巨大的洞察力。例如,要研究社区 10 的规模如何随时间演变,一个简单的 SQL 查询就足够了:

要查找用户“shawlu”何时从一个社区切换到另一个社区,以及他在每个社区停留了多少天,可以写:

脚注

最初的实现是 Coupang Global LLC 的专有代码和知识产权。我不能透露。

尽管如此,该算法的每一步都可以被任何一个具有该语言基础知识的人翻译成一个 SQL 查询。

更明智地交易和投资——强化学习方式

原文:https://towardsdatascience.com/trade-smarter-w-reinforcement-learning-a5e91163f315?source=collection_archive---------2-----------------------

深入探究 TensorTrade——使用深度强化学习进行交易和投资的 Python 框架

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

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

赢得高赌注扑克锦标赛击败世界级星际争霸玩家,以及自动驾驶特斯拉的未来跑车。他们都有什么共同点?长期以来,这些极其复杂的任务中的每一项都被认为是机器不可能完成的,直到深度强化学习的最新进展表明它们今天是可能的。

强化学习开始接管世界。

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

Source: https://deepmind.com/blog/article/alphastar-mastering-real-time-strategy-game-starcraft-ii

两个多月前,我决定参加这场革命,于是我开始了一段旅程,利用最先进的深度强化学习算法创建一个有利可图的比特币交易策略。虽然我在这方面取得了相当大的进展,但我意识到这类项目的工具可能会令人望而生畏,因此很容易迷失在细节中。

在优化我之前的分布式高性能计算(HPC)系统项目之间;迷失在无尽的数据和功能优化管道中;围绕高效的模型建立、调整、培训和评估,我忙得团团转;我意识到一定有更好的做事方法。在对现有项目进行了无数小时的研究,花了无数个晚上观看 PyData 会议演讲,并与数百名 RL trading Discord 社区成员进行了多次来回交谈后,我意识到没有任何现有的解决方案是那么好。

互联网上散布着许多零碎的强化学习交易系统,但没有一个是完整的。出于这个原因,我决定创建一个开源的 Python 框架,使用深度强化学习,高效地将任何交易策略从想法变成产品。

输入 TensorTrade。想法是创建一个高度模块化的框架,以一种可组合、可维护的方式构建高效的强化学习交易策略。依我看,这听起来像是一大堆术语,所以让我们进入正题吧。

目录

概述

TensorTrade 组件

未来

概观

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

TensorTrade 是一个开源的 Python 框架,使用深度强化学习来训练、评估和部署稳健的交易策略。该框架的重点是高度可组合和可扩展,以允许系统从单个 CPU 上的简单交易策略扩展到在分布的 HPC 机器上运行的复杂投资策略。

在引擎盖下,该框架使用现有机器学习库中的许多 API 来维护高质量的数据管道和学习模型。TensorTrade 的主要目标之一是通过利用由numpypandasgymkerastensorflow提供的现有工具和管道,实现算法交易策略的快速试验。

框架的每一部分都被分割成可重用的组件,允许您利用社区构建的通用组件,同时保留您的专有特性。目的是使用深度强化学习来简化测试和部署稳健交易代理的过程,让你我专注于创造盈利策略。

RL 底漆

如果你的强化学习技能有点生疏,让我们快速回顾一下基本概念。

强化学习 ( RL )是机器学习的一个领域,涉及软件代理应该如何在一个环境中采取行动,以便最大化一些累积回报的概念。

每个强化学习问题都始于一个环境和一个或多个可以与环境交互的代理。

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

This technique is based off Markov Decision Processes (MDP) dating back to the 1950s.**

代理将首先观察环境,然后建立当前状态的模型以及该环境中动作的期望值。基于该模型,代理将采取它认为具有最高期望值的行动。

基于所选动作在环境中的效果,代理将被奖励与该动作的实际价值相对应的金额。然后,强化学习代理可以通过试错过程(即,通过强化学习)来改进其底层模型,并随着时间的推移学习采取更有益的行动。

如果在这个问题上你还需要一点新鲜的东西,在这篇文章的参考资料中有一篇文章的链接,标题是深度强化学习简介,它更深入地介绍了细节。我们继续吧。

入门指南

下面的教程将提供足够的例子,让你开始使用 TensorTrade 创建简单的交易策略,尽管你会很快发现这个框架能够处理更复杂的配置。

你可以跟随 Google Colab 或者 Github 上的教程。

装置

TensorTrade 需要 Python 3.6 或更高版本,所以在 pip 安装框架之前,请确保您使用的是有效版本。

pip install git+https://github.com/notadamking/tensortrade.git

为了完成整个教程,您需要安装一些额外的依赖项,比如tensorflowtensorforcestable-baselinesccxttastochastic

pip install git+[https://github.com/notadamking/tensortrade.git#egg=tensortrade[tf,tensorforce,baselines,ccxt,ta,fbm](https://github.com/notadamking/tensortrade.git#egg=tensortrade[tf,tensorforce,baselines,ccxt,fbm)] -U

这就是所有必要的安装!让我们进入代码。

TensorTrade 组件

TensorTrade 是围绕模块化组件构建的,这些组件共同构成了交易策略。交易策略以gym环境的形式将强化学习代理与可组合的交易逻辑结合起来。交易环境是由一组模块组成的,这些模块可以混合和匹配,以创建高度多样化的交易和投资策略。稍后我将进一步详细解释这一点,但现在知道一些基本知识就足够了。

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

就像电气组件一样,TensorTrade 组件的目的是能够根据需要混合和匹配它们。

本节中的代码片段应该作为创建新策略和组件的指南。随着更多组件的定义,可能会遗漏一些实现细节,这些细节将在后面的章节中变得更加清晰。

贸易环境

交易环境是遵循 OpenAI 的gym.Env规范的强化学习环境。这允许我们在交易代理中利用许多现有的强化学习模型,如果我们愿意的话。

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

交易环境是完全可配置的gym环境,具有高度可组合的ExchangeFeaturePipelineActionSchemeRewardScheme组件。

  • Exchange提供对环境的观察并执行代理的交易。
  • 在将交换输出传递给代理之前,FeaturePipeline可选地将交换输出转换成一组更有意义的特性。
  • ActionScheme将代理的行为转换成可执行的交易。
  • RewardScheme根据代理的表现计算每个时间步的奖励。

如果说现在看起来有点复杂,其实真的不是。这就是全部内容,现在只需要将这些组件组成一个完整的环境。

TradingEnvironmentreset方法被调用时,所有的子组件也将被重置。每个交换、特性管道、变形金刚、行动方案和奖励方案的内部状态将被设置回默认值,为下一集做好准备。

让我们从一个示例环境开始。如前所述,初始化一个TradingEnvironment需要一个交换,一个行动方案,一个奖励方案,特征流水线是可选的。

**from** tensortrade.environments **import** TradingEnvironmentenvironment = TradingEnvironment(exchange=exchange,
                                 action_scheme=action_scheme,
                                 reward_scheme=reward_scheme,
                                 feature_pipeline=feature_pipeline)

虽然推荐的用例是将交易环境插入到交易策略中,但是很明显,您可以单独使用交易环境,就像使用gym环境一样。

交换

交易所确定交易环境中可交易工具的范围,在每个时间步将观察结果返回给环境,并在该环境中执行交易。有两种类型的交流:现场交流和模拟交流。

实时交易所是由实时定价数据和实时交易执行引擎支持的Exchange的实现。例如,CCXTExchange是一个实时交易所,它能够返回定价数据,并在数百个实时加密货币交易所执行交易,如币安比特币基地

**import** ccxt**from** tensortrade.exchanges.live **import** CCXTExchangecoinbase = ccxt.coinbasepro()exchange = CCXTExchange(exchange=coinbase, base_instrument='USD')

也有股票和 ETF 交易的交易所,如RobinhoodExchangeInteractiveBrokersExchange,但这些仍在进行中。

另一方面,模拟交易所是由模拟定价数据和交易执行支持的Exchange的实现。

例如,FBMExchange是一个模拟的交易所,它使用分数布朗运动(FBM)生成定价和交易量数据。因为它的价格是模拟的,所以它执行的交易也必须模拟。该交易所使用简单的滑点模型来模拟交易的价格和交易量滑点,尽管像 TensorTrade 中的几乎所有东西一样,这个滑点模型可以很容易地被更复杂的东西取代。

**from** tensortrade.exchanges.simulated **import** FBMExchangeexchange = FBMExchange(base_instrument='BTC', timeframe='1h')

虽然FBMExchange使用随机模型生成虚假的价格和交易量数据,但它只是SimulatedExchange的一个实现。在幕后,SimulatedExchange只需要一个价格历史的data_frame来生成它的模拟。这个data_frame既可以由编码实现(如FBMExchange)提供,也可以在运行时提供,如下例所示。

**import** pandas **as** pd**from** tensortrade.exchanges.simulated **import** SimulatedExchangedf = pd.read_csv('./data/btc_ohclv_1h.csv')exchange = SimulatedExchange(data_frame=df, base_instrument='USD')

特征管线

特征管道意味着将来自环境的观察转换成有意义的特征,以便代理从中学习。如果一个管道已经被添加到一个特定的交换中,那么在输出到环境之前,观察结果将通过FeaturePipeline。例如,特性管道可以标准化所有价格值,使时间序列稳定,添加移动平均列,并删除不必要的列,所有这些都在观察结果返回给代理之前完成。

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

可以用任意数量的逗号分隔的转换器初始化特征管线。每个FeatureTransformer都需要用要转换的列集进行初始化,否则如果没有传递任何内容,所有输入列都将被转换。

每个特征转换器都有一个transform方法,该方法将从更大的数据集中转换单个观察值(a pandas.DataFrame),在内存中保留任何必要的状态以转换下一帧。因此,经常需要定期对resetFeatureTransformer进行调整。每次重置父FeaturePipelineExchange时,这将自动完成。

让我们创建一个示例管道,并将其添加到现有的交换中。

**from** tensortrade.features **import** FeaturePipeline
**from** tensortrade.features.scalers **import** MinMaxNormalizer
**from** tensortrade.features.stationarity **import** FractionalDifference
**from** tensortrade.features.indicators **import** SimpleMovingAverageprice_columns = ["open", "high", "low", "close"]normalize_price = MinMaxNormalizer(price_columns)
moving_averages = SimpleMovingAverage(price_columns)
difference_all = FractionalDifference(difference_order=0.6)feature_pipeline = FeaturePipeline(steps=[normalize_price,
                                          moving_averages,
                                          difference_all])exchange.feature_pipeline = feature_pipeline

此功能管道在添加一些移动平均列并通过连续值的微小差异使整个时间序列平稳之前,将价格值标准化为 0 到 1 之间。

行动计划

行动方案定义了环境的行动空间,并将代理的行动转换成可执行的交易。例如,如果我们使用 3 个动作的离散动作空间(0 = hold,1 = buy 100%,2 = sell 100%),我们的学习代理不需要知道返回一个动作 1 等同于购买一个乐器。相反,我们的代理需要知道在特定情况下返回动作 1 的回报,并且可以将动作转换为交易的实现细节留给ActionScheme

每个动作方案都有一个get_trade方法,它会将代理的指定动作转化为可执行的Trade。通常需要在方案中存储额外的状态,例如跟踪当前交易的头寸。每次调用动作方案的reset方法时都应该重置该状态,这是在重置父TradingEnvironment时自动完成的。

**from** tensortrade.actions **import** DiscreteActionsaction_scheme = DiscreteActions(n_actions=20,      
                                instrument_symbol='BTC')

该离散动作方案使用 20 个离散动作,相当于 5 种交易类型(市场买入/卖出、限价买入/卖出和持有)中每种交易类型的 4 个离散金额。例如[0,5,10,15]= hold,1= market buy 25%,2= market sell 25%,3= limit buy 25%,4= limit sell 25%,6= market buy 50%,7= market sell 50%等…

奖励计划

奖励方案接收在每个时间步进行的交易,并返回一个float,对应于特定行动的收益。例如,如果这一步采取的行动是导致正利润的出售,我们的RewardScheme可以返回一个正数,以鼓励更多这样的交易。另一方面,如果行动是导致损失的销售,该方案可以返回负奖励,以教导代理人在未来不要做出类似的行动。

该示例算法的一个版本在SimpleProfit组件中实现,然而显然可以使用更复杂的策略来代替。

每个奖励方案都有一个get_reward方法,它接受在每个时间步执行的交易,并返回一个与该动作的相对应的浮点数。与动作方案一样,出于各种原因,经常需要在奖励方案中存储附加状态。每次调用奖励方案的reset方法时都应该重置该状态,这是在重置父TradingEnvironment时自动完成的。

**from** tensortrade.rewards **import** SimpleProfitreward_scheme = SimpleProfit()

简单利润方案返回的回报为-1 表示不持有交易,1 表示持有交易,2 表示购买工具,如果出售工具,则对应于交易所得(正/负)利润的值。

学习代理

到目前为止,我们还没有看到深度强化学习框架的“深度”部分。这就是学习代理的用武之地。学习代理是数学(阅读:魔术)发生的地方。

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

在每个时间步,代理将来自环境的观察作为输入,通过其底层模型(大部分时间是神经网络)运行它,并输出要采取的行动。例如,观察值可能是交易所以前的开盘价、最高价、最低价和收盘价。学习模型将这些值作为输入,并输出对应于要采取的动作的值,例如购买、出售或持有。

重要的是要记住,学习模型对这些值所代表的价格或交易没有直觉。相反,该模型只是学习对于特定的输入值或输入值序列输出哪些值,以获得最高的回报。

稳定基线

在本例中,我们将使用稳定基线库为我们的交易策略提供学习代理,然而,TensorTrade 框架与许多强化学习库兼容,如 TensorforceRay 的 RLLibOpenAI 的基线英特尔的蔻驰,或 TensorFlow 系列中的任何库,如 TF 代理

自定义 TensorTrade 学习代理可能会在未来添加到该框架中,尽管该框架的目标始终是与尽可能多的现有强化学习库进行互操作,因为该领域有如此多的并发增长。

但是现在,稳定的基线对于我们的需求来说足够简单和强大。

**from** stable_baselines.common.policies **import** MlpLnLstmPolicy
**from** stable_baselines **import** PPO2model = PPO2
policy = MlpLnLstmPolicy
params = { "learning_rate": 1e-5 }agent = model(policy, environment, model_kwargs=params)

注意:使用 TensorTrade 并不需要稳定的基线,尽管在本教程中它是必需的。这个例子使用了一个支持 GPU 的近似策略优化模型和一个层标准化的 LSTM 感知器网络。如果您想了解更多关于稳定基线的信息,您可以查看文档

张量力

我还将快速介绍一下 Tensorforce 库,以展示在强化学习框架之间切换是多么简单。

**from** tensorforce.agents **import** Agentagent_spec = {
    "type": "ppo_agent",
    "step_optimizer": {
        "type": "adam",
        "learning_rate": 1e-4
    },
    "discount": 0.99,
    "likelihood_ratio_clipping": 0.2,
}network_spec = [
    dict(type='dense', size=64, activation="tanh"),
    dict(type='dense', size=32, activation="tanh")
]agent = Agent.from_spec(*spec*=agent_spec,
                        *kwargs*=*dict*(*network*=network_spec,
                                    *states*=environment.states,
                                    *actions*=environment.actions))

如果你想了解更多关于 Tensorforce 代理的信息,你可以查看文档

交易策略

一个TradingStrategy由一个学习代理和一个或多个交易环境组成,用于调整、训练和评估。如果只提供一个环境,它将用于调优、培训和评估。否则,可以在每个步骤提供单独的环境。

**from** tensortrade.strategies **import** TensorforceTradingStrategy,
                                   StableBaselinesTradingStrategya_strategy = TensorforceTradingStrategy(environment=environment,
                                        agent_spec=agent_spec,
                                        network_spec=network_spec)b_strategy = StableBaselinesTradingStrategy(environment=environment,
                                            model=PPO2,
                                            policy=MlpLnLSTMPolicy)

如果您还不理解策略初始化,请不要担心,稍后会有更详细的解释。

把所有的放在一起

现在我们知道了组成TradingStrategy的每个组件,让我们构建并评估一个组件。

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

简单回顾一下,TradingStrategyTradingEnvironment和学习代理组成。一个TradingEnvironment是一个gym环境,它接受一个Exchange、一个ActionScheme、一个RewardScheme和一个可选的FeaturePipeline,并返回观察结果和奖励,学习代理可以在这些观察结果和奖励上进行培训和评估。

创造环境

第一步是使用上面概述的组件创建一个TradingEnvironment

**from** tensortrade.exchanges.simulated **import** FBMExchange
**from** tensortrade.features.scalers **import** MinMaxNormalizer
**from** tensortrade.features.stationarity **import** FractionalDifference
**from** tensortrade.features **import** FeaturePipeline
**from** tensortrade.rewards **import** SimpleProfit
**from** tensortrade.actions **import** DiscreteActions
**from** tensortrade.environments **import** TradingEnvironmentnormalize_price = MinMaxNormalizer(["open", "high", "low", "close"])
difference = FractionalDifference(difference_order=0.6)
feature_pipeline = FeaturePipeline(steps=[normalize_price, 
                                          difference])exchange = FBMExchange(timeframe='1h',
                       base_instrument='BTC',
                       feature_pipeline=feature_pipeline)reward_scheme = SimpleProfit()action_scheme = DiscreteActions(n_actions=20, 
                                instrument_symbol='ETH/BTC')environment = TradingEnvironment(exchange=exchange,
                                 action_scheme=action_scheme,
                                 reward_scheme=reward_scheme,
                                 feature_pipeline=feature_pipeline)

很简单,现在environment是一个gym环境,可以被任何兼容的交易策略或学习代理使用。

定义代理

既然环境已经设置好了,是时候创建我们的学习代理了。同样,我们将为此使用稳定的基线,但也可以在这里随意添加任何其他强化学习代理。

由于我们使用的是StableBaselinesTradingStrategy,所以我们需要做的就是为要训练的底层神经网络提供模型类型和策略类型。对于这个例子,我们将使用一个简单的近似策略优化(PPO)模型和一个层标准化的 LSTM 策略网络。

有关模型和策略规范的更多示例,请参见稳定基线文档

**from** stable_baselines.common.policies **import** MlpLnLstmPolicy
**from** stable_baselines **import** PPO2model = PPO2
policy = MlpLnLstmPolicy
params = { "learning_rate": 1e-5 }

训练策略

创建我们的交易策略就像插入我们的代理和环境一样简单。

**from** tensortrade.strategies **import** StableBaselinesTradingStrategystrategy = StableBaselinesTradingStrategy(environment=environment,
                                          model=model,
                                          policy=policy,
                                          model_kwargs=params)

然后,为了训练策略(即,在当前环境下训练代理),我们需要做的就是调用strategy.run()并告知您想要运行的步骤或剧集的总数。

performance = strategy.run(steps=100000,
                           episode_callback=stop_early_callback)

瞧啊。三个小时和数以千计的打印报表后,你会看到你的代理如何做的结果!

如果这个反馈循环对你来说有点慢,可以给run传递一个回调函数,每集结束时都会调用。回调函数将传入一个包含代理在那一集的表现的数据帧,并期待一个bool作为返回。如果True,代理将继续培训,否则,代理将停止并返回其整体绩效。

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

A simple performance output at the end of the episode, including the final 5 balances and net worths of the agent.

保存和恢复

所有的交易策略都能够将它们的代理保存到一个文件中,以便以后恢复。环境没有被保存,因为它没有我们关心保存的状态。为了将我们的TensorflowTradingStrategy保存到一个文件中,我们只需要将文件的path提供给我们的策略。

strategy.save_agent(path="../agents/ppo_btc_1h")

为了从文件中恢复代理,在调用restore_agent之前,我们首先需要实例化我们的策略。

**from** tensortrade.strategies **import** StableBaselinesTradingStrategystrategy = StableBaselinesTradingStrategy(environment=environment,
                                          model=model,
                                          policy=policy,
                                          model_kwargs=params)strategy.restore_agent(path="../agents/ppo_btc/1h")

我们的策略现在恢复到了之前的状态,并准备再次使用。

调整您的策略

有时,交易策略需要在一个环境中调整一组超参数或特征,以达到最佳性能。在这种情况下,每个TradingStrategy提供一个可选的可实现的tune方法。

调整模型类似于训练模型,但是除了调整和保存最佳执行模型的权重和偏差之外,该策略还调整和保持产生该模型的超参数。

**from** tensortrade.environments **import** TradingEnvironment
**from** tensortrade.exchanges.simulated **import** FBMExchangeexchange = FBMExchange(timeframe='1h',
                       base_instrument='BTC',
                       feature_pipeline=feature_pipeline)environment = TradingEnvironment(exchange=exchange,
                                 action_scheme=action_scheme,
                                 reward_scheme=reward_scheme)strategy.environment = environmenttuned_performance = strategy.tune(episodes=10)

在这种情况下,代理将被训练 10 集,每集有一组不同的超参数。最佳设置将保存在策略中,并在此后调用strategy.run()时使用。

战略评估

现在我们已经调优并训练了我们的代理,是时候看看它的表现如何了。为了评估我们的策略在看不见的数据上的性能,我们需要在这样的数据支持的新环境上运行它。

**from** pandas **import** pd**from** tensortrade.environments **import** TradingEnvironment
**from** tensortrade.exchanges.simulated **import** SimulatedExchangedf = pd.read_csv('./btc_ohlcv_1h.csv')exchange = SimulatedExchange(data_frame=df, 
                             base_instrument='BTC',
                             feature_pipeline=feature_pipeline)environment = TradingEnvironment(exchange=exchange,
                                 action_scheme=action_scheme,
                                 reward_scheme=reward_scheme)strategy.environment = environmenttest_performance = strategy.run(episodes=1, testing=True)

完成后,strategy.run返回代理绩效的 Pandas 数据框架,包括代理在每个时间步的净值和余额。

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

Example evaluation performance — this agent has not been trained on this feature set, so performance is arbitrary.

现场交易

一旦你建立了一个有利可图的交易策略,训练了一个代理来正确交易它,并确保它对新数据集的“泛化能力”,剩下要做的就是盈利。使用像CCXTExchange这样的实时交流,你可以插入你的策略并让它运行!

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

虽然你可能喜欢开始一个策略,并让它无限制地运行,但你可以使用一个trade_callback,它将在每次策略交易时被调用。这个回调函数类似于剧集回调,将传入一个包含代理整体表现的数据帧,并期望得到一个bool作为回报。如果True,代理将继续交易,否则,代理将停止交易并返回其在整个交易期间的表现。

**import** ccxt**from** tensortrade.environments **import** TradingEnvironment
**from** tensortrade.strategies **import** StableBaselinesTradingStrategy
**from** tensortrade.exchanges.live **import** CCXTExchangecoinbase = ccxt.coinbasepro(...)exchange = CCXTExchange(exchange=coinbase,
                        timeframe='1h',
                        base_instrument='USD', 
                        feature_pipeline=feature_pipeline)environment = TradingEnvironment(exchange=exchange,
                                 action_scheme=action_scheme,
                                 reward_scheme=reward_scheme)strategy.environment = environmentstrategy.restore_agent(path="../agents/ppo_btc/1h")*live_performance = strategy.run(steps=0, trade_callback=episode_cb)*

通过steps=0指示策略运行,直到停止。

这就是全部了!正如你所看到的,使用简单的组件和深度强化学习来构建复杂的交易策略是非常简单的。你还在等什么?投入其中,亲自动手,看看使用 TensorTrade 能做些什么。

未来

目前,该框架正处于早期阶段。到目前为止,重点是获得一个工作原型,具有创建高利润战略所需的所有必要构件。下一步是构建未来的路线图,并决定哪些即将到来的构件对社区是重要的。

很快,我们将看到框架中增加了高度信息化的可视化环境,以及更多交易所、交易更多工具的更深入的策略。

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

An example environment visualization, created in a previous article.

天空是极限。基础(即框架)已经奠定,现在要由社区来决定下一步做什么。我希望你能成为其中的一员。

最后的想法

TensorTrade 是一个强大的框架,能够构建高度模块化、高性能的交易系统。尝试新的交易和投资策略是相当简单和容易的,同时允许你在另一个策略中利用一个策略的成分。但不要相信我的话,创建一个自己的策略,并开始教你的机器人接管世界!

虽然这个教程应该足以让你开始,但如果你想创造一个有利可图的交易策略,还有很多东西要学。我鼓励你去 Github 看看代码库,或者看看我们在 tensortrade.org的文档。还有一个相当活跃的 Discord 社区,共有近 1000 名成员,所以如果你有问题、反馈或功能请求,请随时在那里提出!

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

This is my GitHub commit history for the TensorTrade framework — you could say I’ve been busy.

我已经让这个项目达到了高度可用的状态。不过,我的时间有限,我相信你们中有很多人可以为开源代码库做出有价值的贡献。因此,如果你是一个对构建最先进的交易系统感兴趣的开发人员或数据科学家,我希望看到你打开一个拉请求,即使它只是一个简单的测试案例!

贡献的

其他人问他们如何在不写代码的情况下为项目做贡献。目前有三种方法可以做到这一点。

  1. 为 TensorTrade 框架编写代码或文档。 Github 上的许多问题都是通过 Gitcoin 智能合约资助的,所以你可以通过贡献获得报酬。迄今为止,社区捐赠的近 10 ETH(~2000 美元)已经用于支付开源开发者对框架的贡献。
  2. 比特币以太坊资助这个项目。这些捐赠用于资助我们的 Gitcoin 智能合同,它允许任何贡献优质代码和文档的人获得报酬。
  3. 在 Github 上赞助我。Github 目前正在 1:1 匹配所有捐款,最高可达 5000 美元,因此这是赞助我的工作和 TensorTrade 发展的最佳时机。所有的赞助都直接用于资助框架的开源开发。

感谢阅读!一如既往,本教程的所有代码都可以在我的 GitHub 上找到。如果您有任何问题或反馈,请在下面留下评论,我很乐意收到您的来信!我也可以通过@notadamking 上的Twitter联系到。

你也可以通过下面的链接在 Github 赞助商 或者Patreon上赞助我。

** [## GitHub 赞助商

嗨,我是亚当。我是一名开发人员、作家和企业家,尤其对深度…

github.com](https://github.com/users/notadamking/sponsorship) [## 亚当·金正在创造改变世界的内容

嗨,我是亚当。我是一名开发人员、作家和企业家,尤其对深度…

patreon.com](https://patreon.com/notadamking)

参考

权衡:偏差还是差异

原文:https://towardsdatascience.com/tradeoff-bias-or-variance-1409eec38caf?source=collection_archive---------16-----------------------

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

Photo by Afif Kusuma on Unsplash

什么是偏差方差权衡?

我从小就喜欢射箭。也许是因为我是一个历史迷,或者是因为这是一项优雅而危险的运动。射箭与偏差和方差权衡有什么关系?

上图展示了一个很好的例子。如果我们想象一个射手射击一个目标,他们击中靶心的能力证明了他们的准确性。然而,能够反复击中靶心向我们展示了精确性。我不知道你怎么想,但如果我在战争中,我会希望我的小队精确无误,能够在不同的场景和环境中多次击中目标,而不是让一个士兵一生中只有一次运气好,击中了靶心。

精确是我们构建和微调模型的目标。

B ias 方差权衡是数据科学家在开发有效和有用的模型时面临的一个非常真实和常见的问题。当谈到偏差方差权衡时,我们只是在谈论我们的模型对看不见的数据执行的灵活性。

等等!在我们前进之前,我们需要知道如何测量偏差和方差。这就是均方差(MSE)发挥作用的时候。

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

source

MSE 是我们的预测值和真实值之间的均方差。这将为我们提供一种方法来观察我们的模型是具有高方差还是低方差。那么 MSE 如何向我们展示模型是否表现良好呢?当我们的模型表现良好时,我们的 MSE 将会很低,这表明我们的预测非常接近真实值。否则我们的 MSE 会很大,表明我们的预测与真实值不太接近。重要的是要记住 MSE 总是正的,数字越小越好。本质上,我们使用 MSE 来确定模型有效预测未知数据的能力。

偏差和方差

好吧!现在我们已经有了 MSE,让我们来谈谈偏差和方差。

什么是偏见?

B ias 是我们的预测值和真实值之间的平均差值。我们应该将偏差视为准确性,它是指测量值与标准值或已知值的接近程度。这就好比一个弓箭手射中了靶心。虽然这似乎是任何数据科学家都想努力实现的目标,但高偏见实际上可能会伤害我们。它对特定数据的定制非常严格,当处理稍有不同的数据时,它不知道该怎么办。高偏差将导致我们的模型对看不见的数据预测不佳。我们的目标是降低训练数据的偏差,以便我们的模型能够更好地预测其他数据。

什么是方差?

方差是我们模型中的变化量。它表明了我们的模型概括数据的能力。我更愿意将此视为精度,或者两个或多个测量值相互之间的接近程度和频率。偏差是精确的,方差是精确的或能够重复预测分布中的值。

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

source

权衡

如果我们认为偏差是准确的能力,方差是精确的能力,我们可以保证我们会有一个好的模型。我们这样做的方式被称为偏差方差权衡。我们正在做的是调整我们的模型,使我们的训练数据得分 MSE 接近我们的测试数据得分 MSE。如果在我们的训练或测试数据中,我们有 MSE 值不接近的分数,那么我们需要权衡。当我们说“权衡”时,我们指的是参数调整,我们在偏差和方差之间“交易”。当我们有很多参数时,我们的模型在预测时会变得过于复杂、低效和不精确。当我们减少我们的模型用于生成预测的参数数量,以便我们的训练和测试 MSE 分数将更接近值时,就会出现权衡。然而,我们不希望我们的模型变得过于简单,否则我们最终会得到如上图所示的低偏差高方差的情况。

一个弓箭手想要磨练技能,让他们以最高的效率和效力射箭。然而,射手需要在某些方面做出妥协,才能有效地发挥作用。例如,灵巧和力量是重要的,但是过度补偿其中任何一个都会影响射手反复击中目标的能力。弓箭手想要流畅的拉和放,所以拉弓弦所需的力量就是所有需要的力量。

作为数据科学家,我们必须使用我们的判断和直觉来为我们的模型确定一个可接受的平衡。我们必须在可用的参数中进行选择,这样我们可以降低模型的复杂性,但不会剥夺模型有效执行的能力。因此,在我们的模型中,我们希望平衡参数与它对我们想要预测的值的重要性之间的关系。

TLDR

本文旨在帮助更好地理解什么是偏差和方差权衡,以及为什么它很重要。要吸收的信息很多,但是简短而甜蜜的可以用记住这四个要点来概括。

  • 偏差:模型预测 Y 的好坏
  • 方差:模型概括数据的好坏程度
  • 随着偏差减少,方差增加
  • 调整我们的参数将帮助我们平衡我们的模型分数

美联储会议纪要的交易信号?

原文:https://towardsdatascience.com/trading-signal-from-fed-minutes-4c2def891134?source=collection_archive---------24-----------------------

即使延迟 3 周,美联储会议纪要还能成为交易信号吗?

社交网络情绪以及新闻情绪已经被广泛用于实时驱动市场运动。数十家公司已经建立了用于交易目的的实时情绪分析 feed。然而,我发现在分析美联储 FOMC(联邦公开市场委员会)会议记录时有一个缺口。

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

背景

FOMC 是美联储中负责直接与市场打交道的部门。当美联储想要实施 QE(量化宽松)时,实际操作的是 FOMC。有了如此强大的支持,市场先生密切关注每次会议的新闻稿也就不足为奇了。然而,“市场先生”对美联储操作的反应最多只有几天,他失去了记忆,转而关注非农就业数据、PMI、GDP 等。

美联储负责两个重要目标

  • 将通货膨胀率保持在目标水平(2%)
  • 最大化就业率

这些目标对经济有长期影响。然后,我开始怀疑 FOMC 会议纪要中的情绪实际上是否对经济有更长期的影响。

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

FOMC 会议召开后,会产生三个关键文件,会议记录和文字记录。当会议在日结束时,一份声明**(2019 年 9 月)发布,这是市场先生对 FOMC 的任何行动/不行动做出反应和调整的时候。三周后,会议纪要( Sep 2019 )发布,包括会议期间的一些关键讨论。而五年后,FOMC 会议的完整抄本(2013 年 12 月)将会发布。**

当我看这三份文件时,新闻声明太短,很容易用人工分析。它没有给出为什么得出这个结论的背景。完整的记录是在第一次会议后的 5 年后。考虑到整个经济周期只持续 5 年左右。很难想象它作为交易信号会有多大价值。这让我仔细看了一下会议记录。

把会议记录排好

通过回顾所有会议记录的完整历史,我发现 FOMC 最初的会议记录确实非常短,其中许多会议记录的长度与当前的新闻稿相似。看看这份 1937 年 6 月的 FOMC 会议记录。

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

早些年,它们只有 PDF 格式,所以我使用 Tika-python(包装 Tesseract OCR)从 PDF 中提取文本。首先,我绘制了所有会议记录的平均字数和平均句子数。会议记录可以追溯到 1936 年,但我发现它提供的信息不多,所以被忽略了。正如我们所见,随着时间的推移,美联储变得非常罗嗦,特别是在 2008 年次贷危机之后。

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

然后,我使用了一个快速情感分析库 TextBlob 来快速检查它是否随时间波动足够大。根据之前的文本分析经验,专业文章往往在情绪上有小的变化。

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

在这里,我绘制了每一分钟的原始情绪。我们可以看到,纪要字数在 2500 以下或者 1970 年以前的,情绪是很嘈杂的。我们可以看到,情绪的整体范围很小,在 0.05 和 0.1 之间波动,而整个范围是-1 和 1。在这种原始情绪下,图表非常嘈杂,很难观察到任何总体趋势。因此,我设置了一个 10 分钟的滚动窗口,计算他们的情绪均值。

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

随着我们消除情绪中的噪音,一些有趣的趋势出现了。我们可以看到一些明显的趋势。1973 年和 1979 年的石油危机已经在市场情绪中得到反映,次贷危机也是如此。

我们可以看到原文中有很多杂音,这是因为与政策无关的文字破坏了统计数据。这可能是会议的与会者名单、投票说明等。因此,我使用了路标,让我们只关注政策文本。(参见黄色高亮部分)

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

在文本裁剪之后,已经执行了标准的 NLP 预处理工作,如词汇化,这导致情感的更平滑的结果。

装满市场

我用标准普尔 500 作为一般市场的代表,因为它覆盖了广泛的行业,不像道琼斯和纳斯达克。感谢雅虎!金融,我能够加载它的日常历史追溯到 1950 年(部分原因是我从 1950 年开始分析)。

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

https://www.macrotrends.net/2324/sp-500-historical-chart-data

然而,我们只对任何给定日期后的短期回报感兴趣。最好的替代方法是使用一段时间内每日回报的累积积。下图显示了平滑情绪与过去 200 个交易日(一年大约 250 天)的累计回报。这两者之间似乎有某种关联。

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

在我们进行进一步的分析之前,我们可能想改变一下我们用来分析金融文本的字典。因为 TextBlob 中包含的模式库主要来源于互联网、新闻和社交网络。它可能不是金融文本分析的最佳库。有一个图书馆叫《拉夫兰和麦克唐纳词典》,是从美国 10K 年度报告中摘录的。在这种情况下,它可能是一个更相关的库,市场之间的相关性与它相符。

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

为了形象化,我想立刻说出情绪是否与市场相关。此外,我想将市场向前和向后移动,以检查移动后的相关性。这将告诉我信号是领先还是落后于市场。

为了实现这一目标,我们需要将时间序列移动多个步骤,并绘制许多图表,这些图表看起来可能会让人不知所措。

这个助手方法通过将市场来回移动多个步骤并重新计算两个时间序列之间的相关性来解决这个问题。在这样做的同时,我们还计算了它需要的 p 值,以使相关性具有统计显著性。因此,此图结合了三个不同的图表。

  1. 标准普尔 500 回报叠加美联储情绪(上图)
  2. 移动市场 N 步后,标准普尔 500 和美联储情绪之间的相关性(下图蓝色柱线)
  3. 具有统计意义的相关 p 值。如果红色柱高于蓝色柱,这意味着相关性太低,没有统计学意义。(在下面用红色条标出)

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

在这种特殊情况下,我们可以立即看出,与市场相比,情绪是一个滞后的指标。在市场延迟 5 个周期后,相关性达到稳定。换句话说,会议纪要中的情绪需要大约 6 -7 个月的延迟才能完全适应市场的反应。基于这一点,我们可以说市场确实非常有效。

我们能做得更好吗?

看到情绪不是市场的领先指标,令人非常失望,但并不令人惊讶。让我们拿出 NLP 处理中的一把更大的枪——LDA(潜在狄利克雷分配),主题抽取模型。它允许我们基于单词袋方法提取抽象概念。

最初,我们在文章和它的单词包之间有一个映射。

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

Can’t remember where I got this from, but it’s really nice illustration!

LDA 允许我们指定我们认为有多少主题。它试图在单词和我们的文章之间插入一个额外的层,以降低文章和单词之间的连接复杂性。

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

因此,这创造了一些抽象的概念,将相关的单词分组到主题中。这些主题中的每一个都可以计算为不同单词的权重之和。例如,主题可以表述为:

0.047*“利率”+ 0.024*“市场”+ 0.016*“期限”+ 0.015*“下降”+ 0.015*“国库券”+ 0.014*“利息”

现在的问题变成了,我如何决定我应该使用多少主题。虽然 LDA 能够创建主题,但它并不真正了解每个主题是关于什么的。在这里,我使用 pyLDAvis 库来可视化主题建模结果,减少不同主题之间的重叠,试图拥有一个相同大小的主题。经过几次反复试验和错误,我选定了一个看起来像这样的模型。

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

最后,我让 LDA 创建了 6 个不同的主题,因为它有一个相对均等的主题分布和大部分重叠的主题。然而,这仍然没有解决知道每个主题是关于什么的问题。

为此,我打印出了每个主题排名靠前的句子,并试图了解这个主题试图描述的内容。

主题 1:

Short-term market interest rates declined substantially on balance  over the meeting interval: in private short-term markets, yields fell 2 to 3-1/2 percentage points; in the Treasury bill market, yields fell some what less, about 3/4 to 2 percentage points, as the Treasury raised large  amounts of new money through bill auctions and heavy seasonal issuance of  cash management bills.

话题 2:

M1 comprises demand deposits at commercial banks and thrift institutions, currency in circulation, travellers checks, negotiable orders of withdrawal (NOW) and automatic transfer service (ATS) accounts at banks and thrift institutions, and credit union share draft accounts.

通过对所有主题进行这一练习,我已经给出了主题的名称,并打印出了它们的前 10 个关键词。

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

斗牛中的最后一剑

最后,我们已经到了可以将每个主题中的情绪与市场相对照的地步。

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

对于利率,很难看出情绪和市场之间有多大的相关性,但感觉利率情绪的重大转变将导致市场大幅波动,但方向不太清楚。因为相关性在 2000 年之后似乎是正的,但在 2000 年之前是负相关的。

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

就经济前景而言,这种情绪肯定与市场走势存在一定的相关性。然而,随着时间的推移,它不是很稳定,有时它领先市场,有时它滞后。但相关性似乎在 0 个周期后趋于平稳,即总体上滞后于市场。

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

就 FOMC 政策而言,这看起来很像一个经济前景话题。它并没有明确指出信号是超前还是滞后。

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

随着国际贸易和劳动力/国内市场,情绪肯定落后于市场。这种相关性表明,市场的全面影响只是在大约 7 次会议之后,即在将近一年的延迟之后,才完全反映在市场情绪中。这可能是由于我在情感分析中使用的平滑操作。我已经在 10 次会议上缓和了这种情绪。

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

最有趣的图表是货币供应话题。它与市场有微弱但有意义的负相关性,在市场情绪开始赶上趋势之前的 3 次会议。即使在过去 10 次会议中情绪平稳后,这一领先信号仍然有效。我相信这是一个事实,公开市场操作是一个持续的过程,超越了市场先生的记忆广度。因此,在接下来的几个月里,市场并没有完全消化后续操作。

希望这项工作能给你带来一些如何进行情感或一般文本分析的想法。欢迎在下面留言或直接联系我。

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

用 Python 构建金融交易工具箱:简单移动平均线

原文:https://towardsdatascience.com/trading-toolbox-01-sma-7b8e16bd9388?source=collection_archive---------6-----------------------

交易工具箱

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

Photo by Markus Spiske on Unsplash

Python 凭借其强大的数据分析包熊猫,席卷了金融市场分析领域。它使研究人员能够进行复杂的分析,而这曾经需要专用的昂贵的软件包。

在这篇文章中,我们将使用 Python 和熊猫涉水金融市场分析。我们将绘制一个市场价格序列,并添加一个基本指标。在接下来的文章中,我们将通过构建一个完整的工具箱来学习如何游泳,这个工具箱可以用来创建交易股票或其他金融资产的系统。

我们将要实现的大多数概念属于一个被称为技术分析的领域,这是一个旨在通过分析交易活动产生的数据(如价格和交易量)来评估投资和识别机会的学科。

介绍移动平均线

移动平均线是最简单的技术指标之一,但它可以以许多不同的方式使用和组合,为交易系统和投资决策框架提供支柱。

移动平均线,作为所有的技术指标,是基于金融工具的价格序列。在我们的例子中,我们考虑在纽约证券交易所交易的交易所交易基金 (ETF)的 SPDR 的& P 500 ETF 信托(代码:SPY)的每日价格序列。这只 ETF 模仿了标准普尔 500 指数的表现。我们希望使用移动平均线来做出投资决策——决定何时买入或卖出 SPY 的股票。

有不同种类的移动平均线。最常用的三种是:

  • 简单移动平均线
  • 线性加权移动平均
  • 指数平滑移动平均

本帖中的例子将集中在简单移动平均线(SMA) 。它的构造非常简单:我们首先定义一个长度为 n 的滚动窗口(在我们的例子中是几天——让我们使用 n=5 )。然后,我们从第 5 天开始,考虑从第 1 天到第 5 天(包括在内)的所有价格。我们计算这些价格的算术平均值(将它们相加并除以 5):这就是第 5 天的 SMA 值。然后,我们继续到第 6 天,我们取出第 1 天的价格,包括第 6 天的价格,并计算下一个 SMA。我们不断重复这个过程,直到我们达到系列中的最后一个价格。参见表格:

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

您已经注意到我们的移动平均线的前 4 个值没有被计算:直到第 5 天才有足够的天数来填充 5 天的窗口。

直观的例子

让我们将这个概念付诸实践,并使用 Python、 pandasMatplotlib 创建一些实际的例子。我假设您至少有一些基本的 Python 知识,并且知道什么是数据帧和序列对象。如果不是这样,你可以在这里找到温柔的介绍。我还建议你用一个笔记本来跟随下面的代码。在这里你可以找到一个方便的 Jupyter 教程。但是,您总是以自己喜欢的方式执行代码,通过 IDE 或交互式提示符。我们首先加载所需的库并检查它们的版本:

import pandas as pd
import matplotlib.pyplot as plt

如果您正在使用 Jupyter ,最好在笔记本中显示图表:

%matplotlib inline

在这种情况下,你可以省略本文所有代码中的所有plt.show()语句。

接下来,我们将数据加载到数据帧中。我已经从雅虎获得了一个每日间谍数据的 CSV 文件。财务。你可以在这里下载我的 CSV 文件

datafile = 'data/SPY.csv'#This creates a dataframe from the CSV file:
data = pd.read_csv(datafile, index_col = 'Date')data

Jupyter 中的输出显示了我们的数据:

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

我们的数据框架总共有六列,分别代表开盘价、最高价、最低价、收盘价、调整后收盘价和成交量。为了简单起见,在我们的例子中,我们将只使用调整后的收盘价。这是反映股息、股票分割和其他影响股票回报的公司事件的价格系列。

#This selects the 'Adj Close' column
close = data['Adj Close']#This converts the date strings in the index into pandas datetime format:
close.index = pd.to_datetime(close.index)close

输出:

Date
2014-08-20    180.141846
2014-08-21    180.667160
2014-08-22    180.386368
2014-08-25    181.301010
2014-08-26    181.418716
                 ...    
2019-08-13    292.549988
2019-08-14    283.899994
2019-08-15    284.649994
2019-08-16    288.850006
2019-08-19    292.329987
Name: Adj Close, Length: 1258, dtype: float64

我们可以很容易地绘制价格系列,以便直观地观察:

close.plot()plt.show()

如果你正在使用 Jupyter ,记住你可以在这里和下一行代码中删除plt.show()行。我们得到:

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

close.plot() output in Jupyter

熊猫让计算 50 天移动平均线变得容易。使用**滚动()方法,我们设置了一个 50 天的窗口,在此窗口上,我们使用均值()**方法计算算术平均值:

sma50 = close.rolling(window=50).mean()sma50

我们得到:

Date
2014-08-20           NaN
2014-08-21           NaN
2014-08-22           NaN
2014-08-25           NaN
2014-08-26           NaN
                 ...    
2019-08-13    293.540820
2019-08-14    293.635375
2019-08-15    293.696567
2019-08-16    293.805137
2019-08-19    293.926582
Name: Adj Close, Length: 1258, dtype: float64

正如我们所料,序列的前 49 个值为空:

sma50.iloc[45:52]

显示:

Date
2014-10-23           NaN
2014-10-24           NaN
2014-10-27           NaN
2014-10-28           NaN
2014-10-29    178.725250
2014-10-30    178.750461
2014-10-31    178.806655
Name: Adj Close, dtype: float64

我们现在可以在图表上画出我们的第一条均线。为了改善外观,我们可以使用预定义的样式:

plt.style.use('fivethirtyeight')

你可以尝试不同的风格,看看这里有什么。我们现在可以绘制图表了:

#The size for our chart:
plt.figure(figsize = (12,6))#Plotting price and SMA lines:
plt.plot(close, label='SPY Adj Close', linewidth = 2)
plt.plot(sma50, label='50 day rolling SMA', linewidth = 1.5)#Adding title and labeles on the axes, making legend visible:
plt.xlabel('Date')
plt.ylabel('Adjusted closing price ($)')
plt.title('Price with a single Simple Moving Average')
plt.legend()plt.show()

这是我们的移动平均线与价格的关系图:

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

使用一个移动平均线

我们的简单移动平均线做得很好,它平滑了价格运动,帮助我们直观地识别趋势:当平均线向上攀升时,我们有上升趋势。当均线向下时,我们处于下跌趋势。

我们能做的不止这些:用一条均线就能产生交易信号。当收盘价从下方移动到均线上方时,我们有买入信号:

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

同样,当价格从上方穿过移动平均线时,就会产生卖出信号:

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

绘制两个平均值并选择日期范围

让我们比较两个不同长度的移动平均线,分别是 20 天和 50 天:

sma20 = close.rolling(window=20).mean()plt.figure(figsize = (12,6))#Plotting price with two SMAs:
plt.plot(close, label='SPY Adj Close', linewidth = 2)
plt.plot(sma20, label='20 day rolling SMA', linewidth = 1.5)
plt.plot(sma50, label='50 day rolling SMA', linewidth = 1.5)plt.xlabel('Date')
plt.ylabel('Adjusted closing price ($)')
plt.title('Price with Two Simple Moving Averages')
plt.legend()plt.show()

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

我们的图表现在变得有点拥挤:如果能够放大我们选择的日期范围就好了。我们可以使用一个 plt.xlim() 指令(例如plt.xlim('2017-01-01','2018-12-31'):试着把它添加到上面的代码中)。然而,我想探索一条不同的路线:建立一个新的数据框架,包括价格和移动平均线:

priceSma_df = pd.DataFrame({
      'Adj Close' : close,
      'SMA 20' : sma20,
      'SMA 50' : sma50
     })priceSma_df

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

将我们的所有系列放在一个数据框架中,可以轻松创建快照图:

priceSma_df.plot()plt.show()

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

虽然使用 dataframe own plot() 方法创建一个 snap plot 很方便,但是我更喜欢使用单独的函数调用来定制我的图表。将我们的所有系列放在一个数据框架中的另一个好处是,我们可以轻松选择一个日期范围(例如,包括 2017 年和 2018 年的日期)并仅绘制该范围内的数据:

plt.figure(figsize = (12,6))#Plotting price and two SMAs with a specified date range:
plt.plot(priceSma_df['2017':'2018']['Adj Close'], label='SPY Adj Close', linewidth = 2)
plt.plot(priceSma_df['2017':'2018']['SMA 20'], label='20 days rolling SMA', linewidth = 1.5)
plt.plot(priceSma_df['2017':'2018']['SMA 50'], label='50 days rolling SMA', linewidth = 1.5)plt.xlabel('Date')
plt.ylabel('Adjusted closing price ($)')
plt.title('Price with Two Simple Moving Averages - Selected Date Range')
plt.legend()plt.show()

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

Dates between 2017 and 2018 included

按日期范围对数据进行切片是 pandas 的一大特色。以下所有语句都有效:

  • priceSma_df['2017-04-01':'2017-06-15']:由两个特定日期定义的范围
  • priceSma_df['2017-01]:某月价格
  • priceSma_df['2017]:某一年的价格

使用两个移动平均线

通过合并两条均线,我们可以使用一种叫做双交叉法的技术。在这种情况下,只要短均线从下方穿过长均线,就会产生买入信号。类似地,当短均线从上方穿过长均线时,就会产生卖出信号:

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

Trading signals with two SMAs

与只使用一条均线和价格的技术相比,双交叉方法产生的拉锯更少。另一方面,它可以产生具有一定延迟的信号。

使用三条移动平均线

如果我们可以一起使用两条均线,为什么不可以用三条呢?

sma200 = close.rolling(window=200).mean()priceSma_df['SMA 200'] = sma200priceSma_df

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

#Our start and end dates:
start = '2016'
end = '2019'plt.figure(figsize = (12,6))#Plotting price and three SMAs with start and end dates:
plt.plot(priceSma_df[start:end]['Adj Close'], label='SPY Adj Close', linewidth = 2)
plt.plot(priceSma_df[start:end]['SMA 20'], label='20 day rolling SMA', linewidth = 1.5)
plt.plot(priceSma_df[start:end]['SMA 50'], label='50 day rolling SMA', linewidth = 1.5)
plt.plot(priceSma_df[start:end]['SMA 200'], label='200 day rolling SMA', linewidth = 1.5)plt.xlabel('Date')
plt.ylabel('Adjusted closing price ($)')
plt.title('Price with Three Simple Moving Averages')
plt.legend()plt.show()

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

Three SMAs — dates from 2016 to 2018 included

你可以看到长期 200 SMA 如何帮助我们以一种非常平稳的方式识别趋势。

这就给我们带来了三重交叉法。我们使用的移动平均线的长度分别为 20、50 和 200 天,在分析师中广泛使用。当 20 日均线从下方穿过 50 日均线时,我们可以选择考虑买入信号,但只有当两条均线都在 200 日均线上方时。所有出现在 200 均线以下的买入交叉都将被忽略。

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

Crosses above the 200 SMAs

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

A cross below the 200 SMAs

本文中的例子只是结合不同长度的价格和移动平均线产生的许多可能性中的一部分。此外,价格和移动平均线可以与其他可用的技术指标或我们可以自己创建的指标相结合。Python 和 pandas 提供了研究和构建盈利交易系统所需的所有能力和灵活性。

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

Python 交易工具箱:加权和指数移动平均线

原文:https://towardsdatascience.com/trading-toolbox-02-wma-ema-62c22205e2a9?source=collection_archive---------1-----------------------

交易工具箱

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

Photo by M. B. M. on Unsplash

在金融交易工具箱系列的第一篇文章(用 Python 构建金融交易工具箱:简单移动平均线)中,我们讨论了如何计算简单移动平均线,将其添加到价格系列图中,并将其用于投资和交易决策。简单移动平均线只是几种移动平均线中的一种,可以应用于价格序列来建立交易系统或投资决策框架。其中,金融市场中常用的另外两种移动平均线是:

  • 加权移动平均( WMA )
  • 指数移动平均线(均线)

在本文中,我们将探讨如何计算这两个平均值,以及如何确保结果与我们需要实现的定义相匹配。

加权移动平均

在某些应用中,简单移动平均线的一个限制是,它对窗口中包含的每个每日价格给予相同的权重。例如,在 10 天移动平均线中,最近的一天接收与窗口中的第一天相同的权重:每个价格接收 10%的权重。

与简单移动平均线相比,线性加权移动平均线(或简称为加权移动平均线、 WMA ),给予最近价格的权重更大,随着时间的推移逐渐减小。在 10 天加权平均中,第 10 天的价格乘以 10,第 9 天乘以 9,第 8 天乘以 8,以此类推。总数将除以权重的总和(在本例中为:55)。在这个特定的例子中,最近的价格获得总权重的大约 18.2%,第二个最近的价格获得 16.4%,等等,直到窗口中最早的价格获得权重的 0.02%。

让我们用 Python 中的一个例子来实践这一点。除了 pandas 和 Matplotlib,我们还将使用 NumPy:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

我们为图表应用一种样式。如果你正在使用 Jupyter ,添加%matplotlib inline指令是个好主意(在创建图表时跳过plt.show()):

plt.style.use('fivethirtyeight')

在接下来的例子中,我们将使用来自StockCharts.com 文章的价格数据。这是一篇关于均线的优秀教育文章,我推荐阅读。那篇文章中使用的价格序列可以属于任何股票或金融工具,并且将服务于我们的说明目的。

我修改了原始的 Excel 表格,加入了 10 天 WMA 的计算,因为已经包含了均线的计算。您可以访问我的 Google Sheets 文件并在此下载 CSV 格式的数据

在对数据建模时,从模型的简单实现开始总是一个好的做法,我们可以用它来确保最终实现的结果是正确的。

我们首先将数据加载到数据框中:

datafile = 'cs-movavg.csv'data = pd.read_csv(datafile, index_col = 'Date')
data.index = pd.to_datetime(data.index)# We can drop the old index column:
data = data.drop(columns='Unnamed: 0')data

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

我们现在只考虑价格和 10 天 WMA 柱,以后再看均线。

当谈到线性加权移动平均线时, pandas 库没有现成的方法来计算它们。然而,它提供了一个非常强大和灵活的方法:.apply()这个方法允许我们创建任何自定义函数并将其传递给一个滚动窗口:这就是我们将如何计算我们的加权移动平均值。为了计算 10 天 WMA ,我们首先创建一个权重数组——从 1 到 10 的整数:

weights = np.arange(1,11) #this creates an array with integers 1 to 10 includedweights

看起来像是:

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

接下来,使用.apply()方法,我们通过自己的函数(a lambda 函数)计算滚动窗口中权重和价格的 点积 (窗口中的价格将乘以相应的权重,然后求和),然后除以权重之和:

wma10 = data['Price'].rolling(10).apply(lambda prices: np.dot(prices, weights)/weights.sum(), raw=True)wma10.head(20)

这给出了:

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

现在,我们想将我们的 WMA 与通过电子表格获得的进行比较。为此,我们可以在数据框中添加一个*‘我们的 10 天 WMA’*列。为了便于直观比较,我们可以使用 NumPy 的.round()方法将 WMA 级数四舍五入到三位小数。然后,我们选择要显示的价格和 WMA 列:

data['Our 10-day WMA'] = np.round(wma10, decimals=3)data[['Price', '10-day WMA', 'Our 10-day WMA']].head(20)

显示:

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

这两根 WMA 柱子看起来一样。第三位小数有一些差异,但我们可以将其归因于舍入误差,并得出结论,我们的 WMA 实现是正确的。在实际应用中,如果我们想要更严格,我们应该计算两列之间的差异,并检查它们是否太大。现在,我们保持事情简单,我们可以满足于视觉检查。

在剧情中比较我们新创造的 WMA 和熟悉的 SMA 会很有趣:

sma10 = data['Price'].rolling(10).mean()plt.figure(figsize = (12,6))plt.plot(data['Price'], label="Price")
plt.plot(wma10, label="10-Day WMA")
plt.plot(sma10, label="10-Day SMA")plt.xlabel("Date")
plt.ylabel("Price")
plt.legend()plt.show()

这表明:

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

正如我们所看到的,这两个平均值平滑了价格运动。WMA 比 SMA 更具反应性,更贴近价格:我们预计,因为 WMA 更重视最近的价格观察。此外,两个移动平均线系列都从第 10 天开始:第一天有足够的可用数据来计算平均值。

加权移动平均线可能不如它的指数兄弟那样为人所知。然而,当我们试图构建原创解决方案时,它可能是我们工具箱中的一个额外项目。在 Python 中实现 WMA 迫使我们寻找一种使用.apply()创建定制移动平均线的方法:这种技术也可以用于实现新的和原始的移动平均线。

指数移动平均线

与加权移动平均线类似,指数移动平均线( EMA )赋予最近的价格观察值更大的权重。虽然它对过去的数据赋予较小的权重,但它是基于一个递归公式,该公式在其计算中包括我们价格系列中所有过去的数据。

时间 t 的均线计算方法是当前价格乘以平滑因子 alpha (小于 1 的正数)加上𝑡−1 时间的均线乘以 1 减去 alpha 。它基本上是介于之前的均线和当前价格之间的一个值:

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

平滑因子𝛼(α)定义为:

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

其中𝑛是我们跨度中的天数。因此, 10 日均线会有一个平滑因子:

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

Pandas 包含了一个计算任意时间序列的均线移动平均线的方法:[.ewm()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.ewm.html).这个方法会满足我们的需求并计算出符合我们定义的平均值吗?让我们来测试一下:

ema10 = data['Price'].ewm(span=10).mean()ema10.head(10)

这给出了:

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

我们想将这个 EMA 系列与电子表格中的相比较:

data['Our 10-day EMA'] = np.round(ema10, decimals=3)data[['Price', '10-day EMA', 'Our 10-day EMA']].head(20)

结果是:

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

正如你已经注意到的,我们这里有一个问题:我们刚刚计算的 10 天均线和下载的电子表格中计算的不一致。一个从第 10 天开始,另一个从第 1 天开始。此外,这些值并不完全匹配。

我们的计算错了吗?还是提供的电子表格中的计算有误?都不是:这两个系列对应着两种不同的均线定义。更具体地说,用来计算均线的公式是一样的。改变的只是初始值的使用。

如果我们仔细看看 StockCharts.com网页上的指数移动平均线的定义,我们可以注意到一个重要的细节:他们在第 10 天开始计算 10 天移动平均线,忽略前几天,并用其 10 天移动平均线替换第 10 天的价格。这与我们直接使用.ewm()方法计算均线时使用的定义不同。

以下代码行创建了一个新的修改后的价格序列,其中前 9 个价格(当 SMA 不可用时)被替换为 NaN ,第 10 个日期的价格成为其 10 天 SMA:

modPrice = data['Price'].copy()
modPrice.iloc[0:10] = sma10[0:10]modPrice.head(20)

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

我们可以用这个修改后的价格序列来计算第二版的 EWM。通过查看文档,我们可以注意到.ewm()方法有一个调整参数,默认为。该参数调整权重以考虑开始期间的不平衡(如果您需要更多详细信息,请参见 熊猫文档中的指数加权窗口部分)。

如果我们想用修改后的价格序列模拟电子表格中的均线,我们不需要这个调整。我们接着设定adjust=False:

ema10alt = modPrice.ewm(span=10, adjust=False).mean()

这个新计算的均线会和电子表格中计算的一致吗?让我们来看看:

data['Our 2nd 10-Day EMA'] = np.round(ema10alt, decimals=3)data[['Price', '10-day EMA', 'Our 10-day EMA', 'Our 2nd 10-Day EMA']].head(20)

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

现在,我们做得好多了。我们得到了一个与电子表格中计算的相匹配的均线序列。

我们最终得到了两个不同版本的 EMA:

  1. ema10:这个版本使用简单的.ewm()方法,从我们的价格历史开始,但不符合电子表格中使用的定义。
  2. ema10alt:这个版本从第 10 天开始(初始值等于 10 天的 SMA),符合我们电子表格上的定义。

哪个最好用?答案是:这取决于我们的应用程序和构建我们的系统需要什么。如果我们需要一个从第一天开始的均线系列,那么我们应该选择第一个。另一方面,如果我们需要将我们的平均值与其他没有初始日值的平均值(如 SMA)结合使用,那么第二种方法可能是最好的。

第二种 EMA 在金融市场分析师中广泛使用:如果我们需要实现一个已经存在的系统,我们需要小心使用正确的定义。否则,结果可能不是我们所期望的,并可能使我们所有工作的准确性受到质疑。在任何情况下,这两个平均值之间的数字差异都很小,对我们交易或投资决策系统的影响仅限于最初几天。

让我们来看看迄今为止图表中使用的所有移动平均线:

plt.figure(figsize = (12,6))plt.plot(data['Price'], label="Price")
plt.plot(wma10, label="10-Day WMA")
plt.plot(sma10, label="10-Day SMA")
plt.plot(ema10, label="10-Day EMA-1")
plt.plot(ema10alt, label="10-Day EMA-2")plt.xlabel("Date")
plt.ylabel("Price")
plt.legend()plt.show()

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

在所有均线中, WMA 似乎反应更快,价格贴得更近,而 SMA 反应更滞后。两个版本的均线往往会重叠,主要是在最后几天。

我希望这篇文章对你有用。引入加权移动平均有助于我们学习和实现基于特定定义的自定义平均。使用指数移动平均线让我们有机会强调,确保我们用来处理价格序列的任何函数与我们对任何给定任务的定义相匹配是多么重要。

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

传统人工智能与现代人工智能。

原文:https://towardsdatascience.com/traditional-ai-vs-modern-ai-5117b469a0c9?source=collection_archive---------9-----------------------

人工智能的进化和“未来人工智能”的新浪潮。

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

source shutterstock.com

今天的 AI

毫无疑问,今天最大的流行语是人工智能或 AI。包括 Gartner、麦肯锡和普华永道在内的大多数知名研究机构都用令人惊叹的统计数据和未来预测美化了人工智能的未来。这里是普华永道的报告(2018),其中预测到 2030 年,人工智能将为全球经济贡献 15.7 万亿美元。总体生产率& GDP 将分别增长 55%和 14%。正如美国总统唐纳德·j·特朗普签署的那样,这项行政命令可以迅速证明人工智能在美国的重要性。

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

source

“齐心协力,我们可以利用世界上最具创新性的技术,让我们的政府更好地为美国人民服务。”
迈克尔·克拉特西奥斯
美国首席技术官(
来源 )

我们在日常生活中有几个例子,我们甚至没有注意到就利用了人工智能。这包括谷歌地图、Gmail 中的智能回复(2018+)、facebook 图片标签(2015 年左右)、youtube/ 网飞视频推荐(2016+)等。也有一些惊人的新闻报道概述了人工智能的意义和范围;像这个 (2019)诺瓦克·德约科维奇在温网决赛中使用人工智能,或者看看这个网站(2019 年推出)100%假的图片,看起来 100%真实的人利用深度神经网络(深度学习)。这个清单还在继续。

传统人工智能(1950 年至 2008 年)

“人工智能”一词是 1956 年在达特茅斯的一次历史性会议上创造的。在人工智能发展的早期阶段,科学家和媒体炒作围绕人工智能突破的可能性提出了乌托邦式的主张。一些科学家明确表示,在未来 20 年内,机器将做人类可能做的一切事情做的事情

“人类能做的任何工作,机器都能做。”

1965 年——赫伯特·西蒙

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

70 years history of AI by Awais Bajwa

自那以后,人工智能的发展经历了许多起伏。1973 年,英国政府在调查后发表了一份名为 Lighthill report 的报告,并查封了许多主要人工智能研究大学的资金。当时突出的人工智能方法是专家系统模糊逻辑,Prolog 和 Lisp 是 C/C++中编程语言的首选。专家系统的第一次重大突破发生在 80 年代,第一个杰出的专家系统 SID 问世了。后来,在人工智能领域出现了一些其他的挫折,随后是 IBM 的另一个突破,它的超级计算机“深蓝”在 1997 年的纽约市打败了世界冠军加里·卡斯帕罗夫。由于人工智能的概念在当时被视为失败,IBM 声称它没有在深蓝中使用人工智能,这引起了一些有趣的讨论。

请注意,所有的突破都发生在过去的 8-10 年里。反向传播算法是深度学习/神经网络的核心,于 1986 年首次推出。问题是“为什么在过去的 8-10 年(即 2009-2019 年)里,AI 已经存在了 70 多年?”。

为了得到答案,让我们跳到当前的“现代人工智能”时代。

现代人工智能 (2008+)

“数据科学”这个术语是 Linkedin &脸书的两位数据团队领导在 2008 年初创造的。( DJ 帕特尔 & 杰夫哈默巴赫)。计算机科学的这个新领域引入了高级分析,利用了统计学、概率、线性代数&多元微积分。2012 年末,人工智能领域出现了真正的突破,在一场历史性的 ImageNet 竞赛中,一个基于 CNN 的名为 AlexNet 的提交作品远远超过了所有其他竞争对手,错误率比亚军低 10.8 %。这是现代人工智能的到来,并被认为是人工智能世界新一轮繁荣的触发器。获胜的一个主要原因是利用图形处理单元 (GPU) 来训练神经网络架构。2015 年晚些时候,脸书的人工智能领袖 Yann LeCun 与其他“人工智能教父”一起努力推动深度学习及其可能性今天,多家云供应商正在为“现代人工智能”提供基于云的 GPU,而在更早的时候,他们的采用从来都不是一个选项。

GPU 从 CPU 到 GPU 的转换确实改变了游戏。它革新了技术,重新定义了计算能力和并行处理。由于高级数学计算,AI 需要高速计算能力。尤其是因为在过去的十年中,生成的数据量呈指数级增长。

因此,全世界的人工智能研究呈指数增长,在撰写本文时,人工智能研究论文的数量约为 100 篇/天

因此,我们对之前的问题有了答案:

"为什么在 AI 已经存在 70 多年的最近 8-10 年(即 2009-2019 年)里?”。

答案:数据的巨大增长,更快更便宜的处理“GPU”,以及快节奏的人工智能研究。

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

source

未来的人工智能浪潮

谷歌很仁慈,让员工把 20%的时间分配在自己的抱负和好玩的项目上。2015 年,谷歌搜索过滤器团队的成员亚历山大·莫尔德温采夫(Alexander Mordvintsev)开发了一个神经网络程序,作为一种爱好,它以梦幻般的迷幻外观震惊了他的同事。而这个项目被 Google 命名为深梦。这个项目是实验的结果,同时训练一个神经网络,并在一定范围内发挥激活功能。但即使在今天,人工智能最大的一个谜是,我们没有真正理解人工智能在内部做出决策的准确性,或者神经网络如何在 back-pro p 中学习推理。用外行人的话说,人工智能的实际推理或做出决策的偏好是一个谜,它被称为“人工智能的黑箱”

XAI

人工智能努力的新浪潮之一是打破这个黑箱,并获得决策过程的逻辑解释。这个新概念现在被称为“可解释的人工智能”或“XAI”。一旦 XAI 成功,人工智能社区将迎来新一轮人工智能浪潮。更强大和更有弹性的人工智能框架将成为可能,包括对人工智能过程和未来增长模式的可预测理解。

小数据

主要的人工智能突破正在深度学习领域发生,在深度学习中,神经网络对海量数据有着超级渴望。例如,为了训练一个模型来识别一只猫,需要输入大约 10 万张猫/非猫图像,以获得与人眼大致相当的猫的完美分类。另一个正在迅速发展的研究领域是用更少的数据集快速学习,并利用概率框架。这个新概念被称为**“小数据”**研究领域是“如何用更少量的数据训练你的机器学习模型,并得到准确的预测。”在人工智能领域,这是一个巨大的机会,预计将带来未来创新的前景。

未来人工智能研究的另外两个领域是在**“无监督学习”“****强化学习领域取得重大进展。”**我们可以通过迁移学习利用现有知识,并通过一些强化学习生成人工创建的采样数据,例如通过 GAN 网络模型。

关键要点

传统人工智能理论上已经有 70 年的历史了,但在过去的 8-10 年里已经获得了巨大的发展势头(现代人工智能)。这些现代人工智能突破促进了数据的指数级增长、快速研究和云上“按需付费”模式的廉价计算能力。

未来的 AI 浪潮是打破“AI 黑箱”,理解机器学习模型做出的决策和预测的推理。未来人工智能浪潮的另一个主要领域是从有限的数据集或“小数据”中学习。

感谢您阅读本文,希望对您有所帮助。请随时分享您的反馈,并提出您可能有的任何问题。我的 LinkedIn:Awais Bajwa

纽约市的交通事故——线性回归研究

原文:https://towardsdatascience.com/traffic-accidents-in-new-york-city-a-linear-regression-study-3af7159ef088?source=collection_archive---------25-----------------------

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

Photo by Phil Hauser on Unsplash

问题陈述

纽约市是美国最大的城市,也是世界第 28 大城市,人口约 860 万。这些人口加上每年超过 6000 英里的道路和大量的游客,确保了具有挑战性的交通状况。作为纽约市的一名司机,知道什么时候最有可能发生车祸是有益的,这样你就可以尽量避免在那个时候开车。这个时间是在上午还是下午的高峰时间?深夜还是凌晨?或者说,一天中的时间和交通事故之间没有真正的相关性吗?

数据争论

为了回答这些问题,这个项目利用了两个数据集,都可以从纽约市数据仓库获得。第一个是 NYPD 机动车碰撞-碰撞数据集,该数据集由 158 万行数据组成,详细说明了日期、时间、位置(街道名称、交叉街道和经纬度坐标)、成因、事故中涉及的车辆类型和数量以及受伤人数。

[## 机动车碰撞事故|纽约市公开数据

编辑描述

data.cityofnewyork.us](https://data.cityofnewyork.us/Public-Safety/NYPD-Motor-Vehicle-Collisions-Crashes/h9gi-nx95) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Format of the minimally processed accident DataFrame

第二个数据集是交通量计数(2014–2018)数据集。该数据集包含位置、交通方向和每小时记录的车辆数量。

[## 交通量统计(2014-2018) |纽约市开放数据

编辑描述

data.cityofnewyork.us](https://data.cityofnewyork.us/Transportation/Traffic-Volume-Counts-2014-2018-/ertz-hr4r) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Format of the minimally processed traffic volume DataFrame

在这项研究中。我们要问的问题广泛涉及整个纽约的所有事故,因此不需要事故的具体地点或车辆数量。我们将转换和汇总事故(和计数),给出每小时的计数。事故数据集中的每个条目都与一个事故有关,因此我们可以按日期和时间进行排序,并将它们聚合起来以获得计数。交通量数据已经按小时和天进行了分类,我们只需对这些特征进行分类,并对所有不同道路的观测数据进行计数。

体积数据

通过上面的链接下载的. csv 文件中的体积数据被导入到 pandas 数据帧中。这些数据是以杂乱的格式提供的——每个小时都是包含计数的单独一列。单独的小时列被合并成一个时间列,每个时间跨度减少到一个小时,表示小时窗口的开始。

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

Final format of the traffic volume DataFrame. All data has been aggregated by hour

因为我们对全市的交通感兴趣,所以每天和每个小时都被聚合起来,以提供一个包含日期、时间和车辆数量的新数据帧。这是之前使用的数据集。

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

Average traffic volume for each hour across the entire dataset showing a peak in traffic volume at 8 am and again at 5pm, corresponding to morning and evening rush hours

事故数据

事故数据被导入,列标题以类似于体积数据的方式转换。数据集中的每条线代表向 NYPD 报告的事故的时间和位置。

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

Time course of the total number of accidents per month

通过按日期和小时分组并对结果行进行计数,生成了一个新的数据帧。这给出了与交通量数据格式相似的数据帧:交通量;日期;小时;和事故计数。

探索性数据分析

体积数据

对体积数据的初步研究表明,值> 0 的计数非常稀少,这在原始数据格式中并不明显。大约 73%的条目是 0 值。当排除所有 0 值时,计数直方图显示最小的箱包含最多的计数。每个聚类的开始日期和结束日期是通过遍历日期并检查计数是否存在来确定的。一旦定义了日期区域,超过每天 25,000 次计数的任意阈值的值将被复制到新的数据帧中。这提供了 7,944 个交通量数据点用于与交通事故数据相结合。

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

Time course of the number of counts over time. Regions of high counts are separated by low or zero count periods. The orange line corresponds to the threshold that was set for data that was used in this study

绘制每天的小时计数显示了双峰分布,这是可以预期的,因为交通流量通常在每天早晚高峰时达到两次峰值。

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

事故数据

事故数据也按日期和时间分组,并创建一个新的数据框架,记录日期和时间,包括记录的事故数量。绘制这些数据会导致与交通量数据有些相似的双峰分布。

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

既然我们已经以我们想要的形式获得了两个数据集,我们就可以使用两个数据集都有计数数据的所有日期和时间。体积数据是限制数据,并且基于阈值选择以提供 7,944 个数据点。为了获得相应小时的体积数据的事故数据,我们执行了体积数据与事故数据的内部合并,只保留包含匹配日期和时间的行。

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

Final form of the DataFrame containing combined traffic volume and accident counts

快速检查显示,我们的最终数据帧包含日期、时间、体积和事故列,以及 7,944 行。以这种方式按小时对事故数据进行分组导致将 179,026 个单独的事故聚集到 7,944 个每小时的时间点。

由于车流量和交通事故的计数相差悬殊(这是好事!)每小时最大值的分数通过将每小时计数除以每小时最大计数来计算。这使得数据集之间可以进行直接比较。当重叠时,交通和事故数据显示类似的模式。

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

Left — overlay of the fraction of max traffic volume and accident data showing similar trends. Right — scatter plot of the fraction max volume verses fraction max accidents.

当我们将这些未转换的数据相互作图时,我们观察到一种大致线性的关系。观察到这一点,我们提出了这个问题;我们能不能用一个线性回归模型来代表整个纽约的交通事故和交通流量之间的关系。线性回归可以说是可用的最简单的模型之一

我们建立了一个线性回归模型,看看它在复制数据方面有多有效。这个模型也允许正则化来确定重要的系数。这些系数虽然对确定回归线很重要,但也可以表明一天中事故风险增加或减少的时段。考虑到这是计数数据,我们还可以建立泊松回归模型进行比较。

模型结构

在这项工作中,我们采用了一个丰富的数据集,并随着时间的推移将其提取为简单的计数。线性回归可以说是最简单的机器学习算法之一,所以我们将把它应用到我们的问题中,看看一个简单模型的预测能力如何。

1.线性回归

现在我们有了一个包含日期、时间、体积计数和事故计数的数据框架,我们可以开始构建我们的模型了。为了回答我们的第一个问题,事故数量仅仅是交通量的函数吗?我们忽略了日期和时间,仅将模型拟合到交通量。我们使用在 scikit-learn 中实现的普通最小二乘(OLS)线性回归模型。五重交叉验证(CV)的结果给出了 0.07 的平均 R 值,表明事故数量与交通量本身没有太大的相关性。

我们尝试的第二个模型是另一个 OLS 线性回归,这一次数据按小时聚合,每个小时用虚拟变量表示。该日期也由对应于数据集中第一个日期之后的天数的整数表示。该模型表现得更好,平均 5 倍 CV R 值为 0.63。考虑到数据取自纽约市所有的事故,交通量仅从统计的街道子集推断,这是相当了不起的。

残差图显示它们以 0 为中心,但模式应该是完全随机的。这些值向较大的 X 值呈扇形散开,表明它们存在一些异方差。预测值的直方图显示它们再次以零为中心,有一些向左倾斜。

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

左上图显示了实际小时事故的分布与正态分布。在大多数情况下,数据遵循正态分布,从数据偏离左手边的对角线可以看出左偏斜。右图显示了预测的事故分布与正态分布的对比。上限值偏离对角线可能表明模型分散不足。

2.泊松回归

泊松回归是另一种广义线性模型,用于对计数数据建模。交通流量和交通事故是计数数据的示例,即只能是非负整数值的数据。例如,发生-3 次或 1.5 次事故是没有意义的。泊松回归的一个假设是响应变量 Y 遵循泊松分布。我们再次在 statsmodel 模块中使用广义线性模型。将泊松回归应用于我们的数据,我们立即看到 chi2 值为 1.86e4。如果数据遵循泊松分布,方差将等于均值,从而使 chi2 值更接近 1。显然,这不是该数据的最佳模型。我们可以尝试负二项式回归,它是泊松模型的一种推广,具有一个宽松的要求,即方差不必等于均值。

3.负二项式回归

负二项式模型类似于泊松模型,增加了一个变量α,以降低严格的方差要求。泊松回归过程中发现的λ值用于确定最佳 alpha 值(有关教程,请参见:https://towardsdatascience . com/negative-binomial-regression-f 99031 bb 25 b 4)。发现α值为 0.071,当使用该值进行负二项式回归时,结果模型显示出统计显著性,这改进了泊松回归的模型。

4.套索回归

我们感兴趣的第二个问题是,是否在一天中的某个特定时间发生事故的风险更高。测试这一点的一种可能方式是使用正则化来执行特征选择。为此,我们将 L1 正则化应用于线性回归。Lasso 或 L1 正则化将不重要的系数缩小到 0,从而为更简洁的模型选择最重要的特征。通过将 lasso 正则化应用于我们的线性模型,最慢接近 0 的特征对于模型的拟合是最重要的。我们选择α值为 0.001、0.25 和 0.5。应用较高的 alpha 值会将更多的系数减少到 0。应用 0.25 的 alpha 值,R 值减少到 0.52。24 个小时系数中有 7 个降低到 0,表明这些对模型的拟合最不重要。其余系数中,最高值出现在下午 2-6 点,峰值出现在下午 4 点,其次是上午 8 点。

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

这些系数很好地对应了早晚高峰时间。不出所料,交通量的系数在 5.6e-5 处为最小值,这与仅拟合交通量时模型的 R 值较差相一致。如果我们观察 lasso 回归的概率图,我们会发现尽管 R 值降低了,但数据还是具有更正态的分布。

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

评估模型

将每个回归的测试集的预测与一天的事故数据进行比较,可以发现所有模型都显示出非常一致的预测。这些模型似乎再现了总体趋势,但普遍高估了事故数量。预测中的偏差,至少对于线性和 lasso 回归,反映在它们适度的 R 值中。同样显而易见的是,lasso 回归具有较低的 R 值,因为它在特定区域而不是整体上失去了预测能力。

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

Overlay of predicted accidents on accidents per hour for a selected day

当我们对测试集中所有每小时的事故计数进行平均并将模型与之进行比较时,我们当然会看到极好的一致性,这表明模型捕捉到了数据的平均属性。

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

Overlay of predicted accidents on average accidents per hour

结论

3.5 年内的 179,026 起事故按小时汇总,并与交通量数据相匹配,以提供包含 7,944 个每小时数据点的最终数据集。

线性回归表明,交通量本身是纽约市交通事故的不良预测因素。进一步 L1 正则化强调的回归系数显示,下午 4 点是最有可能发生事故的时间。

这种模式的局限性包括:

  • 从道路子集推断整个纽约都会区的交通量。为了提高模型的准确性,参与统计的街道可以与事故数据相匹配,而不是在整个 302 平方英里的城市中进行概化。
  • 交通量数据中观察到的计数可变性表明测量不一致,因此可能导致计数不准确。
  • 按小时汇总不考虑交通模式的波动,例如正常交通的季节性或月度变化。

考虑这些因素中的任何一点都可以提高我们模型的准确性。

内容概要:本文深入探讨了AMESim仿真平台在电动汽车(EV)热泵空调系统设计与优化中的应用。首先介绍了AMESim的基础建模方法,如构建制冷循环模型中的压缩机、蒸发器和冷凝器等组件,并详细解释了各部件的工作原理及其参数设定。接着重点阐述了EV热泵空调系统的特殊之处,即不仅能够制冷还可以在冬季提供高效的制热功能,这对于提高电动汽车在寒冷条件下的续航里程和乘坐舒适性非常重要。文中给出了几个具体的案例,包括通过改变压缩机运行频率来进行性能优化,以及针对低温环境下热泵系统的控制策略,如四通阀切换逻辑、电子膨胀阀开度调节等。此外,还讨论了热泵系统与其他子系统(如电池温控)之间的协同工作方式,强调了系统集成的重要性。最后分享了一些实用的经验技巧,例如如何避免仿真过程中可能出现的问题,怎样评估系统的整体性能等。 适合人群:从事汽车工程、暖通空调(HVAC)领域的研究人员和技术人员,特别是关注新能源汽车热管理系统的专业人士。 使用场景及目标:适用于希望深入了解电动汽车热泵空调系统特性的工程师们,旨在帮助他们掌握基于AMESim进行系统建模、仿真分析的方法论,以便更好地指导实际产品研发。 阅读建议:由于涉及到较多的专业术语和技术细节,建议读者具备一定的机械工程背景知识,同时配合官方文档或其他参考资料一起研读,以加深理解。
期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值