全栈深度学习步骤和工具
我从一门关于全栈深度学习的课程中学到的总结
Photo by Fatos Bytyqi on Unsplash
大家好,一切都好吗?今天,我要写一篇文章,谈谈我从看到全栈深度学习(FSDL)2019 年 3 月课程中学到了什么。这是一个很棒的在线课程,它告诉我们用全栈深度学习来做项目。我最喜欢的是他们如何教我们一个项目,不仅教我们如何创建深度学习架构,还告诉我们在做深度学习项目时应该关注的软件工程内容。
Source : https://fullstackdeeplearning.com/
当我们做一个深度学习项目时,我们需要知道我们应该使用哪些步骤和技术。我们需要知道这些来提高项目的质量。这将是非常有用的,特别是当我们想在一个团队中做项目的时候。当团队协作时,我们不希望项目变得混乱。
本文将根据 FSDL 课程重点介绍全栈深度学习项目每个步骤中的工具和做什么(加上一些我所知道的工具的补充)。将有一个简短的描述在每个步骤做什么。本文将只展示我在那门课程中注意到的工具。本文重点介绍的编程语言是 Python。
2020 年 7 月 12 日更新:可在此访问全栈深度学习课程https://course.fullstackdeeplearning.com/。来看看吧:)。
概述
- 步伐
- 规划和项目设置
- 数据收集和标记
- 代码库开发
- 培训和调试
- 部署
- 结论
- 编后记
步伐
Figure 1 : Step on doing Full Stack Deep Learning project
这些是 FSDL 课程告诉我们的步骤:
- 规划和项目设置
- 数据收集和标记
- 培训和调试
- 部署和测试
其中的每一步都可以返回到上一步或前一步(不是瀑布)。课程还建议我们迭代地进行这个过程,这意味着我们从小的进步开始,并不断地提高它。例如,我们开始使用小数据的简单模型,然后随着时间的推移改进它。
规划和项目设置
这一步将是你要做的第一步。我们需要说明项目要做什么和项目的目标。我们还需要陈述项目的度量和基线。该步骤的子步骤如下:
Figure 2 : Substeps of planning and project setup
定义项目目标
Photo by Patrick Perkins on Unsplash
首先,我们需要定义这个项目要做什么。选择制作什么有两个考虑因素。它们是影响力和可行性。
我们需要确保这个项目是有影响力的。你的应用程序的价值是什么,我们希望在这个项目中。您需要回答的两个问题是
- 哪里可以利用廉价预测的优势?
- 您可以在哪里自动化复杂的手动软件管道?
对于我们选择的应用程序产生的廉价预测,我们可以产生巨大的价值,从而降低其他任务的成本。
可行性也是我们需要注意的。由于深度学习关注数据,我们需要确保数据可用,并符合项目要求和成本预算。
Figure 3 : The relation of project cost and required accuracy
在需要设定最低目标时,我们需要考虑准确性要求。因为项目成本往往与项目成本呈超线性相关,所以我们需要考虑我们的需求和我们可以承受的最大成本。还要考虑到可能会有一些情况,其中预测失败并不重要**,以及一些情况,其中模型必须具有尽可能低的误差。**
最后,需要看到问题难度。项目有多难。为了衡量难度,我们可以看一些类似问题的已发表的作品。比如在 ARXIV 中搜索一些论文或者任何与项目有类似问题的会议。有了这些,我们就可以把握项目的难度了。
有关评估项目可行性的更多详细信息,请参见图 4。
Figure 4 : Assessing feasibility of ML project
选择指标
Figure 5 : example of metrics. src: https://towardsdatascience.com/precision-vs-recall-386cf9f89488
度量是对系统性能或效率的特定特征的测量。
由于机器学习中的系统在优化单个数字上工作得最好,所以我们需要定义一个满足单个数字要求的度量,即使可能有许多度量需要计算。对于一个我们需要使用很多指标的问题,我们需要选择一个公式来组合这些指标。有:
- 简单平均/加权平均
- 阈值 n-1 度量,评估第 n 个度量
- 特定于领域的公式(例如地图)
以下是如何结合两个指标(精确度和召回率)的一些例子:
Figure 6 : Combining Precision and Recall
选择基线
Photo by Nik Shuliahin on Unsplash
在我们选择了度量标准之后,我们需要选择我们的基线。基线是一个预期值或条件,绩效将根据它来衡量,以便与我们的工作进行比较。它将给我们一个预期模型性能的下限。基线越紧,基线就越有用。
Figure 7 : Baseline
那么为什么基线很重要呢?为什么不跳过这一步?我们可以通过与基线比较来衡量我们的模型有多好。通过了解模型的好坏,我们可以选择下一步要调整的地方。
要寻找基线,您可以使用几个来源:
- 外部基线,您从业务或工程需求中形成基线。您也可以使用发布的工作结果作为基线。
- 内部基线,使用脚本基线或创建简单的机器学习(ML)模型,如使用基于标准特征的单词或使用简单模型。
基线是根据你的需要选择的。例如,如果您想要一个超越人类系统,您需要添加一个人类基线。
设置基本代码
创建您的代码库,这将是如何做进一步的核心步骤。代码库中的源代码可以根据项目当前要做的事情的当前需要来开发。例如,如果当前步骤是收集数据,我们将编写用于收集数据的代码(如果需要)。我们通常会来回进行这一步。
我们应该确保代码库中的源代码是可复制的和可扩展的,尤其是在团队中做项目的时候。要做到这一点,你需要使用正确的工具。这篇文章稍后会告诉我们。
数据收集和标记
Figure 8 : Tweet about poll time spent as data scientist
在我们定义了我们将在项目中创建什么、基线和度量标准之后,最痛苦的步骤将开始,数据收集和标记。
大多数深度学习应用都需要大量需要标注的数据。时间会大部分消耗在这个过程中。虽然您也可以使用公共数据集,但是我们项目所需的带标签的数据集通常是不公开的。
下面是子步骤:
Figure 9 : substeps of data collection and labeling
战略
Photo by Campaign Creators on Unsplash
我们需要计划如何获得完整的数据集。有多种方法可以获得数据。你应该考虑的一点是,数据需要根据我们想要在项目中创建的内容进行对齐。
吸收
如果获取数据的策略是通过互联网抓取一些网站,我们需要使用一些工具来完成。Scrapy 是对项目有帮助的工具之一
刺儿头
Source : http://rafaelsilva.com/for-students/directed-research/scrapy-logo-big/
这是一个 Python scrapper 和数据爬虫库,可以用来抓取和抓取网站。它可用于收集网站上的图像和文本等数据。我们也可以用这个从必应、谷歌或 Instagram 上删除图片。要使用这个库,我们需要学习也可以在它的网站上找到的教程。别担心,这不难学。
在我们收集数据之后,你需要考虑的下一个问题是把你收集的数据发送到哪里。因为你不是一个人在做这个项目,所以你需要确保每个人都可以访问这些数据。此外,我们需要选择将要保存的数据的格式。当我们想把数据保存在云中时,下面是一个解决方案。
对象存储
对于存储图像和视频等二进制数据,您可以使用云存储,如 【亚马逊 3】或等,通过 API 在文件系统上构建对象存储。我们还可以在服务中内置版本控制。更多详情请见他们的网站。需要付费才能使用(也有免费计划)。
数据库
Source : https://aws.amazon.com/rds/postgresql/
数据库用于结构化数据的持久、快速、可伸缩的存储和检索。数据库用于保存经常被连续访问的非二进制数据。您将在这里保存元数据(标签、用户活动)。你可以使用一些工具。推荐的一个是PostgreSQL。
它可以存储结构化的 SQL 数据库,也可以用来保存非结构化的 json 数据。它仍在积极维护中。
数据湖
Figure 10 : Data lake pattern
当您的数据是来自多个来源和多种格式的非结构化聚集,并且转换成本很高时,您可以使用数据湖。基本上,你把所有的数据都转储到它上面,它就会把这些数据转化成特定的需求。
Figure 11 : Amazon redshift
亚马逊红移是解决数据湖的一个可行方案。
当我们进行训练过程时,我们需要将您的模型所需的数据移动到您的文件系统中。
数据应该版本化以确保进度是可恢复的。版本控制不仅适用于源代码,也适用于数据。在讨论完数据标记之后,我们将深入研究数据版本控制。
数据标记
Figure 12 : Data labeling solution
在这一节中,我们将知道如何标记数据。您可以使用以下资源来标记数据:
- 自己雇佣注释者
- 众包(土耳其机器人)
- 使用figure eightscale . ailabel box等全业务数据标注公司
如果您希望团队对其进行注释,您可以使用以下几个工具:
Source : dataturks.com
在线协作注释工具 Data Turks。对于免费计划,它被限制为 10000 个注释,并且数据必须是公开的。它为 NLP(序列标记、分类等)和计算机视觉(图像分割、图像包围盒、分类等)的一些任务提供了一些注释工具。FSDL 的课程用这个作为标记的工具。
Source : https://github.com/chakki-works/doccano
NLP 任务的免费开源注释工具。它还支持序列标记、分类和机器翻译任务。也可以设置成一个协作注释工具,但它需要一个服务器。
Source : https://github.com/opencv/cvat
用于计算机视觉任务的离线注释工具。它是由英特尔作为开源软件发布的。它可以标记边界框和图像分割。
公共数据集
如果您想搜索任何公共数据集,请参见 Stacy Stanford创建的这篇文章以了解任何公共数据集的列表。
机器学习和数据科学最好的数据集是什么?经过数小时对数据集的审查,我们已经…
medium.com](https://medium.com/towards-artificial-intelligence/the-50-best-public-datasets-for-machine-learning-d80e9f030279)
它仍在积极地更新和维护。
数据版本化
关于如何进行数据版本控制,有几个层次:
- 0 级:未版本化。我们不应该尝试这样做。部署需要版本化。如果数据没有版本化,那么部署的模型也没有版本化。如果我们使用未版本化的,会有一个问题,那就是无法回到以前的结果。
- 一级:通过快照版本化。我们存储不同版本上使用的所有数据。我们可以说它有点粗糙。我们仍然需要像编写代码一样简单地编写数据版本
- 级别 2 :数据被版本化为代码和资产的混合。沉重的文件将被存储在其他服务器(如亚马逊 S3),那里有一个 JSON 或类似类型的相关元数据的参考。相关元数据可以包含标签、用户活动等。JSON 文件将被版本化。JSON 文件会变得很大。为了更简单,我们可以使用 git-lfs 来版本化它。这个水平做项目应该是可以接受的。
- 第三级:使用专门的软件解决方案对数据进行版本控制。如果你觉得 2 级对你的项目来说还不够,可以这样做。数据版本化的工具之一是 DVC 。
Source : https://dvc.org/
DVC 的建立是为了让 ML 模型可以共享和复制。它旨在处理大型文件、数据集、机器学习模型、指标和代码。这是一个为 ML 模型及其数据集版本化的解决方案。我们可以将版本控制连接到云存储中,如亚马逊 S3 和 GCP。****
代码库开发
当我们做项目时,期望在做好每一步的基础上编写代码。当我们写代码时,可再现性是我们必须关心的一件事。我们需要确保我们的代码库具有可重复性。
在我们深入工具之前,我们需要选择我们代码库的语言和框架。
程序设计语言
Source : https://www.python.org/
对于选择编程语言,我更喜欢 Python 而不是其他。Python 拥有最大的数据科学社区,非常值得开发。流行的深度学习软件也大多由 Python 支持。这种语言也很容易学。
深度学习框架
Figure 13 : DL Framework production and development diagram
对于深度学习框架,您可以做出几种选择。Python 中最流行框架是 Tensorflow、Keras 和 PyTorch。用你喜欢的那个。
为了更容易调试,可以使用 PyTorch 作为深度学习框架。 Keras 也很好用,有很好的 UX。它是 Tensorflow、Theano 和其他深度学习框架的包装器,使其更易于使用。 Tensorflow 如果你喜欢他们的环境也是一个选择。Tensorflow 能够做出明智的决策,是因为它的社区提供了支持,并且拥有出色的部署工具。
不要担心部署。有一种软件可以将模型格式转换成另一种格式。例如,您可以将由 Pytorch 生成的模型转换为 Tensorflow 。我们稍后会看到这一点。
我认为选择语言和框架的因素是它背后的社区有多活跃。因为它将产生大量可以集成到其中定制包。
版本控制
Source : https://www.reddit.com/r/ProgrammerHumor/comments/72rki5/the_real_version_control/
做项目的时候很重要的一件事就是版本控制。当我们做项目时,我们不希望当有人意外破坏我们的代码库时无法重做。我们还需要跟踪每次更新的代码,以查看其他人更新了哪些更改。如果我们不使用一些工具,这是不可能的。 Git 是做这件事的解决方案之一。
好的,我们知道版本控制很重要,尤其是在协作工作中。目前, git 是做版本控制的最佳方案之一。它也可以用来和你团队中的其他人分享你的代码。没有这一点,我不认为你能在项目中与其他人合作得很好。
Source : GitHub
有几个可以使用 Git 的服务,比如 GitHub 、 BitBucket 和 GitLab 。
代码审查
Figure 14 : Code Review
还有一件重要的事情应该做,那就是代码审查。代码审查是对通过单元或集成测试的不正确代码或质量差的代码的早期保护。当您进行协作时,让某人检查您的代码并对其进行评审。大多数版本控制服务应该支持这个特性。
项目结构
Figure 15 : Example of folder structure. Source : https://drivendata.github.io/cookiecutter-data-science/
当我们第一次创建项目结构文件夹时,我们一定想知道如何创建文件夹结构。然后,我们放弃,把所有的代码放到根项目文件夹里。给出质量差的代码是一种不好的做法。
我发现的解决方案之一是烹饪数据科学。它给出了一个模板,我们应该如何创建项目结构。它也给出了如何给创建的文件命名,以及你应该把它放在哪里。一定要用它来使你的代码库不会变得凌乱。考虑阅读网站来使用它。
集成开发环境(IDE)
IDE 是可以用来加速编写代码的工具之一。它集成了对开发有用的工具。有几种 ide 可供您使用:
Source : http://www.jetbrains.com/pycharm
JetBrains 发布的 IDE。该 IDE 不仅可以用于深度学习项目,还可以用于其他项目,如 web 开发。Pycharm 具有自动代码完成、代码清理、重构功能,并与其他工具集成,这对于使用 Python 开发非常重要(首先需要安装插件)。它有很好的调试环境。它还可以运行笔记本(。ipynb)文件。
Source : https://github.com/jupyterlab/
Jupyter Lab 是一个易于使用的 IDE,交互式数据科学环境工具,它不仅可以用作 IDE,还可以用作演示工具。用户界面(UI)最好把这个作为一个可视化工具或者一个教程工具。我们可以用 markdown 格式制作文档,也可以在笔记本上插入图片。
就我个人而言,我使用 Pycharm 编写源代码。当我创建一些教程来测试一些东西或进行探索性数据分析(EDA)时,我会使用 Jupyter Lab 来完成。只是不要把你的可重用代码放到你的笔记本文件里,它的可复制性很差。
连续累计
“嘿,什么鬼东西!?为什么我无法在此版本中运行培训流程”-A
“Idk,我只是推我的代码,我认为它在我的笔记本上工作…等一下…我在这条线上得到一个错误…我没有将所有代码复制到我的实现中”——B
“那你为什么推!?!?"—答
在我们将我们的工作推送到存储库之前,我们需要确保代码确实有效并且没有错误。为此,我们应该在将模型和代码推送到存储库之前测试代码。必须完成单元或集成测试。
单元测试测试代码应该通过的模块功能。集成测试测试模块的集成。它会检查你的逻辑是否正确。这样做是为了在做实验前发现你的错误。
Source : circleci.com
CircleCI 是做持续集成的解决方案之一。它可以进行单元测试和集成测试。它可以使用 Docker Image(我们稍后将深入讨论)作为环境的容器化(我们应该使用它)。可以做到这一点的类似工具有和TravisCI**。**
如果您想用 Python 测试代码,可以使用以下几个库:
[pipenv check](https://github.com/pypa/pipenv)
: 扫描我们的 Python 包依赖图,寻找已知的安全漏洞
[pylint](https://github.com/PyCQA/pylint)
:对 Python 文件进行静态分析,并报告样式和 bug 问题。
[mypy](https://github.com/python/mypy)
:对 Python 文件进行静态分析检查
[bandit](https://github.com/PyCQA/bandit)
:执行静态分析,查找 Python 代码中常见的安全漏洞
[shellcheck](https://github.com/koalaman/shellcheck)
:查找 shell 脚本中的错误和潜在错误(如果使用的话)
[pytest](https://github.com/pytest-dev/pytest)
:用于进行单元和集成测试的 Python 测试库
将它们写入您的 CI,并确保通过这些测试。如果失败了,那么重写你的代码,并知道代码中的错误在哪里。
这是一个在深度学习系统上编写单元测试的例子。
Figure 16 : Example of doing unit test in ML experiments
海关环境和集装箱化
“嘿,我已经在我的电脑上测试过了,效果很好”
“什么?不,老兄,它在我的电脑上失败了?它是如何在你的电脑上工作的!?"
有过这种经历吗?我有。造成这种情况的原因之一是你的工作环境与其他人的不同。例如,你在 Windows 上工作,另一个在 Linux 上工作。你的库和他们的库的差异也可能是问题的导火索。
为了解决这个问题,您需要在一个名为requirements.txt
的文本中显式地编写您的库依赖关系。然后运行 Python 虚拟环境如[pipenv](https://github.com/pypa/pipenv).
这将解决库依赖。尽管如此,它仍然不能解决团队的环境和操作系统的差异。要解决,可以用 Docker。
Source : docker.com
Docker 是一个可以设置成虚拟环境的容器。我们可以安装我们在 Docker 中设置的库依赖项和其他环境变量。有了这个,你就不用担心会因为环境的不同而产生误差。当我们想要部署应用程序时,Docker 也是一个重要的工具。它会强制部署的地方使用期望的环境。
为了共享容器,首先,我们需要将创建环境的所有步骤写入 Dockerfile ,然后创建一个 DockerImage 。可以推入 DockerHub 中。然后另一个人可以从 DockerHub 中拉出 DockerImage 并从他/她的机器上运行它。
要了解关于 Docker 的更多信息,有一篇由 Preethi Kasireddy 撰写的初学者友好的好文章。
**** [## 对初学者友好的容器、虚拟机和 Docker 介绍
如果你是一个程序员或技术人员,你可能至少听说过 Docker:一个打包、运输…
medium.freecodecamp.org](https://medium.freecodecamp.org/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b)
图 17 是一个如何创建 Dockerfile 文件的例子。
Figure 17 : Example of Dockerfile****
培训和调试
现在我们正处于训练和调试阶段。这是你做实验和制作模型的步骤。这一步的子步骤如下:
FIgure 18 : Substeps Training and Debugging
从简单开始
使用您选择的深度学习框架,用简单的架构对神经网络进行编码(例如:具有 1 个隐藏层的神经网络)。然后使用默认的超参数,如无正则化和默认的 Adam 优化器。如果需要,不要忘记规范化输入。最后,使用模型的简单版本(例如:小数据集)。
实施和调试
实现神经网络,有几个技巧,你应该按照顺序。
- 让模型运行
我们应该做的是让你用你的 DL 框架创建的模型运行。这意味着要确保在更新权重的过程中没有异常发生。
经常发生的异常如下:
- 形状不匹配
- 铸造问题
- 被遗忘
2。超配单个批次
之后,我们应该对单个批次进行过度拟合,以观察模型是否可以学习。过度拟合意味着我们根本不关心验证,而是关注我们的模型是否能够根据我们的需要进行学习。我们这样做,直到模型的质量变得过拟合(~100%)。以下是此过程中出现的常见问题:
- 错误上升(可能由以下原因引起:学习率过高、错误的损失函数符号等)
- 错误爆发/变得异常(可能由以下原因引起:数值问题,如对数运算、经验或高学习率等)
- 错误振荡(可能由以下原因引起:损坏的数据标签、学习率过高等)
- 错误平台(可能由以下原因引起:学习率太低、数据标签损坏等)
3。与已知结果比较
在我们确保我们的模型训练良好之后,我们需要将结果与其他已知结果进行比较。下面是已知结果的层次结构:
Figure 19 : Hierarchy of known results
我们这样做是为了确保我们的模型能够真正学习数据,并看到模型在学习任务的正确轨道上。我们将需要不断迭代,直到模型能够达到预期的性能。
评价
我们将通过计算误差来计算偏差-方差分解,该误差是用我们当前最佳模型的所选度量来计算的。偏差-方差分解的计算公式如下:
其中:
**irreducible error = the error of the baseline
bias = training error - iredducible error
variance = validation error - train error
validation overfitting = test error - validation error**
下面是一些实现偏差-方差分解的例子。
Figure 20 : Breakdown of test error
通过了解偏差、方差和验证过拟合的值,它可以帮助我们选择下一步要改进的内容。
如果模型已经满足了需求,那么就部署模型。如果没有,那么通过使用评估的结果来解决是改进数据还是调整超参数的问题。在预测某组实例时,考虑看看模型有什么问题。迭代直到满足需求(或者放弃)。
这里有一些工具对这一步很有帮助:
版本控制
又来了,版本控制。是的,我们对代码和数据进行了版本控制,现在是对模型进行版本控制的时候了。以下是可用于版本控制的工具:
Source : Wandb.com
模型结果的版本控制。它有很好的用户界面和体验。然后,它可以保存模型上使用的参数、模型结果的样本,并且还可以保存将被版本化的模型的权重和偏差。此外,它可以实时可视化模型的结果。此外,我们还可以将模型恢复到之前的运行(也可以将模型的权重更改为之前的运行),这使得模型的重现更加容易。它可以随时运行。它还可以很好地扩展,因为它可以与 Kubeflow (Kubernetes for ML,它为容器化的应用程序管理资源和服务)集成。
无损耗
Source : Losswise.com
它也是对模型进行版本控制的版本控制。它还实时保存用于实验的模型和超参数的结果。它还可以估计模型何时完成训练。每当您将代码推送到存储库(在指定的分支上)时,它都会训练模型。它还可以实时显示模型的结果。
超参数优化
当优化或调整学习率这样的超参数时,有一些库和工具可以用来做这件事。有:
对于 Keras DL 框架: Hyperas ,
对于 Pytorch DL 框架:超搜索
其他:远视
WANDB 还提供超参数优化解决方案。不过,您需要先联系他们才能启用它。
部署
最后一步将是这一步。子步骤如下:
Figure 21 : Substeps of Deploying & Testing
试生产意味着您将通过在选定的最终用户群中测试来验证系统。通过这样做,我们希望能够在全面部署之前获得系统的反馈。对于测试,除了单元测试和集成测试之外,你还可以对你的系统进行一些测试,例如:渗透测试、压力测试等等。
在我们确定模型和系统已经满足需求之后,就该部署模型了。首先,有几种部署模型的方法。有:
- Web 服务器部署
- 嵌入式系统和移动设备
Web 服务器部署
如果我们想部署到网站上,我们可以使用几种策略。在此之前,我们需要确保我们创建了一个 RESTful API,用于响应 HTTP 请求(GET、POST、DELETE 等)的预测。这些战略如下:
- 将代码部署到云实例。通过添加实例进行缩放。
- 将代码部署为容器(Docker),通过编排进行扩展。应用程序代码被打包到 Docker 容器中。例子:AWS Fargate。
- 将代码部署为“无服务器功能”。应用程序代码被打包成 zip 文件。无服务器功能将管理一切。例如:即时扩展、每秒请求数、负载平衡等。它不同于上述两个,无服务器功能只支付计算时间,而不是正常运行时间。例如: AWS Lambda ,Google Cloud Functions,Azure Functions
Figure 22 : Amazon Lambda
嵌入式系统和手机
Source : https://developers.googleblog.com/2017/11/announcing-tensorflow-lite.html
要部署到嵌入式系统或手机上,我们可以使用tensor flow Lite。与 Tensorflow 相比,它体积更小,速度更快,依赖性更小,因此可以部署到嵌入式系统或移动设备中。不幸的是,它的操作数有限。
Source : https://devblogs.nvidia.com/speed-up-inference-tensorrt/
还有一个工具叫 TensorRT 。它优化了用于预测的推理机,从而加快了推理过程。它是基于 CUDA 构建的。在嵌入式系统上,NVIDIA Jetson TX2 可以很好地配合它。
在苹果上,有一个叫做 CoreML 的工具,可以更容易的将 ML 系统集成到 IPhone 上。还有类似的工具叫做 MLKit ,可以用来帮助将 ML 系统部署到 Android 上。
交换
Source : https://onnx.ai/
ONNX (开放神经网络交换)是深度学习模型的开源格式,可以很容易地将模型转换成支持的深度学习框架。ONNX 支持 Tensorflow、Pytorch 和 Caffe2。它可以混合不同的框架,这样适合开发的框架(Pytorch)不需要擅长部署和推理(Tensorflow / Caffe2)。
监视
Figure 23 : Example of monitoing in AWS
如果把应用部署到云服务器,应该有监控系统的解决方案。当事情出错时,我们可以通过在监控系统中写入相关记录来设置警报。有了这个,我们就知道模型可以改进什么,并解决问题。
结论
在这篇文章中,我们根据 2019 年 3 月的 FSDL 课程,了解了做全栈深度学习的步骤。首先,我们需要设置和计划项目。在这一步中,我们需要定义目标、指标和基线。然后,我们收集数据并用可用的工具对其进行标记。在构建代码库的过程中,有一些工具可以保持上面描述的项目的质量。然后我们通过测试和调试进行建模。在模型满足需求之后,我们最终知道了将应用程序部署和监控到所需界面的步骤和工具。
编后记
Photo by Joshua Hoehne on Unsplash
就是这样,我的关于我所学课程介绍的工具和步骤的文章。我为什么写这篇文章?我发现我的大脑可以很容易地记住并让我更好地理解我需要的东西的内容。此外,在我写作的过程中,我有机会复习课程内容。此外,它可以让我分享我的知识给每个人。我很乐意把好的东西分享给大家:)。
在学习那门课程的过程中,我获得了很多新的东西,尤其是关于深度学习堆栈的工具。我还知道如何在深度学习中排除模型故障,因为它不容易调试。它还教会了我进行全栈深度学习的工具、步骤和技巧。总而言之,这是一门很棒的课程,而且可以免费使用。所以我推荐给任何想学习深度学习做项目的人。
说实话,我还没有尝试过本文所写的所有工具。本文介绍的工具及其描述摘自 FSDL 课程和我读过的一些资料。你可以告诉我是否有错误的信息,尤其是关于工具的。
因此,
我欢迎任何可以提高我自己和这篇文章的反馈。我正在学习写作,学习变得更好。我感激能让我变得更好的反馈。确保以适当的方式给出反馈😄。
在我的下一篇文章中再见。
Source : https://cdn.pixabay.com/photo/2017/07/10/16/07/thank-you-2490552_1280.png
来源
试点测试是在实时操作条件下验证系统的一个组件或整个系统。它…
www.guru99.com](https://www.guru99.com/pilot-testing.html) [## 把你的数据扔进湖里
许多企业在不同的孤岛中组织数据,这使得询问需要数据的问题变得更加困难…
medium.com](https://medium.com/data-ops/throw-your-data-in-a-lake-32cd21b6de02)
由数据厨房
https://docs . Google . com/Presentation/d/1 yhlpvphus 2 kgi 5 zwo 0 su-pku 3 gimak 3 its 38 z-B5Gw/(ICLR 2019 关于再现性的演讲由 Joel Grus )。图 14 和 16 取自这个来源。
面向熟悉深度学习基础、寻求扩展技能的软件开发人员的实践计划。
fullstackdeeplearning.com](https://fullstackdeeplearning.com/)
其他数字取自这一来源。****
全栈开发教程:将 AWS Lambda 无服务器服务集成到 Angular SPA 中
Photo by Stephen Dawson on Unsplash
(这篇文章也可以在我的博客中找到)
这篇文章是我的全栈开发教程系列的最后一篇文章。在这篇文章中,我们将把后端 Lambda REST API 集成到我们之前开发的 Angular App 中。以前的帖子是在 Angular SPA 上可视化交易数据和在 AWS Lambda 上运行无服务器 REST API 提供交易数据。
更新 angular 服务,从 Lambda 调用 REST API
首先,我们需要更新 SPA 中的服务,从 Lambda 调用 REST API,而不是返回哑数据。注意,我们已经定义了一个主题,以便图表组件可以被订阅。REST API 调用完成后。它发出历史数据。从图表组件中,它将接收该响应并对其进行一些业务逻辑处理。
更新图表组件以使用 Lambda 中的历史数据来可视化图表。在这个 typescript 中,我们从 StockDataService 订阅了 Observerable。然后,它将 Lambda 的响应分配给图表。
发布 web 应用
现在,我们可以为您的应用程序创建一个公共网站。首先,我们需要为 angular 应用程序部署构建生产代码。从终端运行以下命令。
ng build --prod
此命令将导致 dist 文件夹,其中包含此 SPA 的所有静态文件。我们将部署到 S3 建立一个公共网站。
创建一个 S3 存储桶
创建新的存储桶。除非您购买了自己的域名并为您的 web 应用程序设置了域名,否则您的域名将成为网站 url 的一部分。
接受所有默认选项并创建它。然后选择新创建的存储桶,单击 permisions。在阻止公共访问中,我们必须取消选中阻止“通过新公共存储桶策略授予的对存储桶和对象的公共访问”和“通过任何公共存储桶策略阻止对存储桶和对象的公共和跨帐户访问”,以便公共用户可以访问此 web 应用程序。
我们还需要添加一个存储桶策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[YOUR_BUCKET_NAME]/*"
}
]
}
上传内容
将 dist/stock-app 文件夹中的文件上传到存储桶
启用虚拟主机
打开属性,选择“静态网站托管”。为索引 documemt 键入 index.html,然后选中“使用此存储桶托管网站”。
现在,你应该可以在 http:// < bucket_name >开你的 SPA 了。. Amazon AWS . com/,我这里是 http://stock-spa-jli.s3-website-us-west-2.amazonaws.com/。但是,你会遇到一个问题。您看不到任何数据。那是因为我们的 REST API 和 API 网关不允许 CORS。我们将明确地启用它。
启用 CORS
接下来,我们需要在 API 网关中启用 CORS,以便 Lambda 中的 API 可以接受跨源请求。
在 AWS 控制台中打开 API 网关服务,并为我们在上一篇文章中开发的 Lambda 选择网关。选择要启用 CORS 的端点。为简单起见,我选择任意。然后在操作下拉列表中,选择启用 CORS 并确认。
验证
现在,我们都准备好了。您的 Lambda 应该能够为您的 SPA 提供数据。回到你在 S3 的网站。你会看到间谍的股票图表。
仅此而已。我们用 Angular 开发了一个简单的全栈 web 应用,使用无服务器框架,AWS Lambda,API gateway,S3。它是用云编队部署的。几乎所有后端 AWS Lambda 都由无服务器框架轻松处理。
建议读取:
AWS Lambda 在行动:事件驱动的无服务器应用第 1 版
我的旧帖子:
从 CRUD web 应用开发到语音助手中的 SDE——我正在进行的机器学习之旅
全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据
全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据
无服务器计算是一种云计算 执行模式,云提供商运行服务器,动态管理机器资源的分配。定价基于应用程序消耗的实际资源量,而不是预先购买的容量单位。—维基百科
Photo by Anthony Cantin on Unsplash
(这篇文章也可以在我的博客中找到)
这是我的全栈开发教程系列的第二篇文章。上一篇文章— 全栈开发教程:在 Angular SPA 上可视化交易数据
无服务器计算的优势在于它可以在需要时执行。价格完全取决于使用情况。开发者无需维护服务器、修补安全漏洞、升级软件等。
亚马逊的 AWS 是一个事件驱动的无服务器计算平台。它拥有强大的运行时支持,包括 Node.js、Python、Java、Go、Ruby 和 C#。作为一个事件驱动的平台,Lambda 非常适合处理事件变化的场景,如“文件正在上传到 S3”,“数据库正在更新”,“物联网中接收到传感器数据”等。
在本教程中,我们将利用无服务器框架为本教程中的股票应用程序创建一个无服务器 REST API。无服务器框架是一个开源框架,帮助在包括 AWS Lambda 在内的多个云环境中开发和部署无服务器功能。
设计我们的端点
遵循 REST 实践,让我们定义我们的端点/价格?ticker= <ticker_name>。和响应将如下所示,以在 UI 中显示图表。</ticker_name>
[
{
"name": "Ticker",
"series": [
{
"name": "2018-11-05",
"value": 1
},
{
"name": "2018-11-07",
"value": 1.0784432590958841
}
]
}
]
安装和设置
AWS
首先你需要一个 AWS 账户。如果您还没有 AWS 帐户,请注册。然后创建一个 IAM 用户。最后,您将获得 IAM 用户的凭据。您将需要它来设置无服务器 cli,以便可以在 AWS 上部署和运行无服务器服务。
serverless config credentials --provider aws --key <ACCESS KEY ID> --secret <SECRET KEY>
无服务器安装
按照说明安装 docker 进行部署。
初始化无服务器项目
为服务创建 serverless.yml 文件。它需要插件 wsgi 作为 web 服务器来运行 REST 服务。内置的 flask 开发服务器对于生产来说性能不够。注意 pythonRequirements 中的 slim 标志有助于限制源代码的大小。Lambda 的源代码有大小限制。纤细的旗帜有助于减小尺寸。因此,排除所有不必要的文件也很重要,比如 venv 中的文件。zip 标志有助于在上传到 S3 进行部署之前压缩源代码。配置的其余部分不言自明。
部署过程总结如下。无服务器框架将文件构建并打包为 zip 文件。然后,它使用 IAM 凭据将源代码上传到 S3 存储桶(该存储桶由无服务器 cli 自动创建)。然后,它利用 CloudFormation 部署 Lambda 服务。所有这些都发生在一个单一的命令中。
实施
实际的实现很简单。当请求历史数据时,它从 S3 抓取数据(csv 文件)并读入熊猫数据帧(S3 是一个 AWS 存储服务)。然后我们将迭代 dataframe 来构造我们上面定义的响应。当我们在 serverless.yml 中定义 Lambda 入口点 app.app 时,我们将在 app.py 中编写我们的服务。
在运行我们的应用程序之前,从 Yahoo finance 下载历史股票数据,并将其放在一个名为 data 的目录中。
然后运行本地启动应用程序。
(venv) **➜ stock-backend** python app.py* Serving Flask app "app" (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: on* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)* Restarting with stat* Debugger is active!* Debugger PIN: 248-351-201
从现在开始,您可以验证您的 REST 端点是否工作。假设您在数据目录中有一个 SPY.csv 文件。打开浏览器输入http://127 . 0 . 0 . 1:5000/price?地址栏里的 ticker=SPY 。JSON 响应的结果将显示在您的浏览器中。
[
{
"name": "SPY",
"series": [
{
"name": "2014-10-20",
"value": 190.300003
},
{
"name": "2014-10-21",
"value": 194.070007
},
{
"name": "2014-10-22",
"value": 192.690002
},
{
"name": "2014-10-23",
"value": 194.929993
}...
]
或者你可以使用 curl 命令来做同样的测试
curl [http://127.0.0.1:5000/price?ticker=SPY](http://127.0.0.1:5000/price?ticker=SPY)
使用 S3 存储历史股票数据
上述实现依赖于本地存储来保存历史股票数据。我们可以利用 AWS S3 来托管数据。转到 AWS 控制台并选择 S3。创建一个 S3 存储桶并命名。确保该名称是全局唯一的。
现在,我们可以将 csv 文件上传到存储桶。
接下来,为了让 Lambda 能够访问这个 S3 存储桶,我们需要为 Lambda 的角色分配一个 S3 只读策略。是的,这可以通过 serverless.yml 配置文件完成,无需与 AWS 控制台交互。serverless.yml 中更新后的提供程序如下所示
**provider**:
**name**: aws
**runtime**: python3.7
**stage**: prod
**region**: us-west-2
**iamRoleStatements**:
- **Effect**: **'Allow'
Action**:
- **'s3:ListBucket'
Resource**: { **'Fn::Join'**: [**''**, [**'arn:aws:s3:::<YOUR_S3_BUCKET_NAME>'**]] }
- **Effect**: **'Allow'
Action**:
- **'s3:getObject'
Resource**:
**Fn::Join**:
- **''** - - **'arn:aws:s3:::<YOUR_S3_BUCKET_NAME>'** - **'/*'**
在 app.py 中,确保我们从 S3 加载数据,而不是从本地磁盘读取数据。
*# path = '{}/data/{}.csv'.format(os.path.dirname(os.path.realpath(__file__)), ticker)
# df = pd.read_csv(path, index_col='Date', parse_dates=True, usecols=['Date', 'Close'],
# na_values=['nan'])* df = pd.read_csv(**'s3://<YOUR_S3_BUCKET_NAME>/{}.csv'**.format(ticker), index_col=**'Date'**, parse_dates=**True**,
usecols=[**'Date'**, **'Close'**], na_values=[**'nan'**])
部署到 AWS Lambda
现在到了激动人心的部分。让我们将服务部署到 Lambda。
(venv) **➜ stock-backend** sls deployServerless: Adding Python requirements helper.......Service Informationservice: stock-backendstage: prodregion: us-west-2stack: stock-backend-prodresources: 11api keys:Noneendpoints:ANY - https://9rn0mg6p6b.execute-api.us-west-2.amazonaws.com/prodANY - https://9rn0mg6p6b.execute-api.us-west-2.amazonaws.com/prod/{proxy+}functions:app: stock-backend-prod-applayers:NoneServerless: Run the "serverless" command to setup monitoring, troubleshooting and testing.
最后,您将获得新 API 的端点。这是来自 API 网关的 URL。你可以在你的浏览器上测试一下。请注意,您的 URL 会有所不同。我们用浏览器或者 curl 来测试一下。以下是结果。现在我们有了运行在 AWS Lambda 上的后端服务。部署很容易。
如果你对 AWS 创造了什么感兴趣,你可以登录你的 AWS 控制台找到答案。它创建用于部署的 S3 桶和云形成资源。使用 Lambda 执行的新 IAM 角色创建 Lambda 函数。此外,该角色还具有用户定义的角色,可以访问股票数据 S3 时段。
下一步是什么?
我将把上一篇文章中的 UI 与运行在 lambda 上的后端连接起来,然后将 UI 部署到 AWS。敬请期待!
建议读取:
以前的帖子:
从 CRUD web 应用开发到语音助手中的 SDE——我正在进行的机器学习之旅
全栈开发教程:将 AWS Lambda 无服务器服务集成到 Angular SPA 中
全栈开发教程:在 Angular SPA 上可视化交易数据
Photo by Carlos Muza on Unsplash
(这篇文章也可以在我的博客中找到)
本系列的下一篇文章:全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据
作为一名数据科学家,您是否曾想过如何在 web 应用程序中为您的用户可视化您的数据?我将演示一系列的全栈开发教程来创建一个简单的 web 应用程序——stock graph 的 Angular 用于 UI,AWS serverless Lambda 用于后端,AWS API gateway 用于 API 管理,CloudFormation 用于持续部署。
这篇文章演示了如何在 Angular 单页应用程序(SPA)中可视化股票数据。在本教程的最后,您将创建一个带有组件的 Angular 应用程序,用于在客户端显示股票数据。本教程中没有服务器交互。所有数据都存储在客户端。源代码可以从这里下载。
安装 node.js 和 Angular CLI
创建新的 Angular 应用程序并安装依赖项
运行以下命令并相应地回答问题,以创建新的角度应用程序。然后安装用于造型的 ng-bootstrap 和用于显示图表的泳道/ngx-charts 。
在 app.module.ts 中包含 NgxChartsModule 和 browseranimentsmodule。Ngx-charts 在 app 模块中使用 browseranimentsmodule,以便随时可以使用。
在 angular.json 的 styles 数组中添加“node _ modules/bootstrap/dist/CSS/bootstrap . min . CSS”
现在,打开终端并运行 *ng serve,*您应该能够在 http://localhost:4200/ 中看到下面的示例应用程序
创建一个组件来显示股票图
在终端中运行以下命令创建一个新组件
ng generate component chart
该命令完成后,将创建一个新的目录“chart”。它包含一个 spec 文件(用于单元测试),一个 TypeScript 文件(。ts 文件),它包含用于呈现 UI 的逻辑和模板文件(.html 文件),它包含 UI 的标记。在模板 chart.component.html 中,用以下代码替换代码以正确配置图表。颜色方案、结果数据集、x 轴或 y 轴标签等属性是 ngx-charts-line-charts 的属性。我们用相应的变量来设置它们,这些变量将在 chart.component.ts 中声明和赋值。
在我们跳到 chart.component.ts 中的业务逻辑之前,让我们创建一个存储历史股票数据的界面。在 src/app 目录下创建一个 model.ts,内容如下。
现在让我们生成一个服务来提供历史数据。对于本教程,数据将被稳定地存储在 typescript 文件中。在现实世界中,它应该从远程服务器获取。我将有另一个教程来涵盖这个主题。在终端运行 ng 生成服务库存数据。
一旦我们有了服务来提供数据,我们需要更新 chart.component.ts 来更新绑定到 UI 的变量。下面是 typescript 中更新后的 ChartComponent。
接下来,我们需要更新 app.component.html,以确保应用程序显示我们刚刚创建的图表组件。
现在,您应该能够在 http://localhost:4200/ 中看到新创建的图表
下一篇教程,我将展示如何用 python 构建后端 API,用 AWS Lambda 无服务器服务提供数据。保持调谐!
建议读取:
我的帖子:
从 CRUD web 应用开发到语音助手中的 SDE——我正在进行的机器学习之旅
全栈开发教程:将 AWS Lambda 无服务器服务集成到 Angular SPA 中
全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据
全栈开发教程:在 Angular SPA 上可视化交易数据(1)
Azure 上的全栈机器学习
使用 MERN 在 Azure 上构建全栈机器学习网站指南(Mongo,Express,React (Node.js))
Tech stack and flow for http://diamonds.foostack.ai
在对最新技术感到生疏后,我决定同时学习一系列东西,并开发了http://diamonds . foo stack . ai,现在已经上线。(基础机器学习 app 给钻石定价)。
我的女朋友让我给她买一枚钻戒,我告诉她“不,等等!!!我必须先建立一个定价应用程序/网站……(在家试试)”
本博客中的步骤和章节概述:
- 使用 Python 获取数据
- 使用 ScikitLearn 在 Jupyter 笔记本电脑中培训 ML 模型
- 将 ML 模型部署到 Azure
- 在 React w/ Express 上构建前端
- 构建后端 Express,MongoDB
- Azure Web 应用部署和 CI/CD
- 总结、提示和技巧
回顾我的 github 签到记录,这个项目花了我 1 个月(26 天)——可能每周花 8-10 个小时,所以大概 40 个小时以上。最终产品还不算太差:
步骤 1:获取数据
我在网上搜索好的钻石数据。我发现:
- Kaggle 的钻石数据集有 50k 行,但与我找到的其他数据集进行交叉比较时,它似乎缺乏真实世界的定价准确性。
- 其他“[实验数据集](https://datasciencereview.com/case-study-does-the-size-of-diamonds-affect-its-price – https://vincentarelbundock.github.io/Rdatasets/csv/Ecdat/Diamond.csv)”是旧的或者类似地与当前价格不同步。
- 一些商业供应商出售更新的钻石库存/价格数据,但我不愿意付钱。
- 零售网站有数据,但需要搜集(bluenile.com,rarecarat.com 等)
解决:被爆料加强刮不违法 —我在刮BLUENILE.COM——(感谢安德鲁·马尔德的首发码)。
My source of data!
安德鲁斯的代码基本有效,除了:
- 它是用 Python 2.7 写的,所以有一些问题
- 自从他写了以后,网站上的数据格式改变了
- Bluenile 不断发展,目前已经阻止了运行此类脚本的吸血鬼
我唯一的黑客/贡献是在他们一直关闭我的时候添加重试循环:
# (bluenile API restricts to 1,000 page chunks at a time)
home = requests.get('http://www.bluenile.com/')
while True:
url = 'http://www.bluenile.com/api/public/diamond-search-grid/v2'
try:
response = requests.get(url, params, cookies=home.cookies)
except: # request api exception, usually timeout
time.sleep(60*30)
next
if (response.ok == False): # server may have disconnected us
time.sleep(60*30)
next
else: # all going well
time.sleep(60*4)
next
最初的脚本进行了内联清理——我选择了下游清理(通常是个坏主意)。
输出示例 1 行(注意需要清理的$逗号引号等):
carat,clarity,color,culet,cut,date,dateSet,depth,detailsPageUrl,fluorescence,hasVisualization,id,imageUrl,lxwRatio,measurements,polish,price,pricePerCarat,sellingIndex,shapeCode,shapeName,skus,symmetry,table,v360BaseUrl,visualizationImageUrl,willArriveForHoliday
['0.23'],['FL'],['D'],['None'],"[{'label': 'Ideal', 'labelSmall': 'Ideal'}]",['Sep 30'],['Oct 1'],['58.8'],./diamond-details/LD12750672,['None'],[True],LD12750672,,['1.01'],"[{'label': '4.04 x 4.00 x 2.36 mm', 'labelSmall': '4.04 x 4.00 x 2.36'}]",['Excellent'],871,"['$3,787']",0.7348354,['RD'],['Round'],['LD12750672'],['Excellent'],['60.0'],https://bluenile.v360.in/50/imaged/gia-7313767639/1/,https://bnsec.bluenile.com/bnsecure/diamondvis/gia-7313767639/still_230x230.jpg,False
最后,我的抢劫成功了 14 万颗圆钻!我将这些保存到一个 CSV 文件中,用于清理和模型训练。
第二步:用 Jupyter 和 SKLearn 训练模型
Jupyter 笔记本很棒(看我的全笔记本这里):
- 当我试验不同的想法时,用简单的方法来注释我的想法——有助于以后修改或传递给其他人!
- 比 VS 代码项目设置和运行更快——隔离细胞和独立运行的能力就像修改过的 REPL!
- 可视化更容易操作,因为您可以重新运行单元,只绘制图形,而不是重新运行整个程序!
- (上面的一些可以用调试器和 REPL shell 来完成,但是看起来更干净&更容易在笔记本上重现)
对于数据清理,一些选项:
- 通过 python 脚本清理:CSV -> scrub.py -> CSV
- 在笔记本内拖动:CSV ->笔记本-> pandas/python -> CSV
- 在数据库内部清理:CSV-> MongoDB-> SQL scrubbing-> CSV
- 使用其他工具,如 Alteryx、Trifacta 或 Informatica
选项#1 可以工作,但是为什么还要处理另一个脚本/env。#2 看起来是正确的方法,因为我们在 ML 之后使用 Python 和笔记本。#3 听起来我们在推迟不可避免的事情,而不是把垃圾放入数据库。#4 对像我这样的穷人来说不是一个真正的选择。
使用熊猫进行擦洗&数据帧
熊猫是令人惊奇的东西。加载我的 CSV 很容易,数据帧上的 describe()显示了一些基本的统计数据:
**import** **pandas** **as** **pd**
diamonds5 = pd.read_csv('./blue-nile-download-round-full.csv')
diamonds5.describe()
describe() and head() of the pandas.Dataframe
如前所述,数据存在一些问题,这是我的数据相关培训前任务清单:
- 确定在生产模型中使用哪些列
- 将文本转换为干净的文本(即删除[])
- 正确转换数字(删除$和,并删除[]和’')
- 处理关键字字段中的空值或超出范围的值
- 剔除异常值(使用≤ 4.5 克拉,因为此后会变得稀疏)
完成后,我们对克拉和切工(颜色)进行一点视觉图形检查,以确定价格——使用 Jupyter 非常简单:
fig, ax = plt.subplots()
**for** c, df **in** diamonds5a.groupby('cut'):
ax.scatter(df['carat'], df['price'], label=c, s=np.pi*3)
fig.set_size_inches(18.5, 10.5)
Price to Carat (to Cut)
虽然形状和深度等一些指标可能对预测有价值,但我真的想只关注 4-C——克拉、净度、颜色和切割(加上 sku,这是 BlueNile 中的 ID)。我可以放弃剩下的。
(注意,我发现烦人的 DataFrame 有一些 mutator 函数就地改变 obj,还有一些返回改变后的对象。似乎有点不一致?)
# basic cleanup functions
def cleanBracketsToF(x):
return float(cleanBracketsToS(x))def cleanBracketsToS(x):
return x.replace("['",'').replace("']",'')def cleanCut(str):
return str[str.index('label') + 9: str.index('labelSmall')-4]df.loc[:,'carat'] =
df.loc[:,'carat'].to_frame().applymap(cleanBracketsToF)
...*# clear nulls*
pd.set_option('use_inf_as_na', **True**)
df = df.loc[~df['carat'].isnull()]
...
在清理并仅包括培训所需的列后,我们有了这个(第一列是熊猫 DF 标识符,它是内部的,以及我们稍后为培训删除但稍后为显示/链接回 bluenile.com 而包括的 SKU):
Pre column encoded
接下来,我们需要转换非数字(切割,颜色,清晰度)。您有几个编码选项:
- Onehot 编码(可能是最常见的,将类别转换为二进制列)
- 顺序映射,如果它是分级的/连续的(例如,对于颜色,D->0,E->1,F->2 …)或者反过来(K->0,J-> 1…)
我用 sklearn 的 Pandas.get_dummies()调用去了 Onehot
cut = pd.get_dummies( diamonds5b['cut'], prefix='cut_')# result: cut__Astor Ideal', 'cut__Good', 'cut__Ideal','cut__Very Good'
# do the same for color, clarity...
OneHot 编码我们的数据现在看起来像这样:
Post OneHot encoded “cut”
我学到的一件棘手的事情是,如果你在一个 Hot 上对所有列进行编码,你可能会产生一个线性代数问题,这个问题是“奇异的”,这个小故事破坏了这个模型。阅读 这篇关于的假人陷阱。
这是将 one-hot 应用于所有列并测量系数的最终结果(将其视为每个特征的权重):
Column coefficients of for a linear model
以下是 reg 中的准确重量。_coeff
coefficients: [ 1122.35088004 -957.70046613 471.56252273 3604.24362627
3443.65378177 3128.96414383 2340.71261083 1717.39519952
1673.9767721 590.1060328 10566.54997464 1383.32878002
-1131.5953868 -1340.53213295 -457.74564551 -848.77484115
540.46973926 15014.89306894]
intercept: -8389.974398175218
这意味着线性预测模型主要基于克拉(有道理)和完美无瑕的钻石。该等式的结果类似于:
y = -8389 + 1122*(cut == Astor ? 1: 0) + ….. + carat*15014)….
例如,如果我们为 1.0 克拉、切割理想、颜色 G、净度 VVS1 的钻石定价,计算结果为:
y = -8389 + 1*15014 (carats)+ 1*471 (cut)+ 1*2340 (color)+ 1*540 (clarity) = $9,976
在 SKLearn 中训练一个模型——大部分代码是这样的。警告——你可能会花很多时间调试错误的形状&数组&矩阵的方向!
regr = linear_model.LinearRegression()
regr.fit(X_train, y_train) # training
y_pred = regr.predict(X_test) # inference
r2score = regr.score(X_test, y_test) # get r2 score
R2 分数值得一提——它不是一个“准确性”分数,所以不要期望得到 99%。这是对准确性/差异的一种衡量,更多信息请点击@ R2 维基。
我测试了其他的 SKLearn 模型:岭回归、套索回归、保序回归(克拉上的单一特征)、弹性正则回归。较新的 AutoML 框架(H2O、DataRobot、Azure AutoML、SageMaker 等)同时测试所有模型&超参数…让很多业余 DS 失业…
接下来,我再次使用相同的数据集应用树和集成方法。尝试各种超参数组合后的最佳性能(R2)不足为奇 XGBoost:
est = GradientBoostingRegressor(n_estimators=ne, learning_rate=lr,
max_depth=md, random_state=8, loss='ls').fit(X_train, y_train)
score = est.score(X_test, y_test)
Rough feature weights w/ XGB
查看特征权重——克拉是最高的,其他具有中等影响(有趣的是,完美无瑕的清晰度不如线性回归有影响力)。
系数对于确定每个特征的“重要性”可能不是最佳的。 Shapley 值似乎更符合行业标准。
一旦在笔记本中进行了训练,我们就使用 SKLearn 的 joblib 库导出所有经过训练的模型,以便稍后进行部署(该库将文件“pickless”或序列化为专有格式(阅读 pickle 的一些不好的方面))。
joblib.dump(value=regr_full, filename='regr_model.pkl')
joblib.dump(value=model, filename='xgb_model.pkl')
joblib.dump(value=rfr, filename='randomforest_model.pkl')
joblib.dump(value=iso_reg, filename='isoridgelineartreg_model.pkl')
步骤 3:将模型部署到 Azure
退一步说,我们有几种方法可以在生产中运行模型:
- 将预先训练好的模型嵌入后端。在我们的例子中,我们使用的是 Express (Javascript ),这不是最好的嵌入方式…
- 将预先训练好的模型发布到某个地方(比如 Python Flask 容器),并通过 webservice 公开。
- 使用像 Azure ML 这样的 API 发布和部署到他们的容器中。
- 使用 Azure ML Studio 这样的框架进行设计、训练和发布(半自动)。
我们将做#2、#3 和#4
第一步是在 Azure 上进行设置——如果这对你来说是新的,有几个基本步骤:
- 在 portal.azure.com 上创建帐户
- 你可以获得一段时间的免费订阅,但最终你可能需要创建一个付费订阅(小心$$$)。
创建新的 ML 服务工作场所
New stuff in Azure — evolving fast
我们可以使用新的 Azure ML API(尽管你应该看看 ML GUI 工作区——你可以启动 Jupyter 笔记本,尝试他们的菜单驱动 AutoML,ML Studio Visual GUI(下图),以及其他现在不断变化的东西……
Drag-n-Drop ML… iffy distraction at best
通过 Python API 设置模型
使用 API 在 Azure 上设置服务有几个步骤
- 注册你的模型(你的泡菜。pkl]文件)
- 设置环境文件和评分回调文件(。py 接口)
- 设置 web 服务(AciWebService)、模型、推理配置和部署。
注册真的很简单,每个模型做一次(pkl 文件):
ws = Workspace.get(name='DiamondMLWS',
subscription_id='****',resource_group='diamond-ml')new_model = Model.register(model_path="mymodel.pkl"model_name=name,
description="mymodel descr",workspace=ws)
Env 文件可以用这样的脚本生成(一次):
myenv = CondaDependencies.create(conda_packages=['numpy',
'scikit-learn'])
with open("myenv.yml","w") as f:
f.write(myenv.serialize_to_string())
评分文件如下所示,为每个模型实现 init()和 run():
#score_mymodel.py
def init():
global model
model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'),
'mymodel.pkl')
model = joblib.load(model_path)def run(raw_data):
data = np.array(json.loads(raw_data)['data'])
y_hat = model.predict(data)
return y_hat.tolist()
最后一步包括设置服务、模型,并为每个模型部署一次:
aciconfig = AciWebservice.deploy_configuration(cpu_cores=1,
memory_gb=1,tags={"data": "diamonds","method": "sklearn"},
description='Predict Diamonds with sklearn')
ws = Workspace.get(name='DiamondMLWS', subscription_id='****',
resource_group='diamond-ml')
model = Model(ws, name)inference_config = InferenceConfig(runtime= "python",
entry_script="score_mymodel.py", conda_file="myenv.yml")service = Model.deploy(workspace=ws,
name=svcname, models=[model], inference_config=inference_config,
deployment_config=aciconfig)
service.wait_for_deployment(show_output=True)
就是这样!您应该会看到输出声明服务已经部署并返回 URI 以供访问,并检查 Azure 门户以查看它是否在那里。
Running.......................
ACI service creation operation finished, operation "Succeeded"
http://dds2f-97f5eb5c4163.eastus.azurecontainer.io/score
差不多就是这样。输入格式和输出由您在第 2 部分中创建的模型细节定义。你可以用 Postman 或 curl 测试 API 确保它是定价的:
Testing via POSTman
发布到 azure web service——价格 1.1 克拉,F 色,未切割,VVS2 净度钻石→ $11,272 是预测!
我不会深入讨论使用 GUI 驱动的 Azure ML Studio 的细节。您可以拖放、训练并最终发布一个 web 服务 URL(使用不同的输入/输出格式)。对于我的应用程序,我在 GUI ML Studio 中发布了 3 个模型,在 SKLearn 中发布了 4 个模型。查看 web GUI 上定价请求的输出:
Target aggregated results
请注意神经网络模型是完全疲惫不堪…不知道我是否会麻烦修复它…
由于 Azure ML 容器的成本,我选择将模型转移到 Azure 托管的 Flask Python 服务。这是非常少的代码——而且成本只是 Azure ML ACI 的一小部分($ 2/天每项服务,所以部署了 w/ 4 个模型,大概是$ 8/天…迅速破产的老道格·福】。重新部署非常容易。烧瓶中的 pkl:
app = Flask(__name__)
models = {}
models['XGB2'] = joblib.load('models/sklearn_diamond_xgb_model.pkl')
models['ISO'] = joblib.load('models/sklearn_diamond_iso_model.pkl')
models['LR3'] = joblib.load('models/sklearn_diamond_regr_model.pkl')print('loaded models', models)@app.route('/models/<model>', methods=['POST'])
def predict(model):
if (models.get(model) is None):
print('model not found: ',model)
return jsonify("[-1]")
j_data = np.array(request.get_json()['data'])
y_hat = np.array2string(models[model].predict(j_data))
print('input: ',j_data, ', results:', y_hat)
return y_hatif __name__ == '__main__':
app.run(debug=True)
步骤 4:用 React 构建完整的堆栈 ML 前端
同样,关于启动 React 项目& Express.js 项目的故事数不胜数,所以我将跳过一些步骤…
- 将 express 安装到我的项目文件夹~/diamonds 中
- 安装 react ,用 create-react-app 在一个名为~/diamonds/diamond-app 的子目录中创建起始项目
- 对于生产部署,它们通过 webpack 合并成一个单一的 express 捆绑包
React 与我以前使用过的所有其他框架相比
我对 Web 开发非常熟悉,比如 Perl-CGI、Php、JSP、ASP 和所有那些“Web 2.0”框架,包括传统的 AJAX。我也用过 Django,仔细观察过 Angular。 React 不同——有一个学习曲线。经过一番挣扎,我现在是你的忠实粉丝了!需要记住的关键事项:
- 组件— 编码使用 JSX 语言,看起来像 Javascript,但略有不同。你通过 JSX 类或函数来编码组件(<标签/ >)。顶层组件通常是 App.js,在这里你可以添加你的自定义 JSX 和其他组件,比如< MyTag/ >。
class MyTag extends React.Component {
const constvar = "Text"
render() { return (<div>Hi {constvar}</div>) }
}
- 状态 —动态渲染流程与您可能习惯的非常不同。React 有自己的生命周期,主要由“状态”(特殊变量)变化控制。声明一组状态变量,然后像变魔术一样刷新受影响的组件。见下文,随着动态的值的改变,GUI 组件将自我刷新。
class MyTag extends React.Component {
constructor(props) {
super(props);
this.state = { dynamic: 'Dyn txt' }
}
const constvar = "Const Txt";
render() {
return (<div>Hi {constvar} and {this.state.dynamic} </div>
)}
}
// equiv as a function, bit tighter ? also use MyTag
function MyTag2() {
const constvar = "Const Txt";
const [dynamic, setDynamic] = React.useState('Dyn Txt');
return (<div>Hi {constvar} and {dynamic} and <MyTag/> </div>);
}
- Props — props 是标签属性和组件/标签的子组件—传递数据的一种方式。您可以通过 props 将数据 向下 传递,但是调用 向上 需要一个回调函数(例如在 caller/parent 中定义的 myCallbackFunc)。
function MyTag2(props) {
const constvar = "Const Txt";
const [dynamic, setDynamic] = React.useState('Dyn Txt');
return (
<div>
Hi {constvar} and {dynamic}
Hi {props.var1}
<Button onClick={props.callback} />
</div>);
}
}
function App() {
function myCallbackFunc() {
// do something on button click
} return (
<div>
<MyTag2 **var1**=’var' **callback**={myCallbackFunc}>Text</MyTag2>
</div>);
}
}
上例——你的 app 根是,在里面我们调用 MyTag w/ “props” var1 和回调以及内部的" Text "。
这需要一些拨弄来学习,但它实际上非常优雅——试试吧!
使用材料设计启动用户界面
Google 的 Material-UI 是 React 的一个组件库/框架,它给你提供了很棒的小部件和默认主题,这样任何人都可以让网站看起来很棒!我浏览了画廊,选择了仪表盘(在左边)开始。
Material-UI 有类似于布局和容器的组件来管理反应式/自动调整组件。包括一个漂亮的侧菜单。
我在默认仪表板上做的主要事情:
- 设置左抽屉默认关闭,添加帮助弹出链接到外部网站。
- 更新了顶栏和新文本,替换了通知铃声和帮助
- 在网格中实现了 3 个主要的“纸”容器:随机钻石、库存选择器/过滤器和 ML Pricer。
今日随机钻石
这是最容易建立的一个。假设/diamonds/daily/上有一个服务器 REST 端点,它返回一个 json (data.price,data.carat,等等…)—我们只获取组件负载(useEffect())并从结果中设置状态变量。
export default function Daily() {
const [diamond, setDiamond] = useState({
price:0.0,carat:0.0,color:'',cut:'',clarity: '',skus: ''
}); useEffect(() => {
axios.get('/diamonds/daily/').then(response => {
setDiamond({
price: response.data.price,
carat: response.data.carat,
...
});
})},
[]);
return (
<React.Fragment><Title>Random Diamond Featured</Title>
<Typography>Price: {diamond.price}</Typography>
<Typography>Carats: {diamond.carat}</Typography>
...
</React.Fragment>
);
}
钻石过滤器
我想要一个基本的搜索表单,让我通过 140k 钻石过滤-图表+表格中的细节。
我选择 Victory 作为我的制图/绘图工具,因为它适用于反应式(也考虑了反应式和重新制图)。我不喜欢 material-ui 数据表(缺乏更高层次的抽象),所以选择了更小的开源 Material-Table 项目。在 React-land 中,您可以选择许多组件!
创建该组件的主要步骤:
- 使用 Material-UI 表单组件,在表单组中添加复选框,并实现克拉滑块。
- 实现 SearchButton 的 onClick
- 模仿或构建您的后端来返回一个列表中的钻石 JSON,我们在一个图形+表格中呈现(通过选项卡)— 更多内容在第 5 部分
参考 github 获取完整源代码。下面显示了如何将选项传递给服务器:
class Chooser extends Component {
constructor(props) {
super(props); this.state = {
D: true,
E: true,
F: true,
G: true,
H: true,
AstorIdeal: false,
Ideal: true,
diamonds: [],
...
} handleSubmit = event => {
// call REST api, setState of return diamonds[] etc
} render() {
return (
<React.Fragment >
<Title>Filter Diamonds</Title>
<FormControl component="fieldset" >
... checkboxes and button
</FormControl>
<Paper square className={classes.root}>
<Chart diamonds={this.state.diamonds}/>
<DiamondsTable diamonds={this.state.diamonds} />
</Paper>
</React.Fragment>
)
}
DiamondsTable 是一个第三方表格组件来查看数据网格。把钻石[]当道具传就行了。钻石[]状态的任何变化都会强制重新渲染。反应刷新魔法!
Tab to DiamondTable (customized react-table component)
ML 定价—终于!
我们已经接近目标—根据我们训练集中的 14 万颗钻石预测钻石价格。
控件非常简单——很像过滤器/选择器,我们有一个基本的表单和按钮。
代码结构非常相似:
- 带有 submitPrice 回调的 FormGroup 和 Button
- submitPrice 调用 REST 服务,传递输入{克拉、净度、切工、颜色}并返回设置为状态变量的钻石列表[]。
- 钻石[]作为道具传递到图表和表格中。
- diamonds[]状态的初始和任何后续更改都会触发使用 diamonds[]重新渲染子组件。
Full results of model prices and analytic graphs + unseen tab view to tabular results
来自上一步的过滤器( Chooser.js )和 Pricer.js 非常相似。 Pricer 是作为函数而不是类实现的,因此语法略有不同。带状态的函数是新的“钩子”,被添加到 React 中,是完整类的更好的替代品。
步骤 5:在 Express 中构建 REST 服务(w/ MongoDB)
Express 是 JavaScript Node.js webserver。我仍然更喜欢 Python 中的后端,但我猜这个教程是 MERN,所以我必须使用/学习 Express(这并不太难)。一个关键的优势是当您拥有相同的前端和后端库时可以重用。
同样,我不会深入安装的基础知识。我将跳转到托管我的 API 逻辑的 server.js 脚本。我需要的主要 REST 调用:
- 获得/钻石/每日-每日随机钻石
- POST /diamonds/q/ —获取具有某些过滤标准的列表
- POST /diamonds/q2/ —获取符合定价标准的列表
- POST/diamonds/price——使用我的 ML 模型为钻石定价
首先让我们设置 MongoDB
为 Express 设置一个 Mongoose 模型,创建一个数据库并批量加载该数据库。
- 设置 Express 端点
- MongoDB 在 MLab 上免费— FYI Azure 有 CosmoDB,它(大部分)与 MongoDB 有线兼容。CosmoDB 最便宜的计划是 24 美元/月!
Mongo is free — vs $24/month on Azure
创建数据库后,您需要上传数据或手工输入数据。对我来说,最简单的方法是使用批量加载器脚本——要求您在 PC 上安装 MongoDB 客户端,并指向 MLAB 连接字符串。
mongoimport --uri mongodb://user:pass@host.mlab.com:12122/diamonds --collection myc --type csv --headerline --file jsonfile.csv
上传 150k 的钻石条目速度很快,只需几分钟,并且确实使用了接近 0.5gb 的限制。全部完成!
2。Mongoose 模型— 创建一个脚本,定义一个与您的 MongoDB 集合的 JSON 格式相匹配的模式:
#diamond.model.js
let Diamond = new Schema({
carat: {
type: Number,
default: -1
},
color: {
type: String,
default: 'Default'
},
...
}, { collection: 'myc' });module.exports = mongoose.model('Diamond', Diamond);
3。Express.js REST 端点(server . js**)**都是下一步。
在那里,大部分都是样板文件。打开一个要共享的连接,设置任何备用映射(在本例中为 react path),并监听一个端口。在这两者之间,我们为各种 GET/POST 处理程序创建路由(在下一节中定义)。
app.use(cors());
app.use(bodyParser.json());
mongoose.connect('mongodb://user:pass@host:port/diamonds',
{ useNewUrlParser: true, useUnifiedTopology: true });const connection = mongoose.connection;
connection.once('open', function() {
console.log("MongoDB connection established successfully");
})//-- fill w/ diamondRoutes start
... see below
//-- fill endapp.use('/diamonds', diamondRoutes);// for webpack'd react front end
app.use(express.static("./diamond-app/build"));
app.get("*", (req, res) => {
res.sendFile(path.resolve(__dirname, "./diamond-app",
"build", "index.html"));
});
app.listen(PORT, function() {
console.log("Server is running on Port..: " + PORT);
});
接下来,我们填写 diamondRoutes — /daily /q /q2 和/price。/daily 很简单——只是一个返回 1 个 diamond 的随机查询(使用 diamond.model.js 中定义的 json 模式)
diamondRoutes.route('/daily').get(function(req, res) {
let random = Math.floor(Math.random() * 140000); // skip n
Diamond.findOne().skip(random).exec(function(err, diamonds) {
res.json(diamonds);
});
});
/q 和/q2 都是类似的查询搜索,接受 POST 参数并映射到一个 Mongoose 查询——POST 输入是一个 JSON,如{carat:3,color:‘D ‘,cut:’ ‘,clarity:’’}
diamondRoutes.route('/q2').post(function(req, res) {
const qobj = req.body;
query = Diamond.find();
query = query.where('carat').
gt(qobj.carat-0.05).lt(qobj.carat+0.05);
if (qobj.cut !== '') query = query.where('cut').equals(qobj.cut);
if (qobj.color !== '') query =
query.where('color').equals(qobj.color);
if (qobj.clarity !== '') query =
query.where('clarity').equals(qobj.clarity);
query.exec(function(err, diamonds) {
res.json(diamonds);
});
});
POSTman test
调用/价格—机器学习推理调用是通过另一个 REST API 调用 Azure ML Studio 的 farm 完成的(现在大部分是对 Azure Flask 服务器)。
请求链:React 客户端-> Express.js -> ML 服务->返回 Express.js ->返回 React 客户端。
我认为以块的形式显示代码会令人困惑,所以只看关键步骤,即使用“异步”调用 callSvc 函数,然后“等待”它们全部加入结果:
let r0 = await callSvc(p2.XGB.url, p2.XGB.token, reqJson);
let r1 = await callSvc(p2.LR.url, p2.LR.token, reqJson);
let r2 = ...
callSvc 只是执行一个 axios http POST 来获取 ML 预测。注意函数上的“async”定义,以及上面配对异步调用的 await 调用。
async function callSvc(apiurl, token, reqJson) {
return axios.post(apiurl, reqJson,
{ headers: {
'Content-Type': 'application/json',
'Authorization': token,
}
})
.catch(function (error){
console.log(error);
});
}
对于前端来说,响应被合并到单个响应 JSON 中,注意 ML Studio 格式不同于我的定制 SKLearn 模型:
res.json([
{ price:r0.data.Results.output1.value.Values[0][6],model:'XGB' },
{ price:r1.data.Results.output1.value.Values[0][6],model:'LR' },
{ price:r2.data.Results.output1.value.Values[0][6],model:'NN' },
{ price: r3.data[0], model: 'ISO' },
{ price: r4.data[0], model: 'XGB2' },
{ price: r5.data[0], model: 'LR3' },
{ price: r6.data[0], model: 'RF' },
]);
通过 POSTMAN 查看链的外观(调用 express,它调用 ML 服务,汇总所有 7 个模型的结果):
Final test via POSTMAN->Express.js->ML Services
完整的故事请看完整的源代码。这就是大部分——我们现在已经构建了 express.js 后端!
步骤 6:React+Express 的 Azure 部署
部署到 Azure 站点真的很简单(当它正常工作时)——当出现构建或部署错误时会非常沮丧。祝你好运!
首先,您应该理解在开发中您可能运行 2 个服务器:
- 反应开发引擎(默认端口 3000)
- 快速开发服务器(默认端口 4000)
在 prod 中,您只运行一台服务器(Express ), React 的内容通过“npm build”被“捆绑”到一个 webpack 中,结果是这样的:
webpack results
您的 express.js 有指向这个构建/静态文件夹的代码
app.use(express.static("./diamond-app/build"));
app.get("*", (req, res) => {
res.sendFile(path.resolve(__dirname, "./diamond-app",
"build", "index.html"));
});
将这个项目签入 github,你就可以开始了!()。git 忽略 express.js (~diamonds)和 react (~diamonds/diamond-app)级别的 node _ modules)。
登录 Azure 门户并创建 Web 应用
creating an azure webapp
“testwebapp23”将变成http://testwebapp23.azurewebsites.net所以要小心命名,它以后不能更改(如果你拥有一个域,你可以在外部给它起个 DNS 别名)。选择最便宜的尺寸,B1 将花费你大约 15 美元一个月!
我会检查 Azure Web App 的配置面板,确认一些事情:
double check the config
接下来,您需要在Azure devo PS(https://dev.azure.com)中创建一个项目来托管构建环境。然后,转到项目设置(左下角)并将其链接到您的 GitHub repo,并启用管道:
管道将启用您的 CI/CD 设置,因此对 GitHub 的签入将触发构建和部署。有几种方法来设置它,每种方法都有其缺陷。奇怪但半简单的方法是跳回 Azure Portal,用他们的 webapp-> 部署中心结束。
Select GitHub — then Azure Pipelines
你可以选择 Kudu App Build 或者 Azure Pipelines。Pipelines 是最新的 Azure CI/CD 工具集(取代了 TFS)。两者都有问题…但是我发现对于 node.js 管道部署效果更好(对于 Python 我更喜欢 Kudu)。
完成,这将创建您的第一个构建和部署。如果你幸运的话,它可以工作,你可以像这样在线查看你的应用程序:
It works!
跳回 Azure DevOps,你会看到它生成了一个管道(构建)和发布(部署):
Code successfully built in Azure Pipelines
如果通过,则进入发布(部署):
您可以定制每个步骤,并添加一些漂亮的东西,如前/后脚本或如下所示的批准流程,以在您的环境中传播更改。一个变更触发了一个预生产(演示)构建,然后一旦我验证了构建,我必须手动批准发布到生产(diamonds.foostack.ai)。
第七步:技巧和烦恼
我学到并想提醒你的最重要的事情:
- Azure Insights 非常适合跟踪使用统计数据(设置起来比你想象的要困难,你必须将代码与你的每个组件挂钩,但之后你会得到一些很好的遥测数据)
- Azure 正在发展(正在崩溃),所以准备好面对一些麻烦,尤其是机器学习和管道等新事物(linux 上的 node.js 版本突然崩溃…几个星期以来,Azure 团队一直在努力清理这场灾难:
- Scrum Boards 和票证管理可以在 Azure DevOps 中完成,并与 GitHub 集成。它很新,但对于一个小项目来说还不错。
- 成本管理 —密切跟踪。每个机器学习模型的成本有点疯狂(每个模型容器/天 2 美元,仅 12 天就花了我 100 多美元)。这促使我迁移到 Flask。在另一个项目中,SQL Warehouse 用了 2 天就超过了 100 美元!小心,设置成本警报!
- Python Flask Deploy——因为上面的成本问题,我晚加了这个。我使用传统的来自 WebApp- > Deployment 的 Kudu build,而不是 Azure Pipelines,因为我一直使用 Azure Pipelines 时出现了一些错误。
Python Flask using older Kudu deployment (works !)
- ****域名设置真的很简单——Azure 不这么做,去namecheap.com——然后在 Azure 上链接就行了。非常简单的说明。
编码快乐!在线阅读 livehttp://diamonds . foo stack . ai网站、 github 项目或 Jupyter 笔记本。
面向数据科学家的复杂解决方案全栈可视化
笔记本不够用怎么办?
这篇文章主要面向那些希望围绕他们的解决方案快速开发一个界面的数据科学家。虽然您确实可以在 Jupyter 笔记本或其他地方构建一些 交互式 仪表盘 ,但我个人在我的几个项目中遇到了它们的局限性。此外,有时让人们去玩解决方案比你向他们解释要容易得多。
我的目的是向您展示一个路线图&一些片段让您尽可能快地开始,这样您就可以制作类似于这个简单的演示(下面的快照)的东西,它在后端运行 python(在更复杂的版本中用于集群的 DBSCAN ),并在客户端呈现结果,以便您将结果发送给公司的决策者,让他们大吃一惊。
Route optimization demo using Google Constraint Solver (DBSCAN is used in a more complex version all on the back-end)
无论是创建演示,还是将其添加到您的投资组合中,或者是向公司的管理层和利益相关者传达一些故事,能够快速将简单的用户界面包装在您的解决方案周围都可以极大地帮助您实现目标。在大多数情况下,您可能能够在笔记本或档案中包含一些图表&漂亮的图表,但是如果您需要某种程度的用户交互,而这在 Jupyter 笔记本或合作实验室中是不可能的,该怎么办呢?如果老板问“你能不能把一些东西组装起来,这样我以后可以玩玩?”或者“你能做一个演示,让我在你不参加的会议上使用吗?”。基本上,他们要求一个 URL 来点击并看到它的神奇之处,此外,这确保它每次都能按预期工作,而不会有人不小心弄乱你的代码,等等。
对于一个对 HTML 知之甚少的人来说,在没有任何教程的情况下从头开始开发这样的演示可能要花费一周的时间。然而,我希望在完成下面的步骤后,你能在几个小时内完成这样的事情。
您可能已经发现,这样的接口需要两个方面。在后端,您可以运行您的 python 魔术,在客户端,您可以将结果呈现为一些迷人的、令人瞠目结舌的图形,以便在给用户一些自由度来进一步探索您的解决方案的同时传递信息。我通常把我的后端放在 Google App Engine 上,它可以存放你的 python 代码,当你在前端触发它时就运行它,但是你也可以很好地使用 AWS 或其他服务。这里没有特别的偏好。
前端是我们用 HTML、CSS 和 JavaScript(JS)编写的地方。后端是你可以存储数据,利用云计算,甚至运行代码,而不需要使用你的用户(客户端)资源(想象一下他们的手机,电脑)。
后端
出于这个例子的目的,我们需要设置我们的后端,以便它能够响应一些 URL 请求。换句话说,当您在浏览器中输入一个 URL 或者通过一些 JS 代码(比如 fetch()、XMLHttpRequest()等)发出请求时,每个函数都会运行。(稍后您将看到一个示例)。因为我们正在编写后端来执行一些 python 代码(所以我们可以在以后享受做一些数据科学的酷东西——嘿,这里没有偏见:p)我们利用 Flask——python 的一个简单的 web 开发框架。
Flask 是基于 Werkzeug、Jinja 2 和 good intentions 为 Python 开发的微框架。在你问之前:它是 BSD 许可的!
您需要编写您的 python 脚本并将其托管在服务器上的某个地方,这样每次请求 URL 时,就会触发一个或多个 python 函数。您可以将一些数据传递给该函数,并最终获得一些数据,在本演示中,这些数据将是优化的路线和车辆信息。附带说明一下,这个简单的演示利用了 Google 或工具来解决一些教科书式的旅行推销员问题,这里的约束条件被定义为时间和卡车负载。
如果你之前没有用过 app engine,最简单的入门方法就是注册后按照 App Engine 中的教程进行操作。选择 Python 作为您的语言,并遵循 Hello World 教程的结尾。然后回到这里。
在浏览了关于 App Engine 的 hello world 教程后,你应该能够创建一个应用程序,并使用命令行或浏览器中的嵌入式 shell 和编辑器(我个人喜欢后者)将其部署到 Google App Engine,你真正需要创建的只是一个简单的 Flask 应用程序,如下所示。请记住,首先安装您将在后端代码中使用的包,如 Flask、或-tools 等。这意味着您需要将它们添加到 requirements.txt 文件中,然后进行安装(见下文)。
Simple Flask app for the back-end to trigger our functions via some URL requests
现在,如果我们向上面的“baseURL-of-project/vrp”发出请求,我们只是触发了与之相关的函数。简单吧?!这很棒,因为你可以在后端做任何你想做的事情,甚至添加复杂的建模和使用所有你需要的机器学习库,等等,然后将结果传递给你的客户端,以呈现一个漂亮的图形或图表。
前端
听到“前端开发”可能会吓到你,但我向你保证,你不需要知道一切来开始。你可以试着通过 python 来完成,但是我个人更喜欢 HTML、CSS 和 JS。以下是几个概念,每个概念都有很好的学习来源,应该是你需要开始学习的全部内容;
- 基础 Javascript
- 承诺
- 获取()或 XMLHttpRequest ()以在客户端(前端)发出我们的 URL 请求
我不会告诉你什么是最好的,因为有大量的前端库、包和框架。对你有用的就应该是好的。如果你没有任何线索,那么我建议你从浏览( PWA 初学者工具包)开始,你应该很快就能开始编写非常棒的尖端 web 应用程序。
我们需要一个简单的 HTML 页面来包含我们的演示 UI 元素,如按钮,输入字段,也许谷歌地图,因为它太简单了。记住,要使用谷歌的服务,比如地图,你需要在谷歌的相关网页上创建一个免费的 API 密匙。为了渲染地图,你可以简单地从这里开始和这里的。
一旦你有了一个动作按钮设置&你想把它连接到后端,你只需要在一些用户交互时向我们的触发 URL 发出请求,例如,在我们的例子中,当用户点击“优化路线”时。我们通过我们附加到按钮上的点击监听器(下面将详细介绍)捕捉到这个信息,并运行下面的函数。
JavaScript function where we make a POST request to our back-end URL
为了让你知道我说的点击监听器是什么意思,下面是一个功能演示的例子在这里。
<!DOCTYPE html>
<html></html><h2>JavaScript addEventListener()</h2><p>This example uses the addEventListener() method to attach a click event to a button.</p><button id="myBtn">Try it</button><p id="demo"></p><script>
document.getElementById("myBtn").addEventListener("click", displayDate);function displayDate() {
document.getElementById("demo").innerHTML = Date();
}
</script></body>
</html>
请注意我是如何在 _optimize ()方法的请求体中以字符串形式传递数据的。我还利用了 fetch 函数,该函数返回一个承诺,允许我在结果返回时检索它。完成了。一旦你有了结果,你可以简单地通过 console.log(response.json())把它打印到控制台上,进入谷歌浏览器的开发者工具,确认你收到了结果。另外,您需要在 App Engine 中将****替换为您的项目名称。除此之外,所有这些都是 JS 以您喜欢的方式处理和呈现您的数据。有很多 JS 图形库。 D3.js 是我的最爱之一。
托管您的前端
所以,你已经写好了项目。现在你需要通过一个可以和懒人分享的 URL 来访问它(lol)。你需要的只是一个托管服务。周围有很多托管服务。我一直在使用相对较新的谷歌 Firebase 服务,因为它的学习曲线非常短。你可以选择任何你喜欢的服务。要在 Firebase 上托管您的项目,您需要通过 Firebase 控制台创建一个项目(需要几分钟)。然后转到机器中的本地项目文件夹,初始化 Firebase 并连接到新创建的 Firebase 项目。不要担心所有这些都是一步一步的概述这里。然后从本地项目目录中输入下面的命令来部署您的项目。
firebase deploy
然后,该 URL 会显示在 Firebase 控制台的主机下。这就是了。
结论
如果您开始一个基本的 UI,您可以轻松地将您的数据科学项目包装到一个更高级的交互式外壳中,这将使任何人都可以自由地玩和不喜欢玩!!我个人已经看到了以这种方式展示你的解决方案的优势。虽然您确实可以通过 Jupyter 笔记本或其他工具为简单的项目创建一些交互式菜单,但构建更复杂的仪表板通常是前端开发人员的任务。我认为,作为一名努力变得更好的数据科学家,你不必依赖他人的时间表或技能。所以,帮你自己一个忙,花一个周末在这上面,掌握它&享受你将因此获得的自由。
如果你按照我提供的教程和链接,你应该可以在一两天内开始构建。后端应该非常简单,因为它主要是 python 而不是 Flask shell。对于以前没有做过前端开发的人来说,前端可能需要更多的时间。我希望我已经提供了一步一步的指导,让你去,但我可能会添加更多的细节取决于我得到的评论。请让我知道我如何才能改善这个职位,我会这样做。
参考文献
欢迎来到“高级 Jupyter 笔记本技巧”的第二部分在第一部分,我描述了魔术,以及如何计算笔记本…
blog.dominodatalab.com](https://blog.dominodatalab.com/interactive-dashboards-in-jupyter/) [## Jupyter 笔记本上一个非常简单的交互控件演示
当使用交互式小工具时,笔记本变得生动起来。用户可以可视化和控制数据的变化。学习…
towardsdatascience.com](/a-very-simple-demo-of-interactive-controls-on-jupyter-notebook-4429cf46aabd)
全栈编程:失败的前奏
神话,现实,荒谬
简介:
如果你是这种认为自己是“全栈程序员”的新老时尚“称谓”的一部分,或者拥有无数让你负责技术的头衔(例如,首席技术官、副总裁 R&D、技术负责人等)。)为了你自己和你的公司,你应该花几分钟时间来阅读这篇文章。如果你个人认为这篇文章质疑了你的能力,我首先向你道歉。 然而,在你勃然大怒、口吐白沫、发疯并根据标题和你对“全栈”思想的坚持来否定整篇文章之前,让我们首先尝试定义和理解围绕全栈编程愿景的实际困境。
我无法确定“全栈”这个术语是从什么时候开始被广泛用于描述一个编程职位的。它就像其他许多术语一样,随着时间的推移而时隐时现。例如,已经变得非常流行的术语“DevOps”以其最基本的形式代表了永恒的开发、准备和生产周期。如果小心应用,应该可以缩短从编程到实现的时间。最近,你也会注意到“CI/CD”这个术语。当我第一次看到它的时候,我觉得自己像个傻瓜,对自己说“这到底是什么意思?”,就去查了一下。当我意识到它代表“持续集成/持续开发”时,我简直笑破了肚皮。开发运维的 YAT(另一个术语)(基于敏捷、Scrum 或看板等方法。等等。)!因此,对于技术领域的任何人来说,“Fullstack”越来越受欢迎,越来越受关注,这并不奇怪。突然间,我面试或交谈过的一半程序员都一本正经地直视着我,说:“我是一名全栈程序员”。
然后我问,就像我问 CI/CD 一样,“那到底是什么意思?”。当我听到有人吹嘘他们的全栈能力时,问题来得又快又激烈(是的,我承认有点讽刺。)
1.你指的是哪一堆?贵公司正在使用或打算使用的技术是什么?
2.你自称懂 Angular,Vue,HTML & React?完全了解他们吗?
3.可以用 NodeJS,Java/Scala,C++,PHP,Python,Golang?你知道所有那些语言,并且很了解它们?
4.你了解 JSON,以及在深度嵌套的情况下如何真正使用它?
5.你知道 AWS,Azure 等。所有的部件呢?从 EC2 到 NAT 网关,再到 AWS 提供的所有 1001+模块?
6.您是 Redis 和 Memcached 方面的专家,知道如何设置和正确使用 Redis 系统,以及使用它做什么?
7.你知道 IOS 原生和 Android 原生以及使用 React 不使用原生代码吗?
8.你知道 SQL 和 NoSQL 吗?它们之间的区别以及如何操作?你懂 MySQL,Postgre/Postgres SQL,MongoDB,Hadoop,Cassandra,Apache Spark?
9.或许最重要的是,您知道如何保护您所有的数据,包括静态数据和传输中的数据吗?
我只是让问题飞,没有等待答案。因为人们可以很容易地把上面的问题变成 25 个或更多。任何胆敢告诉我他们知道以上所有的事情,并且非常了解它们的人,不是傻瓜就是骗子。那么,我们所说的“全栈”是什么呢?首先也是最重要的,定义你的全栈。我不知道你说的“全栈”是什么意思!
为了理解什么是真正的堆栈,让我们举两个简单的堆栈为例,它们都是词汇和缩写词,在技术领域很常见。技术专家知道“灯”堆栈和更新的“平均”堆栈。LAMP 代表“Linux、Apache、MySQL 和 PHP”。MEAN 代表“MongoDB,Express,Angular,NodeJS”。平均堆栈中包含一个前端,即 Angular。灯堆没有。
毫无疑问,可能有数百个“堆栈”。所有这些都是为了确定和阐明特定项目所需的技术。他们定义技术。他们从来没有打算也不应该被用来定义一个特定工作 的程序员的实际资格。事实上,这篇文章的全部论点是,如果成功是你的目标,那么“全栈”应用于程序员是一个神话和可怕的错误。
神话
我认为没有人能把一个具体的原因归结于“全栈”编程的出现。我有我的理论和假设,虽然它们的混合,然后延续了全栈神话可能是最好的猜测。我相当肯定 fullstack 的想法是出于好意。在一个程序员身上结合一种专长和另一种专长。这是合乎逻辑的,因为许多优秀的程序员确实有能力以胜任的方式处理两种技术。然而,和所有事情一样,“fullstack”不受约束,已经成为一个包罗万象的术语,需要大量的专业知识,涉及广泛的技术。这是一个神话——尽管是当今公认的编程方式。
1.资金有限 —现实一点,有预算。无论是在初创公司还是在大公司,这都是理所当然的。创建预算是为了确保燃烧率不会造成失控的列车,并且公司能够吸收成本。这是经济学 101 和那些选择忽略通过销售保证筹集或赚到的钱的人的灾难。因此,这似乎很有意义,与其拥有一个每个人(或团队)都是一两件事的专家的编程团队,为什么不拥有能够做所有事情的人呢?“全栈”获得了它自己的地位。毕竟,许多公司要求他们的 CTO“亲力亲为”(HO),这样他们就可以做两份工作——一份是编程,一份是管理其他程序员。那么为什么不把各种“专长”结合到一个岗位上呢?这确实节省了资金,并且有运行小而紧密的团队的额外优势。
2.编程团队的后援 —另一个突出的点,我相信这一点,就是如果一个程序员生病或离开,在真正的“全栈”环境中,另一个程序员可以接管,直到找到替代者。毕竟,如果每个人都是“全栈”,他们应该都知道其他人知道什么。不需要某个特定领域的专家,因为假设每个人都是某方面的专家。
3.不知道需要多少知识——在最近一次与新任命的研发副总裁的公开谈话中,他问我对“全栈”程序员团队有什么想法。我用一个问题来回答。“栈是什么?”他说,就是 MongoDB,React,NodeJS 栈,包括微服务,lambda 等使用 AWS 的技术。我想了一会儿,很清楚地知道过于诚实会让我失去面试的机会。对我来说,“残酷的诚实”永远是赢家。我问副总裁,他是否明白他在要求他的程序员了解什么。
a.他们必须理解和了解 NodeJS,尽管普遍认为 NodeJS 不仅仅是 JavaScript 的扩展。它是一种有如此多可能性和中间件的语言,需要对同步和异步编程有深刻的理解。将微服务的正确实现添加到组合中是对 NodeJS 如何工作以及在编程结构中应该做什么(更重要的是不应该做什么)的另一个层次的真正理解。
b.MongoDB 是一个 NoSQL 数据存储库。许多人没有意识到的是,仅它就包含了一种超过 200 种可能调用的语言。它还要求对数据有深刻的理解,因为这不是你的关系、线性表。(即使在 SQL 系统中,也需要一个严肃的数据人员(DBA))。MongoDB 和所有 NoSQL 系统也需要无模式数据的知识。(见我在 Medium 的文章:“使用 Mongoose 处理你的大数据的重大错误”。)这本身就是一门科学。复制和分片呢?索引使用?了解何时使用 map reduce 和所有其他要点。
c.然后就是 AWS。AWS 中有大量的技术。Lambda 就是其中之一。它变得非常受欢迎,但如果没有正确实施,可能会变成一场噩梦(特别是在公司成本方面)。那么对 AWS 的其他要求呢?简单的 AWS 堆栈包括实例、NAT 网关、S3 的使用以及 AWS 提供的无数技术。这本身就是一项巨大的任务,很容易失控。
d.我在回答中补充了一些其他花絮。redis——何时何地使用?怎么用?如何熟练地操作 it 和数据。
e.谁来负责数据安全?这本身就是一份全职工作,而且在开发周期中经常被忽视,这很可怕。(如果不深入这个主题,请参见我在 Medium 上的文章:“设计网络安全技术系统的 10 个初始步骤”)。
f.如果这还不足以说明,仅仅通过描述期望一个程序员能够做以上所有的事情并且做得很好是多么疯狂,我接着去了前端。你是在告诉我,一个人将知道上面列表中的所有内容,并且还能够准备一个具有规范 UI 和 UX 的体面前端?即使它没有反应过来,(也许是最难的),但角或 Vue,它仍然是一个巨大的想象力。我不在乎那个程序员有多“忍者”。
应该清楚的是,任何“堆栈”都可以被分解成最相关的部分。一旦这一堆知识被仔细剖析,什么是需要的,什么是不需要的就变得很清楚了。期望一两个“全栈”程序员对所有这些活动部分有一个完整和全面的理解是在给你的系统招致灾难。
4.朴素&简单狂妄 —是的,有一些栈(例如 WordPress,Wix 等。)可以一个人跑。然而,任何声称拥有全栈知识的程序员或 CTO,有时我听到过对许多编程语言、前端和数据库结构(混合了 SQL 和 NoSQL)的这种说法,都是极端的狂妄自大。
现实
现实很简单。俗话说,“鱼和熊掌不可兼得”。很少有人能把一个“完整的堆栈”管理到一个平庸的程度,更不用说优秀的程度了。我和这些杰出人士中的一些人很友好。相信我,这些人赚的钱比你的公司愿意支付的要多得多。
事实是你首先必须定义你的堆栈包含什么。如果我们坚持上面的例子,您的 NodeJS 程序员也可以处理 MongoDB 设置。但是他们会理解对安全的需求吗?我已经数不清有多少次在本地或者在 Atlas 上看到过 MongoDB 的设置,它完全不安全,需要一个马裤。这些程序员会知道当数据在传输时,他们必须对其应用安全措施吗?他们会理解 bCrypt 和 crypto 的区别吗?我可以继续下去,但让我们假设所有以上可以在一个人身上找到。前端呢?他们还将开发一个完整的前端(移动和网络),同时做好以上工作?
现实是,成功的团队有特定的工作。在所有堆栈中,您可以将其分为三个主要功能:
1.前端
2.后端
3.数据库
现实是专业知识的交叉。需要定义某些参数,尤其是关于 JSON 的参数,以及需要发送什么,哪一方将进行计算。
事实是随着你的公司对编程端的要求越来越高,你对程序员的期望也必须更加明确。贴一个广告,列出一系列语言、技术和需求,并称之为“需要全栈程序员”,并不能很好地说明这家公司。事实上,对于许多人来说,它应该敲响警钟,亮起红灯,说明该公司的确切专业知识以及它将如何取得成功。
现实情况是你和你的公司需要准确定义什么是需要的,需要什么样的程序员支持,并在现实的预算内工作。雇佣一个首席技术官和两个“全栈”程序员是不够的。
现实是——理智地面对现实和局限。
荒谬
你会雇佣一个懂 Python 的程序员做数据科学家吗?我非常希望答案是“不”。为什么?因为数据科学家需要一套技能,而 Python 或 Java/Scala 只是其中的一部分。那么,为什么你会考虑雇佣一个懂一点 NodeJS 的 Python 程序员来构建一个完整的前端、后端和数据库系统呢?这显然是荒谬的。
但是…但是…但是…你测试了他们!是的,你做到了。他们通过了 Python 测试、NodeJS 测试、DB 测试,甚至一些小型前端系统。这里一个表单,那里一个问题,一个响应站点——当然你会发现一个优秀的全栈程序员。它们是如此之好,以至于即使你改用 Golang 或者将 JAVA 引入其中,它们也会无缝地完成过渡。
那个 IOS 原生程序员?如果他们能做 IOS,他们也能做 Android,对吗?当然啦!他们将能够处理两个系统中的所有细微差别,包括从后端来回传输的数据。为什么不呢?
当你思考这个问题的时候,处于飞速发展的后端的人应该能够处理整个数据和安全系统。我的意思是这只是他们正在做的事情的一小部分。
简单的数学告诉你两个程序员可以做五个人的工作。你可以简单地保护你的预算,在公司眼里看起来像一个不可思议的英雄。你发现了“全栈”的诱惑。你也逐渐发现了通往荒谬期望和不可能任务的道路。如今有了令人难以置信的 IDE 和工具,程序员应该能够处理任何事情。对吗?不对!哦,这么错。
这就像期望首席技术官成为首席执行官,首席运营官和首席财务官合二为一。没有一个理智的人会建议做这样的事。为什么你会期望一个程序员去做呢?总之,你不应该期望一个“全栈”程序员什么都懂,什么都是专家。这太荒谬了。
失败的前奏
对于所有“全栈程序员”来说:
在你决定令我和这篇文章,尖叫和忽略整篇文章或投票否决它之前,请只阅读这一部分。那就做你想做的。
不是你。是这个系统把你扔进了不可能得到一份体面工作的境地,而没有声明你是一个“全栈程序员”。需要“全栈”的工作数量飞速增长。你需要工作。你别无选择,只能宣布你的“全面”能力,并在你知识的薄弱点上磨练。
然而,这种期望会迫使你陷入一种没有胜算的境地。你需要成为某些方面的专家,而不是所有方面。被迫钻研你知识薄弱的领域,会迫使你加强这方面的知识,但代价是你的其他知识。技术系统每三个月就会发生变化。任何一种语言提供给你的数量,对于一个人来说几乎是不可能跟上的。乘以一个“满栈”,你会发现自己溺水了。
然而你坚持对我说:“我是一个全栈程序员。我都知道。我能处理好一切。现实点吧。Fullstack 会留在这里,然后离开。”
所以,我会非常诚实地回答。全栈编程是个骗局。你将成为万事通,但什么都不会。当您的数据库无法响应,或者您的后端没有进行正确的计算,或者您的前端没有正确呈现数据,或者当您的系统遭到黑客攻击和破坏时,猜猜谁会受到指责?毕竟你是一个全栈程序员!
值得一提的是,成功的公司是那些认识到他们的每一部分都需要专业知识的公司。那些很快陷入困境或陷入巨大麻烦的公司是那些要求他们的程序员知道所有事情并能处理整个堆栈中所有事情的公司。
前端程序员不应该弄乱数据库结构和信息。后端程序员永远不要和前端打交道。在我们这个时代,安全问题必须由了解幕后情况的专家来解决。
有些技术可以而且可能应该结合到一项工作中。这并不意味着你已经成为一名全栈程序员。这仅仅意味着你扩展了你的专业知识,允许你在未来要求一份更大更好的工作。
远离“全栈”的诱惑。离远点。知道自己知道的,承认自己不知道的。这些是我最喜欢的英语单词。“我不知道”。不要试图欺骗系统。最终的结果是你,程序员,将会受到责备。
可以通过电子邮件联系到泰德:tedwgross@gmail.com;推特(@ tedwgross);LinkedIn;中等
分析@BillGates tweets Twitter API 的乐趣——从提取、数据可视化到情感分析的逐步分析
这是网络抓取和 API 系列的第二篇文章。第一封邮件来了。 请查看 。在这篇文章中,我们可以看到如何使用 twitter API 提取 Twitter 数据,然后使用 word cloud、饼状图进行一些基本的可视化,然后使用 Textblob 和 Vader 进行情感分析。
如果你没有 Jupyter,那么请继续安装 和 anaconda 。
让我们做以下事情
- 创建一个 twitter 帐户或使用您现有的 Twitter 帐户。
- twitter 开发者访问密钥请求
- 使用 Twitter 流 API 提取实时推文
- 使用 Tweepy 使用 Twitter 搜索/Rest API 提取历史推文
- 将数据加载到熊猫数据框中
- Wordcloud
- 分散文本
- 做一些统计分析和可视化。
- 使用文本块进行情感分析。
- 使用 VADER 进行情感分析
- 使用 Syuzhet® 进行情感分析
在使用 Twitter API 之前,我们需要一个 Twitter 帐户,然后请求一个开发者密钥。首先,如果你没有 twitter 账户,就创建一个。获取必要的开发人员密钥的步骤如下
- 转到https://developer.twitter.com/en/apps。
- 使用您的 twitter 帐户登录。如果你没有,那就创建一个。
3.登录后,创建一个应用程序。
4.填写所有必填字段。
5.您将获得以下凭据
- API 键
- API 密钥
- 访问令牌
- 访问令牌秘密
Twitter 提供了 2 个 API
- 串流 API
- 搜索 API 或者休息 API
在 twitter 开发人员网站上,可用的 python 相关包装器有
- 每秒 6000 条推文
- 每分钟 473,500 条推文。
- 每天有 5 亿条推文被发送
- 每年 2000 亿条推文。
- 每月有 3.26 亿人使用 Twitter
- 每天产生 2.5 万亿字节的数据。
- 地球人口的 50% 在社交媒体上,总共有27.89 亿人。
- 到 2025 年,据估计全球每天将产生 463 艾字节的数据——这相当于每天 212,765,957 张 DVD!
- 社交媒体占在线总时间的 33% 。
资料来源:Domo.com
来源:视觉资本家
来源:视觉资本家
1.流式 API
Twitter 搜索 API 和 Twitter 流媒体 API 非常适合那些只想访问 Twitter 数据进行轻量级分析或统计分析的个人。
Twitter 的流媒体 API 是推数据,因为推文几乎是实时发生的。流媒体 API 的主要缺点是 Twitter 的流媒体 API 只提供了正在发生的推文的样本。根据用户要求的标准和当前的流量,用户通过 Twitter 的流媒体 API 收到的推文占总推文的实际百分比变化很大。研究估计,使用 Twitter 的流媒体 API 用户可以预期以近乎实时的方式收到 1%的推文。(** 参考网站)**
开始安装所有必需的库之前—使用 pip 命令提示符
**pip install vaderSentiment
pip install nltk
pip install Textblob
pip install numby
pip install pandas**
之后,导入所有需要的库
首先,输入您的所有凭证。登录 twitter 账户,进入应用程序,然后填写上述所有信息。
请务必打印并检查您的凭证
您可以通过以下方式进行筛选
- 用户标识
- 用户名
- 按关键字查询
- 地理位置
按位置过滤,选择我按位置过滤的推文=旧金山
仅仅一条微博就包含了如此多的信息
JSON 对象看起来像
您也可以将其保存到 CSV 文件中
包含选定信息的 1 条 tweet 的输出
了解更多关于流式 API 的信息
Twitter API 的输出是 JSON 格式的。那么 JSON 是什么呢
有关 JSON 文件和 python 的更多信息,请查看 data camp 文章
现在我们可以下载 JSON 格式的文件了
将 JSON 文件上传到列表。
检查按键和推文本身
输出如下所示
该字典包含许多信息,如创建时间、用户 ID、转发时间、时间戳等。只需从字典中读取您需要的信息,然后继续进行文本挖掘和可视化。
2.搜索 API 或 REST API
Twitter 的搜索 API 让你可以从已经发生的推文中访问已经存在的数据集。对于个人用户,无论查询条件如何,您可以接收的最大推文数量是最后3200 条推文。对于一个特定的关键词,你通常只能对每个关键词的最后 5000 条推文进行投票。在某个时间段内,您还会受到请求数量的限制。Twitter 请求限制在过去几年中有所改变,但目前限制为 15 分钟内 180 次请求。
让我们将 tweepy 用于搜索 API。
- 在命令提示符下安装 tweepy
因为我已经安装了它,所以说这个要求已经满足了。
2.导入所需的库。
3.提供您之前获得的所有凭证
4.现在我们将提取推文,主要功能如下。我正在提取比尔·盖茨的微博。 最多允许 3200 条 。如果用户的推文超过 3200 条,我无法提取用户的整个推文历史。
下载的文件如下所示
5.现在,将数据上传到熊猫数据框中,以便进行数据可视化和情感分析
数据如下图所示
大约 80%的时间用于准备数据,只有 20%的时间用于分析。
6.对推文做一些基本的清理
来源:福布斯
7.现在我们可以进行基本的数据分析和可视化
我们来做一个词云。查看文档了解更多信息。
唯一必需的参数是文本,其他参数都是可选的。
输出是
你也可以做面膜
原图是
还有单词云
代码是
**There are 292731 words in the combination of all tweets.**
分散文本
一种工具,用于在中小型语料库中查找有区别的术语,并以性感、交互式散点图的形式呈现这些术语,这些散点图带有不重叠的术语标签。探索性数据分析变得更有趣了。
视觉是惊人的。我试着用推文做一个分散的文本。请参考 GitHub 的示例代码和场景。我认为我的散文肯定可以改进。
代码是
我喜欢 HTML 显示中的图表。我已经附上了截图。
推文中最常见的 20 个词
现在做一些基本的分析。找到最受欢迎和转发最多的推文。
代码是
输出
The tweet with more likes is:
Congratulations to the Indian government on the first 100 days of @AyushmanNHA. It’s great to see how many people h… [https://t.co/mGXaz16H7W](https://t.co/mGXaz16H7W)
**Number of likes: 56774**
The tweet with more retweets is:
RT @WarrenBuffett: Warren is in the house.
**Number of retweets: 39904**
最喜欢的推文是
推文来源——显然没有 iPhone 和 Android😃
**Twitter Web Client 1115
Hootsuite 907
Sprinklr 733
Twitter Media Studio 100
Twitter for Windows 89
Twitter for Windows Phone 56
Twitter for Websites 11
Twitpic 10
Twitter Ads 8
Spredfast 6
Twitter for Android 6
Panoramic moTweets 5
Mobile Web 3
Seesmic Look 3
Yfrog 1
Vine for windows phone 1
Facebook 1
Twitter Web App 1
Mobile Web (M2) 1
Name: Source, dtype: int64**
按年份分类的推文
2013 年是盖茨发 445 条推文的一年,2015 年是 409 条。最低的是 2011 年,有 125 条推文。
**2013 445
2015 409
2018 370
2014 357
2016 338
2012 329
2017 319
2010 230
2019 135
2011 125**
按月推文
4 月是他发微博最多的月份,有 329 条,最少的是 11 月,有 196 条
**Apr 329
Mar 305
May 292
Feb 283
Jan 282
Jun 254
Oct 236
Sep 234
Dec 227
Aug 212
Jul 207
Nov 196**
每日推文
周三是他发了将近 609 条推文的一天,接下来是周四,有 586 条。周末是最低的😄
**Wednesday 609
Thursday 586
Tuesday 549
Friday 521
Monday 389
Saturday 239
Sunday 164**
每小时的推文:
大多数推文是在下午。最大值在下午 5.00 左右有 297。甚至他在午夜或凌晨 1 点发微博😀。AM 推文很少。
**17 297
14 250
21 230
16 219
20 212
18 202
15 199
22 193
13 188
23 163
19 154
0 147
12 137
1 90
6 54
4 53
2 53
3 52
5 48
8 39
7 30
11 27
9 11
10 9**
多年来的收藏计数和转发
收藏和转发直方图
Fav 计数— Seaborn
情感分析
图片来源:媒体文章
什么是情感分析?
情感分析也被称为观点挖掘是自然语言处理 (NLP)中的一个领域,它建立了试图识别和提取文本中观点的系统。通常,除了识别意见,这些系统还提取表达的属性,例如:
- 极性:如果说话人表达的是正面或负面的意见,
- 主语:正在谈论的事情,
- 意见持有人:表达意见的个人或实体。
在情感分析系统的帮助下,这种非结构化信息可以自动转换为公众对产品、服务、品牌、政治或人们可以表达意见的任何主题的意见的结构化数据。这些数据对于市场分析、公共关系、产品评论、净推广者评分、产品反馈和客户服务等商业应用非常有用。
一些 Python 情感分析 API 和库
- Scikit-learn
- NLTK
- 空间
- 张量流
- Keras
- PyTorch
- Gensim
- 波尔格洛
- 文本块
- 图案
- 词汇
- 斯坦福 CoreNLP Python
- 蒙托林瓜
通过 TextBlob 进行情绪分析:
TextBlob 是一个用于处理文本数据的 Python (2 和 3)库。它提供了一个简单的 API,用于处理常见的自然语言处理(NLP)任务,如词性标注、名词短语提取、情感分析、分类、翻译等。
代码是
**Percentage of positive tweets: 63.23192672554792%
Percentage of neutral tweets: 26.66012430487406%
Percentage of negative tweets: 10.107948969578018%**
产量在 90%以上
饼图是
维达的情绪分析:
VADER (Valence Aware 字典和情感推理器)是一个基于词典和规则的情感分析工具,专门针对社交媒体中表达的情感。它在【麻省理工学院许可】下是完全开源的
计算情感得分的代码与上面类似。只有图书馆不一样。我们只考虑复合分数。
**Percentage of positive tweets: 66.47039581288846%
Percentage of neutral tweets: 20.870134118416747%
Percentage of negative tweets: 12.659470068694798%**
SA —来自文本 blob 的情感分析得分
VSA —来自维德的情绪分析评分
Syuzhet 的情感分析
这个软件包附带了四个情感词典,并提供了一种方法来访问斯坦福大学 NLP 小组开发的健壮但计算昂贵的情感提取工具。
这个包有 R 版本,代码如下。我参考了示例代码并做到了这一点。如果你想要更多的细节,请检查我提供的链接,也检查 Rcran 项目。
结论
希望你喜欢阅读这篇文章。现在你知道使用 Twitter API 提取数据有多简单了——流媒体和搜索。只需几行代码,您就可以从 Twitter 获取数据,并使用熊猫进行所有分析。在下一篇文章中,我会写一些关于 scrapy 和 selenium 的内容。我也会很快更新我的 GitHub 并提供链接。同时,如果你想提供反馈或建议,或者有任何问题,请发送电子邮件给 epmanalytics100@gmail.com。再次感谢你阅读我的帖子👍
我发现这张图表很有帮助。(来源:FT)
Jupyter 备忘单(来源:Datacamp)
熊猫小抄 1(来源:数据营)
Matplotlib 备忘单(来源:Datacamp)
再次感谢你阅读我的帖子😃