TowardsDataScience 博客中文翻译 2020(一千零一十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 的 XPath

原文:https://towardsdatascience.com/xpath-for-python-89f4423415e0?source=collection_archive---------0-----------------------

入门

学习网页抓取的规则

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

照片由大卫·帕施克Unsplash 上拍摄

ML 路径语言(XPath)在 web 抓取和自动化领域是一个非常不受重视的工具。想象一下 RegEx,但是对于网页来说——那就是 XPath。

网页的每个元素都是由文档对象模型(DOM)组织的。DOM 是一个类似树的结构,其中每个元素代表一个节点,有到父节点和子节点的路径。

XPath 为我们提供了一种快速遍历这棵树的语言。而且,像 RegEx 一样,我们可以向节点选择添加逻辑,使我们的查询更强大。

在本文中,我们将涵盖:

**> XPath Essentials
**  - Testing Our Queries
  - The Root
  - Paths in XPath**> Navigating the Tree**
  - Node Indexing
  - Extracting XPaths from the Browser**> XPath Logic****> Example with Python**

XPath 基础

测试我们的查询

首先,在我们做任何事情之前,我们需要理解如何测试我们的 XPath 字符串。幸运的是,我们可以在网络浏览器中这样做。

在整篇文章中,我将使用 Chrome,但在所有现代浏览器中,这个过程都非常相似。

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

点击 Chrome >更多工具>开发者工具中的选项下拉菜单。

在我们的网页上,我们打开开发者工具——在 Windows 上点击 Fn+12 ,或者从浏览器选项菜单中打开(请参阅上面的 Chrome)。

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

我们可以使用开发人员工具中的搜索栏来检查 XPath 字符串是否有效。

接下来,我们单击 ctrl+F 在元素窗口中打开搜索栏。在这里,我们可以通过字符串、选择器或 XPath 进行搜索。

这个方法是快速测试 XPath 查询的最简单的方法。

如果我们的查询匹配某些内容,那么该元素将被突出显示为黄色。当我们的查询匹配多个元素时,我们可以使用搜索栏右侧的箭头在它们之间循环!

让我们从查询的最开始开始。以//div为例,//是什么意思?

每个 XPath 查询都从 XML 树的根——最顶层的元素开始。对于 HTML 文档,这是<html>标签。

现在,如果我们写html//div,我们就说“寻找任何属于divhtml的后代节点”。

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

页面元素的树形表示。

结果是,我们的查询将同时找到**html**/**div****html**/body/div/div/article/div/**div**。这是因为在这两种情况下,我们看到的是html的后代div

因为我们的 XPath 查询总是从根(html)开始,所以我们不需要编写html//div。相反,我们写//div

导航树

路径表达式

我们刚刚使用的例子叫做路径表达式。有几个这样的例子,它们非常有用:

  • // —匹配任何后代节点
  • / —仅匹配子节点(直接跟随另一个节点的节点):

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

为了匹配 span 元素,我们需要在使用单个 / 时包含所有子节点。

  • . —匹配当前活动节点(稍后将详细介绍)
  • .. —匹配当前活动节点的父节点
  • @ —选择当前节点的一个属性(例如href):

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

我们可以使用属性选择器 @ 按属性进行搜索。

有了这些路径表达式的组合,我们可以轻松地遍历 XML 树。

例如,回到我们的示例 HTML 部分——我们可以通过找到带有属性class="u-textScreenReader"span标签来选择a标签,并沿着树向上遍历到它的父节点,如下所示:

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

…语法允许我们在 XML 树中向上移动。

节点顺序

我们 DOM 中的每个节点都有编号。如果我们有一个包含五个li条目的列表ul,我们可以通过从 1 到 5 的索引来访问每一个条目:

<ul>
    <li>London</li>
    <li>Miami</li>
    <li>New Dehli</li>
</li>

如果我们查询//ul/li[1],我们将返回<li>London</li>——注意,值是而不是零索引的。XPath 索引从1开始。

从浏览器复制 XPath

Chrome(可能是大多数现代浏览器)中一个非常方便的特性是直接从元素窗口获取节点的 XPath。

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

右键点击一个元素,点击复制>复制 XPath

为此,我们右键单击需要 XPath 的元素,然后单击 Copy > Copy XPath 并粘贴该元素的 XPath。我们的span元素返回:

//*[[@id](http://twitter.com/id)="_obv.shell._surface_1600536527994"]/div/div[1]/div[2] /div[1]/div[1]/a/span[1]

或者,我们可以复制完整的 XPath,它提供了从根到元素的完整路径。对于我们的span元素,这看起来像:

/html/body/div[1]/div[2]/div/div[1]/div[2]/div[1]/div[1]/a/span[1]

高级逻辑

现在,你是否想把下面的方法称为“先进”是值得商榷的。

然而,我证明了这一点,因为通过单独使用前面的路径表达式,我们可以非常容易地遍历 DOM。在许多情况下,我们不再需要任何东西。但时不时地,这些“先进”的方法会非常有用。

功能

有许多 XPath 函数我们不会在这里讨论,但是一些最常见的是:

  • contains —在字符串B中搜索字符串A,其中contains(B, A):

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

使用 contains 函数的例子,我们也可以使用 **contains(text(),‘Home’)**并得到相同的结果。图片作者。

  • not —我们用它来否定部分查询,比如我们想要所有不包含类svgIcon-usespan元素:

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

我们使用而不是来选择没有类**‘u-textScreenReader’的 span 节点。**

  • boolean —与not相等且相反,如果我们希望所有的span元素都包含一个svg子节点:

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

我们使用布尔来选择带有类**‘u-textScreenReader’的跨度节点。**

  • starts-with —类似于contains,但不包含字符串A,字符串B必须以字符串A开头。
  • 我相信你能解决这个问题

这些函数只是 XPath 表面的一小部分。一些我们还没有涉及到的项目(我已经添加了关于它们的文章的链接):

硒中的 XPath

Selenium 是熟悉 Python 中 XPath 的最佳方式(它也适用于许多其他语言)。如果你不熟悉它,我写了这篇文章介绍框架的设置和基础——它非常容易使用!

一旦有了 Selenium 设置,我们就可以使用find_elements_by_xpath方法选择满足 XPath 查询的网页的所有元素。

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

我们将在 webscraper.io 上尝试一下。在那里,我们可以看到每一项都包含在一个带有class="thumbnail"div元素中。这里,我们重点介绍了 Acer Aspire 产品。

所以,回到 Selenium 和 XPath。首先,我们需要初始化我们的 web 驱动程序,并导航到 Web Scraper 培训网站:

from selenium import webdriver
driver = webdriver.Chrome('chromedriver.exe')
driver.get('[https://webscraper.io/test-sites/e-commerce/scroll](https://webscraper.io/test-sites/e-commerce/scroll)')

现在,我们需要选择类为thumbnail的所有div元素:

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

我们可以很容易地通过选择任何带有 //div 的 div 来选择这些,并且只过滤那些具有带有 [@class=‘thumbnail’] 的缩略图类的 div。

shop_elems = driver.find_elements_by_xpath(
    "**//div[@class='thumbnail']"**
)

Selenium 网站元素

如果我们打印出shop_elems的值,我们将返回一个 WebElement 对象的列表:

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

Selenium 将返回我们选择作为 WebElement 对象的每个元素。

太好了,我们有了我们的商店容器 WebElements —现在做什么?嗯,我们可以将这些对象视为单独的 XML 树。

我们使用 WebElement get_element方法结合By.XPATH来实现这一点,这是一个新的导入:

from selenium.webdriver.common.by import Byshop_elems[0].get_element(By.XPATH, *<XPath Query Here>*)

这里,我们将div[@class="thumbnail"]的第一个实例设置为活动的,我们可以使用.在 XPath 查询中选择当前活动的节点。

我们可以使用这个新方法遍历页面上的每个条目容器,并迭代地提取每个条目的细节!

使用活动节点的 XPaths

让我们尝试在shop_elems中提取每个 web 元素的项目名称。

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

项目名称位于 a 子代 a 标签的标题文本字段中。

回到浏览器,我们可以在 descendant <a>标签中找到项目名称。由于没有其他的后代<a>标签,我们可以只使用//a来选择这个元素。这给了我们//div[@class='thumbnail']//**a**

在我们的代码中,shop_elems中包含的 WebElements 将div[@class='thumbnail']设置为活动节点,我们用.选择它:

shop_elems[0].find_element(By.XPATH, "**.//a**")

要获得商品名称,我们只需访问对象的text值。我们可以将它集成到一个 for 循环中,从我们的 WebScraper.io 电子商务页面中提取每个商品名称:

仅此而已;我们用 XPath 和 Selenium 提取了电子商务首页上的商品名称。我们可以结合更多的 XPath 查询来提取更多的信息,比如价格、评级、评论数量等。

结束了

这就是对 XPath 和 Selenium 的介绍。我们涵盖了:

  • DOM、节点和分支
  • 测试 XPath 查询— Fn+12Ctrl+F
  • 导航树
  • 从浏览器中提取 XPaths
  • 一些更高级的 XPath 逻辑

正如我以前说过的,这只是触及了 XPath 的表面,我肯定会推荐您从事自己的小型 web 抓取/自动化项目并学习更多!

我希望你喜欢这篇文章。如果您有任何想法或问题,请通过 Twitter 或在下面的评论中告诉我!如果你想要更多这样的内容,我也会在 YouTube 上发布。

感谢阅读!

*除非另有说明,所有图片均为作者所有。

Pytorch 中从头开始的 xResNet

原文:https://towardsdatascience.com/xresnet-from-scratch-in-pytorch-e64e309af722?source=collection_archive---------31-----------------------

从你的 ResNet 架构中挤出一点额外的东西。

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

丹尼尔·库切列夫在 Unsplash 上拍摄的照片

ResNet 架构由何等人于 2016 年提出,已被证明是计算机视觉领域最成功的神经网络架构之一。大约三年后,由亚马逊网络服务公司的佟鹤领导的团队建议对模型的结构进行一些调整,这对模型的准确性有不可忽视的影响。

在这个故事中,我们从零开始实现 ResNet 架构,考虑了“卷积神经网络图像分类锦囊”出版物中介绍的调整。根据杰瑞米·霍华德的建议,最终的模型被称为 xResNet,我们可以把它看作是 ResNet 的变种或者是架构的下一个版本。

属性

代码大部分取自 fast.ai 课程fast.ai 库。然而,我试图简化它,并以一种支持叙述的方式组织它。

学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!

ResNet 架构

为了更好地理解 xResNet 中引入的调整背后的原因,我们简要讨论一下原始的 ResNet 架构。该模型的总体视图如下图所示。

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

原始 ResNet 架构

首先,我们有输入杆。该模块由一个7x7卷积层组成,具有 64 个输出通道,步长为2。接下来是3x3最大池层,步长也是2。我们知道卷积后图像的输出大小由下面的公式给出。

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

在这个公式中,o是图像的输出大小(o x o),n是输入大小(n x n),p是应用的填充,f是滤波器或内核大小,s是步幅。因此,输入词干将图像的宽度和高度减少了4倍,2来自卷积,2来自最大池。它还将其通道大小增加到 64。

随后,从*阶段 2 开始,*每个模块从一个下采样块开始,随后是两个剩余块。下采样块被分成两条路径:A 和 b。路径 A 具有三个卷积;两个1x1和中间的一个3x3。第一个卷积的步幅为2,将图像大小减半,最后一个卷积的输出通道是前两个卷积的四倍。路径 B 的作用是使输入图像的形状与路径 A 的输出相匹配,这样我们就可以将两个结果相加。因此,它只有一个步幅为21x1卷积和与路径 a 的最后一个卷积相同数量的通道

残差块类似于下采样块,但不是抛出一个步幅2卷积,而是在每个阶段的第一层,始终保持步幅等于1。改变每个阶段中的剩余块的数量,可以得到不同的 ResNet 模型,例如 ResNet-50 或 ResNet-152。

xResNet 调整

在 ResNet 架构中有三种不同的调整来获得 xResNet 模型; ResNet-BResNet-CResNet-D

ResNet-B 首先出现在 ResNet 的 Torch 实现中,它改变了下采样块的路径 A。它只是将步幅2移动到第二个卷积,并保持第一层的步幅1很容易看出,如果我们在第一个卷积中有步幅 **2** ,也就是一个 **1x1** **卷积,我们会丢失四分之三的输入特征图。**将其移动到第二层可以缓解这个问题,并且不会改变路径 a 的输出形状。

在 Inception-v2 中提出的 ResNet-C 去除了网络输入干中的7x7卷积,并用三个连续的3x3卷积来代替。第一个的跨距为 2,最后一个有一个64通道输出,后跟一个跨距为23x3最大池层。最终的形状是相同的,但是 **3x3** 卷积现在比 **7x7** 卷积要有效得多,因为 **7x7** 卷积比 **3x3**卷积贵 5.4 倍。

ResNet-D 是新建议,是 ResNet-B 的逻辑结果。在下采样块的路径 B 中,我们还有步幅 **2** **1x1** **卷积。我们仍然把四分之三的有用信息扔出窗外。**因此,作者用步幅22x2平均汇集层和其后的1x1卷积层替换了该卷积。下图总结了这三个调整。

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

xResNet 调整架构

履行

在本文的最后一部分,我们用 Pytorch 实现了 xResNet 架构。首先,让我们导入 torch 库并定义conv辅助函数,它返回一个 2D 卷积层。

现在,为了完成卷积块,我们应该添加初始化方法、批量标准化和激活函数——如果需要的话。我们使用上面定义的conv函数来创建一个完整的块。

我们看到,我们希望将批处理规范化层的权重初始化为10。这是我们稍后将回头讨论的内容。接下来,我们定义 xResNet 块。

在 xResNet 块中,我们有两条路径。我们称路径 A 为卷积路径,路径 B 为身份路径。卷积路径分为两种不同的情况;对于 xResNet-34 和更低版本,我们只得到两个3x3卷积层,而不是每个阶段有三个卷积。

此外,在任何 xResNet 架构中,我们都不会对每个块的最终卷积层使用激活函数,并将批量归一化权重初始化为0完成第二个是为了允许我们的网络容易地学习有效地消除整个块的身份函数。这样,我们就可以设计更深层次的网络架构,在这种架构中,激活可以在模型中更深入地进行,而不用担心爆炸或消失的梯度。

在路径 B(身份路径)中,如果有下采样模块,我们使用步长的平均池21x1卷积,否则我们只让信号流过。最后,对于激活函数,我们使用默认的 ReLU 激活。

将所有这些放在一起,我们创建了 xResNet 体系结构,用 stem 输入和一些辅助方法来初始化模型。

我们现在准备定义模型的不同变体,xResNet-18、34、50、101 和 152。

结论

在这个故事中,我们简要介绍了 ResNet 架构,这是计算机视觉中最有影响力的模型之一。然后,我们进一步解释了一些技巧,这些技巧通过提高其准确性使架构更加强大。最后,我们使用 PyTorch 用代码实现了调整后的 xResNet 架构。

在后面的章节中,我们将会看到如何使用这个模型来解决一个有和没有迁移学习的相关问题。

我叫 Dimitris Poulopoulos,是希腊比雷埃夫斯大学*BigDataStack的机器学习研究员和博士©。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲中央银行、经合组织和宜家等主要客户设计和实施人工智能和软件解决方案。如果你有兴趣阅读更多关于机器学习、深度学习和数据科学的帖子,请在 twitter 上关注我的 LinkedIn@ james2pl**。***

XRL:可解释的强化学习

原文:https://towardsdatascience.com/xrl-explainable-reinforcement-learning-4cd065cdec9a?source=collection_archive---------24-----------------------

有前途的 XRL 方法的详细概述

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

可解释人工智能的挑战。资料来源: Gunning,D. (2017)。可解释的人工智能(xai)。国防高级研究计划局(DARPA),nd Web2 ,2。

随着人工智能技术的大规模部署以及自主执行,在人工智能中灌输可解释的属性变得势在必行;这将导致用户信任人工智能技术。如果用户能够信任该技术,他/她就会放心地使用该技术,并且为了使该技术可信,它需要是透明的。如果一个模型能够提供关于其预测和决策的合理性,那么人工智能中的这种透明性就可以实现。可解释性在强化学习领域更为重要,在这一领域中,代理可以在没有任何人工干预的情况下自行学习。

这篇文章的目的是让读者了解不同的研究小组目前所追求的 XRL 技术。关于 XRL,需要考虑的一件重要事情是,该领域的大部分工作都应该牢记等式中人的一面。因此,为了促进 XRL(和 XAI)的发展,应该采取跨学科的方法来关注没有特定领域专业知识并且正在利用人工智能技术的人类用户的需求。关于这篇文章,假设读者对强化学习理论有中等水平的了解,并对可解释的人工智能有基本的理解。

接下来,让我们首先对 XRL 技术进行分类。与 XAI 方法类似,根据从 XRL 技术中提取信息的范围和时间,XRL 技术可以分为以下几类。

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

图一。XRL 技术的分类

以下是由研究团队开发的一些潜在的 XRL 方法,显示了有希望的线索。

多任务强化学习中的(局部的、内在的)分层的和可解释的技能获取

多任务强化学习中的分层和可解释技能获取在【1】中描述了通过两层分层结构在策略设计中引入模块化来扩展多任务强化学习。该框架从根本上基于这样一个事实,即一个复杂的任务需要不同的技能,并且由几个较简单的子任务组成。[1]训练他们的模型在《我的世界》执行对象操作任务,即在《我的世界》中找到、获得、放置或堆叠某种类型的黑色。该模型利用“优势行动者-批评家” (A2C)使用非策略学习进行策略优化。该模型具有分层结构,因为每个顶层策略都可以分解为底层操作。在《我的世界》的例子中,堆叠鹅卵石块的任务代表一个复杂的任务,然后代理将其分解为寻找鹅卵石块获得鹅卵石块放置鹅卵石块的动作。框架的可解释性来自于每个任务(例如堆叠鹅卵石块)都由人类指令描述,并且经过训练的代理只能通过这些人类描述来访问学到的技能,使得代理的策略和决策是人类可解释的。

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

图二。给定任务的多级分层策略示例—堆叠两个蓝色块。每个箭头代表某个策略生成的一个步骤,箭头的颜色表示源策略。请注意,在每一步,策略要么为较低级别的策略发出指令,要么直接采取行动。来源:【1】中的图 1

此外,该框架集成了随机时态语法 (STG) 方法来对任务的时态关系和优先级进行建模(例如,在一个鹅卵石块堆叠在另一个鹅卵石块之上之前;你必须先找到一块鹅卵石,捡起来,然后找到另一块鹅卵石,手上的那块放上去。因此,该框架的关键思想是将复杂的任务分解成更简单的子任务。此后,如果这些更简单的子任务可以使用代理已经学习的策略或已经获得的技能来解决,则没有学习发生;否则,需要学习新的技能来完成新的动作。这个框架可以用下图来表示。

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

图三。请注意,这里的指令Get white是由人类给出的,这使得该策略易于理解。 来源:图 2 中【1】

假设

G 为任务集,其中每个任务 g 代表人的指令(例如上图中的‘Get white’)。在[1]中, g = ⟨ 技能指令 ⟩双字元组用于描述 Minecraft 中的对象操纵任务。由于它是一个多任务框架,不同任务的目标奖励不同。因此 R(s,g) 用于描述特定任务的奖励函数,其中s=状态*。最初,代理人是受过码头政策训练的πₒ,负责码头基本任务。任务集随着人类指导者不断给出指令而连续增加,使得gₒgₗ⊂…⊂gₖ、* 导致如图 2 所示的策略学习。还要注意,在阶段 kh=k-1 ,我们将gₕ定义为针对*的基本任务集,并将πₕ定义为πₖ.的基本策略对于策略的学习和代理的增强,需要来自人类的以任务形式的弱监督。因此,在多任务强化学习中,需要来自人类的任务强化来获得分层的和可解释的技能。*****

分层策略(注意这里 h=k-1)

如在[1]中详述的,分层策略背后的主要思想是当前任务集【gₖ】可以被分割成几个子任务,这些子任务可以出现在基本任务集【gₕ】中,并且可以使用基本策略πₕ.来解决结果,不是映射当前状态和人工指令来执行如图 3(a)的扁平策略结构中所描述的动作,分层策略设计通过重用基本策略来执行被表征为当前阶段中的子任务的基本任务来利用。处于阶段 k、 πₖ的全局策略由四个子策略组成:“用于执行先前学习的任务的基本策略、管理全局策略和基本策略之间的通信的指令策略*、允许全局策略直接执行动作的增强平面策略以及决定全局策略将主要依赖于基本策略还是增强平面策略的切换策略”— [1].指令策略负责映射当前状态 sggₖggₕ,因此其主要功能是向基地策略πₕ传达关于哪个基地任务 的信息如前所述 g 由两个有条件地相互独立的东西(技能和来自指令短语的项目)组成,因此***

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

当执行某个任务无法实现基本策略时,增广扁平化策略进入动作映射状态 s 和任务 g 到动作 a、以便在中学习新技能解决新任务。上述框架中的切换策略在选择何时实施基本策略和何时实施扩展扁平策略时扮演中介者的角色。**切换策略输出一个二进制变量 e ,这样当 e=0,全局策略 πₖ遵循基本策略,当 e=1, πₖ遵循增强平坦策略。**

因此,在每一步,模型首先从切换策略中采样二进制变量*【eₜ】,并从指令策略中采样新指令**【gˡ】,以便我们的模型可以从基本策略中采样动作。下图总结了每个阶段的流程。*

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

每一步的分级策略步骤。来源:[1]

随机时态语法

随机时态语法用于确定不同任务中的时态关系。例如,要堆叠一个对象,我们首先需要找到、拾取并放置该对象。STG 作为修改分层策略中提到的开关指令策略的先验,即采样 eₜ 。在[1]中,STG 在任务的每一步 k > 0 处由下式定义:1)转移概率,**

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

和 2)的分布

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

因此,将 STG 合并到分层策略中,我们得到如下改进的开关指令策略:**

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

通过将 STG 纳入分层策略,改进了交换机和指令策略。来源:[1]

所得到的框架展示了更高的学习效率,能够在新环境中很好地概括,并且本质上是可解释的,因为它需要弱的人类监督来给予代理指令以便学习新技能。

通过因果透镜的(局部的,事后的)可解释的强化学习

认知科学提出,为了理解或解释一种现象,人类建立因果模型来编码我们周围发生的事件的因果映射。在建立因果模型时,我们不断地问这个问题:为什么是或者为什么不是。继续这个逻辑,通过在【2】中详述的因果透镜可解释的强化学习试图建立一个结构因果模型,用于通过感兴趣的变量生成对无模型强化学习代理的行为的因果解释。为了产生解释,对这个结构因果模型进行反事实分析。通过因果透镜的可解释强化学习还调查用户通过解释获得的理解、用户对解释的满意度以及通过解释在用户中诱发的对无模型强化学习代理的信任。在通过因果透镜的可解释强化学习中,为基于 RL 代理的马尔可夫决策过程 (MDP)结合了动作影响模型,扩展了结构因果模型 (SCMs),增加了动作。首先,让我们了解一下 SCMs。

结构因果模型

SCMs 的结构因果模型在 Halpern 和 Pearl 2005 中介绍。SCMs 使用外生/外部和内生/内部随机变量描绘世界;这些变量中的一些可能具有因果关系,这些关系使用一组结构方程来表示。形式上,为了描绘 SCMs,我们必须首先定义一个签名 S ,它是一个元组 (U,V,R) ,其中是外生变量的集合,是内生变量的集合, R 表示指定范围的函数

形式定义:**一个结构因果模型是一个元组 M=(S,F) 其中 F 表示结构方程组,一个对应一个 X∈ V 这样

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

根据*【U∪V中的其他变量给出 X 的值。换句话说,给出了模型中其他变量的 X 的值。另外,上下文 𝔲 被定义为每个外生变量 u∈ U 的唯一值的向量。一个情境是一个模型-语境对 (M,)。根据结构方程给模型的变量赋值导致实例化。事件 φ实际原因由内生变量及其值表示。如果内生变量不同,则事件 φ 不会发生,因此在事件 φ的实际原因中嵌入了一些反事实背景。***

行动影响模型

行动影响模型背后的主要意图是便于从行动如何影响环境来解释代理人的行为。因此,我们将 SCMs 的想法扩展到行动影响模型,将行动纳入因果关系。**

形式定义:**一个动作影响模型是一个元组 (Sₐ,F) 其中 Sₐ 是用一组动作扩展 SCM 签名的签名即动作影响模型中的 Sₐ 然而在这里 F 对于每个 X∈ V 有多个值,这取决于𝕒应用的唯一动作集。 于是, F_{X,}刻画了作用【𝕒】时对 x 的因果作用。一组奖励变量xᵣ⊆v被分配给 sink 节点。****

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

*图 4。一个星际争霸 2 特工的行动影响图。**资料来源:图 1[2]。*注意,这里我们已经考虑了状态变量的有限集合以及动作的有限集合。取决于独特的输入动作(表示为边),对于每个状态变量(表示为节点)存在一组结构方程。例如,当应用动作 Aₘ 时,状态变量 Aₙ 受到状态变量 SB 的影响,因此结构方程 F_{Aₙ,Aₘ} (S,B) 捕捉因果关系。

从行动影响模型中生成解释

解释包括解释和要解释的事件和解释和证明事件发生的原因。解释生成需要以下步骤:1)定义动作影响模型;2)在强化学习中学习结构方程;最后,3)为外植体生成外植体。通过因果透镜的可解释强化学习主要集中于对形式为‘为什么行动 A 的问题提供解释?’或为什么不动作***?’。同样,它将强化学习背景下的解释*分为两种类型:1) 完全解释;和 2) 最低限度的完整解释。现在让我们正式定义它们。**

**为什么?问题

完整解释:**一个完整解释可以在实际实例化 M_{V←S} 作为一个元组***【xᵣ=xᵣ、Xₕ=xₕ、xᵢ=xᵢ】下给出一个动作𝕒,其中是通过移动得到的奖励变量组成的向量 Xₕ 是由出现在动作𝕒的头节点的变量组成的向量; Xᵢ 是动作影响图中从头到尾节点的中间变量组成的向量;而 、xᵣ、 代表通过*m _ { v←s }实际实例化给出的关联变量的值。

因此,根据上述定义的完整解释提供了从行为𝕒到将与行为𝕒.相关联的任何未来报酬变量的完整因果链例如,动作 、Aₛ 的因果链在图 4 中显示为黑色。在这种情况下,完整的解释元组将是*(【s = s】,【Aₙ=aₙ】,【Dᵤ=dᵤ,d _ { b } = d _ { b })*。深度优先搜索算法可用于从动作的头节点到所有汇聚节点遍历动作影响图。

****最小完整解释:**对于较大的图,中间节点的数量越多,可能会导致混乱。在这种情况下,最小完整解释可能会派上用场。最小完整解释定义为元组 (Xᵣ=xᵣ、Xₕ=xₕ、xₚ=xₚ)其中 Xᵣ=xᵣXₕ=xₕ 类似于前面的定义,代表变量的向量,这些变量是的直接前身。选择直接前辈是因为他们描述了奖励的直接原因。请注意,在中要考虑的中间节点的数量最小完整解释取决于应用以及用户的知识。

‘为什么不?’问题

通过比较事件发生的因果链和解释和(反事实行动),可以产生反事实解释。首先,让我们定义反事实实例化,在此情况下,我们分配最佳状态变量值,使得反事实动作将被选择。

反事实实例化:**关于反事实行动 𝕓的反事实实例化可以从模型 M_{Z←S_{z}} 中给出,其中 Z 利用结构方程实例化行动𝕓的所有前趋变量以及落入𝕓因果链的后继变量。**

极小完全对比解释:**对于一个动作𝕒在实际实例化m _ { v←s }下给出极小完全解释 Y=y 对于一个动作𝕓在反事实实例化 M_{Z←S_{z}} 下给出极小完全解释,我们 Xᵣ=xᵣ) 其中 是满足条件(xˡ=xˡ)∩(yˡ=yˡ)≦的变量的最大集合 XY 。 此后我们对比 ( 差异条件)。注意,这里的 Xᵣ 对应于𝕒.行动的奖励节点

因此,最小完成对比解释用于提取行动𝕒的实际因果链和行动𝕓.的反事实因果链之间的差异

例子

检查图 4 所示的星际争霸 2 代理的动作影响图。利用这个图表,我们将尝试回答这个问题:
为什么要建造补给站(Aₛ)?为什么不建兵营(A_{b})?

m=【w = 12,S = 3,B = 2,Aₙ = 22,Dᵤ = 10,D_{b} = 7】为实际实例化,mˡ=【w = 12,S = 1,B = 2,Aₙ = 22,Dᵤ = 10,D_{b} = 7】为反事实实例化。实现差分条件,我们得到最小完全对比解释为
([S = 3],[S = 1],[Dᵤ = 10,D_{b} = 7])。通过比较[S=3]和[S=1],可以从 NLP 模板中得到一个解释:因为目标是增加被摧毁的单位(Dᵤ)和被摧毁的建筑(D_{b}),所以建造补给站(Aₛ)来增加补给数量是有意义的。注意,变量的值是通过学习结构因果方程在实例化过程中获得的。

学习结构因果模型

给定描述变量之间因果关系的有向无环图,在强化学习代理的训练期间,结构方程可以被学习为多元回归模型。通过将*【eₜ=(sₜ,aₜ,rₜ,s_{t+1})*** 保存在一个数据集***【dₜ={e₁,…,eₜ}*** 中的每个时间步,可以实现经验回放。然后,利用回归学习器𝕃.更新结构方程 F_{X,A} 的子集注意,我们只更新与指定动作相关的变量的结构方程。例如,参考图 4,对于任何具有动作的经验帧,只有等式 F_{S,Aₛ}(W) 将被更新。注意,任何回归学习器都可以用作学习模型𝕃,例如 MLP 回归器。**

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

图五。学习结构方程的算法。来源:[2]

如需查看更多主题,如该技术的计算和人类评估及其结果,请参考【2】。

(局部的,事后的)对可解释的强化学习代理的远端解释

[扩展到通过因果透镜的可解释强化学习

尽管使用动作影响模型生成的解释击败了标准的状态-动作模型 , 结构方程在计算任务预测准确性方面表现不佳。因此,用结构方程来模拟变量之间的因果关系,在[4] 中详细描述的对可解释的强化学习代理的的远端解释建议使用来自决策树的决策节点来生成利用因果链的解释。

生成因果解释的决策树

用于生成远端解释的模型由决策树中的一个决策节点组成,该决策树描绘了代理的完整策略,并与前面部分的动作影响模型中的因果链相链接。假设𝕋代表一个决策树模型。然后在训练强化学习代理的同时,我们通过将每个阶段的*【eₜ=(sₜ,aₜ)存储成一个数据集【dₜ= {e₁,…,eₜ}来实现经验回放。此后,我们从 D 中统一抽取小批量样本,以 sₜ 作为输入,以 aₜ 作为输出,来训练𝕋。对其节点数量没有限制的决策树将导致混乱和压倒性的解释,因此在[4]中,通过将叶子的数量设置为等于代理域中可能的动作的数量来限制决策树𝕋的增长。在[4]中,评估表明,与没有约束的情况相比,约束决策树𝕋几乎不影响计算任务预测精度。为了存储状态为的决策树𝕋的决策节点,模型从根节点开始遍历决策树,直到到达叶节点,在此期间,模型存储其路径中的模式。例如,从图 6 中, 、AₙB 是动作 、Aₛ 的决策节点。注意,决策节点代表代理状态空间的特征变量。*

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

图六。从与行动影响模型的因果链(右)相链接的决策树(左)中生成远端解释。资料来源:图 3。

现在,我们将从决策树中为 定义最小完全解释‘为什么?’*提问提问。*

极小完全解释:给定一组决策节点【xₘ=xₘ】对于来自决策树𝕋的动作𝕒,一个极小完全解释对于一个为什么的问题可以定义为一个元组**【xᵣ=xᵣ,xₙ=xₙ】其中 Xᵣ 是奖励变量的集合;而 Xₙ 是条件为【xₙ=(xₘ=xₘ)∩(xₐ=xₐ】**的极大变量的集合;这里的 Xₐ 代表了𝕒.行动因果链中的一组中间变量注意,这里的 xₘ、xₐ 描绘的是实际实例化 M_{V←S} 下变量的值。

考虑星际争霸 2 的代理,这是对问题 “为什么是 Aₛ?'”的最简单完整的解释 可由元组**(【aₙ=aₙ】,【Dᵤ=dᵤ,d _ { b } = d _ { b })**;如这里的D_{b} 代表奖励变量 Aₙ 是因果链 ***(S→Aₙ→[Dᵤ,d _ { b })*的交点,如图 6(b)中的粗体字所示

最小完全对比解释:**一个最小完全对比解释对于一个为什么不的问题可以由一个元组 (Xᵣ=xᵣ,X_{con}=x_{con}) 给出其中 Xᵣ 类似于前面的定义 X_{con} 是满足条件
的最大变量集这里 X_{b} 表示反事实行动𝔹因果链中的一组中间节点, X_{c} 表示反事实决策节点。注意,值x_{c} 是使用实际实例化 M_{V←S}反事实实例化m _ { z←s _ { z } }进行对比的。利用下面的算法生成反事实决策节点 X_{c}

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

图 7。生成反事实的算法。来源:[4]

现在作为一个例子回顾星际争霸 2 的代理任务,考虑问题**‘为什么不建造兵营 A _ { b }?’*** 。对比解释生成如下。最初,从决策节点B 中提取决策边界值,即对于**【aₙ】≤5,对于【b***>2。此后,从最接近叶节点的决策节点开始,少量改变该值δ= 0.01,从而在代理的当前状态中生成新的特征值。这里变量 B 的特征值将变为 1.99。在这种新状态下,从决策树中预测反事实动作为 A_{b} ,并通过遍历该树来提取反事实决策节点。随后,我们得到 X_{con}=B ,因为 b 是反事实行动 ***A_{b} (B→Aₙ→[Dᵤ,d _ { b })*X_{c} (本迭代中为 B )因果链中节点的交点。现在我们对比实际值(3 来自因果模型 M 和决策树𝕋的训练)和 B 的反事实值(1.99),并添加奖励变量,以使用 NLP 生成对比解释。

学习机会链

某些动作激活其他动作的执行。在强化学习领域,我们将远端动作定义为最依赖于代理执行的当前动作。例如,在星际争霸 2 中,动作训练陆战队员不能在建造兵营 A_{b} 之前进行。现在要生成远端解释*,首先需要预测远端动作。[4]利用多对一递归神经网络(RNN)作为预测模型𝕃,在给定先前状态和代理采取的动作的情况下近似远端动作。𝕃的输出是远端动作及其累积回报。参考[4]第 4.4 节关于𝕃.的架构、训练和训练数据的信息在训练了远端动作预测模型𝕃之后,我们现在可以为*‘为什么?’定义最小完整远端解释**和‘为什么不?’提问。**

极小完全远端解释:**给定一个极小完全对比解释,当前动作𝕒和一个远端动作预测模型𝕃,一个极小完全远端解释可以用一个元组 (Xᵣ=xᵣ,X_{con}=x_{con},aₐ) 来定义其中X_{con} 被定义为较早的和**这里的 A 表示智能体的动作集合,而 Aₒ 表示当前动作𝕒.的因果链中的动作集合****

例子

考虑问题‘为什么要训练陆战队员 Aₘ 而不是建造兵营a _ { b }?’。经过分析,我们得到 Aₙ 为反事实节点,实际值为 10,反事实值为 5。同样,使用(攻击)作为预测的远端动作,可以使用 NLP 生成远端解释。**

因果解释(通过因果透镜使用可解释强化学习生成‘最小完全对比解释)

“因为做动作训练陆战 Aₘ 更可取,以拥有更多盟友单位 Aₙ 为目标是拥有更多被摧毁单位dᵤd _ { b }。”— [4]第 4.4 节

远端解释(使用可解释强化学习代理的远端解释“为什么不”问题的最小完整远端解释生成)**

“因为同盟军的单位数量*【aₙ】小于最优数量 18,所以更可取的做法是把行动列车做陆战改为** 启用这次行动的目标是有更多被摧毁的单位和被摧毁的建筑【T100— [4]第 4.4 节*****

如需查看更多主题,如该技术的计算和人类评估及其结果,请参考【4】。**

参考

  1. 舒,t,熊,c,Socher,r .:多任务强化学习中的层次性和可解释技能习得(2017)
  2. 透过因果透镜解释强化学习。 arXiv 预印本 arXiv:1905.10958 (2019)。
  3. 原因和解释:结构模型方法。第一部分:原因,英国科学哲学杂志,第 56 卷,第 4 期,2005 年 12 月,第 843–887 页,【https://doi.org/10.1093/bjps/axi147】T4
  4. 对可解释的强化学习代理的远端解释。arXiv 预印本 arXiv:2001.10284 (2020)。

你的网站是否泄露了敏感信息?

原文:https://towardsdatascience.com/xs-leaks-is-your-website-leaking-the-sensitive-information-c190eff5d548?source=collection_archive---------56-----------------------

对于导致用户信息泄露的 XSLeaks(跨站点泄露)缺乏关注

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

来源

大多数开发人员都熟悉并了解这些安全漏洞【XSS】(跨站脚本)、【CSRF】(跨站请求伪造)或 SQL 注入,但对可能导致用户信息泄露的 XSLeaks(跨站泄漏)却缺乏关注。在这篇博客中,我将对它做一个简单的介绍。

什么是 XSLeaks?

XSLeaks 是一类漏洞,第三方恶意网站能够发送请求或将用户重定向到目标服务,然后测量侧信道信号(例如,响应时间、浏览器中的静态资源缓存、HTTP 响应状态代码、响应内容等)…)来基于这样的副信道信号推断和收集关于用户的信息。

现实世界举例:你在看我的博客,如果我知道你是谁呢??

2013 年,有一个报告的错误允许网站使用脸书来检测访问者是否是特定的人。脸书徽章的预览图像是基于当时用户的脸书 ID 动态生成的。如果用户 1234567 已经登录,图像将类似于图 1。如果其他用户试图加载用户 1234567 的徽章图像,则会加载脸书徽标图像,而不是个人资料图像(图 2)。基本上,只有用户自己可以查看他们的个人资料徽章预览。

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

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

图一。有效的登录用户。

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

图二。无效的登录用户。

尽管脸书已经很好地屏蔽了姓名和电子邮件地址的信息,但它仍然泄露了用户身份。黑客可以使用 JavaScript 悄悄加载预定义用户 id 列表的配置文件出价预览,然后检查响应图像的高度和宽度,以了解特定用户正在查看他们的页面。

如果上面的例子对你来说已经相当过时了,2018 年年中还有另一个报告的 bug 。汤姆·安东尼发现了一种可以达到类似结果的方法。今天,与 2013 年相比,大多数脸书后端端点都受到了很好的保护,它们加载了access-control-allow-originx-frame-options 标头,以防止恶意网站使用 XHR 请求、iframe、图像标签等嵌入和调查 FB 内容。然而,Tom 发现一个 api(以用户 ID 作为参数)为匹配用户和非匹配用户提供了不同的content-type。然后,他使用了一个简单的 JavaScript 脚本,该脚本将获取一个用户 id 列表,并生成许多带有等同于端点的srcscript标签。script标签当然会失败,但是由于响应内容类型的不同,它们会以不同的方式失败,并且可以通过onloadonerror事件处理程序检测到。此外,该端点似乎没有任何速率限制,他可以在一分钟内检查数千个 id。

如果上述漏洞没有被修复,人们可能会利用它们来跟踪特定的人(比如老板、前女友、名人…)阅读他们的博客,或者他们可以根据访问者显示不同的内容。更多关于 XS 泄露攻击的真实例子可以在这里找到。

怎么防守?

web 应用程序的本质通常会导致大量暴露在 web 中的端点暴露用户的敏感数据,并且浏览器实现使网站很容易受到 XSLeak 攻击。幸运的是,XSLeak 已经引起了浏览器制造商的注意,并且有一些机制可以避免它。

X-帧-选项

使用X-Frame-Options: DENY会导致任何在框架中加载页面的尝试失败。它不仅能防御点击劫持,还能帮助防御 XSLeaks。如果页面需要嵌入到其他站点(广告、小部件等等),那么页面中包含的信息应该尽可能的稳定和可预测。

same site cookie

在某些情况下,恶意网站可以删除受攻击网站的特定资源的缓存,迫使浏览器再次呈现这些信息,并检查浏览器是否确实缓存了最初删除的资源。这使得攻击者能够判断网站是否加载了特定的资源(如图像、脚本或样式表),从而识别用户或泄露用户的一些信息。

严格的同站点 cookies 有助于避免上述情况,因为它将用户手动键入 URL、单击书签或单击当前站点的链接所生成的请求与其他网站发起的请求区分开来。

你可以参考这个链接了解更多关于这种攻击的细节。

获取元数据请求头

现代浏览器实现了 sec fetch 头,为服务器提供了更多的关于请求被触发的原因/位置的上下文。这些信息帮助服务器基于测试一组先决条件快速拒绝请求。

例如,由img元素生成的请求将导致包含以下 HTTP 请求头的请求:

Sec-Fetch-Dest: image
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site

服务器可以对端点实施策略检查,并使用Sec-Fetch-Dest快速拒绝非图像内容的请求。

结论

XSLeak 攻击领域的研究正在进行中,我相信在接下来的几年里会有更多的技术出现。作为一名开发者,重要的是要意识到这个问题有多严重,并开始更加注意保护你的网站免受这种攻击。

参考资料:

  1. https://ports wigger . net/research/xs-leak-leaking-ids-using-focus
  2. https://github.com/xsleaks/xsleaks/wiki/Defenses
  3. http://patorjk . com/blog/2013/03/01/Facebook-user-identificati on-bug/
  4. https://www . tomanthony . co . uk/blog/Facebook-bug-confirm-user-identities/
  5. https://ports wigger . net/daily-swig/new-xs-leak-techniques-reveal-fresh-ways-to-expose-user-information
  6. https://medium . com/bugbountywriteup/cross-site-content-and-status-types-leakage-ef 2 dab 0a 492
  7. https://scarybestsecurity . blogspot . com/2009/12/cross-domain-search-timing . html

用户参与度的突然下降

原文:https://towardsdatascience.com/yammer-investigating-a-sudden-drop-in-user-engagement-7c9c4093c038?source=collection_archive---------11-----------------------

使用产品分析、数据可视化和数据科学方法来调查 Yammer 用户参与度的下降

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

自由股票Unsplash 上的照片

免责声明:我不为 Yammer 工作,这是一个公开的数据案例研究,我用叙述的形式写它是为了让这个案例研究更吸引人。

这是周一的早晨……你端着一杯咖啡坐在桌前——眼睛几乎没有睁开。突然,产品主管拍了拍你的肩膀,把他的笔记本电脑摔在你的桌子上。

“我们的周参与度怎么会在一个月内下降 21%?!"

Sighhhhhhh

你掰着手指头,放下你的咖啡——“让我看看”。

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

嗯……乍一看,从 7 月 28 日开始,我们的每周参与水平一直在稳步下降。在 Yammer,我们将“参与”定义为与产品进行“服务器调用”(也就是用户点击了什么)的任何交互。

一般来说,大多数公司将用户参与度视为其产品整体增长和健康的主要 KPI(关键绩效指标)之一。

对于那些没有听说过我们的人来说, Yammer 是一个面向企业的社交网络(类似于脸书的 Workplace)。员工可以发送消息、搜索内部网、共享文档和发布更新。

诊断问题

在花太多时间诊断 KPI 变化的根本原因之前,我首先检查一下这个心理清单,以确保根本原因不是由非产品因素引起的,如广告、bug、错误等。

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

图片作者:Richard Yang

时间:时间是一个很好的考虑因素,因为不规则趋势在绘制时更容易发现。以下是最常见的与时间相关的数据问题:

  • 这种参与度的下降是突然的还是逐渐的?⟶:如果是突然的,那么请与工程团队一起检查是否进行了任何部署,如果是渐进的,那么可能与用户行为的变化有关。
  • 这是一次性事件还是经常发生的问题?⟶:一次性问题可能是由技术问题或营销活动引起的,而重复性问题可能是由行为变化引起的。
  • 我们会在一天中的特定时间或一周中的特定日子看到下降更明显吗?局限于特定时间或日期的⟶下降可能表明存在技术问题,例如通常在周末发生的数据刷新失败。

地区:考虑地区参与度很重要,因为公司在测试新产品或地区互联网审查/法律限制使用时,可能会在特定地区推出功能。要问的一些问题是:

  • 我们看到的参与度下降是局限于某个特定地区,还是分布在全球各地?由于消费者行为的文化差异,某些功能在特定地区可能表现得更好或更差。
  • 随着参与度的下降,该地区的互联网审查法律最近有什么变化吗?

其他功能/产品:在同一个空间内保持其他产品/功能的常规标签对于识别公司层面的潜在变化非常有用。要问的一些问题是:

  • 其他功能或产品的参与度是否也出现了类似的下降?⟶:如果这种下降在其他产品和功能中普遍存在,那么这个问题将会是一个更大的问题,需要多个团队参与调查。
  • 生态系统中的其他类似功能或产品的参与度是否成比例增加?⟶用户可能会转向使用不同的产品或功能来满足他们的用例,导致 Yammer 的分食。

平台:根据用户使用 Yammer 的平台,UX 显示和 ENG 发布流程有所不同,如果问题是技术性的且仅限于某个特定平台,您可以缩小范围。一些常见的问题是:

  • 我们是否看到跨特定平台(即移动、桌面、平板)还是跨所有平台?
  • 衰落是 android 还是 iOS 或者其他操作系统特有的?

行业/竞争对手:跟踪 Yammer 在行业中的表现并了解总体趋势对于市场空间意识非常有用。竞争对手的信息可能很难获得,但我们仍然可以利用新闻文章、谷歌趋势搜索和第三方数据来获得高层次的见解。

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

谷歌趋势搜索 Yammer 与顶级竞争对手的比较

损坏的特征/跟踪代码:也有可能某些特征或跟踪代码损坏,从而影响事件的记录方式。用户在与应用程序交互时触发的事件的映射层次结构对于确定用户离开的位置非常重要。

僵尸工具和搜索爬虫引擎:大多数主要网站都有来自僵尸工具的高活跃度,但是很难确定由僵尸工具触发的事件。高流量网站也由搜索引擎优化引导,搜索引擎索引的变化会导致流量的显著变化。

重大事件:一次性事件也有可能导致人员涌入或参与度大幅下降,如假期、成功的活动和负面新闻。

数据的约束

在这个案例研究中,我们唯一可以操作的数据集是:时间、地区、平台和事件跟踪。如果您想查看用于分析的源数据和代码,请查看下面的嵌入式笔记本链接:

[## nbviewer 笔记本

看看这个 Jupyter 笔记本!

nbviewer.jupyter.org](https://nbviewer.jupyter.org/github/JodiZhang/Yammer-Case-Study/blob/392955b5c34d4611179c7ec0396b5131287c197c/Drop%20in%20User%20Engagement/Yammer%20Case%20Study%20-%20Drop%20in%20User%20Engagement.ipynb)

*注意所有的 Plotly 图表都是交互的,可以点击拖拽放大图表或者点击图例中的类别进行过滤。

假设

潜在原因 1

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

  • 根据上面的图表,周六和周日的参与率最低这是有道理的,因为 Yammer 主要用于工作。
  • 当按一天中的时间(基于 24 小时制)检查参与度时,看起来上午 9 点是用户与 Yammer 交互最频繁的时候,而一天中的其他时间并不突出。
  • 由于参与度的下降是在几个月的时间内逐渐发生的,并且不局限于某一天或某一时间,因此我们可以假设原因不太可能是一次性服务器/技术中断或数据更新失败。

潜在原因 2

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

  • 因为 Yammer 被多个地区使用,所以最好根据用户数量来分析前 5 个地区。
  • 从上图中可以看出,美国的活跃用户下降幅度最大,而其他地区的下降幅度较小。
  • 如果有任何新的发布或者产品升级只局限于某个州,与其他团队一起快速检查将是非常有用的。

潜在原因 3

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

  • Yammer 中的事件(动作)分为以下几类:登录事件、消息事件、搜索事件和注册漏斗事件。
  • 从上图中可以清楚地看到,用户能够在注册漏斗中导航,但其他活动的参与度有所下降。

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

  • 增长率或激活率是所有公司密切跟踪的指标,因为这意味着 Yammer 为新客户提供了预期的价值。
  • 根据上面的图表,增长率保持正常,因为它继续在工作日保持高水平,在周末保持低水平。
  • 在没有注册(增长)问题的情况下,参与度的下降可以被认为是来自老用户/现有用户。

潜在原因 4 :由于缺乏老用户的支持,参与度下降

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

  • 做一个群组分析是追踪任何用户群的最常见的方法之一。从长远来看,它有助于为用户描绘一幅关于 Yammer 产品有效性的更好的画面。
  • 按年龄对用户进行细分后,很明显,那些在 5 月 1 日前 10 周以上注册的用户,参与度会随着时间的推移而下降。单独观察每一组,随着时间的推移,他们的参与度也会下降。
  • 由于该问题与成熟用户有关,因此该问题不太可能与营销流量或机器人和搜索爬虫的一次性高峰有关,后者可能会导致不可持续的参与闪电战。
  • 该产品有一个“粘性的问题,因为随着时间的推移,我们的用户似乎越来越不喜欢我们的产品。

潜在原因 5 :由于我们的每周摘要电子邮件未能达到预期目的而导致参与度下降。

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

  • 为了吸引和重新吸引用户,Yammer 每周都会发送摘要邮件和重新吸引邮件。
  • 根据上面的图表,每周发送的电子邮件数量和每周打开的电子邮件数量一直在增加,但每周点击率大幅下降,而每周重新参与度指标正常。

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

  • 即使打开率在增加,点击率的降低也可能意味着每周摘要电子邮件内容与用户不够相关,或者预期的用户动作不够明确。如果 CTR 为 0,则表明按钮或功能损坏。

潜在原因 6

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

  • 如上图所示,使用手机的用户的参与度下降更为明显
  • 这可能是由于 Yammer 的移动应用程序最近的变化或发布

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

  • 为了更好地理解,在不同的操作系统之间比较相同的指标是有用的,因为每个操作系统的应用程序都有不同的代码版本
  • 看起来不管什么操作系统,通过手机访问 Yammer 的用户越来越少参与
  • 这种情况让我认为,随着时间的推移,留住 Yammer 手机用户存在问题,这可能是由于 UX 的设计问题或功能失调导致的不满。

结论

从我们的分析中,我们可以推断,长期访问 Yammer 的移动用户会因为可用性问题或不相关的内容而逐渐脱离。尽管电子邮件打开率相对较高,但我们从每周摘要中观察到的点击率要低得多。这可能意味着我们的电子邮件内容存在问题,例如相关性或质量。

鉴于用户参与度下降的多种不同假设,我会与其他学科,如工程、设计、营销和产品,讨论验证策略。验证策略包括 AB 测试、功能回滚和区域划分。

学习使用的技术

  • 自从我用 SQL 开始我的数据之旅以来,我用 SQL 做连接和聚合要比 Pandas 舒服得多。我决定使用 SQLite 进行所有更复杂的数据操作,并发现大部分功能和语法与 MySQL 相同。在我的用例中,主要的区别在于的日期和时间函数。如果 SQL 语法是您首选的语言,我建议个人使用 SQLite 来查询数据框。
  • 我使用 Plotly 的 Python 图形库来实现所有的可视化和交互式图表/图形。我喜欢交互式组件:悬停、单击和拖动以放大元素和 Plotly 图表的简单布局。与 Matplotlib、Seaborn 和 Bokeh 相比,这是我更喜欢的可视化库。我发现很难在网上找到关于如何绘制某些图形的案例具体示例,所以我不确定我是否以最有效的方式绘制了折线图和条形图——希望听到一些关于所写代码的反馈。
  • Plotly 的交互图表也不能在 GitHub 中渲染。如果你想保留你的图表来分享你的 Jupyter 笔记本/实验室中的分析,我推荐使用 nbviewer 来渲染你发布的笔记本。

你可以在这里找到原案:https://mode.com/sql-tutorial/a-drop-in-user-engagement/

使用 OpenCV,TensorFlow,MNIST,在 Python 中检测 Yatzy 评分表

原文:https://towardsdatascience.com/yatzy-score-sheet-detection-in-python-using-opencv-tensorflow-mnist-97ce685d80e0?source=collection_archive---------11-----------------------

完整的实现与代码部分的图像处理和 CNN 模型训练

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

Yatzy 评分表 iOS 应用程序

自从几年前我开始玩 yatzy(真的,有点上瘾)以来,我一直希望我们有机会玩 Yatzy 而不需要物理分数表。我发现了一些应用程序,但没有一个真正好用或有趣的。在发布了一个简单的 yatzy 分数跟踪应用程序后,我的工程头脑开始发挥扫描 yatzy 分数表的想法。我意识到,对于部署的计算机视觉任务来说,这可能是一个合理范围内的好任务。它还将包括机器学习,在那里你必须考虑更多的事情,而不仅仅是在 测试 集上获得最佳准确度。您必须部署您的模型,让您的生产数据符合模型等等。在这篇文章中,我将介绍这个项目的各个步骤,包括从 RGB 图像中识别 yatzy 评分表,并对手写输入的数字进行分类。代码是使用 OpenCV 和 TensorFlow 用 Python 写的。

第 1 部分:识别 Yatzy 表

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

这种分类/检测任务的一种(强力)方法是将我们所有的轮廓传递给 TensorFlow CNN 模型进行预测,并训练它能够从手写数字中分离噪声。然而,这将意味着我们可能不得不将大量的噪声传递给我们的模型进行预处理和预测。对于我们的模型来说,这不是一个微不足道的任务,因为我们不知道这些数字相对于图像应该有多大。我们也不知道这些轮廓属于什么样的细胞(点)?这就是为什么我们开始识别 yatzy 表,并“减去”网格,以确保我们只(希望)发送数字到分类器。为了识别任意工作表,我们需要定义定义任意工作表的规则。我对常规工作表使用的规则是:

  • 19 行数。
  • 网格中的每个任意单元格具有相似的尺寸,即不同单元格的高度宽度相同。

识别网格的步骤:

  1. 将 RGB 图像转换为单通道二值图像。

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

RGB 到二进制图像

步骤 1 的代码

2.识别最大的轮廓(具有相似强度的连接点)

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

最大轮廓。第二步

3.根据可以用一个矩形表示的最小面积对图像轮廓进行旋转。

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

在步骤 3 中旋转之前,最大轮廓的最小旋转矩形区域

步骤 2 和 3 的代码

步骤 2 和 3 的代码

4.对二进制图像执行形态学操作,以便在新的二进制图像上绘制垂直和水平线条,表示 yatzy 网格。有关绘制的线条,请参见下图。

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

步骤 4 之后,绘制了垂直水平线的二进制图像

步骤 4 的代码,识别 yatzy 网格

步骤 4 的代码

5.识别 yatzy 网格中的每个 Yatzy 单元格,并按照最左上角的位置对它们进行列排序 (x,y) 。我们通过在步骤 4 的二进制图像上使用 findContours 来实现,该图像只包含水平/垂直线条。

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

参见调用上述代码的完整 generate_yatzy_sheet 函数。

调用步骤 1–5 的函数

以上要点的完整源代码可从 这里 获得

第二部分。手写数字训练

MNIST 是一个包含 70 000 张 28x28 图像和手写数字的数据集。35,000 个来自高中生,35,000 个来自人口普查局员工,分成 60,000 个用于训练图像,10,000 个用于测试各自的组。

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

来自 MNIST 数据集的样本图像

MNIST 图像的尺寸为 28×28 像素,是黑白的,带有一些灰度,这是标准化算法(高斯等)使用的反走样技术的结果。手写数字包含在一个 20×20 的边界框中,具有保留的纵横比。然后,通过在每个侧面图像上引入 4 个像素的填充,将 20x20 的盒子转换为 28x28 的容器。然后,通过计算质心并将其平移到这个 CoM 点,该数字在 28×28 像素的图像中居中。质心实际上是 x 轴和 y 轴上的白色像素平均值。(我们稍后将模仿这些步骤进行产量预测)

对于训练,我们使用 CNN 架构。如果你不熟悉 CNN,我推荐你在这里阅读更多相关内容。

INPUT -> CONV3-32 -> RELU -> CONV3-32 -> RELU -> CONV3-32 -> RELU -> POOL -> DROPOUT -> FC -> RELU -> DROPOUT -> SOFTMAX

下面的代码用于为模型定型。请注意我们是如何去除高斯反走样并将图像转换为二进制图像的。我们这样做是因为我们不知道在 MNIST 使用的精确算法来创建反锯齿效果。否则,我们的生产数据将与培训设置不匹配。我们可以执行一个新的高斯反走样效果后,我们把它变成二进制,但是在测试后,我没有注意到高斯过滤器的任何性能改善。

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

转换成二进制图像后的来自 MNIST 的样本图像

训练我们的卷积神经网络的全部代码。

训练卷积神经网络

最后,我们打印 train/val 损失和 train/val 精度,以衡量我们的模型在不同时期的表现。看起来没问题,合理的验证指标很好地遵循了培训。

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

CNN 模型的度量

把它放在一起

现在,当我们拥有数组格式的 yatzy 网格和 CNN 模型时,我们可以开始用 yatzy 单元绘制数字轮廓位置,并通过感兴趣区域(ROI)进行预测。

  1. 阅读张量流模型
  2. 从 RGB 图像生成任意图片
  3. 使用生成的 Yatzy 表(没有任何网格)来查找数字的轮廓
  4. 将 ROI 预处理为张量流模型的正确格式。(轮班等)

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

5.通过 ROI 进行预测

最终结果包含附加到每个轮廓的相应分类数字。(注意我们的模型如何(直观地)将 A 和 B 解释为 4 和 8)

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

带分类数字的任意网格

这都是为了这个 python 实现。在 Yatzy 评分表中运行的代码被移植到 Objective C++并进行优化(例如,跳过一些重复的操作,以便在整个 python 程序中保持不同的图像版本)。因为我们知道这些数字属于哪个 yatzy 单元格,所以我们可以使用它在应用程序屏幕“预览工作表”中显示工作表,并选择保存工作表。请注意,有些单元格的背景颜色为红色,这表明我们的 CNN 模型对预测的数字是正确的有多大把握(在 0-1.0 之间)。然后,用户能够手动验证和更新那些具有错误预测的数字。

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

这篇文章的完整源代码可以在的 Github repo 中找到

Yellowbrick —通过可视化分析您的机器学习模型

原文:https://towardsdatascience.com/yellowbrick-analyze-your-machine-learning-model-with-visualizations-f2c65ab2e229?source=collection_archive---------43-----------------------

用于机器学习可视化的 Python 库

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

Joshua Hoehne 在 Unsplash 上拍摄的照片

Yellowbrick 是一个 Python 机器学习可视化库。它本质上是建立在 Scikit-learn 和 Matplotlib 之上的。Yellowbrick 提供了信息丰富的可视化,以更好地评估机器学习模型。这也有助于模型选择的过程。

这个帖子更多的是 Yellowbrick 的实际应用。我们将快速构建一个基本的分类模型,然后使用 Yellowbrick 工具来评估我们的模型。我们可以把它分成两部分:

  1. 创建机器学习模型
  2. 黄砖时间!

创建机器学习模型

任务是预测银行客户的流失。流失预测是机器学习领域的一个常见用例。如果你不熟悉这个术语,churn 的意思是“离开公司”。对于一个企业来说,了解客户可能流失的原因和时间是非常重要的。

我们将使用的数据集可从 Kaggle 上的这里获得。这篇文章的重点是评估分类器性能的可视化。因此,实际的模型构建部分将会快速而简洁。

让我们从导入依赖项开始。

import numpy as np
import pandas as pdimport matplotlib.pyplot as plt
%matplotlib inlineimport yellowbrick

我们将数据集读入熊猫数据帧,并删除多余的特征。

df_churn = pd.read_csv("/content/Churn_Modelling.csv")df_churn.drop(['RowNumber', 'CustomerId', 'Surname'], axis=1, inplace=True)df_churn.head()

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

“退出”栏表示客户流失。

流失数据集通常是不平衡的。类别 0(非流失)的数量明显多于类别 1(流失)的数量。这种不平衡会对模型的性能产生负面影响。因此,最好消除这种不平衡。

有不同的方法来使用它作为解决方案。我们可以进行过采样(增加少数类的观测值)或欠采样(减少多数类的观测值)。

最常见的一种是 SMOTE (合成少数过采样技术)。SMOTE 算法创建与现有样本相似的新样本。它采用两个或更多相似的观察值,并通过一次改变一个属性来创建一个综合观察值。

在使用 SMOTE 算法之前,我们需要将类别转换成数值。

gender = {'Female':0, 'Male':1}
country = {'France':0, 'Germany':1, 'Spain':2}df_churn['Gender'].replace(gender, inplace=True)
df_churn['Geography'].replace(country, inplace=True)

我们来确认一下阶级不平衡:

df_churn['Exited'].value_counts()
0    7963 
1    2037 
Name: Exited, dtype: int64

正类(流失)的数量大约比负类(非流失)的数量高 4 倍。

X = df_churn.drop('Exited', axis=1)
y = df_churn['Exited']from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42)
X_resampled, y_resampled = sm.fit_resample(X, y)print(pd.Series(y_resampled).value_counts())
1    7963 
0    7963 
dtype: int64

现在正反类数量相等。训练模型之前的最后一步是将数据集分成训练和测试子集。

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2)

是时候创建一个模型并训练它了。我将使用随机森林算法。

from sklearn.ensemble import RandomForestClassifierrf = RandomForestClassifier(max_depth=11, n_estimators=260)
rf.fit(X_train, y_train)from sklearn.metrics import accuracy_score
y_pred = rf.predict(X_train)
y_test_pred = rf.predict(X_test)
train_acc = accuracy_score(y_pred, y_train)
test_acc = accuracy_score(y_test_pred, y_test)print(f'Train accuracy is {train_acc}. Test accuracy is {test_acc}')

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

黄砖时间!

在分类任务中,尤其是在存在类别不平衡的情况下,准确度不是评估度量的最优选择。例如,预测正面类别(客户流失=1)比预测负面类别更重要,因为我们想确定客户是否会流失。我们可以承受对负类的错误预测

一种分别检查正负类预测的方法是混淆矩阵。

from yellowbrick.classifier import ConfusionMatrixplt.figure()
plt.title("Confusion Matrix", fontsize=18)
plt.xlabel("Predicted Class", fontsize=16)
plt.ylabel("True Class", fontsize=15)cm = ConfusionMatrix(rf, classes=[0,1], size=(400,400),
fontsize=15, cmap='GnBu')cm.fit(X_train, y_train)
cm.score(X_test, y_test)

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

在正类中,我们有 1419 个正确的预测和 213 个错误的预测。我们也可以通过将百分比参数设置为真来显示百分比,而不是数字。

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

该模型在负类上表现更好,这不是我们想要的。实现这一点的一个方法是告诉模型“正类(1)比负类(0)更重要”。使用我们的随机森林分类器,可以通过 class_weight 参数来实现。

评估分类模型性能的另一个工具是 ROC(接收机工作特性)曲线和 AOC(曲线下面积)。

ROC 曲线通过组合所有阈值的混淆矩阵总结了性能。 AUC 将 ROC 曲线转化为二元分类器性能的数字表示。AUC 是 ROC 曲线下的面积,取 0 到 1 之间的值。AUC 表示一个模型在区分正类和负类方面有多成功。

from yellowbrick.classifier import ROCAUCplt.figure(figsize=(10,6))
plt.title("ROC Curve and AUC", fontsize=18)
plt.xlabel("False Positive Rate", fontsize=16)
plt.ylabel("True Positive Rate", fontsize=16)visualizer = ROCAUC(rf, classes=["Not-churned", "Churned"])
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)plt.legend()

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

ROC 曲线概述了不同阈值下的模型性能。AUC 是介于(0,0)和(1,1)之间的 ROC 曲线下的面积,可以使用积分来计算。AUC 基本上汇总了模型在所有阈值的表现。AUC 的最佳可能值是 1,这表示一个完美的分类器。如果所有的预测都是错误的,则 AUC 为零。

当涉及到不平衡数据集时,精度召回通常是评价指标的选择。

精度的焦点是正面预测。它表明有多少积极的预测是正确的。

召回的重点是实际正课。它表示模型能够正确预测的阳性类别的数量。

注意:我们不能试图同时最大化精确度和召回率,因为它们之间有一个平衡。提高精度会降低召回率,反之亦然。我们可以根据任务来最大化精确度或回忆。

Yellowbrick 还提供了精度-召回曲线,显示了精度和召回之间的权衡。

from yellowbrick.classifier import PrecisionRecallCurveplt.figure(figsize=(10,6))
plt.title("Precision-Recall Curve", fontsize=18)
plt.xlabel("Recall", fontsize=16)
plt.ylabel("Precision", fontsize=16)viz = PrecisionRecallCurve(rf)
viz.fit(X_train, y_train)
viz.score(X_test, y_test)
plt.legend(loc='lower right', fontsize=12)

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

在某个时间点之后,提高召回率会导致准确率显著下降。

Yellowbrick 还提供了以下可视化功能,这些功能在评估分类模型时非常有用:

  • 分类报告
  • 类别预测误差
  • 辨别阈值(仅用于二元分类)

在评估模型的过程中使用信息可视化将为您提供许多见解。它将引导你以一种有效的方式改进你的模型。

不要只看数字,试着用不同的方法来评估,从而改进你的模型。

感谢您的阅读。如果您有任何反馈,请告诉我。

Yelp 餐厅推荐系统——数据科学顶点项目

原文:https://towardsdatascience.com/yelp-restaurant-recommendation-system-capstone-project-264fe7a7dea1?source=collection_archive---------9-----------------------

深入了解我参加数据科学训练营并为我的顶点项目构建餐厅推荐系统的经历。

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

卢克·切瑟Unsplash 上拍摄的照片

个人反思:

在过去的 3 个月里,我有机会在新加坡完成了大会的数据科学沉浸式训练营。编码训练营的性质意味着这是一次具有陡峭学习曲线的激烈体验,涵盖机器学习主题,如特征工程、决策树、自然语言处理和深度学习神经网络,所有这些都在短短的 12 周内!尽管如此,这次经历还是丰富了我的人生,因为它给了我日复一日用 Python 编程的机会,完成了编程任务,也为我的作品集做了个人数据科学项目。凭借在这次训练营中获得的技能,我现在真的有信心以全职职业身份进入数据科学领域。

回顾过去的几个月,这个训练营让我对端到端数据科学流程有了深刻的理解,并熟悉了数据分析和数据建模所需的编程语言和工具。在训练营即将结束时,每个学生都有机会参与一个个人顶点项目,展示我们在 12 周内学到的所有数据科学概念和技术。在这篇文章中,我将解释我的顶点项目以及我着手构建数据科学模型的端到端流程。

美食餐厅推荐系统

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

食客集体Unsplash 上的照片

对于我的顶点项目,我想建造一些对人们日常生活有意义的东西。这最终导致我建立了一个推荐系统模型,它可以根据其他人对餐馆的评论向人们推荐他们位置附近的餐馆,利用情感分析,这可能会改善你在 Deliveroo、GrabFood 和 FoodPanda 等常见食品交付应用程序上看到的推荐建议。

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

作者图片

出于这个数据科学项目的目的,我在其上构建模型的数据集来自 Yelp 数据集,该数据集已经公开用于个人、教育和学术目的。由于这个数据集的巨大规模,我决定将我的工作集中在多伦多市的餐馆评论数据上,因为与这个数据集中的其他 9 个城市相比,它有最多的评论。这给我留下了从 2015 年到 2019 年总共5471 家餐厅44485 名用户253050 条餐厅评论的数据。

解释性数据分析

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

作者图片

使用 Python 中的 Plotly 包,我能够创建多伦多市餐馆的地理可视化。大多数餐馆生意都集中在多伦多市中心,这是主要的中央商业区。

在各种餐馆类别中,排名前五的类别是:夜生活、酒吧、咖啡&茶、快餐和早餐&早午餐。

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

作者图片

对于每条餐厅评论,每个用户都给出了 1-5 分的评分,表示他们光顾餐厅的总体体验。评论评分的分布向左倾斜,平均而言,给出较高评分的用户比给出较低评分的用户多。

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

负面(左)和正面(右)评论的文字云,图片由作者提供

自然语言处理

利用每个 Yelp 用户留下的文本评论,我能够通过整合他们文本评论的情感分析为每个用户创建新的评分。情绪分析是确定用户的态度或情绪(无论是积极还是消极或者中立)的过程。

Textblob 的极性得分能够给我一个分数,表明一个陈述在从-1(负)到 1(正)的范围内有多积极或消极。此外,我还使用了 VADER(效价感知词典和情感推理机),这是一个基于词典和规则的情感分析工具,专门针对社交媒体中表达的情感。 VADER 的综合得分也显示了一个陈述的积极或消极程度,范围从-1(非常消极)到 1(非常积极)。

通过合并这些量化的情感分数,我能够为每个用户创建一个范围在[0,6]内的超级分数,更好地反映他们访问餐馆的整体体验,并使用该分数作为我的推荐模型的基础。

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

计算用户超级分数的公式,按作者排序的图像

话题造型

为了进一步理解我的评论数据中的文本,我使用了潜在狄利克雷分配(LDA),主题建模的一个例子,将文档中的文本分类到特定的主题。LDA 建立每文档主题模型和每主题单词模型,建模为狄利克雷分布

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

共 5 个主题的主题建模(LDA ),图片由作者提供

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

作者图片

在执行 LDA 之后,我能够创建几个主导主题,这些主题可以让我对人们在 Yelp 评论中谈论的主题类型产生有趣的见解。具体来说,来自我的 LDA 情节的主题 3、4 和 5 创建了将评论与特定食物烹饪相关联的主题**(西方、甜点、亚洲)。将不同的评论分配给不同的主导主题将允许我建立一个基于内容的推荐模型**,根据相似的偏好向用户推荐餐馆。

基于位置的推荐系统

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

作者图片

为了解决最初的用户冷启动问题,我决定使用一个简单的解决方案,通过位置邻近数据向新用户推荐餐馆。知道一个人在决定寻找新餐馆时的地理位置,我们可以使用基于位置的推荐系统来推荐他/她附近的餐馆。通过为用户提供方便的初始推荐,我们可以吸引他/她开始使用我们的应用程序,然后根据他/她的初始偏好推荐其他餐厅。

根据地理位置对餐馆进行分组的一种方法是使用 K-Means 聚类算法。 K-Means 算法预测用户所在的聚类,并从中抽取出前 10 家餐厅推荐给他。

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

多伦多的餐馆根据地理位置的远近分成 10 类,图片由作者提供

案例分析

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

例如,我们有一个新用户,他刚刚参观了皇家安大略博物馆。他想吃顿饭,但不确定他家附近有什么好餐馆。通过将他的经度和纬度坐标输入到我们的模型中,我们可以向他推荐他所在位置附近的 10 家高评级餐厅,并让他有兴趣作为用户使用我们的推荐应用程序。

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

作者图片

协作和基于内容的过滤

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

约翰·施诺布里奇在 Unsplash 上的照片

一旦我们让新用户开始使用我们的应用程序,我们可以通过以下 4 个步骤来改进我们的模型推荐:接受反馈,重新训练模型,对预测评级进行排序,返回最高的预测推荐。

对于我的协同过滤推荐模型,它的工作原理是搜索一大群人,找到与特定用户口味相似的一小群用户。它查看他们喜欢的餐馆,并将它们组合起来,创建一个推荐餐馆的排名列表。我创建物品-物品矩阵的 3 个主要步骤包括:

  1. 超级评分数据透视表,用于创建用户-项目矩阵
*# Creating the Matrix by using the Pivot Table Function* toronto_restaurant_rating = toronto_data.pivot_table(index = 'user_id', columns = 'name', values = 'super_score')toronto_restaurant_rating.head()

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

作者图片

2。截断奇异值分解

谈到矩阵分解技术,截断奇异值分解(SVD) 是一种常用的方法,可将矩阵 M 分解为三个矩阵 U、σ和 v。与常规 SVD 不同,截断 SVD 可产生一种分解,其中可针对多个截断指定列数。例如,给定一个(n x n)矩阵,截断 SVD 生成指定列数的矩阵,而 SVD 输出 n 列矩阵。截断 SVD 可以处理稀疏矩阵以生成特征矩阵,而主成分分析将对整个矩阵进行操作以输出协方差矩阵。

*# Converting the reconstructed matrix back to a Pandas dataframe*

cf_preds_df = pd.DataFrame(all_user_predicted_ratings, columns = toronto_restaurant_rating.columns, index=user_ids).transpose()

cf_preds_df

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

作者图片

3。基于余弦相似度创建基于项目的矩阵

*# Creating Item-Item Matrix based on Cosine Similarity*

item_item_matrix = cosine_similarity(cf_preds_df)item_item_matrix= pd.DataFrame(item_item_matrix, columns=cf_preds_df.index, index = cf_preds_df.index)item_item_matrix

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

作者图片

对于这个推荐模型,所有用户必须输入的是他们以前喜欢访问的一个餐馆名称到模型中,它将根据与该特定餐馆的最高余弦相似性得分生成 10 个最推荐餐馆的列表。

*# Top 10 Recommended Restaurants that people should visit if they had previously visited Pai Northern Thai Kitchen*

restaurant_recommendations = cf_recommender('Pai Northern Thai Kitchen')restaurant_recommendations = pd.DataFrame(data = restaurant_recommendations)restaurant_recommendations

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

作者图片

对于我的基于内容的推荐模型,它的工作原理是根据相似的餐馆类别和主导话题关键词向用户推荐餐馆,从而推荐符合用户偏好的餐馆。我创建物品-物品矩阵的 3 个主要步骤包括:

  1. 为每家餐厅创造一袋单词
*# Creating Bag of Words*

toronto_final['bag_of_words'] = ''
columns = toronto_final.columns
**for** index, row **in** toronto_final.iterrows():
    words = ''
    **for** col **in** columns:
            words = words + ' '.join(row[col])+ ' '
    row['bag_of_words'] = words

toronto_final.drop(columns = [col **for** col **in** toronto_final.columns **if** col!= 'bag_of_words'], inplace = **True**)

toronto_final.head()

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

作者图片

2。计数矢量器

CountVectorizer 将文本文档的集合转换为令牌计数的向量。此外,它支持在生成矢量表示之前对文本数据进行预处理。

*# instantiating and generating the count matrix*
count = CountVectorizer()
count_matrix = count.fit_transform(toronto_final['bag_of_words'])

*# creating a Series for the restaurant names so they are associated to an ordered numerical*
*# list I will use later to match the indexes*
indices = pd.Series(toronto_final.index)
indices[:5]

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

作者图片

3。创建余弦相似矩阵

*# generating the cosine similarity matrix*cosine_sim = cosine_similarity(count_matrix, count_matrix)cosine_sim

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

作者图片

同样,对于这种推荐模型,用户只需输入他们以前喜欢去的餐馆名称到模型中,它将基于相似的分类和主导主题关键字生成 10 个最推荐餐馆的列表。

*# Top 10 Recommended Restaurants that people should visit if they had previously visited Pai Northern Thai Kitchen*content_based_recommendations('Pai Northern Thai Kitchen')

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

作者图片

对新加坡 F&B 部门的申请

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

照片由 Ethan HuUnsplash 上拍摄

在今年早些时候的断路器时期,由于缺乏顾客和订单,许多不太知名的餐馆都在这段时间里苦苦挣扎。

随着新加坡在 2020 年底缓慢进入第三阶段,更多的人将会以 5-8 人为一组,经常去镇上的餐馆。

因此,我的推荐模型可以为他们提供一个替代食物推荐系统,它可以推荐其他顾客评价很高的鲜为人知的当地餐馆。

为了帮助这样的餐馆,我未来需要的是当地餐馆企业和评论数据来训练我的推荐模型。

然而,我的模型也有一些限制。随着未来时间的推移,我可以探索其他方面来改进我的模型。其中包括:

  1. 在情感分析和主题建模中使用二元语法和三元语法。
  2. 结合深度学习&神经网络架构进行协同过滤。
  3. 图论应用于基于位置的系统,以优化旅行和交付路线。

最后的话

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

Denys NevozhaiUnsplash 上拍摄的照片

如果你已经走了这么远,我想真诚地感谢你花时间阅读我的文章。随着我进入商业和技术领域,我希望探索更多数据科学的趋势主题,这些主题可以用于改善人们的日常生活。

如果您想了解更多关于我未来的帖子,请在我继续我的数据科学之旅时在 Medium 上关注我!

Chipotle 如何重新赢得顾客?

原文:https://towardsdatascience.com/yelp-review-analysis-for-chipotle-with-natural-language-processing-bf4b3e5db140?source=collection_archive---------42-----------------------

针对 Chipotle 的 Yelp 评论分析,包含情感分析、词云和主题建模

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

Pixabay 上的 dolvita108 拍摄的照片

这是我们团队(黄尧晰杰克叶浩浩李玉婷)在 UC Davis MSBA 项目机器学习课上的最后一个项目。python 编码的逐步指导已经在 Github 分享:https://Github . com/cryyystal/Analysis-of-Yelp-Review-for-Chipotle-Mexican-Grill

概观

近年来,Chipotle 一直在流失顾客,在竞争激烈的快速休闲餐饮行业表现不佳。它尝试了许多方法来改善客户体验和重新赢得客户,如建立新的安全协议和引入数字订购渠道,如在线和移动应用程序订购。随着 Chipotle 采用越来越现代化的战略,我们推荐一种数据驱动的方法来帮助它改善业务。在这个项目中,我们使用几个自然语言处理工具来分析 Yelp 上的评论,以发现需要改进的地方并相应地提出建议。

Chipotle 项目的主要组成部分:

  • 应用 Textblob 计算每个评论的情感极性。
  • 分别绘制正面和负面评论的词云,看看哪些词在正面或负面评论中频繁出现。
  • 使用 LDA Mallet 进行主题建模,从所有评论中提取六个主题,并计算每个主题的平均情感得分。画一个雷达图,说明哪些题目是 Chipotle 的优势,哪些是它的劣势。
  • 做词语情绪的时间序列分析,通过它我们看到“line”“burrito”等重要词语在正面或负面评论中出现频率的月度变化。基于此,我们可以检测到 Chipotle 关键业务的痛点。

基于我们的分析,我们在原料质量、等待时间和数字订购方面为 Chipotle 提供了四点建议。第一个是提高原料的新鲜度和质量,以重获战略优势。第二个是调查供应链,看看如何提高其蛋白质的质量和味道,特别是鸡肉。第三个是调查其最重要的产品墨西哥卷饼的质量,该产品的正面评价越来越少。最后,Chipotle 应该改进在线订购系统和手机 app,以便更好地解决等待时间问题,改善客户的购买体验。

数据源

Yelp 在 Yelp 挑战数据集中提供了一个全面的数据集,包括所有的商家信息,如地址、提示、评论和评论者。我们合并“业务”表和“评论”表,并提取 Chipotle 的信息。总共有 9590 条关于 Chipotle 的评论。

数据集链接:https://www.yelp.com/dataset/challenge

自然语言处理分析

a)探索性数据分析

我们计算了 Chipotle 自 2006 年以来的每月平均评论星级,发现它随着时间的推移逐渐下降:回到 2010 年,平均评论星级约为 4.0,但现在约为 3.0(图 1)

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

图表 1

图表 2 显示了不同恒星的数量和比例如何随时间变化。随着时间的推移,5 星和 1 星评论在数量和比例上都有所增加,其中 1 星评论增加更为显著。这可能是图 1 中平均星级逐渐下降的主要原因。

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

图表 2

b)文本预处理

在 EDA 之后,我们做了一些文本预处理来提高 NLP 模型的性能,包括:

  • **文本去压缩。**例如,将“不会”替换为“不会”,将“\ ve”替换为“有”,将“\ d”替换为“会”。
  • 把所有东西都变成小写。
  • **使用 NLTK 库删除停用词。**停用词是非常常见的词,如“如果”、“但是”、“我们”、“他”、“她”和“他们”。我们通常可以在不改变文本语义的情况下删除这些单词。
  • **删除空格和标点符号。**经过上述处理后,可能会有一些空格混在文字中,所以我们需要去除这些空格。此外,我们也删除标点符号,如“,”。?!:“且只留言。
  • **使用 NLTK 词干的单词词条化。**词汇化是将一个单词的不同屈折形式组合在一起的过程,这样它们就可以作为一个项目进行分析。例如,在词汇化之后,“哭”就是“哭”。

文本预处理前后的评论比较如下:

以前

"I'm a regular at chipotle in California, this is my first visit to this chipotle on s.las Vegas strip.this is pretty new place I think, I took a veggie bowl in which the rice was undone and the fajitas were all burnt, the quantity offered was less than usual. I'm very unhappy with this place."

在…之后

'regular chipotle california first visit chipotle s la vega strip this pretty new place think took veggie bowl rice undone fajitas burnt quantity offered le usual unhappy place'

c)情感分析

我们使用 Textblob 为每个评论分配一个情感分数,以衡量评论的积极程度或消极程度。如果情绪得分大于 0,则评论为正,反之,则评论为负。从图表 3 中,我们可以看到正面评价是负面评价的两倍。

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

图表 3

绘制图表 4 以查看评论星级和情感分数之间的关系。显然,随着星级的增加,平均情绪得分也增加。然而,对于 1 星评价,它们可能是正面的或负面的,但对于 4 星和 5 星评价,它们基本上是正面的。

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

图表 4

d)词云

我们先用词云看看评论的全貌。我们分别为正面评价和负面评价画一个词云,看看区别。我们删除了在正面和负面评论中出现频率非常高的词,包括“chipotle”、“burrito”和“place”,因为它们在两个图中都非常大。我们可以看到,正面评价中最大的词是“肉”、“工作人员”、“服务”,而负面评价中最大的词是“行”和“鸡”。顾客喜欢 Chipotle 的肉,但鸡肉似乎不是这样。尽管 Chipotle 的队伍可能有点长,顾客可能要等一会儿,但他们对 Chipotle 的员工和服务感到满意。

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

图表 5

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

图表 6

e)主题建模

考虑到评论的大背景,我们使用主题建模,特别是通过 Mallet (LdaMallet)的潜在 Dirichlet 分配,从所有单词中提取关键主题。然后,我们衡量每个主题的情感得分,看看 Chipotle 在哪些方面做得好,哪些方面做得差。

我们画一个六边形,每个分数加 0.1,让对比更清晰。我们可以从图表 7 中看到,与成分相关的主题(新鲜度/成分/质量)得分最高,与 Chipotle 的“新鲜度”和“完整性”的价值观相呼应。与环境相关的主题(位置/干净/漂亮/友好)获得第二高。与排队相关的话题(时间/排队/等待/长时间/在线)、与食物相关的话题(肉/鸡肉/薯条/米饭/鳄梨酱/牛排/生菜)、与服务相关的话题(服务/员工/糟糕)、与支付相关的话题(支付/经理/收银员)得分较低。

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

图表 7

我们将每个评论分配给占该评论比例最大的主题,并计算一段时间内所有六个主题的平均情绪得分。为了更清楚地看到 4 个得分较低的主题的趋势,我们绘制了图表,将它们与成分相关的主题(新鲜度/成分/质量)进行比较。我们发现,线路相关话题(时间/线路/等待/时长/在线)的平均情绪得分在 2013 年之前在 0.1 左右浮动,2013 年显著下降,之后在 0 左右浮动(图 8)。

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

图表 8

f)时间序列情感分析

利用时间序列方法,我们将感兴趣词(WOI)的情感变化与每月的星级变化一起可视化。我们首先定义衡量词语情感的标准:

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

像词云一样,我们根据 WOI 在正面/负面评论中的出现频率来确定其情绪。我们将这种情况正常化,因为评论的总数每月都在变化。因此,该指标测量在任一情绪类别的评论中 WOI 的归一化频率。如附录 1.1 所示,正面评价和负面评价都是随着时间的推移逐渐增加的。我们还决定只分析 2012 年之后的评论,因为 2012 年之前的评论太少了(附录 1.1)。我们使用三种方法来解释我们的可视化指标。

1.正面评价中 WOI 出现率下降

如果一个词曾经有很高的阳性率,我们可以说它是企业的强项。正比率的下降表明餐厅正在失去这方面的优势。根据图 9,Chipotle 应该调查其菜单项的新鲜度及其墨西哥卷饼产品的质量。

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

图表 9

2.负面评论中 WOI 出现率增加

负面评价出现率较高的 WOI 表明 Chipotle 在这方面可能表现不佳。从图表 10 可以看出,“线”的出现率从 2012 年开始增加,从 2015 年开始减少。这一下降反映了 Chipotle 在 2014 年推出了其移动订购应用,旨在减少 line。因此,我们可以推断,Chipotle 通过数字订购缩短顾客等待时间的策略是成功的。展望未来,Chipotle 应该继续推行这一举措。

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

图表 10

3.两种综述中 WOI 发生率的比较

如果 WOI 在正面评论中的出现率高于负面评论,则它是正面情绪。我们将“伟大”视为基线(附录 1.2)。因此,当一个中立的 WOI 在正面评论中的出现率高于负面评论时,它可以被视为该业务的一个积极方面。反之亦然。图表 11 显示“在线”和“应用程序”都是中性词,但在负面评价中的出现率始终高于正面评价。这表明 Chipotle 在数字商务渠道中表现不佳。它需要改进其移动订购应用程序和在线订购系统,以增强客户的购买体验。

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

图表 11

推荐

根据我们的分析结果,我们在配料质量、等待时间和数字订购方面向 Chipotle 提出了建议。

从主题建模中,我们发现与配料相关的主题(新鲜/配料/质量)具有最高的情感得分,这与 Chipotle 提供完整新鲜食品的战略优势相一致。然而,随着时间的推移,通过可视化关键词“新鲜”的情绪,我们发现“新鲜”正在慢慢消失在积极的评论中。这表明,从消费者的角度来看,Chipotle 正在失去其在采购新鲜食材方面的优势。因此,Chipotle 应该调查其原料的新鲜度和质量,以重新获得战略优势。另一方面,我们建议 Chipotle 调查其供应链,看看如何提高其蛋白质的质量和口味,特别是鸡肉,根据词云,它在负面评论中出现得非常频繁。就其菜单项而言,Chipotle 还需要调查其最重要的产品墨西哥卷饼的当前质量,这种产品在正面评价中越来越少。也可以对墨西哥卷饼做一些市场调查,看看为什么墨西哥卷饼正在失去对顾客的吸引力。

另一方面,等待时间和排队显然是 Chipotle 的一个问题。主题建模和词云都表明,“线”是顾客对 Chipotle 负面情绪的一大贡献因素。为了解决这一问题,Chipotle 寻求在线订购和移动应用程序订购等数字渠道。如情感分析所示,等待时间问题因 2014 年引入移动应用程序订购而得到改善。然而,这还不够。我们发现“在线”和“应用程序”在顾客评论中的负面影响更大,表明顾客对 Chipotle 的数字订购体验不满意。有鉴于此,Chipotle 需要改进其在线订购系统和移动应用程序,以便更好地解决等待时间问题,并改善客户的购买体验。

是的,你可以在网上成为一名数据科学家。以下是方法。

原文:https://towardsdatascience.com/yes-you-can-become-a-data-scientist-online-heres-how-dc73c7faae0f?source=collection_archive---------12-----------------------

在线学习的专业数据科学家指导您在家开始数据科学生涯

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

维多利亚·希斯在Unsplash【1】上拍摄的照片。

目录

  1. 介绍
  2. 在线课程
  3. 在线学位
  4. 业余的
  5. 摘要
  6. 参考

介绍

几篇文章强调了通过在线课程或学位的方式在数据科学领域取得成功是多么困难和牵强。既然你正在读这篇文章,也许你对自学和在线学习的成功也有一些信念。虽然数据科学似乎是一个新兴的领域,但它已经存在了很长时间,比大多数人意识到的要长。想想谷歌搜索引擎——它利用自然语言处理(NLP),这是数据科学的一个方面。

数据科学可以分为在数据分析、机器学习、人工智能、数据工程、软件工程、统计学和 AB 测试领域学习和工作的人。这些领域中的大多数(如果不是全部的话)都以某种方式涉及到了数据科学。学习数据科学最重要的部分是学习如何解决问题。传统统计学和现代数据科学的主要区别是自动化。假设 2000 年你在 Excel 或 SAS 中进行回归分析,现在有什么不同?现在,在学习数据科学时,有优先考虑的编程语言。Python 可能是自动化传统统计的最重要的工具。为了配合 Python,有几个库或包使数据科学变得更容易和更有效——sk learn、numpy 和 pandas。这些被证明在 20 世纪 90 年代从研究人员和科学家那里得到了相似或精确的原理,但现在被加速到几乎即时的结果、推论和预测。在全球疫情期间,办公室和面对面的机构都停摆了,现在是在线学习的最佳时机,这是前所未有的。

以下是如何成为一名成功的在线数据科学家的几个例子——来自一名在线学习的专业数据科学家。

在线课程

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

刘易斯·基冈——Skillscouter.com 在Unsplash【2】上的照片。

Coursera【3】——一个提供广泛课程和专业以及证书的在线平台。这个项目是由约翰霍普金斯大学开办的。你将学到很多技能,包括:

  • GitHub、机器学习、R 编程、回归分析、数据科学、Rstudio、数据分析、调试、数据操作、正则表达式(REGEX)、数据清理和聚类分析。

该计划显示,约 43%的人开始了新的职业生涯,19%的人在完成课程后获得了加薪或晋升。建议在 11 个月左右的时间内,成功完成这项训练,大约需要 7 个小时/周。因为它是在线的,所以它在 10 个专业化方面非常灵活,包括:

  • 数据科学家的工具箱、R 编程、获取和清理数据、探索性数据分析、Reprfodcle 研究、统计推断、回归模型、实用机器学习、开发数据产品和数据科学顶点。

Coursera 的程序是免费的——用于阅读和查看课程内容;然而,如果你想要完成工作的证书,那么你必须付费(也有经济资助)。完成这个专业,得到学习教授的批准,并得到 LinkedIn 等公司的认可,Coursera 是开始你的数据科学职业生涯的一个很好的方式。

Udemy【4】。Coursera 主要专注于一个中心项目,而 Udemy 则提供各种各样的数据科学课程。从机器学习到 Python,这些课程都很便宜,而且可以更加专业化。Udemy 的好处包括:

  • 无尽的视频
  • 文章
  • 可下载资源
  • 终身访问
  • 手机和电视接入
  • 结业证书

近 300 万名学生已经从 Udemy 学习,无论是从零开始,还是增强或转换他们的职业生涯到完全专注于数据科学。

梅蒂斯【5】。本次培训完全专注于 Kaplan 的数据科学,Kaplan 是一家声誉卓著的机构。Metis 强调是校友,对这个平台赞不绝口。从已建立的公司和创业公司,他们证明了他们的学生确实找到了成功。他们在脸书、Airbnb、IMB、Spotify、苹果和 BuzzFeed 等公司工作。为了使用他们的在线平台,而不是面对面的训练营,他们有一个名为“在线直播”的项目。

该计划的优势:

  • 从著名的数据科学指导中学习
  • 实时指令
  • 与其他同学互动协作

Metis 是一个混合选项,提供在线学习;不需要参加校园学习的在线训练营。

在线学位

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

照片由 Honey Yanibel Minaya CruzUnsplash【6】上拍摄。

更昂贵的选择是传统上从大学获得学位——但在现代意义上,是在线获得。这可能是一种风险更大的小型课程选择,因为你很可能会花费数千美元,但在劳动力中更专业。大学不计其数,大多是为了硕士。

最全面的列表可以在这里【7】找到。该网站包括:顶级学校、在线项目、相关学位、职业、在线课程、资源、训练营和大约 2U。一定要研究你的选择,因为这项投资会更贵,但从长远来看对你帮助最大。

我的故事:我参加了南方卫理公会大学(SMU)【8】在线学习,获得了数据科学硕士学位。我非常喜欢这个节目。通过网上学习,我可以在晚上继续我现在的工作和研究。这些课程都是实时的,你可以在一个晚上把它们堆在一起,也可以把它们分散到一周。我能够与来自世界各地不同背景的同学合作;项目的多样性非常突出。与我的现场本科学习相比,我能够更有效地应用我在网上学到的大部分知识。我在 Indeed 开始了我的正式分析职业生涯,然后搬到了 HomeAway (Vrbo),现在在 ScaleFactor 担任数据科学家。我从网上学习中获得了大部分经验。大多数学生从零开始学习数据科学,有些人在这个项目中不知道编码。在网上大学课程结束时,我的大多数朋友的职业生涯都发生了积极的变化。例如,学生从会计或技术支持职位转向专门的数据科学家,而我从分析化学转向数据科学。

业余的

社区。在线学习空间有一个大得惊人的社区。因为社交媒体在不断发展和增加,已经出现了几种形式的课外学习方式。现在有很多数据科学会议是在线的,而不是面对面的。有些被录制下来,也可以在网上观看。有了 Zoom 和其他会议平台,成为更大社区的一部分变得前所未有的容易和容易。

一些其他的学习方法是 Skillshare 和 YouTube。Skillshare 比传统的在线课程更加个性化,YouTube 上有数千个数据科学家的视频,他们热衷于教授各种技能,无论是用 Python 还是 R 编程,还是用 Airflow 和 GitHub 等工具弥合数据科学和生产机器学习之间的差距。

摘要

越来越多的职业开始于在线学习,数据科学也不例外。随着在家工作也变得越来越受欢迎,在线认证或经验越来越受到重视,有了新的获得在线学习成功的途径。我几乎所有的数据科学知识都是在网上学到的,无论是来自 SMU,一些 YouTube 视频,甚至是来自《走向数据科学》的教程。

读完我的文章后,我希望你会发现自己也有动力在家开始或加强你的数据科学事业。

参考

[1]由维多利亚·希斯Unsplash 上拍摄的照片,(2018)

[2]刘易斯·基冈-Skillscouter.com 在 Unsplash 上拍摄的照片(2020)

[3] Coursera ,(2020)

[4] Udemy ,(2020)

[5] 梅蒂斯,(2020)

[6]Honey Yanibel Minaya Cruz 在 Unsplash 上拍摄的照片,(2018)

[7] 2U 公司, mastersindatascience ,(2020)

[8]SMU(2020 年)

另一个是端到端时间序列项目教程

原文:https://towardsdatascience.com/yet-another-an-end-to-end-time-series-project-tutorial-37390bcea38e?source=collection_archive---------13-----------------------

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

来源:unsplash.com

时间序列分析是经典数据科学领域最常见同时也是最需要的任务之一。你可以在任何地方观察到这种类型的数据:股票和金融交易、物联网产生的数据、线上和线下零售销售,甚至是医疗记录,如心率、EKG、脑电图和核磁共振成像。

在这篇文章中,我用一些例子详细描述了从零开始执行一个时序项目的一般方法。首先,来自数据科学领域的新手分析师和项目经理可能会认为这些内容很有用,但是如果你是一个有点顽固的分析师,我相信你也会很高兴看到一些有趣的想法。

整个项目的代码GitHub资源库上可用

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

来源: memegenerator

时间序列预测是分析师或数据科学家在面对这类数据时试图解决的最常见问题。此外,发展中的物联网领域产生了异常检测任务,然而,在本文中,我们将详细介绍为未来预测而创建的序列模型。

在使用时间序列下的现代机器学习模型之前,考虑它们的一些基本概念非常重要:

  • 机器学习模型没有时间意识
  • 用于 ML 模型的观测值是独立的并且是均匀分布的
  • 信息存储在历史数据中,指示未来时间序列行为的信号
  • 基于树的算法不能预测趋势,也就是说,它们不能外推

注意,你不会在这里发现任何经典统计学和计量经济学模型的提及。这里只描述机器学习算法。当使用了足够的机器学习模型数据时,你在计量经济学模型的超参数选择上花费的时间是不合理的,这是有原因的。

时序项目的总体时间表

根据我的经验,序列分析项目已经通过类似的经典机器学习项目场景实现了。但是,在探索性数据分析和特征生成部分存在重要差异。

下面,我列举了时间序列分析项目中的一般阶段及其描述。

问题定义或目标设定 —项目的第一阶段是进一步执行的基础。在这一阶段,项目经理、数据科学团队或分析师会见代表内部部门或外部客户的业务负责人。在本次会议中,遵循以下清单非常重要:

  • 描述在项目过程中应该解决什么样的业务问题,以及它存在的原因
  • 定义可用数据和文档的整个范围,其中描述了数据生成的来源和方法
  • 定义预测范围的持续时间及其离散性(每小时、每天、每周等)
  • 与业务负责人和来自数据科学团队的人员一起,为模型质量的未来估计及其目标值定义一个关键指标,这些分析师将尝试达到该指标。

探索性数据分析(EDA)——这是所有数据科学项目的一个共同阶段,分析师面对一个新的数据集,并试图对其进行调查。此外,他们还试图评估其特征,如缺失值、数据中平稳值或趋势值分布的存在性等。

数据预处理和特征生成——任何机器学习项目的基本阶段,在这里你必须特别有创造力。在这个阶段,数据科学家生成预测器,这些预测器将成为未来模型的基础。模型的准确性和泛化能力也取决于这些特征。此外,我们不应该跳过模型预测的标准化或规范化步骤。粗略地说,整套功能可分为 3 大类:

  • shift—这种技术在时间序列模型中经常使用。主要的一点是,历史数据点包括关于未来时间点行为的信息。
  • 数学与统计特点 —关键思想与上一个相同,但这里我们要计算历史数据点之间的差异、标准差、最大值、最小值等统计量。
  • 领域知识 —传统上,它是最有用和最有价值的信息,但是提取起来非常复杂。可能存在只有领域专家才熟悉的外部附加数据或特殊统计数据。例如,如果您处理零售交易数据,关于营销活动的信息可能对您的模型非常重要。

培训 —这是一个简单明了的过程。但是,在模型训练期间,您应该始终考虑交叉验证。当您处理时间序列数据时,请确保选择相关类型的交叉验证。最后,不要忘记在这个阶段结束时查看模型准确性。

验证 —为您的模型提供从未见过的新信息,并评估它们的价值。这是对你的模型的碰撞测试。如果您观察到训练和测试的准确性之间的显著差异,很可能它们是过度拟合的,或者在测试数据中遇到了全新的信息。

基线——当您完成第一次训练——测试迭代时,您会得到一个基线。之后,您的目标是通过调整超参数跳过基线精度。

选择——通常你没有足够的时间为你的整套模型设置超参数,所以在第一次训练测试迭代后,你可能会选择最好的一个,然后努力提高它的质量。

整形 —一个基本的项目阶段,在这个阶段,你在调整你的模型的超参数下工作,目的是提高它的预测质量。顺便说一下,创建管道是获得模型超参数的最佳估计值的有效方法。

上线 —因此,在这一步中,我们有了一个足够准确的模型,它适用于企业主。这意味着是时候将我们的模型投入生产环境了。在这一步之前,你的模型可能只能在你的 Jupyter 笔记本上运行,但用户无法使用。为了最大限度地从你的工作中获取价值,你应该把模型放在一个有界面的环境中。这可能是任何人的软件的一部分,或者您也可以使用 Flask/Django,甚至集成到商业智能应用程序中,如 Tableau、QlikSense 或 Power BI。

请允许我忽略某些细节,跳过项目的第一步,尽管这是项目成功的关键因素,并专注于其他方面。

在进一步的解释中,我使用了 Kaggle 数据集,该数据集由 2014 年至 2019 年期间收集的 60 万笔交易数据组成,显示了销售日期和时间、药品品牌名称和销售数量,从个体药店的销售点系统导出。从数据集中选择的一组药物被分为以下解剖治疗化学(ATC)分类系统类别。

探索性数据分析(EDA)

初步数据分析是任何数据科学项目的重要组成部分。使用时间序列有 3 种主要的数据浏览类型:

  • 通过完整性和一致性检查数据质量-
  • 视觉分析
  • 统计分析

数据质量和结构

df.info()

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

因此,从 Kaggle 得到的数据包含两种类型的变量:float64、int64 和没有 NaN/missing 值。很有可能你永远也不会在现实世界中遇到如此清晰的数据。

df.head()

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

  • M01AB —抗炎和抗风湿产品、非类固醇、醋酸衍生物和相关物质
  • M01AE —抗炎和抗风湿产品、非类固醇、丙酸衍生物
  • N02BA——其他止痛药和退烧药、水杨酸及其衍生物
  • N02BE——其他止痛剂和退烧药、吡唑啉酮和苯胺
  • N05B —精神药物、抗焦虑药
  • N05C —精神药物、安眠药和镇静剂
  • R03 —治疗阻塞性气道疾病的药物
  • R06 —全身使用的抗组胺药
df.describe()

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

您可以看到中值和平均值(50%)非常接近,这意味着没有很多异常值。否则,存在,以查看 75%平铺和最大值之间的范围。
让我们算一算我们有多少离群值,它们在哪里。

视觉分析

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

看那个!所有这些都包括异常值。
按照统计学术语,离群值被定义为那些超出 3 IQR 的值。

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

作为探索性数据分析的一部分,有时查看关联矩阵对未来的模型调整或进一步的数据探索非常有用。
上图中,深色代表正相关,浅色代表负相关。例如,如果您想使用线性回归,您必须考虑删除相关变量以提高预测准确性。
在我们的例子中,我们可以看到相关类别(N05B、N05C 和 N02BA、N02BE)之间的弱相关性,以及 M01AE、N02BA 代码之间的有趣关联。进一步分析的目标可能是确定其中的原因。

统计分析

在这部分研究中,我们希望估计几个重要的统计参数:

趋势 —有序时间序列中单向的长期运动。

季节性 —是一系列具有特定重复间隔的事件,例如每月或每年。在大多数情况下,我们试图检测季节性,以消除季节性成分,并提取有关的额外信息,目的是提高模型的性能。注意,不要把季节性和周期性混淆。

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

很容易看出抗组胺药和止痛剂产品的销售有明显的季节性。另外,乍一看,数据看起来很稳定。
让我们通过应用 Dickey-Fuller 检验来确定一个时间序列是否平稳

平稳性 —指时间序列的统计特性不随时间变化。完成对该属性的研究是很重要的,因为如果将来的统计属性不会有很大的不同,那么将来的值可以很容易地预测。迪基-富勒检验或学生的 t 检验可用于观察平稳性。然而,请记住趋势和季节性显然会使数据不稳定,但对于周期来说就不清楚了。统计时间序列算法对此至关重要,如果数据不符合平稳性,就会失败。机器学习方法也受益于数据中更清晰的信号。

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

你可以看到我们已经将数据频率从每天一次改为每月一次
,这使得数据更具可读性,我们可以看到除了一个市场之外的所有市场都具有季节性
,同时,你可以看到 2015 年心理市场的销售数量如何增加,然后急剧下降
除季节性之外的呼吸道疾病市场的销售包括改善趋势
顺便说一下,你可能已经注意到迪基-富勒测试的 p 值图表的标题:

  • 当 p 值> 0,且数据不稳定时。
  • 否则,p 值= 0,零假设被拒绝,该过程被认为是平稳的。

自相关 —表示一段时间内原始时间序列和滞后时间序列之间的相似程度。这是执行回归分析的一个重要部分,因为回归模型假设数据没有自相关,否则不应该期望模型的高质量。

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

来演示。plot_pacf 函数起作用我们取的数据带有季节性。
如果自相关值接近 0,则意味着滞后观测值之间不相关。同时,值接近 1 或-1 的偏相关表明时间序列的滞后观测值之间存在很强的正相关或负相关。
蓝色阴影区域表示置信区间的边界。如果偏相关值超出了这个置信区间区域,那么可以假设观察到的偏相关值在统计上是显著的。

请注意,每日数值与最近的观察值高度相关,否则在月图上,您可以注意到与去年同月的显著相关性。

数据预处理和特征生成

一旦我们完成了探索性数据分析并检测到数据缺陷,就有时间为下一步构建数据集。

有 3 种广泛分布的方法可以更清晰地处理数据,以便进一步预测:

  • 应用 box-cox 变换稳定色散
  • 微分,或者换句话说,移动到相邻观测值的成对差异
  • 季节差异

提示

  • 如果数据集包含负观测值,则 box-cox 变换不可用,但是您可以为整个数据集添加正常数值并应用变换。
  • 在大多数情况下,box-cox 变换不会强烈影响预测的质量,反而会影响预测的范围。
  • 差异化有助于走出季节性和趋势性。除此之外,它还可以多次使用。
  • 两种区分方法可以一起使用,但是如果时间序列具有明显的季节性,最好从季节性区分开始

在我们实现了整个数据集的平稳性之后,是时候进入要素生成部分了。在那里,我们将创建预测器,作为模型的基础。

举例来说,我使用了多个滞后值、分类特征、时间周期和线性回归。实际上,现在试着比我更有创造力,根据你的领域知识生成有价值的特性,显著提高预测的准确性。

在特征生成的最后阶段,不要错过在管道中添加数据标准化的步骤。

培训

在迷人的探索性分析和严格的预处理之后,我们准备开始训练模型。

正如我上面提到的,当有足够的观测数据可用,并且您能够使用机器学习算法时,设置 ARMA、ARIMA、SARIMA 等统计模型的参数是不值得的。

因此,让我们同时训练几个模型,并通过 MAE 查看它们的质量,并在图表上强调错误线的部分,这些将展示模型失败的地方。

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

让我来说一说我们如何监控预测的偏差。有许多指标允许跟踪回归模型的性能,但是最流行的是:

MSE (均方差)——关注预测模型的多方向误差,但同时对异常值敏感,且由于缺乏与原始误差直接可比的可能性,解释复杂。

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

RMSE (均方根误差)—为了提高解释能力,我们能够采用平方根,并将完成值称为均方根误差,但它仍然对不良预测点敏感。在捕捉到一些不好的点之后,即使一个好的性能回归模型也会显示出很高的误差值。

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

MAE (平均绝对误差)——由于计算偏差的绝对值,我们能够最小化预测中坏点的影响。

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

MAPE (平均绝对百分比误差) 是相对性能指标之一,允许跨不同数据集比较模型的有效性,即使具有不同的观察范围。该指标的主要限制是,当数据集包含任何真实实例的零值时,不能使用它。

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

R 平方(决定系数) 显示模型对真实点的解释程度。定义域的取值范围为 0 到 1,越接近 1,实际观察值就越接近模型线。请注意,系数的缺点是当模型中加入额外的变量时,它的值会增长,即使这些变量并不显著。因此,R 平方不能用于比较变量数量不同的模型。

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

测试

在迭代的最后一步,我们想要比较预测值和我们的模型在项目的先前阶段从未见过的真实实例。遵循模型失败时的精确度和位置。如果您检测到在训练和测试数据集上计算的所选性能指标的级别之间存在显著差异,这将意味着您的模型过度拟合。要修复它,您应该自定义模型参数。

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

结论

本文描述了用机器学习算法建立预测模型的一般方法,并给出了第一次迭代的例子。然而,为了达到高质量的预测并为业务用户提取最大价值,在您的进一步迭代中,我建议将重点放在调整模型超参数、开发管道并将其置于生产环境中。

又一个“臭名昭著”的预测

原文:https://towardsdatascience.com/yet-another-notorious-prediction-a5b9d18cc710?source=collection_archive---------35-----------------------

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

Unsplashattendee拍照

预测一场战斗有多难?

作为一个普通的 MMA 粉丝,我的社交媒体上充斥着关于即将到来的康纳“臭名昭著”麦格雷戈对唐纳德“牛仔”塞罗恩比赛的帖子和文章链接。在 Lianne 和 Justin 在《走向数据科学》的文章中看到这个话题,我仍然感到惊讶。读了那篇文章后,我开始思考如何为这场比赛建立一个更好的预测。

数据

使用 www.fightprior.com 上共享的代码,我搜集了麦格雷戈、塞罗纳和他们来自 Sherdog.com的对手的 MMA 比赛历史,得到了 15000 场比赛的结果。

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

来自 sherdog.com

即使是一个普通的粉丝也知道“风格决定战斗”Sherdog 的数据显示了战斗是如何决定的,但几乎没有关于战士们如何赢得和输掉比赛的信息。我们能做什么来表现风格?进入福克斯体育 UFC 统计页面。

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

来自 foxsports.com

逆转(REV)、提交(SUB)、击倒(TD)和击打(STR)的次数是量化拳手风格的一种方式。但是这个数据有两个问题:这个表只有 139 名战士在收集的比赛历史中的数据,并且只有当前的生命统计数据。

例如,Sherdog 报告康纳的第一场比赛是由 TKO 通过罢工战胜加里莫里斯(2008 年 3 月)。但是在这场比赛中,康纳(大概)在他的职业生涯中没有任何表现。为了正确估计总打击模型对获胜概率的影响,我们希望第一场比赛的这些统计为零,然后对于 McGregor 的第二场比赛,我们希望包括第一场比赛的打击。相反,我们只有截至 2020 年 1 月的终身总罢工。

使用寿命总计来构建模型会在旧匹配的记录中产生来自未来的泄漏。后果是严重的:模型的成功预测可能被夸大了,并且这些统计数据之间的真实关系(如果有的话)成功的机会没有显示在数据中。

所以,在现实生活中,这些数据并不适合使用。但是对于一个没有错误负面影响的预测来说,看看它的表现可能会很有趣。

模型

Lianne 和 Justin 的文章报道了一个改进的 Elo 评级过程,并估计 McGregor 获胜的概率为 82%。我们的首要任务是用更小的数据集来验证这个结果。

PlayerRatings 包包含多个 Elo 评级变化。要捕捉评级随时间的完整演变,需要一个循环,如下所示:

结果与 Lianne 和 Justin 的工作方向一致,显示 McGregor 的评级在 2013 年超过 Cerrone。最终的评分是麦格雷戈 2550 分,赛罗内 2451 分,这意味着麦格雷戈获胜的概率是 64%。

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

这个预测有多好?我们可以从整个历史中获取赛前评级,并查看他们正确预测比赛结果的频率。下面的代码生成适当的评级列,并合并到 Fox Sports 的职业统计数据中,以创建最终的分析表。

这建立了大约 55%的正确预测的基线性能。对于增强模型,我们将通过 mgcv 包使用一个逻辑游戏。R 代码很简单:

gratia 包的 draw()函数从 GAM 生成平滑的 ggplot2 图表。

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

gratia::draw()显示了 GAM 估计的响应

有趣的是,收视率的差异(diffRate)给出了一个线性关系。。。据推测,逻辑链接负责这个驱动程序的非线性。敲除的差异(KDdiff)显示了与方向适当的结果的非常复杂的关系。每个拳击手获胜的双变量平滑显示,如果每个拳击手以相似的获胜次数进入拳击场,对战斗的结果几乎没有影响。

在训练样本上,该模型正确预测匹配的概率为 62%。并且在保持上做得更好,准确率为 63%,比单独的 Elo 评级提高了 15%。

这有点令人失望,甚至在承认它可能比现实更好之前,因为每个战士都使用了一生的统计数据。

最终预测

完成所有这些后,我们可以收集代表 McGregor-Cerrone 比赛的数据,并了解到玩家仍然喜欢“臭名昭著”(McGregor 获胜的概率为 62%)。这是两个模型在不同的数据上使用不同的方法显示麦格雷戈可能会赢。寻找第三个预测,让我们考虑一下公布的投注赔率。

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

照片由希瑟·吉尔Unsplash 上拍摄

麦格雷戈目前的下注线(截至 2020 年 1 月 13 日)是-325。将其转换为赔率,然后转换为概率,这相当于预测麦格雷戈的胜率约为 75%。

我很惊讶这些赔率对‘臭名昭著’如此有利。由于麦格雷戈已经离开拳击台很长一段时间(自 2018 年 10 月以来),Cerrone 很活跃(尽管经历了两连败),而且比赛重量更重(Cerrone 是两者中较大的一个),我认为“牛仔”有很大的机会获胜。考虑到游戏数据的问题和 Elo 评分显示的表现不足,我觉得这两个模型都不可信。我相信赌注已经被麦格雷戈在媒体上的过度表现动摇了。

我要选 Cerrone。

用 Python 构建收益率曲线

原文:https://towardsdatascience.com/yield-curve-building-in-python-8d7974a6e7e3?source=collection_archive---------7-----------------------

利用互换利率和 B 样条函数构建英镑互换期限结构

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

图片来自 Pixabay

收益率曲线的三个主要驱动因素

  1. 未来利率变化的市场预期
  2. 风险溢价
  3. 凸度偏差

从概念上讲,很容易将利率期限结构分解成这三个部分。

在现实中,司机在时间上是动态的,永远无法直接观察到。这使得现实世界的曲线形状更难解释,甚至可以让最好的生产模型变得陈旧。

任何有用分析的前提是知道曲线在哪里。

在流动性市场中,构建合适的曲线只需要很少的参数。通过在从经销商处的双向价格中可观察到的持续更新的价格之间进行插值,来处理繁重的工作。

在流动性差的市场,价格流干涸了。可观察到的市场价格变得稀缺,规模缩小,买卖盘扩大。这些低确定性时期可以成就或摧毁交易商、基金经理和交易算法。在这种情况下,拥有一个好的收益率曲线模型的潜在好处尤其大。

离开一会儿。推理统计学和数据挖掘(包括机器学习)的基础思想是,可以从样本数据中得出潜在过程的有意义的结论。一个被忽视但重要的子问题是在给定小样本的情况下提取推断。

将这个统计子问题与有利可图的金融建模任务相结合,这篇文章给出了以下结果:

1)使用 Python

对英镑(GBP)互换利率期限结构进行简单的 B 样条构造 2)过度拟合和领域主导的参数选择
3)不同市场条件下的压力测试

数据和方法

2020 年 1 月 30 日,英格兰银行货币政策委员会投票(7-2)维持英国利率不变。就在第二天,英国终止了欧盟成员资格。

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

ICE 交换率数据集

远离正常的市场环境,这使得英镑利率成为一个有趣的分析资产类别。注意,收益率曲线反转在曲线的前面。

给定 2020 年 1 月 30 日采样的英镑掉期利率数据(通过 ICE fixing),目标是构建完整的掉期利率期限结构。也就是说,为 3 个月到 30 年之间的任何期限构建一个互换利率。

ICE 的掉期利率数据通常从 1 年期开始,但是由于 1 年期掉期缺乏流动性,因此没有公布。因此,我增加了 3 个月和 6 个月的伦敦银行同业拆放利率,丰富了数据集。单位为百分比。

由于我使用了 Libor 和复合利率(来自互换),在这一点上零利率应该是自举的。然而,我们的目标是探索 B 样条回归,所以我选择不规范约定。它产生了一组更有趣的拟合点。

澄清一下,我没有预测利率。使用经济/社会/其他跨市场指标预测利率是另一回事。我们的目标是构建一幅市场描绘曲线的图画,而不是曲线应该在哪里(跳过有效市场假说)。

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

截至 2020 年 1 月 30 日的英国互换利率(来源:ICE)

来源: Ice 掉期利率Libor 利率

英镑互换期限结构的 b 样条构造

一个阶 M 的样条函数是输入变量中的一个次 M-1 的分段多项式。多项式块相遇的输入空间的值被称为节点。纽结以非递减顺序排序,当不同时,多项式段的第一个 M-2 导数在每个纽结上连续

任何样条函数都可以表示为同一分区上相同次数的**基样条(B 样条)**的唯一线性组合。我使用最小二乘法进行回归,以使模型符合扩充输入空间上的交换率数据集。以下是 B 样条曲线设置:

#B-spline Settings
M = 4
knots = [7.25,15.5,22.75]

没有太多的设置。

订单

4 阶样条函数对应于 3 次幂的多项式。4 阶样条俗称三次样条。三次样条是最低阶的样条,其纽结不连续性对于人眼是不可见的。光滑函数可以用局部多项式的更高次幂来实现,但是很少有理由超越三次样条。

绳结

我选择了三次样条与开放统一节点。这是一个结序列,其中内部结在输入域上等距分布,并在计算样条的域的边界处填充了额外的 M 个重复结。

这是第一个曲线构造的结果。

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

基于截至 2020 年 1 月 30 日的英国互换利率数据构建 b 样条曲线

b 样条 Python 代码

SciPy python 库提供了有用的函数来实现和评估一组样条函数。不过我自己实现了德布尔的除法差分算法。

遵照其他 ML 模型对象的结构,我构建了一个*。fit()* 函数对从返回的矩阵描述的样条使用最小二乘回归。build_spline_mat()

最后一步是*。predict()* 函数,在给定原始输入空间中的 x 值的情况下,填充插值,交换高音。

到目前为止…

鉴于英国利率数据,全球形势似乎得到了相对较好的描述。然而,曲线短端速率的可变性导致了该样条设置的一些局部问题。

虽然安装简单,但这离完工还很远。我现在介绍一个好的模型必须符合的关键标准,以及在不同市场条件下稳定性的潜在扩展。

什么构成了好的曲线?

判断施工方法质量的标准很短。

1)我能否将输入市场利率复制为构建曲线的输出?

2)曲线的稳定性如何?

第一次尝试没有成功。

曲线构建从一组观察到的市场价格开始,并且必须将这些价格恢复为输出。在其他回归实例中,这将是一个主要的过度拟合问题。但是根据定义,过度拟合假设数据表现出随机误差,这与有效市场假说相反——在给定当前信息的情况下,价格总是公平的。不管怎样,这种情况需要一个描述性模型,而不是预测性模型。

在这种情况下,样条线是一个完美的选择。它们允许输入之间的灵活插值。这种灵活性由样条线的顺序、域节点向量平滑控制。

平滑是一种正则化技术,与任何其他技术一样,它牺牲训练精度以支持系数的较低方差。这里,正则化反对我们的目标,所以我没有实现任何平滑。

回想一下,三次 b 样条的阶数是 4。我没有改变。这让我有了结的选择。

结选择

由于节点向量被填充,节点选择减少到拾取内部节点。一些研究论文深入研究最优节点选择,但这在很大程度上是领域不可知的。对于这个分析,我想通过领域知识来激发内部结的选择。

掉期交易通常被曲线各部分的驱动因素所分割。这种分割可能如下所示:

0y-2y

2y-6y

6y-12y

12y+

我使用了相关的结序列[2.5,6.5,12.5], kv3 ,作为下面一组结向量的一部分。

# interior knot vectors
kv1 = [7.25, 15.5, 22.75]
kv2 = [3.5, 7.5, 13.5]
kv3 = [2.5, 6.5, 12.5]

注意, kv2 分割域以确保每个区间内输入的均匀分布。

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

具有 3 个可选节点序列的 b 样条构造

如你所见——也好不到哪里去。我扔掉了结向量 kv1-kv3 。由于拟合的困难在于曲线的短端,我想也许纽结序列应该通过增加利率波动的已知区域的自由度来确定。我在这个区域添加了更多的结,并制作了序列 k4 — k6

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

3 种不同的打结顺序

然而,随着更多的迭代,我得到了一个额外的序列 k7 (只有 4 个内部结),我放弃了 k4

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

捕捉到转折点的 3 个结序列

所有三个模型都满足第一个标准。这种差异出现在收益率曲线反转前端的转折点。

在这个阶段很难说哪种特定的结构是最好的。在 600 万到 2000 万年期之间没有任何价格的情况下,选择变成了宏观经济观点的函数。尤其是对英国央行(BoE)基本利率在整个 2020 年的预期。基本利率目前为 0.75%。kv7 是唯一一条不考虑任何加息因素的曲线。我选了 kv7 。回想一下,这些数据点是在 1 月份的英国央行会议之前公布的。

这是一个简化的模型,没有使用短期英镑期货。实际上,交易所交易产品与场外交易(OTC)产品一起使用,正是为了弥补这种类型的不确定性。

关于标准 2。

‘曲线稳定性’是什么意思?

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

鉴于曲线的长、中和短端具有相关但根本不同的波动来源,输入空间的局部变化应仅转化为构建曲线的局部变化。

使用纽结序列 k7 ,我提出了代表不同市场情景的四种扰动情景。我对扰动变化的局部差异不感兴趣,而是对曲线未变化部分的差异感兴趣。

应用于输入速率的 4 组凸起如表中所示。

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

希望 GIF 原谅我无耻的 PyCharm 截图。

场景 0

好消息是曲线的形状保持不变。

有趣的是,在输入的均匀 +1 个基点(bp)移动后,看到构建曲线的非均匀平移。这表明结之间的曲率发生了变化,因此高阶多项式的系数发生了变化,而不仅仅是常数项发生了变化。

这确实有风险管理的含义,但也是最简单的论点——如果 7y8y 互换利率下跌了 1bp,为什么 7.5y 点的变动不应该是 1bp?

不应该。但是,每一种模式都是一种取舍。在这里,它是针对高阶差异的曲线的重要部分的行为。

场景 1

前期利率上涨。曲线的 2y+部分没有移动。前途无量。

场景二

这是一个转移视线的场景。如果曲线输入错误,曲线会如何反应?在这里,10 年期利率比基准利率低了 5 个基点。

我对结果有两种想法。

1)我很高兴看到错误没有完全破坏曲线。

2)它对输入错误几乎太有弹性了。如果不仔细检查输入,我根本不知道有错误。我想这取决于你的风格。好斗 vs 偏执 —你的选择。

场景 3

多头抛售。曲线的短端没有移动。10y-15y 区域中的一些小曲率调整。总而言之,扎实。

裁决和延期

一开始是一个关于 B 样条的小项目,后来发展到更深入地研究结的选择,作为市场驱动因素的一个功能,并在不同的市场条件下对曲线稳定性进行压力测试。

我发现了一种 B 样条表示,当传递一组输入和输入空间的域启发分区时,会返回一种结构,这种结构足够灵活,既能冲击市场价格,又能在本地适应输入市场价格的波动。

不幸的是,结的选择过程是低效的。几乎没有时间来迭代纽结序列。我很有兴趣看到一个固定的结序列在一整天的市场运动中的准确性。第二个扩展将是探索最佳结的选择。我还想探索作为买卖价差代理的标准误差带,并在这样做时比较 MLE 和 Bootstrapped 方法。

我的代码在 GitHub 上,欢迎你尝试这些想法。

事实是,这只是构建收益率曲线的众多方法之一。我在下面留了一个阅读部分,介绍替代方法和扩展。

我的故事

虽然我的学术背景是数学和统计学,但我的就业背景是交易利率期权。19 年 10 月,我离开了交易行业,去探索创业和数据科学的交集。我对推荐系统、健身数据、金融市场、人类记忆和自动化感兴趣。

如果你们有共同的兴趣或者只是想取得联系,请在下面或者在 LinkedIn 上给我留言。在过去的 9 个月里,我还写了一系列关于统计数据主题的文章中的

进一步阅读

  1. 机器学习中的 B 样条,Andre S. Douzette
  2. 构建收益率曲线的方法,Hagan,West
  3. 课程笔记,卡内基梅隆大学高级数据分析
  4. 在 Factset 建立互换曲线,戴维斯,刘
  5. 如何选择绳结,MathWorks

YOLO 使简单:解读《你只看一次》一文

原文:https://towardsdatascience.com/yolo-made-simple-interpreting-the-you-only-look-once-paper-55f72886ab73?source=collection_archive---------18-----------------------

浏览论文中的实质细节和经常被忽视的事实,并简单解释。

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

YOLO:你只看一次——来源来源:卡内尔斯在 pixabay

与最先进的 R-CNN 模型不同,“YOLO:统一的实时对象检测”或“YOLOv1”提供了一种端到端的对象检测和分类解决方案。这意味着我们可以训练单个模型直接从输入图像进行检测和分类,并且是完全可微分的。对象检测的传统方法的例子是在图像的不同部分上以不同的比例运行分类器。整洁,对不对?!你所需要的只是一个分类器。

听起来很简单,在一张图像上运行数百次分类器来定位对象是非常低效的。但 YOLOv1 处理得很巧妙。它通过图像的单次向前传递进行检测和分类,并实时运行。因此得名“你只看一次”。我们将详细研究论文中描述的所有内容。

介绍

作者将 YOLO 的工作比作人类的感知。我们,人类,看一眼一个场景,立刻就能对现在的情况,在哪里,谁在做什么有个大概的了解,还有更多。人类的视觉皮层很神奇吧?YOLOv1 通过将对象检测和分类问题视为回归,一次性预测图像中存在哪些对象以及它们的位置。简单地说,你给 YOLO 模型一个图像,它通过一堆层,最终输出将是类预测和边界框坐标。在这里,作者简明扼要地将 YOLO 的工作定义为

直接从图像像素到包围盒坐标和类别概率。

YOLO 的物体探测方法

YOLO 通过使用一个优雅的过程来处理物体检测,将图像分成一个由 S x S 细胞组成的网格。而 YOLO 将输入限制为正方形图像。

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

S×S 网格

如果对象的中心落在特定的单元内,则每个单元产生对象的类别和边界预测。这种方法是强大的,因为它使 YOLO 能够检测图像中的多个对象,并同时对它们进行分类。然而,将图像划分成更多的单元将产生更细粒度的预测。网格中的每个单元负责预测边界框参数、对象存在的置信度和类别概率。最终的边界框预测由框中心的 x 和 y 坐标、sqrt(宽度)、sqrt(高度)和对象概率得分组成。

注意:YOLOv1 预测边界框相对于图像的宽度和高度的平方根。原因在 损失功能 一节下面解释。

如果有 20 个类( C =20),则单元格的输出为【x,y, w, h,对象概率, C1,C2,C3,…。,C20 。上述概率是条件类概率。为了澄清,它是给定对象存在于单元中,对象属于特定类的概率。当然,单元格网格中的每个单元格都预测类似的项目列表。

但是还有一件事。在 YOLOv1 中,每个单元格预测的不是一个而是 B 边界框。而这些包围盒每一个都有[x,y, w, h,物体概率]。然而,YOLO 只对每个像元预测一次类别概率,而不考虑边界框的数量。因此,每个单元的输出现在有更多的项目。举例说明,如果 B =2、 C =20,则输出增长为[x1,y1, w1, h1,obj。prob1,x2,y2, w2, h2,obj。C1,C2,…,C20 。

对于在具有 20 个类别的 PASCAL VOC 上的检测,它预测 7×7 的单元网格,每个单元具有 2 个边界框。考虑到所有单元格的预测,输出形状将是一个立方体,其尺寸为( 7 x 7 x 30 )。由于 C =20,两个边界框贡献了 10 项,并且类别概率有 20 项。这加起来就是三十,这就解释了第三次元中的“”30”。

解读 YOLO 的产量预测

边界框中心的 x 和 y 坐标相对于该网格单元的左上角,而不是相对于图像的左上角。每个单元格预测相对于其位置的坐标,这些坐标作为单元格位置的偏移量。

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

照片由 Charis GegelmanUnsplash 上拍摄

如果我们将图像分成 3 x 3 个网格单元,如上图所示,对象的中心落在中心网格单元内。而如果我们再假设每个网格单元的宽度和高度都是 A、 的话,那么对象中心的坐标就是( 0.6A、0.6A )相对于单元的左上角。模型预测的坐标值在 01 之间,是 A. 的一个分数,因此,坐标( 0.6,0.6 )表示 A 的长度向右的60%这些坐标可以相对于整个图像进行转换,因为我们知道哪个单元预测了盒子及其相对坐标。******

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

对象中心相对于图像的坐标

对于上面的例子,盒子相对于图像的中心是 (A+0.6A,A+0.6A)。* 原 A 加到 0.6A* 是单元格左上角到图像左上角的距离。因此,总和给出了盒子中心相对于整个图像的坐标。但是边界框的高度和宽度是相对于整个图像预测的。对于上面的“猫”的例子,边界框的高度几乎是图像高度的三分之二。并且该框的宽度是图像宽度的三分之一。*

因此,YOLO 将宽度和高度预测为图像的宽度(【W*)和高度()分别为1/32/3*。因此宽度和高度预测意味着 √( 0.33W), √( 0.66H)。** 最后,一个物体的概率也表示为一个介于 01 之间的数。该对象概率乘以预测框与地面真实值的交集(IoU)以给出 置信度得分 。IoU 是一个分数,它表明预测框与实际框重叠的程度。其值也在分别表示无重叠和完全重叠的 01 之间。**

置信度得分 1 表示 100%置信度,0T5,0%置信度。该值越高,单元格越确信有对象存在。这个置信度得分乘以条件类概率,以产生给定类存在的概率得分。

最终预测的包围盒参数应该是( 0.6,0.6,0.33,0.66,1 )表示(x,y,width,height,obj。prob)。

网络架构

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

YOLOv1 架构来源:https://arxiv.org/pdf/1506.02640.pdf本文作者拥有这张图片。我只是用它来说明他们的工作!

自 YOLOv1 于 2015 年问世以来,它遵循了典型的卷积架构,但创新了预测输出的方式。它有 24 个卷积层,4 个最大池层和两个全连接层,一个有4096 个** 神经元,另一个有1470 个 神经元。该模型接收尺寸为 448 x 448 的输入彩色图像,用于对象检测。正如我们之前看到的,YOLOv1 预测了来自其最终完全连接层的 长方体 输出。那是用1470 个 神经元将最后一个全连接层的输出重塑成一个(7×7×30)长方体为帕斯卡 VOC。显式地,我们可以看到最后一层有1470 个 神经元,因为它需要被重塑为7 x 7 x 30 = 1470。**

特征提取器由不同滤波器大小的卷积层构建,其中一些卷积层之后是后续的最大池层,用于空间缩减。平常的东西!在 YOLO 模型中,只有第一个卷积层有 7 x 7 滤镜。其他的都有 3 x 3 滤镜网络不仅仅使用交替 3 x 3 卷积和最大池层数,而是使用 1 x 1 卷积。

作者提到他们的架构受到了引入了 Inception 模块的 GoogLeNet 的启发。

我们的网络架构受 GoogLeNet 图像分类模型的启发

但与 GoogLeNet 不同,YOLOv1 不使用 inception 块。相反,在应用大量的3×3过滤器之后,它使用1×1卷积来减少特征图的通道深度。 1 x 1 滤镜有一个非常小的感受域(只有一个像素),但它们主要用于减少 3 x 3 卷积层之后各层的计算负载。此外,它们有助于在不改变感受野的情况下引入非线性。

不太明白?我们将详细研究为什么它是有益的。

1 x 1 卷积

1×1卷积的概念是在闵等人的论文网络中的网络中介绍的,这里看一下论文

注意:以下示例解释了带有卷积层的小模型的 1 x 1 卷积。不要把这个示例模型与 YOLO 的建筑混淆

例如,考虑大小为 (100,100,3) 的输入图像被馈送到具有零填充的 128 个滤波器的3×3卷积层。我们零填充以产生与输入*【100,100】相同空间维度的输出特征图。为了简单起见,我们忽略批次维度。每个滤波器与输入图像卷积后产生一个 (100,100,1) 输出特征图。由于我们有 128 个这样的滤波器,滤波器输出附加到信道维度以产生形状为 (100,100,128) 的输出。这一层的权重大小应该是 (3,3,3,128) 也就是(filter_x_size,filter_y_size,input_channels,filter _ number)。*

目前为止还好(只是正常卷积!).

现在,如果我们再次将这个输出馈送到下一个具有 128 个滤波器的3×3卷积层,它的权重将必须是 (3,3,128,128)。

你现在明白了吗?第一层只有 3456 个参数(3x3x3x128 = 3,456)。但是,由于第二层对 128 个通道的输入进行操作,因此它有多达 147,456 个参数(3x3x128x128=147,456)!现在想想后续层会有多少参数?为了减少这种爆炸效应,在将第一卷积层的 (100,100,128) 输出馈送到下一层之前,应用 1 x 1 卷积。

(100,100,128) 应用 32 个1×1滤波器,将通道深度减少到 (100,100,32)。 现在,下一个 3 x 3 卷积层的参数将是 (3,3,32,128) 。参数的数量从 147456 个减少到 36864 个 (3x3x32x128) 。除此之外, 1 x 1 卷积层有 128x32=4096 个参数。现在总共只有 40,960 个参数,少了 3.6 倍!

YOLOv1 模型在两个完全连接的层之间使用了一个压差,以防止过度拟合。但它没有使用任何其他技术,如批量标准化可以加速训练。

既然我们已经看到了什么是 1 x 1 卷积,让我们继续讨论网络的其他内容。

培养

我们在开始时看到,网络有 24 个卷积层、4 个最大池层和 2 个光纤通道层。

跳到这里来学习

如何建立一个简单的卷积神经网络,在 kaggle 数据集上训练并达到 99.9%的准确率!

**作者在 ImageNet 数据集上以 224 x 224 的输入分辨率预训练了前二十个卷积层。它的分辨率只有 YOLOv1 的检测输入的一半,即 448 x 448。这显然是因为 ImageNet 图像的大小为 224 x 224。

我们在 ImageNet 分类任务中以一半的分辨率(224 × 224 输入图像)预训练卷积层,然后将分辨率提高一倍用于检测——yolo v1 作者

由于只有前 20 个卷积层用于迁移学习,它可以对任何分辨率的输入图像进行操作。

预训练有助于卷积滤波器从 ImageNet 数据集学习模式。由于它包含了属于一千多个类别的大量图像,卷积层可以学习许多有用的特征。预训练和迁移学习为 YOLO 检测提供了很好的性能提升。

对于预训练,我们使用图中的前 20 个卷积层,随后是一个平均池层和一个全连接层——yolov 1 作者

在 ImageNet 上进行预训练后,移除平均池和完全连接的预测层。它们被四个 3 x 3 卷积层和两个全连接层取代。

注意:仅对于使用 S=7,B=2 的 PASCAL VOC 数据集,输出尺寸为 7 x 7 x 30。如果任何一个参数 S (网格单元数 S x S), B 或数据集中的类数发生变化,这个输出形状也会发生变化。

这些级联卷积和最大池层将特征图的空间维度从 448 x 448 减少到所需的 7 x 7 大小**

除了最终完全连接的层之外,网络中的所有层都使用“Leaky-Relu”激活功能。并且最后一层具有线性激活。

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

Leaky-Relu 的数学表达式

Leaky-relu 的图形与整流线性单元(relu)略有不同。看一看!

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

Leaky-Relu 激活函数图

需要注意的一件重要事情是最终层的输出。正如我们之前提到的,它有一个 线性激活 ,它的输出被整形形成一个7×7×30张量。最后,YOLOv1 模型在 PASCAL VOC 数据集上训练了 135 个时期。作者采用的一些训练技巧如下。

在整个训练过程中,我们使用的批量大小为 64,动量为 0.9,衰减为 0.0005。对于第一个时期,我们将学习率从 103 慢慢提高到 102。我们继续用 102 训练 75 个周期,然后 10^−3 训练 30 个周期,最后 10^−4 训练 30 个周期。

损失函数

YOLO 的损失函数可能看起来吓人,但它非常简单。使用的损失称为 平方和损失 ,用于 YOLOv1 中的所有任务。作者引用说,优化平方和比对数似然更容易。但是他们也提到它有一些缺点。

平方和误差同等地衡量定位误差和分类误差。而且,由于图像中的许多网格单元不包含任何对象,平方和误差试图使这些单元的置信度得分为零。这意味着他们的损失将主导梯度,它不会让模型收敛。为了解决这个问题,作者引入了参数 λcoordλnoobj。

这两个参数对损失函数中的不同项进行加权,以保持无对象像元造成的损失较低。并且也更加权衡坐标损失。

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

YOLOv1 的损失函数来源:https://arxiv.org/pdf/1506.02640.pdf再次声明,作者拥有这张图片。我只是用它来说明他们的工作!

让我们把它分解一下,了解损失中的每一项是什么意思。

定位误差

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

定位误差

第一项计算预测坐标和地面真实坐标之间的平方和损失。对所有单元格中的所有边界框都这样做。得到的和乘以 λcoord。 作者用值 5 为 λcoord。" 1 obj I,j**"项表示在第 i 行和第 j 列单元格中存在一个对象。**

第二项计算预测高度和宽度的平方和损失。该模型预测宽度和高度的平方根,而不是直接预测它们的值。这样做是为了缓解作者提到的某个问题。

平方和误差同样对大盒子和小盒子中的误差进行加权。我们的误差度量应该反映大盒子中的小偏差不如小盒子中的小偏差重要。为了部分解决这个问题,我们预测边界框宽度和高度的平方根,而不是直接预测宽度和高度

假设有两个地面实况箱,高度分别为 10.2 和 2.2。在这个例子中,我们不考虑盒子的宽度。假设模型预测的身高是 10.1 和 2.1。现在根据损失项,较大的盒子误差为( 10.1- 10.2),较大的盒子误差为( 2.1- 2.2)。你可以看到损失值分别是 10^-4 的 2.4 倍和 10^-3 的 1.16 倍。如您所见,预测高度和宽度的平方根在较小的框中更重视小误差。

分类误差

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

分类误差

其中的第一项计算每个像元中每个边界框的预测置信度得分和基本事实之间的误差平方和。这个误差项对应于物体所在单元的误差。因此使用了术语“1 obj I,j*** ”。***

类似地,第二项计算不包含任何对象的像元的平方和误差。术语“ 1 noobj i,j ”表示第I列和第 j 行单元格中没有对象。这个总和由 λnoobj 项加权,以使这个损失更小。作者将 λnoobj 赋值为 0.5。

最后一项计算类别概率的相同损失。它对每个像元中的所有类进行迭代,并计算损失平方和。这个损失项还有“1 obj I,j** ”。这意味着没有任何对象的单元不会造成分类损失。****

结束了

我希望这篇文章能让你深入了解 YOLO 的工作。如果你发现任何错误,请在评论中报告。勘误表,如果有的话,确实是无意的。

参考

  1. ****你只看一次:统一的,实时的物体检测:【https://arxiv.org/abs/1506.02640 ****
  2. 网络中的网络https://arxiv.org/abs/1312.4400

最初发表于https://hackerstreak.com

YOLO V3 解释道

原文:https://towardsdatascience.com/yolo-v3-explained-ff5b850390f?source=collection_archive---------3-----------------------

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

Yolo-V3 检测。图片来源: Uri Almog Instagram

在本帖中,我们将讨论 YOLO 探测网络及其版本 1、2,尤其是版本 3。

2016 年 Redmon,Divvala,Girschick 和法尔哈迪以一篇题为: 你只看一次:统一的、实时的物体检测 的论文对物体检测进行了革命。在论文中,他们介绍了一种新的对象检测方法——将特征提取和对象定位统一到单个整体块中。此外,本地化和分类负责人也进行了整合。他们的单级架构,命名为 YOLO (你只看一次)导致了非常快的推理时间。在 Titan X GPU 上,448x448 像素图像的帧速率为 45 fps(每幅图像 0.022 秒),同时实现了最先进的 mAP (平均精度)。更小且稍不精确的网络版本达到了 150 fps。这种新方法,加上基于轻量级谷歌 MobileNet 主干的其他检测器,使边缘设备上的检测网络和其他 CV 任务的愿景(双关语)更加接近现实。原来的 YOLO 项目可以在这里找到

顺便说一下,Redmon 似乎是一个非常丰富多彩的家伙。他的 YOLO 项目网站可以在这里找到。

检查我在上一篇文章中展示的 GluonCV 模型动物园图,可以看到经过 GluonCV 训练的不同版本的 YOLO-V3 (红点)达到了极好的精确度,仅次于慢得多的 fast-RCNN。

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

检测器性能图表。代表性架构。图表数据取自 GluonCV 模型动物园。图表创建者:Uri Almog

YOLO 背后的想法是这样的:没有需要彼此同步的分类/检测模块,也没有像以前的 2 阶段检测器那样的重复区域提议循环(见我在 上的帖子,早期的物体检测器 ,如 RCNN)。它基本上是一路向下的卷积(偶尔有 maxpool 层)。一个单一的整体网络需要处理特征提取、盒子回归和分类,而不是裁剪出一个物体的高概率区域,并将它们提供给一个找到盒子的网络。以前的模型有两个输出图层-一个用于类概率分布,一个用于盒预测,而这里的单个输出图层包含不同要素的所有内容。

约洛-V1 建筑

约罗-V1 是第一次出现一级探测器的概念。该架构采用了*(BN)和leaky ReLU activations,这在当时是比较新的。我不打算详细介绍 V1,因为它已经相当过时,并且缺少一些后来引入的强大功能。*

约洛-V2 建筑

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

约罗-V2 包含 22 个卷积和 5 个最大池运算。要素地图高度代表空间分辨率。125 个特征的输出用于具有 20 个类和 5 个锚点的 VOC PASCAL 数据集。来源:尤里·阿尔莫格

在约洛-V2 版本中,作者们除了其他改动之外,还删除了末尾的全连接层。这使得该架构真正独立于分辨率(即网络参数可以适合任何输入分辨率)。这并不一定意味着网络在任何分辨率下都能表现良好。在训练期间采用了分辨率增强程序。雷德蒙创造了多种版本的约罗-V2,包括更小、更快(和更不精确)的版本,像 蒂尼-约罗-V2 等。

Tiny-Yolo-V2 的架构非常简单,因为它没有像它的兄弟姐妹那样奇怪的旁路和重新排列操作。微型版本只是一个漂亮的、长长的卷积和最大池链。

描述这些架构的配置文件可以在 darknet github 的 cfg 部分找到。

YOLO-V3 架构

ResNetFPN (特征金字塔网络)架构的启发, YOLO-V3 特征提取器 ,称为 Darknet-53 (它有 52 个卷积)包含跳过连接(像 ResNet)和 3 个预测头(像 FPN)——每个都以不同的空间压缩处理图像。

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

YOLO-V3 架构。来源:尤里·阿尔莫格

像它的前身一样,Yolo-V3 在各种输入分辨率下都有良好的性能。在 GluonCV 的 model zoo 中,你可以找到几个检查点:每一个都有不同的输入分辨率,但事实上存储在这些检查点中的网络参数是相同的。在 COCO-2017 验证集上使用输入分辨率 608x608 进行测试,Yolo-V3 的 mAP 得分为 37(平均平均精度)。这个分数与 GluonCV 的训练版Faster-RCNN-ResNet 50(一种以 ResNet-50 为主干的 Faster-RCNN 架构)相同,但快了 17 倍。在模型动物园中,速度足以与 Yolo-V3 (Mobilenet-SSD 架构)竞争唯一检测器的 mAP 得分为 30 及以下。

特色金字塔网(FPN):在两个婚礼上跳舞

特征金字塔(Feature-Pyramid)是由 FAIR (脸书人工智能研究所)在 2017 年开发的一种拓扑结构,其中特征地图在空间维度上逐渐减小(这是通常的情况),但后来特征地图再次扩展,并与之前具有相应大小的特征地图连接在一起。重复该过程,并且将每个连接的特征图馈送到单独的检测头。

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

特征金字塔网络。来源:尤里·阿尔莫格

参考上面的 YOLO-V3 图示,FPN 拓扑允许 YOLO-V3 学习不同大小的对象:与其他检测块相比,19x19 检测块具有更宽的上下文和更差的分辨率,因此它专门用于检测大对象,而 76x76 检测块专门用于检测小对象。每个探测头都有一套独立的锚定标尺。

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

Yolo-V3 探测不同大小的物体。来源:尤里·阿尔莫格摄影

SSD (单次检测器)架构不同,在该架构中,38×38 和 76×76 块将仅接收来自特征提取器中间的高分辨率、部分处理的激活(图中顶部的两个箭头),在 FPN 架构中,这些特征在特征提取器的末端与低分辨率、完全处理的特征连接在一起。

这使得网络能够在两个婚礼上跳舞,正如他们在意第绪语中所说的那样,并利用高度处理但窄上下文特征和部分处理但宽上下文特征来进行预测。

YOLO-V3 的输出方案与 V2 相同,并且不同于旧的 V1。

YOLO-V2/V3 输出方案——单层击穿:

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

YOLO V2 和 YOLO V3 输出层。Wout 和 Hout 是输出要素地图的空间维度。对于每个锚点,特征按描述的顺序排列。来源:尤里·阿尔莫格

输出图层的要素地图中的每个像元都预测了 Yolo-V3 的 3 个盒子和 YOLO-V2 的 5 个盒子-每个锚点一个盒子。每个箱式预测包括:

  1. 框中心偏移的 2 个值(在 x 和 y 方向,相对于单元格中心),
  2. 2 值框尺寸刻度(在 x 和 y 方向,相对于锚点尺寸),
  3. 1 个客观分数值(0 到 1 之间),
  4. 类分数的类数值(介于 0 和 1 之间)。

(准确的说,盒子大小值是‘残差值’。在后处理中,它们用于通过以下方式计算盒子宽度

box_width = anchor_width * exp(剩余值 _of_box_width))

上面的 YOLO-V2 图解是为 20 类 VOC PASCAL 数据集设计的,有 5 个锚点。125 个要素的输出排列如下:每个空间像元有 125 个版本。要素 0 是对象性分数,要素 1–2 是盒子的 x 和 y 比例,要素 3–4 是盒子中心的 x 和 y 偏移(相对于像元坐标本身),而要素 5–24 是 20 类分数。所有这些——为了第一个主播。特征 25-49 重复相同的特征分配-这一次使用第二个锚,以此类推。注意,锚尺寸不直接在特征中表示,但是那些特征中的比例值传递到后处理,并且被分配有用于盒解码的相应锚比例。

对象性 是一个新概念,值得在几个段落中进行讨论。现在让我们把它想象成网络的置信度,即某个对象存在于给定的盒子中,并且假设盒子中存在一个对象,则类得分是 条件概率 (即假设 x 类的概率在这个盒子中存在一个对象)。因此,每个类别的总置信度得分是客观性类别得分的乘积。

然后,网络的输出经过 NMS 和一个置信度阈值,给出最终的预测,正如我在关于 探测器基础 的帖子中所解释的。

为什么 YOLO 比以前的架构表现更好?

如果说我在研究 YOLO 和它的小版本时学到了什么的话,那就是外表可能会骗人:YOLO 的拓扑结构如此小而简单,它能有多复杂呢?好吧。使它能够具有如此简单的结构,或者更准确地说是紧凑的损失函数是非常复杂的。正是失去赋予了这些特征意义。因此,一个精心制作的损失函数可以将大量信息打包到一个小的要素地图中。

在下一节,我们将讨论 YOLO 损失函数的最重要的特征。

YOLO 培训和流失机制

这一部分是基于我对 Darknet 框架(Redmon 开发的框架)的训练流所做的研究,当时我正在进行该框架的独立 TensorFlow 实现。

输入分辨率增强

作为一个 全卷积网络——不像以前的检测器那样包含用于分类任务的全连接层——它可以处理任何大小的输入图像。但是,由于不同的输入分辨率会产生不同的网络参数,因此使用 分辨率增强来训练网络: 作者使用了 384x384 和 672x672 像素之间的 10 个输入分辨率步长,每隔几个训练批次随机交替,使网络能够推广其对不同分辨率的预测。

损失系数—分而治之

损失函数对不同的盒子进行不同的处理。

正如我在上一篇文章中解释的那样,网络输出层中的每个空间单元预测多个盒子(在 YOLO-V3 中有 3 个,在以前的版本中有 5 个)——所有的盒子都以那个单元为中心,通过一种叫做 的机制锚定

每个盒预测的 YOLO 损失由以下项组成:

  1. 坐标丢失 —由于盒子预测没有完全覆盖对象,
  2. 对象丢失 —由于错误的盒对象 IoU 预测,
  3. 分类损失 —由于对正确类别的预测为‘1’而对该框中的对象的所有其他类别的预测为‘0’的偏差。
  4. 这是一个特殊的损失,我们将在下面两节详细阐述。

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

YOLO-V1 损失函数。λ是损耗系数。前 3 行是“最佳盒子”(在每个空间单元中最佳捕获 GT 对象的盒子)造成的损失,而第 4 行是由于没有捕获对象的盒子造成的损失。在 YOLO V2 和 V3 中,直接的宽度和高度预测以及平方根被替换为剩余比例预测,以使损失参数与相对比例误差而不是绝对比例误差成比例。

一个盒子预测的质量是通过它的 IoU (交集/并集)与它试图预测的对象(更准确地说,是与它的基础真值盒子)来衡量的。IoU 值的范围从 0(框完全错过对象)到 1.0(完美匹配)。

对于每个空间像元,对于位于该像元中心的每个框预测,损失函数会找到对象位于该像元中心的具有最佳 IoU 的框。这种区分 最佳盒子 和所有其他盒子的机制是 YOLO 损失的核心。

最佳框 和它们本身导致坐标损失(由于与对象不完全匹配)和分类损失(由于分类错误)。这推动了与那些盒子相关联的网络参数,以改进盒子的规模和位置,以及分类。这些盒子还会导致信心丧失——我们将立即对此进行解释。所有其他盒子只招致信任损失

失去目标——知道自己的价值

每一个框预测都与一个称为“客观的预测相关联。它出现在像 RCNN 这样的以前的检测器中的地方,即区域提议包含对象的置信度,因为它乘以 lass 分数以给出绝对的类置信度。然而,与预期相反——该预测实际上是一个 IoU 预测——即网络 认为 盒子覆盖物体的程度。目标损失项教导网络预测正确的 IoU ,而坐标损失教导网络预测更好的盒子(最终将 IoU 推向 1.0)。所有的盒预测都会造成对象损失,但只有每个空间像元中的最佳拟合盒也会造成坐标和分类损失。

为什么我们需要客观损失?

在推理中,我们通常有多个盒子,每个盒子有不同的覆盖范围。我们希望后处理算法选择以最精确的方式覆盖对象的盒子。我们还想选择对对象给出正确类别预测的盒子。算法怎么知道选哪个盒子?

首先,对象性告诉我们覆盖率有多好——所以对象性非常小的盒子(<0.005) are discarded and don’t even make it to the NMS block (see explanation in 我之前的帖子)。这有助于消除大约 90%的盒子,它们只是架构的工件,而不是真正的检测(当然,这取决于任务和数据。如果您的任务是检测装满瓶盖的盒子中的瓶盖,那么您可以预期有大量的实际检测)。

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

抑制 NMS 时的多框检测结果。客观性分数告诉 NMS 哪些盒子要保留,哪些要丢弃。来源:乌里阿尔莫摄影

第二,NMS 是为每个类分别做的,所以类的分数是由盒子的对象性来衡量的,以便进行有意义的比较。如果我们有两个高度重叠的框,第一个框的对象性为 0.9,人员概率为 0.8(加权分数为 0.72),第二个框的对象性为 0.5,人员概率为 0.3(加权分数为 0.15),则第一个框将持续存在,第二个框将在 NMS 中消失,因为第一个框的对象性使其更值得信任。

为什么“最佳包厢”在培训期间会受到不同的对待?

我没有看到 Redmon 对这个问题的任何解释,但我的直觉是这样的:想想一位教授,她有以下策略:在第一次作业中,她寻找表现好的学生,并努力检查和评分他们的作业,以便他们能在该科目中表现出色。为了集中注意力,她懒得批改成绩不太好的学生的作业。相反,她给他们一个机会,让他们在下一次作业中在另一个科目上表现出色。

只推最好的盒子来提高覆盖率和档次的原因是专注。我们希望培训能够很好地融合。网络有丰富的参数,所有参数都有大量的工作要做,所以不要急于一次优化所有参数。试图推动所有盒子的参数来捕捉相同的对象——奖励所有盒子近似捕捉相同的对象——可能会导致损失景观中非常长且嘈杂的轨迹,或者更糟的是——陷入次优最小值(因为它们可能无法很好地学习检测具有不同特征的对象,但会陷入局部最小值,而无法学习不同的行为)。最好是利用一些盒子的相对成功,只推动它们在这种类型的对象中成功,同时让与不太成功的对象相对应的参数探索其他选项(以一种将很快解释的方式)。

另一方面,我们希望所有的盒子都经历对象性损失——为什么?我们希望所有的盒子——包括坏盒子——能够学会辨别它们是好是坏,即使他们在一生中(或至少在训练中)没有学到任何东西——因为 NMS 依赖于它(即使如此——YOLO 给‘最好的盒子’比其他盒子更高的物体损失系数)。

收缩损失——利用与探索

我称之为 锚收缩 的一个有趣机制在论文中没有明确提到,但我在代码中发现了它。每一个盒预测都会导致与其原始锚形状和位置的偏差成比例的小损失。在第一个训练时期,这种作用微弱但稳定地持续,之后损失系数预定消失。

虽然这个损失项是非零的,但它产生一个弱力,使每个盒预测收缩回其锚形式。

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

收缩损失:在训练期间,将两个盒子与以它们的单元为中心的物体(鸟)进行比较。红盒子具有最好的 IoU,并且将贡献坐标损失和分类损失,这将推动它更好地覆盖鸟并预测其类别。蓝色盒子将被推回到它的锚形,这可能使它处于更好的位置来捕捉毛虫。来源:乌里阿尔莫格摄影

这个巧妙的机制具有以下效果:没有成功捕获对象的盒子(那些不包括在上面提到的“最佳盒子”组中的盒子)被推回到它们的原始锚形状。由于锚被设计为捕捉数据集中的对象的最佳先验,所以该动作增加了与那些盒子相关联的权重在未来尝试中生成更多成功盒子的机会。同时,成功的盒子(“最佳盒子”组)也经历了这种损失!但是坐标和分类损失要大得多(它们的系数更大),并且它们支配着与那些框相关联的参数的移动方向

在几个时期之后,假设网络已经学会相当好地预测盒子,并且锚收缩停止允许网络参数在实际基础上微调。

我以前的帖子:

什么是神经网络?

【数学与人工智能】实际问题

感知器

训练神经网络简单解释

深度学习的物体检测— RCNN、锚点、非最大抑制

使用 Keras 进行 YOLO v3 目标检测

原文:https://towardsdatascience.com/yolo-v3-object-detection-with-keras-461d2cfccef6?source=collection_archive---------12-----------------------

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

图片由作者说明

用 Keras 实现简单解释 YOLO v3

视频由 YOLO 作者,
约瑟夫·雷德蒙

关于 YOLO v3 算法

“你只看一次”(YOLO)是一种对象检测算法,以其高准确性而闻名,同时由于其速度检测,它也能够实时运行。与之前的算法不同,第三个版本通过简单地改变模型的大小,在不需要重新训练的情况下,促进了速度和准确性之间的有效折衷。

在我们开始用 YOLO v3 实现对象检测之前,我们需要下载预训练模型权重。下载这个可能需要一段时间,所以你可以在等待的时候准备你的咖啡。YOLO v3 是用 c 语言的开源神经网络 DarkNet framework 编写的,这让我一开始就感到很害怕。

但值得庆幸的是,这段代码受到了 experiencor 的 keras-yolo3 projec 的强烈启发,它使用 keras 执行 YOLO v3 模型。在整个实现过程中,我将在 Google Colab 上运行它。此外,我们将使用这些可爱的狗图像进行对象检测。

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

照片由 Alvan NeeUnsplash 上拍摄

所以让我们把手弄脏吧!!

第一步:

跳到第一步,下面是必要的库和依赖项。

第二步:

接下来,**WeightReader** 类用于解析“yolov3。权重”文件并将模型权重加载到内存中。

第三步:

YOLO v3 使用了新的网络来执行特征提取,不可否认,与 YOLO v2 相比,它的规模更大。这个网络被称为 Darknet-53,因为整个网络由 53 个具有快捷连接的卷积层组成 (Redmon &法尔哈迪,2018)

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

YOLO v3 网络有 53 个卷积层(雷德蒙&法尔哈迪,2018)

因此,下面的代码由几个组件组成,它们是:

  • **_conv_block**用于构建卷积层的函数
  • **make_yolov3_model**用于创建卷积层并将其堆叠在一起作为一个整体的功能。

第四步:

接下来,下面的代码解释如下:

  • 定义 YOLO v3 模型
  • 加载您之前下载的预训练重量
  • 使用 Keras save函数并指定文件名保存模型

第四步:

该步骤包括将预测输出解码成边界框

YOLO v3 预测的输出是难以解释的数组列表的形式。因为 YOLO v3 是多尺度检测,所以它被解码成(13,13,225)、(26,26,225)和(52,52,225)形状的三个不同尺度

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

解码前的 YOLOv3 预测输出片段

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

  • **decode_netout**函数用于将预测输出解码成方框

简而言之,这就是**decode_netout**函数的工作方式,如下图所示:

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

图片由作者说明

第五步:

缩放和拉伸解码后的框以适合原始图像形状

**第六步:**网络输出解码后,不会直接对物体显示平滑预测。解码后的盒子产生了几个重叠的盒子。从下图可以看出,模型已经检测到图像中有三只狗。然而,它仅仅是一个物体上重叠的盒子,在这个例子中是可爱的柯基。

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

因此,发生非最大抑制(NMS)来滤除以便获得正确的框

  • **bbox_iou**函数用于通过获取两个盒子的**_interval_overlap**来计算 IOU(交集/并集)

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

图片来自 DeepLearning.ai 课程

  • **do_nms** 功能用于执行 NMS

一般来说,NMS 是这样表演的:

  1. 选择得分最高的方框。
  2. 计算此框与其他框的区间重叠,省略重叠明显的框(iou >= iou_threshold)。
  3. 重复步骤 1 并重复,直到没有比当前选择的盒子分数更低的盒子。

这将忽略与所选框有大量重叠的所有框。只剩下“正确”框。

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

  • **get_boxes**函数用于获取通过 NMS 滤波器选择的盒子
  • **draw_boxes**函数用于使用matplotlib.patches.Rectangle类给输入图像绘制一个矩形框

第七步:

我们即将结束 YOLO v3 的实施。在这一步,我们必须声明几个配置,它们是:

  • **anchors** : 根据对 COCO 数据集中对象大小的分析精心选择。
  • **class_threshold**:检测对象的概率阈值
  • **labels**:COCO 数据集中的类标签

第七步:

最后,YOLO 模型准备进行预测,下面的代码允许用户输入图像来检测对象。

输出:

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

结论

总之,YOLOv3 是一个强大的对象检测模型,以快速检测和准确预测而闻名。在本文结束时,我真的希望这篇文章能让你更好地理解 YOLO 算法的工作原理,并在 Keras 中实现它。完整的代码可以在 GitHub 上找到。

此外,在我的整个旅程中,我想对 Huynh Ngoc AnhJason Brownlee 大声疾呼,深入了解 YOLOv3 的工作原理并将其应用到 Keras 中。另外,你可以在这里找到 YOLOv3 论文。

参考

[## 深入了解 YOLO v3:初学者指南

针对初学者的 TensorFlow 2 中 YOLO v3 的详细回顾和实践。

towardsdatascience.com](/dive-really-deep-into-yolo-v3-a-beginners-guide-9e3d2666280e) [## experiencor/Keras-yolo3

要安装依赖项,请运行 pip install -r requirements.txt,为了让 GPU 工作,请确保您已经安装了…

github.com](https://github.com/experiencor/keras-yolo3) [## 如何在 Keras 中使用 YOLOv3 执行对象检测-机器学习掌握

目标检测是计算机视觉中的一项任务,涉及识别一个或多个目标的存在、位置和类型

machinelearningmastery.com](https://machinelearningmastery.com/how-to-perform-object-detection-with-yolov3-in-keras/)

内容概要:本文详细介绍了使用COMSOL进行三相电力变压器温度场与流体场耦合计算的具体步骤和技术要点。首先讨论了变压器温升问题的重要性和现有仿真与实测数据之间的偏差,接着阐述了电磁-热-流三场耦合建模的难点及其解决方法。文中提供了关键的材料属性设置代码,如变压器油的密度和粘度随温度变化的关系表达式,并强调了网格划分、求解器配置以及后处理阶段需要注意的技术细节。此外,还分享了一些实用的经验和技巧,例如采用分离式步进求解策略、优化网格划分方式等,确保模型能够顺利收敛并获得精确的结果。最后,作者推荐了几种常用的湍流模型,并给出了具体的参数设置建议。 适用人群:从事电力系统设计、变压器制造及相关领域的工程师和技术人员,特别是那些希望深入了解COMSOL软件在复杂多物理场耦合计算方面应用的人群。 使用场景及目标:适用于需要对变压器内部温度分布和油流情况进行精确模拟的研究或工程项目。主要目的是提高仿真精度,使仿真结果更加贴近实际情况,从而指导产品设计和优化运行参数。 其他说明:文中不仅包含了详细的理论解释和技术指导,还提供了一些实际案例供读者参考。对于初学者来说,可以从简单的单相变压器开始练习,逐步掌握复杂的三相变压器建模技能。同时,作者提醒读者要注意单位的一致性和材料属性的准确性,这是避免许多常见错误的关键所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值