TowardsDataScience-博客中文翻译-2016-2018-三百二十一-

55 阅读1小时+

TowardsDataScience 博客中文翻译 2016~2018(三百二十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

您将从 fast.ai (v2)中学到什么第 2 课

原文:towardsdatascience.com/what-youll-…

之前的博客中,我们已经讨论了什么是 fast.ai 以及 fastai 的第一课包含了什么。我们还讨论了“参数是什么”、“损失函数和梯度下降有什么作用”以及“为什么学习速率很重要”。如果你还没有看过那个博客,我建议你在继续之前先看看。因为这个博客有很多关于 fastai 第一课的参考资料。如果你已经读过了,那么通过这篇博客让我们继续第二课,学习由杰瑞米·霍华德瑞秋·托马斯在他们的 fastai 库中开发的各种技术。

我不得不阐述许多事情,并举例说明几个概念,以清楚地解释它们背后的逻辑。在这个过程中,博客变得非常冗长。不要担心那个。

在开始上课之前,有几件事情是数据科学新手必须知道的。如果你已经熟悉深度学习的行话,可以直接跳到第二课部分。

随机梯度下降小批量梯度下降与我们在之前的博客中讨论过的梯度下降概念没有什么不同。唯一的区别是数据集的大小。传统上,人们在更新权重时会考虑整个训练集。这很好,只是每次更新都要占用大量空间。

因此,人们将整个集合分成小的子集,称为小批量,并利用这些小集合来更新参数。然而,在所有这些小批量更新结束时构建的模型将不会像通过整个集合那样通用。为了掩盖准确性,我们在整个数据集上训练模型,分成小批量,多次。这些被称为时代。因此,在几个时期内对模型进行小批量训练将会得到一个更一般化的模型,同时确保不存在任何内存使用问题。

第二课:

第 2 课主要讲述如何使用 fastai 库中的各种技术,以提高分类器的准确性。可以列举如下:

  • 数据增强如何帮助提高准确性?
  • 哪里使用,哪里不使用‘预计算’?
  • 什么是带重启的随机梯度下降?还有什么是 cycle_lengthcycle_mult
  • unfreeze() 函数会做什么,微分学习率如何细化模型?
  • 训练时如何处理图像大小和批量大小,这些会如何影响训练?

数据扩充:

粗略定义的数据扩充是一种用于创建更多数据的方法。这种“方法”包括一组应用于输入图像的变换,以给出它的多个副本,每个副本有一个小的变化。例如,请看下图。

这些是 fastai 第 2 课中使用的一些转换。在第一和第二图像之间存在垂直平移,并且第三图像是第一图像的镜像。您可以根据需要添加任意多的不同转换,并增加训练集的大小。只要确保转换是合乎逻辑的。例如,如果原始对象没有因为图像的过度放大而变形,则放大图像可以被认为是变换。

预计算:

当我们导入特定架构时,如 VGG16 或 Resnet34 等。,我们可以选择加载所有预训练的砝码。在 fastai 库中,在构建模型时,可以通过设置“precompute = True”来加载权重。

这些架构中的大多数是为 ImageNet 大规模视觉识别挑战(ILSVRC)而设计的。ILSVRC 是计算机视觉领域一个非常著名的挑战。它包含各种挑战,包括图像分类,模型优化,图像分割等。该数据集包含 1000 个类,其中包括几个狗的品种,猫的品种,鸟类等。来自世界各地的人们竞相展示他们的知识。

如果您正在处理的数据与 ImageNet 数据集的数据相似,则设置“precompute = True”将缩短训练时间。如果数据完全不同,建议不要使用预先计算的权重。简而言之,预计算模型更偏向于与 ILSVRC 数据集相似的数据集。

重启随机梯度下降(SGDR):

SGDR 解决了我们在培训过程中面临的两个主要问题。

  1. 它将通过调整学习速率来确保模型得到改进。
  2. 它将确保这个模型更具普适性,把它从任何尖锐的井中提取出来。

对于每个小批量迭代,权重的更新取决于斜率/梯度和学习速率。当在每一步之后更新权重时,在某一点,我们将到达 dW 在最小损耗点附近振荡的位置,如图所示。

当这种情况发生时,模型停止学习,因为权重没有提高。在这种情况下,由于我们不能改变斜率,降低学习率将确保正确更新权重。每当他们观察到损失没有进一步改善时,使用阶跃衰减,将学习速率降低一个因子,比如 10,是这个问题的解决方案之一。

阶跃函数的替代方法是余弦退火,它改变学习速率,如下所示。

Cosine Annealing

余弦退火用于将损耗降低到尽可能小。这有助于增强模型。为了进一步推广该模型,我们以如下方式在几个时期后重置学习率。

这被称为带重启的随机梯度下降。让我们假设我们从 1e-2 的学习率开始。在第一个时期结束时,学习率降低到 1e-3。我们再次将学习速率重置为 1e-2,这一次我们在将其降低到 1e-3 之前运行 2 个时期。并且重复这个过程。

这种方法的优点是,即使模型停留在任何局部最小值,SGDR 也会将其推出,并确保模型达到更普遍的全局最小值。

周期长度给出第一个周期的长度。在我们的例子中,这是 1,因为我们在 1 个时期内将学习率从 1e-2 降低到 1e-3。 cycle_mult 决定了我们重复这个过程的次数。在上图中, cycle_mult 为 3。

如果 *cycle_length = 2,cycle_mult = 2,*那么它看起来像这样。

Unfreeze():

unfreeze() 功能顾名思义就是解冻模型。当运行梯度下降时,在几个时期之后,损失达到平稳状态。即使我们使用梯度下降重启,情况也不会改善。发生这种情况是因为在几次迭代之后,外层的更新成为主导,而内层被冻结。 unfreeze() 函数将在所有层之间平均分配权重更新。

在分配权重时,我们需要非常谨慎地选择正确的学习率。众所周知,最内层更关注边缘,中间层更关注曲线或圆形结构,最外层处理特征识别。

对于最内层,更好的权重意味着更锐利的边缘。所以这些层对权重更新非常敏感。这是模型冻结的主要原因。但是如果我们对这样的层使用小的学习率,那么我们可以微调它们来锐化边缘。fastai library 通过使用他们定义为“差异学习率”的东西来做同样的事情。其中我们可以为不同的层选择不同的学习速率。

一旦我们在 lr_find() 的帮助下找到了最佳学习速率,我们就可以降低中间层和内层的学习速率。例如,在使用 lr_find() 之后,假设我们得到 1e-2 作为我们模型的最佳学习速率。使用 lr = [1e-4,1e-3,1e-2] 将内层的学习速率设置为 1e-4,中间层为 1e-3,外层为 1e-2。使用 unfreeze() 然后使用不同的学习率,可以将精确度提高 1-2%左右。

批量大小和图像大小:

最后,杰里米的一个非常有趣的观察是:一旦模型被训练,增加输入的图像大小有助于模型避免过度拟合。

我们很容易理解为什么会出现这种情况。通过扩大输入,您基本上向模型展示了模型以前可能没有遇到过的附加特性。

例如,假设最初您已经在 224x224 图像输入上训练了模型。因此,我们从原始图像中提取 224x224 的裁剪,并将其用于训练。现在,如果我们将输入大小增加到 229x229,那么感受野会增加,这个更宽的输入包含了比之前更多的图像信息。

但是,如果我们增加图像大小,由于内存限制,批处理大小应该会减少。并且具有非常小的批量会在训练时增加很多噪音。无限增加图像大小会迫使算法采用较小的批量,不建议这样做。

图像大小和批量大小是两个超参数,应该根据自己的记忆容量仔细选择。

这些是我从 fastai 的第二课中发现的要点。如果我错过了什么,或者你想知道更多关于某个特定主题的信息,请在下面的评论中提出。我总是乐于接受讨论和积极的批评。如果你喜欢这个博客,觉得它内容丰富,那么别忘了鼓掌。

快乐学习!干杯!

你将从快速人工智能(v2 第 2 部分)第 8 课中学到什么

原文:towardsdatascience.com/what-youll-…

fast.ai 是最好的 MOOC 之一,它向具有血统编程背景和一点数学背景的学生教授深度学习。fastai 有 14 节课,分为两部分,每部分 7 节课。这 14 个视频完全涵盖了卷积网络(ConvNets)、自然语言处理(NLP)、结构化数据分析、推荐系统等主题。

fastai 的第 1 部分首先介绍世界各地的人们实践的现代技术,然后讨论这些技术的基本概念。在第二部分中,fast.ai 课程的创建者杰瑞米·霍华德雷切尔·托马斯采用了一种略有不同的方法,教授如何阅读、理解和实施研究论文。

快速总结我们在第 1 部分学到的内容:

迁移学习允许你使用已经在数据集上训练过的模型,该数据集类似于你正在用于你自己的问题陈述的数据集。这是通过用新的随机初始化的 FC 层替换最后一个完全连接的(FC)层来实现的。现在训练模型只是学习最后一个 FC 层中的参数。因此,迁移学习将会派上用场,因为它可以将训练时间缩短到通常学习所有重量所需时间的一小部分。

**克服过拟合:**认为对更多的历元数进行训练会使模型工作得更好,这是人的天性。这确实是真的,但是在训练集上效果更好。不在测试集上。这就是我们所说的模型过度适合训练数据的时候。为了概括这个模型,我们在第 1 部分中遇到了数据扩充、删除、批处理和其他类似的技术。这些技术将让你使用一个更广更深的网络,这是通用的。

**嵌入:**当涉及分类特征时,仅仅使用一次性编码很难捕捉到细节。例如,在第 1 部分中,我们考虑了位于不同城市的商店的销售预测。对于诸如星期几或商店位置之类的特征,我们可以通过使用一种叫做嵌入矩阵的东西来包含不同城市每天的相关性。在第 1 部分中,我们已经了解了使用嵌入的重要性。

**架构设计:**架构偏好完全取决于数据。对于有序和固定大小的数据,我们使用 CNN,对于序列,我们使用 NLP 技术,对于多标签分类,我们使用 Softmax。我们已经在 fastai 的第 1 部分中详细讨论了这些。

在第 2 部分中,我们将会遇到:

fastai lesson 8 live video snapshot

在第二部分,正如我前面所说,我们将学习阅读和实施那些有价值的研究论文,如果不是每一篇研究论文的话。在第 1 部分中,我们更加关注图像分类、预测分析和情感分析。在第 2 部分中,我们将讨论对象检测、语言翻译、大数据分析和其他相关主题。在 fastai 的版本 1 中,我们也讨论了时间序列。但是我们可以在机器学习课程中找到那些题目。

那些对 python 几乎没有经验的人现在将是学习和练习 python 和 PyTorch 编码的好时机(我们将使用后者从头构建深度学习模型)。在线阅读代码示例时要小心。几乎所有的都会有瑕疵。

而有一点数学背景的,尽量多读研究论文。这将在两个方面帮助你。第一,你将熟悉希腊字母,它们在所有的文章中几乎有相似的意思。第二,你将不再害怕方程式。碰巧的是,院士们用庞大的方程来表达简单的想法。理解这个概念很重要。

如果你对编码和面对理解方程式的问题感到舒服,或者相反,试着活跃在论坛上,写下你的经历。他们会成为你学习过程的催化剂。

博客上的一个小提示。不要犹豫,写下你心中的任何想法。每个人都有不同的理解方式,你的博客可能会帮助其他正在学习的人。

到目前为止,我们一直在借助虚拟机和各种库来构建分类器或推荐系统或其他类似的模型。但从现在开始,我们将从头开始构建这些模型。所以拥有一个配有像样 GPU 的系统会有很大的帮助。购买自己系统的指南:

Another snapshot of live fastai lesson 8

物体检测:

对象检测有两个部分。多个分类和围绕每个对象绘制边界框。在第 8 课中,我们将尝试创建对象检测器的第一阶段,在给定的图像中,我们尝试找到最大的对象,检测该对象是什么,在该对象周围绘制一个边界框并标记它。这仅适用于一个对象。在后面的课程中,我们尝试多重分类。

为此,我们使用 PASCAl VOC 数据集,它包含带有相应注释的图像。每个图像的注释具有关于图像中所有对象的信息、框的起点坐标、框的高度和宽度。

Image from host.robots.ox.ac.uk/pascal/VOC/…

这是 2005 年 PASCAL VOC 数据集的一个例子,其中盒子的细节包括左上坐标和右下坐标。我们使用 2007 数据集,其中盒子细节包括左上角坐标及其高度和宽度。我们会将该格式转换为左上/右下格式。

编码细节:

  • 我们使用pathlib库作为文件路径的生成器。PATH为文件路径创建对象。像cv2这样的库中不允许有对象,所以我们需要将文件路径转换成字符串。

  • 我们导入了json库,它直接从给定的文件路径中提取图像、注释和类别。

  • 注释包含边界框信息。

  • bbox我们在注释中的是[x _ 坐标,y _ 坐标,高度,宽度] x,y 坐标表示盒子开始的地方,也就是左上角,然后是盒子的尺寸(高度,宽度)。
  • 我们需要将这些信息转换成左上/右下的格式。

bb在这段代码中也有 4 个元素。前两个给出了位置坐标。它们可以互换,因为在 VOC 数据集中,一个点被表示为[列,行],但在我们的 ConvNet 模型中,我们将一个点视为[行,列]。而bb的下两个元素给出了盒子的右下角(左上角行号+宽度给出了右上角。右上角列号+长度给出右下角。)

对于编程新手来说,Jeremy 就如何使用 Visual Studio,如何调试你的代码,如何使用 Matplotlib 的面向对象的 API 用它们对应的 bbox 打印图像做了一个小小的介绍。你可以从 fastai 资源库下载笔记本阅读理解。

训练模型:

我们面临两个挑战。第一,对最大的物体进行分类。并绘制边界框。在第一部分中,我们遇到了许多对图像进行分类的技术。我们可以看到下面每张图片的预测标签。

所以第一部分已经部分解决了。为了预测多个物体,我们需要对代码做一点调整,我们会在后面的课上看到。但是为了创建边界,我们可以使用bb作为每个图像的标签。也就是说,我们预测了 4 个不同的数字。我们可以把这看作一个有 L1 损失的回归问题,并预测这 4 个数字。如果我们使用我们在第 1 部分中学到的技术进行训练,比如lr_find(), cycle_len, cycle_mult,,我们会得到一个模型,它可以完成我们在下面看到的合理工作。

如果你仔细观察,这些盒子并不完美。如果图像中有多个对象,则在对象之间的中间位置绘制方框。我们可以在后面的课程中进一步完善这个模型。

fastai v2 的第 8 课到此结束。fastai v2 的第二部分目前只对已经申请并被接受为国际研究员的人开放,以及在旧金山大学亲自上课的人。但是如果你不在团契里,没什么好担心的。您可以直接提取 fastai 课程的 git 存储库,并且在“课程”文件夹中,您可以找到包含本课程的 jupyter 笔记本的“dl2”/“deep learning 2”文件夹。我会尽我所能涵盖课程中教授的所有主题,这样你就可以很容易地跟随笔记本并理解正在发生的事情。

重要提示:无论你是不是国际研究员,你都必须能够在不查看的情况下重建整个笔记本。笔记本必须充当资源。一旦你理解了这个概念,试着编码并复制这个笔记本。如果你被困在某个地方,那么参考笔记本。

我欢迎所有的国际研究员来评论你的想法。让我们一起享受学习深度学习概念的乐趣,在各个领域工作,从而解决世界上最受关注的问题。让我们把‘国际联谊 2018’打造成 fastai 最好的一批。

如果你喜欢这个博客,别忘了鼓掌!

您的 iMessage 数据显示了您的哪些信息

原文:towardsdatascience.com/what-your-i…

如今,我们几乎只通过短信交流。甚至我 96 岁的祖母也懂表情符号,知道表情符号的真正含义🍆和🔥。

对这些信息的分析会是什么样的呢?我们能从关系中学到什么?

在本文中,我们将找出并研究如何围绕这些消息可视化构建一个应用程序!

你有没有在写私人短信的时候把手机倾斜开了?

你会让一个陌生人浏览你的对话吗?

想想我们的信息历史是多么的暴露和亲密,这几乎让人不舒服。它直接记录了我们与那些我们认为值得回短信的人的关系。

iMessage 在在线信息领域占据主导地位,因为它本质上与苹果设备是锁定的。

任何拥有 MacBook 和 iPhone 的开发者或重度电脑用户都知道 iMessages 自动同步带来的难以置信的便利。

好吧,酷——很好的推测。数据怎么说?

锁定数据

这些数据不容易获取并不奇怪。iOS 完全锁定了消息——无法通过其 SDK 以任何方式访问。

此外,在 iPhones 锁定的环境下,我们没有太多的选择来定位和分析设备上的信息。

要是有一种方法可以让我们实时导出这些消息就好了…

💡AH HA! - The desktop app!

我们的后门

经过对苹果文档的研究,我们在 MacBook 上找到了 iMessage DB。

如果我们在终端中运行这个简单的命令,我们将获得数据库的路径。

echo /Users/$USER/Library/Messages/chat.db

Finding the path to our messages database

探索/理解这种混乱

我们打开数据库,但好的数据在哪里仍然让人有些困惑。我们仍然需要对这些数据库字段进行逆向工程——或者翻遍苹果文档。

让 SQL 与 DB Browser for SQLite 一起使用一段时间,这是一个处理 SQLite 数据库的简单应用程序。

chat.db loaded into DB Browser for SQLite

[## SQLite 的数据库浏览器

2017-09-28 -新增 portable app 3 . 10 . 1 版本。谢谢约翰。:)2017-09-20 - DB 浏览器 for SQLite 3.10.1 已…

sqlitebrowser.org](sqlitebrowser.org/)

几个小时后,我从 Apple docs 中拼凑了足够的工作 SQL 和线索来提取所需的信息。

这项工作被封装在一个 Python 类中,这样我就可以在 Jupyter 笔记本上做一些分析。

下面是提取数据的片段

现在我们可以用 Python 做一些真正的分析,然后将一些工作转化为有用的可视化。

🤷🏽‍表情符号也很重要!

即使在我们的分析中不包括文本,我们也可以做一些表情指纹识别。

我们可以很好地了解一段关系,只需显示我和另一个人之间发送的每个表情符号的数量。

如果分解成发送-接收,这可能更具描述性。

这是我和朋友们的三个不同的表情网格

模式发现

太好了,我们有漂亮的图片,还对表情符号做了一些汇总。

然而,我们希望确保这些东西在现实世界中是有意义的,并做一些理智检查。

在这里,我们将进行更深入的分析,并尝试将我们提取的几个数据点联系在一起。

下面是一个和我一起生活的家庭成员的一小时一天的图表。顶部的表情符号也显示在右边。

我们立即注意到晚上 9 点左右的深色方块,以及大量的狗表情符号……对我来说,这种模式再清楚不过了。

我的狗内斯;大约在晚上 9-10 点最后一次散步。如果我不在家或者离家很远,我的家人经常会带他去散步。

这些文字是在问 Ness 是否需要遛,有时还附带一个狗表情符号。

太好了——事情正在有序进行。

“这是你必须做的🐕esta noche?”

—家庭成员

这一切都是为了这个人

Ness being dramatic on FT

让我们再做一次——制作一个应用程序

现在我们有了这个很酷的工具,但是我们想让它可重复使用。我们将使用 NodeJS 进行 SQLite 连接,使用 Express 来提供服务,使用 Electron 来打包。

我们需要:

  1. 构建 UI——让我们从实际的 iMessage 应用程序中获得灵感!
  2. 对 DB 连接器脚本进行分类——让我们使用 NodeJS
  3. 构建一个小型服务器来连接 UI 和 DB
  4. 制作一个小型电子应用程序包装器

General App Layout

构建应用程序

我们使用之前编写的 python 脚本作为节点版本的起点。我们做这种语言转换是因为我们最终想把这整个东西打包成一个 AppStore Mac 应用程序。Electron 使这个过程变得更容易,我们希望所有的代码都使用同一种语言。

首先,让我们创建一个电子应用程序 shell——一个 main.js 文件,它将打开一个窗口,监听本地主机和我们的 UI 将在 dev 中运行的端口。

接下来,我们使用 express 来设置一个小型服务器。这个服务器应该返回应用程序的 html 页面,并且有两个端点——一个获取消息,一个获取最后的消息;iMessage 中的侧边栏。

您会注意到,这个服务器正在实例化我们尚未构建的 DataGrabber 类,这将是翻译后的 python 类。

当我们构建它时,有一些变化,因为现在我们使用承诺来确保数据被返回,而不是依赖 python 的同步执行流。

这些基本上是构建应用程序所需的所有部分,我们仍然需要大量的 CSS,JS 和 HTML 来制作 UI。如果读者感兴趣,我将把这个问题留给他们。

❓Questions 致读者

  1. 你认为我们能从谈话中提取出什么样的信息?
  2. 我们如何做到这一点?
  3. 这样做的危险或好处是什么?
  4. 这些信息是人们想了解自己的吗?
Thanks for getting through this adventure with me. Please show support and 👏 (clap) for this article.Remember you can clap up to 50 times, and clapping for this article would be really helpful in the Medium algorithm. Any support is greatly appreciated ❤️ Also, please answer the questions and add to the discussion below

客户价值几何?用 Python 为非合同业务建立客户终身价值模型

原文:towardsdatascience.com/whats-a-cus…

Photo credit: Pexels

在电子商务或零售业务中,企业和客户之间的关系是非契约关系。在非契约的世界里,顾客确实会走开,但他们是默默地走开的;他们没有必要告诉我们他们要离开。这使得 CLV 的计算更加复杂。我们必须查看自客户上次交易以来的时间,并提出一个问题:客户是活着但处于休眠状态,还是客户“死亡”(“活着”意味着客户与我们互动,“死亡”意味着他们作为客户变得不活跃)?

因此,我们在这里:为非合同业务的客户终身价值建模。

该分析由沃顿商学院的彼得·法德尔博士提供。在这个分析中,我们不会深究 CLV 的数学。不过,如果你有兴趣,这里有的论文

数据

我们将使用的数据与我们进行购物篮分析客户细分在线零售数据集时的数据相同,这些数据可以从 UCI 机器学习库下载。

import pandas as pd
import warnings
warnings.filterwarnings('ignore')
df = pd.read_excel("Online_Retail.xlsx")
df.head()

Figure 1

像往常一样,我们要做一些清理工作,然后创建一个只包含 CustomerID、InvoiceDate(删除时间)的新数据框架,并添加一个新列— sales:

import datetime as dt
df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate']).dt.datedf = df[pd.notnull(df['CustomerID'])]
df = df[(df['Quantity']>0)]
df['Sales'] = df['Quantity'] * df['UnitPrice']
cols_of_interest = ['CustomerID', 'InvoiceDate', 'Sales']
df = df[cols_of_interest]
print(df.head())
print(df.head())
print(df['CustomerID'].nunique())

Figure 2

CLV 模型定义

对于 CLV 型号,使用以下术语:

  • 频率代表客户重复购买的次数。这意味着它比总购买次数少 1。
  • t 代表客户在任何时间单位内的年龄(在我们的数据集中是每天)。这等于客户第一次购买和研究期末之间的持续时间。
  • 新近性代表顾客最近一次购买的年龄。这等于客户第一次购买和最后一次购买之间的持续时间。(因此,如果他们只进行了 1 次购买,则新近度为 0。)

下面的分析是使用由 Shopify 的数据科学家 Cameron Davidson-Pilon 开发的寿命包在 Python 中进行的,代码很大程度上借用了寿命文档

数据浏览

from lifetimes.plotting import *
from lifetimes.utils import *
from lifetimes.estimation import *data = summary_data_from_transaction_data(df, 'CustomerID', 'InvoiceDate', monetary_value_col='Sales', observation_period_end='2011-12-9')
data.head()

Figure 3

我们分析的客户有 4339 个。

CustomerID 12346 只购买了 1 次(没有重复),因此他的频率和最近次数为 0,年龄为 325 天(例如,在分析中,他第一次购买和周期结束之间的持续时间)。

data['frequency'].plot(kind='hist', bins=50)
print(data['frequency'].describe())
print(sum(data['frequency'] == 0)/float(len(data)))

Figure 4

在我们的数据中,超过 35%的顾客只购买过一次(没有重复购买)。

使用 BG/NBD 模型进行频率/新近度分析

from lifetimes import BetaGeoFitterbgf = BetaGeoFitter(penalizer_coef=0.0)
bgf.fit(data['frequency'], data['recency'], data['T'])
print(bgf)

<lifetimes.betageofitter: fitted="" with="" subjects="" a:="" alpha:="" b:="" r:=""></lifetimes.betageofitter:>

可视化我们的频率/最近矩阵

假设:一位客户连续四周每天都购物,然后我们几个月都没有他的消息了。他还“活着”的几率有多大?很小,对吧?另一方面,历史上每个季度购买一次,上个季度又购买一次的客户很可能还活着。我们可以使用频率/最近矩阵来可视化这种关系,该矩阵计算一个模拟客户在下一个时间段将要进行的交易的预期数量,给定他的最近(最后一次购买的年龄)和频率(他已经进行的重复交易的数量)。

from lifetimes.plotting import plot_frequency_recency_matrix
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12,8))
plot_frequency_recency_matrix(bgf)

Figure 5

如果客户购买了 120 次,并且他最近一次购买是在他大约 350 天大的时候(即最近:她第一次交易和最近一次交易之间的持续时间是 350 天),那么他是我们的最佳客户(右下角)。

大量购买和最近购买的客户很可能是未来的最佳客户。我们永远都不会满足。

购买了很多但不是最近购买的客户(右上角),可能已经走了。

(40,300)附近还有另一种类型的客户,代表不经常购买的客户,我们最近没有见过他,所以他可能会再次购买。然而,我们不确定他是已经走了还是只是在购物之间。

我们可以预测哪些客户肯定还活着:

from lifetimes.plotting import plot_probability_alive_matrix
fig = plt.figure(figsize=(12,8))
plot_probability_alive_matrix(bgf)

Figure 6

最近购买的客户几乎肯定是“活着”的。

那些大量购买但不是最近购买的顾客,很可能已经退出。他们过去买的越多,就越有可能辍学。它们被显示在右上方。

我们将客户从“下一阶段最高预期购买量”到最低预期购买量进行排名。模型揭示了一种方法,该方法将使用客户的历史记录来预测客户在下一时期的预期购买量。

t = 1
data['predicted_purchases'] = bgf.conditional_expected_number_of_purchases_up_to_time(t, data['frequency'], data['recency'], data['T'])
data.sort_values(by='predicted_purchases').tail(5)

Figure 7

上面列出的是我们的前 5 名客户,模型预计他们将在第二天进行购买。predicted_purchases 列表示他们的预期购买数量,而其他三列表示他们当前的 RF 指标。BG/NBD 模型认为这些人在不久的将来会购买更多东西,因为他们是我们目前最好的客户。

评估模型拟合度

from lifetimes.plotting import plot_period_transactions
plot_period_transactions(bgf)

Figure 8

不错,我们的模型不差。所以,我们可以继续我们的分析。

我们现在将数据集划分为校准周期数据集和维持数据集。这很重要,因为我们想要测试我们的模型在尚未看到的数据上的表现(就像机器学习实践中的交叉验证)。

from lifetimes.utils import calibration_and_holdout_datasummary_cal_holdout = calibration_and_holdout_data(df, 'CustomerID', 'InvoiceDate',
                                        calibration_period_end='2011-06-08',
                                        observation_period_end='2011-12-9' )   
print(summary_cal_holdout.head())

Figure 9

from lifetimes.plotting import plot_calibration_purchases_vs_holdout_purchasesbgf.fit(summary_cal_holdout['frequency_cal'], summary_cal_holdout['recency_cal'], summary_cal_holdout['T_cal'])
plot_calibration_purchases_vs_holdout_purchases(bgf, summary_cal_holdout)

Figure 10

在该图中,我们将数据分为采样(校准)和验证(维持)两个阶段。样本期从年初至 2011 年 6 月 8 日;验证期从 2011 年 6 月 9 日到 2011 年 12 月 9 日。该图根据重复购买的次数(x 轴)对校准期内的所有客户进行分组,然后对维持期内的重复购买进行平均(y 轴)。绿色和蓝色线分别表示 y 轴的模型预测和实际结果。正如我们所看到的,我们的模型能够非常准确地预测样本中客户群的行为,该模型低估了 4 次购买和 5 次购买后的行为。

客户交易预测

根据客户历史,我们现在可以预测个人未来的购买情况:

t = 10
individual = data.loc[12347]
bgf.predict(t, individual['frequency'], individual['recency'], individual['T'])

0.1572775101289126

我们的模型预测客户 12347 的未来交易是 10 天后的 0.157。

客户概率历史

根据我们训练好的模型,给定客户交易历史,我们可以计算他们存活的历史概率。例如,我们希望查看我们最佳客户的交易历史,并了解其存活的概率:

from lifetimes.plotting import plot_history_alive
import matplotlib.pyplot as pltfig = plt.figure(figsize=(12,8))
id = 14606
days_since_birth = 365
sp_trans = df.loc[df['CustomerID'] == id]
plot_history_alive(bgf, days_since_birth, sp_trans, 'InvoiceDate')

Figure 11

我们最好的客户肯定还活着,但是,他在 2011 年下半年中断了几次。

fig = plt.figure(figsize=(12,8))
id = 14729
days_since_birth = 365
sp_trans = df.loc[df['CustomerID'] == id]
plot_history_alive(bgf, days_since_birth, sp_trans, 'InvoiceDate')

Figure 12

另一方面,这位顾客只购买过一次,已经离开很长时间了,他有 100%的可能已经死了。

使用货币价值的伽玛-伽玛模型估算客户终身价值

我们现在考虑每笔交易的经济价值。为了估计这一点,我们使用沃顿商学院的 Peter Fader 博士和 Bruce Hardie 博士提出的 Gamma-Gamma 子模型来预测未来客户层面的每笔交易的可能支出。

我们只估计了至少有一次重复购买的客户。因此,我们估计有 2,790 名客户。

returning_customers_summary = data[data['frequency']>0]print(returning_customers_summary.head())
print(len(returning_customers_summary))

Figure 13

from lifetimes import GammaGammaFitterggf = GammaGammaFitter(penalizer_coef = 0)
ggf.fit(returning_customers_summary['frequency'],
        returning_customers_summary['monetary_value'])
print(ggf)

<lifetimes.gammagammafitter: fitted="" with="" subjects="" p:="" q:="" v:=""></lifetimes.gammagammafitter:>

应用 Gamma-Gamma 模型后,现在我们可以估计每个客户的平均交易值。唷!

print(ggf.conditional_expected_average_profit(
        data['frequency'],
        data['monetary_value']
    ).head(10))

Figure 14

Jupyter 笔记本可以在 Github 找到。周末快乐!

设置 GCP 计算实例后会发生什么?使用 Tensorflow 运行自定义 Docker 容器

原文:towardsdatascience.com/whats-after…

pixabay.com

What we should see after setting up

介绍

随着深度学习的出现和“模型越深,性能越好”的实现,谷歌云平台(GCP)等基于云的计算平台获得了相当多的关注(我在这里不是为了争论这个概念的真实性,而只是陈述一个被广泛接受的信念)。以及“模型越深,计算资源应该越好”。

无论何时发布最新的 GPU 卡,购买并安装它们都不是经济可行的策略(尤其是对于中小型技术机构)。如果一个人采用这种策略,他应该为下面的挑战做好准备。

  • 做出巨大的金钱牺牲来购买最新的 GPU 卡和必要的基础设施
  • 维护基础设施以确保不间断服务
  • 为多个用户开发资源分配方案

然而,GCP 提供了这种服务,只收取很少的费用(当然从长远来看会增加)。但重要的是,您不必担心维护或初始设置(例如安装操作系统(OS)),并提供多种定制选项供您选择(例如操作系统、磁盘存储、GPU 类型、GPU 数量等)。).例如,你可以选择一个使用 Ubuntu 16.04、50GB 存储、2 特斯拉 P100 图形处理器等的实例。

在这篇文章中,我将讨论如何设置一个自定义的 docker 映像,创建一个包含该映像的容器,并在其中运行 python + Tensorflow 脚本。

初始设置

我不打算进行设置,有很多很好的资源解释了如何在 GCP 上创建和设置一个计算实例。我最喜欢的一个是,

[## jupyter+tensor flow+Nvidia GPU+Docker+Google 计算引擎

TL;DR:按照下面的方法使用 Tensorflow、Jupyter、Docker 和 Nvidia GPUs,可以节省时间,减少麻烦…

medium.com](medium.com/google-clou…)

我会用简单的英语总结一下里面的内容,

  • 首先定义防火墙规则,允许 TCP 通过几个端口进行通信(tensorboard:6006,ftp:21-22,jupyter:8888)
  • 使用防火墙规则在 GCP 上设置一个计算实例
  • 在实例上安装 CUDA
  • 在实例上安装 Docker 和 Nvidia-Docker

那么初始设置之后会发生什么呢?

在这里我们要讨论从这里向何处去。首先让我说明我将使用的库和版本。

  • Python: 3.4
  • 张量流:1.3

我现在简要总结一下我们要做的事情。我们将首先下载一个支持 python 3.x Tensorflow 的图片。然后我们将用下载的图像创建一个容器。最后,我们将运行一些命令,以确保它的工作。

PS: 你想用哪个 python 版本取决于你想解决的问题。python 3.x 和 python 2.x 之间存在差异,然而,python 2.x 将在不久的将来退役,python 3.x 将取而代之。所以最好从 python 2.x 迁移到 python 3.x

SSH 到实例中

要 ssh 到 GCP 实例,您可以使用

下载兼容的 Docker 映像

遗憾的是,gcr.io 并没有为我们提供一张 python 3.x 兼容的 Tensorflow 图片,而只是 python 2.x 兼容的 Tensorflow 图片。所以我们必须从 DockerHub 下载一个兼容 python 3.x 的 Tensorflow 图像。并且可以在 DockerHub 中看到所有的 Tensorflow 图片。

我将使用 1.3.0-gpu-py3 图像(如果您向下滚动 DockerHub 中的 Tensorflow 图像,您会看到这一点)

使用 gcloud shell 或终端将第一个 ssh 下载到您的实例中。一旦有了访问类型,

sudo docker pull tensorflow/tensorflow:1.3.0-gpu-py3

当您键入这个内容时,Docker 将自动查找带有在双冒号后指定的标记名的图像(当然是在 DockerHub 中)。然后,您应该在 shell 中看到正在下载和提取的图像。要确保图像已下载,请尝试

sudo docker images

您应该会看到列出的图像

REPOSITORY            TAG             IMAGE ID       CREATED   SIZE
nvidia/cuda           latest          af786b192aa5   10 days ago   2.16GB
tensorflow/tensorflow 1.3.0-gpu-py3   ae2207c21bc1   5 months ago 3.29GB

用图像创建并运行 Docker 容器

这个操作完成后,我们可以用图像创建一个 docker 容器。但在此之前,先创建一个名为docker _ tensor flow _ example的文件夹。这将保存我们在容器内运行时创建的数据,稍后我们将讨论如何进行映射。然后将该文件夹的权限更改为:

​ sudo chmod 755 ~/docker_tensorflow_example/

所以主人有完全的权限。然后我们创建 docker 容器,

nvidia-docker run -it -v ~/docker_tensorflow_example/:/root/docker_tensorflow_example — name docker-py3-tensorflow tensorflow/tensorflow:1.3.0-gpu-py3 bash
​

那是一口不是吗?那我们就把这个宝贝拆成碎片吧,

  • NVIDIA-docker——是一个在 NVIDIA GPU 上运行 Docker 容器的 Docker 引擎实用程序。docker 顶部的包装
  • —意思是运行 docker 容器
  • -it-表示即使没有连接任何东西,也要保持容器打开(这样我们就可以运行东西,脱离遥控器,在我们这边,关闭本地计算机。
  • -v src_dir:target_dir —将本地目录映射到容器中的一个目录。请记住,当您停止容器时,容器以及其中保存的所有数据都会消失。因此,该选项将在容器文件夹(target_dir)中创建的所有数据映射到存储上的实际目录(source_dir)。
  • -name docker-py3-tensor flow-这是我们正在创建的容器的名称。使用一个特定的名字也将阻止我们盲目地创建容器(因为如果你不指定一个名字,docker 会用一个随机的名字创建容器。如果你指定了一个名字,docker 将会抱怨同名的容器已经存在)
  • tensor flow/tensor flow:1 . 3 . 0-GPU-py3—告诉 docker 使用哪个图像来创建容器。

关于 nvidia-docker 要记住的事情

如果您看到错误,

**nvidia-docker: command not found**

那么您可能必须首先以 root 用户身份登录,

**sudo -s**

并重试该命令。

正在启动 Jupyter 笔记本服务器

如果您需要运行 Jupyter 笔记本服务器,请使用上面的命令,不要使用 bash。

**nvidia-docker run -it -v ~/docker_tensorflow_example/:/root/docker_tensorflow_example — name docker-py3-tensorflow tensorflow/tensorflow:1.3.0-gpu-py3
​**

测试容器

现在,您应该已经运行了 docker 容器,并且您的 shell 应该在容器中,终端应该有提示,

**root@8301xxxxxxxx: ~/**

其中 8301xxxxxxxx 是容器 ID。现在试试,

**python3**

试着,

**import tensorflow as tf
print(tf.__version__)**

这应该可以正常工作,您应该得到 1.3.0 作为输出。如果出现这种情况,恭喜你!您已经安装了库。如果没有,请确保您遵循了当前初始设置和设置 docker 容器的步骤。

干杯!

什么是 auto ML?

原文:towardsdatascience.com/whats-auto-…

The purpose of computing is insight, not numbers — Richard Hamming (photo by CoWin)

我最近告诉一个朋友,我正在研究自动机器学习(ML)项目,他问我这是否意味着汽车的机器学习,所以…我想我应该写一篇简短的帖子。

Auto ML 服务通过点击一个按钮来提供机器学习,或者,至少,承诺保持算法实现、数据管道和代码,通常是隐藏的。如果你向一群工程师提及这一前景,有些人会说“万岁!”有些人会说“哦不!”,我想直到最近,我发现自己在这些感叹(“orayoh!”).

我第一次玩自动 ML 平台是在去年 IBM 的一次演示中。我来自 iTerm、Python 和 vim,我发现从代码中如此脱离很奇怪。但我可以看到,已经在 R&D 接受审查的流程可以通过 auto ML 得到简化。并不是每个团队都致力于前沿算法的设计,因此对已经验证的模型进行微小调整的过程肯定有优化的空间。

我可以看到 auto ML 如何在不断增长的 ML/AI 产品的生命周期中定位自己,但这样的平台真的能成为“数据科学家的最好朋友”吗?我想要一些其他的数据点,所以我联系了我的朋友 Pierre Forcioli-Conti,他正忙着做他的创业公司工作台,我们一起坐在他位于市场街的办公室里,一边聊着工作流,一边在他的环境中摆弄样本数据。他的愿景更多的是为团队提供一个协作的公共工作空间(就像 Google Docs 的数据项目),我记得我对数据解析和清理功能特别兴奋。但是,不管出于什么原因,我回到了我的工具,没有明确的计划将 auto ML 集成到我正在构建的任何东西中(尽管我确实偷偷溜出去玩了一下 auto-sklearnTPOT ,只是为了看看他们在做什么)。

快进到本周,我看到了一个关于 H2O 的帖子,作者是我信任的数据科学专家艾琳·莱德尔。我跟着她链接到了产品,查看文档,我发现了对不同语言和云集成的大量支持,这令人鼓舞。

安装没有痛苦,界面也很容易接近,位于数据分析包(如 Pandas)和建模工具(如 scikit-learnTensorflowKeras )的交汇处,有着 Jupyter 般的级联细胞流。无论是使用本地主机接口(将处理步骤放在一个称为“流”的文档中)还是将软件直接导入 Python shell,都比我在 AWSIBM 的 Watson Studio 上使用 ML 工具时感觉更直观和熟悉。

我确实发现自己在脑子里运行着一个时钟,记录着“这通常要花我多长时间?”。我想人们可以很快学会 H20 的特性,然后从有利的角度来衡量这个工具最适合自己的工具包。我个人对神经网络的超参数优化很感兴趣,特别是对于更大的深度学习项目,我发现自己在想象这种探索可能会如何进行。我会遇到什么样的错误?我能找到什么样的支持?如果 H2O 真的可以一站式购买数据管理、EDA、建模和 GPU 处理,那么我完全可以看到 H2O 在我的桌面上更加靠前和居中。

我担心团队会使用 auto ML 来搜寻能够交付“结果”的模型。机器学习是一门艺术,也是一门统计建模学科,虽然我对我们所做的事情的创造性探索方面深信不疑,但随着我们的管道变得更加抽象,我们应该在自动 ML 流程中加入什么样的路标和健全检查,以确保我们继续提出强有力的问题?也许 Clippy 有一个有模型头脑的表亲,他可能会定期出现并问类似这样的问题,“这个数据表示符合你的直觉吗?”或者“我们有夸大错误的风险吗?”,或者“您如何解释这些绩效结果?”。仅仅访问代码并不能回答这样的问题,也许抽象会释放出更多的能力来问这样的问题,但我担心的是,随着时间的推移,这样的问题可能会开始产生诸如“我不知道,那是我被告知要按的按钮”这样的回答。这不仅是对 H2O 的警告,也是对所有汽车制造企业的警告,是对我们所有负责确保有效使用数学工具的人的警告。

我看到 H2O 在云集成方面走在了前面,这标志着一定规模(或有扩展计划)的客户优先,他们肯定已经做好准备,不需要任何特定的堆栈(向 Java、Python 和 R 社区等提供服务)。总而言之,我对 auto ML 感到更多的是“万岁”而不是“哦不”,并期待看到团队如何在他们的产品周期中使用这些工具。

上个月世界发生了什么:世界新闻分析

原文:towardsdatascience.com/whats-happe…

第二部在这里!上个月世界发生了什么:世界新闻分析第二部分

分析数据总是有趣的,即使你不像我之前的帖子那样创建数据——Youtube 频道分析:识别影响者和憎恨者。但是,如果我们可以从完全不同的来源、地区、国家和大陆收集最受欢迎的新闻,会怎么样呢?如果我们每天都这样做,比如说一个月或一年,会怎么样?我们会看到什么?这是一个挑战!带着这个想法,我开始准备自己的数据集。我会继续更新那个页面,但即使是现在我们也可能会看到一些见解!主要目的是通过全球新闻更好地了解我们的世界。

我于 2018 年 10 月 23 日开始网络搜集。每天我都会收到大约 3000 篇新文章,涉及全球范围内的各种话题。因此,在开始时,我们将创建一个地图来显示我们数据集中的全球新闻报道的大图。

data(worldgeojson, package = "highcharter")test %>% 
  count(name) -> countrieshighchart() %>%
  hc_add_series_map(worldgeojson, countries, value = "n", joinBy = c('name'))  %>% 
  #hc_colors(c("darkorange", "darkgray")) %>% 
  hc_colorAxis(stops = color_stops()) %>% 
  hc_title(text = "Where the most news come from?") %>% 
  hc_subtitle(text = "Count on every country")%>%
hc_legend(layout = "horizontal", align = "center",
floating = TRUE, valueDecimals = 0,
valueSuffix = "%") %>%
hc_mapNavigation(enabled = TRUE)

我们试图与每一个大洲取得联系,我认为除了一些第三世界国家之外,这些数据都很有代表性。真正的瓶颈是处理多语言数据。尤其是用一种罕见的语言。文本分析工具有一些限制,这些工具从一些可视化中排除了一些(中文、俄文、土耳其文、挪威语)。这个问题应该进一步解决。现在,让我们看看新闻在各个国家的分布。

test %>%
  count(name) %>%
  arrange(desc(n)) %>%
  mutate(name = fct_reorder(name, n)) %>%
  ggplot(aes(name, n, fill = name)) +
  geom_col() +
  coord_flip() +
  expand_limits(y = 0) +
  theme(legend.position = "none")+
  labs(title="Where the most news come from?", 
       subtitle = "Breakdown by Country", 
       x = "",
       y = ""
  )

英国在我们的数据集中处于领先地位,紧随其后的是美国和意大利(这是一个惊喜)。接下来我们将尝试描述一些流行和重要的话题。

test %>%
  filter(
    str_detect(text, " war |warships|wars"))%>%
  filter(name!="Austria")%>%
  filter(name!="Germany")%>%
  ggplot(aes(Date, fill= name))+
  geom_histogram()+
  labs(title="News frequency with a 'war' word", 
       subtitle = "Breakdown by Country/Date", 
       x = "",
       y = ""
  )

我们看到,有些日子风平浪静,有些日子却用一个“战”字创造了不同的故事。但是我们应该记住,“战争”有不同的含义。仔细看看它:

war <- test %>%
  filter(
    str_detect(text, " war |warships|wars")) %>%
  filter(name!="Austria") %>%
  filter(name!="Germany") %>%
  group_by(name) %>%
  View()

**那么哪个国家谈论“战争”最多呢?**按所有国家和语言细分:

war <- test %>%
  filter(str_detect(text, " war |warships|wars|войн| guerra | la guerre |战争")) %>%
  filter(name != "Austria") %>%
  filter(name != "Germany") %>%
  group_by(name) %>%
  count(name)
View()#'war' for a German language means different thing so we process it separately
Austria <- test %>%
  filter((name == "Austria"))
Austria <- Austria %>%
  filter(str_detect(text, " Krieg | Krieges")) %>%
  count(name)Germany <- test %>%
  filter((name == "Germany"))
Germany <- Germany %>%
  filter(str_detect(text, " Krieg | Krieges")) %>%
  count(name)war_full <- rbind.data.frame(war, Austria, Germany)
war_full <- as.data.frame(war_full)#breakdown by country
war_full %>%
  mutate(name = fct_reorder(name, n)) %>%
  ggplot(aes(name, n, fill = name)) +
  geom_col() +
  theme(legend.position = "none") +
  labs(
    title = "News frequency with a 'war' word",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )

哪个国家谈论**“贸易战”最多?**

test %>%
  filter(
    str_detect(
      text,
      " trade war | trade wars | торговая война | guerre commerciale | guerra comercial | Handelskrieg |贸易战"
    )
  ) %>%
  count(name) %>%
  arrange(desc(n)) %>%
  mutate(name = fct_reorder(name, n)) %>%
  ggplot(aes(name, n, fill = name)) +
  geom_col() +
  coord_flip() +
  expand_limits(y = 0) +
  theme(legend.position = "none") +
  labs(
    title = "News frequency with a 'trade war' word",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )

但是我们有带字的“平安”新闻吗?在我们的世界找到和平是真的吗?****

**test %>%
  filter(str_detect(text, "peace | frieden | pace | paz |和平")) %>%
  count(name) %>%
  mutate(name = fct_reorder(name, n)) %>%
  ggplot(aes(name, n, fill = name)) +
  geom_col() +
  theme(legend.position = "none") +
  labs(
    title = "News frequency with a 'peace' word",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )**

【假】【真】新闻呢?新闻机构使用这个词吗,或者它是一个时代错误?

**fake <- test %>%
  filter(str_detect(text, " fake | falso | faux | falschung|假")) %>%
  count(name)
fake$id <- "fake"true <- test %>%
  filter(str_detect(text, " true | wahr | vrai | vero | cierto|真正")) %>%
  count(name)
true$id <- "true"faketrue <- rbind(fake, true)faketrue %>%
  mutate(name = fct_reorder(name, n)) %>%
  ggplot() +
  geom_bar(aes(name, n, fill = id), stat = "identity", position = "dodge") +
  coord_flip() +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(),
    axis.title = element_blank()
  ) +
  labs(
    title = "Frequency of 'fake' and 'true' words in news",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )**

“假”新闻在爱尔兰和中国很受欢迎,而新西兰和加拿大、英国的新闻中“真”字出现频率最高。让我们看看哪个国家有最“震撼”的新闻:

**test %>%
  filter(str_detect(text, " shock | choque | choc | schock|休克|震动|浓密的")) %>%
  count(name) %>%
  mutate(name = fct_reorder(name, n)) %>%
  ggplot(aes(name, n, fill = name)) +
  geom_col() +
  theme(legend.position = "none", axis.title = element_blank()) +
  labs(
    title = "Which countries have the most 'shocking' news",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )**

仔细看看:

That’s a news that shocked our world. From presidential selections to Doctor Who fans. Which countries have the most “bad” and “good” words in their news?

**bad <- test %>%
  filter(str_detect(text, " bad |坏")) %>%
  count(name)
bad$id <- "bad"good <- test %>%
  filter(str_detect(text, " good |好")) %>%
  filter(name != "Austria") %>%
  filter(name != "Germany") %>%
  count(name)
good$id <- "good"badgood <- rbind(bad, good)badgood %>%
  mutate(name = fct_reorder(name, n)) %>%
  ggplot() +
  geom_bar(aes(name, n, fill = id), stat = "identity", position = "dodge") +
  coord_flip() +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(),
    axis.title = element_blank()
  ) +
  labs(
    title = "Which countries have the most 'bad' and 'good' news?",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )**

Well, as we clearly see “good” news are prevail. But is it really true? We will check it later with a sentiment analysis of the whole dataset.

Coming next, we’ll plot a chart with a “death” word frequency through different countries.

**test %>%
  filter(str_detect(text, " death | Tod | muerte | mort| смерть|死亡")) %>%
  count(name) %>%
  arrange(desc(n)) %>%
  mutate(name = fct_reorder(name, n)) %>%
  ggplot(aes(name, n, fill = name)) +
  geom_col() +
  coord_flip() +
  expand_limits(y = 0) +
  theme(legend.position = "none") +
  labs(
    title = "News frequency with a 'death' word",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )**

Italy has the leading position with a biggest numbers. We should take a closer look on it applying topic modelling technique(LDA algorithm).

Checking our topics with Google Translator we’d get some understanding about what’s going on.

Hope that somebody still reading this:) so let’s take a look on a domestic news that always cover government personas at some point. I think that will be interesting to see some type of popularity between a couple of government leaders through a whole world. For example, we may choose:

**Trump <- test %>%
  filter(str_detect(text, "Trump|特朗普| Трамп ")) %>%
  count(name)
Trump$id <- "Trump"Putin <- test %>%
  filter(str_detect(text, "Putin |普京| Путин ")) %>%
  count(name)
Putin$id <- "Putin"Merkel <- test %>%
  filter(str_detect(text, "Merkel |默克爾| Меркель ")) %>%
  count(name)
Merkel$id <- "Merkel"Jinping <- test %>%
  filter(str_detect(text, " Xi Jinping |习近平| Си Цзиньпин")) %>%
  count(name)
Jinping$id <- "Xi Jinping"popularity <- rbind(Trump, Putin, Merkel, Jinping)pop <- popularity %>%
  count(id) %>%
  arrange(desc(nn)) %>%
  View()popularity %>%
  mutate(name=fct_reorder(name,n))%>%
  ggplot() +
  geom_bar(aes(name, n, fill = id), stat = "identity", position = "dodge") +
  coord_flip() +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(),
    axis.title = element_blank()
  ) +
  labs(
    title = "Citations on selected national leaders in a news",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )**

********

President Trump has a leading position covering 24 country at all, but this is obvious for anybody who check news sites quite often. Chancellor of Germany — Angela Merkel takes second place following by President of the People’s Republic of China Xi Jinping and president Putin. Surpsingly there are some countries that covers only US president and nobody else from our selection. China and the United States have biggest numbers covering their national leaders, while Germany and Russia have more coverage on a foreign presidents. Maybe country citations shows some difference?

**US <- test %>%
  filter(str_detect(text, " United States | US | USA | Stati Uniti | Etats-Unis| США | 美国")) %>%
  count(name)
US$id <- "United States"Germany <- test %>%
  filter(str_detect(
    text,
    " Germany | Deutschland | Alemania | Germania | Allemagne | Германия |德国"
  )) %>%
  count(name)
Germany$id <- "Germany"China <- test %>%
  filter(str_detect(text, " China | Chine | Cina |Китай| 中国")) %>%
  count(name)
China$id <- "China"Russia <- test %>%
  filter(str_detect(text, " Russia | Russland| Rusia | Russie |Россия|俄罗斯")) %>%
  count(name)
Russia$id <- "Russia"popularity <- rbind(US, Germany, China, Russia)pop <- popularity %>%
  count(id) %>%
  arrange(desc(nn)) %>%
  View()popularity %>%
  mutate(name=fct_reorder(name,n))%>%
  ggplot() +
  geom_bar(aes(name, n, fill = id), stat = "identity", position = "dodge") +
  coord_flip() +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(),
    axis.title = element_blank()
  ) +
  labs(
    title = "Citations on selected countries in a news",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )**

********

So this is how the balance of power looks like (in a global news coverage of course). The United States, China and Russia have something similar coverage level around the globe! China has the most coverage in Pakistan, Singapore (geographical role explain it well). According to our findings Italy has the lowest interest in United States and Russia have the most highest number of citations on the United States.

What if we apply same approach to find some brand awarness? We’ll select Apple and Samsung as an example of core players on a market.

**Apple <- test %>%
  filter(str_detect(text, " Apple ")) %>%
  count(name)
Apple$id <- "Apple"Samsung <- test %>%
  filter(str_detect(text, " Samsung ")) %>%
  count(name)
Samsung$id <- "Samsung"popularity <- rbind(Samsung, Apple)popularity %>%
  mutate(name=fct_reorder(name,n)) %>%
  ggplot() +
  geom_bar(aes(name, n, fill = id), stat = "identity", position = "dodge") +
  coord_flip() +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(),
    axis.title = element_blank()
  ) +
  labs(
    title = "Citations on selected brand in a news",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )pop <- popularity %>%
  count(id) %>%
  arrange(desc(nn)) %>%
  View()**

Both brands have the same coverage by country in our dataset. But what about chart?

Pakistan and Turkey have covered Samsung more than Apple, while other countries prefer to look on a Apple’s products more.

What if we would like to see the top 5 most common words that appears in news in a every country? I think that this plot will show some value.

**#I already preprocess dataset and exclude languages that are not supported in tm packagetop10full %>%
  group_by(name)%>%
  filter(name!="Russia")%>%
  filter(name!="Norway")%>%
  filter(name!="China")%>%
  filter(name!="Turkey")%>%
  ggplot(aes(word,freq, fill= name))+
  geom_col() +
  facet_wrap(~name, scales = 'free_x')+
  theme(legend.position = "none")+
  labs(title="The most top 5 words used in a every news article ", 
       subtitle = "breakdown by country", 
       x = "",
       y= ""
  )**

From that plot, we could say that there is two types of countries. One of them covers their’s government activity the most due to a strong presence on a international or domestic area. The second type is more into different subjects of life or just their government didn’t provide such information to the public.

I think that time to apply sentiment analysis on our dataset. First, we’ll look on a timeseries with a different methods :

默认的“Syuzhet”词典是由内布拉斯加文学实验室在马修·l·乔克斯的指导下开发的

“afinn”词典是由 Finn Arup Nielsen 作为 AFINN 单词数据库开发的。参见:参见www2.imm.dtu.dk/pubdb/views…AFINN 单词数据库受版权保护,并根据“开放数据库许可(ODbL)1.0 版”【www.opendatacommons.org/licenses/od… 或类似的版权许可发布。

“冰”词汇是由胡敏清和刘冰开发的意见词汇见:【www.cs.uic.edu/~liub/FBS/s…

“nrc”词典是由 Mohammad,Saif M .和 Turney,Peter D .开发的 NRC 情感词典。 参见:saifmohammad.com/WebPages/le…

**melted %>%
  group_by(variable) %>%
  ggplot(aes(
    timestamp,
    value,
    color = variable,
    label = variable,
    size = value
  )) +
  geom_point() +
  labs(title = "Scores by different sentiment lexicons",
       x = "",
       y = "") +
  geom_smooth(aes(group = 1))**

结果每天都在变化,但中位数低于零,所以我们可以假设我们的全球新闻不是那么积极。但是让我们来看看情绪的分解。

**emo_sum %>%
  ggplot(aes(emotion,count, fill=emotion)) +
  geom_col() +
  theme(legend.position = "none",axis.title = element_blank()) +
  labs(title="Recent sentiments on a global news dataset", 
       x = "",
       y = ""
  )**

我想做的下一件事是另一个主题建模。为此,我们将使用茱莉亚西尔格的精彩教程,她描述了每一步。我们将绘制模型诊断和结果:

**#plot result after preprocessing data and modelling (Assumption of 100 models max)k_result %>%
  transmute(K,
            `Lower bound` = lbound,
            Residuals = map_dbl(residual, "dispersion"),
            `Semantic coherence` = map_dbl(semantic_coherence, mean),
            `Held-out likelihood` = map_dbl(eval_heldout, "expected.heldout")) %>%
  gather(Metric, Value, -K) %>%
  ggplot(aes(K, Value, color = Metric)) +
  geom_line(size = 1.5, alpha = 0.7, show.legend = FALSE) +
  facet_wrap(~Metric, scales = "free_y") +
  labs(x = "K (number of topics)",
       y = NULL,
       title = "Model diagnostics by number of topics",
       subtitle = "These diagnostics indicate that a good number of topics would be around 80")**

正如我们在上面看到的,保留的最大似然值和最小残差值大约是 80 个主题。结果是:

**gamma_terms %>%
  top_n(20, gamma) %>%
  ggplot(aes(topic, gamma, label = terms, fill = topic)) +
  geom_col(show.legend = FALSE) +
  geom_text(hjust = 0, nudge_y = 0.0005, size = 3,
            family = "IBMPlexSans") +
  coord_flip() +
  scale_y_continuous(expand = c(0,0),
                     limits = c(0, 0.09),
                     labels = percent_format()) +
  theme_tufte(base_family = "IBMPlexSans", ticks = FALSE) +
  theme(plot.title = element_text(size = 16,
                                  family="IBMPlexSans-Bold"),
        plot.subtitle = element_text(size = 13)) +
  labs(x = NULL, y = expression(gamma),
       title = "Top 20 topics by prevalence in the our dataset",
       subtitle = "With the top words that contribute to each topic")**

我想展示的最后一件事是单词云。就像结尾的一个大点:)一张图中的简单和复杂。这条新闻是关于什么的?

**wordcloud(data, colors = viridis::viridis_pal(end = 0.8)(10), random.order = FALSE, random.color = TRUE, min.words=10,max.words=Inf,rot.per = 0.3)**

这种类型的数据集有很大的潜力去发现你想知道的任何事情。我们所做的只是分析的一小部分,我认为这是获得一些见解的真正有用的工具。随着不断更新,我们可以随时掌握各种主题及其存在的脉搏。我们可能会识别一些品牌意识、人类行为、外交事务和我们世界中每天发生的许多其他事情。

上个月世界发生了什么:世界新闻分析第二部分

原文:towardsdatascience.com/whats-happe…

你好!那些没有看到我的第一部分的人,我强烈推荐他们去做一个基本的了解。

第一部分——上个月世界发生了什么:世界新闻分析

所以,我们仍然在收集最新的新闻,现在我们有来自 24 个国家的 53.115 条新闻摘要。我们可以看到大部分是在星期三:

在我们分析的第一部分,我们应用了单词检测功能和可视化来快速获得这样的结果(我在之前的帖子中没有画出这个图,但我认为值得在这里看一看):

我们可能会看到一些国家(意大利和俄罗斯)严重依赖体育新闻,对科学、健康和艺术话题关注不够。但是有一些国家,如英国、新加坡、澳大利亚和马来西亚,拥有最多的科学报道。真正让我吃惊的是:德国和奥地利比其他国家拥有更多的关于健康的新闻。

比较体育和科学话题,我们可以画出这两者之间的总差异。

Science <- test %>%
  filter(
    str_detect(
      text,
      "science|research|scientific|scientist|科学|wissenschaft|Gelehrte|wissenschaftlich| наука | ученые "
    )
  ) %>%
  count(Date)
Science$id <- "science"Sport <- test %>%
  filter(str_detect(text, "sport|спорт|运动|deporte")) %>%
  count(Date)
Sport$id <- "sport" popularity <- merge(x = Science,
                    y = Sport,
                    by = "Date",
                    all.x = TRUE)

colnames(popularity)[which(names(popularity) == "n.x")] <- "science"
colnames(popularity)[which(names(popularity) == "n.y")] <- "sport"

popularity[is.na(popularity)] <- 0

drops <- c("id.x", "id.y")
popularity <- popularity[,!(names(popularity) %in% drops)]ggplot(popularity, aes(x = Date)) +
  geom_area(aes(y = science + sport, fill = "science")) +
  geom_area(aes(y = sport, fill = "sport")) +
  labs(
    title = "Area chart on selected topics",
    subtitle = "Total news",
    caption = "",
    x = "",
    y = ""
  )

看起来体育新闻有时会登上榜首。我们将使用一些定量文本分析工具来找出为什么会发生这种情况。我们从搭配分析开始。为此,我们将使用 quanteda R 包进行定量文本分析。它帮助我们识别在我们的数据集中频繁出现的多词表达。经过一些基本操作,如构建语料库、按日期排列变量和创建令牌,我们得到了这个:

这就是我们之前关于体育新闻问题的答案。我们清楚地看到在我们的数据中出现的主要表达:从游戏和产品到重要的名字、行动和英超联赛。以下是完整的代码:

news_corp <- test
news_corp$text <- as.character(news_corp$text)
news_corp <- corpus(news_corp)
ndoc(news_corp)range(docvars(news_corp, 'Date'))news_toks <- tokens(news_corp) %>%
  tokens_remove(stopwords('english'), padding = TRUE) %>%
  tokens_remove('[\\p{P}\\p{S}]', valuetype = 'regex', padding = TRUE)cap_toks <-
  tokens_select(
    news_toks,
    '^[A-Z]',
    valuetype = 'regex',
    case_insensitive = FALSE,
    padding = TRUE
  )
head(cap_toks[[1]], 50)cap_col <-
  textstat_collocations(cap_toks, min_count = 10, tolower = FALSE)
head(cap_col, 20) %>%
  View()cap_col %>%
  arrange(desc(count)) %>%
  head(30) %>%
  ggplot(aes(collocation, count, color = collocation, size = count)) +
  geom_point() +
  coord_flip() +
  expand_limits(y = 0) +
  theme(legend.position = "none") +
  labs(
    title = "Most frequent multi-word expressions",
    subtitle = "",
    x = "",
    y = ""
  )

为了改进我们的结果,我们应该只选择强关联的多词表达式。

正如我们所见,Rockstar Games 的新游戏“红色死亡救赎”在我们的数据集中为每个国家都赢得了不错的分数。但是如果我们不知道这到底是一个游戏还是别的什么呢?有针对性的词语搭配帮助我们发现:

rdr <- c('Red Dead Redemption')
rdr_dfm <-
  tokens_keep(news_toks, phrase(rdr), window = 10) %>% dfm()
not_rdr_dfm <-
  tokens_remove(news_toks, phrase(rdr), window = 10) %>% dfm()
rdr_key <-
  textstat_keyness(rbind(rdr_dfm, not_rdr_dfm), seq_len(ndoc(rdr_dfm)))rdr_key <- rdr_key[rdr_key$n_target > 10, ]
head(rdr_key, 50)rdr_key %>%
  mutate(feature = fct_reorder(feature, chi2)) %>%
  head(30) %>%
  ggplot(aes(feature, chi2, fill = feature)) +
  geom_col() +
  coord_flip() +
  expand_limits(y = 0) +
  theme(legend.position = "none") +
  labs(
    title = "Targeted frequency analysis on 'Red Dead Redemption'",
    subtitle = "",
    x = "",
    y = ""
  )

应用主题建模算法,我们将得到 100 个主题(见我之前的帖子):

gamma_terms %>%
  top_n(20, gamma) %>%
  ggplot(aes(topic, gamma, label = terms, fill = topic)) +
  geom_col(show.legend = FALSE) +
  geom_text(
    hjust = 0,
    nudge_y = 0.0005,
    size = 3
  ) +
  coord_flip() +
  scale_y_continuous(expand = c(0, 0),
                     limits = c(0, 0.09),
                     labels = percent_format()) +
  labs(
    x = NULL,
    y = expression(gamma),
    title = "Top 20 topics by prevalence in the our dataset",
    subtitle = "With the top words that contribute to each topic"
  )

在顶部,我们有与总统和政府、体育和一些研究相关的新闻。太好了!接下来,我们将应用相对频率分析。在我的上一篇文章中,我们做了一个“新闻中精选品牌的引用”图表。现在我们比较他们两个的得分。

textstat_keyness 函数计算“keyness”,这是不同类别中不同出现的特征的得分。这里,通过参考 dfm 中的“目标”文档索引来定义类别,参考组由所有其他文档组成。

参考文献 邦迪、玛丽娜和迈克·斯科特合编。2010.文本中的基调。阿姆斯特丹,费城:约翰·本杰明,2010 年。

斯塔布斯,迈克尔。2010.“关键词的三个概念”。文本中的基调,玛丽娜邦迪和迈克·斯科特编辑。pp21 42。阿姆斯特丹,费城:约翰·本杰明。

斯科特,m .和特里布尔,2006 年。语言教育中的关键词和语料库分析。阿姆斯特丹:本雅明,第 55 页。

邓宁泰德。1993.“统计意外和巧合的精确方法”,《计算语言学》,第 19 卷,第 1 期,第 61-74 页。

让我们看看作为目标值的“Apple”和预期的“Samsung”之间的相对频率。谁知道也许我们会看到一些关系?结果,我们得到了这个具有卡方值的图(如果目标中的观察值超过其预期值,则符号为正)

Apple <- test %>%
  filter(str_detect(text, " Apple "))
Apple$id <- "Apple"Samsung <- test %>%
  filter(str_detect(text, " Samsung "))
Samsung$id <- "Samsung"popularity <- rbind(Samsung, Apple)
popularity$text <- as.character(popularity$text)my_corpus <- corpus(popularity)# Create a dfm 
pres_dfm <-
  dfm(
    my_corpus,
    groups = "id",
    remove = stopwords("english"),
    remove_punct = TRUE
  )# Calculate keyness 
result_keyness <- textstat_keyness(pres_dfm, target = "Apple")

我们看到目标变量和预期之间的巨大差异:比如三星的可折叠智能手机和苹果的新 macbook。接下来,我们将构建一个 wordfish。Wordfish 是一种缩放技术,它不需要任何锚定文档来执行分析。相反,它依赖于字数的统计模型。这是它寻找“机器人”的方式。

test <- test %>%
  filter(str_detect(text, "Android")) 
test$text<-as.character(test$text)
my_corpus <- corpus(test)wf <- textmodel_wordfish(dfm(my_corpus), dir = c(6,5))# Plot estimated word positions
textplot_scale1d(wf, margin = "features", 
                 highlighted = c("foldable", "android", 
                                 "performance", "samsung"), 
                 highlighted_color = "red")

我最不想尝试的是新闻地图功能。它基于对数据中关联最强的国家的预测。我们已经看了新闻中对选定国家的引用,比如这个图:

US <- test %>%
  filter(str_detect(text, " United States | US | USA | Stati Uniti | Etats-Unis| США | 美国")) %>%
  count(name, Date)
US$id <- "United States"Germany <- test %>%
  filter(str_detect(
    text,
    " Germany | Deutschland | Alemania | Germania | Allemagne | Германия |德国"
  )) %>%
  count(name, Date)
Germany$id <- "Germany"China <- test %>%
  filter(str_detect(text, " China | Chine | Cina |Китай| 中国")) %>%
  count(name, Date)
China$id <- "China"Russia <- test %>%
  filter(str_detect(text, " Russia | Russland| Rusia | Russie |Россия|俄罗斯")) %>%
  count(name, Date)
Russia$id <- "Russia"popularity <- rbind(US, Germany, China, Russia)popularity %>%
  group_by(id) %>%
  ggplot(aes(Date, n, color = id)) +
  geom_line(size = 0.9) +
  facet_wrap( ~ name, scales = 'free_y') +
  labs(
    title = "Citations on selected countries in a news",
    subtitle = "Breakdown by Country",
    x = "",
    y = ""
  )

但现在我们将尝试预测国家引用并在地图上绘制出来。

Newsmap 是用于地理文档分类的半监督模型。虽然(完全)监督模型是在人工分类的数据上训练的,但这种半监督模型是从字典中的“种子词”学习的。

test$text <- as.character(test$text)
test<- corpus(test)ndoc(test)range(docvars(test, 'Date'))month <- c(
  'January',
  'February',
  'March',
  'April',
  'May',
  'June',
  'July',
  'August',
  'September',
  'October',
  'November',
  'December'
)
day <-
  c('Sunday',
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday')
agency <- c('AP', 'AFP', 'Reuters', 'CNN', 'BBC')toks <- tokens(test)
toks <-
  tokens_remove(toks,
                stopwords('english'),
                valuetype = 'fixed',
                padding = TRUE)
toks <-
  tokens_remove(toks,
                c(month, day, agency),
                valuetype = 'fixed',
                padding = TRUE)label_toks <-
  tokens_lookup(toks, data_dictionary_newsmap_en, levels = 3) # level 3 is countries
label_dfm <- dfm(label_toks, tolower = FALSE)feat_dfm <- dfm(toks, tolower = FALSE)
feat_dfm <-
  dfm_select(feat_dfm,
             "^[A-Z][A-Za-z1-2]+",
             valuetype = 'regex',
             case_insensitive = FALSE)
feat_dfm <- dfm_trim(feat_dfm, min_termfreq = 10)model <- textmodel_newsmap(feat_dfm, label_dfm)coefficients <-
  coef(model, n = 10)[c("US", "GB", "FR", "BR", "JP", "RU")]
coefficients <- as.tibble(coefficients)pred <- predict(model)
head(pred, 20)count <-
  sort(table(factor(pred, levels = colnames(label_dfm))), decreasing = TRUE)
head(count, 20)data_country <- as.data.frame(count, stringsAsFactors = FALSE)
colnames(data_country) <- c("id", "frequency")
data_country <- data_country %>%
  filter(id != "ET")world_map <- map_data(map = "world")
world_map$region <-
  iso.alpha(world_map$region) # convert contry name to ISO codeggplot(data_country, aes(map_id = id)) +
  geom_map(aes(fill = frequency), map = world_map) +
  expand_limits(x = world_map$long, y = world_map$lat) +
  scale_fill_continuous(name = "Frequency") +
  theme_void() +
  coord_fixed()

在我们用与国家/地区相关联的附加摘录构建模型之后,我们可以检查它们:

一切都很好,但有些特征很奇怪。俄罗斯的“圣雅克”?让我们看看新闻来源:

加拿大宇航员大卫·圣·雅克说,他对俄罗斯联盟号火箭助推器比以往任何时候都更有信心

好吧,这是可以接受的,现在我们可以做一个预测,并创建一个地图:

它看起来非常类似于以前的地图,但有一些例外。我们之前的地图是基于每个国家的新闻总数,而这张地图是基于对新闻中国家引用的预测。较亮的颜色显示一个国家的最大引用排名,我们对美国的排名很突出,对欧洲、中国、澳大利亚和拉丁美洲的排名略低。

看起来很有趣?以下是更多信息:

第一部分——上个月世界发生了什么:世界新闻分析

Youtube 频道分析:识别影响者和憎恨者

盒子里有什么?!——第三产业区 Chipy Mentorship。3

原文:towardsdatascience.com/whats-in-th…

理解预测建模和“黑盒”模型的含义

How Brad Pitt feels about Neural Nets

自从开始研究数据科学以来,我收到的最常见的问题是:“什么是数据科学?”毫无疑问,这是一个合理的问题,也是一个我非常乐意回答的问题,涉及到一个我非常热爱的领域。这个答案最清晰的提炼是这样的:

数据科学是使用机器学习来建立预测模型的过程。

作为自然的后续,我们敏锐的听众可能会询问术语的定义:

  1. 什么是机器学习?
  2. 你说的模型是什么意思?

本帖重点回答后者。这种情况下的答案——同样是最简单的形式——是模型是一个函数;它接受输入并生成输出。首先,我们来看看最透明的预测模型之一,线性回归。

线性回归

The Linear Regression of Game Boy models

假设我们试图预测一个学生,泰勒,在一次考试中会得多少分。我们知道泰勒在过去的测试中得了多少分,我们知道她学习了多少小时。当她根本不学习时,她得到 79/100,每学习一小时,她就多做三分。因此,我们对这种关系的等式是:

Taylor's_Test_Score = 3 * Hours_Studied + 79

这个例子是一个尽可能透明的模型。为什么?因为我们不仅知道学习的小时会影响泰勒的分数,我们还知道学习的小时会如何影响泰勒的分数。也就是说,能够看到系数 3 和常数 79,告诉我们学习和分数之间的确切关系。这是一个简单的函数:投入两个小时,得到 85 分。投入 6 个小时,得到 97 分。

Our very own predictive model represented graphically

当然,现实世界更加复杂,所以我们可能开始向我们的模型添加更多的输入。也许我们还会利用睡眠时间、看电视时间和缺课时间。如果我们更新我们的等式,这些新特征中的每一个都将有它自己的系数来描述输入与输出的关系。所有这些输入在数据科学术语中被称为我们模型的特征,我们用这些数据来进行预测。这种线性回归现在是多维的,意味着有多个输入,我们可以更容易地在 2d 平面中将其可视化。不过,这些系数很能说明问题。如果我们想要的结果是尽可能高的测试分数,那么我们想要最大化我们大的正系数(可能花费在睡觉和学习上的时间)的输入,最小化我们的负系数(电视和缺席)的输入。

我们甚至可以在线性回归中使用二元和分类数据。在我的数据集中,啤酒要么是由大型啤酒厂生产的,要么不是(例如 Anheuser Busch、Coors 等)。如果是,is_macrobrew 特性的值被设置为 1,并且在线性回归中,我们对啤酒的预测评级下降。

如果线性回归如此透明,可以处理不同的数据类型,难道不是比黑盒模型更好吗?不幸的是,答案是否定的。随着我们引入更多的功能,这些功能可能会发生变化。回想一下泰勒,更多的学习时间可能意味着更少的睡眠时间,为了建立一个更有效的模型,我们需要通过引入一个新的功能来解释这两个功能的相互作用。我们还需要考虑到,并非所有的关系都是线性的。额外的一个小时的睡眠可能会均匀地提高分数,最多 9 或 10 个小时,但超过这一时间对分数的影响可能很小或有负面影响。

基于树的集成建模

为了克服线性建模的缺点,我们可以尝试基于树的方法。决策树可以很容易地可视化,并像流程图一样遵循。以使用虹膜数据集为例:

Source: If this were a Game Boy, it’d probably be the clear purple one. You can peek inside, but the relationships aren’t quite as transparent.

iris 数据集是一个分类问题,而不是回归问题。该模型查看三种类型虹膜中每一种的 50 个样本,并试图对每个样本进行分类。每个框中的第一行显示模型在哪个特征上分割。对于最上面的盒子,如果萼片长度小于约 0.75 cm,则模型将样本分类为 Setosa 类,如果不是,则模型将样本传递到下一次分裂。对于任何给定的样本,我们可以很容易地遵循模型从一个分割到下一个分割的逻辑。我们还考虑了困扰线性模型的协方差和非线性问题。

随机森林是这种模型的更强大的版本。顾名思义,在随机森林中,我们有多个决策树。每棵树看到一个随机选择的替换数据子集(这个过程被称为引导),以及看到一个随机的特征样本。在我们的森林里,我们可能有 10、100、1000 或更多的树。透明度已经开始严重下降。我不知道特征与目标之间的关系,也无法跟踪单个样本的结果。我现在能做的最好的事情就是打开模型,看看每个特征执行分割的百分比。

简单说说神经网络

随着我们继续扩大不透明度,我们最终得到了神经网络。为了简洁起见,我将在这里简化各种类型。神经网络的基本功能是这样的:

  1. 每个特征都被单独输入到一层“神经元”中
  2. 这些神经元中的每一个都是一个独立的函数(就像我们为预测泰勒测试而构建的函数),并将输出提供给下一层
  3. 最终层的输出被合成以产生预测

用户在建立模型时确定层数和每层中神经元的数量。可以想象,一个特性可能会经历成千上万次操作。我们无法知道模型的输入和输出之间的关系。这就引出了最后一个问题…

我们需要看看盒子里面吗?

任何从事统计学的人,也许特别是在社会科学领域,都被灌输了相关性和因果性之间的区别。回到我们最早的例子,我们知道学习时间和考试成绩强烈相关,但是我们不能确定因果关系。

As usual, there’s an XKCD for that

最终对于数据科学家来说,我们需要问自己的问题是,我们关心因果关系吗?答案往往是否定的。如果模型有效,如果我们输入到机器中的东西能给我们提供准确的预测,那就可能满足我们成功的条件。然而,有时我们可能需要理解精确的关系。建立模型可能更多的是找出这些关系,而不是预测将会发生什么,即使我们的模型的准确性受到影响。

这些是数据科学家在建立模型时问自己的问题,以及他们如何决定使用哪种方法。在我自己的项目中,我最关心的是我的预测的准确性,而不是理解为什么啤酒会有高或低的评级,特别是因为这在很大程度上是口味和公众意见的问题。

我也许不能告诉你黑盒里发生了什么,但我可以告诉你它是有效的。这通常就足够了。

客户的下一个购物车里有什么?

原文:towardsdatascience.com/whats-in-yo…

Instacart 市场篮子分析ka ggle 上的竞争是机器学习如何应用于商业问题的一个很好的例子,也是功能工程的一个有用的练习。基本上,问题归结为预测用户会再次购买哪些产品,第一次尝试,或者在会话期间添加到他们的购物车中。背后的动机很简单:作为一家杂货配送公司,你会希望优化你的供应链,尽量减少浪费,并避免延期交货。机器学习部分是我将在这篇博客中讨论的内容。

如果您查看了本文开头的链接,您会知道有相当多的人尝试过这个问题,并且用不同的方法提交了几十次他们的模型。虽然摆弄随机森林和增强树可能很有趣,但对于这个项目,我们将坚持使用传统的逻辑回归,并研究通过特征工程和基本模型调整可以提高多少。

这一切都始于数据

通常,接近任何机器学习模型的第一步都是查看数据。在这里,我在 Tableau 中绘制了几个基本的可视化图形,仅仅从这些图形中,我们就可以了解用户的行为模式。

例如,这个图显示了一个月内有多少相对大小的商品被重新订购。我们已经可以看到,大多数人会在一周内重新订购产品,或者再也不会订购(30 代表自上次订购以来的 30 天或更长时间)。

在这里,我们可以看到客户的平均订单规模是 10 件商品。

虽然这种探索性的数据分析本身提供了有用的见解,但这个项目的目标是进行机器学习,并将这些见解转化为预测建模。

和机器学习

在这一点上,我与卡格尔有些分歧。为了训练一个逻辑回归模型,我将构建一个新的特性来表示给定用户的最后一个购物车:

train_carts = (order_products_train_df.groupby('user_id',as_index=**False**)
                                      .agg({'product_id':(**lambda** x: set(x))})
                                      .rename(columns={'product_id':'latest_cart'}))df_X = df_X.merge(train_carts, on='user_id')
df_X['in_cart'] = (df_X.apply(**lambda** row: row['product_id'] **in** row['latest_cart'], axis=1).astype(int))

这个新特性是查看用户和产品 id 并重新创建他们以前的购物车的结果。因此,我们以他们的最新订单结束,用一组产品 id 表示。在这里,我们可以创建一个列,指示某个商品以前是否被订购过,并根据包含以前购物车中的产品 id 的列填充值。显示时,新的特征空间将如下所示:

因为 id 为 1 的产品之前没有被订购,所以它在 in_cart 列中的值是 0。因此,该 in_cart 列将成为分类的目标。如果用户更有可能重新订购某个商品,我们将得到预测值 1,否则为 0。

在这个特征空间上运行基线逻辑回归产生了非常差的结果,所以这是我们可以求助于特征工程魔法的地方。我在我的特征工程中采用了迭代的方法,并测试了每一组新的特征(用户特征、产品特征和用户-产品特征)在每一步是如何影响我的模型的。

具体来说,在处理平均值时,我检查了天数和小时数的原始平均值相对于其四舍五入值的表现。这里的理由是,考虑自上次购买以来的 12.33 天是没有意义的,因为数据集本身只提供整数值,离散变量的小数值不是很有见地。令我惊讶的是,未舍入的原始平均值总体表现更好,从长远来看,给了我的模型更多的信号。

我设计的大多数功能都围绕着订单频率和一些平均指标,来比较整个客户群的一般订购趋势和特定的客户行为。我还将部门名称转换成分类变量,因为我希望它们可以为我的模型提供额外的信号(它们没有)。

我在开始时没有提到的一件事是,我的预测类相当不平衡。设计的 in_cart 功能显示,商品大约十分之一会被重新排序。为了补偿这种等级不平衡,我使用了 sklearn 默认的重量平衡:

lr_balanced = LogisticRegression(class_weight='balanced', C=1000000)

然而,我更进了一步,测试了自定义权重,以便进一步微调。事实证明,手动平衡模式整体表现更好。

结论

最后,这个简单的逻辑回归和新设计的特性以及手工的类平衡产生了非常好的结果。在 F1 = 0.381 的情况下,我并不落后于 Kaggle 的领导者,他们在 F1 = 0.41 附近徘徊,有许多提交物和更花哨的模型。

如果我们看看混淆矩阵,我们可以更好地分析我的 F1 分数到底代表了什么。在精度为 0.3 的情况下,我的模型可以正确预测所有重新排序项目的 30%,0.52 的召回率决定了我的模型可以预测多少真阳性和假阳性。至少,顾客可以确信他们不需要延期交货。

这种次优结果可以用类别不平衡来解释——当项目没有被重新排序时,我的模型预测得更好——或者这可能不是一个适合机器学习的问题。

除了这些有点抽象的分数,我们可以看看模型的系数。您可以在我的代码中找到所有的系数值,但是为了突出最重要的发现,我要说的是,客户订单频率是迄今为止客户再次订购某个产品可能性的最大预测因素。用户和产品总订单也起作用:一般来说,用户订购产品越频繁、越多,这些产品再次被订购的机会就越高。

然而,添加到购物车中的商品的计数顺序在商品被重新订购的几率中起着负面作用,这非常有意义:我们在开始时看到,用户的平均购物车大小约为 10 件商品。如果一个商品一直被放在购物车的第 15 位,那么它很可能不会出现在普通的购物车中。

结束了

今天到此为止。你可以在这里找到我非常有趣的演讲。所有的代码都可以在这个存储库中访问。

我还使用了 AWS EC2 (Amazon Web Services,Elastic Cloud 2)进行建模,我强烈推荐 Chris Albon 的指南来设置虚拟机和 Jupyter 笔记本以在其上运行。

国情咨文演讲中的潜台词

原文:towardsdatascience.com/whats-not-s…

今天我看了一下几乎每一次国情咨文演讲中使用的词汇,看看谁在他们任期的第一次演讲中没有提到这些词汇。

希望、团结、支持、和平、人民、权力、权威、外交、安全、未来这样的词几乎每个人都在用,还有国家国会国家政府这样的词。然而,有些人选择不使用这些词。

1–15th SOTU

我们可以看到乔治·华盛顿的用词与众不同,这在他发表第一个演讲时是有意义的。此后,有趣的是看到一些总统不谈论权威或安全。

16th-30th SOTU

31st onwards

这是我关于数据科学和视觉故事的# 100 日项目的第 76 天。数据来源是 SOTU 资料包,其中主要包括国情咨文演讲,在极少数情况下,如 1993 年*,2001 年*和 2009 年这些演讲不是正式的国情咨文,而是对国会联席会议的演讲。

作为一个对政治或历史不太感兴趣的人,我只是好奇数据能揭示多少东西,也想探索可视化文本的不同方法,这可能与可视化数字非常不同。代码在我的 github 上。感谢阅读。如果喜欢,请分享。欢迎新主题的建议和反馈。

人工智能在销售和营销方面的真正可能性是什么——超越宣传

原文:towardsdatascience.com/whats-reall…

围绕人工智能技术的炒作空前高涨,预计到 2025 年 市场将达到 370 亿美元 。在销售和营销领域,人工智能驱动的预测分析带来的 10 倍转化率和加速增长的潜力非常诱人。但是什么是真正可能的,什么又是遥远的未来?

据 CB Insights 和 O'Reilly Media 等消息来源称,销售和营销是受人工智能投资热潮影响最大的前三个市场。行业巨头正在宣布更多的人工智能计划——sales force 收购 Metamind 并推出 Einstein,或者微软推出具有人工智能技术 Cortana、PowerBI 和 Azure 机器学习的 Dynamics 365。

然而,人工智能的能力与客户和投资者的期望之间存在脱节。人工智能工具的购买者并不总是熟悉底层技术,也不知道哪些供应商能够兑现准确有用的预测承诺。

预测分析与其他人工智能技术

在销售和营销领域,预测分析是一种人工智能,近年来势头强劲。公司使用这种技术来预测哪些线索会成为客户,这是基于表明他们购买可能性的特征或行为,然后决定如何最好地抓住这些机会。

预测分析不是销售和营销应用中使用的唯一人工智能类型,但它是当今大多数创新发生的地方。尽管人们很容易被由深度学习和自然语言处理(NLP)驱动的全自动人工智能工作流或机器人虚拟助理的想法所吸引,但这些技术尚未准备好大规模实施。预测分析提供了现在可以工作的工具,使越来越多地被数据淹没的创业销售和营销团队更容易做出决策。

预测能为销售和营销带来什么

预测分析有助于公司优先使用其销售和营销资源。对于初创公司来说,保持精益和高效是成功的关键,使用预测技术可以保持业务增长,而无需雇用新的销售代表或增加营销预算。它还通过快速给初创公司反馈,而不是等到几个月后才分析结果,提高了敏捷性。

以下是初创公司使用预测分析进行销售和营销的一些最佳方式:

  • 确定您的理想客户档案和细分市场
  • 根据行为对销售线索评分,并确定销售工作的优先顺序
  • 通过自动化手动活动(如研究、设置基于规则的工作流和/或更新 CRM 数据)保持团队的精干
  • 整合来自现有工具的数据,以做出更准确的预测
  • 通过个性化内容和活动锁定客户群
  • 支持基于客户的战略
  • 向高端市场转移,并利用有希望的领先优势扩展到新的领域
  • 采用通用的数据驱动型决策框架

预测分析有助于公司更快地实现增长目标,而无需在销售和营销上投入更多资金。但就像任何被大肆宣传的技术一样,在你购买之前,有几件事需要注意。

人的因素:创业的关键因素

初创公司和快速增长的公司可以使用预测分析在他们的市场上更具竞争力,但前提是他们理解人工智能驱动的技术的局限性。人类的专业知识仍然在预测平台对你的公司有多有效方面发挥着巨大的作用。

在投资预测平台之前,您应该能够回答这些问题:

  • **该软件适合您的使用情形吗?**一个好的预测平台不仅仅建立在算法上。它是由行业专家创建的,他们了解您将如何实际使用它来做出业务决策。如果一个供应商不能清楚地说明为什么它适合你公司的用例,它可能不适合你的业务。
  • **平台有很多集成吗?**如果您能够将预测分析集成到您已经使用的工具中,或者集成到随着您的成长而可能采用的工具中,那么采用预测分析要容易得多。购买之前,检查最流行的 CRM 和营销自动化工具的开放 API。
  • **供应商对数据源和信号透明吗?**要相信一个平台的预测,你必须知道为什么它包括某些信号而不包括其他信号。询问第一方和第三方数据源,以及供应商为什么使用它们而不使用其他数据源。
  • 对于这个工具,你有足够的成败数据吗?为了专门为您构建预测模型,供应商必须能够利用您过去的销售数据来训练模型。不要过早投资——等待一个月甚至一年,随着你的成长积累更多的数据,这可能是正确的选择。

随着越来越多的公司采用预测平台来帮助他们成长,由您来决定哪种技术将保持您的竞争力。谈到人工智能,有一个大肆宣传的理由——拥抱它的潜在回报是巨大的。保持消息灵通,选择一个强大的平台,看着您的企业收获收益。

朴素贝叶斯有什么幼稚的?

原文:towardsdatascience.com/whats-so-na…

Naive art

朴素贝叶斯(NB)是“朴素”的,因为它假设测量的特征是相互独立的。这是天真的,因为它(几乎)永远不会是真的。以下是 NB 无论如何都管用的原因。

NB 是一个非常直观的分类算法。它会问这样一个问题,"考虑到这些特征,这个测量值属于 A 类还是 B 类?",并通过将属于 A 类的具有相同特征的所有先前测量的比例乘以 A 类中所有测量的比例来回答它。如果该数字大于 B 类的相应计算,则我们说该测量属于 A 类。简单,对吗?

当然,在实践中,我们很少会看到许多测量具有相同的特征集。事实上,如果我们必须依赖一个测量值来与一些先前测量的数据点相同,我们将只能对完全相同的数据点进行分类,这使得贝叶斯规则实际上对分类毫无用处。

现在,如果我们做一个天真的假设,所有的特征都是相互独立的,那么我们就不需要依靠训练数据集中的精确副本来进行分类。我们可以简单地分别获取每个特征,并确定属于 A 类的先前测量值的比例,这些测量值仅对此特征具有相同的值。然后,我们对所有其他功能进行同样的操作,并获得产品。我们再次将其乘以 A 类在数据集中的比例,看看这个数字是否大于我们对 b 类进行相应计算的结果。这是作弊,但确实有效。

NB 的伟大之处在于天真的假设实际上有助于分类。可以这样想:如果两个特征实际上是相关的,比如说,头发长度和性别,那么假设它们是独立的就意味着你要重复计算证据。如果性别和长头发与成为贾斯汀比伯的粉丝有更多的联系,那么假设独立会让你更加确定她是一个信仰者。或许有点天真。

哈尔特征分类器和卷积神经网络有什么区别?

原文:towardsdatascience.com/whats-the-d…

以情感识别模型为例!

“基于哈尔特征的级联分类器”、“类哈尔特征由 Viola 和 Jones 首次提出”……但到底什么是类哈尔特征呢?它与卷积神经网络有什么关系?

Haar-Feature 就像 CNN 中的核,只是在 CNN 中,核的值是通过训练确定的,而 Haar-Feature 是手动确定的。

以下是一些 Haar 特性。前两个是“边缘特征”,用于检测边缘。第三个是“线特征”,而第四个是“四矩形特征”,最有可能用于检测倾斜的线。

Image 1: Common Haar-features // Source

从数字上看,它们可能如下所示:

Image 2: Haar-features represented numerically

正如这里的所解释的,每个 3x3 内核在图像中移动,并与图像的每个 3x3 部分进行矩阵乘法,强调一些特征并平滑其他特征。

Haar-Features 擅长检测边缘和线条。这使得它在人脸检测中特别有效。例如,在碧昂斯的小图像中,这个 Haar 特征将能够检测到她的眼睛(顶部较暗而底部较亮的区域)。

Image 3: Haar-features can be used to detect facial landmarks, such as the shadow of an eye // Source

然而,由于 Haar 特征必须手动确定,所以它能够检测的事物的类型有一定的限制。如果你给分类器(一个网络,或者任何检测人脸的算法)边缘和线条特征,那么它将只能检测到边缘和线条清晰的物体。即使作为人脸检测器,如果我们对人脸进行一些操作(比如用太阳镜遮住眼睛,或者将头部倾斜到一侧),基于 Haar 的分类器也可能无法识别人脸。另一方面,卷积核具有更高的自由度(因为它是由训练确定的),并且能够识别部分覆盖的人脸(取决于训练数据的质量)。

有利的一面是,因为我们不需要训练 Haar 特征,所以我们可以用相对较小的数据集创建一个分类器。我们所要做的就是训练每个特征的权重(即,应该更多地使用哪个 Haar 特征?)这允许我们在没有大量训练图像的情况下很好地训练分类器。此外,它还具有更高的执行速度,因为基于 Haar 的分类器通常涉及更少的计算。

引发对基于哈尔的分类器的这个小调查的是这个识别情绪的模型。去年,在一个展览会上,我偶然发现了一个情感识别系统。然而,它没有使用神经网络。我很好奇是否能找到一个完全基于 CNN 的情感识别算法。

简单看一下这个模型,我看到它使用 OpenCV 的基于 Haar 的级联分类器来检测人脸。在找到面孔后,该团队训练他们自己的 CNN 来识别脸上的情绪。

因为它使用了基于 Haar 的分类器,我不能真正称它为完全基于卷积神经网络的 T2 算法。如果我把基于哈尔的分类器换成的 MTCNN 人脸识别系统会怎么样?

最初,它加载了一个基于 Haar 的分类器。我把它换成了一个 MTCNN 探测器:

然后,我做了一点数据处理,因为他们基于 Haar 的分类器输出返回一个方形边界框作为二维数组,而 MTCNN 模型输出返回一个字典中的矩形边界框。

当我改变输出和调试时,我让基于 Haar 的分类器和 MTCNN 检测器都保持运行(以比较它们的输出)。有趣的是,我的电脑似乎无法承受如此大的计算量:程序一直在崩溃。

最后,我运行了程序,现在运行的是 MTCNN,而不是基于 Haar 的分类器。以下是一些观察结果:

  • 基于 OpenCV Haar 的分类器要快得多。切换到 MTCNN 检测器后,视频开始滞后。它仍然可以实时运行,但质量没有那么好。
  • MTCNN 检测器能够检测更多种类的人脸。即使我倾斜我的脸,将它部分转向远离相机,或者用手遮住它的一部分,它仍然能够识别它是一张脸。基于 OpenCV Haar 的分类器只能真正识别完整的正面人脸。
  • 根据基于 Haar 的分类器训练的情绪识别网络只能准确识别正面人脸上的不同情绪。因此,即使 MTCNN 检测器允许我们在部分模糊的面部周围绘制一个边界框,该程序也无法真正识别面部的情感。

所有这些观察结果都与我的发现一致:虽然训练有素的 CNN 可以学习更多的参数(从而检测更多种类的人脸),但基于 Haar 的分类器运行更快。根据你的任务,一个可能比另一个更适合。

在此下载您的资源:

分布如何,肯尼斯?

原文:towardsdatascience.com/whats-the-d…

今天早些时候,我发现自己被一个看似简单的问题彻底难倒了:如何解决罕见事件的分类问题?

从某种意义上说,这既是一个“容易”的问题,也是一个“困难”的问题。简单,因为分类算法很多。“困难”是指预测罕见事件通常并不容易:任何分类算法都会受到大量分类错误的困扰。

但是,我觉得有趣的是,这真的揭示了我的思维方式与普通的军情六处人员有多么不同。我的第一反应是按顺序列出逻辑回归、CART 和 RandomForest。为什么?因为我知道每种算法的运动部分是如何工作的,按照我列出的顺序,因此我知道我可以从每种算法中得到什么样的误差分布,以及当我从结果中看到意外的误差分布时会如何反应。我想我“应该”已经回答了梯度增强模型、AdaBoost 或类似的东西,因为我理论上“知道”它们会产生“更好”的预测(如果是这样,它不会很快出现,但是。),但是,如果没有对何时、何地、如何以及为什么他们错了的良好感觉,也就是说,如果他们错了,如果他们没有错,如果没有错误,或者至少,如果我不知道错误的分布,我不确定我知道如何处理它们。换句话说,这表明我的想法有点反常,至少从通常统计人员的角度来看是这样——我不太关心信号,我最感兴趣的是噪声的分布。

当然,这在某种程度上是对增强模型的不公平描述:它们将模型本身的“错误”内在化了——只是它们的集合性质没有产生单一的明显的噪声分布。这组课堂讲稿中的幻灯片 61–65 有助于可视化这个过程:从“以噪声为中心”的角度来看,一个重要的事实是,根据观察到的特征,该算法很有可能将 G 误认为 Q、R 或 S,即使经过了相当多的回合。在某种意义上,这相当于我正在思考的那种噪声分布函数:我不在乎“正确”的答案是否是 g。例如,我想知道下一个“正确”的答案是什么(我猜这是 100 轮后的 Q),它相对于第一个正确答案的概率(显然,约为 50%,100 轮后,0.2 比 0.4),以及这个概率相对于其他概率的变化率。我也希望有一些东西,一些基线模型,可以这么说,这样我就可以估计“自然地”将 G 误认为 Q 的可能性有多大,这样就可以测量 ML 算法的预测能力,但我不认为有人会这样做,至少在这种情况下。(但有一些问题集中在变量之间的“依赖性”上,例如系词,它引发了一些相同的问题。不一定(太)不同:所谓的“资金外逃”会导致资产价格出现高度相关的短期波动。G 和 Q 在特征上的相似性很可能会将其中一个误认为另一个,即当真正的字母未知时,与配对的 G 和 A 相比,增加了它们在“识别”中的配对相关性——无论是谁或什么在做,将未知字母认为是 G 或 A 的可能性都不是很高。当然,最大似然算法给了我们该算法的概率,但是与它比较的基线选择是什么呢?).

我认为这就是统计学,至少我是这样理解的,与 ML 的观点不同的地方:如果在训练模型的过程中,数据有标签 G,那么它有 100%的概率是 G。在我看来,我不知道我看到了什么:它是有 40%概率的 G 和有 20%概率的 Q,在这之前我已经重复了 100 次关于 G 的观点。这在某种意义上是越(准贝叶斯?)“统计”思维——至少是我接受培训时的思维。我们不知道事实——如果我们知道,我们就不会做统计。(我认为最大似然法更类似于“经典统计学”,在这种意义上:假设 X 是 A,X 不是 A——因此假设潜在的正确答案,并计算给定样本的相对概率。在 ML 上下文中,概率是通过一个更长的过程来计算的。)现实永远只是一个概率分布,对任何事都不会在 p=1。为了搞清楚这一点,我们需要知道我们不知道多少——或者相对于第一种可能性的第二种、第三种或第四种可能性的概率,取决于观察到的样本。因此,统计分析的重点不在于最正确结果的概率,而在于它相对于其他选择有多好。另一方面,从 ML 的角度来看,“正确答案”必然存在,并且被封装在训练集中。问题是,该模型是否能像在训练过程中那样,在应用程序集(测试集和验证集,如果适用,作为中间步骤)中找到正确的答案。其他选项不存在,因为答案是 G,而不是 Q。(我对此的回答是,虽然您在训练/测试集中知道这一点,但您如何知道您是否在应用程序集中看到了 Q 或 G?当我在 2016 年选举前处理民调数据时,我遇到了这个问题:试图将样本分成训练集和测试集是毫无意义的,因为无论如何,直到选举日之前,我们都不知道真正的答案是什么。我们所能做的最好的事情是显示模型识别的各种特征相对于现有数据的稳健程度,但是全国范围内的投票率预测不太可能受到愚蠢的小波动的影响。)在我看来,如果你想变得敏捷,你需要知道第二、第三和第四种可能性是什么,以及它们发生的可能性有多大。所以,如果你认为你看到了一个 G,那么它真的是 Q,A,或者 F 的可能性有多大?如果使用得当,GBM 可以给出这些答案,但我还没有见过有人这样使用它——尽管我并不像我希望的那样关注当前的情况。

总之,我们不应该只是想知道正确的答案。我们所能做的就是根据算法中的任何内容,给出我们认为“最正确”的答案。理想情况下,我们应该想知道相对于“最正确的答案”,不太正确的答案的等级排序以及算法分配给它们的概率如果能够将概率与备选基线进行比较,那就更好了。(一个简单的例子是来自 DWNominate 算法的预测投票与人们只是投票给政党的天真假设。就绝对值而言,DWNominate 预测今天比以前更好,但人们也比以前更经常地投票给政党。与 20 世纪 70 年代相比,DWNominate 作为简单的以政党为中心的投票模型的选票预测指标的相对表现更差,政党和选票的相关性与今天一样。除此之外,在国会不同类别的投票中,DWNominate 得分的预测能力也有很大差异。)现实不仅仅是(据称)正确的答案。预测分析不仅应该帮助我们找到“最正确的”(特别是因为这些答案在无条件的意义上不一定是“正确的”)答案,更重要的是,与一些“合理的”基线(例如“平均值”)相比,这些答案有多错误对我来说,有趣的问题不是平均 X 看起来像什么,而是平均 X 离平均 X 有多远——这是双关语。当然,这是方差的函数定义,或多或少也是 k 级推理的工作方式)。

正规化有什么好大惊小怪的?

原文:towardsdatascience.com/whats-the-f…

作为机器学习的新手,当他们的训练错误开始减少时,大多数人都会感到兴奋。他们进一步努力,开始进一步减少,他们的兴奋没有止境。他们向乌龟大师展示了他们的结果,乌龟大师平静地说,这不是一个好模型,你需要调整模型,并检查验证集的性能。如果你想了解什么是“正规化”以及它如何有所帮助,那么请继续阅读。

让我先打个比方,机器学习模型就像父母一样,他们对自己的孩子有一种亲和力,他们与孩子相处的时间越多,这种亲和力就越强,孩子就成了他们的世界。ML 模型也是如此,一旦你开始用数据训练它们,它们就开始对训练数据产生兴趣。你越是调整你的模型,它们就越符合训练数据,从而减少误差。然而,我们需要记住的是,训练数据只是总体的样本,因此它代表总体的一些趋势,而不是所有趋势。如果我们将模型与样本数据紧密拟合,那么就不能保证与测试数据拟合得那么好。这意味着测试数据中的趋势不会精确地复制训练数据,但是会是训练数据的概括。因此,我们的模型也需要很好地概括,任何完全适合训练数据的模型都不会很好地概括。这就是正则化有所帮助的地方,它就像一个明智的大师,帮助降低我们的模型与训练数据的亲和力,并帮助它进行归纳。

唷!很多理论让我们用一个例子来理解它。只是提醒一下,你会在文章前面遇到很多术语,但是不要担心,我会试着解释这些术语。

一个简单的例子是,考虑一个样本训练数据,其中 Y 与 x 呈现多项式关系。

Training Data

你拟合一个简单的线性回归模型,它看起来像这样,带有一些训练误差。

Fig 1-Linear Regression Fit

您对此不太满意,并希望进一步减少训练误差,因此您将二次多项式项添加到线性回归(X 平方)中,结果如下所示。

Fig 2-Second degree polynomial fit

现在,看到训练误差已经减少,你忘乎所以,你用 50 次多项式拟合模型,它看起来像这样。

Fig 3–50 Degree polynomial fit

看看这个模型有多完美,它现在开始紧密地拟合每个点。这就是事情开始变得模糊的地方,这个模型仅仅对于训练数据来说是一个优秀的模型。然而,对于测试数据或该训练样本之外的任何数据来说,这都是废话。在机器学习的说法中,这被称为“高方差”模型。高方差意味着模型是过度拟合的,而过度拟合的模型对于预测来说是不好的。而图 1 中的模型被称为“高偏差”模型或欠拟合模型。我们需要一个平衡偏差和方差的模型。

在具有多个维度的真实世界中,在对模型进行参数调整之后,您真的不能一直查看图表。这就是你需要依靠正则化来减少方差的地方。但请记住,我们还需要衡量我们的模型在列车数据以外的数据上的表现,这是交叉验证有所帮助的地方。简而言之,从训练数据中保留模型在训练时看不到的一些数据,并根据这些数据(验证数据)评估模型性能。

那么正则化到底是如何降低模型的方差的呢?

为此,我们需要举一个最小二乘回归的例子。最小二乘回归成本函数为:

Fig -4 Cost function for Linear Regression

正则化的工作方式是在成本函数中增加惩罚

Fig -5 Regularized Cost function

记住这个惩罚是针对除了θ0(截距)之外的所有θ的。这如何有助于减少模型的过度拟合?我们来了解一下。

为了减少模型的方差,重要的是我们有一个简约的模型,这意味着我们有一个简单的模型,它可以很好地概括。为了有一个简洁的模型,我们需要减少模型中的特征或者减少除截距之外的特征的 thetas 的权重。对这两种方法有一点了解。

  1. 减少特征的数量(模型选择/子集选择)

这是通过模型选择或子集选择技术实现的。这是一个统计过程,其中使用特征组合构建各种模型,并使用 AIC (Akaike 信息标准)、SBC( Shwarz 贝叶斯标准)或 Mallows (Cp)或任何其他标准选择最佳模型(具有特征子集)。然而,我们不打算在本文中讨论这一点。

2。 降低特征的权重(正则化/收缩法)

在正则化中,我们保留所有特征,但是减少特征的θ或权重的大小。该技术减少并消除了不重要特征的 thetas(权重)。因此,我们得到了一个简约的模型。

有多种方法可以正则化一个模型。对于线性回归,您可能听说过以下内容:

  • 山脊(减少特征的权重)

Fig 6.2 — Ridge Regression

  • 套索(消除一些特征)

Fig 6.1 — Lasso Regression

  • ElasticNet(混合方法)

Fig 6.3 Elastic Net Regression

其中:

λ=正则化的惩罚参数

山脉

在脊正则化的情况下,罚值被称为 l2 范数。那么为什么岭回归会减少过拟合呢?随着λ的增加,岭的灵活性开始降低,当λ= 0时,岭回归与 OLS 相同。然而,特征权重可以非常接近于零,但是在脊的情况下很难得到零权重。

套索

在套索的情况下,惩罚被称为 l1 范数。山脊和套索的区别在于,在套索的情况下,随着 lambda 的增加,灵活性开始迅速降低,很快一些特征被关闭,这意味着一些特征的特征权重降低到零。因此,套索在减少特征和具有更简洁的模型方面非常有用。

让我们用一个例子来理解这一点。我正在使用一个名为 Credit 的数据集,它可以从著名的 ISLR 图书网站上获得。

问题是使用一组特征来预测“平衡”

这个问题不是很大,但它将帮助我们了解山脊和套索在同一组要素上的表现。

为简单起见,我们只取四个特征收入、评级、限制和学生。如果λ从 0.001 到 1000,我们将取 50 个值,然后检查收入、评级、限制和学生的权重。这将有助于深入了解山脊和套索的行为。

在使用四个特征和 50 个不同的λ值运行脊之后,这里是这四个特征的系数如何变化。

Fig 7 — Ridge coefficients as a function of regularization

请注意,当λ为零时,所有四个特征的权重都很高,并且对应于 OLS。随着λ开始增加,权重值开始下降。对于λ= 1000,收入和学生的权重接近于零但不等于零,其他两个特征的权重也显著降低。

对这些的解释超出了本文的范围。这篇文章只是想给出一个正规化的概述,但是我会在下一篇文章中用一个具体的例子来解释套索和山脊。观察正则化如何工作以及它如何影响模型将是非常有趣的。

当我们对套索重复同样的过程时,我们看到的是:

Fig 8- Lasso Coefficients as function of regularization

你能看出区别吗?对于大约 150 的λ,三个特征的权重下降到零。因此对于一个小的正则化套索完全消除了特征。因此,Lasso 在特征选择中是有用的,其中它通过将不必要的特征的权重减少到零来消除不必要的特征,并且实现更简约的模型。

现在让我们来看看 RSS(MSE)如何随着训练数据的这两个正则化而变化。

Fig 9- MSE(train) for Lasso & Ridge as function of regularization

看看 Lasso 的给定 lambdas 在训练数据上的 MSE 是如何高于 Ridge 的。这是因为套索比山脊更能规范模型。

值得一提的是,在三重交叉验证的情况下,MSE 是如何随交叉验证数据而变化的。

Fig 10- Cross Validation score for Lasso & Ridge as function of regularization

看看 Lasso 的交叉验证分数如何比 Ridge 下降得更快,表明 Lasso 更适合验证数据。

最后,我们需要记住正则化的一个重要方面,即数据必须标准化。

与 ridge 类似,lasso 也将系数估计缩小到零,但是在 lasso 的情况下,当 lambda 较大时,l1 罚分具有将一些系数强制为零的效果。因此,套索导致可变选择,套索模型有时也被称为稀疏模型。然而,当响应是所有预测值的函数时,岭是有效的,因为它不消除特征。

正则化不仅用于回归,还用于决策树,在决策树中称为修剪,在神经网络中称为丢弃。但是关于这些的讨论超出了本文的范围。

我希望上面的文章能帮助你理解正规化。

如果你想看一个正在运行的例子,请在 google colab 上查看这里

[## 谷歌联合实验室

编辑描述

colab.research.google.com](colab.research.google.com/drive/1GxU2…)

github 代码可以从这里拉出来

不要把你的时间浪费在统计上

原文:towardsdatascience.com/whats-the-p…

Here’s the audio version of the article, read for you by the author.

我最近发现,我的一个好朋友成功地获得了统计学博士学位,却从来没有问过自己这样一个问题:统计学到底有什么意义?哦,天哪。如果你不知道它是为了什么,你也不知道它什么时候不适合你。原来教授们不会让这一点显而易见,所以让我看看我是否能帮上忙。

Image by the author.

统计学 是在不确定的情况下改变自己想法的科学。你的想法是什么?一个 默认动作 或者一个 先验信念 。但是如果你的想法没有定下来,你该怎么办呢?如果你没有任何意见呢?

按照你的估计去做就行了(这只是“根据你所知的最佳猜测”的一种花哨说法)。你如何得到一个?只要看看数据,报告有什么。这被称为分析(又名数据挖掘),如果你曾经使用过电子表格,你已经做过了。好消息是,你的直觉实际上很擅长给你正确的估计。不需要复杂的数学。

“但也可能是错的!”当然它可能是错的,这就是不确定的含义。世界上没有数学魔法能把不确定性变成确定性。你的最佳猜测可能是错误的,但这是你的最佳猜测,这使得任何其他猜测都是更糟糕的猜测,甚至更有可能是错误的。

所以跟着你的直觉走,不管你有多少数据!

“等等,但是我需要知道我是否有足够的数据!”Mmmm?什么够了?

暂停一会儿,想象你正在蓝色和橙色的帽子之间选择。如果你真的对它们漠不关心,并且数据堆积起来偏向橙色,那么你最终选择蓝色就是疯了。即使你总共只有 3 个数据点。哪怕只有 0.0000000000001%赞成橘子。你因为什么疯狂而变得忧郁?!用橙色,不需要数学。

If you’re indifferent between these hats to begin with and you get more votes for orange than blue, there’s no math in the world that should tell you to pick blue. Math isn’t magic and it doesn’t violate common sense. Image by the author.

最终选择蓝色的唯一合理的方法是,如果你一开始就偏爱蓝色的帽子。那么你是在问支持橙色的证据是否足够有力。换句话说,是否有足够的数据来改变你的想法。好吧,那你怎么知道?欢迎来到统计

In the top half of the table, the evidence doesn’t contradict your starting preference, there’s no need for statistical calculations. You can make your decision immediately. If your evidence is out of line with your preference, you can use statistical calculations to find out whether the evidence should make you want to change your mind.

统计学是改变你想法的科学。

因此,如果你在处理不确定性(例如,“这个机器学习系统能处理明天的数据吗?”)而且这些选项的重要性也不尽相同(例如,“除非它有效,否则我们可能不应该启动它。”)那么你来对地方了:统计学就是给你准备的。在这里放大浏览它的主要思想。其他人,在你最终小心翼翼地、无用地计算一堆数字之前,赶快逃离吧。分析对你来说是更好的选择。

感谢阅读!YouTube 课程怎么样?

如果你在这里玩得开心,并且渴望了解更多,请前往我的统计思维播放列表:

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

Enjoy the entire course playlist here: bit.ly/machinefrie…

喜欢作者?与凯西·科兹尔科夫联系

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

有什么意义?视觉数据报告

原文:towardsdatascience.com/whats-the-p…

你们中的许多人可能都经历过和我一样的情况,当你收到一份报告时会想“我在看什么?”“这有什么意义?”。包里都是桌子,真是只见树木不见森林!作为数据专家,您如何向您的业务合作伙伴展示您对他们的业务有清晰而全面的了解,而不会让他们沉浸在数据中?

传达信息和讲述“数据故事”是任何数据专家都不应忽视的技能。通常在商业中,你认为的能力和你的实际能力一样重要。如果你想推进你的职业生涯,向非技术观众展示你的技能是至关重要的。提供清晰易懂的报告也意味着您的建议更有可能被考虑!如果你担任建议/商业智能的角色,你需要迅速展示“燃烧的平台”或需要改变的原因,否则利益相关者不太可能采取任何行动。这就是你如何让自己变得有价值,并最终成为你的商业伙伴不可或缺的一部分。

为了突出这个问题,我准备了一个小型数据集,其中包括一个虚构企业的销售和收入业绩。包括四个不同办事处 12 周的销售量、人数、运营成本和收入。假设该企业有四个办公室执行相同的任务并独立运营。运营成本纯粹是员工工资。该报告的目的是让每个办公室的领导与公司的负责人一起评估和比较他们的绩效。

Example of a typical data report for a business stakeholder.

如您所见,样本数据集是分布在任何大型组织中的许多报告的典型。它包含企业要求的信息,并且不包含任何数据错误。那么,除了在数学上站得住脚之外,这是一份好报告吗?我希望这个行业的高层领导能做些什么?数字看起来都没问题?

尽管这份报告没有什么“错误”,但仍有许多改进的机会。众所周知,高层领导缺乏时间,关注大局。出于这些原因,我们希望快速清晰地向他们展示要点,尽可能不分散他们的注意力。

从管理角度来看,一些挑战是“收入”等数据点。这个指标(在示例中)由销售数量和每次销售的收入金额组成。由于它实际上是两个较小指标的总和,采取行动提高收入是一个挑战?我应该专注于增加销售额还是增加利润?同样,如前所述,运营成本纯粹由员工工资构成。我是应该专注于减少员工数量,还是应该减少他们的薪酬?我们确实在报告中统计了人数,但是经理需要自己计算平均工资来回答这个不是最佳结果的问题。

如何呈现这份报告?

Visual alternative to the original report.

原始报告可以可视化地呈现,上面的例子是使用 Tableau 准备的,Tableau 是一个非常有效的工具,只需要有限的培训就可以开始。LinkedIn learning 有一些免费课程在这里然而网上有很多很多免费和负担得起的课程。

该图显示了原始数据中最后一周的结果,但是显示 12 周的合计可以以相同的格式呈现。或者,如果企业更关注一段时间内的变化而不是某个时间点的绩效,我们可以使用折线图来显示一段时间内的结果。蓝色区域代表当前信息,绿色区域突出显示上周的结果。绿色阴影越暗,表示该区域越新。这只是一个例子,说明如何将最近的业绩纳入一个单一的视觉效果,但对于“办公室 2”,我们可以看到利润在最近几周一再下降。

高层领导可能会把利润作为他们的总体目标。他们可能会有一些额外的质量和客户满意度指标,但是让我们考虑这些超出了我们的项目范围。数据已经过重新计算,以显示“平均工资”、“员工人均收入”、“销售收入”、“员工人均销售额”等指标,最后是“利润”。提供了这些指标的顺序,因此利润排在最后,因为上述指标将合计影响总利润。每个办公室都有自己的专栏,我们可以快速有效地比较每个网站的表现。

那么,我们能从这份新报告中学到什么呢?最初的表格没有引起我的任何警觉,但是,新的报告强调了:

  • 四个工厂之间平均工资的显著差异
  • 员工人均收入和销售收入数字不一致
  • 办公室 1 的利润明显高于所有其他办公室。

有许多方法来显示这些信息,每种方法都有优点和缺点。在准备视频时,我考虑了以下几点:

**清除:**排除不必要的数据点、网格线、轴值等。

配色方案:所有的列都是不同的蓝色阴影,这使它们保持连接(一个公司),但允许读者区分行。颜色也更柔和(更灰),因此不那么强烈,更容易长时间聚焦。

**利润最后:**由于上述指标都对利润有所贡献,因此在底部显示为“汇总”指标。

正如我所提到的,有许多方式来展示这份报告,这份报告中有我喜欢和不喜欢的方面,但一份报告很少是完全完美的。试着找到最适合你报告目的的折中方案,但是我希望这篇短文能激发你对这个话题的思考!

感谢阅读,如果你喜欢这篇文章,请记得“鼓掌”并关注我未来的文章!

我以前的博客也可以在这里找到。

转型成为数据科学独角兽的秘笈是什么?

原文:towardsdatascience.com/whats-the-s…

Photo by andrew jay on Unsplash

分析中的角色,学会成为“无价之宝”的技能

每个数据科学领域的有志之士都有这样一个问题*“我需要什么技能才能进入这个行业?”,紧随其后的是“我如何在这个就业市场上变得备受追捧?”*尽管这个行业炙手可热,供需失衡有利于训练有素的专业人士,但获得正确的技能组合并不容易。

现在大家都知道*‘数据科学家* 是本世纪最性感的工作。但是这到底指的是什么角色呢?一提到这个头衔,就会让人想起数学奇才在多元微积分和线性代数中挥汗如雨的画面,或者是极客们编写代码创造下一代通用人工智能的画面。

然后,一个人还会被要求掌握一系列技能的繁忙的维恩图所困扰。这些加起来就是一个团队经过多年可能已经掌握的领域。数据科学家是一个不太常用的术语,这个头衔在业内被严重滥用。挺像大数据或者说 AI

实际上,这个头衔通常被用作相关职位的总称,业内公司对此有不同的解释。我遇到过许多人私下向我坦白,“给我任何工作和角色,但请用‘数据’和‘科学家’这两个词给我造一个头衔吧

Photo by frank mckenna on Unsplash

那么,进入数据科学并取得成功需要什么条件呢?

在这种困惑的推动下,人们想知道他们是否必须学习编程才能在数据科学领域有所作为。对于其他人来说,统计学或机器学习可能不是他们的菜。这些似乎是在分析领域取得任何进展的绊脚石。

这尤其让那些对数据感兴趣,但在不同行业的不相关岗位上工作了 10 年的人感到困惑。不得不重新学习编码或设计来重新开始职业生涯的想法难倒了他们。这些错误观念必须被有力地消除,以免它们继续粉碎在数据科学领域的职业梦想。

那么,在数据科学领域发展所需技能的现实期望是什么?此外,有抱负的人能否挑选感兴趣的技能来创造一个更喜欢的角色,一个建立在优势之上,同时又受欢迎的角色?

是的!

我们将首先展示数据科学中所需的一系列技能,比如自助餐菜单。然后,我们将通过从这些技能中挑选,构建提供分析价值的关键行业角色,就像定制一顿饭一样。是的,我们也将揭开成为这个行业独角兽的秘密。

A buffet menu of Data science Skills (Photo by Dan Gold on Unsplash)

数据科学的技能范围

数据科学有 5 项核心技能。再次强调这一点,不,一个人不需要全部学会。在下一节中,我们将介绍角色以及每个角色所需要的技能组合。首先,让我们讨论一个项目中需要的能力的完整列表,以便交付商业价值。

The spectrum of the key data science skills

1。数据引导技能(或)数据科学素养

对数字的热情是在数据科学领域取得成功的先决条件,也是一笔巨大的财富。一个人必须学会数据辩论技巧,才能对数据有感觉——计算平均值,拟合交叉表,并通过探索性分析提取基本见解。重要的是方法,任何工具,比如 Excel、R 或 SQL 都可以。

从数据技术的分析和结果中获得的洞察力就像一颗未经打磨的钻石。对于受过训练的人来说,它们很有价值,但在市场上却一文不值。掌握演示和基本设计技巧来润色这些真知灼见是非常宝贵的。这使得一个人的努力是有效和值得的。

数据处理和基本设计必须以所选领域的良好定位为基础。数据技术的好坏取决于它们对业务问题的适应程度。这些基础知识不能外包给业务分析师,所以任何认真研究数据科学的人都应该掌握领域基础知识。

简而言之,这种技能要求一个人与数据友好相处,并训练他们的眼睛识别数字中的模式。这是一项基本技能,在分析中没有商量的余地。

[## 如何在数据科学工作面试中炫耀自己对分析的热情?

在一个拥挤的市场中,一个人如何显示他们是特殊的,并适合于丰富的数据科学角色?这里…

towardsdatascience.com](/how-to-flaunt-your-passion-for-analytics-in-data-science-job-interviews-2cb432cc3d3d)

2。信息设计和展示

信息设计是以一种促进有效理解的方式呈现数据。重点是能够消费数据的视觉设计,而不仅仅是美化。可视化是让用户从分析中获得价值的最后一英里通信。

要成为这方面的专家,你必须掌握交互设计、用户体验和数据可视化领域的设计技巧。这需要用户映射、信息架构、数据表示、线框、高保真设计和视觉美学方面的专业知识。

一幅画最大的价值是当它迫使我们注意到我们从未期望看到的东西——约翰·图基

[## CSE442:数据可视化

这个世界充斥着越来越多的数据,我们必须保持相对恒定的感知和…

courses.cs.washington.edu](courses.cs.washington.edu/courses/cse…)

3。统计学和机器学习

在大多数数据科学课程中,这一领域受到了极大的关注。这里的重点是统计和建模,而脚本或编程是次要技能。虽然这是从数据中提取价值的一个关键领域,但这里的过度强调可能会转移对数据科学中其他 4 项关键技能的关注。

基于基本的数据争论技能,人们必须更深入地钻研统计学、概率,然后扩展到机器学习的技术和算法。深度学习和其他趋势人工智能技术也属于这一范畴,但这些需要更广泛的编码技能。

[## 机器学习|课程

关于这门课程:机器学习是让计算机在没有明确编程的情况下行动的科学。在…

www.coursera.org](www.coursera.org/learn/machi…)

4。深度编程

具有核心编程背景的人在数据科学中有很大的用处,并不是强制他们学习机器学习技能。数据应用程序需要后端编码来连接和处理数据,需要处理数据和构建数据科学应用程序的内部结构。

还强烈需要前端编码技能来向用户展示数据洞察力,这是橡胶真正遇到道路的地方。一个人必须掌握数据在各种 UI 和表单上的处理和表示。像 Python,Java,Javascript,R,SQL 这样的语言很流行。

[## 为数据科学学习 Python 在线课程|数据营

DataCamp 的 Python 入门课程通过互动视频教你如何使用 Python 编程进行数据科学…

www.datacamp.com](www.datacamp.com/courses/int…)

5。领域专长

深入的领域技能有助于为分析带来意义、可解释性和可操作性。将领域专业知识与数据技能相结合的重要性怎么强调都不为过。在整个项目中缺乏对这一领域的足够重视是计划失败的最常见原因。

在这里,第一步是在选定的领域中获得深度并掌握业务流程。然后,我们必须关注数据素养和对分析技术的概念性理解。这带来了通过结合领域技能和数据印章来编织紧密结构的知识,以获得更高的价值。

“如果你不知道如何问正确的问题,你将一无所获。——爱德华·戴明"

数据科学中的角色

Roles in data science — making oneself a customized meal (Photo by Brooke Lark on Unsplash)

现在我们已经看到了技能的传播,这些技能结合起来形成了分析中的以下 4 个核心角色。这些角色可以在每个认真对待数据科学产品的商店中找到。正如这里所描述的,它们通常被划分为独立的角色,或者被混合成一些重叠的组合。

鉴于该行业的发展状况,职位名称相当不稳定。虽然我们已经看到*‘数据科学家’是一个经常用来吸引人才的松散头衔,但像‘数据忍者’*这样的角色可能意味着什么谁也说不准!在这里,我使用了更接近我们在过去 7 年中发展的头衔,在格拉米纳

1。数据科学工程师(或)ML 工程师

Data Science Engineer or Specialist — Skill mix

将数据引导技能与深度编程(前端、后端或全栈)相结合的人属于这一类。这些角色在数据科学应用的应用编程、集成和云实施中至关重要。除了深厚的编码技能,这还需要精通数据处理、自动化洞察和端到端应用实施。一些组织将数据科学家视为这条职业道路上的高级角色。

2。数据分析师(或数据科学家

Data analyst — Skill mix

这些人用统计学和机器学习的技能来补充核心数据。虽然他们是设计分析方法和构建模型的权威,但他们利用自己的基本编程技能和领域定位来实现和评估模型的可解释性。

[## 是什么让机器学习项目中的数据科学家感到沮丧?

分析推销经常许诺月亮。在这个客户期望的幻想世界里,这 8 个神话挫败了…

towardsdatascience.com](/what-frustrates-data-scientists-in-machine-learning-projects-3398919a7c79)

3。信息设计师或可视化设计师

Information designer or Visualization — Skill mix

拥有核心用户界面和 UX 技能的设计师,同时也具备基础数据技能的强大基础,符合信息清单设计师的要求。从概念化到数据故事的创建,他们都扮演着重要的角色。让用户保持在宇宙的中心,他们迭代地驱动视觉智能层的设计。

[## 什么是高级数据可视化工程师?

最近在推特上有人问我一个问题,自从我成为一名…

medium.com](medium.com/@Elijah_Mee…)

4。功能数据顾问(或)数据翻译

Functional data consultant — Skill mix

功能数据顾问将他们的领域知识与基本的数据技能相结合,充当业务用户和数据科学团队之间的桥梁。他们在团队中发挥着强大的影响力,让客户了解数据驱动的用例,同时保持分析解决方案的业务驱动性和可操作性。

转变为数据科学领域的独角兽

Making of a unicorn — the secret sauce (Photo by Caroline Attwood on Unsplash)

数据科学中的这 4 个关键角色展示了来自不同背景(编程、统计、设计和领域)的人如何将他们的先天技能转化为分析项目中有影响力的角色。正是强大的基础加上对数据和业务应用的热情,使得它们对组织来说是无价的。

如果这 4 个角色中的质量从业者在行业中非常受欢迎,并且供不应求,那么是什么造就了数据科学中的独角兽?什么样的神奇组合能让一个人变得无价?

回想一下我们的数据科学自助菜单,当人们可以从这里检查任何 3 种技能时,这种卓越的能力就诞生了,并且每种技能都有卓越的掌握水平。俗话说,事后看起来总是更容易。让我们回顾一些技能组合,看看这些人在哪些领域是不可替代的。

Making of a unicorn — the special mix of skills

  • **数据引导+统计,ML +深度编程:**一个专家,他负责设计完全打包的数据科学产品。
  • **数据 bootstrap +统计学,ML +深度领域:**构思并原型化深度、垂直化数据科学应用的专家。
  • **数据引导+信息设计+深度编程:**讲述故事的大师,提供令人愉快的数据科学应用。
  • **数据引导+信息设计+深度领域:**经营领域深度 UX 咨询的专家,设计企业数据科学应用。
  • **数据引导+深度领域+深度编程:**罕见的技术功能数据科学专家的属性。

正如您在上面看到的,只需再增加一项具有高水平专业知识的数据科学技能,就可以转变一个人的角色。这将一个人的能力、贡献和价值推出公园,从而产生更大的影响。

你可能会问,如果你能积累 4 种或更多这些技能呢?好吧,那你就当自己是数据科学的半神吧。或者,正如著名的万事达卡活动所说,你在数据科学行业的价值变得*‘真正无价!’。*

摘要

为了成功解决客户的问题,数据科学项目需要关键技能的组合。通常,公司对一个职位的工作描述可能会要求大部分或所有这些技能。考虑到候选人能力的巨大差异,这只是一个尽可能多的重叠的尝试。

一个人不能组成一个团队。它需要十一点。—贝尔·布莱恩特,传奇足球教练

实际上,项目团队是根据人们的核心技能水平动态地配备各种角色的。可能会有分析计划设法在 3 个人中实现这种混合,而其他人可能会在 5 个人中实现。通常,为了更好的协调和更有效的结果,组织更喜欢具有跨学科技能的小团队。

人们进入这个行业时,不是没有建议的基础数据技能的广度,或者在关键技能领域缺乏深度吗?是的,但他们的贡献水平与其他人相比相形见绌,这一切都归结为在数据科学领域生存繁荣的问题。

候选人在上述两个或更多技能领域的能力越强,就越有可能做出有影响力的贡献。这因此转化为更高的感知价值,从而在面试中获得更好的谈判能力。为了更进一步,一个人需要有意识地选择另一种技能,并通过真正的深入投资于自己。

为了让你的钱得到最好的回报,把你的钱包投入到你的头脑中。—本杰明·富兰克林

如果你觉得这很有趣,你会喜欢我写的这些相关文章:

对数据科学充满热情?随时在LinkedIn上加我,订阅我的 简讯

CNN 和 spectrograms 做音频处理有什么问题?

原文:towardsdatascience.com/whats-wrong…

(Photo credit: Jack Hamilton)

近年来,用神经网络生成和处理图像已经取得了很大的成果。这可以部分归功于深度 CNN 捕捉和转换图像中高级信息的巨大性能。一个显著的例子是 L. Gatys 等人提出的使用 CNN 的图像风格转移过程。艾尔。它可以以不同的风格呈现图像的语义内容[1]。

Y. Li 等人很好地解释了神经风格转移的过程。al: “这种方法使用 CNN 不同层的神经激活的 Gram 矩阵来表示图像的艺术风格。然后,它使用迭代优化方法,通过将神经激活与内容图像匹配以及将 Gram 矩阵与风格图像匹配,从白噪声中生成新图像。

更简单地说,这些结果可以被认为是通过根据来自源内容和不同抽象级别的样式图像的特征组合来生成图像而实现的。例如,这可以是保持内容图像的高级结构和轮廓,同时结合样式图像的颜色和低级纹理特征。

An example of the transfer of style features (“B”) onto a content image (“A”) by L. Gatys et. al.

风格转换在视觉处理领域的表现已经相当令人印象深刻,并且如果能够实现类似的结果,它有助于乐观地看待“更智能”的音频处理算法。因为频谱图是音频频谱随时间的二维表示,所以已经尝试用 CNN 来分析和处理它们。已经表明,可以将光谱图作为图像进行处理,并使用 CNN 进行神经类型转移[3],但是,到目前为止,结果并不像视觉图像那样令人信服[4]。

为了克服这一挑战,并在神经音频处理中产生更好的结果,我们可能需要考虑为什么 CNN 的风格转换在频谱图上表现不佳。**本质上,这些技术应用机器视觉来做机器听觉。**我认为这提出了一个基本问题,可能会阻碍人工智能辅助技术在音频处理方面的进步。虽然这个问题无疑可以从许多角度来探讨,但探索图像和光谱图之间的差异,以及由此产生的视觉和听觉之间的一些差异,可能是值得的。

声音是“透明的”

在视觉图像和光谱图之间的比较中提出的一个挑战是,视觉对象和声音事件不会以相同的方式累积。用一个视觉类比,可以说声音总是“透明的”[4],而大多数视觉对象是不透明的。

当在图像中遇到某种颜色的像素时,通常可以认为它属于单个对象。离散的声音事件不会在声谱图上分成不同的层次:相反,它们会叠加在一起成为一个独特的整体。这意味着声谱图中的特定观察频率不能被假定为属于单个声音,因为该频率的幅度可能是由任何数量的累积声音产生的,甚至是由声波之间的复杂相互作用(如相位抵消)产生的。这使得很难在声谱图表示中分离同时发生的声音。

Three examples of difficult scenarios of spectrogram analysis. (Left): Two similar tones cause uneven phase cancellations across frequencies. (Middle): Two simultaneous voices with similar pitch are difficult to tell apart. (Right): Noisy and complex auditory scenes make it particularly difficult to distinguish sound events.

光谱图的轴不具有相同的意义

用于图像的 CNN 使用二维过滤器,其在 x 和 y 维度上共享权重[4]。如前所述,这建立在这样的假设上,即无论图像的位置如何,其特征都具有相同的含义。要做到这一点,您还应该假设数据的 x 轴和 y 轴对内容的含义具有相同的含义。例如,无论在图像中是水平移动还是垂直移动,人脸仍然是人脸。

在频谱图中,两个维度代表了根本不同的单位,一个是频率强度,另一个是时间。水平移动声音事件会在时间上偏移其位置,并且可以认为声音事件无论何时发生都意味着相同的事情。然而,垂直移动声音可能会影响它的意思:例如,向上移动男性声音的频率可能会将它的意思从男人变成孩子或妖精。对声音事件进行频移也可以改变其空间范围[4]。因此,2D CNN 提供的空间不变性可能不适用于这种形式的数据。

声音的频谱特性是非局部的

在图像中,相似的相邻像素通常可以被认为属于同一个视觉对象,但是在声音中,频率通常在声谱图上是非局部分布的[4]。周期性声音通常由基频和多个谐波组成,这些谐波由声源决定的关系分隔开。正是这些谐波的混合决定了声音的音色。

在女性声音的例子中,某一时刻的基频可能是 200 赫兹,而第一谐波是 400 赫兹,接下来是 600 赫兹等等。**这些频率不是局部分组的,而是根据一个共同的关系一起移动。**这使得使用 2D 卷积在光谱图中寻找局部特征的任务变得更加复杂,因为即使它们按照相同的因子移动,它们也经常不均匀地间隔开。

An illustration of the non-local distribution of frequencies in a female voice

声音本质上是连续的

在评估视觉环境时,我们可以多次“扫描”我们的周围环境,以定位场景中的每个视觉对象。由于大多数物体都是不动的,光线会以一种可预测的方式从它们身上反射,人们可以在脑海中绘制出它们在物理场景中的位置。从感知的角度来看,视觉对象被假定继续存在于它们被观察的位置,即使你看向别处。

对于声音来说,情况并非如此。声音采用压力波的物理形式,从听者的角度来看,这种波只在某一时刻以其当前状态存在。一旦这个时刻过去了,波也就过去了,远离了观察者。这就是为什么称这些现象为声音事件而不是物体是有意义的。从物理的角度来看,这意味着听众一次只能感受到一瞬间的声音。当图像被认为包含大量的静态并行信息时,声音则是高度串行的。

更恰当的比较是音频和视频之间的比较。这两种媒体都可以被概念化为描绘随时间的运动,其中跨时间的依赖性对于内容的经验意义是必不可少的。由于视频是由图像集合()构成的,它包含了更多的并行信息。

说明这一点的一个方法是在两种媒体中“*”冻结一段时间。查看视频的单个帧(通常描绘大约 1/25 秒的曝光时间),通常仍然可以收集关于视频的上下文、动作和场景的大量含义:可以识别单个对象,有时可以评估动作和移动。然而,当“冻结”*单个音频瞬间(例如大约 1/25 秒的相应集合)与频谱分析一起使用时,评估几乎不可能是全面的。可以收集关于信号的整体色调平衡和特征的一些背景,但是不能达到与视频相同的程度。

例如,不可能在时间范围之外识别单独的声音事件,以查看根据相同的时间模式发生了哪些频谱发展。唯一可以确定的是在特定时刻听到的声音的音调平衡。对此的解释可以追溯到之前讨论的声波的物理形式:声音不是作为可以平行观察的静态对象存在的,它们是作为气压序列到达的,并且关于这些压力的意义必须随着时间的推移而建立。

~1/25 second of video and audio respectively. (Left): A girl riding down a metal slide in a playground. (Right): A spectral representation of a traditional music performance from Senegal.

这些原因表明,作为传达意义的媒介,音频基本上是连续的,并且比视频更依赖于时间,这也是为什么在没有时间意识的情况下,输入图像处理网络的声音的视觉声谱图表示可能无法最佳工作的另一个原因。

一个模拟人类体验的案例

人工智能技术的重大突破是通过模拟人类系统实现的。虽然人工神经网络是与实际人类神经元的功能方式仅松散耦合的数学模型,但它们在解决复杂和模糊的现实世界问题方面的应用已经非常深远。在这些神经网络中对大脑的架构深度进行建模,为学习更有意义的数据表示提供了广泛的可能性。在图像识别和处理中,来自 CNN 中视觉系统的复杂和更具空间不变性的细胞的灵感也对我们的技术状态产生了巨大的改进。

正如 J. B .艾伦在中所言:“人类是如何处理和识别语音的?”,只要人类的感知能力超过机器,我们就能通过理解人类系统的原理而获益[5]。人类通常在感知任务方面非常熟练 人类理解和人工智能现状之间的反差在机器听觉领域变得尤为明显。考虑到在视觉处理中从人类系统中获得灵感的好处(以及视觉模型在声音中表现不佳的论点),我建议我们从具有神经网络的机器听觉中获得类似的过程。

这是一个更大的机器听觉项目的一部分。如果您错过了其他文章,请点击下面的链接了解最新情况:

背景:AI 在音频处理中的承诺 第一部分: 仿人机器听觉带 AI (1/3) 第二部分 : 仿人机器听觉带 AI (2/3) 第三部分 : 仿人机器听觉带 AI (3/3)

参考资料:

[1] L. A. Gatys,A. S. Ecker,M. Bethge,“使用卷积神经网络的图像风格转移”,2016 年 IEEE 计算机视觉和模式识别会议(CVPR),2016 年,第 2414–2423 页。

[2]李,王,刘,侯,“揭开神经类型迁移的神秘面纱”,2017 年 1 月.

[3] P .维尔马和 J. O .史密斯,“音频频谱图的神经风格转移”,2018 年 1 月。

[4] L .怀斯。2017.用卷积神经网络处理的音频频谱图表示。与 IJCNN 联合举办的首届深度学习与音乐国际研讨会论文集。美国安克雷奇。2017 年 5 月。1①。第 37-41 页。黄金分割指数:10.13140

[5] J. B. Allen,“人类如何处理和识别语音?,“IEEE Trans。语音音频过程。,第 2 卷,第 4 号,第 567-577 页,1994 年。