TowardsDataScience 博客中文翻译 2020(五十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 正则表达式的简明介绍

原文:https://towardsdatascience.com/a-gentle-introduction-to-regular-expressions-with-python-4f3fce46dcb4?source=collection_archive---------40-----------------------

教程| Python

正则表达式是数据科学家对付非结构化文本最强大的武器

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

照片由 Marius MasalarUnsplash 上拍摄

我们生活在一个以数据为中心的时代。数据已被描述为新油。但是就像石油一样,原始数据并不总是有用的。一种在其原始形式下特别难以使用的数据形式是 非结构化数据

很多数据是非结构化数据。非结构化数据不太适合用于分析的格式,比如 Excel 电子表格或 pandas DataFrame 。文本数据是一种常见的非结构化数据,这使得它很难处理。输入 正则表达式 ,简称 regex 。一开始它们可能看起来有点吓人,但是一旦你开始使用它们,你很快就会像这条蛇一样舒服了🐍!

更适应 python?试试我的教程,用 R 代替 regex:

[## R 正则表达式的简明介绍

正则表达式是数据科学家对付非结构化文本最强大的武器。他们曾经是野餐…

medium.com](https://medium.com/@atseewal/a-gentle-introduction-to-regular-expressions-with-r-df5e897ca432)

正则表达式模块(re)

我们将使用正则表达式模块。要将其导入 python 项目,请使用以下命令:

看到多简单了吗?re模块内置在 python 中,不需要安装。让我们来看看本模块中提供的几个功能:

  1. re.findall(pattern, string):该函数返回一个包含stringpattern所有实例的列表
  2. re.sub(pattern, repl, string):该函数返回string,将string中的pattern实例替换为repl

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

蒂姆·柯林斯在 Unsplash 上拍摄的照片

您可能已经使用过这些功能。他们有非常简单的应用程序,不需要添加正则表达式。回想一下社交距离之前的时代,想象一下在公园里的一次美好野餐。这里有一个例子,是每个人带去野餐的东西。我们可以用它来演示 regex 函数的基本用法:

basic_string = 'Drew has 3 watermelons, Alex has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels'

如果我想从这个字符串中提取一个人名字的每个实例,我只需将名字和basic_string传递给re.findall():

re.findall()的基本用法

结果将是一个包含该模式所有实例的列表。使用这个例子,basic_find将是一个带有一个条目的列表:

['Drew']

现在让我们想象一下,亚历克斯把他的 4 个汉堡包忘在野餐的地方,被肖恩偷走了。re.sub()可以用 Shawn 替换 Alex 的任何实例:

re.sub()的基本用法

结果字符串将显示 Shawn 现在有 4 个汉堡包。多么幸运的家伙🍔。

Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels

到目前为止,这些例子都很基本。他们有一个时间和地点,但是如果我们想知道野餐中总共有多少食物呢?有物品的都是些什么人?如果我们需要熊猫数据框架中的这些数据来进行进一步分析,该怎么办?这就是你开始看到 regex 的好处的地方。

正则表达式词汇

驱动正则表达式的有几个概念:

  1. 字符集
  2. 元字符
  3. 量词
  4. 捕获组

这不是一个详尽的列表,但足以帮助我们立即行动。

字符集

字符集表示括号内的选项,正则表达式只匹配其中一个选项。我们可以对字符集做很多事情:

  • 匹配一组字符:我们可以通过将每个元音放在括号中找到字符串中的所有元音,例如[aeiou]

用括号组查找所有元音

['e', 'a', 'a', 'e', 'e', 'o', 'e', 'a', 'a', 'u', 'e', 'a', 'i', 'a', 'a', 'a', 'a', 'e', 'a', 'a', 'a', 'o', 'e', 'e']
  • 匹配一个范围的字符:通过使用连字符[A-F],我们可以找到从“A”到“F”的任何大写字母。字符集区分大小写,所以[A-F][a-f]不一样

查找所有带括号组的大写字母

['D', 'A', 'K', 'A']
  • 匹配一个范围的数字:我们可以通过添加数字到我们的字符集来查找一个范围内的数字,[0-9]查找任何数字。

用括号组查找所有数字

['3', '4', '1', '2', '6']

字符集可以同时包含这一部分的所有内容,所以类似于[A-Ct-z7-9]的内容仍然有效。它将匹配从大写字母“A”到大写字母“C”、小写字母“t”到小写字母“z”以及 7 到 9 的所有字符。

到目前为止,我们还不能回答之前提出的关于括号组的任何问题。让我们为我们的正则表达式库添加更多的武器。

元字符

元字符代表一种类型的字符。它们通常以反斜杠\开头。每一个都匹配一个字符。以下是一些最重要的例子:

  • \s:这个元字符代表空格。这将匹配每个空格、制表符和换行符。您还可以分别为制表符和换行符指定\t\n。附注:我们的示例字符串没有任何制表符,但是在寻找它们时要小心。许多集成开发环境或 IDE 都有一个设置,当你输入时,它会用空格替换所有的制表符。在示例字符串中,\s返回一个包含 17 个空格的字符串,这正好是示例字符串中的空格数!

动作中的元角色

[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
  • \w:该元字符代表字母数字字符。这包括所有字母 a-z,大写和小写,以及数字 0-9。这相当于括号组[A-Za-z0-9],只是写起来更快。注意记住\w元字符本身只捕获单个字符,而不是整个单词或数字。你会在例子中看到。别担心,我们很快就会知道如何处理。

\w 活动中的元字符

['D', 'r', 'e', 'w', 'h', 'a', 's', '3', 'w', 'a', 't', 'e', 'r', 'm', 'e', 'l', 'o', 'n', 's', 'A', 'l', 'e', 'x', 'h', 'a', 's', '4', 'h', 'a', 'm', 'b', 'u', 'r', 'g', 'e', 'r', 's', 'K', 'a', 'r', 'i', 'n', 'a', 'h', 'a', 's', '1', '2', 't', 'a', 'm', 'a', 'l', 'e', 's', 'a', 'n', 'd', 'A', 'n', 'n', 'a', 'h', 'a', 's', '6', 's', 'o', 'f', 't', 'p', 'r', 'e', 't', 'z', 'e', 'l', 's']
  • \d:该元字符代表数字。使用我们之前的野餐例子,看看它如何只找到字符串中的数字。你会注意到,像括号组一样,它选取 5 个数字,而不是我们期望的 4 个。这是因为它寻找的是每个单独的数字,而不是一组数字。接下来我们将看到如何用量词来解决这个问题。

\d 活动中的元字符

['3', '4', '1', '2', '6']

量词

正如我们在上一节中看到的,单个元字符的功能有限。当涉及到单词或数字时,我们通常希望一次找到 1 个以上的字符。这就是量词的用武之地。它们允许你量化你期望的字符数量。他们总是在被量化的人物之后出现,有几种类型:

  • +量化 1 个或多个匹配。让我们看一个新的例子来开发一些关于每个量词将返回什么的直觉:quant_example

显示量词的示例字符串

当我们在quant_example上使用+量词时,它将返回 4 个匹配。提到 regex 寻找非重叠匹配是一个很好的理由。在这种情况下,它会查看每个 B 及其后面的字符。因为我们使用了+量词,所以它继续匹配,直到到达一组 B 的末尾。

实际中的+量词

['B', 'BB', 'BBB', 'BBBB']
  • {}量化特定数量或范围的匹配。当像{2}这样书写时,它将精确匹配前面的 2 个字符。我们会看到一些有趣的结果。它找到了 4 根火柴。这是因为它正在寻找每个不重叠的 2 B 组。第 1 组中有一个匹配,第 2 组中只有 1 个非重叠匹配,第 4 组中有 2 个非重叠匹配。
['BB', 'BB', 'BB', 'BB']

当写成类似{2,4}的形式时,它将匹配出现 2 到 4 次的任意数量的 B。注意,在正则表达式中放一个空格是无效的。它将返回一个空列表。

['BB', 'BBB', 'BBBB']

我们也可以写这个量词,像{2,}一样省略上界。这将匹配 2 个或更多实例。对于quant_example,它将返回与{2,4}完全相同的结果。

  • *量化零个或多个匹配项**。这在我们寻找可能在字符串中也可能不在字符串中的东西时很有帮助。**

*量词单独使用时会返回一些奇怪的匹配,所以我们可以省略一个用quant_example的例子。我们将在下面的例子中看到,当某人在我们的野餐中带了一个有多个单词名称的食物时,它是如何应用的。没有它,我们就不会正确地捕捉到安娜带来了软椒盐卷饼!

让我们结合目前所知的字符集、元字符和量词来回答一些关于我们的野餐字符串的问题。我们想知道字符串中的所有单词,以及字符串中的数字。

对于单词,我们可以使用一个全部大写和小写字母的字符集,给它添加一个+量词。这将找到任何长度的字母字符组合在一起。换句话说,它会找到所有的单词。Regex 看起来越来越有用了。

['Drew', 'has', 'watermelons', 'Alex', 'has', 'hamburgers', 'Karina', 'has', 'tamales', 'and', 'Anna', 'has', 'soft', 'pretzels']

为了找到每种食物的数量,我们可以使用\d元字符和量词{1,2}。这将查找长度为 1 或 2 个字符的数字组。这是一个更有用的输出,因为我们有同样数量的食物和人!

['3', '4', '12', '6']

为了找到每种食物的数量和名称,我们可以将量词和元字符结合起来。我们知道每个数字后面都有一个食物项目,所以我们可以添加到前面的例子中。我们知道有一个空格和一个单词(\s\w+)后面可以跟另一个单词,比如“软椒盐卷饼”是如何出现的。要指定第二个词可能不在那里,我们可以用量词*与第二个词连用。就像这样,我们有一份清单,上面列有野餐中所有物品的数量和名称。

['3 watermelons', '4 hamburgers', '12 tamales', '6 soft pretzels']

捕获组

捕获组允许您查找整个短语,并且只返回其中的一部分。以我们的例子为例,我需要每个人的名字,他们带了什么,带了多少。

['Drew has 3 watermelons',
 'Alex has 4 hamburgers',
 'Karina has 12 tamales',
 'Anna has 6 soft pretzels']

我们在capture_group1中使用的正则表达式正在寻找一个名称,它以一个大写字母开始,后面有任意数量的小写字母([A-Z][a-z]+)。然后在一个空格之后,它匹配模式空格,单词,空格\s\w+\s。接下来,我们要寻找一个 1 到 2 位数的数字,后跟一个空格和一个单词(\d{1,2}\s\w+)。您可以在输出中看到,我们得到了一个字符串,其中包含每个人的详细信息。

现在这是从我们开始的地方前进了一大步,但是我们真的不在乎“有”这个词,我们希望能够从数量上制作一个熊猫的数据框架。让我们添加捕获组。通过使用捕获组,我们可以返回一个包含所需信息的元组。我们将创建包含每个名称、数量和项目的捕获组。捕获组只是用括号括起来的正则表达式的一部分。

[('Drew', '3', 'watermelons'), ('Alex', '4', 'hamburgers'), ('Karina', '12', 'tamales'), ('Anna', '6', 'soft pretzels')]

就这样,我们现在有了一个元组列表,其中包含了我们想要的确切信息!

将我们的文本组合成一个数据帧

在进行数据分析时,最有用的 python 数据结构之一是 pandas 数据框架。毫无疑问,如果你点击了这篇文章,你就已经知道了。数据框架支持计算列统计数据和绘制数据。因为我们有一个元组列表,其中包含了我们想要的数据帧中的所有信息,所以我们可以遍历这个列表,构建我们的数据帧。

| Name   | Quantity | Item          |
| ------ | -------- | ------------- |
| Drew   | 3        | watermelons   |
| Alex   | 4        | hamburgers    |
| Karina | 12       | tamales       |
| Anna   | 6        | soft pretzels |

结论和进一步学习

我们只讨论了 regex 如何帮助处理非结构化文本数据的一小部分。这是一个很好的入门基础,但是不久之后你将需要知道一些概念,比如如何找到除了一个字符之外的所有内容(否定),或者找到紧接在其他内容之前或之后的内容(环视)。查看我关于这些概念的另一篇文章。

[## 起锚!更多你希望知道的 Python 正则表达式

使用 Python 中的高级正则表达式工具处理文本的秘密

towardsdatascience.com](/anchors-away-more-python-regular-expressions-you-wish-you-knew-8a7780ac54e9)

这里有更多的资源可以帮助您了解 regex 中的其他概念:

  • 官方 [re](https://docs.python.org/3/library/re.html) 文档:虽然文档看起来令人生畏,但是学习如何阅读它只会在你编程的时候对你有所帮助
  • w3schools 参考资料:庞大的编码和脚本语言参考资料知识库,包括 python。他们的许多例子都可以通过点击“自己尝试”按钮直接在浏览器上运行
  • Datacamp 课程(付费链接):一个致力于数据科学、机器学习和数据可视化的在线学习社区。查看他们的课程“Python 中的正则表达式”网站上每门课程的第一章都是免费的!

[## 通过我的推荐链接加入 Medium-Drew Seewald

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

realdrewdata.medium.com](https://realdrewdata.medium.com/membership)

R 正则表达式的简明介绍

原文:https://towardsdatascience.com/a-gentle-introduction-to-regular-expressions-with-r-df5e897ca432?source=collection_archive---------13-----------------------

教程| R |正则表达式(Regex)

正则表达式是数据科学家对付非结构化文本最强大的武器

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

蒂姆·柯林斯在 Unsplash 上拍摄的照片

我们生活在一个以数据为中心的时代。数据已被描述为新油。但是就像石油一样,原始数据并不总是有用的。一种在其原始形式下特别难以使用的数据形式是 非结构化数据

很多数据是非结构化数据。非结构化数据不太适合分析格式,比如 Excel 电子表格或数据框。文本数据是一种常见的非结构化数据,这使得它很难处理。输入正则表达式,简称 regex 。一开始它们可能看起来有点吓人,但是一旦你开始使用,使用它们将会很容易!

更适应 python?请尝试我的教程来使用 python 的正则表达式:

[## Python 正则表达式的简明介绍

正则表达式是数据科学家对付非结构化文本最强大的武器

towardsdatascience.com](/a-gentle-introduction-to-regular-expressions-with-python-4f3fce46dcb4)

stringr图书馆

我们将使用stringr库。stringr库是基于 C 库构建的,所以它的所有功能都非常快。

要在 R 中安装和加载stringr库,使用以下命令:

看到多简单了吗?更简单的是,stringr包中的大多数函数名都以str开头。让我们来看看本模块中提供的几个功能:

  1. str_extract_all(string, pattern):该函数返回一个包含stringpattern所有实例的向量列表
  2. str_replace_all(string, pattern, replacement):该函数返回string,将string中的pattern实例替换为replacement

您可能已经使用过这些功能。他们有非常简单的应用程序,不需要添加正则表达式。回想一下社交距离之前的时代,想象一次公园里的野餐,就像上面的图片。这里有一个例子,是每个人带去野餐的东西。我们可以用它来演示 regex 函数的基本用法:

basicString <- "Drew has 3 watermelons, Alex has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"

如果我想从这个字符串中提取一个人名字的每个实例,我只需将名字和basic_string传递给str_extract_all():

结果将是一个包含该模式所有实例的列表。使用这个例子,basicExtractAll将有下面的列表,其中 1 个向量作为输出:

[[1]]
[1] "Drew"

现在让我们想象一下,亚历克斯把他的 4 个汉堡包忘在野餐的地方,被肖恩偷走了。str_replace_all可以用 Shawn 替换 Alex 的任何实例:

结果字符串将显示肖恩现在有 4 个汉堡。多么幸运的家伙🍔。

"Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"

到目前为止,这些例子都很基本。他们有一个时间和地点,但是如果我们想知道野餐中总共有多少食物呢?有物品的都是些什么人?如果我们需要数据框中的这些数据来进行进一步分析,该怎么办?这就是你开始看到 regex 的好处的地方。

正则表达式词汇

驱动正则表达式的有几个概念:

  1. 字符集
  2. 元字符
  3. 量词
  4. 捕获组

这不是一个详尽的列表,但足以帮助我们立即行动。

字符集

字符集表示括号内的选项,正则表达式只匹配其中一个选项。我们可以对字符集做很多事情:

  • 匹配一组字符:我们可以通过将每个元音放在括号中找到字符串中的所有元音,例如[aeiou]
[[1]]
 [1] "e" "a" "a" "e" "e" "o" "e" "a" "a" "u" "e" "a" "i" "a"
[15] "a" "a" "a" "e" "a" "a" "a" "o" "e" "e"
  • 匹配一个范围的字符:我们可以通过使用连字符[A-F]找到从“A”到“F”的任何大写字母。字符集区分大小写,因此[A-F][a-f]不同
[[1]]
[1] "D" "A" "K" "A"
  • 匹配一个范围的数字:我们可以通过添加数字到我们的字符集中来查找一个范围内的数字,[0-9]来查找任何数字。请注意,这些数字是作为字符串提取的,而不是转换成数字
[[1]]
[1] "3" "4" "1" "2" "6"

字符集可以同时包含这一部分的所有内容,所以类似于[A-Ct-z7-9]的内容仍然有效。它将匹配从大写字母“A”到大写字母“C”、小写字母“t”到小写字母“z”以及 7 到 9 的所有字符。

到目前为止,我们还不能回答之前提出的关于括号组的任何问题。让我们为我们的正则表达式库添加更多的武器。

元字符

元字符代表一种类型的字符。它们通常以反斜杠\开头。由于反斜杠\是 R 中的一个特殊字符,每次和另一个反斜杠一起使用时都需要进行转义。换句话说, R 在使用元字符时需要 2 个反斜杠。每个元字符将匹配单个字符。以下是一些最重要的例子:

  • \\s:这个元字符代表空格。这将匹配每个空格、制表符和换行符。您还可以分别为制表符和换行符指定\\t\\n。附注:我们的示例字符串没有任何制表符,但是在寻找它们时要小心。许多集成开发环境或 IDE 都有一个设置,当你输入时,它会用空格替换所有的制表符。在示例字符串中,\\s返回一个包含 17 个空格的向量列表,这是示例字符串中空格的确切数目!
[[1]]
 [1] " " " " " " " " " " " " " " " " " " " " " " " " " " " "
[15] " " " " " "
  • \\w:该元字符代表字母数字字符。这包括所有字母 a-z,大写和小写,以及数字 0-9。这相当于括号组[A-Za-z0-9],只是写起来更快。记住\\w元字符本身只捕获单个字符,而不是整个单词或数字。你会在例子中看到。不要担心,我们将在下一节处理这个问题。
[[1]]
 [1] "D" "r" "e" "w" "h" "a" "s" "3" "w" "a" "t" "e" "r" "m"
[15] "e" "l" "o" "n" "s" "A" "l" "e" "x" "h" "a" "s" "4" "h"
[29] "a" "m" "b" "u" "r" "g" "e" "r" "s" "K" "a" "r" "i" "n"
[43] "a" "h" "a" "s" "1" "2" "t" "a" "m" "a" "l" "e" "s" "a"
[57] "n" "d" "A" "n" "n" "a" "h" "a" "s" "6" "s" "o" "f" "t"
[71] "p" "r" "e" "t" "z" "e" "l" "s"
  • \\d:该元字符代表数字。使用我们的野餐例子,看看它如何只找到字符串中的数字。你会注意到,像括号组一样,它选取 5 个数字,而不是我们期望的 4 个。这是因为它寻找的是每个单独的数字,而不是一组数字。接下来我们将看到如何用量词来解决这个问题。
[[1]]
[1] "3" "4" "1" "2" "6"

量词

正如我们在上一节中看到的,单个元字符的功能有限。当涉及到单词或数字时,我们通常希望一次找到 1 个以上的字符。这就是量词的用武之地。它们允许你量化你期望的字符数量。他们总是在被量化的人物之后出现,有几种类型:

  • +量化 1 个或多个匹配。让我们看一个新的例子来开发一些关于每个量词将返回什么的直觉:quantExample

当我们在quantExample上使用+量词时,它将返回 4 个匹配。提到 regex 寻找非重叠匹配是一个很好的理由。在这种情况下,它会查看每个 B 及其后面的字符。因为我们使用了+量词,所以它继续匹配,直到到达一组 B 的末尾。

[[1]]
[1] "B"    "BB"   "BBB"  "BBBB"
  • {}量化特定数量或范围的匹配。当像{2}这样书写时,它将精确匹配前面的 2 个字符。我们会看到一些有趣的结果。它找到了 4 根火柴。这是因为它正在寻找每个不重叠的 2 B 组。第 1 组中有一个匹配,第 2 组中只有 1 个非重叠匹配,第 4 组中有 2 个非重叠匹配。
[[1]]
[1] "BB" "BB" "BB" "BB"

当写成类似{2,4}的形式时,它将匹配出现 2 到 4 次的任意数量的 B。注意,在正则表达式中放一个空格是无效的。它将返回一个空列表。

[[1]]
[1] "BB"   "BBB"  "BBBB"

我们也可以写这个量词,像{2,}一样省略上界。这将匹配 2 个或更多实例。对于quantExample,它将返回与{2,4}完全相同的结果。

  • *量化零个或多个匹配项**。这在我们寻找可能在字符串中也可能不在字符串中的东西时很有帮助。**

*量词单独使用时会返回一些奇怪的匹配,所以我们可以省略一个用quantExample的例子。我们将在下面的例子中看到,当某人在我们的野餐中带来一个有多个单词名称的食物时,它是如何应用的。没有它,我们就不会正确地捕捉到安娜带来了软椒盐卷饼!

让我们结合目前所知的字符集、元字符和量词来回答一些关于我们的野餐字符串的问题。我们想知道字符串中的所有单词,以及字符串中的数字。

对于单词,我们可以使用一个全部大写和小写字母的字符集,给它添加一个+量词。这将找到任何长度的字母字符组合在一起。换句话说,它会找到所有的单词。Regex 看起来越来越有用了。

[[1]]
 [1] "Drew"        "has"         "watermelons" "Alex"       
 [5] "has"         "hamburgers"  "Karina"      "has"        
 [9] "tamales"     "and"         "Anna"        "has"        
[13] "soft"        "pretzels"

为了找到每种食物的数量,我们可以使用\\d元字符和量词{1,2}。这将查找长度为 1 或 2 个字符的数字组。这是一个更有用的输出,因为我们有同样数量的食物和人!

[[1]]
[1] "3"  "4"  "12" "6"

为了找到每种食物的数量和名称,我们可以将量词和元字符结合起来。我们知道每个数字后面都有一个食物项目,所以我们可以添加到前面的例子中。我们知道有一个空格和一个单词(\\s\\w+)后面可以跟另一个单词,比如“软椒盐卷饼”是如何出现的。要指定第二个词可能不在那里,我们可以用量词*与第二个词连用。就像这样,我们有一份清单,上面列有野餐中所有物品的数量和名称。

[[1]]
[1] "3 watermelons"   "4 hamburgers"    "12 tamales"     
[4] "6 soft pretzels"

捕获组

捕获组允许您查找整个短语,并且只返回其中的一部分。以我们的例子为例,我需要每个人的名字,他们带了什么,带了多少。到目前为止,我们一直使用str_extract_all。它有一个清晰的输出,对于我们的例子来说很容易阅读,但是它实际上不能与捕获组一起工作。有帮助的是,stringr提供了str_match_all,它确实可以与捕获组一起工作。但是,它输出的结果是包含矩阵的列表,而不是包含向量的列表。

[[1]]
     [,1]
[1,] "Drew has 3 watermelons"
[2,] "Alex has 4 hamburgers"
[3,] "Karina has 12 tamales"
[4,] "Anna has 6 soft pretzels"

我们在captureGroup1中使用的正则表达式正在寻找一个名称,它以一个大写字母开始,后面有任意数量的小写字母([A-Z][a-z]+)。然后在一个空格之后,它匹配模式空格、单词、空格\\s\\w+\\s。接下来,我们寻找一个 1 到 2 位数的数字,后跟一个空格和一个单词(\\d{1,2}\\s\\w+)。您可以在输出中看到矩阵的每一行都是一个字符串,包含每个人的详细信息。

现在,这是从我们开始的地方迈出的一大步,但我们并不真正关心“有”这个词,我们希望能够从数量中制作一个数据框。让我们添加捕获组。通过使用捕获组,我们可以返回一个矩阵,其中每一列包含一条特定的信息。我们将创建包含每个名称、数量和项目的捕获组。捕获组只是用括号括起来的正则表达式的一部分。

[[1]]
     [,1]                       [,2]     [,3]  [,4]
[1,] "Drew has 3 watermelons"   "Drew"   "3"   "watermelons"
[2,] "Alex has 4 hamburgers"    "Alex"   "4"   "hamburgers"
[3,] "Karina has 12 tamales"    "Karina" "12"  "tamales"
[4,] "Anna has 6 soft pretzels" "Anna"   "6"   "soft pretzels"

矩阵中的第一列包含整个正则表达式,忽略了捕获组。矩阵的其余列分别对应于我们为名称、数量和项目定义的捕获组。

将我们的文本合并到一个数据框中

在进行数据分析时,最有用的 R 数据结构之一是数据帧。毫无疑问,如果你点击了这篇文章,你就已经知道了。数据框支持计算列统计数据和绘制数据等功能。因为我们有一个包含所有我们想要的信息的矩阵,把它转换成一个数据框架并不太难。除了矩阵的第一列,我们将对所有内容使用data.frame函数。data.frame给出了默认的列名,所以我们将修改它们以匹配每一列中的内容。

关于符号的一个快速注释:在captureGroup2 ( [[1]])之后的第一组括号访问列表的第一个元素,我们的矩阵。第二组括号([,-1])选择除第一行以外的所有行和列。

|   | Name   | Quantity | Item          |
| - | ------ | -------- | ------------- |
| 1 | Drew   | 3        | watermelons   |
| 2 | Alex   | 4        | hamburgers    |
| 3 | Karina | 12       | tamales       |
| 4 | Anna   | 6        | soft pretzels |

结论和进一步学习

我们只讨论了 regex 如何帮助处理非结构化文本数据的一小部分。这是一个很好的入门基础,但是不久之后你将需要知道一些概念,比如如何找到除了一个字符之外的所有内容(否定),或者找到紧接在其他内容之前或之后的内容(环视)。你可以在我的后续文章中了解这些:

[## 起锚!R 中更多的正则表达式概念

更先进的正则表达式工具,为您的 R 文本争论武器库

medium.com](https://medium.com/@atseewal/anchors-away-more-regex-concepts-in-r-f00fe7f07d52)

这里有更多的资源可以帮助您了解 regex 中的其他概念:

  • tidy verse 网站官方 [stringr](https://stringr.tidyverse.org/index.html) 页面: RStudio 的伙计们整理了资源帮助学习stringr之类的软件包。他们甚至包括一个[stringr](https://github.com/rstudio/cheatsheets/blob/master/strings.pdf) 备忘单,你可以打印出来参考。
  • R for Data Science :作者 Hadley Wickham,stringr package 的作者,这本书对于 R 中的任何东西都是一个很好的参考。甚至有一章涵盖了 R 中更高级的正则表达式。它可以在网上免费获得这里,或者你可以在这里购买硬拷贝免责声明:我通过此链接收到您购买的佣金
  • Datacamp 课程:一个致力于数据科学、机器学习和数据可视化的在线学习社区。查看他们的课程“用 r 中的 stringr 进行字符串操作”,网站上每个课程的第一章都是免费的!免责声明:如果您使用 链接注册每月 Datacamp 订阅,您将获得订阅折扣,我将获得佣金。在你学习的同时支持我的写作!

[## 通过我的推荐链接加入 Medium-Drew Seewald

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

realdrewdata.medium.com](https://realdrewdata.medium.com/membership)

自我训练和半监督学习简介

原文:https://towardsdatascience.com/a-gentle-introduction-to-self-training-and-semi-supervised-learning-ceee73178b38?source=collection_archive---------1-----------------------

用 Python 编写一个利用未标记数据进行分类的自我训练示例

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

照片由珍妮·希尔Unsplash 拍摄

当涉及到机器学习分类任务时,可用于训练算法的数据越多越好。在监督学习中,这些数据必须根据目标类进行标记,否则,这些算法将无法学习自变量和目标变量之间的关系。但是,在构建用于分类的大型标记数据集时,会出现一些问题:

  1. **标注数据可能非常耗时。**假设我们有 1,000,000 张狗的图像要输入到一个分类算法中,目标是预测每张图像中是否包含一只波士顿梗。如果我们想将所有这些图像用于监督分类任务,我们需要一个人来查看每张图像,并确定是否存在波士顿梗。虽然我有朋友(和妻子)不介意整天浏览狗狗照片,但这可能不是我们大多数人想要的周末。
  2. 标注数据可能会很贵。请看原因 1:为了让某人费力地搜索 100 万张狗的照片,我们可能不得不支付一些现金。

那么,如果我们只有足够的时间和金钱来标记大型数据集的某些部分,而选择不标记其余部分,会怎么样呢?这种未标记的数据可以用在分类算法中吗?

这就是半监督学习的用武之地。在采用半监督方法时,我们可以在少量标记数据上训练分类器,然后使用分类器对未标记数据进行预测。因为这些预测可能比随机猜测更好,所以未标记的数据预测可以在分类器的后续迭代中被用作“伪标记”。虽然半监督学习有很多种风格,但这种特定的技术被称为自我训练

自我训练

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

自我训练

在概念层面上,自我训练是这样的:

步骤 1: 将标记的数据实例分割成训练集和测试集。然后,在标记的训练数据上训练分类算法。

步骤 2: 使用训练好的分类器来预测所有未标记数据实例的类别标签。在这些预测的类别标签中,正确概率最高的被采用作为’伪标签’

(步骤 2 的几个变体: a) 所有预测的标签可以一次被采用为‘伪标签’,而不考虑概率,或者 b) 【伪标签】数据可以通过预测的置信度来加权。)

步骤 3: 将“伪标记的”数据与标记的训练数据连接起来。在组合的“伪标记”和标记的训练数据上重新训练分类器。

步骤 4: 使用训练好的分类器来预测标记的测试数据实例的类别标签。使用您选择的度量评估分类器性能。

(可以重复步骤 1 至 4,直到步骤 2 中不再有预测的类别标签满足特定的概率阈值,或者直到不再有未标记的数据剩余。)

好的,明白了吗?很好!让我们看一个例子。

示例:使用自我训练来改进分类器

为了演示自我训练,我使用了 Python 和 surgical_deepnet 数据集,可从 Kaggle 上的这里获得。该数据集旨在用于二元分类,包含 14.6k+手术的数据。这些属性是 bmi、年龄和各种其他指标,而目标变量并发症记录了患者是否因手术而出现并发症。显然,能够准确预测患者是否会遭受手术并发症,将符合医疗保健和保险提供商的最大利益。

进口

对于本教程,我导入了 numpypandasmatplotlib 。我还将使用来自 sklearnLogisticRegression 分类器,以及 f1_scoreplot_confusion_matrix 函数进行模型评估。

加载数据

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 14635 entries, 0 to 14634
Data columns (total 25 columns):
bmi                    14635 non-null float64
Age                    14635 non-null float64
asa_status             14635 non-null int64
baseline_cancer        14635 non-null int64
baseline_charlson      14635 non-null int64
baseline_cvd           14635 non-null int64
baseline_dementia      14635 non-null int64
baseline_diabetes      14635 non-null int64
baseline_digestive     14635 non-null int64
baseline_osteoart      14635 non-null int64
baseline_psych         14635 non-null int64
baseline_pulmonary     14635 non-null int64
ahrq_ccs               14635 non-null int64
ccsComplicationRate    14635 non-null float64
ccsMort30Rate          14635 non-null float64
complication_rsi       14635 non-null float64
dow                    14635 non-null int64
gender                 14635 non-null int64
hour                   14635 non-null float64
month                  14635 non-null int64
moonphase              14635 non-null int64
mort30                 14635 non-null int64
mortality_rsi          14635 non-null float64
race                   14635 non-null int64
complication           14635 non-null int64
dtypes: float64(7), int64(18)
memory usage: 2.8 MB

数据集中的属性都是数值型的,没有缺失值。因为我在这里的重点不是数据清理,所以我将继续对数据进行分区。

数据分割

为了试验自我训练,我需要将数据分成三部分:一个训练集,一个测试集,和一个未标记集。我将按照以下比例分割数据:

1%列车(贴有标签)

25%测试(贴有标签)

74%未标注

对于未标记的集合,我将简单地删除目标变量complexity,并假装它从未存在过。因此,在这种情况下,我们假设 74%的手术病例没有关于并发症的信息。我这样做是为了模拟这样一个事实,即在现实世界的分类问题中,许多可用的数据可能没有类标签。然而,如果我们确实有一小部分数据的类别标签(在这种情况下是 1%),那么半监督学习技术就可以用来从未标签数据中得出结论。

下面,我重组数据,生成索引来划分数据,然后创建测试、训练和未标记的分割。然后我检查裂缝的尺寸,以确保一切按计划进行。

X_train dimensions: (146, 24)
y_train dimensions: (146,)

X_test dimensions: (3659, 24)
y_test dimensions: (3659,)

X_unlabeled dimensions: (10830, 24)

班级分布

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

多数阶级(不复杂)的实例是少数阶级(复杂)的两倍多。在这种不平衡的分类情况下,我想对我选择的分类评估标准非常挑剔— 准确性可能不是最好的选择。

我选择 F1 得分作为分类度量来判断分类器的有效性。F1 分数对类别不平衡的鲁棒性大于准确性,这在类别大致平衡时更合适。F1 分数可以计算如下:

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

其中精度是被正确预测的预测阳性实例的比例,而召回是被正确预测的阳性实例的比例。

初始分类器(监督)

为了实地验证半监督学习的结果,我首先只使用标记的训练数据训练一个简单的逻辑回归分类器,并在测试数据集上进行预测。

Train f1 Score: 0.5846153846153846
Test f1 Score: 0.5002908667830134

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

分类器的测试 F1 值为 0.5。混淆矩阵告诉我们,分类器可以非常准确地预测没有并发症的手术,准确率为 86%。然而,分类器更难正确识别有并发症的手术,准确率只有 47%。

预测概率

对于自训练算法,我们想知道逻辑回归分类器做出预测的概率。幸运的是, sklearn 提供了**。predict_proba()** 方法,它允许我们查看属于任一类的预测的概率。如下所示,在二元分类问题中,每个预测的总概率总和为 1.0。

array([[0.93931367, 0.06068633],
       [0.2327203 , 0.7672797 ],
       [0.93931367, 0.06068633],
       ...,
       [0.61940353, 0.38059647],
       [0.41240068, 0.58759932],
       [0.24306008, 0.75693992]])

自训练分类器(半监督)

现在我们知道了如何使用 sklearn 获得预测概率,我们可以继续编码自我训练分类器。以下是一个简要的概述:

第一步:首先,在标注的训练数据上训练一个逻辑回归分类器。

步骤 2 :接下来,使用分类器预测所有未标记数据的标签,以及这些预测的概率。在这种情况下,我只会对概率大于 99%的预测采用‘伪标签’。

步骤 3 :将“伪标记”数据与标记训练数据连接,并在连接的数据上重新训练分类器。

第四步:使用训练好的分类器对标注的测试数据进行预测,并对分类器进行评估。

重复第 1 步到第 4 步,直到没有任何预测的概率大于 99%,或者没有未标记的数据。

参见下面的代码,我用 Python 实现了这些步骤,使用了一个 while 循环。

Iteration 0
Train f1: 0.5846153846153846
Test f1: 0.5002908667830134
Now predicting labels for unlabeled data...
42 high-probability predictions added to training data.
10788 unlabeled instances remaining.

Iteration 1
Train f1: 0.7627118644067796
Test f1: 0.5037463976945246
Now predicting labels for unlabeled data...
30 high-probability predictions added to training data.
10758 unlabeled instances remaining.

Iteration 2
Train f1: 0.8181818181818182
Test f1: 0.505431675242996
Now predicting labels for unlabeled data...
20 high-probability predictions added to training data.
10738 unlabeled instances remaining.

Iteration 3
Train f1: 0.847457627118644
Test f1: 0.5076835515082526
Now predicting labels for unlabeled data...
21 high-probability predictions added to training data.
10717 unlabeled instances remaining.

...Iteration 44
Train f1: 0.9481216457960644
Test f1: 0.5259179265658748
Now predicting labels for unlabeled data...
0 high-probability predictions added to training data.
10079 unlabeled instances remaining.

自我训练算法经历了 44 次迭代之后,才能够以> 99%的概率预测到更多的未标记实例。尽管最初有 10,830 个未标记的实例,但其中 10,079 个在自我训练后仍未标记(且未被分类器使用)。

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

经过 44 次迭代,F1 分数从 0.50 提高到 0.525!虽然这只是一个很小的增加,但看起来自我训练已经提高了分类器在测试数据集上的性能。上图的顶部显示,这种改进大部分发生在算法的早期迭代中。类似地,底部面板显示了添加到训练数据中的大多数“伪标签”出现在最初的 20-30 次迭代中。

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

最终混淆矩阵显示有并发症的手术的分类有所改善,但无并发症的手术的分类略有下降。在 F1 评分提高的支持下,我认为这是一个可接受的改进——识别将导致并发症的手术病例(真阳性)可能更重要,为了达到这一结果,可能值得增加假阳性率。

注意事项

所以你可能在想:用这么多未标记的数据进行自我训练有风险吗?答案当然是肯定的。请记住,尽管我们将“伪标签”数据与带标签的训练数据包含在一起,但某些“伪标签”数据肯定是不正确的。当足够多的“伪标签”是不正确的时,自训练算法可以加强差的分类决策,并且分类器性能实际上可以变得更差。

然而,这种风险可以通过遵循既定的实践来减轻,如使用分类器在训练期间未见过的测试数据集,或使用“伪标签”预测的概率阈值。

SQL 子查询简介

原文:https://towardsdatascience.com/a-gentle-introduction-to-sql-sub-queries-ee288174d285?source=collection_archive---------19-----------------------

SQL 变得简单

了解为什么以及何时应该使用它们!

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

有时候学习 SQL 感觉像是我们在矩阵里面,但是不需要那样!马库斯·斯皮斯克在 Unsplash 上的照片

SQL 是任何数据科学家为了探索数据库都应该掌握的基本工具之一。它有简单易用的美誉。但是并不是所有的事情都是轻而易举的,对于新手来说,最大的挑战之一就是理解子查询的使用。

在我们开始之前,有代码的笔记本一如既往地在这里等着你。

假设您熟悉 SQL,我们首先要学习的一件事是主语句的顺序必须如下:

**1- SELECT** column_name,
**2- FROM** table_name,
**3- WHERE** condition;

但是有一点不太明显,那就是这不是处理查询的方式!实际上,几乎是反过来的:

**1- FROM the** table_name
**2- WHERE this** condition **is true
3- SELECT the rows of the** column_name;

为什么知道这一点很重要?因为如果理解了这个逻辑,以后就更容易可视化子查询的需求了。对于 SQL,理解幕后的工作与知道如何编写查询一样重要。

假设您有下表 team_data :

| **team** | **country** | **season** | **total_goals** |
|-------------|---------|--------|-------------|
| Real Madrid | Spain   | 2019   | 53          |
| Barcelona   | Spain   | 2019   | 47          |
| Arsenal     | UK      | 2019   | 52          |
| Real Madrid | Spain   | 2018   | 49          |
| Barcelona   | Spain   | 2018   | 45          |
| Arsenal     | UK      | 2018   | 50          |

如果我们想按团队检索平均目标,查询将是:

**SELECT** team,
    **AVG**(total_goals) AS avg_goals
**FROM** team_data
**GROUP BY** team;

这将给出以下结果:

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

按团队分组的平均目标

到目前为止,没有神秘,对不对?但是如果我们只想过滤平均得分高于 50 的团队呢?通常,我们的第一种方法是这样的:

**SELECT** team **AS** team_name,
    **AVG**(total_goals) **AS** avg_goals
**FROM** team_data
**WHERE** avg_goals > 50
**GROUP** BY team;

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

第一次尝试会产生聚合错误。

这给了我们一个聚合错误,但是为什么呢?让我们根据查询的处理方式来执行这些步骤:

  • 1: FROM team_data —好的,表格存在,我们继续;
  • 2:WHERE avg _ goals>50—嗯,这里我们有一个错误,如果计算还没有完成,如何过滤这些值呢?

这是一个需要使用子查询的完美例子。我们需要做的是首先生成字段 avg_goals,,这样当 WHEN 语句开始过滤时,计算就已经完成了!根据查询逻辑,这个过程需要在来自语句的上完成,因为它在时出现在过滤器之前。让我们看看这个查询是怎样的:

**SELECT** team_name, avg_goals**FROM** (-- Here we make our sub-query:
    **SELECT** team AS team_name,
    **AVG**(total_goals) AS avg_goals
    **FROM** team_data
    **GROUP BY** team) tp
-- End of the sub-query**WHERE** avg_goals > 50;

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

成功!

你现在能看到发生了什么吗?

  • 1:来自语句的生成了我们需要的分组值;
  • 2: 按照我们的规范过滤后;
  • 3:最后,选择获取我们指定的列。

基本上,我们需要子查询大多数时候我们需要过滤聚集字段。写的时候给你一些帮助:

  • 不要忘记在子查询之后创建一个别名。在这个例子中,在它的结尾有一个“tp ”,但是它可以是你想要的任何东西。
  • 即使 SQL 不区分大小写,将语句大写也是一个好习惯。使用缩进也很好,因为它提高了查询的可读性。即使是很小的查询也很容易迷路。

今天就到这里。我希望现在子查询对你来说更加神秘了!请在评论中告诉我你的想法,并随时添加一些更实际的例子!

理解气流执行器的简单介绍

原文:https://towardsdatascience.com/a-gentle-introduction-to-understand-airflow-executor-b4f2fee211b1?source=collection_archive---------13-----------------------

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

柯蒂斯·麦克牛顿在 Unsplash 上的照片

Apache Airflow 是一个用于调度任务的著名开源 python 框架。气流生态系统中有很多新概念;其中一个你不能跳过的概念是 气流执行器 ,它是所有预定任务的“工作站”。气流对于最终用户来说通常是用户友好的,并且很好地理解气流执行器对于个人使用以及生产气流环境是至关重要的。在这篇文章中,我们将详细讨论什么是气流执行器,比较不同类型的执行器,以帮助您做出决定。

什么是气流执行器

气流执行器有很多种选择,我们先把那些选择放在一边,先把重点放在气流执行器在气流生态系统中做什么。恰当地说,规程“执行者”是一种执行任务的机制。worker 是运行实际任务的节点或处理器。Airflow 调度程序不会运行任何任务,而是将任务移交给执行器。执行者充当中间人,处理资源利用和如何最好地分配工作。

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

来自 giphy.com的奴才们的 GIF 图

虽然 Airflow 作业是在 DAG 级别上组织的,但是作业的执行阶段更加精细,执行器在任务级别上运行。如下图所示,如果 DAG 以六个任务结束,Airflow 调度程序会将每个任务分别分配给执行者。无论这些任务是并行完成还是顺序完成,都是由执行器类型决定的。

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

DAG 示例(按作者)

执行者参与气流生命周期的哪一部分?

就目前而言,Airflow(1 . 10 . 10 版)是一个单调度程序系统。在这种情况下,所有任务只由一个调度程序调度。调度器控制任务何时被发送到执行器,并监控来自执行器的任务状态。

任务从调度器到执行器的生命周期包括以下步骤:

  1. 在调度器发出命令让执行器运行哪个任务之前,根据执行器的类型,执行器本身的资源保持空闲或不可用。
  2. 一旦预定时间到了,气流调度器就把命令发送给执行器。
  3. 收到调度器的信号后,执行器开始分配资源,并将任务放入队列。当工作可用时,它将从队列中选取任务来执行它。同时,调度程序每隔一段时间(称为心跳)探测一次任务,以获取任务的当前状态,然后在后端数据库中更新其状态。
  4. 一旦任务完成,并且调度器从执行器接收到完成状态,为运行任务分配的资源就被清理掉了。

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

图片来自气流生命周期

为什么气流有不同类型的执行器?

大多数类型的 Airflow executor 工具任务以分布式方式运行,这些任务运行在多处理或多个工作节点上。气流生产环境通常有数百个 Dag,其中包括数千个要运行的任务。凭借在如此大的规模上并行运行各种任务的能力,Airflow executor 在密集型工作负载上大放异彩。

您拥有各种类型的执行器的原因之一是,您可以根据自己的需求和基础设施进行选择。气流提供了执行者的“工具包”,不同种类的执行者提供了灵活性,让气流与您的环境顺利集成。

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

拍摄的谷仓图片的 Unsplash

气流是可扩展的,支持各种执行器。最初,Airflow 只有 SequentialExecutor、LocalExecutor、CeleryExecutor 和 MesosExecutor 可用。最近两年,自从气流 1.9.0 以来,气流得到了更多的关注,更多的执行者被贡献给了社区,这些执行者包括 DaskExecutor,KubernetesExecutor,DebugExecutor。

执行器之间的区别在于上的机制,执行器在上运行任务。在我看来,并不是所有的遗嘱执行人都被同等对待,有些人你甚至想跳过,除非你有特定的理由必须使用他们。下面是对每个遗嘱执行人的描述,以及当你倾向于选择其中一个时应该考虑的因素。

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

气流执行器(作者)

  • SequentialExecutor 是现成的默认执行器。顾名思义,任务将按顺序执行。即使你有一个分支操作符,任务仍然会按照’branch_a’, ‘branch_b’, ‘branch_c’, ‘branch_d’的顺序一个接一个的执行
  • LocalExecutor 非常适合并行测试多个气流作业,为小规模生产环境执行任务。LocalExecutor 在与气流调度程序相同的节点上运行任务,但在不同的处理器上运行。有其他执行者在分配实际工作时使用这种类型;例如,KubernetesExecutor 将在每个 pod 中使用 LocalExecutor 来运行任务。
  • CeleryExecutor 是最成熟的气流选项,因为大多数早期气流采用的是 CeleryExecutor。它还需要基础设施支持——芹菜和芹菜的后端(Redis 或 RabbitMQ)。然而,你可以从 Airflow 社区获得更好的帮助,因为很多公司都在使用这个选项。
  • MesosExecutor 是早期的社区贡献之一。然而,由于 Kubernetes 比 Mesos 被广泛采用,气流社区也在讨论退役 MesosExecutor。除非您的公司正在运行 Mesos,并且您在未来几年内不会迁移到 Kubernetes,并且您希望使用 Mesos 来管理您的 Airflow executor 资源,否则您可能希望选择此选项。否则,您可能希望避免选择 MesosExecutor。
  • Dask.org 激发了 DaskExecutor。有一些关于移除 DaskExecutor 的讨论,也是由于缺乏使用,DaskExecutor 在 Airflow master 上失败了几个月,但没有人注意到。我个人喜欢达斯克;不幸的是,气流和 Dask 的使用较少。不幸的是,由于使用和支持较少,您可能希望避免选择 DaskExecutor。
  • KubernetesExecutor 是在 1.10.0 版本中引入的,由彭博贡献。这一贡献为 Airflow 与 Kubernetes 生态系统的集成树立了一个里程碑。虽然最初的几个次要版本有问题,但最近的版本更稳定了。如果贵公司广泛采用 Kubernetes,KubernetesExecutor 可能是气流执行器的最佳选择。KubernetesExecutor 的另一个优点是你可以为你的任务准备不同的 docker 图像,这给了你更多的灵活性。
  • DebugExecutor 是在 1.10.8 中引入的。它可能不会被归类为遗嘱执行人;这个 DebugExecutor 的目的是与 IDE 一起运行。它类似于 SequentialExecutor,一次运行一个任务,并且支持使用传感器。

总之,CeleryExecutor 和 KubernetesExecutor 将是您的生产环境的绝佳选择。LocalExecutor 也是生产环境中需要考虑的首选项。如果您的工作负载较轻,或者大部分任务都在 AWS 或 Azure service 等云服务中运行,Airflow Executor 充当中间人,在不实际运行不同服务的情况下与它们对话,LocalExecutor 也是可行的选择。SequentialExecutor 和 DebugExecutor 用于本地测试。你可能会在生产中跳过它们。MesosExecutor 和 DaskExecutor 你可能想避开他们,因为对他们在气流生态系统中的未来路线图有矛盾心理。

气流执行器怎么设置?

气流执行器上的大部分配置都是由air flow . CFG文件控制的。不同的功能部分在括号中组织文件。对于执行程序的选择,您会在 core 部分看到,SequentialExecutor 被选为缺省值。它允许你在不设置太多依赖的情况下运行 Airflow。SequentialExecutor 可以直接使用 SQLite,SQLite 应该与 Python 一起安装。正如我们上面所讨论的,您可以选择不同类型的执行器,但是每一种都需要在 AirflowAirflow 中进行额外的设置。cfg 文件。

[core]executor = SequentialExecutor

LocalExecutor 也很容易设置,它要求元数据数据库是 MySQL 或 PostgreSQL,而不是 SQLite。一旦 LocalExecutor 设置好了,气流执行器 90%的功能就展现出来了。执行器的另外 10%功能是以分布式方式运行气流。

CeleryExecutor 有其配置部分— [celery]。有两个主要组成部分:芹菜和芹菜后端。芹菜是异步任务队列。有了芹菜,气流可以将其任务扩展到多个工人,以更快地完成工作。更多设置可在气流芹菜页面找到

由于 Kubernetes 的流行,KubernetesExecutor 是气流中的宠儿。如果您的环境中有 Kubernetes,在 Airflow 中设置 kubernetexecutor 不会太麻烦,我在以前的文章中已经介绍了基本的设置:探索 AWS 和 kops 上的 Airflow kubernetexecutor

最后的想法

为气流基础设施设置合适的执行器是关键的一步。如果您希望 Airflow 不仅处理调度部分,还在您的 worker 节点上运行任务,Airflow executor 通过其分布式功能提供了更多额外的潜力。希望这篇文章能给你一些关于气流执行器的基本思路。干杯!

希望这个故事对你有帮助。本文是我的工程&数据科学系列的部分,目前包括以下内容:****

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

赵承志**

数据工程和数据科学故事

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

你也可以 订阅我的新文章 或者成为 推荐媒介会员 可以无限制访问媒介上的所有故事。

如果有问题/评论,请不要犹豫,写下这个故事的评论或者通过 LinkedinTwitter 直接联系我。****

用 Python 温和地介绍 Web 抓取

原文:https://towardsdatascience.com/a-gentle-introduction-to-web-scraping-with-python-b914a64b2fb8?source=collection_archive---------20-----------------------

如何用几行代码编写你的第一个 scraper

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

照片由潘卡杰·帕特尔Unsplash 拍摄

数据科学只有在有数据的情况下才有可能,而在现实世界中,数据通常不会在一个里等着你。csv 文件。你必须去追求它。这就是为什么网络抓取对你的数据科学工具箱非常重要。

但是如果你是一个完全的初学者,刮擦看起来有点复杂。如果你正在寻找开始抓取,并想知道如何写你的第一个网页抓取工具在一个简单,快速的方式,这篇文章是给你的。

理解这篇文章不需要以前的刮痧知识。我只是假设你知道什么是网络抓取,并且你也知道一些 Python 的基础知识。

在本文中,我们将以 quotes.toscrape.com 网站为例。这个网站包含数百个著名的报价,他们的作者,也有一些标签来描述每一个报价。这是我们要收集的信息。还有,从网站名称可以推断出是为刮痧而做的。但并不是互联网上的每个页面都是如此,所以在你开始抓取之前,确保你抓取的网站允许你这样做。

代码

对于我们将在本文中编写的 scraper,我们需要三个库:

  • 熊猫,用于数据操作。如果你知道一些用于数据分析的 Python,你可能已经熟悉它了;
  • Urllib ,打开并阅读页面;
  • BeautifulSoup ,解析 HTML,使得提取数据更加容易。

如果你还没有安装,BeautifulSoup 是你唯一需要手动安装的。如果您使用 pip ,只需运行以下命令:

pip install beautifulsoup4

安装好所有东西后,我们可以导入,用 urllib 获取 URL,用 BeautifulSoup 解析源代码。

import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoupurl = 'https://quotes.toscrape.com'
page = urlopen(url)
soup = BeautifulSoup(page, 'html.parser')

追寻数据

因此,如果你在网站上按下键盘上的 F12 键,你会看到它的源代码。我鼓励你花些时间去理解它。您可以在 Windows 上按下 Ctrl + shift + C 来检查页面上的每个元素。

在这样做的时候,注意引号存储在带有名为“quote”的div标签中,就像下面的代码一样。我们需要做的就是抓住这些元素。

选择元素一点也不难。一切都在soup里面。例如,如果这里的目标是抓取页面的标题,正如您可能已经看到的那样,它存储在title 标签中,我们所要做的就是:

print(soup.title)

输出将是:

<title>Quotes to Scrape</title>

为了只检索文本,我们只需要指定这就是我们想要的:

print(soup.title.text)

然而,由于源代码中有许多div 标签,我们不能使用这种方法。相反,我们将使用find_all 方法。这个方法检索页面上所有符合我们规范的元素。这里我们使用标记名和类来检索所有的引号:

quotes = soup.find_all('div', class_='quote')

这一行的另一种写法是:

quotes = soup.find_all('div', {'class': 'quote'})

使用这种语法,我们甚至可以指定更多要过滤的类:

quotes = soup.find_all('div', {'class': {'quote', 'tags'}})

我们还可以使用limit 参数来限制要检索的元素数量。有很多不同的可能性。确保检查文档

好了,我们现在有了所有的报价。如果您在页面源代码中打开这些元素之一,您将看到以下内容:

这里存储了我们需要的所有信息。我们只要抓住它。我们将抓取引用本身,即在带有类“text”的span 标签中;作者,那是在一个small 标签中加上“作者”一类的;以及在具有类“tag”的一个div 标签内的几个具有类“tag”的a 标签中的标签。

然后,我们遍历quotes 并获取它们中每一个的信息。首先是文本和作者:

for quote in quotes:
    text = quote.find('span', class_='text').text
    author = quote.find('small', class_='author').text

现在,仍然在循环内部,我们将使用find方法获取类“标签”,然后使用find_all 获取内部的a 标签。这些方法基本上做同样的工作,除了find 只返回下一个符合你的规范的元素。

然后,我们将把每个标签中的文本追加到一个列表中:

tags = quote.find('div', class_='tags').find_all('a')

tags_list = []
for tag in tags:
    tags_list.append(tag.text)

存储数据

抓取工作已经完成,但是我想你并不是只对用print在控制台中显示数据感兴趣,而是希望数据存储在一个文件中,以便以后使用。

有几种方法可以做到这一点。最简单的方法是将每个报价的数据放在一个列表中,并将所有这些列表附加到另一个列表中。然后我们可以很容易地将列表转换成数据帧,并导出为*。csv* 文件。

 single_quote = [text, author, tags_list]
         all_quotes.append(single_quote)# Outside the loop
df = pd.DataFrame(all_quotes, columns=['quote', 'author', 'tags'])
df.to_csv('quotes.csv', index=False)

获取更多数据

虽然每一页只包含十个报价,我想你会想刮更多。要获得更多报价,我们需要进入下一页。同样,根据你抓取的网站,有很多方法可以做到这一点。

对于这种情况,我们可以将 URL 改为“https://quotes.toscrape.com/page/1/”,而不是“https://quotes . toscrape . com ”,并在另一个for中更改页面的编号。

在这个例子中,我们抓取了前十页。这是该任务的完整代码:

25 行代码!这再简单不过了。易于理解、易于编写、实用且有效。

为了向你证明这是可行的,这里是前一百个引用的数据:

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

作者图片

更多挑战和更多工具

不幸的是,不全是阳光和彩虹。回想一下quotes.toscrape.com是一个网站被刮。所以从定义上来说刮擦它是容易的。

当你开始抓取真实的、更复杂的网站时,你会遇到新的挑战。你必须让你的代码防错,这样它才不会在抓取的成千上万的页面中崩溃。您必须处理 BeautifulSoup 无法解析的 JavaScript 渲染页面,甚至还要处理根据用户动作改变页面的交互式内容。

幸运的是,您还会遇到处理这些挑战的新工具。熟悉请求库很重要,这是一个比 urllib 更强大的工具; Selenium 是 JavaScript 渲染页面的一个很好的选择,因为它实际上打开了自动浏览器,可以抓取所有内容并与页面进行交互;你也可以使用代理提供商,比如 Infatica ,来保护你和你的连接,避免你的 IP 被屏蔽。

随着你目标的发展,确保你的工具也在发展!

我希望你喜欢这本书,它可能会有用。如果你有问题,有建议,或者只是想保持联系,请随时通过 TwitterGitHub ,或者 Linkedin 联系我。

海湾地区数据科学面试幸存女孩指南

原文:https://towardsdatascience.com/a-girls-guide-to-surviving-bay-area-data-science-interviews-40b66ba4d7e8?source=collection_archive---------6-----------------------

旧金山湾区中级数据科学职位面试六个月后的关键收获。

在我的第一个数据科学职位工作了大约 1.5 年后,我决定开始申请新的职位,因为我目前的职位缺乏职业发展,缺乏引人入胜的项目,并且数据科学的应用不是这家小型创业公司的优先事项。因此,我踏上了穿越湾区技术面试文化的旅程,以找出我的数据科学职业生涯的下一步应该是什么。

在转到数据科学之前,我是建筑行业的一名土木工程师(点击了解我向数据科学的转变)。我很幸运,通过我的网络获得了我的第一份数据科学工作,没有花太多时间面试。这意味着我之前的大部分面试经历都是在建筑行业。不用说,在找出一个可行的流程之前,导航技术面试需要一些反复试验。

以下是我学到的六条重要经验,我将在下面详细解释:

  1. 旧金山湾区有一种科技面试文化,围绕这种文化建立了一个完整的行业。学习如何玩这个游戏。
  2. 数据科学是一个广阔的领域。找到你的定位,花时间专注于这些职位。
  3. 每天编码。
  4. 每天练习一道面试题。
  5. 熟记这本百页机器学习书中所有的粗体术语。
  6. 大型科技公司的招聘人员可能会有所帮助。第三方招聘人员可能是浪费时间。

1.旧金山湾区有一种科技面试文化,围绕这种文化建立了一个完整的行业。学习如何玩这个游戏。

因为数据科学职位竞争如此激烈,所以通过面试过程几乎有一个秘密的“代码”。我花了一些时间来真正理解这个概念,尽管我参加了一些旨在让女性受雇于科技行业的会议,试图解释这一点。

典型的面试过程是这样的:

  1. 提交你的简历和求职信。
  2. 找公司的人给你推荐。
  3. 招聘人员会主动打电话给你。
  4. 打电话给招聘人员,讨论你过去的经历,并回答几个一般性的技术问题。
  5. 进行第一轮技术面试,通常涉及以下一项或多项内容:(I)在共享您屏幕的平台上进行现场编码。(ii)讨论您之前完成的课后考试。㈢浏览案例研究。㈣统计和建模问题。
  6. 进行面对面的最后一轮技术面试,同时评估与团队的文化契合度。

以下是我发现的一些优化这一过程的秘密:

确保你的简历看起来“现代”

简历格式会让建筑行业的招聘人员畏缩不前,但在科技领域却是公平竞争的对象。加点颜色。添加一些符号。让它脱颖而出!在我的简历上添加小星星来传达我在某些技能上的经验水平,似乎对招聘经理很有吸引力。然而,一位朋友指出,与男性对自己的评价相比,我对自己的评价可能过于苛刻了。

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

我简历中的一个例子,展示了我对某些技术技能的熟练程度。

顺便说一句,我对批判性地评估或评价自己(甚至是谈判薪水)的建议是,想想你生活中的一个人,他/她总是问你想要什么。可能是同事、朋友或导师。对我来说,我会想起我是如何看着我的前任年复一年地争取大幅加薪,直到他的薪水明显高于我,尽管我们在同一个行业。我试着思考他会如何评价自己,或者在我的情况下他会提出什么要求。我敢肯定,在你人生的某个时刻,你见过有人自信而无情地谈判。试着去模仿,即使你没有感觉到。如果所有这些都失败了,我会想到,如果我不谈判,我会对世界各地的女性造成伤害,并陷入性别成见。是的,我需要那种紧迫感来推动自己去谈判。已经有很多关于谈判薪水的文章了,所以我不会在这里深究。我建议从阅读科技行业女性谈判薪资的(初级)指南开始。

如有疑问,提交求职信

我听到了赞成和反对提交求职信的观点。如果有提交的选项,那就提交吧。花点时间写一封好的求职信,具体说明你为什么想在那家公司工作。如果求职信在科技行业有作用的话,那就是解释你为什么对这家公司的这个职位感兴趣。它只需要是几个段落。不要提交一份冗长的、泛泛而谈的求职信,重复你简历上所列的内容。

推荐是金奖券

如果你想确保招聘人员或招聘经理看到你的简历,你需要公司里有人推荐你。或者你最好在简历搜索引擎优化方面非常出色。

你以前的经验和投资组合是必要的,但不相关

你应该能够讨论你之前的数据科学经验和你投资组合中的项目,但最终它们是不相关的。虽然他们会帮你打开大门,但你必须能够通过技术面试,以表明你有资格获得这个职位。

在面试中问一些澄清性的问题

很多次,我被招聘人员纠正,因为我做了一个假设,而我本应该澄清这个问题。这也适用于带回家的作业。要求澄清也无妨,即使是多次。我肯定有一次课后考试不及格,因为在我要求澄清一次后,我不好意思要求第二次澄清。

明智地选择你的时间和金钱的去处

技术面试已经成为一个行业;不要被骗花钱去面试。人们会主动联系你,将你的个人资料添加到他们的招聘网站上,为技术面试帮助付费,为简历写作付费,为练习面试问题付费,等等。在我看来,这是关于纪律和试错,你不需要支付这些服务的大部分。

谈判从第一次通话开始

招聘人员第一次打电话时会问薪资期望值的问题,对此我有些纠结。我通常会给出一个范围或中值,这个数字会吓跑一些招聘人员,而其他招聘人员会暗示这个数字太低。一个职位的工资范围在不同的公司之间差别很大。记住你期望的工资范围的下限是有帮助的,而且,如果你认为你对这个职位来说可能是大材小用,试着在第一次打电话时问招聘人员这个职位的工资范围。大多数资源都说要完全避免回答薪水期望值的问题,但是招聘人员非常坚持要知道他们是否在你期望的范围内。

不要把拒绝放在心上

意识到在湾区获得一份工作机会是靠运气和获得面试经验。如果你没有得到一份工作,并不是因为你对那家公司不够熟练或者不够聪明。试着保持乐观,记下你可以如何改进,并将注意力转移到下一份申请上。如果你很难保持积极的态度,或者感觉技术面试让你精疲力尽,也许是时候休息几周了。

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

来源:https://media.giphy.com/media/3oz8xHL8780wscO8hi/giphy.gif

2.数据科学是一个广阔的领域。找到你的定位,花时间专注于这些职位。

在我面试的时候,我去了旧金山的一个聚会,问了一些人他们如何决定申请哪些工作,因为有太多的工作机会。他们都说‘适用于一切’。我认为这种逻辑是有缺陷的,因为为一个职位定制一份简历和求职信,并找到一个关系给你引荐是非常耗时的。更不用说可能需要 2-4 周的技术面试过程,还可能包括带回家的作业。我想把大部分时间花在学习技术面试上,只有有限的时间用来申请职位。

我认为有必要缩小你感兴趣的数据科学工作的具体类型(研究与应用、建模与统计、通才与专家)以及你想加入的公司类型(私营与上市、初创与老牌、B2C 与 B2B)。为了优化我的时间,我制定了以下流程来决定申请哪些工作。

  • 第一步是确保我符合这个职位的最低要求。有些人认为,即使你还没有足够的经验,也应该申请,但我认为最低资格通常是公司的绊脚石。“最好拥有”是有回旋余地的地方。公司正在寻找方法来缩小大量候选人的范围,而最低资格是一个简单的方法。
  • 因为我已经有了几年的经验,所以我也需要确保自己不会大材小用。我经历了几次面试过程,在意识到公司无法击败我目前的工资,并在寻找更入门级的人之前,我已经完成了技术面试。
  • 第三步是评估我的技能是否符合工作描述。我可以修改我的简历,让招聘人员想和我谈谈吗?为了确保我的技能符合我感兴趣的职位,我花了一些时间学习新技能或 Python 库,以填补我经验中的任何空白。例如,我对统计决策感兴趣,所以我参加了在线 Coursera 推理统计学课程,并使用 Kaggle 产品分析数据集为我的投资组合构建了一个项目。最终,我在风险分析和产品分析领域找到了一个合适的位置,至少能让我和招聘人员通一次电话。
  • 下一步是确保我对这个职位感到兴奋(很明显)。一般来说,在写求职信的时候,我就能判断出自己对这个职位的兴奋程度。如果我很难在求职信中解释我对这个职位的热情,那么我会停止申请。
  • 最后一步是检查我的关系网中是否有人可以推荐我,尤其是当我申请一家大公司的时候。这不一定是一个交易破坏者,但它确保了我的应用程序被移动到堆的顶部。

使用这个过程,我会接到招聘人员的电话,至少有大约 2/3 的时间可以参加第一轮技术面试。我喜欢这种可能性。

3.每天编码。

现场编码采访绝对是我的克星。不是因为我不知道如何编码,而是因为我对自己的编码能力缺乏信心。如果知道有人在看我打字并判断我的思维过程,我会感到恐慌。我会催促自己,因为我担心自己走得太慢。恐慌和匆忙的结合导致我将简单的问题复杂化,并阻止我有效地调试我的代码。我有一个理论,这可能比男人更经常地影响女人。

为了获得自信,我确保自己每天都在编码,并在 Kaggle 上把自己的代码和别人的代码进行比较。我本应该尝试下面的一些资源来更好地进行现场编码面试,但我最终在探索这些选项之前得到了一个提议:

  • 参加一个全女性的编码研讨会(像女孩开发它)。
  • 试试 Pramp ,一个练习与同行进行现场编码面试的软件平台。
  • 参加黑客马拉松,尝试与软件开发人员配对。
  • 试试 HackerRank ,一个有练习代码面试题的软件平台。

4.每天练习一道面试题。

一旦你解决了足够多的实践技术面试问题,你开始看到一个模式,并对自己的能力有了信心。我发现有几个服务可以一周几次给你发邮件询问一个问题,然后单独发一封邮件告诉你解决方案(收取订阅费)。

然而,对练习题的在线解答要持怀疑态度。我在技术面试时收到的脸书阅读材料包括以下警告:“虽然我们承认候选人可能会利用外部网站/资源发布面试问题和答案,但我们鼓励谨慎,因为我们发现许多建议的解决方案是不正确的。”

5.背下百页机器学习书里所有的粗体术语。

我买了这本一百页的机器学习书,打算把它作为我工作的资源。这本书实际上对通过技术面试问题非常有帮助。我建议记住书中的关键术语,并确保你理解并能解释关键概念。

更具体地说,有人反复问我以下问题:

  • 计算精度的公式是什么?精度?回忆?
  • 解释偏倚和方差权衡。
  • 解释逻辑回归。
  • 什么是正规化?
  • 分类和回归有什么区别?

轻松地说,我也被问及这些问题:

  • 你的精神动物是什么?
  • 别人问过你的最好的面试问题是什么?
  • 你能接受的最低工资是多少?

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

来源:https://makeameme.org/meme/My-face-when-p0u24n

6.大型科技公司的招聘人员可能会有所帮助。第三方招聘人员可能是浪费时间。

一旦你有了大约一年的数据科学经验,你将经历与第三方招聘人员打交道的四个阶段。起初(第一阶段),关注是奉承。你会想“我成功了!公司正在联系面试。”然后(第二阶段),它变得令人沮丧。你会想“这个招聘人员看过我的 LinkedIn 个人资料吗?我显然不适合这个职位。”第三阶段是不知所措。你要回复招聘人员才能让你的 LinkedIn 求职状态保持在“积极应聘”,但是不相关的就那么多。第四阶段是冷漠。你主动忽略所有第三方招聘人员。

下面的堆积条形图显示了我申请的 20 个职位的进展情况。我自己申请或通过公司招聘人员申请的职位导致了六个面试过程,其中我进入了第一轮面试,一个面试过程中我进入了最后一轮面试,三个面试过程中我收到了录用通知。我通过与第三方招聘人员通电话申请了六个职位,第三方招聘人员在将简历交给招聘经理之前会对候选人进行筛选,最终导致实际公司的面试为零。即使它们通常只持续 15 分钟,我也不得不围绕这些电话来计划我的一天。它们占用了我本可以用来做更有影响力的事情的时间。有时,我觉得招聘人员被要求寻找一定数量的“多样化”候选人,我被加入进来以满足这一要求,即使我的技能不一定与职位描述相符。但那可能只是我的幻觉。不管怎样,如果你想和第三方招聘人员合作,先询问职位描述,在安排电话之前评估你是否适合这个职位。

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

一个堆积柱形图显示了我申请的 20 个职位的面试进展情况。左栏显示我自己或通过公司招聘人员找到的工作,右栏显示我通过第三方招聘人员找到的工作。

另一方面,我认为脸书面试的招聘人员对我的面试过程帮助很大。脸书似乎为我提供了公平的竞争环境,他给我时间在把简历发给招聘经理之前更新我的简历,详细解释技术面试将如何进行,并在技术面试之前给我提供阅读材料和练习题的链接。在其他公司,我只是在瞎猜应该在简历中突出哪些技能,以及我将面临的问题类型。

摘要

总而言之,面试过程紧张、耗时,有时还有点丢脸。充分利用你的时间,找到那些通常能让你进入第一轮技术面试的职位类型。征服技术面试,熟能生巧。技术面试失败只是练习技术面试的一部分,不要对自己太苛刻。只要有一点点运气和严格的纪律,你就会得到那份工作。

来源:https://media.giphy.com/media/kLLDVeWnNwRXO/giphy.gif

一个好的机器学习分类器对扑克牌数据集的精度度量

原文:https://towardsdatascience.com/a-good-machine-learning-classifiers-accuracy-metric-for-the-poker-hand-dataset-44cc3456b66d?source=collection_archive---------30-----------------------

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

马库斯·温克勒在 Unsplash 上的照片

一个非常适合高度不平衡数据集的指标

什么是数据集?

扑克手数据集【Cattral 等人,2007 年】是公开可用的,并且在 UCI 机器学习知识库【Dua 等人,2019 年】中有非常好的记录。[Cattral 等人,2007 年]将其描述为:

对于分类算法来说,这是一个具有挑战性的数据集

这是一个 11 维的数据集,有 25K 个样本用于训练,超过 100 万个样本用于测试。每个数据集实例都是一手 5 张牌的扑克,每张牌使用两个特征(花色和级别)和一手扑克标签。

为什么很难?

它有两个特性使得分类算法特别具有挑战性:它全是分类特征和它极度不平衡分类特征很难,因为典型的距离(又称相似性)度量不能自然地应用于此类特征。例如,该数据集有两个特征:等级和套件,计算“黑桃”和“红桃”之间的欧几里德距离根本没有意义。不平衡的数据集很难,因为机器学习算法假设了良好的平衡,机器学习大师Jason Brownlee将这个问题描述为:

不平衡的分类对预测建模提出了挑战,因为用于分类的大多数机器学习算法是围绕每个类别的相等数量的样本的假设而设计的

那么,为什么我会得到好的结果呢?

那么,如果这个数据集被认为是困难的,为什么一个简单的神经网络可以在没有任何特殊调整或数据预处理的情况下达到 90%以上的准确性?

这篇文章 , Aditya Bhardwaj 显示他的神经网络达到了 90.04 的准确率。下面,我展示了一个简单的多层感知器神经网络 k 实现了超过 99%的准确率。发生这种情况的一个原因是由于职业不平衡问题。[Ling 等人,2011 年]解释说:

当类别分布高度不平衡时,数据被认为遭受了类别不平衡问题。在这种情况下,许多分类学习算法对非频繁类的预测精度较低。

扑克手数据集碰巧非常不平衡,在训练集和测试集中,前两个类代表了 90%的样本。一个学习如何正确分类这两个类别,但完全错误分类其余类别的分类器,仍将达到 90%的预测准确率。这不是一个好的分类器!。分类器仍然获得高分的原因很简单,因为类别不平衡考虑到了,即优势类别的正确预测被赋予了与样本数量成比例的权重。“非频繁类的低预测准确性”被来自那些有大量样本可供学习的类的较好预测所掩盖。

我们能做些什么呢?

一个不考虑阶级不平衡的度量标准,例如,对所有阶级给予同等的权重,而不考虑他们的主导地位,可以提供更“真实”或准确的结果。 Scikit-learn分类报告有一个这样的指标。 F1 得分结合了精确度和召回率两方面的结果,分类报告包括一个F1宏观平均度量**,未加权的每个标签的 F1 得分平均值!**。正如 Scikit-learn 关于 F-metrics 的文档中提到的:

在非频繁类仍然重要的问题中,宏平均可能是突出其性能的一种方法

这是一个很好的度量示例,可用于衡量分类器在这种高度不平衡的数据集上的性能。

在机器学习文献中已经提出了许多其他方法和度量来处理这里提到的一些问题。例如,Boriah 等人在他们的论文“**分类数据的相似性度量:比较评估”**中讨论了用于处理分类特征的一些现有方法。讨论这个不是这篇文章的范围,因此我会简单地给你留下一个论文的链接这里

请出一些结果?

我继续运行一个多层感知器神经网络,这是我得到的结果。这个网络使用 **3 个隐层,每个隐层 100 个神经元,alpha=0.0001,学习率=0.01。**下面是 混淆矩阵 。可以观察到,神经网络总体上做得很好,正确地分类了前 6 个类别中的大多数,对于类别 7 和 9(四个同花和同花)有一些特别差的结果。

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

混淆矩阵

该分类器报告的准确率为 99% 。尽管第 7 类和第 9 类的表现非常糟糕,但它们只贡献了 100 万个测试样本中的 233 个。几个非主导类的坏结果完全被其他类掩盖了。这显然给人一种成功的错觉!神经网络错误分类了 66%和 77%的皇家同花顺和四张一类的手牌,但它得到了正确但误导性的 99%的准确性结果。

下面显示的分类报告包括前面提到的所有类别的宏观平均 F1 分数。这种未加权的平均值更好地概括了分类器的表现。可以看出,大多数班级实际上做得很好,但也有几个班级做得特别差。**但更重要的是,可以观察到报告的宏观平均值为 78%。**对于观察到的结果,这是一个更合适的分数!2/10 的班级表现很差,而其他班级表现得更好,这反映在指标中,当指标被仔细选择时。

 precision    recall  f1-score   support 0       1.00      0.99      0.99    501209
           1       0.99      0.99      0.99    422498
           2       0.96      1.00      0.98     47622
           3       0.99      0.99      0.99     21121
           4       0.85      0.64      0.73      3885
           5       0.97      0.99      0.98      1996
           6       0.77      0.98      0.86      1424
           7       0.70      0.23      0.35       230
           8       1.00      0.83      0.91        12
           9       0.04      0.33      0.07         3 accuracy                           0.99   1000000
   **macro avg       0.83      0.80      0.78   1000000**
weighted avg       0.99      0.99      0.99   1000000

参考

[1]卡特拉尔和奥帕彻(2007 年)。扑克手数据集[https://archive.ics.uci.edu/ml/datasets/Poker+Hand]
卡尔顿大学计算机科学系。
智能系统研究小组

[2]Dua d .和 Graff c .(2019 年)。http://archive.ics.uci.edu/ml 的 UCI 机器学习知识库。加州欧文:加州大学信息与计算机科学学院。

[3]凌春霞,盛诉生(2011)阶层失衡问题。在:萨姆特 c,韦伯 G.I .(编辑)机器学习百科全书。马萨诸塞州波士顿斯普林格。https://doi.org/10.1007/978-0-387-30164-8_110

初学者开始机器学习的好方法

原文:https://towardsdatascience.com/a-great-way-for-beginners-to-get-started-with-machine-learning-833cce028620?source=collection_archive---------38-----------------------

如何使用 Weka 实现您的第一个机器学习算法

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

资料来源:Weka GUI

介绍

无论你是机器学习的新手,还是尝试过用 Python 或其他语言建立模型但失败了,Weka 都可能是你的完美起点。

Weka 是建立在 Java 之上的数据可视化和算法工具的集合。不过不要担心!由于 Weka 的图形用户界面(GUI ),您不必了解任何 Java 就可以使用它。使用这个 GUI,您可以在数据上运行流行的机器学习模型,而无需编写任何代码!

然而,在使用 Weka 之前,您需要学习一些机器学习算法的基础知识。

基础知识

数据

在开始运行机器学习算法之前,您需要一个数据集。寻找数据集的好地方是 Kaggle ,这是一个为数据科学家提供挑战、数据集等内容的网站。只需在您感兴趣的领域搜索数据集并下载即可!在本指南中,我将使用鸢尾花数据集,如果你愿意跟随,可以在这里找到。我建议寻找 CSV 格式的数据集,以便最容易实现。CSV 代表逗号分隔值,是一个简单的文本文档,其中每行是一个表格的一行,各列之间用逗号分隔。下载 CSV 文件后,在文本编辑器中打开它,查看其格式。

回归

回归是您将在本指南中学习的一种方法。回归问题侧重于预测一个连续的数。例如,脸书喜欢一个帖子的数量,或者房子的销售价格。查看一下从 Kaggle 获得的数据集,通过寻找连续值来尝试识别任何回归问题,并确定它们是否有预测价值。

分类

分类是您将在本指南中学习的另一种方法。分类问题预测记录的类别。比如这花是玫瑰吗?或者说,这饮料是汽水吗?查看您的数据集,通过查找类别来尝试识别任何分类问题,并确定它们是否有预测价值。

数据类型

数据可以有多种类型。在本指南中,我将向您介绍对 Weka 有价值的数据类型。重要的数据类型有数字、字符串和类。数字数据类型由数字组成。例如,您为回归确定的任何连续值都是数字。字符串数据是文本数据。单词、句子和段落都是字符串数据类型。类别数据是具有预定义类别或列表的数据。例如,IMDB 星级或狗的种类。这三种数据类型将构成数据的主要部分。

履行

现在你对机器学习中使用的一些基本术语有了更好的了解,让我们开始构建你的第一个模型吧!

第一步是在这里下载 Weka GUI 。安装程序后,你应该会看到下面的窗口。

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

资料来源:Weka GUI

Weka GUI 有五个主要区域:资源管理器、实验者、知识流、工作台和简单的 CLI。开始时,你可以忽略除了浏览器标签以外的所有标签,直到你有了更多的 Weka 经验。点击浏览器按钮进入下面的屏幕。

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

资料来源:Weka GUI

资源管理器选项卡有 7 个选项卡:预处理、分类、聚类、关联、选择属性、可视化和预测。对于本指南,我们将坚持使用预处理和分类选项卡。预处理选项卡如上所示。这是您将加载数据的地方。但是,我们需要将 csv 数据集转换成 ARFF 文件。要做到这一点,你需要一个文本编辑器和崇高的文本。Sublime 是一个免费的代码编辑器,可以从这里下载。

下载 Sublime 后,在文本编辑器中打开您的 csv 文件并复制内容。然后,将它们粘贴到一个新的 Sublime 文件中。保存该文件,并用。arff 在最后。

ARFF 文件有三个部分:关系、属性和数据。我们需要将这些部分添加到文件中。在第一行添加关系组件并命名数据集。

@RELATION iris

跳过一行,然后添加属性组件。您的属性将是数据集的列。每个属性都需要一个名称和数据类型。当输入一个类数据类型时,列出每个类别,用逗号分隔在花括号内。

@ATTRIBUTE Id NUMERIC
@ATTRIBUTE SepalLengthCm NUMERIC
@ATTRIBUTE SepalWidthCm NUMERIC
@ATTRIBUTE PetalLengthCm NUMERIC
@ATTRIBUTE PetalWidthCm NUMERIC
@ATTRIBUTE Species {Iris-setosa, Iris-versicolor, Iris-virginica}

跳过另一行,然后在您复制的 CSV 数据上方添加数据组件。如果您的数据有标题行,请确保删除标题行。

@DATA
1,5.1,3.5,1.4,0.2,Iris-setosa
2,4.9,3.0,1.4,0.2,Iris-setosa
3,4.7,3.2,1.3,0.2,Iris-setosa
4,4.6,3.1,1.5,0.2,Iris-setosa
5,5.0,3.6,1.4,0.2,Iris-setosa
6,5.4,3.9,1.7,0.4,Iris-setosa
7,4.6,3.4,1.4,0.3,Iris-setosa
8,5.0,3.4,1.5,0.2,Iris-setosa
....

最后,再次保存这个文件,您就可以将它加载到 Weka 中了!

在 Weka 的预处理选项卡上,单击打开文件并导航到新的 ARFF 文件。

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

资料来源:Weka GUI

如果您在预处理选项卡的右下角看到一个分布图,您将知道数据已经正确导入。

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

资料来源:Weka GUI

加载数据后,单击分类选项卡。这是我们将运行回归和分类模型的地方(尽管名称为 classify,回归模型也在这里运行)。您应该会看到下面的屏幕。

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

资料来源:Weka GUI

在测试选项部分,我们有 4 个选项:使用训练集、提供的测试集、交叉验证和百分比分割。为了衡量预测所选列的模型的准确性,我们需要向它提供以前没有见过的新数据。一种方法是将数据集分成两部分,称为测试和训练。但是,我推荐使用 10 倍交叉验证。这将把数据集分成测试和训练(10%的数据用于测试)10 次。这通常是最佳实践。

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

资料来源:Weka GUI

我们还需要选择我们想要预测的列。对于 iris 数据集,我将使用花卉种类,但是,您应该使用您在浏览数据集时确定的列。

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

资料来源:Weka GUI

然后,我们需要选择我们将使用的机器学习算法。因为鸢尾物种是一个分类问题,所以我将使用分类算法。其中一种基本的分类算法是逻辑回归(不要被逻辑回归中的“回归”所迷惑——它是一种分类算法)。逻辑回归将输出一个介于 0 和 1 之间的数字来对记录进行分类。在本指南中,我将跳过数学,但是理解这些算法是如何工作的非常重要。你可以在这里了解更多关于逻辑回归的知识。要选择逻辑回归算法,单击分类器下的选择,然后单击分类器>功能下的逻辑。

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

资料来源:Weka GUI

现在,我们要做的就是点击开始!模型运行后,您应该会得到类似如下所示的输出。

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

资料来源:Weka GUI

如果你在做回归问题,过程是一样的。但是,不要在分类器>函数下选择逻辑,而要选择线性回归。像逻辑回归一样,我将跳过线性回归的数学,但是,你可以在这里找到更多信息。

现在你可能会说,“太好了!我让模型运行了…但现在怎么办?”运行您的模型后,您需要学习如何读取输出并评估模型的成功。

模型评估

对于分类和回归问题,Weka 的输出会有所不同。然而,理解如何阅读和解释 Weka 的输出对于理解您的模型预测得有多好很重要。我们将检查分类和回归问题的输出。

分类

在 Weka 的分类输出中有三个重要部分用于评估模型的成功。这些是摘要、分类准确度和混淆矩阵。

在摘要部分,注意正确分类的实例。这是模型正确分类的记录数量,可以用百分比表示。在 iris 数据集的情况下,我们对 100%的记录进行了正确分类。这在真实世界的数据集里是极其罕见的,所以不要期望你的准确度会这么高。良好的准确性因数据集和应用领域而异,但是,如果您的准确性低于随机概率,则肯定需要进行一些改进。

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

资料来源:Weka GUI

在按类划分的精度部分,请注意 f-measure 和 ROC 面积。f-measure 是一个介于 0 和 1 之间的指标,它同时考虑了精确度和召回率。评估 f 度量值时,f 度量值越接近 1,模型表现越好。ROC 面积是受试者工作特征曲线下的面积。该输出将介于 0 和 1 之间,并且将表示模型能够区分类别的程度。评估 ROC 面积时,数字越接近 1 越好。您还可以看到,Weka 为每个类别提供了 f-measure 和 ROC 面积以及加权平均值。我建议关注加权平均值来评估整个模型,但是,如果您有多个类,这可以帮助识别模型在分类时遇到特定问题的类。

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

资料来源:Weka GUI

混淆矩阵也是一个重要的评估特征。它是一个矩阵,显示了 a 类记录是什么以及模型将其分类为什么类。顶行表示它被分类为什么,侧栏表示记录实际上是什么类别。对角线显示正确分类的记录。混淆矩阵可以帮助您识别模型难以分类的记录。

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

资料来源:Weka GUI

回归

Weka 的回归模型有一个评估部分——总结。但是,如果您运行线性回归,您还会有一个称为线性回归模型的部分。现在我说我会跳过线性回归的数学,但是先等等。线性回归将创建最能代表数据的线性函数(考虑最佳拟合线)。线性回归模型部分显示了模型得出的函数。例如,对于虹膜数据集,预测花瓣宽度的线性回归函数为:

PetalWidthCm = 0.0035 * Id-0.1591 * sepallenghtcm+0.2095 * SepalWidthCm+0.4272 * petallenghtcm-0.3811

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

资料来源:Weka GUI

总结部分将提供评估模型成功与否的指标。相关系数会告诉你变量之间有多少线性关联。相关系数越接近 1 越好。此外,平均绝对误差将告诉您平均误差的绝对值(预测过高或过低)。绝对值用于捕捉负误差。平均绝对误差越低越好,但是,什么是“低”将取决于数据,需要一些直觉。

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

讨论

虽然本指南绝不是关于机器学习、Weka 或所用方法的包罗万象的指南,但它应该让你开始使用实际数据进行实际预测。Weka 是一个开始探索机器学习的好地方,因为你不用写任何代码就可以实现通用算法。

你也可以用 Weka 来增长你的技能,以使用不同的和更先进的方法。可以用于分类的其他算法有 C4.5 决策树(在 Weka 中称为 J48)、随机森林和朴素贝叶斯。如果您有信心,Weka 还有一个名为 SMOreg 的支持向量机(SVM)实现——仔细选择您的内核!

使用 python 设计 A/B 测试的成长型营销人员指南

原文:https://towardsdatascience.com/a-growth-marketer-guide-to-designing-a-b-tests-using-python-5c0729d8eacc?source=collection_archive---------32-----------------------

提高实验效果的 3 个基本步骤

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

图片来自 Unsplash

在我在 Waze 工作的 7 年里,我开发了各种各样的产品和功能,从 Waze 应用程序(在全球拥有超过 1.3 亿用户)到 Waze 首次推出时的拼车。

我在营销的多个领域工作,亲眼目睹了它对用户参与度的影响。它激励我更深入地挖掘业绩和增长的世界。在这个过程中,我学会了如何挖掘数据以发现有意义的见解,相应地设计实验,以及分析和解释实验结果。

我现在是绩效营销团队的一员,我们的任务是通过利用 Waze 拥有和运营的渠道和工具,提高整个产品漏斗中的用户参与度。我们直接与用户沟通,最终促使他们采取最有效的行动来完成他们的用户之旅。

为了了解我们活动的效果,我们进行了实验,主要以“假设检验”的形式,即 A/B 检验。在进行了数百次实验后,我确定了一系列最佳实践,以及将它们付诸实践的具体步骤,以便进行有效的 A/B 测试,你可以在下面的帖子中找到。

注意:这篇文章中分享的观点是我自己的,并不反映 Waze 或 Google 的任何标准或具体协议。

第一步:探索现有的关系,定义你的关键绩效指标(KPI)

首先,您进行的任何 A/B 测试都应该与公司的 KPI 保持一致,以确保您的工作集中在最重要的业务优先级上。开始吧-

进行探索性数据分析,以发现数据中的现有关系

识别 KPI 需要结合领域知识和 EDA,即探索性数据分析。您需要深入了解业务领域,以便评估什么是最重要的驱动因素。然后,您可以使用 EDA 来发现影响他们的关系,因为 EDA 还允许您确定产品漏斗中具有最大增长机会的相关领域。

如果您是第一次浏览数据,您会希望遵循以下基本步骤:

  • **检查您的数据:**对于每个数据集,您首先要了解数据的组织方式及其包含的内容。
  • **清理&组织您的数据:**删除不需要的列、地址空值,并根据需要添加额外的列。
  • 使用 Group by &聚合函数 运行汇总统计数据以探索组之间任何有趣的差异。
  • 进行可视化数据探索(VDE) 以发现各组之间可能的关系。

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

用于揭示数据不同部分之间潜在关系的 pairplot 示例(图片由作者提供)

我给做了一个笔记本,里面有一些基本功能可以帮助你入门。您需要根据数据集的性质更改/删除一些函数,但总的来说,我发现这种结构有助于保持一切有序和清晰。

确定与业务优先级/目标相关的可行指标

您选择的指标应该与产品粘性(参与度)相关联,并且是长期保留的有力指标。总的来说,KPI 应该是可衡量和可操作的。也就是说,您应该能够采取某些措施来提高数字以支持业务目标。此外,您需要关于这个指标的足够的现有数据,或者能够容易地收集关于它的数据。最终,您会希望避免长时间的迭代。例如:关注每日或每周活跃用户,而不是每月活跃用户,因为 MAU 会要求你等待一整个月才能分析数据并采取行动。

关注更少的指标以产生更大的影响。

当涉及到 KPI 时,您通常希望遵循“少即是多”的方法,这样公司就可以专注于更少的指标,以产生更大的全面影响。

在设计 A/B 测试时,你也应该遵循这种方法。您尝试优化的指标越多,您的实验就会越复杂,这可能需要运行更长时间,需要更多的设计&开发资源&最终需要更多的资金。

一旦您发现了数据中的关系,您就需要更深入地进行分析,以准确构建您的 KPI,然后在设计您的实验和定义您的成功指标时使用这些 KPI。

第二步:定义你实验的范围和目标

一旦您对数据中的关系有了更好的理解,并确定了相关的 KPI,您就可以开始定义您的实验范围了。任何实验设计(坦率地说,任何项目)都应该从回答这 4 个问题开始:

1.这个实验重要吗?

从很多方面来说,这是最重要的问题,因为你不想在一个结果不会影响业务、产品或营销决策的实验上浪费时间、金钱和资源。在开始实验工作之前,确保与组织中的相关利益相关者保持一致。

2.你能在这个实验中测量相关的 KPI 吗?如果可以,如何测量?

永远不要说“让我们启动这个实验,看看会发生什么”(你会惊讶我以前听到过多少次)。你最不希望的事情就是意识到你实际上不能测量你想要影响的指标。确定您想要影响的指标(或 KPI ),然后确保它们是可测量的,并且实际上可以应用到实验中。

3.如果这种影响存在,你能检测到吗?

为了评估你试图衡量的变化是否有意义,你需要有足够大的样本量。多大?这将取决于多种因素,包括置信度、功效和效果大小。我们将在设计实验的第三步更详细地探讨这些问题,但总的来说,重要的是要记住,要检测产品漏斗深处的影响,需要更大的样本量。如果一个变化在漏斗顶部,如点击,打开一条消息等,你可能不需要那么大的样本量。类似地,你需要更大的样本量来检测小的效应大小。

在可能的情况下,从为您的产品所做的类似工作中确定转换基准,以粗略估计进行实验所需的用户数量。

4.如果成功,这个实验会‘动针’吗?

从商业的角度来看,你也应该考虑实验的影响,如果成功的话,是否有意义。换句话说,即使你的实验导致了统计上的显著提升,如果它只影响了一小部分用户,它也不值得运行。

如果你对以上任何一个问题的回答是“否”,那就不要浪费你的时间来设计这个实验了。否则,请继续阅读——是时候开始你的实验设计了!

步骤 3:定义、设计和启动你的实验

在确认了实验的需求并确定了你的成功标准之后,你就可以继续设计实验了。我建议使用一个包括实验所有部分的笔记本:定义、计划和报告。任何阅读你的笔记本的人都应该很容易理解实验的基本原理、目标和范围,以及实验是如何进行的,以及你从实验中学到了什么。笔记本包括 3 个部分:定义,设计和启动。

定义

提供了实验的背景。它概述了需求、如何做出决策以及使用的术语。这里,您将使用步骤 1 中进行的分析,以及步骤 2 中定义的基本原理,为实验提供背景和框架。

具体来说,在这一部分,您需要回答以下问题:

  1. 这个实验是关于什么的?
  2. 这个实验的商业理由是什么?
  3. 这个实验的结果将如何影响商业决策?特别是在与本实验相关的部门——营销、产品等
  4. 如何定义本实验中使用的指标和术语?

确保实验报告的所有利益相关者和读者引用实验中使用的所有术语的相同定义是很重要的。这将影响实验的每个部分,如果你没有定义实验的关键部分,可能会导致完全不同的结论。例如,如果你正在进行一个旨在复活休眠用户的实验,你对休眠用户的定义或者什么构成了复活必须在实验计划中完全定义。其他人可能对你的目标受众以及整个实验的结果和成功有不同的看法。

设计

这是实验计划的核心。它包括感兴趣人群的定义、机会大小、抽样方案、假设定义和所需的最小样本量。确保包括以下内容:

兴趣人群
详细定义你的目标人群定义。

机会大小
应根据您感兴趣的人群和为实验定义的 KPI 来定义。正如第一步中提到的,你需要集中精力测试那些有可能“移动指针”的东西。

抽样方案 你计划对你感兴趣的人群进行抽样的方式。我还建议包括任何潜在的采样偏差,以确保你的利益相关者意识到它们以及它们对实验结果的潜在影响。

无效&替代假设 这是实验定义的核心。简明扼要地描述你的零选择假设是什么。你的零假设应该是你的默认行为或现有状态。你的替代假设是你正在测试的新理论或变化。你在实验中的目标是看看是否有足够的证据拒绝无效并接受改变(替代假设)。

统计误差是假设检验的关键部分。具体来说,我们看两种类型的错误:假阳性(第一类错误)和假阴性(第二类错误)。说明这两种错误之间差异的一个常见例子是,将第一类错误视为判一个无辜者有罪的概率,而第二类错误是指判一个有罪者无罪的概率。

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

就你的实验而言,你会想要减少错误地拒绝零假设的机会,从而增加找到一个效果的概率(如果存在的话)。以上面的例子为例,你可以认为零假设是无辜的,而另一个假设是有罪的。如果一个无辜的人确实是无辜的(Null 为真),你会希望减少这个人被定罪的机会(拒绝 Null)。

显著性水平&功效统计 通过显著性水平(a)定义你对犯 I 类错误的适应程度,通常设置为 0.05 或 5% (95%置信水平)。通过使用功率统计来克服类型 II 误差。实验的功效统计是实验检测实验组之间差异的能力,如果这种差异存在的话。使用 80%的功率是很常见的。

效果大小

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

作者图片

重要的是要了解影响的大小,或者在给定的人群中会有什么样的结果。因此你需要一个有效尺寸。你希望在测试中看到的变化越大,效果越大,最小样本量就越小。我们希望看到的变化越小,影响大小就越小,我们需要的最小样本量就越大。换句话说,如果你想检测大的差异,你可以在测试中用较少的用户来做,但是如果你想找到更精细的小差异,你需要在测试中包含更多的用户。

最小样本量 一旦定义了显著性水平、功效和效果量,您就可以运行功效分析来确定您需要的最小用户数,以便检测您正在测试的变化是否有意义。

通常使用 p 值来解释检验,p 值是假设零假设为真时观察到结果的概率。在解释显著性检验的 p 值时,必须指定显著性水平。如果 p 值小于显著性水平,则显著性检验的结果被认为是“统计显著的”。这意味着零假设(即没有差异)被拒绝。

  • ***p<= alpha:***拒绝 H0,不同分配
  • ***p>alpha:***未能拒绝 H0,同分配

使用 Python 的 statsmodels 库你可以很容易地计算 min。需要的样本大小,知道期望的显著性水平、效应大小和功效(笔记本可用此处):

# Import library #from statsmodels.stats.power import TTestIndPower# parameters for power analysis (change as needed)effect = 0.05
alpha = 0.05
power = 0.8# perform power analysis ## change to TTestPower() in case of a paired sample t-testanalysis = TTestIndPower()  
result = analysis.solve_power(effect, power=power, nobs1=None, ratio=1.0, alpha=alpha)print('Sample Size: %.2f' % result)

启动&监视器
你现在已经准备好启动你的实验了!不要忘记对实验的每一部分进行质量保证,以确保它如你所期望的那样运行,并且数据正常流动。此外,确保继续全程监控实验。最重要的是,在发布后的最初几个小时内密切监控它,以尽快发现任何潜在的问题。

步骤 3:分析和报告结果

运行 A/B 测试后,您需要分析并清楚地报告实验结果。不要羞于报告负面影响或没有影响。通常,在找到最有影响力的假设之前,你需要测试多个假设。但是,以可操作的方式清楚地传达结果可以帮助您和所有相关利益相关者协调一致,并继续推动您的 KPI 的影响。

分析实验结果的第一步是从验证开始,以确保测试正确运行。具体来说,您需要确认:

  • 实验组的大小是相同的,即如果测试被分配给每组 50%-50%。如果您决定以不同的方式划分实验组,您需要确保每个组的大小与分配给它的百分比相对应。
  • **实验组是随机分配的:**一定要检查你的实验组中的亚群,以确保没有潜在的偏见影响你的实验结果。例如,您可以按性别或国家对您的实验组进行分组,以确保两组具有相对相似的规模。

一旦您确认了您的实验的有效性,您需要基于为测试定义的度量和 KPI 来分析每个组的表现。虽然一组可能看起来比另一组表现更好,但您必须观察结果是否具有统计显著性,以便能够确定结果是随机的还是可重复的结果(实际影响)。

如何知道结果是否具有统计学意义?如果你的变量之间的关系不仅仅是偶然的可能性!显著性以 P 值衡量,即概率值,它将反映您的结果是否像您在统计假设检验中观察到的结果一样极端的概率。P 值假设您的零假设一开始就是正确的。

请记住,P 值取决于测试组的样本大小。P 值表示为 0%到 100%,但通常表示为小数。例如,5%的 P 值是 0.05。低 P 值是好的;他们表明这个结果不是偶然发生的。您可以将高 P 值视为反对空值的弱证据,而将低 P 值视为反对空值的强证据:

  • 高 P 值: 您的数据很可能为真 null(保留 Null)
  • 低 P 值: 您的数据不太可能为真 null(拒绝 Null)

我听过很多次人们试图通过说“结果几乎具有统计学意义”来软化他们的报告。让我们明确一点:

没有“几乎显著”这种说法。您的测试结果可能有统计学意义,也可能没有。

除了确定您的测试结果是否具有统计显著性,您还需要定义效果的大小,或者您的无效假设和替代假设之间的差异大小。为了确定这一点,您需要进行一个测试统计。不同的假设检验根据零假设中假设的概率模型使用不同的检验统计量。一些常用的测试包括:

  • Z 检验(Z 统计):测量原始分数低于或高于总体平均值的标准偏差。z 分数也称为标准分数。
  • T 检验(T 统计):T 检验告诉你两组之间的差异有多显著;换句话说,它让你知道这些差异(以平均值/平均值衡量)是否可能是偶然发生的。
  • ANOVA (F 统计):与 T 检验类似,ANOVA 可以告诉你组间的差异有多显著。t 检验比较两组,而方差分析检验可以比较两组以上。
  • 卡方检验(卡方统计):帮助您找到包含零假设和替代假设的变量之间的关系类型。

进行分析时,您需要选择最适合您的实验的 T 统计量,并计算两个 T & P 值来评估您的实验性能。Statsmodels 库包括一些很棒的函数,可以帮助您进行上面提到的一些 t 测试。

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

来自 statsmodel 网站的截图

使用本笔记本中的代码计算基本 A/B 测试的 T-测试,该测试由两个互斥组组成,将为您提供 P & T 值。

总而言之…

虽然“A/B 测试”经常被用作增长努力的时髦词,但花时间适当地计划它们以最大化它们的影响是非常重要的。最终,如果您投入时间来正确设计、启动和衡量您的实验,您将为您的组织带来巨大的影响。更重要的是,你将在自己的职业生涯中推动真正的范式转变。

关于如何使用 SQLAlchemy 和 PostgreSQL 在 Python 和数据库之间进行交互的指南

原文:https://towardsdatascience.com/a-guide-on-how-to-interact-between-python-and-databases-using-sqlalchemy-and-postgresql-a6d770723474?source=collection_archive---------12-----------------------

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

来源: Toa Heftibaunsplash

使用 SQLAlchemy Python 库解释 Python 和 PostgreSQL 之间的联系,以及如何使用它的一些提示。

在进行数据科学项目时,您可能希望将 Python 脚本与数据库连接起来。一个名为 SQLAlchemy 的库在 SQL 和 Python 之间架起了一座桥梁。

存储数据库的一种方法是使用关系数据库管理系统,这是一种常见的数据库类型,数据存储在表中。但是,托管这些数据库需要软件。PostgreSQL 是允许这样做的开源软件。虽然不是必须的,但是在处理大量不同的复杂数据库时,可视化工具非常有用。可视化工具可以让您清楚地了解正在使用的数据库。在这些工具中,我选择了 TablePlus(Mac 版)和 phpMyAdmin(Windows 版)。

在本文中,我将向您展示配置您的系统需要遵循的不同步骤,以及在使用 Postgres 和 SQLAlchemy 时您需要知道的一些命令。

1.下载 SQLAlchemy 和 PostgreSQL

要安装 SQLAlchemy,您需要在计算机的终端中输入以下命令:

pip install SQLAlchemy

要安装 PostgreSQL,你需要进入那个网站。我也给你一个 macwindows 的教程。在配置 PostgreSQL 时记下您使用的登录名和密码是非常重要的,因为您将在与 TablePlus 和 Python 的连接中需要它。

2.下载可视化工具

它们是许多不同的可视化工具,但并不是所有的都有免费版本。此外,无论你用的是 mac 还是 window,用来可视化数据库的软件都会有所不同。我选择了 TablePlus,因为它非常容易使用,免费版本也非常好。这里是下载 TablePlus 的链接。

现在软件已经下载完毕,需要在 tablePlus 和 PostgreSQL 之间创建一个连接。这里是关于如何在 TablePlus 上做到的教程。

3.在 PostgresSQL 中创建数据库

在通过 SQLAlchemy 使用 Python 与数据库交互之前,我们需要在 PostgreSQL 中创建数据库。在这一节中,我还将向您展示一些与 PostgreSQL 交互的命令。

首先,您需要通过在终端中键入以下命令来连接到 PostgreSQL 服务器:

psql -U postgres

然后,你可以创建你的数据库,我们称之为“飞行”(避免使用大写字母)。

CREATE DATABASE flight*;*

既然已经创建了数据库,那么就可以创建表,使用 PostgresSQL 或 SQLAlchemy 插入值。我将向你展示这两种方法。

4.使用 PostgresSQL 创建表和插入值

您必须首先连接到要使用的数据库。以下命令必须在最后一节中的命令之后在同一终端中执行。所以这里我们要连接到数据库“航班”:

\connect flight;

现在我们想创建一个带有一些属性的表。我将把这个表称为“flights ”,其属性是航班的 id 、出发地、目的地和持续时间

CREATE TABLE flights (
    id SERIAL PRIMARY KEY,
    origin VARCHAR NOT NULL,
    destination VARCHAR NOT NULL,
    duration INTEGER NOT NULL
);

如果要创建没有任何属性的表,需要输入以下命令:

CREATE TABLE flights();

现在我们已经创建了属性,我们需要插入一些值。但是,要插入值,您需要先创建属性。

INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);
INSERT INTO flights (origin, destination, duration) VALUES ('Shanghai', 'Paris', 760);
INSERT INTO flights (origin, destination, duration) VALUES ('Istanbul', 'Tokyo', 700);
INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'Paris', 435);

然后,您可以在 TablePlus 中可视化您的表,您应该看到:

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

现在我将向您展示 Python 中的命令以及如何使用 SQLAlchemy 库。

5.使用 SQLAlchemy 创建表并插入值

如前所述,在与 Python 建立连接之前,您需要在 PostgreSQL 中创建一个数据库。因此,在本节中,所有代码都必须在 Python 脚本中实现。
首先要做的是创建一个引擎,它是一个用于管理数据库连接的对象。

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmakerengine = create_engine("postgresql://login:password@localhost:5432/flight")

创建引擎的一般格式是:
create _ engine(" PostgreSQL://log in:passeword @ localhost:5432/name _ database ")

在这里,由于我们想要在数据库 flight 上工作,我们将 flight 替换为 name_database登录密码对应的是你设置 PostgreSQL 时的那个。并且 5432 是端口,但是因为它是本地服务器,所以它是 5432。

然后,我们需要创建一个表和属性,还要向该表中插入值。首先,我们需要通过点击下面一行来创建一个作用域会话:

db = scoped_session(sessionmaker(bind=engine))

它与我们的应用程序并不十分相关,但在很多例子中却非常重要。想象一下这样一种情况,当我们将 web 应用程序放到互联网上,有多人同时尝试使用我们的网站时,我们希望确保 A 对数据库的操作与 B 对数据库的操作是分开的。

接下来,我们需要运行下面一行来创建一个表 flights ,其属性为 id、 出发地目的地持续时间。小心,语法与 PostgreSQL 中的有点不同:我们需要在末尾声明密钥。

# to create the table flights with all the attributes
db.execute("CREATE TABLE test (id INTEGER NOT NULL, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL, PRIMARY KEY (id));")# to insert values into the table flights 
db.execute("INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);")db.execute("INSERT INTO flights (origin, destination, duration) VALUES ('Shanghai', 'Paris', 760);")db.execute("INSERT INTO flights (origin, destination, duration) VALUES ('Istanbul', 'Tokyo', 700);")db.execute("INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'Paris', 435);")

然后,为了在 PostgreSQL 服务器上执行,我们需要提交更改:

db.commit()

在最后一步中,我们结束了会话:

db.close()

因此,整个代码总结如下:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker# creation of an engine
engine = create_engine("postgresql://login:password@localhost:5432/flight")# creation of a session
db = scoped_session(sessionmaker(bind=engine))# creation of the table flights with all the attributes
db.execute("CREATE TABLE test (id INTEGER NOT NULL, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL, PRIMARY KEY (id));")# insertion of values into the table flights 
db.execute("INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);")db.execute("INSERT INTO flights (origin, destination, duration) VALUES ('Shanghai', 'Paris', 760);")db.execute("INSERT INTO flights (origin, destination, duration) VALUES ('Istanbul', 'Tokyo', 700);")db.execute("INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'Paris', 435);")# commit the changes 
db.commit()# close the session
db.close()

6.SQLAlchemy 中的一些实用方法

可以想象,如果您有一个 10000 行的 csv 文件,逐行插入值会非常漫长和痛苦。幸运的是,pandas 库能够将 pandas 数据帧转换成 SQL 表。此外,pandas 理解元素的类型,因此在创建表时不再需要指定类型,但是我建议仍然输入类型。了解你正在处理的元素的类型极其重要

为了展示它是如何工作的,我使用了这个数据集。该数据集是关于 2015 年美国航班的。你可以在这里找到数据集。

我们将在相同的数据库上工作,而不是以前的飞行。我们将创建一个名为“airlines_2015”的表。
进口熊猫作为 pd

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmakerengine = create_engine("postgresql://login:password@localhost:5432/flight")db = scoped_session(sessionmaker(bind=engine))db.execute("CREATE TABLE airlines_2015();")dataframe.to_sql('airlines_2015', engine, if_exists='replace')db.commit()
db.close()

7.PostgreSQL 中的一些实用技巧

在这一节中,我将为您提供一些命令,您可以在终端中输入这些命令来与数据库进行交互。但首先,我将简要回顾一下我们到目前为止所看到的内容。

连接到 PostgreSQL 服务器:

psql -U postgres

创建数据库:

CREATE DATABASE *name_database ;*

连接到数据库:

\connect *name_database* ;

所有数据库的列表:

\l

创建表格:

CREATE TABLE name_table();

在下一个命令中,您需要连接到您想要查看的表的数据库:

\dt

如果您想要一个表格的描述:

\d table_name

最后,如果您想要关闭一些仍然打开的连接,您需要打开一个新的终端并运行以下命令(在每一行之后按 enter,因此您总共需要按 3 次 enter):

# first command
psql -U postgres# second command
\connect *nom_database*;# third command 
select pg_terminate_backend (pg_stat_activity.pid) from pg_stat_activity where datname = current_database() and pid <> pg_backend_pid();

8.结论和提示

我希望你在这篇文章中找到了你想要的东西。在从事数据科学项目时,您可能希望处理大量数据,并且需要通过创建数据库来组织数据。创建清晰架构的一种方法是绘制 UML 图。

如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名灵媒成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你使用我的链接注册,我将赚取一小笔佣金,你仍需支付 5 美元。谢谢大家!!

[## 通过我的推荐链接加入媒体-乔纳森·莱班

阅读乔纳森·莱班的每一个故事(以及媒体上成千上万的其他作家)。您的会员费直接支持…

medium.com](https://medium.com/@jonathan_leban/membership)

PS:我现在是柏克莱大学的工程硕士,如果你想讨论这个话题,请随时联系我。 这里的 是我的邮箱。

如何阅读统计表的指南

原文:https://towardsdatascience.com/a-guide-on-how-to-read-statistical-tables-8fcfdb9e1a56?source=collection_archive---------31-----------------------

一个计算主要概率分布概率的闪亮应用程序

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

闪亮的应用程序来计算主要概率分布的概率

作为我教学助理活动的一部分,我很快意识到学生们通常很难在统计表中找到概率。下面一个闪亮的应用程序帮助你阅读主要的统计表:

这个闪亮的应用程序帮助你计算主要概率分布的概率。

以下是完整的代码,如果你想加强它(见一个例子,如何使用这个应用程序后,嵌入式代码):

请注意,如果应用程序已经达到每月使用限额,链接可能会失效。如果是这种情况,请稍后再试。

这个 app 怎么用?

  1. 通过此链接打开应用程序
  2. 选择发行版
  3. 设置分布的参数(参数当然取决于所选择的分布)
  4. 选择是要查找较低的尾部、较高的尾部还是一个区间
  5. 选择 x 的值

在右侧面板(或下方,取决于屏幕大小)上,您将看到:

  • 你刚刚输入的数据的摘要
  • 数值解(即概率)
  • 解决方案的可视化
  • 概率密度函数以及平均值、标准差和方差

例子

这里有一个最常见分布的例子:正态分布

想象一下下面的问题:一家企业每周维护和修理的成本已经观察了很长一段时间,结果是按照一个平均为 402€、标准差为 22€的正态分布来分布的。已经为下周设定了 439€的预算,费用超出预算的可能性有多大?

要解决这个问题,请按照应用程序中的以下步骤操作:

  1. 选择正态分布,因为据说成本遵循正态分布
  2. 设均值μ等于 402,因为据说平均成本是 402€
  3. 在该语句中,给出了标准偏差(而不是方差),因此选择“标准偏差σ”并将其设置为 22
  4. 有人问我们成本超过预算的可能性有多大。因此,我们寻找概率高于某个 X,所以选择上尾 P(X > x)
  5. 我们现在被要求找出成本超过 439€的概率,所以设 x 等于 439

解决方案面板对数据进行了总结:

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

因此,下周成本超出 439€预算的概率为 0.0463,或 4.63%。

它还显示了正态分布(μ=402 和σ^2=484 ),阴影区域对应于我们正在寻找的概率。然后,它给出了关于密度函数,均值,标准差和方差的一些细节。

感谢阅读。我希望你会发现这个应用程序对计算主要分布的概率很有用。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

相关文章:

原载于 2020 年 1 月 6 日 https://statsandr.com

营销分析指南

原文:https://towardsdatascience.com/a-guide-on-marketing-analytics-d3936f0373f2?source=collection_archive---------38-----------------------

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

艾萨克·史密斯在 Unsplash 上拍摄的照片

随着购买者的旅程变得更加复杂,营销被视为成本中心,营销团队必须依靠分析来衡量他们努力的影响。传统上,营销工作往往被视为难以量化对收入的影响,但借助更好的分析工具,可以更容易地将营销与收入联系起来。

虽然分析的好处显而易见,但营销团队仍然没有采用工具,只有 31%的团队在决策中真正使用了分析工具。考虑到营销自动化、网络分析、CRM 和社交媒体之间的大量数据,采用的问题可以归结为缺乏从多个来源收集数据、确定指标和收集见解的知识。为了提供帮助,本指南将提供一些关于数据源、指标和分析仪表板最佳实践的见解,这些对于成功的营销分析非常重要。

仓库存储孤立的数据

数据通常存放在不同的 SaaS 工具和业务应用程序中,不幸的是,这意味着您的营销团队不能直接访问他们自己的数据。使用 SaaS 工具中的仪表板,如营销自动化仪表板,通常意味着您无法组合多个相关的数据源,也无法获得对讲述潜在故事很重要的更深层次的见解。

雪花这样的现代数据仓库工具允许营销团队将分散在不同数据源中的孤立数据连接起来,使其可视化,并做出更明智的决策。从您的营销自动化、web 分析、CRM、电子表格和电子邮件营销工具中提取数据,您可以创建更强大的仪表板来跟踪营销绩效,例如:

  • 符合营销条件的销售线索数量
  • 支出与客户购买成本、生命周期价值和回报时间
  • 社交媒体覆盖面和参与度

虽然数据仓库将每一个营销数据源结合在一起,但明智地聚合数据而不是将所有数据放在一起使其工作是很重要的。由于每个业务应用程序和 SaaS 工具的工作方式不同,它们的数据定义可能会有所不同,因此我们应该批判性地考虑什么应该组合,什么不应该组合。

营销仪表板最佳实践

随着仪表板成为商业标准,仪表板的组织和设计变得至关重要。营销仪表板应该分开,以便每个仪表板都与一个营销目标相关联。仪表板上的每个图表都应该建立在一个线性故事的基础上,解释营销目标的结果。通过使用这种方法,您将构建更有针对性的仪表板,因为每个图表都建立在前一个图表的基础上,所以可以很容易地找到信息。

在设计仪表板时,考虑每个仪表板的受众非常重要。要了解您的受众以及他们期望从仪表板中获得什么价值,请考虑提出以下问题:

  • 我的听众的信息需求是什么?
  • 我的听众需要做出什么具体决定?
  • 他们已经知道了什么?
  • 此外,这个仪表板将如何增加价值?

此外,当决定每个图表显示什么时,了解您的受众是否理解图表的上下文是很重要的。例如,他们熟悉每个图表的指标/KPI 吗?他们了解数据的来源吗?他们了解跟踪这些指标的含义吗?

您选择的指标和 KPI 将为您的仪表板提供最佳布局。这里有一个你可以遵循的框架:

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

Chartio

营销仪表板的类型

将每个仪表板集中到一个特定的区域,可以更容易地获取信息,并提供营销绩效的精细和高级视图。以下是你如何划分你的营销仪表板。

营销归因仪表板

归因仪表板非常适合量化整个客户旅程中许多接触点的 ROI。从 CRM 和预算/支出数据中,可以在媒体、渠道和活动级别跟踪以下指标:

  • 领导
  • 营销合格的销售线索
  • 合格销售线索
  • 客户赢了
  • 每个销售线索的成本
  • 每次采购成本
  • 年度合同价值和终身价值
  • 偿还期

营销漏斗仪表板

营销漏斗仪表板显示了从漏斗顶部到转化目标的整个过程。对于这个仪表板,您可以结合 CRM、营销自动化、网络分析和数字营销数据。

由于营销包含一系列学科,几乎每个营销计划都有自己的漏斗:

  • 转化漏斗:跟踪客户通过漏斗向转化结果(如销售)的进展。
  • 客户获取漏斗:跟踪数字营销活动的成果。
  • 内容营销漏斗:监控购买者的旅程,其中首次接触是一部分内容。

管道仪表板

管道仪表板侧重于连接来自营销和销售的数据,以显示营销如何推动公司收入。管道仪表板跟踪潜在客户在管道漏斗中的进展:

  • 合格销售线索
  • 销售机会
  • 成交的交易
  • 年度合同价值

内容营销仪表板

内容营销包括博客、门控内容、视频、信息图表等等。内容营销仪表板提供了关于内容如何推动转化的见解。这些指标可以来自内容管理系统、社交渠道和网络分析的综合数据。

可以为非门控内容显示以下指标:

  • 页面视图
  • 页面上的平均时间
  • 新访客
  • 跳出率
  • 社会共享

此外,以下指标可能与门控内容相关:

  • 登录页面视图
  • 内容第一接触归因
  • 营销合格的销售线索
  • 销售机会受到影响
  • 赢得的销售机会

社交媒体仪表板

随着社交媒体的持续重要性,衡量社交媒体活动的投资回报率变得越来越重要。社交媒体仪表板包含来自社交媒体渠道的聚合指标,如:

  • 页面赞数和浏览量
  • 社交渠道上的分享
  • 点击率
  • 跳出率
  • 赞助帖子和广告

Web 分析仪表板

网络分析仪表板收集网站流量数据、移动分析数据、营销自动化和网站优化数据,以跟踪以下指标:

  • 独特的网站访问者
  • 回访者
  • 跳出率
  • 流量来源(直接、有机、付费、推荐)
  • 按流量来源的转换

搜索引擎营销和优化仪表板

搜索引擎营销仪表板让您可以看到搜索引擎上的付费广告,以及如何优化您的广告。这些数据来自网络分析和在线广告工具等来源,可用于跟踪以下指标:

  • 客户获取成本
  • 点击率
  • 每次转换的成本
  • 每次点击成本
  • 活动总成本
  • 排名活动绩效
  • 归因于付费搜索的线索
  • 付费搜索的成功案例
  • 来自搜索的流量
  • 你转换目标的转换率
  • 高转化率关键词

就这样

使用仪表板执行营销分析对于跟踪指标非常重要,这种方式可以让您更好地了解您的营销费用,并更深入地了解什么在起作用,以便您可以改进您的营销活动和内容。

为你的团队构建营销仪表板并不一定很难,也不一定要花很多钱。您只需了解市场上有哪些专业工具,并且这些工具将满足您收集、准备和分析数据的业务需求。

请通过 Waterfront Analytics 联系我们,我们可以帮助您选择和设置一些关键工具,开始分析您的数据并推动您的营销工作。

指南:文本分析、文本分析和文本挖掘

原文:https://towardsdatascience.com/a-guide-text-analysis-text-analytics-text-mining-f62df7b78747?source=collection_archive---------12-----------------------

它是什么、应用和用例、工具以及它如何改进业务决策的指南

传统上,企业利用他们在实体店的存在来了解他们的客户——如何吸引、吸引和取悦他们。

然而,随着我们将我们的关系转移到网上,以数字渠道作为主要的互动点(特别是通过 COVID19 带来的全球 WFH 和社交距离措施),这种理解客户的能力在这种距离状态下受到了损害。

也不是说我们和他们的互动减少了。其实恰恰相反。

企业与客户的互动比以往任何时候都多。大多数企业都感受到了全渠道和无处不在的压力。这种关系的数字化本质也意味着每一次点击、每一笔付款、每一条信息都可以被追踪和衡量。

那么,有什么问题呢?

正是因为信息太多,我们很难真正了解我们的客户。信息过载。分析麻痹。我们错过了关键的洞察力,因为实在是太多了。

这就是文本分析的用武之地。

文本分析帮助企业以可扩展、一致和公正的方式分析大量基于文本的数据。在不需要过多资源的情况下,它分析数据并提取有价值的信息,让公司自由地根据这些见解采取行动。

鉴于 80%的业务信息大多是非结构化文本数据,这种形式的智能自动化对于现代企业在竞争中保持领先地位的同时继续吸引、吸引和满足客户变得至关重要。

在本指南中,您将看到文本分析的概述,它在商业中的应用,以及一些帮助您入门的工具。请随意进入您感兴趣的部分:

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

1。 定义:什么是文本分析?

2。 文本分析有哪些应用和用例?

3。 有哪些文字分析的软件或工具?

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

定义:什么是文本分析?

文本分析是分析非结构化和半结构化文本数据以获得有价值的见解、趋势和模式的过程。

它通常用于需要处理大量基于文本的数据以获得洞察力的情况,但如果不这样做,人工分析将会耗费大量资源和时间。

  • 使用文本分析的一些情况包括:
  • 查看过去 3 年的支持票证,了解一段时间内客户关注的趋势
  • 分析 1,000 份关于新产品发布反馈的客户调查
  • 寻找最有影响力的话题来构建您的聊天机器人或知识库

在所有这些情况下,文本分析方法将胜过人类。不仅仅是更少的时间和资源,最终的见解也更符合更少的人为错误或偏见干扰的过程。

因此,所有行业的许多组织都在使用文本分析方法来获得对其文本数据集的定量和定性理解。然后将这些信息与数据可视化工具结合使用,以更好地将信息转化为可操作的见解,从而做出明智的决策。

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

维恩图显示了文本分析(或文本挖掘)与六个相关领域的交集:统计学、人工智能和机器学习、计算语言学、图书馆和信息服务、数据库和数据挖掘。来源:G.Miner 等人的 非结构化文本数据应用的实用文本挖掘和统计分析 图片由作者提供。

文本分析、文本挖掘和文本分析有什么区别?

文本分析、文本挖掘和文本分析是同一个概念,通常可以互换使用。

文本分析和自然语言处理(NLP)有什么区别?

自然语言处理实际上是更广泛的文本分析领域的一个子集,这就是为什么这两者之间的差异往往难以理解。

先说文本分析和自然语言处理的定义。

文本分析是关于检查大量的文本,以产生新的和相关的见解。

自然语言处理(NLP),或者更具体地说,自然语言理解(NLU),帮助机器“阅读”、“理解”和复制人类语音。

在文本分析的过程中,使用各种分析方法来获取洞察,自然语言处理就是其中之一。NLP 实际上是文本分析、计算语言学、AI 和机器学习之间的交叉领域。

文本分析和 NLP 的关键区别在于每个领域的目标。

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

图片作者为纯语音技术

文本分析旨在仅从文本或单词本身获得质量洞察。不考虑文本中的语义。它回答的问题包括单词的频率、句子的长度以及单词的存在与否。

另一方面,自然语言处理旨在理解文本背后的语言使用和语境。这里分析语法结构和语义。它可以回答诸如句子背后的意图、人们的语言习惯等问题,甚至可以将你的电子邮件分类到主要、社交、推广或更新标签中。

这两者经常一起使用,以提供对人类交流的数字和上下文的理解。

那么,这些在商业中是如何使用的呢?下一节将涵盖文本分析的用例及应用。

文本分析有哪些应用和用例?

文本分析的应用非常广泛,可以应用于任何基于文本的数据存在的地方。

无论是客户反馈、电话记录还是冗长的反馈调查,文本分析都能帮助团队相对轻松地从文本数据中获得定量和定性的意义。

由于 80%的业务信息是非结构化的,主要是文本格式的,文本分析在业务的所有功能中都很有用。

让我们来看看其中的一些应用:

客户服务团队的文本分析

对于大量的客户通信,文本分析方法对于客户支持团队来说是非常有用的,这是显而易见的。

客户服务团队通常是最紧张的,在任何公司中都有一些最高的离职率,并且在任何给定的一天里都面临着处理大量客户互动的大量压力。

通过采用文本分析,服务团队可以自动化他们的许多日常任务,如研究、更新、路由,并减少在重复问题上花费的时间。相反,他们将在 NLP、机器学习和人工智能的支持下,增强自己超越 NPS、满意度和 CSAT KPI 的能力。

那么,文本分析在客户服务中到底是如何工作的呢?

使用下面的目录跳到您感兴趣的用例,请继续阅读🙂

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

用例目录:客户服务团队的文本分析

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

客户对话分析和洞察

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

图片作者为纯语音技术

作为企业和客户之间沟通的主要媒介,客户对话,无论是来自电子邮件、支持票、社交媒体还是聊天,都为了解客户需求和促进业务增长提供了丰富的信息。

  • 在这些对话中,蕴含着对以下问题的宝贵见解:
  • 与他人相比,表现出色的客户服务代表使用了哪些技巧和短语来超越他们的 KPI?
  • 过去 5 年中,每月最大的客户趋势是什么?
  • 客户互动中最大限度留住客户的关键时刻在哪里?

所有与客户沟通的企业都可以获得这些知识。然而,没有多少人使用它,更不用说能够提取它。

这就是文本分析的魔力所在。

借助文本分析工具和技术,可以大规模消化和分析客户通信数据,从而为客户服务团队找到数据驱动的洞察力,以超越他们的 KPI。

想知道顶级代理商是如何留住高价值客户的吗?文本分析不是通过高价值客户和高 CSAT 分数进行过滤,然后查看他们成千上万的对话日志,而是为你做艰苦的工作。

信息提取技巧确定表现出色的代表在这些对话中有效使用的产品、服务、关键词和短语。微观分类技术揭示细节,让您找到使用这些短语或关键词产生客户满意结果的顺序或模式。

在没有大量资源或时间的情况下,客户服务团队可以找到成功的短语、关键词、语言、语调以及这些的组合来产生出色的结果。

早期发现高价值客户和客户问题

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

图片作者为纯语音技术

对于任何想要做好的企业来说,发现潜在客户或像你最好的客户一样的客户的能力是非常重要的。同样有用的是快速消除任何可能升级的潜在问题的能力。

你知道什么更好吗?早期发现的能力。

作为客户和公司之间的中介,客户服务团队最适合预先筛选有价值的客户和客户问题。

  • 在对话中,您可以轻松获得见解并回答如下问题:
  • 高价值线索和客户的沟通模式有哪些?
  • 为了防止品牌受损,我们需要迅速关注哪些客户突破话题?
  • 客户使用哪些渠道来解决不同的问题,我们如何转移资源来更好地管理他们的偏好?

在潜在的客户问题成为大问题之前检测它们是客户支持中文本分析的常见用例。简单的聚类和主题建模技术可以帮助团队实时解决这些问题。

但是,它如何识别有价值的客户呢?

传统上,确定理想客户是通过客户终身价值、购买频率、宣传等指标。但是这些并不是他们唯一共有的特征。

通过结合文本分析技术,你可以发现他们购买前的路径、联系偏好,甚至是他们沟通中单词和短语组合的相似序列。

这些都可以在客户服务工具和通信中找到。

使用微分类,细微的含义被附加到文本的小部分,让客户服务团队附加灵活而详细的数据解释,以获得广泛的分析结果。然后,聚类和主题建模技术使用这些全面的类别来发现趋势和关系,以揭示数据支持的见解,从而揭示有价值的客户识别模式。

剩下的是帮助锁定和优先考虑高价值客户以实现团队 KPI 的模式和识别特征。

这一过程会耗费大量资源,但有了文本分析,深入现有数据寻找关键绩效指标的洞察力不仅更快,而且更加准确和可扩展。

自动化票证路由、优先级划分和标记

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

图片作者为纯语音技术

众所周知,交接对客户来说是令人沮丧的,但大多数人都忽略了它对客户服务团队来说同样令人烦恼。

效率低下或完全不正确的机票发送和优先顺序会导致客户不满,并对员工大打出手。强调尽可能多的快速浏览也不会促进有助于对话分析的高质量的互动后工作(总结时间)。

在这一点上,没有人是赢家。

  • 输入,文本分析。以下是它在支持团队中帮助票证自动化的 3 种方式:
  • 根据客户、问题和票证内容的紧急程度,自动将票证发送给适当的代表
  • 根据自动检测到的紧急程度和情绪确定票证的优先级
    通过自动对话标记减少交互后的工作和对话分析

自动化票据路由和优先级的好处是显而易见的,但是自动化标记有必要吗?

绝对的。

自动标记有助于减少客户互动后耗时的包装时间。全球平均包装时间为 6 分钟。这相当于员工在每次谈话后花了 6 分钟的宝贵时间来完成数据输入和充当人工路由器。

更重要的是,标记是在对话分析中提取价值的关键基础。没有高质量和准确的标记,分析结果毫无意义。你会相信不准确和不完善的数据集能给你带来创收和令客户满意的见解吗?没想到会这样!

那么,它是如何工作的呢?

  1. 提取。这种技术可以帮助您找到主题、关键字、实体,甚至紧急程度。分配标签。
  2. 分类。这一步让您可以控制添加额外的公司或行业特定标签,以定制您想要查看的详细程度和价值。分配标签。
  3. NLP 训练标记数据,应用于过去和未来的对话。
  4. 监控标签并根据需要添加新标签。

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

图片作者为纯语音技术

客户报告之声

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

图片作者为纯语音技术

自然,作为公司客户前线的团队,支持团队完全有能力代表公司的客户支持者。

但是,客户服务流程和员工的日常管理已经够具挑战性了。并不总是有足够的时间或资源致力于在对话中发现影响底线的见解。

这就是文本分析伸出援手的地方。

在对话中发现的一些客户意见包括:

  • 潜在高价值客户表现出哪些沟通序列或模式?
  • 下个季度客户最关心的 5 个问题是什么?
  • 哪些问题或主题占用了团队的大量资源,但可以用自动化方法轻松回答?(如知识库或聊天机器人)

Intent Manager 这样的文本分析工具很大程度上为你运行分析。经过一些人为的培训,定制你希望你的团队或公司看到的价值后,它会自动挖掘洞察力。

代表你,它将不知疲倦地工作,提取有用的模式,序列和关系,你的客户。

**想报告顾客渴望看到什么并将为下一季度支付什么?**文本分析技术,如提取、分类和主题建模,可以结合使用,以找到热门主题,衡量他们的挫折感,并估计解决问题的价值。

**想通过引入自动化聊天机器人来处理第 1 级查询,从而提高服务团队的效率吗?**文本分析方法可以为您提供数据支持的信息,包括这些查询被提出的次数、被提出的频率以及解决这些查询需要多少次互动。更好的是,它为您提供了开始训练聊天机器人的主题数据,确切地说,使用什么样的训练数据,以及提供自动响应所需的所有信息。

那是为你准备的大部分工作。

这些见解可以导出到数据可视化平台,使报告更具美感,在会议中更容易理解。

文本分析简化了客户报告之声。它有助于创造可靠的、有数据支持的、直接来自客户的见解,当然也不会损害你作为公司客户代言人的地位😉。

简化知识库的创建和维护

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

图片作者为纯语音技术

随着客户和员工将偏好转向自助服务,知识库变得越来越重要,支持团队也在尝试自动化不太复杂的任务,以腾出代理时间。

无论是内部的还是面向外部的,3 个关键因素决定了知识库的成功:

  • 相关性 —用户需要能够找到不需要代理干预的最常见、最紧迫的问题
  • 清晰 —用户需要理解定义、说明和解释来解决他们的问题
  • 可搜索性 —用户需要能够轻松、轻松、快速地找到信息

虽然知识库的概念和好处很容易理解,但实际的创建和维护可能是一项艰巨的任务。

您知道客户询问的不需要代理帮助的三个主要话题吗?什么事?伟大的

你知道这些话题中最常被问到的前 5 个问题吗?什么事?太棒了

您知道顶级支持代表如何回应,以使客户理解并满意吗?通常,这里有很多思考的面孔🤔。

拥有这三个问题的答案对于创建一个对客户和公司都有益的知识库至关重要。

拥有相关的核心主题有助于用户找到答案。包括最常见的问题有助于减少代理在回答琐碎问题上花费的宝贵时间。用容易理解的语言和结构回答问题是知识库有用性的基础。

显然,这比大多数团队签约的工作量要多得多。

好消息是,整个过程可以通过文本分析加速!

  • 通过对历史客户信息进行文本分析,您可以发现:
  • 自助知识库中可以解决的核心客户主题
  • 每个主题中最常见的问题
  • 知识库中的答案应该如何措辞和组织,以便于理解

好奇文本挖掘如何帮助创建更好的知识库?作为一个例子,让我们看看它是如何对清晰度做出贡献的。

使用信息提取聚类技术,我们能够找到客户用来描述他们的问题的方言。这允许团队使用他们理解和搜索的语言,帮助他们在知识库中找到答案。

此外,主题建模和微分类技术可以结合起来,以找到客户在询问特定主题时可能会有的相关查询,帮助创建导航链接和资源,以全面解决问题。

毕竟,如果用户只通过自助服务解决了一半的问题,他们仍然需要与人交谈来解决剩余的问题,这违背了自助服务渠道的目的。

营销团队的文本分析

在吸引、吸引和取悦客户的业务中,营销团队通过尽可能多地了解他们的线索和客户而受益匪浅。

营销需要知道他们正在经历什么样的痛苦,他们在哪里闲逛,为什么他们对你的产品或服务有某种感觉,等等。马上,一些问题浮现在脑海里:

  • 你如何进入他们的思想和鞋子?和;
  • 如何在不超载的情况下捕获这么多有价值的数据?

使用文本分析有助于缓解这两个问题引起的问题。

为了了解顾客的想法和感受,公司通常通过调查、采访和反馈的形式来了解他们。这些方法都很棒,但是通常被忽视的,实际上是以最公正和不受影响的形式呈现的反馈,是客户沟通。

客户沟通可以有各种形式——社交媒体评论、私人消息、支持票、电话记录、电子邮件和实时聊天——这只是基于文本的最大数据源中的几个例子。

给定足够的数据和一些 NLP 训练,文本分析帮助营销团队处理大量的通信,并将它们转化为对客户满意度和创收有用的见解。

至于文本挖掘如何帮助信息过载,它的优势在于它的机器学习和 AI 增强。持续不懈地,营销团队可以大规模地处理大量的通信,减少信息过载对有价值的洞察力提取的影响。

听起来很方便,对吧?

让我们更深入地研究一些有形的文本分析营销用例。

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

用例目录:营销团队的文本分析

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

寻找新的品牌意识和目标战略

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

图片作者为纯语音技术

利用随时可用的历史客户互动,文本分析技术可用于提取有价值的见解,以新的方式锁定客户并提高意识。

客户互动的发生是因为客户希望分享一个观点,无论是投诉、称赞、意见还是请求。这里重要的一点是,他们已经想尽办法去接触公司,以表明自己的观点。

这使得它们对营销人员来说很有价值,可以洞察他们客户的世界——他们担心什么,体验什么,感觉什么,计划用你的产品或服务实现什么。

遗憾的是,没有多少公司认为这是一种绝妙的营销手段。

部分问题源于交互量的巨大。从 10 多个渠道的数百万条历史信息中找出联系和模式是非常困难的。此外,它的定性性质也没有帮助,因为大多数公司更喜欢量化他们的报告和成就指标。

这就是文本挖掘变得非常方便的地方。它在定量和定性两个层面上进行报告,并且很容易扩展到处理数百万次交互。

文本分析用于客户沟通,以获得营销见解,可以回答以下问题:

  • 客户问题和我们传达的信息之间是否有误解,我们如何使用他们的话?
  • 有多少线索通过特定渠道、媒体或影响者接触到我们的品牌?他们对品牌的加权看法是否证明了对渠道、媒体或影响者的投资或进一步投资是合理的?
  • 在客户的整个生命周期中,客户满意度在互动中的演变是怎样的?我需要瞄准哪一点才能赢回他们?

早期客户趋势检测

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

图片作者为纯语音技术

对营销团队来说,掌握客户趋势一直很重要。如今保持领先的问题是要跟上大量的新事物。

下一个新频道是什么?谁是最新的影响者?新的线索从何而来?

幸运的是,在您的交流中,现有客户和潜在客户已经可以回答其中的一些问题。

找出他们是通过什么渠道了解你的品牌的,哪些影响者转变了他们对你的产品的信任,以及他们以前在哪里听说过你的服务,这有助于你找到其他像他们一样的人。

这并不是建议对你所有的潜在客户和客户进行大规模采访,而是要挖掘你过去的所有互动,其中大部分信息可能已经存在。

  • 通过使用文本分析,营销团队可以回答如下问题:
  • 我的客户和潜在客户有兴趣尝试哪些渠道?我的品牌出现在那里有意义吗?
  • 我的客户信任哪些有影响力的人,我如何定位品牌才能与之保持一致?
  • 我的客户对什么话题感兴趣或关注?他们希望如何解决这个问题?

挖掘过去和正在进行的互动有助于营销团队监控客户聊天,并领先于新出现的话题。这种在客户洞察方面的领先优势使营销能够专注于制定客户支持和数据驱动的营销决策,而不会被信息和分析所淹没。

抓住潜在客户机会

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

图片作者为纯语音技术

优秀的营销团队能够发现一些线索转化为客户的例子。优秀的营销团队会在这些阶段找到线索,从而优化转化率。世界级的营销团队?他们发现标志着潜在客户向客户转化的模式和行为,这样他们就可以一路培养下去。

你是如何从优秀的走向世界级的

最切实的方法之一(显然是有数据支持的😉)是文本分析。也就是说,分析客户文本数据,如对话、社交媒体互动和支持票,以确定处于考虑阶段的人们共享的沟通模式。

这可能是他们使用的沟通渠道的模式,他们问的问题的类型,甚至是他们在互动中选择单词的顺序。

文本分析有助于在您的客户的沟通风格中找到这些独特的细微差别和模式,以更好地识别处于甜蜜转换点的未来线索。

  • 文本分析可以帮助营销人员回答的其他一些问题包括:
  • 符合营销资格的销售线索会问什么样的问题和回答才能真正将其归类为符合销售资格?
  • 是否存在一种识别潜在高价值客户的沟通模式?
  • 在互动中,我使用哪一组品质来评估销售线索的潜在客户终身价值?

文本分析消除了人类在消化所有这些对话以提取潜在价值标识符的过程中产生的偏见、错误和不可避免的令人兴奋的无聊感。剩下的是营销团队可以执行的可操作的见解,充分利用潜在客户机会。

定量和定性的营销报告

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

图片作者为纯语音技术

客户体验的营销报告通常以量化数字为中心,例如:打开率、参与度、流失率和保留率。众所周知,这些指标通常无法捕捉客户体验及其满意或不满意的全貌。

这一差距是由于缺乏对定性见解的报告而造成的。这些见解来自非结构化数据源的内容,如客户对话、反馈和电话记录。大多数公司只获取这些数据来源的数字:票证数量、问题解决时间、电子邮件打开率、参与比例等。

更重要的是,尤其是在衡量顾客对品牌的意见和满意度时,这些互动的内容。当客户表达他们对某个品牌的快乐时,真正有意义的是他们在通过文字表达自己的观点,而不是简单地在帖子上一个“赞”。

试图获取这些定性来源的问题在于,人们认为无法对其进行衡量。营销报告由数字主导,如果用其他方式表达,会降低对营销团队工作的信任。

那么,你如何抓住营销团队在客户体验方面的全部出色工作,同时确保你用数字传达它的重要性?

答案?文本分析。

借助文本分析,可以捕捉到以前仅在定性洞察领域出现的一些要点:

  • 是否有我们以前没有考虑过的“顾客表达的使用产品 X 的动机”的集群?
  • 谈论产品 X 时使用的情感语言与之前在过去的互动中表达负面情绪的客户之间有关系吗
  • 客户在谈论产品 X 时,表达情感的话语有哪些?

文本分析从非结构化的客户数据中获取定量和定性的见解。在获取定性数据时,需要采用定量方法来寻找能够揭示数据内容的模式和序列。

为了说明这一点,假设我们想报告本季度尝试的新的客户启发的目标定位策略。在对社交媒体评论进行文本分析后,发现许多客户使用以下顺序:“人”+我们需要这个是为了/我们需要得到这个是为了+“目的”。在评论中,这可能看起来像: @monica 我们需要在这上面认识一些新的供应商

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

图片作者为纯语音技术

Intent Manager 这样的文本分析工具在数以千计的社交媒体评论和多个渠道中检测这一序列,将主要动机归为一类,作为了解潜在客户为何对您的产品感兴趣的关键因素。然后,这可以用于创建新的目标活动,或提出客户数据支持的新战略提案。

在不需要人工干预或过多资源的情况下,文本分析一旦得到训练,就可以让营销团队更全面地捕捉他们的劳动成果进行报告,并做出更好的数据驱动、客户支持的营销决策

聊天机器人团队的文本分析

聊天机器人团队面临许多独特的挑战。

在许多商业系统中过时的流程和协议的背景下,在对话式人工智能中追求创新的同时,他们必须最大化商业价值,鼓励采用并解决客户数据的混乱,同时仍然驾驭技术的复杂性。

毫无疑问,对于一项迅速成为现代商业必需品的技术来说,这是最艰难的工作之一。

幸运的是,文本分析有助于应对这些挑战。其扩展模式和洞察力提取的能力有助于聊天机器人团队在整个组织中加强其工作的价值,并解决聊天机器人特有的问题,如意图冲突。这些技术对于使用企业聊天机器人的团队特别有用,因为企业聊天机器人中的数据有 100,000 或数百万。

让我们通过一些用例来了解文本分析如何帮助聊天机器人团队。

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

用例目录:客户服务团队的文本分析

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

衡量聊天机器人的跨组织价值

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

图片作者为纯语音技术

聊天机器人通常一开始是为专门用途而构建的,当需要为其他团队或用例改变用途时,团队会发现很难证明相同的价值或获得相同的采用。因此,许多团队努力为整个组织的关键商业价值做出贡献,而不仅仅是一个固定的用途或一小组目标。

文本分析通过微分类或“标记”方法,帮助组织中的其他团队了解聊天机器人的价值,能够根据其特定业务部门的需求对数据进行个性化解释。

为了说明这个例子,让我们假设一个客户在聊天机器人交互中响应,“我永远无法在 Slack 消息中找到我需要的文件”。根据您所在的团队,您将分配不同的下一个最佳行动“标签”。

  • 客户服务团队可能会标记:“在知识库中添加更全面的操作方法搜索”。
  • 开发团队然后可以标记:“为下一次更新优先改进可搜索性”。
  • 营销团队可能会标记:“将此作为改进搜索功能更新的客户启发信息”。

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

图片作者为纯语音技术

通过让团队能够根据他们的特定需求和目标定制价值(以及“下一个最佳行动”),聊天机器人的感知价值和采用率自然会增加。更好的是,文本分析不需要聊天机器人团队的广泛协调,而是授权其他团队从一个民主化客户数据之声的渠道创造价值。

此外,随着团队将他们的解释添加到数据中,可以绘制更复杂的交叉分析和模式。结合起来,他们提供了更多的机会来寻找进一步的自动化机会,创收的想法和客户满意的战略。

识别高影响力的自动化机会

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

图片作者为纯语音技术

作为聊天机器人团队,你总是在寻找用智能自动化技术优化业务流程的方法。问题是,它们值得投资、时间和资源吗?

为什么不征求一些客户的意见呢?他们告诉你他们将如何花费更多,如何感到满意,如何推荐他人。你所要做的就是倾听。

借助文本分析,您的团队可以积极听取大量客户意见,包括支持票、反馈、社交媒体评论和电子邮件,而无需进行监控。

分析客户互动有助于发现以下自动化机会:

  • 客户经常提到或要求
  • 当被客户提及时,会联想到负面情绪
  • 基于您选择的标准或过滤器的优先级

无论您希望了解哪些自动化机会将产生最大影响,还是了解对特定产品功能的关注,文本分析都有助于整理客户输入,为您的团队提供数据驱动、客户支持的见解,以便采取行动。

结果也可以根据您团队的目标进行定制。通过 NLP 的人在回路训练,你的团队可以定制主题聚类以适应焦点或目的的变化。

解决令人沮丧的意图冲突

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

图片作者为纯语音技术

意图冲突(也称为双重意图或意图冲突)是令人讨厌的聊天机器人问题,源于聊天机器人旅程开始时不正确的 NLP 训练。通常,这源于 T4 没有有效地管理聊天机器人收到的大量问题。

它们很难检测,更难确定如何修复以及在哪里修复,这使得修复成为一个成本高昂且耗费大量资源的问题。

有了像 Intent Manager 这样的文本分析工具,聊天机器人团队可以:

  • 快速识别冲突意图
  • 查明导致问题的训练短语
  • 在潜在的意图冲突发生之前对其进行监控

无需投入大量资源来回溯训练,然后手动重新分类短语,文本分析技术可以帮助聊天机器人团队快速发现意图冲突,并提供快速解决冲突的解决方案。

有哪些文字分析的软件或工具?

在我们深入研究这些工具之前,这里有 3 个问题是你在为你的企业选择文本挖掘工具时应该问自己的。

1。我希望看到什么样的商业价值?

不言而喻,对于一个文本分析软件来说,最重要的标准应该是它获取商业价值的能力。洞察力不应该只停留在最“常见”或“趋势”的方面,而应该以潜在的业务目标作为过滤器进行分析。一个好的工具需要让用户定制过滤器。

2。我需要考虑我的文本数据的哪些特征?

为您的特定用例找到最佳软件或工具在很大程度上取决于:

  • 文本类型
  • 文本量
  • 您希望在结果中看到的详细程度
  • 有多少已经被人类分类或“标记”

根据这些因素,最适合您的用例的文本分析技术的类型会有所不同,每种技术的微小变化都会极大地影响您应该使用的技术。

3。它在多大程度上符合我的技术环境?虽然总是建议为工作寻找最好的工具,但当你有非常具体的技术组合时,这有时是不可避免的。在这种情况下,您需要考虑文本分析工具的集成情况。理想情况下,找到一个与技术无关的工具,并与您的堆栈配合良好。

这些是你应该问自己的第一个问题。这里有一个链接,链接到选择 NLP 工具的考虑事项的更全面的列表。

相关:会话分析的 3 个阶段,简化。

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

图片作者为纯语音技术

说完了,我们再来看一些文本分析工具,按初级中级高级三个级别的文本分析进行拆分。

初学者三重奏

  • 您的 CRM
  • 擅长
  • 社交倾听工具

你会惊讶地发现,有多少大公司仍在混合使用他们当前的工具和 Microsoft Excel 来分析沟通。毫无疑问,这是一种开始分析的快速方法,但从长期或中期来看,它是不可扩展的。

如果你正处于这个阶段,建议你快速了解你想从文本分析中得到什么,以及你需要什么分析工具。然后,尽快升级到该工具。好处无穷。从文本分析流程的所有阶段节省了数百个小时,以及更快的业务响应以降低成本或创造收入。

“最佳实践”工具

许多大型组织在他们的对话分析中使用这些工具,这是正确的。它们很简单,由通用的 NLP 驱动,适用于所有部门、行业和团队。

然而,其中许多产品的一个大缺点是,它们大多能很好地与它们的产品套件配合使用,并且需要昂贵的定制、资源和培训来与企业环境中的其他技术相结合。然后,东西会很快变贵。

在分析深度方面,他们能够很好地挑选出话语中的元素,但往往过于笼统,无法获得更深层次的商业价值。

不要相信我的话,你可以在谷歌和 Azure 的登陆页面上试试它们的演示。插入一段对话,自己看看结果。他们能在多大程度上提取相关和具体的信息来推动您的组织采取富有成效的行动?

“深潜”工具

这些工具为您的客户沟通提供了更多的内容和意义。他们试图理解对话、所有的模式和细微差别,以便提供有价值的、可操作的和有意义的见解。

纯语音技术专家喜欢这些工具的另一个原因是因为它们很灵活。他们不依赖于某一套特定的产品。企业已经拥有如此复杂的技术环境。没必要再加一个和别人玩不好的工具。

外卖食品

在我们这个时代,企业和客户之间的交流量不可避免地在增加。能够管理大量信息并获得业务驱动的价值正成为一家成功或失败公司的明显标志。

因此,文本分析工具正迅速成为任何有前途的企业的必备工具。

它提供了一种工具,将直接来自客户的见解民主化到业务的所有部分。无论是营销、客户支持、产品还是创新团队,不可否认的是,直接的客户洞察可以对团队的方向和底线盈利能力产生影响。

如果你对对话式 AI 的文本分析有疑问,给我们发消息!教育是 Pure Speech Technology 的重要支柱,我们很乐意回答您的文本分析问题。

内容概要:本文详细探讨了双馈风力发电机(DFIG)在Simulink环境下的建模方法及其在不同风速条件下的电流与电压波形特征。首先介绍了DFIG的基本原理,即定子直接接入电网,转子通过双向变流器连接电网的特点。接着阐述了Simulink模型的具体搭建步骤,包括风力机模型、传动系统模型、DFIG本体模型和变流器模型的建立。文中强调了变流器控制算法的重要性,特别是在应对风速变化时,通过实时调整转子侧的电压和电流,确保电流和电压波形的良好特性。此外,文章还讨论了模型中的关键技术和挑战,如转子电流环控制策略、低电压穿越性能、直流母线电压脉动等问题,并提供了具体的解决方案和技术细节。最终,通过对故障工况的仿真测试,验证了所建模型的有效性和优越性。 适用人群:从事风力发电研究的技术人员、高校相关专业师生、对电力电子控制系统感兴趣的工程技术人员。 使用场景及目标:适用于希望深入了解DFIG工作原理、掌握Simulink建模技能的研究人员;旨在帮助读者理解DFIG在不同风速条件下的动态响应机制,为优化风力发电系统的控制策略提供理论依据和技术支持。 其他说明:文章不仅提供了详细的理论解释,还附有大量Matlab/Simulink代码片段,便于读者进行实践操作。同时,针对一些常见问题给出了实用的调试技巧,有助于提高仿真的准确性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值