TowardsDataScience 博客中文翻译 2020(一百一十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

PCA 直观指南

原文:https://towardsdatascience.com/an-intuitive-guide-to-pca-1174055fc800?source=collection_archive---------16-----------------------

主成分分析背后的思想

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

内森·杜姆劳在 Unsplash 上的照片

主成分分析(PCA)是一个非常有用的工具,可以用来获得关于数据集的直觉。它主要用于降维。我最近偶然看到一篇关于 PCA 的教程论文,它通过谈论这个强大概念背后的直觉为我揭开了 PCA 的神秘面纱,并启发我分享我在这个过程中发现的一些事情。这篇文章中的大部分想法都是从原始论文中得到启发的,我很感谢作者写了这篇文章。我将从基础开始构建概念,并以 PCA 在一些真实数据上的应用结束。

降维的需要

人类通过观察事物来学习。最常见的学习技巧之一是进行一项实验,收集一些数据,研究它,并就我们试图研究的现象得出结论。例如,假设我口袋里有一枚硬币,我正试图确定它是否有偏差。为了找到这一点,我多次投掷硬币,从我的实验中收集数据,并利用统计学原理,我可以推断出我的硬币。同样,在更现实的环境中,我们手头有一个数据集,它代表了对现实世界现象的观察,我们的目标是研究它,以深入了解潜在的现象。

让我们假设我们有兴趣了解弹簧是如何工作的。对于那些不熟悉这个的人来说,弹簧的动力学是由虎克定律控制的。我选择这个例子(类似于原始论文)是为了使讨论简单,并梳理出潜在的想法。为了做到这一点,我们将设置一个带有摄像机的实验,并在不同的时间记录弹簧尖端的位置(出于任何原因,我可能强烈怀疑弹簧的位置完全包含了动力学,这就是为什么我首先记录它)。因此,我们在这里收集的数据集将是一个矩阵 X,具有 n 个观察值和 2 个特征(X 和 y 坐标)。假设我们进行了实验并获得了一些观察结果,如图 1(左)。

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

图 1:(左)从弹簧实验(n=100,p=2)收集的观察结果,(右)旋转坐标框架以揭示弹簧的动力学可以仅被描述为一个方向

在我们的观察中有两件有趣的事情正在发生:a)看起来弹簧尖端在不同时间点的位置几乎沿着相对于 x 轴倾斜的直线(如果你读过胡克定律,你就知道为什么会发生这种情况),b)收集的数据有噪声,例如,由于固定相机的不稳定底座。第一个观察更多的是关于弹簧动力学的启发(我只提到了虎克定律来提供一些背景,应该记住,我们在进行这个实验时对这个定律是无知的,并且试图通过实验发现这个定律)。

尽管我们收集了沿任意选择的 x 轴和 y 轴的观察值,但看起来弹簧的动力学可以在一个方向上描述。例如,我们可以旋转我们的参照系,使所有的点都位于旋转坐标系中的 x '方向(图 1,右)。我们还可以看到,与 x 方向的可变性相比,y 方向的可变性似乎较小,这可能是数据收集过程中的噪声。换句话说,弹簧的动力学可以完全由单一的运动方向(新的 x 轴)来描述,并且在我们的观察中有一些以噪声形式存在的冗余。

总结:数据集可能包含不必要的复杂性,有时可能隐藏简化的结构。需要系统化方法来降低这种复杂性并从我们的数据集中去除冗余。

PCA 的目标

PCA 旨在识别最有意义的参考系(在线性代数中也称为 )来重新表达我们的数据集,希望这个新的将过滤掉噪声并揭示任何隐藏的结构。

在 spring 实验中,我们手动实现了这个目标:观察图显示我们可以旋转坐标轴,y 方向上的微小变化(与 x 方向相比)显示有一些噪声,可以过滤掉。

参照系

让我们继续在春季实验的基础上提出更系统化的降维方法,即 PCA。我们需要引入线性代数中的一些基本概念。我会尽量让讨论简单一些。

一个幼稚的参照系

在春季实验中,我们使用在实验室中任意安装的相机收集我们的观察结果(这类似于真实世界中我们收集某些维度/特征的数据)。基于我们的摄像机的方向,定义了一个隐式坐标框架,即相对于摄像机定义的 x 轴和 y 轴(图 1,左侧)。这叫做幼稚的参照系。

上一段中的关键是单词隐含的,也就是说,如果没有一些关于弹簧如何工作的额外信息,我们不可能找到更好的框架。同样,在现实世界中,我们无法自由控制记录观察结果的维度,所以天真的选择已经为我们做好了。

总结:朴素参照系是数据收集方法的一个属性,它是(隐含地)赋予我们的。

迂回:在我们继续讨论之前,让我们简单地谈谈线性代数中的一个基本概念,叫做

基础可以被认为是参考框架的一个构建模块。考虑我们实验中的一个观察结果(0.9,0.85)。该观察可以被视为使用 x 轴向量的某一部分(=0.9)和 y 轴向量的某一部分(=0.85)来构建。

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

这是一种非常强大的思维方式,因为仅使用坐标轴方向上的两个向量(以及关于乘数(0.9,0.85)的信息),我们就可以描述我们的观察结果。这些乘数的一个稍微专业的术语是投影。比如观察沿 x 轴方向的投影是一个大小为 0.9 的矢量。上式中最右边的等式是这个事实的矩阵表述。

换句话说,我们可以将观察值(0.9,0.85)分解为两个独立部分的组合:x 轴(由向量(1,0)给出)和 y 轴(向量(0,1))。沿着 x 轴和 y 轴的向量一起形成了一个基础。我称它们为构建模块,因为二维平面中的任何向量都可以表示为(或者换句话说,构建为)这两个向量的组合。

让我们以矩阵的形式收集我们的原始参考系的构件。

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

我们可以对整个数据集的上述讨论简明地描述如下,

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

这个矩阵方程用朴素基描述了观测向量(x,y)(即数据)(这就像陈述 2 = 2,这就是为什么我们看到恒等矩阵出现在 RHS 中)。LHS 只是以矩阵 X^T 的形式并排堆叠的单个观测向量,而 RHS 是我们之前所说的所有观测向量的简明表述方式。这里我跳过了一个步骤:每个观察值都可以像第一个观察值一样分解,然后最右边的矩阵方程就出来了。

这个等式看起来相当简单,因为矩阵 B 就是单位矩阵*。*如果我们开始以稍微不同的方式思考这个等式,神奇的事情就会发生:矩阵 X^T 是数据,而最右边的矩阵(与单位矩阵相乘的矩阵)是乘数的集合,它为我们提供了构建数据集的方法。这可能感觉是一种尴尬的思考方式,但是一分钟后就会明白为什么它会如此强大。

更好的参照系

回想一下,作为系统化降维方法(PCA)的第一步,在 spring 实验的推动下,我们试图找到一个更好的参考框架,它可能会简化数据以揭示隐藏的结构(类似于我们如何能够确定 spring 的动力学基本上是一维的)。我将再次通过回顾春季实验来激发讨论。在 spring 实验中确定一个更好的参考框架意味着简单地旋转坐标框架(图 1,从左到右看起来像是所有点围绕原点的旋转)。

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

图 2:旋转第一个观察值,使其与水平方向对齐,这将作为新的 X 轴 X’。请注意,旋转角度约为 43.5ᵒ(这是将第一次观察与水平方向完全对齐的角度)。

图 2 描述了旋转第一观察的方法。在我们的原始参照系中的观察值是黑色的,旋转后的结果是红色的(沿原始 x 轴和 y 轴的分量是虚线)。沿着旋转后的观察向量的方向可以作为新的 X 轴,X ',类似于图 1 中看到的,对吧。还记得我们在迂回中看到,我们的数据中的任何观察值都可以使用基数和乘数来构建。这就是看矩阵方程的另一种方法派上用场的地方。让我们看看我们是否可以在这里利用这个想法。

用这个角度(43.5ᵒ)旋转朴素基的给定公式为:

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

我们能利用这种洞察力来计算第一次观测的新位置吗?

是啊!我们已经知道使用向量(1,0)和(0,1)创建第一个观察值的方法:使用乘数 0.9 和 0.85 将它们组合起来。因此,第一次观察的新位置是使用相同的乘数简单地组合变换的基向量,

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

如果您想知道如何对原始 x 轴和 y 轴的变换向量使用相同的乘数,请查看图 2,注意所有东西都旋转了相同的角度。

这只是一个观察,如果我们有一个简洁的方法来描述所有 100 个观察,不是很好吗?事实证明这是迂回路线的简单延伸,

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

希望现在您已经看到发生了什么以及为什么会这样:要旋转我们数据集中的任何观察值,我们需要使用观察值的相应乘数来组合上面转换的 x 轴和 y 轴向量。换句话说,p 是一个矩阵,它通过 43.5ᵒ旋转一个向量,并将我们的数据集从原始参照系(图 1,左)带到一个更好的参照系(图 1,右)。

让我们稍微概括一下这个想法。在观察我们的观察图的激励下,我们决定旋转可能是一个很好的转换选择,可以帮助我们找到一个更好的参考框架来研究我们的问题。原来对于这样的变换有很多可用的选择,比如旋转剪切一个自然的问题是如何挑选最好的?我们将在接下来的部分尝试回答。

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

图 3:对矩阵 P 的任意选择将原始参考系转换成一个新的参考系(红色)

需要注意的重要一点是,通过改变矩阵 P 中存储的数字,我可以生成新的变换。图 3 显示了一个例子。我生成了一个随机的 2 x 2 矩阵,产生的转换用红色表示。虽然这不是一个直观的选择,但红色向量一起形成了一个基础:任何二维向量都可以使用这些向量的组合来构建。

总结:将大小为 p x p 的矩阵乘以我们的大小为 p x n 的数据矩阵(其中 p 是维数)改变了参照系,或者更正式地可以称为基的改变

主成分分析

前几节的观点使我们能够对我们的最终目标提出更好更精确的问题,

  • 基础有什么好的选择?
  • 如何最小化噪音或冗余?

我们将在调查第二个问题的过程中回答第一个问题。我们可以对数据做出的一个合理的 假设 是,与信号相比,测量噪声较低(否则数据噪声太大,无法得出任何有用的结果),换句话说,这与说噪声方差< <信号方差相同。这一假设为我们提供了一种数学求解第二个目标的方法,即我们可以最大化方差来识别信号。回想一下,我们在图 1 的 spring 实验中看到这个假设成立(右图,与 x 方向相比,y 方向的方差非常小)。

假设矩阵 X 是我们有 n 个观测值的数据,每个观测值有 p 个维度。为了最大化数据的方差,我们首先需要计算数据的方差。每个 p 维度代表一个可能的方向,我们的数据可能会沿着这个方向变化,即存在方差。因此,数学上描述数据方差的一种自然方式是协方差矩阵

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

前提是数据以平均值为中心。该矩阵的对角元素表示沿每个维度的方差,非对角元素是协方差。注意σ是一个方阵( p x p )并且是对称的:协方差(X,Y) =协方差(Y,X)。

基于我们的目标(以及来自 spring 实验的直觉)的好的协方差矩阵将具有大的对角元素和小的(最好是零)非对角元素。这是因为两个原因,

  • 我们假设我们的数据具有低噪声。因此,最大方差方向包含感兴趣的信号。
  • 理想的基础是在独立的(/垂直)方向上分解数据,类似于图 1(右),以揭示任何隐藏的结构,这相当于协方差等于零。

这给了我们一个我们正在寻找的模板矩阵,即最好是一个对角矩阵。现在,剩下的就是找到这样一个矩阵。让我们通过一个简单的例子来建立一些直觉。

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

图 4:并排堆叠的黑色向量代表 2x2 协方差矩阵,当乘以“右”矩阵 P 时,将它们转换为红色向量,即对角矩阵

在图 4 中,我们得到了一个 2 x 2 的协方差矩阵(用黑色向量表示)。从这个例子中我们看到,选择“正确的”矩阵 P 会将协方差矩阵转换为对角矩阵(由红色向量表示)。因此,将给定的矩阵转换成对角矩阵是一个寻找正确的基础(或参照系)的问题。

有许多方法(/潜在基)对角化协方差矩阵,PCA 基于一种简单的方法:假设所有方向(形成基)相互垂直。然后,对角化协方差矩阵将涉及广义旋转(在 2D,这将类似于图 4)。

最后,我们有一个用于主成分分析的算法

  • 在最大方差中选择方向,称之为 d₁
  • 接下来,选择方差最大的垂直于 d₁的方向,称之为 d₂
  • 依此类推……我们可以计算出构成基础的方向
  • 以矩阵的形式收集基,并将其乘以原始数据会导致基的变化

在 spring 实验(图 1)中,该算法会将 d₁识别为沿 x '的方向,将 d₂识别为 y '。得到的一组方向{d₁、d₂……}是主成分,这些成分中每一个的重要性都与这些方向中每一个的数据可变性相关联。最后,我们在改变基础后获得的结果矩阵代表了我们在这些主成分方面的数据(见图 1 右侧和基础改变部分)。

我们上面发现的算法是形成 PCA 的步骤的粗略轮廓。主要步骤(协方差矩阵的对角化)是线性代数中一个研究得很好的问题,有两个主要的分解来做这件事:特征值分解,和 S 奇异值分解。PCA 的实际实现使用这些分解技术中的任何一种。

总结 : PCA 把我们的数据转换成一个新的基,这个基是由相互垂直的方向定义的,叫做主成分,沿着主成分方差最大化,每个方向的重要性都与该方向数据的方差相关联。

例子

我将使用这个数据集作为例子。该数据集包含北京 12 个国控空气质量监测点每小时的空气污染物数据。我将只使用其中一个网站的数据(Data _ 数据 _ 万寿西工 _ 2013 03 01–2017 02 28 . CSV)。各种维度(/特征)是空气中常见污染物的浓度,如 SO₂、NO₂、一氧化碳、O₃、不同大小的颗粒物、环境空气条件,如温度、压力、露点温度(与空气密度密切相关)、风速和一天中的时间。这些尺寸可能是由环境监测中心的专家根据他们的领域知识选择的,并使用传感器进行测量(会有一些测量噪声)。数据集有 32,829 个观察值和 15 个维度。

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

图 5:PC1-PC2 平面数据集的散点图。(右)沿 PC1 和 PC2 方向投影的尺寸的投影表(/乘数)

图 5 显示了数据集在由两个主要成分 PC1 和 PC2 定义的平面中的散点图。PC1 和 PC2 是两个最重要的主分量,即分别与最大和第二大方差方向相关联。我们的数据集中的每个观察值都是 15 维的,并沿着 PC1 和 PC2 投影,这在图中有精确的描述(图 5)。散点图中的红色箭头表示相对于两个主要成分的原始尺寸。对应于两个主分量的方向向量在右边的表中给出。

我们已经可以从这些方向看到一些有趣的东西。在 PC1 方向,我们看到 PM2.5、PM10、SO₂、NO₂、CO 等污染物与 O₃、温度、露点压力、风速呈负相关。换句话说,随着温度和风速的下降,污染物的浓度增加,这是有道理的,因为在较低的温度下,由于重力的作用,分子倾向于沉降到更靠近地球表面的地方,而较小的风意味着空气分散更少(更高的压力、浓度……)。我们可以看到的另一件有趣的事情是臭氧(O₃)与所有其他污染物的负相关。虽然距离我最后一次遇到化学反应已经有一段时间了,但稍微挖掘一下就会发现,臭氧化学反应的形成取决于周围的空气条件。例如,在较低的温度下,一氧化碳/ NO₂)is 稳定,但在较高的温度下(即阳光),化合物反应形成 O₃ 。实质上,PC1 是在对比环境空气条件和污染物浓度。

PC2 方向在温度、露点温度和压力之间具有大的负相关性,这可能与连接这些变量的基本理想气体定律有关。

我们看到,主成分分析有助于理解和可视化数据集,并为我们提供了一种提取有用信息的系统方法。PCA 并不总是最好的选择,有时还会造成伤害。了解这种技术的局限性是有帮助的,这种局限性是由我们在推导这种技术时所做的一些假设造成的。对于 PCA 的更严格和详细的处理,请查看原始论文,这真的是非常有趣的阅读。

参考

简易决策树的直观指南

原文:https://towardsdatascience.com/an-intuitive-guide-to-the-humble-decision-tree-fbee2c24751e?source=collection_archive---------58-----------------------

用例子和简单的数学解释!

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

作者图片

概观

我们如何做决定?

定义决策树

它是如何工作的?

我们如何建立一个有效的决策树?

在我们开始之前,我假设您至少在高层次上理解了回归和分类的概念。如果没有,这里快速总结一下:

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

作者图片

什么是决策树?

  1. 一种算法,即使用树状结构表示一组问题&决策
  2. 它提供了一个过程来决定问什么问题、问哪个问题以及何时问它们以预测结果的价值。

我们如何做决定?

在我们深入细节之前,让我们通过两个非常简单的例子来了解我们是如何做决定的…

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

猫源

左> 根据天空的颜色,我们决定要不要出去玩一个游戏(绝对决定)。 >根据一只猫的腰围大小,我们决定对它的体重进行粗略的估计(数值决定)。另一方面,那只猫需要一些真正的帮助节食!

这里有一个更复杂的例子

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

作者图片

**>评估患者感染老年人更易患疾病的风险。**以上是一个医生在查看你的个人/健康记录以评估你患病风险时的假设心理模型(尽管是一个简化的模型)

行话时间

和大多数算法一样,我们可能会遇到一些术语。这里有一个直观的表示来帮助我们浏览这些术语…

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

作者图片

根节点:数据的整个样本或总体

**分割:**将一个节点分割成两个或更多子节点的过程

决策节点:有其他子节点的子节点。它们有指向它们的箭头和远离它们的箭头。

**叶/终端节点:**没有子节点的节点(不进一步拆分)。他们有指向他们的箭头,但没有指向远离他们的箭头。

**父/子节点:**被分成子节点的节点被称为子节点的父节点,而子节点是父节点的子节点。

**子树/分支:**树的子部分

既然这个问题已经解决了,让我们看看决策树是如何帮助我们预测问题的结果的!

决策树是如何构建的

示例数据集

这个虚拟数据集描述了如何使用患者的年龄以及常见的病毒症状(如呼吸困难和胸痛)来预测一个人是否感染了新冠肺炎病。

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

将患者数据集映射到决策树

逐步走查

**1。**整个患者数据集被输入到根节点。

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

作者图片

**2。**询问一个关于患者的问题,并根据答案是对还是错对数据集进行分割/分区。

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

作者图片

**3。**在每次分割时,该算法试图确保所得分区中的患者尽可能同质(即每个子节点上的所有病毒阳性或病毒阴性)。如果一个子节点没有被很好地分离,将会询问进一步的问题来进一步分割数据集。

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

作者图片

**4。**该过程继续进行,直到不再有患者可被分割或满足停止标准。

建立一棵有效的树的关键

为了建立一棵有效的树,有三个重要问题需要回答:

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

问:我们可以问什么问题?

为了获得问题,我们迭代出现在预测值列的每一行中的每个值。每个值都成为用于将数据划分为不同子集的阈值的潜在候选值:

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

作者图片

潜在问题:

此人是否超过 60 岁?

此人是否超过 30 岁?

此人是否有呼吸困难?

患者是否有胸痛?

问:我们应该问哪些问题?

最好的问题最能减少不确定性,并导致最纯粹的叶节点。

减少不确定性意味着什么?为了理解这一点,让我们在决策树的叶节点上看下面两个例子:

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

作者图片

在左侧,每个叶节点包含具有和不具有新冠肺炎的个体的混合物,即不纯。如果我们将左叶节点中的个体分类为阳性,则被正确分类的概率仅为 50% ,因为它仅包含 25/50 的 covid 阳性个体。

在右侧,决策树的每个叶节点是完全同质的(50/50 covid 为正,48/48 covid 为负),即。如果我们将左叶节点中的个体分类为阳性,则被正确分类的概率是 100% ,因为它仅包含 covid 阳性的个体。

因此,具有更纯的节点增加了被正确分类的机会,并减少了决策结果的不确定性。

问:如何量化节点中的不确定性/杂质?

有几种方法可以量化杂质,但我们现在只谈两种:

  1. Gini 杂质 —量化一个节点中有多少杂质*(越低越好)*
  2. 信息增益— 量化一个问题在多大程度上解混了节点中的标签/减少了不确定性*(越高越好)*

基尼杂质

*公式:*1——概率(“正结果”)2——概率(“负结果”)2

将该公式应用于我们的示例,如果我们的第一个问题是“有胸痛”,我们将得到以下输出:

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

作者图片

为了计算“有胸痛”的总基尼系数,我们取两个叶基尼系数的加权平均值如下:

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

作者图片

信息增益

公式:起始基尼系数——问题的平均加权基尼系数

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

作者图片

获得最多信息的问题将是最好的问题,即越高越好!

问:什么时候应该提问?

既然我们已经了解了基尼系数,我们可以用它来帮助我们决定…

决策树的开始问题,即在根节点

为此,我们只需计算每个候选问题的总基尼系数,然后选择基尼系数最低的问题:

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

作者图片

什么时候拆分一个节点或者使一个节点成为叶节点?

为此,我们执行以下步骤:

  1. 计算潜在叶节点的基尼系数。
  2. 通过另一个问题进一步拆分节点,计算总基尼系数。
  3. 比较两个基尼系数杂质,并选择导致基尼系数杂质较低的行动。

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

作者图片

在这种情况下,我们将使所讨论的节点成为叶节点,因为分裂会导致更高的 Gini 杂质。

问:如何在叶节点做出决策?

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

扣篮大赛图片来源

暂时就这样吧!希望你喜欢这个关于决策树如何工作的简单解释:)

关于作者

Ranon 是 NCS 的数据科学家,他使用高级数据分析和机器学习来解决问题。他在自愿的基础上教授数据分析概念,并且是 ML @ Georgia Tech 的非全日制硕士学生。

在空闲时间,他喜欢烘焙和了解金融市场。他的人生格言是保持谦虚,不断学习:)

如有任何问题,请随时通过 LinkedIn 联系我。只要我有时间,我很乐意回答你的问题!

强化学习的直观介绍

原文:https://towardsdatascience.com/an-intuitive-introduction-to-reinforcement-learning-ef8f004da55c?source=collection_archive---------52-----------------------

欢迎来到人工智能的未来

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

Unsplash 上由 Franck V. 拍摄的照片

强化学习是最接近人类学习方式的学习类型。

强化学习与监督和非监督学习技术相反,是一种面向目标的学习技术。它基于在一个环境中操作,在该环境中,一个假设的人(代理人)被期望从一组可能的决策中做出一个决策(行动),并通过反复学习选择一个导致期望目标的决策(基本上是试错法)来最大化通过做出该决策获得的利润(回报)。当我们继续阅读这篇文章时,我会更详细地解释这一点。

在这篇文章中,我将讨论强化学习(RL)的基础知识(尽可能用例子)。

被监督?无人监管?强化学习!

重要的事情先来!在开始谈论 RL 之前,我们先来看看它与监督和非监督学习技术到底有什么不同。

让我们考虑一个正在学骑自行车的孩子的例子。我们将会看到,如果孩子在有人监督、无人监督或强化学习的情况下学习,这个问题将如何解决:

  1. **监督学习:**现在,如果孩子开始计算他需要在踏板上施加的力,或者他需要与地面保持平衡的角度;他开始在每次骑自行车时优化这些计算,以完善他的骑行技术,那么可以说他是在监督下学习。
  2. 无监督学习:然而,如果孩子开始观察成千上万骑自行车的人,并基于这些知识,如果他开始弄清楚骑自行车到底要做什么,那么可以说他是以无监督的方式学习的。
  3. **强化学习:**最后,如果给他几个选项,比如踩踏板、向左或向右转动手柄、踩刹车等等。以及在这些选项中尝试任何他想要成功骑自行车的自由,他首先会做错并失败(可能会摔下来);但最终,在几次失败的尝试后,他会想出如何去做,并最终成功。这个案例是强化学习的一个例子。

好了,现在你知道为什么说它是最接近人类学习的方式了吧!现在,随着我们继续深入,你可以预期话题会变得有点正式。

勘探开发

让我们继续这个孩子的例子,他知道他骑自行车时可以做的一系列动作。所以,考虑这样一个场景,他最终发现持续踩下踏板可以驱动自行车。然而,他没有意识到骑行之后,他必须在某个点停下来(即在正确的时间踩刹车是骑自行车的一个组成部分)。但是,他很高兴现在他知道如何骑自行车,并且不关心未来的事情。我们姑且把他的快乐称之为’奖励’,意思是他因为踩踏板的动作而得到奖励。由于他得到了奖励,他纯粹是“利用”当前的行动,即踩踏板,不知道也许最终他可能会在某个地方撞车,这将使他远离实现他的最终目标;正确地骑自行车。

现在,他可以从一系列可用的动作中探索其他选项,而不仅仅是踩踏板。最终,他将能够随时停下自行车。以类似的方式,他将学习如何转弯,这样,他将是一个好骑手。

但是,任何东西太多都是不好的!我们看到,过度开发会导致失败。同理,过度探索也是不好的。例如,如果他只是在每一个情况下随机改变他的动作,他就不会骑自行车了,不是吗?所以基本上,这是一种权衡,它被称为勘探开发困境,是解决 RL 问题时要考虑的主要参数之一。

注意孩子会根据他对环境的当前状态**【w r t】来决定他在给定情况下的行动,即他在骑车时的当前运动/位置以及从先前尝试中获得的奖励(这种决策机制就是 RL 的全部内容)。**

RL 问题的构建模块

  1. ****策略:策略定义了 RL 代理的行为。在我们的例子中,策略是孩子思考在可用的动作中选择什么动作的方式(孩子是代理)。
  2. ****奖励:这些定义了一个问题的目标。每走一步,环境都会给代理发送一个奖励。在我们的例子中,骑自行车的乐趣,或者从自行车上摔下来的痛苦,就是奖励(第二种情况可以称为惩罚)。
  3. 价值函数:**奖励是环境对主体的即时反应。然而,我们感兴趣的是长期回报的最大化。这是使用值函数计算的。从形式上来说,一个状态的价值是一个代理在未来可以期望积累的总回报,从那个状态开始(萨顿&巴尔托)。如果孩子仔细考虑了未来可能发生的事情,如果他选择了一个特定的动作,比如说几百米,那么这可以被称为值。
  4. 模型:环境的模型是计划的工具。它模拟实际环境,因此可用于推断环境的行为方式。例如,给定一个状态和一个动作,模型可能会预测下一个状态和下一个奖励(萨顿&巴尔托)。当然,RL 机制可以分为基于模型的方法和无模型的方法。

结论

我们对 RL 问题是什么样子以及如何解决它有一种直觉。此外,我们将 RL 与监督学习和非监督学习区分开来。然而,强化学习比本文中的概述要复杂得多;但这足以明确基本概念。

参考

萨顿和巴尔托:https://web . Stanford . edu/class/psych 209/Readings/suttonbartoiprlbook 2 nded . pdf

NPTEL RL 课程:https://www.youtube.com/watch?v=YaPSPu7K9S0&list = plyqspqzte 6m _ fwzhfayf 4 lskz _ ijmyjd 9&index = 5

对 GANs 的直观了解

原文:https://towardsdatascience.com/an-intuitive-look-at-gans-1aa35e27cb52?source=collection_archive---------39-----------------------

学习 GANs 如何工作背后的直觉,而不需要复杂的数学方程。

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

马里奥·高在 Unsplash 上的照片

介绍

自 Goodfellow 等人于 2014 年在 NIPS 推出 GANs(生成对抗网络)以来,GANs 已经在深度学习和计算机视觉领域掀起了风暴。GANs 的主要思想是同时训练两个模型;一个生成器模型 G 基于随机噪声生成样本,另一个鉴别器模型 D 确定样本是真实的还是由 G 生成的。

这篇文章将介绍 GANs 工作背后的直觉,而不会过多地钻研损失函数、概率分布和数学。重点是对 GANs 如何运作有一个很好的顶层理解。鉴于 GANs 越来越受欢迎,重要的是任何人都能够在不预先加载太多复杂信息的情况下开始他们的深度学习之旅!对于完整的解释,约瑟夫·罗卡有一大篇T21 一篇关于它!

训练 GAN 框架类似于两个玩家的最小-最大游戏。 G 不断改进,生成更逼真、质量更好的图像。 D 提高了确定图像是否由 G 创建的能力。训练 GAN 可以完全通过反向传播来完成,这极大地简化了训练过程。通常,通过从 GD 的定期切换来执行训练,以防止两个模型中的巨大性能差距。

发电机模型

发生器模型通常由一系列上采样和卷积层组成。一种常见的架构是 DC(深度卷积)-GAN 网络,由亚历克·拉德福德等人在 ICLR 2016 上展示。DCGAN 框架可以在下面找到。如果你见过其他常见的 CNN 框架,GAN 结构非常类似于标准的 CNN 分类器,只是它是水平“翻转”的。

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

来自 https://arxiv.org/abs/1511.06434的 DCGAN 架构

提供给发电机网络的输入在图中标记为“100z”。这意味着采样了 100 个点,创建了长度为 100 的潜在向量。“z”还表示这些点是从单位正态分布中取样的。因此,我们可以将生成器网络视为执行从潜在空间到训练数据的映射的函数。

我们可以把潜在空间(100 维)想象成基于高斯分布的固定分布。生成器网络从这个潜在空间中随机采样点,并将其映射到图像空间(64 x 64 x 3 维)。在所有可能图像的空间中,存在描述在输入训练数据中找到的图像的更小的子空间。鉴别器将对生成器进行处罚,因为它通过对抗性损失函数创建了不属于训练数据分布(非“真实”)的图像。

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

生成器的映射功能,由作者生成图像

鉴别器模型

鉴别器通常具有类似于标准 CNN 分类器的框架,例如 VGG。鉴别器的目的是学习根据图像是来自训练数据还是由 G 生成来将输入图像分类为真实或虚假。看下图,鉴别器的目的是学习红色虚线。因此,它将能够根据该输入数据分布来分类真实和伪造的图像。如果提供的图像位于红色空间之外,它们将被归类为“假的”。

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

鉴别学习,作者图片

g 和 D 串联

在 GAN 框架中, GD 模型必须一起训练。这两种模型的改进最终会产生更好、更真实的图像。一个好的鉴别器模型可以完美地捕捉训练数据分布。这允许发生器具有良好的“参考”空间,因为发生器的训练高度依赖于鉴别器输出。

如果鉴别器没有很好地捕捉到训练数据分布,生成的与训练图像不相似的图像将被归类为“真实的”,这将降低模型性能!

限制

很明显,这个简单的 GAN 框架只能产生类似于训练数据分布的图像。因此,需要大量的训练数据!此外,甘的训练还有许多障碍。一个常见的问题是模式崩溃,即生成器模型学习将多个潜在向量映射到一个单独的图像。这极大地影响了 GAN 框架的多样性。

结论

近年来有许多解决这些问题的 GANs 的变化和发展。其中包括改进的损失函数和为特定任务定制的专门框架,如超分辨率或图像到图像的翻译。

对事件预测的直观观察

原文:https://towardsdatascience.com/an-intuitive-look-in-event-predicition-47173c71c423?source=collection_archive---------43-----------------------

入门

4 个不同的标准来查找可能是目标事件标志的事件

当谈到数据科学时,首先想到的大多是先进的建模方法。你可能会听说有人将深度学习模型应用于非常简单的问题,尽管简单的传统模型可以获得更高的精度和更好的性能。

同样,一些对机器学习了解不多的人甚至可以通过后退一步,从更普遍的角度来看数据,做出一些推断。数据每时每刻都在诉说着什么。在这篇文章中,我只想给出一个事件预测的简单起点,而不是深入研究机器学习。它可以应用于基于事件的数据集的所有预测问题。

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

阿历克斯·吉兹拉Unsplash 上拍摄的照片

问题定义

为了更清楚起见,以电信领域为例,考虑一个由数千台设备和一个监控工具组成的网络,该工具记录设备上发生的所有警报。这些警报可以是各种类型的。简单地说,您正在处理一个包括报警日期时间、设备名称和报警类型的数据集。目标是在任何设备上发生警报之前预测特定类型的警报。

用一个简单的推理,找出相关的告警(指标)以便预测目标告警是第一件事。为此,你不需要成为机器学习专家。

我将提到大约 4 个不同的标准来缩小警报的范围,这些警报可能是整个警报集的指示器。这些标准肯定是可以扩展的。

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

标准参数

标准 1

  • 总计 _ 设备 _Y /总计 _ 设备

它基本上给出了候选报警的发生频率,非常直观。目标警报很可能是不经常发生的警报,因此您预计指示器警报也不会经常发生。因此,它的价值越低,成为指示器警报的机会就越大。

标准 2

  • 总计 _ 设备 _X_Y /总计 _ 设备 _Y

该标准是关于目标报警和候选报警之间的相关性。它说明了目标和候选报警在同一设备上出现的频率百分比。因此,它的值越高,成为指示器警报的机会就越大。

标准 3

  • 总计 _ 报警 _Y_X /总计 _ 报警 _Z_Y

它实际上是标准 2 的一种扩展,表示目标和候选警报同时出现在相同的设备上。哪一个是另一个的原因?目标警报也可能导致候选警报:)我们感兴趣的是发生在目标警报之前的警报。要使用这个标准,我强烈建议为时间间隔设置一个阈值。例如,候选警报可能在目标警报之前 30 天出现,但最有可能不作为指标,因为这是很长的时间。根据目标警报的原因,可以使用具有更短时间周期的模式,例如一周或一天。因此,对于 30 天前发生的情况,候选警报将不被考虑,并且阈值被设置为一周。显然,它的值越高,成为指示报警的机会就越大。

标准 4

  • 【avg(time _ lag)

最后但并非最不重要的是,候选警报和目标警报之间的时间间隔在预测范围方面非常关键。虽然一些指示器警报在目标警报之前 10 小时出现,但是一些在目标警报之前 5 分钟出现。在这种情况下,提前 5 分钟预测目标警报可能与业务目标不一致。我鼓励在这个标准中使用与前面标准类似的时间间隔阈值。时滞的平均值和最小值可以一起使用。该标准的值将给出关于预测范围的洞察,换句话说,它指定了多久目标警报可以被预测。

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

作者的图像—沿时间轴的简单描述

摘要

在事件预测中(这里我一般说的是电信领域的警报设置,类似地,它在制造领域的生产线中作为预测性维护实现有很大的使用领域),在目标事件发生之前找出指示事件是最具挑战性和最突出的部分。在正确决定指示事件之后,通过将它们用作传统机器学习模型中的特征,更容易做出关于目标事件的预测。这无疑不是一个琐碎而容易的任务,然而,我只想给出一个非常简单的起点,不需要任何机器学习背景。根据标准的输出,可以在数百个不同类型的事件中组成一个可能是目标事件标志的小事件集。实际上,我上面提到的标准背后的推理是基于先进的机器学习概念,如购物篮分析关联规则挖掘。我以前在这里写过他们对基于事件的数据集中的预测问题的一种可能的适应。

差异隐私的直观视图

原文:https://towardsdatascience.com/an-intuitive-view-of-differential-privacy-261e3f1c30d9?source=collection_archive---------53-----------------------

这篇文章将用最简单的数学直观地解释不同的隐私。

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

差异隐私的一个例子。作者图片

我猜想,当我们第一次接触“怪异”的数学定义时,我们大多数人在学习差分隐私时都会遇到困难。

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

图像由[3]定义 2.4。

当我第一次读到差分隐私(DP)的论文时,我正在努力理解它的含义。看了一些关于差分隐私的技术帖子,终于,我明白了它是什么。在这篇文章中,我将跳过 DP 中的所有其他定义(如敏感度),只解释 DP 的直观视图。

什么是差分隐私?

我先介绍一下什么是差分隐私(DP)。给定一个查询函数 f,它从给定的数据库 d 中检索用户的吸烟人数。

D = [0,1,1,1]其中 0 代表不吸烟,1 代表吸烟。

f(D) = 3

现在,给定两个数据库 D1 和 D2,仅相差 1 条记录(D1 和 D2 相邻),这意味着 D1 是[0,1,1,1],f(D1) = 3,D2 是[0,1,1],f(D2) = 2。你可以认为 D2 已经被更新,最后一条记录已经被删除(例如,由于用户删除了他的帐户)。

现在,让我们假设攻击者想要从数据库 D1 中检索一些私人信息。攻击者知道谁已经删除了他的帐户(例如,攻击者知道 Bob 从一些服务中删除了他的帐户),但是攻击者希望知道 Bob 是否是吸烟者(他可能想要对 Bob 做坏事)

昨天,攻击者查询系统得到一个结果,即 f(D1) = 3。今天,鲍勃删除了他的帐户,D1 变成了 D2,攻击者再次运行查询(假设没有其他新信息),即 f(D2) = 2。

现在,攻击者知道 Bob 是一个吸烟者,因为他可以通过这样做获得信息

鲍勃是一个吸烟者= f(D1)-f(D2)= 3–2 = 1,其中 1 代表以上定义的吸烟。

这就是“差分”隐私,我们可以通过旧的查询结果和新的查询结果之间的差异来获得隐私信息**。**

数学定义(只是直观地解释)

我在这里举了个例子[1]来解释 DP 的数学定义。

首先,为了理解 DP,我们可能需要知道 KL 散度[6]在做什么。KL 散度是衡量两个概率分布之间的距离。较高的 KL 散度表示两个概率分布更远(重叠较少),较低的表示更近(重叠较多)。

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

KL 散度的公式,顶部为离散分布,底部为概率分布。作者图片

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

你可以通过两个分布 P 和 q 之间的重叠程度来理解 KL 散度

现在,让我们回顾一下 DP 的一般数学定义,如下所示:

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

DP 的一般数学定义,以 D1 和 D2 为例。“S”是输出的集合,我们现在只假设这个 S 是一个实数 R(数学上可能是错误的,但足以直观地理解)。作者图片

乍一看这个公式,我无法解读。看了几个帖子和解释,特别是来自[1]的,现在理解了解释。我们还需要看看 KL 的背离(见本书[3]第 3.5.1 节)。

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

两边除以 Pr[M(D2)…s】。作者图片

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

通过放置自然对数来移除指数。作者图片

这种形式似乎很熟悉,不是吗?它类似于 KL 散度的公式,有一个概率分布 P 除以另一个概率分布 Q,在我们的例子中,P(x) = Pr[M(D1)],Q(x) = Pr[M(D2)] (M 稍后解释)。KL 散度是不对称的,也就是说 P(x)/Q(x)和 Q(x)/P(x)是不一样的,但是在 DP 这里我们不关心不对称。

DP 希望将确定性输出更改为概率分布。

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

查询函数 f 的确定性输出“吸烟者的数量”表示吸烟者的数量。作者图片

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

查询结果的概率分布。作者图片

因此,通过向查询结果添加由ε值限制的噪声(常见的噪声类型是高斯和拉普拉斯),可以找到新的随机化查询函数 M。

STD(ε)是一个基于ε计算标准差的函数,现在我只是假设这个函数可以计算理论上正确的标准差。

M(D) = f(D) + N(0,STD(ε))其中 N 是高斯噪声。

然后,查询结果不再是纯粹的 2 或 3。

f(D1) = 3 #原旧查询
M(D1) = 3+(-0.8) = 2.2 #第一个旧查询
M(D1) = 3+(0.7) = 3.7 #第二个旧查询

f(D2) = 2 #原新查询
M(D2) = 2+(0.7) = 2.7 #第一次新查询
M(D2) = 2+(-0.4) = 1.6 #第二次新查询

现在我们只是得到了吸烟者的“大概”数量,有一个正确的概率(例如 70%)。

因此,当我们试图通过新旧查询之间的差异来获取私人信息时,我们只能知道 Bob 可能是吸烟者,也可能不是。

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

D1 和 D2 的概率输出。作者图片

如果两个概率分布重叠(P(M1)/P(M2) = 1,ln(1)< =ε0),那么,攻击者就不知道鲍勃是不是吸烟者。因为 P(M1)与 P(M2)生成相同的输出,所以攻击者无法区分结果。虽然这样可以防止信息通过差异泄露,但是也会影响查询功能的质量。更多的噪声(更小的ε,最小为 0)导致好的私密性和差的质量,更少的噪声(更高的ε)导致差的私密性和好的质量。因此,epsilon 是一个随机查询函数的“隐私预算”,它控制着为了保护数据库隐私你可以放弃多少质量。

结论

DP 意味着我们可以通过一个旧查询和一个新查询之间的差异来获得一些私人信息。DP 可以通过 KL 散度来理解,将查询函数改为随机化函数,可以避免隐私信息立即泄露。

然而,更多次的查询仍然可能泄露隐私信息(在他们得到查询的意思之后),这又涉及到很多新的概念,比如隐私花费(例如 TensorFlow DP optimizer 或 PyTorch Opacus PrivacyEngine 中的隐私会计师)来阻止用户查询系统。

一旦我理解了更多的 DP 概念,如隐私支出或 epsilon-differential private,我会写更多直观的解释。希望这篇文章能帮助你直观地理解什么是 DP。

以下是我了解 DP 的资源。

[1]https://zhuanlan.zhihu.com/p/139114240

[2]https://zhuanlan.zhihu.com/p/61179516

[3]https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf

https://www.sohu.com/a/252919825_354899

[5]https://towards data science . com/understanding-differential-privacy-85ce 191 e198 a

[6]https://towards data science . com/light-on-math-machine-learning-intuitive-guide-to-understanding-KL-divergence-2b 382 ca 2 B2 a 8

真理之岛

原文:https://towardsdatascience.com/an-island-of-truth-f789eaad314?source=collection_archive---------79-----------------------

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

汤姆·温克尔斯在 Unsplash 上的照片

来自脸书和 Airbnb 的实用数据建议

詹姆斯·梅菲尔德 — 9 分钟阅读

我承认……我不止一次发现自己在生产、出版和公开不正确的数据。我不记得我是如何找到这些数据的——也许我在我的数据湖或数据仓库中运行了一个 SHOW TABLES 命令,得到的结果是听起来合法。

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

照片由克利福德摄影在 Unsplash

使用 Python 对股票和加密货币进行均值-方差分析

乔纳斯·本纳 — 16 分钟阅读

加密货币多年来一直是一个热门话题,这是有充分理由的。对一些人来说,它们是一个黑匣子,对另一些人来说,它们是金融不可避免的未来。不用说,任何人,只要花了至少一部分时间和金钱投资股票和其他资产,近年来都会考虑投资这种新颖的资产类别。

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

图由麦迪逊井上 Pexels

研究基于内容的新闻源过滤

Michel Wijkstra — 14 分钟读取

随着新闻消费日益数字化,新闻平台不得不努力转移和保留他们的用户群。维持和增加任何数字平台的用户群的一个行之有效的方法是应用个性化技术。

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

作者图片

如何开始学习生物信息学而不被吓倒(带 R)

通过 Lathan Liou — 7 分钟读取

这篇文章的目标读者是那些希望“闯入”生物信息学领域并且有 R(理想情况下使用 tidyverse)经验的人。生物信息学可能是一个听起来很可怕的概念(至少对我来说是这样),因为它是一个如此广阔和快速发展的领域,以至于很难准确定义它是什么。

真实之岛:来自脸书和 Airbnb 的实用数据建议

原文:https://towardsdatascience.com/an-island-of-truth-practical-data-advice-from-facebook-and-airbnb-a0d9c355e5a0?source=collection_archive---------9-----------------------

在贵公司构建核心数据集的操作指南。探索数据湖、仓库、表模式和指标的概念。

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

我承认……我不止一次发现自己在生产、出版和公开不正确的数据。我不记得我是如何找到这些数据的——也许我在我的数据湖或数据仓库中运行了一个 SHOW TABLES 命令,得到的结果是听起来是合法的。或者,也许我在仪表盘上找到了一个参考栏,而这个参考栏似乎正是我需要的。也许我试图找到几个月前创建汇总表的人,却发现他们已经离开了公司。

有一次,当我运行一个查询并广泛地分享一些数据时,当一位高管发电子邮件问我“嘿,你从哪里得到这个的时候,我的心沉到了谷底。您的经理刚刚说这个指标高出了 24%。”这些太普通的故事中令人痛苦的部分,也是我感受最深的部分,是对数据的信任被打破了

“不是你对我撒谎,而是我不再相信你,让我动摇了.”——弗里德里希·尼采

这篇博客文章让我们深入了解了脸书和 Airbnb 的数据,并就如何建立一个值得信赖的数据生态系统提供了实用的建议。

脸书的数据

早在 2008 年我在脸书工作时,我的正式职位是增长团队的数据分析师。作为一个兼职项目,我亲自教 550 名同事如何编写他们的第一个 SQL 查询。这是一次很棒的经历,我的同事喜欢这种了解数据的感觉。脸书刚刚开发了 Hive,为了帮助它被采用,我主动创建了这些介绍类。

一旦我的同事掌握了 SELECT 和 FROM 的基本知识,他们问的第一个问题是“我如何找到我需要的数据?”这是一个很难回答的问题。我们有大量具有相似名称和不同相关程度的数据表。作为他们的老师,我不想给别人指错桌子,但是我怎么知道哪张桌子是正确的呢?

是 dim_user、dim_users 还是 dim_users_extended?即使我设法将它们指向正确的表,我也不知道如何查询它以生成准确的指标。例如,dim_users 表上的简单 COUNT(*)将返回比我们报告的活动用户数更大的数字。事实证明,如果我没有过滤掉 user_type=-1 并设置 active_30d=1,那么我的结果将是完全错误的。

这个度量定义警告是一个大问题,当我的同事得出不正确的结果时,他们会感到沮丧和尴尬。我发现这些度量问题非常具有挑战性,因此我的新公司 Transform 正在开发工具和框架,以帮助公司正确定义和分类他们的关键绩效指标。

脸书建筑示意图

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

*注意 BI 工具引用两个不同数据系统的潜在问题。

Airbnb 的数据

2014 年,当我离开脸书加入 Airbnb,担任数据基础设施和数据工具项目经理时,我发誓要在这个问题变得制度化和棘手之前解决它。乍一看,Airbnb 的数据湖已经看起来非常令人生畏,有数千个表和近 1pb 的数据。老实说,这很危险。

由于一些早期的基础架构挑战(我在这里写的),组织对数据的信任度很低。对于重要的数据表和关键指标,我们缺乏可信的、单一的真实来源。几乎所有的分析见解都是由少数几个特定数据领域的数据科学家产生的,这些人整天被问题轰炸。如果这些数据科学家中的一个离开了公司,展开他们迷宫般的管道来寻找定义他们指标的实际 SQL 将是一场噩梦。

虽然早期存在一些挑战,但我们仍然致力于解决这个问题,因为我们认识到创建可信、准确数据集的真正潜力。不过,这项工作的风险很高。如果我们没有建立对数据的信任,公司将会在大数据基础设施、提高生产力的数据工具和技术数据科学人员上浪费数百万美元。当危险无处不在时,我们如何重建对数据准确性和正确性的信心?

Airbnb 架构图

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

*我们将核心数据放在数据湖的中心,这样它就可以与所有其他数据资产相结合,减少了在不同系统之间保持数据集同步的负担。

创造真理之岛

我们的答案是将“核心数据”构建为我们大数据湖中的极乐真理岛。一片阳光明媚的绿洲,远离鲨鱼出没的水域。其核心数据是一组基于实际主题领域的事实表和维度表。当我们最初构建它时,我们与公司的领域专家一起工作来解开用于生成表格的逻辑,然后与不同部门的利益相关者一起验证度量定义。收入、发送的消息和创建的列表等事实很容易与地区、语言和列表类型等维度结合起来。

通过删除表中许多危险的细微差别并发布优秀的元数据,我们降低了 SQL 新手的入门门槛。我们的团队致力于确保表格始终准确、完整、可靠、相关、独特、可发现和及时。凭借这些品质,我们赢得了客户的信任,然后通过我们在交付高质量数据集方面的一致性来加强这种信任。

一旦真理岛建立起来,我们就将核心数据作为数据教育工作的核心。Airbnb 的新用户可以放心地开始他们的数据之旅,因为他们知道这些表格是值得信赖的。教授数据课现在是一种绝对的快乐!员工可以自助服务,减轻数据科学家和数据分析师回答简单问题的负担。

例证图式为一座真理之岛

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

许多事实表(fct_)要求财务报告具有高度的准确性,因此我们从生产数据库快照中获取它们。我们可以用点击流日志的维度来丰富这些事实,这些维度更能容忍小错误或损失。

接下来的几节将提供其他公司如何开始创建自己的真理岛的学习。

我们应该在哪里构建它?

要创建一个真理岛,您需要在您的数据生态系统中开辟一个安全的地方,让您的内部客户可以轻松访问。它需要能够足够快地运行查询,以鼓励探索和连接数据集。在脸书,我们通过将我们的 Hive 数据的一个子集移动到 Oracle 机器的机架上,建立了一个真理岛(注意:这是在 Presto 被开发出来之前)。这一物理屏障确保了只有高质量、值得信赖的数据才能跨越数据仓库的鸿沟,分析查询也能在 Oracle 中快速运行。这种方法的缺点是只有少数人知道如何构建在系统之间移动数据的 ETL 管道,并且保持数据同步是一个挑战。此外,没有人能够直接通过 SQL 访问 Oracle 表,因此只能通过 BI 工具访问那里的数据,这限制了探索。

在 Airbnb,我们采取了不同的方法,在我们的蜂巢生态系统中使用逻辑屏障来创建我们的真理岛——而不是物理屏障。好处是更多的人可以访问 Hive,因此可以轻松地将这些可信的核心数据表加入到他们自己的数据集中。Airbnb 还运行了 Presto,其速度足以在我们的生态系统中“以思维的速度”支持分析查询。这是一个很好的模式,因为我们不需要专门的数据工程师在两个系统之间移动数据,并且我们避免了保持数据集同步的麻烦。

建议:在你的数据湖中间建立你的真实岛,而不是在不同的系统中。廉价文件存储的普及,加上 Presto、Dremio、Spark、AtScale 等现代查询引擎的速度。让这成为可能。如果你有幸在一家拥有单一数据仓库的公司工作,该数据仓库将所有摄取数据和摘要数据存储在 Snowflake、Redshift、Azure 数据仓库或 Google BigQuery 中,那就太好了。这里的关键点是,您应该在一个所有源数据和汇总数据都可以访问的地方创建您的真理岛。

谁应该为我们的真理之岛做贡献?

建立这样一个可信的分析数据集的老方法是雇佣一个商业智能工程师团队,他们是数据集市和 OLAP 立方体的专家。总的来说,这些人擅长为数据集不常改变的财务和运营团队创建流程和构建可信的报告。这种方法的缺点是,这些 BI 工程师经常脱离产品开发工作流,他们的治理模型跟不上现代产品开发的步伐。

许多组织已经转向在产品开发团队中嵌入数据分析师和数据科学家,以便他们可以快速构建表格、定义指标和运行实验。这种范式帮助团队快速处理数据,但是一种反模式正在出现,在这种模式中,分析师和数据科学家快速构建管道原型(在诸如 Airflow 之类的工具中),然后“将他们的 ETL 扔到墙外”。BI 工程师被要求采用没有数据含义或如何使用的上下文的管道,这造成了不愉快的感觉。

建议:这是一个棘手的问题,因公司而异。我的建议是创建一小组数据工程专家,他们可以帮助在严格的过程和支持更快的产品开发速度之间找到平衡。该团队(或虚拟团队)应该概述结构和可重复的代码模式,以致力于真理岛,帮助嵌入式数据分析师和数据科学家做出贡献。

怎样才能保持酒吧的品质?

对数据质量(准确性、完整性、可靠性、相关性、唯一性、可发现性和及时性)设定严格的指导原则为进入数据创造了很高的门槛。在 Airbnb,我们为着陆时间设置了服务水平目标,测试了基数爆炸的列,并对类型不匹配的数据发出了警报。

建议:我的观察是,数据工程有两个重要的部分——有时称为 ETL、管道建设、分析工程或 BI 工程。

  • 第一:从源数据中导出数据概念,如事实、维度、度量
  • 第二:维护面向内部用户的数据集以供使用

两者都非常有价值,但只有第一个是对数据工程时间的良好利用,因为它利用创造性思维和洞察力来生成新的数据资产。第二种是重复的、耗时的、容易出错的,并且通常无助于数据工程师学习或成长他们的角色。数据工程师应该投资于框架、工具、测试和流程,以减轻他们为保持内部数据集的高标准而进行的持续维护负担。

我们应该从什么开始?

我见过项目陷入困境,人们在会议前协调预备会议,讨论他们想要召开的会议,以获得大量无关的利益相关者的支持。我所看到的工作是当人们开始建造这个真理之岛的时候。选择一个像“core_”或“gold_”这样的名字作为你桌子的前缀就足以开始建立和营销你的内部品牌。

“不要等待;时机永远不会“恰到好处”。“从你所站的地方开始,用你所掌握的任何工具去工作,在你前进的过程中会发现更好的工具。”—拿破仑·希尔

建议:找到驱动你最重要的公司成果的数据集,并开始构建这些表格。理想情况下,你的真理岛将开始概述最关键的事实,并开始编目推动你的度量的漏斗。拥有一个定义良好的星型架构来分离事实和维度,降低了内部客户的准入门槛。这篇博客文章不会提供如何建立星型模式的指导,因为有许多像 Kimball 这样的好资源可以帮助指导这个旅程。

我们如何从这些(大部分)规范化的表格中获得关键指标?

即使是从一组值得信赖的表中,关键指标的推导也可能很复杂。创建一个包含定义、注释、异常检测和生命周期管理的度量存储库更具挑战性。我的新公司正在开发工具来简化这一过程,但我将把这个话题留到另一篇博文中去讨论…

感谢和赞美

Rupen Parikh、Siva Kolappa、Ray Ko 和 Prashanth Nerella 感谢你们在脸书建造这座建筑的过程中所做出的贡献。感谢你教给我的关于数据架构、治理和 ETL 的一切。

Riley Newman、Aaron Keys、Jonathan Parks、Sid Kumar、Max Beauchemin、Marcus Schmaus、Lauren Chircus 以及 Airbnb 的整个数据科学团队,谢谢你们。你在构建核心数据方面兢兢业业、深思熟虑,帮助 Airbnb 成为一家让人们与数据打交道的世界级公司。延伸阅读:Airbnb 如何将数据民主化扩展 Airbnb 的实验平台

感谢吉姆雷诺在这篇文章中的杀手图形。

取得联系

电子邮件LinkedIn等待数据转换注册

进入数据科学的 MBA 指南

原文:https://towardsdatascience.com/an-mbas-guide-to-breaking-into-data-science-695a1e8a672f?source=collection_archive---------20-----------------------

我从商学院到谷歌产品分析经理的经历

非传统的旅行

对数据科学和分析感兴趣的 MBA 比以往任何时候都多。为了保持相关性,MBA 项目正在迅速扩充课程。然而,招聘具有商业背景的分析人员可能会很棘手。

作为一名应届毕业生,我很难联系招聘经理并建立信誉。我被拒绝了几十次才找到一个合适的。在旅程的许多点上,最好的前进方式是反直觉的。

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

马特·霍华德Unsplash 上拍照

以下是我如何在谷歌获得产品分析职位的。希望我的经历能对这个过程有所启发,并帮助你获得一个令人满意的数据科学职位。

发展这些不容置疑的技能

你需要发展许多技能来保持竞争力。虽然大多数会被包括在你的常规大学计划中,但有些仍然明显缺席。不要让这些让你措手不及。*

SQL

一个不知道 SQL 的数据科学家就像一个不知道如何使用刀子的厨师。要分割数据,您将需要 SQL。此外,不必依赖别人给你递来一份 CSV,这是一种解放。期待在这上面测试。

遗憾的是,SQL 培训仍然是关键的数据技能之一,但还不是 MBA 项目的必备技能。乍一看,这似乎有点吓人,但其实不必如此——语法很直观,通常只需几个基本函数就能搞定。对于温和的入门,我使用了 Mode 的 SQL 系列的介绍。

评书

如果你想对公司的商业决策产生切实的影响,你就必须有说服力。在大多数公司,充斥着图表和无用指标的幻灯片很常见;这会很快失去你的读者,并显示出你缺乏经验——你不希望这样。

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

照片由 Isaac SmithUnsplash 上拍摄

我发现将自己与普通数据科学家区分开来的一个简单方法是掌握讲故事的艺术。虽然许多数据科学家都试图吹嘘他们对新工具和新技术的掌握,但 MBA 的优势在于平衡严谨性和消费。Tufte 的定量信息的可视化显示提供了一个关于数据思维的大师班,并帮助我在这里开始。

线条外的颜色

数据科学作为一种职业,尤其是对 MBA 来说,是年轻且发展迅速的——这意味着没有硬性规定或只有一种正确的做事方法。

课程设置

这个过程中我最喜欢的部分是让我大开眼界的机会,向从业者和教授学习最新的技术。我尽可能多地参加了数据密集型课程,但我避免拘泥于脚本,将自己局限于“曲目”所能提供的内容。通过攻读博士课程和计算机科学系的课程,我能够拓宽视野,树立信心。

我也跟着自己的好奇心走,允许不同的兴趣交集。这样做,即使是阅读量很大的理论课也可以变成“数据”课。例如,我最喜欢的课程之一是公共政策,每周的作业是论文,但期末考试是一个关于分析旧金山人口统计的重要项目。

职位名称

就像一场 Calvinball 的游戏,数据相关的标题是出了名的混乱和定义不清。当我在 LinkedIn 上搜索“高级数据科学家”的二级和三级关系时,我开始进一步观察。我寻找的其他常见职位包括客户洞察主管、决策科学主管或商业智能主管。

这是另一个超越界限的机会——今天大多数角色都是“数据相关的”一个人脉很广的产品经理、项目经理或运营主管也能帮助你理解一家公司的数据文化,并帮你打开大门。我在找实习的时候,并没有强调我的头衔。我寻找任何可以应用我所学的角色,并把它运用到全职工作中。

期望以不同的方式招聘

与咨询或银行业的招聘不同,商学院是运转良好的机器,我发现分析职位的招聘更具挑战性。经过几十份申请,我参加了 12 家公司的第一轮面试,收到了两家公司的录用通知。

找到适合你的

在寻找公司时,寻找那些将数据视为头等公民而不是事后想法的公司。通常这些都有集中的数据团队,而不是嵌入式的。他们往往在工程和数据基础设施领域拥有强大的合作伙伴。他们的领导力不仅仅停留在口头上,而且在做出大胆的非传统数据驱动的决策方面有着显著的历史。

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

诺德伍德主题公司在 Unsplash 上拍摄的照片

做好耐心和灵活的准备。没有数据科学招聘周期,大多数初创公司会在需要时发布职位描述。让你的名字出现在那里,在篮圈周围徘徊,尽早接触到关系,这样当时机到来时,他们就会想到你。

带回家的小贴士

在原本灰暗而漫长的招聘过程中,我发现带回家的东西是一个亮点,也是一个展示自己的机会。通过强有力的提交,招聘人员会很快引导你前进。区分你的提交的一个简单的方法是做一点额外的工作——比如不要使用默认的情节,包括展示热情或内部知识的参考资料,并添加一个“所以怎样”,这需要一个决定性的电话或建议未来的调查路线。

值得记住的是,每个面试官都在暗中支持你取得成功,所以你应该强调你能够完成的所有事情,而不是担心你没有完成的事情。

结论

如果你来自一个没有技术技能的背景,很容易感到不安全——不要让这种担心掩盖了你带来的一切。精通业务的技术人员或精通技术的业务人员是任何公司的资产。

你不会被你的 RMSE 评分。作为一名个人贡献者,你将会因为你处理一个定义不清的问题的能力而得到认可——组织它,设计度量标准,并自信地将结果社会化。作为一名经理,你会因为发现问题的能力而得到认可——领导一项计划,获得资源,并领导他人执行。

如果我们作为数据科学家的目标是推动变革,那么商业技能就是一种优势,无论我们在哪里,它们都会很好地为我们服务。

如果你在这个旅程中有任何问题,你可以在推特上联系我

** [## 莫·巴辛

莫·巴辛的最新推文(@ BernoulliSays)。产品经理变成了数据呆子。狂热的心理学家,业余爱好者…

twitter.com](https://twitter.com/BernoulliSays)

感谢 Nitin、Tanay、Rebecca、Anders、Usman 和 Nikhil 审阅草稿并改进这篇文章。

*本指南并非详尽无遗。您还希望精通 R 或 Python,精通像 scikit learn 这样的 ML 包,等等。

参考文献

[1] 沃顿商学院形式分析沃顿商学院 (2019)**

一种全方位自动机器学习——OptimalFlow

原文:https://towardsdatascience.com/an-omni-ensemble-automated-machine-learning-optimalflow-369d6485e453?source=collection_archive---------55-----------------------

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

亨特·哈里特在 Unsplash 上的照片

optimal flow是一个 Omni-ensemble 自动化机器学习工具包,它基于流水线簇遍历实验方法,帮助数据科学家以一种简单的方式构建最优模型,并用简单的代码实现机器学习工作流的自动化。

OptimalFlow 包装 Scikit-learn 监督学习框架,根据每个框架组件中的算法排列,自动创建一组机器学习管道(管道簇)。

它的预处理模块包括特征工程方法,如缺失值插补、分类特征编码、数字特征标准化和异常值 winsorization。这些模型继承了 Scikit-learn 和 XGBoost 估计器在分类和回归问题上的算法。可扩展的编码结构支持从外部评估程序库中添加模型,这使得 OptimalFlow 的 可伸缩性不同于大多数 AutoML 工具包。

OptimalFlow 使用流水线簇遍历实验作为优化器来构建用于最优基线模型搜索的全集成工作流,包括特征预处理/选择优化、超参数调整、模型选择和评估。

与其他流行的“AutoML 或自动化机器学习”API 相比,optimal flow被设计为 Omni-ensemble ML 工作流优化器,具有更高级别的 API 目标,以避免一般流水线构建中的手动重复训练-评估实验。**

它通过创建自动化集合管道(管道集群)遍历实验和评估机制,将重点从单个管道组件自动化切换到更高的工作流级别,从而重建了自动化机器学习框架。换句话说, OptimalFlow 跳出了单个管道的范围,而将整个管道作为一个实体,自动生成所有可能的管道进行评估,直到找到其中的一个导致最优模型。因此,当我们说一个流水线代表一个自动化的工作流时, OptimalFlow 被设计来组合所有这些工作流,并找到最优的一个。这也是将其命名为 OptimalFlow 的原因。

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

图一。OptimalFlow 的工作流程

为此,optimal flow创建流水线簇遍历实验来组装覆盖机器学习工作流主要任务的所有交叉匹配流水线,并应用遍历实验来搜索最优基线模型。此外,通过将所有关键管道组件模块化到可重用的包中,它允许所有组件进行定制更新,并具有高可扩展性。

常见的机器学习工作流通过“单管道”策略实现自动化,该策略首先由 scikit-learn 库引入并得到很好的支持。在实际使用中,数据科学家需要在一个管道内的每个组件中实施重复实验,调整算法和参数,以获得最佳基线模型。我把这种运行机制称为“单管道重复实验”。无论是经典的机器学习还是当前流行的 AutoML 库,都很难避免这种单一流水线聚焦的实验,这是监督建模工作流程中最大的痛点。

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

图 2,单管道重复实验

****optimal flow中的核心概念/改进是流水线簇遍历实验,这是 Tony Dong 在 Genpact 2020 GVector 大会上首次提出的一种框架理论,利用系综流水线算法优化和自动化机器学习工作流。

与使用单个流水线的其他自动化或经典机器学习工作流的重复实验相比,流水线簇遍历实验更强大,因为它通过集合所有可能的流水线(流水线簇)和自动化实验将工作流从一维扩展到二维。凭借更大的覆盖范围,在没有人工干预的情况下找到最佳模型,以及由于其在每个组件中的系综设计而更加灵活地应对未知数据,管道簇遍历实验为数据科学家提供了一种替代性的更方便和“全自动”的机器学习方法。

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

图 3,流水线簇遍历实验

OptimalFlow 由以下 6 个模块组成,您可以在 文档 中找到关于每个模块的更多详细信息。每个模块都可以用来简化来单独自动化具体的组件流水线。另外,你可以在 文档 中找到它们的例子。

  • 用于特征预处理的 autoPP
  • 用于分类/回归特征选择的 autoFS
  • 用于分类/回归模型选择和评估的 autoCV
  • 用于管道簇遍历实验的自动管道
  • 用于管道集群可视化的 autoViz
  • 日志和跟踪的自动流程。

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

图 4,autoViz 模块生成的模型检索图

还有一些现场笔记本 活页夹 和演示 文档

使用 OptimalFlow,数据科学家,包括有经验的用户或初学者,可以轻松地构建最佳模型,而无需繁琐的实验,并更加注重将他们的行业领域知识转化为实际实施的部署阶段。

OptimalFlow 从一开始就被设计成高度模块化,这使得继续开发变得容易,用户可以基于它构建应用。

在 0.1.10 版本之后,它增加了一个“无代码”的 Web 应用程序,作为基于 OptimalFlow 构建的应用程序演示。web 应用程序允许对 OptimalFLow 中的所有参数进行简单的点击和选择,这意味着用户可以构建端到端的自动化机器学习工作流,而无需任何编码!(阅读 TDS 上的文档故事的更多详情)

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

关于 OptimalFlow 的相关阅读:

使用 OptimalFlow 在机器学习中进行集成特征选择——使用简单代码选择顶级特征的简单方法

集成模型选择&使用 OptimalFlow 的机器学习评估—使用简单代码选择最佳模型的简单方法

端到端 OptimalFlow 自动化机器学习教程结合真实项目-公式 E 圈数预测第 1 部分

端到端 OptimalFlow 自动化机器学习教程结合真实项目-公式 E 圈数预测第二部分

用 OptimalFlow Web App 建立无代码自动机器学习模型

总之,optimal flow为数据科学家分享了一些有用的属性:

  • 简单&代码少 —高级 API 实现流水线簇遍历实验,每个 ML 组件高度自动化和模块化;**
  • 井集合 —每个关键组件都是流行算法的集合,包括超参数调整;
  • 全覆盖管道簇遍历实验设计用于与所有关键的 ML 组件进行交叉实验,如组合置换输入数据集、特征选择和模型选择;
  • 可扩展&一致性 —每个模块由于其集成&可重用设计,可以很容易地添加新算法;不需要额外修改现有的代码;
  • 适应性强流水线簇遍历实验使得使用正确的流水线来适应看不见的数据集变得更加容易;
  • 欢迎自定义修改 —支持自定义设置,根据弹性需求添加/删除算法或修改超参数。

作为一个初始的稳定版本发布,所有的支持是受欢迎的!请随时在optimal flowGitHub这里 分享您的反馈、报告问题或作为贡献者加入。

关于我:

我是一名医疗保健和制药数据科学家以及大数据分析和人工智能爱好者。我开发了 OptimalFlow 库,帮助数据科学家以简单的方式构建最优模型,用简单的代码实现机器学习工作流程的自动化。

作为一名拥有多年分析经验的大数据洞察寻求者、流程优化者和人工智能专家,我使用数据科学中的机器学习和问题解决技能将数据转化为可操作的洞察,同时提供战略和量化产品作为最佳结果的解决方案。

你可以在我的 LinkedIn 或者 GitHub 上和我联系。

部署企业级应用程序的开源解决方案

原文:https://towardsdatascience.com/an-open-source-solution-to-deploy-enterprise-level-r-shiny-applications-2e19d950ff35?source=collection_archive---------9-----------------------

使用 docker + ShinyProxy 交付您的 R 数据可视化产品

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

图片由卢克·切瑟Unsplash 上拍摄

对于许多 R 用户来说,FR Shiny 已经成为构建数据科学交互式 web 应用的流行平台。它允许人们轻松地从 R 可视化数据分析,而不需要弄乱许多行代码。你可以在 R Shiny Gallery 中探索一些功能强大、视觉上吸引人的应用。

作为一名生物信息学科学家,我为生物学家提供最先进的高通量实验数据的数据分析和可视化解决方案。随着合作者数量的增长,我需要构建一个 R Shiny 应用程序的主机,以确保模块化、标准化和可复制的工作流。然而,如果我想扩大我的项目规模,让这个系统得到更广泛的应用,我必须面对几个问题:

  1. 如何在远程电脑或云端流畅运行 R Shiny apps?
  2. 如何从单个门户部署和管理多个 R Shiny 应用?
  3. R Shiny apps 如何在主机系统中动态读写文件?
  4. 在 R Shiny 应用程序中,不同的用户可以访问不同的数据集吗?

这些当然可以通过 RStudio 提供的 Shiny Server Pro 来实现。然而,我搜索了在线资源,经历了试验和错误,发现 docker + ShinyProxy 是一个很好的开源解决方案,它使我能够成功地部署一系列具有所需功能的 R Shiny 应用程序。

虽然整个过程对技术要求不高,但我还没有看到如何从头开始构建这些的分步教程。在这里,我的目的是向您展示部署两个具有特定于用户的数据访问的 example R 闪亮应用程序的旅程,并希望它能启发您的项目。

📝注: 本教程介绍如何在本地计算机上部署多应用系统。但是这些步骤通常适用于远程计算机或云上的部署。当远程部署需要注意时,我会特别说明。

ℹ️ 本教程需要的所有文件都托管在我的 GitHub 库 上。repo 中有五个带编号的子目录,对应于本教程中构建最终系统的五个步骤(第 02-06 节)。在我们学习教程的过程中,我还会向您展示特定文件夹或文件的链接。

01.软件要求

我们应该已经安装了 R 和 RStudio。为了构建我们的示例 R 闪亮的应用程序,我们还需要通过调用install.packages()来安装shinytidyverse

接下来,我们将安装 docker。由于我用的是 macOS,所以我用这个链接安装 Docker 桌面。要在其他操作系统上安装它,您可以在这里找到信息。

我们为什么要用 docker?

docker 的理念是封装软件代码及其所有依赖项,以便它可以在任何基础设施上统一和一致地运行,即容器化策略。r 闪亮的应用通常有很多包依赖。我们将首先在本地计算机上测试它的运行,然后让他们远程工作。没有 docker 的容器化,我们将不得不确保所有运行应用程序的计算机都有相同的运行环境。这意味着我们将花费大量的精力来安装和配置大量的软件和软件包。当一个包在测试计算机上更新时,它必须在所有其他计算机上更新。我们可以看到,以这种方式管理多个 R shiny 应用程序很容易变得很痛苦。有了 docker,我们可以将应用程序、它们的依赖项和运行环境打包成一个整体映像。图像可以复制到其他计算机上,我们可以开始运行应用程序(只要那台计算机安装了 docker)。在不被繁琐的安装和配置所干扰的情况下,这种类型的实践大大加快了软件开发和部署的工作流程。

02.构建闪亮的应用程序

由于这只是一个概念验证教程,我们将构建两个简单的 R Shiny 应用程序。因为一般结构和文件系统是相同的,所以它们可以很容易地扩展到更大的项目中。

第一个应用程序“Hist_App”读取存储在文件中的数字向量,并绘制其分布。如图 1 所示,我们可以选择四个数据集中的一个,并调整箱的数量。(💻 源文件 )

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

图一。第一个 App“Hist _ App”的界面

第二个应用程序“Scatter_App”读取存储在文件中的两列数据帧,并绘制两个变量的散点图。同样,我们可以选择四个数据集之一,并改变点的颜色。(💻 源文件 )。在这两个应用中,数据文件都位于./data/文件夹中。

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

图二。第二个 app“散点 _App”的界面

当我们打开app.R文件时,我们可以通过在 RStudio 中单击“运行应用”来本地测试这两个应用。

03.构建并运行 R 闪亮的应用程序 docker 映像

现在我们已经构建了两个 R Shiny 应用程序,但它们只能在我们的本地机器上运行。为了让它们在其他计算机上工作,我们将利用我在上面解释的 docker 容器化策略来构建 docker 映像。

为了构建 docker 映像,我们需要一个基础映像来开始。我们可以复制文件并将附加软件或软件包安装到基本映像中,以构建新映像。 Docker Hub 是一个可以公开获得大量预建 Docker 图像的地方。有一个名为’ rocker '的社区知识库,定期更新常见的 R 相关 docker 图片。我们将使用的图像是[rocker/shiny-verse](https://hub.docker.com/r/rocker/shiny-verse)。我们在终端中使用以下命令将映像拉至本地机器:

docker pull rocker/shiny-verse

正如你可能猜到的,rocker/shiny-verse是一个已经安装了 R,R Shiny server,以及包括tidyverse在内的几个常用包的环境。rocker/shiny-verse是在其基础镜像rocker/shiny上通过安装tidyverse 等构建而成。rocker/shiny又是从rocker/r-ver开始构建的,是 base R 环境。现在你可以看到它是如何工作的:docker 镜像是一层一层构建的。当我们需要构建 docker 映像时,我们不会从头开始(例如,从基本操作系统或基本 R 开始)。我们可以从一些预煮的食物开始,然后在上面加上我们的食谱。下图试图解释这个概念。

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

**图三。逐层构建 docker 图像。**蓝色图层和图像显示的是已经建成的;棕色的层和图像表明那些需要被建造。

通常,我们需要额外的 R 包来运行我们的应用程序。因此,我们可以在rocker/shiny-verse之上安装这些包来构建shiny-more映像。最后,复制并配置应用程序文件以构建准备运行的shiny-app映像。幸运的是,我们的两个应用不需要更多的 R 包,因此shiny-more图像是不必要的。我们可以从rocker/shiny-verse直接构建shiny-app

📝注意: 虽然在本教程中跳过了从 rocker/shiny-verse shiny-more 的步骤,但是我在 GitHub 中包含了构建这个中间映像所需的 文件 ,因为您将需要它们。从技术上来说,即使需要更多的软件包,人们仍然可以直接从 rocker/shiny-verse 进入 shiny-app ,但这样做的话,每次更新应用程序时,都需要花费几分钟来重新安装所有的软件包。因此,最佳实践是逐层构建图像**。**

我们需要两个文件来构建shiny-app映像:Dockerfile,构建 docker 映像总是需要用到它;shiny-server.sh,它运行着 R Shiny 服务器。从 GitHub 目录中可以看到,在每个 app 的文件夹中,这两个文件都被添加在之前的文件之上。现在,在终端的./Hist_App文件夹中,运行以下命令:

*docker build . -t shiny-hist*

这将从rocker/shiny-verse开始构建shiny-hist图像。基本图像在Dockerfile : FROM rocker/shiny-verse:latest的第一行指定。剩下的几行只是要求 docker 进行复制/安装/配置的命令。在终端中,运行docker images。现在我们应该看到rocker/shiny-verseshiny-hist都在那里。然后,运行:

*docker run --rm -p 3838:3838 shiny-hist*

这将在端口 3838 的计算机上启动我们的直方图应用程序。打开网络浏览器,并转至localhost:3838。我们将有一个闪亮的应用程序在 docker 中运行!

运行散点图 app 的步骤是一样的:在./Scatter_App文件夹内,运行docker build . -t shiny-scatter(记得更改图像标签),运行docker run —-rm -p 3838:3838 shiny-scatter。散点图应用程序将通过端口 3838 访问。

现在,我们可以在本地计算机上运行 R 闪亮的应用程序 docker 映像。但是如何让它们在远程机器上运行呢?您可能会注意到rocker/shiny-verse有一个rocker/部件。这是 Docker Hub 上的存储库名称。我们构建的shiny-histshiny-scatter只是本地映像,并没有被推送到 Docker Hub。要进行推送,请注册 Docker Hub 帐户,并通过 Docker 桌面或终端登录:

*docker login -u "username" docker.io*

用存储库名称重新标记应用程序后,我们可以将 docker 映像推送到网上:

*docker tag shiny-hist username/shiny-hist     
docker tag shiny-scatter username/shiny-scatterdocker push username/shiny-hist
docker push username/shiny-scatter*

在其他安装了 docker 的电脑上,我们只需将图像拖到本地并运行应用程序。

04.使用 ShinyProxy 部署多个 R Shiny 应用

我们已经构建了两个 R Shiny 应用程序,可以利用 docker 轻松地将它们部署在不同的计算机上。下一个挑战是:我们如何从单个门户访问和管理多个应用程序,并为不同的用户添加身份验证。这时 ShinyProxy 开始发挥作用。ShinyProxy 是一个开源解决方案,专门开发来结合 R Shiny 和 docker,并提供额外的多应用功能,包括用户认证(甚至 LDAP 认证)。这允许多个用户在企业环境中部署和使用一系列 R Shiny 应用程序。

假设我们想从一个网页访问我们构建的两个应用程序,并且只允许两个用户登录:Alice 和 Bob。为了实现这一点,我们需要在同一个文件夹中有三个新文件。两个文件Dockerfileapplication.yamlGitHub 目录下。我们还应该从 ShinyProxy 下载页面下载shinyproxy-2.3.1.jar文件,因为它很大。

在构建 ShinyProxy 映像和运行应用程序之前,我们应该看一下application.yaml文件,了解它是如何配置运行的。线条authentication: simple表示我们可以直接在user部分设置用户名和密码。这里,设置了两个用户(“Alice”和“Bob”)及其密码。R 亮闪闪的 docker 映像在specs部分配置:我们可以设置 ID、显示名称和应用程序的描述,最重要的是,container-image应该是shiny-histshiny-scatter,这样 ShinyProxy 就知道运行正确的映像。

*另一个新概念是 docker 网络。这使得 docker 通过连接多个容器变得更加强大。我们可以在application.yaml中看到docker: internal-networking: true和每个图像都有container-network: sp-test-net。它使这两个应用程序在一个 docker 网络中运行,并由 ShinyProxy 管理。而且,ShinyProxy 本身可以作为容器运行。本节旨在建立一个包含shiny-histshiny-scatter和 ShinyProxy 的整体形象。同样,**任何东西都可以打包并作为容器运行!*下图展示了 ShinyProxy 的设计:

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

图 4。ShinyProxy 设计

因此,在构建 ShinyProxy 映像之前,我们需要首先构建 docker 网络:

*docker network create sp-test-net*

📝注意: 如果您尝试在远程服务器上构建 docker 网络,尤其是使用 VPN 时,您可能需要指定 IP 子网掩码以避免 IP 地址冲突。我用的命令是 docker network create --driver=bridge --subnet 172.17.253.9/30 sp-test-net 。详细解释请见 此链接

网络名称应该与我们在application.yaml中指定的名称相同。接下来,我们构建 ShinyProxy 映像来连接多个 R Shiny 应用程序(该命令应该在带有application.yamlshinyproxy-2.3.1.jarDockerfile的目录中运行):

*docker build . -t shinyproxy-run*

最后,我们运行shinyproxy-run并在 web 浏览器上转到localhost:8080来查看结果:

*docker run --rm -v /var/run/docker.sock:/var/run/docker.sock --net sp-test-net -p 8080:8080 shinyproxy-run*

我们应该会看到一个登录页面。通过使用“Alice”或“Bob”和密码登录,我们将被定向到带有两个可用应用程序的门户页面。

📝注意:application.yaml文件中有很多选项可以配置,发挥 ShinyProxy 的全部潜力。详细文档可以在 本页 找到。**

05.通过 docker 卷进行动态数据访问

完成前面的步骤后,我们现在可以从一个门户部署和管理多个 R Shiny 应用程序。但我们的多应用系统还有一个缺陷:目前,所有数据集都存储在每个应用的./data文件夹中。这给动态数据访问带来了困难。如果 R Shiny 应用程序使用的数据集被更新,我们必须重新构建相应的应用程序 docker 映像,以使用户可以访问新数据。当更新频繁时,让用户看到即时的数据变化变得不可行。此外,我们可能还希望应用程序在主机系统中生成文件,如果 docker 容器只能操纵自己,这是不可能的。幸运的是,docker 可以使用 在主机中创建一个“docker 区域”并将其挂载到容器中,因此容器可以访问和操作主机系统中的文件。

为了探索这个特性,我们应该首先将数据文件移出 app 文件夹。上一节的树形结构如下:

**04-shinyproxy/
├── Dockerfile
├── Hist_App
│   ├── Dockerfile
│   ├── Hist_App.Rproj
│   ├── app.R
│   ├── data
│   │   ├── alice_vector_1.txt
│   │   ├── alice_vector_2.txt
│   │   ├── bob_vector_1.txt
│   │   └── bob_vector_2.txt
│   └── shiny-server.sh
├── Scatter_App
│   ├── Dockerfile
│   ├── Scatter_App.Rproj
│   ├── app.R
│   ├── data
│   │   ├── alice_df_1.txt
│   │   ├── alice_df_2.txt
│   │   ├── bob_df_1.txt
│   │   └── bob_df_2.txt
│   └── shiny-server.sh
├── application.yml
└── shinyproxy-2.3.1.jar**

让我们重新组织结构,在应用程序文件夹之外创建一个目录,用于存储两个应用程序使用的数据文件:

**05-data-on-host/
├── Data
│   ├── DF
│   │   ├── alice_df_1.txt
│   │   ├── alice_df_2.txt
│   │   ├── bob_df_1.txt
│   │   └── bob_df_2.txt
│   └── Vector
│       ├── alice_vector_1.txt
│       ├── alice_vector_2.txt
│       ├── bob_vector_1.txt
│       └── bob_vector_2.txt
├── Dockerfile
├── Hist_App
│   ├── Dockerfile
│   ├── Hist_App.Rproj
│   ├── app.R
│   └── shiny-server.sh
├── Scatter_App
│   ├── Dockerfile
│   ├── Scatter_App.Rproj
│   ├── app.R
│   └── shiny-server.sh
├── application.yml
└── shinyproxy-2.3.1.jar**

现在,如果我们尝试运行直方图应用程序的./Hist_App文件夹中的docker build,将会出现错误,因为./Hist_App/data文件夹不再存在。相反,我们应该对Dockerfileapp.R进行修改(见此处的具体修改)。

我们首先删除了Dockerfile中的行COPY data /srv/shiny-server/data,然后将app.R中的./data/改为/Data/Vector/,以告知应用程序数据文件现在存储在不同的位置。用不同的标签重建 docker 映像后:

**# within ./Hist_App folder
docker build . -t shiny-hist-data**

我们运行以下命令:

**docker run --rm -v /Users/mingchuxu/Documents/projects/ShinyProxy-template/05-data-on-host/Data/:/Data  -p 3838:3838 shiny-hist-data## Note: The absolute path to /Data in your computer is different, please change it accordingly.**

我们可以看到直方图应用在localhost:3838上成功运行。app 如何知道数据文件的正确位置?窍门来自上面命令中的-v选项。该选项告诉 docker,我们希望将主机目录/Users/mingchuxu/Documents/projects/ShinyProxy-template/05-data-on-hist/Data挂载为容器中的/Data(该选项接受<host-dir>:<container-dir>格式)。这就是为什么当我们在app.R中指定/Data/Vector/时,直方图 app 知道去主机系统中的/Users/mingchuxu/Documents/projects/ShinyProxy-template/05-data-on-hist/Data/Vector中找数据文件。

我们可以在散点图文件夹中进行相同的更改(参见这里的确切更改),构建一个新的 docker 映像,并在挂载主机目录的情况下运行它。散点图应用程序也应该在localhost:3838运行:

**# within ./Scatter_App folder
docker build . -t shiny-scatter-datadocker run --rm -v /Users/mingchuxu/Documents/projects/ShinyProxy-template/05-data-on-host/Data/:/Data  -p 3838:3838 shiny-scatter-data## Note: The absolute path to /Data in your computer is different, please change it accordingly.**

下一步是将 docker 音量功能与 ShinyProxy 结合起来。在application.yaml中,选项container-volumes等同于docker run中的-v选项,允许我们进行相应的配置。让我们修改application.yaml文件(查看这里的确切变化),然后构建并运行一个新的 ShinyProxy 映像:

**docker build . -t shinyproxy-run-datadocker run --rm -v /var/run/docker.sock:/var/run/docker.sock --net sp-test-net -p 8080:8080 shinyproxy-run-data**

现在从localhost:8080开始,我们可以运行多个 R 闪亮的应用程序,从我们的主机读取数据。下图说明了与图 4 相比改进的设计。我们可以自由地将./Data文件夹移动到我们计算机上的任何地方。只要记住每次我们改变绝对路径并重建 ShinyProxy 映像时,都要修改application.yaml中的container-volumes选项。

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

图 5。带有 docker volumes 的改进 ShinyProxy 设计

06.配置用户特定的数据访问

完成了前面的步骤,我们现在面临最后一个问题:如何让 Alice 和 Bob 访问特定于用户的数据?这可以通过利用在 ShinyProxy 登录时创建的环境变量来解决:SHINYPROXY_USERNAME

首先,让我们在Data/文件夹的层次结构中再增加一层。如下树形结构所示,alice*txt放入Alice/,bob*txt放入Bob/。这使得 R Shiny 应用可以基于不同的 ShinyProxy 登录用户名访问不同的文件夹。

**Data
├── DF
│   ├── Alice
│   │   ├── alice_df_1.txt
│   │   └── alice_df_2.txt
│   └── Bob
│       ├── bob_df_1.txt
│       └── bob_df_2.txt
└── Vector
    ├── Alice
    │   ├── alice_vector_1.txt
    │   └── alice_vector_2.txt
    └── Bob
        ├── bob_vector_1.txt
        └── bob_vector_2.txt**

接下来要做一系列的修改。请参见此 GitHub 提交了解所有需要的更改。具体来说,在每个 app 的app.R文件中,我们需要添加username <- Sys.getenv("SHINYPROXY_USERNAME")来获取登录用户名,在uiserver中都通过paste0()来修改目录路径;在每个 app 的shiny-server.sh文件中,我们应该添加以下两行,将环境变量传递到 R Shiny app 中(在此详细解释):

**env > /home/shiny/.Renviron
chown shiny.shiny /home/shiny/.Renviron**

然后,就像在第 5 节中一样,我们将为每个应用程序构建新的 docker 映像。同样,我们使用新的 docker 图像标签来区分它们和前面章节中构建的图像。

**# within ./Hist_App folder
docker build . -t shiny-hist-user# within ./Scatter_App folder
docker build . -t shiny-scatter-user**

在构建最终的 ShinyProxy 映像之前,我们还需要修改applicaiton.yaml,因为 docker 映像和卷都已经发生了变化(参见这里的确切变化)。

最后,使用以下命令:

**docker build . -t shinyproxy-run-user       
# Note the tag name changedocker run --rm -v /var/run/docker.sock:/var/run/docker.sock --net sp-test-net -p 8080:8080 shinyproxy-run-user**

我们可以检查localhost:8080并看到 Bob 现在只能访问Bob/文件夹中的文件。最后,我们构建了一个简单的 R Shiny app 系列原型,允许用户认证和特定于用户的数据访问!

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

图 6。ShinyProxy 针对用户的数据访问

稀疏均值回复投资组合选择的优化算法

原文:https://towardsdatascience.com/an-optimization-algorithm-for-sparse-mean-reverting-portfolio-selection-4b991bae037?source=collection_archive---------32-----------------------

算法交易

自动识别资产并确定多头/空头头寸

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

多头和空头。希瑟·m·爱德华兹在 Unsplash 上拍摄的照片

受配对交易和多空股票策略的行业实践的激励,我们研究了一种结合统计学习和优化的方法来构建具有均值回复价格动态的投资组合。

我们的主要目标是:

  • 设计具有均值回复价格动态的投资组合,参数由最大似然估计;
  • 选择具有理想特征的投资组合,如高均值回归;
  • 建立一个简约的投资组合,即从大量的资产中找出一小部分来做多头/空头头寸。

在本文中,我们提出了完整的问题公式,并讨论了利用问题结构的专门算法。使用历史价格数据,我们在一系列的数值例子中说明了该方法。

问题定式化

给定在 T 时间步内观察到的 m 资产的历史数据。我们的主要目标是找到向量 w ,组成我们投资组合的资产的线性组合,这样相应的投资组合价格过程最好地遵循 OU 过程。在 T 时间步内观察到 OU 过程的可能性由下式给出

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

我们联合优化方法的一个主要特点是我们同时求解最优投资组合和相应的最大似然参数。

最小化负对数似然导致最优化问题

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

稀疏性和速度

给定一组候选资产,我们希望选择一个小的精简子集来构建投资组合。这一特性在实践中很有用,因为它降低了交易成本、执行风险和监控许多股票价格的负担。

为了给模型添加这个特性,我们想要对投资组合向量 w 施加稀疏惩罚。虽然 1-范数是经常使用的,但在我们的例子中,我们已经施加了 1-范数等式约束||w||₁ = 1。为了获得稀疏解(即,将非零权重限制为较小的数),我们使用 0 范数并将基数约束||w||₀ ≤η应用于优化问题。这个约束限制了投资组合中资产的最大数量,并且是非凸的。

除了简化解决方案之外,我们可能还想推广产品组合的其他功能。惩罚可能性框架足够灵活,允许这些增强。均值回复系数μ概括了一个重要特征;更高的可能是理想的。我们可以通过提升更低的 c 来寻求更高的值,例如使用线性惩罚。

有了新的约束和惩罚,优化问题就变成了

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

最优化算法

我们的策略是首先使用可变投影,如下所示:

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

这导致我们解决带有非凸约束的非凸优化问题:

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

如果我们想用梯度下降法迭代,但是下一次迭代 wᵢ₊₁可能在可行域之外。

投影 梯度 下降中,我们简单地选择可行集合中最接近每次迭代的点。这可以简单地概括为

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

这是我们算法的总结:

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

投影梯度下降算法

例子

我们对三组选定资产的经验价格数据进行了实验:

贵金属: GLD、GDX、广东西江、SLV、GG、AB

**大型资本股票/ETF:**GOOG、JNJ、NKE、MCD、SBUX、SPY、VIG、VO

**石油公司/ETF:**BP,COP,CVX,石油,USO,VLO,XOM

数据来自雅虎财经,给出了过去五年每项资产的收盘价。前 70%的数据(随着时间的推移)用于训练,其余用于测试。

对于每个组,我们成对地逐步增加候选资产集,并应用我们的方法。下表显示了当允许 2、4 或 6 项资产时的优化投资组合权重,以及相应投资组合的样本内和样本外负对数可能性(nll)。

当我们包含更多的资产时,投资组合 nll 通常会减少,这意味着随着候选集的扩大,我们可以获得更多的可表示的投资组合。

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

接下来,我们看看资产价格的时间序列和由此产生的投资组合。

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

一段时间内的资产价格和投资组合价值对

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

在 8 项资产中,该算法选择了 NKE-SBUX 的双资产投资组合。放大的投资组合价值(黑色:样本内;蓝色:样本外)

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

BP、COP、CVX、石油、USO、VLO、XOM 的价格,以及由此产生的投资组合价值(黑色)。

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

在 7 项资产中,该算法为 2 项资产的投资组合选择了石油-USO。这是投资组合价值(黑色:样本内;蓝色:样本外)。

结论

我们的算法可以完全自动化,以处理更多的资产价格和识别价格模式,并进而发现交易机会。可扩展性的这一特性对于所有机器学习交易方法都至关重要。在我们的论文中,我们还讨论了我们算法的速度,这是 algo 交易策略的另一个重要元素。

为了交易均值回复投资组合,我们仍然需要确定进场和出场的时机以及止损策略,正如相关的文章所讨论的。

参考

J.张,A. Aravkin 和 T. Leung (2020),通过惩罚似然优化的稀疏均值回复投资组合,《自动化》,第 111 卷,108651。https://doi.org/10.1016/j.automatica.2019.108651

T.Leung T .和 X. Li (2015),有交易成本的最优均值回复交易&止损退出,国际理论&应用金融杂志,第 18 卷,第 3 期,第 1550020 页。https://doi.org/10.1142/S021902491550020X

谷歌学术 // 领英页面 // 主页

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

自然语言处理中的文本表示综述

原文:https://towardsdatascience.com/an-overview-for-text-representations-in-nlp-311253730af1?source=collection_archive---------13-----------------------

讨论自然语言处理中三种最常用的输入类型。

当要阐明一个人对某个特定话题的理解时,写作总是一个不错的选择。通过把想法写在纸上,想法会被澄清,困惑会被暴露。虽然这可能不是最舒服的事情,但这确实是一种学习和提高的有效方式。

如果你发现自己很难向朋友解释一些事情,一些你已经研究了一段时间,但不知何故仍然无法清晰直观地描述的事情,你应该试着把它写下来。

在这篇文章中,我试图总结 NLP 中文本表示的一些想法,旨在为未来的复杂概念奠定基础,并希望对您的学习贡献我的 granito de arena

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

NLP 输入的预处理步骤

上图总结了一个文本 语料库转化为不同输入格式的过程,供一个机器 学习 模型使用。从左起,语料库经过几个步骤才获得记号,一组文本构建 组块子词等。由于 ML 模型只能够处理数字 ,所以通过在关联 数组(词汇)中查找或者使用散列 技巧,句子中的记号被它们对应的id、所替换。一旦完成,它们就被转换成不同的输入 格式,如右图所示。这些格式中的每一种都有自己的优点、缺点,应该根据手头任务的特点有策略地选择。

我们将研究上面显示的每一个输入表示,直接从标记开始,忽略前面的步骤。

内容:

  • 一键编码
  • 计数向量/特征散列/Tf-idf
  • 单词嵌入/训练嵌入/语境化嵌入

1.一键编码

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

单词“The”、“cat”和“on”在词汇表中分别具有索引值 0、1 和 2,只有在这些位置它们的独热向量将具有值 1。向量的长度由语料库中唯一标记的数量决定。图片来自来源

当在一个数据集中遇到一个****特征时,一键编码可能是一个人的首选(显然,如果你认为这样的特征对模型有用的话)。这是一种简单而直接的技术,它通过用充满向量替换每个类别来工作,除了其对应的索引值的位置,其值为 1

当对文本文档应用独热编码时,标记被它们的独热向量所代替,并且给定的句子又被转换成形状为(【n,m】)的 2D 矩阵,其中 n 是句子中 标记号** 以及 m 根据一个句子有多少个标记,它的形状不同**。****

As an example, say that we were to use one-hot encoding for the following sentences:s1\. ***"This is sentence one."***
s2\. ***"Now, here is our sentence number two."***The vocabulary from the two sentences is:**vocabulary = {"here": 0, "is": 1, "now": 2, "number": 3, "one": 4, "our": 5, "sentence": 6, "this": 7, "two": 8}**The two sentences represented by one-hot vectors are:**indices**                             **words
     ** *0  1  2  3  4  5  6  7  8*
s1: **[[0, 0, 0, 0, 0, 0, 0, 1, 0],** - "this"
     **[0, 1, 0, 0, 0, 0, 0, 0, 0],** - "is"
     **[0, 0, 0, 0, 0, 0, 1, 0, 0],** - "sentence"
     **[0, 0, 0, 0, 1, 0, 0, 0, 0]]** - "one"s2: **[[0, 0, 1, 0, 0, 0, 0, 0, 0],** - "now"
     **[1, 0, 0, 0, 0, 0, 0, 0, 0],** - "here"
     **[0, 1, 0, 0, 0, 0, 0, 0, 0],** - "is"
     **[0, 0, 0, 0, 0, 1, 0, 0, 0],** - "our"
     **[0, 0, 0, 0, 0, 0, 1, 0, 0],** - "sentence"
     **[0, 0, 0, 1, 0, 0, 0, 0, 0],** - "number"
     **[0, 0, 0, 0, 0, 0, 0, 0, 1]]** - "two"

改变形状和不认识的单词

随着训练库变得越来越大,词汇的大小只会增长,结果,每个记号将由具有越来越大长度的向量来表示,使得矩阵更加稀疏。代替单词级表示,更常见的方法是使用字符作为标记,因为它将限制向量的长度。****

但是无论是使用单词级还是字符级表示,不同的句子矩阵都不可避免地会有不同的形状**(不同的行数)。对于大多数 ML 模型来说,这可能是一个问题,因为它们的输入形状应该是相同的。另一方面,基于 RNN 的模型,如果设置正确,由于其’重现’的性质,不会有这种担心,但是同一个批次中的所有实例仍有望共享一个统一的形状。**

为了解决这个问题,一个解决方案是为所有实例固定一个长度——截断较长的实例,而填充*。对于像短文本的情感 分析这样的任务(尽管使用一键处理不会产生好的结果),通常使用前 300 个字符就足够了。在 Keras 中,填充令牌可以被屏蔽,因此它们不会影响损失。***

训练语料库的规模可以想有多大就有多大,使词汇量越来越丰富,但在推理时间里,总有可能遇到未知* 单词。处理这个问题的一个方法是在初始化时在词汇表中保留一些空间,这样当一个不在词汇表中的单词弹出时,它可以被分配到其中一个保留位置(一个oovbucket)。***

另一种特征化文本的方法是通过 n-gram 计数矢量器,让我们来看看。

2.计数矢量器

一键编码的使用允许我们实现句子的记号* - 表示,这是通过用向量替换其记号,同时保持其原始的顺序 排列来实现的。另一方面,计数矢量器基于词频,能够将整个句子压缩成一个单个矢量。如前所述,计数向量的每个位置被分配给一个特定的标记,其值代表该标记在句子中的 出现 ***

首先从语料库中生成标记,并且构建词汇以将标记映射到它们相应的 id。计数向量不是为每个单词构建一个向量,而是简单地计算每个单词在句子中出现的次数,并将该数字放在向量中它们对应的位置*。***

*If we were to represent the sentences from the previous example with count vectors, they would look like this:s1: [0, 1, 0, 0, 1, 0, 1, 1, 0]s2: [1, 1, 1, 1, 0, 1, 1, 0, 1]vocabulary = {"here": 0, "is": 1, "now": 2, "number": 3, "one": 4, "our": 5, "sentence": 6, "this": 7, "two": 8}*

现在所有的句子都由共享相同长度 l 的向量表示,长度由词汇表中唯一标记的数量定义,默认为但也可以手动选择*。这种表示句子的方式将无法提供原句子的任何标记排序 信息,并且其关联的上下文信息丢失——只有术语 频率反映在计数向量中。*******

***For illustration purposes, let's vectorize sentence s3:s3: ***"this this this is is one one one one"***
--> feature counts: "this" x 3, "is" x 2, "one" x 4s3: [0, 2, 0, 0, 4, 0, 0, 3, 0]***

除了使用单个单词/字符作为标记,这可以被视为单字母计数矢量器,我们还可以使用两个或更多连续的单词/字符来形成标记,获得所谓的 2 字母、3 字母或更一般的 n 字母矢量器。**

垃圾邮件检测中的用法

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

WebarooUnsplash 上拍摄的照片

计数向量的一个用例是,例如,垃圾邮件 电子邮件 检测朴素* 贝叶斯模型。***

邮件过滤的主要标准是每类邮件中的术语* 频率,即一个单词在垃圾邮件和非垃圾邮件中出现的次数。***

***The model learns through training about what words are more spam-like words, and what words are not. It assumes **conditional** **independence** for each email’s content words, meaning they are mutually independent and their appearances are only conditioned by the email’s **label**(spam, Y=1, or non-spam, Y=0).The probability of a given email being a Spam(Y=1), given its content words(X), is calculated using **Bayes** **rule**. According to which, such probability is determined by the probability of seeing these words in those Spam emails, P(X|Y=1), multiplied by the portion of Spam emails the model has seen during training, P(Y=1), and divided by P(X).***

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

***With X being the collection of words from an email, {x1, x2, …, xm}, by assuming **conditional** **independence**, P(X|Y=1) is calculated as the product of the probabilities of seeing these words in Spam emails:***

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

这里使用计数向量的一个缺点未知的单词被扔掉****。如果你有一个句子有 m 个单词和 n 个单词,而这些单词在模型中从未出现过,那么只有 m-n 个 单词会被考虑进去。这被狡猾的垃圾邮件发送者用于过滤* 规避——修改垃圾邮件关键词,使它们不为模型所知,但仍然对用户可读。该模型将看到的内容仅包含中性单词,并且该电子邮件可以被分类为非垃圾邮件。*******

*******- Sentence from a Spam email:*"come* ***make*** *some* ***money****, ten* ***thousand******dollar*** *a week for doing nothing"*- With modified words:*"come* ***mayke*** *some* ***m0ney****, ten* ***th0usand******dollar$*** *a week for doing nothing"*- The sentence the model will see:*"come some, ten a week for doing nothing"********

除了其他优点之外,特征散列有助于减轻损害。

特征散列

随着模型用越来越大的语料库训练,它产生的词汇需要越来越多的存储空间来存储。为了提高效率,这些查找表被存储在 RAM 中,用于快速令牌 id 映射,并且一旦它们的大小变得太大,能够减慢** 操作。******

通过使用散列 技巧,我们可以完全摆脱这种消耗内存的词汇,而代之以使用散列** 函数进行令牌-id 映射。对于一个给定的字符串,哈希函数能够返回一个数值**、一个哈希**、,也就是对该字符串唯一的,并将其作为令牌id 。******

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

使用散列函数进行令牌-id 映射。

由于不涉及固定大小的词汇,所有的记号现在都可以分配给一个数字,不管模型之前是否见过它。在垃圾信息 检测的情况下,通过让垃圾信息词变得对模型陌生来绕过过滤器的方式不再那么有效。任何给定的字,“已知”或“未知”,都可以被馈送到散列T42 函数并输出一个在预定义的** 范围内的数字 。它在计数向量中的相应位置将加 1,而不是丢弃未知单词,因此电子邮件中的所有单词都将被考虑在内,而不仅仅是中性单词。******

与词汇表不同,特性哈希是一种 one - way 操作——我们无法通过哈希函数使用其哈希 找到初始** 特性。相同的输入将总是产生相同的输出,但是两个不同的特征可能碰巧被映射到相同的散列值(如果向量大小很大,即 2 个⁴).,这种可能性可以忽略不计)******

Tf-idf 术语权重

如前所述,当表示句子 上下文时,计数向量是有缺陷的,因为它们不反映任何初始的标记** 排序。当诸如“like”、“a”或“and”等几乎没有意义的上下文 信息的术语出现得太频繁时,事情会变得更糟,通过降低它们的频率,将模型的注意力从那些不太频繁但更有趣的术语上移开。******

Tf-idf 代表术语 - 频率 (tf)乘以逆** 文档 - 频率 (idf),它用于根据每个标记出现在多少个不同的句子中,通过重新加权计数特征来解决这个问题。假设一个术语的 相关性与其在不同文档中出现之间存在 关系,则惩罚。******

作为一个例子,让我们看看 Scikit-Learn 的 tf-idf 实现、 TfidfTransformer ,在默认设置中:

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

Scikit-Learn 默认设置中的 TfidfTransformer。

3.单词嵌入

到目前为止,我们已经看到了两种类型的表示: One-hot 编码,这是一种标记级别的表示,允许保留初始句子中的标记顺序;以及计数向量,这是一种更紧凑的句子级别的表示,它依赖于术语频率。****

对于 NLP 任务,如文本生成分类**,一键表示或计数向量可能能够足以表示模型做出明智决策所需的信息。但是,它们的用法对于其他任务来说就不那么有效了,例如情感** 分析神经 机器 翻译以及问题 回答,这些任务需要对上下文有更深入的理解才能获得很好的结果。********

以 One-hot 编码为例,使用它不会导致这些任务的良好概括的模型,因为任何两个给定单词之间都不能进行比较。所有矢量都是彼此正交的,任意两个矢量的内积 为零,它们的相似度不能用距离余弦相似度来度量。

**Say that we were to train a language model for text generation and we've provided the model with the following sentence: ***"I want to have an orange",*** expecting it to output ***"juice"***.--> ***"I want to have an orange juice"***If done right, the model should learn that ***"orange juice"*** is a common thing, or the entire sentence is a common sentence.If we were asked to complete the following sentence with one word: ***"I want to have an apple"***. Having seen the first sentence, our common sense will tell us to use ***"juice"***, provided that we have a notion on the similarities between ***"orange"*** and ***"apple"***.But the model we just trained won't be able to mimic this since it doesn't have any clue about how similar these two words are. In fact, it doesn't have any clue on how similar any two given words are, so it won't be able to generalized from ***"orange juice"*** to ***"apple juice".*****

为此,我们求助于单词 嵌入,一种能够捕获单词的语义 含义的特征化单词级表示。

通过嵌入,每个单词由一个固定大小的密集 向量表示(通常范围从 50 到 300),其值对应于一组特征,即男性女性年龄等。如下图所示,这些特征被视为一个词的语义的不同的 方面,它们的值由随机 初始化得到,并在训练过程中更新,就像模型的参数一样。**

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

嵌入“国王”、“王后”、“女人”和“公主”的向量。图片来自来源

当训练嵌入时,我们不告诉模型这些特征应该是什么,而是由模型来决定什么是学习任务的最佳特征。在建立一个嵌入 矩阵(一组单词嵌入)时,我们只定义它的形状——单词的数量和每个向量的长度。每个特征所代表的东西通常很难解释。

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

单词嵌入的可视化。图片来自来源

单词嵌入捕捉语义 含义的能力可以通过将这些高维向量通过 t-SNE 投影到 2D 空间进行可视化来说明。如果成功地获得了嵌入,用 t-SNE 绘制这些向量将展示具有相似含义的单词如何最终变得更加接近。

不同嵌入向量之间的语义 关系也可以用下面的例子来说明。

**Say that we have the embedding vectors of the word "**king**", "**queen"**, "**man**", and "**woman"**. The resulting vectors of subtracting "**queen**" from "**king**" and "**woman**" from "**man**" would be very similar direction-wise since they both carry similar values for that ***Gender*** feature."**king**" - "**queen**" ≃ "**man**" - "**woman**"or equivalently,"**king**" - "**queen**" + "**woman**" ≃ "**man**"**

训练词嵌入

前面我们提到过嵌入向量可以像另一个(在神经网络中)一样被训练,它们也可以被单独训练并在以后通过转移 学习用于不同的任务。****

有不同的方法来训练嵌入,但是原理大致相同。这里我们简单讨论两种 Word2Vec 方法,即连续 包字 (CBOW)和跳字**。******

Word2Vec 是浅层的两层神经 网络,被训练来重构单词的语言上下文**。我们从大型语料库中提取上下文/目标单词的进行训练,其中目标单词是随机选择的单词,而上下文单词是位于目标单词周围给定窗口内的那些单词。******

****There are different varieties of context, they can be 1)all the words within the window, 2) n words before or 3) after the target word, or 4) simply a random word located within the window.Sentence: "*Learning Spanish* ***is*** *hard but also fun*"

- target word: "is"
- windows length is 2, for both directions
- context:
 1\. "learning", "Spanish", "hard", "but"
 2\. "learning", "Spanish"
 3\. "hard", "but"
 4\. "learning"****

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

CBOW(左)和 Skip-gram(右)的模型架构图。图片来自本文

对于 CBOW ,将上下文字以其嵌入形式(随机初始化)输入到模型中,并且期望模型使用 softmax,P(目标|上下文)输出目标字。 Skip-gram ,另一方面,与相反的,它接受目标单词,并预期输出上下文单词。****

现在,这些听起来可能很难学习 任务,但是请记住,目标不是做好任务本身,而是学习好嵌入,这些模型可以做到这一点。

语境化的单词嵌入

一词多义代表书写相同但根据上下文它们可以有完全 不同的意思。如上所述的单词嵌入将使无法处理这个问题。****

****The word "**bank**" in the following two sentences has **different** **meanings**, but since they are assigned to the **same** **token** **id**, their word **embedding** vectors are the **same**.1\. "I went to the **bank** to withdraw some money."
2\. "I went to the other side of the river **bank**."****

为了解决这个问题,每个工作嵌入必须考虑到找到单词的上下文并相应地修改它的值。携带一个一般化的嵌入 矩阵并将其插入到模型中对于我们正在尝试做的任务来说是不充分的,相反,一个更加复杂的结构 **必须被包含到模型的下部才能找到嵌入**。********

用于神经 机器 翻译 (NMT)的基于编解码的架构是一个很好的例子来介绍预训练 + 微调方法论,这是近年来 NLP 中最新的突破的原因。

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

a)用于机器翻译的序列到序列模型的预训练。b)将模型的编码器用于其他任务。图片来自封面纸

这张图来自 学习翻译:语境化的 向量 (CoVe)描述了在预训练中获得嵌入的过程,以及它们如何用于下游********

在左边,一个基于编码器-解码器的模型为 NMT 训练,来自原始语言的句子首先由编码器处理,然后其输出被传递到解码器进行最终翻译。这个预训练过程是受监督的,目标是让编码器学会如何捕捉单词的句法语义含义,并输出上下文化的** 嵌入。编码器基于两层双向 LSTM 架构,解码器基于注意力 单向 LSTMs 。******

在右边,一个预先训练的编码器接收输入、手套嵌入,以找到上下文化的** 嵌入,然后它们与原始输入组合,用于一个下游任务。******

CoVe 的局限性在于:1)预训练是由监督的,因此它受到标注为 数据的数量的限制,2)任务特定的模型的架构还有待定义,要找到一个能够实现出色结果的架构并不是一件轻而易举的事情。通过克服这两个障碍,我们希望找到一个模型,它可以 1)用无限数据进行预训练——无监督训练,2) 对有限的标记数据进行微调,并对其架构进行一些小的修改,以实现不同 NLP 任务的 SOTA 结果。********

下面简单介绍一下埃尔莫奥纳尔 GPT伯特是如何解决上述局限性的。更详细的解释请看这篇惊人的帖子: 广义语言模型作者 Lilian Weng。

语言模型的嵌入(ELMo)通过以无监督方式训练语言 模型来获得上下文化嵌入——接受一系列标记,并学习预测给定历史的下一个标记。其结构基于双向****LSTMs,其中 L 层的 lstm 是一层一层的堆叠,每一层输出一个不同的序列表示。****

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

双向 LSTM。图片来自 Lilian Weng 的博客。

不同的层次侧重于单词的句法/语义的不同方面。 ELMo 较高层更关注语义方面,而较低层可以捕捉更好的句法方面。

双向 LSTMs 用于确保模型不仅学习预测给定令牌的未来,还学习预测其过去

ELMo 仅用于查找上下文化的嵌入。对于给定的任务,仍然需要找到特定的模型架构

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

OpenAI GPT 用于不同的下游任务。图片来自原纸

OpenAI GPT ,基于变压器的解码器,可直接用于所有终端任务。如图所示,不同的任务有不同的预处理步骤,但只需对 GPT 的变形金刚模型稍加修改即可完成任务。****

与 ELMo 不同, GPT 只被训练来预测未来,但是为了更好地理解给定令牌的上下文,来自其的项目都应该被考虑。

BERT 基于 Transformer 的编码器,被训练预测来自的上下文。它的预培训包括两项任务:****

  1. 屏蔽语言模型,用【屏蔽】"随机替换标记,该模型必须通过查看其上下文来输出其原始单词。通过这样做,它迫使模型更好地捕捉缺少的单词的句法语义含义。****
  2. 下一句预测。BERT 不是每次只取一个句子,而是取其中的一对,A 和 B,作为输入,它必须预测 B 是否需要 A。经过这项任务的训练,模型将更有能力理解 句子之间的关系 ****

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

伯特的输入。图片来自伯特论文

BERT 使用单词块 标记化 嵌入作为它们的输入。它不生成正常单词标记,而是使用子单词 标记化来更好地处理罕见未知单词,因为它们中的大部分可以使用子单词重构。两个输入句子有不同的句子 嵌入,并且使用特殊字符来分隔它们。位置 嵌入也被使用。****

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

用于句子分类的微调 BERT。图片来自伯特论文

当使用 BERT 进行下游任务时,就像 GPT 一样,只需添加几个新参数。以文本分类为例,我们需要做的是从最后一层取出【CLS】token 的嵌入,并传递给一个 softmax

结论:

如果你从头到尾都读完了,这就不是一篇短文,但是如果你没有,这里有一个快速回顾:

本文讨论了三种类型的文本 表示,其中前两种是稀疏向量:一键 编码一方面是一种标记级表示,其中一个句子在用作输入之前被转换成一个矩阵,其行数与其标记数相同。计数矢量器则可以把一个句子作为一个整体,挤压成一个 单个 矢量。它依赖于统计 频率,而这是以丢失关于句子的标记 排序的信息为代价的。

使用散列 技巧可以帮助解决大词汇表内存 消耗的问题,并且它还缓解了在垃圾邮件检测的情况下过滤器 规避的问题。 Tf-idf 用于重新加权 术语 频率用于计数向量,因此较少 频繁上下文 - 揭示术语不会被“忽略”。

单词 嵌入,一种更高级的技术,在需要更好地捕捉单词的语义 含义时使用。使用更复杂的结构来处理输入,以获得上下文化的 嵌入,这又用于解决多义性的问题。****

文章最后对最新的自然语言处理模型进行了简要的讨论。目的是提供一些基本的想法,需要投入更多的努力来进一步理解这些模型。

强化学习算法的结构概述

原文:https://towardsdatascience.com/an-overview-of-classic-reinforcement-learning-algorithms-part-1-f79c8b87e5af?source=collection_archive---------17-----------------------

演员评论家、政策梯度、DQN、VFA、SARSA、Q-learning、基于模型和无模型蒙特卡罗、动态规划

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

作者照片

强化学习在过去的十年里获得了极大的普及,在机器人、游戏和许多其他领域都有一系列成功的现实应用。

在本文中,我将提供经典强化学习算法的高级结构概述。讨论将基于它们在算法复杂性方面的异同。

RL 基础

让我们从一些基本概念的快速复习开始。如果您已经熟悉 RL 的所有术语,可以跳过这一部分。

强化学习模型是一种基于状态的模型,它利用了马尔可夫决策过程(MDP) 。RL 的基本要素包括:

插曲(展示):播放状态和动作的整个序列,直到达到终止状态;

当前状态 s(或 s t ) :代理当前所在的位置;

下一个状态 s’(或 s t+1 ) :当前状态的下一个状态;

动作 a :状态 s 时要采取的动作;

转移概率 P(s’|s,a) :在状态 s t 采取行动时到达 s '的概率;

Policy π(s,a) :从每个状态到一个动作的映射,决定了代理在每个状态下如何动作。它可以是确定的,也可以是随机的

奖励 R(或 R(s,a)) :奖励函数,生成在状态 s 采取行动 a 的奖励;

Return G t :状态 s t 的未来总报酬;

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

值 V(s) :从状态 s 开始的期望收益;

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

Q 值 Q(s,a) :从状态 s 开始,采取行动 a 的期望收益;

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

贝尔曼方程

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

根据贝尔曼方程,现值等于当前报酬加上下一步的贴现(γ)值,遵循政策 π 。它也可以用 Q 值表示为:

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

这是大多数强化学习算法中的理论核心。

预测与控制任务

强化学习有两个基本任务:预测和控制。

在预测任务中,我们被给定一个策略,我们的目标是通过估计遵循该策略采取行动的值或 Q 值来评估该策略。

在控制任务中,我们不知道策略,目标是找到让我们收集最多奖励的最优策略。在本文中,我们将只关注控制问题。

RL 算法结构

下面是我做的一个图,用来可视化不同类型算法的高层结构。在接下来的几节中,我们将深入研究每种类型的复杂性。

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

MDP 世界

在 MDP 世界中,我们有一个世界如何工作的心理模型,这意味着我们知道 MDP 动力学(跃迁 P(s’|s,a)和奖励函数 R(s,a)),所以我们可以直接使用贝尔曼方程建立一个模型。

同样,在控制任务中,我们的目标是找到一个给我们最大回报的策略。为了实现它,我们使用动态编程。

动态规划(迭代方法)

1。策略迭代

策略迭代本质上是重复执行两步直到收敛:策略评估和策略改进。

在策略评估步骤中,我们通过使用贝尔曼方程计算 Q 值来评估在状态 s 的策略 π :

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

在策略改进步骤中,我们通过贪婪地搜索在每个步骤中使 Q 值最大化的动作来更新策略。

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

让我们看看策略迭代是如何工作的。

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

2。值迭代

值迭代结合了策略迭代中的两个步骤,因此我们只需要更新 Q 值。我们可以将价值迭代解释为总是遵循贪婪的策略,因为在每一步,它总是试图找到并采取使价值最大化的行动。一旦价值收敛,就可以从价值函数中提取最优策略。

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

在大多数真实世界的情况下,我们不知道 MDP 动力学,所以迭代方法的应用是有限的。在下一节中,我们将转换话题,讨论可以处理未知世界的强化学习方法。

强化学习世界

在大多数情况下,MDP 动力学要么是未知的,要么在计算上无法直接使用,所以我们不是建立一个心理模型,而是从采样中学习。在下面所有的强化学习算法中,我们需要在环境中采取行动来收集奖励和估计我们的目标。

勘探-开采困境

在 MDP 模型中,我们可以在使用转移概率函数得出好的解决方案之前探索所有的潜在状态。然而,在过渡未知的强化学习中,如果我们继续贪婪地搜索最佳行动,我们可能会陷入几个状态,而无法探索整个环境。这就是探索-开发的困境。

为了走出次优状态,我们通常使用一种叫做ε贪婪的策略:当我们选择最佳行动时,有ε的概率我们可能会得到一个随机行动。

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

基于模型的强化学习

估计 MDP 动力学的一种方法是抽样。遵循随机策略,我们对许多(s,a,r,s’)对进行采样,并使用蒙特卡罗(计算出现次数)从数据中显式地估计转移和奖励函数。如果数据足够大,我们的估计应该非常接近真实值。

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

一旦我们有了估计,我们就可以使用迭代方法来寻找最优策略。

无模型强化学习(表格)

让我们后退一步。如果我们的目标只是找到好的政策,我们所需要的就是得到一个好的 q 估计。从这个角度来看,估计模型(过渡和奖励)只是达到目的的一种手段。为什么不直接切入正题,直接估算 Q 呢?

这就是所谓的无模型学习。

1。无模型蒙特卡罗

回想一下,当代理人从状态 s 采取行动 a 时,Q(s,a)是期望效用。

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

无模型蒙特卡罗的思路是对很多 rollouts 进行采样,用数据来估计 q,我们来看看算法。

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

我们首先随机初始化所有东西,并使用 epsilon greedy 对一个动作进行采样,然后我们开始玩 rollouts。在每个卷展结束时,我们计算卷展中每个状态 St 的返回 Gt。为了得到 Q(st,at),收益 Gt 的平均值,我们可以存储所有的收益,并在完成采样后更新 Q。然而,更有效的方法是在每个卷展结束时使用移动平均增量更新 Q,如下所示。

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

2。萨尔萨

SARSA 是一种时间差分(TD)方法,它结合了蒙特卡罗和动态规划方法。更新方程与蒙特卡洛的在线更新方程具有相似的形式,只是 SARSA 使用 rt + γQ(st+1,at+1)来替换来自数据的实际回报 Gt。N(s,a)也用参数α代替。

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

回想一下,在蒙特卡洛,我们需要等待该集结束,然后才能更新 Q 值。TD 方法的优点是,当我们移动一步并得到一个状态-动作对(st,at,rt,st+1,at+1)时,它们可以立即更新 Q 的估计。

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

3。q-学习

Q-learning 是另一种 TD 方法。SARSA 和 Q-learning 的区别在于,SARSA 是一个基于策略的模型,而 Q-learning 是基于策略的。在 SARSA 中,我们在状态 st 的返回是 rt + γQ(st+1,at+1),其中 Q(st+1,at+1)是根据状态-动作对(st,at,rt,st+1,at+1)计算的,该状态-动作对是通过遵循策略π获得的。然而,在 Q-learning 中,Q(st+1,at+1)是通过采取最优行动获得的,这可能不一定与我们的策略相同。

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

一般来说,策略上的方法更稳定,但是策略外的方法更可能找到全局最优。从下面我们可以看到,除了更新方程,算法的其他部分和 SARSA 一样。

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

价值函数近似(VFA)

到目前为止,我们一直假设我们可以将价值函数 V 或状态-动作价值函数 Q 表示为表格表示(向量或矩阵)。然而,许多现实世界的问题具有巨大的状态和/或动作空间,对于这些空间,表格表示是不够的。自然,我们可能想知道是否可以参数化值函数,这样我们就不必存储表了。

VFA 就是用参数化函数 Q hat 来表示 Q 值函数的方法。

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

状态和动作被表示为特征向量 x(s,a ),并且估计的 Q hat 是线性预测器的分数。

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

目标是最小化估计 Q(预测)和实际 Q(目标)之间的损失,我们可以使用随机梯度下降来解决这个优化问题。

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

我们如何得到我们的目标——目标函数中的真实 Q 值?

回想一下,Q 值是预期收益(Gt),因此获得 Q 值的一种方法是使用蒙特卡罗:播放许多集并统计出现次数。

对于参数化蒙特卡罗,我们有以下目标函数和梯度:

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

另一种方法是利用 Q 值的递归表达式:Q(st,at) = rt + γQ(st+1,at+1)。正如我们前面讨论的,时间差分(TD)方法结合了蒙特卡罗和动态规划,并允许实时更新。因此,我们也可以使用 TD 方法获得目标 Q 值:SARSA 和 Q-learning。

萨尔萨:

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

q 学习

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

注意,在上面的 TD 方法中,我们实际上是使用模型预测来逼近真实的目标值 Q(st+1,at+1),这种类型的优化称为半梯度。

深度 Q 网络(DQN)

如果我们有一套正确的功能,线性 VFA 通常工作得很好,这通常需要仔细的手工设计。一种替代方案是使用深度神经网络,该网络直接使用状态作为输入,而不需要特征的明确说明。

例如,在下图中,我们有一个神经网络,状态 s 作为输入层,2 个隐藏层,预测的 Q 值作为输出。这些参数可以通过反向传播来学习。

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

在 DQN 中有两个重要的概念:目标网和经验回放。

正如你可能已经意识到的,使用半梯度的一个问题是,模型更新可能非常不稳定,因为每次模型更新时,真实的目标都会改变。解决方案是创建一个目标网络,它以一定的频率复制训练模型,这样目标模型更新的频率就会降低。在下面的等式中,w-是目标网络的权重。

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

我们还创建了一个体验重放缓冲区,用于存储以前剧集中的(s,a,r,s’,a’)对。当我们更新权重时,我们从体验重放缓冲器中随机选择一个体验来运行随机梯度下降,而不是使用从剧集中生成的最新对。这将有助于避免过度拟合。

我以前实现了 DQN 与 Tensorflow 玩钢管舞游戏。如果您有兴趣了解更多关于实现的信息,请点击这里查看我的文章

政策梯度

与之前对价值函数建模的算法不同,策略梯度方法通过将策略参数化为以下形式来直接学习策略:

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

然而,当谈到优化时,我们仍然必须回到价值函数,因为策略函数本身不能用作目标函数。我们的目标可以表示为价值函数 V(θ),它是我们从遵循随机策略π的轨迹τ中得到的期望总报酬。这里θ是策略的参数。注意不要将 V(θ)误解为参数化的值函数。

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

其中τ是状态-动作轨迹:

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

R(τ)是轨迹τ的奖励总和:

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

现在,目标是找到使值 V(θ)最大化的策略参数(θ)。为此,我们通过提升策略的梯度 w.r.t .参数θ来搜索 V(θ)中的最大值。

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

在如下所示的梯度中,策略ωθ通常使用 softmax、高斯或神经网络建模,以确保其可微分。

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

我们来看看政策梯度是什么样的。

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

演员兼评论家

行动者-评论家方法不同于政策梯度方法,因为行动者-评论家方法估计政策和价值函数,并更新两者。在策略梯度方法中,我们使用 Gt 来更新θ,Gt 是单次部署中对 st 的价值函数的估计。虽然这个估计是无偏的,但它有很高的方差。

为了解决这个问题,行动者-批评家方法使用自举和函数逼近引入了偏差。我们用一个参数化的函数来估算价值,而不是使用展开中的 Gt,这就是批评家的用武之地。

这是“普通的”演员兼评论家政策梯度:

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

在上述过程中,引入了两个新术语:优势(At)和基线(b(s))。

b(t)是状态 St 下的预期未来总报酬,相当于 V(St),这是评论家估计的价值函数。

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

在每一集之后,我们更新价值函数 b(s)和策略函数。与策略梯度中的不同,这里的策略函数用 at 而不是 Gt 更新,这有助于减少梯度的方差

除了普通的演员-评论家之外,还有两个流行的演员-评论家方法 A3C 和 A2C,它们用多个工作者更新策略和价值函数。他们的主要区别是 A3C 执行异步更新,而 A2C 是同步的。

结论和想法

在本文中,我们概述了许多经典和流行的强化学习算法,并讨论了它们在复杂性方面的异同。

值得一提的是,每个型号系列中都有很多我们没有涉及到的变体。例如,在 DQN 家族中,有决斗的 DQN 和双 DQN。在政策梯度上的影评世家,有 DDPG、宏碁、沈飞等。

此外,还有另一种 RL 方法:进化策略。受自然选择理论的启发,专家系统解决了目标函数没有精确解析形式的问题。因为它们超出了 MDP 的范围,所以我没有把它们包括在本文中,但是我可能会在以后的文章中讨论它们。敬请期待!😃

参考

斯坦福 CS234 课程笔记:https://web.stanford.edu/class/cs234/slides/

莉莲的博客:【https://lilianweng.github.io/lil-log/】T2

DeepSense 框架概述

原文:https://towardsdatascience.com/an-overview-of-deepsense-framework-5d7704343734?source=collection_archive---------35-----------------------

我发现 DeepSense 框架是处理时序感测数据的有前途的深度学习架构之一。在这个简单而直观的概述中,我将介绍姚等人题为“Deep Sense:用于时间序列移动传感数据处理的统一 DL 框架”的原始论文的主要思想。(可在 www2017 找到)。

主要问题

DeepSense 使用来自各种传感器(加速度计、陀螺仪等)的时间序列数据来解决移动传感问题。由于传感器的质量问题,处理任何类型的传感器都会涉及噪声测量。很难找到描述现实生活中噪声的分布,所以最终,我们的测量结果被“未知”噪声(非线性、随时间相关等)破坏。).此外,对于跟踪应用程序,应定义物理系统模型。这个模型在不准确性方面也受到“噪声”的影响(因为我们不能无误差地预测/定义模型)。当我们处理实时测量(和物理模型)时,行为可以被描述为“物理量的时间序列测量”。

(核心)思想

作者提出了一个统一的 DL 框架来解决移动传感中描述的挑战:卷积神经网络(CNN)和递归神经网络(RNN)的集成。CNN 负责计算时间间隔内的感知量**,提取所有传感器的局部特征,并将它们组合成全局特征。RNN 负责计算跨越时间间隔的传感量,在此提取时间相关性。DeepSense 以某种统一的方式解决了移动计算任务的分类和回归。**

建筑

该架构由 3 部分组成:卷积层、递归层和输出层。由于 DeepSense 可以用于分类和回归任务,所以输出层要根据具体任务来设置。

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

原始论文中的架构。

**卷积层:**单个卷积子网可以用 3 层(单个卷积层 1,2,3)来表示。通过应用 2d 过滤器,网络可以学习传感器测量和局部模式之间的相互作用。接下来,通过展平&级联层,矩阵被展平成向量,该向量是接下来 3 层的输入:合并卷积层。此处还应用了一个 2d 过滤器来学习所有 K 个输入传感器之间的相互作用。对于每个卷积层,DeepSense 通过使用 ReLU 学习 64 个过滤器。在每一层应用批量标准化以减少内部协变量偏移。一个展平&级联层完成卷积层的这个阶段。

**递归层:**RNN 的强大之处在于能够近似函数,理解时间序列的重要特征。在这个架构中,RNN 扩展模型使用的是一个堆叠门控循环单元(GRU)。实施 2 层 RNN,并去除这些递归层(1,2) 之间的连接,以及递归批量归一化,以减少数据序列之间的内部协方差偏移。

**输出层:**到此阶段为止,网络在每个时间步都有一系列矢量。现在,我们应该小心处理任务:回归或分类。对于回归,要学字典。对于分类,应通过对一段时间内的要素进行平均来构成输出图层。然后,将最终特征输入 softmax 层以生成预测。

总结和我的观点

除了时间卷积网络、WaveNet 等,DeepSense 似乎非常有希望用于许多时间序列任务。当我第一次阅读这篇论文时,我认为扩展卡尔曼滤波器是一种很好的经典压缩方法,因为它处理的是同一类型的问题。这种深度学习架构可能会处理模型不确定性、噪声测量等等。

进一步阅读

姚,硕超,等。“Deepsense:面向时序移动传感数据处理的统一深度学习框架。”第 26 届国际万维网会议论文集。2017.

在 Python 中导入数据概述

原文:https://towardsdatascience.com/an-overview-of-importing-data-in-python-ac6aa46e0889?source=collection_archive---------1-----------------------

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

库特萨山的暴风雨景象

了解应该使用哪种方法

在 Python 中进行任何与数据相关的操作,比如数据清理、数据聚合、数据转换和数据可视化,先决条件是将数据加载到 Python 中。取决于数据文件的类型(如.csv.txt.tsv.html.json、Excel 电子表格、关系数据库等)。)和它们的大小,应该相应地应用不同的方法来处理这个初始操作。在这篇文章中,我将列出一些在 Python 中导入数据的常用方法。

像往常一样,所有需要的数据和笔记本都可以从 my Github 中访问。

  1. Python 内置函数( **read()** **readline()** **readlines()** )

一般来说,文本文件(.txt)是我们要处理的最常见的文件。文本文件由一系列行组成,每一行都包含一系列字符。假设我们需要在 Python 中导入下面的文本文件(sample.txt)。

Country/Region
Mainland China
Japan
Singapore
Hong Kong
Japan
Thailand
South Korea
Malaysia
Taiwan
Germany
Vietnam
France
Macau
UK
United Arab Emirates
US
Australia

要将其内容导入 Python,我们需要首先打开它。这一步就像在我们的计算机系统中双击一个文件打开它一样。然而,在 Python 中,这是通过调用open()内置函数来完成的。open()具有作为文件路径的必需参数和指示模式的可选参数(即,默认参数‘r’:打开读取;w ':打开以供写入)。通过这些设置,open()然后返回给我们一个文件对象。

有三种读取内容的方法(即read()readline()readlines())可以在这个 file 对象上单独或组合调用。

  • read(size=-1):根据size字节数从文件中读取。如果没有传递参数或者传递了None-1,则读取整个文件。

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

图 1 |读取示例()

  • readline(size=-1):如果没有参数被传递或者None-1被传递,则读取整行(图 2 上部面板)。或者如果用size传递,则从该行读取size个字符。此外,可以顺序调用多个readline()功能(图 2 下面板),其中下一个readline()功能将从上一个readline()功能的结束位置继续。注意,第三个readline()的输出附加了一个额外的换行符(\n,显示为新行)。这可以通过使用print(reader.readline(5), end=’’)来避免。

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

图 2 | readline()示例

  • readlines():这将从 file 对象中读取所有的行或剩余的行,并将它们作为一个列表返回(图 3)。

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

图 3 |示例readines()

您可能会注意到以上所有代码都有with语句。with语句提供了一种确保文件在打开后总是关闭的方法。如果没有with语句,我们需要显式地为 file 对象调用close()。例如:

file = open("sample.txt")
data = file.read()
print**(**data)
file.close()

由于很容易忘记关闭文件,我们应该始终使用with语句。这也提供了更好的语法和异常处理。

  1. Python **csv**

我们刚刚处理的sample.txt每行只有一个字段,这使得只使用内置函数(read()readline()readlines())进行处理非常方便。然而,更常见的情况是,我们将处理一个每行有多个字段的文件(又名表格数据),如图 4 所示。

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

图 4 |逗号分隔文件

正如我们看到的,每行的每个字段都用逗号分隔,表示一个字段的结束和下一个字段的开始。我们称这种类型的文件为分隔文件。这些文件通常以逗号分隔(.csv)或制表符分隔(.tsv.txt)。在极少数情况下,您可能还会遇到其他分隔符,如冒号(:)、分号(;)和字符。

尽管内置函数仍然可以处理这些文件,但它很可能会出错,尤其是在某些情况下,当每行有数百个文件时。或者,我们可以使用 Python 的 [csv](https://docs.python.org/3/library/csv.html) 来读取分隔文件。这里让我们从这个模块中学习两个常用函数。

  • csv.reader():读取给定文件中的所有行,并返回一个 reader 对象。那么每一行都可以作为字符串列表返回。

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

图 5 | csv.reader()

  • csv.DictReader():如果文件有标题(通常是标识每个数据字段的第一行),这个函数将每一行读为dict,标题为keys(图 6,上图)。然后我们可以通过调用它的字段名来访问每一列的数据(图 6,下面的面板)

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

图 6 | csv。字典阅读器()

3.使用熊猫导入数据

在 Python 中导入数据的另一个非常流行的选项是必须去 Pandas ,尤其是当数据量很大时(比如几百 MB)。我们不会深究pandas如何工作或如何使用的细节。有很多优秀的教程和书籍(如用于数据分析的Python,作者 Wes McKinney ,熊猫的创造者)。这里我只是展示一下pandas在读取csvexcel文件时的一些威力。

  • pd.read_csv():将一个csv文件读入DataFrame对象。这里重要的一点是,pandas 足够智能,可以自动判断每个字段的标题行和数据类型,这使得下游分析更加高效。

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

图 7 | PD . read _ CSV()的示例

  • pd.read_excel():将 excel 文件(.xls.xlsx.xlsm.xlsb.odf文件扩展名)读入熊猫DataFrame。默认情况下,它只导入 excel 文件内的第一张数据表(sample.xlsx有多张),如图 8 所示。

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

图 8 | PD . read _ excel()的示例

为了能够访问 excel 文件中的特定工作表,我们可以首先使用pd.ExcelFile()导入整个 excel 文件,然后在调用pd.read_excel()时指定工作表名称(图 8)。

此外,为了更方便地访问所有工作表,我们可以将所有工作表作为dataframe对象存储在dict 中,而不是多次调用pd.read_excel()(图 9)。在这篇帖子中也可以找到一个实际的例子。

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

图 9 | PD 示例。ExcelFile()

4。导入大尺寸数据的选项

在大数据时代,有时,我们需要从客户或同事那里导入文件,这些文件可能太大(千兆字节或兆兆字节)而无法加载到内存中。那么,我们应该如何解决这个瓶颈呢?

幸运的是,Pandas 提供了chunksize选项来解决这个问题。本质上,我们不是一次性导入整个文件,而是导入部分内容。

此外,我发现了一个非常有用的帖子,作者是米哈伊尔·扬切夫,他提供了多种方法,并比较了他们在处理这种情况时的效率。在这里,我只是列出了他的帖子中提到的那些方法,如果这是你正在寻找的,你可以阅读他的帖子。

  • dask.dataframe() :大型并行数据帧,由许多较小的熊猫数据帧组成,沿索引拆分。一个好的方面是,大多数与熊猫一起使用的功能也可以与 dask 一起使用。
  • datatable :一个 Python 包,用于操作大型二维表格数据结构(又名数据帧,高达 100GB)。

好了,现在我们知道了用 Python 导入数据的基础。当然,在 Python 中导入数据还有许多其他情况,我无法在此一一列举,比如使用 BeautifulSoup 解析html和使用pd.read_sql_query()读取 sql 表。我希望这篇文章能让你从基础开始,探索更多的可能性。

以下是您可能感兴趣的链接:

和往常一样,我欢迎反馈、建设性的批评以及听到关于您的数据科学项目的信息。你可以在 Linkedin 和我的网站上找到我。

SemEval-2017 任务 3 概述:社区问答

原文:https://towardsdatascience.com/an-overview-of-semeval-2017-task-3-community-question-answering-8cfe69133e5a?source=collection_archive---------62-----------------------

SemEval-2017 的任务 3 由五个问答子任务组成,使用数万个问题和评论的数据集

SemEval 是评估 NLP 模型的主要方法之一,由几个不同的任务组成。今天我们将讨论 2017 版本的任务 3 ,包括它的数据是如何收集的,以及它呈现的五个独特的问答子任务。

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

SemEval-2017 任务 3 数据集概述。今年的任务包括该任务往年版本的数据,这些数据显示在第二列和第三列中。以前的数据用作训练数据,新收集的数据用作测试数据(第四列)。图片鸣谢纳科夫等人,SemEval-2017 Task 3 论文的原作者。

数据。由于 SemEval 是一个相当大的竞赛,它的数据来源收集得很好,并且有完整的注释。总而言之,数据是以三种方式收集和注释的——评论与它应该回答的问题的相关程度,提议的“相关问题”与原始问题的相关程度,以及提议的“相关问题”的评论对原始问题的回答程度。

  1. 首先,数据是从卡塔尔生活论坛收集的,这是一个基于社区的论坛,以线程组织,其中一个问题开始一个线程,对该问题的评论将继续该线程。
  2. 对于每个问题,该主题的注释被标注为“好”、“潜在有用”或“坏”。
  3. 接下来,每个问题都与谷歌搜索交叉引用(过滤,只包括也来自卡塔尔生活的结果),以找到相关的问题。这些相关的问题然后根据它们与原始问题的关系被标注为“完全匹配”、“相关”或“不相关”。
  4. 最后,相关问题线索中的评论根据其回答原始问题的能力被标注为“好”、“潜在有用”或“坏”。

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

从卡塔尔生活论坛(q)收集的问题示例、对问题©的评论以及来自卡塔尔生活论坛(q’)的相关问题。图片鸣谢纳科夫等人,SemEval-2017 Task 3 论文的原作者。

子任务。收集的数据允许任务 3 呈现五个主要的子任务。

  • 子任务#1:问题-评论相似度。在第一个子任务中,模型被要求确定一个评论实际上如何回答它应该解决的问题。具体来说,给定一个问题,目标是根据问题线索中的前十条评论与所提问题的相关性对它们进行排序。为了检查模型预测的准确性,指南简单地要求模型将所有“好”的评论放在“潜在有用”和“坏”的评论之上。“潜在有用的”评论不必排在“坏的”评论之上,因为它们在评估期间都被认为是“坏的”。
  • **子任务 2:问题与问题的相似性。**在第二个子任务中,要求模型确定原始问题与提议的“相关问题”的关联程度这里的目标是根据与原始问题的相似性对论坛中的前十个相关问题进行排名(如 Google 所示)。为了实现这一点,模型只需将“完全匹配”和“相关”问题排在“不相关”问题之上,因为评估过程不区分“完全匹配”和“相关”问题。
  • **子任务#3:问题-外部评论相似性。**在第三个子任务中,模型被要求确定来自相关问题线索的评论能够在多大程度上回答原始问题。这里的具体目标是,给定一个原始问题,根据其与原始问题的相关性,对前十个相关问题中的前十个评论(总共 100 个评论)进行排序。同样,该模型只需将“好的”评论排在“潜在有用的”和“坏的”评论之上。此外,只考虑这 100 个评论中的前 10 个结果,这里的理由是现实世界的用户并不真正关心后面的位置会发生什么。就像你从来没有点击过谷歌的第二页一样!
  • 子任务#4:对新问题的答案重新排序。在这里,模型被要求根据它们对原始问题的回答程度来排列相关问题的正确答案。具体来说,给定原始问题,为模型提供前 30 个相关问题中的每一个问题的单一正确答案(总共 30 个正确答案),并要求模型根据它们对原始问题的回答程度对这些问题进行排序。同样,只考虑前 10 个结果。
  • 子任务#5:重复问题检测。这是 SemEval 的 Task 3 的 2017 版本中引入的一个新的子任务,它实际上与子任务 b 非常相似,注意,这个子任务使用的是从 StackExchange 子论坛而不是卡塔尔生活论坛收集的数据。不过,请放心,这些数据仍然是以与其他子任务相同的格式收集的。因此,在这个任务中,给定一个原始问题,一个模型应该从 50 个建议的候选问题列表中删除项目,以便只保留重复的问题。为了清楚起见,下面是作者提供的一个原始问题和一个重复问题的例子:为什么面包公司要在面包里加糖?糖在烘焙普通面包中的作用是什么?

希望你在 SemEval-2017 中学到了很多关于任务 3 的基础知识。对于问答任务来说,这是一个很好的数据集,所以如果你正在寻找这方面的一些评估,我肯定会建议查看原始论文[链接这里。SemEval 中的一些其他任务更受欢迎,但我肯定地说,任务 3 是问答系统中最好的任务,因为它提出了五个基本的子任务,在任何现实世界的问答系统中都非常有用。

此外,我建议总体上检查一下 SemEval。对于分析模型如何评估语言中的语义,这是一个很大的竞争,并且在未来也可能继续是一个顶级的竞争。

Anaconda 发行版概述

原文:https://towardsdatascience.com/an-overview-of-the-anaconda-distribution-9479ff1859e6?source=collection_archive---------31-----------------------

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

将改变这种方式的科学 Python 发行版…由大卫·克洛德Unsplash 上拍摄

科学 Python 发行版将改变你研究数据科学的方式。

Anaconda 是科学 Python 包、工具、资源和 ide 的惊人集合。这个包包括许多重要的工具,数据科学家可以使用这些工具来驾驭 Python 的强大力量。Anaconda 个人版是免费和开源的。这使得使用 Anaconda 变得容易和容易。只需到网站上下载发行版。

[## Anaconda |世界上最受欢迎的数据科学平台

数据科学的现代世界是极其动态的。每天都有新的挑战出现,不可思议的挑战也是如此…

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

拥有超过 2000 万用户,覆盖 235 个地区,超过 24 亿次包下载;Anaconda 已经成长为一个异常庞大的社区。Anaconda 使得连接几个不同的科学、机器学习和数据科学包变得很容易。

关键特性:

  • 神经网络
  • 机器学习
  • 预测分析
  • 数据可视化
  • 偏差缓解

如果您对数据科学感兴趣,那么您应该了解这个 Python 发行版。Anaconda 非常适合深度模型和神经网络。您可以构建模型,部署它们,并与该领域的领先技术集成。Anaconda 针对机器学习任务进行了优化,可以高效运行,并且在开发优秀的算法时可以节省您的时间。发行版中包含 250 多个软件包。可以用conda install通过 Anaconda 终端安装其他第三方包。他们基于云的存储库中有超过 7500 个数据科学和机器学习包,您需要的几乎任何包都可以轻松访问。Anaconda 提供个人版、团队版和企业版。还包括对 R 编程语言的支持。

Anaconda 发行版附带了可以在 Windows、Linux 和 MacOS 上使用的包。个人版包括流行的包名,如numpypandasscipysklearntensorflowpytorchmatplotlib等等。Anaconda 提示符和 PowerShell 使得在文件系统中工作变得容易和易于管理。此外,Anaconda Navigator 上的 GUI 界面使得一切工作异常流畅。如果您正在寻找一个蓬勃发展的数据科学家社区和业内不断增长的支持,Anaconda 是一个很好的选择。在这样的伟大工具的帮助下,开展数据科学项目变得越来越简单。

包括在 Anaconda Navigator 中

Anaconda 提示符和 Powershell

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

作者图片

Jupyter 笔记本电脑和 Jupyter 实验室

[## Jupyter 项目

Jupyter 笔记本是一个基于网络的交互式计算平台。该笔记本结合了现场代码,方程式…

jupyter.org](https://jupyter.org/)

允许数据科学家管理工作流并有效实现科学和计算解决方案的开源软件。Jupyter 笔记本强调演示和可读性,是合作项目和有见地的出版物的明智选择。Jupyter 笔记本是开源的,由 Jupyter 社区在 GitHub 上公开开发。

皮查姆

[## py charm:JetBrains 为专业开发人员提供的 Python IDE

在 PyCharm 处理日常事务时节省时间。专注于更大的事情,拥抱以键盘为中心的方法…

www.jetbrains.com](https://www.jetbrains.com/pycharm/)

一个顶级的 Python IDE,它包含了所有的特性和预安装的包。凭借舒适的环境管理和易于设置的工作站,PyCharm 在 Python 中独树一帜。无论是社区版、专业版还是企业版,都有适合每个人的版本。

Visual Studio 代码

[## Visual Studio 代码-代码编辑。重新定义的

Visual Studio Code 是一个重新定义和优化的代码编辑器,用于构建和调试现代 web 和云…

code.visualstudio.com](https://code.visualstudio.com/)

您可以为编程选择的最佳开源解决方案之一。这个文本编辑器是初学者和高级程序员的绝佳选择。Visual Studio 代码提供了 IntelliSense,一个内置的调试器,一个令人难以置信的可定制环境,以及与流行扩展的集成。

Qt 控制台

[## Jupyter 的 Qt 控制台- Jupyter Qt 控制台 4.7.7 文档

2020 年 9 月 3 日发布 4.7.7 版,启动 Qt 控制台:Qt 控制台是一个非常轻量级的应用程序…

qtconsole.readthedocs.io](https://qtconsole.readthedocs.io/en/stable/#)

一个轻量级的程序,就像一个充气的控制台。它提供了语法高亮、内嵌图形、呼叫提示、REPL 等等。

Spyder

[## Home - Spyder IDE

Spyder 是一个强大的科学环境,用 Python 编写,为 Python 服务,由科学家设计,为科学家服务…

www.spyder-ide.org](https://www.spyder-ide.org/)

高度先进的数据科学 Python 平台。这个 IDE 是用 Python 为 Python 创建的,拥有一些非常健壮的工具集。凭借编辑器、IPython 控制台、变量资源管理器、高级绘图功能、内置调试器和对象文档助手工具,Spyder IDE 是大量数据科学任务的理想选择。

Glueviz

[## 粘合:多维关联数据探索

Glue 是一个开源的 Python 库,用于探索相关数据集内部和之间的关系。使用 Glue,用户可以…

glueviz.org](https://glueviz.org/)

使用 Glueviz 将您的数据集和数据链接到单个图表或图形。这个 Python 库允许您通过组合数据集并使用其中的逻辑链接来查看数据可视化。

橙色 3

[## 数据挖掘

通过巧妙的数据可视化执行简单的数据分析。探索统计分布、箱线图和散点图…

橘子生物实验室](https://orange.biolab.si/)

如果数据挖掘是你的目标,那么 Orange 3 已经覆盖了你。Orange 3 是为数据挖掘而构建的工具集。它们提供了优秀的 GUI、可扩展的附加功能、数据管理和交互式数据可视化。此外,因其引人入胜的可视化效果、数字和图表而受到教师和学生群体的喜爱。

r 工作室

[## RStudio |面向数据科学团队的开源专业软件

控制您的 R 和 Python 代码一个 R 和 Python 的集成开发环境,带有一个控制台…

rstudio.com](https://rstudio.com/)

使用 R 编程语言的推荐环境。R Studio 有两个版本,R Studio 桌面版和 R Studio 服务器版。智能语法解决方案、编辑器中的 R 执行、助手工具、目录管理、集成的 R 文档和帮助、内置调试器以及包工具只是 R Studio Desktop 提供的部分功能。R Studio Desktop 和 R Studio Server 有开源版和专业版。

结论

如果您是数据科学的新手,想要获得 Python 的完整体验,或者如果您是一位经验丰富的数据科学家,正在寻找更多的功能和效率,我真的建议您看看这个惊人的发行版。它使包的管理和部署变得快速而简单。Anaconda 打包了工具、ide、包和库,对于数据科学来说是一个真正可信的决策。因为 Anaconda 的受欢迎程度似乎在许多新的行业和领域中不断扩大,而这些行业和领域又刚刚开始使用这种高级功能,所以现在开始使用这个不断增长的工具和资源包是再好不过了。我希望这篇文章有助于详细介绍 Anaconda 发行版,帮助那些想了解它带来了什么和包含了什么的人。感谢您的阅读和快乐编码!

2020 年全球聊天机器人解决方案市场概述

原文:https://towardsdatascience.com/an-overview-of-the-global-market-for-chatbot-solutions-in-2020-820aa9366efc?source=collection_archive---------32-----------------------

根据我对会话助手市场的积极观察,我给你一些统计数据和我研究的近 550 个解决方案的信息。最后,我会告诉你我对未来的看法。

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

来源:作者照片

这一事件似乎仍能感受到那些如此关注它的人心中的一切,它是否引人注目。在 2018 年 5 月 8 日的谷歌年度大会上,该公司将展示其新一代助手:Google Duplex。这是一个比生活更真实的助手。有一次,人类没有打电话给机器人,而是由助手打电话给人类(理发师)代替人来预约。生成的声音如此接近人类的音色及其变化,以至于几乎无法判断这是一个真正的自动化还是一个专门制作的设置,以模拟这样一个助手可能是什么样的[1]。整个对话和日常对话一样,非常标准,有停顿和语调。回想起来,这次演示的目的是为一个项目制造轰动,而不是展示一个已经可用的产品。但它确实暗示了支持解决方案的潜在未来。无论如何,它表明了谷歌想要走的路。

很难知道未来几年对话助手的市场会增长多少。分析师给出的值有时从简单到双精度不等。通过对分析师公布的数据取平均值,我们可以预见到 2024 年市场价值约为 110.5 亿美元,2027 年约为 445.8 亿美元,即 CAGR ( 复合年增长率)为 26%。所有的分析师都同意指数增长,在某个时间点肯定会趋于平稳。

按公司成立年份细分的解决方案

解决方案占公司创建年份的比例。值得注意的是,创建年份(在下图的横坐标上)并不总是与解决方案的可用年份相对应。许多公司在创建自己的对话解决方案之前,通常已经在相关领域存在过。这使得很难(除非你花大量时间搜索该公司何时交流其解决方案)确切知道该解决方案是何时创建的。

然而,让我们回到几年前,充分了解我们是从哪里开始的。人们普遍认为,帮助你创建自己的对话助手的最古老的解决方案(也称为"聊天机器人","聊天机器人"的缩写)被称为 A.L.I.C.E .这个缩写代表人工语言互联网计算机实体。它是由 William Wallace 在 1995 年开发的一个应用程序,用来模拟人和机器之间的对话。它允许执行符号规则,包括测试用户句子中关键词的存在。这种操作模式使用起来非常简单,并且足以涵盖许多使用案例。另一方面,一旦对话变得更加复杂,词汇量变得非常大,它就会很快发现自己的极限。

对话助手的原理在 2011 年 10 月 4 日的发布会上真正向公众普及了,这款新的 iPhone 4S 集成了一款名为 Siri 的革命性应用。重要的是要看到许多消费者创新已经被公司采用,因为员工在他们的个人生活中经常使用这种类型的解决方案,并期望公司提供相同的服务(参见企业社交网络、即时消息、强大的搜索引擎等)。)因此,助理有一天也会出现在公司里是很自然的事情。

为了理解 Siri 的起源,我们必须追溯到 8 年前,即 2003 年 5 月,当时 DARPA 启动了名为 CALO 的项目。在 2006 年 SRI 的 Calo 网站上写着[3]:

国防高级研究计划局(DARPA)在其感知学习助手(PAL)计划下,授予 SRI 一份为期五年的合同的前两个阶段,以开发一种持久的个性化认知助手。DARPA 希望 PAL 计划能够产生创新的想法,从而产生新的科学、解决当前问题的新的基本方法、新的算法和工具,并产生对军事具有重要价值的新技术。

该团队将其新项目命名为 CALO,意为学习和组织的认知助手。

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

CALO:学习和组织的认知助手

这个名字的灵感来自拉丁语“calonis”,意思是“士兵的仆人”。该项目的目标是创建认知软件系统,即可以推理、从经验中学习、被告知做什么、解释他们做什么、反思他们的经验并对惊喜做出强烈反应的系统。

该软件通过与用户互动并听取用户建议来学习,将处理广泛的相互依赖的决策任务,这些任务在过去一直抵制自动化。CALO 将有能力从事和指导日常工作,并在意外发生时提供帮助。为了专注于现实世界问题的研究,并确保软件满足隐私、安全和信任等要求,CALO 的研究人员在开发过程中也在使用这项技术。

该项目汇集了来自 25 个最好的学术和商业研究机构的 300 多名研究人员。因此,Siri 最初是由 SRI International 通过 DARPA 项目开发的。然而,SRI 在 2007 年从 Siri,Inc .分离出来,现在独立的公司在 2010 年 2 月推出了个人助理应用。

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

2010 年www.siri.com主页(互联网档案馆)

然而,这个应用程序将没有时间过它的生活,因为 Siri 公司在那一年被苹果公司收购,成为所有 iPhone 用户的个人助理。苹果向媒体发布声明的第二天,该公司的网页就消失了。尽管 Siri 不适合专业用途,但在这款著名智能手机的销售推动下,它仍将是这项技术大规模部署的起点。

那么解决方案和“聊天机器人”有什么区别呢?事实上,设计解决方案的编码团队之外的人可以配置聊天机器人,让它说出自己的意图。正如理查德·华莱士在他的 A.L.I. C.E .网页上写的“不要读我”[4]。

机器人大师是你,你的聊天机器人的主人。

很难找到第一个真正的商业解决方案,但 Pandorabots 解决方案肯定是第一个。这是理查德·华莱士与 Franz,Inc .合作的结果。Pandorabots [5]创建于 2002 年,到 2020 年,该公司仍然活跃着,迄今为止拥有超过 350,000 个机器人(在网站主页上显示)。

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

2002 年 10 月的潘多拉机器人主页(互联网档案)

历史将会记住,托管是免费的,商店菜单(出现在 2005 年 11 月)只允许购买潘多拉机器人的 t 恤,不允许购买机器人![6].

2015 年,IBM 的 Watson Dialog(几乎是偷偷地)发布,大规模地引入了人工智能的学习能力,以服务于语言处理,从而改善识别用户请求的机制,并由一个国际玩家进行。

根据公司创建年份显示解决方案分布的图表突出显示了 2013 年至 2018 年期间解决方案的爆炸式增长,其中 2/3 的解决方案是在这一年创建的。2015 年至 2017 年特别值得注意,因为这三年见证了全球一半的解决方案。发布对话式解决方案的公司中,有 20%是在 2016 年创建的,这是一个真正的创新关键年。这个日期前后各有一次。

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

根据编辑器的创建年份,解决方案在世界上的分布

即使公司继续被创建,速度也大幅放缓,2019 年仅创建了 9 个解决方案,2020 年可能也是这种趋势。

按国家细分

这些解决方案按照公司总部的位置进行分类。正如您所料,美国是托管最多解决方案的国家,共发现了 219 个聊天机器人解决方案。令人惊讶的是,尽管这是一个相当小的市场,但法国以 77 个解决方案位居第二。然后我们发现印度有 40 个解决方案。然后是英国的 28 人和加拿大的 20 人。德国、西班牙、以色列和新加坡各有 10 至 20 个解决方案。根据我的列表,其余每个国家的解决方案都在 10 个以下。我认为每个出版商只有一个解决方案,即使这个出版商发布了几个不同的解决方案。

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

按解决方案数量递减排列的前 20 个国家

总共有 48 个国家至少有一个解决方案。各大洲都有代表。

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

解决方案的数量取决于国家

编辑类型学

对编辑器类型的分析允许根据以下主要类别对其进行分类:

  1. 纯玩家
  2. 自然语言处理解决方案提供商
  3. ERP 和/或 CRM 解决方案发布者
  4. 呼叫中心、联络中心和/或 Livechat 解决方案发布者
  5. 云服务解决方案提供商
  6. 数字服务公司(DSC)和其他 IT 公司
  7. 其余的

纯粹的玩家是那些将几乎所有收入建立在出售机器人解决方案和相关服务上的发行商。这些解决方案大多是多租户的,托管在云中。

自然语言处理(NLP)解决方案的发行商通常在他们的市场上建立,他们在聊天机器人需求的爆炸中看到了机会,并基于自己的算法创建了解决方案。

企业资源规划(ERP)或客户关系管理(CRM)解决方案将受益于托管对话解决方案,尤其是如果该解决方案由到软件包模块的连接器和特权链接来补充的话。这些编辑通常不具备对话技巧,通常会进行并购。

对于用于管理用户、客户、供应商与公司之间的交流的解决方案,通过对话解决方案实现自动化成为一项强制性功能。在 Livechat 解决方案中,其中一个代理变成虚拟的,能够处理部分请求,从而自主响应。

已经迁移到云的企业软件发行商或纯云发行商,如亚马逊 WS、百度云、谷歌云平台、IBM Cloud、微软 Azure、SalesForce.com 等。最为人所知的是,提供一套服务,并且必须在他们的“工具包”中包含对话式解决方案。

数字和技术服务公司(咨询和 IT 公司),信息技术专家,必须掌握这些技术,因为他们的客户要求他们。许多公司整合了现有的解决方案,有些公司孤注一掷,创建了自己的解决方案。

最后,通常提供源代码的个人(通常以开源模式)创建解决方案。也有公司开发了自己的解决方案,并提供给最大数量的用户。也有人工智能和语言处理的研究人员分享他们的发现,甚至他们的论文成果。

公司规模

毫不奇怪,僵尸工具解决方案提供商的员工人数不到 50 人(73%)。

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

解决方案数量与公司员工数量之比

2017 年创建的公司中有 1/3 的员工不到 10 人,仍然是非常小的公司。2016 年创建的公司中有 1/3 的员工人数在 11 至 50 人之间,并且通常在其市场上提供成熟和公认的解决方案。发布多种解决方案或已经拥有软件基础(例如联络中心)的公司通常拥有超过 50 名员工的能力。

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

根据创建年份和公司员工人数确定的解决方案数量

如果我们拿公司规模的原始数据来看,我们会发现,按比例来说,法国是“小”公司最多的前 10 个国家,几乎一半的公司不超过 10 名员工。意大利和英国紧随其后。应该指出的是,对于法国来说,2017 年的新公司数量将超过 2016 年,而某些国家则相反,这可以解释为什么与拥有超过 10 名员工的公司的国家相比,法国的新公司数量会延迟一年。

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

根据公司规模(1 至 100 名员工)按国家列出的解决方案百分比

解决类别

每个解决方案都不同。它提供特定于它的服务、接口和设施。然而,当研究大量的这些解决方案时,有可能确定几类解决方案。要么是编辑器表达清楚,要么是所有的功能都对应一个可识别的类别。

以下是这些类别:

  • 一般用途;30%的市场解决方案。我从最具代表性但也是最普遍的类别开始。此类别中的解决方案允许您配置所有类型的向导,而无需特殊功能。他们识别问题(用户的意图),并从主题专家配置的答案中给出最合适的答案。该解决方案通常被描述为能够管理多个类别。当解决方案过于笼统时,它往往过于笼统,无法从竞争对手中脱颖而出。
  • 零售和电子商务(营销);26%.这当然是最具代表性的专业类别。它涵盖了支持销售网站的商业领域。它用于留住客户,帮助他选择产品,回答有关产品可用性的问题。当用户在页面上仍被阻止时,聊天窗口会打开。该解决方案提供了诸如转盘、产品表等工具,并且可以在回答之前添加延迟,以便显得更人性化、更友好。它有大量关于用户的统计数据,比如他来自哪里,是否是第一次访问,他的浏览器的名称和版本。许多解决方案都有一种用于未解决请求的邮箱。机器人会想尽一切办法获取用户的电子邮件地址,让他订阅时事通讯。助理变成了销售顾问,从这个意义上说,解决方案尽一切努力来促进机器人的配置。该解决方案具有与电子商务软件、联系人管理软件等的各种连接器。能够更好地了解客户,并尽可能以最有针对性的方式做出回应。通常,它也有一个广泛的社交网络连接列表。
  • 客户支持、销售、服务台;17%.这些解决方案是专门针对用户问题而设计的。他们可以处理大量的问题,并有链接到文档。它们有助于创建复杂的对话,其目的是帮助用户找到答案。这些解决方案基于知识原理,指导用户解锁。他们还通过允许用户上传文档、从信息系统中检索信息来参与流程的自动化。
  • SDK(软件开发工具包);5%.这个解决方案是一个工具箱,允许开发人员构建他们的对话解决方案。它提供了一整套功能(库),允许管理对请求的理解、功能的执行和对话上下文的管理……实现一个机器人需要有编程技能。大多数时候,这些解决方案都是开源的。有时候发行商提供一个云执行环境,然后付费。
  • 银行、金融服务和保险(BFSI);4%.这些解决方案针对银行和保险市场,提供了特定于这些领域的功能:银行管理、偿付能力分析、报价、推荐/建议、将潜在客户发送给代理、索赔管理等。
  • 个人助理;4%.可能是最“大众化”的解决方案,因为它们允许你创建助手来帮助你的日常生活。
  • 医疗保健;2%.很少有医疗保健解决方案是可配置的。它们中的大多数都已经配置好了,不允许您更改它们的设置。
  • 旅行和接待(旅游);2%.这些解决方案专注于旅游活动,并允许配置机器人,这些机器人可以帮助用户计划他们的假期,指示要参观的旅游景点,可用的酒店等。
  • 招聘;2%.这些解决方案支持为招聘新员工的流程创建助手。他们可以回答关于公司的问题,参加能力测试,收集简历,作为招聘的联系人等等。
  • 设备助手;1%.这些解决方案设计用于嵌入电子设备,如烤箱、冰箱、电视等。它们通常基于语音,并嵌入了请求识别所需的人工智能。
  • 汽车;1%.这些解决方案旨在嵌入到汽车中,并在旅途中帮助司机。即使汽车是一个相当“大”的设备,这个类别也是设备助理类别的一个专门化。
  • 对话过程自动化;1%.该解决方案将机器人的功能与 BPM(业务流程管理)软件或 RPA(机器人流程自动化)中常见的流程自动化功能相结合。
  • 对话式搜索;1%.它的目标是允许您创建向导,帮助您在内容管理器中找到正确的文档和段落。
  • 项目管理;1%.此解决方案允许您创建项目助手。他们支持项目经理的日常管理活动。用这些解决方案创建的机器人成为一种 PMO(项目管理办公室)助手。
  • 其他;5%.这最后一类不是一个。它用于将出现率低于 1%的所有类别组合在一起。这些解决方案使响应管理请求成为可能,它们以图形方式显示数据库中的数据,用户在数据库中用自然语言表达他或她的请求,帮助接待新员工(入职),专门从事房地产,管理支持票据,专门从事农业,专门从事内容管理及其恢复。

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

按类别细分解决方案

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

美利坚合众国的类别细分

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

法国的分类细目

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

印度的分类细目

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

英国的类别细分

收购和死亡

正如在任何活跃和不断增长的市场中一样,我们正在目睹公司的动向。当进行收购时,该解决方案要么集成到更大的产品中,要么作为更大公司支持的产品保留,并可以保留他们的名称。一些解决方案因为未知的原因而夭折。

在购买现有技能和功能的情况下,解决方案完全消失,并被集成到一个不再允许创建聊天机器人的产品中(例如 Sonos 在 2019 年购买的 Snips)。

有时,一个软件套件集成了一个聊天机器人解决方案,将那些特定的功能添加到托管它的平台中。一个例子是 2016 年被谷歌收购的 Speaktoit 的 API . ai[8],它成为了谷歌 DialogFlow,从而加入了谷歌云平台的功能。另一方面,法国公司 Recast.ai 于 2018 年被 SAP 收购,以便德国出版商可以在其 ERP 开发平台中添加向导解决方案[9]。

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

每年收购的解决方案数量

一家公司的死亡并不总是令人愉快的,尤其是对那些生活在其中的人来说,但它们是市场和适应法则的一部分。虽然很难确定解决方案的确切死亡日期(公司一般不再能够或不愿意沟通),但网站的消失往往预示着公司生命的终结。

在 31 个已确定的已故解决方案中,50%是美国的。2/3 的缺失解决方案不到 5 年。

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

根据公司创建年份(不包括收购和放弃)的废弃解决方案数量

注意:这些统计数据中不包括消失的并购解决方案。不再维护的开源解决方案也不计算在内。

为了好玩……

完成这些统计数据时,不可能不带一丝轻松。有趣的是,有一半的答案是以下列字母之一开头的:C A S B M I。

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

解答第一个字母后的解答数

6%的解决方案以“Bot”开头,3%以“Chat”开头。一种解决方案是用一个字母命名。

解决方案的前景如何?

以下是我对会话辅助解决方案未来的预测:

  • 除非有技术突破,否则每年创造的新方案不会超过几十个。
  • 新的通用解决方案将无法在数百种现有解决方案中生存。这些解决方案必须做出选择,成为特定领域的专家。
  • 过于一般化的解决方案只能通过降低价格来应对,因此,为了生存,必须提高产量,只有在已经建立了基础的情况下,才能实现这种产量。
  • 一些解决方案做出的设计选择将在未来对他们不利。他们将不得不进行深刻的变革,否则将不得不失败。
  • 解决方案必须达到 4 级复杂性,从而允许对话方在同一个接口中重用几个不同的业务域。为了找出这意味着什么,我邀请你阅读我关于对话复杂性的文章
  • 这些解决方案目前使用的语言处理技术已经成熟,并允许通过合理数量的示例获得良好的识别率(意图检测和实体提取)。这些解决方案是成熟和稳健的,如今可以应对服务质量和稳健性的挑战。他们将不得不致力于分析,以帮助那些在改进工作中维护解决方案的人。
  • 由于人工智能技术的进步,我们将看到模块或新解决方案的出现,它们将能够在不需要“手动”创建对话的情况下进行对话。
  • 在未来的几年里,我们应该会看到企业合并、收购和企业死亡。市场肯定在增长,但不是所有的解决方案都能存活下来。收购应该允许还没有助手解决方案的出版商将对话解决方案集成到他们自己的解决方案中。
  • 解决方案将不得不越来越多地管理其对话者的环境,以便提供越来越个性化的服务。

结论

创建按需会话助手的解决方案在短短几年内已经逐渐从阴影走向光明。随着大多数解决方案具有相同的基本功能,并试图通过相关功能脱颖而出,市场正在走向成熟。美国是出版商最多的国家,其次是法国和印度。这些公司大多不到 50 人,尤其是当他们只提供这种类型的解决方案时。电子商务领域是可以取代销售顾问并帮助用户选择的解决方案覆盖最多的领域。从市场上消失的解决方案中有 2/3 不到 5 年。

棘手的问题:“最好的解决方案是什么?”没有哪一个比所有其他的更好,但是有几个适合每个用例。为了能够在所有这些解决方案中进行选择,必须制定一个标准列表来快速筛选出十几个解决方案(例如,本地化、语言等)。).然后,必须应用第二个标准列表来得出 2-3 个解决方案。然后你需要测试它们,这样你就可以检查它们的整体性能,判断配置接口的质量。

参考文献

1]什么是 Google Duplex?有史以来最聪明的聊天机器人,解释-文章数字趋势https://www.digitaltrends.com/home/what-is-google-duplex/

2] A.L.I.C.E —维基百科—https://en . Wikipedia . org/wiki/Artificial _ language _ Internet _ Computer _ Entity

3]http://www.ai.sri.com/project/CALO CALO SIRI 项目—地点—

[4]不要读我——a . l . I . c . e .和 AIML【https://www.mediensprache.net/archiv/pubs/2760.html 文档

⑸Pandora bots 2002 年 10 月—互联网存档-https://web . Archive . org/web/20021001074218/http://www . Pandora bots . com:80/Pandora

6]2005 年 11 月 Pandorabots 店铺菜单https://web . archive . org/web/20051127022134/http://www . Pandora bots . com:80/bot master/en/store . html

7] Sonos 收购专注隐私的语音助手 Snips—https://www . the verge . com/2019/11/21/20975607/Sonos-buys-Snips-ai-voice-assistant-privacy

[8] 谷歌收购 API . ai—TechCrunch-www . TechCrunch . com/2016/09/19/Google-acquisites-API-ai-a-company-helping-developers-build-bots-that-parent-dark-to-talk/

[9] SAP 加大在法国推动创新的承诺—https://news . SAP . com/2018/01/SAP-powers-Innovation-France-acquires-reca stai/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值