欢迎光临
我们一直在努力

低频笔记本为什么TowardsDataScience 博客中文翻译 2020(四百一十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

原文:https://towardsdatascience.com/getting-started-with-the-aws-sam-cli-f68062674c20?source=collection_archive———50———————–

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

图片来自 Unsplash

在本文中,我们将学习 AWS SAM CLI 的概念。SAM,缩写为无服务器 应用 模型是亚马逊网络服务提供的一个框架,可以用来在本地机器上构建应用,并直接将这些应用部署到 AWS Lambdas。

以前,在引入 AWS SAM CLI 之前,开发人员使用在线编辑器直接在 AWS Lambda 上编写、测试和部署代码。这是通过使用 AWS 管理控制台创建 Lambda 函数来完成的。当创建函数时,您可以使用 AWS Lambda 提供的在线代码编辑器在其中添加代码。

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

图 1 —在内嵌代码编辑器(AWS Lambda)中编写代码

虽然,这似乎是一种不用部署就可以编写和测试代码的非常方便的方式,如果您有非常简单的函数,其中不包含太多复杂的逻辑,或者您是单独处理它,这种方式也很好。然而,将你的代码放在在线代码编辑器中的想法对我来说听起来很吓人。在这个过程中,您不能完全控制您的代码。如果万一有人不小心删除了您的函数,那么您必须从头开始重新编写代码,这是我们作为开发人员应该避免的事情。

相反,在这个基础设施即代码的时代,大多数事情都可以通过编写代码来实现,我们应该考虑一个更健壮的想法,代码可以进行版本控制并易于管理。市场上有很多工具可以用来编写和开发您的功能,一旦准备好进行部署,您就可以使用 AWS Lambda 提供的本机流程将其部署到在线服务。

AWS 中的无服务器函数或 Lambda 函数是一段代码,可以用任何支持的语言编写,如 C #、Python、NodeJS、Ruby 等。该代码可以部署在 AWS 上,并基于触发事件执行。AWS 中有许多受支持的事件,如 API Gateway,可用于触发 Lambda 函数。除此之外,还有其他事件,如 S3 事件、SNS 话题、SQS 排队等。所有这些事件都可以用来触发 Lambda 函数的执行。

另一方面,无服务器应用程序是为实现特定目标而工作的类似服务的组合。这样的应用程序可能包含一个或多个 Lambda 函数,并结合其他 AWS 服务,如 DynamoDB 表或 SNS 主题。

SAM 是由 Amazon 开发的开源框架,它帮助我们定义无服务器资源,如 Lambda 函数、API 网关以及其他一些资源。SAM 使用 CLI(称为 SAM CLI)提供对 API 的访问。在这个实用程序的帮助下,您可以轻松地定义您的资源,并将这些资源部署到 AWS 中的任何环境,而不需要做太多的手工工作。SAM 基于先前建立的云形成模板。如果您已经有了一些使用云形成堆栈部署无服务器资源的经验,那么使用 AWS SAM CLI 对您来说会非常容易。

现在我们对 AWS SAM 有了一些了解,让我们继续尝试查看底层工作流。

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

图 2-SAM 工作流程(来源: YouTube

如果你看到上图,你可以看到有两个主要部分——一个是“本地应用程序回购”,第二个是“AWS 云”。在本地 repo 中,有一个根目录“ my-sls-app-1 ,类似于一个无服务器的应用。在该应用程序中,有另一个目录“ lambda-1 ”,这是 lambda 函数的目录。在 lambda 函数目录下,有我的“ main.py ”文件,我可以在其中编写 lambda 函数的代码。这里需要注意的重要一点是,在根应用程序目录下,可以定义多个 lambda 函数和其他 AWS 资源。然而,为了简单起见,我想把它限制为一个 lambda 函数。

您可以看到的下一项是“ sam-template.yaml ”,这是 sam 框架将用来部署应用程序的模板。我将在本系列的后面解释它。这个模板有点类似于云的形成模板,其中有一些小的修改。如果你熟悉云的形成模板,那么你可以很容易地使用它。一旦开发了代码,就可以运行“ sam-package ”命令,该命令将使用该模板作为 sam 框架的输入,然后将其转换为云形成模板,并以“ sam-deploy.yaml ”的名称存储。除了生成部署模板之外,SAM 框架还创建 lambda 函数的 zip 文件,并将其上传到 S3 的预定义 bucket 中。此上传文件的 URL 将出现在部署模板中以供参考。

一旦部署模板准备好了,现在就可以将资源部署到 AWS 云中了。为此,您需要运行" sam-deploy "命令,该命令将 deploy 模板作为输入,并基于 AWS Lambda 函数、API 网关等资源创建云形成堆栈。在 SAM 模板文件中指定的。该部署不仅可以用于部署 Lambda 函数,还可以用于部署其他服务,如 API 网关、SNS 主题、SQS 队列、Dynamo DB 表等。这都是关于创建和部署您的无服务器应用程序。

AWS SAM 能够与其他 AWS 服务集成,因此为我们提供了许多可以利用的优势。

  • 单一部署配置 —通过使用 AWS SAM,您可以在属于同一堆栈的单一位置轻松管理所有必要的资源
  • AWS 云形成的扩展 —由于 SAM 是作为现有云形成的扩展而构建的,因此您可以获得相同部署能力的可靠性。有了这个,你还可以使用萨姆·YAML 模板中云形成的所有可用资源
  • 本地调试和测试 —在 AWS SAM CLI 的帮助下,您现在可以在本地执行和测试您的无服务器应用程序。CLI 通过挂载 docker 映像并运行代码,在本地提供类似 Lambda 的执行环境。这有助于您轻松地单步调试代码,并找出在 lambda 环境中直接从控制台运行代码时可能检测不到的问题

到目前为止,我们已经合理地了解了 AWS SAM。现在让我们继续学习如何在我们的本地机器上安装相同的组件。假设您的机器上已经安装了 python,您可以通过运行以下命令来安装 CLI。

pip 安装 aws-sam-cli

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

图 3 —使用 PIP 安装 SAM

我已经在我的机器上安装了相同的程序,所以我得到消息“已经满足要求”。但是,如果您是第一次安装它,它将根据需要下载 SAM 包和所有必需的依赖项。

在本文中,我们已经了解了 AWS 无服务器应用程序模型(SAM)是什么,以及如何使用它来开发无服务器应用程序。此外,我们还了解了它的工作流程以及如何打包和部署无服务器应用程序。在我即将发表的文章中,我将演示在本地调试和测试无服务器应用程序,以及如何使用 SAM CLI 打包和部署该应用程序。

原载于 2020 年 8 月 17 日【https://www.sqlshack.com】

原文:https://towardsdatascience.com/getting-started-with-the-basics-of-machine-learning-35954a94e961?source=collection_archive———44———————–

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

来自 Dribbble 的 Hurca 图片

机器学习是目前业界最热门的术语之一。全球科技巨头,如谷歌、亚马逊脸书等,都试图在他们的产品中利用机器学习的力量。尽管有抱负的数据科学家的机会呈指数增长,但仍有一大群人不清楚机器学习是什么。

这就是我来这里帮助你的原因。这篇文章将是名为机器学习秘诀的系列文章的第一篇,其中我们将研究机器学习的各个方面,首先是理论,然后是数学,最后是实践。

在这篇文章中,我将试图给你一个直觉,不仅关于什么是机器学习,而且它的不同类型,最近的发展,以及开始机器学习的最佳资源。

机器学习是人工智能(AI)的一种应用,它为计算机或任何机器提供了从经验中学习和改进的能力,而无需显式编程。机器学习背后的目标是让机器在没有明确编程的情况下自己做事情。

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

图片由 Gerd Altmann 从 Pixabay 拍摄

让机器做事情背后的原因是它们在不疲惫的情况下提供高精度的结果。人类执行的任务的质量可能会有所不同,有时也会令人疲惫不堪,但机器可以高精度地完成高频率的重复任务,而不会感到疲劳或厌倦。

自从互联网出现以来,数据生成量一直在显著增加。每当我们在网站或应用程序上采取任何行动时,我们都在生成数据。随着云计算的发展,存储数据的成本也大大降低,为 ML 及相关领域的进一步发展铺平了道路。

该领域的初学者面临的最大困惑之一是人工智能(AI)、机器学习(ML)和深度学习(DL)之间的区别。

人工智能是一种使机器能够模仿人类行为的技术。人工智能的最终目标是制造能够执行人类任务并做出自己聪明决定的智能机器。

机器学习是人工智能的一个子部分,它使用统计方法,使机器能够在没有明确编程的情况下根据经验进行改进。

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

图片由作者

深度学习是 ML 的一个子部分,它利用神经网络(类似于人类的神经元)来模拟类似人脑的行为。当数据集包含大量的观察值或数据点时,深度学习就会发挥作用。

另一个通常与机器学习混淆的重要术语是数据科学。数据科学是对我们为各种洞察生成的数据进行分析,这些洞察有可能服务于多种商业目的。

有几种工具和语言可用于执行机器学习。工具的具体选择可能会有所不同,所使用的工具取决于作业的需要和规模。

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

图片来自 Quantiphi

Python 和 R 是机器学习编程语言的首选。数据通常存储在 CSV 格式的文件中,尽管也可以使用 excel 表格。除此之外,统计学的基础知识对于理解机器学习算法是必要的。

有各种机器学习算法可以用在各种不同的情况下。通常有三种不同类型的机器学习算法,即监督学习非监督学习、强化学习

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

图片由作者

**有监督的机器学习:**有监督的机器学习问题是我们要基于一组例子进行预测的问题。

  • **回归问题:**结果为离散值的问题属于回归范畴。举个例子——房子的价格是一个回归问题。
  • **分类问题:**当我们要把结果分成不同的类别时。例如,癌症是恶性还是良性是一个分类问题。结果可以分为两类——恶性或良性。同样,客户是否会拖欠贷款也是一个分类问题,投资金融的公司对此非常感兴趣。

**无监督机器学习:**无监督机器学习问题是指我们的数据没有一组定义好的类别,而是我们在寻找机器学习算法来帮助我们组织数据的问题。

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

图片由Bores biletsky

无监督机器学习问题的例子可以是基因组学。在基因组学中,我们提供了一种具有数千个不同基因的算法,然后该算法将这些基因聚类成相关基因的组。这可能是与寿命、头发颜色等相关的基因。结果通常通过聚类分割获得。

无监督学习的各种算法包括 k 均值聚类、层次聚类、神经网络

最近另一种类型的机器学习研究正在获得火花,这就是强化学习。它通常被视为真正人工智能的希望。强化学习(RL)是机器学习的一个领域,涉及软件代理应该如何在环境中采取行动,以最大化累积回报的概念。

用于训练 ML 模型的数据量取决于我们试图解决的问题。有各种在线存储库,您可以在其中找到用于训练和构建机器学习模型的数据集。

为你的模型获取数据的一些最受欢迎的网站是 KaggleUCI 机器学习库、谷歌数据集搜索

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

图片来自 Intellipaat

如今有大量的数据可用。从网站和智能手机上的日志到健康设备,我们处于不断创建数据的过程中。

数据可以大致分为两种类型:

  1. **结构化数据:**结构化数据通常是指以表格形式存储在组织中的数据库中的数据。
  2. **非结构化数据:**非结构化数据包括所有获取的数据,但不是以表格的形式存储在企业中。

机器学习模型可以处理结构化和非结构化数据。然而,在实际构建机器学习模型之前,我们需要首先将非结构化数据转换为结构化数据。

建立机器学习模型的第一步是数据收集。数据收集是指在既定系统中收集和测量目标变量信息的过程。

然后是为我们的模型清理和操作数据。数据探索和清理帮助我们去除异常值和缺失值,并将数据转换成所需的格式。

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

图片来自 Ceralytics

一旦我们的数据准备好了,我们在训练数据上训练模型,然后在测试数据上测试它。我们的最后一步是改进我们的模型,以获得更好的准确性。

这只是一个简短的介绍,让您直观地了解构建和部署机器学习模型所涉及的步骤。我们将在接下来的文章中详细讨论这些步骤。

实践机器学习的一些最佳资源是:

  1. 由 Coursera 提供的吴恩达机器学习
  2. ****机器学习纳米学位由 Udacity 提供
  3. 谷歌的机器学习速成班
  4. Coursera 提供的机器学习专业

正如多次提到的,机器学习是一个非常活跃的研究领域。从吴恩达到彼得·诺维格,顶级专家和研究人员的贡献怎么说都不为过。

你在正确的时间选择了正确的职业。快乐学习!

原文:https://towardsdatascience.com/getting-started-with-vim-and-tmux-for-python-707ec5ff747f?source=collection_archive———8———————–

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

尼奥诺韦在 Unsplash 拍摄的照片

如果你用多种语言编写代码,你可能会发现为每种语言维护一个 IDE 是一件令人厌倦的事情。经过一些试验后,我发现 Vim 和 Tmux 的组合是我的理想解决方案。主要好处是:

一个支持任何语言的环境

高效的纯键盘文件编辑

易于在任何新环境中安装

然而,作为一个文本编辑器而不是 IDE,这个解决方案缺少一些现成的重要特性。幸运的是,Vim 和 Tmux 都是高度可配置的。

本文展示了如何配置 Vim 和 Tmux 来支持 Python 开发的一系列关键特性。虽然 Tmux 起着重要的作用,但是大多数配置都与 Vim 有关。

这个工作流被设计成在像 Linux 或 MacOS 这样的 Unix 系统上运行。首先,创建一个*。在 home/ 目录下的 vimrc* 文件以及一个空文件夹*。vim/。安装 Vim、Tmux 和(可选)IPython。通过对 Vim 及其配置有所了解。假设 vimrc* 文件。如果你不知道如何安装 Vim 插件,看看这篇文章。

下面是一个观点鲜明的特性列表,这些特性使得在 Vim 中开发 Python 更加明智:

1.一个多语言环境

2.容易到达终端

3.流畅的目录浏览

4.将代码行发送到 Python 控制台

5.在终端中运行 Python 文件

6.交互调试

可以为每种文件类型单独配置 Vim。例如,可以将 Vim 配置为在打开 Python 文件时使用四个空格,而在打开 R 文件时使用两个空格。要启用特定于文件的设置,将以下行放入*。vimrc* 文件:

filetype plugin indent on

indent部分支持文件特定的缩进。

创建目录*。vim/after/ftplugin* 。在 ftplugin 中的文件以语言命名(例如 python,json,r,sh ),并且有。vim 扩展。下面是 JSON、Python、R 和 Bash 的一个例子:

.vim/
└── after
    └── ftplugin
        ├── json.vim
        ├── python.vim
        ├── r.vim
        └── sh.vim

这个想法就是把任何*。将只适用于特定语言的 vimrc* 配置放入 ftplugin 中的相应文件中。从这个意义上来说, ftplugin 中的文件可以被视为“特定于语言的*”。vimrc* 文件。这些文件来源于之后。vimrc 并覆盖任何常规设置*。*

例如,Python 特定的缩进应该放在 python.vim 文件中:

setlocal tabstop=4
setlocal shiftwidth=4
setlocal softtabstop=4
setlocal expandtab

注意setlocal的使用,以便这些设置仅覆盖来自的一般设置。vimrc 文件仅用于当前缓冲区

本文接下来的章节遵循惯例,将特定语言的设置放在 ftplugin 中,将通用 Vim 设置放在中。vimrc

保持你的 vimrc 干净

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

作者图片

只有当 Vim 在终端内部运行时,此功能才有效。在这种情况下,可以通过运行 Ex 命令来挂起 Vim:

:stop<CR>

这会将 Vim 移到后台,并将屏幕切换回调用 Vim 的终端。在终端中运行fg将 Vim 移回前台。

在 Vim 和全屏终端之间切换非常方便,值得在中创建一个映射。vimrc :

nnoremap <leader>t :stop<CR>

终端 Vim 与 GUI

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

作者图片

ide 通常提供一个文件浏览器,作为项目的抽屉。这种方法不能很好地与 Vim 的窗口风格工作流相结合。毕竟,Vim 如何知道您希望在哪个窗口中打开您从项目抽屉中选择的文件?

Vim 已经自带了一个名为 netrw 的内置插件。为了理解这个插件,把 Vim 窗口想象成翻转的卡片:一边是你的文件,另一边是 netrw 文件浏览器。

中为文件浏览映射两个键绑定很有用。vimrc 。第一个在当前文件的目录下打开 netrw。第二个键绑定在当前工作目录打开 netrw。

nmap <leader>f :Explore<CR>
nmap <leader><s-f> :edit.<CR>

尽管 Netrw 有一些恼人的默认设置。建议将这两个额外的 netrw 设置放在中。vimrc 。第一种设置允许以右分割方式打开文件。第二个设置禁止 netrw 保存。文件中的 netrwhist 文件。vim 文件夹。

let g:netrw_altv = 1
let g:netrw_dirhistmax = 0

最后,一个名为vim-醋的最小插件使 netrw 更加明智,并提供了几个有用的快捷方式:

  • 在任一缓冲区中按下-键,跳到目录列表,并找到您刚来的文件。
  • 在一个文件上按下.,在:命令行的末尾预先填充它。还有!,砰的一声启动生产线。
  • y.键,拖动光标下文件的绝对路径。
  • 你不需要 NERDTREE 或者(可能)netrw
  • 油和醋——分窗和项目抽屉
  • 维姆醋

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

作者图片

Tmux 允许将屏幕水平分割成两个终端窗口:上面一个用于 Vim(可能有多个垂直分割窗口),下面一个包含一个 IPython 控制台。如果您不喜欢 IPython,上面的过程在常规的 Python 控制台上也能很好地工作。

接下来,插件 vim-slime 用于将选定的代码从 vim 发送到 IPython 控制台。下面对中的配置进行说明。vimrc 文件支持这种行为:

let g:slime_target = "tmux"
let g:slime_default_config = 

按下C-c, C-c(按住 Ctrl 并双击 C)将光标下的段落发送到 IPython 控制台。(第一次 vim-slime 会提示目标窗格。按两次 Enter 键。)

上面的过程与语言无关:同样的过程允许将 R 代码行发送到 R 控制台,或者将 Bash 脚本中的行发送到终端。

  • vim-slime
  • Tmux 之道

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

作者图片

在终端中有运行当前脚本的快捷方式很方便。通常,这是通过调用解释器后跟文件名来实现的:

python filename.py

python.vim 中定义的以下映射运行两个连续的 Ex 命令:

nmap <buffer> <leader>r <Esc>:w<CR>:!clear;python %<CR>

它是这样做的:

  1. 第一个 Ex-command :w<CR>保存文件。
  2. 第二个 Ex-command 以:!开始,表示它是针对终端的,用:clear清除终端,最后调用当前文件的解释器python %<CR>,其路径由%给出。

注意,这种映射是特定于语言的。运行 bash 脚本的类似映射可以定义如下:

nnoremap <buffer> <leader>r <Esc>:w<CR>:!clear;sh %<CR>

在 Vim 中运行 Python 代码

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

作者图片

调试是 ide 真正大放异彩的领域。尽管如此,通过安装 Python ipdb 可以在 Vim 中获得令人满意的调试体验。

模块 ipdb 类似于 pdb ,但是是为 IPython 设计的。它不必安装,因为它附带了 IPython。它允许用set_trace()定义一个断点,该断点将在该点暂停程序,并丢弃启动调试器,在调试器中可以使用 IPython 检查程序的状态。

python.vim 中的以下 Vim 映射在当前行下方放置了一个断点:

nmap <buffer> <leader>b oimport ipdb;ipdb.set_trace(context=5)<ESC>

上下文参数指定调试器显示的行数。

如果 IPython 是embed的话,这是一个很好的特性,它会在调试期间启动一个单独的 IPython 会话。在此会话中所做的更改不会影响原始调试会话中的对象。

ipdb> from IPython import embed
ipdb> embed()

对调试器命令的进一步讨论超出了本文的范围。它们在下面引用的文档中有很好的记录。

pdb 文件

本文中的配置将帮助您开始使用 Vim 和 Tmux 进行 Python 开发。其他有用的特性,如林挺、代码完成和跳转到定义,都没有涉及到。看看我的个人 Vim 配置中更完整的例子。

原文:https://towardsdatascience.com/getting-started-with-xgboost-in-scikit-learn-f69f5f470a97?source=collection_archive———0———————–

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

图片来源:【https://www.pxfuel.com/en/free-photo-juges

这篇文章解释了 XGBoost 是什么,为什么 XGBoost 应该是你的首选机器学习算法,以及在 Colab 或 Jupyter 笔记本上启动和运行 XGBoost 所需的代码。假设您对机器学习和 Python 有基本的了解。

在机器学习中,集成模型比单个模型有更高的概率表现更好。集成模型将不同的机器学习模型组合成一个。随机森林是一个流行的集合,它通过装袋取许多决策树的平均值。Bagging 是“bootstrap aggregation”的缩写,意思是通过替换(bootstrapping)选择样本,并通过取其平均值进行组合(聚合)。

助推是装袋的一种强有力的替代方法。助推器不是聚集预测,而是通过关注单个模型(通常是决策树)哪里出错,将弱学习者变成强学习者。在梯度推进中,单个模型基于残差训练,残差是预测和实际结果之间的差异。梯度提升树不是聚集树,而是在每一轮提升过程中从错误中学习。

XGBoost 是“极端梯度推进”的缩写。“极致”是指并行计算和缓存感知等速度增强,使 XGBoost 比传统的梯度提升快大约 10 倍。此外,XGBoost 包括一个独特的分裂查找算法来优化树,以及内置的正则化来减少过度拟合。一般来说,XGBoost 是一个更快、更精确的渐变增强版本。

平均而言,boosting 比 bagging 表现得更好,梯度 Boosting 可以说是最好的 Boosting 系综。由于 XGBoost 是梯度增强的高级版本,其结果是无与伦比的,因此它可以说是我们拥有的最好的机器学习组合。

从 2014 年的希格斯玻色子 Kaggle 比赛开始,XGBoost 在机器学习领域掀起了风暴,经常在 Kaggle 比赛中获得一等奖。XGBoost 的受欢迎程度飙升,因为在竞争环境中,当从表格数据(行和列的表格)进行预测时,它一直优于可比的机器学习算法。

从表格数据进行预测时,XGBoost 可能是您的最佳起点,原因如下:

  • XGBoost 很容易在 scikit-learn 中实现。
  • XGBoost 是一个系综,所以比单个模型得分高。
  • XGBoost 是正则化的,所以默认模型通常不会过度拟合。
  • XGBoost 非常快(对于系综而言)。
  • XGBoost 从错误中学习(梯度提升)。
  • XGBoost 有大量用于微调的超参数。
  • XGBoost 包括超参数来缩放不平衡的数据和填充空值。

现在,您对 XGBoost 是什么以及为什么 XGBoost 应该是处理表格数据时的首选机器学习算法有了更好的了解(与神经网络工作得更好的图像或文本等非结构化数据相比),让我们建立一些模型。

如果您运行的是 Colab 笔记本,XGBoost 是一个选项。如果你在 Jupyter 笔记本上运行 Anaconda,你可能需要先安装它。打开您的终端并运行以下命令来安装 XGBoost 和 Anaconda:

conda install -c conda-forge xgboost

如果您想要验证安装或您的 XGBoost 版本,请运行以下命令:

import xgboost; print(xgboost.__version__)

如需更多选项,请查看 XGBoost 安装指南。

接下来我们拿一些数据来做预测。

Scikit-learn 带有几个内置数据集,您可以访问这些数据集来快速对模型进行评分。以下代码加载 scikit-learn 糖尿病数据集,该数据集测量一年后疾病的传播程度。更多信息请参见sci kit-学习数据集加载页面。

from sklearn import datasets
X,y = datasets.load_diabetes(return_X_y=True)

衡量糖尿病传播程度的指标可能会采用连续值,因此我们需要一个机器学习回归器来进行预测。XGBoost 回归器称为 XGBRegressor ,可按如下方式导入:

from xgboost import XGBRegressor

我们可以使用交叉验证在多个折叠上构建模型并对其评分,这总是一个好主意。使用交叉验证的一个优点是它会为您拆分数据(默认情况下是 5 次)。首先导入 cross_val_score

from sklearn.model_selection import cross_val_score

要使用 XGBoost,只需将 XGBRegressor 放在 cross_val_score 中,以及 X、y 和您首选的回归得分指标。我更喜欢均方根误差,但这需要转换负的均方误差作为一个额外的步骤。

scores = cross_val_score(XGBRegressor(), X, y, scoring='neg_mean_squared_error')

如果您得到警告,那是因为 XGBoost 最近更改了他们默认回归目标的名称,他们希望您知道。要消除警告,请尝试以下方法,结果相同:

*# Alternative code to silence potential errors* scores = cross_val_score(**XGBRegressor(objective='reg:squarederror')**, X, y, scoring='neg_mean_squared_error')

求均方根误差,取 5 个分数的负平方根即可。

(-scores)**0.5

回想一下,在 Python 中,语法 x**0.5 表示 x 的 1/2 次方,也就是平方根。

我的 Colab 笔记本结果如下。

array([56.04057166, 56.14039793, 60.3213523 , 59.67532995, 60.7722925 ])

如果你喜欢一个分数,试试 scores.mean() 求平均值。

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

预期的希格斯玻色子衰变。欧洲核子研究中心制作的照片。通用创作许可证。链接到维基百科。

下面是使用 scikit-learn 中的 XGBoost 回归器预测糖尿病进展的所有代码。

from sklearn import datasets
X,y = datasets.load_diabetes(return_X_y=True)
from xgboost import XGBRegressor
from sklearn.model_selection import cross_val_score
scores = cross_val_score(**XGBRegressor(objective='reg:squarederror')**, X, y, scoring='neg_mean_squared_error')
(-scores)**0.5

正如你所看到的,由于 2019 年推出的新 scikit-learn 包装器,XGBoost 与其他 scikit-learn 机器学习算法的工作原理相同。

接下来,让我们使用类似的步骤构建一个 XGBoost 分类器并进行评分。

以下 url 包含可用于预测患者是否患有心脏病的心脏病数据集。

url = ‘https://media.githubusercontent.com/media/PacktPublishing/Hands-On-Gradient-Boosting-with-XGBoost-and-Scikit-learn/master/Chapter02/heart_disease.csv'

该数据集包含 13 个预测值列,如胆固醇水平和胸痛。最后一栏标有“目标”,确定患者是否患有心脏病。原始数据集的来源位于 UCI 机器学习库。

导入 pandas 来读取 csv 链接并将其存储为 DataFrame,df。

import pandas as pd
df = pd.read_csv(url)

由于目标列是最后一列,并且该数据集已经过预清理,因此可以使用索引位置将数据拆分为 X 和 y,如下所示:

X = df.iloc[:, :-1]
y = df.iloc[:, -1]

最后,导入 XGBClassifier 并使用 cross_val_score 对模型进行评分,将准确性作为默认的评分标准。

from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score
cross_val_score(XGBClassifier(), X, y)

以下是我从我的 Colab 笔记本中得到的结果。

array([0.85245902, 0.85245902, 0.7704918 , 0.78333333, 0.76666667])

以下是使用 scikit 中的 XGBClassifier 预测患者是否患有心脏病的所有代码——了解五个方面:

url = 'https://media.githubusercontent.com/media/PacktPublishing/Hands-On-Gradient-Boosting-with-XGBoost-and-Scikit-learn/master/Chapter02/heart_disease.csv'import pandas as pd
df = pd.read_csv(url)
X = df.iloc[:, :-1]
y = df.iloc[:, -1]from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score
cross_val_score(XGBClassifier(), X, y)

您知道如何在 scikit 中构建 XGBoost 分类器和回归器并对其评分——轻松学习。

从 XGBoost 中获得更多需要微调超参数。XGBoost 由许多决策树组成,因此除了集成超参数之外,还有决策树超参数可以进行微调。查看这篇 Analytics Vidhya 文章,以及官方 XGBoost 参数文档开始使用。

如果你正在寻找更多的深度,我的书 用 XGBoost 和 scikit 手动渐变增强-从 Packt Publishing 学习 是一个很好的选择。除了广泛的超参数微调,您将了解 XGBoost 在机器学习领域的历史背景,XGBoost 案例研究的详细信息,如 Higgs boson Kaggle 竞赛,以及高级主题,如调整备选基础学习器(gblinear,DART,XGBoost 随机森林)和为行业部署模型。

编码快乐!

科里·韦德(Corey Wade)是 伯克利编码学院 的创始人和主管,在这里他向来自世界各地的学生教授机器学习。此外,Corey 在伯克利高中的独立学习项目中教授数学和编程。著有两本书, 用 XGBoost 和 scikit-learn The Python Workshop

本文中的代码可能是直接抄袭了 科里的 Colab 笔记本

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

亚历山大·辛恩摄影:https://unsplash.com/photos/KgLtFCgfC28

原文:https://towardsdatascience.com/getting-to-know-activation-functions-in-neural-networks-125405b67428?source=collection_archive———28———————–

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

马里乌斯·马萨拉尔在 Unsplash 上的照片

如果你有实现神经网络的经验,你可能会遇到术语“激活函数”。这个名字有印象吗?没有吗?‘relu,softmax 或者 sigmoid 怎么样?好吧,这些是在今天的上下文中最广泛使用的激活函数中的一些。当我开始研究神经网络的时候,我不知道激活函数到底是干什么的。但是有一点,在没有激活函数的可靠知识的情况下,我不能继续实现我的神经网络。我做了一些调查,以下是我的发现…

简单来说,激活函数就是决定神经网络输出的数学方程。它们基本上决定去激活或激活神经元以获得期望的输出,因此得名激活功能。现在,让我们进入数学…

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

图 1

在神经网络中,作为数值的输入数据点(x) 被馈入神经元。每一个神经元都有一个权重(w) ,该权重将与输入相乘,并输出一个特定值,该值将再次馈入下一层的神经元。如图 1 所示,激活函数作为这个过程之间的数学门发挥作用,并决定某个神经元的输出是开还是关。

激活功能可以分为三个主要类别;二元阶跃函数、线性激活函数和非线性激活函数。然而,非线性激活函数由几种类型的函数组成。让我们深入了解一下…

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

二进制步进激活功能

二元阶跃函数是一种基于阈值的激活函数,即在某一阈值神经元被激活后,低于该阈值的神经元被去激活。在上图中,阈值为零。顾名思义,这个激活函数可以用在二进制分类中,但是它不能用在需要处理多个类的情况下。

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

线性激活功能

在这里,我们的函数(输出)与神经元的加权和成正比。线性激活函数可以处理多个类,不像二元阶跃函数。然而,它也有自己的缺点。利用线性激活函数,反向传播中的变化将是恒定的,这对学习是不利的。线性激活函数的另一个巨大缺点是,无论神经网络有多深(神经网络由多少层组成),最后一层总是第一层的函数。这限制了神经网络处理复杂问题的能力。

深度学习实践者今天处理高维度的数据,例如图像、音频、视频等。由于上述缺点,在我们使用神经网络的复杂应用中使用线性激活函数是不实际的。因此,目前广泛使用的是非线性函数。我们将看看一些流行的非线性激活函数。

  • 乙状结肠功能。

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

乙状结肠功能

Sigmoid 函数(也称为逻辑函数)采用概率方法,输出范围在 0-1 之间。它使每个神经元的输出正常化。然而,Sigmoid 函数对非常高或非常低的输入的预测几乎没有变化,最终导致神经网络拒绝进一步学习,这个问题被称为消失梯度

  • 双曲正切函数

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

双曲正切函数

双曲正切函数(也称为双曲正切函数)几乎与 sigmoid 函数相似,但略胜一筹,因为它的输出范围在-1 和 1 之间,允许负输出。然而,tanh 也带来了与 sigmoid 函数一样的消失梯度问题。

  • ReLU(整流线性单元)功能

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

ReLU 功能

在该函数中,正输入的输出范围可以从 0 到无穷大,但是当输入为零或负值时,该函数输出零,这阻碍了反向传播。这个问题被称为垂死的 ReLU 问题。

  • 泄漏的 ReLU

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

漏 ReLU 功能

泄漏的 ReLU 防止了死亡的 ReLU 问题,并允许反向传播。Leaky ReLU 的一个缺陷是斜率是预先确定的,而不是让神经网络来计算。

还有相当多的其他非线性激活函数,如 softmax、参数 ReLU 等。这在本文中没有讨论。现在百万美元的问题来了!哪个激活功能最好?嗯,我的答案是这取决于 …这取决于你应用神经网络解决的问题。例如,如果您将神经网络应用于分类问题,sigmoid 将会很好地工作,但对于其他一些问题,它可能不会很好地工作,这就是为什么了解激活函数的利弊很重要,以便您可以选择最适合您正在处理的项目的激活函数。

也许几年前实现所有这些函数背后的数学可能非常困难,但现在随着 TensorFlow 和 PyTorch 等开源库的进步,这变得更加容易了!让我们看一个代码片段,其中使用 TensorFlow 将激活函数包含在代码中。

张量流中的激活函数

看起来很简单,对吗?由于 TensorFlow 更容易,因此实际理解这些激活函数非常重要,因为您的神经网络的学习过程高度依赖于它。

感谢您的阅读,希望这篇文章对您有所帮助。

  • 7 类神经网络激活函数:如何选择?
  • 深度学习的基础——激活函数以及何时使用它们?

原文:https://towardsdatascience.com/getting-to-know-your-features-in-seconds-with-rapids-c9b44c568ebd?source=collection_archive———36———————–

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

泰勒·拉斯托维奇在 Unsplash 上的照片

这篇博文旨在展示我最近在正在进行的Kaggle 竞赛中发表的特征选择笔记本。

当面对数据科学问题时,探索性数据分析,尤其是了解特性的重要性,是至关重要的一步。然而,如果您的数据库很大,有许多相互联系,使得分析在计算时间上很昂贵,那么这一步可能经常会很难。

GPU 在提高计算时间方面非常棒…如果你能使用它们的话!事实上,由于强大的框架(Tensorflow 或 Pytorch 是最著名的)使数百万开发者能够释放出他们不可思议的能力,它们的用途通常是用于训练神经网络。

然而,如果你要用 pandas 或 scikit-learn 完成一些脏的预处理,如果你的数据很大,那会非常繁重,因为这些包没有任何参数来帮助你在 GPU 上运行它们。综上所述,在这个阶段,你无法充分利用你的 GPU。

RAPIDS 是 Nvidia AI 开发的一套软件包,旨在完全在 GPU 上执行端到端的数据科学和分析管道。

本笔记本的目标是对 MoA 竞赛中的每个特征的每个目标进行单变量回归,即 872 x 206 = 179632 逻辑模型分别进行估计。

好消息是什么?有了激流这在几分钟之内是可能的!

你可以注意到,我既不导入 pandas(被 cudf 取代),也不导入 scikit-learn(被 cuml 取代)。

这本笔记本将是一个教程,旨在帮助你熟悉图书馆的使用。最后,你将能够在你的特征中选择那些看起来对预测你的目标最重要的特征。这将使您能够构建具有更好可解释性的健壮的中型模型。

如果想跳过处理直接跳到结果,可以直接看一下结果这里。

首先,我导入所有必需的包,并加载数据。

你可以注意到 cuDF 完全等同于 pandas,除了它在 GPU 上做所有的事情:使用 read_csv 将数据直接读取到 GPU,你也可以在数据帧上尝试任何常见的操作,功能和语法都是相似的,正如你可以从我使用的 merge 方法中看出的。

该函数旨在返回特征重要性度量。

最初,我报告了对每个目标、每个特征执行的单变量逻辑回归的二元交叉熵损失(我总共有近 18 万个任务要做)。单变量分析是一种原始但相当可靠且广泛使用的方法,用于估计给定目标的特征重要性。它使你能够分离出给定模型的单独解释能力。

你可以注意到,cuML 类(这里是 LogisticRegression )、函数(这里是 log_loss )和方法(这里是 fitpredict_proba )也完全等同于你可能已经习惯了的 sklearn 类。

但是,我必须缩放输出(为了在或多或少难以预测的目标之间进行比较,利用特征的平均损失)和反转值,以获得更好的可解释性:实际上,您会期望特征重要性在估计该特征上的给定目标的损失时降低。对于这一步,我使用 cuML MinMaxScaler 预处理类,它的工作方式与 sklearn 一样。

计算某个特性在所有目标上的平均重要性对于全面了解它对您的整体模型的重要性非常重要。

但是,我不确定在区分要保留的特性和要删除的特性时,您是否应该完全依赖这个指标:事实上,一个给定的特性可能对一个特定的目标具有非常高的解释能力,而对所有其他目标都不相关,因此即使它的平均重要性分数很低,保留它对该目标的最终模型质量也是决定性的。我们的目标是保留对所有目标都具有高平均解释能力的特征(平均重要性阈值),或者对其中一些目标特别相关的特征(最大重要性阈值)。请随意使用阈值!

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

你可能已经注意到了我对我的数据应用的小方法:因为它存储在 GPU 上,只是为了绘图的目的,我需要把它转换成 cpu。例如,这相当于您在 cuda 计算过程结束时在 PyTorch 上执行的 to_cpu()

基于用所选阈值操作的特征选择的进一步数据分析得出以下结论:

  • 平均而言,在所有目标上,满足两个标准的特性比不满足任何一个标准的特性平均重要 0.15 倍。
  • 平均而言,满足一个标准的特性在所有目标上的最大重要性比不满足任何标准的特性高 0.19。

根据我们的分析,这是一个相当令人放心的观察结果。

为了获得全局概述,我们可以比较两个子集上按目标划分的缩放特征重要性的热图,这两个子集是满足两个标准的特征和不满足任何标准的特征。很快就可以看出,第一张图要淡得多,单独的重要性更高。

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

现在,您可以依赖于您选择的功能,并使用它们来构建一个更轻的模型,更容易运行,也更容易解释!

原文:https://towardsdatascience.com/getting-your-analytics-team-right-b539206dac3d?source=collection_archive———25———————–

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

@罗德卡斯特

你的分析团队只会和你的分析团队一样好。因此,组建合适的团队是绝对必要的。这意味着你需要雇用最适合你的团队的人以及合适的技能。但是在您确定所需的技能之前,您应该为您的团队成功定义必要的角色。

缺乏角色定义是分析团队失败的最常见原因之一。很多时候,一家公司只是从 IT 部门抽调一名数据库管理员,让他们为营销提供一些分析。或者,他们不是从中抽身,而是走到市场部,请其中一名设计师就他们提议的营销策略的有效性汇总一些数字,就好像这位设计师是一名分析师一样。

这两种方法都行不通,因为这些例子中的公司要求人们做他们没有资格做的工作。那不是个人的错。这些被管理层如此愉快地扔进角斗场“你能做这个你从未申请过的工作吗”的人很有能力完成他们真正的工作。但扮演分析师的角色与他们通常朝九晚五的活动完全不同,这就产生了一个问题。

在我看来,分析团队要取得成功,需要扮演五个不同的角色。这些角色中的一些可以由一个人来完成,只要他们的技能组合涵盖他们并且工作量不是太大。在较大的组织中,不止一个人会担任相同的角色,因为工作量非常大。

此外,请记住,这些角色被描述为彼此明确划分。通常,一个在其中一个角色上表现出色的人会在另一个角色上表现得很好,但最好是让一个在这方面也很出色的人来担任第二个角色,而不是让一个人以平庸的方式同时担任这两个角色。但请不要被误导。没有一个人能够完美地扮演所有五个角色。即使您的团队今天只有一个人,并且其中一些角色执行得不完善,这些也是您唯一的分析师正在执行的角色及其各自的活动。当你发展你的分析团队时,你也应该记住这些角色,这是你不可避免要做的。

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

vectorkif / 土坯股票

连接器

你有没有过这样的工作,老板会告诉你该做什么,但从来没有解释过它如何适应业务?有一项任务要执行,但没有可供您参考的上下文。也许你被要求完成的任务并不需要任何背景。只是你的好奇心让你渴望从你的老板那里得到更多的情境信息——或者可能是当有人只是把工作丢给你而不解释任何事情时,你觉得完全不把你当人看。我知道。这让我觉得自己就像手机上的一个应用程序。只是一个随叫随到的单调过程。

尽管这令人沮丧,但在某些职业中,这种方法效果很好。但是在分析中“没有背景”的方法有一个问题。没用。 时期。

分析需要背景。否则,您将面临产生歪曲事实的分析结果的高风险。没有适当的上下文,数据可能会说谎。如果你曾经听到有人说“相关性并不意味着因果关系”,缺乏上下文可能会导致同样的基本错误。没有上下文,你就不能正确地解释数据。当我说你需要背景时,我指的是数据最初是如何收集的背景和提出手头问题的背景。(为了说明这一点,你可能会注意到,仅在这一段中,我就用了 7 次“上下文”这个词。)

你的分析团队如何解决这个问题?简单。

输入连接器的角色。

想象一个乌托邦世界,其中存在一个虚构的生物,即使他领导着一个由个人组成的高度技术化的团队,领导层也高兴地与他分享他们的业务计划和目标。我知道——我只是在做梦,对吗?不。实际上,那是连接器的作用。

联系人既是分析团队的领导者,也是其与整个企业的联络人。连接器理解分析,所以他是技术型的。但他也了解业务,是一个优秀的沟通者。虽然这位连接器可能不会每天处理数字,但他完全理解这些数字以及用于计算这些数字的数据科学方法。他会见了整个公司的业务领导,以了解他们如何认为分析可以帮助他们的部门,同时也建议他们可能不会想到自己的方式。

在公司看到演示文稿或新仪表板之前,或者在高管拿到副本之前,连接器是演示文稿或新仪表板的最后一双眼睛。他将理解来自业务单元的请求在其业务环境中的价值。他还可以了解分析团队在试图发现见解或满足业务需求时面临的瓶颈或问题。

连接器是公司内分析团队的拥护者。他是公关人员,也是团队的导师和顾问,因为这涉及到与大公司的互动。这个角色非常重要,即使它不被认为是一个领导职位,这个人也应该在领导者的桌子上占有一席之地。

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

tigatelu / 土坯股票

牧马人

当然,并不是每个人都能和高管打成一片。必须有人关注实际数据的细节。当团队收到新的请求时,知道完成请求所需的每个数据点的位置的可能性接近于零。仔细想想,可能是零。

即使您知道所有的源数据都存储在哪里,找到以一种形式存储的数据以供分析并提供其见解也是绝对不可能的。有人需要将数据转换成可用的形式。需要进行计算。需要填充和更正缺失或错误的数据。在所有这些工作完成之后,最终的一组干净的、格式良好的和经过计算的数据必须存储在某个地方以供分析。

没错,这就是牧马人的工作。

虽然这个名字可能会让人联想到牛仔的形象,但这个角色是典型的数据人。他用 SQL 编写代码,从适当的来源提取数据,在没有人确切知道去哪里找数据时搜索数据,清理数据,转换数据,并将数据加载到其他人可以容易地找到并使用它的位置。

牧马人通常被称为数据管家或数据工程师,是分析团队中五个关键角色之一。这个人经常被安排在数据团队的 IT 部门,而数据团队也需要这样的人。但是分析团队需要自己的鼓手!

在分析团队中直接安排一名牧马人将减少因试图利用数据团队或 IT 部门的数据工程师而导致的瓶颈。它还确保分析团队知道他们的管理者非常熟悉他们用于分析工作的数据。

牧马人熟悉分析团队的需求,这种需求不同于在普通数据团队中工作的其他同类团队。他经常在事务性数据结构和分析性数据结构中思考,比如星形或立方体。

就像连接器是业务和分析团队之间的纽带一样,牧马人是源数据和分析团队之间的纽带。没有牧马人不要离开家!

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

T4 土坯股票

神探

小时候,我喜欢看间谍和侦探电影。仔细想想,我还是喜欢看间谍和侦探电影。这些年来没什么变化。这种对解开谜团和揭示真相的热爱是我年轻时进入技术领域的主要动力之一。如果你像我一样,这是个好消息!在分析团队中,通过扮演侦探的角色,你仍然可以成为一名侦探和公司的英雄。

侦探使用牧马人准备的数据作为她的线索。有时这会导致发现没人想到要问的问题。其他时候,这意味着回答执行董事会多年来一直在问的问题。高管们多年来问同样的问题,但仍然没有可靠的答案,这并不罕见。

侦探更为人所知的身份是数据分析师或数据科学家。这两个头衔都属于这个角色,即使他们的技能重叠,他们也不是同义词。数据分析师通常会发现数据中的趋势,并创建图表或可视化来帮助企业领导者做出更具战略性的决策。数据科学家更关注利用数据进行预测或优化整个公司流程的数学模型和算法。

在您的团队中同时拥有数据分析师和数据科学家非常有益。虽然他们不同,但这两个人有一个共同点。他们试图通过搜索证据(也称为数据)来揭示真相。

尽管夏洛克·福尔摩斯可能会觉得他的案子“很简单”,但大多数交给数据科学家的案子都不简单。有时他们找到答案,有时他们找到更多的问题。但这是驱使人们扮演这一角色的原因。他们的动机是调查和揭示事情的全部真相。

毫无疑问,侦探通常被认为是分析团队的主要职能。当然,事实要宽泛得多。分析团队应该提供见解。这需要本文中讨论的所有五个角色完成的工作。但这位侦探无疑是团队成功的核心人物。

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

视觉一代/ 土坯股票

艺术家

平面设计师是最有创造力的人。他们把一个以前没人会用的应用程序变成了他们公司有史以来最好的工具。这款应用从根本上做了什么不同于以前的事情吗?不,不是的。用户理解应用程序、参与应用程序以及直观理解应用程序的能力是否与以前不同?是啊!这是一个应用被采用的关键。

分析也是如此。这位侦探可能已经发现了最有用和最聪明的见解。她的发现可能会彻底改变公司的未来,或者将它从灾难中拯救出来。但是没有人会知道这些见解是否能够清晰直观地传达给决策者。

这就是为什么你的分析团队需要一个艺术家。当然,这不是一般的艺术家。不是反对艺术家,我热爱艺术!但是分析,就像统计一样,很容易被曲解。有时,如果不完全清楚的话,一个图表可能意味着不止一件事。当然,注意到新销售额正在飙升的事实可能会导致首席执行官做出非常不同的决定,直到她意识到自然减员与新销售额持平。

因此,分析团队中的艺术家需要对分析和设计有扎实的理解。这个人认为图表稍微偏离了中心,棕色是黑色背景上的一个糟糕的颜色选择,还可以建议从销售仪表板中删除十个数据点,以确保传达关键信息。

最后,如果你能找到一个在 UI/UX 方面有天赋的艺术家角色,那将是额外的奖励!在一天结束时,一份报告、一张图表、一个仪表板或者分析团队用来交流其发现的任何东西都具有用户交互的元素。在创建最终演示文稿和雇佣艺术家时,请记住这一点。

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

PinClipart

自动机

因此,您的团队已经完成了所有必要的工作,以了解和发现与您的供应链相关的见解。这些发现将彻底改变供应链为你的公司交货的方式。事实上,它太棒了,他们希望能够以一种持续的方式监控它—永远监控!

这是分析团队向企业交付高价值时的典型结果。你应该习惯它。每个人都在庆祝,互相拍着对方的背。关节碰撞和击掌声充斥着你的走廊,直到有人意识到这到底意味着什么——可能是你团队中安静的那个人注意到了。

为了向供应链交付这一惊人的成果,您的团队在几天、几周甚至几个月内花费了大量的时间和精力,这些都需要一直重复!庆祝活动突然停止,一丝恐慌悄然而至。

等等!不要害怕!这就是你的团队雇佣自动机器人的原因!遁遁遁遁。(有点超级英雄的音乐,因为每个好英雄都需要一些。)

Automator 是一名软件开发人员,他也了解您团队的核心工作——分析和数据。不要被骗了。大多数软件开发人员认为数据是放在数据库中,以后再显示的东西。那不是你要找的这个角色的人。

自动机将你的团队完成的所有艰苦工作,通过代码进行复制。通过这种方式,供应链现在期望的日常洞察力可以帮助他们保持在他们创造的惊人的新流程的顶部,这要感谢你的原创工作,可以在你的团队没有一次又一次地执行工作的情况下继续提供。

必须对数据、使用的分析过程和各种编程语言有扎实的理解。您可能优先考虑的语言是 SQL、Python、Javascript、C#以及任何特定于您的环境的语言,如 SAS 或 r。

自动机的重要性不能被高估。将一个富有成效的团队变成一群毫无用处的好心人的最快方法是发布一个需要定期、持续手动维护的仪表板。它不仅会摧毁你的生产力,还会摧毁你的团队。

当心没有自动机的分析团队。

将所有这些整合在一起

既然我们已经讨论了成功的分析团队所必需的五个角色,那么让我们来谈谈拥有这样一个团队有多现实。

你的团队可能会从小规模开始。它可能只从一个人开始——你。这是真的,你将努力扮演所有这五个角色。而且就算你能把五个都演好,也不会把每个角色都演好。随着工作量的增加和团队的壮大,记住你可以雇佣那些你不擅长的角色,这仍然会减少你的工作量。它可能会通过将实际的数据辩论工作卸载给高度熟练的数据辩论者来减少您的工作量,但它也减轻了您的情绪负担,因为您不再需要在您不擅长的领域中挣扎。

关键是,一个全面发展的团队拥有这五个角色中每一个角色的人才是可能的。成长需要时间,但你会的。你也可以找到这些人。你所寻求的技能没有什么独特之处。但是将这五种技能都放在分析团队中是独一无二的。很不幸,但这是事实。随着时间的推移,试图用一个未经培训就被提升为数据科学家的兼职数据库管理员来运行分析的公司的坏习惯,将让位于培养和发展具有这五种角色的团队,该团队专注于公司可以承担的最有益的任务之一,即利用他们拥有的信息来运营他们的业务。

所以,是的。随着您的不断成长,您可以通过专注于这五项能力来建立一个分析梦之队!祝你好运!

罗德蓖麻 帮助公司获得正确的分析!他与国际组织和小型企业合作,开始或改进他们在数据分析、数据科学、技术战略和技术领导力方面的工作。除了咨询,Rod 还喜欢公开演讲、教学和写作。你可以在rodcastor.comapplied ai . us了解更多关于罗德和他的作品。

原文:https://towardsdatascience.com/getting-your-machine-learning-model-out-to-the-real-world-30c550876174?source=collection_archive———31———————–

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

丹·史沫特莱在 Unsplash 上的照片

过去几年中一个令人兴奋的发展是机器学习在产品中的扩散。我们现在看到最先进的计算机视觉模型被部署在手机上。最先进的自然语言处理模型正被用于改进 搜索。

虽然有许多关于新的、令人兴奋的机器学习算法的文章,但关于产品化机器学习模型的文章却不多。人们对这些系统的工程设计越来越感兴趣,例如 ScaledML 会议,以及 MLOps 的诞生。然而,生产机器学习模型是一项仍然短缺的技能。

在我迄今为止的职业生涯中,我在生产机器学习模型方面得到了一些来之不易的教训。以下是其中的一些。

推特最近一直在热议 GPT-3。在正确的种子的引导下,事实证明 GPT-3 可以做很多令人惊讶的事情,比如在网页上生成按钮和反应代码。在这些令人兴奋的发展的刺激下,你的利益相关者有了一个想法:如果你建立一个 GPT-3 的等价物来帮助加速你工作的公司使用 GPT-3 的前端开发会怎么样?

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

GPT-3 从语句中生成布局代码(来源:此处为)

你应该训练你自己的 GPT-3 模型吗?

哦,不!GPT-3 是一个 1750 亿参数的模型,需要谷歌和微软之外的大多数公司难以开发的资源。由于 OpenAI 正在测试其 GPT-3 API,因此更谨慎的做法是尝试一下,看看该模型是否能解决您的用例,以及该 API 是否能扩展到您的用例。

那么,买(更像是租)还是建?看情况。

这看起来像是一个逃避的答案,但它是软件行业中一个古老的问题。这也是一个如此庞大和复杂的主题,它应该有一个自己的帖子。

然而,在这里我可以提供一些指导方针,帮助你与利益相关者讨论购买与建造的问题。第一个是

这个用例不是核心能力吗?对于现有/潜在的 AWS 产品,它是否足够通用?

这个问题的基本原则是问你自己你将要从事的工作是否是公司核心竞争力的一部分。如果您的利益相关者能够负担得起,购买现成的解决方案可能是值得的。

数据之外的资源是否可用?例如人才和基础设施?

在其核心,建立和部署一个可靠的机器学习系统是仍然主要是软件工程,增加了一个转折:数据管理 。如果团队没有将模型构建为服务 API 的经验,没有收集、清理、标记和存储数据的经验,那么所需的时间可能会非常长,比如 1 到 2 年(甚至更长)。相反,部署第三方解决方案可能需要 3 到 6 个月,因为这主要是关于将解决方案集成到产品中。企业主会发现这种时间和成本的节省极具吸引力。

另一方面,如果这与公司的核心竞争力有关,那么投资建立一个能够基于公司专有数据设计和部署模型的团队是更好的方式。它允许对过程进行更多的控制和理解,尽管它会带来很高的初始投资开销。

只要记住

对企业主来说,最重要的是:你的模型的输出在企业环境中如何有用?

广义地说,机器学习是自动化的下一步。所以以这种方式思考,你的模式有助于增加收入,或者通过降低成本来提高业务效率。

例如,集成一个更好的推荐系统应该会带来更高的用户满意度和参与度。更高的满意度导致更多的订阅和有机推广,从而带来更高的收入和更低的流失率。

作为一名数据科学家,你必须帮助企业主做出是构建还是购买的最佳决策,这意味着要在业务环境中评估这两种方法的具体利弊。

这篇文章中的观点在处理“构建与购买”问题时非常有用,它也适用于机器学习产品。正如这里的所说,如果这是一项核心业务能力,就有理由自己去打造。

考虑搜索小狗照片的用户的搜索结果。这里我们有一个来自 Unsplash 的例子,一个来自 Shutterstock,最后一个来自 EyeEm,这次是在移动设备上。

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

来源: Unsplash

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

来源: Shutterstock

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

来源:手机上的 EyeEm

我们可以看到,虽然每个用户界面(UI)显示的图像范围很广。假设我们想要使用图像上的点击来训练一个给出更好搜索结果的模型。

如果你是用户,你会首先被哪张图片吸引?

在 Shutterstock 示例中,您可能首先被窗口最右侧的 puppy 吸引,但在 EyeEm 示例中,它可能是中间的图像。

很明显,每个 UI 之间的差异导致了所收集的数据分布的差异。

信息检索文献表明,显示结果时存在位置偏差呈现偏差。用户完全有可能点击排名第一的结果,即使它与他们的搜索查询无关,仅仅因为这是他们看到的第一个东西,他们可能对结果很好奇!

我们可以看到,用于训练搜索排名模型的点击数据会有这些偏差,这是由 UI 的设计方式决定的。所以,

了解模型最终将在产品中的何处以及如何使用

数据科学家和机器学习工程师不能孤立地构建模型,因为模型最终会被使用。这样做的结果是,数据科学家必须与产品中涉及的所有专业人员合作:产品经理、设计师、工程师(前端和后端)和质量保证工程师。

跨职能团队工作提供了好处,包括向所有团队成员简要介绍模型的局限性,以及它如何影响 UI 设计,反之亦然。另一个是找到简单、可靠的方法来解决问题,例如,不要使用机器学习来解决固有的 UI(和用户体验)问题。设计者还可以想出一些方法来使模型结果的呈现看起来令人惊叹,以及约束 UI 中的用户操作来限制进入模型的输入空间。

数据科学家必须建立关于产品的领域知识,包括为什么做出某些 UI 决策,以及如果产品发生变化,它们如何影响您的下游数据。后一点尤其重要,因为这可能意味着当产品变更推出时,您的模型很快就会过时。

此外,如何呈现模型的结果是很重要的,以便在未来的训练数据中最小化偏差,正如我们将在接下来看到的。

分析收集通常依赖于工程师在他们负责的服务中为产品的各个部分设置分析事件。有时,分析没有被收集,或者收集的数据中带有噪音和偏见。分析事件可能会被丢弃,从而导致数据丢失。点击一个按钮没有去抖,导致多个重复事件。

不幸的是,机器学习模型通常是这些分析数据的下游消费者,这意味着测量和数据收集的问题会对模型产生巨大影响。

如果关于数据有一件事需要记住,那就是

数据是测量的副产品

这意味着了解数据来自哪里,以及如何收集数据是很重要的。正确地进行测量也是至关重要的,定期对测量系统进行测试以确保良好的数据质量。与工程师和数据分析师一起工作以直接了解问题也是谨慎的,因为在收集的数据中通常有一个“陷阱”。

存储的数据需要进行编码,以适应业务领域。让我们以图像存储为例。在大多数领域,有损 JPEG 图像可能可以很好地编码您存储的图像,但在一些需要非常高分辨率的领域,例如使用机器学习来检测 MRI 扫描中的异常,就不适合。将这些问题提前传达给帮助您收集数据的工程师非常重要。

研究中的机器学习不同于产品中的机器学习,因为通常你最大的胜利来自更好的数据,而不是更好的算法。然而,也有例外,例如深度学习在许多领域提高了性能指标。即使这样,这些算法仍然对训练数据敏感,你需要更多的数据。

说服你的利益相关方继续投资改善数据收集基础设施 *总是值得的。*有时,即使是构建新功能的新数据源也能提升模型性能指标。它不仅有助于更好的模型,还有助于更好地跟踪公司的关键指标和整体产品特性。和你一起工作的数据分析师会为此而非常感激。

一位前 Dropbox 数据科学家最近告诉我

您最大的改进通常来自与工程师坐下来改进分析

这是我在战壕中亲身经历的一个故事。

在 Canva 整合从学习到排名模型以改善图像搜索的早期,我们计划使用一套来自 Mechanical Turk 的相关性判断。Canva 有一个图形设计编辑器工具,允许用户搜索超过 5000 万张图片,并将其纳入设计中。

基本上,我们收集了几组成对的判断:对于每个搜索词,给评分者一对图片,其中一张他们竖起大拇指。术语萤火虫的成对判断评级示例如下所示。虽然两者都是相关的,但是评价者更喜欢左边的图像而不是右边的图像。

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

对搜索词“萤火虫”的成对判断:评价者更喜欢左边的图像而不是右边的图像(来源:作者)

然后,我们使用这些成对的判断训练了一个模型,另一个模型只依赖于搜索日志的点击。后者有更多的数据,但由于位置偏差和错误的点击,质量较低。这两个模型在离线排名指标上看起来都很棒,并且对结果进行了视觉检查(手动,用我们的眼睛)。

然而,在在线实验中,依赖于这些来源的相关性判断的模型与控制和其他模型相比,具有非常差的性能,降低了业务指标。

发生了什么事?

事实证明,我们的判断来源于而不是用户搜索符合其设计的图片的背景,而不仅仅是纯粹的搜索相关性。这种缺失的上下文导致数据集的分布不同于产品中的数据分布。

不用说,我们的假设是错误的。

数据分布不对称是一个非常现实的问题:即使是在谷歌的 Google Drive 中实现快速访问功能的团队也面临着 it⁴.在这种情况下,为开发环境收集的数据分布与最终部署环境的数据分布不匹配,因为培训数据不是从生产服务中收集的。

用于训练模型的数据应该与部署模型的最终环境相匹配

要检查的其他假设示例有

  1. 出现了概念漂移,数据分布发生了重大变化(最近的一个例子是新冠肺炎疫情扰乱了预测模型),
  2. 特征 的预测能力进入模型,因为一些特征的预测能力随着时间而衰减,并且
  3. 产品弃用,导致功能消失。

通过设置监控系统来检查数据质量和模型性能指标,以及标记异常,这些问题可以得到部分解决。谷歌在这里提供了一份很好的清单,对你当前的生产机器学习系统进行评分,包括要注意的数据问题。

记住,如果谷歌的一个团队在部署机器学习系统方面的成熟度是世界上最好的团队之一,有数据假设问题,你当然应该仔细检查你对训练数据的假设。

机器学习系统是非常强大的系统。它们为公司提供了创建新产品功能、改进现有产品功能和提高自动化程度的新选择。

然而,这些系统仍然很脆弱,因为有更多关于它如何设计的考虑,以及如何收集数据并用于训练模型。

关于这个话题,我还有更多要说的,但现在这些就够了。

[1]替换为您最喜欢的云提供商。

[2] Thorsten Joachims,Laura Granka,Bing Pan,Helene Hembrooke 和 Geri Gay,准确地将点击链接数据解释为隐式反馈,在 Proc .第 28 届 ACM SIGIR 国际信息检索研究与发展年会(SIGIR),第 154–161 页(2005)。

[3]宋轶·岳、拉詹·帕特尔和海因·罗里格,超越位置偏差:检验结果吸引力作为点击链接数据中呈现偏差的来源,在 Proc .万维网(WWW)第 19 届国际会议,第 1011–1018 页(2010)。

[4] Sandeep Tata,Alexandrin Popescul,Marc Najork,Mike Colagrosso,Julian Gibbons,Alan Green,Alexandre Mah,Michael Smith,Divanshu Garg,Cayden Meyer,Reuben Kan,快速访问:为 Google Drive 构建智能体验,KDD 2017:第 23 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集,第 1643–1651 页(2017)

原文:https://towardsdatascience.com/getting-your-machine-ready-to-use-yolov3-object-detector-on-ubuntu-18-04-185799ebc18d?source=collection_archive———13———————–

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

在安讯,我们的目标是站在计算机视觉开发的前沿。因此,我们喜欢与发生在更广阔的计算机视觉领域的最佳作品保持同步。其中包括跟踪部署的最佳系统,比如 darknet。

这篇文章展示了如何使用 yolov3,更具体地说是 AlexeyAB 的 yolov3 Github repo,让您的机器为对象检测做好准备。这是一篇关于启动虚拟机、安装必要的软件包和初步测试以确保您准备好开始对象检测所需的步骤的高级帖子。这篇文章使用了几个教程,我发现它们在安装这些依赖项的过程中很有用。主要步骤如下:

  1. 启动本地机器或虚拟机,确保你的 GPU 支持 Cuda。
  2. 克隆必要的 GitHub repos
  3. 安装 OpenCV 并用 OpenCV 测试 darknet
  4. 安装 Cuda、Cudnn 和其他必要的软件包,以加快 GPU 中的训练过程。

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

如果你有一台支持 GPU 的机器,你可以跳到第 2 步。否则,获得一个带有 GPU 的虚拟机对于对象检测任务来说将是非常重要的,这样可以大大加快速度。在这次演练中,我们将使用 Microsoft Azure 机器,但任何带有 GPU 或任何其他云计算服务的本地机器显然也可以工作。

  • 一旦你在 Azure 中设置了你的帐户,你就可以导航到你的家,然后检查虚拟机服务。
  • 单击“添加+”按钮,这将打开“创建虚拟机页面”。确保您已经设置了一个资源组,否则您必须在开始设置实例时创建它。
  • 这里的关键部分是为您的虚拟机选择大小。在 Azure 中启动新虚拟机时,在配置的第一页上,您会发现“更改大小”选项。点击它,选择一个“系列”栏显示 GPU 的大小。

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

在 Azure 中更改虚拟机的大小

  • 一旦创建了机器,您仍然可以在以后进行配置,因此,例如,如果您想要添加磁盘空间或更改到另一个机器系列,这是可能的。一旦你启动它,你可以 ssh 进入它,你可以确保你的机器有一个 CUDA 支持的 GPU 与lspci | grep -i nvidia

虽然 GPU 的细节可能有所不同,但输出应该与下面的截图有些相似。

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

显示支持 CUDA 的 GPU 详细信息的输出

如果你是 Azure 新手,这本入门指南可能会非常有用:

  • 如果您的 github 帐户启用了 ssh,只需
git clone [git@github.com](mailto:git@github.com):AlexeyAB/darknet.git
  • 如果这是一个新的虚拟机,您可能需要先安装 git:
sudo apt install git-all

完成后,确保它正常工作,您的工作目录看起来应该类似于以下内容:

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

克隆 AlexeyAB darknet repo 后的工作目录

  • 您还需要几个其他的依赖项:
sudo apt install make
  • 如果你还没有,你将需要 C 编译器gccg++。你可以和which gccwhich g++核实一下。如果没有安装,您可以使用以下命令进行安装。
sudo apt install gcc
sudo apt install g++
  • 现在我们已经准备好测试 darknet repo(没有 OpenCV,也没有使用 GPU 进行训练或预测。去暗网目录试试$make。您应该会在控制台上看到大量警告消息和打印输出,如果没有错误,那么从技术上讲,您已经准备好开始对象检测了。尝试$ ./darknet命令,您应该会在控制台上看到以下输出:
usage: ./darknet <function

3。在 Ubuntu 18.04 上安装 OpenCV 3 . 4 . 4

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

按照这些步骤,您将安装 OpenCV3.4.4,但是对象检测 repo 应该也可以与版本 4+一起工作。

这个是我发现的最容易跟随的教程之一。Adrian Rosebrock 很好地解释了你复制和粘贴的步骤,这样你就能理解这些依赖项的作用了。他也有很好的替代方法来应对步骤可能会向您抛出错误的情况。

所以去看看吧,希望一切顺利。

您可以通过在命令行中打开 python 进程并输入以下命令来检查安装是否成功

import cv2
print(cv2.__version__)

现在检查一下 darknet 现在是否能与 opencv 一起工作:

更改/darknet/目录中的 Makefile 以显示OPENCV=1,然后重新make。正如官方文档中所述,您可以使用./darknet imtest data/eagle.jpg对此进行测试,尽管请记住,如果您在虚拟机上工作,您会遇到“无法打开显示”错误,但此时一切都应该正常工作,并且您应该可以在测试图像上看到检测概率。

4。在 Ubuntu 18.04 上安装 CUDA 和 cud nn

你可能想在 GPU 上运行 darknet,所以你需要安装 CUDA 和 CUDNN。" CPU 上的 Darknet 速度很快,但在 GPU 上要快 500 倍!"—约瑟夫·雷德蒙

这是由马赫迪-61 发布的的一个非常有用的帖子,其中的脚本执行了安装的大部分。继续完成这些步骤。

这篇文章还强调了如何删除以前的 CUDA 安装:

sudo apt-get purge nvidia*
sudo apt remove nvidia-*
sudo rm /etc/apt/sources.list.d/cuda*
sudo apt-get autoremove && sudo apt-get autoclean
sudo rm -rf /usr/local/cuda*

如果您想要不同的 Cuda 或 CUDNN 版本,只需在上面的脚本中将下载文件更改为所需的版本。

要确保安装成功,请尝试

nvidia-smi

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

成功安装 cuda 的预期产出

最后,尝试

nvcc -V

希望你能得到

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

显示 nvcc -V 结果的输出

最后,重要的是要确保所有这些都与 darknet 一起工作,然后我们可以开始测试对象检测器。

将 darknet 目录中的 Makefile 更改为:

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

Makefile 的头

如果make命令成功,那么你就可以开始测试了。

如果你想用真实的重量来测试

wget [https://pjreddie.com/media/files/yolov3.weights](https://pjreddie.com/media/files/yolov3.weights)./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -dont_show

希望这份高水平的食谱能让你的机器为 AlexeyAB repo 的 yolov3 物体探测器做好准备。

原文:https://towardsdatascience.com/ggplot-grammar-of-graphics-in-python-with-plotnine-2e97edd4dacf?source=collection_archive———12———————–

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

你希望 Python 能模仿 R 语言中 ggplot 给你的出色可视化效果吗?嗯,可以的。

我们将探索 Plotnine 的功能,这是一个基于 ggplot2 的 Python 可视化库。

能够可视化您的数据使您能够更好地理解它。它让您有机会深入了解数据元素之间的关系,并发现相关性和依赖性。R 中的 ggplot 和 Python 中的 Plotnine 为您提供了以逻辑方式实现这一点的能力。

要做到这一点,你不需要成为 Python 专家,尽管接触一些 Python 编程会很有用,对 Pandas 中的数据帧有基本的了解也会很有用。

如果你也熟悉 Jupyter 笔记本,那将会很有帮助。

ggplot2 是一个强大的 R 图形库,在 Hadley Wickham ( *附属链接)*的书“ ggplot2:优雅的数据分析图形”中有所描述。韦翰,反过来,他的工作基于“图形的语法”,由利兰威尔金森的一本书。Wilkinson 的书给出了图形语法的理论基础,Wickham 的书展示了如何实现这种语法(在 ggplot2 中)。

ggplot2 实现了一种构建图形的分层方法,并允许使用标准例程来构建流行的图形和图表,或者构建自定义图形来满足您自己的目的。

Plotnine 基于 ggplot2,用 Python 实现。

根据您的 Python 安装,您可以使用 pip 来安装它:

pip install plotnine

或者康达:

conda install -c conda-forge plotnine

本文将重点介绍如何构建和定制标准图形——线条、条形图等——使用图层来修改这些图,并希望对您如何制作自己的定制图有所启发。

然后,在你的程序中,你的第一行应该是

from plotnine import *

ggplot 命令有三个基本要素:数据、美学和图层。数据的作用是明确的,我们应该以熊猫数据框架的形式提供它。美观是数据中的变量被映射到视觉属性上的地方,而描述了如何呈现数据,例如,作为一个条形图。可以有几个层来定义不同的图表或图表的一部分,例如轴上的标签。

在 R 中,ggplot2 中的命令类似于:

ggplot(data, aesthetics) 
 + layer1()
 + layer2()

Plotnine 使用了相同的模式,但这并不十分符合 Python 语法。你可以写:

ggplot(data,aesthetics) + layer1() + layer2()

但是你可能会排很长的队。不过,解决方法很简单。把整个事情用大括号括起来。所以我们最后得到了:

(ggplot(data,aesthetics)
 + layer1()
 + layer2()
)

因此,这是我将在本文中使用的风格。

如果你已经了解了我对熊猫图和 T2 图的可视化介绍,你会对我使用的天气数据很熟悉。这是来自英国气象局的公开数据,并绘制了伦敦过去几十年的天气数据。

这些数据记录了每个月的最高和最低温度、日照时间和降雨量。有两个表,一个是 1957 年的完整数据,一个较短的表只记录了 2018 年的数据。

我们先拿 2018 年的数据。

import pandas as pd
weather=pd.read_csv(‘[https://raw.githubusercontent.com/alanjones2/dataviz/master/london2018.csv](https://raw.githubusercontent.com/alanjones2/dataviz/master/london2018.csv)')
weather

这是它看起来的样子:

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

Year 列是相当多余的,但是与更大的数据文件是一致的。其他列不言自明。月份从 1 到 12,温度以摄氏度为单位,降雨量以毫米为单位,日照以小时为单位。

所以,从 ggplot 开始,我们要画一个每个月最高温度的线图。然后,我们将添加一些层来增强图表。

对 ggplot 调用的剖析如上所述。第一个参数是我们将要绘制的数据,天气,下一个参数是对 aes 的调用。aes 将数据映射到不同的“美学”上——这里我们只有两个。默认情况下,前两个参数是 x 轴和 y 轴。所以这里的月在 x 轴上,Tmax 在 y 轴上。

这本身是对 ggplot 的合法调用,但它不会绘制任何东西。为此,我们需要添加一个层来告诉 ggplot 我们想要什么样的图形。图形类型称为 geoms ,我们这里使用的是 geom_line ,这当然是一个线图。

(ggplot(weather,aes('Month', 'Tmax'))
  + geom_line()
)

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

这是一个好的开始,但是我们可以做得更好。例如,您会注意到月份是数值而不是实际日期,所以折线图将它们解释为实数。这意味着我们最终的月份从 2.5 到 12.5 不等——这并不理想。

我们可以通过在 graph 函数中添加另一层来轻松解决这个问题。ggplot 允许我们指定每个轴的刻度,所以我们将添加一个层来完成这项工作。我们希望刻度是数字 1 到 12,这正是月份列中的数字。因此,我们将使用该数据来告诉 ggplot 分笔成交点应该是什么。

为了方便起见,我将使用一个变量。像这样:

months = weather['Month']

这是完整的代码

months=weather['Month'](ggplot(weather,aes('Month','Tmax')) 
  + geom_line()
  + scale_x_continuous(breaks=months)
)

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

这样更好,但是如果我们想用字符串标记月份,比如“一月”、“二月”等等,那该怎么办呢?当然,我们可以改变表格中的数据,但是这篇文章是关于 ggplot 的,所以我们将使用它。

另外,我不喜欢默认的配色方案。ggplot 附带了许多我们可以使用的主题,所以我将添加另一个层来指定我要使用主题,并向几何线添加一个参数来告诉它绘制一条红线而不是默认的黑线。

month_labels=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")(ggplot(weather,aes('Month','Tmax')) 
  + geom_line(color='red') 
  + scale_x_continuous(breaks=months,labels=month_labels) 
  + theme_light()
)

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

我认为这是一个进步。

让我们用柱形图做同样的图。

要画柱形图,我们只需交换几何图形。我们用 geom_col 代替 geom_line 。简单。唯一需要注意的是,如果我们想改变条形的颜色,我们需要指定一个“填充”。有一个参数“颜色”,但这只改变列的轮廓。

(ggplot(weather,aes('Month','Tmax'))
  + geom_col(fill='red')
  + scale_x_continuous(breaks=months, labels=month_labels)
  + theme_light()
)

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

这是同样的雨的情况——适当的雨的颜色变化。

(ggplot(weather,aes('Month','Rain'))
  + geom_col(fill='green')
  + scale_x_continuous(breaks=months, labels=month_labels)
  + theme_light()
)

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

我想在同一个图上画出 TmaxTmin——我该怎么做?

最好的方法是转换数据,使两个温度在同一列中,并在单独的列中标记为 TmaxTmin 。这很容易用熊猫融化功能完成。在这里,我创建了一个新的 dataframe temps 和所需的列。

temps = pd.melt(weather, id_vars=['Month'], 
                value_vars=['Tmax','Tmin'], 
                var_name='Temp', value_name='DegC' )
temps

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

现在我用柱形图绘制它们。这里有几件事需要注意。首先,我已经将填充从 geom 中取出,并将其放入对 aes 的调用中,并将其分配给 Temps (它将是 TmaxTmin )。

在 geom 中指定一种颜色会固定该 geom 中的颜色,而通过将其放入 aes,我可以告诉 geom 为每个 Temp 值的列指定不同的颜色。因此,geom 列现在将为两个单独的条着色,一个表示 Tmax,另一个表示 Tmin。默认情况下,这些条是堆叠的,但这里我们希望它们是并排的。

第二件事是,在 geom 列中,我将位置指定为“dodge ”,这为我们提供了并排配置。

(ggplot(temps,aes('Month','DegC',fill='Temp'))
  + geom_col(position='dodge')
  + scale_x_continuous(breaks=months)
  + theme_light()
)

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

这是同样的东西,但是有线条。注意,我为线条指定了颜色而不是填充,我不需要担心位置。

(ggplot(temps,aes(‘Month’,’DegC’,color=’Temp’))
  + geom_line()
  + scale_x_continuous(breaks=months)
  + theme_light()
)

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

正如你所看到的,为了给情节添加更多的东西,我们添加了更多的层。要修改图表上的标签,我们也可以这样做。在下一段代码中,我添加了图层来指定 x 轴和 y 轴上的标题,并给整个图表添加了一个标题。

(ggplot(temps,aes('Month','DegC',color='Temp'))
  + geom_line()
  + scale_x_continuous(breaks=months)
  + theme_light()
  + xlab('2018')
  + ylab('Temperature in degrees C')
  + ggtitle('Monthly Maximum and Minimum Temperatures')
)

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

让我们考虑画一张图来总结整个数据表。降雨量和日照两种温度的柱形图。

首先,我们再次熔化数据帧,但这次我们将所有数据放在一列中。每个值将被标记为 TmaxTminRainSun

data = pd.melt(weather, id_vars=['Month'], 
               value_vars=['Tmax','Tmin','Rain','Sun'], 
               var_name='Measure', value_name='Value' )

为了创建刻面图,我们添加了一个 facet_wrap 层,并将测量值传递给它,这意味着我们将获得 Tmax、tmin、Rain 和 Sun 中每一个的刻面。默认情况下,这些面将使用相同的比例,这对于 Tmax 和 Tmin 来说是合适的。但是雨和太阳是不同的,温度也是不同的。所以我们需要告诉 facet_wrap 刻度是‘自由’的,也就是说,每个刻面都有自己的刻度。

问题是这样做意味着 y 轴的标签会与图表重叠,所以我们需要用另一个图层来调整布局。最后一层是主题的修改( theme_light ),在小平面之间增加额外的空间,并设置图形的整体大小。注意这必须在 theme_light 图层之后,否则 theme_light 会将布局重置为默认设置。

(ggplot(data, aes('Month','Value', fill='Measure'))
  + geom_col(show_legend=False)
  + scale_x_continuous(breaks=months,labels=month_labels)
  + facet_wrap('Measure', scales='free')
  + xlab('')
  + ylab('')
  + ggtitle('Weather Data for London, 2018')
  + theme_light()
  + theme(panel_spacing=0.5, figure_size=(10,5))
)

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

这是 Plotnine 用 Python 实现的 ggplot 的一些方面和特性的随机演练。我希望你能看到这种方法的力量,并鼓励你去读读 Hadley Wickham 关于 ggplot2 的书,看看 Plotnine 文档。

如果您想了解未来的文章,请免费订阅我的 简讯

原文:https://towardsdatascience.com/ggplotly-the-most-bang-for-buck-function-in-the-extended-tidyverse-62f02a69b70f?source=collection_archive———24———————–

我是 tidyverse 和 ggplot 的忠实粉丝。tidyverse 是一个用于探索性数据分析的优秀框架,ggplot 非常棒。这些工具提供的导入数据、重塑数据和可视化数据的能力非常强大。

除了核心 tidyverse,还有许多支持包。在所有的函数中,在所有这些包中,有一个函数为单个函数调用提供了大量的值。

这是一个单一的函数调用,您可以围绕您的 ggplot()函数进行交互式可视化。

我发现它带来的主要价值是:

  • 您可以缩放和平移绘图
  • 您可以将鼠标悬停在点上来查看它们的值

运行起来很简单:

  • 您只需要将现有代码包装在 ggplotly()中
  • 安装就像 install.packages 一样简单

例如,我使用 ggplot 创建了一个标准的散点图。这是我很多数据探索的通常起点。

iris %>% 
  ggplot(aes(x=Sepal.Length,y=Sepal.Width,color=Species)) +
  geom_point()

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

从这里开始,我经常想放大并进一步研究数据。为此,我的标准模式是将数据帧通过过滤器传输到 ggplot:

iris %>% 
  filter(Sepal.Length < 7, Sepal.Length > 5) %>% 
  ggplot(aes(x=Sepal.Length,y=Sepal.Width,color=Species)) +
  geom_point()

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

然后,我可以缩小这些过滤器的范围,隔离出我感兴趣的点,如果我想详细查看这些点,我可以将对 ggplot()的调用替换为对 View()的调用,如下所示。

iris %>% 
  filter(Sepal.Length < 7, Sepal.Length > 5,
         Sepal.Width < 4, Sepal.Width > 3) %>% 
  View()

这些技术可行,但可能有点复杂。通常,我真正想要的是能够使用 ggplot()创建一个可视化,同时还能够与它进行交互以放大。这就是 ggplotly()的用武之地。

ggplotly(iris %>% 
  ggplot(aes(x=Sepal.Length,y=Sepal.Width,color=Species)) +
    geom_point())

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

这里的关键价值是,我可以像往常一样使用 tidyverse 创建我的图,然后简单地将它包装在一个函数调用中,使它具有交互性。这对于探索性的数据分析非常有用。

我还发现 ggplotly()是闪亮仪表板的一个有价值的补充。我认为 ggplotly()提供的缩放和悬停信息功能在 Shiny 中更有价值。我认为这是因为仪表板经常被其他人使用,而不是构建图表的人,所以不太熟悉数据集。我还认为交互式 ggplotly()图比静态图和一个闪亮应用程序上的一组过滤器滑块更令人满意。

我已经上传了这个情节的现场版本到 RPubs,如果你想自己玩,可以通过下面的链接访问。当然,这很容易开始,你还不如自己动手。

[## RPubs

基本 ggplotly()示例

rpubs.com](http://rpubs.com/OwenFlanagan/565119)

原文:https://towardsdatascience.com/ghost-writing-with-tensorflow-49e77e26978f?source=collection_archive———40———————–

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

Aditya Chinchure 在 Unsplash 上拍摄的照片

音乐一直被认为是最有影响力和最强大的艺术形式之一。因此,它被用来表达艺术家的原始情感,并将其传递给听众。

作为一名音乐爱好者,很自然地会想知道使用递归神经网络(RNNs)生成歌词会有多困难。我真的很喜欢说唱和嘻哈音乐,所以我选择了这些流派的艺术家。这也是一个很好的配合,因为有关于说唱歌词生成的现有研究。

递归神经网络可以用于许多语言建模任务,例如:聊天机器人、预测键盘和语言翻译。当涉及到文本生成时,递归神经网络工作良好,因为它们能够处理顺序数据。这是有益的,因为我们需要保留一个句子的上下文,或者在这种情况下,一首诗的上下文。

对 RNN 如何工作的一种解释是,它查看序列中以前的数据来预测序列中的下一个元素。比方说,我们有一个训练有素的 RNN 在你的手机键盘上进行文本预测(你知道,当你打字时弹出的单词预测)。根据我之前输入的信息,我可以输入类似“Wezley 是超级……”的内容,神经网络将接受这一序列,并给出一组预测词,如:“酷”、“聪明”和“有趣”。

为了增加这个实验,我想训练不同的递归神经网络架构来执行 rap 歌词生成。我选择了简单神经网络、门控循环单元、长短期记忆和基于卷积神经网络+长短期记忆的架构。我选择这些是为了确保我们能够相互测试每个架构,以确定哪个架构在给定的任务中表现最好。除非我们尝试,否则我们不知道一个模型是否会优于另一个,对吗?

SimpleRNN 体系结构更适合作为基线,看看其他体系结构的性能如何。由于消失梯度问题,简单的 RNN 体系结构不太适合这个特定的任务。这意味着 SimpleRNN 在记忆整个小节/诗的上下文时不是很有用,因为它会丢失序列中的早期信息。这导致了不连贯的诗句,你会在文章的后面看到。如果你很好奇,想要一个 TL;博士的模型如何表现:我们得到的诗句,如“我是什么石头私人卧室现在”或“如何改变了低最后气吉他的事情。”这两个诗句都是从德雷克歌词的数据集生成的。这两个都没什么意义。然而,我认为他们仍然是火吧。

门控循环单元架构是我测试的下一个架构。门控循环单位不同于 SimpleRNN,它能够记住序列中稍靠下的部分。它通过利用两个门来实现这一点,一个复位门和一个更新门。这些门控制先前的序列信息是否继续通过网络,或者是否更新到最近的步骤。我将在本文中对此进行更深入的探讨。

这个项目测试的另一个架构是长短期记忆架构。LSTM 与简单神经网络的不同之处在于,它能够记住序列中更靠后的部分。LSTM 比 GRU 更有优势,因为它稍微复杂一些,能够记住更长的序列。LSTM 有三个门,而不是两个,控制它遗忘的信息,按顺序进行,并从最新的一步更新。同样,LSTM 将在本文的稍后部分进行更深入的讨论。

我测试的最终架构是一个卷积神经网络和长短期记忆 RNN 的混合体。我把这个作为一个思想实验,基于我读过的一篇使用 C-LSTM 架构进行文本分类的论文(参考 Colab 笔记本)。我想知道 CNN 是否会允许 LSTM 概括一个酒吧,更好地理解艺术家的风格要素。虽然在文本生成问题上看到 CNN 很有趣,但我并没有注意到这和 LSTM 模型之间有什么不同。

创建了一组定义好的架构后,我开始寻找我想用于解决这个问题的数据集。

数据集对我来说并不重要,只要它包含著名艺术家的歌词。我想根据我经常听的艺术家创作歌词。这是为了让我能够识别模型是否能够生成类似的歌词。不过不要担心!我不会仅仅根据我认为好听的东西来决定一个模特的表现。我还使用了一组在最近的相关文献中描述过的指标。

我在 Kaggle 上找到的数据集是由 Paul Mooney 提供的。

这个数据集很棒,因为它包含了我听的许多说唱/嘻哈艺术家的歌词。它也没有任何奇怪的字符,并照顾到一些明确的歌词审查。

有了数据集,我开始加载和准备用于训练的数据。

我做的第一件事是载入数据并完成审查。我使用一个预先存在的 Python 库来执行审查,这样我就不必手动创建一个“不良词汇”列表。不幸的是,图书馆没有审查每一个词,所以如果你在这篇文章的出版笔记本中偶然发现一些明确的东西,我道歉。

歌词被读入并审查后,我继续将它们分成一系列小节。我没有对这些条进行任何其他处理,但是将来我可能会再次尝试,给每个条添加和标签。通过这种方式,模型可能知道何时结束序列。现在,我让它生成随机长度的条,结果对于最初的实验来说已经足够好了。

完成数据分割后,我利用 markovify Python 库创建了一个 Markov 模型。马尔可夫模型将被用于生成每个条形的开始序列。这将有助于我们确保在将序列传递给训练好的模型之前,序列的开始是有点连贯的。然后,模型将获取序列,并完成为酒吧生成歌词。

下一步是将歌词符号化,以便它们是模型可以理解的格式。标记化实际上是一个非常酷的过程,因为它基本上是将单词拆分成一个单词字典,并与 id 相关联,然后将每个条形改变成一个相应单词 id 的数组。在发布的笔记本中有一个这样的例子,但这里有另一个这样的例子:

举个例子,假设我们要标记以下句子:

  • 《威兹利很酷》
  • 《你很酷》
  • “tensor flow 很酷”

将产生以下序列:

  • 【1,2,3】
  • 【4,5,3】
  • 【6,2,7,3】

其中单词字典是:

[‘Wezley’ : 1,’ is’ : 2,’ cool’ : 3,’ You’ : 4,’ are’ : 5,’ TensorFlow’ : 6,’ very’ : 7]

照这样,这些序列不能被输入到模型中,因为它们的长度不同。为了解决这个问题,我们在数组的前面添加了填充。

使用填充,我们得到:

  • 【0,1,2,3】
  • 【0,4,5,3】
  • 【6,2,7,3】

将条形标记化后,我终于能够创建用于训练的 X 和 y 数据了。train_X 数据由整个条形组成,减去最后一个字。train_y 数据是栏中的最后一个字。

展望未来,就像在条形上添加和标签一样。我想尝试改变我分割训练数据的方式。也许下一个版本可以基于之前的条形图预测整个条形图。不过,这将是另一天的项目。

数据被导入并分成 train_X 和 train_y 集合。是时候定义模型架构并开始培训了。

首先是 SimpleRNN 架构!SimpleRNN 将提供与 GRU、LSTM 和 CNN+LSTM 架构的良好基线。

SimpleRNN 单位可以用算术方法表示为:

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

其中 h(t) 表示为给定时间点的隐藏状态 t 。正如您在等式中看到的,SimpleRNN 依赖于先前的隐藏状态 h(t-1) 和当前的输入 x(t) 来给出当前的隐藏状态。

SimpleRNN 很棒,因为它能够处理序列数据。不足之处在于它的简单性。SimpleRNN 不能记住序列中更靠后的数据,因此受到消失梯度问题的困扰。当我们开始进一步深入序列时,消失梯度问题就出现了。这是早期状态难以表达的时候。SimpleRNN 中没有机制来帮助跟踪以前的状态。

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

消失梯度可视化

在代码中,SimpleRNN 网络看起来像:

简单网络架构

送入网络的数据仅表示为一个 NT 向量,而 SimpleRNN 需要一个 NT*D 向量。我们通过添加一个嵌入层来修正这个问题,给向量一个 D 维。嵌入层允许将输入转换成密集向量,该向量可以被馈送到 SimpleRNN 单元。有关嵌入层的更多信息,请参见 TensorFlow 文档此处。

我正在使用 Adam 优化器,学习率为 0.001。我用分类交叉熵作为损失函数。使用分类交叉熵是因为我们试图根据前面的步骤对序列中的下一个单词进行分类。

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

简单细胞

接下来是利用门控循环单元的网络。

GRU 通过引入复位和更新门来改进 SimpleRNN 单元。在高层次上,这些门用于决定我们想要保留/丢失先前状态的信息。

GRU 表示为:

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

其中 z(t) 为更新门, r(t) 为复位门, h(t) 为隐藏单元状态。

以下是 GRU 的实际效果:

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

GRU 细胞

以下是 GRU 网络在 TensorFlow 中的构建方式:

同样,我将 Adam 用于优化器,将分类交叉熵用作损失函数。

长短期记忆结构是下一个被利用的。

长短期记忆单元优于简单神经元和 GRU 单元,因为它能够在序列的更下游保留更多的信息。LSTM 使用三个不同的门,而不是 GRU 的两个,并在整个网络中保留一个单元状态。众所周知,GRU 比 LSTM 具有速度优势,因为它能够更快地进行概化并使用更少的参数。然而,当涉及到在整个序列中保留更多的上下文数据时,LSTM 倾向于拿走蛋糕。

LSTM 单元可以表示为:

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

其中 f(t) 代表遗忘门,并确定要遗忘多少先前状态。那么 i(t) 代表输入门,它决定了我们将向单元状态添加多少新信息。 o(t) 是输出门,它决定哪些信息将前进到下一个隐藏状态。单元格状态用 c(t) 表示,隐藏状态为 h(t)。

这是数据通过 LSTM 池的可视化效果:

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

LSTM 细胞

请参见下面的代码实现:

我想测试的最终架构是卷积神经网络和 LSTM 的结合。

这个网络是一个思想实验,看看结果会如何不同于 LSTM、GRU 和 SimpleRNN。实际上,我对它将要发表的一些诗句感到惊讶。

这是架构的代码:

为这个项目创建模型仅仅是工作的一半。另一半利用训练好的模型生成歌词。

在我看来,这就是这个项目变得真正有趣的地方。我能够将我训练的模型用于一项重要的任务。

这个项目很大程度上受到彼得·卡塔什、阿列克谢·罗马诺夫和安娜·拉姆斯斯基的《评估创造性语言生成:说唱歌词代写案例》的启发。因此,我将利用他们论文中概述的一些方法,对照艺术家的原始歌词来评估模型的输出。

我用来评估小节和生成 rap 的方法有:理解分数、韵律指数和抒情独特性。我将很快讨论我是如何计算这些的。

对我如何创作歌曲的高度概括可以描述为:

  • 利用马尔可夫模型生成小节前四个单词
  • 将马尔可夫模型的输出输入到 RNN 中
  • 对照原始歌词评估 RNN 的输出的独特性、相似的押韵索引和相似的理解分数
  • 要么把酒吧扔了(如果是垃圾),要么把它加到歌里(如果是火)

相当简单,对吧?

让我们来看看这是如何实现的代码。

首先,我有一个名为 *generate_rap 的函数。*该函数处理生成说唱歌曲的主要功能。 generate_rap 接受我想要用来生成 rap 的模型(SimpleRNN、GRU、LSTM 或 CNN+LSTM)、最大小节长度、我们想要在 rap 中包含多少小节、分数阈值以及我们想要生成 fire bar 的尝试次数。分数阈值定义了该条在被认为是火之前的分数,在这种情况下,该条越接近 0,它就越火。下面是该函数在代码中的样子:

如你所见,我们生成了一个随机条,根据艺术家的平均押韵指数、平均理解能力和条的独特性来评分。然后,如果小节达到分数阈值,它就进入最后的歌曲。如果算法无法在定义的最大尝试次数内生成火条,它会将得分最高的火条放在歌曲中并继续前进。

generate_rap 中,我使用了另一个名为 generate_bar 的函数。这个函数接受一个种子短语、我们用来生成序列的模型以及序列的长度。然后, generate_bar 将对种子短语进行标记,并将其输入到提供的模型中,直到序列达到期望的长度,然后返回输出。代码如下:

为了给棒线打分,我使用了一个名为 score_bar 的函数。这个函数接受我们想要评分的小节、艺术家的原始歌词、艺术家的平均理解分数和艺术家的平均押韵指数。 score_bar 计算输入条的理解分数、押韵指数和独特性指数,然后对输入条进行评分。

该条的分数可以是正的,也可以是负的,0 是该条可以达到的最高分数。分数为 0 意味着该小节具有相同的押韵指数和理解分数,同时保持与原始艺术家的歌词完全不同。完美的 0 分是不可能达到的,这就是我们定义最小和最大阈值的原因。

score_bar 函数如下所示:

为了计算一个小节的韵律指数,我使用了“评估创造性语言生成:说唱歌词代笔的案例”中描述的方法押韵指数的计算方法是将押韵音节的数量除以小节或歌曲中的音节总数。下面是代码实现:

为了比较生成的条形的唯一性,我正在计算生成的条形和所有艺术家的条形之间的余弦距离。然后我得到平均距离来计算总的独特性分数。这是它的样子:

有了这一切,我终于能够利用我训练的四个模型生成一个完整的 rap。生成 rap 后,我取生成的歌曲,计算押韵指数和理解分数。令人惊讶的是,整首歌仍然相当接近原艺术家的押韵指数和理解分数。

以下是训练德雷克歌词时的一些输出。

最简单的:

Generated rap with avg rhyme density: 0.5030674846625767 and avg readability of: 2.0599999999999996 Rap Generated with SimpleRNN: Now you’re throwing me baby know it know 
Look I gotta started with you hook drake 
I swear it happened no tellin’ yeah yeah
....

GRU:

Generated rap with avg rhyme density:  0.5176470588235295 and avg readability of:  1.9449999999999998 Rap Generated with GRU: That's why I died everything big crazy on me 
Who keepin' score up yeah yeah yeah yeah 
I've loved and you everything big crazy on me on
....

LSTM:

Generated rap with avg rhyme density:  0.3684210526315789 and avg readability of:  1.9749999999999996 Rap Generated with LSTM: Get the **** lick alone same that wait now 
up ****, see what uh huh heart thing up yeah 
Despite the things though up up up up yeah yeah
....

LSTM+CSNN:

Generated rap with avg rhyme density:  0.33519553072625696 and avg readability of:  2.2599999999999993 Rap Generated with CNN+LSTM: They still out know play through now out out 
I got it dedicate dedicate you yeah 
I've been waiting much much aye aye days aye aye 
....

关于完整的歌词和参考文献列表,看看谷歌 Colab 笔记本。也可以随意自己尝试,为你想要模仿的风格更换艺术家。

就简单的 CNN vs GRU vs LSTM vs CNN+LSTM 的实验而言,我会说 LSTM 往往有最好的结果。CNN+LSTM 在一个栏里有太多重复的词,我认为这与 CNN 将整个序列一般化有关。《简单的人》和《GRU》创作出了相当不连贯的小节,它们的韵律密度与原作相去甚远。

就是这样!请在评论中告诉我你的想法。我希望将来能在这个项目上有所建树。如果你对我需要改变的事情有任何建议,让我知道!感谢您的阅读。

查看我的 GitHub,了解这个项目和其他很酷的项目的代码!

[## wezleysherman -概述

在 GitHub 上注册你自己的个人资料,这是托管代码、管理项目和构建软件的最佳地方…

github.com](https://github.com/wezleysherman)

原文:https://towardsdatascience.com/gibbs-sampling-8e4844560ae5?source=collection_archive———6———————–

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

在 Unsplash 上由 Carlos Muza 拍摄的照片

与其他 MCMC 方法一样,Gibbs 抽样器构建了一个马尔可夫链,其值向目标分布收敛。Gibbs 抽样实际上是 Metropolis-Hastings 算法的一个特例,其中建议总是被接受。

具体来说,假设您想要对一个多元概率分布进行采样。

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

注: 一个 多元概率分布是多个变量的函数(即二维正态分布)。

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

https://commons . wikimedia . org/wiki/File:multivariatenormal . png

我们不知道如何直接从后者取样。然而,由于一些数学上的便利,或者仅仅是运气,我们碰巧知道条件概率。

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

这就是吉布斯采样的用武之地。吉布斯抽样适用于联合分布未知或难以直接抽样的情况,但每个变量的条件分布已知且易于抽样。

我们从选择随机变量 X*&Y的初始值开始。然后,我们从 x 给定 Y = Y⁰的条件概率分布中取样,表示为 p(X|Y⁰).在下一步中,我们采样一个以 X 为条件的 Y 的新值,这是我们刚刚计算的。我们重复该过程进行额外的 n – 1 次迭代,在给定另一个随机变量的当前值的情况下,在从 X 的条件概率分布和 Y 的条件概率分布中抽取新样本之间交替进行。*

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

让我们看一个例子。假设我们有下面的后验和条件概率分布。

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

其中g(y)包含不包含 x 的项,g(x)包含不依赖于 y 的项。

我们不知道 C(归一化常数)的值。然而,我们知道条件概率分布。因此,我们可以用吉布斯抽样来近似后验分布。

注: 条件概率实际上是正态分布,可以改写如下。

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

给定前面的等式,我们继续用 Python 实现 Gibbs 采样算法。首先,我们导入以下库。

*import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set()*

我们定义后验分布的函数(假设 C=1)。

*f = lambda x, y: np.exp(-(x*x*y*y+x*x+y*y-8*x-8*y)/2.)*

然后,我们画出概率分布。

*xx = np.linspace(-1, 8, 100)
yy = np.linspace(-1, 8, 100)
xg,yg = np.meshgrid(xx, yy)
z = f(xg.ravel(), yg.ravel())
z2 = z.reshape(xg.shape)
plt.contourf(xg, yg, z2, cmap='BrBG')*

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

现在,我们将尝试使用吉布斯抽样来估计概率分布。正如我们之前提到的,条件概率是正态分布。因此,我们可以用 mu 和 sigma 来表示它们。

在下面的代码块中,我们为 mu 和 sigma 定义函数,初始化我们的随机变量 X & Y ,并设置 N (迭代次数)。

*N = 50000
x = np.zeros(N+1)
y = np.zeros(N+1)
x[0] = 1.
y[0] = 6.
sig = lambda z, i: np.sqrt(1./(1.+z[i]*z[i]))
mu = lambda z, i: 4./(1.+z[i]*z[i])*

我们逐步执行吉布斯采样算法。

*for i in range(1, N, 2):
    sig_x = sig(y, i-1)
    mu_x = mu(y, i-1)
    x[i] = np.random.normal(mu_x, sig_x)
    y[i] = y[i-1]

    sig_y = sig(x, i)
    mu_y = mu(x, i)
    y[i+1] = np.random.normal(mu_y, sig_y)
    x[i+1] = x[i]*

最后,我们绘制结果。

*plt.hist(x, bins=50);
plt.hist(y, bins=50);*

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

*plt.contourf(xg, yg, z2, alpha=0.8, cmap='BrBG')
plt.plot(x[::10],y[::10], '.', alpha=0.1)
plt.plot(x[:300],y[:300], c='r', alpha=0.3, lw=1)*

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

正如我们所看到的,使用 Gibbs 抽样算法获得的概率分布很好地逼近了目标分布。

Gibbs 抽样是一种蒙特卡罗马尔可夫链方法,它根据其他变量的当前值从每个变量的分布中迭代地抽取一个实例,以便估计复杂的联合分布。与 Metropolis-Hastings 算法相反,我们总是接受建议。因此,吉布斯采样可以更有效。

原文:https://towardsdatascience.com/gini-impurity-measure-dbd3878ead33?source=collection_archive———3———————–

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

Gini 杂质度量是决策树算法中使用的方法之一,用于决定从根节点开始的最佳分裂以及后续分裂。

(在继续之前,您可能想回顾一下用树做决策

将它放入上下文中,决策树试图创建连续的问题,以便将数据划分为更小的组。一旦划分完成,就在该终端节点做出预测决策(基于频率)。

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

假设我们有一个观察列表,表明一个人是否决定呆在家里不工作。我们还有两个特征,即他们是否生病和他们的体温。

我们需要选择哪个特征,情绪还是温度,来分割数据。基尼系数将帮助我们做出这个决定。

Def: 基尼系数告诉我们一个观察值被错误分类的概率是多少。

请注意,基尼系数越低,分割越好。换句话说,错误分类的可能性越低。

下图是两类问题。我们将在后面将其概括为两个以上的组。

Ginx 代表基尼指数。

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

其中 p1、p2 分别是 1、2 类概率。

: p1 + p2 =1

这还没有完成。上面的等式将给出子分割的基尼系数,但是我们想知道整个分割的基尼系数(因为数据将被分割为左右两部分)。因此,我们需要相应地权衡它们。

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

其中,P_L 是向左分流的比例,p_L1 类似于左分流的 P1(P _ R 也是如此)。

我们有一个零的下限和一个半的上限。杂质测量值越低,分离越好。

如果你看一下图表,你会注意到杂质测量值越低越好。当观察值为 1 类的概率为零(一直到图表的左侧)时,这意味着它将始终为 2 类,杂质测量值为零。当观察值为 1 类的概率为 100%时,在另一端也会发生同样的事情。

让我们回到上面的例子,在两个特性上分开。

病态基尼杂质= 2 * (2/3) * (1/3) = 0.444

NotSick 基尼杂质= 2 * (3/5) * (2/5) = 0.48

加权基尼系数= (3/8) * 西基尼+ (5/8)非西基尼= 0.4665

我们将温度的阈值硬编码为 Temp ≥ 100。

杂质温度= 2 * (3/4) * (1/4) = 0.375

杂质下温度= 2 * (3/4) * (1/4) = 0.375

加权基尼系数=(4/8)*TempOverGini+(4/8)*TempUnderGini= 0.375

我们可以看到,温度的基尼系数较低。因此,我们会选择在温度上进行分割,因为它对观察结果进行错误分类的可能性最低。

我们将验证我们的函数确实返回了上面的值。

我们已经完成了基尼系数的引入。我希望这个简短的解释能让你了解决策树是如何决定分割数据的。

请记住,这不是唯一使用的方法,它将取决于您使用的软件包。

感谢您的阅读!

基尼不纯的概括

假设我们有( n) 个不同的类。那么基尼公式将是:

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

原文:https://towardsdatascience.com/gis-data-processing-cheat-sheet-effectively-using-command-line-gdal-b280823a7389?source=collection_archive———34———————–

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

地理信息系统(GIS)信息量大,并提供数据的粒度表示。不用说,这些数据集对研究人员、数据分析师和数据科学家非常有吸引力。但是这些数据带来了一个大问题。从处理和计算时间的角度来看,它们很重,操作起来很痛苦。鉴于这些数据集的大小和结构,除非使用 ArcGis 或 QGIS 等软件,否则很难对其进行有意义的分析。在本文中,我提供了一些简单的命令行代码,可以用来极大地减少处理时间,并且可以有效地用于从这些数据中提取有意义的信息。这段代码使用了 GDAL 程序,这里的是可用的。所以,让我们直接开始吧。

对于那些不熟悉 GIS 数据类型的人来说——我想简单总结一下你可能会遇到的不同类型的 GIS 数据。有两大类需要考虑。第一个是 栅格数据 ,它是基于格网/像元的数据,包含一些关于像元内容的信息(像元中包含的人口这样的离散数据)或它所代表的内容(像特定像元属于什么类别这样的连续数据)。光栅格式的一个例子是. tif。bsq 或者。bil 文件。第二个是 矢量数据 ,是表示为国家、州等地图形状的数据。矢量格式的一个例子是. shp 或 shapefile。现在,我们知道了将要处理的数据,让我们直接进入代码。

要使用这个代码,你需要在你的机器上安装 GDAL。如果你在 windows 机器上,我会推荐通过 cygwin 终端安装 GDAL。

1.获取信息/元数据- 我在本文中使用了一个示例栅格,名为 gpw _ v4 _ population _ count _ rev 11 _ 2000 _ 30 _ sec . TIF。这是一个从 NASA 维护的数据库中下载的文件,可以在这里访问。这是一个简单的栅格,包含世界上每个国家的每个格网像元的人口。要查看该栅格实际包含的内容,让我们使用下面的 gdalinfo 函数。

#First go the directory containing the filecd 'file path here'#Now let's run gdalinfogdalinfo gpw_v4_population_count_rev11_2000_30_sec.tif#This is the output we get
Driver: GTiff/GeoTIFFFiles: gpw_v4_population_count_rev11_2015_30_sec.tifSize is 43200, 21600Origin = (-180.000000000000000,89.999999999999915)Pixel Size = (0.008333333333333,-0.008333333333333)Metadata:AREA_OR_POINT=AreaDataType=GenericImage Structure Metadata:COMPRESSION=LZWINTERLEAVE=BANDCorner Coordinates:Upper Left  (-180.0000000,  90.0000000)Lower Left  (-180.0000000, -90.0000000)Upper Right ( 180.0000000,  90.0000000)Lower Right ( 180.0000000, -90.0000000)Center      (  -0.0000000,  -0.0000000)Band 1 Block=43200x1 Type=Float32, ColorInterp=GrayNoData Value=-3.40282306073709653e+38

因此,我们得到的信息告诉我们**驱动:**这是文件的类型(在本例中是 tif 文件),**大小:**这是网格的大小(组成网格的行数和列数,在本例中是 43200,21600)。**像素大小:**这是像素内投影的大小(在本例中为 0.00833333 度,即 5 弧分),*角坐标:这是投影的范围(这将告诉我们某些区域是否从投影中缺失)。例如,一些地图将有一些区域被切断等),最后我们得到 NoData 值:,这是没有数据计算的值,或者基本上是数据集中的空值。所有这些数据都很有用,我们将在本文的其余部分看到。但是gdalinfo***确实很有用,因为它提供了一个文件中可用数据的快速摘要,并且不消耗任何处理能力。

2.在栅格中填充 Nodata 值- 对于不同的项目,我们可能不需要 NoData 值,或者可能希望用不同于默认值的值替换 NoData 值。使用 gdal,我们可以遵循 3 个步骤来完成这个任务。首先,我们需要将 NoData 值替换为我们自己的默认值(假设为 0),将所有 NoData 值替换为零(这是一个健全性检查,以确保我们捕获的 Nodata 值不是由元数据指定的),然后我们需要去掉 NoData 标签,因为 NoData 本质上是一个定性标签。我们在这里可以使用两个命令,第一个是用 gdalwarp 来替换值,第二个是用gdal _ translate来移除标签。请注意,这两个命令像大多数其他 gdal 命令一样,会要求您指定一个单独的输出对象。

*#Fill NoData values with zerogdalwarp -srcnodata -3.40282306073709653e+38 dstnodata 0 gpw_v4_population_count_rev11_2015_30_sec.tif population_nodatafilled.tif# Now replace all no_data values with a 0.gdal_translate -b 1 -a_nodata 0 population_nodatafilled.tif population_only_data.tif#Note that the -b indicates the band within the raster where you want to the operation. This would change for multiband rasters.# Now take off the no_data tag itselfgdal_translate -a_nodata none population_only_data.tif population_clean.tif*

3.重新投影栅格- 在比较两个栅格文件时,我们需要确保我们是在比较同类文件,因为网格大小、投影类型或投影大小甚至范围可能存在差异。 gdalwarp 允许我们进行方便的重新投影来标准化光栅文件。因此,继续我们当前的例子,如果我们想用不同的投影类型将数据重新投影到一个更小的网格上,我们将使用下面的 gdalwarp 命令。代码中的注释还提供了我们提供给这个命令的参数的描述。

*#Let's reproject gdalwarp -ts 1440 600 -r average -ot Float32 -t_srs "+proj=longlat +ellps=WGS84" -te -180 -60 180 90 population_clean.tif population_reprojected.tif#Note the following:# -ts is the size of the grid that we want in rows and columns
# -r is specifying the method used to aggregate/dis-aggregate. There #are a number of options available, but the one that makes the most #sense is average since this is basically the sum of the cell values #being aggregated divided by the number of cells.
# -ot is the output type which is set to a Float since this us a #mathematical operation.
# -t_srs is the reprojection type. The one I am specifying here is a #longlat projection using a WGS84 datum.
# -te is the extent itself, which is the extent of the projection. #If you standardize the grid size and the reprojection type, you will automatically standradize the pixel size.* 

现在,你可能已经注意到,你甚至不能打开原来的 tif。不过,在重新投影后,我们实际上可以绘制出光栅,因为尺寸要小得多。

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

这是带有按格网单元划分的人口的变形 tif。

4.转换栅格数据类型- 用户通常会想要转换数据类型。这样做的一个常见原因是空间。例如,地理 IFF 在内存方面很贵,但是。bil 或者。bsq 文件便宜很多。因此,我们可以使用 gdal_translate 轻松地转换它。最棒的是,gdal 会在需要的地方自动创建头文件。

*#Convert tif to bilgdal_translate -of ENVI population_reprojected.tif population_final.bil#The -of specifies the file type we want to convert to.*

5.根据标准替换特定像素值- 现在,用户可能还想用自己的值替换栅格中的特定值。假设我们希望在所讨论的栅格中,具有任意人口值的格网像元的值为 1,而没有人口值的格网像元的值为 0。我们可以使用 gdal_calc.py 来实现这一点。我们只需使用下面的代码来完成这个。请注意,这是一个 python 命令。

*#Replace pixel values based on criteriagdal_calc.py -A population_final.bil --calc='((A>0))*1+((A<=0)*A)' --outfile=population_final_reclass.bil#This will basically replace all values within pixels with 1 and those without values to 0.*

6.光栅到矢量转换(多边形化)——假设我们想要一个根据人口分布的全球地图。也就是说,一张地图向我们展示了人们在世界上实际生活的地方。我们已经有了一个光栅,可以精确地跟踪每个像素。如果我们能结合像素得到一个有意义的地图,那将非常有帮助。这在 gdal 中使用gdal _ polygonize . py很容易实现。这将需要一个栅格,将像素转换为多边形,合并具有相同值(在本例中为 1)的相邻像素,并输出一个全局地图。

*#Convert raster to vector (shape file)gdal_polygonize.py population_final_reclass.bil population_map.shp pop#Note that the pop is the destination column name within the shape file.* 

在这之后,如果我们要绘制出人们居住的世界地图,我们会得到下面的地图。最重要的是,它将对应于我们的光栅的尺寸。

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

全球人口分布图。洞表明那里没有人口居住。

7.合并矢量文件- 现在,假设在上面的地图中,我们也想要在上面的地图中表示世界上不同的国家。使用 ogr2ogr 命令,还可以合并两个矢量文件。假设我们有一个名为 countries.shp 的 shapefile,其中包含国家的实际边界。我们可以将它与现有的形状文件合并,得到一个地图文件,向您显示国家地图,以及国家中没有人居住的地方的洞。

*#First create a file to merge againstogr2ogr -f 'ESRI Shapefile' population_boundaries_merged.shp population_map.shp#Now merge the boundaries shapefile into this oneogr2ogr -f -update -append population_boundaries_merged.shp ccountries.shp -nln merge#This command is updating the population_boundaries_merged.shp by appending a new boundaries file from countries.shp.* 

这是我们从新的人口边界合并中得到的输出

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

我们的合并矢量的输出(形状文件)

这就是了。当必须处理大量 GIS 数据并从中提取有意义的信息时,这些命令是非常有用的备忘单。它们显然可以被修改以适应许多操作。我还在开发一个存储库,将这些命令作为一组正式的 bash 脚本来存放。当前形式的存储库在这里是。一如既往,欢迎任何与此相关的反馈!

原文:https://towardsdatascience.com/git-a-complete-guide-d49675d02a5d?source=collection_archive———42———————–

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

米哈伊尔·瓦西里耶夫在 Unsplash 上的照片

在有多个协作者的项目中,在构建项目时可能会有冲突。 Git & GitHub 为我们提供了这类问题的终极解决方案。Git 简化了与其他人合作的过程,使项目协作变得容易。在本帖中,我们将介绍工作流环境所需的所有主要命令。

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

来源:YouTube, Edureka

在这里,我们将涵盖工作流中使用的所有基本命令

  • 创建存储库
  • 同步存储库
  • 进行更改
  • 并行开发

最初,我们从创建一个存储库开始

git init

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

下一步是将文件从中央或远程存储库拉到本地机器上。

git add origin master "link from your github account"git pull origin master

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

下一步是将创建的文件或开发的代码添加到索引中。这就是所谓的分期。文件被添加到索引中。

索引是一个准备新提交的暂存区。

我们还可以检查状态。 git status 命令显示工作目录和暂存区的状态。

git add "file name"git add -A // to add all files in the foldergit status 

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

随着文件被添加到索引中,Git 的核心( Commit )开始就位。

提交”命令用于将您的更改保存到本地存储库。我们需要显式调用它来查看变化。

git commit -m "your message"git commit -a -m "your message" // to commit all the files

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

到目前为止,我们已经创建了一个库同步库,&,在本地库做了修改。现在下一步是执行并行开发。

要检查所有提交的日志,使用命令 git log

git log

平行开发包括:-

  • 分支
  • 合并
  • 重置基础

让我们继续前进,执行分支

Git分支是你日常开发过程的一部分。 Git 分支实际上是指向您的更改快照的指针。

git branch branchname

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

这里它创建了一个名为**“first branch”的分支。在这个分支中,来自分支的所有文件被复制,并且这些更改可以在创建的分支中使用,而不会影响主**分支。

要访问分支,我们使用命令

git checkout branchname ls // lists the file in the branchcat filename //view the contents of file

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

一旦创建了新的分支,将该分支与主分支合并以生成产品质量代码是非常重要的。

git merge 命令可以让你获得由 git 分支创建的独立开发线,并将它们集成到一个分支中。

git merge firstbranch

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

还有一种方法可以将分支合并到主分支。叫做 Rebase。这样效率更高,因为它用于制作一个线性提交序列。用于清理项目历史 & 减少分支数量。

git rebase branchname

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

请确保创建文件,添加并提交它们,以使更改生效,并保持您的代码无错误运行。

要将代码从本地存储库推送到远程存储库,我们需要首先进行身份验证。为此,我们需要 SSH 密钥。GitHub 使用 SHA-1 算法进行安全哈希运算,生成 40 位十六进制代码。

ssh-keygen

要生成 ssh 密钥,请键入以下命令

cat 'path' // usually id_rsa.pub where the public key is saved

检查您是否已成功验证了命令中的类型

ssh -T git@github.com

会弹出一条消息,提示您已成功通过身份验证。一旦 ssh 密钥生成,您就可以将代码从本地存储库推送到远程存储库。要将文件从本地推送到远程,请在命令中键入

git push origin branchname // to push any respective branchgit push origin master // to push master branch 

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

检查您的 GitHub 库,查看您的 Git 所做的更改

这涵盖了 Git 的基本命令**。**

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

拉胡尔·帕塔克

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

拉胡尔·帕塔克

我希望你们都喜欢这个帖子,并且已经理解了 Git 的基本命令和 Git 的工作流环境。非常感谢:)

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

在 Unsplash 上由Courtney hedge拍摄的照片

原文:https://towardsdatascience.com/git-best-practices-for-sql-5366ab4abb50?source=collection_archive———9———————–

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

安德鲁·西曼在 Unsplash 上拍摄的照片

随着数据科学、数据工程和数据运营团队的规模与日俱增,改善他们的协作方式非常重要。经常可以看到数据工程师和数据分析师在他们的本地机器上存储 SQL 查询、Python 脚本和 Jupyter 笔记本。强烈建议不要发生这种情况。尽管这些人的工作与应用程序开发人员的工作有很大不同,但毫无疑问,他们共享许多用于编写代码的通用工具。此外,在大多数情况下,工作流程也非常相似。

对于协作编写代码的团队来说,最重要的工具是版本控制系统,如 Git、Mercurial 或 Subversion。VCS 已经存在很多年了,但是数据团队仍然需要将它们完全融入到他们的工作流中。在这里,我们将讨论使用 VCS 进行数据工作的巨大好处,以及使用 VCS 进行数据工作的最佳实践。我们走吧。

组织你的代码、查询、工件、S3 桶等。,非常重要。不管你的基础设施是否在云上,你都可以设计方法来组织你的代码。它从获得正确的文件夹结构开始。应用程序的文件夹结构、数据库脚本和 DevOps 脚本都取决于您正在构建的应用程序和使用的工具。

结构很重要,结构很美

版本控制系统提供了一种强大的方法来确保每个人都了解文件夹结构以及代码的组织方式。我在 Medium 上找到两篇非常好的文章,它们都是关于代码组织的,其中一篇是—

[## 关于代码组织的思考

有许多方法可以构造代码。我一直在思考什么是最好的方法。我宁愿到达一个…

medium.com](https://medium.com/@egonelbre/thoughts-on-code-organization-c668e7cc4b96)

还有一个是关于代码组织的策略。这些策略并不以同样的方式应用于数据库脚本、SQL 查询、报告和存储过程,但这个想法是一样的。代码应该以可读、可搜索、可理解和可编辑的方式编写和组织。

始终将所有相关工作推送到远程分支机构,即使工作正在进行中。我强烈推荐使用 git flow——git 开发方法使用三个层次的分支(有一些例外)——主、开发和特性。这里的特性分支可以是任何 CR 或新鲜的需求。

将您的工作推到远程分支,即使它正在进行中

不建议只在本地分支上存储,除非它对其他人来说是无用的,并且是为了您自己的实验和发现。毫不奇怪,本地分支容易丢失数据,因为您的查询不会驻留在宇宙中的其他地方。

这里有一个例子是关于对 SQL Server 脚本使用 Git 的。git SQL——PostgreSQL 数据库的专用源代码控制解决方案。

对于每个合并请求,您应该有一个强制的审阅者。这确保没有任何可疑或不正确的东西进入生产。人工检查和平衡真的很重要。所有主要的版本控制系统都可以选择授权一个或多个人进行评审。

关于这一点,Atlassian 的工程团队有一个完整的帖子。一定要去看看。

[## 为什么代码审查很重要(并且实际上节省了时间!)

敏捷团队是自组织的,技能集跨越整个团队。这部分是通过代码实现的…

www.atlassian.com](https://www.atlassian.com/agile/software-development/code-reviews)

重要的旁注——如果你的团队是评审过程的新手,他们可能会有点暴躁地执行它,因为它看起来像是无用的额外工作,但它几乎不是。从长远来看,额外的复习努力是有回报的。

我再怎么强调拥有最新的试运行环境的重要性也不为过。出于数据库测试的目的,没有必要一直将所有生产数据都放在这里。这实际上取决于您的测试需求。无论数据是否更新,数据库结构(表、视图、过程、函数和其他对象)应该总是同步的。

[## Pulumi -作为代码的现代基础设施

建立服务于静态网站的基础设施通常比看起来更难——但幸运的是,这是一项任务…

www.pulumi.com](https://www.pulumi.com)

像 Terraform 和 Pulumi 这样的 IaC 工具使得在几分钟内繁殖和破坏完整的环境变得非常容易。如果您正在使用所有这些工具,那么创建一个试运行环境应该不难,而且肯定不会花费太多时间。通常在数据仓库的上下文中更容易理解登台,数据仓库是在将数据写入主生产数据仓库之前进行大量预处理的层。但是这里我指的是为一个通常的开发环境准备,其他的是测试、开发和生产。登台通常也被称为预生产,但术语并不严格。

在拥有 VCS 之后,拥有 CI/CD 管道是下一个发展步骤,因为它消除了另一个人为错误可能导致运行错误报告的步骤。本质上,这样的管道将确保您的最新代码被持续集成并自动部署到您的环境中。市场上有一些流行服务的工具可以解决这个问题,比如 Redshift、Tableau、Informatica 和大多数关系数据库。然而,他们中没有一个是完全成熟的,所以要小心这个事实。这里有一篇关于数据库 CI/CD 的好文章—

[## 害怕数据库改变?用 CI/CD | Hacker Noon 控制他们

开发人员经常担心数据库的变化,因为团队中任何人的一个错误都可能导致重大停机,甚至…

hackernoon.com](https://hackernoon.com/database-changes-can-be-scary-how-r1hy2gfe)

拥有 CI/CD 管道还可以减少为测试和开发设置环境和配置的大量时间。您没有必要使用市场上可用的工具之一,因为它们对于数据工程师来说都不如对于开发人员来说那么先进。您可以使用一组脚本和 Lambda 函数为您的用例创建自己的 CI/CD 工具,这些脚本和函数由通过监听 VCS 创建的事件调用。

最后但同样重要的是,为您的组织创建一个查询库是保持理智的最重要的事情之一。这可以防止不同团队再次重写相同的查询。我为几个团队做过,但从未在一个组织中做过。为查询库使用 VCS 很有意义,但是非技术团队可能会发现使用 VCS 很难操作。

Caitlin Hudon 在她的博客上发表了一篇令人惊叹的文章,她谈到了自己的心得,并将这些心得总结为关于 SQL 的真理,如下所示

  • 您总是会再次需要该查询
  • 查询是随着时间变化的活的人工制品
  • 如果对你有用,对别人也有用(反之亦然)

有像 Metabase 这样的开源工具可以帮助你在集合中组织你的查询。如果不是这样,您可以使用您的 BI 工具作为查询库的存储。虽然不是最好的选择,但是如果团队有这样做的动机,这是可行的。

由于 SQL 是应用开发、数据工程、数据科学和数据分析等许多开发领域广泛使用的语言,因此很容易找到不同的使用、存储和维护模式。话虽如此,我们不应该原谅,无论我们遵循什么模式,它都应该让其他人容易理解、探索和处理已经编写好的代码。这是唯一的要求。

原文:https://towardsdatascience.com/git-flow-is-the-source-of-productivity-not-confusion-8abda7c5fb30?source=collection_archive———37———————–

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

Denys Nevozhai 在 Unsplash 上拍摄的照片

开发工作流的架构是基于发布的质量和数量来设计的。这里的质量T5 指的是每个版本中无 bug 或特性集的状态。数量是指开发过程中发布的次数。这种架构通常没有那么复杂;然而,这可能会引起混乱。

基于 git 的开发工作流,也称为 git 流,是构建和发布软件的一系列开发步骤。Git 是一种流行且强大的版本控制技术,被许多公司使用,同时还有其他技术,如 Perforce 或 Mercurial。在本文中,我使用 git-flow 而不是基于 git 的开发工作流,不失一般性。这与这篇帖子中介绍的 GitFlow 不同。

在这里,我解释了两个对创业公司至关重要的 git-flow 架构。了解这些架构的细节可能会解决开发、产品和管理团队之间不必要的冲突。最后,我解释了 git 流的具体细节,这有助于更好地理解它。

请注意,与本文中的内容相比,git-flow 架构可能会变得更加复杂。然而,如果你学习了两个最基本的 git 流的细节,你将很容易理解任何复杂的 git 流。

软件行业中使用了各种各样的 git 流。不过有两个是创业公司常用的。下面,我首先描述两个场景,然后解释适用于这些场景的两个 git 流。

  • **场景 1。**你需要一个频繁发布的快速开发过程。您不希望让把关者签署发布。您接受意外引入主分支的小错误,而不会导致主要功能停止。另外,您不需要控制每个版本中的特性列表。在这种情况下,你必须使用高频率和低质量的架构。
  • **场景二。**你的用户数量相对较多。您必须在每次发布之前广泛验证产品的质量。您希望有一个不断审查产品的团队,以及一个签署发布的把关人。在这种情况下,你必须使用低频和高质量的架构。

把关者是一个定期检查产品质量并决定产品何时发布的人。在大多数创业公司,产品经理都是把关人。

在这个 git-flow 中,只有一个主要的源分支,在那里开发被合并,发布被提取。

在创业的早期阶段,开发工作流程不能因为任何原因而延迟。没有付费客户,主要精力放在开发上。因此,开发团队的目标是只通过自动化测试来检测 bug,并接受在新版本中有一些 bug。由于这个 git-flow 没有签署发布的看门人,bug 只是通过自动化测试溜到发布中。一旦发现这些错误,必须立即修复。

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

没有看门人的 git 流

在这个 git 流中,有两个主要的源分支:主和发布。开发团队在主分支上工作以构建产品,在发布分支上工作以准备发布产品。

发布分支为产品经理创建了一个独立的环境,以便对特性开发和发布质量有更多的控制。在产品团队中,QA 工程师在发布分支上运行手动测试,以发现并报告必须修复并合并到发布分支中的 bug。最后,产品经理作为把关人负责签署发布。

高质量的软件伴随着低频发布的成本。

无论如何,100%的测试覆盖率是不可能的。因此,bug 也可能在这个 git 流的测试过程中溜走。然而,这种架构中的发布质量比我们从前一种架构中得到的更可靠。

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

具有看门人的 git 流

git 流程的第一步是代码变更,即功能开发或缺陷修复。当您想要在代码库中进行更改时,您必须始终创建一个隔离分支,以防止在源分支中进行不必要的更改。

在您完成开发之后,您必须通过一个标准的过程将最近的变更合并到源分支中。 Github 称这个流程为 pull-request, GitLab 称之为 merge-request,两者指的是同一个流程。

在这个过程中,代码更改等待开发人员级别的测试(例如单元、集成和回归测试)和代码审查。有一些应用程序如 Hound 也使代码审查过程部分自动化。如果代码更改可以通过测试并获得所需的批准,它们将被合并到源分支中。而且,发展还在继续!

质量软件是关于测试和开发之间的平衡。在运行测试的 git 流中有两个关键点。首先,在将代码变更合并到源分支(例如,主版本或发布版本)之前,其次,在将产品交付给客户之前。

知道了软件测试的重要性,问题是我们有多少类型的测试。测试可以是自动的,也可以是手动的。自动化测试由 DevOps 解决方案如 CircleCI 和测试框架如 PyTest 以完全自动化的方式执行。手动测试由产品团队执行,旨在覆盖自动化测试未测试的零件。

在这里,我根据软件测试为开发工作流提供的高层次价值对软件测试进行分类。有两种不同类型的测试:开发者级和用户级。

  • 开发人员级别的测试比如单元、集成和回归测试评估代码的健全性。它们在 git 流的每次提交之后、构建过程之前执行。这些测试是完全自动化的。其目标是确保代码的健全性加快开发的步伐。开发人员是工作流中这些测试的所有者。
  • 用户级测试如验收和性能测试评估整体解决方案。它们在部署后执行。这些测试是手动和自动的。它的目标是模拟用户体验从整体上衡量服务质量。在大多数创业公司中,产品经理是工作流中这些测试的所有者,因为这些测试大多是面向用户的。

在大多数情况下,您必须非常依赖自动化测试来检查健全性和质量。然而,这并不意味着在这个过程中不能使用手工测试。

通过运行自动化过程在每次提交时集成和验证代码库的实践被称为持续集成

构建指的是编译和打包源代码及其工件的过程。构建步骤的输出是一个二进制文件,可以部署到云上。

**举例。**当您使用 Docker 构建二进制文件时,构建过程的输出被称为 Docker 映像,它是构建它的虚拟机环境的快照。

这些二进制文件必须存储在二进制库管理器上,例如 JFrog 或 DockerHub 。当您将它们存储在存储库管理器中时,您必须对它们进行标记,以便可以轻松地搜索和检索它们,尤其是当您想要自动部署它们时。例如,您可以使用 git 创建的 commit ID 来标记二进制文件,因为它确切地显示了解决方案是在哪里构建的,并且它作为惟一的标识符工作。

从每次提交构建和存储二进制解决方案的实践被称为连续交付

部署是指所有构建工件在云或服务器上收集、执行和编排的过程,使用的编排器有 Mesos 、 Kubernetes 或 Docker Swarm 。

**举例。**当您使用 Docker 部署解决方案时,会创建一个 Docker 容器,它可以在您的本地机器上运行,也可以在云基础架构(如 Amazon EC2)的计算节点上运行。

最佳实践是为每个主和发布分支指定一个云环境。主分支和发布分支的云环境分别被称为开发(dev)和生产(prod)。在更复杂的工作流中,有一个登台环境超出了本文的范围。

如果使用微服务架构,可以独立部署前端、后端、数据库等每个微服务。微服务的集合被编排来构建主服务。微服务架构允许您独立、高效地测试、维护和部署松散耦合的服务。没有必要说您需要正确地配置这个编排,这也超出了本文的范围。

在没有任何干预的情况下持续部署解决方案的实践被称为持续部署

您可以基于行业需求、公司阶段或客户期望使用不同的 git-flow 架构。在这篇文章中,我描述了每个人都必须知道的拥有一个高效团队和减少不必要冲突的要点。因此,您应该基于您的需求采用 git-flow,并使用它,直到它在您的团队中变得自然。

如果你喜欢这个帖子,想支持我…

  • 跟我上
  • 亚马逊 上查看我的书!
  • 成为 中的一员
  • 连接上Linkedin
  • 关注我 推特

[## 通过我的推荐链接加入 Medium—Pedram Ataee 博士

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

pedram-ataee.medium.com](https://pedram-ataee.medium.com/membership)

赞(0)
未经允许不得转载:AED除颤器产品网 » 低频笔记本为什么TowardsDataScience 博客中文翻译 2020(四百一十)