TowardsDataScience 博客中文翻译 2019(二百六十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何使用改变游戏规则的人工智能来提高决策质量

原文:https://towardsdatascience.com/how-to-use-game-changing-ai-to-boost-decision-quality-d7f6c1b28ba2?source=collection_archive---------24-----------------------

是时候增强人类在商业决策中的能力了

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

source: rarehistoricalphotos.com

注:本文与 诺贝特·多勒 合著。

围绕人工智能在商业应用中的潜在价值,存在大量炒作。根据我们的行业经验,大多数炒作都是被误导的。在许多成功的故事中,“人工智能英雄”只是作为一个抛光工具,用于调整现有的流程。这不是因为人工智能的局限性——而是因为缺乏想象力。

我们应该围绕最新的人工智能重新设计我们的业务,而不是把人工智能作为一个附加产品。我们将展示游戏 AI 特别适合这一点。业务流程可以被视为游戏。决策就像游戏中的走法。赢得比赛是最新的人工智能所擅长的。

与其他任何技术相比,游戏人工智能更有潜力推动商业变革。

这篇文章是一系列案例研究的序幕。在每项研究中,我们将分享一个游戏人工智能支持复杂商业决策的例子。在进入这些研究的细节之前,我们先从这个介绍开始。并展示为什么游戏人工智能对商业决策有如此大的意义。

让我们开始吧。

数据与决策

在关于商业人工智能的辩论中,很多焦点都集中在数据上,但数据本身并不产生价值。企业通过将数据转化为决策来创造价值。引用的话 Cassie Kozyrkov ,谷歌决策情报主管:

“数据是美丽的,但决策才是重要的。正是通过我们的决定——我们的行动——我们影响着我们周围的世界”。

正是通过我们的决策,我们创造价值,或者把价值留在桌面上。

高赌注,古老的工具

现在想想你自己在复杂商业决策中的经历。你曾经做过或支持过让你深感不适的决定吗?对分析没有涵盖所有选项感到紧张?知道有更多的观点和风险需要了解?你的信心因为输入数据的不确定性而受到影响?最痛苦的是,意识到时间已经不多了?我们确实有。

许多商业领袖都认识到了这种感觉。然而,大多数人都承认,重要的决策是基于不完整的分析。他们已经接受了他们的决定是由直觉、共识和人类偏见驱动的。

因此,如果你在自己的企业中处理复杂的决策,问问自己这个问题。如果 Excel 是您拥有的最复杂的工具,您对自己的决策质量有多少信心?如果你手机里的技术比驱动你决策的工具更先进,那一定是出了问题。

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

Image by ElisaRiva from Pixabay

参加比赛

决策和优化决策的策略已经被博弈论广泛研究。对一个游戏理论家来说,游戏就像是:

“……两个或更多人之间的互动,互动的结果取决于每个人的所作所为,每个人对不同的结果都有不同程度的快乐。”

现在——这听起来像大多数的商业互动。对于博弈理论家来说,商业决策代表了博弈中的一步棋。多年来,赢得比赛是人工智能一直擅长的。

所以,我们想象的是这样的:

我们能否利用游戏 AI 做出制胜的商业决策?

事实证明,你可以。

我们将展示如何将商业问题变成游戏。用人工智能掌握这些游戏会导致超出人类能力的决策质量。这是非常宝贵的——尤其是在高风险的商业决策中。

用人工智能控制游戏——简史

通过游戏及其复杂性的镜头来考虑人工智能的历史是很迷人的。随着人工智能的发展,人工智能机器人已经学会掌握更复杂的游戏——并支持更复杂的决策。对于那些感兴趣的人,我们推荐Andrey Kurenkov 的《从人工智能到 AlphaGo 的游戏简史》。

跳棋和国际象棋是 IBM 瞄准的第一个展示人工智能能力的棋盘游戏。1996 年,深蓝是第一台打败国际象棋世界冠军的计算机。深蓝的技能等级低于顶级人类。然而,它分析数百万步棋的能力确保了对加里·卡斯帕罗夫的胜利。

人工智能研究的下一个著名展示是围棋。围棋是出了名的难,因为棋盘上有大量的位置——远远超过了国际象棋。谷歌旗下的 DeepMind 创造了 AlphaGo,在 2016 年击败了世界顶级棋手之一。然后他们继续前进,建造了 AlphaGo Zero,以 100 比 0 击败了它的前身。AlphaGo 是围绕人类经验设计的,Zero 完全通过自我对弈掌握了围棋。

尽管棋盘游戏并不总是反映真实世界的决定。他们是回合制的,所以在变化的环境中做决定没有压力。此外,在棋盘游戏中,人工智能拥有关于环境的完整信息。没有基于未知因素的猜测或冒险。

视频游戏《星际争霸》成为人工智能研究的下一个“重大挑战”。在星际争霸中获胜需要玩家平衡短期和长期目标。它还要求适应意外情况的能力。2018 年末 DeepMind 的 AlphaStar 是第一个在这场比赛中击败顶级职业选手的 AI。

接下来,在 2019 年 7 月,由脸书和卡耐基梅隆大学研究人员组成的团队构建了一个名为 Pluribus 的人工智能。Pluribus 在 6 人扑克游戏中击败了顶级职业玩家,表明了人工智能研究的又一次突破。这场胜利的不同之处在于人工智能学习如何虚张声势的能力——这种技能被认为是人类特有的。此外,Pluribus 在笔记本电脑上运行,与深蓝的超级计算机相距甚远。

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

Photo by Michał Parzuchowski on Unsplash

Big Tech 了解游戏人工智能的商业潜力

那么,为什么像 IBM、谷歌和脸书这样的公司在开发游戏人工智能上投入如此多的时间和金钱呢?财富注:

“Pluribus 的发展……对商业世界有着潜在的影响,就像在扑克中一样,人们需要在巨大的不确定性中做出战略选择,而且结果往往不是零和的。”

为 Pluribus 提供动力的相同 AI 可能在现实世界的战略决策中胜过人类。例如,政治谈判和合同投标与扑克有许多相似之处。他们的共同点是,AI 要冒险,要为长期收益做出短期牺牲。

DeepMind 应用 AlphaGo Zero 技术提高英国电网效率。它应用同样的算法来降低谷歌数据中心的电力成本。

Big Tech 明白,游戏人工智能在现实世界的应用中具有巨大的潜在价值。在复杂的决策中帮助人类是一个明显的高价值应用。为什么?因为许多公司仍然依赖有缺陷的人为分析来做出高风险决策。

决定质量…还是不?人类决策分析中的缺陷

我们大部分职业生涯都在能源行业工作。这个行业的决策几乎总是非常复杂。决策者经常面临许多选择、不确定性、风险、意见和价值驱动因素。而做出错误决定的后果往往非常高。

因此,为了帮助决策者,该行业采用了一种工具来评估决策的质量。决策质量框架是一种分析决策的结构化方法。它是在 60 年代发展起来的,可以认为它就像一份清单,列出了导致决策的所有方面。

有这样一个清单是很好的,但是如果我们用不良或不完整的输入填充它,那么它的用处是有限的。我们经常依赖缓慢、迭代和手动的工作流。我们的工作流程阻止我们探索完整的选项空间。它们限制了我们对风险和价值权衡的理解。我们通常有一个过时的工具集,而且更多的时候,我们引入了各种类型的偏见,时间不够了。

让我们看一个例子。

现实世界中有缺陷的决策

假设你负责一个炼油厂的维护。您面临着 50 项需要安排的独立维护活动。任何时候只能执行一个。这为 10⁶⁴的规划团队提供了不同的排列方式。每项活动在安全和生产关键程度方面都有不同的优先级。有些活动需要专业技能,动员成本很高。更糟糕的是,你正面临持续的检查。这些可能会导致优先级的改变或额外的日常维护活动。这关系到什么?次优规划可能会导致重大的安全风险、更高的成本或不必要的延期。对于一个每天产生数百万美元收入的工厂来说,这是一件大事。

大多数工业资产的维护范围包括 50 多项活动。排列的数量很容易超过围棋中可能的棋盘组合。然而,您的规划团队拥有的最复杂的工具是 Excel 电子表格。

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

source: xkcd

所以作为一名维护经理,你的工作就是决定最佳的维护策略。遵循决策质量原则,您的目标是探索替代方案。您希望了解安全性、成本和延期之间的权衡。然而,从你的规划团队那里问这个问题是不可能的——他们并没有准备好给出这些答案。

那你是做什么的?你依赖规划者的直觉和经验(以及偏见)。每个人都知道由此产生的计划是次优的,但这是可以接受的。没人知道如何改进— 因为没人知道什么是好的样子

围绕新技术重新思考工作

许多公司仍然依赖与 80 年代相同的工具和流程来支持复杂的决策。Excel 仍然是支持决策的主要工具。正如汤姆·古德温 写的:

“尽管我们谈论人工智能抢走了工作,但现实是,大约 10 年前,几乎所有主要使用 Excel 的工作都可能被初级软件取代或增强。问题是,我们将技术添加到旧流程中,而不是围绕新技术重新思考工作应该是什么。”

想象一下,如果围绕最新技术重新设计 T2,工作会有多么不同。那将是多么令人满意,有趣和有趣。团队将有更多的时间进行战略思考。他们将能够测试权衡,并真正帮助决策。决策会有更高的质量,计划会产生更多的价值吗?当然——而且经常是逐步改进。

这对你意味着什么?挑战现状。

假设你今天开了一家新公司。你需要好的计划来做战略决策。你也知道你的规划团队面临的排列比宇宙中的原子还要多。你会给他们一个 Excel 电子表格作为他们最好的工具吗?或者,你会选择更复杂的东西来帮助你做决定吗?

我们建议您将最复杂的业务问题带到绘图板上。给自己一些思考的空间。挑战自己如何从根本上重新设计和改进底层流程。并围绕最新技术重新设计它们。

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

Image by mohamed Hassan from Pixabay

如果大科技正在使用游戏人工智能来做出更好的决策,为什么你不会呢?

本文是一个系列的介绍。在下一篇文章中,我们将分享一个游戏人工智能支持商业决策的案例研究。商业决策在很多方面都像复杂的游戏。同样的技术可以提高决策速度和质量。

当然,在组织的各个层面都会有变革的阻力。因此,我们也想谈谈变革管理。对“裁员”的恐惧会出现在许多专业人士的脑海中。再次引用凯西·科兹尔科夫的话:

“…如果你认为人工智能让人类出局了,那就再想想吧!所有技术都是其创造者的反映,大规模运行的系统会放大人类的缺点,这就是为什么发展决策智能技能对于负责任的人工智能领导如此必要的一个原因。”

大多数复杂的决策没有数学上的最优解。风险与回报之间的权衡常常是选择的驱动力。经验、引导和直觉将继续在决策中发挥作用。人类将需要保持控制。然而,正确的人工智能可以帮助揭示完整的选项空间。它能把不同的意见转化为可供选择的方案。它可以量化这些权衡。

由于游戏在推动人工智能研究方面的作用,人工智能已经可用。

我们很想听听你的看法。请随时联系 info@whitespaceenergy.eu 或在 LinkedIn 上发表评论。

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

Photo by Josh Couch on Unsplash

如何在 Python 中使用 ggplot2

原文:https://towardsdatascience.com/how-to-use-ggplot2-in-python-74ab8adec129?source=collection_archive---------3-----------------------

Python 的图形语法

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

介绍

由于严格实现了图形的语法,ggplot2 提供了一种非常直观和一致的方式来绘制数据。ggplot2 的绘图方法不仅确保每个图包含某些基本元素,而且还在很大程度上简化了代码的可读性。

但是,如果您经常使用 Python,那么实现图形的语法会非常具有挑战性,因为在流行的绘图库中缺乏标准化的语法,如 matplotlib 或 seaborn。如果你仍然想利用图形的语法,那么 Python 包 plotnine 为你提供了另一种选择。

图形的语法

如果您不熟悉图形的语法,这里有一个快速概述:

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

Main Components of the Grammar of Graphics

正如您所看到的,从数据开始,有几个组件组成了图形的语法。在确定您想要可视化的数据之后,您必须指定您感兴趣的变量。例如,您可能希望在 x 轴上显示一个变量,在 y 轴上显示另一个变量。第三,你必须定义你想要使用什么类型的几何对象(简称 geom)。这可以是从条形图到散点图或任何其他现有的绘图类型。

前三个部分是强制性的。没有数据,就没什么好出图的。如果没有轴定义,也没有什么可绘制的。最后,如果没有定义一个几何对象,你只会看到一个空的坐标系。构成图形语法的其余组件是可选的,可以被实现来改善可视化。面是指子图的规格,也就是说,在单独的图中将数据中的几个变量一个接一个地绘制出来。统计转换主要指在图中包含汇总统计数据,如中位数或百分位数。坐标描述了可供您使用的不同坐标系。最常用和默认的坐标系是笛卡尔坐标系。根据您想要绘制的数据结构,较少使用的坐标系(如极坐标系统)可能会提供更好的数据可视化方式。最后,主题提供了各种选项来设计绘图的所有非数据元素,如图例、背景或注释。

虽然有许多可视化图形语法的方法,但我特别喜欢我在上面创建的一个,因为它暗示了这些层的可加性以及它们建立在彼此之上的事实。如果您曾经使用过 ggplot2,您会对其语法中的“+”很熟悉,它象征着与上述相同的思想。

普洛特宁

plotnine 是一个 Python 包,允许您使用类似 ggplot2 的代码来实现图形语法。通过这样做,就像在 ggplot2 中一样,您能够专门将数据映射到组成可视化的可视对象。这使您能够提高代码的可读性和结构。虽然您可以将 matplotlib 的样式设置为 ggplot,但是您不能像在 ggplot2 中那样在 matplotlib 中实现图形语法。

装置

在开始之前,你必须安装 plotnine。和往常一样,这样做有两个主要选项:pip 和 conda。

测绘

安装 plotnine 后,您可以使用图形语法开始绘图。让我们从构建一个非常简单的情节开始,只使用三个必要的组件:数据、美学和几何对象。

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

Building a plot using the grammar of graphics

可以看到,语法非常类似于 ggplot2。首先,我们指定数据源。在我们的例子中,我们使用的数据是经典的 mpg 数据集。接下来,我们定义变量“class”将显示在 x 轴上。最后,我们说我们希望使用一个大小为 20 的条形图来可视化我们的数据。让我们看看完整的代码和结果图:

上面的代码将产生以下输出:

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

虽然这是一个好的开始,但看起来还不是很好。让我们用图形语法的其他成分来美化我们的情节。

例如,我们可以使用 coord_flip() 翻转轴,并使用 labs() 定制绘图和轴标题,以改进我们的绘图。使用上面的代码块,我们的绘图将如下所示:

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

绘制多维数据

除了基本的绘图之外,您还可以做几乎所有在 ggplot2 中可以做的事情,比如绘制多维数据。如果您希望可视化三个变量之间的关系,您可以为二维图增加美感:

颜色添加到美学中将促使 plotnine 在其 x 轴上使用 displ (发动机排量,以升为单位)并在其 y 轴上使用 hwy (公路里程/加仑)显示二维图,并根据变量 class 对数据进行着色。我们还将几何对象切换到 geom_point() ,这将给我们一个散点图而不是条形图。让我们来看看那会是什么样子:

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

结论

如您所见,plotnine 为您提供了利用 Python 中图形语法的能力。这增加了代码的可读性,并允许您专门将部分数据映射到可视对象。如果你已经熟悉了 ggplot2,那么你就不需要学习任何新的东西来掌握 plotnine。如果没有,这里有一个到 ggplot2 网站的链接,在这里你可以找到更多关于图形语法和所有类型的几何对象的信息。

如何使用 Google 语音转文本 API 转录长音频文件?

原文:https://towardsdatascience.com/how-to-use-google-speech-to-text-api-to-transcribe-long-audio-files-1c886f4eb3e9?source=collection_archive---------0-----------------------

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

Credit: Pixabay

语音识别是一项有趣的任务。现在市场上有很多 API 资源,这使得用户更容易选择其中一个。然而,当涉及到音频文件,尤其是呼叫中心数据时,这项任务就变得没什么挑战性了。让我们假设一次呼叫中心的谈话大约需要 10 分钟。对于这种场景,市场上只有少数可用的 API 资源可以处理这种类型的数据(谷歌亚马逊IBM微软NuanceRev.ai开源 Wavenet开源 CMU Sphinx )。在本文中,我们将详细讨论 Google 语音转文本 API。

谷歌语音转文本 API

Google 语音转文本有三种基于音频内容的 API 请求。

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

Credit: GCP

同步请求

音频文件内容应该大约为 1 分钟,以便进行同步请求。在这种类型的请求中,用户不必将数据上传到 Google cloud。这为用户提供了将音频文件存储在他们的本地计算机或服务器中并引用 API 来获取文本的灵活性。

异步请求

音频文件内容应该约为 480 分钟(8 小时)。在这种类型的请求,用户必须上传他们的数据到谷歌云。这正是我们将在本文中讨论的内容。

流式请求

它适用于用户直接对着麦克风说话并需要转录的流数据。这种类型的请求适合聊天机器人。同样,对于这种类型的请求,流数据应该大约是一分钟。

初始设置

在开始之前,您需要做一些初始设置。请点击下面的链接完成设置。

[## 快速入门:使用客户端库|云语音转文本 API | Google Cloud

setvar launch _ type % } API { % endsetvar % } { % setvar launch _ name % }云语音转文本 API{% endsetvar %} {% setvar…

cloud.google.com](https://cloud.google.com/speech-to-text/docs/quickstart-client-libraries)

我还写了一篇文章详细解释了第一步。

[## 使用 Python 创建自己的基于语音的应用程序

基于语音的设备/应用正在大量增长。今天,有谷歌助手,Alexa 把我们的声音作为…

medium.com](https://medium.com/@sundarstyles89/create-your-own-google-assistant-voice-based-assistant-using-python-94b577d724f9)

一旦创建了 API 客户机,下一步就是创建一个存储桶。您可以使用下面的链接创建一个存储桶。对于这个项目,我将这个桶命名为“callsaudiofiles”。

[## 谷歌云平台

Google 云平台让您可以在同一基础设施上构建、部署和扩展应用程序、网站和服务…

console.cloud.google.com](https://console.cloud.google.com/storage/)

让我们把一些语音转换成文本

步骤 1:导入必要的包

这里的**‘file path’变量包含了音频文件在你的本地计算机中的位置。因此,您可以在路径中存储多个音频文件,它仍然会工作。在‘输出文件路径’中,所有由谷歌云创建的文本都将被存储在你的本地计算机中。此外,在‘bucket name’**变量中提供上一步中创建的存储桶名称。你不需要把你的文件上传到谷歌存储器。我们将在后面的部分讨论如何上传到 Google storage。

步骤 2:音频文件编码

谷歌语音到文本处理一些特定类型的音频编码。你可以在下面的链接中详细阅读。

[## 音频编码简介|云语音转文本 API | Google Cloud

谷歌云提供安全、开放、智能和变革性的工具,帮助企业实现现代化,以适应当今的…

cloud.google.com](https://cloud.google.com/speech-to-text/docs/encoding) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Credit: GCP

这限制了我们在使用 Google 语音转文本 API 之前转换不同格式的音频文件。

我在下面提供了一个将 mp3 文件转换成 wav 文件的示例代码。

步骤 3:音频文件规格

另一个限制是 API 不支持立体声音频文件。因此,用户需要在使用 API 之前将立体声文件转换为单声道文件。此外,用户必须提供文件的音频帧速率。下面的代码可以帮助你找出任何的**。wav’** 音频文件。

第四步:上传文件到谷歌存储

正如我们之前讨论的,为了执行异步请求,文件应该上传到 google cloud。下面的代码将完成同样的任务。

第五步:删除谷歌存储中的文件

语音转文本操作完成后,文件就可以从 Google cloud 中删除了。下面的代码可以用来从谷歌云中删除文件。

第六步:转录

最后,下面的转录函数执行所有必要的操作来获得最终的抄本。它调用前面步骤中描述的其他函数,并将抄本存储在变量**‘抄本’**中。

这里需要注意的一点是超时选项。这是转录功能将主动转录当前音频文件的秒数。如果音频文件秒数大于此处提供的数字,您可以将此设置调整为一个较大的数字。

第七步:写成绩单

语音到文本的操作完成后,您需要将最终的文本存储在一个文件中,下面的代码可以用来执行同样的操作。

第八步:执行你的代码。等着看笔录吧

下面的代码开始执行。在**文件路径中可以有多个音频文件。**它按顺序执行每个文件。

生成的最终文本如下所示。

I was on the other roommate had to leave before I got half of them by him. I guess no way to get a hold back to you. Alright. Yeah, kinda I mean like what? What are you I have to I have to play with the other guys. So yeah, go ahead and I with me I can let my people like the one that you were calling me, but I go ahead and do it cuz I'm sure he's not work for lunch, but they just had them or is it 10 o'clock? I want to go ahead and get out with me. Call me. I understand. They probably to talk about Mom and I need to call back or maybe I can just figured after taxes advertises. It's 110 feet in so I guess alright. Well shoot let me know and then maybe I'll just minus the weather. Okay. Well so much for your help. Like I said, no problem. Alright, you have a good day. Okay. Bye.

如果我需要在我的成绩单中分开发言者,该怎么办?

说话人二进制化是在音频文件中区分说话人的过程。事实证明,你可以使用谷歌语音到文本 API 来执行说话人二进制化。Google 在扬声器二进制化后生成的最终文本如下所示。

speaker 1: I was on the other roommate had to leave before I got half of them by him I guess no way to get a hold back to you alright
speaker 2: yeah kinda I mean like what what are you I
speaker 1: have to I have to play with the other guys so yeah go ahead and I with me I can let my people like the one that you were calling me but I go ahead and do it cuz I'm sure he's not work for lunch but they just had them or is it 10 o'clock I want to go ahead and get out with me
speaker 2: call me I understand
speaker 1: they probably to talk about Mom and I need to call back or maybe I can just figured after taxes
speaker 2: advertises it's 110 feet in so I
speaker 1: guess alright well shoot let me know and then maybe I'll just minus the weather okay well so much for your help like I said no problem alright you have a good day okay bye

为此,您需要对前面描述的代码进行一些更改。让我们从包导入开始。

现在,我们来谈谈转录部分的变化。

这两个项目的完整代码可以在 Github 链接中找到。

玩得开心!

如何通过 Maingear 的新数据科学 PC 使用 NVIDIA GPUs 进行机器学习

原文:https://towardsdatascience.com/how-to-use-gpus-for-machine-learning-with-the-new-nvidia-data-science-workstation-64ef37460fa0?source=collection_archive---------3-----------------------

是的,你没看错:是机器学习,不是深度学习

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

深度学习使我们能够执行许多类似人类的任务,但是如果你是一名数据科学家,并且你不在 T2 的 FAANG T3 公司工作(或者如果你没有开发下一个人工智能初创公司),你很可能仍然使用好的和旧的(好的,也许不是 T4 的 T5 旧的)T6 机器学习 T7 来执行你的日常任务。

深度学习的一个特点是计算量非常大,所以所有主要的 DL 库都利用 GPU 来提高处理速度。但是,如果你曾经因为不从事深度学习而感到被排除在派对之外,那种日子已经过去了:现在有了 RAPIDS 库套件,我们可以完全在 GPU 上运行我们的数据科学和分析管道**。**

在本文中,我们将讨论其中的一些 RAPIDS 库,并进一步了解 Maingear 的新型数据科学 PC。

为什么人们会使用 GPU 呢?

一般来说,GPU 速度很快,因为它们有高带宽存储器和执行浮点运算的硬件,其速度明显高于传统 CPUs】。GPU 的主要任务是执行渲染 3D 计算机图形所需的计算。

但是在 2007 年,NVIDIA 创造了 CUDA。CUDA 是一个并行计算平台,为开发者提供 API,允许他们构建能够利用 GPU 进行通用处理的工具。

GPU 已经发展成为高度并行的多核系统,可以非常高效地处理大块数据。在并行处理大块数据的情况下,这种设计比通用中央处理器(CPU)更有效

处理大块数据基本上是机器学习做的事情,所以 GPU 对于 ML 任务来说就派上用场了。TensorFlow 和 Pytorch 是已经使用 GPU 的库的例子。现在有了 RAPIDS 库套件,我们还可以操纵数据帧,并在 GPU 上运行机器学习算法

湍流

RAPIDS 是一套开源库,其中集成了流行的数据科学库和工作流来加速机器学习【3】。

一些 RAPIDS 项目包括 cuDF ,一个类似熊猫的数据帧操作库; cuML ,一个机器学习库的集合,将提供 sciKit-learn 中可用算法的 GPU 版本;cuGraph,一个类似 NetworkX 的加速图形分析库[4]。

Pandas 和 sciKit-learn 是两个主要的数据科学库,所以让我们了解更多关于 cuDFcuML 的知识。

cuDF:数据帧操作

cuDF 为数据帧操作提供了一个类似 pandas 的 API,所以如果你知道如何使用 pandas,你就已经知道如何使用 cuDF。如果你想在多个 GPU 上分布你的工作流,还有 Dask-cuDF 库。

我们可以像熊猫一样创造系列和数据框架:

import numpy as np
**import cudf**s = **cudf.Series(**[1,2,3,None,4]**)**df = **cudf.DataFrame(**[('a', list(range(20))),
                     ('b', list(reversed(range(20)))),
                     ('c', list(range(20)))]**)**

也可以将 pandas 数据帧转换成 cuDF 数据帧(但是不建议这样做):

import pandas as pd
**import cudf**df = pd.DataFrame({'a': [0, 1, 2, 3],'b': [0.1, 0.2, None, 0.3]})
gdf = **cudf.DataFrame.from_pandas(**df**)**

我们也可以做相反的事情,将 cuDF 数据帧转换成 pandas 数据帧。

import cudfdf = **cudf.DataFrame(**[('a', list(range(20))),
                     ('b', list(reversed(range(20)))),
                     ('c', list(range(20)))]**)**pandas_df = df.head().**to_pandas()**

或者转换成 numpy 数组:

import cudfdf = cudf.DataFrame([('a', list(range(20))),
                     ('b', list(reversed(range(20)))),
                     ('c', list(range(20)))])df.**as_matrix()**df['a'].**to_array()**

我们对数据帧所做的其他事情(查看数据、排序、选择、处理缺失值、处理 csv 文件等等)都是一样的:

import cudfdf = **cudf.DataFrame**([('a', list(range(20))),
                     ('b', list(reversed(range(20)))),
                     ('c', list(range(20)))]**)**df.**head**(2)
df.**sort_values**(by='b')
df['a']
df.**loc**[2:5, ['a', 'b']]s = cudf.Series([1,2,3,None,4])s.fillna(999)df = cudf.**read_csv(**'example_output/foo.csv'**)** df.**to_csv(**'example_output/foo.csv', index=False**)**

关于性能,仅举一个例子,用熊猫加载一个 1gb 的 csv 文件需要 13 秒,用 cuDF 加载需要 2.53 秒。

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

Loading a 1gb csv 5X faster with cuDF

cuML:机器学习算法

cuML 与其他 RAPIDS 项目集成实现了机器学习算法数学原语函数。在大多数情况下,cuML 的 Python API 与来自 sciKit-learn 的 API 相匹配。该项目仍然有一些限制(例如,目前 cuML RandomForestClassifier 的实例不能被腌制),但他们有一个短暂的 6 周发布时间表,所以他们总是添加新的功能。

除了其他工具之外,还有对回归分类聚类维度缩减算法的实现。该 API 确实与 sciKit API 非常一致:

import cudf
import numpy as npfrom **cuml.linear_model** import **LogisticRegression**

X = cudf.DataFrame()X['col1'] = np.array([1,1,2,2], dtype = np.float32)
X['col2'] = np.array([1,2,2,3], dtype = np.float32)y = cudf.Series( np.array([0.0, 0.0, 1.0, 1.0], dtype = np.float32) )# trainingreg = **LogisticRegression()**
reg.**fit(**X,y**)**

print("Coefficients:")
print(reg.coef_.copy_to_host())
print("Intercept:")
print(reg.intercept_.copy_to_host())# making predictionsX_new = cudf.DataFrame()X_new['col1'] = np.array([1,5], dtype = np.float32)
X_new['col2'] = np.array([2,5], dtype = np.float32)

preds = reg.**predict(**X_new**)**

print("Predictions:")
print(preds)

Maingear 的数据科学电脑

这些都很棒,但是我们如何使用这些工具呢?嗯,首先你需要弄一个 NVIDIA GPU 卡 兼容 RAPIDS 。如果你不想花时间找出硬件规格的最佳选择,NVIDIA 将发布数据科学 PC

PC 自带软件栈,优化运行所有这些用于机器学习和深度学习的库。它带有 Ubuntu 18.04,你可以使用来自 NVIDIA GPU Cloud 的 docker 容器,或者使用原生的 conda 环境。PC 最大的好处之一就是你可以完全安装所有的库和软件。如果你曾经不得不在 Linux 发行版上安装 NVIDIA 驱动程序,或者不得不从源代码安装 TensorFlow,你就会知道这有多梦幻。这些是系统规格:

  • GPU

配备 24 GB GPU 内存的 NVIDIA Titan RTX 双路 NVIDIA Titan RTX 通过 NVIDIA NVLink 连接,提供 48 GB GPU 内存

  • CPU

英特尔酷睿 i7 类 CPU 更高

  • 系统内存

最少 48 GB DDR4 系统内存用于单 GPU 配置和最少 48 GB DDR4 系统内存用于双 GPU 配置

  • 磁盘

最少 1 TB 固态硬盘

Maingear VYBE PRO 数据科学 PC 配备了多达两个双 NVIDIA TITAN RTX 24GB 卡,每台 PC 都是手工组装的**。**

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

A VYBE PRO PC from Maingear with two NVIDIA TITAN RTX cards (this thing is so beautiful I was afraid to turn it on)

使用具有 4,000,000 行和 1000 列的数据集在 VYBER PRO PC 上训练 XGBoost 模型(此数据帧使用大约。15 GB 内存)在 CPU 上占用 1min 46s(内存增量为73325 MiB**)在 GPU上仅 21.2s(内存增量为 520 MiB )。**

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

Training a XGBoost model 5X faster with GPUs

结论

对于数据科学,我们总是需要探索和尝试新事物。在使我们的工作流程变得困难的其他软件工程挑战中,计算我们的数据所需的大小和时间是两个瓶颈,它们阻止我们在运行我们的实验时达到流状态。拥有一台电脑和工具可以改善这一点,可以真正加快我们的工作,帮助我们更快地发现数据中有趣的模式。想象一下,获取一个 40 GB 的 csv 文件,然后简单地将其加载到内存中,看看它是关于什么的。

RAPIDS 工具为机器学习工程师带来了深度学习工程师已经熟悉的 GPU 处理速度提升。为了制造使用机器学习的产品,我们需要迭代并确保我们有可靠的端到端管道,使用 GPU 来执行它们将有望提高项目的输出。

参考

[1]https://graphics . Stanford . edu/papers/gpumatrixmult/gpumatrixmult . pdf

https://en.wikipedia.org/wiki/CUDA

[3]https://NVIDIA news . NVIDIA . com/news/NVIDIA-introduces-rapids-open-source-GPU-acceleration-platform-for-large-scale-data-analytics-and-machine-learning

https://rapids.ai/about.html

[5]https://rapidsai . github . io/projects/cuDF/en/0 . 10 . 0/10min . html # When-to-use-cuDF-and-Dask-cuDF

如何使用 H2O AutoML 进行卡纳达语 MNIST 数字分类

原文:https://towardsdatascience.com/how-to-use-h2o-automl-for-kannada-mnist-digits-classification-c0bb21ee3774?source=collection_archive---------27-----------------------

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

Kaggle Kannada MNIST

卡纳达语 MNIST 数据集是另一个 MNIST 类型的卡纳达语(印度)的数字数据集。数据集管理的所有细节已在题为:“卡纳达语-MNIST:一个新的卡纳达语手写数字数据集”的论文中捕获。作者维奈乌代帕布。作者的 github repo 可以在这里找到。

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

这篇文章的目的是演示如何使用h2o.aiautoml函数快速获得(更好的)基线。这也证明了一点,这些automl工具如何帮助机器学习模型构建过程民主化。

78%的数据营折扣

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

加载所需的库

  • h2o -用于机器学习
  • tidyverse -用于数据操作
library(h2o)
library(tidyverse)

正在初始化 H2O 集群

h2o::h2o.init()

读取输入文件(数据)

train <- read_csv("/Kannada-MNIST/train.csv")
test <- read_csv("/Kannada-MNIST/test.csv")
valid <- read_csv("/Kannada-MNIST/Dig-MNIST.csv")
submission <- read_csv("/Kannada-MNIST//sample_submission.csv")

检查数据框的形状/尺寸

dim(train)

784 个像素值+ 1 个表示数字的标签。

标签计数

train  %>% count(label)

可视化卡纳达语 MNIST 数字

# visualize the digits
par(mfcol=c(6,6))par(mar=c(0, 0, 3, 0), xaxs='i', yaxs='i')for (idx in 1:36) { im<-matrix((train[idx,2:ncol(train)]), nrow=28, ncol=28)im_numbers <- apply(im, 2, as.numeric)image(1:28, 1:28, im_numbers, col=gray((0:255)/255), main=paste(train$label[idx]))
}

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

将 R 数据帧转换成 H2O 函数所需的 H2O 对象

train_h <- as.h2o(train)
test_h <- as.h2o(test)
valid_h <- as.h2o(valid)

将我们的数字目标变量转换为算法执行分类的因子

train_h$label <- as.factor(train_h$label)
valid_h$label <- as.factor(valid_h$label)

解释变量和响应变量

x <- names(train)[-1]
y <- 'label'

行动中的汽车

aml <- h2o::h2o.automl(x = x, 
                       y = y,
                       training_frame = train_h,
                       nfolds = 3,
                       leaderboard_frame = valid_h,
                       max_runtime_secs = 1000)

nfolds表示交叉验证的折叠次数,而max_runtime_secs表示 AutoML 过程可以持续的最大时间。

AutoML 排行榜

排行榜是 AutoML 列出表现最佳车型的地方。

aml@leaderboard

预测和提交

pred <- h2o.predict(aml, test_h) submission$label <- as.vector(pred$predict)#write_csv(submission, "submission_automl.csv")

提交(为 Kaggle)

write_csv(submission, "submission_automl.csv")

这是目前 Kaggle 上的一个游乐场比赛。所以,这个提交文件可以提交给这个比赛。根据上述参数,提交的内容在公共排行榜上的得分为0.907200.90在 MNIST 分类中得分接近于零,但我希望这段代码片段可以作为任何试图开始使用 AutoML 的人的快速入门模板。

参考

此文最初发表于

如果你喜欢这个,请订阅我的 语言无关的数据科学时事通讯 并分享给你的朋友!

如何在谷歌云虚拟机上使用 Jupyter

原文:https://towardsdatascience.com/how-to-use-jupyter-on-a-google-cloud-vm-5ba1b473f4c2?source=collection_archive---------8-----------------------

谷歌云平台上 AI 平台笔记本的菜谱

注意:本文中的方法仍然有效,但是我建议您现在使用笔记本 API。做:

gcloud beta 笔记本-帮助

在 GCP 上启动笔记本最简单的方法是从 GCP 控制台浏览工作流程。进入 AI 平台,点击笔记本实例。您可以从用户界面创建新实例:

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

Create a new notebook instance from the UI

实例启动后,您可以单击一个链接来打开 JupyterLab:

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

Click on the blue link to open Jupyter Lab. Once you are done working for the day, Stop the VM. Then, restart. I tend to have different notebook instances for different projects.

当实例启动时,它有一个持久磁盘。那个磁盘可以装你的笔记本。您可以停止并重新启动虚拟机(从 GCP web 控制台),而不会丢失这些笔记本。

请注意,您可以从用户界面将 GPU 附加到笔记本实例:

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

Attaching a GPU to a notebook instance

尽情享受吧!

本文收集了我使用笔记本实例的一些“诀窍”。

A.如何编写创建笔记本实例的脚本

该实例是一个计算引擎映像,因此如果您想要编写脚本、定制机器、更改防火墙规则等。您可以使用计算引擎功能。笔记本实例是一个深度学习虚拟机,这是一系列图像,提供了一种在谷歌云上启动带有/不带有 GPU 的虚拟机的便捷方式。它已经安装了 Jupyter Lab,你不需要代理或者 ssh 就可以访问它。

A1。使用 gcloud 启动深度学习虚拟机

最简单的方法是指定一个图像族(参见文档了解可用的图像族)。例如,您可以使用以下方式获取 tensorflow-gpu 系列中附加了 P100 GPU 的最新图像:

IMAGE=**--image-family=tf-latest-gpu**
INSTANCE_NAME=dlvm
GCP_[LOGIN_NAME=**google-cloud-customer@gmail.com**](mailto:MAIL=google-cloud-customer@gmail.com)  # CHANGE THISgcloud config set compute/zone **us-central1-a**  # CHANGE THISgcloud compute instances create ${INSTANCE_NAME} \
      --machine-type=**n1-standard-8** \
      --scopes=[https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email](https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email) \
      --min-cpu-platform="Intel Skylake" \
      ${IMAGE} \
      --image-project=deeplearning-platform-release \
      --boot-disk-size=100GB \
      --boot-disk-type=pd-ssd \ 
      --accelerator=**type=nvidia-tesla-p100**,count=1 \
      --boot-disk-device-name=${INSTANCE_NAME} \
      --maintenance-policy=TERMINATE --restart-on-failure \
      --metadata="proxy-user-mail=${GCP_LOGIN_NAME}**,install-nvidia-driver=True**"

A2。获取 Jupyter 实验室的网址

用于访问 Jupyter Lab 的 URL 是您刚刚启动的虚拟机的元数据的一部分。您可以通过以下方式获得:

gcloud compute instances describe ${INSTANCE_NAME} | grep dot-datalab-vm

下面是一个脚本,它将执行第 1 步和第 2 步,一直等到 Jupyter 笔记本服务器启动:

#!/bin/bashIMAGE=--image-family=tf-latest-cpu
INSTANCE_NAME=dlvm
GCP_[LOGIN_NAME](mailto:MAIL=google-cloud-customer@gmail.com)[=google-cloud-customer@gmail.com](mailto:MAIL=vlakshmanan@google.com)  # CHANGE THISgcloud config set compute/zone **us-central1-a**  # CHANGE THISecho "Launching $INSTANCE_NAME"
gcloud compute instances create ${INSTANCE_NAME} \
      --machine-type=n1-standard-2 \
      --scopes=[https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email](https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email) \
      ${IMAGE} \
      --image-project=deeplearning-platform-release \
      --boot-disk-device-name=${INSTANCE_NAME} \
      --metadata="proxy-user-mail=${GCP_[LOGIN_NAME](mailto:MAIL=google-cloud-customer@gmail.com)}"echo "Looking for Jupyter URL on $INSTANCE_NAME"
while true; do
   proxy=$(gcloud compute instances describe ${INSTANCE_NAME} 2> /dev/null | grep dot-datalab-vm)
   if [ -z "$proxy" ]
   then
      echo -n "."
      sleep 1
   else
      echo "done!"
      echo "$proxy"
      break
   fi
done

A3。在 web 浏览器中访问 URL

只需导航到那个网址,你就会进入 JupyterLab。

B.如何在笔记本实例上使用 Git

B1。Git 交互式克隆存储库

单击左侧窗格中图标带的最后一个图标,您将能够 git 克隆一个存储库。用我书里的那个:

https://github.com/GoogleCloudPlatform/data-science-on-gcp

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

Running a Jupyter notebook on a cloud VM without any ssh tunnels or proxies

导航到 updates/cloudml 并打开 flights_model.ipynb。您应该能够浏览笔记本。

你也可以打开一个终端,使用 git 克隆、git 检验、git 推送等等。我倾向于发现它比使用内置的 Git UI 更容易。但是您的里程可能会有所不同!

C.如何指定启动脚本

您可以指定一组在 Jupyter 启动后运行的操作。这些将以 root 用户身份运行。

IMAGE=**--image-family=tf-latest-gpu**
INSTANCE_NAME=dlvm
GCP_[LOGIN_NAME=**google-cloud-customer@gmail.com**](mailto:MAIL=google-cloud-customer@gmail.com)  # CHANGE THIS
STARTUP_SCRIPT="git clone [https://github.com/GoogleCloudPlatform/data-science-on-gcp](https://github.com/GoogleCloudPlatform/data-science-on-gcp)"gcloud config set compute/zone **us-central1-a**  # CHANGE THISgcloud compute instances create ${INSTANCE_NAME} \
      --machine-type=**n1-standard-8** \
      --scopes=[https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email](https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email) \
      --min-cpu-platform="Intel Skylake" \
      ${IMAGE} \
      --image-project=deeplearning-platform-release \
      --boot-disk-size=100GB \
      --boot-disk-type=pd-ssd \ 
      --accelerator=type=nvidia-tesla-p100,count=1 \
      --boot-disk-device-name=${INSTANCE_NAME} \
      --maintenance-policy=TERMINATE --restart-on-failure \
      --metadata="proxy-user-mail=${GCP_LOGIN_NAME}**,**install-nvidia-driver=True,**startup-script=${STARTUP_SCRIPT}**"

D.如何安排笔记本

D1。转移到生产时,使用映像,而不是映像系列

一般来说,使用映像系列方法进行开发(这样您就可以一直使用最新的东西进行开发),但是一旦您将产品化,就要使用特定的映像。您希望在产品中固定一个特定映像的原因是,您希望在一个已经实际测试过代码的版本上运行。

获取图像列表并找到您正在使用的图像(您在上面指定的图像系列中的最新图像):

gcloud compute images list \
   --project deeplearning-platform-release \
   --no-standard-images

然后,在创建深度学习虚拟机时指定它(您可能想要更改的行以粗体显示):

IMAGE=--image=**tf-latest-cpu-20190125b2** # CHANGE
INSTANCE_NAME=**dlvm**
GCP_[LOGIN_NAME](mailto:MAIL=google-cloud-customer@gmail.com)[=**google-cloud-customer@gmail.com**](mailto:MAIL=vlakshmanan@google.com)  # CHANGE THIS
ZONE="us-central1-b"  # CHANGEgcloud compute instances create ${INSTANCE_NAME} \
      --machine-type=**n1-standard-8 \** --zone=$ZONE \
      --scopes=[https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email](https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email) \
      --min-cpu-platform="Intel Skylake" \
      ${IMAGE} \
      --image-project=deeplearning-platform-release \
      --boot-disk-size=**100GB \**
      --boot-disk-type=pd-ssd \
      --boot-disk-device-name=${INSTANCE_NAME} \
      --metadata="proxy-user-mail=${GCP_[LOGIN_NAME](mailto:MAIL=google-cloud-customer@gmail.com)}"

D2。使用 papermill 提交计划执行的笔记本

这里的关键点是使用启动脚本启动 papermill,并在 papermill 完成后使用 TERMINATE 退出笔记本虚拟机,而不需要在出现故障时重启。然后,删除该虚拟机。更多详情见这篇博文

# Compute Engine Instance parameters
IMAGE=--image=tf-latest-gpu-20190125b2 # CHANGE
INSTANCE_NAME=dlvm
ZONE="us-central1-b"  # CHANGE
INSTANCE_TYPE="n1-standard-4"  #CHANGE
# Notebook parameters
GCS_INPUT_NOTEBOOK="gs://my-bucket/input.ipynb"
GCS_OUTPUT_NOTEBOOK="gs://my-bucket/output.ipynb"
GCS_INPUT_PARAMS="gs://my-bucket/params.yaml" # Optional
**export STARTUP_SCRIPT="**[https://raw.githubusercontent.com/GoogleCloudPlatform/ml-on-gcp/master/dlvm/tools/scripts/notebook_executor.sh](https://raw.githubusercontent.com/GoogleCloudPlatform/ml-on-gcp/master/dlvm/tools/scripts/notebook_executor.sh)**"**

gcloud compute instances create $INSTANCE_NAME \
        --zone=$ZONE \
        --image=$IMAGE \
        --image-project=deeplearning-platform-release \
       ** --maintenance-policy=TERMINATE** \
        --accelerator='type=nvidia-tesla-t4,count=2' \
        --machine-type=$INSTANCE_TYPE \
        --boot-disk-size=100GB \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --metadata="input_notebook_path=${GCS_INPUT_NOTEBOOK},output_notebook_path=${GCS_OUTPUT_NOTEBOOK},parameters_file=${GCS_INPUT_PARAMS},startup-script-url=$LAUNCHER_SCRIPT,**startup-script=${STARTUP_SCRIPT}**"

gcloud --quiet compute instances delete $INSTANCE_NAME --zone $ZONE

E.如何使用 Jupyter 的 TPU

要创建附加到 TPU 的深度学习虚拟机,首先创建深度学习虚拟机,然后创建具有相同 TensorFlow 版本的 TPU:

INSTANCE_NAME=**laktpu**   # CHANGE THIS
GCP_[LOGIN_NAME](mailto:MAIL=google-cloud-customer@gmail.com)[=**google-cloud-customer@gmail.com**](mailto:MAIL=vlakshmanan@google.com)  # CHANGE THISgcloud config set compute/zone **us-central1-a**  # CHANGE THISTPU_NAME=$INSTANCE_NAME
gcloud compute instances create $INSTANCE_NAME \
--machine-type n1-standard-8 \
--image-project deeplearning-platform-release \
--image-family **tf-1-12-cpu** \
--scopes cloud-platform \
--metadata proxy-user-mail="${GCP_[LOGIN_NAME](mailto:MAIL=google-cloud-customer@gmail.com)}",\
startup-script="echo export TPU_NAME=$TPU_NAME > /etc/profile.d/tpu-env.sh"gcloud compute tpus create $TPU_NAME \
  --network default \
  --range 10.240.1.0 \
  --version **1.12**

创建深度学习虚拟机时唯一的区别是,您在启动脚本中指定了 TPU 名称。

F.如何在笔记本电脑中使用最终用户凭据

如果你创建了一个深度学习虚拟机,并且你指定了一个 GCP 登录名(除了生产虚拟机之外,我上面的所有例子都是这样做的),那么只有你(和项目管理员)能够通过 ssh 进入虚拟机。

所有 Jupyter 笔记本都将在一个服务帐户下运行。在大多数情况下,这没问题,但是如果您需要运行服务帐户没有权限执行的操作,您可以通过执行以下操作让 Jupyter 中的代码以您的身份运行:

  • 在启动菜单中,打开一个终端
  • 在终端中,键入:
gcloud auth application-default login
  • 按照提示执行 OAuth2
  • 如有必要,重启 Jupyter 内核

注意:不要使用最终用户凭证,除非您在“单用户模式”下启动机器。

G.如何创建 TF-nightly 虚拟机

在 tf-latest 系列中创建映像使用最新的稳定 TensorFlow 版本。要使用 TF-nightly(例如,这就是如何获得 TensorFlow 2.0-alpha),请使用:

INSTANCE_NAME=**tfnightly**   # CHANGE THIS
GCP_[LOGIN_NAME](mailto:MAIL=google-cloud-customer@gmail.com)[=**google-cloud-customer@gmail.com**](mailto:MAIL=vlakshmanan@google.com)  # CHANGE THIS
ZONE="us-west1-b" # CHANGE THIS
INSTANCE_TYPE="n1-standard-4" # CHANGE THISgcloud compute instances create ${INSTANCE_NAME} \
      --machine-type=$INSTANCE_TYPE \
      --zone=$ZONE \
      --scopes=[https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email](https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email) \
      --min-cpu-platform="Intel Skylake" \
      --image-family="**tf-latest-gpu-experimental**" \
      --image-project=deeplearning-platform-release \
      --boot-disk-size=100GB \
      --boot-disk-type=pd-ssd \
      --accelerator=type=nvidia-tesla-p100,count=1 \
      --boot-disk-device-name=${INSTANCE_NAME} \
      --maintenance-policy=TERMINATE --restart-on-failure \
      --metadata="proxy-user-mail=${GCP_LOGIN_NAME},install-nvidia-driver=True"

H.Jupyter 故障排除

重启 Jupyter: 通常你需要做的就是点击笔记本菜单里的图标重启内核。但是偶尔,你可能会彻底破坏环境,想要重启 Jupyter。为此,转到 GCP 控制台的计算实例部分,并单击与您的笔记本实例对应的 SSH 按钮。在 SSH 窗口中,键入:

sudo service jupyter restart

**启动日志:**如果 Jupyter 启动失败,或者你没有得到笔记本链接,你可能要查看完整的日志(包括启动日志)。使用以下方式完成:

gcloud compute instances \
    get-serial-port-output --zone $ZONE $INSTANCE_NAME

一.使用 conda

张量流图像使用 pip,但 PyTorch 图像使用 conda。所以,如果你想使用 conda,PyTorch 图像是一个更好的起点。

J.如何在本地运行笔记本实例

如果您想在本地机器上使用深度学习 VM 容器映像进行开发,可以使用 Docker:

IMAGE_NAME="gcr.io/deeplearning-platform-release/tf-latest-cpu"
docker pull "${IMAGE_NAME}"
docker run -p 127.0.0.1:8080:8080/tcp -v "${HOME}:/home" \
            "${IMAGE_NAME}"

如果您的本地机器上有一个 GPU,请将映像名称从 tf-latest-cpu 更改为 tf-latest-cu100。


我对这些食谱很感兴趣。如果您对我应该添加的问题/答案有任何建议,请联系我。为了方便起见,这里有一个包含所有代码的要点

如何通过 SSH 在深度学习平台上远程使用 Jupyter

原文:https://towardsdatascience.com/how-to-use-jupyter-on-your-deep-learning-rig-remotely-with-ssh-cefd78fbfe2c?source=collection_archive---------26-----------------------

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

当处理多台机器时,将你的文件和硬件分开可能是一件好事,也可能是一件可怕的坏事。我们都遇到过这样的情况,我们需要将工作转移到 USB 闪存驱动器上,以便在旅行时将它们放在笔记本电脑上。最重要的是,你的笔记本电脑也有臭名昭著的

集成显卡

没有我们每天都要访问的文件系统会对我们的性能产生负面影响。对于我们这些喜欢轻薄笔记本电脑、宁愿在沙发上而不是电脑椅上工作的人来说,对远程台式机的渴望可能会更强烈。

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

我决定用 RedHat 来运行我的 SSH 服务器。RedHat 是非常成熟的,并且是最常运行的服务器发行版之一。

老实说,如果你是 Linux 新手,发行版并不重要,因为 Linux 在整体上是相当一致的。

我不打算回顾安装过程或用户创建过程,因为它们都很简单“你希望它是什么”,并键入答案。

现在我们已经安装了操作系统,我们需要做什么呢?对于我来说,我有两个 GPU,和一个不支持内核驱动程序的 Wifi 适配器,所以第一步是驱动程序。我们可以获得并安装带有驱动程序的闪存驱动器,并使用 build-essential 或 DKMS 来安装它们:

make
sudo make install
sudo modprobe __

或者,在将文件复制到/usr/src 之后

sudo dkms add -m ___ --version 1.0
sudo dkms build -m ___ --version 1.0
sudo dkms install -m ___ --version 1.0
modprobe ___

现在,我们的 wifi 驱动程序已经就绪,我们必须实际连接到我们的 wifi,第一步是打开我们的网络连接。

sudo ifconfig wlan0 up

然后扫描可用的 wifi SSIDs:

sudo iwlist scan | more

并添加我们的 WPA 密钥:

wpa_passphrase

然后我们将这些信息放到一个文本文件中。会议)

wpa_passphrase (SSID)> /etc/wpa_supplicant/wpa_supplicant.conf

然后我们将 CD 放入该目录,并连接!

sudo wpa_supplicant -B -D driver -i interface -c /etc/wpa_supplicant/wpa_supplicant.conf && sudo dhclient

恭喜,我们正式有 wifi 了!

现在我们可以做我们最喜欢的两件事,更新我们的包和库。需要注意的是,包管理器当然取决于你选择的发行版。对于 RedHat 可以是 dnf 也可以是 yum,Debian(或者 Ubuntu)会用 apt,Arch 会用 Pacman,openSuse 会用 man。所以如果你没有选择使用 RedHat,就用你各自的包管理器替换我的 dnf。

sudo dnf update && sudo dnf upgrade

在按下 y 键并输入至少一次之后,你现在必须得到你的新的最好的朋友:SSH。虽然现在有很多 SSH 工具,但是我们将会使用 SSH 的 FOSS 版本。

sudo dnf install openssh-server

现在让我们用主机名、端口等快速配置我们的网络。

$ nano ~/.ssh/config

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

现在,我们只需为我们的服务器启用 systemctl:

sudo systemctl enable ssh
sudo systemctl start ssh

如果你使用的是 Ubuntu,你需要运行以下命令为你的防火墙打开一个端口(端口 22 ):

sudo ufw allow ssh
sudo ufw enable
sudo ufw status

现在 SSH 应该正在运行,您的服务器应该已经启动并正在运行。如果你使用 CUDA 或 OpenCL,现在是 wget 或 dnf 安装一些图形驱动程序的好时机。

在将要连接到 SSH 服务器的客户机上,您还需要安装 openssh 客户机:

sudo dnf install openssh-client

这样一来,我们可以连接到我们的无头服务器:

ssh emmett@192.168.0.13

如果你不知道 IPv4 地址(最后带点的部分),WiFi 和互联网的情况会有所不同:

无线局域网(wireless fidelity 的缩写)

ipconfig getifaddr en1

以太网

ipconfig getifaddr en0

祝贺您,您现在已经连接到了您的 ssh 服务器,您可以像使用任何其他终端一样使用它。如果你碰巧正在使用 Nautilus,你也可以把服务器添加到你的文件管理器中,方法是转到文件,然后在左边点击其他位置,在底部有一个包含 ssh、ftp 等的组合框。你可以利用的关系。

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

那我们怎么和 Jupyter 一起用呢?

当然,首先我们必须安装 Jupyter,所以回到你的服务器,安装 pip for python3:

sudo apt-get install python3-pip

然后用 pip 安装 Jupyter Lab:

sudo pip3 install jupyterlab

要启动笔记本服务器,只需运行

jupyter notebook

要访问服务器,只需转到您的客户机,打开您选择的 web 浏览器,并输入您的 SSH 构建的 IP。现在你可以拔掉除了机器电源线以外的所有东西。

下一步

下一步是扔掉你的鼠标和键盘,因为你已经正式

没头了

如何使用 Jupyter 进行健康科学的初步数据分析

原文:https://towardsdatascience.com/how-to-use-jupyter-to-conduct-preliminary-data-analysis-for-health-sciences-r-tidyverse-edition-8c3260976cf2?source=collection_archive---------16-----------------------

在本教程中,我将讲述一个可以用于 Jupyter 笔记本/Jupyter 实验室进行数据分析的工作流程。我将讨论

  • 建立一个基于网络的 Jupyter 环境来完成你的工作,并且
  • 如何使用 R 来处理 Jupyter 笔记本或 Jupyter lab

以下是 Jupyter 笔记本的外观:

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

Jupyter notebook (code and text are woven here)

Jupyter 笔记本(和 Jupyter lab)是一种“笔记本”,可以在网络浏览器上运行,它的组件可以让你在一页纸的空间内做数据科学的事情,统计数据分析,写笔记,论文,生成图表。从他们的网站上阅读更多关于 Jupyter 笔记本的信息,点击这里:【https://jupyter.org/】

在他们的网站上,您可以了解到:

  • 如何下载 Jupyter 笔记本(免费开源,就像免费啤酒一样免费,像自由一样免费),
  • 如何在您的特定操作系统上安装它们。
  • 你甚至可以在tryjupyter.org上测试 Jupyter 笔记本。

能有多简单?我建议您在安装 Jupyter Notebooks(或 Jupyter lab)后,或访问 Jupyter notebook 或 Jupyter Lab 的托管实例后,务必阅读《走向数据科学》中的以下两个教程:

为数据科学带来 Jupyter 笔记本电脑的最佳性能

朱庇特实验室:朱庇特笔记本的进化

您将掌握如何使用 Jupyter 笔记本电脑以及如何使用它们的实用知识。

本教程的目的

在本教程中,我将向您展示如何使用 Jupyter Notebooks/Jupyter Lab,使用 R (tidyverse) 从头开始进行真实世界的数据分析。我就写一下用 R (tidyverse 和 ggplot) 做数据分析。在以后的文章中,我将向您展示如何使用 Python (pandas、matplotlib、statsmodel 和 seaborn)进行数据分析和创建图形。因为这些都是开源和免费的(免费的啤酒和免费的言论)工具。(点击下面的图片听理查德·斯托尔曼的采访是什么意思,😃:

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

因此,学习如何使用这些工具进行数据分析和写作,将使您能够轻松直观地完成数据分析项目,并与所有人分享。

完成本教程需要什么?

  • R 的实用知识
  • 网络浏览器和安装了 Jupyter notebook 或 Jupyter Lab 的计算机。然而,如果你不需要在你的电脑上安装 Jupyter notebook/Jupyter Lab。你也可以在这些网站上创建免费账户。几乎任何浏览器都可以工作。如果有任何浏览器不支持这些,请在评论中告诉我。
  • 如何在 markdown 中写作

我说的“R 的工作知识”是什么意思?

如果你以前没有用过 R,现在是个好时机。R 是一个统计编程环境(这意味着您不仅可以进行统计数据分析,还可以开发“例程”或程序,您可以使用 R 与他人共享,这是一件好事)。您可以从以下网站了解更多关于 R 的信息(什么是 R,如何获取和安装 R):

  • r 首页:https://www.r-project.org/
  • 从以下网站下载 R:【https://cran.r-project.org/
  • 学习如何在工作中采用 R 的一系列页面:【https://cran.r-project.org/web/views/】T4
  • 在本教程中,我将使用“tidyverse ”,这是一套 R 语言的包,可以用于数据科学;下面是链接:https://www.tidyverse.org/
  • 我建议您熟悉以下由 Hadley Wickham 和 Garrett Grolmund 编写的关于 r 中的数据科学的在线文本。它是免费的,很容易理解:https://r4ds.had.co.nz/

这些是让你开始的基本资源。在这里,我将介绍 R 的一些重要的关键组件,您可以使用它们来学习。在本教程中,我们将使用 R 和 tidyverse 读取一个数据集,对数据集进行“清洗和预处理”,然后在数据集中找到一些意义。我们将使用 R 中称为“gg plot 2”(Grammar of Graphics Plotting Version 2,基于 Leland 和 Wilkinson 的书“Grammar of Graphics”)的包来创建简单的图形。

关于 R 和 markdown 快速烹饪之旅

让我们开始吧。我们将在 Cocalc.com 免费使用一个 jupyter 实验室实例(URL:https://cocalc.com);如果你想使用它并跟随它,考虑在那里创建一个免费帐户并启动一个 jupyter 实验室服务器。当你游览 cocalc.com 时,它看起来是这样的:

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

Figure 1. Cocalc online jupyter environment. You can sign in with your other social media sign-ons.

登录并打开 Jupyter 实验室环境后,它应该如下所示:

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

Figure 2. Jupyter lab interface

我不会在这里进入 Jupyterlab 接口的细节,因为这已经在我上面分享的链接中很好地记录了,请阅读相关的文档,它写得真的很好。相反,让我们专注于手头最有趣的任务:

  • 文件扩展名为“”。ipynb ':“交互式 ipython 笔记本”
  • 我们将需要建立一个文件名,而不是“untitled.ipynb”,让我们称之为’ first_analysis.ipynb '。您可以在第二个大的白色面板中右键单击文件名,然后更改文件名。
  • 然后我们需要获取一些数据,编写代码和文本来开始工作。

但在此之前,我们需要触及另外两点:

  1. 让我们学习一些关于 R 本身的知识,并整理数据
  2. 让我们来介绍一下编写文本的 markdown 语法

关于 R 的最基本的信息

我在下面的“灰色”框中提供了一些带注释的代码,您可以复制并粘贴到 Jupyterlab 中的代码块中,当您准备好运行时,请按“Shift+Enter”

# Comments in R code blocks are written using 'hash' marks, and 
# you should use detailed comments on all your codes
x <- 1 
# '<- ' is an assignment operator. Here x is set to the value of 1
# This is same as x = 1
x == 1
# Here, we evaluate whether x is equal to 1; 
# Everything in R is an object and you can find out about objects
# using the function typeof()
typeof(x) # should put 'double'
# double tells you that x is a number as in 1.00
# you can and should write functions to accomplish repetitive 
# tasks in R
# The syntax of function is:
my_function = function(x){
          function statements
          }
# You can call functions anywhere in R using the function name and 
# by writing the function parameters within parentheses
# as in my_function(x)
# An example of a function where two numbers x, and y are 
# multipliedmultiply_fn = function(x, y){
 z = x * y
    return(z)
}
multiply_fn(2,3) # will produce 6
# You can see that a function can call within itself another 
# function
# Combination of data and functions are referred to as packages
# You can call packages using library() function
# You can install packages using install.packages() function
# You can find help in R using help("topic") function
# In our case we will use "tidyverse" package. 
# We will need to install this first if not already installed

在这个小练习的最后,在我们把这个库叫做“tidyverse”之后,它看起来是这样的:

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

Figure 3. Our basic set up with tidyverse library ready to go

开始降价的基本要求

由于 html 是万维网的通用语言,它也相当复杂。约翰·格鲁伯发明了一种叫做 markdown 的语言,你可以用简单的装饰来书写文本的所有基本元素。可以写标题(我一般用两级标题)、链接、插码。你也可以使用 jupyter 笔记本上使用的 markdown 风格的表格和引用标记,所以你几乎可以在这里写你的整篇论文。在下面的框中,我提供了一个用 markdown 编写的短文版本和之后的渲染版本。希望这也能让你在 jupyter 笔记本上写作。

这是我们在 Jupyter 笔记本的文本框中所写的内容

# Purpose
This above was a first level header where we put one hash mark before the header. If we wanted to put a second level header, we would add another hash mark. Here, for example the goal is to demonstrate the principles of writing in markdown and conducting data analyses entirely on a web browser after installing jupyter notebook and optionally jupyter lab on the computer or the server.
## What we will do?
We will do the following:
- We will learn a little about R and markdown
- We will go grab some data sets
- After loading the data set in Jupyter, we will clean the data set
- We will run some tables and visualisations## So is it possible to add tables?
Yes, to add tables, do something like:| Task | Software |
|------|----------|
| Data analysis | Any statistical programme will do |
| Data analysis plus writing | An integrated solution will work |
| Examples of integrations | Rstudio, Jupyter, stata |## How do we add links?
If you wanted to add links to say sometihng like Google, you would insert the following code: [Name the URL should point, say Google]([http://www.google.com](http://www.google.com)), and it would put an underlined URL or name to your text.## Where can I learn more about markdown and its various "flavours"?
Try the following links:
- [Markdown]([https://daringfireball.net/projects/markdown/](https://daringfireball.net/projects/markdown/))
- [Github flavoured markdown]([https://github.github.com/gfm/](https://github.github.com/gfm/))
- [Academic markdown]([http://scholarlymarkdown.com/](http://scholarlymarkdown.com/))

这是它看起来的样子(部分,你可以在 Jupyter 实验室或 Jupyter 笔记本上复制它)

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

Screen output of a markdown rendered in a text block in Jupyter

让我们收集一些数据

现在我们已经:

  • 了解了一点 R 并安装和加载了 tidyverse
  • 学习如何在 markdown 中书写,以便我们可以描述我们的结果

是时候从网上抓取一些数据,并使用这些工具做一些分析了。现在,你将从哪里得到数据?数据无处不在,但有些网站让你更容易获取和使用它们。如何获取数据本身可以是另一个帖子,所以我不会进入细节,但一般来说:

  • 你可以搜索数据(我们将使用两个这样的网站:Figshare 和 Google Data Explorer)
  • 您可以使用应用程序编程接口(API)从网站上获取数据并使用它们。
  • 有几个网站提供玩具数据或真实世界数据供您使用(例如,数据和故事库)
  • 政府网站和卫生部门提供“一卡车”的数据供你分析和理解

这里的关键是学会如何理解这些数据。这就是数据科学的用武之地。具体来说,您可以:

  • 免费下载数据
  • 以对你理解它们的模式有意义的方式塑造它,并使它们成为“整齐的数据”
  • 使用可用的工具运行可视化
  • 使用不同的软件预处理数据(在本教程中,我们将使用 R 和 tidyverse,但是您也可以使用 Python 或其他专门的工具,如 OpenRefine 和电子表格)

出于本练习的目的,让我们访问 Figshare 并为我们的工作搜索数据。假设我们有兴趣确定工作场所健康问题的数据,并看看我们从 Figshare 获得了哪些数据来完成我们的工作。由于这是一个演示练习,我们将保持我们的数据集较小,这样我们就可以学习关于从网上抓取数据并分析它们的最基本的要点。使用 tidyverse 实现这一点实际上非常直观。

当我登录 Figshare 时,我的仪表盘看起来是这样的:

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

Figshare dashboard

我们搜索了基于“工作”和“健康”的数据,并确定了来自一项研究的原始数据集,研究人员在这项研究中研究了行为激活与抑郁和生活质量之间的关系。当我们搜索的时候,我们确保我们只想下载那些自由和公开共享的数据(有 CC-0 许可),并且我们想要数据集。

数据取自以下出版物:

[## 评估生活质量和行为激活之间的关系使用日本…

生活质量(QOL)是一个重要的健康相关的概念。确定影响 QOL 的因素可以帮助开发和…

journals.plos.org](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0185221)

在描述这项研究时,论文作者在摘要中写道:

生活质量(QOL)是一个重要的健康相关的概念。确定影响 QOL 的因素有助于开发和改善健康促进干预措施。先前的研究表明,行为激活促进主观 QOL,包括幸福感。然而,行为激活改善 QOL 的机制尚不清楚。考虑到治疗后抑郁症状改善时 QOL 改善,并且行为激活是抑郁症的有效治疗,行为激活可能间接而非直接影响 QOL。为了阐明行为激活对 QOL 的影响机制,有必要检查与行为激活、抑郁症状和 QOL 相关的因素之间的关系。因此,我们试图研究这些因素之间的关系。参与者包括 221 名日本大学生,他们完成了关于行为激活、QOL 和抑郁症状的问卷调查:行为激活抑郁量表简表(BADS SF)、世卫组织生活质量 BREF 量表(WHOQOL-26)和流行病学研究中心抑郁量表(CES-D)的日本版本。BADS-SF 包括两个分量表,激活和回避,WHOQOL-26 测量总体 QOL 和四个领域,身体健康,心理健康,社会关系和环境。中介分析以 BADS-SF 激活和回避作为独立变量,CES-D 作为中介变量,每个世卫组织-QOL 作为结果变量。结果表明,抑郁完全中介了回避和 QOL 的关系,部分中介了激活和 QOL 的关系。此外,对 QOL 每个领域的分析表明,激活直接和间接积极影响 QOL 的所有方面,但回避主要通过抑郁对 QOL 的一部分产生负面影响。本研究提供了针对 QOL 增强的行为激活策略。

论文全文是开源的,您可以从以下网站下载并阅读论文:

[## 评估生活质量和行为激活之间的关系使用日本…

生活质量(QOL)是一个重要的健康相关的概念。确定影响 QOL 的因素可以帮助开发和…

journals.plos.org](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0185221)

您可以从这里直接下载数据:

https://ndownloader.figshare.com/files/9446491

数据显示如下:

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

A look at how the data appears

在这里,我们将使用数据集并运行一个带注释的 jupyter 笔记本来展示以下不同步骤:

  • 获取数据
  • 将数据读入 R
  • 清理数据集
  • 问问题
  • 回答问题

如果你愿意,你可以在作者提供的数据集上复制他们的论文,但我们不会在本教程中这样做。在本教程中,我们已经介绍了使用基于网络的工具,您可以使用 Jupyter 笔记本/Jupyter 实验室进行数据分析。我已经介绍了 Cocalc,但是还有其他类似的工具。一些例子:

  • 微软 Azure 笔记本一系列语言全部免费,你可以使用 R 或 Python 或其他语言;免费的,你可以注册并马上开始工作
  • 谷歌合作实验室:来自谷歌,免费。您可以在 Python 笔记本上工作
  • Tryjupyter :给你不同语言和不同设置的免费笔记本。

因此,我们可以在任何一台笔记本上开始和结束我们的分析,因为这些笔记本是可互操作的。您还可以在 github 和 binder 上托管笔记本,并与世界各地的人分享您的笔记本。

第一步:下载数据 你可以看到这是一个 Excel 电子表格文件。您可以在电子表格程序(如 Excel 或 OpenOffice Calc)中打开它,并将文件导出为逗号分隔值文件。或者,我们可以直接在 Jupyter 中读取文件。我们就在这里做。

为此,我们需要使用“readxl”包。所以我们做如下:

# first load the package
library(readxl)
# If you find that your Jupyter instance does not have "readxl" 
# package in itself, then you will need to install it. 
# Easiest, install.packages("readxl") and then do 
# library(readxl)

加载后,它看起来是这样的:

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

After loading a data set, this is how it looks like

嗯,什么都没发生!为什么?因为 read_excel 函数读取 excel 文件“S1 _ 数据集. xlsx”的内容,并存储在一个名为 mydata 的*对象中。*我们现在将使用这个对象 mydata 来检查它的内部内容。

第二步:整理数据并进行预处理

现在,我们已经阅读了数据集,让我们深入了解其中的内容。第一件事是找出标题信息。我们可以在 R 中使用 head()函数来实现。这是它的样子:

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

Output of head(mydata)

我们还想找出数据集中的变量列表,所以我们这样做:

names(mydata) # produces the list of variables'Sex' 'Age' 'BADS-SF' 'BADS-SF_Activation' 'BADS-SF_Avoidance' 'CES-D' 'WHOQOL-26_Mean total score' 'WHOQOL-26_Phisical health' 'WHOQOL-26_Psychological health' 'WHOQOL-26_Social relationships' 'WHOQOL-26_Environment' 'WHOQOL-26_Overall QOL'

如您所见,虽然该数据集包含 12 个具有“表达性”名称的变量。有些变量的名称中包含“空格”。我们将重命名这些变量,以便它们对我们有意义。“性别”和“年龄”等变量相对容易理解,但我们可能需要重命名其他变量。您将从主论文和 Figshare 中的伴随数据描述中找到关于这些变量名的更多信息。

下表将变量名与其代表的概念和简短描述对应起来:

| Variable Name | What it stands for |
|---------------|--------------------|
| Sex           | 1 = Male, 2 = Female |
| Age           | Age in years          |
| BADS-SF       | Behavioral Activation for Depression Scale-Short Form |
| BADS-SF_Activation | BADS for activation |
| BADS-SF_Avoidance | BADS for avoidance |
| CES-D | Center for Epidemiologic Studies Depression Scale |
| WHOQOL-26_Mean total score | Japanese version of the WHO Quality of Life-BREF mean total score |
| WHOQOL-26_Phisical health | WHOQol-26 physical health |
| WHOQOL-26_Psychological health | WHOQoL-26 psychological health |
| WHOQOL-26_Social relationships | WHOQoL-26 social relationships |
| WHOQOL-26_Environment | WHOQoL-26 Environment |
| WHOQOL-26_Overall QOL | WHOQoL-26 Overall |

这些变量中的 QoL 是生活质量的简称。您可以在此通过相关网站了解更多关于世卫组织 QoL 的信息:https://www . who . int/substance _ abuse/research _ tools/who QoL bref/en/

我们不会在这里讨论细节,因为我们正在迈向下一步。在这个阶段,您可以看到:

  • 变量名有点长,所以您可能希望缩短它们,但在您继续工作时要让它们易于理解
  • 许多变量的名称中都有空格,因此需要小心处理(我们建议您使用下划线来表示空格)

我们如何重命名 tidyverse 中的变量?

这是我们的工作:

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

Renaming variables in the data set

需要注意几件事:

  1. 我们将把重命名的变量存储在一个新的数据集中(否则我们的更改将不会持续到我们在代码中完成并立即执行的内容之外,所以请确保将它保存在一个不同的命名对象中)
  2. 我们用一个符号“% > %”;这个符号被称为“管道”,读作“然后”。在这里,我们使用这个将许多不同的操作或命令链接在一起。如果你想了解更多这方面的知识以及如何使用它,请参考 Hadley Wickham 与 R 合著的关于数据科学的优秀著作,他在书中写道,

在幕后,x %>% f(y)变成了f(x, y),x %>% f(y) %>% g(z)变成了g(f(x, y), z)等等。您可以使用管道以从左到右、从上到下的方式重写多个操作。从现在起,我们将经常使用管道,因为它大大提高了代码的可读性

  • 然后我们使用了“rename()”函数,在这里,我们做了如下操作:
  • “新变量名”是第一个元素,接下来是
  • 一个“等号”,而“旧变量名”是第二个元素,表示
  • 我们将旧的变量值存储在新的变量中
  • 注意,在最后,一旦我们执行了它,我们得到了一个新的数据集,所有的值都保持不变,但是有了新的变量名。如果您不想转换某些变量的名称,请保持原样(就像我们对“年龄”和“性别”所做的那样)

让我们来了解一些争论数据的“语法”

当我们得到一个全新的数据集时,我们要做的第一件事就是“争论”这些数据。我们检查变量,我们绘制它们,我们重新编码它们以适应我们的目的,我们提出问题并试图回答它们。然后,一旦我们发现了一些我们认为可以深入研究的模式,我们就开始以各种方式对数据进行建模。在本教程中,我将仅限于写第一部分,我们如何做简单的表格和图形。同样,如果你正在与 R 和 tidyverse 合作(这是我推荐的),你的主要文本是 Hadley Wickham 的书: R for Data Science 。这本书是免费的;你可以用网上的免费软件来学习和练习,所以请试一试。正如您所看到的,您可以从不同的站点免费获取数据。我不会详细重复这本书里的所有内容,但我会指出五种语法,你会发现它们对处理数据很有帮助:

  • 选择** —使用此选项从数据集中选择列。假设我们只想处理该总体的 BADS 和 CES D 变量,我们将必须选择要处理的列:

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

Using Select

滤镜。 —如果我们想要处理数据集中的某些“个人”,我们将根据我们在列上设置的一些标准来过滤行。比方说,我们想和女性(" Sex == 2 ")和青少年("年龄< 20 ")一起工作,看看我们会怎么做:

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

Grammar: filter()

请注意简单性:

  • 我们使用“==”等价运算符来设置过滤条件
  • 我们使用“,”(逗号)来分隔不同的条件

排列 。—如果我们想按升序或降序查看数据集,我们使用动词“arrange()”来实现,如:

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

Grammar: arrange()

如您所见,数据集中最年轻的人只有 2 岁!您需要返回并纠正或测试这是否确实是值。这就是数据清理和预处理变得重要的地方。我们对此有何理解?

变异。 —您想要创建新的变量并将其存储在数据集中。您希望使用其他函数从现有变量中创建这些变量。假设,现在我们知道一个人的年龄被插入为 2 岁,可能是一个错误,我们不想丢失这个人的信息,我们想在 4 个组中减少年龄变量,我们该怎么做?我们使用变异动词,像这样:

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

Grammar: mutate

所以你看:

  • 使用 mutate 将一个变量重新编码为另一个变量
  • 使用 mutate 创建新变量
  • Mutate 使用新函数

让我们对 age_rec 变量进行计数,看看我们得到了什么:

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

Count of recoded age based on the Age

如你所见,如果你让计算机来决定,它可以创建我们不能使用的类别。因此,让我们对一个新的年龄组进行重新编码和变异,并将其保存到一个新的数据集,如下所示:

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

Binarised Age

你看到我们做了什么吗?

  • 我们创建了一个新的数据集(mydata4),并在其中创建了一个新的变量二进制年龄(“age_bin”),其中我们有 20 岁及以上的青少年和受访者(实际上应该是≥ 20 岁)
  • 你也可以分配你选择的标签(所以如果我们愿意,我们可以加上“青少年”和“二十岁以上”。

Mutate 是一个强大的动词,可以让您重新创建数据集和代码变量。你应该掌握这个。

汇总和分组 _ 依据。——选择、过滤、排列数据集、变异或改变变量,听起来可能是很多有用的事情,但你还需要更深入地了解数据,并学会如何从中找到意义。你需要找到汇总的摘要,以及那些连续变量的平均值,并把那些分类变量制成表格。通过这种方式,您可以深入了解数据。让我给你介绍一下“summarise()”和“group_by()”函数。

假设您有兴趣了解本次调查中受访者的平均年龄,然后想了解男性的平均年龄是否大于女性。你会怎么做?参见:

# What is the average age of the respondents?
average_age = mydata4 %>%
 summarise(average_age = mean(Age, na.rm = T))
average_age# Will return 19.36652

请注意,这是一个合并了所有个人的整个数据集的单一数字。这很好,你可以得到你发布的连续变量的平均值的完整列表。

然而,如果我们将 分割 数据集到不同的离散组(比如二进制年龄组,或者性别,就此而言),然后计算其他变量的平均值,这将有助于识别模式的有趣显示。因此,基本上,在分割数据集之后,我们将 应用一些函数,在我们的情况下 表示**的意思,**然后我们 将结果组合回当前值, 这将有助于有趣地显示同样有意义的结果。要全面了解这个主题,请阅读下面的文章(下载 PDF 格式):

所以,让我们把这个付诸行动,看看是否:

  • 在我们的数据中,男性比女性年龄大吗?
  • 青少年在健康相关生活质量(平均 WHOQoL)上的平均得分较低吗?

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

The code and results for males vs. females

那么,你的收获是什么?

  • 我们首先传递数据集,然后
  • 我们要求 tidyverse 按照分类变量进行分组(首先这样做,因为这是您对数据的“分割”),然后
  • 我们要求总结我们想要的变量。

聚散 。—让我们将这些概念付诸实践,并尝试回答这个问题,不同年龄组的男性和女性的生活质量得分有何不同?

  • 我们先来看看平均分:

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

We summarised all quality of life scores

这很好,但是解释起来很复杂。我们必须先看第一行,然后找到男性(性别等于 1)的个人生活质量参数的分数,然后读取下一行,依此类推。如果我们有一个“生活质量”的变量,列出生活质量、身体、心理、足球、环境等,并把它们读下来,这会对我们有所帮助。也就是说,我们将不得不 收集这些不同的分数,并将它们放在一个变量下,比如“生活质量”,我们将在那里看到的所有分数放在旁边的另一个变量下,我们可以将该变量称为“所有平均值”(因为这些基本上是平均值)。 在 tidyverse 中,我们现在引入另一个名为“gather”的动词来做这件事:

  • 使用一个“键”,在那里你可以收集你想要分组的变量的名字。例如,这里的“生活质量”
  • 使用一个“值”,在这里您可以放置它们各自的值。你给什么名字,关键和价值是由你决定的。我只关心给它们起个有意义的名字。

因此,下面是供您检查的代码:

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

Code and results of “gather”

看到发生了什么吗?我们现在已经“收集”了所有年龄组和所有性别的生活质量分数(各种参数)。但这仍然相当复杂,因为存在性别重复和年龄组重复。如果我们想把 展开 出来,那么现在我们就会把“all_means”的 分展开在性(1 和 2)的键下,我们就可以很直观地看到它们了。下面是代码:

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

Code and results of spread

所以,现在你可以看到你可以阅读每个年龄组(根据每个年龄组分组),每个分数,并可以比较男性和女性。这样你可以做一些有趣的比较。“spread”变得特别有用的一个领域是当您交叉表列变量时,例如在这个数据集中交叉表列二进制的年龄和性别。首先,看看你跑步时会发生什么

*crosstab = mydata4 %>% 
            count(age_bin, Sex) # crosstabs binarised age and Sex*

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

Counting binarised age and sex, code and result

好吧,但我们需要一个适当的交叉表格,其中性别出现在列中,二进制年龄出现在行中。所以,我们用“传播”来达到这个目的,明白吗

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

Cross-tabulation of Age with Sex

好多了。现在你可以看到二元年龄组是如何在性别 1 和性别 2 中分布的(记住 1 =男性,2 =女性)。另外,请注意,这是一个数据框,这意味着您可以使用 mutate()添加一列来找出每种性别青少年的行百分比。你怎么能这样做?

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

Code and results for finding out the male percentage in the binarised age

如你所见,男性在青少年群体中较高,在 20 岁以上年龄组中较低(26%)。所以,当你评估一些分数和性别之间的关系时,请记住年龄分布可能是一个混杂变量。

第三步:可视化数据

在前两个步骤中,如何从各种来源(免费)获得数据,以及如何使用 Jupyter 等免费软件来编写和处理数据,使其适合于分析。但是准备表格和摘要以及清理数据是一半的乐趣。能够创建简单的图表来深入研究数据是令人满意的。所以在今天的第三步,也是最后一步,我们将学习如何在 tidyverse 中创建简单的图表。

我建议您使用“ggplot()”来创建图表。Ggplot()是一个很大的主题,网上有很多书可供你阅读。阅读以下资源开始学习:

除了上面的网站,我建议你阅读下面的文章来深入了解图的构造(至少是原理),不管你是否使用 tidyverse:

为了绘制图形以显示数据,我们将在本教程中使用 ggplot()函数,我们将遵循一般方案:

*ggplot([data]) +
   geom_[geometry](mappings = aes(x = [variable],
                                  y = [variable],
                                  stats = "<choices>") +
   facet_<wrap | grid>() +
   coord_<choices>() +
   labs("title of the plot) +
   xlab("label for x axis") +
   ylab("label for y axis")*

要完全理解 ggplot()是如何工作的,请点击我上面列出的链接。在这里,当我们开始介绍并“尝试”时,我将只涉及基本的。记住一些规则:

  • 这个函数是 ggplot(),数据是强制的(这就是我把它放在方括号中的原因)
  • 然后有一个“+”号,这个“+”号必须在一行的末尾,不能在开头
  • 加号表示“层”,来自“图形的分层语法”
  • 您必须始终指定美学(“aes”)值,否则将无法构建图形
  • 其余的选项都是可选的(我说“有点”,因为你会在继续使用它的过程中学习)

让我们从 mydata4 开始,看看它现在是如何显示的:

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

The mydata4 data frame

让我们用图表来探索:

  • 年龄分布是什么样的?
  • 男性和女性是什么样子的?
  • bads_sf 和 whoqol_mean 是什么关系?男女都差不多吗?

我们可以继续探索,但是用图形方式回答这些问题将为您提供一些思路,您可以用这些思路来探索这个数据集中您自己的问题,以及您可能想要处理的未来数据集中的问题。

年龄分布是什么样的?

首先,研究代码:

*mydata4 %>%
  ggplot() +
  geom_bar(aes(x = Age)) +
  ggtitle("A bar plot of age") +
  xlab("Age in years") +
  ylab("Counts") +
  ggsave("age_bar.png")*
  • 我的数据 4 是包含我们想要绘制的所有变量的数据集
  • 管道符号将关于 mydata4 的信息发送给 ggplot()函数
  • 然后,我们开始了一个新的层,并添加了层+符号
  • 我们需要一个条形图,因为年龄主要是数字,因此用条形表示。我们只需要指定一个 X 轴,ggplot 就会计算出原始计数。
  • 我们用 ggtitle()为图表命名,并将标题插入引号中
  • 我们使用 xlab()和 ylab()函数标记 x 和 y 轴
  • 我们使用 ggsave()函数保存了该图

它看起来是这样的:

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

Bar plot of age

男性和女性的年龄分布柱状图看起来一样吗?

现在我们应该使用 facet 函数来绘制两个不同的图,或者我们可以拆分图形:

  • 首先,看代码:
*mydata4 %>%
  ggplot() +
  geom_bar(aes(x = Age)) +
  ***facet_wrap(~Sex) +***
  ggtitle("A bar plot of age by gender") +
  xlab("Age in years") +
  ylab("Counts") +
  ggsave("age_bar_sex.png")*

请注意,我们添加了性别变量来将图形分成两部分,这样它就可以将图形分成两部分,如下图所示。你怎么想呢?男性和女性看起来相似吗?

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

Plot of the Age distribution by gender

bads_sf 和 whoqol_mean 是什么关系?男女都差不多吗?

这一次,我们将探讨两个变量之间的关联或关系。我们要画什么样的图,取决于我们要处理的变量的性质。下表将为您提供一些思路:

*| X variable | Y variable | Type of graph | Geometry         |
|------------|------------|---------------|------------------|
| Continuous | Continuous | Scatterplot   | geom_point()     |
| Continuous | Categorical| Boxplot       | geom_boxplot()   | 
| Categorical| Continuous | Boxplot       | geom_boxplot()   |
| Categorical| None       | Barplot       | geom_bar()       |
| Continuous | None       | Histogram     | geom_histogram() |*

因为 bads_sf 和 whoqol_mean 都是连续的,所以我们可以画一个散点图。但是还有什么能解释呢?如果我们认为 whoqol_mean 之间可能存在某种关系,因此如果 bads_sf 得分增加,那么 whoqol_mean 也会增加,我们可以使用散点图来测试这一点,并绘制线性回归来绘制它们之间的关系(线性回归或建模超出了本教程的范围,但我们将只显示图表,而不会在此写更多)。

代码如下:

*mydata4 %>%
  ggplot() +
  ***geom_point(aes(x = bads_sf, y = whoqol_mean))*** +
  ggtitle("Association between bads_sf and whoqol") +
  xlab("BADS-SF score") +
  ylab("WHOQoL Score") +
  ggsave("bads_who.png")*

这是关联图:

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

Association between BADS-F score and WHOQoL score, you see a positive association

现在我们需要进一步验证它,看看男性和女性之间的联系是否相似。因此,我们添加了一条回归线,并为男性和女性的点和线涂上不同的颜色:

首先是代码:

*mydata4 %>%
  ***mutate(gender = as.factor(Sex)) %>%***
  ggplot() +
  geom_point(aes(x = bads_sf, y = whoqol_mean, ***colour = gender***)) +
  ***geom_smooth(aes(x = bads_sf, y = whoqol_mean, colour = gender), method = "lm")*** +
  ggtitle("Association between bads_sf and whoqol") +
  xlab("BADS-SF score") +
  ylab("WHOQoL Score") +
  ggsave("bads_who_lm.png")*

然后是图:

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

Association between BADS-SF and WHOQoL scores

这是怎么回事?

  • 我们必须添加一个新的变量“性别”,从“性别”开始,所以使用 mutate 函数将其转换为因子变量,而不是字符变量。因子变量是一个分类变量,但是明确地具有根据字母或数字顺序排列的级别。这对于后续步骤是必要的,在这些步骤中,我们想要测试关系中的差异。
  • 我们想测试这些点会有什么不同,所以我们用性别变量给它们涂上不同的颜色。请注意,我们将颜色参数放在了贴图的美学中。
  • 类似地,我们想使用平滑函数,在我们的例子中,这是“线性模型”,因此选择“lm”作为方法。但这必须贴在美学参数之外的 。在平滑线条的美学中,我们需要指出,我们想要不同颜色的线条来表示性别变量的级别。

那么,你认为你在这段关系中看到了什么?性别差异大吗?我们可以继续探索更多的数据集,但我们需要在这里停下来,总结一下我们迄今为止所做的工作。

结论

这是一个教程,我们涵盖了以下主题:

  • Jupyter notebooks 是免费的开源工具,使您能够进行数据科学工作,同时还允许您充分利用 R 和 Python(以及其他语言)的潜力来进行数据分析。
  • 您可以进行二次数据分析和整理数据,而实际上无需使用任何其他工具(如电子表格)来清理和争论数据。
  • 我们在网上找到了一个使用 CC-0 许可(creative commons licence,可以自由使用数据集)的数据集和一篇研究数据集的文章。
  • 我们学习了如何使用 tidyverse 环境来检查、子集化、过滤和绘制数据。

我希望这能激励你去处理更多的数据集。记住,你练习得越多,你的技能就会越好。如果你需要更多的信息和问题,请在评论区发表。我希望它是一个快速的介绍,所以没有介绍一些关于整齐的数据和统计程序的其他概念;这将在随后的文章中讨论,你会在网上找到更多的信息。快乐分析!

这里有一个到 jupyter 笔记本的链接,用于这个分析

如何在 BigQuery ML 中使用 K-Means 聚类来更好地理解和描述数据

原文:https://towardsdatascience.com/how-to-use-k-means-clustering-in-bigquery-ml-to-understand-and-describe-your-data-better-c972c6f5733b?source=collection_archive---------9-----------------------

谷歌云上仅使用 SQL 的无监督学习

BigQuery ML 现在支持无监督学习——您可以应用 K-Means 算法将您的数据分组到聚类中。与监督机器学习不同,监督机器学习是关于预测分析的,非监督学习是关于描述性分析的——它是关于理解你的数据,以便你可以做出数据驱动的决策。

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

K-Means clustering is an unsupervised learning algorithm that can help you understand your data and provide descriptive labels to your it. Photo by Randy Fath on Unsplash

你在聚集什么?

首先,确定什么是集群,为什么要集群。假设你是一个零售商,拥有客户交易的数据。有几种方法可以对该数据集进行聚类,这取决于您想要对聚类做什么。

  • 你可以在你的顾客中找到自然群体。这叫做客户细分。用于客户细分的数据可能包括他们去过的商店、购买的商品、支付的金额等。你会试着去了解这些顾客群是什么样的(这些被称为人物角色),这样你就可以设计出吸引这些顾客群成员的商品。
  • 你可以在购买的物品中找到自然群体。这些被称为产品组。您可以根据购买者、购买时间、购买地点等对商品进行分类。你可以试着了解一个产品群的特征,这样你就可以学习如何减少自相残杀或者提高交叉销售

在这两种情况下,你都在使用聚类作为一种启发式方法来帮助你做决定——设计个性化的产品或理解产品交互太难了,所以你为客户群或项目群设计。

请注意,对于产品推荐的特定用例(向客户推荐产品或针对某个产品的客户),最好训练一个 ML 模型来做确切的事情,使用一种协作方法,如 WALS 。但是对于没有现成的预测分析方法的其他决策,聚类可能会给你一种方法来做出数据驱动的决策。

设置聚类问题

为了很好地使用集群,您需要做四件事:

  1. 确定您正在聚类的字段。CustomerId?ItemId?然后,根据该字段的属性对数据进行聚类。
  2. 查找给定客户/项目等的群。属于。
  3. 了解集群的一些属性。
  4. 利用这种理解来做决定。

在本文中,我将展示伦敦自行车共享数据的聚类方法。假设我们围绕自行车共享站的设计和库存做出了许多决策,我们希望了解我们系统中不同类型的站点,以便我们能够以数据驱动的方式做出这些决策。

我们需要做这四件事:

  1. 集群自行车租赁站。我们需要聚类的字段是 station_name,为了这样做,我们需要找到一个站点的属性。
  2. 找到每个站属于哪个集群。
  3. 了解每个集群的特征。
  4. 利用这种理解来做出数据驱动的决策。

但在这之前,我们首先要收集我们需要的数据。

0.收集数据

我们将使用的数据由伦敦的自行车租赁组成,它是欧盟地区的公共数据集,因此如果您想跟踪我的查询,请确保在欧盟地区创建一个名为 demos_eu 的数据集。

我们希望根据以下因素对电台进行分类:

  • 租赁期限
  • 每天的旅行次数
  • 自行车架的数量
  • 离市中心的距离

我们通常在工作日和周末做出不同的决定,例如储备加油站的自行车(即确保加油站有自行车出租)。因此,我们实际上要对其“主键”是 station_name 和 isweekday 组合的实例进行集群。

下面是一个将相关数据汇集在一起的查询:

WITH **hs** AS (
SELECT 
h.start_station_name as **station_name**,
IF(EXTRACT(DAYOFWEEK FROM h.start_date) = 1 OR
   EXTRACT(DAYOFWEEK FROM h.start_date) = 7, "weekend", "weekday") as **isweekday**,
h.**duration**,
s.**bikes_count**,
ST_DISTANCE(ST_GEOGPOINT(s.longitude, s.latitude), 
            ST_GEOGPOINT(-0.1, 51.5))/1000 as **distance_from_city_center**
FROM `bigquery-public-data.london_bicycles.**cycle_hire**` as h
JOIN `bigquery-public-data.london_bicycles.**cycle_stations**` as s
ON **h.start_station_id = s.id**
WHERE h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP) AND CAST('2016-01-01 00:00:00' AS TIMESTAMP)
),**stationstats** AS (
SELECT 
station_name,
isweekday,
AVG(duration) as duration,
COUNT(duration) as num_trips,
MAX(bikes_count) as bikes_count,
MAX(distance_from_city_center) as distance_from_city_center
FROM hs
**GROUP BY station_name, isweekday**
)**SELECT * 
from stationstats
ORDER BY distance_from_city_center ASC**

我们正在提取 2015 年自行车租赁的数据(start_station_name,weekend/weekday,duration )(参见 WHERE 子句),并将其与车站信息(自行车数量,距市中心的距离)相结合。

然后,我们在 stationstats 中计算车站的属性(骑行的平均持续时间、出行次数),并传递车站属性(自行车数、距市中心的距离)。我们的数据集看起来像这样:

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

Dataset that we will use for clustering; The primary key for our data is the combination of station_name and isweekday.

1.BigQuery ML 聚类

进行聚类只需要在上面的 SELECT 查询中添加一个 CREATE MODEL 语句,并删除数据中的“id”字段:

**CREATE OR REPLACE MODEL demos_eu.london_station_clusters
OPTIONS(model_type='kmeans', num_clusters=4,** standardize_features = true**) AS**WITH hs AS (
SELECT 
h.start_station_name as station_name,
IF(EXTRACT(DAYOFWEEK FROM h.start_date) = 1 OR
   EXTRACT(DAYOFWEEK FROM h.start_date) = 7, "weekend", "weekday") as isweekday,
h.duration,
s.bikes_count,
ST_DISTANCE(ST_GEOGPOINT(s.longitude, s.latitude), 
            ST_GEOGPOINT(-0.1, 51.5))/1000 as distance_from_city_center
FROM `bigquery-public-data.london_bicycles.cycle_hire` as h
JOIN `bigquery-public-data.london_bicycles.cycle_stations` as s
ON h.start_station_id = s.id
WHERE h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP) AND CAST('2016-01-01 00:00:00' AS TIMESTAMP)
),
stationstats AS (
SELECT 
station_name,
isweekday,
AVG(duration) as duration,
COUNT(duration) as num_trips,
MAX(bikes_count) as bikes_count,
MAX(distance_from_city_center) as distance_from_city_center
FROM hs
GROUP BY station_name, isweekday
)**SELECT * except(station_name, isweekday)
from stationstats**

该查询处理了 1.2 GB 的数据,耗时 54 秒。模型模式列出了聚类中使用的 4 个因素:

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

The K-Means model schema

请注意,我们已经在我的创建模型中指定了所需的集群数量(num_clusters=4 ),并删除了我们不想在其上进行集群的因素(station_name 和 isweekday)。如果您的要素具有不同的动态范围,标准化要素是一个很好的选择(bikes_count 在 10–50 范围内,而 num_trips 在数千范围内,所以我正在这样做)。

如果我们忽略分类的数量,BigQuery ML 将根据训练数据集中的总行数选择一个合理的默认值。我们也可以做超参数调整来找到一个好的数字。本质上,我们将为 num_clusters 的不同值运行聚类,找到误差度量,并选择图形稳定的点。误差测量可通过下式获得:

SELECT davies_bouldin_index 
FROM ML.EVALUATE(MODEL demos_eu.london_station_clusters)

数字越小,聚类越好。

2.一个站属于哪个集群?

特定的站属于哪个集群?您可以使用 ML.PREDICT 获得该值。以下是查找名称中包含“Kennington”的每个电台的聚类的查询:

WITH hs AS ...,
stationstats AS ...,SELECT * except(nearest_centroids_distance) 
FROM **ML.PREDICT(MODEL demos_eu.london_station_clusters, 
(SELECT * FROM stationstats WHERE REGEXP_CONTAINS(station_name, 'Kennington')))**

这会产生:

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

Which cluster do the Kennington stations belong to?

3.检查集群

您可以查看聚类质心,即模型模式中 4 个因子的值,使用:

SELECT * FROM ML.CENTROIDS(MODEL demos_eu.london_station_clusters)
ORDER BY centroid_id

通过一点 SQL 操作,我们可以透视上表:

WITH T AS (
SELECT 
centroid_id,
ARRAY_AGG(STRUCT(feature AS name, ROUND(numerical_value,1) AS value) ORDER BY centroid_id) AS cluster
FROM ML.CENTROIDS(MODEL demos_eu.london_station_clusters)
GROUP BY centroid_id
)SELECT
CONCAT('Cluster#', CAST(centroid_id AS STRING)) AS centroid,
(SELECT value from unnest(cluster) WHERE name = 'duration') AS duration,
(SELECT value from unnest(cluster) WHERE name = 'num_trips') AS num_trips,
(SELECT value from unnest(cluster) WHERE name = 'bikes_count') AS bikes_count,
(SELECT value from unnest(cluster) WHERE name = 'distance_from_city_center') AS distance_from_city_center
FROM T
ORDER BY centroid_id ASC

这会产生:

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

Clusters’ attributes

要可视化该表,请单击“在 Data Studio 中浏览”并选择“带条形的表”。将质心列作为“维度”,其余列作为度量。然后你会得到:

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

Cluster attributes, visualized in Data Studio

这使我们能够解释集群。本质上,聚类#1 由人们长途乘车的郊区车站组成,聚类#2 由其他郊区车站组成,聚类#3 由繁忙的城市车站组成,聚类#4 由不那么繁忙的城市车站组成。

基于这些特征和对伦敦的一些了解,我们可以为这些集群想出描述性的名字。群组 1 可能是“一日游”,群组 2 可能是“卧室社区”,群组 3 可能是“旅游区”,群组 4 可能是“商业区”。

4.做出数据驱动的决策

让我们使用这些集群来做出不同的决定。

  • 我们刚刚得到资金,可以扩大自行车架。我们应该在哪些车站增加额外的容量?如果我们没有聚类数据,我们会倾向于选择出行量大但自行车数量不足的站点,即聚类#3 中的站点。但是我们做了聚类,发现这组车站主要服务于游客。他们不投票,所以我们将把额外的容量放在集群#2(卧室社区)。
  • 我们需要试验一种新型的锁。我们应该在哪一组站上做这个实验?商业区站似乎是合乎逻辑的,果然这些站有很多自行车,并且足够繁忙以支持 A/B 测试。
  • 我们想在一些加油站储备赛车。哪些?第一组,为出城一日游的人服务的车站。

显然,我们可以通过每次进行定制数据分析来单独做出这些决定。但是把电视台聚集在一起,想出描述性的名字,并用这些名字来做决定要简单得多,也更容易解释。

你只用 SQL 就能做到这一切的事实?那很酷。

如何利用学习和发展培训来推动创新

原文:https://towardsdatascience.com/how-to-use-learning-development-training-to-drive-innovation-793ec5b91ff?source=collection_archive---------22-----------------------

L&D 对数据科学的优势和益处。

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

最近的研究揭示了各行各业的组织如何利用学习和发展(L & D)培训来最大化他们的创新潜力。实践培训专家已经确定了一些关键的策略,这些策略有助于将创新文化带入你的办公室。

在当今全球化的市场中经营企业的复杂现实往往意味着面临激烈的全球竞争,并不断更新您组织的目标,以跟上您所在行业的最新和最大的创新趋势。在以技术为基础的行业和数据科学功能中尤其如此,在这些行业中,新的创新和通往数字化的道路是每天的现实。

虽然竞争前景可能令人望而生畏,但职业发展培训是在你的工作场所文化中巩固创新的直接而有效的方式。

来自 findcourses.com 的 2019 年 L&D 报告基准测试了各行业和市场的公司如何利用 L&D 培训来保持其组织在各自领域的创新前沿。该报告发现了收入增长、学习和创新之间的持续关系。从在您的培训基础设施中构建敏捷性,到在培训环境中利用最新技术,培训专业人员展示了企业如何利用 L&D 培训来构建可持续的创新文化,从而在 21 世纪的市场中导航。

敏捷的培训基础设施孕育着灵活性

在数据科学部门或以技术为基础的行业工作时,您可能会觉得敏捷性已经成为您日常职责的一个固有方面。诚然,这些角色和行业通常需要相当大的灵活性,但问自己一些关键问题也是值得的:

贵组织的培训基础设施中融入了多少灵活性?此外,这种敏捷性可以转化为您的整体工作场所文化吗?

据 Wyndham Destinations 负责学习和发展的副总裁 Anthony Sandonato 称,为 110 多个国家的 25,000 多名员工实施敏捷培训基础设施是成功的核心战略。Sandonato 解释说,温德姆的“L&D 团队结构建立在灵活的框架之上,旨在保持敏捷并适应持续的组织变化,而不会影响我们人才发展战略的速度或质量。”

创建敏捷培训功能将有助于您将培训目标与组织目标的整体转变保持一致。这些目标可以随时改变,因为每个企业都试图跟上最新的创新和趋势。虽然数据科学是一个技术密集型领域,但如果你希望吸引和留住最优秀的人才,那么在评估技术的创新性之前,你应该接受这样一种心态,即灵活和创造性的工作场所文化应该是你的优先事项

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

该报告还发现,高管高度参与 L&D 事务的公司认为自己公司有创新文化的可能性是其他公司的 3 倍。在具有敏捷培训功能(由高层管理人员引入)的培训室中展示灵活心态的重要性,将有助于自下而上地带来
文化变革。

在来自英国的一份类似的研发报告中,41%的市场挑战者预测他们的研发预算会增加。L & D 有助于为员工创造空间,将适应性和敏捷性从理论领域带入实际应用。

敏捷数据科学并不总是所有团队的完美方法,但是根据 Eugene Yam 的说法,“数据科学团队在‘倾听数据’和研究方面有优势。应用创新来改善组织成果应该是他们使命的一部分。”[1]一旦您将敏捷性确立为贵组织培训职能的一个关键原则,在培训室学到的灵活技能和策略就可以扩大规模,以提高您数据科学职能的整体质量和能力。

从数据科学到培训室,技术无处不在

一旦你在你的培训职能和整个运营层级中建立了创新文化,重新评估技术在你的培训产品中的使用是使创新成为新的文化规范的合乎逻辑的下一步。

技术和数字化是商业世界中一条持续且不可避免的道路,在评估完成工作的最佳技术时,培训行业与数据科学没有什么不同。

报告发现,在所有被调查的公司中,高达 84%的公司在他们的 L&D 职能部门使用技术。从电子学习到微视频再到虚拟现实,创新技术彻底改变了培训行业。此外,该报告发现,收入增长的公司在其 L&D 产品中使用虚拟现实和基于游戏的学习等创新技术的可能性是其他公司的两倍。

在培训环境中利用这些创新技术,不仅会影响您培训基础设施的整体灵活性,还会强化理论培训原则,并将其引入您蓬勃发展的创新文化中。深度强化学习(DRL)通过游戏化的人工智能训练策略如平均场、随机和进化游戏都是利用技术力量并最大限度地发挥其训练潜力的创新方式。

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

虚拟现实(VR)通过你的培训功能提供了另一个保持创新文化的机会。数字教练公司 STRIVR 的首席战略官丹尼·贝尔彻(Danny Belch)表示:“由于虚拟现实的按需特性,只需点击一个按钮,就可以激发真实的生活体验。你现在可以练习这些情况。通过完整的端到端实践,您可以获得合法的逼真场景。这不是角色扮演。它是孤独的,赌注是免费的。你有这个美丽的自由空间去练习,去结结巴巴地说你的话。”

除了基于游戏的学习,通过虚拟现实创建真实生活场景来培训新员工或现有员工不仅是强化重要学习目标的好方法,还可以帮助您在测试中从员工那里获得即时而有价值的反馈,深入了解正在使用的技术的具体特性。

外卖

拜耳美国学习与人才发展主管凯伦·比金说:“当你生活在创新中时,你可以影响创新。”利用创新的 L&D 培训战略,开始构建基础设施,以支持您组织中的创新文化,并期待培训技术的力量进一步推动培训室的创新。推动创新不会在一夜之间带来变化,但 L&D 培训可以让每个参与者的旅程变得更加高效、富有成效和创造性。

引用资料来源:
[1] E. Yam。数据科学与敏捷(2019),走向数据科学。

如何利用机器学习预测药物不良反应

原文:https://towardsdatascience.com/how-to-use-machine-learning-to-forecast-adverse-drug-reactions-abc83ab91afd?source=collection_archive---------34-----------------------

利用机器学习改善患者结果

更新:我开了一家科技公司。你可以在这里找到更多

当病人对药物产生意外反应时,对个人来说是危险的,对社会来说也是昂贵的。然而,如果医疗专业人员可以使用机器学习来预测不良药物反应(ADRs)并最小化对患者的风险,会怎么样?

药品不良反应是医疗保健行业的一个大问题,直接占所有住院人数的大约5%,估计是全球第六大死亡原因。个性化药物已经是一个快速发展的趋势,但是想象一下,如果医生能够在给病人开药之前预测出病人发生药物不良反应的可能性。

FDA 的不良事件报告系统( FAERS )收集全世界记录的每一个不良事件的信息。我们利用这些数据训练了一个机器学习模型来预测 ADRs,并探索奥美拉唑药物不良反应的原因。

1.将数据加载到 Mind Foundry

FAERs 数据集包含大量信息,但我们采取了额外的预防措施来排除那些预先假定存在 ADR 的变量,如去挑战/再挑战代码。

将数据加载到 Mind Foundry 后,我们能够看到遭受药物不良反应的患者的汇总统计数据。

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

特别是,我们可以看到每个 ADR(例如住院)在其他变量中的分布情况。

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

我们用来预测不良反应的因素是患者的:

  • 性别、年龄和体重
  • 剂量、形式、频率和途径
  • 累积剂量
  • 药品制造商

数据集中包括的 ADR 有:

  • 死亡
  • 危及生命的情况
  • 残疾
  • 住院治疗(= hospitalization)
  • 其他严重

2.准备数据

Mind Foundry 会自动扫描数据以发现潜在问题,并就如何最好地为机器学习建模准备数据向用户提供建议。

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

基于我们对数据的理解,我们选择简单地将剂量、频率和形式中的缺失值标记为“未知”。然后,我们可以通过简单的点击来自动应用建议。

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

Mind Foundry 还对应用于数据的每个处理步骤进行完整的审计跟踪,然后可以编辑或导出新数据。

3.模拟不利住院

当我们准备好构建我们的模型时,我们需要做的就是告诉 Mind Foundry 我们希望预测哪一列。然后,它会自动处理数据到训练集和测试集的严格分割,所以它不会过度适应您的解决方案。

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

然后,Mind Foundry 将开始搜索最佳数据科学管道,并在搜索过程中提供一些性能统计数据。

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

4.验证和解释模型

一旦找到最佳解决方案,Mind Foundry 会通过指示其预测能力与随机模型相比是否显著来验证模型的健康状况。这些测试是在从训练中排除的原始数据集的 10%范围内执行的。

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

Mind Foundry 还指出了每个变量在模型决策中的相对权重,以及每个变量如何影响结果。

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

4.调查结果

Mind Foundry 指出,住院的机会随着患者年龄的增长而增加,但随着体重的增加而减少。

这可能看起来很奇怪,但考虑到超过一定体重后残疾的可能性会显著增加,因此成为主要的 ADR,这是可能的。

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

制药商似乎对住院几率也有轻微影响。最后,口服途径和 40 毫克剂量的片剂将增加住院的机会。

这项简短的研究强调了机器学习使用患者数据预测 ADR 的潜力。从更大的角度来看,它还揭示了医生根据每个患者的具体情况量身定制处方的可能性,以及药品制造商为高危患者群体重新设计治疗方法的可能性。

如何利用机器学习有可能成为百万富翁:预测股市?

原文:https://towardsdatascience.com/how-to-use-machine-learning-to-possibly-become-a-millionaire-predicting-the-stock-market-33861916e9c5?source=collection_archive---------2-----------------------

我们的置信区间在 50%到 70%之间

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

When you’re so bored with your stacks

在华尔街工作和你想象的一样紧张和有回报。许多西装,许多阴沉的脸和大量的香烟烟雾。在你所期待的世界金融中心的疯狂中,每个人的潜在目标都很简单。冒着把事情过于简单化的风险,我现在就告诉你,金融就是用钱(你自己的或者你借的)来获得更多的钱。金融业实际上并不创造任何价值,而是利用其他因素来获得投资回报。

股票市场是最著名的基础设施之一,通过它任何人都有可能发财。如果有人能破解预测未来股票价格的密码,他们将几乎统治世界。

只有一个问题。准确预测股票市场的未来几乎是不可能的。那么多的分析师,那么多的研究人员,那么多超级聪明的人都试图弄清楚这一切。没有人能够获得一致的结果。没有人。

那么这篇文章的重点是什么呢?为什么我要写关于使用机器学习来预测股票市场的可能性?我猜主要是为了好玩。然而,更重要的是,对于机器学习和金融来说,这是一个很好的学习练习。

议程

  1. 储料器模块
  2. 移动平均线
  3. 简单线性回归
  4. k-最近邻
  5. 多层感知器
  6. 你应该做什么
  7. 需要改进的地方
  8. 资源

如果你想更深入地了解这个项目,或者如果你想添加代码,查看一下 GitHub 库

使用储料器模块

Stocker 模块是一个简单的 Python 库,包含了许多有用的股票市场预测函数。在初始化时,它们不是那么准确(最好抛硬币决定)。但是通过一些参数的调整,结果会好得多。

首先我们需要克隆 GitHub 库。

!git clone [https://github.com/WillKoehrsen/Data-Analysis.git](https://github.com/WillKoehrsen/Data-Analysis.git)

我们还需要导入一些库。既然已经克隆了 repo,我们也可以导入 Stocker 模块了。

!pip install quandl
!pip install pytrends
import stocker
from stocker import Stocker

让我们创建一个 Stocker 对象。我选择谷歌作为我的公司,但你没有义务也这样做。Stocker 模块有一个名为 plot_stock()的函数,它自己做了很多工作。

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

Google’s stock is very nice

如果您注意的话,您会注意到 Stocker 对象的日期不是最新的。止于 2018–3–27。仔细看看实际的模块代码,我们会发现数据来自 Quandl 的 WIKI 交换。也许数据没有更新?

我们可以使用 Stocker 进行技术股票分析,但现在我们将专注于成为媒介。Stocker 使用了一个由脸书开发的叫做 prophet 的软件包,这是一个很好的附加建模软件。

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

现在让我们测试一下斯托克的预测。我们需要创建一个测试集和一个训练集。我们将培训时间定在 2014 年至 2016 年,测试时间定在 2017 年。让我们看看这个模型有多精确。

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

Look how terrible this prediction is!

结果相当可怕,预测几乎和掷硬币一样糟糕。让我们调整一些超参数。

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

Here we can see the results of using different changepoints

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

对变点进行验证是调整超参数以更好地调整股票预测算法的有效方法。

现在,我们可以评估优化的模型,看看预测估计值是否有任何改进。

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

This is only SLIGHTLY better than the previous model

现在是做终极测试的时候了:去股市碰碰运气(当然是模拟的)。

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

Looks like it’s just better to buy and hold.

即使在所有这些调整之后,很明显,简单地买入并持有会产生更好的回报。

为机器学习准备数据

现在让我们继续尝试用机器学习来预测股票价格,而不是依赖于一个模块。对于这个例子,我将使用 Stocker 提供的 make_df 函数来使用 Google 股票数据。

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

Narrowing down the dataframe to get the stuff we care about

移动平均线

总之,均线是技术分析中常用的指标。这是一个滞后指标,这意味着它使用过去的价格来预测未来的价格。它可以有效地消除任何短期波动,并找到整体趋势。我们将使用移动平均线来看看我们是否能更好地预测股票价格。

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

Here’s the closing prices for Google stock

让我们用 RMS(均方根误差)来衡量我们模型的准确性。

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

现在让我们看看我们的预测在实际价格旁边的位置。

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

Yikes

就找出股票数据的总体趋势而言,移动平均线方法做得不错,但它未能看到价格上涨的全部幅度,这不好。我们肯定不想用这种方法进行实际的算法交易。

简单线性回归

让我们尝试使用另一种方法来预测未来的股票价格,线性回归。

首先,让我们基于原始数据集创建一个新的数据集。

现在,让我们为线性回归算法的数据集添加更多的要素。我们将使用 fastai 模块中的一些函数。

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

现在让我们做一个火车测试分裂。

现在我们可以实现算法并得到一些结果。

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

再一次,预测算法在某种程度上指出了总体趋势,但是它没有抓住我们最需要的东西。

k-最近邻

让我们继续另一个机器学习算法,KNN。

让我们用和线性回归一样的数据经历同样的过程。唯一的区别是我们将对数据实施不同的算法。让我们看看哪些预测更好。

我们的结果是什么?

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

What a horror story

呀!这是迄今为止我们得到的最糟糕的预测!k-最近邻对于分类问题和小规模回归更有用是有原因的。这似乎是过度拟合的典型案例。因为 KNN 实际上只是计算从一个点到另一个点的距离,它完全无法计算出价格走向的趋势。下一步是什么?

多层感知器

让我们进入一些深度学习,更具体地说,神经网络。多层感知器是最简单的神经网络类型之一,至少比卷积神经网络和长短期记忆简单。我们不需要深入算法实际工作的细节。如果您感兴趣,请查看本文末尾的参考资料。

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

让我们看看结果。

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

这比 KNN 还糟糕!关于为什么神经网络在预测股票价格方面如此糟糕,有许多因素,其中之一肯定是缺乏有意义的特征和数据。显然,还有许多超参数可以调整。

结论

我们今天学了什么?所有这些技术分析向我们展示了什么?答案很简单:如果你不是雷伊·达里奥、沃伦·巴菲特或任何伟大的投资者,那么试图跑赢股市的风险很大,最终也不会那么有利可图。根据一些消息来源,大多数对冲基金甚至不能比标准普尔 500 做得更好!因此,如果你想在你的投资上获得最好的回报,就采取买入并持有的策略。在很大程度上,简单地投资于标准普尔 500 这样的指数基金已经获得了相当不错的回报,即使是在经济出现几次大幅下滑的时候。最后还是要由你来决定。

需要改进的地方

感谢您花时间通读这篇文章!请随意查看我的作品集网站我的 GitHub

1.使用不同的股票数据

我只在相对较短的时间内使用了谷歌股票数据。随意使用不同的数据,这些数据可以通过 Stocker 或 Yahoo Finance 或 Quandl 获得。

2.尝试不同的机器学习算法

有许多非常好的机器学习算法。我只使用了其中的一小部分,其中只有一个是深度学习算法。

3.调整更多超参数

这是不言自明的。大多数情况下,任何算法的默认设置都不是最优的,因此尝试一些验证来找出哪个超参数最有效是很有用的。

资源

  1. 了解股市
  2. 技术分析
  3. 什么是机器学习?
  4. 移动平均线
  5. 线性回归
  6. K-最近邻
  7. 神经网络
  8. 张量流
  9. Keras

如何利用新闻文章预测 BTC 价格变化

原文:https://towardsdatascience.com/how-to-use-news-articles-to-predict-btc-price-changes-c37e305a97f?source=collection_archive---------9-----------------------

itcoin (BTC)的价格变化是不稳定的,原因有很多,例如公众对其特别不同的感知价值和高知名度的损失。在本文中,我们关注的是其中的一个主要因素,BTC 新闻文章的影响。由于 BTC 过去的势头和加密货币市场中 BTC 市场的巨大份额,已经存在一个庞大的 BTC 玩家群体。然而,在这个市场中仍然缺乏一种定量分析的方法来做决定,所以我们在这里努力基于机器学习算法来帮助解决这种情况。

利用各种普通的监督机器学习算法并探索半监督算法,我们建立了一个模型来预测某篇新闻文章是否会导致 BTC 价格的明显上涨或下跌,以帮助 BTC 玩家做出更合理的卖出或买入 BTC 的决定。

我们的项目大致分为三个主要部分,金融数据处理、新闻文章处理和最终预测模型。迫不及待地想现在就走完整个流程!

财务数据处理

我们在 Kaggle 上收集了 BTC 从 2018 年 1 月 1 日到 2018 年 1 月 4 日的逐秒数据集,这些数据集在转换为基于天的数据集后由以下信息组成。

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

根据股票市场的经验法则,股票价格的明显变化被定义为价格波动超过过去 30 天滚动平均价格的 2 个标准差,但没有公认的明显 BTC 价格变化的定义。由于 BTC 价格的剧烈和不断变化,很难测试哪个数量的标准差是最明显的。因此,我们使用与 BTC 股票市场相同的 2 个标准差。代码如下所示,

Basic math equation of calculating 2 standard deviations

根据指标,我们得到并标记了在我们选定的时期内 BTC 价格发生明显变化的日期。然后,我们将日期分为三组,第一组具有明显的价格上涨,即正标记(日期:2018 年 3 月 19 日),第二组具有明显的价格下跌和正标记(日期:2019 年 2 月 5 日、2019 年 3 月 15 日、2019 年 3 月 17 日、2019 年 3 月 18 日),另一组价格变化在 2 个标准偏差内。

现在我们进入第二部分,新闻文章的数据处理。这两部分的逻辑联系将在第三部分阐述。

新闻文章

我们使用 news API(可以使用下面的键)来提取与第一部分相同的指定日期范围内的新闻文章。

Available News API keys

从新闻文章中摘录的内容如下表所示:

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

News articles’ extracted contents

由于新闻文章的导语总是包含着最重要的信息,而且有很多读者只是略读导语段落,所以对于 内容 栏目,我们只提取了新闻文章的导语。

我们将所有提取的文章的引言段落中出现频率最高的前 100 个词(首先完成了词干化和词干化,并删除了停用词)作为我们的语料库,我们认为它们与 BTC 交易和价格最相关,因此如果一篇新闻文章在前 300 个词中没有提到这些关键词中的任何一个,我们就认为这篇文章与 BTC 无关,然后将其从我们待探究的文章中排除。(前 300 个单词是通过实证分析得出的新闻文章的主要思想,我们不选择介绍性段落是因为有时导语少于 300 个单词,我们希望涵盖更多的文章),

以下是 100 字的部分内容。

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

Words of top occurrences in news articles

与上述三个日期组相匹配,新闻文章也被分成三组。三者中,价格变化明显的两个群体是我们关注的重点。

然后我们处理我们的功能,直到现在,我们已经得到了每篇文章的作者和出版商。为了将文本数据转换为数字数据,首先,我们根据作者和出版商在我们选择的文章中发布的文章数量对他们进行排名,然后通过查看文章数量的分布,我们将作者和出版商分成编号为 1 到 5 的五组,以使每组的人口大致相同。

我们没有简单地对作者和出版商进行分类的原因是,只有基于树的算法(如随机森林)才能识别类别号,而非基于树的算法(如 SVM)会将类别号视为一些有意义的数字,这将极大地影响模型的准确性。

情感分析

新闻文章有一个非常重要的特性,即其中所表达的主流情绪。许多组织已经开始对新闻文章进行情感分析,比如微软的 Azure、谷歌的云自然语言 API 以及 python 的 NLTK 包。

我们研究了谷歌的 API 和 Azure,在将两者与我们自己对文章中情感的判断进行比较后,结果表明谷歌在我们的模型中表现得更好。在许多研究中,谷歌的 API 也是所有工具中准确率最高的。

要使用 Google API 或 Azure,你必须获得认证,用 Python 进行情感分析的详细设置过程可以参考https://www . ka ggle . com/c/new-York-city-taxi-fare-prediction/data

Google API 给出的结果有 4 列,我们只使用其中的两列,一列是分数,另一列是震级。分数对应于总体的消极、中性或积极情绪,范围从 -11-1 表示完全消极的情绪,1 表示积极的极端,0 表示中性情绪。总体情绪的其他程度在 -11 之间变化。评分已经归一化,也就是说新闻文章的字数不会影响这个数字。量级衡量积极和消极情绪的整体强度。与 s 核心不同,幅度没有归一化,所以它与文章长度成比例,范围从 0 到 +inf 。例如,如果一个作者在一篇文章中表达了强烈的积极和消极情绪,抵消了积极情绪,那么这篇文章中传达的整体情绪将是中性的。然而,量级统计了所有的累积情绪,所以最终的分数可能是 0 ,但是量级大于 3 或者其他什么大的数字。

以下是谷歌给出的一些例子,

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

Examples of sentiment judgment

(详细的文档可以在

https://cloud . Google . com/natural-language/docs/basics # interpreting _ 情操 _ 分析 _ 价值观

为了避免新闻文章字数会影响量级数量的问题,我们也对其进行了归一化处理。

TF-IDF 探索

在一组新闻文章中,一些重要的词可能在某篇新闻文章中多次出现,而在其他新闻文章中很少出现。当读者阅读一篇文章时,重复出现会加强视觉效果,因此读者更有可能对这些文章做出反应。TF-IDF 分数正好帮助我们很好地衡量影响。TF-IDF 代表术语频率-逆数据频率,是两部分的乘积。

第一部分是词频,它用一个等式计算文档(在我们的研究中是新闻文章)中每个词在语料库中的出现频率,

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

n_i,j 表示一个单词 i 在一个文档 j 中出现的次数,分母为文档 j 中的总字数。

第二部分是逆数据频率,其用途是计算我们所有文档(所有新闻文章)中的稀有词的权重,如下所示:

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

N 是文档总数, df_t 是包含单词 t 的文档数。因此,很少出现在所有文档中但只出现在少数文档中的单词将由于低的 df_t 值而具有高的 IDF 分数。

最后将以上两部分相乘得到 TF-IDF 得分。

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

因此,如果单词 i 在一篇新闻文章中出现多次,但在其他新闻文章中很少出现,从而导致 TF-IDF 得分较高,我们可以得出结论,该单词在这篇文章中很重要。在删除停用词后,我们将 TF-IDF 得分高的词视为新闻中的重要词,因此我们对最高的 5 个 IF-IDF 得分进行平均,以衡量视觉效果。计算结果基本上如下所示:

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

TF-IDF calculation result

干杯!所有的食物洗好了,调料拌好了,剩下的唯一任务就是倒入锅里煮。现在让我们来看看预测模型吧!

预测

监督算法

在我们的模型中,我们总共有 5 个特征,即出版商、作者、情感得分、情感幅度得分和 TD-IDF 得分,数据如下

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

Prediction model’s five features

预测的数据是二进制数。如果预测值为 0,则认为新闻文章对 BTC 市场没有影响,不会引起明显的价格变化。否则,这篇新闻文章将引起明显的价格变化。我们的 BTC 应用程序即时发布的结果可以供 BTC 投资者参考,以决定是否购买或出售,投资者的即时反应可以帮助他们节省或赚取合理的金额。

预测的精确程度由两个指标来检验。首先,我们使用传统的度量标准“准确性”来测试它。此外,我们还绘制了内置概率计算功能的算法的 ROC 曲线,并显示了每条 ROC 曲线的 AUC 值。我们还探索 ROC-AUC 度量的原因是我们希望更多地关注阳性结果 1。如果 BTC 玩家在当天的大部分新闻中看到 1,他们将获得 BTC 价格极有可能上涨的信息,从而购买更多的 BTC 来投机。然而,如果价格实际上是下降而不是上升,买家将需要相当大的成本来弥补损失。相反,如果预测价格会下降,但实际上是上升的,与买方的反应相比,卖方的损失相对较小。总之,积极的是更有价值的,因为它的高成本的属性。从准确性和 ROC-AUC 度量,我们可以找到性能最好的算法。

我们使用逻辑回归、随机森林、SVM、KNN、感知器和 XGBoost 进行预测。准确度结果如下所列,

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

Comparison of tranning and test accuracy

可以看出,随机森林算法是 6 种算法中训练和测试精度最高的算法。

并且 ROC-AUC 产生了相同的结论,在所有其他算法中具有最大的 AUC 分数,

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

ROC-AUC of Random Forest

半监督算法

在现实情况下,很难像预期的那样收集大量数据,因此我们提出了探索半监督算法的想法,以仅利用部分可接近的数据来生成更多的自我标记数据,然后进行预测。

目前的半监督学习领域已经发展成为一个完善的知识体系,所以我不打算在这里讲述它的细节。基本上,有三种半监督学习,主动学习,纯直推式学习和模型丰富的直推式学习。具有不同数据集特征和最终目标的项目应该匹配合适的半监督模型。因为我们的模型的目标函数不是凸的,我们选择使用直推式支持向量机(TSVM)。

我们利用 100 个标记样本和 1014 个未标记样本来预测 478 个未标记测试样本。最后,TSVM 得到了 67%的准确率。与使用监督算法 SVM 的 60%相比,TSVM 显示出改进,这基本上是半监督学习的主要使用,同时受到有限数据集的约束。

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

Comparison of SVM and TSVM

我们还努力检查了基于图的模型,标签传播。它的方法论可以简化为下图,

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

Graph-based semi-supervised model

然而,其中一个关键的输入数据集是由专家给出的标记数据,旨在不断改进标签,但我们缺乏,所以在未来,我们将更深入地挖掘这种方法,并试图从中寻找一些有用的输出。

未来的探索与思考

尽管我们的模型取得了令人满意的结果,但仍有一些潜在的问题需要考虑。已经出现的一个与神经网络有关,这是我们将来要探索的。

在范式 NLP 公式的约束下,神经网络(NN)可以提取当前文章中包含的信息,但是它们不能提取与未来事件相关的信息。也就是说,作为一个例子,如果我是以色列公民,我读到某个重要人物被暗杀,那么作为一个不仅了解历史而且了解报复能力的知情读者,我可以推断这种行为的后果——比如经济和/或军事报复。另一方面,一个完全的局外人会阅读同一篇文章,只知道有人被暗杀了,而且这个人很重要,值得写出来。NN 的就像后者。

所以我们必须弄清楚是否有办法绕过老练的读者和天真的读者之间的鸿沟——但是基于 ML 公式/方法。

对于未来的应用,我们计划开发一个聊天机器人来自动化我们的预测显示。原型接口是

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

Prototype interface of Chatbot

它一般有三个部分,一个用于提问的聊天窗口,可供参考的实时 BTC 价格图表和带有作者和出版商标签的新闻文章,以及情感评分、幅度和 TF-IDF 评分。

我们对任何问题都持开放态度,我们非常欢迎您提出建议。如果你对这个项目有热情,请随时与我在 chelsea.yangmi@gmail.com 联系!

如何使用 NLP 分析 WhatsApp 消息

原文:https://towardsdatascience.com/how-to-use-nlp-to-analyze-whatsapp-messages-1adf0e85907c?source=collection_archive---------8-----------------------

NLP-WhatsApp

使用 NLP 分析我和妻子之间的 WhatsApp 消息

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

2018 年 8 月 17 日,我和我梦想中的女人结婚了,想在婚礼前一天送她一份礼物给她一个惊喜。当然,作为一名数据科学家,我必须通过数据进行交流!

我们的 WhatsApp messages 似乎是一个很好的信息来源。我使用 NLP 来分析消息,并创建了一个小的 python 包,名为【SOAN】,它允许你这样做。

在这篇文章中,我将指导你完成我所做的分析,以及你将如何使用我创建的包。点击链接,获取将 WhatsApp 文本下载为. txt 的说明。

预处理数据

该包允许您预处理。txt 文件作为特定的格式是进行分析所必需的。只需导入 helper 函数来导入数据和处理数据。 import_data 用于导入数据,而 preprocess_data 用于准备数据,以备分析。

from soan.whatsapp import helper      # Helper to prepare the data
from soan.whatsapp import general     # General statistics
from soan.whatsapp import tf_idf      # Calculate uniqueness
from soan.whatsapp import emoji       # Analyse use of emoji
from soan.whatsapp import topic       # Topic modeling
from soan.whatsapp import sentiment   # Sentiment analyses
from soan.whatsapp import wordcloud   # Sentiment-based Word Clouds%matplotlib inline
df = helper.import_data('Whatsapp.txt')
df = helper.preprocess_data(df)

在对数据进行预处理后,您将得到几个列:Message_Raw、Message_Clean、Message_Only_Text、User、Date、Hour、Day_of_Week。Message_Raw 包含原始消息,Message_Clean 仅包含消息本身,不包含用户或日期,Message_Only_Text 仅保留小写文本并删除任何非字母数字字符:

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

The first row of our cleaned messages. It is in Dutch but basically states if I made it home alright 😛

探索性数据分析(EDA)

既然已经对数据进行了预处理,就可以根据消息的频率创建一些初始图。调用 plot_messages 绘制每周的信息频率:

general.plot_messages(df, colors=None, trendline=False, savefig=False, dpi=100)

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

Weekly count of the number of messages over time.

有趣的是,这表明在 2016 年 12 月左右,消息似乎出现了明显的下降。那时我们搬到了一起住在 T21,这解释了为什么我们不需要给对方发那么多短信。

我还对我和妻子之间每天的信息频率感兴趣。从 Github 借鉴了一些灵感来创建一个日历情节(使用修改版的 CalMap ):

general.calendar_plot(df, year=2017, how='count', column='index')

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

The frequency of messages (darker = more often)

有一段时间,我们发短信的频率更高,但这似乎不是一种视觉上可以观察到的模式。让我们和 TF-IDF 一起更深入的探讨一下!

独特的文字(TF-IDF)

我想展示一些对我们来说独一无二但也经常使用的单词。例如,单词“Hi”可能对我来说是唯一的(因为她总是使用单词“Hello”),但如果我在数百条消息中只使用一次,它就不会那么有趣了。为了对此建模,我使用了一种流行的算法,称为 TF-IDF(即,术语频率-逆文档频率)。它获取文档中单词的频率,并计算这些单词在语料库中的反比:

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

TF-IDF slightly adjusted to work with text messages

基本上,它会告诉你哪些单词重要,哪些不重要。例如,像“the”、“I”和“an”这样的词出现在大多数文本中,通常并不那么有趣。

你在上面看到的 TF-IDF 版本略有调整,因为我关注的是一个人发短信的字数,而不是文本的数量。

下一步是通过简单地划分每个人的 TF-IDF 分数来计算每个人的独特性分数:

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

Uniqueness score for each person.

正如你在上面的公式中看到的,它考虑了聊天中每个人的 TF-IDF 分数。因此,它也适用于群组聊天。

从事数据科学的一件重要事情是以清晰、有趣和吸引人的方式交流结果。因为我的观众是我的妻子,我必须确保我的视觉效果是清晰的。我决定使用一个水平直方图来显示最独特的单词和它们的分数。水平直方图中的单词通常更容易阅读。为了使它在视觉上更有趣,您可以使用条形作为您想要包含的任何图像的遮罩。出于演示的目的,我用了一张我婚礼的照片:

unique_words = tf_idf.get_unique_words(counts, df, version = 'C')
tf_idf.plot_unique_words(unique_words, user='Me', 
                         image_path='histogram.jpg', image_url=None,
                         title="Me", title_color="white", 
                         title_background='#AAAAAA', width=400,
                         height=500)

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

My top 10 most unique words used in our text messages.

表情符号和情感分析

我们使用的表情符号在一定程度上可以描述我们的感受。我觉得将你之前看到的公式(即 TF-IDF +独特词汇)应用于表情符号会很有趣。换句话说,哪些表情符号是谁独有的,但也经常使用?

我可以简单地获取原始信息并提取表情符号。然后,这是一种简单的方式来计算表情符号的数量并应用公式:

emoji.print_stats(unique_emoji, counts)

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

Unique and frequently emojis per person.

显然,我独特的表情符号更积极,而她的表情符号似乎是消极的。这并不一定意味着我使用更多积极的表情符号。这仅仅意味着她独特的表情符号倾向于更加消极。

这些分析的自然结果是情绪。从我们的信息中可以看出我们之间的关系是否有所下降?首先,我们需要提取积极的信息。请确保通过以下方式创建一个包含情感得分的新列:

from pattern.nl import sentiment  as sentiment_nl
df['Sentiment'] = df.apply(lambda row: 
                           sentiment_nl(row.Message_Clean)[0], 1)

我决定不把情感步骤放在包里,因为有很多方法(和语言)来创造情感。也许你想使用不同的方法,而不是基于词典的方法。然后,我们可以计算平均每周情绪,并绘制结果:

sentiment.plot_sentiment(df, colors=[‘#EAAA69’,’#5361A5'],     
                         savefig=False)

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

Our sentiment over time. The y-axis shows how happy or sad we communicated in that period.

2018 年 1 月,我遭遇了一场事故,这解释了那段时间信息的负面性。

基于情感的词云

词云通常用于演示哪些词在文档中频繁出现。经常出现的词比只出现几次的词大。

为了让云彩更有趣,我用情感将它们分开。积极的词语和消极的词语有着不同的含义:

(positive, 
negative) = wordcloud.extract_sentiment_count(counts, 
                                              user = "Me")wordcloud.create_wordcloud(data=positive, cmap='Greens', 
                           mask='mask.jpg', 
                           stopwords='stopwords_dutch.txt',     
                           random_state=42, max_words=1000,  
                           max_font_size=50, scale=1.5, 
                           normalize_plurals=False,  
                           relative_scaling=0.5)wordcloud.create_wordcloud(data=negative, cmap='Reds', 
                           mask='mask.jpg', 
                           stopwords='stopwords_dutch.txt',     
                           random_state=42, max_words=1000,  
                           max_font_size=50, scale=1.5, 
                           normalize_plurals=False,  
                           relative_scaling=0.5)

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

Sentiment-based Word Clouds for my messages.

这些单词是基于模式包中的现有词典选择的。我们通常使用的正面词汇是 goed (好)和 super (超级)。负面词有 laat (后期)和 verschrikkelijk (恐怖)。有趣的是,我发现有些词被贴上了负面标签,而我并没有这样使用它们。例如,我通常使用waanzining(疯狂)作为 very 来强调某些单词。

主题建模

主题建模是一种试图从文本文档中提取主题的工具。一组文档可能包含用户可能感兴趣的多个主题。一个主题由一组单词表示。例如,一个主题可能包含单词和*马。*根据这些话,好像题目是关于动物的。

我在 SOAN 实现了两个创建主题的算法,即 LDA(潜在狄利克雷分配)和 NMF(非负矩阵分解)。NMF 使用线性代数来创建主题,而 LDA 基于概率建模。查看这篇帖子,获取对模型的深入解释。

我决定删除对两个模型的参数进行工作的选项,因为它旨在给出可能的主题的快速概述。它为每个用户分别运行模型:

topic.topics(df, model='lda', stopwords='stopwords_dutch.txt')
topic.topics(df, model='nmf', stopwords='stopwords_dutch.txt')

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

Topics generated per person using LDA and NMF

在生成的主题中你能看到的(如果你能读懂荷兰语)是可以找到描述做杂货的主题。也有相当多的话题在某种程度上描述了第二天见面或说晚安。这是有意义的,因为我们大部分的信息都是在我们不住在一起的时候发出的。

使用主题建模的缺点是用户需要自己解释主题。它还可能需要调整参数来找到高质量的主题。

感谢您的阅读!

如果你和我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。

如果您想全面了解代码,请务必访问笔记本!你可以通过这个链接简单地获取代码并添加你自己的 WhatsApp.txt 文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值