TowardsDataScience-博客中文翻译-2020-一百二十九-

龙哥盟 / 2024-10-19 / 原文

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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

什么是机器学习?—直观的解释。

原文:https://towardsdatascience.com/what-is-machine-learning-a-visual-explanation-14642b90429f?source=collection_archive---------25-----------------------

最佳 ML 视觉效果

解释机器学习的 9 个精选图像、交互式工具和流程图。

来源:作者

要想很好地掌握机器学习,光有文字是不够的。这篇文章用我在过去 5 年中遇到的最好的视觉解释向你介绍了机器学习。

1.机器学习在数据中寻找模式

简单地说,机器学习在数据中找到模式,并使用它们进行预测。

每当你有大量的数据,并且想要自动进行智能预测时,机器学习可能是使用的正确工具。

机器学习的示例应用:将数据转化为预测。来源:作者

2.AI vs .机器学习 vs .深度学习

让我们先解决这个问题。AI、机器学习、深度学习有什么区别?英伟达的这张图表解释道:

  • 人工智能是一门创立于 20 世纪 50 年代初的学术学科。
  • 机器学习是通过经验学习的算法研究。自 20 世纪 80 年代以来,它一直在获得动力,是人工智能的一个子领域。
  • 深度学习是使用神经网络的机器学习的一个较新的子领域。它在某些领域非常成功(图像、视频、文本和音频处理)。

来源:英伟达

那么你应该用什么术语呢?

  • 简答:没那么重要。
  • 更长的回答:该领域从业者使用最多的术语是“机器学习”——它比 AI 更具体。

“如果是用 Python 写的,那就是机器学习;如果是用 PowerPoint 写的,那就是 AI。”😅

3.ML 和“普通”软件的区别

机器学习算法也只是软件。那有什么区别呢?

3.1 简短回答

用“普通”软件,我们告诉计算机做什么。通过机器学习,我们告诉计算机如何利用我们提供给它的数据自己找出答案。

来源

3.2 略长的回答

  • 普通软件基本上是一套规则,由人类编写,旨在实现特定的输出。
  • 机器学习软件自行寻找规则(模式),并尝试产生某种输出。是写软件的软件。🤯

直观解释:

传统软件与机器学习——来源:作者

4.ML 算法如何学习?

但是机器学习如何在数据中找到正确的模式来进行预测呢?

来自 R2D3 的团队设法可视化了机器学习模型如何学习。任务:“告诉我公寓是在纽约还是旧金山。”

👉他们对机器学习 的交互可视化简直是英雄主义。技术上准确,美观。

来源: R2D3

5.深度学习呢?

谷歌帮你搞定了。忘掉无聊的“网络图”检出 👉 这是一个关于神经网络如何学习的现场互动示例

一个学习在蓝色和橙色点之间绘制边界的神经网络。

您甚至可以修改:

  • 训练参数,表示算法的配置(nobs);
  • 神经元和层,定义模型可以变得多复杂;
  • 任务,这样模型就能学会分离圆形、矩形或者——最难的任务——螺旋形中的点。

对于每个模型,您可以观察它如何随着时间的推移而变得更好(测试损失)。

6.但是神经网络是如何工作的呢?

神经网络有点复杂——但是如果你真的感兴趣,那么没有比这更好的视频来解释它了👉**3 blue 1 brown——什么是神经网络** ,格兰特在这里告诉你神经网络是如何识别数字的。

3Blue1Brown 讲解神经网络!👀

7.怎么分辨是不是机器学习?

这里有一个快速简单的流程图,可以帮助你弄清楚机器学习是否在你所看到的背后:

灵感来自郝凯伦 —来源作者

8.ML 解决方案的要素是什么?

事实是,机器学习只是每个机器学习解决方案的一小部分。大部分工作和代码都进入了围绕它的基础设施:

  • 数据:为算法收集、验证、分析、准备数据;
  • **基础设施:**部署、托管和服务机器学习模型;
  • **监控:**协调工作流程,监控和维护模型。

来源:作者

9.有哪些 ML 算法?

我们有很多算法可以选择。它们大致分为以下几类:

  • 经典学习:进一步分为监督学习(通过从例子中学习来预测数字或类别)或无监督学习(在没有任何指导的情况下在数据中寻找聚类)。
  • 神经网络和深度学习:基于多层感知器原理的算法,在利用图像、文本、音频、视频和时间序列数据进行预测时非常有用。
  • 强化学习:有点像自然进化的算法,在学习周期中改善它们的行为,以获得最大回报。
  • **集成学习:**构建大量弱模型并将它们组合成强模型的算法。

来源:瓦斯特里克

摘要

这些视觉效果应该让你很好地掌握所有基本的机器学习概念。要更深入地了解如何在项目中使用机器学习,请查看我们的机器学习指南:项目经理需要知道的事情。

如果遗漏了什么重要的东西,请告诉我:markus@datarevenue.com。

原载于

什么是机器学习,机器如何学习东西?

原文:https://towardsdatascience.com/what-is-machine-learning-and-how-can-a-machine-learn-something-4f66fa05714b?source=collection_archive---------31-----------------------

机器学习的直观解释

机器如何学习东西?阿瑟尼·托古列夫在 Unsplash 上的照片

在这篇文章中,我给出了一个关于机器学习模型在实践中实际做什么的非常实用的观点。

在这篇文章结束时,你会深刻理解我们如何使用机器学习来预测未知,我会给你一个开始做这件事所需的工具的切入点。

我将集中讨论监督模型。

什么是有监督的机器学习?

在监督机器学习中,目标是使用定义在多个独立变量上的函数来预测目标变量。

监督机器学习的一个非常著名的例子是波士顿房价数据集。该数据集包含许多房屋销售数据,并为每栋房屋列出了房屋的特征和最终销售价格。该练习的目标是建立一个机器学习模型,该模型可以根据房屋的特征预测任何房屋的销售价格。

可用于此预测任务的历史房屋销售数据

理解“函数”的概念

为了得到这样一个模型,我将使用函数的概念,所以让我先解释一下什么是函数以及它们是如何工作的。这将是很好理解机器学习的重要基础。

函数是如何将输入转换成输出的定义。

作为一个简单的起点,假设函数是如何将输入转换为输出的定义。该函数就像一个黑盒操作,每次都以相同的方式工作。这就像一个烹饪食谱,其中输入数字代表配料,函数代表手工工作和烤箱指令,输出代表最终的菜肴。

一个简单的功能:

作为一个简单的起点,假设函数是如何将输入转换为输出的定义。例如,让我们定义一个对任何输入数字都为+1 的函数:

  • 我们可以把函数定义写成:
    f(x) = x + 1
  • 例如,当我们想对输入数字 3 应用这个函数时,我们有 3 作为输入,所以我们用 3 代替 x:
    f(3)= 3+1
  • 现在变得简单了:3 + 1 + 4,所以 f(3) = 4

稍微复杂一点的函数:

为了使它稍微有趣一点,让我们做一个有两个输入 x1 和 x2 的函数。我们称函数 f2(函数 2)

  • 该函数输出两个输入的和并加 1:
    f2(x1,x2) = x1 + x2 + 1
  • 然后当我们想对输入数字 35 应用这个函数时,我们有 35 作为输入,所以我们用 3 代替 x1,用 5 代替 x2:
    F2(3,5) = 3 + 5 + 1
  • 现在又变得容易了:3 + 5 + 1 = 9,所以 f(3,5) = 9

如何在房价机器学习示例中使用函数:

现在让我们回到房价的例子来理解为什么我们需要一个函数。房价练习的目标是根据输入数字预测房价。由于我们将有多个输入数和 1 个输出数,这将完全符合我们刚才看到的函数概念。

我们可以做一个函数,把房子的多个特征转换成对房价的预测!

当将这个想法应用到实际案例中时,我们可以说我们的目标是构建一个函数,以房屋的多个特征作为输入,计算房屋价格的正确值!

从功能到模型

我上面讨论的函数有非常精确的映射。3 + 1 等于 4,这是完美的。现在看起来很容易,但是在现实生活中,我们不得不面对以下两个现实 :

要找到正确的函数,我们必须反过来:

在现实生活中,我们还不知道预测函数!

在现实生活中,我们从来没有预测我们想要预测的函数。我们的任务不是将一个函数应用于某些输入数据,而是找到这个函数,它最精确地将一个已知的输入映射到一个未知的输出。方法如下:

  • 我们从 x1、x2…和目标变量(输出)的许多值开始。这是我们过去观察和收集的数据。
  • 然后,我们试图找到最精确地预测输出的函数,而不真正知道该函数是否应该由加法、减法、除法等构成。这将由机器学习模型来完成。
  • 第三步是测试我们已经确定的功能在实践中是否也有效。希望如此,否则我们需要回到第二步。

第二个问题:生活并不精确

对于我们现有的数据来说,完美的函数可能并不存在。最好的函数可能会接近正确答案,但不会这么简单。尽管在很多情况下,接近完美的预测已经非常有用了!只要我们能够测量我们函数的误差,如果它几乎是完美的,我们就会很高兴!

不幸的是,我们不只是输出完美的预测,也会有误差。

真实交易:如何找到这个“神奇”的功能?

现在我们来看监督机器学习的核心目标:找到(隐藏和未知的)函数,该函数允许我们尽可能精确地将正确的输入变量转换为正确的输出变量。

例如,当我们输入我们房子的花园面积、房间数量和建造年份时,我们希望我们的函数输出尽可能接近的房价。

这个功能不太好找!有很多机器学习工具可以解决这个问题,我现在就要进入这个领域。

“尝试”不同类型的功能

我们在实践中要做的是精心设计的“尝试”许多不同类型的“功能”。但不仅仅是随机的,我们需要一个可靠的方法来进行这些试验。

我们需要的第一个构件是机器学习模型。有许多公开可用的模型,例如“决策树”、“随机森林”、“梯度推进机器”和等等。

这些模型是一种优化机器,试图找到将输入转换为输出的最佳函数:这将是我们的预测函数。有许多可用的模型,因为每个模型都有自己特定的方法来尝试和优化预测函数的精度。

这些模型中的每一个都将使用不同类型的操作符来定义函数,但是也使用不同类型的映射(例如决策树使用 if/else 语句,而线性模型使用矩阵计算)。

监督机器学习的目标是找到最佳预测函数

测量误差和基准

在上一步中,假设我们能想到的每个模型都构建了一个略有不同的预测函数(输入数据到目标变量的映射略有不同)。

模型创建的下一步是测量每个模型的误差。每个模型都略有不同,因为我们必须接受微小的误差(生活是随机的)。但是我们仍然希望误差尽可能小!

我们将对模型开发中未包括的数据的单独部分测试所有不同的预测函数,预测最接近我们在现实中观察到的数据的模型将是我们保留的最终模型。

我们现在已经建立了一个模型:一个尽可能将输入转化为输出的预测函数!

去哪里找那些机器学习工具?

现在你对监督机器学习有了直观的了解,开始学习一些模型(函数制作工具)是很重要的。

Scikit Learn 是一个常用于机器学习的 Python 库

这里列出了最常见的型号。这会给你一个进一步学习的切入点:

  • 线性回归
  • 逻辑回归
  • 决策图表
  • 套索
  • 山脉
  • 弹性网
  • SVM
  • 随机森林
  • XGboost
  • 神经网络

两个很好的参考列表是:

  • scikit-learn 网站,上面有 scikit 所有机器学习模型的列表

caret R 包是另一个常用的机器学习库

  • R caret 网站,上面有 Caret 所有机器学习模型的列表

机器真的学到东西了吗?

有许多机器学习模型,每个模型都有自己独特的方式,根据输入和输出数据以数学方式找到预测函数。

在实践中,您应用不同的模型并测量部分外部数据的误差。然后选择效果最好的模型,也就是误差最小的模型。然后,您可以将此模型用作预测函数,将输入变量转换为目标变量。这就是你的机器学习模型!

机器已经学习了预测功能

一旦这个过程完成,我们可以说机器已经学习了这个预测函数,因此得名机器学习。

对我的解释做一些扩展:

我们可以不使用房价,而是使用图像作为输入(然后它被称为计算机视觉),甚至是人类编写的文本(然后它被称为 NLP )。在那些类型的机器学习中,人们更可能称之为人工智能。需要其他类型的模型,通常是神经网络和深度学习,而不是描述的那些。但是过程还是一样的。

我们还可以通过在收到新数据后立即更新学习到的函数来使学习更加强大,这使得预测函数随着时间的推移而改进!这使得学习过程更接近人类的学习过程!

这篇文章的目标是给出有监督机器学习的直观解释。感谢读到这里,希望对你有用!敬请关注更多内容!

机器学习与自闭症

原文:https://towardsdatascience.com/what-is-machine-learning-doing-for-autism-6e86daa3b12a?source=collection_archive---------39-----------------------

在 Unsplash 上由 Alireza Attari 拍摄

关于机器学习如何有助于自闭症诊断和治疗的简要文献综述。

机器学习已经扩展到许多不同的领域和学科。尝试新的领域是成长和学习新事物的最好方式。以下是研究人员如何应用机器学习来诊断和治疗自闭症谱系障碍(ASD)的总结。

论文(按顺序)

所有这些论文都可以在没有任何大学赞助或付款的情况下获得。

  1. 基于面孔加工异常识别自闭症谱系障碍儿童:一个机器学习框架
  2. 自闭症治疗中机器人情感感知和参与的个性化机器学习
  3. 用于低成本和非侵入性测量婴儿自闭症相关行为的计算机视觉工具
  4. 使用机器学习来缩短基于观察的自闭症筛查和诊断

眼球运动和自闭症

作者刘文擘、李明和李毅开发了一个 ML 模型,根据看脸时的眼球运动来识别 ASD。

眼球追踪,SVM,RBF Kernal,参考文献 2 DP Wall,J. Kosmicki

由蔡斯·克拉克在 Unsplash 上拍摄的照片

意识形态

患有自闭症的人在识别人脸和解释面部情绪方面有困难。此外,患有自闭症的人通常有一个非典型的面部扫描模式。作者想知道你是否能根据一个人看脸时看的地方和时间来识别自闭症。

数据

研究中的个体是 29 名自闭症儿童和 29 名非自闭症儿童。本文中使用的数据是从另一项研究中收集的,研究人员在这项研究中观察患有自闭症的儿童是否很难识别不同种族的人。

方法

研究人员使用 K-means 算法将每张脸分成 K 个不同的部分。然后,他们制作了直方图,测量个体看每个不同细胞的频率。这些信息被用来训练 SVM 来预测观众是否患有自闭症。

结果

SVM 能够以 88.51%的准确率预测观众是否患有自闭症。尽管并非不受假阳性和假阴性的影响,但该模型确实支持缺乏眼神交流是自闭症的一个强烈迹象。

机器人增强疗法

麻省理工学院媒体实验室在诊所里放置了一个机器人来帮助自闭症治疗。此外,他们为每个与之互动的孩子制作了专门的模型。

机器人,治疗,T-SNE,深度提升,开放姿势,开放面孔,开放微笑

由法兰克诉在 Unsplash 上拍摄的照片

意识形态

机器人过去曾被用于自闭症治疗,但其有效性仍有争议。每个自闭症儿童都是不同的。

“如果你遇到了一个自闭症儿童,你就遇到了一个自闭症儿童。”

因此,预测情绪的通用模型是行不通的。解决方案是为每个与机器人互动的孩子制作一个专门的模型。这样,机器人就知道什么特征构成了快乐或悲伤。

方法

研究人员让每个孩子和一名临床医生在一个房间里玩耍,同时戴上手表来记录生理数据。临床医生会记录孩子玩耍时的情绪。这些数据,以及视频和音频,被用来训练机器人的模型。

影响

以前,当机器人被部署在临床环境中时,它会模仿治疗师在故事中描述或告诉孩子的情感。现在,机器人可以对孩子的情绪做出反应,并提出建议/问题,如“你为什么难过?”或者“我们休息一下吧。”

计算机视觉辅助房间隔缺损诊断

杜克大学的研究人员设计了一种低成本、非侵入性的计算机视觉(CV)工具来帮助诊断自闭症。

AOSI,评分者间评分,追踪面部特征

Matteo Bernardis 在 Unsplash 上拍摄的照片

方法

这项研究的重点是 7-14 个月大的高危儿童(有兄弟姐妹被诊断患有自闭症的儿童)。所有的儿童都由专业临床医生使用婴儿孤独症观察量表(AOSI)进行评估。一名 AOSI 专业临床医生、一名普通心理学家和两名心理学学生观看了该评估的视频。他们都根据孩子对不同听觉刺激的反应来给孩子打分。

然后,研究人员通过使用 CV 工具来跟踪儿童在观看不同刺激时的面部运动,从而自动化了审查过程。在测量孩子的反应后,他们会给出与人类评估者相同的“通过”、“延迟”和“卡住”分数。

结果

通过只跟踪眼睛、鼻子和耳朵,自动方法在 89%的时间里与专业的 AOSI 临床医生一致,并获得了 75%的优秀评分者间评分。

影响

这项研究应该作为更多心血管辅助 ASD 诊断工具的垫脚石。最初的工作非常有限,但可以扩展到不同的临床测试甚至家庭视频。最终目标是降低房间隔缺损诊断的成本,这项工作为此做出了贡献。

ADTree 缩短基于观察的 ASD 筛查

研究人员将最广泛使用的评估自闭症谱系障碍的工具——自闭症诊断观察量表——通用(ADOS ),从 29 个项目缩短到 9 个项目,而准确性没有明显损失。

ADOS,广告树,上采样

照片由paweczerwiński在 Unsplash 上拍摄

数据

研究人员从波士顿自闭症协会(AC)、自闭症遗传资源交易所(AGRE)和西蒙斯基金会获得了 1073 个 ADOS 观察数据。在 1073 个观察结果中,只有 15 个来自没有自闭症的个体。一些观测数据缺失,因此没有使用。考虑到不平衡的类别,研究从 15 个观察值增加到 612 个。

模特们

这篇论文的重点是创建一个机器学习模型,可以帮助临床医生量化 ADOS 评估的结果。在这个过程中,他们开发了 16 个不同的模型,每个模型都有不同程度的成功。

ADTree 模型表现最好,准确率为 100%。除了对给定的每个样本进行正确分类,ADTree 还删除了许多给定的输入。广告树只需要最初 27 个项目中的 9 个就可以达到同样的准确度。

影响

这一减少将临床医生的工作量减少了 66%,从而加快了 ASD 诊断流程。随着更多 ADOS 数据的报告和记录,广告树可能能够将个体分类到光谱上的不同区域。

机器学习和自闭症的下一步是什么?

看到在自闭症早期检测以及儿童新疗法方面所做的所有研究令人兴奋。我最喜欢关于 ADTrees 缩短基于观察的 ASD 筛查的论文,并认为像树修剪这样的策略也可以导致对其他疾病更有效的调查。

我希望看到更多关于 DNA 和自闭症的研究。《自闭症之声》有一篇很棒的文章描述了在该领域已经完成的一些工作。

物体检测中的平均精度(mAP)是什么?

原文:https://towardsdatascience.com/what-is-mean-average-precision-map-in-object-detection-8f893b48afd3?source=collection_archive---------20-----------------------

注意:我们也在博客上发布了什么是地图。在本文中,我们通过解释和图表来分析平均精度指标。

计算机视觉社区已经聚集在公制地图上来比较物体探测系统的性能。在本帖中,我们将深入探究平均精度(mAP)是如何计算的,以及为什么 mAP 成为物体检测的首选指标。

如果您更喜欢以视频形式观看这些内容,我们可以满足您的需求。别忘了订阅我们的 YouTube 频道。

物体检测快速概述

在我们考虑如何计算平均精度之前,我们将首先定义它测量的任务。

对象检测模型试图识别图像中相关对象的存在,并将这些对象分类到相关类别中。例如,在医学图像中,我们可能希望能够计数血液中的红细胞(RBC)、白细胞(WBC)和血小板的数量。为了自动做到这一点,我们需要训练一个对象检测模型来识别这些对象中的每一个,并正确地对它们进行分类。(我在一台 Colab 笔记本电脑上做了这个测试,以比较 EfficientDet 和 YOLOv3 ,这两种最先进的图像检测模型。)

我的笔记本中 EfficientDet(绿色)与 YOLOv3(黄色)的输出示例

这两个模型都预测图片中包围单元的边界框。然后他们给每一个盒子分配一个类别。对于每一项任务,网络都会对其预测的可信度进行建模。您可以在这里看到,我们总共有三个类别(红细胞、白细胞和血小板)。

我们应该如何决定哪种模式更好?查看图像,看起来 EfficientDet(绿色)绘制了一些过多的红细胞框,并错过了图片边缘的一些细胞。基于事物的外观,这当然是它的感觉——但是我们能相信图像和直觉吗?如果是的话,好了多少?(提示:不是——不信直接跳到最下面。)

如果我们可以直接量化每个模型在我们的测试集中的图像上、在不同的类别上以及在不同的置信度阈值下的表现,那就太好了。输入地图!

为了理解平均精度,我们必须花一些有意义的时间来研究精度-召回曲线。

精确回忆曲线

精度是对“w 当你的模型猜对的时候,它猜对的频率有多高?”的度量回忆是一个衡量“T2”的标准,你的模型是否每次都猜到了它应该猜到的东西?“考虑一个有 10 个红细胞的图像。只找到这十个标签中的一个但正确的模型是“RBC ”,它具有完美的精确度(因为它做出的每一个猜测——一个——都是正确的),但具有不完美的回忆(在十个 RBC 细胞中只找到一个)。

包含置信度元素的模型可以通过调整进行预测所需的置信度来权衡精确度和召回率。换句话说,如果模型处于避免假阳性(当细胞是 WBC 时声明 RBC 存在)比避免假阴性更重要的情况下,它可以将其置信度阈值设置得更高,以鼓励模型仅以降低其覆盖量(回忆)为代价仅产生高精度预测。

将模型的精度和召回率绘制为模型的置信度阈值的函数的过程是精度召回率曲线。它是向下倾斜的,因为随着置信度的降低,会做出更多的预测(帮助回忆)和更不精确的预测(损害精确度)。

这样想:如果我说,“说出每一种鲨鱼的名字”,你会从显而易见的开始(高精度),但你会对你能说出的每一种鲨鱼越来越不自信(精度越来越低,越来越接近完全回忆)。对了,你知道还有牛鲨吗?

我的一个 NLP 项目中不同模型的精确度、召回率和置信度

随着模型变得越来越不自信,曲线向下倾斜。如果该模型具有向上倾斜的精度和召回曲线,则该模型可能在其置信度估计方面存在问题。

人工智能研究人员喜欢度量标准,整个精度-召回曲线可以在单个度量标准中捕获。第一个也是最常见的是 F1,它结合了精确度和召回率来寻找最佳的置信度阈值,其中精确度和召回率产生最高的 F1 值。接下来是 AUC(曲线下面积),它整合了落在精度和召回曲线下的图量。

您真实的精确召回汇总指标草图

最后一个精度-召回曲线指标是平均精度(AP ),也是我们最感兴趣的。它被计算为在每个阈值达到的精确度的加权平均值,从先前阈值开始的召回的增加被用作权重。

AUC 和 AP 都反映了精确召回曲线的整体形状。选择一个或另一个用于对象检测是一个选择的问题,研究社区已经集中在 AP 的可解释性上。

通过并集上的交集度量正确性

物体检测系统根据边界框和类别标签进行预测。

你真实的物体探测草图

实际上,在 X1、X2、Y1、Y2 坐标中预测的边界框肯定会偏离(即使稍微偏离)地面真实标注。我们知道,如果一个包围盒预测是错误的类,我们应该把它算作不正确的,但是我们应该在包围盒重叠的什么地方画线呢?

并集上的交集(IoU)提供了设置此边界的度量标准,测量方法是预测边界框与地面真实边界框重叠的量除以两个边界框的总面积。

你真实的 IoU 度量的图形描述。

为 IoU 指标选择正确的单一阈值似乎有些武断。一位研究人员可能认为 60%的重叠是合理的,而另一位则认为 75%似乎更合理。那么,为什么不在一个单一的指标中考虑所有的阈值呢?输入地图。

绘制地图精确召回曲线

为了计算 mAP,我们绘制了一系列不同难度的 IoU 阈值精确回忆曲线。

由您真实绘制的地图精确回忆曲线草图。

在我的草图中,红色代表对借据的最高要求(可能是 90%),橙色代表对借据的最宽松要求(可能是 10%)。要绘制的行数通常由挑战设置。例如,COCO challenge 设置了 10 个不同的 IoU 阈值,从 0.5 开始,以 0.05 为步长增加到 0.95。

快到了!

最后,我们为按类类型划分的数据集绘制了这些精确召回曲线。

由你的实物类绘制的地图草图

该指标计算所有 IoU 阈值中每个类别的平均精度(AP)。然后,该度量对所有类别的地图进行平均,以得出最终估计值。🤯

在实践中使用平均精度(mAP)

我最近在一篇帖子中使用了 mAP,比较了最先进的检测模型,EfficientDet 和 YOLOv3。我想看看哪个模型在识别血液中的细胞和识别棋子的任务上做得更好。

在我对测试集中的每张图片进行推理之后,我导入了一个 python 包来计算我的 Colab 笔记本中的地图。这就是结果!

细胞目标检测的效率评估:

78.59% = Platelets AP 
77.87% = RBC AP 
96.47% = WBC AP 
mAP = 84.31%

YOLOv3 对细胞目标检测的评价:

72.15% = Platelets AP 
74.41% = RBC AP 
95.54% = WBC AP 
mAP = 80.70%

**与本文开头的单一推断相反,事实证明 EfficientDet 在模拟细胞对象检测方面做得更好!**您还会注意到,该指标是按对象类别划分的。这告诉我们,白细胞比血小板和红细胞更容易检测,这是有道理的,因为它们比其他细胞更大,更独特。

地图也经常被分成小、中和大对象,这有助于识别模型(和/或数据集)可能出错的地方。

结论

现在你知道如何计算地图,更重要的是,它意味着什么!

为了改善你的模型的地图,看看开始使用一些数据增强技术。

感谢您的阅读,并希望您的平均精确度不断提高🚀

气候变化的 ML 是什么?

原文:https://towardsdatascience.com/what-is-ml-for-climate-change-2fb683c0de25?source=collection_archive---------40-----------------------

2019 年成立的一个新的“子领域”正在掀起波澜,比我最初想象的更容易接近

随着世界秩序的转变,我在寻找积极的、有吸引力的工作,我想知道 a)针对气候变化的机器学习到底是什么,b)是否有合理的途径让我们投入其中并做出贡献?引用我后来大量引用的一篇论文中的行动呼吁:

突破性的技术会产生影响,但对世俗问题的精心构建的解决方案也会产生影响。

照片由来自佩克斯的达莉亚·谢夫索娃拍摄

最近的工作

首先,我知道最近有一堆关于气候变化和机器学习的研讨会(如 ICLR 2020 、 ICML 2019 、 NeurIPs 2019 版)。往这里看,原来是一个 climatechange.ai 的集中群。这对我来说似乎不错,但我希望了解人们实际上在做什么。

我写了一个小脚本来收集研讨会记录的标题和作者,并提出了这个关键词列表(一路上了解了 NLP 和停用词)。

LEARNING, USING, CLIMATE, DEEP, MACHINE, DATA, NETWORKS, CHANGE, SATELLITE, PREDICTION, IMAGERY, NEURAL, WEATHER, POWER, FORECASTING, ENERGY, TOWARDS, MODELS, CARBON, REINFORCEMENT, BASED, DETECTION, ENVIRONMENTAL, MONITORING, FLOW, VIA, DYNAMICS, FRAMEWORK, SOLAR, RISK, CLOUD, GRID, LEARNING-BASED, FOREST, CONSERVATION, SMART, ANALYSIS, OPTIMAL, MAPPING, URBAN, INTELLIGENCE, RENEWABLE

我预料会有一些时髦的词汇,但这几乎没有教我人们在做什么。一些提供洞察力的关键词可能是这个子集(去除数据和学习描述词):

NETWORKS, SATELLITE, WEATHER, POWER, ENERGY, FLOW, SOLAR, DYNAMICS, GRID, FOREST, CONSERVATION, MAPPING, URBAN

它列出了在城市发展、电力系统、能源网、保护和动态系统领域的应用。粗略分析之后,我意识到我实际上需要阅读 100 页的白皮书来初始化这个领域。

我将用于纸张信息的数据放在这里。你可以花 100 美元(25 美元)在注册 2020 年虚拟 NeurIPs 会议,并参加用机器学习应对气候变化研讨会的下一次迭代。

用机器学习应对气候变化——开创性论文

这篇来自 17 个机构的 22 位作者的论文揭开了我提到的研讨会的序幕,并提供了关于人们可以从哪里开始的详细解释。如果你从这篇博客帖子中没有得到任何其他信息,请注意:针对气候变化的机器学习是一场 运动 鼓励基于应用的 机器学习研究,这将有益于地球的长期生态系统(并不是说所有的变化都需要很长时间)。

我将在本文中总结潜在的应用领域,如果读者有兴趣了解更多信息,可以打开文档:

ML 可以通过遥感实现自动监测(例如,通过确定毁林、收集建筑物数据和评估灾后损失)。它可以加速科学发现的进程(例如,为电池、建筑和碳捕获提出新材料)。ML 可以优化系统以提高效率(例如,通过整合货运、设计碳市场和减少食物浪费)。此外,它还可以通过混合建模(例如气候模型和能源调度模型)来加速计算成本高昂的物理模拟。

本质上,遥感、科学发现、能源密集型系统等所有应用领域都有许多未被触及的数据,而机器学习已被证明在任何大数据集中发现模式都非常有用。我把这一点从列表中分离出来,是为了让它变得清晰——单靠计算机科学家无法解决这些问题:

对气候问题采取有意义的行动需要与计算机科学内外的领域进行对话,并可以导致跨学科的方法创新,如改进的物理约束的 ML 技术。

过去十年中开发的机器学习工具在许多领域从数据中提取模式方面取得了令人印象深刻的结果。虽然仍然有许多理由对技术持怀疑态度,但有充分的理由认为一些新工具将在其中一些领域发挥作用。例如,强化学习,通常被认为是不稳定的,难以转移到现实世界,充满了未建模的行为,同时在电网优化中非常有用(示例 1 ,示例 2 )。为什么强化学习在这里起作用:该系统基于非常众所周知的物理学和受约束的变量——所以当 RL 代理做一些奇怪的事情时,它可以很容易地被标记为物理上不可能的,等等(我正在与一些研究生成立一个阅读小组,研究安全或不安全的现实世界 RL 应用的差异,所以如果你是专家,想谈谈,或者有兴趣,请告诉我)。

不过有一个警告,这在考虑如何部署这项技术时至关重要:许多国家没有支撑美国如此多行业的数据基础设施。该论文给出了从美国到印度的能源工厂的不同数据记录的例子——这变成了第二个机器学习问题,即在弄清楚如何优化美国电网之后的 迁移学习

它们呼吁采取行动,这很好地总结了我现在的感受。

。确定你的技能如何有用——我们希望这篇文章是一个起点。

协作。寻找合作者,他们可能是研究人员、企业家、已建立的公司或政策制定者。这里讨论的每个领域都有了解其机会和陷阱的专家,即使他们不一定了解 ML。

。倾听你的合作者和其他利益相关者所说的需要。突破性的技术会产生影响,但对世俗问题的精心构建的解决方案也会产生影响。

展开。确保您的工作部署在可以实现其影响的地方。

如果你想知道你的专业知识可能重叠的地方,看看这个表格。我认为我们有义务解决世俗的问题,因为它们往往是唾手可得的果实。机器学习的从业者可以看看上面,看看自己的技能在哪里有用,然后参考原论文。其他人可以看看左边,然后它会指出哪些 ML 工具在你的领域中最有用,可以学习和利用。

来源https://arxiv.org/pdf/1906.05433.pdf。

鼓励参与的系统性变革

我们如何鼓励研究人员与实践者合作来解决论文中提到的世俗问题。我知道我的顾问会完全同意我这么做,但顾问和经理的覆盖范围并不一致。我已经谈到了学术系统在激励方面有点破碎,但我想在等式中添加另一个变量:如何鼓励许多学者几乎没有注意到的对社会有益的工作(引用较少,bleh)。

谷歌大脑和脸书人工智能公司的人有动力从事这项工作吗?我应该花 6 个月的时间在这个领域工作,作为一个独立的研究者来占有一些地盘吗?我只是想开启讨论,让人们思考到底是什么限制了在这个领域的花费时间。

创造技术作为研究气候变化的替代方法

我在讨论气候变化时总会想到的另一个问题是,我们能制造出什么样的技术,要么 a)改变公众对“绿色”设备的看法,要么 b)在没有消费者关心的情况下有益于环境(就像特斯拉一样更好)?我从上面的论文中得到的印象是,减轻危害、优化当前基础设施和测量当前系统的影响是降低门槛的方法。我仍然坚持认为,从长远来看,制造改变思维的产品更有益。这里是来自特斯拉的一些统计数据和他们去年的报告。

创新气候变化与通过公众认知活动和保护来减缓气候变化的光谱中,你属于哪一种?

2020 年 12 月 11 日或 12 日,用机器学习应对气候变化的研讨会上再见。这是我关于机器人学&自动化、 民主化自动化 的免费时事通讯的一个高峰。

[## 自动化大众化

一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…

robotic.substack.com](https://robotic.substack.com/)

什么是自然语言处理?

原文:https://towardsdatascience.com/what-is-natural-language-processing-86a7123a076b?source=collection_archive---------23-----------------------

首先,我们将简要回顾一下什么是 NLP 以及我们为什么关注它。然后我们将深入研究 NLP 的主要分支及其用例。

图片来自皮查拜

人类有些不寻常的地方。

我们有能力完成难以置信的复杂任务。更令人惊讶的是,大多数对我们来说最简单的事情对机器来说却难以置信地难以学习。

你曾经接住过棒球吗?或者在你的衣柜里挑了一件你最喜欢的衬衫?或者对朋友说了一句诙谐的话,逗得他大笑?这些是我们的第二天性。

当然,电脑可以在硬盘上进行近乎无限的计算,而我们却难以估算小费。但是如果你让一台电脑讲一个笑话,如果不打扰的话,通常会有点尴尬!

摇滚猴子在 Unsplash 上拍照

低垂的果实

可以理解的是,数学和机器学习领域在有关硬数字的问题上取得了快速进展:

  • 考虑到 5 年前这套 21 卫的房子卖了 10 万美元,它大概值多少钱?
  • 假设去年同期有 100 名顾客,那么明天我的餐厅会有多少顾客?

但是,当我们想探究我们主要的交流方式:说和写所面临的问题时,这种轻松就止步了。

我们创造了编码程序来帮助我们像计算机一样进行交流。但是你能想象一个人类用代码互相交流的世界吗?那会非常干燥…

一个程序员去杂货店,他的妻子告诉他,“买一加仑牛奶,如果有鸡蛋,买一打。”

于是程序员去了,买了所有的东西,然后开车回家。

到达后,他的妻子生气地问他:“你为什么买了 13 加仑的牛奶?”程序员说,“有鸡蛋!”

幸运的是,我们将 Python 作为口语的可能性很小。我们可以保留我们所说和所写的语言的美丽和复杂,以及它们的大量词汇、双重含义、讽刺、俚语、缩写和特殊之处!

快速定义

自然语言简单来说就是我们相互交流的方式:语音和文本。

克里斯蒂娜·帕帕罗在 Unsplash 上拍摄的照片

处理指的是让自然语言可用于计算任务。

因此,自然语言处理(NLP)关注的是寻找、消化和理解人类语音和文本。

对于 NLP 从业者来说,自然语言的微妙之处使得 NLP 成为一个非常具有挑战性和非常令人兴奋的领域!

随着时间的变化

NLP 并不总是用人工智能和机器学习来进行的。

解决自然语言问题的最初方法是“硬编码”手写的、基于规则的方法。

例如,英语中的“dog”应该总是翻译成西班牙语中的“perro”。

但是,如果狗是母的呢?好吧,那这个应该翻译成“perra”。

“三伏天”指的是一年中最热的日子吗?“dias de perro”对说西班牙语的人有意义吗?不——在西班牙语中应该是“la canícula”。

我们可以看到手写的规则是如何迅速变得有问题的——这实际上是 20 世纪 NLP 发展短暂停顿的原因。

但是,在大量计算资源和一些数学知识的帮助下,NLP 研究人员设计了解决这些问题的“统计 NLP”方法,这极大地提高了该领域的准确性和实用性。

我们暂时把它留在那里,但要知道这就是为什么 NLP 经常被认为是人工智能/机器学习的一个子领域。

为什么自然语言处理很重要?

如果计算机可以帮助我们理解自然语言,那么我们可以更准确、更便宜地完成大量任务,为人们节省数千小时的繁琐工作。

有一段时间,我在帮助一家大型运输公司做营销工作。每年有数百万人和他们一起去旅行。

该公司对这些旅行者进行抽样调查,通常会问一些问题,范围从 1 到 10(卫生间有多臭?).此外,他们要求自由文本的回答(你的旅行怎么样?还有什么我们应该知道的吗?).

我们收到了成千上万的调查反馈。你能想象作为一名分析师,被指派通读每个回复,试图收集一些有用的信息吗?也许你正坐在一个 Excel 电子表格前,缓慢地记录着一行行的回答,标记着客户是高兴还是生气。

图片由 www_slon_pics 来自 Pixabay

这太糟糕了。

相反,我们使用了一种非常简单但强大的方法来自动推断客户调查响应是高兴还是生气——这种做法被称为“情绪分析”。

更明智地利用时间

以前,工人会在这项任务上花费宝贵的时间。或者,更现实地说,公司会直接扔掉文本数据——浪费客户花在填写上的时间,以及任何等待揭示的有用见解。

现在,在几分钟内,这种分析意味着我们可以从 0%到 100%评价成千上万的顾客在他们的旅行中有多开心或生气。然后,我们可以开始解决导致 80%客户投诉的 20%的问题。

这是一个简单的例子——但是很多时候,少量的 NLP 可以节省无数的时间,并提供大量有价值的见解。

因此,我们对 NLP 可以提供的价值有了一些概念。主要的用例是什么?我们还能如何利用 NLP 让世界变得更美好?

自然语言处理的 5 个主要分支

自然语言处理是一个不断发展的领域,新的应用和突破一直在发生。

这当然使得很难将该领域划分为整齐的类别,但是下面的一个分类有助于我们理解许多不同的 NLP 方法:

  1. 句法
  2. 语义学
  3. 话语
  4. 演讲
  5. 对话

1-语法

语法是我们认为理所当然的东西。孩提时代,我们大多是通过听别人遵循我们的语言规则,并试图自己遵循这些规则来学习这些规则。除非语法不正确,否则我们通常看不到它。

句法是一套关于如何组织我们的句子、使用正确的时态、标点符号等的规则。换句话说,你的英语老师会因为你在论文中出错而记下你的分数。

没有连句!
图片由
Free-Photos 发自 Pixabay

注意这些句子中有一句似乎很不对:

  • 那只猫一直在寻找那只窜来窜去的老鼠。(好!)
  • 猫们被搜寻着,寻找着逃跑的老鼠。(哎哟!)

NLP 的大部分致力于学习、剖析和重用语法规则。

大多数语法任务都是低级的,它们本身并不是目的,而是产生我们将在下面讨论的高级 NLP 任务中使用的信息。

语法任务的示例

一个例子是词性标注。给定一个词,我们想推断它是名词还是动词等:

  • - >名词
  • 搜索 - >动词
  • - >介词

虽然我们可能并不特别在意“cat”是一个名词,但这一知识对于下游的 NLP 应用程序非常有帮助,比如查找专有名词或总结文本。

与语法相关的 NLP 方法的其他示例包括:

  • 寻找“基本”单词的方法(运行->运行)
  • 创建一个解析树来表示给定文本的语法
  • 分块—例如,将文本分成句子或单词
  • 从给定文本中提取相关术语/关键词

允许我们的机器使用语法构成了(在我看来)更酷的 NLP 应用程序的基础!

我们继续。

2 —语义

“我是鸡蛋男。他们是鸡蛋人。我是海象。”

虽然上面的片段包含了完美的语法,遵循了所有的规则,但是它 是什么意思 ?(也许外面有个披头士的粉丝能给我解释一下。)

文本的意义是语义学的关注点。

我们的语言一定有意义。
图片来自
pix abaynugroho DWI harta wan

语义任务的示例

与语义有关的 NLP 方法的一个例子是从文本中挑选专有名词的能力。例如,在下面的句子中:

《隔壁邻居 维克多 作品为 梦工厂 梅丽莎 ,他的妻子,供职于 国防部

粗体实体由命名实体识别系统挑选出来,该命名实体识别系统被设计成捕获专有名词。

虽然我们的眼睛很容易识别,但手工编写规则非常困难,尤其是因为系统不仅会找到专有名词,还会标记它们:

  • 维克多,梅丽莎->
  • 国防部->梦工厂组织

有一段时间,我为一家公司工作,该公司想从成千上万份合同中提取人名。

试图找到一个包含所有可能名字的字典,或者让某人手动通读并高亮显示,很容易出错,而且要花很长时间。使用 NER 快速准确地解决了这个问题。

更多语义!

其他一些与语义相关的 NLP 方法包括:

  • 使用数字来表示文本中单词/句子的含义以及它们之间的关系
  • 将文本从一种语言翻译成另一种语言
  • 从结构化数据(行和列)创建人类可读的文本
  • 确定给定图像中的文本(从屏幕截图到 Word 文档)
  • 形成关于给定数据集的问题的答案
  • 决定一个给定文本的正面或负面情绪
  • 将文本分成独立的主题
  • 根据上下文判断歧义词的含义(滚动?吃个寿司?)
  • 举一个上面的例子,我们找到专有名词,找出它们之间的关系(Melissa 是 Victor 的妻子)

语义学是一个蓬勃发展的领域——不用说,在帮助我们的计算机找到文本的意义方面取得了很大进展,反过来帮助我们进行更强大的分析。

3 —话语

怎样才能让某人说服你做某事?

假设你的朋友想去汉堡王。提及以下内容对他们有利:

  • 这食物不贵。
  • 汉堡很多汁。
  • 奶昔有泡沫。

不需要太多的劝说!
【图片来自
Unsplash 】

太好了——你的朋友提出了令人信服的论点!

然后另一个朋友想去温蒂餐厅。他们提到:

  • 外面天气温和。
  • Arby's 在 48 个州都有营业。
  • 我的鞋子解开了。

你的第二个朋友有点欠缺。他们的想法和建议彼此之间没有什么关系,或者与手头的主题没有什么关系。他们说的话没有连贯性,所以真的没有什么说服力。

在第一个例子中,你的朋友直接与你的进食欲望对话,他们所说的一切都与汉堡王有关。太好了!

最重要的是,自然语言处理中的话语涉及到一组连贯的句子,以及如何实现高质量的、类似人类的交流。

话语任务示例

自然语言处理中的一个重要方法是文本摘要。

通过文本摘要,机器可以自动将任意长度的文本摘要到您喜欢的长度,无论是句子中的文章摘要,段落中的科学论文摘要,还是页面中的书籍摘要。

例如,经常会有这样的情况,专业人士需要通读一大堆文件,但他们阅读每一个单词并不重要。他们只需要要点。

最重要的是,返回的摘要必须内部连贯——这意味着摘要中的句子在逻辑上简洁明了,并且摘要准确地浓缩了原文的信息。

与话语相关的其他自然语言处理方法包括:

  • 哪些提及是指哪些实体?(“他”指的是“维克托”)
  • 对文本类型进行分类(它是一个问题,陈述,断言?)
  • 对文本的质量和连贯性评分(自动论文评分)

当试图训练聊天机器人与人类良好互动并易于理解时,会使用大量话语。如果你在一个化妆品网站上告诉聊天机器人你正在寻找一种好的润肤霜,机器人问你最喜欢的书是什么是无益的。

4 —演讲

迄今为止,我们讨论的大部分内容都与书面文本数据有关,自然语言也包括口语。

因为机器更容易处理书面文字,所以这一类别的主要任务是语音到文本翻译

当你与 Alexa 这样的智能扬声器交谈时,软件会将你的语音转换为书面文字,以便机器可以执行我们之前在上面描述的任务。

在另一个方向,给定一段文本,NLP 实践者可以尝试让机器以令人信服的人声阅读文本。

令人惊讶的是,我们与他人的讲话如此合拍——我们通常能很快察觉到一个机器人在和我们说话。

但是文本到语音的转换越来越好了。谷歌双工机器人的声音已经被证明可以令人信服地对电话另一端毫无戒备的人说话。图灵会很骄傲的!

5-对话

当我们彼此交谈时,我们通常有一个我们想要表达的观点(如果我们没有,我们就不会交谈)。也许我们是想逗对方笑,或者想出去杂货店的路,或者向他们要钱,或者发泄自己的情绪。

简而言之,我们有一些目标。

对话试图在人们(或机器人)相互交谈的背景下解释自然语言的目的。另一个术语是会话知识。

“我承认你的意图!
照片由
Wynand van Poortvliet 在 Unsplash 拍摄

例如,总机对话行为语料库包含来自数千个电话的数据。数据集标记了说话者的话语可能具有的多种意图。

*“你为什么不先走”*被归类为“行动指令”——你在告诉某人做某事。

*“你呢?”*是一个“开放式问题”。

“*对不起。”*是“道歉”。

还有我最喜欢的一个:*“嗯哼。”*是一种“承认”。

你可以想象对意图的敏锐理解是如何帮助聊天机器人变得更加自然和令人信服的。这样,它就能说正确的话,让你买润肤霜!

现在是开始学习自然语言处理的最佳时机。我们正在生成比以往任何时候都多的非结构化文本,我们需要回答的问题既复杂又重要。

现在,您已经具备了识别哪些问题属于 NLP 范畴的基础知识。

保持下去!
图片来自 Pixabay

不仅如此,您还知道 NLP 的不同分支,这将允许您集思广益,找出解决问题的不同方法,以及从数据中挖掘价值的不同方法。

如果你是这个领域的新手,一个很好的开始方式是选择一个你感兴趣的方法并深入研究——看看你能用它解决什么问题。

最重要的是,坚持阅读和练习。我也会这么做的!

感谢您的阅读!

什么是自然语言处理?自然语言处理简介

原文:https://towardsdatascience.com/what-is-natural-language-processing-a-gentle-introduction-to-nlp-4ed219a768ad?source=collection_archive---------33-----------------------

自然语言处理导论:它是什么,我们如何使用它,我们面临什么挑战,我们有什么工具。

本文原载于 程序员背包博客 。如果你想阅读更多这类的故事,一定要访问这个博客。

更感兴趣?在 Twitter 上关注我,地址是@ b _ dmarius,我会在那里发布每一篇新文章。

照片由克里斯蒂安·威迪格在 Unsplash 上拍摄

自然语言处理或 NLP 是人工智能研究的一个子领域,专注于开发基于自然语言的人类和计算机之间的交互模型和点。这包括文本,也包括基于语音的系统。

几十年来,计算机科学家和研究人员一直在研究这个话题,但直到最近它才再次成为热门话题,这种情况是由研究界最近的突破造成的。

话虽如此,但在本文结束时,你会学到以下内容。

  • 自然语言处理如何工作的基本概述
  • 谁使用自然语言处理,用于什么样的问题
  • 在您的应用程序或业务中使用自然语言处理有哪些挑战
  • 有哪些基本工具可以让你开始使用自然语言处理

自然语言处理是如何工作的

计算机科学中一个普遍接受的事实是,如果我们把复杂的问题分成更小的部分,每个复杂的问题都会变得更容易解决。在人工智能领域尤其如此。对于一个给定的问题,我们构建几个小型的、高度专门化的组件,它们擅长解决一个且仅一个问题。然后,我们将所有这些组件对齐,通过每个组件传递我们的输入,并在线的末端获得我们的输出。这就是我们所说的管道

在自然语言处理的背景下,一个基本的问题是,对于一个给定的段落,计算机准确地理解它的意思,然后可能相应地采取行动。为此,我们需要经历几个步骤。

句子边界分割

对于给定的文本,我们需要正确地识别每一个句子,以便由此产生的每一个句子在接下来的步骤中都可以提取其含义。似乎从一篇文章的每一句话中提取意思,然后把它们放在一起,比试图确定整篇文章的意思更准确。毕竟,当我们说话(或写作)时,我们不一定只指一件事。我们经常倾向于将更多的想法传达给一个人,自然语言的美妙之处(以及对 NLP 的诅咒)在于我们确实可以做到。

一种简单的方法是只在文本块中搜索句点,并将其定义为句子的结尾。问题是句点也可以用于其他目的(例如缩写),因此在实践中,机器学习模型已经被定义为正确识别用于结束句子的标点符号。

单词标记化

这一部分包括从上一步中提取一个句子,并将其分解为包含所有单词(和标点符号)的列表。这将在接下来的步骤中用于对每个单词进行分析。

词性标注

这一步包括从上一步中提取每个单词,并根据它所代表的词类进行分类。这是识别文本背后含义的重要一步。识别名词可以让我们弄清楚给定的文本是关于谁或什么的。然后动词和形容词让我们理解实体是做什么的,或者它们是如何被描述的,或者我们可以从文本中获得的任何其他含义。词性标注是一个困难的问题,但它已经得到了很大程度的解决,并且在大多数现代机器学习库和工具中都可以找到它的实现。

命名实体识别— NER

这项任务是指识别句子中的名称,并根据预定义的类别列表对其进行正确分类。这些类别可能包括:人员、组织、地点、时间、数量等。类别列表可能是为您自己的特定用例定制的,但是一般来说,几乎每个人都需要至少这些类别才能被正确识别。

这类问题有许多实现,最近建立的模型已经达到了接近人类的性能。基本上,这一步也分为两个子任务:正确识别句子中的名字,然后根据你的类别列表对每个名字进行分类。

当然,为了在现实世界的应用中使用,NLP 解决了许多其他任务,但是接下来的步骤是为每个用例以及每个业务需求量身定制的。综上所述,前面介绍的步骤是我们能想到的几乎所有用例的基本步骤。

如何使用自然语言处理

在 Unsplash 上由 BENCE BOROS 拍摄的照片

NLP 被用在各种软件中,各种用例已经被确定为可以通过部署 NLP 模型来解决。其中一些例子是:

  • **虚拟助理:**为了帮助用户完成任务,大多数现代的、强大的个人助理都采用了大量的自然语言处理技术。Siri、Google Assistant 和许多其他软件已经变得非常高效和熟练,通过使用 NLP 领域的最新突破来帮助他们的用户。这意味着他们背后的公司在开发完美虚拟助手的竞赛中投入大量资源进行进一步研究。虽然直到几年前,这些助手都是华而不实,但现在数百万用户正在使用它们,并能够利用它们的解决方案。
  • **机器翻译:**你有没有注意到,最近几年,谷歌翻译在为你翻译文本方面变得更加准确了?这要归功于该领域研究取得的最新进展,谷歌翻译为亿万用户提供了数百种语言的机器翻译。
  • 在我们今天生活的快节奏的社会中,我们经常没有时间把我们讨论的所有事情都记录下来,无论是商务笔记、电话、演讲等等。现在有相当多的初创公司帮助我们解决这类问题,即把声音作为输入,并为我们提供文本,我们可以在此基础上继续并采取行动。

使用自然语言处理的挑战

当然,当使用 NLP 技术时,有相当多的挑战。最重要的是从文本中提取上下文。人类非常擅长理解一个句子的上下文,但计算机只使用统计模型来表示这些句子,所以他们很难理解我们的话到底是什么意思。

例如,当我们说“布什”时,我们可能会提到这种植物或美国前总统。对你来说,识别这种差异可能非常容易,但是计算机必须从流水线开始经历几个步骤,直到决定你使用的是哪一个意思。

NLP 的另一个挑战与第一个挑战有关,即寻找足够的数据来训练我们的模型。与任何其他机器学习模型一样,训练 NLP 模型需要大量数据和大量时间,这意味着只有少数足够大的公司有资源来构建涉及 NLP 的真正强大的应用程序。其他较小的公司采用高度专业化的机器学习模型,这意味着它们只解决所有 NLP 问题的一个子集,为此它们需要少得多的数据。

考虑了所有这些因素后,最终我们正确识别 NLP 模型给我们的业务或应用带来的价值是非常重要的。我们需要看看我们设法建立的模型是否能够真正帮助我们和我们的客户,或者它是否只是一个花哨的功能,以便我们可以说我们是一家机器学习公司。

自然语言处理工具

为了开始学习和开发 NLP 模型,有相当多的库可供开发者使用。好的一面是大多数都是开源的。

  • NLTK —自然语言工具包是一个主要用于研究和教育的 Python 库。它包括许多准备测试和使用模型的步骤。你可以在他们的网站上开始使用。
  • Stanford CoreNLP 是另一个 Python 库,它为理解自然语言提供了广泛的工具。这里可以看到几个例子。
  • spaCy 是另一个 Python 库,它利用机器学习和深度学习来帮助你实现许多强大的功能。他们的网站是这里。

摘要

在本文中,我们对自然语言处理领域做了一个简单的介绍。我们已经讨论了构建 NLP 管道的一些基本步骤,然后我们看到了谁以及如何使用自然语言处理来增强他们的业务。然后,我们看了一下使用 NLP 的主要挑战,以及我们可以用来了解 NLP 并可能在我们的应用程序中使用它的一些最佳工具。

更感兴趣?在 Twitter 上关注我,地址是@ b _ dmarius,我会在那里发布每一篇新文章。

什么是神经搜索,我为什么要关心?

原文:https://towardsdatascience.com/what-is-neural-search-and-why-should-i-care-4a6cee6b2249?source=collection_archive---------58-----------------------

人工智能搜索更省力,更灵活

神经搜索?那是什么?

简而言之,神经搜索是一种检索信息的新方法。神经搜索不是告诉机器一套规则来理解什么数据是什么,而是通过预先训练的神经网络来做同样的事情。这意味着开发人员不必编写每一个小规则,节省了时间和麻烦,同时系统会不断训练自己变得更好。其中一家提供开源神经搜索框架的公司是纪娜 T2。

背景

搜索是一项大生意,而且每天都在变大。就在几年前,搜索意味着在文本框中输入一些东西(啊,那是雅虎令人兴奋的日子!和 Altavista)。现在,搜索包括文本、语音、音乐、照片、视频、产品等等。就在千年之交之前,每天只有 350 万次谷歌搜索。今天(根据搜索词2020 google searches per day的最高搜索结果),这个数字可能高达 50 亿,并且还在上升,超过 1000 倍。更不用说数百万人每天从手机、电脑和虚拟助手上搜索的数十亿篇维基百科文章、亚马逊产品和 Spotify 播放列表。

只要看看谷歌查询的飞速增长就知道了——而且这只是到 2012 年为止!

简而言之,搜索是巨大的 T4。我们将看看搜索方法的卫冕冠军,符号搜索,和勇敢的暴发户竞争者,神经搜索。

资料来源:Unsplash 的背景

**注:**本文基于晓寒在他许可下发表的帖子。如果你想了解更多关于神经搜索的技术介绍,可以去那里看看。

符号搜索:规则就是规则

谷歌是一个巨大的通用搜索引擎。其他公司不能仅仅根据他们的需求对其进行改造并将其插入他们的系统。相反,他们使用像 Elastic 和 Apache Solr 这样的框架,这些符号搜索系统让开发者编写规则并创建搜索产品、人员、信息或公司需要的任何东西的管道。

让我们以 Shopify 为例。他们使用 Elastic 在数百个类别的数百万个产品中进行索引和搜索。这不能开箱即用,也不能用像谷歌这样的通用搜索引擎来完成。他们必须使用 Elastic 并编写特定的规则和管道,根据各种标准对产品进行索引、过滤、排序和排名,并将这些数据转换为系统可以理解的符号。因此得名,符号搜索。这是一家很受欢迎的运动鞋商店:

你我都知道,如果你搜索red nike sneakers你想要红色耐克运动鞋。不过,这些只是典型搜索系统的词汇。当然,如果你输入它们,你就有希望得到你想要的,但是如果那些运动鞋被标记为运动鞋呢?或者甚至被贴上猩红的标签?在这种情况下,开发人员需要编写规则:

  • 红色是一种颜色
  • 猩红色是红色的同义词
  • 耐克是一个品牌
  • 运动鞋是鞋类的一种
  • 运动鞋的另一个名字是运动鞋

或者,用 JSON 表示为键值对:

这些键值对中的每一个都可以被认为是一个符号,因此命名为符号搜索。当用户输入搜索查询时,系统将其分解成符号,并将这些符号与其数据库中的产品符号进行匹配。

但是如果用户输入的是nikke而不是nike,或者搜索的是shirts(带有一个s)而不是shirt,会怎么样呢?语言中有如此多的规则,人们一直在打破它们。为了获得有效的符号(即知道nikke实际上意味着{"brand": "nike"},您需要定义许多规则并将它们链接在一个复杂的管道中:

符号搜索的缺点

你必须解释每一个。很少。东西

我们上面的示例搜索查询是red nike sneaker man。但是如果我们的搜索者是英国人呢?英国人会打出red nike trainer man。我们必须向我们的系统解释,运动鞋和运动鞋只是名称不同的一样东西。或者是有人在搜索什么LV handbag?必须告诉系统LV代表Louis Vuitton

对每一种产品都这样做需要花费永远的时间,而且总有东西会被遗漏。如果你想本地化为其他语言呢?你得从头再来一遍。这意味着大量的辛勤工作、知识和对细节的关注。

它是易碎的

文本是复杂的:正如我们上面解释的,如果用户在red nikke sneaker man中输入,经典的搜索系统必须识别出他们正在搜索一个红色的耐克(纠正拼写的品牌)男式运动鞋(类型)(子类型)。这是通过管道将搜索字符串和产品细节解释为符号来完成的,这些管道可能会有重大问题。

  • 链中的每个组件都有一个输出,作为输入提供给下一个组件。因此,在流程的早期出现问题会破坏整个系统
  • 一些组件可能从多个前任获取输入。这意味着你必须引入更多的机制来阻止它们相互阻塞
  • 很难提高整体搜索质量。仅仅改进一两个组件可能不会导致实际搜索结果的改进
  • 如果你想用另一种语言搜索,你必须重写管道中所有依赖于语言的组件,增加了维护成本

神经搜索:(预)训练,不解释

一种更简单的方法是建立一个基于现有数据的搜索系统。如果你事先在足够多的不同场景下训练一个系统(即预训练模型),它会发展出一种找到匹配输入的输出的通用能力,无论它们是花、南方公园的线还是神奇宝贝。您可以将该模型直接插入您的系统,并立即开始索引和搜索。

代码非常简单。它加载一个“流”,该流又加载一系列模块来处理、索引和查询您的数据:

这样,你就不需要浪费时间为你的用例编写无尽的规则。相反,只要在你的代码中加入一行代码,从“应用商店”下载你想要的模型(就像即将到来的纪娜中心),然后开始。

与符号搜索相比,神经搜索:

  • 移除脆弱的管道,使系统更具弹性和可扩展性
  • 找到一种更好的方法来表示产品和搜索查询的底层语义
  • 一边学习,一边进步

神经搜索有用吗?

如果搜索能够理解并返回高质量的结果,则该搜索“有效”:

  • **简单查询:**如搜索“红色”、“耐克”或“运动鞋”
  • **复合查询:**像‘红色耐克运动鞋’

如果它连这些都做不到,那么检查拼写检查和使用不同语言的能力就没有意义了。

总之,少说话,多寻找:

🇬🇧 nike

🇩🇪 nike schwarz (different language)

🇬🇧 addidsa (misspelled brand)

🇬🇧 addidsa trosers (misspelled brand and category)

🇬🇧 🇩🇪 kleider flowers (mixed languages)

所以,你可以看到,神经搜索做得很好!

比较符号搜索和神经搜索

那么,神经搜索与符号搜索相比如何呢?让我们来看看各自的优缺点:

我们并不试图在团队象征和团队神经之间做出选择。这两种方法都有各自的优点,并且可以很好地互补。因此,更好的问题是:哪一个适合您的组织?

自己试试神经搜索

测试一项技术的最佳方式莫过于一头扎进去玩一玩。纪娜提供预先训练好的 Docker 图像和 jinabox.js ,这是一个易于使用的搜索文本、图像、音频或视频的前端。目前还没有产品搜索的例子,但是你可以搜索更多轻松的东西,比如你最喜欢的神奇宝贝或者《南方公园》里的台词。

Geopandas 0.70 有什么新特性?

原文:https://towardsdatascience.com/what-is-new-in-geopandas-0-70-dda0ddc90978?source=collection_archive---------26-----------------------

主要变化和新的改进,带有示例和代码说明。

Geopandas 是用 Python 进行地理空间数据科学的主力,它扩展了 pandas 的数据类型来执行空间数据操作。Geopandas 0.70 于昨天 2 月 17 日刚刚发布,它带来了一些重大的变化和改进。

我在这里重点介绍了 Geopandas 0.70 的一些最佳新特性。

原生剪辑功能

通过将地理数据框裁剪到其他形状的空间范围的固有功能,裁剪变得非常容易。裁剪是最常用的地理空间数据处理功能之一;然而,在以前的版本中,Geopandas 没有执行它的直接函数。如果您想要地理数据的特定区域,您必须执行裁剪以获得感兴趣的区域。

现在有了新的geopandas.clip功能,您可以轻松地按照提供的空间范围裁剪数据。让我们看一个例子。

import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Polygon, LineString
gpd.__version__'0.7.0'

我们使用 Geopandas 作为可用的数据集,首都城市,世界边界。此外,我们将非洲划分为子集,并创建一个多边形来标记我们感兴趣的空间范围。

capital_cities = gpd.read_file(gpd.datasets.get_path(“naturalearth_cities”))world = gpd.read_file(gpd.datasets.get_path(“naturalearth_lowres”))africa = world[world[“continent”] == “Africa”]poly = Polygon([(-35, 0), (-35, 60), (60, 60), (60, 0), (0, 0)])polygon = geopandas.GeoDataFrame([1], geometry=[poly], crs=world.crs)

让我们在一个图像中看到所有的数据。

fig, ax = plt.subplots(figsize=(12,10))world.plot(ax=ax)africa.plot(ax=ax, edgecolor=”black”, color = “brown”, alpha=0.5)capital_cities.plot(ax=ax, color=”Red”)polygon.boundary.plot(ax=ax, color=”Red”)

所有数据的映射

首都标为红点,非洲标为绿色。红色矩形显示了我们感兴趣的范围。

现在,如果我们只想从世界边界中裁剪红色矩形的一部分,您可以调用geopandas.clip并提供两个地理数据框。首先,world 世界边界和polygon范围。

clipped = gpd.clip(world, polygon)fig, ax = plt.subplots(figsize=(12,10))clipped.plot(ax=ax, color=”gray”);

如下图所示,你可以看到被剪切的区域,非洲、欧洲和亚洲的部分地区。

剪裁的边界

您不仅可以使用此函数多边形和多边形,还可以使用其他数据类型,如线和点。

读取文件时过滤行

对于当前的大数据集,在读取数据的同时过滤行的能力是必不可少的。想象一下,有一个包含数百万行的数据集,由于内存问题而无法读取。有了这个新功能,您可以在读取数据之前提供行或切片来过滤数据。

让我们看一个例子。

cities_filtered = gpd.read_file(gpd.datasets.get_path(“naturalearth_cities”),**rows=30**)

这将只读取数据的前 30 行。如果想从中间切片,可以加切片。

cities_filtered_slice = gpd.read_file(gpd.datasets.get_path(“naturalearth_cities”),**rows=slice(10,30)**)

只有 10 到 30 之间的行才返回上面的代码。

地块几何图形集合

无法绘制几何图形集合数据,例如不同数据类型(点、线或多边形)的数据。使用当前版本,您可以打印各种几何对象集合。让我们看一个例子。

a = LineString([(0, 0), (1, 1), (1,2), (2,2)])b = LineString([(0, 0), (1, 1), (2,1), (2,2)])x = a.intersection(b)gc = gpd.GeoSeries(x)type(x)shapely.geometry.collection.GeometryCollection

ab只是普通的 LineString,但是它们的交集返回一个几何图形的集合(线和点)。如果您从 x 中的几何图形集合中创建了一个Geoseries,现在您可以用 Geopandas 绘制它。请参见下面的示例。您在同一个地理数据框中绘制了点和线。

用 Geopandas 绘制的几何图形集合

PROJ 6 号取代 PROJ 4

Geopandas 0.70 版本开始使用新的投影接口。PROJ 6 取代了 PROJ4,带来了更好的界面和更多的信息。

以前gpd.crs只返回这样一个字符串。

{'init': 'epsg:4326'}

但是,当前版本带来了大量关于数据地理投影的元数据。

world.crs

返回以下有用信息

<Geographic 2D CRS: EPSG:4326> Name: WGS 84 Axis Info [ellipsoidal]: — Lat[north]: Geodetic latitude (degree) — Lon[east]: Geodetic longitude (degree) Area of Use: — name: World — bounds: (-180.0, -90.0, 180.0, 90.0) Datum: World Geodetic System 1984 — Ellipsoid: WGS 84 — Prime Meridian: Greenwich

例如,如果要访问投影的数据,可以调用。

world.crs.datum

结果只显示了这一部分

DATUM[“World Geodetic System 1984”, ELLIPSOID[“WGS 84”,6378137,298.257223563, LENGTHUNIT[“metre”,1]], ID[“EPSG”,6326]]

还有一些其他的改进或错误修复没有在本文中提及,但是值得一提。Geopandas 中的空间连接现在可以正确处理 Multindex 并保留左侧地理数据框的索引名称。将文件写入磁盘时,如果需要,现在可以保留索引。此版本现在可以绘制缺少数据的 choropleth 地图。

结论

感谢当前版本的所有贡献者。Geopandas 0.70 在地理空间数据科学过程中带来了许多改进。得益于此版本,现在可以在读取和绘制多几何图形数据时进行裁剪、过滤数据。Proj 6 还带来了一个更好的用户界面,其中包含地理空间世界中最不为人所知的主题之一,地理投影。

这篇文章的代码可以在这个 Google Colab 链接中找到。

[## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/drive/1wPJlGuT4BTISiCo8rYd01BJEG6TC-nBQ)

什么是一键编码以及如何使用熊猫 get_dummies 函数

原文:https://towardsdatascience.com/what-is-one-hot-encoding-and-how-to-use-pandas-get-dummies-function-922eb9bd4970?source=collection_archive---------2-----------------------

一个完整的初学者一键式编码教程

照片由希望之家出版社——皮革日记工作室在 Unsplash 拍摄

我一直在问机器学习中的一些概念以及它们的真正含义,例如,在我以前的一篇文章谷歌实践机器学习的 7 个步骤中,有人问我什么是一键编码,我们应该什么时候使用它?这是一个很好的问题,每个机器学习实践者都需要知道答案,所以让我们来讨论一下这个问题,并使用 Pandas get_dummies()深入了解一些代码。

1.什么是一键编码?

在机器学习的数据处理步骤中,我们通常需要在输入机器学习模型之前以特定的方式准备我们的数据。其中一个例子是对分类数据执行一次性编码。

一种热编码是应用于分类数据的数据处理过程,将其转换成用于机器学习算法的二进制向量表示

为什么以及什么时候我们应该使用一次性编码?

机器学习的一个主要问题是许多算法不能直接处理分类数据。分类数据[1]是可以取有限数量的可能值之一的变量。一些例子是:

  • 人的性别 :
  • 航空旅行舱 : 头等舱公务舱经济舱
  • 电脑厂商 : 联想惠普戴尔苹果宏碁华硕其他

因此,我们需要一种方法来将分类数据转换为数字形式,我们的机器学习算法可以将其作为输入。最广泛使用的编码技术是:

  1. 整数编码:将数值编码为整数。
  2. 一键编码:将数值编码为二进制向量数组。
  3. 虚拟变量编码:同 One-Hot 编码,但少一列。

在上面的例子中,分类变量中的每个值代表一个不同的类别。一些类别可能彼此具有自然关系(称为自然排序)。航空旅行等级变量确实有自然的值排序。这种类型的分类变量被称为 序数变量序数变量在机器学习中应该区别对待,因为序数一般都带有某种意义。在航空旅行等级的情况下,更高等级的乘客往往更富有,年龄也更大。整数编码用于将序数变量转换为数值数据,例如

头等舱为 1,公务舱为 2,经济舱为 3

整数编码表示

整数值之间具有自然的有序关系,机器学习算法可以学习这种关系[2]。

对于不存在这种顺序关系的类别变量,整数编码可能会导致较差的性能或意外的结果[2]。幸运的是,一键编码是对抗这种情况的一种方法。一键编码简单地为每个可能的值创建一列,并在适当的列中放置一个1。下面是等效的独热编码表示。

独热编码表示

通过一键编码,二进制向量数组表示允许机器学习算法利用包含在类别值中的信息,而没有由普通性引起的混淆。

但是,一键编码有一些冗余。例如,在上面的例子中,如果我们知道某个乘客的机票不是头等舱也不是经济舱,那么它一定是公务舱。所以我们只需要使用这三个虚拟编码变量中的两个作为预测器。更一般地,所需的伪编码变量的数量比可能值的数量少一个,即K-1。在统计学中,这被称为 虚拟编码变量 ,或虚拟变量。下面是等效的虚拟编码变量表示:

虚拟编码变量表示

哑元编码变量 是统计学中避免 哑元陷阱 的标准建议,然而,在机器学习的世界中,更推荐一键编码,因为哑元陷阱在应用正则化时并不是真正的问题[3]。

2.如何使用熊猫 get_dummies()函数?

在我们开始学习教程之前,让我们先来看一个我们可以使用的示例数据集。在本教程中,我们将处理来自 Kaggle 的泰坦尼克号数据集。这是一个非常著名的数据集,通常是学生学习机器的第一步。让我们导入熊猫并加载数据来开始。

import pandas as pd**def load_data():
    return pd.read_csv('data/train.csv')**df = load_data()
df.head()

我们创建了一个函数load_data()来将 train.csv 文件加载到 pandas DataFrame 中。

泰坦尼克号数据预览

数据字典来自 Kaggle

2.1 创建一次性编码变量

假设我们想要为性别列创建一个一次性编码变量。下面是我们如何创建它。

pd.get_dummies(**df.Sex**)

它的作用是为每一个可能的值创建一列,这是性别的两个可能值。它通过在适当的栏中放一个1来告诉你它是雌性还是雄性。

一般来说,如果一个分类变量有K个可能值,我们将得到K列来表示它。

2.2 创建虚拟编码变量

在一键编码中有一些冗余。例如,在上面的性别一次性编码中,一个人要么是男性,要么是女性。所以我们只需要使用这两个伪编码变量中的一个作为预测器。更一般地说,所需的伪编码变量的数量比可能值的数量少一个,这就是K-1。在统计学中,这被称为 虚拟编码变量 ,或虚拟变量

默认情况下,get_dummies()不做也不做哑编码,而是一键编码。为了从数据帧中产生一个实际的伪编码,我们需要传递drop_first=True

pd.get_dummies(df.Sex, **drop_first=True**)

虚拟编码

2.3 向列名添加前缀

默认情况下,get_dummies()使用变量值作为列名。比如上面性别一栏中的 例子。为了识别虚拟变量的来源,我们可以使用prefix参数。例如:

pd.get_dummies(df.Sex, **prefix='Sex'**)

2.4 对于具有两个以上可能值的变量

现在,让我们试着对一个有两个以上可能值的变量进行一次性编码。例如,有一个开始于列,我们可以做value_counts() 来检查它的不同值。

df.Embarked.**value_counts()****S    644
C    168
Q     77**
Name: Embarked, dtype: int64

让我们用get_dummies()来表示

pd.get_dummies(**df.Embarked**, **prefix='Embarked'**)

2.5 连接到数据框

您可能会想,我们仍然需要将一次性编码变量附加到数据帧上。为此,我们首先将输出分配给一个名为embarked_dummies的变量

**embarked_dummies** = pd.get_dummies(df.Embarked, prefix='Embarked')

然后,我们使用pd.concat()embarked_dummies连接到数据帧df

df = pd.**concat**(**[df, embarked_dummies]**, axis=1)

pd.concat()的工作方式是我们可以并排连接列,或者一行接一行。所以在这种情况下,我们沿着列(axis =1)连接dfembarked_dummies。最后,我们改写原来的df

通过运行df.head(),我们可以看到现在已经有了Embarked_CEmbarked_QEmbarked_S

pd.**concat**(**[df, embarked_dummies]**, axis=1)的输出

2.6 将数据帧传递给 get_dummies()

我们已经向get_dummies()传递了一个序列,但我们将传递一个数据帧。

df = load_data() # reset dataframe
df = pd.get_dummies(**df**, **columns=['Sex', 'Embarked']**)

df是一个数据帧。我们传递给columns一个列表,并告诉它性别已出发是我们想要虚拟的列。

通过运行df.head(),我们可以看到原来的列和上船列不见了,取而代之的是虚拟列。

好了

感谢阅读。

请在我的 Github 上查看笔记本的源代码。

如果你对机器学习的实用方面感兴趣,请继续关注。

参考

  • [1] 维基百科中的分类变量
  • [2] 为什么机器学习中的一键编码
  • [3] 一键式编码会让你焦头烂额吗

什么是运筹学?

原文:https://towardsdatascience.com/what-is-operations-research-1541fb6f4963?source=collection_archive---------1-----------------------

俯视一个非常优化的停车场。伊万娜·卡金娜在 Unsplash 上的照片

运筹学领域的综合介绍

运筹学导论

运筹学,也称为决策科学或运营分析,是将数学应用于商业问题的研究。作为应用数学的一个子领域,它与数据科学和机器学习等其他领域一样,有着非常有趣的地位。

运筹学回答哪些问题?

在进入运筹学的真正定义之前,让我们看几个应用例子。正如您将看到的,它们都有一些共同点:我们将在后面讨论。

运筹学实例:

1.线性规划

如果你在学校上过数学课,你可能遇到过线性方程,你可能已经学会了如何用纸和笔来解决这些问题。线性规划是一种用线性目标函数解决线性约束系统的优化技术。这是运筹学中最著名的方法。

排队论:避免排长队,也避免人浮于事。照片由哈尔·盖特伍德在 Unsplash 拍摄

2.等待线理论或排队论。

运筹学的第二个课题是排队论。也许没有前面的例子那么明显,但是排队也可以用数学术语完美地描述。一旦做到这一点,排队论允许企业了解并改善客户的排队时间,同时进行劳动力管理。

排队论的另一个重要应用是计算机操作系统的任务调度,尽管这与本文讨论的其他应用相差甚远。

3。库存控制系统

运筹学解决的下一个课题是库存控制。公司的库存控制是复杂的,取决于许多决策,例如采购、仓储、运输、跟踪等等。

库存控制系统重新组合不同的解决方案,解决一个组织的全部库存任务。库存管理最常用的算法是经济订货量(EOQ)、库存生产量(IPQ)和 ABC 分析法。如果你想更深入地了解库存管理,你绝对应该看看这些。

4。更换问题

我希望在这一点上,运筹学中处理的问题类型已经对你越来越清楚了。更换问题与前面的比较:优化更换已知使用一定时间后失效的材料。对于机器、汽车、电脑等昂贵的物品,如果更换得太晚,公司会付出巨大的代价,如果更换得太早,也会付出巨大的代价。因此,这也是一个用运筹学优化的好问题。

5.网络分析

网络分析是一个与前面列出的项目相对不同的主题。

在网络分析中,应用程序被表示为要优化的图。在一般的图论中,图是由节点和边组成的。每个节点是一个点,每条边表示某些不同节点之间是否有联系。这类数据的一个很好的例子是社交媒体网络,其中每个人(个人资料)被表示为一个节点,每个友谊关系被表示为一条边。

道路网络可以用图形来表示。 Denys Nevozhai 在 Unsplash 上拍照。

在运筹学中使用它的一个例子是项目管理。当谈到项目管理时,我们可能都知道著名的甘特图,它允许对项目中的步骤和步骤之间的依赖关系进行更多的概述。

但是每当一个项目非常复杂时,任务之间就会有许多依赖关系:如此多的依赖关系使得确定最佳路径变得复杂。运筹学的两种方法是关键路径法(CPM)和项目评估和评审技术(PERT)法。

借助运筹学,将您的货物摆放整齐。Guillaume Bolduc 在 Unsplash 上拍摄的照片

6.排序问题

我最后想列出排序问题。本主题讨论如何定义大量操作的顺序,以便用有限的资源执行这些操作。在这种情况下,我们可以从许多不同的执行顺序中进行选择,我们希望确保选择最佳顺序。根据所选的成本函数,您可以优化操作的总持续时间或成本或收益。

许多排序方法是先来先服务(FCFS)、最短处理时间(SPC)、最早到期日(EDD)等等。

尽管运筹学的应用越来越多,但我认为总体思路现在已经很清楚了,我将继续对这一主题进行更正式的描述。

运筹学的定义

运筹学使用数学和统计学来回答最优化和模拟问题。每当我们将一个商业问题转化为优化问题时,最基本的是我们有一个最小化成本或最大化收益的清晰定义。

任何运筹学课题的三大关键:

1.算法和统计

我已经在上面写了:运筹学将严重依赖算法、数学和统计学。运筹学中一个非常重要的算法家族是优化算法:在给定一组可能性的情况下,试图找到最大值或最小值的算法。

作为这方面的一个例子,我们可以使用一个优化算法来最小化工厂的人员配备成本,给定一组对所需人员数量的约束,以及对每个员工的约束。

2.最佳化

考虑到潜在的实际限制,找到问题的最佳解决方案。优化可以是在开始之前就决定的成本或收益的最大化或最小化。

优化。照片由艾萨克·史密斯在 Unsplash 拍摄。

有可能有多个目标,在这种情况下,我们可以通过应用不同成本的权重来定义组合成本函数(例如,将两个成本之和最小化可以是组合成本函数的一个示例)。

在这些优化中,第二个经常出现的问题是约束。有时,寻求成本最小化的算法可能会以实际上不可能的方式寻找解决方案。例如,当寻找最佳员工计划时,我们希望约束算法来计划 24 小时轮班的人员,因为这是非法的。

3.模拟

模拟实际上是一项类似于优化的任务。与其问算法什么是最好的员工计划,我们还可以问算法改变计划会有什么影响。这种类型的任务接近优化,因为我们可以简单地使用不同输入配置的优化算法来模拟不同输入的最佳结果。

简而言之,运筹学是将数学应用于商业问题,目标是优化和/或模拟。我希望这篇文章已经为你澄清了一些事情。感谢您的阅读,请不要犹豫,继续关注更多内容!

什么是光学音乐识别?

原文:https://towardsdatascience.com/what-is-optical-music-recognition-6515d8a53e01?source=collection_archive---------33-----------------------

我们能让机器读懂音乐吗?

我一直热衷于获取计算机视觉方面的知识,同样,音乐也是我生活中很重要的一部分。结合起来,它们构成了一个伟大的研究问题!四个月前,我开始了为期四年的博士课程。到目前为止,就我学到的知识和学习更多知识的热情而言,这是一次疯狂的旅程。

由莎拉在 Unsplash 上拍摄的照片

我正在进行的研究问题是光学音乐识别(OMR),更明确地说,是调查深度学习是否可以帮助提高当前方法的性能。

为了让你们更好地理解这个问题,我将尝试阐明什么是 OMR,所使用的传统方法以及未来需要解决的主要问题。

到目前为止,我们大多数人大概都用过谷歌翻译和它的相机翻译功能。仅仅是拍一张文字的照片,我们就节省了时间,也避免了学习中文或其他语言。现在让我们想想这个特性如何应用于音乐。音乐家仍然在乐谱或白纸上写作。然而,如果他们想分享他们的音乐,他们必须把它转录到电脑里。计算机可读的音乐文件将更容易访问。因此,这项研究背后的动机是允许作曲家、音乐家不仅通过拍摄活页乐谱的照片来转录和编辑音乐,而且最终分享和演奏他们的作品。OMR 还将协助音乐统计,并使搜索符号,类似于搜索文本。

卡尔沃-萨拉戈萨等人对 OMR 给出了一个非常清晰和包容的定义,称之为一个研究领域而不是一个简单的问题。

光学音乐识别是研究如何通过计算读取文档中的音乐符号的研究领域。

定义的第二部分强调了 “通过计算读取文档中的音乐符号” ,假设它是由计算机(而不是人类)执行的,它不涉及音乐符号模型本身,但它建立在这一知识的基础上。此外,它强调了由这些系统捕获的信息,我将在下面的部分中更详细地解释这些信息。

该研究领域于 20 世纪 60 年代末在麻省理工学院建立,使用扫描印刷的乐谱。该领域的先驱是藤永一郎、尼古拉斯·卡特、吴起亚、大卫·班布里奇和蒂姆·贝尔。他们的工作仍然是今天研究的极好基础。OMR 与音乐信息检索、计算机视觉和文档分析等其他领域相关。

根据已开展的研究,形成了反映解决问题方法的标准管道(见图 1)。

图一。标准的 OMR 管道(图片由作者提供)

这个管道的通常输入是打印/手写乐谱的扫描/图片。这些图像然后经受图像处理技术。这些技术包括二值化(黑和白)、模糊、去歪斜(旋转),并且将有助于减少图像中的噪声。

增强的图像接下来将用于音乐对象识别。在这一步中,算法将尝试识别音乐对象,如谱号、音符头、小节、圆滑线等。在这个阶段,对象是原语,并与它们的语义相分离。

图二。用更快的 R-CCN 检测物体(来源:https://github.com/apacha/MusicObjectDetector-TF

因此,下一步试图重建这些原语之间的关系以及语义。这种方法基于音乐中存在的语法规则重建语义。

最终输出可以表示输入中乐谱的音乐含义和描述,并且是机器可读的。这些文件的常用格式可以是 MIDI、MusicXML、MEI 等。

文件格式输出示例(图片由作者提供)

我们希望利用深度学习(DL)来探索执行这些步骤的新方法。大多数 DL 模型建立在人工神经网络上。这些网络受到生物神经网络的启发。它们由许多层组成,这些层具有所谓的节点;它们包含一个输入层、一个或多个隐藏层和输出层。越深入,模型可以学习和提取的复杂特征就越多。中间的隐藏层通常被称为“黑盒”这是因为我们不容易理解内部发生了什么,尽管新的研究正在关注这一点。

我们计划首先在 OMR 的第二阶段,即音乐对象检测中应用这种方法。要做到这一点,我们需要一个包含乐谱图像的庞大数据集。这个数据集还应该有一个基础事实,以便模型可以从中很好地学习。一部分数据,称为测试数据,不应该被模型看到。通过这种方式,我们可以评估模型在它从未见过的事物上做得有多好。这个模型应该根据实验的性质、输入和期望的输出来设计。我们还建议将输入、输出及其评估的格式标准化。

参考资料:

A.雷贝洛、I. Fujinaga、F. Paszkiewicz、A. R. S. Marcal、C. Guedes 和 J. S. Cardoso,“光学音乐识别:最新技术和开放问题”, Int J Multimed Info Retr ,第 1 卷,第 3 期,第 173-190 页,2012 年 10 月。【在线】。可用信息:http://link . springer . com/10.1007/s 13735–012–0004–6

J.Calvo-Zaragoza,J. Hajicˇ Jr .,A. Pacha,《理解光学音乐识别》,arXiv:1908.03608【cs,eess】,2019 年 8 月,arXiv:1908.03608。【在线】。可用:【http://arxiv.org/abs/】T41908.03608

帕查、亚历山大、扬·哈吉和豪尔赫·卡尔沃-萨拉戈萨。"深度学习的一般音乐对象检测的基线."应用科学 8.9 (2018): 1488。

p 值是什么的简称?

原文:https://towardsdatascience.com/what-is-p-value-short-for-no-seriously-c548200660a?source=collection_archive---------7-----------------------

重命名那个讨厌的小数字,并重新学习如何使用它

p 代表概率吗?

从技术上讲, p 值代表概率值,但是由于所有的统计都是关于处理概率决策,这可能是我们能给它的最没用的名字。

相反,这里有一些更有趣的候选人名字供你娱乐。

痛苦值:他们让你在课堂上计算,没有给你适当的解释;难怪你的大脑会受伤。这一类的荣誉奖还包括困惑值困惑值惩罚值

讨厌的值/有问题的值:统计学家已经厌倦了看到无知的人滥用 p 值,他们中的一些人希望看到 p 值被废除。他们希望他们可以震撼人们,大喊,“这是个人决策的工具,而不是你认为的那种其他的东西!”

**说服价值:**我一会儿会解释,试图用 p 值来说服某人是一个危险的赌注,你的受害者比你更无知。如果你打算诉诸 p 值来增加你的信息的趣味,我可以建议你用拉丁文重写你所有的论点吗?

**可发表的价值:**说到滥用 p 值的方法,如果你是那些“科学家”中的一员,毫无悔意地折磨(“p-hacking”)你的数据,直到它承认你认为会给学术期刊的审稿人留下深刻印象的那种 p 值,你就是问题的一部分,而不是解决方案。

如果你认为学术界是唯一一个你的薪水取决于你创造好看的 p 值的地方,那你再想想吧!

**妙语值:**经典统计推断归结为问 “我们收集的证据是否让原假设看起来很可笑?”p 值是笑点,用一个小数字总结了这个大测试问题的答案。

**似真值:**p 值越高,你的证据看起来就越可信,在这个世界里,我们不会完全疯狂地坚持我们的默认行为。请注意,这是关于你的证据在一个特定的世界中的合理性…而不是那个世界本身的合理性!

**被动值:**你的 p 值越高,你改变主意的理由就越少。继续做你被动计划要做的事情。要了解原因,请继续阅读。(但请记住,缺乏证据与缺乏证据并不是一回事。无声烟雾报警器并不总是意味着没有火灾。)

如果你喜欢视频,这里是第一部分:什么是 p 值?这可能会让你认为 p 可能是“小狗”的简称…

p 代表笑点!

还记得我们如何把统计推断归结为一句话吗?那是:

我们收集的证据让我们的零假设看起来可笑吗?

p 值是这个问题的笑点。它用一个小数字总结了答案。p 值越低,零假设看起来越荒谬!

那么,我们如何把答案变成是或不是呢?我们只是提前设定了一个门槛,来表明什么事情可笑到足以改变我们的想法。该阈值的别称是 显著性水平 。如果 p 值低于它,那就改变你的想法。如果没有,继续做默认情况下你乐意做的事情。

是什么和它做什么

p 值的一个奇妙之处在于,它们使用起来很简单,而且相对安全……如果你为你的零假设和假设选择了正确的测试。(这是一个很大的如果!)但是不要忘记,你刚刚学到的是他们的事,而不是他们的事。

不要犯试图在简洁的一行程序中理解它们是什么的错误。

它们一些奇怪的东西:关于一个特定假想宇宙中样本的概率陈述。它们绝对不是你想要它们成为的那种直截了当的东西;它们不是为了直观解释或简洁描述而设计的。它们是用来读取假设检验的输出的。

那么,他们是什么*?要明白这一点,你需要理解我们是如何计算它们的。我已经在我的其他文章中写过,例如这里,所以我将坚持在这里总结一下。*

总结:如何获得 p 值?

计算 p 值有五个步骤。

  1. 选择默认动作。
  2. 陈述零假设。
  3. 陈述关于零假设所描述的世界如何运作的假设。
  4. 制作一个世界模型(使用方程式或模拟)——这是统计学家的主要工作。
  5. 找出这个世界咳出证据的概率至少和我们在现实生活数据中看到的一样糟糕。

第 2 部分:如何获得 p 值?

总结:你如何使用 p 值?

  1. 将其与 显著性水平 进行比较。
  2. 如果 p 值低于显著性水平**,请改变您的想法。否则,只要继续做你打算做的事情,如果你从来没有分析过任何数据。**

如何使用 p 值来获得假设检验的结果。(没有人会怀疑我的 xkcd 是山寨货。缺乏幽默不会引起任何人的警觉。)

第 3 部分:如何使用 p 值?

总结:简短说明

一个 p 值问道,“如果我生活在一个我应该采取我的 默认动作 的世界里,我的证据有多令人惊讶?”p 值越高,我对坚持计划行动的感觉就越不荒谬。如果 p 值足够低,我会改变主意,做点别的。

争议值/极化值: 如果你想了解关于 p 值争议 并阅读我对 p 值原因的所有情绪的看法,请查看本系列的下一篇文章: 为什么 p 值像针一样?

第 4 部分:用这个总结来检验你的理解!

使用 p 值的最安全方式

为了解释 p 值,您必须了解假设和零假设的每个细节。如果你得不到这些信息,那么对低 p 值的唯一有效解释就是:“有人对某事感到惊讶。”如果你不太了解正在讨论的某人某事*,让我们都来思考一下这能告诉你多少。*

将低 p 值解释为:“某人对某事感到惊讶。”

试图用 p 值来说服某人是一个危险的赌注,你的受害者比你更无知。那些明白这是什么的人可能不会欣赏你试图侮辱他们的智慧。

感谢阅读!人工智能课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

在这里欣赏整个课程播放列表:bit.ly/machinefriend

与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。

什么是流程挖掘?

原文:https://towardsdatascience.com/what-is-process-mining-8afae06b5c33?source=collection_archive---------25-----------------------

弗兰基·查马基在 Unsplash 上拍摄的照片

一种分析方法,旨在基于事实数据构建详尽客观的流程愿景

背景和问题

在企业环境中,许多业务流程部分甚至完全由 IT 系统支持:流程的数字化代表越来越多的活动,由越来越多的系统支持,产生越来越多的数据。

话虽如此,询问研究过程的传统方法是否仍然足够是合理的:

  • 记录目标流程的愿景是否足以让流程在实践中得以实施
  • 当察觉到与模型的偏差时,从主观角度寻求团队一致意见是否是最佳选择?
  • 是否可以测量流程从开始到结束的实际执行速度

过程挖掘提供了一种新的方法来考虑这些因素。

第一个定义

流程挖掘是一种分析方法,旨在基于事实数据构建详尽且客观的流程愿景

流程挖掘处于数据挖掘和业务流程管理的十字路口

因此,过程挖掘是一种高附加值的方法,当涉及到建立一个过程的实际实施的观点,并确定与理想过程的偏差,瓶颈和潜在的过程优化时。

它是如何工作的?

无论流程的性质如何,一旦得到数字工具的支持,信息就会被相应的 it 系统 (ERP、业务应用程序等)创建和存储。),尤其是通过应用程序日志。这些存储的信息通常具有相似性,并使得**有可能在不同的时间通过不同的阶段来追踪“物体”**的路径。

流程挖掘基于工具,这些工具使用这些数字足迹来重建、可视化和分析流程,从而为真实流程提供透明度和客观性。

流程分析基于应用程序日志

所需数据

为了可用,这些数字足迹必须至少包括:

  • Object :在整个流程中被跟踪的实例,具有唯一的标识符。这个对象的选择影响了所研究过程的范围
  • 活动:学习过程中的一个步骤。活动的选择会影响流程的粒度
  • 日期:决定活动的顺序和时间

此外,根据流程收集额外数据可能会很有趣,例如:供应商、产品类型、位置、人员/管理、渠道、价值……这些将允许进一步调查

过程可视化和分析

从这些数据中,可以看到理想过程的表示和所有偏差**。这样可以及早发现流程中潜在的低效率。**

除了过程的表示,还可以查看每个步骤的执行时间,或者查看更有限的范围,以便识别过程在哪里、何时以及为什么偏离其理想版本

采购流程示例

对于由 4 个步骤组成的简化采购流程(“记录订单”、“接收货物”、“记录发票”和“支付发票”),订单遵循的流程可从 ERP 中留下的数字**足迹**中追溯。

剥削数字脚印:

过程可视化:

您会很快注意到,与遵循理想流程的**订单 1** (黑色)相比,其他两个订单出现了偏差:

  • **订单 2** (紫色)之后是一个额外的步骤:“更改价格”。
  • **顺序 3** (蓝色)遵循正确的步骤,但顺序不理想

使用案例和优势

流程挖掘有三个主要用例:

  1. 发现:在没有先验模型的情况下,构建现有流程的愿景
  2. 验证正确实施和分析与先前模型的偏差
  3. 流程改进

在所有这三种情况下,基于客观和详尽的数据的对过程的实际实现的理解,使得过程挖掘方法更有价值。

此外,该方法代表了流程管理领域的改进:

  • 加速研究(限制花费的时间和访谈次数)以建立现有流程的代表性
  • 在测量中考虑更多的数据,甚至数据的穷尽性
  • 一旦设计了新流程,就有机会确保有效管理其使用并看到改进

流程挖掘并不致力于特定的活动领域:这种方法将能够在流程被实施和研究的任何地方带来价值。在一家公司内,几个职能部门可能对这种方法感兴趣:

  • 卓越运营团队:补充已经使用的方法(精益、六适马等)。)
  • 数据科学家:数据的可视化表示以产生新的见解
  • 流程经理:补充其专家视野的事实分析
  • CIO:系统使用的远景和相应的用户路径
  • 审计或内部控制:更快的分析和依赖案例的详尽性而不是样本的可能性

关键成功因素

为了获得好的结果,流程挖掘计划的启动需要一些预防措施。可以注意到,重要的是:

  • 从一开始就确定增值目标:降低成本、改善用户/客户体验…
  • 从过程角度定义明确的研究范围
  • 在固定的总时限内,用短周期分析反复操作
  • 确保研究所依据的数据的质量。要做到这一点,与所用系统的 it 专家以及所研究流程的业务专家合作是必不可少的
  • 在目标过程重新定义的情况下,伴随的改变

此外,Process Mining 进行的分析本身并不是目的,而是作为进一步流程研究的实际起点。重新引入人的方面,例如通过使用设计思维方法,使得通过考虑最终用户来深化通过流程挖掘获得的结果成为可能

来源

PyTorch 是什么?

原文:https://towardsdatascience.com/what-is-pytorch-a84e4559f0e3?source=collection_archive---------13-----------------------

想想 Numpy,但是有强大的 GPU 加速

介绍

PyTorch 是一个 Python 程序库,方便构建深度学习项目。我们喜欢 Python,因为它易于阅读和理解。PyTorch 强调灵活性,允许深度学习模型用惯用 Python 表达。

简单一句话,想想 Numpy,但是有强大的 GPU 加速。更好的是,PyTorch 支持动态计算图,允许你动态改变网络行为,不像 Tensorflow 等框架中使用的静态图。

为什么是 PyTorch?

GPU 上类似 NumPy 的数组

-动态计算图

-是蟒蛇皮!

检索自 PyTorch Github

入门指南

PyTorch 可以在 macOS 上安装和使用。为了利用 PyTorch 的 CUDA 支持的全部能力,建议但不要求使用 NVIDIA GPU。

用 Anaconda 安装

conda install pytorch torchvision -c pytorch

使用 pip 安装

pip3 install torch torchvision

如果你在安装上有任何问题,在这里找到更多关于安装 PyTorch 的不同方法。

如果你的电脑中没有 NVIDIA GPU,那么使用 Google Colab 来利用其免费的 GPU 功能吧!点击左上方的新笔记本开始。

记得在运行笔记本之前将运行时类型更改为 GPU

想想 Numpy 但是有强大的 GPU 加速!

你熟悉 Numpy 吗?太好了!您只需要将使用 on Numpy 的语法转换为 PyTorch 的语法。如果你不熟悉 Numpy,PyTorch 的编写方式非常直观,你可以在几秒钟内学会。

导入两个库以比较它们的结果和性能

import torchimport numpy

张量

PyTorch 张量类似于 NumPy ndarrays,可以选择在 GPU 上运行。

>>> numpy.array([[0.1, 1.2], [2.2, 3.1], [4.9, 5.2]])array([[0.1, 1.2],
       [2.2, 3.1],
       [4.9, 5.2]])>>> torch.tensor([[0.1, 1.2], [2.2, 3.1], [4.9, 5.2]])tensor([[0.1000, 1.2000],
        [2.2000, 3.1000],
        [4.9000, 5.2000]])

我们在这里看到了什么?tensor代替了array.还记得我们喜欢的np.empty()np.random.randn()np.zeros()np.ones()吗?PyTorch 可以应用相同的函数和语法

w = torch.empty(3, 3)
print(w,'**\n**', w.shape, '**\n**')x = torch.randn(3, 3, 7)
print(x,'**\n**', x.shape, '**\n**')y = torch.zeros(3, 3)
print(y,'**\n**', y.shape, '**\n**')z = torch.ones(3, 3)
print(z,'**\n**', z.shape, '**\n**')[0., 0., 3., 0., 0.],         
        [4., 0., 5., 0., 0.],         
        [0., 0., 0., 0., 0.]

形状和视图

view()方法改变形状

>>> x = torch.rand(100,50)
>>> print(x.shape)
torch.Size([100, 50])>>> y=x.view(20,5,50)
>>> print(y.shape)
torch.Size([20, 5, 50])>>> z=x.view(-1,5,50)
>>> print(z.shape)
torch.Size([20, 5, 50])

CPU 和 GPU 中的张量

GPU(图形处理单元)由数百个更简单的核心组成,这使得训练深度学习模型的速度快得多。下面是 GPU 和 CPU 的快速对比。

来源

无论我们决定使用 GPU 还是 CPU,PyTorch 都可以让我们轻松地在两者之间切换

cpu=torch.device("cpu")
gpu=torch.device("cuda:0") # GPU 0# Create tensor with CPU
x=torch.ones(3,3, device=cpu)
print("CPU:",x.device)x=torch.ones(3,3, device=gpu)
print("GPU:",x.device)x=torch.ones(3,3).cuda(0)
print("CPU to GPU:",x.device)x=torch.ones(3,3, device=gpu).cpu()
print("GPU to CPU:",x.device)

比较 CPU 和 GPU 的时间

CPU 时间

>>> import time
>>> x=torch.rand(10000,10000)
>>> y=torch.rand(10000,10000)>>> t = time.time()
>>> z=x@y
>>> t = time.time()-t
>>> print(t)6.999474763870239

GPU 中的时间

>>> yc=y.cuda(0)
>>> t = time.time()
>>> z=xc@yc
>>> t = time.time()-t
>>> print(t)0.4787747859954834

对于简单的矩阵乘法,它比 Numpy 快 15 倍!

NumPy 呼叫 PyTorch

既然 NumPy 和 PyTorch 真的很像,那么有没有方法可以把 NumPy 数组改成 PyTorch 数组,反之亦然?是啊!

a = np.ones(5)#From NumPy to Torchb = torch.from_numpy(a)print('a:',a)print('b:',b)

PyTorch 的亲笔签名

什么是亲笔签名?还记得在你的微积分课上,你需要计算一个函数的导数吗?梯度类似于导数,但是是矢量形式。计算神经网络中的损失函数是很重要的。但是由于维数很高,通过求解数学方程来计算如此大的复合函数的梯度是不切实际的。幸运的是,PyTorch 可以在几秒钟内找到这个梯度的数值!

假设我们想求下面向量的梯度。我们期望 y 的梯度为 x,用张量求梯度,检查是否得到正确答案。

厉害!梯度是 x,和我们预期的一样。分解上述代码:

  • requires_grad = True允许有效的梯度计算。如果我们知道我们将计算基于 x 的梯度,我们需要为输入设置.requires_grad = True。点击了解更多关于亲笔签名的工作方式。
  • y.backward()数值计算梯度
  • x.grad()返回 y 在 x 点的梯度

例子

让我们通过一个分类示例来了解如何使用 PyTorch。我们的任务是找到一个点是否在黄色或紫色的簇中

首先构建一个用于构建神经网络的 PyTorch 模块的子类nn.Module,

将数据分为训练集和测试集

训练数据

预测和评估预测

结论

恭喜你!您刚刚学习了 PyTorch 是什么以及如何使用它。本文只是对 PyTorch 的一个委婉的介绍。我希望你从这篇文章中获得的是,深度学习可以通过这个工具变得简单高效。要了解更多关于如何将 PyTorch 用于您的深度学习项目,我推荐查看这本伟大的书: 用 PyTorch 进行深度学习 *,*了解 PyTorch 的最佳资源之一。

在这个 Github repo 中,您可以随意使用本文的代码。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 用美丽的声音抓取维基百科

关于如何使用 Beautiful Soup 的分步教程,这是一个用于 web 抓取的简单易用的 Python 库

towardsdatascience.com](/step-by-step-tutorial-web-scraping-wikipedia-with-beautifulsoup-48d7f2dfa52d) [## 如何用 Word2Vec 解决类比问题

美国之于加拿大,就像汉堡之于 _?

towardsdatascience.com](/how-to-solve-analogies-with-word2vec-6ebaf2354009) [## 如何用 Faker 创建假数据

您可以收集数据或创建自己的数据

towardsdatascience.com](/how-to-create-fake-data-with-faker-a835e5b7a9d9) [## 如何用 Python 对 Tweets 进行标记

我们应该选择 TweetTokenizers 还是其他 4 种常见的 Tokenizers?

towardsdatascience.com](/an-introduction-to-tweettokenizer-for-processing-tweets-9879389f8fe7) [## 用这 6 个小窍门提高你的效率

并控制您的阵列

towardsdatascience.com](/boost-your-efficiency-with-these-6-numpy-tricks-29ca2fe81ecd)

什么是推理?

原文:https://towardsdatascience.com/what-is-reasoning-526103fd217?source=collection_archive---------38-----------------------

布雷特·乔丹在 Unsplash 上的照片

(这是人工智能推理系列的第一部分)

前阵子我在 AI 写了一篇关于 六个容易和不那么容易的棋子的文章。推理是我不太容易完成的清单上的第一项。在这一系列文章中,我将仔细研究推理——它是什么,为什么它很重要,以及它与当前流行的机器学习有何不同。沿着这条路,我追溯了计算推理的历史,并强调了一些今天仍然相关的重要思想和系统。

从 20 世纪 60 年代开始,人工智能研究分成了两个阵营——基于规则的系统和机器学习等经典方法。早期的优势属于古典技术。但是,特别是在过去几十年里,这一趋势几乎完全逆转,机器学习成为人工智能重大进步的主要来源。ML 是如此的成功,以至于它成为了视觉、听觉和语言应用的主流。但是,像推理这样更复杂的任务仍然远远超出了今天可能实现的舒适区。另一方面,经典方法几乎只关注像推理这样的高阶问题。我相信我们现在正处于一个拐点——经典和机器学习方法已经足够发展,将它们结合在一起可以将人工智能推向下一个水平。

人工智能现在可以做一些惊人的事情。它可以回答我们的问题,驾驶我们的汽车,让世界领导人唱歌,从一张照片中创作电影,甚至创作艺术。所有这些能力都是预测的例子——以图像、音频或文本作为输入,并返回类别、文本或控制命令作为输出。这些类型的预测不是微不足道的,可以是任意复杂的管道的结果,并使用控制系统、传统机器学习和深度学习的方法的组合。但在所有情况下,这些管道中的步骤都是固定的(尽管它们可能被跳过),并且产生的模型(或管道)针对非常狭窄的问题(问题回答、图像分类、控制车辆)。你不能让一个问答模型来控制一辆汽车,或者让一个玩游戏的模型来检测核磁共振成像中的肿瘤。今天的每个人工智能都是专门构建的,并经过大量训练来实现那一个(狭窄的)功能。

现在将这与人类大脑的工作方式进行比较——我们可以开车、煮咖啡、回答问题、玩视频游戏,最重要的是,学会做非常不同的新事物。我们甚至可以学习用不同的方式完成旧的任务。我们从很少的例子中学会做这些工作,同时在不断做的过程中不断变得更好。

AlphaGo (Alphastar)怎么样?

AlphaGo 是我们理解如何构建可以学习复杂任务的机器学习模型的一个巨大成就。AlphaGo 使用了过去二十年中最成功的发现之一——深度神经网络——它有效地使用这些网络来学习如何求解围棋。但是,有人坐下来制定了训练 AlphaGo 学习如何玩围棋的网络和强化学习策略。在它成为最擅长围棋的人之后,AlphaGo 不得不完全重做,以创建 AlphaStar,即玩星际争霸 2 的人工智能。(L 墨迹到 AlphaGo 如何工作的简单解释

那么推理有什么不同呢?

最简单地说,推理可以被认为在复杂性上至少比预测高一个级别——如果预测是在给定正确的架构和管道的情况下训练模型,那么推理就是找出架构和管道本身。换句话说,如果问题的解决方案是一系列预测(和其他工程)步骤,那么推理就是构建这些步骤序列的能力。推理可以应用于许多不同类型的任务。当你思考如何做某事时,这被称为解决问题。当你对某事为什么会发生进行推理时,这被称为因果推理

为什么推理比预测更难?

直觉上,在训练这个序列的基础上构建一个步骤序列比训练本身更困难是有道理的。但是为了理解推理有多困难,我们必须使用一个类比…考虑制作咖啡的问题。给定咖啡机、牛奶、咖啡豆、研磨机、起泡器和一套操作说明,制作拿铁咖啡只是找到每种成分的正确用量的问题(咖啡的量、研磨机上的毛刺、使用多少牛奶、起泡多长时间、牛奶与泡沫的比例等等)。这一步需要一些尝试和错误,但经过几次尝试后,你就可以做对了。预测也差不多。你会得到一堆资源和如何使用它们以及使用顺序的说明,而预测是找到每种成分的正确用量的过程。

现在想象一下,你只是得到了制作咖啡的原料和工具。你不能把水倒在豆子上。你加热水,研磨咖啡豆,把咖啡放在杯子上的过滤器里,然后把水倒在咖啡豆上。你不能简单地独立于牛奶运行起泡机,你必须确保起泡机在牛奶中才能产生泡沫。这个问题肯定更难,是关于 autoML 工作的水平。

但是如果你连原料和工具都没有呢?有人给你指了一家咖啡店(或超市)的方向,让你去煮咖啡。你必须选择正确的原料,正确的工具,正确的设置,并找到每种原料的正确数量,才能在堆满东西的咖啡馆(或仓库)里制作咖啡。这就是推理的复杂性。

那么,什么是推理呢?

我将谈论推理的技术方面,包括表示和问题空间、策略、奖励和损失函数,当然还有 AutoML。但是现在,我想保持它的简单,并提供一个技术/算法/模型应该满足的四个品质来作为一个推理系统。

推理系统的四个品质:

  1. 它是一个独立的模型或系统
  2. 可以解决新问题
  3. 从有限数量的试验来看
  4. 同时通过练习变得更好。

所谓自包含,我只是说它不需要为不同的任务进行外部修改(由建模师/程序员/用户/科学家)。它可以是模型、算法或系统的集合,只要它在学习新任务时不被触及。

它应该能够解决以前从未见过的问题,无论是通过例子,或指令,甚至是试错法。

它应该在有限的时间范围内从少量的例子中解决这些新问题

最后,它应该通过实践变得更好。我们之前没有谈到这个质量,但这是必要的,因为质量 1-3 可以通过反复试验来实现(对于大值的 *limited)* 。

预测、推断和推理之间有什么区别

预测就是模式匹配。给定大量数据,预测学会将输入映射到输出。

推理是产生新信息的过程。这是一个没有目标的自动过程。它就像一台机器,接受输入,然后简单地把新信息作为输出。

推理是有目标的(或目标导向的)推理,其中输入被仔细地选择、组织,并且推理机制被创造性地用于产生期望的结果。

为什么专注于推理?

机器学习已经非常擅长预测任务,尤其是当问题定义明确并且有大量数据可用时。但是这些系统非常脆弱,容易受到敌对攻击,并且不能优雅地降级。让他们更有弹性的一个方法是通过识别和从失败中恢复的方法来增强他们的能力,这涉及到在没有外部机构的情况下尝试解决新出现的问题。

晁盖艾怎么了?

针对我上面列出的每一个品质,ML 中正在进行研究——终身学习以建立一个学习多项任务的单一模型,一次和零次学习以从有限的数据中解决新问题,各种各样的 RL 技术允许代理通过重复变得更好,autoML 技术试图学习最有效的管道来解决问题,等等。但事实仍然是,在这些系统目前的能力和构建能够推理的系统所需的能力之间存在巨大差距。

几十年来,经典人工智能一直在研究这个问题,并且有许多系统可以在比 ML 更大的领域中进行推理。更重要的是,经典 AI 和 ML 优势互补。经典人工智能擅长处理离散的信息单元,但无法将这些单元与像素和音频世界联系起来。ML 擅长将像素、音频流和字符转换成其他离散的信息单元,但不擅长操作它们。缺少的是这些系统彼此之间不能很好地交流。深度神经网络等 ML 技术产生的离散单元不是经典技术使用的那种单元。

鉴于经典人工智能在推理方面的成功和 ML 在感知和行动方面的成功,现在似乎是从经典人工智能的角度重新审视推理的好时机,看看我们可以从以前的成功和失败中学到什么。

这个系列的下一步是什么?

我知道我想在哪里结束这个系列——通过介绍目前正在做的结合这两种方法的一些工作,但是我不清楚我想在这里和那里之间走哪条路。在经典人工智能中,我想谈论的话题很少,包括表示、不同种类的推理、逻辑系统、物理符号系统和认知架构。我希望在接下来的几篇文章中,从经典人工智能的简史开始,浏览这些主题。

免责声明:本文表达的观点是我个人的,不一定代表我的雇主的观点。

你可以在我很少发帖子的 Medium 上关注我,也可以在我很少发微博的 Twitter (@manashastram)上关注我。:)

使用岭、套索和弹性网回归进行正则化

原文:https://towardsdatascience.com/what-is-regularization-and-how-do-i-use-it-f7008b5a68c6?source=collection_archive---------37-----------------------

概述 3 种常见正则化技术的差异-山脊、套索和弹性网。

你已经训练了一个回归模型,你的 R 回来了,看起来很好——几乎好得不能再好了。当然,下一个合乎逻辑的步骤是看看测试数据集的进展如何。剧透警告:它不会有接近成功的训练集。

这是一种相当普遍的现象,被称为“过拟合”。过度拟合有一个相反的极性,叫做欠拟合。用专业术语来说,过度拟合意味着你建立的模型的参数比数据能够证明的要多。点击此链接查看包含这篇博文笔记本的 GitHub 资源库。

与计算机打交道有一种让我们脱离现实的方式,过度拟合/欠拟合模型就是证明。例如,在建筑中,计算机辅助设计(CAD)使绘图员能够画出极限公差,例如 0.001 英寸。如果你画一个平面图,告诉挖掘机挖一个 34.963 英寸深的沟渠,你真的能指望重型机械有那种精度吗?你能指望一个在野外工作的木匠把木材切割到 0.001 英寸吗?凭经验我可以告诉你,这是不会发生的。沟渠大约有 36 英寸(3 英尺)深,木板可能会被修圆到最接近的 1/8 英寸,或者如果你幸运的话,1/16 英寸。这是一个现实世界中经常发生的过度拟合计算机模型计算的例子。

一个真实世界的欠拟合例子是一个煤气炉,它只有两个输入设置,最大热和关。因为你产出的食物要么被烤焦了,要么还是生的,所以你几乎不可能把任何东西都煮熟。

你可能会问*所有这些与正规化有什么关系?*答案是一切。通过降低模型对训练数据中某些噪声的敏感度,向模型中添加适量的偏差有助于做出更准确的预测。

点击图片阅读更多 Sci-Kit Learn

在蓝点上方的图中,是来自现实世界的样本数据点。这些样本与黄线的距离,即“真实函数”,被称为数据的“噪声”。样本点到蓝线的距离被称为我们模型的“误差”。

# Equation of True Function
**def** true_fun(X):
    **return** [np.cos](https://docs.scipy.org/doc/numpy/reference/generated/numpy.cos.html#numpy.cos)(1.5 * [np.pi](https://docs.scipy.org/doc/numpy/reference/constants.html#numpy.pi) * X)

欠拟合模型的预测根本不能解释真实函数的样本数据。真实函数比一个一次的简单线性方程更复杂。如果你需要复习如何确定多项式函数的次数,请参考这个网站。

这个模型的一个很好的类比是,在多项选择测试中,每个问题的答案都是“C”。当然,你可能会在几个问题上走运,但你会答错绝大多数。

过度拟合模型的预测线几乎完美地描述了真实函数——甚至更多。该模型的预测输出是一个超级复杂的 15 次多项式函数。随着模型的复杂性(程度)增加,模型开始不太关心其预测的误差,而更关心预测它所获得的训练数据的值。花点时间沿着过度拟合模型的预测线追踪,看看它离真正的函数有多远。

继续我们的考试类比,过度拟合模型找到了我们考试的答案并记住了那个答案。当我们给模型一个没有答案的考试会发生什么?很有可能它会悲惨地失败。

合适的模特在金发区。它既不太简单也不太复杂。作为一个 8 次多项式函数,该模型仍然具有复杂性,但该模型在看穿样本数据中的噪声方面做得很好。这允许模型极大地减少来自过度拟合模型的误差,并且更准确地预测真实函数值。这个模型拟合的黄金地带就是我们试图通过正则化来实现的。

正则化技术

岭和套索回归技术扩展了简单的线性回归。在继续之前,让我们回顾一下 OLS 的倒退:

使用 RSS 作为成本函数的多变量 OLS 回归

成本函数衡量模型输出与实际数据之间的差异。线性回归有多个成本函数,如 RSS 、 MSE 、 RMSE 。在上例中,成本函数是 RSS(y _ actual-y _ predicted)。预测值可以用你的回归线方程代替。您的特征系数,也称为斜率,是(mⱼ).这些特征系数是我们用正则化技术处理的对象。

注意:在这篇文章中,我将预测器和特征作为同义词使用。预测值是模型中使用的独立变量(x 变量)。如果您正在构建一个身体质量指数估计器,高度很可能是您的预测因素之一。

在构建模型时,无论是哪种类型,您都必须执行适当的数据清理和探索技术,以完全理解您的数据。本博客中的所有正则化技术都应用了基于预测系数的惩罚。这意味着你必须在应用这些算法之前标准化你的数据。

这些技术的假设取决于应用正则化技术的模型的类型。如果你需要重温一下 OLS 模型的假设,请看看我之前的博文。

里脊回归

岭回归是 OLS 成本函数的一个小扩展,随着模型复杂性的增加,它会给模型增加一个惩罚。数据集中的 predictors(mⱼ越多,r 值就越高,模型过度拟合数据的可能性就越大。岭回归通常被称为 L2 范数正则化。

岭成本函数-请注意λ(λ)乘以预测值的平方和

请记住,目标是最小化成本函数,因此惩罚项(λ * sum(mⱼ)越大,模型的性能就越差。此函数会因您的模型有太多或太大的预测值而惩罚您的模型。岭回归的目的是减少这些预测因子的影响,从而降低数据过度拟合的几率。如果我们设置λ = 0,那么这将是一个正常的 OLS 回归。

岭回归最常见的用途是抢先解决过度拟合问题。当您必须保留所有预测值时,岭回归是处理多重共线性的好工具。它通过缩小预测值的大小来解决共线性问题,但从未消除它们。

如果有许多大约相同量级的预测值,岭回归效果很好。这意味着所有预测器预测目标值的能力相似。

套索回归

当你看着下面的等式,心里想“这看起来几乎和岭回归一样”嗯,你大部分都是对的。Lasso 不同于岭回归,它对预测值(mⱼ)的绝对值求和,而不是对平方值求和。

套索成本函数-请注意λ(λ)乘以预测值的绝对值之和

Lasso 是首字母缩略词,代表“最小绝对收缩和选择算子”由于罚项不是平方,有些值可以达到 0。当预测器系数(mⱼ)达到 0 时,该预测器不会影响模型。

由于 Lasso 的要素选择属性,它非常适合多重共线性。解决两个预测变量的共线性的最有效方法之一是删除其中一个。然而,移除是有代价的。可能存在变量集合共线的情况,并且仍然提供进行估计的价值。Lasso 将任意选择一个预测器进行预测,并放弃另一个。

如果很少有重要的预测因素,并且其他因素的大小接近于零,那么 Lasso 往往表现良好。换句话说**,**一些变量是比其他预测值更好的目标值预测值。

弹性净回归

那么,如果我不想选呢?如果我不知道自己想要什么或需要什么怎么办?弹性净回归是作为对套索回归的批判而产生的。虽然它有助于功能选择,但有时您不希望主动删除功能。正如你可能已经猜到的,弹性网是套索和脊回归的结合。因为我们已经知道了岭和套索回归是如何起作用的,所以我就不赘述了。请参考 sci-kit learn 的文档。

λ₁是套索罚分(L1),λ₂是岭回归罚分(L2)

如上图所示,现在有两个λ项。λ₁是回归套索部分的“alpha”值,λ₂是岭回归方程的“alpha”值。当使用 sci-kit learn 的弹性网络回归时,阿尔法项是λ₁:λ₂.的一个比率**当设置比率= 0 时,它作为岭回归,当比率= 1 时,它作为套索回归。介于 0 和 1 之间的任何值都是脊线和套索回归的组合。**

如何使用这些回归技术

现在好戏开始了!我假设你已经知道如何建立一个基本的线性模型。如果没有,你会在这个博客的相应笔记本中看到。使用套索和岭回归非常相似-除了“阿尔法值”。 Sci-kit learn 的 GridSearchCV 搜索一系列值,为您的超参数找到最佳值。

套索回归

下面是我用来构建下图结果图的代码。这个模型是使用 Sci-Kit Learn 的波士顿住房数据集创建的。

from sklearn.model_selection import GridSearchCV# Create an array of alpha values to test
# Start np.linspace value is 10**-10 because a value of 0 throws warnings
alphas = np.logspace(-10, 1, 1000,base=10)# Create dictionary key,value pair of alpha values
tuned_parameters = [{'alpha': alphas}]# Specify number of folds for cross_validation
n_folds = 5# Create grid search instance using desired variables
clf_lasso = GridSearchCV(lasso, tuned_parameters, cv=5, refit=True)
clf_lasso.fit(x_train_scaled, y_train)
lasso_scores = clf_lasso.cv_results_['mean_test_score']# Plot the results
plt.figure().set_size_inches(8, 6)
plt.plot(alphas, lasso_scores)
plt.xlabel('Alpha Value')
plt.ylabel('Model CV Score')
plt.title('Lasso Regression Alpha Demonstration')
plt.axvline(clf_lasso.best_params_['alpha'], color='black', linestyle='--')
print(f'The optimal alpha value is :{clf_lasso.best_params_["alpha"]}')

波士顿住房数据的优化 Lasso 回归

请注意,最佳 alpha 值是 0.0106,而不是 0。这证明了添加这一点 alpha 比纯线性回归产生了更高的交叉验证分数。从这张图表中很容易看出,随着 alpha 值的增加,CV 值接近并达到 0。

在 alpha 值为 1 时,几乎 2/3 的特征被移除,并且测试 R 仅降低了大约 0.1!

上图显示值为 1 时,套索回归移除了 8 个特征,在总共 13 个预测因子中只剩下 5 个。随着特征的去除,模型的预测强度下降,但是现在模型更简单了。这让我们对好的特性选择的力量有了一点了解。

里脊回归

再次,像套索回归这里是代码和下图产生。

from sklearn.model_selection import Ridge# Create an array of alpha values to test
alphas = np.logspace(-1, 1.5, 500,base=10)# Create a Ridge regression model instance
ridge = Ridge(random_state=0, max_iter=10000,alpha=alphas)# Create dictionary key,value pair of alpha values
tuned_parameters = [{'alpha': alphas}]# Specify number of folds for cross_validation
n_folds = 5# Create grid search instance using desired variables
clf_ridge = GridSearchCV(ridge, tuned_parameters, cv=5, refit=False)
clf_ridge.fit(x_train_scaled, y_train)
ridge_scores = clf_ridge.cv_results_['mean_test_score']# Plot the Figure
plt.figure().set_size_inches(8, 6)
plt.plot(alphas, ridge_scores)
plt.xlabel('Alpha Value')
plt.ylabel('Cross Validation Score')
plt.title('Ridge Regression Alpha Demonstration')
plt.axvline(clf_ridge.best_params_['alpha'], color='black', linestyle='--')
print(f'The optimal alpha value is: {clf_ridge.best_params_["alpha"]}')

Sci-Kit Learn 波士顿住房数据的岭回归优化

与套索回归不同,我们可以在这里看到随着 alpha 值的增加,该值是如何接近 0 的。如果你愿意,你可以在 GitHub 笔记本上增加 alpha 值,看看它永远不会达到 0。

在岭回归图中,我们看到 alpha 值为 2.97 时,我们的模型比值为 0 时有更好的性能。请记住,alpha 值为 0 等于正态回归。这证明了适量的偏差可以改善你的模型,防止过度拟合!

结论

就是这样!现在,您可以使用优化的 alpha 值来运行您选择的回归。下面是我们讨论内容的简要总结:

什么是正则化 :对抗过拟合和提高训练的技巧。

弹性网——脊和套索的混合物

如何使用正则化:

  1. 分割和标准化数据(只标准化模型输入,不标准化输出)
  2. 决定哪一个回归技术脊,套索,或弹性网,你希望执行。
  3. 使用 GridSearchCV 优化超参数 alpha
  4. 用你现在优化的 alpha 构建你的模型并进行预测!

谢谢你花时间阅读我的博客。在我的 GitHub 库中可以找到该笔记本的全部细节。如果您有任何问题或有建设性的批评,请随时联系我!

领英:【www.linkedin.com/in/blake-samaha-54a9bbaa

推特:@Mean_Agression

什么是强化学习?

原文:https://towardsdatascience.com/what-is-reinforcement-learning-99f9615918e3?source=collection_archive---------29-----------------------

奖励和惩罚

在 Unsplash 上 NeONBRAND 拍摄的照片

机器学习是 IT 界讨论最多的领域之一。随着图像和语音识别、自动驾驶汽车、产品推荐和欺诈检测的大范围普及,机器学习无处不在。

ML 的一个子领域专注于通过自学发现问题的解决方案。这里,我们可以以电子游戏为例。当来自一家名为 Deepmind 的公司的一小组研究人员发表了一篇关于用强化学习玩雅达利的论文时,这个领域受到了很多关注。以至于谷歌后来花了一大笔钱收购了该公司。

当 AlphaGo 在围棋比赛中击败世界冠军时,强化学习的力量不再被忽视。读完这篇文章后,你将对强化学习及其应用有一个基本的了解。

强化学习

照片由克里斯里德在 Unsplash 拍摄

强化学习是对机器学习模型的训练,以针对给定场景做出一系列决策。

在其核心,我们有一个自主代理,如人、机器人或深度网络学习来导航不确定的环境。这个代理的目标是最大化数字奖励。

体育就是一个很好的例子。让我们考虑一下我们的经纪人在网球比赛中需要处理的事情。

代理人将不得不考虑其行动,如发球和截击。这些行为改变了游戏的状态。换句话说,当前设定的分数和领先的玩家。

每一个行动都是有回报的。代理人必须赢得一分才能赢得一局、一盘和一场比赛。

我们的球员需要遵循一定的规则和策略,以最大限度地提高最终得分。

为了在此基础上建立一个模型,它必须将一个状态和一个动作作为输入,然后将其转换为最大可能的回报。该模型还必须提前考虑,并考虑此类行动的长期结果。

这个过程因任务而异,这并不奇怪。建立一个可以打网球的模型和 Atari 是完全不同的。

监督学习与强化学习

照片由 Unsplash 上的延斯·勒列拍摄

强化学习不仅仅是监督学习的一种聪明说法。监督学习侧重于根据历史实例来理解环境。

然而,这并不总是合适的。一个常见的例子是在交通中驾驶。

想象一下,根据前一天的观察来做这件事,当时几乎没有任何汽车。这和开车时只看后视镜一样有效。

强化学习就是收集奖励。代理专注于正确转弯,必要时发出信号,以及不违反速度限制。此外,机器人可能会因危险行为而被扣分,例如超速行驶。

目标是在给定当前交通状态的情况下最大化点数。这里强调的是,一个动作导致状态的改变,而监督学习并不关注这一点。

探索与开发

照片由摄影爱好在 Unsplash 上拍摄

假设我们把一个全新的机器人放在一个房间里。他的目标是找到螺栓和螺丝钉。这里的机器人是智能体,房间是环境。他有四种可能的动作:向左、向右、向前或向后移动。

机器人的状态由几个东西组成,是他当前的位置和以前的位置。如果他移动,状态会改变,但是我们还不知道这个移动是对还是错。

所以我们让机器人探索房间。走了一会儿后,我们的机器人终于找到了一些螺丝钉。机器人因为做了正确的事情而获得奖励。

现在,我们的机器人必须遵循的政策是积分最大化。他知道,通过再次采取同样的路线,他一定会达到目标,并得到一些积极的反馈。

然而,这条路径远非最佳,任何类型的机器人都只能一次又一次地沿着同一条路径前进。探索和探索之间的权衡来了。

如果我们的机器人遵循同样的道路,他将利用他所学到的知识,并最终达到目标。然而,如果我们让机器人四处游荡寻找更好的路径,他将利用探索。

假设我们给我们的机器人 10 个回合来了解环境并找到更好的路线。过了一段时间,他找到了一条路径,只需要以前一半的步骤。然而,在这个过程中,他也走了一些不好的路。

在这种情况下,如果我们让另一个机器人跑 10 圈,并且只使用他找到的第一条路径,这个机器人可能会收集更多的螺栓和螺钉。

这是研究人员在开发强化学习模型时必须处理的权衡问题。

现实生活中的例子

Bram Van Oost 在 Unsplash 上拍摄的照片

强化学习模型必须经过良好的训练和优化,以适应现实生活中的情况。代理周围的场景和环境每次都会发生变化。

例如,我们在一辆自动驾驶汽车内,我们希望汽车在安全性方面得到优化。然后,如果我们看到前面汽车的刹车灯,可能是时候减速了。然而,如果我们在路上看到一块巨大的岩石,我们预计汽车会停下来。

另一个令人印象深刻的项目旨在制造假腿,它将能够识别行走模式并做出相应的调整。作为原型,研究人员已经开发了一种可以自主学习的虚拟跑步者。

我们已经知道,强化学习是一个具有很大潜力的强大工具。唯一的事情是,我们需要大量的数据和训练,才能驾驭现实世界的情况。

在大规模计算领域已经有了一些令人乐观和印象深刻的成果。这些系统可以探索具有大量状态的大规模环境,例如大型视频游戏中的环境。

最后的想法

强化学习简单而强大。鉴于最近的发展和快速进步,它有可能成为深度学习领域的一支重要力量。然而,重要的是要记住,强化学习只是解决现实世界问题的许多现有方法之一,它有其优点和缺点。

正如我们在 AlphaGo 的例子中看到的那样,强化学习有可能让机器变得更有创造力。这个领域的入门很简单,只需参加一个短期课程或开发一个小程序,例如机器人寻找螺栓。

参考

[1] Bajaj,P. (2020 年)。强化学习。2020 年 9 月 16 日检索,来自https://www . geeks forgeeks . org/what-is-reinforcement-learning/

[2]奥辛斯基,b .,&布德克,K. (2018)。什么是强化学习?完全指南。检索于 2020 年 9 月 16 日,来自https://deep sense . ai/what-is-reinforcement-learning-the-complete-guide/

什么是研究?

原文:https://towardsdatascience.com/what-is-research-e119da986a96?source=collection_archive---------55-----------------------

作者拍摄

通过我们的思想发现自然

下面分享的所有观点都是基于我的经验和我的信念。这不是绝对的事实,而是我所想的一种天真的看法。

什么是研究?

一些有趣的定义:

研究是“为增加知识储备而进行的创造性和系统性工作,包括人类、文化和社会的知识,以及利用这些知识储备来设计新的应用。”它包括信息的收集、组织和分析,以增加我们对一个主题或问题的理解。(来源:维基百科)

科学研究是一种收集数据和利用好奇心的系统方法。这项研究为解释世界的本质和属性提供了科学信息和理论。它使实际应用成为可能。(来源:维基百科)

对我来说,研究是想要对未知做出反应的生物之间的一种普遍想法。如果我们看看过去,学者们掌握着知识,想要了解世界。每个人都有自己的愿景,这些愿景可以转化为基本问题,他们通过假设进行测试。
研究不是,找到答案,还是找不到答案。使假设无效的结果本身就是一个结果,因为它允许其他人不走这条路,并允许他们测试其他假设。研究是对未知事物提出科学问题的艺术。创造一个有问题的问题,并且能够用一系列的假设来测试它,并且能够向其他人解释路径,以便他们跟随你并且帮助你。

如果我们看看量子物理学的创建,来自所有国家的一群研究人员只花了几年时间,他们每年只聚会一次,交流他们的进展,以创建一个解释无限小的有限理论。今天所有的微电子工作都要归功于这个理论。尼尔斯·玻尔说:“如果量子力学还没有深刻地震撼你你还没有理解。”

我觉得对于研究来说也是一样的,“如果你觉得不是为了遇见未知,那就是你还没想通”。

目前,研究并不性感。大多数研究人员花费超过一半的时间寻找资金。研究人员正在为发表论文而疯狂地竞争**,如果你想有一个好名声,一个好的 H 指数你必须每年发表 **2 到 3 篇论文**。大多数实验室都在战争中,无论是为了资金,为了招聘还是为了诋毁其他实验室的论文。**

Yoshua Bengio 最近在他的博客中发表了一篇文章,指出会议论文的选择过程完全需要重新审核,因为提交的论文中有太多没有材料或基本回复 [1]。

疯狂的出版竞赛破坏了研究的本质,即回答未回答的问题,探索未知环境的系统空间。做好研究需要时间,通过证明和测试假设来充分回应。

今天,如果你在主要期刊或会议上发表了 X 篇论文,你就是一名研究员。但是做研究员不就是一种生活方式吗?一种观察和预测世界的方式?在别人会经过的地方提问?用天真的眼光去看未知的地方?

做研究意味着大部分时间生活在失败中,也就是承认当我们找到一个答案时,其他研究人员可用的时间使它变得无用和无用。但美丽的是发现快乐瞬间的火花,为科学做出哪怕是最小的贡献。就像一个刚找到一盒巧克力的孩子。发现的喜悦。不幸的是,这很快就会被一个繁琐的过程所玷污,让你证明自己是你所声称的那样。

很久以前,我的一位论文导师对我说“我们做研究不是为了赚钱”我笑了很久,对自己说这太荒谬了,在爬上所有的文凭之后,薪水必须与之相称。但是最后,我明白了,这几句话包含了我可能永远不会拥有的金玉良言。研究不是一份工作,而是一种生活方式,一种激情,它让你每天早上起来的唯一目的就是发现这个世界。成为未知领域的探险家。

出版物的数量每年都在激增,这使得一个人不可能面面俱到。另一个问题是,目前大多数发表的研究结果是错误的[2],这很正常,我们是人,但我希望大多数错误不是故意犯下的,以在出版物中显示结果。此外,复制危机是研究中的一大重要偏见(科学研究很难或不可能复制或再现[3])。

大概是天真率真的眼光。然而,我愿意相信这是科学的目标。我没有研究员的身份,因为我没有发表的可能性。我攻读了天体物理学博士学位,现在在“人工智能公司工作。我将我的知识和科学方法应用于它,但没有发表,我不断地在文献、出版平台或研究人员的博客中寻找答案,以找到问题的解决方案,或者通过我的研究找到答案,感谢这种方法让我们探索未知。也许真正的研究人员会向我扔石头,但有多少人在做研究呢?我的意思是,有多少人足够幸运,能够不用浪费时间去找工作就能做研究?

现在在哪里做研究?

几年前,研究只在学院和大学里进行,现在这种趋势正在改变。公司越来越多地通过专门的研究和开发团队获得他们的位置(R&D),非常大的公司有巨大的部门专门从事各种研究。GAFAMs 和其他跨国公司每年投资数十亿美元进行研究,以揭示秘密和创新。

大多数公司已经意识到,如果他们想保持对竞争对手的竞争优势,他们必须超越他们所拥有的知识。获取新知识需要研究来产生智力资本。

如何成为一名研究员?

大多数人会回答你需要博士学位,拿了博士学位才能成为研究员。这是真的,但不是全部,博士学位培养你成为一名研究员,但对于招聘医生来说,有几个级别的“博士”。第一类是研究人员,他们开始了他们的论文主题,发展了解决问题的直觉。他们尝试假设,比较方法,获得本领域和相关领域的知识。他们已经解决了他们的课题,甚至更多。他们是充满热情的人,渴望无穷无尽的知识。

第二种情况是读博士学位的人,因为这是他们学业的延续或其他人的影响。他们发现自己在一个主题中,他们在等待一个程序,被告知该做什么。我记得数据科学家职位的两个候选人,其中一个曾告诉我“为什么要做文学和技术调查?我有博士学位,我什么都知道”另一个人向我介绍了他的课题,这个人使用了算法,然后我问他为什么只选择神经网络和决策树,他的回答是“我被要求测试它们,并且它有效,所以我们没有看任何其他东西”。

所以不,有博士学位不一定就能成为研究员。我遇到过本科生或硕士生,他们研究对他们来说很重要的课题,一些他们在科学文献、书籍或博客中没有找到满意答案的基本问题。他们已经确立了他们的研究课题。最糟糕的是,大多数人从来不想读博士,因为他们认为这会影响他们的创造力。

我和工程师们一起工作,他们更多的是研究人员而不是工程师,他们想通过自觉地应用科学方法来推进他们的领域。
做研究员不是文凭,也不是发表名单;这是一种存在的方式,一种想要解决问题的方式。一种知道如何将一个问题分成子部分来建立假设、数据、模型、测试的方法。

一个博士教我们什么?

很多事情。上班时间和工作时间?不,因为当你累的时候,你会犯更多的错误,而且要花很多时间来纠正它们。在我读博士期间,我记得我花了三天时间在我的代码中寻找一个 bug,直到我找到它才能睡觉。筋疲力尽的我上床睡觉,第二天,睡了个好觉后,重读一遍代码,错误就完美地出现在我面前。疲劳什么也教不了。

所以,博士教给我们很多东西:

  • 多角度思考一个问题
  • 不要被卡住
  • 阅读、理解并对他人的工作做出直觉判断
  • 专注和集中
  • 当你没有问题时,回到根本上来
  • 制定一个有问题的
  • 提问
  • 创建假设
  • 创造和测试事物
  • 自由
  • 可选:专业知识

我想我不能阐述一个博士能带给你的所有东西,但这是值得的。但是,这取决于你,取决于你的主管,取决于你的实验室,取决于你手头的资源,取决于你周围的人。

对我来说,攻读博士学位是最好也是最糟糕的事情。最好是因为它教会了我日常使用的东西,而且我从来没有被卡住过,我总是在寻找解决方案。更糟糕的是,因为它需要大量的工作,你会失败,无论你的水平或你的天才,你将不得不失败。没有失败就没有成功。你会精疲力尽的。

很多时候,当你开始读博士学位的时候,你不知道它是什么,你不能教论文是什么或者你要做什么。我们从未为此做好准备。这么多学生第一年就止步不前或者转科,大概就是这个原因吧。我向那些想深入了解这一点的人推荐这篇文章。

应用 vs 研究 vs 数据,科学家

随着时间的推移,随着数据科学家职业的减少,这三种工作名称越来越多。那么它们之间的区别是什么呢?差别可能在于这些职位所需的知识深度。

  • 数据科学家:总体来说,寻找、清理和结构化、分析、建模、可视化、呈现数据(这个职位可以远离研究,更多的是了解业务)
  • 研究科学家:顾名思义,他们是做研究的。他们不关注业务、渠道或产品。他们专注于寻找不存在的答案。阐明假设,证明它们是否正确。研究人员研究的问题通常更深入,投入的时间比需要立即回报的商业项目更重要(研究需要几年,数据科学需要几周或几个月)。
  • 那么,什么是应用科学家?这种情况越来越普遍。这是研究科学家角色的延伸,但是,它需要更多的软件知识来大规模应用解决方案(分布式或并行计算等,需要具有研究背景的 SDE 知识)。研究科学家更专注于科学发现,而应用科学家似乎对现实生活中的问题更感兴趣。

如何开始一个研究项目?

这是一个很好的问题,老实说,我没有完美的答案,因为我总是试图找出它。学术界或企业你最需要的东西“对某事的兴趣”,**你最感兴趣的是什么?**你热爱什么?这里有感兴趣的领域或应用。

从哪里开始?

不同的方式:

1-阅读文学

这是最常用的开始研究的方式,因为每个博士生都会以“文献综述开始他的论文,一般由“调查论文结束。这是一个缓慢的过程,非常缓慢,阅读科学论文并不容易,但随着时间的推移会变得容易。有利有弊,尽管 99.9%的研究人员对此深信不疑。

这种方法的优点是:

  • 你在你的领域获得了专业知识
  • 你知道有什么突破吗
  • 你可以找到直觉,并发现在哪里搜索,在哪里你可以产生影响,有哪些问题没有答案(潜在的研究项目)
  • 你有写论文的相关材料,因为你知道年表
  • 你知道所有论文中使用的所有方法

缺点是:

  • 到头来,你被过程带偏了。你只看到别人做什么,只看到他们想让你看到的
  • 你知道人们如何做研究,你会复制同样的模式,同样的思考方式
  • 文献有错误,可能难以复制
  • 重新创建算法或数据的困难
  • 不会帮助你发展自己的思维方式
  • 文章的数量每年都在爆炸

2 —开始你的想法

与第一点相反。你有了一个想法,你就为之努力,直到你解决了它,而不需要做文献综述。从好的方面来看,你不会被文献中呈现的思维方式所偏见,你会阐明假设,找到验证或反驳它们的方法。你是这个过程的主人。不利的一面是,这个问题可能已经解决了不止一次,而且比你的解决方案更优雅。当文献已经给了你线索或解决方案时,缺乏专业知识会让你绕几个月的圈子。

3——学习导师给的科目

很可能是混合方法。你的导师是经验丰富的研究人员,他们对该领域有着完善的知识。他们知道什么可行,什么不可行。他们发现即将出现的潜在主题或问题。他们知道什么是有希望的,什么将产生很少。担心的通常不是你的想法。你信任那些对你感兴趣并让你解决他们问题的人。廉价劳动力。

4 -费曼方法

  • 找到你感兴趣的主题
  • 了解一下
  • 教它,收集评论
  • 努力克服你推理中的弱点
  • 如果你还没有找到答案,回到第二步
  • 对于新项目,回到步骤 1

我想,找了很久又找了一遍,没有完美的答案。这完全取决于地区,你能投入到项目中的时间。你可以建立的关系(联系可以帮助你的研究人员)。兴趣或领域的出现。

人工智能的领域非常广阔,似乎不可能掌握一切。但是,领域越广,寻找感兴趣的研究课题的空间就越大。无论如何要小心,大公司都在赌它,因此它是一个发展非常迅速的领域。

结论

不要害怕事情的消极面。得到警告并做好准备比发现自己被关在你不想去的地方要好?我坚信,作为一名研究人员是一种职业,一种思维方式和好奇心。发表不发表不重要,研究的本质在于你如何看待这个世界。
激情,疯狂,渴求答案,去冒险。

参考

什么是基于搜索的分析?

原文:https://towardsdatascience.com/what-is-search-based-analytics-a1097704ba91?source=collection_archive---------40-----------------------

那些不知道的人将被遗忘在尘埃中

在 Unsplash 上由 Balázs Kétyi 拍摄的照片

什么是基于搜索的分析?

什么是基于搜索的分析?

您可以将基于搜索的分析视为公司数据的搜索引擎。基于搜索的分析能够提出诸如“我们上个季度的净收入是多少”或“告诉我过去 30 天有多少人下载了我们的应用程序,按周排序”等问题,并获得可操作的数据和图表。

为什么需要基于搜索的分析?

在过去的十年中,商业智能工具赋予了业务用户创建自己的仪表板和可视化的能力。这有助于高管和部门主管做出数据驱动的决策,以支持公司目标。但是,利用这些控制面板和可视化的能力受到数据治理、数据孤岛和数据蔓延以及单个用户能力等问题的限制。

您可以将基于搜索的分析视为公司数据的搜索引擎

不仅如此,为了使用数据分析仪表板,必须首先创建仪表板。必须引入数据,必须选择和应用可视化,必须以能够回答特定业务问题的方式设计仪表板。这个过程可能需要几个小时甚至几天。

另一方面,基于搜索的分析允许企业用户用简单的英语提问,并立即得到可操作的数据和可视化结果。

使用基于搜索的分析来分析新冠肺炎数据(视频由作者使用知识制作)

但是建立一个有效的基于搜索的分析平台是有挑战的。例如,为了使其有效工作,基于搜索的分析平台需要理解诸如“比较”、“多少”、“平均”和“总数”等术语。他们还需要理解特定于业务的术语,如“增长”、“保持”、“流失”和“成本”。同样至关重要的是,他们能够解释许多表示日期或时间跨度的不同方式,例如“从九月到十二月”、“上个季度”、“按月显示”和“去年”。这是通过自然语言处理完成的。

自然语言处理

自然语言处理(NLP)最早出现在 20 世纪 50 年代,但直到最近才达到该技术广泛应用的程度。你可以想象,让一台计算机理解人类语言是一个主要障碍——想想英语的复杂性和细微差别。

NLP 工作是将人类语言的问题转换成分析引擎可以理解的查询

在过去十年中,这种情况发生了显著变化。谷歌搜索、Wolfram Alpha、亚马逊 Alexa 和苹果的 Siri 都在使用 NLP 为人们提供真正的服务方面取得了长足的进步。

在基于搜索的分析中,这可能会更加复杂。有许多方法可以要求特定类型的数据或可视化。NLP 的工作是将人类语言的问题转换成分析引擎可以理解的查询。

对物联网地理空间数据使用基于搜索的分析(作者使用知识制作的视频)

为特定用例定制基于搜索的分析

除了将 NLP 应用于数据以创建基于搜索的分析所带来的一般挑战之外,还有特定于用例的挑战。

如果你调查 100 家公司如何使用商业智能工具,你可能会得到 100 个不同的答案。这是因为所有行业都使用不同的数据。甚至同一个行业中的单个公司也可能跟踪不同的度量和 KPI(关键性能指标)。许多行业也有不同的术语和特定领域的知识,当包含在自然语言查询中时,必须理解这些术语和知识,至少粗略地理解一下。

这就是为什么在这种情况下,提供商针对客户的特定使用情形定制基于搜索的分析部署至关重要。这个过程通常包括向 NLP 库中添加自定义术语和同义词、映射关系、调整变量名以及自定义可视化选择逻辑。

示例:这在实践中是什么样子的?

想象一下,一家冷藏卡车运输公司使用 GPS 和 IoT(物联网)温度传感器将监控数据输入其商业智能平台。他们会想知道他们的卡车在哪里,速度有多快,冷藏室的温度是多少。

这意味着基于搜索的分析平台需要理解诸如“告诉我亚利桑那州所有卡车的位置和温度”、“5 号钻井平台有多冷”和“有没有高于冰点的单位?”。第一个查询可能现成可用,但第二个和第三个示例可能需要一些定制才能正确解释。

在 Slack 中使用基于搜索的分析(作者使用知识制作的视频)

真的像谷歌搜索一样简单吗?

简短的回答:没有。但是更好的回答可能是“还没有”如果你还记得网络爬虫、Alta Vista 和 Excite 的时代,你就会知道早期的搜索引擎并不擅长准确地找到人们想要的东西。

为数据建立搜索引擎是一个更加困难的挑战,特别是因为——如上所述——不同的公司有很大的不同。

然而,还是有希望的。当基于搜索的分析解决方案为特定的业务或用例定制时,可以实现类似 Google 的简单性能和准确性。这需要一点前期工作,但结果可能会改变游戏规则。

什么是情感分析,如何使用?

原文:https://towardsdatascience.com/what-is-sentiment-analysis-and-how-is-it-used-217074887277?source=collection_archive---------35-----------------------

我们将了解什么是情感分析,它来自哪里,以及它能为我们做什么。让我们开始吧!

图片来自 Pixabay 的科琳·奥戴尔

你最后一次坐飞机是什么时候?你还记得吗?

也许你坐在一个哭闹的婴儿旁边…或者你得到了免费的升级,享受了更多的腿部空间。

可能是空乘把咖啡洒到你身上了……也可能是他们很讨人喜欢,让你觉得很自在。

或者你甚至不记得你的最后一次飞行,因为没有什么值得纪念的事情发生——这可能是一件好事!

照片由 Unsplash 上的 NeONBRAND 拍摄

作为“客户之声”的调查

不管你的经历如何,你都可能会收到航空公司发出的调查问卷。他们想知道从你的角度来看这次飞行怎么样。

一些调查问题可能会要求您从 1 到 10 对服务进行评分,如空乘人员的帮助程度,或浴室的清洁程度。

他们可能还会问一些开放式的问题— “告诉我们你的经历以及我们可以改进的地方。”

再来看美联航的例子。根据他们最近的情况介绍,联合航空公司去年有 1 . 62 亿乘客。

如果我们可以假设他们的营销部门随机向每 30 个人发出一份调查,得到的回复率为 5%,那么:

1.62 亿乘客/30 = 540 万被调查乘客 x 5% = 每年 27 万份调查反馈

数据真多啊!这是一个电子表格中的 270,000 个单元格,用自由文本回答了联合航空公司可以做些什么来改善他们的服务。

这些数据中包含的观点对管理层来说非常有价值,有助于他们找出让乘客更快乐的方法。

不幸的是,对许多公司来说,下一步就是让一屋子实习生分头搜索电子表格。或者更糟的是,电子表格被推到一个黑暗的角落里,再也看不到了。

然而,为了拯救实习生的理智和等待被揭示的洞察力,我们可以利用情绪分析的迷人方法。

简短的定义

情绪简单地描述了对某事的观点——无论是你在新闻中读到的事件,你从亚马逊上买的书,还是当你的狗在地毯上弄得一塌糊涂后你对它的感觉。

我们或许可以把这种做法叫做意见分析,但这听起来并不容易记住,不是吗?

观点的反复无常

观点可能转瞬即逝,千变万化。你的宠物前一分钟还是一只毁坏地毯的野兽,下一分钟就变成了一个可爱的能量球。

在我们的航空公司的例子中,在任何给定的航班上,可能有数百种意见分散在乘客中。

为了解决大众分散的观点,自然语言从业者已经改进了情感分析来从无组织的和难以置信的多样化的观点数据中获取意义。

情感分析对我们有什么用?

情感分析可以用各种方式标记我们的数据,使我们更容易从杂乱的非结构化数据中获得洞察力。

极性

第一个也是最常用的度量是极性

极性简单来说就是指语言是阳性、阴性还是中性。很多情感分析都是将文本浓缩成一个数字——比方说,在-10 到+10 之间,表示一个陈述的极性。

图片来自 Pixabay 的约翰·海恩

当*“这些花生是咸的”可能记录为 0(中性),我们可能期望“这些奇妙的花生拯救了我的婚姻”*可能记录为+10(正极)。

同时,“*这些馊花生真恶心”*引出 a -8(负极性)。

主观性/客观性

情感分析也可以将文本标注为主观客观。

主观文本意味着有观点的文本——不一定是可证明的或基于事实的。关于胡萝卜蛋糕好坏的观点就属于这一类。

另一方面,客观性涵盖了不受个人观点影响的基于事实的语言,比如“胡萝卜蛋糕里有胡萝卜”。

在分析客户反馈或评论时,过滤主观性尤其有用。我们不关心飞机起飞,我们想知道起飞是怎么起飞的

基于特征的分析

最后是基于特征的情感分析。考虑以下产品评论:

注意这篇文章中有一些矛盾的观点。如果我们试图把极性作为一个整体来总结,我们可能会得出一个相当中性的结论。

然而,当我们将文本分解成它的特征,我们可以更清楚、更有用地了解这个客户喜欢什么、不喜欢什么。

基于特征的(或基于方面的)情感分析关注于发现谁是意见持有人,被评估的对象是什么,以及实际的意见是什么。

在上面的例子中,这个方法或许可以挑出这个顾客喜爱耐克 品牌,并且认为这些鞋子可爱舒适。然而,系统也看到可怕的水泡浪费金钱是与鞋子相关的负面因素。

通过打破这些特征,我们可能更有可能预测一星评论。我们甚至可以推荐其他可爱舒适的耐克鞋,其中“水泡”是我们从评论中提取的特征。

情感分析从何而来?

鉴于意见的分散性,以及书面语言的普遍混乱,我们应该向那些最先开始试图理解混乱的勇敢者致敬。

一项关于情感分析历史应用的研究表明,99%的情感分析论文都是在 2004 年之后发表的。这在很大程度上是由于计算能力的提高。

上图来自谷歌趋势,显示了自 2004 年以来的搜索量。红色是客户反馈,蓝色是情绪分析

客户反馈作为一个重要话题一直享有突出地位的时候,情绪分析已经迅速赶上甚至超过了它。

这项研究的一些有趣的历史发现揭示了使用情感分析的一些最初尝试:

  • 第一篇论文是 1940 年的,作者试图用手工*“划掉技术”*——计算极性关键词的数量来衡量不同主题的公众意见。
  • 1945 年和 1947 年,两位作者试图衡量二战期间遭受苦难的国家的公众舆论。

情感分析的现代方法

概括地说,现代情感分析在 21 世纪初占据了主导地位。第一个跨领域应用于许多问题的通用工具之一被称为“ General Inquirer ”。该工具最初是在 20 世纪 90 年代由美国资助开发的,并在 2002 年左右广泛应用于学术研究。

《普通问询者》是一套手工编码技术,包括将单词映射到各种类别。最大的一类是负面(有类似可怕可怕骇人等词汇。).

进一步进入 2010 年,上面引用的研究显示了从情感分析论文形成的词云。下半部分代表 2013 年之前的关键词,上半部分代表 2013 年以来的关键词:

情感分析的一个重大变化

从“网络”到“社交”有一个明显的转变,并转向像神经网络这样的深度学习技术。这些最先进的模型把我们带到了今天。

基于知识与统计的情感分析

一些早期的尝试,包括普通问询者,使用了“基于知识”的技术,如创建一个自定义的硬编码单词字典,具有“明确的影响”。

换句话说,这些技术关注的是很少具有双重含义的单词。这些词几乎总是表示好的坏的,像“开心”、“伤心”、“害怕”、“无聊”。你也可以看到这些被称为基于词汇的方法

基于知识的技术的一个缺点是,根据数据集的上下文,一般的基于知识的字典可能会遗漏重要的单词。

例如,一篇关于癌症的文章可能会谈到“不可阻挡的增长”。在这种背景下,这是不好。

图片来自 Pixabay 的erikawittleb

但是在一篇关于创业的文章中,“不可阻挡的增长”被认为是好的。

为了使用基于知识的方法获得每种类型数据的高度准确的结果,您可能需要定制硬编码的字典。这可能是时间密集型的。

有一些基于知识的技术方法尝试自动查找特定于上下文的关键字。一个例子依赖于像“或者“*但是”*这样的连词。

假设我们看到一句关于*“病人恶化* 不可阻挡的增长”的话。因为恶化在负面字典中找到,我们可以推断不可阻挡的增长也是负面的。

单词的这种接近性(这也暗示了它们是如何相关的)也被称为共现

统计法

基于知识的技术与后来更复杂的“统计”技术和机器学习方法形成对比。这些方法更依赖于通过大量文本获得的推理。

如果可以手动从文本中找出共现,或者可以使用基于规则的自动方法进行推断,那么可以以更加自动化的方式利用统计方法,该方法可以扩展到数十亿个数据点。

通过这种统计方法,我们使用大量数据相对快速地对共现做出推断。

如果一个单词经常出现在极性为正的单词中,我们也给这个单词分配一个正极性。否定词也一样。

我们不断迭代和训练大量的文本——比如维基百科中的所有文章。最终,结果是英语中大多数单词的权重,然后我们可以用它来预测新文本的情感。

请注意,这也适用于特定于上下文的自然语言。在我们早期的医学文本示例中,我们将仅在医学文献的语料库上训练我们的模型,以捕捉特定于主题的关键词的极性。

用于情感分析的深度学习

大部分统计方法仍然依赖于单个单词的意思——为给定文本的情感保留一种记分牌。

但是我们也必须考虑单词之间的相互作用。当考虑较长短语或句子中许多单词的含义时,语义分析模型更加准确。当然,这意味着我们必须训练更复杂的模型,这些模型使用更多的计算资源,运行时间更长。

图片来自 Pixabay 的

“一个 的朋友 告诉我我会喜欢这种三明治。

即使 我平时爱吃好的花生酱,这里用的那种不够奶油。

果冻是好的 但是 就是不够。”

这篇 PB&J 评论传递了许多含混不清的信号。如果我们只关注单词本身,而不关注使用它们的短语,我们会给它分配一个相对积极的极性。例如,有很多“爱”和“好”。

虽然对神经网络的深入探讨超出了本讨论的范围,但重要的是要知道,这些模型可以保存和权衡关于文本的数百万个特征,以便最终提供对极性的预测。

例如,经过训练的神经网络可以逐句逐句地分析文本。

如果在句子的前面使用了“即使”,该模型可能会对句子的其余部分不考虑积极情绪。同样,“不错,但是”可能会打折扣,“喜欢这个三明治”可能会正确地归因于顾客的朋友,而不是顾客自己。

继续练习

做得好!如果你已经做到了这一步,你已经很好地理解了什么是情绪分析以及它如何在幕后工作以提取极其有价值的见解。

图片来自 WikimediaImages 来自 Pixabay

不用说,NLP 正在迅速发展和变化——情感分析也是如此。在我发表这篇文章的时候,可能会有另一个方法论上的突破,允许更高的准确性。

同时,如果你有兴趣学习更多关于情感分析的知识,你可以做的最好的事情之一就是开始探索和实践。想出一个你认为可以用我们上面描述的方法解决的问题,然后开始编码!

感谢您阅读

你知道什么是香农熵吗?

原文:https://towardsdatascience.com/what-is-shannons-entropy-5ad1b5a83ce1?source=collection_archive---------12-----------------------

完整全面的指南

来自 Pexels 的摄影记者拍摄的

熵构成了宇宙和宇宙中一切事物的基础*。为什么深度学习应该有所不同?它在信息论中被高度使用(这里使用的熵的变体是香农熵),并且也已经进入深度学习(交叉熵损失KL 散度)。让我们来理解一下香农熵的概念。*

熵是什么?

通俗地说,你把熵描述为:

你得到的最基本的例子是一枚公平的硬币:当你扔它的时候,你会得到什么?正面 (1)或反面 (0)。

因为两个事件的概率是一样的(1/2)。没办法讲。所以,如果你在电话上玩抛硬币游戏。然后,你必须告诉对方一个结果,或者你需要一个比特(0 或 1)来传达这个信息。

让我们考虑一个完全偏向硬币的情况(总是正面朝上):

你需要告诉其他人结果吗?简单的答案是。因为你们两个都知道答案(如果你没有作弊的话😄).因此,你什么也不用说。你一点也没用。

直观地消化熵

为了直观地理解熵,让我们再次重温它的定义:

它的数学定义是:

来源:作者

有一件中肯的事要注意,这个词**‘系统’**在外行人的定义和概率术语中出现两次虽然不同。

让我们重温一下概率的定义。概率是什么?事件发生的可能性。概率的定义讲的是单个事件,不是整个系统。因此,概率能给我们的是局部的图景,是整个系统的有限图景。

概率给出了整个系统的局部图像

为了让我们对整个系统有所了解,我们需要想出一种方法来告诉我们整个系统的全局情况。我们需要评估系统的各个部分,看看它们的总体效果。

你如何评价系统的一部分对系统的随机性的贡献?

熵公式中的 pᵢ部分告诉我们关于事件在整个系统中的重要性。怎么会?概率值的分子告诉事件发生的次数,就是这样。

对于下一部分,让我们从一个新的角度来看熵的公式:

来源:作者

**我们可以将熵公式的第二部分转化为概率的倒数。**这会给我们带来什么?如果概率告诉你确定性,它的反义词意味着什么?不确定性。

因此,熵的公式可以解释为:

这就是,熵可以被解释为一个事件的重要性和这个事件的不确定性的乘积。系统中的事件越重要,它可以引入系统的不确定性(即随机性)就越多。因此,如果我们推导出每个事件的随机性并将其相加,我们就可以理解整个系统的随机性。

数学上消化熵

香农熵的数学公式是:

来源:作者

这里,c 是你拥有的不同类的数量。以硬币为例,我们有正面(1)或反面(0)。因此,c = 2。

所以,一枚公平硬币的熵是:

来源:作者

因此,公平硬币情况下的**熵为 1** 。完全不确定性(记住,熵的外行定义)。我们对结果完全没有把握。

现在,让我们考虑一下完全偏向硬币的情况。对它来说,熵就是:

来源:作者

首先,所有关于熵的计算中的 0log(0)都假设为 0 。现在,我们已经平息了,在这种情况下可以观察到,熵是 0。无论如何,我们对结果完全有把握。

硬币没有完全偏向的时候呢?

让我们画出得到人头的概率在 0 和 1 之间时的合成熵。

来源:作者

我们看到熵在概率 1/2 时变得最大。

一般情况下,任何系统的熵的最大值都是 log₂c 。这发生在概率为 1/2 的时候。为什么?

对此有两种解释。让我们看看。

直观解释:

因此,在硬币的情况下,最大熵将是 log₂2 = 1 比特。

当一切都是同等可能性(概率为 1/2)时,熵最高,因为你不知道会发生什么。

为了表达硬币可以采取的所有状态,即 0 或 1,你需要 1 位。

数学解释:

如果不感兴趣,可以跳过这个。

记住如何找到给定函数值最大的值。

如果没有,我们修改一下:

第一步:对函数进行求导,并使其等于零,得到的值将是该函数的最小值或最大值。如何知道找到的值是最小值还是最大值?

第二步:你对函数取的双导数,然后代入上一步得到的值。如果二阶导数的值小于 0,那么,该值将是函数的最大值,如果它大于 0,那么,该值将是函数的最小值。

现在,让我们把这个过程应用于香农熵的公式。

香农熵的导数是:

来源:作者

将导数等于 0,

来源:作者

最后一步,我们把两边都提高到 2 的幂,2 的幂 log₂x 就是 x

现在,让我们验证该值是最大值还是最小值。首先,我们找到熵的二阶导数:

来源:作者

现在,我们把导数等于 0 的值代入这个二重导数,

来源:作者

最后,我们得到的双导数的值是负的,因此,证实了熵的最大值是在概率 1/2 处。

因此,我们证明熵的最大值出现在概率 1/2 处。

摘要

在这篇文章中,我们从数学和直觉上理解了香农熵。我们知道香农熵的数学界限是什么。我们还导出了香农熵最大的概率。然后我们直观地理解了熵的概念。

什么是辛普森悖论?

原文:https://towardsdatascience.com/what-is-simpsons-paradox-4a53cd4e9ee2?source=collection_archive---------18-----------------------

和第二波冠状病毒病例有什么关系?

从未经汇总的数据中得出结论的危险

最近几周,人们越来越怀疑病例数上升和新冠肺炎死亡人数稳定或下降之间的差异。有几个解释流传着。首先,由于显而易见的原因,死亡是一个滞后指标。死亡高峰通常在病例高峰后约一个月出现。

然而,我们可能要考虑到我们一开始就看错了这些数字。美国是一个大国,怀俄明州发生的事情与德克萨斯州奥斯汀发生的事情没有什么联系。我们看的是整个国家的数字,为了获得准确的画面,我们需要深入到各个州、地区或城市,以更好地了解不同社区的情况。不幸的是,这些数据讲述了一个不同的故事。

输入:辛普森悖论

辛普森悖论(Simpson's Paradox)是指一种趋势出现在几组不同的数据中,但当这些组组合在一起时就消失或逆转的现象。

为了说明这一点,我创建了一些模拟数据,其中有两组数据,它们都显示出 X 和 Y 之间的正相关性(引入了随机性,但在这两种情况下,X 每增加一个单位,Y 就增加 4 个单位)。

用模拟数据说明辛普森悖论【来源:原创】

单独考虑每一组时,两组的最佳拟合线都明显向上倾斜。但是,当您将这些组放在一起时,参数估计值会变为负值。

一个著名的现实世界的例子是伯克利性别偏见研究。在 1975 年《T4 科学》杂志的一篇文章中,研究人员观察到了柏克莱大学研究生院男女录取率的巨大差异。

男性和女性的总体入学率[来源:维基百科

从表面上看,这可能意味着学校可能存在性别歧视。然而,当研究人员深入挖掘 85 个不同部门的数据时,他们发现了一个不同的故事。

6 个最大部门的部门准入率[来源:维基百科

在特定的院系中,研究人员只发现了少数几个男生比女生更有可能被录取的院系(反之亦然)。然而,更重要的趋势是,妇女更有可能申请最具选择性的部门。由于选择部门的申请人中女性所占的比例比男性大,所以他们在接受率上似乎有很大的差异,即使个别部门没有发现男性比女性更受青睐。

国家新冠肺炎数据

如果你看看美国的全国趋势,死亡人数的下降趋势是显而易见的,即使在过去一个月里病例有所增加。

美国新冠肺炎确诊病例和死亡病例

然而,肯定有一些州的数据不符合这一趋势。例如,在亚利桑那州,从 6 月初开始病例激增,6 月底和 7 月死亡人数明显增加。

亚利桑那州新冠肺炎确诊病例和死亡病例

在佛罗里达州,死亡人数从 4 月到 6 月保持稳定(而全国范围内,死亡人数正在下降),最近 7 月 9 日和 10 日是疫情最糟糕的两天。

佛罗里达州新冠肺炎确诊病例和死亡病例

同样,德克萨斯州在 6 月份开始经历病例增加,现在可能也开始看到死亡人数增加。

得克萨斯州新冠肺炎确诊病例和死亡病例

为什么这没有在国家数据中显示出来?

如果在多个州有稳定或上升的趋势,为什么我们仍然看到全国范围内的死亡率稳步下降?

还记得伯克利性别偏见的例子吗?大多数项目都同样或更频繁地接纳妇女。然而,更多的女性申请人申请了最具选择性的项目,导致她们的人数在汇总时看起来更糟。

以纽约为例。虽然它是第一波死亡人数中受灾最严重的城市之一,但它也恰好是该国人口最多的城市之一。

纽约州新冠肺炎确诊病例和死亡病例

4 月份的几个星期里,纽约州(主要在纽约市)每天的死亡人数稳定在 800 人左右,但现在平均每天超过 10 人。

纽约在控制疫情方面所做的努力当然应该受到称赞。然而,当查看我们的国家数据时,我们应该记住,这个国家人口最多的城市每天减少约 800 例死亡。不幸的是,虽然最近几周 COVID 死亡人数肯定会激增,但提到的 3 个州中没有一个在一天内死亡人数超过 150 人。纽约和其他在 4 月份遭受重创的州下降了 800 点,足以让我们在较小的州开始看到的任何飙升相形见绌。

当分析 COVID 数据或任何组间存在较大差异的数据时,要小心不适当的合并。虽然我很愿意相信全国范围内死亡人数下降所隐含的故事,但再看一下各个州就会发现,这可能过于乐观了。

参考

[1]辛普森悖论。https://en.wikipedia.org/wiki/Simpson%27s_paradox

[2]研究生入学中的性别偏见:来自伯克利的数据。https://home page . stat . ui OWA . edu/~ MBO gnar/1030/比克尔-柏克莱. pdf

[3]新冠肺炎·疫情数据/美国各州医疗案例。https://en . Wikipedia . org/wiki/Template:新冠肺炎 _ 疫情 _ 数据/美国 _ 医疗 _ 病例 _ 按州

扫雪机简介

原文:https://towardsdatascience.com/what-is-snowplow-and-do-i-need-it-cbe30fcb302b?source=collection_archive---------6-----------------------

Snowplow 自称是“同类最佳数据收集平台”。我们探索这意味着什么,讨论扫雪机做什么和不做什么。了解 Snowplow 的架构,以及它是否是您需要的工具。

图片来自 Pixabay 的 skeeze

这里有一个常见的场景:你运行一个网站,想知道你的用户如何使用它。你调查谷歌分析 360。您想为您的企业提供更好地了解客户所需的工具吗?你当然知道!对原始事件数据的访问,基于所有信息而非一小部分信息的见解?听起来不错!当您准备注册时,您注意到了 Analytic 的价格标签—起价为 15 万美元/年。大口喝。现在怎么办?当然,并不是所有的企业都能证明如此惊人的高价是合理的。

经常出现的谷歌分析的替代品是 Snowplow。Snowplow 是由 Snowplow Analytics 积极开发的一个数据收集平台。Snowplow 可以“收集”多种遥测数据,但它在点击流数据方面有着特殊的地位,提供了许多与开箱即用的网络跟踪相关的功能。

Snowplow Analytics 以各种形式提供其平台,包括一项名为 Snowplow Insights 的托管服务。它的所有核心组件都是开源的,可以以一种自己构建、自我管理的方式免费使用。您可以在公共云中运行自己的生产就绪、可扩展的实时数据接收管道,每月花费大约 200 美元。较小的部署或开发部署也是可能的(使用 Snowplow Mini ),每月大约 40 美元。

Snowplow 可以“收集”各种各样的遥测数据,但它在点击流事件中有一个特殊的位置

当然,Snowplow 和 Google Analytics 这么简单的基于价格的比较是没有用的。这些产品之间的重叠部分实际上非常小。作为一个刚刚将 Snowplow 部署到 Google Cloud 的人,我知道我花了一段时间才弄清楚 Snowplow 是否满足了我们的需求。这个故事向你介绍了什么是扫雪机,以及它是否对你有用。

与其他帖子相比,如媒体系列的 Snowplow,这个故事通过深入研究其架构和部署,而不是专注于其追踪器生成的数据的价值,来强调 Snowplow 实际上做了什么。对这个架构有了很好的理解,你就可以自己拿主意,决定扫雪机是否也应该成为你的数据分析工作的一部分!

数据收集平台

一个数据采集平台到底是什么?在其核心,Snowplow 由一个处理管道组成,该管道通过对 HTTP 端点的调用来捕获、清理、丰富和保存所有呈现给它的信息。GET 和 POST 请求进入管道,然后输出 blob 存储或可查询数据库中的结构化数据。Snowplow 还附带了许多实用程序,如 JavaScript web tracker和 tracking SDK将生成这些 HTTP 调用,以响应用户在您的网站或应用程序中采取的操作,例如响应页面浏览或页面点击。

HTTP 请求进入管道,输出可查询的结构化数据

记住:平台≠平台,管道≠管道

扫雪机做什么

Snowplow 最初是一个网络分析平台,仅支持使用他们的网络追踪器和自己的追踪器协议进行追踪。现在,它的目标是成为您所有活动数据收集工作的一站式商店。想要将订阅事件捕获到 MailChimp 支持的邮件列表中吗?扫雪机覆盖了吗!捕获您自己的应用程序生成的自定义事件?那也没问题!当你想到所有你可能得到的物联网(IoT)数据时,网站跟踪似乎很无聊。Snowplow 允许你定义和使用自定义事件模式。它接受来自任何地方的数据,同时提供对它收集的每一位原始数据的直接访问。Snowplow 每秒钟可以轻松收集数千个事件。

收集邮票是,收集数据是。来源

扫雪机不做的事

然而,从这些原始的结构化数据中获得“洞察力”需要你付出一些努力。Snowplow 很少处理它为您接收的数据,如果您希望它为您提供易于理解的图表或有启发性的统计数据,您可能会失望。开源 Snowplow 的一个基本安装收集数据非常好,但是除了以结构化格式收集、清理和保存数据之外,几乎没有做什么。

外出时,不要忘记储备大灯液体。来源

扫雪机没有 GUI 。在收集点击流数据时,它只是为你提供原子事件,如页面点击、页面查看或页面 ping 事件;没有“用户流量”或类似滚动深度的衍生统计数据。知道 Snowplow 不仅限于获取点击流数据是有意义的。因此,Snowplow 也不是 Google Analytics 的真正替代品。事实上,并行运行 Snowplow 和 Google Analytics 完全有意义!

Snowplow 不是 Google Analytics 的真正替代品

你也不会完全放任自流。Snowplow 确实有一些分析软件开发工具包,可以帮助你分析它生成的数据。还有一个 Snowplow web 数据模型项目,通过将原子跟踪事件分组到浏览会话中,专门帮助分析点击流数据。

扫雪机的加工流水线

因此,Snowplow 收集所有类型的事件数据,对它们进行处理,然后通过让数据流经“管道”来保存它们。让我们把这个过程变得更具体一些。Snowplow 处理管道如下所示:

扫雪机加工流水线。

本节讨论数据如何在管道中流动,以及什么接口连接管道的不同组件。

收集器组件

由 Snowplow tracker(例如snow plow JavaScript tracker)、web hook 或来自 Snowplow tracker SDKs 之一的调用产生的数据命中收集器组件。收集器是一个对 HTTP 请求开放的基本 web 服务器,它编码并在消息总线上发布所有传入的数据。如果请求不包含标识用户的 cookie,它还会将随机生成的 cookie 嵌入到Set-Cookie HTTP 响应头中。

浓缩成分

富集组件是实现 Snowplow 富集过程的该消息总线的订户。在这个过程中,Snowplow 验证输入的数据,验证它是在它理解的协议中指定的。然后,它提取事件属性并丰富事件。在丰富过程结束时,事件遵循 Snowplow 规范事件模型。丰富的事件发布在另一条消息总线上。

浓缩组件无疑是 Snowplow 最复杂和有趣的部分。如果你想了解更多,可以看看我的后续报道:

[## 扫雪机中的富集和批处理

细看 Snowplow 的浓缩组件及其批处理管道的弃用

medium.com](https://medium.com/datamindedbe/enrichment-and-batch-processing-in-snowplow-6b5258096c9b)

存储组件

存储组件订阅浓缩组件发布的消息总线。它将消息保存在 blob 存储或可查询的数据存储中,如 BigQuery 或 Redshift。如果目标存储是一个(结构化)数据库,事件属性将映射到列上。

组件实现

组件有多个兼容的实现,允许你使用那些最适合你需求的。一些实现使用特定于特定公共云的云原生技术,例如存储组件 Snowplow BigQuery Loader 与 GCP 上的 BigQuery 接口,并在云数据流上运行。其他的构建在开源技术上,可以很容易地部署在你自己的硬件上,比如运行在 JVM 上的 Scala 流收集器,它不仅可以向 AWS Kinesis 或 Cloud Pub/Sub 推送消息,还可以向 Apache Kafka 推送消息。

组件接口

用于组件间通信的消息看起来像什么?

  • 收集器接口可以说是最重要的一个,因为它是面向外的。收集器接受所有的 HTTP 请求,但是只有实现了已知协议的请求才能通过浓缩完成。这些是由 Snowplow tracker 协议描述的格式,Snowplow 提供的收集器适配器或 任何格式本机支持的格式之一,您为其实现了自己的远程 HTTP 适配器。其中,Snowplow 为 Google Analytics 使用的自描述 JSON 和 Google 的测量协议提供了适配器。
  • 收集器和浓缩组件之间的接口由 Apache Thrift 使用嵌入在这个自描述 JSON 模式中的有效载荷方案编码的 HTTP 头和有效载荷组成。
  • 丰富组件和存储组件之间的接口由以 TSV (制表符分隔值)格式编码的规范事件组成(没有节俭!);有些值包含 JSON。这个接口大多没有文档记录。要了解 Beam Enrich 如何对消息进行编码,请查看[EnrichedEvent](https://github.com/snowplow/snowplow/blob/3b8d9cc839e4af0b97c68477fb1c9f484de233e2/3-enrich/scala-common-enrich/src/main/scala/com.snowplowanalytics.snowplow.enrich/common/outputs/EnrichedEvent.scala)和的代码,Beam Enrich 中的实用程序方法将这些事件转换为 TSV 。您还可以查看解析 TSV 记录的分析项目内部(例如 Python Analytics SDK 中的这个测试)。

流还是不流

一些 Snowplow 组件没有实现上述的(流)接口。这些组件成批处理数据。它的缺点是,你应该忽略批处理实现,只需费心了解上面介绍的流式处理管道,因为 Snowplow 的 批处理管道已被弃用 。如果您出于某种原因仍然想了解更多关于批处理的知识,请查看我的故事。

Snowplow 批处理已被否决

扫雪机产量

Snowplow 丰富的规范事件可以存储到 blob 存储器或结构化数据库中。管道中数据的精确格式取决于您使用的存储组件。组件实现针对目标数据存储的属性进行了优化。

Snowplow 在 BigQuery 中的输出

将数据转储到 BigQuery 时,所有事件都被转储到一个大的events表中。在初始化之后,甚至在添加单个事件之前,这个events表已经有大约 128 个属性了!

事件表模式的一部分

如你所见,所有的房产都标有NULLABLE。(事实上,有些是我所有记录中的遗产和等价物NULL。在 Snowplow 开始使用可扩展的事件类型方案之前,他们只是在一个胖表中添加与 web 分析相关的列。这个胖表的列定义了现在的“原子事件”。)因为 BigQuery 是一个列式数据存储,所以总是NULL的列实际上不需要任何成本:添加列不会增加表的大小或降低查询速度。添加新类型的事件会向events表中添加更多的列。

在接收新类型的数据(链接点击和焦点表单事件)后,事件表中添加了其他列/字段类型

对于所有较旧的数据,新列将是NULL,对于所有插入的但属于另一种类型的新记录,新列将是NULL

Snowplow 在其他数据存储中的输出

并非所有数据存储都具有与 BigQuery 相同的属性。因此,并非所有数据存储都使用与 BigQuery 存储组件相同的“胖表”方法。

例如,在 AWS 上将数据存储在 Redshift 中时,每个事件都会在 a 表 [atomic.events](https://raw.githubusercontent.com/snowplow/snowplow/7738c6de42674ced61141481f1300c7b43eee09e/4-storage/redshift-storage/sql/atomic-def.sql)中产生一条记录。插入新类型的数据会导致创建新表;该表中的条目可以连接到atomic.events。Snowplow 将这种事件分裂过程称为粉碎。

为什么要铲雪

Snowplow 接收 HTTP 请求,并近乎实时地将它们保存到数据存储中。这听起来并不特别令人兴奋;许多云数据存储也有 HTTP 前端,难道不能自动将发布/订阅事件转储到云存储吗?为什么要用扫雪机?

将 Snowplow 与其他产品进行比较

验证很重要。来源: Lukas 对像素

与一般的遥测数据收集产品 相比,如亚马逊 Kinesis(数据分析)或Azure Application Insights,Snowplow 为您提供了验证和丰富输入数据的优势。只有干净的数据才能进入您的数据库!当跟踪网络应用程序时,Snowplow 还会在你自己的域上设置来自服务器端的 cookies,允许在浏览会话之间进行可靠的跟踪。然而,Snowplow 的安装和运行更复杂,如果您处理的事件很少,它的成本也相对较高。

通过验证输入的数据,Snowplow 确保只有干净的数据进入您的数据库

与提供高级数据处理类型 的应用相比,Snowplow 为你提供定制的扩展性,访问原始数据,摄取多种不同类型数据的能力,以及低价。专门服务的例子有用于网络分析的 Google Analtyics 或 Matomo ,以及用于应用监控的 New Relic 、 Datadog 或 honeycomb.io 等应用。然而,与这些专门的程序不同,Snowplow 并不真正进一步处理或分析你的数据;它甚至没有为你提供一个图形用户界面。将这些程序与 Snowplow 进行比较并不总是有用的。

使用扫雪机的一些理由

  • 你想收集遥测数据,但也要让保持对你的处理流水线的控制。您喜欢 Snowplow 是开源的,并且不想将自己与特定于云的产品捆绑在一起。
  • 没有一个特定于数据类型的产品能完全满足您的需求。你要全定制。你想要原始数据。扫雪机为您提供了一个良好的基础。
  • 您希望使用 Snowplow 出色的 JavaScript 跟踪器执行 web 跟踪,并利用 Snowplow 的事件模型,该模型非常适合 web 跟踪事件。
  • Snowplow 在**(近)实时**中接收、丰富和存储数据。如果您将收集的数据用于欺诈检测或类似的应用,这将特别有用。
  • 您希望执行自定义丰富,但不需要成熟的流处理平台(如 Apache Flink 或 Apache Beam)的全部功能和复杂性。Snowplow 通过实现一个 JavaScript 函数或者通过实现一个 HTTP(微)服务使得构建你自己的 enrichment变得相对容易。
  • 你想继续使用 Google Analytics ,但又想访问所有原始数据而无需每年支付 15 万美元。你可以通过使用 Snowplow 的谷歌分析跟踪器插件将你发送给谷歌的所有数据抽取到你的 Snowplow 收集器来非常容易地做到这一点,因为谷歌的测量协议是由snow plow 适配器支持的协议之一。
  • 你喜欢使用许多编程语言中都有的 分析 SDK来分析你的数据。

不使用扫雪机的一些理由

  • 您不愿意部署自己的基础设施,要么是因为您没有专业知识,要么是因为您不想维护它。您仍然可以使用 Snowplow,但应该考虑使用托管 Snowplow 平台 Snowplow Insights 。
  • 你没有专业知识、时间或兴趣去分析你的数据。就其本身而言,Snowplow 生成的原始数据并不十分有用。你可以研究更专业的应用程序,比如 Matomo 或谷歌网络追踪分析。在 Looker 中也有分析扫雪机数据的支持。
  • 扫雪机只收集事件数据,不收集其他类型的遥测数据。New Relic 将遥测数据分为四类:度量、事件、日志和痕迹,简称为 M.E.L.T 。要使用 Snowplow 收集指标,您需要自己负责聚合。要进行(分布式)跟踪,您需要自己向事件添加跟踪上下文。不建议向 Snowplow 发送原始日志。

展开扫雪机

那么,扫雪机的部署实际上是什么样子的呢?

我们对谷歌云平台的部署

我们当前的部署如下所示:

我们目前在 GCP 部署的扫雪机

让我们看一下这张图:

  • 我们唯一的数据源(目前)是 Snowplow JavaScript tracker,嵌入在我们的一个网站上。该组件根据 Snowplow Tracker 协议向收集器发出 HTTP 请求。

使用 JavaScript tracker 就像在你的网站上嵌入一个跟踪标签一样简单

  • 我们部署了 Scala 流收集器 云运行 ,这是一个完全托管的无服务器计算平台,让我们不必担心可扩展性或可用性。请注意,当接收大量事件时(平均每天数百万),在 App Engine 或 Compute 上运行收集器会便宜很多。
  • 当 HTTP 请求到达收集器时,它将消息发布到发布/订阅主题collector_good
  • 我们用 光束充实实现 **,它运行在数据流上。**数据流也是一种托管服务,提供开箱即用的自动扩展。
  • 在 Beam Enrich 中通过验证的消息被丰富,然后发布到enriched_good。从collector_good读取的没有通过验证的消息被发布到enriched_bad。我们目前从来没有读过坏的话题。
  • 我们使用存储组件实现big query Loader,它也运行在数据流上。Loader 订阅了enriched_good,并将事件插入到 BigQuery 的一个大表中,events。它还将事件类型(~事件中属性的名称和类型)发布到 PubSub 主题types上。当 BigQuery 中的插入失败时,事件发布在发布/订阅主题bq_bad_rows
  • 插入通常会失败,因为事件的属性在events表中不存在。运行在计算实例上的 Scala 应用程序 BigQuery Mutator 监视types主题,并在必要时向events表添加列。我们可以,但目前不会重新处理bq_bad_rows中的事件;因此,新类型的前几个事件总是会丢失。

你自己的部署

如果你想自己在 GCP 部署 Snowplow,官方安装说明和Simo Avaha的这篇博客文章是极好的资源。您可能还想查看一下这个或这个部署脚本集合。我决定放弃这些脚本,转而支持与我自己的一些自定义脚本相结合的 Terraform。

还有在 AWS 上安装扫雪机的指南。目前,Azure 没有官方支持,也没有特定于 Azure 的组件实现。

如果我们的部署对您来说看起来复杂或昂贵,或者如果您只是想探索 Snowplow 的功能,您应该看看 Snowplow Mini 。Mini 在单个映像中实现了所有必需的组件(以及更多组件),该映像可以部署到单个虚拟机上。它可以让你在 GCP 运行一个完整的雪犁栈,大约每月 40 美元。不建议将 Snowplow Mini 用于生产,因为它既不可扩展也不具备高可用性。

你觉得我错过了什么错误或事情吗?请在评论中告诉我!

我在 Data Minded 工作,这是一家独立的比利时数据分析咨询公司,在这里我记录并分享了我在 Publiq 部署 Snowplow 的心得。

Publiq 是一个非营利组织,管理着比利时佛兰德的活动数据库。作为一个令人兴奋的项目的一部分,该项目将使 Publiq 更加数据驱动,我们研究使用点击流数据来提高推荐的质量。

什么是 Sparsemax?

原文:https://towardsdatascience.com/what-is-sparsemax-f84c136624e4?source=collection_archive---------17-----------------------

softmax 的一个有用变体

格雷格·罗森克在 Unsplash 上的照片

在机器学习中,有几个非常有用的函数,比如 sigmoid,relu,softmax。后者作为神经网络的输出层广泛用于多类分类问题:

这个函数有一个有用的特性:它的元素之和是 1,这使得它对概率建模非常有用。它也是处处可微的,并且导数决不为零,这使得它在反向传播算法中很有用。相比之下,调用 softmax 替换的 argmax 函数的导数始终为零。另一个有用的特性是,该函数保留了后验概率分布的支持,因为输出概率决不为零,无论它们可能是多么小的值。

但是有时候你想有一个稀疏的输出,只保留几个非零概率的值。对于这种情况,André F. T. Martins 和 Ramón F. Astudillo 在他们的论文从 Softmax 到 sparsemax:注意力和多标签分类的稀疏模型中提出了一个名为 sparsemax 的新函数。

其思想是将 z 的最小值的概率设置为零,并且仅保持 z 的最高值的概率,但是仍然保持函数可微,以确保反向传播算法的成功应用。该功能定义为:

这里 τ(z) 称为阈值函数,它定义了包含 p 的所有非零索引的支持函数 S(z) 。sparsemax 函数的 python 实现如下:

在相同的值上运行它和 softmax,我们确实可以看到它将一些概率设置为零,而 softmax 将它们保持为非零:

np.around(sparsemax([0.1,  1.1, 0.2, 0.3]), decimals=3)array([0\. , 0.9, 0\. , 0.1])np.around(softmax([0.1,  1.1, 0.2, 0.3]), decimals=3)array([0.165, 0.45 , 0.183, 0.202])

有趣的是,在二维情况下,这两个函数有什么不同。在这种情况下,softmax 变成了一个 sigmoid 函数,sparsemax 可以用以下形式表示:

下图说明了它们的不同之处:

注意,sparsemax 函数并不是处处可微的(但 relu 也不是),但它在哪里是一个简单的计算:

这里 |S(z)| 是支撑 S(z)中元素的个数。

讨论

sparsemax 的明显问题是渐变消失。你可以看到,一旦 z 变大,导数变为零。作者承认这个问题,甚至提出了一个新的损失函数来代替交叉熵损失。然而,我认为 sparsemax 的主要优势不在输出层,而是在神经网络的中间,例如在注意力机制中。

你可以在我的 github 库中找到这篇文章的代码。

时间序列中的平稳性是什么,为什么要关注它

原文:https://towardsdatascience.com/what-is-stationarity-in-time-series-and-why-should-you-care-f3b45082356b?source=collection_archive---------8-----------------------

距离我上一篇关于时间序列分析的文章已经有一段时间了。到目前为止,我已经讲述了关于熊猫的基础知识,比如日期处理、时间转换和重采样:

  1. 用 Python 从头开始进行时间序列分析:第 1 部分
  2. Python 中从头开始的时间序列分析:第二部分

M. B. M. 在 Unsplash 上拍摄的照片

在阅读这篇文章之前,阅读那些文章不是必须的,但是如果你是时间序列分析的新手或者你有点生疏,我会推荐你。然而,今天我想换个方式,深入到statsmodels库,更准确地说,处理时间序列数据中的平稳性。

但是什么是平稳性呢?

让我们来看看我不久前找到的一些定义:

平稳性意味着,无论起点如何,取相同大小的连续数据样本应具有相同的协方差。

我知道没那么容易处理,但是我们来分析一下。上面的定义是所谓的弱形式平稳性或“协方差平稳性”的定义,如一些参考资料中所述。存在另一种类型的平稳性,称为严格平稳性,它意味着相同大小的样本具有相同的分布。这种形式限制性很强,我们很少观察到,所以为了做 TSA,用“平稳性”这个术语来描述协方差平稳性。

好的,我明白了,但是时间序列是平稳的意味着什么呢? 这个容易。对于一些被归类为平稳的时间序列(协方差平稳性),必须满足 3 个条件:

  1. 常数平均值
  2. 恒定方差
  3. 相同距离周期之间的常数协方差

最后一个可能一开始有点难以理解,所以让我们更深入地探讨一下。它只说明了相同长度的时间段之间的协方差(假设 10 天/小时/分钟)应该与相同长度的其他时间段的协方差相同:

现在这就清楚了,但是为什么我们还需要平稳性呢? 2 个理由(*最重要的*),我的朋友:

  1. 平稳过程更容易分析
  2. 大多数算法都假设平稳性

你能给我举一个平稳和非平稳时间序列的例子吗? 确定,在这里:

来自维基共享资源

好了,我希望这已经很清楚了,我可以继续了(只剩下一点理论了)。

平稳性测试

不久前,两个名叫大卫·迪基和韦恩·富勒的好家伙开发了一个平稳性测试。你可能会猜到,它被称为迪基-富勒测试,简称 DF 测试。一段时间后,考虑到时间依赖性,该测试的改进版本被开发出来,它被称为增强的 Dicky Fuller 测试 (ADF-test)。

整个测试可以归结为一个简单的假设测试,其中:

  • H0: 时间序列不是平稳的
  • **哈:**时间序列是平稳的

这意味着我们可以很容易地计算测试统计量,并将其与临界值进行比较。如果检验统计量低于临界值,我们可以拒绝零假设,宣布时间序列是平稳的。

Python 的statsmodels库中的 ADF-test 将返回以下内容:

  • 检验统计
  • p 值
  • 使用的滞后数
  • {1%、5%和 10%的临界值}
  • 对最大化信息标准的估计(基本上越低,就越容易做出未来预测)

为了简单起见,我将比较测试统计值和 p 值,但是如果你愿意,你可以稍后将它和 1%临界值进行比较。事不宜迟,我们开始吧!

导入和数据集

关于您需要的库,其中两个是常见的——NumpyPandas——但是您还需要从statsmodels库导入statools:

现在,您可以从提供的 URL 中读入数据集,并进行一些设置,使一切都符合需要:

如果你以前做过时间序列分析,我相信你对这个数据集很熟悉。对于那些不是的人来说,这是前几行的样子:

让我们也做一个快速的可视化,只是为了吸引眼球,如果时间序列在默认情况下是稳定的:

只要快速看一下,就很容易确定这个时间序列是而不是平稳的。平均值会随着时间的推移而变化,并且季节性周期中的峰值似乎只会变得更大。

然而,通过分析来确定平稳性是很好的。这是下一节将要讨论的内容。

执行 ADF 测试

还记得您从statsmodels库中导入的内容吗?我们现在要用它来测试平稳性。statools包含adfuller方法,您可以将时间序列数据传递给它:

嗯,情况不是很好。正如预期的那样,时间序列不是平稳的,这一点 p 值(0.99)也证实了。让我们探索一种将区分序列的方法——因此用前一个值减去当前值。这个方法叫做diff(),在这个方法中,您可以传递订单—默认为 1:

在对微分时间序列执行相同的测试后,您可以看到 p 值仅略高于通常的显著性水平—还不太令人满意。

如果您想知道为什么我们要删除丢失的值,原因如下:

正如您所看到的,您不能从第一个值中减去,因此会导致缺少值。如果提供了缺失数据的时间序列,ADF-Test 将会失败,请记住这一点。

我们可以很容易地使用不同的微分顺序来查看 p 值是否会下降。让我们用 order = 2 来试试:

p 值现在低于显著性水平,因此时间序列可以被声明为平稳的。

手动完成整个过程可能会很乏味,如果必须处理大量时间序列数据,甚至会难以管理。假设您想要自动化时间序列模型训练的某个部分,如果您要使用需要平稳序列的算法,这将是一个很好的起点。

这就是为什么我决定做一个函数来为你处理这个过程。这里就不多解释了,恰如其分的评论:

现在可以轻松使用声明的函数了:

为了快速验证结果,我们将测试假定平稳的时间序列的平稳性:

看起来一切都很好,微分阶是 2(手动计算的*),时间序列是稳定的——通过 p 值。*

下一步是什么

这只是时间序列分析的第一步。对于大多数算法,序列必须是稳定的,以便进行分析和预测。

这也是我认为这一步需要自动化的主要原因——手工测试很多差异化订单很繁琐。

现在您有了继续进行的工具。感谢阅读。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

* [## 通过我的推荐链接加入 Medium-Dario rade ci

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

medium.com](https://medium.com/@radecicdario/membership)*

数据科学顾问面对客户的技能:奢侈品还是必需品?

原文:https://towardsdatascience.com/what-is-takes-to-be-a-top-data-science-consultant-part-1-client-facing-skills-7803f5c8974c?source=collection_archive---------34-----------------------

成为成功的数据科学顾问需要什么

照片信用。faux els @ Pexels.com

曾经有一段时间,我认为你可以通过拥有优秀的核心技术技能,如机器学习、数据分析和软件工程,成为一名顶级的数据科学顾问。当我开始从事数据科学咨询工作时,我很高兴能成为一家知名全球品牌的顾问。我非常积极地将我在学术和创业生涯中学到的解决方案(通过研究论文、阅读代码库和参加在线课程)应用于大型企业。

我花了几年时间才成为一名经验丰富的数据科学顾问,能够在面向客户的环境中独立工作。

但是很快,现实出现了,我明白我并不具备成为一名成功的数据科学顾问所需的技能。我花了几年时间才成为一名经验丰富的数据科学顾问,能够在面向客户的环境中独立工作。在这些过渡时期,大部分的学习都是在我的项目面临困难,从同事和上级那里得到建设性的或批评性的反馈时进行的。经过这些学习,我开始明白如何作为数据科学顾问成功地为您的客户服务。

除了技术技能之外,成为一名成功的数据科学顾问所需的最关键的技能是你面对客户的技能。简而言之,有许多面向客户的技能,如积极倾听、沟通、换位思考、目标导向的解决问题和奉献精神。在这里,我们重点关注数据科学咨询职业生涯中最关键的一点,即以目标为导向的问题解决。

咨询公司大多是面向客户的专业服务公司,而不是不做产品的公司。这些公司中的大多数人都在从事开发外包解决方案的项目,并最终将它们交付给最终客户。虽然一些团队正在开发产品,但是在面向客户的环境中工作在那些公司中是优先的。

作为一名新入职的数据科学顾问,您可能对您在教育和早期职业生涯中学到的解决方案和技术非常感兴趣。你可能会为自己从事这么多很酷的技术而感到非常自豪,你应该感到自豪。你可能会非常兴奋地向其他人展示你在一些学术论文或教程中读到的见解。你想将你在实践中从新的在线课程中学到的知识应用于你的一个大客户。

你很快就会明白,你项目中的其他人与客户有了更多的接触。也许,他们比你或销售人员高级得多。他们可能会开始告诉你,你提出的解决方案不是客户想要的。或者你把解决方案搞得太复杂了。毕竟,他们比你更了解客户的实际需求。这时候你会开始觉得自己真的不被重视,甚至不受欢迎。

你意识到以客户为中心是咨询公司游戏的重要组成部分

相信我,我理解。你可能会觉得咨询行业不适合你,你不得不离开,重新开始。但是你需要意识到,以客户为中心,也就是说,把客户的需求,以及项目利益相关者放在第一位,是咨询公司游戏中的一个重要部分。大多数时候,你需要关注企业为解决问题而努力实现的最终目标;最终,你解决了客户的问题,而他们并不了解数据科学或人工智能。他们只想解决他们的业务问题。

通常在你早期的咨询生涯中,你提供的解决方案过于复杂,客户难以理解,甚至你的上司也难以解释。这些可能是你最近在一篇论文中读到的一些复杂的深度学习解决方案,并发现它很有趣。你很快就会意识到,在大多数情况下,最好的解决方案是最直接的解决方案,你可以很快向客户展示它们的价值。一旦您的解决方案的总体方向得到批准,您就可以在此基础上构建更复杂的级别,直到达到所需的级别。

除了您提供的解决方案之外,作为管理顾问,您将拥有的一般职业礼仪是您作为数据科学顾问角色的重要组成部分。记住,如果你在一家大型咨询公司工作,你的客户雇佣你的公司为他们提供世界一流的服务。客户最有可能希望得到高质量、高专业水平的工作。

在咨询中,客户永远是对的。

你如何对待你的咨询客户必须是以客户为中心和坚持“客户永远是对的”这一信念的最好例子在为客户提供咨询服务时,你需要高度的同理心、奉献精神和积极的倾听,这是这个行业的精髓。

总之,在咨询公司工作时,你需要非常实际地对待项目要求和解决问题。此外,请记住,作为一名面向客户的数据科学顾问,意味着您始终需要将客户和项目利益相关方的需求和要求置于您希望如何解决业务问题的偏好之上。

关于作者:

Pouyan R. Fard 是 Fard 咨询公司首席执行官&的首席数据科学家。Pouyan 在数据科学、人工智能和营销分析方面拥有多年的公司咨询经验,从初创公司到全球公司。他曾与医药、汽车、航空、运输、金融、保险、人力资源和销售&营销行业的财富 500 强公司合作。

Pouyan 也在指导活跃在大数据行业的初创公司和人才。他的热情是通过职业培训培养下一代数据科学家,并帮助他们找到数据科学领域的顶级工作机会。

Pouyan 已经完成了消费者决策预测建模的博士研究工作,并对开发机器学习和人工智能领域的最先进解决方案保持兴趣。

什么是贝叶斯定理?

原文:https://towardsdatascience.com/what-is-the-bayesian-theorem-a9319526110c?source=collection_archive---------47-----------------------

数据科学、贝叶斯统计、机器学习

贝叶斯有助于对不确定感进行决策。

由凯蒂·穆姆在 Unsplash 上拍摄的照片

贝叶斯是多个变量之间概率交互的交互表示。

“现在,记住贝叶斯定理的作用:它帮助我们根据新的证据更新假设。”― 丹·莫里斯

贝叶斯定理在第二次世界大战期间被著名地用于解决纳粹恩尼格玛密码,今天它通过研究、技术、医学和许多其他手段来管理模糊性。

那么它是如何工作的呢?

照片由Tj·霍洛韦丘克在 Unsplash 上拍摄

第一个例子

假设我需要看看上帝是否存在。

最初,我不得不同意一些技术来量化它。比如“如果上帝存在,那么和谐的可能性应该是战争的数倍”。这就是众所周知的似然函数。

有了这个可能性函数,我可以逐个国家地检查是否有战争或和谐。我需要世界状况的绝对可能性,这是每个国家可能性的结果。模型中,C 中有三个国家 A、B,它们处于战争、战争与和谐之中:

如果上帝存在,可能性是 0.20.20.8

如果上帝不存在,可能性是 080.80.2

在数学中,证明上帝存在的几率是 2 比 8

第二,你制造了一个潜在的猜想或推测。就像,我赌二比一上帝不存在。这就是所谓的先验概率。就像我的信仰一样,我以 10 比 1 的赔率打赌上帝存在。所以:

上帝存在:0.9

上帝不存在:0.1

第三,你利用 B ayes 定理把两者联系起来。你看过数据后的信念是:

p(上帝|数据)= k×似然×先验 p(上帝|数据)= k×似然×先验

这就给出了两种潜在客户的贝叶斯概率:

p(上帝=是|数据)= K*(0.20.20.8)*0.9 = 0.0288

p(God = No | Data)= K (0.8 * 0.8 * 0.2) 0.1 = 0.0128

k 只是一些归一化常数,以使总和为 1,同时保持幅度。最后的结局明白无误地是:

p(上帝=是|数据)= 0.5

p(God = No | Data) = 0.5

沿着这些思路,你开始时是一个有信仰的人,认为(9 比 1)上帝确实存在,你结束时是一个自由思想者!

贝叶斯概率类似于概率的基本原理,我们从最终定罪之前的初始假设出发,通过作为可能性的前提和作为信息的观察。

另一个例子,与在地面上相比,你在高楼顶部被闪电击中的可能性很高。随后,关于该区域的数据改变了可能性。

贝叶斯试图破译这些关于概率的额外数据。鉴于你所在的地区,我们可以比任何地区更准确地预测某个事件发生的可能性。

伊丁·易卜拉希米在 Unsplash 上拍摄的照片

另一个例子

假设你在一个没有窗户的房间里。你意识不到外面是倾盆大雨还是阳光明媚。因此,今天有暴风雨的几率相当于晴天的几率。

你需要一些推理要么是暴风雨,要么今天是晴天。今天没有理由讨论它发光的可能性。这种可能性就是当某件事即将发生时,你做出一个估计。

因此,相对于陈述它有多大机会发光,我们谈论今天你接受多少是明亮的,这经常被称为贝叶斯理解。我们只是用一种意想不到的方式来表达。

现在你的同伴去了你的房间。假设他带了一把伞。在你的同伴到来之前,你认为狂风大作的程度等同于你认为阳光灿烂的程度。

然而,在看到一把伞之后,你会想它可能是因为其他什么原因而落下来的,我的同伴会带着一把伞吗?

你还不确定气候,但现在你的信念更倾向于暴风雨。

话又说回来,如果你的同伴戴着一顶帽子,可能它在外面会发光。目前,你更相信它光明的外表,而不是狂风大作。

你简单地做了一个贝叶斯更新。你提到了一个客观事实,看到你的同伴带着一把伞或一顶帽子,并利用这个数据来更新你对当前气候的看法。这被称为贝叶斯更新

你可以继续观察。如果你多次做同样的观察,你的信念倾向于偏向一边。

在看到你的同伴拿着一把伞之后,假设你对外面正在下雨的信念有 75%来自于潜在的一半。此时,假设你的姐妹在你的同伴离开后进来。

她也有一把伞。目前,当外面真的很亮的时候,你的同伴和你的姐妹都带着伞出现的几率非常低。

所以现在你更确定外面在下大雨。可能现在你的信念状态是 85%倾倒对 15%辐射。

这实际上是一个在隐马尔可夫模型中观测更新的例子,在这种情况下,你不能合理地看到气候,但你可以提到依赖于气候的客观事实。

同样,你可以把你对之前气候的更新放在一起,而不是放在一个同伴身上。假设在你的城市连续两天下雨真的很少见。

你还在你的房间里,然而有人来告诉你,它昨天就下来了。所以也许今天天气很好。

在意识到昨天是狂风大作的一天之前,你确信外面正下着倾盆大雨,就相当于你确信天气晴朗。

然而,在意识到它昨天已经下降之后,你相信它是明亮的,而不是它正在下降。

这通常被称为进度更新。你从一天前进到第二天,你利用前一天的数据来推测今天的情况。

具体来说,贝叶斯推理将概率解释为一个人是否可能或有可能因为特定原因而出现的比例。

由凯利·西克玛在 Unsplash 上拍摄

结论

我们可能对某个场合有更早的信念;然而,随着新证据的公布,我们的信念可能会改变。

贝叶斯观点为我们提供了一个清晰的实证工具来强化我们先前的信念,并提供证据来创造新的后来的信念。

现在,把你对TwitterLinkedin,以及Github!!**

同意 还是 不同意 与 Saurav Singla 的观点和例子?想告诉我们你的故事吗?

他乐于接受建设性的反馈——如果您对此分析有后续想法,请在下面评论或联系**

推文@ SauravSingla _ 08,评论Saurav _ Singla,还有明星SauravSingla马上!

到底什么是偏差-方差权衡,为什么它很重要?

原文:https://towardsdatascience.com/what-is-the-bias-variance-tradeoff-c3fda9897fff?source=collection_archive---------36-----------------------

数据科学概念

它们彼此有多么不同

亚历克斯在 Unsplash 上的照片

W 当谈到数据科学时,人们必须确保他们的机器学习模型“恰到好处”。每一个机器学习模型都有不同的两面: 偏差方差 。作为数据科学家,我们必须寻找一种在两者之间达到完美平衡或至少接近完美平衡的模型。就像《金发姑娘和三只熊》中的金发姑娘一样,我们必须寻找一个既不“太热”也不“太冷”的模型。

这就是“偏差-方差权衡”的总体概念。偏差方差是机器学习模型中的误差。当我们构建和训练我们的机器学习模型时,我们的目标是尽可能减少错误。在理想情况下,我们能够将模型中的偏差和方差都降低到零。然而,如果偏差减少到零,那么方差将增加,反之亦然。因此,为了优化我们的模型,我们必须能够在两者之间找到一个平衡点,这样我们就可以同时减少偏差和方差。

在这里注册一个中级会员,可以无限制地访问和支持像我这样的内容!在你的支持下,我赚了一小部分会费。谢谢!

什么是偏见?

偏差是机器学习模型中的一个错误。该误差是模型预测值和实际值之间的差异。

在统计学中,偏差是低估或高估一个参数的趋势。偏差可以以多种不同的形式出现,如 采样偏差选择偏差

照片由罗姆森·普里查维特在 Unsplash 上拍摄

什么是方差?

方差也是机器学习模型中的一个误差。这次的错误是模型对数据的敏感性。如果它太敏感,那么模型可能会看到实际上并不存在的信号和模式。

在统计学上,方差是数据集中每个变量与所有变量的平均值或均值之间的距离。它测量数据集的分布以及每个变量之间的距离。

偏差与方差

在偏倚和方差之间,哪个误差应该减少得最多?如果你选择减少一个错误而不是另一个,会发生什么呢?错误就是错误,所以总的来说,有一个或另一个并不更好。

欠拟合和过拟合

如果我们优先考虑减少一个误差,那么我们将得到一个模型,要么 过度拟合,要么 数据不足。这意味着模型不会为任何新数据提供可用的结果。在拟合不足的情况下,模型无法拟合训练数据,因此将无法概括新数据。过度拟合将导致模型对训练数据建模得太好;检测数据中实际不存在的模式和噪声。这可能会对任何新数据的建模结果产生负面影响。

减少两者

由于优先减少一个错误的影响,我们必须同时减少两个错误。这将引导我们达到我们希望的最好结果。

偏差-方差权衡的准确性

看一下四个目标的图像以及偏差和方差对精确度的影响。随着偏差的增加,结果完全偏离目标,尽管是一致的。随着方差的增加,结果有时会接近标准,但过于分散。如果偏差和方差都很高,那么结果是分散的,完全偏离目标,如右上方的目标所示。最好的选择是偏差和方差最小的目标,其结果始终如一地准确。

为了获得最佳模型,偏差和方差都必须尽可能地降低。

最佳模型

降低偏差和方差意味着减少模型中的总误差。这也意味着创建一个不太简单也不太复杂的模型。当考虑偏差和方差时,我们也要考虑模型的复杂性。太复杂的模型是过度拟合的模型,太简单的模型是拟合不足的模型。这也与偏差和方差的方向相关。

观察误差和模型复杂性的图像,我们可以看到实现最佳模型的点。

绘制偏差-方差权衡图

想象上面的图像是一个大山谷。即使到达山顶可能更令人钦佩,但在偏差-方差权衡的情况下,我们希望到达谷底。谷底或最低点是我们在创建机器学习模型时希望偏差、方差和总误差保持不变的地方。

一旦我们能够实现最低可能的偏差和方差,那么我们就实现了最佳的机器学习模型。

结束语

正如您已经看到的,当涉及到偏差和方差时,减少一个比另一个更好的方法并不可取。偏差是实际值和模型预测值之间的误差。方差也是一个误差,但是来自模型对训练数据的敏感性。

如果我们的目标只是减少两者中的一个,那么另一个就会增加。偏差优先于方差将导致模型过度拟合数据。区分差异的优先级将使模型不符合数据。这两种结果都不被看好。然而,有一个点,我们可以在不影响另一个的情况下减少偏差和方差,这就是我们正在寻找的点。

为了实现最佳的机器学习模型,我们必须平衡两者的缩减。这将给我们一个既不太简单(数据欠拟合)也不太复杂(数据过拟合)的模型。这两种误差减少的平衡将使我们达到最佳的模型复杂度。这是偏差-方差权衡的总体概念。

在 Twitter 上关注我:@Marco_Santos

我们需要的数据架构是什么?

原文:https://towardsdatascience.com/what-is-the-data-architecture-we-need-72606e71ba0c?source=collection_archive---------7-----------------------

照片通过 Pixabay

在大数据和数据科学的新时代,对于企业来说,拥有一个与业务流程一致的集中式数据架构至关重要,这种架构可以随着业务增长而扩展,并随着技术进步而发展。一个成功的数据架构提供了数据各个方面的清晰性,这使得数据科学家能够高效地使用可信的数据,并解决复杂的业务问题。它还通过利用新兴技术帮助组织快速利用新的业务机会,并通过管理整个企业中复杂的数据和信息交付来提高运营效率。

与信息体系结构、系统体系结构和软件体系结构相比,数据体系结构相对较新。数据架构师的角色也很模糊,落在了高级业务分析师、ETL 开发人员和数据科学家的肩上。尽管如此,我将使用数据架构师来指代那些为组织设计数据架构的数据管理专业人员。

当谈到建筑时,我们经常会想到与建筑的类比。传统的建筑建筑师规划、设计和审查建筑的建造。设计流程包括与客户合作,充分收集需求,了解当地的法律和环境限制,并与工程师、测量员和其他专家合作,以确保设计切实可行且在预算范围内。这项工作的复杂性确实非常类似于数据架构师的角色。然而,这两种架构师角色之间有一些基本的区别:

  • 建筑架构是自顶向下设计的,而数据架构通常是可能已经存在的组件或系统的集成过程。
  • 建筑设计师在建造建筑之前,必须了解所有的要求并定义整个范围。数据架构的范围很广,很容易改变。因此,一个成功的数据架构应该设计得灵活,并能预见未来的变化。
  • 建筑建筑师有严格的教育和专业要求,应该拥有商业、艺术、结构物理和建筑材料方面的深入知识。另一方面,大多数数据架构师都有 IT 背景,在一些公司或行业有专业经验,对业务的了解有限。因此,他们应该意识到他们的设计可能会有偏差,他们需要根据组织中业务和技术专家的反馈进行调整。
  • 建筑设计几乎总是为新建筑从头开始。因此,建筑建筑师可以完全根据新要求和新材料进行规划和设计。数据架构师没有这种奢侈。他们很少能从零开始,但在设计未来时需要了解现有的平台和数据库。

考虑到所有这些差异,数据架构师仍然可以向建筑架构师学习,特别是采用他们自顶向下的方法来改进数据架构设计。在许多组织中,缺乏系统的、集中的、端到端的数据架构设计。下面列出了一些主要原因:

  • 一家公司有多个 IT 部门,他们各自使用自己的数据标准和架构。
  • 应用程序和流程是基于单个业务需求构建的,没有数据架构标准可循。
  • 数据架构师的角色只关注有限数量的技术领域,并且拥有有限的数据业务知识。
  • IT 项目的管理没有将数据架构作为设计阶段的一部分来考虑;数据科学家和工程师在没有一致的数据管理流程的情况下编写代码。

由于这些不足,我们经常看到公司的数据系统脱节,团队和部门之间存在差距。这种差异导致系统性能不佳,移交次数多,出现生产数据问题时需要很长时间进行故障排除,缺乏跨系统达成正确解决方案的责任感,以及缺乏评估变更影响的能力。最后,当迁移或重新设计到下一代平台时,脱节的系统可能会导致大量的分析和研究工作。

鉴于所有这些,一个成功的企业需要有一个基于业务流程和操作设计的自顶向下的一致的数据架构。特别是,就像建筑架构师所做的那样,在将技术应用到详细的应用程序设计和实现之前,企业数据架构师需要首先在概念和逻辑级别构建蓝图。

1。基于业务流程和操作的概念级数据架构设计

在现代 IT 中,业务流程由数据实体、数据流和应用于数据的业务规则支持和驱动。因此,数据架构师需要有深入的业务知识,包括财务、营销、产品和业务流程的特定行业专业知识,例如健康、保险、制造商和零售商。然后,他或她可以通过设计代表每个业务领域的数据实体和分类法,以及业务流程下的数据流,在企业级正确地构建数据蓝图。特别是,在此概念阶段需要考虑和规划以下方面:

  • 核心数据实体和数据元素,如关于客户、产品、销售的数据实体和数据元素。
  • 客户和顾客需要的输出数据。
  • 要收集、转换或引用的源数据,以生成输出数据。
  • 每个数据实体的所有权,以及基于业务用例应该如何消费和分配它。
  • 应用于每个数据实体的安全策略。
  • 数据实体之间的关系,例如引用完整性、业务规则、执行顺序。
  • 标准数据分类和分类学。
  • 数据质量、运营和服务水平协议(SLA)的标准。

这个概念级的设计由支持每个业务功能的底层数据实体组成。蓝图对于企业和系统架构的成功设计和实现及其未来的扩展或升级至关重要。在许多组织中,这种概念设计通常嵌入到由单个项目驱动的业务分析中,而没有从企业端到端解决方案和标准的角度进行指导。

2。逻辑级数据架构设计

通过考虑使用哪种类型的数据库或数据格式,这种级别的设计有时被称为数据建模。它将业务需求与底层技术平台和系统联系起来。然而,考虑到数据建模者的孤立角色,大多数组织只在特定的数据库或系统中设计数据建模。通过考虑适用于每个数据库或系统的标准,以及这些数据系统之间的数据流,一个成功的数据架构应该用一种集成的方法来开发。特别是,需要以协同方式设计以下 5 个领域:

命名约定和数据完整性

数据实体和元素的命名约定应该一致地应用于每个数据库。此外,如果相同的数据必须驻留在多个数据库中,应该加强数据源及其引用之间的完整性。最终,这些数据元素应该属于数据架构中的概念设计中的数据实体,然后可以基于业务需求对其进行协同和准确的更新或修改。

数据归档/保留政策

数据归档和保留策略通常直到生产的后期才被考虑或建立,这导致了资源浪费、不同数据库之间的数据状态不一致,以及数据查询和更新的低性能。为了加强数据完整性,数据架构师应该根据操作标准在数据架构中定义数据归档和保留策略。

隐私和安全信息

隐私和安全成为逻辑数据库设计的一个重要方面。虽然概念设计已经定义了哪个数据组件是敏感信息,但是逻辑设计应该将机密信息保存在一个数据库中,该数据库具有受限的访问权限、受限的数据复制、特定的数据类型和安全的数据流来保护信息。

数据复制

数据复制是考虑三个目标的关键方面:1)高可用性;2)避免通过网络传输数据的性能;3)解耦以最小化下游影响。然而,过多的数据复制会导致混乱、数据质量差和性能差。任何数据复制都应该由数据架构师检查,并按照原则和规则进行应用。

数据流和流水线

不同数据库系统和应用程序之间的数据流应该在这个层次上明确定义。同样,这个流程与业务流程和数据架构师概念层次中的流程是一致的。此外,数据接收的频率、管道中的数据转换以及针对输出数据的数据访问模式应该在逻辑设计的集成视图中加以考虑。例如,如果上游数据源是实时的,而下游系统主要用于具有大量索引的聚集信息的数据访问(例如,频繁更新和插入的开销很大),则需要在两者之间设计数据管道来优化性能。

3。数据治理是数据架构持续成功的关键。

由于数据架构反映并支持业务流程和流,因此每当业务流程发生变化时,数据架构也会随之变化。随着底层数据库系统的改变,数据架构也需要调整。因此,数据架构不是静态的,而是需要不断地管理、增强和审计。因此,应该采用数据治理,以确保在每个新项目启动时,企业数据架构的设计和实现都是正确的。

结论

在一个成功的数据架构中,基于业务流程的概念设计是最重要的组成部分,其次是强调所有数据库和数据管道的一致性、完整性和效率的逻辑设计。一旦建立了数据架构,组织就可以看到哪些数据驻留在哪里,并确保数据得到保护、高效存储和准确处理。此外,当一个数据库或一个组件发生更改时,数据架构可以让组织快速评估影响,并指导所有相关团队进行设计和实现。最后,数据架构是企业系统的活文档,它保证是最新的,并给出清晰的端到端的描述。总之,反映端到端业务流程和运营的整体数据架构对于公司在经历重大变革(如收购、数字化转型或向下一代平台迁移)的同时快速高效地发展至关重要。

SQL 中的 having 子句和 where 子句有什么区别?

原文:https://towardsdatascience.com/what-is-the-difference-between-a-having-clause-and-a-where-clause-in-sql-ed74e0a8ad6d?source=collection_archive---------2-----------------------

一个常见的面试问题解释

在 SQL 中,其中子句和 having 子句用于过滤数据。这里的子句相当简单,但是子句就有点复杂了。 Where 子句按表中的形式过滤数据。相比之下,具有子句的分组聚合之后过滤数据。另一种说法是, where 作用于单个记录,而have作用于分组记录。

在这个故事中,我将描述 where 子句和 having 子句。然后,我将使用《吸血鬼猎人巴菲》中的角色,通过一个使用了 where 子句的示例和一个 having 子句的示例。

https://imgs.xkcd.com/comics/query_2x.png

场景

剧透警报

这个场景提到了《吸血鬼猎人巴菲》中的故事情节,所以如果你还没有看过,也不想知道会发生什么…停止在这里阅读。然而,鉴于它开始于 1997 年,结束于 2003 年,我认为我们可能是相当安全的😜

巴菲和她的朋友住在地狱口的阳光谷。巴菲是吸血鬼猎人,但其他角色也有助于猎杀吸血鬼和恶魔。

假设我们有一个包含在地狱之口收集的数据的表。这张表叫做吸血鬼 _ 被杀,显示了生活在阳光谷的所有角色杀死的吸血鬼数量。它也给每个人一个他们所属的类别标签,包括杀戮者,吸血鬼,平民和守望者。

在整个系列中,巴菲死了两次。第一季有一次主人淹死了她。她复活了,之后继续杀吸血鬼。她第二次死是在第五季的最后一集,她从一座塔上跳下,进入一个传送门,代替她的姐姐道恩死去。在第六季开始时,她的朋友们用巫术把她从死亡中带了回来,她也回去猎杀吸血鬼。

由于她死了两次,巴菲实际上在吸血鬼 _ 被杀表中有三个条目。

这些数字不是真实的。我编造了这些故事来猜测每个角色一生中会杀死多少吸血鬼。没错,我现在正在狂看《魔法奇兵》的整个 7 季,但我不会坐在那里统计所有死去的吸血鬼。

如果你想知道每个角色在屏幕上被杀死的实际次数,你可以在这里找到。我没有在我的例子中使用这些数字,因为这些数字偏向于那些有更多屏幕时间的主要角色。

问题是

费思和巴菲在吵架。他们一直有竞争,但这场争论是关于谁杀了最多的吸血鬼。费思认为只有她杀了 1000 多个吸血鬼,而巴菲还没有达到这个数字。巴菲不同意,并认为她已经杀死了 1000 多个吸血鬼。

为了解决他们的争吵,贾尔斯使用了吸血鬼 _ 被杀的记录。

CREATE TABLE vampires_slain (
    name varchar(255),
    hellmouth_category varchar(255),
    slay_count int
);
INSERT INTO vampires_slain (name, hellmouth_category, slay_count)
VALUES
    ('Buffy', 'slayer', 104),
    ('Willow', 'civilian', 65),
    ('Xander', 'civilian', 89),
    ('Buffy', 'slayer', 886),
    ('Angel', 'vampire', 1397),
    ('Giles', 'watcher', 673),
    ('Kendra', 'slayer', 1260),
    ('Spike', 'vampire', 1108),
    ('Faith', 'slayer', 1421),
    ('Buffy', 'slayer', 957)
;

吸血鬼 _ 被杀

环境

为了运行这个例子中的代码,我在 SQL Fiddle 中使用了 MySQL 5.6。如果您想尝试运行代码,请随意使用它。

解决方案

为了解决巴菲和菲斯之间的争论,贾尔斯想要过滤掉**吸血鬼 _ 被杀的表格。**他想只显示那些 slay_count 大于 1000 的个体。他试图使用一个 where 子句来实现。

Where 子句

其中在 SQL 中是一个简单的过滤器。如果满足查询的 where 条件,则在结果中返回该行数据。就这么简单。

在查询中, where 子句最常用在 from 之后。您可以在 where 子句中使用许多不同的运算符,包括 =、>、<、> =、< =、!=,之间,像中的和**。注意,在 MySQL 中要么**!=** 或 < > 可以用来表示‘不等于’。**

select *
from
vampires_slain
where
slay_count > 1000
order by 
slay_count desc;

费思很惊讶,她不是唯一一个杀死了 1000 多个吸血鬼的人。安吉尔、肯德拉和斯派克也在 slay_count 大于 1000 的名单中。

巴菲惊讶地发现她不在名单上。就连年纪轻轻就被杀的肯德拉也有 1000 以上的 slay_count

当巴菲买下肯德拉时,贾尔斯意识到当巴菲死了,肯德拉被召唤成为一名杀手时,巴菲的记录可能会一分为二。然后他想起她为了救 Dawn 第二次死了,并得出结论,Buffy 在表中有 3 个条目。

为了合并这三个记录,Giles 决定使用一个具有子句的**。这样他就能看到巴菲三个条目的是否大于 1000,以及她杀死的吸血鬼数量是否大于费思。**

Having 子句

where 关键字不能与聚合函数一起使用。这就是有了的的用武之地。 Having 只能通过子句与组结合使用。SQL 中一些最常见的聚合函数有 minmaxavecountsum

当在查询中使用具有的时,只返回满足具有条件的组**。**

贾尔斯用一个 having 子句解决了巴菲两次进入吸血鬼 _ 被杀表的问题。他按名称对条目进行分组,这样 Buffy 的两个条目将合并为一个。她名下的两个条目将使用 having 子句中的 sum 聚合函数进行求和

然后,他可以再次使用 > 符号来过滤数据集,以仅包含总和 slay_count 大于 1000 的分组条目。

select name, hellmouth_category, sum(slay_count)
from
vampires_slain
group by 
name
having
sum(slay_count)>1000
order by sum(slay_count) desc;

因此,一旦 Giles 使用了 having 子句,就会对每个个体的 slay_counts 进行求和,然后过滤生成一个表,该表只包含 sum(slay_count) 大于 1000 的个体。结果表像以前一样包含了费思、安吉尔、肯德拉和斯派克,但它也包含了具有 1947 年 sum(slay_count) 的巴菲。

因此,贾尔斯解决了争论。巴菲和费思的总死亡数都超过了 1000。信仰是错误的。巴菲不仅杀死了 1000 多只吸血鬼,而且她在 1947 年杀死的吸血鬼总数比费思的 1421 只还多。

我如何使用 where 和 having 子句

我不得不承认,在我的日常数据库查询中,我倾向于不太使用 having 子句。相反,我通常会创建中间表,其中的项目被分组。然后,如果需要的话,我会使用一个 where 子句来过滤中间表。我想我经常分组字段或者过滤它们,但很少同时两者。

我之所以会创建中间表而不是使用带有子句的来创建中间表,主要是因为我所处理的数据都在非常大的表中。当使用具有子句的时,会在内存中创建一个临时表。这意味着,对于大型数据集,使用具有子句的的查询会花费很长时间。

然而, having 从句在科技面试中经常被用作问题。这是因为它们是需要正确使用的比较棘手的 SQL 子句之一。因此,即使你很少在实践中使用它们,了解它们的工作原理并对它们感到舒适也是值得的。

我希望这个例子有助于澄清 SQL 中的 wherehaving 之间的区别。

除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com找到我的野生动物艺术

我写过的关于 SQL 的其他文章:

[## SQL 中的内部连接和外部连接有什么区别?

SQL 中的内部连接、完全外部连接、左外部连接和右外部连接使用来自以下领域的示例进行解释…

towardsdatascience.com](/what-is-the-difference-between-an-inner-and-an-outer-join-in-sql-5b5ec8277377)

我写的关于数据科学的文章:

[## 我如何在 6 个月内从零编码技能成为数据科学家

我用来自学数据科学的 4 个工具没有花一美元

towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3)

SQL 中的内部连接和外部连接有什么区别?

原文:https://towardsdatascience.com/what-is-the-difference-between-an-inner-and-an-outer-join-in-sql-5b5ec8277377?source=collection_archive---------1-----------------------

SQL 中的内连接、全外连接、左外连接和右外连接用哈利波特世界中的例子来解释

SQL 中的连接用于组合不同表的内容。您可以通过多种方式指定希望如何联接表中的数据,其中一种方式是联接类型。有四种主要的联接类型:内部联接、完全外部联接、左外部联接和右外部联接。

内部联接和外部联接的主要区别在于,内部联接导致两个表的交集,而外部联接导致两个表的并集。

在这个故事中,我将描述内部连接、完全外部连接、左外部连接和右外部连接之间的区别。然后,我将通过一个使用《哈利·波特》中人物的例子来展示这些不同之处。

可视化连接

一个维恩图是一个可视化内部连接和外部连接之间差异的有用方法。

内部联接和完全外部联接

内部连接导致两个数据集的维恩图的重叠部分,而对于完全外部连接,维恩图的外部部分也将被返回。

对于内部联接,只返回两个表共有的行。但是,对于完全外部连接,将返回两个表中的所有行。

数据库中名为 Table_1 和 Table_2 的两个表

**内部连接:**内部连接的结果将只包含 Table_1 和 Table_2 重叠的黄色部分

**完全外部连接:**外部连接的结果将包含所有黄色部分,包括整个 Table_1 和 Table_2,而不仅仅是两个圆重叠的地方

左右外部联接

如果您希望从一个表中获取所有值,但从另一个表中只获取与该表匹配的行,则左右外部联接非常有用。

因此,在左外连接中,将返回左表中的所有行以及右表中共有的行。相比之下,对于右外连接,将返回右表中的所有行以及左表中共有的行。

**左外连接:**左外连接的结果将包含 Table_1 和 Table_2 重叠的黄色部分,以及包含 Table_1 其余部分的黄色部分

**右外连接:**右外连接的结果将包含 Table_1 和 Table_2 重叠的黄色部分,以及包含 Table_2 其余部分的黄色部分

例子

环境

为了运行这个例子中的代码,我在 SQL Fiddle 中使用了 PostgreSQL 9.6。如果您想尝试在不设置复杂环境的情况下运行代码,请随意使用。我已经简化了示例中表格的输出,删除了重复的列,只是为了让它更清晰、更容易理解,所以如果您尝试了一下,看起来有点不同,不要惊慌。对于这个故事,我使用 PostgreSQL 而不是 MySQL,因为 MySQL 不使用完全外连接。

哈利·波特场景

让我们假设您正试图连接霍格沃茨魔法学校的两个学生成绩表。这些桌子被称为魔药 _ 类魔咒 _ 类。每个表格都有两列,包含学生姓名和成绩。

CREATE TABLE charms_class(
student_namevarchar(255),
charms_gradevarchar(255)
);INSERT INTO charms_class (student_name, charms_grade)
VALUES
    ('Harry', 'C'),
    ('Ron', 'D'),
    ('Hermione', 'A'),
    ('Luna', 'B'),
    ('Neville', 'B')
;CREATE TABLE potions_class(
student_namevarchar(255),
potions_gradevarchar(255)
);INSERT INTO potions_class (student_name, potions_grade)
VALUES 
    ('Harry', 'A'),
    ('Ron', 'C'),
    ('Hermione', 'B'),
    ('Ginny', 'A'),
    ('Draco', 'D')
;

charms_class

魔药课 _ 课堂

内部联接示例

想象一条龙威胁着霍格沃茨城堡。只有同时参加魔药课和魔法课的学生才能和老师一起出去保卫学校。

要找出哪些学生同时上了 charms 课和魔药课,以及他们在每门课中的成绩,可以使用 charms_class 和魔药课表中的内部联接。

select * 
from 
charms_class INNER JOIN potions_class 
on 
charms_class.student_name=potions_class.student_name;

生成的表如下所示:

在这个内部连接的例子中,只有哈利、罗恩和赫敏同时参加了魔咒和魔药课,所以他们两个班级的成绩都在结果中返回。请注意,只注册了一个班而没有注册另一个班的学生不会出现在结果中。

因此只有哈利、罗恩和赫敏被允许面对龙。

完全外部连接示例

魔法部只雇佣完成了魔咒课和魔药课的毕业生。然而,没有足够的学生具备担任所有角色所需的先决条件,所以魔法部想要一份已经注册了一个班级的学生名单。

要找出哪些学生在魔法班或魔药班,可以使用一个完整的外部连接。请注意,如果学生没有注册魔药课,魔药等级值将为空,同样地,如果学生没有注册魔药课,魔药等级值也将为空。

所以任何一个成绩栏中有空值的学生都是魔法部想要联系的人。

select * 
from 
charms_class FULL OUTER JOIN potions_class 
on 
charms_class.student_name=potions_class.student_name;

生成的表如下所示:

在这个完全外部连接的示例中,所有学生都包含在结果表中。只有哈利、罗恩和赫敏同时参加了魔法和魔药课,所以他们这两门课的成绩都在结果中返回,并且在他们的行中没有空值。

金妮和德拉科只有魔药课的成绩,因为他们没有使用符咒,所以他们的符咒成绩被指定为空值。卢娜和纳威只有魔法等级,因为他们没有学过魔药,所以他们的魔药等级被赋值为空值。

因此金妮、德拉科、卢娜和纳威都是可以选修额外课程的学生,以便毕业后能够在魔法部工作。

左外部联接示例

校长办公室搞了一场恶作剧,邓布利多教授的所有家具都漂浮在天花板上。参加魅力课程并获得 C 级或更高成绩的学生受到怀疑。然而,上魔药课的学生不可能是罪犯,因为恶作剧发生时他们的班级正在进行实地考察。

为了找出哪些学生在 charms 班的成绩为 C 或更高,而没有在魔药班注册,我们将使用左外连接来连接 charms_class 表和魔药 _class 表。请注意,如果学生没有注册魔药课,魔药课成绩值将为空。

select * 
from 
charms_class LEFT OUTER JOIN potions_class 
on 
charms_class.student_name=potions_class.student_name;

生成的表如下所示:

只有哈利、罗恩和赫敏同时参加了魔法和魔药课,所以他们这两门课的成绩都在结果中返回,并且在他们的行中没有空值。

卢娜和纳威只有魔法等级,因为他们没有学过魔药,所以他们的魔药等级被赋值为空值。

金妮和德拉科没有服用魔咒,所以他们没有包括在这个结果表中。

因此,校长办公室恶作剧的嫌疑人是卢娜和纳威。他们在魔法课上都得了 B,而且事发时都不在魔药课上。

右外部联接示例

斯内普教授经营着一个魔药俱乐部,在魔法课上同时开会。只有注册了魔药课但没有注册魔药课的学生才可以参加俱乐部。

要找出哪些学生上了魔药课,哪些没上魔药课,你可以使用一个右外连接。请注意,如果学生没有注册 charms 类,charms_grade 值将为空。

select * 
from 
charms_class RIGHT OUTER JOIN potions_class 
on 
charms_class.student_name=potions_class.student_name;

生成的表如下所示:

在这个右外连接的例子中,只有哈利、罗恩和赫敏同时参加了魔咒和魔药课,所以他们两个班的成绩都在结果中返回,并且他们的行中没有空值。

金妮和德拉科只有魔药课的成绩,因为他们没有使用符咒,所以他们的符咒成绩被指定为空值。

卢娜和纳威没有服用魔药,所以他们没有被包括在这个结果表中。

因此只有金妮和德拉科可以加入魔药俱乐部,因为他们不上魔法课。

我如何使用联接

作为一名数据科学家,我使用最多的连接是左外连接。例如,我曾经处理过健康数据,并且经常会按位置汇总程序编号。在这种情况下,我会将位置表放在左边,然后进行左连接。这是因为可能有一些位置我没有任何过程,如果我做了一个内部连接,我会丢失这些位置。当您只需要完整的数据集,而不需要添加外部联接带来的空值时,内部联接会更有用。我很少使用完全外连接,除非需要保留被连接的两个表中的所有数据。完全外连接最终可能会产生非常大的结果表,尤其是在要连接的表之间没有太多重叠的情况下。

如果你想解释不同的 SQL 方法,请在下面留下评论。

[## 通过我的推荐链接加入 Medium-Kate Marie Lewis

想了解更多关于数据科学的知识吗?今天就成为会员吧&不要错过凯特的帖子,直接交会员费…

medium.com](https://medium.com/@katemarielewis/membership)

如果您想了解更多关于我如何成为数据科学家的信息,请访问:

[## 我如何在 6 个月内从零编码技能成为数据科学家

我用来自学数据科学的 4 个工具没有花一美元

towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3) [## 让我获得第一份数据科学工作的面试策略

我是如何展示自己得到这份工作的

towardsdatascience.com](/interview-strategy-that-landed-me-my-first-data-science-job-bdd5e77bfb49) [## 愤怒退出癌症研究

为什么我从神经科学家变成了数据科学家

towardsdatascience.com](/rage-quitting-cancer-research-5e79cb04801)

CNN 和 RNN 的区别是什么?

原文:https://towardsdatascience.com/what-is-the-difference-between-cnn-and-rnn-719dba4fd5a5?source=collection_archive---------43-----------------------

卷积神经网络和递归神经网络是当今 ML 中常用的方法。然而,它们通常用于完全不同的用例。

作者图片

在机器学习中,每种类型的人工神经网络都是为某些任务量身定制的。本文将介绍两种类型的神经网络:卷积神经网络(CNN)和递归神经网络(RNN)。使用流行的 Youtube 视频和视觉辅助工具,我们将解释 CNN 和 RNN 之间的区别,以及它们如何用于计算机视觉和自然语言处理。

CNN 和 RNN 的区别是什么?

CNN 和 RNN 的主要区别在于处理时序信息或数据的能力,比如一个句子。此外,卷积神经网络和递归神经网络用于完全不同的目的,并且神经网络本身的结构存在差异以适应那些不同的使用情况。

CNN 在卷积层中使用滤波器来转换数据。然而,rnn 重用序列中其他数据点的激活函数来生成序列中的下一个输出。

虽然这是一个经常被问到的问题,但是一旦你看了这两个神经网络的结构并理解了它们的用途,CNN 和 RNN 之间的区别就变得很明显了。

首先,让我们看看 CNN 以及它们是如何被用来解读图像的。

什么是卷积神经网络?

卷积神经网络是在计算机视觉中用于识别图像中的对象和模式的最常见的神经网络类型之一。它们的定义特征之一是在卷积层中使用滤波器。

卷积层
CNN 有独特的层,称为卷积层,将它们与 rnn 和其他神经网络分开。

作者图片

在卷积层中,输入在被传递到下一层之前被转换。CNN 通过使用过滤器来转换数据。

卷积神经网络中的滤波器是什么?

CNN 中的过滤器只是一个随机数值矩阵,如下图所示。

作者图片

过滤器中的行数和列数可以变化,这取决于用例以及正在处理的数据。在一个卷积层中,有许多过滤器在图像中移动。这个过程被称为卷积。过滤器卷积图像的像素,在将数据传递到 CNN 的下一层之前改变它们的值。

过滤器是如何工作的?

为了理解过滤器如何转换数据,让我们看看如何训练 CNN 识别手写数字。下面是来自 MNIST 数据集的数字 7 的 28 x 28 像素图像的放大版本。

图像取自 MNIST 数据集

下面是相同的图像转换成它的像素值。

当滤波器在图像中卷积时,滤波器中的值矩阵与图像的像素值对齐,并获得这些值的点积。

作者图片

过滤器移动或“卷积”通过每个 3×3 像素矩阵,直到所有像素都被覆盖。然后,每个计算的点积用作下一层的输入。

最初,过滤器中的值是随机的。因此,第一次通过或卷积作为一个训练阶段,最初的输出不是很有用。每次迭代后,CNN 使用损失函数自动调整这些值。随着训练的进行,CNN 不断调整过滤器。通过调整这些过滤器,它能够区分边缘,曲线,纹理,以及图像的更多模式和特征。

虽然这是一个惊人的壮举,但为了实现损失函数,CNN 需要以标记训练数据的形式给出正确输出的例子。

当迁移学习无法应用时,许多卷积神经网络需要过量的标记数据。

你还不明白 CNN 吗?下面是杰瑞米·霍华德在 fast.ai 上的一个精彩但冗长的视频讲座。视频详细说明了 CNN 的工作原理:

CNN 的不足之处

CNN 擅长解释视觉数据和没有顺序的数据。然而,它们不太擅长解释时间信息,如视频(本质上是一系列单独的图像)和文本块。

文本中的实体提取是序列中不同部分的数据如何相互影响的一个很好的例子。对于实体,句子中实体前后的单词对它们的分类有直接影响。为了处理时间或序列数据,如句子,我们必须使用算法,这些算法被设计为从序列中的过去数据和“未来数据”中学习。幸运的是,循环神经网络正是这样做的。

什么是递归神经网络?

递归神经网络结构—图片 via colah.github.io

递归神经网络是设计用于解释时间或顺序信息的网络。rnn 使用序列中的其他数据点进行更好的预测。它们通过接收输入并重用序列中前面或后面节点的激活来影响输出。如前所述,这在实体提取等任务中非常重要。以下面这段文字为例:

罗斯福总统是美国历史上最有影响力的总统之一。然而,曼哈顿的罗斯福街并不是以他的名字命名的。

在第一句话中,罗斯福应该被称为一个人实体。而在第二句中,它应该被标记为街道名称或位置。如果不考虑前面的单词“总统”和后面的单词“街道”,就不可能知道这些区别。

自动更正的 RNNs

为了更深入地了解 rnn 是如何工作的,让我们看看它们是如何用于自动更正的。基本上,自动更正系统将您键入的单词作为输入。使用该输入,系统预测拼写是正确的还是不正确的。如果这个单词与数据库中的任何单词都不匹配,或者不符合句子的上下文,系统就会预测正确的单词可能是什么。让我们想象一下这个过程如何与 RNN 一起工作:

作者图片

RNN 将接受两个输入源。第一个输入是您键入的字母。第二个输入将是与您之前键入的字母相对应的激活功能。假设您想输入“网络”,但却错误地输入了“networc”。系统接收前面字母“网络”和您输入的当前字母“c”的激活功能。然后它吐出“k”作为最后一个字母的正确输出。

这只是一个简单的例子,说明了 RNN 的拼写纠正系统是如何工作的。今天,数据科学家使用 rnn 做更多不可思议的事情。从生成文本和图像字幕到创作音乐和预测股票市场波动,rnn 有无穷无尽的潜在用例。

希望这篇关于 CNN 和 RNNs 的简介能帮助你理解这两种神经网络的区别。虽然处理时间或顺序数据的能力是主要区别之一,但网络本身的结构及其用例也有很大不同。

要获得更多机器学习指南、新闻和采访,请查看下面的相关文章,别忘了在 Medium 上关注我。

原创文章经许可转贴。

物体检测和图像分割有什么区别?

原文:https://towardsdatascience.com/what-is-the-difference-between-object-detection-and-image-segmentation-ee746a935cc1?source=collection_archive---------17-----------------------

以及何时使用哪个?

目标检测和图像分割是计算机视觉的两种方法。阿曼达·达尔比约恩在 Unsplash 上拍摄的照片

人工智能中的图像处理

人工智能对图像处理有不同的任务。在本文中,我将介绍对象检测和图像分割之间的区别。

在这两个任务中,我们都希望找到图像上感兴趣的某些项目的位置。例如,我们可以有一组安全摄像机图片,在每张图片上,我们想要识别图片中所有人的位置。

通常有两种方法可以用于此:对象检测和图像分割。

对象检测—预测边界框

当我们谈论物体检测时,我们通常谈论包围盒。这意味着我们的图像处理将识别照片中每个人周围的矩形。

边界框通常由左上角的位置(2 个坐标)以及宽度和高度(以像素为单位)来定义。

来自开放图像数据集的带注释的图像。一家人堆雪人 by mwvchamber 。由 2.0 许可在 CC 下使用的图像。

如何理解物体检测方法?

如果我们回到任务:识别图片上的所有人,就可以理解通过边界框进行对象检测的逻辑。

解决方案的第一直觉可以是将图像切割成小部分,并在每个子图像上应用图像分类,以表明该图像是否是人。对单幅图像和目标检测进行分类是一项更容易的任务,因此,他们采取了这种循序渐进的方法。

目前来说,YOLO 模型(你只看一次)是一个解决这个问题的伟大发明。YOLO 模型的开发人员已经建立了一个神经网络,它能够一次完成整个包围盒方法!

对象检测的当前最佳模型

  • YOLO
  • 更快的 RCNN

图像分割—预测遮罩

一步一步扫描图像的合理选择是远离绘制框,而是逐个像素地注释图像。

如果你这样做,你会有一个更详细的模型,这基本上是一个输入图像的转换。

如何理解图像分割方法?

这个想法很基本:即使在扫描产品上的条形码时,也有可能应用一种算法来转换输入(通过应用各种过滤器),以便除了条形码序列之外的所有信息在最终的图片中变得不可见。

左:https://commons . wikimedia . org/wiki/File:Image-segmentation-example . jpg。右:https://commons . wikimedia . org/wiki/File:Image-segmentation-example-segmented . png。这两个文件都可以在知识共享 CC0 1.0 通用公共领域专用下获得

这是在图像上定位条形码的基本方法,但类似于图像分割中发生的情况。

图像分割的返回格式称为遮罩:与原始图像大小相同的图像,但对于每个像素,它只具有一个布尔值,指示对象是否存在。

如果我们允许多个类别,它可以变得更复杂:例如,它可以将海滩景观分成三个类别:空气、海洋和沙滩。

当前图像分割的最佳模型

  • 屏蔽 RCNN
  • Unet
  • Segnet

简言之,这种比较

目标检测

  • 输入是一个矩阵(输入图像),每个像素有 3 个值(红色、绿色和蓝色),如果是黑色和白色,每个像素有 1 个值
  • 输出是由左上角和大小定义的边界框列表

图象分割法

  • 输入是一个矩阵(输入图像),每个像素有 3 个值(红色、绿色和蓝色),如果是黑色和白色,每个像素有 1 个值
  • 输出是一个矩阵(遮罩图像),每个像素有一个值,包含指定的类别

我希望这篇短文对你有用。感谢阅读!

总体和样本有什么区别?

原文:https://towardsdatascience.com/what-is-the-difference-between-population-and-sample-e13d17746b16?source=collection_archive---------14-----------------------

罗兰·德内斯拍摄的照片

介绍

人们经常无法正确区分总体和样本。然而,它在任何统计分析中都是必不可少的,从描述性统计开始,根据我们面对的是样本还是总体,它有不同的方差和标准差公式。

此外,统计学的一个分支叫做推断统计学通常被定义为从对人口的代表性样本的观察中得出关于人口的结论的科学。因此,正确区分这两个概念至关重要。那么,总体和样本的区别到底是什么?

样本与总体

总体与样本。资料来源:towardsdatascience.com

群体包括来自特定群体的所有成员,所有感兴趣的可能结果或测量。确切的人数将取决于研究的范围。例如,假设您想知道在比利时数据科学家的具体案例中,工作表现和每周在家工作的时间是否有关联。在这种情况下,人口可能是比利时的数据科学家。但是,如果研究的范围更窄(例如,研究的重点是居住在离工作地点至少 30 公里以外的讲法语的比利时数据科学家),那么人群将更具体,只包括符合标准的员工。关键是人口应该只包括那些结果适用的人。

样本由从总体中抽取的一些观察值组成,因此是总体的一部分或子集。样本是实际参与研究的一组元素。

成员和元素是在广义上定义的。可能是人类。例如,人口可能是"所有居住在比利时的人",样本可能是"一些居住在比利时的人"。也可以是其他任何东西。假设你正在测试一种新肥料对农作物产量的影响。所有的庄稼地代表您的人口,而您测试的 10 块庄稼地对应于您的样本。因为样本是总体的子集,所以样本总是小于总体。 1 注意,人口不一定要多。可能的情况是,你研究的人群如此狭窄(例如,你大学的一年级男学士学生,他们在 6 月份通过了统计学考试,他们的父母已经离婚超过 5 年),人群的规模实际上相当小。

为什么是样本?

正如本文开头所提到的,统计学的一个主要关注点是能够从代表性样本中得出关于总体的结论。为什么使用人口样本而不是直接使用人口样本?一般来说,对整个研究人群进行测量几乎总是不可能的,因为:

  • 人口太多了。例如:孕妇人口。如果我们想对世界上所有的孕妇进行测量,很可能要么需要太长时间,要么花费太多
  • 人口是虚拟的。在这种情况下,“虚拟”人口被理解为“假设的”人口:它的规模是无限的。在一项实验研究中,我们关注的是接受新疗法治疗的前列腺癌患者。我们不知道有多少人将接受治疗,所以人口是变化的,在目前是无限的和不可计数的,因此是虚拟的
  • 这些人不容易接触到。例如:比利时无家可归者的人口

由于这些原因,测量是在群体的一个观察子群上进行的,即在我们的群体样本上进行的。然后,使用这些度量得出关于感兴趣人群的结论。使用适当的方法和足够大的样本量,从样本中获得的结果通常几乎与从总体中获得的结果一样准确。

代表性样品

当然,样本的选择必须能够代表被研究的人群。如果参与者在自愿的基础上被纳入研究,那么结果样本可能无法代表总体,这是一个严重的问题。可能的情况是,志愿者在感兴趣的参数 2 方面不同,导致选择偏差。例如,当研究人员通过互联网收集公民的工资时,会出现另一种选择偏差。可能的情况是,可以上网的人和不能上网的人的工资不同。

选择研究人群代表性样本的金标准是选择一个随机样本。随机样本是从总体中随机选择的样本,以便总体中的每个成员都有均等的机会被选中。随机样本通常是无偏样本,即其随机性不存在疑问的样本。

在某些情况下(例如,在医学中),获取群体的随机样本是复杂的,甚至是不可能的。在这种情况下,重要的是要考虑所得样品的代表性。

成对样品

最后但并非最不重要的是,成对样本是这样的样本,其中各组(通常是成对的)实验单元通过相同的实验条件联系在一起。例如,可以在服用安眠药之前测量 20 个人的睡眠时间(形成样本 A),然后在这些人服用安眠药之后对他们重复测量(形成样本 B)。

每个人的两个测量值(服用安眠药前后的睡眠时间)和两个样本当然是相关的。存在说明样本之间关系的统计工具,在这种情况下应该优先使用。

结论

总的来说,样本是参与研究的个人群体,而总体是研究结果将适用的更广泛的群体。对整个人口的测量过于复杂或不可能,因此使用代表性样本来得出关于人口的结论。基于随机选择的样本通常是最具代表性的样本。

感谢阅读。我希望这篇文章能帮助你理解总体和样本之间的区别。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

相关文章:

  • 我的数据符合正态分布吗?关于最广泛使用的分布以及如何检验 R 中的正态性的注释
  • 手工卡方独立性检验
  • 手工描述性统计
  • 一个闪亮的手工推断统计应用

原载于 2020 年 1 月 18 日 https://statsandr.com**的

信息论中的“信息”是什么?

原文:https://towardsdatascience.com/what-is-the-information-in-information-theory-d916250e4899?source=collection_archive---------15-----------------------

马库斯·斯皮斯克在 Unsplash 上的照片

打破信息的基本概念。

你可能听说过或读过一个例子,信息论与机器学习算法结合使用,要么解释它们,要么证明算法优化了正确的事情等等。

在这篇文章中,我想尝试用简单的语言来解释这一点:从基本概率出发的信息是什么?

信息论中的一个基本术语是。这可能是一个误导性的术语,因为熵是和混乱联系在一起的:主要是无序。在信息论中,熵告诉我们一个观察到的事件 x 中包含的信息量。一个事件当然有它的概率 p(x)

那么,我们所说的信息是什么意思呢?我发现直观地理解这个术语不是很简单。“信息”的数量实际上与存储有关。信息以位的形式存储。在信息论中,我们考虑用于将一些事件从一端传递到另一端的有噪声的通信信道。噪音现在并不重要。这些事件需要以某种方式编码,更具体地说,它们需要编码成比特(正如计算机科学理论家所看到的)。理想情况下,我们不希望使用太多的比特来通过通信信道传递这些事件,因为比特耗费能量。我们希望将大部分比特花在罕见事件上,因为它们通过信道发送的频率较低,因此成本较低。

阿德里安·达斯卡尔在 Unsplash 上拍摄的照片

什么是罕见事件?嗯,当然是小概率的一个 p(x) 。这已经暗示了一些东西,我们希望一个事件的信息对于概率较低的事件来说更大。所以这个函数,我们姑且称之为 h(x),应该会返回事件 x 所包含的信息量,低概率事件高,高概率事件低。现在,让我们来看看下面的h(x)

这似乎是正确的做法:概率越低,信息越高。它还有另一个很好的特性:如果我们获取同时发生的两个独立事件的信息,我们会得到以下结果:

这源于对数的简单操作,因为在 xy 是独立的情况下(可能为了练习而检查它),以下成立:

这是 h 函数的一个很好的特性,它意味着我们可以把独立事件的信息加起来,但也意味着我们不能把相关事件的信息加起来。对数本身是机器学习、数学、物理中经常出现的函数。简而言之,它在计算上如此之好是因为它允许我们将乘积写成和,导出函数的良好界限等等。

现在,如果我们想要测量随机变量的信息,我们需要查看其所有实现(事件)的预期信息。是的,我们对 h(x) 取期望值,如果我们假设处理的是一个离散的随机变量,它看起来像下面这样:

而这正是熵的定义!让我们假设 p(x) 是一个伯努利分布,这意味着有两个事件( xy )可能发生,它们有各自的概率,那么我们可以写为 p(x) =1-p(y) ,因为事件空间上的概率需要总和为 1。在这种情况下,我们可以画出熵作为**p(x)**的函数,然后我们会注意到一些东西:

我们注意到,当 p(x) 取值为 0.5 时,它最大。这意味着所有事件的概率相等,因此在伯努利分布的情况下携带相同数量的信息。反过来,让我们说,我们有一些其他的系统,其中我们看到两个随机变量 XY 以及它们各自的分布 pq 。我们可以看看他们的**互信息。**这是机器学习中经常使用的一个量,尤其是在大肆宣传的解纠缠领域,我们希望学习包含独立因素的潜在表示(即最小化独立因素之间的互信息)。无论如何,它归结为下面的等式:

让我们思考一下这个问题。我们知道,在随机变量 xy 相互独立的情况下,我们可以写出联合分布 **p(x,y)=p(x)p(y)。**在它们不独立的情况下,我们必须服从贝叶斯法则, p(x,y)=p(x)p(y|x) 。如果独立性成立,对数中的比率变为 1,因此表达式等于 0,0 互信息。这是有意义的,因为通过独立性,我们知道一个事件的发生不会影响另一个事件的发生。在另一种情况下,我们会得到非零的互信息。

信息论对于机器学习实践者来说是一个非常有用的概念,因为它允许他们从信息论的角度来看待学习算法。信息论的更多乐趣即将到来!敬请关注。

马库斯·斯皮斯克在 Unsplash 上拍摄的照片

K 近邻是什么?

原文:https://towardsdatascience.com/what-is-the-k-nearest-neighbor-862a6a30e5dc?source=collection_archive---------38-----------------------

Python 示例简介

乔恩·泰森在 Unsplash 上的照片

k-最近邻算法

k-最近邻(KNN)是一种容易理解,但基本的和广泛适用的监督机器学习技术。要理解 KNN 背后的直觉,看看下面的散点图。该图显示了两个任意维度 x 和 y 之间的关系。蓝色点代表 A 组的成员,橙色点代表 b 组的成员。这将代表 KNN 的培训数据。

现在假设一个新的、未分类的数据点出现并绘制到图表上。KNN 将基于 K 个最近点(或最近邻居)对其进行分类,采取多数投票,并据此进行分类。注意 K 是事先设定好的,代表投票要拿多少分。

例如,如果 K= 1,KNN 将查看最近的数据点,并将新的数据点归类为相同的类别。在下面的例子中,“X”代表分类的新数据点。因为 X 最接近组 B 中的已知数据点,所以“X”也将被分类为组 B。

现在假设 K = 3。KNN 将查看 3 个最近的数据点,并投票进行分类。如果两个或两个以上的最近邻属于一个组,则新的数据点按多数分类。

在下面的例子中,新的数据点“X”移动。在最近的 3 个点中,2 个属于 A 组,1 个属于 b 组。因为大多数点属于 A 组,所以新的数据点“X”被分类为 A 组。

如果出现平局(这可能发生在 K=2 的情况下),则从 K-1 个最近的邻居中取得多数。

KNN 的优点

  • 非参数: KNN 对基础数据不做任何假设。因此,它可以应用于广泛的问题,而不需要担心数据的属性。
  • **懒惰学习:**算法没有训练阶段。相反,它会在分类时进行计算。这使得 KNN 成为一种非常动态的机器学习技术,允许添加额外的数据,而无需重新训练它。
  • **高度非线性数据:**因为没有对数据进行假设,也没有计算正式模型,KNN 可以很好地预测高度非线性数据。
  • **多类问题:**不像其他一些算法需要对涉及 2 个以上类的分类进行调整,KNN 可以推广到任意多的类。
  • **直观:**即使对于非技术观众来说,该算法也相对容易理解和解释。

KNN 的缺点

  • **内存密集型:**由于一个新的数据点必须与训练数据中的每隔一个数据点进行比较,KNN 经常使用大量的处理能力来进行分类,尤其是在较大的数据集上。
  • **维度的诅咒:**像其他使用距离作为度量的算法一样,KNN 很难预测具有大量输入变量的数据。
  • 对异常值敏感:异常值给 KNN 带来了一个根本性的问题。通过简单地选择最近的邻居,不管它们有多远,离群值都可能扭曲它的预测。
  • 缺失数据: KNN 没有处理缺失数据的方法。如果缺少任何东西,就不能准确预测整个数据点。

选择最佳 K

因为 K 是唯一要调整的参数,所以应该非常小心地选择一个好的值。一般来说,有两个基本的建议:一个估计和肘方法。

作为一个很好的参考点,有时建议将观察次数的平方根作为 K。例如,如果将 100 个观测值输入 KNN,K = 10 将作为快速估计。请注意,这更多的是一个经验法则,而不是一个严格的方法。

然而,更经验性的方法是肘法。基于边际收益递减的原则,这个想法是在测试数据上运行 KNN,逐步增加 K 值,并查看它如何影响模型性能。

如果直观地完成,那么在图的“肘”处(用更专业的术语来说是拐点),K 的优化值表示在成本超过收益之前返回最佳性能的点处。下图中的红圈展示了这一原理。

然而,真实世界的数据并不总是那么清晰。如果数据变得更嘈杂,在局部最小值处选择最小的可能 K 是可行的选择。

Python 中的演示

与许多其他机器学习算法一样,Scikit-Learn 模块提供了一个很好的 KNN 实现。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np

除了 KNN 模块之外,还导入了 StandardScaler 来标准化数据,并导入了 pandas 和 numpy 来处理数据。

# Store the data in a dictionary
data = {
    "X1": [1,1,3,4,5,2,0,4,0.5,3.3,1.1,4.7,0.2,2,4.5,3.3,2.5],
    "X2": [1,2,4,4,6,1,1,5,0.5,4.2,1.4,5.2,2,0.03,5.1,4.8,2.5],
    "Member": [A,A,B,B,B,A,A,B,A,B,A,B,A,A,B,B,A]
}# Convert the data into a dataframe
df = pd.DataFrame.from_dict(data)

接下来,数据集被生成并放入字典中。这组数字实际上是用来生成本文开头的例子的。为了方便起见,字典然后被转换成数据帧。

# Separate the the independent and dependent variables
features = df_sample.filter(["X1", "X2"])
category = df_sample["Member"]scaler = StandardScaler()
scaler.fit(features)
scaled_features = scaler.transform(features)

因为 KNN 使用距离作为度量单位,并且因为输入不一定使用相同的比例,所以调用标准缩放器来归一化数值数据。这是防止数据中单位偏差的重要步骤。

k = 5knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(scaled_features, category)

实际拟合 KNN 的最后一步只是调用函数,并将缩放后的要素和类别用作参数。请注意参数 n_neighbors,它表示要使用多少个 K 近邻。

然而,如果应该使用弯头方法,则需要稍微不同的方法。

# Separate the data into training and test data sets
X_train, X_test, Y_train, Y_test = train_test_split(scaled_features, color_category, test_size=0.30)# Import Matplotlib for visualization
import matplotlib.pyplot as plt# Create an empty list to catch the error rate
error_rate = []# Iterate through K = 1-20
for i in range(1,20):

    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train,Y_train)
    pred_i = knn.predict(X_test)
    error_rate.append(np.mean(pred_i != Y_test))# plot the error rate 
plt.figure(figsize=(10,6))
plt.plot(range(1,20),error_rate,color='blue', linestyle='dashed', marker='o', markerfacecolor='red', markersize=10)
plt.title('Error Rate vs. K Value')
plt.xlabel('K')
plt.ylabel('Error Rate')

首先,数据被分成训练和测试子集(这应该是标准的过程)。接下来,针对 K = 1、K = 2 等等的测试数据对模型进行训练和评估,直到 K = 20。最后,结果会以图表的形式返回。

结论

KNN 是一种简单但强大的监督机器学习技术。其稳健的方法允许其应用于各种各样的问题。此外,单个参数 K 使得参数调整相对容易。Python 中一个简单易用的实现使得使用 KNN 只需几行代码。

机器是如何处理你的数据的?你怎么能相信它?

原文:https://towardsdatascience.com/what-is-the-machine-doing-with-your-data-how-can-you-trust-it-32a92fc79108?source=collection_archive---------67-----------------------

你每天都要和很多机器智能打交道。你知道他们实际上在用你的数据做什么吗?他们是如何做出预测的?你如何信任他们?

作为消费者,我们已经习惯于接受服务,而不是质疑这些服务的工作方式,并信任这些服务,即使它们是巨大的黑匣子。然而,黑盒是棘手的,因为根据定义,它们是秘密的,而不仅仅是私人的。在 ML 和开源的十字路口建立的东西可以增加你对机器学习数据使用的信任。

图片由本·怀特

我们每天都在生成和消耗越来越多的数据。我们的处理能力也在同步发展,新的机器学习技术可以以新的方式取悦用户,无论是更好的推荐引擎,更优化的购物体验,还是更智能(更便宜!)定价。

随着性能的进一步发展,我们也必须要求机器学习模型的内部工作有更多的发展。

机器学习的民主化有两个有趣的方面。一个是通过开源增加代码库的可见性,另一个是通过透明性和可解释性。可以说,这两者都是必要的和重要的,但是让我们看看实践中的那些以及它们有什么含义。

ML 中的透明性和可解释性

机器学习并不新鲜,但即使作为软件开发人员或数据分析师,它也是一个高门槛领域。当用大量原始数据训练模型时,这种数据的使用也可能引发许多围绕固有偏见和成见的不信任问题,即使这种意图从未存在过(只要看看我们如何与系统性种族主义作斗争)。

可解释性是理解哪些数据点是机器做出预测的因素,以及如何发现数据集中任何过度或不足表示的关键。一个领域越复杂,理解基础知识就越重要,并且能够追溯到前面的结果。

例如, EazyML 就是这样通过让机器“解释给你听”来解决这个方程的。

EazyML 解释了工作满意度的机器学习预测模型中的局部预测。

开源是基础资源

除了作为一个蓬勃发展的市场和未来软件的基础构件,开源机器学习库也已经成为值得信赖的机器学习和人工智能软件的基石。

商业开源中有很多结构,比如 MorphL 已经公开发布了其“社区版“电商 AI 引擎”。然而,基本原则是,通过将代码发布到公共领域,您可以在看到软件的内部工作时获得额外的安慰,并且还可以解决供应商锁定的问题,任何人都可以派生软件并在其上进行构建。

当然,除了透明性之外,还有无数其他的好处,比如开放的协作仅仅是为了生产更好的软件和更多经得起未来考验的技术模型。

在我们在 Prifina 围绕用户持有和用户控制的数据所做的事情中,以及用于生成合成数据的开源工具的出现中,有许多与 ML/AI 相关的有趣切线。他们都有能力尊重用户的数据,并在构建最复杂的模型和结果来为个人创造价值时将数据放在一边。

在未来,我们将能够只使用合成数据来构建模型,这些数据是在用户端创建的,允许直接的一对一交互。

我们将会使用越来越多的数据丰富的应用。我们需要能够信任他们。我们需要以值得的方式建设它们。

大多数 ML 项目失败的主要原因是什么?

原文:https://towardsdatascience.com/what-is-the-main-reason-most-ml-projects-fail-515d409a161f?source=collection_archive---------13-----------------------

来源:https://www.4freephotos.com/Castle-of-cards-perspective-1517.html

你可能把曼梯·里当成了替罪羊…

是的,ML 可能很难。是的,大多数公司仍然不知道应用 ML 和 ML 研究是两个完全不同的学科。是的,从实验到生产仍然存在技术摩擦。是的,管理大规模数据可能会很痛苦。是的……许多 ML 项目失败是因为上述一个或多个原因。

但是当你开始从根本上解决真正的问题时,我发现在大多数情况下,这都归结于决策的分形本质:

业务目标定义不明确。

…最终映射到易变的产品策略、技术问题定义、技术选择和实现。

好吧……但是机器学习有什么特别的?非 ML 软件项目不都是这样吗?

每一天!

但是,我在双方都工作过,并为试图从非 ML 转向 ML 的公司提供过建议,我逐渐意识到,在业务层面为糟糕的定义付出的代价在 ML 方面要高得多。根据我的经验,两个因素是最大的贡献者:

1)迭代成本

因为传统的的透明的、可解释的、基于规则的本质,非 ML 软件,变化的需求和移动的目标不一定会阻止你构建、发布和维护一些功能性的东西。您可以相对快速地修复、添加和删除,而且非常精细。变更的生命周期可以是几小时/几天。在 Applied ML-land 中,即使模型的预期输出行为、准确性或性能发生很小的变化,也会迫使您从头开始重新设计数据表示、模型架构、重建训练集、重新训练、重新部署,同时无法保证新目标能够实现。一个*(显然)小的、增量的规范的生命周期可能会变得复杂、耗时且有风险,很容易让你处于一两个月的试验模式。那些由于模糊的目标而在不断变化的需求下“侥幸”构建和发布软件的公司(很少被认为是失败……),将最终陷入慢性 实验模式(但这是...)在尝试构建基于 ML 的解决方案时。*

2)准备就绪的定义

对于非 ML 软件,这通常归结为一组明确的确定性行为和相关的性能需求。在应用 ML 中,就绪度由一个问题决定: “多好才算够好?” 因为从‘这不行’‘这行得通’的旅程是一个连续的函数(而且是非线性的,受收益递减规律支配!)如此苛求确定性的行为对于‘这行得通’来说是一场败仗这个被高度忽视的问题不仅决定了你应该在一个给定的设计上投资多少,也影响了设计选择本身,只有在你的 ML 魔法之上的产品层上有了“这行得通”的明确定义,才能得出这个问题的答案。“这行得通”应该与一个具体的、切实的价值点联系起来,基于一个预期的业务成果,你要努力发掘、实现和衡量这个价值点。当这些映射模糊或不明确时,很可能甚至没有人问过这个问题,而且我大多数时候看到的是,ML 项目将最终陷入某种 准确性鼠轮 中,没有人做出“好了,这足够好了”调用,同时产生严重的所有权问题。

这是不是意味着你应该避免迭代你的 ML 模型,或者为“这行得通”设置一个低门槛?绝对不行!这只是意味着在应用 ML-land 中:

1。枢轴可能非常昂贵。太多,太频繁,你就出局了。

2.游戏名字叫 “多好才算够好?”,为了能够发挥它,你需要不断了解你的业务环境。 只有这样你才能找到答案。

数据科学从业者、业务和产品决策者以及他们之间的所有人:在构建 ML 解决方案时,定期缩小范围并提出问题是你们联合的责任:

“我们在这里试图解决的业务问题是什么?”

你会惊讶地发现,有多少公司,无论是初创公司还是老牌公司,在进入 Tensorflow 之前,都没有深入研究这个基本问题…

如果你是一名数据科学从业者,请暂时离开这个新的 Python 库,开始熟悉一些概念,如产品市场适合度、价值主张、MVP、客户发现、KPI和其他相关业务指标。相信我,它会给你的日常工作带来巨大的变化。如果你是一个商业决策者或者是一个从事 ML 工作的中间人,提醒你自己和其他人保持你的业务 映射 的一致和更新,当你决定要构建什么、如何构建以及是否应该首先构建它的时候…**

你可能会发现自己一直在不知不觉中把曼梯·里当作替罪羊…

您可能会发现有一种更简单、数据更少、风险更低的方法来解决您的 ML 解决方案…

你可能会发现你根本不需要 ML:|

如果您已经做到了这一步,请随意分享您自己构建基于 ML 的产品的经验。

使用机器学习分析增加研究生院录取机会

原文:https://towardsdatascience.com/what-is-the-most-important-factor-to-graduate-admission-e75de7a538d6?source=collection_archive---------28-----------------------

查尔斯·德洛耶在 Unsplash 上的照片

在本文中,我们将使用各种机器学习方法对最近的研究生入学数据进行分析,以分析 GRE 分数和 CGPA 等因素的最佳组合,从而提高研究生院的录取机会。

主要见解

  • CGPA 是目前研究生招生中最重要的因素
  • GRE 多加一分,研究生录取几率增加 0.14%左右。
  • 托福多一分,研究生录取几率增加 0.28%左右。
  • 只有在大学评级较低的情况下,进行研究才有一定的益处。
  • 高托福成绩无法抵消中/低 GRE 成绩;只有当 GRE 分数足够高时,托福考试才开始对录取机会产生显著的统计影响。

本文将深入探讨这些结果是如何使用以下机器学习技术实现的:

  • 创建一个逻辑回归模型来预测录取的机会,分析和可视化的系数。
  • 使用排列重要性和决策树回归模型来寻找特征重要性。
  • 单变量和轮廓部分相关图(PDP ),以了解单个或多个变量如何影响录取机会。

数据

数据可以在 Kaggle 这里找到。

数据头:

GRE 成绩、托福成绩、大学评级、SOP、LOR、CGPA、研究是预测录取机会的特征。

我们可以用熊猫的内置。描述():

逻辑回归模型和系数分析

首先,使用 sklearn 方便的 train_test_split 函数,我们将数据分成训练集和测试集。

import sklearn
from sklearn.model_selection import train_test_split
X = data.drop('Chance of Admit ',axis=1)
y = data['Chance of Admit ']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)

在 sklearn 中训练逻辑回归模型就像两行代码一样简单:

from sklearn.linear_model import LinearRegression
lin = LinearRegression().fit(X_train,y_train)
print((y_test - lin.predict(X_test)).apply(abs).mean())

输出:

0.04337302752734804

逻辑回归的平均误差(MAE)约为 0.045,或预测研究生入学机会的 4.5%(满分为 100%)。

现在,让我们从模型中获取系数:

coef = pd.DataFrame({'column':X_test.columns,'coefficient':lin.coef_*100}).sort_values('coefficient').reset_index()
coef.drop('index',axis=1)

输出:

最重要的是,我们可以得出以下结论:

  • GRE 多加一分,研究生录取几率增加 0.14%左右。
  • 托福考试增加一分,研究生入学的机会就会增加大约 0.28%
  • 大学 GPA 多一分,研究生录取几率增加 12.34%左右。
  • 进行研究增加了大约 2.97%的研究生入学机会。

请记住,这些都在 4%的误差范围内。

import seaborn as sns
import matplotlib.pyplot as plt
plt.style.use('ggplot')
fig = plt.figure(figsize = (15,5))
plt.xticks(rotation=45)
colors = ['#adebad','#adebad','#adebad','#adebad','#99e699','#85e085','#70db70']
sns.barplot(coef['column'],coef['coefficient'],palette = colors)
plt.ylabel("Additional % Admission")
plt.xlabel('Factor')
plt.show()

重要的是要认识到 GRE 和 TOEFL 有许多可能的分数,所以它们的系数低是有道理的。

一大要点是:大学的平均绩点对于研究生入学是必不可少的。每增加一分,就多了 12.84%的几率。

排列重要性

置换重要性是一种评估特征重要性的方法,通过随机洗牌并观察准确性的相应降低。准确度下降最大的列应该比那些重排没有降低准确度的列更重要。

import eli5
from eli5.sklearn import PermutationImportance
perm = PermutationImportance(lin, random_state=1).fit(X_test, y_test)
eli5.show_weights(perm, feature_names = X_test.columns.tolist())

和以前一样,CGPA 很重要,其次是 GRE 和托福成绩。

SHAP 价值观

决策树回归器和 SHAP 值

SHAP 值不支持逻辑回归,因此我们将选择决策树回归器,并收集 SHAP 值。

import shap
from sklearn.tree import DecisionTreeRegressor
dtr = DecisionTreeRegressor().fit(X_train,y_train)
explainer = shap.TreeExplainer(dtr)
shap_values = explainer.shap_values(X_test)

SHAP 特征重要性

SHAP 是评估特征重要性的另一种方法。SHAP 不像逻辑回归系数那样考虑规模。

shap.summary_plot(shap_values, X_test, plot_type="bar")

我们可以得出一些结论:

  • 和往常一样,CGPA 是目前最重要的特色
  • GRE 和托福成绩很重要
  • 大学的评级没有 GRE 分数,尤其是 CGPA 的影响大。这意味着无论大学排名如何,你的 CGPA 和 GRE 分数低,都不会走得很远。
  • 研究好像不是很重要。

SHAP 力图

SHAP 力图让我们看到为什么一个特定的例子取得了他们所做的成绩。举个例子,

i = 0 # or any other index for a different force plot
shap_values = explainer.shap_values(X_train.iloc[i])
shap.force_plot(explainer.expected_value, shap_values, X_test.iloc[i])

在这个例子中,最终的录取机会是 0.62。红色的因素解释了是什么推动了机会的增加,蓝色的因素解释了是什么推动了机会的减少。长度代表了它的力量有多大。

在这种特殊情况下,相当高的托福分数和 SOP 推动了分数的上升,但低 CGPA 是推动分数下降的一个巨大因素。

在这个例子中,最后的录取机会是 94%。高 CGPA 显著提高了它。

再画几个 SHAP 力图,就可以知道哪些因素一起使用时可以决定最终的机会:

PDP 图

PDP 图或部分相关性图显示了单个特征如何影响目标变量。

以下代码生成每列的 PDP 图:

from pdpbox import pdp, info_plots
import matplotlib.pyplot as plt
base_features = data.columns.values.tolist()
base_features.remove('Chance of Admit ')
for feat_name in base_features:
    pdp_dist = pdp.pdp_isolate(model=dtr, dataset=X_test, model_features=base_features, feature=feat_name)
    pdp.pdp_plot(pdp_dist, feat_name)
    plt.show()

这个部分相关图表明,最佳 GRE 分数将在 320 分的峰值附近。然而,没有太多关于 GRE 高端的数据,但是这些数据表明 GRE 高实际上可能会降低机会。对此的一个可能的解释是,花在 GRE 学习上的时间可能会花在其他更重要的事情上(比如 CGPA)。此外,请注意较大的误差范围。

托福成绩的 PDP 似乎建议最好的分数在 109 到 114 之间。再次注意大的误差线。粗线只是平均值,在这种情况下,误差太大,数据太少,无法做出可信的判断。

这个 PDP 很有意思——似乎越是名校,录取几率越高。这可能与数据偏差有关,但一个可能的解释是,申请高评级大学的研究生本身就有更强的资质。

CGPA 的 PDP 最为突出,因为它的误差线非常小。有一个明显的趋势是,较高的 CGPA 与较高的录取机会相关。

如前所述,一般来说,进行研究比不进行研究似乎没有什么增加。我们将通过多维 PDP 图对此主题进行更深入的研究。

PDP 轮廓/多维 PDP 图

PDP 等高线/多维 PDP 图是一种特殊的宝石——它们显示了两个变量之间的相互作用(因此,它们也被称为 PDP 相互作用图)如何导致一定的准入机会。

以下代码生成大学分数与所有要素的等值线图。

for column in X_test.columns.drop('University Rating'):
    features = ['University Rating',column]
    inter1  =  pdp.pdp_interact(model=dtr, dataset=X_test, model_features=base_features,features=features)
    pdp.pdp_interact_plot(pdp_interact_out=inter1, feature_names=features, plot_type='contour')
    plt.show()

大学分数对比所有特征

在等高线图中,黄色区域越多,被录取的几率越高。低 GRE 分数对几乎所有的大学评级都不利。正如之前在单变量 PDP 中看到的,GRE 分数 320 分左右的范围似乎是“黄金区域”,被评为 5 分的大学接受分数在该分数左右的人最多。

我们应该怀疑缺乏数据——这个数据集的数据并不丰富,因为我们发现,随着 GRE 分数的增加(在某一点之后),录取的机会会减少,这是没有意义的。

有了 SOP,很明显,拥有最高 SOP 分数的最高大学评级会产生最高的录取率。

另一个重复的结果是——无论大学排名如何,CGPA 都非常重要。

唉,我们关于开展研究的问题的答案是:等高线的倾斜性质表明,对于排名较低的大学,开展研究是有帮助的——它将 68%的百分比提高到 71%左右。然而,对于更高等级的大学,在执行研究方面真的没有太大的区别。

GRE 成绩对比托福成绩

这里有个有趣的问题 GRE 和托福成绩是如何相互影响的?GRE 成绩好是弥补托福成绩差,还是相反?

features = ['GRE Score','TOEFL Score']
inter1  =  pdp.pdp_interact(model=dtr, dataset=X_test, model_features=base_features, 
                            features=features)pdp.pdp_interact_plot(pdp_interact_out=inter1, feature_names=features, plot_type='contour')
plt.show()

看起来,低 GRE 分数的托福非常依赖 GRE,但随着 GRE 分数的提高,托福分数在录取机会中的作用越来越大。

GRE 分数与 CGPA

features = ['GRE Score','CGPA']
inter1  =  pdp.pdp_interact(model=dtr, dataset=X_test, model_features=base_features, 
                            features=features)pdp.pdp_interact_plot(pdp_interact_out=inter1, feature_names=features, plot_type='contour')
plt.show()

正如我们已经多次看到的那样,GRE 分数对低 CGPA 没有什么帮助。

使用代码和更多的实验来发现其他特性之间的关系;只需用所需的功能替换“功能”列表。

感谢阅读!

如果你喜欢,请随时查看我的其他帖子。

瓦西里·科洛达在 Unsplash 上的照片

什么是激进的内容问题,你的推荐系统是否深受其害?

原文:https://towardsdatascience.com/what-is-the-radical-content-problem-and-does-your-recommender-system-suffer-from-it-7fe017f9a8b1?source=collection_archive---------66-----------------------

可解释的建议如何帮助你发现新的见解。

克林特·帕特森在 Unsplash 上拍摄的照片

*这篇文章是我关于可解释建议系列文章的第 3 部分,基于我的* BSc 论文 *。* 第一部分 *介绍了可讲解推荐的概念,而* 第二部分 *介绍了我使用 Python 和 React.js 实现的可讲解电影推荐。*

推荐系统的使用在过去的十年里越来越多,它们被认为是 YouTube、网飞和亚马逊等应用程序不可或缺的一部分。虽然推荐帮助用户在无限的选项海洋中找到他们喜欢的视频、电影或项目,但他们这样做不会没有问题。最近,一些推荐系统因将用户引向一个“兔子洞”,内容越来越激进而受到批评。这种系统的一个例子是 YouTube 的推荐系统,它根据用户的观看历史为用户推荐视频和频道。在研究右翼频道时,研究人员发现了一些证据,表明 YouTube 的推荐算法通过向用户推荐越来越激进的频道而使用户变得激进[1]。值得注意的是,这并不意味着推荐系统有任何问题——事实上,它似乎完全按照设计的那样工作,向有兴趣观看视频的用户准确地推荐视频。这个问题可以称之为部首内容问题,关于解决它的学术研究很少。

作为我关于可解释的推荐的论文的延伸,我选择寻找是否有任何可解释的方法可以用来阻止推荐系统推荐越来越激进的内容,或者发现问题是否首先存在。推荐系统中的可解释性以前主要关注用户体验,但也许它也能帮助数据科学家更好地理解他们自己的模型?

基于潜在因素模型的推荐系统是很难解释的。到目前为止,事后解释方法,如关联规则[2]已被用于解释个人的建议。然而,由于关联规则集将推荐系统的行为作为一个整体封装起来,因此它可以用于发现关于推荐系统整体的知识。为此,推荐系统被映射为一个使用生成的关联规则的网络。因为关联规则的形式是(X,Z ⇒ Y),所以它们可以被认为是有向图,其中 X,Z 和 Y 是图的节点。然后可以使用标准的图形可视化技术来可视化该图形。下图显示了使用从 MovieLens 20m 数据集挖掘的关联规则生成的图形。注意,类型为(X,Y) ⇒ Z 的规则显示在两条边上,X ⇒ Z 和 Y ⇒ Z。

从推荐系统中挖掘的关联规则被可视化为有向图。每个节点代表一部电影,而每个边(箭头)代表一个关联规则中的因果关系,即 A→b . Ville Kuosmanen 的图像

可视化的图可以潜在地用于回答关于基础推荐系统的许多问题,但是最有趣的一个是该系统是否遭受极端内容问题,指的是推荐系统向已经评级了流行的温和项目的用户推荐越来越极端的小众项目。这个问题对于像 YouTube 这样的开放视频平台来说特别有意义,YouTube 被指控向流行、温和的“门户”视频的观众推广更极端的内容[1]。为了对网络进行定量分析,应该定义一个合适的“极端性”度量。电影极端评分的一个例子可以是它的分类年龄分级。YouTube 和 Twitter 等没有客观年龄分级的平台上的内容可能更难进行极端排序,但情感分析等机器学习技术可能会用于此。

每一项都可以被赋予一个极端值,随着越靠近聚类中心,网络中极端值越大的部分可以被自动识别出来。因为极端内容倾向于关注特定的社区或用户组,所以分析应该基于基于聚类的关联规则,而不是全局挖掘的规则(如这里所做的)。这将潜在地允许平台管理员容易且客观地找到最激进的社区,并在需要时对其内容设置适当的限制或年龄分级。

在这种情况下,对网络的视觉检查似乎将诸如*《肖申克的救赎》、《指环王:双塔奇谋》和《教父》*等电影置于网络的中心,这些电影似乎并不比它们的前身更极端。这样,对网络的视觉检查表明,这里描述的推荐系统不会遭受极端内容问题。当然,应该进行更彻底的分析检查来确认这一发现,但这超出了本项目的范围。

这篇文章结束了我关于可解释的推荐系统的系列文章。我喜欢了解更多关于可解释的人工智能的需求和挑战,以及在这个过程中对推荐系统的深刻理解。感谢阅读!

[1]:里贝罗,M. H .,奥托尼,r .,韦斯特,r .,阿尔梅达,V. A .,&梅拉,W. (2019)。审核 YouTube 上的激进化途径。 arXiv 预印本 arXiv:1908.08313

[2]:皮克,g .,&王,J. (2018 年 7 月)。推荐系统潜在因素模型的事后可解释性。《第 24 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集》(第 2060–2069 页)。ACM。

什么是 Softmax 函数?—少年解释道

原文:https://towardsdatascience.com/what-is-the-softmax-function-teenager-explains-65495eb64338?source=collection_archive---------23-----------------------

softmax 函数的简要说明,什么是 softmax 函数,它是如何工作的,以及一些代码。

作者通过 Imgflip 生成的图片

图片由作者通过 Imgflip 生成

softmax 函数是一个激活函数,它将真实值转化为概率。

在一个正常的学年,此时此刻,我可能正坐在离家两个小时的咖啡店里,读着我计算机编程课前的讲座。或者,此时此刻,我可能正在上课,试图跟上我的教授对精确方程的解释。随着世界各地的学校关闭,像我这样的学生只能靠自己来对抗拖延症。一场可悲的斗争,一场我显然不会赢的斗争。在过去的几周里,尽管我的大学有大量的在线工作,但我已经决定这是学习我所能学习的关于深度学习的一切的最佳时间。像许多其他好奇的人一样,我决定在 Udacity 上参加一个名为深度学习与 PyTorch 的课程(自然,本文的灵感来自于这个课程中的概念。)

如果你已经阅读了我上一篇关于感知器 **,**的文章,你已经知道感知器是一种二进制分类算法,它使用一些线性函数进行预测。但是如果我们想要对两种以上的数据进行分类呢?我们如何做到这一点?我们实际上可以使用一个激活函数,称为 softmax 函数。在本帖中,我们将讨论什么是 softmax 函数,比较二进制分类和多类分类,讨论 softmax 函数如何工作,并提供一些示例代码。

什么是 Softmax 函数?

softmax 函数是逻辑函数的推广,可用于对多种数据进行分类。softmax 函数接受不同类别的实际值,并返回概率分布。

标准逻辑函数能够进行二元分类,而 softmax 函数能够进行多类分类。

作者图片

让我们看看二元分类和多类分类是如何工作的

二元分类模型

假设我们有一个模型,我们知道你得到或得不到工作的概率是,

作者图片

因此,你得到工作的概率是 p(工作)= 0.8,因此,你得不到工作的概率是 p(没有工作)= 0.2。

该模型将接受一些输入,如你的期末考试成绩是多少?或者你建了多少个项目?基于线性模型,它将返回一个“分数”(作为一个未绑定的值),分数越高,可能性越大。

作者图片

那么得到工作的概率就简单的是分数的 sigmoid 函数。(如果你想知道更多关于 sigmoid 函数如何工作的信息,请查看视频。).正如我们所知,sigmoid 函数会将分数转换为概率,其中概率介于 0 和 1 之间。

然后将这个概率与我们已知的概率进行比较(所以,p(工作)= 0.8,p(不工作)= 0.2)。

多类分类

假设,我们试图建立一个模型,对 3 个不同的项目进行分类。一支铅笔,一支钢笔和一块橡皮。假设得到铅笔的概率是 p(铅笔)= 0.5,得到钢笔的概率是 p(钢笔)= 0.4,得到橡皮擦的概率是 p(橡皮擦)= 0.1。因此概率看起来像,

作者图片

其中概率之和为 1。

现在,让我们对我们的模型执行与二元分类相同的步骤,给定一些输入,计算线性函数,并给每个项目打分。

作者图片

现在我们有了分数,我们怎样才能找到这三项的概率呢?这就是 softmax 函数发挥作用的地方。

soft max 功能是如何工作的?

给定上面的无界分数,让我们试着把这个转换成概率。

现在你可能会问,“为什么我们不能只使用一个 sigmoid 函数?”

我们需要一个能做两件事的函数,

  1. 使结果概率介于 0 和 1 之间。
  2. 使所得概率之和等于 1。

Sigmoid 函数并不总是等于 1。换句话说,sigmoid 函数输出独立的分布 p(x1)和 p(x2 ),因此对于 sigmoid 函数,我们可以说 p(作业)= 0.89,p(非作业)= 0.26,这两者之和不等于 1。因此,当我们有独立的二进制标签时,如红色或蓝色,猫或狗等,sigmoid 函数是有用的。正如我们将很快看到的,softmax 函数的分布与输出变量 p(x1,x2,x3)等相关联。

我们将这些分数转换成概率的一种方法是使用这个函数,

作者图片

一个项目的分数,超过所有分数的总和。这是可行的,因为每个概率都在 0 和 1 之间。它还会使每个概率加起来为 1。

这看起来不错,但是你可能已经猜到有一个问题。如果分数是负数呢?这可能是有问题的,因为概率不再等于 1。

怎么才能让每个数字都是正数呢?我们可以试着用一个指数函数,这样函数看起来就像这样,

作者图片

我们做到了!

这就是所谓的 softmax 函数。它可以接受真实值并将其转化为概率。这非常有用,因为现在我们可以对两种以上的数据进行分类。(关于视频解释,我建议你看看这个!)

代号

现在我们来看看如何用 python 编写 softmax 函数的公式。

import numpy as npdef softmax(L):
    expL = np.exp(L) #calculating the numerator 
    sumExpL = sum(expL) #calculating the denominator 
    result = []
    for i in expL:
        result.append(i*1.0/sumExpL) #divind the numerator and denominator 
    return result

    # Note: The function np.divide can also be used here, as follows:
    # def softmax(L):
    #     expL = np.exp(L)
    #     return np.divide (expL, expL.sum())

这段代码直接取自 Udacity 课程, 深度学习用 Pytorch

这个 softmax 函数接受一个值 L,它表示分数。计算函数的分子和分母,然后除以它。

关键要点

什么是 softmax 函数?

softmax 函数是可以执行多类分类的激活函数。它接受真实值并进行概率分布。这个函数看起来像这样,

作者图片

Week✨的 DL 视频

看看这深深的假!这看起来像是流行歌手爱莉安娜·格兰德,但这个视频实际上是来自热门的 youtuber 网站 Emma Chamberlain。

额外资源/引用

本文在很大程度上基于 Udacity 教授的 PyTorch 深度学习课程。你一定要去看看!

这个视频很好地解释了乙状结肠的功能。同样是 Youtuber 上的这个视频很好地解释了 softmax 的功能。

这里是对 softmax 函数及其与逻辑回归的关系的一个很好的概述。

阅读维基百科总是有用的!

吴恩达也很好地解释了 softmax 函数!

关于 sigmoid 函数和 softmax 函数之间差异的详细解释可以在 reddit 表单上阅读。

哪里可以找到我😝

我的 LinkedIn!请随时与我联系,我喜欢谈论人工智能!

关注我的中页了解更多!

新加坡的金融科技行业现状如何?

原文:https://towardsdatascience.com/what-is-the-state-of-the-fintech-industry-in-singapore-45adb2c0d939?source=collection_archive---------54-----------------------

基于 R 的网页抓取分析

图片来源:安德烈·弗朗索瓦·麦肯齐,来自 Unsplash

自 2015 年以来,流入新加坡的金融科技私人资金呈指数级增长。据埃森哲称,2019 年,新加坡金融科技行业从私人投资者那里获得了创纪录的 8.61 亿美元资金,巩固了其作为亚太地区第五大金融科技市场的声誉。

鉴于私人资金大量流入新加坡的金融科技行业,或许值得研究一下这个新兴行业是否在就业增长 方面取得了收益。哪些类型的金融科技公司已经在新加坡开展业务?他们涉足哪些金融活动?他们是新成立的公司,还是大公司?要回答这些问题,我们首先需要定义什么是金融科技。

作者图片

那么,什么是 FinTechs 呢? 不幸的是,尽管世界各地的许多统计机构似乎都同意使用公司的“主要业务活动”这一概念,但目前还没有关于金融科技是什么的可靠定义。金融科技公司可以被定义为以提供金融服务为主要业务活动的公司,并以技术为支撑。但是,这也不是一个非常精确的定义。

一般来说,许多人认为金融科技是“游戏规则改变者”,寻求彻底改变金融服务的提供方式。这一问题因“TechFins”的出现而变得更加复杂,TechFins 主要是也涉足金融服务领域的科技公司。科技巨头,如阿里巴巴,也有一个银行部门,被认为是 TechFins。那么,你如何从技术股中筛选出技术股呢?

数据集
在等待金融科技的正确工作定义尘埃落定的时候,我发现新加坡金融科技协会 (SFA)维护着一份目录清单,列出了“
”金融科技认证的*(见下文)*。那么在新加坡成为" FinTech 认证 "是什么意思呢?你的金融科技公司必须(一)在新加坡注册并运营;(ii)为作为核心业务的金融部门提供技术解决方案,以及(iii)拥有随时可用的工作产品。**

图片作者,来自新加坡金融科技协会

事实证明,通过点击网站上的每个个人列表,我们可以获得相当广泛的信息,如特定的“金融科技认证”公司何时成立,其估计员工人数是多少,其商业模式以及其涉足的金融服务类型。下面的例子说明该公司是一家“ InsurTech ”。

图片作者来自新加坡金融科技协会

通过从新加坡金融科技协会的网站上抓取这些列表,我们可以获得这里金融科技公司的全面概述,如它们的商业模式,金融活动类型和就业增长。那么让我们开始吧!

事实证明,该网站使用 AJAX 来呈现其页面。使用 AJAX,web 应用程序可以异步地从服务器发送和检索数据,而不会干扰现有页面的显示和行为。虽然这是网站开发者的梦想,但对网站抓取者来说却是噩梦。

但是,在检查 Chrome 开发者工具时,我发现了网站调用数据的“秘密”页面。

作者图片,来自新加坡金融科技协会

如果我们点击嵌入在 Chrome 开发者工具中的 URL,我们会看到这样一个页面:

****

图片作者,来自新加坡金融科技协会

现在,如果我们仔细观察嵌入在 Chrome 开发者工具中的 URL,你可能会注意到“p=2”。这控制了页码。你可能会注意到上图中总共有 22 页和 437 个结果(即金融科技认证公司)。我们可以通过创建一个从“p=1”到“p=22”的 URL 列表来开始我们的 web 抓取过程。

现在,从这份包含 22 个网址的列表中,我们希望获得每家金融科技公司的名称及其具体网址。回想一下,我们有 437 家 FinTech 认证的公司,所以我们应该得到一个有 437 行的数据框架。为了获得您在下面的代码中看到的“ html_nodes( ) 中的参数,我使用了一个名为SelectorGadget的便捷工具,可以从 Chrome 上免费下载。

图片由作者提供,来自新加坡金融科技协会

现在我们已经有了 437 家金融科技认证公司的具体网址,我们可以有效地获取员工规模、商业模式等信息。类似地,这里使用了 SelectorGadget 来提取我们需要的各个字段。

图片作者,来自新加坡金融科技协会

现在我们手头上有了所有 437 家金融科技认证公司的数据,我们可以开始做一些分析了。

就业增长
我们的数据集目前是“wide”格式。我们可以将其转换为“长”格式,并可视化就业人数如何随着时间的推移而演变。不过,需要注意的是,所有 437 家金融科技认证公司报告的员工人数都是一个范围,比如“11-50”,而不是实际人数。此外,由于我们没有关于一家公司的员工人数如何随时间变化的纵向数据,我们将假设一家公司的员工人数从其成立到今天保持不变。

出于这一分析的目的,我们想研究 2011 年至 2020 年间就业如何演变。我们可以通过查看公司 UEN 的前 4 位数字来判断公司是哪一年成立的。假设一家公司在 2016 年成立,那么它在 2016 年之前的雇佣规模将被分配 NA 值,如下所示。

**现在我们可以使用 dplyr 的 group_by( )summary()命令为可视化准备数据。

作者图片

嗯,在我们的数据集中,437 家金融科技认证公司的就业人数似乎一直在稳步增长。事实上,就业增长与流入新加坡的金融科技私人资金正相关,后者自 2015 年以来有所增加。然而,由于新冠肺炎经济衰退,2020 年的增长率似乎有所放缓。

如果我们按照每个企业的员工规模来看就业增长,我们会注意到,一般来说,这是由微型企业和初创企业(即雇用不到 50 名工人的企业)的增长所支撑的。或许是一个令人鼓舞的迹象,在最近几年(2018 年至 2019 年),新加坡已经能够吸引更大的金融科技公司,尽管只有少数几家,它们雇用了 200 多名工人(红条)。**

公司成立
这里,我们要统计某一年成立的 FinTech 认证公司的数量。同样,我们着眼于 2011 年至 2020 年期间。

作者图片

自 2013 年以来,在新加坡注册的金融科技认证公司的数量一直呈上升趋势。随着 2019 年创纪录的 8.61 亿美元金融科技私人资金涌入新加坡,这一年公司数量的快速增长也就不足为奇了。尽管我们距离 2020 年底还有大约两个月的时间,但新冠肺炎经济衰退对金融科技行业的负面影响是非常明显的。

商业模式与金融服务类型
商业模式这里指的是某个特定的事务所是“B2B”、“B2C”还是“B2B2C”。至于金融服务的类型,可以有很多,从支付、贷款、经纪、汇款等等。我们可以从一些清理后的数据中获得这些关于金融科技认证公司性质的见解。

在我们数据集中的 437 家金融科技认证公司中,约 79%的公司至少服务于 B2B 领域。至于金融科技公司提供的金融服务类型,如"人工智能和机器学习"、"支付、"平台、"区块链借贷等活动最受欢迎。

这一发现得到了埃森哲(2019)的有力支持,该公司称:****

“投资于 支付的初创企业 和投资于的初创企业拿走了 fintech 募资的大头,分别占总数的34%20%,而 投保 techs中抽成****

新加坡的金融科技产业确实在增长,未来看起来确实令人兴奋。除了 2020 年,在私人金融科技融资和宽松监管的帮助下,公司成立和就业增长在过去 5 年中明显呈上升趋势。我预计,新冠肺炎经济衰退对金融科技初创企业的打击将尤其严重,相当多的初创企业甚至可能不得不倒闭。但是每一次危机都是一次机会,幸存者可能会变得更加强大。

非常感谢您的阅读!

这个指标的方差是多少?

原文:https://towardsdatascience.com/what-is-the-variance-in-that-metric-80ecde7313a3?source=collection_archive---------48-----------------------

了解业务指标概率分布的效用以及如何在 Python 中计算它们

Sergign 从photodune.net拍摄的照片

分析师通常会观察一段时间内的趋势,以了解指标中的噪声水平,但通常衡量中的噪声不会在用于决策的数据中表现出来。重复出现并向上传递的语句类似于“我们同比下降 20%”下降 20%可能真的很糟糕,或者如果指标有噪声,这可能只是发生的事情。当然,经验会告诉人们这是否是一个在下降 20%时确实超出正常范围的指标,但经验并不总是不偏不倚和听到的。大多数商业指标都是比例的形式。在本文中,我将探索我们如何评估标准业务度量的可信度。

情况

一名团队成员说“我们的转换率是 4%。这比我们通常看到的 5%有所下降。那就是转移率下降了 20%!一定是什么东西坏了!我们都需要停止正在做的事情,进行调查。”

你说“在我们从重要项目中抽调大量人员进行调查之前,让我们仔细看看这些数字。东西坏了之后你转了几次?东西坏了之后有多少次尝试?在“工作”系统崩溃之前,它进行了多少次转移?之前尝试了多少次?”您的同事在他们的电子表格中找到了以下数字。

old_transfers = 100
old_attempts = 2000
new_transfers = 8
new_attempts = 200transfer_rate_old = old_transfers/old_attemptstransfer_rate_new = new_transfers/new_attemptspercent_improvement = (transfer_rate_new-transfer_rate_old)/transfer_rate_old*100

因为像这样的许多业务度量是比例,所以它们可以被建模为二项式分布。这太棒了。我喜欢二项式分布,因为感觉上我可以免费得到方差。我只需要知道试验的次数,然后就是:方差神奇地显示为 np(1-p)。但是等等,n 和 p 是什么?n 是试验的次数或度量中的分母,参数 p 可以作为业务度量来估计。在我们的例子中,旧的工作系统是 0.05,坏的系统是 0.04。

我们可以绘制破损系统的转移率和工作系统的转移率的概率质量函数,假设它们遵循二项式分布。在这篇文章中,我不打算深究这些假设。目的是演示一种简单的方法来估计业务指标中的噪声,以便做出更明智的决策;如果您打算使用这种方法,我鼓励您深入研究这些主题,以确保您的数据符合使用这种简单方法所需的所有假设。我发现 Bootstrapping(https://en . Wikipedia . org/wiki/Bootstrapping _(statistics))是一种很好的方式来更好地了解你的数据如何符合模型(可能是我的下一篇文章)。

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as statsplot_max_x = 150
x_values = range(plot_max_x)
working_system_pmf = stats.binom.pmf(x_values, old_attempts, old_transfers/old_attempts)
plt.plot(x_values,working_system_pmf, 'b.', label = 'working_system_pmf')
broken_system_pmf = stats.binom.pmf(x_values, new_attempts, new_transfers/new_attempts)
plt.plot(x_values,broken_system_pmf, 'r.', label = 'broken_system_pmf')
plt.ylabel('probability')
plt.xlabel('transfers')
plt.legend()

那么,我在这个图中看到了什么?嗯,每个客户要么转账,要么不转账,所以任何 n 次尝试的可能性都是有限的。如果我们只有三个客户,所有可能的转移值将是 0、1、2 或 3。图上的 x 值是转移的次数,y 值是破损系统和工作系统的概率。这个概念可能会令人困惑。我们不知道转账吗?我们确实知道所测量的转移。故障系统为 8,工作系统为 100。但是,这并没有完全描述我们想知道的东西。我们真正感兴趣的是破碎系统的未来传输速率,这就是这个图所表示的。我发现把我们的度量看作是对系统真实价值的一次尝试是有帮助的。我们测量了损坏系统的 8 次传输,但是我们知道每个测量都包含噪声。也许每 200 次尝试就有 10 次传输才是坏系统的真实传输速率?该图显示了在给定我们已有信息的情况下,尚未执行的测量的可能结果。随着我们收集更多的数据,我们对系统的真实速率有了更好的估计。但是我们不能等。系统可能被破坏了。我们需要正确解读现有的数据。

显然,工作系统将有更多的转移,因为我们有这么多的客户使用这个系统。在该图中,工作系统的曲线看起来更粗,这通常与更多的噪声有关。但这是骗人的。工作系统的曲线中所示的最高转移为大约 125,相对于在大约 17 处具有曲线的最高部分而测量的转移数仅为 8 的损坏系统,这比测量的转移数 100 大不了多少。所以,在工作系统中,相对方差更小,因为我们做了更多的测量。

但是我仍然不知道如何处理这些信息。我们似乎没有更接近于比较这些比率。也许我们推进调查,忘记分析?由于贝叶斯方程和共轭先验的魔力,我们实际上比你想象的更接近理解我们对系统崩溃的信心。

后验∝先验⨉似然

为了简单起见,我们将使用均匀分布作为非信息先验信念。不要让这种说法把你搞糊涂了。这只是意味着,在我们开始为两个系统中的任何一个收集数据之前,我们将避免谈论我们认为的传输率是多少。将均匀分布用于我们的先验信念会导致后验分布,即我们感兴趣的传输速率,它只是一个带有alpha = 1+ transfersbeta = 1 + (attempts — transfers)的贝塔分布。α和β是进行β分布所需的两个参数。这些就像是正态分布所需的均值和标准差参数。

二项式分布用于描述一系列 n 个独立实验的成功次数。我们将用来描述转移率的贝塔分布,被用来描述连续变量的行为,如定义在 0 和 1 之间的区间上的比例。

Bayes 方程允许我们获得使用每个系统收集的数据的概率分布(图 1 ),并将其转换为指标(传输速率)的概率估计值。同样,这是一个你应该深入了解的领域,以理解我所做的假设。简而言之,我假设在收集两个系统的数据之前我对传输速率一无所知,并且我利用了每个系统所有可能的传输速率的总概率为 1 的事实。

x = np.linspace(0.01, 0.2, 1000)
working_system_transfer_rate_pdf = stats.beta.pdf(x, old_transfers+1, (old_attempts-old_transfers)+1)/np.sum(stats.beta.pdf(x, old_transfers+1, (old_attempts-old_transfers)+1))
broken_system_transfer_rate_pdf = stats.beta.pdf(x, new_transfers+1, (new_attempts-new_transfers)+1)/np.sum(stats.beta.pdf(x, new_transfers+1, (new_attempts-new_transfers)+1))
# notice that I normalize the transfer rate by dividing each value by the total 
plt.plot(x, working_system_transfer_rate_pdf, 'b-', lw=2, alpha=0.6, label='Working system expected val = ' + str(np.round(old_transfers/old_attempts, 3)) )
plt.plot(x, broken_system_transfer_rate_pdf, 'r-', lw=2, alpha=0.6, label='"Broken" system expected val = ' + str(np.round(new_transfers/new_attempts, 3)) )
plt.legend()
plt.xlabel('Transfer Rate')

那么我们在看什么?我们知道每个系统都有一个传输速率。我们进行的测量越多,对传输速率的估计就越准确。我们测得故障系统的传输速率为 0.04,但如果我们再测量该系统几天,我们知道我们对实际传输速率的估计会有一些变化,因为任何测量中都有噪声。该图显示了在给定我们当前拥有的数据的情况下,每个系统的传输速率的概率分布的估计值。该图向我们显示,尽管损坏系统的传输速率的期望值是 0.04,但是损坏系统具有 0.05 或更高的传输速率的可能性很大。根据这张图表,我可能会推迟启动大规模调查,但我们必须将这些信息与更低传输速率的成本信息结合起来。

结论

如上图所示的图表可以帮助我们做出更明智的商业决策。通过对概率分布和 Bayes 方程以及几行代码的了解,我们可以绘制概率分布图来比较业务指标。文章的代码可以在这里找到https://github.com/bprazen/business_metric_analysis。

什么是波动风险溢价?

原文:https://towardsdatascience.com/what-is-the-volatility-risk-premium-634dba2160ad?source=collection_archive---------17-----------------------

投资组合中的可视化和实现

照片由像素的皮克斯拜拍摄

波动风险溢价的概念

在 Black-Scholes 模型的衍生之后,讨论开放到它在普通期权定价中的位置。市场根据供求规律决定特定履约和到期的利率和期权价格。唯一不容易作为布莱克-斯科尔斯方程输入的参数是波动率。由于除波动率之外的每个参数都是可用的,并且由市场决定,布莱克-斯科尔斯方程的逆方程允许我们找到市场参与者预期的波动率:隐含波动率。从经验上看,隐含波动率的有趣之处在于,它倾向于高估已实现波动率,这主要是由于市场参与者及其已实现对手的预期。

蒙特卡洛定价图解

想想下面这段欧洲人打电话给间谍的话。

使用一个通用的蒙特卡罗定价模拟让我们能够说明这一现象。我们假设基础资产遵循扩散过程(几何布朗运动)。考虑以下 Python 代码来计算欧式看涨期权产生的预期现金流净现值。换句话说,期权的公允价格

蒙特卡洛模拟给出的最终买入价格为:

Monte Carlo Euro Call price:  5.09259969279995

现在,考虑以下使用市场隐含波动率的蒙特卡洛模拟价格。

Monte Carlo Euro Call price:  6.450104207093876

在一个完美的世界中,使用隐含波动率的期权价值将收敛于期权的 Black-Scholes 或市场价值。真正的问题是,为什么期权的公允价格和市场价格之间存在差异?看波动率,可以问另一个问题:为什么市场隐含的波动率往往高于已实现的波动率?

市场参与者的行为研究

在耶鲁大学的一项研究中,市场参与者倾向于高估重大崩盘的概率,导致对期权的需求增加。这种对风险的高度感知可能会导致人们更愿意购买这些期权来对冲投资组合。换句话说,投资者愿意为防范重大市场崩溃的期权支付溢价,即使从统计数据来看,这些崩溃的概率较小,甚至可以忽略不计。

波动风险溢价组合构建

波动风险溢价存在的概念意味着从利润和多样化中获取和受益的能力。提取 VRP 的最纯粹的方法在于 S&P500 的卖空期权头寸。从长期来看,这种策略产生正回报,同时也保持了多样化的好处,因为它与股票的相关性极低。

摘要

波动率风险溢价是指隐含波动率往往高于实际波动率,因为市场参与者往往高估了市场大幅崩盘的可能性。这种高估可能解释了作为股票投资组合保护的期权需求的增加。因此,这将提高这些期权的价格,并解释隐含波动率高于实际波动率的趋势。波动风险溢价的存在可以被利用为一种有利可图的策略,同时有助于分散风险,因为 S&P500 的空头期权头寸往往保持较低的贝塔系数。

参考

Marroni,l .,& Perdomo,I. (2014 年)。金融衍生品的定价和对冲:从业者指南。怀利。

纳滕贝格,S. (2015 年)。期权波动和定价:高级交易策略和技术。纽约:麦格劳-希尔教育公司。

Sullivan,r .,Israelov,r .,Ang,I .,& Tummala,h .理解波动风险溢价。2020 年 9 月 29 日检索,来自https://www . aqr . com/Insights/Research/White-Papers/Understanding-the-Volatility-Risk-Premium

什么是第三方风险评估,如何进行评估?

原文:https://towardsdatascience.com/what-is-third-party-risk-assessment-and-how-can-you-do-it-ef3c69a6e0ce?source=collection_archive---------20-----------------------

照片由 Cookie 在 Unsplash 上的 Pom 拍摄

如今,随着一些全球趋势的出现,保险公司和投资企业倾向于优先考虑第三方风险管理。也就是说,在价格上涨、依赖数字技术以及意识到许多组织违规行为都源自自身受到威胁的可信供应商的环境下,外包的速度加快了。

因此,第三方风险评估和风险管理计划变得势在必行。

什么是第三方风险评估?

要了解第三方风险评估的定义和必要性,首先要注意第三方风险的成因。各种组织根据其能力,将某些业务外包给第三方。这些第三方可能包括供应商、销售商、分包商、合同制造商、经销商、分销商、合作伙伴、受控公司或附属公司。

为什么有些组织会外包某些操作?

减少开支;加速生产、分配和销售;或者增加利润,这些都导致组织在各自的行业中具有竞争优势。最常见的情况是,组织进行外包,以使他们能够专注于自己的核心专业领域,并利用这些提供商的专业知识来整合到他们的整体产品中。

那么,一旦你有了这些第三方来支持你的服务产品,你如何为你的组织提出一个风险管理计划呢?

进入第三方风险评估,这将有助于您的组织评估每个第三方的风险程度(和条件)。通过精心设计的风险评估计划,您的企业将能够降低第三方对您的运营和发展带来的风险。

为什么要进行第三方风险评估?

创建和维护第三方关系与多种风险相关。

什么样的风险?

声誉、战略、管理、信息安全和经济负担。其他风险包括数据泄露、第三方非法使用信息、不合规造成的有害和破坏性影响,以及供应链管理中的违规行为。

特别是,工业经营的全球化导致第三方在世界各地出现。反过来,与运营和分销相关的风险也呈上升趋势。

在现代世界的任何地方,任何自然的、人为的或故意的干扰都会对企业的生产和服务产生负面影响。

如果跨国企业缺乏强有力的风险管理计划来应对此类第三方风险,它可能会遭受经济和声誉损失。这就产生了对有效的风险评估和风险管理的需求,并要求寻找有效的相关评估服务。

如何执行第三方风险评估

现在,您已经对风险管理、什么是第三方风险评估以及为什么应该进行第三方风险评估有了更好的理解,让我们来看看如何执行第三方风险评估的逐步过程。

1.建立供应商风险标准

创建供应商风险标准列表。它应该包括您的组织可能面临的最具破坏性的第三方风险。

例如,管理或外包机密数据的企业应该将各种信息安全风险作为其供应商风险标准的一部分。

反过来,这将告知您组织的风险评估范围。此外,它还会影响您的行动和策略,以及您将用于第三方或供应商风险评估的技术。基于这样的风险标准,您还可以缩小第三方或供应商的选择范围。

这将引导您进入风险管理计划的下一步:对供应商进行分类。基本上,您创建了一个可操作的高风险第三方列表,您将与他们一起执行风险评估。

2.进行第三方入职和筛选

为了预测和防范任何可能的风险,您必须详细了解第三方或供应商关系。第一步是在整个公司强制推行风险管理的标准流程。

专家建议您构建一个第三方风险管理计划,其框架将标准化所有第三方入职和筛选。如果可能,您还可以使用实时风险检查和遏制措施的全面方法。

为您的风险管理计划精心设计的框架提供了一个双赢的局面:

在风险评估之前,您可以及时了解任何可能的第三方风险(和有风险的供应商)。此外,您的风险管理计划框架将帮助您优化时间并进行深入的风险评估。

3.使风险评估更易于管理

由于您的评估质量将直接影响您的风险管理计划,您必须确保您的评估质量,简单的复选框评估是不够的。为此,您必须全面分析任何供应商是否有风险,为什么他们有风险,以及您(或他们)如何应对这些风险。

此后,与有风险的第三方的协议将保证细致和一致的监控。

接下来,您将需要专业的专家来帮助分析您收集的数据。例如,来自政策、技术、网络安全或会计背景的专业人员可以进行整体分析并发布详细报告。今天,强大的组织为这样的风险分析项目部署整个团队。

4.评估绩效结果,而不仅仅是风险

结果是您的第三方关系是否有风险以及有多大风险的症状。例如,信息安全评级将使您能够始终如一地监督供应商的合规性和不可预测的风险。

如果您与多个第三方签订了合同,记录他们的信息安全和合规性得分将会:

  • 增强和简化第三方风险评估,
  • 记录安全状态的任何错误;和
  • 要求解决涉及第三方的风险问题。

5.利用技术的力量

资本和资源的可用性是进行供应商风险评估的基本前提。为了节省开支,您应该考虑购买和部署能够简化第三方风险评估和管理整个流程的软件。

作为一项提供评估服务的技术,它还将为您组织中的风险评估标准化一个跨部门框架。

技术利用对于进行全面彻底的风险评估和管理至关重要。

为什么?

原因有很多,包括:

  • 它让你控制一个平台,通过这个平台,你可以定期监督任何数量的第三方和相关的风险。
  • 它提高了您预测和分析内部和外部第三方风险的能力,同时影响了您的评估范围。
  • 它有助于您通过多次评估收集和宏观分析关于第三方风险的可靠数据,这将增强您的组织对任何供应商的未来决策。
  • 它使您能够衡量风险评估指标的有效性,这标志着您的数据的质量和可靠性。

准备好开始第三方风险评估了吗?

不管你的公司规模有多大,你都有可能与许多第三方保持业务关系,这些第三方将帮助你简化运营。

但是,与第三方交换运营数据和机密信息会使这些数据和信息容易被滥用和利用,从而增加风险。尤其是在相关方缺乏最佳信息安全措施或合规性的情况下。

这使得你有必要制定一个风险管理计划。

作为利益相关者,您有责任进行全面的第三方风险评估,以保护您的公司免受风险业务的影响,并在多个层面监督其运营标准和结果。

关于作者:

Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。

什么是时间序列分解,它是如何工作的?

原文:https://towardsdatascience.com/what-is-time-series-decomposition-and-how-does-it-work-9b67e007ae90?source=collection_archive---------8-----------------------

照片由 nutraveller 通过 Pixabay ( Pixabay 许可)

此外,我们还将深入了解使用 Python 的强大时间序列分解算法

时间序列可被视为由 4 个部分组成:

季节性成分
趋势成分
周期性成分
噪声成分。

季节性成分

季节性因素解释了人们在许多数据集中看到的周期性起伏,如下图所示。

零售二手车销售。数据来源:美国弗雷德(图片由作者)

在上面的例子中,季节周期大约为 12 个月,在 3 月达到高峰,在 11 月或 12 月触底,然后在 3 月再次达到高峰。

时间序列可以包含多个叠加的季节周期。一个经典的例子是气象站每小时温度的时间序列。由于地球绕地轴旋转,气象站的每小时温度图将显示 24 小时的季节周期。地球也以倾斜的方式围绕太阳旋转,导致了季节性的温度变化。如果你连续 365 天跟踪气象站上午 11 点的温度,你会看到第二种模式出现,其周期为 12 个月。24 小时长的日形态叠加在 12 个月长的年形态上。

在每小时天气数据的情况下,人们知道是什么潜在的物理现象导致了这两种季节模式。但在大多数情况下,不可能知道将季节性引入数据的所有因素是什么。因此,很难发现隐藏在时间序列中的所有季节周期。

也就是说,常见的季节周期是一天、一周、一月、一季(或一季)和一年。

季节性也可以在更长的时间尺度上观察到,例如太阳周期,它遵循大约 11 年的周期。

每日太阳黑子计数。数据来源: SILSO (图片由作者提供)

趋势组件

趋势部分指的是跨季节期间的数据模式。

下图所示的零售电子商务销售时间序列展示了一个可能的二次趋势( y = x ),该趋势跨越了长达 12 个月的季节周期:

零售电子商务销售。数据来源:美国弗雷德(图片由作者提供)

周期性成分

周期性成分代表跨季节发生的现象。周期性模式不像季节性模式那样有固定的周期。周期性模式的一个例子是股票市场经历的对世界事件的繁荣和萧条的循环。

道琼斯收盘价比上一年(1880 年至 2020 年)的百分比变化。数据来源:【MeasuringWorth.com】T4via维基百科)(图片由作者)

周期性成分很难被分离出来,它常常被与趋势成分结合在一起而被“搁置”。

噪声成分

当你从时间序列中分离出季节性和趋势时,噪声或随机成分会留下来。噪音是你不知道或无法测量的因素的影响。这是已知的未知的影响,或未知的未知。

加法和乘法效应

趋势、季节性和噪声成分可以以加法乘法的方式组合。

相加组合
如果季节和噪声分量改变趋势的量与趋势值无关,则趋势、季节和噪声分量被认为以相加的方式表现。这种情况可以表示如下:

y_i = t_i + s_i + n_i

其中 y_i =时间序列在第时间步的值。
t_i =第时间步的趋势分量。
s_i =第时间步的季节分量。
n_i =第时间步的噪声分量。

乘法组合 如果季节和噪声分量改变趋势的量取决于趋势的值,则这三个分量以乘法方式表现如下:

y_i = t_i * s_i * n_i

使用 Python 将时间序列分解为趋势、季节和噪声分量的分步过程

有许多可用的分解方法,从简单的基于移动平均的方法到强大的方法,如 STL。

在 Python 中, statsmodels 库有一个 seasonal_decompose() 方法,可以让你在一行代码中将时间序列分解成趋势、季节性和噪声。

在我的文章中,我们喜欢进入杂草中。所以在我们使用 seasonal_decompose() 之前,让我们深入了解一个简单而强大的时间序列分解技术。

让我们了解分解在幕后是如何工作的。

我们将手动将时间序列分解为趋势、季节和噪声成分,使用基于移动平均值的简单程序,步骤如下:

步骤 1:确定季节周期的长度
步骤 2:隔离趋势
步骤 3:隔离季节性+噪声
步骤 4:隔离季节性
步骤 5:隔离噪声

我们将以美国用户汽车经销商的零售销售时间序列为例:

零售二手车销售。数据来源:美国弗雷德(图片由作者)

让我们将数据加载到熊猫数据框架中,并绘制时间序列:

**import** pandas **as** pd
import numpy as np
import math
from matplotlib import pyplot as pltmydateparser = **lambda** x: pd.**datetime**.**strptime**(x, '%d-%m-%y')df = pd.**read_csv**('retail_sales_used_car_dealers_us_1992_2020.csv', **header**=0, **index_col**=0, **parse_dates**=['DATE'], **date_parser**=mydateparser)fig = plt.figure()fig.suptitle(**'Retail sales of used car dealers in the US in millions of dollars'**)df[**'Retail_Sales'**].plot()plt.show()

现在让我们开始逐步分解这个时间序列。

**第一步:**尝试猜测数据中季节性成分的持续时间。在上面的例子中,我们猜测是 12 个月。

**第二步:**现在运行一个以 12 个月****移动平均线为中心的数据。这一移动平均值分布在总共 13 个月的时间里。即在中心月份的左侧和右侧各有 6 个月。以 12 个月为中心的移动平均线是两个移动平均线的平均值,两个移动平均线相差 1 个月,实际上是一个加权移动平均线。****

下面举例说明了如何在 Microsoft Excel 中计算这种居中的 MA:

2 x 12 居中移动平均线的图示(图片由作者提供)

这种 MA 将消除季节性和噪音,并显示趋势。

继续我们的 Python 示例,下面是我们如何在 Python 中计算居中移动平均值:

****#Add an empty column to store the 2x12 centered MA values**
df[**'2 x 12 CMA (TREND)'**] = np.nan**#Fill it up with the 2x12 centered MA values
for** i **in** range(6,df[**'Retail_Sales'**].size-6):
    df[**'2 x 12 CMA (TREND)'**][i] = np.round(
        df[**'Retail_Sales'**][i - 6] * 1.0 / 24 + 
        (
            df[**'Retail_Sales'**][i - 5] + 
            df[**'Retail_Sales'**][i - 4] + 
            df[**'Retail_Sales'**][i - 3] + 
            df[**'Retail_Sales'**][i - 2] + 
            df[**'Retail_Sales'**][i - 1] + 
            df[**'Retail_Sales'**][i] + 
            df[**'Retail_Sales'**][i + 1] + 
            df[**'Retail_Sales'**]i + 2] + 
            df[**'Retail_Sales'**][i + 3] + 
            df[**'Retail_Sales'**][i + 4] + 
            df[**'Retail_Sales'**][i + 5]
        ) * 1.0 / 12 + 
        df[**'Retail_Sales'**][i + 6] * 1.0 / 24**

请注意,索引【I-6】【I+6】处的值是如何通过 1.0/24 进行加权的,而其余值是如何通过 1.0/12 进行加权的。

让我们绘制包含在列‘2 x 12 CMA(趋势)’:中的结果时间序列

*****#plot the trend component***fig = plt.figure()fig.suptitle(**'TREND component of Retail sales of used car dealers in the US in millions of dollars'**)df[**'2 x 12 CMA (TREND)'**].plot()plt.show()**

如您所见,我们的移动平均转换突出了零售时间序列的趋势部分:

(图片由作者提供)

第三步:现在我们要做一个决定。根据组成是乘法还是加法,我们将需要从原始时间序列中除以或减去趋势分量,以检索季节和噪声分量。如果我们检查原始的汽车销售时间序列,我们可以看到季节性波动与时间序列的当前值成比例增加。因此,我们将假设季节性是倍增的。我们还将大胆假设噪声是乘法噪声。

因此,假定零售二手车销售时间序列具有以下乘法分解模型:

时间序列值=趋势分量季节分量噪声分量

因此:

季节性成分*噪声成分=时间序列值/趋势成分

我们将在数据框中添加一个新列,并使用上面的公式填充季节和噪声分量的乘积。

**df['SEASONALITY AND NOISE'] = df['Retail_Sales']/df['2 x 12 CMA (TREND)']**

让我们绘制新的列。这一次,我们将看到季节性和噪音通过:

**fig = plt.figure()fig.suptitle(**'SEASONALITY and NOISE components'**)plt.ylim(0, 1.3)df[**'SEASONALITY AND NOISE'**].plot()plt.show()**

(图片由作者提供)

******步骤 4:** 接下来,我们将通过计算所有一月、二月、三月等月份的季节性成分的平均值,从季节性和噪声的混合中获得“纯”季节性成分。****

*****#first add a month column***df[**'MONTH'**] = df.index.strftime(**'%m'**).astype(np.int)***#initialize the month based dictionaries to store the running total of the month wise  seasonal sums and counts*** average_seasonal_values = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0}average_seasonal_value_counts = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0}***#calculate the sums and counts* for** i **in** range(0, df[**'SEASONALITY AND NOISE'**].size):
    **if** math.isnan(df[**'SEASONALITY AND NOISE'**][i]) **is False**:
        average_seasonal_values[df[**'MONTH'**][i]] =  
            average_seasonal_values[df[**'MONTH'**][i]] +
            df[**'SEASONALITY AND NOISE'**][i] average_seasonal_value_counts[df[**'MONTH'**][i]] =
            average_seasonal_value_counts[df[**'MONTH'**][i]] + 1***#calculate the average seasonal component for each month* for** i **in** range(1, 13):
    average_seasonal_values[i] = average_seasonal_values[i] / average_seasonal_value_counts[i]***#create a new column in the data frame and fill it with the value of the average seasonal component for the corresponding month***df[**'SEASONALITY'**] = np.nan**for** i **in** range(0, df[**'SEASONALITY AND NOISE'**].size):
    **if** math.isnan(df[**'SEASONALITY AND NOISE'**][i]) **is False**:
        df[**'SEASONALITY'**][i] = 
            average_seasonal_values[df[**'MONTH'**][i]]**

让我们画出这个纯季节成分:

*****#plot the seasonal component*** fig = plt.figure()fig.suptitle(**'The \'pure\' SEASONAL component'**)plt.ylim(0, 1.3)df[**'SEASONALITY'**].plot()plt.show()**

(图片由作者提供)

****第五步:最后,我们将之前分离出的噪声季节值除以平均季节值,得出每个月的噪声分量。

噪声分量=噪声季节性分量/平均季节性分量

**df[**'NOISE'**] = df[**'SEASONALITY AND NOISE'**]/df[**'SEASONALITY'**]*#plot the seasonal component*fig = plt.figure()fig.suptitle(**'The NOISE component'**)plt.ylim(0, 1.3)df[**'NOISE'**].plot()plt.show()**

(图片由作者提供)

所以你有它!我们只是手工制作了将时间序列分解成趋势、季节和噪声成分的程序。

以下是时间序列及其组成部分的拼贴画:

(图片由作者提供)

使用 statsmodels 的时间序列分解

现在我们知道了分解是如何从内部工作的,我们可以稍微欺骗一下,在 statsmodels 中使用 seasonal_decompose()在一行代码中完成上述所有工作:

****from** statsmodels.tsa.seasonal **import** seasonal_decomposecomponents = **seasonal_decompose**(df['Retail_Sales'], **model**='multiplicative')components.**plot**()**

这是我们得到的图:

零售二手车销售数据集上的季节性分解()的输出(图片由作者提供)

以下是完整的 Python 源代码:

这里的是到 Python 例子中使用的数据集的链接。

引用和版权

美国人口普查局,零售销售:二手车经销商[MRTSSM44112USN],检索自圣路易斯美联储银行弗雷德;https://fred.stlouisfed.org/series/MRTSSM44112USN,2020 年 6 月 17 日,根据弗雷德版权条款。

美国人口普查局,电子商务零售销售[ECOMNSA],从圣路易斯美联储银行检索;https://fred.stlouisfed.org/series/ECOMN,根据弗雷德版权条款。

SILSO,世界数据中心—太阳黑子数和长期太阳观测,比利时皇家天文台,在线太阳黑子数目录:http://www.sidc.be/SILSO/,1818–2020(CC-BY-NA

塞缪尔·h·威廉姆森,“美国 DJA 每日收盘价,1885 年至今”,MeasuringWorth,2020 年
网址:http://www.measuringworth.com/DJA/

本文中的所有图片版权归 Sachin Date 所有,版权归 CC-BY-NC-SA 所有,除非图片下面提到了不同的来源和版权。

感谢阅读!如果你喜欢这篇文章,请 关注我 获取关于时间序列分析的技巧、操作方法和编程建议。

什么是转置卷积层?

原文:https://towardsdatascience.com/what-is-transposed-convolutional-layer-40e5e6e31c11?source=collection_archive---------1-----------------------

通过动画 gif 和 python 代码解释

转置卷积层也被(错误地)称为解卷积层。解卷积层与标准卷积层的操作相反,即如果通过标准卷积层生成的输出被解卷积,则可以恢复原始输入。转置卷积层类似于去卷积层,因为两者生成的空间维度是相同的。转置卷积不按值反转标准卷积,而是只按维度反转。

转置卷积层的功能与标准卷积层完全相同,只是对输入特征映射进行了修改。在解释相似性之前,我们先来看看标准卷积层是如何工作的。

标准卷积层:

大小为 ixi 的输入上的标准卷积层由以下两个参数定义。

  • 填充***【p】:原输入周围填充的零的个数增加到(I+2 * p)x(I+2 * p)***
  • 步幅 (s): 在输入图像上滑动时内核移动的量。

下图显示了卷积层如何分两步工作。

在第一步中,用零填充输入图像,而在第二步中,将内核放置在填充的输入上并滑动,生成作为内核和重叠输入区域的点积的输出像素。通过进行由步幅定义的大小的跳跃,内核滑过填充的输入。卷积层通常进行下采样,即输出的空间维度小于输入的空间维度。

下面的动画解释了卷积层在不同跨距和填充值下的工作原理。

对于给定尺寸的输入 (i) 、内核 (k) 、填充***(p)和步幅(s)***,输出特征图的尺寸由下式给出

转置卷积层:

另一方面,转置卷积层通常用于上采样,即生成空间维度大于输入特征图的输出特征图。正如标准卷积层一样,转置卷积层也是由填充和步幅定义的。padding 和 stride 的这些值是假设对输出执行以生成输入的值。也就是说,如果您获取输出,并执行定义了步幅和填充的标准卷积,它将生成与输入相同的空间维度。

实现转置卷积层可以更好地解释为 4 步过程

  • **步骤 1:** 计算新的参数 z 和 p’
  • 第二步:在输入的每一行和每一列之间,插入 z 个零。这增加了输入到的大小(2 * I-1)×2 * I-1)
  • **步骤 3:** 用 p’个零填充修改后的输入图像
  • **步骤 4:** 以步长 1 对步骤 3 生成的图像进行标准卷积

完整的步骤如下图所示。

作者图片

下面的动画解释了卷积层在不同跨距和填充值下的工作原理。

对于给定尺寸的输入 (i) 、内核 (k) 、填充***(p)和步幅 (s) ,输出的尺寸特征图【o】***由下式给出

总结:

下表总结了两种卷积,标准卷积和转置卷积。

  • 转置卷积背后的思想是执行可训练的上采样
  • 转置卷积是标准卷积,但是具有修改的输入特征映射。
  • 步幅和填充并不对应于图像周围添加的零的数量以及在输入上滑动图像时内核的移动量,这与标准卷积运算中的情况不同。

Python 代码:

gif 是用 python 生成的。完整的代码可以在https://github.com/aqeelanwar/conv_layers_animation找到

奖金:

可以在下面的链接中找到这个主题和机器学习中许多其他重要主题的紧凑备忘单

[## 机器学习面试主题的备忘单

ML 面试的视觉备忘单(www.cheatsheets.aqeel-anwar.com)

medium.com](https://medium.com/swlh/cheat-sheets-for-machine-learning-interview-topics-51c2bc2bab4f)

如果这篇文章对你有帮助,欢迎鼓掌、分享和回复。如果你想了解更多关于机器学习和数据科学的知识,请关注我@Aqeel an war或者在LinkedIn上与我联系。

机器学习中的矢量化是什么?

原文:https://towardsdatascience.com/what-is-vectorization-in-machine-learning-6c7be3e4440a?source=collection_archive---------4-----------------------

SpaceX 在 Unsplash 上拍摄的

使用矢量化让您的代码快速执行

您将学到的内容:

  1. 什么是矢量化?
  2. 矢量化在机器学习中有多重要?
  3. 示例:非矢量化与矢量化实现
  4. 矢量化实施的优势
  5. jupyter 笔记本演示

我第一次了解矢量化的概念是在 Coursera 平台上学习吴恩达教授的最著名的课程机器学习

根据吴恩达教授的说法:

“执行矢量化的能力已经成为一项关键技能

所以,让我们学习这项技能,并将其纳入我们的工具箱:)

什么是矢量化?

构造化是一种可以让你的代码快速执行的技术。当你从零开始实现算法时,这是一个非常有趣和重要的优化算法的方法。

现在借助 C/C++、Octave/Matlab、Python、…等高度优化的数值线性代数库。我们可以让代码高效运行。

感谢专门做数值计算的人!

在本教程中,我们将使用:

**Numpy:**Python 中的快速数值计算库

矢量化在机器学习中有多重要?

就像在现实世界中,我们感兴趣的是以尽可能减少错误的方式有效地解决任何类型的问题。

在机器学习中,有一个优化算法的概念,它试图减少错误,并计算出机器学习模型的最佳参数。

因此,通过在优化算法中使用矢量化实现,我们可以使计算过程比非矢量化实现快得多。

优化算法的一个基本例子:梯度下降

梯度下降如何工作的例子,图片由凯文·宾兹在来源上提供

现在让我们先玩玩 Numpy 来了解一下如何使用高度优化的计算库

Python List 和 Numpy 数组的性能比较

使用 Numpy:平均每循环花费 1.52 毫秒

没有 Numpy:平均每个循环花费了 69.9 毫秒

代码:

# With Python Listsa=list(range(1000000)) #10^6 numbers generated
%timeit [val + 5 for val in a] #Computing Element Wise Operation# With Numpy Arraysimport numpy as np
a=np.array(a) #Converting into numpy array type
%timeit a+5

range() : range 函数用于生成一段时间内的数字序列

%timeit :这是一个 ipython 神奇的函数,可以用来计时一段特定的代码。

非矢量化与矢量化实施

线性回归的假设函数

让我们使用线性回归的假设函数来理解矢量化的概念,其中θ表示权重/系数, x 表示特征

现在有两种方法可以实现上述功能:

  1. 使用 For 循环
  2. 使用矢量化

首先,让我们为θ和 x 向量生成随机数

n=10000# Generate n random numbers between 0 - 1
theta = np.random.rand(n)#Generate n random integers between 0 - 100 
x = np.random.randint(0, 100, n)

现在观察非矢量化代码和矢量化代码之间的区别

对于循环与矢量化实现

两种实现给我们相同的输出,但问题是计算效率如何?

比较性能

非矢量化代码和矢量化代码的性能比较

使用未向量化的代码:平均每个循环花费 6.46 毫秒

**使用向量化代码:**平均每循环花费了 18.8 秒

代码:

# Unvectorizeddef unvectorized(n, theta, x):

    prediction= 0.0

    for j in range(n):
        prediction= prediction + theta[j]*x[j]

    return prediction# Vectorizeddef vectorized(theta, x):

    prediction= 0.0

    prediction = np.dot(theta.transpose() , x)

    return prediction#Comparing Performance%timeit unvectorized(n, theta, x)
%timeit vectorized(theta, x)

矢量化实施的优势

  1. 我们的代码运行高效
  2. 我们的代码变得更加简单,易于调试

演示时间:)

Jupyter 笔记本电脑演示(非矢量化与矢量化实施)

源代码

本教程中使用的所有代码都可以在我的 GitHub 帐户上获得点击这里

埃米尔·佩龙在 Unsplash 上的照片

结论

在本教程中,您学习了矢量化技术,这是提高代码效率的方法之一。

下节课再见:)

接触

Gmail-> jalalmansoori19@gmail.com

github->https://github.com/jalalmansoori19

参考

  1. https://speaker deck . com/jakevdp/losing-your-loops-fast-numpy-pycon-2015
  2. 吴恩达教授在 Coursera 上的机器学习课程

XGBoost 是什么?以及如何优化?

原文:https://towardsdatascience.com/what-is-xgboost-and-how-to-optimize-it-d3c24e0e41b4?source=collection_archive---------47-----------------------

来源:图片由 Free-Photos 来自 Pixabay

在机器学习和 Kaggle 竞赛的世界中,XGBoost 算法占据了第一位。

介绍

像许多数据科学家一样,XGBoost 现在是我工具箱的一部分。该算法是数据科学领域(真实世界或竞争)最流行的算法之一。它的多任务方面允许它在回归或分类项目中使用。它可以用于表格、结构化和非结构化数据。

GitHub 上有一个包含代码的笔记本。笔记本用于文件(文本)的分类。

XGBoost

XGBoost 或极端梯度提升是一种基于树的算法(Chen and Guestrin,2016[2])。XGBoost 是树家族(决策树、随机森林、装袋、提升、梯度提升)的一部分。

Boosting 是一种集合方法,主要目的是减少偏差和方差。目标是顺序创建弱树,以便每个新树(或学习者)关注前一个树的弱点(错误分类的数据)。在添加弱学习者之后,数据权重被重新调整,称为“重新加权”。由于每个新学习者加入后的自动校正,在收敛后整体形成一个强模型。

XGBoost 的强项是并行性和硬件优化。数据存储在内存中,称为块,并以压缩列[CSC]格式存储。该算法可以执行树修剪,以便以低概率移除分支。模型的损失函数中有一项通过正则化来惩罚模型的复杂性,以平滑学习过程(降低过拟合的可能性)。

该模型即使在缺失值或大量零值的情况下也能很好地执行稀疏感知。XGBoost 使用一种称为“加权分位数草图算法”的算法,这允许算法专注于错误分类的数据。每个新学习者的目标是学习如何在每次迭代后对错误数据进行分类。该方法允许您按分位数对数据进行排序,以便找到正确的分割点。这是ϵ参数的目标,也就是分割的值(ϵ=0.1;分位数=[10%,20%,…,90%])。

升压过程的迭代次数由具有集成交叉验证方法的算法自动确定。

作者提供了不同树算法的比较表:

陈和 Guestin,2016。第 7 页,表 1。

优化

XGBoost 具有超参数(估计器不学习的参数),必须通过参数优化来确定。这个过程很简单,每个要估计的参数由一个值列表表示,然后每个组合由模型进行测试,通过比较模型的度量来推断最佳组合。对参数的搜索需要通过交叉验证用指标来指导。不要害怕,[sklearn](https://scikit-learn.org/stable/index.html)有两个功能可以帮你做到这一点:[RandomizedSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html)[GridSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html?highlight=gridsearchcv#sklearn.model_selection.GridSearchCV)

网格搜索

网格搜索是一种尝试计算超参数最佳值的调整技术。这是通过算法的超参数空间的手动指定子集的详尽搜索。

随机搜索

第二种方法被认为更有效( Bergstra 和 Bengio,2012) [1],因为参数是随机选择的。随机搜索可以在连续和混合空间中使用,并且当只有少量超参数影响最终性能时非常有效。

这些方法怎么用?

笔记本

随机搜索

让我们从一个随机搜索开始。下面的代码显示了如何调用RandomizedSearchCV()。要估计的超参数存储在字典中。XGBoost 可以在训练期间考虑其他超参数,如早期停止和验证集。您可以用在fit()方法中传递的另一个字典来配置它们。

在接下来的代码中,我使用通过随机搜索获得的最佳参数(包含在变量best_params_)中)来初始化网格搜索的字典。

网格搜索

在下面的代码*、中,您将找到网格搜索*的配置。如前所示,交叉验证固定在 3 倍。

结论

关于 XGBoost 的超参数优化的这篇(小型)教程到此结束。但是这些方法可以被每一个机器学习算法利用。请记住,这些优化方法在计算方面是昂贵的(上面的第一个代码生成 3000 次运行)。

你现在可以在工作或比赛中使用它了。尽情享受吧!

参考

[1] 詹姆斯·伯格斯特拉和约舒阿·本吉奥,2012 年。随机搜索超参数优化,机器学习研究杂志 13(2012)281–305

[2]陈天琦和卡洛斯·盖斯特林,2016。【https://arxiv.org/pdf/1603.02754.pdf】XGBoost:一个可扩展的树增强系统,

客户一生的价值是什么?

原文:https://towardsdatascience.com/what-is-your-customers-worth-over-their-lifetime-dfae277fd166?source=collection_archive---------15-----------------------

使用 Python 估算非订阅环境下客户的终身价值(LTV ),以设计适当的保留策略并最大限度地减少客户流失

米歇尔·汉德森在 Unsplash 上的照片

在我之前在发表的一篇文章中,我们讨论了生存分析技术来预测我们的客户何时会流失,以及针对客户的策略来最小化客户流失。这是在一个合同设置中,其中“死亡”是客户终止或不续订他们的订阅。

在本帖中,我们将着眼于购买直到你死(BTYD)类的统计模型,以分析非订阅业务模型中客户的行为和购买模式,以建模和预测客户的终身价值(CLV 或 LTV)。

什么是客户 LTV?

客户的终身价值是指公司在整个客户关系中(无论是在单个客户层面、群体层面还是整个客户群层面)预期从客户那里获得的净收入或收入总额,使用现金流贴现法(DCF)将其贴现为当前的美元价值。

根据可用的数据,LTV 可以代表总收入或净收入,即收入减去成本。使用收入数字通常不太麻烦,因为客户级别的历史销售数字很容易获得。然而,计算特定于客户的成本可能需要某些假设,这就有点主观臆断了。

为什么是 LTV?

在非合同商业模式中,公司与其客户之间没有合同或订阅协议(例如,电子商务或零售),我们可以在任何给定交易后停止购买。或者我们可以在 12 个月后回来重复购买。因此,没有明确的二进制事件来识别特定客户是否仍然活着。这使得实际上不可能通过逻辑回归或决策树有效地预测作为二元事件的流失。

在没有合同协议的情况下,分析我们的客户的更好方法是预测我们可以预期我们的客户在未来与我们一起消费的货币价值,以及预测的客户流失概率——给定他们的历史购买模式和行为。

请注意这里的区别:我们不知道在观察结束日期,客户是否已经发生了变化。因此,我们不能训练算法来预测在模型训练期间我们不可用的数据点(流失)。相反,流失概率将通过基于购买历史的其他统计和概率方法来确定。

BTYD 模型介绍

我们将利用以下两个统计和概率模型:贝塔几何/负二项分布(BG/NBD)模型货币价值的伽马-伽马模型来分析历史客户购买行为数据和模式,并预测未来的购买频率和货币价值。这些模型已被经验证明优于传统方法,并遵循购买直到你死(BTYD)统计模型。

BG/NBD 模型预测预定义时期内的未来预期交易数量以及客户存活的概率。而 Gamma-Gamma 模型将结合到 BG/NBD 模型中,根据以预定贴现率贴现后的当前美元价值来预测购买的预期货币价值。

这两个模型都在 Python 的lifetimes包中实现。

模型假设

在基本层面上,上述两个模型依赖于以下假设:

  • 每个顾客有两个硬币:一个'购买硬币,决定其购买的概率,并由他连续投掷;以及决定退出且不再购买概率的“骰子硬币,每次购买后翻转一次
  • 当处于活动状态时,客户进行的交易数量遵循泊松过程,交易率用λ表示(一个时间间隔内的预期交易数量)。简单来说,泊松过程是一系列离散事件,其中事件之间的平均时间是已知的,但事件的确切时间是随机的。下一个事件的发生独立于前一个事件。因此,在我们的案例中,客户是否会重复购买与其历史购买行为无关。这似乎违反直觉(从同一家企业多次购买的客户通常会再次购买),但在实证研究中却得到了很好的支持。
  • 每个客户都有自己的购买硬币(有自己的正面和反面概率)
  • 类似于“购买”硬币,每个客户都有自己的“死亡”硬币,每次交易后都有特定的存活概率
  • 在每次交易后,顾客以概率p变得不活跃,即,在每次交易后,每个顾客将投掷第二个“骰子”硬币以确定他是否重复购买
  • 交易率λ和退出概率p在客户之间独立变化,分别遵循伽马和贝塔分布
  • 客户特定交易的货币价值围绕其平均交易价值随机变化
  • 不同客户的平均交易额各不相同,但任何特定个人的平均交易额不会随时间而变化
  • 平均交易值在客户中的分布与交易过程无关

数据要求

BG/NBD 和 Gamma-Gamma 模型在客户层面只需要以下数据点:

  • 最近度代表顾客最近一次购物的年龄。这等于客户第一次购买和最后一次购买之间的持续时间。因此,如果 X 女士只进行了一次购买,她的新近度将是 0。
  • 频率代表客户进行重复购买的周期数。这意味着它比客户购买的总周期数少 1。如果使用天数作为单位,那么频率就是客户第一次购买后购买的天数(或任何时间段)。如果顾客只购买了一次,他的频率将是 0。此外,频率不考虑同一时间单位内的多次购买。因此,如果 Y 先生在第 1 天购买了两次,在第 3 天购买了三次,那么尽管每天购买了多次,他的频率仍然是 1。
  • 时间表示无论选择什么时间单位,顾客的年龄。这等于客户第一次购买和研究期末之间的持续时间。
  • 货币价值代表给定客户的重复购买的平均值,即所有重复购买的总和除以重复购买的时间单位总数。货币价值可以是利润、收入或任何其他金额,只要它是为每个客户一致计算的。

我们可以通过lifetimes中一个叫做summary_data_from_transaction_data的便利实用函数,从以下交易级数据(通常在内部报告系统中可用)中提取上述四个所需的数据点:

  • 发票或交易日期
  • 发票或交易货币价值

BG/NBD 和 Gamma-Gamma 模型在运行

我们将在项目中使用公开的电子商务零售数据。该数据集包含近三年间从英国一家在线零售公司购买的所有商品,可从此处下载。

原始数据的格式如下:

数据预处理

接下来,我们将执行以下步骤,将原始数据转换为所需的格式:

  • InvoiceDate转换成日期时间格式,并从中提取日期值
  • 删除缺少Customer ID的行,因为我们的分析将在单个客户级别进行
  • Quantity字段中过滤出负值,因为这些值可能与客户退货有关,而与 LTV 预测无关
  • 为每张发票(Quantity x Price)的Sales新建一列,并过滤出lifetimes : Customer IDInvoiceDateSales所需要的这些列
  • 使用summary_data_from_transaction_data函数将我们的事务级数据转换成lifetimes所需的汇总形式

生成的数据将采用以下形式:

客户# 12608 只购买了 1 次(没有重复),因此根据模型定义,其频率和最近次数都是 0,并且其年龄是 405 天(即,在分析中第一次购买和期末之间的持续时间)。货币价值也是 0,因为它是所有重复购买的平均值,因此忽略了唯一的一次购买。

另一方面,顾客# 12745 总共购买了两次,因此:

  • frequency为 1,即 1 次重复购买
  • recency是两次购买之间的天数
  • T是首次购买和观察结束日期之间的天数
  • monetary_value是第二次购买的总价值,即唯一的重复购买。对于 1 次以上的重复购买,它将是所有重复购买的平均销售额

最后一个预处理步骤是排除我们没有重复购买的客户,即频率为 0。BG/NBD 和 Gamma-Gamma 模型都专注于对有重复交易的客户进行计算。如果我们考虑一下,对于一个只进行过一次历史购买的客户来说,用任何模型来预测未来交易的概率和货币价值都是相当具有挑战性的。否则,该模型将预测只有一次购买交易的客户仍然活着的概率为 100%,这是不现实的。

迄今完成的工作代码如下:

BG/NBD 模型培训和可视化

训练 BG/NBD 模型就像训练 scikit 中的任何其他 ML 算法一样——使用lifetimes.BetaGeoFitter()fit方法学习。

lifetimes有几个内置的效用函数来绘制和验证 BG/NBD 模型的内在假设:

  • lifetimes.plotting.plot_transaction_rate_heterogeneity绘制λ(顾客购买倾向)的估计伽玛分布。理想情况下,这应该反映一种异质分布,即不集中在一个单一的值
  • lifetimes.plotting.plot_dropout_rate_heterogeneity绘制p的估计贝塔分布,客户在交易后立即退出的概率(“骰子”)硬币。这也应该显示一种异质分布

尽管交易率在我们的数据中似乎是不均匀的,但退出概率的不均匀性较小,大多数值仅集中在小于 0.1 左右。一个潜在的原因可能是我们的数据中重复购买的客户数量较少——在更长的时间内收集更多的数据可能有利于我们的建模目的。然而,我们将继续我们的练习,看看它进展如何。

模型可视化

一旦 BG/NBD 模型经过训练,我们可以从以下图表中收集有用的见解:

频率/最近热度图

此热图显示了客户在下一个时间段可能进行的交易数量(默认值为 1,即第二天、第一周等。基于我们数据中的交易频率),给定模型参数:

我已经使用T = 7作为函数的参数来分析未来 7 天的预期购买次数。

直观上,我们可以看到,高频率(多次重复购买)和新近性(最近最后一次重复购买)的客户在未来有望购买更多。我们的最佳客户位于热图的右下角,其特征是重复购买次数超过或等于 175 次,最近一次购买是在他们超过 1000 天时。

简而言之:

  • 有多次重复购买(频率)和首次购买与最近一次购买之间有较长时间间隔(最近)的客户可能是未来的最佳客户
  • 多次重复购买(频率)但第一次和最近一次购买(最近)的时间间隔较短的客户可能永远不会再回来
  • 浅蓝色和绿色区域的客户很有兴趣,因为他们可能会回来购买,但我们仍然可以预计他们在接下来的七天内会购买大约 0.7 次。这些客户可能需要一点哄骗或推动才能回来购买更多

活动热图的概率

该热图显示了在给定模型参数的情况下,客户存活的概率:

无论客户是否经常购买,只要他们具有历史上较高的最近购买率(即,他们第一次购买和最近一次购买之间的时间间隔大于或等于 1000 天),其存活的可能性几乎为 1.0。

此外,新近度稍低的客户(即,最近一次购买是在他们第一次购买之后相对较短的时间段之后)即使没有进行大量的重复购买也具有较高的存活概率。

购买了大量商品但购买时间较短的客户很可能已经退出(右上象限)。

模型训练和可视化的代码如下:

英国天然气公司/NBD 模型验证

为了执行模型交叉验证,我们可以将事务数据划分为校准和维持数据集。然后,我们将使用维持数据集作为生产数据(在模型训练期间不可见),根据校准数据拟合新的血糖/NBD 模型,并比较维持期内重复购买的预测和实际数量。

在维持期内,实际重复购买次数和预测重复购买次数的平均值对比图揭示了以下情况:

在上面的图中:

  • x 轴代表在校准期间观察到的频率值
  • y 轴代表维持期的平均频率(蓝线)和模型预测的平均频率(橙线)

正如我们所见,在大约 15 次重复购买后,该模型可以非常准确地预测客户群的行为。对于更高的频率值,该模型确实产生了更多的误差,并且低估了平均重复购买量。如前所述,这很可能是因为我们的数据中有大量重复购买的客户数量相对较少。

英国天然气公司/NBD 模型验证代码:

伽马-伽马模型训练

现在,我们将根据我们的数据拟合 Gamma-Gamma 模型,根据每个客户的购买模式来计算他们未来可能的销售额。

没有比这更简单的了:

预测时间

现在我们已经训练好了两个模型,让我们在客户层面做一些预测。首先,我们将预测每位客户在未来 30 天(或您选择的任何其他天数)内的购买数量:

CustomerID 12748 预计将在接下来的 30 天内进行 56 次购买。

接下来,我们将计算客户存活的概率,并绘制其分布图:

分布图揭示了预期大多数客户有很高的存活可能性。在与业务和营销团队讨论之后,假设我们决定采用以下概率阈值来对客户进行分类:

  • 如果活着的概率小于 0.5
  • 如果存活的概率在 0.5 到 0.75 之间,则存在高流失风险
  • 否则不搅动

我们得到以下计数:

接下来,我们将使用我们训练好的 Gamma-Gamma 模型来预测未来 12 个月的平均未来交易价值和 LTV,假设月贴现率为 0.01%。根据预期的 LTV,我们的前 20 名客户是:

现在,我们已经有了每个客户的估计流失率、未来购买价值和 ltv,这些客户在历史上都曾在我们这里购买过一次以上。

预测代码:

结论

现在,尽管我们没有与最有价值和风险最大的客户签订合同,但我们已经对他们有了一些可操作的见解。

完整的 Jupyter 笔记本可以在 GitHub 这里获得。

一如既往,如果您想讨论任何与数据分析、机器学习、金融和信贷风险分析相关的问题,请随时联系 me 。

下次见,继续!

参考

[1]法德尔,P. S .,哈迪,B. G. S .和李,Ka。(2005).简单的方法“计算你的顾客”:帕累托/NBD 模型的替代方案。营销科学。24.275–284.10.1287/mksc

[2]法德尔,P. S .和哈迪,B. G. S. (2013 年)。货币价值的伽玛-伽玛模型。从这里检索

你的样本量是多少?伪复制的危险

原文:https://towardsdatascience.com/what-is-your-sample-size-the-dangers-of-pseudo-replication-c66cab14fc69?source=collection_archive---------46-----------------------

你的不确定性估计正确吗?

简单吧?在统计学入门课程中,样本量总是给定的。n = 1000。或者 n = 20。但在现实世界中,你得自己算出 n。

如果数据是平面的,那么 n 就是行数。简单。

但是现实世界的许多数据并不平坦。n 是什么?何谓爱情?狐狸说了什么?生命、宇宙、万物的意义是什么?这些都是让我夜不能寐的问题。

我们将从一个过于简单的例子开始。乍一看,问题“n 是什么?”听起来毫无用处,但是希望到最后你会发现这是一个普遍存在的实际商业问题。我们有一万行数据是很常见的,但是“样本大小”更接近于十。

“样本量”在不确定性的量化中起着直接的作用。一个点估计是不够的;什么是似是而非的数值范围?

平面数据

假设你想知道一所学校学生的平均身高。我是神谕,知道真实的平均身高是 167 cm,但你不知道。

你找到了 10 名志愿者,他们是正态分布人群中的代表性样本(嘿,我说想象一下)。你拿出卷尺,以厘米为单位记录下:

151 180 156 158 147 163 166 161 167 171

在这种情况下,很简单。n = 10,你可以在 162 附近建立一个 95%的置信区间(155,169)。167 在这个 CI 内。

在给定的设置下,95%的随机样本将产生包含 167 的 95% CI。

不平衡数据

你从折扣店买了你的卷尺,你被告知它被诅咒了:它提供的测量值稍微有些偏差,但平均来说是正确的。

未被描绘的:不可思议的恐怖。(来源)

它带有第二个卷尺,免费!第二个卷尺是也同样被诅咒。但是你可以选择颜色!

你选择黄色是因为你是个无趣的人。(来源)

当你宣布你将进行第二次测量时,一半的学生说他们上课会迟到并匆忙离开。您使用第二盘磁带记录了前五名学生的身高,所以现在您的数据看起来像

151 180 156 158 147 163 166 161 167 171

153 187 159 157 145

你有 10 个学生,但有 15 个测量值。这就是伪复制 —你收集了更多的数据,但是采样单位(学生)的数量不变。

你应该如何估计平均身高?如果你平均 15 次测量,那么有些学生会被重复计算。你的不确定性水平将会下降,因为你的观察不再独立。学生的三围取决于学生的真实身高。

正确的方法是取每个学生的平均测量值,这样你的数据看起来就像:

152 183.5 157.5 157.5 146 163 166 161 167 171

然后取平均值,得到 162.4 的估计值——可以说是平均值的平均值。(如果你没有为你的 A/B 测试这样做,你要么有一个 警告 问题,要么有一个更好更先进的方法。)但是如何建立置信区间呢?你更确定前五个值,但是我们要假装后五个值携带同样多的信息吗?

就此而言,n 是什么?模型的正确自由度是什么?我们无法回答这个问题(实际上,我们可以,但仅限于 iid 高斯误差),但最好假设 n=10,而不是 n=15。如果答案存在的话,我们希望它在 10 到 15 之间。我们稍后再讨论这个。

平衡数据

下课后,剩下的五个学生来找你进行第二次测量(嘿,他们是好人)。你疯狂地嘲笑你现在完整的数据集,你迫不及待地释放它的潜力来解开宇宙的秘密:

151 180 156 158 147 163 166 161 167 171

153 187 159 157 145 164 163 161 166 172

取所有观察值的平均值和标准差,构造 n = 20 的 95%置信区间,得到以 162.4 为中心的区间(157.6,167.1)。

图为:进行假设检验后的普通科学家。(来源)

然后闪电击中你,因为宇宙不想让这种错误的分析见天日。

怎么了?

假设您重复测量三次以上,并记录这些观察结果:

151 180 156 158 147 163 166 161 167 171

153 187 159 157 145 164 163 161 166 172

154 187 156 156 146 163 164 160 168 169

152 180 159 155 146 165 162 161 167 170

152 183 158 162 145 166 165 158 165 172

将这些视为 50 个独立的观察值(换句话说,忽略伪复制)将导致以 162.3 为中心的(159.4,165.1)的非常窄的 95% CI。167 的真正价值远在 CI 之外。

如果你对不同的学生重复这个设置,167 将会比期望的 5%的时间更多地位于区间之外。

问题是:你在观察同样的 10 个学生。为什么一遍又一遍地看到它们会让你更加确信人口意味着什么?如果这行得通,当人们可以多次盯着同一个东西看时,为什么还要花这么多钱来收集数据呢?

鉴于测量误差来自相同的正态分布(即误差为高斯分布,与学生的真实身高无关),正确的方法是取平均值的平均值:

152.4 183.4 157.6 157.6 145.8 164.2 164.0 160.2 166.6 170.8

因为我们只观察了 10 名学生,所以我们构造了 n = 10 的 95%置信区间,得到以 162.3 为中心的(154.9,169.7)。

事实上,数据很少是平衡的。即使你建立了一个最终目标是获得平衡数据的研究,参与者也可能会退出。

如果加粗的误差假设不合理(例如二进制结果),那么我们不能这样做,必须使用更复杂的模型:

贝叶斯机器学习来拯救!

在其核心,贝叶斯 ML 处理伪复制(虽然它也适用于平面数据)。

这听起来并不显著,直到您意识到绝大多数数据都遭受伪复制。企业有回头客,并(希望)从每个客户那里进行多次测量。研究可能希望随着时间的推移跟踪同一批人。

数据的层次结构

还记得我们如何将 15 个观察压缩成 n=10 个吗?你可以有十几家商店,每家都有数千名顾客,但是一旦有人提出一些问题(“促销的平均提升是多少?”),你实际上必须将 10,000 个观察值压缩成 n=12 个。要么这样,要么你必须假装你的从属观察是独立的。不太漂亮。

大多数流行的机器学习算法(xgboost、随机森林、GLM 等。)本身不处理伪复制。有两种可能的选择。可以在交叉验证中适当随机化折叠(来自同一个学生的观察永远不要去不同的折叠!)并希望结果可以一般化。或者,您可以汇总数据(例如,按学生计算测量值的平均值)并丢弃一些信息。

下面是我用来生成上述数据的 R 代码:

num_students <- 10
num_pseudoreps <- 5set.seed(12)
height <- rnorm(num_students, 167, 10)
meas <- matrix(0, nrow = num_pseudoreps, ncol = num_students)
for(i in 1:num_pseudoreps){
  meas[i,] <- round(height + rnorm(num_students, 0, 2))
}

为了得到类似频率主义者的估计,我将使用具有极弱/均匀先验的 MCMC 来拟合一个随机效应模型。在实践中,这些先验知识不应该在基本例子之外使用。

library(rstan)balanced <- data.frame(
  student = sort(rep(1:num_students, num_pseudoreps)),
  measured = as.numeric(meas)
)
unbalanced <- data.frame(
  student = c(1:10, 1:5),
  measured = c(meas[1,], meas[2, 1:5])
)model <- stan_model(model_code = '
  data {
    int<lower=0> N;
    int<lower=0> S;
    real y[N];
    int<lower=1, upper = S> students[N];
  }
  parameters {
    real mu; 
    vector[S] mu_s;
    real<lower=0> pop_sigma; 
    real<lower=0> meas_sigma;
  } 
  model {
    mu ~ normal(0, 10000);
    pop_sigma ~ uniform(0, 1000);
    meas_sigma ~ uniform(0, 1000);
    mu_s ~ normal(mu, pop_sigma);
    y ~ normal(mu_s[students], meas_sigma);
  }
')set.seed(1)
mcmc <- sampling(
  model,
  data = list(
    N = nrow(balanced),
    S = num_students,
    y = balanced$measured,
    students = balanced$student
  ),
  iter = 5000
)
posterior <- mcmc@sim$samples[[4]]$mu[1001:5000]

使用具有 50 个观察值的平衡数据,后验分布具有(154.2,170.2)的 95%可信区间和 162.3 的平均值。这比我们之前得到的 CI 略宽,部分是因为我们估计了一个额外的讨厌的参数:测量误差。

神奇发生在不平衡的情况下。95%可信区间是(154.4,170.0),我们不必猜测使用什么 n。在这个示例中,好处并不明显,因为我们正在使用忽略伪复制是最不有害的设置。

然而,当我们越来越远离舒适的:

*高斯分布(如二元结果、严重偏斜的人口分布)

不相关的参数(例如,忠诚客户可能会访问更多的和*花费更多)

*有些平衡的数据(例如,一些客户一周访问 100 次,而另一些客户只访问一次)

采用平均值会给出越来越差的结果。(查看我的 GLM 文章以了解精确加权平均值的细节。)

铁是羽加迪姆 leviosa。(来源

直觉上,这是因为平均值假装所有的抽样单位具有相等的权重,即使它们并不相等。

考虑到一些最普遍的指标是百分比(例如转化率)或极度右偏(例如平均支出),贝叶斯机器学习在每个组织中都有一席之地。

最后,如果你经常需要在工作中进行统计推断,可以考虑将贝叶斯机器学习作为你工具箱的核心部分。它们实际上是为解决真实数据中普遍存在的伪复制问题而设计的。

“清理”数据和“训练”机器学习算法意味着什么

原文:https://towardsdatascience.com/what-it-means-to-clean-data-and-train-machine-learning-algorithms-5ef2cabd2d76?source=collection_archive---------33-----------------------

奥利弗·黑尔在 Unsplash 上拍摄的照片

在计算机和人工智能的上下文中理解术语“干净”和“训练”

为了避免在人工智能项目上浪费大量的时间和金钱,经理们必须对数据是如何处理的有很强的理解。数据处理包括数据科学家采取行动,将肮脏的真实世界数据转化为干净、可理解的数据。只有当数据没有错误并且格式正确时,机器学习算法才能提供有效的结果和预测。正如生活中的许多事情一样,“垃圾进来等于垃圾出去。”

数据处理的一部分包括搜索异常值或不可能的数据点并检查它们。例如,数据集包括客户的出生日期。过滤此数据以检查超过 90 或 100 岁的出生日期可能会显示出生年份在 19 世纪的数据点。然后,数据科学家可以删除这些数据点以避免混淆模型。

数据处理的另一个重要部分是处理缺失值。数据集通常不完整,数据科学家必须决定删除包含缺失元素的整个条目,或者他们可以插入一个占位符(可能使用中间值或最频繁值)。如果数据科学家确定数据集中有太多缺失值,经理必须决定收集更多数据、继续处理当前数据还是终止项目是否划算。做出这一决定时,应充分了解收集或不收集的成本,以及新数据具有当前数据集所缺乏的完整性的可能性。

一旦经理与数据科学家沟通并确定数据质量令人满意,可以开始培训!这就是机器学习术语可能引起混淆的地方。数据科学家不是拿着秒表和哨子站在他的电脑旁,对着数据大喊让他跑得更快。相反,他们编写几行代码将数据集一分为二。一组称为“训练组”,另一组称为“测试组”。通常在训练集中使用 80%的数据,在测试集中使用 20%的数据。

正如人们可能认为的那样,训练模型发生在训练集上。这意味着算法在集合中的所有数据点上运行,并且它输出将用于预测或分类未来数据点的公式或方法。一旦数据科学家对输出结果感到满意,并对模型进行微调,就该对其进行测试了。

由于测试集中的数据点不同于定型集,测试将确定模型归纳新数据的能力。通过在测试集上运行新模型,数据科学家可以将训练集的实际输出值(或标签)与模型的预测输出值进行比较。当模型的输出与实际输出相比合理时,泛化误差低,并且模型对新数据反应良好。

由于泛化误差较高,该模型很好地学习了训练数据,但在实际生活中不会有用。该模型不能从表示训练集中没有的新情况的数据中提供有用的输出。为了避免训练具有高泛化错误的模型,数据科学家可以使用更复杂的拆分。他们可以运行一种算法,识别彼此最相似的数据点(在数据集中称为片段),并确保来自每个片段的相同数量的数据点在测试集和训练集中。这有助于确保两个数据集中的数据代表总体数据。

虽然上述大部分工作是由数据科学家承担的,但经理们可以通过理解数据处理和培训的高层次方面,为人工智能项目增加难以置信的价值。最终,经理是决策者,掌握数据对模型生产影响的高级专业知识有助于做出更好的决策。

关联需要什么

原文:https://towardsdatascience.com/what-it-takes-to-be-correlated-ce41ad0d8d7f?source=collection_archive---------9-----------------------

以及在我们的分析中如何解释它

舒伊布·阿卜尔哈萨尼在 Unsplash 上拍摄的照片

相关性(确切地说是统计学上的相关性)是对两个变量之间相互关系的一种度量,不管它们是不是因果关系。这种程度的测量可以在任何类型的数据上进行(连续的和连续的,分类的和分类的,连续的和分类的)。尽管相关性说明了它是如何衡量相互关系的,但相关性度量的存在并不能为因果关系提供有力的证据。这意味着相关性并不意味着因果关系。那么相关性是如何有用的呢?

相关性是有用的,因为它可以表明实践中可以利用的预测关系。例如,一天中温度越高,卖冰淇淋的次数越多。这也可能意味着因果关系,因为当天气较热时,人们倾向于购买冰淇淋,而当天气较冷时。然而,就像我之前陈述的那样;大多数时候,相关性并不意味着任何因果关系。

在我们进入相关性和它如何计算之前,让我展示一下协方差的概念。

协方差

在统计学中,协方差是变量 X 和 y 之间关联的度量,确切地说,它度量的是变量的线性关系趋势。这里我将展示协方差是如何计算的。

协方差的计算方法是将变量的每个成员减去其平均值(以数据为中心)。将这些居中的分数相乘,以测量一个变量的增加或减少是否与另一个变量相关联。最后,计算这些居中分数的期望值( E )作为关联的汇总。另一项中的期望值本身就是平均值或均值( μ)

协方差的问题在于,X 和 Y 可以取各自范围内的任何值。这模糊了解释过程,并且使得相互之间的协方差比较变得不可能。例如, Cov ( XY ) = 7 和 Cov ( AB ) = 5 会告诉我们这些对分别是正相关的,但是很难判断 XY 之间的关系是否强于 AB 这就是相关性变得有用的地方-通过数据中的可变性测量来标准化协方差,它将产生具有直观解释和一致尺度的产品。

现在,让我们完成第一个关联。

皮尔逊相关系数

皮尔逊相关是数据分析过程中最常用的相关之一。皮尔逊相关度量变量连续 X 和变量连续 Y 之间的线性关系,其值介于 1 和-1 之间。换句话说,皮尔逊相关系数通过一条线来衡量两个变量之间的关系。

让我们看看皮尔逊相关系数是如何计算的。

如果你注意到,分数方程的上边(分子)类似于我们之前讨论的协方差方程。这意味着我们也可以将皮尔逊相关系数表述如下。

上面的等式表明协方差除以 X 标准偏差(σX)和 Y 标准偏差(σY)的乘积。标准差的除法过程是为了标准化我们的数据,并确保相关值落在 11 的范围内。这简化了我们的相关性解释。那么,我们如何解释皮尔逊相关性呢?

当相关系数**接近值 1** 时,意味着变量 X 和 y 之间存在**正关系**,正关系表示一个变量的增加与另一个变量的增加相关。另一方面,**相关系数越接近-1** 就意味着存在一种**负相关关系**,即一个变量的增加会导致另一个变量的减少。**如果 *X* 和 *Y* 是独立的**,那么**相关系数接近于 0** ,尽管即使两个变量之间有很强的关系,皮尔逊相关也可能很小。

如果你从上面的解释中意识到,实际上皮尔逊相关系数和回归线的斜率之间有明显的联系。首先,让我展示一个带有回归线的散点图的例子。

在上图中,回归线是最佳的,因为它使所有点到回归线的距离最小。由于这一特性, YX 的回归线的斜率在数学上等价于 X 和 *Y、*之间的相关性,通过它们的标准偏差来标准化。

换句话说,皮尔逊相关系数反映了两个变量之间的关联性和可变性。这一特性也意味着皮尔逊相关易受异常值的影响。

这种与直线斜率的关系说明了为什么皮尔逊相关性描述了线性关系,以及为什么相关性在预测建模中很重要。

如果我们想测量变量之间的非线性关系呢?接下来我会展示一些其他的测量方法来描述这种非线性关系。

斯皮尔曼等级相关

与皮尔逊相关系数不同,斯皮尔曼等级相关测量两个变量之间的单调关系(严格地增加或减少,而不是两者都增加),并通过值的等级顺序来测量。尽管 Spearman 秩相关法仍然适用于离散的顺序变量,但仍然可以测量连续变量 X 和连续变量 Y 之间的相关性。

这里我们根据数据等级而不是分数来计算 Spearman 等级相关性。这意味着我们计算数据秩和秩标准差之间的协方差。如果所有的秩是唯一的或者秩之间没有联系,我们可以将等式简化如下。

其中 n 是观察次数,d 是秩差。这个公式只有在没有领带的情况下才严格使用。

Spearman 等级相关可以类似地解释为 Pearson 相关系数,因为它们的值在-1 到 1 之间。**得分越接近 1** 意味着变量之间存在**正单调关系**(数据不断增加),反之亦然。如果**变量 X 和变量 Y 独立**,则值将为**等于 0** 。

当我们谈论等级时,等级到底是什么?下面是我从维基百科上获得的一个排名过程的例子。

更容易理解排名的方法是,我们将数据从最小到最大排序,并根据数据顺序分配排名。1 是最小的等级,这意味着等级 1 被分配给相应列的最小值。为什么是各自的专栏?从上表中我们可以看出,我们根据各自的列对数据进行排序,因为我们想知道列 X 和列 Y 的排序之间的协方差;我们给每一列分配等级。准确的说,我们要的是每行之间的排名差。

皮尔逊和斯皮尔曼相关性之间的差异在下图中得到最好的说明。

皮尔逊相关与斯皮尔曼等级相关

因为我们的上述数据显示了完美的正单调关系(数据总是增加)和非线性关系;我们的 Spearman 相关等于 1。在这种情况下,皮尔逊关系较弱,但仍然显示出很强的相关性,因为数据之间存在部分线性关系。

肯德尔τ秩相关

另一种测量变量之间非线性关系的方法是应用肯德尔的 Tau 等级相关性。Kendall Tau 等级相关系数衡量给予同一组对象的两组等级之间的相似程度。然而,与 Spearman 系数不同,Kendall Tau 只测量方向一致性,而不测量等级差异。因此,这个系数更适合于离散数据。下面是我们如何测量肯德尔τ相关性。

其中和谐对是等级一致的值对(( x 1, y 1),( x 2,y2)):x1<x2 和 y 1 < *y* 2 或 *x* 1 > *x* 2 和不和谐对是不遵循这些的等级对

从上面的等式中,我们可以看出,测量值取决于物体对的反转次数。为了评估它们,每个等级顺序由所有对象对的集合来表示(例如,[a,b]和[b,a]是表示对象 a 和 b 的两对)。让我们使用一个样本数据集来衡量我们的相关性。

数据集示例

上面是一个样本数据集,在各自的列中有排名。我们需要根据之前的规则来计算一致对和不一致对的数量。(1,2)和(2,7)是 1 <2 and 2<7 while (1,2) and (4,1) are discordant pairs because 1 < 4 but 2 > 1 的整合对。如果是我们的数据集示例,对应对是:

  • (1,2)和(2,7)
  • (1,2)和(3,5)

不和谐的一对是:

  • (1,2)和(4,1)
  • (2,7)和(3,5)
  • (2,7)和(4,1)
  • (3.5)和(4.1)

这意味着我们有 2 个一致对和 4 个不一致对。使用前面的等式 2–4/(4(4–1)/2)将得到-0.33。

Kendall Tau 将取 1 到+1 之间的值,其中**值越接近 1** 表示当**一个等级顺序与另一个等级顺序完全相反**和**时,值越接近+1 表示两个等级顺序相同**。Kendall Tau 相关性也可以解释为处于相同顺序(一致)的对象的概率与处于不同顺序(不一致)的观察之间的概率差。

肯德尔τ适用于我们想知道变量的顺序是否相似的情况;尤其是如果我们的数据是离散的。然而,还有其他方法来测量离散变量相关性( Shaked Zychlinski 已经写了一篇关于它的很好的文章这里但是我想更详细地阐述它)

克莱姆的 V 型

克莱姆 V 是两个离散变量之间关联的度量。测量基于皮尔逊卡方统计,输出范围在 0 到 1 之间;值越接近 0 表示两个变量之间的关联越少1 表示两个变量之间的关联越强。没有负(-)值作为输出,因为不存在负关联。克莱姆的 V 计算是用下面的公式计算的。

其中,χ是卡方统计量,n 是观察值的数量,k 是列数,r 是行数。

因为 Cramer 的 V 过高估计了关联强度(卡方统计值倾向于随着行和列的数量之间的差异的增加而增加),我们需要纠正偏差。这是通过下面的等式完成的。

在哪里

数据集示例

幸运的是,python 中的 scipy 和 pandas 模块为我们提供了一种计算所有数字的简单方法。在我的例子中,我将使用 seaborn 的 tips 样本数据集。

#Importing the important module
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns#Load the dataset
tips = sns.load_dataset('tips')#Creating new category based on the tip feature (0: tip below 3 and 1 tip equal or more than 3)tips['tip_category'] = tips['tip'].apply(lambda x: 1 if x>3 else 0)

假设我们想知道 total_bill 和 tip 特性之间的关系。用熊猫的方法。corr,我们可以在几秒钟内测量我们的相关性。熊猫。corr 方法只提供 3 种相关度量;皮尔森,斯皮尔曼和肯德尔。

#Using the .corr method from pandas, default is Pearson Corellation 
tips[['total_bill', 'tip']].corr()

total_bill 与小费变量之间的皮尔逊相关系数

tips['total_bill', 'tip']].corr('spearman')

total_bill 与小费变量之间的 Spearman 等级相关性

如果我们需要相关结果作为统计假设测试,我们可以使用 scipy 模块中的函数来计算。

from scipy.stats import pearsonr, spearmanrpearsonr(tips['total_bill'], tips['tip'])
#Output: (0.6757341092113647, 6.6924706468630016e-34)spearmanr(tips['total_bill'], tips['tip'])
#Output: SpearmanrResult(correlation=0.6789681219001009, pvalue=2.501158440923619e-34)#Where the first number represent the Correlation Coefficient and #the second number represent the p-value.

在相关分析中,我们可以检验变量之间是否存在关系的统计假设。正式的说法是:

  • H0:变量 X 和变量 Y 之间没有统计学上的显著关系
  • H1:变量 X 和变量 Y 之间有一种统计上的显著关系

就像任何其他假设检验一样,我们基于 p 值评估我们的假设。通常,我们将 alpha 水平设置为 95%,这意味着如果 p 值低于 0.05,那么我们拒绝 H0,接受 H1。在这种情况下,H0 是相似的,如果我们说变量 X 和变量 Y 是独立的。

我们也可以用类似于上面的方法计算肯德尔τ相关性。如前所述,Kendall Tau 相关性更适合应用于离散变量,为此,我举一个大小和 tip_category 之间关系的例子。

tips[['size', 'tip_category']].corr('kendall')

Kendall Tau 尺寸和小费之间的相关性 _ 类别

from scipy.stats import kendalltaukendalltau(tips['size'], tips['tip_category'])
#Output: KendalltauResult(correlation=0.3528363722264162, pvalue=6.456364135002584e-09)

计算克莱姆的 V 需要一个额外的模块,校正偏差版本需要我们自己定义。对于未校正的版本,我们可以使用 researchpy 模块来帮助计算我们的 Cramer's V。让我们将其应用于性别和大小变量之间的关系。

pip install researchpy #only if you never have this module beforefrom researchpy import crosstab
cross, res = crosstab(tips['sex'], tips['size'], test = 'chi-square')
res

使用 researchpy,我们可以获得关于统计测试和相关性分析的信息。尽管如我之前所说,它还没有修正,这意味着它高估了关联强度。出于这个原因,我会使用之前由 Shaked Zychlinski 定义的偏差校正的 Cramer V 函数。

def cramers_v(x, y):
    import scipy.stats as ss
    confusion_matrix = pd.crosstab(x,y)
    chi2 = ss.chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum().sum()
    phi2 = chi2/n
    r,k = confusion_matrix.shape
    phi2corr = max(0, phi2-((k-1)*(r-1))/(n-1))
    rcorr = r-((r-1)**2)/(n-1)
    kcorr = k-((k-1)**2)/(n-1)
    return np.sqrt(phi2corr/min((kcorr-1),(rcorr-1)))cramers_v(tips['sex'], tips['size'])
#output: 0.058202656344848294

正如我们在上面看到的,修正和未修正版本之间的关联强度是不同的。

结论

我已经展示了几种测量变量之间关系的方法,以及我们如何解释这种测量。

得出相关值之间存在因果关系的结论是很诱人的,但正如许多人以前说过的那样,“相关性并不意味着因果关系”。事情可能不像数字显示的那样简单。在我们得出任何结论之前,我们需要批判性思维来剖析我们从这种相关性中获得的信息。

如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。

如果您没有订阅为中等会员,请考虑通过我的推荐订阅。

部署一个模型需要什么

原文:https://towardsdatascience.com/what-it-takes-to-deploy-a-model-30864cd9477f?source=collection_archive---------24-----------------------

将机器学习模型投入生产时的基本步骤和最佳实践

图片由 Pixabay 的 Mudassar Iqbal 提供

所以你(或你的团队)花了几个月的时间在笔记本上摆弄代码。您已经失眠了,不知道是否应该使用 Word2Vec 或 BERT 来矢量化您的文本输入。你已经在几十个(不,几百个?真的,几千?)连续几天,你终于达到了你想要的那种甜美的准确度。这种满足感就是你从事数据科学工作的原因。你手里拿着宝贵的 model.pickle 文件。你知道你的公司会通过使用它获得大量的金钱,但是你可能没有意识到这是最容易失败的时刻。不幸的是,许多模型无法投入生产。例如,2009 年 4 月,网飞组织了一场奖金为 100 万美元的 Kaggle 竞赛,但获胜的模型从未投入生产![1].所有这些工作和准确性只有在一天结束时有人能够真正使用该模型时才会有回报——稳定、可靠、快速和大规模地产生价值。

那么,实际部署一个模型需要什么呢?下面是一个部署路径的一些基本步骤和注意事项,当您的模型从研发转换到生产时,请记住这些步骤和注意事项。

1.将您的模型包装在 Web 服务器中

当然,许多人使用手动部署选项。每当需要做出新的预测时,您的队友可以手动运行该模型。但是这种方法很可能无法满足您的业务需求。作为自动化的第一步,您可以创建一个简短的脚本来加载您的模型并对新数据进行评分,但是每次您需要预测时,您都会浪费时间来加载和重新加载您的模型,这可能不是一个微不足道的损失。

这个挑战的一个解决方案是用一个简单的 web 服务器来包装您的模型。web 服务器会将您的模型加载到内存中,并能够以较低的延迟立即提供预测。对于大多数语言来说,有很多关于如何编写 web 服务器的教程。

想得更远一些,您还应该问自己:这个服务器会一直只托管一个模型吗?或者以后,您需要一起托管多个模型吗?

2.改进您的 Web 服务器

现在你有了一个 web 服务器,你必须问自己如果它崩溃了会发生什么?您的模型有望为高影响力的业务流程提供动力,并且为不同事件建立应急计划至关重要。可能会发生运行时异常。您可能在某个地方有内存泄漏,这导致您的预测评分过程最终在内存耗尽时被终止。您不希望晚上在紧急情况下醒来重新启动它,所以最好提前考虑并围绕您部署的单独运行的模型开发流程管理。它将处理自动重启,并提供报告机制来传达服务的实时状态。

3.托管您的 Web 服务器

既然您已经有了本地运行的模型,并且运行稳定,那么您需要向世界公开它。您的公司是在裸机上托管软件,还是依赖某个云提供商?在任何情况下,您都需要将您的服务器托管在某个地方。您关于托管的决定应该取决于模型的公共可用性。您的模型是公开提供给客户,还是仅在您的内部网络中提供?如果模型是公开可用的,您需要为 web 服务器建立一个授权机制,以限制恶意用户的访问。

任何软件都需要更新,所以一旦你的网络服务器被托管在某个地方,你需要一些更新它的过程。当更改完成后,您需要测试服务是否继续工作。为了实现这一点并确保您团队的生产力,您应该建立某种形式的持续集成/持续交付管道。

4.高可用性服务

高可用性 ( HA )是衡量系统运行性能水平的一个特征。它通常以正常运行时间的百分比来衡量。“两个 9”或 99%的正常运行时间意味着您的服务在一年中有 88 小时不可用。问问你自己:如果你的模型宕机 88 小时,会对你的业务造成多大影响?

大多数 web 服务在 HA 上提供服务级别协议。但是,即使达到三个 9(99.9%)的正常运行时间也非常困难。您的 web 服务器的主机可能会关闭。托管它的数据中心可能会停电。高可用性的基础之一是消除单点故障[2]。要做到这一点,您需要拥有模型的多个副本,并在它们之间保持平衡。请记住,在地理上分散它们将减少失败的数量。为了能够适应不断变化的负载并优化托管成本,能够扩大和减少副本的数量非常重要。

5.监视

即使采取了前面所有的步骤,仍有可能出错。也许您的服务器的所有节点都关闭了,或者您的测试管道没有发现一个 bug。为了能够对这种紧急情况做出反应,您需要对您的服务进行监控和警报。收集服务日志将有助于在此类问题发生后发现其根本原因。

为了使您的服务更新建立在科学决策的基础上,您需要收集关于您的服务当前如何运行的数据。你不应该说你的模式“慢”;相反,您应该精确,并根据响应时间的中间值或其他重要的百分位数进行操作。你不应该说你的服务“太失败了”;相反,您应该有准确的失败请求百分比作为基准。

6.更多监控?!

但是仅仅监控服务对于我们的用例来说是不够的。一旦你将一个模型投入生产,它就开始退化。大多数情况下,这与您的模型预测的数据漂移有关。为了在一段时间内提供准确的预测,您需要监控模型的性能。最流行的技术包括监控模型的输入变量、预测和准确性。想象一个使用美元价格作为输入的模型,假设由于一个错误,发送了乌克兰格里夫纳的价格。该模型将照常处理请求,因为它仍然是一个数字特性,但是您的预测将非常不同,因为该数字现在大了 30 倍。

您需要设置明确的阈值,以确定模型何时发生漂移,并在模型预测准确度较低时发出警报。这些通知与关于服务健康的通知一样重要。

7.再训练

一旦您清楚地知道您的模型预测不佳,您就需要用更多的最新数据来更新您的模型。我们之前提到的 CI/CD 管道可以方便地持续更新您的模型。为了重新训练模型,您将需要更新的、最近的标记的数据,因此您还需要一个过程来收集新的标记数据。小心不要注入过多的历史数据,因为如果最近的数据与历史数据相差太大,模型的效果可能会更差。您可以将最近的数据优先于历史数据。

另一个有趣的方面是,对于全新的数据,不同的 ML 算法可能会执行得更好。你应该不时地考虑不只是重新训练相同的算法,而是用其他算法进行实验。或者你可以更进一步,每次更新时,试着自动适应不同的型号并选择最好的型号。

现在,我们已经从一种模式转变为一种可持续的服务。虽然这并没有涵盖所有内容,但我希望它能为您提供基本需求和最佳实践的全面概述。

参考资料:

[1]迈克·马斯尼克(Mike Masnick),为什么网飞从未实现赢得网飞 100 万美元挑战赛(2012)的算法,tech dirt:https://www . tech dirt . com/articles/2012 04 09/03412518422/Why-网飞-Never-Implemented-Algorithm-That-Won-网飞-100 万-challenge.shtml

[2]布雷克·索恩(Blake Thorne),四个九及更高:高可用性基础设施指南(2018),Atlassian 博客:【https://www.atlassian.com/blog/statuspage/high-availability

[3] Alexandre Gonfalonieri,为什么机器学习模型在生产中退化(2019),走向数据科学:

https://towards data science . com/why-machine-learning-models-degrade-in-production-d0f 2108 e 9214

我从机器学习的 CI/CD 中学到了什么

原文:https://towardsdatascience.com/what-ive-learned-about-ci-cd-for-machine-learning-bc9504de6191?source=collection_archive---------72-----------------------

了解为什么经常重新训练机器学习模型是必要的,以及如何为文本分类模型建立 CI/CD 管道

用模型给出的概率分布度量概念漂移。

大多数软件开发团队已经采用持续集成和交付(CI/CD)来更快地迭代。然而,机器学习模型不仅依赖于代码,还依赖于数据和超参数。在生产中发布新的机器学习模型比传统的软件开发更复杂。

机器学习工程师还在讨论机器学习中的 CI/CD 实际上是什么意思,使用哪些工具。大多数机器学习团队使用几种工具来拼接他们自己的流程,以发布一个新模型——更新每月发布一次,每天发布一次——这不是最佳方式。

在之前的一篇文章中,我在 400 万篇 Reddit 帖子上训练了一个机器学习模型,将一篇帖子分类到一个子编辑中。一个月后,我注意到 Reddit 上的主题发生了变化,我需要收集新的数据来重新训练模型。在本文中,我将介绍发布新版本的步骤,描述如何为这类项目构建 CI/CD 管道,以及为什么在机器学习中经常重新训练模型是必不可少的。

出现了持续集成的需求

为了收集 5k 个最受欢迎的子编辑的 1k 个最新帖子,我创建了两个使用 Python Reddit API 包装器的 CLI。我将数据存储在 SQLite 数据库中。

之前,我用 fastText 训练了一个文本分类器,并在测试分割中报告了 0.4 的 f1 分数和 0.6 的召回率。这意味着大约三分之二的情况下,前五个预测包括人类在测试数据集上选择的子集合。

从数据工件、执行和 API 端点之间的依赖关系生成的端到端 ML 管道。

测试分割的性能可能不代表新数据的性能,这有几个原因。例如,预计用户在某些子编辑上发布的主题会随着时间而变化。在机器学习中,这被称为概念漂移,为了避免概念漂移,人们需要定期重新训练并发布新版本的模型。

概念漂移是指目标变量的统计特性随时间以不可预见的方式发生变化。 百科

为机器学习模型收集用户反馈

为了收集用户反馈,我将模型部署为一个 API, Valohai 团队制作了一个 UI 来与模型交互。我在黑客新闻上分享了 UI。

下面你可以比较测试数据和 8k 用户提交的 p@1(模型给出的第一次预测正确的概率)的分布。

测试数据的平均 p@1 为 0.549,用户提交的平均 p @ 1 为 0.531。我很惊讶地看到概率如此接近,这意味着模型达到了类似的确定性水平。如果这些值太远,这意味着模型是根据不代表实际使用的数据训练的。

之前的文章中,我报道了 f1-分数与 p@1 正相关但稍有滞后。因此,当标签未知时,模型给出的概率可用作估计 f1 分数的代理。下面,0.55 的 p@1 对应于 0.4 的 f1 分数。

重要的是,不要仅仅依靠定量测试来建立对机器学习模型的信心。对黑客新闻的评论大多是正面的,但也提出了一些模型不起作用的案例。很少有人报告说它对一些子街道不起作用。在大多数情况下,模型没有在这些子街道上训练,因为它们不是最流行的子街道的一部分。这很难定量衡量,但知道这一点很重要。

尝试使用搜索词“爱尔兰软件开发人员”来查找/r/DevelEire。运气不好,但如果查询是“爱尔兰软件开发商 Reddit”,谷歌会把它作为第一个结果。 黑客新闻讨论

也有评论建议采用更复杂的模型。

改进的一个地方是使用更好的单词嵌入集。FastText 确实很快,但它不再靠近 SOTA。您最有可能使用简单的平均池,这就是为什么许多用户得到的结果看起来不对。尝试一种分块方法,为文档的每个块获取一个向量,并将这些向量水平连接在一起(如果向量是 50d,每个文档做 5 个块,那么无论文档有多长,每个文档都有一个 250d 的固定向量)。这部分解决了高度稀释的载体的问题,这是一些用户报告的不良结果的原因。你也可以做“专注池”,像变压器头一样进行池操作——尽管这是一个 O(N)操作,所以 YMMV。 黑客新闻讨论

在这一点上,我可以构建一个可能执行得更好的更复杂的模型,或者简单地收集更多的数据。更多的数据往往比更好的模型对性能有更大的影响。在生产机器学习中,避免复杂性是能够快速迭代并降低维护模型成本的关键。

从长期来看,还有第三种方法可以改进模型,即构建一个持续的集成和交付管道,定期用新数据重新训练模型,以便性能不会随着时间的推移而下降。

测量概念漂移

为了衡量概念漂移,我在训练第一个模型一个月后收集了最新的 Reddit 提交内容。

我导出了旧的子数据的新提交,并比较了测试和新数据之间的 f1 分数。有了 Valohai,我可以运行版本控制的执行,并在一个界面上比较它们。当在团队中工作时,这避免了陷入一个团队成员在本地运行一个实验并报告不同结果的情况。但是你忽略了哪些数据集、代码和参数。在一个团队中,如果没有版本控制,就像没有发生一样。

比较执行#56 和执行#81,我看到召回从 0.40 下降到 0.25 。该模型在新数据上表现不佳。该模型知道它,因为它也可以在新数据的 p@1 的分布上看到。

用模型给出的概率分布度量概念漂移。

在对执行#69 中的新数据进行再训练之后,新模型对新测试数据实现了类似的 0.40 召回率。新模型在额外的 700 个子数据集上进行训练,使其对最终用户更有用。

实际上,当我将数据随机分为训练、验证和测试时,模型在新数据上的性能低于 0.4。按时间顺序划分更好,在旧数据上训练,在最新数据上测试。正如 Szilard Pafka 在 Twitter 上指出的:

您应该在时间有序的测试集上测量准确性。这种“实际”准确度通常会低于通过标准交叉验证获得的准确度。不要欺骗自己,当您在生产中部署您的模型并开始在真正新的数据上使用它时,时间间隔的准确性将是您实际获得的准确性。

我当然被愚弄了,但我要补充的是,当在生产中进行机器学习时,获得更好的理论准确性并不是你的最终目标。重要的是使用相同的指标来比较每个版本控制的实验。

最后,由你的企业和终端用户来决定你的机器学习模型是否有用。如果 Reddit 部署了这样的模型,那么该模型的有用性可以通过选择该模型建议的子编辑的用户百分比来衡量。

机器学习的持续集成

机器学习中的持续集成意味着每次你更新代码或数据,你的机器学习管道就会重新运行。集成是在发布新模型以验证最新数据和代码之前完成的。我还没有为这个项目设置它,但这是我打算如何与瓦罗海这样做。

Valohai 附带了一个开放的 API,当推送新代码时,我可以用它来触发机器学习执行和管道。例如,我可以定义一个 Github 动作来触发每次提交的 Valohai 执行。我还可以创建特定的规则,只触发特定提交的执行,并根据机器学习存储库中修改的代码决定运行哪个执行。如果您的数据不断更新,您可能只想定期重新训练模型。

您可以使用 p@1 之类的代理来测量概念漂移,并在出现重大性能损失之前发布新版本。还可以使用 Github actions 定期调度工作流,使用最新数据在 Valohai 上运行机器学习管道。

机器学习模型验证

大多数机器学习团队不会在没有一些人工验证的情况下部署到生产中。例如,比较生产模型和新候选模型的不同报告。

要建立对新模型的信心,您可以将它应用于所有历史数据并比较预测。结果不应该完全不同。然后,您可以检查性能发生显著变化的数据片

对于 subreddit 分类器,我比较了每个标签的性能。下面,你可以看到当我使用旧模型和最新数据时,关于政治的子主题的 f1 分数显著下降。

f1-score_diff 是将旧模型应用于新数据时的 f1 值= diff(数据 2,数据 1)

用新数据重新训练模型后,我注意到性能损失较小,r/ukpolitics 略有改善。还有两个新的分支:中立政治和温和政治。

总体而言,f1-score_change 分布遵循 0 附近的正态分布。大多数子记录的性能变化在-20%到+20%之间。新模型仍然是准确的,更有用的,因为它是在更多的子数据集上训练的。我现在有信心发布机器学习模型的新版本。

机器学习的连续交付

理想情况下,您可以首先将您的模型部署到您的临时环境中,并让它运行几天。您还可以通过 canary 版本向一部分用户软发布您的新模型。

Valohai 帮助您为您的机器学习 API 创建不同的版本,并在必要时轻松回滚。将一个新模型作为 API 端点发布就像用一个执行生成的模型工件创建一个新版本一样简单。在测试了新版本之后,您只需要更改生产版本的别名。

为了发布新版本,我将别名从“生产→ 20200331.0”更改为“生产→ 20200602.0”

结论

当数据属性改变以克服概念漂移时,重新训练机器学习模型是重要的。为了最终在机器学习中实现 CI/CD,你可以从自动化你当前过程的某些部分开始。

首先,它有助于为每个机器学习执行版本化数据、代码和参数,并将结果附加到您的拉取请求。然后,您可以使用 Valohai 创建端到端的机器学习管道,当代码和数据发生变化时,外部会触发这些管道。最后,您可以创建使用最新数据运行的参数化报表。

Valohai 已经为机器学习执行、数据、管道和 API 部署提供了版本控制,简化了生产中新模型的集成和部署。Valohai 包括托管的 Jupyter 笔记本电脑,以对您的所有机器学习代码进行版本控制,并轻松地使笔记本电脑实验成为公司范围内生产流水线的一部分。

资源

  • Github 上的机器学习流水线代码
  • 与模型交互的子编辑查找器用户界面

最初发表于T5【https://blog.valohai.com】

连续 15 天使用 Vim 后,我学到了什么

原文:https://towardsdatascience.com/what-ive-learned-after-using-vim-15-days-straight-ceda7e773a6d?source=collection_archive---------25-----------------------

学习和生活课程

从 Vim noob 到业余爱好者的旅程

发推文强调 Vim 挑战的模因/笑话

Vim 是什么?

Vim 代表VisualImproven,一个最初为 Unix 创建的编辑器。

为什么使用 Vim?

很厉害

您可以非常快速地进行复杂的编辑。查看我的 surround.vim 帖子来感受一下它的威力。

[## 我是如何学会享受活力的

刻意的练习和环绕。vim 让我爱上了 Vim

towardsdatascience.com](/how-i-learned-to-enjoy-vim-e310e53e8d56)

符合人体工程学。

如果您知道如何触摸键入,使用 Vim 意味着您可以将手放在主行键上,而不必不断地将手移到箭头键、触控板或鼠标上。

到处都是。

它安装在几乎每个系统上,而其他编辑器如 Emacs 和 Nano 可能不可用。它是跨平台的(适用于 Windows、macOS 和 Linux)。大多数系统中的默认编辑器是 Vim,因此至少知道如何使用它进行基本编辑,以及最重要的是如何退出 Vim ( Escape :q! then Enter)是很有用的。

如今,即使是笔记应用程序也可以让你使用 Vim。一款相对较新、非常流行且功能强大的笔记应用 Obsidian 使用 Vim 绑定:

[## 使用这个免费的笔记应用程序做更好的笔记,它将成为你的第二大脑

黑曜石使连接想法变得容易,帮助你更好地思考和写作

medium.com](https://medium.com/@ausius/take-better-notes-with-this-free-note-taking-app-that-wants-to-be-your-second-brain-1a97909a677b) [## 如何记笔记:来自人工智能、神经科学、社会学家和免费应用程序的见解

帮助您更好地记笔记和思考的见解和工具

medium.com](https://medium.com/@ausius/how-to-take-notes-insights-from-ai-neuroscience-a-sociologist-and-a-free-app-34b4be63080a)

我为什么想学 Vim?

FOMO 或 f 耳朵 o f m 丢失 o ut

虽然许多人从来没有“了解”Vim,但是许多开发人员和程序员使用它,并且非常信赖它。Vim 用户是否知道一些非用户不知道的事情?我想给 Vim 一个机会,这样我就能理解为什么它如此两极分化,并看看 Vim 是否也会在我身上生长。

Vim 是最受欢迎的开发环境之一( Stack Overflow 2019 调查)

我想挑战自己,提高我的工作效率。

我喜欢学习新的想法和生产力工具,并且我总是试图在学习方面做得更好。我认为学习 Vim 为实施和测试有效的学习策略提供了一个很好的机会。

[## 2 元学习原则帮助你更有效地学习

高效获取知识和技能

medium.com](https://medium.com/@ausius/2-meta-learning-principles-to-help-you-learn-more-efficiently-44061c9951e1)

我想说服自己,我不是一只老狗。

我弹钢琴和打字已经快三十年了(分别从 5 岁和 7 岁开始)。学习 Vim 感觉真的很像学习如何弹钢琴和触摸打字——它包括学习新的手部动作和运动。

但是,当我大脑中的神经连接仍然具有高度可塑性时,我就获得了钢琴和打字技能;小时候,我的大脑就像一块海绵,急切地等待着吸收它遇到的一切。

我是不是变成了一只学不会新把戏的老狗?我不(想)相信那件事。我想证明自己是错的。我想说服自己,我仍然可以快速学习新技能。我想知道我还能重新连接我大脑中的神经通路。

我的学习计划

我没有制定或遵循任何具体的循序渐进的计划。缺乏计划看起来是个坏主意,特别是因为有效的学习通常需要在学习之前做好计划。但我并不担心,因为我心里已经有了一个项目。

我的简单到可笑的项目和目标:从现在开始每天使用 Vim。

我经常用 Python、R 和 JavaScript 编写代码,我的计划是只允许我自己使用 Vim 来编写代码。本尼·刘易斯用这种方法学会了流利地说多种语言。这应该也适用于维姆。

我预料会有挣扎,尽管我不确定会有多少挣扎。我告诉自己,每当我陷入困境时,我就会用谷歌搜索解决方案——这种策略应该会奏效,因为目前的形势(新冠肺炎),大多数人的生产力都受到了影响,所以如果我因为 Vim(我是一名博士生)而行动缓慢,很可能没有人会问为什么。

在每一天结束时,我总结了我的一天,并记录了我的进展,你可以在下面看到。

第一天

灰心丧气。艰难地移动光标。

我学会了用hjkl导航和移动光标,以及 Vim 中的编辑模式:普通、插入和可视化。我还学会了如何用d删除文本,用y复制或拖动,用v选择。

我努力编辑文本,但没有完成多少工作。我的大部分时间都花在了在网上搜索解决方案,或者盯着我的显示器,努力记住该按哪个键。

Vim 用户经常将 Caps Lock 键重新映射到^控件

第二天

痛苦而缓慢。艰难地选择和改变文本。

我使用 Visual Studio 代码,所以我安装了 Vim 扩展,,它支持 Visual Studio 代码中的 Vim 键绑定。让自己完全沉浸在 Vim 中可能是最快的学习方法。

我还经常使用 RStudio ,并意识到我还可以启用 Vim 键绑定(选项>代码>键绑定)。糟糕透了——我挣扎着用 Vim 选择和编辑文本,并一直使用我的旧键盘快捷键。

[## 4 个键盘快捷键,可高效编辑文本并提高工作效率

高效地在文本中导航和移动光标

medium.com](https://medium.com/better-programming/4-keyboard-shortcuts-to-edit-text-efficiently-and-improve-productivity-66894c8d51b8)

我创建了一个文本文档来跟踪按键绑定。我还为 Anki 添加了几个重要的按键,这是一个空格重复的抽认卡应用程序,我已经用了将近十年了。从现在开始,每当我第一次学习新的按键绑定时,我都会添加到 Anki 中,这样我就可以定期查看它们,并将其保存在长期记忆中。

第三天

糟糕透了。我一定是做错了什么。

尽管我今天又学了几个动作,但我仍然在和 Vim 做斗争。比如我知道怎么用vip选择段落。但是,这仍然不是很好——过去我花 5 分钟完成的事情现在需要 10 分钟以上。因此,我别无选择,只能经常使用我的非 Vim 键盘快捷键。否则,我将无法完成任何工作。

我开始怀疑我是不是做错了什么。不知道其他 Vim 用户刚开始用 Vim 的时候有多纠结?人们怎么才能学会喜欢这个怪物呢?

在 YouTube 上找了几个视频,打算明天去看。其中一个比较了使用和不使用 Vim 时手在键盘上的动作。这个视频有点说服我坚持下去。

第四天

受到启发。隧道里的一些光。

我喜欢维姆,因为我还没有达到极限。克里斯·图米

我今天看了几个 YouTube 视频,但是克里斯·图米的掌握 Vim 语言是一个启示。Chris 改变了我对文本编辑的看法:我们大部分时间都在编辑现有文本,而不是编写新文本。我希望我在第一天就看到了这个视频。

我意识到 Vim 旨在使编辑变得容易,而普通的文本编辑器只关注写作。我迷上了 Vim 并安装了 Vim,这样我也可以在 Firefox 中使用 Vim。

我对 Vim 的兴奋溢出到学习爵士钢琴(我是一个古典钢琴家)。我想做更多的事情来发展和重组我大脑中的连接。我认为这是明智地成长和衰老的关键。我练习了所有调的 ii-V-I 音级,遵循的是四度循环,这显然比古典音乐家使用的五度循环更适合爵士乐。

我不再使用vdi的组合来编辑文本,因为ciw已经成为我最好的朋友。

练习 ciw:改变一个内部单词重复。

第五天

改进。我在维姆和爵士钢琴上变得更好。

显然,要学习 Vim,你必须把鼠标当成你的死敌。使用鼠标会妨碍您学习 Vim 和提高。

我开始使用相对行号(:set relativenumber)——另一个游戏规则改变者。我现在可以更高效地浏览文档。我还使用Shift }Shift {在段落或文本块之间导航。

我还听了塞隆尼斯·蒙克的钢琴独奏,并试着在我的钢琴上随机应变。

在过去的几天里,我也一直头痛得很厉害,我想知道这是否是我与 Vim 斗争的结果?

第六天

兴奋。维姆成了我的朋友。

ctcT是我的新宠。我用它们来删除和修改从光标当前位置到某个字符的文本。

我使用阿尔弗雷德并且总是重新映射⌘-space 来启动阿尔弗雷德而不是聚光灯。但是现在我想尽可能地保持我的手在 home 行键上,所以我现在用 Caps-lock-space 启动 Alfred(用我的左手小指和拇指;大写锁定已重新映射到第 1 天的^控制)。

我尝试在 bash 中用set -o vi启用 Vim,在 zsh 中用bindkey -v启用 Vim,但是我不太喜欢这种体验,所以我禁用了它。

第七天

缓慢而稳步的进步。尽管还在挣扎。

今天在 Visual Studio 代码中工作时,我经常使用 Ctrl-W 在窗口/窗格之间切换。过去花我 1 个小时的事情现在要花我 1.5 甚至 2 个小时。我从来没有这么努力去压抑和抑制我使用箭头键的习惯。

我想知道其他人用了多长时间才变得擅长使用 Vim?

第八天

前路漫漫。

今天用 Visual Studio 代码写了好几个小时的 Python,R,MATLAB 代码。我还发现了 radian,一个非常漂亮的 R 控制台。

我越来越擅长复制和粘贴,但粘贴后仍无法高效替换文本。观看这个视频有一点帮助——使用ft跟随一个字符找到当前行中的字符,并按;,前进到下一个或移动到上一个匹配的字符。

多亏了这个 stackoverflow 问题,我也学会了如何替换或替换当前行中的字符::s/old/new/g将当前行中的所有old替换为new。要仅替换第一个匹配实例,请移除/g标志。

第九天

隧道还没有尽头。

我花了几个小时用 Visual Studio 代码把 Python 代码写成 PDF 文件。这花费了我比预期多得多的时间(不出所料),但是在那之后,我在导航和编辑文本方面肯定感觉舒服多了。

第 10 天

乐趣和快乐。

我今天安装了我的第一个 Vim 插件。我故意避免安装任何插件,直到今天,因为我想确保在使用任何插件之前,我掌握了基本知识。

今天,我觉得我已经准备好使用一个插件了,尤其是如果我认为它会大大提高我的工作效率的话。我安装了 surround.vim,,这有助于修改事物周围的事物对——这是编程时非常常见的编辑。比如把array(x)变成print(array(x)),文字用括号括起来。我喜欢它。

我现在开始喜欢使用 Vim 了。事实上,我并不期待在 MATLAB 和 RStudio 的 ide 中无法使用 Vim 的地方编码。

第 11 天

激动人心。

今天我学习了许多新的动作和技巧。例如,我可以使用%在匹配的括号之间跳转。这很酷,对编程非常有用。

第 12 天

更多学习

我今天开始做一个 JavaScript 和 Node.js 项目,一整天都在 Visual Studio 代码中使用 Vim。事实上,我今天用了将近 14 个小时的 Vim,并且有很多机会使用 surround.vim 插件。

vim 允许您添加、删除和更改成对的事物

第 13 天

说 Vim。

我读了几节实用 Vim,这显然是学习 Vim 的最佳书籍之一。

我已经开始欣赏维姆的哲学,感谢像维姆的崇拜这样的文章。我觉得我终于开始说维姆语了。

在我看来,使用 vim 的正确方法是通常停留在正常模式,只在插入模式下进行短暂的输入。对维姆的崇拜

vim 的“禅”是你在说一种语言,我学到的思考正常模式命令的一个好方法是作为一种语言,用动词、名词和形容词。动词是你的命令,如 'c' (改变), 'd' (删除), 'y' (猛拉),名词是你的动作,如 'w' (单词), '}' (段落),或 'G' (eof),形容词/副词是你的数字前缀和你的描述词,如 'a' vim 命令应该组合成“句子”,在更高的层次上,向 vim 描述您想要做什么。

我现在意识到了自己的无能,并且知道我需要在哪些具体技能上努力才能最快地提高。因此,我开始使用刻意练习,一种强大的学习策略,来提高我的 Vim 技能。

第 14 天

结构。

我今天买了 Udemy 的 Vim 大师班,因为我觉得我的学习中的一些结构可能会有所帮助。我完成了前几节,真的很喜欢。也许我应该在第一天就开始上这门课。

第 15 天

毕业了。

最近我觉得在 Visual Studio 代码中使用 Vim 很舒服,所以我再次尝试在 RStudio 中使用 Vim。第二天我很讨厌它,但今天还不算太糟,所以我可能会继续在 RStudio 中使用 Vim。

虽然只有两周加一天,但是我已经非常喜欢它了,以至于我决定写一篇关于如何使用 surround.vim 插件的教程,这个插件在让我喜欢上 vim 的过程中发挥了巨大的作用。

[## 我是如何学会享受活力的

刻意的练习和环绕。vim 让我爱上了 Vim

towardsdatascience.com](/how-i-learned-to-enjoy-vim-e310e53e8d56)

摘要

学习 Vim 提醒了我坚持的重要性,尤其是在最初挣扎的时候。我喜欢这种挑战,其中包括大量的学习、奋斗和真正的头痛。

但我最终还是让自己大吃一惊:我从没想过在短短的 15 天里,我就能和 Vim 有家的感觉。我从来没有想到学习 Vim 会激励我最终学习和练习爵士钢琴。

我的钢琴

毫无疑问,我越来越喜欢 Vim 我明白为什么它是一种疾病。

TL;DR:如果你不使用 Vim,不要读这篇文章。或者如果你读了,不要相信它。继续使用你现在喜欢使用的东西。不要下维姆兔子洞。

——Reddit 用户军团 b 在r/程序员幽默

对于那些总是试图改善自己的人来说,Vim 是会上瘾的。只要你每天都有时间和精力学习 Vim,你一定会找到提高的方法。

我不再像 15 天前甚至 5 天前那样纠结于 Vim。我每天都在进步,因为我经常使用它;但是就像每一种语言一样,我知道我永远也不会完全掌握 Vim,因为它太复杂了(无论如何,“完全掌握”某样东西又意味着什么呢?).这提醒了我应该如何生活——关注过程,不断成长,永不停滞。

更多帖子, 订阅我的邮件列表

提高公众演讲技巧的 4 个技巧

原文:https://towardsdatascience.com/what-ive-learned-as-a-first-time-webinar-speaker-f94419ce4729?source=collection_archive---------36-----------------------

作为第一次参加网络研讨会的演讲者,我学到了什么

在 Unsplash 上由 Nycholas Benaia 拍摄的照片

我最近在一个由 Correlation One 主办的关于导师效应的网络研讨会上发言,这是一个由领先雇主赞助的数据和分析培训项目。虽然这不是我第一次在众人面前发言,但我以前从未被邀请担任小组成员。作为一名新毕业生成为演讲者之一的想法听起来完全令人生畏,但却非常令人兴奋。我参加过许多数据科学会议,会上发言人分享了他们的成功故事。谁能想到有一天我也会被邀请来分享我的经历!我一直梦想有一天我会成为演讲者之一,激励人们,但我从来没有想到这一天会这么快到来。

我感到紧张,但兴奋地分享我的经历。(图片由作者提供)

在我的成长过程中,几乎所有的老师都告诉我,我在公开演讲方面会很糟糕,因为我太害羞了,从来不说话。我记得几年前,我的老板甚至建议我参加演讲会来提高我的公众演讲能力。我去年才意识到,我也可以成为一名优秀的公众演说家。

当我在 Metis 的时候,我必须为我参与的每个项目做一个报告。我记得在我第一次演讲后,我收到的第一个反馈是我需要畅所欲言。所以,我决定我必须提高我的公共演讲技巧。最后,我的老师和同事对我的成长印象深刻,这对我意义重大!不管你过去有多糟糕,你总是可以扩展你的技能。

在这个博客中,我想分享一些我学到的提高我公开演讲技巧的经验。

写你的演讲稿

一旦你准备好了演讲稿,你现在能做的就是准备你想说的话。但是你从哪里开始呢?

我从我想涵盖的主题的大致轮廓开始。实际上,就像我写任何博客文章一样。没有必要坚持你的大纲,但是有一个大纲可以让你保持在正轨上,这样你就不会错过任何东西。写演讲稿时,用你平时说话的方式来写。如果你想吸引观众的注意力,可以随意加入一些闲聊或幽默。如果你不确定如何写提纲,查阅一些例子会很有帮助。

在你想好你的主题后,你可以开始考虑你想在每个主题/问题上花多少时间。

如果这是一个演示文稿,我尽量不要在每张幻灯片上放超过三个项目符号。经验法则是不要在你的幻灯片上列出太多的细节,因为当你的听众可以直接从幻灯片上读出来的时候,听你的演讲还有什么意义呢!

实践

练习,练习,练习!除非你是那种可以不假思索地谈论任何事情的人,否则你需要做好准备。因为英语是我的第二语言,所以练习对我来说更重要。我是那种在压力下容易忘记该说什么的人。但是,如果你练够了,我敢保证这种尴尬的情况绝对不会发生!

检查你的幻灯片。你甚至可以自己计时。PowerPoint 允许你添加一个屏幕计时器,帮助你记录你在每张幻灯片上花了多少时间。这将有助于你确保在有限的时间内涵盖所有要点。我不建议在最后一刻改变你的牌,因为这会让你感到有些措手不及。你甚至可能会跳过幻灯片,因为你忘记了你想说什么。

如果你愿意多走一步,我建议你自己录下来。听完你自己的陈述后,你可以试着微调你的演讲。如果你自己都不相信自己说的话,你怎么能指望听众会相信呢?此外,这是一个记录你进步的好方法!

处理紧张情绪

你就快到了!!对许多人来说,在演讲前感到紧张是完全正常的。不骗你,我一紧张就会手心冒汗。那完全没问题!真正帮助我在演讲中保持冷静的一个方法是不要去想观众。你可以假装在和自己或家人说话。你也可以在远处找到几个点/物体,当你说话时聚焦在上面,这样看起来你好像在看着观众,而你并没有。

这也是我需要改进的地方。但是我相信我做得越多,我就会越好。你也是!

反馈

恭喜你!你做到了!!!如果你收到任何负面反馈,不要难过。如果有人愿意花时间批评你,你应该把它当成你成长和变得更好的机会。记住,只要你付出努力,一切都可以得到改善!

“我明白了,人们会忘记你说过的话,会忘记你做过的事,但人们永远不会忘记你带给他们的感受。”―玛娅·安杰洛

我最怕的是人们会对我评头论足。事实证明,人们对你的评价远低于你对自己的评价。你可能认为人们可能永远不会忘记你做过或说过的令人尴尬的事情,但大多数人实际上都很健忘。他们可能不记得你到底说了什么,但他们会记得你是否自信。所以不用担心太多,去做就是了!

最后的话

最后,我想说的是,不要让你的现状决定你的未来。

如果你努力工作,保持专注,永不放弃,你最终会得到你想要的生活――唐纳德·米勒

我非常感激 Correlation One 邀请我成为小组成员之一。此外,我想对主办 DS4A 节目的 Correlation One 大呼小叫。如果你对数据科学感兴趣,想接触招聘经理和招聘人员吗👥来自世界 500 强企业,并且有行业导师指导,不要犹豫,赶紧申请吧!

感谢阅读!我希望这篇博客对你有所帮助。

如果你喜欢我的内容,请关注我❤️,看看我最近的博客:

[## 用例子理解和选择正确的概率分布

举例说明最常见的离散概率分布

towardsdatascience.com](/understanding-and-choosing-the-right-probability-distributions-with-examples-5051b59b5211) [## 作为分析师如何准备商业案例面试?

作为数据分析师或数据科学家,我们不仅需要知道概率和统计,机器学习算法…

towardsdatascience.com](/how-to-prepare-for-business-case-interview-as-an-analyst-6e9d68ce2fd8) [## 构建电子商务产品推荐系统:第二部分——模型构建

这个博客是我之前工作的延续,在我之前的工作中,我谈到了我是如何收集产品评论和…

medium.com](https://medium.com/@kessiezhang/building-a-product-recommendation-system-for-e-commerce-part-ii-model-building-8b23a9b3ac27) [## 为电子商务建立一个产品推荐系统:第一部分——网络搜集

今天,如果我们想到机器学习在商业中最成功和最广泛的应用,推荐者…

medium.com](https://medium.com/@kessiezhang/building-a-product-recommendation-system-for-e-commerce-part-i-web-scraping-798b6251ab51) [## 如何将 Jupyter 笔记本转换成 PDF

用几行代码将 Jupyter 笔记本转换为 pdf(调试“500:内部服务器错误”)

towardsdatascience.com](/how-to-convert-jupyter-notebooks-into-pdf-5accaef3758)

对 51,000 篇期刊文章的无监督单词嵌入学习能告诉我们关于新冠肺炎的什么。

原文:https://towardsdatascience.com/what-learning-unsupervised-word-embeddings-across-51-000-journal-articles-can-tell-us-about-d60851fb4c30?source=collection_archive---------33-----------------------

2019 年 7 月,我的一位前材料物理同事围绕从更老的科学出版物中发现新科学发表了一篇了不起的文章。这个想法很简单但很棒:如果文章编码了科学家思考特定科学概念的方式,人工智能可以通过学习这些文章中句子的模式来尝试识别新的关联吗?

来源:美国航天局

有监督的自然语言处理是一个很好的起点,但是将整个出版物的语料库减少到一个单一的结构化标签数据集并不完全是任何人想要花费他们的隔离时间去做的事情。相反, Tshitoyan 和他的同事们发现他们可以使用无监督的信息密集型单词嵌入来捕捉潜在的复杂材料科学概念。令人惊讶的是,他们发现通过训练一个简单的 Word2Vec 网络,他们可以在发现之前几年预测材料的导热性能!

有了一个空闲的下午,一杯新鲜的咖啡和对病毒学世界非常天真的概述,我们能把这种方法扩展到 51,000 篇新冠肺炎相关期刊文章的语料库(文本集合)吗?

用单词嵌入表示语言

当我们第一次学习一种语言时,我们被教授组成词汇的几个单词,然后我们根据上下文在词汇中的单词之间建立联系;我们称之为句子。有了这个极度淡化的概述,让我们试着教我们的计算机成为一名病毒学家。

首先,我们需要一种表示词汇表的方法。计算机没有将单词作为字符串处理的直观方式;一个常见的技巧是将每个单词映射到一个 n 维的二进制向量上,其中每一行代表词汇表中的一个单词和 n 个单词。当表示像“罗马”这样的单个单词时,向量在对应于“罗马”的行中有 1,在其他地方有 0。这被称为一键编码,如下图所示。

来源:马尔科·邦扎尼尼,2017 年

不幸的是,这并没有告诉我们关于单词排序的任何事情,因为我们必须学习句子的表达。做到这一点的一个方法是建立一个上下文的度量,或者一个单词在句子中与另一个单词“接近”的可能性。换句话说(没有双关语的意思),我们可以建立什么样的模型来表示语料库中单词之间关联的可能性?

我们可以训练一个神经网络来做到这一点,方法是尝试预测可能出现在以感兴趣的单词为中心的邻域或窗口中的单词。在窗口大小为 1 的 IMDB 评论上训练的网络更有可能预测“米夫林”旁边的“邓德”,而不是“比尔亚尼”旁边的“邓德”;这是因为短语“ **Dunder Mifflin** ”或(“Dunder”,“Mifflin”)作为训练示例出现的次数会比“ **Dunder Biryani** ”或(“Dunder”,“Biryani”)多得多。

另一方面,大小为 1 的窗口将无法将“**Dunder Mifflin Paper Company**”中的“Dunder”与“Paper”相关联,因为“Paper”是两个单词之遥。为了补救这一点,我们需要大小为 2 的窗口,这将产生更多的实例(“Dunder”,“Paper”)作为训练示例。选择适当的邻域大小对于捕获复杂语言的语义至关重要。

一个非常流行的网络是 Skip-Gram:一个隐藏层网络,它将我们的一个热编码输入向量映射到关联概率的输出。该网络如下图所示:

来源:克里斯麦考密克

隐藏层是这里的奖品;我们将一个主要包含零的二进制向量映射到一个 300 维向量,该向量用语料库的其余部分描述其语义表示。这种表示中的单词被称为嵌入,嵌入的词汇被称为语料库的嵌入

更值得注意的是,我们可以在嵌入中使用向量代数来描述语言中单词之间的关系。“King”、“Kings”甚至“Emperor”的嵌入向量之间的余弦相似性得分(CSS)应该接近 1,因为它们出现在相似的上下文中,因此它们出现的训练对应该为形成嵌入的网络中的权重提供相似的更新。加减向量已经被证明可以捕捉语言规律,例如类比。例如,“男人是国王,就像女人是国王一样”通过嵌入的加法和减法运算符来表示:“国王”——“男人”+“女人”;这导致嵌入非常接近皇后。

现在我们有了一个模型,我们可以继续从出版数据的语料库中学习新冠肺炎研究的语言。

数据

作为对疫情的回应,白宫和一个由主要研究人员组成的联盟组建了一个名为新冠肺炎开放研究数据集,这是一个由超过 51,000 篇关于新冠肺炎、新型冠状病毒和其他冠状病毒的学术文章组成的资源,托管在 Kaggle 上。在他们的原始论文中, Tshitoyan 和他的同事们专注于从论文摘要中学习科学概念。摘要基本上提供了一个 TL;dr 概述了作者所做工作的方法、结果、发现和结论,因此形成了一个更小但更密集的冠状病毒研究信息语料库。

生成病毒学词汇

在 Tshitoyan 等人的论文中用于预处理期刊的相同协议被用于准备新冠肺炎开放研究数据集。使用 ChemDataExtractor (一种帮助归纳化学标识符的 repo)过滤句子中的关键词,如“ABSTRACT:”和“METHODS:”并标记化(拆分成单词数组)。非技术词汇被小写和去重音,以减少总词汇量。如果标记在语料库中出现超过 5 次,则被接纳到词汇表中,给出 22399 个独特的单词。

作者们还用 n 元短语丰富了他们的词汇。在给定训练数据的情况下,这些是具有很高可能性彼此相邻出现的 n 个单词的序列。g ensim 用于使用包括诸如“of”或“a”等常见术语的短语来生成 4-gram。如果短语在语料库中出现超过 10 次,则被纳入词汇表,给出 33504 个独特的短语。

型号

我在 g ensim 中使用了 Word2Vec Skip-Gram 实现,具有 200 维嵌入和 8 个单词的上下文窗口,下采样阈值为 0.0001,对语料库中 328 个最常见的单词进行下采样。使用随机梯度下降来训练网络,在 30 个时期内,学习率从 0.01 到 0.0001 线性下降。收集了 15,000 个语法科学类比用于评估网络性能,分数定义为“正确解决”的类比数量。该分数用于手动调整网络超参数。

结果—类比

首先,用几个类比查询测试嵌入的鲁棒性。询问“中东到 MERS 如同 _ is 到新型冠状病毒”等同于对令牌嵌入执行以下向量代数运算:“中东”-“MERS”+“新型冠状病毒”。前 10 个最接近的向量包括('中国 _ 在 _ 十二月',CSS = 0.54),('南方 _ 中国',CSS = 0.49),('武汉市',CSS = 0.48)和('湖北省',CSS = 0.48)。同样,询问“艾滋病之于艾滋病毒,就像 _ 之于新型冠状病毒一样”,得到了代表新型冠状病毒引起的疾病的 2019-nCov 的三种变体。“MERS is to MERS-CoV as _ is to 新型冠状病毒”给出了 2019-nCov 在前 10 名中的 5 名的变化。“骆驼”-“MERS”+“新型冠状病毒”= ('bat_species ',CSS = 0.39)。

这些结果特别令人兴奋,因为它们暗示了对文献中关键概念之间关系的一些了解。

结果—药品名称余弦相似性和相似性

接下来,我问药物新型冠状病毒冠状病毒、SARS 和 MERS-CoV 之间存在什么样的背景关系。我下载了一个包含 2542 种 FDA 批准的药物的数据库,其中 408 种与词汇表中的药物名称重叠。

值得注意的是,羟氯喹是与新型冠状病毒语义相似度最高的药物之一,这并不奇怪,因为它最近作为一种可能的治疗方法受到了关注。另一个有趣的发现是丙嗪,在 2004 年被报道为潜在的 SARS-CoV 蛋白酶抑制剂,但在 2008 年在小鼠模型中显示出缺乏临床疗效。伊马替尼是一种癌症治疗药物,在 2016 年的一项研究中被证明可抑制 SARS-CoV 和 MERS-CoV。

接下来,我在嵌入中使用了向量代数,提出了以下问题:“利巴韦林之于 SARS,就像 _ 之于新型冠状病毒?”。以下是余弦相似度最高的 10 个答案:

有趣的是,remedisivir 目前正处于试验中,等待其用于治疗轻度至中度新冠肺炎症状,而利托那韦的试验刚刚在一组新冠肺炎症状中结束,没有明显的益处。

一个有趣的问题是,有多少与新型冠状病毒相关的药物没有出现在同一个摘要中,因为这将表明基于从专门关注 SARS-CoV 和 MERS-CoV 的论文中获得的模式的潜在上下文类比。

结果—症状类比

与上面类似,询问“干咳之于 SARS 就如同之于新型冠状病毒”会返回一个全面的症状列表,其中许多已知与最近的爆发有关。

结论

Tshitoyan 和他的同事们通过用自然语言向 NLP 模型提问,对该方法进行了扩展。这项工作是一个下午的编码,仅仅触及了 NLP 的能力和由一些非常出色的人组装的惊人数据集的表面。还有很多很多事情要做。例如,我们可以用一个更复杂的上下文感知模型来代替 Word2Vec 模型,比如 Google 的 BERT 或 ELMO。当关键词没有出现在与新型冠状病毒出版物相同的摘要中时,可以提出更多关于蛋白质结构类比的技术问题,并弄清楚网络正在回答什么问题。毫无疑问,在这一领域已经做了很多工作,试图找到对抗一种使我们的星球停滞不前的疾病的策略。

是什么让一个数据分析师变得优秀?

原文:https://towardsdatascience.com/what-makes-a-data-analyst-excellent-17ee4651c6db?source=collection_archive---------3-----------------------

关于分析的本质,第 2 部分,共 2 部分

在剖析卓越分析的本质之前,让我们先快速总结一下第一部分中关于分析的三个常见误解:

  1. 分析是统计。【T4 号】
  2. Analytics 就是数据新闻/营销/讲故事。【T8 号】【T9 号】
  3. 分析是决策。(不!)

误解 1:分析与统计

虽然他们使用的工具和公式是相似的,但分析师和统计学家接受的培训却是截然不同的

如果你想了解更多关于这些职业的知识,可以看看我的文章**分析师和统计学家能相处吗?**

***误解 2:分析与新闻/营销***

分析不是营销。区别在于,分析是关于扩大决策者的视角,而营销是关于缩小它。

同样,数据新闻是关于以小的方式捕捉许多人的兴趣,而分析是关于以大的方式服务于少数人的需求。分析师首先服务于他们的决策者。

***误解 3:分析与决策***

如果我是你的分析师,我不会在这里为你选择(即使我可能比你有更多的领域专业知识)。你必须把我提升为决策者,这样做才合乎道德。

如果你想让某人成为分析师和决策者的混合体,要明白你是在要求两个角色合二为一,并明确分配这一职责。

要了解更多关于错误观念#2 和#3 的信息,请回到1 部分。在本文中,我们将继续讨论卓越分析。

是什么让分析师变得优秀?

***在 数据科学最被误解的英雄 *,*中,我描述了数据科学的 3 大优点。分析师的优秀之处在于速度。***

图片:来源

分析师查阅事实和为你产生灵感,同时尽量少浪费他们自己的时间(和你的时间!)的过程中。为了获得最佳的灵感时间回报,他们必须掌握许多不同形式的速度,包括:

  • 获取有希望且相关的数据的速度。( 领域知识。
  • 为操作准备数据的速度。( 软件技能。 )
  • 汇总数据的速度。( 数学技能。 )
  • 将数据摘要输入大脑的速度。( 数据可视化技巧。
  • 将数据摘要输入利益相关者大脑的速度。( 沟通技巧。 )
  • 激发决策者灵感的速度。( 商业头脑。 )

最后一点非常微妙(也是列表中最重要的一点),所以让我为您详细说明。

漂亮的可视化和有效的沟通琐事是浪费你的时间。令人兴奋的发现被证明是误解是浪费你的时间。小心翼翼地进入垃圾数据源是浪费你的时间。无关的轶事是浪费你的时间。分析师带给你的任何你觉得不值得花时间的东西…都是在浪费你的时间。

分析游戏就是优化每分钟的 灵感。

分析师浪费你的时间——这是探索的一部分——所以分析游戏就是要尽可能少地浪费时间。换句话说,优化 每分钟灵感 (他们的时间你们的时间,取决于你们每个人对组织的价值)。

不要被对速度的简单解释所迷惑。从长远来看,一个草率的分析师总是被闪亮的无意义的“见解”所迷惑,只会拖大家的后腿。

评估分析师绩效

对于那些喜欢业绩评估的人,要注意你不能用 每分钟灵感 来衡量你的分析师。

图片:来源

这是因为可以提取的最大灵感量(由决策者主观定义)因数据集和数据集而异。但是你可以通过让他们在你已经非常熟悉的基准数据集上放松来评估他们的技能(而不是工作表现】。**

其中一碗豌豆是基准数据集。

打个比方,如果你让两个分析师从一本外语教科书中获取灵感,更好(更快)的分析师可能是该语言的母语使用者。你可以通过测量他们理解你用那种语言写的文章的速度来评估他们的相对技能。

如果你不热衷于自己创建一个标准化的分析障碍课程,你可能会喜欢看看 byteboard.dev 。 Byteboard 是一家革新科技面试的初创公司,他们最近推出了一项针对数据分析的技能评估。它使用真实世界的场景加上一个漂亮的界面来衡量数据探索、数据提取、定量交流和业务分析等任务的能力。当然,他们打算用它来帮助你面试新的候选人,但是没有理由你不能用它来快速测试你的现任分析师。

一本神秘的教科书!图片:来源

技巧不能保证影响。这取决于你的数据。

但是一旦你评估了技能,记住技能并不能保证影响。这取决于你的数据。回到之前的类比,如果你让两位分析师看一本你从未翻开过的神秘教科书,你不能让他们为他们发现的 每分钟灵感 负责,因为这本书可能充满了垃圾。如果是这样的话——不管他们的流利程度如何!—两个人都不会找到任何灵感带给你……这不是他们的错。有课本并不意味着你会学到有用的东西。数据集也是如此;它们的质量和相关性同样重要。

教科书是数据集的一个很好的类比,所以关于数据集和教科书还有几件事要记住:

  • 一个决策者的垃圾可能是另一个决策者的财富。像教科书一样,数据集只有在覆盖了你想了解的主题时才会对你有用。(我在这里 写过那个 。)
  • 如果它有人类作者,它是主观的。像教科书一样,数据集也有人类作者,他们的偏见会影响到内容。(我在这里这里 写过数据和偏差 。)**

永远不要因为数据中没有的东西而惩罚分析师

决策者们,把你的分析师想象成你刚刚进化出来的一个新的感觉器官:一种新的眼睛,它让你能够感知你原本会视而不见的信息。

如果你用你的新眼睛去看一些不值得看的东西,你不会把它们挖出来,对吗?

Gerax Sotelo 在 Unsplash 拍摄的照片

同样,如果分析师在你让他们为你检查的数据集中没有发现任何有价值的东西,不要惩罚他们。把他们留在身边是一种投资,让他们能够以新的方式看待事物。如果你不喜欢他们正在看的东西,把他们引向更有潜力的场景。

分析是看清你要去哪里和盲目飞行的区别。除非你全身裹着泡沫塑料,哪儿也不去,否则敏锐的感觉是值得投资的。

要深入了解卓越分析,请继续阅读本文。

感谢阅读!喜欢作者?

如果你渴望阅读更多我的作品,这篇文章中的大部分链接会带你去我的其他思考。不能选择?试试这个:

**** [## 你的数据集是一个巨大的墨迹测试

分析中的阿波芬尼亚的危险以及你能做些什么

towardsdatascience.com](/your-dataset-is-a-giant-inkblot-test-b9bf4c53eec5)

公开

自从我参与设计 Byteboard 的分析速度测试以来,我并不是完全没有偏见。我确实希望你会喜欢它。

图片:来源

感谢阅读!YouTube 课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

在这里欣赏整个课程播放列表:bit.ly/machinefriend

与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。****

什么是好的分析课程?

原文:https://towardsdatascience.com/what-makes-a-good-analytics-course-d9e452afaa60?source=collection_archive---------66-----------------------

图像来源

最近,我有幸采访了来自播客的约翰·大卫·阿里森。

我很感激约翰·大卫调查了我的背景,以了解哪些话题适合我们讨论。其中之一——课程创建——是我有自己的观点,但我从来没有用一个基本问题的答案来表达它们:“什么是好的分析课程?

以下是我在播客上的回答:

因为我从来没有写下我对什么是好的课程的想法,所以我想这是做这件事的地方:下面我详细阐述我对这个节目的想法。

一门优秀的分析课程…

…指导您完成数据清理

https://pix abay . com/photos/girl-glasses-mop-cleaning-clean-1531575/

高达 80%的数据分析师时间都花在清理数据上。虽然在数据清理上花这么多时间可能有些过分,但这一事实应该得到承认,甚至值得庆贺。

在一门课程中跳过数据分析的这一部分是如此诱人——在课堂环境中很难模拟数据清洗,大多数老师不喜欢教它,大多数学习者也不喜欢学它。这不是数据分析的“迷人”部分。

然而,数据分析讲师有义务为学生拉开帷幕,向他们展示数据分析项目的真实情况。在所有很酷的分析发生之前,还有很多乏味的工作。

…有一个上下文

图像来源

这个世界不需要再一次冷静地点名分析工具中的每一个特性和功能。一门好的分析课程应该有一些具体的学习成果,并让学生尽可能线性地学习。

在分析程序中,有多种方法可以做几乎任何事情。

重要的不是学生学会每一个,而是他们开始建立智慧,知道什么时候使用什么工具。这需要工具情境化的能力,这意味着强调一些工具而不强调其他工具,这意味着 20 小时的关于世界上一切事物的课程而不是给你情境化的智慧。

…有交付成果

图像来源

就像掩盖数据清理更容易一样,讲师也更容易仔细阅读各种示例和数据集,以提取简单的演示示例。

然而,一门好的课程会带领学生创建他们自己的端到端交付内容。毕竟,创造力是布鲁姆分类法的顶端。

图像来源

从一个主题跳到另一个主题,从一个数据集跳到另一个数据集,没有将数据清理作为数据分析管道的必要部分,也没有帮助学生了解不同的工具如何整合到一个项目中,也没有给学生留下他们创造了任何东西的感觉。这是一条便宜的捷径。

还有什么是好的?

现在轮到你了——一门优秀的分析课程有哪些特征?或者,有哪些分析课程“做对了”而你却说不出为什么的例子?

请在评论中告诉我。

为了让对话继续下去,我对这篇文章做了一个视频回顾。请在下面查看:

你可以从下面的视频中下载幻灯片。

什么是高票房电影?

原文:https://towardsdatascience.com/what-makes-a-high-grossing-movie-41ce3b2d0a6f?source=collection_archive---------54-----------------------

分析 44 年来最好的电影能告诉我们是什么造就了一部伟大的电影吗?

我发现了一个 Kaggle 数据集,我认为深入研究它会很有意思:票房最高的 10 部电影(1975 年至 2018 年) —这是一个很好的突破,远离了充斥着我们信息的新冠肺炎新闻!

**我想从这些数据中回答 3 个问题:**

  1. imdb 评分越高的电影票房就越高吗?
  2. 票房较高的电影是因为它们面向更广泛的观众吗?
  3. 电影票房能否在上映前根据数据集中的参数进行预测?

照片由克里斯特·卢哈尔斯在 Unsplash 拍摄

这是我正在使用的数据的快照:

原始数据集的样本。

让我们假设我们已经清理了所有的数据(关于探索和清理数据的细节,你可以查看这篇文章):它是我想要的格式,我知道那里有什么…现在让我们开始回答问题的有趣部分。

问题 imdb 评分越高的电影票房就越高吗?

为此,我比较了 IMDB 评级和全球总票房,看看是否有某种趋势。希望一个简单的情节能在这里给我们一个明确的答案…

IMDB 评分与每部电影的全球总票房之比

遗憾的是,从这个情节中我们真的看不出太多东西。似乎根本没有明显的趋势。从图上看,这很可能是因为在 7.8 的收视率和 27 亿的总票房之间有一个明显的异常点。那一点可能会扭曲图表…如果我们移除那一点,或许还有一些希望。

IMDB 评分与每部电影全球总票房的比较(不包括异常)

这里我们可以看到,除去异常的结果,我们仍然看不到太多的趋势。

**回答 1:不,我们不能说票房收入越高的电影在 imdb 上的评分就越高。**

问题 2:票房高的电影是因为它们面向更广泛的观众吗?

对于这一个,我正在看电影的适当观众年龄组的指定评级和电影的全球总收入。这将是一个有趣的问题,因为理论上分级为 G 的电影可以被任何人观看,而分级为 R 的电影只能被 18 岁以上的人观看。

每个收视率类别的全球总票房柱状图

在上图中,我们可以看到每个评级类别的总收入分布。最初,当你看剧情的时候,你可能会惊讶于向更多观众开放的电影比那些 PG-13 级别的电影票房低。

但是仔细想想,我们应该感到惊讶吗?

对这种趋势的一种可能的解释是,分级为 G 和 PG 的电影,尽管所有观众都可以观看,但很可能特别针对儿童。因此,大多数成年观众对它们不感兴趣。r 级电影自然不包括年轻人,而且经常被评为 r 级电影,因为其中的暴力、脏话和色情镜头可能会让观众倒胃口。

PG-13 电影可能对许多年轻观众(实际上是 13 岁以上)有合适的中间立场,但对更保守的成年观众来说不会太令人反感。PG-13 电影拥有最广泛的现实观众,而不仅仅是纸上谈兵,适合可以观看的年龄。

答案 2:是的(某种程度上),吸引最多观众(即 PG-13)而不是理论上最多观众的电影是票房最高的电影。

问题 3:电影票房能否在上映前根据数据集中的参数进行预测?

这是一个要解决的复杂问题…数据集中有很多数据,关键是要找出什么对预测一部电影的成功有用。

我们可能都有自己对成功电影的理解——也许我们认为大多数人会去看动作片?或者实际上,理想的电影长度是 100 分钟左右,因为它足够长,可以让你安定下来,但又不会太长,让你感到无聊?但是到底是什么影响了一部电影的票房呢?

根据过去的数据,这是一个关于电影预发行的已知事物及其成功程度的关联图:

数据集中参数的相关性

具体来看我们真正关心的栏目:全球总收入。嗯,看起来电影的长度是电影成功的最大影响因素——它在两个不同变量之间有最高的正值 0.34。尽管如此,考虑到最高相关性是 1,它也不是那么高。

当使用这些参数来尝试和预测一部电影的成功时,事情并不像希望的那样顺利!预测相当糟糕,也许是因为我们知道的预发行的不同东西和最终的全球总票房之间的相关性很低。

**回答 3:不,我们不能预测一部电影预发行的成功。至少不仅仅是这个数据集中的数据。**

最后的话

看着这个数据集,44 年来每年票房最高的 10 部电影,我们可以确定以下几点:

  1. imdb 评分越高的电影票房就越高吗?
  2. 票房收入高的电影是因为它们面向更广泛的观众吗?是的(算是)
  3. 电影票房能否在上映前根据数据集中的参数进行预测?

那些崭露头角的电影制作人真不幸——看起来没有简单的公式可以让你赚到数百万!

全部结果

如果你想看我的完整分析,你可以在我的 GitHub 库中找到。或许你可以创建一个更强大的模型来预测一部电影的全球票房?

是什么让一首歌伟大?第二部分

原文:https://towardsdatascience.com/what-makes-a-song-great-part-2-e82a44be659c?source=collection_archive---------47-----------------------

是什么让一首歌如此伟大

通过 Spotify 的 Python 分析滚石的 500 首最棒的歌曲

约翰·马特丘克在 Unsplash 上拍摄的照片

【这是 系列三篇文章中的第二篇

在第 1 部分中,我们研究了如何从网络上检索数据。在本文中,我们将更多地关注与 API 的交互和使用 Pandas。

从 Spotify API 获取数据。

以前我们使用网络抓取来获得一个包含滚石乐队有史以来 500 首最伟大歌曲的数据框架。如果我们想创建一个 Spotify 播放列表呢?或者,更好的是,从 Spotify 获得更多数据来补充我们的数据?我们可以通过查询并发布到 Spotify 的 API 来实现。最简单地说,应用程序编程接口(或“API”)只是服务器的一部分,当您的浏览器或应用程序从互联网发送和检索数据时,它会与服务器进行交互。当你在 Spotify 中将一首歌添加到播放列表中,或者查看一首歌的时长时,你正在与它的 API 进行交互。

这是了解更多信息的良好起点:

** [## API 到底是什么?

你有没有听说过“API”这个词,并想知道这到底是什么?你是否有一个模糊的想法,但是…

medium.com](https://medium.com/@perrysetgo/what-exactly-is-an-api-69f36968a41f)

步骤 1:设置

前往 Spotify 的 API 仪表盘,用你的标准账户登录,点击“创建应用”。从那里你应该复制客户端 id客户端秘密。这些将是您登录 API 所需的凭证。将它们粘贴到一个.txt文件中是个好主意(我的文件叫做Spotify.txt——见下文)。
现在我们可以连接到 API,如下所示(T2 行是避免忘记关闭文件的简洁方法):

file = 'Spotify.txt'# replace this with the path and file name you use
with open(file,'r') as f: 
    f = f.read().splitlines()
    cid = f[0].split(':')[1]
    secret = f[1].split(':')[1]client_credentials_manager = SpotifyClientCredentials(client_id=cid, client_secret=secret)
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

Python 有一个很棒的库叫做spotipy(就是上面代码中的sp),这使得这比平常容易得多。在这里你可以阅读文档。或者像我一样,你可以通过阅读 Medium 上的一篇文章来了解一下——我推荐这篇:https://Medium . com/@ samlupton/spot ipy-get-features-from-your-favorite-songs-in-python-6d 71 f 0172 df 0。

步骤 2:检索数据

现在让我们开始有趣的部分。为了从 Spotify 下载数据,我们首先检索 500 首歌曲中每一首的track id。让我们以我的女孩为例,由诱惑创作。

我们将从数据帧中提取艺术家和歌曲名称,并将结果传递给spotipy.search()方法。

artist = df.Artist[412]
track = df['Song title'][412]
artist, track('The Temptations', 'My Girl')track_id = sp.search(q='artist:' + artist + ' track:' + track, type='track')
track_id{'tracks': {'href': 'https://api.spotify.com/v1/search?query=artist%3AThe+Temptations+track%3AMy+Girl&type=track&offset=0&limit=10',
  'items': [{'album': {'album_type': 'album',
     'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/3RwQ26hR2tJtA8F9p2n7jG'},
       'href': 'https://api.spotify.com/v1/artists/3RwQ26hR2tJtA8F9p2n7jG',
       'id': '3RwQ26hR2tJtA8F9p2n7jG',
       'name': 'The Temptations',
       'type': 'artist',
       'uri': 'spotify:artist:3RwQ26hR2tJtA8F9p2n7jG'}],
     'available_markets': ['AD',
      'AE',
      'AL',
      'AR',
      'AT',
      'AU',
      'BA',

   [...]

  'previous': None,
  'total': 143}}

虽然这看起来很可怕,但它是一个 JSON 对象,它的行为非常像一个 Python 字典。稍微检查一下就会发现,例如,如果一个列表本身是第一个键-值对(例如{tracks : ...})中键items的值,那么实际的id是作为第一个项目中键 id的值嵌套的。同样,稍微挖掘一下,我们就能找到这首歌的popularity属性。

id_ = track_id['tracks']['items'][0]['id']popularity = track_id['tracks']['items'][0]['popularity']

现在我们可以把所有东西放进一个函数里。因为一些搜索可能没有结果,我们将使用try... except...块处理异常。注意第 4 行中使用了.zip()函数,以避免更复杂的迭代。然后,我们检索数据并将其添加到我们的数据帧中。

def get_spotify_data(dataframe):
    """
    Takes a dataframe as input.
    Returns a list of track ids and a list of popularity scores from the Spotify API. 
    """
    from numpy import nan # we import np.nan to handle empty queries 
    track_ids = []
    popularities = []
    for [artist, song] in list(zip(dataframe['Artist'], dataframe['Song title'])):
        try:
            song_data = sp.search(q='artist:' + artist + ' track:' + song, type='track')
            track_id = song_data['tracks']['items'][0]['id']
            popularity = song_data['tracks']['items'][0]['popularity']
            track_ids.append(track_id)
            popularities.append(popularity)
        except:
            track_ids.append(nan)
            popularities.append(nan)
    return track_ids, popularitiestrack_ids, popularities = get_spotify_data(df)df['Spotify id'] = track_ids
df['Popularity'] = popularitiesdf.head()

很好。让我们使用 pandas 的.isnull()来检查我们的函数是否返回了任何丢失的值:

df.isnull().sum()Artist         0
Song title     0
Writers        0
Producer       0
Year           0
Spotify id    13
Popularity    13
dtype: int64

我们的查询没有返回 13 个项目。为了简洁起见,我将把它们从数据帧中删除。我可能会在稍后阶段添加一个解决方法。

df.dropna(inplace=True)

步骤 3:获取数据帧中的音频特征

Spotify 还跟踪音频功能,如可跳舞性、拍号、速度。我们可以通过将一个轨迹的 id 传递给它的audio_features方法来访问那些带有spotipy的。我将向你展示两种做这件事的方法。首先,我使用 Python 的列表理解,这是一个稍微高级一点的特性,允许你以非常简洁的方式迭代地创建列表。但是如果感觉更舒服的话,你可以使用标准的for环。
点击这里了解 Spotify 音频功能的更多信息。

# using list comprehension
features = [sp.audio_features(id_) for id_ in df['Spotify id']]
features[0]#using a 'for' loop
features_2 = []
for id_ in df['Spotify id']:
    feature = sp.audio_features(id_)
    features_2.append(feature)*# Look at an example*features_2[0][{'danceability': 0.365,
  'energy': 0.668,
  'key': 7,
  'loudness': -12.002,
  'mode': 1,
  'speechiness': 0.817,
  'acousticness': 0.836,
  'instrumentalness': 2.58e-05,
  'liveness': 0.911,
  'valence': 0.216,
  'tempo': 53.071,
  'type': 'audio_features',
  'id': '2eOFGf5MOA5QHGLY9ZlOfl',
  'uri': 'spotify:track:2eOFGf5MOA5QHGLY9ZlOfl',  'track_href': 'https://api.spotify.com/v1/tracks/2eOFGf5MOA5QHGLY9ZlOfl',
  'analysis_url': 'https://api.spotify.com/v1/audio-analysis/2eOFGf5MOA5QHGLY9ZlOfl',
  'duration_ms': 217720,
  'time_signature': 4}]

我们有一个列表列表,每个列表对应一首歌,包含一个字典。下面是我们如何将每个功能添加到数据框中的相应列:

  1. 创建特征列表
  2. 遍历列表创建一个字典。键将对应于列名,值将是包含实际音频特性的列表
  3. 接下来,遍历特性列表,用字典的 items()方法检索音频特性的标签和值对。追加到我们创建的字典中。
  4. 用 for 循环将字典中的每一项作为新列添加
#STEP 1
k = list(features[0][0].keys())# STEP 2
dict_list = {} 
for key in k:
    dict_list[key] = []# STEP 3
for i in features:
    item = i[0].items()
    for pair in item:
        key, value = pair
        dict_list[key].append(value)# STEP 4
for key in dict_list.keys():
    df[key] = dict_list[key]

因为我们不需要一些列,所以我会去掉它们,看看我们的数据框架。

columns_to_drop = ['tempo', 'type', 'id', 'uri', 'track_href', 'analysis_url']
df.drop(columns_to_drop, axis=1, inplace=True)df.head()

完整的数据帧

我们都准备好了。在下一篇文章中,我们将最终开始探索和可视化我们的数据集。我希望你喜欢并学到了一些有用的工具。**

是什么造就了好酒…好酒?

原文:https://towardsdatascience.com/what-makes-a-wine-good-ea370601a8e4?source=collection_archive---------19-----------------------

利用机器学习和部分依赖图寻找好酒

我不知道你怎么样,但我现在肯定想喝点酒。但不是一般的酒,而是好酒。品尝起来平衡、复杂而悠长的葡萄酒。很难说这些实际上是什么意思,Buzzfeed 的这些家伙肯定很难用语言描述好酒。

BuzzFeed 视频

当然,葡萄酒的复杂性和深度是难以捉摸的概念。但是,如果我们能够用数字准确地描述是什么让葡萄酒如此令人愉快呢?

在这篇博文中,我会

  1. 使用 UCI 葡萄酒质量数据集,定性解释葡萄酒的化学特性为何令人满意。
  2. 解释如何使用部分相关图来解释葡萄酒的哪些化学特性是理想的。
  3. 在数据集上建立机器学习模型。
  4. 用 python 绘制并解释部分依赖图

所以我做了一点研究,从一个化学家的角度观察了品酒的世界。

1.用数据理解好酒

葡萄酒的什么化学特性使它令人向往?

为了理解是什么造就了一款好酒,我使用了 UCI【1】的葡萄酒质量数据集。该数据集包含了 1599 个葡萄酒样品的化学性质和口味测试结果。这项研究中的葡萄酒是葡萄牙 Vinho Verde 葡萄酒的红色和白色变种,尽管我在这篇文章中只使用红色变种的数据。

葡萄酒由以下成分组成。

葡萄酒的成分。作者插图

  1. 酒精。葡萄酒通常含有 5-15%的酒精。这就是让我们热爱葡萄酒的化合物。
  2. 酸:酸赋予葡萄酒独特的酸味。缺乏固定酸度的葡萄酒被认为是平淡的或松软的 T21,这意味着它们的味道是单一的。葡萄酒中的酸度有两种来源。一种是天然存在于葡萄中的酸,用于发酵葡萄酒并带入葡萄酒中(固定酸*)。二、酵母或细菌发酵过程中产生的酸(挥发性酸)。*

柠檬酸是水果中常见的天然酸。照片由莱斯利·戴维森在 Unsplash 拍摄

*3.**残糖。*发酵过程中,酵母消耗糖分产生酒精。酵母发酵葡萄酒后剩下的糖量称为残糖。不出所料,残糖越高,酒味越甜。另一方面,尝起来不甜的酒被认为是干的。

*4.**含硫化合物。*二氧化硫是酿酒中常用的化合物。它可以防止葡萄酒氧化和坏细菌的渗透,使其成为葡萄酒的神奇防腐剂。这些硫化合物可以进一步分为以下几种:

  • **游离二氧化硫。当二氧化硫添加到葡萄酒中时,只有 35-40%以游离形式产生。当以较大数量和较小批次添加时,可获得较高的游离 SO2 浓度。在其他条件不变的情况下,游离二氧化硫含量越高,防腐效果越强。
  • 固定二氧化硫。游离 SO2 与葡萄酒中的微生物强烈结合,产生固定 SO2。如果葡萄酒中固定二氧化硫含量很高,这可能意味着氧化或微生物腐败已经发生。

5。氯化物。葡萄酒中氯化物盐的含量。不同地理、地质和气候条件的出产的葡萄酒会有所不同。例如,靠近海边的葡萄园生产的葡萄酒比远离海边的葡萄酒含有更多的氯化物。

2.利用机器学习预测好酒

如何用偏相关图解释预测的葡萄酒质量

有了对葡萄酒令人满意的原因的这种理解,我们可以建立一个机器学习模型,根据葡萄酒的化学性质来预测葡萄酒的高质量和低质量。机器学习模型的结果可以使用部分相关图来解释,部分相关图在机器学习模型的所有特征中“隔离”个体特征,并告诉我们个体特征如何影响葡萄酒质量预测。

M 更正式地说,部分依赖图可视化了一个特性对机器学习模型预测结果的边际效应[2]。

这似乎有点难以理解。我们从视觉上分解一下。

部分相关图的可视化指南

想象一下,我们有一个经过训练的机器学习模型,它接受一些特征(酒精百分比、硫酸盐含量、pH 值和密度),并输出对葡萄酒质量的预测,如下所示。

假设我们有以下表格格式的数据点。

我们把这个输入到训练好的机器学习模型中。瞧,模型根据这些特征预测葡萄酒质量得分为 5。

*现在,我们增加数据点的数量,这样我们就有 5 个数据点,而不是 1 个数据点。*

假设我们对酒精含量如何影响模型对葡萄酒质量的预测感兴趣。为了使“酒精含量”分布的模型边缘化,我们计算了所有其他特征(即硫酸盐含量、pH 值和密度)的平均值,如下表最后一行所示。

然后,我们将每种葡萄酒的酒精含量,以及硫酸盐含量、pH 值和密度的平均值输入机器学习模型。

使用这个逻辑,我们制作了部分相关图的如下表格表示。

然后我们可以用模型预测的葡萄酒质量对葡萄酒的酒精含量来绘制图表。这被称为部分依赖图

部分相关图背后的数学

下面是部分相关图的更严格的定义,它可以跳过而不损失连续性。

我们首先假设机器学习模型是一个函数 f,它接受所有特征 x 并输出一个预测 f(xs)。我们感兴趣的是发现输入特征 xs 的之一对预测的影响,而我们对所有其他输入特征 xc 对预测的影响不感兴趣。换句话说,我们希望隔离输入特征 xs。为此,我们在特征 xc 的分布上边缘化机器学习模型,这被视为 P(xc)。在这样的边缘化之后,我们获得机器学习模型对特定特征 xs 的部分依赖函数。**

在统计学中,我们可以通过大数定律用 xc 的所有值的和来近似 xc 的分布上的积分。这里,n 是数据集中的数据数量,而 xc 是来自我们不感兴趣的特征的数据集中的实际值。

让我们在数据集中应用这个公式。为了获得特征 酒精 对预测结果 质量的部分依赖图,我们使用以下等式。

请注意,在其他特征(如 pH 值、密度、硫酸盐)上有一个上标 i ,但在酒精上没有这样的上标 i 。这是因为我们对其他特征求和以获得其他特征的平均值。这些特征中的每一个的平均值与酒精的第 I 个值一起被输入到机器学习模型中以产生预测,如下例所示。

4.构建葡萄酒质量预测的机器学习模型

数据导入

既然我们理解了什么是部分相关图,让我们将它应用于我们的数据集。首先,我们把数据下载到 UCI 站点。

*import pandas as pddf = pd.read_csv('winequality-red.csv',delimiter=';')*

数据探索

数据集不包含任何丢失的数据,并且被认为足够干净,可以按原样使用。因此,我们可以从一些数据探索开始:

  1. *我们看到数据集主要包含中等质量的葡萄酒(得分为 5-6)。*
*import seaborn as sns
import matplotlib.pyplot as pltplt.figure(figsize=(10,5))
sns.distplot(df['quality'],hist=True,kde=False,bins=6)
plt.ylabel('Count')*

3.我们看到一些变量,如硫酸盐、酒精和柠檬酸含量似乎与质量相关。

*fig = plt.figure(figsize=(15, 15))
var = 'sulphates' #or alcohol, citric acid
sns.boxplot(y=var, x='quality', data=df, palette='Reds')*

4.我们还观察到,一些变量似乎与质量的相关性较弱,如氯化物和残糖含量。

模型结构

让我们快速建立一个机器学习模型,根据葡萄酒的所有化学性质来预测葡萄酒的质量分数。

这里,我们使用 25–75 的训练-测试分割比将数据分割成训练和测试数据集。

*# Using Skicit-learn to split data into training and testing sets
from sklearn.model_selection import train_test_split# Split the data into training and testing sets
features = df.drop(['quality','pH','pH_class'], axis=1)
labels = df['quality']train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size = 0.25, random_state = 42)*

然后,我们将训练数据输入随机森林回归器。这里,没有进行超参数调整,因为这不是本文的重点。

*from sklearn.ensemble import RandomForestRegressor
est = GradientBoostingRegressor()
est.fit(train_features, train_labels)*

现在,让我们看看如何在 python 中使用!幸运的是,我们有一个优雅的包——PDP box 包——,它允许我们轻松地绘制部分相关性图,该图可视化了某些特征对所有 SKlearn 监督学习算法的模型预测的影响。太神奇了!

让我们首先安装 pdpbox 包。

*!pip install pdpbox*

接下来,我们绘制每个变量对质量分数的部分依赖图。

*features = list(train_features.columns)for i in features:
    pdp_weekofyear = pdp.pdp_isolate(model=est, dataset=train_features, model_features=features, feature=i)
    fig, axes = pdp.pdp_plot(pdp_weekofyear, i)*

各特征对葡萄酒质量的偏相关图

酸性

**

我们先来了解一下如何看这个图。纵轴是特征对目标变量预测的贡献,而横轴是数据集中特征的范围。例如,我们看到大约 7.8 的固定酸度(上面的第一张图表)将为预测的葡萄酒质量分数贡献大约 0.75。

品酒师似乎更喜欢 pH 值较低(酸度较高)的葡萄酒。特别是,他们似乎喜欢在葡萄酒中加入柠檬酸。这并不奇怪,因为好酒应该是酸性的(即不是平的)。然而,他们不喜欢挥发性酸(挥发性酸让葡萄酒尝起来像醋!)

酒精含量

葡萄酒的主要吸引力之一是它能帮助人们放松——这就是酒精的作用。品酒师似乎喜欢酒的酒精含量更高。

硫酸盐含量

**

  • 硫酸盐含量越高,模型对其质量达到某一阈值的预测就越高。为什么会这样呢?2018 年《自然》杂志的一项研究表明,二氧化硫与葡萄酒中的其他化学化合物(代谢物)反应生成亚硫酸盐化合物,这是最古老葡萄酒的化学特征。看起来品酒师似乎喜欢较高的亚硫酸盐化合物,这可能使葡萄酒尝起来更陈年。
  • 另一方面,模型认为二氧化硫含量高的葡萄酒质量较低。这并不奇怪,因为二氧化硫含量高通常与氧化和葡萄酒中细菌的存在有关。

糖和氯化物

**

***一般来说,氯化物和残糖的量似乎对葡萄酒质量的预测影响不大。*我们观察到,两个图都在特征的小幅度处具有聚类点,并且在特征的较高幅度处具有异常值。忽略异常值,我们看到特征量的变化似乎不会很大地改变质量预测,即点的梯度相对较小。因此,特征的改变不会导致葡萄酒质量预测的改变。

二氧化硫+ pH 水平对预测葡萄酒质量的影响

我还对二氧化硫和 pH 值对预测质量的综合影响感兴趣。

*为了对此进行研究,让我们首先将 pH 值分成 4 个具有相同数量数据点的区间。这一步不是完全必要的,尽管它使部分依赖图的可视化更容易。*

*pd.qcut(df['pH'],q=4)
>>  [(2.7390000000000003, 3.21] < (3.21, 3.31] < (3.31, 3.4] < (3.4, 4.01]]# Create a categorical feature 'pH_class'
cut_labels_3 = ['low','medium','moderately high','high']
cut_bins=  [2.739, 3.21, 3.31, 3.4, 4.01]
df['pH_class'] = pd.cut(df['pH'], bins=cut_bins, labels=cut_labels_3)# One-hot encode the categorical feature 'pH class' into 4 columns
pH_class = pd.get_dummies(df['pH_class'])# Join the encoded df
df = df.join(pH_class)*

然后,我们也可以绘制两个变量对预测的部分依赖图作为等值线图。

*inter_rf = pdp.pdp_interact(
    model=est, dataset=df, model_features=features, 
    features=['total sulfur dioxide', ['low','medium','moderately high','high']]
)fig, axes = pdp.pdp_interact_plot(inter_rf, ['total sulfure dioxide', 'pH_level'], x_quantile=True, plot_type='contour', plot_pdp=True)*

当我们改变 y 轴上的 pH 值(分类变量)和总二氧化硫含量(数值变量)时,等高线图的颜色显示了预测的质量。

蓝色区域表示低预测质量,而黄色区域表示高预测质量。这告诉我们,葡萄酒的 pH 值越低,二氧化硫含量越低,葡萄酒的质量越高(这对应于图表的左下角)。另一方面,超过二氧化硫含量的某个阈值(~66),我们看到 pH 不再对预测的质量分数有影响,因为在图表右侧的等高线图上只有垂直线。

该喝一杯了!

恭喜你坚持到现在。既然你是品酒的行家,是时候运用你的知识了。喝一杯,看看你能否将从部分依赖情节中学到的知识运用到实际中。(微妙的暗示:我随时都可以喝一杯——只要在 LinkedIn 上联系我就行了!)

* [## 特拉维斯唐| LinkedIn

Gojek 的数据分析师](https://www.linkedin.com/in/voon-hao-tang/)

PS/如果你对模型的可解释性感兴趣,一定要看看我的另一篇关于使用石灰解释黑盒模型对乳腺癌数据的预测的文章。

参考

[1] Paulo Cortez,葡萄牙吉马雷斯米尼奥大学,http://www3.dsi.uminho.pt/pcortezA . Cerdeira,F. Almeida,T. Matos 和 J. Reis,葡萄牙波尔图 Vinho Verde 地区葡萄栽培委员会
【2】Friedman,Jerome H .【贪婪函数逼近:梯度提升机器】统计年鉴(2001):1189–1232。

插图由作者完成。*

亚马逊 SageMaker 非常适合机器学习的 10 个理由

原文:https://towardsdatascience.com/what-makes-aws-sagemaker-great-for-machine-learning-c8a42c208aa3?source=collection_archive---------10-----------------------

学习 SageMaker 使构建、训练和部署您的 ML 模型的过程更加容易。

Amazon Web Services 是世界上最常用的云提供商,数据科学家越来越需要像 DevOps 人员一样了解云服务。数据科学家需要建立和使用数据管道,使用数据仓库,在云中训练和托管 ML 模型等。在这篇博客中,我们将专注于机器学习模型的开发。

亚马逊 SageMaker 使得在全球范围内扩展 ML 模型成为可能[ 来源

亚马逊 SageMaker 是 AWS 提供的一项强大服务,用于构建、训练和部署你的机器学习模型。它由 AWS 于 2017 年发布,并迅速获得了很大的人气,然而,没有多少数据科学家在使用这项服务,因为它相当新。在这篇博客中,我们将讨论 SageMaker 以及如何在您的机器学习项目中使用它——不仅用于构建和训练模型,还用于部署您的模型以供成千上万的用户使用。

SageMaker 的一个伟大之处是它的模块化设计。如果您喜欢在其他地方进行培训,而只是使用 SageMaker 进行部署,那么您可以这样做。如果您只是喜欢训练您的模型并使用其超参数调整功能,您也可以这样做。这是我真正喜欢 SageMaker 的地方。考虑到这一点,让我们开始了解亚马逊 SageMaker。我们将涵盖 SageMaker 帮助的 3 个广泛领域:模型构建、模型培训和模型部署——以及每个领域的 3 个优势。

模型结构

在最基本的层面上,SageMaker 提供了 Jupyter 笔记本。您可以使用这些笔记本来构建、培训和部署 ML 模型。许多数据科学家使用这些笔记本进行探索性数据分析和模型构建阶段。您可能想开始使用类似熊猫的东西来探索数据集—您有多少丢失的行?数据的分布是什么样的?有没有数据不平衡之类的?您可以构建许多不同的模型,从来自 Scikit Learn 的逻辑回归或决策树到来自 Keras 的深度学习模型,并快速获得基准性能。因此,当您使用 SageMaker 时,笔记本界面保持不变,没有任何区别!

那么你可能会问的一个问题是→使用 SageMaker 笔记本而不是本地或者某处 EC2 服务器上托管的笔记本有什么优势?嗯,SageMaker 允许您决定您喜欢的机器类型,因此您不需要管理任何复杂的 ami 或安全组——这使得入门非常容易。SageMaker 还提供对 GPU 和具有大量 RAM 的大型机器的访问,这在本地设置中是不可能的。

让我们把 SageMaker 对于建模的所有优势罗列出来:
**1。**从 2 核和 4GB 的机器到 96 核和 768GB RAM 的机器,您只需点击一下按钮就可以访问这些机器,笔记本电脑就托管在这些机器中,无需您付出任何额外的努力。您不必管理任何安全组或 ami,也不必管理机器的 IP 地址或任何东西。下面列出了不同类型的笔记本电脑,以及全天候运行时每月的价格。

不同 AWS 实例的 CPU/GPU 数量、RAM 和定价[ 定价、[计算](http://Source 2)

2。第二个优势是它附带预配置的环境——您不需要单独安装 TensorFlow 或其他公共库。

**3。**另一个优势是,您可以将您的 Github 帐户与这些笔记本相关联,这样您就可以在构建模型时继续使用 Github repo,而无需担心下载和上传文件以进行版本控制!这可通过 SageMaker 笔记本电脑的 JupyterLab 界面获得。我真的很喜欢这个功能。

模特培训

下一步是模特训练。您可以使用相同的笔记本来训练模型,并在 S3 存储模型工件和文件,然后移动到模型部署的下一步。但是,如果你正在做一个需要几个小时训练的模型,比如说,带有复杂 LSTM 模型的语言翻译模型,该怎么办呢?在这种情况下,您可以从 Sagemaker notebook 本身调用一个 GPU 来训练模型,而不是使用可能在小型实例上运行的 notebook 本身。这样,您可以在运行笔记本电脑的同时节省成本,因为大多数任务都是围绕构建、检查和探索模型进行的。同样,对于培训模型培训本身,您可以使用另一台机器,该机器不同于用于运行笔记本的机器。

所以使用 SageMaker 进行模型训练的优势有:
**1 .**你可以在非 GPU t2.medium 上运行笔记本电脑,价格约为 40 美元/月,但你可以使用 p2.xlarge GPU 实例,价格约为每小时 1.2 美元——只有用于实际训练模型的秒数才会向你收费。这可以节省大量成本。通常你会用 GPU 启动 EC2 服务器——安装所有的东西,运行你的脚本,并且必须记住关闭它。在这里,你是自动按秒计费的实际训练时间。所以重复一遍,你可以使用一个便宜的实例来托管你的笔记本电脑,它可以运行 24 小时,不会花很多钱,但然后使用 GPU 来训练笔记本电脑本身的模型。

**2。**sage maker 用于模型训练的另一个特性是超参数调优。您可以创建超参数调整作业,以便您的模型可以在一夜之间调整,并在早上向您显示最佳超参数。

**3。**另一个优势是你可以使用亚马逊自己的预建模型,这些模型已经过高度优化,可以在 AWS 服务上运行。这些模型是预先构建的,您不需要做太多的工作来构建和检查模型。您可以使用预构建的 XGBoost 或 LDA 或 PCA 或 Seq to Seq 模型,所有这些都可以通过名为sagemaker的高级 Python SDK 获得。这是一个很好的机会来提一下,也有一个低级别的 SDK 来访问 SageMaker,它是使用boto3boto3编写的,是访问 Python 中其他 AWS 服务的常用方法。

模型部署

最后,我最喜欢使用 SageMaker 的原因是为了模型部署。即使您的模型可能不太复杂,并且可以在您的本地机器上轻松地进行训练,您仍然需要在某个地方托管该模型。然后是关于扩展模型的问题→你能建立一个服务来服务你的 ML 输出,可以被成百上千的用户同时使用吗?潜伏期呢?如果需求突然激增怎么办?对于所有这些,SageMaker 非常棒,因为它允许您在端点后托管模型。这个端点是一个运行在某个隐藏的 EC2 服务器上的服务。当然,您仍然需要选择您喜欢的实例类型。但是您不需要担心设置这个服务器——在创建端点的过程中,您可以选择诸如自动扩展组、您想要多少个服务器等等。

所以使用 SageMaker 进行模型部署的优势是:
**1。**在一个端点中托管 ML 模型——然后你可以从任何其他用通用语言编写的代码中调用这个端点。你也可以从 Lambda 函数中调用这个模型。这样,您的 web 应用程序就可以调用 Lambda 函数,该函数可以调用模型端点。如果您在某个地方托管自己的 API,那么 API 代码可以调用这个端点。您还可以配置 API Gateway 来接收 HTTP 请求,该请求调用 Lambda 函数,然后该函数调用 SageMaker 端点,如下所示:

使用 API 网关、Lambda 和 SageMaker 端点部署 ML 模型

注意:Amazon 将 SageMaker 模型托管在一个一天 24 小时运行的物理服务器上——服务器不会根据收到请求的时间而打开/关闭。因此,SageMaker 在无服务器领域处于 EC2 和 Lambda 的中间。服务器像 EC2 一样一直运行,但是你不能像 Lambda 一样配置和管理它。

**2。**另一个很大的优势是你可以在同一个端点上托管多个模型。为此,您需要创建一个定制的 Docker 容器映像。这相当复杂,但是 AWS 的 Github 中有启动代码。您将需要创建您自己的映像并在 ECR 中托管它,然后在托管多个模型时使用该映像。多模型端点允许您托管多个模型,并且实例被预先配置为处理多个模型的负载,而您不必担心这方面的开发。

多型号终端可以为您节省大量成本

**3。**您所有的日志都可以轻松存储在 CloudWatch 日志中。您不需要创建自己的日志管道,这是另一个优势。您可以监控机器上的负载,并根据需求扩展机器。

但是,有什么问题呢?SageMaker 价格昂贵,比 AWS 的同等 EC2 服务器选项贵 30%到 40%。一个 t2.medium 的价格是 33 美元/月,但是 SageMaker 的同等 ml.t2.medium 的价格是 40 美元/月。但我觉得所有这些优势在总体上造成了很大的成本差异——你只需为你在昂贵的服务器上使用的模型训练时间按秒收费。这让我想到了第十个优势,即亚马逊不断创新,并带来了新功能,如SageMaker Studio——因此,当您在模型管道中使用 sage maker 时,您将能够获得所有这些优势。

我觉得它可能会遇到 SageMaker 是一个神奇的药丸,可以解决你可能遇到的每个 ML 问题。我要说,这不是一个神奇的药丸,而是一个非常有用的工具。您仍然需要使用“handler”函数来配置预处理和后处理管道,并弄清楚您想要如何为多模型端点配置 Docker 容器。所有这一切都不容易,AWS 文档也不是那么好——因此,我建议您从小处着手,部署 MNIST 端点,然后从那里开始构建。SageMaker 是一个很好的工具,但我想描绘出完整的画面——很高兴听到你如何使用它,也让我知道我是否在这一集错过了什么。通过 LinkedIn 或 T2 的电子邮件或下面的评论联系我。祝你的 ML 之旅一切顺利!

如果你更喜欢听这个博客的音频版本,我也为这个博客录了一段播客——在这里我会更详细地介绍每一点。你可以在苹果播客、 Spotify 或 Anchor.fm 上听,或者在我最喜欢的播客应用之一:阴天上听。

我谈论类似话题的播客

对于评论/反馈/问题,或者如果你认为我在这一集里错过了什么,请通过sanket@omnilence.com或 LinkedIn:https://www.linkedin.com/in/sanketgupta107/联系我

资源:
1。亚马逊 SageMaker 端点的无服务器前端
2。多模型端点
3。超参数调整作业

是什么让光变轻

原文:https://towardsdatascience.com/what-makes-lightgbm-light-8eb4dc258046?source=collection_archive---------36-----------------------

速度很重要。

照片由 Shiro hatori 在 Unsplash 上拍摄

梯度增强决策树(GBDT)是一种性能非常好的算法,它已经成为许多先进算法的基础,如 XGBoost、LightGBM 和 CatBoost。

在这篇文章中,我们将关注是什么让 LightGBM 变得又轻又快。LightGBM 是由微软的研究人员创建的,旨在建立一个比其他正在使用的 GDBT 更有效的实现。

让我们先简要讨论一下 GBDT 算法是如何工作的。我们将关注 LightGBM 的特别之处。

梯度提升意味着以这样一种方式顺序地组合弱学习器,即每个新学习器都符合来自前一步骤的残差。因此,每个新的学习者都会改进整个模型。最终的模型汇总了每一步的结果,从而形成了一个强学习者。在 GBDT 的例子中,弱学习者是决策树。

GBDT 的弱学习器决策树通过基于特征值分割观察值(即数据实例)来学习。该算法寻找将导致最高信息增益的最佳分割。

事实证明,寻找最佳分裂是决策树学习过程中最耗时的部分。GBDT 的先前实现使用预先排序或基于直方图的算法来寻找最佳分割。

  • 预先排序:特征值预先排序,并评估所有可能的分割点。
  • 基于直方图:连续特征被分成离散的箱,并创建特征直方图。

基于直方图的算法比预先排序的算法更有效。随着数据集在观测值和要素方面的增大,这两种方法的速度都会变慢。

LightGBM 从基于直方图的算法开始,因为它是更有效的算法。

基于直方图的算法的问题是扫描所有数据实例以找到关于信息增益的最佳分割。对每个特征都这样做。因此,基于直方图的算法的复杂性取决于数据实例和特征的数量。

为了解决这个问题,LightGBM 使用了两种技术:

  • 梯度单侧采样
  • EFB(独家功能捆绑)

下面我们来详细介绍一下这些技术的作用,以及它们是如何让 LightGBM 变得“轻”的。

梯度单侧采样

扫描所有数据实例以找到最佳分割是一种蛮力,这肯定不是最佳的。我们需要找到一种方法,以某种方式根据信息增益对数据实例进行采样。

一种方法是根据权重对数据进行采样。但是,它不适用于 GBDT,因为在 GBDT 没有样品重量。

GOSS 采用的解决方案是使用梯度对数据进行采样。梯度告诉我们:

  • 小梯度:该算法已经在这种情况下进行了训练,与此相关的误差很小。
  • 大梯度:与该实例相关的误差很大,因此它将提供更多的信息增益。

梯度小的数据实例提供不了多少东西。因此,我们可以排除梯度小的实例,只关注梯度大的实例。但是,在这种情况下,数据分布将会改变。我们不希望这样,因为这将对学习模型的准确性产生负面影响。

GOSS 提供了一种基于梯度的数据采样方法,同时考虑了数据分布。

选择具有较大梯度的数据实例。从具有较小梯度的剩余数据实例中,仅选择随机样本。小梯度的随机样本乘以一个常数以保持数据分布。

如您所见,只对数据集的一部分进行了采样。这就是该算法被称为“单侧采样”的原因。

GOSS 最终实现的是,模型的重点倾向于导致更多损失(即训练不足)的数据实例,而不会对数据分布产生太大影响。

EFB(独家功能捆绑)

简而言之,EFB 以一种新特征携带组合特征的信息的方式组合稀疏特征。

具有大量要素的数据集可能具有高稀疏性(即大量零值)。稀疏特征通常是互斥的,这意味着它们不会同时具有非零值。

例如,在典型的稀疏特征空间中,一行可能仅在一列中具有非零值(例如,编码文本数据)。

EFB 是一种使用贪婪算法将这些互斥特征组合(或捆绑)成单个特征(例如,互斥特征束)并因此降低维度的技术。

EFB 减少了 GDBT 的训练时间,而不太影响准确性,因为创建特征直方图的复杂性现在与束的数量而不是特征的数量成比例(束的数量远小于特征的数量)。

EFB 面临的挑战之一是找到最佳捆绑包。微软的研究人员设计了一种算法,将捆绑问题转化为图形着色问题。

在图着色问题中,将特征作为顶点,在不互斥的特征之间添加边。然后,使用贪婪算法来产生束。

更进一步,该算法还允许捆绑很少同时具有非零值(即几乎互斥)的特征。这意味着牺牲少量信息来加快训练速度。

捆绑的特性需要以智能的方式创建。考虑一组 3 个特性。捆绑特性的值应该能够为我们提供前 3 个特性的值。LightGBM 利用基于直方图的算法创建的离散箱。

包中特性的唯一值放在不同的容器中。这是通过向原始特征值添加偏移来实现的。

戈斯和 EFB 都让 LightGBM 快速运行,同时保持相当高的精确度。在一个典型的现实生活中,我们可能有大型数据集,所以效率和准确性一样重要。

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

是什么让逻辑回归成为一种分类算法?

原文:https://towardsdatascience.com/what-makes-logistic-regression-a-classification-algorithm-35018497b63f?source=collection_archive---------20-----------------------

进入现实世界

对数优势,基线的逻辑回归解释。

凯勒·琼斯在 Unsplash 上拍摄的照片——已编辑

逻辑回归是一个统计模型,其基本形式使用一个逻辑函数来模拟一个二元 因变量,尽管存在许多更复杂的扩展。
—维基百科。

—所有图像(情节)均由作者生成和修改。

很可能,对于每一个数据从业者来说, 线性回归 恰好是实现机器学习的起点,在这里你了解到为给定的独立规则集预言一个连续值。

为什么是逻辑的,不是线性的?

让我们从最基本的一个开始,在*二元分类中,模型应该能够预测因变量为两个可能类之一,可能是 *0 或 1* 。如果我们考虑使用*线性回归*,我们可以预测给定规则集的值作为模型的输入,但它将预测连续值,如 0.03、+1.2、-0.9 等。这不适于将其归类到两类中的一类,也不适于将其识别为预测一类的概率值。*

例如 当我们要预测一个网站是否是恶意的当 URL 的长度作为一个特征给定时,响应变量有两个值,良性和恶意。

分类数据的线性回归—按作者

如果我们试图将线性回归模型拟合到二元分类问题,模型拟合将是一条直线,并且可以看出为什么它不适合使用相同的直线。

为了克服这个问题,我们使用了一个 sigmoid 函数 ,它试图用指数曲线拟合数据来建立一个好的模型。

Logistic/Sigmoid 函数

逻辑回归可以用逻辑函数来解释,也称为 Sigmoid 函数,它接受任何实际输入 x ,并输出 0 和 1 之间的概率值,该概率值定义为:

使用上述逻辑函数的模型拟合可以如下所示:

分类数据的逻辑回归—按作者

此外,对于任何给定的自变量 t,让我们将其视为单变量回归模型中的线性函数,其中 β0 是截距, β1 是斜率,由下式给出:

输出 0 和 1 之间的值的通用逻辑函数 p 将变成,

我们可以看到,可分为两类的数据可以使用逻辑函数对线性函数中的给定变量进行建模。但是输入变量 x 和输出概率之间的关系不容易用 sigmoid 函数来解释,我们现在引入了Logit*(log-odds)函数,使得该模型可以用线性方式来解释。*

对数概率函数

对数赔率函数也称为赔率的自然对数*,是标准逻辑函数的逆函数,可以定义并进一步简化为:*

在上述等式中,术语如下:

通过进一步简化上述方程并对两边进行指数运算,我们可以推导出概率与线性模型之间的关系如下:

左项称为 赔率 ,定义为等价于线性回归表达式的指数函数。在两边都有 ln (对数基数 e)的情况下,我们可以将对数优势和独立变量 x 之间的关系解释为线性。

为什么要回归?

概率 p(x) 随变量 x 的变化不能直接理解,因为它是由 sigmoid 函数定义的。但是通过上面的表达式,我们可以解释变量 x 的对数几率的变化是关于变量 x 本身的线性变化。具有线性方程对数优势图可以被看作是,

对数优势与独立变量 x——作者

因变量的概率结果表明,线性回归表达式的值可以从负无穷大变化到正无穷大,然而,在用 sigmoid 函数进行变换之后,所得的概率表达式 p(x) 的范围在 0 和 1 之间,即 0 < p < 1。因此,这就是使逻辑回归成为回归分类算法的原因,它根据决策边界将线性回归的值分类到特定类别。

判别边界

决策边界被定义为一个阈值值,它帮助我们将 sigmoid 函数给出的预测概率值分类到一个特定的类别中,积极的或消极的。

线性决策边界

当两个或多个类别可以线性分离时,

线性决策边界—作者

非线性边界

当两个或多个类别不能线性分离时,

非线性决策边界—作者

多类分类

多类和二元逻辑回归背后的基本直觉是一样的。但是,对于一个多类分类问题,我们遵循一个 一个 v/s 全部分类 。如果该模型有多个独立变量,则传统方程被修改为:

这里,对数优势可定义为当线性回归变为使用 m 个外植体的多元回归时,与存在的多个独立变量线性相关。

如果我们必须预测天气是晴天、雨天还是刮风,我们正在处理一个多方面的问题。我们把这个问题转化为三个二元分类问题,即是否晴天、是否下雨和是否刮风。我们对输入要素独立运行所有三个分类,概率值相对于其他分类最大的分类成为解决方案。**

结论

逻辑回归是最简单的机器学习模型之一。它们容易理解,可解释,并且能给出相当好的结果。每一个使用逻辑回归的从业者都必须知道对数概率,这是这种学习算法背后的主要概念。考虑到业务需求和关于模型如何在模型中使用不同独立变量的解释,逻辑回归非常容易解释。这篇文章旨在提供一种简单的方法来理解回归背后的思想和逻辑回归提供的透明性。

感谢阅读。你可以在这里找到我的其他机器学习相关的帖子。

希望这篇帖子有用。我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以在这里或在 LinkedIn 给我发短信。

** [## 贷款信用风险模型中的贷款违约分析

探索和分析贷款违约背后的驱动因素,即,使贷款审批流程风险…

towardsdatascience.com](/insightful-loan-default-analysis-in-lending-credit-risk-model-b16bbfc94a2f)**

使用 LIME 解释文本分类器结果

原文:https://towardsdatascience.com/what-makes-your-question-insincere-in-quora-26ee7658b010?source=collection_archive---------32-----------------------

是什么让你的问题在 Quora 变得不真诚?

Jules Bss 在 Unsplash 上的照片

在之前关于在现实世界应用中利用可解释性的帖子中,我简要介绍了 XAI(人工智能中的可解释性),它背后的动机,以及可解释模型在现实生活场景中的应用。

在这篇文章中,我将介绍 LIME,这是最著名的本地可解释模型之一,以及如何应用它来检测使 Quora 平台中的问题不真诚的术语。

什么是石灰,它是如何工作的?

作者在[1]中提出了 LIME,它是一种算法,通过用一个可解释的模型局部地近似它们,以一种可靠和可理解的方式解释任何分类器或回归变量的单个预测。

例如,ML 模型使用一组特征(喷嚏、体重、头痛、无疲劳和年龄)预测患者患有流感,而 LIME 突出显示了患者历史中导致预测的症状(最重要的特征)。打喷嚏和头痛被认为是导致流感的原因,而没有证据表明疲劳会导致流感。有了这些解释,医生就可以做出是否相信模型预测的明智决定。

来源:“我为什么要相信你?”
解释任何分类器的预测[1]

解释预测是呈现文本或视觉工件,提供对实例组件(例如文本中的单词、图像中的补丁)和模型预测之间关系的定性理解[1]。

石灰背后的直觉

LIME 是一个局部代理模型,这意味着它是一个经过训练的模型,用于近似底层黑盒模型的预测。但是,它的想法是将数据的变化生成到机器学习模型中,并测试预测会发生什么,使用这种扰动的数据作为训练集,而不是使用原始的训练数据。

换句话说,LIME 生成一个新的数据集,由置换样本和黑盒模型的相应预测组成。在这个新的数据集上,LIME 然后训练可解释的模型(例如,Lasso、决策树等等),该模型通过采样实例与感兴趣实例的接近度来加权。

加粗的红叉是正在解释的例子。LIME 对实例进行采样,使用黑盒模型(由蓝色/粉色背景表示)获得预测,并通过与被解释的实例的接近程度(此处由大小表示)对它们进行加权。虚线是学习过的局部解释[1]。

将 LIME 应用于 Quora 数据集和逻辑回归模型

Quora 虚假问题分类任务的数据集可以从这个链接下载。训练数据包括被问的问题,以及它是否被识别为不真诚。

我们来看这个数据集的两个问题和对应的类(1 为不真诚,0 为真诚的问题):

  • 不真诚的问题:为什么特朗普相信普京告诉他的一切?他是共产主义者,还是愚蠢透顶?
  • 真诚的问题:纬度和繁荣之间的强相关性可以部分地用另一个(如果被证明存在的话)有利的环境温度和大脑着迷之间的相关性来解释吗?

预处理步骤包括将数据分为训练集和验证集,然后将问题矢量化为 tf-idf 向量。

预处理代码。

黑盒模型是一个逻辑回归模型,以 tf-idf 向量作为输入。

作为黑箱模型的逻辑回归。

现在是时候应用 LimeTextExplainer 函数来为预测生成局部解释了。该函数需要解释的问题(索引 130609)、从黑盒模型(逻辑回归)生成的问题的预测标签以及用于解释的特征数量作为参数。

使用 LimeTextExplainer 为一个实例生成解释。

上述代码的结果如下:

Question: 
When will Quora stop so many utterly stupid questions being asked here, primarily by the unintelligent that insist on walking this earth?
Probability (Insincere) = 0.745825811972627
Probability (Sincere) = 0.254174188027373
True Class is: insincere

分类器把这个例子做对了(它预测言不由衷)。
使用以下说明,以加权特征列表的形式给出解释:

结果是:

[('stupid', 0.3704823331676872),
 ('earth', 0.11362862926025367),
 ('Quora', 0.10379246842323496),
 ('insist', 0.09548389743268501),
 ('primarily', -0.07151150302754253),
 ('questions', 0.07000885924524448),
 ('utterly', 0.040867838409334646),
 ('asked', -0.036054558321806804),
 ('unintelligent', 0.017247304068062203),
 ('walking', -0.004154838656529393)]

这些加权特征是一个线性模型,它近似于测试实例附近的逻辑回归分类器的行为。粗略地说,如果我们从问题中删除“愚蠢”和“地球”,预测应该向相反的类别(真诚)移动大约 0.48(两个特征的权重之和)。我们来看看是不是这样。

结果是:

Original prediction: 0.745825811972627
Prediction after removing some features: 0.33715161522095155
Difference: -0.40867419675167543

不出所料,在从实例词汇表中删除了“地球”和“愚蠢”这两个词后,这个类现在变得真诚了。

结果可以显示在不同类型的可视化石灰。

注意,对于每一类,线上右边的单词是正的,左边的单词是负的。因此,“愚蠢”对不真诚是积极的,但对真诚是消极的。

您还可以使用下面的代码获得解释的条形图:

摘要

LIME 能够在本地解释任何类型的分类器(SVM、神经网络等)的预测。在这篇文章中,我将其应用于 Quora 问题数据集,以解释是什么使 Quora 中的问题不真诚,但它也可以集成到图像和结构化数据分类器中。您可以通过此链接访问更多代码和示例。

如果你有问题,欢迎在下面评论或通过邮箱或 Linkedin 提问。我会回答的。

全部代码发布在我的 GITHUB 简介的链接中。

我会继续张贴关于 XAI 和其他有趣的话题。敬请期待!!

参考

[1]里贝罗,M. T .,辛格,s .,& Guestrin,C. (2016 年 8 月)。“我为什么要相信你?”解释任何分类器的预测。《第 22 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集》(第 1135-1144 页)。

石灰码:https://github.com/marcotcr/lime

速配中什么最重要?

原文:https://towardsdatascience.com/what-matters-in-speed-dating-34d29102f6cb?source=collection_archive---------33-----------------------

如今约会很复杂,所以为什么不获取一些快速约会技巧,同时学习一些简单的回归分析呢?

今天是情人节——人们思考爱情和关系的日子。人们相遇并建立关系的方式比我们父母或祖父母那一代要快得多。我敢肯定,你们中的许多人都被告知过去是怎样的——你遇见某人,和他们约会一段时间,求婚,结婚。在小城镇长大的人也许有一次寻找爱情的机会,所以他们确保不会把它搞砸。

今天,找到一个约会对象不是一个挑战——找到一个合适的对象可能是个问题。在过去的 20 年里,我们经历了从传统约会到在线约会,再到快速约会,再到在线快速约会。现在你只要向左或向右滑动,如果你喜欢的话。

在 2002 年至 2004 年间,哥伦比亚大学进行了一项速配实验,他们跟踪了 21 次速配会议,这些会议主要是年轻人与异性的会面。我在这里找到了数据集和数据的关键:http://www . stat . Columbia . edu/~ gel man/arm/examples/speed . dating/。

我感兴趣的是在短暂的互动中发现某人的什么,这决定了某人是否认为他们是匹配的。如果你以前从未做过,这是一个练习简单逻辑回归的好机会。

速配数据集

上面链接中的数据集非常庞大——超过 8000 个观察值,每个观察值有近 200 个数据点。然而,我只对速配约会本身感兴趣,所以我简化了数据,上传了一个较小版本的数据集到我的 Github 账户这里。我将把这个数据集拉下来,并对其进行一些简单的回归分析,以确定是什么因素影响了人们是否认为他们是匹配的。

让我们提取数据,快速浏览前几行:

library(tidyverse) 
library(corrplot) download.file("https://raw.githubusercontent.com/keithmcnulty/speed_dating/master/speed_data_data.RDS", "speed_dating_data.RDS") data <- readRDS("speed_dating_data.RDS") head(data, 3) 

我们可以从这个关键算出:

  1. 前五列是人口统计数据——我们以后可能要用它们来查看子群。
  2. 接下来的七列很重要。评估人决定此人是否匹配。然后我们在六个特征上打满分:吸引力、真诚、聪明、有趣、雄心和共同的兴趣。
  3. like栏是总体评分。prob列是关于评价者是否相信对方会喜欢他们的评级,最后一列是关于两人是否在快速约会之前见过面的二元数据,较低的值表示他们以前见过面。

我们可以在任何分析中忽略前四列。我们这里的结果变量是dec。我对其余的潜在解释变量感兴趣。在我开始做任何分析之前,我想检查一下这些变量中是否有高度共线的——也就是说,有非常高的相关性。如果两个变量测量的是差不多一样的东西,我可能应该去掉其中一个。

corr_matrix <- data %>% 
  dplyr::select(attr, sinc, intel, fun, amb, shar, like, prob, met) %>% 
  as.matrix() M <- cor(corr_matrix, use = "complete.obs") corrplot::corrplot(M)

好吧,很明显,当你快速约会时,会有迷你光环效应。但是没有一个升得很高(例如超过 0.75),所以我要把它们都留在这里,因为这只是为了好玩。如果我的分析有严重的后果,我可能想在这个问题上多花一点时间。

对数据运行逻辑回归

这个过程的结果是二进制的。回答者决定是或否。我给你说,这太苛刻了。但是对于一个统计学家来说,这很好,因为它直接指出二项式逻辑回归是我们的主要分析工具。让我们运行一个逻辑回归模型来分析我上面提到的结果和潜在的解释变量,看看结果。

model <- glm(dec ~ attr + sinc + intel + fun + amb + shar + like + prob + met, data = data, family = "binomial") summary(model)

所以,感知智力并不重要。(这可能是被研究人群的一个因素,我相信他们都是哥伦比亚大学的本科生,所以我怀疑他们的 s at 平均分都很高——所以智力可能不是一个区分因素)。你以前是否见过某人也一样。其他一切似乎都扮演着重要的角色。

更有趣的是每个因素在多大程度上扮演了 T2 的角色。上面模型输出中的系数估计告诉我们每个变量的影响,假设其他变量保持不变。但在上面的表格中,它们是以对数优势表示的,我们需要将它们转换成常规优势比,以便更好地理解它们,所以让我们调整我们的结果来做到这一点。

ctable <- coef(summary(model)) 
odds_ratio <- exp(coef(summary(model))[ , c("Estimate")]) (coef_summary <- cbind(ctable, as.data.frame(odds_ratio, nrow = nrow(ctable), ncol = 1))) %>% knitr::kable()

所以我们有一些有趣的观察结果:

  1. 不出所料,受访者对某人的总体评价是他们是否决定与之匹配的最大指标。
  2. 吸引力似乎是婚姻的主要正面指标。
  3. 有趣的是,真诚和雄心降低了匹配的可能性——它们似乎让潜在的约会对象扫兴。
  4. 其他因素也发挥了较小的积极作用,包括被调查者是否认为利益是对等的。

比较性别

当然,人们很自然地会问,在这些动态中是否存在性别差异。因此,我将对这两个性别子集重新进行分析,然后创建一个图表来说明任何差异。

# females only model_f <- glm(dec ~ attr + sinc + intel + fun + amb + shar + like + prob + met, data = data %>% dplyr::filter(gender == 0), family = "binomial") ctable_f <- coef(summary(model_f)) 
odds_ratio_f <- exp(coef(summary(model_f))[ , c("Estimate")])
coef_summary_f <- cbind(ctable_f, as.data.frame(odds_ratio_f, nrow = nrow(ctable_f), ncol = 1)) # males onlymodel_m <- glm(dec ~ attr + sinc + intel + fun + amb + shar + like + prob + met, data = data %>% dplyr::filter(gender == 1), family = "binomial") ctable_m <- coef(summary(model_m)) 
odds_ratio_m <- exp(coef(summary(model_m))[ , c("Estimate")]) coef_summary_m <- cbind(ctable_m, as.data.frame(odds_ratio_m, nrow = nrow(ctable_m), ncol = 1)) chart_data <- coef_summary_f %>% 
  dplyr::add_rownames() %>% 
  dplyr::left_join(coef_summary_m %>% dplyr::add_rownames(), by = "rowname") %>% 
  dplyr::select(rowname, odds_ratio_f, odds_ratio_m) %>%
  tidyr::pivot_longer(cols = c("odds_ratio_f", "odds_ratio_m"), names_to = "odds_ratio") %>% 
  dplyr::mutate(
Effect = value - 1, 
Gender = ifelse(odds_ratio == "odds_ratio_f", "Female", "Male"),
Factor = dplyr::recode(rowname, amb = "Ambitious", attr = "Attractive", fun = "Fun", intel = "Intelligent", like = "Liked", met = "Never met\nbefore", prob = "Believe\nthey like\nme", shar = "Shared\nInterests", sinc = "Sincere")) ggplot(data = chart_data %>% dplyr::filter(rowname != "(Intercept)"), aes(x=Factor, y=Effect, fill=Gender)) + geom_bar(stat="identity", color="black", position=position_dodge()) + theme_minimal() + 
labs(x = "", title = "What matters in speed dating?") + scale_fill_manual(values=c('#FFC0CB', '#0000FF'))

我们发现了一些有趣的差异。不出所料,外表吸引力似乎对男性更重要。根据长期以来的信念,智力确实对女性更重要。与男性相比,它有着显著的积极作用,而男性似乎没有发挥有意义的作用。另一个有趣的区别是,你以前是否见过某人对两组人都有显著影响,但我们以前没有看到,因为它对男性和女性有相反的影响,所以平均起来是不重要的。男人似乎更喜欢新的互动,而女人喜欢看到熟悉的面孔。

正如我上面提到的,整个数据集非常大,所以这里有很多可以探索的地方——这只是可以收集到的一小部分。如果你最终用它来玩,我对你的发现很感兴趣。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn Twitter上找我。也可以看看我在drkeithmcnulty.com的博客。

谋杀和冰淇淋与数据驱动的产品管理有什么关系?

原文:https://towardsdatascience.com/what-murder-and-ice-cream-have-to-do-with-data-driven-product-management-9c3cafc34da9?source=collection_archive---------62-----------------------

unsplash.com

答案是:混杂因素。

研究表明谋杀率和冰淇淋销量之间有一种虚假的关系。( 1

这种虚假的关系并不意味着一个导致另一个。接下来会发生什么?是温暖的天气导致人们买更多的冰淇淋,变得更加暴力——“温暖的天气”是我们的混淆因素。( 2 )

这与数据驱动的产品管理有什么关系?

你的数据驱动软件产品依赖于很好地利用从原始数据中推断出来的洞察力和特性的能力(显然还有其他因素,比如设计等)。识别和整合的相关混杂因素越多,你的洞察力就越强。因此,你的产品功能越好,顾客越满意,业务表现越好。当产品管理团队拥有变量选择(独立变量、相关变量和混杂变量)方面的专业知识,并结合领域知识时,就会出现这种情况。

在成为数据驱动的项目经理的过程中,最初的步骤是艰难的,但从长远来看,它会变得更容易。以下是数据驱动的产品管理可以如何开始(这不包括业务方面):

  1. 阐明产品将解决或填补的问题或市场空白。
  2. 从基于数据的产品构思开始,而不是从产品的视觉方面开始。(这一点非常重要,尽管跳到 PowerPoint 并画出产品的样子以及路线图非常有诱惑力,因为这让业务领导层更容易理解)。
  3. 考虑数据来源、所有权、合同方面、隐私和 GDPR。
  4. 接近相应的团队:除了软件开发等常见的团队,还要接近 DevOps、数据科学、数据工程、法律团队等。并向他们介绍新产品。
  5. 询问有关数据字段、数据新鲜度、外部和内部数据集成能力、管道、可用性、数据收集、法律方面的所有权、技术方面的所有权的技术细节。
  6. 咨询内部领域专家,询问还有哪些混杂因素会影响你的产品洞察力。
  7. 请务必与外部领域专家进行交叉检查,而不要提供与产品细节相关的内部数据。询问与你潜在产品的洞察力有任何关系的变量。这将有所帮助,因为外部专家不会因任何性质的内部公司信息而产生偏见。
  8. 与数据科学和数据工程团队交叉检查新信息。问什么是可能的。
  9. 创建数据的产品/业务工作流,直至洞察。
  10. 索要软件、基础设施和数据架构设计图。这将使产品管理人员能够创建各种依赖关系的整体图,并主动采取行动。
  11. 明确数据集成和收集选项——尤其是在数据湖可用的情况下。
  12. 让 UX /用户界面专家根据现有的工作流程和数据来完成他们的工作。有了可用的数据和数据驱动,UX/UI 的工作变得简单多了。
  13. 规划和设计数据,这些数据将在产品推出和收集新的数据功能后提供。这将有助于您的新产品功能避免最终的冷启动问题。
  14. 进一步的步骤是大多数 PM 团队的标准。

如果可能,并且你已经准备好了,与最终用户协商,并采纳反馈,特别是当产品开始有设计的时候。

我相信今天最常见的方法,但幸运的是逐渐消失,是从用户界面开始一个产品。不过以我的经验来看,这类产品的成功率是比较低的。从全局来看,这并不一定是坏事——想想从失败中学习,快速迭代,拥抱失败,等等。一些企业可以忍受迭代许多 POC/MVP,直到最后,很少一部分成功进入产品。然而,以学习的名义提供高的软件产品实验失败率似乎正在消失。理想情况下,成功/尝试的比率必须尽可能接近值 1(例如在开发成 POC 的 10 个产品创意中,有 5 个已经投入生产并获得成功:成功/试用比率等于 0.5)。

**建议:**作为一家公司,记录 PoC 级别的所有产品计划,并查看有多少计划最终被推向市场(附带持续成功指标)。可接受的比率必须由企业定义。我认为有道理的经验法则是,所有试验的成本不得超过劳动力支出的 20%。这种方法的主要好处之一是,产品管理将非常容易呈现数据驱动的成功结果,并要求更多的预算。

如果产品是增量开发的,那么产品成功的机会更大;大量基于数据、领域专业知识、用户反馈和科学。因为可以更好地控制成本,所以公司对基于各方面数据创建的产品感兴趣:自有原始数据、市场数据、客户数据、业务数据、要收集的数据、第三方数据等。

让我们回到这篇文章的核心,混杂因素。这里有一个例子。

想象一下,你的公司开发了一个软件,可以为员工推荐奖金。你的软件看工资率,以前的表现,性别,工作任期(任何角色)。你的软件使用机器学习来推荐奖金(使用协同过滤)。这是一个转折。机器学习模型是有偏见的,因为公司的文化建立在性别歧视的基础上,它倾向于高薪员工,它倾向于更长的工作任期。这意味着,推荐者将向职位最高、在公司工作时间最长、在加入公司时表现出色但现在不一定表现出色的男性员工推荐最高奖金。推荐者将会错过一位高产的中层管理女商人,她已经在公司工作了几年,而且一直表现出色。

你的软件使用机器学习并且是数据驱动的…或者是吗?

有很多因素会影响这些建议。考虑时间是一个混杂因素。如果 ML 模型将加权时间维度整合到工作任期和以前绩效的函数中,则推荐会更好。请注意,时间有它的关系方面。更长的工作任期不一定意味着更好的绩效,但机器学习模型可能会基于公司习惯而变得有偏见,以奖励更老的任期员工(见下文的人力资本理论)。绩效评估越老,与今天的奖金就越不相关,这需要反映在你的模型参数中,也许作为一个衰减参数。

以下引用说明了组织可能采用的不同方法。

人力资本理论表明,随着知识和技能随着任期的延长而增加,工作绩效也会提高。相比之下,关于工作设计的文献表明,随着工作年限的增加,员工可能会变得更加无聊,工作积极性更低。( 3

对于产品经理来说,在将精力投入到路线图、工作流程、功能和设计之前,考虑尽可能多的数据变量是非常重要的。尽管混杂因素通常很难识别和整合,但它们很可能会给你的产品带来备受追捧的秘方。

作为思考的食粮,这里有几个问题。如果我们能够控制气候变暖的干扰因素,让它一直保持在零,会发生什么?你能消除或控制使你的产品见解复杂化或使你的产品贬值的混淆因素吗?

冠状病毒期间我们听什么音乐?使用数据科学的报告

原文:https://towardsdatascience.com/what-music-do-people-listen-to-during-the-coronavirus-a-report-using-data-science-1a2035d12430?source=collection_archive---------36-----------------------

一切都变了,我们的音乐习惯也不例外。

西蒙·诺在 Unsplash 上的照片

大约20 亿人现在被隔离,我们生活的方方面面都因病毒而改变。娱乐和其他的没什么不同。网飞达到了历史上的巅峰。人们用 Zoom 开派对和新闻媒体推荐隔离 Spotify 播放列表。隔离播放列表的报道不是巧合。我给其中的几个投稿,并在我的社交媒体流上发现了几十个。人们正在制作许多冠状病毒主题的播放列表。这一切让我很好奇。在冠状病毒时代,我们在听什么?

我决定从 Spotify 播放列表中收集包含疫情相关词汇的数据,并对其进行分析。我想发现热门歌曲的频率,并将它们的音乐特征与隔离前我们听的歌曲进行比较。

谢天谢地,Spotify 有一个有用的 API。在这里,我将描述收集数据然后嵌入代码的过程。

首先,我们将使用 API 来收集包含我们想要的术语的所有播放列表。我搜索了四个术语,尽量做到包罗万象。我用来收集数据的术语是“COVID”、“corona”、“Quarantine 2020”和“Coronavirus”。搜索分别返回了 7940、9322、9383 和 2830 个结果。但是这里出现了第一个问题。用 Spotify API 每次搜索只能得到两千个结果。

坏消息是由于限制,我们只能得到一些数据。所以,我们讨论的一切都是关于数据的样本。
好消息是,先前的数字是重叠的,因此真正唯一的总数没有那么高,样本将是足够的。
经过四次请求,我们获得了 7085 个唯一播放列表。

结果的一个样本能够适合这里

让我们看看播放列表。平均一个播放列表有 103 首歌曲和一个非常有创意的名字。好吧,也许最后一个没有被科学证明。最大的播放列表包含 8846 首歌曲,有人听完它们的可能性为零,最短的播放列表包含 3 首歌曲。

现在我们想使用 API 来收集关于播放列表的数据。我们想得到他们包括的歌曲和关于歌曲的数据。

运行代码后,我们发现播放列表包含 725,824 首曲目和 275,316 首独特的歌曲。有很多歌曲,其中大多数只在几个播放列表中,这表明它们与情况无关。我想为将要进一步分析的数据添加一个过滤器。我决定一首好的第一个过滤器是一首歌至少在 10 个播放列表中;这给了我 10K 周围的歌曲,所以我只收集这些歌曲的元数据。元数据主要是音频特征。

我想解释一些关键的音频特性,我们稍后需要了解。

  • 速度:音轨的速度,单位为每分钟节拍数(bps)
  • 效价:衡量音轨音乐积极性的一个指标,效价越大,歌曲越积极
  • 音量:一首歌的音量有多大,单位是分贝(dB)
  • 可跳舞性:一条赛道有多适合跳舞
  • 声音度:音轨的声音置信度
  • 能量:歌曲强度和活跃程度的量度

在 API 的文档中有更多关于它们的信息。

获取上述数据的脚本

现在让我们来玩我们的数据。

这是排名前 100 的歌曲列表。从他们的名字来看,他们中的大多数人都很清楚为什么他们会出现在这个播放列表中。

但是让我们更深入地了解一下 10K 歌曲排行榜。由于所施加的过滤器,一首歌曲最多出现 1091 次,最少出现 10 次。平均出现 29 次,75%的歌曲出现次数少于此。这意味着另外的 25%包含了更大的价值。下面的直方图可以更好的解释。

我们有 1954 年发行的最古老的歌曲和 2020 年发行的最新歌曲。大多数歌曲来自过去十年,但这并不意味着它们是我们播放列表中最受欢迎的,正如我们在下面的直方图中看到的那样。

按年份划分的歌曲直方图

按发行年份排列的外观散点图

我们可以做的进一步分析是将它们的音频特征与一些基线进行比较。我决定使用 2019 年播放列表的顶级曲目作为基线。这是我们在危机前听到的一小部分内容。

我用箱线图比较了三个数据集的主要音频特征,即 2019 年的前 100 首歌曲和我们数据的前 10k 首歌曲。

顶级 10K 数据集非常庞大,范围太广,最后的歌曲只出现在 7k 的 10 个播放列表中,因此具有更大范围的值和更少的信息是合乎逻辑的。

音频分析

在我们的数据中,效价更大,所以似乎我们听的是更积极的歌曲。

可跳舞性略低,这不应该让我们感到惊讶,跳舞和社交距离不是很好。

速度似乎与数据集无关。

在我们的数据中,速度是另一个稍低的指标。我有一种感觉,这是因为最近(包括 2019 年)我们有很多嘻哈/说唱的点击量,而我们的数据也包括前几十年的数据和更多样化的音乐流派。

像速度一样,响度似乎不会改变。

我们的数据具有较低的声音和略高的能量,我们可能处于锁定状态,但我们尽量不停机!

对歌曲频率和音频特征的分析导致了一些非常有趣的模式的发现...似乎我们在经历非常艰难的经历时,用音乐来帮助我们变得积极。

该项目可以有更多的功能。我能想到的第一件事是对播放列表的标题和描述做一些自然语言处理。欢迎在评论中提出更多想法,甚至写一篇关于它们的文章,并在那里贴上链接。

谢谢你对我的作品感兴趣。我希望你喜欢这篇文章,并学到了一些新东西。

待在家里。注意安全。

“没有免费的午餐”在机器学习中真正意味着什么

原文:https://towardsdatascience.com/what-no-free-lunch-really-means-in-machine-learning-85493215625d?source=collection_archive---------6-----------------------

揭开这个经常被误解的定理。

Riccardo Bergamini 在 Unsplash 上拍摄的照片

谁不爱免费的午餐?你不用做饭,也不用花你的任何血汗钱。对任何人来说都很划算!事实是,除非你算上研究生院承诺免费披萨的特殊讲座和演讲,否则在机器学习领域就没有免费的午餐。

监督机器学习的“没有免费的午餐”(NFL)定理本质上暗示了没有单一的机器学习算法是普遍适用于所有问题的最佳算法。这是我在上一篇关于 XGBoost 局限性的文章中探讨的一个概念,XGBoost 是一种算法,由于它在学术研究和机器学习竞赛中的表现,在过去五年中获得了巨大的流行。

[## 为什么 XGBoost 不能解决你所有的问题。

XGBoost 和其他基于树的算法的一个关键限制。

towardsdatascience.com](/why-xgboost-cant-solve-all-your-problems-b5003a62d12a)

本文的目标是利用这个经常被误解的定理并解释它,以便您可以欣赏这个定理背后的理论,并理解它对您作为机器学习实践者或数据科学家的工作的实际影响。

归纳的问题

奇怪的是,启发 NFL 定理的想法是由 18 世纪的一位哲学家首先提出的。是的,你没看错!不是数学家或统计学家,而是哲学家。

18 世纪中期,一位名叫大卫·休谟的苏格兰哲学家提出了他所谓的归纳 的 问题。这个问题是一个哲学问题,问归纳推理是否真的引导我们走向真知。

归纳推理是一种推理形式,我们根据过去的观察得出关于世界的结论。奇怪的是,这正是机器学习算法所做的。如果神经网络看到 100 张白天鹅的图像,它可能会得出所有天鹅都是白色的结论。但是如果神经网络看到一只黑天鹅会怎么样呢?现在,算法学习的模式突然被一个反例推翻了。这个想法通常被称为黑天鹅悖论。

Yuvraj Yadav 在 Unsplash 上拍摄的照片

休谟用这种逻辑来强调归纳推理的局限性——我们不能将一组特定的观察结果应用到一组更普遍的观察结果上。

“没有论证可以证明,那些我们没有经历过的实例,类似于那些我们经历过的实例。”——大卫·休谟在《人性论》中

同样的想法成为 200 多年后机器学习的 NFL 定理的灵感。

Wolpert 在机器学习中的应用

在他 1996 年的论文学习算法之间缺乏先验区分中,Wolpert 为监督机器学习引入了 NFL 定理,并在论文开头引用了 David Hume 的话。该定理指出,给定无噪声数据集,对于任何两个机器学习算法 A 和 B,A 和 B 的平均性能在从均匀概率分布中抽取的所有可能的问题实例上将是相同的。

为什么会这样呢?这又回到了归纳推理的概念。**对于机器学习问题,每个机器学习算法都预先假设特征和目标变量之间的关系。**这些假设通常被称为先验假设。机器学习算法在任何给定问题上的性能取决于算法的假设与问题的现实相符程度。**一种算法可能对一个问题表现得很好,但这并不意味着我们有理由相信,在同样的假设可能不起作用的另一个问题上,它也会表现得一样好。**这个概念基本上就是机器学习背景下的黑天鹅悖论。

**你在选择任何算法时做出的限制性假设就像你为午餐支付的价格。**这些假设将使你的算法在某些问题上自然更好,同时在其他问题上自然更差。

偏差-方差权衡

统计学和机器学习中与 NFL 定理密切相关的一个关键思想是偏差-方差权衡的概念。这一概念探讨了任何模型的两种误差源之间的关系:

  • 模型的偏差是来自模型中潜在错误的先验假设的误差。这些假设导致模型错过了关于机器学习问题的特征和目标之间的关系的重要信息。
  • 模型的方差是来自模型对训练数据微小变化的敏感度误差。

具有高偏差的模型通常过于简单并导致欠拟合,而具有高方差的模型通常过于复杂并导致过拟合

过度拟合与欠拟合。来源: Edpresso ,根据 CC BY-SA 4.0 授权。

如上图所示,具有高偏差的模型无法正确拟合训练数据,而具有高方差的模型则很好地拟合了训练数据,以至于它记住了这些数据,却无法正确地将学到的知识应用到新的真实数据中。给定问题的最优模型介于这两个极端之间。它有足够的偏差来避免简单地记忆训练数据,并且有足够的方差来实际拟合训练数据中的模式。这种优化模型是通过优化偏差-方差权衡来实现对给定问题的测试数据的最低预测误差的模型,如下所示。

偏差-方差权衡。来源:临床数据科学基础,4.0 授权 CC 下。

显然,每个机器学习问题都有一个不同的点,在这个点上,偏差-方差的权衡被优化,预测误差被最小化。正因如此,没有一个超级算法能比每一个其他算法更好地解决每一个机器学习问题。每种算法都做出假设,创造不同类型和水平的偏差,从而使它们更适合某些问题。

“没有免费的午餐”对你意味着什么

所有这些理论都很棒,但对于作为数据科学家、机器学习工程师或只想开始学习机器的人来说,“没有免费的午餐”意味着什么?

是不是说所有算法都是平等的?不,当然不是。实际上,所有的算法并不都是平等的。这是因为整个机器学习问题集是 NFL 定理中的一个理论概念,它比我们实际尝试解决的实际机器学习问题集要大得多。在某些类型的问题上,一些算法可能通常比其他算法表现得更好,但是由于算法的先验假设,每个算法都有缺点和优点。

像 XGBoost 这样的算法可能会赢得数百场 Kaggle 比赛,但在预测任务中却惨败,因为基于树的模型中涉及到有限的假设。当涉及到图像分类和语音检测等复杂任务时,神经网络可能表现得非常好,但如果没有正确训练,就会因其复杂性而遭受过拟合。

实际上,这就是“没有免费的午餐”对你的意义:

  • 没有一种算法会比其他算法更好地解决你所有的机器学习问题
  • 在选择要使用的算法之前,确保你完全理解一个机器学习问题和所涉及的数据。
  • 所有模型的好坏取决于创建它们时的假设以及用来训练它们的数据。
  • 逻辑回归等更简单的模型偏差更大,容易欠拟合,而神经网络等更复杂的模型方差更大,容易过拟合。
  • 给定问题的最佳模型位于两个偏差-方差极值的中间。
  • 为了找到解决问题的好模型,您可能需要尝试不同的模型,并使用稳健的交叉验证策略对它们进行比较。

来源

  1. 《斯坦福哲学百科全书》,归纳的问题,(2018)。
  2. 迪派,黑天鹅悖论定义,(2020),deepai.org。
  3. D.休谟,人性的论述,(1739),古腾堡计划。
  4. D.H.Wolpert,学习算法之间缺乏先验区分,(1996),CiteSeerX。

非数据科学家需要了解的数据科学知识

原文:https://towardsdatascience.com/what-non-data-scientists-need-to-know-about-data-science-55d7fccd59f?source=collection_archive---------22-----------------------

黑盒并不是数据科学被非专业人士视为魔法的唯一原因。从局外人的角度来看,缺乏对数据科学流程和数据科学构成要素的理解会增加神秘感(或海市蜃楼)。虽然保留数据科学的魅力可以增强自我,但这应该是你最终想要解决和消除神秘感的事情。这里有 5 件重要的事情,你应该告诉你的非数据科学同行,让你的生活更轻松。

数据科学是迭代的

在数据科学中,您计划遵循一个流程,但是您将许多决策外包给了您正在使用的工具。你从一个清晰的问题陈述开始,但是在你开始处理数据之前,你将使用的方法和你在每个阶段花费的时间在很大程度上是未知的。这种方法会比你的其他同行少很多确定性。你需要让这些利益相关者明白这一点——来管理你的团队的期望。

通过这样做,你将能够减少与组织和解释你的工作相关的摩擦,并让你专注于获得结果。这也将为你赢得空间和时间来进行必要的实验。

学习是这份工作的一大部分

被视为无所不知当然很好,但是做桌面研究来填补你知识的“空白”并保持更新是这份工作的一大部分。研究给定方法的最佳实践是非常耗时的——特别是考虑到最佳实践比其他领域发展得更快。同样,为了管理期望,如果清楚地理解了这一点,并且如果您计划任何时间进行桌面研究,在库/包之间进行比较,并且在与您的利益相关者一起计划一项工作时阅读相关文档,这将是很有帮助的

毕竟,如果 Excel 用户通过在堆栈溢出上发布他们的查询来解决他们的问题,那么人们肯定应该理解,像数据科学这样的更密集的过程需要花费更多的时间来进行桌面研究,并与同事合作来解决特定项目的问题。

数据科学这个术语在传统上一直很模糊,可能涵盖多种技能

数据科学正被非数据科学家甚至一些数据科学家用作一个包罗万象的术语,通常涵盖广泛的任务和计划。隔离纯数据科学活动可以帮助您的非数据科学同行了解什么构成了数据科学,什么没有。进行这样的对话尤其有助于做出招聘决定。它还可以帮助您确定可以利用的其他团队,以执行数据科学领域要求的一些工作。

再说一次,不被认为是数据万事通最终符合你的最佳利益,进行这些对话可以帮助你雇佣适合目标的新员工,管理期望,并确定可以将非数据科学相关的数据任务委派给哪些团队。

数据科学包括大量的前期工作

你花在数据科学上的时间有一半以上是在为未来的任务准备环境,主要是数据。教授非数据科学家将向他们展示在实际着手解决问题之前,准备和清理数据的准备工作有多深入。这样做还可以让您开始对话,展示任何数据集的局限性,并概述可以从数据集做出哪些决策以及在做出这些决策时需要考虑的事项。它还让你有时间和空间来完成这项重要的工作,达到所需的详细程度,而不必过早地处理结果或成果。

它还可以帮助您确保他们的参与,帮助您定义您正在使用的分类变量中可能会出现的大量业务术语,以及您将从业务中要求的其他方向,以确保您围绕期望的结果优化您的流程。

我相信,对您的利益相关者进行这 4 个方面的最低限度的培训,有助于提高您的工作效率,以及数据科学领域和其他领域之间的跨团队协作。

它可以帮助揭开人们将数据科学与一些“魔法”联系在一起的神秘面纱。就你的工作需要做什么进行诚实的对话,将使你专注于核心数据科学活动,并释放不得不身兼数职的压力

这个故事和其他类似的故事最初发表于 这里

皮特·布蒂吉格对数据驱动的决策有什么看法

原文:https://towardsdatascience.com/what-pete-buttigieg-has-to-say-about-data-driven-decision-making-23139dd9d26a?source=collection_archive---------33-----------------------

数据驱动的决策制定

前民主党总统候选人和“技术市长”坚信数据和分析。

加里·里格斯在维基共享资源

印第安纳州南本德市前市长皮特·布蒂吉格在作为 2020 年总统候选人竞选时获得了全美国的欢迎。

他成功筹集了大量资金,并在爱荷华州和新罕布什尔州取得了惊人的好成绩。在未能保持住势头后,他退出了民主党竞选。不过,在第一次听说他的故事后,我还是很感兴趣。

出生在铁锈地带,他获得了哈佛和牛津的学位,在麦肯锡担任顾问,在阿富汗战争中服役,并在 29 岁时成为南本德市长。尽管在他的两届市长任期内面临争议,但他已经说服居民和利益相关者,他的家乡不仅仅是一个以前的制造业所在地。

我拿起他的书 【回家的捷径】 ,惊讶地发现他是数据驱动决策的坚定信徒。他认为,分析性分析有助于城市变得更加高效和以事实为导向,而不是基于直觉做出决定。

咨询出身的他首先认为,更多的数据和分析对他的政府总是有益的。但很快,他意识到许多资源可能会被浪费,因为生成的数据要么没有被使用,要么只给出了已知的信息。

他必须确保数据不仅是生成的,而且是有用途的。

我想和你们分享一下皮特·布蒂吉格在担任市长期间学到的六条重要经验。

照片由弗雷德·穆恩在 Unsplash 上拍摄

1.报告和解决问题是有区别的。

有时候,报告和解决问题可以齐头并进。

例如,皮特·布蒂吉格政府安装了 ShotSpotter 技术,使用麦克风来发现整个城市的枪声。一方面,政府获得了关于开枪地点的可靠数据。这一点至关重要,因为当枪声响起时,一些居民区没有报警。另一方面,警察可以更快地处理枪支暴力案件。

但通常情况下,对问题了解得更多并不能帮助解决问题。

例如,前市长参加了一次会议,会上一家初创公司介绍了一种可以自动检测污水中阿片类物质模式的产品。政府很清楚南本德的阿片类药物使用问题,但缺乏资金来照顾精神健康和成瘾资源。在获得阿片类药物检测产品的过程中,管理部门会收集更多关于这个问题的数据。但是,这也会从解决这个问题的计划中拿走宝贵的资源。

因此,他在书中认为,当一个人已经意识到一个问题并有办法解决它时,他应该专注于解决这个问题。这并不意味着报告问题是不必要的,但也不足以解决问题。

2.响应速度和效率是有区别的。

在皮特·布蒂吉格担任市长期间,他不得不在快速反应和提高效率之间做出选择。

在扫雪的情况下,他可以决定扫雪人员总是首先被赶到街道上,因为那里的居民会打电话来。这将使这些街道上的居民非常高兴,但这不是一个有效的方法。

为什么?因为这些人会在城市中穿梭。通过使用基于区域的方法,扫雪机工作人员可以更快地处理所有街道。但这意味着并不是每一条无法通行的路都被直接照顾到了。

在其他时候,皮特·布蒂吉格认为有求必应是最有效的事情。例如,涂鸦一旦被报道就应该被处理,因为其他人可能会被激励去模仿或超越这种涂鸦。还有,如果是直接打理,不鼓励涂鸦者污损公物。

罗伯特·v·鲁杰罗在 Unsplash 上的照片

3.诚实地说出你是否愿意跟随数据的走向。

为了这次学习,这位前市长必须决定如何控制垃圾账单率。

他向他的一位公共工程主管寻求帮助。他得到了各种各样的想法:出售垃圾桶上的广告空间,根据垃圾量向客户收费,或者引入使用机械臂的自动化垃圾车。

自动垃圾车是最好的解决方案,部分消除了人工垃圾收集和减少受伤率。数据清楚地表明,这项新技术将导致更低的垃圾账单率。

这是一个艰难的决定。用机器代替人类往往意味着一些人会失业。

他决定推进这一提议,一半被解雇的工人能够转到城市提供的其他工作岗位。

在其他时候,皮特·布蒂吉格并没有做好遵循数据的准备。

人们可以去缴纳水费的办公室似乎是另一个时代的事情了。人们可以通过电话或电子邮件在线支付。那么,为什么仍然需要这种昂贵的基础设施呢?因为特别是低收入的居民没有银行账户。他们需要一个可以支付现金的地方,即使这对城市来说很昂贵。

当然,人们可以跟踪这个案例的数据,但这将意味着对这些低收入居民的严重伤害。那么,你真的愿意跟着数据走吗?

4.数据可以显示你从未问过的问题的答案。

有时候,寻找一个答案可以引出另一个问题的答案。

还记得枪击技术的例子吗?收集这些数据和更快地获得枪击案件的帮助有助于回答另一个关键问题。邻里信任警察到什么程度?打电话的邻居越少(如果有的话),警察的合法性就越低。

此外,这使得即使没有人打电话,警察也能出现。邻居们认为警察不会在意他们地区的枪声。通过来到这些社区,警察能够增加信任。

因此,问自己这样一个问题是有帮助的:“有没有另一个问题我可以用这些数据来解决?”

照片由 timJ 在 Unsplash 上拍摄

5.技术和道德问题的混淆。

回答技术问题似乎很容易,因为它们通常是对或错的问题。但当涉及道德问题时,让一个人过得更好而不让另一个人过得更糟通常是不可能的。

例如,城市决定得到这些新的自动垃圾车。虽然这降低了浪费率,但也导致了裁员。居民们不再把垃圾桶放在小巷里,而是被迫把垃圾桶拖到前面的路边。当然,工人和居民对这一变化并不满意。

皮特·布蒂吉格对这一决定的陈述是,没有数学公式来解决这种权衡。因此,他们必须做出决定,并向受影响的人解释他们为什么做出这一决定。

6.例外很重要。

数据驱动的决策以规则为中心。并且如果规则不充分,则可以实现子规则。但有时这还不够。一个更好的方向不是遵循规则,而是创造一个例外,即使你无法解释或辩护这个例外。

例如,一位老人打电话到市里,请求帮助处理一只死去的浣熊。遵循规则本应该有一个明确的答案:城市没有义务帮助这个人,因为浣熊在这个人的私人院子里。

但是很明显,这个男人打电话是因为他控制不住自己。一名委员会成员没有遵守规则,而是开车去了那个人的家,把浣熊拖到了街上,并确保案件得到处理。

结论

归根结底,皮特·布蒂吉格相信数据驱动的决策。他认为,它可以使人们做出更聪明、更公平的决定。然而,他很清楚数据是有局限性的,并不是所有的问题都可以用它来解决。此外,他认为有些决定必须遵从他或她的直觉。

我喜欢读他的书有几个原因。虽然我对他关于数据驱动决策的章节(第 11 章——潜意识运作)感到兴奋,但我也学到了更多关于美国政治和铁锈地带斗争的知识。

如果您有任何问题或意见,请在下面留下您的反馈。另外,如果你想和我联系,你可以通过 LinkedIn 联系我。

如果你对基于我自己经历的文章感兴趣,请随时查看。

[## 我和 190 名学生是如何学习数据科学的

如何学习编码的可行策略?

towardsdatascience.com](/how-190-students-and-i-have-learned-data-science-55da9e0e5c6b) [## 如何提高预测模型的可解释性

从商业角度的实用见解。

towardsdatascience.com](/how-to-increase-the-interpretability-of-your-predictive-model-b786d72365f1)

皮特·布蒂吉格(2019),《回家的最短路径:一个市长的挑战和美国未来的模式》,Liveright,第 388-418 页。

机器学习在死亡率建模中有什么地位?

原文:https://towardsdatascience.com/what-place-does-machine-learning-have-in-mortality-modelling-f19e6dcd5c22?source=collection_archive---------37-----------------------

见习精算师的视角

Icons8 团队在 Unsplash 上的照片

人类的死亡不是一个确定的过程(除非你碰巧生活在科幻反乌托邦中,剩余寿命被用作货币)。因此,对未来死亡率的估计是精算师为客户提供的许多建议中的核心假设之一。我们投入了巨大的努力,将所有最新的数据整合到人类预期寿命的模型中,并预测随着时间的推移,我们对未来的预测将如何演变。

虽然我们对导致人们寿命延长或缩短的因素有一个大致的了解,但似乎总有随机因素。伴随这种随机因素而来的是寿命风险——这是那些现金流依赖于人们寿命的组织特别关注的事情。例如,养老金计划需要知道其成员能活多久,这样才能有效地管理其负债,并确保做出正确的投资决策。同样,人寿保险公司需要合理准确地预测投保人死亡率,以便能够设定适当的保费水平——足够高以获得一些利润,但又足够低以向客户提供价值并在人寿保险市场保持竞争力。

目前,设定死亡率假设的过程可能如下所示:

  1. 选择一个基础表——一个公认的相当令人沮丧的个人死亡概率列表;
  2. 选择死亡率预测——这将决定每个年龄的死亡率如何随时间演变;最后
  3. 执行额外的分析来定制所选的表和投影,以匹配感兴趣人群的特定人口统计特征。

这些基本表格和预测经常更新(例如,连续死亡率调查每年更新其预测)。此外,新的参数正在被添加到模型中,以使其对假设设置者更加灵活(例如,查看 2019 年 3 月发布的 *CMI_2018、*上的简报,其中介绍了新的“死亡率改善的初始增加”参数)。事实上,我们正在不断修正我们的死亡率模型和估计,这足以证明根据历史数据预测人们的寿命实际上是相当困难的。似乎有数不清的变量与生活方式、社会经济状况甚至基因有关。我们应该做些什么来最好地捕捉驱动个人预期寿命的最重要因素——以及它随时间的演变——从而使我们能够推广到更大的人群?

机器学习开始发挥作用了

数据驱动的机器学习方法似乎很适合这类问题。预期寿命是一个经过充分研究的现象,已经收集了大量数据来帮助我们理解人类死亡率的“规则”。机器学习已经产生了许多无监督的算法,这些算法专门设计用于识别相似的数据点(聚类)和发现数据中的模式和相关性(可以说属于关联规则学习的领域)。如果有人认为人口学家会全面掌握这一新兴工具,并以各种创造性的方式使用它来加深我们对决定预期寿命的复杂关系的理解,这是可以理解的。

然而在现实中,到目前为止,机器学习在人口结构变化研究中的应用还是有限的。在他们的 2019 年论文中,Levantesi 和 Pizzorusso 提出,这种缺乏受欢迎程度是因为机器学习模型通常被视为“黑盒”,其结果很难解释和解读。诚然,这是一个合理的担忧——在机器学习社区中有大量正在进行的工作和讨论,涉及解释如何为什么一个人工智能算法得出它所确定的结论的重要性,以及研究向利益相关者证明一个模型正在做出明智和合理的决定的实用方法。

尽管如此,研究人员继续总结了迄今为止利用机器学习方法对死亡率建模领域做出的贡献:

  • 评估和改进标准随机死亡率模型产生的估计值的拟合优度( Deprez 等人,2017);和
  • 应用神经网络来识别预测死亡率的重要因素,并扩展标准死亡率模型( Hainaut,2018 和 Richman 和 Wüthrich,2018 )。

Levantesi 和 Pizzorusso 在同一篇论文中继续证明,他们能够通过引入一个“ML 估计量”参数来捕捉标准死亡率模型中无法识别的模式,该参数被他们的算法识别为具有预测能力。通过这样做,当他们的机器学习模型的输出用于支持标准死亡率模型时,他们能够提高预测质量。

你会注意到,上述论文中的一个关键主题是使用机器学习来支持,而不一定是取代传统的死亡率建模方法。在我看来,这是一种明智的前进方式。如果我们想进一步了解预期寿命的驱动因素,来自机器学习和人口学的领域专家需要能够交流和合作。

传统方法和机器学习方法在自然语言处理领域一直存在着著名的分歧,在这个领域,理论驱动和基于规则的方法最初几乎被抛弃,而支持数据驱动的方法——以至于它导致了 IBM 研究员弗雷德里克·耶利内克的名言:“每当我解雇一名语言学家,语音识别器的性能就会提高。”但是,即使在 NLP 社区内,也有迹象表明钟摆可能会摆回另一边,并且有人问,如果更多的语言学家参与 NLP 研究,我们是否会取得更大的进展(相关 TWiML talk )。

不需要太多的想象力就能看出 NLP 研究和人口学/死亡率建模之间的相似之处:每个领域都研究某种系统,在该系统中,基于理论和基于规则的方法产生(显然)合理且有用的结果——尽管也有大量的数据,我们能够从这些数据中建立完全适当的模型,而无需具备如此深入的领域专业知识。

我建议最好采取一种平衡的观点——如果手工设计的基于规则的方法不断被替代方法(如机器学习提供的方法)超越,那么对这些方法过于感情用事是没有用的,但是我们应该对这样一个事实保持开放的态度,即我们总是需要领域专家来告知我们设计和操作模型的方式。

结论

照片由 Aron 视觉效果在 Unsplash 上拍摄

机器学习和人工智能在识别和预测死亡率趋势方面有其一席之地。毋庸置疑,这些技术是检测数据点中及数据点之间的模式和关联的强大工具,将这种分析与现有的更经典的死亡率建模方法相结合是有价值的。不可避免的是,只有在更经典的、基于规则的方法和更现代的、数据驱动的机器学习方法之间找到平衡时,最佳结果才会出现。

死亡率建模将永远是相关的——除非 a) 你碰巧发现了青春之泉, b) 你已经知道如何将你的意识永远上传到云中,或者 c) 你生活在前面提到的科幻反乌托邦中(尽管这可能是一个公平的交易,如果这也意味着你可以成为贾斯汀·汀布莱克)。现在,我们的世界不是一个反乌托邦,但我们一直面临着甚至连专家都没有预见到的预期寿命的新趋势,我们还面临着一系列新的挑战,因为我们要应对人口老龄化的后果。

我们很可能需要死亡率建模方面的进步,以成功管理我们肯定会因人口结构变化而面临的问题——只有我们的专家能够抛开他们的学术忠诚,为了每个人的利益而共同努力,我们才能做到这一点。所以是的,我们必须勇敢——我们必须适应探索新技术——但是如果我们不记得我们从哪里来,我们会很快发现自己迷失了。

学分和更多信息

Andrew Hetherington 是英国伦敦的一名见习精算师和数据爱好者。

  • 查看我的网站。
  • 在 LinkedIn 上与我联系。
  • 看我在 GitHub 上摆弄什么。

讨论的论文:机器学习在死亡率建模和预测中的应用。风险 20197 、26。

沙漏照片由阿伦视觉拍摄。闹钟照片由 Icons8 团队拍摄。两者都在 Unsplash 上。

什么 Python 包最适合从 Twitter 获取数据?比较 Tweepy 和 Twint。

原文:https://towardsdatascience.com/what-python-package-is-best-for-getting-data-from-twitter-comparing-tweepy-and-twint-f481005eccc9?source=collection_archive---------12-----------------------

回顾 Tweepy 和 Twint——两者的优缺点、代码片段、潜在用例以及我的建议。

Kon Karampelas 在 Unsplash 上拍摄的照片

Twitter 对于任何数据科学家来说都是绝对的宝库,无论他们是专业人士、学生还是业余爱好者。它将各行各业的人联系在一起,无论你是一名有抱负的音乐家还是 T4·泰勒·斯威夫特,无论你是一名职业篮球运动员还是勒布朗·詹姆斯,从当地政客到美国现任总统和前任总统。

它的用户群有多广,产生了多少数据?截至 2019 年第三季度,Twitter 的每日活跃用户群约为1.45 亿人,2018 年每天发出 5 亿条推文。即使有 280 个字符的限制,Twitter 数据提供了一片可以收获数据见解的沃土也就不足为奇了。

但是,我们如何收集这些数据呢?事实上,由于各种原因 Twitter 数据的预编译库是有限的(参见此链接进行讨论)。Twitter 本身在特殊场合可能会提供自己的数据汇编,但这种情况很少。它们甚至可能不会公开提供——只对特定的开发人员和研究人员开放,比如这个与新冠肺炎相关的数据集。

这就是为什么我想在这篇文章中花些时间比较两个流行的第三方 Python 包, Tweepy 和 Twint 。

这两个库都非常受欢迎,正如你在下面 GitHub 受欢迎程度的图表中看到的。

Twint 和 Tweepy — GitHub 星史(【https://star-history.t9t.io/】T4)

我在这里http://tweetdash.jphwang.com建立了自己的 Twitter 数据分析应用,为此我尝试了从两个库收集数据。

来自我的 Twitter 的屏幕截图数据分析应用程序(链接)

和其他工具一样,它们并不完美,在我看来,Tweepy 和 Twint 各有优缺点。但是,它们是优秀的工具,即使以我有限的经验,我认为你的大部分 twitter 数据需求可以用一个或这些库的组合来满足。

事不宜迟,让我们开始吧!

总体差异

使用方法/认证

因此,我认为最大的区别是——Tweepy 是一个用于访问官方 Twitter API 的 Python 库——因此,您需要申请开发者访问权限并从 Twitter 获得密钥。

  • 申请 Twitter 开发者访问的链接
  • 显示如何获取 Twitter API 密钥的链接

另一方面,Twint 是一个抓取工具,旨在抓取 tweets 并克服 API 的限制。

(注意:我不会进入关于网络抓取是否合法的讨论,或者 Twitter 的 TOS 关于抓取的说法。这只是对每个工具的讨论。)

证明文件

Tweepy 的文档在我看来,是顶尖的。它的文档包括从身份验证到流的所有教程,还包括所有方法的 API 参考。

从零经验开始,您应该能够立即开始使用 Tweepy,立即下载时间线、用户信息或执行搜索。

另一方面,浏览 Twint 的文档会给你一种感觉,觉得这个包已经超过了文档的速度,或者他们只是还没有找到时间。

有趣的是,twint 可以从 shell 命令行使用——因此,如果用户愿意,他们可以直接运行 Twint,而无需进入 Python shell 或编写 Python 脚本。

这一切意味着什么?实际上,如果你想做的唯一的事情是收集大量的 Twint 可能是一个更好的工具,而 Tweepy 更适合收集更丰富的元数据,对于那些使用官方 API 的人来说,它具有灵活性和潜在的可扩展性。

这可能还是有点抽象。让我们继续看一些更具体的例子。

抓取推文

与 Tweepy

一旦你建立了你的开发者账户,你的密钥和令牌——这段代码片段将为你提供一组推文——在这种情况下,我将从勒布朗·詹姆斯的推特账户中抓取 200 条最新推文。

import tweepyauth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

screenname = 'KingJames'
tweets = api.user_timeline(screenname, count=200)

带 Twint

要用 Twint 做同样的事情,您实际上可以从命令行/shell 运行这个命令:

twint -u KingJames --limit 200 > testtwint.txt

要在 Python 中做到这一点,应该是这样的:

import twintc = twint.Config()
c.Limit = 200
c.Store_csv = True
c.Username = usernamec.Output = fname
twint.run.Search(c)

所以这两者都相对简单。它们都或多或少地包含了你可能想知道的关于每条推文的所有信息。

Tweepy 用这些列生成数据:

['created_at', 'id', 'id_str', 'full_text', 'truncated', 'display_text_range', 'entities', 'extended_entities', 'source', 'in_reply_to_status_id', 'in_reply_to_status_id_str', 'in_reply_to_user_id', 'in_reply_to_user_id_str', 'in_reply_to_screen_name', 'user', 'geo', 'coordinates', 'place', 'contributors', 'is_quote_status', 'retweet_count', 'favorite_count', 'favorited', 'retweeted', 'possibly_sensitive', 'lang']

另一方面, Twint 用这些列生成数据:

['id', 'conversation_id', 'created_at', 'date', 'time', 'timezone', 'user_id', 'username', 'name', 'place', 'tweet', 'mentions', 'urls', 'photos', 'replies_count', 'retweets_count', 'likes_count', 'hashtags', 'cashtags', 'link', 'retweet', 'quote_url', 'video', 'near', 'geo', 'source', 'user_rt_id', 'user_rt', 'retweet_id', 'reply_to', 'retweet_date', 'translate', 'trans_src', 'trans_dest']

对,是很多列。很混乱。但好消息是,这两组或多或少是相同的。他们必须这样,因为理论上他们都从 Twitter 上下载相同的数据。

性能差异

根据我的经验,在任何文本处理方案中,抓取推文所花的时间或多或少是无关紧要的。在我的体验中,Twint 要慢一点——这对我来说是有意义的,因为它利用 Twitter 的搜索功能进行抓取,而不是通过 Twitter 的原生 API。

这就引出了我的下一个观点…

限制

Tweepy 的最大限制是 Twitter API 的限制。Twitter 的 API 有各种限制,取决于你的账户等级(定价),最重要的是,Twitter 的 API 限制你在一个时间线内只能发布最后 3200 条推文。

另一方面,Twint 的主要限制是,它真的只是为了抓取推文而设计的,仅此而已。如果你想与 Twitter 互动——发布推文、屏蔽/屏蔽他人、发送 DM 等——这些都是 Twitter API 的领域,你应该求助于 Tweepy。

其他使用案例

正如所预示的那样,除了抓取一堆推文进行分析之外,对于几乎所有其他用例,我都会推荐 Tweepy 而不是 Twint。还有哪些用例?这里有一些例子。

自动跟踪

也许你想偶尔确保跟踪跟踪你的每个人:

auth = tweepy.OAuthHandler("consumer_key", "consumer_secret")
redirect_user(auth.get_authorization_url())
auth.get_access_token("verifier_value")
api = tweepy.API(auth)for follower in tweepy.Cursor(api.followers).items():
    follower.follow()

自动转发

也许你想建造一个机器人,当提到它的名字时,它会自动转发——你很幸运,因为这个机器人已经在这里被建造了(由查尔斯·胡珀)。

在线教程

或者你可能想跟随这个关于 RealPython 的教程。,并了解他们如何制作可以根据你的意愿自动收藏或转发的应用程序。

Twitter API 不仅提供了大量的例子,还提供了大量的例子来构建你自己的应用。这在 Twint 中是不可能的。Twint 或多或少做一件事,而且做得很好。但仅此而已。

推荐

还记得我说过我建立了自己的 Twitter 数据分析应用程序(http://tweetdash.jphwang.com)?嗯,我的经验是 Twint 是一个很好的工具,可以为构建这个演示应用程序获取数据。

另一方面,学习和使用 Twint 的过程非常痛苦,因为它的文档非常少。当我试图做示例代码中没有显示的任何事情,或者偏离示例代码时,它需要的时间比我使用 Tweepy 时多几个数量级。

使用 Tweepy,我可以依赖它的官方文档、其他人的教程或示例项目。和以往一样,你的里程可能会有所不同,但这只是我的经验。

所有这些都是说尽可能多地使用 Tweepy 只有当你在获取原始推文方面碰壁时,看看 Twint 是否可以替代。我认为这样可以省去很多麻烦,而且很少会需要比 API 允许的更多的数据。

今天到此为止。

如果你喜欢这个,比如说👋/关注 twitter ,或点击此处获取更新。如果你错过了,看看这篇关于用 Plotly Dash 构建 web 应用的文章:

[## 使用 Python 在几分钟内构建一个 web 数据仪表板

通过将您的数据可视化转换为基于 web 的仪表板,以指数方式提高功能和可访问性…

towardsdatascience.com](/build-a-web-data-dashboard-in-just-minutes-with-python-d722076aee2b)

这个比较金融市场的 API:

[## 比较最佳免费金融市场数据 API

作为一名数据科学家,如果你想分析金融市场数据(股票市场或加密数据),请从这里开始

towardsdatascience.com](/comparing-the-best-free-financial-market-data-apis-158ae73c16ba)

因为一些私人的事情,我已经离开写作很多时间了,但是我很高兴回到这里。:)下次见!

你的 ML 论文的作者顺序应该是怎样的?

原文:https://towardsdatascience.com/what-should-be-the-order-of-authors-in-your-ml-paper-726a2937ec41?source=collection_archive---------15-----------------------

回答这个问题有时比 P=NP 问题更难。

来源

模糊的、主观的、有争议的——这些是人们用来描述他们按照正确的顺序排列作者的逻辑的词语。事实上,每个人都需要估计其他人应得的荣誉,同时最好不要大声说出来,因为这会在作者之间造成紧张,分散他们的研究注意力,然后以某种方式默默地同意,是的,这个顺序是有意义的。

所以我问那些拥有数百份出版物的大老板们,他们是如何解决这种情况的,从我得到的信息来看,似乎每个人都有自己的特别方法,很少有每个人都同意的事情。总的来说,我仍然没有最终的方法来分配学分,然后根据他们应得的学分来放置作者,所以如果你知道一个,请给我发消息。但至少我知道我不是唯一一个问这个问题的人,下面是一些值得一问到底的问题的答案。

ML 论文的顺序重要吗?

有点像,但以一种令人困惑的方式。基本上每个人都同意 ML 论文的第一作者是最值得的人,这个人做了大部分的工作,实验,数字,表格——他接触了所有的东西,这是他的宝贝。他不仅在提交前完成了大部分工作,而且在接受后还负责回复电子邮件、修复 bug 和开源代码。这与数学等其他学科不同,在其他学科中,顺序是按字母顺序排列的,除非放在相应的部分,否则贡献是隐藏的。

如果只有一个作者(啊,梦),事情就简单了,但实际上,通常有 2、3、5 或 10 个其他的合著者。那么他们呢?好吧,让我们首先处理主管,也就是“为演出付钱的人”。一般来说,似乎最后一个位置是一个甜蜜点,是留给导师的,除非你的论文有几个导师。那么如果人多怎么办呢?

不同的选择。有人说最后一个是第一作者的导师,有人说你应该按辈分来对待他们,把大的放在最后。对于一些人来说,这个问题应该在主管之间私下讨论,但底线是,对于这种能力的人来说,这可能没什么关系。

不过,重要的似乎是人们对论文作者数量的看法。有人说 2 个人,5 个人,或者 50 个人——都一样,论文做好了,价值没有被稀释。对于这样的人来说,如果有一个随机的怪人出现在报纸上,因为他的笑话很有趣,嘿,他毕竟是一个好人,这其实并不重要。相反,一些人认为作者越少,每个人得到的价值越多,2-3-4 个作者是最佳数量,除非有一个大型强子对撞机来支持一些疯狂的假设。因此,取决于你属于哪个阵营,左派还是右派,要么你认为“是的,让我们邀请所有人来参加聚会”,并根据他们的贡献在中间排序,要么你认为“世界应该知道这是我们的报纸”,所以让我们非常精确地知道谁做了什么。

好了,订单很清楚了。那么,学分分配呢?

这也是一个非常有偏见的观点,但非正式地说,论文作者要么是厨师(如主管),要么是工人(如学生),每个人都有自己的一套职责,并因此得到分数。

厨师带领工人去一家新的出版社。(图片来源

厨师来说,一系列的职责是清楚地知道应该完成什么,提供资源,协调工人,解决冲突,引导团队朝着正确的方向前进,等等。厨师被放在名单的最后,所以虽然我们可以在每个特定的案例中计算他们的积分,但他们的位置不会有太大的变化。

相反,对于工人,信用分配更加微妙。有实验,有小有大,有数字,有文字,有想法,有定理要证明,有调度,还有成吨的其他细节。天哪,当工人真不容易。很难估计哪个更重要,但这里有一个我用来粗略估计学分的启发式方法。

模型和主要实验= 40%

支持性主张和次要实验= 10%

文本和演示文稿= 15%

理论和分析= 30%

想法、时间安排、动机= 5%

当然,并不是所有的论文都有理论部分,在这种情况下,你有更多的实验,这是值得表扬的。当然,在其他情况下,这是一个定理,在这种情况下,实验只是支持它。但是你得到的思路是:把工作按桶拆分,给每个桶分配权重,得到权重之和作为每个合著者的功劳。

同样取决于你的阵营,你可以决定将一个合著者纳入论文的门槛(或者有一个正式的理由去掉那个问了太多问题的可怜家伙)。你总共得了 20%,你被录取了。你达到了 50%,获得了第一名。但更有可能的是,第一个作者完成了近 80%,剩下的将在 5 个粉丝之间分配。

最后,也许最重要的事情是你的论文被接受并被广泛引用,对于一篇论文来说,你的立场可能并不重要。随着时间的推移,在你周围建立一个值得信任的团队是非常重要的,它将无缝地解决这样的问题。所以,建立你的关系网,祝你的研究好运!

P.S .我会继续写关于机器学习、论文和所有这些爵士,所以如果你有兴趣,请在 medium 上关注我或订阅我的 电报频道 我的 twitter

接下来该读什么?

原文:https://towardsdatascience.com/what-should-i-read-next-f02a16bec832?source=collection_archive---------41-----------------------

一个使用 surprise 的协同过滤图书推荐系统

苏珊·尹在 Unsplash 上的照片

推荐系统快速介绍

推荐系统是一个强大的工具,是亚马逊、网飞、Spotify 和许多其他成功公司的核心。它们旨在预测用户对产品或项目的评分或偏好,基于的标准包括用户搜索过的项目、过去评分较高的项目或他们喜欢的歌曲或电影。目标是向用户展示他们更有可能参与或购买的新商品。

有不同的方法来实现推荐系统。它们基本上分为基于内容的和协同过滤系统。基于内容的系统是根据项目本身的特征信息构建的。它是当你被提供“像这样的其他项目”时你所看到的。它们可能非常有用,因为用户可能喜欢与他们正在搜索的书或电影相似的另一本书或电影。这种类型的系统的一个缺点是一些人工或半人工标记是必要的。

另一方面,协同过滤系统基于用户对项目的评级。它们是通过使用用户对项目的评级集合来计算的。其背后的思想是相似的用户将有相似的偏好,并且用户有喜欢彼此相似的项目的倾向。这种类型的推荐系统可以使用两种不同的方法来计算这种相似性,我们将在这篇文章中尝试这两种方法。这种类型的系统的一个缺点是所谓的冷启动,这意味着系统需要相当数量的初始用户评级,以便能够做出良好的预测。

目前使用的最先进的推荐系统应用几种不同方法的组合来给出最准确的结果,包括自然语言处理和卷积神经网络,但在这篇文章中,我将带你通过一个简单的协同过滤推荐系统,应用一个叫做 surprise 的伟大库。

来源: KDnuggets

所以回到我手头的问题,接下来该看什么书?为了回答这个问题,我们将使用 surprise 和在 Kaggle 上找到的这个数据集构建一个简单的协同过滤推荐系统,该数据集由 53,424 个独立用户对 10,000 本书的大约 600 万个评级条目组成。除了评分数据,我们还可以访问书籍的元数据、书籍类型和其他标签,以及用户标记为“待读”的书籍。

协作过滤系统有两种不同的工作方式。基于记忆或邻域的协作过滤方法试图量化用户和项目彼此之间的相似程度,然后基于该相似性度量提供前 N 个推荐。另一方面,基于模型的方法基于这样的概念,即用户的偏好可以由少量的隐藏因素或潜在变量来确定。我们可以使用单值分解(SVD)来帮助提取这些潜在因素,帮助我们理解用户和项目之间的关系。它将我们的任务转化为一个优化问题,我们希望最小化预测中的误差。

用惊喜创造推荐系统

首先,如果你没有惊喜,你需要安装它。这就像在您的终端上运行pip install surprise一样简单。惊喜带有两个内置数据集,便于练习,但也支持使用您自己的自定义数据(注意,它不支持隐式评级或基于内容的信息)。我们将加载我们的数据,在我们为建模做准备并开始该任务之前,我们必须进行一些数据探索和分析。人们应该在一般的数据分布中寻找空值、异常值等等。

我加载了评级数据集和图书元数据。我们的评分数据没有空值,每个用户的评分分布接近正常,每个用户的平均评分数为 111.87 本书,每个用户评分的中位数为 111 本书。

另一方面,每本书的收视率分布,正如这类问题所预期的那样,是一种长尾分布。少数几本书很受欢迎,收视率很高,而大多数书的收视率较低。每本书的平均评分数和中值评分数之间的差异(分别为 597.65 248)证实了这一点。这就是为什么推荐系统如此重要和有用的原因!帮助用户发现那些不太受欢迎的书,如果他们知道这些书,他们肯定会喜欢的。

这本书的评分从 1 到 5 不等。我想知道 Goodreads 用户在他们的评级中有多挑剔。让我们看看收视率分布是否不平衡。

该图显示,用户在评分方面相当慷慨,很少有书被评为低评分。看起来他们的书友会运气不错!

数据科学家将在数据探索和分析上花费更多的时间,但是为了这篇文章的简洁,我们将继续从建模开始。要想惊喜地使用我们的数据,我们需要将其加载到正确的格式中。您需要用您的评级标准定义一个阅读器,并通过正确的列加载您的数据。

# define reader
reader = Reader(rating_scale=(1, 5))# load dataframe into correct format for surprise library
data = Dataset.load_from_df(ratings[['user_id', 'book_id', 'rating']], reader)

接下来,我们将数据分成训练集和测试集,以评估我们的模型并避免数据泄漏。我正在分离 20%的数据进行测试。

# Split into train and test set
trainset, testset = train_test_split(data, test_size=0.2, random_state=0)

您可以检查数据中用户和项目的总数。

# confirm number of items and users in data
print('Number of users: ', trainset.n_users, '\n')
print('Number of items: ', trainset.n_items, '\n')Number of users:  53424 

Number of items:  10000

基于记忆或邻域的方法

我们将开始尝试一种基于邻域的方法。由于我们的用户比条目多,我们将通过计算条目间的相似性来解决这个问题。另一种选择是计算用户之间的相似性。我们可以使用不同的度量来计算相似性,我们知道不同的度量会产生不同的结果。我将尝试使用两个相似性度量标准——余弦相似性和皮尔逊相关性——以及来自 surprise library 的基本 KNN 模型,看看哪一个性能更好。我们将使用均方根误差(RSME)作为我们的评估指标。

# define a cosine metric for item-item
sim_cos = {'name':'cosine', 'user_based':False}# define and fit a basic KNN model with a cosine metric
basic = knns.KNNBasic(sim_options=sim_cos)
basic.fit(trainset)# make predictions
predictions = basic.test(testset)# check accuracy
accuracy.rmse(predictions)RMSE: 0.8827

现在,我们将使用皮尔逊相关相似性度量进行同样的操作。

# define fit and evaluate a KNN basic model with pearson correlation metric
sim_pearson = {'name':'pearson', 'user_based':False}
basic_pearson = knns.KNNBasic(sim_options=sim_pearson)
basic_pearson.fit(trainset)
predictions = basic_pearson.test(testset)
accuracy.rmse(predictions)RMSE: 0.8724

太好了,皮尔逊相关性似乎对我们的数据更有帮助。我们还可以尝试使用其他更先进的模型:KNN 均值模型,它考虑了每个项目的平均评级,以及 KNN 基线模型,它考虑了基线评级(全局均值)。让我们看看他们的表现。

# KNN with means model
sim_pearson = {'name':'pearson', 'user_based':False}
knn_baseline = knns.KNNWithMeans(sim_options=sim_pearson)
knn_baseline.fit(trainset)
predictions = knn_baseline.test(testset)
accuracy.rmse(predictions)RMSE: 0.8406# KNN baseline model
sim_pearson_baseline = {'name': 'pearson_baseline','user_based':False}#'shrinkage':50, 'min_support':5, 
knn_baseline = knns.KNNBaseline(sim_options=sim_pearson)
knn_baseline.fit(trainset)
predictions = knn_baseline.test(testset)
accuracy.rmse(predictions)RMSE: 0.8371

基于模型的协作过滤

现在让我们尝试一种不同的方法,一种基于矩阵分解的方法,带有基于模型的协作过滤,看看它是否能更好地处理我们的数据。

# define a base singular value decomposition model
svd = SVD()# fit and test algorithm
predictions = svd.fit(trainset).test(testset)# evaluate model
print(accuracy.rmse(predictions))RMSE: 0.8306

这已经比我们最好的基于邻居的模型好一点了。我们可以尝试用网格搜索来微调我们的超参数,这可以进一步提高我们的模型性能。我还想将我的数据的一部分作为验证集,一部分作为未知的测试集,我们将使用它们进行预测。做这件事的方法是从惊奇库文档这里复制的。

raw_ratings = data.raw_ratings# shuffle ratings
random.shuffle(raw_ratings)# A = 90% of the data, B = 20% of the data
threshold = int(.8 * len(raw_ratings))
A_raw_ratings = raw_ratings[:threshold]
B_raw_ratings = raw_ratings[threshold:]data.raw_ratings = A_raw_ratings  # data is now the set A# define parameter grid and fit gridsearch on set A data
param_grid = {'n_epochs': [5, 10], 'lr_all': [0.002, 0.005]}
grid_search = GridSearchCV(SVD, param_grid, measures=['rmse'], cv=3)
grid_search.fit(data)best_svd = grid_search.best_estimator['rmse']# retrain on the whole set A
trainset = data.build_full_trainset()
best_svd.fit(trainset)# Compute biased accuracy on A
predictions = best_svd.test(trainset.build_testset())accuracy.rmse(predictions)RMSE: 0.7786# Compute unbiased accuracy on B
testset = data.construct_testset(B_raw_ratings)  # testset is now the set B
predictions = best_svd.test(testset)
print('Unbiased accuracy on B,', end=' ')
accuracy.rmse(predictions)Unbiased accuracy on B, RMSE: 0.7924

这是一些很好的改进。我们现在可以使用这个模型为新用户做预测,并为每个用户推荐 N 个商品。令人惊讶的文档向我们展示了如何使用我们最好的模型来做到这一点。

如果你有兴趣查看这篇文章所基于的全部代码,你可以在 Github 上找到它

哪些 SQL 课程没有让我们为真实世界的数据集做好准备

原文:https://towardsdatascience.com/what-sql-course-didnt-prepare-you-for-real-world-datasets-4a31da8bc150?source=collection_archive---------58-----------------------

从商业角度使用 SQL 进行快速数据验证的指南

在您的数据职业生涯中,您可能听说过 SQL,或者对它进行了深入的研究,以至于了解了一切,甚至掌握了表连接的概念。

当你进入真实世界的数据集时,惊喜就来了。大多数时候它们并不干净,到处都有丢失的值和重复的记录。无论我们身处哪个行业,我们都经历过这种情况——花大量时间调查违规行为,只是为了发现底层数据是罪魁祸首。

尽管有这些挑战,我们所经历的大多数 SQL 课程倾向于用干净的数据集来教导我们,而很少给我们这种现实的指导。

布鲁克·卡吉尔在 Unsplash 上的照片

鉴于我们角色的一个方面是确保业务决策基于一天结束时的准确分析和上述挑战,进行数据检查和验证无疑是现实世界数据集不应忽视的基本概念之一。它与决定任何分析和随后的商业决策成败的质量有关。

现在,您已经掌握了 SQL 技能,让我们看看如何将 SQL(及其带来的逻辑)和业务视角结合在一起的一些基本想法,以告知我们如何在任何分析之前执行数据检查和验证。

首先,让我们设置一些零售业务的背景

照片由 Mehrad Vosoughi 在 Unsplash 上拍摄

在数据世界中,通常被认为等同于你在货架上看到的产品的东西或多或少是一个产品表。

如果我们仔细看看产品表,它通常包含产品 ID(也称为产品条形码)和相关信息,如产品描述和产品类别,当然数据字典对于查看使每个数据行彼此唯一的关键字段非常有用。然而,在现实中,如果获得它很困难,并且您在时间上很紧张,该怎么办呢?

最终,我们需要确保数据的准确性,一个快捷的方法是检查产品记录中是否有重复。为此,我们根据经验推测 product_id 是关键字段,并使用 COUNT()和 COUNT(DISTINCT)如下:

**SELECT** **COUNT**(product_id), **COUNT**(**DISTINCT** product_id) **FROM** product;

如果我们的猜测是正确的,我们应该期望两个数字相等,因为这意味着没有重复,并且每一行都是唯一的。

在现实世界中,我们希望使用这个经过验证的表进行连接,并对主要的客户交易进行进一步的数据分析,例如,查看给定客户交易中的产品类型。为了完整起见,我们还假设希望保留交易表中的所有记录,以查看是否有任何交易产品没有记录在产品表中。然后,在连接之后,可以在结果表上扩展上面相同的验证概念,如下面的 SQL 所示。理想情况下,计数应该是相同的,假设列 transaction_id 对于事务表中的所有行都是唯一的。

**SELECT **  **COUNT**(*), **COUNT**(**DISTINCT** t.transaction_id)
**FROM**     transaction t
         **LEFT JOIN** product p
         **ON** t.product_id = p.product_id;

但是如果这些数字不一样呢?

首先,不要妄下结论说数据是错误的,这背后可能有一些商业原因。也许您正在处理的产品表基于全球产品目录,这意味着可能有一种产品以相同的条形码(或产品 ID)在不同的国家销售,或者零售商只是简单地回收了他们的内部产品条形码,等等。

照片由粘土银行在 Unsplash 上拍摄

我们先来看看全球产品目录的案例…

处理大型数据集可能涉及到可以用自然分割线分隔的部分。对于全球或区域参与者,不同的市场可能是一个天然的分割线,我们可以使用它来分离数据集以进行不同的分析。有时,产品表作为包含所有市场中产品列表的单个表出现。在这种情况下,我们需要添加另一列来指示要测试的市场,我们的 SQL 现在将是:

**SELECT **  market
         , **COUNT**(product_id)
         , **COUNT**(**DISTINCT** product_id) 
**FROM**     product
**GROUP BY** market;

如果这为我们提供了每个市场的相同计数,那么您就已经成功了——产品表是按产品条形码和市场排列的。还要记住,在将该表联接回主客户事务以进行分析时,现在列 product_idmarket 都是必需的,因此联接时可能如下所示:

**SELECT **  *
**FROM**     transaction t
         **LEFT JOIN** product p
         **ON** t.product_id = p.product_id
         **AND** t.market = p.market;

如果数字仍然不相等,那么您需要查看其他列,并开始假设使每个数据行唯一的其他可能的字段。我希望你明白我的意思,这是关于观察数据,反复建立一个假设并测试它。

数据验证是一个迭代过程。它从设定一个假设开始,然后检验它。如果测试失败,应考虑额外的信息,并将结果反馈到更新的假设和后续测试中。(图片由作者提供)

现在我们来看第二个例子,一家零售商回收了他们的内部产品条形码…

有些人可能想知道这是怎么发生的。根据我的经验,一些零售商有他们所谓的“条形码回收”,这对于私人管理的产品来说很常见。想想看,当你购买一个羊角面包或超市自己制作的熟食时,没有所有超市都同意的通用产品条形码,因为它是在商店内制作的,而不是像国家品牌产品那样由通用的第三方供应商制造的。

通产省在 Unsplash 上拍摄的照片

一段时间后,您可能会看到这些条形码被重新用于另一种产品,主要是为了提高运营灵活性或避免额外的上市费用。这也是产品表中同一条形码下有 2 个本质不同产品条目的原因之一。

在这种情况下,我们想知道的是这些条形码生效的时间段,因为这使我们能够区分两个重复的条形码。同时,这为数据库设计带来了一些改进的机会,可以引入缓慢变化的维度——但这值得单独讲述。

回到这个话题,假设您现在有了重复产品条形码生效的时间段,如下所示。

该表显示了两个不同产品的两个记录的示例,这两个记录共享随着时间的推移被回收的相同产品条形码。有效时间段列显示每个应用的时间段。(图片由作者提供)

实现 SQL 验证的方式可能如下所示。这时,您假设使每一行唯一的是产品条形码、有效开始日期和有效结束日期的组合。

**SELECT **  **COUNT**(*)
         , **COUNT**(**DISTINCT** product_id + effective_start_date +
           effective_end_date)
**FROM**     product;

检查计数是否相等后,如何将经过验证的产品表联接回客户事务表,如下所示。

**SELECT **  **COUNT**(*)
         , **COUNT**(**DISTINCT** transaction_id)
**FROM**     transaction t
         **LEFT JOIN** product p
         **ON** t.product_id = p.product_id
**WHERE**    t.transaction_date
         **BETWEEN** p.effective_start_date **AND** p.effective_end_date

请注意,现在我们需要在 WHERE 语句中添加一个时间段条件,以确保为具有回收条形码的产品提取正确的产品信息,并且计数应该始终相等,否则这表明回收产品存在重叠的有效时间段,我们需要在开始分析之前纠正这一点。

总结一下…

格伦·卡斯滕斯-彼得斯在 Unsplash 上的照片

进行数据检查和验证是我们一切工作的基础。它与准确的业务决策背后的数据和分析质量直接相关。同时,不要在没有充分考虑背后的商业原因的情况下,仅仅因为验证是这样说的,就妄下结论说数据是错误的。

尽管本文并不打算面面俱到,但我希望给出的几个示例能或多或少地阐明 SQL 或通过 SQL 显示的逻辑可以与业务角度结合使用来处理真实数据集的可能领域。

学校教给我们什么故事?

原文:https://towardsdatascience.com/what-stories-do-schools-teach-us-43069c6dc040?source=collection_archive---------46-----------------------

公共核心英语课程的统计分析

自教育倡议于 2010 年启动以来,共同核心州标准已经决定了全国公立学校的课程。特别是,这些指南已经整理了小学、初中和高中的图书馆书架,通过精心挑选的不到 80 本推荐书籍,有效地塑造了未来的领导者和书虫。

作为书籍和数据新闻的爱好者,我受到启发,尝试“按数字”看待这些共同的核心标准。考虑的因素包括一本书作者的性别、出版日期以及基于 Goodreads 评论数据的受欢迎程度。

这些标题的完整列表可以在PDF中找到,也可以通过本文底部的交互式表格找到。我还制作了最终的数据集,用于生成可用的分析和可视化这里。

性别

虽然共同核心州标准倡议(CCSI)适用于从幼儿园开始的学生,但本分析将侧重于该计划为 6 至 12 年级学生提出的建议。英语语言艺术推荐可以分为两类:“文学:故事,戏剧,诗歌”和“信息文本:文学非虚构和历史,科学和技术文本。”同样值得注意的是,通用核心标准已经被大多数(但不是全部)州采用

在这七年的教育中,共同核心标准推荐学生阅读 38 种特定的文本。在这份名单中,26%的书是由女性写的(10/38),74%的书是由男性写的(28/38)。

图片作者:斯潘塞·迪恩

当只考虑信息文本时,这种性别差异变得更加明显,这些信息文本包括原始资料和历史文献,如“弗雷德里克·道格拉斯的生活叙事”或亚伯拉罕·林肯的“葛底斯堡演说”在所有的信息文本中,只有一篇是女性写的——安·皮特里的《哈丽雅特·塔布曼:地下铁路的售票员》

反之,文学类内的比例更为均匀。 12 课文是男人写的,而 8 是女人写的。

图片作者:斯潘塞·迪恩

出版日期

接下来,我检查了推荐文本是什么时候写的。下面的可视化显示了一个时间线,其中书籍被分成 50 年的跨度。如图所示,公共核心课程中的大多数题目都是在 19 世纪或 20 世纪编写的。出版日期的中间值是 1920 年(T0)和 1920 年(T1),尽管如果忽略《麦克白》(1592)的异常值,这个中间值会上升到 1925 年(T3),正好是司各特·菲茨杰拉德出版《了不起的盖茨比》的那一年

这张图表也显示了更多的书籍是如何从特定的历史重要时代中挑选出来的。例如,三个信息文本围绕美国独立战争(1775-1783)的日期聚集在一起。

完整的 38 本书中,只有一本出版于 21 世纪:裘帕·拉希莉 2003 年的小说《同名》

图片作者:斯潘塞·迪恩

流行

由于每年全国的学生都被分配这些相同的书籍,有些比其他的更能激发热情,我很好奇这些课程的重点到底有多受欢迎。为了这个任务,我求助于 Goodreads ,这是一个由用户生成评论和评级的在线图书数据库。

注:由于 Goodreads 数据缺失,9 篇文章(包括一些文章和演讲记录)被排除在本次分析之外。

平均而言,Goodreads 用户对普通核心书籍的评分为 4.02 分(5 颗星中的 4.02 分)。榜单上最受欢迎的标题是马丁·路德·金的《来自伯明翰监狱的信》,排名 4.53 位。最不受欢迎的是劳伦斯·耶普 1975 年的小说《龙翼》,在 3500 多条用户评论中,这部小说平均获得了 3.53 颗星。

讨论和方法

尽管确切的英语语言艺术课程在不同的学区有所不同,但从这份建议清单中仍然可以得出一些值得注意的结论,该清单声称“让所有学生在高中毕业时为大学、职业和生活的成功做好准备”很明显,虽然似乎做出了一些努力来呈现更多样化的观点(从莎士比亚到艾米莉·狄金森,再到洛林·汉斯贝里),但女性撰写的故事和历史在共同核心目录中的代表性不成比例,特别是在信息类文本中。

学校总是可以在他们选择教授的角度上争取更多的多样性。这一目标的重要性不仅体现在性别上,还体现在种族、性和国籍等话题上。关于多元文化和国际文学,通过儿童书籍教学中心主任横田顺子写道:“很明显,多元文化文学可以而且应该成为学生学习的核心,精心挑选的高质量文学可以对学生的自我意识和他人意识产生影响。"

熟悉这份名单上的作者表明,大多数文本是由美国白人写的,但具体数字需要用更详细的数据集进行另一次分析。

对于我使用的数据集,信息首先直接从公共核心网站中提取,然后在 Excel 中进行清理和预处理,最后通过独立研究添加新字段(主要是在互联网上搜索作者简历和维基百科页面)。所有图表都是用 DataWrapper 和 Adobe XD 制作的。

结论

如果某个学校采用了共同核心制定的标准,他们的英语学生在 6 到 12 年级之间将会阅读 38 本书。在这 38 本书中,10 本将由女性撰写,28 本由男性撰写。这些作品中的大部分,无论是历史文献还是文学经典,都将在 19 世纪或 20 世纪初至中期出版。他们最喜欢什么?根据 Goodreads 用户的说法,人们可能会说“来自伯明翰监狱的信”,或者米歇尔·沙阿拉的“杀手天使”

至于除了性别之外的作者多样性的测量,像种族这样的人口统计学不在这个项目的范围之内。然而,在这个问题上正在进行重要的研究。对于那些有兴趣了解更多关于课堂阅读中的表现的人,我建议去看看合作课堂中心和合作儿童图书中心,该中心出版儿童文学年度评论。

探索数据:

垄断的数据哪里出错了

原文:https://towardsdatascience.com/what-the-data-gets-wrong-about-monopoly-8fe8a6941c4e?source=collection_archive---------34-----------------------

使用马尔可夫链评估垄断中的获胜策略——并解决常见的误解

旅游当地在 Unsplash 拍摄的照片

[编辑:这里的是这篇文章中的结果的一个全面且完美的可视化,由 Garrhett Petrea 在 Tableau 中创建。]

对垄断策略的研究引发了关于如何最大化一个人获胜机会的无休止的讨论。由于大富翁游戏是由运气驱动的,游戏中少数能影响玩家的方面已经被研究得死去活来。或许不出所料,同样的结论不断冒出:橙色房产最好从不买公用设施买 3 套房子等等。

作为一个狂热的大富翁玩家,我自然很好奇这些结果是如何达到的,以及我是否可以自己复制它们。尽管我确实得出了一些相同的结论,我的分析在方法论和关注点上有三点不同于我看过的大多数作品:

  1. 着陆概率是从第一回合开始累积的:我认为前 10 回合内的着陆概率基本上是不相关的,因为玩家不太可能在游戏早期获得完整的颜色设置或建造房屋。
  2. 有一个投资收支平衡的重点:垄断是通过让其他玩家破产而赢得的;因此,给定资产的盈亏平衡点是次要的,它有助于导致对手破产。
  3. 交易的作用被忽视了:交易是垄断最重要的方面,玩家可以在其中做出战略决策。在这篇文章中,我的可行建议集中在对贸易交易进行数学评估,以取得成功。

我所有的代码和数据都可以在这里访问。Python、Excel 和 Datawrapper 被用来生成和可视化我所处理的数据。

将垄断建模为马尔可夫过程

模特垄断的复杂性可以归功于它的两个特点:a)机会和社区公益金卡和 b)滚动双打。我们可以使用蒙特卡罗方法来解决这个问题,但是确定相关概率的真实值的分析方法也是可行的。

首先,简要说明一下回合和掷骰子的情况:大多数回合(准确地说是 5/6)都以掷骰子结束。然而,如果掷出双倍,骰子必须在同一回合内再次掷出。连续掷出 3 次双打的玩家(在任何给定的回合中 P = 1/216)会直接进监狱。数据中已经考虑到了这一点。

平均圈数约为 1.2 圈。没有相关的理由来计算旋转而不是滚动,后者将有助于简化分析。

我的第一步是用 Python 创建一个 40x 40的转换矩阵,前三行如下。每行代表在给定不同起始位置的情况下,到达棋盘上每个空格的概率。绿色的 0 表示这个起始位置,前两行持有的非零值距离这个初始状态只有 2-12 个空格,代表不同的可能掷骰子及其不同的概率。

棋盘上的第三个空间恰好是公共空间。一个在公共空间的玩家在掷骰子后,面临着相似的落在 2-12 个空间之外的概率;然而,有 2/16 的社区公益金卡会将玩家送到棋盘上的其他位置。为了适应这种情况,我在每个空格的条目上加了 1/16(红色),然后每隔一个条目乘以正常进行的概率,14/16。

然后我将一个初始状态矩阵(Go 上开始的概率是 1)乘以转移矩阵 40 次,记录结果。排除前十次投掷(因为通常还没有建造房屋,所以它们无关紧要),我添加了每个给定空间的 31 个剩余着陆概率,以得出累积数字。然后我用这些除以 31 来确定每次投掷落在每个给定空间的真实概率。

我已经决定停在 40 点,因为这个来源表明,平均每个玩家的垄断游戏持续大约 30 回合,这相当于不到 40 回合。从我在 iOS 应用程序上玩“大富翁”游戏的个人经历来看,这似乎相当准确。

结果数据如下图所示,红色空间表示低着陆概率,反之亦然。为了增加最可能属性和最不可能属性之间的对比,我将最可能登陆的空间“监狱”和第二可能登陆的空间“围棋”都涂上了相同的绿色。这些概率包括玩家落地的任何空间,包括坐牢(尽管这导致在监狱中结束回合)。

我注意到的第一点是监狱空间是目前为止最常登陆的地方,这是由于去监狱的磁贴以及送玩家去那里的机会和社区公益金卡。数据中也有一些特性,如铁路 1 空间的着陆概率远远高于其周围环境。像这样的异常值通过将玩家发送到特定的空间,证明了机会和社区公益金卡在确定着陆概率中的重要性。

我已经用红色(低概率)到绿色(高概率)的比例在游戏板上可视化了相同的数据。为了更好地展示地产集之间着陆概率的变化,我从比例中排除了监狱空间,将其着色为与第二大热门空间 Go 相同的绿色。

作者图片

这让我更清楚地看到了橙色和红色的优点。然而,这种可视化是专门设计来增加数据点之间的差异。唯一真正影响游戏结果的是着陆概率如何影响预期租金。

计算每卷租金

通过将每个资产的着陆概率乘以其租金,可以确定预期租金/滚动。

您可以在此查看完整的数据集。如下表所示,我已经将每种颜色的物业的租金/租金加在一起。

虽然橙色和红色的场景是最常被参观的,但是黄色和绿色的场景会带来更多的租金/租金。令人惊讶的是,对于 4 栋房子或一家酒店来说,深蓝色套装的排名低于橙色。这是因为深蓝系列中只有两处房产——尽管每处房产的租金都很高,但深蓝系列作为一个整体消耗对手的速度比看起来要慢。

一个被数据推翻的普遍观点是,你应该总是首先升级一个集合中最昂贵的属性。例如,如果一个玩家在黄色的地产上各有三栋房子,并打算购买一栋额外的房子,将它放在黄色 1 上会比将房子放在黄色 3 上增加租金/掷骰数。然而,这种例外只在 110 种可能的排列中的 6 种中出现,所以升级一组中最昂贵的属性仍然是一个伟大的经验法则。

收支平衡

要达到收支平衡,对手掷骰子的次数只有在有其他可用投资的情况下才真正重要,可以使用下面的公式从租金/掷骰子中很容易地计算出来。

结果显示如下。这清楚地表明,建造房屋是获得房地产回报的唯一可行途径。然而,这些数字并不太现实。一个战略玩家会很快将租金收入再投资于购买更多的房子,这意味着需要时间来恢复最初花在某一特定财产上的现金是一个毫无意义的数字。

计算每局基本收入

每张牌的预期收入由 pass Go、两个税区和机会/社区公益金组成。因为通过运气和公益金获得/失去的钱取决于未知的变量,如玩家的数量,玩家是否拥有特定的财产等。所有牌的平均值大约相等。不管怎样,最后一个因素将被忽略。

以前的计算很容易用转移矩阵来实现。然而,通过围棋的平均掷骰数是一个更复杂的问题。为了回答这个问题,我用 Python 创建了一个蒙特卡洛模拟,它考虑了所有的纸牌和去监狱的空间。

通过蒙特卡洛模拟,确定了通过 Go 并获得$200(不坐牢,使玩家失去获得奖金的资格)所需的平均掷骰数为 5.86。

至于所得税和奢侈品税空间,每个空间的每卷预期付款是每卷着陆概率和在那里着陆损失的钱的乘积。

每卷的基本收入(垄断的未成熟版本的 UBI!)大约是 28 美元。如果一个玩家的对手共同拥有的财产的预期租金总额超过每局 28 美元,则该玩家平均每回合都会输钱。

与上面的租金/滚动表一起,28 美元的数字为一个直观的结果提供了支持:如果不拥有至少一套彩色电视机和建造房屋,就极不可能赢得垄断。这是因为,滚动滚动,一个对手将获得更多的钱传球去比他们将支付租金。

由于酒店的棕色组合的总租金/卷少于 28 美元,单独赢得棕色资产是极不可能的。除了酒店之外,浅蓝色的房子也是如此,其他的每处房产少于 3 栋的房子也是如此。

每个对手掷 28 美元是游戏早期和中期的一个基准。一旦玩家达到这个数字,现金的持续增加就不再有保证了。为了省钱,尽可能长时间呆在监狱里也可能成为一种策略。

租/掷同样有助于确定哪个玩家处于最有利的位置。交易会让你的租金/成交量比对手增加更多。以我的经验来看,双方最终都拿到全套彩色电视机的交换很常见;在每个玩家把他们的闲钱花在房子上之后,预测他们的租金/滚动将决定谁将处于有利的位置。

3 个外卖

  1. 购买和构建每套颜色的价格应与可用的现金量进行比较。这意味着没有颜色设置是游戏中“最好的”。例如,橙色和红色组的对手掷骰数最少,可以达到平衡。然而,如果你有足够的现金将绿色的房产升级到每套 3 所房子(1800 美元),这比购买橙色或红色的房子更好,因为绿色的房子需要更高的租金。**在个人策略的背景下,不要进行会让现金充裕的玩家满盘皆输的交易。相反,给一个现金匮乏的对手一整套——即使是橙色或红色——也不一定是坏事,只要它能让你迅速获得高租金/筹码。**话虽如此,但无可争议地存在一些不好的特性。浅蓝色的房子租金很低(直到酒店建成),深蓝色的房子少了一套房产,棕色的房子有上述两个问题。
  2. 如果你拥有另一套全彩色电视机(因此可以把你的钱花在其他投资上),你应该每处房产只买 3 套房子。否则,**升级到每家 4 套甚至酒店是最优的**。
  3. 你的对手越多,你就越愿意在交易中花更多的钱来获得你的第一套颜色组合,因为在游戏过程中会有更多的掷骰子。这意味着随着玩家数量的增加,保护你的现金储备就不那么重要了。相反,当只面对 1-2 个对手时,囤积现金非常重要。这也适用于其他属性。同时购买效用 1 和效用 2广泛认为是一个糟糕的决定,因为这些资产的盈亏平衡期分别是 90 和 81。然而,在 5 人以上的游戏中,90 次掷骰子相当于每个对手 19 次,这意味着公用事业可能会产生少量利润。

澳门图片社在 Unsplash 拍摄的照片

结论

垄断最终是一种平衡——试图提高自己的收入,同时保持足够的现金支付其他玩家的财产租金。也就是说,对平均租金/滚动的关注无疑揭示了游戏的独特视角。

虽然实际数字会随着每一次掷骰子而变化,但仍然有可能使用期望值的数学概念和一些关于一般游戏的合理假设来制定策略。

任何一个在第三个小时里已经厌倦了无休止地围着垄断商标打转的人都很清楚,这是一场消耗战。

关于机器翻译,数据告诉我们什么

原文:https://towardsdatascience.com/what-the-data-is-telling-us-about-machine-translation-ea987742403c?source=collection_archive---------28-----------------------

软件算法正在超越人类语言学家吗?

对神经机器翻译模型的状态以及它们如何相互比较以及与人类翻译进行简要的历史调查。

图片来源:Pixabay.com

神经机器翻译的最新发展会不会很快让人类翻译人员过时?为了回答这个问题,我们将简要调查一下机器翻译的当前技术水平。我们将考虑各种翻译引擎在翻译各种类型的内容时的表现,并考虑成功翻译外语存在的差异。我们将考虑历史趋势来评估这样一个普遍假设,即机器正在迅速缩小曾经将它们与人类语言学家分开的质量差距。我们将看看最近的一些发展,以评估它们在提高机器翻译准确性和性能方面的意义。

2015:机器翻译拐点

直到 5 年前,机器翻译还是基于短语的。一个算法将按顺序考虑一个段落。我们说话的时候这种语言已经被翻译了。基于短语的翻译方法的问题是没有文章上下文的初始知识。没有上下文,误解和不正确翻译的几率就会增加。这有点像盲人和大象的问题。如果一个人开始触摸躯干、腿、长牙和耳朵,他可能会误以为触摸的是哪只野兽。只有将所有的部分结合起来,一个人才能把握整体,即*完形*。

然而,从 2015 年开始,被称为神经网络的人工智能结构开始被应用于机器翻译任务。在这种方法中,要翻译的整篇文章都是通过数据结构和算法输入和处理的,用于各种内部和外部连接。这样,即使在处理单个部分、单词和句子之前,也可以通过语言和结构的联系来理解整体。

神经机器翻译技术的细微差别

在不涉及太多细节的情况下,神经机器翻译使用向量表示法——对于给定段落的单词和内部状态的“嵌入”和“连续空间表示法”。该结构比基于短语的方法更简单:基于整个源句子的深度学习和表示学习技术,单个序列模型一次预测一个单词。

起初,这是使用递归神经网络(RNN)完成的,该网络双向编码,然后解码以预测目标语言中的单词。后来,卷积神经网络(Convnets)在使用所谓的基于“注意力”的方法进行改进后,接替了 RNNs。

商业、社区和竞争中的神经机器翻译

到 2016 年,NMT 方法赢得了几乎所有的主要奖项。Yandex、IBM 和 PROMT AI 驱动的翻译工具现在使用神经网络。谷歌将自己的方法命名为 GNMT,并在谷歌翻译中使用。微软在它的翻译器和 Skype 中应用它的版本。哈佛大学的 NLP 小组发布了一个开源的 NMT (ONMT)。

近年来,脸书的人工智能小组利用数十亿 FB 用户的对话和帖子的无与伦比的数据库,在 2019 年第四届机器翻译大会(被称为 WMT)的几项任务中击败了竞争对手。扎克伯格的社交网络模型在新闻翻译的几项语言任务中赢得了第一名,包括竞争最激烈的英语到德语的任务。对于这个语言方向,它的翻译被 WMT 组织者宣布为“超人”:人类评估者比人类语言学家做的翻译更喜欢它们。

微软 NMT 的进步导致该公司在 2018 年宣布与专业人工翻译平起平坐,至少在困难的汉英翻译类别中是如此。尽管如此,这仍然是一个开放的领域,特别是在不太受欢迎的语言方面,波罗的海地区的新贵 Tilde 击败了谷歌、微软和其他公司,赢得了 WMT 2019 年英语-立陶宛语比赛。

数据科学与翻译质量评估

具有讽刺意味的是,对 NMT 数据质量的评估是由人类专家通过比较机器和人类的翻译来完成的。这些通常通过主观评分来完成。实际上,人类专家被要求站在反对他们物种的一边。越来越多的结果表明,物种忠诚度退居专业语言评估之后。

人类语言学家对数据科学的态度本质上并不乐观,因此人们倾向于认为统计结果甚至可能偏向于人类翻译。这篇文章太短,无法真正深入了解这些数字,但取代 BLEU 的测量标准是一种叫做 LEPOR 的东西。这种测量方法将 NMT 相互之间以及与人类进行比较。分析公司 INTENTO 在 2019 年 1 月的一项研究中比较了 48 种语言对的表现,将谷歌和亚马逊评为覆盖范围最好的。新贵 DEEPL 在少数几种语言中表现最好,而 YANDEX 做得最划算。

机器语言翻译者注定是最好的人类语言学家吗?

翻译的未来会被神经网络驱动的 AI 机器人所主宰吗?对于新闻、天气、体育和其他广泛使用的高度结构化的语言格式来说是如此,对于政府、法律和金融报告来说也是如此。可能这一点已经过去了。机器和数据科学似乎还远远达不到的领域仍然是创造性写作:诗歌、小说和非小说。这些算法还有很长的路要走,即使有最好的编程和众所周知的百万(十亿?万亿?)猴子。

就连非正式对话的翻译似乎也将被机器所主宰,步脸书处理用户聊天、评论和帖子的后尘,不管用户是否知情。下一代神经机器翻译引擎的真正考验可能是对被称为色情短信的新型在线对话的翻译。如果机器翻译的色情短信比人工翻译更能引起评价者的注意,我们可能真的有理由担心。

怎么回事?

原文:https://towardsdatascience.com/what-the-f-8fb700b5044f?source=collection_archive---------51-----------------------

来源

好好看看机器学习的‘f’字,以及为什么不能忽略它!

声明:所有表达的观点都是我自己的。

我知道你很想知道这个“f”字到底是什么。别走开,我们很快就会到达。我可以马上告诉你的一件事是,不管你对机器学习的熟悉程度如何,理解这个‘f’字将有助于你理解大多数机器学习是怎么回事。

在此之前,我们先来玩一点角色扮演。你是一名数据科学家,你的初创公司让你与一名营销同事合作,以提高公司产品的销量。你必须建议“营销人员”如何调整三种不同媒体渠道的广告预算——电视、广播和报纸。

来源

你看一下过去的数据(图 1),你可以用肉眼看出,很明显,你在每个媒体渠道——电视、广播和报纸——上投入的广告金额对产品的销售有影响。

图 1:每个广告媒体的销售额(以千单位计)与预算(以千美元计)

作为一名数据科学家,您希望了解并解释这三者是如何共同影响销售的。换句话说,我们希望将销售建模为电视、广播和报纸预算的 函数 。是的,这就是我们难以捉摸的“f”字——函数。

“销售是电视、广播和报纸预算的一个功能”的说法。

这个 f 是什么意思?

简而言之,你可以把 f 想象成一个输入 X 产生输出 y 的东西,一个很好的类比例子就是洗衣机。你把脏衣服(X)放进洗衣机(f),它会把洗好的衣服(Y)还给你。

来源

在产品销售和广告媒体预算的上下文中,函数 f 将电视、广播和报纸预算(分别由 X1、X2 和 X3 表示)作为输入,并将销售额 Y 作为输出。(我们以组合形式表示 X1、X2 和 X3——作为向量 X)

剧透警报!许多机器学习实际上只是提出一个好的 f,它可以接受一些输入数据并返回一个可靠的输出。

我们为什么要这个 f?

来源

我们想找一份好工作有三个主要原因:

  • 有了一个好的 f,我们可以输入所有 3 种媒体的预算,并预测销售额。
  • 我们可以了解哪些预测因素(如电视、广播、报纸预算)对 y 有重要影响。我们可能会发现,在报纸上花钱实际上是一种浪费,因为报纸广告并不能大幅提高销售额。
  • 我们也许能够理解*每个预测因子是如何影响 y 的。例如,我们可能会发现投资电视广告比投资报纸广告有效 5 倍。*

玩笑开够了。….我如何找到这个 f?

在回答这个问题之前,我们需要问自己以下问题:

在广阔绚丽的宇宙中,是否存在某种完美的 f?

来源

嗯,也许不是一个“完美”的 f,但有一个理想/最佳的 f。如果我们看一下图 2,我们会注意到一些奇怪的事情——对于 X 轴上的一个点(报纸预算),在某些情况下似乎有多个对应的 Y(销售)值。例如,对于图 2 中绘制的数据,对于 x = 6.4,在 Y 轴上有两个相应的值:y =11.9 和 y = 17.3。

*图 2:销售额与报纸预算*

因此,理想函数可以简单地是对应于特定 x 的所有 y 值的平均值,换句话说,对于上图:

用更“数学”的术语来说,所有 Y 在任一 X 处的平均值称为期望值 E(Y)。因此,取任意 X 处所有 Y 值的平均值的过程可以是我们的“理想”函数。我们的理想 f 可以用下面的方式来表达:

(不要担心 Y|X…这只是“给定 X 等于某个特定值 X,Y”的一种“数学”说法

好吧…但是为什么我们需要机器学习呢?

可悲的是,因为我们生活在“现实世界”里。

来源

*在“现实世界”中,我们并不具备使用上述平均思想可靠估算 Y 所需的所有数据。甚至对于销售广告数据,你可以看到在图 2 中,对于 x=77.5,x=95,x=110 等,没有相应的 Y 值。*

解决缺失数据问题的一个简单方法是使用邻域的概念。

来源

这意味着,不是严格在 x=77.5 取 Y 值的平均值,我们可以取在 x=77.5 附近的所有 Y 值的平均值。因此,可能的邻域可能是这样的,从 x=75 到 x=80(参考图 3 中的蓝色垂直线)。

*图 3:对于 f(77.5),我们取 75≥x≤80 的所有 Y 值的平均值*

我们的定义和符号有一点改变,以反映我们不再局限于恰好出现在给定点 X=x 的 Y 值,而是现在查看出现在 X=x 的 邻域 中的 Y 值

这很好,直到我们遇到两个主要问题:

机器学习拯救世界!

为了不受上述两个问题的约束,我们转而使用机器学习来估计 f。虽然有各种各样的机器学习模型可供选择,但让我们考虑一个简单而有效的模型——线性回归模型。在线性回归模型中,输入 X1(电视预算)、X2(广播预算)、X3(报纸预算)分别乘以 w1、w2 和 w3,然后相加得到 y

在上面的等式中,w0、w1、w2、w3 是参数,其值通过训练和拟合数据上的模型来学习。换句话说,这些参数的值是通过“观察”数据和反复猜测来改变的,随着时间的推移,猜测变得越来越准确,直到我们得到一个足够好的 f。

结论

选择哪个(些)模型来估计 f、如何执行学习过程以及“足够好”的 f 意味着什么是机器学习实践者在处理特定问题时反复研究的重要问题。机器学习实践者通常依靠经验、领域知识和经验证据来尝试回答这些问题。尽管如此,不管问题的背景和性质如何,找到一个好的 f 是使用机器学习进行预测、推理和解决问题的基础。

参考/灵感

  • 加雷斯·詹姆斯,丹妮拉·威滕,特雷弗·哈斯蒂,罗伯特·蒂布拉尼。统计学习介绍:在 R 中的应用。纽约:施普林格,2013 年。
  • 哈斯蒂、特雷弗、罗伯特·蒂布拉尼和 j·H·弗里德曼。统计学习的要素:数据挖掘、推理和预测。第二版。纽约:斯普林格,2009 年。

未来的战争会是什么样子

原文:https://towardsdatascience.com/what-the-future-of-war-could-look-like-ca27162bdcf3?source=collection_archive---------43-----------------------

情报的

你需要意识到人工智能的一个重要应用

介绍

人工智能(AI) 的美妙之处之一是它在各个行业的适用性,而国防工业已经受到人工智能和相关领域进步的巨大影响。

F-16 战斗机

F-16 战斗机是令人印象深刻的机械怪兽,传统上由人类飞行员驾驶。

但近年来,已经有学术团体和实验室探索了利用人工智能做两件事的潜力:

  • 用嵌入式人工智能系统取代战斗机中的人。
  • 减少人类操纵责任的足迹。

这篇文章将探索 DARPA 的 AlphaDogFight 以及 AI 在 2020 年 8 月 18 日至 20 日举行的备受期待的 AlphaDogFight 中扮演的重要角色。

DARPA 的 AlphaDogFight 是什么?

DARPA

让我们先简单介绍一下 DARPA 的背景。

DARPA(国防高级研究计划局) 是美国国防部于 1958 年创建的机构。

该机构侧重于为军事目的利用和实施先进技术。

虽然 DARPA 主要关注军事技术,但该机构也影响了一些广泛使用的技术,如网络系统和互联网。

路易·威特的空战插图

空战是两架或多架战斗机之间的战斗,涉及战略机动、战斗和计划。

空战在 WW1 非常普遍,第一次涉及两架飞机之间的战斗是在 1913 年的墨西哥。

DARPA alpha dog fight是一系列测试 AI 算法执行格斗机动、战斗和策略的能力的试验。

这些人工智能算法的性能在高度复杂的模拟空中环境中进行了评估。

该系列的第一次审判于去年 11 月举行,第二次审判于 2020 年 1 月举行。

八支队伍参加了前两次审判,第三次审判是本周举行的最后一次审判。最后一次试验涉及每个团队的人工智能代理在模拟环境中控制一架 F-16 战斗机。

首先,这是一场与其他人工智能算法的对抗,第二天,团队的人工智能智能代理相互对抗。第三次试验的最后一天看到了顶级团队的人工智能代理和人类控制的 F-16 喷气式飞机之间的模拟混战,所有这些都是在模拟环境中进行的。

目的

举办 AlphaDogFight 是为了寻找开发人工智能系统的方法,这些系统可以将空战和机动的责任从人类飞行员转移到人工智能系统。

为了实现这一宏伟目标,必须对开发的人工智能控制系统有高度的信任。

关于人工智能的更多信息?

照片由晨酿在 Unsplash 拍摄

随着人工智能最新发展的到来,主要行业已经发生了转变。

十年来,系统和车辆的自动化程度有了相当大的提高,这都是通过深度学习和强化学习等领域的进步实现的。

毫不奇怪,我们目前正看到更多的努力将人工智能的承诺引向防御和军事项目。

让我们简单地探究一下人工智能在格斗中是如何被利用的。

参与 DARPA AlphaDogFight 试验的大多数团队都在开发他们的人工智能代理,在不同层面上采用了新的机器学习技术和基于知识的算法的组合。

虽然 AlphaDogFight 中每个团队的 AI 系统的内部细节没有公开,但我们可以通过参考使用机器学习和神经网络进行空战和模拟领域的研究来推断所使用的技术。

人工智能的以下小节包含了一些人工智能技术:

  • 深度学习
  • 强化学习
  • 深度神经网络
  • 人工神经网络
  • 基于启发式算法

空战系统人工智能的应用领域包括:

  • 路径规划
  • 导航
  • 决策制定
  • 规避
  • 碰撞检测
  • 跟踪和跟随

自 90 年代初以来,我们已经看到了探索利用神经网络进行决策任务的研究。

在空战的情况下,已经有人努力探索在基于空中的战斗中使用神经网络进行战斗机路径预测

在过去的十年中,神经网络已经被证明在配备了一套基于启发式的知识和专业技能时,具有 学习策略 的能力。

最近,深度学习技术已经提供了在实时环境中以高精度解决计算机视觉任务的能力,例如对象检测、对象识别和跟踪。

空战中的人工智能代理可以配备深度学习技术,能够检测和监控对手代理。

人工智能代理内的感知可以通过利用深度学习技术来实现,这些技术可以从模拟环境的像素流中识别和跟踪对象。

如果通过光线投射等方法感知环境,一些人工智能代理甚至可以配备避障程序。

DARPA 的 AlphaDogfight 团队已经为他们的解决方案建立了一个端到端的系统;这意味着他们不仅开发了可以驾驶 F-16 的人工智能代理,而且他们还开发了人工智能代理训练和开发的模拟环境,以及其他组件。

荷兰的学者在 2014 年进行了一项研究。这项研究探索了在空战模拟中利用一种称为动态脚本的机器学习技术来开发对手智能体行为系统。

动态脚本(DS) 通常出现在游戏环境中。DS 来源于强化学习,在强化学习中,代理自适应地通过一组预定义的行为和规则导航,直到实现一个目标。

在一个空战模拟环境中,你可以拥有敌方战斗机( 计算机生成部队 ),其目标是躲避或击落其他特工。这些敌人的战斗机将穿越一系列被赋予权重的动作和规则,这使得人工智能代理能够学习场景中的最佳行为。

神经网络已被证明在开发基于人工智能的系统方面非常有用,这些系统可以处理 飞行器 的导航和控制系统。

为 AlphaDogFight 开发的 AI 系统的很大一部分功能将围绕机动。通过利用自组织神经网络 (自组织特征图),人工神经网络已经被应用于创造具有自适应操纵能力的 AI 智能体。

张贤兵(Xianbing Zhang)等人进行的研究展示了使用Q-网络(源自 Q-learning 强化学习算法)来优化空战系统内机动决策的搜索。

AlphaDogFight 的一个关键目标是在空战中增加对基于人工智能的系统的信任。

将飞行场景中的决策责任从人类飞行员转移到自动化智能系统是发展对人工智能信任的一种方法。

当驾驶 F-16 或其他喷气式战斗机时,飞行员必须做出高认知决策,减少或完全解除飞行员的决策责任有一些显著的好处。

结论

学术界和工业界都在努力探索 AI 系统在自主飞行系统和空战系统中的完全适用性。

不管 AlphaDogFight 的结果如何,你都应该意识到为战斗开发智能 AI 系统所付出的努力和资源。

已经有一些经过验证的方法描绘了一个未来,人工智能系统至少可以处理飞行控制和空战系统中涉及的角色和决策的重要部分。

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上
  3. 通过 LinkedIn 联系我

**** [## 2020 年(及以后)机器学习从业者创收的 5 种方式

了解如何利用机器学习技能增加收入或创造新的收入来源

towardsdatascience.com](/5-ways-a-machine-learning-practioner-can-generate-income-in-2020-and-beyond-2f541db5f25f) [## 辅助项目在机器学习中的重要性

你和马克·扎克伯格有什么共同点?在这篇文章中找出,以及其他几个原因,为什么…

towardsdatascience.com。](/the-importance-of-side-projects-in-machine-learning-edf9836bc93a)****

“零”到底是什么意思?

原文:https://towardsdatascience.com/what-the-heck-does-zero-mean-8c5f42266dc6?source=collection_archive---------36-----------------------

什么时候零实际上是零?什么时候缺乏信息本身就是信息?

当我还是一名学习数据科学的本科生时,我的一位教授总是对我们处理的每个数据集问同一个问题——“零是什么意思?”

从表面上看,这似乎微不足道。如果场景是每个学生有多少苹果,零意味着一个学生没有苹果。

那为什么问这个问题?

嗯,零可以是零的意思……但它也可以表示一系列其他的东西,如果你不小心,忽视它可能会回来困扰你。

忽略或忽略丢失的数据是很容易的。无论值是 0、NULL、NA 还是空白,我们通常会很快忽略这些记录,因为它们“缺乏信息”。然而,这些数据点往往是我们问题的关键信息,而“缺乏”的信息实际上就是信息。

让我们考虑下面的场景。我们正在为一家银行提供咨询,他们希望我们确定一位客户是否有可能拖欠信用卡付款。下面是我们得到的评估这个问题的数据样本。

银行提供的样本数据

我们看到,有五个变量可以用来进行预测,这五个变量中,有四个包含值 0、空白,或者在某些情况下两者都包含。

可能很容易忽略这些值,或者将它们记为银行系统中的某种错误,但让我们仔细看看,看看是否还有更多故事。

我们丢失数据的第一个变量是信用评分。八个客户中有两个没有信用分值。虽然看起来这些值被忽略了,但是请注意这两位客户的年龄分别是 23 岁和 20 岁。由于他们相对年轻,很有可能他们最近才开了一张信用卡,因此还没有信用评分。用 0 值回填这些记录可能很容易,但是考虑到我们不知道它们实际上如何执行,这也没有意义。在现实生活中,我们该如何处理呢?一种方法是找出年龄相似的人的平均分数,并将该值用于我们缺失的记录。

缺少数据的下一列是未付款。这一次,我们得到了缺失数据和值都为 0 的记录。直觉上,我们认为值 0 表示客户从未逾期付款。在这种情况下,0 确实意味着 0。缺失的值呢?嗯,正如我们讨论的信用评分,可能有其他因素影响这个变量。请再次注意,我们丢失的记录是一个只有 20 岁的客户的。鉴于他们也没有信用评分,我们可以推断他们从未错过付款,因为他们从未有机会付款。如果我们的客户这个月才开户,那么他们就不必付款,因此也不会错过任何一笔。

转到我们最后的两个变量,信用限额到期付款,我们再次看到缺失值和 0 值。对于我们的值 0,它们看起来相当直观,在这些情况下$0 是一个合理的金额。然而,我们缺失的数据提出了一个更大的问题。个人信用额度怎么会没有价值?允许他们想花多少就花多少吗?这个人也没有应付款项…这是怎么回事?

让我们以类似于我们的其他场景的方式来处理这个问题——通过查看客户的其他信息。首先,我们可以看到这个人的分数比我们所有的其他客户都低,包括 23 岁的客户(分数越高,信用越好)。我们还看到他们错过了 8 次付款,是第二高的个人的两倍。嗯……那为什么他们没有信用额度呢?

一个可能的答案是——这个人表现太差,银行决定终止他们的账户。因此,该客户仍在我们的数据库中,但不再活跃于该银行。因此,他们不能花任何钱,也不必付款。

对于为什么数据可能丢失,为什么它可能为零,以及我们可能如何处理它,以上所有显然都是假设的场景和解释。数据丢失可能有多种原因,但了解数据丢失或为零的原因对于了解更多信息和做出更好的决策至关重要。在现实世界中,你也许可以回到银行,围绕数据提出一些问题,以验证你的假设是否正确。当然,在很多时候,这也不是一个选项。

在数据科学和机器学习的现代世界中,我们经常看到模型无法处理缺失值,被迫以另一种方式处理这些数据。虽然简单地删除这些记录或估算平均值或中位数可能很容易,但我们也应该花时间考虑这些缺失值代表了什么。想象一下,如果在我们的银行示例中,我们简单地将 0 值代入任何空白信用评分,会怎么样?一个潜在的模型可能做出了可怕的预测,因为我们错误地假设 0 和 missing 是相同的,而在这种情况下它们不是。类似地,如果我们用 0 回填缺失的信用限额值,我们将在一个模型中使用至少一个已经违约的客户,试图预测该客户是否会违约。

有时候零真的是零。有时,丢失只是失败的数据输入工作中的人为错误。有时候,还有更深层次的故事。引用我教授的话,“零到底是什么意思?”

“云”到底是什么?

原文:https://towardsdatascience.com/what-the-heck-is-the-cloud-5c36b7deffb8?source=collection_archive---------50-----------------------

现在是我们要么上船,要么掉队的时候了。

在 Unsplash 上由 Tachina Lee 拍摄的照片

云正在接管它,我们无法阻止它。

这是一件坏事吗?绝对不行。云是不可思议的,如果我们选择这样看待它,它会带来一个全新的机会世界。

企业正以前所未有的速度向云迁移。您可以选择要么拥抱它,走在它的前面,加入他们的云转型之旅,要么对它视而不见,落在后面。

但首先,我们必须对它是什么以及如何利用它来改善我们的 it 生活有一个基本的了解。

本文将为您提供所需的知识,至少可以让您就云展开友好的对话。

目标

理解“云”的所有基础知识

我将首先定义一个术语,希望你在这篇文章的剩余部分记住它。然后我给大家上一堂云计算基础的历史课。

然后,我们将深入探讨在云计算出现之前,您是如何管理 IT 基础架构的,云计算现在是什么样子,谁是主要参与者,以及您如何成为云计算专家。

我们开始吧!

目录

  • 抽象化
  • 历史课
  • 传统 IT 基础设施
  • 当今云计算
  • 主要玩家
  • 进一步提高你的技能

抽象

理解云时需要学习的一个相关术语是抽象。

按照 Techopedia 的说法,一个抽象

表现基本特征而不包括背景细节或解释的行为。

当我第一次学习计算机科学中的抽象概念时,使用了一个油门踏板的例子。

当你试图让一辆汽车向前行驶时,你并不关心发动机内部发生了什么。

你不关心控制阀门的节气门联动装置,该阀门调节发动机的进气和喷油比例。

不。你踩油门;汽车向前行驶。就是这样。潜在的复杂性与你无关。油门踏板只是一个抽象概念。

一般来说,在计算机科学和 IT 领域,你会发现抽象这个术语无处不在。这是面向对象编程的三个核心原则之一。但是不管你在哪里看到它,它总是被用来代表降低复杂性和提高效率的过程。

这同样适用于理解云。云旨在掩盖令人难以置信的潜在复杂性,以帮助您更高效地完成工作。

历史课

早在 1963 年,麻省理工学院接受了一个 200 万美元的项目,以创造第一台可以被两个或更多的人同时使用的计算机。

1969 年,J . C.R Licklider 提出了“国际银河计算机网 T2 网 T3 工作”的想法。地球上的每个人都用一个网络连接起来。这种意识形态是“互联网”的前身,是云的重要组成部分。

直到 20 世纪 90 年代,“虚拟机”的概念才开始变得相关,我们能够通过互联网访问完整的操作系统。当然,这都要归功于 1991 年万维网的创立。

1997 年,埃默里大学的拉姆纳特·切拉普教授创造了“云”这个术语,用来描述我们今天所知道的“云计算”。

最后,在 2002 年,亚马逊介入了这场游戏。他们推出了第一个公共云。

但直到 2006 年,EC2 才从亚马逊发布。弹性计算云(EC2)将允许用户租用虚拟机,并使用这项服务从头到尾开发应用程序。

这一进步将是我们今天所知的云计算的开端。

传统 IT 基础设施

让我解释一下在云计算时代到来之前,您将如何托管您的 IT 基础架构。

传统主机有两种类型:专用和共享。

专注的

通过这种类型的托管,您只需负责管理运营业务所需的硬件。

“专用”意味着购买所有的物理组件以及容纳所有这些组件所需的不动产。

这种类型的托管有局限性。您锁定了预定义数量的带宽、CPU、RAM、驱动器空间等。

每当您想要扩展时,您都必须订购新的服务器,等待几周甚至几个月,花钱请人安装和维护,然后手动配置。

如果你是一家希望只专注于编写软件和创新的软件公司,这些硬件问题是非常值得担心的。

共享的

这种类型的托管在中小型企业中更常见。

在这个模型中,你从别人那里租用计算空间。你使用他们的服务器来托管你的站点。

这有什么缺点吗?同一台服务器上可能还有其他网站。如果有一天别人的流量显著增加,这可能会损害你的网站的性能。

共享主机让你对你的网站控制更少。此外,您仍然需要为有限的存储和处理能力付费。

当今的云计算

回到抽象的概念。

云计算使我们不必担心托管业务的任何物理方面。管理 IT 基础架构带来的所有潜在复杂性都由云服务提供商负责。

根据亚马逊网络服务:

云计算是通过互联网按需交付 IT 资源,采用随用随付的价格。无需购买、拥有和维护物理数据中心和服务器,您可以根据需要从 Amazon Web Services (AWS)等云提供商那里访问计算能力、存储和数据库等技术服务。

从这个定义中得出的重要信息是,云计算为我们提供了按需计算资源。这通常发生在互联网上的现收现付模式。

我们不再需要以物理方式管理我们的底层基础架构。这意味着我们不必:

  • 购买不动产来放置我们的服务器
  • 雇佣工人来处理维护(供暖/制冷、电线等。)
  • 当我们看到使用量激增时,添加新的物理服务器
  • 受到任何类型的基础架构可用性的限制

这使我们能够:

  • 尽可能降低我们的成本
  • 专注于我们的业务,提高功能开发速度
  • 有更好的安全性
  • 通过改进的灾难恢复实现高可用性

我们业务的发展速度是前所未有的。我们从未有过如此快速地从计划到生产的能力。

它分为三种类型:IaaS、PaaS 和 SaaS。让我们来看看每一个:

IaaS

基础设施即服务是对基础设施层进行抽象的时候。这使我们能够通过虚拟界面管理我们的基础架构。如果我们想要添加负载平衡器或服务器或任何硬件,我们只需点击一个按钮,就可以完成。

我们不再需要自己订购和安装这些组件。

IaaS 的一个流行例子是 AWS 的 EC2 服务。

PaaS

平台即服务是指云提供创建和管理应用程序的空间。这可能包括操作系统。

这使我们能够开发软件,而不必构建和维护所需的基础设施。

PaaS 的一个流行例子是 Google 的应用引擎。

SaaS

软件即服务是指能够在您需要的时候在您需要的地方获得任何软件。这是一种软件许可和交付模式,其中整个软件包通过互联网交付。

SaaS 的一个流行例子是微软的 Office365。

主要玩家

云计算领域有几个你应该熟悉的名字:

IaaS

  • AWS(亚马逊网络服务)
  • 微软 Azure
  • 谷歌云平台
  • 阿里云
  • 国际商用机器公司

在这三个突出的(这些被称为“三大”云提供商)中,AWS 目前占据了市场份额。据来自 zdnet.com 的拉里·迪南称,AWS 拥有 60%的市场份额,Azure 拥有 31%,谷歌云平台拥有 9%。

以下是平台即服务(PaaS)工具的一些著名示例:

PaaS

  • AWS 弹性豆茎
  • Oracle 云平台
  • 谷歌应用引擎
  • 微软 Azure
  • Salesforce aPaaS

让我们来看看一些顶级的软件即服务(SaaS)提供商:

SaaS

  • 销售力量
  • 神谕
  • 精力
  • 工作日
  • 砖坯黏土

进一步发挥你的技能

这篇文章是在环球疫情新冠肺炎期间写的。与此同时,我正在努力获得 AWS 认证,成为一名云开发人员。当你隔离时,利用你可能有的任何新的空闲时间。

AWS 、微软和谷歌提供 IT 领域所有级别和所有角色的认证。

获得云基础知识、架构师、开发人员、运营、网络、安全、机器学习、数据分析、数据库等方面的认证。

了解云的最佳方式是获得实践经验。我发现帮助我学习的一个很好的资源是云专家。他们为你提供了许多奇妙的实验室。

好好利用,祝你好运!

资源

在写这篇文章的研究阶段,我使用了一些资源:

云计算简史

当你踩下油门时,是什么使汽车行驶?

云托管与传统托管的对比

什么是云计算?

顶级云提供商

历史风云

深度学习迫切需要的人类大脑:零射击学习指南

原文:https://towardsdatascience.com/what-the-human-brain-has-that-deep-learning-desperately-needs-a-guide-to-zero-shot-learning-2e296741ce51?source=collection_archive---------17-----------------------

来源: Unsplash

以及令人尴尬的简单 ZSL 算法

深度学习有一个很大的问题:它需要吞噬大量的数据,然后才能合理地推广并变得有用。这实际上是深度学习的局限性之一,限制了它在许多数据不丰富或难以获得的领域的应用。

相比之下,人类虽然被描绘为人类与机器智能之战的输家,但却可以通过少量训练样本来学习复杂的概念。不知道什么是猫或狗的宝宝,在看到几张猫的图片和几张狗的图片后,就可以学会给它们分类了。即使当我们学习更复杂的概念时,我们也能够通过一个小的数据集获得大部分知识。

这个属性使得教授人类概念变得费力,但却是可能的。一个四年级学生可以通过几十道题和好老师掌握基本代数原理。深度学习需要精心设计的架构、成千上万(如果不是更多)以专门格式编码的痛苦拼凑的问题和答案,以及几天的计算时间。

也许人类大脑更有趣的一点是,我们可以轻松处理数百甚至数千个类。想想你周围环境中的所有物体——你的电脑、电脑上的应用程序、这些应用程序中的功能、几十种颜色、你同事的名字、所有英语单词。

此外,即使你以前从未见过概念*,你也能认出它们。考虑以下想法(希望你以前没见过这些):将它们归类。这些类的实际名称并不重要——如果您愿意,可以称它们为 zookildezonk。*

这是一个与新物种命名非常相似的过程。如果一位科学家发现了几只秃鹰,他或她可以简单地给这个物种命名为“秃鹰”,这些秃鹰有相似的特征:翼展 6-7 英尺,深棕色的尾巴,白色的尾巴,白色的头,明亮的黄色眼睛。尽管他或她事先并不知道“秃鹰”到底是什么。

这些都是鹰,但我们可以识别以前未学习的类,并给它们命名。来源:第一张、第二张、第三张、第四张图片(均来自 Pixabay)

我们不需要给概念起名字来识别它们;名字是任意的,只是一种快速获取想法的方式。类似地,我们可以用任何我们喜欢的名字对这些抽象形状进行分类,只要这些名字表明了一个更广泛的概念(在这种情况下,两个正方形代表‘Zonkizonk’,三个正方形代表‘Bonkibonk’)。

零射击学习是一种努力,将人类识别以前看不见的概念的能力带给机器。显然,这是迈向真正的人工智能和构建更像人类一样思考的算法的关键一步,但在有太多类,或者数据有限或获取成本高昂的问题中,这也非常实用。

在深度学习尚未解决的问题越来越多地涉及错综复杂和类似人类的认知的世界中,零射击学习是一个答案。

同样,一次性或少量学习指的是只给定一个或几个来自该类的训练示例,就能理解整个类,如双头连体网络。

一种简单但有效的零镜头学习方法被称为“令人尴尬的简单零镜头学习”(ESZSL),它以创造性的方式使用矩阵分解和无监督学习来产生一个产生令人惊讶的好结果的模型。理解它可以让你直观地了解许多其他零射击学习技巧的动态。

ESZSL 在由数万个对象组成的 SUN 数据集上对训练期间从未见过的类产生了超过 65%的准确率。查看论文以深入总结该方法在合成和真实数据数据集上的结果。

从根本上说,ESZSL 是一个线性模型。给定形状为(number of rows, number of features)的输入矩阵 X 和形状为(number of features, number of classes)的权重矩阵,线性组合输出将为形状(number of rows, number of classes)

ESZSL 的目标是找到权重矩阵 W 的值。

考虑一个相当复杂的模型必须完成的两个步骤:

  • 通过将特征空间(input X )映射到维度为 a 的属性空间来解释输入,其中属性可以是诸如图像是否有四只脚、它是否是棕色的等等。每个属性的含义需要由模型决定。
  • 将来自属性空间的知识组合成输出。例如,如果图像有四只脚,并且是棕色的,则输出是狗。

这两个目的可以用矩阵来表示。

  • V 有形状(特征数, a )。
    X 乘以 V 时,结果有形状(行数, a )。现在,每一行都由学习到的属性表示。这非常类似于神经网络层中的连接(没有偏置和激活)。
  • S 有形( a ,类数)。
    V 乘以 S 时,结果有形状(行数,类数)。这种乘法结合了来自属性空间的学习以产生输出。这就像是神经网络的输出层。

然后,我们可以将模型写成:

上标代表矩阵的形状。r 是数据集中的行数,f 是特征数,a 是中间层学习的属性数,c 是类数。

原来,管道的后半部分——S,某些学习到的属性和类之间的关系——可以通过无监督的学习方法找到,如 PCA,或者使用更复杂的流形学习技术,如局部线性嵌入和 t-SNE 。

  1. 训练一个降维算法(PCA,LLE 等。)在 X 上,将训练输入数据,转换成 a 尺寸。
  2. 得到的数据应该有 shape ( ra ,其中 r 是行数, a 是学习到的属性数。称这个矩阵为 M
  3. 分配大小为( ac 的矩阵 S ,其中 c 为类数。
  4. 对于每个唯一的类,在 M 中找到标签与该类匹配的行。找出每一行的平均学习属性 a ,并将信息填入 S

这里,E[(a,b),(c,d)]表示期望值,或平均值。结果是((a+c)/2,(b+d)/2)。‘a1’和‘A2’代表属性 1 和属性 2。

这是导出 S 的一种非常简单和优雅的方式,因为它利用了无监督的提取特征的方法,这对于零触发学习是有用的,因为它不会暴露于测试中可能出现的任何标签。在零触发学习算法中使用聚类也是有意义的,因为新类的识别是非常复杂的聚类任务。

然后,训练和预测过程如下:

  • 在训练期间,使用上述无监督方法从X trainy train数据集计算 S 。然后,使用标准优化方法(如梯度下降)计算 V ,使模型的预测损失最小。
  • 测试时,形成两个数据集,X test-train & y test-trainX test & y test。前者是测试集的一部分,有标签;这允许 S 将类合并到测试集中,而不是训练集中。在后一种情况下,算法没有标签。
    用上述非监督方法从X test-trainy test-train数据集计算 S 。由于已经计算出了将输入转换到属性空间的 V ,因此模型已经完成。

即使是“简单得令人尴尬”的零距离学习法也有点难以理解。让我们以 MNIST 数据集为例,该数据集由从 0 到 9 的手写数字组成。

  1. 我们将在 0 到 4 的数字上训练模型,然后让它在测试集中识别 5 到 9 的数字。
  2. 根据训练集计算 S 。然后,找到 V
  3. 形成测试训练组,这是来自测试集的数字的小样本(数字 5 到 9)。由此,计算更新的 *S* 。输出将对应于从 5 到 9 的数字,而不是从 0 到 4(当在训练集上计算时)。
  4. 通过模型运行测试集的剩余部分,更新的 SV 来自训练。

请注意,在测试集期间对 S 的计算有点可疑,如果你非常严谨,你可能会反对它是真正的零命中率,因为部分预测 S 依赖于标签。或者,有人可能会认为这是必要的,并且在整个训练和测试过程中,V——负责编码输入的所有工作——保持不变。无论你站在哪里,这都是一个很好的了解零射击算法背后思想的机会。

然而,一般来说,零触发学习方法遵循三种学习范例中的一种:

  • 学习属性。类伴随着结构化的描述;例如,“白头”和“黄嘴”在描述秃鹰时。这允许算法将输入分解成所描述的类的元素,即使它没有看到来自该类的任何显式示例。
  • 学习文字描述。类伴随着文本的自然语言描述,就像字典或百科全书中的一个单词。这允许模型解释和映射一个输入到一个只有类描述的类。
  • 自主学习。类被嵌入到一个连续的空间中,零触发分类器解释嵌入的位置以确定输出。这是 ESZSL 遵循的范例;由于不需要每个类的属性或文本描述,这种方法更符合零起点学习的目标,但性能可能会更差。

零镜头学习应用于图像分类、语义分割、图像生成、对象检测和自然语言处理,以及其他更具体的用例,如语言翻译。该领域的研究数量每年都在快速增长,其中很多都是对传统深度学习方法的创造性背离——毕竟,困难的任务需要更多的创新。

感谢阅读!

如果你对最新的文章感兴趣,可以考虑订阅。如果你想支持我的写作,通过我的推荐链接加入 Medium 是一个很好的方式。干杯!

[## 双头神经网络抖动图像识别

暹罗网络的魔力

towardsdatascience.com](/the-two-headed-neural-network-shaking-up-image-recognition-8c3c7093d61b)

图片由作者创作,除非另有说明。

臭名昭著的牛津“68%的英国人有新冠肺炎”研究到底说了什么

原文:https://towardsdatascience.com/what-the-infamous-oxford-68-of-the-uk-has-covid-19-study-really-says-49f633339620?source=collection_archive---------11-----------------------

病毒镜像。牛津形象。

提示:这不是媒体一直告诉你的

伦敦帝国理工学院的研究人员制作的预测疫情冠状病毒发展的模型在世界各地引发了警报。这项研究是许多政府决定采取严厉措施的重要因素,这表明仅在美国就有 200 万人死亡。

然而,相当臭名昭著的是,牛津大学的一个新模型据称正在“挑战”帝国理工学院模型的准确性。任何关注冠状病毒的人都听说过“68%的英国人患有新冠肺炎”这句话,这似乎是这项研究的特征。毕竟所有的头条都是这么说的。

不幸的是,的论文并没有真正表明大多数英国人已经感染了冠状病毒。似乎媒体已经染上了另一轮的戏剧化流感——相反,让我们更诚实地看看牛津大学的研究到底说了什么,理解它受到的批评哪些是合理的,哪些是不合理的。

这篇名为“流行病传播的基本原理强调了评估新型冠状病毒流行病阶段的大规模血清学调查的迫切需要”的论文基于一项观察,即“引发保护性免疫的新型致病感染因子”通常表现出以下三个连续阶段:

  1. 新感染的缓慢积累的初始阶段,通常不可察觉。
  2. 感染、疾病和死亡病例快速增长的第二阶段。
  3. 由于人群中易感者的减少,传播最终减缓,通常导致第一波流行病的终止。

在实施控制措施之前,根据幸存感染产生保护性免疫的假设,该论文指出

……流行病学理论表明,新型冠状病毒的持续流行将符合这一模式[三个阶段]。

因为这三个阶段被假定存在于流行病的过程中,所以论文的作者使用了 SIR 框架。SIR 模型通常用于模拟冠状病毒等流行病,因为它只考虑处于以下三种互斥状态之一的人群:

  • 易感。这个人没有患过这种疾病,但是很容易从感染者那里感染。
  • 已感染(I) 。此人目前感染了这种疾病。
  • 康复/死亡(R) 。感染者存活并对疾病产生免疫力,或者死亡。无论哪种方式,这一群体都没有患病的风险,也不能冒充患病者。

SIR 模型是流行病学中更大的模型组的一部分,该模型通过将人群分成“隔室”并假设同一隔室中的每个个体具有相同的特征来对传染病进行建模。它通常比 ARIMA 或回归等传统数学预测方法表现更好,因为它允许更多特定领域的模拟。

基于历史实例的时间序列预测。来源。

该模型具有合理的预测性,适用于人与人之间传播的传染病,以及恢复后产生免疫力的传染病,如麻疹、腮腺炎和风疹。

三个变量 S、I 和 R 代表特定时间每个车厢中的人数。这由输出每个车厢人数的三个函数来表示: S ( t )、 I ( t )、 R ( t )。

该模型是动态的,因为每个区间中的数字随时间波动。该系统用下面的一组微分方程来描述:

  • S =易感人群中的人数
  • I =感染人群中的人数
  • T21 =康复/死亡人口中的人数
  • 三者之和
  • t = 时间
  • β =病原体的传染率
  • γ =回收率

这些微分方程表示某些变量如何根据某些常数(如传染率和恢复率)与其他变量协同移动,这些常数可以符合现实世界的数据。

请注意,从真实等式来看…

…以下陈述是正确的:

这表达了人口的恒定性。SIR 模型依赖于某些参数 N = 世界人口,β = 0.3,γ = 0.5,给出了关于流行病的良好感觉。易感和康复/死亡人口百分比类似于 sigmoid 函数,感染百分比类似于正态分布。SIR 模型根据特定疾病的属性/参数(如β和γ)将这些曲线拟合到特定疾病。

资料来源:帕特里克·桑切斯。

虽然这是一个标准的 SIR 框架,但是可以添加许多变体。论文作者概述了他们模型中使用的具体微分方程和变量,这些可以在牛津研究论文的第五页找到。

总体方法基于这样一个假设,即只有很小一部分人有患病风险,作者指出,现有文献中已经很好地描述了他们的风险群体,包括老年人和免疫系统严重缺陷的人。SIR 模型适用于英国和意大利首次记录死亡后 15 天内的累积死亡人数,以避免自那时起当地控制策略的潜在影响。

论文作者总结了英国的三种情况,根据论文作者的说法,英国的再现数 R₀代表了文献中 R₀估计值的变化:

  • R₀ = 2.25,ρ = 0.001(灰色)
  • R₀ = 2.25,ρ = 0.01(绿色)
  • R₀ = 2.75,ρ = 0.01(红色)

请注意,ρ =易患严重疾病的假定人口比例。下面显示的模型是用贝叶斯马尔可夫链蒙特卡罗方法拟合的,运行了一百万步。

牛津研究论文。

三个场景中的每一个都相当接近地模拟了白色方块,代表从 3 月中旬到 3 月 19 日的真实数据,这些数据不是模型训练的数据。(注意:不要混淆置信区间和实际预测。)

模型输出后验概率可以从不同变量的角度给出三种情景的情况,如下所示。

红色和绿色分别代表 R₀ = 2.75 和 R₀ = 2.25 的模型,处于风险中的人口百分比以大约 1%的平均值分布。R₀ = 2.25 和 R₀ = 2.75 模型估计,到 3 月 19 日,大约 36%和 40%(分别)的人口已经暴露于新冠肺炎。在 R₀的两种情况下,到 35 日报告第一例死亡时,大约 0.08%(数千人)已经被病毒感染。

当 R₀ = 2.25 且处于严重疾病风险中的人口比例分布在 0.1%左右的相同模型时,将传播开始时间定在第一个病例检测之前的四天,并表明 68%的英国人口将在 3 月 19 日之前被感染。

然而,这个结论有许多警告。首先,有一个巨大的置信区间。自然,预测就是预测不可预测的事物,所以真正解释不确定性的唯一方法是提供误差线。因此,一个模型产生的任何数字都应该伴随一个误差指标,就像平均值应该伴随一个标准差一样。

这让人想起电影《T4》中途岛中的一句话,据说这句话让情报官员埃德温·t·雷顿问日本军队将在何时何地发动进攻。

"我知道我们在问不可能的事情,但我们需要你具体点。"
——切斯特·w·尼米兹,中途

在许多情况下,具体可能是好的,事实上,是必要的。在其他情况下,比如冠状病毒,它会给不确定性披上确定性的外衣。

不确定性凸显。

该论文事实上并没有表明大多数英国人已经感染了冠状病毒——它只是表明,存在与当前可用数据一致的场景(其中有许多问题),其中很大一部分人可能在 3 月 19 日之前感染了新冠肺炎病毒。

然而,正如所证明的,对受感染人口比例的估计取决于对ρ的假设,ρ是人口中易患严重疾病的假设比例,这是未知的。

“只有当这一风险比例很小(0.1%)时,才能预测高感染水平。如果处于危险中的比例是 1%(与数据一致的另一种情况),到 3 月 19 日感染的比例将低得多(36-40%)。
-西蒙·古宾斯博士,皮尔布赖特研究所

这项研究更多的是呈现与现有数据一致的情景,而不是预测有多少人真的被感染了。夸大该研究未经同行评审的事实,并接受 68%的表面价值,淡化了论文的主要观点,即强调需要血清学调查来评估受感染人口的比例。它们对于准确评估死亡率也至关重要。

话虽如此,论文中还是有漏洞的——只是要理解这样一个事实:批评容易,创造却不容易。许多批评可以归结为冠状病毒数据中严重缺乏诚实的数据。对这篇论文的大部分批评在于它所采用的假设;例如,英国是一个混合人口,这一假设导致模型高估了感染人口的比例。

作者承认,很难从如此依赖于假设的研究中得出结论,这些假设可能正确,也可能不正确。

“这个理论模拟基于一个关键的假设,这个假设可能正确,也可能不正确。这项工作是对科学辩论的贡献,科学常常通过挑战似乎被认为是智慧的东西而进步。”牛津大学罗莎琳德·富兰克林研究所所长詹姆斯·奈史密斯教授

最后自己看论文。这本书不长,只有 5 页,你自己阅读可以对研究中的免责声明和基本假设有更全面的了解。

基本场景:新闻没有告诉你什么

原文:https://towardsdatascience.com/what-the-news-isnt-telling-you-4e44f3a08c10?source=collection_archive---------71-----------------------

以及为什么这个世界比你想象的更好

照片由阿德里安娜·范·格罗宁根在 Unsplash 上拍摄

人类从未如此美好。不,我不是在讽刺,也不是有人付钱让我这么说的<在此插入大公司名称 >。对于全球的普通人来说,产品正变得越来越便宜,越来越容易获得。女性接受的教育和避孕措施比我们整个历史上的都多。抛开路上的一些坎坷,世界正在变得越来越好。

不相信我?大多数人不会。这条新闻一定会让你认为世界末日到了,因为直接的悲观论调很畅销。虽然新闻在某些方面是正确的,例如气候变化(这是真正变得越来越糟糕的领域之一),但新闻也有一百万种方式对可怕的事情给予不相称的重视,而忽略了当今世界逐渐积极的趋势。

当我还是一名学生的时候,在我的论文中以经济发展为主题,我会使用“全球南方”或“发展中国家”这样的关键词来严肃地描述我们与他们之间的差距。然后我读了汉斯·罗斯林的《真实性》,意识到我的整个前提已经严重过时了。更糟糕的是,我的论文导师严肃地点了点头表示同意,然而我们谁也不知道我们对“发展中世界”的偏好在 50 多年里都不是真的!

所以谢谢你汉斯·罗斯林。谢谢你让我明白了这个世界的真实运作方式。我们将使用 Tableau 来了解近年来儿童死亡率、预期寿命和收入是如何变化的。

这是我们今天要做的:

1)数据收集🧺🦆

从我的 Github repo 下载日期文件。所有数据来自 Gapminder (你也可以直接从这个网站下载,但是我已经冒昧地重新命名了一些列名)。

正在下载。zip 文件会给你 4 个 CSV 文件(加上自述文件;你可以删除它):

  • income:经通货膨胀调整后的人均收入(2011 年美元)
  • child_mortality:儿童死亡率(每 1000 人中 5 岁前死亡的人数)
  • countries:国家(稍后提供颜色编码的区域标识符)
  • population:群体(提供气泡的大小)

[ 完整文档:https://www.gapminder.org/data/documentation]

2)安装台面📉

如果你没有 Tableau,在这里下载免费的公开版本(这是我目前正在使用的)。安装可能需要几分钟时间;在此过程中,您可能还想创建一个 Tableau 公共帐户。

通过创建一个 Tableau 帐户,你将能够开始导出你的可视化和建立一个漂亮的投资组合(像这样)。

3)准备用于分析的数据📝

现在,我们将上传每个文件,将它们从长格式转换为宽格式,并确保它们已被正确添加:

3.1)为**child_mortality.csv****income.csv****population.csv**:****

  • 打开一个新的“文本文件”,上传这三个中的一个。您将重复这一步骤两次以上,所以从哪一步开始并不重要。
  • 选中“文件”下的“使用数据解释器”,将第一行识别为列名。
  • 突出显示除第一列之外的整个表格(如下例所示)。右键单击突出显示的框,然后按“pivot”并重命名列标题。

你已经成功转向了,哇哦!

  • 完成第一个 CSV 后,单击左上角的 Tableau 标题返回主屏幕,对其他两个 CSV 重复相同的步骤。

3.2)为 **countries.csv** :

  • 除了导入文件,你不需要做任何事情→正如你所看到的,它已经是 wide 格式了!
  • 如果你本能地通过图标导航到主页,只需再次点击图标,它将带你回到数据。

******3.3)打开“第 1 页”进行检查:******

  • ****一旦您导入/修改了所有 4 个 CSV,我们就可以进入第一个工作表了。转到“第 1 页”,确认您有权访问左上角的所有 4 个数据集:****

4)创建散点图📈

你已经设置好了一切,现在让我们开始绘图:

  • ****拖动incomeIncome Per Capita ( *或者你在步骤 1 中给它起的名字;*)下的“表格”到“列”架上。这将是 *x* 轴的值。****
  • child_mortalityChild Mortality拖到“排”架上。这将是 y 轴的值。

  • 由于数据源不同,您可能需要手动定义 Tableau 的关系。如果弹出错误窗口,请转到数据→编辑关系以确认数据集之间的关系。

"countries"只有国家变量有共性;其余的分享国家和年份

  • income中的Country变量放入“细节”框中(它必须来自收入,因为原始数据来源很重要)。**
  • population中的Population变量放入“尺寸”框中。
  • countries中的Region变量放入“颜色”框中。

图表在这一点上应该是这样的:

恭喜您,您在 Tableau 中制作了散点图!

现在让我们开始吧。漂亮🌼

这是有趣的部分,真的。因为在这一点上,你可以停止听我说,开始摆弄图表,直到它变成你喜欢的样子。

我将给出一些关于如何改变轴、颜色、形状和大小的提示:

****更新轴:右击 x 轴或 y 轴,进入format。在这里,您可以更改轴的长度、反转轴或切换到对数刻度。

我把incomechild mortality都换成了日志,因为它比关卡更能捕捉变化。然后,我将轴从“自动”改为“自定义”,并进行试验,直到我找到每个轴的正确尺寸。

****填充颜色和调整大小:这些可以在标记框中完成,无需任何拖放操作(见下文):

给点添加名字: Tableau 很好地展示了点,而没有将它们写在彼此的顶部。将Country变量拖动到“标签”框中:

****排除空值:有时会出现空值,数据不完整。您可以通过转到区域→空值→排除来删除空值(这将在页面的右侧)。

****更改网格线:这部分完全是可选的,但我喜欢有人提醒我某些阈值意味着什么(尤其是当它与全球贫困相关时)。

  • 要删除背景线,请右键单击网格,然后转到格式→格式线→网格线。按“无”会将背景变成全白。

要添加一行,请离开格式选项卡。转到分析→参考线,将参考线拖到网格上。在这里,您可以尝试各种垂直、水平和垂直线条。

****这是一张我添加了 3 条参考线的图片,两条垂直加一条水平:****

6)现在让我们开始吧。分层的🍰

“洋葱有层次。食人魔有层次。洋葱有层次。明白了吗?我们都有层次。”—史莱克

最后一件要做的事,那就是加上时间。在过去的 220 年里(见鬼,甚至是过去的 50 年),人类在生活质量方面取得了巨大的进步,所以增加时间给了这张图很大的魅力。**

要添加时间维度,您只需将收入→年份变量拖到页面架上,就可以开始了:

这是我最终的图表结果:

调查结果和结论

在现代医学发明之前,大约 20% -50%的儿童在 5 岁生日之前死亡(取决于你生活在哪个国家)。另一方面,近年来许多国家将这一比例降至 1%以下,世界上最糟糕的国家都降至 20%以下。虽然还有很多工作要做,但医学在降低儿童死亡率方面已经做了很多(耶,科学!).

**现在让我们看看 x 轴。在 1800 年,基本上没有人拥有今天世界上大多数人享有的金融资源。许多人每天的平均生活费不到 2 美元;如果他们生病或受伤,他们的孩子就会死去,而且世界上大多数地方几乎没有教育。另一方面,在今天的世界上有非常非常少数国家仍然靠每天 2 美元生存;大多数人每天的生活费超过 32 美元(你可能会认为这是“第一世界”),如果不是这样,他们就在中间。****

最后,注意进步和 表明所有国家都在一起行动。随着人类变得越来越有创造力,这似乎对社会的每一个阶层都有好处——那些当时没有将资源转移到研发上的小的和不发达的国家,仍然和其他国家一起前进。就像一个大斑点走向独立和财务自由,似乎我们都在一起。

罗伯特·柯林斯在 Unsplash 上拍摄的照片

参考

汉斯·罗斯林,《真实:我们看错世界的十个理由——以及为什么事情比你想象的要好》, 2017 年 2 月

Parul Pandey,在 Tableau 中重现 Gapminder:向汉斯·罗斯林致敬,2018 年 9 月(https://medium . com/analytics-vid hya/Recreating-Gapminder-in-Tableau-A-Humble-tribute-to-Hans-rosling-53 de 74 b 18 EC

根据一位统计学教授的说法,零假设的真正含义是什么

原文:https://towardsdatascience.com/what-the-null-hypothesis-really-means-according-to-a-statistics-professor-1dae099ad8f?source=collection_archive---------11-----------------------

统计学最易混淆概念的简单解释

罗伯特·蒙哥马利是堪萨斯大学医学中心的研究助理教授和生物统计学家。在教授研究生水平的统计学课程时,他喜欢问学生一个简单的问题:“零假设是什么意思?”

这是一个非常具有挑战性的问题,有着非常具体的答案——即使对于已经学过一些统计学课程的研究生来说也是如此。

“如果有人没有正式的统计学背景,”他说。“他们通常不明白,我们是在试图证伪无效假设,而不是证明什么。”

这听起来像是语义学,但实际上不是。他指的是支持学术界、商业和制药行业使用的许多统计方法的数学理论。

这些方法属于通常所说的 T2 统计学派。

“频率主义者的统计是基于伪造假设的想法,”他告诉我。“这更难消化,因为它与人们认为你在做的事情相反。”

蒙哥马利医生这么说是什么意思?

真的很简单。有了这些方法,你就提供了反对假设什么都没发生的证据。它实际上并没有证明一组变量和另一组变量之间的关系。

迷茫?我们举个简单的例子。

盲人怎么知道下雨了?

想象一个盲人在外面行走。他看不见面前的东西,只能依靠他的嗅觉和触觉。

照片由谢尔盖·别雷舍夫提供

当他在外面行走时,他开始感觉到头上有水滴。他认为可能会下雨,但他不能肯定地说,因为他实际上看不到雨从天而降。

在频率统计中,说“下雨了”的假设是另一种选择。说“没有雨”的假设是无效假设。零假设通常假设正常(即没有雨)。

由于盲人不能证明有雨(因为他缺乏视力),他必须找到证据来反对没有雨的观点。

这就是统计学家在使用频率主义方法时所做的。他们是盲人,不能证明真的在下雨。相反,它们提供了证据,表明如果不下雨,无论发生什么都不太可能。

这对盲人是如何起作用的?首先,他知道他感觉到头上有水滴。可能是雨,也可能是洒水车。然而,他没有听到喷水声。他确实注意到他走过的草地比平时更泥泞。这支持了更多的水来自其他地方的观点。他还注意到,当他走路时,水滴跟着他。如果是洒水车,水大概不会跟着他。最后,他听到了远处的雷声。

基于他感觉到和听到的一切,如果没有下雨,他不太可能经历所有这些。因此,水滴很可能来自雨水。

这就是频繁主义者统计工作的症结所在。你表明,如果什么都没发生,你就不会有数据中的结果。这允许你拒绝中的无效,支持备选方案。它不否定无效,也不允许你证明另一种选择。

“你在假设零假设是正确的,”蒙哥马利博士在提到你的研究或分析时说。“如果这个假设是真的,那么 p 值就是你看到与你得到的结果相似的结果的概率。”

他所指的 p 值是在假设零假设为真的情况下,观察到的结果等于或大于观察到的结果的概率。

蒙哥马利博士接着说,“没有正式统计学背景的人通常希望 p 值是空值为假的概率,或者他们的研究假设为真的概率——这两者都不是。”

以下雨为例,p 值是在没有下雨的情况下,你头上有水滴、脚上有泥、背景中有雷声的概率。可以想象,如果不下雨的话,这种概率会很低。

这对大局意味着什么?

这不是大多数人想到预测建模时想到的,但这些方法是大多数研究的基础。它甚至出现在常用的分析工具中。

在 R 和 Tableau 中都可以看到 frequentist 方法,它们是具有完全独立的应用程序的独立数据工具。

这里有一个 R 中回归分析的截图:

作者提供的照片

这是 Tableau 中一个线性回归的截图:

作者提供的照片

在进行简单的回归分析时,这两种工具都会引用 p 值。

这也超越了连续数据。您还可以计算列联表中分类数据的 p 值,这应该是任何进行分类数据分析的分析师的最佳实践。

这意味着如果你在分析中使用 p 值,你是在试图拒绝一个零假设——不管你认为你是还是不是。

统计学能证明因果关系吗?

低 p 值很少能让你明确地得出“变量 A 导致变量 b”的结论,这自然会让人问这样一个问题——那么统计学有什么用?有没有一个点,我们可以超越拒绝零假设和证明因果关系?

“证明因果关系更多的是一个哲学问题,而不是统计学问题,”蒙哥马利博士说。“统计学帮助你在面对不确定性时做出决策;它不能保证这些决定每次都是正确的。”

一些统计学家试图解决这个关于因果关系的哲学问题。在一次著名的科学辩论中,这导致了他们之间非常公开的分歧——香烟和癌症之间的联系。

“因果关系问题的著名例子是 R.A .费舍尔吸烟,”蒙哥马利博士说。

照片由维基媒体提供

罗纳德·阿瑟·费希尔是一位著名的统计学家,他创建了费希尔精确检验,并推广了学生 t 分布和 f 分布。

显然,费希尔也喜欢吸烟。他发表了许多公开声明,反对将癌症和香烟联系起来的观点。

蒙哥马利博士说:“他是非常怀疑(关于吸烟的)因果关系的著名统计学家之一,因为所有的统计问题都可能出现。”。

虽然费希尔可以实事求是地宣称,所用的统计方法并没有证明香烟会致癌,但其他统计学家概述了他们做出这些论断的原因。

照片由维基媒体提供

一位名叫奥斯汀·布拉德福德·希尔(Austin Bradford Hill)的统计学家和流行病学家阐述了统计学家,尤其是医学领域的统计学家,何时可以对一个变量(如吸烟)和结果(癌症)之间的因果关系做出合理的声明。

希尔写道,因果关系主张的一个重要支持因素是一致性。在香烟和肺癌的例子中,来自不同人的重复研究都得出了相同的结论:拒绝否定,支持香烟增加癌症风险的替代方案。

不过,这通常超出了一名研究人员或数据科学家的范围。通常你的分析是基于一个数据样本,而不是重复的研究。除非你在回顾不同研究人员的大量研究,否则你可能会局限于拒绝无效假设,而不是声称有因果关系。

如果你对将“布拉德福德·希尔”标准应用到你自己的研究或分析中感兴趣,你可以在这里阅读他的文章和他对如何应用标准的建议。

以下是证明因果关系的“布拉德福德·希尔标准”的完整列表:

  1. 力量
  2. 一致性
  3. 特征
  4. 暂时性
  5. 生物梯度

不能 AB 考的时候怎么办

原文:https://towardsdatascience.com/what-to-do-when-you-cant-ab-test-4e1dff692bf7?source=collection_archive---------14-----------------------

作者图片

新的搜索软件会提高销售转化率吗?我们的新店提货流程对全渠道销售的增量影响是什么?你今天能找到吗?

我是加拿大百思买的数据科学家,这些是我们努力回答的一些重要问题,以支持产品开发和公司战略,以及我们建立的所有酷的机器学习产品(在未来的帖子中会有更多)。

为什么数据科学家也能回答数字分析师的问题?当然,AB 测试可以用来回答其中的一些问题,但这并不总是可行的。

在您需要提供答案的时间内,实施完全 AB 测试随机化可能存在技术或产品障碍。或者,可能需要测试线下世界的变化,就像我们在拥有庞大实体零售店的百思买所做的那样,在那里,客户层面的随机化是不可能的。

所以在我的工作中,我一直在使用各种反事实的方法来评估这些推论性的问题,我很乐意与社区分享它们。

超越 AB 测试:反事实

反事实是简单地比较在给定变化的情况下会发生什么,以及如果变化一开始就没有发生会发生什么。有很多种方法可以进行统计。我们一直在使用的一些强有力的方法包括:基于地理/市场的方法,如广义综合控制,以及基于时间序列的方法,如谷歌的因果影响。

基于市场的方法

基于市场的方法试图衡量引入效应的地理区域(例如新的营销渠道)和没有引入效应的控制区域之间的影响。简单地比较两个区域(治疗区域与对照区域)是没有用的,因为它们不是直接的比较。

我们需要做的是将我们的治疗区域与那些没有干预的治疗区域进行对比。在大多数基于市场的方法中,我们实际上可以使用我们的控制区域作为模型的输入,以在干预发生之前高精度地预测我们的治疗区域的行为。在引入干预措施后,测量与预测的差异可以让我们衡量任何变化对我们业务的真实影响。

作者图片

我们使用的主要方法之一是由一位政治科学家在 2015 年提出的广义综合控制方法。易在他们的论文中用它来衡量美国选举日登记法对选民投票率的影响[1]。这是其他综合控制框架的发展:它对区域间的差异更加鲁棒,并对多个处理单元进行推广。

最近,这种方法被用来有效测试百思买执行渠道的战略变化的效果。我们试图解决的关键问题是衡量在线和店内对整个业务的收入影响。在商店体验发生变化的情况下,我们无法准确地随机选择用户进行 AB 测试。

在这个项目中,我们将美国划分为 100 多个大的地理区域,每个区域的销售额都对应于给定的送货邮政编码或商店位置。比单个城市更大的区域在大都市地区尤为重要,因为客户可以在一天之内在城市之间移动。顾客在市中心购物,然后在郊区提货是很常见的。

在大约 100 个地区中,我们选择了 20 个地区来切换到新的履行体验。这些治疗区域是基于治疗组和对照组的不同组合的功效分析模拟而选择的,它们在很大程度上代表了包括大中型城市、郊区和农村地区在内的全国范围内的业务。我们经常发现,最具预测性的特征只是规模相似且相对接近的其他地区的销售,例如同一省/州的中等城市。

一旦实验开始推广,GSC 的开源 R 库使得向我们的利益相关者报告结果变得非常容易,包括影响估计、置信区间和预测值。示例输出如下所示(结果基于为测试模型开发的假数据):

作者图片

基于时间序列的方法

当测量的影响不能在地理上分开时,以及当完全随机的实验不可用时,我们也使用基于时间序列的方法。我们可以比较治疗和控制时间序列,而不是比较治疗和控制区域。

我们在这里使用的主要方法是谷歌的因果影响,反事实原则仍然是我们如何衡量效果的核心。采用几个控制时间序列(不受干预影响),我们可以建立一个治疗时间序列的预测模型,并衡量其结果的差异。

我们最近使用这种方法来测试运费的变化,这种变化只适用于销售的特定产品组。在进行我们通常会使用的完全随机 AB 测试时存在技术限制,因此关键问题是衡量对接受这种新运输体验的特定时间序列的任何销售影响。

考虑到不同的产品组合,我们建立了对照组,因此其时间序列对治疗组的变化相对不敏感。我们还模拟了治疗组和对照组的不同组合的潜在影响,以找到最终的分组。

类似于前面提到的 GSC 方法,因果影响有另一个伟大的开源库,我们利用它来返回我们与利益相关者交流的所有类型的统计结果。我们使用的输出类型的模拟示例如下所示,同样基于用于建模的虚假数据:

作者图片

为什么推理是数据科学工具包的关键部分

大众媒体、在线讨论和博客中的大部分焦点都集中在数据科学的机器学习和预测方面。主观上“性感”的东西。

然而,经常被忽视的是数据科学的推理方面。重要的是要记住统计可以解决的大量问题,尤其是当预测模型很难或不可能建立时。纵观统计文献,以及经济学、心理学和生物学等领域,数据科学家可以使用大量强大的方法来支持战略决策。

参考文献:

[1]徐友友。、广义综合控制方法:交互式固定效应模型因果推理 (2017),政治分析。

[2] K. H. Brodersen,F. Gallusser,J. Koehler,N. Remy 和 S. L. Scott,使用贝叶斯结构时间序列模型推断因果影响 (2015),应用统计年鉴。

当你在高尔夫球比赛中没有获得任何奖牌时,你会怎么做?

原文:https://towardsdatascience.com/what-to-do-when-you-dont-get-any-medal-in-a-kaggle-competition-b54cc433da3?source=collection_archive---------29-----------------------

就像梯度下降——从错误中学习!

几周前,又一场卡格尔比赛结束了——孟加拉语。人工智能手写字形分类。

来源: Kaggle

孟加拉语是世界上第五大通用语言。这项挑战希望改进孟加拉语识别的方法。它的字母表有 49 个字母和 18 个音调符号,这意味着有很多可能的字素(书面语言的最小单位)。

在这个竞赛中,我们应该预测这些字素的三个独立部分的类别——字素词根、元音发音符号和辅音发音符号。

两千多支队伍参加了比赛。起初我是一个人参加比赛,但过了一段时间后,五个人组成了一个团队。我们在这场比赛上花费了大量的时间和资源……却以第 254 名的成绩完赛,没有获得任何奖牌。

我对这些结果非常沮丧,闷闷不乐了一段时间。

来源:论坛

在此之后,我整理了我的想法,反思了我所做的事情,阅读了顶级团队的解决方案,并吸取了一些教训,我想分享一下。这些经验是通用的,可以应用于任何比赛。它们可以大致分为几个主题:思维模式和一般方法,编码实践,准备。

设置你的工作环境

来源: SlideShare

模特训练是 kaggle 比赛的主要部分,因此有必要为此做好准备。Kaggle 笔记本不错,但是 GPU 时间限制苛刻——每周只有 30h。因此,实验通常在我们自己的硬件上或云中运行。首先,有必要设置一个工作环境。这可以使用 pip、conda 或其他方式来完成。值得检查 kaggle 上的库版本,并在您的环境中安装相同的版本——不同的版本可能有不同的 API 或不同的逻辑。

硬件

来源: whatech

另一件重要的事情当然是硬件本身。如果我们有很多数据(就像在这场比赛中一样),在一张显卡上训练一个模型可能需要一天甚至更长时间。值得一提的是,运行实验通常会比训练最终模型花费更多的时间,因为我们需要尝试许多不同的东西。

我的 Windows PC 上有 2 个 1080ti,真的不够用。我在 Google Cloud 上租过多次 GPU,但是相当贵,于是开始寻找其他途径。

最近我听说了 Hostkey,他们提供网络服务,你可以租用他们的服务器。

他们有一个 T2 的宣传节目:

We offer **free GPU servers** to the winners of grants at large competition venues for their use in further competitions, for training or for personal projects related to data science.

作为交换,参与者应该在社交媒体上分享他们的反馈和经验。

一开始我得到了一个 4 x 1080ti 的服务器。设置环境没有问题,很快我就开始训练模型。在单个 GPU 上的训练效果很好,我开始逐渐增加使用的卡的数量。2,3 个 GPU 工作得很好,但是使用所有 4 个 GPU 都失败了——什么也没有发生。技术支持反应迅速,在几天内就调查了问题。结果发现服务器本身存在一些问题——处理器无法充分利用 4 x 1080ti。结果我换了另一台服务器 2x2080ti。起初有一个小问题,因为电源不够强大(双关语),但工程师们增加了另一个电源,问题就解决了。

从那时起,我在服务器上运行了许多模型,一切都很好。我喜欢这种体验,并计划在未来继续使用来自 Hostkey 的服务器。

有一个工作管道

来源: qiita

有一个好的工作管道是非常重要的。我所说的管道是指用于为训练、训练本身和推理准备数据的整个代码。使用一些高级框架是值得的,但是从头开始编写自己的代码也是一个好主意。主要的好处是可以快速改变事情,并且确保所有基本的事情都正常工作,你可以专注于高级的事情。

在这次比赛中,我开始在 Catalyst 中使用 Jupyter API,但由于一些问题,很快就停止了。一段时间后,由于我的队友,我切换到 Catalyst 的配置 API。对我来说效果更好,但需要花很多时间来适应。我的一个队友正在使用 fastai,唉,由于 fastai 的独特风格,我很难理解它。

因此,我认为选择一种方法(某个框架或你自己的管道)并坚持下去会更好。

代码优化

页面截图

很多人说人们写的代码很糟糕。事实上这往往是真的,一个主要原因是快速迭代的必要性,所以通常尝试一些新的想法比编写更好的代码更好。但这并不总是正确的。

有时候小的代码优化会产生巨大的影响。正如你在截图中看到的,做出推断的速度可以提高 30 倍。训练也会快得多,所以把事情做对很重要。

另一方面…

不要盲目相信来自论坛/内核的代码和想法

使用此站点生成

Kaggle 很棒,有很多很棒的笔记本,你可以用,也有论坛可以找到很酷的想法,对吧?不,不完全是。

虽然论坛上有很多高质量的笔记本和优秀的想法,但也存在一些问题:

  • 有一些笔记本在代码上有很小的错误,有错误的代码实践,有不正确的验证,有一些想法的错误实现和许多其他可能的问题;
  • 论坛上的一些想法可能会误导人。这不是因为人们想做坏事,不,其中一个原因是很多想法不能独立工作——有些想法只能与其他想法一起工作,有些需要足够好的分数模型等等;

所以,如果你想使用一些代码或者一些想法,首先检查并验证它们。

作为这一点的延续:

总是寻找新的想法并尝试它们

arxiv 论文

参加 kaggle 比赛最棒也是最酷的事情之一是,它将人们推向新的 SOTA 结果。为了取得最好的成绩,尝试新事物是必要的。所以阅读 arxiv 上的论文,寻找好的博客等等。但是仅仅阅读新方法是不够的——有必要尝试一下。为一些新想法编写代码可能很困难,但这是学习新事物的一种令人惊奇的方式。即使有些想法行不通,你也得到了有用的经验。

不要过多调整超参数

xkcd

这是一个常见的陷阱(我多次被发现)——有些人认为调优超参数会帮助他们获得很好的结果。这个想法有一些优点,但并不完全正确。

在表格竞争中,值得调优超参数两次:在最开始和最末尾。

开始时的调整很重要,因为梯度推进和其他模型必须针对不同的问题进行调整。不同的目标,不同的深度,叶子的数量和其他的东西会导致不同问题的不同分数。但是在你找到一些好的参数之后,把它们固定下来,直到比赛接近尾声的时候再去碰。当您添加新功能或尝试新想法时,请保持超参数不变,以便您可以比较实验。

当你用尽所有的想法时,你可以再次调整以获得分数的小幅增加。

对于深度学习来说,事情有点不同。超参数的空间是巨大的:你调整架构、损耗、增强、前后处理和其他事情。所以不可避免的,你会花更多的时间来优化事情。但仍然值得记住的是,一个好主意比调整小事情更能提高分数。

这些是我从这场比赛中学到的教训。我希望它们是有用的,并且真的希望我自己能够跟随它们:)

当你的数据对于你的内存来说太大了怎么办?

原文:https://towardsdatascience.com/what-to-do-when-your-data-is-too-big-for-your-memory-65c84c600585?source=collection_archive---------8-----------------------

使用 Panda 处理大数据

照片由来自 Pexels 的 Markus Spiske 拍摄

当我们在进行任何数据科学项目时,要采取的一个基本步骤是从 API 下载一些数据到内存,以便我们可以处理它。

在这样做的时候,有些问题是我们可以面对的;其中一个问题是有太多的数据需要处理。如果我们数据的大小大于我们可用内存(RAM)的大小,我们在完成项目时可能会面临一些问题。

那么,接下来该怎么办呢?

解决大*数据、*小问题有不同的选择。这些解决方案要么耗费时间,要么耗费金钱。

可能的解决方案

  1. 成本计算解决方案:一个可能的解决方案是购买一台新电脑,配备更强大的 CPU 和更大的 RAM,能够处理整个数据集。或者,租用云或虚拟内存,然后创建一些集群安排来处理工作负载。
  2. 时间成本解决方案:你的 RAM 可能太小,无法处理你的数据,但通常你的硬盘要比 RAM 大得多。那么,为什么不直接用它呢?使用硬盘来处理你的数据会使它的处理速度慢得多,因为即使是 SSD 硬盘也比 RAM 慢。

现在,这两种解决方案都非常有效,也就是说,如果你有资源这样做的话。如果您的项目预算很大,或者时间不是一个限制因素,那么使用其中一种技术是最简单、最直接的答案。

但是,

如果不能呢?如果你在做预算呢?如果您的数据非常大,从硬盘加载会增加您的处理时间 5X 或 6 倍甚至更多?有没有不花钱也不花时间的处理大数据的解决方案?

我很高兴你问了——或者我问了?。

您可以使用一些技术来处理大数据,而不需要花费任何资金或处理很长的加载时间。这篇文章将介绍三种技术,你可以使用熊猫来处理大型数据集。

技巧 1:压缩

我们要介绍的第一项技术是*压缩数据。*这里的压缩不是指把数据放在 ZIP 文件中;相反,它意味着将数据以压缩格式存储在内存中。

换句话说,压缩数据就是找到一种以不同的方式来表示数据的方法,这种方式将使用更少的内存。数据压缩有两种:无损压缩和有损一种。这两种类型只会影响数据的加载,不会导致代码的处理部分发生任何变化。

无损压缩

无损压缩不会造成任何数据损失。也就是说,原始数据和压缩数据在语义上是相同的。您可以通过三种方式对数据帧执行无损压缩:

在本文的剩余部分,我将使用这个包含美国不同县的新冠肺炎案例的数据集。

  • 加载特定列

我使用的数据集具有以下结构:

import pandas as pd
data = pd.read_csv("[https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv](https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv)")
data.sample(10)

加载整个数据集需要 111 MB 的内存!

然而,我真的只需要这个数据集的两列,county 和 case 列,那么我为什么要加载整个数据集呢?只加载我需要的两列需要 36 MB,这减少了 32%的内存使用。

我可以像这样使用 Pandas 只加载我需要的列

此部分的代码片段

  • 操作数据类型

另一种减少数据内存使用的方法是截断数据中的数字项。例如,每当我们将一个 CSV 文件加载到一个数据框的列中时,如果该文件包含数字,它将把它存储为需要 64 个字节来存储一个数值。但是,我们可以截断它,并使用其他 int 格式来节省一些内存。

int8可以存储-128 到 127 的整数。

int16可以存储-32768 到 32767 的整数。

int64可以存储从-9223372036854775808 到 9223372036854775807 的整数。

如果您知道特定列中的数字永远不会高于 32767,您可以使用一个int16int32,并将该列的内存使用减少 75%。

因此,假设每个县的病例数不能超过 32767 —这在现实生活中是不正确的—那么,我们可以将该列截断为int16 而不是int64

  • 稀疏列

如果数据有一列或更多的列存储为NaN的空值,你可以使用稀疏列表示来节省内存,这样你就不会浪费内存来存储所有这些空值。

假设 county 列有一些NaN值,我只想跳过包含NaN的行,我可以使用稀疏序列轻松地做到这一点。

有损压缩

如果执行无损压缩还不够呢?如果我需要进一步压缩数据,该怎么办?在这种情况下,您可以使用有损压缩,因此为了节省内存,您牺牲了数据的 100%准确性。

您可以通过两种方式执行有损压缩:修改数值和采样。

  • **修改数值:**有时,您不需要完全精确的数值数据,这样您可以将它们从int64截断到int32int16
  • **抽样:**也许你想证明有些州的 COVID 病例比其他州高,所以你对一些县进行抽样,看看哪些州的病例更多。这样做被认为是有损压缩,因为您没有考虑所有行。

技巧 2:分块

处理大型数据集的另一种方法是分块。也就是说,将一个大型数据集切割成较小的块,然后分别处理这些块。处理完所有数据块后,您可以比较结果并计算最终结果。

该数据集包含 1923 行。

假设我想找到病例最多的国家。我可以将我的数据集分成 100 行的块,分别处理每一行,然后获取较小结果中的最大值。

此部分的代码片段

技巧 3:索引

如果您只需要加载一次数据集,分块是很好的选择,但是如果您想要加载多个数据集,那么索引是一个不错的选择。

把索引想象成一本书的索引;你不需要阅读整本书就可以知道某个方面的必要信息。

例如,假设我想获得特定州的案例。在这种情况下,组块是有意义的;我可以写一个简单的函数来实现它。

索引与分块

在分块中,你需要读取所有数据,而在索引中,你只需要一部分数据。

因此,我的小函数加载每个块中的所有行,但只关心我想要的状态。这导致了巨大的开销。我可以通过使用熊猫旁边的数据库来避免这种情况。我能用的最简单的是 SQLite。

为此,我首先需要将我的数据框加载到 SQLite 数据库中。

然后我需要重新编写我的get_state_info函数,并使用其中的数据库。

通过这样做,我可以减少 50%的内存使用。

结论

处理大型数据集可能会很麻烦,尤其是当它不适合您的内存时。有些解决方案既费时又费钱,这是最简单、最直接的方法。

然而,如果您没有资源,您可以使用 Pandas 中的一些技术来减少加载数据的内存使用——如压缩、索引和抓取等技术。

当你的项目失败时该怎么办

原文:https://towardsdatascience.com/what-to-do-when-your-data-science-project-fails-6087b91c02cd?source=collection_archive---------50-----------------------

按目标

不要惊慌——通常情况下,事情是可以扭转的

照片由塑造的在的上

你可能已经知道这种感觉了。

你花了几周甚至几个月的时间寻找、收集、整理和清理数据。EDA 制作了一些有希望的图表。一切都表明绝对成功。

然后,在离项目截止日期还有几周的时候,你开始训练你的第一个模型。这太糟糕了。

第二个也是。第三个。

让我们明确一点,我不是在说当你希望准确率达到 90%的时候,有 80%准确率的模型。我说的是功能无用的模型。我说的是调整 R 平方的车型。

你到底是做什么的?

对于这篇博客中概述的建议,有一些警告——你采取的确切策略几乎肯定会受到环境的影响。这是个人项目还是专业项目?是否有一个迫在眉睫、不可动摇的最后期限?你的工作取决于这个吗?尽管如此,下面列出的步骤应该是大多数情况下的粗略指南。

提醒一下,我在这个【On Target】系列中一直在进行的项目是一个看似简单的项目——我们能根据哪些球员的历史表现预测他们将参与英超足球比赛的进球吗?

我最初试图构建的模型是一个二元分类器。数据集的每一行代表一场比赛中的一名球员。在那场比赛中,要么一名球员参与了进球,要么他没有,所以每一行的目标值是 1 或 0。

然后,我有 83 个特征,由几组不同的指标组成,以帮助告知球员是否会参与进球:

  • 玩家在最后一场比赛中的表现(包括总进球数、射门总数、命中目标数、禁区内射门数、头球总数、助攻数以及他为其他玩家创造的各种不同类型射门的数量)
  • 相同的一组指标,但是是过去 4 场比赛的平均值
  • 相同的一组指标,但根据情况对*最近 4 场主场比赛或最近 4 场客场比赛进行平均(我们知道比赛的场地会对表现产生重大影响)*
  • 即将到来的对手的防守统计数据,是他们最近 4 场比赛的平均值(即失球总数、失球总数、禁区内失球数等)。)
  • 在适当的情况下,在最近 4 场主场比赛或最近 4 场客场比赛中使用相同的综合防守数据

总之,这些特征告诉我们,在过去的几场比赛中,玩家的进攻有多好,他们即将到来的对手的防守有多好。这似乎是一个明智的起点。

对于模型构建本身,我确保我使用了彻底的训练/验证/测试数据分割,使用 GridSearchCV 来优化模型超参数(我将测试集与模型训练完全分开,以最好地复制模型在现实世界中的未来匹配情况)。

这种方法适用于一系列不同的适合二元分类的算法(逻辑回归、决策树、随机森林、SVM、XGBoost 等)。)

尽管各种模型在交叉验证的训练组中处理得相对较好,但当暴露在测试组中时,它们却挣扎得很厉害。做了这么多准备工作后,这有点让人摸不着头脑。

从这里去哪里?

数据是否适合模型?

一些模型可以在没有各种预处理步骤的情况下处理数据集(如果您正在处理不同类型的算法,这很容易忘记)。例如,支持向量机和神经网络在没有标准缩放的情况下苦苦挣扎。

类似地,如果数据不平衡(这个数据集就是如此,大约是 8 比 1),我们需要通过告诉算法按类对结果进行加权来缓解这种情况(大多数算法都有这样的功能),或者通过使用 SMOTE 算法创建合成数据。

您是否使用了最佳评估指标?

到目前为止,我一直使用准确性作为我的评估标准。这是非常标准的,通常可以对分类器进行全面的评估。

考虑以下混淆矩阵:

在理想世界中,我们希望 B 和 C 等于零,尽管这通常很难实现。因此,我们可以使用不同的评估指标来判断我们能够达到的状态有多接近。

精度由下式给出:

(A + D) / (A + B + C + D)

换句话说,在所有的预测中,这个模型的正确率是多少?

然而,请记住,我们数据集中的不平衡——大多数球员不会逐场比赛进球。对于我们的模型来说,简单地预测负面情况(没有进球)是相当琐碎的,因为这是我们九分之一的数据点的情况。事实上,一个简单预测每种情况下负面结果的模型将有 89%的准确性,尽管这显然是一个无用的模型。

让我们考虑一下我们最初的意图,并试着对此更明智一些。我想预测谁会进球,这样我就可以为我幻想的英超球队挑选这些球员。而且在任何时候,我的队伍中的球员数量都是非常有限的——从数百名可用球员中最多选出七名进攻球员。

因此,我实际上并不关心模型对每个玩家的猜测是否正确。如果模型只预测在给定的一周内有 10 名球员得分,而我选择了这 10 名球员,那么我不会真的关心其他人是否得分——我可以愉快地忽略这些假阴性。

因此,我实际上想要最大化的是精度。

A / (A + C)

采用这种方法也让我可以尝试预测阳性病例的阈值。与标准的 50%相比,我可以让模型更有辨识力——如果你有 60%或 70%的把握,只预测一个积极的情况。当然,这减少了正面案例的总数,但是它应该保留那些更好的案例(从而有助于提高精确度)。

你能使用不同的目标变量吗?

事实上,这些都没有帮助。我所有的模型仍然有着可怕的精确度,不管我为一个积极的预测设置了多高的门槛。

我开始思考我的目标变量的有效性。当然,球员是否进球似乎是预测球员是否会进球的明显起点。

事实证明,事情要比这稍微复杂一些。想想贾马尔·刘易斯,排名垫底的诺维奇城队的后卫,只有 0.2%的梦幻超级联赛经理选择他。他已经有三个多月没有射中目标了,而且是在和联盟中最好的防守之一比赛。

然后他去做了这个:

(目标在 2 点 35 分)

这不仅仅是一个难以预测的目标——它几乎是不可能的。除了趾高气扬的中后卫远距离射门,意外的进球也可能是由不幸的偏差、守门员的吼叫和球的反常移动造成的。相反,被钉进的球可能会被意想不到的守门员的神勇表现所否定,同样也会被门柱所否定。

因此,尝试预测实际进球的另一种方法是,根据球员射门的位置和质量,计算出预期球员会进多少球。

已经定义了不同类型的可能射门(它们是从球场上的什么地方拍摄的,它们是被脚还是被头球击中的,它们是否被另一个球员直接辅助等等。)我们可以看到各自的目标转化率(预期目标,或 XG)。我们还可以看到如果射门击中目标,进球转化率的提高。

总进球数/总射门数。OnTargetXG 作为目标上的目标/镜头给出

然后,我们可以查看玩家在游戏中拍摄的不同镜头,根据每个镜头的类型对他们拍摄的每个镜头的“XG”求和,并为该游戏中的玩家创建一个整体“预期目标”衡量标准。

注意——我们也可以对助攻(即,根据后续投篮的质量,我们预计球员会获得多少助攻)和总体预期进球参与度(XGI,预期进球加上预期助攻)进行同样的操作。

碰巧的是,每场比赛的预期进球(XG)和每场比赛的预期进球参与(XGI)似乎是以线性方式增加的——即在一场比赛中梅开二度的球员的平均 XG 大约是只进球一次的球员的 XG 的两倍。

XG 和 XGI 是有用的指标——它们很好地描述了倾向于参与进球的球员。他们还消除了一些随机边缘情况(如贾马尔·刘易斯对莱斯特城的晴天霹雳),否则这些情况会在训练中混淆模型。

鉴于 XG 和 XGI 是连续变量,这项工作成为一个回归问题,而不是一个分类问题。

长话短说,我用这个新的目标变量(使用我在分类尝试中使用的相同的、严格的测试/验证/训练数据分割方法)生成的模型并不成功。

使用调整后的 R 平方(因为我们有许多特征),我们可以看到模型最多只能解释预期目标/预期目标参与的 15-20%的差异。我们还可以看到训练集和测试集 R-Squared 之间的显著差异——尽管有交叉验证过程,我仍然受到过度拟合的困扰。

理解为什么事情不工作

可以说,事情到了这一步变得令人绝望。离我的最后期限只剩几天了,我已经快速通过了悲伤的必要阶段,我承认我不能在这个项目中展示一个工作的预测模型。

掌握这种结果的原因是很重要的,原因有很多(尤其是因为它给了你一个下一步该做什么的好主意,如果你有额外的时间或者需要把项目交给别人的话)。

值得一提的是,我认为我的造型存在以下问题:

  • 我几乎没有时间来迭代和调整特性集。特征通常彼此高度相关,一些特征,如“目标上的镜头”实际上是其他特征(“总镜头”)的子集。这完全排除了参数模型的使用。
  • 到目前为止,收集整个 19/20 赛季的数据产生了大约 4000 行数据——不坏,但不惊人。可以收集前几季的数据来支持这一点。
  • 这个项目的最初目标——预测足球比赛中的任何特定事件——从根本上说是非常困难的。尽管“预期目标”指标可以稍微消除随机性,但球员的表现在不同的比赛中可能会有很大的波动,看起来没有什么规律或原因。
  • 正如我的搭档所指出的,如果有人能在不到两个月的时间内独自完成这项工作,那么体育博彩市场早在几年前就已经崩溃了。

不要让你的努力白费!

需要注意的是,一般来说,空结果并不是没有价值的。事实上,根据您正在研究的特定假设,空值(即您的目标实际上无法预测的结论)可能与有效的预测模型一样重要。

就我而言,我无法预测英超联赛进球的事实对我表现不佳的 FPL 队来说是一个冰冷的安慰。然而,由于我项目的最初几个阶段,我确实发现自己坐在几千行干净、有组织的数据上。不把它用于某事就太可惜了。

在我的项目环境中,那个东西是一系列交互式仪表盘。它可能无法准确预测尚未进行的游戏的结果,但它确实让用户对玩家的表现有了一些独特的见解——当选择哪些玩家加入你的幻想团队时,你肯定可以使用这些工具来帮助决策(参见下面的视频以了解使用案例)。

这些交互式仪表盘可在我的网站上找到。有戏看你怎么想!

玩家表现的完全交互式视图

本赛季到目前为止的总结,汉斯·罗斯林风格…

团队绩效的汇总视图

让其他人试试吧…

这是一个艰难的问题——人类喜欢获得荣耀,单枪匹马“破解”梦幻英超是一个非常诱人的前景。但是数据科学本质上常常是一种协作追求。无论你是多么优秀的数据科学家,仍然会有成千上万的人比你更优秀。因此,本着这种精神,我邀请你看看你是否能得到更好的结果——我几乎可以肯定你能。

你可以在这里找到 GitHub 回购。

我期待看到你想出的东西…

这是我的博客系列“ 关于目标 ”中的最新帖子,在其中,我将尝试为梦幻英超建立“赚钱”工具。我很乐意听到关于这个博客的任何评论,或者这篇文章涉及的任何概念。欢迎在下方随意留言,或者通过LinkedIn联系我。

当您的模型具有非正态误差分布时该怎么办

原文:https://towardsdatascience.com/what-to-do-when-your-model-has-a-non-normal-error-distribution-f7c3862e475f?source=collection_archive---------5-----------------------

优化和机器学习

如何使用弯曲来拟合任意误差分布

照片由尼尔·罗森斯泰克T5【在 Unsplash

模型能告诉我们的最重要的事情之一是它在预测中有多确定。这个问题的答案可以以误差分布的形式出现。误差分布是关于点预测的概率分布,它告诉我们每个误差增量的可能性有多大。

误差分布可能比点预测更重要。

假设你是一个投资者,考虑两个不同的机会(A 和 B),并使用一个模型来预测一年的回报(以投资额的百分比表示)。该模型预测 A 和 B 具有相同的 10%的预期 1 年回报率,但显示了这些误差分布

即使两个机会有相同的预期回报,误差分布显示它们是多么的不同。b 紧紧围绕其期望值分布,损失金钱的风险很小;而 A 更像是彩票。高回报的可能性很小(大约 500%的回报);但是大多数时候,我们会失去一切(100%的回报)。

点预测没有告诉我们目标值可能分布在哪里。如果知道一个预测可以偏离多远很重要,或者如果目标值可以聚集在厚尾附近,那么精确的误差分布就变得至关重要。

错误分布的一个简单方法是试图强迫它变成一种它不接受的形式。当我们追求方便但经常被误用的正态分布时,这种情况经常发生。

正态分布很受欢迎是有原因的。除了使数学变得更容易之外,中心极限定理告诉我们正态分布可以是许多问题的自然选择。

正态分布如何自然产生?

X 表示特征矩阵,让 b 表示回归向量。假设目标值由以下等式生成

在哪里

中心极限定理说如果 E 是独立同分布的有限方差的随机变量,那么当 m 增加时,和将接近正态分布。

即使当 E 非常不正常时,如果求和包含足够多的项, e 也会接近正常。

我们来看一个具体的例子。设置 b = (-2,3) 。让 X 的条目独立于均匀分布 *[-1,1】*生成。我们将从这个明显的非正态分布中产生 E

我们将 e 的误差分布归一化,使其具有单位方差,并允许项数 m 变化。以下是最小二乘模型的误差直方图(橙色),这些误差来自不同的 m 值的模拟运行,如果误差呈正态分布(蓝色),则与误差的预期直方图重叠。

随着 *m、*值的增大,误差直方图越来越接近正态分布。

当有理由认为误差项可以分解为独立同分布因子的和时,正态分布是一个不错的选择。但在一般情况下,我们没有理由去假设它。事实上,许多误差分布是不正常的,表现为偏斜和厚尾。

当误差分布呈非正态分布时,我们该怎么办?

这就是翘曲帮助我们的地方。它使用正态分布作为构建模块,但为我们提供了局部调整分布的旋钮,以更好地适应数据误差。

为了了解扭曲是如何工作的,可以观察到,如果 f(y) 是单调递增的满射函数并且 p(z) 是概率密度函数,那么*p(f(y))f′(y)*形成了一个新的概率密度函数。

因为*f′(y)*≥0;应用替换 u=f(y) 后,我们看到

让我们看一个例子,看看 f 如何重塑一个分布。假设 p(z) 是标准正态分布 N(0,1)f(y) 定义如下

**其中c>0;【0,1】之间,f 是在 ycy 之间平滑过渡的样条。下面是几个不同的 c 值下 f 的样子

这是产生的扭曲概率分布的样子

c = 2 时,面积从标准正态分布重新分布,使得概率密度函数(PDF)达到峰值,然后快速下降,从而具有更细的右尾。当 c = 0.5 时,相反的情况发生:PDF 快速下降,然后减缓其下降速度,以便有一个更胖的右尾。

现在,想象一下 f 被一个向量 ψ 参数化,这个向量允许我们对增长率进行任意的局部调整。(后面更多关于如何参数化 f )。然后配合合适的 ψf 可以拟合各种不同的分布。如果我们能找到适当调整 ψ 的方法,那么这将为我们提供一个强大的工具来拟合误差分布。

如何调整整经参数?

更好的拟合误差分布使得训练数据上的误差更有可能。接下来,我们可以通过最大化训练数据的似然性来找到弯曲参数。

首先,让我们看看最大似然法是如何工作的,而没有扭曲。

θ 表示给定回归模型的参数向量。设g(x; θ) 代表模型对特征向量 x 的预测。如果我们使用具有标准差σ的正态分布来模拟预测的误差分布,则训练数据的可能性为

对数可能性是

(RSS 代表残差平方和)

对于 θ 固定,σ最大化可能性,当

更一般地,如果σ= cRSS(c>0,那么对数似然简化为

我们看到,当 θ 最小化 RSS 时,可能性最大。

现在,假设我们用由 ψ参数化的单调函数 f 扭曲目标空间。f(y;ψ) 表示扭曲的目标值。那么扭曲误差分布的可能性是

对数似然变成了

或与

σ = cRSS

为了拟合误差分布,我们将使用优化器来找到使这种可能性最大化的参数 (θ,ψ)

为了让优化器工作,它需要一个目标的局部近似值,可以用它来迭代地改进参数。为了建立这样的近似,我们需要计算对数似然相对于参数向量的梯度。

我们可以使用 L 作为对数似然的代理,因为它只相差一个常数。

Warping 是一个通用过程,可以应用于任何基础回归模型,但我们将重点关注最简单的基础模型,线性回归。

如何扭曲一个线性回归模型?

通过线性回归,我们可以推导出 θ 的封闭形式。设 QR 为特征矩阵 X 的 QR 分解的矩阵

其中 Q 是正交的,R 是直角三角形。放

并且让 表示使扭曲目标 z 的 RSS 最小化的向量

然后

如果 X 有 m 个线性独立列,那么矩形三角形矩阵 R 的前 m 行在对角线上有非零项,其余行为 0。因此

对于 i ≤m

对于我>米*。因此,*

设 P 是 n×n 对角矩阵,其中

一组

然后

将这些等式代入对数似然代理,我们得到

对翘曲参数进行微分可以得到

使用这些导数,优化器可以攀升到扭曲参数 ψ 以最大化训练数据的可能性。

如何用扭曲线性回归模型进行预测?

现在我们已经找到了扭曲参数,我们需要做预测。

考虑这在标准的普通最小二乘模型中是如何工作的。假设数据是从模型中生成的

其中 εN(0, σ)中。让 Xy 表示训练数据。使训练数据的 RSS 最小的回归量是

如果x′和 y表示样本外特征向量和目标值

那么样本外预测的误差为

因为 εε′正态分布,所以e′正态分布,方差 is⁴

我们很少知道噪声方差σ,但我们可以使用这个等式获得它的无偏估计

其中 p 是回归数。

假设现在普通的最小二乘模型适合扭曲的目标值

普通的最小二乘法为我们提供了潜在空间的点预测和误差分布,但是我们需要反转扭曲来获得目标空间的预测。

代表样本外特征向量x’的潜在预测。如果 s 是估计的潜在噪声方差,则目标值 y 的概率是

预期的目标值是

在进行了替换 u=f(y) 之后,期望值可以改写为

可以使用牛顿法来计算 f 的倒数,以找到f(y)-u,的根,并且可以使用高斯-埃尔米特积分来有效地计算积分。

有哪些有效的整经功能?

让我们把注意力转向翘曲函数f(y;ψ)* 以及如何参数化。我们希望参数化允许各种不同的函数,但我们也需要确保它只允许单调递增的满射翘曲函数。*

观察翘曲函数在重缩放下不变:c f(y;ψ) 导致与f(y;ψ)* 。设置θ’使g(x;θ)= c g(x;θ).然后对数似然代理 L(ψ,θ’)c f(y;ψ) 是*

重要的是扭曲函数如何改变目标值之间的相对间距。

翘曲的一个有效函数族是

每个 tanh 步骤都允许对翘曲函数的斜率进行局部改变。 t 项确保翘曲函数是单调满射的,并且当 t 远离任何一步时回复到恒等式。由于缩放的不变性,没有必要给 t 增加缩放系数。

我们将做一个额外的调整,使弯曲函数的平均值为零。放

一道例题

Dataset⁵社区和犯罪组织提供全美不同地区的犯罪统计数据。作为一个回归问题,任务是从不同的社会经济指标来预测暴力犯罪率。我们将对数据集拟合一个扭曲的线性回归模型,并与普通的最小二乘模型进行比较。

让我们来看看适合最大化训练数据的对数似然的弯曲函数。

设σ表示潜在空间中的估计噪声标准偏差。为了直观显示该函数如何改变误差分布,我们将绘制范围

跨越目标值

在较低的目标 values⁶.下,扭曲会使预测的误差范围变小

为了了解扭曲是否会带来更好的结果,让我们在社区数据集的十倍交叉验证上比较扭曲线性回归模型(WLR)和普通最小二乘模型(OLS)的性能。我们使用平均对数似然(MLL)作为误差测量。MLL 对 cross-validation⁷.中每个样本外预测的对数似然进行平均

结果显示,扭曲线性回归的表现要好得多。深入研究一些随机选择的预测及其误差分布有助于解释原因。

**

值的范围自然地被限制在零,并且变形将概率密度函数整形为逐渐变小,以便有效目标值有更多的概率质量。

摘要

使用正态分布来模拟误差是很诱人的。它使数学变得更容易,并且中心极限定理告诉我们,当误差分解成独立同分布随机变量的和时,正态性自然出现。

但是许多回归问题并不适合这样的框架,误差分布可能远非正常。

当面对非正态误差分布时,一种选择是变换目标空间。使用正确的函数 f ,当我们用 f(y) 替换原来的目标值 y 时,可能会达到正态性。问题的细节有时会导致对 f 的自然选择。在其他时候,我们可能会用一个固定转换的工具箱来解决问题,并希望其中一个能够打开常态。但这可能是一个临时的过程。

扭曲将转换步骤变成了最大似然问题。warping 没有应用固定的转换,而是使用参数化的函数,这些函数可以近似任意的转换,并在优化器的帮助下使函数适合问题。

通过转换函数,warping 可以捕捉误差分布中的非正态性,如偏斜和厚尾。对于许多问题,它可以提高样本外预测的性能,并避免使用固定变换。

对构建扭曲模型感兴趣?查看 Python 包 峰值引擎

脚注

e .斯尼尔森,CE Rasmussen,Z Ghahramani。扭曲高斯过程。神经信息处理系统的进展 16,337–344

单位美国商业部,人口普查局,1990 年美国人口和住房普查:简要磁带文件 1a 和 3a(计算机文件),

美国商务部、DC 华盛顿州人口普查局和密歇根州安阿伯市大学间政治和社会研究联合会。(1992)

美国司法部、司法统计局、执法管理和行政统计(计算机文件)美国商务部、DC 华盛顿州人口普查局和密歇根州安阿伯市大学间政治和社会研究联合会。(1992)

美国司法部、联邦调查局,《美国的犯罪》(计算机档案)(1995 年)

Redmond,M. A .和 A. Baveja:一个数据驱动的软件工具,用于在警察部门之间实现合作信息共享。欧洲运筹学杂志 141(2002)660–678。

对在线黑客马拉松有什么期待

原文:https://towardsdatascience.com/what-to-expect-from-an-online-hackathon-138665bc5d8a?source=collection_archive---------62-----------------------

你将不得不做出什么样的取舍?

照片: AltumCode ,萨曼莎·博尔赫斯,马里奥·高@https://unsplash.com/

这一年给工作场所、学术界以及我们如何度过业余时间带来了许多变化。许多原本要面对面举行的活动现在都在网上进行。这有其好处,但也有挑战。

我决定报名参加在得克萨斯州 A&M 举行的 2020 年 TAMU 数据马拉松,因为去年我有一次很棒的经历。是的,我再次被录取了,因为我知道,由于不再有物理空间的限制,一个大厅里可以安全地容纳多少人,所以参与者的数量增加了一倍。

至此,so 2019 ( 此处阅读帖子)。一切都与 2019 年的活动非常相似:在线申请,注册 Slack 频道,如果可能的话,在活动前几天找到队友,从周六中午到周日中午花 24 小时工作。

几天前,我找到了另外两个参与者来组成一个团队。直到活动真正开始时才宣布挑战,所以很难招募成员获得技能,我只能通过谁有兴趣来组建一个小团体。我认为三个是理想的。

接下来的主要分歧是:你不需要前往活动地点,而只是从黑客马拉松网站、Slack 频道、视频流(仪式)中获取所有信息,或许还会参加一些视频通话(例如,组织者的指导课程)。

我想细述这次经历的好处和挑战,以及我从中收获了什么。

赞成的意见

  1. 在舒适的家中享受安静的工作时间。睡在自己的床上而不是睡袋有它的好处。
  2. 使用大屏幕工作站而不是小型笔记本电脑,立即提高工作效率。
  3. 减少数百名其他黑客的干扰和干扰。
  4. 节省旅行的金钱和时间。你可以参加比面对面更多的在线黑客马拉松。然而,如果黑客马拉松在城里举行,这些节省可能不太显著。
  5. 不用排队挂号。否则这可能需要一个小时。
  6. 显而易见的一条:不要生病。

骗局

  1. 与您的团队成员没有即时面对面的互动。
  2. 每个人都在做自己的事情,定期检查和状态报告是很重要的。
  3. 不太可能与团队以外的人交往。
  4. 数据科学的多用户环境,比如 Google Colab 笔记本,还不是很成熟。覆盖发生时,Colab 比 Git 更容易丢失工作记录。
  5. 可能会被来访者、家人等分散注意力。
  6. 你必须自己做食物。没有免费的晚餐和饮料。

结果

从正反两方面来看,似乎各种论点或多或少是平衡的。但是再想一想,如果你可以在面对面和在线之间进行选择,那么为什么直到现在我们还没有这么多在线黑客马拉松呢?

如果事先没有制定规则,在团队中远程工作会是一个很大的挑战。我的印象是,启动阶段,即搜索数据、收集和评估,是我们项目中最需要协作的部分,从那以后就安静下来了。我真的认为经常报告每个人在做什么很重要,并且互相帮助解决问题,找到解决方案或重构的方法。例如,定期(1-2 小时)与团队进行语音通话以分享结果、需求和计划可能是个好主意。2019 年,我的团队坐在一起,所有人都在他们的 Jupyter 笔记本上工作——不断解释每个人在做什么。今年,我想尝试一下 Google Colab ,因为我认为这将改善协作,让每个人都添加到同一个文件中,所有的进展都可以立即看到。但这被证明是一个主要的痛点。我记得有过几次不愉快的情况,在滞后的同步过程中单元格内容被删除,不得不重写笔记本的大部分内容。在从 Colab 中消除同步问题之前,建立 Git 存储库可能是更可靠的方法。

我的裁决

我认为一旦许可,黑客马拉松很可能会回到现场活动。但我也希望它们可能成为混合赛事,如果在线流媒体和本地人的双重组织不是太多。它将允许远程参与者从该国的另一端侵入,并可能进一步提高受欢迎程度和参与率。团队需要调整他们的沟通频率和风格,以适应这种新的合作模式,从而获得与面对面同样好的结果。

你怎么想呢?你参加过黑客马拉松吗?你有什么经历?

原载于 2020 年 11 月 15 日https://www . Christian Haller . me

数据科学的头两年有什么可期待的

原文:https://towardsdatascience.com/what-to-expect-in-the-first-two-years-of-data-science-3033bf0b1404?source=collection_archive---------11-----------------------

回顾我从事数据科学的头两年(8-10 个财政季度及以后)

介绍

在中,我的数据科学生涯有一百万种方式没有按计划进行。我已经分享了我的一些最大的错误。我分享了一些我在 T4 最喜欢的日子。

这篇文章是写给那些有兴趣了解他们应该从数据科学职业中得到什么类型的工作任务的人的。我也推荐这篇文章给任何对评估自己职业感兴趣的人。将你的经历与我的(或其他人的)经历进行比较,可能有助于你找到正确的视角。下面,我邀请你联系我,如果你有兴趣进入该领域。我在晚年转向了数据科学。我很乐意帮助别人做同样的事情。

数据科学家的工作大致分为四大类。这些包括计划、工具、科学和传播。我经常收到的一个问题是,作为一名数据科学家,你的大部分时间是如何度过的?我从经验中了解到,这些问题的答案至少部分取决于你在这个角色中呆了多久;你如何度过你的时间,会随着时间而改变。

本文将回顾这四个高级别工作类别中的每一个,然后解释这些类别中的工作分配将如何开始,然后随着时间的推移而变化。

工作的四个类别

发行是如何开始的

这里有一个合理的分类,说明在最初的几个星期里,你将如何在这四个任务类别中的每一个上花费时间。

图片来源:作者对数据科学前几周工作的再现。

这项工作包括什么

**计划:**与选择需要回答的问题相关的过程。有时候,发现一个问题更好的框架是选择一个需要解决的问题。计划还包括检查其他人是否已经回答了问题或解决了问题。

**工具化:**工具化包括选择最适合回答问题或解决问题的工具。这意味着审查现有的工具和方法。工具化通常也意味着定制现有的工具或者构建新的工具。

科学:可以说,科学可以被定义为提出和回答一个问题,然后传播它的过程。就本文而言,我将科学定义为花费时间和精力收集数据并执行过程早期制定的计划。这意味着,将先前选择的工具和方法应用于该数据。更详细地说,这包括调整模型和参数,以及解释和比较输出结果。

**传播:**这是报告结果的过程。报告结果可以通过多种方式出现,包括出版、文章或报告。这可能还包括对小型或大型团体的演示。传播是指你分享最初的问题,揭示你的答案或解决方案,描述你的数据和方法,并且对你工作的相对优势和劣势保持透明。

当你花 30%的时间在计划上,超过 40 小时的工作周,相当于一天半或 12 小时。在一个多月的时间里,包括大约 20 个工作日,你将花其中的 6 天做计划。

同样,你也可以在工具和科学上花费同样多的时间。这使得一周中有 4 个小时用于传播。或者在一个 20 个工作日的月份中,大约有 3 天的时间用于传播。

工作分配如何随时间变化

你如何度过你的时间,会随着时间而改变。

头两年

下图提供了有关数据科学工作以及工作性质如何随时间变化的大量信息。它表明,在周期开始时,实际进行的科学研究往往是有限的。直到第二年(Q 2.1 和 Q 2.2),这份工作的科学性还不到 50%。然后,紧接着花在实际科学上的时间的增加,科学的数量显著下降。随着科学的推进,工作立即转移到传播先前的结果,然后为前方的下一个周期做更多的计划。

图片来源:作者对数据科学前两年工作的再现。

此图描绘了一个事件版本,显示了计划在第二年的第三和第四季度恢复到大约 30%所花费的时间和精力。在第二年的后期,工具会减少,因为第一年早期执行的工具工作应该是可重用的。第一年早期花在工具上的时间现在可以用来传播前面的结果了。

两年后,一个惯例出现了

在最初的两年后,可能会形成一个常规。有一个自然循环。这个周期开始类似于一个循环,你花大约两个季度的时间进行传播和计划。传播与最近的过去的发现有关,规划与执行后续步骤有关。然后,两个季度将专注于涉及执行计划的科学。最终回到几个季度的计划和传播。

图片来源:作者对数据科学领域工作的再现。

结论

本文回顾了数据科学中的四个高级工作类别,包括规划、工具、科学和传播。本文还解释了这些类别之间的工作分配将如何开始,然后随着时间的推移而变化。

免责声明是,这些信息是基于我的经验。您的体验或结果可能会有所不同。你的经历可能不同的一个原因是,在我职业生涯的早期,我曾为一家非营利组织工作,该组织认为聘请一名数据科学家是明智的。一位科学家。一个。

科学是一项团队运动。我相信单飞迫使我在计划和工具上花更多的时间。如果我在一个团队环境中,计划和工具工作可能会在我们的团队成员中分配。此外,工具和计划在团队环境中进行得更好更快。

[## 加入我的介绍链接媒体-亚当罗斯纳尔逊

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

adamrossnelson.medium.com](https://adamrossnelson.medium.com/membership)

如果你正在考虑从事数据科学方面的职业,这些信息是很重要的。例如,如果您目前是一名开发工具的工程师,并且您最喜欢的工作任务与开发这些工具相关,那么您最初可能会很高兴担任数据科学的角色。但是,以后当您的工作远离工具时,您可能会体验到工作满意度的降低。

作为一名未来的数据科学家,这些信息也可能有助于你面试职位。问未来雇主或客户的一个好问题是,你希望我花多少时间在计划、工具、科学或传播上。一些组织将把这项工作的部分职责交给非数据科学家。比如,传播可能是营销团队为你做的事情。或者,你可能会发现高管团队更喜欢在你处于幕后的时候传播你的工作。讨论这些动态是我建议你在接受工作机会或签署合同之前与未来雇主或客户进行的许多讨论之一。

对于任何希望雇佣数据科学家或建立数据科学家团队的人来说,这些信息也是有帮助的,因为它将帮助您了解您可以从该科学家或团队那里得到什么。例如,你不应该马上期待结果。你的科学家或团队将需要时间来计划和工具。然后他们需要时间来做科学研究。如果一切顺利,最终会有有意义的结果*——不是马上。*

感谢阅读

感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelsonLinkedIn:亚当罗斯尼尔森。

2021 年成为数据科学家要学什么

原文:https://towardsdatascience.com/what-to-learn-to-become-a-data-scientist-in-2021-95970d4b3b17?source=collection_archive---------4-----------------------

以及为什么数据科学通才会胜出

马库斯·温克勒在 Unsplash 上的照片

几年前,当我开始学习数据科学时,大多数招聘广告都要求获得数学、统计学或类似学科的博士学位,或者至少是硕士学位。

在过去的几年里,事情发生了变化。随着机器学习库的发展,抽象出了算法背后的许多复杂性,并且认识到实际应用机器学习来解决商业问题需要一系列技能,这些技能通常不是通过单独的学术研究获得的。公司现在雇用数据科学家是基于他们执行应用数据科学的能力,而不是研究能力。

在尽可能短的时间内为企业带来价值的应用数据科学需要非常实用的技能组合。此外,随着越来越多的公司将其数据和机器学习解决方案迁移到云,数据科学家了解与此相关的新工具和技术变得至关重要。

此外,我相信,数据科学家只研究数据建模,使用数据工程师收集的数据,然后将模型交给软件工程师团队投入生产的时代已经过去了。尤其是在亚马逊、脸书和谷歌等科技巨头之外。在大多数公司中,除了一些非常大的技术公司,这些团队要么没有可用的资源,要么没有在正确的时间调整优先事项。

“有句谚语说,‘什么都懂,什么都不懂。’说到成为一名数据科学家,你需要有点像这样,但也许更好的说法是,“多面手,精通一些。”" 布伦丹·蒂尔尼 ,Oralytics 首席顾问。

为了让数据科学家向企业交付最大价值,他们需要能够在整个模型开发生命周期中工作。至少具备开发数据管道、执行数据分析、机器学习、数学、统计学、数据工程、云计算和软件工程方面的工作知识。这意味着,随着我们迈向 2021 年,数据科学家通才是大多数企业的首选。

“画面越大,潜在的人类贡献就越独特。我们最大的优势是与狭隘的专业化正好相反。是广泛融合的能力。”大卫·爱泼斯坦(David Epstein),为什么通才在专业化的世界里取得胜利。

本文并没有涵盖 2021 年成为数据科学家所需的全部内容。相反,它涵盖了新老关键技能,在不久的将来,这些技能已经成为每个成功的数据科学家最基本的技能。

1.Python 3

仍然有一些情况下,数据科学家可能会使用 R,但一般来说,如果你现在正在做应用数据科学,那么 Python 将是最有价值的编程语言。

Python 3(最新版本)现在已经成为大多数应用程序的默认语言版本,因为大多数库在 2020 年 11 日放弃了对 Python 2 的支持。如果你现在正在学习数据科学的 Python,选择一门与这个版本兼容的课程是很重要的。

你需要很好地理解这门语言的基本语法,以及如何编写函数、循环和模块。熟悉 Python 面向对象和函数式编程,能够开发、执行和调试程序。

2.熊猫

Pandas 仍然是数据操作、处理和分析的头号 Python 库。在 2021 年,这仍然是数据科学家最重要的技能之一。

数据是任何数据科学项目的核心,Pandas 是一个工具,它将使您能够提取、清理、处理数据并从中获得洞察力。如今,大多数机器学习库也普遍将熊猫数据帧作为标准输入。

3。SQL 和 NoSQL

SQL 自 20 世纪 70 年代就已经存在,但它仍然是数据科学家最重要和最需要的技能之一。绝大多数企业使用关系数据库作为他们的分析数据存储,而作为一名数据科学家,SQL 是向你提供这些数据的工具。

NoSQL(“不仅是 SQL”)是不将数据存储为关系表的数据库,而是将数据存储为键值对、宽列或图形。示例 NoSQL 数据库包括 Google Cloud Bigtable 和 Amazon DynamoDB。

随着公司收集的数据量增加,非结构化数据在机器学习模型中的使用越来越频繁,组织正在转向 NoSQL 数据库,作为传统数据仓库的补充或替代。这种趋势可能会持续到 2021 年,作为一名数据科学家,至少对如何以这种形式与数据交互有一个基本的了解是很重要的。

4.云

根据 O'reilly 在今年 1 月发布的一份名为‘2020 年云的采用’的报告,88%的组织目前正在使用某种形式的云基础设施。新冠肺炎的影响很可能进一步加速了这种采用。

“乍一看,云的使用似乎势不可挡。超过 88%的受访者以这样或那样的形式使用云。大多数受访组织还预计在未来 12 个月内使用量会增加。”由罗杰·马古拉和史蒂夫·斯沃耶撰写。

在企业的其他领域使用云通常与基于云的数据存储、分析和机器学习解决方案密切相关。谷歌云平台、亚马逊网络服务和微软 Azure 等主要云提供商正在快速开发用于培训、部署和服务机器学习模型的工具。

作为一名在 2021 年及以后工作的数据科学家,你很可能会处理存储在基于云的数据库中的数据,如谷歌 BigQuery,并开发基于云的机器学习模型。随着我们进入 2021 年,这方面的经验和技能可能会非常受欢迎。

5.气流

Apache Airflow ,一个开源的工作流管理工具,正迅速被许多企业用于 ETL 过程和机器学习管道的管理。谷歌和 Slack 等许多大型科技公司都在使用它,谷歌甚至在这个项目的基础上构建了他们的 cloud composer 工具。

我注意到,在招聘广告中,气流越来越多地被作为数据科学家需要的技能。正如本文开头提到的,我认为数据科学家能够为分析和机器学习建立和管理自己的数据管道将变得更加重要。气流越来越受欢迎,至少在短期内可能会继续,作为一个开源工具,肯定是每个初露头角的数据科学家都应该学习的东西。

6.软件工程

数据科学代码传统上是混乱的,并不总是经过良好的测试,并且缺乏对样式约定的遵守。这对于初始数据探索和快速分析来说很好,但当涉及到将机器学习模型投入生产时,数据科学家需要对软件工程原理有很好的理解。

如果你计划成为一名数据科学家,你很可能要么自己将模型投入生产,要么至少大量参与这个过程。因此,在你从事的任何学习中,涵盖以下技能是至关重要的。

  • 代码约定,比如 PEP 8 Python 风格指南。
  • 单元测试。
  • 版本控制,例如 Github。
  • 依赖性和虚拟环境。
  • 集装箱,如码头工人。

在这篇文章中,我想强调在数据科学家所需技能方面出现的一些关键趋势。这些见解是从查看当前数据科学招聘广告、我自己作为数据科学家的工作经验以及阅读涵盖该领域未来趋势的文章中收集的。

这并不是一份详尽的清单,要成为一名成功的数据科学家,当然还需要更多的技能和经验。然而,在这篇文章中,我想涵盖一些最重要的技能,这些技能很可能在未来的一年中被需要。

如果你正在学习成为一名数据科学家,为了获得你应该学习的更全面的技能列表,我写了一系列文章给出了完整的学习路线图。下面是它们的链接。

[## 编程技能,学习数据科学的完整路线图—第 1 部分

数据科学编程技能的完整指南,包括免费学习资源的链接。

medium.com](https://medium.com/vickdata/programming-skills-a-complete-roadmap-for-learning-data-science-part-1-7913b289751b) [## 数据分析,学习数据科学的完整路线图—第 2 部分

我的学习数据科学的完整路线图的第二部分着眼于数据所需的重要技能…

medium.com](https://medium.com/vickdata/data-analysis-a-complete-roadmap-for-learning-data-science-part-2-25f8d1abc1fd) [## 数学与统计,学习数据科学的完整路线图—第 3 部分

数据科学的数学和统计学中的关键概念,以及在哪里学习它们。

medium.com](https://medium.com/vickdata/maths-and-statistics-a-complete-roadmap-for-learning-data-science-part-3-e1ec585195cf)

感谢阅读!

我每月发一份简讯,如果你想加入请通过这个链接注册。期待成为您学习旅程的一部分!

在您的数据科学导师身上寻找什么

原文:https://towardsdatascience.com/what-to-look-for-in-your-data-science-mentor-22eb1624b3dd?source=collection_archive---------50-----------------------

办公时间

伟大导师的构成

由约书亚·内斯在 Unsplash 上拍摄的照片

在我上一篇文章“ 寻找数据科学导师 ”的后面,我收到了很好的反馈,但我意识到自己犯了一个小学生才会犯的错误。我没有足够详细地描述人们应该从他们的数据科学导师那里寻找的东西。

[## 寻找数据科学领域的导师

如何爬上巨人的肩膀

towardsdatascience.com](/finding-a-mentor-in-data-science-9863de5b3620)

因此,这篇文章将涵盖当一个人试图找到他们的导师时应该寻求的各种东西。

如前所述,导师可以在许多方面帮助你更快地在职业生涯中脱颖而出。无论是增强你接受新挑战的信心,通过分享他们的知识来发展你的技能,还是打开其他大门,公平地说,有一个好的导师会减少你的学习时间。

关系

有一个虚拟导师是很好的——我指的是你因为这样或那样的原因无法接触到的人,但他们有大量的在线内容可供消费(例如吴恩达)——然而,有时你可能希望找到一个可以密切合作的导师,所以反馈回路对你来说更快,更具体,更个性化。

考虑到你将和一位导师密切合作,这是常有的事,你会希望有一个和你联系的人。你最不想要的就是和一个假装关心你职业生涯的人建立强迫关系。好吧,也许这有点苛刻。他们可能确实关心你做得好不好,但是如果你与某人脱节,就很难服从他们。

“了解一个人需要时间和持续的努力,才能将关系发展到一个真诚的地方,在那里有价值的反馈是积极而有效的。”

仅仅因为某人有大量的追随者,或者总体上是一个好的实践者,并不意味着他们适合做你的导师。你应该能够和他们建立联系,并有一个牢固的纽带,这将有助于无缝和真实的沟通。

不同的帽子

如果你的数据科学导师要帮助你走出你的舒适区,他们应该在你的舒适区之外。在爱德华·德·博诺所著的《六顶思考帽》一书中,作者认为,当一群同质的人看待事物时,更容易忽略对事物整体有贡献的有价值的方面。

因此,一个拥有真正不同视角的导师(在本书中,各种视角被称为帽子)真的可以帮助你看到更全面的图景…

“这里的想法是,有人从一个完全陌生的角度看你,这可能会感到不舒服,会改变你的视野,让你更清楚地看到事物的范围。”

缩小范围,有一个戴着不同帽子或有不同观点的导师意味着他们对你来说是多样化的。他们不一定和你学一样的课程,不一定和你一样长大,不一定和你是一个种族,或者不一定和你是一个性别,等等。

技能

导师的角色是在你的旅程中为你导航,因此他们会对路线有所了解。通常,你会希望你的导师被认为是同一领域的专家。我知道有些人可能不同意我的观点,我愿意倾听他们的意见,但是,我对此很严格。一个原因是,与你所在领域的可信专家(即数据科学家)共事,可以让你利用他们的可信度。此外,将机器学习问题带给你的人生导师(假设而言),并期望他们与你坐在一起,提供解决问题的策略,这将是一个挑战。

信任

在学员眼中,导师可能被视为父亲/母亲的角色(考虑到年龄范围更接近,也可以被视为兄弟姐妹)。我提出这一点是为了说明一个导师所需要的信任程度。很可能你会向这个人敞开心扉,你会充满信心地这样做,因为他们会把你的最佳利益放在心上。

“要让信任有效,它必须是相互的。就像人们对你的导师抱有信任一样,他们也会对你抱有同样的期望。”

包裹

归根结底,我们都知道有一个导师会给我们的生活带来什么价值。因此,我们有必要寻找那些挑战我们在超出我们技术能力的方面提高的导师。此外,数据科学领域的优秀导师喜欢挑战性问题,因为这允许他们在回答问题时思考自己的过程。帮助你成功的导师不会害怕给你批评性的反馈,不管是积极的还是消极的,你应该乐于接受。

希望这篇文章可以帮助你明白,为什么仅仅因为你看到某人完成了什么事情,比如赢得了一场 kaggle 比赛,就去找他,并不足以证明为什么有人应该成为你的导师。

让我们继续 LinkedIn 上的对话…

[## Kurtis Pykes -数据科学家-自由职业者,自由职业者| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有 3 个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/?originalSubdomain=uk)

准备解决方案架构师考试需要学习什么

原文:https://towardsdatascience.com/what-to-study-to-prepare-for-solutions-architect-exam-9d678f99dc9f?source=collection_archive---------63-----------------------

或者构建复杂系统需要加强的技能

丹尼尔·麦卡洛在 Unsplash 上的照片

你决定成为一名解决方案架构师。很棒的选择!实现它的方法之一是通过适当的认证。目前,最受欢迎的是 AWS 解决方案架构师、 Azure 解决方案架构师和谷歌云架构师。获得认证证明你获得了一定的知识,你能够设计复杂的系统。我将指导您完成准备 AWS 解决方案架构师考试的必要基础知识。然而,这些基础知识可以成功地应用于其他认证。

成为解决方案架构师并不是一件容易的事情。首先需要成为一名优秀的工程师。这意味着你已经非常了解算法,并且知道如何有效地应用它们。一个好的开发人员有设计复杂架构系统的经验。花些时间为它做好准备,并专注于以下基础。

计算能力

这是任何云系统的基本支柱。无论云中的幕后是什么—真实的物理服务器还是虚拟环境。对我们来说,重要的是有一个专门的地方来运行应用程序,并有能力妥善处理工作负载。因此,理解供应不同类型的计算系统的概念是关键。如果应用程序消耗大量的计算资源,那么系统应该有足够的 CPU 和 RAM。如果应用程序执行许多 I/O 操作,那么系统需要集中精力进行资源调配。理解应用程序的必要性有助于定义系统的需求。例如在亚马逊上,弹性云计算(EC2)是一种提供计算能力的服务。它有各种类型的实例来满足不同的需求。选择得当也能节省成本。

除此之外,一旦用户群增加,可伸缩性问题可能会出现。这里出现了自动缩放的概念。如果没有足够的资源,它会自动增加计算机的数量。自动缩放组(ASG)是 AWS 中为此提供的服务。当越来越多的机器开始工作时,流量应该在它们之间平均分配。弹性负载平衡器(ELB)是 AWS 中帮助应对这一挑战的另一项服务。

当应用程序很简单的时候,可以把它变成无服务器的。这意味着既不会调配服务器,也不会调配负载平衡器。一切都由云处理,云可以根据流量自动伸缩。应用程序可以是一个函数或函数链。云系统负责执行它们,因此得名无服务器。Amazon Lambda 就是执行这些功能的服务。

储存;储备

有许多不同类型的存储可用—对象存储、块存储或适用于不同操作系统的文件系统。它们中的每一个都有自己的用途和应用。作为一名解决方案架构师,您应该能够选择一个合适的解决方案来满足需求,保证良好的性能,并使其具有成本效益。

对象存储(在 AWS 中是 S3)用于简单的对象,如视频、图像、文档等。它提供了数据的高持久性,可以用作应用程序资产的存放位置。

块存储(AWS EBS)是具有块级结构的高性能存储。这种类型的存储器一次只能连接到一台机器。但是有一个选项可以将它分离出来,以后在另一台机器上使用。

文件系统存储(AWS EFS)提供了一个像文件和文件夹一样的公共结构。它适用于在计算机群中共享访问所需数据的场景。它充当网络驱动器,可以由多个用户同时使用。

数据库

应该清楚地了解数据在数据库中是如何组织的。在选择数据库之前,问自己以下问题:

  • 您需要在表上执行复杂的查询和连接吗?
  • 谁将负责维护和更新?

有不同的数据库类型:关系型和非关系型。为解决方案选择合适的数据库至关重要,因为它决定了未来的性能和可扩展性。使用关系数据库,数据更加结构化,这使我们能够运行不同种类的查询。非关系数据库以不同的方式组织保存和查询数据(例如作为键值存储)。这使得水平缩放变得更加容易。

接下来的事情是选择是否是无服务器的。无服务器数据库由云自动维护和扩展。AWS 的 DynamoDB 是一个无服务器的非关系数据库,其中的数据被组织为键值存储。对于关系数据库,AWS 提供了具有不同引擎的 RDS 以及 Aurora 和 Aurora Serverless(都是亚马逊的专有数据库)。

除此之外,您还必须记住将进行多少次读写操作。例如,如果一个数据库被组织中的许多其他部门读取,那么可以考虑使用读取副本。如果有很多相同数据的读取,那么使用 Elasticache 缓存频繁的请求是您的选择。

建立工作关系网

了解什么是公共网络和私有网络。在分布式系统中,通信是通过网络组织的。使用无类域间路由 (CIDR)限制对网络中特定资源的访问是一个强大的工具。此外,它还是安全解决方案的重要组成部分。当然,没有人想公开访问数据库。相反,数据库应该位于专用网络中,并且应该只允许来自已定义来源的入站流量。

花些时间学习 TCP/IP 协议的工作原理,检查不同的网络拓扑。这将有助于我们了解如何构建一个具有单一互联网入口点的系统,如何只允许出站流量,以及如何防范不同的攻击并拥有一个稳定的弹性解决方案。

亚马逊有一套丰富的网络服务。其中只有几个:子网、安全组、VPC、互联网网关、NAT 网关、Web 应用防火墙。

我试图收集准备 AWS 解决方案架构师考试所需的基础知识。无论你当前的目标是什么——准备任何认证或进一步扩展知识,能够建立弹性和可伸缩的架构是一项具有良好回报的强大技能。

接下来看什么?一个基于 NLP 思想的基本推荐系统。

原文:https://towardsdatascience.com/what-to-watch-next-a-basic-recommender-system-using-ideas-from-nlp-c0a1338fa514?source=collection_archive---------62-----------------------

大数据时代如何做好推荐?

恭喜你!你刚刚被聘为网飞的新首席技术官。你的主要任务?增加 1.8 亿用户的参与度和观看时间。您的团队认为您可以通过个性化每个用户的主屏幕来实现这一点。这就提出了一个自然的问题:给定一个用户过去的观看偏好,你应该突出显示哪些节目让他们接下来观看?

这个问题的关键在于设计一个推荐系统。设计这样的系统是一个价值百万美元的行业:说真的。无论是亚马逊推荐你下一次应该购买哪种产品,还是 Tinder 向你展示你所在地区最兼容的单曲,现代公司投入大量的时间、金钱和精力来创建越来越精确的推荐系统。

在本文中,我们将讨论如何使用自然语言处理(NLP)的思想创建一个基本的推荐系统。这个并不是对推荐系统的详尽讨论,我们描述的算法也不一定是创建这样一个系统的最佳方式。但无论如何都会很有趣的!

首先:什么是 NLP?自然语言处理是语言学的一个分支,旨在将人类语言分解成计算机可以理解的信息。这就是谷歌如何让你使用 Smart Compose 更快地发送电子邮件,或者一些金融公司如何使用社交媒体情绪来影响他们的交易算法。NLP 的一个关键思想是 word2vec :这是一种将单词嵌入高维向量空间的方法,其方式是“相似”单词映射到“相似”向量。

这样做的第一步是“一键”嵌入。让我们以英语中大约 20 万个单词为例。我们可以按字母顺序排列这些单词。这些单词的一键嵌入将把字典中的第 i 个单词映射到向量(0,…,0,1,0,…,0),该向量在第 i 个条目中只有一个 1,在其他地方有 199,999 个 0。

不幸的是,这种嵌入太天真了。首先,它将人类语言嵌入到 20 万维向量空间中。这使得计算T5 非常慢。记住:在一天结束的时候,我们需要用这些信息进行计算,使其变得有用!第二,它没有保留任何意义上的相似性。例如:在 NLP 中,我们希望两个同义词,比如“happy”和“joyy”,映射到相似的向量。同样重要的是,反义词如“快乐”和“悲伤”需要映射到不同的向量。我们通常通过两个向量的余弦相似度来衡量两个向量的相似度,余弦相似度与两个向量的点积有关。但是一键嵌入中的任意两个字映射到正交向量,点积为零!

将单词嵌入向量空间的一个更好的方法依赖于在相似的上下文中使用相似的单词的想法。正如一句古老的谚语所说,“告诉我你的朋友,我会告诉你你是谁。”

一种精确的方法是由谷歌工程师托马斯·米科洛夫、程凯、格雷格·科拉多和杰弗里·迪安在 2013 年提出的 连续单词袋*【CBOW】*方法(我们将使用一种轻微的“不对称”变体,但想法基本相同)。想法如下。想象一下,一次只允许你读五个单词。所以要读“我的新车是蓝色的,速度很快”这句话,我们必须读三大块:“我的新车是蓝色的”,“新车是蓝色的,而且”,“车是蓝色的,速度很快。”现在玩下面的游戏:给定一个组块的前四个单词,试着猜最后一个单词。

很明显,我们可以看到上下文线索在这个游戏中告诉了我们很多;例如,“我的新车是 __”这一大块肯定不会以“汉堡包”这个词结尾。更微妙的是,它也可能不以“丑陋”、“无聊”或“低效”结尾。

话虽如此,背景只能让我们到此为止。“时尚”、“电动”或“蓝色”这些词以及许多其他形容词都有助于完成这一大块。我们不能指望用一个独特的单词来结束这一大块,但如果我们足够努力,我们可以提供一个类似的单词类别,即“描述新车的单词”,每个单词都可以结束这个短语。

CBOW 方法使用这种思想来产生如下的单词向量。假设我们词典中的每个单词都映射到一个 50 维向量。最初这些向量是完全随机的。我们所知道的是,单词“car”与一个由 50 个实数组成的向量 v_car = (v_1,…,v_50) 相关联,还有“new”、“blue”以及其他我们关心的单词。

现在假设我们有一个先知。一个神奇的、无所不知的机器,它让你输入随机单词向量列表和一个由四个特殊单词组成的“包”(组块中的前四个单词)。基于这些信息,oracle 会输出您的语言中单词的概率分布。甲骨文给每个单词分配一个 0 到 1 之间的数字,告诉你这个特定单词完成你的组块的可能性有多大。

图片由作者提供

如何利用这个甲骨文获得更好的词向量?以大量的英语文本为例。流行的选择是跨越几十年的新闻故事集,或者在维基百科上找到的超过 600 万篇文章。然后,我们告诉计算机一个接一个地扫描我们的文本语料库。对于扫描的每个块,我们迭代更新每个单词向量 ,以最大化我们目前所看到的可能性

文字中发生了什么?计算机首先给英语中的每个单词分配“随机”相似性。每当它扫描一个文本块,比如说“我的新车是蓝色的”,它就会更新文本块中的单词,使它们彼此“更加相似”。因此,从上面的选择中,它干扰了“蓝色”单词向量,使其更类似于“我的”、“新的”、“汽车”和“是”单词向量。在对成千上万的数据块做了这样的处理后,计算机在我们的空间中改变了向量,这样相似的单词(希望如此!)映射到相似的向量。

从技术角度来看,这引发了许多问题。例如:我们在哪里可以获得这样的神谕?我们如何在每次迭代训练后扰动空间中的单词向量?现在我将传递一些细节,但是对于那些感兴趣的人,我将指出一些参考文献。使用的甲骨文通常被认为是感兴趣的单词向量的点积的 softmax (因此出现余弦相似度:与感兴趣的向量的点积越高,softmax 概率越大)。当然,也可以使用其他相关函数。至于第二个问题,上面描述的方法暗示了一个随机梯度下降。换句话说,以这样一种方式扰动向量,我们可以最快地移动到全局最小值。在实践中,人们通常使用小批量下降来降低噪声的影响,但实施细节在这里也是无关紧要的。

连续单词袋方法和它的表亲,跳格模型,近年来取得了巨大的成功。首先,他们将单词映射到 50 维的向量,而不是一键编码的 200,000 维向量。这当然属于现代计算的范畴。而且最重要的是,这些方法在实际任务中起作用

作为一个惊人的壮举,人们可以用这些模型让计算机解决基本的类比问题。例如:如果我让你填写类比“男人是国王,就像女人是 ___”,你可能会填写“女王”也可以使用自然语言处理通过搜索同时与“国王”和“女人”最相似而与“男人”最不相似的单词来解决这个问题换句话说,在经过适当训练的模型中,你可以从“国王”的向量中减去“男人”的向量,然后加上“女人”的向量,最接近这个结果的向量将对应于“女王”。是不是很神奇?!

好了,回到我们最初的问题。一个人如何向网飞的用户推荐一部电影,基于他们的观看历史?根据前面的讨论,也许人们可以猜出我们要去哪里。让我们使用“连续电影包”模型。也就是说,每部电影将被分配一个 50 维向量。我们将扫描用户观看数据的“窗口”,在每一步,我们都将尝试从前四部电影中预测第五部电影。在每一步训练后,我们都会更新电影向量,以使我们的“softmax oracle”更好地适应现实。例如:扫描窗口“风中奇缘、丛林之书、灰姑娘、幻想曲、美女与野兽”将导致我们的系统将“美女与野兽”向量移近“风中奇缘”,等等。

在对数以百万计的数据点做了这个过程之后,我们的推荐系统有了(希望如此!)将迪士尼电影拉近距离,将喜剧从恐怖电影中分离出来,并将史泰龙电影与查克·诺里斯电影归为一类。结果呢?给定已经看过几部电影的新观众,人们可以推荐他们接下来可能喜欢观看的不同电影(或一组电影)。

正如开始提到的,这是一个非常粗略的推荐系统,任何现代公司都可以使用。例如:为什么我们只关心前 4 部电影,而不是用户的整个观看历史?为什么不采用用户对电影的评分,而不是简单地看他们是否看了什么?当然,这些是应该整合的数据点,以便形成更多更准确的建议。正如贝尔、科伦和沃林斯基的百万美元大奖推荐系统中所述,“当混合多个预测器时,预测准确性得到了显著提高。我们的经验是,大部分的努力应该集中在衍生实质上不同的方法上,而不是改进单一的技术。因此,我们的解决方案是许多方法的集合。”换句话说,仅来自 NLP 的想法不会给出完美的推荐。但是它们确实提供了一个有趣的起点!

鉴于这篇文章的性质,我肯定必须以提供相关阅读的进一步建议作为结束。如果你对推荐系统感兴趣,你可以看看网飞自己关于这个主题的技术博客。如果你对自然语言处理的技术方面感兴趣,去看看克里斯·曼宁关于这个话题的 CS 224 课程,,该课程每年在斯坦福大学讲授,并向公众开放。对于那些认真的读者来说,浏览关于这个话题的一篇原创文章是不会错的。

摇摆州为什么花了这么长时间?

原文:https://towardsdatascience.com/what-took-so-long-in-the-swing-states-c7ee8d4eb778?source=collection_archive---------54-----------------------

善待统计学家,他们正在尽最大努力

图片来源:约翰尼·科恩

你可能已经注意到了上周选举结果出来后的一个特殊趋势。事实上,如果你像我一样,你不仅会注意到它…你还会痴迷地点击浏览器上的刷新,不相信结果页面上方的“更新于”消息。

我要说的是,在周二晚上,唐纳德·特朗普似乎几乎肯定会在 4 年内继续担任我们的总统。他基本上在所有的战场州都取得了胜利,而在那些已经打了电话的州却打成平手。但出于某种原因,新闻站没有宣布任何一方的胜利。为什么不呢?

我们看到许多州只需要几张选票就能做出可靠的猜测。好吧,好吧……有些州打破了这种模式,走上了不同的趋势。然而,即使在像弗吉尼亚州的 T4 这样的州,即使拜登落后 20%,统计学家也能正确地猜出获胜者。

那么,为什么我们不能在密歇根州或宾夕法尼亚州运用同样的魔法呢?为什么我们要等 4 天才知道谁赢了?!

把弹珠拿出来

如果你读过我写的关于这次选举的其他帖子,你会很熟悉我对用弹珠解释统计数据的痴迷。如果没有,让我们快速重温一下。

我们首先假设,在选举日,人们不用去各个投票站、邮箱等地方,而是带着一个彩色弹球到他们州的首府来投票。这为“召唤”一个州需要多少张选票做了一个很好的初步估算

但后来我们意识到,媒体在报道他们进来的选票,一些县比其他人点的快。这给出了一个非常有偏见的投票样本,在弗吉尼亚州,给人的初步印象是特朗普将获得压倒性胜利(实际上拜登赢得了该州)。

好吧,我们了解到,我们可以通过将大袋的弹珠(该州的总票数)分成代表每个县的小袋来拯救我们心爱的袋子-o-marbles 模型。这是一个很好的"二阶近似法",有助于解释为什么状态可以这么早被调用。但我们在这次选举中看到的是,不仅县很重要,你如何选择投票也很重要(以及其他因素)。

哦,该死的!

在一个候选人可能会告诉他的支持者避免通过邮件投票的世界里,你可能会看到“通过邮件投票”的群体和“在选举日投票”的群体之间的巨大差异。

此外,我们可以假设不同的种族群体可能在一些县发挥关键作用,根据当年的投票人数来左右一个州。
事实上,你可以继续下去:性别、年龄组、首次投票者等等。选择这些选民中的较大比例可能会不自然地对你的样本产生偏见,并给你一个关于你的人口的不切实际的观点(以及整个选举)。

这些就是我们所说的“混淆变量”,我发现这是一个非常恰当的名字,用来形容那些让统计学家们困惑和夜不能寐的东西。他们的作用是推翻我们的假设,即在我们开始取样之前,大理石袋是“混合良好”的。如果不考虑它们,人们真的不知道发生了什么。

大理石世界的俄罗斯娃娃

那么这意味着什么呢?首先,这意味着肯定没有一群人在等待一定数量的选票后才能给州政府打电话(在撰写本文时,尽管有 99%的选票,佐治亚州仍未被打电话)。

相反,这意味着有一个团队试图找出在每个州、每个县、每个人口中值得关注的重要趋势。

例如,解释混杂变量的一个详尽的方法是回到我们用于各县的袋中袋方法。把它想象成一套俄罗斯娃娃。在一个州内,您选择分隔县,因为您认为人们会根据他们居住的地方进行不同的投票。然后,在县内,你假设某人投票的方式对他们投票给谁有影响。然后你可以继续在每个亚群体中讨论种族问题。一旦你对这些小群体的反应有所了解,你就可以预测整个州的最终统计结果。

作者图片

所有的模型都是错的,有些是有用的

请允许我重申,我对他们的过程并不知情。我只是一个和统计数字打交道的人。我们为伊利诺伊州和弗吉尼亚州做的工作假设我们有代表性的样本,并且我们知道每个县和州的选民总数。通过这种方式,我们能够对每个候选人的最坏和最好情况进行近似,并根据这些情况进行猜测。不幸的是,这些假设都不成立。然而,他们在这些其他情况下工作,因为误差幅度足够大,这样的不确定性被吸收(即一个候选人在该州赢得超过 5%)。

摇摆州是一个不同的故事…

一个摇摆州代表了一个几乎分裂的人口,这导致了如此激烈的竞争,有时不到一个百分点就能决定胜负。

两袋问题(尺寸问题)

我们有时会遇到没有先例的情况,因此极难预测。在这次选举中,大量的邮寄选票是我们从未经历过的,很难预测到底会有多少(即使是一周后!).

当宾夕法尼亚州统计了 100,000 多张选票并将他们的报告百分比从 89%减少到 88%时,这一点就很明显了(这是倒退!).更重要的是,一些州允许计票,即使他们晚了几个星期,只要他们在某个日期做了标记。在这种情况下,很难知道“选票中的邮件”有多大,即使你已经可以推断出大约 70%的邮件会支持某个候选人。

想象一下,如果一个州将选票分为亲自投票和邮寄投票,我们最终会得到两袋选票(我想我们已经没有“弹珠”了)。今年似乎发生的是,他们首先从“亲自”袋子里数出选票,一般来说,对袋子有多大有一个相当好的感觉。然而,对于第二个袋子,即使我们统计了足够的票数来了解里面的东西(假设是 65%的拜登),我们可能也不知道这个袋子有多大。

假设的例子

如果“亲自”袋是 65%的特朗普,包含一百万张选票。那么,川普在第一轮计票中就会多获得 30 万张选票,我们可能不需要完成对的计票就能知道这个。

现在,“邮件”袋给我们带来了麻烦,不是因为我们无法确定支持拜登的选票比例(可能很早就知道是 65%),而是因为我们不知道这个袋子有多大。每次我打开新闻,他们都在邮局或投票站“发现”更多的选票。这确实表明,我们还没有准备好这样的事情,因此车轮没有像处理“亲自”投票那样润滑良好。

所以我们不知道这个子集中是否有足够的选票来弥补拜登落后的 30 万张选票。所以我们只能继续数,直到我们对结果更有信心。

后果和风险评估

我想强调的是,我不在那里,所以我实际上不知道是什么真正导致了每个州的问题。但是我看到了和你们所有人一样的新闻报道,这是我对这个问题的看法,我觉得这可能会有所启发。

这实际上是我在本系列中介绍的模型对不确定性的风险承受能力。很难自信地宣布一个国家。在弗吉尼亚州运作良好的模式的内在缺陷在佐治亚州显露无遗。

统计学家…没穿衣服。

再加上做出“正确决定”的外部压力(比如对这位福克斯新闻频道分析师的调查),你就会看到我们上周经历的情况。

对我来说,这足以让我相信每一张选票都很重要,但我想仍然会有一些疑问,特别是在看到一个国家可以这么快成立的情况下。这超出了本文的范围,但是我认为从统计上来说,你的投票肯定是算数的。

如果你喜欢这篇文章

考虑鼓掌(或者 10?)所以 TDS 会更容易与他人分享

看看我关于选举的其他案例研究:

  • 伊利诺伊州(需要多少票才能举行选举)
  • 弗吉尼亚(统计学家怎么知道拜登赢了,即使他输了 20%)
  • 德州(它到底有多能荡?)

Twitter 从 Recsys 2020 挑战赛中学到了什么

原文:https://towardsdatascience.com/what-twitter-learned-from-the-recsys-2020-challenge-d3ae2f7ccf0f?source=collection_archive---------34-----------------------

理解大数据,2020 年推荐系统挑战

今年,Twitter 赞助了 RecSys 2020 挑战赛,提供了大量的用户参与数据集。在本帖中,我们描述了获胜团队的挑战和见解。

本文由来自 Twitter Cortex 的卢卡·贝利、阿波夫·夏尔马、·谢、、丹·谢伯勒、马克斯·汉斯迈尔和·施共同撰写。

电子商务系统是现代社交网络和电子商务平台的重要组成部分。他们旨在最大限度地提高用户满意度以及其他关键业务目标。与此同时,科学界在构建和测试新模型以根据用户兴趣定制内容时,缺乏大规模的公共社交网络数据集。在过去的一年里,我们一直在努力解决这个问题。

Twitter 与 RecSys conference 合作赞助 2020 挑战赛。我们发布了一个由两周内的推文和用户参与组成的数据集,在两周内有 1.6 亿条公共推文用于培训,4000 万条公共推文用于验证和测试。

在这篇文章中,我们描述了由 Nvidia,Learner 和 Wantely 团队提交的数据集和三个获奖作品。我们试图对帮助获胜者取得成果的选择做出一般性的结论,特别是:

  • 最重要的功能
  • 特征选择和模型训练的实验速度极快
  • 一般化的对抗性验证[1]
  • 内容功能的使用
  • 在神经网络上使用决策树

我们希望这些发现将对更广泛的研究社区有用,并启发推荐系统的未来研究方向。

挑战的参与者被要求预测用户参与四种互动中任何一种的概率:喜欢回复转发,以及引用推文。根据两个指标对提交的内容进行评估:相对于我们提供的简单基线的相对交叉熵 (RCE),以及精度-召回曲线下的面积 (PR-AUC)。

一段时间内训练、测试和验证数据集的表示。

特别注意保持数据集与推特平台同步。该数据集反映了平台的变化,例如,当一条推文被删除时,用户将其个人资料设为私有,或者将其完全删除。提交的内容也会被重新评估,排行榜也会根据重新计算的指标进行更新[2]。

数据集要素的表示。它们分为用户功能(针对作者和读者)、推文功能和参与功能。

今年的挑战赛竞争尤为激烈,注册用户超过 1000 人。参与者在整个挑战过程中积极提交解决方案,并在挑战的第一阶段修改其团队组成(根据提交指南)。最后阶段有 20 个竞争者,平均团队规模为 4 人。此外,团队开发了 127 种不同的方法试图赢得挑战。在整个挑战过程中,参与者的活跃度一直很高,在最后几天,当参与者完善他们的提交材料时,活跃度达到顶峰。最终结果出现在排行榜上。

伴随而来的RecSys Challenge 2020 Workshop共收到 12 篇论文,由计划委员会评审。其中九篇论文被接受。

第一名:英伟达

面向推荐系统的 GPU 加速特征工程和训练。 Nvidia 的论文[3]描述了训练 xgboost 模型来预测每个交互事件。总的重点是为这个模型创建有用的特性。它强调了快速特征提取和模型训练是该方法成功的关键。本文在附录中列出了 4 个模型中每个模型的 15 个最有用的特性。

从数据集中快速提取特征并重新训练是获胜者和亚军之间的关键区别。功能工程管道和培训管道运行时间都不到一分钟。除此之外,目标编码(均值编码+加法平滑)用于不同的分类特征和特征组合,包括这些组合的目标均值。作者还从推文的内容中创建分类特征(例如,两个最流行的词和两个最不流行的词)。针对特征重要性和选择的对抗性验证用于通过选择更一般化的特征来防止过度拟合。基于树的模型的集成方法用于产生最终模型。

第二名:学习者

**用深度语言模型预测 Twitter 参与度。**学习者方法[4]将深度学习与梯度增强决策树(GBDT)相结合,并专注于创建不同的功能。作者使用启发式方法设计了 467 个功能,并使用伯特和 XLM-R 创建了推文的文本表示(使用了目标推文文本和最近参与推文的文本)。

这个条目和其他条目之间的关键区别是使用了预先训练的自然语言处理(NLP)模型 BERT 和 XLM-R 以及微调。第一层微调是以无人监管的方式完成的。接下来,将语言模型与其他特征相结合,以在监督设置中进行微调。该模型是一个多层感知(MLP ),有四个头,每个头对应一种参与类型。该论文还使用注意力来创建用户过去十次交互的嵌入。将注意力和目标 tweet 作为关键,将这些嵌入结合起来。此外,使用启发式特征,例如参与用户、推特创建者、推特特征和用户-创建者交互特征的不同表示。与其他条目一样,本文使用 xgboost 进行特征工程和选择,并将 Yeo-Johnson 变换应用于分类特征和非标准化连续特征。

第三名:肆意

用于预测多种类型推特参与度的堆叠集成模型。 Wantely 的提交材料[5]提出了一种预测推特参与度的两阶段方法。第一级分类器是轻量级的,并且仅使用概括不同目标(例如,转发等)的特征,并且具有相似的训练/测试准确度。第二级分类器使用轻量级分类器的输出作为特征以及特定于目标的特征。

上游可归纳模型生成下游模型使用的特征。通过这样做,作者认为,每种参与类型的下游模型都能够通过消耗通用上游模型的预测,从所有其他参与的数据中受益。除此之外,本文还通过对抗验证*、*直接评估训练和测试数据集之间的特性分布差距,来确定哪些特性是可概括的,如 Nvidia 条目中所示。

T 以下是所有提交材料中的许多共同见解。我们强调主要主题:

**获奖机型中使用的有用功能——目标编码为王。**首先,目标编码(用目标变量的均值代替一个分类变量)让问题更简单。它同时用于用户和作者 id,从而对用户的平均参与度进行编码。第二,大量的特性交叉被使用【6】。

**特征选择的快速实验。**快速测试多种假设的能力一直是数据科学竞赛不可或缺的一部分,并再次证明了这一挑战的决定性。Nvidia 团队能够在 GPU 上运行整个管道。这使得他们训练一个模型(包括特征工程)只需要 2 分 18 秒,而在 CPU 上则需要几个小时。

**用对抗性验证应对过度拟合。**竞争对手使用的一种常见技术是构建一个鉴别器来预测训练集和测试/验证集之间的差异。基于在模型的特征选择中使用的重要性分数,通过移除最重要的特征,可以帮助模型更好地概括。这项技术有助于避免过度拟合训练数据。

**内容特性的使用。**今年的数据集与去年的一个显著区别是我们提供的内容特征。在三篇获奖论文中,有两篇论文对 BERT 的内容特性进行了复杂的运用。NLP 的深度学习已经证明了它对推荐系统的有用性,尽管我们认为在这个领域还有更多改进的空间。

决策树 vs 深度学习。梯度增强决策树 (GBDT)的一个显著优势是,不需要标准化和计算出单个特征的规模。这有助于加快所有获奖论文的迭代速度。

在计算机视觉和 NLP 等领域,深度学习模型通过利用 CNN s 和 transformers 展示了令人印象深刻的进步。基于这一挑战的结果,我们仍然不明白什么是推荐系统中深度学习的良好架构。我们呼吁研究社区共同寻找推荐系统的最佳深度学习架构。

我们还注意到,虽然我们只评估了提交的模型性能,但我们的生产系统中还有许多其他约束。延迟对我们来说是一个大问题:模型需要在毫秒内对推文进行评分。在这种情况下,需要仔细检查集合方法的使用。整体中每一步的附加延迟可能导致它们对于我们的目的来说太慢。

我们感谢所有参与者和我们的同事,是他们让这项挑战成为可能。我们相信,发布大规模数据集将有助于在推荐系统领域取得新的进展。Twitter 现在比以往任何时候都更致力于帮助外部研究工作,最近为学术研究人员发布了新的 API 端点,以帮助促进进一步的探索和合作。

[1] J. Pan 等.针对用户导向自动化系统中概念漂移问题的对抗性验证方法 (2020) arXiv:2004.03045 .引入了对抗性验证,这是一种被多个参与者使用的强大技术。

[2] L. Belli 等人Twitter 主页时间线上的隐私感知推荐系统挑战 (2020) arXiv:2004.13715 提供了关于挑战和数据集的详细信息。

[3] B. Schifferer 等人,面向推荐系统的 GPU 加速特征工程与训练 (2020)。继续。推荐系统挑战 2020。Nvidia 的提交,也在他们的博客文章中描述。

[4] M. Volkovs 等人,用深度语言模型预测 Twitter 参与度(2020)。继续。推荐系统挑战 2020。学习者的提交。

[5] S .戈达等人,预测多种类型推特参与的堆叠集成模型(2020)。继续。推荐系统挑战 2020。万特利的屈服。

[6]在 Nvidia 论文的附录中提供了对不同目标具有重要性的功能的完整列表,如转发/回复。

RecSys 挑战赛 由 Nazareno Andrade、Walter Anelli、Amra、Jessie Smith、Gabriele Sottocornola 组织,Luca Belli、Michael Bronstein、Alexandre Lung Yut Fong、Sofia Ira Ktena、Frank Portman、Alykhan Tejani、Xie、和 Shi 对数据集做出了贡献。

见我的 其他帖子 上媒,或者关注我的 推特

你是什么类型的人工智能爱好者?

原文:https://towardsdatascience.com/what-type-of-artificial-intelligence-enthusiast-are-you-32ca88c01a7e?source=collection_archive---------21-----------------------

根据人工智能领域的常用术语,衡量你在人工智能爱好者等级中的排名。列出的术语你知道多少?你是好奇爱好者还是实干家?

没有人对人工智能或机器学习的术语感到陌生。

普通大众可能会将 AI 和 ML 与自动驾驶汽车、机器人或无人机联系在一起。

技术专家将术语 AI 和 ML 与计算机视觉、自然语言处理、对象检测等联系起来。

这篇文章旨在提供一些在这个领域中使用的传统人工智能和人工智能术语的知识。同时,说明什么类型的人会知道所列的术语。

免责声明 : 不要用本文的内容来衡量你在人工智能领域的专业知识。概述的水平只是为了参与和娱乐的目的。

我们走吧。

好奇者(1 级)

好奇者看过一些流行的科幻电影(IRobot,前玛奇纳),可能会就普通的人工智能进行一次体面的对话。

好奇者对人工智能的未来有一两个看法。他们准备就这个话题进行长时间的讨论。

好奇发烧友是醒了

左:前玛奇纳。右:我,机器人

好奇的发烧友知道下面这些术语——你是如何匹配的?

  • **人工智能:**这是指存在于机器和程序中的类人智能。这个术语概括了机器执行和完成人类智能任务的能力。
  • 机器学习:人工智能的子集。专门程序从提供的训练数据模式中获取知识的过程。程序获得的知识可以转移到与程序训练的数据相关的任务上进行推理。
  • 深度学习:机器学习的一个子集,算法利用几层神经网络从输入数据中提取更丰富的特征。深度学习技术的例子有卷积神经网络(CNN) 。
  • 计算机视觉:‘计算机怎么看’。计算机视觉涉及处理数字图像和视频,以推断出对这些图像和视频中的内容的一些理解。
  • 自然语言处理:’计算机如何理解我们。一个专门的领域,专注于在系统和程序中实现语言理解范例和模型,以通过语言实现并行的机器与人的交互。

里士满·阿拉克的《人工智能机器和深度学习的层次》

勇敢者(等级 2)

勇敢的人不只是阅读关于人工智能的新闻文章和媒体帖子。

勇敢者深入兔子洞,探索人工智能系统用来完成特定任务的技术。

他们被认为勇敢,因为他们愿意为人工智能领域及其子领域奉献更多的时间。他们是你的学者、学生和研究人员。

勇敢的企业家是认真的。

左:姿态估计。右图:物体检测

  • 人脸检测:这个术语指的是实现可以自动识别和分类图像和视频中人脸的系统的任务。面部检测存在于与面部识别、摄影和动作捕捉相关联的应用中。
  • 目标检测:作为计算机视觉任务的目标检测被定义为从图像或序列图像(视频)中的特定类别中识别感兴趣的目标的存在。
  • 姿势估计:从提供的数字资产,如图像、视频或图像序列中推断身体主要关节位置的过程。通过几种计算机视觉技术使得姿态估计成为可能,姿态估计的形式存在于诸如动作识别、人类交互、虚拟现实和 3d 图形游戏的资产创建、机器人等应用中
  • **物体识别:**识别与 a 类目标物体相关的过程。对象识别和检测是具有相似结果和实现方法的技术,尽管在各种系统和算法中识别过程先于检测步骤。
  • **运动分析:**运动分析是对物体的运动、移动或轨迹的研究。
  • 运动检测:运动检测是对包含运动物体的图像进行图像处理的过程,该图像处理技术能够通过差分方法或背景分割来跟踪运动。通过丢弃图像的静止部分来提取图像的运动部分,以获得运动部分。
  • **跟踪:**这是一种识别、检测和跟踪一段时间内图像序列或视频中感兴趣的对象的方法。系统内跟踪的应用存在于许多监控摄像机和交通监控设备中。
  • 迁移学习:重用从解决问题中获得的知识,并将获得的知识应用于相关但独立的问题的方法

实干家(第三级)

实践者不仅知道嵌入式机器学习技术,而且还会实施它们。

参与者具备至少两种编程语言的中级知识、足够的数学技能和一些实用的硬件知识。

行为者有一个工作头衔,如机器学习工程师、数据科学家、数据工程师、机器人专家,以及类似的角色。

实干家是务实的。

左:丹尼尔·伯克。右图:硬件工程师

  • 尺度不变特征变换(SIFT) :一种计算机视觉算法,识别并封装图像内局部兴趣点(特征)的信息,根据提取的特征描述图像内的物体。
  • 区域卷积神经网络 (RCNN) :解决物体检测和分割的深度学习方法。RCNN 利用选择性搜索算法来建议图像中的感兴趣区域,然后使用卷积神经网络来检测建议区域中感兴趣对象的存在。
  • 你只看一次(YOLO) :采用神经网络架构的一步式物体检测过程。YOLO 通过在图像上覆盖网格来工作,其中每个单元负责计算网格中对象存在/类别的概率,并对识别的对象应用边界框。
  • 优化算法:执行预定次数的算法,用于寻找问题的最优解,在数学术语中,这些“问题”被称为函数。
  • 梯度下降:这是一种优化算法,用于通过计算梯度值来寻找降低成本函数的值,梯度值用于在寻找成本函数局部最小值的每一步选择值。梯度的负值用于寻找局部最小值。
  • 成本函数:这是一种量化机器学习模型执行“有多好”的方法。量化是基于一组涉及参数值的输入的输出(成本)。参数值用于估计预测值,而“成本”是预测值和实际值之间的差异。
  • 全局最小值:这是位于成本函数整个域内的最小参数值。您可能会遇到局部最小值,它是指位于成本函数的设定范围内的最低参数值。
  • 收敛:这描述了在机器学习环境中使用时向最佳参数值或全局最小值移动的概念
  • 相关性:在机器学习中,这是指两个变量或特征之间的统计关系。该关系描述了两个变量之间的潜在关联。两个变量之间的相关性可以是负的,也可以是正的。负相关表示当一个变量增加时,另一个变量显示减少的模式。正相关是指当相关变量增加时,变量也增加。正相关的一个例子是,一个地区的房价会因为学校数量的增加而上涨。
  • 协方差:指两个变量线性相关的程度。
  • **支持向量机:**一种监督学习模型,常用于以分类为重点的机器学习程序中。当提供训练集时,SVM 可以将训练集中的每个数据点分类到不同的类别。SVM 算法最优地将训练集中的每个点分离到一个关联类。因此,SVM 模型能够基于从训练数据中学习到的知识将新的数据点关联到关联的类。
  • 真阳性:指训练好的模型的分类结果,预测的分类是准确的。
  • 假阴性:指来自训练模型的分类结果,其中预测的分类与实际/预期结果相比不准确。
  • 假阳性(I 型错误):指来自训练模型的分类结果,其中分类预测结果为阳性,但实际/预期结果为阴性。
  • 假阴性(II 型错误):指来自训练模型的分类结果,其中分类预测结果为阴性,但实际/预期结果为阳性。

专家(4 级)

这些专家都是非常聪明的人,他们将生命中的大部分时间投入到人工智能和人工智能的研究和发展中。

他们的奉献精神使他们在学术机构、顶级科技公司和令人兴奋的商业企业中身居高位。

这些专家是教授、首席机器学习工程师、顶级研究人员、人工智能公司的首席执行官和顾问、作家等。

专科

左:吴恩达。右:杨乐村

专家在某种程度上知道本文中列出的每一个术语。

专家可能没有太多时间通读这篇文章,因为他们是这个领域最忙的人之一。

所以专家可能在这里向下滚动

下到最后一层,因为专家不需要被告知他们是不是专家,他们已经知道了。

结论

我希望这篇文章像我希望的那样吸引人和有趣。

如果不是,至少它是有教育意义的。

非常欢迎你在评论区写下你是什么类型的机器学习爱好者。

我自己可能属于“实干家”这一类,但我希望在未来十五年左右的时间里,我可以认为自己是“专家”中的一员。

如果你对更多的术语感兴趣,那么请阅读下面的文章,其中介绍了一些基本的机器学习术语。

* [## 机器学习初学者的 30 个袖珍术语

你在数据科学或机器学习职业生涯中会遇到的有用的机器学习术语列表。

towardsdatascience.com](/30-pocket-sized-terms-for-machine-learning-beginners-5e381ed93055)

如果你喜欢这篇文章,并想阅读我的更多内容,请关注我,或者你可以通过LinkedIn与我联系*

你是哪种类型的数据科学家?

原文:https://towardsdatascience.com/what-type-of-data-scientist-are-you-2984140f6378?source=collection_archive---------49-----------------------

了解最常见的数据科学家角色

阿克森在 Unsplash 上拍照

数据科学是一个相对较新的领域,它融合了几个学科的特征和个性。但是,在数据科学出现之前,有哪些不同类型的数据科学家,这些人在做什么工作?

大多数人都见过这个三部曲图表的某种形式,我在下面重新改编了它。

来源:Gianluca Gindro

成功的数据科学确实是三个核心要素的混合体:统计、商业敏锐度和编程技能,但很少有人在所有这些领域都很强。

那么,你是哪个角色?或者说,如果你要招聘一名数据科学家,你需要哪一位?

三条背景路径通向三个不同的角色:

  • 恢复的管理顾问
  • 这位研究员逃离了学术界
  • 开发人员变成了数据科学家

恢复的管理顾问

这个类别包括初级商业分析师和前麦肯锡顾问。他们有一个共同点,那就是对 Excel 的热情,以及炫耀 v-lookup 和花哨的公式的能力,甚至是计划搬家的能力。

他们也是对业务问题更有热情的人:他们首先考虑业务,然后才是数据。

他们不得不学习 Python 或 R,这不是因为他们喜欢编程。他们仍然尽可能地避免编码,他们的代码通常像一次性餐巾一样可重复使用。

他们对统计学的基础知识有很好的直觉,但他们不得不艰难地学习像 p 值或 t 检验这样的概念。

他们擅长的:支持决策的数据科学项目、面向业务的流程、一次性项目。

这位研究员逃离了学术界

他们通常拥有博士学位,并有研究背景。他们研究核心的数学和统计学,他们可以花几个小时谈论贝叶斯和频率主义方法之间的哲学差异。

他们通常擅长编码,只要他们不必过多地将自己推入数据工程师的界限。测试驱动的编程方法对他们来说可能是一种挑战。

但他们可能擅长较低级别的程序,如 C++,这对于大规模或深度学习的应用程序来说很方便。

他们往往缺乏的是商业思维。开发产品可能是他们的最终目标,因为他们认为这相当于在学术界发表一篇论文。

擅长领域:创新前沿的复杂机器学习项目。他们可以突破界限,阅读大量的研究论文来挑选和实施最好的想法。一家高科技公司可能需要一些这样的资料。

开发人员变成了数据科学家

由于数据科学需要大量的编码,这些可能会成为你最好的朋友。

你可以相信他们能够构建良好的可重用代码,不必向他们解释测试的概念,他们可能会比你希望的更多地自动化管道。

他们可能可以使用现成的机器学习工具,但如果他们需要冒险进入更深层次的统计思维,这可能会成为一个雷区。

他们中的一些人可能相当擅长理解事情的业务方面,特别是如果他们以前参与过收集需求和处理业务关系。但是不要期望他们对新颖的商业想法过于主动。

他们真正擅长的是需要技术挑战的场景,例如需要大规模工作的大数据项目或复杂的数据管道。同时,他们在需要更高级的建模和预测准确性需要成为竞争优势的项目中不太适应。它们也最适合于那些必须专注于构建产品而不是支持决策的项目。

结论

如果你是一名数据科学家或者正在考虑成为一名数据科学家,试着找出你适合的角色和你的差距,但也不要羞于承认你的优势。

作为一名数据科学家,你将需要所有这些技能的混合,但期望成为一名纯粹的多面手是一个神话:总有你更喜欢的一面!

如果你需要雇用一名数据科学家,试着确定候选人更适合哪一类:雇用一个人来建立一个大规模的推荐引擎,肯定需要一个不同于在销售预测中支持你的首席执行官的人。

关于数据治理,我们错在哪里

原文:https://towardsdatascience.com/what-we-got-wrong-about-data-governance-365555993048?source=collection_archive---------21-----------------------

以及我们如何纠正它

图片由 亚历山大提供

数据治理是我的许多客户最关心的问题 ,尤其是考虑到 GDPR、CCPA、新冠肺炎和其他许多首字母缩写词,它们表明在保护用户数据方面,数据管理越来越重要。

在过去的几年里,数据目录已经成为数据治理的强大工具,我非常高兴。随着公司的数字化和数据操作的民主化,数据堆栈的所有元素(从仓库到商业智能平台,现在还有目录)都必须参与合规性最佳实践,这一点非常重要。

但是,数据目录是我们构建健壮的数据治理计划所需要的全部吗?

数据治理的数据目录?

类似于物理图书馆目录,数据目录作为元数据的目录,为投资者提供评估数据可访问性、健康状况和位置所需的信息。像 Alation、Collibra 和 Informatica 这样的公司推出的解决方案不仅可以跟踪你的数据,还可以与机器学习和自动化集成,使数据更容易发现、更具协作性,并且现在符合组织、行业甚至政府法规。

由于数据目录提供了关于公司数据源的单一真实来源,因此利用数据目录来管理管道中的数据非常容易。数据目录可用于存储元数据,使涉众更好地了解特定来源的血统,从而对数据本身产生更大的信任。此外,通过数据目录,可以轻松跟踪个人身份信息(PII)的存放位置和向下游扩散的位置,以及组织中谁有权跨管道访问这些信息。

什么对我的组织是正确的?

那么,什么类型的数据目录对您的组织最有意义呢?为了让您的生活稍微轻松一点,我与该领域的数据团队进行了交谈,以了解他们的数据目录解决方案,并将它们分为三个不同的类别:内部、第三方和开源。

内部

一些 B2C 公司——我说的是世界上的Airbnb、Netflix和Ubers——建立自己的数据目录,以确保数据符合州、国家甚至经济联盟(我指的是你 GDPR)级别的法规。内部解决方案的最大好处是能够快速旋转可定制的仪表板,拉出您的团队最需要的字段。

优步的 Databook 让数据科学家可以轻松地搜索表格。 图片由 优步工程 提供。

虽然内部工具有助于快速定制,但随着时间的推移,这种黑客行为会导致缺乏可见性和协作,特别是在理解数据谱系时。事实上,我在一家食品配送初创公司采访的一位数据主管指出,她的内部数据目录中明显缺少的是“单一窗口”如果她有一个真实的来源,可以提供对她团队的表如何被业务的其他部分利用的洞察力,那么确保合规性将是容易的。

除了这些战术考虑之外,花费工程时间和资源构建一个数百万美元的数据目录对绝大多数公司来说没有意义。

第三方

自 2012 年成立以来, Alation 在很大程度上为自动化数据目录的兴起铺平了道路。现在,市场上有一大堆 ML 驱动的数据目录,包括 Collibra 、 Informatica 和其他目录,许多都具有付费工作流和面向存储库的合规管理集成。一些云提供商,如 Google、AWS 和 Azure,也以额外的费用提供数据治理工具集成。

在我与数据领导者的交谈中,这些解决方案的一个缺点被反复提及:可用性。虽然几乎所有这些工具都具有强大的协作功能,但我采访的一位数据工程副总裁特别提到了他的第三方目录的不直观的用户界面。

如果数据工具不容易使用,我们怎么能期望用户理解甚至关心它们是否符合标准呢?

开放源码

2017 年,Lyft 通过开源其数据发现和元数据引擎 Amundsen 成为行业领导者,该引擎以著名的南极探险家命名。其他开源工具,如 Apache Atlas 、 Magda 和 CKAN ,都提供了类似的功能,这三个工具都使精通开发的团队能够轻松地获得软件实例并开始工作。

Amundsen 是一个开源数据目录,它让用户能够洞察模式的使用。 图片由 米哈伊尔·伊万诺夫 提供。

虽然其中一些工具允许团队在其中标记元数据来控制用户访问,但这是一个密集的、通常是手动的过程,大多数团队没有时间去处理。事实上,一家领先运输公司的产品经理分享说,他的团队特意选择不使用开源数据目录,因为他们没有现成的对其堆栈中所有数据源和数据管理工具的支持,这使得数据治理变得格外具有挑战性。简而言之,开源解决方案不够全面。

尽管如此,对于法规遵从性来说,还有一些即使是最先进的目录也无法解释的关键因素:数据宕机。

缺失的环节:数据宕机

最近,我为一个客户开发了一个简单的指标,帮助测量数据停机时间,换句话说,就是数据不完整、错误、丢失或不准确的时间。当应用于数据治理时,数据停机时间可以让您全面了解组织的数据可靠性。没有数据可靠性来支持全面发现,就不可能知道您的数据是否完全合规和可用。

数据目录解决了部分(但不是全部)数据治理问题。首先,缩小治理差距是一项艰巨的任务,如果不完全了解您的公司实际上正在访问哪些数据资产,就不可能对其进行优先排序。数据可靠性填补了这一空白,让您能够释放数据生态系统的全部潜力。

此外,如果没有实时沿袭,就不可能知道 PII 或其他监管数据是如何蔓延的。请想一想:即使您使用的是市场上最精美的数据目录,您的治理也只能与您对数据去向的了解一样好。如果您的管道不可靠,您的数据目录也不可靠。

由于功能互补,数据目录数据可靠性解决方案携手合作,提供数据治理的工程方法,无论您需要满足的首字母缩写。

就个人而言,我对下一波数据目录的到来感到兴奋。相信我:这不仅仅是数据。

想了解更多,伸手 巴尔摩西

使用 WhatsApp 数据的自然语言处理

原文:https://towardsdatascience.com/what-whatsapp-conversations-tell-us-about-our-friendships-73ce7104d84e?source=collection_archive---------72-----------------------

潜入表情符号、音频、附件和深夜对话的世界。

几天前是我最好的朋友的生日,我决定利用我的编程技能给她一份独特的礼物。准备好深入分析单词、表情符号、数字、单词、链接、图像、视频、音频和附件

在这篇文章中,你会发现

  • 格式化 Whatsapp 对话指南的分步指南
  • **折线图:**3 年内发送消息的频率
  • Spyder graph :每年**、**每周和每小时消息
  • **条形图:**表情符号分析
  • WordCloud: 最常发送的消息

数据,数据和数据

在我们深入分析 WhatsApp 对话之前,先做一点概述…

  • 从 2017 年 3 月 3 日发送的第一条消息到 2020 年 5 月 22 日的最后一条消息,相隔 932 天。
  • 对话中的参与者:我和我的朋友
  • 总共发送了 2150 条消息
  • 11821字被调换

导入并重新格式化文本文件

第一步是从 WhatsApp 下载对话。这可以通过应用程序本身或 web 服务器扩展非常容易地完成。

为了隐私,姓名被部分隐藏

在我们开始可视化之前,有几件关于清洁过程的事情需要注意。

导入的文本文件的格式如下:

【日-月-年时:分:秒】名称:消息\换行符

第一步的主要目标是从最初下载的文本文件创建一个“csv”文件。我用逗号替换了右方括号[]和左方括号[],也用逗号替换了冒号。

我还删除了发件人名字中的表情符号,没有什么特别的原因,我更喜欢干净的名字。清理后文件的结果格式如下:

日-月-年时:分:秒,姓名,消息

这是我想要实现的格式,以便创建 csv 文件,这将允许我分析消息。

为了隐私,姓名被部分隐藏

现在我们有了一个漂亮的“csv”文件,其中包含所有日期、发件人姓名和信息,我们可以创建一个熊猫数据帧来存储所有信息。

df=pd.read_csv('conversation.csv')

数据帧的结构如下:|日期|发件人姓名|消息|

日期时间格式

分析中的一个重要步骤是能够理解消息何时被发送。这需要通过轻松处理日期、时间、分钟等来完成。

Python 有一个非常有用的库,就是为此而创建的。从一个 字符串 类型到 日期时间 类型的一个非常简单的转换可以通过下面的代码行实现:

from datetime import datetimedf['date'] = pd.to_datetime(df['Date']**,** format = '%d-%m-%y %H:%M:%S')

现在,我的“日期”熊猫栏的格式被指定了,这非常有用,因为它允许在使用不同的日期格式时有很大的灵活性。

年度和月度分析

一旦我们将“date”列更改为 datetime 类型,我们就可以非常容易地提取任何想要的指标,例如小时。我决定创建新的列来包含邮件发送的具体月份和年份。

df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month

我用 Plotly ExpressSeaborn 绘制了下面两张图。他们传达的意思是,虽然我和我的朋友很亲密,但我们在 Whatsapp 上不是特别经常说话。有很多间隔,几个星期都没有一条消息被发送,然后有几天我们交换了 80 多条消息。似乎我们有一种要么全有要么全无的交流方式。

沟通最多的一年是 2018 年,尤其是最后一个季度。这很有意义,因为我们正在组织一次欧洲旅行。在每年的年末和年初,交流减少了,因为我们都有考试和家庭假期要照顾。

下面的热图和上面的折线图传达的信息是一致的。

热图是一种数据可视化技术,以二维颜色显示现象的大小。

我选择对相同的时间变量使用两种可视化,以确保我不会错过隐藏在一个图表中但在另一个图表中很明显的东西。我建议在大多数情况下这样做,因为它提供了一个快速的“理智检查”。

这些观想很容易实现,一步一步的教程可以在这里找到。

每小时和每周消息

鉴于之前的图表没有显示我们的消息传递方式的趋势,我决定通过查看每小时和每周发送的条消息来进一步细分。

我创建了一个雷达图来可视化信息的频率,因为它们是循环的,我相当有信心会有一个强大的趋势。

雷达图是一种以二维图表的形式显示多元数据的图形方法,该二维图表是从同一点开始在轴上表示三个或更多的定量变量。

我为发送的每条消息创建了包含工作日和时间的列。

df['weekday'] = df['date'].dt.weekday
df['hour'] = df['date'].dt.hour

这些图表包含了更丰富的信息,显示出我们在一周的某几天和一天的某几个小时更有规律地交谈。

对于小时图,95%的阴影区域在早上 5 点到下午 6 点之间,这相当代表了我们的生活方式,因为我们是非常活跃的人。我们通常在周末聊天,因为我们是异地恋,或者是为了叙旧或者组织旅行。

表情符号,不仅仅是文字?

表情符号是一种非常受欢迎的交流形式,通常用于描绘情感或喜剧效果,而无需键入文字。

我惊讶地发现,除了哭笑表情符号,我们使用的表情符号几乎没有重叠。

在看这个图的时候,我注意到了一些有趣的事情。很明显,我用的表情符号种类更多,而她用的表情符号从不出错。我很惊讶地看到她有更多庆祝表情,比如香槟和 T2 圣诞树,而我的表情更多地依赖于反应。

此外,我使用表情符号的次数比她多得多。事实上,我用了两倍多的量。这很有意义,因为我们说话和交流信息的语言不是我的第一语言。我更依赖表情符号来传达我的想法或情绪,而她更自信地使用文字。

你可以在这里找到如何创建这些支线剧情的分步说明。

最常见的消息

我们俩发送的最常见的信息非常相似。我加了一个法语的翻译(以防万一)。下面一行代码让我可以非常轻松地浏览我的“消息”栏,找到重复次数最多的消息。我总是对一行代码所能实现的东西感到敬畏。

df.message.value_counts().head(**20**)

我非常惊讶地发现,重复次数最多的信息表达了我们对某件事的一致意见。

  • 同意
  • Pas de soucis! —没问题
  • —是
  • 没问题
  • 凉爽的
  • 非常好
  • 好吧好吧
  • T'es ou?你在哪里?
  • 好的,没问题
  • ️:是的,是的
  • Ok
  • 超级!
  • 没问题

结论:我们在大多数事情上意见一致,很多时候。

单词单词单词

我决定更进一步,调查一下我们俩重复使用最多的词。

让我想起了俄罗斯方块

这是通过将所有单词设置为小写并使用' Counter '函数实现的(不幸的是有多行代码)。该函数跟踪每一个单词,并且每当特定单词出现在消息中时,增加唯一的+1 计数。

for i in df.message.values:
    words += '{} '.format(i.lower()) # make all words lowercase

wd = pd.DataFrame(Counter(words.split()).most_common(**200**)**,** columns=['word'**,** 'frequency']) 

这个计数器函数的结果保存在一个新的 pandas dataframe ' wd '中,我用它来绘制单词 Cloud(在我看来,这是最漂亮的可视化效果:)

WordCloud 函数使用字典,所以我必须在开始绘图之前进行快速转换。

data = dict(zip(wd['word'].tolist()**,** wd['frequency'].tolist()))wc = WordCloud(background_color='white'**,** width=**800,** height=**400,** max_words=**200**).generate_from_frequencies(data)

结束语

通过这个小项目,我学到了很多。这是我第一次处理非数字数据。在编写代码时,有很多错误和事情需要记住,比如法国口音,或者表情库比我想象的更难使用。

我很高兴地看到,这个探索性的数据分析过程传达了关于我的友谊的非常积极的信息。所有使用的表情符号都描绘了积极或充满活力的情绪。最常用的信息是用来表达同意。

最常用的一个词是“谢谢”。

生日快乐,甜心!

Github 知识库

所有代码都可以在 Github 这里的 analysis.py 文件中找到。

非常感谢你的阅读!

如果你喜欢我的作品,我会非常感谢你跟随我的媒介到这里。

如果您有任何关于如何改进的问题**、建议想法,请在下面留下评论或通过 LinkedIn 这里取得联系。**

SNE 霸王龙是什么,为什么和怎样

原文:https://towardsdatascience.com/what-why-and-how-of-t-sne-1f78d13e224d?source=collection_archive---------10-----------------------

t-SNE 简介(图片来自 Pixabay

想象一下我们一天创造的数据;产生的新闻、帖子、视频、社交媒体平台上的图片、沟通渠道上的消息、有助于商业发展的网站等等……巨大无比!对吗?

巨大!对吗?图片来自 Pixabay

现在,想象一下分析这些海量数据并获得有用的见解以做出数据驱动的决策的任务。复杂!对吗?

复杂!对吗?图片来自 Pixabay

对于这个问题,我们可以做的是删除冗余信息,只分析影响大的信息。
降维 在任何数据分析或数据可视化的最初阶段都会出现。

降维 是将数据投影到一个更低维度的空间,这样更便于数据的分析和可视化。然而,维度的减少需要在准确性(高维)和可解释性(低维)之间进行权衡。

但这里的关键是保留最大方差特征,消除冗余特征。

在本文中,我们将重点讨论 t-SNE 降维的原因、内容、方式以及非内容。

下面是讨论的流程:

  1. 为什么不是 PCA?为什么是 t-SNE?
  2. 什么是 t-SNE?
  3. SNE 霸王龙是如何工作的?
  4. 如何实现 t-SNE?
  5. 如何有效使用 tSNE?

为什么不是 PCA?为什么是 t-SNE?

说到降维,PCA 出名是因为它简单、快速、易用,并且保留了数据集的总体方差。关于 PCA 的更多信息,请查看和。

虽然 PCA 很棒,但它也有一些缺点。PCA 的一个主要缺点是它没有保留非线性方差。这意味着 PCA 将无法得到这样的结果。

三叶形结。

简单来说,PCA 只保留全局方差,因此保留局部方差是 t-SNE 背后的动机。

什么是 t-SNE?

t-SNE 是一种非线性降维技术,非常适合将高维数据嵌入到低维数据(2D 或 3D)中进行数据可视化。

t-SNE 代表 t 分布随机邻居嵌入,它讲述了以下内容:
随机→不确定但随机概率
邻居→只关心保留邻居点的方差
嵌入→将数据绘制到更低的维度

简而言之,t-SNE 是一种机器学习算法,每次在相同的数据集上生成略有不同的结果,专注于保留邻居点的结构。

超参数调谐

2 能高度影响结果的参数有

  1. n_iter: 算法运行的迭代次数
  2. *困惑度:*这可以认为是 t-SNE 必须考虑的邻点数

t-SNE 是如何工作的?

**步骤 1:** t-SNE 在更高维度中构建成对的概率分布,使得相似的对象被分配较高的概率,而不相似的对象被分配较低的概率。

**步骤 2:** 然后,t-SNE 在较低维度上迭代复制相同的概率分布,直到库尔巴克-莱布勒散度最小化。

Kullback-Leibler 散度是衡量第一步和第二步的概率分布之间的差异。KL 散度在数学上被给出为这些概率分布的差的对数的期望值。

如何实现 t-SNE

在本节中,让我们使用来自 Kaggle 的数字识别器数据集,使用 t-SNE 进行维数约简。

[## 数字识别器

用著名的 MNIST 数据学习计算机视觉基础

www.kaggle.com](https://www.kaggle.com/c/digit-recognizer)

数据描述:

  • 数据文件包含手绘数字的灰度图像,从 0 到 9。
  • 每幅图像高 28 像素,宽 28 像素,总共 784 像素。每个像素都有一个与之关联的像素值,表示该像素的亮度或暗度,数字越大表示越暗。该像素值是 0 到 255 之间的整数,包括 0 和 255。
  • 训练数据集(train.csv)有 785 列。第一列称为“标签”,是用户绘制的数字。其余的列包含相关图像的像素值。
    数据集中的每个像素列都有一个类似 pixelx 的名称,其中 x 是 0 到 783 之间的整数,包括 0 和 783。为了在图像上定位这个像素,假设我们将 x 分解为 x = i * 28 + j,其中 I 和 j 是 0 到 27 之间的整数,包括 0 和 27。那么 pixelx 位于 28×28 矩阵的第 I 行和第 j 列(由零索引)。

加载数据:

import pandas as pd
mnist_data = pd.read_csv("mnist.csv")

使用 Pandas 将 CSV 格式(逗号分隔值)的数据文件加载到数据框中。

mnist_data.shape

输出:(42000,785)

查看数据,我们发现有 42,000 个数据点和 785 个特征。

mnist_data.head()

输出:

mnist_data 中的前 5 个数据点

第一列标签是目标变量。剩下的 784 列是特征。

target_variable = mnist_data["label"]
features_variable=mnist_data.drop("label",axis=1)

将标签列分配给目标变量,将剩余列分配给特征变量

print(target_variable.shape)
print(features_variable.shape)

输出:(42000,)
(42000,784)

现在,让我们看看这个特征变量是如何使用 t-SNE 减少 42000 个数据点和 784 个特征的。

利用 t-SNE 实现降维:

**第一步:**数据标准化

from sklearn.preprocessing import StandardScaler
standarized_data = StandardScaler().fit_transform(features_variable)

使用标准定标器()。fit_transform( ) ,数据可以一步标准化。

**步骤 2:** 对标准化数据应用 t-SNE

from sklearn.manifold import TSNE
model = TSNE(n_components=2, random_state=0,perplexity=50, n_iter=5000)
tsne_data = model.fit_transform(standarized_data)

在这里,我们创建一个 TSNE 的对象,并设置困惑和 n_iter 值。我们对标准化数据使用了 fit_transform( ) 方法,通过 t-SNE 得到降维数据。

为了验证这一点,让我们打印 tsne_data 的形状

print(standarized_data.shape)
print(tsne_data.shape)

输出:(42000,784)
(42000,2)

我们现在可以一起玩各种困惑n_iter 来观察结果。

如何有效利用 t-SNE?

  1. t-SNE 图受参数的影响很大。因此,在分析结果之前,有必要使用不同的参数值执行 t-SNE。
  2. 由于 t-SNE 是随机的,每次运行可能会导致略有不同的输出。这可以通过固定所有运行的 random_state 参数值来解决。
  3. SNE 霸王龙没有保留原始数据中聚类之间的距离。t-SNE 降维后,聚类之间的距离可能会发生变化。建议不要仅从集群之间的距离获得任何结论。
  4. t-SNE 压缩广泛传播的数据,扩展密集包装的数据。因此,建议不要基于输出来决定聚类的大小和密度/分布/方差。
  5. 更低的困惑度值可能导致更少的聚类。因此,建议尝试不同的困惑值,范围从 2 到数据点数,以获得更好的结果。

资源:

这篇博客文章由 distill.pub 在谷歌大脑的支持下完成。
一定要看看这个博客,了解更多关于 t-SNE 如何有效地帮助减少可视化的各种数据模式的见解。

谢谢你的阅读。以后我会写更多初学者友好的帖子。请在媒体上关注我,以便了解他们。我欢迎反馈,可以通过 Twitter ramya_vidiyala 和 LinkedIn RamyaVidiyala 联系我。快乐学习!

2020 年选举会怎样?

原文:https://towardsdatascience.com/what-will-happen-in-the-2020-election-e6efb0a7b2ad?source=collection_archive---------29-----------------------

提示:将会非常接近

随着 2019 年太阳落山,没有什么比即将到来的总统选举更重要的了。预计参加人数将打破现代记录,许多人认为这将是美国历史上最大的政治事件之一。

在接下来的 12 个月里,在全国各地的起居室里,我们会问同样的问题。谁会赢?它们将承载哪些州?他们为什么会赢?

为了帮助得到一些早期的答案——以及受到其他方法的启发——我建立了一个回归模型,预测美国每个州将会发生什么

方法学

在开始之前,下面简单介绍一下我是如何构建这个模型的。如果您对技术细节不太感兴趣,可以直接跳到“关键见解”部分。

我设置了一个回归问题,预测民主党候选人在大选中获得的选票占投给民主党或共和党的总票数的百分比。

数据很少,所以我只分析了 1976 年至 2019 年这段时间。我选择了基于时间序列交叉验证方案的模型和特性。每一个选举年都是仅用以前的年份来预测的。例如,为预测 1980 年选举而训练的模型只看到 1976 年的数据,而为预测 2016 年选举而训练的模型看到 1976-2015 年的数据。

这种方法的一个后果是,在我们得到稳定的结果之前,需要若干年的时间。因此,使用过去 4 到 6 次选举的平均表现来估计最终表现(R 平方)。

下面是这种方法的示意图,其中每个“测试”时间段是对一次大选内所有州的预测。

来源:https://stats . stack exchange . com/questions/14099/using-k-fold-cross-validation-for-time-series-model-selection

关键见解

各州倾向于一致投票

我首先关注的是之前的大选对下一次大选的预测有多准确。或许并不令人意外的是,投票份额每年变化不大,中位数绝对波动仅为 3.7%。

事实上,在过去的四十年里,只有三个州的波动幅度超过了 15%:

其中两个是被提名人的出生地(奥巴马 2008;克林顿 1992 年出生于夏威夷;出生于阿肯色州)。第三次——里根在 1984 年翻转佐治亚——是罗斯福第一次竞选以来最大的大选压倒性胜利的一部分。

除非有特殊情况,我们通常可以通过简单地查看上一次大选来很好地了解下一次大选将接近的州。

这是经济问题,笨蛋

根据詹姆斯·卡维尔 1992 年的建议——“是经济愚蠢”——我关注的下一个因素是经济增长。对于每个选举年,我都会查看前一年的实际 GDP 增长,这是衡量经济健康状况的一个常用指标。将这一变量与平均民主党投票份额相对照,会得出一个负面关系:

一般来说,经济表现不佳对民主党候选人更有利。当经济受到伤害时,中产阶级在挣扎。当中产阶级举步维艰时,进步政策往往更能引起共鸣。

这一总体模式的最大例外是 1996 年和 2000 年——这两年尽管经济强劲,但民主党的投票份额相当高。

中期选举是一个信号

我还查看了民主党在上次国会选举中赢得的选票百分比。这里的理论是,中期选举为这个国家对执政党的感觉提供了一个脉冲检查。

为了创建这个变量,我合并了众议院和参议院选举中的总票数,并删除了不包括民主党和共和党的任何选举。

这两个变量之间似乎确实存在某种轻微的关系。政党在国会竞选中的表现与在大选中的表现相关联。

当添加到模型中时,该特征在预测能力方面提供了适度但明显的增益。

支持率

显示前景的最后一个变量是大选前现任总统的支持率。在民主党不执政的年份,我从 1 减去共和党的支持率。例如,乔治·h·布什的支持率在 1992 年是 39%,所以我把它转换成 61%来支持民主党。

我再次将变量与平均民主党投票份额进行了对比:

正如所料,我们发现更高的“民主党支持率”与民主党在大选中的更好表现相关。

评估绩效

利用上面的见解,我开发了两个模型。第一个只包括三个变量:“前民主党投票份额”、“前一年 GDP 增长”和“中期民主党投票份额”。第二个使用这三个变量,但也包括“民主党人的批准。”

我建立两个模型有两个原因:

  1. 四因素模型比三因素模型表现更好,但只是在我们评估最近 4 次选举(2004 年至 2016 年)时。当我们查看之前的 6 次选举(1996 年至 2016 年)时,3 因素模型做得更好。我怀疑这可能是由于缺乏交叉验证的训练数据,但很难确定。拥有这两个估计值给了我们更多的解释灵活性。
  2. 四因素模型包括 10 月份的支持率数据——就在选举之前——我们目前没有 2020 年的数据。因此,我们被迫将特朗普在 10 月份的支持率估计为他今天的支持率。这使得 4 因素模型是动态的。随着我们全年对支持率估计值的更新,我们将调整我们的预测。

以下是每个型号的性能汇总,由 R 衡量:

凭借相当强劲且持续的表现,让我们对 2020 年进行预测。

预测 2020 年

以下是对 2020 年大选的预测。为了得出这个结果,我对两个模型的得分进行了平均,并根据预测的民主党投票份额将各州分为 5 类。

  1. 强势共和党: < 40%民主党

'怀俄明州(25%)','西弗吉尼亚州(30%)','俄克拉荷马州(31%)','爱达荷州(32%)','北达科他州(32%)','南达科他州(34%)','肯塔基州(35%)',阿拉巴马州(35%)',阿肯色州(36%)',田纳西州(37%)',犹他州(37%)',内布拉斯加州(37%)',路易斯安那州(39%)',堪萨斯州(40%)'

2.精简的共和党人:40-45%的民主党人

“蒙大拿州(40%)”、“印第安纳州(41%)”、“密西西比州(41%)”、“密苏里州(41%)”、“阿拉斯加州(42%)”、“南卡罗来纳州(43%)”

3.掷硬币:45-55%的民主党人

'得克萨斯州(46%)','爱荷华州(46%)','俄亥俄州(46%)','佐治亚州(47%)','亚利桑那州(48%)','北卡罗来纳州(49%)', '佛罗里达州(49.37%)','威斯康星州(50.02%),'密歇根州(50.39%)','宾夕法尼亚州(50.41%)','明尼苏达州(50.89%),

4.精简的民主党人:55-60%的民主党人

“特拉华州(56%)”、“俄勒冈州(56%)”、“新墨西哥州(56%)”、“新泽西州(57%)”、“康涅狄格州(57%)”、“华盛顿(59%)”、“罗德岛(59%)”、“伊利诺伊州(60%)”

5.强大的民主党人:60%以上的民主党人

“马里兰州(63%)”、“纽约州(64%)”、“马萨诸塞州(65%)”、“加利福尼亚州(66%)”、“佛蒙特州(67%)”、“夏威夷(69%)”、“哥伦比亚特区(91%)”

最终结果和后续步骤

如果这种建模方法在 2020 年达到完美的精确度,下面是选举的结果:

民主党选举人票: 279 张

共和党选举人票: 259

然而,值得注意的是,有 16 个州属于“抛硬币”类别,每个州都在 5%的范围内。还有 5 个州的差距在 1%以内——佛罗里达州(49.37%)、威斯康星州(50.02%)、密歇根州(50.39%)、宾夕法尼亚州(50.41%)和明尼苏达州(50.89%)。

有了如此严密的预测,我的主要观点是选举将会非常接近。事实上,如果模型错过了威斯康星州,只有威斯康星州,我们会看到 269-269 平局。

不言而喻,该模型无法捕捉所有重要因素。最值得注意的是,它没有说明非现任提名者是谁,以及他们对国内关键摇摆州的吸引力如何。

尽管如此,该模型为理解和讨论各方的各种胜利之路提供了坚实的基础。在我的下一篇文章中,我将更深入地探究这些策略和潜在的结果。

会发生什么?—使用无代码人工智能模型和微软的人工智能构建器预测未来业务。

原文:https://towardsdatascience.com/what-will-happen-predict-future-business-using-a-no-code-ai-model-and-microsofts-ai-builder-52996a13243c?source=collection_archive---------23-----------------------

微软 POWER 平台解决方案

微软 Power 平台中的 AI Builder 的第一个外观和一个关于预测的激励性逐步指南

伊利亚·赫特在 Unsplash 上拍摄的照片

人工智能和机器学习是很大的词汇,通常隐藏在大量技术堆栈和各种背景的人获得的一系列复杂技能的背后。

最近,我们看到许多市场运动将这些技术大众化,从而使每个人都可以使用,不管他们的编码或数据科学技能如何。

当然,微软也在这场游戏中。

AI Builder——作为微软 Power 平台的一部分——可能还不是最知名的功能,但它肯定是最激动人心的功能之一。

它允许商业用户创建应用程序,在没有任何编码技能或其他数据科学相关知识的情况下,从功能上丰富了人工智能。

该解决方案跨越了微软的 Power 平台和 Dynamic 365 的更大范围。它进一步本机集成到通用数据服务 ( 什么是 CDS?这给了它一个非常强大的生态系统。

到目前为止,AI Builder 的当前版本支持广泛的预构建 AI 模型:

  • 名片阅读器
  • 关键短语提取
  • 语言检测
  • 文本识别
  • 情感分析

此外,AI Builder 为您提供了使用以下 AI 模型类型训练您自己的 AI 定制模型的选项:

  • 预言;预测;预告
  • 目标检测
  • 表单处理
  • 文本分类

使用 AI Builder 构建 AI 模型的高级过程非常简单明了。

用现有数据配置你的模型训练它。之后,你验证型号性能并做一些快速测试。一旦模型准备好了,你就发布它。从那时起,你可以在不同的地方以不同的方式消费这个模型。您可以在您的业务工作流程或移动应用程序中使用它,仅举几例。

让我们更详细地看一下其中一个 AI 定制模型:预测

预测模型

预测模型允许我们通过使用具有历史结果的历史数据来预测业务结果。

*换句话说:*它允许训练和测试机器学习模型,完全没有代码,也没有数学、统计或任何其他数据科学相关领域的背景。

这是我们自己的人工智能模型所需的一切:

  • 微软动力平台试用
  • 每个历史结果有 50 多条记录,存储在公共数据服务中
  • 每个结果值有 10 多条记录(是、否、数字等。)

一个激励人心的场景—预测未来的自行车租赁

让我们假设我们为一家自行车共享/租赁服务公司工作,我们有一堆历史数据告诉我们许多关于过去的租赁数字和那天的确切天气情况。此外,我们的数据包含关于工作日、假日和其他有趣事实的信息。

预测目标

我们的目标是建立一个人工智能模型,在给定一组输入变量的情况下,该模型可以预测一天的潜在租金数量,这些变量由天气预报、整个季节以及即将到来的假期或周末表示。

抽样资料

我们将使用从 UCI 机器学习网站获取并存储在我的 GitHub 存储库中的数据集的稍微修改的版本。

[## sebastianzolg/ai-builder-intro

bike-sharing.csv 数据集是来自 UCI 机器学习知识库的数据集的修改版本。引用…

github.com](https://github.com/sebastianzolg/ai-builder-intro)

人工智能构建器—一步一步

让我们一步一步地了解我们的人工智能模型的创建过程。

首先,进入https://make.powerapps.com,选择实体,点击获取数据。

从来源列表中,点击文本/CSV。

接下来,在我的 GitHub 存储库中输入 bike-sharing.csv 的 URL,直接从那里抓取数据。

https://raw . githubusercontent . com/sebastianzolg/ai-builder-intro/master/bike-sharing . CSV

点击下一个的**。**

数据加载后,注意cnt #(count)列是很重要的,它代表当天自行车租赁的数量。这就是我们想要预测的所谓特征。

注意,前十个条目有一个nullcnt。我们稍后将使用这些条目来测试我们的训练模型。

在我们继续之前,我们必须将instant列的类型更改为 text,这样我们以后就可以将它用作主名称字段。当我们想要覆盖/替换条目时,这变得很重要。

出现提示时点击添加新步骤,然后点击下一步

地图实体表单上,我们最终对*自行车共享记录建模。*根据截图配置好一切,点击下一步

选择手动刷新并点击创建

回到数据,点击浏览器的刷新按钮,新创建的自行车共享记录实体出现。确保您已经从右上角的视图选项中选择了自定义。这样,你可以更快地找到你的客户实体。

自行车共享记录数据选项卡上,确保您已经从选择视图下拉列表中选择了自定义字段视图。您将立即看到我们的数据,并再次发现前十个条目,其中我们对cnt特性没有价值。

我们现在已经导入了一个实体和一堆数据来训练 AI 模型。我们开始吧。

训练人工智能预测模型

现在我们已经准备好了数据,我们转到 AI 构建器>构建并选择预测模型。

给新模型起一个合适的名字,比如自行车共享预测,点击创建

让我们从实体下拉列表中查找我们的自行车共享记录实体,并从字段下拉列表中选择cnt功能。这就是我们如何告诉 AI 构建器我们想要预测哪个特征。点击下一个

在下一个屏幕上,我们选择我们想要用来构建模型的所有特性。

请注意,有些字段已经被排除。这是因为由 CDS 创建的系统字段,如在上创建的会扭曲预测结果,所以它们默认被排除。

此外,没有显示所有的数据类型。我们的模型可以研究数字、货币、日期、两个选项、选项集和文本数据类型。

剩下的选择取决于你和你的业务领域知识的一部分。对于我们的数据集,我们依赖于原始数据集的文档,并选择以下字段。

- **season**: 
season (1:winter, 2:spring, 3:summer, 4:fall)- **holiday**: 
weather day is holiday or not (extracted from [[Web Link]](http://dchr.dc.gov/page/holiday-schedule))- **workingday**: 
if day is neither weekend nor holiday is 1, otherwise is 0.- **weathersit**:
- 1: Clear, Few clouds, Partly cloudy, Partly cloudy
- 2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist
- 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds
- 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog- **temp**: 
Normalized temperature in Celsius. The values are derived via (t-t_min)/(t_max-t_min), t_min=-8, t_max=+39 (only in hourly scale)- **atemp**: 
Normalized feeling temperature in Celsius. The values are derived via (t-t_min)/(t_max-t_min), t_min=-16, t_max=+50 (only in hourly scale)- **hum**: 
Normalized humidity. The values are divided to 100 (max)- **windspeed**: 
Normalized wind speed. The values are divided to 67 (max)

当然,你可以选择不同的组合,看看你是否能得到更好的结果。我们将在后面看到哪个变量对预测影响最大。准备好后点击下一个

我们跳过过滤步骤,点击下一步的**。**

现在是时候做最后的回顾了。完成后点击训练,等待模型被训练。

点击转到型号

仔细观察状态栏中的进度。当模型状态变为已训练时,点击模型。

给你。🚀你的第一个人工智能模型用人工智能构建器构建。

您可以看到您的模型的性能,以及哪个变量对它的驱动最大。这个模型很好,但并不完美。它给我们留下了改进的空间,但这是另一个故事的一部分。

在你检查完所有东西后,你只需要点击发布。该流程将模型发布到生产环境中,并立即开始对cnt列中值为空的所有条目(前十个)进行预测。

要查看模型预测的内容,请返回到数据>实体并点击自行车共享记录**。**

数据选项卡上,确保选择自定义字段视图,并查找前十个条目。cnt字段仍然为空,这是故意的。预测值是而不是存储在原始字段中。相反,创建了三个额外的列。找一个叫xxx_cnt-predicted的,注意那里的数字。

预测是在这样的一天里我们可以预计的自行车租赁数量。

这不是很好吗?🤓

恭喜你!👏你已经用 AI Builder 创建了你的第一个模型,并根据几个条件预测了潜在的自行车租赁数量。

从这里,我们可以执行以下操作:

  • 通过处理输入数据来改进预测。
  • 在 Power App 或 Power Automate 中使用 AI 模型。
  • 附加到天气服务,预测未来的租金,并调整轮班计划。

但是我们把这一切留到下一个故事。

就这样吧👉,
塞巴斯蒂安

数据科学的伦理会是什么样的?

原文:https://towardsdatascience.com/what-would-an-ethics-of-data-science-look-like-e9d4e9ddc2b3?source=collection_archive---------33-----------------------

卢克·迈克尔在 Unsplash 上的照片

自从 2016 年通用数据保护条例 (GDPR)首次公开制定以来,我们见证了对机器学习道德相关主题的兴趣和工作的激增。现在世界各地都有公平、负责、透明的机器学习(FATML) 会议。最近,杰出的机器学习者、统计学家、、社会学家、律师和哲学家多次呼吁,根据数据科学对个人和社会的伦理影响,重新评估数据科学实践。除此之外,梭伦·巴罗卡斯、安德鲁·塞尔伯斯特、鲁宾·宾斯、雅各布·梅特卡夫、凯特·克劳福德、丹娜·博伊德等人正在进行重要的跨学科研究。

然而,尽管做了这么多伟大的工作,我仍然没有看到任何人为数据科学制定一个全面而一致的道德框架,将数据科学实践的深刻知识与严格的道德论证相结合。我看过的许多论文都提出了基本的、一般的关于伦理的哲学观点,为了吸引普通读者而“简化”了。也许是因为害怕看起来“太主观”,这些作者从来没有真正为数据科学提出过独到的观点。这种方法很难激励人们。通过试图取悦每个人,他们实际上取悦不了任何人。讽刺的是,相对主义者没有列出各种伦理“选项”(这里有一份伦理系统的“自助餐”,你可以选择!各有同等效力!我希望看到有人对一种观点或系统采取强硬立场,不管是好是坏。然后我们可以讨论什么可行,什么不可行。

有益于社会的数据科学而不与来自不同社区和文化的参与者就什么是好的进行实质性讨论,就好比在没有测量两岸距离的情况下在河上建一座桥。在我看来,数据科学伦理目前缺少一个苏格拉底式的牛虻,一个愿意质疑公认的智慧并支持新思想的人,即使被当权者视为“不虔诚”。话说回来,我们都知道苏格拉底发生了什么…

也许我是错的,但我认为(至少一些)数据科学家希望并且应该对数据科学的艺术和实践进行严格而复杂的伦理审查。他们已经准备好坐在“成人桌”前进行讨论。

全面的数据科学伦理需要涵盖哪些内容?

当然,像这样的中等职位并不是制定这种道德规范的合适地方。相反,我想提出三个简单的问题来指导数据科学的未来伦理。换句话说,数据科学伦理需要解决哪些关键的问题问题概念?这些问题是受牛津信息哲学家卢西亚诺·弗洛里迪的启发。

1)我应该成为什么样的数据科学家?

这与古希腊“自我生成”的概念有关,或者说,在我们的一生中,我们如何成为善良和有道德的人。为了正确回答这个问题,我们需要一些关于目的论的概念,或者数据科学家的功能以及她在一个公共或私人组织中的角色。思考这个问题的一种方式是问自己,“在数据科学漫长而成功的职业生涯结束时,对我的成功贡献最大的是什么?作为一名数据科学家,为了过上充实的生活,我发展的关键技能是什么,我参与的最重要的实践是什么?”

或者,正如阿利斯泰尔·麦金太尔或查尔斯·泰勒可能会问的,“数据科学界的价值观、传统和实践是什么?”这个问题是复杂的,因为该领域的混合谱系。数据科学家来自不同的领域,如物理、工程、计算机科学、统计和社会科学。一方面,数据科学家是数据管理员,受托管理关于个人及其行为的私人信息。他们有相当明确的业务目标要实现。另一方面,他们是科学家和研究人员,必须在科学知识的积累与公认的联邦政府规定的人体研究伦理之间取得平衡。雅各布·梅特卡夫(Jacob Metcalf)和凯特·克劳福德(Kate Crawford)在他们的文章 中捕捉到了这一困境:大数据研究中的人类主体在哪里?

反过来,研究数据科学家的角色要求我们问自己这样一个问题,以数据为中心的公司的社会角色是什么,它服务于什么目标或目的?例如,从脸书的大规模在线实验(例如,关于社会传染)中收集的社会科学见解应该与更大的社会科学界共享吗?无形知识产权止于何处,科学知识始于何处?

关于公司的目标和更普遍的商业道德,法律学者如 Lynn Stout 已经著书推翻了股东价值神话。在她看来,除了股东价值最大化这一狭隘目标之外,现代美国公司确实有很大的余地去追求其他目标。托马斯·唐纳森和托马斯·邓菲共同开发了综合社会契约理论,作为在现代企业环境中整合社群主义和契约主义伦理的一种方式。利益相关者理论加上新的有趣的“业务目标函数”可能成为数据科学伦理领域肥沃的知识土壤。

2)我该怎么办?

什么样的动作好?什么决定了行为的对错?它与行为本身的性质或其(可能的)后果有关,还是两者都有?我的动机和意图重要吗?这是一个实用数据科学知识非常重要的领域。数据科学家共有的特定惯例和行为将使数据科学的伦理与社会科学的伦理不同。

汉娜·阿伦特在她的书《艾希曼在耶路撒冷》中揭露了平庸的邪恶。她记录了这个完全平凡而通情达理的人,阿道夫·艾希曼,一个第三帝国的后勤经理,是如何明知故犯地参与了对数百万犹太人的种族灭绝。现在这是一个极端的例子,但尽管如此,当个体行为者未能反思他们正在做什么以及他们的工作如何融入一个更大、更复杂的系统时,必须让数据科学家意识到系统性的邪恶潜力。玛德琳·埃利什写了她所谓的“道德崩溃区”,在那里,人类行为者对复杂的自动化系统的行为控制非常有限。当这种系统失败时,数据科学家应该在多大程度上承担道德和法律责任?谁定义失败?

3)**我为什么要做?**

对于为什么关心这个问题,有一个简单的答案。 GDPR 。如果没有强有力的论据来证明某种行为的对错,那么至少有实际的、合法的理由来解释为什么我们应该关心我们作为数据科学家所做的事情。更多细节可以查看我们的文章 适应 GDPR:对数据科学家和行为研究者的影响 。简而言之,现在我只想说,GDPR 基于欧洲人对确保人类繁荣所需的最低人权的理解,展示了人工智能/人工智能的道德愿景。

但是除此之外,如果你不在欧盟的土地上,你很可能仍然反对没有好的理由成为一个好的数据科学家或者避免可能伤害算法决策系统的最终用户的行为。他们可能会说,作为一门科学,数据科学是没有价值和客观的。“我只是一名工程师。我解决问题。应用这些解决方案是其他人的工作;这不在我的工作范围内。”

我在另一篇关于数据科学家和权力伦理的博客文章中探讨了这种想法的某些方面。简而言之,我们应该培养我称之为的激进数据科学家。我们必须努力不让新的数据科学家倒向相对主义、虚无主义或伦理利己主义。

缩小伦理利己主义

数据科学伦理必须克服的最大哲学障碍是安·兰德的客观主义,它似乎已经渗透到美国政治和工业,尤其是硅谷。

在我看来,客观主义可以比作一种意识形态,这种意识形态很可能来自唐纳德·川普、史蒂夫·乔布斯、弗里德里希·尼采和亚里斯多德之间的一次醉酒对话。现在,对兰德的客观主义的适当回应将是另一个帖子本身。但是我会列出一些应对的方法,这样你就可以知道如何去做了。

客观主义的基本观点:做一个自私的天才

首先,支撑兰德客观主义的伦理利己主义的主要教义是什么?我们可以把它的主要原则总结为“每个人都应该只追求他或她自己的利益”在她 1961 年写的《自私的美德》中,安·兰德写道,“获得自己的幸福是人类最高的道德目标。”根据亚里士多德对人类是理性动物的描述,兰德直言不讳地宣称利他主义违背了人性的本质。对她来说,我们的理性能力意味着我们应该将我们的能量导向伟大思想和目标的产生,这让人想起尼采的übermensch**。我们不能被社会规则的限制和披着“利他主义”外衣的软弱表现所束缚。**

在她有影响力的书《阿特拉斯耸耸肩》中,她记录了如果社会的“有头脑的人”——社会的“主要推动者”、哲学家、科学家和商业巨头——突然罢工会发生什么。兰德对理性计算的推崇,以及她对体现英雄理想的工业(即硅谷)巨头的描述,如今已经转化为超人类主义运动,作者梅雷迪思·布鲁萨德 (2018)称之为“技术至上主义”:坚定不移地认为人类所有问题的解决方案是更多新技术的应用。

第二次世界大战后,也许许多技术专家并不知道,霍克海默、阿多诺、马尔库塞和维纳阐明了当我们目光短浅地追求 工具理性 的冷酷逻辑时,等待人类的可能后果。技术没有像启蒙思想家梦想的那样打开人类解放的闸门,而是被法西斯分子所控制。我们必须提醒自己,这是一种永恒的可能性,否则就有被自己的乐观蒙蔽的风险。

翻译成机器学习的语言和对象,我们可以说

具有讽刺意味的是,盲目技术进步的“贪婪”算法将我们带到了一个局部静止点,在这个点上,我们有能力播下毁灭人类的种子。如果没有一点随机因素——由对我们目标的道德反思带来的——我们就有永远追逐局部最优的风险。

库尔特·拜尔对伦理利己主义的回应

我将留给你们一个对伦理利己主义者或客观主义者的回应。道德哲学家库尔特·拜尔认为,道德利己主义至少在两个方面存在问题。首先,作为一种伦理理论,它是失败的,因为它没有提供更高的原则——它的最高原则是“做对你最有利的事情!”—我们可能用它来裁决党派之间的冲突。第二,也许更重要的是,伦理利己主义实际上并不构成伦理理论。伦理利己主义所支持的道德并不满足任何道德体系的一个基本条件:它为裁决由追求自身利益的人引起的争端提供了理由。换句话说,伦理利己主义并没有满足道德存在的一个关键原因:作为个人和社区的行动指南,根据理性的要求,以公正的方式解决争端。

大多数哲学家,至少在西方分析传统中,会同意任何系统被认为是道德系统,它必须建立一个所有理性人都会同意的行为准则。这种道德观是由康德开创的,最近出现在一些著作中,如约翰·罗尔斯的 正义理论、 大卫·高蒂耶的 契约道德和 T.M .斯坎伦的 我们欠对方的。为了更清楚地理解理性一致的重要性,我们可以看看威廉·弗兰克纳在他 1969 年的论文《道德的概念》中对道德的描述:

“AG(行动指南)是一种道德(道德 AG 相对于非道德 AG),当且仅当它满足如下形式标准时,不管其内容如何:
(A) X 认为它是规定性的。
(B) X 将其普遍化。(C) X 认为它是决定性的,最终的,凌驾于一切之上的,或至高无上的权威。

我们现在可以开始解析拜尔早先的观点了。如果我们假设命题 A、B 和 C(假设道德利己主义是指导我们行动的规定的、普遍的和最高的原则),那么利己主义不可能被说成是构成道德体系或行动指南。想象一下,从普遍的观点来看(即,从不同于你自己的各种人类角色、地位和职位来看),一个每个道德主体都遵循道德利己主义的世界。同时,从普遍的观点来看,想象一个世界,其中每个道德主体都不遵循道德利己主义。哪个世界会更好?道德理性战胜利己理性的世界,还是利己理性战胜道德理性的世界?

拜尔的论点是,如果我们生活在一个以追求私利为终极行动原则的世界,那么我们的境况不会比霍布斯笔下的自然状态好到哪里去。除了我们当中最幸运的人之外,生活对所有人来说都是肮脏的、野蛮的和短暂的。然而,普遍性标准要求我们寻找每个人都能接受的原则,不管他们在社会中的实际地位如何。即使我们可能在这个基因彩票的特别抽奖中幸运地如愿以偿,我们也会意识到,在一个反事实的世界里,事情可能会朝着另一个方向发展。**

伦理利己主义把自己钉在自己逻辑的利剑上,因为它没有也不可能为我们提供权威性的最终理由——作为一种决策程序——来裁决人们之间遵循自身利益的争端。当然,当道德利己主义符合你的利益时,当你缺乏身体力量来执行你的意志时,你会支持道德利己主义,但想象一下所有情况都是相反的,你会让最大和最强的人行使他的私利来反对你自己的私利。强权即公理是一个伟大的原则,以防你碰巧是房间里最强壮的人。但是当你不在的时候呢?拜尔对伦理利己主义的反驳有一个明显的长期频繁主义逻辑。

对于那些熟悉道德哲学的人来说,我们可能会说伦理利己主义失败了,因为它不能以康德的形式表达为绝对命令。这最终会弄巧成拙, 最少作为一种伦理理论或作为一种道德。但是,伦理利己主义的支持者可能会说,这一事实并不妨碍它作为非道德的行动指南而存在。也许这样的行动原则没有达到道德的地位,但它可能仍然有价值的其他原因。事实上,伦理利己主义,被米尔顿·弗里德曼和其他人重新表述为“公司的社会责任是增加其利润”的观点,似乎仍然驱动着现代商业和经济中的许多决策。

那么,如果伦理利己主义作为一种行动指南和道德体系最终会弄巧成拙,我们该用什么来取代它呢?这就是我认为未来数据科学伦理学的主要任务。不过,有一件事是肯定的。如果我们不能坚持某些东西,我们就有陷入一切的风险——无论是虚无主义、相对主义还是安·兰德的客观主义。

如果神经网络状态是复数会发生什么?

原文:https://towardsdatascience.com/what-would-happen-if-neural-network-states-were-complex-numbers-dc5b47731184?source=collection_archive---------20-----------------------

作者创建的图像。

i 并入网络

这是一个目前处于神经网络研究边缘的问题:如果神经网络状态是复数会发生什么?由于权重、偏差和其他网络分量都有一个实部和一个虚部,一个曾经的一维测量将可以在两个维度中自由移动。

这是一个值得思考的有趣想法。从理论上讲,如果一个人能够在一个空间中传达两个值,神经网络可能能够找到某个结果的更高维度、更快的解决方案,就像你能够在三维空间中跳过一块岩石,但一只蚂蚁看到前方似乎永远延伸的墙,需要绕过它。

作者创建的图表。

也许通过利用虚数,神经网络将能够探索比目前更远的潜力。

幸运的是,这个问题并没有完全被忽略,并且已经有大量关于复值神经网络(CVNNs)的研究。几乎所有这些论文中提到的第一个问题是激活函数——为了使反向传播有效,促进网络非线性的激活函数必须是解析的,或者在所有点上都是可微分的。然而,刘维尔定理表明,在完全复平面上的每个有界(闭)函数必定是常数,因此是线性的。

因此,为了实现激活函数的目的,像 sigmoid 和双曲正切这样的有界函数在 CVNNs 中没有位置。当应用于复平面时,这些有界函数具有奇点——在空间中周期性出现的不可微的点。在这些奇点,函数向无穷大爆炸,导致神经网络计算失控。

在 CVNNs 的研究中,解决这个问题的一个常见方法是使用复杂的 sigmoid 函数,该函数不可避免地在无穷远处具有某些奇点,但是限制了权重和偏差参数的搜索空间,使得它们总是保持在“安全”区域内,并且永远不会接近计算爆炸。

尽管涉及大量的数学工作,简单地说,用于复值神经网络的反向传播算法不仅需要考虑权重的实部误差,还需要考虑虚部误差。因为它分别处理这些组件,所以它将搜索空间维度扩展了两个数量级。

由于这种稀疏性,在训练的前几百个时期使用随机搜索算法(RSA)来在空间中跳跃,找到复值反向传播算法(故意设置为具有非常慢的学习速率)要去的局部最小值。从这个意义上说,随机搜索算法是一种重型初始化技术。考虑使用这种方法的训练误差,对前 100 个历元执行 RSA,对剩余的历元执行复值反向传播:

来源:“用梯度下降和随机搜索算法训练的复值和实值神经网络的比较”。图片免费分享。

很明显,RSA 已经从大约第 75 个历元找到了合适的开始位置,这使得梯度下降算法很容易跟随误差的巨大减小和随后的长的、逐渐减小的序列。

通常,在实值神经网络(RVNN)上测试 CVNN 性能的论文要么看到相似的性能,要么看到更好的性能。通过增加虚数的额外维度,出现了一大堆新问题,但已构建的少数解决方案似乎足以将 CVNNs 与 RVNNs 相提并论。最近的研究甚至涉及复杂卷积、LSTMs 和批量归一化的构建,以进一步帮助 CVNNs。

总的来说,复杂的神经网络可以用一个词来概括:有前途。虽然目前,它们与普通标准神经网络的同等性能,但更高的计算成本和对各种问题的鲁棒性下降令人沮丧,但最近的研究表明,随着足够的发展,CVNNs 在音频相关任务(使用 MusicNet 数据集的音乐转录和语音频谱预测)上大大优于它们的实值兄弟。

虽然在不久的将来,CVNNs 在机器学习领域掀起风暴的希望很小,但在解决许多复杂的问题方面的持续发展可能会大大增加其解决特定任务的能力,例如在模拟信号(音频、电子等)方面。),就像其他为处理图像和顺序数据而设计的架构一样。将虚数整合到神经网络中的想法绝对值得关注。

延伸阅读

  • 一篇介绍性论文介绍复杂神经网络中的问题和解决方案。
  • 一篇深入的论文专门讨论复平面中的奇点和激活函数问题。良好的可视化,但数学密集型。
  • 最近的一篇论文介绍了复杂神经网络的许多数学密集型发展,显示了在音频相关任务上的卓越性能。

关于异常值检测,你一直想知道但又不敢问的是什么

原文:https://towardsdatascience.com/what-you-always-wanted-to-know-about-outliers-detection-but-never-dared-to-ask-f040d9ca64d9?source=collection_archive---------53-----------------------

保证结果的 pythonic 离群点检测独家指南

山下孝文在 Unsplash 上的照片

离群点检测是探索性数据分析中的一个自然的初步步骤,目的是在大多数数据科学项目中获得最具影响力的结果。该过程包括消除异常超限值,以获得最佳预测。易于使用的离群点检测方法一般包括:最小最大分析、Z 得分极值分析、四分位数间距、扩展隔离森林、局部离群点方法。要成为独角兽数据科学家,掌握最有效的异常值检测方法是一项必备技能。在本文中,我们将回顾 Kaggle winners 的异常值检测方法,这些方法可以用简短的 python 代码实现。

我们将分析我们的甜巧克力棒评分数据集,您可以在这里找到。

照片由 Massimo Adami 在 Unsplash 上拍摄

一个具有挑战性的数据集,在分类编码后包含超过 2800 个特征。

  1. 最小-最大值分析

面临的挑战是找到最有效地提取异常值的最佳方法,最终创建一个适合数据点的模型,减少模型预测的总体误差。这是一个对巧克力评分数据集(一个复杂的多维数据集)进行最小-最大分析的示例。

import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy .stats import norm df = pd.read_csv('../input/preprocess-choc/dfn.csv')#so my upper limit will be my mean value plus 3 sigmaupper_limit=df.rating.mean()+3*df.rating.std()#my lowar limit will be my mean - 3 sigmalowar_limit=df.rating.mean()-3*df.rating.std()

现在让我们检查我们的异常值:

df[(df.rating>upper_limit)|(df.rating<lowar_limit)]#now we will visualise the data without outliersnew_data=df[(df.rating<upper_limit)& (df.rating>lowar_limit)]#shape of our outlier’sdf.shape[0]-new_data.shape[0]

输出

使用最小-最大方法检测异常值**(作者提供**图片)

该方法实现了 6 个异常值的检测。让我们画出来:

数据异常值处理前后的数据分布 ( 图片由作者提供)

Unsplash 上由 Maciej Gerszewski 拍摄的照片

2.**使用 Z 分数的极值分析**

Z 得分表示一个数据点距离标准偏差有多少,在我们的例子中,平均值为 3.198,标准偏差为 0.434,因此数据点 4.5 的 Z 得分为:

4.5–3.198(平均值)/0.434(标准值)= 1.847

现在,我们将计算数据点的 z 分数,并显示它们:

df['zscore']=(df.rating-df.rating.mean())/df.rating.std()df#displaying the outlier’s with respect to the zscoresdf[(df.zscore<-3)|(df.zscore>3)]

( 图片作者)

该方法实现了 7 个异常值的检测。

尤利娅·希诺娃在 Unsplash 上的照片

3.**四分位数间距(IQR)**

四分位数间距 IQR(或 50%中点)是一种衡量上四分位数(Q1:第 25 位)和下四分位数(Q3:第 75 位)之间差异的方法 IQR =Q3Q1。使用超出范围的数据点(最小-最大)可以定义边界,并且可以确定异常值。

我们来编码一下:

Q1=df.rating.quantile(0.25)Q3=df.rating.quantile(0.75)Q1,Q3

输出

3.0 , 3.5

#Now we will calculate the IQR :IQR=Q3-Q1IQR

输出

0.5

Q1 对应于巧克力等级分布的 25%低于 3.0,而 Q3 对应于巧克力等级分布的 75%低于 3.5。

现在,我们将定义巧克力评分分布的上限和下限:

LOWAR_LIMIT=Q1-1.5*IQRUPPER_LIMIT=Q3+1.5*IQRLOWAR_LIMIT,UPPER_LIMIT

输出

2.25, 4.25

现在,我们将在数据框中显示异常值评级:

df[(df.rating<LOWAR_LIMIT)|(df.rating>UPPER_LIMIT)]

( 图片作者)

该算法发现了 36 个异常值。让我们画出结果:

数据异常值处理前后的数据分布 ( 图片由作者提供)

照片由海伦娜·扬科夫斯卡在 Unsplash 上拍摄

4.**扩展隔离林方法**

扩展隔离森林这是一种垂直或水平决策边界线性回归算法,从训练数据中选择随机斜率和偏差。唯一的方法缺点是不能正确检测分支切割数据点。

我们来编码一下:

**# Import the libraries** from scipy import statsfrom sklearn.ensemble import IsolationForestfrom sklearn.neighbors import LocalOutlierFactorimport matplotlib.dates as mdfrom scipy.stats import norm%matplotlib inlineimport seaborn as snsfrom sklearn.model_selection import train_test_splitsns.set_style("whitegrid") #possible choices: white, dark, whitegrid, darkgrid, ticksimport eif as isoimport matplotlib.pyplot as pltimport plotly.express as pximport plotly.graph_objs as goimport plotly.figure_factory as fffrom plotly import toolsfrom plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplotpd.set_option('float_format', '{:f}'.format)pd.set_option('max_columns',250)pd.set_option('max_rows',150)**#Define X_train, y_train**a = df_enc.loc[:,~df_enc.columns.duplicated()]b = a.drop('rating', axis = 1)X = b.iloc[:,0:11]y = a.iloc[:,2]X_train,y_train, X_test,y_test = train_test_split(X, y, test_size=0.3)**#Define Extend isolation forest** clf = IsolationForest(max_samples='auto', random_state = 1, contamination= 0.02)**# Transform data** preds = clf.fit_predict(X)**# Define outliers bondaries structure** df['isoletionForest_outlier’s'] = predsdf['isoletionForest_outlier’s'] = df['isoletionForest_outlier’s'].astype(str)df['isoletionForest_scores'] = clf.decision_function(X)**# Counts the chocolate rating outliers :**print(df['isoletionForest_outlier’s'].value_counts())

输出

**1     2179****-1      45****Name: isoletionForest_outlier’s, dtype: int64**

该算法发现了 45 个异常值。让我们画出结果:

fig, ax = plt.subplots(figsize=(30, 7))ax.set_title('Extended Outlier Factor Scores Outlier Detection', fontsize = 15, loc='center')plt.scatter(X.iloc[:, 0], X.iloc[:, 1], color='g', s=3., label='Data points')radius = (df['isoletionForest_scores'].max() - df['isoletionForest_scores']) / (df['isoletionForest_scores'].max() - df['isoletionForest_scores'].min())plt.scatter(X.iloc[:, 0], X.iloc[:, 1], s=2000 * radius, edgecolors='r', facecolors='none', label='Outlier scores')plt.axis('tight')legend = plt.legend(loc='upper left')legend.legendHandles[0]._sizes = [10]legend.legendHandles[1]._sizes = [20]plt.show()

使用扩展离群因子分数的参数圆离群点检测

该图通过使用圆的大小来描述异常值,较大的圆被检测为异常值。

照片由克里斯蒂安娜·皮恩在 Unsplash 拍摄

5.局部异常值方法

局部异常值因子是比较数据点密度的唯一方法。如果密度点小于其他邻近密度点,异常值因子将为负(- 1),因此,该点可视为异常值。

**# Import the libraries**from scipy import statsfrom sklearn.neighbors import LocalOutlierFactorimport matplotlib.dates as mdfrom scipy.stats import norm%matplotlib inlineimport seaborn as snsfrom sklearn.model_selection import train_test_splitsns.set_style("whitegrid") #possible choices: white, dark, whitegrid, darkgrid, ticksimport eif as isoimport matplotlib.pyplot as pltimport plotly.express as pximport plotly.graph_objs as goimport plotly.figure_factory as fffrom plotly import toolsfrom plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplotpd.set_option('float_format', '{:f}'.format)pd.set_option('max_columns',250)pd.set_option('max_rows',150) **#Define X_train, y_train**a = df_enc.loc[:,~df_enc.columns.duplicated()]b = a.drop('rating', axis = 1)X = b.iloc[:,0:11]y = a.iloc[:,2]X_train,y_train, X_test,y_test = train_test_split(X, y, test_size=0.3)**#Define Extend isolation forest** clf = LocalOutlierFactor(n_neighbors=11)**# Transform data :**y_pred = clf.fit_predict(X)**# Define outliers bondaries structure** df['localOutlierFactor_outlier’s'] = y_pred.astype(str)
df['localOutlierFactor_scores'] = clf.negative_outlier_factor_**# Counts the chocolate rating outliers** print(df['localOutlierFactor_outlier’s'].value_counts())

输出

**1     2161****-1      63****Name: localOutlierFactor_outlier’s, dtype: int64**

该算法发现了 63 个异常值。让我们画出结果:

fig, ax = plt.subplots(figsize=(30, 7))ax.set_title('Local Outlier Factor Scores Outlier Detection', fontsize = 15, loc='center')plt.scatter(X.iloc[:, 0], X.iloc[:, 1], color='g', s=3., label='Data points')radius = (df['localOutlierFactor_scores'].max() - df['localOutlierFactor_scores']) / (df['localOutlierFactor_scores'].max() - df['localOutlierFactor_scores'].min())plt.scatter(X.iloc[:, 0], X.iloc[:, 1], s=2000 * radius, edgecolors='r', facecolors='none', label='Outlier scores')plt.axis('tight')legend = plt.legend(loc='upper left')legend.legendHandles[0]._sizes = [10]legend.legendHandles[1]._sizes = [20]plt.show()

使用局部离群因子分数的参数圆离群点检测(作者的图片)

该图通过使用圆的大小来描述异常值,较大的圆被检测为异常值。

安东尼奥·卡斯特利亚诺在 Unsplash 上的照片

如果你有空闲时间,我建议你看看这个:

https://towards data science . com/5-ways-to-detect-outliers-the-every-data scientist-should-know-python-code-70a 54335 a623

总结一下

请参考此链接:

https://jovian . ml/yeonathan/5-best-outliers-detection-methods-2020

使用这些方法完成巧克力棒数据集的离群点检测。

使用几种异常值检测方法在数据科学中是至关重要的,这一简要概述提醒了使用多重异常值消除方法的重要性。因此,提取最佳数据值,以及共享有用的文档。

希望你喜欢,继续探索!

阿瑟尼·波苏邦科在 Unsplash 上的照片

关于云中的网络安全,你需要知道什么

原文:https://towardsdatascience.com/what-you-need-to-know-about-cyber-security-in-the-cloud-63621f128417?source=collection_archive---------39-----------------------

云计算中的网络安全越来越受到许多组织的关注,尤其是那些使用云来存储客户敏感数据的组织。

杰佛森·桑多斯在 Unsplash 上拍摄的照片

组织越来越多地使用云计算技术来构建、部署和迁移到基于云的环境。

虽然谷歌云平台(GCP)、微软 Azure 和亚马逊网络服务(AWS)等云服务提供商继续扩展云安全服务来保护他们的云基础设施,但在云中实施适当的网络安全并保护存储在其中的数据最终是客户的责任。

尽管有一系列好处,但在公开托管的云环境中保护组织的数据很容易使组织暴露于许多威胁媒介。

一项调查显示,云中最大的网络安全挑战是数据丢失(64%)、数据隐私(62%),其次是凭证意外泄露(39%)和合规性问题(39%)。

随着数据继续向云迁移,许多网络安全专业人员正在努力维护其云环境的安全性。

云计算带来了新的挑战。

当使用云服务时,无论是软件即服务(SaaS)还是基础设施即服务(IaaS),客户总是有某种程度的责任来保护他们的数据免受攻击者的攻击。

对于 SaaS 服务,他们的控制主要是限制访问和加密数据,如果 SaaS 允许的话。借助平台即服务(PaaS)和 IaaS,组织在保护数据方面承担了更多责任。

克服网络安全中的云安全挑战

云中的安全问题是许多考虑云计算服务的组织的主要关注点。云的快速发展不仅凸显了云的优势,也关注了其环境中存在的云安全挑战。

是真的吗?云计算真的不安全吗?

答案很复杂。

通过实施最新的安全措施,单个云计算服务可以显著提高安全性。事实上,许多云服务提供商在将安全性集成到云基础架构方面做得很好,并且比许多其他组织做得更安全。

然而,并不是每个云服务提供商都是这样,因此在审查云提供商的安全状况时必须小心谨慎。

云计算的安全性也依赖于用户。未能正确遵守安全标准并及时解决安全风险可能会导致本可预防的网络攻击或数据泄露。这要求公司了解并以有效的方式降低云安全风险。

云中的大多数安全问题都围绕着数据和访问,因为云计算服务中的大多数共享责任模型将这两个方面完全留给了客户。

因此,攻击者一直将注意力集中在这个潜在的安全漏洞上。有几个与云安全相关的挑战。云计算安全最常见的问题包括:

  • 识别和维护必要的安全控制
  • 平衡云服务提供商和用户之间维护安全的共同责任
  • 符合法规要求以保护云环境中的数据。

简而言之,云安全是相当动态的,主要取决于最终用户理解和解决云计算安全风险和漏洞的程度。

幸运的是,遵循云安全最佳实践可以在很大程度上降低云安全风险。下面,我们列出了云中的顶级网络安全最佳实践,可以帮助您构建和维护安全的云环境。

网络安全:云中的最佳实践

想要以安全的方式利用云计算吗?以下是云中的一些最佳网络安全实践:

实施强用户访问控制/最低权限

与传统的软件安全流程类似,管理员应该实施强大的用户访问控制,以定义谁可以访问数据以及用户可以访问数据的程度。这将有助于确保只有授权用户才能访问云基础架构中的数据。

使用最低特权模型,还可以确保用户只能访问他们完成任务所需的数据。当现有用户和新用户访问新服务器时,实现用户访问控制和最低权限的过程可以很容易地自动化,以提高准确性并节省时间。

使用 SSH 密钥并安全地存储密钥

安全套接字外壳(SSH)密钥有助于使用私有和公共密钥对建立安全的服务器连接。因为它们用于访问敏感数据和执行关键的特权活动,所以正确管理 SSH 密钥并安全地存储它们非常重要。

公司应创建特殊的云计算和密钥管理策略,以监控这些密钥在到期时是如何创建、管理和删除的。例如,应监控和分析通过 SSH 密钥进行的任何特权会话,以满足监管和网络安全需求。

在云中实施加密

云计算中的数据加密对组织来说至关重要,因为它有助于确保进出云的数据是加密和安全的。

在选择云服务提供商时,您需要对云部署和将存储在云中的数据的安全需求保持警惕。很多云服务提供商提供云加密服务;很多时候,您可能希望管理自己的加密密钥,而不是完全依赖提供商。只是根据你的风险承受能力来管理。

加密与其他安全协议(如最低特权原则(PoLP ))相结合,使组织能够满足严格的法规政策,如 PCI DSS、HIPAA 和 GDPR。

执行常规渗透测试

云渗透测试有助于识别云基础设施中的安全漏洞。

对于云计算,pen 测试通常是一项共同的责任,这意味着您的组织和您的云服务提供商都可以执行渗透测试来检测云中的安全漏洞。

云中的笔测试和其他笔测试有区别吗?

通常,云计算环境中的笔测试与其他笔测试没有太大区别。虽然云应用程序和基础设施的设置方式存在重大差异,但 pen 测试的原则是相同的,即识别和减少安全漏洞。

硬化和受控的图像

强化的虚拟服务器映像基本上是一个没有任何手边特定任务不必要的内容的映像,并且其配置受到严格保护。这些映像是根据适当的云安全标准构建的,具有最低的访问权限和管理权限,并且只有所需的端口和服务。

强化和控制映像是限制云安全漏洞和保护您的组织的深度防御策略的关键组成部分。

实施多因素身份认证

多因素身份认证(MFA)使用一系列身份认证方法来保护您的公司数据和用户帐户,如一次性密码、生物识别、安全问题等。

MFA 将如何帮助确保更好的云计算安全性?

通过在您的云计算环境中实施 MFA,您可以将对云中数据的访问权限仅限于授权用户,并防止凭据丢失、被盗或受损的风险。

扫描漏洞和未经批准的强化流程

云计算环境中的错误配置会产生可被利用的安全漏洞。

根据一份报告,在任何给定时间,公司平均至少有 14 个错误配置的 IaaS 事件在运行,导致平均每月约 2,300 起云错误配置事件。

为了避免这样的网络安全漏洞,您需要审核您的 IaaS 配置,以进行访问管理、加密和网络配置。

此外,考虑自动扫描加固的映像、docker 容器和所有新部署的服务器,以识别在部署或管理时云计算环境中可能引入的安全漏洞。

不要只寻找现有的网络安全漏洞,要不断扫描您的环境,寻找任何没有经过适当强化配置的项目。如果某些内容偏离了硬化配置,请用批准的硬化映像替换它。记住,牛不是宠物!

总结和展望

云计算既带来了好处,也带来了挑战。虽然云中的网络安全是云服务提供商和用户的共同责任,但许多组织没有正确履行自己的责任,牺牲了客户的利益。

无论是由于疏忽还是缺乏知识,误用您的云环境都会带来严重的后果。确保实施严格的云计算安全策略,以确保云中的数据是安全的。

运行云基础设施不是一件容易的事情,我们明白这一点。

我们的安全团队由 AWS、Azure、Google Cloud 方面的顶级安全和主题专家以及知识渊博的安全培训师组成,他们可以帮助您解决在购买云服务之前应该向云服务提供商提出的问题。

我们还提供安全审计来检测和缓解云基础架构中的安全漏洞,使您能够轻松保护您的云环境。

关于作者:

Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。

关于深度强化学习,你需要知道什么

原文:https://towardsdatascience.com/what-you-need-to-know-about-deep-reinforcement-learning-3571ec8368f4?source=collection_archive---------32-----------------------

人工智能算法正越来越多地为我们的现代社会提供动力,并在从金融到医疗保健再到交通运输的各个领域留下印记。如果说 20 世纪下半叶是计算和连接(互联网基础设施)的全面进步,那么 21 世纪将被智能计算和智能机器竞赛所主导。

资料来源:Unsplash

然而,大多数关于这些新颖计算范例的讨论和认识都围绕着所谓的“监督学习”,其中DeepLearning(DL)占据了中心位置。最近的进步和惊人的成功——从疾病分类到图像分割到语音识别——使得 DNNs 在高科技系统的各个方面都得到了极大的发展和应用。

然而,DNN 系统需要大量的训练数据(已经知道答案的标记样本)才能正常工作,它们并不完全模仿人类学习和应用智能的方式。几乎所有的人工智能专家都同意,简单地扩大基于 DNN 的系统的规模和速度,永远不会产生真正的“类人”人工智能系统,甚至不会产生任何与之接近的东西。

因此,有很多研究和兴趣探索超越监督学习领域的 ML/AI 范例和算法,并试图遵循人类学习过程的曲线。收入是其中研究最广泛、最令人兴奋的。

在这篇文章中,我们简要地讨论了现代的 DL 和 RL 如何在一个叫做DeepRe enforcementLearning(DRL)的领域中融合在一起,从而产生强大的人工智能系统。

什么是深度强化学习?

人类擅长解决各种各样的挑战性问题,从低级别的运动控制(如走路、跑步、打网球)到高级别的认知任务(如做数学、写诗、交谈)。

强化学习旨在使软件/硬件代理能够通过定义明确、设计良好的计算算法来模仿人类行为。这种学习范例的目标不是以简单的输入/输出功能方式(像一个独立的 DL 系统)映射标记的例子,而是建立一个策略,帮助智能代理按顺序采取行动,以实现某个最终目标。

图来源:“机器学习的类型有哪些”

更正式地说,RL 指的是面向目标的算法,它学习如何实现一个复杂的目标或如何在许多步骤中沿着一个特定的维度最大化。以下示例说明了它们的用法:

  • 一种最大限度提高获胜概率的棋类游戏
  • 使交易收益最大化的金融模拟
  • 在复杂环境中移动的机器人,使其运动中的误差最小化

其思想是,代理通过传感器数据接收来自环境的输入,使用 RL 算法对其进行处理,然后采取行动以满足预定目标。这与我们人类在日常生活中的行为非常相似。

来源:强化学习:导论(书)

深度强化学习中的一些基本定义

对于接下来的讨论,更好地理解 RL 中使用的一些关键术语是有用的。

Agent :一种软件/硬件机制,根据其与周围环境的交互而采取一定的动作;例如,无人机送货,或超级马里奥导航视频游戏。算法就是代理。

动作 :动作是代理可以做出的所有可能动作中的一个。一个动作几乎是不言自明的,但是应该注意,代理通常从一系列离散的、可能的动作中进行选择。

环境 :智能体活动的世界,对智能体做出反应的世界。环境将代理的当前状态和动作作为输入,并将代理的奖励及其下一个状态作为输出返回。

状态 :状态是代理人发现自己的一种具体的、即时的情况;即一个特定的地点和时刻,一个将主体与其他重要事物联系起来的瞬时配置。一个例子是棋盘的特殊结构。

奖励 :奖励是我们在给定状态下衡量一个代理人行动成败的反馈。比如在一局棋中,消灭对手的主教等重要动作可以带来一定的奖励,而赢下一局可能会带来很大的奖励。负面奖励也有类似的定义,例如游戏中的失败。

折扣系数 :折扣系数是一个乘数。代理人发现的未来奖励会乘以这个系数,以抑制这些奖励对代理人当前行动选择的累积效应。这是 RL 的核心,即逐渐降低未来奖励的价值,以便给予最近的行动更多的权重。这对于基于“延迟行动”原则的范例来说是至关重要的。

策略 :策略是 agent 根据当前状态决定下一步动作所采用的策略。它将状态映射到行动,即承诺最高回报的行动。

价值 :折现后的预期长期回报,与短期回报相对。该值被定义为特定政策下当前状态的预期长期回报。

Q-value 或 action-value : Q-value 类似于 value,只是多了一个参数,即当前动作。它是指在特定策略下采取特定行动的行动从当前状态的长期回报。

常见的数学和算法框架

解决 RL 问题的一些常见数学框架如下:

马尔可夫决策过程(MDP) :几乎所有的 RL 问题都可以被框定为 MDP。MDP 的所有州都具有“马尔可夫”特性,指的是未来只取决于当前的州,而不是各州的历史。

贝尔曼方程 :贝尔曼方程是指将价值函数分解为眼前报酬加上未来贴现值的一组方程。

动态规划 :当系统(agent + environment)的模型完全已知时,遵循贝尔曼方程,我们可以使用动态规划(DP)迭代地评估价值函数并改进策略。

资料来源:Exxact

值迭代 :是通过迭代改进值的估计来计算最优状态值函数的算法。该算法将值函数初始化为任意随机值,然后重复更新 Q 值和值函数值,直到它们收敛。

来源:Exxact

策略迭代 :由于智能体只关心寻找最优策略,有时最优策略会先于价值函数收敛。因此,策略迭代,而不是反复改进价值函数估计,在每一步重新定义策略,并根据这个新策略计算价值,直到策略收敛

Q-learning :这是一个无模型学习算法的例子。它不假设代理人知道任何关于状态转换和奖励模型的事情。然而,代理会通过试错来发现什么是好的和坏的行为。Q-Learning 的基本思想是从我们在主体与环境的交互过程中观察到的 Q 值函数样本中逼近状态-动作对 Q 函数。这种方法被称为时差学习

资料来源:Exxact

:Q-learning(试错观察法)解决的一个示例 RL 问题。环境的动力学和模型,即运动的整个物理学是未知的。

无模型强化学习的挑战

Q-learning 是一种简单而强大的解决 RL 问题的方法,并且在理论上,可以在不引入额外数学复杂性的情况下扩大到大型问题。基本的 Q 学习可以在递归方程的帮助下完成,

这里,

Q(s,a) : Q 值函数,

s :状态

s ',s ' ':未来状态

:动作

γ :折扣系数

对于小问题,可以从任意假设所有 Q 值开始。通过试错法,Q 表得到更新,政策朝着收敛的方向发展。更新和选择操作是随机进行的,因此,最优策略可能不代表全局最优,但它适用于所有实际目的。

然而,随着问题规模的增长,为一个大问题构建和存储一组 Q 表很快成为一个计算挑战。例如,在像国际象棋或围棋这样的游戏中,可能状态的数量(移动的顺序)随着你想要提前计算的步数呈指数增长。因此,

  • 保存和更新该表所需的内存量将随着状态数量的增加而增加
  • 探索每个状态以创建所需的 Q 表所需的时间是不现实的

深度 Q 学习等技术试图使用 ML 来应对这一挑战。

深度 Q 学习

顾名思义,深度 Q-learning 不是维护一个很大的 Q 值表,而是利用一个神经网络从给定的动作和状态输入中逼近 Q 值函数。在一些公式中,状态作为输入给出,所有可能动作的 Q 值作为输出产生。神经网络叫做Deep-QNnetwork(DQN)。基本思想如下所示,

图来源: 一个用 Python 语言 使用 OpenAI Gym 进行深度 Q 学习的动手介绍

但是和 DQN 一起工作是很有挑战性的。在传统的 DL 算法中,我们对输入样本进行随机化,因此输入类在各种训练批次中相当平衡和稳定。在 RL 中,随着探索阶段的进展,搜索变得更好。这不断地改变输入和动作空间。另外,随着关于环境的知识变得更好,Q 的目标值自动更新。简而言之,对于一个简单的 DQN 系统来说,输入和输出都是频繁变化的。

为了解决这个问题,DQN 引入了经验回放目标网络的概念来减缓变化,以便能够以受控/稳定的方式逐渐学习 Q 表。

体验重放在专门的缓冲器中存储一定量的状态-动作-奖励值(例如最后一百万)。使用来自该缓冲区的小批量随机样本来完成 Q 函数的训练。因此,训练样本是随机化的,并且表现得更接近于传统 DL 中监督学习的典型情况。这类似于拥有高效的短期记忆,在探索未知环境时可以依靠这种记忆

此外,DQN 通常采用两个网络来存储 q 值。一个网络不断更新,而第二个网络,即目标网络,以规则的间隔与第一个网络同步。目标网络用于检索 Q 值,使得目标值的变化不太易变。

深度强化学习的例子(DRL)

玩雅达利游戏(DeepMind)

DeepMind ,一家总部位于伦敦的初创公司(成立于 2010 年),于 2014 年被谷歌/Alphabet 收购,为 DRL 领域做出了开创性的贡献,当时成功地使用卷积神经网络(CNN)和 Q-learning 的组合,训练一个代理人仅从原始像素输入(作为感官信号)玩雅达利游戏。详情可以在这里找到。

玩雅达利用深度强化学习

图来源: DeepMind 关于 arXiV 的雅达利论文(2013) 。

阿尔法围棋和阿尔法围棋零(DeepMind)

围棋起源于 3000 多年前的中国,由于其复杂性,它被称为对人工智能最具挑战性的经典游戏。标准的人工智能方法使用搜索树测试所有可能的移动和位置,无法处理可能的围棋移动的绝对数量或评估每个可能的棋盘位置的强度。

利用 DRL 技术和一种新颖的搜索算法,DeepMind 开发了 AlphaGo,这是第一个击败职业人类围棋选手的计算机程序,第一个击败围棋世界冠军,可以说是历史上最强的围棋选手。

图来源:https://medium . com/point-nine-news/what-does-alpha go-vs-8 dadec 65 AAF

这种 Alpha Go 的一个更好的版本叫做 Alpha Go Zero。在这里,该系统由一个神经网络启动,该网络对围棋游戏或规则一无所知。然后,它通过将这种神经网络与强大的搜索算法相结合,与自己进行博弈。在重复的游戏过程中,神经网络被调整和更新,以预测移动,以及游戏的最终赢家。这个更新的神经网络然后与搜索算法重新组合,创建一个新的、更强的 AlphaGo Zero 版本,这个过程再次开始。在每一次迭代中,系统的性能都有少量的提高,并且自玩游戏的质量也提高了。

图来源: AlphaGo Zero:从零开始

在石油和天然气行业的应用

荷兰皇家壳牌公司一直在勘探和钻井工作中部署强化学习,以降低天然气开采的高成本,并改善整个供应链中的多个步骤。根据历史钻井数据训练的 DL 算法,以及基于物理学的高级模拟,用于在气体钻井穿过地下时对其进行导向。DRL 技术还利用来自钻头的机械数据——压力和钻头温度——以及地下相关的地震勘测数据。点击此处阅读更多内容:

令人难以置信的方式壳牌利用人工智能帮助石油天然气巨头 转型。

自动驾驶

虽然还不是主流,但 DRL 在应用于自动驾驶汽车的各种具有挑战性的问题领域方面存在巨大的潜力。

  • 车辆控制
  • 匝道合并
  • 个人驾驶风格感知
  • 安全超车的多目标 RL

本文将概念解释清楚: 探索深度强化学习在现实世界自动驾驶系统中的应用。

关于深度强化学习,您需要了解的主要内容

强化学习是真正可扩展的、人类兼容的人工智能系统的最有希望的候选者,也是朝着人工智能(AGI)的最终进步的最有希望的候选者。然而,对于几乎所有的实际问题,由于爆炸式的计算复杂性,传统的 RL 算法极难扩展和应用。

深度学习近年来改变了人工智能领域,可以以系统有效的方式应用于 RL 领域,以部分解决这一挑战。这种方法产生了像 AlphaGo 这样的智能代理,它们可以完全从零开始学习游戏规则(因此,通过推广,学习关于外部世界的规则),而无需明确的训练和基于规则的编程。

因此,DRL 的未来和希望是光明的。在这篇文章中,我们谈到了 RL 和 DRL 的基础知识,让读者对这个强大的人工智能子领域有所了解。

关于 dplyr 1.0.0,您需要了解的七件重要事情

原文:https://towardsdatascience.com/what-you-need-to-know-about-the-new-dplyr-1-0-0-7eaaaf6d78ac?source=collection_archive---------9-----------------------

这次更新有很多你应该知道的非常强大的新特性

用 R 编码的都知道dplyr。它实际上是 R 的定义包,旨在让那些相信“整洁数据”原则的人(我怀疑是大多数数据科学家)对数据帧的操作更加直观。事实上,很多人用dplyr编码比用 R base 编码更好。这就是为什么dplyr在 R 生态系统中变得如此重要,连同其他目前组成tidyverse的包。

所以新版本的发布对于大多数 R 用户来说是令人兴奋的。事实上,它的版本 1.0.0 意味着它是一个真实的事件。Hadley Wickham 和 T4 背后的开源开发者团队不会轻易给出这个版本号。通过使其更强大,通过将许多以前不同的功能统一在一个更抽象的保护伞下,最重要的是试图为用户提供更多日常解决他们最常见的数据框架争论问题的解决方案,大量的努力被投入到超能力dplyr的功能中。

dplyr 1.0.0现在可以使用install.packages("dplyr")进行安装。您可能需要更新您的 R 版本,以确保安装此更新。我无论如何都推荐升级到 R 4.0.0。

在这篇文章中,我将按照我所认为的复杂性递增的顺序来介绍主要的新特性。我将使用内置的数据集——主要是mtcars——来演示我的意思。

1.内置于 tidyselect

您现在可以在某些dplyr动词中使用tidyselect辅助函数。例如:

library(dplyr)mtcars %>% 
  select(starts_with("c")) %>% 
  head(3)

mtcars %>% 
  select(any_of(c("mpg", "cyl", "trash"))) %>% 
  head(3)

tidyselect像这样的帮助函数可以在任何选择函数中工作,包括一些我们稍后会看到的新函数。你可以在这里找到tidyselect功能的全部内容。

2.简单但非常有用 relocate()函数

人们通常希望数据帧中的列有一个特定的顺序,而以前唯一的方法是在一个select()动词中对列进行排序,如果涉及到很多列,这就很繁琐了。

默认情况下,relocate 会将您的一列或多列移动到数据框的左侧。如果你想把它们移动到一个特定的地方,你可以使用.before或者.after参数。例如:

mtcars %>% 
  dplyr::relocate(disp) %>% 
  head(3)

mtcars %>% 
  relocate(starts_with("c"), .after = disp)  %>% 
  head(3)

3.summarise()函数极其强大的扩展

总结——dplyr的原始工具——在这个新版本中变得更加灵活。首先,它现在可以返回向量以在输出中形成多行。其次,它可以返回数据帧以在输出中形成多行和多列。对于一些人来说,这可能有点令人费解,所以我将在这里花一点时间来说明这是如何工作的。

如果你想总结出一个能产生矢量输出的函数,这很容易。例如,你可以简单概括一个系列:

mtcars %>% 
  group_by(cyl) %>% 
  summarise(range = range(mpg))

如果您愿意,您可以与tidyr::pivot_wider()结合:

library(tidyr)mtcars %>% 
  group_by(cyl) %>% 
  summarise(range = range(mpg)) %>% 
  mutate(name = rep(c("min", "max"), length(unique(cyl)))) %>% 
  pivot_wider(names_from = name, values_from = range)

这相当于:

mtcars %>% 
  group_by(cyl) %>% 
  summarise(min = min(mpg), max = max(mpg))

在这种情况下,第二个选项要简单得多,但是这在输出较长的情况下会很有用。这里有一个计算十分位数的简单方法:

decile <- seq(0, 1, 0.1)mtcars %>% 
  group_by(cyl) %>% 
  summarise(deciles = quantile(mpg, decile)) %>% 
  mutate(name = rep(paste0("dec_", decile), length(unique(cyl)))) %>% 
  pivot_wider(names_from = name, values_from = deciles)

现在你总结输出可以是一个数据框架。让我们看一个简单的例子。最近我写了一个函数,可以识别一个向量中所有唯一的无序元素对。现在我想应用它来绘制出朋友的角色之间的联系网络,基于出现在同一个场景中。

这是我可能正在使用的数据框架的一个简单版本:

friends_episode <- data.frame(
  scene = c(1, 1, 1, 2, 2, 2),
  character = c("Joey", "Phoebe", "Chandler", "Joey", "Chandler", "Janice")
)friends_episode

现在,我将编写我的函数,该函数接受一个矢量并产生一个两列数据帧,并按场景应用它:

unique_pairs <- function(char_vector = NULL) { vector <- as.character(unique(char_vector)) df <- data.frame(from = character(), to = character(), stringsAsFactors = FALSE) if (length(vector) > 1) {
    for (i in 1:(length(vector) - 1)) {
      from <- rep(vector[i], length(vector) - i) 
      to <- vector[(i + 1): length(vector)] df <- df %>% 
        dplyr::bind_rows(
          data.frame(from = from, to = to, stringsAsFactors = FALSE) 
        )
    }
  } df} friends_episode %>% 
  group_by(scene) %>% 
  summarise(unique_pairs(character))

正如您可能看到的,dataframe 是我的summarise()函数的输出,它已经被解包并在最终输出中形成了两列。如果我们命名我们的summarise()函数的输出会发生什么?

friends_pairs <- friends_episode %>% 
  group_by(scene) %>% 
  summarise(pairs = unique_pairs(character))friends_pairs

所以这是一个重要的警戒。如果您希望您的summarise()输出解包,不要命名它。

4.与 cross 的更强大的 colwise 争论()

有了这些更强大的汇总功能,再加上内置的tidyselect工具包,我们就有了更强大、更抽象的功能来处理我们的数据列,并形成更广泛的任务。新副词across()的引入实现了这一点。

简而言之,新函数across()在现有的dplyr动词(如summarise()mutate())中跨多个列和多个函数进行操作。这使得极其强大且省时。现在不再需要作用域变量,如summarise_at()mutate_if()等。

首先,您可以通过手动定义一组列来复制summarise_at(),使用列名的字符向量进行总结,或者使用列号:

library(dplyr)mtcars %>% 
  group_by(cyl) %>% 
  summarise(across(c("mpg", "hp"), mean))

across()是一个选择函数,因此您可以在其中使用tidyselect语法。您可以通过使用一个函数选择您的列来复制mutate_if()。这里我们将dplyr::storms数据集中的namestatus列从字符转换为因子。

storms %>% 
  dplyr::mutate(across(is.character, as.factor)) %>% 
  dplyr::select(name, status)

还可以通过使用列表将多个命名函数应用于多个列。默认情况下,across()函数会用下划线将函数名和列名粘在一起:

mtcars %>% 
  group_by(cyl) %>% 
  summarise(across(c("mpg", "hp"), list(mean = mean, median = median, sd = sd)))

如果您想使用不同的粘合公式,可以使用粘合语法:

mtcars %>% 
  group_by(cyl) %>% 
  summarise(across(starts_with("d"), 
                   list(mean = mean, sd = sd), 
                   .names = "{col}_{fn}_summ"))

如果需要在函数中添加可选参数,可以使用公式:

mtcars %>% 
  group_by(cyl) %>% 
  summarise(across(c("mpg", "hp"), 
                   list(mean = ~mean(.x, na.rm = T), 
                        median = ~median(.x, na.rm = T), 
                        sd = ~sd(.x, na.rm = T)), 
                   .names = "{col}_{fn}_summ"))

同样,您可以使用公式来组合函数,以避免不必要的额外变异:

mtcars %>% 
  group_by(cyl) %>% 
  summarise(across(mpg, 
                   list(minus_sd = ~(mean(.x) - sd(.x)), 
                        mean = mean, 
                        plus_sd = ~(mean(.x) + sd(.x)))
                   ))

5.rowwise()在新的 dplyr 中变得生动起来

dplyr以前对跨行工作的友好程度有限。以前,当您想要对同一行中的值求和或求平均值时,它的行为有些违背直觉。这里有一个例子,你们中的一些人可能会认为这是以前头痛的根源:

WorldPhones_df <- WorldPhones %>% 
  as.data.frame() # mutate an average columnWorldPhones_df %>% 
  dplyr::mutate(avg = mean(N.Amer:Mid.Amer))

这返回了数据帧中每一列的平均值,这当然不是我们想要的。

以前,解决这个问题的唯一方法是使用手动计算,并避免以这种方式使用函数,所以你会写(N.Amer + Europe + Asia + S.Amer + Oceania + Africa + Mid.Amer)/7,这是相当乏味的。

rowwise()创建了一个名为rowwise_df的不同结构,它准备你的数据来执行跨行操作——它基本上按行对你的数据进行分组。

新的c_across()副词赋予了rowwise()强大的功能,允许您以类似于使用across()副词的方式工作。现在你可以写:

WorldPhones_df %>% 
  rowwise() %>% 
  dplyr::mutate(avg = mean(c_across(N.Amer:Mid.Amer)))

6.在数据框架中运行不同的模型

新的rowwise_df对象设计用于列表列,它允许在数据帧的列中存储任何类型的数据。我发现这个特别有价值的地方是,你想根据某些变量的值对你的数据子集运行不同的模型。这里有一个例子,说明如何将不同的mtcars子集存储在一个行方式的数据帧中,然后在它们上面运行一个模型。

model_coefs <- function(formula, data) {
  coefs <- lm(formula, data)$coefficients
  data.frame(coef = names(coefs), value = coefs)
}mtcars %>% 
  dplyr::group_by(cyl) %>% 
  tidyr::nest() %>% 
  dplyr::rowwise() %>% 
  dplyr::summarise(model_coefs(mpg ~ wt + disp + hp, data = data)) %>% 
  tidyr::pivot_wider(names_from = coef, values_from = value)

7.nest_by()功能

当然,dplyr 1.0.0背后的开发人员注意到了这种行方式建模能力的强大,因此创建了nest_by()函数作为上面代码的快捷方式。nest_by(x)相当于:

dplyr::group_by(x) %>% 
  tidyr::nest() %>% 
  dplyr::rowwise()

因此,现在您可以使用以下方法进行上述建模:

mtcars %>% 
  nest_by(cyl) %>% 
  dplyr::summarise(model_coefs(mpg ~ wt + disp + hp, data = data)) %>% 
  tidyr::pivot_wider(names_from = coef, values_from = value)

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn Twitter上找我。也可以看看我在drkeithmcnulty.com的博客。

所见即所得!

原文:https://towardsdatascience.com/what-you-see-is-what-you-get-973a933d60ff?source=collection_archive---------69-----------------------

图一,来源

在计算语言学和自然语言处理中,将代词解析到给定句子中的特定主语/宾语一直是一个开放式的研究课题。它需要从各种信息源和上下文知识中进行复杂的推理。

为了解决这个问题,本文——“所见即所得:对话中的视觉代词指代消解**“**定义了对话中视觉感知代词指代消解(PCR)的任务。它描绘了' VisCoref '和' VisPro '(分别是模型和数据集),以研究如何利用视觉信息使用深度学习来解析代词。

本文解决了代词指代的问题,特别是在对话中。先前的工作已经在正式的书面文本上取得了相当高的准确率,但是在对话上却没有。原因是,与正式的文本相比,对话中需要更多关于环境和语境的信息。例如,如果两个人正在交谈,他们可能会简单地用代词“它”来指代他们眼前的一个物体,或者简单地指向这个物体。因此,本文提出了这种类型的第一个模型,以及一个数据集,使用图像和文本对话来共同引用代词。

VisPro 数据集

VisPro 数据集可以被认为是 VisDial 数据集的升级版,其中每张图片都附有一段讨论该图片的对话记录。然而, VisPro 通过为每张图片增加一个“标题”来改进这个数据集,标题可以被认为是一个图片元数据。

图 2:句子“一个带着狗的人在草地上行走”的语法解析来源:https://arxiv.org/pdf/1909.00421.pdf

该数据集还经过预处理,以避免候选名词短语的重叠。它只选择解析树中高度为两个 T21 的名词短语。举个例子,考虑下面这句话“一个打着伞的女孩走在路上。”数据集将选择“一个女孩”、“一把伞”和“道路”作为候选;而不是“打伞的女孩”和“马路”。因此,在语法(解析)树中有一个有限的高度 2 有助于**减少选项**的混乱。

执行的另一个重要的预处理任务是只保留那些具有 4 到 10 个代词的对话。这有助于解决代词爆炸的问题(导致代词重复)和代词太少的问题(这对任务没有什么用处)。

VisCoref 模型

3:模型流程图,来源:https://arxiv.org/pdf/1909.00421.pdf

模型评分函数 F(n,p)分为两部分,如下所示:

在上面的等式中,Fc**Fp分别是上下文评分函数和视觉评分函数,控制视觉信息的重要性。为了在视觉和上下文信息之间取得良好的平衡,λvis被设置为 0.4

现在,让我们试着理解什么是情境评分和视觉评分,以及它是如何执行的。

上下文评分

***该模型首先通过“提及表示模块”将所有上下文信息编码到所有候选代词和目标代词中,该模块在图 3 中由虚线框表示。双向 LSTM 用于执行这种编码并创建加权嵌入。***

***图 3 所示的嵌入' ***en*** '和' ***ep*** '通过双向 LSTM 和区间内注意机制来计算。一旦这些单独的单词嵌入被连接,然后计算上下文评分函数'***Fc****'*。***

视觉评分

对象检测模块用于从图像中识别对象标签,例如“人”、“猫”或“窗户”使用在上下文嵌入模块中执行的相同编码过程,将这些识别的标签转换成矢量表示。

对照候选文本短语检查这些对象标签,无论文本短语是否引用它们。这是通过计算对应于图像中每个检测到的对象的短语的可能性来完成的。通过将分数传递给 softmax 函数,这种可能性被转换为概率。然后,具有最高 softmax 分数的标签被分配给相应的文本短语。****

现在,让我们说两个短语 p1p2 指的是同一个被检测对象。那么, p1p2 对应的 softmax 分值应该是一样大的。

因此,所有相应的标签被分配一个单独的分数,该分数然后被组合以创建整体视觉评分函数''**

然后通过计算' Fc ' 和'Fv'的加权平均值来计算总分。

实施细节

对于初始单词表示,作者使用了 300 维手套嵌入(Pennington 等人,2014 年)和 ELMo (Peters 等人,2018 年)嵌入的串联。用零向量初始化词汇表外的单词。来自 TensorFlow 的“SSD RESNET 50 fpn coco”模型已经用于对象检测。用于上下文评分和视觉评分的前馈网络分别具有两个 150 维的隐藏层和一个 100 维的隐藏层。对于模型训练,交叉熵损失函数和亚当**(金玛和巴,2015)优化器已用于实现更快的收敛。**

在进行训练时,作者将数据集分为两类——讨论过的和未讨论过的**。它们之间的区别在于,前一种情况下,代词的正确先行词出现在对话文本中;而在后者,他们没有。**

模型评估:

本文将 VisCoref 的性能与其他五种基准模型进行了比较:

1.确定性模型(Raghunathan 等人,2010 年)

2.统计模型(克拉克和曼宁,2015 年)

3.Deep-RL 模型(克拉克和曼宁,2016 年)

4.端到端模型(Lee 等人,2018 年)

5.端到端+可视化(何等,2016)

VisCoref 以显著优势胜过所有这些模型,表明视觉信息确实非常有利。

**图 4:模型评估度量以及与其他基线模型的比较。来源:https://arxiv.org/pdf/1909.00421.pdf**

从结果表中可以明显看出,VisCoref 模型的 F1 得分高于所有之前发布的基线模型。

案例研究

**图 5:来自 VisPro 数据集的随机示例。来源:https://arxiv.org/pdf/1909.00421.pdf**

这是一项在 VisPro 数据集的样本上,与端到端模型(Lee 等人,2018 年)相比,VisCoref 模型表现如何的研究。

问:“在上有任何文字或数字吗?”

给定代词' it ',端到端模型(Lee et al .,2018)从对话中挑选'任何文字',而 VisCoref 模型从候选短语中选择'一辆蓝、白、红相间的火车'。没有图像,即使是人也无法区分这两个候选短语。然而,当考虑图像时,我们立即观察图像中的火车,并因此报告“蓝色、白色和红色火车”为正确的候选短语。

因此,这项研究重申了视觉信息在对话中对人类和机器的重要性!

相关著作

用于共指消解的多遍筛选(Raghunathan 等人,2010)

许多现有的共指消解模型使用对一组特征的单个函数来确定两个提及是否是共指的,这导致了不正确的决策,因为较低精度的特征支配了较少数量的高精度特征。本文提出了一个基于筛子的简单共指架构,该架构从最高精度到最低精度一次应用一层确定性共指模型,即一个基于规则的系统,该系统聚合了多个函数,用于基于手工特征确定两个提及是否是共指的。然而,这种技术并未应用于调查报告中,因为较低的相互参照精度已被视觉信息(即图像)所抵消。

【以实体为中心的共指消解与模型堆叠(Clark and Manning,2015)

本文使用实体级信息来训练一个以实体为中心的共指系统,用于学习建立共指链的策略。它使用凝聚聚类,即每个提及对从它自己的聚类开始,然后这些聚类可能会被合并。因此,该模型在提及聚类之间学习人类设计的实体级特征,以产生准确的共指链。同样,本文不使用图像来指代代词,它仅依赖于书面正式文本。

提及排序共指模型的深度强化学习(Clark and Manning,2016)

在这篇论文中,作者应用强化学习来优化一个用于相互参照的神经提及排序模型。这个提及排名模型为给定的对产生一个指示兼容性的分数。对于每一次提及,该模型提取各种单词,如前一个单词,或其句子中的所有单词,并创建嵌入;其然后被馈送到具有几个隐藏层的 ReLU 单元的前馈神经网络,这些隐藏层与前面的层完全连接。本文尝试的共指方法是通过超参数调整这个神经网络。为了调整超参数,它使用强化学习来确定输入到模型的最佳参数选择。与基于图像的相互参照相比,这是一种完全不同风格的相互参照方法。

由粗到精推理的高阶共指消解(Lee et al .,2018)

本文介绍了一种用于共指消解的高阶推理的完全可微近似。它使用来自跨度等级架构的先行分布作为注意机制来迭代地改进跨度表示。先前的论文对共指链接做出独立的决定,因此,容易预测局部一致但全局不一致的聚类。这是一种最先进的共指解决方法。它通过一个端到端的神经网络预测共指聚类,该网络利用预先训练的单词嵌入和上下文信息。在调查论文模型的上下文评分部分创建嵌入时,使用了类似的概念。

使用神经模块网络的视觉对话中的视觉共指消解(Kottur et al .,2018)

本文主要研究视觉共指消解,包括确定哪些词,通常是名词短语和代词,共指图像中的同一个实体/对象实例。作者通过引入两个新的模块——引用和排除——提出了一种用于视觉对话的神经模块网络架构,这两个模块在更精细的单词级别上执行显式的共指消解。“参考”有助于从图像中检索对象标签,“排除”可删除那些不参考图像中任何对象的候选标签。这是唯一一篇将图像数据和文本结合在一起的论文。因此,该模型与调查文件中的模型非常相似。除了创建编码和单词嵌入之外,本文中的内部模型体系结构与本文中的不同。

感谢您的阅读!我希望听到您的反馈!

****注:这是对以下出版物的论文综述——《所见即所得:对话中的视觉代词指代消解 》,作者为、、宋、严松、张长水,在 EMNLP 2019 上发表了一篇长论文。本博客改编自论文,所有研究工作的所有权属于上述作者。

你所看到的是你所猜测的

原文:https://towardsdatascience.com/what-you-see-is-what-you-guess-cab74d486ab9?source=collection_archive---------55-----------------------

第一次接触微软 Azure 计算机视觉

Alessandro Vallainc 在 Unsplash 上拍摄的照片

浏览微软云服务平台提供的服务菜单时,我遇到了计算机视觉(CV)。我决定玩一会儿,感受一下这项服务能提供什么。

所以我用我的 github 证书创建了一个免费账户,并在常规验证步骤后成功登陆(链接【美国 )。然后,我按照说明创建了一个 CV 实例,并获得了我的 API 键。

该服务分析用户提供的或互联网上公开的图像和视频内容。该服务在前 12 个月是免费的,上限为每月 5000 笔交易,最大速率为每分钟 20 笔,这足以进行一些测试。

从技术上讲,该服务是通过 REST web 服务交付的,这使我认为我可以很快开始测试它,我也确实这样做了。

它提供了什么

在 CV 的各种服务中,我将重点介绍图像分析。在这种情况下,CV 为您提供了以下信息:

  • 标签:从数千个标签的宇宙中,CV 列出了你图像中已识别的物体类型,比如
  • 对象:只要有可能,CV 还会提供一个由图片中的矩形所包围的对象列表。因此,如果有三辆已识别的自行车,它将给出这三辆自行车的边界框的坐标。
  • 品牌:它可以从一组数以千计的知名品牌中检测标志。
  • 类别:从预先定义的 86 个类别的固定列表中,CV 会给你的照片分配最合适的类别(例如:美食 _ 烧烤户外 _ 街道)
  • 描述:以您选择的语言对整个图像进行描述。实际上这是我感兴趣的特性,所以我将在这里停止列举。完整列表见本。

足够的文献,让我们写一些 python 代码,并把一些 Unsplash 图像扔给 CV 来开始乐趣

第一次尝试:托比亚斯·亚当在 Unsplash 拍摄的照片

简化的计算机视觉客户端

REST web 服务基本上可以在任何通用编程语言中使用。我们将在这里使用 Python 处理这条线上方的图像。看看吧,看看评论:

import requests
import json

# connection details
# Replace this silly pun with your API
azure_cv_api_key = "MyAPI Heat"
# same here
azure_cv_endpoint = "somesubdomain.cognitiveservices.azure.com"
azure_cv_resource = "vision/v3.1/analyze"
language = "en"
# We just ask for some features
visual_features = "Objects,Categories,Description"
image_path = "c:/work/images/tobias-adam-Twm64rH8wdc-unsplash.jpg"

azure_cv_url = "https://{}/{}".format(azure_cv_endpoint,
                                      azure_cv_resource)
headers = {'Ocp-Apim-Subscription-Key': azure_cv_api_key,
           'Content-Type': 'application/octet-stream'}

params = {"visualFeatures": visual_features, "language": language}

# We need to read the image as a byte stream
image_data = open(image_path, "rb").read()

response = requests.post(azure_cv_url, params=params, data=image_data, headers=headers)

# assume you get a 200 status (ok)
content = json.loads(response.content.decode(response.encoding))

# This is where the picture description can be found
print("Description\n{}".format(content["description"]["captions"][0]["text"]))# Which objects have you found?
for o in content["objects"]:
    print("Object {} Parent {} Grandparent {}".format(o["object"], o["parent"]["object"]), o["parent"]["parent"]["object"])

我们运行它并得到:

描述
一只小象走在它妈妈的旁边
对象非洲象母象祖父母哺乳动物
对象非洲象母象祖父母哺乳动物

哇——我知道,更大的大象可能是父亲或阿姨,但听起来真的很好。

改变语言

在语言分配中,我们用“es”代替“en”。我期待的是将英语原文直接翻译成西班牙语,但这是我们得到的结果(省略了对象):

描述
火车上的一个小孩

哪个不是的直译——如果你不相信我,谷歌翻译一下。这是为什么呢?我不知道,我的猜测是模型在不同的语言中被不同地训练,否则我不知道为什么会发生这种情况。

顺便说一句,Unsplash 中由人类创作的标题是这样的:

两只灰色的大象走在灰色的天空下

又一次尝试

第二次尝试:照片由 Quino Al 在 Unsplash 上拍摄

我替换image_path如下

image_path = "c:/work/images/quino-al-iRt9yOWzfOk-unsplash.jpg"

得到这个结果

描述
穿衣服的人
对象人
对象人
对象人

该人未被识别为跑步者或运动员。为什么?也许她的腿不在画面上并没有帮助。用西班牙语说:

描述
一个人的馅饼

有趣的是,CV 已经认出了照片中的第三个人,即使照片很模糊,而且只有不到三分之一的身体是可见的。

光学字符识别

CV 中提供的另一个服务是从提供的图像中提取文本。要调用服务,请替换资源:

azure_cv_resource = "vision/v3.1/ocr"

参数是:

params = {'language': 'unk', 'detectOrientation': 'true'}

在生成的字典(content)中,您会发现一个名为regions的列表,其中包含 CV 找到的所有填充文本框。我已经用几张图片试过了,结果好坏参半。不要用超 bif 图片尝试,有大小限制。

结论

计算机视觉和图像识别的进步是惊人的。虽然图像分析还没有达到完美,但 CV 等服务的潜在应用是巨大的。

CV 提供了更多的可能性,例如使用定制模型(称为定制视觉的独立服务)或分析视频。

该服务主要是将这一功能集成到第三方开发应用程序中。写这篇文章是为了鼓励你使用这个服务,并想象这个额外的功能可能带来的新的应用。

你应该在数据科学家简历上写些什么(尤其是在疫情时代)

原文:https://towardsdatascience.com/what-you-should-have-on-your-data-scientist-resume-especially-in-the-pandemic-time-2bf15fbf8051?source=collection_archive---------17-----------------------

在申请数据科学家职位之前,先了解自己的简历

若昂·费罗在 Unsplash 上拍摄的照片

求职压力已经够大了。申请一份数据科学家的工作更加痛苦,因为与通常的工作申请相比,有更多的事情要准备。在我的时间里,我看过许多数据科学家的简历,知道我想在有抱负的数据科学家身上寻找什么。此外,疫情带来了特殊需求。

至少,当你在疫情寻找数据科学家的工作时,我知道你的简历中应该有什么,因为我在疫情期间设法找到了新的工作(尽管我已经有一些经验)。

尽管如此,我还是想分享一下你应该在简历中哪些东西来申请数据科学家的职位。请注意,根据你申请数据科学家职位的地点,你应该定制简历以满足工作申请

标题和描述

页面顶部是你简历中最重要的部分。不仅仅是数据科学家,任何简历都是如此。

我认识的许多人力资源部门的人都说,在面试过程中选择候选人时,他们只需看一眼候选人的简历,并在瞬间决定哪份简历值得花时间深入查看。

那么,什么样的标题和描述才是吸引眼球的呢?我会给你一个我自己的简历的例子,以及我在简历中寻找的那种。

作者创建的图像

以上是我在数据科学工作申请中使用的标题和描述示例。让我们一个一个的分解。

标题配置文件

作者创造的形象

页面的顶部应该是你的简短简介,并最大限度地利用空间给出简洁的信息。我们这里需要的信息是您的姓名和联系电话/电子邮件(如果您愿意,包括 LinkedIn)。这里不要添加太多不必要的信息。您毕竟需要空间,并且可以在描述页面上放置附加信息。

专业描述

作者创造的形象

这是你简历中最重要的部分,你的简短描述决定了你的简历是否值得再看一眼。

那么我应该在我的简短描述中写些什么呢?对于一个有经验的数据科学家来说,写下他们是数据科学家以及他们成为具有专业知识的数据科学家有多长时间是很容易的。

对于大一新生/非数据科学家专业人士来说呢?在这种情况下,我们需要写出能够吸引雇主的描述。那么是什么吸引员工呢?对于数据科学家职位,这将是我们的数据科学相关技能。

希望能写出这样的东西,

"{你的专业}{你申请的业务} 和数据科学有热情的应届毕业生。我在分析数据和实现机器学习方面经验丰富用**{编程语言}** 在**{你以前的项目/实习/论文/课程作业/在线课程/依赖项目}** 用**{一些你觉得有见地的结果}** ”****

在上面的例子中,我们在描述中需要关注的是:

  1. 你对他们生意的兴趣
  2. 必要的数据科学技能(机器学习、编程、统计等。
  3. 您与数据科学相关的最重要的经历

应届毕业生和无经验人士的描述至少需要展示你作为数据科学家的兴趣和潜力。尽管如此,在这段疫情时间里,你还需要增加一点额外的内容

4.你的适应能力和快速工作能力,表现出沟通技巧

为什么这是加分项?数据科学家是一个团队,许多项目需要展示并与其他人很好地沟通。

在疫情时间,随着社会距离和在家工作的情况下,你需要依靠你的沟通技巧和快速思考,每当问题出现。这就是为什么在你的描述中展示你的适应能力、沟通能力和快速反应能力很重要。

出于你的考虑,保持描述适合公司业务。不要给每一家公司都投相同的简历。人力资源知道哪份简历是专门制作的,哪份简历会发送给很多人。

职业技能描述

作者创建的图像

我们中的许多人经常把我们的技术专业技能放在简历的底部,并列出要点。在我看来,这是错误的做法。

我们希望人力资源部门能立即知道候选人拥有哪些技能。如果你把它放在页面的底部,人力资源可能会错过它,因为他们只阅读页面的顶部。在这种情况下,我们希望将我们的技能放在简历中描述部分之后最显眼的部分。

在“技能”部分,您可以概述您在每项技能方面的能力,并展示您的数据科学组合示例。对我来说,我经常把我的项目的链接放在这个部分。

我从不建议任何人用百分比或柱状图来展示你在每项技能上的能力,因为这看起来不专业。最好说你是熟练的、有能力的、专家的,或者任何其他解释你技能的词。

经验

这一部分经常被 HR 忽略,但是当 HR 已经注意到你的简历时,他们肯定会更深入地阅读这一部分。让我们来看看应该在数据科学简历中放入什么样的经历。

工作经历

我将向您展示我举的一个有经验的数据科学家工作经历的例子。我们首先显示我们的雇佣历史,最新的雇佣记录在顶部。

你也可以为没有任何工作经历的人提供实习机会。如果你只有志愿者或组织经验,你需要把你的教育部分放在第一位。

作者创造的形象

以上是一位经验丰富的数据科学家的就业部分示例。在这一部分,我概述了对数据科学家职位非常重要的四个要点,尤其是在疫情时间。要点是:

a.我之前提到过沟通和适应性在疫情时间很重要。a 点是一个如何在工作中展示你的沟通和适应能力的例子。

b.用必要的工具和技术展示你的项目,以及你的项目如何影响公司(使用数字,有数字总是好的)。

c.数据分析决策对于数据科学家来说也是一项重要技能。证明你在你的工作经历中有。

d.展示您可以快速调整以适应当前的数据科学形势,因为该领域一直在发展。

如果你有数据科学家的经验,这就是上面的例子,但是如果你没有呢?你需要解释你在以前的工作/实习中做了什么,尽可能地接近为什么你在你申请的公司是一名很有潜力的数据科学家。

再来看看我之前的非数据科学职位

正如我之前解释的那样,我的工作经历包含了作为一名数据科学家的重要信息。它们是:

a.团队合作是每个数据科学家都需要的非技术技能,统计分析是一个数据科学家的加分项。

b.数据分析通信在此显示。

c.这里显示了通信决策

d.这里展示了适应性编程技能以及对公司的影响

如果您没有任何数据科学家经验,这就是一个例子。尽量夸大你的工作经历,因为这是你写简历的目的,但是不要在简历中撒谎。在简历中赞美你所做的事情是好的,因为你可以解释你做了什么,但是在简历中撒谎最终只会适得其反。

教育

在你的工作经历之后的下一部分应该是你的教育背景。这一部分通常简短明了,但是根据你的工作经历,你可以更多地解释你在学习期间做了什么。

作者创建的图像

以上是我教育史的一个例子。如果你把最近接受的教育放在最上面,然后从那里往回走,那是最好的。事实上,我不是计算机科学或数学/统计背景,但仍然可以获得一个数据科学家的职位。这意味着数据科学家的职位不仅仅是为计算机科学和/或数学/统计专业的人保留的。

在我的例子中,我只展示了我以前的专业和我在学习中所做的重点。请注意,我只展示了数据科学家职位的重要内容(数据分析、统计、编程)。

试着把你认为对数据科学家职位重要的事情放在你受教育的时间里。如果你认为你没有技术技能,试着把非技术技能,但仍然与该职位相关的技能。

如果你没有丰富的经验,你也可以在这里解释你的论文/项目。试着把它和数据科学家的职位联系起来。

附加信息

在你简历的底部是对数据科学家职位重要的一切。您可以在这里填写许多变量,但这是我一直在数据科学简历中寻找的变量,尤其是如果您之前没有任何工作经历。

相关经验

在这一部分,您可以将任何相关经验应用于数据科学家职位,但这不是永久/实习。可以是组织经历、活动经历、兼职工作,以及任何你认为对这个职位重要的事情。

作者创建的图像

例如,在我的相关经历部分,我将我作为一名作家的经历放在《走向数据科学》中。

永远不要轻视你以前的相关经验;我见过一些人设法找到工作,不是因为他们的工作经验或教育,而是因为他们放在简历中的与众不同的经验。

课程和认证

你可以把它放在另一部分,给那些参加在线课程或训练营的人。

作者创建的图像

您可以列出任何与数据科学家职位相关的非正式课程和认证,也可以在这里解释一下您在课程中学到了什么。

非技术技能

虽然你已经在简历的顶部展示了必要的技术技能,你也可以在这一部分包括任何非技术技能。让我们看看下面的例子。

作者创建的图像

对于数据科学家职位来说,技术技能可能已经不言自明了,但对于非技术技能来说就不同了。当你说你有非技术技能的时候更好;你解释为什么你有那种技能。

很多方法来解释它;你可以把它和你的工作经历、教育甚至证书联系起来。在疫情时间里展示这种非技术性技能很重要,因为这是一个巨大的加分点。

结论

许多公司都在寻找有经验的数据科学家,但如果你是新人,不要害怕申请这个职位。有时候,公司本身需要一个他们可以塑造的应届毕业生。

重要的是,你要定制自己的数据科学家简历,以满足工作申请,但在疫情时间里,你需要付出额外的努力来展示你的潜力。

除了必要的技术技能(机器学习、编程语言、数据分析、统计),尽量展示非技术技能(沟通、团队合作、适应性、快速思考)。

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。

如果您没有订阅为中等会员,请考虑通过我的推荐订阅。

关于集成学习你应该知道什么

原文:https://towardsdatascience.com/what-you-should-know-about-ensemble-learning-e92d4b3c3608?source=collection_archive---------45-----------------------

大众对机器的智慧

马库斯·斯皮斯克在 Unsplash 上的照片

简介:

你想和你的朋友组织一个电影之夜,你正在寻找一部完美的电影,你在网飞上搜索,你偶然发现了一部引起你注意的电影。要决定这部电影是否值得看,你有多种选择。

方案一:去问已经看过电影的哥哥。

选项 B:去 IMDB 检查评级和阅读多个希望剧透免费评论。

很明显你会选择 B,因为如果你从你哥哥那里得到多种观点而不是单一观点,那么得到有偏见的观点的风险会更小。这是集合方法背后的想法和动机。这是群众的智慧!现在让我们深入到集成学习的一个更技术性的定义。

照片由阿里安·达尔维什在 Unsplash 上拍摄

什么是集成学习:

根据 scholarpedia:

集成学习是一个过程,通过该过程,多个模型(如分类器或专家)被战略性地生成和组合,以解决特定的计算智能问题。

这意味着采取生成多个模型和聪明地采纳它们的意见的方式,以获得可能的最佳预测。理论上,集合模型总是比单一模型更好。为了有效地工作,构建集合的个体模型应该是不同的,如果所有的个体观点都相同,那么接受集体观点是没有意义的。我们可以通过使用不同的算法,改变超参数,或在数据集的不同部分训练它们来区分我们的模型。

我们如何合奏学习(技巧):

装袋:

代表“ bootstrap aggregating”,这是理解起来最简单、最直观的技术之一。在 bagging 中,我们将在数据的不同子集上训练时使用相同的算法。为了得到这些子集,我们使用了一种叫做 的技术:引导:

基本自举插图,作者图片

如你所见,苹果重复了两次。在实践中,我们通常为自举数据集选择较小的大小。在创建一些自举数据集后,我们将在每个数据集上建立一个模型,然后将它们组合成一个集合模型,这被称为聚合。对于分类问题,投票最多的类别是预测,对于回归问题,我们对模型的输出进行平均。

增压:

虽然 bagging 可以并行完成(只需同时训练所有模型),但 boosting 是一个迭代过程。像 bagging 一样,我们将使用相同的算法,但我们不会同时引导数据和训练所有模型。提升是连续的,这意味着一个接一个地训练模型,前一个模型的性能将影响我们如何为下一个模型选择训练数据集,更准确地说,每个新模型将尝试纠正其前任犯下的错误

boosting 的基本工作原理,按作者排序的图像

实现 boosting 的流行算法有 AdaBoost梯度 Boosting。

堆叠:

这个很简单,我们将使用不同的算法,只是结合他们的预测。

堆叠的基本工作原理,按作者排列的图像

你为什么要合奏学习?

由于直觉和实践证实,集合方法产生更准确的结果,并且当明智地使用时,对过度拟合更有弹性,因此,它们被广泛用于 Kaggle 比赛。一个缺点是他们需要更多的时间来训练。

摘要

集成学习正在将多个弱模型转变为一个强模型“在一起我们更强”。已经开发了多种技术来实现这一点,例如装袋、助推和堆叠。一个集合模型总是比一个单一的模型更准确,并且能更好地概括。

我希望你已经对集合模型有了一个基本的概念。现在是时候将它应用到你的项目中了!

感谢阅读!❤

关注我,了解更多信息丰富的数据科学内容。

作为一名数据科学家,一年后你会学到什么

原文:https://towardsdatascience.com/what-youll-learn-in-1-year-as-a-data-scientist-b69061639653?source=collection_archive---------17-----------------------

蒂姆·范德奎普在 Unsplash 上拍摄的照片

区分经验丰富的数据科学家和数据科学爱好者的因素

大约一年前,经过几个学术研究项目和许多数据科学课程的工作,我终于在一家快速发展的电子商务公司获得了一个应用数据科学的职位。我将尝试分享我在工作中学到的、在家的数据科学爱好者事先不太了解的东西。

1.在远程服务器上工作

大多数人在他们的计算机上开始他们的数据科学之旅。然而,在实际的数据科学项目中,所需的计算能力和内存远远超过笔记本电脑所能提供的。因此,数据科学家使用他们的计算机访问远程服务器,通常使用 SSH(安全外壳)连接。ssh 允许用户使用私钥(SSH 密钥)安全地访问另一台计算机。一旦建立了连接,就可以像使用计算机外壳一样使用远程服务器。说到 shell,知道基本的 shell 命令有助于过渡到在远程服务器上工作。

照片由克里斯蒂娜@ wocintechchat.com在 Unsplash 上拍摄

2.SQL 是王道

数据科学和机器学习是在 Python,Julia 和 R 上完成的吧?错了,是在 SQL 上做的!每个数据科学项目都是从数据开始的,大多数情况下,用于解决问题的数据并不容易获得,应该使用数据库的几个表中的部分数据来创建数据。

SQL 是事实上的标准数据库语言,用于快速连接、聚集和选择所需数据的部分。每个与数据相关的职位都需要熟练使用 SQL,因为它每天都被大量使用。大多数人忽视提高他们的 SQL 知识,如果不是完全忽视学习它的话。很自然,大多数爱好者没有数据库服务器,他们的数据集已经被别人建立了。实际上,数据科学家 90%的时间都花在准备和清理训练数据上。我知道这有点令人失望,但是如果没有数据,就没有数据科学。

应该注意的是,SQL 有许多方言,但是它们彼此相似,不同之处可以很容易地适应。只需选择一种方言并开始学习它!

3.功能比模型更重要

线性模型通常被视为简单,不适用于机器学习问题。我的意思是,你能在多大程度上线性增加你的功能并得到正确的结果?其实可以大有作为。

更复杂的模型,如随机森林、xgboost、SVM、DNNs 等。在特征空间(解释变量所在的空间)中寻找非线性边界。他们通过将特征空间划分为更小的部分或将特征映射到更高维的特征空间,然后在这个新空间中绘制线性线来实现这一点。最后(经过极大的简化),它们都可以被认为是通过新生成的数据点拟合一条直线。由于模型不知道特征的内在含义,它们试图基于某种核或通过优化伪似然函数来创建这种新特征。

http://songcy.net/posts/story-of-basis-and-kernel-part-2 使用核技巧进行高维映射,来源:

这看起来很复杂,对吗?这就是为什么它们被称为灰/黑盒模型。另一方面,知道特征真正含义的人可以从数据中生成新的有意义的特征。这个特征生成、转换、预处理和选择步骤被称为特征工程。基本的特征工程方法包括采用特征的均值-标准差、将连续变量离散化到箱中、添加滞后/差异特征等。

经过适当的特征工程,任何模型都可以获得很好的结果。线性模型因其可解释性而更受青睐。您可以查看所生成要素的显著性和系数,并对模型的有效性做出评论。如果一个系数在逻辑上应该是正的,结果却是负的,那么模型、数据或假设可能有问题。为什么这么重要?因为有一个基本规则,垃圾进垃圾出。

4.实验和生产的区别

大部分数据科学都是在 Jupyter 笔记本上完成的,因为它易于实验和可视化。很容易快速尝试新的东西,训练新的模型或在笔记本上看到一些表达的结果,只需打开一个新的单元格,就可以随心所欲了。

然而,当模型准备好投入生产时,jupyter 笔记本时代结束,python 文件时代开始。生产(简称 prod)是你的算法在现实生活中运行的地方。最终用户(内部或外部)受生产代码的影响,因此生产级代码应该快速、干净、详细、容错且易于调试。我说的这些是什么意思?

如果您只是在尝试,并且将运行代码一次或两次,那么代码的速度就不那么重要了。然而,在生产中,您的代码可能每天运行多次,其结果将影响生产生态系统的其他移动部分。因此,执行的持续时间变得很重要。

让我们面对现实吧,你的一些(如果不是全部的话)笔记本是无序的,混乱的,有未使用的导入,有实际上不再需要的电池,对吗?没关系,你只是在试验你的想法。现在是时候清理你的代码了,这样除了你自己之外的其他人就可以真正地遵循你的代码的步骤了。如果团队中的任何人都能轻松地查看您的代码并理解每一行的目的,那么您的代码就会变得足够干净。这就是为什么你应该给你的变量和函数起一个有意义的名字,不要用忍者编码。

您应该将代码执行的重要步骤记录到 shell 屏幕以及一个日志文件中。控制台日志记录有助于直观地看到在 shell 上运行代码时所采取的步骤,让您随时了解执行情况。另一方面,日志文件有助于识别运行代码时可能遇到的问题。一个好的日志文件应该包括开始和结束时间、结果摘要、遇到的异常和每次执行的问题。

当产品代码由于任何原因开始失败,用户开始看到奇怪的结果时,这是一个令人紧张的事件。好的产品代码应该能够处理可能的异常,并事先做好必要的断言,如果出现意外/无法解决的问题,应该提醒团队。根据具体情况,失败的代码可以被编程为给出前一次运行的结果,不给出任何输出或提供预定义的结果。在出现问题时,花时间舒适地编写容错代码通常比压力编码要好。

即使代码是容错的,代码内部也可能存在一个 bug,从而产生意想不到的结果。在这种情况下,应该调试代码,通常使用调试工具,找到原因。干净的编码使调试更容易,但是这还不够。程序员应该使用函数而不是重复代码,给每个函数一个单一的目的,避免使用不纯的函数。这种做法使得在代码中定位 bug 的来源变得容易。

对于编写产品级代码,我建议使用文本编辑器,如 VS Code ,而不是使用 jupyter notebook。软件开发工具使开发更加容易和快速。如果你仍然想使用 jupyter notebook,有一个名为 nbconvert 的工具可以从 jupyter notebook 创建 python 文件。

5.最有价值球员

技术世界竞争激烈,瞬息万变。很多时候,没有时间去等待一个达到最先进性能的完美产品。科技公司不是以完美的产品为目标,而是从一个项目开始,快速构建一个 MVP (最小可行产品)并迭代。MVP 需要满足项目最基本的需求,不需要任何花哨的东西,仅此而已。

对于完美主义者或注重细节的人(即大多数数据科学爱好者)来说,通常很难进行 MVP。大多数数据科学家努力仔细分析数据,尝试许多不同的功能和模型,并提出最佳模型。数据科学,作为一个领域,本质上是面向研究的,然而,我没有指定应用数据科学。

当我第一次开始的时候,这种哲学困扰着我,但是不要担心,这样实际上更好。最重要的资产是时间。一个项目将走的道路无法预先知道,因此投资在项目上的时间不能保证是有价值的。根据用户反馈和 A/B 测试,您正在进行的项目可以暂停或完全取消。通过构建一个 MVP 而不是一个成熟的项目,风险被最小化。即使项目被保证留下,大多数时候足够的数据是不可用的,或者未来可能的复杂情况是未知的。构建一个简单的模型,并用新生成的数据和获得的专业知识对其进行迭代,可以得到更快、更可靠的结果。

6.敏捷开发

在团队工作中,科技界的另一个概念是敏捷开发。敏捷是一种开发哲学,在这种哲学中,项目被划分为小任务,团队成员从积压的任务中获取新任务。在 sprint 规划期间,团队会给每项任务一个估计分数,然后团队会计算 sprint 任务的总分数。其实说起来容易做起来难。敏捷是为软件工程开发的,在软件工程中,任务持续时间更容易估计,路径和实践定义得更好。另一方面,数据科学任务需要反复试验,并且由于高方差,任务持续时间更难估计。具有讽刺意味的是,数据科学家对其他业务问题做出了准确的预测,却不能对他们的任务做出同样的预测。

7.A/B 测试

你已经训练和调整了一个新模型,调整了它的超参数,它在每个测试指标上都给出了非常好的结果,远远超过了之前的模型。您需要立即将其部署到生产环境中,对吗?可惜没有。

敏捷和数据科学的核心是 A/B 测试。你的模型可能会在测试和模拟中击败之前的模型,但在现实生活中可能会失败。这就是为什么它被称为模拟,而不是真实的现实。训练数据只是在模型制作中高度处理的过去现实的子集。时代会变,错误会犯,模型无法解释所有的数据变化。只有在 A/B 测试期间,一个模型可以产生显著的提升时,该模型才会被以前的模型所取代。

8.与不同学科的人交流

成为一名数据科学家实际上与成为一名软件开发人员或科学家有很大的不同。通常,数据科学家与业务和技术人员密切合作,因此他们需要了解业务和技术两方面。

业务人员通常是数据科学家的内部客户,业务人员不关心模型的复杂程度或代码的优美程度,他们关心的是因果关系。这就是线性和基于树的模型发挥巨大作用的地方。白盒模型易于解释、直观且易于理解。商业人士,尤其是在开始的时候,会想知道为什么 ML 模型会做出一个决定,直到他们相信它是可行的。因为模型是为业务需求而构建的,所以它们应该为业务人员的需求而定制。

在模型的开发和生产过程中,数据科学家与开发人员密切合作。开发人员通常会收集和提供数据管道,并在生产中使用您的算法结果。技术—数据科学集成有多种方式。开发人员可能会将数据科学家的代码转化为生产级代码(使第 4 点变得过时),为数据科学家提供一个 API 来提供他们的结果,或者调用数据科学家创建的模型的 API。每种方式都有其优点和缺点,并且可能会在生命周期中反复出现。

数据科学家需要能够理解业务需求和开发人员的局限性。他们应该向开发人员传达与业务和数据科学相关的需求,并向业务人员传达技术方面的能力和限制。

结论

TLDR:在数据科学部门工作与在《孤独》中为 Kaggle 项目建立机器学习模型截然不同。我已经试图列出那些事先不太为人所知的关键区别。我希望读者会发现它很有用,因为我知道我喜欢写它。

你的员工在网上对你有什么看法?—使用 Python 进行文本挖掘

原文:https://towardsdatascience.com/what-your-employees-are-saying-online-about-you-text-mining-using-python-72fe2a9bd615?source=collection_archive---------49-----------------------

数据科学、商业智能、网络搜集

Web 抓取 Glassdoor,从员工评论中获取见解

在当今世界,几乎每个人都在使用互联网,如消费者、企业、政策制定者、政治家和各种组织,以便相互交流,它使我们有空间分享、表达和接收意见,并让企业在网上发布他们的更新,并与他们的利益相关者互动。它还允许员工在线查看和匿名反馈他们的组织,以便于他人检索信息。

因此,由于大多数来自个人的反馈都是以评论的形式发布在 Indeed 和 Glassdoor 等平台上,因此每个组织都应利用这一机会,通过文本挖掘&自然语言处理(NLP)技术关注在线讨论,这一点非常重要。虽然收集调查数据也是更好地了解员工工作生活需求的一种好方法,但并不是所有的评估都能产生有用且不带偏见的信息,在某些情况下,问卷本身也可能是公司问题的原因。

收集在线评论可以为企业提供一个好主意,了解他们的员工是否快乐,他们为什么快乐,什么可以变得更好,以及他们关心的问题。通过了解这一点,我们不仅可以评估当前公司内部政策的效率,而且组织还可以在未来制定更好的数据驱动决策。

在这个项目中,我们将调查 Glassdoor Italy 上公司员工评论的趋势,我们将取消以下组织在线发布的最后(110 - 120)条评论。

(普华永道—德勤—埃森哲)

Glassdoor 是一个现任和前任员工匿名评论公司的网站。Glassdoor 还允许用户匿名提交和查看薪水,以及在其平台上搜索和申请工作。

你说得够多了,让我们开始谈正事吧。

值得注意的是,大多数评论都是用意大利语收集的,然后被翻译成英语*。每个公司将有一个优点(优点)和缺点*(缺点)**栏,此外,每个公司将根据员工匿名条目对以下措施进行评分 (0 至 5) :

(工作/生活平衡——文化&价值观——职业机会——薪资&福利——高管)

1-普华永道

首先,我们知道普华永道的总体平均评级为 3.8/5 颗星。

在接下来的两张图中,我们展示了评分和每次评价的长度之间的关系,从中我们可以注意到,当人们给 4 星时,他们倾向于写更长的正面和负面评价。

在下面的 5 张图中,我们展示了前面提到的措施的评分。普华永道在工作/生活平衡方面的平均得分为 2.3/5,在文化和价值观方面的平均得分为 3.8/5,在职业机会方面的平均得分为 4.1/5,而在薪酬和福利方面的平均得分为 2.8/5,在高管方面的平均得分为 3.2/5。

在接下来的部分中,我们将运用自然语言处理技术来可视化员工在谈论积极的时使用的前 35 个重复和频繁的词语。

列表的顶部如下:

(环境—机遇—学习—伟大—事业)

在单词云中可视化之前的结果

然而,在这一部分,我们将探究员工在谈论负面信息时最常重复使用的 35 个词。

列表的顶部如下:

(工作—寿命—小时—余额—长)

再次用文字云表示结果。

普华永道的正面评价样本:

"A good working environment. Good opportunities to grow and learn, depending on the specific role Great name to be displayed on the curriculum" "The company was clearly focused on learning and development of employees was a young and ambitious environment and colleagues very qualified for their jobs""Ability to work for major clients"

普华永道负面评论样本:

"No recognition for activities, repetitive activities, High hierarchy of roles and tasks, Poor coaching, Excessive bureaucracy and unnecessary paperwork that make waste a lot of time. Total lack of concern for others""Poor work-life balance, salaries relatively low"'Salaries should be aligned with the rest of the network, In addition, employees who work in large cities and a high cost of living should earn more just like it happens in other countries'

2-德勤

德勤获得了 3.8/5 星的总体平均评级。

此外,我们可以注意到趋势和以前一样,当人们给 4 星时,他们倾向于写更长的正面和负面评论。

德勤在工作/生活平衡方面的平均得分为 2.3/5,在文化和价值观方面为 3.7/5,在职业机会方面为 4.1/5,而在薪酬和福利方面为 3.6/5,在高管方面为 3.4/5。

接下来,我们将会看到员工在谈论积极方面时经常重复使用的前 35 个词。

列表的顶部如下:

(成长—环境—字—好—经验—年轻)

最后但同样重要的是,我们将可视化前 35 个重复和频繁使用的单词负面

列表的顶部如下:

(工作—时间—平衡—生活—时间)

正面评论的示例:

"Good career opportunities if you want to climb the corporate ladder""multicultural learning environment rapidly competitiveness precision""Interesting, an inspiring place to start your career and learn as much as possible"

负面评论的例子:

"Too much unpaid overtime work" "Too many partners to manage, too many events. Conflicts with the marketing division" "unpaid overtime, little interest in resources, little attention to talent, excessive working hours, revaluation of the person depending on the amount of hours worked and not according to the results and capabilities"

3-埃森哲

埃森哲的总体平均评分为 3.7/5 颗星。

从接下来的数字中,我们可以注意到,当人们给 4 星时,他们倾向于写更长的正面评价,而当他们给 3 星和 4 星时,他们倾向于写更长的负面评价。

在下图中,我们像之前一样展示评级。埃森哲在工作/生活平衡方面的平均得分为 2.6/5,在文化/价值观和职业机会方面的平均得分为 3.6/5,而在薪酬/福利和高管方面的平均得分为 3.3/5

此外,我们可以看到员工在谈论积极方面时使用的前 35 个重复和频繁的词。

列表的顶部如下:

(成长—环境—机会—薪酬—福利)

然而,在这一部分,我们将探究员工在谈论负面时使用的前 35 个重复和频繁的词。

列表的顶部如下:

(工作时间——小平衡——压力)

正面评论的示例:

"dynamism and growth opportunities, wonderful environment"
"young and dynamic Environment, motivating"
"very rapid growth and learning"
"Great opportunities for growth - Competitive Salary - Core Value"

负面评论的例子:

"Spaces a bit 'tight compared to the number of employees""General Incompetence - Body rental - No respect for workers' rights - crazy hours - Extraordinary imposed and unpaid - It rewards those who make the soldier 'yes man' who works 10 hours a day rather than who is responsible - You receive orders from above - You must give orders down - They tell a lot of stupid things to customers - professional Growth nothing - Inconsistency between the presentation of the company and the reality"

结论

我们可以得出这样的结论:职业机会和工作/生活平衡是我们样本中讨论最多的正面和负面话题。数据显示,普华永道的员工认为他们的薪酬不够高,但他们对高管和职业机会的满意度更高。

此外,德勤收集的正面和负面词汇数量最多,而埃森哲收集的正面和负面词汇数量最少。

简而言之,我们设法从在线平台获得了文本数据样本,这些样本可以明确地告诉我们,并捕捉员工的需求、偏好、要求和担忧。因此,文本挖掘和自然语言处理可以成为公司内部整合的竞争优势工具,以从员工在线获得有意义的反馈和见解。与企业绩效问卷和调查一起,可以防止让组织处于最有利位置的有偏见的结果。这意味着帮助所有员工在工作中感受到价值感和满足感。当员工感到受到重视时,他们更有可能对组织保持忠诚,从而获得更好的绩效、生产率和收入。

你最喜欢的文本编辑器揭示了你的个性

原文:https://towardsdatascience.com/what-your-favorite-text-editor-reveals-about-your-personality-f3d4f71f88c2?source=collection_archive---------4-----------------------

给我看你的编辑,我会告诉你你是谁。

你怎么写就是你是谁。米卡·博斯韦尔在 Unsplash 上的照片

DD*isclaimer:*作者是一个狂热的 Vim 用户,因此这个故事可能不公正。此外,性别不明确的语言被用于显而易见的原因。这并不意味着这个故事是免费的刻板印象!

括号:雅皮士

雅皮士这个词什么时候不流行了?这是一种耻辱,因为它完全符合使用括号的人的类型:就是那个戴着角质框架眼镜、穿着粗花呢裤子、留着齐胸长、精心修剪过的胡子、痴迷于街角咖啡馆里的浓缩咖啡的孩子。

为什么?因为他们可以让任何网站看起来令人惊叹,括号是他们的首选工具。另外,出于无人理解的原因,这种布局让他们想起了他们最喜欢的胡须洗发水的包装…

WebStorm:JavaScript 世界的狂热爱好者

那种很聪明但是不怎么开口的人。那种有着无人知晓的狂野梦想的人。那种希望自己的名字出现在程序员名人堂,但对此保持沉默的人。

或者换句话说,普通的 JavaScript 开发人员。这是使用 WebStorm 的类型:与其他编辑器不同,这是为 JavaScript 量身定制的,它是为从事 JavaScript 世界的人设计的,没有其他用途。

行动要小,梦想要大。使用网络风暴。 Joe Ciciarelli 在 Unsplash 上拍摄的照片

Coda:网络开发者

仅仅是为了 OS X,结尾是为了隔壁那个总是带着闪亮的新 MacBook 到处跑,为网络创造难以捉摸的图形的人。

他们通常是城市流浪者,从不在一个地方呆上几个月以上。他们试着在农场工作,但注意到当他们试图编码时,鸡让他们发疯。

人们不禁会觉得,这个人在他们商务休闲装的背后隐藏着价值一千本书的生活经验。但他们擅长向外界隐藏自己的内心秘密,无论是线上还是线下。

记事本++:孩子

哦,那些仍然没有抛弃窗户的忠实的人们!欢迎来到这个头发凌乱,戴着厚厚的有色眼镜,穿着海军蓝毛衣的世界,这些毛衣看起来就像是从附近的旧货店买来的,在披萨面团中沐浴,然后清洗,直到它们足够干净,不会失去披萨服装。

或者,换句话说,欢迎来到 Notepad++ 的世界:一个用于 MS Windows 的轻量级工具,它承诺通过让你的计算机不那么忙来拯救环境。这是真的,Notepad++的用户关心他们的 CPU 空间就像关心环境一样!只有一件事他们更关心,那就是——你猜对了——披萨。

崇高的文本:梅西

他们不知道把哪个文件放在哪里,也不知道在代码的前 50 行他们把那个变量叫做什么。出于无人理解的原因,他们希望他们的文本编辑器处理所有的混乱。

欢迎来到崇高的文本——这个文本编辑器可以处理所有的混乱。有如此多的弹出窗口,甚至可以在修改和未保存的文件之间即时切换,这是那些认为他们的混乱不仅在他们的头脑中有效,而且在他们的项目中有效的人使用的编辑器。

如果你的桌子是这样的,用 Sublime。 Wonderlane 在 Unsplash 上拍照

Atom:合作者

典型的 Atom 用户是地球上最友好的人。总是穿着浅色毛衣,给整个办公室的人带早餐,有什么不喜欢的呢?

当需要帮助时,他们总是在那里,但他们从不要求表扬。总是自我牺牲,如果他们有所成就,他们会让别人去拿奖金。但是每个人都知道,没有他们什么都不会起作用。他们是每个团队的粘合剂,每本书的关节。欢迎普通的 Atom 用户。

Visual Studio 代码:完美主义者

他们的鞋子干干净净,头发梳理得整整齐齐,桌子上没有一点灰尘。他们并不是不友好,但他们是比别人先发现汤里头发的人。一切都需要完美;他们的生活中没有多余的垃圾。

他们的编码风格也是如此。绝不——我再说一遍,绝不!—他们会把自己的名字写在一段包含哪怕是最微小错误的代码下面吗?这是 Visual Studio 代码的用户:调试变得如此简单,你甚至不再需要编译器。每个厌恶 bug 的程序员的必备工具。

NetBeans:咖啡店

绿豆,咖啡豆,网豆。神圣三和弦!

普通 NetBeans 用户对代码和 beans 非常着迷。尤其是豆子。一天的开始离不开他们最喜欢的咖啡店里的圣咖啡豆。在那之后,他们会呆上一整天,疯狂地敲击键盘。

他们是焦虑型的。总是害怕失去。穿着略低于休闲(那些牛仔裤真的需要洗一洗),总是有点神经过敏,注意力不集中,他们真的不需要咖啡来唤醒他们。*他们需要咖啡来平静自己。*当然还有代码。

自动机

有些人是天生的工程师。做一次任务?无聊。做两次?自动化!

这是你对 TextMate 的普通用户:OS X 的一名工程师(因为这是它运行的唯一系统)。办公室角落里那个安静的人。那些似乎从不努力工作的人,他们的结果却是惊人的。在会议上话不多,但问出精彩问题的人。不怎么社交,但总能帮你解决问题的人。

唯一的缺点是?他们的工作经常不被人注意。他们可能需要几年时间才能得到认可。那是你的 TextMate 的普通用户。

IntelliJ:优化器

在你的朋友群中,总有那么一个人对每一个新的生产力黑客技术着迷。IntelliJ 的普通用户就是这样的朋友。

他们是几年前在咖啡里放黄油的人,练习最极端形式的间歇禁食,在凌晨 4 点喝蛋白奶昔的人。如果你给他们一块蛋糕,他们会欣然接受——但只能在五个小时内吃完,也就是斋戒结束后。

他们的着装风格首先是功能性的,他们的发型也是如此。品味并不差,只是没有其他服装所具有的 X 因素。

但是,尽管所有的焦点都集中在生产力上,他们并不总是产出最高的那一个…

如果你只说不做,那么 Dreamweaver 就适合你。格雷戈里·海斯在 Unsplash 上的照片

Dreamweaver:自我

他们的头发是光滑的,他们的衬衫是新熨的,他们的西装值一个月的工资。他们看起来很好,但不太好说话——因为除了他们自己,他们不知道任何其他话题。他们认为自己很聪明,但他们的技术能力稍显不足。他们认为他们在学习,但实际上他们只是在吹牛。

欢迎你的普通用户使用 Dreamweaver :完整的可视化界面,这是一个用于炫耀的编辑器。暗地里,他们不喜欢编码。他们不喜欢命令行界面的吸引力,也不了解自动化的力量。他们宁愿用那个时髦的新网站模板给同事留下深刻印象。为什么不呢?这让他们在职业生涯中走得更远。

维姆:极客中的极客

最近三年没有理发,最近五个月没有刷牙的人。那个还穿着妈妈的毛衣去上班的人。鞋子快散架了却拒绝买新鞋的人(“85%的材料还完好无损!”).

欢迎你成为 Vim 的普通用户:没有比这更令人讨厌的了。

二分之一的编辑战,Vim 是为那些严格按照系统类别思考并且不需要太多个性化的人准备的。Vim 是为那些喜欢学习一个结构,然后永远不要放弃它的人准备的。Vim 是为极客中的极客准备的。

Emacs:优柔寡断

Emacs 是所有尚未达到极客状态的书呆子的首选编辑器。这就是那种对图形用户界面略有反感,但又离不开的书呆子。那种喜欢编码,但仍然希望他们的文本编辑器不仅仅能够编码的书呆子。

角落里那个总是喝桃红葡萄酒的书呆子。当被问及一个非黑即白的问题时,会用一个精心设计的灰色来回答的人。上午 11 点起床的人,不是因为他们之前在睡觉,而是因为他们太忙于思考起床的最佳时间。

你不擅长做决定?使用 Emacs。

告诉我你的编辑,我就能知道你是不是一个极客。玛丽亚·卡斯泰利在 Unsplash 上的照片

SpaceMacs:和平缔造者

你的普通 SpaceMacs 用户是学术界的教师。优雅地穿着破旧的衣服。带着新鲜的仙人掌在难闻的办公室里。带着疲惫眼神的灿烂笑容。一种既怪异又有感染力的笑声。

他们是想退出编辑战的人。一个不像 Emacs 用户那样优柔寡断的人,但也不像 Vimmer 那样绝对古怪。一个永远不想站在舞台中央的人。依赖和谐的人。通常带有紫色终端背景。

欢迎来到传统而平凡的太空中心。

弗罗斯特:文学先知

能写剧谁还需要代码?戴着厚厚的眼镜穿着粗花呢夹克的书呆子才会这么说。你知道,就是那个每天晚上坐在酒吧角落里啜饮白兰地,认为这样会显得更聪明的人。

他们说,代码只是一种趋势。莎士比亚、歌德、柏拉图、佛陀等都将留下来。他们打开他们的 Frost 编辑器,选择一个令人惊叹的内置音乐主题,然后开始破解。编码员会说这个书呆子的写作是莎士比亚式的。文学天才们说他们的作品看起来更像计算机代码。

CodeLobster:如果你能让它变得复杂,为什么会变得简单?

你典型的 CodeLobster 程序员不相信简单事物中的快乐。相反,他们会尽可能地把事情复杂化。非常复杂。

如果他们制作鸡尾酒,它需要包含至少 18 种成分。如果他们使用浏览器,那么只有一个至少有 27 个插件。如果他们使用的是文本编辑器,那么就应该是一个兼容所有内容、能够处理所有事情的编辑器。嗯,几乎所有的事情。你明白了。

你就是你编码的东西

…或者你如何编码。

你选择你的文本编辑器是基于你是谁吗?还是你的文本编辑器把你塑造成了今天的你?你决定吧。

2020 年 3 月 5 日编辑:正如 Tylor Borgeson 所指出的,IntelliJ 在这篇文章发表时失踪了。现在包含了!
还有,在
Edmund munday的评论 Java-World 更名为 JavaScript-World——以澄清 JavaScript 与 Java 有很大不同。

编辑,2020 年 3 月 21 日:我在 NetBeans 上添加了一个全新的部分,专门针对 麸皮老林

编辑,2020 年 10 月 6 日:我已经收录了 曼西达克辛格 霜降 编辑!没有赞助的内容,只是很酷的东西。

你的终端颜色揭示了你的个性

原文:https://towardsdatascience.com/what-your-terminal-colors-reveal-about-your-personality-f98ec1dce3d1?source=collection_archive---------12-----------------------

让我看看你的终端,我会告诉你你的感受

你的终端颜色比你想象的要多。史蒂夫·哈拉马在 Unsplash 上拍摄的照片

编码是一门艺术。所以颜色总是交易的一部分!

正确使用时,颜色可以提高速度和可读性。但最重要的是,它们是程序员个性的一面镜子。

有些人比其他人更多地通过颜色来表达自己——这已经充分说明了他们的自我。一些人选择自定义他们的背景,另一些人喜欢让文本看起来像一堆 M&M。其他人两样都做。

每个方面都讲述了一个关于你是一个程序员的故事,以及你在日常生活中的感受。

背景颜色

你如何给背景上色揭示了你的舒适区。你的终端背景就是你每天看的东西,不管你是不是在编码。因此,你如何保持你的背景说明了你每天的感受。

黑色优雅

优雅来自黑色。你悠闲、时尚,而且你有那种确定的精神,不管你是否在编码。

你的同事认为你是个超额完成任务的人。他们认为你几乎是个名人,尽管你在 Twitter 上只有区区 30 个粉丝。你既不是名人,也不是成功者,但你知道如何推销自己。

你说话的时候,声音很大。毕竟,如果没人听到你说话,为什么要说话呢?

你是一个充分享受生活的人。

你活着。你爱。你放纵。但绝不会堕落到如此地步。

你是一个在纪律和放纵之间走钢丝的艺术家。你的终端正好反映了这一点。

你喜欢优雅的。泰安在 Unsplash 上拍照

又白又乱

你不认为自己没有组织能力。你只是钦佩别人的组织水平。

当你醒来时,你不知道明天会发生什么。你讨厌计划,因为那会打乱你的节奏。

你办公室的每一面都堆满了文件夹、笔记和一些去年圣诞节的礼物。你忘记了你最喜欢的咖啡杯去了哪里;它可能藏在几本书后面的某个地方。

说到咖啡——啊,咖啡因!你的圣杯和你生产力的唯一秘密。不管这让你更加紧张不安。来喝杯咖啡,开始编码吧!

灰色的老鼠

这是为每一个灰色阴影的用户。你无法决定非黑即白。你不会想要一种颜色,因为那会太分散注意力。

你喜欢保持东西的功能性:你选择了浅灰色,因为白色对你来说太亮了。或者你选择了深灰色,因为黑色对你来说太黑了。

你优柔寡断,但并不低效。你完成了工作,但不要大声说出来。开会时,你通常坐在角落里,除非被要求,否则从不发言。

你喜欢把私人的事情保持为私人的,把商业的事情保持为职业的。你不喜欢大声说话,因为那样会浪费精力。你没有任何政治观点,因为那会引起争议。最重要的是,你不喜欢引起别人的注意。

你有灰色终端?你完全是一只灰色的老鼠。

你用颜色来表达自己。由edu·劳顿在 Unsplash 上拍摄的照片

单色古怪

你厌倦了黑色、白色和灰色。你希望你的终端是你最喜欢的颜色,或者至少是一种能引起你注意的颜色。

你喜欢用各种方式表达自己。你代码中的变量名是独一无二的,你的服装风格无疑就是你。你喜欢艺术、音乐和喜剧。

你是程序员中的异类。你总是鹤立鸡群。你很享受。

你用你的终端颜色来表达你是谁。

你的终端是红色的?你是个了不起的爱人。

绿色?你永远不会停止学习。

黄色?你就像一缕阳光。

蓝色?你喜欢技术性的东西,天空和大海…

紫色?你是个伪装的怪人。人们甚至没有意识到你脑子里所有疯狂的想法!

海报男孩

你尝试过单色背景,但是你很快就厌倦了。你更喜欢用你最喜欢的星系的照片,或者你的第一只泰迪熊的照片,或者你妈妈的照片…

人们说你古怪,但实际上你只是个大孩子。好奇心是你前进的动力。编程是你的职业,因为它总是关于学习新的东西。

你对一切甜美多彩的事物都有着巨大的、无法控制的吸引力。你的注意力持续时间相当于一个三岁的孩子;每一次分心都会让你迷失方向。

尽管如此,你在工作中始终如一。你源源不断的想法弥补了你注意力的不足。

[## 改善 Mac OS X 终端外观的简单技巧

标准的终端外观只是白底黑字。苹果包括了一些不错的预置…

osxdaily.com](https://osxdaily.com/2013/02/05/improve-terminal-appearance-mac-os-x/) [## 如何改变你的 Linux 终端的颜色

您可以使用特殊的 ANSI 编码设置为您的 Linux 终端添加颜色,或者在终端命令中动态地添加颜色…

opensource.com](https://opensource.com/article/19/9/linux-terminal-colors)

文本颜色

文字激发行动。它是在你的屏幕上来来去去的东西。你使用的文本颜色反映了你的动机。

这反过来也说明了你是谁。

单色提交

你不喜欢你的文本看起来像一袋 M&M 巧克力豆。你宁愿选择传统的黑色、白色或灰色。那只是你有多爱你的手艺。

你对一切都很投入。那个永远准时,永远付出 150%,永远有有用的话要说的人——那就是你。你的输出是一致的,而且是高水平的。当你说好的时候,你是认真的。

有些人可能会说你傲慢。你总是带着灿烂的笑容走进办公室,对某人正在做的事情发表一些评论。通常情况下,这可能是一种侮辱——因为你的想法是错误的,脱离了上下文。你有强烈的倾向向你认识的每个人展示你更好。

但你不知道更好。你只是热爱你的工作。

承诺是单色者的关键。照片由 @plqml // felipe pelaquim 在 Unsplash 上拍摄

违约灵活性

大多数系统都有默认的配色方案。尽管在过去十年左右的时间里你一直在编码,但你并没有改变那个模式。千万不要碰正在运行的系统!

你可以和任何东西一起工作。灵活性是你的第二个名字。

十分钟后有个自发会议?赶紧塞几张幻灯片。必须使用完全不同的软件?哦,是的,你喜欢变化!你的猫生病了?没问题,你今天做家庭办公室。

不利的一面是,人们认为你有点不可靠。你不是那种每天都在同一时间出现在办公室的人——有时候,你的猫生病了。人们永远不知道当你交付结果时会有什么期望——这取决于它是在什么样的环境中编写的,对吗?

古怪的定制

您已经尝试使用默认的配色方案,但是您发现它既笨拙又低效。所以你花了半天左右的时间来为你的文字寻找完美的颜色。

走过你的笔记本电脑的人会发现你的设计非常吸引眼球。但是他们不知道每种颜色的真正含义。只有你知道。

你的颜色只属于你。同理,你的生命只属于你。你非常保守,把事情藏在心里。你学到了很多,却懒得和别人分享你的知识。你不喜欢在会议上发言——但当你这样做时,你的投入非常出色。

你非常聪明,但有时你最好分享你的智慧。是的,甚至你的配色方案!

你是个书呆子——你定制一切。奥比·奥尼耶德在 Unsplash 上拍摄的照片

一致且高效

当然,您已经在终端中定制了颜色。毕竟,人们应该如何处理那些蹩脚的默认颜色呢?

你大脑的容量是你最宝贵的资源。你不喜欢在不同环境下不同颜色的使用上浪费任何心思。这就是为什么您不仅定制了您的 shell,还以同样的方式定制了您的文本编辑器!

你在工作中始终如一,总是能取得高水平的成果。你认为这是因为你不会在颜色这样的小事上浪费时间。

这就是你提高效率的方法:清除杂物,剩下的事情自然就好了。而且显然很管用!

[## 具有 16 种 ANSI 颜色 Vim 主题的一致终端颜色

不是分别为 Vim 和终端的其余部分配置颜色,而是将 Vim 的配色方案限制为 16…

jeffkreeftmeijer.com](https://jeffkreeftmeijer.com/vim-16-color/)

你是一致的还是矛盾的?

一致性是关键,个性也是如此——但矛盾更有趣!

在这个故事中,我们已经回顾了五种背景颜色和四种文本。如果我们允许每种组合,我们会得到二十种不同类型的终端颜色。

背景中揭示的一些个性特征也可能在文本中得到反映。其他的可能是完全矛盾的。

而人类不都是行走矛盾吗?虽然一致的类型确实出现得更频繁,但有趣的是矛盾的类型。

详细阐述每一个矛盾的类型会扩大这个故事的范围。但也许你自己也是矛盾型的?你如何解释你的一致性和矛盾性?

你的 WhatsApp 信息告诉你什么是快乐,5 个简单的 Python 步骤

原文:https://towardsdatascience.com/what-your-whatsapp-messages-say-about-your-happiness-in-5-easy-python-steps-26ee2fb52333?source=collection_archive---------44-----------------------

WhatsApp 聊天情感分析入门指南

齐比克在 Unsplash 上的照片

在过去的几年里,情感分析和其他形式的自然语言处理变得越来越流行,尤其是 Python。虽然我已经在其他平台上运行情感分析和其他文本分析很多年了,但我想扩大我的学习范围,探索用 Python 来运行它,这是一种我还不太熟悉的语言。

希望这可以作为对情感分析相对陌生的人的指南。

5 个步骤

有时有人向我指出,我是一个相当消极的人。不是否定,但我强烈反对。

所以我想我应该测试一下,在我的 WhatsApp 群组对话中进行情绪分析,看看我和朋友/家人在快乐方面相比如何。如果你想“找到自己的幸福”,下面是我采取的步骤:

1.提取您的 WhatsApp 对话

这出奇的容易。单击组名并点击导出(如下所示)。它会下载一个 Zip 文件,解压后会给你一个. txt 文件。

2.打开 Python 并将 Flair 导入 Python 包

Flair 是由 Zalando Research 开发和开源的自然语言处理(NLP)库。我不会在这里详细介绍,只是说我选择使用它的原因是因为它简单易用,包括随时可用的情感分析。关于为什么它是一个很好的博客,有很多其他的博客。

!pip3 install flair
import flair
import pandas as pd

3.带上。txt 文件转换成 Python 并做一些基本的清理工作

的。txt 文件需要快速解析成单独的列。我只是在这里提取“日期”、“人”和“消息”:

***# bring in data and give it header 'text'***
data = pd.read_table('YourPathHere/_chat.txt', names=['text'], header=None)***#get rid of top 2 rows (e.g. "this chat is encrypted" etc.)***
data = data.iloc[3:]
data.head()***# parse the data into the columns 'date', 'person', and 'message'***
data[['date','remaining']] = data['text'].str.split(']',expand=True, n=1)
data[['person','message']] = data['remaining'].str.split(':', n=1, expand=True)data.drop(['text', 'remaining'], axis=1, inplace=True)
data

在进行任何情感分析之前,我们都希望去掉任何我们不想向下游传递情感的行。这可能包括任何空值,也可能包括任何简短的响应消息(例如“Ok”、“Lol”或“Thanks”)。此外,为了进行任何时间序列分析,将我们的日期字段转换为实际的日期数据类型是有意义的:

***# get rid of all the "image omitted"***
data = data[~data["message"].str.contains("omitted", na=False)]***# remove null rows*** 
data.dropna(inplace=True)***# remove any small messages***
data = data[data['message'].map(len) > 10]***# sort of the date into a proper date column***
data['date'] = data['date'].map(lambda x: x.replace(',',''))
data['date'] = data['date'].map(lambda x: x.strip('['))
data['date'] = pd.to_datetime(data['date'], format="%d/%m/%Y %H:%M:%S", errors='coerce')
data.head()

4.运行情绪分析

我使用 flair _ perspective . predict()来提供标签,这些标签将告诉我们值是正还是负,以及预测的置信度的 0 到 1 分。

sentiment = []
def run_sentiment(a):
    b = flair.data.Sentence(a)
    flair_sentiment.predict(b)
    sentiment.append(b.labels)data['message'].apply(lambda x: run_sentiment(x))
data['sentiment'] = sentiment

5.想象并理解你的结果

是时候快速看到结果了。你现在可以直接在 Python 中运行可视化,或者像我下面这样进入 Tableau。

开心了吗?

显然我不是最消极的。我很激动。

为了方便截图,我在这里“匿名”了一些人的名字,但我个人最喜欢的是分散图左下角的人:他们很少说话,但当他们说话时,这是这个群体收到的最负面的东西。感谢您的参与。

同样明显的是,实际上**我们当中没有人特别积极,这并不令人惊讶。唯一真正的例外是在 5 月,可能是因为这是宣布体育运动再次开始的时候(这是这个小组讨论最多的话题)。**

最后的想法

我选择分享这个,因为我在 Python 中找不到太多简单的情绪分析例子。希望它对其他不熟悉 Python 的人也有用。

同样,我绝对欢迎任何反馈或提示,以改善这里列出的任何东西。

你买的不是人工智能:如何区分事实和虚构

原文:https://towardsdatascience.com/what-youre-buying-is-not-ai-how-to-tell-fact-from-fiction-c47f9cd3913?source=collection_archive---------63-----------------------

“人工智能”这个时髦词被频繁使用。这可能意味着简单的自动化,甚至 excel 公式。你是怎么发现的?

当涉及到人工智能(AI)的产品时,越来越难区分真假。事实上,这很难,约会应用程序现在用假脸来增加他们的数量,广告商甚至用它们来增加广告的多样性。围绕人工智能的这种模糊性范围很广,并且在我们许多人不知道的情况下,进一步蔓延到我们的日常生活中。

对这种生成性媒体的使用既有非法的,也有良性的。

根据处方制作的人造脸——库存照片的商业替代品(来源:生成的照片

这些是人工智能在现实世界中帮助伪造的例子。但是,技术提供商一开始试图伪造人工智能解决方案怎么办?

在商界,“人工智能”这个时髦词经常被提起。即使是对技术有基本了解的人也经常把它与简单的自动化、统计测试甚至 excel 公式混为一谈。

研究发现,40%的欧洲人工智能初创公司实际上并不使用人工智能,其中许多公司没有纠正第三方分析网站因围绕该技术的炒作而做出的错误分类。公司秘密使用人类来做人工智能机器人的工作并不罕见。

在这种情况下,当您的组织准备好开始人工智能之旅时,您如何评估技术解决方案?有一些你应该问的标准问题,以确保你得到你所支付的东西。这些准则适用于评估任何“智能”机器学习解决方案,包括人工智能等先进技术。

照片inês piment ElUnsplash

真的还是假的 AI?要问的首要问题

所以,你决定扩展你的能力,投资人工智能。问这六个问题可以很好地了解你得到了什么,以及它实际上有多先进。

1.它是如何工作的?

首先问一个供应商他们的解决方案到底是如何工作的,为什么它是人工智能的一个例子。很好地理解它如何做它声称要做的事情,并质疑为什么自动化或更简单的技术不够。一家销售人工智能技术的公司应该能够以一种易于理解的方式解释对人工智能的需求以及他们使用的方法。不要担心在这里听起来很幼稚。

有了这个,你就可以开始区分人工智能算法和出色的营销了。例如,一个向客户推荐产品的系统可以建立在简单的商业启发之上,也可以由人工智能驱动。提出试探性的问题必须是你揭开真相的第一步。

2.解决方案是否基于数据?

任何人工智能解决方案都需要大量数据。数据使人工智能变得聪明,所以找出哪些数据被用来训练人工智能。例如,Open AI 的 GPT 2 模型具有撰写新闻文章的能力,并在数百万篇维基百科文章上接受了训练,从而赋予它智能。

询问供应商你必须提供什么数据来保持人工智能在使用中的智能。如果没有对数据的强烈需求,这是一个潜在的危险信号。

美国宇航局在 Unsplash 拍摄的照片

3.数据是如何标注的?

对于今天的许多人工智能来说,数据需要以某种格式标记,以便人工智能理解。为了训练人工智能阅读图像并识别属性,获得高质量的图像是不够的。它们必须被仔细标记,以便人工智能从中学习。在面部识别的情况下,人类需要在每个人的脸上画出方框,以首先教会人工智能人脸是什么样子的。

询问 AI 厂商他们如何标记他们的数据,以及当你部署它时,这种标记是否需要继续——这是 AI 是否真正从数据中学习的另一个标志。

来源: mc.ai

4.有没有一个学习的过程?

传统的技术解决方案会以第一次运行程序的方式运行第一百万次。当涉及到人工智能时,解决方案可能会在每次运行数据时进行学习,并根据每次反馈进行调整。

提出问题以了解学习过程和你必须提供的反馈类型。例如,当你在 Gmail 中将一封电子邮件标记为重要时,人工智能会从中学习,以改善未来所有电子邮件的分类。这是一个智能应用程序简单、持续学习的例子。一个不接受这种明确反馈的系统可能终究不是“智能”的。

5.应用程序需要什么样的维护?

像人类一样,任何人工智能都需要处于不断改进的状态,才能保持相关性。一个非人工智能的标准技术应用程序将提供预期的功能,几乎不需要维护。然而,真正的人工智能需要学习新数据,并定期调整内部智能。

如果你看不到一个明确的路线图,让智能保持最新或随着时间的推移而改进,那就是一个危险信号。例如,一个准确预测员工流失的人工智能在几个月后就不会那么好了。它需要重新学习员工动态、业务场景和市场条件的变化。

JESHOOTS.COM在 Unsplash 上拍照

6.我能看一下我公司的现场演示吗?

大多数人工智能演示在精心策划的场景中工作,并作为试点。任何高质量人工智能解决方案的供应商都应该提供他们产品的现场演示,而不仅仅是营销视频。如果他们能拿着你的数据用 AI 解决方案兜一圈就更好了。

例如,一个能够识别选定领域法律文档风险的人工智能解决方案,应该能够证明它能够识别你上传的类似文档的风险。在现场演示解决方案时犹豫不决可能是问题的早期迹象。

来源:相机陷阱演示微软人工智能地球& Gramener

由于许多公司继续“驾驭人工智能的浪潮”,而没有实际提供人工智能解决方案,因此业务团队自学如何识别真假非常重要。从上面列出的问题开始讲区别,继续加深你对 AI 在实践中是什么样子的认识,以避免落入陷阱。

这篇文章最初是在 Entrepreneur.com**发表的 。增加了插图。标题照片由 埃里克·克鲁尔 上的Unsplash

对数据科学感兴趣但不确定从哪里开始?查看我关于 的文章,了解何时以及如何组建您的数据科学团队

什么是容器,我为什么要关心?

原文:https://towardsdatascience.com/whats-a-container-and-why-should-i-care-8410666e3da2?source=collection_archive---------37-----------------------

消除容器的神秘和困惑,以及为什么今天应该使用它们

托德·克雷文在 Unsplash 上的照片

啊,集装箱,科技界的勒布朗·詹姆斯。如果你以任何身份关注美国体育,你可能对勒布朗·詹姆斯有足够的了解,可以和别人就他进行一次有意义的谈话。然而,如果你不关注任何体育运动,鉴于他在娱乐和新闻媒体上无处不在的形象,你可能至少还知道他的名字,但可能会发现自己处于一种尴尬的境地,有人提到“国王”,并希望你简单地跳进去,知道最近发生了什么以及他昨晚掉了多少分。

技术世界中的容器也是如此。无论我们在哪里看到,都有人在编写另一个关于容器化他们的小发明的故事,或者容器编排对您的业务至关重要,或者您需要转向为您部署和维护容器的云提供商。如果您已经对容器有所了解,那么这些文章很有价值,可以帮助您了解如何进一步利用该技术来获得更多价值。然而,如果你不属于这一类,你可能知道的关于容器的唯一事情就是你应该知道更多关于容器的事情。这篇文章旨在回答一些关于什么是容器以及在工作中应该如何和为什么使用容器的基本问题。我将使用一个愚蠢的类比从基础开始,最终进展到容器实际如何工作的更多技术描述。

容器和纸杯蛋糕有什么共同点?照片由雷伊·戈德曼在 Unsplash 拍摄

集装箱纸杯蛋糕

在我深入研究这项技术之前,让我们先用一个简单的类比来解释容器的用途以及它们为什么有用。举个例子,假设我拥有一家个人纸杯蛋糕公司,在家里烘焙并出售纸杯蛋糕。我知道厨房里的所有东西都在哪里,我知道如何使用我的烤箱和搅拌器,我有我需要的烤盘,知道糖在我当地杂货店的哪个通道,哪个品牌的蛋糕适合我的完美蛋糕。每样东西都完全符合我的需求,我能够做出完全一样的美味纸杯蛋糕,并且可以在家里轻松出售。

现在,假设我的纸杯蛋糕在中欧迅速走红,潜在顾客会求我在阿尔卑斯山开店。什么会出错?有明显的需求,而且我是做纸杯蛋糕的专家,所以为什么不开一家新店来增加我的收入呢?在搬到瑞士并为我的生意租了一个新的面包店后,我很快遇到了一些问题。杂货店在哪里,我用什么牌子的糖?为什么我找不到和我习惯的尺寸差不多的烤盘?为什么烤箱的测量单位是摄氏度,我如何打开计时器?我习惯的每次都能持续搅拌面糊的电动搅拌器在哪里?我甚至不得不担心在不同的海拔和温度下烹饪会改变食物的烘烤方式。最重要的是,我不会说瑞士德语,无法寻求帮助。

在努力做好我的第一批蛋糕后,蛋糕沉了下去,尝起来又苦又有点焦。我的失望是无法估量的,我的一天就这样毁了。哪里出了问题,怎么会更好?进入神奇的集装箱。

让我们从头开始,但是这次做一些改变。让我们想象一下,我把一个神奇的海运集装箱放在我家前面的草坪上,并在那里工作,而不是直接在我家外面经营我最初的生意。现在,我提到这是一个神奇的集装箱,因为我可以将我需要的一切无限量地放入这个结构中,并且它有足够的内部空间。我完全按照我喜欢的方式设计容器,有我最喜欢的烤箱、搅拌器和平底锅,足够的柜台空间,以及我制作美味纸杯蛋糕所需的所有配料。我甚至把容器设置到完美的温度、压力和湿度,这样一切都是一样的。由于我的配料永远不会用完,我可以专门在这个容器中工作,并通过我在单元前面制作的窗口出售纸杯蛋糕(我也没有其他爱好、义务或其他人类需求来将我从工作中抽离)。

当这一次纸杯蛋糕像病毒一样传播开来时,我没有放下一切,试图在瑞士重新开始,而是把我的神奇海运集装箱送到海外,在山里重新打开。这一次,我的容器里的所有东西都是我想要的样子。我有我需要的所有材料,并且可以复制我的纸杯蛋糕,所以它们看起来和尝起来都和在家里一样,尽管在一个完全不同的环境中。

有了这个容器,当我的纸杯蛋糕毫无疑问地在北京、约翰内斯堡、里约热内卢,甚至在月球上变得受欢迎时,我可以移动我的容器,或者更好的是,简单地创建一个副本,并立即开始与当地的客户分享我的精彩纸杯蛋糕。多亏了我的神奇容器,我再也不用担心我将要工作的底层环境,而是可以愉快地专注于手头的任务。

Giu Vicente 在 Unsplash 上拍摄的照片

回到现实

尽管我们都爱纸杯蛋糕和神奇的海运集装箱,但让我们跳回现实,看看这与现实世界有何关联,以及是什么让集装箱变得有用。

很有可能,你在生活中的某个时候听过或说过“奇怪,它对我有用”这句话。如果你像世界上绝大多数人一样(包括我自己),你讨厌听到这句话,但是当你是说这句话的人时,把它当作一个安全网。在技术世界中,这种小情况发生得比大多数人愿意承认的要多,因为硬件、网络、软件环境,甚至文档实践都因人而异,因机器而异,将过多的随机变量扔进混合物中,阻止应用程序或用例被可靠地复制。

即使依赖项、设置和其他工具都被精确地记录下来,复制一个工作设置也需要很长时间,并且仍然有可能其中一个步骤执行不正确。回到纸杯蛋糕的比喻,即使我知道如何找到我的纸杯蛋糕所需的所有工具和配料,我也要花很长时间才能在一个新的地方得到我需要的一切,而不是把我的容器带到我已经拥有一切的地方。有了我的集装箱,我可以立即开始烘烤,而不是浪费几天、几周甚至几个月来准备一切。

由于有了容器,可以消除许多随机性和浪费的时间,因为可以创建一个只包含必要的包、设置和实用程序的标准化映像,以确保一个通用的操作环境,而不管应用程序在哪里运行。也就是说,到底什么是容器,它是如何工作的?

集装箱仅供参考

对容器的标准描述通常是称其为“轻量级虚拟机(VM)”或“名称空间隔离器”虽然这些都是准确的描述,但它们并不是所有用户都能完全理解的,也不能可靠地解释它们做什么和如何工作。为了更好地理解,让我们进一步分解它们。

对于那些不知道的人来说,顾名思义,虚拟机是在主机上运行的虚拟化计算机。换句话说,它是一个共享物理资源(内存、CPU、存储等)的仿真计算机系统。)与运行 VM 的机器。虚拟机允许您在物理设备上运行不同的操作系统(OS ),而无需双重引导至不同的 OS。虚拟机被称为“来宾”,每个虚拟机都在所谓的虚拟机管理程序(我们不会在这里讨论)之上运行唯一的来宾操作系统。随着单台机器上虚拟机数量的增加,运行所有来宾操作系统所需的空间和资源也会随之增加,主机可能会因为所有的限制而陷入困境。

相反,容器运行在主机操作系统之上,不需要第二个客户操作系统来运行。每个容器共享主机的内核,并有可能在必要时共享库和二进制文件。因为这些容器不需要它们自己的独立资源,所以它们最终比基于 VM 的容器小得多,因此被称为“轻量级 VM”任何特定的虚拟机都可能有几千兆字节大小,启动需要几分钟,而几乎相同的容器占用几兆字节,可以在几秒钟内启动。

唯一主机和容器命名空间的可视化表示

名称空间隔离

Linux 有一个被称为名称空间的特殊特性,它是在不同资源之间划分或“隔离”的一种方式。这些名称空间包括用户列表、进程 id 和网络资源。任何使用与宿主不同的命名空间的进程都与宿主的资源隔离。例如,具有不同用户名称空间的应用程序将拥有一组唯一的用户 ID,所有用户 ID 都拥有特定应用程序所需的权限。如果您希望某个特定用户拥有某个应用程序的特权,而不是更大的主机的特权,这是很有用的。

隔离名称空间的过程是容器的基础,因为默认情况下,除了主机之外,所有容器都使用自己唯一的名称空间。这允许对容器内运行的所有应用程序进行更好的控制和更具体的控制。

共享网络和 IPC 命名空间的容器和主机的可视化表示

然而,请注意,容器不需要与它们的主机完全隔离。上图显示了一个与主机共享 IPC 和网络名称空间的容器,允许容器使用与主机相同的网络接口以及共享内存。共享命名空间只有在应用程序需要时才有用,例如在为 web 应用程序共享网络命名空间时,使用与主机相同的主机名、网络接口和 IP 地址。

为什么所有这些都很重要?给定这些名称空间的划分,容器变得可复制,并且更能避免各种依赖性、配置或资源问题,这些问题会阻止应用程序在不同的机器上可靠地运行。因此,容器可以很容易地在完全不同的系统上复制,并按预期运行,因为没有其他进程、包和设置妨碍。这还有一个额外的好处,即更复杂的操作可以在容器内完成,而不会干扰主机。

尼克·吉奥在 Unsplash 上的照片

最终蜂鸣器

现在,您有望对什么是容器以及一些关键原则有一个相当好的理解。利用容器是证明您的应用程序是快速、轻量级的,最重要的是,是可再现的一个很好的实践。即使在容器中运行简单的应用程序也能给软件的开发和部署带来巨大的好处。

虽然您可能仍然不知道“国王”下一个追逐的记录是什么,但您现在已经准备好成为您工作的容器的国王或女王,并了解它们如何在实现您的软件梦想中发挥关键作用。请继续关注未来关于如何在实践中构建、运行和部署容器的文章,这样您就可以真正开始统治您的容器王国了。

对数是什么?

原文:https://towardsdatascience.com/whats-a-logarithm-cca50d031241?source=collection_archive---------3-----------------------

Joel&Jasmin fr estbird 在 Unsplash 上拍摄的照片

我们为什么需要它们?

你可能在高中数学课上学到了它们,然后就再也没想过它们。我承认,直到今天,对数(简称 log)都不是我最好的朋友。它们并不那么直观。但它们真的很有用,所以我学会了勉强接受它们。

定义

对数是这样一个问题的答案:我需要将什么样的次方 x 应用于以 b 为底的才能获得数字 y :

log_b(y) = xis another way of specifying the relationship:b^x = y

让我们插入一些数字来使这一点更清楚。我们以 10 为基数,所以 b=10。

log_10(100) = 2The base-10 logarithm of 100 is 2 because:10^2 = 100

基本上就是问我需要多少个 b 相乘才能得到 y,要得到 100,我只需要把两个 10相乘。

这实际上是处理乘法序列的一个很好的方法。

Assume something is growing at a changing rate denoted by rn. Over 3 years, its total growth rate is:**(1+r1)*(1+r2)*(1+r3)**In log-scale, we would just take the log of the entire thing:
*(I will use log to denote log_10 to simplify notation)*One rule of logs is that *log(A*B*C) = log(A) + log(B) + log(C) so:***log{(1+r1)*(1+r2)*(1+r3)}
= log(1+r1) + log(1+r2) + log(1+r3)**Now let's think about log(1+r1) - it's asking what power do I need to apply to 10 so that it equals (1+r1):
**10^z1 = 1+r1, so log(1+r1) = z1
10^z2 = 1+r2, so log(1+r2) = z2
10^z3 = 1+r3, so log(1+r3) = z3**This allows us to rewrite each term, and the previous equation simplifies to:
**log(1+r1) + log(1+r2) + log(1+r3)
= z1 + z2 + z3****Thus, in log-space, a multiplicative sequence becomes an additive one:
log{(1+r1)*(1+r2)*(1+r3)} = z1 + z2 + z3**

一个例子

普通的非数学爱好者最有可能在以对数标度绘制的图表上遇到对数。例如,以下是美国新冠肺炎病例总数的对数比例(基数为 10)图:

美国新冠肺炎病例总数的十进制对数

当我看到对数尺度的图表时,我总是要花一秒钟来确定自己的方向。y 轴上的数字是什么意思?当剧情开始变平,趋于平稳,意味着什么?

让我们来看看美国案例总数的原始未记录数据。所以我们可以更容易地进行比较,我在上面的图表中绘制了未记录的数据,在下面的图表中绘制了记录的版本(与前面的图相同)。

原始美国案例总数及其基数为 10 的日志

除了病例在短短 200 多天内从 0 迅速增加到近 600 万以外,我们从顶部副曲线(未记录的数据)中没有收集到太多信息。但我们真正想知道的是感染率是否在下降,使用未记录的数据是不可能知道的。事实上,由于缩放比例(以及开始时未记录的数据的明显平坦性),一个没有经验的分析师在查看该图表时可能会错误地得出结论,感染率在突然加速之前的前 50 天非常低。

那将与现实完全相反。对数标度的救援。我马上会解释它是如何工作的,但是现在请相信我:

  • 对数刻度线斜率的增加意味着感染率在增加。
  • 恒定的斜率意味着感染率没有变化。
  • 斜率的降低意味着感染率在下降。
  • y 轴是基数的幂。在这种情况下,因为 y 轴是以 10 为底,1 表示 10,2 表示 10,依此类推。

回到我们的图,我们可以看到对数标度图讲述了一个完全不同的故事。在减速前的头 75 天左右,感染率实际上非常高。所以对数可以很快告诉我们某个东西的变化率是在增加(比如汽车加速),保持不变,还是在减少(逐渐踩下刹车)。让我们再举一个例子,看看对数如何帮助我们更好地观察数据的增长趋势。假设我们的数据以下列高速度增长,但持续下降:

rates = [1.5, 1.4, 1.3, 1.2, 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3]

从未记录的图(左)来看,我真的不知道增长率是否在下降。但是从对数坐标图(右)来看,增长正在放缓是显而易见的。

日志帮助我们更好地看到增长率的变化

我们为什么关心?

对我来说,当我学习数学的时候,我经常缺少的是知道为什么我应该关心一个特定的概念。所以从实际意义上来说,为什么日志很重要呢?

答案是(还有其他的,但这是最实际的一个)日志让我们在处理呈指数增长的事物时有更大的灵活性。与普遍的看法相反,指数增长并不总是像一棵树长到天上一样,它仅仅意味着数据以合理的恒定速率复合(或衰减)。指数增长的一些例子有:

  • 储蓄账户。这些天可能没什么回报,但它仍在不断复利。一个年利率为 2%的储蓄账户会在 35 年后让你的钱翻倍(1.02 ⁵ = 2)。这是指数增长,因为为了得到总增长率,我们用 1 加上增长率,再乘以 N 的幂,其中 N 是年数。
  • 通货膨胀。相反,每年我们的购买力都会下降 2%(商品和服务价格上涨 2%)。我们的钱,如果不投资,35 年后会贬值 50%(0.98⁵= 0.5)。
  • 一个明显的例子是像我们现在这样的疫情。在今年 2 月和 3 月的早期,感染以平均每天 20%的速度增长。因此,有一段时间,我们基本上每 4 天就有一倍的新冠肺炎病例(1.2⁴ = 2.07)!这也是为什么仔细追踪和降低感染率是如此重要的部分原因。
  • 大学费用每年增长约 8%。这对于每 9 年翻一番(1.08⁹ = 2)来说是好事。
  • 摩尔定律表明,微芯片上的晶体管数量大约每两年翻一番,这意味着年增长率为 41%。

作为一个普普通通的规则,如果我们可以说某样东西每 N 年大约翻一番(或减半),那么我们就有了指数或复合增长。

为了好玩,让我们先正常地绘制所有这些(除了新冠肺炎,因为它会在图表上爆炸),然后用对数标度。以下是未记录绘图的代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltyrs = 30
rates = [0.02, -0.02, 0.08, 0.41]
labels = ['Savings Account', 'Real Value of Cash', 
          'Cost of College', 'Transistors on Chip']
values = []for r in rates:
    temp_list = []
    for y in range(yrs+1):
        temp_list.append((1+r)**y)
    values.append(np.array(temp_list).reshape(-1,1))

ax = pd.DataFrame(np.concatenate(values, axis=1), 
                  columns=labels).plot(figsize=(10,6));
ax.set_ylabel('Growth factor with starting value of 1')
ax.set_xlabel('Years')
plt.tight_layout()

剧情不是很有意思。晶体管的生长速度如此之快,以至于其他所有东西看起来都像一条扁平的线。

原始未记录值

让我们看看能否更好地了解对数标度图的情况。要获得 y 轴上的对数标度,我们只需切换 Pandas 绘图方法中的 logy 选项(以对数标度绘制 y 轴):

ax = pd.DataFrame(np.concatenate(values, axis=1), columns=labels).plot(figsize=(10,6), logy=True);
ax.set_ylabel('Growth factor with starting value of 1 (log base 10 scale)')
ax.set_xlabel('Years')
plt.tight_layout()

对数标度图是四条直线。为什么会这样?简而言之,它们都是直线,因为它们都在以恒定的速度增加(或者在现金实际价值的情况下减少)。

数值的对数标度图

让我们利用摩尔定律更深入地了解一下,该定律指出,晶体管数量应该以每年 41%的速度增长:

 Unlogged          log_10
Year 0:   1 transistor      **0**      <- 10^**0**    = 1
Year 1:   1.41              **0.15**   <- 10^**0.15** = 1.41
Year 2:   1.98              **0.30**   <- 10^**0.30** = 1.98
Year 3:   2.80              **0.45**   <- 10^**0.45** = 2.80
Year 4:   3.95              **0.60**   <- 10^**0.60** = 3.95**Explanation:**We get year 3’s value of 2.80 as 1.41^3.Because 10^0.15 = 1.41, we can reframe this as:**1.41^3 = (10^0.15)*((10^0.15)*(10^0.15)**Now let's take the log of both sides using the rule that:
*log(A*B*C) = log(A) + log(B) + log(C)*We get:
*(I will use log to denote log_10 to simplify notation)* **log(1.41^3) = log{(10^0.15)*((10^0.15)*(10^0.15)}
log(1.41^3) = log(10^0.15) + log(10^0.15) + log(10^0.15)**Recall log(10^0.15) asks what power do I need to apply to 10 in order to get the value in the parentheses, 10^0.15? Obviously the answer is 0.15.So the previous equation simplifies to:
**log(1.41^3) = 0.15 + 0.15 + 0.15 
log(1.41^3) = 0.45**Thus, something growing 41% a year, would in log-scale (with a base of 10), would grow by adding 0.15 a year like so:**0, 0.15, 0.30, 0.45, 0.60**And to get the actual unlogged values, you just apply these values as powers to the base:**10^0, 10^0.15, 10^0.30, 10^0.45, 10^0.60**

对数使指数数据线性化

对数允许我们将乘法(也称为复合)序列转换成加法序列。除了使指数数据的图表更容易解释之外,这还有另一个真正有用的应用——线性回归。线性回归的要求之一是因变量和自变量之间的关系必须是线性的。让我们制作一些假数据来形象化地说明这一点:

rates = [0.3, 0.8, 0.2, 0.1, 0.4, 0.7, 0.5, 1.2, 0.3, 0.1, 0.4, 0.9]
x = [i for i in range(len(rates))]
y = (np.array(rates)+1).cumprod()
fig, (ax1, ax2) = plt.subplots(1,2,figsize=(14,6), sharex='all')
ax1.scatter(x, y);
ax1.set_xlabel('X');
ax1.set_ylabel('Y');
ax1.set_title('Raw Values');
ax2.scatter(x, np.log10(y));
ax2.set_xlabel('X');
ax2.set_ylabel('Y');
ax2.set_title('Log-Scale Values');
plt.tight_layout()

我们的 y 变量以非常高的速度增长。尽管比率不同,但似乎 x 越大,y 的增加速度越快。因为左侧曲线的斜率在变化(并且在增加),所以 y 和 x 不具有线性关系。所以线性回归是行不通的。

原始值与记录值

但是一旦我们应用对数(以 10 为底),我们就得到右边的图。对我来说这看起来很线性。指数数据是指数数据,因为对于每个时间步长(假设时间序列),当前值会乘以某个值:

At time step 1, y is: x^1At time step 2, y is: x^2At time step 3, y is: x^3

所以在 y 和 x 之间有一个指数关系。但是注意在 y 和应用于 x 的指数之间有一个线性关系。取对数(让我们作弊,使用基数 x)得到指数:

At time step 1: log(x^1) = 1At time step 2: log(x^2) = 2At time step 3: log(x^3) = 3

现在我们有了 log(y)和 x 之间的线性关系,这是线性回归所需要的。

结论

这就是所有的人。日志是数学不可或缺的一部分,这篇文章仅仅触及了它们有用的表面。但希望读完这篇文章后,你不再觉得它们可怕,并鼓励你在日常工作中使用它们!干杯!

什么是张量?

原文:https://towardsdatascience.com/whats-a-tensor-e5525149cba3?source=collection_archive---------25-----------------------

打开通用数据科学结构的包装

从 Adobe Stock 获得许可的图像

张量的概念是由两位意大利数学家 Tullio Levi-Civita 和 Gregorio Ricci-Curbastro 在 1900 年创立的,并且,正如通常所见,他们是建立在其他数学家的工作基础上的。维基百科关于“张量”的页面是这样开始的:

在数学中,张量是描述与向量空间相关的代数对象集之间的(多线性)关系的代数对象。

对于非数学家来说,要解开的东西太多了!

幸运的是,在实际意义上掌握张量是什么以及我们如何在数据科学中操纵它们要容易得多。

我发现把张量想象成嵌套的数字“列表”很有帮助,可以有任意数量的“层次”另一种形象化的方法是想象 Excel 电子表格中的每个单元格都包含另一个完整电子表格中的所有内容。然后,在第二个电子表格中,每个单元格都链接到另一个完整的电子表格,依此类推。每个电子表格都可以被视为一个额外的“维度”

“一阶”张量只有一维。在计算机科学中,这将被称为“向量”,一个有序的数字列表。“二阶”张量是一个矩阵,像 Excel 电子表格一样,有两个维度。随着维度的增加,我们可以将这些信息想象成嵌套在数组中的向量、矩阵或数组,具有任意数量的维度( n 维)。

三阶张量可能是这样表示的:

可视化三阶张量

三组“顶级”值中的每一组都用不同的颜色表示。在本例中,每个值的数字对应于该值在整个数据结构中的特定位置。每个值最右边的数字对应于它所属的顶级组。所有红色的值都在顶级组 1 中,绿色的值在组 2 中,红色的值在组 3 中。

每个顶级组中都有一个矩阵(二维)。每个值最左边的数字对应于它所在的“行”,中间的数字对应于它所在的“列”通过这种方式,所有值的顺序得以保持,并允许我们使用其他向量、矩阵或数组对整个结构执行计算。

这是相同的结构,用不同的信息可视化:

三阶张量

每个字母代表结构中的一个独特位置,使用相同的颜色编码来区分顶级矩阵。

使用三维立方体可以实现更复杂的可视化。立方体的每个垂直层将包含来自这些“顶级”组之一的数据,创建一个具有 27 个唯一“位置”的 3x3x3 立方体但是一旦我们超越了三维,我们用图形来形象化张量的能力就失效了。

由于这一限制,让我们来看看如何使用计算机软件对相同的数据进行编码。使用 Python 和 Numpy,我们可以用第一个例子中的数字数据创建一个数组:

from numpy import arrayT = array([[[111,121,131], [211,221,231], [311,321,331]],[[112,122,132], [212,222,232], [312,322,332]],[[113,123,133], [213,223,233], [313,323,333]],])

以这种方式对数据进行编码使得拥有任意数量的维度成为可能,这在我们拥有大量复杂数据时具有巨大的价值!

我希望这有助于解释为什么,至少在数据科学中,张量可以被认为是“嵌套”数组。

在以后的文章中,我将讨论“基于元素的”加法、减法、乘法、除法等。以及“Hadamard 积”和“张量积”之间的区别——一个需要相同维数的张量,一个不需要。

互联网上有很多关于数据科学教育的资源。以下是我更喜欢的一些资源:

我乐观地认为,人工智能将越来越多地被用来让我们所有人的生活变得更好。您是否面临数据科学问题/挑战?我很乐意帮忙;我们连线吧!

感谢阅读!

一个简单的 SQL 查询背后是什么?

原文:https://towardsdatascience.com/whats-behind-a-simple-sql-query-c78e3ded8321?source=collection_archive---------9-----------------------

简要回顾一下当应用程序/开发人员运行 SQL 查询从 PostgresDB 数据库获取数据时会发生什么。

肉从哪里来?照片由弗拉德·chețan从佩克斯拍摄

就像现在大多数孩子似乎不知道他们的肉来自哪里(提示:不是长在树上,而是可能来自实验室)或者为什么天空是蓝色的(提示:蓝光的波长更短、更小),数量惊人的开发人员不(真的)知道他们的数据来自哪里以及如何处理和存储。这篇文章应该是工程师理解其工作原理的起点。不管营销人员试图教给你什么样的框架和无代码平台,这都是一件非常好的事情。尤其是如果数据真的是新的石油(显然这已经持续了几年),看看数据库是如何工作的可能会有回报。

免责声明:这不是 SQL 教程

简单的 SQL 语句直接从名为 users 的数据库中获取所有用户:

*免责声明 2:重点不在于编写花哨的 SQL 语句,而是展示一旦您这样做了会发生什么*

SELECT * FROM users;

那么,有多少人真正知道在 psql 终端中按下 enter 键和返回结果之间发生了什么?

基本原则

为了理解这一点,我们必须从头开始——PostgresDB 的架构。

归根结底,它是一个用 C++编写的客户机/服务器应用程序。客户是任何访问数据库的人,比如你的 psql 终端,你的 Lambda 函数,JDBC 驱动等等。服务器是 PGDB 后端,它接受你的请求,存储数据等等。

下面是 PostgresDB 的基本架构概述,整篇文章都会详细介绍:

这是一种老派,但仍然有效:)来源:幻灯片分享

查询的路径

在 PostgresDB 官方文档中有一个关于“查询路径”的很好的概述。以下是你应该知道的:

1。建立连接,发送查询&等待结果

PGDB 可以同时处理多个连接(通过“postmaster”,参见架构),并且对于每个连接,它派生一个新的进程(“postgres”,参见架构)来处理该连接的请求(例如 SQL 语句)。换句话说,这是一个简单的“每个用户一个进程”的客户机/服务器模型。邮局主管处理初始连接和身份验证,然后将该连接移交给新的 postgres 进程。这些进程通过共享内存和信号量相互通信,以确保即使在并发连接的情况下整体数据的完整性(还记得 ACID 吗?)

2。解析查询

这包括两个阶段:

  • 解析:PGDB 解析器利用 UNIX 工具 bison 和 flex 作为解析器和 lexer 来验证传入的查询字符串(ASCII 文本)是否是有效的 SQL 查询。这只能通过关于 SQL 语法的固定规则来完成,而不需要了解查询字符串的底层语义。输出是一个解析树:

SELECT 语句的解析树示例。来源: interdb.jp

  • 转换:使用解析器树构建查询树,查询树包含查询的语义解释,例如引用了哪些表、数据类型、运算符和函数。查询树的根是这里定义的查询数据结构。输出:

同样的例子,查询树作为输出。来源: interdb.jp

深入查询:

  • targetList:保存查询的输出及其数据类型,在本例中是列 id 和 data,它们都是整数
  • rtable:保存对表的引用
  • jointree:保存 FROM 和 WHERE 操作符
  • sortClause:保存数据应该如何排序

直接来自官方文件的重要说明:

将原始解析与语义分析分开的原因是系统目录查找只能在事务中完成,我们不希望在收到查询字符串时立即启动事务。原始解析阶段足以识别事务控制命令(BEGIN、ROLLBACK 等),然后这些命令可以被正确执行,而无需任何进一步的分析。一旦我们知道我们正在处理一个实际的查询(比如 SELECT 或 UPDATE),如果我们还没有在一个事务中,就可以开始一个事务。只有这样才能调用转换过程。

3。重写

PGDB 的重写系统使用查询树作为输入,并基于存储在其系统目录中的规则执行转换,这些规则可以应用于查询树。输出也是一个查询树。一个很好的例子是视图(虚拟表)的实现,其中重写系统重写用户查询以访问视图定义中的原始表,而不是视图的别名。

关于规则系统如何为视图工作的综合例子可以在这里找到。

4。查询计划

计划器/优化器使用上一步重写的查询树为查询创建最佳/最便宜(=最快/最有效)的执行计划——查询计划。优化器会寻找所有可能的路径来执行查询。除非该语句有大量超过 geqo_treshold 的连接,在这种情况下查看所有可能性在计算上是不可行的。在这种情况下,使用通用查询优化器来代替。

查询计划/计划树的示例相同。来源: interdb.jp

上图中的例子显示了一个简单的例子,其中执行器必须对表 tbl_a 进行顺序扫描,然后进行排序。

您可以通过在查询前键入 EXPLAIN 来检查您的查询计划:

EXPLAIN SELECT (...)

5。遗嘱执行人

官方文件尽可能清楚地解释了这一点:

执行器递归地遍历计划树,并以计划表示的方式检索行。执行器在扫描关系时使用存储系统,执行排序和连接,评估资格,最后返回派生的行。

执行器用于评估所有 4 种基本 SQL 查询类型选择、插入、删除和更新。您可以在这里找到每个查询类型的执行者步骤的更多细节。

奖励:GPU 加速

实际上有类似 PG Strom 的工具用于 GPU 加速,特别是针对查询优化器和执行器,如下图所示:

又是那种老派,但是有什么不喜欢的呢?:)来源: SlideShare

这篇文章没有测试过这一点,但它可能会启发你去看看有什么,因为这似乎是一项非常酷的技术。

记忆

好的。现在您知道了(1)当您连接到 PGDB 实例时会发生什么,以及(SQL 查询是如何被解析、优化和执行的。唯一缺少的是数据如何存储,以涵盖现代数据库如何工作的(非常)基础。

*鉴于 PostgresDB 的历史,你可以对“现代”持保留态度,但它仍然被广泛使用,是当今使用的主要关系数据库之一。

这个题目这里有很大的解释,所以下面只是简单总结一下。

PostgresDB 内存架构的(非常)高级概述。来源:severalnines.com

有两种类型的内存:

1。本地存储器

它由每个 postgres 后端进程使用。该内存由每个进程分配,用于查询处理,包括:

  • temp_buffers:由执行器存储临时表
  • work_mem:由执行程序用于连接等。
  • maintenance_work_mem:像 REINDEX 这样的维护操作

2。共享内存

它是在 PGDB 服务器启动时分配的,所有后端进程都使用它来确保数据完整性(还记得文章的开头吗?)这也是后端进程与之接口的内存—它通常不直接与持久性存储接口。该共享存储器包括:

  • 共享缓冲池:表和索引中的页面被加载到的地方
  • WAL buffer: Postgres 有一个预写日志,即事务性日志,确保不会因为服务器故障而丢失数据。WAL 数据在传输到持久存储之前存储在 WAL 缓冲区中。
  • 提交日志:保存所有事务状态,作为并发控制机制的一部分

您可以调整这些值以及分配给它们的内存量,以提高数据库的性能。关于存储器各部分实用程序的更多信息可在这里找到。

整合/持久存储怎么样?

最后会怎么样?数据是如何持久化的?执行器可以通过缓冲区管理器读取/写入数据库中的表和索引,缓冲区管理器可以通过将数据添加到共享缓冲池来访问持久存储中的数据。

摘要

到目前为止,您应该对最流行的数据库之一的内部工作原理有了基本的了解!在一天结束的时候,你只是在和一个非常智能的 C++应用程序交互——这多酷啊?希望这能消除一些“数据库很复杂”的污名。也许它甚至会启发你更深入地挖掘,并了解如何通过更好地理解如何存储数据来优化应用程序——这是现代软件工程中最大的瓶颈之一。

来源:

76 人的客场之旅背后是什么?

原文:https://towardsdatascience.com/whats-behind-the-76ers-road-woes-939a3d9a78c2?source=collection_archive---------23-----------------------

NBA 历史上最糟糕的主场比赛背后的理论分析。

76 人有望成为 NBA 历史上唯一一支至少赢得 90%主场比赛,输掉超过 2/3 客场比赛的球队。没人知道为什么。本·西蒙斯(CC BY-SA 2.0)BYKA 体育照片

费城 76 人队在主场度过了一个伟大的赛季。NBA 球队在费城南部比赛时的战绩是 28 胜 2 负,胜率为 93%,而在客场比赛时的战绩是 9 胜 23 负,胜率仅为 30%。这 63 个百分点的主客场差距使他们成为 NBA 历史上唯一一支至少赢得 90%主场比赛而输掉超过 2/3 客场比赛的球队。

如何解释这种差异?有据可查,NBA 的主场优势效应是美国四大职业体育联盟常规赛中最大的,在胜率约 60% 。本赛季 60 场比赛后,76 人 93%的主场胜率显然是一个异常值,但他们糟糕的客场表现引发了一个问题:为什么他们在客场表现如此糟糕?

在过去一周的体育分析播客的一集中,统计学和营销学教授凯德·梅西、谢恩·詹森、阿迪·韦纳和埃里克·布拉德洛讨论了 76 人队主场大比分失利的潜在理论(从 17:35 开始):

阿迪·韦纳(AW): 这是有史以来最大的差距之一……【他们的主场优势】难以置信的不同!…超过四个标准误差,太荒谬了!…我不知道这实际上是不是史无前例的,但就概率而言,我没想到会发生这种事,也许以前有过一次?…

凯德·梅西(CM): 那么,这说明了车队的什么?

AW: 这就是其中的奥秘!

CM: 当情况如此严峻时,不可能…我们不可能没有洞察力…

肖恩·詹森(SJ): 他们显然是在偷标语,伙计们!..

我会猜测,这只是一个完整的,没有受过教育的,但可能是正确的猜测,它与谁在玩以及他们实际上是如何玩的结构有关。我认为篮球是最容易受努力影响的运动…在三巨头中…在篮球中,我们可以看到当明星们想上场时,他们就变成了不同的球员!…

SJ: 几周前在《运动》杂志上写了一篇非常有趣的关于负荷管理的文章,当然在篮球领域,我们只是把它作为常规赛的一部分,因为负荷管理是一个巨大的战略…

AW: 我猜负荷管理在某种程度上与 76 人的主场优势有关,因为他们的球星在主场比赛,而我打赌他们不会在客场比赛…

SJ:这是一个至少可以很容易分析的问题,他们是不是在做一种极端版本的负载管理,他们只是在家里不成比例地发挥他们的明星…

很想知道比赛的时间是多少,主客场平分……

AW: 还要努力!…

SJ:……负载管理促使我们让更好的球员在主场比赛,而不是在客场比赛……

总而言之,主持人提出了三种理论:

  1. 76 人的明星球员在客场的上场时间更少。
  2. 76 人的球员在客场花费的精力更少。
  3. 六代移民在作弊。

在这篇文章的剩余部分,我将评估前两个理论,使用来自 NBA.com/stats 的数据来看看这些理论是否有效。显然,最后一个理论是对最近发生的休斯顿太空人队偷牌丑闻的半开玩笑的引用,现在我将让其他人根据需要进行评估!

相反,我将评估我自己的第三个不同的理论:

3.76 人在客场的对手比他们在主场遇到的对手要强大得多。

用于以下分析的数据是从 3 月 1 日周日中午的 NBA.com/stats 收集的,当时 76 人的总战绩为 37 胜 23 负,主场 28 胜 2 负,客场 9 胜 23 负。

分别从Basketball-Reference.com和五三八同时收集历史进度和强度进度数据。

理论 1:76 人的明星球员在客场的上场时间更少

为了确定 76 人队是否正在部署一个极端版本的负荷管理,让他们的明星球员在路上休息,但在主场比赛,我首先看了看主场和客场比赛时间的差异:

比较每个 76 人球员主客场上场时间,按上场时间排序。数据。

在总共出场超过 1000 分钟的 76 人队中,只有两名球员,乔尔·恩比德和马蒂斯·蒂布尔,在主场的出场时间明显多于客场。他们都有大约 55%的时间是在主场而不是在客场。

其他关键球员,像本·西蒙斯和约什·理查德森,实际上更多的时间是在客场,分别只有 48.6%和 46.7%的时间在主场比赛。

平均来说,76 人是不是主场打球星多,客场打球星少?为了确定主场-客场比赛时间差对特定球队的整体影响,我计算了每支球队的分数,对主场比赛多于客场比赛的球员,这一分数会向上调整总得分。如果团队为他们的明星部署这种形式的极端负载管理,我们会在他们调整后的幻想点中看到差异。

举个例子:相对于球队 49.92%的主场率,乔尔·恩比德 55.07%的时间都在主场比赛。*因此,恩比德在主场的表现比预期高出 5.15 个百分点。为了权衡他的主场比赛时间不平衡的影响,我根据他在主场比赛的额外时间调整了他今年的 1,963.2 分。1963.2 *(1+5.15%)=调整后分数 2064.3。为了确定这种加权的绝对效果,我从他调整后的幻想总点数(2,064.3)中减去他的实际幻想总点数(1,963.2),得到 101.1 点的差值。

注:76 人实际上有 50%的时间在主场比赛,但由于某种原因, 总的球员主场出场时间 不等于 总的客场出场时间 。为了说明这种差异,当比较球员主客场分钟和球队主客场分钟时,我将同一球队球员的分钟相加,而不是使用* 报告的球队统计数据

恩比德的幻想总得分和他调整后的幻想总得分之间的差异,我称之为他的**“主场偏差得分”**,在现实中没有任何意义,但确实给了我们一种感觉,如果我们怀疑一支球队在客场让明星球员休息,他在主场比赛的不平衡应该给予多少权重。

对于每个本赛季在 76 人队打球的球员来说,我们可以看到让那个球员在客场休息的效果。恩比德是客场休息的最大受益者,但在某种程度上被其他首发西蒙斯、哈里斯和理查德森抵消了,他们在主场的比赛比客场少:

根据主场得分给每个球员排名。数据。

通过合计所有球员的得分,我们看到 76 人只是略微倾向于让他们的球星更多地在主场比赛,在其他球队中排名中间:

排名每支球队在主场和客场让他们更好的球员上场的次数。数据。

在所有球队中,看起来休斯顿火箭队和波特兰开拓者队最有可能为他们最好的球员部署一种负荷管理形式,让他们在路上休息,尽管差异仍然小到足以成为巧合。

对休斯顿来说,先发球员詹姆斯·哈登和拉塞尔·维斯特布鲁克都有 52%的时间是在主场,而不是在客场:

休斯顿火箭队球员的主客场分钟分裂和主场偏向得分。数据。

由于哈登和威斯布鲁克都在幻想积分所有球员的前 15 名,所以显著扭曲了球队的主场偏差得分。

波特兰的五名先发球员中有四名在主场比赛的时间(49-60%)比球队整体(48%)多:

波特兰开拓者球员的主客场分钟分裂和主场偏向得分。数据。

帕特里克·贝弗利、乔尔·恩比德和詹姆斯·哈登在主场优势得分上领先所有球员,这表明他们可能在客场很轻松。以下是主场优势得分最高的 30 名球员:

根据主场优势得分排名的前 30 名球员,计算为他们的总得分,以他们在主场比赛的分钟数与他们球队主场比赛的分钟数之间的百分比差异加权。数据。

如果你很好奇,以下是前 35 名幻想得分者如何分配他们的主场和客场时间,以及他们最终的主场偏差得分:

前 35 名球员的总幻想点,他们的主客场比赛时间分裂,和他们的计算主场优势得分。数据。

当比较一支球队的主客场胜利百分比差异和他们的主场优势得分时,我们发现实际上没有相关性:

主客场胜率%与主场优势分数的差异。76 人是图表顶部中间的点,他们的主场胜利和主场偏差得分之间有 63 个百分点的差距。

**理论#1 结论:**总的来说,76 人似乎没有比其他球队更多地在客场休息他们的天赋,这足以解释他们主场胜率的差异。恩比德拥有所有球员中第二高的主场偏向得分,当然是一个潜在的异数,但他在客场的相对休息在很大程度上被其他球星在客场比主场打得更多所抵消。总的来说,球队在主场和客场使用顶尖人才似乎与球队在主场和客场的胜率差异没有太大关联。

理论 2:76 人的球员在客场花费更少的精力

为了衡量 76 人是否在客场“尝试更少”,我们不得不求助于一组更主观的统计数据。

回到 2016 年,NBA 开始发布“hustle”统计。这些包括屏幕辅助,偏转,回收球,收费和有争议的投篮。此外,他们已经公布了关于禁区、距离和速度的数据。这些数据是用来衡量一个球队或球员在一场比赛中所付出的努力。

对于上述每个类别,我收集了每支球队每场比赛的主场和客场数据。然后,我把在家时的每场比赛数据和在旅途中的每场比赛数据相除,得出一个比率分数;一支在客场和主场付出同样多努力的球队会得到 1.00 的中性分数。

例如,76 人每场主场比赛平均投篮 54.8 次,而每场客场比赛平均投篮 53.9 次。54.8/53.9 = 1.02 的分数,这表明球队在主场比赛中比在客场比赛中付出更多努力的可能性(尽管更可能是巧合)。

然而,与客场比赛(8.4 分)相比,他们每场主场比赛(8.3 分)回收的松散球略少,得分为 0.99:

按球队选择的每场比赛的主场优势率。比率为 1.00 表示每场比赛球队的主场和客场表现没有差异。高于 1.00 的比率表明在家比在路上花费的精力可能增加(反之亦然)。数据。

当比较所有球队的主场和客场时,76 人并不突出;对于这些统计数据中的大多数,他们排在中间位置:

对所有 30 支球队的主场优势进行排名。数据。

此外,我查看了球队在禁区、距离和速度方面的平均水平,比较了每场比赛主客场的平均水平。这些可能不太能代表努力程度(例如,速度可能是团队和对手比赛风格/节奏的一个属性),但可能表明努力程度存在一些差异。

在这里,76 人再一次相对于其他球队排名中游甚至垫底:

根据 30 支球队的主场优势、球场行进距离和球场速度对他们进行排名。数据。

**理论#2 结论:**根据屏幕助攻、偏转、回收的松散球、冲锋、有争议的投篮、禁区、行进的距离或速度来衡量,相对于其他球队,76 人在主场比赛时似乎没有花费更多的努力。

理论 3:76 人的客场比主场更难对付

为什么 76 人在主场表现更好的第三个可能的解释是,他们只是打弱队,而在客场打强队。

为了验证这个理论,我收集了每个队相对于对手在赛季中每场比赛的预期获胜概率的数据。我使用了 FiveThirtyEight 基于猛禽玩家评级的游戏预测。

由于 NBA 球队众所周知的主场优势,所有球队在客场比赛的平均对手获胜概率都高于主场比赛。但一些球队在客场比在主场与对手的胜算差距更大,这表明赛程更加艰难。按照这个标准,76 人在客场面对的最强对手方面排名中等,30 个中有 14 个:

根据对手主场与客场比赛的平均获胜概率的差异对所有 30 支球队进行排名。数据。

你可能想知道这些数据是否受到球队主场优势差异的影响;例如,丹佛掘金队(和其他丹佛职业运动队)因其比赛地的高海拔而在主场拥有更大的优势,这可能解释了他们在上图中相对较高的排名。然而,FiveThirtyEight 的概率考虑了一般的主场优势、疲劳、旅行和海拔,可能会减少这些影响。举个例子:犹他州也因海拔高而被认为是一个潜在的困难之地,排名仅次于 76 人,这表明在客场比赛时,固有的主场优势可能不是比赛程更重要的因素。

令人惊讶的是,当将一支球队的客场胜率差异与其客场对手的相对实力进行比较时,我们发现没有相关性:

比较一支球队在主场和客场比赛中主客场胜率的差异与对手平均胜率的差异(76 人是最大的点,分别为-25%和 65%)。数据。

我会认为,至少在主场和客场的胜率之间的一些差异是由于对手在主场和客场比赛前的平均获胜概率的差异。

**理论#3 结论:**相对于主场的对手,76 人在客场还没有遇到过不成比例的强劲对手。

那么 76 人的客场之旅背后是什么呢?

这一分析表明:

  1. 平均而言,当考虑明星球员时,76 人的球员在客场比赛的时间更少。
  2. 当通过屏幕辅助,偏转,回收的松散球,冲锋,有争议的投篮,出界,行进距离或速度来衡量时,76 人的球员在路上花费的精力确实而不是少。
  3. 相对于主场的对手,76 人在客场面对的对手更强大。

因此,我们可能需要转向更“模糊”的理论来解释 76 人在客场的挣扎。

二月初,艾尔·霍福德对道路上的模糊“注意力不集中”发表了评论:

我们的更衣室里发生了一些事情,我们会保密的。我们都知道我们需要变得更好。我们需要加快步伐,明天是一个很好的机会。

我们不够专注,尤其是在路上。我们在上半场很专注(对抗热火),然后下半场他们有一点点跑动,出于某种原因我们没能恢复。作为一个团队,我们需要更加专注。我们在客场做得好一点,但我们又回到了糟糕的状态。

蔻驰布雷特·布朗不太相信一个原因:

你看看我们在路上的记录,就像是,‘这怎么可能?’你家里有这个,路上有这个,这是两种不同的性格。…我们有过糟糕的枪战吗?我们有过不好的做法吗?这个团体的精神被污染了,以至于我们不能浏览所有的东西吗?事实并非如此。

(我们的道路斗争)有点神秘…我做这个已经够久了,足以生活在现实世界中。我不能指出任何[理论]是“哦哦。”

那么如何解释 76 人的客场之旅呢?不幸的是,目前答案并不令人满意:这是一个谜。

在你走之前…

如果你喜欢这篇文章,你可能也会喜欢我关于体育和数据的其他文章——给我一个关注,当我发布更多内容时会通知我:

  • 填写三月疯狂的最终指南
  • 我如何正确预测比利亚诺瓦赢得 2018 年 NCAA 男篮锦标赛
  • 我是如何智胜一个 538 预测算法的
  • 我如何使用 200 名专家和 Reddit 的评论排名算法赢得我的 Office NFL Pick'em Pool
  • 2020 梦幻足球拍卖守门员策略综合指南

在煮什么!—用自然语言处理对菜肴进行分类

原文:https://towardsdatascience.com/whats-cooking-categorizing-cuisines-with-nlp-ac44affe6b1d?source=collection_archive---------46-----------------------

学习用于食谱分类的 word2vec 和单词嵌入

凯蒂·史密斯在 Unsplash 上拍照

兴奋地想去旅行,但在疫情却被困在家里?想尝试世界各地的美食却被困在家里?嗯,这是给你的项目!作为一名美食家,这是一个有趣的数据集,了解每种美食的不同特色食材。“什么是烹饪”数据集是来自 20 种不同菜系的食谱列表,任务是为不同的食谱建立一个分类器。在本文中,我将比较理解这个数据集的两种不同方法。

维度的诅咒

在将数据输入机器学习模型之前,第一步是将数据转换成机器学习模型能够使用的定量形式。最简单的方法是使用一键编码,这种技术根据条目是否存在,将列表转换为 1 和 0 的向量。

在这个包含 7137 种成分的数据集中,如果没有额外的处理,事情可能会很快失控。维度过多将使执行操作在计算上更加困难,这将大大延长训练模型所需的时间。这个问题是一个常见的问题,被称为维数灾难。

为了解决这个问题,我们必须将数据投影到一个更低的维度上,这样我们更容易处理。这些低维向量被称为单词向量或单词嵌入,它们本质上是单词含义的数字表示。然后可以将这些单词向量组合起来创建句子向量,或者在这种情况下,创建菜谱向量。为了获得这些配方向量,我们看两种方法,第一种方法是主成分分析,或者使用被称为连续单词包的自然语言模型。

主成分分析

PCA 是一种统计技术,用于将数据集压缩到更低的维度。这是通过找到最高方差的方向,然后将数据投影到这些轴上来实现的。这背后的想法是,方差最大的轴能够保留数据集中的大部分信息,从而最大限度地减少变换到较小维度时的信息损失。

在这个问题的背景下,PCA 可以直接应用于配方向量,而无需学习每种成分的嵌入。原始的大小矩阵被压缩成 32 维,作为配方的嵌入。

自然语言处理方法

自然语言处理领域的一个巨大突破是 word2vec 的出现,这是一种可以将单词的意思转换为计算机可以理解的数字向量表示的系统方法。著名的等式“女王-女人+男人=国王”向我们展示了精确的单词向量如何能够有效地捕捉单词的语义。

word2vec 的单词类比

用于生成该单词向量的一种常见模型是连续单词袋(CBOW)模型,该模型使用相邻单词(上下文单词)来学习不同单词之间的关联。

CBOW 模型架构。谷歌图片

在第一部分中,该模型通过编码器传递上下文单词的独热向量,以将其转换到较低的维度。然后将这些向量相加,得到我们正在寻找的 32-D 嵌入向量。然后,模型的下一部分将尝试将该低维嵌入向量转换回目标单词的独热码编码向量。正如所预期的,从嵌入向量重建一位热码向量将不是完美的,并且两个向量之间的误差将通过模型反向传播。在连续的学习时期之后,该模型将能够将一次性向量转换为嵌入向量,同时保留尽可能多的信息。

如果你有兴趣了解更多,你可以看看这篇解释其他模型的文章这里或者对于那些想深入研究数学的人来说,这里的注释相当不错。

然而,与句子不同的是,配方中的配料本质上是无序的,不是采用配方中的相邻配料,而是从整个配料列表中随机抽取上下文配料。训练数据集也每 5 个时期重新采样,以学习尽可能多的关联。

def sample(recipe,ingredient,samples):
    recipe = recipe[:]
    recipe.remove(ingredient)
    if len(recipe) < CONTEXT_SIZE+1:
        context = random.choices(recipe, k=samples) 
    else: 
        context = random.sample(recipe, k=samples) 
    return context

在找到模型训练的最佳学习速率后,CBOW 模型被训练 60 个时期,其中数据每 5 个时期被混洗一次。这导致损失函数每 5 个时期增加,因为模型必须适应新的混洗数据,这将有希望允许它更好地概括。

一旦我们使用这种技术获得了单词嵌入,我们就可以对它们做一些初步的评估。观察这些向量的定量方法是找出我们期望相似的向量之间的相似性。比如酱油和鸡肉的相似度要明显高于酱油和牛奶。这可以使用余弦相似性来评估,余弦相似性测量两个向量之间的角度的余弦。指向相似方向的向量将具有接近 1 的余弦相似性,而不同的向量应该具有接近-1 的相似性。

估价

回到手头的任务,我们更感兴趣的是分类食谱,而不是成分向量。对配方中的所有成分进行平均将得到配方向量,然后我们可以将该向量与从 PCA 获得的配方向量进行比较。评估这两个模型的定性方法是将它们在二维空间中可视化。然后,我们可以观察不同菜系的食谱之间的区别,以评估算法的有效性。

我们可以做到这一点的方法是使用 t-SNE 一种流形降维工具,它对于绘制高维空间非常有用。根据从两种技术获得的 32-D 向量,对两者执行 t-SNE 以获得 2-D 图。

NLP 模型(左)和 PCA 模型(右)的比较

显然,我们看到从我们的 NLP 模型获得的图比预期的 PCA 模型表现得好得多。与 PCA 相比,CBOW 模型等神经网络可以学习更多的高维特征,我们可以从图中更好的分离看出这一点。同时,这些情节可以为不同的美食提供有价值的见解。从图中我们可以看出,墨西哥菜和印度菜形成了一个非常独特的群体,而希腊菜和美国南方菜则更加分散,这表明它们融合了更多种类的食材。从每个集群之间的距离,我们也可以比较不同美食的相似之处。正如所料,日本,中国和泰国聚集在一起,而希腊,意大利和法国美食形成另一个相反的一端集群。看看你还能从这些数据中获得什么见解!

Github 链接:https://github.com/reoneo97/Whats_Cooking

在 LinkedIn 上联系我:【https://www.linkedin.com/in/reo-neo/

过去一个月,数据科学就业市场发生了什么变化

原文:https://towardsdatascience.com/whats-happened-to-the-data-science-job-market-in-the-past-month-88c748a4cd25?source=collection_archive---------0-----------------------

据 Recode 报道,美国招聘信息发布在。

我在的一家公司工作,免费指导数据科学家,直到他们被聘用。因为我们只有在我们的数据科学家被雇用时才能赚钱,所以我们可以非常详细地了解北美数据科学就业市场及其实时发展情况。我们知道谁在哪里被雇佣,他们的工资是多少,雇佣谈判过程的细节,以及许多其他数据。

在这篇文章中,我将分析过去一个月我们在数据科学就业市场上看到的情况。我最初在上周的 tweetstorm 上发布了一些信息,但我会在这篇文章中更详细地介绍。

以下所有统计数据均基于我们导师计划的内部数据。我们密切跟踪我们的学员在哪里、何时以及由谁聘用。对更广泛的数据科学就业市场的推断不会完美,但基于我们的规模和地理范围,应该非常接近。

招聘放缓📉

三月份,数据科学家的招聘普遍放缓,降幅约为 60-70%。实际上,我们预计招聘会暂时降为零,但事实并非如此——至少目前还没有。

这次经济放缓的影响非常不均衡。依赖客流量的公司(如时装零售商)受到了沉重的打击,他们正在冻结招聘,进行裁员或休假。像 Twilio 和 Airtable 这样的 B2B 软件公司基本上都在正常招聘。像 Slack 和 Zoom 这样的远程工作使能器正在加速招聘。

到目前为止,我们已经看到,与三月份同期相比,四月份有更多的学员被录用。但现在还是月初,事情变化很快。

工作机会被撤回📃

三月份,我们看到几份最终确定的工作邀请在没有通知的情况下被撤回。这意味着实际的、签署的协议——来自公司的承诺,比如“你的工资是 x 万美元,你从周一开始工作。”。欢迎登机!”——被拉了回来。这是前所未有的:在 3 月份之前的 18 个月里,这种情况为零。

一些撤回报价的公司是初创公司;其他的是你肯定听说过的大公司。我们不可能预测谁会撤回提议,谁不会。小心这个。

到目前为止,在 4 月份,我们还没有看到更多这样的撤资。我们怀疑大多数公司现在已经调整了他们的招聘计划,所以这种事情会越来越少。

解雇😬

裁员还没有打击太多的数据科学家。到目前为止,只有 3%的校友受到了影响。这既包括临时休假,也包括不算裁员的减薪。

裁员的时候,大部分公司早裁,一次裁,深裁。这有助于减少留下来的员工的不确定性和风险。如果你的公司使用这种策略,并且你熬过了第一轮裁员,你的工作在中期内更有可能是稳定的。

如果你担心被解雇,你的第一道防线就是让成为不可或缺的。想办法为公司省钱并增加价值,即使这超出了你的工作范围——不被要求就去做。大多数公司都不希望裁员。你带来的价值越多,你就越有可能留下来。

(**公司:**如果你需要削减工资,请考虑临时休假,而不是直接解雇员工。这将给你的员工一个仍然拥有工作的机会,加上寻找新工作的灵活性。这样做是对的。)

工作申请📨

你现在看到的几个职位都是无用的。许多公司因为 COVID 取消了内部职位,但还没有删除他们的职位。通过求职公告板申请从来都不是一个好策略,但是现在因为这些无用的职位而变得更加困难。

由于显而易见的原因,面对面的交流也是不可能的。

效果更好的是冷邮件和 LinkedIn 外联。要真正做好这些,需要很多细节,但简单来说就是:1)对公司做研究;2)发送一条深思熟虑、精心制作的信息;3)谈论你已经建立或完成的具体事情。

有趣的是,一个人是否会回复你冰冷的电子邮件或 LinkedIn 信息的一个重要因素是这个人是否有孩子。没有孩子的人通常在家很无聊,更有可能回答;有孩子的人正忙着照顾他们,因为日托也不在考虑范围内了。

在线聚会也可能是一个很好的社交渠道。我们对此还不确定,现在说还为时过早。但我们的一些学员正在积极尝试。

视频采访👨‍💻

如果你得到了面试机会,你很可能会在 Zoom 上接受面试。Zoom 是一个非常稳定的视频平台,但仍然要确保你的互联网连接是牢固的。如果你没有很好的关系,在面试开始时提到这一点也没关系。大多数面试官会理解你,放你一马。

(Zoom 曾经有一个设置,告诉会议组织者你在屏幕上看的是什么,这在求职面试中是一个短暂的因素。幸运的是,他们最近移除了它。)

到处都很偏僻🌎

好消息是:**几乎所有的工作都突然变得遥远了。**地理障碍一夜之间消失了。你现在可以申请比以前多得多的公司。这对农村地区的人们来说尤其重要,它在很多方面都是公平的。

这就是我们目前所看到的,但我们仍处于这个疫情的早期。很难预测未来几个月会发生什么,但目前,获得一份数据科学的工作很难,但并非不可能。诀窍是找到那些没有被锁定打击太大的公司。

如果你想得到如何在 DS 就业市场导航的建议——特别是在北美——请在 Twitter 上关注我,我会尽力帮助你。

祝大家好运。❤️

一句话里有什么?

原文:https://towardsdatascience.com/whats-in-a-word-da7373a8ccb?source=collection_archive---------20-----------------------

入门指南

为什么 tf-idf 有时不能准确捕捉单词的重要性,我们可以用什么来代替

TL;DR:Term Frequency-Inverse Document Frequency(TD-IDF)是一个强大而有用的工具,但它有一些缺点,导致它对相对重要的词赋予较低的值,在大范围内过于敏感,在密集范围内过于抗拒。一个更纯粹的比例方法改善了这些问题。

由安妮·斯普拉特在 Unsplash 上拍摄

目录

  • TF-IDF 简介
  • 弊端
  • 比例重要性
  • 进行珠宝案例研究
  • 结论

TF-IDF 简介

正如我向任何对文本分析感兴趣的人推荐的那样,我最近在通读朱莉娅·西尔格和大卫·罗宾逊的优秀著作《与 R 一起进行文本挖掘》。在那本书中,他们有一章讲述了如何使用一种叫做“词频-逆文档频率”(tf-idf)的统计方法来量化给定文档中哪些词相对重要。在阅读那一章之前,我当然看过甚至使用过 tf-idf,但是说实话,我从来没有真正质疑过它。我知道这是一个简单而强大的工具,可用于各种应用程序,所以我只是简单地继续使用它,没有想太多。

然而,读完那一章,更仔细地考虑它是如何计算的,我开始意识到,也许有比我以前认为的更多的理由来质疑它。事实上,我注意到了两个相当重要的缺点,正如我将要展示的,它们可以有意义地改变一个分析。

但是在讨论这些缺点之前,我应该简单解释一下 tf-idf 的实际目标是测量什么以及如何计算。

tf-idf 的目标是量化一个感兴趣的单词对于文档集合中的一个给定文档有多重要。

它这样做的方式很简单。它将给定单词在给定文档中出现的频率(术语频率)乘以该单词在其他文档中出现的次数(逆文档频率)。经常在文档 A 中出现并且在很少或没有其他文档中出现的单词将为该文档获得高值,而在文档 A 中不常见和/或在许多其他文档中出现的单词将为文档 A 获得低值

在数学上,这是通过将术语频率(给定文档中由感兴趣的单词组成的单词的比例)乘以逆文档频率(分析中文档数量的自然对数除以感兴趣的单词出现的文档数量)来完成的。

正如我上面提到的,这是一个简单而强大的工具,通常可以很好地估计语料库中哪些词定义了文档。然而,它有两个具体问题。

缺点

paweczerwi ski 在 Unsplash 上的照片

首先,我称之为“零价值问题”,它源于逆文档频率计算。通过构造,如果感兴趣的单词出现在所有文档中,则 tf-idf 值将为零;分析中的文档数与该单词出现的文档数之比为 1,1 的自然对数为零。这意味着这个词对于任何给定的文档都不是唯一重要的。

在许多情况下,这可能是合理的:如果一个词出现在任何地方,它在任何地方都不是唯一的,这一想法似乎是一个可靠的启发。然而,在有些情况下,这给分析带来了有意义的挑战,在我看来,分配的重要性是不正确的低。

要了解这是如何造成问题的,请考虑下面的场景。假设我们有三个文档:A、B 和 c。假设我们想获得文档 A 中单词“apple”的 tf-idf 值,并假设 apple 构成了该文档中整整 75%的单词。如果苹果只在文档 B 中出现过一次,而在文档 C 中根本没有出现,那么 tf-idf 值就应该很高。然而,如果苹果只在文档 B C 中出现一次,tf-idf 就会一路跌到。尽管唯一的变化是 apple 现在再次出现在文档 A 之外,尽管文档 A 几乎完全由单词 apple 组成,但是 tf-idf 统计数据从相对较高的值骤降到零。这是一个不受欢迎的衡量标准,因为它表明这两个案例远比实际情况不同,也因为它表明苹果对 A 并不是唯一重要的,尽管它显然是重要的。

第二个缺点与第一个相似,我称之为“广泛的保证金问题”。这是因为 tf-idf 的逆文档频率部分没有考虑一个单词在其他文档中出现的频率(密集边距),而只是考虑它是否出现(广泛边距)。这导致它在广泛边际上有变化时过度敏感,而在密集边际上有变化时过度抵制变化,尽管后者可能更重要。

要了解这一点,请考虑上面的相同设置,这一次 apple 占了文档 a 中 10%的单词,如果 apple 根本没有出现在文档 B 中,tf-idf 值会相对较高。然而,如果它只在 B 中出现一次,值就会急剧下降(尽管只要它不在 C 中出现,就不会降到零)。尽管这两个场景几乎相同,唯一的变化是苹果的外观增加了一个,但价值发生了巨大的变化,这都是因为这种变化是在广泛的范围内发生的(即苹果从没有外部文档变为有外部文档)。当然,在实践中,apple 这个词在文档 a 之外只出现一次或者根本不出现没有什么区别。但是 tf-idf 认为这两种情况是完全不同的。

另一方面,如果苹果从只在文档 B 中出现一次,变成几乎 100%地使用文档中的文字,tf-idf 也不会有任何改变。也就是说,这个词在文档 B 中出现多少次并不重要,因为 tf-idf 忽略了密集边距。重要的是它是否出现。然而,如果我们的目标是获得一个指示相对重要性的度量,那么区分这些场景是非常关键的。在前者中,与 B 相比,苹果对文档 A 相对重要(只在 B 中出现一次),而在后者中,相对于它对文档 B 的重要性(100%的单词),苹果对文档 A 根本不是唯一重要的(10%的单词)。然而,tf-idf 认为没有什么不同。

概括一下:零值问题意味着如果感兴趣的词出现在所有外部文档中,即使它只在每个文档中出现一次,tf-idf 也会突然降到零。大范围裕度问题意味着,当大范围裕度上有较小的和相对不重要的变化时,tf-idf 会有显著的不同,但当大范围裕度上有变化时,即使是实质性的变化,TF-IDF 也不会有任何不同。

我们能做些什么呢?

比例重要性

由真诚媒体在 Unsplash 上拍摄

输入:比例重要性。

比例重要性是我试图提出的一种方法,它同样能告诉我们一个给定的单词对于一个给定的文档是否既重要又独特,而没有 tf-idf 的缺点。我将指出,这是可能的,甚至可能类似或相同的事情以前已经做过。我没有亲眼见过,但尽管如此,我并不声称自己是第一个想到这种方法的人。记住这一点,让我来解释这个方法。

背后的想法很简单。为了计算给定文档中给定单词的比例重要性,我只需查看该文档中由感兴趣的单词组成的总单词的比例,并减去由感兴趣的单词组成的该文档之外的单词的比例。

这有点拗口,所以让我们看一个例子。使用与上面相同的场景,我的测量将采用文档 A 中由苹果公司创造的单词的比例,并从中减去 B 和 C 中由苹果公司创造的单词的比例。因此,如果文档 A 中有 50%的单词是苹果,而 B 和 C 中有 20%的单词是苹果,那么苹果在文档 A 中的重要性比例就是 0.3(30%)。请注意,与 tf-idf 不同,此度量可能会变为负值。负值只是表示该单词在给定文档外部比在文档内部更常见。

这种简单的方法既解决了零值问题,也解决了广泛的利润问题。对于零值问题,如果苹果占文档 A 的 50%,并且只在 B 和 C 中出现一次,那么比例重要性将正确地保持苹果在文档 A 中的高值,而 tf-idf 统计的值将为零。

对于扩展边距问题,如果我们保持文档 A 中由 apple 构成的单词比例不变,那么在 apple 构成文档 B 中 1%的单词的情况下,与 apple 构成文档 B 中 0%的单词的情况相比,比例重要性将相差很小。它会将这两种情况视为相似,忽略扩展边距上的微小变化。另一方面,同样假设苹果在文档中的流行度为常数,比例重要性将在苹果占文档 B 中 1%的单词的情况下与苹果占文档 B 中 50%的单词的情况下有很大不同。考虑到密集边界的变化,比例重要性将把这两种情况视为完全不同。

运行珠宝案例研究

这在理论上似乎是合理的,但我想看到它的行动。为了做到这一点,我看了一下由黑仔·迈克和埃尔-P 组成的嘻哈二人组“奔跑吧珠宝”的唱片目录。这对组合已经发行了四张专辑:奔跑吧珠宝、奔跑吧珠宝 2、奔跑吧珠宝 3 和奔跑吧珠宝 4。我把每个都缩短为“RTJ”和数字。

为了获得用于分析的数据,我在 r 中使用了、和包,然后使用包将这些原始数据转换成可供分析的“整洁”形式。最后,在开始实际分析之前,我使用 SMART、snowball 和 onix 词典删除了所谓的“停用词”,比如“the”和“for”。

准备好数据后,我开始使用包计算每个单词-相册对的 tf-idf 值。下图显示了 tf-idf 测量的专辑中最重要的前十个单词(由于平局,一些专辑有超过 10 个单词)。

歌迷们会意识到,许多歌词是由专辑中特别独特的歌曲驱动的(这一点我希望在未来的帖子中再次提到)。例如,《奔跑吧珠宝》中的歌曲 Sea Legs 不出所料地包含了 Sea 和 Legs 这两个词,这两个词在其他任何专辑中都没有出现过。因此,这两个词在该专辑中都获得了较高的 tf-idf 分数。类似的模式也出现在《RTJ 2》中的单词 steal 和 check(来自歌曲 Lie Cheat Steal)和《RTJ 3》中的单词 garden(来自歌曲 Call Ticketron,在这首歌中,他们唱的是在麦迪逊广场花园表演)。

一个独立但同样有趣的模式是,与以前的专辑相比,像“是”、“是”和“哦”这样的表达在他们最近的专辑《RTJ 4》中尤为重要。

记住这些有趣的模式后,下一步是用我的衡量标准,比例重要性,来看看哪些单词被列为重要的。请注意,我将该图的度量从比例转换为百分比。

一些相似之处是显而易见的,《RTJ》中出现了《海与腿》(尽管重要性降低了),而《RTJ 3》中出现了《花园》。然而,有 21 个词没有被 tf-idf 列为重要的词,我的衡量标准表明它们实际上是专辑中最重要的十个词之一。

其中一些差异相对较小。RTJ2 中的“偷”和“骗”以及 RTJ 3 中的“布迈耶”没有出现在排行榜上,因为虽然它们确实是专辑中独有的,但实际上它们对他们来说并不那么重要,每个都被使用了 8 到 9 次。鉴于这种缺乏内在重要性的情况,我的衡量标准没有考虑它们。

更有意思的是度量之间的主要变化,这表明了相对重要性如何在 tf-idf 上得到提高。

一个很大的变化立即引起了我的注意,虽然 kill 根本没有出现在 tf-idf 的《RTJ 3》最重要的十个单词中,但它实际上按照重要性比例被列为专辑中最重要的单词。这确实是一个巨大的差异。然而,只要看一看基础数据,就能立即弄清楚为什么会出现这种情况。

Kill 在《RTJ 3》中出现了 97 次,几乎占了专辑中所有不间断单词的 3%。它不仅在专辑中很重要,而且相对来说也是独一无二的,在《RTJ 3》中比在专辑中多出现了整整 6 次,它出现的频率位居第二(《RTJ 2》)。因此,它的比例重要性值很高。

然而,正如我们在表中看到的,tf-idf 值实际上是,这表明这个词对专辑来说一点也不独特或重要。怎么回事?归结起来就是零值问题。因为 kill 在所有四个专辑中至少出现一次,所以逆文档频率为零,因此 tf-idf 分数本身为零。尽管这个词在《RTJ 3》中既重要又相对独特,但还是出现了这种情况。

在 tf-idf 中,RTJ 的“嘿”和 RTJ 2 中的“跑”也会出现同样的问题。和“kill”一样,这两个词都没有被 tf-idf 列为重要词,但它们都被列为专辑中最重要的词。就像“kill”一样,这种差异是有棱有角的,因为这两个词在所有专辑中都至少出现过一次。因此,尽管这两个词在他们给定的专辑中很常见并且相对独特,但他们在 tf-idf 中的得分为零。

事实上,对于比例重要性和 tf-idf 不一致的超过一半的单词(11 ),原因是 tf-idf 测量的零值问题。这证明我的方法确实改善了 tf-idf 面临的零值问题。

广泛的保证金问题呢?RTJ 4 中的“奴隶”一词显示了我的措施是如何应对这一挑战的。虽然比跑或杀更微妙,奴隶同样没有出现在《RTJ 4》中关于 tf-idf 的前十个词中,但却有相应的重要性。同样,原始数据有助于解释为什么会这样。

Slave 在《RTJ 4》中出现得有点频繁(虽然不是压倒性的),在其他地方很少出现。事实上,大约 90%的“奴隶”出现在《RTJ 4》中,只有两次在专辑外提到它(一次在《RTJ 2》,一次在《RTJ 3》)。因此,我的衡量标准认为它对 RTJ 协议 4 非常重要。另一方面,对于 tf-idf,由于它在 4 张专辑中的 3 张专辑中至少出现一次(即使只是一次),所以该值较低(0.002)。

为了显示 tf-idf 处理这种情况的脆弱性,考虑一下当我简单地删除 RTJ 4 之外的 slave 的两个实例并重新计算时会发生什么。tf-idf 统计不仅翻了三倍达到 0.008,而且成为《RTJ 4》中任何单词的第三高*分数。换句话说,这个词从甚至不在最重要的十个词之列变成了第三名。尽管奴隶出现在 RTJ 4 之外两次和没有出现两次之间几乎没有实际差别,这种情况还是发生了。这是 tf-idf 在大范围内过度敏感的一个很好的例子。*

另一方面,如果你增加奴隶出现在 RTJ 4 之外的次数,比如 400 次,tf-idf 的统计数据不会改变,仍然是 0.002!尽管这个词在第一种情况下对 RTJ 4 来说有些重要和独特,但在第二种情况下却一点也不独特,tf-idf 的统计数据并没有改变。这证明了我上面所讨论的:tf-idf 不仅在广泛的边界变化时过度敏感(该词出现在外部相册中的数量从零到一个或两个),而且在密集的边界变化时过度抵制变化(当外部提及的总数从两个到数百个)。

我的比例重要性度量更好地处理了这种情况。它承认 slave 确实对 RTJ 4 非常重要,但没有赋予过高的价值,因为它也承认虽然独特,但对专辑并不特别重要(只占总字数的 0.5%)。此外,当 slave 出现在 RTJ 4 之外的次数从 2 到 0 时,它正确地指出这是一个小变化。另一方面,当外部出现的数量急剧增加时,它变得非常消极,正确地表明奴隶对于 RTJ 4 已经变得相对不重要。

这些发现同样适用于其他单词,比如《RTJ 2》中的“holding”。事实上,tf-idf 对这个词的大范围变化比对 slave 更敏感。简单地除去《RTJ 2》之外的两次出现,tf-idf 的统计数据从甚至不在前十名变成专辑中任何词的最高*。也就是说,仅仅通过删除这个词的两个外部实例,tf-idf 就从在《RTJ 2》中说持有基本上不重要变成了字面上最重要的词。同样,我的措施以一种更有分寸的方式处理这种情况。它给它一个中等的值,因为它认识到虽然这个词对《RTJ 2》非常重要(在这张专辑中出现的次数是其他专辑的 19 倍),但它对整个专辑并不特别重要(只占单词总数的 0.7%)。*

最终,这个案例研究证明了比例重要性确实实现了我为它设定的目标。在许多方面,它反映了 tf-idf,捕捉了许多相同的单词,并将它们列为重要单词。然而,它避免了 tf-idf 的主要缺点:它不会突然逐步下降到零,它不会对广泛边际的变化过于敏感,它不会忽略密集边际的变化。

结论

这一切给我们带来了什么?当然,这并不是说 tf-idf 是无用的,应该被完全抛弃。这不会发生,也不应该发生。一般来说,这是一个有用的统计数据,我发现的问题通常只发生在边缘情况下。

相反,我写这篇文章只是为了建议分析师和研究人员在使用这种方法时应该谨慎行事,承认它的缺点以及它们可能如何和何时改变分析。就在上面的小案例研究中,当我切换到比例重要性时,最重要的词的组成发生了一些戏剧性的变化,并且以一种提出关于 tf-idf 的问题的方式这样做。事实上,这种转变肯定大到足以改变分析的结论。

就比例重要性而言,我写这篇文章也不是暗示它将取代 tf-idf。我强烈怀疑它不会,这没关系。也就是说,我真的希望我已经让你相信它是一个强大的工具,反映了 tf-idf 的优点并减轻了它的缺点,我很乐意分享我用来计算它的代码(代码仍在开发中。它完成了工作,但是还没有优化速度。

当我等待成百上千的关于比例重要性的消息涌入时,我会简单地说祝你文本挖掘愉快!

数据里面有什么!

原文:https://towardsdatascience.com/whats-inside-the-data-aadbb28ba8cd?source=collection_archive---------64-----------------------

预处理、EDA 和特征工程

弗兰基·查马基在 Unsplash 上拍摄的照片

信不信由你,这部分占了整个 ML 工作的 60-70 %!我不会在这里谈论代码,因为我相信如果你知道逻辑,找到一个代码并不是超级困难的,只是到那里会因人而异。获得代码的地方有 StackOverflow、Kaggle、Github 或 Google 上任何有助于实现这种逻辑的地方!

相反,让我们谈谈作为数据科学家在进行初始分析时要记住的一般逻辑/概念。这将包括整理数据,理解背后不同的模式,等等

可以去翻翻我的上一篇了解一下**“我从哪里开始学 ML”**,适合初学者或者任何不同背景想学 ML 的人。

整理数据

数据清理数据清理是从记录集、表或数据库中检测并纠正(或删除)损坏或不准确的记录的过程,是指识别数据中不完整、不正确、不准确或不相关的部分,然后替换、修改或删除脏的或粗糙的数据。——(来源——维基百科)。

为什么我们需要清理数据?让我们看看下面的例子:

来源: Pablo Sanchez 通过quandare

在这个“脏数据”的小例子中有许多问题。

  1. ID 列(应该是主键)应该有唯一的值,但是有个重复记录
  2. 日期列有不同的日期格式,这使得后面在一个层次上的分析变得困难。
  3. 在某些列中有个缺失记录
  4. 相同的名字有不同的拼写或打字错误。

这些只是数据如何变脏的几个例子。也可能有其他东西会弄乱数据,应该被删除。所以在分析数据之前,清理数据是非常重要的一部分。

现在,你知道数据是混乱的,那么你如何修复它呢?

  1. 最好的情况→与消息来源谈谈,看他们能否帮你清理数据。
  2. 如果那是不可能的,那么你必须自己做。数据中不同类型的错误可以基于用例和数据集类型以多种方式修复
  3. 重复行可以在某些级别(例如在学生级别、城市级别或教师级别)进行聚合,以创建唯一的记录。
  4. 不同格式日期、数字、收入、分数等。应采用相同的格式,以适用者为准。
  5. 如果有人填写作为数据来源的表格,打字错误是不可避免的。但是,从长远来看,使这种数据输入系统自动化有助于更好地获取数据。
  6. 缺失记录——根据缺失项目值和用例的列,有多种填写方式。

a.你可以用一个普通的值来填充(比如 0 或者 9999 或者“:”),

b.使用整个列的平均值/中值

c.使用先进的方法,如 KNN(k-最近邻)或,

d.如果没什么区别,就让它保持原样。

一旦所有不同的数据集都清理干净,你需要**把它们放在一起。**因为对于机器学习来说,如果我们有一个大文件,就更容易输入到模型中。

一旦数据清理到一定程度,我们就可以进入下一步了。

理解背后的模式

一旦我们清理了数据,我们就可以开始分析它了。分析是可以从数据中收集到的任何有用的发现/见解。例如,如果你可以将你的整个人生放入数据中(从你出生的第一天到你今天午餐吃了什么),我们从中选取一个随机样本,你可以获得的一些见解可能是:

来源:作者

  1. 你今年吃了多少汉堡?其中,你吃了多少薯条?
  2. 你和朋友一起吃过几次饭?
  3. 当你和你的朋友在一起的时候,你吃了多少次汉堡?诸如此类的事情。

为什么分析是必要的?它帮助我们理解**“我们有足够的样本/特征来解决最终问题吗”**?

我们可以了解数据中的不同模式,或者多个列如何相互关联,或者不同级别的发现—就像在这个示例中,我们可以在天/月级别、食物类型、使用的交通工具等方面获取数据。它还可以帮助我们删除对我们的查找不必要的列。我将在下一篇博客中详细解释这个步骤,并附上代码和示例。

特征工程

特征属性列==维度

特征工程是指操纵/改变特征以创造新的特征。为什么这很重要?因为这有助于我们展现数据的不同属性。

例如-地址包含:伦敦贝克街 221b 号。我们可以溶解这个列以带出更多的值 —城市、街道、公寓#。类似地,生日“1994 年 1 月 21 日”可以分解成日期、月份、年份、一年中的某一天、一年中的某一周等。这些新栏目比原来的功能更有意义。

另一个例子,如果整个数据集是伦敦的,我们可以删除新创建的城市列,因为它**不会增加任何附加值。**类似地,如果我们有一个年龄列,并且添加了与出生日期列相同的值,我们可以删除其中的一个。

以上两种方法都是特征工程的例子。还有其他方法来创建新的功能,你可以添加滞后,做一个总收入/累计总收入,列的平均值/中值,不同类别的计数等。因此,通过这种方式,我们可以创建许多功能来帮助模型很好地理解和预测数据。

但是,有一个东西是我在读硕士期间碰到的——**“维度的诅咒”。**这暗示了拥有大量维度实际上并不好。那我们该怎么办?嗯,曾经有一件简单的事情要做:
a .没有给数据增加任何价值的列应该被删除。
b .应删除暗示相同细节的多列。

除此之外,我们还有其他方法可以自动为模型选择最佳列,如特征重要性、SHAP 等。但是我们将在创建模型的阶段讨论它们!:)在此之前,享受预处理数据,并让我知道你的反馈!

ICLR 2020 大会上的变形金刚有什么新内容?

原文:https://towardsdatascience.com/whats-new-for-transformers-at-the-iclr-2020-conference-4285a4294792?source=collection_archive---------33-----------------------

变形金刚是一种基于注意力的神经架构,它在推出后将 NLP 领域推向了新的高度。国际学习代表会议有大量的相关出版物,所以这里有一个相关出版物的精选集,可以帮助你浏览它们。

学习表示国际会议(ICLR)是机器学习社区最受欢迎的舞台之一。如今,该领域的会议通常作为高质量的商标,并成为已经存在于预印服务器中的出版物的焦点。尽管如此,呈现的工作量越来越大,这使得它很难跟上。

在 Zeta Alpha ,我们密切关注自然语言处理(NLP)和信息检索(IR)研究的前沿。本着这种精神,在我们的语义搜索引擎的帮助下,我们从 40 多篇论文中精选了 9 篇!—从三个主要角度与亮相 ICLR 2020 的变形金刚有关:建筑修改、培训创新和衍生应用。尽情享受吧!

🏛建筑修订

了解最新的变形金刚模型。

1. ALBERT:用于语言表达自我监督学习的 Lite BERT|ICLR 会议

变压器在很大程度上变得过度参数化,因为这是在几个 NLP 任务中实现最先进水平的成功秘诀。或者,ALBERT 是一个已经很有影响力的例子,说明了如何在保持让 BERT 出名的令人印象深刻的性能的同时,减少它对资源的消耗。

这些优化包括:

  • 因式分解嵌入参数化:通过使用不同于文字块嵌入尺寸的隐藏尺寸,嵌入参数化可以因式分解,将其尺寸从 O(Vocab × Hidden)减小到 O(Vocab × Emb + Emb × Hidden),如果隐藏≫ Emb,这可能是实质性的。
  • 跨层参数化共享:为不同的变换块重用参数,如 FFN 和/或注意力权重。
  • 句子排序目标:作者认为从原始 BERT 中预测下一个句子不够有挑战性,引入了这个新的句子级自我监督目标。

结果如何?与 BERT-large 相比,参数少 18 倍,性能相当,推理速度略快。

2.改革者:高效的变压器 | ICLR 会议

早期转换器的一个限制是注意力机制的计算复杂度与序列长度成二次方关系。这项工作引入了一些技巧,以允许更有效的计算,这使得对更长的序列(从 512 到 64k!).为此,该模型的主干包括:

  • 允许在整个模型中仅存储激活的单个副本的可逆层。
  • 使用位置敏感散列法(LSH) 通过快速最近邻居来近似注意力计算。这就用 O(L log L)代替了注意层中的 O(L)因子。

来源:重整器:高效变压器

3.Lite Transformer with Long-Short Range Attention(LSRA)|ICLR 时段

这里有另一个提议,通过强加他们所谓的“移动约束”来克服变压器中的长距离依赖性和高资源需求。这一次,他们对短期依赖使用卷积,对长期依赖使用选择性注意力,创造了一个新的更有效的变压器 LSRA 积木。

虽然结果无法与其他成熟的旗舰变形金刚相提并论,但其有原则的架构设计和深思熟虑的动机使其值得一提。

来源:带长短程注意的 Lite 变压器(LSRA)

优秀奖 : 变压器-XH ,深度自适应变压器,压缩变压器。

🧠关于学习

模特如何学习和模特看起来如何一样重要,所以这里有一些令人耳目一新的出版物,推动了变形金刚如何学习的界限。

1.伊莱克特拉:预先训练文本编码器作为鉴别器而不是生成器 | ICLR 会议

自引入 BERT 以来,掩蔽语言建模(MLM)一直是模型预训练目标的学习基础。本文提出了一种更便宜、更快速的替代方案:替代令牌检测。

主要想法非常简单:不是让模型猜测屏蔽的令牌,而是需要区分哪些令牌被一个小型生成器网络所取代,该网络提出了看似合理但错误的令牌。作者声称,这个目标比 MLM 更有样本效率,因为任务是在所有序列上定义的,而不仅仅是屏蔽的标记。如果这些结果证明自己很容易重现,这项任务有可能成为无监督预训练的新标准。

来源: ELECTRA:预训练文本编码器作为鉴别器而不是生成器

2. TabFact:用于基于表的事实验证的大规模数据集 | ICLR 会议

随着现代变压器缩小与人类性能的差距,许多经典的 NLP 数据集正在变得过时,这意味着需要创建新的更具挑战性的基准来刺激进步。在这种情况下,提出了一种新的数据集来解决对用自然语言表达的基于事实的信息进行建模的问题。

它由来自维基百科的 16k 个表格和 18k 个人类陈述组成,带有引用事实数据的ENTAILMENTREFUTED标签。基线的性能仍然一般,所以这是一个激动人心的创新解决这个任务的时刻!

来源: TabFact:用于基于表的事实验证的大规模数据集

3.预训练百科:弱监督知识-预训练语言模型 | ICLR 会议

这项工作没有采用传统的 MLM 目标,而是从稍微更加结构化的数据中探索自我监督训练的力量:维基百科及其实体。它们用其他相似类型的实体替换文本中的实体( a la ELECTRA),模型学习通过上下文辨别被替换的实例。使用这种方法,模型被迫学习关于真实世界实体及其关系的信息。

当在预训练中将该任务与经典 MLM 相结合时,它导致零射击事实完成的性能的显著提高,以及以实体为中心的任务(如问题回答和实体打字)的性能的改善。

优秀奖: 一种语言表征学习的互信息最大化视角;用频谱控制改善神经语言生成;深度学习大批量优化:76 分钟训练 BERT。

🤖分拆用途

变形金刚不仅仅是语言建模。以下是一些作品,巧妙地利用这些模型的力量来解决相关问题。

1. BERTScore:使用 BERT 评估文本生成 | ICLR 会议

在松散定义的环境下客观地测量质量(即生成连贯的文本)本质上是具有挑战性的。在语言中,BLUE score 被广泛用作文本相似性的代理,它与人类对文本生成任务(如翻译或问答)的判断有很好的相关性,但它仍然远非完美。

这项工作解决了这个问题,并展示了如何为序列对设计一个基于 Bert 的评分函数,用于文本生成,使与人类判断更好地关联。该过程非常简单,不涉及任何微调:只有预先训练的上下文嵌入,余弦相似性和基于频率的重要性加权。

尽管失去了一些可解释性,这种学习得分能成为新的标准吗?只有时间能证明一切。

基于 BERT 的评分函数之一的示例。来源: BERTScore:用 BERT 评估文本生成

2.基于嵌入的大规模检索预训练任务 | ICLR 会议

鉴于 BM25 这样的简单基线是如此强大和难以超越,信息检索领域已经晚于神经革命。目前,大多数神经增强的 SOTA 方法需要两个主要步骤:第一个快速过滤整个文档集——基于 BM25 类算法— ,以及重新排序步骤,其中通过神经网络处理查询和一小部分文档。这种方法存在许多局限性,因为在第一步中错过的任何文档都不会被进一步处理,并且在推理时完全处理查询和文档对的计算成本严重限制了现实世界的适用性。

相反,这项工作探索了受约束的问题,其中推理只能通过预先计算的文档表示的嵌入相似性得分来完成,从而实现大规模的端到端基于转换器的检索。

要得出的关键见解是,使用段落级自我监督任务进行预训练是必不可少的,而标记级屏蔽语言建模对这一特定任务的影响可以忽略不计。在结果部分,他们展示了即使在相对缺乏监督训练数据的情况下,BM25 如何能够在问答任务中被击败。

来源:基于嵌入的大规模检索的预训练任务

3.VL-伯特:通用视觉语言表征的预训练 | ICLR 会议

如何利用预训练和微调框架来共同学习通用语言和视觉表示?这里我们找到了一个很好的例子:视觉语言 BERT 将 Transformer 架构和 R-CNN 一起作为主干。虽然这不是同类中的第一个,但它是对现有模型的一个令人耳目一新的改进,并且为视觉常识推理 (VCR)基准设定了一个新的最先进水平(嗯,在出版时)。预培训程序依赖于两个主要目标:

  • **具有视觉线索的掩蔽语言建模:**类似于原始的 MLM 任务,但是增加了被加字幕的图像区域的表示。
  • **利用语言线索的掩蔽的感兴趣区域分类:**以一定的概率,图像的区域被掩蔽,并且目标是在给定语言信息的情况下预测该区域的类别。

来源:VL-伯特:通用视觉语言表征的预训练

🎉奖金:关于自我关注和卷积层的关系 | ICLR 会议

这篇非传统的论文对注意力机制和卷积可能存在的共同点进行了令人信服的分析。有趣的是,他们发现的重叠比人们事先预期的要多:正如他们的证据所表明的那样,注意力层经常学会像 CNN 一样注意“像素网格模式”。

使用计算机视觉作为案例研究,以及详细的数学推导,他们得出结论,变压器架构可能是 CNN 的概括,因为它们经常学习等效的模式,甚至可能由于同时学习局部和全局信息的能力而呈现优势。

来源:关于自我注意和卷积层的关系

优秀奖: 符号数学深度学习;[逻辑和 2-单纯变压器](http://LOGIC AND THE 2-SIMPLICIAL TRANSFORMER)(用于深度 RL)。

今年的 ICLR 完美地反映了机器学习的一个充满活力的活跃分支是如何成熟的:模型、训练技术、数据集和应用变得更加完善,围绕它们的理解也更加深入。我们这篇文章的变压器之旅到此结束,但会议还有很多内容需要探索。我和我的团队将密切关注相关的会谈和研讨会,并通过我们公司的 twitter feed 在 @zetavector 上实时报道有趣的见解,所以如果你不想错过任何事情,请收听我们的节目!

谷歌新推出的人工智能“哼歌搜索”功能可以搜索歌曲

原文:https://towardsdatascience.com/whats-new-in-google-s-ai-powered-hum-to-search-song-feature-f6c9da14d492?source=collection_archive---------45-----------------------

人工智能搜索你最喜欢的歌曲

来源: Unsplash

借助人工智能的力量,我们可以想象的一切现在都有可能实现。你有没有想象过,如果你能在某个地方找到你听过的那首歌,而你的脑海里只有音乐?你可能这样问过你最好的朋友。

像这样“哼哼哼哼哼哼”的那首歌叫什么来着但是你的朋友(一个人类)也没有告诉你歌名。

人工智能已经证明,它现在可以读取你在想什么,但人类不能。有了大量的数据、机器学习算法和高处理能力的机器,这一切都是可能的。

这种哼唱的主要特点是,即使你在嘈杂的背景下,这种功能也能很好地准确工作。要使用这种功能,你不需要成为一名歌手,你可以哼唱,谷歌将使用其人工智能算法和高端计算能力来完成剩下的工作。

该功能目前支持 20 种语言。这意味着我们可以哼唱,谷歌将找到 20 种不同语言的歌曲。现在还不知道这二十种语言是什么。我已经在印度语和英语歌曲中测试过了,它运行得相当快和准确。

谷歌是如何做到的

我对幕后的技术很好奇,我发现它使用了谷歌的下一代音乐识别功能。它使用深度学习算法,可以通过大量数据来训练我们的模型。此前,谷歌在 Pixel 2 手机中推出了类似的功能,可以在另一台设备上播放歌曲,Pixel 的手机可以通过音乐和歌词识别歌曲。我们现在可以在谷歌搜索功能中使用我们的声音,即使没有歌词,也可以通过哼唱找到这首歌。

如何有效地使用“哼声搜索”功能

由作者添加

你可以说,“好吧,谷歌,这首歌是什么?”或者你可以从谷歌小工具中添加快捷方式。你需要哼唱大约 10-15 秒,接下来,你会发现这首歌在你的脑海中回响。

你觉得这个功能怎么样?

照片由 Ehimetalor Akhere Unuabona 在 Unsplash 上拍摄

这一新的人工智能搜索功能上周刚刚推出。更新您的 Google 应用程序后,您可以更有效地使用该功能。对于 Siri 中的 IOS 用户,该功能目前不可用。但作为一个突破性的功能,Siri 可能很快就会有这个功能。这个功能对我们许多人来说是一种祝福,因为我们可以哼唱并找到歌曲;我们不需要去问别人,也不需要靠猜歌词去四处搜索。

车床 0.1.2 有什么新功能?

原文:https://towardsdatascience.com/whats-new-in-lathe-0-1-2-b3d9bc96dff4?source=collection_archive---------74-----------------------

车床 0.1.2 中一些最激动人心的特性的回顾。

L 距离 0 . 1 . 2“butter ball”被合并到 master 并取代之前的车床 0.1.1 只有几个提交之遥。在车床 0.1.2 中已经呈现了许多令人兴奋和有趣的东西,并且有许多有趣的新东西需要实验——既有已实现的,也有计划中的。所以事不宜迟,我们来看看车床 0.1.2 有什么新功能!

宏指令

车床现在有一系列易于访问和利用的宏,用于车床内部的最基本操作。这还附带了一系列非常酷的实验性宏,你可能没有想到它们会被实现,这很可能会使机器学习在车床上变得更加容易。

首先,stats.jl 已经获得了执行统计测试的宏。正如您所预料的,这可以使统计测试更快。新宏的一些示例包括:

@t -> Independent T-test
@f -> F-test
@- -> Signs test

以及一些为方便起见而添加的基本统计宏:

@mu -> Mean
@r -> Correlation Coefficient
@sigma -> Standard Deviation

除此之外,还有一个非常酷的新精度宏,叫做@acc。这在某种程度上是未来努力的模板,但是@acc 宏的目标是能够在同一个函数中保持连续和绝对的准确性。不要再问 r2、广义分类准确度或平均绝对误差,很快一个机器学习模型就会为你做这些!在未来,我很乐意进一步扩展它,以包含一个更强大的模型和更受欢迎的验证方法,比如混淆矩阵。

Powerlogging —有进一步实施的计划

Powerlogging 是一个非常酷的概念,已经在 STATA 软件中使用了一段时间。它允许统计学家用数学方法计算模型功效的适当样本量。如果您想了解更多关于 powerlogging 本身的知识,我已经写了另一篇文章,深入讨论了它是如何工作的,它做了什么,以及如何从头开始编写代码。

[## 电源分析——你从未听说过的最酷的东西。

将权力投入到您的物流决策中。

towardsdatascience.com](/power-analysis-the-coolest-thing-that-youve-never-heard-of-476d35c18161)

虽然这本身很酷,但我有很多想法,谁可以将它进一步实现到模型中,甚至可能是预处理。这可以通过使用不同的训练样本大小来实现,也可以通过同时测试不同的样本来获得更准确的结果。所有这些都可能等同于更高的后勤准确性,这绝对是非常酷的!

分割

我最终得到的印象是车床包装太大了。因此,它们被分开并包含在内。虽然这不会对最终用户产生影响,但对于贡献者来说,这无疑是一个显著的增加。这将使在车床上操作特定组件比以前容易得多,并允许像宏、模型和公式这样的东西驻留在它们自己的位置上。

证明文件

虽然 http://lathe.ai 服务器目前正在进行维护,但 lathe 终于有了一个自动更新文档的网站!这当然会使使用文本文件时使用车床比使用 REPL 更容易。在这个新的文档站点发布之前,关于车床的文档只能通过 Julia?()方法。虽然我当然认为在大多数情况下这仍然是处理文档的一个更好的方法,但是我当然能够理解能够滚动浏览网站的吸引力。此外,能够在谷歌上找到你的答案总是一件很棒的事情!

在新网站的顶部,车床的文档已被修改,以包括更多的信息,并彻底解释如何在车床类型使用。当然,由于车床仍然处于开发的早期,这只会随着开发的深入而改进,这是令人兴奋的!

结论

这一次,车床增加了一些令人兴奋的新功能,但是这个软件的未来肯定是非常光明的。未来的车床更新将提出进一步的统计库,增加更多的模型,并增加更多的预处理功能。虽然有很多工作要做,但我仍然对车床自诞生以来的发展感到高兴。

Matplotlib 3 的新特性

原文:https://towardsdatascience.com/whats-new-in-matplotlib-3-1b3b03f18ddc?source=collection_archive---------15-----------------------

照片由卡拉·伊德斯在 Unsplash 拍摄

第 3 代中最重要的更新概述

如果说可视化在数据中无处不在,无论大小,那么 Matplotlib 在 python 中同样无处不在。

Matplotlib 是 python 中使用最广泛的绘图库。**句号。**自 2003 年首次发布以来,它已经经历了四代开发,最新版本是最近发布的 3 . 2 . 2(2020 年 6 月 17 日)。最新一代的 Matplotlib 3 只与 Python 3 兼容,是近两年前推出的。

Matplotlib 开发的历史时间表(未按比例绘制)

为了保持这篇文章的简短,我将关注从 Matplotlib 3.0 开始的最有趣的特性(在我看来),然后转移到 3.1 和 3.2 版本。如果你对学习 python 绘图的基础感兴趣,请阅读我最近在《走向数据科学》中的文章,如果你想了解最新的 Matplotlib 3.3 中的特性,请阅读我的第二篇文章这里。

生存下来的不是最强壮的物种,也不是最聪明的物种,而是对变化最敏感的物种——查尔斯·达尔文

所以准备好在 Matplotlib 3 上更新自己吧

Matplotlib 3.0 中的新功能

  1. 轴的可缩放性 如果您想按给定的数量级缩放轴的值,您可以指定相同的值作为上限和下限。例如,下面的代码片段将 y 轴缩放 1000 倍。
import numpy as np
import matplotlib.pyplot as pltfig, ax = plt.subplots()x = np.linspace(0, 2*np.pi, 1000)ax.plot(x, np.sin(x**2), 'orange', label=r'sin($x^2$)')
ax.legend(title='Legend Title', fontsize=14, title_fontsize=18)ax.ticklabel_format(style='sci', scilimits=(3, 3), axis='y')

sin(x)函数的重新缩放 y 轴。注意左上角的乘法因子 1e3。

2.**自由选择图例标题的字体大小**

您现在可以分别设置图例标题图例标签的字体大小。这已经在代码片段和上图中显示出来了。如果你正在使用rcParams,你也可以使用rcParams["legend.title_fontsize"]rcParams["legend.fontsize"]分别指定两者

plt.rcParams["legend.title_fontsize"]  = 18
plt.rcParams["legend.fontsize"] = 14

3.**饼图现在默认为圆形**

与 Matplotlib 2 不同,饼状图现在默认总是圆形的,你不需要手动设置纵横比"equal"。在早期版本中,您需要指定ax.set_aspect("equal")plt.axis("equal")来制作圆形饼图。如果您不喜欢这个默认行为,您可以使用ax.set_aspect("auto")plt.axis("auto").来覆盖它**

4.轴标题和x-轴之间不再重叠

如果图的顶部有x-轴(或双y-轴),图标题 将不再与顶部 x 轴标签和刻度标签 重叠。以前,您必须手动重新定位图形标题。

捕捉 : 默认y-标题值为 1.0。即使您手动指定默认位置为ax.title.set_position(0.5, 1.0),这是多余的,因为它已经默认了*,底层算法仍然会重新定位标题并防止重叠。如果你不想重新定位,并且你是一个混乱和喜欢重叠的人,你可以使用一个不等于 1 的值 *y* 来防止它,例如ax.title.set_position(0.5, 1.005)*

5. GridSpec 现在更方便了

以前,要添加子情节网格,您必须使用需要导入gridspecgridspec.GridSpec()gridspec.GridSpecFromSubplotSpec()方法。现在这两个都换成了add_gridpec()SubplotSpec.subgridspec()。这移除了显式需要来导入gridspec,如下面的官方示例所示

*fig = plt.figure()
gs = fig.add_gridspec(3, 1)ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1])
sub_gs = gs[2].subgridspec(1, 4)for i in range(4):
    fig.add_subplot(sub_gs[0, i])*

Matplotlib 3 中“add_gridspec”和“subgridspec”的演示

Matplotlib 3.1 中的新功能

  1. 创建辅助 x-y的新方法

假设您正在用欧元计算股票价格,但是您的老板要求您也在同一数字中显示相应的美元价格,那么 副轴 就是您所需要的。你现在可以简单地使用ax.secondary_xaxis()ax.secondary_yaxis()。您必须定义两个转换函数,例如下面的eur2dol()dol2eur(),它们将定义主轴和副轴之间的关系,如这个官方示例所示。

***def** eur2dol(x):
    **return** x * 1.14  # Taking 1 Eur = 1.14 US Dollar as Rate

**def** dol2eur(x):
    **return** x / 1.14

secax = ax.secondary_xaxis('top', functions=(eur2dol, dol2eur))*

2.整洁简洁的日期格式器

如果你正在处理日期,你会喜欢这个功能的!新的日期格式器,被称为ConciseDateFormatter(),属于matplotlib.dates,与默认的格式器相比,它可以简洁明了地显示刻度标签。

3.轻松创建散点图的图例

以前,在为标记绘制不同颜色和大小的散点图时,需要一种变通方法,要么用单个标签条目绘制多个散点图,要么使用代理美工手动添加它们。Matplotlib 3.1 通过引入返回唯一句柄和标签的legend_elements()简化了这一过程,这些句柄和标签可用于生成图例。此处提供了一个官方示例。

4.反转轴的新方法

现在,您可以使用set_inverted()反转轴,使用get_inverted()检查轴之前是否被反转过。后者将返回 Matplotlib 2 中的TrueFalse.,等效方法为invert_xaxis()invert_yaxis()用于反转,xaxis_inverted()yaxis_inverted()用于检查轴是否已反转。

*fig, ax = plt.subplots()x = np.linspace(0, 0.5, 100)ax.plot(x, np.sin(x**2), 'orange')
ax.xaxis.set_inverted(True) # <-- Takes Boolean as argumentax.xaxis.get_inverted()
>>> True*

x 轴倒置的图形

5.滑块控件终于俯身直起

现在可以有一个垂直的小部件滑块。您需要传递一个可选参数orientation,它可以是'horizontal''vertical'

Matplotlib 3.2 中的新功能(最新版本是 3.2.2)

  1. 控制轴的标题位置和颜色

在定制您的rcParams文件/设置时,您现在还可以传递图形标题的位置及其颜色。标题的位置可以是以下任意一个:"left", "center", "right"。标题的颜色可以是"auto"或任何指定的颜色,如"red""mediumseagreen",等。这里列出了和。

*plt.rcParams["axes.titlelocation"] = "left"
plt.rcParams["axes.titlecolor"] = "red"*

2.3d 条的阴影

你现在可以用bar3d().从不同的角度投射光线来制作漂亮的 3d 条,这可以用[lightsource](https://matplotlib.org/3.2.0/api/_as_gen/matplotlib.colors.LightSource.html#matplotlib.colors.LightSource)参数来配置,它有两个角度:方位角和高度。阴影参数需要是True来调用这个效果。

3.选择显示哪些误差线

有时您可能希望在数据点上显示误差线。然而,如果您有大量的数据点,您不希望在每个点上添加误差线。到目前为止,您只能选择在每个 n 数据点后放置误差线。现在,您还可以指定误差线的起点。下面的第一个代码将在x[::5], y[::5]点放置误差线,而第二个代码将在x[2::5], y[2::5]放置误差线,即从第二个点开始每隔第五个点放置误差线。[::5]是 NumPy 的切片符号,它返回每第 5 个元素。

*# Before matplotlib 3.2 
plt.errorbar(x, y, yerr, errorevery=5)# matplotlib 3.2 onwards
plt.errorbar(x, y, yerr, errorevery=(2, 5))*

这就是我的帖子的结尾。恭喜你!现在,您已经更新了 Matplotlib 3 的一些最新特性。下一个候选版本是 3.3.0 。当这种情况发生时,我会更新这个帖子。

您可以在以下超链接中找到 Matplotlib 3 中新增功能的完整列表: 3.0 、 3.1 和 3.2 。如果你对学习 python 绘图的基础感兴趣,请阅读我在《走向数据科学》中的文章。

Matplotlib-ing 快乐!

熊猫 1.0 和 TensorFlow 2.0 的新增功能

原文:https://towardsdatascience.com/whats-new-in-pandas-1-0-and-tensorflow-2-0-7c8e68251dd5?source=collection_archive---------22-----------------------

关于用于数据分析和机器学习的流行 python 包的大版本,需要记住一些事情。

本文假设读者对这些库有一定的了解。如果你需要一个快速介绍,这里有一些关于熊猫和 TensorFlow 的很棒的媒体文章。

熊猫 1.0.0

来源:熊猫用户指南

(2020 年 1 月 29 日发布)

pandas(Panel Data 的缩写)是一个用于数据分析和操作的 Python 包,早在 2008 年就从 AQR Capital Management 开源了。它的主要特性是 DataFrame 对象,该对象为 Python 用户提供了一种简单且标准化的方式来与表格数据进行交互。当我开始使用它时,我觉得很奇怪,这样一个突出和广泛使用的软件还没有 1.0 版本。

从 0.25.3 →1.0.0 变化不多。尽管如此,以下是主要的主题。

新数据框列类型

这是熊猫在 1.0 版本之前处理数据类型的方式:

来源:https://pbpython.com/pandas_dtypes.html

现在我们可以在列表中再添加两个:pd.StringDtype()pd.BooleanDtype()

**字符串类型:**在添加string数据类型之前,Pandas 字符串列被编码为 NumPy object数组。这太笼统了,因为任何东西都可以存储在熊猫对象列中。很难区分哪些列是只有字符串的,哪些列包含混合的对象类型。

现在有了 Pandas 中的pd.StringDtype()列,你应该可以在字符串列上运行所有的 python 字符串方法,比如.lower().upper().replace()等等。

**布尔类型:**在新的熊猫布尔类型之前,布尔列被编码为bool类型的 NumPy 数组。唯一的问题是这些数组不能包含缺失值。新的pd.BooleanDtype()解决了这个问题。

说到缺失值…

三种不同的数据类型表示熊猫对象的“缺失”:np.NaN表示浮点类型,np.NaT表示日期时间类型,None表示其他对象类型。一些人(包括我)认为这很烦人,很困惑。

引入pd.NA,新的捕捉所有缺失数据的熊猫类型。那么它是如何工作的呢?

用于算术运算;任何被加、减、连、乘、除等的东西。将返回pd.NA

In[1]: pd.NA + 72
Out[1]: <NA>In[2]: pd.NA * "abc"
Out[2]: <NA>

除了少数特殊情况,比如pd.NA所代表的数值与结果无关。

In[3]: 1 ** pd.NA
Out[3]: 1In[3]: pd.NA ** 0
Out[3]: 1

为了便于比较,pd.NA的行为就像您所期望的那样,通过操作进行传播。

In[4]: pd.NA == 2.75
Out[4]: <NA>In[5]: pd.NA < 65
Out[5]: <NA>In[6]: pd.NA == pd.NA
Out[6]: <NA>

要测试缺失数据:

In[7]: pd.NA is pd.NA
Out[7]: TrueIn[7]: pd.isna(pd.NA)
Out[7]: True

对于布尔运算,pd.NA跟在三值逻辑 ( 又名 Kleen 逻辑)之后,类似于 SQL、R、Julia。

In[8]: True | pd.NA
Out[8]: TrueIn[9]: False | pd.NA
Out[9]: <NA>In[10]: True & pd.NA
Out[10]: <NA>In[11]: False & pd.NA
Out[11]: False

如果pd.NA的值可以改变结果,那么操作返回<NA>,但是如果pd.NA的值对结果没有可能的影响,就像在True | pd.NAFalse & pd.NA中那样,那么它将返回正确的值。

挑战问题:这也能评价什么?(答案在最后。)

In[12]: ((True | pd.NA) & True) | (False & (pd.NA | False))
Out[12]: ???

注意:该pd.NA值是实验性的,并且行为可能会在没有警告的情况下改变。有关更多信息,请查看文档中的 处理缺失数据 部分。

速度和动力

来源: Numba 文档

C 运行速度比 Python 快主要原因是 C 得到编译而 Python 得到直接解释*(注:* 稍微多一点 ) 。Pandas 和 NumPy 使用 Cython 将 Python 代码转换成 C 语言并获得性能提升。

但是在 Python 社区中,另一个编译器 Numba 正在迅速获得关注。Numba 允许你编译 Python 代码到几乎达到 C 和 FORTRAN 的速度;没有任何额外编译步骤或安装 C/C++编译器的复杂工作。只需导入numba库,用@numba.jit()修饰你的函数。
举例:

@numba.jit(nopython=True, parallel=True)
def my_function():
    ...
    # Some really long and computationally intense task
    return(the_result)

Pandas 在apply()函数中添加了一个engine=’numba’关键字,用 Numba 运行你的数据操作。我认为我们将开始在 Python 数据科学生态系统中看到更多这种功能。

可视化原始数据

眼见为实。甚至在用数据制作图表之前,当人们将数据放入 DataFrame 对象时,他们做的第一件事就是运行.head()方法来了解数据的样子。

您现在有 2 个选项来轻松查看您的数据。

# Create a DataFrame to print out
df = pd.DataFrame({
       'some_numbers': [5.12, 8.66, 1.09],
       'some_colors': ['blue',  'orange', 'maroon'],
       'some_bools': [True, True, False],
       'more_numbers': [2,5,8],
})

漂亮的 JSON:.to_json()方法现在有了一个indent=参数,它将以更易于阅读的方式打印出您的数据。

而不是像这样得到输出的文本转储:

print(df.to_json(orient='records'))[{"some_numbers":5.12,"some_colors":"blue","some_bools":true,"more_numbers":2},{"some_numbers":8.66,"some_colors":"orange","some_bools":true,"more_numbers":5},{"some_numbers":1.09,"some_colors":"maroon","some_bools":false,"more_numbers":8}]

你可以这样美化 JSON:

print(df.to_json(orient='records',indent=2))[
  {
    "some_numbers":5.12,
    "some_colors":"blue",
    "some_bools":true,
    "more_numbers":2
  },
  {
    "some_numbers":8.66,
    "some_colors":"orange",
    "some_bools":true,
    "more_numbers":5
  },
  {
    "some_numbers":1.09,
    "some_colors":"maroon",
    "some_bools":false,
    "more_numbers":8
  }
]

这只是将表格打印到控制台的另一种方式。这产生了一种更容易复制和粘贴到 markdown 文档中的格式。仅供参考,你需要安装tabulate包才能工作。

print(df.to_markdown())|    | some_numbers | some_colors | some_bools  | more_numbers |
|---:|-------------:|:------------|:------------|-------------:|
|  0 |         5.12 | blue        | True        |            2 |
|  1 |         8.66 | orange      | True        |            5 |
|  2 |         1.09 | maroon      | False       |            8 |

有趣的事实

您过去可以从 Pandas 包中访问 NumPy 和 datetime 名称空间。像这样:

import pandas as pdx = pd.np.array([1, 2, 3])current_date = pd.datetime.date.today()

但是你不应该这样做。这使得代码变得混乱。自己导入库。

from datetime import date
import numpy as np
import pandas as pdx = np.array([1,2,3])
current_date = date.today()

这种名称空间攻击最终被否决了。点击查看公关讨论

张量流 2.0

来源:发行说明

(2019 年 9 月 30 日发布)

TensorFlow 是一个深度学习的 Python 包,已经被整个行业广泛采用。它最初是谷歌 DeepMind 的一个内部项目,但在 2015 年 11 月 9 日向公众发布。1.0 版本2017 年 2 月问世。现在我们已经到了 2.0。

TensorFlow 因其可移植性和易于将模型部署到生产级软件中而在工业用例中广受欢迎。但对于研究用例,许多人发现,与 PyTorch 等其他框架相比,它缺乏创建和运行机器学习实验的便利性(阅读更多)。

不管你喜欢还是讨厌 TensorFlow 1。x,以下是你需要知道的。

更多关注热切的执行

在 TensorFlow 1。x 您通常会构建出想要执行的操作的整个控制流,然后通过运行一个会话来一次执行所有的操作。

这不是很 Pythonic 化。Python 用户喜欢能够交互式地运行数据并与数据交互。TensorFlow v1.7 中发布了急切执行,现在在 2.0 中将成为处理计算的主要方式。这里有一个例子。

没有急切的执行。

In[1]: x = tf.constant([[1,0,0],[0,1,0],[0,0,1]], dtype=float)In[2]: print(x)
Out[2]: Tensor("Const:0", shape=(3, 3), dtype=float32)

急切地执行。

In[1]: x = tf.constant([[1,0,0],[0,1,0],[0,0,1]], dtype=float)In[2]: print(x)
Out[2]: Tensor([[1,0,0]
                [0,1,0]
                [0,0,1]], shape=(3, 3), dtype=float32)

当您可以实际看到您正在处理的数字时,理解和调试正在发生的事情会容易多少?这使得 TensorFlow 与原生 Python 控制流更加兼容,因此更容易创建和理解。(阅读更多)

功能强大,但仍便于携带

行业背景下的 ML 从业者较早采用 TensorFlow 的部分原因是它的可移植性。您可以用 Python 构建逻辑(或执行图),导出它,然后用 C、JavaScript 等无缝运行它。

TensorFlow 听到了人们的呼声,即让接口更加 Python 化,但仍然保持了使用@tf.function decorator 将代码移植到其他执行环境的便利性。这个装饰器使用 AutoGraph 自动将您的 python 函数翻译成 TensorFlow 执行图。

来自文件:

  • for/while->-[tf.while_loop](https://www.tensorflow.org/api_docs/python/tf/while_loop)(支持breakcontinue)
  • if->-
  • for _ in dataset - > dataset.reduce
# TensorFlow 1.X
outputs = session.run(f(placeholder), 
                      feed_dict={placeholder: input})
# TensorFlow 2.0
outputs = f(input)

Keras 的本地支持

Keras 最初是作为一种更高级别的深度学习 API 开发的,它包装了 TensorFlow、Theano 或 CNTK。从首页:

“它的开发重点是支持快速实验。能够以尽可能少的延迟从想法到结果是做好研究的关键。”

TensorFlow 决定在tf名称空间内原生支持 Keras API。这为用户提供了模型实验的模块化方法,并解决了“ TensorFlow 不适合研究”的问题。

Keras 仍然作为一个独立的库存在,但建议使用 TensorFlow 后端的用户切换到tf.Keras。所以现在当人们说他们在用“Keras”时,我不知道它是tf.Keras还是原来的Keras …哦,好吧。

API 重构

从 v1 手动升级您的旧代码。x 到 v2。x 并不容易。但是 TensorFlow 开发人员通过创建一个脚本来自动重新排序参数、更改默认参数和切换模块名称空间,从而减少了这种痛苦。

来自指南:

很多 API 在 TF 2.0 中要么没有了,要么移动了。一些主要的变化包括移除*tf.app**tf.flags**tf.logging*以支持现在开源的 absl-py,重新组织存在于*tf.contrib*中的项目,以及通过将较少使用的函数移动到类似*tf.math*的子包中来清理主*tf.**名称空间。一些 API 已经被替换为它们的 2.0 等效版本- *tf.summary**tf.keras.metrics**tf.keras.optimizers*。自动应用这些重命名的最简单方法是使用 v2 升级脚本。

结论

Pandas 反对在其名称空间中使用 NumPy 和 datetime,并建议用户直接导入它们。但是 TensorFlow 建议使用 Tensorflow 内部的 Keras,而不是直接导入它。🤷‍♂️

我希望你觉得这很有用。如果有你认为应该包含的大功能,请告诉我。

感谢阅读!

挑战问题的答案:

In[12]: ((True | pd.NA) & True) | (False & (pd.NA | False))
Out[12]: True

熊猫 1.0 有什么新功能?🐼

原文:https://towardsdatascience.com/whats-new-in-pandas-1-0-ffa99bd43a58?source=collection_archive---------5-----------------------

你需要知道的比普通熊聪明的一切

熊猫开发团队刚刚在 2020 年 1 月 29 日正式发布了熊猫 1.0.0 版本。在本文中,我将回答您的迫切问题,讨论主要的变化,并向您展示如何从今天开始使用新版本。😀

请注意,这篇文章已经更新,以反映官方发布。🎉

普通的熊

熊猫

Pandas 是最流行的用于清理、探索和操作数据的 Python 库。它将命名的行和列添加到 NumPy 的 ndarray 数据结构中。它还增加了许多方便的方法,使处理数据变得更加容易。Pandas 是 Python 成为数据科学家和数据工程师主导语言的重要原因。

我们走吧!🚀

我们说的是 1.0。这是一件有很多重大变化的大事吗?

不完全是。1.0 的标签并不意味着与 0.25.3 有很大的不同,0 . 25 . 3 是截至 2020 年 1 月 22 日(本文最初撰写时)的稳定版本。你会看到,没有那么多大的变化。

1.0 版本也并不意味着这种语言已经达到了一个成熟点。Pandas 是一个相当稳定的库,已经在生产代码中使用了多年。韦斯·麦金尼从 2008 年开始在图书馆工作。 GitHub 显示在撰写本文时,它已经在大约 170,000 个 GitHub 仓库中使用。👍

1.0 中的变化可能会在短期内引入更多的复杂性,但从长远来看,它们为语言打下了更好的基础。

良好的基础是一份礼物

有什么新鲜事?

除了通常的错误修复和小的 API 清理,熊猫 1.0.0 引入了一些主要功能。

警察。钠

在 pandas 0.25 中,一个数据帧可以有三个不同的值——T0、T1 或 T2——来表示缺失的数据,这取决于列的数据类型。如果你想知道细节,请看我的关于熊猫中丢失数据值的文章。

许多人面临的缺失值的最大问题是,一个缺失值的整数列会自动转换为 float。呀。🙀

这种现状很大程度上是由于底层 NumPy 库的能力。为了改善这种情况,pandas 开发团队创建了一个新值来表示几个 dtypes 的缺失数据。如 1.0 文档所述:

从 pandas 1.0 开始,可以使用一个实验性的pd.NA值(singleton)来表示标量缺失值。此时,它被用于可空的整数,布尔和专用字符串数据类型中作为缺失值指示器。

pd.NA的目标是【提供】一个“缺失”指示器,可以在所有数据类型中一致使用(而不是根据数据类型使用np.nanNonepd.NaT)。

从长远来看,缺失数据的单个值和避免将缺失数据的整数列自动转换为浮点数听起来很棒!👏从短期来看,它创造了更多需要学习和记忆的东西。

新的pd.NA的一个问题是,你不能直接将其与布尔条件中的值进行比较。所以没有带pd.NA==。相反,您可以使用df.isna()返回数据帧中缺失值的布尔掩码。

我们来看看能装pd.NA的三种 dtypes。

可空整数数据类型

如果您想使用新的pd.NA并避免将 int 类型转换为 float,现在您必须指定特殊的可空整数 dtypeInt64——注意大写的 I 。这个 dtype 和你所了解和喜爱的标准int64 NumPy dtype 不一样。❤️

下面是用整数 dtype 列创建数据帧的老方法(熊猫和 NumPy 以它们通常的别名导入):

pd.DataFrame([1, 2, np.nan])

这导致了:

请注意,自动类型转换为浮点型。

下面是创建可以处理pd.NA的列的方法。

pd.DataFrame([1, 2, np.nan], dtype="Int64")

只需在创建系列或数据帧时指定dtype=”Int64",就可以得到可空的整数数据类型。请注意不同之处:

该列仍有整数!还有新的 *<娜>。*👍

关于int64Int64的微妙之处 pandas 版本只有一个大写的 I 而现有 NumPy 版本只有一个小写的 i 看起来可能会引起一些混乱。☹️

迷茫?

布尔数据类型

如果引入了缺失值,一个bool dtype 列将被转换为一个object dtype。如果想要一个缺少pd.NA值的布尔整数列,那么用 dtypeboolean指定该列。

你可以这样做:

pd.DataFrame([True, False, np.nan], dtype=”boolean”)

同样,这很酷,但是boolean dtype 似乎很可能与现有的bool dtype 混淆。

让我们看看新的string数据类型。

新字符串

字符串数据类型

一种新的、更直观的文本数据类型对我来说是个好主意,至少乍一看是这样。object dtype 是文本数据和任何不属于另一个类别的杂项数据的默认集合。

string dtype 使用pd.NA来表示缺失值,节省内存,并告知您只需要一列中的文本值。现在,你需要指定你想要它。你可以这样做:

pd.DataFrame(['a', 'b'], dtype='string')

这些变化的短期负面影响是,缺失值和数据类型现在有了更多的细微差别。☹️

为了使转换更容易一些,现在有了一个 pandas DataFrame 方法convert_dtypes()

转换类型

在数据帧或系列上调用convert_dtypes(),pandas 将尝试将每一列转换成支持pd.NA的 dtype。(这些是上面讨论的新数据类型)。在新奇的新文件中了解更多信息!

感谢凯文·马卡姆给我指出了这个方法。

因此,尽管可能有更多的细微差别需要学习,但新数据类型的好处是 pandas 在更直观地处理整个 API 中的缺失值方面迈出了一大步。对我来说,这似乎是一种必要的成长的痛苦。😀

其他值得注意的变化

  • 这些文档有一个漂亮的新外观和一个关于扩展到大数据集的新部分。
  • 熊猫团队将开始使用语义版本化的松散变体来管理弃用、API 兼容性和版本编号。
  • 您可以使用to_markdown()将数据帧输出为降价表。
  • df.info()这样的函数的输出现在组织得更好了。
  • pandas.util.testing模块已被弃用。我喜欢它,因为它可以快速制作各种数据类型的数据框架。然而,您可以通过其他几种方式创建这样的数据帧,但它似乎没有得到广泛使用。从好的方面来说,这是一个少学的东西,我可以把它从我即将出版的熊猫书里删掉。📘
  • 熊猫 1.0.0 支持 Python 3.6.1 及以上版本。😉

变化

我如何安装新版本?(截至 2020 年 1 月 29 日更新)

以下是如何用 pip 安装熊猫 1.0:

pip install pandas

就是这样!😀建议你用 Python 内置的 venv 创建一个虚拟环境。因此,要使用 Python 3.8 创建虚拟环境,您需要:

python3.8 -m venv my_env
source my_env/bin/activate

如果您已经安装了 pandas,您可以通过以下方式升级到 1.0:

pip install pandas --upgrade

康达

以下是如何用 Python 3.8 和 pandas 1.0 创建一个新的 conda 环境:

conda create -n my_conda_env pandas

或者你可以更新你当前活动的 conda 环境,如果它有熊猫的话

conda update pandas

向那些一直致力于改善熊猫的人们大声呼喊!谢谢大家!🎉

建议

熊猫 1.0 来了。现在正是开始使用的好时机!👍

如果你一直在关注最近的熊猫发布,并对那些弹出的警告做了些什么,更新到 1.0 应该不会太难。然而,你在以前版本的 pandas 中看到的许多警告现在会出错,所以要小心。😀

如果你想学习熊猫,我已经起草了一本关于熊猫的书。订阅我的邮件列表,确保你不会错过发布。

如果你还不知道香草 Python,先看看我的书,难忘的 Python 。

如果你想要一份关于 conda 命令的便签,我为你我制作了这个要点。😀

包装

希望你觉得这个熊猫 1.0 的指南有用。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。👍

我撰写关于数据科学、 Docker 、 SQL 和其他技术主题的文章。如果你对此感兴趣,请关注 me ,点击阅读更多。

熊猫快乐!🐼

Python 2020 的新特性—第 1 部分

原文:https://towardsdatascience.com/whats-new-in-python-2020-part-1-c101939c8800?source=collection_archive---------18-----------------------

Python 过去(3.7)、现在(3.8)、未来(3.9)的幽灵正在 2020 年拜访你。

克里斯里德在 Unsplash 上的照片

自从很久以前切换到 Python 3(咳咳 —我希望那是很久以前的事了!),语言层面的特性变化相对较小。然而,在每个版本中,从事 Python 工作的天才们都在不断添加我不能缺少的东西。

随着 Python 3.8 于 2019 年 10 月发布,我发现自己在使用该语言的一些功能,当我第一次读到它们时,让我说“随便吧”。

  • 3.5-类型注释
  • 3.6 — asyncio
  • 3.7 —数据类
  • 3.8 —赋值表达式又名海象运算符

在 3.9 中,字典联合操作符和泛型类型提示。尽量减少感叹号,但这是令人兴奋的事情!

以上所述,我一直在专业地使用代码库,并在我的项目中寻找乐趣。

快速演讲:如果您还在使用旧版本的 Python 工作或项目,不要害怕升级!您的旧代码仍然可以工作,而且您将获得 Python 新特性的好处!

声明:如果你还在使用 Python 2.7,这是不正确的。但在这种情况下,你不是那种会接受好建议的人。😎

下面我将(快速)回顾一些我最喜欢的特性,希望你会发现它们每天都在你的编码中使用。

它们是:类型注释、数据类、字典联合操作符、walrus 操作符。

在这一部分:输入注释,walrus 操作符。

打字— 3.5 以上

从 Python 3 开始,打字就已经成为一项功能。因为我们是开发者,而不是历史学家,所以现在(2020 年)将会有类型注释和类型提示。

Python 不需要给变量赋值类型。这可能是我如此热爱这门语言的部分原因。清晰易读的语法。用 24 种不同的方法中的一种来编码解决方案并仍然得到相同结果的能力。

但是后来…应用程序增长了。或者你得看看你几个月或几年没碰过的代码。或者,最糟糕的是,你还得理解别人写的代码!战栗

然后你意识到输入变量对解释器没有好处。这是给你的。

键入有助于您在编写代码时以及以后理解代码。TypeScript 如此受欢迎是有原因的,即使 JavaScript 完全能够编译成没有类型的工作代码。

from typing import List
​
def print_cats(cats: List[str]) -> None:
    for cat in cats:
        print(f"{cat} has a name with {len(cat)} letters.")
​

class Cat(object):
    def __init__(self, name: str, age: int, **attrs):
        self.cattributes = {
            "name": name,
            "age": age,
            **attrs
        }
​
cats = "this still works w/o type annotation!"
cats: List[str] = ["Meowie", "Fluffy", "Deathspawn"]
# not a list of strings, but Python will not check
cats2: List[str] = [Cat("Meowie", 2), Cat("Deathspawn", 8)]
​
print_cats(cats) # succeeds
print_cats(cats2) # fails

这将返回:

Meowie has a name with 6 letters.
Fluffy has a name with 6 letters.
Deathspawn has a name with 10 letters.
--------------------------------------------
...
TypeError: object of type 'Cat' has no len()

在这里,类型注释并没有拯救我们,那么为什么要使用它们呢?因为当创建变量cats并用List[str]键入它时,显而易见,分配的数据应该与该结构匹配。所以当一个函数稍后消耗cats时,它变得(更加)明显,你传递的数据正是它所期望的。

我认为,对于具有复杂类型的可维护代码来说,这变得更加有用——必要。

from typing import List
​
​
class Cat(object):
    def __init__(self, name: str, age: int, **attrs):
        self.cattributes = {
            "name": name,
            "age": age,
            **attrs
        }
​
# creating a type variable
Cats: type = List[Cat]
​
​
def print_cats(cats: Cats) -> None:
    for cat in cats:
        name: str = cat.cattributes.get("name")
        print(f"{name} has a name with {len(name)} letters.")

cats = [Cat("Meowie", 2), Cat("Deathspawn", 8)]
​
print_cats(cats)

输出:

Meowie has a name with 6 letters.
Deathspawn has a name with 10 letters.

在函数/方法的定义中输入参数被称为类型提示。类型甚至不必是 Python 数据类型或来自typing模块。一个简单的,虽然有点尴尬的文本提示是完全合法的:

import pandas as pd
​
cols = ["name", "age", "gender"]
data = [["Meowie", 2, "female"],
       ["Fluffy", 5, "male"],
       ["Deathspawn", 8, "rather not say"]]
df: pd.DataFrame = pd.DataFrame() # not very descriptive
df: "name (string), age (integer), gender (string)" = \
    pd.DataFrame(data, columns=cols)

类似这样的东西在包含大量复杂类型变量的数据处理管道中可能会很有用,并且您的脑袋开始发晕,试图让它们保持直线。在变量 mouseover 上有类型提示的 ide 也会显示那个提示,而不是pandas.DataFrame,如果它有 Python 支持的话。

**奖励:**在 Python 4 中,前向引用将被允许开箱即用。这意味着您可以注释尚未定义的类型。我们现在仍然可以通过将from __future__ import annotations放在文件的顶部来利用这一优点,然后做如下事情:

from __future__ import annotations
​
class Food:
    """ Look at the type hint. Food is legal even without the 
    class defined yet.
    """
    def __init__(self, ingred_1: Food, ingred_2: Food) -> None:
        self.ingred_1 = ingred_1
        self.ingred_2 = ingred_2

原生类型注释— 3.9(很快将成为我的最爱)

这将是真正的快速,因为我把打字部分拖了出来。

内置的泛型类型将是 3.9 中的东西,所以从typing导入来添加参数到泛型数据类型将不再是必要的。从 3.7 开始,from __futures__ import annotations就提供了这一功能,但这是因为它阻止了类型引用在运行时被求值。

这让我对从 3.8 升级感到兴奋。现在我将typing导入到每个模块中,或者从我保存在代码旁边的类型定义模块中导入。

示例(信用: PEP 585 ):

>>> l = list[str]()
[]
>>> list is list[str]
False
>>> list == list[str]
False
>>> list[str] == list[str]
True
>>> list[str] == list[int]
False
>>> isinstance([1, 2, 3], list[str])
TypeError: isinstance() arg 2 cannot be a parameterized generic
>>> issubclass(list, list[str])
TypeError: issubclass() arg 2 cannot be a parameterized generic
>>> isinstance(list[str], types.GenericAlias)
Truedef find(haystack: dict[str, list[int]]) -> int:
    ...

海象运营商——3.8(我的最爱)

海象有眼睛:然后是长牙=

:=是一个赋值表达式,在 Python 3.8 中新增。

complicated = {
    "data": {
        "list": [1,2,3],
        "other": "stuff"
    }
}
​
if (nums := complicated.get('data').get('list')):
    print(nums)

结果:

1
2
3

如果没有海象,这将是更多的代码行。

...
​
nums = complicated.get('data').get('list')
if nums:
    print(nums)

这不是世界末日,但是因为控制流语句在编程中经常被使用,一旦你开始使用 walrus 操作符,你就不会停止。

来自 PEP 572 :

这种命名表达式的值与合并表达式的值是相同的,但有一个额外的副作用,即目标被赋予该值

换句话说,用一个表达式杀死两个语句。

当我复制/粘贴 PEP 指南时,这里有几个我认为很好的例子。迫不及待地想在列表理解中尝试一下 walrus 运算符。

# Handle a matched regex
if (match := pattern.search(data)) is not None:
    # Do something with match
​
# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
   process(chunk)
​
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]
​
# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]

结论

最近对 Python 语言的补充提供了一些相当不错的特性供练习。我希望我对打字和海象操作符的看法对你有用。

在第 2 部分中,我们将看看内置库的数据类,同时也看看需要考虑的一些原因pydantic。我们还将介绍 dictionary union 操作符,这是 Python 3.9 语法中的一项新内容。

Python 2020 的新特性—第 2 部分

原文:https://towardsdatascience.com/whats-new-in-python-2020-part-2-1d9abb0f0e7c?source=collection_archive---------39-----------------------

更多隐藏在 Python 3.9 袖子里的技巧。

照片由 Fotis Fotopoulos 在 Unsplash 上拍摄

我写给 Python 3 新特性的第一封情书有点长。这里是第一篇文章,介绍了编写 Python 代码时添加类型,以及用:=赋值表达式,也就是“walrus 操作符”。

本文将简要介绍即将发布的 Python 3.9 中的一个新特性。然后我们将深入研究数据类(dataclasses)。看看它们是什么,想知道它们在我们的编程生涯中去了哪里。

字典联合运算符— 3.9

这将是一个快速的。

从 Python 3.8 及以下版本开始,当我们想要组合两个或更多字典时,我们习惯于使用语法体操来完成工作:

d1: dict = dict(apple=2, banana=3, cactus=3)
d2: dict = dict(cactus="overwrite!", durian=4, elderberry=5)
​
# method 1
d1.update(d2)
​
# method 2
d1 = dict(d1, **d2)
​
# method 3(this is what I use)
d1 = {**d1, **d2}
​
# method 4 (for psychopaths)
for k, v in d2.items():
     d1[k] = v

我喜欢目前用双星号**打开字典的方法。这很像 JavaScript 中的... spread 运算符。

尽管如此,新的语法是一种改进。

# Python 3.9+ union operator
d1 = d1 | d2
​
# or ...
d1 |= d2

所有这些语句返回:

{'apple': 2, 'banana': 3, 'cactus': 'overwrite!', 'durian': 4, 'elderberry': 5}

很酷,对吧?

“新的”union 操作符实际上借鉴了在set集合类型中使用的现有 Python 语法。如果您没有使用集合来比较集合,请现在开始。他们太棒了。

数据类— 3.7 以上

dataclasses内置库已经有一个时代了(从 3.7 开始)。然而,我没有看到它得到太多的爱。应该的。创建数据类对于编写有效的 Python 代码是不必要的,Python 是一种动态类型化的语言(类型与血型相同,而不是以每分钟 75 个单词的速度*)。这意味着 Python 解释器在运行时运行类型检查,而不是在编译时,所以代码中不需要类型检查(这是推断出来的)。*

Python 中的 Dataclasses 很像 TypeScript 与 JavaScript 的关系。JavaScript 程序在 Node.js 或浏览器中运行并不需要输入。然而,有很好的理由在代码中使用类型。除非有回报,否则开发人员不会费尽周折去学习另一种工具。

回报就是理解通过你的程序的数据。验证输入。在声明时看到变量的类型,而不是在堆栈跟踪中找到。

例如变量people。那是...人数?一份名单?什么清单?一本字典?我们可以做得更好。

from dataclasses import dataclass, field
from typing import List
​
@dataclass
class Person:
    first: str
    last: str
    full_name: str = field(init=False)
    age: int

    def __post_init__(self):
        self.full_name = f"{self.first} {self.last}"
        if self.last == '' or not self.last:
            self.full_name = self.first
​
@dataclass 
class People:
    people: List[Person] = field(default_factory=list)

OO7 = Person('James', 'Bond', 40)
tech_guy = Person('Q', None, 80)
​
M16: People = People([OO7, tech_guy])

print(OO7)
print(tech_guy)
print(M16)

这将返回:

Person(first='James', last='Bond', full_name='James Bond', age=40)
Person(first='Q', last=None, full_name='Q', age=80)
People(people=[
    Person(first='James', last='Bond', full_name='James Bond', age=40),     
    Person(first='Q', last=None, full_name='Q', age=80)])

清晰多了!

当您开始输入 Python 代码时,内置的dataclasses库可以带您走得更远。尽管如此,你最终还是会漫游到美好的pydantic 图书馆的绿色牧场。Pydantic 本身对构建可伸缩、可维护的 Python 代码有很大帮助。库 FastAPI 可以做好一切,开箱即用。这两个图书馆都应该有自己的文章或课程,所以我将把它留在这里。

结论

Python 3.9 充满了有用的语言特性。全新的版本,并结合了所有在以前版本中添加的内容。如果您还没有阅读 Python 2020 年的新特性第一部分的话,请阅读该部分。

请将您的安装升级到 3.9!你没什么可失去的!

Python 3.9 字典有什么新特性?

原文:https://towardsdatascience.com/whats-new-in-python-3-9-dictionaries-ddb5d18460da?source=collection_archive---------41-----------------------

首先看一下新的 union 操作符,它有助于合并和更新字典

自由库存在 Unsplash 上的照片

Python 3.9 目前处于测试阶段,预计将于 2020 年 10 月发布,有很多东西值得期待。对于急切等待更新的 Python 开发人员来说,有一些有趣的补充,可以是新的字符串方法、拓扑排序或类型提示。

但是对我来说最突出的是新的 union 操作符,它提供了一种更简洁的方式来合并或更新字典。在接下来的几节中,我们将看看新的 union 操作符如何使操作字典变得更加简单和简洁。

合并或更新 Python 字典的旧方法

字典是一种内置的 Python 数据类型,用于保存可变的、插入有序的键值对集合。在 Python 3.8 之前,我们通常使用update方法或**解包操作符,但是更新字典最简单的方法是插入一个键值对,如下所示:

d1 = {'a': 'Cat', 'b': 10}
d1['type'] = 'animal'
{'a': 'Cat', 'b': 10, 'type': 'animal'}

但是在用多个新的键-值对更新字典时,这并不会让我们走得太远。

在这种情况下,update()方法显然是更好的选择:

dict1 = {'a': 'Cat', 'b': 10}dict2 = {'c': 'Dog', 'd': 11}dict1.update(dict2)
#prints {'a': 'Cat', 'b': 10, 'c': 'Dog', 'd': 11}

虽然上面的方法对于更新字典很有效,但是对于合并字典,您需要依靠copy()方法。这是因为update()方法就地执行,会修改原始字典。因此,您必须创建第一个字典的克隆,以便在不进行修改的情况下进行合并,如下所示:

d3 = d1.copy()
d3.update(d2)

这看起来不错,但不是 pythonic 式的。通过使用双星号操作符**在单行代码中合并字典,我们可以做得更好。

dict4 = {**dict1, **dict2, **dict3}
#or
d3 = dict(d1, **d2)

虽然上面的方法很有效,当然也很简洁,但是有一个警告。对于像 Python 这样以可读性赢得加分的高级语言来说,上面的解包操作符对许多开发人员来说可能很难看。

难怪 Python 3.9 中有两个新的 union 操作符。

新字典运算符

Python 3.9 以||+的形式引入了新的 clean union 操作符,分别用于合并和更新字典。

为了合并两个字典,我们像这样使用操作符:

d3 = d1 | d2

上面的操作符整齐地修剪了copy()update()方法。此外,该操作符在 Python 中带来了一致的行为,因为它已经用于合并两个集合。

同时,我们可以通过使用|=操作符来使用字典的就地合并或更新。它的工作方式与扩充赋值操作符+=相同。

d1 |= d2
#equivalent to
d1 = d1 | d2

如果我们在两个或更多字典中有公共键,那么在合并或更新操作中会从第二个或最后一个字典中选取键值。

重要的是要注意插入顺序的重要性,正如我们在上面看到的。

结束语

Python 3.9 中推出的新的 union 操作符虽然很小,但是很受欢迎。好的一面是,在合并字典和可重复项时,它们也能工作。

这一次到此为止。感谢阅读。

RStudio v1.4 版的新功能(预览版)

原文:https://towardsdatascience.com/whats-new-in-rstudio-v1-4-preview-5611f08c6233?source=collection_archive---------28-----------------------

Python 支持、可视化 RMarkdown 编辑和许多很酷的东西

由克里斯多夫·高尔在 Unsplash 上拍摄

不到六个月前,RStudio 发布了最后一个稳定版本(1.3),但最近发布了 r studio 1.4 版的功能预览。看起来我们将会有关于两个关键点的重要消息:带有 markdown 的可视化文档版本和 Python 的使用。

如果您想提前试用新版本,请点击链接并下载该软件的预览版(非最终版或稳定版):

[## RStudio 预览

RStudio v1.4.904-1 预览版-发行说明这是 RStudio 1.4 的预览版,是 RStudio 的主要新版本。

rstudio.com](https://rstudio.com/products/rstudio/download/preview/)

看起来在这个 1.4 版本中我们会有重要的变化和新的特性:

  • 用于 R Markdown 文档的新的可视化编辑器
  • 改进了对 Python 的支持,包括 Python 的环境面板和 Python 对象的可视化
  • 工作台生产率的提高,包括一个命令面板彩虹括号
  • 更具可配置性的工作空间,具有额外的源列和改进的可访问性
  • 在 RStudio Server Pro 中支持 SAMLOpenID 认证,以及对 VS 代码会话的实验性支持

你可以在他们的网站上阅读完整的发行说明。

让我们开始吧!

✍️视觉降价编辑

R markdown 是我每天坚持使用 Rstudio 的原因。从版本 1.4 开始,此功能更深入地集成到系统中,允许您查看文档中的动态变化,而无需每两分钟编织一次文档。

资料来源:RStudio

此更改不是强制性的,您可以使用编辑器工具栏右上角的一个按钮从可视编辑器切换回 classic R markdown 文档。

任何可以在 pandoc markdown 中表达的东西(包括表格、脚注、属性等。)可以在可视模式下编辑。此外,还有许多旨在创作技术内容的生产力增强,如嵌入式代码、等式、引用、交叉引用和内联 HTML/LaTeX。

让我们来看几个新特性:

引文

可视模式使用引用的标准 Pandoc 标记表示法(例如[@citation])。可以从各种来源插入引文:

  • 您的文档参考书目。
  • Zotero 个人或团体图书馆。
  • DOI (文档对象标识符)引用。
  • 搜索交叉引用、数据引用或 PubMed 。

资料来源:RStudio

如果您插入来自 Zotero、DOI 查找或搜索的引文,它们会自动添加到您的文档参考书目中。

这会让写报告快很多。

桌子

现在,您有一个专门的部分来处理表。插入它们,编辑它们,做你通常做的任何事情,但是更快。

来源:作者

来源:作者

不再有愚蠢的内嵌式绘画,比如:

乳液

新的可视化编辑器也适用于方程式。现在你可以写乳胶公式,并立即看到,如果像我一样错过了一些花括号。

资料来源:RStudio

要查看新的可视化编辑器的所有特性,请查看精美的文档。

🐍Python 集成

RStudio 1.4 版本引入了许多功能,这些功能将进一步改善 Python 编辑体验。

当使用 reticulate 时,通常使用 reticulate 函数选择 Python 解释器——例如,通过reticulate::use_python(…, required = TRUE)或通过设置RETICULATE_PYTHON环境变量。(或者,他们信任 r eticulate 找到并激活他们系统上可用的适当版本的 Python。)

然而,人们可能想要控制 Python 的版本,而不明确地使用 reticulate 来配置活动的 Python 会话。RStudio 现在提供了一个 Python 选项面板,既可以全局(通过Tools -> Global Options…)使用,也可以按项目(通过Tools -> Project Options…)使用,可以用来配置 RStudio 中使用的默认 Python 版本。

在 Python 首选项窗格中,可以查看和修改 RStudio 使用的默认 Python 解释器:

来源:作者

此外,当reticulate REPL 处于活动状态时,RStudio 环境窗格现在能够显示 Python 模块的内容。默认情况下,显示主模块的内容。

来源:作者

🔎命令选项板

命令选项板是一种软件启示,它提供对程序所有命令的即时、可搜索的访问。可以使用键盘快捷键 Ctrl + Shift + P(在 macOS 上为 Cmd + Shift + P)来调用调色板。

也可以在工具菜单中找到(工具->-显示命令面板)。

首先也是最重要的一点,命令调板是一种只需几次击键即可快速搜索和调用 RStudio 命令的方法。每个 RStudio 命令都在调色板中,除非它在当前模式下被显式隐藏。这将提高速度,因为从调色板中快速击几下键来调用命令通常比使用鼠标或进入菜单要快得多。

🌈彩虹括号

你是否曾经错过在一个长函数中关闭一个括号或者编辑你的代码(或者从 StackOverflow 中复制粘贴)?现在,这可能是一个过去的噩梦。

在全局选项面板中,您现在可以启用彩虹括号选项:

来源:作者

结果是这样的:

来源:作者

它对 R 和 Python 脚本都有效,并且会使括号匹配变得非常容易。

参考

编辑视觉—https://blog . r studio . com/2020/09/30/r studio-v1-4-preview-Visual-markdown-editing/

python—https://blog . r studio . com/2020/10/07/r studio-v1-4-preview-python-support/

命令面板—https://blog . r studio . com/2020/10/14/r studio-v1-4-preview-command-Palette/

拼接机 3.0 的新功能

原文:https://towardsdatascience.com/whats-new-in-splice-machine-3-0-9047556c3390?source=collection_archive---------44-----------------------

Splice Machine 3.0 增加了地理复制、Kubernetes 支持、时间旅行、Jupyter 笔记本、DB 内机器学习模型部署等等

Splice Machine 是数据库管理系统(DBMS)市场中一个相对较新的细分市场的一部分,在这个市场中,交易和分析功能集中在一起。2013 年 7 月,Gartner 使用术语 HTAP 或混合交易分析处理来描述这一新兴细分市场。弗雷斯特称之为易位。今天,Splice Machine 宣布发布其平台的最新版本,Splice Machine 3.0。这份新闻稿证明了自分析师创造出这些词汇以来,我们已经取得了多大的进步。Splice Machine 是一个集成平台,企业可以使用它来支持其任务关键型运营应用程序,以及用作管理报告的决策支持系统和构建机器学习模型,所有这些都在一个无缝集成的平台上。

使用集成平台的好处是:

  1. 弹性可扩展性
  2. 显著降低开发和许可成本
  3. 最小 ETL 延迟
  4. AI/ML 更快的上市时间
  5. 能够通过现代化来延长传统应用程序的寿命

在 3.0 版本中,我们在添加特性和功能方面迈出了重大步伐,这些特性和功能将使我们的平台能够被企业用来实现其关键任务应用的现代化。凭借全面的 SQL 支持、出色的事务性和分析性工作负载性能、内置的机器学习功能以及内部和云中的统一部署体验,Splice Machine 3.0 在应用程序现代化数据库方面具有独特的定位。

Splice Machine 3.0 为应用程序开发人员、开发人员/数据库管理员、分析师、数据工程师和数据科学家提供企业级功能。在 3.0 版中,DBA 将能够使用分析资源队列按角色分配分析资源,以便特定用户的工作负载获得足够的资源。这有助于确保高优先级工作负载的性能,也有助于在不同的业务组织之间分配计算资源。Splice Machine 3.0 通过主动-被动故障转移来保护业务数据,并在面临自然灾害、基础设施故障和用户错误时确保业务连续性和高可用性。在 Splice Machine 3.0 中,我们通过提供编辑敏感业务数据的能力,提供了广泛的高级安全选项。

Splice Machine 3.0 的标准 ODBC/JDBC 接口使分析师能够集成他们选择的商业智能和数据可视化工具,并提供对数据科学家创建的笔记本的访问,以执行假设分析。3.0 版提供了我们的 ML Manager 2.0,它支持端到端的数据科学工作流,具有前所未有的操作 ML 的简便性,新的原生 JupyterLab 笔记本,以及跟踪 ML 实验的新功能。

Splice Machine 3.0 显著降低了 IT 组织管理运营、分析和 ML/AI 工作负载的负担,以支持历史报告的分析查询和运营记录系统用例。这大大减少了维护该架构所需的实施时间和数据工程师的数量。对于计划从专有数据库迁移的组织,Splice Machine 3.0 通过详尽的 SQL 实施,包括对一些专有 SQL 扩展的支持,提供了遗留数据库的无缝替换。Splice Machine 3.0 提供了与基础设施无关的部署,可以灵活地部署在内部或云上。

拼接机 3.0 在多个功能领域进行了重大改进,包括:

  • 工作量管理
  • SQL 覆盖率
  • 复制和高可用性
  • 安全性
  • 数据科学生产力
  • Kubernetes 支持

让我们来详细探讨其中的每一个。

工作量管理

  • **应用服务器队列:**该特性支持使用多个 OLAP(在线分析处理)队列,允许用户为特定查询预留集群容量,跟踪每个服务器/角色消耗的资源,并为特定种类的查询和组织管理资源容量。该功能允许用户相互隔离工作负载,以确保即使在多个资源密集型查询同时运行时也有足够的资源可用。

Splice Machine 3.0 引入了应用服务器队列(asq)来提供工作负载管理和隔离。

公平调度器使集群上的所有应用程序都能获得同等份额的集群资源。容量调度程序为用户指定最小或最大容量

SQL 覆盖率

  • 对特定于 DB2 的 SQL 语法的支持: Splice DB 3.0 现在支持许多特定于 DB2 的扩展,这使得通过最少的 SQL 重写就可以轻松地从 DB2 进行迁移。例子包括支持 DB2 触发器语法、错误代码、文本操作语法等。
  • **全外连接支持:**全外连接是一些 SQL 语言中的一个连接选项,可以通过使用以前的 Splice DB 语法重写查询来实现,但现在在 Splice DB 3.0 中直接支持。这将消除重写针对使用这种语法的遗留数据库编写的查询的需要。
  • 时间旅行—时间点查询: Splice DB 3.0 支持强大的新 SQL 语法扩展,允许数据库用户查询过去某个时间的数据库。这种功能在很多情况下都非常有用。它可用于在处理缓慢变化的维度时支持灵活性,支持各种数据审计场景,了解用户所做的可能需要取消的更改,再现历史报告,以及分析一段时间内的趋势。

时间点查询或时间旅行查询允许数据库用户查询过去某个时间点的数据

  • **增强的触发器支持:**Splice Machine 3.0 为触发器提供了新的选项,允许更灵活地处理可触发自动操作的事件,以及作为这些触发器的结果可采取的操作。

复制和高可用性

  • **主动-被动复制:**在此版本中,Splice DB 支持通过主动-被动复制自动保持同步的多个数据库集群,以实现严格的恢复点目标(RPO)和恢复时间目标(RTO)。

Splice DB 3.0 包括异步、主动/被动复制

安全

  • **模式访问限制:**允许限制对属于指定模式的对象的访问,这样,如果没有适当的管理权限,其他用户就无法查看、访问甚至了解这些对象的存在。

必须明确授权用户访问 sys 模式,或者必须禁用模式限制配置。

  • **日志编校的定制模式匹配:**该特性允许用户使用正则表达式定义的模式来编校系统日志中的敏感信息。

可以通过定义“掩码”将日志配置为自动识别和编辑敏感信息

数据科学生产力

  1. 对 Jupyter 笔记本的支持: Jupyter 笔记本是目前最流行的开源笔记本实现。在拼接 DB 3.0 Jupyter 笔记本电脑是标准。Splice 的本地 Jupyter 支持来自 JupyterHub 和 BeakerX。
  • JupyterHub 是向多个用户提供 Jupyter 笔记本的最佳方式。每个用户都有自己的专用服务器来托管、存储和运行他们的 Jupyter 笔记本电脑,并且保证用户与其他人隔离。由于增加了链接 GitHub 帐户的功能,用户可以轻松共享笔记本电脑,从而加快协作和开发速度。
  • BeakerX 是位于 Jupyter 之上的一个附加层,提供了许多强大的功能:
  • 多语言编程。每种语言都有独立的内核,Splice Machine 允许在一个 Jupyter 笔记本中用多种不同的语言编程,从 SQL 到 R 到 Python 甚至 Java 和 Scala。这极大地增加了开发时间,因为它允许特性工程和实验在同一个地方进行。
  • 跨内核变量可用性。BeakerX 的全局名称空间为构建跨语言模型创造了机会。您可以将变量存储到 Python 内核中的全局 beakerx 对象中,并在 r 内核中访问这些数据。您甚至可以在 SQL 中选择一个变量,并从任何其他内核中访问它。这一强大的功能为任何想要快速进入并分析其数据子集的数据科学家节省了大量时间。

2.**模型工作流管理**

  • 通过我们基于 MLFlow 的新 MLManager 平台,我们已经结束了机器学习生命周期。我们改进的 API 使管理您的 ML 开发变得更快更容易,从模型参数和指标的批量记录到管道阶段和特性转换的完全可见性。只需添加几行代码,您就可以在几秒钟内重新创建任何 ML 管道。
  • 因为一切都存储在 Splice DB 中,所以维护模型的治理特别容易。通过直接访问培训和测试表,您可以确保新模型与当前部署的模型基于相同的数据进行评估。
  • 新的数据库内事务性机器学习模型部署—具有一个基于数据库触发器的数据实时评分功能。
  • MLFlow 1.1.0
  • 与平台无关:模型、工件和元数据保存在 Splice DB 中
  • 对 SQL 炼金术的拼接支持

重大平台升级

  • 支持 Cloudera 6.3 和 HWX 3.2.3
  • Apache Spark 和 Apache HBase 的最新版本: Splice Machine 3.0 使用户能够利用 HDFS 3.0、HBase 2.0 和 Spark 2.4.1 提供的底层功能

Kubernetes 支持—原生 Spark 数据源(NSDS)

Splice 使数据工程师和数据科学家能够使用熟悉的火花模式,通过数据帧与数据库进行交互。NSDS 2.0 通过容器/网络边界将数据帧流式传输到 Splice,提供了一种在 Kafka 后台实施的高吞吐量解决方案。

NSDS 支持数据工程师和数据科学家对 Spark 数据帧进行拼接操作,避免了 JDBC/ODBC 协议 serde 和网络开销。

要观看拼接机器 3.0 的运行,请注册参加网络研讨会。

YOLOv4 有什么新功能?

原文:https://towardsdatascience.com/whats-new-in-yolov4-323364bb3ad3?source=collection_archive---------6-----------------------

YOLO 是一个实时物体识别系统,可以在一个帧中识别多个物体——而且它还变得更好了!

YOLO 实时检测视频中的对象。

什么是 YOLO?

YOLO 是你只看一次的简称。这是一个实时对象识别系统,可以在单个帧中识别多个对象。YOLO 识别物体比其他识别系统更准确、更快速。它可以预测多达 9000 个类,甚至看不见的类。实时识别系统将从图像中识别多个对象,并在对象周围创建边界框。它可以很容易地在生产系统中训练和部署。

这里有几个你可能感兴趣的链接:

- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]

你愿意多读一些这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。

YOLO 是如何工作的?

YOLO 是基于一个单一的卷积神经网络(CNN)。CNN 将图像划分成区域,然后预测每个区域的边界框和概率。它同时预测这些类别的多个边界框和概率。YOLO 在训练和测试期间看到整个图像,因此它隐式地编码了关于类及其外观的上下文信息。

YOLO v3 对 YOLO v4

谁开发了 YOLO?

YOLO 是由约瑟夫·雷德蒙开发的。2016 年推出的 YOLO 实时物体识别系统是物体识别研究的基石。这导致了更好更快的计算机视觉算法。

YOLOv4 是谁开发的?

YOLO v4 由阿列克谢·博奇科夫斯基、钱和廖宏远三位开发人员开发。

为什么 Joseph Redmon 不开发 YOLOv4?

他放弃了开发 YOLO v4,因为他的技术可能被滥用。他特别提到“军事应用和数据保护问题”。他停止了对计算机视觉的研究,因为他发现其中涉及的伦理问题“变得无法忽视”。

YOLOv4 有什么新功能?

YOLOv4:物体检测的最佳速度和精度

YOLOv4 的架构由 CSPDarknet53 作为主干,空间金字塔池附加模块,PANet 路径聚合颈和 YOLOv3 头组成。

CSPDarknet53 是一种能够增强 CNN 学习能力的新型主干。在 CSPDarknet53 上添加了空间金字塔池块,以增加感受野并分离出最重要的上下文特征。PANet 取代了 YOLOv3 中用于目标检测的特征金字塔网络(FPN ),用作不同检测器级别的参数聚合方法。

什么是成绩的提高?

YOLOv4 的速度是 EfficientDet(竞争识别模型)的两倍,但性能相当。此外,AP(平均精度)和 FPS(每秒帧数)相比 YOLOv3 分别提高了 10%和 12%。

结论

YOLO 是一种未来主义的识别器,具有更快的 FPS,比现有的探测器更准确。该检测器可以在传统的 GPU 上训练和使用,这使得广泛采用成为可能。YOLOv4 中的新功能提高了分类器和检测器的准确性,并可用于其他研究项目。

参考

在你走之前

在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。

照片由Courtney hedge在 Unsplash 拍摄

机器学习之后的下一步是什么?

原文:https://towardsdatascience.com/whats-next-after-machine-learning-1ad89aa45997?source=collection_archive---------53-----------------------

安迪·凯利在 Unsplash 上的照片

商业和组织的观点

最近,人们越来越关注机器学习及其在个人和商业环境中的应用。维基百科将其定义为:

“对通过经验自动改进的计算机算法的研究”

机器学习利用数学模型和大数据来解决商业问题。这需要数据工程和数据科学的两个关键支持领域。在数据工程中,云计算的发展使得大数据可以廉价地存储。在数据科学领域,数据科学家和数据科学工具的兴起使得模型构建和探索变得更加容易。

然而,机器学习并不是数据分析进化之旅的顶峰。基于我丰富的组织经验数据分析愿景和实施,还有另一个明确的下一步。

为了理解接下来会发生什么,让我们来探索数据分析随着时间的推移而发生的演变。下面我将讨论 3 个关键的组织疲劳:

身体疲劳

许多组织都是以人为本的。这包括在电子表格或零散数据源中运行手动数据刷新的人员。鉴于对定期更新数据的需求和资产数量的不断增加,这种模式是不可持续的。我们称之为身体疲劳。

为了解决身体疲劳,组织正在投资自动化。这允许创建更多的数据处理和近乎实时的执行。所有这些都是通过利用相同数量的人员完成的。

决策疲劳

许多组织正在做出“直觉”决定。这主要是由于与组织决策相关的复杂因素,尽管有大量的数据和信息。因此,决策往往是不知情的或仓促的,这将导致次优的组织成长。我们称之为决策疲劳。

为了解决决策疲劳,组织正在投资机器学习。数据科学家通常被带入公司,通过预测性数学算法整合所有数据和因素。这使得组织能够做出非常复杂而又不那么明显的明智而主动的决策。

洞察力疲劳

许多组织没有提供足够的见解。这通常表现为周转时间长和缺乏业务背景。典型的根本原因通常与组织数据成熟度增长导致的指数级需求增长有关。此外,通常缺乏有才能的资源来帮助整个组织。我们称之为洞察力疲劳。

为了解决洞察疲劳,组织需要投资数据民主化。这包括创建生态系统、文化和工具,使企业能够“自助服务”。此外,它将实现数据团队和业务团队之间从“提供者”到“合作伙伴”的更大的工作协作。

走向数据民主化

最后,组织越来越倾向于数据驱动,因为它能产生竞争优势。在旅程中,值得注意的是解决三个主要疲劳的演进旅程。最重要的是,随着机器学习的大肆宣传,承认数据民主化可能是下一个重要步骤是很重要的。在这一前沿领域,需要更多的思想领导力和重点领域,以实现切实可行的组织变革。

如果你喜欢这篇文章,并想看更多的内容,请考虑加入媒体会员,使用下面的链接来支持我和其他作者:

[## 通过我的推荐链接加入 Medium-Albert Suryadi

阅读艾伯特·苏亚迪(以及媒体上成千上万的其他作家)的每一个故事。您的会员费直接支持…

albertsuryadi.medium.com](https://albertsuryadi.medium.com/membership)

关于作者:Albert sur yadi是蓝筹股组织中实现高级分析和数据科学能力的公认领导者。他被公认为分析团队(实践社区)的领导者,该团队授权并激励他人超越现状。

你在想什么?

原文:https://towardsdatascience.com/whats-on-your-mind-a8f556af8839?source=collection_archive---------57-----------------------

皮质

第 2 部分:运动想象的机器学习

图片来源:chombosan | Getty Images

1 部分,共 4 部分:大脑计算机界面之旅的开始

2 部分,共 4 部分:运动想象的机器学习

当我们还是孩子的时候,世界对我们来说是新的。我们不能理解它,但我们可以用我们的感觉器官看到它,触摸它,闻到它,以及更多。除了翻译。但是随着年龄的增长,我们的老师、父母等等。教会我们社会和物质世界是如何运作的,让我们最终形成新的视角来理解我们周围的世界。随着大数据和不断改进的计算机器时代的到来,研究人员开始以同样的方式思考机器;空白的石板,当美联储收集数据(充当老师),它可以开始形成关于数据集描述的系统的新见解。尤其是这方面最著名的例子是 IBM 的沃森,一种能够提取重要数据并提供分析和见解以预测工作场所和行业结果的人工智能。沃森是使用大型金融和企业数据集进行训练的,使其能够提供人类因大量数据而无法检测到的洞察力。随着机器智能的这些进步,研究人员已经开始在不同领域使用学习系统,特别是神经科学和神经计算领域。诸如线性判别分析(LDA)和支持向量机(SVM)之类的机器学习算法可以用于检测脑电波中的模式,这些模式可以导致运动和情绪状态分类。

这个系列试图让一个在脑机接口(BCI)领域没有专业知识的人了解他们是什么,以及我们如何使用机器学习以独特的方式分析脑电波。本系列探索的项目是与阿拉巴马大学人类技术互动实验室的克里斯·克劳福德博士合作的。这也证明了业余科学家可以使用基本的脑电图(EEG)设备来提取和分析脑电波,进而可以部署大规模的开源平台,以便公众可以用自己的大脑数据进行实验。

在这里,我们将涵盖机器学习背后的基础知识及其在脑波分类中的应用:

  1. BCI.js 简介:我们将过一遍 BCI.js ,一个动态高效的库,用于对脑电波数据运行基本的机器学习算法。
  2. 实验流程:在我们进入算法本身之前,建立一个实验流程将有助于我们理解运行这些算法所必需的设置。
  3. 线性判别分析(LDA)和公共空间模式(CSP):我们将探索这两种机器学习算法,以及它们可以给我们的运动和情绪状态分类的洞察力。

为了实现本文中描述的项目部分,您将需要以下内容:

  • 对 JavaScript/React 以及如何使用 React 组件创建组件树有初步了解。这里是 React 文档。
  • 一个 Chrome 浏览器和一个 Muse EEG 版本 2

本系列的第 1 部分探讨了 Muse EEG、蓝牙系统和项目架构;这里可以看

BCI.js:一个强大的机器学习库

一个基于 EEG 的 BCI 项目从使用电极系统或小型硬件解决方案(如 Muse EEG)收集神经系统数据开始。然后,这些数据被传输到 MATLAB 等计算环境中,在那里用傅里叶变换(将在本系列的后面讨论)等过滤算法和 LDA 等分类算法进行处理。阿拉巴马大学人类技术互动实验室的研究人员意识到,MATLAB 对脑电波的分析不是模块化的,不能分布在采用这种数学建模的应用程序中。他们试图将这些算法移植到更模块化的编程语言中,如 C 语言,但这对编程新手来说很难实现,而且学习曲线很陡。 BCI.js 就是为了解决这些问题而开发出来的;它是一个 JavaScript 库,可移植且相对易于使用,是开源的,并且可以很容易地与现有的应用程序集成。

BCI.js 包含许多可以帮助脑机接口应用开发的模块,但最重要的是用于机器学习算法的学习分类函数、混淆矩阵函数和转置函数。学习分类功能代表机器学习系统的两个主要阶段:学习和分类。在我们之前的类比中,学习步骤旨在充当教师,向系统提供数据,目的是在能够从新数据中得出自己的结论之前,向程序传授有关环境的知识。在分类步骤中,程序能够根据新的数据集以及从训练数据中学习到的信息来识别某些模式。为了说明这一点,我们将以线性判别分析(LDA)为例。LDA 是一种算法,它在两个数据类之间绘制一个边界,允许对新数据进行分类。我们将在本文的后面讨论 LDA 背后的数学,但是由于这是一个 learnclassify 函数的例子,这个定义已经足够了。下面是用于从现有数据中学习和对新数据进行分类的 LDA 函数的示例。类别 1 和 2 分别代表范围从 0 到 27 到 10 的两类数据点。 *ldaParams* 是存储从 *ldaLearn* 函数学习到的优化函数的变量,predictions 存储*未知点*所属类的分类向量。我们将在下一节中介绍优化函数以及 LDA 实际上是如何学习的,但只需知道 *BCI.js* 为机器学习算法提供了简单的实现,不需要深入的数学或统计知识。

混淆矩阵函数是 BCI.js 必须提供的第二个最重要的函数。混淆矩阵是分类系统上的性能度量,其利用分类结果的识别作为假阳性/阴性和真阳性/阴性。混淆矩阵的术语可能很难,但是这里的是让你熟悉这些术语的资源。

混淆矩阵示例

这个混淆矩阵将允许我们分析我们的机器学习模型的性能,并调整系统,以最小化系统中的假阳性和假阴性的数量。下一个最重要的,也可能是最简单的函数是转置函数,它做一件基本的事情:翻转一个对角线上的矩阵(从左上延伸到右下),同时保持元素的原始顺序。在大多数矩阵中,左上、中、右下的元素在转置时保持在它们的原始位置,因此原始元素顺序保持不变。转置功能很有用,因为它允许一个矩阵满足矩阵乘法的要求(参见这里的以深入了解乘法时矩阵的维数)。

由 Codeforwin 提供

四个函数, learnclassify混淆矩阵和 *transpose、*在对大脑数据运行机器学习模型时极其高效。它还允许实时处理,由 BCI.js 实现的一些机器学习算法只需不到 4 毫秒即可完成。考虑到一些机器学习模型可能需要几个小时的训练, *BCI.js* 允许极快高效的实验。现在我们已经建立了这四个函数,我们将介绍实验流程和 LDA 以及公共空间算法(CSP ),以便我们可以开始在大脑数据上实现它们,用于运动状态分类。

如果你有兴趣回顾脑电图数据使用的其他常见分类策略,请查阅这篇论文:分类系统 10 年回顾。

实验流程

在我们进入关于这两种机器学习算法的技术细节之前,让我们先回顾一下。一旦系统开发完成,应该如何进行实验?我们可以使用机器学习模型的基本轮廓作为我们协议的基础;我们知道它需要一个训练阶段和一个测试阶段。如前所述,训练阶段“教导”模型理解标记的数据,以便在测试阶段,它可以在新数据中搜索和识别相似的模式。可以根据这个概念建立一个协议;我们需要一系列的训练和测试阶段来深入了解特定的认知任务。在这个项目和系列中,主要的认知任务集中在运动想象上,因为我有兴趣探索用 Muse 检测想象运动的可行性。

这个硬件不是为运动想象而设计的,但对于简单的运动任务来说已经足够了。这里是对前运动皮层和检测想象运动的硬件的回顾。

在本节中,我将使用右手和左手运动检测的例子来描述一个理想的实验流程,然后您可以推断出不同的认知活动的分类。

在右手与左手运动检测中,我们的目标是识别对象是在移动他/她的右手还是左手(甚至是两者的混合)。我们可以通过建立两个训练集和一个测试集来实现这一点:一个训练集用于右手数据,另一个用于左手数据,一个测试集用于测试阶段的未知数据点。在时间上,我们把它分成三个块,受试者记录他们自己移动右手一段时间,然后是左手,然后是他们希望模型分类的手部动作。例如,受试者 A 在记录期间移动他们的右手,然后移动他们的左手,对于测试集,他们决定只移动他们的右手。在对测试集中描述的运动进行分类之前,模型有足够的时间用两个训练集来训练自己。下面是实验流程的架构图。

实验流程

在第 1 部分中,我提到为了节省计算时间,我们将存储在训练和测试集中的数据点(缓冲区)数量限制在 2000 左右。您可以随时增加或减少该数量,但需要注意的是,训练和测试收集周期必须足够长,以满足缓冲区设置的限制。如果不是,那么不相等的数组大小使得模型不可能正确训练。举个例子,在采样率为 256(每秒收集 256 个值)的情况下,填充 2000 个数据点的缓冲区大约需要 10 秒钟。当你开发自己的应用程序时,我给你的建议是选择这两个变量:最小化计算时间,最大化收集效率,限制训练和测试时间。计算时间最小化和收集效率最大化是机器学习的模型标准,但我们为什么要限制训练和测试的时间呢?尽管更多的训练数据会使你的模型更精确,但通过脑机接口实验,让你的参与者接受超过一分钟的活动是乏味和多余的;大多数有意义的数据会在实验的早期出现。

实验流程在 BCI 应用中极其重要,甚至必须在创建和测试机器学习模型之前建立。了解您的实验流程实际上可以让您清楚您的模型试图优化什么性能任务,从而更容易开发模型。现在有趣的事情开始了,我们将讨论两种基本的机器学习模型:LDA 和 CSP。

线性判别分析

线性判别分析(LDA)是统计学和模式识别中使用的一种方法,通过找到特定特征的线性组合来表征两类或更多类数据。虽然这个定义看起来很复杂,但算法背后的直觉其实相当简单。让我们以天气为例;我们将使用两个指标来确定与天气相关的一天的类型:温度和降水百分比(下雨的可能性)。对于我们的两个类别,热天和冷天,较高的温度和较低的降水百分比表示热天,冷天则相反。当用 x 轴建模温度和 y 轴建模降水量绘制在图上时,右下角的点是热的,左上角的点是冷的。下面是 16 个不同日子的曲线图(冷热混合),每个班 8 天。LDA 将找到每个类的中心,并定义一个斜率和截距形式函数来分隔这两个类。因此,模型已经从训练数据中学习了哪些天是热的或凉爽的。如果您要向模型提供第 17 天的天气信息(作为测试集的一部分),模型可以对其进行适当的分类。

温度与降水

在这一部分,我们将介绍 LDA 背后的数学原理,以及它如何应用于运动想象任务。如果你对统计学不熟悉,可以跳过数学部分;它不会限制你对 LDA 应用部分的理解。

LDA 的数学

分类的正式定义是根据共有的特征和质量排列数据的过程。我们如何用数学方法将这些数据点归入各自的类别?在分类中,我们考虑 Y 类,类别 i ,以及一个输入向量 X ,假设只有两个类别/类。我们可以将 X 归类为最大化类:

LDA 中的分类依赖于贝叶斯定理,该定理规定:

我们将 X 被分类到每个类中的概率与在该类中被分类为 X 的每个后续值相关联,本质上识别每个子类中的数据聚类。由于我们希望贝叶斯定理提供一个具有良好数学特性的概率密度函数,因此使用了正态分布的公式:

正态分布提供的标准模型预测可变行为,如果这种预测不成立,模型的性能就会下降。将正态分布代入贝叶斯定理时,最大化结果值将导致正确的分类预测。简化后,判别函数为:

其中使用了类别 i 中输入的平均值(在我们的情况下为两个)和我们两个变量之间协方差的倒数(标准偏差)。 X 被分类到产生最高判别函数值的类别中。当评估两个类别的判别函数时,可以使用生成的等式对输入进行分类。如果有两个以上的类,跨 i 类评估上述函数;然而,为了运动想象的目的,两节课就足够了。为了绘制天气示例中显示的决策边界,您可以从两个类的判别函数输出中获取两个斜率的平均值,这将准确地绘制两个数据聚类之间的边界。现在,让我们继续右手和左手运动的运动想象的例子。

LDA 和运动想象

正如我们在第 1 部分中所建立的,在训练阶段收集的数据存储在 React 上下文中,以便可以随时从任何组件访问它。通过为 LDA 创建一个单独的组件,我们可以划分我们的代码,同时仍然能够向该组件传递值以及从该组件传递值。BCI . js' LDAlearnclassify 可用于从训练数据中学习参数并对新点进行分类。在 learn 函数中,计算了决策边界的斜率和截距,因此无需自己实现上述计算。在我们将数据输入 LDA learn 函数之前,我们必须从 CSP 算法中计算 LDA 参数,如下所示。

虽然我们还没有讨论 CSP,但我们采用了 CSP 信号投影算法来分离和放大这两个信号。计算特征函数用于计算参数并放大训练集的信号,然后我们可以在学习函数中使用这些信号来计算 LDA 的参数。下面是从预处理到 LDA 参数的数据流的代码片段。

我们首先转置数据集,以符合前面解释的矩阵乘法规则。然后,我们学习 CSP 的参数,以便我们可以隔离和放大两种不同的信号类型,一种用于右手运动,另一种用于左手运动。然后,我们从 CSP 参数和每个训练集生成特征向量,这将有助于训练分类器。接下来,学习 LDA 参数,并生成两个变量θbθ描述 x 和 y 的变化, b 描述线性函数的截距。斜率 m 通过取 y 的负变化并除以 x 的变化来计算,并且 b 使用 x 轴的分布来归一化。我们可以用θb 来描述一个方程 y = mx+b 来定义我们的决策边界。下面是绘制的 LDA 的两个示例,带有决策边界。

两个不同实验的 LDA

该可视化表示比较右手和左手运动的两个数据集。在这个实验中,受试者移动他们的左手或右手来收集两组训练数据。在图像的顶部,显示了一个图表,其中受试者在两个训练集中混合了右手和左手运动,这使模型混淆。在图像的底部,受试者在一个训练集中思考左手运动,在另一个训练集中思考右手运动,模型根据信号幅度准确地分离右手数据集(红色)和左手数据集(蓝色),并使用判别函数在两个数据集之间绘制决策边界。通过适当训练的模型,测试数据可以根据绘制的线准确分类,用户可以直观地看到他们的脑电波的分类。

这都是为了艾达!我们讨论了算法背后的数学,以及如何在运动想象实验中应用它来绘制决策边界。接下来,我们将介绍常见的空间模式(CSP)算法,以及如何使用它们来隔离信号以帮助分类。

常见空间模式

用于多通道 EEG 设备中运动状态分类的另一种算法是公共空间模式,或 CSP。该方法使用线性变换将多通道 EEG 信号投影到子空间中以生成空间模式向量。在本节中,由于上一段中的天气示例不适用,因此我们将使用右手和左手运动分类的重复示例。虽然我们不会涉及常见空间模式的数学,因为这超出了本系列的范围,但我们将探索与运动想象相关的 CSP 示例。

CSP 算法本质上是隔离和投射信号。举个例子,如果您同时播放两个音频信号,CSP 算法可以将信号隔离并投影到同一个子空间,从而允许您单独分析这两个信号。我们已经在运动想象和 LDA 中看到了类似的例子,其中 CSP 算法将两个信号(右手和左手)投射到两个独立的轴上。下面是一个例子,红点代表右手运动,蓝点代表左手运动。红点沿 x 轴投影,蓝点沿 y 轴投影,这是 LDA 从每个信号生成参数的关键。绿点来自测试集,投影在两个轴上,意味着左手和右手都有运动。

左手与右手运动想象的 CSP 图

CSP 算法本身并不作为一种学习形式,而是处理数据以使学习过程更容易。 BCI.js 结合了 CSP 和 LDA,创建了一个强大的处理和分类系统。然而,还有其他形式的处理,如傅立叶变换,可以提供更好的精度和性能。傅立叶变换可以与支持向量机(SVM)算法相结合,以在某些情况下提供更高的分类精度。我们将在第 3 部分讨论这个系统。然而,要构建一个简单的分类系统,CSP 是一种很好的处理方法,可以更好地帮助分类算法从 EEG 数据中提取特征。

结论

在本文中,我们介绍了 BCI.js、实验流程和 CSP-LDA 分类模型组合。你现在可以实现这个解决方案,开始从脑电波中提取有意义的数据。以下是一些有用的提示:

在本系列的第 3 部分中,我们将深入探讨一些更复杂的算法,如傅立叶变换和 SVM 算法,从而构建我们对机器学习的讨论。我们还将介绍一种通过称为数据带通滤波器的方法来提高模型精度和数据质量的方法。

请继续关注第 3 部分!

出什么事了?:关于流行音乐流行原因的探索性分析项目

原文:https://towardsdatascience.com/whats-popping-an-exploratory-analytics-project-on-what-makes-popular-music-popular-7b183e6e48d2?source=collection_archive---------31-----------------------

对 Lyric、Spotify 和 Twitter 数据的 R 分析

照片由埃利斯·摩尔在 Unsplash 拍摄

你有没有想过流行歌曲有什么共同的特点?你有没有听过一首流行歌曲,并想知道为什么它如此受欢迎,因为它的歌词真的很基本?(看着你,舞猴。)

音乐是每个人都听的东西。它以各种不同的形式和流派存在,是一种人们在非常个人的层面上产生共鸣的艺术形式。这使得分析不仅作为一种文化产品,而且由于现代分析,作为一种数据产品变得特别有趣。Spotify 等公司通过每周策划播放列表和 Spotify Wrapped 等项目开创了这种分析和音乐策划。我认为在一个更高、更数据化的层面上剖析一些我们都非常珍视的东西会很有趣。在这个分析中,我将探索歌曲的内容,包括歌词和音乐,如何与其流行度相关联,以及围绕歌曲的歌词和流行情绪如何转化为流行度。然后,我将应用我的发现来分析坎耶·韦斯特的椎间盘造影术。

用于为该分析提供信息的人类行为数据包括来自 Spotify API 的流行数据和来自 Twitter API 的情感分析。

流行歌曲中最常见的词

最流行单词的单词云(约 200 个单词)

“爱”是热门歌曲中最流行的词。你上一次听到与爱情无关的歌曲是什么时候?

结果并不令人惊讶。这个词云显示了流行歌曲中的前 200 个词,越大的词意味着出现的次数越多。流行歌曲是那些能引起很多人共鸣的歌曲,而“爱”绝对是每个人生活中常见的主题。许多其他流行词都是非常常见的词,也是以“爱”为主题的。“Like”和“babi (baby)”在列表中也很高,因为它们也属于这种一般的浪漫类型。

其他大多数热门词汇都很常见:想要、知道、能、制造、不要、得到等等。其中很多往往是连接歌词部分的动词,可能出现的频率更高,因为它们很短,在歌词中容易使用。其他单词如“耶”和“嘿”是常见的填充词。

一些更有趣的词仍然很常见,尽管它们在这个词云上可能会变小,它们是:夜晚、时间、好、心、女孩等等。这些词也遵循轻微的浪漫主题。

荣誉提名去了 F 字和 B 字。

使用的数据集:3(附录)

按流派分类的最常用词

从左到右,从上到下排:另类/独立,嘻哈/说唱,摇滚,流行,R&B/灵魂乐,乡村

每种体裁中的热门词汇往往非常相似,有些词在某些体裁中出现的次数比其他体裁多。例如,Hip-Hop/Rap 中咒骂语的频率比其他流派高得多。R&B/灵魂使用更多的填充词,如“只是”和“是”。

使用的数据集:1(附录)

流行歌曲中最流行的词

按十年划分的前 16 个单词的计数数据框架

热门词汇随时间变化的趋势(折线图形式)

这两个图表显示了十年来歌曲中最热门词汇的数量。随着时间的推移,大多数流行词的计数都有增加的趋势,这很有趣。该数据集包含每年前 50 首歌曲,因此歌曲数量受到控制。这意味着这些词在更新的歌曲中出现得更多;这可能与最近的歌曲具有更多重复的歌词/诗句的现象有关。

下图更直观地展示了字数是如何随时间变化的。大多数单词会随着时间的推移而增加,但有些单词的数量会减少。2010 年的数据全面下降,但这可能是因为数据不完整(数据集只包括 2010 年至 2015 年的数据)。然而,从 20 世纪 90 年代开始,一些词的出现频率似乎有所下降,如“get”、“love”和“babi ”,这表明歌曲歌词稍微偏离了浪漫。

使用的数据集:3(附录)

流行歌曲的抒情情怀

平均抒情情绪

在使用歌词计算歌曲的整体情绪后,计算了 1964 年至 2015 年公告牌 100 强年终排行榜的平均情绪。平均情绪如上图所示,似乎总体呈下降趋势。然而,尽管有这种下降趋势,总体情绪仍然是积极的(> 0)。一段时间内,歌曲人气波动似乎很大。例如,从 2007 年到 2011 年,市场人气有所下降,这可能与 2008 年金融危机有关。

使用的数据集:3(附录)+我使用 syuzhet 进行的情感分析

按流派划分的抒情情绪

按流派划分的情感得分

以上是按流派划分的平均情绪表。此分析中使用的数据集是一个包含歌曲名称、歌词和流派信息的大型数据集。使用 syuzhet 方法(因为它在字典中有最多的单词),通过将歌曲按流派分组来计算情感,积极的分数意味着更积极的歌曲。从这些结果中,我们看到金属是负面情绪最多的流派,其次是嘻哈/说唱和朋克作为下一个负面情绪流派。最积极的流派是布鲁斯/爵士乐和乡村音乐。

使用的数据集:1(附录)+我使用 syuzhet 进行的情感分析

流行歌曲的音乐特征

Spotify API 通过各种属性来描述每首歌曲的特征。例如,可跳舞性是“基于包括速度、节奏稳定性、节拍强度和整体规律性在内的音乐元素的组合,一个音轨有多适合跳舞”的度量,0 是最不适合跳舞,9 是最适合跳舞。你可以在这里找到其余的定义。

上图显示了 1964 年至 2015 年美国公告牌百强年终排行榜中的 7 个特征。一些有趣的趋势是,随着时间的推移,流行歌曲变得越来越不声学(红线)。效价,或者一首歌听起来有多积极/消极,也在轻微下降。除了趋势,有趣的是,这些流行歌曲往往具有相对较高的可舞性、活力和效价。他们也倾向于低语音,活跃度和工具性。

使用的数据集:3(附录)+我的 SpotifyR 采集/分析

流行歌曲的音乐情感与抒情情感

我觉得比较歌词的积极程度和音乐听起来的积极程度会很有趣。Spotify API/SpotifyR 包有一个度量标准,你可以用它来衡量这一点。这种特性被称为价,它被定义为“[对]一首曲目所传达的音乐积极性的描述”。

为了比较这两种情绪,因为它们是在不同的尺度上计算的(化合价的值是 0 到 1;歌词情感是单个单词情感值的总和),我决定将音乐和歌词的情感分数简单地转换为它们总体上是正面的还是负面的。积极的歌词情感分数用 1 表示,消极的分数用 0 表示。积极的音乐情感分数或价数用 1 表示,消极的分数用 0 表示。为了将化合价分数转换为正数或负数,我选择 0.5 作为 0 到 1 的总临界值,因为整个 Spotify 的化合价分布看起来相对正常和对称。

#initializing the columns on the dataset
allfeatures$lyric.comp = c(2) 
allfeatures$music.comp = c(2)#looping through songs and assigning 0/1 for both lyric and musical sentiment scores
for (i in (1:nrow(allfeatures))) {
  if(allfeatures$sentiment[i] < 0) {
    allfeatures$lyric.comp[i] = 0
  } else {
    allfeatures$lyric.comp[i] = 1
  }

  if(allfeatures$valence[i] < 0.5) {
    allfeatures$music.comp[i] = 0
  } else {
    allfeatures$music.comp[i] = 1
  }
}
View(allfeatures)#calculating % of songs that have same sentiment for  music and lyrics
mean(allfeatures$lyric.comp == allfeatures$music.comp)

结果是, **60.89%的歌曲具有相同的音乐和抒情情感,**意味着它们要么[听起来消极,有更多消极的话]要么[听起来积极,有更多积极的话]。其余 39.11%的歌曲具有不同的音乐和抒情风格。这意味着他们要么[听起来积极,但有更多消极的话]要么[听起来消极,但有更多积极的话]。

使用的数据集:3(附录)+我的 SpotifyR 采集/分析

预测一首歌是否进入前 10 名

逻辑回归输出

我建立了三个不同的预测模型来预测一首歌是否会成为热门歌曲(出于这个项目的目的,半任意地定义为 Billboard 年度排行榜前 100 名)。第一个是使用各种行为和音乐指标的逻辑模型,可以在结果部分找到。

逻辑回归结果*

从汇总模型输出来看,“流行度”,根据 Spotify 指的是歌曲的当前流行度,在预测一首歌是否进入前 10 名方面非常重要(***)。这些数据可以追溯到 1964 年,因此有趣的是,我们可以看到当前歌曲的流行程度与预测一首歌在当时是否流行有关。声音是另一个非常重要的预测因素,从 1.120118 的正“估计”值来看,前 10 名/热门歌曲似乎更有声音。

其他相对重要的变量(**)是可跳舞性和情绪。更多的可跳舞性与更有可能成为热门歌曲相关,这符合流行歌曲往往更容易上口和易于跟随的范式。情感是通过将歌词中的正面和负面单词相加来计算的,值越高意味着歌曲越积极。该模型发现,更积极的歌曲往往更有可能成为热门歌曲/前 10 名。即使悲伤歌曲的兴起,我想人们仍然喜欢听到好的事情。

在清理数据集并向其中添加 Spotify API、流行度和情感数据后,我将数据分为训练集和测试集。设定阈值~0.25 后,准确率为 88.42% ,相当高。然而,由于数据中的大多数值不是点击数/前 10 名(因此将被预测为 0),这些数据点的优势可能会使模型预测更多的点击数/前 10 名,并且在预测前 10 名/点击数的歌曲时不准确。但是,这是一个模型的良好开端,进一步的分析应该检查所使用的预测因子,并进一步完善该模型的预测能力。更大的数据集也有助于提高准确性。

我还对数据运行了最近邻分类和随机森林模型,看看它们是否有更好的结果。精确度是相似的。代码和后续输出如下所示:

# NEAREST NEIGHBOR CLASSIFICATION
#model code, neighbors used = 3
neighbor = knn(allfeatures_train_neighbor, 
allfeatures_test_neighbor, allfeatures_train_neighbor_top10, k=3)#calculating accuracy
mean(neighbor == allfeatures_neighbor[-include_in_train, "Top10"])

从最近邻分类来看,准确率为 87.51%。

# RANDOM FOREST
#model code
rf = randomForest(as.factor(Top10) ~ popularity + key + tempo + 
                    sentiment, data = allfeatures_train_rf)
rf#calculating accuracy
rf_pred =predict(rf, allfeatures_test_rf)
mean(rf_pred == allfeatures_test$Top10)

从随机森林建模,准确率为 88.70%

*有关如何构建该模型的更多详细信息,请参见附录:流程/分析部分。

关于指标的更多详细信息

前两个指标是使用 Spotify API 和 R 包获得的。

  • 流行度:Spotify 歌曲流行度的数值衡量标准(Spotify 自己对流行度的计算可能基于各种因素,如流的数量、独特的流等。).
  • 情绪:从 syuzhet 包中的歌词计算情绪值,并使用 method = "syuzhet "(字典中有最多的单词)。

这些其他度量是使用数据帧中每个轨道的“获取 _ 轨道 _ 音频 _ 特征”获得的。以下单词的定义由 Spotify 给出,可在此处找到:

  • 可跳舞性:根据音乐元素的组合,包括速度、节奏稳定性、节拍强度和整体规律性(从低 0 到高 1),一首曲目适合跳舞的程度。
  • 能量:强度和活动的感知度量。通常,高能轨道感觉起来很快,很响,很嘈杂。例如,死亡金属具有高能量,而巴赫前奏曲在音阶上得分较低。对该属性有贡献的感知特征包括动态范围、感知响度、音色、开始速率和一般熵。
  • key:估计的音轨的整体 key。整数使用标准的音高分类符号映射到音高。例如,0 = C,1 = C♯/D♭,2 = D,等等。如果没有检测到密钥,则值为-1。
  • 语音:音轨中出现的语音。越是类似语音的录音(例如脱口秀、有声读物、诗歌),属性值就越接近 1.0。
  • 声音:一种置信度,从 0.0 到 1.0,表示音轨是否是声音的。1.0 表示音轨是声学的高置信度。
  • 乐器性:预测音轨是否不包含人声。“Ooh”和“aah”在这种情况下被视为乐器。Rap 或口语词轨道明显是“有声的”。仪器性值越接近 1.0。
  • 配价:从 0.0 到 1.0 的一种量度,描述音轨所传达的音乐积极性。高价曲目听起来更积极(例如,快乐、愉快、欣快),而低价曲目听起来更消极(例如,悲伤、沮丧、愤怒)。
  • 速度:轨道的总体估计速度,单位为每分钟节拍数(BPM)。

使用的数据集:3(附录)+我的 SpotifyR 采集/分析

歌词和流行分析的含义

那么是什么让流行歌曲流行起来呢?

  1. 铺天盖地的流行歌曲都有浪漫主题,并提到“爱”和“babi(宝贝)”等词。热门歌曲中的流行词因流派而略有不同,但大多数流派仍将浪漫词作为最常见的词。
  2. 尽管浪漫主题仍然占据着排行榜的主导地位,但自 60 年代以来,“爱”和“babi(宝贝)”这两个词的使用越来越少。也许品味正在慢慢远离浪漫主题的歌曲?虽然现在,他们仍然是最受欢迎的主题。
  3. 歌词情绪或歌曲信息/歌词的积极性正在下降。人们越来越不喜欢非常快乐的歌曲。这可能是由于更悲伤的流派和更能引起情感变化的音乐的兴起。
  4. 当检查音乐情绪或衡量一个声音听起来有多快乐或悲伤时,有一个类似的趋势,人们喜欢听起来更快乐的歌曲(更高价),而不喜欢原声歌曲。人们倾向于喜欢更适合跳舞、更有活力、更有积极意义的歌曲。
  5. 大多数歌曲(~60%)都有一致的歌词和音乐情感,这意味着歌词的积极性与音乐的积极性相匹配。对于流行歌曲来说,在歌曲中传达一致的信息是很重要的。
  6. 当建立一个模型来预测一首歌曲是否会成为热门/前 10 名时,发现歌曲的当前流行度、歌词情感和声音是重要的预测因素。展望未来,该模型的敏感性应该在更大的模型上进行测试,以提供更大的预测能力。然而,这个模型提供了一个大概的指导方针,如果一首歌的作者想要大获成功,他应该遵循什么样的指导方针。

让我们学以致用:Kanye West 分析

照片由 Unsplash 上的 israel palacio 拍摄

说唱歌手兼企业家坎耶·韦斯特(Kanye West)是流行文化偶像。他的职业生涯多产,发行了 10 多张专辑,获得了 21 个格莱美奖和许多其他荣誉,这使他成为迄今为止获得最多奖项和最受好评的音乐艺术家之一。

作为一名艺术家,他一直在不断进化。从他早期更传统的 hip-hop sounding 专辑到他现在更混合的风格,结合了福音、电子和摇滚流派的影响,Kanye 一直被认为是业内的进步和创新者。

在音乐之外,他是一个非常直言不讳,甚至有争议的公众人物。坎耶因在 2009 年 MTV 音乐录影带颁奖典礼上打断泰勒·斯威夫特的演讲而声名狼藉。他经常利用他的平台来表达他对政治和音乐/时尚产业的观点。除了音乐,他还有自己的服装品牌 YEEZY。

综上所述,许多人认为坎耶是一个天才,而其他人则认为他是另一个令人讨厌的精神错乱的名人。无论哪种方式,看看 Kanye 的光盘目录是否与我们在上面收集到的一般结论一致都将是有趣的。他是一个在职业生涯中不断发展的艺术家,并产生了很多轰动,这使得这个分析特别有趣。他的歌词跟随流行歌曲的趋势吗?在他的职业生涯中,他的音乐和歌词在哪些方面发生了变化?我们能预测他的哪些歌曲是热门/前 10 名吗?最重要的是,人们对 Kanye 的音乐有什么感觉?

在我们深入分析之前,我想花点时间提醒你一些我最喜欢的标志性的坎耶歌词:

“星期天关门,你是我的福乐鸡快餐店”(出自耶稣为王)

" Poopy-di Scoop
Scoop-Diddy-hook
hoop-di-Scoop-di-Poop
Poop-di-scoopty "
(出自《自我提升》)

“如果你摔倒在水泥地上,那是你屁股的错”
(出自我美丽黑暗扭曲的幻想)

本节中使用的人类行为数据是为每张专辑收集的推文,然后进行情感分析。更多细节见下文。

在这个分析中,我修改了一个数据集,其中包含 Kanye 的全长个人专辑的歌曲、艺术家和歌词信息,以包括他最近的两张专辑以及流行度、情感和音乐属性/特征信息。数据集总共有 155 首歌曲。

用于以下分析的数据集:4(附录)+清洗+添加流行度、情感和音乐特征数据;5(附录)

总体椎间盘造影分析

坎耶歌曲中最流行的词

坎耶的全部字典中最常见的单词

Kanye 全部词典中前 20 个单词的计数

从这个分析中,你可以看到 Kanye 的热门词汇与流行歌曲的热门词汇非常相似,如“喜欢”、“爱”、“知道”、“不要”、“只是”、“得到”等等。与一般的流行歌曲相比,Kanye 的歌曲中出现了一些特定的词,如 n-词,“shit”,“aint't”,“bitch”和“god”。这些词在嘻哈/说唱音乐中更受欢迎,Kanye 通常属于这种类型。就整体抒情内容而言,坎耶最受欢迎的词确实沿用了大多数流行歌曲的词。

整体歌词情绪分析

在进行了情绪分析后,我发现坎耶整个唱片集的抒情情绪是 -0.154 ,意味着他的歌词倾向于负面多于正面的词。考虑到说唱更多的口语性质和更严肃、更广泛的话题,这并不奇怪。尤其是坎耶的歌词,众所周知,从滑稽到挑衅到激烈。

整体音乐特征分析

Kanye 整个唱片集的平均音乐特征

这个向量显示了 Kanye 整个唱片集的平均音乐特征。在 155 首歌曲中,平均来说,Kanye 的歌曲更适合跳舞,也更有活力。它们也具有较低的工具性。其他特征都很一般。具有很高的可舞性和能量是流行歌曲的特征,所以坎耶的歌曲具有流行歌曲的一般音乐特征。然而,Kanye 的唱片比大多数流行歌曲有更高的语音和活力,可能是由于说唱的性质。

逐个专辑分析

专辑最常用词

专辑中最常见的单词变化(从左到右:发行时间顺序)。

每本专辑中最常用的单词如上表所示。NAs 代表 0。正如你所看到的,随着专辑的进展,Kanye 一直在改变他写的词。像“喜欢”、“不要”这样的词,以及名词性的词越来越少被使用。一些单词在专辑中以相似的数量出现,如“just”、“make”和“want”。显然,这不是一个完整的分析,通过更严格的机器学习方法,看到更多的单词以及它们在专辑中的趋势会很有趣。

这可能是因为他最近创作的歌曲字数较少,更多的是歌唱性的。这也可能是对早期内容的真正转变。

专辑感悟

感情按专辑,按时间顺序往下。

这张表按发行时间顺序显示了每张专辑的人气。结果相当有趣。虽然 Kanye 的 discography 整体情绪略负(-0.154),但也有积极的情绪专辑。其中包括《远离校园》、《迟到的登记》、《毕业》、《808 的心碎》和《耶稣为王》,后者是最积极的,平均情绪得分为+3.768。总的来说,似乎 Kanye 出道时歌词比较正面,然后进步到发布歌词比较负面的歌曲。他最近的专辑是这一趋势中的异类,所以看看他接下来发布的是正面还是负面的歌词会很有趣。

专辑的音乐属性/特征

按专辑的平均音乐特征,从上到下按时间顺序排列。

从这个分析中,你可以看到每个音乐特征是如何随着时间的推移而演变的。非常有趣的是,尽管有更多负面的歌词(专辑的情绪),一首歌听起来有多积极/消极的效价仍然相对积极。这是不匹配的,因为大多数流行歌曲(流行歌曲的音乐情感与歌词情感)具有匹配的歌词和音乐情感。

总的来说,Kanye 的音乐特征一直保持不变。他的专辑总是有很高的可跳性和活力,这可能是他的歌曲受欢迎的部分原因。随着时间的推移,他的专辑的音质会有所变化,这可能是因为制作风格的改变和尝试。

应用前 10 名/成功案例模型

当将逻辑回归模型应用于该 Kanye 数据集时,准确率为 92.9% 。然而,如果你仔细观察数据,坎耶的 9 首热门/前 10 名歌曲没有一首被正确预测。因此,即使准确率很高,那也可能是因为大多数歌曲不是热门歌曲,并且低于阈值。

这个模型有明显的问题。有多种促成因素:

  • Kanye 数据集只有 155 行,非常小。
  • 从技术上来说,Kanye 不是一个“流行”艺术家,所以他的流行歌曲可能不会跟随一般趋势。
  • 原始模型中的变量需要调整或纳入更多数据以获得更大的预测能力。

或者,也许这只是表明,创造一首热门/前 10 名的歌曲并不像人们想象的那样公式化!展望未来,更多地使用模型来获得更高的准确性会很有趣。

推特分析

与“坎耶”相关的最常见词汇

Twitter 上与 Kanye 相关的热门词汇。

使用 RTweet 包抓取 Twitter 数据,这些是最常与“Kanye”联系在一起的词。当人们谈论 Kanye 时,最流行的词似乎是“喜欢”,这表明艺术家周围的情绪通常是非常积极的。其他常用词包括“song”和其他类似的艺术家,如 Kendrick Lamar 和 Drake(你也可以看到 Travis Scott、卡迪小子和碧昂斯的较小单词散落在那里)。

专辑推特人气

按专辑从上到下的时间顺序排列。

这些数据是通过搜索与 Kanye 相关联的每张专辑的名称并计算情感来抓取 Twitter 而生成的(更多详细信息请参见附录 9)。坎耶每张专辑的人气似乎都相当积极,这与坎耶作为一名广受好评的艺术家的地位相符。一些专辑比其他专辑更受欢迎,如《毕业》、《耶稣为王》和《我美丽的黑暗扭曲的幻想》。将来看看是否可以对单个曲目进行情感分析会很有趣,因为搜索更通用的歌曲名称音乐比搜索专辑名称要困难一些。

整理专辑信息

流行度、歌词情绪、推特情绪和音乐属性/特征。

此表显示了以上所有汇编到一个表中的指标。当并排在一起时,我们可以看到专辑的受欢迎程度、歌词情感、Twitter 情感和音乐属性是如何相互关联的。流行度是通过取专辑歌曲流行度的平均值来计算的。

最受欢迎的专辑“耶稣是王”有最积极的歌词情绪,但不是最积极的推特情绪。与 Kanye 的其他专辑相比,它没有最高价(11 张中的第 6 张)或积极向上的音乐,舞蹈性(11 张中的第 10 张)和活力(11 张中的第 9 张)较低。因此,即使它更受欢迎,它也没有通常与流行歌曲相关的最高音乐属性值(流行歌曲随着时间推移的音乐特征)。

Twitter 上人气最高的专辑“毕业”,意思是更积极的口碑,是 Kanye 第四大最受欢迎的专辑,歌词在所有专辑中排名第五。与 Kanye 的其他专辑相比,这张专辑的可跳舞性(第 8)和活力(第 5)也很一般,这可能表明听众在听 Kanye 的时候并不是在寻找“流行”的歌曲。

听起来最积极(高价)的专辑“远离校园”只有一般的可跳性和活力。这也是最不受欢迎的坎耶专辑之一(第三),并有非常积极的抒情情绪(第二)。

我可以继续说下去,但根据这些结果,有时似乎最受欢迎的专辑(按 Twitter 人气和受欢迎程度)并不具备流行歌曲所具有的高度可舞性和活力的标志性特征。

结论

在进行情感分析并将其与 Spotify 和 Twitter API 数据等人类行为数据联系起来后,我发现肯定有一些词与积极的歌曲关联更多,尤其是那些有浪漫主题的词,如“爱情”和“babi(宝贝)”。随着时间的推移,我们越来越多地看到爱情主题的音乐不再主宰排行榜。

就歌词情绪而言,歌曲通常越来越悲伤,但总体上仍保持略微积极的情绪(情绪高于 0)。

一般来说,最流行的歌曲是高度可舞,充满活力和声音。他们往往还具有较低的工具性和演讲性。

将所有这些因素结合在一起,我们可以尝试预测哪些歌曲将成为热门歌曲,但该模型未能准确预测什么是热门歌曲。然而,我们仍然可以收集重要的见解,例如哪些变量是重要的,并使用这些来调整模型向前发展。

将这些发现应用于 Kanye West 作为一个案例研究是很有意思的,看看一般结论是否成立。他的唱片通常遵循流行歌曲的特点,包括具有高度的舞蹈性和活力。从他出道到现在,歌词的情绪普遍降低,最新专辑《耶稣为王》是个例外。逻辑回归热门/前 10 名模型并不成立,但这也意味着找出流行歌曲流行的原因更加微妙。通过分析 Kanye 每张专辑的 tweets,我们看到他的音乐广受好评。此外,查看专辑的歌词情感、推特情感、流行度和音乐属性/特征如何相互关联提供了有趣的观察。这也表明破解一首歌流行的原因是相当复杂的。总的来说,这个分析是这样做的一个很好的第一次尝试,编写代码也很有趣。

感谢阅读!

关于作者

Alice Tang 是宾夕法尼亚大学生物学、商业分析和医疗保健管理专业的大四学生。音乐是她最大的兴趣之一,她认为她会找到一种有趣的方式将其融入她的学业。这个数据项目是 Prasanna Tambe 教授的 OIDD 245:分析和数字经济课程的一部分。

附录

使用的数据集:**

  1. Kaggle 数据集:Nikita Detkov 和 Ilya @https://www . ka ggle . com/det kov/lyrics-Dataset # songs _ Dataset . CSV超过 2k 位歌手的 25 万+歌词。该数据集包含 250,000 多首歌曲的歌手、专辑、歌曲、流派和歌词信息。当涉及流派并且歌曲的流行度/排名不重要时(例如,按流派分类的最常用词),使用该数据集。
  2. Kaggle 数据集:Vageesha bud anur/Jin wook Chang @【https://www.kaggle.com/vageeshabudanur/songdetails】的歌曲详情。该数据集包含从 1900 年到 2010 年进入排行榜前 10 名的所有歌曲的歌曲、年份、艺术家信息。
  3. Kaggle 数据集:Billboard 1964–2015 歌曲+rakan nimer @https://www.kaggle.com/rakannimer/billboard-lyrics作词。该数据集包含 1964 年至 2015 年公告牌年度排行榜前 100 首歌曲中所有歌曲的排名、歌曲、艺术家、年份和歌词信息(每年年末的前 100 首歌曲)。该数据集用于涉及流行度的分析。
  4. Kaggle 数据集:威尔@https://www.kaggle.com/slickwilly/kanye-west-discography的 Kanye West Discography。该数据集包含除 Kanye 最近两张专辑之外的所有歌曲、艺术家和歌词信息。
  5. 使用访问 Twitter API 的 RTweet 包自行生成的 Twitter 数据集。使用 search_tweets 功能,通过查询专辑名称,删除了过去 7 天的推文。
  • *为这些 Kaggle 数据集的创建者大声疾呼!我一个人可能要花很长时间来搜集所有的歌词。

流程/分析:

  1. 首先,数据集被导入并清理/标准化。在一些歌词中有一些奇怪的字符,我不得不寻找解决方法。所有相关字段(歌词、艺术家姓名、歌曲名称)都改为小写,并删除了标点符号。
  2. 对于 wordcloud 分析,使用 wordcloud 包创建、清理和生成语料库文档。流派词云分析是在按流派过滤歌曲后进行的。
  3. 为了生成一段时间内最流行的单词,构建了一个 for 循环来生成文档术语矩阵,然后将这些矩阵转换为计算频率的矩阵。由此产生的前 25 个单词和它们的频率被放入一个列表中,该列表可以用图表显示和打印。
  4. 使用 syuzhet 软件包进行情感分析。使用 for 循环来获取每首歌曲的情感,并将该分数添加到新列中。
  5. 受欢迎程度是这个项目中使用的人类行为数据。你可以通过使用“get_track”来获得歌曲的流行度,但你需要 Spotify ID 来调用这个功能,而我没有这个功能。相反,我使用了一个更迂回的功能“search_spotify”来首先搜索艺术家,然后从列表中识别歌曲。边缘情况(空搜索或不匹配的歌曲名称/艺术家)必须被合并,这样循环就不会烧坏。一旦匹配了歌曲,就可以提取流行度。我使用的主要数据集是第三个数据集,包含了从 1964 年到 2015 年的 Billboard 年度排行榜前 100 名的所有歌曲。由于我无法将所有歌曲与 spotify IDs 匹配,所以我最终使用了数据集中的 3654/5100 个原始行/歌曲,这仍然是一个相当大的数量。这个具有 n=3654 的流行度数据的清理过的数据集被用于其余的分析。
  6. Spotify 的音乐属性/特征必须在步骤 5 中手动添加到上述数据集中。使用 for 循环,提取 Spotify IDs 并将其输入函数“get_track_audio_features”以获取音乐属性数据。然后将其“绑定”到现有的数据集,以产生具有歌曲、艺术家、歌词、流行度和音乐属性/特征信息的数据集。
  7. 对于逻辑回归,在步骤 6 中向数据集添加了一个名为“Top10”的附加列。这是从 1964 年到 2015 年的 Billboard 年度排行榜前 100 名歌曲的排名,如果这首歌是前 10 名歌曲,则分配“1”,如果不是,则分配“0”。这是一种半随意的方式来指定什么是超级流行/热门歌曲。未来应该使用不同的界限来检验预测因子的敏感性和显著性。然后对最终数据集运行三种不同的模型:逻辑回归、最近邻分类和随机森林。
  8. 对于 Kanye 特定的分析,使用了与 1–7 相似的方法,但只针对 Kanye 的数据。为了使歌曲和专辑与 Spotify API 上的流行度和音乐属性值相匹配,进行了大量的清理工作。
  9. Twitter API/RTweet 用于提取每张专辑的人类行为数据。在过去的 7 天里,我能够从每张专辑中拉出 1000 条推文,包括流行的和最近的推文。我排除了转发、引用和回复。我用 Kanye 的名字搜索专辑名称的查询词,以过滤出通用的结果(例如,一般谈论“毕业”的推文与谈论 Kanye 专辑毕业的推文)。

使用的包:

lubridate,magrittr,spotifyr,tm,wordcloud,stringr,dplyr,readr,rvest,ggplot2,tidyr,tidytext,syuzhet,readr,rpart,httr,class,randomForest,rtweet

其他来源:

  1. https://en . Wikipedia . org/wiki/Kanye _ West # 1996% E2 % 80% 932002:_ Early _ work _ and _ Roc-A-Fella _ Records
  2. 图片来源:Unsplash
  3. AZlyrics.com 为坎耶最近的两张专辑搜集了不在第五号数据集中的歌词。

“那是什么?现实世界中的强化学习?”

原文:https://towardsdatascience.com/whats-that-reinforcement-learning-in-the-real-world-942d5d735d8e?source=collection_archive---------55-----------------------

一个开放的痛苦减缓现实世界 RL 的亮点,以及一些使应用可行的创造性方法。

由 Unsplash 上的Torsten dede RICS拍摄的图像

强化学习提供了一种解决机器学习难题的独特方式。它的顺序决策能力,以及对需要在即时和长期回报之间进行权衡的任务的适用性,是一些使其在监督学习或无监督学习方法相比较而言不适合的环境中成为理想选择的因素。

通过让代理从零知识开始,然后通过与环境的交互来学习定性的良好行为,几乎可以说强化学习(RL)是迄今为止最接近人工智能的东西。我们可以看到 RL 被用于机器人控制,医疗保健中的治疗设计,以及其他;但是,为什么我们不吹嘘许多 RL 代理正在扩大到现实世界的生产系统?

1。诅咒的奖励功能

像 *Atari、*这样的游戏是如此好的 RL 基准是有原因的——它们让我们只关心最大化分数,而不用担心设计奖励函数。一个理想的奖励函数既能鼓励代理人按照我们希望的方式行事,同时又是可学习的。

我们可以选择仅在目标状态奖励代理*,而不在其他地方奖励代理。例如,在这样一个迷宫解决任务中,代理人只有找到目标房间才能得到+1 奖励。这是一个稀疏的奖励。它简单明了地指定了期望的目标,但也几乎是不可学习的,因为代理人没有收到关于它离期望目标有多近的反馈。对此,通常的解决方案是重塑函数,以在代理接近目标时提供递增的奖励。然而,该政策可能会曲解这种奖励机制,并最终学习最懒惰的可能行为来适应局部最优,而不是我们希望它应该学习的。*

这使得奖励函数的设计异常古怪。

一个很好的例子来自 Irpan,一个机器人手臂被训练去触及桌面上的目标。然而,可爱的机器人选择学习砸桌子,这使目标指向它。

值得注意的是,一个奖励函数可以优化一个单一的度量,仅仅是为了在学习行为的评估过程中发现其他同等重要的度量。许多系统需要多维全局奖励函数来优化许多较小的目标。为了成功,这需要在奖励函数中整合多个系统指标,这可能很难实现,或者更糟的是,一些指标我们仍然不知道。然而,对于 RL 特有的多目标奖励函数,还没有多少研究。

在现实世界的设置中,奖励函数必须对策略进行调整,使其在任务目标的所有实例上(而不仅仅是其中的一个子集)都能按预期执行。如果一个机器人正在向顾客分发饼干和微笑,它应该为每一个顾客这样做,而不仅仅是为一个吝啬的顾客。

奖励函数的现有方法

模仿学习不是硬编码一个改善系统政策的奖励函数,而是利用专家的示范来训练一个政策——这本质上是监督学习。该系统学习复制专家的确切行为,而不关心专家试图实现什么。

反向 RL 通过尝试从演示的行为中推断专家的意图,而不是复制专家可能无意中采取的非最佳行动,来改进模仿技术。它学习适合专家演示的可能的奖励函数。

2。安全 RL

安全是我们不在道路上发布轮式机器并要求它们通过犯错来学习的一个很好的原因。它是关于确保一个自治系统构成不可挽回的自我毁灭或对人类生命构成危险的非临界风险。

安全感知代理

安全 RL 的现有方法是在策略上指定安全约束。安全约束可以是任何被认为潜在不安全的行为,例如在航行期间避免高速碰撞。以这种方式优化安全性的解决方案被称为受约束的马尔可夫决策过程 (MDP)。该约束可以是固定的和预定的,或者是可变的,以允许在最大化预期回报和满足最小安全阈值之间进行权衡。类似地,通过使用概率客观 MDP,我们可以选择激励代理人在选定的步骤数内采取冒险行动以获得迫在眉睫的更高回报,或者专注于保持安全。

受约束的 MDP 的问题在于,为了了解保持安全需要什么,系统必须通过采取导致不安全后果的行动来获得经验。这种冒险行为通常会在培训期间受到鼓励,以产生一个策略,该策略概括为在现实世界的用例中避免它们。

在训练期间鼓励不安全的行为可以包括学习一个近似器,该近似器预测处于附近状态的安全性,然后可以用于帮助代理的探索策略。

**3。**状态感测和驱动的延迟

高维输入需要耐心处理,现实世界的系统使用多个传感器和图像来获得状态的准确表示。因此,在观察到的状态到达代理之前需要时间。向致动器发送选定的动作也会有一定的通信延迟。行动执行时也不会立即达到预期的下一个状态,因为移动系统部件需要时间来调整——相对于某个物体,将机械臂从 45 旋转到 100 度不会在一瞬间实现。

所有这些意味着代理人**(a| s)可能正在采取以过去的状态为条件的动作,而不是当前的,时间步长 t. 这将违反马尔可夫性质要求下一个状态 sₜ ₊₁ 有条件地依赖于当前状态和动作对(马尔科夫性是 RL 决策过程p*(sₜ₊₁|sₜ*,t41】π(a| s)【t49)的基础,所以违反它是一件大事。**

减轻系统延迟

向代理添加内存可用于优化两个因素:

  • 动作延迟:将一个简短的动作历史合并到状态中,帮助策略学会将每个动作与结果延迟相关联。当然,这种启发式方法增加了输入维度。
  • 寻找对未来状态负责的延迟状态-动作转换对:包括使用来自记忆的过去的状态-动作转换对,以尝试对在当前时间步长的预测中有用的转换给予应有的信任。

***4。*系统的非平稳性和政策稳健性

真实系统将经常经历可移动接头处的磨损或通风口的部分堵塞,如果代理人不知道,这将导致学习到的环境动力学中的不可观察到的变化。对于这种类型的问题,我们可以使用一个随时间变化的非常数奖励函数来模拟非平稳性。通过元学习寻找一个最能适应非平稳性引入的变化的策略也是不错的尝试。

在基于模型的 RL 中出现了另一种情况,其中寻求内在好奇心(仅因在新/新奇状态中的探索而获得奖励)的代理将需要观测的稳定函数,以确保在基于策略的模型训练期间的稳定性。然而,这样的代理被认为经历了不稳定的回报,因为被认为是新的状态在未来的时间步骤中将是旧的和无回报的。由于动态模型在演化过程中学习新的特性来纠正过去的错误,所以它也是不稳定的一个额外来源。

我们可以通过随机初始化和固定卷积网络的特征作为观察函数来减轻这种情况,代价是状态的充分表示,或者从不需要特征学习的图像像素中学习。

非平稳性是真实系统中可能遇到的随机性的一个来源——它也必然会有来自传感器读数和动作执行的噪声。因此,需要确保代理对这些问题的不同子集是健壮的。成功的模拟真实转移很大程度上依赖于学习策略对真实世界系统的欠建模特征的鲁棒性。

制定稳健的政策

领域随机化在增加策略稳健性方面被证明是非常宝贵的,它引入了对代理环境的干扰,并平均了在训练期间学习到的错误。此外,训练一个策略,使其能够识别当前环境,并根据情况进行自我调整(元学习),可以减轻环境噪音的影响。

稳健的 MDP 公式专注于改善最坏情况价值函数,然后产生一个可以承受各种环境干扰的代理。在每个时间步,代理使用单独的转移函数(s“| s,a )来最小化长期预测值。

***5。*习得政策的可解释性

安博塞利,肯亚| 哈希尔古德卡在 Unsplash

在可解释的 RL 方面做得很少。在真实的系统中,我们需要对代理的意图有明确的保证,并对我们指出潜在失败案例的能力有信心。由于该策略可能会为系统问题创建一个新的、意想不到的解决方案,因此正确认识其短期和长期意图至关重要。

一种令人兴奋的方法——可编程解释的强化学习——试图将非线性策略提炼为人类可验证的、显式编码的系统程序。

***6。*高维状态和动作空间

维数灾难无处不在。例如,机器人系统在它们的许多自由度上具有连续的动作空间,这些自由度与每一个自由度相关的关节角度和速度有关。与监督和非监督设置不同,在监督和非监督设置中,一些回归方法,如 l1 正则化,给出一个缩减的输入特征空间,这在 RL 中更难实现,因为我们需要在整个状态-动作-空间中收集数据,以更好地收敛我们的全局策略。此外,(无监督)学习中的这种回归技巧旨在增加模型的方差。但是在 RL 中,我们已经有一肚子的差异,我们关心的是找到减少差异的方法。

接近

通过减少候选动作的数量实现了较低的输入维数。其中一个方法是消除看起来不相关的行为。虽然这可能会诱使我们学习另一个函数逼近器,但它会使参数空间变得更大。通过将无用的行为框定为 MDP 问题的一部分,并使用上下文强盗将其过滤掉,已经研究了行为消除。此外,给定候选动作的向量,对最近的动作执行最近邻搜索可以降低离散动作空间的维度。

对于高维状态,可以通过使用逆动力学来实现更紧凑的状态表示。这预测了下一个和前一个状态( a ₜ| s ₜ₋₁, s ₜ₊₁).)给出的动作所使用的直觉是,所学习的观察空间的特征是那些在代理的直接控制下的特征,而那些被忽略的是代理对其没有直接影响的环境方面。

***7。*政策外学习

脱离策略学习允许我们使用轨迹( s,a,s,a……)在独立于代理运行的策略下训练代理。在实际系统中,当代理收集新数据时,它将被用来提高当前策略的性能。由于这种改进可能会出错,而这在生产中是至关重要的,因此在部署新策略之前,需要先对其进行偏离策略的评估。

政策外评估提出了一个问题,即在使用相关但不同的分布样本时,评估某一分布下的概率。重要性抽样被广泛用于缓解这种分布不匹配。我们还可以学习系统的动力学模型,并使用模型转换预测来评估新策略。

***8。*样本复杂度

一个模拟的环境提供了无限的训练数据,并且完全不用担心不良行为的影响。真实系统中的所有训练数据都来自系统本身,但不是免费的。

在真实世界的系统中产生 RL 数据是昂贵的——代理通过多次动作来学习,这可能导致在它学习到预期的行为之前系统磨损。因此,代理人必须遵守安全,严格限制探索,同时表现得相当好。

与模拟器不同,实时运行也很慢,无法加速。回报期可能长达数月,例如在医疗保健政策中,这限制了代理人纠正错误的频率。

基于模型的 RL 可以通过对合成样本进行训练来提供样本效率的优势。如果模型是真实系统的足够接近的表示,这可能是有帮助的。对于初始策略,使用专家演示作为训练过渡,而不是随机初始化,将有助于降低长期样本复杂性。此外,元学习可以使学习策略适应训练分布中的未知任务,减少为多个相似目标训练策略所需的样本数量。

结论

这是对减缓强化学习在现实世界中的应用的已知核心挑战的概述。强调的解决方案绝不是完全的解决方案,也不是详尽无遗的,而是旨在展示为解决同一问题而选择的不同视角,以及随着时间的推移而取得的进步。

参考文献

[1] Kober J .,Bagnell,A .,Peters,j .,机器人学中的强化学习:一项调查。IJRR,2013 年。

[2] Dulac-Arnold G .,Mankowitz D. Hester T .,现实世界强化学习的挑战,ICML,2019。

[3]y .布尔达,Storkey A .,Edwards H .,Pathak d .,Darrell t .大规模研究好奇心驱动的学习,2018。

【4】深 RL 还不行https://www.alexirpan.com/2018/02/14/rl-hard.html

处理 NaN 值的最好方法是什么?

原文:https://towardsdatascience.com/whats-the-best-way-to-handle-nan-values-62d50f738fc?source=collection_archive---------2-----------------------

在我进行大数据分析的实践中,我发现了一个可以破坏每个数据分析过程的障碍。这种障碍在数据科学和机器学习中被称为 NaN 值。

什么是 NaN 价值观?

NaN 或 Not 数字是在 DataFrame 和 numpy 数组中的特殊值,表示单元格中缺少的值。在编程语言中,它们也被表示,例如在 Python 中,它们被表示为 None 值。

您可能认为 None(或 NaN)值只是零,因为它们表示没有值。但是这里有一个陷阱,零和 None 值之间的区别在于,零是一个值(例如 integer 或 float),而 None 值表示没有该值。这里有一个迷因很好地解释了零价值和零价值之间的区别:

0 和 NULL 的区别(来源——谷歌)

南值有多危险?

NaN 值在两个方面是危险的:

  • 一些指标的变化,如平均值或中间值,因此给科学家错误的信息。
  • sklearn 实现的算法不能在具有这样的值的数据集上执行(尝试在心脏病数据集上实现 TreeDecsisionClassifier)。

怎么处理他们?

那么,如果 NaN 值对数据科学家的工作如此危险,我们应该如何处理它们呢?有几种解决方案:

  • 擦除具有 NaN 值的行。但是这不是一个好的选择,因为这样我们会丢失信息,尤其是当我们处理小数据集的时候。
  • 用特定的方法或值估算 NaN 值。本文参考了这些方法。

有很多方法来估算这些差距,在大多数情况下,数据科学家,尤其是新手,不知道它们。以下是实现这一目标的方法:

  • 输入特定的值。
  • 用特殊度量估算,例如,平均值或中值。
  • 使用方法估算:鼠标或 KNN。

让我们看看每种方法是如何工作的,以及它们如何影响数据集。

实验!

为了验证每一种方法,我选择了一个名为虹膜数据集的数据集——这可能是机器学习测试中最常见的数据集。我还在更大、更复杂的数据集上尝试了这些方法,但对于某些算法来说,执行插补的时间太长了。

首先,我为这个数据集中的每个特性列生成了 15 个介于 0 和 149 之间的随机且唯一的索引。使用这些索引(对于每个列,它们是单独生成的),我用 NaN 更改了列值。

在对这些 NaN 值应用每种方法后,我使用均方差(MSE)来检查每种方法的“准确性”。

那么,我们开始吧。

方法 1:用特定值插补。

在这种方法中,NaN 值用一个特定的值(例如一个数字)来改变,在大多数情况下,这个值是 0。有时这是最好的选择,就像你的特征是花在糖果上的钱,但有时这是最糟糕的选择,就像年龄。

现在让我们看看它是如何影响初始数据集的:

估算值用星号(*)表示,正常值用点表示。

正如您所看到的,用零填充 NaN 值会强烈影响那些不可能有 0 值的列。这将严重影响空间,取决于所使用的算法,尤其是 KNN 和 TreeDecissionClassifier。

提示: 我们可以通过套用 来看看零是不是一个好的选择。向我们的数据帧描述() 函数。如果最小值等于 0,那么它可能是一个好的选择,如果不是,那么你应该选择另一个选项。

方法 2:指标插补。

指标插补是一种用一些特殊指标填充 NaN 值的方法,这些指标取决于您的数据:例如平均值或中值。

平均值是一个序列中某个值的总和除以该序列中所有值的个数。它是统计学中最常用的度量类型之一。但是为什么我们用平均值来估算 NaN 值呢?均值有一个非常有趣的性质,如果你在数列中加入更多的均值,它不会改变。

均值插补后的数据可视化。

在上面的图中,你可以看到它并没有过多地影响数据集的结构,最重要的是它没有将一个类中的任何样本放入另一个类的区域中。

中值将数字分成具有相同样本数的两半。有时在统计分析中,中间值比平均值更能提供信息,因为它不会被新值扭曲太多。在正态分布(实际上并不存在)中,平均值和中值是相等的。

由于不存在正态分布,在大多数情况下,平均值和中值非常接近。

中位数插补后的数据可视化。

从上面的图中,如果你仔细观察,可以清楚地看到中间值是如何工作的,所有的星星(估算的值)都排列在两条正交线上(萼片长度为 5.6,萼片宽度为 3.0)。

方法 3:用 KNN 进行估算

这种插补算法与 sklearn 的 KNearesNeighbours 非常相似。它从数据集中找到与 NaN 值的样本最接近的 k 个样本,并用它估算这些样本的平均值。

这个方法是在库 impyute 和 sklearn 中实现的(当我开始写这篇文章时,我不知道 sklearn 的实现。)

3 个邻居进行 KNN 插补后的数据可视化。

从上面的图中,我们可以看到一个严重的错误——将来自红色类的样本放置在蓝绿色区域中(这是具有 3 个邻居的 knn 实现)。

方法 4:用小鼠输入

本文的最后一个算法,也是我目前知道的最好的一个算法——链式方程的多重插补。这种算法适用于每一个有缺失值的列,可以用当前值进行线性回归。之后,它使用这些线性函数来估算具有这些值的预测的 NaN 值。

小鼠插补后的数据可视化。

我们可以看到,在上面的图上,它并没有强烈影响 2D 图上的数据集表示。但是为什么呢?

KNN 和 MICE 插补使用整个数据集来替换 NaN 值,而中值和平均值仅使用缺失值的列,这就是为什么后两种算法不会强烈影响数据集结构,也不会改变其信息。

但是这些数字说明了什么呢?

最后的话交给数字。为了了解上述方法的效果,我使用了 MSE(均方误差)。我计算了原始值和估算值之间的 MSE 值。

上表显示了每种方法的 MSE(在 KNN 和鼠标上,我使用了两个版本:一个包括目标值(有 y 值),另一个不包括它)。

下面是哪种算法最适合哪一列。

  • 萼片长度—小鼠
  • 萼片宽度— KNN4_y
  • 花瓣长度—老鼠
  • 花瓣宽度—鼠标

正如我所想的那样,老鼠在大多数情况下都工作得很好。

遗言!

我从这个实验中得到的结论是,估算连续值的最好方法是使用整个数据集,如 MICE 或 KNN,而不仅仅是一列。

感谢您的阅读!

医疗保健领域的数据科学现状如何?

原文:https://towardsdatascience.com/whats-the-current-state-of-data-science-in-healthcare-3b6d8ebc7e0a?source=collection_archive---------48-----------------------

仔细看看数据科学在医疗保健领域的应用,了解为什么该行业在接受数据转型方面仍然落后。

照片由 Pexels 的 bongkarn thanyakij 拍摄

如今,从大型政府医院网络到私人医生办公室,各种医疗机构都在转向数据科学咨询。这并不奇怪,因为医疗保健是一个天然的数据聚合器。数据驱动的决策为医疗保健专业人员提供了一个机会,可以实现更简化的临床操作、更经济高效的诊断以及更个性化的患者护理。

人工智能的可能性

人工智能为医疗保健提供了一个机会的春天。然而,最有希望的是,人类一直在寻求可靠的癌症治疗方法。简单来说,癌症的治疗通常是通过人工分析基因突变,然后据此选择治疗方法。尽管这种方法已经被证明是有效的,但是它非常耗费时间和资源。人工智能辅助成像使医疗保健专业人员能够更快、更有效地识别肿瘤。2020 年初,谷歌宣布,在经过数千张乳房 x 光片的训练后,其 DeepMind AI 算法在乳腺癌检测方面的表现优于放射科医生。

人工智能的预测能力已被证明对 ICU 中患者威胁生命的早期检测特别有用。例如,飞利浦设计了 eICU 系统,允许医生对患者病情恶化的细微信号做出积极反应。通过利用各种物联网设备、摄像头和强大的 ML 支持的预测分析系统,护理团队还可以快速确定哪些患者可以出院,从而根据病情的严重性更好地确定患者的优先顺序。该解决方案解决了病房中的典型问题:资源稀缺,如疫情时期的 ICU 床位、护理成本和高死亡率。采用 eICU 计划的医院报告称,患者的生存机会总体增加了 16%,出院速度加快了 15%。

预测分析也对医学的下一个前沿领域基因组学产生了巨大影响。这个新兴领域解决了长期以来不同人之间药物耐受性不同的问题。每个人的 DNA 包含数千个数据点之间的不同相关性,现在可以通过预测模型快速分析。这使得护理人员能够检测疾病将如何发展,并更可靠地确定适当的治疗。

自然语言处理(NLP)是人工智能的另一个分支,旨在帮助医疗保健专业人员处理每天都在增长的非结构化数据的雪崩。医生通常将治疗过程记录到 EHR 系统中,这带来了许多问题。首先,EHR 系统让医生感到沮丧,因为它们需要非常标准化和结构化的信息输入方法,这需要花费大量时间。第二,医生花数小时解释漫长的病史,然后识别来自 EHR 的相关信息。NLP 通过自动将医生的非结构化笔记转换为适合 EHR 的数据,并为需要快速评估患者病史的医生反向执行同样的操作,解决了这两个问题。

人工智能的问题

在人工智能的大肆宣传中,尽管该技术有巨大的潜力,人工智能的黑箱问题仍然存在。最先进的人工智能辅助工具可以比人类更快更准确地诊断,但它们无法解释决策背后的逻辑。

黑匣子问题不允许人工智能在医学背景下展示其全部潜力。在我们找到解构这些模型用于决策的方法之前,人工智能将需要人类干预。虽然乍一看这似乎不是什么大问题,但这种模糊因素完全消除了诊断自动化的可能性,这可能会对整个医疗保健行业产生重大影响。

此外,人工智能还有一个主要未解决的问题,即数据集偏差。许多现代模型在广义数据集上运行,这意味着少数民族可能会受到虐待。在关于数据集歧视的坚实监管框架付诸实践之前,人工智能没有机会在更大的规模上可靠地运行。此外,以美国为例,任何人工智能系统都需要获得 FDA 的批准。本质上,人工智能在医疗保健领域的所有问题都与可扩展性有关,没有其他行业像医疗保健一样需要可扩展性。

未来展望

凭借大数据带来的所有优势,医疗保健系统最终可以变得预防性而非反应性。数据使医疗保健专业人员能够更深入地了解图像分析和整体患者筛查,以便医生能够在癌症等严重疾病升级之前可靠地检测到这些疾病。

大数据还解决了最关键的医疗保健方面之一——个性化。医生现在可以使用超越简单的人口统计和身体指标的信息,使患者能够得到个性化治疗。

然而,很明显,医疗保健目前还没有为这种转变做好准备。与数据相关的法规、缺乏政府支持和数据碎片都是依赖数据科学的系统广泛采用的严重瓶颈。另一方面,我们现在看到由大型政府组织领导的大数据计划正在医疗保健领域获得足够的资金支持。

例如,2019 年,英国生物银行收集了广泛的医疗保健数据集,包括约 50 万人的社会学信息、生物样本和常规身体指标,使研究人员能够找到疾病结果和这些丰富的医疗信息之间的相互联系。2018 年,中国还开始鼓励在医疗保健领域使用大数据,将其个人身份识别系统与医疗数据联系起来,并建立了国家中央癌症登记处。考虑到中国是世界上人口最多的国家,这样的项目可以对癌症治疗产生巨大的影响。

这些活动刚刚开始,医疗机构之间缺乏互操作性,这意味着我们不能指望在未来几年有任何显著的结果。鉴于大数据在医疗保健领域的渗透很可能是该行业在过去几十年中经历的最大转变之一,政府、医疗保健机构、研究人员和医生需要时间来适应也就不足为奇了。

数据科学家、研究科学家和应用科学家之间有什么区别?

原文:https://towardsdatascience.com/whats-the-difference-between-a-data-scientist-research-scientist-and-an-applied-scientist-30c04190c1fa?source=collection_archive---------12-----------------------

揭开数据科学角色之间的异同

由班德万托创作—www.freepik.com

随着数据科学领域的发展,各种职业术语之间的混淆也在增加。一些公司似乎将术语“数据科学家”与“应用科学家”互换使用,而其他公司则有明确的区别。

那么,数据科学家、研究科学家和应用科学家之间到底有什么区别呢?

由作者创建

**本质上,数据科学家、研究科学家和应用科学家在科学深度和期望水平方面是不同的。**研究科学家通常有更高的技术理解水平,因此也有更高的期望值。应用科学家和数据科学家也是如此。上面的图像概括了这个想法:应用科学家通常可以做研究科学家做的事情,并且做得更多,而研究科学家可以做数据科学家做的事情,并且做得更多。

让我们更深入地了解一下每个角色:

数据科学家

数据科学家做什么样的工作真的取决于公司。在某些情况下(或者很多情况下),数据科学家做的正是数据分析师做的事情:他们查询数据、处理数据、分析数据和可视化数据。在上限上,数据科学家还应用统计和机器学习模型来提取见解。

总体而言,数据科学家通常能够回答前瞻性问题(例如,我们能否预测明年我们将拥有多少客户)以及回顾性问题*(例如,为什么我们的增长率下降了 8%?).他们能够收集数据、处理数据、应用特征工程、建模数据和可视化数据。他们是技术人员和商业头脑之间的纽带。*

研究科学家

科学家是研究的专家。研究科学家不制造产品或管道。相反,他们是构建实验、发展假设和证明假设真假的专家。它们通常出现在学术界,尽管公司越来越看到它们在应用中的价值。

应用科学家

应用科学家据说与研究科学家能力相当,但他们也是大规模应用知识和实施解决方案的专家。因此,虽然研究科学家更专注于科学发现,但应用科学家对现实生活中的应用更感兴趣。

在亚马逊,应用科学家是一个比研究科学家略高的角色,需要通过编码栏。例如,亚马逊的应用科学家专注于增强亚马逊客户体验的项目,如亚马逊的自动语音识别(ASR)、自然语言理解(NLU)、音频信号处理、文本到语音(TTS)和对话管理。

感谢阅读!

如果你喜欢我的工作并想支持我,我会非常感谢你在我的社交媒体频道上关注我:

  1. 支持我的最好方式就是在媒体T2 上关注我。
  2. 推特 这里关注我。
  3. 点击这里订阅我的新 YouTube 频道
  4. LinkedIn 这里关注我。
  5. 在我的邮箱列表 这里报名。
  6. 查看我的网站terenceshin.comT21。

来源

[## 数据 vs 应用 vs 研究科学家@亚马逊

这三个角色有什么区别?

www.teamblind.com](https://www.teamblind.com/post/Data-vs-Applied-vs-Research-Scientist--%40Amazon-OiJ0KOSx) [## 数据科学家、应用科学家、研究科学家的角色有什么区别…

答(第 1 题,共 4 题):数据工程师通常负责获取、处理、清理、存储和维护…

www.quora.com](https://www.quora.com/What-is-the-difference-between-the-roles-of-Data-scientist-Applied-scientist-Research-Scientist-Machine-Learning-Engineer-and-Data-Engineer) [## “研究科学家”、“科学家”、“参谋科学家”、“数据科学家”之间有什么区别

回答(第 1 题,共 3 题):在我职业生涯的某个阶段,我曾从事过以上所有的工作(除了应用科学家),我会…

www.quora.com](https://www.quora.com/Whats-the-difference-between-a-research-scientist-scientist-staff-scientist-data-scientist-and-applied-scientist) [## ML 工程师,数据科学家,研究科学家:有什么区别?

如果你必须写一份人工智能(AI)或机器学习(ML)的工作描述,这可能很难…

www.topbots.com](https://www.topbots.com/understanding-different-ai-ml-job-descriptions/)

一年中最美好的时光是什么时候?提示:这不是《经济学人》所说的

原文:https://towardsdatascience.com/whats-the-most-wonderful-time-of-the-year-hint-it-s-not-what-the-economist-says-45d96551b664?source=collection_archive---------23-----------------------

用 Python 和 Matplotlib 分析 Spotify 的 valence 评分

马塞拉·拉斯科斯基在 Unsplash 上的照片

被困在付费墙后面?点击这里阅读完整的故事和朋友链接!

我是 Greg Rafferty,湾区的数据科学家。这个项目的代码可以在我的 GitHub 上找到。

在 2020 年 2 月 8 日出版的 The Economist 中,图表细节部分简要讨论了对 Spotify 数据的分析,表明 7 月是平均最快乐的一个月(悲伤的歌曲说明了很多:
Spotify 的数据表明,听众在 2 月最沮丧)。我试图重复他们的研究,得出了一些不同的结论,并在此过程中有了一些新的发现。

数据

这种分析需要两个数据来源。第一个是 Spotify 在spotifycharts.com上提供的按日期和国家排名的最热门的 200 首歌曲。因为我不想从下拉菜单中选择每个国家和日期,并手动下载近 70,000 个每日图表 csv 文件,所以我构建了一个 scraper 来为我完成这一切。

第二组必要的数据是那些排行榜中每首歌的valence分数。Spotify 通过他们的开发者 API 提供这些数据。要获取这些数据,你需要在这里注册证书。谢天谢地,Spotify 没有让这变得太难,所以你应该不会有任何问题。我构建了第二个刮刀,它遍历前 200 名排行榜中的每首独特歌曲,并下载其特征向量。这里有几个可用的特征,但《经济学人》使用的是valence分数,一个介于 0 和 1 之间的小数,它描述了歌曲的“快乐”。

这个乐谱最初是由一个名为 Echo Nest 的音乐情报和数据平台开发的,该平台于 2014 年被 Spotify 收购。a(现已死亡,但可通过 Wayback 机器获得)的博客帖子对比分只有这样的说法:

我们让一位音乐专家根据效价对一些样本歌曲进行分类,然后使用机器学习将这些规则扩展到世界上所有其他的音乐,并在我们进行的过程中进行微调。

通过 API 可用的其他特征包括速度、能量、调、模式和可跳舞性等,并且已经推测这些特征在价分值中起作用。无论如何,效价分数是如何得出的有点像黑箱,但它似乎确实与歌曲非常匹配。然而,由于训练数据极有可能倾向于流行音乐,我想知道古典、爵士或非西方音乐风格是否没有被准确地评分。

分析

与《经济学人》的分析相比,我的分析显示了非常相似的数据分布:

来源:https://www . economist . com/graphic-detail/2020/02/08/data-from-Spotify-suggest-listeners-is-glow most-in-two

尽管我们的两个图表的外观不同,但两个核密度估计的形状非常相似(如果你不熟悉,核密度估计,或 KDE,几乎只是一个平滑的直方图,曲线下的面积总和为 1)。那些关键歌曲沿着价轴的位置也匹配。你可以看到,平均来说,巴西人比世界上其他地方的人听“快乐”的音乐,而在美国,听众听的音乐平均来说没有世界上其他地方的人快乐。正如我们将看到的,拉丁美洲的音乐典型的配价很高。

这是《经济学人》的第二张图表,我从中看到了一些关键的区别。

来源:https://www . economist . com/graphic-detail/2020/02/08/data-from-Spotify-suggest-listeners-is-glometer-in-two

首先,我们来看看右上角的那个十日均线图。发现二月平均价最低,七月最高。以下是我的发现:

在我的分析中,12 月的平均化合价最高,其次是 8 月,第三是 7 月。我最初也发现了一些非常不同的二月平均价分数,因此研究了为什么我们的数据集会不同。《经济学人》使用了从 2017 年 11 日(Spotify 图表上最早可用的时间)到 2020 年 1 月 29 日(大概是他们进行抓取的时间)的数据。我有所有的数据,加上几乎所有的 2020 年 2 月的数据。没有像上面的图那样按月汇总,也没有执行移动平均,我看到同一个月的年与年之间的差异比我预期的要大得多:

在任何一年,我都认为 12 月是最高的。然而,2018 年(特别难过的一年?)夏季的化合价得分低于二月份。此外,2020 年的数据远远高于前几年,这一数据的纳入导致了 2 月份的平均数据不断膨胀。因此,我选择排除 2020 年的数据。比较这两个图表,一个包含 2020 年,另一个不包含:

左侧:包括 2020 年 1 月/2 月;右侧:不包括 2020 年 1 月/2 月

这并没有改变图表太多,然而,经济学家在他们的图表中指出的一个关键点是,尽管与北半球相比,南半球的新西兰在 2 月份也经历了化合价的下降,尽管他们的夏季和冬季相反。当我包括 2020 年 2 月时,我看到了与《经济学人》所注意到的相反的效果,但当我排除 2020 年 2 月时,我确实看到了下降;然而远没有《经济学人》看到的那么明显。按照《经济学人》包括所有可用数据的惯例,我会包括 2 月份,因为 2020 年比往年快乐得多,这证明了相反的观点是正确的。不幸的是,在我看来,包含这些数据似乎有些武断——我们称之为合适的截止点是什么?不过,在我看来,每年包含相同数量的月份似乎是合理的,因此排除 2020 年的数据就不那么武断了。我很想在年底重新运行这个分析,看看它会是什么样子。

我的一个关键发现是,12 月是最快乐的月份,而不是他们发现的 7 月,这肯定与《经济学人》的发现不同。

我还将这些国家按大洲进行了分类,以观察更广泛的趋势。正如《经济学人》所发现的,拉丁美洲国家确实比世界上其他国家流传着更多快乐的音乐。还要注意的是,在除欧洲以外的每个大洲,12 月是最快乐的月份;除了非洲和澳大利亚,二月是最悲伤的:

此外,我还观察了白天的情绪。正如我所料,我发现星期六是最快乐的。

我也看了美国和新西兰的图表。我发现星期五是美国最悲伤的一天,而星期天是最快乐的一天。有什么可能的理论吗?新西兰展现了我可能最期待的行为,周一是最悲伤的,周六是最快乐的。

最后,我花了一点时间研究了 Spotify API 的其他功能,并制作了最后一个图表,每个国家的可跳舞性:

在这里,正如我所料,我发现周五比周一有更多适合跳舞的音乐。此外,从化合价表来看,国家的排序变化很大。例如,在这张图表中,美国处于价谱的最悲伤的一端,但却处于更适合跳舞的一端。我还注意到,可舞性排名最低的国家都是亚洲国家,它们的传统音乐风格不符合西方“标准”的 12 音 4 拍体系。我想知道当结构与大多数训练样本如此不同时,该算法是否很难预测可跳舞性。

我还注意到,在荷兰的周日,他们的舞蹈得分直线下降!挪威和瑞典也有这种现象,尽管程度较轻。宗教星期日可能是这一结果的一个解释,尽管在我看来,荷兰、挪威和瑞典并不比许多其他没有这种行为的国家更宗教化。

只是为了好玩,我查找了我所知道的最悲伤的歌曲(悲惨地从前 200 名排行榜中消失),Henryk Górecki 的第三交响曲(非常恰当地命名为悲伤歌曲交响曲)。第二乐章的配价分数仅为 0.0280,远低于阿黛尔的 0.0896 的让你感受我的爱。这个分数将使它在所有 68,000 多首歌曲的效价排行榜上排名倒数第二,仅略高于 Tool 的军团接种,这是排行榜上最悲伤的歌曲,效价为 0.0262(尽管在我看来,Tool 的这首歌曲确实超出了合理的范围)。

我还查了一下 Pharrel Williams 的 Happy ,期望找到一个最高分,却失望地看到“只有”0.9620。相比之下,地球,风和火带来了近乎滑稽的快乐九月,化合价为 0.982(图表中最高)。

美国前 200 名排行榜中最快乐的 10 首歌:

[Earth, Wind & Fire - September](https://open.spotify.com/track/1mqlc0vEP9mU1kZgTi6LIQ)
[Gene Autry - Here Comes Santa Claus (Right Down Santa Claus Lane)](https://open.spotify.com/track/25leEEaz1gIpp7o21Fqyjo)
[The Beach Boys - Little Saint Nick - 1991 Remix](https://open.spotify.com/track/5xlS0QkVrSH7ssEbBgBzbM)
[Logic - Indica Badu](https://open.spotify.com/track/0jqBo5RYn008f4ZY8kPewW)
[Chuck Berry - Johnny B. Goode](https://open.spotify.com/track/3BUQFs6aFWh7EFNmI8bfL7)
[Shawn Mendes - There's Nothing Holdin' Me Back](https://open.spotify.com/track/79cuOz3SPQTuFrp8WgftAu)
[Foster The People - Pumped Up Kicks](https://open.spotify.com/track/7w87IxuO7BDcJ3YUqCyMTT)
[Tom Petty - I Won't Back Dow](https://open.spotify.com/track/7gSQv1OHpkIoAdUiRLdmI6)n
[OutKast - Hey Ya!](https://open.spotify.com/track/2PpruBYCo4H7WOBJ7Q2EwM)
[Aretha Franklin - Respect](https://open.spotify.com/track/7s25THrKz86DM225dOYwnr)

十大最悲伤的歌曲:

[TOOL - Legion Inoculant](https://open.spotify.com/track/48C0O5CXfQdfjUCUhOs1YP)
[Joji - I'LL SEE YOU IN 40](https://open.spotify.com/track/606F3qdYCXtDVtKN53YsuW)
[Trippie Redd - RMP](https://open.spotify.com/track/5e4oAwSsIzkNZxh4fLSKUH)
[Drake - Days in The East](https://open.spotify.com/track/4czcw3NVLY0of5hTD7OufN)
[Drake - Jaded](https://open.spotify.com/track/3jipFRgLyKK0oJoG1pKicx)
[Lil Uzi Vert - Two®](https://open.spotify.com/track/65kp3OFn7JXbCvkm3m2Ui2)
[TOOL - Litanie contre la Peur](https://open.spotify.com/track/4qE9yOgBNsARadpZTAb6RH)
[Russ - Cherry Hill](https://open.spotify.com/track/7eZOvhHWlB3AcrOuZfTTOA)
[2 Chainz - Whip (feat. Travis Scott)](https://open.spotify.com/track/6Z4rmc0uujCpl8yXe3yjgI)
[Rae Sremmurd - Bedtime Stories (feat. The Weeknd) - From SR3MM](https://open.spotify.com/track/6nI74KsH94IN0J2vp5shdT)

因此,看起来安迪·威廉姆斯是正确的:12 月实际上是一年中最美妙的时间(效价分数:0.7240)。

权重和偏差在神经网络中的作用是什么?

原文:https://towardsdatascience.com/whats-the-role-of-weights-and-bias-in-a-neural-network-4cf7e9888a0f?source=collection_archive---------3-----------------------

以最全面的方式理解神经网络的权重和偏差。

阿洛拉·格里菲斯在 Unsplash 上拍摄的照片

介绍

我们都知道人工神经元是神经网络的基本构建模块。在进入主题“权重和偏差在一个神经网络中的作用是什么”之前,我们先来了解一下这个人工神经元的骨架。

作者图片

基本人工神经元的组成部分:

  1. 输入:输入是我们需要预测输出值的一组值。它们可以被视为数据集中的要素或属性。
  2. **权重:**权重是每个输入/特征的真实值,它们传达了相应特征在预测最终输出中的重要性。(将在本文中详细讨论这一点)
  3. **偏差:**偏差用于向左或向右移动激活功能,您可以将其与直线方程中的 y 截距进行比较。(将在本文中对此进行更多讨论)
  4. **求和函数:**求和函数的工作是将权重和输入绑定在一起,并计算它们的和。
  5. **激活功能:**用于在模型中引入非线性。

如果没有重量呢?

只有当一件事物不存在时,我们才会理解它的重要性。

正如声明所说,让我们看看如果在神经网络中没有权重的概念会怎么样。为了简单起见,让我们考虑在一个数据集中只有两个输入/特征(输入向量xϵ【x₁x₂】),我们的任务让它执行二元分类。

作者图片

求和函数 g(x) 对所有输入求和,并添加偏差。

因此,在求和函数完成其工作后,我们得到一个整数值作为输出,但由于这是一个二进制分类问题,我们需要将这个整数值转换成一个二进制输出,为此,我们借助一个激活函数将整数值映射到二进制输出。激活函数看起来像这样

如果您观察,如果求和函数的输出大于或等于 0,激活函数将一个整数值映射到 1,否则它将输出为 0。

如果我们将激活函数表达式与直线方程进行比较:

通过仔细观察上面 2 个表达式,我们可以推断出方程 **x₂ = -x₁ + b 的斜率(m)是固定的即-1** ,在任何情况下都不会改变。现在你应该明白这个问题了,对于任何给定的数据集,如果不涉及权重,那么对数据点进行分类的线的斜率永远不会改变,并且我们无法绘制一条可扩展的线来分隔两个类别**。**

放心吧!我们用一个例子来了解一下…

考虑这个用于演示的样本数据集,它包含两个输入(特征)【x₁和 x₂】和一个输出 y. 现在我们的任务是,如果我们提供 x1 和 x2 ,我们需要训练计算机预测 y。

作者图片

因此,第一步是我们需要给求和函数输入(x1 和 x2)

下一步是使用激活函数将整数输出映射为二进制值,即(x1 + x2 + b ≥ 0)表示输出为 1,可视为(x2 ≥ -x1 -b ),边界条件为 x2 = -x-b ,因此落在这条线以上的所有点都被视为 1,而这条线以下的所有点都将为 0,因此我们绘制不同的线,并找到 b 的最佳值,以正确分类数据集。

现在,如果我们尝试拟合 x1 和 b 的不同值的直线方程 ( x₂ = -x₁ + b) ,我们将得到这个图…

作者图片

在表达式(x2 = -x1-b)中,你可以任意多次改变 x1 和 b 的值,你观察到的一件事是所有的线都是平行的,斜率与(-1)相同。让我们再来看一个场景

如果我们认为 b 的值是 0,并且对于 x1 的任何值,直线方程看起来像( x₂ = -x₁ + 0 ),那么它在上面的图中被表示为橙色 直线

如果我们考虑 b 的值为 1,则线方程看起来像( x₂ = -x₁ + 1 ),就表示为上图中的蓝色 线

如果我们考虑 b 的值为 2,直线方程看起来像( x₂ = -x₁ + 2 ),则在上面的图中表示为绿线

如果我们继续改变 b 的值,我们只会得到平行线,但线的方向或斜率不会有任何变化,这样我们甚至不能正确地对数据集进行分类,所以我们需要一些额外的东西来改变线的斜率,这就是权重。

让我们将重量付诸行动!

当我们给每个输入分配权重时,等式看起来像…

更符合上面数据集的线是: x₁ = 0

看一下涉及重量时的情节…

当 w2 = 0,w1 = 1,b = 0 时,该方程以最佳方式拟合数据集。

作者图片

从图中,我们可以观察到,随着等式中权重的引入,线的斜率发生了变化。

神经元中的权重向我们传达了什么?

1.功能的重要性

与每个特征相关联的权重传达了该特征在预测输出值中的重要性。与权重值较大的特征相比,权重值接近于零的特征在预测过程中的重要性较低。

在上面的例子中,w2 是 0,这意味着我们不需要 w2 来预测 y 的值,w1 的值是 1,这意味着我们可以单独使用 x1 来预测 y 的值。

2.说明数据集中特定要素与目标值之间的关系。

让我们考虑一个寻找买车可能性的例子,数据集包含两个输入特征,如

  1. 汽车价格
  2. 汽车普及度

让我们假设人们经常倾向于在他们的预算内买一辆车,并且是众多车中最受欢迎的一辆。

线的方程看起来像…

如果汽车的价格增加,那么表达价值也增加,这意味着“我们更有可能购买那辆车”,但我们不希望这种情况发生,所以我们必须用负价值的权重(w₁)来补偿它,这样他们的产品变成负的,表达价值降低,这意味着我们对购买那辆车不感兴趣,这样权重帮助了我们。

因此,如果与某一特征相关的权重为正,则意味着该特征与目标值之间存在直接关系,如果与该特征相关的权重为负,则意味着该特征与目标值之间存在反比关系。

摘要

  • 权重在更改分隔两类或更多类数据点的线的方向或斜率时起着重要作用。
  • 权重表明了某个特征在预测目标值时的重要性。
  • 权重说明了特征和目标值之间的关系

神经元中偏差的使用?

偏置用于将激活功能向左向右移动,没有得到这种说法吗?😕别担心,让我们用视觉体验来理解它…

让我们考虑一个 sigmoid 激活函数来演示偏置的使用,我们可以用以下数学表达式来表示 sigmoid 激活函数

用直线方程代替 x

1.让我们改变 w 的不同值,并将 b 值固定为 0

作者图片

当 b =0 且

w = 0.3 —图中的蓝线

w= 0.5 —图中的红线

w = 0.7 —图中的绿线

即使给出不同的 w 值,我们也不能移动激活函数的中心,在这种情况下,是 sigmoid 函数。

改变 w 的值只会改变曲线的陡度,但我们无法将曲线向左或向右移动,将曲线向左或向右移动的唯一方法是改变 bias(b)的值。

2.让我们改变不同的 b 值,并将 w 值固定为 0.5

作者图片

当 w=0.5 且

b = -1 —图中的红线

b= -5 —图中的绿线

b = 1 —图中的蓝线

b = 5 —图中的黄线

查看该图,改变 b 的值会改变曲线的位置,因此 bias 用于向左或向右移动激活函数。

为什么我们需要将激活功能移向左边或右边?

让我们先了解乙状结肠的工作原理…

作者图片

曲线的方程式是

从图中,我们推断,所有朝向 0 右侧的**的值都被映射到 1** ,所有朝向 0 左侧的**的值都被映射到 0** 。

假设 x = -1,那么对应的 y 值大约为 0.1,我们将其四舍五入为 0,现在假设 x= 5,那么对应的 y 值大约为 1,我们将其四舍五入为 1。

如果我们希望 x<5 时 y 值为 0 呢?

答案是你需要向右移动曲线,即

作者图片

曲线的方程式是

从图中,我们可以推断,x=5 的点左边的所有点的 y 值似乎都小于 0.5,当四舍五入时,y 值最终为 0。因此,我们通过将曲线移向偏移来实现我们的目标,而偏移负责将曲线移向右侧,这就是偏移在人工神经元中的应用。

结论

我希望这篇文章消除了你对为什么我们在人工神经元中需要权重和偏差的所有疑虑。

感谢阅读😃过得愉快

NCAA 篮球冠军的秘诀是什么?

原文:https://towardsdatascience.com/whats-the-secret-of-ncaa-basketball-champions-9cc8e649288?source=collection_archive---------40-----------------------

蓝魔庆祝 2015 年 NCAA 锦标赛

不到三个月,亚特兰大将见证激动人心的 2020 年 NCAA 篮球锦标赛。每年,男子全国大学生篮球锦标赛都会吸引公众的广泛关注,尤其是在临近决赛的时候。在急切等待最终结果的同时,我们注意到,尽管排名有所起伏,但一些篮球队总是位居榜首。这些获胜团队的秘诀是什么?他们成功的因素是什么?

在下面的帖子中,我们将通过分析 2008-2018 年 NCAA 篮球队和球员的数据来发现其中的秘密。

目标

我们的项目有两个主要目标。

  1. 一个冠军团队的成功因素是什么?
  2. 每个位置(中锋、后卫、前锋)都有哪些高级功能?

然后,我们应用这些发现来看看我们的蓝魔如何继续领先。

数据理解

我们使用团队数据集来发现团队成功因素,并使用球员数据集进行球员位置分析。两个数据集的数据源是 运动会

在团队数据方面,我们检索了 2009-2019 年冠军团队的每一场 NCAA 比赛的表现数据。数据集有 23 个要素和一个二项式目标变量,win (=1)或 lose (=0)。

对于球员数据,我们选择了历史上排名前 10 的球队,并根据篮球参考编写了最近 10 年的每场比赛高级球员统计数据。我们还设计了三个功能:真实投篮命中率、有效投篮命中率和团队胜率。正常情况下,一场篮球赛有五个位置。然而,鉴于数据源的有限信息,我们将小前锋和大前锋组合为前锋(F),得分后卫和控卫组合为后卫(G)。该数据集包含以下 37 个要素和 1531 条记录。

数据清理

团队数据集是高度不平衡的(85%的记录有 win=1),所以我们使用 SMOTE 来平衡数据。球员数据集包含板凳球员的大量缺失值和零。领军人物也有一些缺失的价值观。由于我们的目标侧重于后者,我们采取了以下两个步骤来清理数据:

  1. 淘汰了每队的替补队员。
  2. 用 0 来填补这些年来主要球员的缺失值。

方法论

首先,我们在杜克的球员信息上使用无监督的 k-means 聚类来了解蓝魔的招募构成。UNC 和 Uconn 的数据用于比较。

我们的第一个目标是发现冠军团队的成功因素是一个监督学习问题。我们首先使用关联热图进行探索性数据分析。然后,我们建立了逻辑回归、决策树(CART)和随机森林模型。

第二个目标是探索每个职位的高级特征。我们使用逻辑回归和随机森林模型。

建模

利用 k-means 对杜克大学 2009 年至 2019 年的球员信息进行聚类,我们发现蓝魔一般分为两类。第一个聚类更看重玩家在游戏中的实际表现,而第二个聚类更关心玩家的背景信息,如位置。类似的聚类结果也可以在北卡罗来纳焦油脚跟队和康涅狄格哈士奇队中找到,他们在过去十年中也获得过两次 NCAA 篮球冠军。

有趣的是,当我们查看集群时,我们发现在性能集群中,三所学校在配置上有不同的策略。康涅狄格大学更喜欢后卫,而北卡罗来纳大学有更多的前锋。杜克大学在后卫和前锋球员的数量上相当平衡。在与这两支球队比赛时,这种洞察力可以用来制定球场策略。

**目标 1:** 冠军团队的成功因素

从热图中,我们观察到两个特征之间的强相关性,这是由于它们的部分-全部关系。比如投篮命中率% (FG%) &投篮命中率(FG),2 分 FG (X2P) & 2 分 FG 尝试(X2PA)。我们发现 X2P 比 X3P 与 FG 更相关,防守篮板与总篮板也是如此。此外,与罚球相比,投篮命中率与总得分的相关性更强。

1 特征关联的热图

然后,我们使用逻辑回归(LR)、逐步回归、决策树(CART)和随机森林来预测团队获胜。表 2 显示了结果汇总:

随机森林模型的准确率最高,为 95.3%。在所有四个模型中,我们观察到增加的点数(PTS。防守篮板(DRB)和 2 分投篮(X2P)是赢得比赛的关键属性。由于随机森林更高的准确性和决策树更好的可视化,我们深入到细节中研究每个特征的重要性。

2 决策树可视化

让我们看看图 2。从根分裂条件点(PTS。g),我们知道积分对胜利至关重要,这符合我们的直觉。再往下分支,如果个人犯规(PF)少于 23 次(分支右侧),一支球队极有可能赢得比赛。否则,凭借队员之间良好的助攻,球队仍有机会获胜。防守篮板(DRB)是另一个至关重要的特点。高 DRB 有助于胜利。有趣的是,我们发现,当一支球队在对手错过一个投篮机会后不擅长获得控球权时,高尝试 2 分和 3 分投篮机会导致高概率的失败。

3 随机森林分类器

在随机森林分类器中,我们还可以通过比较两个条形之间的高度差来查看每个高级功能的重要程度。点数(PTS。g)保持获胜的最高级特征。DRB 的重要性也符合分类树模型的重要性。此外,投篮命中率(FG%)、2 分和 3 分投篮命中率(X2P & X3P)也非常重要。我们进一步发现,罚球在赢得一场比赛中更重要,X3P 对 X2P 也是如此。另一方面,上场时间(MP)相对来说是最不重要的。

总之,得分和防守篮板是成功的决定性因素。此外,更少的个人犯规大大增加了获胜的机会。FG%也起了重要作用,X3P 在凯旋中对 X2P 的贡献更大。然而要记住,盲目的 X2P 和 X3P 尝试可能会导致控球权的丧失并导致失败。我们将在下面的内容中进一步讨论每个位置的高级特性。

**对象 2:每个位置的重要特征**

我们放大以探索每个位置的高级功能。如何将对方的实力发挥到前台,带动集体潜力?对于玩家分析,我们运行了两个模型:随机森林和逻辑回归。前者显示了所有玩家和各自位置的重要特征。

4 总体特征重要性

从上面的图表中,盖帽(BLK),阻止进攻球员得分的能力,是个人对球队的一项基本能力,其次是三分球尝试。助攻(AST)仍然是一个重要的特性。但是,与球队分析不同的是,对于一个球员来说,进攻篮板(ORB)比防守篮板更关键。虽然上场时间是球队表现最不重要的特征,但它对每个人都很重要。

让我们来看看每个职位的细分情况。各职位的高级功能有什么不同吗?在历史上排名前 10 的团队中,我们从上表中得到了以下观察结果:

总的来说,对每个球员来说,三分球比两分球更重要。助攻和拦网是另外两个必备技能。那么每个位置都有各自的高级功能:

  • 中心(C):在这个模型中没有明显的特征来区分中心。所以后来我们用逻辑回归发现了这个位置。
  • 前锋(F):辅助技能和失误使这一职位与众不同,因为这两项在其他特征中具有更高的重要性。他们也有更高的机会开始一个游戏。
  • 后卫(G):阻挡技能和投篮相关的指标区分后卫。篮板能力对他们来说也更重要。

我们还运行了一个多类逻辑模型。下面的结果表明,F 和 G 有更高的机会去偷,而 C 有更高的机会去挡。此外,在一场比赛中,C 比 F 和 G 更有可能进行个人犯规。

部署:针对蓝魔

目标 1 的结果确定以下 11 个变量为高级特征。以历届冠军的平均值为基准,我们观察到杜克 2020 的 3P、3PA 和 DRB 低于这些基准。

5 与基准的比较

然后我们再分解看看之前 16 场的杜克 2020 表现。下图 6 显示了 3P 和 AST 是最常低于基准的两个特性,分别有 69%和 56%的早期游戏低于基准。虽然杜克 2020 的表现在 44%的游戏中缺少 DRB,但它的 2PA 相当高。

6 低于基准%

因此,我们对即将到来的杜克 2020 运动会有以下建议:

  1. 更多地关注三分球,因为它们比 2P 和罚球更重要。
  2. 加强后卫在防守篮板球方面的能力,这样高 2P 的尝试对胜利有更大的贡献。

对于未来蓝魔的招募,基于我们的分析,我们提出以下建议:

  1. 首先测试所有候选人的拦网技巧,因为它起着至关重要的作用。然后测试一下 3P 候选人的命中率。
  2. 评估前锋和后卫的防守技能,因为抢断是他们的一个重要特征。同样,考验前锋的助攻技术,后卫的得分技术。
  3. 由于防守(BLK,DRB,STL)和进攻(FG,ORB,AST,TOV)特征在团队数据集中都显示出重要性,杜克可以评估每个球员的实力,组成一个平衡的团队,以避免出现明显的弱点。

对于未来的游戏策略,如果我们的蓝魔遇到像 UNC 和 Uconn 这样的老对手,我们可以相应地调整团队组成。

北卡罗来纳大学倾向于招募更多的前锋,所以它更注重整体合作。彼此最熟悉的蓝魔可以开始游戏,想出突破的策略。

Uconn 通常有更多的后卫球员可以在球队中获得高分。他们更有可能阻挡我们的进球,并在我们错过一个进球后接管球权。命中率高的玩家可以加入我们蓝魔队。

合著者:李嘉文和季春雨