TowardsDataScience-博客中文翻译-2021-六-

TowardsDataScience 博客中文翻译 2021(六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

赢得数据科学面试的 6 个有用技巧

原文:https://towardsdatascience.com/6-helpful-tips-for-acing-your-data-science-interview-d6ec2a7a86ba?source=collection_archive---------12-----------------------

面试你的第一份数据科学工作?这里有一些你可能想事先知道的提示。

地图框从 Unsplash 拍摄的照片

数据科学现在是一个热门领域,数据科学家的工作需求量很大。

如果你也对这份职业感兴趣,那么如果你想得到这份工作,你就需要为面试做好准备。

在这篇博文中,我将给出如何通过数据科学家面试的六个技巧,这样你就能被录用了!

1.研究工作简介和组织

工作简介和招聘单位会让你对期望有一个很好的了解。

例如,如果你的面试官提到他们公司正在寻找能够“利用深度学习技术”或类似的人,那么事先温习一下这些概念可能会很有用。

准备好这些知识将证明你为面试这个角色做了多少准备,同时也确保在面试过程中没有任何事情让你分心!

如果他们想要更高级的人,而不是初级职位,不要在简历中提到任何实习或低级职位。

提前研究这些信息可以确保双方都知道面试过程中的所有期望。这样,就不会有意外或沟通失误导致面试失败。

2.练习商业案例问题

商业案例问题可能是最常见的面试问题之一。他们需要批判性思维和数据知识,这使他们成为衡量你是否准备好担任这种角色的好方法。

如果可能的话,试着和熟悉数据科学的人一起练习这些问题,这样你就知道会发生什么了!这将有助于在实际面试过程中增强你的信心,让你在与其他候选人的竞争中占据优势。

一些常见的业务案例问题包括:

  • 您如何识别信用卡数据集中的欺诈活动?
  • 对于一家移动电话公司,你降低客户流失率的策略是什么?
  • 你是一家新的在线零售商的首席执行官。假设您没有销售数据,您可以使用哪三种方法来确定库存中的产品?

能够有效地回答这些类型的问题将表明您有能力进行批判性思考,并以实际的方式应用您的数据科学知识。

如果你不愿意直接回答这些问题,不要担心!事先花些时间想出潜在的解决方案可能会有所帮助。然而,确保在面试中不要听起来太过排练。

3.仔细检查你的简历

你的简历通常是你给面试官的第一印象,所以准确地展现你的技能和经验是很重要的。确保包含您使用数据科学技术的任何项目!

例如,你是否使用机器学习算法从事某个项目?

如果可能的话,把这些信息放在简历的“技能”部分——确保不要用太多的专业术语。这将有助于展示你在寻找什么样的角色,同时也展示你最近的成就。

有没有与申请职位直接相关的实习经历?

如果是这样,一定要提到他们!这种经历显示了主动性和兴趣,可以使候选人与众不同。

你的简历也是一个突出你已经获得的可转移技能的好地方,比如沟通、解决问题和数据分析。雇主们正在寻找能立即投入工作的候选人,所以包含你技能的具体例子将有助于你的申请。

确保仔细阅读招聘启事,并相应地修改你的简历。通过这种方式,你可以确保你强调的所有相关经验和技能都符合雇主的要求。

一份精心制作的简历是任何成功的求职申请的重要组成部分!

4.练习机器学习、统计和建模问题

许多数据科学家面试问题将要求你在机器学习、统计和建模方面有很强的基础。如果你不熟悉这些话题,在面试前做一些额外的准备是很重要的。

练习的一种方法是尝试解决在线测验问题或通过教程进行练习。这将有助于您更好地理解这些主题以及它们与数据科学的关系。

准备面试时,一定要温习你可能需要知道的数学话题!这将使你比其他不熟悉这类材料的候选人更有优势。

一些常见的机器学习和统计问题包括:

  • 什么是高斯分布?
  • 如何计算数据集的方差和标准差?
  • 线性回归的算法是什么?
  • 有哪些不同类型的强化学习算法?

如果你不知道一个问题的答案,尽量不要慌!诚实地承认你不知道,比试图编造一个答案要好。如果你能证明你愿意学习新事物,面试官会对你印象更深刻。

请记住,准备数据科学家面试的最佳方式是尽可能多地练习问题!这将有助于增加你成功的机会。

5.复习易混淆的数据科学术语

为了证明你作为数据科学家的价值,你需要知道术语。

虽然一开始看起来很难接受,但为了赢得面试,你可以在面试和求职申请中使用一些常用术语。回顾这些也将有助于提升您的整体数据科学知识!

您需要熟悉的一些令人困惑的术语包括:

  1. 回归:基于观测数据预测未来值的技术。在市场营销中,它经常被用来确定不同的因素(如价格或广告)会如何影响顾客行为。

2.聚类:根据相似性将对象分组的技术。这在试图理解大型数据集时非常有用,因为它可以帮助识别模式和趋势。

3.神经网络:一种启发了人工智能发展的机器学习算法。他们能够通过例子学习,并且经常被用于诸如图像识别或自然语言处理的任务。

了解这些术语——以及其他类似的术语——不仅会让你在面试中更有信心,还会增强你对整个领域的理解。

如果你不知道这些术语是什么意思,在面试前做一些调查。网上有很多资源,包括汗学院的数据科学教程。

6.了解您的数据科学项目

如果相关,一定要谈谈与申请职位相关的任何项目或论文!

例如,如果你在一家科技公司面试,并在一个机器学习应用程序中提到了你的一些工作,面试官可能会要求你说得更详细。

这是另一个很好的机会,你可以展示你的技能和经验,满足公司的需求!

例如,您可以说:

“我最近在 Acme Inc .工作,作为我实习的一部分——我开发了一种预测股票价格的算法,该算法在《金融季刊》上发表。”

这表明你对自己的工作充满热情,有数据科学方面的天赋,能够将你所知道的应用到现实世界中去!

如果这在面试时的谈话中不是很自然,那么一定要在某个时候提到它!

最好不要直接问他们是否想听,而是让面试官提出来,如果他们感兴趣的话。

准备好详细谈论你过去的项目,并解释你从中学到了什么。这是向面试官展示你有工作所需的技能和经验的好方法!

赢得那次面试!

简而言之,为数据科学家的采访做准备似乎是一项艰巨的任务。然而,遵循这些技巧将会帮助你更自信,更有能力解决任何你遇到的问题!

与 5k 以上的人一起加入我的电子邮件列表,免费获得“完整的 Python 数据科学备忘手册”

np.ndarray 和 np.matrix 对象之间的 6 个主要区别

原文:https://towardsdatascience.com/6-key-differences-between-np-ndarray-and-np-matrix-objects-e3f5234ae327?source=collection_archive---------12-----------------------

这两者在技术上是不同的,即使它们在外观上看起来是一样的

𝓴𝓘𝓡𝓚 𝕝𝔸𝕀Unsplash 上拍照

Numpy 是基础 Python 库,广泛用于数值计算和线性代数。 ndarraymatrix 对象是常用的 numpy 对象。 ndarray 对象是从 numpy ndarray 类创建的。 矩阵 对象是从 numpy 矩阵类中创建的。如果你是 numpy 的新手,你可能会对 numpyn array和 numpy matrix 对象感到困惑。如果外表看起来一样,那就是两回事。今天,我们将讨论他们之间的 6 个不同点。

先决条件

推荐你看下面我写的内容。

创建 ndarray 对象

我们可以使用 np.array() 函数创建一个 ndarray 对象。

import numpy as npA = np.array([[1, 2], 
             [3, 4]])
print(A)
print()
print(type(A))

(图片由作者提供)

创建矩阵对象

我们可以使用 np.matrix() 函数创建一个矩阵对象。

import numpy as npB = np.matrix([[1, 2], 
              [3, 4]])
print(B)
print()
print(type(B))

(图片由作者提供)

即使 ndarraymatrix 对象外观相同,但它们属于两个不同的类,具有不同的功能。现在我们来讨论一下。

区别 1:矩阵对象是严格二维的,而 n 数组对象可以是多维的

我们可以创建 1d,2d,3d,甚至 4d,5d(但他们很难想象)ndarray 对象,但我们只能创建 2d 矩阵对象。

一维数组

import numpy as npA = np.array([1, 2, 3])
print(A)
print('\nDimensions:', A.shape)
print('No. of Dimensions:', A.ndim)

(图片由作者提供)

二维数组

import numpy as npB = np.array([[1, 2], 
             [3, 4]])
print(B)
print('\nDimensions:', B.shape)
print('No. of Dimensions:', B.ndim)

(图片由作者提供)

三维数组

import numpy as npC = np.array([[[1, 2], [3, 4]],
             [[5, 6], [7, 8]],
             [[9, 10], [11, 12]]])
print(C)
print('\nDimensions:', C.shape)
print('No. of Dimensions:', C.ndim)

(图片由作者提供)

矩阵对象是严格二维的。如果我们试图创建一个一维矩阵,它会自动创建一个二维矩阵。

import numpy as npA = np.matrix([1, 2, 3])
print(A)
print()
print(type(A))
print('Dimensions:', A.shape)
print('No. of Dimensions:', A.ndim)

(图片由作者提供)

如果我们试图创建一个 3d 矩阵,它会给出一个错误。

np.matrix([[[1, 2], [3, 4]], 
          [[5, 6], [7, 8]], 
          [[9, 10], [11, 12]]])

(图片由作者提供)

区别 2:n array 和 matrix 对象在使用*(单星号)运算符时表现不同

当我们使用 ***** 操作符将两个 ndarray 对象相乘时,结果是元素到元素的乘法

a = np.array([[1, 2], 
             [3, 4]])
b = np.array([[5, 6], 
             [8, 9]])
print("a", type(a))
print(a)
print("\nb", type(b))
print(b)
print("\n* operation on two ndarray objects (Elementwise)")
print(a * b)

(图片由作者提供)

当我们使用 ***** 运算符将两个矩阵对象相乘时,结果是点(矩阵)积

c = np.matrix([[1, 2], 
              [3, 4]])
d = np.matrix([[5, 6], 
              [8, 9]])
print("c", type(c))
print(c)
print("\nd", type(d))
print(d)
print("\n* operation on two matrix objects")
print(c * d)

(图片由作者提供)

区别 3:n array 和 matrix 对象在使用**(双星)操作符时表现不同

当我们在两个 ndarray 对象上使用**操作符时,结果是每个元素的元素值的平方。

a = np.array([[1, 2], 
             [3, 4]])
print("a", type(a))
print(a)
print("\n** operation on two ndarray objects (Elementwise)")
print(a ** 2)

(图片由作者提供)

当我们在两个矩阵对象上使用**运算符时,结果是一个矩阵乘法!

b = np.matrix([[1, 2], 
              [3, 4]])
print(b)
print("\n** operation on two matrix objects")
print(b ** 2)

(图片由作者提供)

区别 4: matrix 类是 ndarray 类的子类

Matrix 对象继承了 ndarray 对象的所有属性和方法。

区别 5:矩阵对象有。I 代表逆,但 ndarray 对象不代表逆

a = np.matrix([[1, 2], 
              [3, 4]])
print(a)
print('\nInverse')
print(a.I)

(图片由作者提供)

b = np.array([[1, 2], 
             [3, 4]])
print(b)
print('\nInverse')
print(b.I)

(图片由作者提供)

要得到 ndarray 对象的逆,使用 np.linalg.inv() 函数。

np.linalg.inv(b)

(图片由作者提供)

区别 6:用法—通常使用 ndarray 类而不是 matrix 类

下面是 numpy 文档对这两个类的用法的描述。

不再推荐使用 matrix 类,即使是线性代数。相反,使用常规的 numpy 数组。matrix 类将来可能会被删除。

摘要

ndarraymatrix 类表现不同。使用 matrix 类可能要容易得多,因为这就像在线性代数中使用矩阵一样。如果你需要处理多维数组,你应该使用 ndarray 对象,因为它们是多维的。Numpy 文档推荐你使用n 数组对象,而不是矩阵对象。通过使用适当的函数,您总是可以将一种类类型转换成另一种。因此,使用 np.asmatrix() 函数将一个 ndarray 对象转换成一个 matrix 对象。

a = np.array([[1, 2], 
             [3, 4]])
print(a)
print(type(a))
print()b = np.asmatrix(a)
print(b)
print(type(b))

(图片由作者提供)

此外,您可以使用 np.asarray() 函数将矩阵对象转换为n array对象。

a = np.matrix([[1, 2], [3, 4]])
print(a)
print(type(a))
print()b = np.asarray(a)
print(b)
print(type(b))

(图片由作者提供)

感谢阅读!

本教程由Rukshan Pramoditha数据科学 365 博客作者设计创作。

https://rukshanpramoditha.medium.com阅读我的其他文章

2021–05–08

5 从数据科学项目的执行中获得的关键(和额外收获)

原文:https://towardsdatascience.com/6-key-lessons-from-execution-of-projects-on-data-science-a198c0f95732?source=collection_archive---------19-----------------------

这是我多年来从执行许多数据科学/机器学习项目中学到的一个要点。

Unsplash 上的 Element5 数码拍摄

W 当谈到执行一个项目和参与一个竞争时,在整体方法上有(或者应该有)什么大的不同吗?答案既是肯定的,也是否定的——某些方面非常相似,但很少一部分必须以不同的方式获得成功。

在这篇文章中,我试着列出了这些年来我学到的 5 个关键知识。很少有人听起来太简单而不能归类为,但正如史蒂夫·乔布斯常说的那样,…。简单可以比复杂难。

1。知道你的目的地

照片由缺口缺口缺口处拍摄

不知道最终目的地让我们在不必要的道路上徘徊。

所以在你开始之前,决定并完成你的目标。实现这一点的方法是 写下清晰简洁的问题陈述。

在竞赛的情况下,将提供问题/目标陈述,但对于项目,将由您决定。因此,把它写在一个段落的长度内,并始终坚持下去。

2.了解你的道路

马库斯·金珀勒在 Unsplash 上的照片

现在你知道你想到达哪里,是时候记下你到达目的地的路径了。尽早确定关键点,如:

-你需要什么样的数据

-你的数据来源是什么

-你怎么得到这些数据

-当你开始 EDA 时,你的假设是什么?

-你将如何组织你的项目

-等等等等

这里关键的一点是——就像目标一样,尽早决定你的目标之路。

再次强调,尽可能具体和详细。你可以使用像 Trello 这样的工具(或者任何你喜欢的工具)来更容易的追踪。

3.活出你的数据

约翰·Lc 在 Unsplash 上的照片

既然您已经准备好了数据集,那么就开始深入研究吧。探索,探索,再探索——不断深入,直到这些数据真的开始出现在你的梦里。

我怎么强调这一步的重要性都不为过。专家说项目 80%的时间都花在收集和分析数据上,他们绝对正确!

4。永远不要放弃任何假设

照片由诺亚·布舍尔Unsplash 上拍摄

在当今信息泛滥的世界,对任何话题都很难有客观的看法。当试图通过从数据中提取洞察力来解决问题时,对该领域的主观看法可能会成为障碍。它会以这样或那样的方式影响我们的分析,引诱我们“折磨数据”来“承认”我们选择的东西。因此,在开始任何数据分析之前,不管是泰坦尼克号还是新冠肺炎号的数据集,都要先把这个主题的所有“知识”放在一边,这一点非常重要。这并不是说应该忽略领域专业知识,必须尽可能地利用它,但是要有最大的判断力

因此,如果你曾经因为“认为”一个假设不重要而“觉得”要拒绝这个假设,请立即小心。无论如何,测试和验证它,让数据告诉你什么是重要的,什么是不重要的,而不是相反。

5.慷慨地使用 Jupyter

照片由谷仓图片Unsplash 上拍摄

Jupyter notebooks 是开始对数据进行探索性分析的一个极好的(如果不是完美的)地方。我们可以很容易地在一个地方看到代码和结果。

然而,有时我们会受到一种势利的态度的影响,因为 Jupyter 不够“酷”,所以不使用它,并试图通过编写 Python 脚本来执行 EDAs。根据我的经验,这样做效果不好。

一旦 ed a 完成,模型最终确定,我们已经设计了一个清晰的端到端流程,我们必须用一组 Python 或 R 脚本来实现它。但在那之前,朱庇特是你最好的朋友。

6.从简单开始

照片由米勒·塞甘·🇨🇦Unsplash 上拍摄

以英国哲学家奥卡姆的威廉命名的奥卡姆剃刀(也被称为“吝啬法则”)可以总结如下:

在相互竞争的假设中,应该选择假设最少的一个。

这可能是我多年来学到的最重要的一课。在涉及数据科学的项目的每一步中,总是选择最简单的方法。这尤其适用于构建模型——总是在给出相似结果的模型中选择最简单的一个。至少从最简单的方法开始,千万不要跳进一个非常复杂的方案里,试图游到岸边。

结论

如果你读到这里,谢谢你!!

在这篇文章中,我试图写下这些年来我学到的最重要的非技术性的教训。我确信有更多的被植入潜意识层面,因此我不会经常或轻易地注意到它们。

你同意这些观点吗?你学到了什么?请在评论区分享。

我在机器学习项目中使用的 6 个键盘快捷键

原文:https://towardsdatascience.com/6-keyboard-shortcuts-i-use-with-machine-learning-projects-2d77a386c1df?source=collection_archive---------31-----------------------

每天(如果我在编码)

图片由来自 PixabaySteve buiss NNE拍摄

为什么要把 1 秒钟砍掉呢?

捷径不仅仅是节省时间。这种做法保护我免受手腕疼痛,因为我每天工作数小时。

为什么要节省时间?这些建议不仅为我节省了一天的时间。他们就像存钱和锻炼的习惯。它们不会让你在短期内变得更富有、更健康。然而,当着眼于终身价值(LTV)时,我说如果你希望活几年,这是值得的。

学习需要多长时间?

对我来说,没花多少时间。我每天都使用快捷键(如果是编码的话),所以记忆很容易。

这些快捷键将我带到了一个新的工作水平,并消除了人为错误。

使用快捷方式工作也是一大乐事。感觉像是专业的事情。

GIF via GIPHY,【https://giphy.com/gifs/UFGj6EYw5JhMQ

这些快捷键适用于 VS 代码和 Google Colab。我会用 macOS 举例。如果你使用的是 PC,我发现它们之间的主要区别如下:

  • Command,简称 cmd。Mac 上有两个这样的。两个都在空格键旁边。此密钥不在 Windows 上。控件,或简称为 ctrl,取而代之。
  • 选项。就在 cmd 旁边。请改用 PC 上的 Alt 键。

0.流行快捷方式列表

为了让我们在同一页上,这里有一个键的列表,虽然超级有用,但我周围的人太熟悉了。

  • 复制粘贴

突出显示➡ Cmd + C ➡选择目的地➡ Cmd+V

  • 加注释

突出显示➡ Cmd + / ➡重复撤销

  • 转到开始/结束

Cmd +向上➡ Cmd +向下

  • 选择一两行

突出显示➡ Cmd + up

  • 选择一个段落

放置光标➡ Shift + cmd +向上➡ Shift +向下撤消

  • 缩进和不缩进

突出显示要撤消的➡Tab ➡Shift + Tab

现在我们来看看我很乐意分享的。

1.复制粘贴再探

每个人都知道 cmd+c 和 cmd+v,但是你知道你可以不用高亮显示就能做到吗?

让光标停留在您想要复制的代码行上,执行命令 c,命令 v。

cmd+c ➡

仔细看看。光标不在代码行的末尾,但是编辑器仍然足够聪明,知道在哪里粘贴新行。

这一举措不太受欢迎,但却更受欢迎。大多数代码行都没有那么长,所以突出显示来复制可能没有什么效果。

想只选择线中的一部分吗?这种情况下,出现的捷径会让你会心一笑。

2.更好的内嵌突出显示

不要一次选择一个单词,而是逐个单词而不是逐个字符地跳转。

option+shift+向右(或向左)

如果你只想移动光标,放弃 shift。那就没有选择了。

这使得选择整行的一部分时速度更快,这是避免触摸鼠标的另一种方式。

3.本地搜索和替换

你是否曾经想做一个搜索并全部替换,但是担心你会删除一些非故意的东西?

做 Cmd+D

将光标置于➡ cmd+d ➡edit

Cmd+D 是同时编辑同一个参数的直接方法。这样更容易,错误更少。

我确实注意到有些 Jupiter 笔记本没有这个功能。在这种情况下,多光标编辑适合您。按住 option 键并单击以获得多个光标。

4.一步复制粘贴

在短时间内将你的模型放大几倍。

option + shift +向下(或向上)

哎呀!太大了!

当与清单上的下一项结合时,它甚至更强大…

5.上下移动,携带代码

稍微调整一下就完美了。

选项+向上➡选项+向下

6.重新审视缩进

来回移动光标缩进很痛苦。我喜欢 shift+tab,也渴望同样的快捷方式。

所以我改用 cmd + [ or ]来左右移动代码

cmd + [,和 cmd + ]

下一步是什么?

这些技巧是我在和我的社区一起工作时发展出来的。

要了解更多关于我们如何优化,请看下面比快捷键更有价值的东西。

中级会员资格使我有可能学到足够的知识来为数据科学写作。 用我的个人链接 报名,然后在下面评论,我会给你发一个分享我全程的 pdf。

值得关注的 6 个鲜为人知的数据科学博客

原文:https://towardsdatascience.com/6-lesser-known-data-science-blogs-that-are-worth-following-cc42924abb13?source=collection_archive---------33-----------------------

知名度低不代表素质低。

UnsplashNeONBRAND 拍摄的照片

实话实说吧;如果你想学习任何与数据科学相关的东西,或者一般的技术,你可以通过谷歌搜索很容易地做到这一点。说到数据科学,寻找信息并不是人们加入该领域时面临的主要问题。

最常见的问题是完全相反的。当你刚接触数据科学时,外面的信息量是非常巨大的。这么多视频,证书,线上线下课程,还有博文。你如何从不太好的东西中发现好的东西?那些风格易于你理解和遵循的?

有些人喜欢跟随流行的信息来源,因为毕竟,如果一件事广为人知,那么它就是好的。不幸的是,情况并非总是如此;有时候运气来了,尤其是当我们谈论互联网的时候。然而,这并不是说流行的数据科学教育资源不好。

</9-comprehensive-cheat-sheets-for-data-science-46005d72b485>

但是,在这个极具挑战性和要求很高的领域,引起注意并不总是容易的,不是因为资源的质量,而是因为资源的数量。作为一个从零开始并仍有很长路要走的数据科学博客作者,我理解新博客作者为证明自己并脱颖而出所经历的斗争。

我决定写这篇文章来讨论一些不太出名的数据科学博客,它们分享高质量的信息、教程和博客。但是,当然,还有更多的高质量的工作,这个列表仅仅是其中的一个例子。你可能遇到过一个或多个这样的博客,但是如果你没有,也许这篇文章会给你介绍一个新的信息来源。

№1: Domino 数据科学博客

让我们从 Domino 数据科学博客开始我们的列表。该博客专注于发布关于数据科学、机器学习和编程各个方面的深度文章,每月发布 1~2 篇文章。这个博客上的每篇文章通常都很详细,并附有视频解释,为视觉学习者提供主题。

该博客专注于数据科学的纯技术方面,包括关于数据科学实际应用的教程文章。此外,该博客还有一个职业板块,可以找到一些数据科学方面的空缺和工作职位。

</5-new-data-science-books-that-you-should-consider-reading-c90aec1d5b0d>

№2:数据经济

接下来,我们有数据经济。Dataconomy 与其说是一个深度博客,不如说是一个新闻和信息博客。该博客包括各种文章,涉及数据科学领域的新趋势、研究论文的最新结果以及一些关于当今数据驱动社会的专家意见。

此外,数据经济涵盖了大数据、机器学习和商业不雅领域正在发生的一切。该博客还在全年举办不同的活动,旨在传播数据科学知识,并在全球范围内形成一个数据科学家社区。

№3:小美女数据

作为一名科技界女性,我们总是寻求与其他科技界女性建立关系,因为我们每个人都有自己的经历可以分享。所以我一直寻找女性建立的资源,小美女数据博客没有让人失望。一位女性数据科学家创建了这个博客来讨论所有关于数据科学和分析的事情。

小小姐数据是一个相当活跃的博客,每月有 3~5 个博客。但是,这个博客中我最喜欢的部分是# funda Friday部分,其中包括关于数据科学的一个方面或主题的简短、简洁和有趣的 3 分钟文章。这些简洁但充满信息的迷你文章读起来总是很有趣。

№4:预测黑客

接下来是预测黑客,或者如网站上所写的预测[hacks],这是由 比利·博纳罗斯&乔治·皮皮斯 创建的博客。两位专业数据科学家都热衷于与世界分享他们的经验和数据科学的魔力。

该博客包含许多关于数据科学不同主题的教程,以及实现这些教程的代码。他们还有一个特定的部分,提供关于编写有效的数据科学算法、在数据科学中成功等的技巧和诀窍。最后,他们提供了一个提示部分,展示了执行日常数据科学任务的最有效方法。

**</9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8> [## 9 台用于数学、Python 和数据科学的 Discord 服务器,您需要立即加入

towardsdatascience.com](/9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8)

№5:数据科学

另一个由女性创建的博客是 RStudio 的数据科学家茱莉亚·西尔格数据科学类博客。在这篇博客中,Julia 讨论了她如何使用数据科学来回答有趣的天文学、物理学和教育问题。

数据科学博客是一个活跃的博客,每月有 3~4 个博客,关注各种主题。有时,每个月都关注数据科学的一个特定方面或一种新的数据科学工具。本博客中的大多数文章都使用 R 作为构建应用程序的主要编程语言。

№6:数据科学 101

我们将以一个专门为初学数据科学家或想进入数据科学的人开设的博客来结束这个列表,这个博客就是 Ryan Swanstrom 的数据科学 101 博客。Rayan 曾在许多公司担任数据科学家,包括微软和富国银行,他使用这个博客与世界分享他的经验。

数据科学 101 博客上的大多数帖子都附有该帖子的视频教程。如果你想获得数据科学学位,该博客还提供了关于可能的数据科学训练营和学院的信息。

外卖食品

当我们谈论像数据科学这样的热门领域时,总有一些博客或 Youtube 频道主导着该领域,使得新人很难进入并留下他们的印记。但是,如果新人提供了高质量的作品、高质量的解释和高质量的例子,不管他们的初始观众有多少,他们都会大放异彩。

我从一无所有开始;我从未想过人们会觉得我的文章有用;我的全部目标是写一些至少对一个人有益的东西。我很高兴每一个分享我的作品并帮助我增加我的观众的人,所以我想为那些努力提供高质量作品的博客们做同样的事情。

</6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61> [## 数据科学应用的 6 个最佳 Python IDEs 和文本编辑器

towardsdatascience.com](/6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61)

本文通过一些不太知名的数据科学博客提出,尽管不像其他知名博客和网站那样出名,但它们仍然提供同样的、有时更高质量的内容,值得关注。所以,下次你有数据科学的问题,试试这些博客;也许你会找到一个新的喜欢的博客。**

6 只鲜为人知的熊猫集合功能

原文:https://towardsdatascience.com/6-lesser-known-pandas-aggregate-functions-c9831b366f21?source=collection_archive---------13-----------------------

…这使得 groupby 函数更加有用。

巴赫尔·凯里在 Unsplash 上拍摄的照片

groupby 是用于数据分析的最常用的 Pandas 函数之一。它首先根据一列中的不同值将数据点(即数据框中的行)分组。然后,它计算每个组的聚合值。

假设我们有一个包含汽车品牌和价格的数据集。为了计算每个分支的平均价格,我们根据 brand 列对行进行分组,然后对 price 列应用 mean 函数。

Pandas 提供了几个可以和 groupby 函数一起使用的集合函数,比如 mean、min、max、sum 等等。在本文中,我们将看到一些鲜为人知的聚合函数,它们使得 groupby 函数更加有用。

我们将涉及的功能有:

  • 第一
  • 最后的
  • 没什么
  • 努尼克岛
  • 形容
  • 分位点

让我们从创建一个样本数据框开始。

import numpy as np
import pandas as pddf = pd.DataFrame({
    "Brand": ["Ford","Honda","Toyota","Seat"] * 25,
    "Price": np.random.randint(10000, 30000, size=100)
})df.head()

(图片由作者提供)

我们有一个包含 100 辆汽车的价格和品牌信息的数据框。

1.第一

第一个函数,顾名思义,返回每个组的第一个值。

df.groupby("Brand", as_index=False).first()

(图片由作者提供)

2.最后的

last 函数返回每个组的最后一个值。

df.groupby("Brand", as_index=False).last()

(图片由作者提供)

第一个和最后一个函数对于这个数据集来说可能不是很有用。但是,有时您需要一个简单的解决方案来查找每个组的第一个或最后一个条目。当您处理基于日期或时间的数据时,顺序更加重要。

3.北

第 n 个函数扩展了第一个和最后一个函数的功能。它允许获取每个组的第 n 行。

df.groupby("Brand", as_index=False).nth(2)

(图片由作者提供)

  • 第 n 个(0)与第一个()相同
  • 第 n 个(-1)与最后一个()相同

4.努尼克岛

nunique 函数返回每个组的不同值的数量。在我们的数据集中,每个品牌可能是 25,因为我们在一个大范围内生成了 25 个随机整数。

当处理现实生活中的数据集时,每个类别或组的唯一值可能是一种有价值的见解。

df.groupby("Brand", as_index=False).nunique()

(图片由作者提供)

5.形容

describe 函数为每个组返回几个统计数据。它通常用于获取整个数据框的概览。我们还可以将它与 groupby 函数一起使用,从几个不同的角度比较各组。

df.groupby("Brand", as_index=False).describe()

(图片由作者提供)

25%、50%和 75%的值分别是第一、第二和第三四分位数。与其他统计数据一起,它们提供了值分布的结构化概览。

第一个分位数(25%)意味着 25%的值低于该值。同样,50%的值低于第二个分位数,因此第二个分位数是中值。

6.分位点

我们用 describe 函数得到 25%、50%和 75%的分位数。分位数函数提供了更多的灵活性,因为它接受一个参数。

为了找到 40%的分位数,我们将 0.4 作为参数传递给分位数函数。

df.groupby("Brand", as_index=False).quantile(0.4)

(图片由作者提供)

结论

groupby 函数是探索性数据分析中的救命稻草。mean、sum、min 和 max 是 groupby 常用的聚合函数。

我们在本文中讨论的函数并不常用,但在某些情况下它们会派上用场。

最后但同样重要的是,如果你还不是中级会员并打算成为其中一员,我恳请你使用以下链接。我将从你的会员费中收取一部分,不增加你的额外费用。

https://sonery.medium.com/membership

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

我作为数据工程师早期学到的 6 个教训

原文:https://towardsdatascience.com/6-lessons-i-learnt-early-as-a-data-engineer-245f477fccc7?source=collection_archive---------17-----------------------

刚开始做数据工程师的时候,我不知道自己不知道什么。这是我在数据职业生涯早期学到的 6 件事。

1.与利益相关者保持沟通

Unsplash 上的 krakenimages 拍摄的照片

在我最初的几个数据工程项目中,我确定了工作范围,收集了最初的需求,然后开始着手工作。我取得了很大的进步,感觉自己正在取得成就。然后我就卡住了。我确信我已经完成了,但认为还有更多的事情要做。

在拖延了太久才接近利益相关者之后,我伸出手去检查一下。原来我已经做了最初需要做的事情,但是需求已经改变了,所以我需要重新做一大块工作。如果我一直和他们保持联系,我就会节省很多时间。

这教会了我始终与利益相关者保持联系,以保持一致并有效利用我的时间。项目会发生变化,在这个过程中不可避免地会发现更好的解决方案,所以最好保持沟通渠道畅通。

在进行项目时,定期更新项目干系人的信息也是一个好主意,而不是等到你完善了自己的工作,这是新程序员常犯的错误。

2。学会区分工作的优先顺序

布雷特·乔丹Unsplash 上的照片

毫无疑问,你将是你团队的一笔财富,许多人都想分一杯羹(你的时间)。

你需要按照紧急程度和重要性来排列工作的优先顺序,不要害怕对别人说不。最好是说一件工作还不可能,但是你会让他们知道什么时候有时间,而不是说你可以做这件工作,但是没有完成。

80-20 原则在这里发挥了作用,你 80%的成果来自你 20%的努力。你需要优先考虑你的工作中能带来最大价值的部分,而不是花很多时间去完善最后 20%的工作。这样你就能完成重要的事情,并把大部分时间花在这上面。

再次强调,如果需要,不要害怕说不。

3。关注核心技能

克里斯里德在 Unsplash 上的照片

SQL 和 Python 是数据工程的支柱。学习核心技能,然后你可以将它们转化为你随后使用的更复杂的技术。

试图一下子学会所有的东西将会使你一事无成,但是有一个坚实的基础将会使你成功。无论出现什么样的新工具,您都需要了解基本原理,以充分释放最新软件的价值。

随着新的、更优化的工具的发布,最新的技术通常变化很快。因此,在你职业生涯的开始,不要专注于追逐最热门的新工具,而是建立一个强大的可转移主题的知识。由于坚实的基础,能够快速掌握新技术比知道一种特定的工具要好,这种工具在几年内可能不会流行。

最近,许多公司都在推动一种更简单、高效的技术堆栈。例如,不再构建复杂的 Hadoop 系统,而是使用 Databricks 作为“一刀切”的解决方案。

不言而喻,但是,了解你的工作中使用的技术栈!

4。堆栈溢出,堆栈溢出,堆栈溢出

Bekir dn mez 在 Unsplash 上拍摄的照片

在我接受为期四个月的数据工程师培训期间,一些人试图记忆部分代码,而不是努力培养应用代码和找到解决方案的能力。

专注于能够凭记忆编码是错误的。尽管这很令人印象深刻,但这并不实际。你从事的每个项目都可能与上一个大不相同,你需要使用新的技术。

这里的关键是培养批判性思维和解决问题的技能。我们获得报酬的部分原因是我们适应问题并找到解决方案的能力。如果问题可以通过你以前做过的代码来解决,那么你对团队来说就没有价值了。

能够有效地使用谷歌,并知道如何将你的发现应用到你的特定问题中,这是一个数据工程师的关键能力。使用堆栈溢出。

5。获得导师

Amy Hirschi 在 Unsplash 上拍摄的照片

作为一名数据工程师,一个重要的部分就是乐于学习。这包括培养你的技术和软技能。

找一个导师可以让你向已经走过你这条路的人学习。如果你花时间向导师学习,许多灾难和错误是可以避免的。

我个人认为有一个和你的工作关系密切的导师(可能是你的经理)和一个关系较远的导师是件好事。这应该是同一行业的人,但在不同的公司。

这个解决方案给你一个人来评论你的工作,并在你工作的企业中发展你。它还能让你得到如何管理你正在工作的公司的建议,并思考你在当前公司之外的职业发展。

6。享受工作

照片由普里西拉·杜·普里兹Unsplash 上拍摄

你醒着的时候大部分时间都在工作,你可能不想不开心地度过。关注你工作中好的方面,努力让它变得更好,并享受它。

数据工程确实是一项有益的工作。你努力解决难题,并能对公司产生一些真正的影响。当你的代码停止产生错误并且第一次运行完成时,那种解脱的时刻应该被珍惜。

你可能隐藏在数据科学家或分析师的背后,但你是这项工作的骨干。解决问题总是好的。

这些只是我作为一名数据工程师时学到的一些技巧。我希望我开始的时候就知道这些,所以希望这也能帮助你。

我收到并想传达的一些建议是:不要压力太大,对你的脑力有所选择,以免精疲力尽,并与你的团队交流。尤其是在家工作时,你不会想一直像这个人一样:

杰佛逊·桑托斯在 Unsplash 上的照片

我是 Rory Middleton——一名数据工程师,热衷于个人发展、行为经济学和游戏。之前,我做过羊驼剪毛师和滑索教练。我的目标是写各种主题的文章,并希望你订阅加入我的行列。

面向数据科学家的 6 个 Linux 命令

原文:https://towardsdatascience.com/6-linux-commands-for-data-scientists-284f972e7ab5?source=collection_archive---------34-----------------------

终端命令让您的数据一览无余

Martin BrechtlUnsplash 上拍摄的照片。图片由作者提供。

介绍

GNU 核心实用程序(coreutils)是一个用于文件、文本和 shell 的命令实用程序包。它有一百多个命令。

在本文中,您将发现六个 GNU Coreutils 命令,它们对于处理文本、CSV 和数据文件非常有用。

**Table of Contents**
· [Introduction](#43b2)
· [Sample data](#049e)
· [head](#2215)
· [tail](#c690)
· [fold](#d54d)
· [sort](#850e)
· [paste](#8641)
· [cut](#5cf6)
· [Conclusion](#b944)
· [References](#7f28)

抽样资料

我们使用来自 Github repo 的样本数据。如果你想编码,请复制或下载它。它包含样本文本和 CSV 文件。

head 命令将每个文件的前 10 行打印到标准输出。您可以使用-n选项更改要显示的行数。这里我们从两个文件中打印 5 行。

$ head -n 5 apache-2.0 gnu-agpl-3.0
==> apache-2.0 <==
                                 Apache License
                           Version 2.0, January 2004
                        [http://www.apache.org/licenses/](http://www.apache.org/licenses/)TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION==> gnu-agpl-3.0 <==
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007Copyright (C) 2007 Free Software Foundation, Inc. <[https://fsf.org/](https://fsf.org/)>
 Everyone is permitted to copy and distribute verbatim copies

使用-q选项打印多个不带标题的文件:

$ $ head -n 5 -q apache-2.0 mit
                                 Apache License
                           Version 2.0, January 2004
                        [http://www.apache.org/licenses/](http://www.apache.org/licenses/)TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
MIT LicenseCopyright (c) [year] [fullname]Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal

让我们使用 curl 和管道来发送输出,作为head命令的标准输入。

$ curl -s [https://raw.githubusercontent.com/shinokada/sample-csv/main/LICENSE](https://raw.githubusercontent.com/shinokada/sample-data/main/licenses/mit) | head -n 5
MIT LicenseCopyright (c) [year] [fullname]Permission is hereby granted, free of charge, to any person obtaining a copy

尾巴

tail命令与之前的head命令非常相似。它将每个文件的最后 10 行打印到标准输出。使用-n选项改变行数。

$ tail -n 3 mit isc
==> mit <==
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
==> isc <==
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.%

在上面的例子中,我们输出两个文件。

使用-q选项隐藏标题。

$ tail -q -n 3 mit isc
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.%

折叠

[fold](https://www.gnu.org/software/coreutils/fold)命令包装每个文件中的输入行,并写入标准输出。默认宽度为 80,您可以使用-w选项进行更改。

如上图所示,fold mit | head将文本换行到 80 个字符。fold -w 40 mit将文本换行为每行 40 个字符。

当您想在空格处换行时,使用-s选项。

上图中的第二个示例用空格换行。

分类

sort命令对文件或标准输入进行排序。结合使用-t(字段分隔符)和-k(键)选项,您可以按字段对文件进行排序。例如,如果您想对 CSV 文件进行排序,使用-t,选项将字段分隔符指定为逗号。使用-k2告知您想要按第二个字段排序。

在上面的例子中,grep 命令从 mail_addresses.csv 中选择“Second Avenue”。sort命令使用管道中的标准输入,并按照第二个字段对行进行排序。

粘贴

你可以使用paste命令连接多个文件。

$ cat sample5.txt
Python
Bash
Go
Rust
C#$ cat sample6.txt
John
Sarah
James
Elizabeth
Tom$ cat sample7.txt
4 years
3 years
1 year
2 years
4 years

这里我们连接三个文件。

$ paste sample{5..7}.txt
Python John 4 years
Bash Sarah 3 years
Go James 1 year
Rust Elizabeth 2 years
C# Tom 4 years

上面的例子使用 Bash 范围{5..7}扩展到 5,6,7。

使用-d选项指定分隔符。下面的例子需要两个分隔符,因为我们要连接三个文件。

$ paste -d "||" sample{5..7}.txt
Python|John|4 years
Bash|Sarah|3 years
Go|James|1 year
Rust|Elizabeth|2 years
C#|Tom|4 years

使用-s选项垂直连接,而不是平行连接。

$ paste -s sample{5,6,7}.txt
Python Bash Go Rust C#
John Sarah James Elizabeth Tom
4 years 3 years 1 year 2 years 4 years

paste命令也可以创建列

切口

cut命令剪切输入数据的列或字段。使用-d选项指定字段分隔符,使用-f选项指定要选择的列/字段。

上面的例子使用了一个 CSV 文件,所以分隔符是逗号。我们只打印出第 4 和第 7 个字段。

您可以为-f选项使用一个范围参数,如上例7–9

你可以使用 [cut](https://betterprogramming.pub/9-terminal-commands-you-can-start-using-today-7b9b0e273894) 命令来删除文件中每行的一些字符。

结论

这些命令允许您从终端快速浏览数据。通过使用重定向,您可以创建新的数据文件,并且可以为您的项目创建所需的数据文件。

通过 成为 会员,可以完全访问媒体上的每一个故事。

https://blog.codewithshin.com/subscribe

参考

2021 年要追求的 6 个机器学习证书

原文:https://towardsdatascience.com/6-machine-learning-certificates-to-pursue-in-2021-2070e024ae9d?source=collection_archive---------0-----------------------

在你的简历中写下这些会有很大的不同。

照片由 PexelsEkrulila 拍摄

数据科学是最通用的领域之一;甚至它的名字也不能很好地解释该领域实际涉及的内容。也许这是人们发现这个领域很有挑战性,很难进入,甚至更难表现出专业性的一个原因。

众所周知,在数据科学界,要成为一名“优秀”的数据科学家,关键在于你构建的投资组合有多强大,你的项目有多多样化,以及它们能在多大程度上展示出你创造性地、高效地解决任何问题的能力。

尽管成为一名数据科学家(或在其任何分支中拥有专长)不需要大学学位,但拥有一些证明你在该领域某些方面的专业的证书可以改变你的投资组合,让你的职业生涯更上一层楼。

这不仅适用于一般领域,也适用于它的所有分支。也许该领域最著名的分支是机器学习。现在,机器学习在我们的生活中无处不在,在我们的电脑、手机甚至厨房电器中。

</6-data-science-certificates-to-level-up-your-career-275daed7e5df>

但就像数据科学一样,机器学习这个术语是许多算法和技术的保护伞,所以你如何向你未来的雇主表明,当你说“我是机器学习专家”时,你实际上是认真的?

一些公司和大学设计了测试和课程,如果你通过了,你就知道如何在机器学习的海洋中导航,因此,你能够解决任何人摆在你面前的任何问题。这篇文章将涵盖今年你可以追求的前 6 个机器学习证书,并提升你的投资组合和获得梦想工作的机会。

№1:麻省理工学院机器学习和人工智能专业证书课程

这个名单上的第一个证书是由麻省理工学院提供的。机器学习和人工智能方面的专业证书项目是一个短期项目,提供给以前有机器学习知识的人和新人,让他们有能力获得该领域的最新知识。

这个证书并不便宜——注册要 325 美元——因为它不仅仅是一个测试,而是一整套课程和材料。这个简短计划的核心是在大数据和文本处理中使用机器学习算法和技术。但是,如果你愿意,你可以扩大证书的范围——收取额外的费用——以涵盖机器学习的更精确的用法,如医疗领域的机器学习,或计算机版本,或高效的深度学习等。

这个短期计划中的每个课程都有一个您需要完成它们的固定天数,并且整个计划课程需要在注册该计划的 36 个月内完成。

</5-types-of-machine-learning-algorithms-you-need-to-know-5ac7fce8920d>

№2:斯坦福大学机器学习证书

斯坦福大学提供的机器学习课程和证书,对于那些想进入机器学习同时又想获得证书的人来说,或许是更好的选择。你既可以免费旁听课程,也可以在完成课程后支付 79 美元获得证书。

这门课程是你能找到的最著名和最有益的机器学习课程之一;它由 Coursera 的创始人之一吴恩达教授授课,他是一位拥有超过 1000 万快乐学生的讲师。仅机器学习课程就有近 400 万学生选修。该课程还为英语不是母语或首选语言的学生提供 10 种语言的字幕。

在这门为期 11 周的课程中,您将从头开始学习所有内容,包括数学和统计学,以及机器学习算法的基础知识及其在计算机视觉、医学、音频处理和数据库挖掘中的应用。

№3: IBM 机器学习专业证书

你可以通过参加 Coursera 上的课程获得的另一个证书是由计算机行业传奇人物之一 IBM 提供的机器学习专业证书。和斯坦福大学的课程一样,你可以免费旁听这门课程,也可以获得 39 美元/月的证书。

这个专业证书课程包括 6 门课程,涵盖了理解机器学习算法的理论和实际应用所需的所有知识。虽然如果你有一些编程知识,你可以更好地学习这门课程,但是即使你不太懂编程,你也可以学习这门课程。

本课程还将教您如何使用 Jupyter 笔记本电脑和 IBM Watson 来构建和开发您自己的项目,以便在完成课程后添加到您的投资组合中。

</5-types-of-machine-learning-bias-every-data-science-should-know-efab28041d3f>

№4:哈佛的机器学习证书

这个列表中最后一个基于课程的证书是哈佛大学在 edX 上提供的机器学习证书。该课程是哈佛大学提供的更大、更广泛的数据科学证书的一部分。你可以旁听这门课程,也可以花 99 美元获得结业证书。

本课程将涵盖机器学习的基础知识、基本算法和技术、如何以及何时使用交叉验证、如何构建推荐系统,以及一些常用的、最流行的和新的机器学习算法。

本课程计划在 8 周内完成。但是,它也是自定进度的,这意味着您可以根据需要花任意多的时间来完成本课程并获得证书。

№5:谷歌的专业机器学习工程师

到目前为止,我们涵盖的所有证书都要求完成一门特定的课程或一组课程才能获得证书。谷歌的专业机器学习工程师证书就不一样了。这只是一个证书,意味着你只需要参加一个考试就可以获得这个证书。

花 200 美元,你就可以参加这个谷歌测试,测试你对框架机器学习问题、设计解决方案、处理数据和开发机器学习模型的熟悉程度和能力。不仅如此,你还需要证明你可以自动化高效的机器学习管道,优化你的解决方案。

虽然这个证书没有附带一门你必须参加的课程来获得证书,但谷歌仍然提供了材料,你可以用它来准备考试,以及谷歌专家提供的网络研讨会来帮助你通过考试,并充分利用提供的材料。

</6-web-scraping-tools-that-make-collecting-data-a-breeze-457c44e4411d>

№6: AWS 认证机器学习

亚马逊提供了更具体的证书,尤其是 AWS 系统。AWS certified machinelearning 是一个证书,旨在衡量一个人使用 AWS 云设计、开发和部署机器学习模型的能力。这个证书可以用 400 美元的费用获得。

与谷歌机器学习工程师证书类似,AWS 认证的机器学习专业不需要完成特定的课程才能获得。该证书更多地针对非常熟悉机器学习算法和技术的人,而不是完全的初学者。

该测试有三种语言版本,英语、韩语和中文。亚马逊还提供一些材料和练习测试,你可以用它们来准备考试,并从第一次尝试就通过考试。

最后的想法

在任何领域展现专业都不容易;当你想证明自己的职业是一个多样化的领域,有如此多的分支和技术时,这就变得更加困难了。机器学习是著名的技术领域之一,它不仅仅涵盖编程;它需要数学,解决问题的技巧,甚至沟通技巧。

那么,你如何向雇主证明你的能力呢?虽然在你的投资组合中有多样化的、强有力的项目能充分说明你的能力,但拥有一个顶级大学或工业公司的证书可能是你投资组合中引导你获得工作的一个方面。

在本文中,我向您展示了 6 种证书,它们旨在测试一个人处理和找到最复杂的机器学习问题的解决方案的能力。它们证明你知道如何使用不同的算法来解决不同的问题,并为任何给定的问题确定最合适的算法。

付出额外的努力去学习并获得这些学位将会在你下一次申请工作时,甚至是在工作面试时得到回报。毕竟,如果再加上耐心和毅力,好的努力总会有回报。

开始学习机器学习的 6 个数学基础

原文:https://towardsdatascience.com/6-math-foundation-to-start-learning-machine-learning-1afef04f42bd?source=collection_archive---------1-----------------------

理解机器学习所需的数学科目

安托万·道特里在 Unsplash 上拍摄的照片

如果你喜欢我的内容,并想获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的 简讯。

作为一名数据科学家,机器学习是我们完成工作的武器库。我非常肯定,在当今时代,每个受雇为数据科学家的人都会使用机器学习来分析他们的数据,以产生有价值的模式。虽然,为什么我们需要为机器学习学习数学?我可以给出一些论据,包括:

  • 数学帮助你选择正确的机器学习算法。理解数学让你深入了解模型如何工作,包括选择正确的模型参数和验证策略
  • 通过产生右置信区间和不确定性测量值来估计我们对模型结果的信心需要对数学有所了解。
  • 正确的模型会考虑许多方面,如指标、训练时间、模型复杂性、参数数量以及需要数学来理解所有这些方面的特征数量
  • 通过了解机器学习模型的数学,你可以开发一个适合你自己问题的定制模型

主要问题是你需要什么数学科目才能理解机器学习?毕竟,数学是一个广阔的领域。这就是为什么在这篇文章中,我想概述机器学习需要的数学科目,以及开始学习这些科目的几个要点。

机器学习数学

我们可以从数学科目中学习许多主题,但如果我们想专注于机器学习中使用的数学,我们需要指定它。在这种情况下,我喜欢使用 M. P. Deisenroth、A. A. Faisal 和 c . s . Ong 2021 年出版的《机器学习数学》一书中解释的必要数学参考资料。

在他们的书中,有对机器学习很重要的数学基础。数学科目是:

作者创建的图像

六门数学科目成为机器学习的基础。每个主题都交织在一起,以开发我们的机器学习模型,并达到概括数据集的“最佳”模型。

让我们更深入地了解每个主题,以了解它们是什么。

线性代数

什么是线性代数?这是数学的一个分支,研究向量和操纵向量的某些规则。当我们形式化直观概念时,通常的方法是构建一组对象(符号)和一组规则来操作这些对象。这就是我们所知的代数

如果说机器学习中的线性代数,它被定义为数学中使用向量空间和矩阵来表示线性方程组的部分。

当谈到向量时,人们可能会回想起他们在高中学习的关于有方向的向量,就像下图一样。

几何向量(图片由作者提供)

这是一个向量,但不是机器学习线性代数中讨论的那种向量。相反,我们要讨论的是下面这张图片。

矢量 4x1 矩阵(图片由作者提供)

上面提到的也是一个向量,但是是另一种向量。您可能熟悉矩阵形式(下图)。向量是只有 1 列的矩阵,称为列向量。换句话说,我们可以把矩阵想象成一组列向量或行向量。总之,向量是特殊的对象,可以加在一起,乘以标量,产生另一个同类的对象。我们可以有各种各样的物体叫做矢量。

矩阵(图片由作者提供)

线性代数本身是计算机可以理解的数据的系统表示,线性代数中的所有运算都是系统规则。这就是为什么在现代时间机器学习中,线性代数是一项重要的研究。

线性代数如何使用的一个例子是在线性方程中。线性代数是线性方程中使用的工具,因为许多问题可以用线性方式系统地提出。典型的线性方程如下表所示。

线性方程(图片作者提供)

为了解决上面的线性方程问题,我们使用线性代数来系统地表示线性方程。这样,我们可以使用矩阵特征来寻找最优解。

矩阵表示中的线性方程(图片由作者提供)

总结一下线性代数这门课,作为这门课的起点,你可能想多学三个术语:

  • 矢量
  • [数]矩阵
  • 线性方程

解析几何(坐标几何)

解析 几何是一项研究,我们利用一对有序的坐标来学习数据(点)的位置。这项研究是关于用数字定义和表示几何形状,并从形状的数字定义和表示中提取数字信息。我们用一个更简单的术语把数据投射到平面上,我们从那里接收数字信息。

笛卡尔坐标(图片由作者提供)

上面的例子说明了我们如何通过将数据集投影到平面上来从数据点获取信息。我们如何从这种表示中获取信息是解析几何的核心。为了帮助你开始学习这个主题,这里有一些你可能需要的重要术语。

  • 距离功能

距离函数是提供集合元素之间距离的数字信息的函数。如果距离为零,那么元素是等价的。除此之外,它们彼此不同。

距离函数的一个例子是欧几里德距离,它计算两个数据点之间的直线距离。

欧几里德距离方程(图片由作者提供)

  • 内积

内积是一个引入直观几何概念的概念,例如向量的长度和两个向量之间的角度或距离。它通常被称为⟨x,y⟩(或偶尔(x,y)或⟨x|y⟩).

矩阵分解

矩阵分解是关于如何将矩阵分解成其组成部分的研究。矩阵分解旨在简化对分解矩阵而不是对其原始矩阵的更复杂的矩阵运算。

矩阵分解的一个常见类比是因式分解数字,例如将 8 因式分解为 2×4。这就是矩阵分解与矩阵分解同义的原因。分解矩阵有许多方法,因此有一系列不同的矩阵分解技术。下图中的 LU 分解就是一个例子。

鲁分解(图片由作者提供)

向量微积分

微积分是一门研究连续变化的数学,主要由函数和极限组成。矢量 微积分本身关注的是矢量 字段的微分和积分。向量微积分通常被称为多元微积分,虽然它有一个稍微不同的研究案例。多元微积分处理多个独立变量的微积分应用函数。

在开始学习向量微积分的时候,我觉得有几个重要的术语是人们需要知道的,它们是:

  • 导数微分

导数是一个实数函数,它测量函数值(输出值)的变化,该函数值与自变量(输入值)的变化有关。微分是计算导数的动作。

导数方程(图片由作者提供)

  • 偏导数

偏导数是一种导数函数,其中在导数函数内计算几个变量,其中一个变量可以变化,另一个变量保持不变(与全导数相反,其中所有变量都可以变化)。

  • 渐变

梯度是与函数的导数或变化率有关的词;你可能会认为梯度是导数的一个奇特的词。术语梯度通常用于具有多个输入和单个输出(标量)的函数。渐变具有从当前位置移动的方向,例如上、下、右、左。

概率和分布

概率是一种对不确定性的研究(不严格的术语)。这里的概率可以认为是事件发生的时间,或者是对事件发生的相信程度。概率分布是一个测量与随机变量相关的特定结果(或结果的概率集)发生概率的函数。常见的概率分布函数如下图所示。

正态分布概率函数(图片由作者提供)

概率论统计学经常与类似的事情联系在一起,但是它们关注不确定性的不同方面:

在数学中,我们将概率定义为某种过程的模型,其中随机变量捕捉潜在的不确定性,我们使用概率规则来总结发生的事情。

在统计学中,我们试图找出潜在的过程,观察已经发生的事情,并试图解释这些观察结果。

当我们谈论机器学习时,它接近于统计学,因为它的目标是构建一个模型,充分代表生成数据的过程。

最佳化

在学习目标中,训练机器学习模型就是寻找一组好的参数。我们认为的“好”是由目标函数或概率模型决定的。这就是优化算法的用途;给定一个目标函数,我们试图找到最佳值。

通常,机器学习中的目标函数试图最小化函数。表示最佳值是最小值。直观地说,如果我们试图找到最佳值,这就像找到目标函数的谷值,梯度将我们指向上坡。这就是为什么我们要向下坡(与梯度相反)移动,希望找到最低(最深)的点。这就是梯度下降的概念。

梯度下降(图片由作者提供)

学习优化时,很少有术语作为起点。它们是:

  • 局部最小值全局最小值

函数最佳值取最小值的点称为全局最小值。然而,当目标是最小化函数并使用优化算法(如梯度下降)求解时,函数可能在不同点具有最小值。那些看起来是最小值但不是函数实际取最小值的点称为局部最小值

局部和全局最小值(图片由作者提供)

  • 无约束优化约束优化

无约束优化是一种优化函数,我们在假设参数可以取任何可能值(没有参数限制)的情况下找到函数的最小值。约束优化简单来说通过引入一组约束来限制可能的值。

如果没有参数限制,梯度下降就是无约束优化。如果我们设定一些限制,例如 x > 1,这就是一个无约束优化。

结论

机器学习是数据科学家用来获取我们需要的有价值模式的日常工具。学习机器学习背后的数学可以让你在工作中获得优势。有许多数学科目,但当我们开始学习机器学习数学时,有 6 个科目最重要,那就是:

  • 线性代数
  • 解析几何
  • 矩阵分解
  • 向量演算
  • 概率和分布
  • 最佳化

如果你开始学习机器学习的数学,你可以阅读我的另一篇文章来避免学习陷阱。我还提供了您可能想在那篇文章中查阅的数学材料。

</5-mistakes-to-avoid-when-studying-math-for-machine-learning-6c8bcb2e2d06>

希望有帮助!

访问我的 LinkedInTwitter

如果您没有订阅为中等会员,请考虑通过我的推荐订阅。

评估您的分类算法的 6 个指标

原文:https://towardsdatascience.com/6-metrics-to-evaluate-your-classification-algorithms-caddd65ecff5?source=collection_archive---------7-----------------------

了解可用于评估分类模型的最常用指标——在本帖中,我们将探讨 6 个指标及其含义

【免责声明:此帖子包含一些我的 Udemy 课程的附属链接】

照片由麦克维利 @Unsplash.com 拍摄

当你进入数据科学和机器学习领域时,构建分类算法总是一个有趣的项目。除了回归问题,分类问题是企业在开始试验预测模型时最常遇到的问题。

但是,评估一个分类算法可能会变得混乱,真的很快。一旦你开发了一个逻辑回归或者分类决策树,并且输出了你的第一个从模型中分离出来的概率,你会立刻想到:我应该如何使用这个结果?

首先,在评估你的分类算法时,你必须做一个重大的选择:你想使用一个已经与你的“概率”结果的阈值相关联的指标吗?或者使用一个不知道阈值度量?

大多数著名的度量标准都与阈值相关,并且都有优点和缺点。还有一个度量标准是不可知的,它可以更好地评估结果中包含不同概率分布的模型(例如,回归与基于树的模型)。我们将在这篇文章中探讨这两种类型。

此外,对于这篇博文的例子,我们将使用二元分类(0 或 1 种情况)——一些来自“现实生活”的常见例子:

  • 预测交易是否欺诈的模型;
  • 预测客户是否会流失(不再购买)的模型;
  • 预测网站访问者是否会转化为付费用户的模型;

我们已经准备好了学习分类指标的大部分基础—让我们开始吧!

混淆矩阵

我从混乱矩阵开始有点作弊,但是坚持住!混淆矩阵本身不是一种度量,而是多种度量评估分类算法的基础。混淆矩阵是简单的映射矩阵,用于比较算法的结果和特定目标的真实标签。

你可能会问自己的一件事是,你如何给你的算法的结果分配一个标签——换句话说,如果你把例子分配给 0 或 1(二进制分类),你如何把那个概率转换成一个真正的分类?常见的技巧是定义一个阈值(比如 50%),将高于该值的所有内容视为 1,否则视为 0。

这是从混淆矩阵得出的指标的主要问题之一——它们依赖于您必须事先定义的阈值。

混淆矩阵非常简单,您只需将真实结果与来自模型的预测相对照,并使用一个简单的玩具示例:

混淆矩阵示例

左侧是来自模型的预测值,它等于 p(y),,您可能会在其他资源上看到。在上面,你有来自目标的真实值——等于 y.

在上面的例子中,您可以看到有 10 个例子,其中算法预测 1,而实际目标也是 1。这些被称为真阳性(TP)。在本例中,除了 TP,您还可以从混淆矩阵中获得其他 3 个基本值:

  • 真实否定(TN) :其中真实目标为 0,而你的算法也预测为 0;
  • 假阴性(FN) :真实目标为 1,而你的算法预测为 0。发生这种情况时,您的算法无法正确分类数据点;
  • 误报(FP) :真实目标为 0,而你的算法预测为 1。当这种情况发生时,您的算法也无法正确分类数据点;

许多指标都是从上面的指标衍生出来的。当您已经将模型的结果通过一个阈值时,上面的数字对于理解模型的结果和实际值之间的关系是必不可少的。

让我们了解一下从上述值中得出的一些指标。

准确(性)

评估分类算法的首要指标是准确性。

准确性是容易理解的,并且基于混淆矩阵数据。要计算精度,只需应用以下公式:

精确度公式

在分子上,我们用我们的算法得到了所有正确的例子。在分母上,我们有整个样本。就是这样,就这么简单!

请注意,如果我们从上面的混淆矩阵中选取值,我们会得到以下结果:

该值越高,在对示例进行分类时,您的算法就越好。100%的准确率意味着你的算法在分类时是完美的。

但是,对于准确性有一个很大的警告:当你有巨大的类不平衡时,意味着你的一个类在例子的数量上极度超重。

一个真实的例子是欺诈检测—在每天完成的数百万笔交易中,只有少数是真正的欺诈。有时候这个百分比还不到 1%。

如果你建立一个模型的目标是具有良好的准确性,那么……如果你只是将每一笔交易都指定为“非欺诈性”,那么你的准确性可以达到 99%。这是否意味着你的模式是好的?不要!

你的准确性会很高,但你的模型会毫无价值,因为它无法捕捉到那些对金融系统极具破坏性的 1%的欺诈交易。

当目标稍微平衡时,准确度是有价值的,但幸运的是,我们可以使用更适合其他类型样品的其他指标。

精确度/灵敏度

精确度是一个广泛使用的衡量标准,用来了解你的 1 的分类表现如何。基本上,它帮助你理解从算法中产生的所有“正面”例子有多精确(没有双关语的意思)。

精度由以下公式组成:

简单重述一下,上面的公式读作:真阳性除以真阳性加上假阳性。从我们的混淆矩阵示例中提取值:

你可以认为 precision 主要回答了以下问题:

在所有我归类为正面的例子中,有多少是真正正面的呢?

这将有助于您理解在对新示例进行分类时,您的算法有多“广泛”。真正帮助我记住精确度的一个比喻是渔夫的比喻。

如果一个渔民用一张大网捕鱼,捕到 100 条鱼和 1 只靴子,他们的精确度是多少?高!在我们的比喻中,精确是以下形式的表示:“在渔夫网里的所有物体中,鱼占百分之多少?”

类似于 Precision 的指标是 Recall —让我们检查一下。

回忆

回忆有助于我们了解目标等于 1 的示例中,我们正确标记的示例的百分比是多少。

与 Precision 类似,当目标是罕见事件(也称为不平衡)时,这是一个非常好的度量标准。公式是:

并用我们示例中的值检查公式:

您可能会问自己:“当目标很少时,为什么这是一个好的度量?”

还记得我们说过,当目标很少时,精确度不是一个很好的衡量标准吗?假设您有 1000 个示例,其中只有 5 个示例的 target 等于 1。如果你把所有的东西都归类为 0,那么你的准确率将是 995/1000,或者 99.5%—同样,这似乎是一个很好的模型!但是如果你计算这个例子的回忆:

因为真阳性是 0,所以召回也是 0。较高的召回率意味着你能够正确分类所有存在的真实标签,因此你的算法应该更有价值。

请注意,如果您对太多具有“1”的示例进行分类,您的精度将会降低。幸运的是,有一个度量标准使我们能够将精确度和召回率结合起来,即 f 值(我们将在下面更详细地检查它)。

回到渔夫的比喻,高召回率意味着你能够在该地区捕捞大量的鱼,而不用捕捞太多的靴子!

特征

召回率和精确度在分子上都有真阳性。还有另一个衡量真阴性率的指标,叫做特异性。在大多数使用案例中,特异性并不单独使用,但它与计算 AUC 分数相关,我们将在下面看到。

特异性的公式如下:

对于我们的混淆矩阵示例:

特异性是一个类似的概念,但是依赖于目标实际目标为 0 的例子。具体来说,我们试图理解我们的算法正在正确计算的否定的比例。

f 分数

我们已经看到了精度和召回是如何避开“稀有目标”的,给出了比精度更重要的关于模型的反馈。但是,它们仍然传达不同的信息。如果我们有一个能平衡精确度和召回率的度量标准,那不是很好吗?

幸运的是,我们有 F 值(有时也称为 F 值或 F1 值)!

F-score 是精确度和召回率之间的调和平均值,公式如下:

在我们的例子中,由于精度和召回率是相同的,我们将得到如下结果:

这个指标帮助我们理解精确度和召回率之间的平衡。如果接近 1,那么精度和召回率都接近 1。

高 f 值意味着我们的模型能够完美地区分问题中的 1 和 0——这是任何分类算法的最终目标。

到目前为止,我们只看到了来自混淆矩阵的度量,正如我们所看到的,为了构建 CM,我们需要定义一个阈值来对我们的示例进行分类。接下来,我们将看到一个独立于先验条件的度量,而不是模型的结果。

罗马纪元

AUC 来自 ROC 曲线。你可以查看本文中的 ROC 曲线详情。

ROC 曲线是一个简单的概念,它检查在分类中任何可用阈值的回忆与特异性的值。典型的 ROC 曲线示例如下:

作者图片

在 x 轴上我们有召回。在 y 轴上,我们有 1-特异性(也称为假阳性率-FPR ),并且该曲线的每个值对应于召回和 FPR 的特定值。让我们放大橙色点的细节:

  • orange point 的召回率约为 40%。
  • FPR 的价值在 10%左右。
  • 为此点选择的阈值是 78%。这意味着,如果您的算法得出的概率高于 0.78 或 78%,您将认为示例目标等于 1。

如果你考虑一个更高的阈值,我们说的是一个类似于下面浅橙色的点:

作者图片

请注意,如果将考虑来自算法的示例所需的阈值提高到等于 1,自然会“捕捉”到更少的示例。理想情况下,当你这样做时,你会希望你的回忆保持不变,并降低你的 FPR——这意味着通过提高阈值,你将捕捉到更少的假阳性。

请注意,当你到达曲线右侧的终点时,你认为所有的例子都是积极的——你钓到了所有的鱼,但也钓到了所有的靴子!

因此..到底什么是 AUC?曲线下面积就是 ROC 曲线下的总面积。该值越大,面积就越大,模型在任何阈值下都能更好地区分 1 和 0 这两类。

作者图片

在这种情况下,AUC(曲线下用箭头标记的整个区域)将接近 0.7,接近完美的模型将具有类似于以下的曲线:

作者图片

在这种情况下,即使使用高达 95%的阈值,您也可以捕捉到实际目标等于 1 的大多数示例,同时最大限度地减少误报。这种 ROC 曲线非常罕见,因为这意味着您试图拆分的类几乎是线性可分的,这在现实生活中并不常见。

AUC 的范围从 0 到 1。0.值为 0 意味着你的模型比随机模型差(坏兆头!)并且值为 1 意味着完美的模型(乌托邦)。为什么这一指标与阈值无关?当您计算可用于构建曲线的任何阈值的结果及其下的面积时,您将使您的评估独立于它们。

我们完事了。这些指标是评估数据科学和机器学习分类模型的一些最常见的指标。还有许多其他的方法可以使用,但是这些可能是在 ML 项目中最常见的。

您还有其他常用指标来评估您的分类模型吗?写在下面的评论里,我很想听听你的看法!

我在 Udemy 课程 中开设了一门关于学习数据科学的课程,我在课程中对这些指标进行了深入探讨——这门课程适合初学者,我希望您能参加。

每个 Python 初学者在编码时应该避免的 6 个错误

原文:https://towardsdatascience.com/6-mistakes-every-python-beginner-should-avoid-while-coding-e57e14917942?source=collection_archive---------3-----------------------

这些小的改进可能是至关重要的

照片由龟背竹 发自Pexels

Python 是初学者中相当受欢迎的语言,因为它非常容易使用。但是在易于理解的语法和较短的代码背后,有一些每个人都必须注意的微小细节。因为忽略这些细节可能会导致您的代码被破坏,并可能成为您头疼的原因。

本文将讨论每个初学者在用 Python 编码时应该避免的 6 个错误。

1。****Python 的版本:

这应该是 python 程序员主要关心的问题之一,因为全球程序员都在使用大量的 Python 版本。目前使用的两个主要版本是 Python 2。x 和 Python 3。x 它们之间有一些差异,比如:

10 / 4

python 2 中的输出。x 是 2

python 3 中的输出。x 是 2.5

此外,在打印报表时:

打印‘hello world’# python 2。X

print(《hello world》)# python 3。X

甚至在 Python 3 的子版本之间也发现了一些差异,比如 Python 3.8 支持 Walrus 操作符(:=),而 Python 3.7 不支持。Python 3.8 中的 f 字符串也支持“=”。

2。操作系统操作系统

编写 python 代码时要记住的另一点是执行代码的操作系统。如果您正在为多个平台编写代码,这一点尤其重要。一个例子是在 Windows 和 Linux 上清除屏幕的命令:

对于 Windows:

os.system(‘cls’)

对于 Linux:

os.system(“clear”)

3。 误解 Python 函数

Python 有大量的函数,它们可能做同样的工作,但以不同的方式执行。所以每个程序员都需要理解一个特定的函数是如何工作的,因为使用错误的函数可能不会给你预期的结果。例如,在 Python 中,sort()和 sorted()函数做同样的事情,即对数组排序。但是它们的工作方式不同:

list1 = [6,3,8,1,5]
print(list1.sort())list2 = [9,2,7,6,8]
list2 = sorted(list2)
print(list2)

输出

**None****[2, 6, 7, 8, 9]**

在这里,虽然两个列表都是排序的,但是 list1 返回 none,因为排序是就地完成的,而在 sorted(list2)的情况下,会创建一个新列表,并正确打印该列表。

在处理列表时,reverse()和 reversed()函数以及 append()和 extend()函数也是如此。

4。 缩进错误

Python 对代码中的缩进非常严格,因为它不依赖括号来分隔代码块。这就是为什么即使一个缩进错误也会破坏代码并给你带来意想不到的结果。

当您在同一个代码文件中使用多个函数时,这变得更加严重,因为有时它可能不会给您带来缩进错误,但会成为代码中的一个严重错误。

5。 迭代时修改列表项

迭代时修改任何列表/集合都不是一个好主意。让我先给你举个例子:

a = [1,2,3,4,5,6,7,8,9]#here I want to remove all numbers those are >= 5 from the list
for b in a:
    if b >= 5:
        a.remove(b)
print(a)

输出

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

这是因为在迭代语句的情况下,机器会多次遍历列表,当机器下次遍历列表时,原始列表可能会给你一个预期的结果。

这个错误可以通过理解列表来避免:

a = [1,2,3,4,5,6,7,8,9]
a = [b for b in a if b<5]
print(a)

输出

[1, 2, 3, 4]

6。 命名不当

Python 程序员应该养成在编码时遵循一些约定的习惯,以使代码更具可读性和无错误性。

  • 在给一个变量命名时,必须非常小心,因为即使是一个单一的差异也会使变量不同。比如苹果和苹果是两个不同的变量。
  • 许多初级程序员不小心命名了他们的函数,这成为其他程序员理解的噩梦。这就是为什么命名一个返回给定数字中最小值的函数而不是给定数字中的最小值是明智的。
  • 有时程序员编写的模型名称与 Python 标准库模块冲突。当您试图导入同名的标准库模块时,这可能会导致一些严重的问题。

这里有一本关于 Python 编程的书 ,我绝对推荐给所有初学者。

结论

这些是初学 Python 的程序员应该知道并不惜一切代价避免的一些错误。虽然其中一些错误看起来很微不足道,但是如果不被注意,它们会在代码中造成大问题。

但好的一面是,如果你练习把这些要点记在脑子里——你可以在很短的时间内改掉这些错误,成为一名更好的开发者。

注: 本文包含附属链接。这意味着,如果你点击它,并选择购买我上面链接的资源,你的订阅费的一小部分将归我所有。

然而,推荐的资源是我亲身经历的,并在我的数据科学职业生涯中帮助了我。

在你走之前……

如果你喜欢这篇文章,并希望继续关注更多关于 Python &数据科学精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为中级会员。

请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: Pranjal 的简讯

PySpark 的 6 个必备色谱柱操作

原文:https://towardsdatascience.com/6-must-know-column-operations-with-pyspark-d64f5315873e?source=collection_archive---------14-----------------------

简单如 Python,强大如 Spark

Marc-Olivier Jodoin 在 Unsplash 上拍摄的照片

Spark 是一个用于大规模数据处理的分析引擎。它让您可以将数据和计算分散到集群上,从而实现显著的性能提升。

PySpark 是 Spark 的 Python 库。它结合了 Python 的简单性和 Spark 的高效性,这种合作得到了数据科学家和工程师的高度赞赏。

在本文中,我们将介绍 6 种不同的列操作,它们是数据分析和操作中经常用到的。我们将使用 PySpark 的 SQL 模块,它提供了几个处理结构化数据的函数。

让我们从导入库开始。

from pyspark.sql import SparkSession
from pyspark.sql import functions as F

我们需要创建一个 SparkSession 作为 Spark SQL 的入口点。

spark = SparkSession.builder.getOrCreate()

我们将在整篇文章中使用这个 spark 会话。下一步是创建一个样本数据框来进行示例。

data = [
    ("John", "Biology", 3.45, "Junior"),
    ("Jane", "Chemistry", 3.60, "Sophomore"),
    ("Ashley", "Biology", 3.25, "Sophomore"),
    ("Max", "Physics", 2.95, "Senior"),
    ("Emily", "Biology", 3.30, "Junior")
]columns = ["Name", "Major", "GPA", "Class"]df = spark.createDataFrame(data = data, schema = columns)df.show()

(图片由作者提供)

我们根据一个模式编写样本数据。然后数据和模式都被传递给createDataFrame函数。

我们现在可以开始列操作了。

1.创建新列

withColumn函数用于创建一个新列。我们传递新列的名称以及填充它的数据。

df = df.withColumn("School", F.lit("A"))df.show()

(图片由作者提供)

lit函数允许用常量值填充一列。不像熊猫,我们不能只写“A”。

需要注意的是withColumn功能不能正常工作。因此,我们需要将更新后的数据框赋给一个新变量(自身或任何其他变量)来保存更改。

2.更新列

withColumn函数也可以用来更新或修改一列中的值。例如,我们可以将 GPA 值转换为 100 分制。

df.withColumn("GPA", F.col("GPA") * 100 / 4).show()

(图片由作者提供)

请记住,我们需要使用col函数来应用列操作。如果我们只把列名写成字符串,我们会得到一个错误。

3.重命名列

withColumnRenamed函数改变列的名称。我们将当前名称和新名称作为参数传递给这个函数。

df = df.withColumnRenamed("School", "University")df.show()

(图片由作者提供)

4.选择一列或多列

在某些情况下,我们可能只需要从数据框中获取特定的一列或几列。select 函数允许我们通过传递所需列的名称来完成这项任务。

df.select("Name", "Major").show()

(图片由作者提供)

5.列中的唯一值

如果我们想检查一列中不同值的数量,可以使用countDistinct函数。

df.select(F.countDistinct("Major").alias("Unique_count")).show()

(图片由作者提供)

它非常类似于 SQL 语法。选择列时应用该函数。我们还可以在一列中显示唯一的值。

df.select("Major").distinct().show()

(图片由作者提供)

6.删除一列

删除列的语法非常直观。正如您可能猜到的,使用了drop函数。

df = df.drop("University")df.show()

(图片由作者提供)

结论

我们已经用 PySpark 介绍了 6 种常用的列操作。PySpark 的 SQL 模块提供了更多的函数和方法来执行高效的数据分析。

需要注意的是,Spark 针对大规模数据进行了优化。因此,在处理小规模数据时,您可能看不到任何性能提升。事实上,在处理小数据集时,Pandas 可能会比 PySpark 表现得更好。

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

机器学习算法的 6 个必须知道的参数

原文:https://towardsdatascience.com/6-must-know-parameters-for-machine-learning-algorithms-ed52964bd7a9?source=collection_archive---------13-----------------------

提升模型的性能

托马斯·汤普森Unsplash 上拍照

有几种机器学习算法可用于监督和非监督任务。由于开源库的丰富选择,我们可以用几行代码实现这些模型。

虽然这些算法是现成的,但我们通常需要通过模型参数来调整它们。我们可以定制或调整的模型参数称为超参数。优化超参数所实现的是,它定制一个算法来更好地适应我们的数据或任务。

为了充分利用算法,超参数的使用至关重要。因此,我们需要对模型超参数及其影响有一个全面的了解。

在本文中,我们将涵盖常用的监督机器学习算法的 6 个关键超参数。本文基于 Scikit-learn,因此如果您使用不同的库,参数的名称可能会略有不同。但是,他们的意思和做法是一样的。

1.支持向量机的 c 参数

支持向量机(SVM)是一种广泛使用的监督机器学习算法。它主要用于分类任务,但也适用于回归。SVM 创造了一个区分不同阶层的决策界限。

当确定决策边界时,SVM 模型试图解决具有以下目标的优化问题:

  • 增加决策边界到类别(或支持向量)的距离
  • 最大化训练集中正确分类的点数

这两个目标之间显然有所取舍。决策边界可能必须非常接近特定的类,以最大化正确标记的数据点的数量。这种方法的缺点是模型对自变量的微小变化和噪声很敏感。这种情况也称为过度拟合。

另一方面,决策边界可能被放置在离每个类尽可能远的地方,代价是一些错误分类的异常。

这两种方法之间的权衡由 c 参数控制。它为每个错误分类的数据点增加一个惩罚。如果 c 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。

如果 c 很大,SVM 试图最小化由于高惩罚导致的错误分类的例子的数量,这导致了具有较小裕度的决策边界。对于所有错误分类的例子,惩罚是不同的。它与到决策边界的距离成正比。

2.支持向量机的伽玛参数

在介绍 gamma 参数之前,我们需要先说一下内核的窍门。在某些情况下,不可线性分离的数据点会使用核函数进行变换,以便它们变得可线性分离。

核函数是一种相似性度量。输入是原始特征,输出是新特征空间中的相似性度量。这里的相似性是指接近的程度。

常用的核函数之一是径向基函数(RBF)。RBF 的 Gamma 参数控制数据点的影响距离。

低 gamma 值表示较大的相似性半径,这将导致更多的点被组合在一起。对于高 gamma 值,这些点需要彼此非常接近,才能被视为在同一组(或类)中。因此,gamma 值非常大的模型往往会过度拟合。随着灰度系数的降低,分隔不同类别的区域变得更加一般化。

3.决策树的最大深度

决策树是一种广泛使用的监督学习算法,适用于分类和回归任务。决策树是一些著名的集成学习算法的构建模块,如随机森林、GBDT 和 XGBOOST。

决策树建立在反复询问问题以分割数据点的基础上。max_depth 参数用于控制树的深度。当达到 max_depth 时,模型停止分割。

max_depth 参数没有标准值或最佳值。它高度依赖于数据。一般来说,随着树木越来越深,过度拟合的机会增加。

如果我们使用非常小的树深度值,模型可能无法捕获关于数据集的足够的细节或信息。因此,它在训练集和测试集上都表现不佳。这种情况也称为欠适配。

最大深度为 3 的决策树(图片由作者提供)

4.决策树的最小杂质减少

当算法执行拆分时,主要目标是尽可能减少杂质。如果你想了解更多关于杂质、信息增益以及决策树如何使用这些概念,这里有一篇我不久前写的详细的文章

杂质减少得越多,分裂获得的信息量就越大。随着树变得更深,杂质减少的量变得更低。我们可以利用这一点来防止树做进一步的分裂。该任务的超参数是最小杂质减少

Scikit-learn 提供了两个函数来衡量分割的质量,这两个函数是基尼系数和熵。考虑下面一个 min _ infinity _ decrease 值为 0.2 的决策树的可视化。每一次分离使杂质减少 0.2。

(图片由作者提供)

5.随机森林和 GBDT 的树木数量

随机森林和梯度增强决策树(GBDT)是集成学习方法,这意味着它们将许多学习者结合起来,以建立更鲁棒和准确的模型。它们用于解决监督学习任务。随机森林和 GBDTs 的共同点是它们使用的基本算法是决策树。

它们之间的主要区别是它们组合决策树的方式。随机森林是使用一种称为 bagging 的方法构建的,其中每个决策树都被用作并行估计器。

GBDTs 使用 boosting 方法来组合各个决策树。Boosting 是指将一个学习算法串联起来,从许多顺序连接的弱学习器中实现一个强学习器。

n_estimators 参数用于确定集合模型中使用的树的数量。n_estimators 参数对随机森林和 GBDT 的影响是不同的。

增加随机森林中的树木数量不会导致过度拟合。在某个点之后,模型的准确性不会因为添加更多的树而增加,但是也不会因为添加过多的树而受到负面影响。由于计算原因,您仍然不希望添加不必要数量的树,但是没有与随机森林中的树的数量相关联的过度拟合的风险。

然而,梯度提升决策树中的树的数量在过度拟合方面非常关键。添加太多的树会导致过度拟合,所以在某个时候停止添加树是很重要的。

6.K 个最近邻的 N_neighbors

k-最近邻(kNN)是一种受监督的机器学习算法,可用于解决分类和回归任务。

kNN 分类器通过多数表决原则确定数据点的类别。如果 k 设置为 5,则检查 5 个最近点的类。根据多数类进行预测。类似地,kNN 回归取 5 个最近点的平均值。

n_neighbors 参数确定 k 值。就像决策树的 max_depth 一样,不存在适用于所有问题的标准或最优 k 值。

如果 k 太小,模型就变得太具体了。它还倾向于对噪声和特征的微小变化敏感。该模型在训练集上实现了高精度,但是在新的、以前看不到的数据点上将是差的预测器。因此,我们很可能以一个过度拟合的模型结束。

如果我们为 k 选择了一个太大的值,那么这个模型就变得太一般化了,因此在训练集和测试集上都不是一个好的预测器。它无法捕捉数据中的结构。该模型很可能不合适。

结论

我们已经讨论了对相关算法至关重要的 6 个超参数。在机器学习算法的范围内,还有许多超参数,但是要涵盖所有这些参数,这篇文章会很长。

在大多数情况下,需要多次试验才能找到这些超参数的最佳值。有一些工具可以简化这个过程,比如 Scikit-learn 库的 GridSearchCV 函数。

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

Python 3.10 中 6 个令人惊叹的新特性

原文:https://towardsdatascience.com/6-new-awesome-features-in-python-3-10-a0598e87689f?source=collection_archive---------1-----------------------

提示和技巧

新的 Python 版本推出了有趣的新特性。

大卫·克劳德Unsplash 上拍摄的照片

Python 是当今最流行的编程语言之一。它被广泛用于各种领域和应用,从学习计算机科学的基础知识到执行复杂和简单的科学计算任务,再到构建游戏。它甚至被用于数据科学和量子计算等高级领域。

Python 的流行有很多原因。最重要的两个因素是 Python 的通用性,以及与其他编程语言相比,它的易学性。此外,Python 由 Python 软件基金会维护和开发,该基金会一直致力于改进 Python 的新方法。

一周前(2021 年 10 月 4 日),Python 新版本发布,Python 3.10。在这个新版本中,Python 增加了独特而有价值的特性,同时删除了一些旧特性。我们可以将任何新软件版本中添加或删除的功能分为几类,如语法功能、添加到默认库中或对现有功能的改进。

</5-python-books-to-transfer-your-code-to-the-next-level-a5af0981e204> [## 5 本 Python 书籍,让你的代码更上一层楼

towardsdatascience.com](/5-python-books-to-transfer-your-code-to-the-next-level-a5af0981e204)

Python 3.10 有几个新的很酷的特性,使得使用 Python 的体验更好。在本文中,我将与您分享 6 个新特性和插件,它们是我最感兴趣的,也是我最高兴看到添加到 Python 中的。

№1:更好的错误跟踪

作为一个每天用 Python 写代码、教编码的人,我深知得到一个语法错误的挫败感。尽管一旦掌握了 Python 和编程,语法错误很容易修复,但有时我们希望有更好的错误消息,可以帮助我们更好地定位错误并节省调试时间。

在 Python 3.10 中,处理错误要好得多,因为有两个特性,更好的错误消息和用于调试的精确行号。例如,让我们考虑下面的代码,其中我们有一个字典和一个函数。然而,在这段代码中,我们忘记了关闭字典。

some_dict = {1: "jack", 2: "john", 3: "james" ,
a_results = a_useful_function()

在 Python 的早期版本中,错误消息如下所示:

File "amazing_code.py", line 3
    a_results = a_useful_function()
              ^
**SyntaxError**: invalid syntax

但是,随着新的错误消息和行号的改进,新的错误消息将具有更好的信息,比如错误的确切类型及其精确的行号。

File "amazing_code.py", line 1
    expected = {1: "jack", 2: "john", 3: "james" ,
                                                 ^
**SyntaxError**: '{' was never closed

这个新特性将有助于加快调试速度,减少初学 Python 的人的挫折感。

№2:介绍结构模式匹配

如果你使用过 C++之类的其他编程语言,你可能会希望 Python 有 switch 语句,这样你就不用经历冗长的 If,elif,elif,…,else 语句。嗯,Python 3.10 的新特性之一是增加了他们所谓的结构模式匹配,或者换句话说,switch,case 语句,其语法如下。

match subject:
    case <patt1>:
        <act1>
    case <patt2>:
        <act2>
    case <patt3>:
        <act3>
    case _:
        <action_default>

</6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61> [## 数据科学应用的 6 个最佳 Python IDEs 和文本编辑器

towardsdatascience.com](/6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61)

№3:新型并集运算符

虽然 Python 是一种动态类型的编程语言,但是有一些方法可以使它的某些部分成为静态类型。例如,如果你正在编写一个函数,而属性的类型对于函数内部的交换是很重要的。在以前的版本中,您可以指定属性的类型,例如:

**def** func(num: int) -> int:
    **return** num + 5

但是,如果您想接受两种类型,那么您需要使用 Union 关键字。

**def** func(num: Union[int, float]) -> Union[int, float]:
    **return** num + 5

在 Python 的新版本中,您可以在两种类型之间进行选择,使用|操作符代替 Union 进行更直接的类型决定。

**def** func(num: int | float) -> int | float:
    **return** num + 5

№4:其他酷功能

4.1 更严格的拉链设计

Python 中有趣的 Python 函数之一是zip()函数,这是 Python 中的一个内置函数,允许您组合和迭代来自几个序列的元素。在以前的版本中,您可以对不同长度的序列使用zip ,但是现在,引入了一个新的参数strict来检查传递给 zip 函数的所有 iterables 是否长度相同。

</9-free-quality-resources-to-learn-and-expand-your-python-skills-44e0fe920cf4>

4.2 自动文本编码

作为一名程序员,我们会遇到或说这样一句话“它在我的机器上工作!”。一个代码在一台机器上可以工作,而在另一台机器上却不行,原因有很多;文本编码会导致这样的错误。

在 Python 的早期版本中,如果没有明确声明编码类型,首选的本地编码可能会导致代码在其他机器上失败。在 Python 3.10 中,当用户打开没有特定编码类型的文本文件时,可以激活警告来通知用户。

4.3 异步迭代

一个强大而高级的编程范例是异步编程,从 3.5 版本开始,异步编程就是 Python 的一部分。在 Python 3.10 中,有两个新的异步内置函数[aiter()](https://docs.python.org/3.10/library/functions.html#aiter)[anext(](https://docs.python.org/3.10/library/functions.html#anext)),让你的代码更具可读性。

最后的想法

当我在读本科学位时,我上过几门课,在这些课上我们使用 C++或 Java 来编写代码和实现应用程序。但是,到了写毕业论文的时候,我决定学习和使用 Python。那是快十年前的事了,我再也没有回头;此后,每当我处理问题时,Python 就成了我的首选编程语言。

然后,我开始教孩子们计算机科学,我意识到 Python 可以激励年轻一代去追求技术职业。除了用 Python 编写或阅读代码的简单性以及开始用 Python 实现代码的速度之外,我最喜欢这种编程语言的一点是 Python 软件基金会如何努力保持 Python 的相关性。

随着 Python 的每一个新版本,都添加了令人难以置信的新特性,这些特性是大多数用户一直要求的,这些特性将使我们用 Python 编写代码更有效,并使人们更容易进入编程——一般而言——特别是 Python。在这篇文章中,我与您分享了 Python 3.10 中的 6 个新特性,这些特性是我最感兴趣的,我可以和我的学生一起使用。

面向各级数据科学家的 6 本 NLP 书籍

原文:https://towardsdatascience.com/6-nlp-books-for-data-scientists-of-all-levels-2ed070c7acf0?source=collection_archive---------33-----------------------

无论您的数据科学水平如何,都要精通 NLP

照片由 Aaron BurdenUnsplash

开始总是最困难的。你感到迷茫,不知道从哪里开始,哪条路最好。如果你试图进入的是一个像数据科学这样复杂且非常广泛的领域,那就更是如此。不仅仅是宽泛,数据科学是你可以在网上找到大量信息的领域之一。

最受欢迎的数据科学分支是自然语言处理(NLP)。NLP 是计算机科学的一个分支,它关注的是让计算机理解和使用自然语言。自从计算机本身发明以来,对计算机理解我们并与我们交流的渴望就一直存在。

</6-nlp-techniques-every-data-scientist-should-know-7cdea012e5c3>

然而,在过去的几年里,计算一直在快速前进,让机器学习和大数据等技术成为现实。不仅仅是现实,而是日常使用的技术。

因为 NLP 的受欢迎程度越来越高,每天都有新的人考虑加入这个领域。学习任何东西的最佳资源之一是书籍。但是,有很多关于数据科学和 NLP 的书籍。那么,你应该读哪个呢?

这篇文章将带你浏览 6 本令人惊叹的 NLP 书籍,它们将带你从一个 NLP 新手迅速成为 NLP 专家。

№1:用 Python 进行文本分析:自然语言处理实践指南

Python 文本分析:自然语言处理从业者指南是一本很棒的书,教你如何设置和构建一个健壮的环境,你可以用它来完成各种文本分析任务。此外,这些书提出了许多基于 NLP 最新研究进展的技术和模型。

这本书将带你从使用 Python 的 NLP 的绝对基础到更高级的主题和现实生活中的应用。然后深入到几个流行的 NLP 应用程序的理论、实现和用例,包括解析和处理测试、文本摘要、主题建模和语义分析。

代码中提到的所有代码库都可以在 GitHub 上免费访问。也许这本书最大的优点是它带你开始了构建一个实际的 NLP 应用程序的旅程。这就是它适合 it 专业人员、开发人员、工程师和分析师的原因。

</6-web-scraping-tools-that-make-collecting-data-a-breeze-457c44e4411d>

№2: NLTK 书

如果您正在使用 Python 学习 NLP,那么在您的旅程中,您一定已经通过了 NLTK。NLTK(自然语言工具包)是 Python 中最流行的 NLP 库之一。

该库有自己的免费可用书籍,涵盖了 NLP 的所有基础知识,以及库中的各种函数和方法,以及如何使用它们来构建现实生活中的 NLP 项目。我应该提到的是,这本书只是 NLP 的入门书籍,它不会深入到高级算法和技术。

相反,它将重点帮助您为解析、处理和分析文本数据打下坚实的基础。这本书被更新以匹配 NLTK 3 和 Python 3。

№3:语音和语言处理

语音和语言处理是斯坦福大学的教授们写的一本书。这本书的最新草稿(2020 年 12 月)可以在网上看到。你可以从这本书的官方网站上免费获得并在线阅读这本书的所有章节。

这本书涵盖了所有基本的演讲和语言处理技术,从最开始到更高级的主题。它从 NLP 基础开始,如 n-grams、文本规范化和正则表达式,然后进入回归、深度学习、神经网络和机器翻译。

它还附带了幻灯片草稿,如果任何人打算教 NLP,都可以使用。这本书是第一本包含聊天机器人、语音识别、对话系统和语音转文本软件基础的章节的书。

№4:计算语言学和自然语言处理手册

《计算语言学和自然语言处理手册》是我最喜欢的自然语言处理书籍之一。背后的原因是,这本书超越了 NLP 算法和应用的高水平。它将带你深入解析和计算语言学背后的理论,以及该领域的现状。

我想说这本书比前面提到的书更学术,主要是因为它详细解释了该领域所有不同方面背后的理论,以及它们实用的一面。

这本书是所有自然语言处理和计算语言学的伟大参考资源,从文本传递到情感分析,到神经网络和语音识别。

№5:统计自然语言处理基础

斯坦福大学教授的又一本巨著。统计自然语言基础处理是在斯坦福大学教授的课程中使用的一本书。事实上,这本书在世界各地的许多大学中被用作参考书。

NLP 是许多数据科学分支之一,所有数据科学分支都严重依赖于数学和统计学。这本书讲述了你完全理解和实现 NLP 算法所需的所有数学和统计学原理。

它涵盖了不同的主题,从统计推断(n-grams)到马尔可夫链及其在 NLP、文本聚类和分类以及信息检索中的应用。官方网站还包括用来解释这本书不同章节的幻灯片,可以免费获得。

</6-data-science-certificates-to-level-up-your-career-275daed7e5df>

№6:自然语言处理的语言学基础:词法和句法的 100 个要点

自然语言处理是一个结合了计算和语言学两个方面的领域。当人们开始学习 NLP 时,他们通常会考虑该领域的技术方面,例如学习编码,或者机器学习的数学和基础知识。

清单上的最后一本书是关于语言学的。在任何 NLP 应用程序中,目标通常是提取所提供的自然语言句子中的单词依赖关系,这基本上属于理解不同语音部分之间的关系。作为数据科学家,我们训练计算机理解我们的语言,因此,我们自己也需要很好地理解它们的机制。

这本书提供了关于人类语言的句法感知结构的可靠信息,提供了许多有用的信息,可以用来建立和训练复杂的模型,可以更好地执行更准确的 NLP 任务。

外卖食品

如果你试着用谷歌搜索“NLP 书籍”,你会得到几百个——可能几千个——结果。虽然,阅读是获取信息的最好方式,但阅读数百本书来学习一些东西可能并不现实。尤其是如果你想转行,想获得一个证书,想通过一门课,或者只是想学习一项新技能。

那么,你如何决定先读哪些书呢?

我读过许多关于数据科学各个方面的书,有些是为了指导他人而读,有些是为了研究而读,有些只是因为我热爱 NLP。不管是什么原因,在这篇文章中,我给你提供了 6 本 NLP 书籍,我觉得它们对我的知识库的建立帮助最大。

这 6 本书只是我的观点,它们也是学习 NLP 的起点。学习数据科学是一个持续的过程,只要技术进步,新算法、新技术、新语言就会出现。作为数据科学家,我们必须跟上所有新技术的发展。

我知道这听起来可能太多了,但作为一名数据科学家就像生活中的任何事情一样,这是一个旅程,你每走一步都会学到新的东西,你所要做的就是向前走并迈出第一步。

每个数据科学家都应该知道的 6 种 NLP 技术

原文:https://towardsdatascience.com/6-nlp-techniques-every-data-scientist-should-know-7cdea012e5c3?source=collection_archive---------3-----------------------

迈向更高效的自然语言处理

UnsplashSai Kiran Anagani 拍摄的照片

自然语言处理可能是数据科学中谈论最多的子领域。这很有趣,很有前途,它可以改变我们今天看待技术的方式。不仅仅是技术,它还可以改变我们感知人类语言的方式。

自然语言处理已经从研究和工业中获得了太多的关注和牵引,因为它是人类语言和技术的结合。自从计算机第一次被创造出来,人们就一直梦想着创造能够理解人类语言的计算机程序。

机器学习和人工智能领域的进步推动了自然语言处理的出现和持续关注。这种兴趣只会越来越大,特别是现在我们可以看到自然语言处理如何使我们的生活变得更容易。Alexa、Siri 和自动翻译机等技术突出了这一点。

事实是,自然语言处理是我进入数据科学的原因。我总是对语言以及它们如何基于人类经验和时间而进化着迷。我想知道我们如何能教计算机理解我们的语言,不仅仅是语言,而是我们如何能让它们能够用语言来交流和理解我们。

在这篇文章中,我将介绍自然语言处理的 6 种基本技术,如果你真的想进入这个领域,你应该知道这 6 种技术。

词汇化和词干化

词干化和词汇化可能是构建 NLP 项目的前两个步骤——您经常使用其中的一个。它们代表了这个领域的核心概念,通常是你在成为 NLP 大师的旅途中首先要运用的技巧。

通常,初学者容易混淆这两种技术。虽然他们有相似之处,但他们有很大的不同。

  • 词干化:词干化是一组算法,通过截取单词开头的结尾来达到其不定式形式。这些算法通过考虑被分析的语言的公共前缀和后缀来实现。删掉这些单词可以得到正确的不定式形式,但情况并非总是如此。有许多算法来执行词干提取;英语中最常用的是波特词干。该算法包含 5 个阶段,依次工作以获得单词的根。
  • 词条化:为了克服词干化的缺陷,设计了词条化算法。在这些类型的算法中,在提取单词的不定式形式时,需要将一些语言学和语法知识输入到算法中,以便做出更好的决策。为了使词汇化算法准确执行,它们需要提取每个单词的正确词汇。因此,他们通常需要一部语言词典来对每个单词进行正确的分类。

图片由作者制作,使用 Canva

基于这些定义,您可以想象构建一个 lemmatizer 比构建一个词干分析器更复杂、更耗时。但是,它更准确,并且在最终的分析结果中会产生更少的噪声。

关键词提取

关键词提取——有时称为关键词检测关键词分析——是一种用于文本分析的自然语言处理技术。这项技术的主要目的是从文本正文中自动提取最常用的单词和短语。它通常被用作概括文章的主要思想和传达文章中的关键思想的第一步。

在关键词提取算法的后端,奠定了机器学习和人工智能的力量。它们用于提取和简化给定的文本,使其能够被计算机理解。该算法可以适用于任何类型的上下文,从学术文本到社交媒体帖子中使用的口语文本。

关键词提取在当今世界有许多应用,包括社交媒体监控、客户服务/反馈、产品分析和搜索引擎优化。

命名实体识别(NER)

像词干化和词汇化、命名实体识别或 NER 一样,NLP 的基本和核心技术是。NER 是一种用于从文本主体中提取实体的技术,用于识别文本中的基本概念,例如人名、地点、日期等。

NER 算法主要有两步。首先,它需要检测文本中的实体,然后将其归类到一个集合类别中。NER 的表现在很大程度上取决于用于开发模型的训练数据。训练数据与实际数据越相关,结果就越准确。

影响 NER 模型准确性的另一个因素是建立模型时使用的语言知识。也就是说,有一些开放的 NER 平台是预先训练好的,随时可以使用。

NER 可用于各种领域,如构建推荐系统、在医疗保健中为患者提供更好的服务,以及在学术界帮助学生获取与其学习范围相关的材料。

主题建模

你可以使用关键词提取技术将大量的文本缩小到几个主要的关键词和想法。从中,你大概可以提炼出课文的主题。

另一种更先进的识别文本主题的技术是主题建模——基于无监督机器学习的顶层建模,不需要标记数据进行训练。

可以使用多种算法来对文本的主题进行建模,例如相关主题模型、潜在狄利克雷分配和潜在情感分析。最常用的方法是潜在的狄利克雷。这种方法分析文本,将其分解为单词和语句,然后从这些单词和语句中提取不同的主题。你所要做的就是给算法输入一段文字,它就会从那里开始。

图片由作者使用 Canva 制作

摘要

自然语言处理的一个有用和有前途的应用是文本摘要。也就是说,把大量的文本压缩成一个包含文本主要信息的小块。这种技术常用于长篇新闻文章和总结研究论文。

文本摘要是一种高级技术,它使用我们刚刚提到的其他技术来建立它的目标,例如主题建模和关键词提取。建立的方法是通过两个步骤,提取然后抽象。

在提取阶段,算法通过基于频率提取文本的重要部分来创建摘要。之后,该算法生成另一个摘要,这一次是通过创建一个全新的文本来传达与原始文本相同的信息。文本摘要算法有很多,比如 LexRank 和text rank。

在 LexRank 中,算法使用排序模型对文本中的句子进行分类。等级是基于句子之间的相似性;一个句子与文本的其余部分越相似,它的排名就越高。

情感分析

毫无疑问,最著名、最广为人知和最常用的 NLP 技术是情感分析。这种技术的核心功能是通过分析包含的单词来提取文本主体背后的情感。

这项技术最简单的结果是在一个有 3 个区域的范围内,阴性、阳性和中性。算法可以更加复杂和先进;但是,在这种情况下,结果将是数字。如果结果是负数,那么文本背后的情绪就带有消极的语气,如果是正数,那么文本中就带有一些积极的成分。

情感分析是机器学习技术的广泛应用之一。它可以使用监督或非监督技术来实现。也许执行情感分析的最常见的监督技术是使用朴素贝叶斯算法。可以使用的其他监督 ML 算法是梯度提升和随机森林。

外卖食品

人类希望计算机能够理解他们,并使用口语与他们交流,这种想法和计算机本身一样古老。由于技术和机器学习算法的快速进步,这个想法不再只是一个想法。这是我们在日常生活中可以看到和体验到的现实。这种思想是自然语言处理的核心驱动力。

自然语言处理是当今热门话题和人才吸引领域之一。各公司和研究机构正在竞相开发完全理解和使用人类语言的计算机程序。自从 20 世纪 60 年代首次出现以来,虚拟代理人和翻译确实发展迅速。

尽管自然语言处理可以执行不同的任务,但要进入该领域并开始构建自己的项目,您需要完全熟悉核心 6 基本自然语言处理技术。

这些技术是大多数(如果不是全部)自然语言处理算法的基本构件。所以,如果你理解了这些技巧以及何时使用它们,没有什么能阻止你。

我最喜欢的熊猫数据魔术师的 6 个戏法

原文:https://towardsdatascience.com/6-of-my-favorite-pandas-tricks-for-data-magicians-a8ec2af637fe?source=collection_archive---------35-----------------------

展示了我最喜欢的 Pandas Python 库的一些功能,其中有一些你以前可能没有见过

(src =https://pixabay.com/images/id-4421395/

介绍

Python 无疑已经脱颖而出,并在许多方面证明了自己是一种有效且可用的数据科学编程语言。事实证明这一点的部分原因是 Python 有一个最不可思议的生态系统,用于数学、统计、机器学习的高级声明包,最重要的是;

数据管理。

现在,数据科学领域已经成为数据管理概念的代名词,并且已经为 Python 程序员提供了 Pandas.py 这个光荣的礼物。这已经成为管理数据的行业标准,不仅是在 Python 编程方面,而且基本上是整个数据科学学科。不用说,Pandas 是一个非常棒的软件包,任何有抱负的数据科学家、数据工程师,甚至在某些情况下软件工程师都应该学习。熊猫可以被认为是一种工具,掌握你工具箱中的所有工具是很重要的。考虑到这一点,我决定采用一些相对不为人知的熊猫技巧,我发现这些技巧对数据科学非常有价值。希望这些提示能帮助程序员成为熊猫图书馆的绝对专家!另外,对于那些希望看到本文中的代码运行的人来说,您也可以查看笔记本(我在本文中使用的 ipynb)文件如下:

https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Python3/7 Of My Favorite Pandas Tricks.ipynb

创建数据框

显然,为了演示这些小技巧,你需要一个数据框。我将包含这些代码的唯一目的是为了文章中包含的所有代码的连续性和可运行性。

import pandas as pddf = pd.DataFrame({"A" : [5, 10, 15, 20], "B" : ['a', 'c', 'c', 'e']})df.head()

№1:存取方法

制作一个像 Pandas 这样的数据管理框架的问题是有太多不同形式的数据需要考虑。在这方面相信我;凭经验我知道。实际上,我正在为 Julia 语言开发我自己的面向对象数据框架包,我遇到了许多问题,我相信熊猫的创造者也必须克服这些问题。虽然表面上看起来很简单,但是管理这种类型的数据实际上非常困难!

无论如何,有点跑题了——但是如果你想看看我的 Julia 包(即使你不写 Julia,只写 Python,我想你会欣赏我正在做的事情),这里有一个 OddFrames 的 Github 的链接。jl:

https://github.com/ChifiSource/OddFrames.jl

我感谢所有的支持给这个包的发展(观点,拉请求,叉,克隆,明星)它意味着我的世界。即使在试图解析简单的逗号分隔值(。CSV)文件,我遇到了很多问题,尤其是在输入方面。我还写了一篇关于那场灾难的文章——如果你也想看的话,你当然也可以在这里看到:

我跑题了,咆哮着说像熊猫这样的东西实际上是多么难以创建,现在让我们讨论什么是访问器——以及它们如何应用于这种类型的问题。访问器只是一个简单的解决方案,可以用来以令人难以置信的流畅轻松实现 Pandas 库中的新类型和更改。访问器扩展了 Pandas 的功能,并提供了特定的操作。当然,这取决于类型。在 Pandas 中实现访问器的一个很好的例子是日期-时间访问器。

默认情况下,Pandas 库将附带以下访问器:

  • Str:字符串数据类型
  • 分类数据类型
  • Dt:日期时间、时间增量、周期数据类型
  • 稀疏:稀疏数据类型

也就是说,访问器的全部目的是为新的数据类型提供一个进入 series 类型的入口——也就是熊猫数据帧。也就是说,如果您打算使用 Python 和 Pandas,我肯定会花时间了解这些访问器。对于下面的例子,我将用字符串访问器 str 来演示这一点:

print(df.B.str)<pandas.core.strings.accessor.StringMethods object at 0x7efd127c09d0>

基本上,因为我们的数据框架上的 B 列对于每个观察都是 string 类型的,所以我们可以使用这个访问器来调用这个系列中给定类的成员变量和方法。这意味着我们不需要为了实际使用 d-type 而将它们取出并更改它们的类型,例如在这个连接示例中:

print(df.B.str.cat(sep = " "))a c c e

№2 剪贴板数据

很多时候,数据工程师和数据科学家都要经过大量的工作才能获得数据。数据争论是数据科学和机器学习的一部分,很容易熟悉,但似乎不可能掌握。也就是说,有一些更简单的方法可以用来处理某些类型的数据,当涉及到争论数据时,这些方法肯定可以节省一些时间。

在处理数据(特别是来自 web 的数据)时,这种节省时间和精力的方法的一个主要例子是使用剪贴板。正如许多人可能知道的,剪贴板只是内核在内存中的一个临时槽,可以在整个系统中访问。这些数据基本上是通过复制/粘贴来存储和擦除的。请记住,考虑到这种方法,您实际上可以将数据复制并粘贴到您的 Pandas 数据帧中。对于 web 抓取这样的事情来说,这可以节省大量时间,因为有时人们可能会抓取一个简单的 HTML5 文档来获取一些给定的数据。

利用这些数据实际上非常容易。也就是说,根据我的经验,这实际上并不适用于所有的操作系统。我冒昧地猜测,这可能与权限有关。也就是说,我使用的是 Fedora WS,该模块会产生以下严重错误:

data **=** pd.read_clipboard()PyperclipException                        Traceback (most recent call last)
<ipython-input-23-0300c28fab31> in <module>
----> 1 data = pd.read_clipboard()

/usr/lib64/python3.9/site-packages/pandas/io/clipboards.py in read_clipboard(sep, **kwargs)
 **36**     from pandas.io.parsers import read_csv
 **37** 
---> 38     text = clipboard_get()
 **39** 
 **40**     # Try to decode (if needed, as "text" might already be a string here).

№3:更改显示设置

我能为使用 Pandas 库的 Pythonistas 提供的另一个很好的建议是定制显示设置实际上是多么有用。虽然我并不是这个特性的大力支持者和用户,但实际使用这个特性已经揭示了利用这些选项的可变性来更好地理解数据确实有很多价值。

不用说,为了理解数据,清楚地了解数据是很重要的。当然,如果 Pandas 呈现数据的方式在默认情况下不适合您的特定数据集,这可能会非常困难。尽管这看起来相对简单,甚至毫无用处,但它实际上可以用作研究数据的探索性技术。从新的角度和角度看数据,无论这是更多的数据,更少的数据,更宽的数据,还是更长的数据等等。肯定有助于提供一些有价值的见解。

为了改变数据的显示方式,我们需要使用 pd.get_option()和 pd.set_option()方法。可以想象,get_option()方法返回当前设置,set_option()方法更改所述设置。要获得可更改选项的完整列表,您可以在此处阅读 Pandas 文档:

与该表一起,将该示例用作模板并插入任何想要更改给定选项应该相对容易:

pd.set_option("colheader_justify", "left")

№4:行和列切片

有一件事 Pandas 已经很明显了,那就是索引数据是一个非常有用和有价值的东西。有许多突出的方法,Pandas 库允许人们索引他们的数据框架,这些技术通常使使用 Pandas 模块的体验更加流畅和一致。

也就是说,接下来的两个小技巧可以帮助人们从数据帧中选择合适的数据。让我们考虑一下,我们想要获得一个新的数据帧,该数据帧包含指向某一点的行。例如,我们想从数据中提取前 5 个观察值。假设我们可能希望保持不同特征之间的观测值的相关性完整性,那么我们希望保留这些行中每一行的位置可能是合理的。在原始 Python 中,我们对此的最佳选择可能是迭代的以下用法:

# As you can see, this will print our column names.
for col in df: print(col)A
B# We can however call the row index of that value
for row in df: print(df[row])0     5
1    10
2    15
3    20
Name: A, dtype: int64
0    a
1    c
2    c
3    e

然后,当然,我们需要使用范围迭代器,找出这些中的哪一个对应或符合范围。不用说,这是一个大混乱。可能有一些其他的方法,但是确实没有很好的理由使用它们。请考虑下面的例子,我们可以用一个范围来索引观察值。这样做的好处还在于返回的类型,我们得到了一个数据帧,它可以直接返回到操作的世界——很容易!

df[1:3]

№5:布尔索引

还是关于索引的话题,Pandas 有另一种相当健壮的索引方法,对数据科学非常有用。虽然有其他数据框架具有布尔过滤或掩码过滤,但我认为索引语法很有意义,并且确实允许代码很好地流动。使用简单;我们提供一个位掩码,它只是一个由 1 和 0 组成的数组,代表给定条件是否满足的真和假。我们可以为此使用条件运算符:

less_than15 = df[df["A"] < 15]less_than15.head()

虽然这可能看起来相对简单和无效,但实际上这是我认为使熊猫比许多其他解决方案更令人愉快的特性之一。例如,DataFrames.jl 使用内置的 Base.filter 进行过滤,这种方法要奇怪得多!()方法。在我的使用中,我发现有些地方需要改进——熊猫的例子肯定不是这样。如果您想要执行一些假设检验,这是一个很好的选择,因为您可以在一行中非常有效地拟合只存在于一些相关组中的样本。

№6:应用

如果您是一名有抱负的数据科学家、数据工程师,或者只是来自任何可能使用 Python 的领域,那么您需要了解 apply()。apply()方法是 Python 标准库内部提供的一种方法,用于改变数组。它非常强大,因为它可以比迭代更快地获取并应用表达式。最重要的是,它肯定比 for 循环更容易使用。

为了使用 apply(),首先需要熟悉 lambda。Lambda 只是一个关键字,也是 Python 语言提供的,它允许人们非常容易地使用私有变量进行内联表达式。考虑以下带有 apply()和 lambda()的示例:

add5 = lambda x: x + 5
df.A.apply(add5)0    10
1    15
2    20
3    25
Name: A, dtype: int64

显然,这是一些写得非常好的 Python 代码…为什么?因为它很简单,利用了已经存在的 Python,比我们用这种语言编写的任何迭代循环都更有效,而且它读起来像英语。当然,这是在读者分别理解这些方法的应用的前提下。此外,我还有一篇文章,更详细地介绍了 lambda 及其在科学上的应用,如果你感兴趣,可以在这里阅读:

结论

这里有很多兔子洞和很深的洞,人们可以和熊猫一起下潜。也就是说,我认为一些使用软件包的程序员应该优先考虑一些事情。这个包也有很多非常棒的扩展,这也会使事情变得复杂。也就是说,这些只是关于熊猫的一些很酷的事情,我想我可以向那些没有和熊猫一起工作过或者以前没有见过熊猫的人展示一下。非常感谢你的阅读,我很感激!

6 熊猫展示你应该记住的选项

原文:https://towardsdatascience.com/6-pandas-display-options-you-should-memories-84adf8887bc3?source=collection_archive---------3-----------------------

图片栏设计师拍摄的照片

不要每次都把时间浪费在谷歌上!

作为一个数据科学家、数据分析师或者数据工程师,Pandas 一定是 Python 中最常用的库之一。它可以为我们打印一个漂亮的 HTML 格式的数据框,如果你像我一样使用 Jupyter Notebook/Lab 或 Google Colab,这是它的主要功能之一。

因为熊猫用的是预定义的 HTML + CSS,所以我们自己不需要担心格式的问题。然而,有时我们可能希望它以不同于默认格式的格式显示。你可能知道我们可以设置pd.options.display来实现这一点。

我有很多学习者知道这一点,但不记得每次他们想使用的选项。嗯,仅在pd.options.display子类别中就有 30 多个不同的选项。所以,完全没有必要全部记住。

在这篇文章中,我将推荐其中的 6 个,我建议你应该记住它们以提高编码效率。不要每次想用的时候都浪费时间在谷歌/栈溢出上!

请注意,我将使用pd作为熊猫的别名,因为我相信大多数人都像我一样使用import pandas as pd

1.设置最大行数

pd.options.display.max_rows

当我们有一个包含更多行的数据框时,Pandas 会在中间截断这些行,以确保我们不会被极长的表所困扰。默认数字是 60。

如图所示,如果数据框超过 60 行,中间的 50 行将被截断。

pd.DataFrame(np.random.randn(61, 5))

如果我们将选项设置为大于数据框的行数,则将显示所有行。例如,我们将其设置为 100 行。

pd.options.display.max_rows = 100

2.设置最大列数

pd.options.display.max_columns

当然,截断逻辑也适用于水平方向。最大列数的默认值是 20。

如果我们不对其进行更改,并且数据框的列数超过 20 列,我们将无法再次查看中间的列。

pd.DataFrame(np.random.randn(5, 21))

如果我们想查看所有的列,只需增加最大列数即可。

pd.options.display.max_columns = 50

3.设置单元格的最大宽度

pd.options.display.max_colwidth

不仅行数和列数,而且每个单元格的宽度也对其宽度有约束。默认情况下,熊猫只显示最大宽度为 50 的单元格中的内容。也就是说,超过 50 个字符的单元格将被截断。

pd.DataFrame({
    'col': [''.join(list("Towards Data Science.") * 3)]
})

在上面的代码中,我只是重复了字符串“走向数据科学”共 63 个字符。所以,尾巴被截断了。

如果我们将最大列宽设置为 80,那么所有的文本都会显示出来。

4.设置info()中显示的最大列数

pd.options.display.max_info_columns

相信我们大多数人都会用df.info()来快速检查数据框的轮廓。但是,有时它不会显示结果中的所有列。这是因为info()方法对要分析的最大列数有一个默认约束,即 100 列。

让我们创建一个超过 100 列的随机数据框,并使用info()方法得到它的轮廓。

df = pd.DataFrame(np.random.randn(5, 101))
df.info()

这是不期望的。我希望看到所有列的“Dtype”和“非空计数”。在这种情况下,最大信息列选项会有所帮助。

pd.options.display.max_info_columns = 150
df.info()

5.设置显示精度

pd.options.display.precision

您可能注意到了,也可能没有注意到,Pandas 实际上对数据框中显示的小数位数有一个内置的限制。让我们以之前演示中生成的数据帧df为例。

注意第一个单元格,它的浮点数是-0.939665。这是因为熊猫只会显示小数点后 6 位数字。如果我们从数据框中得到如下数字,我们可以看到它有更多的小数-0.9396645167554308。

df.iloc[0, 0]

别担心。这不会影响后面算法中要用到的实际数字,因为这只是为了显示。但是,如果我想看到更精确的数字呢?让我们将选项设置为 15。

pd.options.display.precision = 15

现在,它可以显示整个数字。

6.设置十进制格式

pd.options.display.float_format

有时,我们可能希望向其他人展示我们的工作,或者我们可能希望自己更好地查看数据框。这很重要,因为我相信洞察力来自简洁的演示。混乱的演示会浪费我们大脑中的资源。

例如,让我们考虑我们在上述示例中使用的数据框中的数字应该是百分比,我们只关注小数点后的 2 位数字。然后,我们可以使用此选项来设置显示格式,如下所示。

pd.options.display.float_format = '{:.2f}%'.format

如图所示,这种格式足够灵活,您可以根据自己的需要进行定制,比如用{$(:,.2f)}来显示货币。

摘要

Shutterbug75Pixabay 上拍摄的照片

在这篇文章中,我介绍了 6 种我们最好记住的熊猫展示方式。有 30 多个,但这几个是我发现最常用的。为了避免每次都在谷歌上浪费时间,强烈建议记住它们。

https://medium.com/@qiuyujx/membership

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)

6 个熊猫的错误,无声地告诉你是一个菜鸟

原文:https://towardsdatascience.com/6-pandas-mistakes-that-silently-tell-you-are-a-rookie-b566a252e60d?source=collection_archive---------1-----------------------

没有错误消息——这就是它们的微妙之处

照片由 迈克尔·马特隆 上的 Unsplash。 除特别注明外,所有图片均为作者所有。

介绍

我们都习惯了编码时频繁弹出的又大又胖的红色错误消息。幸运的是,人们通常不会看到它们,因为我们总是修复它们。但是没有错误的错误呢?这些是最危险的,如果被更有经验的人发现,会让我们非常尴尬。

这些错误与你正在使用的工具的 API 或语法无关,但与理论和你的经验水平直接相关。今天,我们在这里谈论熊猫初学者经常出现的 6 个错误,我们将学习如何解决它们。

https://ibexorigin.medium.com/membership

获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:

https://alphasignal.ai/?referrer=Bex

1.使用熊猫本身

有点讽刺的是,第一个错误与实际使用熊猫完成某些任务有关。具体来说,今天的现实世界的表格数据集是巨大的。把它们解读到你和熊猫在一起的环境中将是一个巨大的错误。

为什么?因为它太慢了!下面,我们加载了 100 万行、300 个特征的 TPS 月数据集,占用了 2.2GB 的磁盘空间。

大约花了 22 秒。现在,你可能会说 22 秒并不算多,但是想象一下。在一个项目中,你将在不同的阶段进行许多实验。您可能会为清理、功能工程、选择模型以及其他任务创建单独的脚本或笔记本。

多次等待数据加载 20 秒真的让你很紧张。此外,您的数据集可能会大得多。那么,什么是更快的解决方案呢?

解决方案是在这个阶段抛弃 Pandas,使用其他专门为快速 IO 设计的替代方案。我最喜欢的是datatable,但是你也可以选择DaskVaexcuDF等等。以下是使用datatable加载相同数据集所需的时间:

只要 2 秒钟!

2.没有矢量吗?

函数式编程中最疯狂的规则之一是永远不要使用循环(以及“无变量”规则)。看起来,在使用 Pandas 时坚持这种“无循环”规则是加速计算的最好方法。

函数式编程用递归代替了循环。幸运的是,我们不必对自己如此苛刻,因为我们可以使用矢量化!

矢量化是 Pandas 和 NumPy 的核心,它对整个数组而不是单个标量执行数学运算。最好的部分是 Pandas 已经有了一套广泛的矢量化功能,消除了重新发明轮子的需要。

Python 中的所有算术运算符(+、-、*、/、**)在用于 Pandas 系列或数据帧时都以矢量化的方式工作。此外,你在 Pandas 或 NumPy 中看到的任何其他数学函数都已经矢量化了。

为了查看速度的提高,我们将使用下面的big_function,它将三列作为输入,并执行一些无意义的运算:

首先,我们将在 Pandas 最快的迭代器apply上使用这个函数:

手术花了 20 秒。让我们以矢量化的方式使用核心 NumPy 数组来做同样的事情:

只用了 82 毫秒,大约快了 250 倍。

的确,你不能完全抛弃循环。毕竟,并不是所有的数据操作都是数学的。但是,每当你发现自己渴望使用一些循环函数,如applyapplymapitertuples,花一点时间看看你想做的事情是否可以矢量化。

3.数据类型,数据类型,类型!

不,这不是你在中学学到“改变熊猫列的默认数据类型”的课程。在这里,我们将深入探讨。具体来说,我们从内存使用的角度来讨论数据类型。

最差最耗内存的数据类型是object,这也恰好限制了熊猫的一些特性。接下来,我们有浮点数和整数。实际上,我不想列出所有的熊猫数据类型,所以你为什么不看看这个表:

http://pbpython.com/pandas_dtypes.html】来源:http://pbpython.com/pandas_dtypes.html

在数据类型名称之后,数字表示该数据类型中的每个数字将占用多少位内存。因此,我们的想法是将数据集中的每一列都转换为尽可能小的子类型。怎么知道选哪个?嗯,这是给你的另一张桌子:

来源:https://docs . scipy . org/doc/numpy-1 . 13 . 0/user/basics . types . html

通常,您希望根据上表将浮点数转换为float16/32,将包含正整数和负整数的列转换为int8/16/32。您还可以对布尔值和正整数使用uint8,以进一步减少内存消耗。

下面是一个方便但很长的函数,它根据上表将浮点数和整数转换成它们的最小子类型:

让我们将它用于 TPS 月份的数据,看看我们可以减少多少:

我们将数据集从原来的 2.2GB 压缩到 510 MBs。不幸的是,当我们将数据帧保存到文件时,这种内存消耗的减少会丢失。

为什么这又是一个错误?当使用大型机器学习模型处理这样的数据集时,RAM 消耗起着很大的作用。一旦你出现一些内存错误,你就开始追赶并学习像这样的技巧来让你的计算机保持快乐。

4.没有造型?

熊猫最奇妙的特征之一是它显示风格化数据帧的能力。原始数据帧呈现为 HTML 表格,在 Jupyter 中使用了一点 CSS。

对于那些有风格的人和那些想让他们的笔记本更加多彩和吸引人的人来说,Pandas 允许通过style属性来设计它的数据框。

上面,我们随机选择了 20 列,为它们创建了一个 5 个数字的摘要,转置结果,并根据它们的大小对均值、标准差和中值列进行着色。

诸如此类的变化使得在不求助于可视化库的情况下发现原始数字中的模式变得更加容易。你可以从这个链接中了解如何设计数据框架样式的全部细节。

实际上,不对数据帧进行样式化并没有什么错。然而,这似乎是一个非常好的特性,如果不使用它,就会错失良机。

5.保存到 CSV

就像读取 CSV 文件极其缓慢一样,将数据保存回 CSV 文件也是如此。以下是将 TPS 十月份数据保存到 CSV 所需的时间:

差不多用了 3 分钟。为了对其他人和你自己都公平,把你的数据帧保存成其他更轻更便宜的格式,比如羽毛或拼花。

如您所见,将数据帧保存为羽化格式所需的运行时间减少了 160 倍。此外,羽毛和拼花地板的储物空间也更少。我最喜欢的作家,达里奥·拉德契奇有一整个系列致力于 CSV 替代方案。你可以在这里查看

6.你应该读一下用户指南!

事实上,这个列表中最严重的错误是没有阅读用户指南或者熊猫的文档。

我明白。说到文档,我们都有这种奇怪的事情。我们宁愿花几个小时在网上搜索,也不愿阅读文件。

然而,对于熊猫来说,这完全不是真的。它有一个很好的用户指南,涵盖了从基础到贡献和让熊猫更棒的话题。

事实上,你可以从用户指南中了解到我今天提到的所有错误。甚至还真有关于读取大数据集的部分特意告诉你用其他包比如Dask读取海量文件,远离熊猫。如果我有时间从头到尾阅读用户指南,我可能会想出 50 多个初学者错误,但现在你知道该怎么做了,剩下的就交给你了。

摘要

今天,我们学习了初学者在使用熊猫时最常犯的六个错误。

我想让你注意到,在处理千兆字节大小的数据集时,这些错误中的大多数实际上都被算错了。如果你还在玩玩具数据集,你可能会忘记它们,因为解决方案不会有太大的不同。

然而,随着您提高技能并开始处理真实世界的数据集,这些概念最终将是有益的。

****

在你离开之前,我的读者喜欢这些——你为什么不给他们一张支票呢?

** </25-numpy-functions-you-never-knew-existed-p-guarantee-0-85-64616ba92fa8> </7-cool-python-packages-kagglers-are-using-without-telling-you-e83298781cf4> **

6 个你可能不知道但应该知道的熊猫把戏

原文:https://towardsdatascience.com/6-pandas-tricks-that-you-might-not-know-but-should-6f766dfdb2c2?source=collection_archive---------21-----------------------

对您的日常任务有帮助

照片由 弗拉达·卡尔波维奇 拍摄自 佩克斯

如果你愿意学习数据科学,Pandas 是你需要学习的最重要的库之一。

Pandas 是数据组织清理和操作的行业标准库,全球几乎所有的数据科学家都在使用它。虽然使用起来非常强大,但还是有一些技巧可以让你的工作流程更有效率。

在本文中,我们将讨论 6 个这样的技巧,无论你是初学者还是有经验的程序员,它们都会对你有益。

1.调整数据帧的行和列

很多时候,当我们检查一些未处理的数据集时,我们会遇到一些问题,如行数或列数过多,单元大小不规则,以及具有大量数字的浮点数等。

我们可以很容易地解决这些问题,通过指定我们可以看到的最大行数/列数的某个值,浮点数的精度等…

导入 Pandas 库后,您可以编写下面几行代码来进行设置。

**pd.options.display.max_columns = 50**  
# to see max 50 columns**pd.options.display.max_rows = 200**    
# max 200 rows at a time**pd.options.display.max_colwidth = 100** #max column width is set to 100**pd.options.display.precision = 3**     
#floating point precision upto 3 decimal

2.选择特定的列/行

假设您想要从包含许多行和列的大型数据集中获得一些特定的行和列。在熊猫身上使用df.ilocdf.loc可以很容易做到这一点。df.iloc根据您的需要帮助您选择特定范围的行和列,df.loc可以根据特定条件执行布尔选择。

看看下面几行代码。

**>> df.iloc[4:7,2:5]**                                
# select the 4th to 6th row & 2nd to the 4th column**>> df.loc[:,'column_x':] **                          
# select all columns starting from 'column_x'**>> df.loc[df[‘value’] < 100, [‘name’, ‘location’]]** 
#selects the columns 'name' & 'location' having value < 100

3.数据集中所有行和列的总和

假设您想要获得特定数据集中所有列的所有行的总和。在 lambda 函数的帮助下,你可以很容易地在 Pandas 中使用df.apply()方法。

**df = pd.DataFrame(dict(A=[1,2,3], B=[4,5,6], C=[7,8,9]))****df['column total'] = df.apply(lambda x: x.sum(), axis=1)****df.loc['row total'] = df.apply(lambda x: x.sum())****df.head()**

输出将是这样的:

4.用条件屏蔽数据帧

假设您想要屏蔽不满足特定要求的数据集的行和列。你可以在熊猫身上很容易地做到这一点,只要设定一个条件:

con = df['A'] < 2 #elements of A having value less than 2

然后使用以下方法将该条件应用于数据集:

df = pd.DataFrame(dict(A=[1,2,3], B=[4,5,6], C=[7,8,9]))con = df['A'] < 2 #elements of A having value less than 2df2 = df[con]df2.head()

输出

屏蔽前与屏蔽后

5.“分解”一个数据帧

如果您的 Pandas 数据帧包含某个列,该列包含一个列表或字典作为值,如下所示:

df = pd.DataFrame(dict(A=[1,2,3], B=[4,5,6], C=[[7,8],9,10]))df.head()

为了展平列表,我们可以使用df.explode()方法,该方法将列名作为参数,并将数据集更改为:

df.explode('C')

6.将一列的所有值设置为特定的数据类型

在处理未处理的数据时,您可能会遇到这样的情况:一个列中包含多种数据类型。

使用df.infer_objects(),我们可以很容易地将所有元素的数据类型更改为单一类型。infer_objects函数将一个特定列的所有数据类型设置为一个特定的数据类型,并进行合理的猜测:

**df = pd.DataFrame({"A": ["a", 1, 2, 3]})****df = df.iloc[1:]****print(df.head())****df.dtypes**

在这里,通常列的大多数元素的数据类型是 int,但是由于字符“a”的存在,输出将它显示为 object 数据类型。

应用 df.infer_objects()后,我们得到:

当前数据帧的数据类型为 int

结论

这些是熊猫的一些小技巧,可以在处理大型和未处理的数据集时节省您大量的时间。

还有更多这样的功能和方法,可以节省你很多时间,当工作与熊猫。如果您使用该库并查看文档,您将会了解它们。

在我即将发表的文章中,请继续关注更多基于 Python 的技巧和诀窍。

每个初学数据的科学家都应该掌握的 6 个预测模型

原文:https://towardsdatascience.com/6-predictive-models-models-every-beginner-data-scientist-should-master-7a37ec8da76d?source=collection_archive---------2-----------------------

数据科学模型有不同的风格和技术——幸运的是,大多数高级模型都基于几个基本原理。当你想开始数据科学家的职业生涯时,你应该学习哪些模型?这篇文章给你带来了 6 个在行业中广泛使用的模型,或者以独立的形式,或者作为其他先进技术的构建模块。

照片由@ barn images—unsplash.com 拍摄

当你陷入机器学习和人工智能的炒作漩涡时,似乎只有先进的技术才能解决你想要建立预测模型的所有问题。但是,当你接触到代码时,你会发现事实是非常非常不同的。作为一名数据科学家,您将面临的许多问题都可以通过几种模型的组合来解决,其中大多数模型已经存在了很长时间。

而且,即使你使用更高级的模型来解决问题,学习基础知识也会让你在大多数讨论中领先一步。特别是,了解更简单模型的优点和缺点将有助于您成功指导数据科学项目。事实是:高级模型能够做两件事——放大或修正它们所基于的简单模型的一些缺陷。

话虽如此,让我们跳进 DS 的世界,了解当你想成为一名数据科学家时应该学习和掌握的 6 个模型

线性回归

最古老的模型之一(例如,弗朗西斯·高尔顿在 19 世纪使用术语“回归”)仍然是使用数据表示线性关系的最有效的模型之一。

研究线性回归是世界各地计量经济学课堂上的一个主要内容,学习这个线性模型会让你对解决回归问题(用 ML 解决的最常见问题之一)有一个很好的直觉,还会让你明白如何使用数学建立一条简单的线来预测现象。

学习线性回归还有其他好处——特别是当您学习了可获得最佳性能的两种方法时:

  • 封闭解,一个近乎神奇的公式,用一个简单的代数方程给出变量的权重。
  • 梯度下降,一种向最佳权重发展的优化方法,用于优化其他类型的算法。

此外,我们可以在实践中使用一个简单的二维图来可视化线性回归,这一事实使该模型成为理解算法的一个良好开端。

了解它的一些资源:

逻辑回归

虽然名为回归,逻辑回归是开始掌握分类问题的最佳模型。

学习逻辑回归有几个好处,即:

  • 初步了解分类和多分类问题(ML 任务的很大一部分)。
  • 理解函数变换,如 Sigmoid 函数所做的变换。
  • 理解梯度下降的其他函数的用法,以及优化函数是如何不可知的。
  • 对数损失函数初探。

学习逻辑回归后,你应该期望知道什么?你将能够理解分类问题背后的机制,以及如何使用机器学习来区分类别。属于这一类的一些问题:

  • 了解交易是否是欺诈性的。
  • 了解客户是否会流失。
  • 根据违约概率对贷款进行分类。

就像线性回归一样,逻辑也是一种线性算法——在研究了这两种算法之后,您将了解线性算法背后的主要限制,以及它们为何无法表示许多现实世界的复杂性。

了解它的一些资源:

决策树

首先要研究的非线性算法应该是决策树。决策树是一个基于 if-else 规则的简单易懂的算法,它将让你很好地理解非线性算法及其优缺点。

决策树是所有基于树的模型的构建块——通过学习它们,您还将准备好学习其他技术,如 XGBoost 或 LightGBM(下面将详细介绍)。

最酷的部分是决策树适用于回归和分类问题,两者之间的差异最小-选择影响结果的最佳变量背后的基本原理大致相同,您只需切换标准即可-在这种情况下,是误差度量。

尽管你有回归的超参数概念(如正则化参数),但在决策树中它们是极其重要的,能够在好的和绝对垃圾的模型之间画出一条线。超参数在您的 ML 之旅中将是必不可少的,决策树是测试它们的绝佳机会。

关于决策树的一些资源:

随机森林

由于它们对超参数的敏感性和相当简单的假设,决策树的结果相当有限。当你研究他们的时候,你会明白他们真的倾向于过度拟合,创造出不适合未来的模型。

随机森林的概念真的很简单——如果决策树是独裁,那么随机森林就是民主。它们有助于在不同的决策树之间实现多样化,这有助于为您的算法带来鲁棒性——就像决策树一样,您可以配置大量的超参数来增强这种 Bagging 模型的性能。什么是装袋?ML 中为不同模型带来稳定性的一个非常重要的概念——您只需使用平均值或投票机制将不同模型的结果转换为单一方法。

在实践中,随机森林训练固定数量的决策树,并(通常)对所有这些先前模型的结果进行平均——就像决策树一样,我们有分类和回归随机森林。如果你听说过群体智慧的概念,bagging models 将这个概念应用到 ML models 培训中。

了解随机森林算法的一些资源:

XGBoost/LightGBM

其他给他们带来稳定性的基于决策树的算法是 XGBoost 或 LightGBM。这些模型是助推算法,它们处理以前弱学习者犯下的错误,以找到更鲁棒和更好地概括的模式。

这种关于机器学习模型的思想在 Michael Kearns 关于弱学习者和假设检验的论文之后获得了关注,它展示了增强模型可能是模型遭受的整体偏差/方差权衡的一个极好的解决方案。此外,这些模型是应用于 Kaggle 竞赛的一些最受欢迎的选择。

XGBoost 和 LightGBM 是 Boosting 算法的两个著名实现。了解它们的一些资源:

人工神经网络

最后,当前预测模型的圣杯——人工神经网络(ann)。

人工神经网络是目前发现数据中非线性模式并在自变量和因变量之间建立真正复杂关系的最佳模型之一。通过学习它们,你将接触到激活函数、反向传播和神经网络层的概念——这些概念将为你研究深度学习模型提供良好的基础。

此外,就其架构而言,神经网络有许多不同的风格——研究最基本的风格将为跳转到其他类型的模型奠定基础,如递归神经网络(主要用于自然语言处理)和卷积神经网络(主要用于计算机视觉)。

了解它们的一些额外资源:

而且,就是这样!这些模型应该会让你在数据科学和机器学习方面有一个良好的开端。通过学习它们,你将为学习更高级的模型做好准备,并轻松掌握这些模型背后的数学。

好的一面是,更高级的东西通常基于我在这里介绍的 6 个模型,所以了解它们的底层数学和机制永远不会有坏处,即使是在你需要带“大枪”的项目中。

你觉得少了点什么吗?写在下面的评论里,我很想听听你的意见。

我在一个 Udemy 课程 里开设了一门学习这些模型的课程——这门课程适合初学者,我希望你能在我身边。

https://ivopbernardo.medium.com/membership

非 IT 教育背景的 6 个编程学习技巧

原文:https://towardsdatascience.com/6-programming-study-tips-for-non-it-education-background-50bbbfbb9a3a?source=collection_archive---------14-----------------------

所有初学者开始学习编程的学习技巧

J. Kelly Brito 在 Unsplash 上的照片

如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。

每当我和我的大学老同学或大三学生交谈时,他们经常问我一个问题“我如何开始学习编程语言?”。这是一个简单的问题,但对于从未接触过编程语言的人来说,这是一个重要的问题。非 IT 人员有能力学习编程语言吗?当然可以

无论你的教育背景如何,学习编程都是可能的。此外,在当今时代,你使用编程语言的可能性会比以前更高。如果你已经对编程语言感兴趣,那么为了你未来的职业生涯,现在是开始学习它们的最佳时机。

我,一个没有受过 IT 教育的人,可以学习编程——其他人也一样。在这篇文章中,我想分享我学习编程语言并设法掌握它的成功秘诀。让我们开始吧!

1.确定你为什么要学习编程

我可以给任何想学习编程语言的人的第一个建议是决定他们为什么想学习编程语言。是为了事业,为了知识,还是你想跟着炒作

在我的职业生涯中,我看到许多朋友和学生在没有任何有力理由的情况下尝试学习编程语言。他们想学习编程,因为人工智能是未来,或者许多工作需要编程语言,但不知道他们想从学习中获得什么,甚至不知道工作描述。

它们会发生什么?在第一周,他们中的许多人都在集中精力学习他们能学到的一切——比如,一切。他们想尽快了解申请工作的一切,但动机基础是如此脆弱。在第一周之后,许多人离开了他们所做的学习,因为他们觉得这太难了,对他们没有任何帮助,或者只是感到失落。

对于我们这些在受教育期间或工作中没有被强迫学习编程语言的人来说,为学习编程语言打下坚实的基础是很重要的。我们很容易在心理上摒弃新事物,因为我们喜欢坚持我们的旧习惯。在 T2 的一项研究中,大约 20 个被迫寻找新路线的人中有 19 个最终会回到原来的路线,即使新路线更快。

就像上面的研究一样,在学习一门编程语言的第一个月,我感觉我想要放弃。让我坚持下去的是我建立的动力基础 —这是为了我未来在数据科学领域的职业生涯,这一投资是值得的。我知道编程语言在现代数据科学世界中是必不可少的,我也知道数据科学职业是我想要的。

简而言之,努力为自己为什么要学习编程语言打好坚实的基础。这是让你坚持下去的动力。

2.决定学习哪种编程语言

开始学习数据科学的编程语言,总是有一个争论,是从 Python 开始,还是从 R 开始。在我看来,你想从哪个编程开始并不重要,重要的是你需要从市场需求开始——尤其是在你想要的行业。

调查工作职位、行业和你想要的技能。对于大多数没有受过 IT 教育的人来说,你可能已经知道你想要什么行业,或者至少习惯了但没有经历过这个职位。当你研究这个行业时,大多数时候,他们会要求不同的技能。

在我研究学习哪种编程语言的时间里,我研究的是生物行业(这是我的专业),在那里我发现很多研究数据科学的职位可能需要你了解 r,另一方面,在那里我研究另一个行业(金融、科技等。),他们通常要求您了解 Python。

我的建议是,你可以根据自己的偏好来决定想学哪种编程语言,因为它会让你感觉很熟悉,或者符合你的需求。不要试图一开始就学习所有的编程语言,因为你最终会失败。

3。始终从基础开始

显然,我们应该从基础开始,但不知何故,许多人从高级开始。虽然我知道启动数据科学项目的兴奋程度很高,但如果不了解基础知识,就什么也做不了。

我的许多朋友和学生都没有接受过任何 IT 教育,通过使用中级到高级材料开始学习。他们不可能从一开始就理解其中的任何内容,尤其是在我们没有接受过使用所有这些工具的培训的情况下。发生的情况是,他们觉得事情太难,放弃学习任何编程语言。

当你跳入高级的东西时,你的心理还没有准备好,并开始阻碍你成功学习任何编程的可能性。有一段时间,当我刚刚开始学习时,我正在使用高级材料进行学习,我几乎觉得编程不适合我——直到我意识到我应该从基础开始。然后事情感觉对了;在完成基础材料并对自己的编程技能建立信心后,我可以进步得更快。

我的建议是从基础开始,不要被高级材料吓到,因为你会从基础开始提高你的技能。

4。使用学习大纲或指南

这也是人们应该做的一件显而易见的事情,但令人惊讶的是许多人没有使用任何大纲来帮助他们学习编程语言。如果你甚至不知道从哪里开始和学什么,难度就会很高。

我记得当我开始学习 Python 时,我使用一个在线学习平台作为我的开始指南。考虑到我是编程语言的初学者,需要一张地图来开始学习,这是有益的。所有初学者都应该这样做,并尝试在网上找到指南,看看提供了什么编程语言,并遵循大纲。

当然,有这么多的指南来开始你的学习之旅,每个人在选择指南时都有不同的倾向。对于 Python 指南,你可以在这里查看完整的初学者知识库指南。

5.不要仓促行事

学习重要的是理解概念,并在各种条件下应用。也许你已经嫉妒所有从事数据科学家工作的人,或者已经赢得这么多 Kaggle 比赛的人——但你不应该;每个人都有自己的旅程和步伐。

学习一门编程语言类似于学习一门新的语言,但是需要时间将它应用到各种数据科学案例场景中。如果你觉得学习任何编程语言都太慢了,那是正常的——这是你的节奏,不要着急。

所谓匆忙,我指的是当你还没有理解你的基础知识并想开始探索数据的时候,或者当你打算申请工作职位并明显没有掌握编程技能的时候。这可能会在精神上伤害你,因为你觉得你已经准备好了,但却以失败告终。学习需要时间,尤其是对那些来自非 IT 行业的人来说;编程语言需要时间。

根据我自己的经验,我的 Python 学习之旅需要大约一年的时间。是的,我花了一年的时间来理解基本原理,并开始将它们应用到任何数据科学项目中。我知道很多人理解编程语言的速度比我快,这很好——他们有能力做到这一点。不要觉得被冷落了,或者你需要更快地赶上来;在你的时间里学习,并确保你想要的目标。

我的话是——花时间学习编程语言,按照你自己的速度理解概念。

6。找导师

对于一些人来说,你可能能够进行任何自学并成功理解编程语言,但对其他人来说却不是这样。我属于后者,我需要一位导师来帮助我理解这个概念。

为什么受过 IT 教育的人能够学习编程语言?这是因为他们在受教育期间接受了指导。那么,你为什么不应该遵循这个方法呢?在你的学习过程中,有一个导师非常有帮助,因为他们可以帮助指导你,指出你的任何错误。我自己是一名导师,已经知道我的学生在学习过程中的痛点在哪里。因为导师了解学员的挣扎,他们可以帮助你更快更有效地学习。

找到一个导师是一个资源的问题,因为不是每个导师都有空闲时间来教你或免费提供。让一个导师来教你可能很昂贵,但这是值得的。如果没有导师,我将无法达到现在的能力,可能需要更长时间才能获得数据科学家的职位。

结论

学习编程不是一件容易的事,尤其是对于一个没有受过 IT 教育的人来说。在这篇文章里,我想和大家分享一下我的编程学习小技巧。它们是:

  1. 确定你为什么想学习编程语言
  2. 决定学习哪种编程语言
  3. 总是从基础开始
  4. 使用学习大纲或指南
  5. 不要仓促行事
  6. 找一个导师

希望有帮助!

访问我的LinkedInTwitter

如果您没有订阅为中等会员,请考虑通过我的介绍订阅。

你应该知道的 6 种 Python 容器数据类型

原文:https://towardsdatascience.com/6-python-container-data-types-you-should-know-81dad6c4f61d?source=collection_archive---------2-----------------------

照片由 Julius_SilverPixabay 上拍摄

在 Python 中钉钉高级数据结构工具

我相信你一定知道 Python 中基本的集合数据类型,比如列表、元组、字典。网上已经有太多关于这些数据结构的资源了。但是,大家有没有注意到,Python 内置的collection模块中有 6 个“高级”数据结构工具?

  • 命名元组
  • 有序字典
  • 链式地图
  • 计数器
  • 双端队列

不要被他们的名字吓到。我保证这些是你已经熟悉的东西,但是为你提供一些开箱即用的极其方便的特性。

让我们浏览一下这些容器数据类型,看看它们是什么以及它们能做什么。为了方便起见,所有的演示代码都假设所有的集合类型都是导入的。

from collections import *

1.命名元组

照片由 Pixabay 上的 StockSnap 拍摄

元组是 Python 中一种重要的序列数据类型。只要你用过 Python,你应该已经知道了。然而,什么是“命名元组”?

假设我们正在开发一个需要使用坐标(纬度和经度)的应用程序,这是两个十进制数字,用来表示我们通常在谷歌地图上看到的地球上的一个地方。它自然可以用一个元组来表示,如下所示。

c1 = (-37.814288, 144.963122)

然而,如果我们处理全世界的坐标,有时可能不容易识别哪个数字是纬度或经度。这可能导致代码可读性的额外困难。

不仅仅是值,命名元组为元组中的每个位置分配有意义的名称,并允许更具可读性的自文档化代码。它们可以在任何使用正则元组的地方使用,并且它们增加了通过名称而不是位置索引来访问字段的能力。

在使用命名元组之前,我们可以将其定义如下。

Coordinate = namedtuple('Coordinate', ['latitude', 'longitude'])

然后,我们现在可以使用已定义的命名元组来定义坐标。

c1 = Coordinate(-37.814288, 144.963122)

这不仅是为了可读性,也是为了使用方便,比如通过名称访问值。

print(f'The latitude is {c1.latitude} and the longitude is {c1.longitude}')

如果我们想得到字段名,我们可以简单地调用它的_fields()函数。

c1._fields()

你可能会开始认为这与类和字典有些重叠。然而,如果不需要任何类方法,这比定义一个类要简单和整洁得多。此外,如果需要,您可以随时轻松地将命名元组转换为字典。

c1._asdict()

打住,什么是OrderedDict?这的确是一本字典,但有一点不同。请参考下一节。

2.有序字典

照片由 Katzenfee50Pixabay 上拍摄

有序字典是字典的子类,它继承了字典的所有内容。唯一的区别是有序字典中的条目是“顺序敏感的”。

我们已经从上一节中得到了一本有序词典。我们继续以此为例。

od = c1._asdict()

因为它继承了普通字典的一切,我们可以期望它拥有普通字典应该拥有的所有特性,比如通过键访问值。

print(f"The latitude is {od['latitude']} and the longitude is {od['longitude']}")

然而,因为它是顺序敏感的,所以它有一些普通字典所没有的特性。例如,我们可以通过调用move_to_end()函数来改变项目的顺序。

od.move_to_end('latitude')

所以,纬度被移到了有序字典的末尾。

此外,我们可以从有序字典中弹出最后一项。

lat = od.popitem()

有序的字典在某些情况下非常有用。例如,我们可以用它来记忆最后插入的钥匙的顺序。

3.链式地图

照片由 MoreLightPixabay 上拍摄

接下来,我们来看看连锁图。当我们想要将多个字典组合在一起作为一个整体时,链式映射是非常有用的,但是不需要物理地组合它们,这可能会消耗更多的资源,并且当存在重复的键时必须解决键冲突。

假设我们正在开发一个依赖于某些配置的应用程序。我们在应用程序中定义系统默认配置,同时允许用户通过一些特定的设置来覆盖默认设置。就把例子编出来如下。

usr_config = {'name': 'Chris', 'language': 'Python'}
sys_config = {'name': 'admin', 'language': 'Shell Script', 'editor': 'vm'}

你会怎么做?写一个 for 循环,根据usr_config更新sys_config?如果有数百个项目,或者有多个层而不是只有两个层,该怎么办?我们通常有多层配置,比如用户级>应用级>系统级等等。

使用链图可以即时解决这个问题。

cm = ChainMap(usr_config, sys_config)

从输出来看,链图只是简单地将字典放在一起。事实上,这背后有某种魔力。如果我们尝试将它转换成一个列表,我们可以看到只有 3 个键。事实上,5 个键中有 3 个是唯一的。

如果我们尝试访问“name”键的值会怎么样?

让我们也试试“编辑”键。

好的。神奇的是,usr_config总是覆盖sys_config中的设置。但是,如果我们正在访问的密钥没有在usr_config中定义,将使用sys_config中的密钥。这正是我们想要的。

如果我们想更新链图中的键“编辑器”怎么办?

可以看出,usr_config实际上是更新的。这是有意义的,因为它将覆盖sys_config中的相同项目。当然,如果我们删除“editor”键,它将从usr_config中删除,并将再次使用sys_config中的默认键。

del cm['editor']
cm['editor']

看,在 Python 中正确使用容器类型可以节省我们大量的时间!

4.计数器

照片由 Pixabay 上的像素拍摄

下一个是“计数器”。这听起来不像是容器类型,但就其表现形式而言,有点类似于字典。但是,它更像是一个“算题”的工具。

假设我们有一个包含许多条目的列表。有些项目是相同的,我们想计算每个项目重复的次数。列表如下。

my_list = ['a', 'b', 'c', 'a', 'c', 'a', 'a', 'a', 'c', 'b', 'c', 'c', 'b', 'b', 'c']

然后,我们可以使用计数器非常容易地执行这个任务。

counter = Counter()for letter in my_list:
    counter[letter] += 1

它告诉我们列表中有 5 个 a,4 个 b 和 6 个 c。

计数器还提供了许多相关的便利功能。比如我们可以得到“n”个最常见的。

counter.most_common(2)

我们仍然可以将所有的元素放回到一个列表中。

list(counter.elements())

此外,我们可以动态定义计数器。

another_counter = Counter(a=1, b=4, c=3)

当我们有两个计数器时,我们甚至可以在它们之间执行操作。

counter - another_counter

最后,如果我们想知道总数,我们总是可以将它们相加。

sum(counter.values())

不要小看 Python 里这么一个小工具。在某些情况下,它可以在很大程度上简化问题。如果你对这个工具的配方感兴趣,请关注我的更新。

5.双端队列

DaKubPixabay 上拍摄的照片

如果你有计算机科学背景,你一定知道队列、栈等很多常见的数据结构。他们的区别是 FIFO(先进先出)和 LIFO(后进先出)。

还有一种数据结构操作叫做 deque,是双端队列的缩写。它是用 Python 实现的,可以开箱即用。

让我们先定义一个 deque。

dq = deque('bcd')

因为它是一个“双端”队列,我们可以从左侧或右侧追加。

dq.append('e')
dq.appendleft('a')

我们还可以使用extend()extendleft()函数一次追加多个元素。请注意,当我们把顺序追加到左边时,你就会明白为什么“210”变成了“012”。只是认为我们是在左侧一个接一个地添加它们。

dq.extend('fgh')
dq.extendleft('210')

还有一些非常有用的操作,特别是在 deque 结构中,比如旋转。它将元素从右端旋转到左端,或者相反。请注意,rotate()函数的参数可以是任何整数。

dq.rotate()
dq.rotate(-1)

当然,我们可以让元素从队列的任意一端“出来”。

dq.pop()
dq.popleft()

6.默认字典

照片由像素像素仓拍摄

最后,默认字典从名字上看有点难懂。然而,这并不妨碍它成为一种有用的工具。当然是在你真正了解之后:)

默认字典是字典的子类。默认不是指默认值,而是“默认出厂”。默认工厂指示将构造字典的默认数据类型。最重要的一个,默认字典用于基于一些公共键收集对象(默认数据类型)。

不要迷惑。让我给你看一个例子。假设我们有一个如下的名字列表。

my_list = ['Alice', 'Bob', 'Chris', 'Bill', 'Ashley', 'Anna']

我们要做的是将具有相同开头字母的名字收集在一个列表中。比如['Alice', 'Ashley', 'Anna']应该是列表中的一个,因为它们都是以“A”开头的。

在这种情况下,我们希望值为“list”。所以,默认工厂将是“列表”。

dd = defaultdict(list)for name in my_list:
    dd[name[0]].append(name)dd.items()

我们已经使用默认的字典很容易地分开了名字!然后,当然,我们可以使用它作为一个普通的字典来获取值。

print(f'''
Names start with "A":
{dd["A"]}Names start with "B":
{dd["B"]}Names start with "C":
{dd["C"]}
''')

默认字典非常灵活,因为默认工厂可以是任何数据类型。例如,我们可以将默认工厂定义为 integer,并使用它来计算每个起始字母的名称数量。

dd = defaultdict(int)for name in my_list:
    dd[name[0]] += 1dd.items()

我们重新发明了计数器的轮子。放轻松,这只是个例子:)

摘要

免费拍摄的照片Pixabay

在本文中,我介绍了 Python 的collection模块中的 6 种容器类型。命名元组帮助我们编写更可读的代码,有序字典帮助我们定义对项目顺序敏感的字典,链图帮助我们定义多层字典,计数器帮助我们轻松计算所有内容,deque 定义双端队列,最后,默认字典帮助我们基于一些公共键收集对象。

https://medium.com/@qiuyujx/membership

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和其他成千上万的作者!(点击上面的链接)

你可以在一个周末完成 6 个 Python 项目

原文:https://towardsdatascience.com/6-python-projects-you-can-finish-in-a-weekend-f53552279cc?source=collection_archive---------1-----------------------

初级和高级项目将帮助你提高你的 Python 代码

丹尼尔·伊德里在 Unsplash 上的照片

学习 Python 可能很难。你可能会花很多时间看视频和看书;但是,如果你不能把学到的概念全部付诸实践,那时间就浪费了。

这就是为什么您应该尝试 Python 项目的原因。一个项目将帮助你把你所学到的一切集中起来,保持动力,建立一个文件夹,并想出用代码处理和解决问题的方法。

在本文中,我列出了一些帮助我提高 Python 代码水平的项目,希望对您也有帮助。项目按难度排列,所以初学者项目在开头,高级项目在文章末尾。

石头,布,剪刀

石头剪子布是一个经典游戏,我相信你一定很熟悉。这是一种简单的手游,通常在两个人之间进行,每个玩家同时用手形成三种形状中的一种。通过这个初学者项目,我们将学习如何实现基本的 Python 东西,如列表、if 语句和输入。

目标是创建一个系统,使得一个决定玩石头的玩家将击败另一个选择剪刀的玩家,但将输给一个玩纸的玩家,并且纸的游戏将输给剪刀的游戏。如果你对这个项目感兴趣,请查看这个指南,它包含了这个项目的全部 Python 代码。

照片由 OpenClipart-VectorsPixabay 上拍摄

这是你能用 Python 编写的最简单的游戏。完成这个项目后,你可以用 Pygame 库开发更复杂的带有计算机图形和声音库的游戏。下面列出了一些你可以用 Pygame 创建的游戏。

  • 井字游戏
  • 绞刑吏
  • 猜测数字
  • 答问比赛

文件重命名工具

照片由Clker-Free-Vector-ImagesPixabay 上拍摄

大多数作业要求您按日期对文件夹进行排序,或者使用预定义的语法管理文件名。您可以手动执行此操作;然而,使用一些 Python 代码可以节省大量时间。

这个项目的目标是重命名存储在计算机上的数百个文件,这样就很容易识别每个文件。例如,您可以将文件的创建日期以“MM-DD-YY”的格式添加到文件名中,这样任何人都可以轻松找到文件。

为了在 Python 中实现这一点,我们必须使用 Python 自带的操作系统模块。这提供了与操作系统交互的功能,因此允许您使用 Python 代码控制许多功能。本教程将帮助你开始操作系统模块。另一个对这个项目有用的库是一个名为 re 的内置包。这个包允许你使用正则表达式,如果你想在你的文件名中提取和重用一些文本模式,你可能会用到它。

您可以使用操作系统库执行的其他操作系统任务包括:

  • 创建多个文件夹并重命名它们
  • 删除目录
  • 识别当前工作目录

您可以在下面的指南中了解如何完成这项任务和其他任务。

</7-common-file-system-operations-you-can-do-with-python-e4670c0d92f2>

电子表格自动化

像更新 Excel 报表这样的重复性任务花费了我们大量的时间。幸运的是,Python 的库 openpyxl 将帮助我们自动化我们必须在 Excel 中完成的大多数任务。

这个项目的想法是使用 Python 代码来执行 Excel 任务,如制作数据透视表,绘制图表,应用 Excel 公式,以及格式化报告表。一旦我们完成了代码的编写,我们只需要运行脚本来创建如下所示的报告。

作者图片

您甚至可以创建一个 Python 函数,将您的 Python 脚本转换成一个可执行文件(。exe)安排 Python 脚本每月、每周或每天创建报告。

关于如何自动化您的 Excel 报告的指南可以在下面的链接中找到。

Python 可以帮助你自动化更多的任务!如果您想了解更多关于自动化的项目想法,请查看下面的文章。

https://medium.com/geekculture/4-web-scraping-projects-that-will-help-automate-your-life-6c6d43aefeb5

创建图形用户界面(GUI)

geraltPixabay 上拍摄的照片

写 Python 代码很酷,但你知道什么更酷吗?能够通过图形用户界面与您的代码进行交互,因此任何人都可以测试您所开发的内容。

Python 的库 Tkinter、PyQt 和基维将帮助你创建一个带有按钮、窗口和许多其他小部件的 GUI,使用户更容易与你的应用程序交互。如果你以前从未创建过 GUI,你可以查看这个免费的 Tkinter 课程

这个项目的想法很简单——为你已经完成的任何项目创建一个 GUI。您还可以为本文中列出的项目创建一个 GUI,或者从下面的列表中获得一些灵感。

  • 年龄计算器应用程序:这个应用程序允许用户输入他们的出生日期,应用程序会自动显示他们的年龄。
  • 计算器:如果您曾经在学习 Python 时开发过计算器,现在是时候用 GUI 增强输出了。从操作系统自带的计算器中获得一些灵感。
  • 货币转换器:构建一个货币转换器应用程序,允许用户以一种货币输入所需的值,并以目标货币返回转换后的值。

建立一个简单的投资组合网站

Unsplash 上的 Le Buzz 拍摄

如果你曾经梦想创建一个网站,我有一个好消息,你可以用 Python 来做!Python 中两个最流行的 web 开发框架是 Django 和 Flask。

Django 是一个鼓励快速开发和干净设计的高级 Python web 框架。它速度快、可扩展,并且非常重视安全性,这就是为什么 Instagram、Pinterest 和华盛顿邮报等网站都是用 Django 构建的。另一方面,Flask 是一个轻量级框架,提供了 web 应用程序的基本功能。它需要更少的编码,所以它是学习 web 开发基础的一个极好的框架。

Django 为初学者设计的一个很酷的项目是建立一个基本的作品集简历网站来展示你的作品。你的第一个网站不会像那些设计好看的现代网站一样;但是,在这个项目中,您将学习一些基础知识,如渲染模板、添加 CSS、JavaScript 和图像的静态文件。查看这个 YouTube 教程来更好地了解这个项目。

如果你想更深入地研究 Flask 或 Django,请查看这个频道另一个频道,那里有这两个框架的完整教程系列。

电影推荐系统

照片由 Unsplash 上的 Thibault Penin 拍摄

你有没有想过网飞、Hulu 或亚马逊等流媒体服务是如何推荐新电影的?这只是一个由工程师建立的推荐系统,根据用户的不同信息找到最佳电影。

推荐系统是一种旨在预测用户对特定项目的偏好的程序。在这种情况下,推荐系统在给定一些数据的情况下预测用户想要观看的电影。在 Python 中,我们可以使用 Pandas、Numpy 和 Scikit-learn 等库来开发一个从基本模型到基于内容和协同过滤推荐系统的推荐引擎。

要执行这个项目,您需要一个包含电影标题和至少一个情节描述的数据集。您可以将这个 IMDb 数据集或这个 MovieLens 数据集用于这个项目。此外,在这个链接中,有一个关于如何用 Python 制作电影推荐系统的完整指南。

就是这样!你可以在下面的链接中找到我完成的其他 Python 项目的完整代码。

https://medium.com/swlh/web-scraping-basics-scraping-a-betting-site-in-10-minutes-8e0529509848 https://medium.datadriveninvestor.com/can-we-beat-the-bookies-predicting-football-games-with-a-simple-model-43fe020fb384

https://frankandrade.ck.page/bd063ff2d3

2021 年 6 个 Python 数据科学面试问题

原文:https://towardsdatascience.com/6-python-questions-you-should-practice-before-coding-interviews-f958af55ad13?source=collection_archive---------7-----------------------

破解数据科学面试

数据科学家/工程师的数据操作和字符串提取

Gabriel Sollmann 在 Unsplash 上的照片

如前一篇帖子所述(链接),数据科学/工程面试有四个编码组成:数据结构&算法、机器学习算法、数学与统计、数据操作(查看此精彩文章作者艾玛丁 @Airbnb)。之前的帖子是关于数学和统计的。万一你没有机会,这里是入口:

</5-python-coding-questions-asked-at-faang-59e6cf5ba2a0>

在这篇文章中,我将重点关注数据操作,并回顾我对主要科技公司,尤其是 FAANG 提出的 6 个真实问题的思考。

我的Github上有完整的 Python 代码。

TL;速度三角形定位法(dead reckoning)

  • 本质上,这种类型的面试问题,数据操纵,期望考生对逻辑有高层次的理解。
  • 它归结为 Python 或另一种语言的基础编程。
  • 想出一个解决方案,然后尝试找到一个更高效的算法。

问题 1:亚马逊取消 IP 地址

-给定一个有效的(IPv4) IP 地址,返回该 IP 地址的默认版本。
-一个被取消的 IP 地址替换每个句号。“带“[。]".
-https://leetcode.com/problems/defanging-an-ip-address/

走过我的思考

这是一个热身问题。它要求我们更换。带“[。]"表示一个字符串。如果你熟悉 Python 中的 string,首先想到的就是对待“.”作为分隔符并拆分字符串。然后,重新连接一个空字符串,并选择“[。]"作为分隔符。

第一种解决方案是对这类问题的标准逐步解决方法。但是,这不是最佳解决方案。

更 Pythonic 化的解决方案是使用 replace()方法直接更改“.”带“[。]”,如下图。

解决办法

'1[.]1[.]1[.]1'

在我的日常实践中,我尽量多写第一个解决方案,因为它涉及两个常见的字符串方法:split 和 join。我建议实践这两种解决方案,不管它们是高效还是低效。

皮卡伍德Unsplash 上拍摄的照片

问题 2:彭博微软公司的 Fizz Buzz

-编写一个程序,打印 1 到 50 的数字,对于 2 的倍数打印“嘶嘶”而不是数字,对于 3 的倍数打印“嘶嘶”,对于 2 和 3 的倍数都打印“嘶嘶”

https://leetcode.com/problems/fizz-buzz/】-T4

走过我的思考

这个问题可以重写为多个“如果…那么…”语句,这些语句提醒我们控制流。具体来说,我们可以这样做:“如果条件 A 满足,那么输出结果 A…”

只有一个问题:有些数字是 2 和 3 的倍数,所以我们必须在控制流的顶部做出决定。

# pseudo code for i in range(1,51):
     if condition 1 met: 
          print('fizzbuzz')
     elif condition 2 met: 
          print('fizz')
     elif condition 3 met: 
          print('buzz') 
     else: 
          print(i)

由于只需要检查三个条件,我们可以写一个控制流。然而,存在子条件的数量太多的情况,并且不可能将它们列出来(例如,问题 1 均匀分布)。你的面试官可能会要求你使用除控制心流以外的其他方法。

考虑到这一点,我们创建了两个条件,如果其中一个或两个条件都满足,就增加关键字“Fizz”和“Buzz”。

# pseudo code
condition_1 = (num%2 ==0) # for fizz
condition_2 = (num%3 ==0) # buzzif condition_1 or condition_2: 
     return (condition_1*'Fizz') + (condition_2*'Buzz')

解决办法

1
fizz
buzz
fizz
5
fizzbuzz
7
fizz
buzz
fizz
11
fizzbuzz
13
fizz
buzz
fizz
17
fizzbuzz
.
.
.

照片由 Devon DivineUnsplash 上拍摄

#问题 3:回文数字,谷歌、FB 和微软

  • Identity 以下句子中所有为回文的单词“做还是不做数据科学家,这不是问题。问你妈,lol。”
    -如果同一个单词出现多次,则返回该单词一次 (条件 1)
    -回文:从开头读到结尾或者从结尾读到开头时返回相同结果的单词 (条件 2)
    -https://leetcode.com/problems/palindrome-number/

走过我的思考

回文数有多种变化。这个版本的棘手之处在于每个句子都包含一个约束。

例如,如果一个单词出现多次,只需返回该单词一次,这就建议用 Python 中的 set 作为输出数据类型(条件 1 )。

一个回文是这样的:无论你从头读到尾还是反过来读,都返回相同的结果(条件 2 )。信格类型怎么样?是否区分大小写?在这里,你应该要求澄清问题。

此外,还有一个隐藏的条件,那就是当我们决定一个单词是否是回文时,我们应该去掉标点符号。

如果你没有马上得到所有这些条件,不要担心,因为你的面试官会给你提示。

解决办法

{'a', 'lol', 'mom'}

照片由吕山德元Unsplash 上拍摄

#问题 4:字符串中的第一个唯一字符,FAANG

-给定一个字符串,查找其中的第一个非重复字符并返回其索引。
-如果不存在,返回-1。
-https://leet code . com/problems/first-unique-character-in-a-string/

走过我的思考

问题要求字符串中第一个不重复的字符,相当于第一个只出现一次的字符。在字符串中,我们可以使用 count 方法计算子字符串的出现次数。

我被这个问题耽搁了好一会儿,想不出解决办法。我尝试过使用字典来存储键-值对并返回第一个非重复值的索引,但没有成功。

解决办法

0

第一个唯一字符是字符串“I”(位置 0)。

保罗·花冈在 Unsplash 上的照片

#问题 5:谷歌、亚马逊和 Adobe 的独特电子邮件地址

-每封电子邮件都由本地名称和域名组成,用@符号分隔。
——比如在alice@leetcode.com中,爱丽丝是本地名,leetcode.com 是域名。
-除了小写字母,这些邮件可能包含“.”s 或'+'s.
-如果添加句点('.')在电子邮件地址的本地名称部分的一些字符之间,发送到那里的邮件将被转发到本地名称中没有点的相同地址。例如,“alice.z@leetcode.com”和“alicez@leetcode.com”转发到同一个邮件地址。(注意,该规则不适用于域名。)
-如果在本地名称中添加一个加号('+'),第一个加号之后的所有内容都将被忽略。这允许过滤某些电子邮件,例如 m.y+name@email.com 的邮件将被转发给 my@email.com 的邮件。(同样,该规则不适用于域名。)
-可以同时使用这两个规则。
-给定一个电子邮件列表,我们向列表中的每个地址发送一封电子邮件。实际上有多少不同的地址接收邮件?
——【https://leetcode.com/problems/unique-email-addresses/】T21

走过我的思考

乍一看,这是一个相当长的问题,令人望而生畏。它只是包含了太多的信息,我的大脑已经超负荷了。实际上,在我们忽略琐碎信息后,这是一个简单的问题。

分解之后,只有三个部分:

1.电子邮件由两部分组成:本地名称和域名,用“@”分隔。

2.对于本地名称,“”没有效果,我们应该跳过它;任何“+”后面的都无所谓,省去。

3.多少个唯一的电子邮件地址?

对于每一步,我们分别有应对策略。

由于输入是一个字符串列表,我们可以对元素(string)进行迭代,并对每个元素将其分成两部分(步骤 1)。

我们删除“.”从本地名称开始,保留原来的域名,并读取字符串直到包含“+”的位置(步骤 2)。

我们使用 set()来计算唯一元素的数量。

解决办法

2

杰克 BUnsplash 上拍照

问题 6 目的地城市,Yelp

-给定数组路径,其中 paths[i] = [cityAi,cityBi]表示存在从 cityAi 到 cityBi 的直接路径。
——返回目的城市,即没有任何路径外向另一个城市的城市。
-保证路径图形成一条没有任何回路的线,因此,目的地城市只有一个。
-https://leetcode.com/problems/destination-city/

走过我的思考

我把最好的留到了最后。这个问题是 Yelp 问的,很好吃。原因如下。

对于每个路径,paths[i]具有两个部分[cityAi,cityBi]: cityAi 是出发城市,cityBi 是着陆城市。关键是要理解目的地城市的定义:是没有出发城市的城市。换句话说,目的地城市应该只出现在第二列路径[i]中,而不会出现在第一列中。

理解这一点后,剩下的就不言而喻了,因为我们可以从出发城市中剔除落地城市。

解决办法

'Sao Paulo'

我的Github上有完整的 Python 代码。

外卖食品

  • 数据操作最具挑战性的部分是理解问题背后的逻辑。
  • 即使是最复杂的编程也涉及到 Python 基础,例如,字符串访问和操作、不同的数据类型、for 和 while 循环等。
  • 沟通还是王道!在进入编码部分之前,询问需要澄清的问题。

Medium 最近进化出了自己的 作家伙伴计划 ,支持像我这样的普通作家。如果你还不是订户,通过下面的链接注册,我会收到一部分会员费。

https://leihua-ye.medium.com/membership

我的数据科学面试序列

</4-tricky-sql-questions-for-data-scientists-in-2021-88ff6e456c77>

喜欢读这本书吗?

请在 LinkedInYoutube 上找到我。

还有,看看我其他关于人工智能和机器学习的帖子。

6 个查询示例提升您的 SQL 技能

原文:https://towardsdatascience.com/6-query-examples-to-boost-your-sql-skills-25ae2c89ce40?source=collection_archive---------19-----------------------

聚合、连接、过滤等

SpaceX 在 Unsplash 上拍摄的

SQL 是一种用于管理关系数据库中数据的编程语言。数据以表格形式显示,带有标记的行和列。关系数据库通常由许多通过共享列相关联的表组成。

在本文中,我们将通过 6 个例子来查询关系数据库。这些示例旨在解决数据分析和操作任务,包括过滤、聚合、排序和连接表。

我之前创建了一个有 4 个表的销售数据库。下图说明了数据库和表的结构。

(图片由作者提供)

标有绿色的列是主键,粉色的列代表外键。

  • 主键是唯一标识每行的列。这就像熊猫数据框的索引。
  • 外键是将一个表与另一个表联系起来的东西。外键包含另一个表的主键。例如,采购表中的“item_id”是一个外键。它将主键中的行存储在项目表中。

简单介绍完之后,我们开始举例。

:关系数据库管理系统有很多(如 MySQL、PostgreSQL、SQL Server)。尽管所有的 SQL 语法基本相同,但可能会有一些细微的差别。在本文中,我们将使用 MySQL。

示例 1

项目表包含每个项目的价格、描述和商店信息。我们可能希望找到每个商店的平均商品价格。

mysql> select * from item limit 3;
+---------+-------------+-------+----------+
| item_id | description | price | store_id |
+---------+-------------+-------+----------+
|       1 | apple       |  2.45 |        1 |
|       2 | banana      |  3.45 |        1 |
|       3 | cereal      |  4.20 |        2 |
+---------+-------------+-------+----------+

我们可能希望找到每个商店的平均商品价格。

mysql> select store_id, avg(price)
    -> from item
    -> group by store_id;+----------+------------+
| store_id | avg(price) |
+----------+------------+
|        1 |   1.833333 |
|        2 |   3.820000 |
|        3 |   3.650000 |
+----------+------------+

选择 store_id 和 price 列,然后按 store_id 进行分组。在这种情况下,聚合函数“avg”是在选择列时应用的。

示例 2

让我们找出购买次数最多的客户的姓名。此任务需要从两个表中检索数据。

该名称是从 customer 表中选择的,购买次数是使用 purchase 表计算的。因此,我们需要连接这两个表。

mysql> select concat(customer.f_name," ", customer.l_name) as name,
    -> count(purchase.cust_id) as number_of_purchases
    -> from customer
    -> join purchase
    -> on customer.cust_id = purchase.cust_id
    -> group by name;+--------------+---------------------+
| name         | number_of_purchases |
+--------------+---------------------+
| Adam Gelvin  |                   2 |
| Alisha T.    |                   1 |
| Elaine Smith |                   2 |
| Jane Doe     |                   2 |
| John Doe     |                   2 |
| Robert Sam   |                   1 |
+--------------+---------------------+

共享列是 cust_id,所以我们用它作为连接表的条件。

示例 3

我们希望根据总花费金额对日期进行排序。该任务还需要从两个表中检索数据。

我们从采购表中选择日期、item_id 和 item_qty。为了计算金额,我们需要通过项目表访问的项目的价格。

mysql> select p.date, sum(p.item_qty * i.price) as total_amount
    -> from purchase p
    -> join item i
    -> on p.item_id = i.item_id
    -> group by p.date;+------------+--------------+
| date       | total_amount |
+------------+--------------+
| 2020-05-10 |        52.95 |
| 2020-05-11 |         8.70 |
+------------+--------------+

“总金额”列是通过将价格和数量相乘来计算的。SQL 的一个优点是它允许在选择列时进行这样的计算和聚合。

您可能会注意到,我们还可以为表名使用别名来缩短代码并简化输入。

采购表只包含两天的采购。我们可以通过对日期列应用 distinct 函数来确认。

mysql> select distinct(date) from purchase;+------------+
| date       |
+------------+
| 2020-05-10 |
| 2020-05-11 |
+------------+

实例 4

让我们做一个稍微复杂一点的例子。考虑这样一种情况,我们需要计算女性和男性的总购买量。

这项任务包括连接三个表。

  • 客户表中的性别
  • 采购表中的项目数量
  • 项目表中的项目价格
mysql> select c.gender, sum(p.item_qty * i.price) as total_amount
    -> from customer c
    -> join purchase p on c.cust_id = p.cust_id
    -> join item i on p.item_id = i.item_id
    -> group by c.gender;+--------+--------------+
| gender | total_amount |
+--------+--------------+
| F      |        29.15 |
| M      |        32.50 |
+--------+--------------+

可以在一个查询中以类似链的方式组合多个连接操作。

实例 5

假设我们想找到购买冰淇淋的顾客的 id。在连接了 purchase 和 item 表之后,我们需要使用 where 子句应用一个过滤器。

mysql> select p.cust_id, i.description
    -> from purchase p
    -> join item i
    -> on p.item_id = i.item_id
    -> where i.description = "icecream";+---------+-------------+
| cust_id | description |
+---------+-------------+
|       4 | icecream    |
|       3 | icecream    |
|       5 | icecream    |
+---------+-------------+

实例 6

在物品表中,每个物品都有一个关联的商店。我们想找到与“谷类食品”相关的商店的经理。

解决这个任务的一种方法是连接表。另一种选择是实现嵌套的 select 语句,具体如下。

mysql> select manager from store
    -> where store_id = (
    -> select store_id from item
    -> where description = "cereal"
    -> );+---------+
| manager |
+---------+
| Max     |
+---------+

我们根据另一个 select 语句指定的条件从 store 表中选择经理。通过过滤项目表中的描述列,可以找到所需的 store_id。

结论

我们已经做了 6 个查询关系数据库的例子。关系数据库的关键特征之一是有许多表来存储数据。

这些表通过共享列来关联。我们需要的数据通常分布在多个表中。因此,我们经常需要连接表或使用嵌套的 select 语句。

为了高效地检索所需的数据,我们需要能够编写复杂的查询。熟悉编写这样的查询的最好方法是练习。

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

我在数据科学家访谈中被问到的 6 个问题

原文:https://towardsdatascience.com/6-questions-i-was-asked-at-data-scientist-interviews-39a095d87c6c?source=collection_archive---------10-----------------------

帮助你准备下一次面试的指南

斯科特·格雷厄姆Unsplash 上拍照

近年来,数据科学经历了巨大的发展。因此,对数据科学家的需求大幅增加,这促使许多人转行从事该领域的工作。

这一系列事件的核心是一个特殊的行动:采访。成为数据科学家的雄心和愿望不足以让你找到工作。候选人应该具备全面的技能。

数据科学是一个跨学科的领域,因此所需的技能并不集中在某个特定的主题上。在本文中,我将分享在数据科学家访谈中向我提出的 6 个问题。

我选择了涵盖不同主题的问题,以便您大致了解在数据科学家面试中通常会遇到的情况。这些问题与 Python、机器学习、SQL 和数据库有关。

我不仅会提供答案,还会在更广阔的背景下解释这个话题。

问题 1:L1 和 L2 的正则化技术是什么,它们之间有什么区别?

在机器学习中,当模型试图很好地拟合训练数据,以至于无法推广到新的观察结果时,就会出现过度拟合。过度拟合模型捕捉训练数据中的细节和噪声,而不是总体趋势。因此,过度拟合模型似乎在训练数据上表现突出,但在新的、以前看不到的观察上表现不佳。过拟合的主要原因是模型复杂。

正则化通过惩罚模型中较高的项来控制模型的复杂性。如果增加一个正则项,该模型试图最小化损失和模型的复杂性。

导致模型复杂的两个主要原因是:

  • 特征总数(由 L1 正则化处理),或
  • 特征的权重(由 L2 正则化处理)

L1 正则化也称为稀疏正则化,用于处理主要由零组成的稀疏向量。L1 正则化通过在每次迭代中从权重中减去一个小的量来强制无信息特征的权重为零,从而最终使权重为零。

L2 正则化,为简单起见也称为正则化,强制权重趋向于零,但不会使它们完全为零。L2 正则化就像在每次迭代中去除一小部分权重的力。因此,权重永远不会等于零。如果我们将模型复杂度作为权重的函数,则特征的复杂度与其权重的绝对值成比例。

L1 正则化惩罚|权重|而 L2 正则化惩罚(权重)。

问题 2:分类和聚类有什么区别?

分类和聚类是两种类型的机器学习任务。

分类是一项有监督的学习任务。分类任务中的样本有标签。每个数据点根据一些测量结果进行分类。分类算法试图对样本的测量值(特征)和它们的指定类别之间的关系进行建模。然后模型预测新样本的类别。

聚类是一项无监督的学习任务。聚类分析中的样本没有标签。我们希望该模型能够在数据集中找到结构,以便相似的样本能够被分组到聚类中。我们基本上是让模特给样品贴标签。

问题 3:给定一个元组列表,如何根据元组中的第二项对列表进行排序?

这是一个编码问题。编程语言的选择通常是 Python。我们有下面的元组列表,需要根据元组中的第二项进行排序。

list_a = [('a', 2), ('b', 3), ('c', 1), ('d', 6), ('e', 5)]

我们有两个选择。第一个选项是返回原始列表的排序版本,这样原始列表就不会被修改。

#First option
list_a = [('a', 2), ('b', 3), ('c', 1), ('d', 6), ('e', 5)]sorted_list = sorted(list_a, key = lambda tpl: tpl[1])print(sorted_list)
[('c', 1), ('a', 2), ('b', 3), ('e', 5), ('d', 6)]print(list_a)
[('a', 2), ('b', 3), ('c', 1), ('d', 6), ('e', 5)]

第二个选项是就地排序,这意味着原始列表被修改。

#Second option
list_a = [('a', 2), ('b', 3), ('c', 1), ('d', 6), ('e', 5)]list_a.sort(key = lambda tpl: tpl[1])print(list_a)

问题 Python 中的“yield”关键字是用来做什么的?

在 Python 中,如果我们可以使用循环或理解(例如 list、dictionary)来迭代对象的元素,那么对象就是可迭代的。

生成器是迭代器,迭代器是一种特殊的可迭代类型。生成器不将值存储在内存中,所以我们只能迭代一次。这些值是在我们迭代时生成的。

yield 关键字可以用作函数中的返回关键字。不同之处在于,如果使用 yield 关键字而不是 return,函数将返回一个生成器。

当我们有一个函数返回一大组只使用一次的值时,这是非常有用和有效的。

当一个函数包含 yield 关键字时,它就成为一个生成器函数。换句话说,yield 将一个函数转换为一个生成器,因此它会一个接一个地返回值。

问题 5:什么是数据库中的规范化和反规范化?

这两种技术都是在设计数据库模式时使用的。

规范化的目标是减少数据冗余和不一致。表的数量随着标准化而增加。

反规范化的目标是更快地执行查询。这是通过增加冗余来实现的。表的数量低于归一化技术。

假设我们正在为一家零售企业设计一个数据库。要存储的数据包含客户数据(姓名、电子邮件地址、电话号码)和购买数据(购买日期和金额)。

规范化建议使用单独的表来存储客户数据和购买数据。可以通过使用外键(如客户 id)来关联这些表。在这种情况下,当客户数据(例如电子邮件地址)发生更新时,我们只更新客户表中的一行。

反规范化建议将所有数据都放在表中。当我们需要更新客户的电子邮件地址时,我们需要更新包含该客户购买的所有行。反规范化相对于规范化的优势是运行查询更快。

问题 6: SQL 查询

您很可能会有一个关于 SQL 查询的问题。我被要求编写 select 语句,根据给定的查询从表中检索数据。

假设我们有以下项目表。

mysql> select * from items limit 5;
+---------+--------------+-------+----------+
| item_id | description  | price | store_id |
+---------+--------------+-------+----------+
|       1 | apple        |  2.45 |        1 |
|       2 | banana       |  3.45 |        1 |
|       3 | cereal       |  4.20 |        2 |
|       4 | milk 1 liter |  3.80 |        2 |
|       5 | lettuce      |  1.80 |        1 |
+---------+--------------+-------+----------+

查找每个商店商品的平均价格,并按平均价格对结果进行排序。我们可以通过对 price 列应用 avg 函数并按商店 id 对值进行分组来解决这个问题。可以通过在末尾添加 order by 子句来实现排序。

mysql> select avg(price), store_id
    -> from items
    -> group by store_id
    -> order by avg(price);
+------------+----------+
| avg(price) | store_id |
+------------+----------+
|   1.833333 |        1 |
|   3.650000 |        3 |
|   3.820000 |        2 |
+------------+----------+

结论

这些是我在一次面试中被问到的问题。你可能不会遇到完全相同的问题,但话题通常是相同的。

需要注意的是,这些问题可能来自不同的领域。这表明了对数据科学家的期望。拥有广泛的技能会让你在竞争激烈的就业市场上领先一步。

我打算写一篇更全面的文章,包括更多的面试问题。敬请关注后续文章!

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

参加训练营前要问的 6 个问题

原文:https://towardsdatascience.com/6-questions-to-ask-before-committing-to-a-bootcamp-55205f0cc108?source=collection_archive---------43-----------------------

编码或数据科学训练营应该是你职业发展的下一步吗?

作者:爱德华·克鲁格迪伦·罗西

照片由菲利普·安德烈耶维奇Unsplash 上拍摄

作为学生、助教、教师和课程编写者,我们俩有将近十年的训练营经验。

我们看到我们的学生出类拔萃,被五大咨询公司和 FAANG 公司聘用。作为数据科学家,我们有过多次实习经历。

另一方面,我们已经看到学生变得脱离并退出训练营,或者勉强通过并名义上完成了训练营,但缺乏理解和技能提升。

也有一些学生在课程开始时很难掌握基本的专业计算机技能,但在课程中表现出色,并被聘为数据科学家。然而,我们也有高学历的学生在整个课程中苦苦挣扎。

这篇文章将告诉你在参加训练营之前需要问的问题。

你有经济能力参加训练营吗?

这是你应该问自己的第一个问题。如果你回答“不”,那么这个时候训练营不适合你。

训练营可能很贵。2019 年, CourseReport 发现,训练营的平均费用为 13584 美元。对于一门课程来说,这笔学费是一大笔钱。请记住,训练营的工作量和上课时间与传统大学课程的整个学期差不多。

幸运的是,许多训练营会提供每月付款计划。然而,为期六个月的训练营每月仍需 2000 多美元。

由于高昂的学费,一些学生为了选修这门课程会背上债务。无论是信用卡还是个人贷款,这些债务只会因为利息而增加参加训练营的成本,尤其是信用卡。

如果你目前有工作,我们不建议你负债,因为不值得给你和你的家庭增加额外的经济负担。假设你还在努力工作。在这种情况下,考虑到合理的利率,举债或许没问题。

在这篇文章的最后,我们将讨论你可以在不使自己陷入债务的情况下追求的替代方案。

如果你打算参加一个训练营,但是意识到你自己负担不起,这里有一些选择,你可以去寻求资助。

  1. 向你的雇主推销这可以提高你的工作表现,并询问他们是否会支付费用。
  2. 如果你是一个代表性不足的社会团体的成员,在这里查看一些奖学金机会。
  3. 如果你是一名退伍军人,你可以用退伍军人法案来帮助支付训练营的费用。

可能的额外财务成本

  • 现代台式机或笔记本电脑(如果在现场)
  • 互联网(足够的带宽来处理脚本和缩放呼叫)
  • 燃料(如果在现场进行)
  • 保姆(如果你没有人照看你的孩子)
  • 食物(你可能没有时间在上课前吃晚餐)

你有足够的时间参加全职训练营吗?

许多训练营都有晚上兼职的时间表,以适应有全职工作的学生。这个时间表也允许传统的大学生在他们的义务之间找到时间参加训练营。

然而,这个时间表有一个缺点:假设一个人有一份朝九晚五的工作,他们的训练营在 6:30 开始,那么在上课前只有一个半小时的“空闲时间”。通勤可以迅速减少这个时间。随着课程在晚上 10 点左右结束,仅仅几个星期后,这种例行公事就会让人筋疲力尽。

作为一名学生,有很多次迪伦会发现自己在晚上 10 点或 11 点吃晚饭。这个时间表对爱德华来说也是折磨人的。迪伦也只能在早上上班前和睡前短暂地见到他的未婚夫。

到目前为止,我们只谈了上课日的要求。学生们一周上两次课,周六上午在我们的训练营上课。剩下四天的“自由时间”

然而,大部分时间都被项目、家庭作业以及最重要的自学占用了。

大多数训练营要求你每周至少有 20 个小时的课外时间自学、做作业、做项目。这是你一周的样子:

上课,上班时间,花 20 小时自学,课外作业和项目可以很快将 40 小时的工作周变成 80 小时的工作周。

我们的许多学生也是家长,他们不得不在课业和照顾孩子之间寻求平衡。只有几个小时的时间来做父母,完成训练营并不容易。我们为那些成功做到这一点的父母鼓掌。

时间是我们无法收回的东西;选择把你的时间奉献给一个训练营不应该是轻率的。

你的期望现实吗?

每个人都希望能够在没有任何知识的情况下进入训练营,努力工作六个月,然后能够在一家出色的公司获得高薪的软件工程或数据科学家职位。

结果不典型。

现实是,这些结果不太可能出现。然而,这些学生确实获得了这些职位,但他们通常有一些其他的经验、特质或技能来帮助他们获得这些职位。

训练营旨在让学生快速起步,并为您提供从入门级开发人员或分析师职位起步的技能。训练营的另一部分会给你一个感兴趣领域的概述和指导。

你应该带着现实的期望进入训练营。

你的目标与训练营一致吗?

学生和训练营应该有相关的目标。

想要成为数据科学家的学生应该参加一个数据科学训练营,学习 Python(而不是 R)、统计学和机器学习。如果你也学会了如何编写和使用 API,那将是最好的——你可以自学。

如果学生想成为前端开发人员,他们应该参加一个教授现代 HTML,CSS,JavaScript 和相关框架的训练营,如 React。学习一点后端和数据库不会有什么坏处。

不确定自己未来想做什么职业的学生应该在开始训练营之前花一些时间探索这些职业道路。否则,他们可能会发现自己在六个月内和 10,000 美元内一无所获——如果你对某个技术领域不感兴趣,再多的自我激励也不会让你擅长它。

如果你不确定,我们鼓励你利用更便宜的选择来探索不同的技能组合。

你对训练营的课程感兴趣吗?

类似上面的问题,你应该对课程的大部分感兴趣,而不仅仅是一两门科目。过去,我们有一些学生只在他们感兴趣的科目上来上课,这导致很多钱只花在少数几个科目上。此外,他们会错过大局,他们的概念理解混乱。即使是 Tableau 开发人员也至少知道一些 SQL 和一种通用编程语言。

训练营提供了许多主题的高级概述。如果你只对几门课程感兴趣,最好能找到一门专门针对这些主题的课程。

讲师有资格教授这些主题吗?

这可能需要一点努力,但确定谁是你的导师以及他们是否合格是至关重要的。指导老师来自不同的背景。例如,如果你对数据工程感兴趣,找一个在这个领域有经验的人。如果你不确定你对哪个领域感兴趣,找一个数据科学家作为你的导师,因为他们在几乎所有领域都有经验。

在我们参加编码训练营的几年中,我们已经看到教师在课程的早期失败,因为他们不熟悉他们所教的技术。他们被替换了。看一眼他们在 LinkedIn 上的个人资料就可以发现,他们并没有使用他们教授的技术。

迪伦已经面试了训练营的学生来获得他日常工作中的角色。他曾经采访过同一个训练营的学生,但是很容易就能看出一个人的经验有限是因为他的教练不够优秀。花时间做这项研究将有助于防止不好的结果。

花点时间找出训练营的指导老师是谁,看看他们的资历和经验。如果他们不符合训练营的教学目标,我们建议寻找另一个训练营或训练营的不同部分,那里有更合格的教练。

训练营备选方案

如果你发现自己对大多数问题的回答都是“不”,那么训练营可能不是你的最佳选择,这没关系!

这里有一些更便宜的选择,可以让你探索不同的领域,学习你选择的技能。

  • Udemy 有大量各种主题的目录,比如编码。许多课程只有 20 美元左右(一定要做一个帐户来获得这个价格),并且是自定进度的,让您能够在找到时间时完成。
  • EdX — EdX 提供来自世界上最好的大学和企业的大学水平的课程。大多数课程都是免费的,最后你可以选择购买证书。哈佛的 CS50强烈推荐给那些从未做过代码的人。
  • Codecademy 是一种互动的学习方式,从这个意义上来说,Codecademy 是个不错的选择。他们给出编写代码的指令,您可以从他们内置的 IDE 中获得即时反馈。Codecademy 也是免费的,但只针对基础水平的课程。如果想要更深刻的课程和活动,就需要购买 Codecademy Pro(如果是学生,可以打 7.5 折!)
  • YouTube——你能想象到的一切在 YouTube 上都可以找到。有很棒的视频和课程播放列表,涵盖一切可以想象的内容。找到您喜欢的频道并开始观看!
  • 个人项目——如果你也参加了训练营,你应该这样做。想出一些你想完成的个人项目。它可以简单到编写一个 Python 脚本来组织您的文件,或者制作一个 web 应用程序来跟踪 COVID 案例。尝试创建一个模型来预测足球比分。如果你对它感兴趣,为它编写一些代码,你会发现你能多快地掌握这些技术。
  • 寻找导师——如果你有朋友、家人或同事是你感兴趣领域的开发者,看看你能否在他们一起工作或开始一个项目时跟随他们。这样,你会对这个话题保持兴趣,同时得到了解这个领域的人的指导。

对于任何道路来说,学习 Python 都是很好的第一步。要获得学习 Python 的资源,请查看 javinpaul 的文章:

https://betterprogramming.pub/top-5-courses-to-learn-python-in-2018-best-of-lot-26644a99e7ec

理解 A/B 测试的 6 个问题

原文:https://towardsdatascience.com/6-questions-to-understand-a-b-testing-8d0ed05e5cc4?source=collection_archive---------18-----------------------

超越手头的数据。

约书亚·厄尔在 Unsplash 上的照片

统计学是数据科学不可或缺的一部分。它不仅能帮助我们理解、探索和评估数据,还能超越手中的东西。

统计学的这一部分帮助我们得出超出手头资料的结论,这一部分叫做推断统计学。

假设我们有一项任务,要发现每天睡 8 小时的大学生是否比每天睡不到 6 小时的大学生成绩更好。为了进行彻底的评估,我们需要得到这个范围内所有大学生的成绩,这是不可能的,也是不合理的。

相反,我们所做的是从每个组中获取一个样本,并根据他们的数据进行比较。

  • 人口是代表一个群体的所有元素。
  • 样本是总体的子集。
  • 美国的大学生是一个群体。随机选择的 1000 名美国大学生就是从这个人群中抽取的样本。

这就是推理统计学发挥作用的地方。这有助于我们验证我们在样本上的发现,并证明这些结果是否适用于整个人群。

A/B 检验允许我们使用样本数据来推断总体的结果。在本文中,我们将回答 5 个问题来了解 A/B 测试的过程。

组织这些问题是为了简要解释整个过程,以便帮助我们了解 A/B 测试是如何执行的。

问题 1

你的团队正在为公司网站进行新的设计。在开始使用新设计之前,你想看看新设计是否会提高点击率(CTR)。你将如何完成这项任务?

回答

这个任务可以通过 A/B 测试来解决。A 和 B 代表两种不同的场景。在这种情况下,一个是当前设计,另一个是建议的新设计。

网站的流量将分为两组,要么看到当前的设计,要么看到新的设计。A/B 测试持续一段预定的时间,然后分析结果以决定哪种设计更好。

问题 2

这个任务中的样本和总体是什么?

回答

群体是从实验开始直到永远的点击率信息。因此,不可能收集。

样本是在预定义的时间段(如 30 天)内收集的相同信息。

问题 3

在你刚才提到的 A/B 测试中,你如何定义无效假设和替代假设?

回答

A/B 测试结果根据假设进行评估。需要预先确定无效假设和替代假设。

零假设有利于当前的情况,并表明没有变化。另一种假设是基于做出改变。

  • 零假设:新设计不增加点击率。
  • 替代假设:新设计提高了点击率。

问题 4

您收集了 A/B 测试的结果,发现平均点击率更高。你会立即改变网站的设计吗?

回答

不会。因为我们是在比较样本,所以需要进行统计显著性检验来证明结果的合理性。我们需要确保新设计的点击率不会因为随机因素而提高。

问题 5

您执行了统计显著性检验(例如 t 检验或 z 检验),结果 p 值为 0.04。这足以证明新设计更好吗?

回答

首先,p 值不足以做决定。必须基于预定义的置信度对其进行评估。

p 值为 0.04 意味着有 4%的概率结果是随机产生的。换句话说,我们对结果有 96%的把握。

应在 A/B 测试之前设定置信水平。如果置信水平确定为 95%,那么我们需要一个小于 5%(即 0.05)的 p 值来得出替代假设为真的结论,即新设计提高了点击率。

问题 6

什么是第一类和第二类错误?

回答

在假设检验中,即使我们对自己的决定有 96%的把握,也有很小的可能出错。这些错误可以分为第一类和第二类错误。

第一类错误,也称为“假阳性”,是不正确地拒绝零假设或不正确地接受替代假设。

在我们的例子中,我们接受另一个假设,即新设计增加了点击率。如果事实证明新设计并没有提高点击率,那么就变成了 I 型错误。

第二类错误,也称为“假阴性”,是不正确地接受零假设或不正确地拒绝替代假设。

在我们的例子中,如果我们得出结论,新的设计没有增加点击率,但它实际上增加了,那么它就成为第二类错误。

结论

统计知识是数据科学家必备的。如果你打算成为一名数据科学家,一定要把描述性和推断性统计学得相当好。

在本文中,我们介绍了一个典型的 A/B 测试过程,包括一些关键术语和概念,如假设测试、p 值、置信区间、样本、总体等等。

你可以成为媒介会员来解锁我的作品的全部访问权限,以及媒介的其余部分。如果您使用以下链接,我将收取您的一部分会员费,无需您支付额外费用。

https://sonery.medium.com/membership

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

我认为敏捷数据科学不起作用的 6 个原因

原文:https://towardsdatascience.com/6-reasons-why-i-think-agile-data-science-does-not-work-ee4dd680bb59?source=collection_archive---------16-----------------------

蒂姆·高在 Unsplash 上拍摄的照片

意见

为什么我会去另一家公司工作

数据是新的石油,而敏捷方法是提取这一宝贵资源的最佳方式?在我看来,数据科学项目的敏捷方法在理论上行得通,但在现实中行不通。敏捷方法因敏捷软件开发的成功而得到推广,它依赖于短期的可交付成果,即允许团队频繁展示进展并快速适应的 sprints。然而,当我们需要做研究或探索未知见解的数据时,敏捷方法就不起作用了,因为我们不能确定地预定义或安排这些活动。

1.这个项目没有明确的开始或结束

当我们谈论敏捷方法时,很难理解什么是真正的敏捷。敏捷的某些方面很适合数据科学项目,但有些则不然。数据科学中敏捷项目管理的主要问题是缺乏明确的起点和终点。通常,在敏捷项目的开始,甚至没有最终产品应该是什么样子的想法。当我们迭代敏捷 sprints 时,我们产生了数据科学代码的工作片段。这很好,但是它并不总是导致敏捷开发开始时所期望的最终产品。也许,为客户定义最终的可交付成果是一个很好的敏捷实践,但是使用敏捷方法很难做到这一点。

虽然我同意敏捷可以很好地为小项目工作,但它可能会给范围不确定的大型数据科学项目带来重大问题。另一方面,瀑布方法更适合这些类型的商业智能或数据科学项目,因为它定义了起点和终点,而敏捷则没有。

敏捷方法是管理没有大规模软件开发资源的小型项目和数据科学团队的好方法。然而,如果一个组织在为他们的数据科学项目管理实施敏捷方法方面有很大的野心,他们应该准备好迎接一些挑战。

2.遍历待办事项列表并对工作进行优先级排序的过程可能会很困难

敏捷数据科学项目需要很大的灵活性。敏捷数据科学过程通常包括一个敏捷待办事项列表,团队通过它来确定接下来需要做什么的优先级。从这个列表中选择正确的项目可能是困难的,需要一些实验,因为你对你的问题领域和潜在的解决方案了解得更多。我承认有各种各样的项目,从非常明确的应用程序开发类型的项目到数据驱动的研究项目。为了让敏捷数据科学流程发挥作用,我更多地是在谈论那些结果和实现路径不明确的项目。我一直在做的项目经常需要我做大量的研究(例如,清楚地了解业务问题,探索潜在的数据源,探索以前由内部或业内其他人完成的相关工作,等等。).这意味着获得最终结果可能是不确定的,通常会有一定的风险,更不用说就“完成”的含义达成共识了。因此,迭代一个 backlog 并阅读永无止境的用户故事到一个不明确的终点是没有意义的。

3.很难估计完成一项任务需要多长时间

基于上一点,众所周知,在数据科学项目中使用敏捷方法很难估计完成一项任务需要多长时间。根据我的经验,数据科学项目代表了以前没有解决的问题。这意味着除非你尝试了几种不同的方法并比较了结果,否则没有办法知道要花多长时间。考虑到解决方案和实现途径的不确定性,敏捷方法可能不是解决美国数据科学家每天面临的难题的最佳方法。

4.很多时间花在会议上,这意味着花在实际任务上的时间减少了

我知道我妻子每天听我谈论微软团队的事情,这让我烦透了(在澳大利亚悉尼的一级防范禁闭期间,我们俩都在家工作)。会议太多了。每日站立会议、冲刺结束展示、反思、冲刺规划以及与利益相关者的频繁交流,以收集他们不断变化的需求和项目优先级,这些都是数据科学项目敏捷方法的一部分。这是一个耗时的过程,有时会阻碍我们继续完成任务。我认为数据科学项目的敏捷方法不是最好的方法,特别是考虑到我们需要对来自多个来源的多个数据集进行排序,而没有一条清晰的路径来获得最终期望的结果。

5.文档的缺乏可能会使新的团队成员更难跟上项目中已经完成的工作

我们中的许多人并不是独自工作,我们在一个数据科学团队中工作。或者,您可能与不属于您团队的数据工程师和数据分析师一起工作。我学到了敏捷方法的好处,以及实现敏捷过程的“正确”方法等等。在实践中,我亲眼目睹了它是如何实现的。我见过太多次敏捷团队没有遵循文档。我见过敏捷团队在电子邮件、JIRA(问题跟踪系统)、Confluence(文档管理软件)中丢弃所有东西,却没有适当的标记和命名约定。

我知道这听起来很明显,但是我们应该有一种方法来分享我们从这些项目中学到的东西,这样下一个人就不会被不熟悉的代码弄糊涂了。这也有助于我们保持责任感,如果出了问题,其他人可以更容易地从你离开的地方继续下去。

6.我不喜欢敏捷方法,因为它不允许我像其他方法一样在工作中探索我的创造力

我不得不承认,当涉及到我的工作时,我得到了很多引导。我拥有的自主权是一种祝福,但也可能是一种诅咒,因为我可以随心所欲地尝试。在敏捷方法中,客户在每个冲刺阶段结束时,将他们期望从我和我的团队那里得到的可交付成果列表放在一起。数据科学项目的问题在于,这些项目中涉及了太多的变量,以至于在我们到达之前,我不知道可能会有什么交付成果。这限制了我在工作中的探索和创造力,因为敏捷方法是如此的线性。

我习惯于在一个创造性的泡泡中工作,在那里我可以试验想法,而不用对它们进行过多的监督,敏捷方法不允许数据科学项目这样做。无论我从事什么类型的数据科学项目,都有很大一部分是对创造性探索开放的,而敏捷方法不允许这样做。

我相信实验方面假设你测试并找到它们不工作的方法。这意味着敏捷方法假设问题已经解决了,不需要探索。我的大部分工作都不是这种情况,所以敏捷方法并不适合他们。

这篇博文讨论了敏捷方法在现实中并不总是有效的。在我看来,数据科学比其他类型的项目需要更多的创造力。它不像其他类型的项目管理方法那样给我自由和回旋的空间去探索和测试。这就是为什么当我被迫从事敏捷数据科学时,我可能会给招聘人员打电话。

我知道你的经历和你工作的组织文化会对这个话题产生巨大的影响。也许你是一名数据科学家,领导着一个数据科学团队,产品负责人,scrum master,或者一名高管。我很想在下面的评论中听到你的想法。请分享你的经历,特别想听听你的正面经历!!

你应该停止使用直方图的 6 个原因(以及你应该使用哪个图)

原文:https://towardsdatascience.com/6-reasons-why-you-should-stop-using-histograms-and-which-plot-you-should-use-instead-31f937a0a81c?source=collection_archive---------0-----------------------

直方图并非没有偏差。实际上,它们是任意的,可能会导致关于数据的错误结论。如果你想可视化一个变量,最好选择不同的绘图。

[作者图]

无论你是在与高管开会,还是在与数据狂人开会,你都可以确定一件事:在某个时刻,会有一个直方图。

不难看出为什么。直方图非常直观:任何人一看就明白。此外,它们是现实的无偏见的表现,对吗?没那么快。

直方图可能会误导人,得出错误的结论——即使是简单的数据!

在这篇文章中,借助于一些例子,我们将讨论为什么在可视化数据时,直方图不是最佳选择的 6 个原因:

  1. 这(太)取决于箱子的数量。
  2. 这(太)取决于变量的最大值和最小值。
  3. 不允许检测相关值。
  4. 它不允许区分连续变量和离散变量。
  5. 这使得比较分布变得很困难。
  6. 如果没有内存中的所有数据,很难做出。

“好吧,我明白了:直方图并不完美。但是我有选择吗?”是的,你有!

在文章的最后,我将推荐一个不同的情节——称为 CDP——它克服了这些缺陷。

那么,直方图有什么问题呢?

1.这(太)取决于箱的数量。

要绘制直方图,您必须首先决定间隔的数量,也称为区间。有许多不同的经验法则可以做到这一点(见本页的概述)。但是这个选择有多关键呢?让我们来看一些真实的数据,看看直方图是如何根据仓的数量而变化的。

变量是 303 个人在一些身体活动中达到的最大心率(每分钟心跳数)(数据取自 UCI 心脏病数据集:来源)。

当柱的数量改变时,直方图如何改变。[作者图]

观察左上角的图(在 Python 和 R 中默认情况下会得到这个图),我们会有一个很好的单峰分布(模式)的印象。然而,如果我们看其他直方图,我们会得到一个完全不同的画面。直方图会导致矛盾的结论。

2。这(太)取决于变量的最大值和最小值。

即使设置了容器的数量,间隔也取决于变量的最小值和最大值的位置。两者之一稍有变化就够了,所有音程都变。换句话说,直方图并不健壮。

例如,让我们尝试改变变量的最大值,而箱的数量保持不变。

当最大值改变时直方图如何变化。[作者图]

单个值不一样,整个剧情就不一样了。这是一个不受欢迎的属性,因为我们感兴趣的是整体分布:单个值应该没有什么区别!

3.它不允许检测相关值。

一般来说,当一个变量包含一些频繁值时,我们需要注意它。然而,直方图不允许这样做,因为它们是基于区间的,而区间“隐藏”了单个值。

一个经典的例子是缺失值被大量归入 0。例如,让我们看一个由 1 万个数据点组成的变量,其中 26%是 0。

相同的数据,不同的仓位宽度。在左边的图中,不可能检测到高浓度的零。[作者图]

左边的图是 Python 中默认的结果。通过观察它,你会相信这个变量有一个“平滑”的行为,你甚至感觉不到零的集中。

右边的图是通过缩小面元获得的,并且给出了现实的更清晰的表示。但关键是,无论你如何缩小区间,你永远无法确定第一个区间是否只包含 0 或其他值。

4.它不允许区分连续变量和离散变量。

一般来说,我们想知道一个数值变量是连续的还是离散的。给定一个直方图,实际上是不可能分辨出来的。

让我们拿可变的年龄。您可能会发现年龄= 49 岁(当年龄被截断时),或者年龄 = 49.828884325804246 岁(当年龄被计算为自出生以来的天数除以 365.25 时)。第一个是离散变量,而第二个是连续变量。

左边是一个连续变量。右边是一个离散变量。然而,在上面的图中,它们看起来是一样的。[作者图]

左边的是连续的,右边的是离散的。然而,在上面的图中(Python 的默认设置),你看不出两者有什么不同:它们看起来完全一样。

5.这使得比较分布变得很困难。

通常有必要在不同的集群上比较相同的变量。例如,关于上面的 UCI 心脏病数据,我们可能想要比较:

  • 全体人口(作为参考)
  • 50 岁以下的人&患有心脏病
  • 50 岁以下的人&没有心脏病
  • 60 岁以上的人&患有心脏病
  • 60 岁以上的人&没有心脏病

这是我们将得到的结果:

比较直方图。[作者图]

直方图是基于面积的,当我们试图进行比较时,面积最终会重叠,使我们的工作无法进行。

6.如果你没有把所有的数据都存在内存里,就很难做出。

如果你有 Excel、R 或 Python 中的所有数据,很容易制作一个直方图:在 Excel 中你只需要点击直方图的图标,在 R 中执行命令hist(x),在 Python 中plt.hist(x)

但是假设您的数据存储在数据库中。你不想下载所有的数据只是为了做一个直方图,对不对?基本上,你所需要的只是一个表格,其中包含了每个区间的极值和观测值的计数。大概是这样的:

**| INTERVAL_LEFT | INTERVAL_RIGHT | COUNT         |
|---------------|----------------|---------------|
| 75.0          | 87.0           | 31            |
| 87.0          | 99.0           | 52            |
| 99.0          | 111.0          | 76            |
| ...           | ...            | ...           |**

但是通过 SQL 查询获得它并不像看起来那么简单。例如,在谷歌的大查询中,代码将是:

WITH**STATS** AS (
  SELECT 
    COUNT(*) AS **N**,
    APPROX_QUANTILES(**VARIABLE_NAME**, 4) AS **QUARTILES**
  FROM
    **TABLE_NAME**
),**BIN_WIDTH** AS (
  SELECT
    *-- freedman-diaconis formula for calculating the bin width*
    (**QUARTILES**[OFFSET(4)] — **QUARTILES**[OFFSET(0)]) / ROUND((**QUARTILES**[OFFSET(4)] — **QUARTILES**[OFFSET(0)]) / (2 * (**QUARTILES**[OFFSET(3)] — **QUARTILES**[OFFSET(1)]) / POW(**N**, 1/3)) + .5) AS **FD**
  FROM 
    **STATS**
),**HIST** AS (
  SELECT 
    FLOOR((**TABLE_NAME**.**VARIABLE_NAME** — **STATS**.**QUARTILES**[OFFSET(0)]) / **BIN_WIDTH**.**FD**) AS **INTERVAL_ID**,
    COUNT(*) AS **COUNT**
  FROM 
    **TABLE_NAME**,
    **STATS**,
    **BIN_WIDTH**
  GROUP BY 
    1
)SELECT 
  **STATS**.**QUARTILES**[OFFSET(0)] + **BIN_WIDTH**.**FD** * **HIST**.**INTERVAL_ID** AS **INTERVAL_LEFT**,
  **STATS**.**QUARTILES**[OFFSET(0)] + **BIN_WIDTH**.**FD** * (**HIST**.**INTERVAL_ID** + 1) AS **INTERVAL_RIGHT**,
  **HIST**.**COUNT**
FROM 
  **HIST**, 
  **STATS**, 
  **BIN_WIDTH**

有点繁琐,不是吗?

另一种方法是:累积分布图

在看到直方图不是理想选择的 6 个原因后,一个自然的问题是:“我有其他选择吗?”好消息:确实存在一个更好的选择,叫做“累积分布图”(CDP)。我知道这个名字不太好记,但我保证它是值得的。

累积分布图是一个变量的分位数图。换句话说,CDP 上的每个点都显示:

  • x 轴上:变量的原始值(如直方图所示);
  • y 轴上:有多少观察值相同或更少。

让我们看一个常见变量的例子:最大心率。

最大心率的累积分布图。[作者图]

我们取坐标为 x = 140, y = 90 (30%)的点。在横轴上你可以看到变量的值:每分钟 140 次心跳。在纵轴上,您可以看到心率等于或低于 140 的观察计数(在本例中为 90 人,这意味着样本的 30%)。因此,我们样本中 30%的人每分钟心跳不超过 140 次。

一个图告诉你有多少观察值“等于或低于”一个给定的水平有什么意义?为什么不干脆“平等”?因为,否则,结果将取决于变量的单个值。这是行不通的,因为每个值只有很少的观察值(如果变量是连续的,通常只有一个)。相反,CDP 依赖分位数,更稳定,更有意义,更容易阅读。

此外,CDP 更有用。想想看,经常需要回答“140 到 160 之间的有多少?”,或者“180 以上的有几个?”。鼻子底下有个 CDP,可以马上回答。对于直方图,这是不可能的。

CDP 解决了我们在上面看到的所有问题。事实上,与直方图相比:

1.不需要任何用户选择。给定一些数据,只有一个可能的 CDP

2.它不受离群值的影响。极值对 CDP 没有影响,因为分位数不会改变。

3.允许检测相关值。如果在某个特定值上存在数据点的集中,这是显而易见的,因为在该值的对应部分会有一个垂直段。

4.它允许一眼就认出一个离散变量。如果只存在一堆可能的值(即变量是离散的),这是显而易见的,因为曲线是阶梯状的。

5.比较分布很容易。在同一个图上比较两个或多个分布很容易,因为它们只是曲线,而不是面积。此外, y 轴的范围始终在 0 到 100%之间,这使得比较更加简单。例如,这是我们在上面看到的例子:

用 CDP 比较分布。[作者图]

6.如果你的内存中没有所有数据,也很容易制作。您所需要的只是分位数,可以在 SQL 中轻松获得:

SELECT 
  COUNT(*) AS **N**,
  APPROX_QUANTILES(**VARIABLE_NAME**, 100) AS **PERCENTILES**
FROM
  **TABLE_NAME**

如何在 Excel、R、Python 中制作累积分布图

在 Excel 中,您需要构建两列。第一个有 101 个数字从 0 到 1 均匀分布。第二列应该包含可以通过公式得到的百分位数:=PERCENTILE(*DATA*, *FRAC)*,其中数据是包含数据的向量, FRAC 是第一列:0.00,0.01,0.02,0.03,…,0.98,0.99,1。然后,你只需要绘制两列,注意把变量值放在x-轴上。

在 R 中,它就像:

**plot(ecdf(data))**

在 Python 中:

**from statsmodels.distributions.empirical_distribution import ECDF
import matplotlib.pyplot as plt****ecdf = ECDF(data)
plt.plot(ecdf.x, ecdf.y)**

感谢您的阅读!我希望这篇文章对你有用。

我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以发短信给我我的 Linkedin 联系人

你的人工智能和数据科学项目失败的 6 个原因

原文:https://towardsdatascience.com/6-reasons-why-your-ai-and-data-science-projects-fail-2a1ecb77743b?source=collection_archive---------20-----------------------

分析导致你的人工智能和数据科学项目失败的 6 个主要原因

Patryk Sobczak 在 Unsplash 上拍摄的照片

近年来,有大量精彩的人工智能和数据科学项目不断得到开发。来自 OpenAI 的创新作品,大师级聊天机器人,来自 GANs 的面部图像生成,等等。

随着我们在这些领域的不断进步和发展,将会有更多令人惊叹的项目进入开发阶段,并让普通观众探索和着迷。

对于刚开始接触这些学科的人来说,理解数据科学和人工智能项目有时可能比我们想象的更复杂是至关重要的。当你爬上技能天花板时,当你从事新的事业时,有许多值得注意的地方要记住。

虽然您可能在初级项目的最初努力中取得了成功,但是更高级项目的日益增加的复杂性可能会在您处理它们时造成一些障碍。理解这些数据科学和人工智能项目失败的原因至关重要。

我们将讨论数据科学和人工智能项目最有可能失败的六个主要原因。我们将深入分析每一点,并尝试找出最佳解决方案,避免以下失败原因。

如果您是数据科学领域的新手,并且希望更加精通以下领域,我建议您通过下面提供的链接查看我以前的一篇文章。

</12-steps-for-beginner-to-pro-in-data-science-in-12-months-c6f6ba01f96e>

1.缺乏数据:

数据对于解决任何一种 AI 或数据科学项目的意义都是至高无上的。

对于每个项目来说,对解释良好的数据的需求是必须的。没有正确数量的高质量数据,几乎不可能训练任何类型的机器学习或深度学习模型来实现数据科学家可能寻找的最合适的结果。

在收集数据的过程中,您需要相应地处理用于特定项目的数据的质量。对于复杂的医疗细分任务或其他类似的数据较少的领域,调整和优化以获得更好的结果变得至关重要。

为自然语言处理任务和计算机视觉程序获取数据的方法可能会略有不同,这取决于您试图解决的问题的类型。

然而,对于任何一种类型的问题,需要注意的关键点是确保数据满足要求,并且您有足够的数据量来创建您想要的项目。对于特定的任务,有几种方法可以获得正确形式的数据。

从现有数据中创建更多数据的一种更突出的技术是借助计算机视觉任务的数据扩充。您可以执行许多操作,如水平翻转、垂直翻转、光学变形、调整大小等等。

2.不正确的顺序:

做饭时,遵循食谱和一些必须执行的执行步骤的顺序通常是个好主意。混淆程序和添加某些成分的方式会导致灾难。

类似的场景也适用于数据科学和人工智能,在这两个领域,你不能随心所欲地混合基本成分。因此,理解你试图通过你所遵循的步骤实现的目标是至关重要的。

如果不知道数据的类型,您就无法执行探索性的数据分析,同样,如果没有干净的数据集,您就无法使用错误的数据和信息来训练不合适的模型。

首先,收集最有用的数据,然后准确地探索这些数据是很重要的。一旦您完成了对数据的探索,您将对如何相应地操作数据有一个简单的想法。

一旦有了清理后的数据集,就可以继续构建模型并相应地训练数据集,并选择在评估步骤中进行适当的预测。将这些步骤混在一起可能不是最好的主意,因此对于一个理想的顺序是至关重要的。

如果你有兴趣更深入地了解让你的数据科学、机器学习和人工智能项目以正确的顺序和完美的步骤顺序进行的最终步骤,请通过下面提供的链接查看我以前关于这个主题的一篇文章。

</10-step-ultimate-guide-for-machine-learning-and-data-science-projects-ed61ae9aa301>

3.中途失去动力:

从事众多人工智能和数据科学项目有时可能是一项艰巨的任务。当第一次试图编译一个复杂的代码时,程序的运行会使用户遇到几个问题。在人工智能和数据科学中,你必然会不断地面临这些问题。在处理这些问题时,必须进行有效的调试。

然而,解决这些错误并不总是一件容易的事,尤其是在没有使用最佳方法的时候。广泛的研究、奉献和正确的心态是完成这些任务的主要要求。

当你没有得到你想要的最佳和合适的结果时,你很容易发现有些人中途失去了动力。

这个因素是大多数人工智能和数据科学项目失败的主要原因之一。尽管尽了最大努力来修复错误并获得最佳解决方案,但您可能无法按照预期来解释它,从而导致令人沮丧的体验。

要解决这些问题,最好的方法是确保你在工作时间有足够的休息时间来保持冷静和沉着。最好是一次解决一个问题,并尝试在 Stack Overflow 或 GitHub 上研究它们,以参考与类似问题相关的解决方案和答案。

通常情况下,你应该能够轻松地找到你正在努力解决的问题的可靠答案。然而,如果您无法获得并找到所需的解决方案,下面的一篇文章可以帮助您获得数据科学和机器学习方面的最佳免费工具。

</7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e> [## 数据科学和机器学习的 7 个最佳免费工具

towardsdatascience.com](/7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e)

4.资源限制:

一个绝妙的想法最糟糕的地方在于,你知道你可以让它实现,但不幸的是,你没有合适的资源。

对于众多复杂的数据科学项目,您要么需要大量的数据需求,用于机器学习任务的大型数据集的集合。

或者,你可能需要更多的计算资源,如 RAM 大小或图形处理单元(GPU),以解决深度学习的特定任务。

虽然有几个免费资源可供您构建初级到中级项目,包括云平台,但它们很少能满足高级、复杂的应用程序。

像 Google Colab 这样的东西可以很好地用于中间应用程序,但是时间和资源的限制可能会导致一些问题。

当你试图构建一个更复杂的特定项目时,比如一个关于生殖对抗网络(GANs)的项目,你需要处理高分辨率的图像,资源限制是一个巨大的问题。

没有合适的计算资源,你将总是收到一个资源耗尽的错误,或者你根本不能执行你的程序。

这些问题的潜在解决方法是降低图像质量和神经网络的层数。虽然结果可能不尽如人意,但您最终会得到一些不错的结果来验证您的方法和算法。

为了更深入地了解图形处理单元及其对深度学习的精确要求,我强烈推荐查看我以前的一篇文章,关于你真的需要一个用于深度学习的 GPU 吗?

如果你是一个初学者,刚刚开始开发深度学习项目,并且不知道最适合你的 PC 构建的架构类型,我建议你查看我以前的一篇文章,该文章介绍了在每个预算范围内用于深度学习的最佳 PC 构建。

[## 在各种预算范围内,最适合深度学习的电脑

towardsdatascience.com](/best-pc-builds-for-deep-learning-in-every-budget-ranges-3e83d1351a8)

5.无效的协作团队:

数据科学和人工智能是一个庞大的课题。有时,你不可能独自完成所有的项目,需要有效的团队合作才能成功。

这一点集中在一群朋友,一个新成立的团队或一起工作的公司,或其他类似的小组工作,爱好者试图协调起来实现一个类似的目标。

通常,当意识形态没有适当的协调和匹配时,可能会有一些自我冲突、分歧、不必要的争论和其他故障,导致灾难性的经历,并最终导致项目的失败。

作为一个团队一起工作是很重要的,因为需要对正在进行的项目进行一致的信息交流。因此,这项工作需要数据科学家共同努力,找出可能的最佳解决方案,提高模型准确性,并在部署期间产生高质量的结果。

为了在任何类型的项目中获得最佳结果,团队的所有成员都需要能够以有效的方式分享他们的个人研究和工作,并尽最大能力进行交流。没有共同的努力,项目的总体进展将受到阻碍。

6.未能适应和优化:

在你攀登伟大的阶梯时,数据科学唯一不变的是改变

为了在数据科学和人工智能领域取得成功,最关键的特征之一是有效适应和优化的能力。

在不久的将来,经常用于解决特定任务的算法或方法可能会被更好的技术所取代。

在 2010 年代初赢得几场比赛的大多数迁移学习模型现在已经被更好的迁移学习方法所取代,以完成复杂的问题。

物体检测算法进化的类似例子也是机器学习和人工智能领域快速发展的一个很好的例子。

我们从 SIFT 和 HOG 算法转向更先进的技术,如 YOLO、单次检测器、Mask R-CNN 和其他类似的方法,以实现最佳结果。

因此,让自己了解人工智能领域的所有新兴技术是非常重要的。为此,借助博客、研究论文和视频,让自己了解最新的话题。

结论:

费尔南多·巴西在 Unsplash 上的照片

“失败应该是我们的老师,而不是我们的承担者。失败是拖延,而不是失败。这是暂时的迂回,不是死路一条。失败是我们只有通过什么都不说、什么都不做、什么都不是才能避免的。” —丹尼斯·威特利

当你着手一个复杂的项目并从零开始工作时,在多次尝试中没有达到最好的结果是绝对没问题的。数据科学和人工智能是需要不断学习和努力的两个领域。整个经历是一个有趣而精彩的旅程,以取得巨大的成果。

在本文中,我们讨论了导致数据科学和人工智能项目失败的六个主要因素。我们还简要讨论了相应出现的每个问题的一些最佳修复方法。值得注意的是,当你着手下一个大项目时,要记住这些,这样你就能确保在需要时有所有潜在的解决方法。

如果你想在我的文章发表后第一时间得到通知,请点击下面的链接订阅电子邮件推荐。如果你希望支持其他作者和我,请订阅下面的链接。

https://bharath-k1297.medium.com/membership

如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。

看看我的其他一些文章,你可能会喜欢读!

</5-best-python-projects-with-codes-that-you-can-complete-within-an-hour-fb112e15ef44> </17-must-know-code-blocks-for-every-data-scientist-c39a607a844d> </14-pandas-operations-that-every-data-scientist-must-know-cc326dc4e6ee>

谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!

优化 Spark 作业的 6 条建议

原文:https://towardsdatascience.com/6-recommendations-for-optimizing-a-spark-job-5899ec269b4b?source=collection_archive---------0-----------------------

六项建议的指导方针,可快速优化您的 Spark 工作

用例的省时优化示例。作者图片

Spark 是目前处理大数据集的必备工具。这项技术已经成为数据工程中许多商业应用的首选。这一势头得到了托管服务的支持,如 数据块 ,它们降低了与购买和维护分布式计算集群相关的部分成本。最著名的云提供商也提供 Spark 集成服务( AWS EMRAzure HDInsightGCP Dataproc )。

Spark 通常用于对数据进行转换,在大多数情况下是结构化的。它在两种情况下特别有用。当要处理的数据对于可用的计算和内存资源来说太大时。这就是我们所说的大数据现象。最后,当一个人想通过使用同一网络中的几台机器来加速计算时,这也是一种选择。在这两种情况下,主要关心的是优化火花作业的计算时间。

为了应对这个问题,我们经常增加分配给一个计算集群的资源。从云提供商那里租赁计算能力很容易,这鼓励了这种趋势。

本文的目的是提出一个在资源有限的情况下优化 Spark 作业的策略。事实上,在使用团簇弹性之前,我们可以影响许多火花配置。因此,这种策略可以先进行测试。

为了避免对最佳配置设置的彻底搜索,这自然是非常昂贵的,这篇文章将展示可行的解决方案,以最大化我们减少计算时间的机会。每一步都将通过一个尽可能合理的建议来实现

提出的策略被认为是贪婪的,也就是说,我们在过程的每个阶段都做出最佳选择,而不会走回头路。这种方法由六条建议的指南来说明。

指导方针的六条建议。作者图片

目的是提供一个清晰的方法,易于在各种用例上测试。然后,有必要在一个可共享的示例上测试这些建议,并给出一个 模板代码 ,允许在另一个 Spark 作业上重复这个实验。

在玩具用例上的应用

为了评估本文中提出的优化策略,我们使用了一个玩具用例来设计一个 Spark 作业。这个过程根据天气和人口变量对法国城市进行分组。这个任务在机器学习中叫做无监督分类或者聚类。该示例说明了 Spark 流水线的共同特征,即数据预处理阶段(加载、清理、不同源的合并、特征工程)、对机器学习模型参数的估计,以及最终将结果存储到磁盘。关于这个实验的更多细节可以在代码库上找到。

通过一步一步地遵循本文中详细介绍的建议,我们可以观察优化提示和技巧对下图的影响。

作者图片

找到的配置设置很可能是一个次优解决方案。然而,它提供了一个比穷举搜索更快的选择,尤其是在大数据处理环境中。

关于 Spark 和一些有用概念的快速提醒

三言两语擦出火花

Apache Spark 是用于大规模数据处理的分析引擎。它提供了一个接口,用于通过隐式数据并行容错对整个集群进行编程,并将中间结果存储在存储器 (RAM 和磁盘)中。

Spark 的核心处理广泛使用了函数编程来解决大数据中的放大问题。因此,源代码主要在 Scala 中编码是很自然的。

然而,Spark 也在更高的层次上提供了 Python、Java、R 和 SQL 中的API,在大多数情况下提供了几乎等同的可能性而没有任何性能损失(例如除了 UDF 函数)。该项目是根据 Apache 2.0 许可的开源

下图描述了分布式计算集群中 Spark 处理的经典操作。

作者图片

火花驱动器,也称为主节点,协调处理的执行及其在火花执行器(也称为从节点)之间的分配。驱动程序不一定由计算集群托管,它可以是一个外部客户端。集群管理器实时管理集群的可用资源。它比 Spark 应用程序有更好的概述,如果可用,它将请求的资源分配给 Spark 驱动程序。在本文中,将不讨论集群管理器的使用。

分解火花作业

作者图片

Spark 作业是由任务组成的一系列阶段。更准确地说,它可以用一个有向无环图(DAG) 来表示。 Spark 作业的一个例子是 提取转换日志(ETL) 数据处理流水线。阶段通常由执行节点之间的网络中的数据传输来界定,例如两个表之间的连接操作。最后,任务是 Spark 中分配给数据分区的执行单元

懒评

懒评是大数据处理常用的一招。事实上,当数据超过内存资源时,需要一种策略来优化计算。惰性评估表示仅当火花动作运行时触发处理,而不是火花转换

火花动作和转换的例子。作者图片

在调用动作之前,不会执行转换。这允许 Spark 准备一个逻辑和物理执行计划来有效地执行动作。

让我们举一个例子来理解为什么这很有用。在几次转换后,调用一个动作将一个数据帧的第一行返回给驱动器。然后,Spark 可以通过管理内存和计算来重新组织之前转换的执行计划,从而更快地获得第一个转换后的行。事实上,只有包含该数据帧第一行的数据的分区需要被处理。这大大减少了不必要的内存和计算处理。

宽窄变换

火花变换分为两类:变换。这两种类型的区别在于需要在执行节点之间重新分配网络中的数据分区。这一重大事件在 Spark 术语中被称为洗牌

作者图片

需要洗牌的宽变换自然是最贵的。处理时间会更长,这取决于集群中交换的数据的大小和网络延迟。

如何修改 Spark 作业的配置设置?

有三种方法可以修改 Spark 作业的配置:

  • 通过使用 Spark 根文件夹中的配置文件。例如,我们可以自定义以下模板文件:
    conf/spark-defaults . conf . template
    conf/log4j . properties . template
    conf/Spark-env . sh . template
    这些更改会影响 Spark 集群及其所有应用程序。
  • 使用命令行使用 — conf 参数
    例如:

  • 直接在中输入火花应用代码 Ex:

  • 首先考虑配置文件中定义的值。接下来,参数作为参数传递给 spark-submit 。最后是那些直接在应用程序代码中配置的。

这些配置参数在 Spark GUI环境选项卡中是只读的。

作者图片

在与本文相关的代码中,参数直接在 Spark 应用程序代码中定义。

预备步骤:衡量优化是否必要

在项目中,优化流程是一个耗时且成本高昂的步骤。必须事先说明理由。
通常,约束与用例相关联,并在与涉众的服务水平协议 ( SLA )中定义。我们监控相关指标(例如处理时间、分配的内存),同时检查它们是否符合 SLA。
估计优化应用程序并达到目标所需的时间并不容易。它通常需要软件工程方面的经验。本文并没有假装这样做,而是旨在建议可以快速使用的行动。
另一方面,这些建议提供了需要改进的地方。从一个人治疗的简介开始可能会很有趣。这将针对最相关的建议进行触发。

建议 1:使用 Apache Parquet 文件格式

Apache Parquet 格式正式成为面向列的存储。其实更多的是行列存储之间的混合格式 。用于表格数据。同一列中的数据是连续存储的。

作者图片

当对列的子集和大型的数据框架执行查询(转换)时,这种格式特别合适。这是因为它仅将与所需列相关联的数据加载到存储器中。
此外,由于压缩方案编码根据类型化而特定于每一列的,因此它改善了这些二进制文件的读/写及其在磁盘上的大小。
这些优势使其成为 CSV 格式的一个非常有趣的替代方案。这是 Spark
推荐的格式,也是写的默认格式。
如果 Spark 与 数据块 一起使用,另一个特别有趣的格式是 delta 格式,它提供了自动优化工具。在本文中,我们将重点介绍 Spark 的开源版本。然而,强烈建议感兴趣的读者探索 Spark 与 Databricks 生态系统的集成。

建议 2:最大化 Spark 中的并行性

Spark 的效率基于其大规模并行处理多个任务的能力。因此,我们越是促进任务的分解,任务完成得就越快。这就是为什么优化 Spark 作业通常意味着并行读取和处理尽可能多的数据。而要实现这个目标,就需要把一个数据集分割成几个分区

数据集进行分区是一种将数据排列成磁盘上连续数据块的可配置、可读子集的方式。然后,可以独立并行地读取和处理这些分区。正是这种独立性使得海量数据处理成为可能。理想情况下,Spark 为每个任务和每个 CPU 内核组织一个线程。每个任务都与一个分区相关。因此,第一直觉是配置至少与可用 CPU 核心数量一样多的分区。在执行 Spark 作业的大部分时间里,所有内核都应该被占用。如果它们中的一个在任何时候可用,它应该能够处理与剩余分区相关联的作业。目标是通过将 Spark 作业阶段分成大量任务来避免瓶颈。这种流动性在分布式计算集群中至关重要。下图说明了网络中机器之间的这种划分。

作者图片

可以创建分区:

  • 读取数据时通过设置spark . SQL . files . maxpartitionbytes参数(默认为 128 MB)。
    一个好的情况是数据已经存储在磁盘的几个分区中。例如, parquet 格式的数据集,其文件夹包含大小在 100 到 150 MB 之间的数据分区文件。
  • 直接在 Spark 应用程序代码中使用 Dataframe API。一个例子:

这最后一种方法联合减少了分区的数量,同时避免了网络中的洗牌

人们可能想通过降低参数spark . SQL . files . maxpartitionbytes的值来增加分区的数量。但是,这种选择会导致小文件问题。由于文件系统执行的操作(例如,打开、关闭、列出文件),会导致 I/O 性能下降,这种情况通常会随着像 HDFS 这样的分布式文件系统而加剧。如果分区数量太大,也会出现调度问题。

在实践中,这个参数应该根据可用资源根据经验来定义。

建议 3:小心洗牌操作

Spark 中有一种特殊类型的分区叫做洗牌分区。这些分区是在涉及混洗的作业阶段创建的,即当执行宽转换(例如 groupBy()、join())时。这些分区的设置会影响网络和读/写磁盘资源

可以修改spark . SQL . shuffle . partitions的值来控制分区的数量。默认情况下,该值设置为 200,对于某些处理来说,这个值可能太高了,会导致执行节点之间在网络中交换太多的分区。该参数应根据数据的大小进行调整。直觉可能是以至少等于集群中 CPU 核心数量的值开始

Spark 将混洗操作的中间结果存储在执行器机器的本地磁盘上,因此磁盘的质量,尤其是 I/O 质量非常重要。例如,使用 SSD 磁盘将显著提高此类转换的性能。

下表描述了我们也可以影响的主要参数。

建议 4:使用广播散列连接

几个数据帧之间的连接是一个常见的操作。在分布式环境中,执行节点之间在网络中交换大量数据来执行连接。根据表的大小,这种交换会导致网络延迟,从而降低处理速度。Spark 提供了几种连接策略来优化这种操作。其中有一个如果可以选择的话特别有意思:广播哈希加入(BHJ)

当合并的数据帧中的数据帧“足够”小,可以在所有执行节点(广播操作)的内存中复制时,这种技术是合适的。下图说明了这种策略的工作原理。

作者图片

第二个数据帧被传统地分解成分布在集群节点中的分区。通过复制最小的表,除了预先广播该表之外,连接不再需要集群中的任何重要数据交换。这种策略极大地提高了连接的速度。要修改的 Spark 配置参数是Spark . SQL . autobroadcasthashjoin。默认值为 10 MB,即如果两个表中的一个小于该大小,则选择该方法。如果有足够的内存可用,那么增加这个值或将它设置为-1 以强制 Spark 使用它可能会非常有用。

建议 5:缓存中间结果

为了优化计算和管理内存资源,Spark 使用惰性评估DAG 来描述作业。这提供了在动作之前快速重新计算步骤的可能性,如果必要的话,因此只执行 DAG 的一部分。为了充分利用这一功能,非常明智的做法是存储昂贵的中间结果,如果有几个操作在 DAG 的下游使用它们的话。实际上,如果一个动作正在运行,其计算可以基于这些中间结果,因此在该动作之前仅重放 DAG 的子部分。

让我们以下面的 DAG 为例:

作者图片

为了获得这两个动作的结果,在下面的两个 Dag 中描述了处理。

作者图片

为了加速执行,可以决定缓存中间结果(例如连接的结果)。

作者图片

现在简化了第二个动作的处理。请注意,在第一次操作期间,结果尚未存储在内存中。

作者图片

如果这种缓存可以加速作业的执行,那么当这些结果被写入内存和/或磁盘时,我们就要付出的代价。应该在处理流水线的不同位置测试节省的总时间是否超过成本。当 DAG 上有多条路径时,这一点尤其重要。

缓存两列模拟表节省时间的示例:

注意:缓存和任何火花转换一样,是在运行动作时执行的。如果该动作的计算仅涉及数据的一个子部分,则仅存储该子部分的中间结果。在前面的示例中,如果调用了收集第一行的 take(1) 操作,那么只有包含第一行的分区会被缓存。

可以使用以下命令缓存表:

下表描述了不同的缓存选项:

选项的完整列表可在此处获得。

建议 6:管理执行器节点的内存

Spark 执行器的内存分解如下:

作者图片

默认情况下,spark . memory . fraction参数设置为 0.6。这意味着一旦保留的内存被移除,60%的内存被分配用于执行,40%用于存储。默认情况下这是 300 MB,用于防止内存不足(OOM) 错误。

我们可以修改以下两个参数:

  • spark . executor . memory
  • spark . memory . fraction

结论

在本文中,我们详细介绍了一个优化 Spark 作业的策略。其主要目标是为那些希望优化流程但时间有限的人提供一个框架。贪婪方法的六个建议的指导方针旨在最大化减少计算时间的可能性。下图通过关联每个阶段的建议总结了建议的方法。

作者图片

这个过程中每一步的价值都是根据 Spark 的操作来解释的。事实上,即使对配置提出了一些建议,理解它在引擎盖下如何工作也是至关重要的。每个用例都有自己的特点,没有一种方法是通用的。在这方面,本文介绍了 Spark 中的优化。

更进一步

  • 本文旨在避免在集群中系统地使用动态资源分配来加速处理。尽管如此,研究它当然是有趣的。Spark 提供了以下参数来根据工作负载管理集群的弹性:
    spark . dynamic allocation . enabled,
    spark . dynamic allocation . minexecutors,spark . dynamic allocation . schedulerbacklogtimeout,spark . dynamic allocation . max executors,spark . dynamic allocation . executorid time out
  • Spark 中还有很多其他的表连接策略:https://databricks . com/session/optimizing-Apache-Spark-SQL-joins
  • 当然,Spark 非常重视优化其处理。为了更深入地了解内部工作和当前项目,以下链接可能会有用:钨项目Catalyst 优化器自适应查询执行(3.0 版本中的新特性)

感谢阅读;)

6 篇关于机器学习部署阶段的研究论文

原文:https://towardsdatascience.com/6-research-papers-about-machine-learning-deployment-phase-11866c1ab657?source=collection_archive---------17-----------------------

采用学术思维和习惯

安妮·斯普拉特在 Unsplash 上的照片

初学者的错误是忽视研究。阅读研究是令人畏惧的,尤其是当你不像我一样来自学术背景的时候。尽管如此,这件事还是应该做。

忽视研究很容易导致你的技能落后,因为研究描绘了当前正在解决的问题的范围。因此,作为一名机器学习实践者,要保持相关性,就需要(在某种程度上)采用学术思维和习惯。

对于我的研究,我已经策划了 6 篇研究论文,我将阅读这些论文以了解更多关于未来机器学习部署的信息。以下是按非时间顺序排列的研究论文:

1.

部署机器学习的挑战:案例研究调查 Paleyes 等人,2021 年 1 月

在生产系统中部署机器学习模型期间,机器学习实践者和研究人员面临许多挑战。

“这项调查回顾了在各种用例、行业和应用中部署机器学习解决方案的已发布报告,并提取了与机器学习部署工作流程的各个阶段相对应的实际考虑因素。我们的调查显示,从业者在部署的每个阶段都面临挑战。本文的目标是制定一个研究议程,探索应对这些挑战的方法。”

2.

机器学习系统中隐藏的技术债务 斯卡利等人,2015 年 12 月

这是一篇流行的论文,试图从成本的角度记录现实世界中机器学习的现实。论文指出,“机器学习为快速构建有用的复杂预测系统提供了一个非常强大的工具包。这篇论文认为,认为这些快速成功是免费的是危险的。

本质上,本文的目标是探索在现实世界中实现机器学习所涉及的不同的 ML 特定风险。

3.

一个系统视角到生产机器学习领域的再现性 甘塔等人,2018 年 6 月

机器学习中并不总是被吹嘘的部分是物流,但它的重要性是巨大的。为了再现已经部署在生产中的机器学习流水线,机器学习实践者必须捕捉模型的历史状态以及其当前状态。这是一项极其复杂的任务,但这篇论文据称有一些解决方案。

“我们展示了一个从系统角度解决这些问题的系统,使 ML 专家能够在生产中跟踪和再现 ML 模型和管道。这有助于快速诊断生产中出现的问题。”

4.

机器学习的软件工程:案例研究Amershi 等人,2019 年 5 月

与许多公司不同,微软多年来一直在实施机器学习。从他们丰富的经验中,微软试图分享他们认为应该作为其他开发人工智能应用程序和数据科学工具的组织的一套最佳实践。

“我们已经确定了人工智能领域的三个方面,这些方面使它与以前的软件应用领域有着根本的不同:

  1. 与其他类型的软件工程相比,发现、管理和管理机器学习应用所需的数据要复杂和困难得多
  2. 模型定制和模型重用需要与软件团队中常见的技能非常不同的技能
  3. 与传统软件组件相比,人工智能组件作为不同的模块更难处理——模型可能以复杂的方式“纠缠”在一起,并经历非单调的错误行为。”

5.

ML 测试分数:ML 生产准备就绪和技术债务削减的一项指标 Breck 等人,2017 年 12 月

在我名单上的所有论文中,我对这篇论文最不熟悉(意思是我最近才碰到它)。在摘要中,作者表示他们将“提出 28 个具体的测试和监控需求,这些测试和监控需求是从大量生产 ML 系统的经验中得出的,以帮助量化这些问题,并提出一个易于遵循的路线图来提高生产就绪性和偿还 ML 技术债务。”。

6.

构建可复制的机器学习流水线 杉村。哈特尔。F ,2018 年 10 月

所有机器学习从业者(即工业界或学术界)都需要建立可复制的模型。如果没有办法恢复过去的实验,不这样做可能会导致重大的经济损失、时间损失和个人名誉损失。本文涵盖了实践者在机器学习工作流程的整个生命周期中可能面临的再现性的各种挑战。本文接着描述了作者创建的一个合适的框架,以克服上述挑战。

“该框架由四个主要组件(数据、特征、评分和评估层)组成,这些组件本身又由定义明确的转换组成。这使得我们不仅能够精确地复制一个模型,而且能够跨不同的模型重用转换。因此,该平台极大地提高了离线和在线实验的速度,同时还确保了模型的重现性。”

这份清单绝非详尽。吴恩达建议从业者应该阅读[并理解]50-100 篇关于一个主题的论文,以便对该领域的需求有非常深刻的理解。

理解研究论文不仅仅来自于阅读大量的研究。你可能需要偏离可信的在线资源,如博客文章和视频内容。因此,我添加了一些有价值的资源,以便更容易理解机器学习部署。

包裹

许多从业者陷入了思维陷阱,认为他们不需要阅读研究论文——这经常发生在不那么学术的从业者身上(像我一样)。决定忽略研究很容易导致你在这个领域落后,因此重要的是要有一个学术头脑和习惯,同时仍然要实际应用自己。

感谢阅读!

如果你喜欢这篇文章,请通过订阅我的每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。

相关文章

** https://medium.datadriveninvestor.com/machine-learning-model-deployment-b1eaf7ca96cd </4-machine-learning-system-architectures-e65e33481970> **

帮助您赢得数据科学面试的 6 种资源

原文:https://towardsdatascience.com/6-resources-to-help-you-ace-your-data-science-interview-6a4ef973e90b?source=collection_archive---------6-----------------------

刷新和测试你的知识,为成功做好充分准备。

多梅尼科·洛亚在 Unsplash 上拍摄的照片

当人们将数据科学称为一个领域时,我经常会对自己说:“那不是 100%准确的”!。数据科学不仅仅是一个领域;更确切地说,它是一些领域的集合,这些领域被一起用来建造一些令人惊奇的东西。数据科学同时是数学、统计学、解决问题、模式发现、通信和商业。

由于数据科学领域是如此广泛和相互关联,在这个领域迈出任何一步都可能看起来如此困难和复杂,从尝试学习到求职,寻找正确的角色,最后在面试中脱颖而出,但是,尽管这个领域很复杂,如果你有明确的步骤可以遵循,进入数据科学领域并找到工作就不会那么令人困惑。

</6-machine-learning-certificates-to-pursue-in-2021-2070e024ae9d>

我写了多篇文章,讨论如何进入数据科学,需要学习什么,为了顺利进行学习应该按照什么顺序学习,以及在每个步骤中使用什么样的最佳资源。然而,一旦你学会了基础知识,开发了一些项目,探索了不同的数据集,并建立了一个体面的投资组合,一个新的挑战出现在你面前。

如何做好充分准备才能在面试中胜出,在人群中脱颖而出,获得你想要的工作?

这篇文章将带你浏览 6 种不同的资源,你可以使用它们,并且有望帮助你做好充分准备,在下一次面试中胜出,获得这份工作。这些资源将帮助您更新该领域不同构件的知识,以及同时涵盖所有构件的一般问题。

让我们直接进入…

编程;编排

尽管数据科学的某些方面不需要任何编码,但任何数据科学应用程序的核心都必须经过编程。由于数据科学在各个领域都有许多应用,因此可以使用不同的编程语言来构建项目。但是,不管你使用什么编程语言,Python、R、Matlab、Golang 或任何其他语言,你都需要加强编码技能,以便在数据科学领域找到工作。

</5-data-science-programming-languages-not-including-python-or-r-3ad111134771>

好消息是,通常在面试中,公司会允许你使用任何你最熟悉的编程语言来解决算法编码面试问题。为了准备这样的问题,你可以使用像 LeetCode 或者 HackerRank 这样的资源。如果你理解了 t ime 复杂性Python 技巧和提示以及数据结构&算法,这也会很有用。

数学和统计

数据科学就是数学和统计学。从概率论到线性代数,使用数学魔法可以让我们理解数据,发现数据中的趋势和模式,并构建算法来预测未来的数据科学数学和统计对数据科学至关重要;他们总是在数据科学采访中被问到。

根据你申请的职位,统计问题的复杂程度会有所不同。初级职位会有更多的基本统计问题,但高级职位会有实际和现实生活场景形式的统计问题。您可以使用 William Chen 的概率备忘单、c 常见概率分布和这些 40 题来练习和更新您的知识。

数据处理和 SQL

没有数据,就无法拼出数据科学。每个数据科学家都应该掌握的一项基本技能是处理数据。从数据收集到清理,再到探索和分析,所有技能每天都在每个数据科学项目中使用。一旦面试官测试你编码和思考不同算法问题的能力,他们会给你数据科学问题来测试你的数据处理技能。

在面试的这一阶段,您需要使用 Python、R 和 SQL 来清理、探索和分析给定的数据集。我最喜欢练习的一些资源是 SQL 问题如何编写高效的查询和这些熊猫练习

机器学习和算法

机器学习是许多数据科学应用的核心。虽然你可能不会每天在工作中编写机器学习算法,但你需要非常熟悉基本的机器学习算法。你需要能够根据特定的数据集或特定的问题提出机器学习算法。声明。

更新你的知识的一个很好的资源是这些 12 美元的机器学习抽认卡。它们很简单,使记忆机器学习基础知识成为一项简单的任务。你可能想看看其他不错的资源,包括 100 天机器学习代码信息图41 个机器学习问题遍历一个机器学习问题

</5-types-of-machine-learning-algorithms-you-need-to-know-5ac7fce8920d>

项目验证

任何数据科学项目的主要步骤之一是验证步骤。在你训练和开发你的模型之后的一步,是时候检查它是否按照你期望的方式运行了。确保您的模型正确运行对您的公司和客户至关重要,因为任何错误都可能导致金钱和资源的损失。

虽然数据科学项目的这一方面并不总是在面试中被问到,但万一他们问起,这是很有价值的知识。进行验证的资源包括 A/B 测试面试问题运行 A/B 测试时要避免什么、tI 型与 II 型错误以及 gA/B 测试指南

一般

除了关于该领域的特定构建模块的问题,您还会经常被问到一般的数据科学问题,以测试您将这些构建模块组合在一起并开发完整项目的能力。

</6-technical-concepts-often-asked-about-in-data-science-interviews-96271e60c7ef>

在面试的这一部分,将会给你一个现实生活中的数据科学问题,并要求你完成解决给定问题的所有步骤。一些很棒的资源可以浏览,例如,问题有 120 个数据科学面试问题,GitHub repo, 109 个常见的数据科学面试问题,以及 3 t 种数据科学面试问题

外卖食品

数据科学求职过程是最具挑战性的求职过程之一。寻找数据科学领域的工作角色可能相当困难;一个主要原因是角色名称和描述的模糊性。它们似乎都互相重叠,让人很难为自己能力的完美角色而高兴。

这种含糊不清只会让准备面试变得更加麻烦。毕竟,你怎么能为一个模糊的角色做准备呢?幸运的是,如果你练习了这个领域的基本构建模块,然后练习了一些关于不同算法的一般性问题,你就有了一个强有力的组合来保证你得到这份工作。

在本文中,我向您推荐了 6 类资源,涵盖了数据科学的所有组成部分,让您为下一次面试做好充分准备。如果你记得永不放弃,经历求职之旅将是最好的选择;继续努力提高你自己和你的技能,你的努力会有回报的。

祝你好运。

我职业生涯中期转向数据科学的 7 个简单提示

原文:https://towardsdatascience.com/6-simple-tips-for-mid-career-switchers-a5902e645cf8?source=collection_archive---------7-----------------------

如果你正考虑在职业生涯中期转行到数据科学或任何其他领域,可以考虑一些通用技巧。

马丁·比约克在 Unsplash 上的照片

对任何人来说,在职业生涯中期做出转变从来都不是一个容易的决定,更不用说进入数据科学这样的技术领域了。这需要大量的反思、沉思、指导和勇气,尤其是如果你已经从原来的工作开始,期望走得更远、爬得更高。

与此同时,如果你发现自己正在考虑职业生涯中期的转换,也不应该感到惊讶。老实说,对我们大多数人来说,职业抱负随着我们所处的人生阶段而发展。

反正它应该

在职业生涯的开始,你年轻而充满活力。你不怕挑战自我,尝试不同的事物。

当你组建家庭时,其他事情开始需要你的时间和精力——你的配偶、大家庭、孩子。可以理解的是,在你投入工作的时间里,你需要更有效率,或者在你所做的工作中更有策略。

或者,你可能有自己的动机被吸引到数据科学领域。

这些都完全合理。

人们甚至可以说,在这个数字时代,换工作应该成为一种新常态。

不管你的故事是什么,如果你正在考虑职业生涯中期的转换,你肯定不是一个人。去年,我在职业生涯中期从警务转向了数据科学,下面是我的故事:

https://medium.com/codex/why-made-me-switch-careers-from-policing-to-data-science-d07cc797ff1a

经历过这个过程后,我有了后知之明来反思是什么让我走上这条路,是什么给了我这样做的信念。

在这篇文章中,我将这些想法整理成 7 个简单的通用提示,当你在职业生涯中期转向数据科学或任何其他领域时,应该考虑这些提示。

职业生涯中期转换的小贴士

1.了解你自己

首先,你需要了解自己。你需要非常清楚你的生活重点是什么,你当前的职业目标是什么,以及这两者是否一致。

你可能想问自己的一些问题是:

  • 你仍然从目前的工作中获得满足感和意义吗?
  • 你现在的工作有利于成家吗(假设这是你想要的)?
  • 你现在的工作还在学习和成长吗?
  • 你认为你目前的工作有长远的前景吗?

如果你是数据科学的新手,你也应该清楚你对数据科学的兴趣是暂时的,你只是喜欢学习(即我喜欢称之为“休闲学习”)还是真的想把它变成职业。给你自己一些时间来思考这个问题。

2.与人交谈

一旦你理清了你的优先事项和职业抱负,你应该和你信任的人——你的配偶、家庭成员、好朋友——谈谈。告诉他们你正在经历什么,问他们如果他们处在你的位置会怎么做。

安德鲁·怀斯在 Unsplash 上的照片

倾听他人的观点可以给你新的视角,这反过来会给你更大的动力,也许会推动你朝着正确的方向前进。

它还能让你看到你以前从未考虑过的选择。或者,谁知道呢,你甚至可能与那些能为你打开新机会之门的“合适”的人有联系。

3.写下你的理由

一旦你决定转行,我强烈建议你做的第一件事就是写下你转行的理由。

这可以是一篇博文、一条推文、一个 Instagram 故事、一篇脸书帖子,甚至是你办公桌前的一张便利贴。我通过在介质上写上面的反射片来做我的。这个简单的练习可以帮助你明确你的想法和动机。

凯利·西克玛Unsplash 上拍摄的照片

我们都是人,将来可能会有一天,你会开始重新考虑你的决定。对我来说,这真的是正确的选择吗?这是正确的时间吗?我能胜任下一份工作吗?

当这些消极的想法开始蔓延时,回头看看你写了什么。它可以有力地提醒你为什么做出这个决定。更重要的是,它提醒你,你已经过了那个决定点,所以唯一的办法就是向前看,继续前进。

4.规划你的财务

我们不要自欺欺人了。成功的职业转换需要做大量的准备工作,并弄清楚如何实现。这需要时间、纪律、专注和决心。

要计划的最重要的事情之一是你的财务状况。想想你每月的开销——账单、房屋抵押贷款、贷款、其他必需品等等。—以及你是否有足够的积蓄度过难关。如果你正处于职业生涯的间歇期,即一段时间内没有任何收入,这一点尤为重要。

乔希·阿佩尔在 Unsplash 上的照片

此外,如果你很可能在下一份工作中被减薪,你应该仔细评估你是否认为这是一个值得的举动,以换取你在工作满意度方面的潜在收益。

5.规划您的学习路线图

你需要计划的另一个重要方面是你的学习路线图,特别是如果你正在进入像数据科学这样的技术领域,而且你是新手。

几乎可以肯定的是,您需要掌握新的技能——Python、R 和 SQL 是更常见的编程语言。对你来说,学习统计学、机器学习和深度学习等其他相关主题也是必不可少的。

有很多在线学习平台——Coursera、Udemy、Datacamp、Dataquest、Codecademy、Leetcode 等等——你不可能什么都做。所以,你真的需要计划和优先选择哪些课程来投入你的时间。

你也应该计划并留出时间做一些个人的业余项目或游戏比赛。这是为了给你的潜在招聘人员某种程度的保证,尽管你从不同的职业转行,但你在数据科学方面并非完全没有经验。

我无意在本文中为学习数据科学制定路线图,但这里有一些不错的资源供您参考:

除了财务和学习之旅,你可能还需要考虑其他因素。我不可能在这里把它们列出来,毕竟,你可能会有自己独特的情况。

底线是,确保你做好计划和准备

"计划就是把未来带入现在,这样你现在就可以做些事情了."—艾伦·莱克因

6.接受挑战

一旦你认为你已经准备好了 50-70 %,那就开始吧。投一份体面的简历,列出你想申请的工作,然后开始申请。

如果你觉得你没有“检查所有的盒子”,不要太紧张。无论如何,这几乎是不可能的。

“招聘启事的真相是,它们并不总是由招聘经理撰写的,有时它们是泛泛而谈、过时的。不要自我排斥。让市场来决定”。LinkedIn 上的 Daliana Liu

让自己经历面试过程,不要把事情看得太重。把前几次面试当作一个学习过程。你很可能会发现招聘者通常在寻找什么,以及你的知识差距在哪里。

例如,如果面试过程包括 SQL 的现场编程测试,这是你知道自己的弱项,你可能会在面试中妥协,但至少你知道这是你需要在未来的面试中更加努力的地方。

7.期待意想不到的事情

在你的职业转型过程中,也不要期望事情会一帆风顺。一路上会有坎坷。你可能不会进入面试的候选名单。你可能无法通过某些技术评估。你可能在面试中表现不佳,最终错失良机。

这就是为什么从一开始,我们就为意外事件做好准备是很重要的。通过这样做,我们能够更有效地应对失败。

"永远期待意想不到的事情,这样当意想不到的事情发生时,它就不那么出乎意料了."

勇敢,大胆,永远保持积极的心态。相信自己。相信当一扇门关闭时,另一扇门会打开。

最后的想法

太多时候,我们发现自己对离开职业犹豫不决,即使有危险信号。那很好。每个人的情况都是独特的,所以每个人都有自己的。

我也不主张在你的工作出现一丁点不愉快的时候就跳槽。那也不理想。你应该一直努力坚持下去,让事情进展顺利。

然而,如果你发现你的经验、技能和抱负可以引领你去其他地方,那么职业转换可能正是你需要的焕发活力和激情的火花。

如果你正在考虑转行,我希望这些建议对你有所帮助,特别是如果你正在考虑进入数据科学领域。

无论你决定转行到哪个领域,我的临别建议是:一旦你决定中途转行,就不要后悔提醒自己 当初为什么这么做,继续向前看

万事如意!

目前就这些。感谢阅读这篇文章!如果你觉得这篇文章有用,请在评论中告诉我。我总是觉得听到别人的职业生涯中期变化的故事很鼓舞人心,所以如果你有类似的故事分享,我真的很有兴趣知道。请随时关注我的媒体或通过 LinkedInTwitter 联系我。祝您愉快!

6 SQL 窗口函数编码排序问题

原文:https://towardsdatascience.com/6-sql-window-functions-coding-problems-on-ranking-interview-countdown-p1-9be0ccf66453?source=collection_archive---------3-----------------------

面试倒计时 P1:SQL 面试快到了,你正在寻找一些有挑战性的练习来测试你的准备情况?你来对地方了!

特里斯坦·加塞特在 Unsplash 上拍摄的照片

> > >还不是中等会员?考虑与我的 推荐链接 注册,以获得 Medium 提供的一切服务,费用低至每月 5 美元

你的面试倒计时开始了吗?

恭喜你!如果你正在阅读这篇文章,你可能已经通过了第一轮筛选面试,并被邀请进入下一步:一轮 SQL 编码

无论你的下一次面试是在 24 小时后还是 2 周后,有一件事是肯定的:当你通过解决实际的练习来尽最大努力复习最常见的 SQL 主题时,时间正在流逝。

为了帮助你测试你的知识,并意识到 SQL 窗口函数的流行程度,下面我分享了一些具有挑战性的排名练习,通过重新创建你与技术面试官的互动。

这一切都是巧合,但我想不起在我的任何一次 SQL 面试中,没有人要求我使用窗口函数来解决问题。

称之为巧合吧,但我想不起在我的任何一次 SQL 面试中,没有人要求我使用窗口函数解决问题。我建议您特别注意 RANK()DENSE_RANK()ROW_NUMBER(): 这些函数可用于对特定窗口内的数据进行排名,或者,如果您愿意,还可以生成组内排名指数

接下来的所有编码问题都是对 SQL 挑战的细微重新解释,这些挑战来自于StrataScratch,这是一个优秀的平台,专门为希望从事数据科学或数据工程职业的人提供。

在他们的平台上,你可以找到 FAANG 和其他主要科技公司提出的最新和最现实的面试问题,并决定你是否希望使用 SQL 或 Python 来解决这些问题。

现在是时候写一些代码了!你准备好了吗?

***</7-fundamental-sql-concepts-you-will-be-challenged-with-in-faang-interviews-d26097a8d867>

问题#1— RANK()函数|难度:难

采访者: “如您所见,表格twitch _ sessions包括一个user _ id字段,该字段不是唯一的,而是在特定用户每次开始新会话时记录的。session _ type字段将告诉您在会话开始时,该特定的用户 id 是查看者还是流媒体工具":

来自 twitch_sessions 表的前几行。

面试官: “我想让你找出第一次以观众身份进行会话的用户完成的会话数量。您应该只返回他们的用户 ID 和会话数。”

预期产出:

面试官的提示: “在编写任何代码之前,我会建议你从描述你希望在这里实现什么开始。在这种特定情况下,将请求分成 2-3 个步骤可能是明智的选择。”

解决方案 A)使用 CTEs +内部连接:

我强烈建议您在编写 SQL 编码问题的解决方案时使用通用表表达式(cte)。在我看来,cte 非常简洁,可读性强,能帮助你逐步分解你的解决方案,更有效地与面试官分享你的推理。

在这种情况下,我使用了cte1来创建一个由user_id排序的排名,排序由session_start ( 是您应该关心的唯一时间戳)。然后我使用在第一次 CTE 中计算出的排名作为cte2中的过滤器,来隔离在第一次会话中观看的用户。最终,在外部语句中,我用cte2内部连接了原始表,使其像过滤器一样工作,并计算了会话数。

在这里使用rank()函数是有意义的,因为您只是在寻找第一个会话,当通过时间戳排序时,不太可能出现平局。

解决方案 B)使用子查询+ IN()运算符

解决这个问题的另一种方法是使用两个子查询。代码可能看起来更紧凑,但也更难阅读,并且无助于识别不同的步骤。如前所述,一般来说,你应该更喜欢 cte,因为它们是行业标准,而且如果你过于频繁地使用子查询,你的同事会暗地里讨厌你,😄***

问题#2 - RANK()函数|难度:中等

面试官: "表格online _ retail包含了 2010 年至 2011 年我们网站上销售的商品数据。考虑将 描述 字段作为项目名称。还为您提供了 发票日期 单价 数量:**

在线 _ 零售表的前几行。

面试官: “我问你的是找出每个月最畅销的物品,其中最畅销的物品是用公式 (单位数量) 计算出来的。请输出月份号、商品描述以及客户支付的金额。”*

预期输出:

解决方案:

显然,这个解决方案看起来很简单,但是有很多理论

参与其中。例如,要使代码紧凑,您必须知道:

  • 不能在GROUP BY子句中包含窗口函数。
  • 但是,您可以在窗口函数中嵌套聚合函数,因为窗口函数是在它们之后进行逻辑计算的。这不完全是他们教你的第一件事吧?

在这个特殊的例子中,我创建了一个按发票月份划分的排名,并使用一个聚合函数作为ORDER BY子句的参数。

在外部的SELECT语句中,我只是过滤了带有rnk = 1的条目。使用一般的rank()函数是可行的,因为问题不是要求唯一的排名值。

问题#3 — DENSE_RANK()函数|难度:简单

面试官: "表格 公寓 公寓 id 为主键,包括房产类型、床位和卧室数量、位置以及房东 id 等详细信息。你会发现这些数据非常直观。”

公寓桌前几排。

面试官: “要求很简单:根据我们网站上列出的床位数对每个主持人进行排名。请记住,一个主机可以管理多个属性。拥有最多床位的主机应排在第一位(rank = 1),拥有最少床位的主机应排在最后。拥有相同床位数的主机应该获得相同的排名,并且排名应该避免差距。”

预期输出:

解决方案:

与前面的解决方案一样,我使用嵌套聚合函数来生成一个按sum(n_beds)(注意,在窗口函数中,您可以声明一个嵌套聚合,但是您不能在别名下传递完全相同的聚合,您必须显式地键入它)。这一次的请求是在出现一个或多个平局的情况下不要在排名中引入差距,因此我使用了DENSE_RANK()函数:**

问题#4— DENSE_RANK()函数|难度:中等

面试官: “在这个问题中,你需要两张桌子。第一个是RC _ calls,包含我们的客户服务部门收到的电话的详细信息,支持我们的母公司(公司 1)和其子公司(公司 2)。第二个表RC _ users包含用户及其联系的具体公司的详细信息。我们希望了解更多关于用户扭曲我们联系率的情况。”

来自 rc_calls 表的前几行。

来自 rc_users 表的前几行。

面试官: “为了做到这一点,对于每家公司,我要求您返回致电客服最多的前 2 名用户。你应该输出company _ iduser _ id,以及用户的排名。如果有多个用户具有相同的等级,则保留所有用户。

预期输出:

解决方案:

请注意,请求是按公司返回前 2 名(组)“有问题的”客户。但是,具有相同排名的客户(只要是≤ 2)都应该显示出来,这意味着如果出现多个并列的情况,最终的解决方案可能包括 4 行以上。**

因此简单地在查询末尾使用LIMIT 4,将会导致错误的答案。取而代之的是,我使用了DENSE_RAN()将相同的等级分配给具有相同呼叫次数的所有客户,而没有在等级值之间引入差距。

问题 5 — ROW_NUMBER()函数|难度:简单

面试官: “表email _ logs以字段 id 为主键, 包含了我们电子邮件服务用户的活动信息。”

来自 email_logs 表的前几行。

采访者: “我问你的是生成和每个用户的电子邮件活动排名,其中电子邮件活动我的意思是发送的电子邮件数量。发送电子邮件数量最多的用户将被排在第一位(rank = 1),以此类推。

你应该输出用户字符串 id,电子邮件总数和他们的活动排名。请 分配唯一的排名,即使多个用户拥有相同数量的电子邮件 。按电子邮件总数降序和按用户字母顺序排列记录。”

预期输出:

解决方案:

当要求您生成一个具有唯一值或包含特定行数的排名时,您应该使用ROW_NUMBER()函数:

问题#6 — ROW_NUMBER()函数|难度:难

面试官: “在最后这个练习中,你将使用 被提名人 _ 电影记录 表格。这是一份演员名单( 姓名 )和他们参与过的电影以及他们演技的)。在提供解决方案时,请记住名称可能会出现多次,而电影 id 字段是唯一的。****

提名 _ 从影记录表的前几行

面试官: “你应该从第二部最新电影开始计算评分,并计算每一位演员和他们出演的电影的平均终身评分 。输出演员列表、他们在第二部最新电影中的评分、平均终身评分以及两个评分之间的差异(倒数第二平均)。”

预期输出:

解决方案:

请注意,我是如何使用第一个 CTE 按演员计算排名的,按电影 ID 排序(对应每个演员 ),最低的 ID 对应最近的电影),使用第二个 CTE 计算演员的平均终身评分。然后,我使用最外部的查询来计算倒数第二部电影评分和平均终身评分之间的评分差异:**

结论

在这篇关于 SQL 编码面试的第一篇文章中,我与你分享了 6 个来自真实面试的关于排名的窗口函数问题。上面分享的问题是StataScratch的财产,他们好心地授权我使用他们的一些材料来写这篇教程。如果你喜欢这篇文章的风格,我会建议你去看看他们的网站https://platform.stratascratch.com/coding?via=antonello**,在那里你会发现数百个类似的挑战。******

给我的读者的一个提示 : 这篇文章包括附属链接,如果你购买的话,我可以给你一点佣金,不需要额外的费用。

你可能也喜欢

******</8-popular-sql-window-functions-replicated-in-python-e17e6b34d5d7> </15-git-commands-you-should-learn-before-your-very-first-project-f8eebb8dc6e9> </10-algorithms-to-solve-before-your-python-coding-interview-feb74fb9bc27> ******

将机器学习项目迁移到云的 6 个步骤

原文:https://towardsdatascience.com/6-steps-to-migrating-your-machine-learning-project-to-the-cloud-6d9b6e4f18e0?source=collection_archive---------12-----------------------

实践教程

如何使用云培训资源来提升您的培训能力

杰里米·毕晓普Unsplash 上拍摄的照片

无论你是一家成长中的初创公司的算法开发人员、大学研究实验室的数据科学家,还是一名 kaggle 爱好者,总有一天你在现场的培训资源不再能满足你的培训需求。在这篇文章中,我们的目标是那些(最终)准备好将其机器学习(ML)工作负载迁移到云的开发团队。我们将讨论在这一重大转变过程中需要做出的一些重要决定。自然地,任何包含这种努力的所有步骤的尝试都注定要失败。机器学习项目有许多形状和形式,随着其复杂性的增加,像迁移到云这样的重大变化也在增加。在这篇文章中,我们将强调我们认为最重要的一些考虑因素,这些因素对于大多数典型的深度学习项目来说是共同的。

我们将使用 pytorch 版本 1.9 演示我们在一个简单的 pytorch cifar10 模型上布置的步骤,该模型摘自本 pytorch 教程。虽然我们的演示将限于特定的机器学习框架和框架版本,但我们将提出的一般要点也与其他框架和版本相关。

我要感谢 Yitzhak Levi 为这个职位做出的贡献。

为什么要在云端训练?

在开始迁移步骤之前,让我们回顾一下在云中培训的一些主要优势:

  1. 可访问性:云服务提供了对各种机器学习培训环境的访问。培训环境有两个组成部分:1 .硬件系统和 2。支持软件堆栈。云服务通常支持一长串参数不同的硬件实例类型,例如:CPU 内核的类型和数量、训练加速器的类型和数量、网络带宽、内存大小、磁盘大小等等。广泛的选择使您能够选择最适合您的项目需求的实例类型。此外,云服务提供了一长串支持各种流行培训框架的预配置软件映像。这些软件映像不仅可以为您节省大量的系统配置时间,而且通常还包括专门针对底层云环境的优化。
  2. 可扩展性:在本地培训环境中,您会受到所拥有的培训实例数量的限制,与之相反,基于云的培训环境几乎可以实现无限的可扩展性。这使得通过在多台机器上分配单个培训作业和/或并行运行多个培训实验来加速您的培训项目成为可能。
  3. 存储基础设施:您希望迁移到云的驱动因素可能来自培训相关的基础设施需求,而不是计算实例。例如,您的培训工作可能会使用非常大的数据集,以至于需要一个您无法在内部支持的存储基础架构。一旦您将数据转移到云中,您可能会发现在与您的训练数据位于同一位置的训练环境中进行训练比将数据传输到您自己的个人环境中更为理想。

鉴于这些(以及其他)优势,无怪乎有一种向云培训发展的趋势。然而,重要的是要意识到为了迁移到云,您需要对您的培训应用程序进行调整。在接下来的部分中,我们将尝试总结我们认为成功实现这一转变的一些关键步骤。

  1. 选择培训云服务
  2. 选择培训软件映像
  3. 调整您的程序以访问云中的培训数据
  4. 扩展您的程序以在多个工作人员上运行
  5. 调整您的程序以在云中运行性能分析
  6. 监控基于云的训练实验

步骤 1 —选择云服务

鉴于大量的云服务提供商和不断增加的人工智能相关产品列表,很容易看出人们可能会发现选择最佳培训服务的任务是多么艰巨。最受欢迎的云服务提供商有亚马逊网络服务(AWS)微软 Azure谷歌云平台 (GCP),它们都提供多种不同的培训选择。有人可能会说,这一步的困难是因为有大量的可能性。

许多选项之间的差异可以分为两种类型:1 .可归因于云服务的文档化功能的差异;2 .难以预料的差异,只有在实际测试云服务后才能发现。

记录的差异可能包括服务成本、支持的实例类型列表和支持的培训框架列表等参数。例如,您可能会发现最适合您的工作负载的实例类型只由一个服务提供商提供。

难以预料的差异可能包括您选择的实例类型的可用性、数据从存储中流出的速度,或者对扩展到多实例培训的限制。例如,您可能会发现,使用一种培训服务时,云存储中的数据流速度要比使用另一种服务时快得多。

不幸的是,这些难以预料的差异可能会对你的训练表现产生有意义的影响,因此在确定最适合你的训练选项时可能是决定性的。

托管与非托管培训服务

各种各样的基于云的机器学习服务使开发人员能够在广泛的抽象层次上进行交互。一方面,您将拥有只提供裸机培训实例的服务,将完整实例配置和软件堆栈创建的任务留给用户。另一方面,你会发现管理的服务,其中用户可以将训练项目的许多元素,如训练算法的选择,甚至训练数据的创建,委托给服务提供商。为了突出受管服务和不受管服务之间的一些差异,我们将提供一个如何使用每种服务类型的示例。

托管培训示例:要使用诸如 Amazon SageMakerGoogle Vertex AI 之类的服务来执行托管培训会话,您可以使用服务 API 来指定诸如培训实例类型、所需实例的数量、选择的框架和版本、培训代码的位置以及上传培训结果的路径等细节。托管服务将继续启动所请求的系统,并自动下载和运行培训代码。当训练结束时,产生的工件将被上传到预先配置的位置,并且训练实例将被终止。将记录训练会话的记录,捕获训练会话的细节,包括指向训练代码和结果工件的指针。这些捕获的记录可用于分析培训服务的使用模式,并促进更好的成本管理和治理。

托管服务可能会提供额外的功能来促进端到端的机器学习管道。例如, Amazon SageMaker 包括广泛的功能和工具,如用于标记数据的Amazon sage maker Ground Truth,用于监控和分析培训课程的Amazon sage maker Debugger,用于比较培训实验的 Amazon SageMaker Studio ,以及用于优化部署模型的 Amazon SageMaker Neo

在下面的代码块中,我们提供了一个如何使用 Amazon Sagemaker 的 python API 实例化托管 cifar10 pytorch 培训作业的示例。

from sagemaker.pytorch import PyTorch

estimator=PyTorch(entry_point='cifar10.py',
                    role=<AWS IAM role>,
                    py_version='py3',
                    framework_version='1.9.0', #pytorch version
                    instance_count=1,
                    instance_type='ml.g4dn.xlarge',
                    )
estimator.fit()

无管理培训示例:开展无管理培训课程的一种方式是:

  1. 使用 AWS EC2 或谷歌的计算引擎创建一个或多个带有您选择的机器学习软件映像的训练实例。
  2. 通过 SSH 连接到培训实例,手动配置环境,下载培训代码,并开始培训会话。
  3. 手动监视训练进度,并在完成后关闭实例。
  4. 可以选择记录培训课程的详细信息,用于实验再现、使用模式分析或管理。

显然,非托管选项需要大量的人工干预。与此同时,直接使用训练机器可以实现很大的灵活性。这与管理选项相反,后者通常会限制对训练机器的访问。

训练编排 :
训练编排是指机器学习训练作业的自动化部署和管理。如今,几乎有几十种工具为编排基于云的培训工作提供支持。这些服务根据其成本和功能支持的细节而有所不同。培训协调工具可用于构建一个专门针对您的需求定制的托管培训环境。您可以通过一种方式来设计您的环境,这种方式提供了托管服务(如自动化和实验跟踪)和非托管服务(如直接与培训实例连接的自由)的优点。自然,创建和维护个性化的托管环境可能需要付出巨大的努力。

选择一个必须的选项

尽管我们做了冗长的解释,你可能还是会对如何选择合适的培训服务感到有些困惑。正如我们在上面讨论的,这个决定由于潜在的未知因素而变得复杂。这里有一个我们的开发团队可能会采用的策略。借用强化学习领域的一个术语,我喜欢称之为选择基于云的培训服务的探索开发策略。

  1. 根据你目前(有限的)知识,从众多选项中选择一个。这个决定可能取决于你的舒适程度或成本考虑。
  2. 尝试以这样一种方式设计您的代码,最小化对任何一个选项的依赖,并最大化您轻松地从一个服务转换到另一个服务的能力。
  3. 找出您当前解决方案的弱点和提高效率的机会。
  4. 将你的一部分发展时间用于探索替代培训服务选项。如果确定了改进的选项,请返回步骤 1。

步骤 2—选择训练软件映像

无论您选择何种培训服务,配置 API 都将包含用于确定软件培训映像的控件。根据服务的不同,这可能是一个虚拟机映像(如亚马逊机器映像(AMI)谷歌计算引擎映像)或 Docker 映像。如上所述,云服务提供了一长串预先配置的软件映像。这些因操作系统类型和版本、驱动程序版本、软件包成分等而异。在大多数情况下,我们倾向于使用我们选择的培训服务提供的官方图片。这些映像不仅经过了严格的测试,而且通常还包括专门为底层云环境设计的优化。然而,您可能会发现没有一个图像完全符合您的需求。您可能需要安装特定的 CUDA 驱动程序或特定的软件安装包。或者,您可能已经有了一个精心培育的 Docker 映像,并希望将其带到云中。许多云服务支持自定义映像的创建和使用。

即使在您选择自定义映像的情况下,我们也发现从现有的官方服务映像派生自定义映像是最安全的。这里我们展示了一个案例,我们用最新版本的 opencv 和一个自主开发的 python 实用程序包扩展了一个官方的 AWS pytorch Docker 映像。

FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.9.0-gpu-py38-cu111-ubuntu20.04RUN apt-get update && apt-get -y install python3-opencv
COPY my_utils.pkg ./my_utils.pkg
RUN pip install my_utils.pkg

一旦你创建了你的 Docker 镜像,你需要把它上传到云注册中心,比如亚马逊 ECR 或谷歌容器注册中心。更多细节参见文档。在下面的代码块中,我们修改了 Amazon SageMaker 启动脚本,以使用我们创建的自定义图像。

from sagemaker.pytorch import PyTorch

estimator=PyTorch(entry_point='cifar10.py',
                    role=<AWS IAM role>,
                    **image_uri=<path to image in ECR>,** 
                    instance_count=1,
                    instance_type='ml.g4dn.xlarge',
                    )
estimator.fit()

步骤 3—在云中访问您的培训数据

将机器学习应用程序迁移到云中时,您需要做出的下一个决定是如何访问您的训练数据。在本帖中,我们将假设你的数据集由基于云的对象存储解决方案维护,例如亚马逊 S3谷歌存储。访问数据的最简单方法是将完整的训练数据集下载到训练实例的本地磁盘上,然后像在本地环境中一样进行精确的训练。但是,您的数据集可能太大,无法放在本地磁盘上,或者您可能不愿意让您的训练实例在下载整个数据集的过程中保持空闲。云服务提供了许多与云存储中的数据交互的方式(我们在这篇文章中已经提到了其中的一些)。无论您选择哪个选项,都可能需要对代码进行一些修改。

我们将通过修改我们的 cifar10 pytorch 示例,从存储在亚马逊 S3 的数据集中提取数据,来演示您的代码所需的适应类型。我们将使用的对象存储接口方法是最近发布的 Amazon Sagemaker 快速文件模式。快速文件模式(FFM)将 S3 中的数据暴露给机器学习应用程序,使得它看起来好像正在访问本地文件系统。这提供了访问数据的便利,就像数据存储在本地一样,而没有在训练之前实际下载数据的开销和成本。为了使我们的程序使用快速文件模式,需要对培训脚本的数据加载部分和 Amazon SageMaker 培训作业实例化脚本进行小的调整。下面的代码块突出显示了这些更改。对于这个例子,我们假设训练数据位于S3://my-bucket/cifar-training-data/

培训脚本:

**dataroot=os.environ["SM_CHANNEL_TRAINING"]**
transform=transforms.Compose([transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
batch_size=4

trainset=torchvision.datasets.CIFAR10(**root=dataroot**, train=True,
                                      transform=transform)
trainloader=torch.utils.data.DataLoader(trainset,                 
              batch_size=batch_size, shuffle=True, num_workers=2)

testset=torchvision.datasets.CIFAR10(**root=dataroot**, train=False,transform=transform)
testloader=torch.utils.data.DataLoader(testset, 
              batch_size=batch_size, shuffle=False, num_workers=2)

SageMaker 启动脚本:

from sagemaker.pytorch import PyTorch

estimator=PyTorch(entry_point='cifar10.py',
                    role=<AWS IAM role>,
                    py_version='py3',
                    framework_version='1.9.0', #pytorch version
                    instance_count=1,
                    instance_type='ml.g4dn.xlarge',
                    **input_mode='FastFile'** )
estimator.fit(**"s3://my-bucket/cifar-training-data/"**)

更多关于快速文件模式的话题,请看这篇最近的帖子。

应该注意的是,如何存储大型数据集的细节,包括数据如何分区和存储格式,都需要仔细设计,因为它会对数据的访问速度产生有意义的影响。你可以在这篇博文的中找到关于这个话题的更多细节。

步骤 4——如何利用多名员工加速培训

如上所述,迁移到云的优势之一是它提供了扩展您的培训工作的机会,以便在多个员工上并行运行。一种常见的方法是执行数据分布式训练。在数据分布式培训学习中,每个工人对培训数据的不同子集(本地批次)执行一个培训步骤。然后,它发布其结果梯度,并考虑所有工人学习的组合知识来更新其自己的模型。通过对 N 名员工进行数据分布式培训,你有可能将你的培训速度提高多达 N 倍。不可避免的是,将您的培训分配给多个员工也需要对您的代码进行调整。我们将在简单的 cifar10 pytorch 示例中演示这一点。pytorch 中有许多流行的实现分布式训练的框架,最著名的是内置的分布式数据并行库和 Horovod 。在这里,我们演示了对我们的两个脚本所需的更改,以便使用 Horovod 在具有 4 个 GPU 的训练实例上运行分布式训练。

下面的代码块包括对优化器定义训练循环所需的更改。有关使用 Horovod 的 pytorch 分布式培训的更多详细信息,请查看官方 Horovod pytorch turorial

**import horovod.torch as hvd

*# Initialize Horovod*
hvd.init()

*# Pin GPU to be used to process local rank (one GPU per process)*
torch.cuda.set_device(hvd.local_rank())
net.cuda()**import torch.optim as optimcriterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)***# Add Horovod Distributed Optimizer*
optimizer = hvd.DistributedOptimizer(optimizer,  
                         named_parameters=net.named_parameters())

*# Broadcast parameters from rank 0 to all other processes.*
hvd.broadcast_parameters(net.state_dict(), root_rank=0)
hvd.broadcast_optimizer_state(optimizer, root_rank=0)**for epoch in range(2):  # loop over the dataset multiple times
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
 **inputs, labels = data[0].cuda(), data[1].cuda()** # zero the parameter gradients
        optimizer.zero_grad() # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step() # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0**if hvd.rank() == 0:
    # save checkpoint to location that will be autonmatically
    # uploaded to S3    
    model_dir = os.environ.get('SM_MODEL_DIR', '/tmp')**
    **torch.save(net.state_dict(), 
               os.path.join(model_dir, 'cifar_net.pth'))** print('Finished Training')

以下代码块演示了如何使用 Amazon SageMaker 的 API 来启动 Horovod 作业:

from sagemaker.pytorch import PyTorch
**distribution={
            'mpi': {
                'enabled': True,
                'processes_per_host': 4,
                'custom_mpi_options': '--NCCL_DEBUG INFO'
            }
        }**
estimator=PyTorch(entry_point='cifar10.py',
                    role=<AWS IAM role>,
                    py_version='py3',
                    framework_version='1.9.0', #pytorch version
                    instance_count=1,
 **instance_type='ml.g4dn.12xlarge',**#4 GPU instance
                    input_mode='FastFile',
                    **distribution=distribution** )
estimator.fit("s3://my-bucket/cifar-training-data/")

注意,我们依赖于对输入数据集的混洗操作来确保四个 Horovod 训练过程中的每一个都接收不同的训练批次。或者,您可以实现一个数据分片方案,将输入数据分成 4 个不相交的数据子集,每个子集对应一个训练过程。如果您选择对数据进行分片,您应该知道一些分片实现会将整个数据集下载/流式传输到每个训练过程,然后进行分片,而不是在数据源进行分片。这可能会使您的培训资源超负荷,造成不必要的成本浪费。

在这篇文章中,我们没有提到为了适应增加的全局批处理大小,可能需要对优化器设置进行的调整。关于分布式培训的更多细节,包括你可能面临的一些挑战,请查看下面的帖子。

步骤 5——如何分析您的运行时性能

训练机器学习模型可能很昂贵,这不是什么秘密。作为 ML 应用程序开发人员,降低成本的主要方法之一是通过定期分析培训的执行速度和系统资源的使用方式来寻找提高培训效率的机会。虽然这在任何培训环境中都是一个好习惯,但在云环境中进行培训时,这一点至关重要,因为在云环境中,培训效率低下的成本影响是直接的。如果您的训练代码还没有包含用于分析运行时性能的钩子,现在是时候加入它们了。有许多不同的工具和方法来进行性能分析。在这里,我们将演示如何修改我们的 cifar10 训练循环,以使用 pytorch 的内置性能分析挂钩。我们已经配置了分析器,将结果存储在亚马逊 S3 云存储中。为了简单起见,我们编写了脚本来在单个 GPU 上捕获分析数据。

**# configure profile on rank 0 only
active = 3 if hvd.rank()==0 else 0
log_dir = os.path.join(model_dir, 'profile')**
**with torch.profiler.profile(
    schedule=torch.profiler.schedule(wait=1,warmup=1, 
                                     active=active,repeat=1),     
    on_trace_ready=torch.profiler.tensorboard_trace_handler(
                                              log_dir),
    activities=[torch.profiler.ProfilerActivity.CPU,   
                torch.profiler.ProfilerActivity.CUDA],
    record_shapes=True,
    with_stack=True) as prof:**
    for epoch in range(2):  # loop over the dataset multiple times
        running_loss = 0.0
        for i, data in enumerate(trainloader, 0):
            # get the inputs; data is a list of [inputs, labels]
inputs, labels = data[0].cuda(), data[1].cuda() # zero the parameter gradients
            optimizer.zero_grad() # forward + backward + optimize
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
 **prof.step()** # print statistics
            running_loss += loss.item()
            if i % 2000 == 1999:    # print every 2000 mini-batches
                print('[%d, %5d] loss: %.3f' %
                      (epoch + 1, i + 1, running_loss / 2000))
                running_loss = 0.0

下图显示了 TensorBoard 中的概要分析示例。有关如何在 TensorBoard 中分析分析结果的详细信息,请查看 pytorch 分析教程。

分析总结(来自tensor board Profiler Turorial

许多云服务将收集培训系统利用率指标,并向用户公开这些指标(例如,通过亚马逊云观察谷歌云监控)。这些可用于识别培训效率低下的情况,并做出适当的改变。例如,您可能会发现您的 GPU(通常是最重要的训练资源)非常空闲,并推断出不同的训练实例类型(具有较低的 GPU 能力)可能更适合您的需求。
以下是系统利用率指标如何出现在 Amazon SageMaker web 界面中的示例:

实例指标(来自 Amazon SageMaker 控制台)

Amazon SageMaker 提供了额外的性能分析工具,详见这篇博文。

步骤 6——如何监控你的训练实验

在机器学习培训项目的过程中,您可能会使用不同的架构、输入数据或超参数运行几十个不同的实验。为了从这些实验中收集有用的信息并能够进行改进,你必须有合适的工具来比较它们。在基于云的训练环境中进行监控需要从所有独立的训练实验中收集评估指标,并将它们存储在一个集中的位置。您需要做出的一个关键设计决定是推送还是拉取度量数据。在基于推送的解决方案中,每个实验将被编程为推送至预定义的集中监控服务。虽然这似乎是最直接的选择,但它可能需要复杂的云网络和云权限设计。在基于的解决方案中,每个实验将其指标上传到云存储,监控服务被编程为从那里拉指标。虽然这不需要任何特殊的云配置,但您可能会发现它不太方便。

市场上有很多工具用于监控基于云的训练实验。这些工具包括 Comet.ml海王星权重&偏向神圣MLflow公会 AIcnvrg.ioClearML ,还有很多很多。这些服务因其成本和功能细节而异。

自动提前停车

在一个典型的机器学习项目中,你可能会发现自己在并行运行多个实验,并预计其中一些可能会失败。在基于云的环境中,非常需要自动检测并尽早终止失败的实验。这可能会大大降低成本。集成自动监控将要求您编写规则来检测常见的训练失败,如爆炸或消失梯度、非递减损失等。

在下面的代码块中,我们提供了一个如何将监控和早期停止整合到我们的 cifar10 pytorch 脚本中的示例。为简单起见,我们使用张量板来比较实验指标。

**from torch.utils.tensorboard import SummaryWriter****# choose path in S3 so that metrics can be tracked during training
writer = SummaryWriter(<predetermined path in S3>)
halt_training = False**for epoch in range(2):  # loop over the dataset multiple times
 **if halt_training:
        break**    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data[0].cuda(), data[1].cuda() # zero the parameter gradients
        optimizer.zero_grad() # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
 **# terminate training if loss is invalid**        **if np.isnan(loss.item()) or np.isinf(loss.item()):           
            print('Invalid loss, terminating training')
            halt_training = True
            break** 
        loss.backward()
        optimizer.step() # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0
 **if hvd.rank()==0:
                writer.add_scalar('training loss',
                            running_loss / 2000,
                            epoch * len(trainloader) + i)**

在这种情况下,我们编写了脚本来将培训指标上传到云存储。为了将它们可视化并与其他实验进行比较,你需要将结果拉入 TensorBoard。这是一个张量板度量标量可视化的例子。

TensorBoard 中的实验比较(作者)

关于在 pytorch 中使用 TensorBoard 的更多细节,请查看本教程。

Amazon SageMaker 提供了专门的监控和自动停止工具。更多详情请参见此处此处此处

摘要

基于云的培训提供了一定程度的灵活性和可扩展性,这在您的本地环境中几乎是不可能重现的。在这篇文章中,我们已经介绍了成功过渡到云计算所需的一些步骤。我相信,除了这种转变的机制之外,云中的培训还需要心态的转变和对基本开发习惯的调整,就像在以前的博客文章中讨论的那样。

</6-development-habits-for-increasing-your-cloud-ml-productivity-becdc41eb289>

对我来说,想到天空中的云,就会唤起兴奋、创新和无尽机遇的感觉。我发现用这样的感觉来描述 cloud ML 的潜力并不为过。我希望你也是。

你应该收听的 6 个科技和编程播客

原文:https://towardsdatascience.com/6-tech-and-programming-podcasts-you-should-tune-in-to-8897d256827d?source=collection_archive---------4-----------------------

随时随地学习和聆听故事

Unsplash 上的 Soundtrap 拍摄的照片

我们都过着忙碌的生活;总是有很多事情同时发生。在我们的一天中,我们努力在自己身上下功夫,进一步提高我们的技能,为未来的自己创造新的、更好的机会。但是,有时候,花时间学习新技能并不是一件容易的事情。

自从我是一名高中生,我就自学了多重任务。我总是渴望学习新的技能来提高自己,但是我有许多杂务和任务需要完成。因此,我过去是,现在仍然是一个在旅途中学习新事物的爱好者。尽管我很喜欢阅读书籍和教程,但我需要一种可以在完成其他家务时使用的资源。

那是我深入播客世界的地方。我可以用来学习新事物的技术播客,可以帮助我更好地了解就业市场的职业播客,以及许多其他类型的播客。播客是一种无需在特定地点甚至特定时间学习的好方法。2020 年是激动人心的一年。这是许多新播客出现的原因。

</6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61> [## 数据科学应用的 6 个最佳 Python IDEs 和文本编辑器

towardsdatascience.com](/6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61)

这也有助于将人们的注意力转移到神奇的播客世界。当然,有很多播客可以让你了解科技、生活甚至心理健康的任何方面。但是,在这篇文章中,我将为所有级别的程序员介绍我最喜欢的 6 个编程播客。因此,如果你正在开始你的编码世界之旅,或者想要复习你的知识,请收听这些播客。

№1:语法 FM

让我们从网络开发播客 gem 开始吧, SyntaxFM 。这个播客是由全栈开发者韦斯·博斯和网络开发者斯科特·托林斯基创建的。这个播客包含了许多关于编程和 web 开发各个方面的采访和深入讨论。SyntaxFM 经常每月分享 9~10 集,长度不一,有的短至 20 分钟,有的则是详细密集的 70+分钟剧集。

除了播客,如果你喜欢韦斯和斯科特传递信息的方式和教学方法,你可以从他们那里找到许多其他伟大的资源,如韦斯的课程和斯科特的 YouTube 频道。所以如果你想进入网络开发的世界,不要再往前看了;这是给你的播客。

№2:代码新手播客

接下来是为科技和编程领域的新手准备的播客。Code Newbie播客对你来说是一个很好的资源,如果你正在起步,需要一个指南和信息丰富的地方来开始你的技术之旅。这个播客涵盖了科技领域的所有基础知识。这个播客的伟大之处在于,它没有专注于特定的技术方面,而是试图提供许多不同领域的有用信息,如 web dev 和数据科学。

Code Newbie podcast 还提供了开发人员和程序员关于他们的学习和职业生涯的故事,您可以使用这些故事来推进和简化您自己的旅程。这个播客经常一个月分享 4~6 集,平均每集 30~55 分钟。

</9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8> [## 9 台用于数学、Python 和数据科学的 Discord 服务器,您需要立即加入

towardsdatascience.com](/9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8)

№3:跟我说说 Python

作为一个 Python 爱好者,我总觉得 Python 有很大的潜力可以用在不同的广阔领域。说到 Python,我确信我总能学到新的东西或者更好地掌握现有知识。所以,如果你像我一样是一个 Python 爱好者,跟我说说 Python就是为你准备的播客。想学习一些关于 Python 的新知识或者知道可以用它做什么?跟我聊 Python 会回答你所有的问题。

每日与我分享一个新的话题,每个话题都在讨论和探索 Python 生态系统以及你可以使用它的各种应用。还包括对开发者、Python 爱好者,甚至各个应用领域的研究人员的各种采访。

№4:瓢虫播客

总的来说,科技行业的男性多于女性,有时女性很难让自己的声音被听到并得到尊重。瓢虫播客是一个很棒的女性主导的播客,讨论科技生活的各个方面,从学习一项新技能或语言到找工作,甚至谈判工资和职位。

该播客提供了关于核心技术概念的剧集,来自成功职业旅程的女性开发人员的故事,以及关于个人发展和成长的话题。这个播客中我最喜欢的一个焦点是他们的读书俱乐部,他们在那里讨论不同的书籍,甚至深入讨论撰写和出版电子书的过程。

№5:开发者茶

如果你想学点新东西,但你只有午休时间,我们的下一个播客开发者茶就是为你准备的。这个播客提供了 15~20 分钟的关于编程和应用程序开发的各种主题的短片。

开发者茶由程序员兼开发者 Jonathan Cutrell 主持,旨在帮助开发者在职业生涯中脱颖而出,并对技术世界产生积极影响。截至本文撰写之时,该播客已有超过 1300 万次下载。这个播客的另一个优点是,你可以通过乔纳森的 Twitter 账户或电子邮件与其讨论。

</5-new-data-science-books-that-you-should-consider-reading-c90aec1d5b0d>

№6:和我一起学习编码

你可以通过各种途径进入科技行业;你可以去 it 学校学习工程、计算机科学或其他相关领域,或者你可以报名参加训练营,在比获得学位更短的时间内学习。但是,可能最常见的途径是在线自学编码。

跟我学编程是一个很棒的播客,由劳伦斯·布拉德福德主持。劳伦斯采访了许多自学成才的开发人员和程序员,并与他们讨论了他们的旅程和遇到的挑战,以及他们如何克服这些挑战。此外,该播客专注于教人们如何过渡到技术,并提供可行的建议,帮助他们获得技能报酬。

最后的想法

处理我们每天需要完成的许多任务和杂务并不容易。可能会让人不知所措,而且时间非常棘手。那么,我们怎样才能在完成日常任务的同时提高自己呢?幸运的是,有一些学习媒介可以让你在做其他事情的同时学到一些东西。

我在做日常家务时最喜欢做的事情是听一两个播客,在打扫、吸尘或烹饪时学习一些新东西,并有效利用我的时间。听播客不需要你在特定时间保持静止或收听,这使它成为忙碌的人或习惯于多任务处理的人的理想学习资源。

</6-data-science-slack-workshops-you-need-to-join-b0c00952105d>

这就是为什么我决定写这篇文章来和你分享 6 个我最喜欢的编程播客,给各个层次的人;无论您是刚开始编程,还是已经在这个领域工作并需要刷新您的记忆,您都会在这些播客中找到您需要的内容。所以,下次你发现自己在做无聊的家务时,收听这些播客,享受学习的乐趣。

数据科学访谈中经常被问到的 6 个技术概念

原文:https://towardsdatascience.com/6-technical-concepts-often-asked-about-in-data-science-interviews-96271e60c7ef?source=collection_archive---------40-----------------------

做好准备,赢得面试。

照片由 Maranda VandergriffUnsplash 上拍摄

不管你从事什么领域,求职的过程从头到尾都是非常耗时、紧张和令人精疲力尽的。如果这是你刚毕业后第一次申请工作,或者是你改变职业道路后第一次申请工作,心理上的要求会更高。

因为这是你的第一次,你完全不知道公司在寻找什么,如何让你的简历尽可能有吸引力,如果你得到了面试机会,你应该期待什么样的问题,以及你的投资组合应该包括什么。

数据科学是一个技术领域,对具有不同领域专业知识的新数据科学家的需求日益增加。尽管需求不断上升,但空缺职位的供应往往超过了可获得的职位。要想在数据科学领域找到一份工作,即使是入门级的工作——这种工作并不总是存在——也可能是一项非常漫长且具有挑战性的任务。

</10-different-data-science-job-titles-and-what-they-mean-d385fc3c58ae>

也就是说,如果你有一个强大的投资组合,里面有你使用了各种核心和先进技术的惊人项目,你获得面试的机会会更高。但是,进入面试阶段并不是终点;这只是向你未来的雇主证明你能力的又一步,也是获得你梦想中的角色的又一步。

然后,另一个准备阶段开始;你需要为面试做好充分准备。你的投资组合中可能有引人注目的项目,但如果你不能在面试中证明你确实具备这份工作所需的知识,这还不够。

幸运的是,尽管数据科学的范围很广,但各种数据科学职位的面试主要关注该领域的核心基础。因为如果你的基础很强,你可以学习并建立任何数量的新知识。本文将讨论 6 个基本的、技术性的数据科学问题,这些问题是你在未来的数据科学面试中可能会被问到的。

</4-types-of-projects-you-must-have-in-your-data-science-portfolio-4b67cc25ed3e>

1.回归

如果让我选择一个我认为是数据科学核心的概念,这个概念就是回归。不管你申请的是什么职位,都有可能会被问到至少一个关于回归的问题。所以,为了安全起见,确保你了解回归的一切,包括理论方面和实践方面。

关于回归的问题包括线性回归,逻辑回归,两者之间的区别,以及何时使用其中的每一种,如何将你的问题系数解释为变量,并在你的代码中进行假设。计算 p 值及其含义并应用残差分析,以及区分 L1 值和 L2 值。

2.通用机器学习模型

基本的机器学习模型是我们通过数据科学面试必须知道的概念列表中的下一个概念。您应该熟悉一般的预测模型。你需要能够阅读一个问题,理解它,并选择一个最适合它的模型。

要做到这一点,您需要了解基本模型、它们的基本理论、它们如何工作以及它们的最佳实践。您还需要训练它们,测试它们的准确性,验证它们的结果,并对它们执行不同的分析。如何以及何时执行交叉验证。你的模型参数基于什么标准?如何选择最佳预测器来解决眼前的问题?

</5-types-of-machine-learning-algorithms-you-need-to-know-5ac7fce8920d>

3.随机森林

在数据科学访谈中,几乎 100%的时间都会被问到的一个概念是随机森林。关于随机森林的问题包括一个类似的问题,你如何生长一棵数据树?为什么一开始就使用随机森林?什么时候用,怎么用才高效?

您还需要能够证明为什么为树的每次分裂选择特定的变量子集,如何检测树中的过度拟合,然后以最佳方式修剪它。面试官可能还会问你为什么选择使用随机森林而不是 gradian boosting 机器来解决你的问题,所以了解这两种技术的使用案例和区别是非常重要的知识。

4.使聚集

聚类算法是机器学习的核心算法之一;即使你不是数据科学家,你也可能听说过并知道聚类理论。大多数数据科学面试通常包括一两个关于聚类算法的问题,通常是 k-means 算法。

k-means 算法是一种简单而有效的机器学习算法。面试官可以问你关于这个算法的各种问题,从为什么 k-means 开始?集群的数量是如何选择的?需要迭代多少次算法才能得到最优结果?什么是损失函数,如何实现来测试你的算法性能?如何优化凸面以获得最佳效果?

5.核心数学和统计学

虽然数据科学是关于数据,你如何收集它,清理它,分析它,并用它来预测未来的数据。数学和统计是整个运作的齿轮。所以,你的数学和统计知识需要准确无误。

你可能会被问到不同的概率分布,如何进行 T 检验或获得 Z 值。什么是卡方检验?什么时候用,什么意思?如何计算变量和分布之间的协方差和相关性?

6.高级主题

在某些情况下,基于你申请的角色,你会得到更多的问题,比如关于矩阵操作和因式分解的问题。或者如何处理时间序列,如何选择 p、d 和 q 参数,以及如何进行盒测试。

有时,面试官可能会测试你的 SQL 知识,让你解释不同的 SQL 查询或根据不同的场景编写一个查询。你还需要准备好关于数据可视化的问题,如何选择最佳的表达方式来简单有效地传达你的结果。

最后的想法

在当今的科技世界找工作是任何人都可能经历的最具挑战性和最令人紧张的经历之一。从准备简历和作品集到寻找合适的角色,再到申请并焦急地等待回音,这并不总是发生在为面试做准备并最终获得工作机会的时候,一个人怎么能超越它呢——有缺陷的压力过程?

坏消息是,没有找到工作的神奇公式。然而,你可以做一些事情来帮助你获得这份工作。你需要做的一个重要步骤,尤其是如果你进入了面试阶段,就是为技术面试中经常被问到的问题做好充分准备。

</6-machine-learning-certificates-to-pursue-in-2021-2070e024ae9d>

在本文中,我们讨论了数据科学面试中经常被问到的 6 种类型的问题(概念),而不管你申请的具体职位是什么。因为最终,数据科学的所有子领域都归结为几个基本概念,如果你知道,那么你就是一个数据科学家。

我做了 6 件事来持续改进我的机器学习模型

原文:https://towardsdatascience.com/6-things-i-do-to-consistently-improve-my-machine-learning-models-36cd87aaf9fd?source=collection_archive---------12-----------------------

…接近并超越 90 分的绩效

玛利亚·特内娃在 Unsplash 上拍摄的照片

我记得我在 Kaggle 上的第一堂 ML 课程。我接触了决策树,并在过度使用的 Ames Housing 数据集上执行了我的第一个“严肃的”回归任务。我太高兴了!我甚至认为机器学习并没有那么难……多么愚蠢!

事实证明,决策树就像是 ML 中的“Hello World ”,而我只是把我的小脚趾伸进了美丽的数学和数据世界。从那以后,我学到了很多,也提高了很多(或者说我认为我做到了)。

现在,我不仅仅是根据目标盲目训练我喜欢的模特。我已经不再编写模板代码,开始更加认真地对待数据预处理。由于这些变化和许多其他变化,我的模型开始取得稳健的结果,甚至在大型数据集上也经常达到 85 点以上的性能。

因此,在本文中,我将列出我学到的 6 件最重要的事情,以持续推动我的模型实现最佳性能。

https://ibexorigin.medium.com/membership

获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:

https://alphasignal.ai/?referrer=Bex

1️⃣.找出控制过拟合/欠拟合的超参数

毫不奇怪,我对 ML 世界了解的第一件事是过度拟合的问题以及如何与之斗争。生成一个具有良好通用性的健壮模型是一个循序渐进的过程,初始阶段从模型初始化开始。

选择基线模型后,搜索对其目标函数影响最大的参数。通常,这些超参数直接影响模型的学习,最重要的是,它如何推广。

最好的方法是通读模型的文档。在阅读了足够多的文档后,您会发现某些关键字会立即暗示该参数与控制过拟合有关。

例如,基于树的模型和集合模型使用术语“修剪”来控制每棵树的深度。随机森林有n_estimatorsmax_features影响每棵树的建造。Sklearn 用户指南也说max_depthmin_samples_split很重要。

对于线性模型,最常见的关键词有正则化惩罚等。逻辑回归和线性支持向量机具有C——正则化强度的逆,或存在于所有支持向量机中的alphagamma超参数。常见的惩罚类型被称为“L1”和“L2”,并且山脊 / 套索算法本身就支持它们。

要建立基本性能,您可以使用默认值或文档中建议的值。通常,这些值不是最佳的,应该在工作流程的最后阶段使用超参数优化器进行调整。

2️⃣.将数据分成 3 组,而不是 2 组

除非您仍在使用玩具数据集,否则真实世界的数据通常数量庞大。在这种情况下,您可以将数据分为 3 组(1 组训练,2 组验证),以生成更可靠的结果。

如果不使用交叉验证,那么 1 个训练和 1 个测试集的问题又是过度拟合。你要做的所有工作都将依赖于以随机种子分割的那一对训练/测试集。在模型从训练集学习之后,您可以调整它的超参数,直到它为您的测试集提供最佳的可能得分。

这种情况下的最高分并不一定意味着您的模型现在可以很好地概括看不见的数据。这个特殊的分数只能告诉你的模型在那一小部分随机选择的样本上做得有多好。这是又一次过度拟合,只是在伪装。

一个简单的解决办法是使用另一套坚持己见的办法。模型从训练中学习,您在测试中优化它,最后,您使用第三个验证集检查它在看不见的数据上的真实性能。这里有一个帮助器函数来完成这项工作:

3️⃣.广泛使用交叉验证

当您的机器上没有 10+内核,并且您的数据集非常大时,最好使用最后一个技巧。

不过,如果你真的有这种奢侈,那就广泛使用交叉验证。了解不同类型的交叉验证,并找到适合您独特情况的交叉验证。例如,Sklearn 提供了 12 个独特的交叉验证分裂器,每个分裂器都有一个共同的目的——防止我使用几个模型为每个样本生成多个预测的过度拟合。通过使用交叉验证,您可以获得以下好处:

  1. 不浪费任何数据—所有折叠完成后,所有数据都被用作训练集和测试集。
  2. 消除了由于意外地在过于有利的训练/测试集上进行训练而导致模型表现过于乐观的可能性。
  3. 报告 ML 带来的内在不确定性——通过获得几个分数,您可以计算平均分数来查看总体性能,并查看标准偏差来了解结果可能有多大差异。

尽管交叉验证在每个折叠中内部使用 2 个集合来评估模型性能,但您仍应保留一个集合用于最终测试,如 Sklearn 用户指南中所述:

图片由 Sklearn 提供

5️⃣.超越简单的估算技术

当我刚开始的时候,我并不真正关心丢失的值。我玩的大多是玩具数据集,简单的均值/模式插补技术绰绰有余(谁能怪我?).

在处理了更大的数据集之后,我的方法改变了。首先,我不再盲目地应用插补技术,而是开始问为什么数据首先会丢失。更广泛地说,我探索了想念的类型。一般来说,有三种:

  1. 完全随机失踪(MCAR)
  2. 随机失踪(三月)
  3. 非随机缺失(MNAR)

这三种类型的名称非常相似,但有细微的区别。找出丢失的数据属于哪一类可以缩小你可以用来估算它的技术。

除了均值/中值插补等简单技术之外,还有两种基于模型的方法。在 Sklearn 中,这些是:

  1. KNN 插补(sklearn.impute.KNNImputer)
  2. 迭代插补(sklearn.impute.IterativeImputer)

两者都在 R 中有实现,我惊讶地发现,用于输入缺失值的 R 生态系统更加成熟。在这里讨论这些方法会偏离本文的最初目的,所以我可以向你推荐我的另一篇文章:

还有一个问题是哪种技术更好,效果如何。您可以使用多种技术并评估一个估计量来查看每种技术对预测的影响,但这种方法不适用于大型数据集。

我最喜欢的是绘制插补完成前后的特征分布图:

作者图片

不同 K 值的 KNN 插补比较。如您所见,K=2 时,橙色线更接近原始(蓝色)分布。

估算分布越接近原始分布,技术就越好。当然,这种方法也有缺点,尤其是当缺失值的比例很大时。

5️⃣.执行特征选择或降维

拥有更多数据并不总是更好。当数据具有不必要数量的预测变量(特征)时,情况肯定如此。

具有太多对估计器的预测能力没有太大贡献的特征会导致过度拟合、更多的计算成本和增加的模型复杂性。这些特征往往具有较低的方差,或者彼此之间高度相关。您可以使用 PCA 的特征选择或维度缩减来移除数据集中的冗余变量。

特性选择当你对每一个特性都有了深刻的理解时,技术有时是首选。甚至在应用复杂的算法之前,你可以利用你的领域知识或者仅仅通过探索每个变量是如何和为什么被收集来丢弃一些。然后,您可以使用其他技术,如基于模型的特征选择。

例如,Sklearn 提供了SelectFromModel或递归特征消除(RFE)包装算法来自动找到最重要的预测变量集。为了实现更高的性能,passing ensemble 算法在这里也能很好地工作。

PCA 降维是减少特征数量最有力的技术之一。它获取高维数据,并通过尽可能多地保留原始方差,将其投影到更低的维度(更少的特征)。Sklearn 实现的 PCA ( sklearn.decomposition.PCA)在 Kaggle 比赛中往往表现相当不错。

您可以直接指定想要保留的要素数量或通常执行的操作-传递一个介于 0 和 1 之间的百分比来表示想要保留的变化量。PCA 会自动找到能够解释传递方差的最小特征数。

PCA 的一个缺点是涉及到大量的数学运算,而且你会牺牲可解释性,因为在 PCA 之后,你将无法解释这些特征。

6️⃣.特征工程

一旦你在 ML 世界中走得足够久,你将开始越来越多地听到关于特征工程的激动人心的讨论。大多数专业人士声称特征工程是一门艺术,这是理所当然的!

特征工程是数据预处理的广义术语。它涉及的操作范围从基本的数据清理到转换现有数据,以显示特征中看不见的结构和模式。这就是为什么它被称为一门艺术——你能想出的东西没有限制,只有你的创造力和领域知识。

许多 Kaggle 大师和行业内的从业者表示,他们大部分时间都在做特征工程。在许多采访中,Kaggle 竞赛的获胜者声称特征工程是他们成功的关键(我特别听到一位 Kaggle 特级大师在被问及他如何赢得比赛时使用了“特征工程超越所有人”这一短语)。

特征工程就是充分利用你所拥有的东西。通过将给定的数据转换为其最佳形式,可以确保您执行的所有其他操作都将达到其最佳性能。机器学习大师的杰森·布朗利说得好:

当您的目标是从预测模型中获得尽可能好的结果时,您需要充分利用现有资源。这包括从您使用的算法中获得最佳结果。它还包括最大限度地利用数据,以供算法使用。

顺便说一句,你可以看看他关于这个话题的世界级文章来了解关于特性工程的炒作到底是怎么回事。

感谢您的阅读!!!

我希望本文中讨论的技巧能让初学者大开眼界。我通过反复试验和阅读许多其他人的作品来学习每一种语言。通过在您自己的实践中正确地应用它们,您应该能够将您的模型的性能扩展到接近 90 点性能甚至更高!

您可能也会感兴趣…

您在数据科学课程中学不到的东西

原文:https://towardsdatascience.com/6-things-you-did-not-learn-in-your-data-science-course-847e8b69e272?source=collection_archive---------2-----------------------

但是你肯定应该成为一名更好的数据专家

莫里茨·金德勒在 Unsplash 上拍摄的照片

D 数据科学本身就是一个庞大的课题,需要很多时间去掌握,更不用说精通了。因此,毫不奇怪,许多大学和教育机构现在提供专业的数据科学教育,脱离传统课程。总的来说,这些新领域位于计算机科学、数学和统计学的交叉点,教你如何使用数据和统计来理解和解决问题,但不是真正如何最好地编码它们或将你的解决方案投入生产。

换句话说,对数学和统计的更深入关注和更短的长度通常以软件工程、编码最佳实践和其他相关学科(如 UI 开发和数据库)的正式培训为代价。此外,今天对神经网络的极大关注误导了新来者,使他们远离更直接、有时更有效的解决方案,如决策树和助推器。

这篇文章强调了纯数据科学 教育中经常缺乏的关键领域,如果学会了这些领域,对许多人来说可能是与众不同的技能。当然,你不需要掌握或特别精通这些。然而,拥有一定的熟练程度肯定会让你整体上变得更专业。

1)软件架构

工程师们讨厌 Jupyter 笔记本有一个很好的理由:它们与“模块化方法”完全相反。

好的软件设计秉持三个基本原则:https://en.wikipedia.org/wiki/Cohesion_(computer_science)低耦合低冗余 换句话说,每个模块都专注于一个单独的问题,它们是高度独立的,几乎没有代码重复。例如,加载数据集的代码不应该做任何其他事情(如数据清理),不应该依赖于任何其他模块(如数据扩充模块),并且应该是代码库中唯一用于加载数据的地方。

大多数数据科学教程将所有内容都放在一个笔记本中,这对于工程学来说是一个大禁忌。一体化文件意味着数据集的下载、清理和准备与服务和使用它的代码结合在一起。生成的文件有多个相互交织的职责,并且可能有几个单元格来自其他笔记本。

软件架构是关于大画面的:每个组件是如何关联的,以及代码在项目中是如何安排的。没有比批判性地思考你每天接触的所有代码更好的学习方法了。例如,考虑一下在 Python 中使用几个包是多么的不费力,你如何将 PyTorch 与 NumPy、Pandas、SkLearn 等混合搭配。每个模块解决它的问题,它们一起解决你的问题。

现在,考虑一下您最近编写的功能。你第一次编码它们吗,或者它们是重复出现的特性,你最终或多或少地记录了每个项目?如果是后者,您可能没有编写可重用的代码。通常,代码最终没有被重用是因为设计得太接近问题或者太与完整的解决方案耦合。

根据经验,每个模块越专注、越独立、越独特,架构就越好。也许你到目前为止写的大部分东西都太细了,你都懒得去修改。然而,这并不意味着你将来要写的所有代码都必须如此。这一切都从正确的心态开始:编写独立的和可重用的部分。

2) UI 开发

开发界面是完全不同的事情。React 或 Vue 开发人员面临的许多挑战对于数据专业人员来说是完全陌生的。学习 UI 开发首先会极大地提高你的编码技能。然而,真正的交易是能够编码你的工具——工具意味着生产力。

现实是大多数工具都很糟糕。你使用的数据标注应用程序是为标注任何东西而设计的,而不是为标注你所标注的东西而定制的。您使用的绘图库旨在支持大多数绘图,而不是您的特定设计。ide 和编程语言也是如此。它们是为一般情况而设计的,不是为你的特殊用途而设计的。因此,为什么我们使用这么多 VS 代码扩展或者为什么我们使用 TensorFlow,而不是纯 NumPy 和 c,这是显而易见的。

知道如何编写 ui 代码并不是为了制作下一个 Excel 或 Tableau。编写自己的工具是为了很好地解决一个非常特殊的任务。没有主流工具会费心去实现的工作。它可以是数据浏览用户界面或自定义数据标签。这些年来,我在定制数据标签解决方案方面取得了惊人的成果。此外,您可以不费吹灰之力就将您的模型烘焙成预贴标机(您已经对它们进行了编码)。

在这个主题中,考虑一个所见即所得的界面如何帮助你现在正在做的事情。会有多复杂?编码有那么痛苦吗?它能节省多少工作时间?等等。

坚持使用 Python,这里有一个对可用 GUI 包的极好的介绍。我建议从这些中的t inter开始。然而,今天 UI 开发的真正交易是学习一个 web 框架,比如 ReactJS 或者 Vue 。如果你对移动感兴趣,我建议你选择 Flutter

3)软件工程

我所看过的数据科学课程中,没有一门涵盖了软件工程的基本主题。我们被教导如何解决训练和推理任务,但没有被教导如何正确地编码。缺乏软件工程技能是数据团队经常被分成科学家和(你猜对了)工程师的主要原因。对昔日船只的模型、见解、分析等。后者组装零件用于生产。

在前面,我提到了软件架构,它泛指如何将复杂的软件分割成更小、更易管理的部分。然而,软件工程是一个更广阔的领域,软件架构是其中的一个分支。非正式地,这个术语经常被用来代替它的两个最重要的副主题:我们如何更好地编写软件,以及我们如何更好地安排软件团队。

我最喜欢的工程定义是“优化,变得更好。”软件工程无非是关于如何更好地创建软件的任何事情。这意味着使它更快、更易维护、更安全、更少错误,等等。,以及如何写得更快,在人与人之间分工,组建团队等等。它是关于产品和过程的。更好的软件和更好的软件制作。

如果我们有一个完整的工程团队,为什么还要研究这个呢?因为几乎我们所做的一切都是软件或者是由软件完成。没有团队抱怨过他们的代码太好。没有团队会抱怨他们编码太快或者代码太容易维护。抱怨总是关于写得有多糟糕或者他们的进度有多慢。而不是相反。

从哪里开始? 最佳做法。

遵循你的语言风格指南( PEP-8 用于 Python ),学习通用和大数据设计模式。了解如何对你的代码进行单元测试或者如何高效地并行化。你(希望)知道 Git ,但是你有没有想过使用实验跟踪器自动调谐系统?你的团队可能遵循某种形式的 Scrum看板策略,但是你曾经读过最初的敏捷宣言吗?

这些是指针。每一个都是一个值得用一整篇文章来描述的世界。然而,如果我要选择一个,读读 敏捷宣言 。所有的四个价值观和十二个原则。敏捷并不意味着快;这是关于灵活性。关于适应变化。它是刻板、僵硬的反义词。这适用于生活中的一切。适应事物。改变需要改变的。这从训练模型到你的整个职业生涯和你喝的咖啡。

数据库是如何工作的

一件事是了解 SQL,能够查询数据。另一个是理解索引以及数据库系统如何存储和提供数据。在(巨大的)数据集上训练(大规模)模型的很大一部分是输入管道。如果获取一个批处理比处理它花费更多的时间,你就不能充分利用你的 GPU 装备。数据库理论可以教你很多关于如何处理和服务大规模数据的知识。

这里的要点不是让数据科学家做数据库工作或取代数据库管理员。相反,最终是学习服务数据背后的基本技术。主要是,如何对 哈希排序缓存、 页面 数据——软件优化的四个主要途径,以及重新排序操作如何极大地影响运行时间。****

TensorFlow 文档中有两篇精彩的文章,分别关于优化分析输入管道。它展示了执行预取数据、并行处理数据或向量化数据等操作如何显著提高性能,有时,这只是改变操作顺序的问题。一个例子是数据库如何重写查询以提高执行速度。两篇文章的大部分内容同样适用于其他环境,比如处理 Panda 的数据帧。

举个例子,查询重写的一个核心原则就是先过滤数据。假设您需要为一个 1TB 的图像数据集提供服务来训练一个神经网络。数据集有 100 个类,但您只想学习如何区分 10 个。你可以(1)盲目地加载每个图像,然后检查它们的标签,或者(2)从你想要的类中过滤出哪些文件,跳过其他的。显而易见的答案是(2),因为它绕过了加载您不会使用的数据。在数据库术语中,首先执行查询的**

5)设计基础

我们做丑陋的阴谋。看一些“为假人设计”的内容也无妨。一些简单的基本规则可以教你如何给你的图表上色和调整文本大小。更多地了解设计也能帮助你在展示数据时更有创造性。一个好的可视化效果抵得上一百万张图像。

开始的一个很好的地方是遵循一些预设,比如使用 SeabornMatplotLib 的色彩映射图,或者 Plotly 的主题。然后,你可以进一步提高你对颜色的理解,以及如何找到好的颜色组合。但是,你最应该学习的是如何构图一个 视觉层次 。一个好的情节会引导读者的目光投向读者首先需要知道/意识到的东西。如果没有,它会看起来令人困惑和恐吓。**

尽管如此,无论你如何设计你的可视化效果,都要考虑到情节应该是不言自明的。永远不要依靠情节本身之外的文本来阐明情节所表现的内容。

6)除了神经网络之外的机器学习

有许多数据科学家不知道的 ML 算法的整个世界。虽然线性/逻辑回归和神经网络很受欢迎,但许多问题可以通过 RBF 核或 XGBoost 模型下的简单支持向量机更快地解决。传统的决策树通常对表格数据足够好,并且具有完全可解释的额外好处。我们不应该忽视过去的方法。外面有许多宝石。

虽然你们大多数人都熟悉这些算法,但神经网络日益增长的优势一直在减少投入经典技术的时间。因此,如今许多专业人士对变形金刚和 ResNets 的熟悉程度远远超过了以前的 Scikit-Learn。

本着这种精神,我强调了所有数据专业人员都应该了解并知道如何使用的三个模型:

  1. 决策树:树是可用的最简单的分类器之一。然而,它们是你能拥有的最强大的工具之一。他们的力量是不可思议的。你可以很容易地打印出你的决策树是如何思考的。这不是大多数模特能做到的。它们的局限性是不太适合复杂的问题。你可以在这里阅读更多。**
  2. 助推器:最著名的是 XGBoost 。这些是服用了类固醇的决策树。他们仍然可以解释自己,但他们用大量的简单性换取了分类能力。处理大规模表格数据集时,增强器是一些最有效的方法。 XGBoost 的一些替代方案是 LightGBMCatBoost
  3. 支持向量机(SVMs): 基于一个美丽的数学公式,SVMs 是有史以来最成功的模型之一。他们擅长处理小数据集但有大量特征的复杂问题。当其他解决方案在这些恶劣的环境下努力学习时,支持向量机却茁壮成长。以下是关于支持向量机的 SkLearn 文档

一项荣誉奖颁给了朴素贝叶斯。这种模型相对快速和简单,但通常可以很好地解决具有许多功能的问题。此外,它们在自然语言处理(NLP)社区中非常受欢迎,因为它们可以非常有效地处理文档中的每个单词。

暂时就这些了。如果你对这篇文章有任何问题,请随时评论或与我联系。你也可以订阅我在你的收件箱这里发布的内容。你也可以直接给我买杯咖啡来支持我

如果你是中新,我强烈推荐订阅。对于数据和 IT 专业人士来说,中型文章是 StackOverflow 的完美搭档,对于新手来说更是如此。注册时请考虑使用我的会员链接。

感谢阅读:)

在训练你的模型之前你应该做的 6 件事

原文:https://towardsdatascience.com/6-things-you-should-do-before-training-your-model-51703ab5e125?source=collection_archive---------18-----------------------

为确保您为培训和监控您的模型做好准备而采取的行动的综合列表

凯利·西克玛Unsplash 上拍摄的照片

正如你们中的一些人开始理解的那样,我非常注重工作效率,并为日常问题寻找聪明的解决方案。作为一名数据科学家,帮助我剖析了工作流程中的基本步骤,并理解了撰写真正有助于读者的文章的可能性。

我已经提到了正确构建你的机器学习项目的主题,因为它可以提高生产率和效率,尤其是在团队工作的情况下。今天,我想用这篇文章来涵盖我发现对指导我的数据科学工作非常有效的 6 个项目的清单。

我要感谢安德烈·布尔科夫和他为 机器学习工程 这本书所做的工作。我从它那里获得了灵感,写了这篇文章,总体来说,这是一篇很好的文章——如果你还没有看过的话,请浏览一下。

我们开始吧。

1.使用和维护特征模式文件

模式文件用于跟踪你的特征是什么,它们的行为方式以及它们的一般属性。它很有用,因为它确保了在开发的所有阶段,团队的所有成员都能够及时了解模型的内容。它也给了团队一个正式的模式来调试模型。

创建至少满足以下条件的文件:

  1. 保存功能的名称
  2. 类型(分类、数字、…)
  3. 允许的最小值和最大值
  4. 样本均值和方差
  5. 如果它允许零出现
  6. 如果它允许出现未定义的值

请随意创建任何类型的文件来保存这些信息。下面是一个 schema.json 文件的示例,它保存了合成数据集的这些信息。

中的特征模式文件示例。json 格式

2.浏览您的 README.md 文件

我只是喜欢在我的 ML 项目之前和期间写下我的想法。这些都是在我的 README.md 文件中完成的,这是我在 repo 中创建的第一个文件。

重要的是,你所有的推理都要放入这个文件中,这样团队(甚至你自己)就会一直走在同一条线上。很容易承诺一个想法,但几个小时后却发现根据项目大纲,这个想法并不太有意义。查看你的笔记和项目资产将有助于你明确自己的意图,提高效率。

我构建自述文件的方式并不标准,但通常遵循以下模式:

  1. 我写下目标和它背后的总体想法
  2. 我列出了可以用来解决这个问题的可能方法
  3. 我列出了每种方法的优缺点,并尽可能多地对每种方法进行了评论
  4. 我列出了项目面临的挑战,以及我现在需要哪些资源和知识来解决这个问题
  5. 项目对业务的影响

第 5 点有助于我们在项目后讲故事。如果我能记录下每一个步骤并谈论我的过程,那么我将有一个很好的故事告诉利益相关者。沟通和你的分析能力一样重要。****

3.设定可实现的绩效水平

总是与利益相关者交谈,了解他们对你工作的期望。与他们谈论他们期望看到的绩效水平以及满意度的阈值。这是你应该达到的最低绩效值。

要了解模型的性能,请考虑这一点

  • ****如果一个人可以毫不费力地做同样的工作,那么可以有把握地假设模型将在相同的水平上运行
  • 如果您向模型中输入高质量的数据,即包含与您的任务相关的信息的数据,那么可以有把握地假设该模型将表现良好****
  • ****如果一个软件可以在没有 ML 的情况下取得好的结果,那么可以有把握地假设该模型将在相同的水平上执行
  • ****如果另一个最大似然算法可以在类似的数据集上取得好的结果,那么可以有把握地假设该模型将在相同的水平上执行

4.选择一个(且仅一个)绩效指标

这和业绩水平密切相关。一个模型有一个性能指标,您可以在训练之前分配给它。例如,回归任务可能需要您设置 RMSE(均方根误差)或 MAE 性能指标。

您必须选择对您的问题最有意义的性能指标。选择且仅选择一个绩效指标,并坚持下去。比较和跟踪不同的模型,以了解模型之间的指标变化。我在这里讲讲模型选择和度量评估

5.定义基线

你应该总是将你的模型与基线进行比较。这可能是非常固执己见的,例如:

  • ****你的基线可以是以人为基础的。你的模型与人类在相同任务中的表现相比较
  • 你的基线可以是一个随机预测:算法从 y 训练集中选择一个随机值
  • 您的基线可以遵循特定的规则:对于分类任务,它可以返回最频繁的类,而对于回归任务,它可以返回平均值
  • 你的基线可以是一个简单和基本的模型****

如果你的模型比你的基线表现得更好,那么你知道你在为你的公司/团队提供价值。****

6.将数据分成三部分

Kaggle 和网络上的各种伟大的内容创作者已经彻底地覆盖了这方面,但它仍然是在训练之前给予很多关注的事情。

确保你的数据被分成三部分:训练,验证,测试集。以下是不同之处:

  • 训练集用于训练您的模型
  • 模型看不到验证集,它用于测试算法及其参数
  • 模型看不到测试集,它用于评估整个管道

我喜欢用这个比喻:

你的模型就像一个在学校的孩子。在学校学习的孩子是你从训练集中学习的模型,做作业的孩子是你在验证集中测试的模型,期末考试的孩子是你测试集中的模型。

****请记住,您的验证和测试集必须来自您的训练集的相同统计分布,否则您将训练您的模型错误的数据。这就像一个孩子在学习一个他永远不会被测试的章节。

结论

这里有一个 TL;速度三角形定位法(dead reckoning)

  1. 使用模式文件来跟踪要素及其属性
  2. 在项目的所有阶段,将所有相关信息存储在 README.md 文件中
  3. 设定可实现的绩效指标——与利益相关者交谈,了解他们的期望
  4. 选择一个且只能选择一个绩效指标
  5. 将您的模型与众所周知的基线进行比较,以了解您为组合增加的价值
  6. 确保以正确的方式拆分数据。

我一直在用这张思维导图。我希望这也能帮助你。也分享你的步骤——我一直在寻求改进和完善我自己的流程:)

你应该学会的 6 个基础知识可以提升你的自然语言处理技能

原文:https://towardsdatascience.com/6-things-you-should-learn-to-kickstart-your-natural-language-processing-skills-4e10a1d3d2a?source=collection_archive---------5-----------------------

自然语言处理是当今人工智能中最热门的领域之一。虽然大多数概念似乎很难掌握,但这些基础知识应该有助于您在该领域起步,并为更高级的主题做好准备。

照片由@ lhgerona@ unsplash.com 拍摄

自然语言处理是当今人工智能领域最热门的领域之一。该领域的技术创新和巨大突破使计算机能够理解人类语言,达到了几十年前我们认为不可能的水平。

这些技术突破中的一些可以让你在不到 24 小时内写完一本书或者建立你自己的聊天机器人

对于初学者来说,这个领域可能看起来令人困惑和不知所措。如果你想在 NLP 工作,你应该从哪里开始? 在建立学习计划时,你应该优先考虑什么?该不该马上跳下去学习神经网络?你应该理解文本规范化吗?在学习更高级的东西之前,你应该学习哪些基础知识?

不用担心!这篇文章将引导你了解自然语言处理的一些基础知识,并向你展示六项基本技能,帮助你开始你的自然语言处理生涯。

开始吧!

基本文本处理

编程语言中要处理的最重要的概念之一是学习什么是最重要的文本处理方法。在计算机语言中处理字符串应该是您的第二天性—知道如何来回操作文本、使用正则表达式、对字符串进行切片是您在自然语言处理中应该能够掌握的一些最重要的示例。

这是为什么呢?您的语料库(您将用来构建 NLP 应用程序的一段文本)被清理并准备好进行分析的可能性非常低。现实生活中的数据是相当复杂的,你可能需要执行一些清理任务,比如将一些单词小写,删除空格或其他。

你应该从哪里开始?Python字符串库和字符串方法是在编程语言中开始处理字符串的很好的资源。另外,Python 被认为是 NLP 中最重要的语言之一,所以精通 Python 一定会对你有所帮助。

总之,在处理字符串时理解这些基本的数据操作技术,将为您的 NLP 之旅省去大量的麻烦和失误。

国家图书馆图书馆

是的,我知道——NLTK,即自然语言工具包库的缩写,是最古老的自然语言处理库之一。但是,请相信我,20 年前第一次发布的这个库是学习 NLP 的一些特定基础知识的最佳资源之一。该库中灵活实现的一些资源有:

  • 从简单到更高级的词干分析器。
  • 分词器让你把你的语料库拆分成句子或单词。
  • 词性标签——现成的型号版本和定制的频率标签。
  • 单词词条化。
  • N-Grams 概念。

这些概念是理解大多数 NLP 应用程序中的文本规范化和文本处理的基础。理解 NLTK 库将让您发展从头构建 NLP 管道的必要技能。即使您最终没有在您的 NLP 管道中使用这些技术,将这些工具添加到您的工具带中也总是一笔巨大的资产。

或者, Spacy 也是 NLTK 的一个很好的替代品——Spacy 是最近才出现的,它包含了一些在原有 NLTK 功能上的很棒的附加组件——不过,要学习基础知识,你可以选择其中一个。

读取文本数据

在过去的十年中,网上流动的大量文本数据呈指数级增长。除了从网络上获取数据,NLP 从业者(和大多数数据科学家一样)必须处理不同格式的不同文件。

知道如何从多个来源读取文本数据对于任何想要在 NLP 中工作的人来说都是一项重要的技能——例如, CSV 和 JSON 文件是文本语料库的常见格式,在继续 NLP 应用程序之前,需要将它们接收到您的工作空间中。

另一个极其重要的技能是支配网页抓取——理解 HTML 结构极其重要。通过这样做,您可以立即访问分散在网络上的数百万个单词 NLP 任务中使用的大量语料库是通过结合使用对网站的合法请求和围绕 HTML 文件的工作来获得的。有大量的库可以帮助你实现这个目标,但是请求美丽搜索应该是你在 Python 中抓取网页的第一站。

词向量(和神经网络)

词向量是当今 NLP 中使用的最重要的技术之一——而且,它们对于理解人工神经网络在 NLP 环境中的应用非常有用。

很快,人们认识到将单词表示为一个热点向量将导致该领域的许多问题和限制——这项研究突破(因 word2vec 论文而闻名)使从业者能够建立单词表示,为数学数字带来上下文和意义。

以这种方式思考:通过单词向量,计算机可以以某种方式存储在特定上下文中表示单词的向量(你可以在这里阅读我关于单词向量直觉的文章)。它们是一个非常重要的概念,可以将人类语言背后的逻辑带给计算机——使它们能够将单词与其意义联系起来,甚至对传达类比或其他语言关系的向量进行数学运算。

研究和理解大多数词向量不仅对 NLP 领域很重要,对一般的机器学习也很重要。通过学习它们,你将接触到神经网络的内部工作机制,这是当今 ML 中最重要的模型之一。您将接触到不同的概念,如反向传播、权重优化、激活函数和梯度下降——这将为您运行和构建多个神经网络模型提供良好的开端。

递归神经网络

文本生成是自然语言处理的另一个子领域,随着神经网络的应用,该领域取得了巨大的突破。

文本生成中使用的神经网络架构与词向量或文本分类中使用的架构有所不同,称为递归神经网络,这些类型的神经网络包含几种存储和更新数据的机制,这些数据是典型的链式数据,如句子。

通过学习文本生成,您将能够理解几个概念:

  • 消失梯度的问题以及不同结构的神经网络如何解决这个问题。
  • 文本生成方面的最新技术。
  • 长短期记忆(LSTM)和 GRU(门控循环单位)作为提高文本生成模型性能的方法。

学习人工神经网络和递归神经网络会让你很好地掌握这些类型的模型。您将能够理解使用多个神经网络架构背后的需求,以及为什么在 NLP 方面没有一个通用的解决方案。

文本分类

最后,我们必须建立那些奇特的情感分类器,对吗?😃

文本分类帮助您使用预测模型将文本分类。基于树的模型、朴素贝叶斯分类器或神经网络是将文本分类到特定桶中的一些最常用的模型。文本分类的一些常见用法有:

  • 情感分析;
  • 垃圾邮件检测;
  • 文本分类;

通过学习文本分类技术,您还将应用我们之前讨论过的一些基础知识,如文本规范化、n 元语法或词干分析。

一个好的起点是为 Tweets 建立一个简单的情感分类器,这将让你在理解如何建立分类模型上有一个良好的开端。

而且,就是这样!这些基础知识应该可以帮助你理解大多数关于 NLP 的对话,并为你尝试更高级和最先进的东西打下良好的基础。该领域应继续发展,但这些基本原理应存在相当一段时间,因为它们仍在世界各地的 NLP 管道中应用和开发。

你觉得少了点什么吗?写在下面的评论里,我很想听听你的意见。

我已经在 Udemy 课程 中设置了这些基础知识——该课程适合初学者,我希望你能在我身边。该课程还包含 50 多个编码练习,使您能够在学习这些新概念的同时进行练习。

https://ivopbernardo.medium.com/membership

MLOps 加速和简化的 6 个技巧

原文:https://towardsdatascience.com/6-tips-for-mlops-acceleration-simplification-36539adab29b?source=collection_archive---------25-----------------------

(图片由作者提供)

MLOps(机器学习操作)是通过将数据科学应用于生产来提高企业生产力的关键。因此,对于任何想通过人工智能获得竞争优势的公司来说,这是必不可少的。在这篇文章中,我将根据我在全球企业中的经验,介绍六个技巧和最佳实践来加速和简化您的生产之路。这是我在 NVIDIA 最近的 GTC 会议上的一次演讲的概述,你可以点击这里查看。希望你觉得有用!

挑战#1:漫长而艰难的生产之路

在研究中开发模型仅仅是个开始。要确保该模型在线运行并在实际业务应用中产生价值,仍有许多步骤需要完成。其中包括:

  • 将代码、脚本、依赖项和配置打包到容器中
  • 大规模收集和准备来自运营和在线来源的数据
  • 用大规模数据、各种算法和参数训练模型
  • 将模型整合到实时/交互式管道中,从实时数据中获取信息
  • 监控模型准确性并创建自动化再培训工作流
  • 为每一步添加工具、跟踪、版本控制和安全性
  • 重构代码以提高性能,从而满足应用 SLA
  • 创建持续开发和交付(CI/CD)管道

完成这些过程可能需要几个月的时间,而且是资源密集型的。

解决方案:整合自动化并采用无服务器方法

生产过程自动化可以将时间从几个月缩短到几周。这可以通过无服务器框架来实现,该框架可以自动将简单的代码或笔记本转换为受管的弹性微服务。开源工具可以提供帮助,比如 MLRun ,一个开源 MLOps 编排框架。(完全披露:我和我的团队维护它)。MLRun 自动将代码转换成强大的无服务器函数,并允许将多个函数简单地组合成批处理、CI/CD 或实时管道。

MLRun 功能完全由自动跟踪、监控、日志、版本控制、安全性和水平可伸缩性管理,这有助于消除大量开发和开发运维工作。它们还在不影响性能或可扩展性的情况下加快了生产速度。

在 MLRun 中,我们可以使用自己的功能或市场功能进行数据准备、培训、模型测试、服务等。然后,我们可以在几分钟内组成复杂的 ML 管道,并通过完整的实验跟踪和工件版本控制来大规模运行它们。

MLRun 开发流程(图片作者提供)

MLRun 支持多个无服务器运行时引擎(job、dask、spark、MPI/Horovod、Nuclio..)来大规模解决各种工作负载(数据分析、机器学习、深度学习、流、API、服务……)。它支持多个管道/CI 引擎来运行 ML 工作流,包括 Kubeflow 管道、Github 操作、GitLab CI/CD 等。

函数还可以用于组成实时生产管道、处理流处理、数据丰富、模型服务、集成、监控等等。MLRun 实时管道构建在流行的高性能开源无服务器框架 Nuclio 之上(我和我的团队也维护这个框架)。

MLRun 服务图表示例(图片由作者提供)

查看服务图分布式 NLP 管道的示例笔记本,了解使用 MLRun 部署实时生产管道有多简单。

挑战#2:重复工作和孤立工作导致的低效率

机器学习工作在不同的团队之间进行分配:数据科学、工程和 MLOps。这些团队中的每一个都使用不同的工具集,这使得协作非常困难,并迫使资源密集型代码和管道重构。此外,在当前的实践中,团队最终构建了三个独立的管道架构来解决研究、生产和治理需求,这导致了资源腰部和代码重构或重新实现。

数据科学管道(图片由作者提供)

从图中我们可以看到,数据转换逻辑在研究和生产管道中并不相同,导致了不准确的特征和模型结果。更不用说重复劳动了。

解决方案:整合数据科学、数据工程和开发运维的平台和流程

通过一个统一的面向生产的工作流程和支持协作的技术整合所有工作,将使团队能够协同工作。它还将提高准确性,并为组织快速、持续地部署人工智能。这符合所有利益相关者的需要。

例如,数据科学家将能够构建功能,而无需不断向数据工程师请求数据,MLOps 团队将能够重新部署,而无需重新设计,等等。此外,利用平台核心的功能存储可以统一所有三种使用情形(研究、生产和管理)的数据收集、转换和编目流程,从而在 MLOps 流程中最耗费人力的部分之一节省时间和精力。

拥有一个端到端的平台来整合这一切:特征库、ML 训练管道、模型服务和监控,这对实现加速和自动化非常重要。这样一个平台节省了时间、精力以及将不同组件拼接在一起以获得完整的企业级工作解决方案的麻烦。

MLOps 平台架构(图片由作者提供)

挑战#3:未充分利用的资源和有限的扩展

当每个开发人员或团队都有自己的专用硬件、虚拟机或 GPU 时,结果就是基础架构孤岛。这些孤岛导致资源浪费和管理复杂性。与将所有这些资源聚集在一起相比,它们还会限制我们大规模处理数据或缩短执行时间的能力。

企业希望确保他们利用在人工智能基础设施上的投资,以确保他们的计算,数据和 GPU 资源得到充分利用。

解决方案:使用共享的弹性资源池

将资源集中到一个可以动态收缩或增长的弹性集群中,将实现资源共享、更智能的分配和资源节约。找到一个解决方案,加快生产时间,并充分利用您的人工智能基础设施。

这里有一个这样的例子:

(作者图片)

通过采用服务器和虚拟机,在集群上运行 Kubernetes,添加数据层以跨微服务移动数据,并在集群上调度工作负载,您应该能够获得更好的规模和性能。包括一套工具、不同方面的服务、开发环境和跟踪方面。,这将加速 TTP,并确保消耗更少的资源,池是共享的,并且可以根据需要运行更大规模的工作负载。

挑战#4:处理数据和特性占用了您团队 80%的时间

处理数据需要大量的工作。虽然 AutoML 工具已经变得越来越普及,并且简化了模型构建部分,但是您仍然需要不断地使用、准备、存储和接收特定于应用程序的数据。数据处理是 ML 中最耗时和资源密集型的任务。

解决方案:使用特征库来简化特征工程

特征工程能够将我们的原始数据转化为有意义的东西,以满足 ML 工作负载。例如,添加活动时间、聚合数据和计算统计数据、连接不同来源的数据、运行情感分析、图片旋转等等。然后,这些功能可用于培训离线数据、在线生产管道以及监控和治理。

这个挑战的解决方案是一个功能商店。功能商店是构建用于自动创建培训和生产功能的管道的中心位置。优步、Twitter 和 Spotify 等科技巨头建立了自己的功能商店,而功能商店的开源和商业工具很少。当你选择你的,一定要检查它是否符合你的需要。例如,如果您计划接收流数据,请检查要素存储是否可以即时运行计算并执行连接、聚合等操作。,以及它与其他 MLOps 组件的集成程度。

挑战#5:不准确的模型和有限的可见性

只有我们保持相同的数据、假设和行为,模型才会保持准确。但是这种情况很少发生,因为这些变化总是会导致模型漂移和不准确。

例如,新冠肺炎显著改变了消费者的行为,从购买更多的食物到减少航班。如果您的模型没有相应地修改,它们将产生无效和不准确的结果。

我们必须不断监控我们的数据和模型,并在它们出现偏差时发出警报。如果不能及时发现和识别这些挑战,模型将会不准确,这会导致负面的业务结果或法律风险。

解决方案:确保模型监控和再培训构建到您的 MLOps 管道中

在您的MLOps 管道中包含一个反馈和漂移感知系统,以测量预测结果和实际结果之间的差异。系统应该会触发警报,这样您就可以对变更采取行动,例如重新训练模型、切换模型等。

这个反馈系统的模型应该跟踪实时流中的一切,函数从特征存储中获取统计信息,并将其与实时行为进行比较。如果识别出不当行为,将向微服务触发警报。然后,微服务将通过电子邮件向您触发警报,重新培训或切换模型,或运行任何其他自定义操作。

带监控的生产管道(图片由作者提供)

使用 MLRun 时,模型活动在数据库中被跟踪,并使用 Grafana 或 MLRun 仪表板可视化。以下是一些仪表板快照:

MLRun & Grafana 中的模型监控(图片由作者提供)

挑战#6:不断发展的工具集和陡峭的学习曲线

MLOps 和数据科学背后有很多技术,并且有大量的工具,而且数量还在不断增加。理解你需要什么来开始,或者支持一个特定的用例,这可能是压倒性的。数据局部性、安全性、协作等考虑因素。都需要考虑。通常,一旦你对你的人工智能基础设施软件栈做出决定,一些新的东西就会出现并改变这个等式…

解决方法:采取一种“开放但有管理的”心态

您希望您的堆栈面向未来。您希望能够利用不断增长的数据科学社区的最新更新。我同意这种方法,并且总是建议尽可能多地使用开源工具。除了它们的质量,开源社区还提供了很多答案和支持。然而,根据您的需要,您自己集成、维护、保护和支持它们可能会变得非常困难。这就是领先的开源工具和托管服务体验的预烤堆栈可能会有所帮助,并帮助您专注于构建您的人工智能应用程序。

MLOps 可能令人生畏,但分享我们的集体经验将使我们更聪明、更快。我希望我的文章对你有所帮助,如果你愿意,你可以在这里观看我的完整演讲。

避免数据科学家精疲力竭的 6 个技巧

原文:https://towardsdatascience.com/6-tips-to-avoid-burnout-as-a-data-scientist-dca71519c320?source=collection_archive---------31-----------------------

即使是在“最性感”的工作中,找到工作与生活的平衡也是至关重要的

法比安·米勒在 Unsplash 上的照片

如果说疫情教会了我们什么,那就是心理健康对工作效率至关重要。如果你刚刚得到了那份新的数据工作(恭喜!),准备设定界限和期望,保护自己的心理健康。如果你已经适应了一份工作一段时间,但你无法摆脱总是被要求做比你有时间或精力做的更多的事情的感觉,那么你需要做出一些改变。

你怎样才能真正享受你的工作,而不是快速达到精疲力竭?

1.不要试图消费整个互联网。

当您成为数据科学社区的一员时,您会发现有大量的资源、有趣的事情要学习、新的事物要尝试,并且有很多人似乎完全了解数据世界的最新动态。它会给你一种感觉,你总是落后,或者你需要跟上一切才能成功。相反,选择几个你最喜欢的新闻或资源网站。让兴趣和好奇心来引导你。如果出现了你真的需要知道的事情,你可以去谷歌一下,我保证你会没事的。

2.你不必夜以继日地做数据项目。

你可能已经注意到,在日常生活中,用数据解决问题的机会实际上会出现很多。再加上你应该一直有一个个人数据项目的建议,你就有了一个让自己超负荷工作的方法。仅仅因为你在技术上可以获得一些数据并对其进行分析,并不意味着你必须这样做,如果你不希望你生活中的一切都被各种数据科学项目所消耗,你也不是一个坏人。你可以让数据成为你的工作,而不是你的爱好。

3.注意范围蔓延,知道何时停止。

在数据项目中很容易被冲昏头脑,想要回答所有突发事件或可能的问题。不断深入挖掘、微调或“只尝试最后一件事”的冲动是我非常熟悉的一种感觉。知道何时停止是困难的。把它看作是为了成为一名伟大的数据科学家而需要掌握的另一项技能。向利益相关者承认你没有想过尝试某事,或者你没有时间或资源继续下去,这也是完全可以的。有助于范围蔓延的一个好策略是在不同阶段与涉众一起检查,看看会出现什么问题。这让你更好地知道什么时候继续挖掘,什么时候停止。

4.学会说不。

有时,您组织中的人可能会认为您可以轻而易举地完成任何事情。想要说好并因为如此乐于助人或热心而获得金星是一种很大的压力。但是请记住,一开始说不总是更容易,以后有机会去做你认为没有时间做的事情。你不想说“是”,也不想违背自己的承诺。

5.简单没有错。

仅仅因为你可以使用最前沿的深度学习神经网络来解决问题,并不意味着你应该这样做。简单的解决方案将节省您的时间和精力,并具有高度可解释性和更容易向利益相关者解释的优势。只有当问题确实证明你有理由这么做时,才拿出大枪。

6.关注影响,快速失败。

在高影响力项目上做得好真的可以提高你在利益相关者中的可信度,最终让你变得受欢迎,反过来你的工作也变得更愉快。同样,对于一个最终没有多少商业价值的项目来说,太容易贪多嚼不烂了。学习如何从一开始就判断差异,并从无关紧要的项目快速转移。

还有哪些小技巧对你有帮助?

数据科学很棒,我喜欢它。但是,就像任何领域一样,如果你压力大到极限,很容易忽略你对工作的热爱。我希望你能制定一个计划来照顾好自己。保持对数据的热情!

欢迎在评论中分享你的任何建议。

作为一名数据科学家,建立成功在线形象的 6 个技巧

原文:https://towardsdatascience.com/6-tips-to-build-a-successful-online-presence-as-a-data-scientist-176886c267ce?source=collection_archive---------17-----------------------

利用你在网上的影响力获得你梦想中的工作。

真诚媒体Unsplash 上拍摄的照片

我们生活在一个充满挑战的世界。虽然这在生活的各个方面可能都是真的,但我在这里主要关注职业前景。今天,做学生比十年前更难了。期望是惊人的,有时似乎是不可能的。他们肯定会导致许多学生和毕业生遭受压力和焦虑。

但是,在这篇文章中,让我们把重点放在追求技术职业上,我们将谈论的所有内容都适用于技术领域的所有分支。我将主要讨论与数据科学相关的分支。数据科学是众所周知的高需求和高供给的技术领域之一。这是一个涉及我们今天生活的方方面面的领域——在许多应用中使用,以改善我们的日常生活。

这也是一个令人兴奋和有利可图的领域。然而,进入 it 行业并不容易,也不容易找到工作。找一份数据科学方面的工作竞争非常激烈,可能会让人觉得自己不够好,无法找到工作,或者无法被录用。

</5-reasons-why-having-an-online-presence-is-essential-for-data-scientist-success-5c402071aa35>

也就是说,你可以采取一些措施来增加你被录用的机会,帮助你在你瞄准的公司中脱颖而出。你可以做的一件事是建立一个稳固的在线形象,讲述你的故事,说服招聘人员给你一份工作。但是,是什么造就了稳固的在线形象呢?在这篇文章中,我们将通过 6 个提示来保证一个成功的在线展示。

技巧 1:明智地选择你的平台

许多形式的社交媒体围绕着我们;并不是所有的这些都能让我们的在线形象更专业,并能帮助我们建立品牌。对于程序员或数据科学家来说,一些社交媒体平台比其他平台更好。也许最常用的是 YouTube、Twitter、GitHub 和一个博客平台,比如 Medium。这些平台使你能够展示你的编码技能、技术知识和沟通技巧。

当然,你不必使用所有这些平台,但你需要使用一个能让你以你想要的方式表达你的声音的平台。你喜欢做视频吗,在镜头前舒服吗,或者懂点剪辑?那就试着开通你的 YouTube 频道。如果写作更适合你,那么开始你的博客,写下你的经历。

无论你选择哪一个平台,确保你能充分利用它,并且总是在头脑中有一个更大的图景来努力构建。

秘诀 2:保持一致

一致性是关键。不要开一个 YouTube 频道,只发一个视频,放弃,或者只写一篇博文就消失。相反,试着让你的出现保持一致,在同一个基调下。在繁忙的日程中保持在线状态的最好方法是提前安排好你想发布的帖子、视频或推文。

为你的发布时间制定一个时间表,一周一次,一周两次,或者任何你觉得合适的时间。然后,每个月休息一天,想想你想写或录制视频的主题,并为这些主题创建一个简单的大纲。这将帮助您在以后创建内容时节省时间。

我知道一开始会很难,你不会有太多的参与。但是,如果你坚持不懈,最终会有回报的。

技巧 3:控制叙述

建立网上形象就是讲述你的职业故事——按照你希望公司看到的方式描绘你自己。所以,你需要确保你所使用的叙述正确地传达了故事。花些时间想想你的博客或频道的名字,你将创建的内容类型,以及你将关注的领域。

你还需要考虑你的目标受众,因为你的写作或谈话风格会因此而不同。例如,你会更倾向于为每个人创建学术内容还是更非正式的内容?同样,定下基调将有助于人们更好地理解你的存在和你想要达到的目标。

秘诀 4:找到一个好的平衡点

你希望你的网上形象显示出你在努力建立自己的形象,但你需要确保它不会给人留下错误的印象。这样想,你开始建立你的在线形象,每天写 2 或 3 篇文章或拍摄 2 或 3 个视频。你认为数量会让你的个人资料更容易被看到,但事实并非总是如此。

当你建立自己的形象时,更多地关注内容的质量而不是数量。人们会读一篇写得很好的博客,或者看一段制作精良的视频。所以要关注质量,努力在你发布的内容数量和内容质量之间找到一个好的平衡。

</5-games-that-can-help-you-improve-your-skills-as-a-data-scientist-7d2d3f2f5a98>

技巧 5:创建一个作品集网站

当数据科学家考虑建立在线存在时,他们通常会将他们的努力分成许多平台:LinkedIn、GitHub、Twitter、YouTube 和你的博客。虽然这是一个很好的努力来展示你是多么的多样化,以及你如何通过不同的风格进行交流,但拥有一个连接你所有在线资料的作品集网站总是好的。

拥有一个投资组合是将整个故事放在一个地方的好方法。它将提供关于你的一般信息,你的职业兴趣,以及你在各种平台上在线创作的不同形式的内容。

提示 6:参与并寻求反馈

再说一遍,建立网上形象就是描绘一幅你的职业形象。因此,当你第一次开始建立自己的形象时,对反馈持开放态度并与你的观众互动是很重要的。阅读他们的反馈并彻底思考,尽可能从中获取有助于你制作更好内容的信息,摒弃那些刻薄且无建设性的批评。

最重要的是要记住,没有人是从最高层开始的;你需要努力提高自己的技能来获得成功,所以不要让评论和批评扼杀了你的热情,阻止你继续前进。

</10-newsletters-you-need-to-subscribe-to-as-a-data-scientist-d12c7f33fbab>

最后的想法

当我第一次被告知我需要提高我的在线形象时,我不明白那是什么意思。然后我陷入了研究的情绪,阅读,学习,并询问我周围的人如何建立一个稳固的在线存在。一个能让我的技能展现在招聘经理面前的存在。

在线展示包括在 Twitter、Quora 和 Instagram 等社交媒体上展示自己。无论你是否有一个包含所有招聘人员的组合网站,都需要了解你的专业背景和技能。它还包括一个有意义的项目的泰迪和有组织的 Github 个人资料,一个结构良好的 LinkedIn 个人资料,以及一个博客或 vlog。

现在,拥有一个在线的形象并不保证能得到这份工作,但它肯定会增加你的机会。如今,没有一家受人尊敬的公司会因为应聘者没有在线形象而拒绝他,但如果应聘者的在线形象不佳,公司可能会拒绝。因此,拥有一个稳定的、专注的、持续的在线状态可以让求职少一点麻烦。

我只希望这篇文章中的建议可以帮助你建立一个坚实的存在,讲述你的职业故事,并帮助你获得你梦想的角色。

在 1 个月内完成 Udacity 的数据科学家纳米学位的 6 个技巧

原文:https://towardsdatascience.com/6-tips-to-complete-udacitys-data-scientist-nanodegree-in-1-month-b5f7351f22b3?source=collection_archive---------22-----------------------

韦斯·希克斯在 Unsplash 上的照片

用最少的时间和成本最大限度地学习

Udacity 的数据科学家 nanodegree 是我上过的最好的在线数据科学课程之一。这门课程从过去的学生那里收到了很多积极的反馈,很容易看出为什么——他们的学习材料很容易理解,他们基于行业的项目允许学生获得解决现实世界问题的实践和早期接触。我最喜欢 Udacity 的是它快速的周转时间和个性化的项目评审。个性化项目评估让我知道自己的优势和劣势,因此我可以立即努力提高自己的技能。

Udacity 的主页说平均需要 4 个月(每周 10 小时)才能完成课程,但我会分享我如何在一个月内完成课程的秘诀。

注: 我在参加这个项目之前,已经积累了 6 个月左右使用 Python 的经验和一些机器学习知识。我决定报名参加这个项目,因为由于新冠肺炎的封锁,我被困在了一个离家很远的城市,我偶尔会离开工作。

如果你是数据科学和机器学习的新手,我建议你在报名参加本课程之前,先参加其他免费的 Udacity 课程和一些先修课程。

提示#1:要快速启动,询问可用折扣

自 2020 年新冠肺炎疫情爆发以来,Udacity 一直在提供各种折扣,因为封锁和在家工作安排释放的额外时间为许多人提供了提升技术技能的绝佳时机。

每月支付 399 美元对我来说太多了,所以我决定向 Udacity 申请折扣——令我惊讶的是,Udacity 在 2021 年 1 月初向我提供了折扣,这让我几乎可以立即注册该计划。

Udacity 不定期提供特别折扣,但这是根据具体情况而定的,所以在报名前一定要问清楚。

技巧 2:通读所有的项目标题。

Udacity 在其标题中指定了通过项目的所有要求。在你开始项目之前,先阅读它们。

我知道我们中的许多人喜欢直接进入项目并马上做,但是如果我们很久以后才意识到没有达到量规要求,我们将需要重新工作并重新提交我们的项目进行评分。

此外,有时 Udacity 会在项目中加入一个额外的挑战部分,但需要提到的是,完成这一部分并不是通过项目的必要条件。你可以跳过这个额外的部分,只有在你从你的项目毕业后再回来学习。

在开始任何项目之前,阅读项目的标题,这样你的项目在第一次提交时有更高的机会被评为“通过”。

提示 3:尽早开始你的项目,并马上应用你所学到的东西

纳米学位是以这样一种方式组织的,即在相关主题涵盖之后,学生需要完成一个项目。如果你在项目开始前已经看完了所有的视频,你很可能需要再看一遍,因为在你的项目中实施之前,你可能不会记住所有的概念或知识。

尽早开始这个项目,在看讲座视频之前了解你需要知道什么。将你所学到的直接应用到你的项目中,并一点一点地完成它…

提示#4:关注与项目相关的讲座视频

有大量的演讲视频可以观看,而且都是一流的。但是考虑到你仅有的一点时间,我建议你只看核心课程中的视频,至于额外课程中的额外视频,只有在你需要它们来完成你的项目时才看。

一旦你完成了项目并从项目中毕业,你将有一年的时间免费使用课程材料和视频。您可以下载它们以供将来参考。

所有讲座视频都极其优秀,简单易懂;然而,你会发现在一个月的时间里吸收所有的太多了;所以暂时只看你真正需要了解的视频,剩下的以后再看。

提示 5:谷歌一下你的问题,立即得到答案

许多人说谷歌是你学习任何东西的最好老师,所以充分利用谷歌搜索来立即找到你的答案。即使是最有经验的程序员也会告诉你,他们每天都使用谷歌搜索来寻找与他们的编程查询相关的答案。

在谷歌上搜索 Python 的答案有一个特定的方法——事实上在课程中已经教过了:总是以关键字‘Python’开始搜索,然后是你的问题(例如 Python unboundlocalrerror:local variable)。这告诉搜索引擎优先搜索与你使用的工具明确相关的结果。

提示#6:参考学生的答案作为完成项目的指南

Udacity 的项目是非常基于行业的,这意味着它们与现实世界的问题相关,也就是说,它们可能非常棘手。

如果没有参考其他学生的作品,我就不可能完成这些项目。解决一个问题有许多不同的方法。你可以看看一个学生采用的方法,并尝试在你的练习册中实施。事实上,你可以用你的代码来改进这种方法。

如果你发现一个太难理解,参考你能找到的下一个工作簿。

通过搜索项目标题,你可以很容易地在谷歌上找到其他学生发表在 GitHub 上的作品。如果你参考并希望使用他们的答案,那么一定要引用参考文献,因为这是 Udacity 要求的一部分,即你承认你所参考的其他人的工作。

结论

让我们回顾一下主要的提示和建议:

a)如果你知道如何使用 Python 进行数据分析,并且有一些机器学习的背景知识,那么你随时都可以开始 nanodegree。不要气馁——如果你遇到困难,他们有充足的预备课程资源。学会有效地用谷歌搜索你的问题,以找到即时的解决方案。

b) 尽早开始你的项目,并且永远当你在做你的项目时,记住项目规则马上学以致用****一点一点完成项目。

c)管理好自己的时间。在课程开始时投入更多的时间来巩固你的基础,在你意识到这一点之前,你会在课程结束时进步很快。如果你每天只学 2 个小时,很容易忘记很多东西,然后你会花很多时间重新看视频。

c) 参考 GitHub 中的学生答案。在你在练习册上实施之前,试着理解他们为什么以某种方式处理问题。请记住引用您的推荐人,作为 Udacity 对外部工作推荐人要求的一部分。

在学习与 Udacity 一起构建酷工业项目的过程中获得乐趣!关于这个问题,你可以随时问我,或者关注我的 mediumGithub

自定义熊猫数据框显示的 5 个技巧

原文:https://towardsdatascience.com/6-tips-to-customize-the-display-of-your-pandas-data-frame-ce5a8caa7783?source=collection_archive---------17-----------------------

使 Jupyter 笔记本中的数据框更加直观

图片来自 PixabayMocho

Pandas 是数据科学社区中最受欢迎的 Python 库之一,因为它为数据探索和可视化提供了灵活的数据结构和庞大的 API。数据科学家花费大部分时间探索数据和执行探索性数据分析。Jupyter Notebook 提供了一个交互式平台来执行探索性数据分析,最受数据科学家和数据分析师的青睐。

**dataframe.head()** 是来自 Pandas 包的一个函数,用来显示数据帧的前 5 行。Pandas 使用预定义的 HTML+CSS 命令在笔记本上以格式化的方式显示数据框。默认情况下,我们受到笔记本中熊猫数据框显示的行数和列数的限制。有时,有必要改变显示格式,使 EDA 更加直观和格式化。使用**pandas.options.display** 选项可以改变数据框的格式。

30+显示选项可以改变,以自定义显示格式;在本文中,我们将讨论 5 个流行的自定义数据框显示格式的技巧,以使其更加直观。

***Checklist:***
**1\. Display of Columns
2\. Display of Rows
3\. Width of the cell
4\. Decimal value formatting
5\. Data frame info**

在开始之前,我使用**pd**作为熊猫库的别名,**import pandas as pd****df**是指向数据集的变量。

1。改变列的显示:

使用 Pandas 加载数据集后,我们会受到输出显示单元格中列数的限制。df.head()Pandas 库中的函数对于获得数据帧前 5 行的第一次切割概览至关重要。列的数量是有限的,这使得很难可视化整个列集。

(图片由作者提供),默认 max_columns 的数据框显示

默认情况下,输出显示限制为 20 列,前 10 列和后 10 列由三个点分隔显示。

您可以选择改变输出单元格中显示的列数。使用**pd.set_option(“display.max_columns”, x)**,显示的列数将变为**x**。如果代替 x 传递的是 None ,那么所有的列都将显示在输出单元格中。

(图片由作者提供),左:显示 max_columns 设置为 10,右:显示 max_columns 设置为 None

通过改变列数的显示选项,可以非常直观地得到数据框的第一次切割可视化。

2.改变行的显示:

Pandas 还提供更改数据框行的显示选项。默认情况下,Pandas 将截断超过 60 行的行,并在输出单元格中只显示顶部和底部的 5 行。

(按作者排序的图像),默认 max_rows 的示例数据集显示

用户可以使用pd.set_option(“display.max_rows”, x)改变输出单元格中显示的行数,当用 x 替换 None 时,显示数据框中的所有行。用户可以向下滚动并可视化数据框的值。

(按作者排序的图像),max_rows = None 的示例数据集显示

3.改变单元格的宽度:

Pandas 显示选项不仅可以改变输出像元中显示的行数和列数,还可以改变数据框像元的宽度。默认情况下,单元格的最大宽度可以是 50。超过 50 个字符的单元格,剩余的字符将被截断。

(作者图片),显示默认列宽

在上面的示例数据集中,review 列中的文本值在 50 个字符后被截断。**pandas.display.options**提供使用**pd.set_option(“display.max_colwidth”, x)**改变输出单元格中显示的字符数的功能,其中 x 是字符数。

(图片由作者提供),左:显示 max_colwidth = 100,右:显示 max_colwidth = 200

4.十进制数值格式:

默认情况下,Pandas 将数据框中的浮点值格式化为 6 位小数,对于小数点后超过 6 位的值。

(按作者分类的图像),具有默认精度的样本数据集

如果您打印第一行V1列的值,我们会得到小数点后有 13 位的真实特征值*-1.3598071336738*

pandas.display.options提供改变浮点数精度的能力,使用pd.set_option(“display.precision”, x)其中 x 是精度。

(图片由作者提供),左:样本数据集显示精度= 3,右:样本数据集显示精度= 10

更改要素值的精度实际上不会影响数据集,但会限制笔记本输出像元中的显示。

5.数据帧信息:

dataframe.info()是 Pandas 中的一个常用功能,用于获取数据框的概况。这将显示数据框的列名、非空值计数、列的数据类型。

info()函数将其约束限制在包含 100 个要素或列的数据框内。下图显示了 info()函数为只有两个要素的数据集返回的内容。

(图片由作者提供),IMDB 数据集的数据框剖面图

对于具有超过 100 个特征的数据集,**info()**函数不返回列名、非空值计数和每个列的数据类型。

(按作者分类的图片),列数大于 100 的数据集的数据框剖面

用户可以改变**max_info_columns**的默认约束,以获得数据框的整个轮廓概览。

结论:

在本文中,我们讨论了如何改变熊猫数据框中的显示选项。文章中提到的 6 个技巧在执行数据理解和数据探索任务时非常有用。通过改变上面讨论的显示选项,可以更好地可视化笔记本中的数据框。

参考资料:

[1]熊猫文档:https://Pandas . pydata . org/Pandas-docs/stable/user _ guide/options . html

感谢您的阅读

帮助你脱颖而出成为 Python 开发者的 6 个技巧

原文:https://towardsdatascience.com/6-tips-to-help-you-stand-out-as-a-python-developer-2294d15672e9?source=collection_archive---------28-----------------------

Python 开发人员和数据科学家的实用技巧

粘土银行Unsplash 拍摄的照片

Python 是使用最广泛的编程语言之一,随着时间的推移,它还在不断流行。这个领域的竞争越来越激烈,因为越来越多的人想要精通这门语言,并在这个领域找到一份好工作。因此,为了能够与其他人竞争并在 Python 开发人员或数据科学家的职业生涯中取得进步,不断学习和提高您的编码技能是非常重要的。

在本文中,我将讨论一些技巧,这些技巧最终会帮助你成为一名出色的 Python 程序员,方法是使用有助于你的代码看起来更 Python 化、更专业的技术。此外,我们将讨论一些您可以合并到您的工作流中的工具,这些工具将帮助您以及您当前工作的整个开发团队提高开发速度。

尽可能遵循 PEP-8 风格指南

PythonEn 增强 P roposal (PEP) 8 介绍 Python 代码的风格指南。该风格指南包括鼓励开发人员遵循的编码约定,以便编写符合特定标准的更简洁的代码。

您应该意识到,源代码被读取的频率比它实际被编写的频率要高得多。因此,以一致的方式编写清晰可读的代码非常重要,这将帮助您、更广泛的团队以及未来的程序员理解、修改或发展代码库。

PEP-8 风格指南包含许多建议,主要集中在缩进、最大行长度、模块导入、间距、注释、命名约定等方面。有关完整的建议列表,您可以参考特定 PEP 页面

值得一提的是,项目本身可以有自己的指南。如果项目特定指南与 PEP-8 风格指南相冲突,则前者优先。此外,请务必关注 PEP-8 风格指南,因为它会随着时间的推移引入更多的约定,并删除由于语言本身的进步而被认为过时的过去的约定。

更频繁地使用上下文管理器

Python 通过让您处理资源(例如文件)的with语句来实现上下文管理器。每个上下文管理器实现两部分功能;__enter__()在语句体之前执行,而__exit__()在语句结束后立即执行。

上下文管理器用于简化与资源管理相关的常见操作,因此开发人员只需编写较少的代码。此外,它们还有助于避免 Python 应用程序中的资源泄漏。

举个例子,假设你想在一个文件中写一个字符串。如果不使用上下文管理器,代码可能类似于下面给出的代码:

使用 Python 将字符串“Hello World”写入 test.txt 文件

下面提供了使用with上下文管理器的等价代码。这里的主要优点是with语句将确保文件被正确关闭。正如您所看到的,上下文管理器可以通过消除样板代码来帮助我们编写更干净、更 Pythonic 化的代码,否则我们必须自己编写样板代码。

使用上下文管理器写入文本文件

在适用的地方使用上下文管理器是一个很好的实践。您还应该注意,如果您的项目上下文需要,您甚至可以编写自己的上下文管理器。

使用理解

你可能必须考虑掌握的另一个好的实践是在 for 循环中使用理解。理解是可以用来从现有的序列中创建新序列的结构。Python 2 引入了列表理解,而 Python 3 扩展了这个概念,因此理解也可以用于集合和字典。

一般来说,理解被认为是 Pythonic 式的,必须优先于传统的 for 循环。除了创建新的序列,理解也可以用于其他上下文,如过滤或映射。

为了证明理解的强大,让我们考虑下面的例子,我们想要创建一个包含 0 到 10 范围内的偶数整数的列表。传统的 for 循环如下图所示。

使用列表理解的等效情况如下

正如你所看到的,列表理解的符号更加清晰,并且使事情变得简单。

保持简单!

Python 最强大的地方可能是它能够让开发人员编写简单干净的代码。这可能是具有其他语言背景的开发人员最容易陷入的陷阱之一。

照片由阿曼达·琼斯Unsplash 上拍摄

它的动态典型模型提供了灵活性,让您不必编写冗长的代码就能保持简单。PythonEenhancementProposal(PEP)20是关于 Python 设计的指导原则,以格言的形式表达出来。所谓 Python 的,蒂姆·彼得斯,下面给出。一定要坚持!

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

如果您想了解更多关于 Python 的动态类型模型,请阅读下面的文章。

使用 sphinx 自动生成文档

优秀的开发人员还必须编写高质量的文档——句号。如果您不能正确地记录您的工作,那么即使您花费了巨大的努力来编写最先进的源代码,它也只是变得毫无用处。

高质量的文档帮助其他人理解如何使用你的作品。这使得更广泛的团队在将来需要时更容易维护甚至重构代码。因此,使用能够帮助您自动生成文档的工具是非常重要的,这样您可以在这样做的时候节省时间,但同时不要牺牲文档的质量。

Sphinx 是一个强大的工具,它可以帮助您根据添加到源代码中的注释自动生成文档。它有许多很棒的特性,而且它还支持几个扩展,可以让你的生活更加轻松。

使用提交前挂钩

如果你是一个有经验的开发人员,我想当然地认为你已经使用了版本控制系统(VCS ),比如 Git。预提交挂钩肯定是在创建提交之前触发的动作集合。它们经常被用来确保代码符合某些标准。例如,您可以触发一个预提交钩子,确保您的 Python 源代码的代码风格与我们之前讨论的 PEP-8 风格指南保持一致。

预提交挂钩是方便的工具,可以帮助您确保您交付的代码是高质量的,最重要的是一致的。它们还可以通过自动化某些原本需要手动执行的操作来帮助您提高开发速度。

要更全面地了解 Python 中的预提交钩子,请阅读我下面的文章。

结论

在本文中,我们介绍了一些技巧,这些技巧有可能帮助您成为一名出色的 Python 开发人员。由于越来越多的人热衷于精通 Python 编程语言,因此了解最新的实践和工具非常重要。这样做,将有助于你在职场中与人竞争,在职业生涯中取得进步,并获得你想要的工作。

具体来说,我们讨论了在编写代码或从事项目时应该考虑的六个有用的行为。讨论主要集中在:

  • PEP-8 风格指南
  • 什么是上下文管理器,为什么要使用它们
  • 理解的重要性
  • 编写简单代码的重要性
  • 如何为你的源代码自动生成文档
  • 最后,预提交钩子的作用和重要性

在数据科学面试中创造转折点的 6 个技巧

原文:https://towardsdatascience.com/6-tips-to-succeed-in-your-data-science-interview-5832ebf44c95?source=collection_archive---------40-----------------------

如何避免一些重大错误,增加你获得工作的机会

如果你在寻找一名数据科学家/工程师/分析师,那么如今被选中参加面试真的很难。市场上有越来越多的人,现在世界上大多数地方的就业市场都在略微好转。

克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片

在我之前的文章从大三学生那里获得数据科学工作的一些技巧中,我解释说,我使用求职网站 LinkedIn 的回电率大约是 5-6%。我还可以使用其他一些策略来增加回电次数,比如通过 LinkedIn 建立关系网,或者通过电子邮件联系招聘经理。我可能会在另一篇文章中扩展我的想法,敬请关注。

回到文章的主要话题,在我找工作的时候,接到招聘人员的回电(很有可能)对我来说是很少见的。

面试是一个奇怪的过程,你需要向招聘人员或招聘经理展示你有资格申请你刚刚在网上看到的职位。根据我的个人经验,在与招聘人员、朋友、招聘经理交谈后,以及从书中(我在文章底部列出了一些),我从我的失败中获得了一些提示。

如果你已经学习了几个月的数据科学,最终得到了面试的机会,你可能会认为你已经完成了。不幸的是,你很可能错了,因为面试中有一套全新的技能,非常特别。

1 —了解你申请的业务

这是我在面试失败后从招聘经理那里得到的第一个反馈。我和咨询公司的招聘经理完成了面试的第二步,他问我是否知道这家公司在从事哪些领域的工作。可悲的是,当时因为有一份全职工作,我没有分配足够的时间来充分了解业务,我失败了。

从那以后,每次我被选中参加面试,甚至是第一轮面试,我都会对公司正在做的事情做一点研究。有时候这很容易,因为大多数公司都有一个网站,你可以了解他们的工作领域。此外,一些公司可能会在 Medium 上写一篇关于数据科学的文章,你可以得到一些关于他们正在使用的技术的提示,这些提示可以在你与经理交谈时对你有利。

2-不知道所有的技能没关系,但是……

我记得的一个案例是,我在一家大公司面试,他们问了我很多越来越难的软件工程和数据工程问题。他们问了我一些非常学术的问题。

当我给出答案时,面试官显然很失望。我觉得面试官问的问题与其说是展示我的想法,不如说是一个小游戏。

有一份工作是关于你解决你不知道的事情的足智多谋。这不是你走进一个房间就知道所有你需要知道的事情的能力。

艾米丽·罗宾逊和杰奎琳·诺利斯在数据科学领域开创事业

但是,我不建议人们对一个问题说“我不知道”,相反,我总是试图论证我的思维方式。例如,我记得有人问我关于建设一条通往 GCP 的微服务管道的问题。由于我没有使用这个平台的经验,我试图解释我将如何在 AWS 中使用它,因为我一直在使用这个平台。

3-询问你是否知道

突发新闻!我们是人类,我们不是机器(到目前为止)。因此,不理解招聘人员、招聘经理等的提问是完全正常的。如果你没有清楚地理解问题,那么要求重复问题是完全可以的。随时让你的面试官重复这个问题。

照片由 Akhilesh SharmaUnsplash 上拍摄

4-对你的面试官表现出兴趣

作为一名申请人,我有时觉得面试是公司测试你的机会,看你是否适合。不过,这也是你看看自己是否喜欢他们的机会。面试过程有点像你、求职者和公司之间的调情。

在会议开始前,我通常会写一些问题,在对这个角色/公司有更多了解后,我通常会增加一些问题。根据你得到的回答,你可以判断这家公司是否适合你。

在我看来,不提问对面试官来说是一个危险信号,他或她会认为你对这个职位和/或公司不感兴趣。

照片由 NeONBRANDUnsplash 上拍摄

做好准备

很常见的想法是(我也是其中之一)相信你可以不做任何准备就走进面试,认为你的经历和简历会让面试官印象深刻,但事实并非如此。

你很容易难以回答这样的问题,比如“告诉我们一次你遇到麻烦或与你的经理意见相左的时候”,除非你真的准备好了,你可以喋喋不休地和圈子里的人说话。在我看来,没有什么比有人这样说话更糟糕的了。学习这种技能的一个方法是尽可能多地进行面试,但是如果你的回电率是 5%,你需要一点时间来学习。否则,我发现的方法是检查你将要面对的典型问题。

因为无论你在哪里面试,你都要遵循同样的步骤,你会面临行为问题,技术问题,可能还有一些商业案例问题。

Unsplash 上由 Jametlene Reskp 拍摄的照片

我的建议是,了解常见的行为问题。还要检查向数据科学家/工程师/分析师提出的技术问题的类型,你可以在网上找到很多,大多数大公司都在使用相同的问题集!

这里有一篇来自特伦斯·申的关于微软常见问题的精彩文章。

6 —反馈帮助你变得更好

我喜欢反馈,在体育或职业环境中。好的反馈可以帮助你变得更好,了解你的差距。因此,每次我面试失败,我总是试图从招聘经理那里得到反馈。但是不要试图在面试中寻求反馈,你可能会让面试官尴尬,让情况变得不舒服。我认为更好的方法是,如果你收到一封电子邮件说你失败了,你可以跟进并寻求反馈,只是要知道招聘经理可能没有时间回答你和/或在法律上可以不提供任何反馈。

并不是说你已经学会了我的成功面试的 6 个技巧,你知道该怎么做,我不能向你保证这些技巧会给你一份工作,但我认为你可以增加获得工作的机会。如果你没有达到这一步,我写了另一篇关于如何准备简历的文章。

祝你旅途好运!

感谢您的阅读!

如果你喜欢我的工作,想支持我…

  1. 你可以从我在媒体 这里跟我开始。
  2. LinkedIn 这里关注我。

如果你喜欢这个主题,请继续阅读:

在数据科学领域建立职业生涯艾米丽·罗宾逊和杰奎琳·诺利斯

像数据科学家一样思考Brian Godsey 著

在数据科学访谈中听到的:超过 650 个最常见的访谈问题&答案由 Kal Mishra 提供

等待模特训练时的 6 个待办事项

原文:https://towardsdatascience.com/6-to-do-tips-when-waiting-for-models-to-train-cced7b79a0df?source=collection_archive---------30-----------------------

模特训练很费时间。它的长度可以从几小时到几天甚至几周。数据科学家在等待模型训练的时候都做些什么?为了回答这个问题,我采访了 20 多位数据科学家,结合我自己的经历与你分享这个故事。

你呢? 如果模特培训也是你工作的一部分,等待时你最喜欢的活动是什么?欢迎您留下评论,与社区分享您的故事。

待办事项提示 1 —编写自动调优脚本

单个机器学习(ML)模型有数百万个超参数组合。建议在调优脚本中使用贝叶斯优化、进化搜索等方法来提高超参数调优效率,这确实需要时间去学习。

为了简化脚本开发,我想推荐一些有用的超参数优化工具:

  • ml lib:Apache Spark 的可扩展机器学习库。
  • Hyperopt :为分布式异步超参数优化而构建的库。
  • DEAP :一个应用超参数调整的进化计算框架。
  • GpyOpt :使用 GPy 为高斯过程优化而构建的库。
  • AutoSklearn :专注于算法选择和超参数调优的 Sklearn 子集。
  • TPOT :一个应用超参数调整的 python 自动化机器学习工具。

待办事项提示 2——搜索备选方案

因为“站在巨人的肩膀上”,一个单一的研究往往会在多个地方被用作“巨人”,并被分支为备选方案。您可能想探索类似的方法,并将其与您当前的工作进行比较。备选方案不应局限于模型架构,还应包括数据矢量化、标准化、特征提取等。

照片由本工程 RAEngUnsplash 上拍摄

待办事项提示 3 —分析数据

一些接受采访的数据科学家评论说,他们总是通过简单地观察相同的数据集几个星期来发现新的东西。他们可以通过维度映射、特征可视化和分布图在非常不同的视图中分析数据。他们声称,重复的数据分析给他们带来了许多新的创新想法,尤其是当遇到瓶颈时。

也许? 如果你的机构有人类数据标签员,你也应该试着问问他们是否注意到了什么有趣的事情。

待办事项提示 4 —添加单元测试

单元测试”是工程师们经常使用的一个项目,但是我发现有更多的数据科学家开始引入单元测试来保证工作质量。单元测试可以避免意想不到的输出,检测边缘情况,并防止损坏的代码被推送。识别缺失数据、重复数据、数据范围是数据科学中单元测试的常见用法。Pytest 可能是数据科学家使用的最流行的单元测试工具。

Ferenc AlmasiUnsplash 上拍摄的照片

待办事项提示 5——记录进展

对于数据科学家来说,文档并不是一个很有吸引力的任务,但是一旦你完成了,你和你的团队将会珍惜未来。培训的等待期是回顾当前进度并记录下来的最佳时机。保持文档的更新不仅有助于在你的主管随机走进来时展示你的工作,也有助于避免团队成员重复工作。

待办事项提示 6——开始平行培训工作

从谷歌和英伟达等大科技公司的数据科学家那里了解到,强烈建议推出平行培训工作。它将显著提高你的工作效率。

如果你的本地电脑足够强大,可以运行多个培训工作,那就太好了。否则,您可能需要考虑来自云提供商(如 AWS、GCP)的额外计算资源。异地培训模式可以减少您的工作设备的工作量,并轻松提升计算能力。唯一的代价是您可能会在基础设施设置上多花一点时间。

我不会告诉你 😜 : 有一些诚实的回答,比如喝咖啡,分散同事的注意力,看网飞,玩英雄联盟,改变笔记本窗口大小,祈祷成功,等等。Shuuuu!!!我知道你想说什么!让我们对数据科学家保密。

为了加速训练

如果你需要额外的计算资源比如云机器来加速训练,我给你介绍 AIbro ,这是我和我的朋友正在努力开发的一款无服务器模型训练工具。它用一行代码帮助您在 AWS EC2 机器上训练基于 Tensorflow 的模型。作为早期采用者,你将可以免费使用 4 个 V100 图形处理器。要了解更多细节,你可能想看看这个故事:

https://towards data science . com/train-neural-network-on-cloud-one-line-of-code-8ae 2e 378 BC 98

作者图片

机器学习可解释性的 6 个顶级 Python 包

原文:https://towardsdatascience.com/6-top-python-packages-for-machine-learning-interpretability-f9fec3c2d1e9?source=collection_archive---------15-----------------------

你需要解释你的机器学习模型

作者图片

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。

开发机器学习模型是任何数据科学家都应该做的事情。我遇到过许多数据科学研究,它们只关注建模方面和评估,而没有解释。

然而,许多人还没有意识到机器学习可解释性在业务流程中的重要性。根据我的经验,业务人员会想知道模型是如何工作的,而不是度量评估本身。

这就是为什么在这篇文章中,我想向你介绍我的一些顶级的机器学习可解释性 python 包。让我们开始吧!

1.黄砖

Yellowbrick 是一个开源的 Python 包,它用可视化分析和诊断工具扩展了 scikit-learn API 。对于数据科学家,Yellowbrick 用于评估模型性能和可视化模型行为。

Yellowbrick 是一个多用途的软件包,您可以在日常建模工作中使用。尽管 Yellowbrick 的大部分解释 API 都是基础级别的,但它对于我们的第一个建模步骤仍然很有用。

让我们用一个数据集例子来试试 Yellowbrick 包。首先,让我们安装软件包。

pip install yellowbrick

安装完成后,我们可以使用 Yellowbrick 中的数据集示例来测试这个包。

#Pearson Correlation

from yellowbrick.features import rank2d
from yellowbrick.datasets import load_credit

X, _ = load_credit()
visualizer = rank2d(X)

使用 Yellowbrick rank2d 函数的 Pearson 相关性(图片由作者提供)

通过一条线,我们能够使用皮尔逊相关方法来可视化特征之间的相关性。它是可定制的,因此您可以使用另一个相关函数。

让我们尝试开发模型来评估模型性能和解释模型。我将使用 Yellowbrick 用户指南中的示例数据集,并生成一个区分阈值图,以找到区分二进制类的最佳阈值。

from yellowbrick.classifier import discrimination_threshold
from sklearn.linear_model import LogisticRegression
from yellowbrick.datasets import load_spamX, y = load_spam()
visualizer = discrimination_threshold(LogisticRegression(multi_class="auto", solver="liblinear"), X,y)

由 Yellowbrick 绘制的阈值图(图片由作者提供)

使用黄砖阈值图,我们可以解释该模型在概率阈值为 0.4 时表现最佳。

如果你好奇 Yellowbrick 能做什么,请访问主页了解更多信息。

2.ELI5

ELI5 是一个帮助机器学习可解释性的 Python 包。取自 Eli5 包,该包的基本用途是:

  1. 检查模型参数,并尝试弄清楚模型如何全局工作;
  2. 检查模型的单个预测,并找出模型做出决策的原因。

如果说 Yellowbrick 侧重于特征和模型性能解释,那么 ELI5 侧重于模型参数和预测结果。就我个人而言,我更喜欢 ELI5,因为它的解释足够简单,商务人士可以理解。

让我们用一个样本数据集和随机森林模型分类器来试试 ELI5 包。我会使用 seaborn 包中的数据集,因为它是最简单的。

#Preparing the model and the dataset
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_splitmpg = sns.load_dataset('mpg').dropna()
mpg.drop('name', axis =1 , inplace = True)#Data splitting
X_train, X_test, y_train, y_test = train_test_split(mpg.drop('origin', axis = 1), mpg['origin'], test_size = 0.2, random_state = 121)#Model Training
clf = RandomForestClassifier()
clf.fit(X_train, y_train)

最基本的 ELI5 功能是显示分类器权重和分类器预测结果。让我们尝试这两个函数来理解解释是如何产生的。

import eli5
eli5.show_weights(clf, feature_names = list(X_test.columns))

分类器特征重要性权重(作者图片)

从上面的图像中,您可以看到分类器显示了分类器特征的重要性及其偏差。您可以看到位移特征是最重要的特征,但是它们有很高的偏差,表明模型中存在偏差。让我们试着展示一下预测结果的可解释性。

eli5.show_prediction(clf, X_train.iloc[0])

预测结果贡献(图片由作者提供)

使用 ELI5 的显示预测功能,我们可以获得特征贡献信息。哪些特征有助于某些预测结果,这些特征对概率的影响有多大。这是一个很好的功能,您可以轻松地向业务人员解释模型预测。

然而,最好记住上面的函数是基于树的解释(因为我们使用随机森林模型)。给你一个商业人士的解释可能就足够了;但是,由于模型的原因,可能会有偏差。这就是为什么 ELI5 提供了另一种方法来解释基于模型度量的黑盒模型——它被称为排列重要性。

让我们先试试排列重要性函数。

#Permutation Importance
perm = PermutationImportance(clf, scoring = 'accuracy',
random_state=101).fit(X_test, y_test)
show_weights(perm, feature_names = list(X_test.columns))

排列重要性结果(图片由作者提供)

排列重要性背后的思想是如何评分(准确度、精确度、召回率等。)随着特征的存在或不存在而移动。在上面的结果中,我们可以看到 displacement 的得分最高,为 0.3013。当我们改变位移特征时,它将改变模型的精度高达 0.3013。正负符号后的值是不确定度值。排列重要性方法本质上是一个随机过程;这就是为什么我们有不确定值。

位置越高,这些特征对得分的影响越大。底部的一些特征显示了一个负值,这很有趣,因为这意味着当我们改变特征时,该特征增加了得分。发生这种情况是因为,偶然地,特征排列实际上提高了分数。

就我个人而言,ELI5 已经给了我足够的机器学习可解释性,但我仍然想向您介绍一些 Python 包。

3.SHAP

如果我们在谈论机器学习的可解释性时不提及 SHAP ,那就不完整。对于那些从未听说过它的人来说,SHAP 或(SHapley Additive explaints)是一种解释任何机器学习模型输出的博弈论方法。用一个更简单的术语来说,SHAP 用 SHAP 值来解释每个特征的重要性。SHAP 利用 SHAP 值之间的差异对模型的预测和零模型进行了开发。SHAP 是模型不可知的,类似于排列重要性,所以它对任何模型都是有用的。

让我们尝试使用样本数据集和模型来更详细地解释 SHAP。首先,我们需要安装 SHAP 软件包。

#Installation via pip
pip install shap #Installation via conda-forge 
conda install -c conda-forge shap

在这个示例中,我将使用 titanic 示例数据集,并且只依赖数字列。这仅用于示例目的,不应成为数据分析的标准。

#Preparing the model and the dataset 
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split titanic = sns.load_dataset('titanic').dropna() 
titanic = titanic[['survived', 'age', 'sibsp', 'parch']] #Data splitting for rfc X_train, X_test, y_train, y_test = train_test_split(titanic.drop('survived', axis = 1), titanic['survived'], test_size = 0.2, random_state = 121) #Model Training 
clf = RandomForestClassifier() clf.fit(X_train, y_train)

我们已经用泰坦尼克号的数据训练了我们的数据,现在我们可以试着用 SHAP 来解释这些数据。让我们利用模型的全局可解释性来理解 SHAP 是如何工作的。

import shap 
shap_values = shap.TreeExplainer(clf).shap_values(X_train) shap.summary_plot(shap_values, X_train)

要素对预测结果的总体影响(图片由作者提供)

从结果可以看出,年龄特征对预测结果的贡献最大。如果您想查看特定类对预测的贡献,我们只需要稍微调整一下代码。假设我们要查看类 0,这意味着我们使用下面的代码。

shap.summary_plot(shap_values[0], X_train)

功能对类 0 的影响(图片由作者提供)

从上图中,我们可以看到每个数据对预测概率的贡献。颜色越红,数值越高,反之亦然。此外,当该值在正侧时,它有助于类 0 预测结果概率,反之亦然。

SHAP 不局限于全球可解释性;它还为您提供了解释单个数据集的功能。让我们尝试解释第一行的预测结果。

explainer = shap.TreeExplainer(clf)
shap_value_single = explainer.shap_values(X = X_train.iloc[0,:])
shap.force_plot(base_value = explainer.expected_value[1],
                shap_values = shap_value_single[1],
                features = X_train.iloc[0,:])

第一行的单个预测结果解释(图片由作者提供)

从上图中可以看出,预测更接近于 0 类,因为它是由 age 和 sibsp 功能推动的,而 parch 功能的贡献很小。

4.Mlxtend

Mlxtend 或机器学习扩展是一个用于数据科学日常工作生活的 Python 包。包中的 API 并不局限于可解释性,而是扩展到各种功能,比如统计评估、数据模式、图像提取等等。然而,我们将讨论我们当前文章的可解释性 API 绘制的决策区域。

决策区域图 API 将生成一个决策区域图,以可视化该特征如何决定分类模型预测。让我们尝试使用示例数据和来自 Mlxtend 的指南。

首先,我们需要安装 Mlxtend 包。

pip install Mlxtend

然后,我们使用示例数据集并开发一个模型来查看 Mlxtend 的运行情况。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import itertools
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import EnsembleVoteClassifier
from mlxtend.data import iris_data
from mlxtend.plotting import plot_decision_regions# Initializing Classifiers
clf1 = LogisticRegression(random_state=0)
clf2 = RandomForestClassifier(random_state=0)
clf3 = SVC(random_state=0, probability=True)
eclf = EnsembleVoteClassifier(clfs=[clf1, clf2, clf3], weights=[2, 1, 1], voting='soft')# Loading some example data
X, y = iris_data()
X = X[:,[0, 2]]# Plotting Decision Regions
gs = gridspec.GridSpec(2, 2)
fig = plt.figure(figsize=(10, 8))for clf, lab, grd in zip([clf1, clf2, clf3, eclf],
                         ['Logistic Regression', 'Random Forest', 'RBF kernel SVM', 'Ensemble'],
                         itertools.product([0, 1], repeat=2)):
    clf.fit(X, y)
    ax = plt.subplot(gs[grd[0], grd[1]])
    fig = plot_decision_regions(X=X, y=y, clf=clf, legend=2)
    plt.title(lab)
plt.show()

基于不同机器学习分类器的决策区域绘制(图片由作者提供)

从上面的图中,我们可以解释模型做出的决定。当他们做出预测时,你可以看到每个模型之间的差异。例如,X 轴值越高,类 1 的逻辑回归模型预测结果越大,但 Y 轴上没有太大变化。它与随机森林模型形成对比,在随机森林模型中,划分不会随着 X 轴值发生很大变化,而 Y 轴值对于每个预测都似乎是恒定的。

决策区域的唯一缺点是它仅限于二维特征,因此它对于预分析比实际模型本身更有用。然而,它对于与商务人士的交谈仍然是有用的。

5.PDPBox

PDP 或部分依赖图是显示特征对机器学习模型的预测结果的边际效应的图。它用于评估特征和目标之间的相关性是线性的、单调的还是更复杂的。

用部分依赖情节来解释的好处是对于商务人士来说很容易解释。这是因为部分相关函数的计算足够直观,人们可以理解:当我们干预一个特征时,部分相关图的计算具有因果解释,并且我们测量预测中的变化;这是我们可以衡量解释的时候。

让我们尝试使用用户指南中的样本数据来更好地理解 PDPBox 。首先,我们需要安装 PDPBox 包。

pip install pdpbox

然后,我们可以尝试按照用户指南了解更多关于 PDPBox 如何帮助我们创建可解释的机器学习的信息。

import pandas as pd
from pdpbox import pdp, get_dataset, info_plots#We would use the data and model from the pdpboxtest_titanic = get_dataset.titanic()titanic_data = test_titanic['data']
titanic_features = test_titanic['features']
titanic_model = test_titanic['xgb_model']
titanic_target = test_titanic['target']

当我们有了数据和模型后,让我们尝试使用 info plots 函数来检查特征和目标之间的信息。

fig, axes, summary_df = info_plots.target_plot(
    df=titanic_data, feature='Sex', feature_name='gender', target=titanic_target
)
_ = axes['bar_ax'].set_xticklabels(['Female', 'Male'])

二进制特征的目标图(来源:https://github . com/sauce cat/PDPbox/blob/master/tutorials/PDPbox _ binary _ class ification . ipynb))

用一个函数就可以得到目标和特征的统计信息。使用该功能很容易向商务人士解释。让我们一起检查模型预测分布函数和特征。

fig, axes, summary_df = info_plots.actual_plot(
    model=titanic_model, X=titanic_data[titanic_features], feature='Sex', feature_name='gender')

二元特征的实际预测图(来源:https://github . com/sauce cat/PDP box/blob/master/tutorials/PDP box _ binary _ class ification . ipynb))

现在,让我们继续使用 PDP 绘图功能来解释我们的模型预测。

pdp_sex = pdp.pdp_isolate(
    model=titanic_model, dataset=titanic_data, model_features=titanic_features, feature='Sex')fig, axes = pdp.pdp_plot(pdp_sex, 'Sex')
_ = axes['pdp_ax'].set_xticklabels(['Female', 'Male'])

性特征 PDP 剧情(来源:https://github . com/sauce cat/PDP box/blob/master/tutorials/PDP box _ binary _ class ification . ipynb))

从上图中,我们可以理解为,当性别特征为男性时,预测概率会降低(意味着男性存活的可能性更小)。这就是我们如何使用 PDPbox 来获得模型可解释性。

6.解释性语言

InterpretML 是一个 Python 包,包含了很多机器学习可解释性 API。这个软件包的目的是给你一个基于 plotly 的交互式绘图,以了解你的预测结果。

通过使用我们已经讨论过的许多技术——即 SHAP 和 PDP,InterpretML 为您提供了许多解释您的机器学习(全局和局部)的方法。此外,这个包拥有一个 Glassbox 模型 API,当您开发模型时,它为您提供了一个可解释性函数。

让我们用一个样本数据集来试试这个包。首先,我们需要安装 InterpretML。

pip install interpret

我想用解释的玻璃盒子模型给你一个例子,因为,对我个人来说,使用起来很有趣。让我们尝试使用 titanic 数据集样本来开发模型。

from sklearn.model_selection import train_test_split
from interpret.glassbox import ExplainableBoostingClassifier
import seaborn as sns#the glass box model (using Boosting Classifier)
ebm = ExplainableBoostingClassifier(random_state=120)titanic = sns.load_dataset('titanic').dropna()#Data splitting
X_train, X_test, y_train, y_test = train_test_split(titanic.drop(['survived', 'alive'], axis = 1), 
                                                    titanic['survived'], test_size = 0.2, random_state = 121)
#Model Training
ebm.fit(X_train, y_train)

由玻璃盒模型开发的模型和特征结果(图片由作者提供)

使用 InterpretML 中的玻璃盒模型,它会自动对您的特征进行热编码,并为您设计交互特征。让我们试着为这个模型找到一个全局的解释。

from interpret import set_visualize_provider
from interpret.provider import InlineProvider
set_visualize_provider(InlineProvider())from interpret import showebm_global = ebm.explain_global()
show(ebm_global)

玻璃盒子全球解读(图片由作者提供)

从上图中,我们可以看到模型特征重要性的总结。它显示了基于模型特征重要性的所有被认为重要的特征。

可解释的是一个交互式的图,您可以用它来更具体地解释模型。如果我们只看到上图中的摘要,我们可以选择另一个组件来指定您想要看到的特性。这样,我们可以解释模型中的特征如何影响预测。

票价全球可解释性(图片由作者提供)

在上图中,我们可以看到低票价降低了生存的机会,但随着票价变高,它增加了生存的机会。然而,你可以看到密度和条形图-许多人来自一个较低的票价。

很多时候,我们不仅对全局的可解释性感兴趣,也对局部的可解释性感兴趣。在这种情况下,我们可以使用下面的代码来解释它。

#Select only the top 5 rows from the test data
ebm_local = ebm.explain_local(X_test[:5], y_test[:5])
show(ebm_local)

首行局部可解释性(图片由作者提供)

局部可解释性显示了单个预测是如何做出的。根据用户指南,这里显示的值是来自模型的对数优势分数,它们被相加并通过逻辑连接函数得到最终预测。我们可以看到,在这个预测中,男性性工作者对降低生存几率的贡献最大。

结论

机器学习的可解释性对于任何数据科学家来说都是一个重要的工具,因为它允许您更好地向业务用户传达您的结果。

在这篇文章中,我已经概述了另一个 6ML 可解释性 Python 包:

  1. 黄砖
  2. ELI5
  3. SHAP
  4. Mlxtend
  5. PDPBox
  6. InterpretML

希望有帮助!

访问我的LinkedIn**或 Twitter **

如果您没有订阅为中等会员,请考虑通过我的推荐订阅。

6 类数据科学利益相关方

原文:https://towardsdatascience.com/6-types-of-data-science-stakeholders-dd209270435c?source=collection_archive---------30-----------------------

知道你在和谁一起工作,这样你才能获得成功

micha Parzuchowski 在 Unsplash 上的照片

你正在参加新项目的启动会议。它应该是有趣的——它是一个总是让你着迷的领域,你很高兴尝试一些新方法。房间里的人轮流介绍自己。你已经准备好发表你的演讲了:你是数据科学家,过去曾成功地交付过 X 项目,很乐意做 Y,并期待着与每个人一起工作。但在此之前,你的主要利益相关者介绍他们自己——关键决策者,去或不去的人,你需要说服推出你的项目的人……他们会是什么类型的利益相关者?

类型 1——学者

描述:这个人很聪明。通常情况下,他们会拥有一个技术上的博士学位,但通常是晦涩的话题。他们不会被数学公式吓倒,他们可能会倾向于将你的项目推向最新的前沿方法。

如何识别这种类型:他们在公司会有非常聪明的名声。他们可能会问很多关于算法和假设的问题。他们可以提出你从未听说过的方法——如果你们没有相同的背景,尤其如此(例如,他们学的是计量经济学,而你学的是计算机科学)。他们对商业的理解可能有很大差异,但通常与他们离开学术界的时间密切相关。

成功策略:让他们觉得自己很聪明——说“很棒的观点”和“我还没想到这个,我一定会考虑的。谢谢你的建议。”经常提醒他们,建模经常是迭代的,你可以通过说你想在引入复杂性之前先使用更熟悉的模型来转移建议。展示他们的建议是如何融入到你的工作中,或者仍然存在于待办事项中。

此外,确保你三次检查你的结果,并重新审查你的模型选择中的那些统计假设,以防学者在下一次会议上进行即兴突击测验。你需要表现得在智力上可信,以赢得他们的信任。

类型 2 —主题专家

描述:他们在这个话题上已经努力了很长时间。他们可以回答任何关于领域、人员和当前方法的问题(并且经常设计现有的方法)。他们可能不熟悉大多数机器学习和算法。

如何识别这种类型:在 LinkedIn 上查找他们——他们在同一个部门工作了很长时间吗?在会议期间,他们可能会在算法讨论期间保持安静,但会仔细检查您的功能重要性图和结果。

成功策略:花大量时间了解他们的方法,以及他们如何衡量成功。变得非常熟悉现有的结果,这样你就可以感觉检查你的结果。和下面的人一起工作,跟上方言的速度,这样你就可以说说话了。选择可解释的模型!尝试从接近他们现有的东西开始,然后从它开始迭代。在大型会议上展示之前,与利益相关者团队一起检查任何“驱动因素”的解释。公开感谢他们在这方面的专业知识,以及这些知识如何帮助你的项目更加成功。

类型 3—AI Fangirl/Fanboy

描述:数据科学是他们的新宠。他们消费了如此多的博客、LinkedIn 帖子或杰瑞米·霍华德的讲座,以至于他们的谷歌推荐已经得到了不可逆转的训练。他们不想听到数据清理;他们喜欢谈论算法。

如何识别这种类型:在项目启动日,他们对这个项目非常兴奋。他们分享不同公司正在解决的问题的故事,并说出几个新颖的算法。他们还会定期给你发邮件,介绍一些非常小众的方法,并建议你尝试一下。他们喜欢谈论深度学习。

成功策略:他们可能不会满足于简单的方法,即使这种方法效果很好,是项目的最佳选择。试着回应他们不断的建议,解释为什么这种方法不是最好的方法——通常如果你发送一个冗长的解释,他们会让步。但是你可能需要一个宠物算法来满足他们的求知欲——但是,嘿,这对你来说也是一个学习的机会,对吗?只是要清楚时间权衡,并确保他们理解成本。

最后,如果你同时拥有第二种类型——主题专家和第三种类型——人工智能粉丝,那么你可以利用人工智能粉丝对人工智能解决方案的热情来帮助赢得中小企业。

第 4 类——高管/前顾问

描述:他们能够以温和而引人注目的方式主持会议。他们将引导你通过你所有精心制作的算法解释,ROC 图,SHAP 值等。相反,他们会抬起头来问:“附加值是什么?”

如何识别这种类型:通常高级经理及以上都属于这一类,即使他们从未从事过咨询工作。如果他们称这次会议为“指导委员会”,那就完全暴露了他们是前顾问。

成功战略:关注商业决策、创造的价值和洞察力。花很多时间思考他们关心什么,他们需要做什么决定,你会意识到你需要去掉所有的技术幻灯片。使用可解释的模型,并准备好在高层次上解释为什么结果看起来是这样。此外,将结果转换成美元数字,即使这可能需要一些分析体操。沟通是特别关键的,所以确保你有完美的陈述。

类型 5 —首席数据科学家

描述:他们曾经站在你的立场上,比你更能确定这个项目的范围。他们也很清楚这个问题应该并且能够解决。他们是思想伙伴,在组织中获得了足够的影响力来监督这个项目。

如何识别这种类型:你可能会认识他们。

成功策略:把他们当导师。准备好建议,但也欢迎反馈。帮助他们专注于项目成功所需的任何时间表、可交付成果或外部支持。

第六类——啦啦队长

描述:这个人对这个项目太激动了。他们对每个人都说好话,并决心让它成功,尽管可能没有明确的成功标准。他们对任何见解都印象深刻,对像样的结果感到兴奋,并适应他们的时间表。

如何识别这种类型:他们说我们每周都有很大进步。他们一直感谢每个人的贡献。他们会在任何模型的第一个版本上说“这真的很棒”,并且心甘情愿地、令人鼓舞地听从他人的专业意见。

成功策略:确保他们总是了解最新的成功或不足。依靠他们在公司内宣传你的项目,并为他们提供必要的信息。和这些人一起工作通常很棒——如果你喜欢,一定要让他们知道你欣赏他们!

我不相信每个人都会符合这 6 种类型,很多人会是特质的组合。尽管如此,我希望你能多花一分钟考虑一下你的利益相关者所关心的事情,并做出相应的调整。失败的项目往往不是来自数据或模型,而是没有能力让领导者参与进来。

与不同个性的利益相关者一起工作?欢迎在评论中分享。

任何数据科学家都应该知道的 6 种“特性重要性”

原文:https://towardsdatascience.com/6-types-of-feature-importance-any-data-scientist-should-master-1bfd566f21c9?source=collection_archive---------6-----------------------

“特性重要性”的完整指南,这是 ML 中最有用(也是最难理解)的概念之一

[图片由作者提供]

特征重要性是机器学习实践者的一个基本概念。

由于其简单性和直观性,该指标不仅被数据科学家持续监控,而且也经常传达给预测模型的非技术利益相关者

但是,尽管很直观,“特性重要性”的概念也有些模糊。其实有很多种不同的计算方式。因此,了解它们及其利弊非常重要,以确保我们回答的正是我们想要回答的问题。

本文的目的是阐明计算特性重要性的各种方法。

但是我们所说的“特性重要性”是什么意思呢?

在深入这个主题之前,我们最好就“特性重要性”的含义达成一致。

假设我们有一个数据帧,叫做 X ,其中每行代表一个“观察”,每列代表一个特征(或“特性”)。我们也有一个现象(或“目标变量”),我们希望对每个观察结果进行预测。

特征重要性是分配给每一列(或特征)的 0 到 100 之间的分数,告诉该特征在预测目标变量方面有多强大。

注意,我们还要求所有特征的总和应该是 100 。所以我们隐含地假设我们已经观察到了所有可能有助于解释目标变量的特征。

特征重要性的分类

让我们从特性重要性类型的概念图开始。

功能重要性类别的概念图。[图片由作者提供]

我们遇到的第一个区别是单变量和多变量的重要性。两者的区别在于:

  • 单变量重要性单独考虑每个特征
  • ****多元重要性有条件地衡量每个特征对所有其他特征的贡献。

这两种类型的重要性传达了非常不同的含义,我们可以说是“正交的”。这就是为什么我个人更喜欢提供两种类型的重要性:一个单变量和一个多变量。这样最终用户可以得到更完整的画面。

1.单变量的

单变量重要性的目标是让得到目标变量对每个特征的依赖程度,忽略所有其他特征。分数可以从封闭公式(如皮尔逊相关)或预测模型(如随机森林的 ROC 曲线下的曲线)获得。然后,将所有特征的分数归一化为总和 100。

一般来说,单变量重要性的主要优点和缺点如下:

  • ****优点:这很容易理解,因为我们人类倾向于单变量推理。此外,它不会受到相关特性的影响。
  • 反对意见:这可能会把现实过于简单化。事实上,它没有考虑到这些特性之间是如何相互影响的。

让我解释一下,当我说单变量重要性不受相关特征影响时,我的意思是什么。

假设你有两个特征,身高和年龄,你用一个随机森林来预测你的目标变量。这是它们的重要性:

特征重要性(2 个特征)。[图片由作者提供]

两者同样重要,都接近 50%。

然而,如果你有高度相关的特性,会发生什么呢?例如,如果您不仅有以年为单位的年龄,还有以天为单位的年龄和以月为单位的年龄,并且您试图计算多元重要性,您将得到以下结果:****

多元特征重要性。[图片由作者提供]

由于关于年龄的 3 个特征携带相同的信息,年龄的整体重要性(大约 50%)实际上在它们之间共享。

但是,如果我们使用单变量重要性,我们会得到一个不同的图像,即所有的特征得到近似相同的重要性水平,这更准确地反映了事实:

单变量特征重要性[图片由作者提供]

既然我们已经看到了单变量重要性的优点和缺点,让我们来看看属于这一类别的一些方法。可以使用许多算法,但是,作为一个例子,我们将看到 3 个用 Python 实现的相关方法。

- F 统计量

分类目标变量的最简单类型的单变量重要性由 F 统计(也称为 ANOVA)给出。在这种情况下,您希望根据数值特征的值预测由 2 个或更多类组成的目标变量。然后,计算 F 统计量,作为特征的组间变异性和组内变异性的比率。****

注意,对于连续的目标变量这等同于使用皮尔逊相关性,因为相关性可以通过简单公式被“转换”为 F 统计量。

Scikit-learn 有两个处理分类和连续情况的函数,分别是f_classiff_regression,因此您可以通过以下方式使用它:

from sklearn.feature_selection import f_classiff = pd.Series(f_classif(X, y)[0], index = X.columns)
fimpo = f / f.sum() * 100

如果y是绝对的,或者

from sklearn.feature_selection import f_regressionf = pd.Series(f_regression(X, y)[0], index = X.columns)
fimpo = f / f.sum() * 100

如果y连续。

-最大信息系数

f 统计或皮尔逊相关非常简单。事实上,第一种方法只解决方法之间的差异,第二种方法只解决线性关系。

一种更稳健的方法是使用互信息,这可以被认为是在已知一个随机变量的情况下,降低另一个随机变量的不确定性。注意,这也说明了非线性关系

然而,MI 的主要缺点是它要求特征是离散的,而事实往往并非如此。最大信息系数旨在克服这一问题,因为它自动为我们收集连续特征,以使它们之间的 MI 最大。

在 Python 中,可以在库 Minepy 中找到 MIC 的实现(可以通过pip install minepy安装)。假设X是一个熊猫数据帧,而y是一个熊猫系列,那么你可以通过以下方式获得每个特性的 MIC:

from minepy import MINEdef get_mic(x, y):
    mine = MINE()
    mine.compute_score(x, y)
    return mine.mic()f = X.apply(lambda feature: get_mic(feature, y))
fimpo = f / f.sum() * 100

-预测能力得分

既然我们想要估计一个特征和一个目标变量之间的关系,为什么不在那个单一特征上拟合一个预测模型,比如决策树?这是预测能力评分(PPS)背后的想法,它首次出现在this against Data Science 文章中。

诀窍在于模型是非线性的,所以它也能够捕捉非线性关系。此外,PPS 还具有一些其他方便的特性,例如不对称,并且可以针对分类/数字特征/目标的每种可能的组合来实现。

专用的 Python 库可以通过pip install ppscore安装。

import ppscoref = ppscore.predictors(pd.concat([X, y], axis = 1),
  column_target).set_index(‘x’)[‘ppscore’]
fimpo = f / f.sum() * 100

2.多变量的

多元重要性试图回答这样一个问题:一个特性的总体重要性是什么,考虑到我们对所有其他特性的了解?换句话说,它也考虑了特征之间的相互作用。

我们来看看多元重要性的利弊。

  • 优点:它更完整,因为它考虑了互动。此外,消除预测模型的模糊性也很有用。
  • ****缺点:如上一段所示,当特征高度相关时,可能会产生误导。

让我们从劳伦斯·汉密尔顿的论文中借用一个例子来解释为什么交互很重要。教育水平可能不能说明一个人对海平面上升有多担心。但是,如果你将这一特征与政治意识形态结合起来,它突然变得相关了。因此,教育水平对这一主题的单变量重要性较低,而其多变量重要性较高。

特征(教育和政治意识形态)之间相互作用预测海平面上升的例子。谁在乎极地的汉密尔顿?2008 年美国民意调查结果

在多元重要性中,可以区分两个子类别:

  • Fit-time :模型一训练好,特征重要性就可用。
  • ****预测时间:只有在模型对某些数据进行评分后,特征重要性才可用。

让我们分别来看看它们。

3。适合时间

在拟合时间,可以在训练阶段结束时计算特征重要性。因此,它反映了模型对训练数据的学习。简化一点,一个特性在训练阶段用得越多,这个特性就越重要。

这也称为“内在”重要性,因为计算方法是特定于模型的。

  • ****优点:速度快,因为可以直接从训练好的模型外推,所以除了训练模型之外什么都不需要。它也很方便,因为它内置在一些 Python 模型中。例如,在 Scikit-learn 中,调用model.feature_importances_就足够了。
  • ****缺点:它可能会赋予那些在看不见的数据上不能很好工作的特性很高的重要性。此外,它依赖于模型:对于某些模型来说,即使不是不可能,也是很难计算的。此外,基于杂质的特征对树的重要性强烈偏向于高基数特征(见 Scikit-learn 文档)。

由于拟合时间的重要性是依赖于模型的,我们将只看到对基于树的模型有效的方法的例子,如随机森林或梯度推进,这是最流行的方法。

-杂质减少

在决策树中,选择分裂是为了减少观察组中的杂质(如基尼系数、熵或均方误差)。因此,很自然地将导致杂质最大程度减少的特征视为最重要的特征。

因此,特征 f 的重要性被计算为在 f 上分裂的所有节点的平均杂质减少量(由该节点中的观察数量加权)。

这是 Scikit-learn 模型调用model.feature_importances_的默认重要性。

举个例子,

from sklearn.ensemble import RandomForestClassifierrf = RandomForestClassifier().fit(X, y)
fimpo = pd.Series(rf.feature_importances_ * 100, index = X.columns)

-分割计数

另一种方法,这里描述为,是简单地计算一个特征在所有树上被分割的次数。直觉上,一个被使用了 10 次的特性比一个只被使用了 5 次的特性重要两倍。

这个方法在 XGBoost 库中是本地可用的:

from xgboost import XGBClassifierxgb = XGBClassifier().fit(X, y)
f = pd.Series(xgb.get_booster().get_score(importance_type='weight'))
fimpo = f / f.sum() * 100

-覆盖范围

计算拆分数量可能会产生误导。例如,一些拆分可能只涉及少量的观察,因此它们实际上并不相关。为了克服这个问题,可以通过覆盖范围来加权每个分裂,即受分裂影响的观察的数量。

这个方法在 XGBoost 库中是本地可用的:

from xgboost import XGBClassifierf = pd.Series(xgb.get_booster().get_score(importance_type='cover'))
fimpo = f / f.sum() * 100

4.预测时间

拟合时间重要性的主要缺点是它依赖于模型。因此,对于某些模型,如逻辑回归或神经网络,计算起来会很麻烦。

为了克服这个问题,存在一组可以在预测时计算的方法,即在模型已经完成训练阶段之后的。这也意味着这些方法可以应用于除训练数据集之外的数据集。****

  • ****优点:它与模型无关。此外,由于它是在预测时完成的,因此可以针对不同的数据集进行计算,这在实际应用中证明是非常有用的。
  • ****缺点:计算可能会很慢,因为可能需要进行迭代(排列重要性)或者采用复杂的方法(SHAP)。

在预测时间方法的范畴内,有两种主要类型的算法:

  • ****目标必需,除了模型的输入数据,还需要知道目标变量;
  • ****不需要目标:即使不知道目标变量,也可以使用这些方法。

让我们分别来看看它们。

5.需要目标

在这个类别中,主要的算法是“排列重要性”。以下是它的利弊:

  • ****优点:它是模型不可知的。此外,由于它是在预测时完成的,因此可以针对不同的数据集进行计算,这在实际应用中证明是非常有用的。
  • ****缺点:目标变量不可用时不能使用。它受到高度相关特征的影响,事实上,当你随机打乱一个特征时,模型仍然会使用与你打乱的特征相关的其他特征。这将导致低估所有相关特征的重要性。

-排列重要性

假设你已经训练了一个预测模型 M

顾名思义,该算法一次随机打乱一个特征,并在包含打乱的列的数据集上进行模型 M 的预测。然后,它计算预测的性能得分(例如,ROC 曲线下的面积)。

对数据集中的所有要素重复此操作。其思想是性能分数的恶化(与“未受破坏”的数据集上的 M 的性能相比)与特性的重要性成比例。请注意,此过程是在测试数据集上执行的,而不是在对模型进行定型的数据集上执行的。

例如,为什么要改变特性而不是输入一个固定的值?因为排列允许保留原始分布。这是更安全的,因为我们想利用一个已经在原始特征上的模型。

排列的重要性在 Scikit-learn 中很容易找到:

from sklearn.inspection import permutation_importancef = permutation_importance(model, X, y)[‘importances_mean’]
fimpo = f / f.sum() * 100

6.不需要目标

在实际应用中,机器学习的全部意义在于对我们尚未观察到目标变量的实例进行预测。因此,计算这些实例的特征重要性特别有用。这是这套方法的主要特点。

  • ****优点:它也可以应用于我们没有目标变量的数据集。这对于现实世界的应用程序来说是至关重要的,当我们想要计算我们正在预测的最新数据的特征重要性时。
  • ****缺点:计算起来可能会很慢。

我们将看到的方法是基于 Shap 值的。Shap 可以通过同名 Python 库计算。假设您已经训练了一个模型,您可以通过以下方式获得相应的 Shap 值:

import shapexplainer **=** shap.Explainer(model)
shap_values **=** pd.DataFrame(explainer(X).values, columns **=** X.columns)

-绝对重要

由于每个 Shap 值都说明了该要素的值将最终预测向上或向下“移动”了多少,因此某个要素的所有 Shap 值的总和是该要素在所选数据集上的相关性的理想代表。当然,在总结它们之前,Shap 值必须取绝对值,因为负面影响和正面影响一样重要。

f = shap_values.abs().sum()
fimpo = f / f.sum() * 100

-主要因素

除了整体效应,我们可能更感兴趣的是每个观察的最相关的特征是什么。这种方法很有趣,因为特性重要性可以直接解释为百分比,所以更容易理解。例如,如果“年龄”的重要性是 25%,这将意味着对于 25%的观察,“年龄”是最重要的特征。

要获得这个量,只需逐行取最高的 Shap 值,然后计算该值。假设 Shap 值包含在熊猫数据帧中:

fimpo = shap_values.abs().idxmax(axis = 1).value_counts(normalize=True) * 100

-带符号的主要因素

正如我们所见,Shap 值可能是正的,也可能是负的。正值有助于增加最终预测,而负值有助于降低最终预测。因此,了解哪些特性对这两个方向的影响最大有时会很有趣。

这相当于计算我们在上一段中看到的“主要因素”的重要性,就在移除负值或正值之后,这取决于您对哪个符号感兴趣。

例如,如果您想知道哪些特征与提高最终预测最相关,那么您应该将下限设置为 0:

fimpo = shap_values.clip(lower = 0).abs().idxmax(axis = 1).value_counts(normalize = True) * 100

相反,如果您想知道哪些特性与降低最终预测最相关,那么您应该将上限设置为 0:

fimpo = shap_values.clip(upper = 0).abs().idxmax(axis = 1).value_counts(normalize = True) * 100

比较重要性

让我们来看看我们在上看到的方法的结果,这是有史以来最著名的数据集:

Titanic 数据集上特征重要性方法的比较。[图片由作者提供]

正如您所看到的,不同方法的估计值差别很大。

性别在排列和主要因素的重要性上惊人地高,始终高于所有的单变量方法。这表明性可能与其他特征有许多相互作用。

有趣的是,我们注意到“主要因素积极”和“主要因素消极”与“主要因素”有多么不同。比如看性,“主要因素负面”高于“主要因素正面”的事实,说明性更多时候是“谴责”一个乘客生命的决定性因素,而不是挽救它。

总的来说,要点是比较不同类型的重要性(通常至少一个单变量和一个多变量)有助于了解现象和预测模型。

感谢您的阅读!我希望你喜欢这篇文章。如果你愿意, 在 Linkedin 上加我

评估二元分类模型的 6 个有用指标

原文:https://towardsdatascience.com/6-useful-metrics-to-evaluate-binary-classification-models-55fd1fed6a20?source=collection_archive---------36-----------------------

对准确性的追求可能会影响你选择一个糟糕的模型

照片由 克雷格阿德利 像素

这是蝾螈!他有一个二元分类问题

照片由 泰勒妮可

这是纽特。生活在一个神秘的世界里,纽特渴望成为最好的驯龙师。但是,只有当主人是孵化后第一个见到的生物时,龙才会接受它永远的主人。有点像一见钟情,巧合却又如此珍贵!

这就是为什么蝾螈一直在到处寻找可孵化的龙蛋。不幸的是,一个可孵化的蛋真的很难得到。

还有呢?区分可孵出的蛋和不可孵出的蛋是非常乏味的。蝾螈经常花上几个小时试图检查不同形状的龙蛋,这些龙蛋来自不同的物种,具有不同的外观,天知道还有多少环境因素会使蛋不太可能孵化。

作者图片

可怜的纽特无法孵化他发现的所有蛋,因为他的孵化器只有有限的插槽。因此,他必须在把自己逼疯之前找到更好的方法。毕竟,他想成为一名训练有素的驯龙师,而不是专业的鸡蛋分析师。

在去森林寻找龙蛋的路上,纽特遇到了狂热的科技爱好者马克斯。Max 分享了他在上的想法,如何教计算机根据蛋的图像和发现蛋的相关环境读数来识别可孵化的蛋。

然后嘣!纽特就是这样开始机器学习的。具体来说,Newt 需要训练一个分类模型来识别可孵化的蛋和不可孵化的蛋。

被选择宠坏了。选哪个?

谈到分类模型,Newt 有很多选择:逻辑回归、XGBoost 分类器、随机森林分类器、AdaBoost 分类器等等。

即使 Newt 可以入围单个模型,他也必须在不同的变量中选择最佳的一个,因为他调整了不同的超参数(又名超参数优化)或利用了不同的功能(又名功能工程)。

简而言之,在不同的模型类型、微调的超参数和特性中,Newt 需要一种可量化的方法来挑选最佳的分类模型。这就是评估指标的用途。

在接下来的部分中,我们将探索:

  • 混淆矩阵:所有度量的基础
  • 准确度、精确度、召回率、F1 分数
  • ROC 曲线和 ROC AUC

混淆矩阵:所有度量的基础

作者图片

混淆矩阵只是一种记录分类模型将事物正确或错误分类到相应桶中的次数的方法。

例如,该模型最初将 10 个蛋分类为可孵化的。然而,在这 10 个蛋中,只有 6 个蛋是可孵化的,而其余 4 个蛋是不可孵化的。在这种情况下,真阳性(TP)是 6,而假阳性(FP)是 4。

类似地,如果模型将 10 个鸡蛋归类为不可触摸的。其中 7 只实际上是不可孵化的,而剩下的 3 只可以孵化。我们说真阴性(TN)是 7,而假阴性(FN)是 3。

你可能已经听说过统计假设检验中的第一类和第二类错误。简单地说,假阳性是一类错误,而假阴性是二类错误。

这里最重要的一点是假阳性和假阴性意味着两种不同的影响。

例如,如果模型导致太多的假阳性,纽特将会浪费时间和他的孵卵器中有限的位置来照顾太多的不可处理的蛋。另一方面,如果有太多的假阴性,纽特将会浪费很多可孵化的龙蛋,因为他不会孵化那些被模型错误归类为不可孵化的龙蛋

准确度、召回率、精确度和 F1 分数

混淆矩阵的 4 个象限的绝对计数使得普通蝾螈在不同模型之间进行比较具有挑战性。因此,人们通常将混淆矩阵概括为以下指标:准确度、召回率、精确度和 F1 值。

作者图片

在典型的 ML 项目中,这些计数和计算已经是自动化的。因此,您可以使用 scikit-learn.metricstf.keras.metrics 等等轻松地检索这些预定义的值。

然而,不了解计数如何分布在混淆矩阵的 4 个象限中,盲目依赖单一指标可能是一个冒险的举动。下面是每个指标的概述以及不足之处。

准确(性)

准确性可能是最直观的理解指标,因为它关注的是预测与现实相符的频率(即真正的正面和真正的负面)。因此,精度为 0.99 的模型似乎比我们当前精度为 0.75 的模型好得多,对吗?

没那么快!

高精度可能会产生误导,因为它没有说明真正的正和真正的负是如何分布的。例如,我可以简单地将所有鸡蛋归类为不可触摸的,以获得下面的混淆矩阵以及号称 99%准确率的模型。

作者图片

很肯定纽特会大声尖叫,因为这个模型在帮助他寻找可孵化的蛋方面显然是无用的,因为所有的蛋都被贴上了不可孵化的标签。

即使预测在可孵化和不可孵化之间展开,还有另一个问题。准确度并不能告诉纽特分类模型正在犯什么类型的错误。

还记得我之前说过不同的错误对 Newt 意味着不同的影响吗?完全忽略假阳性和假阴性意味着 Newt 可能最终得到一个浪费他宝贵时间、孵化槽或龙蛋的模型。

幸运的是,精确度和召回率是考虑假阳性和假阴性的两个指标。向精确和回忆问好!

精确度和召回率

如果可孵化的蛋是 Newt 关注的,precision 旨在回答一个问题:考虑所有被模型(TP+ FP)分类为可孵化的蛋,它们中有多少实际上可以孵化成龙(TP)?

另一方面,recall(也称为 sensitivity)关注的是问题的一个非常不同的角度:在所有能孵化成龙的蛋(TP + FN)中,有多少能被模型(TP)发现?

精度和召回率的范围都是从 0 到 1。一般来说,越接近 1,模型越好。不幸的是,你不能两全其美,因为提高精度会导致召回率下降,反之亦然。下图说明了这种 精确召回的权衡。

作者图片

这里有一个简单的方法来想象在精确度和召回率之间发生了什么。

  1. 如果我们将所有的蛋分类为可孵化的(即全部为阳性),那么 FN = 0,而 FP 显著增加。因此,召回率现在是 1,而精确度将下降到接近 0。
  2. 如果我们把所有的鸡蛋都归类为不可触摸的(即所有的都是阴性),那么 FP = 0,而 FN 急剧上升。这意味着精度现在是 1,而召回率会下降到接近 0。

考虑到精确度和召回率之间的权衡,Newt 应该如何选择最优的分类模型?嗯, Newt 将不得不问自己减少假阴性比减少假阳性更重要还是更不重要。

还记得我之前说过假阳性和假阴性意味着不同的影响吗?具体来说,Newt 将不得不在浪费可孵化的龙蛋(减少假阴性并有利于高精度)或浪费时间和孵化槽(减少假阳性并有利于高召回率)之间做出有意识的选择。

因为生命是宝贵的,而龙蛋是如此的难以获得,像 Newt 这样的热爱龙的人可能更愿意选择一个具有高召回率和低精确度的模型。

F1 分数

但是如果我们的场景表明精确度和召回率都很重要呢?好吧,这就是 F1 分数的来源。

F1 得分通常被称为模型精度和召回率的调和平均值。类似于召回率和准确率,越接近 1,模型越好。

当精确度和召回率都不明显更重要时,这个指标通常对评估分类模型有用。

在现实生活的数据集中,数据可能是不平衡的,一个分类比另一个分类出现得更频繁。例如,欺诈案件可能比正常交易更少。 F1 分数也可以方便地用于评估这种不平衡数据集的分类模型。

这也结束了我们关于基于全能混淆矩阵的 4 个基本度量的部分。在下一节中,让我们用接收机工作特性(ROC)曲线更进一步。

ROC 曲线和 ROC AUC

受试者工作特征曲线

我觉得报道 ROC 代表什么有点意思。故事是这样的!二战期间,美国陆军希望提高战场上探测敌方物体的能力。在所有的计划中,ROC 曲线被用来测量雷达接收机操作员根据雷达信号正确识别日本飞机的能力。

快进到现代,ROC 曲线已被用于各种行业,如医学、放射学、气象学以及机器学习。尽管如此,人们仍然引用它的原名:受试者工作特性(ROC)曲线。

作者图片

我们来看看上面展示的 ROC 曲线。我知道图表的名称和外观可能听起来有点吓人。但就其核心而言,以下是你需要知道的 4 个要点。

首先,ROC 曲线是显示分类模型在所有决策阈值上的性能的图形。

  • 一般来说,ROC 曲线越靠近左上角,模型的性能越好。
  • 最起码,模型的 ROC 曲线必须在黑色虚线之上(这表明模型至少比随机猜测表现得更好)。

其次,模型的性能通过两个参数来衡量:

  • 真阳性(TP)率:又称回忆
  • 假阳性(FP)率:也称为假警报的概率

第三,判定阈值表示将预测概率转换成类别标签的值。例如,假设蝾螈为可孵化的蛋选择 0.6 的阈值。如果模型计算出蛋可孵化的概率大于或等于 0.6,则该蛋将被分类为可孵化的。反之亦然,如果概率低于 0.6,则该蛋被分类为不可触摸的。

最后,随着我们选择一个较低的阈值,更多的项目将被归类为阳性。这导致更多的 TP 和 FP,从而相应地提高 TP 率和 FP 率。

除了可视化模型性能之外,ROC 曲线还说明了一个关键点:确定理想阈值需要在 TP 率和 FP 率之间进行权衡,以实现您的业务目标。

在这种情况下,如果蝾螈选择太高的阈值,他可能会浪费很多龙蛋,因为大多数被错误地归类为不可触摸的。另一方面,低门槛可以让他花几个月的时间孵化这么多的蛋,但永远不会收获任何回报。

ROC AUC

作者图片

看上面的图片,相对容易看到蓝色曲线在黄色曲线上面,表示性能更好。但是如果我们有更多的代表不同模型的曲线呢?

嗯,图表可能会变得太混乱,任何人都无法辨认哪个是哪个。还有呢?对许多人来说,看数值比比较曲线要简单得多。

这就是 AUC(代表曲线下面积)派上用场的地方。从 0 到 1,AUC 测量整个 ROC 曲线下的整个二维面积。

在数学上不要太书呆子气,这里是你需要知道的:AUC 值越高,模型在分类上表现越好。 至少,一个模型的 AUC 必须大于 0.5,因为它必须比随机猜测表现得更好。否则,我们为什么要浪费时间在机器学习上呢?

离别的思绪

所以你有它!对于什么是混淆矩阵,以及在下一个二进制分类挑战中应该关注哪些评估指标,不再有混淆。选择对您的业务目标最有意义的指标是多么重要,我怎么强调都不为过。否则,你可能最终选择了一个看似最好的模型,但很快就让你陷入了困境。

这就是我这篇博文的全部内容。现在让我们和纽特说再见,祝他好运,成为世界上最好的驯龙师!

感谢您的阅读。对我如何能做得更好有反馈,或者只是想聊天?在评论里告诉我或者在 LinkedIn 上找到我。女士们先生们,祝你们愉快!

参考

  1. 分类:ROC 曲线和 AUC
  2. 使用 Scikit-Learn、Keras 和 TensorFlow 进行机器实践学习
  3. sci kit-学习指标&评分

原载于 2021 年 4 月 19 日 http://thedigitalskye.com**

6 有用的概率分布及其在数据科学问题中的应用

原文:https://towardsdatascience.com/6-useful-probability-distributions-with-applications-to-data-science-problems-2c0bee7cef28?source=collection_archive---------3-----------------------

带有示例和 Python 代码的实用概述。

它是一顶帽子吗?还是被蛇吃掉的大象?还是正态分布的混合?图片由作者提供。

概率分布是描述事情发生概率的数学函数。在我们周围的世界中发生的许多过程都可以用一些经过充分研究和分析的分布来描述。弄清楚这几个问题,对从统计上模拟一系列现象大有帮助。我们来看看六种有用的概率分布!

二项分布

可以说最直观也是最强大的概率分布是二项分布。它可用于模拟二进制数据,即只能取两个不同值的数据,即“是”或“否”。这使得二项式分布适用于建模决策或其他流程,例如:

  • 客户是否购买了产品?
  • 这种药是否有助于病人康复?
  • 在线广告被点击了吗?

二项式模型的两个关键要素是一组试验(二元实验)和成功的概率(成功是“是”的结果:点击一个广告或治愈一个病人)。例如,试验可能包括 10 次抛硬币——每一次都是二元实验,有两种可能的结果:正面或反面。成功的概率,定义为抛人头,是 50%,假设硬币是公平的。

二项分布可以回答这个问题:用一枚公平的硬币在 10 次投掷中观察到不同数量的人头的概率是多少?

绘制二项式 PMF。省略了一些绘图格式代码。

在 10 次公平的硬币投掷中获得 X 个正面的概率。图片由作者提供。

上面画的二项式概率质量函数就是答案!你可以看到,在 10 次投掷中,最有可能观察到 5 个头,这种结果的概率大约是 25%。

二项式分布实际应用的一个例子是模拟广告横幅上的点击与非点击,其中成功的概率是点击率。二项式分布可以用作异常检测器。假设你向 750 个用户展示了你的广告,有 34 个用户点击了它。这给出了 4.5%的点击率。如果你知道你之前所有广告的平均点击率是 6%,你可能会问:这次观察到不超过 4.5%的概率是多少?要回答这个问题,您可以用成功概率为 6%的二项式分布对您的点击进行建模,如下所示:

假设点击率为 6%,在 750 次展示中获得 X 个头像的概率。图片由作者提供。

那么,在 750 次印象中观察到不超过 34 次点击的概率是多少?答案是从 0 到 34 的所有条形之和,或者:binom.cdf(34, 750, 0.06)也就是 4.88%,相当不可能。要么这个新广告真的很糟糕,要么这里有猫腻……你确定你的广告提供商真的向 750 名用户展示了这个广告吗?

二项式分布描述是-否数据。它可以作为异常检测器或贝叶斯 A/B 测试的工具。

二项式分布的另一个常见应用是用于贝叶斯 A/B 测试。假设您开展了两次营销活动,并希望对它们进行比较。简单比较两个点击率可能会产生误导,因为两个点击率都有随机成分,而且一个点击率可能会比另一个点击率高,这完全是偶然的结果。有两种方法可以确定哪个活动更好:你可以求助于经典的假设检验(稍后会有更多的介绍),或者用贝叶斯方法明确估计活动 A 比活动 B 更好的概率。后者假设点击遵循二项式分布,并且贝叶斯后验概率的计算涉及二项式密度公式。如何做到这一点是一个值得单独处理的主题,但是如果你想学习贝叶斯 A/B 测试或贝叶斯统计,我鼓励你看看我关于主题的介绍文章,或者我在 DataCamp 上教授的 Python 课程中的贝叶斯数据分析。

两个广告活动的后验点击率:A 和 B。在这种情况下,B 更好,有 93%的概率。图片来自作者在 DataCamp 讲授的 Python 课程中的贝叶斯数据分析。

泊松分布

另一个非常有用的分布是泊松分布。就像二项式一样,它也是一个离散分布,这意味着它有一个有限的可能结果集。对于二项式分布,只有两个:是或否。对于泊松分布,可能有更多,但它们只能是自然数:0,1,2,等等。

泊松分布可以用来描述在时间或空间上以某种速率发生的事件。这样的过程无处不在:客户每 X 分钟就在你的网上商店购买一件商品,每一件从生产线上下来的 Yth 产品都是有缺陷的。

泊松分布有一个参数,通常用希腊字母λ (lambda)表示,它表示事件发生的速率。典型的用例是从数据中估计λ,然后使用得到的分布来执行排队模拟,以帮助分配资源。

想象一下,您有一个部署在云中的机器学习模型,并实时接收来自客户的请求。你需要为多少云资源付费,才能 99%确定你可以为任何一分钟内到达模型的所有流量提供服务?要回答这个问题,首先需要知道平均一分钟内有多少请求。根据你的流量数据,平均有 3.3 次请求。这是您的λ,因此描述您的数据的泊松分布如下所示:

策划了泊松 PMF。省略了一些绘图格式代码。

基于 3.3 的平均速率,一分钟内出现 X 个请求的概率。图片由作者提供。

基于你的泊松分布,你可以计算出一分钟内观察到 2 个事件的概率:poisson.pmf(2, 3.3),产生 20%,或者得到 5 个或更少请求的概率:poisson.cdf(5, 3.3),88%。

泊松分布描述在时间和空间上以某种速率发生的事件。它可以用来进行排队模拟,帮助分配资源。

酷,但问题是:你需要每分钟处理多少个请求,才能 99%确定处理所有流量?回答这个问题的一种方法是模拟大量(比如说 1,000,000)一分钟的时间段,并计算请求数量的第 99 个百分位数。

这产生 8,意味着如果您购买足够的资源来处理每分钟 8 个请求,您可以 99%确定在任何一分钟内处理所有的流量。

指数分布

另一种与泊松分布密切相关的分布是指数分布。如果在某个时间段内发生的事件数量遵循泊松过程,那么这些事件之间的时间用指数分布来描述。

继续前面的例子,如果我们观察到平均每分钟 3.3 个请求,我们可以使用指数分布对请求之间的时间进行建模。让我们用秒来表示:每分钟 3.3 个请求就是每秒 0.055 个请求。有一点需要注意的是,在 Python 的 scipy 包中,指数分布是用一个比例来参数化的,这是速率的倒数。此外,指数分布是连续的而不是离散的,这意味着它可以取无限多的值。为了强调这一点,我们将其绘制为阴影区域,而不是竖条。正在讨论的分布如下所示:

绘制指数 PDF。省略了一些绘图格式代码。

两个事件之间相隔 X 分钟的概率,基于每分钟 3.3 个事件的平均速率。图片由作者提供。

平均每分钟超过三个请求,在大多数情况下,从一个请求开始到另一个请求到来不会超过一分钟。然而,有时长达五分钟的时间可能会不请自来!

就像二项式分布一样,指数分布也可以作为异常检测器。在 5 分钟没有看到请求后,您可能会开始怀疑您的系统是否还活着。五分钟或更长时间没有请求的概率是多少?这是从 5 开始向右直到无穷大的所有条的总和,它等于 1 减去从 5 开始向左的条,因为所有条的总和必须是 1。所以,是1 — expon.cdf(4, 1/3.3),2.5%。不太可能,但偶尔会发生。

指数分布可用作异常检测器或预测模型的简单基准。

指数分布的另一个常见用例是作为预测模型的简单基准。例如,为了预测每个产品何时会再次被购买,您可能会使用梯度推进或构建一个奇特的神经网络。为了评估他们的表现,将他们与一个简单的基准进行比较是一个很好的做法。如果你把你的问题描述为预测下次购买的时间,那么指数分布就是一个很好的基准。一旦有了训练数据(days_till_next_purchase = [1, 4, 2, 2, 3, 6, …, ]),你要做的就是对这些数据拟合指数分布,取其均值作为预测:
avg, _ = expon.fit(days_till_next_purchase)

正态分布

正态分布,也称为钟形曲线,可能是最著名的一个,也是最广泛使用的一个——尽管经常是隐含的。

首先也是最重要的,作为统计推断基石的中心极限定理,都是关于正态分布的。我鼓励您在此阅读更多相关内容:

简而言之,CLT 认为,从随机数据样本中计算出的一些统计数据(如总和或平均值)符合正态分布。CLT 最重要的两个实际用例是回归分析和假设检验

首先说回归。在回归模型中,因变量由一些预测变量加上一个误差项来解释,我们假设误差项是正态分布的。这种假定的误差正态性源于 CLT:我们可以把误差看作是由于忽略重要的预测因素或随机机会而引起的许多独立误差的总和。这许多误差中的每一个都可以有任何分布,但是它们的总和在 CLT 看来是近似正态的。

回归模型中误差正态性的假设可以用中心极限定理来证明。它对于一些假设检验也是有用的。

第二,假设检验。当我们谈到卡方分布和 f 分布时,后面会有更详细的例子。现在,考虑这个简短的例子:一家专门从事广告重定向的公司吹嘘他们的精确定向广告平均点击率为 20%。你对他们进行 1000 次展示的试点,观察到 160 次点击,这意味着点击率只有 16%。是瞄准不准,还是运气不好?

如果你考虑向 1000 个用户展示广告,这 1000 个用户是从大量用户中随机抽取的一个子集,那么 CLT 就会出现,点击率应该遵循正态分布。假设目标公司说的是实话,应该是均值为 0.2,标准差为 0.013 的常态。查看我在 CLT 上的帖子来计算,或者相信我。正在讨论的分布如下所示:

CTR 与观测 CTR 的参考分布。由作者生成。

在这种分布下,你观察到的 16%的点击率是不太可能的,这表明所谓的 20%的平均点击率很可能不是真的。

卡方分布

在 A/B/C 测试中, χ 2 或卡方分布派上了用场。假设你进行了一个实验,你随机地向用户展示了不同颜色版本的网站。你很好奇哪种颜色会导致网站上的大部分购买。每种颜色都向 1000 名用户展示过,结果如下:

网站色彩实验结果。图片由作者提供。

黄色版本似乎几乎是蓝色版本的两倍,但数字很低,所以你如何确定这些结果不是由于偶然?

假设检验拯救世界!要了解关于这个主题的更多信息,请不要犹豫,请阅读我的假设检验者指南:

这里,让我强调一下卡方分布在这个过程中的作用。第一步是假设三个网站版本平均产生相同的购买数量。如果这是真的,我们预计每个版本的购买数量是相同的,那将是(17+9+14)/3,或者 13.33 次购买。卡方分布允许我们测量如果颜色没有影响,观察到的购买与预期的偏离程度。

卡方分布对 A/B/C 测试很有用。它衡量了我们得到的实验结果仅仅是偶然的可能性。

事实证明,如果我们计算每种颜色的预期值和观察值之间的差异(经过适当的缩放和平方),我们会得到一个符合卡方分布的测试统计值!然后,我们可以根据 p 值推断,我们观察到的购买数量的变化是由于偶然,还是实际上是由于颜色差异。

这个所谓的卡方测试是 Python 中的一行程序:

网站色彩实验的卡方检验。

我们得到卡方(chisq)值为 2.48,并且分布用 2 个自由度(df)来参数化。因此,正在讨论的分布如下所示:

绘制具有 2 个自由度的卡方 PDF。省略了一些绘图格式代码。

具有两个自由度的卡方分布。图片由作者提供。

在这种分布下,卡方值似乎很可能是 2.48,这让我们得出结论,不同颜色网站购买数量的差异可能仅仅是随机因素造成的。几乎 0.3 的高 p 值进一步证明了这一点。请查看 HTG 了解更多关于假设检验的信息。

f 分布

还是坚持网站颜色实验吧,A/B/C 测试的例子。我们已经评估了颜色对一个离散变量的影响:购买数量。现在让我们考虑一个连续的变量,比如每个网站变体平均花费的秒数。

作为实验的一部分,我们随机向用户展示了不同的网站变体,并计算了他们在网站上花费的时间。下面是 15 个用户的数据(五个显示黄色版本,另外五个显示蓝色版本,最后五个显示绿色版本)。为了使这样的实验有效,我们需要 15 个以上的用户,这只是一个演示。

花在网站不同颜色变体上的时间。图片由作者提供。

我们感兴趣的是均值之间的差异在多大程度上大于随机产生的差异。如果它们非常大,那么我们可以得出结论,颜色确实影响了网站的停留时间。这种平均值之间的比较被称为 ANOVA 或方差分析。

这个推论与我们在讨论卡方分布时已经讨论过的非常相似。我们将检验统计量计算为组均值之间的变异性与组内变异之间的比率。这种统计遵循一种称为 f 分布的分布。知道了这一点,我们就可以用 p 值来拒绝(或不拒绝)均值仅因偶然性而不同的假设。

当我们测量的结果是连续的时,f 分布用于 A/B/C 测试。

在 Python 中,我们可以使用 statsmodels 包运行 ANOVA。内部计算基于线性回归模型,因此调用ols()并将数据收集到两列数据框中。

网站颜色对网站使用时间影响的方差分析(ANOVA)。

这是我们得到的anova_table:

ANOVA 输出。

我们的 F 分布用两个自由度参数进行参数化:一个用于颜色均值和总体平均值之间的差异(2),另一个用于每种颜色内的差异(12)。因此,我们的分布如下:

以 2 和 12 个自由度绘制 PDF。省略了一些绘图格式代码。

具有 2 个和 12 个自由度的 F 分布。图片由作者提供。

由于我们得到的 F 统计值等于 7.6(因此,因为 p 值很小),我们得出结论,在不同网站变体上花费的平均时间之间的差异不可能是随机造成的。颜色在这里确实起了作用!

概述

  • 二项式分布对是非数据建模很有用。它可以作为异常检测器或贝叶斯 A/B 测试的工具。
  • 泊松分布可以用来描述在时间或空间上以某种速率发生的事件。它通常用于进行排队模拟,帮助分配资源。
  • 指数分布描述了两个事件之间的时间遵循泊松分布。它可以用作异常检测器或预测模型的简单基准。
  • 正态分布描述了根据中心极限定理建立的随机数据样本计算的一些统计数据。由于这一点,我们可以假设回归模型中误差的正态性,或者很容易地进行一些假设检验。
  • 卡方分布通常用于 A/B/C 测试。它衡量了我们得到的实验结果仅仅是偶然的可能性。
  • 当我们测量的结果是连续的时,f 分布用于 A/B/C 测试,例如在 ANOVA 分析中。这个推论类似于使用卡方检验离散结果的推论。

感谢阅读!

如果你喜欢这篇文章,为什么不 订阅邮件更新 我的新文章呢?并且通过 成为媒介会员 ,可以支持我的写作,获得其他作者和我自己的所有故事的无限访问权限。

需要咨询?你可以问我任何事情,也可以在这里 为我预约 1:1

也可以试试 我的其他文章 中的一篇。不能选择?从这些中选择一个:

提高 ML 模型准确性的 6 种方法

原文:https://towardsdatascience.com/6-ways-to-improve-your-ml-model-accuracy-ec5c9599c436?source=collection_archive---------6-----------------------

简单的步骤获得更好的结果

里卡多·阿尔塞在 Unsplash 上的照片

最令人沮丧的事情之一是,在他们花费数小时收集数据、清理数据、标记数据并使用数据来训练和开发机器学习模型后,最终得到的模型精度低或误差范围大,这比数据科学家愿意承认的情况更常见。

在机器学习中,术语模型准确性指的是为决定某个模型是否是描述不同问题变量之间关系的最佳模型而进行的测量。我们经常使用训练数据(样本数据)为新的、未使用的数据训练模型。

如果我们的模型具有良好的准确性,它将在训练数据和新数据上都表现良好。拥有一个高精度的模型对整个项目的成功是至关重要的,如果你是为客户建造的,这对你的收入也很重要!

从商业角度来看,绩效等于金钱;如果一个模型的精度低,它将导致更多的错误,这可能是非常昂贵的。我说的不仅仅是财务方面;想象一个用于诊断癌症或任何其他晚期疾病的模型;错误的诊断不仅会花费医院的钱,还会给病人及其家人带来不必要的精神创伤。

</5-types-of-machine-learning-algorithms-you-need-to-know-5ac7fce8920d>

那么,我们能避免所有这些并提高我们机器学习模型的准确性吗?数据科学家可以使用不同的方法来提高模型的准确性;在这篇文章中,我们将经历 6 种这样的方式。让我们直接进入…

方法 1:添加更多数据样本

只有当你拥有足够多的数据时,数据才能讲述一个故事。每一个数据样本都提供了一些输入和视角,以反映数据的整体情况。也许改善模型性能并提高其准确性的最简单、最直接的方法是向定型数据中添加更多的数据样本。

这样做将为您的数据添加更多细节,并微调您的模型,从而获得更准确的性能。记住,毕竟,你给你的模型的信息越多,它学习的就越多,它能够正确识别的案例就越多。

方法二:换个角度看问题

有时添加更多的数据并不能解决模型不准确的问题。您为您的模型提供了良好的技术和正确的数据集。但是你没有得到你想要的结果;为什么?

也许你只是问了错误的问题或试图听到错误的故事。从一个新的角度来看问题,可以为您的模型添加有价值的信息,并帮助您发现故事变量之间的隐藏关系。问不同的问题可能会得到更好的结果,最终会更准确。

方法 3:给你的数据添加一些上下文。

背景在任何情况下都很重要,训练机器学习模型也不例外。有时,一个数据点不能讲述一个故事,因此您需要为我们打算应用于该数据的任何算法添加更多的上下文,以获得良好的性能。

更多的上下文总是可以导致对问题更好的理解,并最终导致模型更好的性能。想象一下,我告诉你我在卖一辆车,一辆宝马。仅此并不能给你太多关于汽车的信息。但是,如果我加上颜色、型号和行驶距离,那么你会对这辆车及其可能的价值有一个更好的了解。

方法 4:微调您的超参数

训练一个机器学习模型是一项只能通过实践来磨练的技能。是的,你可以遵循一些规则来训练你的模型,但是这些规则并没有给出你所寻求的答案,只是给出了达到那个答案的方法。

然而,要得到答案,你需要做一些尝试和错误,直到你得到你的答案。当我第一次开始学习不同的机器学习算法,如 K-means,我迷失在选择最佳数量的聚类以达到最佳结果。优化结果的方法是调整其超参数。因此,调整算法的参数总是会带来更好的精度。

方法 5:使用交叉验证来训练您的模型

在机器学习中,交叉验证是一种用于增强模型训练过程的技术,通过将整个训练集分成更小的块,然后使用每个块来训练模型。

使用这种方法,我们可以增强算法的训练过程,但使用不同的块并对结果进行平均来训练它。交叉验证用于优化模型的性能。这种方法非常流行,因为它非常简单且易于实现。

</7-tips-for-data-science-newbies-d95d979add54>

方法 6:尝试不同的算法。

如果您尝试了我们到目前为止讨论的所有方法,而您的模型仍然导致较低或一般的准确性,那会怎么样?然后呢?

有时我们选择一种算法来实现,但这种算法并不真正适用于我们所拥有的数据,因此我们得不到我们期望的结果。改变算法,你用来实现你的解决方案。尝试不同的算法会让你发现更多关于你的数据的细节和它试图讲述的故事。

外卖食品

作为一名新的数据科学家,最难学习和作为一名专业人员最难掌握的事情之一是提高机器学习模型的准确性。如果你是一名自由开发人员,拥有自己的公司,或者是一名数据科学家,拥有一个高精度的模型可以决定你整个项目的成败。

准确率低的机器学习模型,造成的不仅仅是财务损失。如果该模型用于敏感领域,如任何医疗应用,该模型中的错误可能会给与该模型结果相关的人带来创伤和情感损失。

</5-reasons-why-every-data-scientist-should-blog-f1d81550a6c3>

幸运的是,有各种简单而有效的方法可以提高模型的准确性,并为他们节省大量时间、金钱和精力,如果模型的准确性较低,这些时间、金钱和精力可能会浪费在减少错误上。

提高机器学习模型的准确性是一项只能通过实践来提高的技能。您构建的项目越多,您对下次应该使用哪种方法来提高模型的准确性的直觉就越准。随着时间的推移,你的模型会变得更加精确,你的项目会更加具体。

作为数据科学家,保持健康关系的 6 种方法

原文:https://towardsdatascience.com/6-ways-to-maintain-a-healthy-relationship-as-a-data-scientist-706dd3bb4285?source=collection_archive---------34-----------------------

如何减轻屏幕时间观看的负面影响

TheStandingDesk.comUnsplash 上拍照

在数据科学领域工作似乎经常需要在计算机屏幕前花费大量时间。无论是学习新工具、用 Python 和 R 开发编程,还是了解最新的研究论文。这还不包括从事副业项目、投资组合或其他与数据科学无关的任务的预期。

虽然这是数据科学家生活的一部分,但有时会对您的身心健康产生负面影响。临床研究表明,每天看屏幕超过 6 个小时会恶化一个人的情绪,导致抑郁。此外,坐在办公桌前会给你的脊椎和椎间盘带来额外的压力,尤其是不良姿势。

那么我们如何避免这些负面影响呢?

不幸的是,我们不能完全避免它们,但我们可以做些事情来降低风险,改善我们的整体健康和与屏幕时间的关系。在本文中,我将介绍一些您可以做的事情。

使用黑暗模式

如今,数据科学家使用的许多平台和软件都提供了某种“黑暗”模式设置。默认情况下,大多数平台在白色背景上显示黑色文本。切换到深色模式,通常意味着它将在深色背景上显示白色文本。

除了“深色”看起来更酷之外,你为什么想这么做?黑暗模式被认为可以减少蓝光照射,并有助于缓解长时间屏幕显示带来的眼睛疲劳。如果你在睡觉前看着屏幕,这也有助于你更容易快速入睡。

无论你是使用你的网络浏览器,R Studio,还是你最喜欢的 IDE,这些平台中的大部分都有能力很容易地将主题更改为暗设置。

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

买一张立式办公桌

如果你的空间允许,并且你的体力允许,站立式办公桌是一个很好的方式来帮助消除久坐的有害影响。这包括改善你的情绪和能量水平,减少背痛,提高生产力,甚至降低肥胖和代谢疾病的风险,这些疾病通常与久坐有关。

大多数立式办公桌的优点在于,它们可以调节,让你根据自己的喜好和舒适度来改变桌子和屏幕的高度。它还能让你轻松地变换坐姿和站姿,让你在长时间连续对着屏幕工作时获得更好的平衡。

优先安排锻炼时间

就像你优先安排时间对你可以访问的新数据集进行探索性数据分析一样,在你的日历上安排锻炼时间(字面上或比喻上)也很重要。这可以简单到每小时从你的办公桌前站起来四处走走,或者中午去跑一会儿步。重要的是你要休息一下,从事一些你感兴趣的体育活动。

如果你真的雄心勃勃,跑步机办公桌可以让你两全其美。

只做你真正喜欢的副业

作为数据科学家,很多时候,我们希望通过为我们的投资组合承担新项目来扩展我们的投资组合或技能范围,这些项目可以展示我们对特定领域的掌握。

这对初级数据科学家或仍在学术界的人尤其重要,他们可能需要严重依赖他们的投资组合和项目来获得一份没有专业经验的行业工作。在这种情况下,你可以接一些你认为会突出你认为雇主正在寻找的特定技能或领域重点的特定兼职项目。

不幸的是,这通常意味着在日常工作职责或课堂之外花费额外的时间来完成这些项目。实际上,你可能并不总是喜欢在空闲时间做这些项目,但却愿意去做,以达到你想要的目的。

我的建议是,知道自己的最终目标后,保持这种决心。但是当你得到了你想要的工作或职位时,试着在你的空闲时间专注于你真正喜欢的副业。这会给你带来更多的回报,激励你,你的健康也会感谢你!

尽可能将工作转移到屏幕外

数据科学最有价值的方面之一是它是一个快速发展和变化的领域。对于最前沿的机器学习算法或人工智能的改进使用,总是有新的研究。这意味着大多数专业人士和数据科学家都有兴趣并有动力利用日常活动之外的空闲时间来了解最新信息,无论是通过阅读白皮书还是通常以数字形式呈现的文章和教程。

与其花更多的时间在屏幕前,一个避免额外时间的替代方法是打印研究论文并阅读它们。这不仅能减轻你眼睛的疲劳,而且更容易在纸上强调和记笔记,这有助于你更有效地吸收信息。

此外,您可以阅读关于这些主题的已出版书籍,而不是阅读关于数据科学主题的文章或其他在线材料。

绿色变色龙Unsplash 上的照片

减少你的工作时间

这个很简单。不要长时间盯着屏幕。休息一下。不要每周工作超过 50 小时。

如果你整天在家伏案工作,每隔一个小时左右离开你的电脑。去你家/后院走走,或者去你的冰箱里喝一杯水。

如果你感到有压力要在截止日期前完成一个项目,减少你工作的时间,并因此看着屏幕,似乎是具有挑战性的。但是你可以做的一件事是更有效地利用你的时间,减少分心,让你用更少的时间做更多的事情。如果你没听说过帕累托原则,也就是 80-20 法则,它说:

80-20 法则认为,对于任何给定的事件,80%的结果(或输出)是由 20%的原因(或输入)造成的。

换句话说,你投入到一个特定项目或任务中的 20%的努力和时间,却完成了 80%的工作。这意味着剩下的时间对最终结果的贡献并不大,因此有很大的空间来最大化你的工作效率,并从你的屏幕前赢回时间!

最后的想法

在数据科学领域工作可能是一次有益的经历,你对它的热情可以驱使你花很多时间来掌握你的手艺和技能。然而,就像生活中的其他事情一样,适度和平衡是与它保持健康关系的关键。最重要的是你和照顾好自己。尽可能保持你的工作时间,想办法提高效率,让自己休息一下,或者找到更健康的工作替代方式。

数据科学的职业生涯是漫长的,所以要慢慢来。

参考文献

(1)——https://www . health line . com/health/the-mental-health-effects-of-being-constantly-online

(2)——https://www . health line . com/health/is-dark-mode-better-for-your-eyes

6 个网页抓取工具,让收集数据变得轻而易举

原文:https://towardsdatascience.com/6-web-scraping-tools-that-make-collecting-data-a-breeze-457c44e4411d?source=collection_archive---------2-----------------------

任何数据科学项目的第一步都是数据收集。

马库斯·斯皮斯克在 Unsplash 上的照片

没有数据就没有完整的数据科学项目;我甚至可以主张,没有数据就不能说“数据科学”。通常,在大多数数据科学项目中,您需要分析和用来建立机器学习模型的数据存储在某个数据库中。某个地方有时是网络。

您可能会从关于特定产品的特定网页或社交媒体收集数据,以发现模式或进行情感分析。无论您为什么收集数据或打算如何使用数据,从网络上收集数据(网络搜集)是一项非常乏味的任务,但您需要为您的项目完成它的目标。

网络抓取是你作为数据科学家需要掌握的重要技能之一;你需要知道如何寻找、收集和清理你的数据,这样你的结果才是准确和有意义的。

网络抓取一直是一个灰色的法律领域,所以在我们深入研究可以帮助您的数据提取任务的工具之前,让我们确保您的活动完全合法。2020 年,美国法院将公开数据的网络抓取完全合法化。也就是说,如果任何人都可以在网上找到这些数据(比如维基文章),那么刮掉这些数据就是合法的。

但是,当您这样做时,请确保:

  1. 你不会以侵犯版权的方式重复使用或重新发布数据。
  2. 你尊重你试图抓取的网站的服务条款。
  3. 你有一个合理的爬行速度。
  4. 你不要试图抓取网站的隐私部分。

只要你不违反这些条款,你的网络抓取活动应该是合法的。

如果您正在使用 Python 构建您的数据科学项目,那么您可能会使用 BeatifulSoup 和 requests 来收集您的数据并使用 Pandas 来分析它。本文将向您介绍 6 种不包含 BeatifulSoup 的 web 抓取工具,您可以免费使用它们来收集您下一个项目所需的数据。

№1: 普通爬行

Common Crawl 的创建者开发了这个工具,因为他们相信每个人都应该有机会探索和分析他们周围的世界,并揭示其模式。他们向任何好奇的人免费提供只有大公司和研究机构才能获得的高质量数据,以支持他们的开源信念。

这意味着,如果你是一名大学生,一名在数据科学中导航的人,一名寻找下一个感兴趣的主题的研究人员,或者只是一个喜欢揭示模式和发现趋势的好奇的人,你可以使用这个工具,而不用担心费用或任何其他财务问题。

公共爬行提供原始网页数据和文本提取的开放数据集。它还为教育工作者教授数据分析提供了非基于代码的使用案例和资源支持。

№2: 猥琐

Crawly 是另一个惊人的选择,特别是如果您只需要从网站提取基本数据,或者如果您希望提取 CSV 格式的数据,以便您可以在不编写任何代码的情况下分析它。

你所需要做的就是输入一个 URL,你的电子邮件地址来发送提取的数据,以及你想要的数据格式(选择 CSV 或 JSON),瞧,抓取的数据就在你的收件箱里供你使用。您可以使用 JSON 格式,然后使用 Pandas 和 Matplotlib 在 Python 中分析数据,或者使用任何其他编程语言分析数据。

虽然如果你不是程序员,或者你刚刚开始接触数据科学和 web scarping,Crawly 是完美的,但它有其局限性。它只能提取有限的 HTML 标签集,包括:TitleAuthorImage URLPublisher

№3: 内容抓取器

内容抓取器是我最喜欢的网络抓取工具之一。原因是,它非常灵活;如果你只想删除一个网页,不想指定任何其他参数,你可以使用他们简单的图形用户界面。然而,如果你想完全控制提取参数,内容抓取器给你这样做的选项。

内容抓取的优势之一是你可以安排它从网上自动抓取信息。众所周知,大多数网页会定期更新,因此定期提取内容非常有益。

它还为提取的数据提供了多种格式,从 CSV、JSON 到 SQL Server 或 MySQL。

№4: Webhose.io

Webhose.io 是一个 web scraper,允许您从任何在线资源中提取企业级的实时数据。Webhose.io 收集的数据是结构化的,clean 包含情感和实体识别,并有 XML、RSS、JSON 等不同格式。

Webhose.io 为任何公共网站提供全面的数据覆盖。此外,它提供了许多过滤器来细化您提取的数据,以便您可以在更少的清理任务之前直接进入分析阶段。

Webhose.io 免费版每月提供 1000 个 HTTP 请求。付费计划提供更多通话,对提取数据的权力,以及更多好处,如图像分析和地理定位以及长达 10 年的存档历史数据。

</5-chrome-extension-to-ease-up-your-life-as-a-data-scientist-c5c483605d0d>

№5: ParseHub

ParseHub 是一个强大的网络抓取工具,任何人都可以免费使用。只需点击一下按钮,它就能提供可靠、准确的数据提取。您还可以安排抓取时间,以保持数据最新。

ParseHub 的优势之一是它可以轻松地删除更复杂的网页。你甚至可以指示它搜索表格、菜单、登录网站,甚至点击图像或地图来进一步收集数据。

还可以为 ParseHub 提供各种链接和一些关键字,它可以在几秒钟内提取相关信息。最后,您可以使用 REST API 下载提取的数据,以 JSON 或 CSV 格式进行分析。您还可以将收集的数据导出为 Google Sheet 或 Tableau。

№6: 报废蜜蜂

我们列表中的最后一个抓取工具是 Scrapingbee。Scrapingbee 为 web 抓取提供了一个 API,它甚至可以处理最复杂的 Javascript 页面,并将它们转换成原始的 HTML 供您使用。此外,它有一个使用谷歌搜索的网络抓取专用 API。

报废蜜蜂有三种用途:

  1. 一般的 Web 抓取,例如,提取股票价格或客户评论。
  2. 搜索引擎结果页面通常用于 SEO 或关键字监控。

3.成长黑客,包括提取联系信息或社交媒体信息。

Scrapingbee 提供了一个免费计划,包括 1000 个信用点和无限使用的付费计划。

最后的想法

在数据科学项目工作流程中,为项目收集数据可能是最无趣也是最乏味的一步。这项任务可能相当耗时,如果你在公司工作,甚至是自由职业者,你知道时间就是金钱,这总是意味着如果有更有效的方式来做某事,你最好利用它。

好消息是网页抓取不一定是乏味的;您不需要执行它,甚至不需要花费太多时间来手动执行它。使用正确的工具可以帮助您节省大量时间、金钱和精力。此外,这些工具对于分析师或没有足够编码背景的人来说是有益的。

</6-data-science-certificates-to-level-up-your-career-275daed7e5df>

当你想要选择一个工具来抓取网页时,你需要考虑一些因素,如 API 集成和大规模抓取的可扩展性。本文向您介绍了一些可用于不同数据收集机制的工具;给他们一个机会,选择一个让你的下一个数据收集任务变得轻而易举的方法。

用于各种教育目的的 6 个数据科学 YouTube 播放列表

原文:https://towardsdatascience.com/6-youtube-playlists-in-data-science-for-every-educational-purpose-5bee960c4d01?source=collection_archive---------3-----------------------

地面零点

每个播放列表都针对您数据科学之旅中的特定需求。

照片由穆罕默德·诺哈西Unsplash 上拍摄

如今,你可以在网上找到许多数据科学课程。问题是很多都有类似的内容。通过学习类似课程,你不会获得新的技能或知识。作为一名数据科学家,您需要多种技能,例如“如何开发模型”、“如何调整模型”和“如何解释结果”。例如,如果你参加的课程只涵盖算法背后的数学,你可能不会在你的旅程中取得成功。

另一方面,您可能会阅读许多为您列出数据科学课程的文章。我也见过他们!这些列表中的大多数没有根据课程或教育目的对课程进行分类,而是根据教师或平台的名气来列出课程。你没有足够的时间把它们都拿出来,得出同样的结论。这就是为什么我决定与你分享这些 YouTube 播放列表。下面列出的每个 YouTube 播放列表(或课程)都针对您数据科学之旅中的特定需求。

如果你想成为一名数据科学家,你需要学习数据科学的各个方面。你必须…

  • 学习算法背后的纯数学
  • 获得关于他们的洞察力,
  • 用一系列实用 小贴士武装自己,
  • 熟悉高级算法,以及
  • 学习使用开发 工具

我不想说纯数学比开发工具更重要,而后者不是。然而,如果你想成为一名经验丰富的数据科学家,你别无选择,只能学习所有这些方面。如果你是新手,建议先看看下面的文章。

—数学落后

你可能只想学习机器学习算法背后的纯数学,以增强你的知识深度。如果你热爱纯数学,我推荐 YouTube 上一个名为“ mathematicalmonk 的频道。”虽然导师的身份不明,但在撰写本文时,该频道已有超过 80K 名快乐订户。他们教授一些最可靠的经典机器学习课程。如果你想学习算法背后的数学,没有什么能打败这个程序。几年前我参加了这些课程,现在我仍然在需要的时候查阅频道。

为什么我喜欢这个播放列表?讲师通过解释机器学习算法的数学而不过度简化它们来教授机器学习算法。😮

—获得洞察力

要成为某个话题的专家,你必须获得洞察力。例如,对算法和方法论有一个表层的理解是令人钦佩的,但是如果你不知道底层的事实,你将无法解决关键的问题。为了做到这一点,我鼓励你在 YouTube 上查看麻省理工学院开放式课程项目的人工智能课程(课程编号:6–034 F10)。

既然这些是人工智能课程,它们当然涵盖了机器学习以外的主题。讲师,已故的帕特里克·温斯顿教授,是一位世界知名的讲师,他将在几秒钟内抓住你的注意力。我知道你会在看完第一个视频后继续看所有的视频。这些课程可以在麻省理工开放式课程项目的 YouTube 频道上找到。开放式课程(OCW)是麻省理工学院(MIT)在 2002 年发起的一个非凡的项目。

为什么我喜欢这个播放列表?导师帮助你全面理解概念,而不是只和你分享他的知识。💪

帕特里克·温斯顿教授(1943 年 2 月 5 日—2019 年 7 月 19 日)

https://www.amazon.com/gp/product/B08D2M2KV1

—实用技巧

你可能正在准备一个工作面试,需要一个关于人工智能某些方面的复习课程。一系列的视频有很多可视化和一个有趣的教练会有所帮助。一张图片绝对(至少)胜过千言万语。StatQuest 是一个 YouTube 频道,在撰写本文时拥有约 46.6 万订户。它提供了数学和视觉的完美结合。讲座以激光为中心,尽可能简短。

此外,讲师约书亚·斯塔默教授课程的方式让你不可能觉得无聊。例如,如果你需要准备一次工作面试,但时间紧迫,那么他的课程非常值得探索。有一次,我想更多地了解一个当时相对较新的 boosting 算法,名为 XGBoost ,这个频道帮助我快速了解了我需要知道的一切。

为什么我喜欢这个播放列表?讲师通过一系列带有实用技巧的短视频教授复杂的概念。我也说了有趣的方式吗?😊

—高级算法

麻省理工学院的课程“深度学习入门”是最新深度学习材料的精彩集合。如果你正在寻找一门深度学习课程,它采用实用的方法,将基础知识与编码经验和酷应用相结合,我强烈推荐它。他们保持了教育视频中你可能想要的一切的理想平衡。这是一门入门课程,所以不要期望在计算机视觉或自然语言处理方面有深入的课程,但它将照亮你学习该领域最新进展的道路。

为什么我喜欢这个播放列表?这是最好的入门深度学习课程,知识和编码结合得非常好。👍

—开发工具

[1] AI Adventures 是一个涵盖 AI 开发主题的优秀系列视频。它可以在谷歌云技术 YouTube 频道上获得。如果你已经知道机器学习的概念,这是学习关键开发工具的完美工具。通过参加一两门在线课程,你不会成为开发机器学习解决方案的专家,但这些视频提供了基本开发工具的非常体面的介绍。

为什么我喜欢这个播放列表?当开发一个人工智能产品时,简单明了地学习所需的开发工具是必不可少的。👨‍💻

[2] Python 是 AI 开发的主流编程语言。您可以在网上找到大量开源项目,它们将加速您在 Python 方面的发展。一个名为 PyData 的 Python 社区在世界各地举办了许多活动,他们在以该社区命名的 YouTube 频道上分享这些场合的视频。在撰写本文时, PyData 频道拥有超过 114,000 个订户。他们的视频涵盖了包括编码在内的各种主题,并且提供了大量与 Python 相关的实用技巧。

为什么我喜欢这个播放列表?PyData 频道通过非正统的课程解释了现实世界数据科学项目的具体细节。🤖

https://www.youtube.com/user/PyDataTV

遗言

我把几个免费数据科学课程的信息放在了一起。至少在某些方面,这些课程都是独一无二的。由于我已经参加了这些课程的部分或全部,我可以诚实而毫不犹豫地向您推荐它们。这篇文章解释了为什么这些课程是独特的,谁可能能够充分利用它们。这些课程非常适合各种学习风格和教育目的。我知道它们将为您的数据科学研究节省时间和精力。我希望它们对你有所帮助。

感谢阅读!

如果你喜欢这个帖子,想支持我…

https://pedram-ataee.medium.com/membership

6G 和存在安全问题的人工智能

原文:https://towardsdatascience.com/6g-and-artificial-intelligence-with-security-problems-22779a659d49?source=collection_archive---------28-----------------------

对抗机器学习攻击的 6G 解决方案:毫米波波束预测用例

6G 是下一代通信系统。近年来,机器学习算法已经广泛应用于各个领域,例如健康、交通和自动驾驶汽车。预测算法将用于 6G 问题。随着深度学习技术的快速发展,在应用算法时考虑安全问题变得至关重要。虽然机器学习为 6G 提供了显著的优势,但人工智能模型的安全性却被忽视了。由于它在现实世界中有许多应用,安全性是算法的一个重要部分。这篇文章提出了一种针对具有对抗性学习的 6G 机器学习模型的对抗性攻击的缓解方法。针对机器学习模型的对抗性攻击背后的主要思想是通过操纵针对 6G 应用的经过训练的深度学习模型来产生错误的结果。

引用作品
如果你觉得这个实现有用,请引用它:

@misc{ 6g-sec-problems,
   author = "Catak, FO. ",
   title = "6G with Adversarial Machine Learning Security Problems: Millimeter Wave Beam Prediction Use-Case",
   year = "2021",
   url = "https://arxiv.org/abs/1905.01999",
   note = "[arXiv:1905.01999 ]"
 }

1.6G 简介

直到 4G,已经探索了时频域技术来增加整体系统容量。5G 和其他技术的最新发展以前所未有的速度支持新兴应用,如智能家居、车载网络、增强现实(ar)、虚拟现实(VR),这是由大规模多输入多输出(MIMO)、毫米波通信、网络切片、小蜂窝和物联网(IoT)的最新进展实现的。这些 5G 和超越技术的复杂结构可以通过使用数据驱动方法机器学习(ML)算法来捕获。ML 强大的学习、推理、智能识别能力允许网络结构在没有人工干预的情况下自我训练和调整以支持系统的不同需求。

另一方面,6G 容易受到对抗性的机器学习攻击。图显示了一个攻击场景。攻击者得到一个合法的输入, x ,创建一个带有 e 预算的噪声向量,将输入实例和精心设计的噪声相加,以创建对抗性输入 x_adv.

作者图片

2.对抗性机器学习

对抗性机器学习是一种攻击技术,它试图通过提供巧妙处理的输入和微小的差异来欺骗神经网络模型。明显的意图是在神经网络中产生一个故障。

深度学习模型的攻击方法有很多种,FGSM 是最直接最强大的攻击类型。FGSM 的工作原理是利用神经网络的梯度来创建一个对抗的例子来规避模型。对于输入实例 x

总体步骤如下:

作者图片

3.解决方案:对抗性训练

对抗性训练是一种广泛推荐的防御方法,它意味着使用受害者分类器的梯度来生成对抗性实例,然后使用对抗性实例及其各自的标签来重新训练模型。这种技术已经被证明可以有效地保护模型免受恶意攻击。

让我们首先考虑一个常见的分类问题,它具有维度为 d 的训练实例 X ,标签空间为y我们假设分类器 h 已经被训练为最小化损失函数 l 如下:

作者图片

我们修改了针对 6G 安全问题的优化函数。下图是射频波束形成码字对抗训练的示意图。

作者图片

5.让我们开始编码吧

我将用 Python 语言展示我们提出的方法。我导入通常的标准库来构建深度学习模型,以预测 RF 波束成形码字。

import tensorflow as tf
from scipy.io import loadmat, savemat
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from tqdm import tqdm
from keras.callbacks import ModelCheckpoint
import pickle 
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import pandas as pd

在这项工作中,我将使用公开可用的 DeepMIMO 数据集攻击射频波束形成预测模型。我将使用 FGSM 攻击和均方误差损失函数进行输入操作。我的 FGSM 攻击实现在这里。

loss_object = tf.keras.losses.MeanSquaredError()

def fgsm(model, input_instance, label, n_BS,n_beams, epsilon =0.01):
    tensor_input_instance = tf.convert_to_tensor(input_instance, dtype=tf.float32)
    adv_x = input_instance
    for idx in range(0, n_BS*n_beams-2, n_beams):
        with tf.GradientTape() as tape:
            tmp_label = label[:, idx:idx + n_beams]
            tape.watch(tensor_input_instance)
            prediction = model(tensor_input_instance)
            loss = loss_object(tmp_label, prediction)
            gradient = tape.gradient(loss, tensor_input_instance)
            signed_grad = tf.sign(gradient)
            adv_x = adv_x + eps * signed_grad
    return adv_x

我们场景中的参数

该表显示了射频波束形成、深度神经网络和对抗设置的所有参数。

# Reading input and output sets generated from MATLAB
# with DeepMIMO generator http://www.deepmimo.net
In_set_file=loadmat('DLCB_dataset/DLCB_input.mat')
Out_set_file=loadmat('DLCB_dataset/DLCB_output.mat')

In_set=In_set_file['DL_input']
Out_set=Out_set_file['DL_output']

# Parameter initialization
num_user_tot=In_set.shape[0]

DL_size_ratio = .8
count=0
num_tot_TX=4
num_beams=512

原始(未设防的)训练程序

def train(In_train, Out_train, In_test, Out_test,
          nb_epoch, batch_size,dr,
          num_hidden_layers, nodes_per_layer,
          loss_fn,n_BS,n_beams):

    in_shp = list(In_train.shape[1:])

    AP_models = []
    for idx in range(0, n_BS*n_beams-2, n_beams):
        idx_str = str(idx / n_beams + 1)
        act_func = 'relu'
        model = Sequential()
        model.add(Dense(100, input_dim=in_shp[0], activation=act_func))
        model.add(Dense(100, activation=act_func))
        model.add(Dense(100, activation=act_func))
        model.add(Dense(100, activation=act_func))
        model.add(Dense(n_beams, activation=act_func))
        model.compile(loss=loss_fn, optimizer='rmsprop', metrics=['mean_squared_error'])

        history = model.fit(In_train,
                            Out_train[:, idx:idx + n_beams],
                            batch_size=batch_size,
                            epochs=nb_epoch,
                            verbose=0,
                            validation_data=(In_test, Out_test[:,idx:idx + n_beams]))

        filehandler = open('history.pkl', 'wb') 
        pickle.dump(history.history, filehandler)
        filehandler.close()

        AP_models.append(model)
    return AP_models

培训过程(正常行为)

这里,我们将在没有任何攻击者的情况下训练 RF 波束成形码字预测模型。

count=count+1
DL_size=int(num_user_tot*DL_size_ratio)

np.random.seed(2016)
n_examples = DL_size
num_train  = int(DL_size * 0.8)
num_test   = int(num_user_tot*.2)

train_index = np.random.choice(range(0,num_user_tot), size=num_train, replace=False)
rem_index = set(range(0,num_user_tot))-set(train_index)
test_index= list(set(np.random.choice(list(rem_index), size=num_test, replace=False)))

In_train = In_set[train_index]
In_test =  In_set[test_index] 

Out_train = Out_set[train_index]
Out_test = Out_set[test_index]

#In_train, In_test, Out_train, Out_test =  train_test_split(In_set, Out_set, test_size=0.33)

# Learning model parameters
nb_epoch = 10    
batch_size = 100  
dr = 0.05                  # dropout rate  
num_hidden_layers=4
nodes_per_layer=In_train.shape[1]
loss_fn='mean_squared_error'

eps = 2.0 * 16.0 / 255.0

# Model training
AP_models = train(In_train, Out_train, In_test, Out_test,
                                      nb_epoch, batch_size,dr,
                                      num_hidden_layers, nodes_per_layer,
                                      loss_fn,num_tot_TX,num_beams)
# Model running/testing
DL_Result={}
mse_list = []
for id in range(0,num_tot_TX,1): 
    beams_predicted=AP_models[id].predict( In_test, batch_size=10, verbose=0)

    DL_Result['TX'+str(id+1)+'Pred_Beams']=beams_predicted
    DL_Result['TX'+str(id+1)+'Opt_Beams']=Out_test[:,id*num_beams:(id+1)*num_beams]

    mse = mean_squared_error(Out_test[:,id*num_beams:(id+1)*num_beams],beams_predicted)
    mse_list.append(mse)
print('mse:',np.mean(mse_list))

DL_Result['user_index']=test_indexmse: 0.00030647155448710575

攻击射频波束成形码字预测模型

射频波束形成预测模型的性能相当好,为 0.00039。现在,我们将使用 FGSM 攻击该模型。

import warnings
warnings.filterwarnings('ignore')
# Model running/testing
DL_Result={}
mse_list = []
for id in range(0,num_tot_TX,1): 
    # !!!!! Attack generation !!!!
    In_test_adv = fgsm(AP_models[id], In_test,Out_test,num_tot_TX,num_beams,eps)
    beams_predicted=AP_models[id].predict( In_test_adv, batch_size=10, verbose=0)

    DL_Result['TX'+str(id+1)+'Pred_Beams']=beams_predicted
    DL_Result['TX'+str(id+1)+'Opt_Beams']=Out_test[:,id*num_beams:(id+1)*num_beams]

    mse = mean_squared_error(Out_test[:,id*num_beams:(id+1)*num_beams],beams_predicted)
    mse_list.append(mse)
print('mse:',np.mean(mse_list))mse: 0.0151878763143215

对抗训练

被攻击模型的性能(即 mse=0.01532)比正常性能(即 mse=0.00039)差。让我们用对抗性训练来训练正常模式。

# Model training function
def adv_train(In_train, Out_train, In_test, Out_test,
          nb_epoch, batch_size,dr,
          num_hidden_layers, nodes_per_layer,
          loss_fn,n_BS,n_beams, eps):

    in_shp = list(In_train.shape[1:])

    AP_models = []
    mcp_save = ModelCheckpoint('model.hdf5', save_best_only=True, verbose=0, 
                                   monitor='val_mean_squared_error', mode='min')

    for idx in range(0, n_BS*n_beams-2, n_beams):
        idx_str = str(idx / n_beams + 1)
        act_func = 'relu'
        model = Sequential()
        model.add(Dense(100, input_dim=in_shp[0], activation=act_func))
        model.add(Dense(100, activation=act_func))
        model.add(Dense(100, activation=act_func))
        model.add(Dense(100, activation=act_func))
        model.add(Dense(n_beams, activation=act_func))
        model.compile(loss=loss_fn, optimizer='rmsprop', metrics=['mean_squared_error'])

        history = model.fit(In_train,
                            Out_train[:, idx:idx + n_beams],
                            batch_size=batch_size,
                            epochs=nb_epoch,
                            verbose=0,
                            validation_data=(In_test, Out_test[:,idx:idx + n_beams]))

        callbacks = [mcp_save]
        for _ in range(10):
            In_train_adv = fgsm(model, In_train,Out_train, n_BS, n_beams)
            In_train_adv = np.concatenate((In_train, In_train_adv), axis=0)

            Out_train_adv = np.concatenate((Out_train, Out_train), axis=0)

            history = model.fit(In_train_adv,
                                Out_train_adv[:, idx:idx + n_beams],
                                batch_size=batch_size,
                                epochs=nb_epoch*3,
                                verbose=0,
                                callbacks=callbacks,
                                validation_data=(In_test, Out_test[:,idx:idx + n_beams]))
            model.load_weights('model.hdf5')

        AP_models.append(model)
    return AP_modelsAP_models = adv_train(In_train, Out_train, In_test, Out_test,
                      nb_epoch, batch_size,dr,
                      num_hidden_layers, nodes_per_layer,
                      loss_fn,num_tot_TX,num_beams,eps)# Model running/testing
DL_Result={}
mse_list = []
for id in range(0,num_tot_TX,1): 
    # !!!!! Attack generation !!!!
    In_test_adv = fgsm(AP_models[id], In_test,Out_test,num_tot_TX,num_beams,eps)
    beams_predicted=AP_models[id].predict( In_test_adv, batch_size=10, verbose=0)

    DL_Result['TX'+str(id+1)+'Pred_Beams']=beams_predicted
    DL_Result['TX'+str(id+1)+'Opt_Beams']=Out_test[:,id*num_beams:(id+1)*num_beams]

    mse = mean_squared_error(Out_test[:,id*num_beams:(id+1)*num_beams],beams_predicted)
    mse_list.append(mse)
print('mse:',np.mean(mse_list))mse: 0.0006801871943259285

所有结果

现在,RF 波束成形码字预测模型在攻击下的性能优于无防御模型的性能。

vals = [0.00039551136731949614,0.01532598592375935,0.0007175213740754419]
df = pd.DataFrame({'Scenario':['SC1: Normal','SC2: Attacked','SC3: Defended'],'vals':vals})
df.plot.bar(x='Scenario',y='vals', rot=0,color=['green', 'red','blue'], 
            edgecolor='black',legend='',linewidth=2)
plt.xlabel('')
ax = plt.gca()
for i, v in enumerate(vals):
    ax.text(-0.17+i*0.97, 0.0002 + v, str(np.round(vals[i],5)), color='blue')
plt.ylabel('MSE')
plt.grid(True, which="both", ls="--")
plt.show()

作者图片

6.结论

本研究讨论了与射频波束成形码字预测模型的脆弱性和解决方案相关的安全问题之一:(1)基于深度学习的射频波束成形码字预测器是否容易受到对抗性机器学习攻击?(2)迭代对抗训练方法是波束形成预测中对抗攻击的缓解方法吗?为了回答这些问题,我们使用 DeepMIMO 光线跟踪场景进行了实验。我们的结果证实了原始模型易受修改的 FGSM 攻击。缓解方法之一是迭代对抗训练方法。我们的实证结果还表明,迭代对抗性训练成功地提高了 RF 波束形成预测性能,并创建了更准确的预测器,表明该策略可以提高预测器的性能。

数据科学面试中的 7 个 A/B 测试问题和答案

原文:https://towardsdatascience.com/7-a-b-testing-questions-and-answers-in-data-science-interviews-eee6428a8b63?source=collection_archive---------0-----------------------

数据科学面试

运行 A/B 测试的常见陷阱和解决方案

维多利亚诺·伊斯基耶多Unsplash 上拍摄的照片

A/B 测试,也称为受控实验,在工业中广泛用于产品上市决策。它允许科技公司评估用户子集的产品/功能,以推断产品如何被所有用户接受。数据科学家处于 A/B 测试流程的最前沿,A/B 测试被认为是数据科学家的核心能力之一。数据科学面试反映了这一现实。面试官通常会问候选人 A/B 测试问题以及业务案例问题(也称为指标问题、产品感觉问题),以评估候选人的产品知识和推动 A/B 测试流程的能力。

在本文中,我们将采用面试驱动的方法,将一些最常见的面试问题与 A/B 测试的不同组成部分联系起来,包括选择测试思路、设计 A/B 测试、评估测试结果以及做出是否发货的决定。具体来说,我们将涵盖 7 个最常见的面试问题和答案。

在你开始阅读之前,如果你是一个视频爱好者,请随意查看这个 YouTube 视频以获得这篇文章的缩略版本。

目录

  1. 测试前——不是每个想法都值得测试
  2. 设计 A/B 测试

3.分析结果

4.做决策

5.资源

测试之前——不是每个想法都值得测试

A/B 测试是一个强有力的工具,但是并不是每个想法都会被测试选中。一些想法的测试成本可能很高,处于早期阶段的公司可能会有资源限制,所以对每个想法都进行测试是不切实际的。因此,我们想首先选择哪些想法值得测试,特别是当人们对改进产品有不同的意见和想法,并且有许多想法可供选择时。例如,UX 设计师可能建议更改一些 UI 元素,产品经理可能建议简化结账流程,工程师可能建议优化后端算法,等等。在这种时候,利益相关方依靠数据科学家来推动基于数据的决策。一个简单的面试问题是:

在电子商务网站上有一些增加转化率的想法,例如启用多商品结账(目前用户可以一次结账一个商品),允许非注册用户结账,改变“购买”按钮的大小和颜色等。,你如何选择投资哪个创意?

评估不同想法的价值的一种方法是使用历史数据进行定量分析,以获得每个想法的机会大小。例如,在投资一个电子商务网站的多商品结账之前,通过分析每个用户购买的多商品数量来获得影响的上限大小。如果只有很少一部分用户购买了不止一件商品,那么开发这个功能就不值得了。更重要的是调查用户的购买行为,以了解用户为什么不一起购买多件商品。是因为物品选择太少吗?物品是否太贵,他们只能买得起一件?结账过程是否过于复杂,他们不想再经历一遍?

这种分析为 A/B 测试提供了方向性的见解。然而,历史数据只告诉我们过去我们是如何做的。它无法准确预测未来。

为了全面评估每个想法,我们可以通过焦点小组和调查进行定性分析。从焦点小组收集的反馈(与用户或感知用户的引导讨论)或从调查中收集的问题提供了对用户痛点和偏好的更多洞察。定性和定性分析的结合可以帮助进一步的想法选择过程。

设计 A/B 测试

一旦我们选择了一个要测试的想法,我们需要决定我们要运行测试多长时间,以及如何选择随机单元。在这一部分,我们将逐一讨论这些问题。

运行测试需要多长时间?

为了决定测试的持续时间,我们需要获得测试的样本大小,这需要三个参数。这些参数是:

  • 第二类错误率 β 或幂,因为幂= 1 - β 。你知道其中一个,你知道另一个。
  • 显著性水平 α
  • 最小可检测效应

经验法则是,样本量 n 大约等于 16(基于 α = 0.05β = 0.8 )乘以样本方差除以 δ 平方,而 δ 是处理和对照之间的差值:

这个公式来自罗恩·科哈维、黛安·唐和徐亚的可信在线控制实验

如果你有兴趣了解我们是如何得出经验法则公式的,请看这个视频一步一步的演示。

在面试中,你不需要解释你是如何得出这个公式的,但是你需要解释我们是如何获得每个参数的,以及每个参数是如何影响样本量的。例如,如果样本方差较大,我们需要更多的样本,如果增量较大,我们需要较少的样本。

样本方差可以从现有数据中获得,但是我们如何估计 δ ,即处理和对照之间的差异?

实际上,在我们进行实验之前,我们不知道这一点,这就是我们使用最后一个参数的地方:最小可检测效应。在实践中,这是最小的差别。例如,我们可以将收入增加 0.1%视为最低可检测效果。实际上,这个价值是由多个利益相关者讨论和决定的。

一旦我们知道了样本大小,我们就可以通过将样本大小除以每个组中的用户数量来获得运行实验的天数。如果数量少于一周,我们应该运行至少七天的实验来捕获每周的模式。通常建议运行两周。说到为测试收集数据,多总比不够好。

对照组和治疗组之间的干扰

通常,我们通过随机选择用户并将每个用户分配到对照组或治疗组来划分对照组和治疗组。我们希望每个用户都是独立的,控制组和治疗组之间没有干扰。然而,有时这种独立性假设并不成立。这可能发生在测试社交网络时,如脸书、Linkedin 和 Twitter,或者双边市场,如优步、Lyft 和 Airbnb。一个简单的面试问题是:

X 公司测试了一个新功能,目标是增加每个用户创建的帖子数量。他们将每个用户随机分配到控制组或治疗组。就帖子数量而言,测试以 1%的优势胜出。在向所有用户推出新功能后,您预计会发生什么?会和 1%一样吗,如果不一样,会多一点还是少一点?(假设没有新奇效应)

答案是我们会看到一个大于 1%的值。原因如下。

社交网络(例如脸书、Linkedin 和 Twitter)中,用户的行为很可能受到其社交圈中的人的影响。如果用户网络中的人(如朋友和家人)使用某个功能或产品,用户会倾向于使用它。那叫做网络效应。因此,如果我们使用“用户”作为随机化单元,并且治疗对用户有影响,该影响可能会溢出到对照组,这意味着对照组中的人的行为会受到治疗组中的人的影响。在这种情况下,对照组和治疗组之间的差异低估了治疗效果的真正益处。对于面试问题,会超过 1%。

对于双边市场(例如优步、Lyft、ebay 和 Airbnb):控制组和治疗组之间的干扰也会导致对治疗效果的有偏估计。这主要是因为控制组和处理组之间共享资源,这意味着控制组和处理组将竞争相同的资源。例如,如果我们有一种新产品吸引了治疗组的更多司机,那么对照组的司机就会减少。因此,我们无法准确估计治疗效果。与社交网络中治疗效果低估新产品的实际收益不同,在双边市场中,治疗效果会高估实际效果。

如何应对干扰?

克里斯·劳顿在 Unsplash 上拍摄的照片

既然我们知道了为什么控制和处理之间的干扰会导致发射后效应的表现不同于处理效应,这就把我们带到了下一个问题:我们如何设计测试来防止控制和处理之间的溢出?一个示例面试问题是:

我们推出了一项新功能,为我们的骑手提供优惠券。目标是通过降低每次乘车的价格来增加乘车次数。概述测试策略以评估新功能的效果。

有许多方法可以解决群体之间的溢出问题,主要目标是隔离对照组和治疗组中的用户。下面是一些常用的解决方案,每一个都适用于不同的场景,并且都有局限性。在实践中,我们希望选择在特定条件下效果最好的方法,我们也可以结合多种方法来获得可靠的结果。

社交网络:

  • 确保隔离的一个方法是创建网络集群来代表用户组,这些用户组比组外的人更有可能与组内的人互动。一旦我们有了这些聚类,我们可以把它们分成对照组和治疗组。查看这篇文章了解更多关于这种方法的细节。
  • 自我聚类随机化。这个想法源于 Linkedin。一个集群由一个“自我”(一个焦点个体)和她的“改变者”(与她直接相连的个体)组成。它侧重于测量单出网络效应,即用户的直接连接对该用户的影响,然后每个用户要么具有该功能,要么不具有该功能,用户之间不需要复杂的交互。本文详细解释了这种方法。

双边市场:

  • 基于地理的随机化。我们可以按地理位置来划分,而不是按用户来划分。例如,我们可以将纽约大都会地区作为对照组,将旧金山湾区作为治疗组。这将允许我们隔离每个组中的用户,但缺点是会有更大的差异,因为每个市场在某些方面都是独特的,如客户行为、竞争对手等。
  • 另一种方法是基于时间的随机化,尽管不常用。基本上,我们选择一个随机的时间,例如,一周中的某一天,并将所有用户分配到控制组或治疗组。当治疗效果只持续很短一段时间时,例如当测试一种新的激增价格算法执行得更好时,它就起作用了。当治疗效果需要很长时间才能生效时,如转诊计划,则不起作用。用户可能需要一些时间来查阅他或她的朋友。

分析结果

斯科特·格雷厄姆Unsplash 上的照片

新奇和首要效应

当产品有变化时,人们会有不同的反应。有些人习惯了产品的工作方式,不愿意改变。这被称为首要效应或变化厌恶。其他人可能欢迎改变,一个新的特性吸引他们更多地使用产品。这被称为新奇效应。然而,这两种效应都不会持续很久,因为人们的行为会在一定时间后稳定下来。如果 A/B 测试有较大或较小的初始效应,这可能是由于新奇或首要效应。这是实践中常见的问题,很多面试问题都是关于这个话题的。一个简单的面试问题是:

我们对一项新功能进行了 A/B 测试,测试成功了,所以我们向所有用户发布了变更。然而,在推出该功能一周后,我们发现治疗效果迅速下降。发生了什么事?

答案是新奇效应。随着时间的推移,随着新鲜感的消退,重复使用将会减少,因此我们观察到治疗效果下降。

现在你了解了新奇和首要效应,我们如何解决潜在的问题?这是典型的面试时的跟进问题。

处理这种影响的一种方法是完全排除这些影响的可能性。我们可以只对第一次使用的用户进行测试,因为新奇效应和首要效应显然不会影响这些用户。如果我们已经有一个测试运行,我们想分析是否有一个新奇或首要效应,我们可以 1)比较对照组和治疗组的新用户的结果,以评估新奇效应 2)比较第一次用户的结果和治疗组现有用户的结果,以获得新奇或首要效应的影响的实际估计。

多重测试问题

在最简单的 A/B 测试中,有两个变量:对照(A)和治疗(B)。有时,我们会对多个变体进行测试,看看哪一个是所有特性中最好的。当我们想要测试一个按钮的多种颜色或者测试不同的主页时,就会发生这种情况。那我们就不止有一个治疗组了。在这种情况下,我们不应该简单地使用 0.05 的相同显著性水平来决定测试是否显著,因为我们正在处理 2 个以上的变量,错误发现的概率会增加。例如,如果我们有 3 个治疗组与对照组进行比较,观察到至少 1 个假阳性的几率是多少(假设我们的显著性水平是 0.05)?

我们可以得到没有假阳性的概率(假设各组是独立的),

Pr(FP = 0) = 0.95 * 0.95 * 0.95 = 0.857

然后获得至少有一个假阳性的概率

Pr(FP >= 1) = 1 — Pr(FP = 0) = 0.143

只有 3 个治疗组(4 个变体),假阳性(或 I 型错误)的概率超过 14%。这就是所谓的“多重测试问题。一个简单的面试问题是

我们正在对 10 个变体进行测试,尝试不同版本的登录页面。一个治疗成功,p 值小于 0.05。你会改变吗?

答案是否定的,因为多重测试的问题。有几种方法可以接近它。一种常用的方法是 Bonferroni 校正。它将显著性水平 0.05 除以测试次数。对于面试问题,由于我们测量 10 个测试,那么测试的显著性水平应该是 0.05 除以 10,即 0.005。基本上,我们只要求一个显著的测试,如果它显示 p 值小于 0.005。Bonferroni 校正的缺点是它往往过于保守。

另一种方法是控制误发现率 (FDR):

FDR = E[假阳性的数量/拒绝的数量]

它度量了所有对零假设的拒绝,也就是说,您声明具有统计显著差异的所有指标。有多少是真的不同,有多少是假阳性。这只有在你有大量的度量标准时才有意义,比如说几百个。假设我们有 200 个指标,FDR 上限为 0.05。这意味着我们可以接受 5%的假阳性。我们每次都会在这 200 个指标中观察到至少 10 个假阳性。

做决定

照片由优 X 创投Unsplash 上拍摄

理想情况下,我们看到实际上显著的治疗结果,我们可以考虑向所有用户推出该功能。但是有时,我们会看到相矛盾的结果,比如一个指标上升,而另一个指标下降,所以我们需要做出一个双赢的权衡。一个简单的面试问题是:

运行测试后,您会看到所需的指标,例如点击率在上升,而印象数在下降。你会如何做决定?

实际上,做出产品发布决策可能非常复杂,因为要考虑各种因素,如实施的复杂性、项目管理工作、客户支持成本、维护成本、机会成本等。

在采访过程中,我们可以提供解决方案的简化版本,重点关注实验的当前目标。是为了最大化参与度、留存率、收益,还是其他?此外,我们希望量化负面影响,即非目标指标的负面变化,以帮助我们做出决策。例如,如果收入是目标,假设负面影响是可接受的,我们可以选择它而不是最大化参与度。

资源

最后,我想向您推荐两个资源来学习更多关于 A/B 测试的知识。

  • Udacity 的免费 A/B 测试课程涵盖了 A/B 测试的所有基础知识。Kelly Peng 有一篇很棒的帖子总结了课程的内容。
  • 值得信赖的在线控制实验——A/B 测试实用指南。它深入了解如何在行业中运行 A/B 测试、潜在的陷阱和解决方案。它包含了很多有用的东西,所以我实际上打算写一篇帖子来总结这本书的内容。有兴趣的敬请关注!

感谢阅读!

如果你喜欢这个帖子,想支持我…

* *

简化生活的 7 个最佳实践

原文:https://towardsdatascience.com/7-alteryx-best-practices-to-simplify-your-life-b7155cdee56a?source=collection_archive---------15-----------------------

使用这些策略来减少重复工作、混乱,并加快您的开发时间

我经常给 Alteryx 的新用户同样的建议。所以我想为什么不用这些技巧写一篇文章呢?然后更多的人可以改进和简化他们的 Alteryx 开发过程。

这就是 7 个让你生活更轻松的最佳实践。

布雷特·乔丹Unsplash 上拍摄的照片

(非常感谢我的经理 Shalini Polimetla,他教会了我许多这些最佳实践。)

1.保持您的工作流程井然有序

随着您的 Alteryx 工作流变得越来越复杂,遵循逻辑的思路变得越来越困难。幸运的是,有几个工具可以帮助您保持工作流程简单明了:

  • 工具容器:你可以使用容器来分隔工作流程的各个部分。这允许您将过程分组为逻辑部分,并帮助其他人更快地理解您的过程。还可以最小化工具容器,以便工作流的特定部分不会运行,这对于在开发过程中加快运行时间很有用。
  • 注释框:在工作流程的开发过程中,这些注释框可以很好地跟踪您自己的注释和问题。一旦工作流准备好生产或发送给其他队友,注释可以帮助其他人理解不同数据处理步骤背后的业务逻辑或原因。

图片作者。工作流组织中容器、注释和无线工具连接的使用示例。

  • 无线工具连接:您可以右键单击任何工具,然后选择“使传出连接无线化”这将减少由于工具的输出数据分支到许多其他工具而造成的视觉混乱。

2.共享前打包工作流

打包一个工作流非常简单,它也可以让工作流的接收者省心。在 Alteryx 中,只需进入选项→导出工作流。这将创建一个 Alteryx 包文件(。yzp),其行为类似于压缩文件。打包工作流的优点是它包括运行工作流所需的所有输入文件,因此用户不必搜索文件或重新输入所有输入路径。压缩文件夹还包括工作流中使用的任何支持宏。

3.连接数据时使用记录 ID 和唯一工具

这可能是我在过去一年使用 Alteryx 中学到的最重要的技巧。本质上,数据连接会使变得混乱。如果您将各种数据源放在一起,很容易在连接中丢失,然后突然出现重复记录的问题。或者,如果您是第一次使用数据集,这种技术可以帮助您理解表的主键,并找出应该如何将它们连接在一起。

图片作者。

技术很简单:在数据的左侧放置一个 RecordID 工具,然后在选择 RecordID 字段的情况下,在内部连接输出(J)之后放置一个独特的工具。这将确保原始数据流(左侧)中的记录不会重复。如果您确实看到来自 unique 工具的副本(D)输出的记录,那么理解为什么会发生这种情况是很重要的。这可能是因为您没有为两个表正确构建连接。

4.制作宏来简化重复的过程

如果您发现自己通过一遍又一遍地复制工具来复制工作流程中的流程,您可能有机会通过将这些流程转换为批处理宏来简化工作流程。要了解更多关于批处理宏的信息,请看 Alteryx 的“批处理宏入门”帖子:

https://community.alteryx.com/t5/Alteryx-Designer-Knowledge-Base/Getting-Started-with-Batch-Macros/ta-p/488165

5.首次运行前保存您的工作流程

这是我从我的经理那里学到的一个观点:如果你没有先保存就运行一个工作流(即它将显示为 NewWorkflow1),它将使用临时驱动器的处理能力。如果您保存然后运行,它会使用 c 盘的处理能力。我看到这将 10 分钟的运行时间缩短到 7 分钟或更少。

6.生产化时消除浏览工具和不必要的工具

根据数据集的大小,使用浏览工具可以显著降低工作流的处理时间。一旦你的工作流程处于稳定状态,你应该回顾它,消除浏览工具,并重新评估是否所有的工具都是必要的。

当我回顾我的工作流程时,如果我在时间紧迫的情况下开发它们,我会意识到我没有以最有效的方式设计它们。或者,也许需求在项目持续期间发生了变化,所以我现在可以删除工作流中一些不再有用的部分或工具。

7.卸载数据或使用数据库内工具进行数据库查询

图片来自 Alteryx

数据库内工具允许您在不将数据移出数据库的情况下执行数据清理/数据混合活动。当您处理大型查询时,这可以使您的工作流运行得更快。

要全面了解数据库内工具,可以参考 Alteryx 文档页面:

https://help.alteryx.com/20213/designer/in-database-overview

此外,当我开发一个工作流时,我经常查询数据库并将结果存储在一个. yxdb ( Alteryx 数据库文件格式中。)然后我用了。yxdb 文件作为我的工作流的输入,这样:1 .工作流程运行速度更快。当我重新工作和测试我的过程时,我不会用大量的查询来访问数据库。

菲利普·卡森伯格Unsplash 上拍摄的照片

这就是我今天为您介绍的 Alteryx 最佳实践的全部内容,尽管我确信还有更多内容没有介绍。如果你有从经验中学到的策略,请随时留下你的专业评论!

如果您以前从未使用过 Alteryx,以下是我认为您应该尝试的一些原因:

用于自然语言处理的 7 个惊人的 Python 库

原文:https://towardsdatascience.com/7-amazing-python-libraries-for-natural-language-processing-50ca6f9f5f11?source=collection_archive---------20-----------------------

这些库将帮助你处理文本数据

照片由 Skylar 康发自Pexels

自然语言处理(NLP)是深度学习的一个领域,其目标是教会计算机如何理解人类语言。该领域是数据科学和机器学习的结合,主要处理文本数据的提取和分析,以从中提取一些值。

NLP 是 2021 年学习的一项令人惊叹的技术,因为许多大公司都在关注客户的情感分析,或使用原始文本数据制作高级聊天机器人。

因此,如果这个领域让您感兴趣,在本文中,我介绍了 7 个令人惊叹的 Python 库,它们可能会帮助您实现 NLP 算法并使用它们构建项目。

1。NLTK

自然语言工具包(NLTK)是目前最流行的构建 NLP 相关项目的平台。它为超过 50 个语料库和词汇资源提供了一个易于使用的界面,并附带了一系列文本处理库,如分类、词干、标记、分析、标记化等。

这个库也是一个开源库,几乎可以用于各种操作系统。所以不管你是 NLP 的初学者还是 ML 的研究者,你都可以学习 NLTK。

安装

pip install nltk

了解更多:https://www.nltk.org/

2。 多语种

Polyglot 是一个用于 NLP 的 python 库,特别有用,因为它支持广泛的多语言应用程序。根据 polyglot 的文档,它支持 165 种语言的标记化,196 种语言的语言检测,16 种语言的词性标注和 130 多种语言的情感分析。

因此,如果有人使用非主流语言,这可能会很有用。此外,它的工作速度非常快,因为它使用 NumPy。

安装

pip install polyglot

了解更多:http://polyglot.readthedocs.org/

3。 空间

SpaCy 是一个 Python NLP 库,特别适用于包含大量文本数据的行业级真实项目。

使用这个库的主要优势是它的速度。SpaCy 比其他库快得多,因为它是用 Cython 编写的,这也使它能够有效地处理大量数据。

支持超过 64 种语言,19 种语言的 60 +训练管道,使用 BERT 等预训练转换器的多任务学习,以及对 Pytorch 和 Tensorflow 等现代 ML/DL 框架的支持,使 SpaCy 成为专业项目的良好选择。

安装(以及依赖关系)

pip install –U setuptools wheelpip install –U spacypython -m spacy download en_core_web_sm

了解更多:https://spacy.io/】T4

4。 GenSim

GenSim 是用 Python 编写的 NLP 库,由于其惊人的速度和内存优化而广受欢迎。GenSim 中使用的所有库都是独立于内存的,并且可以轻松运行大型数据集。它附带了小型有用的自然语言处理算法,如随机投影(RP),潜在语义分析(LSA),分层狄利克雷过程(HDP)等。

GenSim 使用 SciPy 和 NumPy 进行计算,并用于聊天机器人和语义搜索应用等应用中。

安装

pip install — upgrade gensim

了解更多:https://radimrehurek.com/gensim/

5。 Textblob

Textblob 是一个由 NLTK 支持的 Python 库。它提供了 NLTK 的几乎所有功能,但是以一种更加简单和初学者友好的方式,并且它的 API 可以用于一些常见的任务,如分类、翻译、单词变形等。

许多数据科学家也使用 textblob 进行原型开发,因为它使用起来要轻便得多。

安装

pip install -U textblobpython -m textblob.download_corpora

了解更多:https://textblob.readthedocs.io/en/dev/

6。 PyNLPI

PyNLPI 也读作菠萝,是一个 Python NLP 库,主要用于构建基本的语言处理模型。它分为不同的模型和包,可以用于不同种类的 NLP 任务。PyNLPI 最突出的特性之一是它附带了一个完整的库,用于处理 FoLiA XML(语言注释格式)

安装

pip install pynlpl

了解更多:https😕/pynlpl . readthedocs . io/en/latest/

7。图案图案

Pattern 是一个多用途的 Python 库,可用于不同的任务,如自然语言处理(标记化、情感分析、词性标注等)。)、来自网站的数据挖掘和使用内置模型的机器学习,例如 K-最近邻、支持向量机等。

这个库对于初学者来说很容易理解和实现,因为它的语法简单明了,对于需要处理文本数据的 web 开发人员来说也很有帮助。

安装

pip install pattern

了解更多:https://github.com/clips/pattern

结论

尽管列表中提到的几乎所有 NLP 库都形成了类似的任务,但它们在某些特定情况下可能会派上用场。就像 SpaCy 在处理具有大型数据集的真实项目时可能会有所帮助一样,GenSim 将在有严格的内存限制时发挥作用。

NLTK 肯定会成为最受学生和研究人员欢迎的图书馆。所以我们应该总是选择最适合问题陈述的库。

在你走之前…

如果你喜欢这篇文章,并且想继续关注关于 Python &数据科学的更多精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为一名中级会员。

请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: Pranjal 的简讯

你必须知道的 7 个惊人的 Python 一行程序

原文:https://towardsdatascience.com/7-amazing-python-one-liners-you-must-know-413ae021470f?source=collection_archive---------8-----------------------

加速熊猫,快速数据剖析,数据抓取,等等

图片来自 像素

1.从图像中抓取文本

pytesseract 是一个 python 库,可以帮助我们用一行 python 代码从图像中读取文本。首先是读取任何图像——我们可以使用 OpenCV 做到这一点。

让我们先安装它们。

pip install opencv-python
pip install pytesseract

我们需要下载一个. exe 文件来检查pytesseract在你的机器上是否工作正常。

import cv2
import pytesseractpytesseract.pytesseract.tesseract_cmd = "YOUR_DOWNLOADED_FILE_PATH"

如果上面的命令运行没有任何错误,那么这意味着我们是好的。

现在让我们加载一个图像,并用一行 python 代码读取文本。

img = cv2.imread("YOUR_IMAGE_PATH")
**text = pytesseract.image_to_string(img)**print(text)

2.一次性导入所有库

**pyforest** 是一个 python 模块,可以帮助我们在一行 python 中导入所有的库。您可以预期所有类型的通用 python 库都将被导入。这也包括大多数用于机器学习任务的库。这个库也有一些助手模块,比如ostqdmre等等。

**pip install pyforest**

要检查库列表,运行此**dir(pyforest)**

导入pyforest后,可以直接运行pd.read_csv()sns.barplot()os.chdir()等等。

3.获取数据分析报告

pandas_profiling是一个 python 库,可以帮助我们在几秒钟内得到一个惊人的数据剖析报告。可以下载分析报告以供进一步使用。

pip install pandas_profiling

安装库后,您可以导入它,如下所示:

import pandas_profiling
import pandas as pd

我们使用熊猫来导入数据集。

导入数据

数据快照

**hourse_price_report=pandas_profiling.ProfileReport(df).to_file('house_report.html')**

您的数据报告将保存为 HTML 文件。

部分数据报表截图:

总体数据汇总

每个变量的详细信息

变量间每个相关性的详细可视化

4.合并两本词典

如果您有两个字典 dic1 和 dic2,并且希望所有的键-值对都从 dic2 转移到 DIC 1——下面一行代码会有所帮助。

dic1.update(dic2)

5.将字符串列表转换为整数

当我们接受字符串形式的用户输入时,这种方法非常方便。python 的下面一行可以把你的字符串列表转换成整数。

list(map(int, ['1', '2', '3']))

输出:【1,2,3】

6.从网站抓取数据

网络抓取并不困难,但要将废弃的内容转化却是一项繁琐的任务。在这里,我使用一行 python 代码从维基百科页面中抓取关于比特币的数据。

import pandas as pd
data = pd.read_html(“[https://en.wikipedia.org/wiki/Bitcoin](https://en.wikipedia.org/wiki/Bitcoin)")

现在我们可以使用数据变量来获得想要的信息。

7.加快你的熊猫行动

modin是一个 python 库——使用 RayDask 来提供一种毫不费力的方式来加速你的熊猫笔记本、脚本和库。

使用下面一行代码来安装modin

**pip install modin**

现在,你可以这样安装它。

**import** **modin.pandas** **as** **pd**

这就是你需要做的。不需要对代码做进一步的修改。

结论

本文到此为止。我们已经讨论了一些令人惊奇的 python 一行程序。其中一些非常有用,比如pyforest ——当你必须一次安装所有的库时。和,modin 图书馆,以加快你的熊猫操作,如读取数据帧和作出任何改变。

我希望你喜欢这篇文章。敬请期待!

谢谢你的阅读!

以下是我的一些最佳选择:

https://betterprogramming.pub/10-python-tricks-that-will-wow-you-de450921d96a </5-data-science-projects-that-you-can-complete-over-the-weekend-34445b14707d> [## 你可以在周末完成的 5 个数据科学项目

towardsdatascience.com](/5-data-science-projects-that-you-can-complete-over-the-weekend-34445b14707d) https://betterprogramming.pub/how-a-single-mistake-wasted-3-years-of-my-data-science-journey-b7ca1e962085

走之前……

如果你喜欢这篇文章,并且想继续关注更多关于 Python &数据科学精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为一名中级会员。

请务必考虑使用我的推荐链接报名。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: Pranjal 的简讯

你必须知道的 7 个惊人的 Python 技巧

原文:https://towardsdatascience.com/7-amazing-python-tricks-that-you-must-know-71c225164422?source=collection_archive---------23-----------------------

对 python 程序员来说更容易但有用的技巧

信用:像素

我们都知道 Python 代码比其他语言更简洁,可靠性更高。但是 Python 比你想象的更强大。Python 中有许多快捷方式和技巧可以使用,这肯定会使代码库更加精确,也会优化代码的执行。

在今天的文章中,我们将讨论 7 个可以在 Python 项目中使用的技巧和诀窍。大多数技巧并不总是被初学程序员使用,所以它也将帮助你脱颖而出!

1。 计算你的代码的运行时间

如果您正在比较不同的代码集以获得最佳解决方案,例如为您的问题选择最快的算法,那么计算代码的运行时间就变得非常重要。

这个小技巧一定会帮助你实现这个目标。这里我们将借助 python 自带的时间模块

import time
startTime = time.time()#Our main code starts herex = 10
y = 20
z = x+y
print(f”the sum is: “,z)#Our main code ends hereendTime = time.time()net = endTime — startTimeprint(f”time taken: “,net)

输出

the sum is: 30time taken: 0.0008382797241210938

2。 整体列表排版

有时我们需要改变列表中所有条目的数据类型。关于这一点,通常会使用一个循环来完成。但是这个方法根本没有优化,我们可以使用 python 中的 map 函数使这个过程更快更简单。

list1 = [1,2,3,4,5]print(f”list in integer form: “, list1)list2 = list(map(float,list1))print(f”list in float form: “, list2)

输出

list in integer form: [1, 2, 3, 4, 5]list in float form: [1.0, 2.0, 3.0, 4.0, 5.0]

3。 求一个矩阵的转置

在处理与数据科学相关的问题时,有时我们需要找到矩阵的转置。

虽然 NumPy 中有一个单独的方法来获得矩阵的转置,但是我们可以使用简单的 Python 和 zip()函数来实现。

matrix = [[1, 2, 3], [4, 5, 6]]transpose =zip(*matrix)for row in transpose:print(row)

输出

(1, 4)(2, 5)(3, 6)

4。 翻字典

假设您面临一个必须反转字典的情况,即前一个字典中的键将是当前字典的值,反之亦然。

只需一行 python 代码,您就可以使用 for 循环实现这一点。但是在这里你不能在同一个字典中进行修改。您必须创建一个新的字典来存储键值对。

dict1={“key1”: 1, “key2”: 2, “key3”: 3, “key4”: 4}dict2={v: k for k, v in dict1.items()}print(dict2)

输出

{1: ‘key1’, 2: ‘key2’, 3: ‘key3’, 4: ‘key4’}

5。 统计一个单词在句子中出现的次数:

如果你想知道一个特定的单词在一组句子中出现的次数,最常用的方法是将一个句子中的单词拆分成一个列表,然后在列表中查找这个特定的单词。

但是 Python 中的re模块使得使用findall()方法变得更加容易。即使有多个句子,这种方法也非常有效。

import resentence = “I have 3 cats, my friend has 3 cats. In total we have 6 cats”len(re.findall(‘cats’, sentence))

输出

3

6。 枚举功能

如果您想保留列表项的索引以及列表中的列表项,可以使用 Python 中的 enumerate()函数。这个函数在处理算法问题时特别有用。

names = [“Ram”,”Shyam”,”Vivek”,”Samay”]for index, element in enumerate(names):print(“Name at Index”, index, “is”, element)

输出

Name at Index 0 is RamName at Index 1 is ShyamName at Index 2 is VivekName at Index 3 is Samay

7。 合并两个列表形成一个字典

假设您有一个商品列表和一个价格列表,您想将它们存储为一个字典,其中的key:value将是items:price

一般的方法是使用 for 循环遍历这两个列表,并将它们合并到一个字典中。但是在 Python 中 zip 函数的帮助下,您可以用一行代码来完成。

items = [“jackets”, “shirts”, “shoes”]price = [100, 40, 80]dictionary = dict(zip(items, price))print(dictionary)

输出

{‘jackets’: 100, ‘shirts’: 40, ‘shoes’: 80}

结论

这些是一些提示和技巧,您可以在代码中实现它们来提高代码质量和优化。这些技巧也将帮助你减少代码的行数。

为了更好地理解,您可以添加注释来描述代码片段的功能,因为大多数代码都过于紧凑,初学者难以理解。我们将在下一篇文章中尝试介绍更多的 Python 技巧。

在你走之前……

如果你喜欢这篇文章,并且想继续关注我即将发表的关于 Python &数据科学激动人心的文章——请点击这里https://pranjalai.medium.com/membership考虑成为一名中级会员。

通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: Pranjal 的简讯

7 机器学习在医疗保健中的应用

原文:https://towardsdatascience.com/7-applications-of-machine-learning-in-healthcare-90118e0d9001?source=collection_archive---------25-----------------------

医疗保健行业中数据科学的常见使用案例及示例

来自 PexelsArtem Podrez 摄影

包括机器学习模型在内的数据科学已经能够在医疗保健领域利用快速计算能力实现准确高效的操作。机器学习正在改变患者护理策略,并在卫生系统中发挥着重要作用。深度学习中最常见的医疗保健技术是自然语言处理、计算机视觉和强化学习。

医疗保健系统中机器学习的优势

  • 建立准确有效的自动诊断建议。
  • 深度学习算法有助于降低医疗成本,减轻医疗保健专业人员的管理负担,让他们专注于其他复杂的诊断,防止紧急情况报告的延迟。
  • 通过诊断结果和审核,处方有助于减少错误和提高诊断速度。

机器学习在医疗保健中的应用

  • 1。医学影像
  • 2。精神聊天机器人
  • 3。患者医疗保健和数据分析
  • 4。个性化保健治疗
  • 5。处方错误
  • 6。欺诈检测和核保
  • 7。心理健康研究

1.医学影像

在用于疾病检测和预测的计算机断层摄影和磁共振过程中使用对象检测和图像识别。深度学习模型可以利用成像数据生成组织形状、大小和体积等实际解释。

此外,这些模型用于阿尔茨海默氏病的早期检测、糖尿病肾病检测和超声检测乳腺结节。

深度学习算法通过简化复杂的数据来确定异常。CNN 提供的见解有助于医疗专业人员及时注意到病人的问题。

2.精神聊天机器人

Happify,Woebot,Wysa 是一些基于人工智能的心理健康应用程序,在行业中越来越受欢迎。这些聊天机器人服务利用深度学习模型与患者进行现实对话。

3.患者医疗保健和数据分析

深度学习模型可以以更快的速度和可能的准确性分析结构化和非结构化数据,包括实验室测试、临床记录和药物。

此外,智能手机和可穿戴设备提供了关于行为和生活方式的有用信息。这些设备可以在移动应用程序的帮助下转换数据,以监控深度学习模型的风险因素。2019 年,美国食品药品监督管理局批准 Current Health 的 Al 可穿戴设备成为首批监测可穿戴设备之一。它可以测量呼吸、脉搏、体温和氧饱和度。

4.个性化保健治疗

此外,深度学习解决方案可以帮助医疗保健组织通过患者的病史、测试和症状向患者提供个性化护理。

从文本医疗信息,自然语言处理-NLP 提供了适当的治疗见解。

5.处方中的错误

深度学习模型也可以检测处方中的错误。这些模型可以审核患者的健康记录和处方,以识别和纠正诊断或药物治疗中可能出现的错误。

6.欺诈检测和核保

深度学习模型可以通过指定欺诈行为和从各种资源(包括医院信息和患者属性)中识别健康数据来识别医疗保险欺诈。

此外,深度学习的算法有助于保险公司为客户提供预测分析。

7.心理健康研究

在深度学习模型的帮助下,研究人员正在尝试改善临床实践。例如,有一些学术研究使用深度神经网络来了解精神疾病和大脑疾病造成的影响。

研究人员认为,与标准机器相比,深度学习模型在一些医疗保健领域提供了更好的结果。例如,算法可以确定有意义的大脑生物标记。

结论

在医疗部门,各种数据科学模型的技术使用神经网络提供准确有效的结果。通过深度学习模型和算法,卫生部门的发展得到了加强。

此外,科学家和研究人员正在设计新的深度学习模型,以改善医疗保健系统,为患者提供最佳服务。

我们来连线。查看我的博客youtube 来获得灵感。谢谢你,

7 份不需要任何编码技能的数据科学工作

原文:https://towardsdatascience.com/7-awesome-data-science-jobs-where-you-dont-need-any-coding-skills-2e08d13e84e6?source=collection_archive---------1-----------------------

没有编程经验如何进入数据科学领域

图片来自 StartupStockPhotos 来自 Pixabay

许多人渴望进入数据科学领域。对于大多数非技术人员来说,编码是最大的障碍之一,许多人在开始之前就放弃了。

这种形象是由所有关于 Python 和出售为科技公司工作的梦想的过度发布的博客驱动的。

没错,确实很多数据科学的工作都需要编码。是的,当你打算加入一个开发新应用程序的数据科学团队时,你需要编写代码。此外,在数据科学领域工作了 20 年后,我(有时)仍然编写代码并进行代码评审。

但是有一些公司和职位可以让各种数据科学角色的人加入,并不是所有人都需要完美的编码。

我的目标是让具有各种背景、技能和兴趣的人能够进入数据科学领域并获得成功。在我今天的文章中,我介绍了 7 个非常棒的数据科学工作,在这些工作中,你不需要任何编码技能就可以进入这个领域。

那么,在哪里以及如何找到一个数据科学的职位,可以从没有或者只有很少的编码经验开始?

没有编码经验并不意味着你不需要数据科学知识。你需要很多!

你必须学习和理解大部分的数据科学课程,除了你不编程。

当你从事这样的工作时,你可以从事“非编码”的数据科学职业,或者同时培养编程技能,以拓宽潜在的工作和职业选择。

那么,让我们来看看这些工作。

1。 数据科学战略顾问

大多数公司甚至难以开始数据和数据科学之旅。他们需要关于使用数据的可能性和商业优势的教育。

如今科技公司的自然思维在许多其他公司仍处于起步阶段。转向数据驱动的决策世界是一项具有挑战性的业务转型。

我们为什么需要数据科学?我们如何进入数据驱动的业务?为此我们需要什么?

公司在回答这些问题以及建立愿景和实施路线图时需要支持。他们需要能力建设方面的援助和评估工具和提供者方面的帮助。

最重要的是,所有员工的文化和心态都需要改变。如何改变这种情况?如何启用员工?成功的数据科学团队是如何建立的?它在组织中处于什么位置?他们从哪里得到数据?

数据科学战略顾问为所有这些问题开发解决方案。您积累了数据科学家的全部知识,以及战略和组织专业知识。但是你不需要编码。

如果你想进入咨询行业,你可以在下面的文章中找到全面的信息。

2。 数据科学软件技术作家

数据科学过程涉及许多专有软件和平台:主数据管理系统、分析平台或可视化和 BI 工具。并且需要有人让用户熟悉所有的技术功能和使用可能性。

我们都使用工具和平台的帮助功能和教程。软件文档、说明手册和操作指南描述了软件如何工作以及可以做什么。它说明了如何将其集成到现有的 It 架构和流程中。

技术作家的工作要求很高。他们需要了解软件和数据科学。他们与开发人员、用户和营销人员一起工作。不仅必须开发正确的内容,而且设计也必须正确,最后还要满足法律要求。

数据科学软件的技术作者必须了解端到端的软件、数据科学过程和方法、应用程序以及用户的心理和行为。用户体验决定了技术写作者的工作成败。

你必须是一个成熟的数据科学家,拥有广泛的互动和知识,但你不需要编码。

3。 招聘技术和数据科学人员

大型组织有专门的技术、人工智能和数据科学职位招聘人员。

这些招聘人员需要了解数据科学工作和流程、应用程序和目标的基础知识。此外,他们需要很多同理心和良好的沟通技巧。

我和他们一起做了很多工作,不仅讨论了潜在团队成员的简历,还讨论了候选人的要求,以便他们可以制作招聘广告并对申请人进行第一次评估。我们讨论了如何发展数据科学团队,他们就技能类型和候选人提出了自己的观点和建议,以实现既定目标。

这些招聘人员对数据科学有深入的了解,能够发现简历或编造的技能和经验中的缺陷。

其中不少人还学习编程,并在以后从事技术性更强的工作。

这是一项融合了沟通、人和技术的工作。

4。 一家数据科学(软件&平台)公司的销售代表

在我们的数据科学工作中,我们使用了大量来自数据管理、云、数据科学工具以及可视化和报告的专有软件和平台。

典型的产品有 Dataiku、TIBCO、IBM Watson Studio、Azure ML Studio、Domino Data Lab、Alteryx 或 SAS 等等。

销售人员负责产生销售线索、与潜在客户谈判条件、签订合同、完成销售以及确保售后服务。

软件和平台不是通过 PowerPoint 演示来销售的。你需要向用户展示产品的价值和功能。

所以,你知道产品和平台的特性和应用。你知道解决问题的方法和方法。整个数据科学过程的技术知识以及与数据科学家和业务人员沟通的能力是必不可少的。

你是一名具有销售和沟通能力的数据科学家。

5。 数据科学项目经理

数据科学的人不一定是好的项目经理。因此,特别是在大型项目或业务转型项目中,项目经理必须忽略整个项目,并协调所有相关利益方。

数据科学项目经理计划、设计和执行数据科学解决方案。您度量项目的进度并评估风险。当问题出现时,您必须上报并解决它们。你必须确保项目中有合适的人。

因此,您需要具备业务领域知识、端到端数据科学技能、结构化项目管理方法以及管理人员的能力。这是一份多才多艺的工作。但是你不需要(一定)成为编码专家。

6。 数据可视化和商业智能(BI)专家

在业务环境中,数据科学结果需要被呈现或者是报告的一部分。受众是对数据科学一知半解的商业人士。

建立相关和可理解的报告以及向非技术人员讲述整个故事的伟大的数据可视化是一门艺术。因此,在大型企业的所有数据科学团队中,您会发现专门的人负责开发和维护适当的报告和可视化。

此外,大多数咨询公司都有这样的专家团队来帮助他们的客户做到这一点。

公司使用的工具主要是 Tableau,Qlik Sense / QlikView,MicroStrategy,ThoughtSpot,或者 Power BI。在寻找这样的工作时,搜索这些工具和“BI 专家”然后,确保它与数据科学团队密切协作。

即使您正在开发仪表板、可视化和 BI 报告,您也不需要这些工具的编码经验。但是,您需要数据科学知识来将沟通和信息正确地纳入报告中。

7 . 使用无代码工具的数据科学家

最后,市场上有越来越多不需要编码技能的高级平台和工具。

一方面,这些平台开发的爆炸式增长与具有相关编码知识的数据科学家的短缺有关,并使技术含量较低的人能够执行复杂的数据科学建模。

但另一方面,它也减少了错误的来源和代码中的错误率,并使预测和规范模型的开发更快。这节省了许多成本,并提高了上市速度,这在当今的商业世界中变得越来越重要。

最知名的工具和平台有 RapidMiner、KNIME、Google Cloud Auto ML、Google ML Kit、微软 Azure 自动机器学习、显然 AI、Create ML、Teachable Machine、Fritz AI 或 DataRobot(列表不全面)。这些是你在工作岗位上必须寻找的关键词。

处理、分析和建模是通过拖放或点击和选择来完成的。

使用这些平台需要全面的数据科学家知识。你做完全相同的工作,从数据准备、数据清理、数据工程、描述性的、预测性的和规范性的建模、特性工程、测试,并且像你的编码伙伴一样将模型部署到实践中,但是使用非编码工具。

把所有的东西放在一起

有一种说法是,要成为一名数据科学家,你需要深入的编码技能。虽然这是数据科学工作的一部分,但有许多数据科学工作需要很少或不需要编码技能。

还有一个著名的信条是,只有具有深入编码技能的数据科学家才是真正的数据科学家。凭借在数据科学领域 20 多年的经验,我可以告诉你,不是那些拥有最佳编码技能的人,而是那些了解从定义业务问题、将其转化为适当的分析问题、处理数据、选择模型和方法,以及最终沟通、讲述故事和部署的整个流程的人,是最好的数据科学家——独立于编码技能。

进入数据科学领域最重要的是做适当的研究。它是对现有的各种工作以及该工作的任务和要求的研究。

我的一个也是唯一一个建议是拓宽视角,从数据科学工作的许多方面入手,将目光投向科技行业之外。然后,一个广阔的世界将为你的特殊技能打开许多机会。

针对数据分析角色的 7 个初级到中级 SQL 面试问题

原文:https://towardsdatascience.com/7-beginner-to-intermediate-sql-interview-questions-for-data-analytics-roles-e465f26b8fe6?source=collection_archive---------9-----------------------

通过 goormIDE 上的示例数据和 MYSQL 实现

照片由Unsplash

(注:所有观点均为本人)

简介

大多数分析角色都需要良好的 SQL 知识,这也是编码测试的热门主题。无论什么职位,都需要 SQL 技能,你对这种语言的掌握越强,你就越有机会获得你想要的职位。

本文的目的是给你一套实用的例题来练习。它主要面向初级到中级,但其中一些问题与你在面试中会遇到的问题相差不远。

希望你会发现它们对你的准备有用。

注意:回答以下问题可能有多种方法。此处提供的答案仅代表其中一种选择。当你通过它们进行推理时,请随意实现你自己的逻辑。

数据

你将使用一个小型的社交媒体样本,比如数据。有两个表, users,包含关于人员配置文件的基本信息,而 follows,列出了哪些用户关注另一个给定的用户。

该数据的主题是哈利波特的魔法世界,其中用户来自哈利波特传奇中的各种角色。

因此,users 表将类似于下面的内容,其中有 user_id、first_name、last_namehouse 列。

**user_id, first_name, last_name, house**
1,Harry,Potter,Gryffindor
2,Ron,Wesley,Gryffindor
3,Hermonie,Granger,Gryffindor
4,Ginny,Weasley,Gryffindor
5,Draco,Malfoy,Slytherin
6,Tom,Riddle,Slytherin
7,Luna,Lovegood,Ravenclaw
8,Cho,Chang,Ravenclaw
9,Cedric,Diggory,Hufflepuff

跟随表将报告哪两个用户 id 形成了前者跟随后者的关系的信息。因此,这些列将是用户标识跟随(被跟随的用户的用户标识),以及日期,其中创建了“跟随”关系。

user_id,follows,date
1,2,1993-09-01
2,1,1989-01-01
3,1,1993-07-01
2,3,1994-10-10
3,2,1995-03-01
4,2,1988-08-08
4,1,1988-08-08
1,4,1994-04-02
1,5,2000-01-01
5,1,2000-01-02
5,6,1986-01-10
7,1,1990-02-02
1,7,1996-10-01
1,8,1993-09-03
8,1,1995-09-01
8,9,1995-09-01
9,8,1996-01-10
7,8,1993-09-01
3,9,1996-05-30
4,9,1996-05-30

现在让我们看看如何以编程方式创建这些数据,以便能够对其运行查询。

设置:在 goormIDE 上运行 MYSQL 查询

为了运行您的查询,您可以使用 goorm.io IDE。

这是我在 Udemy 上参加“终极 my SQL 训练营:从 SQL 初学者到专家”课程时偶然发现的一个很好的资源。

您可以参考下面的链接注册并使用一个新的容器运行,在这个容器中,您将能够启动和关闭数据库,并运行 SQL 脚本。

Goorm.io 注册说明

(你会在下面的说明中找到一些课程的参考资料。即使你没有有效地学习这门课程,你也可以很容易地理解它们,因为这将使你同样能够从 goorm.io 容器中运行你的 SQL 脚本)

一旦你设置好了,现在是时候创建哈利波特数据库并开始查询了!

数据库和表格创建

首先,让我们创建一个数据库来存储我们的表。你可以给它起任何你喜欢的名字,我把它命名为社会。

然后,创建用户跟随表,数据类型如下。 user_id 列在用户之后充当主键和外键,将两个表链接在一起。

DROP DATABASE IF EXISTS social;
CREATE DATABASE social;
USE social;CREATE TABLE users(
  user_id INTEGER PRIMARY KEY,
  first_name TEXT NOT NULL,
  last_name TEXT,
  house TEXT);CREATE TABLE follows(
  user_id INTEGER,
  follows INTEGER,
  date_created DATE,
  FOREIGN KEY (user_id) REFERENCES users(user_id),
  FOREIGN KEY (follows) REFERENCES users(user_id));

一旦完成,就该插入你在上面看到的数据了。您可以使用“插入到[表格]中”命令来完成此操作。您可以随意将下面的内容复制到您的脚本中,并通过source name _ of _ SQL _ file . SQL命令在 MYSQL 容器中运行它。

INSERT INTO users (user_id,first_name,last_name,house
) VALUES (1,"Harry","Potter","Gryffindor"),
(2,"Ron","Wesley","Gryffindor"),
(3,"Hermonie","Granger","Gryffindor"),
(4,"Ginny","Weasley","Gryffindor"),
(5,"Draco","Malfoy","Slytherin"),
(6,"Tom","Riddle","Slytherin"),
(7,"Luna","Lovegood","Ravenclaw"),
(8,"Cho","Chang","Ravenclaw"),
(9,"Cedric","Diggory","Hufflepuff");INSERT INTO follows (user_id,follows,date_created)
VALUES (1,2,STR_TO_DATE("1993-09-01", '%Y-%m-%d')),
(2,1,STR_TO_DATE("1989-01-01",'%Y-%m-%d')),
(3,1,STR_TO_DATE("1993-07-01",'%Y-%m-%d')),
(2,3,STR_TO_DATE("1994-10-10",'%Y-%m-%d')),
(3,2,STR_TO_DATE("1995-03-01",'%Y-%m-%d')),
(4,2,STR_TO_DATE("1988-08-08",'%Y-%m-%d')),
(4,1,STR_TO_DATE("1988-08-08",'%Y-%m-%d')),
(1,4,STR_TO_DATE("1994-04-02",'%Y-%m-%d')),
(1,5,STR_TO_DATE("2000-01-01",'%Y-%m-%d')),
(5,1,STR_TO_DATE("2000-01-02",'%Y-%m-%d')),
(5,6,STR_TO_DATE("1986-01-10",'%Y-%m-%d')),
(7,1,STR_TO_DATE("1990-02-02",'%Y-%m-%d')),
(1,7,STR_TO_DATE("1996-10-01",'%Y-%m-%d')),
(1,8,STR_TO_DATE("1993-09-03",'%Y-%m-%d')),
(8,1,STR_TO_DATE("1995-09-01",'%Y-%m-%d')),
(8,9,STR_TO_DATE("1995-09-01",'%Y-%m-%d')),
(9,8,STR_TO_DATE("1996-01-10",'%Y-%m-%d')),
(7,8,STR_TO_DATE("1993-09-01",'%Y-%m-%d')),
(3,9,STR_TO_DATE("1996-05-30",'%Y-%m-%d')),
(4,9,STR_TO_DATE("1996-05-30",'%Y-%m-%d'));

数据库、表和数据都设置好了,让我们开始查询吧!

问题 1

每栋房子有多少用户?

要回答这个问题,您可以使用 COUNT 函数和 GROUP BY 列来合计 users 表中每个 house 特性的用户数。

查询

SELECT house,
count(*)as num_students
FROM users
GROUP BY house;

结果

来源:作者

问题 2

列出以下所有在 1993 年 9 月 1 日之前创建的链接

要回答这个问题,您可以使用 WHERE 语句来筛选下表中在指定日期之前创建的所有行。

查询

SELECT *
FROM follows
WHERE date_created<"1993-09-01";

结果

来源:作者

问题 3

列出 1993 年 9 月 1 日之前建立的所有链接,但这次使用用户的名字

这个问题相当于问题 2,只是您现在的任务是将关注者和被关注者的 user_id 与他们的名字相关联,这些名字出现在 users 表中。

为此,可以使用follow表与 users 表的双重连接,从而将follow表中的 user_id 列的名字和follow表中的follow列的名字都作为源。

WHERE 语句仍然确保您过滤 1993 年 9 月 1 日之前建立的链接。您还可以利用别名来重命名输出结果。

查询

SELECT u.first_name as follower,
u2.first_name as followee,
date_created 
FROM follows
JOIN users as u ON follows.user_id=u.user_id
JOIN users as u2 ON follows.follows=u2.user_id
WHERE date_created<"1993-09-01";

结果

来源:作者

问题 4

统计一下从 1999 年 12 月 31 日起,每个用户有多少人关注。根据“用户全名,追随者数量”给出结果

带着这个问题,你基本上有兴趣知道谁是拥有最多追随者的用户。您可以通过在【T2 跟随表中按照跟随列对数据进行分组,然后计算有多少用户跟随特定的 user_id 来解决这个问题。

WHERE 语句按日期过滤,并与 users 表连接,以引入每个追随者的名字。为了创建全名,CONCAT 语句用于合并 users 表的 first_namelast_name 列,然后根据关注者的数量对结果进行排序。

查询

SELECT concat(first_name," ",last_name) as full_name,
COUNT(*) as number_of_followers
FROM follows
JOIN users ON follows.follows=users.user_id
WHERE date_created<"1999-12-31"
GROUP BY full_name
ORDER BY number_of_followers DESC;

结果

来源:作者。

不出所料,哈利波特成为最受欢迎的用户!

问题 5

列出每个用户关注的用户数量

这个问题是对问题 4 的补充,因为它问的是相反的关系。您可以通过类似的逻辑来解决这个问题:使用follow表中的 user_id 列来引入用户的名字,然后在统计follow表中的行数的同时,按同一列对数据进行分组。

和以前一样,您可以对结果进行排序,以了解谁在关注他人方面最活跃。《哈利·波特》再次拔得头筹!

查询

SELECT first_name as user,
count(follows) as total_people_followed
FROM follows
JOIN users ON follows.user_id=users.user_id
GROUP BY user
ORDER by total_people_followed DESC;

结果

来源:作者

问题 6

列出来自 follows 的所有行,其中一个房子的人跟踪另一个房子的人。给出带有用户名的结果。

此问题要求您列出不同房屋的用户之间的所有关系。您可以使用的逻辑是分别使用 user_idfollow列,为follow表中的每一行引入姓名和房屋信息。

完成后,您可以筛选出跟随者和被跟随者不在同一家的行。在这个查询中使用别名可以帮助您在添加到最终结果时澄清每一列。

查询

SELECT u.first_name as follower,
u2.first_name as followee,
u.house as follower_house,
u2.house  as followee_house
FROM follows
JOIN users as u ON follows.user_id=u.user_id
JOIN users as u2 ON follows.follows=u2.user_id
WHERE u.house!=u2.house;

结果

来源:作者

问题 7

列出所有未回应的后续(即 A 跟随 B,但 B 不跟随 A)

要解决此查询,您可以:

  • 从下表中列出所有从动者-从动者对,作为【Concat(follows . user _ id," ",follows . follows)】
  • 通过将对反转为【Concat(follows . follows," ",follows . user _ id)】来识别相反的下列关系
  • 仅保留原来的从动件-从动件副列表中没有的相反的下列关系(即跟随表)

查询的其余部分返回到 users 表,以引入姓名信息,从而在最终输出中将其排列为“用户名”+“第一个用户没有跟随的用户名”。

这样,您可以在我们的数据库中确定 6 种关系,其中左边的用户不跟随右边的用户,假设右边的用户跟随左边的用户。(即“即使赫莫尼跟着哈利,哈利也不跟着赫莫尼”)

查询

SELECT u.first_name as person,
u2.first_name as does_not_follow_back
FROM follows
JOIN users as u on follows.follows=u.user_id
JOIN users as u2 on follows.user_id=u2.user_id
WHERE Concat(follows.follows," ",follows.user_id) NOT IN (SELECT Concat(follows.user_id," ",follows.follows) as relationship FROM follows);

结果

来源:作者

摘要

希望这些练习对你有用。如前所述,请随意实现您自己的逻辑,因为使用 SQL 通常有多种方式来获得给定的结果。

感谢阅读!

访问我的免费数据科学资源清单 这里

https://edo-romani1.medium.com/membership

数据科学和机器学习的 7 个最佳免费工具

原文:https://towardsdatascience.com/7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e?source=collection_archive---------11-----------------------

探索七个最好的免费工具,让您在数据科学和机器学习之旅中受益

多梅尼科·洛亚在 Unsplash 上拍摄的照片

“机器学习将使大多数人认为只能由人完成的工作自动化。”~ 戴夫·沃特斯

随着数据科学和机器学习的普及,每个人都希望采用一些实践来在这些方面取得更好的结果。对我们所有人来说幸运的是,随着所有这些持续的进步,我们可以利用一堆免费工具来提高我们构建的模型和项目的质量。

机器学习和数据科学的所有这些快速进步也导致了一些奇妙的免费机器学习工具的兴起。这些工具是每个数据科学或机器学习有志者必须充分利用的工具,以超越曲线并获得更有效的结果。

在本文中,我们的主要关注点和目标将是查看七个最好的免费机器学习和数据科学工具,这些工具是每一个渴望和热衷于这些主题的人都必须利用的,以获得更有效的结果。这些工具不仅可以帮助您实现更高的效率,而且由于它们的简单性和更高程度的执行计算,它们还可以使您更快地达到这些高标准。

1.Google Colab

Google Colab 是用于构建机器学习项目的最佳在线工具之一。在 Google Colab 环境中可用的奇妙工具的帮助下,我们被授予访问和自由来操作 Colab 笔记本电脑,以实现特定任务的最佳可能结果。

Colaboratory (也称为 Colab)是一个免费的 Jupyter 笔记本环境,它运行在云中,并将其笔记本存储在 Google Drive 上。Colab 最初是谷歌内部项目;试图开源所有代码并更直接地在上游工作,导致了“Open in Colab”谷歌 Chrome 扩展的开发,但这最终结束了,Colab 的开发在内部继续。

只需借助您的 Gmail 帐户,您就可以获得这项免费服务,充分利用笔记本电脑。使用 Google Colab 最好的一点是,当你没有一个不能支持复杂深度学习计算的高端系统时,从 Google Colab 中可用的多种免费资源中受益是一个好主意。

我强烈推荐查看我以前的一篇关于 Jupyter 笔记本的文章,在那里我已经广泛地讨论了 Jupyter 笔记本的主题。下面提供了链接,您可以访问它来获得关于 Jupyter 笔记本及其在机器学习项目中的用途的更多信息。

2.蟒蛇

Anaconda 平台是一个完全免费的工具,可能是数据科学家可以获得的最佳资源之一。这个平台在几乎每个发行版上都有多个合适的包,包括 Windows、Linux 和 macOS。在 Anaconda 环境的帮助下,您将能够非常容易地完成大量数据科学项目的开发。

Anaconda 发行版为您提供了各种工具和设备来解决不同类型的问题。他们提供 Jupyter 笔记本、Spyder 环境、Visual Studio 代码以及更多简化任务的工具。它们还为复杂库的安装提供了便利,例如 TensorFlow 库的 GPU 安装,其安装过程具有简单的语法和代码。

Anaconda 环境及其其他特性也使您能够轻松地访问和下载其他库。总的来说,它简化了个人在管理包、库或数据科学中的任何其他元素时必须处理的一些复杂机制背后的整个复杂性。它无疑是“世界上最受欢迎的数据科学平台。”

3.风筝

Kite 恰好是数据科学家或机器学习爱好者可以使用的最好、最强大的免费工具之一。它增加了程序员从高速人工智能驱动的完成功能中受益的能力,使开发人员以高速编程。关于 Kite 最好的部分是它支持大约 16 种不同的编程语言,比如 Python、Java 和许多其他语言。除了这些惊人的特性,它还支持 16 个代码编辑器,包括 Jupyter 笔记本、Visual Studio 代码、Sublime text、Pycharm 等等。

如果你是数据科学和机器学习领域的绝对初学者,我会建议你在探索这个工具之前稍微等一等。我陈述这一点的主要原因是因为我相信每个人都必须首先在 Python IDLE 上练习普通代码(尽量避免文本编辑器中的自动完成特性)。一旦您有了管理代码块的良好实践,并根据您的编码经验找出了最佳解决方案,强烈建议您开始利用 Kite 工具相应地导航和探索您的代码和项目。

4.GitHub 和 Git Bash

GitHub 是最著名的平台之一,数据科学家可以在这个社区中分享他们的代码,并在数据科学、Python 编码和其他几个项目的几个方面开展工作。它完全免费注册,并提供许多好处,如增加与社区的交互性和其他尝试性功能。您可以通过创建新的要点来轻松共享代码片段,或者创建新的存储库来展示您构建的高级项目。

要处理像 GitHub 这样的资源,您可以选择在 Windows 环境中使用 Git Bash 应用程序。在像 Linux 这样的平台上,您可以自由地使用 Git 命令来执行特定的操作,而在 windows 平台上,您将需要一个仿真层。这个仿真是在 Git Bash 接口的帮助下提供的。一旦在 Windows 平台上安装了 Git,就可以使用 bash 命令通过执行诸如克隆或其他类似功能来操作 GitHub 站点。

5.赫罗库

在构建您的机器学习模型并完成您的机器学习架构的构建之后,最重要的步骤之一是部署阶段。你的项目的部署是非常重要的,因为它允许你的项目到达最后阶段,在那里一群其他人可以受益于并利用你的精彩作品。

虽然 flask、Django 和 stream lit 等库允许您对数据科学和机器学习项目进行编码,并在您的系统上本地部署它们,但这通常是不够的。您通常需要拥有一个网站来部署您的项目,或者利用云环境来进行部署。

Heroku 就是这样一个壮观的平台,你可以注册一个非商业用途的免费计划来部署你的 Python、机器学习、数据科学或深度学习项目。这个免费的网站工具将允许你在 GitHub 上自动化并直接链接你的项目到 Heroku 网站环境。部署后,许多用户可以利用您为特定任务开发的模型的优势。

6.张量流

TensorFlow 是一个深度学习框架,可能是成功计算复杂机器学习项目的最佳库之一。作为奖励,Keras 深度学习框架还与 TensorFlow 库集成在一起,以便于开发许多不同类型的模型。

在这种情况下,一个至关重要的问题出现了?有这么多不同类型的令人惊叹的 Python 库。为什么我们只考虑张量流?

这些问题很有趣,但答案很简单。在端到端机器学习项目的开发方面,TensorFlow 是一个发电站。它的多样性和灵活性允许其用户构建广泛的深度学习和机器学习模型,彻底改变了整个领域。最后,最重要的是它完全免费,可以在 Google Colab 等云平台上开发模型。

然而,作为奖励,提到其他流行的库也是公平的,如 scikit-learn 和 Pytorch,它们在数据科学和机器学习领域做出了重大贡献。在最近几年里,他们在许多酷项目的开发中表现出色。

7.IBM Watson 工作室

云平台作为一个整体,在实现多种功能方面非常有益,这些功能可以帮助负担不起昂贵资源的个人在网站上继续他们的数据科学之旅。它们使用户能够存储大量数据,借助预装在云上的技术处理多个操作,等等。IBM Watson Studio 就是这样一个出色的平台,它出色地帮助机器学习和数据科学爱好者实现他们的梦想。

IBM Watson Studio 有免费的基本规划,大多数用户都可以访问这些规划来构建、构造、管理和优化跨任何云平台的 AI 模型。它允许您自动化人工智能生命周期,以及构建机器学习管道和构建创新的端到端项目。您可以通过可视化和编程的方式准备和构建模型。最后,它允许用户通过一键集成来部署和运行模型。

结论:

设计生态学家在 Unsplash 上拍摄的照片

“预测供应链的未来:人工智能;机器学习;深度学习。”

机器学习项目构成了数据科学中一些最有趣的方面。尽管在研究该主题时,我们必须处理一些复杂概念背后的整体复杂性,但我们有幸拥有各种工具来简化整体复杂性,并使完成任务和实现高精度的任务变得相当容易。

在这篇文章中,我们讨论了七个最好的机器学习和数据科学工具,这些工具可供每个人在互联网上免费使用。通过简单的下载和安装,或者只是利用特定网站上的功能,您可以访问这些免费工具来开发或构建机器学习模型。它还能让你在所有这些有益资源的帮助下简化你的生活。

如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。

看看我的其他一些文章,你可能会喜欢读!

</6-best-programming-practices-f2605c5b469c> </5-essential-skills-to-develop-as-a-data-scientist-16442f094c09> </5-nlp-topics-and-projects-you-should-know-about-65bc675337a0>

谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!

7 款面向 Python 开发人员的最佳 UI 图形工具,带入门代码

原文:https://towardsdatascience.com/7-best-ui-graphics-tools-for-python-developers-with-starter-codes-2e46c248b47c?source=collection_archive---------2-----------------------

Python 中用于开发酷用户界面技术的七个最佳 UI 图形工具

UX 店Unsplash 上拍照

Python 是一种非常通用的语言,它可以完成不同编程语言想要完成的大多数任务。虽然 Python 更频繁地用于与人工智能、数据科学、数据可视化、数据分析和其他类似操作相关的应用程序和项目,但我们绝不局限于这些边界。作为一名使用 Python 的开发人员,您可以执行 web 开发、构建游戏、构建大量 GUI 工具等等。

用 Python 构建的图形用户界面(GUI)对于各种项目都非常有用。您可以使用这些技术使您的项目独特、美观、视觉上吸引人、高度互动的环境,并为用户提供其他类似的精彩功能。你甚至可以将这些工具用于开发具有机器学习或深度学习模型的人工智能项目,使其从其他此类项目创意中脱颖而出。

在这篇文章中,我们将客观地看一些最好的 GUI 工具,这些工具在 Python 编码的帮助下可供开发者使用。我们将探索七个这样的库,它们为用户实现他们想要的 GUI 应用程序提供了最好的目标。为了遵循本文并相应地实现您的所有代码,我建议读者选择他们最喜欢的编辑器,并尝试一些代码。

我个人使用 Visual Studio 代码进行编程,但是您可以随意使用您的首选。然而,如果你很难选择最适合自己的选项,下面的链接列出了十多个优秀的 Python 编辑器,并给出了优缺点,它将帮助你决定最适合你的编码的编辑器。

1.Tkinter:

作者图片

Python 中可用的 Tkinter 包是大多数图形相关应用程序的最佳工具之一。通过简单的 pip 安装,它可用于 Windows 和 Linux 平台。Tkinter 库允许用户在它包含的众多选项的帮助下开发高质量的图形界面。

Tkinter 具有各种选项,可借助框架、按钮和检查按钮为您的应用程序提供有价值的结构,用于创建交互式选择、用标签显示信息、用 Canvas 绘制数据和统计信息等等。起始代码以下起始代码的代码参考取自此链接。查看更高级的代码和更多信息。

起始代码:

from tkinter import *master = Tk()Label(master, text='Enter Your Name').grid(row=0)
Label(master, text='Enter Your Email').grid(row=1)e1 = Entry(master)
e2 = Entry(master)e1.grid(row=0, column=1)
e2.grid(row=1, column=1)mainloop()

在上面显示的代码块中,我们创建了一个简单的程序,通过它我们创建了两个简单的网格框,用于注册特定个人的姓名和电子邮件。请随意进一步探索这个库,并构建更复杂的项目。

2.PyQt5:

作者图片

Qt 是一组跨平台的 C++库,实现了访问现代桌面和移动系统许多方面的高级 API。Qt 平台为开发人员提供了各种独特的解决方案来开发大量的应用程序和解决大量复杂的任务。通过一个简单的 pip install 命令,您可以从下面的 GUI 应用程序开始。

借助 Python 和 PyQt5 库开发 GUI 应用程序相当简单,只需几行代码就可以完成。下面的代码块演示了我们如何用这个包生成交互式 GUI 界面。

起始代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *def window():
   app = QApplication(sys.argv)
   w = QWidget()
   b = QLabel(w)
   b.setText("Welcome!")
   w.setGeometry(100,100,200,50)
   b.move(50,20)
   w.setWindowTitle("PyQt5")
   w.show()
   sys.exit(app.exec_())if __name__ == '__main__':
   window()

下面的代码块将显示一个带有欢迎命令的图形用户界面。可以添加更高级的小部件和元素,使代码更有吸引力。以下启动代码的代码参考取自此链接。查看更高级的代码和更多信息。

3.Pygame:

与前面讨论的两个 GUI 工具不同,Pygame 在比较中略有不同。使用 Pygame,您可以从头开始构建 Python 游戏。虽然它们的性能和图形与其他一些编程语言如 C#和一些精英游戏设计软件相比可能不是最好的,但对于大多数初学者来说,这仍然是一个很好的入门方式,因为编码过程很容易。

除了构建游戏之外,使用 Pygame 的主要优势之一是它拥有的 GUI 功能。它允许开发人员创建一个 GUI 界面,用它可以控制许多动作。Pygame 中有很多选项可以用来开发用户界面中的实体(比如小部件或图标)并控制一些想要的动作。下面是一些入门代码,让你从这个模块中获得更多的经验,从头开始开发更多的项目。

起始代码:

#imports the pygame library module
import pygame# initilize the pygame module
pygame.init()# Setting your screen size with a tuple of the screen width and screen height
display_screen = pygame.display.set_mode((800,600))# Setting a random caption title for your pygame graphical window.
pygame.display.set_caption("pygame test")# Update your screen when required
pygame.display.update()# quit the pygame initialization and module
pygame.quit()# End the program
quit()

在上面的编码部分,我们已经讨论了一些用 Pygame 创建特定大小的图形窗口的起始代码。在这个 Python 库的帮助下,你可以构建更多的应用程序和游戏。要理解为什么每个开发者都应该花时间用 Python 和 AI 开发游戏的五个原因,请查看我以前的一篇文章,关于你应该这样做的五个原因。

</5-reasons-why-you-should-develop-a-game-with-python-and-ai-9f5f276e7637>

4.开放式简历:

图片来自维基

Open-CV 是计算机视觉任务和图像处理的最佳库之一。这个库为执行各种任务提供了极好的工具。在 Open-CV 的帮助下,还可以构建 GUI 应用程序以及可定制的界面。虽然 Open for GUI 的可用选项没有其他选项多,但是您可以构建大量的技术内容。

将上面的图片以 Lena 的格式保存在你的桌面上(或者从上面提到的链接下载),并确保是. png 格式。下面是您可以使用 Open-CV 库执行的一些操作的起始代码。

起始代码:

# Importing the opencv module
import cv2# Read The Image
image = cv2.imread("lena.png")# Frame Title with the image to be displayed
cv2.imshow("Picture", image) 
cv2.waitKey(0)# Convert the color image to grayscale image
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# Display Grayscale image
cv2.imshow("Gray Picture", gray)
cv2.waitKey(0)

上面的起始代码探索了 Open-CV 库的一些功能的基本实现。如果您有兴趣进一步探索这个特定的库,并了解更多关于计算机视觉的知识,请查看我以前的一篇文章,该文章涵盖了 Open-CV 入门的完整初学者指南,链接如下。

5.基维:

作者图片

另一个奇妙的开源包是 Kivy,它允许用户创建一些高质量的图形用户界面。它可以与 Python 的 pip 安装一起安装。它为开发人员提供了一个最好的业务友好的交叉开发平台,增加了对大多数应用程序的 GPU 加速支持。

除了提供这些令人难以置信的特性,它还允许开发人员在 Raspberry Pi 等设备上实现他们的代码。下面是一个简单的代码块,演示了 Kivy 的工作示例。以下启动代码的代码参考取自此链接。查看更高级的代码和更多信息。

起始代码:

**from** kivy.app **import** App
**from** kivy.uix.widget **import** Widget
**from** kivy.graphics **import** Color**,** Ellipse

**class** MyPaintWidget**(**Widget**):**

    **def** on_touch_down**(**self**,** touch**):**
        **with** self.canvas**:**
            Color**(**1**,** 1**,** 0**)**
            d = 30.
            Ellipse**(**pos=**(**touch.x - d / 2**,** touch.y - d / 2**),** size=**(**d**,** d**))**

**class** MyPaintApp**(**App**):**

    **def** build**(**self**):**
        **return** MyPaintWidget**()**

**if** __name__ == '__main__'**:**
    MyPaintApp**()**.run**()**

上述代码块中设计的 GUI 界面将帮助您借助每次单击来绘制一个椭圆形状的对象。我决定用下面的选项画一张随机的脸,这个功能在上面贴的图中很明显。玩得开心,做你自己的创新设计,以及查看 Kivy 包的更多选项。

6.wxPython:

作者图片

wxPython 很容易通过一个简单的 pip install 命令来安装,并且可以用来创建令人惊叹的 GUI 框架。它们基本上是 Python 中包装类的扩展,用于创建大量应用程序。对于本文中提到的一些其他 GUI 选项来说,它是一个很好的跨平台选择,可以创建一些简单的项目。

这个包非常容易使用,并创建 GUI 界面。由于其简单性,我们可以轻松地创建窗口、面板、标签和其他功能。下面的代码块展示了如何构建一个 GUI 来显示一些标签。以下启动代码的代码参考取自此链接。查看更高级的代码和更多信息。

起始代码:

import wx 

app = wx.App() 
window = wx.Frame(None, title = "wxPython Frame", size = (300,200))

panel = wx.Panel(window) 
label = wx.StaticText(panel, label = "Hello World", pos = (100,50))

window.Show(True) 
app.MainLoop()

7.Flask / Django:

约书亚·阿拉贡Unsplash 上拍摄的照片

虽然本文的其他部分已经广泛地介绍了桌面上不同类型的图形用户界面(GUI)的工作过程,但是我们将研究两种用于构建基于 web 的 GUI 的 web 开发工具。Flask 和 Django 是两个 Python 库,它们将帮助执行许多动作和操作来创建基于 web 的 GUI 网络。

在下一节中,我们讨论了 Flask 和 Django 的一些简单代码块。这些代码只是供初学者探索他们拥有的巨大潜力。Flask 代码将使您能够在运行程序后提供给您的本地桌面主机中运行所需的打印命令。在以后的文章中,我们将分别探讨 Flask 和 Django,并了解如何用它们编写机器学习项目。一些应用是网络上的人工智能视频监控。

烧瓶的起始代码:

from flask import Flask, render_template, redirect, url_forapp = Flask(__name__)[@app](http://twitter.com/app).route("/")
[@app](http://twitter.com/app).route("/home")
def home():
 # return "<h1>HELLO!</h1>This is the home page "
 return render_template("home.html") # Render the home.html in the templates folderif __name__ == "__main__":
 app.run(debug=True) #Debugable mode
 # app.run() # Normal Run

Django 的起始代码:

from django.http import HttpResponsedef index(request):
    return HttpResponse('Hello, World!')

结论:

照片由 Neven KrcmarekUnsplash 上拍摄

“设计无处不在。从你穿的裙子到你拿的智能手机,都是设计。”——【萨马达拉基尼

Python 编程语言提供了巨大的潜力,可以创建出色的图形用户界面工具来执行各种项目。除了为众多任务增加视觉和美学吸引力之外,它还允许开发人员使他们的项目具有高度交互性。这些 GUI 工具对于大多数实际应用都非常有效,包括软件设计项目、人工智能项目、机器学习或深度学习模型、web 开发等等。

在本文中,我们探索了一些奇妙的图形用户界面工具,开发人员可以用它们来实现一些独特的功能。借助 Python 及其为开发人员提供的丰富的库选项,我们可以用 Tkinter 或 PyQt5 构建一个经典的 GUI 框架。我们还可以用 Pygame 或 Open-CV 分别为游戏和计算机视觉应用构建更独特的 GUI。Kivy 和 wxPython 是另外两个很棒的桌面 GUI 选项。最后,我们还探索了 Flask 和 Django,使用它们我们可以构建基于 web 的 GUI。

虽然我们已经探索了 Python 中用于开发独特应用程序的七个奇妙的 GUI 工具和库,但仍有许多精彩的工具有待探索。如果你有任何其他很酷的建议,一定要在下面评论出来。

如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。

看看我的其他一些文章,你可能会喜欢读!

</17-must-know-code-blocks-for-every-data-scientist-c39a607a844d> </15-numpy-functionalities-that-every-data-scientist-must-know-f6d69072df68> </6-best-projects-for-image-processing-with-useful-resources-f860f3dfe977> </7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e> [## 数据科学和机器学习的 7 个最佳免费工具

towardsdatascience.com](/7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e)

谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!

法律论证挖掘面临的 7 大挑战

原文:https://towardsdatascience.com/7-challenges-for-argument-mining-in-law-fb98a6df7b0c?source=collection_archive---------34-----------------------

认识并克服主要任务如何让我们更接近成功

维恩·R·沃克的图片,迈克尔·泽兹奇Unsplash 上的照片

法律中的论点挖掘是从法律文件中自动提取论点或推理单元。事实证明,编写自动挖掘法律论据的软件极其困难。即使是律师也很难识别、分类和提取法律论据。但是,如果我们认识到并克服成功的 7 个主要挑战,整个任务会变得更容易管理。

定义一个论证单位

法律中的论点挖掘有一个技术定义。它是从自然语言法律文档中自动提取论证或推理单元,目标是为论证的计算模型和推理引擎提供结构化数据。(参见阿特金森等著《走向人工论证》 AI 杂志(2017)Habernal 和 Gurevych,《用户生成的网络话语中的论证挖掘》计算语言学(2017)劳伦斯和里德,《论元挖掘:一项调查》计算语言学 (2020) 。)

什么是"实参"?一个论证由论证成分和这些成分之间的逻辑关系组成。

一个论证单元包含至少两个命题作为组成部分——一个结论和一个或多个前提。“命题”是一个完整的思想,可以是真的或假的,通常可以用一个简单的陈述句来表达。例如,英语句子“孩子踢了球”表达了孩子踢了球的命题。但其他英语句子可以表达同样的命题(如“球被孩子踢了”)。法语和西班牙语的句子可以表达同样的命题。所以,我们可以把一个命题想象成自然语言中一个简单的句子所表达的逻辑意义。逻辑研究由命题组成的论点,而不管这些命题在自然语言中是如何表达的。

我们可以附加附加标签参数组件。比如,斯蒂芬·图尔敏(Stephen Toulmin)的有影响力的模型将结论称为“主张”,并将前提分为“数据”和“授权”。( Stephen E. Toulmin,论证的用途:更新版(剑桥大学出版社 2003) 。(数据被定义为“我们作为主张基础的事实”(Id。, 90.)在法律诉讼中,被接受的证据起着这种数据的作用。例如,证据的一部分可能是“证人作证说事件的发生和描述的一样。”图尔敏将认股权证描述为“一般的、假设性的陈述,它可以充当桥梁,并授权我们的特定论点所承诺的那种步骤。”(Id。, 91.)在法律辩论中,这种意义上的正当理由可以是常识性的概括、科学方法或法律确立的推理规则。例如,一个常识性的搜查令可能是,“如果证人作证说事件如所描述的那样发生了,那么它很可能发生了。”争论的结论可能是事件确实如描述的那样发生了。

论元单元也可以在逻辑关系中有所不同,这些逻辑关系将它们的命题成分联系在一起。(参见劳伦斯和里德(2020),第 777 页。)前提通过演绎或概率推理关系与结论相连。此外,前提本身在逻辑上可能是复杂的,由通过逻辑连接词(如合取和析取)连接在一起的多个命题组成。

采矿过程

因此,一个论证单元由一个前提或一组逻辑相连的前提推断出的结论组成。法律中论点挖掘的目标是:

识别法律文件中与论点相关的句子;

从句子中提取论点的命题成分;

从单词和短语中提取论点的逻辑关系;

准确构建完整的论证单元;和

将论证单元连接成连贯的推理线(“论证”)。

“挖矿”的过程通常是分层发生的。从表面上看,法律文件是一系列的句子(通常被分成段落,这些段落可能被分成更大的文件部分)。句子(或从句,有时是句子中的短语)表达命题。这些句子中的一些单词或短语通常表达工作中的逻辑关系(例如,“和”、“或”、“因此”、“除非”)。论点挖掘需要使用适当的逻辑关系将适当的命题连接在一起,以反映所提出的论点。它还要求将整个论点相互联系起来(例如,支持或反对的论点)。

采矿作业必须“挖出”所有这些结构,并“把它们带到地表”——让它们看得见。它必须正确地这样做,而不歪曲原始文件的含义。本文开头的图形图像表明了这种采矿作业的分层性质。

自动论点提取面临的 7 大挑战

自动化采矿需要创建可以很好地执行这些任务的软件,只需要很少或不需要人工帮助。根据我在法律推理、逻辑和自动提取过程方面的长期经验,我将整个过程分为 7 个主要任务,每个任务都有其挑战。如果我们能够成功地处理每一个问题,我们就已经朝着自动挖掘法律论据的方向前进了一大步。在这次讨论中,我将集中从事实调查决定中提取论据——也就是说,从书面法律文件中提取论据,以宣布事实的审判者如何将法律规则应用于证据,以得出关于事实的结论。此类决定通常由初审法院或行政法庭发布。

1。挖掘法律规则的可计算系统

从法律判决中挖掘论据的第一个挑战是以可计算的形式获取管理法律规则。法律规则确定了需要证明的问题,也构建了证明过程。律师头脑中保存着一套复杂的法律规则,他们在辩论中经常使用这些规则。我们在哪里可以找到这样的法律规则?机器能提取它们,然后形成系统吗?我们应该如何在计算机中表示和存储这样的规则系统?我发现我们可以使用一种特殊形式的推理树(一种“规则树”)来表示法律规则,这种推理树可以在辩论中充当图尔敏保证。软件如何提取和制定规则树的细节必须留到另一个故事中。但是正如我在另一个帖子中解释的,我们知道法律中的论证挖掘需要以可计算的格式捕获法律规则,所以它们可以用于论证。

2。将事实结论映射到法律问题

法律规则告诉我们要证明的问题,但法院或法庭必须决定在特定案件中满足哪些规则。论点挖掘的第二个挑战是确定法庭对所提出的法律问题的结论,包括将每个结论映射到其适当的法律问题(该结论“关于”哪条规则)。一方的律师解释证据并运用法律规则,目的是说服事实的审判者得出有利于律师委托人的结论。决策者撰写的决定通常会说明法律规则是什么,当事人的论点,相关证据,决策者对证据的推理,以及事实结论的审理者(称为“事实认定”)。从一个案件的书面判决中挖掘论据的一个主要任务是识别那些宣布法庭事实发现的句子(或句子的一部分)。这些“判决”告诉我们法庭接受了哪些论点,以及法庭拒绝了哪些论点。

3。确定“相关”证据

但是案件中的哪些证据是哪个结论或发现的前提呢?论点挖掘的第三个挑战是识别与任何特定事实结论相关的证据。在法律上,如果证据比没有证据的情况下得出的结论更有可能或更不可能,那么证据就是“相关的”。(例如,参见联邦证据规则 401 。)能否创建一个通用算法,将证据归类为这种法律意义上的“相关”?从类似案例的决策报告中进行精确的论证挖掘可以帮助我们回答这样的问题。也许我们可以归纳进化出将证据类型与发现类型联系起来的方法。

4。从证据和规则到发现的推理

假设我们可以挖掘法律规则、事实发现和相关证据,那么将它们联系在一起的推理是什么?第四个挑战是识别决策者的推理。如上所述,证据为论证提供了最基本的“数据”,法律规则提供了一些推论的“依据”但是大多数中间推论(从证据到结论的推理路径)并没有被法律规则规定。事实的调查者利用常识、统计理论、科学或其他来源。一个问题的各个方面的律师可能会争论得出推论的不同途径。然而,我们希望确定法庭自己的推理,以区别于各方的论点。首先,我们可以从报道的判决中找出任何明确陈述这种推理的句子。但是如果推理只是隐含的呢?如果我们发展一个典型论证模式或方案的信息分类法,我们也许能够提供这种隐含的推理。

5。识别论证模式

法律论证挖掘的第五个挑战是制定一套充分的循环论证模式。典型的模式或方案有助于提供隐含的推论。此外,我们需要对决策中的论证单位进行分类。类别或类型将允许我们计算不同情况下不同论点的成功率或失败率。如果我们能够归纳生成一个有用的分类系统,过去的决策可以为开发这样一个类型系统提供经验基础。我们必须开发这样一个系统来对参数单元进行分类,并标记足够数量的数据,然后我们才能希望自动检测参数类型的实例。

6。创建足够精确的语义数据

在挖掘过程的每一步,我们都希望开发预测模型来帮助我们进行分类。法律论证挖掘的第六个挑战是创建足够精确的语义数据,这样我们就可以开发这样的模型。语义数据由根据其含义或重要性标记或分类的文本部分组成。在特定的法律领域中, 法律-语义数据捕获了法律的含义或意义。创建足够数量的好数据既困难又昂贵。机器学习算法可以创建有助于数据生成的模型,但它们无法消除首先创建足够准确的数据的需要。幸运的是,经验工作表明法律语言是如此规则,以至于相对少量的语义数据就可以充分训练机器学习算法。

7。开发机器学习预测模型

但是“充分训练”在这里是什么意思呢?机器学习能在法律中成功挖掘论点吗?法律论证挖掘的第七个挑战是开发机器学习模型,可以自动创建足够准确的语义数据。何为“足够准确”取决于预期的用例、法律文档文本的语言特征以及我们需要的语义数据的抽象性。目前,我们可以创建足够的语义数据来训练模型,当律师和法官执行各种任务时,这些模型可以为他们增加重要的价值。这些预测模型有助于自动化应对这 7 项挑战所涉及的许多子任务。但全自动提取整个论点一般可能是一个长期的难题。

结论

我们可以把从法律判决中挖掘论据的问题分解成一系列的任务,每一项都提出了挑战。总体而言,该战略包括:

识别那些可能包含不同类型逻辑信息的句子类型;

从这些句子中提取所需的逻辑信息;和

使用论元模式来表达文本包含的论元单元。

当我们从法律文件的语言层面深入挖掘,深入到所选句子的单词级别时,我们使用文本的语言特征来给它贴上更抽象的逻辑概念的标签。因此,论证挖掘既矛盾又困难,尤其是在法律领域。但是确定一系列的挑战,并在每项任务上取得进展,给了我们一个成功解决整个问题的策略。

使用 Python 可以完成的 7 种常见文件系统操作

原文:https://towardsdatascience.com/7-common-file-system-operations-you-can-do-with-python-e4670c0d92f2?source=collection_archive---------9-----------------------

使用 OS 和 Pathlib 模块来自动化 Python 的任务。

作者图片(Canva 上制作)

在不安装任何第三方库的情况下,您可以在 Python 中做的最酷的事情之一是执行文件系统操作,例如创建文件夹、重命名文件和处理目录。尽管这些任务可以很容易地手动完成,但是您可以使用 Python 代码来自动化它们,以节省一些时间。

在本文中,我们将看到在 Python 中使用 os 和 Pathlib 模块可以完成的 7 种文件系统操作。每个操作包括实际的例子,所以你可以理解这两个模块之间的区别。

1.获取当前工作目录

在 Python 脚本中处理路径时,了解当前工作目录是最基本的。有两种路径—相对路径和绝对路径。绝对路径是指文件系统中相对于根目录(/)的相同位置,而相对路径是指文件系统中相对于当前工作目录的特定位置。

相对路径为你的脚本提供了灵活性,这就是为什么它有时比绝对路径更受欢迎。我们可以使用当前的工作目录来创建一个相对路径。

对于这个操作以及本文中列出的所有文件系统操作,我们必须导入操作系统和路径。

import osIn [1]: os.getcwd()
Out [1]: /Users/frank/PycharmProjects/DataScience

从上面的代码可以看出,我得到了包含我的数据科学项目的所有脚本的目录。这是我在 Pycharm 的工作目录。我们可以用 Pathlib 库获得相同的目录

from pathlib import Path

In [1]: Path.cwd()
Out [1]: /Users/frank/PycharmProjects/DataScience

如果我们打印type(os.getcwd())type(Path.cwd(),我们可以看到 os 和 Pathlib 模块之间的主要区别。第一个只返回一个string,而第二个返回一个PosixPath对象,可以帮助我们做额外的操作。

2.列出目录内容

除了显示当前的工作目录,我们还可以列出目录中的所有文件。

In [1]: os.listdir()
Out [1]: ['script1.py', 'script2.py', 'script3.py']

就我而言,我的“数据科学”文件夹中只有 3 个 Python 脚本。我们可以用Path().iterdir()得到同样的结果,但是我们会得到一个generator object。为了从这个生成器中获得一个列表目录内容,我们使用了如下面的代码所示的list()

In [1]: list(Path().iterdir())
Out [1]: [PosixPath('script1.py'), PosixPath('script2.py'), PosixPath('script3.py')]

我们甚至可以看到特定文件夹中的内容。例如,我的“数据科学”文件夹中有一个名为“数据集”的文件夹我们可以用下面的代码列出“Dataset”文件夹中的目录内容。

# os
os.listdir('Dataset')# pathlib
list(Path('Dataset').iterdir())

3.连接路径

在 Python 中连接字符串就像在两个单词之间使用“+”号一样简单;然而,当涉及到连接路径时,事情变得有点棘手。这是因为 Mac OS 在目录名中使用正斜杠“/”,而 Windows 使用反斜杠“\”,所以如果您希望 Python 代码能够跨平台运行,您需要一种不同的方法。幸运的是,os 和 Pathlib 模块可以解决这个问题。

# os
os.path.join(os.getcwd(), 'Dataset')# pathlib
from pathlib import Path, PurePath
PurePath.joinpath(Path.cwd(), 'Dataset')

如果我们打印上面写的代码,我们将得到一个包含工作目录和“数据集”的路径路径将看起来像这样/Users/frank/PycharmProjects/DataScience/Dataset。OS 库创建一个字符串,而 Pathlib 创建一个 PosixPath 类。但是,我们还没有创建“数据集”文件夹。要创建目录,请检查下一个文件系统操作。

4.创建目录

虽然您可以在几秒钟内创建一个目录,但当涉及到任务自动化时,编写一些 Python 代码将是最佳解决方案。我们可以用这两个库来执行这个任务,只是略有不同。让我们创建一个“数据集”文件夹作为示例。

# os
os.mkdir('Dataset')# pathlib
Path('Dataset').mkdir()

如果“数据集”文件夹不存在,将创建该文件夹。然而,如果我们试图创建一个已经存在的目录,Python 会抛出一个错误。也就是说,如果我已经有了一个名为 Dataset 的文件夹,脚本将会中断。幸运的是,我们可以用 Pathlib 轻松控制这种行为。

Path('Dataset').mkdir(exist_ok=True)

通过添加exist_ok参数,我们可以忽略错误,以防目录已经存在。

5.重命名文件名

与创建目录类似,重命名文件名是一项我们可以用 Python 脚本自动完成的任务。使用操作系统库,我们可以通过引入字符串名称来重命名文件。例如,让我们将“数据集”文件夹重命名为“数据”

os.rename('Dataset', 'Data')

我们也可以用 Pathlib 来完成这个任务。在这种情况下,目标名称可以是字符串或另一个 path 对象。让我们将文件夹重命名为“数据集”

current_path = Path('Data')
target_path = Path('Dataset')
Path.rename(current_path, target_path)

您甚至可以使用 for 循环重命名具有特定扩展名的多个文件。比如,我要在每个前面加上 2021 年。csv 文件在我的工作目录。

for i, file in os.listdir():
    if file.endswith('.csv'):
        os.rename(file, f'2021_{file}')

如果您想更进一步,您可以使用时间模块将脚本运行的日期添加到文件名等等!

6.检查现有文件

您可以使用 OS 和 Pathlib 模块检查文件/目录是否存在。让我们看看文件夹数据集是否存在于我的工作目录中。

# os
os.path.exists('Dataset')# pathlib
check_path = Path('Dataset')
check_path.exists()

如果打印上面的代码,Python 将在文件夹存在时返回一个True值,或者在文件夹不存在时返回False值。因为我有一个名为“数据集”的文件夹,所以我得到了True

7.[计]元数据

元数据是描述其他数据的数据。例如,创建日期、修改日期和文件大小。让我们获取我的工作目录中的一个test.py脚本的绝对路径。

# os
os.path.abspath('test.py')# pathlib
script = Path('test.py')
script.resolve()

打印上面的代码后得到了绝对路径/Users/frank/PycharmProjects/DataScience/test.py

使用 Pathlib,我们可以很容易地获得文件的词干、后缀、文件大小和出生时间。

In [1]: print(script.stem)
In [2]: print(script.suffix)
In [3]: print(script.stat().st_size)
In [4]: print(script.stat().st_birthtime)Out [1]: test
Out [2]: .py
Out [3]: 1060
Out [4]: 1614190828.6

如你所见,出生时间是时间戳格式的。如果您想获得一个 datetime 对象,运行下面的代码。

from datetime import datetime

timestamp = 1614190828.6
dt_object = datetime.fromtimestamp(timestamp)

print("dt_object =", dt_object)

就是这样!现在你知道了使用 Python 可以做的 7 个文件系统操作,你可以在 os pathlib文档中查看更多操作。

与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)

数据项目的 7 个常见问题

原文:https://towardsdatascience.com/7-common-gotchas-of-data-projects-62e8646552f2?source=collection_archive---------51-----------------------

处理数据时遇到的挑战

凯利·西克玛在 Unsplash 上的照片

作为数据专业人员,数据是我们工作的核心,然而,数据很少为我们准备好开始挥舞我们所谓的“魔杖”;我们的数据会有问题,确保我们从数据项目中获得最佳收益的最佳方式是了解它们是什么,以便我们可以想出解决它们的方法。

让我们来探讨其中的一些问题…

#1 数据收集和标记

在某些情况下,就时间和金钱而言,数据收集可能非常昂贵,这通常发生在我们遇到客户问题时,因为没有现成的数据可供我们利用,因此我们不得不自己收集数据。

:退房 永远记住数据先于科学 学会获取数据的技巧。

花大钱的地方是为监督学习任务标记数据。当必须手动完成时,情况就更糟了。例如,如果我们项目的目标是识别一个城市中的所有超市——理想的解决方案是从某个地方获取这些数据,但是对于这个场景,让我们假设我们不能。

为了获得最新的数据,该小组决定派出一辆装有摄像头的汽车来拍摄该城市的环境。这种形式的数据收集本身是一个非常昂贵的过程,但现在我们需要标记数据。数据的标注必须人工完成,这需要付钱给人类来完成,这不是一个便宜的任务。

在这一类别中,还有一个可能危及我们数据项目结果的子问题。这就是所谓的质量差,它包含两个组成部分:

  • 原始数据的质量差
  • 标签的质量差

随着我们的深入,你会看到更多质量差的例子。

#2 噪音

当我们谈到有噪声的数据时,我们指的是在我们的数据集中没有意义的附加信息。噪声本身可以被定义为对示例的破坏或扭曲。例如,图像可能模糊不清,语音注释的背景可能有警笛声,或者一些文本可能连接了一些不应该连接的单词。

“噪音通常是一个随机过程,它破坏了一个集合中独立于其他例子的每个例子”——Burk ov,A. 机器学习工程。第 44 页

当数据集相对于要解决的问题很小时,噪声通常会成为一个问题,这通常会导致小数据集中的过度拟合。换句话说,模型将了解数据中被污染的噪音,这将导致对新的看不见的数据进行糟糕的概括。

注意 :当数据集很大时,噪声可以作为正则化的一种形式。

#3 低预测能力

如果你从未经历过在一个数据集上测试多个算法,并让它们都表现得糟糕透顶,我真羡慕你。我们通常无法知道我们是否有低预测能力的问题,直到我们花了一些时间尽最大努力得到一个好的模型。

如果我们竭尽全力尝试许多不同的解决方案,试图找到一些可接受的结果,而不管问题变得多么复杂,那么考虑我们预测能力低的可能性可能是一个好主意。

低预测能力可能是由两个因素造成的:

  • 模型可能不够有表现力
  • 数据可能不包含模型学习足够好的函数以将输入映射到输出的足够信息

#4 偏差

维基百科将偏见描述为支持或反对某个想法或事物的不相称的权重,通常是以一种封闭的、偏见的或不公平的方式。偏见可能是天生的,也可能是后天习得的。人们可能会对某个人、某个团体或某个信仰产生偏见。在科学和工程领域,偏差是一种系统性错误[ 来源 : 维基百科 ]。

出现偏差的原因有很多,因此我将单独撰写一篇文章来探讨这一现象。

#5 过时的例子

MLOps 在过去几年越来越受欢迎,这是原因之一。一旦模型被构建并部署到生产环境中,它通常会在衰退之前的一段时间内表现良好——需要多长时间取决于手头的任务。

一个模型通常会因为一种叫做概念漂移的现象而开始出错。概念漂移是指模型试图预测的目标变量的统计属性随时间以不可预见的方式发生变化。这导致了问题,因为预测变得不那么准确久而久之[ 来源 : 维基百科 ]。

#6 异常值

在统计学中,离群值是一个看起来与数据集中的大多数例子明显不同的例子。虽然“不相似性”是由从业者决定的,但是有一些度量标准可以用来衡量一个例子与另一个例子的不相似程度,比如欧几里德距离。

简单的模型如线性回归逻辑回归,以及一些集成方法如 Adaboost,对异常值特别敏感。另一方面,可以显式或隐式执行特征空间转换的模型在处理异常值时往往是没问题的。

#7 数据泄露

数据泄漏可能发生在数据项目生命周期的许多不同阶段。简单来说,数据泄漏是指使用训练数据之外的信息来创建模型,这可能会导致您创建极其乐观的模型(如果不是完全无效的话)。

“数据泄露是指当你用来训练机器学习模型的数据含有一些关于你试图预测的信息时。”

因此,确定您是否面临数据泄露问题的最简单方法是考虑您的模型结果是否好得令人难以置信。

包裹

在本文中,我介绍了我们在数据项目中经常会遇到的 7 个常见问题。虽然我在本文中没有提供太多解决这些问题的方法,但我相信承认它们的存在以及如何识别它是否是您正在遇到的问题是提出解决方案的第一步,这通常是非常直观的。在后面的文章中,我将触及其中的一些要点,即如何应对不同类型的数据偏差。

感谢您的阅读!

我最近开始了我自己的邮件列表。如果你喜欢这篇文章,订阅我的邮件列表与我联系,这样你就不会错过我写的关于人工智能、数据科学和自由职业的帖子。

https://mailchi.mp/ef1f7700a873/sign-up

相关文章

</4-data-related-books-ill-be-reading-in-april-efd06b367e35>

将机器学习模型推向生产之前的 7 个考虑事项

原文:https://towardsdatascience.com/7-considerations-before-pushing-machine-learning-models-to-production-efab64c4d433?source=collection_archive---------10-----------------------

在投入生产之前进行快速的健全性检查

Arie Wubben 在 Unsplash 上拍摄的照片

作为一家重视可扩展性的公司的一部分,作为一名数据科学家,我每天都看到将基于人工智能的解决方案投入生产所带来的挑战。

这些挑战是众多的,涵盖了许多方面:建模和系统设计、数据工程、资源管理、SLA 等。

我不会假装精通任何一个领域。然而,我知道实现一些软件工程原则和使用正确的工具对我的工作有很大的帮助,使我的工作可重复并为生产做好准备。

在这篇文章中,我将与你分享我在生产我的模型之前的 7 个考虑因素。

让我们谈谈这个💬

1 —处理随机性

确定性代码就不那么令人担心了

机器学习模型不是确定性的:如果你使用相同的数据和相同的超参数训练一个神经网络两次,你不会得到相同的模型。这两个模型对相同测试数据的输出可能看起来非常相似,但它们并不完全相同。

这种差异是由多种原因造成的。一个非常常见的问题与模型最初的训练方式有关。事实上,优化者,或者通俗地说,成本函数最小化(即模型的训练,基本上)背后的算法在更新权重值之前计算梯度时引入了随机性:这种随机性来自于对训练集的采样。

SGD —随机梯度下降(用户修改的图像)

🔴尽管随机性是神经网络和许多其他机器学习模型的固有部分,但在某些情况下,尤其是在可重复性很重要的情况下,这是一种不可取的品质。

解决方案:设置随机种子🌱

通过为所有使用随机性的包(NumPy,SciPy,Torch,TensorFlow)设置种子,您可以强制您的代码具有确定性。
例如,如果您正在使用 NumPy 和 Pytorch,您可以这样做:

如果你使用 Tensorflow,你可以用另一种方法:

2 —记录您的模型、指标和工件

代码不是唯一应该被版本化的资产

跟踪你的机器学习实验是在任何时间点重现它们的关键。

您当然可以用老方法来完成,将您的模型保存在文件夹中,将您的度量保存在 JSON 或(甚至更糟)Excel 文件中,但是这使得很难与人协作,并且随着时间的推移保持一致的数据结构。

我最近开始使用 MLflow 来跟踪我的机器学习项目,我非常高兴。

在 MLflow 术语中,每个项目都可以被认为是一个实验,在中有多个运行

作者图片— MLflow 术语

每次运行对应一个迭代,您可以记录:

  • 模型超参数和附加配置
  • 模型权重和二进制文件
  • 运行产生的其他工件:文本文件、图像、日志文件或任何您想要的东西

MLflow 将这些数据存储在跟踪服务器上。这可以是您在个人计算机上启动的本地服务器(在这种情况下,存储系统将是您的文件系统),也可以是您部署在云上的远程服务器。

在云上使用跟踪服务器是非常有意义的,因为团队可以一起工作并将工件推到同一个中心位置。

如果您有兴趣了解更多关于 MLflow 的信息,请查看我以前关于这个主题的帖子。

如何看待 MLflow 的实际应用?下面是一小段代码,它执行许多模型拟合,并针对超参数的每个组合,将指标和数据记录到 MLflow 中。

如您所见,开销是最小的。代码实际上没有变化。

3-创建管线并对其进行调度

你必须把你的 python 脚本放到某个地方

你的代码在你的本地计算机上正确运行是一回事:你只需要按下一个按钮或者输入一个命令并运行它。

然而,在生产环境中,您的代码被集成到一个管道中。必须安排这个管道定期运行,以应对潜在的故障转移,启动虚拟机来运行您的代码并对其进行扩展,向用户显示信息,发出警报或通知等。

你的代码只是整个机器的一小部分🏭。

有一个流行的解决方案来创建管道并编排它们: 气流

气流以由任务组成的有向无环图(或Dag)的形式接近管道。任务是执行 python 代码的计算单元。

Airflow 为您提供了以任何顺序重新排列任务的语法,只要它们符合 DAG(这意味着永远没有循环)。)

图片由作者修改

它还提供了以编程方式调度任务的灵活性。

要了解更多关于气流的知识,我推荐去看看这个人的视频:他们解释得很好。

4 —外部化配置(如路径)

或任何其他敏感信息

您应该避免将路径等变量硬编码到代码中。

我们都做过一次,它可能看起来像这样:

**import pandas as pd****data = pd.read_csv("../../../../data.csv")**

但是在我的电脑上可以用!

这种做法的问题是,任何运行您的代码的人都必须将文件放在与您完全相同的位置,否则将面临一个OS error。这不太实用,而且限制了你作品的可复制性。

路径应该被认为是配置参数,因此必须放在外部配置文件中,或者注入到环境变量中,或者从其他系统中读取。通过将逻辑与配置分离,您的代码更加模块化,也更易于维护。

当您的代码在生产环境中运行时,路径和配置很少。硬编码:它们是从外部文件系统读取或加载的。

在特定项目中加载环境变量而不污染全局名称空间的一个解决方案是使用**python-dotenv**( **pip install python-dotenv** )。

为了能够使用这个包,首先必须创建一个.**env**文件,并把它放在项目的根目录下。该文件将包含您希望注入到项目运行时的环境变量。这些环境变量可以包括路径凭证主机名等。

**API_KEY=my_secret_key
PORT=3030
OUTPUT_PATH=/opt/trained_models/**

然后,在主脚本中添加下面一行:

**from dotenv import load_dotenv**

要使环境变量可访问,请执行以下操作:

**from dotenv import load_dotenv
import os****api_key = os.environ["API_KEY"]**

如果您想轻松地从代码中外部化环境变量,那么**python-dotenv**是一个流行的选择。要了解更多信息,你可以查看我以前的帖子:

5 —设置 CI-CDs 以自动化工作流程

git push——等待奇迹

在将项目部署到生产环境之前,您通常希望在验证单元测试时,确保它在临时环境中正确地构建和部署。

CI-CD 工作流允许您在 Git 事件(如特定分支上的 push 或 pull 请求)触发时自动化此类(以及更多)流程。

我使用带有 Github 动作的 CI-CD 管道来自动化:

  • 单元测试和代码覆盖率
  • 通过运行代码格式化程序(例如 Black 或静态类型检查程序( mypy )对代码进行完整性检查
  • 构建 Python 包并在 S3 上存储它们的轮子
  • 自动部署到远程服务器

关于最后一点,如果你有兴趣用 FastAPI 构建一个机器学习 API,并用 Docker 和 Github 操作部署它,可以看看我以前的帖子。

6 —不要相信用户的输入,要事先验证

永远不要相信用户。有时他们根本不知道他们在做什么,当他们知道时,他们可能想弄乱你的代码。所以要做好准备。

当您将代码投入生产时,您可以期待任何事情。字面上。

如果您期望一个整数,但却收到一个字符串,您的代码不应该无声地失败或抛出一个用户无法理解的无法解释的错误信息。

当您的代码在这种特定情况下失败时,它必须向最终用户表明,他刚刚输入的内容不符合程序的预期。代码可能需要特定的类型、匹配正则表达式的字符串或区间值。如果它接收到不一致的东西,用户必须明确地知道它,

这就是我们所说的数据验证。

有不同的方法来处理数据验证。为此,我喜欢使用的一个特殊的库是 Pydantic:它为您提供了在类的每个属性上添加验证的灵活性。

作者制作的图像

要了解更多关于 Pydantic 以及如何使用它有效地验证用户输入的信息,可以看看我以前发表的关于这个主题的文章。

</8-reasons-to-start-using-pydantic-to-improve-data-parsing-and-validation-4f437eae7678>

7 —使用模板引导您的项目

我讨厌重复,我总是努力使任务自动化。我不知道自动化的一个特殊方面是构建项目。

组织项目可能是一项乏味且重复的任务。当我开始一个新项目,并希望它的结构与我以前的工作一致时,我必须检查旧项目,将它们的结构复制粘贴到新文件夹中,删除不必要的文件,添加新文件,重写配置文件,等等。这不是一个特别困难的任务,但是时间值得花在别的事情上。

你可以通过使用 Cookiecutter 库来自动化这个过程。

Cookiecutter 允许你创建模板来启动一个项目:如果你的一些项目遵循相同的结构,这是非常实用的。您所要做的就是调用 cookiecutter,并将您感兴趣的模板的 URL 传递给它。Cookiecutter 会询问您一些信息,您可以在终端上填写这些信息,一旦完成,您的项目就创建好了。

作者图片

如果您想了解更多关于 cookiecutter 以及如何自动化您的数据科学项目的结构,您可以看看我以前的帖子,在那里我尝试了一些开源的 Cookiecutter 模板,这些模板实施了行业的最佳实践。

资源

将机器学习引入生产不仅仅是关于训练模型和执行分析:它包括各种软件工程实践。这篇文章是对我目前正在实践的原则以及我正在使用的工具的一个小小的概述。

一如既往,这里有一些很好的资源,可以用来学习如何生产你的机器学习模型。

感谢阅读🙏

这篇文章概述了我用来改进代码并为生产做准备的原则。如果你有其他的建议,把它们列在列表中,并在评论中告诉我😉

今天就这些了。直到下一次更多的编程技巧和教程。👋

照片由卡斯滕·怀恩吉尔特Unsplash 上拍摄

新到中?您可以每月订阅 5 美元,并解锁无限的文章— 点击此处。

Kagglers 正在使用的 7 个很酷的 Python 包

原文:https://towardsdatascience.com/7-cool-python-packages-kagglers-are-using-without-telling-you-e83298781cf4?source=collection_archive---------0-----------------------

让我来揭示秘密…

照片由https://www.pexels.com/@miphotography?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels**上的** 像素组成。 除特别注明外,所有图片均为作者所有。

Kaggle 是数据科学和机器学习趋势的热点。

由于它的竞争性,顶级玩家不断寻找新的工具、技术和框架,使他们比其他人更有优势。如果一个新的包或算法提供了可操作的价值,它很有可能立即被采用并变得流行。

这篇文章是关于 7 个这样的趋势包,它们直接替代了许多过时的或者急需升级的工具和技术。

**https://ibexorigin.medium.com/membership

获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:

https://alphasignal.ai/?referrer=Bex

1️⃣.UMAP

链接到地块的代码。

上面是一个 100k 的行数据集,包含 75 个使用名为 UMAP 的包投影到 2D 的要素。每个点代表分类问题中的一个样本,并根据其类别进行颜色编码。

像这样的大规模数据集可能会让你在 EDA 期间感到痛苦,主要是因为它们带来的计算和时间开销。因此,重要的是,你创建的每个图都是准确的,并揭示了数据的一些重要内容。

我认为这是 UMAP(一致流形逼近和投影)在 Kaggle 上如此受欢迎的原因之一。它是高效的、低代码的,并且允许您从高维度的角度真正“看”数据:

图片来自 UMAP 文档。

当我看到这样的图时,它们让我想起了我当初为什么要进入数据科学——数据是美丽的!

🛠 GitHub 和文档

🔬报纸

💻演示

UMAP 提供了一个简单的兼容 Sklearn 的 API。导入UMAP模块后,在特征和目标数组(Xy)上调用其fit,默认情况下将它们投影到 2D:

UMAP估计器最重要的参数是n_neighborsmin_dist(最小距离)。把n_neighbors想象成一个控制投影缩放级别的手柄。min_dist是每个投影点之间的最小距离。

如果你希望投射到一个更高的维度,你可以像 Sklearn 的PCA一样调整n_components

2️⃣.数据表

随着数据集规模越来越大,人们越来越关注内存外的多线程数据预处理工具,以摆脱 Pandas 的性能限制。

在这方面最有前途的工具之一是受 R 的data.table包启发的datatable。它由 H2O.ai 开发,支持大数据(高达 100 GB)的并行计算和内存外操作,符合当今机器学习应用的要求。

虽然datatable没有熊猫那么大的一套操作功能,但人们发现它在大多数常见操作上远远胜过它。在一个在 100M 行数据集上进行的实验中,datatable 设法在一分多钟内将数据读入内存,比 pandas 快 9 倍。

🛠 GitHub 和文档

💻演示

datatable中的主要数据结构是Frame(如 DataFrame)。

>>> type(frame)datatable.Frame

一个简单的 GroupBy 操作:

3️⃣.懒惰预测

Lazypredict 是我见过的最好的一行程序包之一。

使用该库,您可以在一行代码中训练几乎所有的 Sklearn 模型加上 XGBoost 和 LightGBM。它只有两个估值器——一个用于回归,一个用于分类。将数据集上的任何一个模型与给定的目标相匹配,将评估 30 多个基础模型,并生成一份报告,列出它们在几个流行指标上的排名。

💻演示

像这样的洞察力将把你从选择基本模型的手动任务中解放出来,把时间花在像特征工程这样的任务上会更好。

🛠 GitHub 和文档

4️⃣.奥普图纳

我最近添加到技能库中的一个库是 Kagglers 的最爱——Optuna。

Optuna 是下一代自动超参数调整框架,设计用于当今 ML 和深度学习包中可用的几乎任何模型和神经网络。

与类似的工具如 GridSearch、TPOT、HyperOPT 等相比,它有几个优点。:

  • 与平台无关:具有可与任何框架一起工作的 API,包括 XGBoost、LightGBM、CatBoost、Sklearn、Keras、TensorFlow、PyTorch 等。
  • 内置了大量具有提前停止和修剪功能的优化算法
  • 简单的并行化,只需很少或不需要修改代码
  • 内置支持,以可视化方式探索调优历史和每个超参数的重要性。

我最喜欢的功能是它暂停/恢复/保存搜索历史的能力。Optuna 跟踪所有以前的调优,您可以继续搜索任意长的时间,直到获得您想要的性能。

此外,您可以通过添加一个额外的参数,将结果存储在本地或远程数据库中,从而使 Optuna 独立于 RAM 用于大规模数据集和搜索。

🛠 GitHub 和文档

🔬报纸

💻演示

为了简单起见,我们试图优化函数(x — 1) + (y + 3)。如您所见,xy的调整值非常接近最佳值(1,-3)。

实际估值器的超参数调整有点复杂,所以你为什么不看看我的详细指南:

[## 为什么 Kaggle 的所有人都痴迷于 Optuna 进行超参数调优?

towardsdatascience.com](/why-is-everyone-at-kaggle-obsessed-with-optuna-for-hyperparameter-tuning-7608fdca337c)

5️⃣.SHAP

可解释的人工智能(XAI)是人工智能和人工智能领域最强的趋势之一。由于其“黑箱”性质,公司和企业开始对人工智能解决方案的采用感到不安。

嘿,没人能责怪他们。如果数据科学家自己想出工具来理解他们创造的模型,企业主的担忧和怀疑是完全有道理的。

在 Kaggle 上的大师笔记本中经常出现的工具之一就是 SHAP。

SHAP(Shapley Additive explaints)是一种利用博弈论中的概念来解释模型如何工作的方法。在分数上,SHAP 用一种叫做沙普利值的东西来解释:

  • 模型中的哪些特性最重要
  • 任何单一预测背后的模型决策。例如,询问哪些特性导致了这个特定的输出。

《SHAP》最引人注目的方面是其统一的主题和独特的情节,打破了任何模型和神经网络的机制。以下是一个示例图,显示了单个预测的 Shapley 值的特征重要性:

相信我,SHAP 有更酷的情节。这是一个如此强大的工具,以至于 Kaggle 平台有一个围绕它构建的完整免费课程

🛠 GitHub 和文档

🔬报纸

💻演示

下面是一个简短的片段,用于创建经典糖尿病数据集中所有预测的蜂群图:

6️⃣.急流 cuDF

如果你认为 GPU 是深度学习专用的,那你就大错特错了。

由开源平台 RAPIDs 创建的 cuDF 库使您能够在一个或多个 GPU 上运行表格操作操作。

datatable不同,cuDF 有一个与 Pandas 非常相似的 API,因此提供了一个不太陡峭的学习曲线。由于它是 GPU 的标准,这个库非常快,当与它的熊猫式 API 结合时,它比datatable有优势。

使用 cuDF 的唯一麻烦是它的安装——它需要:

  • CUDA 工具包 11.0 以上
  • NVIDIA 驱动程序 450.80.02+
  • Pascal 架构或更好的架构(计算能力> =6.0)

如果您想不受安装限制地试用这个库,Kaggle 内核是一个很好的选择。这里有一个笔记本让你开始。

🛠 GitHub 和文档

💻演示

以下是文档中的一个片段,显示了对 tips 数据集的简单 GroupBy 操作:

7️⃣.自动化 EDA 库

通常,我反对任何让程序员远离编写实际代码的库或工具。但是,由于 auto-EDA 库现在在 Kaggle 上非常流行,为了完整起见,我必须包括这一部分。

最初,这一部分应该只是关于 AutoViz 的,它使用 XGBoost 来显示数据集最重要的信息(这就是我选择它的原因)。后来,我决定也包括一些其他人。

以下是我发现的最好的 auto EDA 库列表:

  • DataPrep —最全面的汽车 EDA [ GitHub文档 ]
  • AutoViz —最快的自动 EDA [ GitHub ]
  • PandasProfiling —最早也是最好的 auto EDA 工具之一[ GitHub文档
  • Lux —最人性化最豪华的 EDA [ GitHub文档 ]

💻演示

如果你想看看每个软件包如何执行 EDA,请在 Kaggle 上查看这个伟大的笔记本

摘要

执行数据科学任务的可用工具和软件包数不胜数。每个人都有权利对此感到不知所措。

但是我真诚地希望这篇文章中概述的工具有助于将你的关注点缩小到最大的 ML 社区成员手中的趋势和交付结果。

以下是我的最新作品…

**

7 项关键的机器智能考试以及 MLOps 与产品管理的隐藏联系

原文:https://towardsdatascience.com/7-critical-machine-intelligence-exams-and-the-hidden-link-of-mlops-with-product-management-5fc6a1fa18e4?source=collection_archive---------8-----------------------

现在是机器在被释放到世界上之前进行测试的时候了!一个伟大的机器学习产品通过测试变得非凡。MLOps 应该采用新兴的测试实践,将工程活动与产品管理联系起来。

阿克谢·肖汉Unsplash 上拍摄的照片

感恩节前一天下午 3 点 15 分。你正在为漫长的周末清理收件箱。然后,你的销售部门主管打电话:“销售线索的优先排序发生了什么事???" 近期无部署,数据检查完毕。看起来你的感恩节计划突然改变了!

本文将在一个关键的组织、技术以及最重要的机器学习模型应该通过的考试的快节奏纲要中,检查产品管理和 MLOPs 之间的联系。

在过去的 12 个月里,许多机器学习操作工具越来越受欢迎。有趣的是,有一个特征在讨论中明显缺失或很少被提及:质量保证。

学术界已经启动了机器学习系统测试的研究。此外,一些供应商提供数据质量支持利用数据测试库数据质量框架。自动化部署也确实存在于许多工具中。但是模型的金丝雀部署以及机器学习领域的单元和集成测试中发生的任何事情怎么样?

这些质量保证提案中有许多源自工程思维。然而,越来越多没有工程背景的专家执行大量的模型工程。此外,回想一下,一个单独的人或团队经常运行质量保证活动。据说这样工程师就可以信任其他人来发现错误。更愤世嫉俗的人物可能会坚持认为工程师需要被控制和检查。

在深入机器智能考试之前,允许快速讨论一下工程思维和质量保证授权的危险。

科学不是工程……没关系!

Via Imgur

大多数时候,在科学上,如果事情在一个受控的环境中工作一次是完全没问题的,而且通常,实验可能实际上失败了。在工程界,没有这种奢侈。对于所有的意图和目的,许多系统永远运行,产生质量保证。这种心态很重要。数据科学家进行实验,很少需要监管或审计环境之外的可重现结果。工程师必须长期可靠地提供可重复的结果。这并没有使科学比工程更容易,但它揭示了目标的差异。因此,将思维模式从数据科学视角转变为工程视角提供了急需的清晰性。接下来,让我们讨论谁可能执行质量保证工作。

测试,测试,测试…有用吗?

照片由 @felipepelaquimUnsplash 上拍摄

从工程的角度来看,让我们检查一下经常观察到的质量保证与工程的分离。质量保证有多种形式,但归结为测试。除非你真的担心护栏编程,测试自动化才是正道; Patric 的文章解释了原因。显然,在测试任何东西之前,你需要知道会发生什么。对于通常被操作为目标函数的机器学习,用外行人的话来说:弄清楚成功看起来像什么

两个基本的组织方面支配着测试:

  • 工程师应该测试他们自己的工作吗
  • 测试应该是正式的还是以数据为中心的

委托是不会错的,对吧?那么,为什么不委派专家来测试这个模型呢?为了专门化的测试自动化编排任务,将测试工程从开发工程中分离出来是有充分理由的。然而,由于工程师和测试人员的分裂而导致的不信任文化本质上是不健康的。因此,理想情况下,工程师确保测试他们自己的模型,测试工程师希望自动化测试工作。毕竟,工程师最了解如何正确检查入站数据,以便模型假设不会被破坏。一些角色之间的轮换可能有助于让每个人都充分了解最新的实践。注意,轮换是在同一个团队的角色之间进行的。团队之间的轮换效率要低得多,这是因为工作量的增加/减少。

是使用正式的还是以数据为中心的模型测试通常取决于正式验证是否可能和经济。在大多数情况下,以数据为中心的测试会非常有效。

让我们回顾一下:要为生产运营建立可靠的机器学习模型,以数据为中心的自动化测试在大多数情况下都是一个优秀的解决方案。

幸运的是,CI/CD 领域中许多奇妙的软件工程工具可以重新用于模型测试。一些新兴的 产品甚至可能在适当的时候提供内置的模型测试功能。如果您不想等待,那么您可以构建自己的,或者在 DevOps 团队的帮助下,重新调整现有工具的用途:

  1. 分割和版本化数据集
  2. 将入站数据质量控制在您的 Grafana 中
  3. 使用预提交钩子确保数据和模型测试存在
  4. 利用首选 CI 工具/测试框架对模型和数据进行测试
  5. 建立模型监控指标
  6. 金丝雀部署型号与其他代码相同

本文的剩余部分说明了在为机器学习系统设计有效测试时需要考虑的几个值得注意的方面。如果有帮助的话,这些方面对于机器学习模型就像考试对于小学生一样

功能测试

Artem Bryzgalov 在 Unsplash 上拍摄的照片

功能单元和集成测试往往是必不可少的。尤其是当将一个较大的模型分解成专用于特定任务的较小的子模型时,比如说作为较大的文章评级模型的一部分的图像和文本分类模型。功能测试应确保选择适当的计算方法,并为每个子模型选择正确的参数和数据。功能测试可能还包括输入数据质量测试,包括对结构合理但统计退化数据的模型度量敏感度测试。

性能测试

Mikail McVerryUnsplash 上拍摄的照片

性能测试是机器学习最标准的测试场景。在某种程度上,这是寻找对性能指标敏感度的所有其他测试的先决条件。但是,特定的指标对于特定的训练群组、测试或验证数据集的模型设计或阈值限制可能很重要。因此,在测试用例设计中考虑这样的选择可以提高测试质量。

标签质量敏感度测试

照片由波普&斑马挡泥板上拍摄

有六种标签数据问题值得测试。在测试模型的标签数据敏感性时,标签数据可以是人工精选的,也可以是像 Snokel 这样的工具可以为模型测试用例生成合成的训练数据。在这两种情况下,测试都在寻找对每一类标签数据问题的关键模型度量灵敏度。由于标签数据管理和潜在合成数据生成的复杂性,标签质量测试可能是一组更复杂的测试活动。

道德和监管测试

照片由廷杰伤害律师事务所Unsplash 上拍摄

设计测试案例以最小化意外后果,包括违反监管规则或减少道德顾虑,变得越来越重要。适用于您的型号的管理域可能会有所不同。然而,独立于此,对有目的偏差的训练/测试数据的敏感性将有助于确定一个版本的模型如何以及在哪里引入或多或少的偏差。

一致性测试

照片由伯纳德·赫曼特Unsplash 拍摄

借用一个比喻,被锤子改造过的钉子依然是钉子。这同样适用于流经模型管道的数据。然而,数据不变量经常被违反。软件工程师测试这些。

对于机器学习,还有第二个一致性方面。钉子的功能需要保持一致。如果一个模型的一个因素或参数在最后一个模型版本中导致了一个特定的(可测量的)行为,那么这个行为应该是相同的,除非是有意的改变。事实上,因素如何变化的来源有些复杂。此外,用于训练和测试的交互和数据也有很大的影响。然而,可能有你的模型的核心信念,你不想因为好的理由而改变。例如,在大多数情况下,你不想违反物理定律,更高的物体应该导致更高的音量。

超参数拐角情况

沃洛德梅尔·赫里先科Unsplash 上的照片

理解模型配置在超参数空间中的位置可能是说明性的,特别是当使用自动超参数调整方法时。验证拐角情况的模型结果是明确超参数选择的一个选项。如果模型参数配置非常接近特定的极限情况,可能需要手动重新评估参数设置。优化算法配置可能过于激进,尤其是在自动确定优化算法设置时。

漂移测试

Ralfs Blumbergs 在 Unsplash 上拍摄的照片

随着世界的发展,机器学习模型也在发展,或者说它们应该发展。虽然模型监控可能会检测到生产系统中的偏差,但在部署新模型版本时可能会有更多偏差。针对多个时间切片数据集运行新模型,以估计新模型版本中固有的漂移,这表明了未来的漂移预期。引入更大的漂移会影响预定的模型重新训练和更新频率,并且是模型运行的重要输入。

总结

建立健全的 MLOps 已经是一项复杂的工作;增加测试并不会使它变得更容易。对于任何机器学习工作来说,关键的方面是定义一个清晰和可测量的目标,包括量化目标是否达到以及达到何种程度的模型度量。

回报通常值得投入的努力,不仅因为它有助于防止破坏性事件管理工作。作为测试工作的一部分而收集的数据允许更可控的模型设计。

然而,测试数据在本质上是双重用途的。它们对于审计和监管讨论至关重要,并有助于营销沟通,以展示特定的产品质量属性。这些结果远比作为通信设备的行业基准更能说明问题。尤其是当机器学习产品的目标是技术购买中心时,这样的数据点是演示或社交媒体内容中的绝佳话题。邀请潜在客户检查测试策略可以建立对产品的信心。如果没有严格的测试,这个机会会被完全忽略。

机器智能考试可能会省去一次感恩节聚会,并有可能改善你产品的营销。使用测试数据结果对产品进行更加客观的交流,为 MLOps 和产品管理提供了必要的联系。

延伸阅读

  1. 测试基于机器学习的系统:系统映射
  2. 测试驱动的机器学习
  3. 机器学习系统的有效测试
  4. Efemarai 机器学习模型测试平台
  5. 在生产中维护机器学习的实用指南

7 个数据宠物项目,以更快地学习数据科学

原文:https://towardsdatascience.com/7-data-pet-projects-to-learn-data-science-faster-d34f5350b1ef?source=collection_archive---------14-----------------------

确定一个个人项目只需要一点创造力和开放的心态

照片由思想目录Unsplash 上拍摄

我坚信跟随你的心。也就是说,在线学习数据科学是一场斗争,因为我不知道我的心在哪里。我会遵循初学者的课程,但只能做到这一步,因为我觉得自己完全脱离了他们正在研究的数据问题。

这就是宠物项目的用武之地。

宠物项目是一种冒险、活动或目标,尤其是出于个人兴趣而不是因为它被普遍认为是必要的或重要的。——字河马

这通常是一个个人数据相关的项目,你对熟悉的数据感兴趣,在这里你寻找见解并回答一个给定的问题。

在本文中,我将列出七个示例项目来帮助您开始。有些可能需要收集数据,而另一些可能有数据可供您使用。

如何选择项目

网上有各种各样的博客和文章给初学者提供项目想法的建议。这些都很好,但你如何决定?以下四点将帮助你做出决定。

  1. 你有一个有效的和重要的问题或难题需要数据来回答。
  2. 数据是可用的或者可以容易地收集。
  3. 这个项目对你有意义。
  4. 这个项目不会花太多时间。为从问题理解到分析到建模的过程的每个部分设定时间。没有一个明确的时间框架,当事情变得困难或陷入困境试图使用完美的工具或过程时,你可能会暂时放弃项目。记住,我们是来学习的,不是来证明我们的天赋的。

从事宠物项目的好处

  1. 在真实问题的背景下发展你的技能和学习新技术。这增强了你处理未来问题的信心。
  2. 将你的思维重新构建成一种分析思维,将问题分解成可管理的步骤和块
  3. 通过培养超越明显问题的好奇心来学习如何提问。
  4. 根据数据分析,帮助您在个人生活或业务中做出数据驱动的决策。
  5. 增强您的数据讲述技巧。使用项目中的图表,你可以创建一个令人信服的展示你的发现的演示文稿,然后上传到你的 GitHub 并与潜在的招聘人员分享。

现在让我们进入项目。

项目 1:监控你的饮食

我们吃的食物在很大程度上决定了我们的生活质量,所以我们发现自己一直在努力改变或改善我们的饮食。

跟踪你的饮食习惯可以对改变饮食习惯产生巨大影响,正如凯文·雅各布斯所证明的那样,他在跟踪自己身体对低碳水化合物饮食的反应时,体重持续下降。

他的博客文章中,他展示了从记录食物和测量身体尺寸的整个过程,他用于分析的工具,以及一些解释他的发现的视觉情节。

例题待答: 吃一个月的低碳水化合物饮食会导致体重明显减轻吗?

跟踪 特征:体重、腹部尺寸、每日卡路里、脂肪、蛋白质和碳水化合物摄入量。

数据收集: 一个老式的笔记本或电子表格是一个很好的起点。你也可以使用应用比如 loseit

项目 2:跟踪你的锻炼和健康状况

健身是另一项我们都想锻炼但有时无法坚持的活动。跟踪你的锻炼可能会成为激励你的伙伴,让你保持责任感和责任感。

Bobby Muljono 为例,他跟踪了自己在运动和营养后的体重减轻情况,并最终使用机器学习来预测未来基于运动和饮食的体重减轻情况。

我们也看到 Jeh Lokhande 结合他的睡眠、健康和网络浏览数据来分析各种因素如何与睡眠质量相关联。

例题: 坚持运动,我的睡眠会有明显改善吗?

特征追踪: 睡眠量和质量,以及运动时间和强度。

数据收集: 保留一个电子表格,使用一个健身 app 或者投资一个健康可穿戴。James Clear 提供了一个关于如何写锻炼日志的有用指南。

项目 3:时间管理和生产力

生产力是另一个我们都想掌握的难以捉摸的概念。我们周围有这么多科技和小玩意,浪费时间是个顽固的问题。

Erin Greenawald 用 Toggl 应用追踪了她一个月的时间,发现看电视占用了她非常不舒服的时间。她还开始在开车时听有趣的播客,这是她大部分时间去的地方。

例题: 我在哪里花的时间比应该花的少?

要追踪的特征: 把日常活动分成几类,比如工作、自我发展、人际关系、玩乐,然后测量每一类在一周或一个月内花费的时间。

数据收集: 你可以在电子表格中记录活动,或者使用生产力追踪器应用程序,如 toggl

项目 4:金钱支出

虽然我们都想把辛苦赚来的钱花在重要的事情上,存下并投资一大笔钱,然后把剩下的给别人,但这很少发生。跟踪你的消费习惯可能会暴露出你的钱都花到哪里去了。这也可能表明你需要认真起来,挣更多的钱。

Lorenzo Rosa 向我们展示了如何使用一款名为 Yolt 的应用程序整合不同银行账户的支出。她使用 python 创建了一份个性化的财务月报。另见财富部落社区的阿加莎,她成功追踪了她在 2020 年赚的每一美元。

示例 问题:在接下来的 6 个月里,我可以在哪里削减开支,从而增加收入?

数据收集: 在笔记本上记录你的支出,然后转移到电子表格中,或者使用费用跟踪应用程序,如 Mint。

项目 5:特定领域的业务数据

如果你或你身边的人经营一家企业,很可能会涉及某种形式的记录保存。

想出企业面临的一些挑战,并利用这些数据来看看你是否能提供解决方案。在探索数据的过程中,您还可能会发现其他隐藏的见解和趋势。

例题: 有没有在某些季节或月份比较受欢迎的产品或服务?

数据收集: 将数据输入 excel 表格或使用核算工具,如 Quickbooks

项目 6:求职、面试和职位安排

求职过程可能会非常令人沮丧和耗时。一个好的策略是分析几个你感兴趣的职位,并找到这些职位共有的顶级技能。

我最喜欢的内容创作者之一肯·吉(Ken Jee)在他的 YouTube 频道上有一个完整的视频系列(从头开始的数据科学项目),他从 Glassdoor 网站搜集并分析了就业安置数据。作为一种基于项目的学习方法,我向每个初学者强烈推荐它。

至于跟踪你的工作申请和面试,詹姆斯·迈尔提供了一个简单的电子表格来引导你完成整个过程。

例题: 进入理想工作所需的 5 大技能是什么?

数据收集: 一个电子表格,或者从网站上抓取数据。

项目 7:特定爱好数据

你喜欢做并且擅长的是什么,并且想要更上一层楼?无论是艺术、内容创作还是体育运动,数据都可能是你的答案。

再拍肯吉。他在大学时是一名高尔夫球手,他利用数据来激发自己的激情,意识到职业高尔夫不适合他,于是开始了数据职业生涯,现在是一名领先的体育分析专家。从一个简单的项目开始演变成一个蓬勃发展的事业,影响着包括我在内的生活。

例题:【在此插入你的爱好】我需要在哪些领域努力,才能以此谋生?

展示调查结果

最后,您可以从宠物项目中获得的一项重要技能是通过数据故事进行沟通。这包括通过报告或博客帖子以简化的方式展示项目。

为了有效地讲述一个故事,你要设身处地地为你的听众着想,假设他们没有任何技术背景。通过解释启动整个项目的情况和难点,让他们参与进来。

提及你是如何收集数据的,并用你的发现和推论的清晰可视化吸引他们。最后,给出一个令人信服和满意的结论,说明为什么开展这个项目是有益的,并包括解决问题的实际行动点。

分享你的项目并不是为了得到反馈或批评,而是为了确保你以一种其他人能够理解的方式做到最好。在 GitHub 上上传项目文件,并通过博客帖子、社交媒体或在简历中分享链接。

结论

在学习数据科学的同时,尽快从事现实世界的项目是非常重要的。一个宠物项目是个人的,对你有益的,没有外界压力,因此是一个好的开始。

通过一个宠物项目,你获得了解决实际问题的实用技能。这也会让你在扩展工具集时,在处理新问题时保持动力和信心。

我祝你旅途顺利。如果你喜欢这篇文章,并想从我这里得到更多类似的东西,请在这里订阅。如果你还不是 medium 的会员,请点击这里加入,阅读更多有价值的内容。感谢您的阅读!

我们应该在 2021 年抛弃的 7 个数据科学神话

原文:https://towardsdatascience.com/7-data-science-myths-that-we-should-leave-behind-in-2021-e5984f62d6fd?source=collection_archive---------9-----------------------

打破数据科学领域常见的错误观念

Unsplash 上由 Frankie K. 拍摄的照片

每个领域都被神话所包围,这些神话由一些人开始,像野火一样在各个年代和国家传播。不幸的是,这些神话往往很容易被相信,这就是为什么它们会存在很长时间,需要被该领域的人们打破。

互联网让人们很容易找到几乎任何东西的信息。但是,这使得发现错误信息变得很有挑战性,错误信息使得各种领域的神话得以传播。由于科技领域是一个巨大的、受欢迎的、要求很高的领域,它是网络神话的理想之地。

虽然一些技术领域的神话跨越到数据科学,因为它是技术的一个分支,但一些独特的神话尤其笼罩着数据科学。在我加入数据科学领域之前,我在网上查了一下,进入了一个关于这个领域的神话和一些真相的兔子洞,进入了这个领域,并在其中找到了一份工作。

</5-books-to-take-your-data-visualization-skills-to-the-next-level-42565105377e>

起初,我相信这些神话,并花了一些时间才发现所有这些都只是谎言,数据科学并不像它从远处看起来的那样。因此,在本文中,我将带您了解我在加入数据科学领域之前听到的 6 个完全错误的神话。因此,如果您正在考虑进入数据科学领域,这篇文章是为您准备的。

№1:你需要一个学位才能进入数据科学领域

让我们从科技领域最大的神话开始,那就是你需要一个计算机科学学位——或同等学历——才能进入任何科技领域,包括数据科学。这与事实相去甚远;是的,拥有计算机科学学位可能会让事情变得更容易,但这并不是从事数据科学职业的必要条件。

大学学位的一个更好的选择是建立一个可靠的投资组合,积累可靠的经验,也许可以在该领域的特定方面获得两个证书,最重要的是,在社区中建立网络和强有力的联系。这将挑战性地让你比拥有学位更进一步。

№2:一切都与代码有关

我意识到数据科学是一个技术领域,在某些时候,您需要编写代码来实现算法、收集数据、清理数据和实现项目。但是,数据科学不仅仅是编码;在我看来,编码甚至不到项目时间的 25%。

计划、分析数据、创建可视化效果,有时甚至做市场调查,都将占用项目的大部分时间和精力。所以,如果你认为不做一个好的编码员是死路一条,它不是;事实上,在数据科学的一些分支中,你不需要编码,比如创建可视化或者数据分析。

№3:数据科学没有创造力

也许关于数据科学的最大神话是,它是一个系统化的领域,你在每个项目中都遵循相同的步骤,你会得到答案。尽管这有一定的道理,但在数据科学中仍有大量创造性的空间,从在数据探索阶段找到正确的图表来获取信息,到创建有意义的可视化来显示您的结果。

很少有可视化设计师从数据科学家开始,然后以创建可视化为职业。可视化并不是你在数据科学中发挥创造力的唯一途径;写代码可以是艺术;提出创新的沟通方式是在数据科学中运用创造力的其他方式。

№4:换场很难

关于数据科学的另一个常见误解是,一旦你进入该领域并经历了所有的学习,你就需要在这方面出类拔萃;你将不得不坚持下去,或者从头开始学习一个全新的领域。虽然乍一看,你可能认为数据科学所需的技能只是为了数据科学,但这些技能中有许多是可以转移的。

要想在数据科学领域取得成功,你需要提高你的可视化和沟通技能,学习一些业务基础知识,并培养良好的团队合作技能。然而,如果你发现数据科学不适合你,所有这些技能都可以转移或专注于追求一个全新的职业。

</6-data-science-certificates-to-level-up-your-career-275daed7e5df>

№5:这是一条不稳定的职业道路

如果你最近尝试谷歌数据科学,那么你可能会看到一些文章和新闻,谈论技术领域——总的来说——特别是数据科学——是不稳定的领域,当你在这些领域寻求职业生涯时,没有工作保障。

科技领域正在迅速发展;它不断成长和进化,但这并不意味着它不稳定;只是说明这是一个成长发展空间太大的领域,这是这个领域的主要优势之一。

№6:数据科学很难进入

如果你是数据科学的新手,那么你一定已经做了研究,并且可能有一长串要做的事情来“进入”数据科学。但是,事实是,尽管数据科学一开始看起来势不可挡,但如果你有一个结构化和定时的计划,那么进入这个领域并不困难。

让数据科学成为一个伟大领域的另一个因素是这个社区是多么的热情和友好。如果您在这个领域遇到了困难,我相信您会找到一位数据科学家,他会很乐意在您的旅程中帮助您。

</9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8> [## 9 台用于数学、Python 和数据科学的 Discord 服务器,您需要立即加入

towardsdatascience.com](/9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8)

№7:要成为数据科学家,你需要超级聪明

在本文中,我们要打破的最后一个神话是,一些人相信成为一名数据科学家;你需要成为天才。我不是说没有高智商的数据科学家,但我一直相信,任何时候努力都是战胜聪明的。

如果你认为数据科学是适合你的领域,并且你努力学习需要理解的技能和工具,投入时间和精力,我可以保证你的努力会有回报。因为这从来不是关于你有多聪明,而是关于你有多愿意工作。

外卖食品

对世界各地的许多人来说,进入科技领域有很多吸引人的原因;这是一个灵活的领域,你可以远程工作,如果运气好的话,还可以赚很多钱。因此,对于任何考虑换工作的人来说,合乎逻辑的第一步是谷歌一下这个领域,阅读这个领域中不同的工作角色和选择。

互联网是获取信息的绝佳场所,既有准确的信息,也有虚假的信息。但是,对于那些刚进入这个领域的人来说,很难区分真假,而且可能会因为错误的信息而放弃从事这个领域的工作。例如,我被问了很多关于编程、量子计算和数据科学的问题,让我震惊的是,有这么多不正确的信息让人们远离这些领域。

</10-skills-of-a-successful-data-scientist-be05a72d3aec> [## 成功数据科学家的 10 项技能

towardsdatascience.com](/10-skills-of-a-successful-data-scientist-be05a72d3aec)

这就是为什么我决定写这篇文章,解决人们在考虑从事数据科学职业时遇到的 6 大误区。我希望这篇文章能帮助人们做出决定,更好、更现实地了解数据科学以及进入这个领域需要什么。

不到 5 分钟内完成 7 个数据辩论 Python 函数

原文:https://towardsdatascience.com/7-data-wrangling-python-functions-in-under-5-minutes-a8d9ec7cf34b?source=collection_archive---------7-----------------------

戴维·克洛德在 Unsplash 上的照片

PYTHON 教程-数据争论

最基本但最常用的数据操作函数的分步演练

1 导言

大家好,我是 Gregor,我是一名数据科学家,也是一名大部分时间都需要评估和清理数据的人。我喜欢在我的项目中平等地使用 Python/ Pandas 和 R/ tidyverse。我最近分享了一篇文章,在文章中我概述了我最常用的用于数据争论的 R 函数。我认为分享如何利用 Python 中的这些函数是个好主意,尤其是熊猫。

在下一节中,我将概述我对本文的技术设置,以便您自己立即使用本文中的示例。然后,在第 3 节中,我将使用 Gapminder 数据集展示这七个函数。如果您有任何问题或任何意见,请随时与我分享。

数据争论功能概述;作者图片

2 设置

为了展示这些功能,我将使用 Gapminder 数据集。Gapminder 数据集包含该国几十年来的预期寿命、人均 GDP 和人口数据。此外,我将 Jupyter 笔记本与熊猫结合使用。

这七项功能是熊猫套餐的一部分。如果你想知道我是如何构建我的代码的,它被称为方法链或管道(在 R 社区中)。我在我的另一篇文章中解释了的基础知识。

Gapminder 数据集(10 行);作者图片

3 七个最基本但最常用的数据争论函数

七个函数允许您选择重命名特定列,排序过滤您的数据集,创建并计算新列汇总值。我将在每个函数中使用 Gapminder 数据,以便于理解并应用于您的数据集。请注意,我们走得越远,我将使用这些函数的组合。

3.1 过滤器()—选择数据集中的列

仅选择列弹出

Gapminder 数据集(10 行);作者图片

使用 like 运算符选择名称中包含 co 的所有列。请查看文档,了解更多有用的功能。

Gapminder 数据集(10 行);作者图片

3.2 rename() —重命名列

列重命名为,将寿命预期重命名为预期寿命

Gapminder 数据集(10 行);作者图片

3.3 sort_values() —对数据集进行排序

排序。

Gapminder 数据集(10 行);作者图片

lifeExpyear 排序(降序)。

Gapminder 数据集(10 行);作者图片

3.4 query() —过滤数据集中的行

过滤带有年份 1972 的行。

Gapminder 数据集(10 行);作者图片

筛选出 1972 年和预期寿命低于平均值的行。

Gapminder 数据集(10 行);作者图片

过滤年份为 1972 年预期寿命低于平均值,且国家玻利维亚安哥拉的行。

Gapminder 数据集(2 行);作者图片

3.5 assign()和 lambda —在数据集中生成新列

创建一个组合了国家信息的列,以及另一个显示四舍五入后的生命周期信息的列。

Gapminder 数据集(10 行);作者图片

3.6 agg()-在数据集中创建汇总计算

对于整个数据集,计算人口预期寿命的平均值和标准差。

Gapminder 数据集(摘要);作者图片

3.7 Group by()-将数据集分组并创建汇总计算

没有 groupby() 函数, agg() 函数就没那么有用了。将两者结合使用是创建新数据集的有效方法。在下面的例子中,我将按洲对数据集进行分组,然后我将为人口生活支出创建汇总。

Gapminder 数据集(分组汇总);作者图片

也可以按多个列进行分组。在下一个例子中,我使用 groupby()

Gapminder 数据集(分组汇总);作者图片

4 结论

在本文中,我向您展示了我最常用的操作数据集的 Pandas 函数。我为您提供了一些示例,希望这些示例为您尝试每个功能提供了一个完美的基础。

如果你想了解更多关于熊猫的信息,请务必查阅官方文档以及用于数据分析的书Python。请让我知道你的想法和你最常用的功能。谢谢大家!

在不到 5 分钟的时间内为您的下一个数据科学项目提供 7 个数据辩论功能

原文:https://towardsdatascience.com/7-data-wrangling-r-functions-for-your-next-data-science-project-in-under-5-minutes-d5a4ad55f99b?source=collection_archive---------9-----------------------

帕斯卡尔·范·德·万德尔在 Unsplash 上的照片

R —教程—数据争论

最基本但最常用的数据操作函数的分步演练

1 导言

大家好,我是 Gregor,我是一名数据科学家,也是一名大部分时间都需要评估和清理数据的人。我喜欢在我的项目中平等地使用 Python/ Pandas 和 R/ tidyverse。因为我们在最近的项目中使用了 R 和 tidyverse 包,所以我想分享一些最基本但最常用的操作数据集的函数。

在下一节中,我将概述我对本文的技术设置,以便您自己立即使用本文中的示例。然后,在第 3 节中,我将使用 Gapminder 数据集展示这七个函数。如果您有任何问题或任何意见,请随时与我分享。

2 设置

为了展示这些功能,我将使用 Gapminder 数据集。Gapminder 数据集包含该国几十年来的预期寿命、人均 GDP 和人口数据。

这七个函数是由 Hadley Wickham 等人开发的软件包的一部分。它是 tidyverse 包装生态系统的一部分。在我看来,它使 R 成为如此强大和干净的数据科学平台。如果你想了解更多关于 tidyverse 的知识,我强烈推荐免费书籍“ R for Data Science ”。

dplyr 是一种数据操作语法,提供了一组一致的动词,帮助您解决最常见的数据操作挑战。

Gapminder 数据集(10 行);作者图片

3 七个最基本但最常用的数据争论函数

七个函数允许您选择重命名特定的列,排序过滤您的数据集,创建和计算新列,以及汇总值。我将在每个函数中使用 Gapminder 数据,以便于理解并应用于您的数据集。请注意,我们走得越远,我将使用这些函数的组合。

3.1 select() —选择数据集中的列

仅选择列、洲流行

Gapminder 数据集(10 行);作者图片

选择所有列,除了之外的列。

Gapminder 数据集(10 行);作者图片

使用 starts_with() 选择以 co 开头的所有列。请查看文档以获得更多有用的函数,包括 ends_with()contains()

Gapminder 数据集(10 行);作者图片

3.2 rename() —重命名列

列重命名为,将寿命预期列重命名为预期寿命

Gapminder 数据集(10 行);作者图片

3.3 arrange() —对数据集进行排序

排序。

Gapminder 数据集(10 行);作者图片

lifeExpyear 排序(降序)。

Gapminder 数据集(10 行);作者图片

3.4 filter() —过滤数据集中的行

过滤带有 1972 的行。

Gapminder 数据集(10 行);作者图片

过滤年1972 年和预期寿命低于平均值的行。

Gapminder 数据集(10 行);作者图片

过滤年份为1972 年预期寿命低于平均水平,且国家玻利维亚安哥拉的行。

Gapminder 数据集(2 行);作者图片

3.5 mutate () —在数据集中生成新行

创建一个组合了国家信息的列,以及另一个显示四舍五入后的生命周期信息的列。

Gapminder 数据集(10 行);作者图片

3.6 summarize 在数据集中创建汇总计算

对于整个数据集,计算人口预期寿命的平均值和标准偏差。

Gapminder 数据集(摘要);作者图片

3.7 Group _ by()-将数据集分组并创建汇总计算

没有 group_by() 函数,summary 函数只有这么有用。将两者结合使用是创建新数据集的有效方法。在下面的例子中,我将按洲对数据集进行分组,然后我将为人口生活支出创建汇总。

Gapminder 数据集(分组汇总);作者图片

也可以按多个列进行分组。在下一个例子中,我将 group_by()一起使用。

Gapminder 数据集(分组汇总);作者图片

4 结论

在本文中,我向您展示了我最常用的操作数据集的 R 函数。我为您提供了一些示例,希望这些示例为您尝试每个功能提供了一个完美的基础。如果你想了解更多关于 R 和 dplyr 的信息,请务必查看官方文档以及漂亮的 R for Data Science 书籍。

请让我知道你的想法和你最常用的功能。谢谢大家!

7 天挑战—掌握 Ggplot2:第 1 天—条形图

原文:https://towardsdatascience.com/7-day-challenge-mastering-ggplot2-day-1-bar-chart-4b2ced928a31?source=collection_archive---------10-----------------------

从零开始了解 R 中的 ggplot2 可视化指南。

照片由莫仁许Unsplash 拍摄

介绍

我最初是一个 Python 用户,我已经使用 Python 完成了我所有的分析任务。因此,我认为没有必要同时知道 R。然而,当我在攻读统计学硕士学位时,我对 R 编程语言越来越感兴趣,尤其是它令人惊叹的图形。

我发现 R 可视化非常用户友好,尤其是在统计可视化任务中。而 ggplot2 是最有帮助的软件包之一,我认为它值得我花大力气去深入了解。我有一篇关于 ggplot2 中基本图的概述的文章, 用 ggplot2 进行数据可视化的指南,你可以在这里 找到它

因为我想了解更多关于 ggplot2 的知识,以便将来研究,所以我决定接受挑战,在 7 天内掌握这个可视化软件包。我将在中间记录我的进步和成就。希望这能给我动力去完成我的挑战,同时也和读者分享我所学到的。

在我的第一篇文章中,我将向你展示我在制作整洁漂亮的条形图方面的探索。

基本条形图

条形图通常用于描述变量值的分布,或者比较数据类别中不同子组的数据。我相信条形图是最有用和最强大的基本图表之一,它可以帮助我们在各种情况下获得重要的洞察力。因此,每当我学习一个新的可视化库时,我通常从条形图开始。

但是首先,让我给你看一下我将在这篇文章中使用的数据集。你可以很容易的在 R regclass包中得到数据集。我将选择数据集 EX2。小费,这是我在不同聚会中给小费的记录。

以下是数据集的摘要:

library(regclass)
library("skimr")data(EX2.TIPS)
skim(EX2.TIPS)

先说一个简单的情节。

目标: 我想找出数据集中有多少女性和男性。换句话说,我想看看“性别”这个变量的分布。剧情可以简单的通过ggplotgeom_bar的调用来完成。

library(ggplot2)
library('dplyr') #Count number of people in each gender
count_gender <- 
  EX2.TIPS%>%
  group_by(Gender) %>%
  summarise(count= n())#Plot x = gender, y= gender count
ggplot(count_gender, aes(x = Gender, y=count)) + 
geom_bar()

但是等等,没有标题和颜色的图表似乎有点简单。别担心。您可以轻松地用不同的属性定制您的条形图,例如颜色、条形的宽度。这里有几个可以用来更新图表的贡献。

  • 为了改变你的条形图的颜色,用geom_bar中的fill属性标识你选择的颜色。为了改变条形图的颜色边框,使用color属性。
  • 使用ggtitlexlabylab改变 x、y 轴的名称
  • 要自定义 x、y 轴和标题字体或颜色,请更改theme
  • 要获得每根棒线上的数值,添加一个geom_text
ggplot(count_gender, aes(x = Gender,y=count)) + #customize bars 
 geom_bar(color="black",
           fill = "pink",
           width= 0.5,
           stat='identity') +#adding values numbers
  geom_text(aes(label = count), 
            vjust = -0.25) +#customize x,y axes and title
  ggtitle("Distribution of Gender") +
  xlab("Gender") + 
  ylab("Total")) +#change font
  theme(plot.title = element_text(color="black", size=14,          face="bold", hjust = 0.5 ),
       axis.title.x = element_text(color="black", size=11, face="bold"),
       axis.title.y = element_text(color="black", size=11, face="bold"))

如果你不想要一个垂直的条形图,而是一个水平的。很简单,加个coord_flip()元素就行了。这是我们得到的结果:

正如你在图表中看到的,显然参加聚会的男性人数是女性的近两倍。

堆积条形图

目标: 对于一周中的每一天,我都想比较一下参加聚会的男性和女性的总数。

我可以用堆积条形图来观察这两种性别的差异。

geom_bar中的position设置为 “堆叠”即可实现堆叠条形图。 此外,通过使fill等于“性别”,ggplot 将生成一个条形图,其中每个条形图(代表 “工作日】 变量的每个级别)由 【性别】 变量中的所有级别贡献。

下面是我的简单堆积条形图的样子:

ggplot(EX2.TIPS, aes(x = Weekday,fill=Gender)) + 
  geom_bar(position = "stack")

在上图中我们可以看到,有两个级别的性别和四个级别的工作日,一周中每一天每种性别的人数都有一个值。

不过为了比较一周不同日子的男女比例,我更喜欢用一个 分段柱状图。 It 是一种堆积条形图,其中每个条形的总和为 100%。通过在geom_bar中指定参数position = "fill",我们可以很容易地得到如下分段条形图:

ggplot(EX2.TIPS, aes(x = Weekday,fill=Gender)) + 
  geom_bar(position = "fill")

现在,让我们通过添加标签、标题以及自定义 x 轴、y 轴等来改进这个分段条形图。除了上面提到的一些控制元素,我们还有:

  • scale_y_continuous控制连续数据的位置刻度(y)
  • scale_fll_brewer设置条形图的颜色填充
  • 为不同的图表背景安装软件包 ggthemes

详细来说,你可以看到下面的代码:

#Calculating the percentage of both genders in each day of the week
pctdata <- EX2.TIPS %>%
  group_by(Weekday,Gender ) %>%
  summarize(count = n()) %>% 
  mutate(pct = count/sum(count),
         percent_scale = scales::percent(pct))#Plotting ggplot(pctdata, aes(x = Weekday, y=pct, fill=Gender)) + 

 geom_bar(position = "fill", 
           stat = 'identity') +#Adjusting y-axis tick mark   
 scale_y_continuous(breaks = seq(0, 1, .2), 
                     label = percent) + 

#Adding value label
 geom_text(aes(label = percent_scale), 
            size = 3, 
            position = position_stack(vjust = 0.5)) + #Adusting color fill  
 scale_fill_brewer(palette = "Set3")  + 

#Adjusting title, labels 
 ggtitle("Gender Distribution") +

 xlab("Days of Week") + ylab("Percentage") +#Changing theme  
 theme_stata() + theme(
    plot.title = element_text(color="black", size=14, face="bold", hjust = 0.5 ),
    axis.title.x = element_text(color="black", size=11, face="bold"),
    axis.title.y = element_text(color="black", size=11, face="bold" ))

并排条形图

目标:我想跟踪在一周的不同日子里参加聚会的女性和男性人数。

我可以用一个分组的柱状图来看这一周两性的趋势。

那么,怎样才能得到分组条形图呢?使用 ggplot,很简单,因为您只需将geom_bar元素中的position更改为dodge.,与此同时,所有其他事情都以类似于我们绘制简单条形图的方式完成。

ggplot(count_day, aes(x = Weekday, y=count, fill=Gender)) + 

 geom_bar(position = "dodge", 
           stat = 'identity') +

 geom_text(aes(label = count),
            colour = "black", 
            size = 3,
            vjust = 1.5, 
            position = position_dodge(.9)) +  scale_fill_brewer(palette = "Set3")  +  ggtitle("Number of females/males by days of the week") + xlab("Days of Week") + ylab("Total number") + 

 theme_stata()+ theme(
    plot.title = element_text(color="black", size=14, face="bold", hjust = 0.5 ),
    axis.title.x = element_text(color="black", size=11, face="bold"),
    axis.title.y = element_text(color="black", size=11, face="bold" )) 

将不同的条形图放在一个地方

有时,我们想把两张图并排放在一起,以便于比较。在寻找一个我可以灵活运用的解决方案时,我偶然发现了这个网站 不得不说很细致,解决方案很容易定制。我将通过使用grid库将他们的建议应用到我的案例中。

例如,我想得到我的 性别分布图 (用 p 表示)按一周的天数(用 m 表示) 并排的女性/男性数量。我是这样做的:

*library(grid)# Creating a new page 
 grid.newpage()# Create layout: nrow = 1, ncol = 2
 pushViewport(viewport(layout = grid.layout(nrow = 1, ncol = 2)))

# A helper function to define a region on the layout
 define_region <- function(row, col){
   viewport(layout.pos.row = row, layout.pos.col = col)
 } 
# Identify plot positions
 print(p, vp = define_region(row = 1, col = 1))   
 print(m, vp = define_region(row = 1, col = 2))*

结论

是啊。这是我在 7 天挑战 ggplot2 的第一天学到的关于 ggplot2 的条形图的知识。如果你有关于这个酷图书馆的任何有趣的事情与我分享。让我知道。我很快会带着第二天的话题回来:线图。

参考

http://www . sth da . com/English/articles/24-gg pubr-publication-ready-plots/81-gg plot 2-easy-way-mix-multiple-graphs-on-the-same-page/

https://rkabacoff . github . io/data vis/bivariate . html #分类-分类

7 天挑战—掌握 Ggplot2:第 2 天—折线图

原文:https://towardsdatascience.com/7-day-challenge-mastering-ggplot2-day-2-line-graph-2cfbdf164c81?source=collection_archive---------27-----------------------

从零线图了解 R 中的 ggplot2 可视化指南

照片由思想目录Unsplash 上拍摄

介绍

在我之前的帖子 7 天挑战—掌握 Ggplot2:第 1 天—条形图 中,我分享了我用一些核心元素绘制一个像样的条形图的经验。我今天会在这篇文章里继续和大家分享我的 线图 学习心得。

我想给你的是 而不是 一份如此全面的指南,告诉你你想知道的关于 ggplot2 的一切。范围太大,无法涵盖,而阅读一本书听起来是一个更好的解决方案。也就是说,你在这篇文章中所期待的是我对每种图表类型中的一些基本元素的介绍,我相信你可以对其进行定制,以灵活地应用于不同的情况。

所以,简而言之,我宁愿称我的文章为 ggplot2 可视化的小抄,也希望我的小抄能对你有些帮助。

资料组

折线图最常见的用途是描述对象随时间变化的趋势。例如:3 家出口公司从 2000 年到 2021 年的收益。

因此,我将使用 R 中的【tsibble】包中的一个时序数据集来可视化。我的数据集的名字是 【行人】 它提供了 2015 年至 2016 年墨尔本市不同传感器每天统计的行人数量的信息。

下面是我的数据集的一瞥:

**

单线图

目标:一年中不同月份的行人总数。

我根据我之前关于 条形图 的帖子中提到的所有元素绘制了我的基本线图。它们包括对标题、x 轴、y 轴、主题、颜色等的控制。对于前面解释的每个属性,我不再解释,而是直接看图形代码。

geom_bar用于在条形图中生成条形相同,geom_line用于在折线图中创建线条。

现在,让我们看看下面我的简单折线图开发图中的图 1 。通过使用geom_line, theme, xlab, ylab,ggtitle图 1 创建起来没有任何困难。我为图 1 编写的代码如下所示。

*#Calculating number of pedestrians per monthdf1 <- pedestrian
count_all <- df1 %>%  
             group_by(month_year) %>% 
             summarise(total = sum(Count))#Fig 1- simple line chartf1 <- ggplot(count_all, aes(x=month_year, y=total)) +

  ##Create a line by calling geom_line
  geom_line(group=1) + 

  ##Modify titles
  xlab("Year-Month ") +
  ylab("Total pedestrians (Thousands)") +
  ggtitle("Total Pedestrians by Months (Fig 1)") +

  #Change theme 
  theme_economist() + scale_fill_economist() + 
  theme(
  plot.title = element_text(color="black", size=14, face="bold",   hjust = 0.5 ),
  axis.title.x = element_text(color="black", size=11, face="bold"),
  axis.title.y = element_text(color="black", size=11, face="bold" ))*

图 1:简单的折线图开发——作者提供的图片

有一个带geom_line的小通知。当你只为一个组绘制单线图时,记得在geom_line中注明group=1,否则你的图会出错。简单的理解,所有的点都要联系起来,于是 组=1

不过,我的 fig 1 图还是挺乱的,你也看到了。因为我的 y 轴上的刻度标签太大,所以很难跟踪这些值。更糟糕的是,由于我的 x 轴刻度标签是写在对方身上的,所以看不到。因此,为了解决这些问题,我对我的theme属性做了一个小小的修改:

  • 定制axis.text.x让我的 x 轴文本标签旋转 45 度。调整angle=45得到结果。
  • scale_y_continuous重新计算我在 y 轴上的数值,使我的数字有条理。

这是我如何把它转换成图 2 的。

*#Adding figure 1 to figure 2 
f2 <- f1 + 
      ylab("Total pedestrians (Thousands)") +

##Modifying labels on axes
      theme(axis.text.x = element_text(angle = 45, vjust = 0.5,     hjust=0.5, size = 9))+
      scale_y_continuous(labels =  function(x) format(x/1000))*

对于图 3 的,我试图通过在图中添加color并调整我的图线的size来改进我的图 2 。此外,我还用geom_point元素给线图添加了点。

*f3 <- f2 + 
   geom_line(group=1, size = 1.5, color = "darkblue") +
   geom_point(size = 3.5, color = "darkblue", shape =17)*

geom_point,有很多种形状,你可以在这里 阅读更多关于它们的 来选择你的最佳选择。类似地,你可以通过指定linetype为其中之一来选择不同类型的线条:"双点划线"、"空白"、"虚线"、"实线"、"长划线"、"点划线"、"点划线"**

图 4 中,我意识到我不再需要geom_point了,我想用实际值标记我的线图。我该怎么做?不费吹灰之力;只需要把geom_label加到上图你已经有的东西上。

*#Adding graph labels
f4 <- f3 + geom_label(aes(label = round(total/1000,0)), size =3, color = 'darkblue')*

我的最终图看起来比第一张好多了,对吧?

图 2:我的转换图——作者图片

多线图

目标: 各传感器统计的一年中不同月份的行人总数。

简单多线图

对于多线图来说,基本上,一切都和单线图一样。但是,geom_line属性有一点小小的不同,那就是我们不必在多线图中陈述group=1。相反,我们必须在aes属性中指定group=Sensor & color=Sensor,以便 R 可以理解和区分四组传感器。

下面是我如何用单线图中提到的属性和修改在 图 4 中实现多线图。

*#Calculating number of pedestrians by each sensor during the period. 
count_sensor <- df1 %>%
   group_by(month_year,Sensor) %>%
   summarise(total = sum(Count))#Plotting##Specifying group and color group 
f5 <- ggplot(count_sensor, aes( x=month_year, y=total, group=Sensor,   color=Sensor)) +
   geom_line(size = 1.5) + ##Modifying titles, labels and background xlab("Year-Month") + ylab("Total pedestrians") + ggtitle("Total Pedestrians Counted by Sensors (Fig 1)") +

   scale_y_continuous(labels =  function(x) format(x/1000)) +

   theme_economist() + scale_fill_economist() + 

   theme(
     plot.title = element_text(color="black", size=15, face="bold", hjust = 0.5 ),
     axis.title.x = element_text(color="black", size=11, face="bold"),
     axis.title.y = element_text(color="black", size=11, face="bold" ),
     axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=0.5, size = 9))*

图 3:使用前面提到的元素的多线图—作者提供的图片

修改(图例、颜色等)

颜色

我对图 4 中四条线的颜色不满意。我想改变它。好吧,如果你是这么想的,你可以用scale_colour_manual.轻松搞定

*#Manually set the colors
f5 +
scale_colour_manual(values=c("darkblue","darkgreen","red","darkgrey"))*

图例

你也可以改变你的传奇。以下是我们需要关注的几个属性:

  • theme(legend.position = position):将您的图形图例位置更改为“左”、“上”、“右”、“下”、“无”或 c( xy)(x 和 y 值必须在 0 和 1 之间。c(0,0)表示(左,下),c(1,1)表示(右,上)。**
  • theme(legend.background):改变图例的背景。
  • element_texttheme属性中改变图例的字体大小。

因此,我应用这些来定制我的图形视觉:

*f6 <- f5 + 
#Setting line colors
scale_colour_manual(values=c("darkblue","darkgreen","red","darkgrey"))+
#Adjusting legend theme   
##Position
theme(legend.position="top") + 
##Changing text contributes
theme(legend.title = element_text(colour="black", size=12, 
face="bold.italic"),
legend.text = element_text(colour="black", size=12, 
face="italic"))*

图 4:自定义颜色和图例—作者提供的图像

值标签修改

万一,我想只说明 【布克街购物中心(北)】 的最大和最小行人数量,怎么做呢?

很简单,只需过滤出你想要插入到图形中的标签值,放在geom_label元素下。

*##Filter values 
values <- count_sensor %>% filter(Sensor == 'Bourke Street Mall (North)', month_year %in% c("2016-12","2015-11"))##Plot
f6 + geom_label(
     aes(label = round(total/1000,0)), data=values, size =3, color = 'darkgreen')*

图 5:插入标签-作者图片

您可以将我过滤值标签的方法应用于类似的情况:

  • 仅向一行添加标签
  • 向特定级别的 x 值添加标签

结论

以上是我在 ggplot2 中学习绘制折线图的一些技巧。我不得不说,随着我对这个库了解的越来越多,我发现了更多有趣的东西,我很兴奋能够进一步探索。图层绘图类型使可视化变得比以往更加容易和方便。

一定要坚持学习。

稍后请和我一起讨论第三天题目:斜率图

7 天挑战—掌握 Ggplot2:第 3 天—斜率图

原文:https://towardsdatascience.com/7-day-challenge-mastering-ggplot2-day-3-slope-graph-a7cb373dc252?source=collection_archive---------16-----------------------

认识一个非常有趣的图形——斜率图

照片由布鲁克·拉克Unsplash 拍摄

介绍

掌握 ggplot2:第 1 天—条形图第 2 天—线图 之后继续我的一系列学习可视化,我将分享一个激动人心的情节,我旅程的第 3 天的斜率图。但是,要了解 ggplot 如何工作的一般想法和一些简单的概念,您可以先查看我的文章 使用 ggplot 进行数据可视化的指南。

首先,斜率图用于显示两点之间的变化,而不太关心中间点。这在比较不同时间戳中的值和显示一段时间内的趋势时特别有用。如下图所示,图 1 是一个斜率图的例子。它比较了不同公司在 2007 年和 2020 年的收入。通过查看图表,我们可以很容易地看出 A 区是这段时间内增长最快的公司。

图 1:收入—按作者分类的图片

如果你想了解更多关于斜率图形和它们的解释,你可以在story telling with data阅读更多。

在这篇文章中,我将告诉你 4 个步骤来获得任何斜率图形。很简单。

现在,让我们试着用 ggplot2 得到这个有趣的图形。

数据集

我将使用来自dplyr包的数据集“Storm”。这些数据记录了从 1975 年到 2015 年 40 年间不同类型风暴的各种属性。下面,我总结一下我的数据集。

library(dplyr)
data = storms 
skim(data)

图 2:数据汇总—按作者分类的图片

图 3:标题(数据)—作者图片

让我们开始吧…

目标 1:通过斜率图将 1975 年不同类型风暴的平均风力与 2015 年进行对比。

  1. 变换数据集得到 1975 年和 2015 年的平均风力。
mean_storm <- data %>% filter(year %in% c('1975','2015'))%>%
              group_by(year,status) %>% 
              summarise(avg_windpower = mean(wind))

这是我将用来可视化我的斜率图的数据框。

图 4:转换后的数据—按作者分类的图像

2。画出坡度线

在我看来,斜率图是各种各样的线图,或者说是一种特定类型的线图。因此,在第一阶段,获得一条斜线类似于生成一个应用了geom_line的线图。我将向您展示如何:

f1 <- ggplot(data = mean_storm, aes(x = year, y = avg_windpower, group = status, color=status,alpha=1)) +
  geom_line( size = 2) +
  geom_point( size = 4) +
  xlab("Year") + ylab("Avg wind power") +
  ggtitle("Average wind power in 1975 and 2015")f1

图 5:我的草图——作者图片

3。移除不必要的元素

我们离我们需要的东西越来越近了。在这一步,为了有一个清晰的斜率图形,我们必须删除和调整一些元素。基本上,所有的调整都发生在theme()属性中:

  • 调整 x 轴标签并用scale_x_discrete(position = "top").将它们移动到图表的顶部,然后改变这些标签的字体大小使其更清晰。
  • 通过获取theme()属性中的legend.position = "none"来移除图例
  • 删除 y 轴上的所有内容,包括标题、标签、刻度线
  • 通过将这些元素设置为element_blank()从 x 轴移除刻度线、标题
  • 为了使图表更加清晰,我将删除图表中的所有网格线。为此,应该删除theme属性中的一些元素:panel.grid.major.y, panel.grid.minor.y, panel.grid.minor.x, panel.grid.major.x

这是我们移除一些东西后得到的结果:

f2 <- f1+  
  scale_x_discrete(position = "top") +## Changing font size of x-axis and main title of the graph
theme(
  plot.title = element_text(color="black", size=15, face="bold",  hjust = 0.5 ), 
  axis.text.x = element_text(vjust = 0.5, hjust=0.5, size = 12, face="bold"),## Removing grid lines
  panel.grid.major.y = element_blank(),
  panel.grid.minor.y = element_blank(),
  panel.grid.major.x = element_blank(),
  panel.grid.minor.x = element_blank(),## Removing the legend
  legend.position = "none",## Removing everything from the y axis
  axis.title.y     = element_blank(),
  axis.text.y      = element_blank(),## Removing title from the x axis 
  axis.title.x     = element_blank(),## Remove x & y tick marks
  axis.ticks       = element_blank())

图 6:删除元素后的图表——作者提供的图片

4。给坡度线添加标签

现在,我们的图表已经接近完成,但是如果没有图表值,它看起来还是很空。这就是为什么我们将为更多信息添加数据标签,而geom_text()属性将用于此目的。

  • 使用aes(label = "--")写入每组对应的值
  • 比如我想用风暴的名称和对应的风力来标注 2015 年每个风暴组的平均风力,就用aes(labels=paste0(status,"-",round(avg_windpower,2),"km/h"))
  • 此外,我们还可以通过控制不同的元素来定制标签的外观和位置,例如hjust, vjust, size, alpha

让我们看看添加不同的geom_text()元素后会有什么。

f2 + 
geom_text(data = mean_storm %>% filter(year == "1975"), 
aes(label = paste0(status, " - ", round(avg_windpower,2), "km/h")),   hjust = 1.1, 
fontface = "bold", 
vjust=0.25,
size = 4, 
alpha = 3) +

geom_text(data = mean_storm %>% filter(year == "2015"), aes(label = paste0(status, " - ", round(avg_windpower,2), "km/h")) , 
hjust = -0.1, 
fontface = "bold",
vjust = 0.25,
size = 4, 
alpha = 3)

图 7:典型的斜率图——作者图片

这比第一张图好多了,对吧?

但这并不是故事的结尾;请再忍耐一下,看看我们将在下一张图中遇到什么。

目标 2:用斜率图直观显示 10 年、20 年、30 年、40 年不同类型风暴的平均风力。

  1. 转换数据集以获得从 1975 年开始的 10 年、20 年、30 年和 40 年的平均风速。

好了,像往常一样,让我们从最基本的步骤开始,即获取数据框以进行可视化。

mean_storm2 <- data %>% 
  group_by(year,status) %>% 
  summarise(avg_windpower = mean(wind))df2 <- mean_storm2 %>% pivot_wider(names_from = status, values_from = avg_windpower)year <- c()
year[1] <- 1975
period <- c()while(max(year) < 2015) {
  next_year <- tail(year,1) + 10
  year <- c(year,next_year)
  }period <- c()
for (i in 1:length(year)) {
  period[i] = year[i] - year[1] 
}##Marking the period corresponding with each year (E.g: 1985 - period = 10 years)
df3 <- data.frame(year,period)df4 <- merge(x = df2, y = df3, by = "year", all.x = TRUE)df5 <- select(df4[!is.na(df4$period), ], -1)df6 <- df5 %>%
  pivot_longer(!period, names_to = "status", values_to = "avg_windpower")
df6$period <- as.character(df6$period)df7 <- subset(df6, period != '0')df7$period <- factor(df7$period, 
                            levels = c("10", "20", "30", "40"), 
                            labels = c("10 Years","20 Years","30 Years","40 Years"), 
                            ordered = TRUE)

这是我们转换后的数据框:

图 8:转换后的数据—按作者分类的图像

让我们进入第二步,这是绘制我们的斜率图。

2。画出坡度线

如前所述,我们将调整 x 标签的标题和位置,并使用geom_line()绘制草图

f2 <- ggplot(data = df7, aes(x = period, y = avg_windpower, group = status)) +
  geom_line(aes(color = status, alpha = 1), size = 2 ) +
  scale_x_discrete(position = "top") +
  theme_gray() +  ggtitle("Wind power by time") + 
  theme(plot.title = element_text(color="black", size=15, face="bold", hjust = 0.5 ))

图 9:草图——作者提供的图片

3。移除不必要的元素

与我们之前所做的类似,为了使图表更清晰,我们将从图表中删除一些元素。消除这些元素的代码与 目标 1 中的相应部分相同。 重复代码,下面是我们得到的:

图 10:删除不必要的元素——作者图片

4。给坡度线添加标签

  • 这一部分的不同之处在于,我将使用geom_label而不是geom_text.来绘制该图。实际上,这两个元素以相同的方式工作。但是,geom_label在文本周围多加一个框,给数字足够的空间,避免数字值和图形之间的重叠。
  • 此图中要使用的另一个额外元素是geom_text_repel.。该属性将有助于在线的两端获得不同组的标签,而不会使线重叠。只要一声令下,一切都变得整洁有序。

你可以看到我的图表如下:

f3 <- f2+
 geom_text_repel(data = df7 %>% filter(period == "10 Years"), 
                  aes(label = status) , 
                  hjust = "left", 
                  fontface = "bold", 
                  size = 4.2, 
                  nudge_x = -.45, 
                  direction = "y") +
 geom_text_repel(data = df7 %>% filter(period == "40 Years"), 
                  aes(label = status) , 
                  hjust = "right", 
                  fontface = "bold", 
                  size = 4.2, 
                  nudge_x = .5, 
                  direction = "y") +
 geom_label(aes(label = round(avg_windpower,2)), 
             size = 4, 
             label.padding = unit(0.05, "lines"), 
             label.size = 0.0)

图 11:最终图形——作者提供的图像

最后…

经过大量的添加和删除元素,我可以这个有趣的图表。就我个人而言,我并没有看到这种图形被普遍使用,然而学习一种新技术从来都不是多余的。希望你觉得我的文章在某些方面有帮助,感谢你一直读到最后。

我学习 ggplot 的第三天到此结束。我将从第 4 天继续我的学习之旅:统计使用图。

参考

7 机器学习操作的 DevOps 技能

原文:https://towardsdatascience.com/7-devops-skills-for-machine-learning-operations-7cf54b19adc0?source=collection_archive---------10-----------------------

从成功实施 MLOps 中吸取的经验教训

Unsplash 上的 Pietro Jeng 拍摄

DevOps 遇上机器学习

MLOps 一直是 2021 年的热门话题,许多人都在谈论它,许多公司都致力于实施它。原因很明显:MLOps 使敏捷原则能够应用于机器学习项目,这意味着更短的发布周期和更高的质量标准。

从技术的角度来看,我想说成功的 MLOps 实现的主要部分是可用的:使用容器训练和服务 ML 模型的能力,大量的数据管道编排工具,自动化测试框架,以及成熟的 DevOps 实践。

然而,拥有技术并不意味着成功。由于通常涉及的角色:数据科学家、机器学习工程师、数据工程师、开发运维工程师和管理人员,构建 MLOps 团队极具挑战性。经验表明,担任这些角色的人不一定说同一种语言,在我看来,应该有人负责将这些点连接起来。

在最近的 MLOps 项目中,我主要关注与开发运维相关的任务。作为一个团队,我们实现了我们的里程碑,我注意到 DevOps 工程师可以在许多方面提供帮助,不仅在技术问题上,而且在更好的团队合作体验方面。我不是说他们比别人更重要,绝对不是。但是,作为团队中的交叉角色,工程师可以从头到尾玩、学习和共享知识,倡导敏捷和工程最佳实践,同时交付 MLOps 的“运营”部分。

想要从事机器学习操作的 DevOps 工程师无疑会利用他们来自“常规”项目的专业知识。正如你接下来将看到的,他们也应该对学习新东西持开放态度,尤其是针对大数据、数据分析和 ML/AI 的云服务。

GitLab、Terraform 和谷歌云

我在这篇博文中分享的经验来自于用 GitLabTerraform 和 Google 云托管服务实现 MLOps,例如 BigQuery云存储顶点特征存储顶点管道顶点模型顶点端点

我们使用了 Google Cloud 关于机器学习 中 连续交付和自动化管道的博文作为参考指南。无论如何,考虑到 MLOps 是一种语言、框架、平台和基础设施不可知的实践,我希望使用其他替代方案的人也可以利用这样的经验。

七项技能

1.源代码管理

这是 DevOps 工程师的基本技能。他们应该知道 Git 的概念,比如分支、合并、重置基础以及相关的命令。此外,广泛使用的工作流,如 GitflowGitHub flow ,或者设计更适合团队源代码管理需求的定制替代方案。

2.持续集成和交付

CI/CD 知识也是 DevOps 工程师必备的工具。与其他团队成员谈论各种话题会很有帮助,包括但不限于:

  • 决定支持团队 CI/CD 需求的工具,例如代码评审支持、容器和其他工件注册,以及与第三方服务(例如,云提供商)集成的能力;
  • 以数据处理代码、ML/AI 代码、CI/CD 代码和基础设施相关代码同步但独立管理的方式组织储存库;
  • 开发适合自动化测试的代码;
  • 使代码准备好在隔离的容器上运行;
  • 将待办事项分解成小任务,在短周期内持续交付。

3.基础设施作为代码

自动化对 MLOps 至关重要。通过代码提供基础设施允许团队在开发、QA 和生产环境中轻松地复制资源。它还保留了应用于所有环境的更改的完整历史记录,使故障排除和回滚任务更加容易。

建议从 MLOps 项目的早期开始就使用基础设施代码。当处理也是手动管理的资源时,诸如 Terraform 的 IaC 工具可能变得复杂并且容易出错。

值得注意的是,MLOps 团队通常依赖托管云服务进行数据处理、存储和模型培训,这意味着在这种情况下,基础架构配置并不严格与网络或虚拟机相关,而是与存储桶、类似数据库的服务和云调度程序相关。

4.编程语言

DevOps 工程师通常负责检测容器,这些容器将运行自动化测试或由数据或机器学习工程师创建的端到端管道。虽然他们不需要深入了解他们的同行所使用的编程语言,但至少了解团队最常用的 CLI 工具(例如, Pythonpytest)以及如何管理外部依赖关系(例如, Pythonpip installrequirements.txt之间的关系)会很有帮助。这些知识将帮助 DevOps 工程师找到 CI/CD 管道中的基本错误,并自行修复它们。

构建自动化工具和脚本语言,如 MakeBash 帮助团队简化重复性任务。 Bash 是必备的,而介于好东西和必备东西之间,适合那些志在从事 MLOps 工作的 DevOps 工程师。

专业提示:在早期使用 Vertex Feature Store 时,我们意识到相关的 Terraform 模块是一个 WIP,缺少创建一些资源的能力。我们的一名 DevOps 工程师需要编写一个 Python 脚本来绕过这个限制,通过 API 调用来创建资源。当使用最近发布的工具时,您的团队可能会面临类似的情况。也就是说,了解一种允许你与第三方服务交互的编程语言可能对你有利。

5.定制容器

幸运的是,人们总能找到现成的容器图像。在现实世界的项目中,我们通常需要构建适合特定用例的定制图像(我在以前的博客文章中写过这个)。这意味着你应该理解 Docker 的概念和最佳实践。

6.管道编排

在 MLOps 上工作时有两种主要类型的管道:一种用于 CI/CD,另一种用于机器学习。CI/CD 管道是由 GitLab CIGitHub ActionsCircle CI 或类似的工具编排的,这些工具都有很好的文档,我在这里就不重复它们的文档了。

另一方面,机器学习管道可能会因项目而异。它们通常包括数据准备、模型训练、模型验证、模型部署和模型监控等步骤。不像 CI/CD 管道在 Git 事件时触发,ML 管道通常在日历的基础上触发(例如,每日调度)。顺便说一下,根据所使用的技术,每一步都可能变成一个子管道。DevOps 工程师必须了解团队如何决定协调他们的管道,以便为成功执行提供所有必要的资源。

例如,如果团队使用 Apache Airflow (包括托管版本,如 Cloud Composer天文学家),DevOps 工作可能就像触发机器学习 DAG 一样简单。在这种情况下,编排代码通常由数据工程师构建。但是如果像 Airflow 这样的编排工具不是一个选项(相信我,它会发生!),DevOps 工程师可能负责提供类似 cron 的调度程序、无服务器功能和其他旨在以适当的顺序运行机器学习步骤的部分。

7.协力

Antonio Janeski 在 Unsplash 上拍摄的照片

最后但同样重要的是,说几句团队合作的话。正如我之前提到的,DevOps 是 MLOps 团队中的交叉角色,因此 DevOps 工程师与所有其他角色都有联系。为了完成工作,他们需要与其他工程师交流,了解他们使用的编程语言、工具和服务。此外,他们需要了解 ML 管道的每一步是如何相互作用的——例如,他们共享哪些数据以及执行的顺序。

此外,请记住一些队友可能不熟悉敏捷和 DevOps 实践。

也就是说,团队合作是 DevOps 工程师的一项重要技能。为了茁壮成长,他们需要时不时地设身处地为队友着想,感同身受,记住在自动化就绪性方面不是每个人都在同一页上(尤其是在新团队中),并追求有效的沟通。

包扎

我知道,我报道过很多事情。然而,这并不意味着一个人必须掌握所有的技能。相反,为了增加 DevOps 的采用,团队成员分享他们的专业知识是很常见的。

从长远来看,DevOps 思维模式应该在所有团队成员之间共享,以获得更好的结果。此外,这种文化应该在团队中有机地传播,这样每个人都能看到更高质量标准和更短交付周期的好处。

最终,所有团队成员都要对成功实施 MLOps 负责。

感谢阅读到目前为止!

参考

  • 机器学习操作:【ml-ops.org
  • cloud.google.com/resources/mlops-whitepaper:谷歌云实践者指南 m lops——机器学习的持续交付和自动化框架

学习数据科学的 7 个有效技巧

原文:https://towardsdatascience.com/7-effective-tips-for-studying-data-science-f7adbc1fbf6?source=collection_archive---------1-----------------------

envato elementsaqrstudio 使用图像创建(经许可)。

学习技巧

以下是您在学习数据科学时需要保持一致的内容

有抱负的数据科学家面临的最大挑战之一是一致性。如果您能够持续不断地获得数据科学方面的知识和技能,您将会惊讶地发现,一两年后您会积累多少知识。

如果你想在你的学习之旅中获得成功,但却在做你一直在做的事情,那么成功是如何找到你的。为了得到不同的结果,你需要采取不同的方法。

在本文中,我们将探讨 7 个技巧,你现在就可以使用它们来有效地学习数据科学并取得一些重大进展。

1.找到你的目标

很多人都在考虑在数据科学领域开始自己的职业生涯,但并不清楚他们为什么想这么做(如果你想,恭喜你!)虽然这完全可以理解,但从长远来看,这也会给你带来灾难。

众所周知,冲绳人长寿,这背后的秘密是他们所谓的 Ikigai 中强烈的使命感。

你有没有花一点时间问问自己关于你的 Ikigai。那么 Ikigai 到底是什么?可以认为是早上让你想起床的感觉。这种感觉来自下图中总结的 4 个主要概念的交集。

Ikigai 示意图。由作者绘制

你学数据科学是因为它好玩、有趣还是一个有趣的职业?了解“为什么”有助于你思考是什么吸引你进入数据科学的世界。也许你喜欢解决问题和研究。也可能是因为你只是好奇这个世界是如何运作的,想要了解更多。问自己这些问题有助于正确看待激情。

记住这一点,把它写下来或者贴在墙上。将来,当你陷入困境或失去希望时,回到这里充电,重新振作起来,意识到你已经开始了什么!

2.设定目标和制定计划

学习数据科学的最大挑战之一是我们难以设定有效的目标。我们经常设定太多的目标,导致我们失去动力和精力。

那么,你如何准确地设定你的目标,并制定必要的计划来实现它们呢?

其实很简单。以下是您需要分两步做的事情:

  1. 在心中想到终点(目标)。
    (斯蒂芬·科维的 7 个高效人士的习惯)中的习惯 2
  2. 逆向工程,列出为了达到目标你需要知道和/或做的事情。尽可能的详细。

3.勇气

我们可能听说过卡罗尔·德韦克提出的成长心态,以及培养这种心态如何帮助我们以开放的心态迎接即将到来的挑战,以及在智力和身体上的成长。另一个重要的概念是勇气。

生活总会投出曲线球。你无法提前知道哪些会来,哪些会错过。但是你可以把你的努力集中在重要的事情上,并培养反弹的技能和韧性。

心理学家、《T2》T3《勇气:激情和毅力的力量 T5》的畅销书作者安吉拉·杜克沃斯发现,激情和毅力(她称之为勇气)的结合是成功人士成功的原因。

我们很多人都知道不断学习新东西有多难。尽管困难重重,有坚持下去的意愿是至关重要的。这也有助于对生活采取积极的态度。当事情没有按预期进行或者遇到挫折时,往往很容易放弃。你需要勇气和动力的结合,让你在一段时间内朝着正确的方向前进。动机会让你在开始学习数据科学的旅程时充满热情,但毅力和习惯可以帮助你长期保持努力。旅途会有起有落,你只需要坚持下去。因此,成为像 66 天数据这样的社区的一部分可能会帮助你有更大的归属感,因为你并不孤单,而是有成百上千的其他有抱负的数据科学家在奋斗、成长和繁荣。

4.习惯

精通数据科学不是一蹴而就的。这是一个包括培养良好习惯的过程。

“动力是你开始的动力。习惯是让你坚持下去的东西。”

—吉米·罗恩

根据《原子习惯》的作者 James Clear 的说法,你真正需要做的是开始创造好习惯,通过使明显吸引人容易满足来解决由暗示渴望反应奖励组成的关键因素。这些因素的倒置会让你打破坏习惯,也就是说,让它变得看不见、没有吸引力、困难和不令人满意。我在下面的图表中总结了这一点,我强烈推荐阅读原子习惯以获得更深入的报道。

5.一致性

学习中的一致性是一项具有挑战性,但却是必要的技能。鉴于数据科学领域的广阔性,学习数据科学需要毅力(要学的东西实在太多了)。

5.1.把任务分成小块

学习数据科学不一定是一项包罗万象的任务。你可以把学习分解成小单元。从小处着手,你可以积累你的知识。每一天,你都离成为更好的自己更近了一步。你可能从一个简单的项目或分析开始,然后发展到更广泛的东西。

5.2.公共问责

如果你在学习过程中难以保持一致,Ken Jee 可能会给你答案。Ken 是我的好朋友,也是杰出的数据科学专家。他发起了 66 天数据倡议,旨在帮助你实现一致性。

要参与 66 天的数据 倡议,你只需要做以下事情:

  1. 每天至少花 5 分钟学习或研究数据科学
  2. 跟踪你的进展,反思什么有效,什么无效
  3. 在 Twitter 或 LinkedIn 上公开分享你的学习进展

听起来很简单?这就是目标。正如你会注意到的,这个计划通过使学习尽可能简单来帮助你建立一个持续学习的习惯。分享您的进步所带来的公共责任也将有助于您在与数据社区中同样参与挑战的志同道合者一起学习的同时,积极参与并拥有一种期待的使命感。

6.关注过程

专注于这个过程有助于让你远离所有可能阻碍你前进的消极想法和焦虑。通过专注于当前时刻和实际完成工作(例如,进行实际的阅读,进行编码练习和项目等)。)你正在获得动力。当你越来越关注这个过程时,你就在寻找提高生产力的方法。你在思考:

我如何提高模型的性能?

代码如何运行更高效,计算时间更少?

寻找解决方案并解决这些问题有助于你更有效率地投入到学习之旅中。当你快乐地学习时,学习就不会感觉像是一件苦差事,而是你日复一日期待去做的事情。

“当你爱上过程,而不是产品时,你不必等待就能获得快乐,你可以在系统运行的任何时候感到满意”

—《原子习惯》的作者詹姆斯·克莱尔

参与挑战的好处是,比如 66 天的数据或 100 天的代码,它让你专注于这个过程。为什么这是因为公众的责任感,你把你每天的进步公布给整个社区看。

假设您丢失了帖子,社区中的其他人可能想知道发生了什么,或者您不想让其他人失望。因此,你每天都在努力进步,这样你就能成功应对挑战。

7.使用工具让你保持专注和有条理

7.1.番茄工作法

按照番茄工作法学习是一个很好的方法,可以帮助你有效地学习。

这个想法很简单:

  1. 紧张学习 25 分钟
  2. 休息 5 分钟进行伸展和放松,以便在开始其他回合之前进行充电。

这种方法的好处在于,时间限制有助于消除拖延,因为你将整个 25 分钟的时间用于研究、编码或处理数据项目。

这种深度工作如果加上排除干扰,比如把手机放在看不见的地方,可能有助于提高生产率。

7.2.生产力工具

观念 是一个伟大而免费的生产力工具,你可以用它来跟踪你的进展(66 天数据的第 2 步),同时记笔记来反思哪些有效(然后加倍努力)哪些无效。

下面你会发现一个概念模板的例子,你可以用它来记录你的学习进度。

Ken Jee 的#66DaysOfData 概念模板

您甚至可以增强模板并对其进行定制,以包括您在数据科学学习过程中使用的最喜爱资源的链接,例如可用计算资源的链接(例如 Google Colab、Kaggle 等)。)、API 文档、在线教程(如真实 Python机器学习大师GeeksforGeeks 等。),小抄等。记住让事情变得简单以便培养一个新习惯。

结论

进入数据科学可能是一项艰巨的任务,但有了正确的心态和正确的习惯,您就可以克服这些障碍并取得成功。不要认为学习数据科学是一个短期目标,所以不要担心你现在在哪里。今天你可能在努力跟上,但坚持下去,你会在 6 个月或一年后惊讶于你现在的位置。把这个学习之旅想象成一场马拉松,日复一日,循序渐进。你能行的!

公开

  • 作为亚马逊的合作伙伴和 Kite 的会员,我可能会从合格的购买中获利,这将有助于未来内容的创作。

接下来读这些

✉️ 订阅我的邮件列表,获取我在数据科学方面的最佳更新(偶尔还有免费内容)!

关于我

我是泰国一所研究型大学的生物信息学副教授和数据挖掘和生物医学信息学负责人。在我下班后的时间里,我是一名 YouTuber(又名数据教授)制作关于数据科学的在线视频。在我做的所有教程视频中,我也在 GitHub 上分享 Jupyter 笔记本(数据教授 GitHub 页面)。

https://www.youtube.com/dataprofessor

在社交网络上与我联系

✅YouTube:http://youtube.com/dataprofessor/
♇网站:http://dataprofessor.org/(在建)
♇LinkedIn:https://www.linkedin.com/company/dataprofessor/
♇Twitter:https://twitter.com/thedataprof/
♇Facebook:http://facebook.com/dataprofessor/
♇github:https://github.com/dataprofessor/
ϝinsta

加速核心 Python 程序的 7 种令人尴尬的简单方法

原文:https://towardsdatascience.com/7-embarrassingly-easy-ways-to-speed-up-your-python-program-88911b9192c1?source=collection_archive---------13-----------------------

来源: Unsplash

小窍门

谁说没有‘免费的午餐’;)

动机
那又怎样,谁在乎呢?
规则优化
Python 的流行度
代码示例
实例化列表
过滤列表
检查还是抛出异常?
成员资格检查
def vs . lambda
唯一值
检查条件
结论
备选方案
优化级别
其他关注点
结论

动机

最近,我意识到我有太多的故事要开始,却没有计划去完成:令人尴尬的大量工作正在进行中!

作为回应,我试图清理、组织并找出哪些部分有潜力。在即将到来的所有最佳候选中,有两个虽然不在最前面,但无疑是很好的主题:(1)一个加快代码速度的核心 python 技巧列表,以及(2)一篇关于优化基础的哲学文章。最初,重叠是最小的。然而,经过一点调整和合并后,我将向您介绍以下内容:一篇包含 Python 技巧列表的文章,从哲学角度阐述了加速代码的概念。

对于那些只对技巧列表感兴趣,而不是围绕它的故事,点击这里向前跳。

那又怎样,谁在乎呢?

那又怎样,谁在乎呢?在确定交付特定成本的价值时,一个问题应该是头脑风暴的首要问题。换句话说,如果什么的无足轻重,什么不存在,那又何必呢。因此,在意义风险与回报的共同困境中,权衡回报方面的一个简单机制是:无论如何,因为更多的细节取决于它的博客帖子——自我提醒;)

这个博客的目的是分享一些代码片段,以及运行时,作为暗示最佳性能的手段,如果遵循。具体来说,我在表演中最喜欢的五个 Python 特有的技巧和诀窍。

对于那些感兴趣的人,我们将首先回顾一些基本的概念和一个通用的方法,当你打算加速你的代码库的时候。接下来,我们将在趋势线处达到顶峰,以描述掌握 Python 的价值:如果没有其他原因,它已经成为更受欢迎的语言之一,它只会继续扩展其功能和范围,同时通过忠实的消费者基础和开源标准保持其基础。为此,我们将使用 Google Trends 做一个简单的近似分析。

除了引言(即动机)部分的其余部分,我们还将讨论这些技术。最后,我们以讨论和相关资源列表结束。评论不仅受到鼓励,而且总是受到高度赞赏。提前感谢,希望大家喜欢,觉得有帮助!

最优化规则

在东北大学的计算机科学学院任教

优化有三个规则。

  1. 暂时不要
  2. 轮廓

①百分之九十的时间;有人认为一段代码需要优化,但事实并非如此。通常,需要其他解决方案来解决速度问题(例如,更好的硬件)。换句话说,优化代码是有成本的:优化所花费的时间成本,以及重构时代码中断所产生的工作量。此外,优化后的代码可读性可能更差,因此不再可维护(也就是说,这是一种与 Pythonic 思想相悖的权衡)。另一个副产品可能是内存使用的增加,这可能会带来一系列问题:是的,有可能使用传统的优化技术优化一些代码,但后来发现由于内存消耗的增加而导致的时间成本并没有加快速度。因此,除非你加速是必要的,不要,至少,直到所有其他选择都用尽(例如,硬件升级,移植到另一种语言,等等)。).

…还没有 (2)确保你的代码能够工作,至少有 85%的测试覆盖率。一旦代码是端到端的,就可以对它进行改进,这样就可以进行比较,以确保不会出错。因此,不要…还不要,直到代码完全完成并且不同的组件都经过了良好的测试,因为改进只是相对而言的。或许,把这个概念重新定义为一个问题会让你明白这一点。如果一开始就没有绝对的产品,那怎么能改进呢?

简介 (3)勿猜!首先, Profile 代码用来表征代码各部分的性能。然后,观察占用最多时间的代码片段,并将所有精力集中在那里。这不仅浪费了时间,而且还增加了在代码中引入问题的可能性,换来的是微不足道的速度提升。许多年前,作为一名大学生,在这个项目的早期,我在东北大学的电气&计算机工程系担任研究助理。具体来说,作为光学科学实验室的一员,与 NUCAR 合作。我的第一个任务的问题陈述是通过任何可能的方式来加速现有代码-解决方案包括从本地 CPU 上的多线程到将工作负载分割为计算集群中几十个节点上的独立作业处理,再到 NVIDIA GPU 上每个内核上数千个线程的并行处理。不管方法论如何,我很早就被教导永远不要盲目优化;始终剖析首先,了解代码中的瓶颈在哪里,然后针对那些特定的代码片段,以获得与最初运行速率相关的端到端加速。要点是,在没有首先测量绝对时间和总花费时间(即,如果一段代码被调用多次),以及用整个程序测量所花费的时间百分比的情况下,不要为了加速而重构代码。

关于上面的每一条规则都可以说很多。文章末尾列出了几个相关资源。现在,让我们简单地看一下这些年来 Python 的发展趋势。

Python 的流行

这一部分是通过截图讲述的,每个截图都通过下面的标题描述。

根据 Google Trends ,这里绘制的是公众对不同软件编程语言的兴趣(2004 年至今)。需要注意的是,Google Trends 限制我的账户只能同时比较不超过五个搜索查询。此外,选择在软件平台中与 Python 进行比较仅仅是基于我的第一直觉,除了 Python 之外,没有任何技术推理:事实上,这是一个冲动的选择,因为这里的动机不是与他人进行比较,而是提供相对曲线进行比较(例如,Python(蓝色)曲线单独看起来更好,因为它应该是正变化率的高增长。尽管如此,其他曲线提供了各种竞争对手的视图,因为作为时间函数的平均值真实地反映了 Python 的流行程度达到今天的一致性。我们接下来分析两个关键点:Python 第一次处于其他之上的点和它今天所处的点。然后,我们看到自 2004 年以来的平均值在过去几年中是如何持续增长的。

Python 自 2017 年 6 月首次领先(左)以来一直是顶级趋势;前一个月(即 2017 年 5 月),Python 和 JAVA 并列 21 个兴趣点。如今,Python 仍然是最流行的编程语言(右图)。

2004 年以来的平均值测量到 2021 年 8 月至今(左),7 年前从 2014 年至今(中),3 年前(2018 年)至今(右)。同样的配色在剧情中使用,Python 用蓝色,C++用红色,JAVA 用黄色,Go 用绿色,R 用紫色。请注意,从最近几年的平均值来看,对 Python 的平均兴趣呈上升趋势。直到 2014 年,人们对 Python 的兴趣才开始超过其他人的平均水平。

代码示例

你们期待已久的部分。让我们一次回顾一种技术:没有使用特定的顺序,但是始终遵循相同的表示惯例和度量代码的方法。

实例化列表

可能是最简单的一个,所以我想先列出来。如何给空列表赋值?你认为速度重要吗?让我们来看两种标准的方法。

https://towards data science . com/pandas-tips-tricks-need-for-speed-54e 217 cc 6 aa 0

(a)的记录时间为 0.8760 纳秒,( b)的记录时间为 0.4020 纳秒。这是 2.2 倍的加速!

不,这不是玩笑!是的,这也适用于其他容器(即dict{}set())。

过滤列表

以上三种方法实现了相同的结果:for 循环、函数式编程(即过滤器和 Lamba 表达式)和列表理解。下面是以毫秒为单位的运行时间:分别为 91.7118、55.3179 和 34.4341。每种方法都将前一种方法的时间缩短了一半。此外,随着样本数量的增加,这一比例呈指数增长。

检查还是抛出异常?

条件语句(即情况 1)花费了 150 纳秒,而请求原谅(即情况 2)仅花费了 43 纳秒,这是对最小代码更改的小加速(即快 3.5 倍)。

此外,问题还会扩大。举个例子,

成员资格检查

接下来,考虑在两种情况下检查列表中的值:(1)当值在列表容器的前面时,以及(2)当值接近末尾时。

前者耗时 0.0598 毫秒,后者耗时 7.7705 毫秒:前者比后者快了 130 倍。

因此,如果事先知道感兴趣的值,也许可以相应地设置容器。否则,考虑一个具有线性查找速度的容器,比如一个字典集合,它不保持顺序。

Def 与 Lambda

两者中哪个更快。按照下面的说法,答案是lambda

运行时间:(a) 1.24 纳秒和(b) 0.92 纳秒。差别很小(例如,大约 1.34 倍的加速),但实际上,用更少的时间就能实现相同的功能。

注意,这个博客的目的是分享关于运行时的项目。因此,函数 def 与 lambda 的主题要比这广泛得多。对于有兴趣了解更多信息的人,请查看下面的资源列表。

独特的价值观

当我看到 Python 中这样做时,我感到很惊讶,但这似乎比它应该做的更多。因此,值得一提。

当涉及到在列表中查找唯一值时,您应该做的最后一件事是通过for loop来确定。而是转换成只允许唯一值的容器类型(即set)。

这里的时间几乎是无与伦比的:389 毫秒的先验;323 纳秒。这大约是 1,206 倍的加速。另外,它提高了可读性。如果需要对象是列表呢?简单,通过list(set(tmp))set投回一个list

检查条件

首先,让我们看看如何检查一个列表是否为空。

运行时间:(a) 1.3870 纳秒,(b) 0.7860 纳秒,以及(c) 0.3210 纳秒。与 a →b 和 a →c 相比,速度分别提高了 1.8 倍和 4.3 倍。

接下来,另一个常见任务:检查变量是否被设置True

同样,比较 a →b 和 a →c,我们分别获得了 1.49 倍和 1.57 倍的加速比。

最后,让我们看看以False值为条件的if语句。

奇怪的是,尽管(b)和(c)相对于(a)都有加速,但(b)现在似乎是最快的,这与我几年前第一次写这个脚本时的情况不同。如果有人知道这是为什么,请分享:)

现在 a →b 和 a →c 分别有 1.80x 和 1.33x 的加速。

结论

可供选择的事物

有许多优化级别:我的意图不是忽略任何级别,因为所有级别都有其重要的用例。然而,为了将博客集中在一个特定的主题上,避免太多跨越其他优化方法和类型的话题是很重要的。为了完整起见,这里有几个荣誉提及。我希望接下来的段落提供了许多子主题,以便那些有兴趣了解更多信息的人进一步注意和研究。此外,相关资源中列出的参考资料也在最后提供。

让我们假设硬件成本限制了只能选择基于软件的解决方案(即,假设缺乏资金来购买更好、更新的最先进的芯片)。除了重构现有的 Python 代码或集成 Cython 等技术之外,Cython 是使用 C++ (即 Makebuild )编译 Python 代码的几种方法之一。Python 在期间工作的可中断性以及https://towards data science . com/pandas-tips-tricks-need-for-speed-54e 217 cc 6 aa 0导致运行时变慢的原因得到了缓解。然而,我们可以改进算法和数据结构。例如,让我们看一个简单的问题:计算运行总和。对于那些不熟悉的人来说,运行总和是所有数字的总和,包括一些变量 N 。所以,如果 N=5 ,那么的运行总和就是 5+4+3+2+1+0=15。没有必要添加 0,就像不添加第 N 个的值一样,因为 Python 索引从 0 开始,到第 N-1 个结束。首先,我们来看一个非 Pythonic 解决方案。

打印:50000005000000

打印:50000005000000

可以肯定的是:

现在让我们看看时机:

838.8276 毫秒对 129.4565 毫秒

通过使用内置核心功能,速度相差 146.521%。

Python 有各种各样的内置函数。以下是列表:即使你知道一些,也要确保全部知道:

内置函数:来源

测量容器的长度也是如此:

运行时间:596.0143 毫秒

运行时间:0.0033 毫秒

199.998%的速度差异(即从前者提升到后者)。

在这两种情况下,使用内置函数可以显著提高代码速度,这只会随着数据量的增加而增加。此外,不使用内置函数的代码片段缺乏可读性。因此,如果它存在,那就使用它!

另一种方法是移植构成瓶颈语言的代码片段,如 CC++ 。让我们不要忘记我们是如何走到这一步的:硬件升级的未满足成本。考虑到时间就是金钱,估计一下用低级语言实现代码所需要的时间。此外,考虑构建项目以使其在端到端的执行中保持内聚性所需的时间。换句话说,基于多个框架的项目永远是最后的手段:如果 Python 项目的内容仍然是基于 Python 的(即,不要通篇使用 C++ 或任何其他语言的片段),那么 Python 项目是最好的维护方式。如果上述成本超过了决策阈值,那么对于 SW 来说,首先用高级语言(例如 Python)实现作为原理验证 (POC)然后用低级语言实现是很常见的,这是因为考虑到速度、部署(例如移动平台)以及其他促使人们将 Python 代码库转换为另一种语言的因素。最终,成本可能会很高,所以只要看起来值得,这就是一种约定俗成的工作流程。

优化级别

如前一节所述,改进算法可以提高代码质量(在时间和可读性方面)。下面列出了代码库可以优化的各个级别:

  • 算法和数据结构
  • 源代码和软件模式
  • 建筑和设计
  • 构建级别
  • 编译时(核心 Python 不编译,但大多数平台都编译)
  • 运行时间

其他问题

优化不仅仅包括加速。还必须考虑以下因素,这些因素也可能是感兴趣的项目。

  • 记忆
  • 储存;储备
  • 磁盘空间
  • 输入输出操作
  • 网络输入输出
  • 用电量
  • 更多…

结论

这里给出了五个提高 Python 程序速度的技巧。这些建议是有意简单的,除了把它们变成习惯之外,只需要很少的工作。加速 Python 的问题是由考虑优化的基本规则、Python 的日益流行、获得加速的替代方法,以及最后,当优化代码不总是与速度有关时,相关子主题的列表所激发的。无论如何,我希望实际计时分享和支持的简单技巧和提示对您和您未来的 Python 程序有所帮助。编码快乐!

相关资源

Joseph RobinsonVicarious Surgical Inc.高级传感、数据和人工智能 (ASDAI)部门的人工智能工程师——下一代手术机器人!正如各种方式所示,我相信人工智能组件对于未来的世界以及我们生活和互动的方式至关重要。在 LinkedIn 上跟我连线,提到这个故事。

用于研究的 7 个基本 Python 技能

原文:https://towardsdatascience.com/7-essential-python-skills-for-research-496e1888e7c2?source=collection_archive---------7-----------------------

提示和技巧

来自博士生的提示和技巧

凯特琳·贝克Unsplash 上拍摄的照片

你做涉及编码的研究吗?许多科学领域的研究,从神经科学到机器学习到经济学,现在至少需要一些编写代码和分析数据的能力。在编码时,如果不小心,研究人员可能会遇到代码可读性、可再现性和生产率的问题。我是麻省理工学院的一名博士生,之前在科技行业和教育领域有工作经验。为了我的研究,我每天都用 Python 编写代码,通过大量的试验和错误,我已经学会了一些重要的“要做”和“不要做”。这个列表上的每一件事都是我希望能够回去告诉年轻的自己更快掌握的东西,我保证学习这些技能是值得花时间和精力的。其中一些技巧也是语言不可知的,所以即使 Python 不是你的首选,也要继续阅读。这绝对不是一个完整的列表,欢迎在评论中添加自己的推荐!

1.了解基础数据科学库

了解正确的库可能是绝望地盯着电子表格和从数据集中快速获得洞察力和可视化的区别。许多人没有意识到有一些经过时间考验的库,它们允许您加载数据集,分析它们的描述性统计数据,应用过滤器,并且只需几行代码就可以生成有意义的可视化效果。以下内容特别有用:

本帖包含了一个很棒的资源列表,可以学习更多关于各种数据科学基础的知识。我还有一篇关于使用 Pandas 和 Plotly 进行数据可视化的文章:

这些数据科学库的伟大之处在于,它们拥有优秀的示例文档,以及大量免费的在线教程。以下是以视频形式对 NumPy 的精彩介绍:https://www.youtube.com/watch?v=lXZk0g60qRg。以下是一个很棒的关于熊猫的视频系列:https://www.youtube.com/watch?v=ZyhVh-qRZPA&list = PL-osie 80 tetswmv 9 I 9 c 58 MDD csskifdds

2.掌握命令行

无论您是连接远程集群、导航您自己的文件系统,还是运行脚本,在某些时候您可能必须与命令行交互。您应该知道基本的 Linux shell 命令,如ls(列出目录中的文件)、cd(更改目录)、mkdir(创建目录)、rm(删除文件)、wc(计算行数、字数和字节数)、mv(移动文件)、cp(复制文件)、grep(快速搜索文件中的模式)、head(查看文件的第一个块)和ssh(安全连接到远程设备)。了解一些更特殊的命令也很有帮助,比如ln创建符号链接,而scp向/从远程服务器传输文件。请注意,这些命令在 Mac OS 和 Linux 上是相同的。没有必要记住每一个命令(虽然如果你忘记了一个命令是做什么的话,man命令是非常有用的),但是上面提到的那些确实可以走很长的路。了解如何创建一个简单的 shell 脚本来一次运行一堆任务,以及如何使用cron来调度作业也很有帮助。以下教程是一个很好的起点:

https://ubuntu.com/tutorials/command-line-for-beginners#3-opening-a-terminal

3.学习git和 GitHub

最长的一段时间,我对git有过表层的了解,但从未真正深入挖掘。我用 GitHub 上传代码文件并与合作者分享,但我把它当成一个带有语法高亮的 Google Drive。在一次编码实习中,我真的更好地理解了git,这极大地改善了我的工作流程。

在我的研究中,我经常需要使用ssh在远程服务器上执行长时间运行或计算密集型的任务。然而,我也喜欢在我的个人机器上直接编码的体验。使用git和 GitHub,我只需敲几下键盘就能让我的个人电脑与我的远程服务器保持同步。我总是可以回溯到以前提交的代码版本,所以我不必担心意外删除或弄乱我的代码。另一个有用的工作流是创建一个特性分支来试验一个想法,并且只有当这个想法成功时才将其合并回主分支。

下面的 YouTube 教程是学习掌握 git 的一个很好的起点:

请记住,git 中有很多功能,您可能需要一段时间才能掌握它。对自己要有耐心,记住最好的学习方法是通过做,而不仅仅是被动地看。重点学习以下 git 命令的含义和用法:git initgit clonegit addgit commitgit pushgit pullgit branchgit checkoutgit merge

除了提高你自己的生产力,git也使协作变得更加容易。协作者可以克隆您的存储库,进行更改,将它们推送到一个新的分支,并打开一个 pull 请求供您审阅这些更改。本着开放科学和可复制性的精神,如今许多发表的论文都会包含一个带有研究人员代码的 GitHub repo 的链接,如果你使用 GitHub 来跟踪你自己的工作,那么当需要与更广泛的科学界分享你的工作时,这一步的大部分已经为你完成了。

3.使用代码格式化程序

什么是代码格式化程序?这是一个自动格式化代码的程序,它会处理好从逗号后的空格、换行符到 Python 字典和 JSON 等数据结构的易读显示等一切。你可以花更少的精力去担心一行中应该包含多少列表项,而把更多的精力放在实际解决问题和思考代码上。

我推荐[black](https://black.readthedocs.io/en/stable/)。我在 IDE (Visual Studio 代码)中设置了black,以便在每次保存时自动格式化我的代码。下面的例子展示了一些 Python 代码在应用自动格式化前后的样子。请注意,代码格式化程序会将长行分解成可读性更好的块。有些人可能不喜欢这样,尤其是如果他们真的喜欢将大量代码压缩到一行中。但是自动格式化程序使代码对其他人和您未来的自己来说更具可读性。自动格式化程序消除了编码体验中不必要的自由度,允许采用不同方法的编码人员共享更加一致的风格。《T2》的变化更可能反映实际内容,而不是风格。

4.组织和标准化您的文件系统

这似乎是一个相当琐碎的建议,但是在一个长项目中,跟踪不同的数据集、输出文件、可视化、脚本、Jupyter 笔记本等确实变得很困难。等。

对目录和文件夹使用标准化的命名约定。可以使用 Python 的datetime库来获取当前日期,以自动给程序输出文件(如日志或图像)添加时间戳。这可以避免您的程序用相同的名称覆盖以前的输出。试着把你的数据放在一个文件夹里,你的源文件放在另一个文件夹里,你的工件(比如可视化和绘图)放在另一个文件夹里。

from datetime import datetimetimestamp = datetime.now().strftime("%Y-%m-%d")filename = f"outputfile-{timestamp}.txt"

当将数据文件加载到您的程序中时,您可以使用glob库轻松地检索匹配某个字符串模式的文件,并且您可以使用os.path.exists()来检查文件是否存在。

import glob# returns a list of all files matching the pattern
list_of_files = glob.glob("outputfile-2021-10-*.txt")

5.使用笔记本探索和完整的实验程序

首先,我喜欢 Jupyter 实验室和 Jupyter 笔记本电脑。它们是加载数据集、执行清理和探索性数据分析(EDA)以及测试代码片段和功能的便捷方式。也就是说,做任何事情都有时间和地点,我对使用 Jupyter 做任何事情有一些问题。

首先,Jupyter 笔记本的输出将取决于你运行单元格的顺序。这可能会导致变量没有您期望的值的问题。Jupyter 笔记本也可能有点难以共享,如果您试图在输出单元格的海洋中找到某一位代码,那么真正长的笔记本可能会导致可读性噩梦。

一旦你在笔记本上完成了探索,我建议你将笔记本上的代码重构为一个完整的程序。使用if __name__ == "__main__":语法运行你的代码,并将大部分代码分解成内聚的函数。考虑留出一段时间,也许一周一次,当你查看你所有的笔记本和各种各样的脚本,并把它们重构为一个写得很好、评论很好、有凝聚力的程序。

6.使用命令行参数增强再现性

做研究经常涉及到处调整模型,直到你得到有趣的结果。我以前的做法是编辑代码文件,直接在代码中更改参数,然后再次运行。不幸的是,经常发生的情况是,你用一堆不同的设置运行代码,其中一个输出是有趣的,但是你不记得你调整了什么来得到那个输出。

相反,通常更好的做法是将任何运行时参数作为命令行参数提取出来,然后创建 shell 脚本,用不同的参数运行相同的代码。我使用[argparse](https://docs.python.org/3/library/argparse.html) Python 库来做这件事。这个库使得设置命令行参数变得容易,包括指定默认值、数据类型和标志参数。下面的代码片段显示了一个简单的程序示例,它读入 3 个命令行参数,并使用它们来读取一个文件,并有选择地打印一些行。

对于上面的程序,您可以创建一个如下所示的 shell 脚本,并使用某些参数来运行它:

#!/bin/bashpython argparse_example.py --inputfile datafile.csv --num_rows 100 --print_output

这使得记录你的工作变得更容易,让你确切地知道你为了得到不同的结果做了什么。实际的代码可以保持不变,并且您可以轻松地在 shell 脚本中为您想要尝试的每组参数添加新的一行。

7.创建一个实用程序类,为整个项目提供有用的功能

您的项目最终可能会有许多不同的程序,包括实验脚本、数据清理脚本、可视化脚本等等。许多这样的程序可能会重复使用相同的代码。我喜欢创建一个我的整个项目都可以访问的utils.py类,并将共享函数放在里面。例如,如果在我的整个项目中使用了名为load_dataset()clean_dataset()的函数,我可以将它们放在utils.py中,其他程序可以用以下方式调用它们:

import utilsdata = utils.load_dataset("data.csv")
data = utils.clean_dataset(data)

很明显,这不是分离共享代码的唯一方法,也不是最适合您的用例的方法。但是在许多中小型研究项目中,这可能足以让您省去许多头痛的事情。数据集处理、预处理或绘图等重复任务可以抽象到一个文件中,很容易进行更改。您肯定不希望在多个文件中复制相同的代码,然后在更新一个版本但忘记更新另一个版本时遇到神秘的不一致。

结论

我希望你喜欢这些建议!完成研究的很大一部分是优化你的工作流程,消除生产力障碍。学习这些技能需要时间,但从长远来看,可以为你节省更多的时间和精力,并且肯定会在你的学术旅程中帮助你。如果您有其他建议,请在下面留下评论!

使用 Python Seaborn 掌握线图的 7 个示例

原文:https://towardsdatascience.com/7-examples-to-master-line-plots-with-python-seaborn-42d8aaa383a9?source=collection_archive---------3-----------------------

实用数据可视化指南。

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

数据可视化是数据科学不可或缺的一部分。它帮助我们探索数据集和变量之间的关系,以创建适当的数据可视化。它们也是交付结果和发现的高效工具。

有几种不同类型的数据可视化。其中最常用的是线图,用于分析两个连续变量之间的关系。

在本文中,我们将通过 7 个例子来详细解释如何使用 Python 的 Seaborn 库创建线图。

线形图的主要用例是时间序列分析。它显示了变量的值是如何随时间变化的。例如,我们可以使用线图来显示一段时间内的股票价格。

让我们从获取一些股票价格数据开始。我们将使用熊猫 datareader 库来获取数据。第一步是导入库。

import pandas as pd
from pandas_datareader import dataimport seaborn as sns
sns.set(style="darkgrid")

下面的代码片段收集了苹果、微软、谷歌和 Moderna 在给定的开始和结束日期之间的股票价格。日期、收盘价、成交量和股票名称保存在股票数据框中。

start = '2020-1-1'
end = '2021-6-30'
source = 'yahoo'
stocks = pd.DataFrame(columns=["Date","Close","Volume","Stock"])stock_list = ["AAPL","IBM","MSFT","MRNA"]for stock in stock_list:
    df = data.DataReader(stock, start=start ,end=end, 
                         data_source=source).reset_index()
    df["Stock"] = stock
    df = df[["Date","Close","Volume","Stock"]]
    stocks = pd.concat([stocks, df], ignore_index=True)stocks.head()

股票数据框(图片由作者提供)

示例 1

在第一个例子中,我们创建了一条显示苹果公司每日股票价格的线。我们可以使用 Seaborn 的 relplot 或 lineplot 函数。

relplot 函数是一个图形级界面,用于绘制关系图,包括线图和散点图。线图功能也可用于绘制线图。

sns.relplot(
    data=stocks[stocks.Stock == "AAPL"], 
    x="Date", y="Close", 
    kind="line"
)

数据框的名称被传递给数据参数。因为我们只想查看苹果股票价格,所以我们应该使用股票名称来过滤数据点。x 和 y 参数用于选择要在 x 和 y 轴上绘制的内容。最后,使用 kind 参数确定绘图的类型。以下是这段代码返回的图形:

(图片由作者提供)

如果我们把它弄得宽一点,它肯定会看起来更好,因为日期看不清。

示例 2

在本例中,我们将了解如何调整绘图的大小。relplot 函数有两个参数可用于更新默认绘图大小。

高度参数改变绘图的高度。纵横比参数调整宽度与高度的比率。

sns.relplot(
    data=stocks[stocks.Stock == "AAPL"], 
    x="Date", y="Close",
    kind="line",
    height=5, aspect=2 
)

(图片由作者提供)

现在看起来好多了。

示例 3

在这个例子中,我们将探索色调参数。原始数据框包含同一时间段内 4 家不同公司的股票价格。我们可能需要在相同的可视化中绘制它们,以便进行比较。我们可以通过将包含股票名称的列名传递给 hue 参数来实现这一点。

sns.relplot(
    data=stocks, 
    x="Date", y="Close", hue="Stock", 
    height=5, aspect=2, 
    kind="line"
)

(图片由作者提供)

我们观察到,由于新冠肺炎疫苗接种,现代股票价格大幅上涨。

实例 4

在这个例子中,我们将对外观进行一些修改。例如,我们可以增加轴标题和图例的字体大小。另一个修改可以是在线的调色板上。

sns.set(font_scale=1.5)sns.relplot(
    data=stocks, 
    x="Date", y="Close", hue="Stock", 
    height=5, aspect=2.4, 
    kind="line",
    palette="cool"
)

(图片由作者提供)

调色板参数有许多选项。如果您不确定调色板的名称或尝试不同的名称,请键入错误的名称。在错误消息中,您将看到所有选项:)

实例 5

让我们也为我们的情节添加一个标题,使它看起来更好。

sns.relplot(
    data=stocks, 
    x="Date", y="Close", hue="Stock",
    height=5, aspect=2.4, 
    kind="line"
).set(title="Stock Prices")

(图片由作者提供)

实例 6

我们也可以像修改标题一样修改坐标轴标签。例如,将 y 轴更改为“收盘价”可能会提供更多信息。很明显,x 轴代表日期,所以我们实际上不需要它的标签。

sns.relplot(
    data=stocks, 
    x="Date", y="Close", hue="Stock",
    height=5, aspect=2.4, 
    kind="line"
).set(
    title="Stock Prices", 
    ylabel="Closing Price",
    xlabel=None
)

(图片由作者提供)

例 7

relplot 函数还允许在单个可视化中创建子图。例如,我们可以为每只股票创建一个线图。row 和 col 参数可以用来完成这项任务。

sns.relplot(
    data=stocks, x="Date", y="Close", 
    row="Stock",
    height=3, aspect=3.5,
    kind="line"
)

(图片由作者提供)

col 参数非常类似。它为每个图创建一个新列。因为宽度比高度大,所以行更适合我们的情况。

结论

relplot 函数为创建关系图提供了一种简单而直观的方法。修改绘图的某些特性也很容易,比如字体大小、标题、轴标签等等。

我们在本文中介绍的内容应该足以满足您的大部分需求。但是,如果需要做更具体的操作,可以随时访问官方文档。

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

掌握 SQL 连接的 7 个示例

原文:https://towardsdatascience.com/7-examples-to-master-sql-joins-9d16636a3bb7?source=collection_archive---------9-----------------------

综合实践指南

Unsplash 上拍摄的 Mineragua 苏打水

SQL 是大多数关系数据库管理系统(RDBMS)用来管理以表格形式存储的数据的编程语言。关系数据库由多个相互关联的表组成。表之间的关系由共享列构成。

当我们从关系数据库中检索数据时,所需的数据通常分布在多个表中。在这种情况下,我们使用 SQL 连接来处理包括从两个或更多相关表中选择行的任务。

为了在从不同的表中选择行时保持一致,SQL 连接使用共享列。在本文中,我们将通过 7 个例子来演示如何使用 SQL 连接从多个表中检索数据。

我准备了两张表格,上面有编造的数据。第一个是 customer 表,它包含零售企业的客户信息。

客户表(图片由作者提供)

第二个是 orders 表,包含这些客户所下订单的信息。

订单表(作者图片)

这两个表通过 cust_id 列相互关联。

:关系数据库管理系统有很多,比如 MySQL、SQL Server、SQLite 等等。尽管它们共享几乎相同的 SQL 语法,但可能会有一些小的差异。我在这篇文章中使用 MySQL。

示例 1

我们希望看到在 2020 年 1 月 17 日购买商品的顾客的平均年龄。

mysql> select avg(customer.age), orders.date
    -> from customer
    -> join orders
    -> on customer.cust_id = orders.cust_id
    -> where orders.date = '2020-01-17';+-------------------+------------+
| avg(customer.age) | date       |
+-------------------+------------+
|           32.7273 | 2020-01-17 |
+-------------------+------------+

在普通的 select 语句中,我们只写入要选择的列的名称。当我们连接表时,用表的名称指定列,以便 SQL 知道列来自哪里。

然后我们写下带有连接关键字的表的名称(例如,客户连接订单)。“on”关键字用于指示这些表是如何相关的。where 语句根据给定的条件筛选行。

示例 2

我们希望看到奥斯汀客户的平均订单量。

mysql> select avg(orders.amount)
    -> from customer
    -> join orders
    -> on customer.cust_id = orders.cust_id
    -> where customer.location = "Austin";+--------------------+
| avg(orders.amount) |
+--------------------+
|          50.572629 |
+--------------------+

逻辑是一样的。您可能已经注意到了第二个和第一个示例之间的一个小差异。在第二个示例中,我们没有选择位置,而是在 where 语句中将它用作过滤条件。两种选择都可以。我们不必选择用于过滤的所有列。

在选择列时应用聚合函数,就像在普通的 select 语句中一样。

示例 3

我们希望看到每个城市的平均订单量。

这与第二个例子相似,但有一点不同。我们还必须选择 location 列,因为它将用于对行进行分组。

mysql> select customer.location, avg(orders.amount)
    -> from customer
    -> join orders
    -> on customer.cust_id = orders.cust_id
    -> group by customer.location;+----------+--------------------+
| location | avg(orders.amount) |
+----------+--------------------+
| Austin   |          50.572629 |
| Dallas   |          47.624540 |
| Houston  |          50.109382 |
+----------+--------------------+

实例 4

我们希望看到最高订单金额和下订单的客户的年龄。

mysql> select customer.age, orders.amount
    -> from customer
    -> join orders
    -> on customer.cust_id = orders.cust_id
    -> order by orders.amount desc
    -> limit 1;+------+--------+
| age  | amount |
+------+--------+
|   41 |  99.95 |
+------+--------+

我们从客户表中选择年龄,从订单表中选择金额。筛选最高金额的一种方法是按降序对值进行排序,取第一个值。order by 语句根据给定列中的值对行进行排序。默认行为是按升序排序,但我们使用 desc 关键字来改变它。

实例 5

我们希望看到 id 为 1006 的客户的最高订单金额。

mysql> select max(orders.amount) 
    -> from customer 
    -> join orders 
    -> on customer.cust_id = orders.cust_id 
    -> where customer.cust_id = 1006;+--------------------+
| max(orders.amount) |
+--------------------+
|              93.18 |
+--------------------+

我们对 amount 列使用 max 函数,并过滤属于 id 为 1006 的客户的行。

实例 6

我们希望看到休斯顿的前 5 名客户在销售时的最高平均订单额。

我们将在 where 语句中使用两个条件,按 cust_id 列对值进行分组,根据平均金额按降序对行进行排序,并选择前 5 行。

mysql> select c.cust_id, avg(o.amount) as average 
    -> from customer c 
    -> join orders o 
    -> on c.cust_id = o.cust_id 
    -> where c.location = "Houston" and o.is_sale = "True" 
    -> group by c.cust_id 
    -> order by average desc limit 5;+---------+-----------+
| cust_id | average   |
+---------+-----------+
|    1821 | 70.150000 |
|    1299 | 67.405000 |
|    1829 | 65.225000 |
|    1802 | 64.295000 |
|    1773 | 64.012500 |
+---------+-----------+

在本例中,我们为每个表名和聚合列使用了一个别名。这使得编写查询更加容易,因为我们要多次编写表名。

例 7

我们想找出 2020 年 2 月 9 日订单量最低的客户的位置。

在本例中,我们将实现一个嵌套的 select 语句,作为 where 语句中的一个条件。

mysql> select c.cust_id, c.location
    -> from customer c
    -> join orders o
    -> on c.cust_id = o.cust_id
    -> where o.date = "2020-02-09" and o.amount = (
    -> select min(amount) from orders where date = "2020-02-09"
    -> );+---------+----------+
| cust_id | location |
+---------+----------+
|    1559 | Dallas   |
+---------+----------+

我们有两个条件。第一个是我们可以直接写在 where 语句中的具体日期。第二个包括一个集合。我们需要找到给定日期的最小订单量。

我们可以在单独的查询中找到这个值,或者编写一个嵌套的 select 语句作为订单金额的条件。在本例中,我们已经完成了后者。

结论

我们已经做了 7 个例子来介绍 SQL 连接。关系数据库通常由许多基于共享列的相关表组成。我们需要从关系数据库中检索的数据通常分布在多个表中。因此,全面理解 SQL 连接非常重要。

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

7 条著名的人工智能语录

原文:https://towardsdatascience.com/7-famous-ai-quotes-explained-782dda72d2c5?source=collection_archive---------6-----------------------

人工智能

人工智能的过去、现在和未来。

照片由马蒂亚斯·诺斯Unsplash 拍摄

人工智能已经与我们生活的方方面面交织在一起。在过去的 60 年里,无数的科学家和哲学家努力工作,将这个领域发展到今天的样子。几十年来,一些观点、方法和范式指导了人工智能的研究,非常聪明的人表达了他们对人工智能伟大探索的想法和见解:征服智能。

这些洞见以神秘但吸引人的短语的形式出现在我们面前,而这些短语的潜在含义却常常不为我们所知。我们被留在那里,点头同意一个复杂思想的美丽简化。但是把一句话写成一本书需要专业知识和多年的思考。西塞罗说得好,“如果我有更多的时间,我会写一封更短的信。”

在这篇文章中,我从该领域的世界级专家那里挑选了 7 条著名的人工智能语录,并为你解开其中的含义。尽情享受吧!

图灵测试

“如果一台计算机能够欺骗人类,让人类相信它是人类,那么它就应该被称为智能的。”

—艾伦·图灵

通常被认为是计算机科学之父的艾伦·图灵在 1950 年发表了一篇论文,他在论文中解释了回答“机器能思考吗?”这个问题的最佳方式就是改变问题本身。他认为询问机器是否能思考是没有用的,因为我们无法正式定义“思考”。

相反,他提出了“模仿游戏”——我们今天称之为图灵测试。模仿游戏是由三个代理人玩的问答式游戏。审讯者(特工 C)向特工 A 或 B 提出如下形式的问题:“请给我写一首关于第四座桥的十四行诗”或“把 34957 加到 70764。”特工 A 的任务是迷惑审讯者,让他误以为是特工 B。例如,如果 A 是个男人,B 是个女人,这个男人必须努力让审讯者相信他就是那个女人。

有了这个框架,图灵提出,原来的问题可以换成“当一台机器在这个游戏中扮演 A 的角色时会发生什么?”代理人 A 可以被换成一台通用的数字计算机来测试它的认知能力,如果这台计算机能够欺骗询问者,使其认为它是人类,那么它就应该被称为智能的。

人工智能的未来

"未来取决于某个对我所说的一切深感怀疑的研究生。"

—杰弗里·辛顿

现在被称为人工智能“教父”的杰弗里·辛顿(Geoffrey Hinton)最初是作为认知心理学家接受培训的。这就是为什么当几乎没有人工作时,他一直试图让人工神经网络(ANN)工作。当时,专家认为连接主义 AI 是一条死胡同,即使大脑是由生物神经网络组成的。但辛顿一直认为,“为了让人工智能发挥作用,我们必须以类似于人脑的方式进行计算。”

然而,深度学习并不像大脑那样工作。即使人工神经网络的名称来自神经科学,但它们在最基本的意义上不同于生物神经网络。人工神经元是一种超级简化的构造,是在生物神经元的基础上构建的,但假设它们只是基础数学的愚蠢计算器。然而,已经证明“单个神经元可能能够计算真正复杂的功能。例如,它本身可能能够识别一个物体。”

纵观全局,辛顿的怀疑是坚定的:计算机视觉和 CNN不像我们的视觉系统那样工作。深度学习系统需要大量的数据,而由于先天的大脑结构,人类从稀疏的数据中学习。而计算机需要巨大的功率来训练最先进的 AI,而大脑只消耗 20W。Geoffrey Hinton 为深度学习奠定了基础,他知道未来的人工智能将走上一条不同的道路。

意识人工智能

"根本没有人知道如何建造一台有意识的机器."

—斯图尔特·罗素

有数百本关于意识的书,原因是没有人理解它。正如劳伦斯·克劳斯在接受《诺姆·乔姆斯基》采访时指出的,“一个领域的已知程度和关于这个领域的书籍数量成反比。”

我们对意识知之甚少。人们普遍认为,大脑中的活动产生了心理过程和我们对现实的主观体验。但是我们对它是如何出现的一无所知。生物电信号是如何产生丰富的、无限的思想、感觉和知觉的,这是完全未知的。不了解科学,就认为我们可以创造技术是愚蠢的。

然而,有些人担心我们会建立有意识的人工智能。如果我们真的做到了,其意义将远远大于构建无意识的一般智能。这就是为什么有技术术语来区分这两者:AGI,经常指的是不一定有意识的人类水平的智能——罗素所争论的是人工智能研究的最终目标。另一个术语是强人工智能,这是由约翰·塞尔创造的概念,指的是人类级别的人工智能,也是有意识的。如果我们要构建强大的人工智能,我们需要彻底反思社会。

元发明

“任何可以产生比人类更聪明的智能的东西——以人工智能、脑机接口或基于神经科学的人类智能增强的形式——都毫无疑问地成为最能改变世界的东西。其他的甚至都不在一个联盟里。”

—埃利泽·尤德科夫斯基

自从我们进化成文化生物,我们就一直在发明东西。早在历史开始之前,技术就已经帮助推动我们的文明向前发展。写作、农业、城市、印刷、电力、互联网、社交媒体……都以这样或那样的方式极大地改变了世界。

但是尤德科夫斯基所说的比人类聪明的智能是一种不同类型的发明;这是一个元发明。农业或印刷是有特定用途的技术,被设计来执行预先定义的任务。通过构建一个通用人工智能,我们已经让发明了一个 发明家——,而不是任何一个发明家;它几乎在所有方面都比我们强。

打个比方,让我们想到电脑。它被设计成一台通用机器,一台可以被编程来执行许多不同设备的任务的机器。在某种意义上,计算机是一种元设备。另一个更近的类比可以用流行的语言模型 GPT-3 来说明,它具有元学习能力。它学会了学习,而不是学会了执行一项特定的任务。AGI 将是我们所能想到的最广泛意义上的元。这提出了一个有趣而又可怕的问题:如果我们设法发明了所有这些东西,那么一个超级强大的发明家能发明什么呢?

人工智能的危险

“全人工智能的发展可能意味着人类的终结。[……]它会自己起飞,以越来越快的速度重新设计自己。受到缓慢生物进化限制的人类无法竞争,并将被取代。”

——斯蒂芬·霍金

著名物理学家斯蒂芬·霍金警告我们真正人工智能的危险。他认为一个足够聪明的人工智能将能够摆脱我们的控制。即使我们成功地设计了符合我们价值观的人工智能,最轻微的偏差也可能导致更下游的灾难性后果。有一种观点认为,如果我们可以设计一个全能的人工智能,让它变得仁慈的唯一要求是让它渴望对我们有益的东西,拒绝那些对我们有害的东西。然而,在实践中,我们会发现实现这一目标有许多困难。

最乐观的人认为,如果我们完整地构建人工智能,它不可能在我们精心设定的界限之外表现。但霍金谈到了重新设计,我们不必看得太远就能意识到这一论点值得考虑:人类在几千年的进化之风、随机突变和自然选择中精心打造,直到最近才找到改变我们基础的工具。如果我们设法改变我们的 DNA,我们就成功地克服了进化的限制,进化是我们的主要“设计师”是什么让我们认为像我们一样聪明的机器最终不能做同样的事情?

此外,因为机器已经在各个方面超越了我们——记忆、精度和计算能力等——它们也将通过改变自身在其他任何方面迅速超越我们。我们可能会失去在这种情况下可能出现的任何冲突;我们会被“取代”

我们最后的发明

"机器智能是人类需要创造的最后一项发明."

—尼克·博斯特罗姆

尼克·博斯特罗姆是牛津大学的一名哲学家,著有《超级智能:路径、危险、策略、T3》一书,他在书中认为超级智能——这个术语指的是那些远远超过 AGI 水平、远在我们之上的人工智能,相比之下,我们再也不能称自己为智能——将会出现,我们应该以各种可能的方式为这一事件做准备。

博斯特罗姆认为,一旦我们到达 AGI,ASI(人工超级智能)终将到来。这种智能将能够做我们所做的一切,甚至更多——多到我们就像试图理清人类文明运作的蚂蚁一样——因此它将能够创造所有其他可以创造的东西(与 Yudkowsky 的观点一致)。

对于博斯特罗姆来说,这种未来可能以两种相反的形式出现:要么 ASI 是仁慈的,对人类有益的,因为我们已经成功地将它与我们完美地结合在一起,要么它不是,也不仅仅是“人类需要做出的最后一项发明”,而是我们将做出的最后一项发明。句号。

奇点

“在几十年内,机器智能将超过人类智能,导致奇点——技术变革如此迅速和深刻,以至于代表着人类历史结构的断裂。”

—雷·库兹韦尔

世界领先的未来学家之一雷·库兹韦尔(Ray Kurzweil)提出了他所谓的“加速回报定律”,根据该定律,进化系统——包括技术——以指数速度变化。他认为,按照这个想法,我们可以断定奇点就在附近。他声称,在 21 世纪末之前,我们将达到这一事件,创造“人类历史结构的断裂。”

人类将与机器完全融合,我们将被永恒地投射成基于软件的生物,人工智能将比人类的总和更加强大,向外扩展其征服宇宙的范围。库兹韦尔认为这将在不到 25 年的时间内开始发生:“我将这个奇点的日期定为 2045 年,这代表着人类能力的一次深刻而具有破坏性的转变。”

然而,对他的想法有很多批评。物理学家保罗·戴维斯即使在某些情况下增长是指数级的,但由于缺乏资源,这种增长不会持久。物理学家西奥多·莫迪斯(Theodore Modis)认为“自然界中没有什么遵循纯指数规律”,相反,增长是典型的逻辑。一开始,这两个功能看起来是一样的,但是逻辑变平了,这就是现实中最终发生的情况。无论是哪种情况,我们都将活着看到库兹韦尔的预测是否会落空。

跟我一起旅行到未来 了解更多关于人工智能、哲学和认知科学的内容!如有任何疑问,欢迎在评论中提问或联系LinkedInTwitter!😃

数据科学家的 6 个 GitHub 场景

原文:https://towardsdatascience.com/7-github-scenarios-for-data-scientists-cb502dc54eb0?source=collection_archive---------27-----------------------

从第一天起就开始贡献你公司的代码库

当我刚开始作为一名数据科学家工作时,我被告知要将代码提交给 Github,尤其是提交给其他人正在管理的回购。一想到我笨拙的动作可能会破坏别人的代码,我就害怕。

现在我终于克服了恐惧,我想我会分享我的 GitHub 工作流程在我日常工作中的样子。

Roman SynkevychUnsplash 上拍摄的照片

场景 1 :你被分配到一个新任务,有一张吉拉或俱乐部会所的门票编号 DS-1234。

我从我的开发同事那里学到的一个好习惯是,总是用你的票号开始一个新的分支。这样,你将能够指出背景、故事和作品范围的血统。这不仅对你的代码审查者、你的项目经理(他们可能会友好地问你你发布了什么)非常有帮助,最重要的是,对你未来的自己非常有帮助。

# Create and switch to a branch named after the Jira ticket
$ git checkout -b DS-1234

您可以通过下面的命令检查您当前的分支

$ git branch

现在你可以开始你的分支工作了。你可以添加新的代码,编辑现有的代码,一旦你满意了,你可以通过这样做来addcommit你的工作:

$ git add new_algo.py # a new script called new_algo.py
$ git commit -m "added a new algo"
$ git push origin DS-1234

现在你的代码在本地DS-1234和 Github 远程分支DS-1234上都被更新了。

场景 2 :在你第一次提交之后,创建一个拉请求(PR)并标记你的同事进行代码审查总是一个好主意。

您可以在 Github 上为分支DS-1234创建一个 PR,请访问:

https://github.com/your-project-folder/pull/new/ds-1234

你也可以在运行git push origin DS-1234时找到这个路径

假设你的同事给了你一些反馈和评论,你直接在 github 上对readme做了一些小的编辑,现在你想在本地进一步更新你的new_algo.py

您可以首先在本地终端上运行下面的命令,从 github 获取readme变更

$ git pull origin DS-1234

然后在更新完new_algo.py之后,可以通过运行以下命令将更新后的代码推送到 github 远程分支

$ git push origin DS-1234

一旦你确认你的同事将你更新的分支DS-1234合并到master分支,你就可以安全地在本地和远程删除DS-1234

# delete local branch
$ git branch -d DS-1234# or you can run
$ git branch -D DS-1234# delete remote branch using push --delete
$ git push origin --delete DS-1234

场景三:如果你的同事足够信任你,让你自己合并,或者你需要把别人的分支合并成 master,你可以这样做:

# assuming you are to merge DS-1234 to master branch
$ git merge --no-ff -m "merged DS-1234 into master"# or if you are to merge other people's bug fix branch bugfix-234
$ git merge --no-ff -m "merged bugfix-234 into master"

注意,no-ff 标志防止 git merge 执行“快进”,如果它检测到您当前的头是您试图合并的提交的祖先。

场景 4 :你想删除一个文件。

$ git rm test.py # remove test.py file
# commit your change
$ git commit -m "remove test.py file"

如果你改变了主意或者删除了错误的文件怎么办?别担心,你能做到的

$ git checkout -- test.py

现在test.py回来了!

场景 5 :删除未被跟踪的文件

有时你做了一堆你不想保留的更改,你可以运行下面的命令来一次清理它们。

# dry run to see which files will be removed
$ git clean -d -n# remove them
$ git clean -d -f

场景 6 :【高级场景】我发现自己在创建DS-1234之前就开始对master分支做改动了。事实上,这种情况在我身上发生过很多次😂。

我们有两个解决方案。

解决方案 1 : git stash

# step 1: save the changes you made on master branch
$ git stash # step 2: create and switch to DS-1234 branch
$ git checkout -b DS-1234# step 3: transfer the changes using stash pop
$ git stash pop

解决方案二:精选🍒

这是我从前任经理那里学来的一招。它类似于git cherry-pick,但在我看来更直观,因为它非常清楚地显示了路径。

现在,想象一下在你的 DS-1234 上,你处理了许多代码。明天是将你的代码合并到发布分支的最后期限。看起来只有一段代码准备合并。您可以通过运行以下命令来选择要合并的这个:

# step 1: pull all recent changes from remote
$ git pull# step 2: checkout your branch and release branch
$ git checkout DS-1234  # pick from this branch
$ git checkout release-2021-07-01 # to this target branch# step 3: checkout the code ready to merge
$ git checkout DS-1234 new_algo.py# step 4: add this code to release branch
$ git add new_algo.py# step 5: commit 
$ git commit -m "cherry pick changes from DS-1234 to release"

关闭思路

  1. Git 和 GitHub 是功能强大的协作工具,对于过去以笔记本方式工作的新数据科学家来说,一开始可能会感到害怕。
  2. 对于数据科学家来说,你肯定不需要学习最奇怪的 GitHub 命令来开始与你的开发同事合作。
  3. 通过熟悉常见的 GitHub 工作流环境,您可以从第一天(好吧,也许是第一周)就满怀信心地将您的代码推向您组织的代码库😊).

7 大项目加深你对计算机的理解

原文:https://towardsdatascience.com/7-great-projects-to-deepen-your-understanding-of-computers-e20f7524277c?source=collection_archive---------8-----------------------

通过这些令人敬畏的项目,让你的理解超越理论和抽象

萨沙·尤达耶夫在 Unsplash 上的照片

如今的编程基于大量的抽象和友好的界面,隐藏了我们日常使用的技术的内部工作原理。想想看,我们是如何轻率地使用 IDE 编写代码,然后毫不费力地编译/运行代码,并在出错时得到友好的错误消息。然而,就在几十年前,情况完全不同。当时,编程肯定不是一个人可以在几个月内学会的简单任务。

但是为什么我们不能坚持抽象,然后就到此为止呢?

你当然可以,但是你应该这样做吗?了解我们使用的技术的内部运作是掌握它的第一步。这里有几个理由可以让你弄脏自己的手,提升自己的知识:

  • 提高调试技巧。有多少次随机错误出现了,而你却不知道是什么原因造成的?不,堆栈溢出并不总是有一个清晰直接的答案。了解东西是如何工作的有助于你的调试过程。
  • 优化本能。了解某样东西是如何工作的会暴露出它的优缺点。你自然会知道该做什么,该避免什么。你的第一个方法通常是最好的。
  • 为对你重要的项目做贡献。假设你想在你使用的软件中加入一个特性。为什么不自己实施并帮助社区呢?如果你需要,很可能其他人也需要。
  • 对社区的帮助。堆栈溢出是因为所有那些深入挖掘堆栈并掌握其业务的人。这些专家一定来自某个地方,你可能就是其中之一。

实际项目

请注意,这些项目可能很难,可能需要很长时间才能完成,但它们肯定值得你付出努力。所以准备好你自己去穿越下层世界的长途旅行吧。

构建编译器

我知道这听起来很吓人也很难,因为确实如此。然而,在我看来,这是程序员可以做的加深技能和知识的最佳项目之一。

构建编译器将涉及:

预计这个项目需要很长时间才能完成。我花了半年时间创建了一个编译器(而且它还不是全功能的),还不包括之前和他们不太酷的表亲解释器几个月的经验。

构建一个解释器

解释器部分类似于编译器。它们涉及许多相同的技能:

  • 语法分析和语法。
  • 上面提到的用于编译器的数据结构(链表、语法树和符号表)。
  • 这可能需要你创建一个虚拟机,尽管这不是必需的。
  • 你还必须在运行时管理变量和符号,通常通过符号表

预计这个项目会比编译器简单一些,但仍然不是一项容易的任务。我花了几个月的时间来学习和构建一种新语言的全功能解释器。

构建网络代理

联网和套接字编程永远不会成为你的武器库中的无用技能。

通过本项目,您将了解到:

  • 套接字编程以及地址和端口等概念。
  • 网络协议如 HTTP 或 HTTPS。您将学习请求和响应的结构,以及它们的头和参数。
  • 线程用于处理多个并发连接。

这个项目应该不难完成。这可能需要几天到一周的时间,取决于你希望你的代理有多复杂。

数据库管理系统

数据库就在我们身边。我们经常在许多应用中使用它们。但是,有多少开发人员真正了解 API 或工具背后的东西,使我们能够与数据库进行交互?或者数据库文件里面有什么?

要从头开始实施 DBMS,您需要了解:

  • 当然是 SQL
  • 解释器如果你决定实现一个 SQL 解析器和查询执行器。
  • 数据库文件结构对于实际存储数据也是强制性的。

这个项目可能不是一个非常困难的项目,但是如果您选择自己实现一个 SQL 解析器,预计它会花费很长时间,因为您必须为至少一个可用的 SQL 超集的功能编码。在这种情况下,可能需要一个月的时间。

机器学习库

与编译器一样,从头构建一个机器学习库听起来可能非常吓人。肯定不容易,需要很多数学知识。

在此过程中,您将了解到:

  • 导数梯度向量曲线概率 等高等数学概念。
  • 算法 用于训练各种类型的模型。
  • 表示并存储训练好的模型到文件中。这将涉及到处理原始二进制数据。

在这种情况下,我不想给出一个时间参考,因为我曾经开始建立这样一个库,但从未真正完成它,也没有达到一个显著的里程碑。

过程世界生成

创建一个游戏,无论是 2d 还是 3d,它的世界都是基于程序生成的。以《我的世界》或特拉利亚为例,实现各种生物群落、结构和你想到的一切。你有没有想过这是怎么做到的?

在这次旅程中,您将了解:

  • 噪音的概念以及它是如何产生的。
  • 如何结合噪波贴图产生世界特征。
  • 你必须创建一些算法来处理各种参数矩阵,如温度、湿度、海拔等,然后将它们组合成一个最终的世界地图矩阵。
  • 块加载和存储是你必须掌握的另一项技能,因为 CPU 和 RAM 是有限的资源。

编写代码所需的时间实际上取决于您选择它有多复杂。如果你决定接手这个项目,我建议你读一下我写的关于过程世界生成的文章。

基本社交媒体

它不一定要成为下一个 Instagram,尽管它应该拥有这样一款软件的所有关键功能。

此次旅程将涵盖:

  • 使用一个 web 服务器并最终使用一些 web 框架
  • 创建和管理用户账户和认证
  • 建立和使用某种类型的数据库。
  • 你必须处理和显示文本帖子,图像和视频。
  • 它需要最低限度的可用用户界面。
  • 您可以决定在私人聊天中实施加密。

建立一个社交媒体所需要的时间完全取决于你决定实现的复杂性和特性。然而,预计最基本的一个至少需要几个星期。

结论

不要对你的业务流于表面。深入挖掘你所使用的技术的内部工作原理,以真正成为你的艺术大师。编程是一个旅程,而不是目的地。总有改进的余地。

没有人会因为做他一直在做的事情而变得更好。推动自己超越舒适区,实现你从未想过你能做到的。

像这样的项目是值得你花费时间和精力的投资。你所需要做的就是选择一个,然后开始:你会在工作中学到你需要的一切。

如果你知道任何其他有趣的项目,涉及到弄脏你的手,并且你认为值得做,请在评论区分享它。

我希望你喜欢我的文章,并感到鼓舞,开始建设。如果您想阅读更多关于高级编程项目的内容,请查看我下面的系列文章:

https://betterprogramming.pub/7-advanced-projects-to-improve-your-programming-skills-f05d7875104

感谢阅读!

作为数据科学家,您需要关注的 7 个 PyCon 2021 大会

原文:https://towardsdatascience.com/7-great-pycon-2021-talks-you-need-to-watch-as-a-data-scientist-ca12905ae68f?source=collection_archive---------12-----------------------

来自伟大思想的伟大信息

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

作为一个对数据科学感兴趣的人,一个专业的数据科学家,或者只是一个寻找可以使用 Python 的应用程序的人,PyCon 是一个获取信息和从知识渊博的演讲者那里学到很多东西的好地方。Python 是当今最广为人知和使用最多的编程语言之一,在全球拥有数百万开发者和用户。

因为 Python 在国际上被广泛使用,所以许多社区被建立来连接开发者和网络并分享经验。PyCon (Python 大会)是 Python 相关的年度最大事件之一。PyCon 不仅仅是一个会议;这是一个全球会议的集合,主要会议在美国举行。

PyCon 通常包括针对从初学者到专家的所有级别的不同 Python 相关主题的讲座、教程和研讨会。因此,每当我想学习或者更新我的知识时,在去 Google 寻找不同种类的教程和信息之前,我首先尝试寻找以前 PyCons 的相关演讲。

</9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8> [## 9 台用于数学、Python 和数据科学的 Discord 服务器,您需要立即加入

towardsdatascience.com](/9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8)

根据我的经验,PyCon 演讲通常很短——不到 30 分钟——简洁,由了不起的、有成就的人以有趣、简单的方式呈现。然而,尽管这些演讲短小精悍,但它们通常包含了你需要了解的关于某个主题的所有细节,以便对该主题有一个坚实的理解。

今年(2021 年)的 PyCon US 已经完成,和今年的许多其他会议一样,它完全是虚拟的。会议包括大量令人大开眼界的演讲、简单易懂的研讨会和有用的教程。PyCon 的所有视频现在都可以在 YouTube 上看到。虽然我建议您浏览 PyCon 的所有资料,但在本文中,我将重点关注我参加的数据科学相关讲座,并从中受益匪浅。

№1:从 NumPy 到 PyTorch,API 兼容性的故事,作者 Randall Hunt 和 Mike Ruberry

让我们从两位软件工程师 Randall Hunt 和 Mike Ruberry 的演讲开始,他们在脸书、AWS cloud 和 SpaceX 等大型科技公司工作过。Hunt 和 Ruberry 讨论了 PyTorch 中 NumPy 的行为,PyTorch 实际上是否与 NumPy 兼容,以及如何处理这种兼容性问题以实现更平稳的执行。

№2:生产中的 ML 模型模式,作者 Simon Mo

AnyScale 的软件工程师 Simon Mo 谈到了为生产部署机器学习模型的麻烦。作为数据科学家,建立和训练机器学习模型应该是你花大部分时间的部分。Mo 带您轻松完成部署模型的过程。他还介绍了为 Ray Serve 部署机器学习模型的过程,这是一个可扩展的模型服务框架。

№3:用假设测试随机人工智能模型,作者 Marina Shvartz

Marina Shvartz 是 Aidoc Medical 的人工智能软件工程师。Shvarts 解决了当我们无法手动设置不同 AI 模型的精确边缘情况时,在这些模型上执行有效测试的困难。Shvartz 谈到了基于属性的测试、假设库,以及它如何帮助数据科学家生成边缘案例,这些案例可以帮助产生经过良好测试和开发的人工智能模型。

№4:Ray 上的数据处理,作者 SangBin Cho

AnyScale 的另一位软件工程师 SangBin Cho 继续 Simon Mo 关于部署机器学习模型的演讲。在 Cho 的演讲中,您将了解更多关于 Ray Serve 如何应对可扩展数据科学 Python 应用程序的挑战。他谈到了他们在开发 Ray 时面临的挑战,以及他们如何克服这些挑战来支持大规模数据集的处理。

№5:事件驱动的应用程序:Apache Kafka 和 Python,作者 Francesco Tisiot

Apache Kafka 是最知名的数据流平台之一。Francesco Tisiot 作为 Aiven 的开发者倡导者,帮助您探索 Apache Kafka 的能力以及它可以解决的问题。Tisiot 提供了一些关于通过 Python 库添加和使用 Kafka 的提示和技巧,然后介绍了 Kafka Connect,这是一个连接事件的工具,可以将您的应用程序带到下一个数据级别。

№6:用 Python Celery 优化数据检索,作者 Jenna Conn 和 Hannah Cline

我们生活在一个不断膨胀的数据世界中;我们的应用程序需要处理的数据量正在快速增长。Jenna Conn 和 Hannah Cline 都是软件工程师,他们讨论了使用 Python 库 Celery 整理和优化数据检索过程的不同方法,方法是为应用程序创建队列并获得更好的整体体验。

№7:大规模数据验证,Kevin Kho

Perfect 的开源社区工程师、前数据科学家 Kevin Kho 讨论了使用 Spark 和 Dask 验证数据的过程,重点是大规模数据。Kho 着眼于验证数据的不同分区所面临的挑战,以及如何通过正确使用各种工具来克服这一挑战。Kho 将解释如何使用 Pana 验证,以及如何使用 Spark、Dask 和 Fugue 更有效地完成验证。

外卖食品

PyCon 讲座、教程和研讨会是 Python 相关信息的最有用和最可靠的来源之一。PyCon 是 Python 社区的志愿者每年组织的一系列 Python 会议,在全球范围内举行。

第一个也是最主要的 PyCon 是美版,往往在上半年举行。PyCon US 2021 在 5 月举行,包含数百个讲座和教程,针对所有经验水平的人,重点关注 Python 的不同方面。即使您是编程世界和 Python 的新手,我也可以保证您会找到一些与您的水平相匹配的 PyCon 讲座,并为您提供有用的信息。

</6-data-science-slack-workshops-you-need-to-join-b0c00952105d>

Python 是一种非常通用的语言,可以在许多应用程序中使用,但 Python 最常见的应用领域之一是数据科学。在这篇文章中,我提出了 7 个令人惊叹的 PyCon US 2021 讲座,它们都与数据科学相关,并且充满了对所有级别的数据科学家都有用的信息。

除了我在这篇文章中建议的演讲,我建议你浏览 PyCon 演讲的整个列表,也许你会找到一个让你感兴趣的演讲,但我没有提到这个列表。

帮助你理解人工智能和机器学习论文的 8 个伟大的 YouTube 频道

原文:https://towardsdatascience.com/7-great-youtube-channels-to-learn-the-latest-advancements-in-machine-learning-and-ai-f3a9b5f56b65?source=collection_archive---------23-----------------------

如果你很难理解机器学习论文,这些可以帮助你

丹·迪莫克在 Unsplash 上拍摄的照片

随着机器学习和人工智能的快速发展,我们见证了一个越来越大的挑战,即跟上步伐,因为该领域的发展速度快于我们可能能够跟上的速度。

此外,一篇新论文通常是建立在其他先前发表的作品之上的,他们可能不会给你关于它的细节,而你也需要去阅读那篇特定的论文。

在你理解一篇你即将阅读的论文之前,你需要查阅和理解的这一系列论文越来越长。

幸运的是,至少有人可以帮你。

你还记得 YouTube 吗?

是啊,那个大平台,有更多你这辈子可以看的视频。

事实证明,它不仅仅是另一个可以让你观看有趣视频的平台。还有很多有用的渠道,甚至可以帮助你理解论文。

你可能以前听说过其中的一些渠道,也许你还知道其他渠道,它们在帮助我们更好地理解论文方面做得很好。

他们非常节省时间,为许多论文准备了 YouTube 视频。

你可能知道,它们当然是免费的 YouTube 视频,你可以观看并更好地理解许多论文。

一些视频是简短的总体概述,而另一些则是深入探讨。

你可以浏览一些短的,如果你感兴趣的话,你当然可以直接去看长的。

事不宜迟,这是清单。

扬尼克·基尔彻

https://www.youtube.com/channel/UCZHmQk67mSJgfCCTn7xBfew

Yannic Kilcher 最近完成了苏黎世联邦理工学院的博士学位。他自己是一名研究人员,所以他已经完全沉浸在研究世界中了。

他有非常翔实的视频,详细介绍了许多与深度学习、自然语言处理和强化学习特别相关的论文。

他通常对自己准备的视频也很快,这使得其他人更容易去了解那些在 Twitter 上或整个研究社区吸引了很多注意力的热门论文。

他也非常迷人,看起来很有趣。

你可以看到一段他详细解释 GPT 3 号论文的视频。

他有时甚至会讨论一些与机器学习相关的模因:

阿拉丁·佩尔森

https://www.youtube.com/c/AladdinPersson/about

Aladdin 是一名数学专业的学生,但他已经上传了许多实践教程,如关于 Pytorch、Tensorflow 的视频,以及论文的实现。

此外,它包括论文的深入解释,带领你通过一些论文的所有本质细节。

在写这篇文章的时候,它通常包括回顾一些相对旧的论文的视频。

然而,这对许多人来说仍然是很有帮助的,尤其是那些刚刚入门的人,或者那些自己没有理解这些论文的人。

这个频道相对来说比较新,但是它在不断地更新,它可以让你放心,你可能会定期看到新的视频。

2 分钟纸

https://www.youtube.com/user/keeroyz/

这是发展迅速的最受欢迎的频道之一,在撰写本文时已经吸引了近百万的订户。

虽然现在大多数情况下,它的视频都没有预期的 2 分钟长,但 Károly Zsolnai-Fehé的解释很快就提到了论文的要点。

他经常发表文章,通常会给你一个关于某篇论文的简要概述,给你相关论文的链接和参考。

此外,他的视频标题通常非常有吸引力,甚至可以引发非技术人员的兴趣,他们可能希望大致了解机器学习和人工智能领域的进展,如下所示:

在他的许多视频中,他还通过以下方式表达了对该领域进步的惊叹:

“活着是多么美好的时光啊!”卡罗利·佐尔奈-费希尔

亨利·艾实验室

https://www.youtube.com/channel/UCHB9VepY6kYvZjj0Bgxnpbw

除了大量涵盖研究领域最新消息的视频外,该频道还发布与研究相关的视频。

这里是 OpenAI 发表的令人印象深刻的 DALL-E 论文的视频摘要。

你可以在这里找到一个完整的播放列表,其中有许多视频,以及许多深度学习论文的简短摘要,这些论文的主题包括计算机视觉、自然语言处理、图形嵌入、生成对抗网络、强化学习等。

你可以在下面 GitHub 上的自述文件中看到他整理的视频

蒂姆·斯卡夫的机器学习道场

https://www.youtube.com/c/MachineLearningDojowithTimScarfe

这个频道由 Tim Scarfe 博士与其他人合作运营,在这里你不仅可以找到论文评论,还可以找到与项目相关的讨论、采访以及对机器学习主题的深入研究。

在这段简短的介绍视频中,你可以看到他的兴奋之情:

他们还有一个 Discord group ,以防你想在那里进一步讨论你的研究想法和潜在的合作。

此外,Tim 博士与 Yannic Kilcher 和 Connor Shorten 一起举办了一个名为“机器学习街谈”的播客

深度学习的点滴

https://www.youtube.com/channel/UCIUtWXPs66MFY-hOnETfqhg

该频道包括解释主要与计算机视觉、自然语言处理等相关的深度学习论文的视频。

这个频道不太为人所知,在我写这篇文章的时候,它也没有很多你可以观看的视频。

这里有一篇论文的快速回顾,你可以看看,更好地理解他们解释事物的方式:

然而,不要让这阻止你看这些内容,至少从中学到一些东西。

机器学习和人工智能学院

https://www.youtube.com/channel/UC4lM4hz_v5ixNjK54UwPEVw/videos

这个频道由一些已经完成博士学位的人组成。

他们在其频道中包含的主题列表是深度强化学习、深度学习、概率建模、高斯过程、概率论、线性代数以及凸和非凸优化。

虽然在撰写本文时,它只包含 13 个视频,但根据您的兴趣,有一些非常有价值的视频值得您花时间观看。

以下是对 Wasserstein 鲁棒强化学习的深入回顾:

Arxiv 见解

https://www.youtube.com/c/ArxivInsights

距离这个频道最后一次发布视频已经一年多了,到目前为止它只包含 11 个视频。

尽管如此,Arxiv Insights 还是有一些很棒的内容值得一看。

它包含深入的探讨,也有评论者本人,史云光·斯廷布鲁格,在视频中向你解释那些可以让你与你正在听的人有更私人联系的论文。

在写这篇文章的时候,他还没有发布很多视频,但已经发布的视频组织得非常好,值得观看和学习。

下面是一个视频,它详细介绍了变型自动编码器:

差不多就是这样。

如果你知道我们应该保留的任何其他好的频道,请不要犹豫,在下面的评论部分告诉我们。

7 本开创性的 Python 机器学习书籍

原文:https://towardsdatascience.com/7-ground-breaking-machine-learning-books-for-python-ea6db967e36c?source=collection_archive---------4-----------------------

我用 10 多本我最喜欢的书来主导 Python 中数据科学的机器学习部分。

(图片由作者提供)

介绍

让我们面对事实:

数据科学很难

首先,学习数据科学是极其费力的,而且肯定会非常困难。对于那些很少或没有经验或知识的人来说尤其如此。数据科学尤其困难,因为它需要在许多专业领域都能找到的特定技能子集。虽然这些技能通常是分开的,可能只被一个学科或另一个学科使用,但数据科学家必须将所有这些技能结合成一个。

数据科学家不仅要精通编程,还要精通统计和业务。光是统计和商业就足以让你毛骨悚然,更不用说整个编程了。除了进行基本编程的能力之外,还有编写算法的能力。虽然数据科学家利用一般应用科学的规则并试图证明假设,但数据科学家还需要以自动化的方式应用这些统计数据,以提供实时结果来解决问题。这是一个大多数数据科学家都熟悉的话题,它被称为机器学习。

机器学习是数据科学家与普通科学家的区别。也就是说,这个领域的扩展使得数据科学对于许多程序员或有抱负的数据科学家来说更加难以接近。机器学习非常像数据科学,非常困难。幸运的是,随着 Python 编程语言现在主导了行业,编写起来并不那么困难,同时还拥有不可估量的资源,机器学习比以往任何时候都更容易掌握。尝试机器学习的一个很好的资源当然是信息书籍。考虑到这一点,我想我应该展示一些我最喜欢的书籍,这些书籍帮助我更好地理解 Python 中的机器学习,它们当然值得一读!

№1:使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习:构建智能系统的概念、工具和技术

作者:奥雷连·盖伦

难度:中等

尽管这本书的名字可能很拗口,但之所以名字这么长,可能是因为书中实际上有多少内容。这本书最伟大的地方在于,它将带你从简单的 Python 程序员到专业的机器学习工程师,这一切都在一个 850 页的包中。

这本书以介绍机器学习开始。它讲述了重要的概念和技术,如回归和分析,这些概念和技术将延续到整个机器学习世界,无论您使用什么语言、方法或模型。我认为这本书里的一些基础知识也很棒。关于我正在使用的一些工具,有很多事情我希望我能够知道,这些工具在本书中得到了很好的介绍。

真正让这本书成为你脑海中图书馆的宝贵资产的是行业标准的工具,甚至每个版本都会更新。对于数据科学来说,保持市场领先非常重要,了解 Tensorflow、Sklearn 和 Keras 等工具将使找工作变得更加容易。

总体评分:8/10

"这本书提供了一些至今仍在使用的 Pythonic 生态系统的很好的教程."

№2:Python 机器学习简介:数据科学家指南

安德里亚斯·c·穆勒萨拉·圭多

难度:初学者友好型

奥赖利的另一本书,用 Python 介绍机器学习在教授机器学习的方法上做了很多正确的事情。虽然这本书可能不像这个列表中的其他一些书那样深入,并且主要涉及简单的黑盒模型,但从教育的角度来看,安德烈亚斯对建模的解释真正使这本书变得有趣和有价值。

虽然这可能不是回顾或扩展机器学习知识的最佳书籍,但它肯定符合以非常用户友好的方式教授基础知识的要求。此外,我认为本书中给出的关于建模和处理数据科学的细节非常有价值,对于任何有抱负的数据科学家来说,肯定是一个很好的起点。

如果我不得不推荐阅读这本书的任何部分,我想突出第 1-3 章。这些是我认为本书最有价值的概念和方法论的地方。第一章描述了大多数机器学习场景中使用的基本概念。这将继续深入到第二章和第三章,在这两章中,这些思想被应用,模型被使用。这些章节的另一个伟大之处是它解释了使用某些建模策略的好处,我认为这对于初学者来说很重要。当你明白什么样的输入对于特定的模型是最优的时,理解你的模型的准确性就容易多了。

总体评分:8/10

"这本书为新手提供了很好的基础知识!"

№3:用 Python 进行深度学习

迈克·克雷布斯

难度:高级

在本书中,Mike Krebbs,一位出色的作者和数据科学家,带我们踏上了一段充满灵感的旅程,通过 Python 进入深度学习的世界。这些信息不仅非常有价值,而且关于 Krebbs 写作风格的一些东西使它更有趣。

关于书籍、阅读和学习的一些东西可能会变得单调,但 Krebbs 在本书中的写作风格的伟大之处在于,他似乎真的很兴奋地展示代码的可能性,而不仅仅是演示它并解释它为什么工作。对我来说,这意味着很多,我经常发现像这样的信息书籍很难完全阅读,通常最终会将它们作为“现场手册”

这本书不仅读起来很有趣,而且它确实使用一种非常动觉的策略教授了许多机器学习的基本概念和高级概念。当谈到编程时,边做边学当然是我选择的方法,所以对我来说,这当然是 Krebbs 的伟大选择。这本书唯一显著的缺点是它的价格和零售可用性。这本书很难找到,而且通常售价远高于你通常在类似书籍中找到的价格。花费大约 50 美元,这当然是一项投资,可能值得,也可能不值得,这取决于你的经验和你个人的需求。

总体评分:7/10

“尽管这本书对于深度学习来说肯定很棒,但它的价格确实让它从我的推荐名单中消失了,因为有太多更便宜或免费的资源了。话虽如此,这本书的价格并非完全没有根据,但确实降低了评级——特别是考虑到这本书缺乏对概念的全面概述。”

№4:100 页的机器学习书籍

安德烈·布尔科夫

难度:中等

我记得不久前在亚马逊上看到了这本书,我觉得作者的名字有些不对劲,听起来很熟悉。然后我意识到我之前在网上看到过安德烈的名字,他做的很多研究工作和我做的相似——我很高兴看到这一点。此外,我觉得我们有过一次谈话,我不记得了,但很可能是愉快的。话虽如此,我还是非常兴奋地推广我同事的书。此外,它是自行出版的,这可能意味着所有的收入都将归他所有,他可能很难做广告,所以我将继续感谢任何因这篇文章而查阅他的书的人。

我认为这本书不可思议的是,安德烈能够在这么小的一本书里浓缩这么多东西。明确一点,这不是一本关于 Python 的书;但是机器学习。回想这本书里的所有信息,真的很难理解所有这些有价值的信息是如何被浓缩到这么少的几页里的。

这本书将深入研究机器学习模型及其工作原理。这很好,因为无论你何时从事数据科学,它都能让你对你所从事的工作有一个坚实的理解。更酷的是,安德烈并没有回避数学,但也没有用方程式淹没你。这本书总的来说很容易阅读,写作风格非常直接。这本书只有 100 页,一个很大的好处是它可以作为一个非常快速有效的查找手册,几乎可以查找任何关于机器学习的信息。

总体评分:9/10

“虽然这本书很短,只有 100 页,但它是一部精彩的读物。不知何故,作者把可能需要几年时间和实践一起发展的研究和信息浓缩成一本可以读、重读、再重读的书。相比很多类似的书,我觉得这里最关键的区别在于,这是一本读者的书。大多数书籍都非常庞大,应该慢慢阅读,或者在编程时用作参考,但这本书将带领读者经历一次他们可以在一次阅读中享受的旅程。”

№5:机器学习工程

安德烈·布尔科夫

难度:高级

安德烈·布尔科夫的另一本巨著是《机器学习工程》。尽管书名很简单,但对我来说,这本书甚至比同一作者之前的作品更有价值。这本书的伟大之处在于,它比它的前身更全面,并且从商业角度更深入地研究了机器学习。

最棒的是,从商业角度来看,机器学习正是公司在寻找机器学习工程师。这本书不仅会让你熟悉机器学习,还会让你在现实世界中尽可能有效地利用这些模型。

“如果你打算利用机器学习来解决大规模的商业问题,我很高兴你能拿到这本书。”

——凯西·科济尔科夫,谷歌首席决策科学家

对我来说,作为一名数据科学家,最重要的事情是对人工智能在现实世界中的构成有一个坚实的理解。理解模型实际上是如何使用和部署的,以及如何围绕机器学习对系统进行编程,对于数据科学家来说是一项非常有价值的资产,最近的版本(2020 年)无疑是让你接触这些概念的一个很好的方式。

总体评分:8/10

“尽管我很喜欢这本书,但它肯定不是这类书的完美范例。然而,当谈到在现实世界中看到和使用机器学习和人工智能的实现,以及理解如何大规模地构建东西时,这个领域没有太多竞争,这本书是一个很好的选择!”

№6:绝对初学者的机器学习:简明英语介绍

奥利弗·西奥博尔德

难度:初学者

机器学习是那些一旦跨过某个门槛就可能变得更容易的话题之一。也就是说,入门可能会非常困难。幸运的是,奥利弗·西奥博尔德的这本书将带一个绝对的 Pythonic 新手,让他们熟悉数据科学家日常使用的许多机器学习概念。

话虽如此,我对这本书的一个抱怨是,它的内容确实有点过于面向机器学习。将“绝对初学者”和“机器学习”这两个术语结合起来的问题是,机器学习需要学习很多东西。如果不知道如何操作数据、处理统计数据和特征,以及为机器学习模型做典型的预处理,那么知道如何使用模型就没有什么意义。

也就是说,虽然这本书可能错过了一些基本概念,让一些人感到有点困惑,但它确实对 Python 中的机器学习进行了非常初学者友好的审视,我认为大多数开发人员都会喜欢。

总体评分:6/10

“尽管我很喜欢这本书,但我不能说它没有问题。这本书的重点本身没有太多意义,因为一个绝对的初学者可能不应该直接进入像机器学习这样的高级概念。问题是,这本书在建立地基之前先建了建筑的第三层。也就是说,随着经验的增加,我当然认为这是可以挽回的,总的来说,这本书肯定不可怕,而且仍然在我的名单上,因为它对那个应用程序非常有用。”

№7:面向傻瓜的机器学习

由约翰·保罗·穆勒,卢卡·马萨隆

难度:初学者

我相信我们以前都读过一本“给傻瓜看的”书。例如,当我的热水器坏了,我去拿起一本“傻瓜水管工”的书。虽然我不一定宽恕对待科学计算就像你对待热水器一样,但我认为这本书绝对精彩。

这本书首先概述了当今空间中的机器学习。我认为这很重要,因为如果读者还没有完全投入进去,它真的可以告诉读者更多关于他们将要进入的内容。围绕这本书所教授的内容提供更多关于世界的信息当然是一件非常酷的事情,我认为这本书做得很好。

然后,这本书采取了一步一步的方法,这是我喜欢的——事情的节奏非常慢,有足够的时间来接受和理解一切。此外,本书中的一些解释真的让人感觉作者知道他们在做什么,这意味着概念得到了很好的解释,从未被掩盖。

总的来说,我会说这绝对是初学者今天学习数据科学的最佳书籍,如果他们完全是新的,并希望参与其中。

总体评分:9/10

“这本书是迷人的,因为它是全面的,老实说,没有什么需要的。如果你是一名初学者,我认为没有比这更好的介绍 Pythonic 机器学习的方式了。”

结论

所有这些书都很棒,我认为可以从每本书中提取许多有价值的信息。这个书单的好处在于,某些书可能比其他书更有价值。对于绝对的初学者来说,我会说“傻瓜”书绝对是学习 Python 机器学习的最佳选择。另一方面,机器学习工程对于那些有机器学习经验的人来说可能是最有价值的书,但可能想更深入地了解高级建模概念。如果你想看看我去年列出的一些我最喜欢的 DS 书籍,你可以看看我当时写的文章:

</5-great-data-science-books-for-lifelong-learners-3a6405a7f890>

不管怎样,这里有适合每个人的东西。我认为教育是让你的大脑在这个充满挑战的时代保持忙碌的一种奇妙的方式,也可以帮助你在这个世界上做出真正的改变。请原谅我情绪激动—

我做数据科学是因为我想有所作为。数据科学是一个很好的领域,因为你可以通过很多方式来帮助地球。以新冠肺炎为例——所有这些算法和可视化让我们能够追踪病毒,统计生物信息学研究加速了安全有效疫苗的开发。

我进入这个领域是为了有所作为,感谢大家给我这个平台让我有所作为。我的本意是教育,做的更多,我有梦想;不是为了我,而是为了这个世界。我很高兴你读了(也许喜欢)我的文章。这对我很重要,真的。不断学习,保持聪明,努力有所作为!

如果你想成为一名数据工程师,你需要知道的 7 件事☄

原文:https://towardsdatascience.com/7-hacks-to-get-your-first-data-engineer-job-4b3e44bb35fd?source=collection_archive---------7-----------------------

帮助你获得第一份数据工程师工作的策略

婆罗摩山的神奇日出[数字图像]作者:伊尔哈姆·巴赫蒂亚https://unsplash.com/photos/Z1A2U0vo8uY

关于如何成为一名 10 倍数据工程师,有大量的知识,但是什么值得你去获得你的第一份数据工程师工作呢?需要学习的工装和概念实在太多:很吓人😱。在这篇文章中,我会给你一些关于如何开始你的学习之旅的建议为你提供额外的资源📌。这不是一条捷径,但它会帮助你分清事情的轻重缓急,不会陷入困境。

如果门槛太高,请尝试另一个数据角色。👷

根据你的经验,获得数据工程师的第一份工作可能具有挑战性。如果你是软件工程的新手,那么技术门槛会很高。数据工程师所需的技术技能范围比数据分析师要广得多。

因此,Data Analyst 是一个良好的开端,因为它需要较少的硬技能(但有时需要更多的领域知识)。了解 SQL 并掌握一个 dashboarding 工具(Tableau/power bi/Metabase)应该会让你处于一个很好的位置。

最重要的是,数据分析师经常与数据工程师一起工作。因此,你有机会了解他们做什么,当你觉得准备好了,你可以申请内部调动。这样总比走正门容易。据我所知,目前有许多数据工程师走的是这条路。

📌如果你想听一个关于这种转移的故事和一些关于成为数据分析师的见解,请点击这里查看这篇文章。

不要从流媒体和机器学习开始🌊

根据公司的数据成熟度,其中一些概念不是必须具备的。请不要被你在他们的工作邀请中能找到多少时髦词汇所迷惑。《连线》提到去年只有 9%的公司使用机器学习这样的工具。虽然人工智能的采用正在快速增长,但仍有大量公司在基础数据工程方面苦苦挣扎。

作为一名大三学生,在知识方面有一个基线,它将涵盖许多用例,并让你走得很远。如果你学会了如何使用经典的管道框架( Pandas,Spark,dbt )来编写 Python 和 SQL ,你将涵盖大多数分析性批量用例。获得使用分析数据库的经验,例如 BigQuery (或者红移/雪花,但是没有任何免费层用于 playground)并选择一个编排工具。那一侧的气流目前是行业标准。

📌看看这些数据工程师路线图,这应该会给你一个合适的学习路径:

您是否注意到这些路线图是从软件工程基础开始的?

软件工程基础很重要。很多。💾

我们经常忘记,从本质上讲,数据工程师只是另一种类型的软件工程师。

我认为这种疏忽的原因是因为工作已经发生了变化,今天的许多数据工程师来自非软件工程背景(BI 开发人员、数据分析师)。然而,如果你掌握了这些基础知识,你将在软件工程师同行中脱颖而出,并且你将在理解如何交付一个生产就绪的项目上获得优势。

这些包括(并非详尽无遗的清单) :

  • CICD 概念和工具(Github Actions / Jenkins / Circle CI)
  • Git (Github / Gitlab)
  • 测试(单元/集成/系统测试)
  • 作为代码的基础设施(Terraform,Pulumi)
  • Devops (k8s、Docker 等)

📌这里有一篇很好的文章来理解 DevOps 与数据工程师的关系,以及你能从中获得什么。

学习用一个附带项目来构建端到端的东西🗺

拿起一支笔,设计如何从 A 点获取数据、转换数据、使用数据(使用仪表板工具)并基于此做出决策。试着回答这些问题:

  • 我的数据来自哪里?我如何得到它?API?数据库?刮痧?
  • 我如何协调管道?
  • 我将如何消费它?我可以使用哪个仪表板工具?连接是如何工作的?这背后的局限/成本是什么?我如何为我的数据建模?
  • 如果我想更改数据管线中的特征,会发生什么情况?我如何管理访问权限?我如何管理版本?

对高层设计有一个很好的了解,并理解每个组件如何相互交流,是学习如何将你的技能组合转化为可操作的价值的一个很好的开始。

📌查看这篇文章,为数据工程师获取关于副项目想法的灵感。

关注一家云提供商,了解其与其他☁️提供商的相似之处

所有的云提供商在工具方面都有很多相似之处。那些花哨的名字只会让你迷失方向。关注一家提供商,在网上查找你在另一家云提供商上使用的同等服务。虽然有时可能会有显著的功能差异,但即使没有工作经验,您也能掌握该工具如何适合您的端到端管道。

AWS 占据市场主导地位,据统计超过 32 %的市场份额。因此,能够获得第一份工作绝对是一个不错的选择。

📌谷歌与他们的竞争对手保持着一个最新的对照表在这里

瞄准没有太多遗产和合理数据成熟度的年轻公司🏢

基于上一点,你可能想关注一家云公司。作为大三学生这么做有很多原因。

首先,你可能已经花了相当多的时间关注云服务。如果公司有很多旧框架或本地集群,这是您需要掌握的额外知识。

除此之外,您还需要确保您在学习数据现代化堆栈上投入的时间至少能持续几年,然后才会过时。

📌Crunchbase 是快速了解一家公司规模/历史的绝佳资源。查看他们的工程博客和 GitHub 组织也会让你对他们的成熟有另一种感觉。

软技能和硬技能一样重要,甚至更重要。👨‍🏫

“工程很容易,难的是人的问题。”谷歌副总裁比尔·考夫兰

数据工程师不是住在地下室的技术大师。他们被许多利益相关者包围着:商业、软件工程师、数据科学家、数据分析师等等。因此,团队合作沟通是打破这些孤岛的关键。

一旦你进入这个行业,良好的软技能(或者更确切地说是人际技能,因为其中没有任何软肋)将会给你带来强大的优势。

📌以下是一些值得一读的文章,从中可以获得关于数据角色软技能的实用技巧:

结论🚀

不要专注于成为下一个技术巨星。退一步,看到更大的画面,并根据市场趋势和您的经验,专注于您需要加强的方面,以获得您在数据世界中的第一个角色。

第一次失败不要放弃。继续前进,祝你好运!❤️

迈赫迪·瓦扎又名迈赫迪欧·🧢

感谢阅读!🤗 🙌如果你喜欢这个,跟着我上🎥 Youtube ,✍️ 中型 ,或者🔗 LinkedIn 获取更多数据/代码内容!

支持我写作 ✍️通过加入媒体通过这个链接

7 个方便的内置 Python 函数

原文:https://towardsdatascience.com/7-handy-built-in-python-functions-3a32d2aa0301?source=collection_archive---------25-----------------------

你知道如何正确使用这些已经内置在 Python 中的函数吗?

苏珊·艾米丽·奥康纳在 Unsplash 上拍摄的照片

内置 Python 函数

对内置 Python 函数的认识是防止人们使用它们和错过解决编码问题的简单方法的最大障碍。我意识到,花时间复习这些功能来提高我自己的意识对我有好处。因此,这里有一些我最喜欢的快速解释和例子。

1.帮助()

这并不完全是您对内置编码函数的想法,但它可能仍然是最方便的。如果您不带任何参数运行help(),那么您将启动一个交互式帮助系统并得到以下响应:

Welcome to Python 3.6's help utility!

If this is your first time using Python, you should definitely check out the tutorial on the Internet at h[ttps://docs.python.org/3.6/tutorial/.](https://docs.python.org/3.6/tutorial/)

Enter the name of any module, keyword, or topic to get help on writing Python programs and using Python modules.  To quit this help utility and return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type "modules", "keywords", "symbols", or "topics".  Each module also comes with a one-line summary of what it does; to list the modules whose name or summary contain a given string such as "spam", type "modules spam".help>

底部还会出现一个框,供您键入需要帮助的内容。

如果你用一个参数运行帮助函数,那么你将得到关于那个东西的信息,可能是一个模块,函数,类,等等。例如,你可以输入help(int),一个很长的 int 类可用方法列表就会出现。

我想大多数人都知道help()的存在,但是如果你像我一样,那么你会忘记使用它。每当我记得使用它时,我总能学到一些新的有用的东西或功能。

2.abs()

abs()函数返回一个数字的绝对值。如果我在一列数字中搜索,并且寻找那些满足一定数量阈值的数字,无论是正数还是负数,我会经常使用这个方法。这里有一个例子:

>>> A = [-3, -2, -1, 0, 1, 2, 3]
>>> [i for i in A if abs(i)>2][-3, 3]

3.圆形()

舍入确实如您所料,但是能够指定您想要舍入到的位置确实很方便。你知道你可以绕到消极的地方吗?有一个可选参数,用于在要舍入的小数之前或之后添加位数。如果该参数不包含任何内容,则默认值为 0,即四舍五入到最接近的整数。这里有一些例子来感受一下round()函数是如何工作的:

>>> round(12.345)
12>>> round(12.345, 1)
12.3>>> round(123, -1)
120

4.zip()

zip()函数可以将两个 iterables 中的项目配对成元组。例如,如果您有两个列表,您希望将它们组合起来以形成列表中的项目对。这是一个从我一直使用的列表中创建字典的便利技巧。如果你有一个包含你想要的键的列表和一个你想要的值的列表,那么你可以把它们压缩在一起,然后用dict()函数把它们转换成一个字典。这里有一个例子:

>>> a = ['hello', 'ketchup', 'macaroni']
>>> b = ['world', 'mustard', 'cheese']
>>> dict(zip(a, b)){'hello': 'world', 'ketchup': 'mustard', 'macaroni': 'cheese'}

5.枚举()

这一个类似于zip()dict()的把戏,但是这一次也许你有一个条目列表,你想把它变成一个以索引号为关键字的字典。枚举使用项和索引号创建 iterable 对象的元组。然后你可以用dict()包装它,这样你就有了另一种简单的方法从列表中创建字典。下面是一个实际例子:

>>> weather = ['Clouds', 'Sun', 'Rain', 'Snow']
>>> dict(enumerate(weather)){0: 'Clouds', 1: 'Sun', 2: 'Rain', 3: 'Snow'}

6.地图()

map()函数有两个参数,一个函数和一个 iterable。它会将该函数应用于 iterable 中的每一项。我经常将它与 lambda 函数一起使用,作为对列表中的所有项目执行简单的小函数的简单方法。这里有一个例子:

>>> a = [1, 2, 3]
>>> list(map(lambda x: x**2, a))
[1, 4, 9]

我将整个事情包装在一个list()中,因为没有它,只会返回一个迭代器对象,而不是实际的值。

7.过滤器()

与上面的map()类似,filter()函数接受两个参数,一个函数和一个 iterable,但是你也可以将函数设置为 None,它将对项目进行简单的 truthy 或 falsy 检查。如果你传入一个函数,它需要返回布尔值真或假。无论哪种方式,唯一被归还的物品将是真实的。我有时会用这个从列表中过滤掉虚假的条目,只保留真实的条目。这里有一个例子:

>>> a = [0, 1, False, True, '', 'hello']
>>> list(filter(None, a))
[1, True, 'hello']

就像使用上面的map()函数一样,我将整个东西包装在一个list()中,因为如果没有它,只会返回一个迭代器对象,而不是实际的值。

结论

这些只是 Python 内置函数中的一部分,仔细阅读它们也让我对我经常使用的其他库利用这些函数的方式有了更深刻的认识。我在这里只列出了一些对我的编码工作有用的东西,但是你可以在 Python 文档中找到完整的列表。有太多需要探索和寻找的用例。保持冷静,继续编码!

每个数据科学家都应该知道的 7 种超参数优化技术

原文:https://towardsdatascience.com/7-hyperparameter-optimization-techniques-every-data-scientist-should-know-12cdebe713da?source=collection_archive---------14-----------------------

从手动调整到自动超参数优化—带实践示例

图片由穆罕默德·哈桑来自 Pixabay

选择正确的机器学习模型和相应的正确的超参数集对于训练健壮的机器学习模型是必不可少的。机器学习模型的性能随着超参数调整而提高。

超参数是指模型无法学习,需要在训练前提供的参数。超参数调优基本上是指微调模型的参数,这基本上是一个漫长的过程。

在本文中,我们将讨论 7 种超参数优化技术,并给出一些实际例子。

**Hyperparameter Optimization Checklist:
*1) Manual Search
2) Grid Search
3) Randomized Search
4) Halving Grid Search
5) Halving Randomized Search
6) HyperOpt-Sklearn
7) Bayes Search***

预热:

信用卡欺诈检测数据集将用于训练基线逻辑回归模型。逻辑回归模型的其他超参数将使用各种技术进行调整,以提高性能。

(作者代码),信用卡欺诈检测数据集的处理

手动搜索:

不需要专门的库来手动调整超参数,相反,开发人员需要为模型尝试不同的超参数组合,并选择性能最佳的模型。**max_depth, gamma, reg_lambda, scale_pos_weight**是一些可以为 XBGClassifer 模型调整的超参数。

人们可以尝试超参数值的所有组合并为每个组合训练模型,并挑选具有最佳性能的模型。遍历超参数的不同值并评估每个组合也可以是另一种用于超参数优化的手动搜索方法。

(作者代码),手动搜索超参数优化

手动搜索是一个有点繁琐的过程,因此需要不必要的人力。

网格搜索:

网格搜索可以被称为手动搜索超参数优化的自动化版本。Scikit-Learn 库附带了一个 GridSearchCV 实现。GridSearch 不是计算友好的,因为它需要大量的时间来优化,但人们可以不必编写多行代码。

可以将字典格式的训练模型和超参数列表提供给 GridSeachCV 函数,并且其返回执行模型及其得分度量。

(作者代码),网格搜索 CV

随机搜索:

网格搜索尝试超参数的所有组合,因此增加了计算的时间复杂度。基于随机超参数组合的随机搜索训练模型。与网格搜索相比,随机搜索训练若干模型的组合总数较少。

Scikit-Learn 包还附带了 RandomSearchCV 实现。

(作者代码),随机搜索简历

减半网格搜索:

减半网格搜索是网格搜索超参数优化的优化版本。等分网格搜索使用连续等分方法在指定的超参数列表中进行搜索。搜索策略开始在数据的一个小样本上评估所有候选,并使用越来越大的样本迭代地选择最佳候选。

与网格搜索方法相比,减半网格搜索的计算成本更低。Scikit-Learn 库实现了 HalvingGridSearch。

阅读下面提到的文章中的,了解将网格搜索 CV 减半如何将超参数优化速度提高 20 倍。

</20x-times-faster-grid-search-cross-validation-19ef01409b7c> [## 网格搜索交叉验证速度提高 20 倍

towardsdatascience.com](/20x-times-faster-grid-search-cross-validation-19ef01409b7c)

(作者代码),减半网格搜索 CV

减半随机搜索:

减半随机搜索使用相同的连续减半方法,并且与减半网格搜索相比进一步优化。与对半网格搜索不同,它不在所有超参数组合上训练,而是随机选取一组超参数组合。Scikit-Learn 库还提供了 HalvingRandomizedSeachCV。

(作者代码),减半随机搜索简历

Hyperopt-Sklearn:

Hyperopt 是一个用于贝叶斯优化的开源 Python 库,专为具有数百个参数的模型的大规模优化而设计。它允许超参数优化跨 CPU 的多个内核进行扩展。

Hyperopt-Sklearn 是 Hyperopt 库的扩展,它允许自动搜索机器学习算法,并为分类和回归任务建立超参数模型。

阅读这篇文章以了解更多关于 Hyperopt-Sklearn 包的用法和实现。

贝叶斯网格搜索:

贝叶斯网格搜索使用贝叶斯优化技术来模拟搜索空间,以尽快达到优化的参数值。它利用搜索空间的结构来优化搜索时间。贝叶斯搜索方法使用过去的评估结果来采样最有可能给出更好结果的新候选。

Scikit-Optimize 库附带了 BayesSearchCV 实现。

(作者代码),贝叶斯搜索简历

结论:

在本文中,我们讨论了 7 种超参数优化技术,可以用来获得最佳的超参数集,从而训练一个健壮的机器学习模型。最佳模型性能和最佳优化技术之间的权衡是影响某人选择的一个因素。

对于一些组件,可以使用 GridSearchCV 技术。但是当组件数量增加时,可以尝试将网格搜索 CV 或随机搜索 CV 减半,因为它们在计算上并不昂贵。

参考资料:

[1] Scikit-Learn 文档:https://scikit-learn.org/stable/modules/grid_search.html

感谢您的阅读

R 或 Python 中数据争论的 7 个关键操作

原文:https://towardsdatascience.com/7-key-operations-for-data-wrangling-in-r-or-python-6b1177e0a55e?source=collection_archive---------22-----------------------

这两者之间的转换比看起来容易

来自爆裂莎拉·普弗卢格的照片

无论您是数据科学家、数据工程师、数据分析师还是任何类型的开发人员,了解和学习多种编程语言一直都很重要。能够成为一名多才多艺的程序员意味着你的技能永远不会过时,你可以快速适应行业趋势。

也就是说,作为程序员,我们都面临过这种熟悉的困境:

你有一个建立数据管道的大期限,而你的老板一直在问它的预计到达时间。或者你必须做那个机器学习类的项目,离期末报告只有几天了。您希望继续致力于提高您的 R 技能(或 Python ),但是坚持使用您最熟悉的语言会更容易、更快、压力更小。

然而,现实情况是,对于使用 Python 处理数据框时可以做的任何事情,都有一种方法可以在 r 中完成。很多时候,除了语法之外,这种方法非常相似。

在本文中,我们将介绍在典型的数据争论过程中,您可能会遇到的 7 种有用的 Python 操作。但是我们也将一起看看用 r 实现它的等价代码。

我们将使用 Kaggle 上的澳大利亚降雨数据集。我们首先需要加载所需的包,并使用函数将 csv 文件读入数据帧。

Python

import pandas as pddf = pd.read_csv(‘data/weatherAUS.csv’)
df.head(5)

R

library(dplyr)
library(ggplot2)
library(tidyr)
library(pivottabler)
library(reshape2) df <- read.csv(‘data/weatherAUS.csv’)
head(df)

初始 R 数据帧

查找缺失值(NA)

Python

我们可以通过使用布尔检查来检查每一列,看看是否至少有一个NA值存在,从而找到丢失的值。

df.isna().any()

R

在 R 中,我们可以使用sapply函数应用类似的逻辑。

sapply(df, function(x)any(is.na(x)))

对至少有一个 NA 缺失的数据帧列进行布尔检查

替换缺失值(NA)

Python

对于选择的列,我们可以用一个特定的值(比如零)来代替 NAs。

df[‘Rainfall’] = df[‘Rainfall’].fillna(0)

R

在 R 中,我们通过使用dplyr管道%>%来链接数据转换。

df$Rainfall <- df$Rainfall %>% replace_na(0)

删除缺失值(NA)

Python

在这里,我们可以删除至少包含一个 NA 值的所有观察值。

df.dropna(axis=0, inplace=True)

R

df <- df %>% drop_na()

丢失值的结果 R 数据帧被丢弃

应用分组依据和聚集

巨蟒

在 Python 中,我们可以对数据进行分组,并通过将命令链接到相应的数据帧来应用聚合计算。

df[[‘Location’, ‘MinTemp’, ‘MaxTemp’, 
    ‘Rainfall’, ‘WindGustSpeed’]].groupby(‘Location’).mean()

R

这并不奇怪。我们可以使用 dplyr 的group_bysummarise功能。

df %>% group_by(Location) %>% 
           summarise(across(c(‘MinTemp’, ‘MaxTemp’, ‘Rainfall’,  
                               ‘WindGustSpeed’), mean))

R 中聚合集的结果 group by

将自定义函数应用于数据帧列

Python

将函数应用于列的 pythonic 方式是使用applylambda函数。

# define function 
def convertToFahrenheit(c_degrees):
    f = c_degrees * 1.8 + 32
    return fdf[['MinTemp', 'MaxTemp']] = 
df[['MinTemp', 'MaxTemp']].apply(lambda x: convertToFahrenheit(x))

R

使用mutatesapply的 r-方式。Mutate 可用于创建新列或更新现有列。

convertToFahrenheit <- function(c_degrees){
     f <- c_degrees * 1.8 + 32
     return(f)
}df %>% mutate(MinTemp = sapply(MinTemp, convertToFahrenheit),
              MaxTemp = sapply(MaxTemp, convertToFahrenheit))

R 中的结果数据帧具有最小和最大温度的突变列

创建数据透视表

Python

对于那些熟悉 Excel 的著名数据透视表的人来说,我们可以很容易地在熊猫数据帧上这样做,以快速总结和汇总具体数据。

pd.pivot_table(data=df,
               values=’WindGustSpeed’,
               index=’Location’,
               columns=’WindGustDir’,
               aggfunc=’mean’,
               fill_value=0)

R

虽然不那么直观,但我们可以使用 reshape2 的dcast功能来实现。

dcast(data=df, formula=Location ~ WindGustDir,   
      value.var='WindGustSpeed', fun.aggregate=mean, fill=0)

R 中的结果数据透视表

检测数据集中异常值的存在

Python

虽然有许多方法可以识别异常值,但我们可以用 pandas 数据框架来做这件事的一个常用方法是为我们感兴趣的列绘制一个箱线图。

df.boxplot(column=[‘Rainfall’])

R

谈到探索性数据分析和可视化,R 的ggplot2包允许我们轻松地生成一个箱线图。

ggplot(df, aes(x=Rainfall)) + geom_boxplot()

R 中降雨量数据的结果曲线图

摘要

上面的例子并没有穷尽 R 和 Python 中可以对数据帧执行的所有操作。但希望它能让你看到克服犹豫是多么容易,也许在你的下一个数据争论任务中尝试一种新的语言。

对于接下来的步骤,如果你真的很习惯使用 Python 中的 pandas ,挑战自己使用类似的dplyrtidyrreshape2 包**

感谢您的阅读。希望这对您有所帮助,如果您有任何问题或对任何其他类似的具体并行系列操作感兴趣,请告诉我。

7 个月远程辅导的 7 个经验教训

原文:https://towardsdatascience.com/7-lessons-learned-from-7-months-of-remote-mentoring-b9cebf0cf222?source=collection_archive---------47-----------------------

为什么您应该接受数据科学领域的学员

照片来自 Unsplash 上的约书亚·内斯

如果你一直关注我的旅程,你会注意到这不是我第一次分享我的指导经验。去年,我开始指导对数据科学或软件工程感兴趣的年轻人。大多数互动都是 100%远程的,包括视频电话和电子邮件。当你没有和某人面对面时,发展一种信任的关系,让你觉得和他谈论你的职业和生活很舒服是很难的。当我开始指导时,我发现这是一个平衡的行为,既要有足够的沟通来保持接触,又不能太多来压倒任何一方。在过去的七个月里,我学到了很多发展这种关系和产生积极结果的经验。我想分享过去七个月的七个教训和我收到的反馈。

1.制定时间表

这似乎很简单,但我学到的第一件事是,与你的学员和导师保持一个时间表是多么重要。保持一致的时间表将有助于建立你们会面的节奏。有了这种一致性,也就更容易为每次会议做准备。你会知道你下一次打电话的时间,并且可以带着不同的话题、问题等等来参加聚会。

在我们第一次见面时,我问我的学员她更喜欢哪种节奏。她想每周见一次面,还是每隔一周,还是隔一段时间见一次面?对我们来说,我们发现最好一周见一次面。在她需要另一个电话的几个星期里,她会主动提出要求。这样,我们可以定期见面,并根据需要,包括更多的电话讨论问题或她心中的问题。

2.在谈话中全神贯注

制定时间表后,我和我的学员开始每周会面一次。我们会在下午花 30 分钟谈话,这些谈话最重要的方面是我们双方都参与讨论。参与不仅仅意味着与你的学员交谈,还意味着积极倾听和提问。就问题和方法、职业发展或学习提出发人深省的问题。这类问题有助于学员的自我发现阶段,让他们停下来思考如何回答眼前的问题。

当我根据我的学员的讨论向她提问时,我对没有得到答案持开放态度。我知道她不能马上回答一些问题,这让她在我们再次见面之前有所思考。在收到她的反馈后,她说这些发人深省的问题引发了一些关于她在职业生涯中如何进步的大讨论和自我反思。

3.从不同的角度看问题

我不知道所有的事情,她也不知道,但我仍然可以帮助分享她的问题的不同观点。我们经常谈论的是她在工作或学校面临的任何问题。我给了我的学员一个不受评判的安全空间,在这里她可以谈论她面临的问题,以及如何解决这些问题。在这些谈话中,我会倾听她,理解她所面临的问题,然后讨论她如何解决这个问题。指导学员完成这些自我发现阶段可以帮助他们理解看待问题的不同方式,并确定如何最好地解决问题。

4.制定目标和时间表

在导师制结束时,我向我的学员征求了一些反馈,这些反馈将有助于她在下次我指导某人时进行考虑。我从我的学员那里收到的一个反馈领域是关于目标和时间表的。她表示,这将有助于在指导之初制定 1-3 个目标,然后与你的学员一起制定完成这些目标的时间表。有了目标和相关的时间表,在你预定的会议中就可以进行更有指导、更集中的讨论。

我计划将与我的学员一起制定目标和时间表纳入我的下一次辅导活动。看到我的导师如何在我们的一些会议中纳入目标,我同意我的学员。目标和时间表在学员-导师关系中是有益的。

5.探索其他领域

当我开始辅导时,我寻找对 STEM 或数据科学感兴趣的学员。我的搭档是一名商业实习生,但他正在学习编程。她对成为公司的软件工程师意味着什么以及日常活动是什么感兴趣。在我看来,我只能通过电话告诉一个人这么多,而且完全是远程参与让这有点困难,但不是不可能。

允许学员探索其他感兴趣的领域可以帮助他们了解自己和自己的兴趣。我和我的学员通过三种方式探索软件工程和数据科学的范围。这三种方法是:(1)安排会议讨论她在这个话题上的任何问题,(2)工作跟踪,以及(3)面试练习。第一个不言自明。在我们的通话中,我谈到了我的工作,并回答了她提出的任何问题。我和她讨论了我的学校教育,我是如何决定选择工程学和数据科学的,以及我在寻找道路时所做的转变。

我做的下一件事是给她找一个经理,让她跟随一个软件和数据科学团队工作。这一经历让她认识了团队领导,在一周内参加了几次会议,并进行了退场讨论,询问任何遗留问题。通过这次经历,她能够更深入地了解软件工程师和数据科学家的日常工作。她也能够获得一些敏捷过程的经验,这是她在学校里听说过但没有经历过的。有时间探索公司的另一个领域让她更深刻地理解了为什么她目前的角色是至关重要的,以及它如何与其他团队联系在一起。

6.对寻求学员或导师持开放态度

无论你是在寻找学员还是导师,如果你想要的话,你都应该敞开心扉去寻求。不要认为你的导师必须比你年长或更有经验。任何人都可以教你一些你以前不知道的东西,给你展示一个看待你的问题的新视角。当我向我的经理展示我从我的一名学员那里得到的反馈时,他提到他从她的作品中学到了一些东西,并带走了一些积极的东西,他将与自己一起改变。开放地询问学员或导师,记住,他们可以是任何能让你更多了解自己的人。

作为一名数据科学家,我做的最好的一件事就是寻找一位导师。我的导师教会了我如何从商业价值的角度处理数据科学项目,如何在不同的会议上展示我的工作,以及如何获得对我工作的反馈。我觉得如果我当时没有寻求导师,我会进步得更快。

7.寻求反馈

我和我的学员从这次互动中学到的最大教训是,征求反馈是多么有价值。无论你是想在学校、工作还是其他地方得到建议,总会有人提供见解,告诉你哪些地方做得好,哪些地方做得不好,以及你可以改进的地方。我不是说你需要把每件事都当成事实,但是得到反馈会让你梳理它,并决定你将从中吸取什么来继续工作。当试图理解下一步该学什么时,反馈是非常有益的。

最后的想法

在指导一名实习生七个月后,我决定继续指导。这段经历教会了我和我的学员很多关于如何跨越你的职业生涯,克服不同的障碍,解决日常问题。回想这段经历,我想改变的主要事情是问她实习的目标以及她希望完成什么。至此,以下是我在 7 个月的指导中总结出的 7 条经验:

  1. 制定时间表
  2. 在谈话中全神贯注
  3. 从不同的角度看问题
  4. 制定目标和时间表
  5. 探索其他领域
  6. 对寻求学员或导师持开放态度
  7. 寻求反馈

你在远程指导个人时学到了什么?

如果你想阅读更多,看看我下面的其他文章吧!

考虑不用 AI

原文:https://towardsdatascience.com/7-lessons-learned-working-on-ai-and-data-professionally-a9b533ee5295?source=collection_archive---------15-----------------------

给数据科学家的专业建议

斯科特·格雷厄姆Unsplash 上拍照

答在从事了近六年的机器学习、人工智能和开发工作后,我列出了这些年来我从成功和失败的项目中获得的七点见解。这里的中心主题是,尽管学习了无数的模型和技术,但作为一名有效的人工智能专业人员,如何尽可能地避免复杂性。推动商业价值是关于解决紧迫的问题,而不是最先进的。

更具体的说,做生意总有需要注意的事项。从来没有一个问题需要解决。您可以改进现有的模型,部署一个新的模型,重做一个特定的步骤,或者做其他事情。经验告诉我,人们倾向于陷入模型,忘记其他一切——这通常是最重要的部分。

让你对我有更多的看法,自 2015 年以来,我一直断断续续地与人工智能、企业和研究合作,要么领导人工智能产品或计划,要么是唯一的开发者。这对我的职业发展有两个主要因素:(1)我必须自己解决大部分问题,以及(2)大多数时候,我与那些对人工智能真正能做什么或能从它那里得到什么一无所知的人一起工作。

我们走吧:

摘要

  1. 简单款最好
  2. ResNet-50 仍然是最好的网络
  3. 生活中的一切都是可以改善的。
    百万美元的问题是首先改进什么
  4. 模型是<工作的 10%
  5. 你的结果和你的代码一样好
  6. 其实避开 AI
  7. 没有指标,就没有收获

#1 简单的模型是最好的

并非所有的问题都是平等的。有些需要神经网络来解决。XGBoost 可以驯服别人。然而,使用决策树逻辑回归线性回归可以合理地解决一组特殊的问题。

在学习了周围所有奇妙的技术之后,总是去寻找科幻小说中的新成员是很有诱惑力的——但是不要。相反,从你可以使用的最简单的模型开始,然后看看效果如何。如果线性插值解决了你的问题:坚持下去。去花里胡哨不会得到任何额外的东西。

在实践中,更简单的方法不会像其他方法那样解决很多问题,但无论何时,它们都有优势。模型越简单,就越容易解释它是如何工作的,解释它如何符合数据,解释它的预测的原因,调整它,等等。只有好处,真的。

然而,相反的是错误的。使用花哨的高斯过程或最先进的网络不会带来额外的好处。只要有可能,就使用线性插值。你的第二个尝试是逻辑回归,决策树是第三个。一切都将是对上述任何功能的妥协。

要点:你花了几个月时间学习复杂的分类器、校准和预处理,找出最不酷的方法是最好的。

#2 ResNet-50 仍然是最好的网络

假设你一直在研究神经网络。忘掉所有那些每天在代码为的报纸上发布的新奇的新网络。所有的铃铛和哨子都是铃铛和哨子。我们都需要一个久经考验、行之有效的模型,这个模型几乎可以在任何开箱即用的东西上运行良好。

ResNet 恰恰是:屡试不爽。

神经网络的现实是,它们非常不可靠,而且调整起来非常耗时。然而,有一个简单的实验你可以在家尝试。获取你训练过的任何网络。假设它在某些指标上达到了 89%。再训练一次。又是 89 还是 88?可能 90?现在,再次重新训练最后一个网络(相同的参数,最后一个检查点)。可能是你得到了 91%。

在我几乎每天与训练网络一起工作的三年经验中,我总是在项目时间表中选择一天来寻找新的损失、激活函数、新的花式层和最新的亚当杀手来尝试这个问题。想知道我学到了什么吗?几乎 95%的情况下,我用交叉熵/L2、ReLU、plain-old-convolutions 和 Adam 得到的结果都差不多(1%的波动)。

我们应该永远不尝试新事物吗?当然不是。然而,请记住,坚持使用久经考验的方法永远是最安全的选择。

#3 生活中的一切都可以改善。最重要的问题是首先要改进什么

老实说,这可能是我在这篇文章中得到的最重要的提示。

你可以总是改进模型。你可以总是让事情跑得更快。问题是先做什么

我已经记不清有多频繁地看到会议讨论不存在的可伸缩性问题,或者计划减轻一些永远不会到来的潜在变化。现实是大多数人并不需要 10%更好的模型——他们需要 10%更多的客户。

花几天时间调整这些我们称之为网络的疯狂野兽是令人愉快的。然而,这很少是商业价值所在——或者获得额外 10%的最佳方式。以数据为中心的人工智能运动在这里证明,收集多一点的数据比盲目寻找新模型更有效。

当开始一个人工智能项目时,最紧迫的问题是…拥有一个人工智能。之后,下一个关键点是获取更多数据或将其投入生产。一旦这两个问题都解决了,其他地方缺乏人工智能是最有可能的新的紧迫问题。将人工智能添加到普通产品中几乎总是比改进现有管道有更高的投资回报率。

坦率地说,通常情况下,商业人士对人工智能到底是什么或它能做什么几乎没有任何概念——他们肯定会想象它在做超人的壮举。所以让你的手离开模型,教育你周围的人是值得的。那个有免费课程。如果有人反抗,不要推。去别的地方。这家公司做 AI 还不成熟。

要点:认真审视你所做的和拥有的一切。最薄弱的环节是什么?什么如果改变,会带来最大的价值?改进迭代。

#4 车型是< 10% of the Work

Continuing from the previous tip, in my experience, improving the model is often a low-priority task. However, in good operating conditions, you might be getting a constant influx of data to retrain it every week and, voilá ,比较好的车型。

如果你的渠道没有这样的反馈循环,也许你可以在下一次会议上提出这一点。如果这太遥不可及,也许您可以投资于更好的数据扩充策略,或者简单地投资于如何及时获取更多数据。

然而,更常见的是,附近还有另一个问题,还没有人工智能解决方案,可以提供比改进其他一些已经启用人工智能并正在运行的产品更大的商业价值——新问题意味着清理数据,查看数据,找到模型适合的位置,训练模型,将其连接到生产中,看看会发生什么……

要点:尽管我们愿意花时间改进模型,但真正的商业价值往往在其他地方找到。接受这一点是成为一名有效的人工智能专家最显著的变化之一。

#5 你的结果和你的代码一样好

人工智能对常见错误有很高的容忍度,特别是关于数字导向的方法,如梯度助推器,支持向量机和神经网络,如糟糕的数学或丢失步骤。例如,假设您忘记了规范化您的输入,模型将从未规范化的数据中学习。

问题是,人工智能模型通常有两条独立的代码路径:训练和推理。假设您的代码在其训练代码中有一个数学错误,但在其推理脚本中没有。结果是灾难性的。该模型将适合损坏的数据,显示良好的指标,并在稍后向客户端泄漏虚假的输出。也许你得到了一个错误的自定义数据扩充,使你的模型加倍努力地解码那些实际上永远不会出现的条目。

有许多方法缺陷隐藏在训练和推理脚本中。缺少规范化、不正确的数据类型、不完整的扩充等。确保你确信一切都是正确的,并且有直观的方法来检查一切。

最后但同样重要的是:90%的准确率并不是工作代码的同义词。准确性代码本身可能是一个错误。不要相信任何人。

要点:现在你的代码中可能有一些可怕的错误没有被注意到,因为它们不足以推翻系统。他们将在生产中脱颖而出。认真对待测试。

#6 事实上,避免人工智能

是的,我说了。

说实话,有些问题可以用传统代码来处理。代码是可读的、确定的、可理解的,最重要的是,精确地工作。当我们对一个数组排序时,我们不是在处理一个有 89%机会排序的数组。代码工作

当然,有些问题不能只靠代码来推理,比如物体检测或者图像生成。然而,对于所有我们可以用代码做的事情:用代码做。

人工智能的主要问题是它永远不会完美。一个 90%准确的模型仍然有 10%的时间是错误的,而且你无法控制错误发生的时间。你用的人工智能越多,出错的空间就越大。

假设你用两个模型预测年龄和性别,每个模型都有 90%的准确率。有 81%的可能性两个模型都有效,18%的可能性至少有一个会失败,1%的可能性两个都会失败。这归结为五分之一的用户得到了错误的预测。如果准确率为 80%,将近五分之二的人会得到错误的输出。

**顺序使用 AI 是一场噩梦。假设在预测年龄和性别之前,您使用对象检测找到一幅图像中的所有人,准确率为 90%。正确归类某人的几率现在约为 73%。最重要的是,有 10%的可能性这个人甚至没有被找到。

缩放多人,正确检测+分类 2、3、4、5 人的几率分别为 53%、38%、28%、20%。为了达到五个人 80%的可靠性,所有模型都需要高达 98.52%的准确率。这远远超过了 ImageNet 上最先进的顶级准确性——这是当今人工智能中最过度研究和修补的问题。

要点:永远考虑用非人工智能的方法来解决你的问题。例如,对于分割任务,您总是可以使用图像处理操作来改进/连接/丢弃发现。此外,在处理视频时,考虑利用以前的帧结果作为备份。这些微小的变化会对减轻您无法控制的小错误产生很大的影响。

#7 没有指标,就没有收获

在整篇文章中,应该清楚的是,与人工智能和数据打交道并不是为了展示你令人难以置信的机器学习能力或你对神经网络的掌握。相反,它是通过外科手术般地将人工智能原理应用于非常规任务来驱动商业价值。在这种背景下,还缺少一点:如何衡量商业价值?**

大多数模型都有一些精确的衡量标准:正确预测的数量、发现的对象、检测到的关节等。然而,这些都是局部测量:它们判断模型在解决其任务时的局部影响。另一方面,商业价值来自于对全球价值的影响,如利润、转换、流失等。

追踪单一干预(人工智能与否)对全球商业变量波动的贡献非常困难。在这方面,通常有一些中间地带可以作为业务价值的指标。对于任何人工智能企业的成功来说,最重要的是确定它应该跟踪的相关变量,并表明它对这些变量有一定的驱动力。

在这种情况下,保持一些可行的基线方法进行比较也是至关重要的。例如,假设您正在跟踪销售数字。由于季节性事件,销售额会上升或下降。如果没有并行运行的基线,有效地显示任何上升或下降都是由于应用程序上的一些修改,这是非常重要的。

回想一下,我之前说过,大多数企业不需要额外的 10%的准确率,他们需要多 10%的客户。有人会说,10%更准确的解决方案可能会推动 10%(或更多)的新客户获得用户,这是有可能的。然而,这只能通过展示这种关系的坚实的度量工作来论证。

比人工智能本身更重要的是如何衡量它对应用/业务/用户生活的影响。准确性是一个很好的局部度量,但是它不能代表商业价值。建立一个人工智能管道需要钱,保持它的运行需要更多的钱。一个人工智能团队应该能够有效地展示他们的产品带来的价值。

离开人工智能一段时间后,我在科技领域学到的最重要的一课是,伟大的专业人士是由共享的知识组成的。如果没有从任何地方学到一些技巧,没有人能独自到达那里。正是通过给予和被赋予知识,我们才能茁壮成长——这是我写作的主要原因:我每天学到的小东西不应该只属于我或少数人。知识应该共享。

同样,我邀请你,读者,也分享你自己的发现,或者在这里作为一个评论,或者成为一个作家。在你的职业生涯中,哪些技巧与你有关?你认为哪些是垃圾,为什么?代替他们做什么?

暂时就这些了。如果你对这篇文章有任何问题,欢迎评论或联系我。你也可以订阅我在你的收件箱这里发布的消息。你也可以通过请我喝杯咖啡:)来直接支持我

如果你是中新,我强烈推荐订阅。对于数据和 IT 专业人员来说,中型文章是 StackOverflow 的完美组合,对于新手来说更是如此。注册时请考虑使用我的会员链接。

感谢阅读:)

7 个帮助解决时序问题的库

原文:https://towardsdatascience.com/7-libraries-that-help-in-time-series-problems-d59473e48ddd?source=collection_archive---------1-----------------------

自动化时间序列问题!

时间序列问题是数据科学中最难解决的问题之一。像 ARIMA、萨里玛这样对时间敏感的传统方法很棒,但最近由于需要和被证明成功的跟踪记录,它们在很大程度上伴随着像 XGBoost、LigthGBM 等对时间不敏感的机器学习算法。然而,使用这些方法需要大量的数据准备,如消除周期性、从目标中消除趋势以及工程特征,如滚动窗口特征、滞后特征等。准备最终的数据集。

作者创建的图像

为了获得更好的准确性,我们需要开发复杂的模型,这项工作可能相当广泛。因此,最好利用机器学习社区已经开发/创建的一些自动化。下面是一些真正有助于解决时间序列问题的软件包。

1.tsfresh:

  • tsfresh 是一个神奇的 python 包,可以自动计算大量的时间序列特征。

让我们通过航空乘客的标准数据集来理解如何实现 tsfresh:

基本实现的代码

数据需要/将被格式化为如下所示的格式:

数据帧的输出

使用 tsfresh 提取特征

特征输出

  • 从上面的输出中,我们看到创建了大约 800 个特征。tsfresh 还有助于基于 p 值的特征选择。查看文档了解更多细节。
  • 这里有一个使用 tsfresh 计算的所有特性的详尽列表,可以在这里找到。

Github:https://github.com/blue-yonder/tsfresh

文档:https://tsfresh.readthedocs.io/en/latest/index.html

2.自动打印:

AutoTS 是一个自动化的时间序列预测库,可以使用简单的代码训练多个时间序列模型。AutoTS 的意思是自动时间序列。

图书馆标志

该库的一些最佳特性是:

  • 它利用遗传规划优化寻找最优的时间序列预测模型。
  • 提供置信区间预测值的上限和下限。
  • 它训练不同的模型,如朴素模型、统计模型、机器学习模型以及深度学习模型
  • 它还可以执行最佳模型的自动组装
  • 它还具有通过学习最佳 NaN 插补和异常值去除来处理杂乱数据的能力
  • 它可以运行单变量和多变量时间序列

让我们以苹果股票数据集为例,更详细地了解一下:

加载、预处理和绘制数据的代码

简单的绘图来查看数据

设置自动运行

这将运行数百个模型。您将在输出窗格中看到运行的各种模型。让我们看看这个模型是如何预测的:

生成和打印预测的代码

40 天预测

绘制训练和测试(预测)数据的代码

Github:https://github.com/winedarksea/AutoTShttps://github.com/winedarksea/AutoTS

文档:https://winedarksea . github . io/AutoTS/build/html/source/tutorial . html

3。先知:

图书馆标志

Prophet 是由脸书的研究团队开发的一个著名的时间序列包,于 2017 年首次发布。它适用于具有强烈季节性影响的数据和几个季节的历史数据。它是高度用户友好和可定制的,只需很少的努力就可以设置好。它可以处理以下事情,但不限于:

  • 每日季节性,
  • 节日效应
  • 投入回归量

让我们看一个简单的例子:

使用先知库的代码

大约 2 年的预测

我们还可以绘制如下趋势图和季节性图:

趋势和季节性图

最后,我们还可以看到预测以及所有的置信区间

预测输出

Github:https://github.com/facebook/prophet

文档:https://facebook.github.io/prophet/

4。飞镖:

Darts 是另一个帮助操作和预测时间序列的 Python 包。语法是“sklearn 友好的”,使用 fit 和 predict 函数来实现您的目标。此外,它还包含从 ARIMA 到神经网络的各种模型。

这个包最好的部分是它不仅支持单变量,还支持多变量时间序列和模型。该库还使得回测模型和组合几个模型和外部回归的预测变得容易。让我们举一个简单的例子来理解它的工作原理:

作为系列加载后查看数据

拆分系列并获得预测

绘制预测图

Github:https://github.com/unit8co/darts

文献:https://unit8co.github.io/darts/README.html

5。AtsPy:

AtsPy 在 Python 中代表自动化时间序列模型。该库的目标是预测单变量时间序列。您可以加载数据并指定要运行的模型,如下例所示:

使用 AtsPy 库的代码

该软件包提供了一套完全自动化的不同模型。以下是可用型号的屏幕截图:

Github:https://github.com/firmai/atspy

6。卡茨:

Kats 是脸书研究团队最近开发的另一个库,专门用于处理时间序列数据。该框架的目标是为解决时间序列问题提供一个完整的解决方案。使用该库,我们可以执行以下操作:

  • 时间序列分析
  • 模式检测,包括季节性、异常值、趋势变化
  • 产生 65 个特征的特征工程模块
  • 对时间序列数据建立预测模型,包括 Prophet、ARIMA、Holt-Winters 等。

该库似乎很有前途,并且刚刚发布了它的第一个版本。一些教程可以在这里找到。

Github:https://github.com/facebookresearch/Kats

7.sktime:

顾名思义,Sktime 库是一个统一的 python 库,用于处理时间序列数据,并且与 scikit-learn 兼容。它有时间序列预测、回归和分类的模型。开发的主要目标是与 scikit-learn 进行互操作。

它可以做几件事,但仅举几个例子:

  • 最先进的模型
  • 能够使用 sklearn 的管道
  • 模型调整
  • 模型的组合

sktime 的路线图看起来非常有前景,并且有许多开发正在进行中:

  1. 多元/面板预测,
  2. 时间序列聚类,
  3. 时间序列注释(分段和异常检测),
  4. 概率时间序列建模,包括生存和点过程。

如果有一个特定的库/包,你想让我做一个详细的教程,请做评论,让我知道。此外,如果有任何其他精彩的时间系列包可以添加到这个列表中,请不要犹豫,评论。感谢您抽出时间阅读!

我的其他与时间序列相关的文章:

  1. https://towards data science . com/7-statistical-tests-to-validate-and-help-to-fit-ARIMA-model-33c 5853 e2e 93
  2. https://towards data science . com/20-simple-yet-powerful-features-for-time-series-using-date-time-af9da 649 e5dc

关注我上 Twitter LinkedIn。你也可以通过 pratikkgandhi@gmail.com 联系我

想成为 中等会员 享受无限制阅读文章,请注册成为会员。Medium 将与我分享一部分给使用以上链接注册的成员!谢了。

7 个你可能不知道存在的模特

原文:https://towardsdatascience.com/7-models-on-huggingface-you-probably-didnt-knew-existed-f3d079a4fd7c?source=collection_archive---------7-----------------------

让我们探索一些非常规的 NLP 模型和架构

HuggingFace 的模型中枢上的可用任务( source )

HugginFace 凭借他们的变形金刚数据集库,已经在每个 NLP(自然语言处理)从业者的脑海中浮现。2020 年,随着模型中枢的引入,我们看到了这两个库中的一些重大升级。对于大多数人来说,“使用 BERT”与使用 HF 的变形金刚库中可用的带权重版本同义。

在这篇文章中,我将重点介绍一些模型和任务,huggingface 生态系统现在支持这些模型和任务(变形金刚+数据集+模型中枢),但没有 BERT 那么受欢迎。

BlenderBot

Blenderbot 由脸书 AI 于 2020 年推出,是一款开源的最先进的聊天机器人。它声称拥有良好的对话技巧,比如在同一个系统中融合移情、知识和个性。融合这些技能是一项艰巨的挑战,因为系统必须能够在适当的时候在不同的任务之间切换,比如当一个人从开玩笑变成严肃时调整语气。此处提供了加载该模型的说明

blenderbot 对话示例(来源

LXMERT

这是一个学习视觉和语言连接的变压器框架。它用于视觉 QnA,其中答案将基于图像给出。然而,HuggingFace 只有模型实现,图像特征提取必须单独进行。本演示笔记本展示了一个端到端的使用示例。

VisualQnA( )的样本输入图像

基于此图像作为输入,可以向 LXMERT 模型提出类似“显示器的形状是什么?(长方形)”或者“猫在哪里?(办公桌)”

DPR

密集段落检索(DPR)是一套用于最新开放领域问答研究的工具和模型。它由 facebook 开源,这里可用的预训练模型是在谷歌的自然问题数据集上训练的。这组模型执行从一组可用段落中检索问题答案的任务。为了在维基百科文章上执行通用 QnA,维基百科数据集在 HF 上可用,具有预先计算的嵌入。当使用数据集库时,对任何自定义数据集的训练也很简单,并且可以通过向数据集添加 faiss 索引来完成。

破布

facebook 的检索增强生成(RAG)模型通过与 seq2seq 模型相结合,建立在密集段落检索(DPR)模型之上。从粗略的意义上来说,提取的段落被用来提出一个更易于人类阅读、更具生成性的答案。HuggingFace 有一个基于 streamlit 的交互式演示来试用这个模型。该演示还包含一个生成问题的示例。

RAG 的演示输出()

塔帕斯

Tapas 是由 google 引入的,作为一种架构,通过以明文而不是任何特定的结构化格式提供输入查询,从表格数据中找到答案。

TAPAS 的样本输出(来源)

TAPAS 模型在许多不同的数据集上进行微调,许多社区提供的和谷歌提供的模型在 HF 模型中心上可用。去年,我们也看到了这个魔术被 OpenAI 的 GPT-3 所表演,该模型将英语查询转换成 SQL 查询。

转述

解释是我个人用来扩充数据的一种技术。这种模型将给定的输入句子转换成另一个句子,同时保持(或试图保持)原始句子的含义。下面是一个释义示例,可以在这里尝试

飞马座分析器的样本输出(来源

零炮分类

零炮分类是一种简洁的技术,它允许模型从任何给定的预测类集中进行选择,而无需实际训练模型。这项技术因 GPT-3 而变得非常流行,现在也可以在 huggingface 的工具包中找到。虽然预测不如定制的训练模型准确,但当标记的训练数据不可用或难以收集时,它非常有用。在这里可以尝试各种预训练模型

零镜头分类示例(来源

那都是乡亲们!

感谢您的阅读。我希望你喜欢它并且发现一些新的东西。如果我犯了什么错误,请在评论中告诉我。也分享一下 HF 上可以添加到此列表中的任何其他型号。如需讨论,请通过 twitter 联系我。

2021 年成为数据科学家最值得学习的 7 项技能

原文:https://towardsdatascience.com/7-most-recommended-data-science-skills-to-learn-in-2021-ac26933f0e8a?source=collection_archive---------4-----------------------

由世界上一些最大的数据领导者推荐

裘德·贝克在 Unsplash 上的照片

介绍

新年快乐

为了揭开 2021 年的序幕,我想与世界上一些最大的数据领导者分享七项最受推荐的数据科学技能,这些领导者包括数据负责人& Analytics @ Google、工程高级总监@ NVIDIA 以及数据科学和工程副总裁@ Wealthsimple。

虽然这篇文章可能更有趣,但我觉得这篇文章分享了一个有价值的观点。我特别不是指从招聘信息中搜集的数据,因为从我的经验来看,职位描述和实际工作之间似乎有很大的差距。

你可能会注意到这七项技能中没有一项与机器学习或深度学习有关,这不是一个错误。目前,对建模前和建模后阶段使用的技能有更高的需求。因此,最推荐学习的七项技能实际上与数据分析师、软件工程师和数据工程师的技能重叠。

我写了一篇文章专门讲为什么不应该先学机器学习——你可以在下面看看:

说了这么多,让我们深入了解一下2021 年最值得学习的七项数据科学技能:

1) SQL

SQL 是数据世界中的通用语言。无论您是数据科学家、数据工程师还是数据分析师,您都需要了解 SQL。

SQL 用于从数据库中提取数据、操作数据和创建数据管道,本质上,它对于数据生命周期中的几乎每个预分析/预建模阶段都很重要。

开发强大的 SQL 技能将使您的分析、可视化和建模更上一层楼,因为您将能够以高级方式提取和操作数据。此外,对于处理数 Pb 数据的公司来说,编写高效的查询变得越来越重要。

这里有一些我最喜欢的学习 SQL 的资源:

2)数据可视化和讲故事

如果您认为创建数据可视化和讲故事是数据分析师的特定职责,请三思。

数据可视化简单来说就是直观呈现的数据——可以是图表的形式,但也可以用非常规的方式呈现。

数据故事将数据可视化提升到了一个新的高度— 数据故事指的是你“如何”传达你的见解。把它想象成一本图画书。一本好的图画书有好的视觉效果,但它也有吸引人的和强有力的叙事来连接视觉效果。

发展您的数据可视化和讲故事的技能是必不可少的,因为作为一名数据科学家,您总是在推销您的想法和模型。当与其他不精通技术的人交流时,这一点尤为重要。

这里有一些我最喜欢的学习数据可视化的资源&讲故事:

3) Python

从我的互动来看,Python 似乎是学习 R 的首选编程语言。这并不意味着如果你使用 R,你就不能成为一名数据科学家,而是意味着你将使用一种不同于大多数人使用的语言工作。

学习 Python 语法很容易,但是您应该能够编写高效的脚本并利用 Python 提供的大量库和包。Python 编程是操作数据、构建机器学习模型、编写 DAG 文件等应用程序的构建模块…

这里有一些我最喜欢的学习 Python 的资源:

4)熊猫

可以说 Python 中最重要的库是 Pandas,它是一个用于数据操作和分析的包。作为一名数据科学家,无论是清理数据、探索数据还是操作数据,您都会一直使用这个包。

Pandas 已经成为一个如此流行的包,不仅因为它的功能性,还因为数据帧已经成为机器学习模型的标准数据结构。

这里有一些我最喜欢的学习熊猫的资源:

5)Git/版本控制

Git 是技术社区中使用的主要版本控制系统。

如果那没有意义,考虑这个例子。在高中或大学,如果你曾经不得不写一篇文章,你可能已经保存了不同版本的文章。例如:

📂期末论文
└📁散文 _v1
└📁论文 _v2
└📁论文 _ 决赛
└📁论文 _ 决赛决赛
└📁论文 _ 正式定稿

玩笑归玩笑,Git 是一个服务于相同目的的工具,除了它是一个分布式系统。这意味着文件(或存储库)存储在本地和中央服务器中。

Git 非常重要,原因有几个,其中一些是:

  • 它允许您恢复到旧版本的代码
  • 它允许您与其他几位数据科学家和程序员并行工作
  • 它允许你使用和其他人一样的代码库,即使你正在做一个完全不同的项目

这里有一些我最喜欢的学习 Git 的资源:

6)码头工人

Docker 是一个容器化平台,允许你部署和运行应用程序,比如机器学习模型。

越来越重要的是,数据科学家不仅要知道如何构建模型,还要知道如何部署它们。事实上,现在很多职位招聘都需要一些模型部署方面的经验。

学习如何部署模型之所以如此重要,是因为模型在与它所关联的过程/产品实际集成之前不会交付任何商业价值。

这里有一些我最喜欢的学习 Docker 的资源:

7)气流

Airflow 是一个工作流程管理工具,可让您自动执行工作流程。更具体地说,Airflow 允许您为数据管道和机器学习管道创建自动化工作流。

Airflow 功能强大,因为它允许您生产您可能想要用于进一步分析或建模的表格,它也是一种可以用来部署机器学习模型的工具。

这里有一些我最喜欢的学习气流的资源:

感谢阅读!

我希望这有助于指导你的学习,给你新的一年一些方向。这需要学习很多东西,所以我肯定会选择一些你听起来最感兴趣的技能,然后开始学习。

请记住,这更多的是一篇有轶事经验支持的自以为是的文章,所以从这篇文章中获取你想要的。但一如既往,我祝你学习一切顺利!

不确定接下来要读什么?我为你选了另一篇文章:

又一个!

特伦斯·申

与 Python 熊猫的 7 个必须知道的数据争论操作

原文:https://towardsdatascience.com/7-must-know-data-wrangling-operations-with-python-pandas-849438a90d15?source=collection_archive---------7-----------------------

综合实践指南

娜奥米·赫伯特在 Unsplash 上的照片

Pandas 是一个非常流行的数据分析和操作库。它提供了许多功能来将原始数据转换为更有用或更适合数据分析和机器学习管道的格式。

现实生活中的数据几乎总是杂乱无章的,需要进行大量的预处理才能转换成整洁的格式。由于其多功能和强大的功能,熊猫加快了数据争论的过程。

在本文中,我们将讨论在典型的数据争论过程中可能会遇到的 7 种操作。

我们将使用 Kaggle 上的墨尔本房产数据集作为例子。我们首先使用 read_csv 函数读取 csv 文件。

import numpy as np
import pandas as pdmelb = pd.read_csv("/content/melb_data.csv")print(melb.shape)
(13580, 21)melb.columnsIndex(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG','Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car','Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude','Longtitude', 'Regionname', 'Propertycount'],
dtype='object')

该数据集包含墨尔本约 13580 所房屋的 21 个要素。

1.处理日期

日期通常存储为对象或字符串。数据集中的日期列存储为对象。

melb.Date.dtypes
dtype('o')

为了使用 Pandas 的日期时间特定功能,我们需要将日期转换成适当的格式。一种选择是使用 to_datetime 函数。

# Before converting
melb.Date[:2]
0    3/12/2016 
1    4/02/2016 
Name: Date, dtype: objectmelb['Date'] = pd.to_datetime(melb['Date'])# After converting
melb.Date[:2]
0   2016-03-12 
1   2016-04-02 
Name: Date, dtype: datetime64[ns]

2.更改数据类型

除了日期,我们可能还需要做一些其他的数据类型转换。需要转换的典型情况是将整数存储为浮点数。例如,我们数据集中的属性列存储为 float,但它应该是 integer。

astype 函数可用于进行数据类型转换。

# Before converting
melb['Propertycount'][:2]
0    4019.0 
1    4019.0 
Name: Propertycount, dtype: float64melb['Propertycount'] = melb['Propertycount'].astype('int')# After converting
melb['Propertycount'][:2]
0    4019 
1    4019 
Name: Propertycount, dtype: int64

3.替换值

另一个常见的操作是替换值。类型列包含 3 个不同的值,分别是“h”、“u”和“t”。我们可以用这些值所代表的内容来替换它们,从而使这些值包含更多的信息。

replace 函数用于完成这项任务。

# Before converting
melb.Type.unique()
array(['h', 'u', 't'], dtype=object)melb.Type.replace({
   'h': 'house', 'u': 'unit', 't': 'town_house'
}, inplace=True)# After converting
melb.Type.unique()
array(['house', 'unit', 'town_house'], dtype=object)

4.类别数据类型

典型的数据集包含数值列和分类列。分类列通常与对象数据类型一起存储。如果与行数相比,不同类别的数量非常少,我们可以通过使用 category 数据类型来节省大量内存。

我们的数据集包含 13580 行。“类型”列中的类别数是 3。我们先来检查一下本专栏的内存消耗情况。

melb.Type.memory_usage()
108768 # in bytes

我们将把它转换成类别数据类型,并再次检查内存消耗。

melb['Type'] = melb['Type'].astype('category')melb['Type'].memory_usage()
13812

它从 108768 字节减少到 13812 字节,这是一个显著的减少。

5.从日期中提取信息

在某些情况下,我们可能需要从工作日、月份、年份等日期中提取特定的部分。我们可以使用 dt 访问器下的函数来提取几乎所有关于日期的信息。

让我们举几个例子。

# Extract month
melb['Month'] = melb['Date'].dt.monthmelb['Month'][:5]
0    3 
1    4 
2    4 
3\.   4 
4    4 
Name: Month, dtype: int64# Extract weekday
melb['Date'].dt.weekday[:5]
0    5 
1    5 
2    0 
3\.   0 
4    2 
Name: Date, dtype: int64

6.从文本中提取信息

文本数据通常包含多条信息。就像我们处理日期一样,我们可能需要从文本中提取一条信息。Pandas 字符串访问器提供了许多功能来有效地执行这样的操作。

让我们来看看地址栏。

melb.Address[:5]
0        85 Turner St 
1     25 Bloomburg St 
2        5 Charles St 
3    40 Federation La 
4         55a Park St 
Name: Address, dtype: object

最后几个字符代表位置的类型。例如,“st”代表街道,“dr”代表车道。这可能是对地址进行分组的有用信息。

我们可以通过在空格字符处拆分字符串并进行最后一次拆分来提取地址的最后一部分。下面是我们如何用 str 访问器完成这个操作。

melb['Address'].str.split(' ').str[-1]0    St 
1    St 
2    St 
3    La 
4    St 
Name: Address, dtype: object

split 函数,顾名思义,在指定的字符(在我们的例子中是空格)处分割字符串。下一个 str 用于访问分割后的片段。“-1”表示最后一个。

7.标准化文本数据

在许多情况下,我们基于文本数据进行比较。这种比较的一个典型问题是字符串没有标准。例如,如果一个单词以大写字母开头,而另一个不以大写字母开头,则可能无法检测到相同的单词。

为了解决这个问题,我们应该对字符串进行标准化。我们可以分别用 str 访问器的 upper 和 lower 函数使它们都是大写或小写字母。

melb.Address.str.upper()[:5]0        85 TURNER ST 
1     25 BLOOMBURG ST 
2        5 CHARLES ST 
3    40 FEDERATION LA 
4         55A PARK ST 
Name: Address, dtype: object

另一种选择是将字符串大写。

melb.Suburb.str.capitalize()[:5]0    Abbotsford 
1    Abbotsford 
2    Abbotsford 
3    Abbotsford 
4    Abbotsford 
Name: Suburb, dtype: object

结论

我们已经讨论了在数据争论过程中可能会遇到的 7 种典型操作。熊猫为他们提供了高效和通用的解决方案。

当然,在数据清理和预处理过程中,我们可能会面临许多其他问题。不可能在一篇文章中涵盖所有这些内容。然而,我很确定熊猫可以解决你需要处理的大部分任务。

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

关于 NoSQL 的 7 个必须知道的想法,以避免你会后悔的决定

原文:https://towardsdatascience.com/7-must-know-ideas-about-nosql-5b00a760d368?source=collection_archive---------37-----------------------

在为下一个应用程序选择数据库时,如何避免那些可怕的陷阱和“陷阱”时刻?

照片由 尼克·舒利欣

问一问任何一个企业应用程序的开发人员,你就会知道他们对关系数据库的局限性感到多么沮丧。以至于在 2009 年,在旧金山举行了一次聚会,与他的同行讨论开源、分布式、非关系数据库。

NoSQL 最初被选中为那次聚会制作一个很好的 Twitter 标签,它像野火一样流行起来,但直到现在还没有一个普遍接受的定义。快进到 2021 年,当谈到数据存储解决方案时,企业有大量的选择,包括关系型和非关系型。

然而有一点是不变的:轻松收集、存储、分析数据和提取见解的能力始于您选择的数据库。所以这里有 7 个 NoSQL 的基本思想,当你为你的应用选择最好的数据库时,你必须知道它们以避免那些可怕的陷阱和遗憾。一次一个想法,让我们开始吧。

理解 NoSQL 诞生的原因

1.从持久数据存储到支持现代应用

为了理解 NoSQL 诞生的原因,我认为回顾一下数据存储解决方案的发展是很有用的。

从 20 世纪 50 年代到 70 年代,早期的数据管理系统如平面文件、层次数据库和网络数据库被创建出来。在这个世界上,避免数据丢失的持久数据存储已经足够好了。

在 20 世纪 70 年代,关系数据库开始解决数据不一致的问题。如此强大,它们成为行业标准使不同的团队和多个应用程序能够在单一的、逻辑一致的数据视图上进行搜索、查询和操作,从而带来巨大的生产力优势。

但是网络应用、电子商务和社交媒体在 2000 年的指数级增长带来了新的挑战。谷歌和亚马逊等科技巨头很快发现,迎合大量网络用户与在一个数据库应用程序上支持成千上万的商业用户相去甚远。

具体来说,我们现在面临一个新问题:如何一致地存储大型数据集,并支持现代应用程序在毫秒内连续处理大量用户请求而不会失败?用专业术语来说,这是一个问题:

  • 支持大量读取和写入
  • 确保低延迟响应时间
  • 保持高可用性。

虽然用关系数据库解决这个问题在一定程度上是可能的,但它通常会带来额外的复杂性和潜在的高成本。因此,诞生了两个极具影响力的 NoSQL 数据库:Google 的 Bigtable 和 Amazon 的 Dynamo。这标志着 NoSQL 数据库的爆炸,从那以后,人们再也没有回头看。

定义 NoSQL 特征

作者图片

2.与模式无关

由于是模式不可知的,NoSQL 数据库不需要预先的模式设计。这意味着相对于关系数据库有两个好处。

首先,避免在预先的模式设计工作上花费数月意味着缩短开发时间,这最终转化为更快的网络和移动应用上市时间

其次,与模式无关给了您在应用程序开发中途更改数据结构的灵活性(而不是经历可怕的模式重新设计过程)。

如果您正在处理变化的数据结构,这是很重要的。例如,电子商务应用程序需要存储具有不同产品规格的不同项目。时尚产品将具有尺寸、颜色、形状和品牌属性,而微波炉可能包括尺寸、容量、瓦数和制造商的保修细节。

3.不相关

使用 NoSQL 数据库,不需要将非关系数据强制放入行和列中。由于开发人员可以使存储的数据结构更接近其原始形式,他们可以最大限度地减少存储、管理和搜索信息的代码量和复杂性。这反过来又使测试、故障排除和错误修复变得更加易于管理。

此外,由于数据以非规范化格式存储,NoSQL 数据库中的销售订单将与所有相关产品和交货地址一起保存。这意味着轻松的数据存储和检索以及更快的查询。

如果你认为非规范化数据也有其缺点,如冗余和较高的数据存储成本。你完全正确!说到底,这是一个判断你愿意为更快的应用开发和数据查询付出多少的问题

4.本来就可以在商用硬件上分发

众所周知,任何现代应用程序都必须分布在多个商用服务器上。这不仅是为了迎合大量的数据,也是为了满足消费者对无缝在线网站和应用程序的期望。它们必须在几毫秒内做出响应,并且在任何需要的时候随时可供许多并发用户使用。

Oracle RAC 或 SQL Server AlwaysOn 是分布式关系数据库的示例。不幸的是,关系数据库必须依赖手工分片,这通常会导致更大的复杂性和运营成本。

相反,许多 NoSQL 数据库,如 HBase、Riak 和 Cassandra,本质上是分布式的,带有内置选项来控制数据如何在廉价的商用服务器上复制和分布。即使其中一个服务器崩溃并烧毁,您的应用程序仍然可以访问您的数据,继续运行并满足用户的需求。这使得 NoSQL 数据库更适合大规模数据存储,以支持网站和面向客户的应用程序。

注: 并不是所有的 NoSQL 数据库都被设计成分布式的或者必须分布式的。然而,当可用性和可伸缩性是首要考虑的问题时,选择分布式产品是有意义的。

选择 NoSQL 数据库

5.存在不止一种类型的 NoSQL 数据库

NoSQL 数据库有四种最广泛使用的类型:键值、文档、列族和图形数据库。每一种都有不同的用途。

  • 键值数据库将数据保存为一组键值对。该键充当查找相关值的唯一标识符。一些例子包括 Memcached,伏地魔,Redis 和 Riak。
  • 文档数据库将数据存储和查询为具有嵌套结构的类似 JSON 的文档。两个主要的开源选项是 MongoDB 和 CouchDB。
  • 面向列的数据库被设计成来自给定列的数据被存储在一起。一些比较受欢迎的产品有 HBase、Cassandra 和 Hypertable。
  • 图形数据库的优势在于它们对网络建模的能力(即事物与其他事物的联系)。通常在社交网络应用程序中发现,图形数据库可以快速遍历节点和关系来提取相关数据。你可能已经听说过它最著名的例子:Neo4J。

NoSQL 数据库提供了丰富的选择,但并非所有的选择都是平等的。NoSQL 的产品种类繁多,表明其中一家可能擅长管理文档,而另一家则在管理社交网络方面拥有无与伦比的优势。 这里是每种 NoSQL 数据库类型的一些真实用例。

作者图片

6.最适合您的业务问题

当选择采用哪个 NoSQL 数据库时,你必须问自己的问题不是“这个数据库能存储我的数据吗?”而是“它最适合我的业务问题和应用程序需求吗?”

但对我和许多其他人来说,很明显,考虑到有这么多的因素,确定“最适合”可能很难。对于不同的用例,每个考虑因素对最终决策都有不同的权重。

为了给你一个起点,下面是在决定最适合的数据存储解决方案时必须考虑的 6 个关键因素。

作者图片

7.每个选择都有一定的权衡

由于数据库环境的变化比我们所能预测的更快,选择最佳方案是非常复杂的。

例如,虽然像 Neo4J 这样的图形数据库对于像脸书这样的社交媒体来说是完美的,但存储的数据量很容易淹没任何现有的图形数据库。因此,倾向于 HBase 或 Riak 等更大规模的选择是有意义的,这些选择最初与社交网络无关。

这里的要点是每个 NoSQL 数据库都应该作为一项单独的技术进行评估,而不是根据其分类进行定型必须仔细考虑潜在的权衡,因为它们可能是交易的破坏者。

为了说明这一点,下面是从《T4》一书中选择的数据库之间的简单比较。

注意: 在表中,我还包括了关系 PostgreSQL,以突出选择关系数据库而不是其他非关系数据库的利弊。此外,正如我们所说的,可能会发布新的功能来解决一些潜在的权衡,所以最好检查最新的更新。

作者图片

包扎

NoSQL 的意思是“不仅仅是 SQL”,它不仅仅代表一个帮助组织更好地存储和管理数据的新手。“不只是”的概念描述了一种趋势,关系数据库(使用 SQL)将继续存在,但不再是数据存储的唯一选择。在未来,我们还有其他替代方案来满足传统关系数据库无法满足的新需求。

由于没有回到单一的数据存储选项,组织现在可以自由地采用不同数据库的组合来解决不同的问题(也称为多语言持久性)。每个人都将发挥自己的优势,但他们都将共存(希望和谐)在同一个生态系统中。

这给我们带来了这篇文章最重要的收获。每一个选择都会有一个结果。因此,对我们来说,重要的是投入时间和精力去理解数据存储技术决策的含义、潜在的权衡和最终责任。毕竟你无法逃避自己选择的后果,不管你喜不喜欢。

如果你正在读这篇文章,感谢你的时间,我真的希望你能从这篇文章中得到一些价值。请随时在 LinkedInTwitter 上与我联系。祝你愉快!

参考

  1. Pramod j . Sada lage 和 Martin Fowler 撰写的《NoSQL 蒸馏:新兴多语言持久性世界简要指南》
  2. 亚当·福勒的《假人 NoSQL》
  3. 丹·沙利文的《凡人的 NoSQL》
  4. Eric Redmond 和 Jim R. Wilson 在七周内创建的七个数据库

原载于 2021 年 3 月 8 日 http://thedigitalskye.comhttp://thedigitalskye.com/2021/03/09/7-must-know-ideas-about-nosql/

7 个必知的 PySpark 函数

原文:https://towardsdatascience.com/7-must-know-pyspark-functions-d514ca9376b9?source=collection_archive---------9-----------------------

PySpark 学习综合实践指南

Alexander Schimmeck 在 Unsplash 上的照片

Spark 是一个用于大规模数据处理的分析引擎。它让您可以将数据和计算分散到集群上,从而实现显著的性能提升。

随着收集、存储和传输数据的成本降低,我们在处理现实生活中的问题时可能会有大量的数据。因此,像 Spark 这样的分布式引擎正在成为数据科学生态系统中的主要工具。

PySpark 是 Spark 的 Python API。它结合了 Python 的简单性和 Spark 的高效性,这种合作得到了数据科学家和工程师的高度赞赏。

在本文中,我们将介绍 PySpark 的 10 个函数,这些函数对于使用结构化数据执行高效的数据分析至关重要。我们将使用用于结构化数据处理的 pyspark.sql 模块。

我们首先需要创建一个 SparkSession,作为 Spark SQL 的入口点。

from pyspark.sql import SparkSessionsc = SparkSession.builder.getOrCreate()
sc.sparkContext.setLogLevel("WARN")print(sc)
<pyspark.sql.session.SparkSession object at 0x7fecd819e630>

我们将使用这个 SparkSession 对象与 Spark SQL 的函数和方法进行交互。让我们通过读取 csv 文件来创建一个 spark 数据帧。我们将使用 Kaggle 上的墨尔本房产数据集

df = sc.read.option("header", "true").csv(
    "/home/sparkuser/Desktop/fozzy/melb_housing.csv"
)df.columns
['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG','Date', 'Postcode', 'Regionname', 'Propertycount', 'Distance','CouncilArea']

该数据集包含墨尔本房屋的 13 个特征,包括房价。

1.挑选

select 函数帮助我们按列创建数据框的子集。我们只需要传递所需的列名。

df.select("Date", "Regionname", "Price").show(5)

(图片由作者提供)

2.过滤器

filter 函数可用于根据列值过滤数据点(即行)。例如,我们可以过滤位于北部大都市地区且价格超过 100 万英镑的房屋。

from pyspark.sql import functions as Fdf.filter(
    (F.col("Regionname") == "Northern Metropolitan") &
    (F.col("Price") > 1000000)
).count()
3022

我们首先导入函数模块。我们应该使用 col 函数对列值进行比较。使用“&”运算符组合多个条件。

最后,count 函数返回符合指定条件的行数。北部大都会区有 3022 栋房子的价格超过了 100 万英镑。

3.带列

withColumn 函数可用于操作列或创建新列。让我们更新价格列,使其以百万为单位显示价格。

df = df.withColumn("Price_million", F.col("Price") / 1000000)df.select("Price_million").show(5)

(图片由作者提供)

第一个参数是列的新名称。不过,我们不必更改现有的名称。第二个参数定义对现有值的操作。

4.分组依据

数据分析中一个非常常见的操作是根据列中的不同值对数据点(即行)进行分组,并执行一些聚合。在我们的数据集中,我们可以找到不同地区的平均房价。

df.groupby("Regionname").agg(
     F.mean("Price_million").alias("Avg_house_price")
).show()

(图片由作者提供)

在我们根据指定的列(在我们的例子中是区域名称)对行进行分组之后,我们应用 mean 函数。别名方法用于为聚合列分配新名称。

5.orderby

orderBy 函数用于对值进行排序。我们可以将它应用于整个数据框,根据列中的值对行进行排序。另一个常见的操作是对聚合结果进行排序。

例如,上一步计算的平均房价可以按降序排列如下:

df.groupby("Regionname").agg(
    F.round(F.mean("Price_million"), 2).alias("Avg_house_price")
).orderBy(
    F.col("Avg_house_price"), descending=False
).show()

(图片由作者提供)

6.照亮

我们可以使用 lit 函数通过指定一个文字值或常量值来创建一个列。

考虑这样一种情况,我们需要一个包含单个值的列。Pandas 允许使用所需的值进行这样的操作。但是,在使用 PySpark 时,我们应该使用 lit 函数传递值。

让我们看看它的实际效果。以下代码筛选类型为“h”的数据点,然后选择三列。withColumn 函数创建一个名为“is_house”的新列,并用 1 填充。

df2 = df.filter(F.col("Type") == "h").select(
    "Address", "Regionname", "Price"
).withColumn("is_house", F.lit(1))df2.show(5)

(图片由作者提供)

7.当...的时候

when 函数计算给定的条件并相应地返回值。考虑到前面的例子,我们可以使用 when 函数实现一个更健壮的解决方案。

下面的代码创建一个名为“is_house”的新列,该列根据列的类型取值 1 或 0。

df.select(when(df["Type"] == "h", 1)\
          .otherwise(0).alias("is_house")).show(5)

(图片由作者提供)

结论

我们已经介绍了 7 个 PySpark 函数,它们将帮助您执行高效的数据操作和分析。PySpark 语法看起来像是 Python 和 SQL 的混合体。因此,如果您熟悉这些工具,那么使用 PySpark 就相对容易了。

需要注意的是,Spark 针对大规模数据进行了优化。因此,在处理小规模数据时,您可能看不到任何性能提升。事实上,在处理小数据集时,Pandas 可能会比 PySpark 表现得更好。

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

为了更好地进行数据分析,7 个必须知道的可视化

原文:https://towardsdatascience.com/7-must-know-visualizations-for-better-data-analysis-1ed6a440f7fe?source=collection_archive---------17-----------------------

R 中 ggplot2 包的实用指南

卢卡斯·本杰明在 Unsplash 上的照片

数据可视化是数据科学中非常重要的一部分。这对于探索和理解数据非常有用。在某些情况下,可视化比简单的数字更能传达信息。

使用数据可视化技术可以很容易地发现变量之间的关系、变量的分布以及数据中的底层结构。

在本帖中,我们将了解 7 种最常用的数据可视化类型。我会用 R 编程语言的 ggplot2 库。我还写了一篇文章,其中包含用 Seaborn 创建的相同可视化,Seaborn 是 Python 的统计数据可视化库。

我们将使用 data.table 包进行数据操作,使用 ggplot2 进行可视化。我更喜欢 R-studio 使用 R 及其包。让我们首先加载包:

> library(data.table)
> library(ggplot2)

下一步是使用包含数据的 csv 文件创建表格(即数据框)。我们将使用 Kaggle 上可用的杂货保险数据集来创建可视化效果。

> insurance = fread("/home/soner/Downloads/datasets/insurance.csv")
> groceries = fread("/home/soner/Downloads/datasets/Groceries_dataset.csv")

保险数据框(图片由作者提供)

杂货数据框(图片由作者提供)

1.线形图

线形图显示了两个变量之间的关系。其中之一通常是时间。因此,我们可以看到变量是如何随时间变化的。

在杂货数据集中,我们可以可视化一段时间内购买的商品数量。首先,我们将计算每天购买的商品数量。

> number_of_purchase = groceries[, .(.N), by = .(Date)]

购买数量数据框(图片由作者提供)

我们现在可以绘制计数(N)随时间的变化曲线。

> ggplot(number_of_purchase) + geom_line(mapping = aes(x=Date, y=N, group=1), color='blue')

(图片由作者提供)

2.散点图

散点图也是关系图。它通常用于可视化两个数值变量的值。我们可以观察它们之间是否有关联。

我们将在保险数据框中显示 bmi 和 charges 列,并使用吸烟者列作为数据点的分隔符。

> ggplot(data = insurance) + geom_point(mapping = aes(x = charges,  y = bmi, color = smoker))

我们来详细说明一下语法。ggplot 函数创建一个空图形。数据被传递给 ggplot 函数。第二步根据给定的映射和绘图类型在图上添加一个新层。geom_point 函数创建散点图。要绘制的列在 aes 方法中指定。

散点图(图片由作者提供)

颜色参数提供了 bmi 和如何基于吸烟者列中的类别而变化的概述。

3.柱状图

直方图通常用于可视化连续变量的分布。连续变量的值的范围被分成离散的仓,并且每个仓中的数据点(或值)的数量用条来可视化。

> ggplot(insurance) + geom_histogram(mapping = aes(x=charges, color=smoker), bins=15, fill='white')

费用列的直方图(按作者分类的图像)

我们注意到的第一件事是,一般来说,吸烟的人受到的指控更多。

4.核密度估计

Kde 图也用于可视化分布。kde 图使用高斯核来平滑观察结果,而不是使用像直方图这样的离散箱。结果,产生了连续的密度估计。

在前面的例子中,我们可以生成 kde 版本的直方图。

> ggplot(insurance) + geom_density(mapping = aes(x=charges, color=smoker))

我们使用 geom_density 函数,并删除了 bin 参数,因为它特定于直方图。

费用栏的 Kde 图(图片由作者提供)

5.箱形图

箱形图提供了变量分布的概况。它显示了值是如何通过四分位数和异常值分布的。下面的代码创建了一个 charges 列的方框图,并将 smoker 列用作分隔符。

> ggplot(insurance) + geom_boxplot(mapping = aes(y=charges, color=smoker))

费用列的方框图(图片由作者提供)

吸烟者的方框高度更大,这意味着该类别中的数据点更加分散。我们清楚地看到,吸烟的人可能比不吸烟的人要多收费。

红点表示异常值。有一些不吸烟的人比这一类中的其他人收费高得多。

6.条形图

ggplot2 的柱状图提供了离散变量分布的概况。它显示了每个离散值的数据点数。

以下是子列的条形图。

> ggplot(insurance) + geom_bar(mapping = aes(x=children, color=smoker), fill='white')

子列的条形图(图片由作者提供)

我们看到大多数人没有孩子。

7.2D 直方图

2D 直方图在一个网格(x 轴和 y 轴)上结合了 2 个不同的直方图。因此,我们能够可视化重叠或并发的密度。换句话说,我们将一对变量的分布可视化。

我们可以使用 geom_bin2d 函数来创建电荷和 bmi 列的二维直方图。

> ggplot(insurance) + geom_bin2d(mapping = aes(x=charges, y=bmi))

2D 直方图(作者图片)

就落入该区域的观测值(即行)的数量而言,较浅的颜色表示较密集的区域。

结论

我们已经使用 r 的 ggplot2 库介绍了 8 种基本但非常实用的可视化类型。

这些基本的可视化几乎可以用任何可视化库来创建。重要的是知道何时使用它们,并理解它们告诉我们什么。

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

用 Python 可以轻松实现的 7 种 NLP 技术

原文:https://towardsdatascience.com/7-nlp-techniques-you-can-easily-implement-with-python-dc0ade1a53c2?source=collection_archive---------3-----------------------

您只需要几行代码就可以用 Python 实现 NLP 技术。

萨法尔萨法罗夫Unsplash 上拍摄的照片

自然语言处理(NLP)致力于使计算机能够理解和处理人类语言。计算机非常擅长处理结构化数据,比如电子表格;然而,我们写或说的许多信息都是非结构化的。

NLP 的目标是让计算机理解非结构化文本,并从中检索有意义的信息。由于 spaCy 和 NLTK 等开源库,我们只需几行 Python 代码就可以实现许多 NLP 技术。

在本文中,我们将学习 7 种 NLP 技术的核心概念,以及如何在 Python 中轻松实现它们。

**Table of Contents** 1\. [Sentiment Analysis](#cb0b)
2\. [Named Entity Recognition (NER)](#72eb)
3\. [Stemming](#0658)
4\. [Lemmatization](#0658)
5\. [Bag of Words (BoW)](#3464)
6\. [Term Frequency–Inverse Document Frequency (TF-IDF)](#fd70)
7\. [Wordcloud](#aed9)

1.情感分析

情感分析是最流行的 NLP 技术之一,它涉及获取一段文本(例如,评论、评论或文档)并确定数据是正面的、负面的还是中性的。它在医疗保健、客户服务、银行等方面有许多应用。

Python 实现

对于简单的情况,在 Python 中,我们可以使用 NLTK 包中的 VADER(情感推理的价感知字典),它可以直接应用于未标记的文本数据。作为一个例子,让我们得到电视节目中角色所讲台词的所有情感分数。

首先,我们在 Kaggle 或我的 Github 上争论一个名为“avatar.csv”的数据集,然后用 VADER 计算每一句台词的分数。所有这些都存储在df_character_sentiment数据帧中。

在下面的df_character_sentiment中,我们可以看到每一个句子都得到了一个否定、中立和肯定的分数。

作者图片

我们甚至可以按角色对分数进行分组,并计算平均值来获得角色的情感分数,然后通过使用 matplotlib 库用水平条形图来表示它(结果显示在本文中)

注:VADER 针对社交媒体文本进行了优化,因此我们应该对结果持保留态度。你可以使用更完整的算法,或者用机器学习库开发自己的算法。在下面的链接中,有一个完整的指南,介绍如何使用 sklearn 库用 Python 从头创建一个。

2.命名实体识别(NER)

命名实体识别是一种技术,用于定位文本中的命名实体并将其分类成诸如人、组织、位置、时间表达式、数量、货币值、百分比等类别。它用于优化搜索引擎算法、推荐系统、客户支持、内容分类等。

Python 实现

在 Python 中,我们可以使用 SpaCy 的命名实体识别,它支持以下实体类型。

来源(空间文件)

为了看到它的运行,我们首先导入spacy,然后创建一个nlp变量来存储en_core_web_sm管道。这是一个针对书面网络文本(博客、新闻、评论)的小型英语管道,包括词汇、向量、句法和实体。为了找到实体,我们将自然语言处理应用于一个句子。

import spacynlp = spacy.load("en_core_web_sm")
doc = nlp("Biden invites Ukrainian president to White House this summer")print([(X.text, X.label_) for X in doc.ents])

这将打印以下值

[('Biden', 'PERSON'), ('Ukrainian', 'GPE'), ('White House', 'ORG'), ('this summer', 'DATE')]

斯帕西发现,“拜登”是一个人,“乌克兰”是 GPE(国家,城市,州,“白宫”是一个组织,“今年夏天”是一个日期。

3.词干化和词汇化

词干化和词汇化是自然语言处理中两种流行的技术。两者都规范了一个词,但方式不同。

  • 词干化:它将一个单词截断成它的词干。例如,单词“朋友”、“友谊”、“友谊”将被简化为“朋友”词干分析可能不会给我们一个字典,一个特定的语法词集。
  • 词汇化:与词干提取技术不同,词汇化会找到字典中的单词,而不是截断原始单词。词汇化算法提取每个单词的正确词汇,因此它们通常需要一个语言词典来对每个单词进行正确分类。

这两种技术都被广泛使用,您应该根据项目的目标明智地选择它们。与词干化相比,词汇化具有较低的处理速度,因此如果准确性不是项目的目标,而是速度,那么词干化是一种合适的方法;然而。如果准确性至关重要,那么可以考虑使用词汇化。

Python 的 NLTK 库使得使用这两种技术变得很容易。让我们看看它的实际效果。

Python 实现(词干)

对于英语,nltk 中有两个流行的库——波特·斯特梅尔和兰卡斯特·斯泰默。

from nltk.stem import PorterStemmer
from nltk.stem import LancasterStemmer# PorterStemmer
porter = PorterStemmer()
# LancasterStemmer
lancaster = LancasterStemmer()print(porter.stem("friendship"))
print(lancaster.stem("friendship"))

PorterStemmer 算法不遵循语言学,而是针对不同情况的一组 5 个规则,这些规则分阶段应用以生成词干。print(porter.stem(“friendship”))代码将打印单词friendship

LancasterStemmer 很简单,但由于迭代和过度词干化,可能会产生大量词干。这导致词干不是语言性的,或者它们可能没有意义。print(lancaster.stem(“friendship”))代码将打印单词friend

你可以试试其他的词,看看这两种算法有什么不同。在其他语言的情况下,可以从nltk.stem导入SnowballStemme

Python 实现(词汇化)

我们将再次使用 NLTK,但是这次我们导入了WordNetLemmatizer,如下面的代码所示。

from nltk import WordNetLemmatizerlemmatizer = WordNetLemmatizer()
words = ['articles', 'friendship', 'studies', 'phones']for word in words:
    print(lemmatizer.lemmatize(word))

变元化为不同的词性(POS)值生成不同的输出。一些最常见的位置值是动词(v)、名词(n)、形容词(a)和副词(r)。词汇化中的缺省 POS 值是一个名词,所以上一个例子的打印值将是articlefriendshipstudyphone

让我们将 POS 值改为动词(v)。

from nltk import WordNetLemmatizerlemmatizer = WordNetLemmatizer()
words = ['be', 'is', 'are', 'were', 'was']for word in words:
    print(lemmatizer.lemmatize(word, pos='v'))

在这种情况下,Python 将为列表中的所有值打印单词be

5.一袋单词

单词袋(BoW)模型是一种将文本转换成固定长度向量的表示方法。这有助于我们将文本表示成数字,因此我们可以将其用于机器学习模型。该模型不关心词序,但它只关心文本中的词频。它在自然语言处理、文档信息检索和文档分类中有应用。

典型的 BoW 工作流包括清理原始文本、标记化、构建词汇表和生成向量。

Python 实现

Python 的库 sklearn 包含一个名为 CountVectorizer 的工具,它负责 BoW 工作流的大部分工作。

让我们用下面的两个句子作为例子。

第一句:“我喜欢用 Python 写代码。我喜欢 Python 代码”

第二句:“我讨厌用 Java 写代码。我讨厌 Java 代码”

这两个句子都将存储在一个名为text的列表中。然后我们将创建一个数据帧df来存储这个text列表。在这之后,我们将初始化 CountVectorizer (cv)的一个实例,然后我们将拟合和转换文本数据以获得数字表示。这将存储在文档术语矩阵df_dtm中。

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizertext = ["I love writing code in Python. I love Python code",
        "I hate writing code in Java. I hate Java code"]df = pd.DataFrame({'review': ['review1', 'review2'], 'text':text})
cv = CountVectorizer(stop_words='english')
cv_matrix = cv.fit_transform(df['text'])
df_dtm = pd.DataFrame(cv_matrix.toarray(),
                      index=df['review'].values,
                      columns=cv.get_feature_names())
df_dtm

用存储在df_dtm 中的 CountVectorizer 制作的弓表示如下图所示。请记住,CountVectorizer 不会考虑包含两个或更少字母的单词。

作者图片

如你所见,矩阵中的数字代表每个单词在每次评论中被提及的次数。在这个例子中,像“爱”、“恨”和“代码”这样的词有相同的频率(2)。

总的来说,我们可以说 CountVectorizer 在标记文本、构建词汇表和生成向量方面做得很好;但是,它不会为您清理原始数据。我做了一个关于如何在 Python 中清理和准备数据的指南,如果你想学习最佳实践,可以去看看。

6.术语频率-逆文档频率(TF-IDF)

与 CountVectorizer 不同,TF-IDF 计算“权重”,表示一个单词与文档集合(也称为语料库)中的一个文档的相关程度。TF-IDF 值与单词在文档中出现的次数成比例地增加,并被语料库中包含该单词的文档的数量所抵消。简单来说,TF-IDF 得分越高,该术语就越稀有、独特或有价值,反之亦然。它在信息检索方面有应用,如搜索引擎,旨在提供与您搜索的内容最相关的结果。

在我们看 Python 实现之前,让我们看一个例子,这样你就对 TF 和 IDF 是如何计算的有了一个概念。对于下面的例子,我们将使用与 CountVectorizer 例子相同的句子。

第一句:“我喜欢用 Python 写代码。我喜欢 Python 代码”

第二句:“我讨厌用 Java 写代码。我讨厌 Java 代码”

术语频率(TF)

有不同的方法来定义词频。一种建议是原始计数本身(即计数矢量器所做的事情),但另一种建议是句子中单词的频率除以句子中单词的总数。在这个简单的例子中,我们将使用第一个标准,因此术语频率如下表所示。

作者图片

如您所见,这些值与之前为 CountVectorizer 计算的值相同。此外,两个字母或更少的单词不考虑在内。

反向文档频率(IDF)

IDF 也有不同的计算方式。尽管标准教科书符号将 IDF 定义为 IDF(t)= log[n/(df(t)+1],但我们稍后将在 Python 中使用的 sklearn 库默认计算公式如下。

还有,sklearn 假设自然对数ln而不是log和平滑 (smooth_idf=True) 。让我们计算每个单词的 IDF 值,因为 sklearn 会这样做。

作者图片

TF-IDF

一旦我们有了 TF 和 IDF 值,我们就可以通过将这两个值相乘得到 TF-IDF(TF-IDF = TF * IDF)。下表显示了这些值。

作者图片

Python 实现

由于有了 sklearn 库,用 Python 计算上表所示的 TF-IDF 只需要几行代码。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
text = ["I love writing code in Python. I love Python code",
        "I hate writing code in Java. I hate Java code"]df = pd.DataFrame({'review': ['review1', 'review2'], 'text':text})
tfidf = TfidfVectorizer(stop_words='english', norm=None)
tfidf_matrix = tfidf.fit_transform(df['text'])
df_dtm = pd.DataFrame(tfidf_matrix.toarray(),
                      index=df['review'].values,
                      columns=tfidf.get_feature_names())
df_dtm

存储在df_dtm 中的 TF-IDF 表示如下图所示。同样,TF-IDF 不考虑 2 个字母或更少的单词。

作者图片

注意:默认情况下,TfidfVectorizer()使用 l2 规范化,但是为了使用上面所示的公式,我们将 norm=None 设置为参数。有关 sklearn 中默认使用的公式以及如何定制公式的更多详细信息,请查看其 文档

7.Wordcloud

Wordcloud 是一种帮助我们识别文本中关键词的流行技术。在单词云中,频繁出现的单词有更大更粗的字体,而不太频繁出现的单词有更小或更细的字体。在 Python 中,你可以用wordcloud库制作简单的单词云,用stylecloud库制作好看的单词云。

下面你可以找到用 Python 制作单词云的代码。我用的是史蒂夫·乔布斯演讲的文本文件,你可以在我的 Github 上找到。

import stylecloudstylecloud.gen_stylecloud(file_path='SJ-Speech.txt',
                          icon_name= "fas fa-apple-alt")

这是上面代码的结果。

作者图片

文字云之所以如此受欢迎,是因为它们引人入胜、易于理解、易于创建。

你可以通过改变颜色,删除停用词,选择你的图片,甚至添加你自己的图片作为单词云的遮罩来进一步定制。有关更多详细信息,请查看下面的指南。

就是这样!您刚刚学习了 7 种 NLP 技术的核心概念,以及如何用 Python 实现它们。本文所写的所有代码都可以在我的Github上找到。

与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)

7 种最常用的回归算法以及如何选择正确的算法

原文:https://towardsdatascience.com/7-of-the-most-commonly-used-regression-algorithms-and-how-to-choose-the-right-one-fc3c8890f9e3?source=collection_archive---------1-----------------------

入门

线性和多项式回归、RANSAC、决策树、随机森林、高斯过程和支持向量回归

回归算法—图片由作者提供

回归是监督学习的子集。它根据训练数据集学习模型,对未知或未来数据进行预测。描述'监督的'来自于目标输出值已经定义并且是训练数据的一部分。子类别回归和分类之间的差异仅取决于输出值。分类将数据集分为不同的类,而回归用于输出连续值。[Ras16]

学习类型概述—作者图片

本文介绍了一些最常用的回归方法,解释了一些评估模型性能的指标,并描述了模型构建过程的工作原理。

1.回归方法

多元线性回归

线性回归模型假设输入和输出变量之间的关系是线性的。这些模型非常简单,但在许多情况下提供了充分和易处理的关系表示。该模型旨在通过给定的输入数据X = (x_1, x_2, …, x_p)预测实际输出数据Y,并且具有以下形式:

β 描述最初未知的系数。具有一个以上输入变量p > 1的线性模型称为多元线性回归模型。最著名的线性回归估计方法是最小二乘法。在这种方法中,系数 β = β_0,β_1…,β_p 的确定方式使得 残差 平方和(RSS) 最小。

这里,y_i-f(x_i)描述了残差,β_0 是对截距项 的估计,β_j 是对 斜率参数【has 09,p.44】。

线性回归:截距项和回归系数—图片由作者提供

多项式回归

通过变换输入变量,例如通过对数函数、根函数等。可以表示非线性和多项式关系。然而,这些都是线性模型,因为这一名称是基于输入参数的线性度。[Has09,第 44 页]

这种相关性的建模是使用所谓的趋势模型来完成的。如果粗略的过程已经从数据中明显可见,可以指定回归方法。[Fah16,p.512]下表显示了简单线性回归常用的趋势模型。

全球趋势模型[Fah16,第 512 页]

多项式回归的直接函数不存在,至少在Scikit-learn中不存在。为了实现,使用了pipeline功能。该模块在一个链中结合了几种变换和估计方法,从而允许数据处理中的固定步骤序列。[Sci18g]

与以前已知的线性回归的区别是初步步骤。函数PolynomialFeatures创建一个包含输入矩阵X特征的所有多项式组合的新矩阵。[Sci18h][Sci18]

以下代码片段:

输入向量 *X*变换如下:

线性模型的功能是:

下面的片段展示了多项式回归在scikit-learn中的应用。这里pipeline功能并不是绝对必要的,输入矩阵X的变换和后续的模型建立也可以通过相应的命令一个接一个地执行。然而,如果在交叉验证函数中应用多项式模型构建,则需要管道函数(更多信息请参见本文的评估部分)。

多项式回归允许通过polynomial degree控制模型复杂性。用户在算法执行前设置的参数称为 超参数 。大多数回归方法包括几个超参数,它们会显著影响最终回归模型的准确性。您可以在“模型评估”一节中找到如何找到最佳超参数的解释。

以下示例显示了多项式次数为 2 的多项式回归模型。该模型来自于预测铣床能耗的尝试。目标值 y 是能耗[kJ],使用的属性是轴转速[1/min]和进给速度[mm/min]。

多项式回归:样本模型—作者图片

稳健回归— RANSAC

基于最小二乘估计的回归程序非常容易受到异常值的影响,因为方差是以二次方式评估的。下图说明了单个异常值对线性回归结果的影响。

个别异常值对线性回归模型的影响—图片由作者提供

稳健的回归方法避开了这一弱点。术语“稳健性”描述了静态方法对不符合正态分布的分布进行建模的能力。[Wie12]稳健性的一个衡量标准是所谓的“崩溃点”,它表示统计方法容许的数据(如异常值)的比例。[Hub05]

最著名的稳健回归算法可能是由 Martin Fischler 和 Robert Bolles 于 1981 年推出的随机样本一致性 (RANSAC) 算法。RANSAC 广泛应用于机器视觉领域。[Fis80]

该算法的操作可以用迭代执行的五个步骤来解释。(1)开始时,程序从数据中选择一个随机样本,并将其用于建模。在下图中, 样本 包括两个圈起来的数据点。(2)然后计算模型 f(x)的所有数据点的误差,并与用户定义的阈值进行比较。如果偏差低于该值,该数据点被视为 内层

RANSAC 算法—图片由作者提供

(3)重复该过程,直到已经运行了指定数量的迭代或者已经实现了模型的指定性能。作为模型结果是产生最多内联符的函数。[Ras18]

下面的 Python 片段描述了使用scikit-learn的实现。最大迭代次数设置为 4,最小样本大小设置为 2。这些值根据数据集的大小进行调整。为了确定内角,计算数据点和回归线之间垂直距离的绝对值。[Ras18][Sci18b]

下图显示了执行上述代码片段后迭代模型构建的示例。迭代 2 显示了模型的最佳性能。

RANSAC 算法:模型构建过程的四次迭代(Min_Samples =2,threshold = 20)-图片由作者提供

以某个概率 p 从数据点中至少选择一次无离群子集所需的迭代次数 n 可以确定如下[Rod04][Dan18]:

假设离群值δ的相对比例约为 10%,以概率p = 99%选择至少一次无离群值子集的迭代次数n计算如下:

决策树和随机森林

决策树通过迭代分裂树节点来增长,直到“叶子”不再包含杂质或者达到终止条件。决策树的创建从树根开始,以产生最大 信息增益 IG 的方式分割数据。[Ras18,第 107 页][Aun18][Has09,第 587 页][May02][Sci18c]

一般来说,特征 a 的信息增益 IG 定义如下[Qui86][Bel15,p.47][Ras18,p.107]:

在二元决策树中,通过属性 *a*将整个数据集D_p划分为D_leftD_right完成。因此,信息增益定义为:

该算法以最大化信息增益为目标,即该方法希望以最大程度减少子节点中的杂质的方式分割整个数据集。

分类使用entropyGini coefficient作为杂质的度量,回归使用Mean Squared Error (MSE)作为节点的杂质的度量。[Ras18,第 347 页]。

使用Mean Squared Error确定杂质的分割方法也称为方差减少方法。通常情况下,树的大小由最大节点数 max_depth控制,此时数据集的划分停止。[第 09 条,第 307 条]

决策树的节点和叶子的可视化可以使用graphviz函数来完成:

下图显示了简单数据集的决策树的结果。该方法以尽可能减少方差的方式将数据集分成两个部分子集(左和右)。对于显示的数据集,数据集第一次分割的限制是 6.5。

深度为 1 的简单二维案例的决策树—图片由作者提供

随机森林

通过合并几个不相关的决策树,通常可以实现模型准确性的显著提高。这种方法叫做随机森林。这些树在生长时会受到某些随机过程(随机化)的影响。最终模型反映了树的平均值。

存在不同的随机化方法。根据 Breiman,他在 1999 年创造了术语'随机森林',随机森林是根据以下过程建立的。首先,从每棵树的总数据集中选择一个随机样本。随着树的增长,在每个节点选择特征的子集。这些用作分割数据集的标准。然后分别为每个决策树确定目标值。这些预测的平均值代表随机森林的预测。[Bre01][Jam13]

随机森林有许多超参数。最关键的一个,除了max_depth树的最大深度之外,就是棵决策树的数量 n_estimators。默认情况下,随着树的增长,M ean Square Error (MSE) 用作分割数据集的标准。[Sci18d]

下图显示了随机森林的示例模型。其工作方式导致了特有的“步骤”形式。

随机森林:样本模型——作者图片

由于随机森林将几个模型组合成一个,所以属于 集成学习 的领域。更准确地说,随机森林是一种所谓的 装袋 技术。

除了 打包 之外,最著名的集成学习技术是 Boosting ,该领域最著名的算法是 AdaBoostXGboost 算法。

如果你对 boosting 和 bagging(以及 AdaBoost 和 Random Forest)之间的区别感兴趣,你可以在这里找到更详细的介绍:

高斯过程回归

高斯过程 在系统观察的基础上捕捉系统的典型行为,并作为结果传递手头问题的可能插值函数的概率分布。

高斯过程回归 在下面利用了贝叶斯定理,这也是为什么要提前简要说明的原因。

一般来说,贝叶斯定理定义如下:

它允许从已知值推断未知值。一个经常使用的应用例子是疾病检测。例如,在快速检测的情况下,人们感兴趣的是被检测为阳性的人实际患有该疾病的实际概率有多高。[Fah16]

在下文中,我们将把这一原理应用于高斯过程

高斯过程由每个随机变量的期望值、mean function m(x)covariance function k(x,x´)定义。

mean function m(x)反映了手头问题的先验函数,并基于数据中的已知趋势或偏差。如果期望值(均值函数)为常数 0,则称为中心高斯过程。

covariance function k(x, x´)也称为“”,描述了随机变量 x 和 x’的协方差。这些函数是解析定义的。

内核定义了模型函数的形状和过程,并用于描述例如抽象属性,如平滑度、粗糙度和噪声。更多的内核可以通过一定的计算规则来组合,以模拟具有叠加属性的系统。[EBD 08][ku 06][ras 06][va f17]

下面将介绍三种最常用的内核:

平方指数核

一个流行的内核Squared Exponential Kernel(径向基函数),并且已经被确立为高斯过程支持向量机标准内核。[Sci18l]

下图通过mean function m(x)(黑线)和confidence interval(灰色背景)展示了一个 A- 先验-高斯过程p(f)的例子。一般来说,置信区间表示在某种概率下,给定随机实验的无限重复的范围,参数的真实位置位于[Fah16][Enc18]。在这种情况下,置信区间的边界由标准差σ 定义。

彩色曲线代表高斯过程的一些随机函数。示例曲线仅用于抽象可能的输出函数的形式。原则上,可以创建无限数量的这些曲线。

使用平方指数核的先验高斯过程—图片由作者提供(受[Sci18n][Duv14]启发)

内核只有两个超参数:

  • l (length_scale) 描述协方差函数的特征长度尺度。 length_scale 影响高斯函数的“的长度。
  • 方差σ 定义了函数与其均值的平均距离。对于 y 轴上覆盖较大范围的函数,该值应选择较高。[Ebd08]

下图显示了超参数对先验高斯过程及其函数的影响。

平方指数核:超参数的影响—作者图片

有理二次核

Rational Quadratic Kernel可以被视为具有不同length_scale设置(l)的几个平方指数核的组合。参数α决定了'大规模和'小规模功能的相对权重。当α接近无穷大时,有理二次核等于平方指数核。[Duv14][Sci18k][Mur12]

使用有理二次核的先验高斯过程—图片由作者提供(受[Sci18n][Duv14]启发)

周期性内核

Periodic Kernel允许函数自我重复。周期 p 描述了函数重复之间的距离。“长度刻度”参数(l)的使用如前所述。[Sci18j]

使用周期核的先验高斯过程—图片由作者提供(受[Sci18n][Duv14]启发)

kernel funnctionmean function一起描述了先验高斯过程。借助于一些测量值,可以定义一个 后验高斯过程 ,其考虑了关于问题的所有可用信息。更准确地说,不会产生单一的解,而是插值的所有可能的函数,这些函数以不同的概率加权。具体来说,在回归任务的情况下,具有最高概率的解(函数)是至关重要的。[ras 06][维基 18a][维基 18a]

对于回归,通常会给出一个数据集,其中包含自变量 X ∈ R 的值和因变量 f ∈ R 的相关值,并且希望预测新值 X∫的输出值 f∫。[Vaf17]

对于最简单的情况,没有噪声的过程,多维高斯分布定义如下:

协方差矩阵可以分为四部分。未知值 K_XX∫内的协方差,未知和已知 K _ X∫X 值之间的协方差,以及已知值 K _ XX 内的协方差。

由于f是完全已知的,将概率密度代入贝叶斯定理得到后验高斯分布

拉斯姆森在他的著作《 机器学习的高斯过程 》中给出了详细的推导。[Ras06,第 8 页起。]

从先验到后验的高斯过程:用一个简单的例子说明

在实践中,使用了许多其他内核,包括几个内核函数的组合。例如,常量内核通常与其他内核一起使用。使用这个核而不与其他核结合,通常是没有意义的,因为只有常数相关性可以被建模。然而,在下文中,常数核用于以简单的方式解释和说明高斯过程回归。

下图显示了方差为 1 的先验高斯过程。通过将常数核定义为协方差函数,所有样本函数都显示一条与 x 轴平行的直线。

具有所谓的常数核和一个支持数据点的高斯过程的表示——作者的图像

由于没有预先声明测量数据的可能噪声,该过程假设给定的测量点是真实函数的一部分。这将可能的函数方程的数量限制在直接通过该点的直线上。因为常量内核只允许水平线,所以在这个简单的例子中,可能的行数减少到只有一个可能的函数。因此后验高斯过程的协方差为零。

使用RBF Kernel,可以绘制任意过程,但这次的结果不是像后验高斯那样的单一直线,而是多个函数。概率最高的函数是后验高斯过程mean function。下图显示了后验高斯过程和使用的测量点。

具有平方指数核的后验高斯过程和使用的数据点—图片由作者提供

为了在 Python 中实现高斯过程,必须预先定义先验高斯过程mean function m(x)通常被假定为常数和零。通过设置参数normalize_y = True,该过程使用数据集值的平均值作为常量期望值函数。通过选择核来选择协方差函数。[Sci18m]

sci kit-learn 中的高斯过程回归

以下源代码描述了如何使用 scikit learn 和用作协方差函数的RBF Kernel实现高斯过程回归。第一个优化过程从内核的预设值(length_scalevariance)开始。通过参数alpha,可以预先假设训练数据的噪声强度。

优化过程:使用最大似然法超参数估计

在模型拟合期间,通过最大化对数边际似然(LML) 来优化超参数。最大似然估计(MLE) 是一种确定统计模型参数的方法。虽然已经提出的回归方法(如线性回归)旨在最小化均方误差,但高斯过程回归试图最大化似然函数。换句话说,模型的参数是以这样一种方式选择的,即观察到的数据根据它们的分布看起来是最合理的。

一般来说,random variable Xprobability function f定义为:

假设这种分布取决于参数ϑ.给定观测数据,概率可以被认为是ϑ的函数:

最大似然估计旨在最大化该函数。最大值通常是通过对函数求微分,然后将其设置为零来确定的。由于对数似然函数在与似然函数相同的点具有最大值,但更容易计算,因此通常使用。[谷歌 16,第 128 页]

如果随机变量 X 具有以下概率密度,则称之为正态或高斯分布[Fah16,第 83 页]:

下面将使用一个简单的一维例子来解释最大似然法。下图显示了数据集。所有三个绘制的概率分布反映了数据的分布。对于最大似然,人们感兴趣的是最有可能的分布。

取决于参数期望值和方差的正态分布—图片由作者提供(受[BB18]启发)

目标是定义参数σ,并以这种方式使所有考虑的数据点的概率最大化。例如,给定 x 值为 9、10 和 13 的三个数据点,类似于图中的数据点,联合概率从各个概率计算如下:

这个功能必须最大化。平均值则对应于最有可能发生的x-value

下图显示了高斯过程回归的示例模型。

高斯过程回归:样本模型—图片由作者提供

支持向量回归

支持向量回归(SVR)的功能基于支持向量机(SVM ),首先用一个简单的例子来解释。我们正在寻找线性函数:

x⟩·⟨w 描述了叉积。SV 回归的目标是找到一条直线作为数据点的模型,而直线的参数应该以这样一种方式定义,即直线尽可能的“”。这可以通过最小化规范来实现

对于模型建立过程,只要数据点在定义的范围内(-ϵ到+ϵ). ),数据点离建模的直线有多远并不重要不允许偏差超过规定的ϵ限值。

支持向量回归机的功能—作者图片(受[Smo04]启发)

这些条件可以描述为凸优化问题:

如果所有数据点都可以在ϵ的精度内近似,那么这个优化问题就找到了解决方案(上图显示了这个场景的一个简单例子)。然而,这是一个简化的假设,在实践中通常不成立。为了能够绕过无法解决的优化问题,引入了变量ζi,ζ∫——所谓的松弛变量

线性 SVM 的软边界损失设置—图片由作者提供(受[Smo04]启发)

上图描述了使用线性损失函数对超过ϵ量的偏差的惩罚。损失函数被称为内核。除了线性核,多项式或 RBF 核也经常被使用。[Smo04][Yu12][Bur98]

因此,根据 Vapnik 的配方如下:

常数 C 描述了平坦度条件和容许的大于ϵ的偏差之间的平衡。

为了能够用支持向量回归来模拟非线性关系,使用了所谓的“核技巧”。因此,原始特征被映射到更高维的空间中。[Pai12]

使用scikit-learnRBF 内核的实现如下所示:

本文中介绍的回归方法的总结

下图概述了所介绍的回归方法,并简要总结了它们的工作原理。

呈现的回归方法概述—图片由作者提供

2.模型评估

有各种方法和程序来评估模型的准确性。

度量函数

sklearn.metrics模块包括几个损失和评估函数来测量回归模型的质量。均方差(MSE) 是评估回归模型质量的关键标准【Ras18,p.337】。如果 yˇ_ I 描述的是模型在第 I 个数据样本上预测的值,y_i 描述的是对应的真值,那么模型在 n 个样本上的【MSE】描述为【Sci18a】:

确定回归模型精度的另一个参数是 【平均绝对误差(MAE)】

这两个指标都可以在模块sklearn.metrics中找到。它们比较测试数据集的预测值和实际值。

决定系数(R )

所谓的决定系数(R)可以理解为 MSE 的标准化版本。这允许更容易地解释模型的性能。值 1.0 表示可能的最佳性能。如果模型显示出与真实值的任意偏差,R 值也可能变为负值。常数模型在不考虑输入特征的情况下预测值,其 R 值为 0.0。

如果 yˇ_ I 描述了模型在第 I 个数据样本预测的值,y_i 描述了相关联的真实值,则 n_Samples 上的决定系数 R 定义为[Sci18a]:

Python 中的输出是函数r2_score,其中y_true是因变量的真实值,y_pred是模型预测的值。

回归中的交叉验证

交叉验证是一种模型选择的统计方法。为了评估一种方法,整个数据集被分成训练数据集和测试数据集,其中训练数据集通常包括整个数据集的 80%到 90 %。为了实现模型的最佳评估,目标是拥有尽可能大的测试数据集。通过拥有尽可能大的训练数据集可以实现良好的模型构建。

交叉验证就是用来规避这个困境的。这种方法允许将整个数据集用于训练和测试。与训练和测试数据的固定划分相比,交叉验证因此允许对未来数据或未包含在数据集中的数据进行更准确的模型精度估计。

k 倍交叉验证将整个数据集X分成k个大小相等的块(X_1, …, X_k)。然后,该算法在k-1块上被训练k次,并用剩余的块进行测试。

交叉验证的功能,以五重交叉验证为例—图片由作者提供

许多学习方法允许通过一个或多个超参数来调整模型复杂度。这通常会导致过度配合或配合不足的问题。交叉验证用于找到最佳的模型复杂度。通过最小化在学习期间未知的测试数据集上的近似误差来实现最佳复杂度。[Du14,第 27 页][Has09,第 242 页]

对于不同的参数设置和模型复杂性,执行已经描述的过程。对于最终模型,选择显示最低 e 误差(如 MSE 或 MAE) 的设置参数(γ_opt)。对于较小的训练数据集,k可以等同于特征向量的数量n。这种方法叫做留一交叉验证。[Ert16,第 233 页][Bow15,第 100 页]

sklearn 的实现是通过模块cross_validate完成的。以下代码片段显示了交叉验证的应用,以评估线性回归的性能。

cv值定义了数据集被划分成的分区的数量k。在这种情况下,使用Negativ Mean Squared Error作为评分参数。每次运行后,平方误差被传递到列表scores。在程序代码执行之后,scores表示一个列表,在这种情况下,该列表具有三个条目,即每个回归模型的均方误差。这些模型的不同之处仅在于测试和训练数据集的选择,如前所述,这些数据集在每次运行后都会发生变化。[Sci18f][Coe13]

功能cross_validate使用.metrics模块的评分参数。下表概述了用于评估回归模型的所谓评分参数[Sci18e][Cod18]。

回归模型评估的评分参数—图片由作者提供

_score结尾的函数返回一个应该尽可能最大化的值。以_error_loss结尾的函数返回值最小化。

如果您查看一下sklearn.metrics.scorer模块的源代码,您可以看到,对于所有的损失或错误函数,参数greater_is_better都被设置为 FALSE,计分参数被取反并用表达式neg_进行补充。这允许以相同的方式处理所有评分参数。[代码 18][Git18]

下面的源代码展示了一个典型的交叉验证的应用例子。该示例使用多项式回归进行建模,这允许通过指定多项式次数来设置模型复杂度。下图显示了使用的数据集和过度拟合的问题。如果使用训练数据来执行模型的评估,则具有较高复杂性的模型通常显示出较高的准确性。由于数据集是使用正弦函数生成的,因此 true 函数可用于比较。对于这个简单的例子,一眼就可以看出多项式次数为 15 的多项式回归模型并不能正确地表示回归问题——它是一个过度拟合的模型。

多项式回归:过度拟合—作者图片

为了能够确定“最佳”多项式次数,下面使用了交叉验证

当应用于测试数据集时,好的模型的特征在于模型的最低可能误差。为了获得相对小数据集的模型的最佳可能评估,对不同的设置参数执行“留一交叉验证”。这是通过将分区的数量(数据集在交叉验证期间被划分成的分区)设置为数据点的数量来实现的。交叉验证得到的scores列表包括每次运行的均方误差。对这些值进行平均,以评估所用的回归方法。

下图左图显示了不同多项式次数的交叉验证结果。此外,还显示了来自训练数据集的模型误差。随着模型复杂度的增加,误差减小。这解释了为什么基于训练数据的模型的评估和优化是不可行的。

通过交叉验证确定的均方误差显示在三至七次多项式范围内的稳定低值。更复杂的系统不再充分代表该过程,这就是为什么不包括在训练数据集中的数据和该过程的未来数据的计算精度显著降低。最佳值显示在多项式次数为 3 时。如果绘制出最终模型,它显示出与“真实函数”的良好近似。(在这种情况下,可以给出数据集的“真实函数”,因为数据点是以对给定 cos 函数的随机偏移生成的)。

使用交叉验证选择多项式次数—图片由作者提供

3.模型建立过程

下图显示了方法选择和后续模型生成的示意流程。特征选择已经发生在模型建立之前,并且定义了后面的回归模型的输入属性。数据集在创建过程中已经以只包含相关属性的方式进行了结构化。

回归方法适用于不同的问题,效果也不同。为了评估,在建模之前,数据集被分成训练和测试数据集。这个步骤在源代码中被省略了,因为这个过程是在交叉验证期间自动迭代执行的。交叉验证的执行由 scikit 库的cross_val_score函数完成。

交叉验证提供了每种回归方法的性能指标。对于具有少量实例的数据集,通常会执行一个'遗漏一个 ' c 交叉验证。为此,交叉验证的分区号被设置为等于数据集的长度。

通过不同超参数设置的重复交叉验证进行超参数优化:

交叉验证的结果代表一个列表,其中包含所选评分参数的值。由于评估是在每次运行之后执行的,因此如果数据集被划分为五个分区,那么也有一个包含五个评估值的列表。这些值的平均值允许对回归程序的性能进行评估。由于大多数回归方法允许通过一个或多个超参数来调整模型复杂性,因此超参数的调整对于回归方法的有意义比较是必要的。这些最佳超参数设置的发现是通过迭代模型建立来完成的。对于不同的超参数设置,重复执行交叉验证。最后,选择在评估期间显示最佳模型精度的参数设置。该过程由循环执行,该循环在一定限度内自动改变超参数并存储评估值。然后,通过手动或自动搜索最佳评估结果来选择最佳设置。

不同回归方法的评估和随后的模型构建的示意图——图片由作者提供

虽然线性回归不允许设置模型复杂性,但大多数算法都包含多个超参数。为了优化模型,在具有多个超参数设置选项的程序中,仅改变其中一个超参数通常是不够的。必须注意,不能单独考虑超参数,因为参数变化的影响会部分地相互影响。

下图显示了所提出方法的一些重要超参数的列表。特别是对于使用核函数来寻找解决方案的方法,可能的设置数量远远超过了列出的数量。有关更详细的描述,您可以在:scikit-learn.org找到这些方法及其超参数的综合文档。

回归方法中最重要的超参数概述—图片由作者提供

您可以在此找到超参数优化领域的更详细介绍,以及网格搜索或贝叶斯优化等常用方法:

摘要

希望我能给你一个用于回归分析的不同技术的概述。当然,这篇文章并没有声称给出了回归的完整图景。无论是回归领域还是所提出的概念。很多重要的算法根本没有提到。然而,这 7 种算法给了你一个很好的概述,介绍了所使用的技术以及它们在工作方式上的区别。

如果您觉得这篇文章很有帮助,您还可以找到一篇关于用于异常检测的概念和算法的类似文章:

如果你还不是中级高级会员并想成为其中一员,你可以通过使用这个推荐链接注册来支持我。

感谢您的阅读!!

参考

[Aun18] Aunkofer,b . Entscheidungsbaum-algorithm us ID3-数据科学
博客,2018 年。网址https://data-science-blog . com/blog/2017/08/13/entscheidungsbaum-algorithm us-ID3/

[BB18] Brooks-Bartlett,j .概率概念解释:最大似然估计,2018。网址https://towards data science . com/probability/concepts-explained-maximum-likelihood-estimation-c7b 4342 fdbb 134

《机器学习:开发者和专业技术人员的实践》。2015 年,印第安纳州印第安纳波利斯,威利。ISBN 1118889061

统计决策理论和贝叶斯分析。统计学中的斯普林格级数。施普林格,纽约,纽约州,第二版 Auflage,1985 年。ISBN 9781441930743。doi:10.1007/978–1–4757–4286–2。网址 http://dx.doi.org/10.1007/978-1-4757-4286-2T3

《Python 中的机器学习:预测分析的基本技术》。约翰·威利父子公司,印第安纳波利斯,2015 年。ISBN 1118961749B

[Bre01] Breiman,l .兰登森林。2001.

[Bur98]伯格斯;考夫曼湖;斯莫拉,A. J。支持向量回归机。1998.网址【http://papers.nips.cc/paper/1238-
支持向量回归机. pdfine

[Cal03] Callan,r .神经元网络在 Klartext 中。我是 Klartext。皮尔逊工作室,Műnchen 和哈洛,2003 年。ISBN 9783827370716

代码示例。3.3.modellbewertung:qualitizering der Quali[1]t von Vorhersagen | sci kit-学习文档|代码示例

科埃略公司;用 Python 构建机器学习系统。2013

[Dan18] Daniilidis,K. RANSAC:随机样本共识 I —姿势估计| Coursera,2018。URLhttps://www . coursera . org/lecture/robotics-perception/ran sac-random-sample-consensus-I-z0 gwq

[14]杜,k .-l;神经网络和统计学习。伦敦斯普林格,伦敦,2014。ISBN 978–1–4471–5570–6。doi:10.1007/978–1–4471-5571–3

[duv 14]d . k . Duvenaud,《高斯过程的自动模型构建》。2014.网址https://www.cs.toronto.edu/~duvenaud/thesis.pdfin

回归的高斯过程:快速介绍。2008.

【Enc18】显著性检验争议与贝叶斯替代,
21.06.2018。网址https://www.encyclopediaofmath.org/index.php/
非显著性 _ 检验 _ 争议 _ 和 _ 贝叶斯 _ 替代

[Ert16] Ertel,w . grund kurs küNST liche Intelligenz:一种实践或科学。计算智能。施普林格威斯巴登有限公司和施普林格观点,威斯巴登,4。,überab。aufl。2017 Auflage,2016。ISBN 9783658135485

[Fah16]法赫迈尔湖;霍伊曼角;Künstler,r . Statistik:Weg zur 数据分析。施普林格-莱尔布奇。柏林和海德堡,8。,2016 年。ISBN 978–3–662 50371–3。doi:10.1007/978–3–662–50372–0

菲施勒,m。随机样本一致性:模型拟合范例及其在图像分析和自动制图中的应用。1980.网址http://www.dtic.mil/dtic/tr/fulltext/u2/a460585.pdf0585.p

[Git18] GitHub。sklearn.metrics-Quellcode,2018。

[Goo16]古德费勒,我;纽约州本吉奥;库维尔,深度学习。麻省理工学院出版社,马萨诸塞州剑桥和英国伦敦,2016 年。ISBN 9780262035613。网址 http://www.deeplearningbook.org/T3

哈斯蒂,t。蒂布拉尼河;统计学习的要素:数据挖掘、推理和预测。斯普林格纽约,纽约,纽约州,2009 年。ISBN 978–0–387–84857–0。doi:10.1007/b94608

Huber,P. J .稳健统计。纽约威利,纽约州,2005 年。国际标准书号 0–47141805-6

稳健回归、分类和强化学习的高斯过程模型。2006.网址http://tu prints . ulb . tu-Darmstadt . DDE/epda/000674/gaussianprocessmodelskus . pdf ku

[Mur12] Murphy,K. P.《机器学习:概率观点》。自适应计算和机器学习系列。麻省理工学院出版社,剑桥,麻省。, 2012.ISBN 9780262018029。URLhttps://ebook central . proquest . com/auth/lib/subhh/log in . action?returnURL = https % 3A % 2F % 2 febookcentral . proquest . com % 2f lib % 2f subhh % 2f detail . action % 3f docid % 3d 3339490

[Pai12] Paisitkriangkrai,p .线性回归和支持向量回归。2012.网址https://cs.adelaide.edu.au/~chhshen/teaching/ML_SVR.pdf

[Qui86] Quinlan,J. R .决策树的归纳。机器学习,1(1):81–106,1986。ISSN 0885–6125。doi:10.1007/BF00116251。网址https://link . springer . com/content/pdf/10.1007% 2 fbf 00116251 . pdf

拉斯姆森;机器学习的高斯过程。2006

拉什卡;Mirjalili,v .机器学习与 Python 和 Scikit-Learn 和 tensor flow:Das umfassende Praxis-数据科学、深度学习和预测分析手册。mitp,Frechen,2。,aktualiserte und erweiterte Auflage Auflage,2018。ISBN 9783958457331

[Rod04] Rodehorst,v . Nahbereich dur ch Auto-kali briering 中的摄影测量学 3D-rekon structure 与几何投影师:Zugl。:柏林,Techn。大学,Diss。, 2004.wvb Wiss。Verl。柏林,柏林,2004。ISBN 978–3–936846–83–6

【Sci18a】ScikitLearn。3.3.模型评估:量化预测质量-sci kit-learn 0 . 20 . 0 文档,2018 年 10 月 5 日。URLhttps://sci kit-learn . org/stable/modules/model _ evaluation . html # regression-metrics

【Sci18c】ScikitLearn。sk learn . tree . decision tree regressor-sci kit-learn 0 . 20 . 0
文档,2018 年 11 月 8 日。网址https://sci kit-learn . org/stable/modules/generated/sk learn . tree . decision tree regressor . html

[Sci18e] ScikitLearn。3.3.模型评估:量化预测质量-sci kit-learn 0 . 20 . 0 文档,2018 年 10 月 24 日。网址https://sci kit-learn . org/stable/modules/model _ evaluation . html

[Sci18f] ScikitLearn。sk learn . model _ selection . cross _ val _ score—scikit learn 0 . 20 . 0 文档,24.10.2018。URLhttps://sci kit-learn . org/stable/modules/generated/sk learn . model _ selection . cross _ val _ score . html # sk learn . model _ selection . cross _ val _ score

[Sci18g] ScikitLearn。4.1.管道和复合估算器-sci kit-了解 0.20.0 文档,2018 年 10 月 26 日。网址https://scikit-learn.org/stable/modules/compose.html

[Sci18h] ScikitLearn。sk learn . preprocessing . polynomial features-sci kit-learn 0 . 20 . 0 文档,26.10.2018。URLhttps://sci kit-learn . org/stable/modules/generated/sk learn . preprocessing . polynomial features . html # sk learn . preprocessing . polynomial features

[Sci18j] ScikitLearn。sk learn . Gaussian _ process . kernels . expsinesquared—
sci kit-learn 0 . 20 . 0 文档,27.10.2018。网址https://sci kit-learn . org/stable/modules/generated/sk learn . Gaussian _ process . kernels . expsinesquared . html # sk learn . Gaussian _ process . kernels . expsinesquared

[Sci18k] ScikitLearn。sk learn . Gaussian _ process . kernels . rational quadratic—
sci kit-learn 0 . 20 . 0 文档,27.10.2018。网址https://sci kit-learn . org/stable/modules/generated/sk learn . Gaussian _ process . kernels . rational quadratic . html # sk learn . Gaussian _ process . kernels . rational quadratic

【sci 18m】ScikitLearn。1.7.高斯过程-sci kit-学习 0.20.1 文档,28.11.2018。网址https://sci kit-learn . org/stable/modules/Gaussian _ process . html

ScikitLearn。
不同内核的先验和后验高斯过程图解-sci kit-learn 0 . 20 . 0 文档,2018 年 10 月 31 日。URLhttps://sci kit-learn . org/stable/auto _ examples/Gaussian _ process/plot _ GPR _ prior _ posterior . html # sphx-glr-auto-examples-Gaussian-process-plot-GPR-prior-posterior-py

斯莫拉,A. J。支持向量回归教程。统计与计算,14(3):199–222,2004。ISSN 0960–3174。doi:10.1023/B:STCO。0000035301.49549.8849549.

[Vaf17] Vafa,k .高斯过程教程,2017。网址http://keyonvafa.com/gp-tutorial/

[Wei18]韦斯斯坦,e . L2-诺姆,2018 年。网址http://mathworld.wolfram.com/L2-Norm.html

[Wie12]维兰德;应对供应链风险。《国际物流与物流管理杂志》,42(10):887–905,2012 年。ISSN 0960–0035。doi:10.1108/09600031211281411。网址https://www . emerald insight . com/doi/pdf plus/10.1108/09600031211281411

[wiki18a]gau-Prozess,2018 年 10 月 13 日。网址https://de.wikipedia.org/w/index.php?oldid=181728459

[Yu12]余,h;金,SVM 教程-分类,回归和排名。
G .罗森堡;t .贝克;自然计算手册,479–506。施普林格柏林海德堡,柏林,海德堡,2012。ISBN 978–3–540–92909–3。

你可能不知道的 7 种熊猫功能

原文:https://towardsdatascience.com/7-pandas-functions-you-might-not-know-8219e8e07c62?source=collection_archive---------22-----------------------

这些函数很有用,但很少使用

作者图片

Pandas package 是数据科学家使用 Python 作为主要编程语言的主要数据分析工具。Pandas 包包含了数据科学家需要的所有东西,每个课程都教我们如何使用 Pandas 包。

尽管 Pandas 包很常见,但是这个 Python 包中仍然有很多人们可能会忽略的函数,可能是因为它很少被使用或者人们不知道它。这就是为什么在这篇文章中,我想概述一些我可能会错过的熊猫功能。让我们开始吧!

1.假期

Pandas 允许我们轻松地分析数据对象(datetime ),因为 Series 对象允许我们存储 datetime 对象。为了更方便地处理日期时间数据,Pandas 包为我们提供了一个类函数来创建假日自定义日历。虽然我们仍然需要设置日历,但该函数允许我们获取我们创建的所有假日日期(或工作日)。让我们尝试创建假日自定义日历。

#Importing the Pandas Function to create the Custom Calendar and The existing holiday
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, EasterMonday, Easter
from pandas.tseries.offsets import Day#Creating the business calendaer and listing the holiday you feel important
class BusinessCalendar(AbstractHolidayCalendar):rules = [
Holiday('New Years Day', month=1, day=1),
EasterMonday,
Holiday('Easter Day', month=1, day=1, offset=[Easter()]),
Holiday('Ascension Day', month=1, day=1, offset=[Easter(), Day(39)]),
Holiday('Christmas Day', month=12, day=25)
    ]

上面的代码将创建一个业务日历类,并设置您认为重要的假日。如果你不确定每个假期是什么时候,熊猫也提供了类如Easter来设置每年的复活节假期。让我们看看由自定义假日类创建的假日日期。

import pandas as pd
from datetime import date#Creating the year we want to take the holidat dateyear = 2021
start = date(year, 1, 1)
end = start + pd.offsets.MonthEnd(12)

# Getting the holidayscal = BusinessCalendar()
cal.holidays(start=start, end=end)

假期日期(图片由作者提供)

以上日期是基于之前在 2021 年创建的自定义类的假日日期。你可以改变这一年来过不同的复活节,因为每一年都是不同的。如果你想知道所有可用的假期课程,你可以在文档中查看。

2.询问

Pandas 包中的查询功能用于人类语言的数据选择。这是一个功能,旨在消除我们做数据选择时的麻烦,使用较少的罗嗦方式。让我们用一个数据集示例来尝试一下。

import pandas as pd
import seaborn as sns
mpg = sns.load_dataset('mpg')
mpg.head()

作者图片

通常,我们会使用列表子集来进行数据选择。例如,我们做一个如下代码所示的数据选择。

data[(data['mpg'] >15) |(data[model_year] == 70)]

使用查询功能,我们可以更容易、更人性化地选择数据。让我给你看下面的例子。

mpg.query('mpg > 15 or model_year == 70')

作者图片

使用 string 对象上你想要选择的查询函数,你就可以根据你的条件得到数据。结果与通常的选择方法相同,但是查询函数有一个不太冗长的条件,我们可以在查询中使用英文单词。

3.面具

Mask 函数特定于 Pandas 系列对象,它用另一个值替换系列中的值,但设置了 if-else 条件。更简单地说,您可以根据您想要的条件替换该值。让我们尝试在 mpg 数据集示例中使用 Mask 函数。

mpg['mpg'].mask(mpg['mpg'] < 20, 'Less than Twenty' )

作者图片

使用掩码方法时,我们通常会向方法传递两个参数;要替换的条件和值。在这种情况下,我给出了一个 mpg 值小于 20 的条件,然后用“小于 20”替换这些值。

如果您需要不止一个条件,我们需要将这些方法链接起来。

mpg['mpg'].mask(mpg['mpg'] < 20, 'Less than Twenty' ).mask(mpg['mpg'] > 30, 'More than Thirty')

作者图片

我之前提到过该函数专门用于 Series 对象。如果您在 DataFrame 对象中尝试它,它将用您的条件值替换当前行中的每个值,这是我们不希望的。

4.高光

使用 Pandas DataFrame 对象并不意味着我们不能对 DataFrame 美学做任何事情。事实上,您可以摆弄这个对象来创建一个视觉上有趣的数据框架。这就是为什么我们使用样式函数来样式化我们的数据框架——为了呈现数据,更好的美观,等等。

您可以在样式函数中探索许多函数,但是我将展示一些我经常使用的函数— 高亮显示函数

#Highlight the Highest and the lowest valuesmpg[['mpg', 'weight', 'acceleration']].head(10).style.highlight_max(color='yellow').highlight_min(color = 'lightblue')

作者图片

使用 Style highlight_maxhighlight_min函数,您可以突出显示列中最高和最低的值。如果你想做一个演示,想表达你的观点,这是很有用的。

如果您想突出显示从最低值到最高值渐变的列,您可以使用下面的代码。

mpg[['mpg', 'weight', 'acceleration']].head(10).style.background_gradient(cmap = 'Blues')

作者图片

函数background_gradient将产生一种很好的方式来呈现数据,让观众更好地了解数据。

5.应用地图

有时,您希望执行某个函数,通过处理数据集中的所有值来返回值。这就是为什么您需要applymap函数来对所有数据帧值执行您想要的函数。让我给你看一个例子。

#Here I create a function to transform each value into string object and return the length of the stringmpg.applymap(lambda x: len(str(x)))

作者图片

结果是一个 DataFrame 对象,其中我们传递给applymap函数的函数被应用于数据集中的每个值。该applymap功能是针对 DataFrame 对象的。对于 Series 对象,我们有相当于数据框属性的map函数。

mpg['name'].map(lambda x: len(str(x)))

作者图片

applymapmap中,你需要传递你之前创建的函数或者使用 Lambda 函数。

6.方法链接

方法链接是在同一行代码中执行以产生结果的连续函数。我们使用链式方法来减少我们写的行数,并更快地执行函数。让我在下面的代码中展示方法链接的例子。

#Method Chaining
mpg.head().describe()

作者图片

正如你在上面的代码中看到的,这个函数以一种接一种的方式链接起来,产生了上图中的结果。那么,如果你想用方法链接你自己的函数呢?在这种情况下,我们可以使用pipe函数来实现更快的方法链接函数。让我们用一个代码示例来更好地理解。首先,我将创建两个不同的函数。

#Function to extract the car first name and create a new column called car_first_namedef extract_car_first_name(df):
    df['car_first_name'] = df['name'].str.split(' ').str.get(0)
    return df#Function to add my_name after the car_first_name and create a new column called car_and_namedef add_car_my_name(df, my_name = None):
    df['car_and_name'] = df['car_first_name'] + my_name

这些函数会产生不同的结果,但是它们需要链接在一起才能得到结果。让我们使用pipe函数来做方法链接,使用我最近刚刚创建的这些函数。

mpg.pipe(extract_car_first_name).pipe(add_car_my_name, my_name = 'Cornellius')mpg.head()

作者图片

使用pipe函数,我们将我们创建的所有函数链接起来,产生了上面的结果。为什么我们使用pipe而不是将函数直接应用于数据帧?这是因为pipe函数比直接执行函数更快。

7.测绘

你知道 Pandas 软件包允许你直接从 DataFrame 或 Series 对象绘图吗?而且他们甚至还为你提供了一些有趣的绘图功能?。你可能知道一个简单的函数,比如plot函数。

mpg['mpg'].plot(kind = 'hist')

作者图片

然而,你知道熊猫还有一个更高级的绘图功能吗?让我们来看看其中的一些功能。

  • 拉德维兹图
mpg = sns.load_dataset('mpg')
pd.plotting.radviz(mpg.drop(['name'], axis =1), 'origin')

作者图片

Radviz plot 是一个绘图函数以原始的方式将多维数据投影到 2D 空间。基本上,该功能允许我们将三维或更多的数据可视化为二维可视化。

  • 自举 _ 绘图
pd.plotting.bootstrap_plot(mpg['mpg'],size = 50 , samples = 500)

作者图片

Boostrap 图是一个图函数,用于通过使用替换对数据进行重采样来确定基本统计的不确定性,如平均值和中值(您可以对相同的数据进行多次采样)。以上图为例。上面的均值图显示大部分结果在 23 左右,但也可能在 22.5 到 25 之间(或多或少)。这在现实世界中设定了不确定性,即人口中的平均值可能在 22.5 和 25 之间。

  • 散点 _ 矩阵
pd.plotting.scatter_matrix(mpg, figsize = (12,12))
plt.show()

作者图片

scatter_matrix函数产生数字列之间的散点图。如您所见,该函数自动检测我们传递给它的数据框中的数字特征,并创建一个散点图矩阵,对角线图是单列分布图。

结论

Pandas 是数据科学家处理数据的常用软件包。然而,这个软件包中有许多功能是许多人不知道的。

在这篇文章中,我试图解释 7 个我觉得很少被很多人使用的功能。它们是:

  1. 假期
  2. 询问
  3. 面具
  4. 高光
  5. 应用地图
  6. 方法链接
  7. 测绘

希望有帮助!

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的时事通讯。

如果您没有订阅为中等会员,请考虑通过我的推荐订阅。

在我的LinkedInTwitter 上访问我。

通往数据科学的 7 条道路

原文:https://towardsdatascience.com/7-paths-to-data-science-547c73611fca?source=collection_archive---------19-----------------------

图片鸣谢:作者插画。数据科学职业道路。

通向数据科学的普通或不普通的职业道路。教师、教员、会计师、工程师、艺术家和其他人如何进入数据科学。

介绍

从事数据科学职业有很多方法。本文涵盖了六种可能性。在所有的可能性中,有两件事要记住。第一,路径不止七条。第二,做这件事没有对错之分。

根据我与其他数据专业人士频繁和持续的讨论,我想分享一份通往数据科学的常见途径的总结。

例如,我职业生涯的大部分时间都在从事教育工作。在我的职业生涯中,我在教室里工作过。我在国外教书。此外,在最终过渡到数据科学之前,我进入了教育管理领域。我的路不是你的路。每个人都需要找到自己的路。

两个人在迷宫中穿行的图像。在数据科学(或其他数据相关领域)没有一条正确的职业道路的前提下,本文概述了六条职业道路。图片鸣谢:作者插画。

根据我与其他数据专业人士的频繁讨论,我想分享一个通往数据科学的常见途径的总结。我希望这篇文章能帮助那些想进入这个领域但不知道如何开始的人。

本文中的例子是复合材料。复合是一个从多个观察中提取细节的例子。使用复合材料的优点是它们提供了真实的例子,但是它们不依赖于来自任何特定人的信息。

复合材料不是虚构的。复合混合来自多个案例和多个数据源的数据。为了准备这些复合材料,我还参考了脸书、LinkedIn 和 Twitter。作为复合材料,它们代表了其他人也可能在自己的旅程中遵循的职业道路和策略。

我希望这篇文章能帮助那些想进入这个领域但不知道如何开始的人。

所以,让我们开始吧。

偶然数据科学家

我是从物理学开始的。我在大学教物理,然后也在高中教。然后,一家汽车制造商聘请我为工程师。我的团队的任务是优化机械过程的数字控制。数据科学是我们工作的重要组成部分。从此我就迷上了。”~偶然的数据科学家。

这个“偶然的”数据科学示例预示了下面的一些其他示例。在这里数据科学家成为数据科学家,不是为了追求数据科学,而是为了完成另一个目标。

作为这个主题“建立职业生涯”的观察者,我很喜欢这个例子,因为它强调了关注问题陈述或研究问题的重要性。这一组合中的数据科学家在发现数据科学的可能性后,继续留在了数据科学领域。然而,这一发现是在解决其他特定领域的问题时发现的。

艺术数据科学家

这一个不仅仅是专门研究数据可视化。

“我有视觉艺术学士学位,重点是广告。在软件开发行业的一家公司的市场部工作一年后,我开始攻读商业智能硕士学位。我相信商业智能硕士学位将有助于我在数据领域的职业发展。现在我是一名数据分析师,并继续学习数据科学。”~艺术数据科学家。

这张合成图展示了那些开始学习艺术和人文学科的人如何在以后将他们的注意力转向数据科学和高级分析。这份综合材料展示了一位职业女性,她在职业生涯早期表现出色,并将继续出色表现。做好现有的工作,同时学习和培训新的工作需要技巧和决心。

教师数据科学家

随着新冠肺炎·疫情因激励教师离开这个领域而受到指责(教育周教育资源市场观察美国消费者新闻与商业频道),我希望这种方式会越来越普遍。

“我最近也花了一点时间做学校老师。我有商学学士学位,我在大学里主要学习人事管理。后来我从事管理咨询,然后从事会计工作。我在数据科学硕士项目学习期间工作。当我晚上学习高等数学时,白天教数学帮助我跟上了进度。有时候我会想念孩子们,但我很高兴成为一名数据科学家。”~教师数据科学家。

这个组合是一个例子,说明对教学和学习充满热情的人通常可以很容易地进入数据科学。像这样的小路并不少见。作为一名数据科学家,需要具备教授他人和自学的能力。

计算机科学家数据科学家

当你可以成为两种科学家时,为什么要成为一种科学家呢?

“首先,我读了计算机科学本科,在做了 14 年商业情报分析师后,我全职回去攻读应用经济学和统计学硕士学位。毕业前,我得到了一家大型制药公司的首席数据科学家职位。”~计算机科学家数据科学家。

经济学家是数据科学职位的有力候选人。学习经济学通常需要计算机编程和统计学知识。计算机编程和统计学是数据科学工作的核心。这些领域共享技能和工具集。

通才技术员数据科学家

“我开始了 web 开发人员的职业生涯。经过一段时间,我获得了认证并获得了管理经验。我在项目规划和项目管理中扮演过多重角色。在过去的 6 年里,我管理质量项目的运作。我的道路包括一个数据科学的研究生课程。最终,我成了机器学习的高级顾问。我对学习充满热情,我也是谷歌、脸书、亚马逊、IBM 等提供的众多认证的粉丝。”~通才技术人员和数据科学家。

对于职业生涯中期和后期的专业人士,在获得广泛的技能和经验后,你有时会自然而然地成为多面手。从这个组合中得出的另一个重要观察结果是,数据科学家可以将终身学习新事物的兴趣归功于整体职业成功。

意向数据科学家

两条复合材料描绘了这条路径。这两种组合都涉及旨在教授数据科学的特定教育。

“在大学里,我开始主修数学。我计划成为一名数学老师。我完成了大部分数学课,但我的导师也告诉我,我已经接近获得艺术学位了。所以我也去了。教了两年书后,我决定寻找报酬更高的新机会。我的一些大学同学告诉我去追求数据科学,就像他们一样。他们说服我去做这件事。我找到了一个数据科学训练营。在数据科学训练营之后,我找到了一份分析师的工作。然而,不到一年后,我晋升到了数据科学职位。”~有心的数据科学家。

“我读完了工商管理本科。在大学期间,我意识到从事数据科学的职业是有利可图的。我的学院也提供速成硕士课程。通过在学校学习两个暑假外加第五年,你可以获得一个商学本科学位和一个数据科学硕士学位。我大学毕业后的第一份工作是在数据科学领域,现在我仍在那里工作。”~有心的数据科学家。

书生气十足的数据科学家

“我是家里第一个上大学的人。我热爱大学,也了解到我擅长研究和教学。我本科学的是历史。然后,我转了经济学硕士。作为一名硕士生,我与社会学教师有联系,并为一位教授工作,他管理着一个跨学科研究所。我实验室的导师鼓励我继续攻读社会学博士学位,并考虑学术生涯。我的学术生涯并不顺利。幸运的是,我在博士课程中“技术化”了,并在获得博士学位后不久就过渡到了数据科学领域。”~书生气十足的数据科学家。

受过博士教育的毕业生的供应超过了对受过博士教育的教师和研究人员的需求。

Bloomberg.com 声称美国输送了太多的博士。

同样,Medium.com 的另一位作者认为,有太多的博士,没有足够的工作,等等。

《高等教育纪事报》还报道说,目前很大一部分教师正在考虑新的和替代的职业道路。数据科学是向现任和前任教师开放的众多职业道路之一。

数据科学是向现任和前任教师以及其他受过博士教育的专业人士开放的众多职业道路之一。

https://adamrossnelson.medium.com/membership

结论

本文介绍了通向数据科学(或从事其他数据相关职业)的七条途径。对于那些没有打算成为数据科学家但找到了数据科学家工作的人来说,这是一条偶然的道路。还有艺术和教师之路。艺术和教师之路展示了非技术背景的人如何成功过渡到数据科学。

计算机科学家和多面手的道路代表了某种程度上的普通或许多人认为的传统道路。意向路径最终可能会成为主导路径。我将另一条路径命名为书生气路径。书呆子气是对那些为了追求远离高等教育的数据科学职业而离开学术界的学者的委婉说法。

我希望这篇文章能帮助那些想进入数据领域或想提高数据水平但不知道如何开始的人。通过这篇文章,我还旨在帮助那些觉得自己可能已经走上了错误道路的人。解决这种担忧的方法是要知道没有哪条道路天生就比另一条更好或更差。

威廉·冈克尔在 Unsplash 上拍摄的照片

感谢阅读

感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。Twitter:@ adamrossnelsonLinkedIn:Adam Ross Nelson 在 Twitter 和脸书: Adam Ross Nelson 在脸书

选择正确的深度学习框架的 7 个要点

原文:https://towardsdatascience.com/7-points-to-choose-the-right-deep-learning-framework-815978c5c327?source=collection_archive---------32-----------------------

是 Pytorch,Keras,还是 Tensorflow?

照片由 瓦伦丁·安东努奇 发自 Pexels

每一个打算在数据科学领域开始职业生涯的技术爱好者,都会在旅程中的任何时候在谷歌上搜索这个。但是,大多数时候我们得不到明确的答案,而且我们经常以困惑告终。

在这篇文章中,我将尝试帮助您选择更好的深度学习库。我们将对不同的因素进行分析,如架构、速度、用户友好性、受欢迎程度等等。

但是,在开始分析部分之前,让我们简要了解一下它们。

克拉斯

神经网络库是开源的。在这个符号数学库中,我们解决与深度学习和机器学习相关的问题。

这个工具的目的是使用深度学习进行快速实验。Keras 就是一个高级编程 API。该应用由 Francois Chollet 于 2015 年 3 月 27 日开发

Pytorch

这是一个用 Python & C++编写的机器学习 torch 库,可以作为开源程序下载。

脸书的研究小组在 2016 年 10 月开发了这项技术,用于自然语言处理、计算机视觉等应用。

当比较高水平和低水平时,这个程序介于 TensorFlow 和 Keras 之间。

张量流

该库很容易与 C++、Java 和其他代码语言集成。它为开发人员和公司提供了全面的工具来构建基于机器学习的应用程序。在这个符号数学库中,解决了深度学习和机器学习问题。

在编程中,TensorFlow 被称为底层 API。它是由谷歌于 2015 年 11 月 9 日创建的。

1。架构

大而复杂的模型训练起来最耗时,所以对于大而复杂的模型处理速度会少一些。

与 Keras 相比,PyTorch 具有更复杂的架构,这导致可读性较差。

这场比赛的获胜者是 TensorFlow 和 PyTorch,它们都是实用的低级模拟框架,速度和时间都很快。

2。速度

Keras 不会在最低速度以上运行。TensorFlow 和 Pytorch 都以最大速度工作,从而带来高性能。

3。API 级别

Keras 的 API 提供了对 Theano 和 CNTK 的访问,所以 Keras 可以在这两个平台上执行。

由于 PyTorch 的底层 API,它只支持数组表达式。最近,它获得了极大的关注,并成为学术研究和需要自定义表达式优化的深度学习应用程序的首选解决方案。

除了提供低级 API,TensorFlow 还提供高级 API。

4。初学者友好型

Keras 中设计了快速原型功能,使深度学习模型易于测试。该程序有一个对初学者非常友好的界面,用户可以像使用乐高积木一样轻松地构建神经网络。

调试 Python 错误就像调试 Python 代码一样简单。使用任何流行的 Python 调试器都可以调试这些错误。

可以使用 Tensorflow 的调试模块来调试其中的错误。

5。调试

使用 Keras 通常很简单,您不太可能遇到任何困难。然而,由于它在后端平台上有太多的抽象层次,调试通常会很困难。

使用 Pytorch 可以比使用 Keras 或 TensorFlow 更容易地进行调试。

TensorFlow 的调试过程可能具有挑战性。

6。流行趋势

Keras 广泛使用基于内核的神经网络,包括卷积层和效用层。Keras 最常用于 Nvidia、优步、亚马逊、苹果和网飞等公司。

它在内部对谷歌的使用以及它用来自动捕捉图像的软件都使它出名。除了谷歌、LinkedIn、Snap、AMD、彭博、Paypal 和高通,Tensorflow 也被许多其他公司使用。

凭借其 NN 模块、优化模块和自动签名模块,Keras 支持高功率 GPU 应用,其在深度学习网络上的自动微分使其广受欢迎。使用 Pytorch 的主要公司有脸书、富国银行、Salesforce、基因泰克、微软和摩根大通。

7。数据集

在最初的版本中,Keras 的速度很慢,是为快速原型设计的。因此,该框架不太适合处理大型数据集。它在较小的数据集中工作良好的原因是它的执行速度很快。

虽然 TensorFlow 和 PyTorch 是底层框架,但它们能够很好地处理大型数据集,因为它们速度很快。

使用此工具可以在高维数据集上执行高性能任务。

结论

为了比较这三个框架,我们考察了各种参数。虽然 PyTorch 用户友好且简单,但 TensorFlow 因其单薄的 API 而不尽人意。

Keras 和 TensorFlow 拥有由砖块和砂浆建造的墙,但它们为通信留下了微小的开口,而 PyTorch 与 Python 紧密绑定,可以应用于许多不同的平台。

走之前……

如果你喜欢这篇文章,并且想继续关注更多关于 Python &数据科学精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为中级会员。

请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: Pranjal 的简讯

使用 Seaborn 创建更好的直方图的 7 个要点

原文:https://towardsdatascience.com/7-points-to-create-better-histograms-with-seaborn-5fb542763169?source=collection_archive---------13-----------------------

超越默认设置

宇宙时间旅行者在 Unsplash 上拍摄的照片

数据可视化在数据科学中至关重要。它帮助我们探索数据集中的底层结构以及变量之间的关系。我们还可以使用数据可视化技术来更有效地报告我们的发现。

我们如何通过数据可视化传递信息也很重要。我们可以通过小小的调整使情节更有知识性或吸引力。数据可视化库提供了几个参数来自定义生成的地块。

在本文中,我们将讨论 7 个要点来定制 Seaborn 库中的直方图。直方图主要用于检查连续变量的分布。它将数值范围划分为离散的箱,并显示每个箱中数据点(即行)的数量。

我们将创建一个包含两列的样本数据框架,一列是连续的,一列是分类的。我们首先导入库。

import numpy as np
import pandas as pd
import seaborn as sns
sns.set(style='darkgrid')

我们现在可以用 NumPy 和 Pandas 创建示例数据帧。

df1 = pd.DataFrame({'col1':'A', 
                    'col2':np.random.randn(100) * 10 + 50})df2 = pd.DataFrame({'col1':'B', 
                    'col2':np.random.randn(100) * 10 + 60})df3 = pd.DataFrame({'col1':'C', 
                    'col2':np.random.randn(100) * 10 + 70})df = pd.concat([df1, df2, df3])

(图片由作者提供)

“列 1”包括三个不同的类别,“列 2”包括正态分布的数值。

让我们首先用默认设置创建一个简单的直方图。然后,我们将在整篇文章中尝试改进它。Seaborn 的 displot 功能用于创建分布图。种类参数设置为“hist ”,以生成直方图。

sns.displot(data=df, x='col2', kind='hist')

(图片由作者提供)

1.调整尺寸

首要的调整是尺寸。高度似乎不错,但更宽的地块可能看起来更好。定制大小的两个参数是高度和长宽比。

sns.displot(data=df, x='col2', kind='hist',
            height=6, aspect=1.4)

2.箱子数量

增加箱的数量就像增加图像的分辨率。通过将值域划分为更多的区间,我们可以更详细地了解分布情况。

所需箱的数量被传递给箱参数。

sns.displot(data=df, x='col2', kind='hist',
            height=6, aspect=1.4, bins=18)

(图片由作者提供)

3.用色调分隔类别

“col1”列有三个不同的类别。我们可能希望分别查看每个类别的分布情况。区分类别的一种方法是色调参数。

我们只传递列名作为分隔符。

sns.displot(data=df, x='col2', kind='hist',
            height=6, aspect=1.4, bins=18,
            hue='col1')

(图片由作者提供)

每个类别用不同的颜色显示。代表仓的条被放置在彼此的顶部。如果您喜欢并排显示它们,可以使用 multiple 参数,如下所示。

sns.displot(data=df, x='col2', kind='hist',
            height=6, aspect=1.4, bins=18,
            hue='col1', multiple='dodge')

(图片由作者提供)

4.用行或列分隔类别

为不同类别生成单独分布的另一种方法是创建一个网格图。col 参数用于将每个类别表示为一个新列。类似地,row 参数使用行执行相同的操作。

sns.displot(data=df, x='col2', kind='hist', 
            bins=18, col='col1')

(图片由作者提供)

5.选择特定范围

在某些情况下,我们可能需要检查特定范围的分布。例如,如果一个变量包含极端异常值,包含所有值的直方图不会告诉我们太多。

我们可以使用“binrange”参数来确定要绘制的范围的上限和下限。

在实现这个特性之前,让我们在数据框架中添加一些异常值。

df4 = pd.DataFrame({'col1':'D', 
                    'col2':np.random.randn(10) * 10 + 1000})df_new = pd.concat([df, df4])

整个数值范围的直方图如下所示。

sns.displot(data=df_new, x='col2', kind='hist',
            height=6, aspect=1.4)

(图片由作者提供)

我们可以把范围缩小到 20 到 100 之间。

sns.displot(data=df_new, x='col2', kind='hist',
            height=6, aspect=1.4,
            binrange=(20,100))

(图片由作者提供)

6.缩放数值范围

另一种可视化带有异常值的变量分布的方法是通过缩放变换值。例如,我们可以在前面的示例中对数据帧使用对数标度。

sns.displot(data=df_new, x='col2', kind='hist',
            height=6, aspect=1.4,
            log_scale=True)

(图片由作者提供)

在一定程度上消除了异常值的影响。

7.颜色

颜色是可视化的重要组成部分。我们有很多颜色可供选择。如果我们使用 hue 参数来区分类别,我们可以使用 palette 参数来更改颜色。

sns.displot(data=df, x='col2', bins=18,
            height=6, aspect=1.4, hue='col1',
            palette='GnBu')

(图片由作者提供)

如果您想快速查看调色板值的可用选项,只需输入一个随机值,错误消息将显示所有可能的选择。

如果我们不使用色调参数,我们可以简单地通过使用颜色参数来改变颜色。

sns.displot(data=df, x='col2', bins=18,
            height=6, aspect=1.4,
            color='lightblue')

(图片由作者提供)

结论

我们已经介绍了 7 个技巧来使直方图更具信息性和吸引力。还有其他技术可以进一步定制这些可视化效果,但是在大多数情况下,本文中的 7 个技巧就足够了。

数据可视化在数据科学中非常重要。它们不仅有助于报告和交付结果,也是一个强大的数据分析工具。

为了充分利用数据可视化,在某些情况下,我们需要超越函数或库的默认设置。因此,我们应该学会如何定制或调整它们。

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

用 Seaborn 创建更好的散点图的 7 个点

原文:https://towardsdatascience.com/7-points-to-create-better-scatter-plots-with-seaborn-9f0202fb2ba4?source=collection_archive---------17-----------------------

如何充分利用散点图

汤姆·塞恩在 Unsplash 上的照片

数据可视化在数据科学中至关重要。它帮助我们探索数据集中的底层结构以及变量之间的关系。我们还可以使用数据可视化技术来更有效地报告我们的发现。

我们如何通过数据可视化传递信息也很重要。我们可以通过小小的调整使情节更有知识性或吸引力。数据可视化库提供了几个参数来自定义生成的地块。

在本文中,我们将讨论 7 个要点来定制 Seaborn 库中的散点图。散点图主要用于可视化两个连续变量之间的关系。它们概述了变量之间的相关性。

我们将使用 Kaggle 上的墨尔本房屋数据集创建几个散点图。让我们首先导入库。

import numpy as np
import pandas as pd
import seaborn as sns
sns.set(style='darkgrid')

下一步是将数据集读入熊猫数据帧。

cols = ['Price','Distance','Rooms','Type','Landsize','Regionname']melb = pd.read_csv("/content/melb_data.csv", 
                   usecols=cols).sample(n=300)melb = melb[melb.Landsize < 3000]

(图片由作者提供)

我只从数据集中选择了一个小样本,并且只包含了 6 列。最后一行过滤掉可以被认为是关于土地大小的异常值的行。

我们将使用 Seaborn 的 relplot 功能。这是一个图形级界面,用于绘制散点图和线图这两种不同的关系图。使用种类参数选择绘图类型。

让我们使用默认设置创建一个简单的价格和距离列散点图。然后,我们可以复习一些技巧,使散点图更具信息性和吸引力。

sns.relplot(data=melb, x='Price', y='Distance', kind='scatter')

(图片由作者提供)

距离栏表示到中央商务区(CBD)的距离。每个点代表一个观察点(即一所房子)。我们观察到价格和到中央商务区的距离成负相关。

1.调整尺寸

可视化的大小是一个重要的特性,应该很容易定制。relplot 函数的高度和纵横比参数用于更改可视化的大小。aspect 参数表示宽度和高度的比率。

sns.relplot(data=melb, x='Price', y='Distance', kind='scatter',
            height=6, aspect=1.2)

(图片由作者提供)

2.用色调分隔类别

在一个列中分别表示不同的类别会提供更多的信息。例如,我们可以用不同的颜色来区分不同类型的房子。这些任务可以通过色调参数来完成。

sns.relplot(data=melb, x='Price', y='Distance', kind='scatter',
            height=6, aspect=1.2, hue='Type')

(图片由作者提供)

我们清楚地看到,u 型住房更接近 CDB,一般来说更便宜。t 型(联排别墅)是一种中间类型。随着我们搬离中央商务区,房子变得越来越贵,越来越大。

3.用行或列分隔类别

我们也可以使用多个支线剧情来分隔不同的类别。col 参数用于将每个类别表示为一个新列。类似地,row 参数使用行执行相同的操作。

sns.relplot(data=melb, x='Price', y='Distance', kind='scatter',
            height=4, aspect=1.5, col='Type')

(图片由作者提供)

4.点的大小

散点图用点表示数据点(即行)。我们也可以用点的大小来传递信息。例如,将 rooms 列传递给 size 参数,点的大小就与房子中房间的数量成比例。

sns.relplot(data=melb, x='Price', y='Distance', kind='scatter',
            height=6, aspect=1.2, size='Rooms')

(图片由作者提供)

随着我们离开 CDB,总的趋势是拥有更大的房子。这是有意义的,因为在市中心,空间变得越来越受关注。

5.颜色

颜色是视觉化的重要元素。在散点图中,我们有两个选项来改变点的颜色。如果使用了色调参数,我们传递一个调色板来改变颜色。

sns.relplot(data=melb, x='Price', y='Distance', kind='scatter',
            height=6, aspect=1.2, hue='Type', palette='cool')

(图片由作者提供)

如果没有色调参数,我们可以简单地使用颜色参数来为点选择所需的颜色。

sns.relplot(data=melb, x='Price', y='Distance', kind='scatter',
            height=6, aspect=1.2, color='orange')

(图片由作者提供)

6.成对关系

Seaborn 的 pairplot 函数可用于生成散点图网格,以探索变量之间的成对关系。默认情况下,它包括所有的数字变量。但是,我们可以通过只选择感兴趣的列来更改它。

sns.pairplot(melb[['Price','Distance','Landsize']], height=3)

(图片由作者提供)

值得注意的是,pairplot 函数的 height 参数调整子情节的大小,而不是整个网格的大小。

除了对角线上的子图之外,每个子图都表示 x 轴和 y 轴上指示的列之间的关系。默认情况下,对角线上的子图显示列的直方图。我们可以通过使用 diag_kind 参数来更改在对角线上绘制的绘图类型。

直方图主要用于检查连续变量的分布。它将数值范围划分为离散的箱,并显示每个箱中数据点(即行)的数量。

7.定制配对图

还可以定制 pairplot 函数来携带更多信息。例如,我们可以添加一个色调变量,就像我们对 relplot 函数所做的那样。

sns.pairplot(melb[['Price','Distance','Landsize','Type']], hue='Type', height=3)

(图片由作者提供)

当使用色调参数时,对角线上的图自动变成核密度估计(kde)。

结论

我们已经介绍了 7 个技巧,可以让 Seaborn 的散点图更具信息性和吸引力。还有其他技术可以进一步定制这些可视化效果,但是在大多数情况下,本文中的 7 个技巧就足够了。

数据可视化在数据科学中非常重要。它们不仅有助于报告和交付结果,也是一个强大的数据分析工具。

为了充分利用数据可视化,在某些情况下,我们需要超越函数或库的默认设置。因此,我们应该学会如何定制或调整它们。

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

深度学习中你应该知道的 7 个常用激活函数以及如何与 Keras 和 TensorFlow 2 配合使用

原文:https://towardsdatascience.com/7-popular-activation-functions-you-should-know-in-deep-learning-and-how-to-use-them-with-keras-and-27b4d838dfe6?source=collection_archive---------1-----------------------

TensorFlow 2 教程

西格蒙德,坦,雷卢,漏雷卢,普雷卢,eLU 和 SELU 的实用介绍

深度学习中 7 个流行的激活函数(图片由作者使用canva.com)

在人工神经网络(ann)中,激活函数是一个数学“门”,位于当前神经元的输入和下一层的输出之间[1]。

激活功能是深度学习的核心。它们决定了模型的输出、精度和计算效率。在某些情况下,激活函数对模型的收敛能力和收敛速度有很大的影响。

在本文中,您将了解以下深度学习中最受欢迎的激活函数,以及如何在 Keras 和 TensorFlow 2 中使用它们。

  1. 乙状结肠(逻辑)
  2. 双曲正切值
  3. 整流线性单元
  4. 泄漏 ReLU
  5. 参数泄漏 ReLU (PReLU)
  6. 指数线性单位(ELU)
  7. 比例指数线性单位(SELU)

源代码请查看笔记本

1.乙状结肠(逻辑)

s 形函数(也称为逻辑函数)是使用最广泛的激活函数之一。该函数定义为:

乙状结肠激活功能(图片由作者提供)

函数及其导数的绘图。

Sigmoid 函数及其导数的绘图(图片由作者提供)

正如我们在上面的图表中看到的,

  • 该函数是一条普通的 S 形曲线。
  • 该功能的输出以 0.5 为中心,范围从 01
  • 该函数是可微的。这意味着我们可以在任意两点找到 sigmoid 曲线的斜率。
  • 函数是单调的,但函数的导数不是。

Sigmoid 函数在 20 世纪 90 年代被引入人工神经网络(ANN)以取代函数【2】。这是人工神经网络架构的一个关键变化,因为函数没有任何梯度来处理梯度下降,而 Sigmoid 函数在任何地方都有明确定义的非零导数,允许梯度下降在训练期间的每一步都取得一些进展。

Sigmoid 激活函数的问题

Sigmoid 函数的主要问题是:

  1. 消失梯度:查看函数图,可以看到当输入变小或变大时,函数在 0 或 1 处饱和,导数非常接近 0。因此,它几乎没有梯度通过网络传播回来,所以几乎没有什么留给低层[2]。
  2. 计算开销:函数有一个指数运算。
  3. 输出不在零中心:

如何配合 Keras 和 TensorFlow 2 使用

要在 Keras 和 TensorFlow 2 中使用 Sigmoid 激活函数,我们可以简单地将'sigmoid'传递给参数activation:

from tensorflow.keras.layers import DenseDense(10, **activation='sigmoid'**)

要将函数应用于某些常量输入:

import tensorflow as tf
from tensorflow.keras.activations import **sigmoid**z = tf.constant([-20, -1, 0, 1.2], dtype=tf.float32)
output = **sigmoid(z)**
output.numpy()

2.双曲正切值

另一个非常流行和广泛使用的激活函数是双曲正切,也称为 Tanh 。它被定义为:

tanh 函数(图片由作者提供)

函数及其导数的绘图:

tanh 及其衍生产品的情节(图片由作者提供)

我们可以看到该函数与 Sigmoid 函数非常相似。

  • 该函数也是常见的 S 形曲线。
  • 不同之处在于 Tanh 的输出是以零点为中心的,范围从 -11 (而不是在 Sigmoid 函数的情况下从 0 到 1)
  • 与 Sigmoid 相同,这个函数是可微的
  • 与 Sigmoid 相同,函数是单调的,但函数的导数不是。

Tanh 具有与 Sigmoid 相似的特性,可以进行梯度下降。值得一提的重要一点是 Tanh 倾向于使每一层的输出或多或少地集中在 0 附近,这通常有助于加速收敛[2]。

Tanh 激活函数的问题

由于 Tanh 具有与 Sigmoid 相似的特性,它也面临以下两个问题:

  1. 消失梯度:查看函数图,可以看到当输入变小或变大时,函数在-1 或 1 处饱和,导数非常接近 0。因此,它几乎没有梯度传播回网络,所以几乎没有什么留给较低的层。
  2. 计算开销:函数有一个指数运算。

如何将 Tanh 与 Keras 和 TensorFlow 2 一起使用

为了使用 Tanh,我们可以简单地将'tanh'传递给参数activation:

from tensorflow.keras.layers import DenseDense(10, **activation='tanh'**)

要将函数应用于某些常量输入:

import tensorflow as tf
from tensorflow.keras.activations import **tanh**z = tf.constant([-20, -1, 0, 1.2], dtype=tf.float32)
output = **tanh****(z)**
output.numpy()

3.整流线性单元

整流线性单元(ReLU) 是深度学习中最常用的激活函数。如果输入是负的,函数返回 0,但是对于任何正的输入,它返回该值。该函数定义为:

ReLU 函数(图片由作者提供)

函数及其导数的绘图:

ReLU 及其衍生产品的情节(图片由作者提供)

我们可以看到:

  • 从图形上看,ReLU 函数由两个线性部分组成,以解决非线性问题。如果斜率不是常数,函数就是非线性的。因此,ReLU 函数在 0 附近是非线性的,但斜率总是为 0(负输入)或 1(正输入)。
  • ReLU 函数是连续的,但是它是而不是 可微的,因为它的导数对于任何负输入都是 0。
  • ReLU 的输出没有最大值(它是未饱和,这有助于梯度下降
  • 该函数计算速度非常快(与 Sigmoid 和 Tanh 相比)

令人惊讶的是,这样一个简单的函数在深度神经网络中工作得非常好。

ReLU 的问题

ReLU 在大多数应用程序中运行良好,但并不完美。它遇到了一个被称为将死的问题。

垂死挣扎

在训练过程中,一些神经元实际上已经死亡,这意味着它们不再输出除 0 以外的任何信息。在某些情况下,你可能会发现你的网络中有一半的神经元已经死亡,尤其是当你使用大的学习速率时。当神经元的权重被调整为训练集中所有实例的输入加权和都为负值时,神经元就会死亡。当这种情况发生时,它只是保持输出 0,梯度下降不再影响它,因为当 ReLU 函数的输入为负时,它的梯度为 0。

动手机器学习[2],第 329 页

如何配合 Keras 和 TensorFlow 2 使用

要将 ReLU 与 Keras 和 TensorFlow 2 一起使用,只需设置activation='relu'

from tensorflow.keras.layers import DenseDense(10, **activation='relu'**)

要将函数应用于某些常量输入:

import tensorflow as tf
from tensorflow.keras.activations import **relu**z = tf.constant([-20, -1, 0, 1.2], dtype=tf.float32)
output = **relu****(z)**
output.numpy()

4.泄漏 ReLU

Leaky ReLU 是对 ReLU 激活功能的改进。它拥有热路的所有属性,而且永远不会有将死热路的问题。泄漏 ReLU 定义为:

f(x) = max(*α*x, x)

超参数*α* 定义了函数泄漏的多少。它是 x < 0 的函数斜率,通常设置为0.01。小斜率保证了漏的 ReLU 永远不死。

如何将 Leaky ReLU 与 Keras 和 TensorFlow 2 配合使用

要使用 Leaky ReLU 激活函数,您必须创建如下所示的LeakyReLU实例:

from tensorflow.keras.**layers** import **LeakyReLU, Dense****leaky_relu = LeakyReLU(alpha=0.01)**
Dense(10, **activation=leaky_relu**)

5.参数泄漏继电器(预继电器)

参数 leaky ReLU ( PReLU )是 leaky ReLU 的变体,其中*α* 被授权在训练时学习(它不再是一个超参数,而是成为一个可以像其他任何参数一样通过反向传播进行修改的参数)。据报道,这在大型图像数据集上明显优于 ReLU,但在较小的数据集上,它有过拟合训练集的风险[2]。

如何将 PReLU 与 Keras 和 TensorFlow 2 一起使用

要使用参数泄漏 ReLU,您必须创建如下所示的PReLU实例:

from tensorflow.keras.**layers** import **PReLU, Dense****para_relu = PReLU()**
Dense(10, **activation=para_relu**)

6.指数线性单位(ELU)

指数线性单元 ( ELU )是 ReLU 的变体,对于 z < 0 具有更好的输出。该函数定义为:

ELU 函数(图片由作者提供)

超参数*α*控制负净输入下 ELU 的饱和值。

函数及其导数的绘图:

ELU 的情节及其衍生(图片由作者提供)

我们可以在上面的图中看到,

  • ELU 修改了函数负部分的斜率。
  • Leaky ReLUPReLU 功能不同, ELU 对负值使用对数曲线,而不是直线。

根据作者的说法,ELU 在他们的实验中胜过了所有的 ReLU 变体[3]。

ELU 的问题

根据[2,3],ELU 激活的主要缺点是它比 ReLU 及其变体的计算更慢(由于指数函数的使用),但是在训练期间,这通过更快的收敛速率来补偿。但是,在测试时,ELU 网络会比 ReLU 网络慢。

如何配合 Keras 和 TensorFlow 2 使用

在 TensorFlow 2 中实现 ELU 比较繁琐,只需在构建每一层时指定激活函数即可:

Dense(10, **activation='elu'**)

要将函数应用于某些常量输入:

import tensorflow as tf
from tensorflow.keras.activations import **elu**z = tf.constant([-20, -1, 0, 1.2], dtype=tf.float32)
output = **elu****(z, alpha=1)**
output.numpy()

7.比例指数线性单位(SELU)

指数线性单位 ( 卢瑟)激活函数是 günter·克兰鲍尔等人【4】在 2017 年提出的 ReLU 的又一变种。作者表明,如果你建立一个专门由一堆密集层组成的神经网络,并且如果所有隐藏层都使用 SELU 激活函数,那么网络将自我规范化(在训练期间,每层的输出将倾向于保持均值 0 和标准差 1,这解决了消失/爆炸梯度问题)。这种激活功能通常显著优于其他激活功能。

SELU 被定义为:

f(x) = scale * x                 , z > 0
     = scale * *α* * (exp(x) - 1)   , z <= 0

其中*α*scale是预定义的常数(*α*=1.67326324scale=1.05070098)。

SELU 的阴谋及其衍生物:

SELU 的情节及其衍生(图片由作者提供)

SELU 的问题

SELU 的主要问题是 SELU 的工作有几个条件:

  • SELU 只对由一堆密集层组成的神经网络有效。它可能不适用于卷积神经网络。
  • 每个隐藏层的权重也必须使用 LeCun 正常初始化进行初始化。
  • 输入要素必须使用平均值 0 和标准差进行标准化。

如何配合 Keras 和 TensorFlow 2 使用

要将 SELU 与 Keras 和 TensorFlow 2 配合使用,只需设置activation='selu'kernel_initializer='lecun_normal':

from tensorflow.keras.layers import DenseDense(10, **activation='relu', kernel_initializer='lecun_normal'**)

如何选择一个激活函数?

我们已经经历了深度学习中 7 种不同的激活功能。建立模型时,激活函数的选择至关重要。那么应该使用哪个激活函数呢?这是《ML 实践》一书中的一个一般性建议

虽然您的里程会有所不同,但总的来说,SELU > ELU > leaky ReLU(及其变体)> ReLU > tanh > logistic。如果网络的架构阻止它自我正常化,那么 ELU 可能会比 SELU 表现得更好(因为 SELU 在 z = 0 处不平滑)。如果您非常关心运行时延迟,那么您可能更喜欢 leaky ReLU。如果您不想调整另一个超参数,您可以使用 Keras 使用的默认 α 值(例如,泄漏的 ReLU 为 0.3)。如果您有空闲时间和计算能力,您可以使用交叉验证来评估其他激活函数,特别是 RReLU(如果您的网络过度拟合),或者 PReLU(如果您有庞大的训练集)。

动手 ML,第 332 页

结论

在本文中,我们经历了深度学习中的 7 种不同的激活函数,以及如何将它们与 Keras 和 TensorFlow 一起使用。

我希望这篇文章能帮助你节省建立和调整你自己的深度学习模型的时间。我建议你查看 Keras 文档中的激活功能,并了解你可以做的其他事情。

感谢阅读。请查看笔记本获取源代码,如果您对机器学习的实用方面感兴趣,请继续关注。

您可能对我的其他 TensorFlow 文章感兴趣:

更多可以从我的 Github 中找到

参考

7 对 2021 年数据的预测

原文:https://towardsdatascience.com/7-predictions-for-data-in-2021-3b7fbc92b71f?source=collection_archive---------43-----------------------

包括 DataOps,Data Strategy 和 xAI。

图片作者。

众所周知,人类不擅长预测未来(尤其是长期)。然而,这仍然是一个有用的练习。让我们看看我认为 2021 年将给数据科学、工程和战略带来什么。这个列表没有特定的顺序,主要集中在我在德国的观察:

  • 角色稳定。在过去几年中,数据领域的新角色不断涌现,如机器学习工程师、数据产品负责人等。这些还没有完全流行起来,大公司仍然求助于数据科学家的传统角色。我认为为雇员和雇主提供更多的职位以及相关的技能是一个好主意。
  • m lops 工具整合。去年是 MLOPs 工具和创业公司种类爆炸的一年。尽管如此,许多这样的公司提供的只是同一种产品的变种。2021 年,许多公司将被淘汰,而领先者将占据大部分市场。
  • 炒作中成长的 DataOps】。敏捷和精益方法在数据科学和工程中的应用将会得到更广泛的讨论。
  • 数据策略成为主流。在过去的两年里,我一直在关注这个话题,然而这种工作描述仍然很少见,尤其是在欧洲。然而,这并不意味着现有人员不能担任该角色。他们可能只是在不同的瓷砖下工作。尽管如此,这个领域对于成功交付数据项目是必不可少的,我对进一步的增长和接受持乐观态度。
  • 生产中的 xAI。xAI 已经在 Gartner 炒作曲线上爬了很长时间,现在达到了开始交付结果的点。这个子领域的成功仍然存在障碍(比如不稳定的开源软件和晦涩难懂的技能)。尽管如此,新的工具正在出现,以推动其生产。
  • 进一步的数据工程爆炸。没有一个数据科学项目是成功的,没有它的基础——数据工程。企业认识到这一点的时间较晚,2021 年仍会有赶超。
  • 智能数据清理和 ETL 工具。每个人都知道清理数据所花费的时间。到目前为止,这是一个用工具解决的棘手问题,但新的发展,如云数据准备将催生竞争对手。

有了这个清单,我想在数据上对 2021 年许两个愿望。第一,我希望整个领域,但尤其是它的 ML 部分,变得更“无聊”,但有用。第二,我们开始使用这种神奇的技术来解决我们面临的紧迫问题,并走向一个更加乐观和雄心勃勃的未来。

注:本文原载于 https://boyanangelov.com/blog/data-predictions-2021/https://boyanangelov.com/blog/data-predictions-2021/

培养编码习惯的 7 种行之有效的方法

原文:https://towardsdatascience.com/7-proven-ways-to-develop-a-coding-habit-3727914c3489?source=collection_archive---------7-----------------------

让 2021 年成为你养成易于维护并产生效果的编码习惯的一年

图片来自 Pixabay

新年伊始,人们通常会为自己设定一些崇高的目标,比如在年底前成为某个人或完成某件事。

然而,在一月份的前几周结束时,我们中的许多人已经搁置了我们的目标,以等待下一年的开始。是因为缺乏动力吗?是因为缺少实现目标的时间吗?事实是,很可能两者都不是。

编码,就像去健身房,健康饮食,一年读 52 本书,或任何其他典型的新年目标一样,(以最简单的形式)是一种必须培养和保持才能获得结果的习惯。我们的决心如此注定失败的原因之一是因为我们没能把它们变成一种习惯。不仅如此,我们中的许多人都无意中用不可持续的习惯束缚了自己,让我们看不到结果。

养成一个编码习惯并没有什么不同,可能会遭遇和其他习惯一样的陷阱。然而,有一些方法可以培养一种编码习惯,这种习惯会产生你能够保持的结果。引用祖列·雷恩的话(因为这是我认为我会读到的关于养成习惯的最好的引语),

“养成好习惯并不需要 21 天,也不需要天意,也不需要你最喜欢的生产力大师的祝福。”— 祖列拉内

将编码与你的兴趣联系起来。

编码有时会是一种枯燥的体验,尤其是当你在做一些你不感兴趣的事情时。

解决这个问题的最好方法是把编码和你感兴趣的东西联系起来。幸运的是,代码触及了我们生活中的一切,这使得我们很容易将所学应用到有趣的事情中。

对股市感兴趣?使用 Python 编写一个收集股票数据的程序,这样你就可以计划下一次交易。你是一个热爱 f1 的“汽油迷”吗?使用机器学习创建 F1 比赛预测器。对气候变化和传染病之间的相互作用感兴趣?使用 Python 和数据可视化技术完成气候变化与全球疟疾死亡之间关系的分析。

换句话说,如果你有一种激情,你可以为它编码。

这里有一些上面提到的想法的链接,可以帮助你开始:

使用“线索-常规-奖励”习惯循环法。

这是一个久经考验并经常被吹捧的养成习惯的方法。

记者兼生产力作家查尔斯·杜希格(Charles Duhigg)与神经学家、心理学家和研究人员合作,创造了一种培养人们将保持的习惯的方法。他描述了这样一种普遍现象:人们满怀热情地进入新年,对自己的决心充满了兴奋,但却在二月份放弃了这些决心。

他对培养可维持习惯的建议包括使用“线索-奖励-常规”方法,这是一种科学开发的产生结果的方法。你首先要选择一个“线索”或者一个信号来触发这个习惯。然后,你确定在收到提示后,你会完成什么常规(习惯)。最后,你选择一个奖励,你将在例行程序完成后收到。因此,完成了“线索-常规-奖励”的习惯循环。

对我来说,这似乎类似于研究人员教老鼠完成任务以换取食物奖励的方法。但是,嘿,人类和老鼠有 85%的 DNA 是相同的,所以如果这对他们有用,那对我们也一定有用!

暗示。

你选择的提示可以是一天中的某个特定时间、你的心情,或者是一个物理提示,比如时钟的报时声(或者更现实的是你的手机闹钟铃声)。这将因人而异。

常规(习惯)。

一旦你知道你的暗示,就很容易选择你在这段时间要完成的习惯。在这种情况下,它是编码。我发现设定一个时间框架很有用,在这个时间框架内你将完成你的习惯。否则,很难确定你什么时候会结束,或者你是否已经完成了一天的习惯。所以,我建议把套路框定为“我要编码 1 小时”,或者类似的话。这样,你就有了一个明确的例行公事的终点,然后它会发出奖励的信号。

奖励。

最后,你需要确定完成习惯后得到的奖励。取决于你是如何被驱动的,或者是什么激励着你,这可以是任何事情,从食物,到你手机上的时间,到外面的散步。你可能需要尝试不同的奖励,直到你找到一个适合你的。

成功的秘诀:

查尔斯·杜希格指出,你必须预见到那些可能让你无法完成日常工作的诱惑。通过事先确定原因(压力、分心等。),你可以创建应急计划,这将有助于你保持正轨。

压力会让你放弃这个习惯,转而去做更多的工作或者回复更多的邮件吗?安装一个网站拦截器,把你的手机放在触手可及的地方。分心会阻止你进入心流状态吗?为你的习惯选择一个你知道不会让你分心的时间。

建立一些可衡量的目标。

尽管 SMART goals(智能目标)的首字母缩略词让我畏缩,但它还是有一定的真实性。

建立可测量的目标将是保证你的编码习惯连续性的最好方法之一。通过使用聪明的首字母缩写词,你可以确保你的目标是可以实现的,从而激励你继续你的习惯。

SMART 是一个首字母缩略词,用于创建SMM可测量ATTR相关的和 T 基于时间的目标。通过确保你的目标勾选了所有的方框,你就有更大的可能性坚持到底。换句话说,如果你建立了正确的目标,你就会建立一个可维持的习惯。

一个不明智的目标的例子:我要精通 Python。

SMART 目标的一个例子:为了实现我在年底前精通 Python 的目标,我将通过完成包含 6 个教程的学习课程和一个顶点项目来学习 Python 语言,从本周开始每天编码 1 小时。

为什么这个目标是明智的:

  • 具体:这个目标是专门为精通 Python 编程语言而写的。我还详细说明了我打算如何精通 Python(完成特定的学习课程)。
  • 可衡量:目标是可衡量的,通过声明在年底之前将达到精通 Python 的目标,从而设置一个具体的时间来衡量进展。在年底,我在变得熟练方面的进步是可以衡量的。
  • 这个目标是可以实现的,因为这是我能在一年内实现的事情。我通过以前学习其他编程语言的经验确定了这一点。
  • 相关:这个目标是相关的,因为我的首要目标(也可以说是所有目标的终结)是成为一名数据科学家。学习 Python 是这个过程的一部分,也是数据科学家需要的技能。因此,这个目标与我更大的目标相关。
  • 基于时间的:这个目标设定了一个具体的时间框架,在这个框架内我想精通 Python。目标是在年底之前精通这门语言,这个过程从我设定目标的那周开始。

可衡量的目标是你养成可维护习惯的垫脚石。它们不仅给你一个建立你的编码习惯的路线图,而且还会产生明确的结果。

做一个你热爱的项目。

困在编码教程炼狱?

正如本文中的所描述的,当你花了大部分时间完成教程,却发现当你开始你的第一个没有训练的项目时,你自己只能写几行代码时,编码教程炼狱就发生了。

这通常会导致放弃,然后在几年后编码错误再次出现时不得不重新开始学习过程。这是一个恶性循环,保证你不会很快成为一个更好的程序员。

解药?

开始建立一个你热爱的项目。

如果一开始你只能编写一些变量和一些条件循环,那么这就是你开始的地方。从那里,完成教程,然后立即将您所学到的应用到您的项目中。你的项目会一点一点地组合起来,在你意识到之前,你的编码习惯已经养成了。

通过利用人类寻求了解事物如何工作的天生好奇心,您对构建项目的兴趣将确保您日复一日地继续执笔(或者更确切地说,是编写 IDE 代码)。

在前一天计划好你要编码的内容。

这个建议在生产力和自我提升大师中流传甚广,如果对他们有效,对我们也有效。

通过在前一天计划好你要编码什么,你就不必为决定你要编码什么而分心了。当你习惯于每天留出一个小时来编码时,这一步会花费宝贵的时间。与其花整整一个小时来计划你的任务,不如提前一天计划。这样,当你坐在办公桌前时,你就知道你需要做什么了。

这种类型的计划可以以完成特定教程、编写特定任务、自动化流程或实践新概念的形式出现。

关键是选择一个可以在你为自己的编码习惯留出的时间内完成的任务。我认识许多程序员,他们可以证明这样一个事实:要完成一个只完成了一部分的编程任务是非常困难的。除非你把你的过程写下来,这样你就能确切地看到你停止的地方,以及你需要编码的下一步,以便重新开始,否则你很可能无法理解把你带到那个地方的思路。

让编码成为一件社交的事情。

程序员独自在他们母亲的地下室工作的刻板印象不应该阻止你养成编码习惯。

虽然编码无疑是一项孤独的活动,但这并不意味着你应该以一种孤独的方式进行。人类是天生的社会性动物(尽管许多刻板的程序员可能会告诉你),所以如果你正在努力养成一个编码习惯,利用这一点是很重要的。

打破陈规。和朋友一起编码。结对程序。参加团队黑客马拉松和 Kaggle 比赛。不要单干。

确保你学习的是你真正感兴趣的编码领域。

这似乎是不言自明的,但是人们在一头扎进学习他们遇到的第一件事之前,通常不会对不同的编程语言或学科做足够的研究。这可能导致你实际上并不喜欢你所学的东西。

不喜欢你正在学习的东西是一种肯定会在习惯形成之前就放弃的方式。因此,选择一门语言或一门学科是至关重要的,你可以预见自己会从事一段时间。这并不意味着你最初选择的语言就是你需要坚持的语言。相反,把这看作是组织你学习过程的一种方式,以帮助你更好地实现你的目标。

如果您对数据科学和分析感兴趣:

  • 计算机编程语言
  • 稀有
  • 结构化查询语言
  • 朱莉娅
  • 矩阵实验室

如果你对网页开发感兴趣:

  • Java Script 语言
  • 计算机编程语言
  • HTML 和 CSS
  • 服务器端编程语言(Professional Hypertext Preprocessor 的缩写)
  • 以打字打的文件

如果你对软件开发感兴趣:

  • Java 语言(一种计算机语言,尤用于创建网站)
  • C#
  • C++
  • Java Script 语言
  • 计算机编程语言

如果您对应用程序开发感兴趣:

  • 科特林(安卓)
  • Swift (iOS)
  • Java Script 语言
  • Java(安卓)
  • HTML 和 CSS

最后的想法

就像去健身房、阅读多本书或学习一门新语言一样,如果要保持的话,编码必须成为一种习惯。幸运的是,有许多策略可以用来培养一种具体的编码习惯,这种习惯从长远来看是可维护的。

通过养成一个习惯,你可以确保你会在今后很长一段时间里看到它的结果。最重要的是,当事情变得艰难时,这些结果会让你坚持下去。

让你惊叹的 7 个数据科学 Python 库

原文:https://towardsdatascience.com/7-python-libraries-for-data-science-that-will-wow-you-672475af3847?source=collection_archive---------18-----------------------

这些是数据科学中未开发的瑰宝

照片由 爆头 发自 像素

在 21 世纪,数据科学吸引了很多关注,并被认为是最令人兴奋的工作领域之一。

随着数据科学及其应用的巨大发展,也开发了许多库、框架和工具包,它们与传统的数据科学库(如 Numpy、Pandas Matplotlib、Scikit-learn)一起,可以使程序员的生活更加轻松。

在今天的文章中,我们将看看 7 个这样的库,它们并没有被广泛使用,但是绝对可以帮助你改进你的工作流程。

1。 熊猫 _ml

Pandas_ml 是一个 Python 库,由 Pandas、scikit-learn 和 XGBoost 集成而成。这意味着我们可以使用一个库在同一个地方进行数据预处理(Pandas)、实现机器学习算法(scikit-learn)和进行梯度增强(XGBoost)。

我们也可以将这个库用于数据可视化的目的。

安装

pip install pandas_ml

你可以在这里 了解更多关于这个库

2。 不平衡-学习

当进行分类时,不平衡的数据集(即数据集中的类没有被平等地表示)可能是一个问题。

这个 Python 库有助于解决这个问题,它对类进行重采样,使数据集达到某种平衡,这样我们就可以得到更准确的结果。使用不平衡学习所需的依赖项有 SciPy、NumPy、Scikit-learn 和 joblib。

安装

pip install -U imbalanced-learn

你可以在这里 了解更多这个库

3。 Pyflux

Pyflux 是一个 Python 库,用于处理与时间序列分析相关的问题。这个库提供了大量可信的时间序列模型,如 ARIMA、GARCH 和 VAR,这使得处理时间序列问题更加容易。

安装

pip install pyflux

你可以在这里 了解更多本库

4。stats models

这个 Python 库的主要焦点是不同的纯统计模型的实现。它建立在像 NumPy 和 Scipy 这样的库之上,使用 Pandas 进行数据处理。

使用这个库,您可以比 Numpy 或 Scipy 更快、更有效地实现高级统计模型。它使用 pasty,这给了它一个类似 R 的界面。

安装

pip install statsmodels

你可以在这里 了解更多关于这个库

5。 Ipyvolume

Ipyvolume 是一个 Python 库,用于以最小的工作量在 Jupyter 笔记本中实现数据的 3D 可视化。虽然它目前还在开发中,还不太稳定,但将来它会成为一个优秀的可视化库。

安装

pip install ipyvolume

你可以在这里 了解更多这个库

6。 惊喜

该库大致是构建在 scikit-learn 上的一个简单 Python 推荐系统引擎的缩写。顾名思义,它是为用 python 构建简单的推荐系统而设计的。

这个库有一大堆现成可用的预测算法,还带有内置数据集,这对设计推荐系统非常有帮助。

此外,它还附带了分析和比较性能以及调整超参数的工具。

安装

pip install scikit-surprise

你可以在这里 了解更多关于这个库

7。 Dabl

Dabl 是数据分析基线库的简称。该库可用于自动化重复性任务,如数据预处理、数据清理和特征工程等。

在这里,我们可以找到一些预先构建的机器学习模型,如分类所有回归,这使得初学者更容易执行它们,而无需对代码做太多工作。

虽然这个库仍处于开发阶段,开发人员不建议在生产级代码中使用,但这一次绝对值得一试。

安装

pip install dabl

你可以在这里 了解更多本库

结论

本文到此为止。我们已经讨论了用于数据科学的 7 个惊人的 python 库。

这里提到的大多数库都处于开发的早期阶段,并不总是 100%有效。但是根据您的工作领域,了解一些这些库可以使您的工作流程更容易。

大多数这些库都是开源的,所以它们可以免费使用,如果你在学习它们的时候遇到困难,你可以从社区获得很好的支持。

在你走之前……

如果你喜欢这篇文章,并且想继续关注更多关于 Python &数据科学精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为一名中级会员。

请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: Pranjal 的简讯

组建数据团队时要问的 7 个问题

原文:https://towardsdatascience.com/7-questions-to-ask-when-building-your-data-team-at-a-hypergrowth-company-dce0c0f343b4?source=collection_archive---------15-----------------------

当涉及到确保你的团队快乐和高效的时候,回答这些问题将会带来很大的不同

图片承蒙 李勒姆

在 2021 年,这是进入数据世界的最佳时机。

首先,数据分析师和工程师的就业市场比以往任何时候都更热。事实上,根据美国劳工统计局的数据,从 2020 年到 2030 年,数据分析工作将增加 25%,我不需要告诉你,数据工程师和数据工程师相关的职位供不应求(但如果你不相信我们的话,请查看 Dice 的 Q1 技术工作报告第 19 页)。

随着新公司和解决方案的出现,解决我们领域面临的一些最大问题,并为数据工程师、分析师和分析工程师提供更多与业务影响相关的创新和有趣的工作,“现代数据堆栈”正在火上浇油。

尽管如此,建立和领导一个数据团队常常感觉像是一种平衡永无止境的临时请求流和消防演习的练习,您肯定会从您的最终用户那里收到这些请求和演习,以及战略增长的机会。当你的公司正以每分钟一百万英里的速度前进,却看不到停止的迹象时,经理该怎么办?

当涉及到招聘合适的角色、确定团队章程以及确保您的组织随着业务需求而扩展时,从问自己几个重要的问题开始会有所帮助。

最近,我们采访了三位当今最具影响力的数据领导者, 温迪·特纳-威廉姆斯,Tableau埃里克·伯恩哈德松【Better.com】的前首席技术官,Zosia Kossowski,的商业智能集团产品经理 展开广泛的对话,列出这些关键主题,并为刚刚开始构建高效、高效、最重要的是快乐的数据团队的经理提供最佳实践。

你应该如何组织你的数据团队?

当谈到组建成功的团队时,也许没有比 集中还是分散 更大的问题了吧?

在加入 HubSpot 领导商业智能之前,Zosia 在在线家居用品零售商 Wayfair 管理了 5 年的分析团队。在这两家公司,她看到了自己的组织结构,每一个都有自己的优点和缺点。她最大的建议是什么?不管你选择哪种模式,在早期优先考虑意向性。

“有时候,团队会雇佣分析师,团队会以没有意图的方式成长。Kossowski 说:“领导者需要尽早决定我们是希望它完全集中还是分散。“因为你与每个团队和部门的互动方式完全不同,所以你需要围绕它进行一些标准化。”

Kossowski 受到了 2017 年《哈佛商业评论》的一篇文章的启发,该文章讨论了在数据战略中平衡“防守和进攻”策略的必要性,并影响了她对建立团队的思考。现在,她在决定如何构建她的数据组织时考虑了以下问题。

  1. 你从事什么行业?
  2. 与团队快速行动并为市场带来洞察力的能力相比,数据安全性、隐私和治理有多重要?

Zosia 认为,虽然安全性和隐私对每个行业都很重要,但也有其他行业(如医疗保健或金融服务)的治理是重中之重。

Kossowski 说,“在 HubSpot,一家开发集客营销产品的 B2B 技术公司,有些地方我们希望确保安全性非常重要。”。“与此同时,如果我们弄错了某人点击按钮的次数,这可能不会像某人弄错了患者的医疗保健信息那样有太大的意义。”

然而,Kossowski 承认,对于哪种数据团队结构是最好的,并没有硬性规定,因为每个组织的每个场景都是非常不同的。

Erik 之前在两个极端(集中和分散)下都运行过,他指出这两种结构都有相当大的缺点,需要注意这一点。他说,拥有一个集中式数据团队的最大挑战之一是管理外部利益相关者的期望。

“例如,集中式团队的缺点是,外部利益相关者会觉得你经常会产生一点守门人的心态。他们还会造成长时间的滞后,让外部利益相关者感觉他们不了解资源管理,”Erik 解释道。

与此同时,Erik 认为一个完全分散的团队的缺点主要在人才方面。简而言之,当一个人向一个不了解他们工作的人汇报时,雇佣和留住他们会更有挑战性。

那么埃里克更喜欢哪种结构呢?这些年来,他逐渐意识到混合动力模式是“所有不同选择中最不糟糕的”,也是他最终决定更好地实现的。

与 Erik 相似,Wendy 喜欢混合模型,因为它融合了集中式和分散式方法。

“在我所在的行业,整个组织中有许多数据用户,他们有不同的业务优先级,以不同的速度运行,”特纳-威廉姆斯说。

Wendy 认为,使用混合模型,团队可以集中数据平台和服务,但让分析和数据用户分散在整个组织中。

你如何衡量你的数据团队对公司其他部门的影响?

Zosia 说,衡量您的数据团队的影响对任何组织来说都很难。在 HubSpot,Zosia 的团队使用向其业务利益相关者交付的内部 NPS 调查。

“我们开始衡量我们数据团队的表现,或者就我而言,BI 团队的表现,是通过一项系统调查,该调查每季度向 HubSpot 的内部团队发布一次,最近,我们增加了一个关于数据的部分,”她说。“我们对 BI 为平台维护的所有系统进行评级。”

除了这些评级,领导层还必须询问与数据和数据产品的可访问性和易用性相关的问题:

  • 你有工作所需的数据吗?
  • 您是否接受过处理这些数据所需的培训?
  • 你有你需要的工具吗?

实质上,Zosia 的团队在整个调查中提出的所有这些问题都有助于衡量她的团队对其组织的影响。

Erik 同意 Zosia 关于衡量你的团队的影响有多困难的观点,但是 NPS 分数可以有所帮助——如果带宽允许的话。利用 NPS 分数有助于在您的产品(数据)中创造更多所有权,因为利益相关者有机会提供直接反馈。

“在大多数公司,数据最终成为一种服务功能,所以你应该衡量 NPS 之类的东西,看看其他人是否对这些服务满意,”埃里克说。

与 Erik 和 Zosia 用 NPS 分数衡量影响的方式类似,Wendy 也倾向于利用外部评估来跟踪团队工作的有效性。

“例如,在以前的一家公司,我们每年在全公司范围内进行外部评估,评估我们在整个组织内所处的行业水平,”Wendy 说。“我们是以一种非常分散的方式做到这一点的,这意味着我们实际上与特定的领域和特定的团队坐下来,并对他们的端到端流程进行评估。然后,我们会向他们提供迁移或差距方面的反馈。”

谁“管理”你的团队?

随着数据变得越来越https://www.montecarlodata.com/how-to-build-your-data-platform-like-a-product/(意为分布式、可靠且可用)到公司的其他部门,数据主管需要了解谁将管理您团队的 KPI 和更广泛的运营。在团队建设过程的早期问这个问题对于雇佣和培养合适的人才至关重要。虽然一些公司选择从分析或商业智能团队中培养项目或产品经理,但其他公司可能认为根据业务需求,聘请 数据产品经理 作为他们的第一个角色是合适的。

Wendy 强烈建议尽早雇佣一名数据产品经理,尤其是当您公司的数据需求分布在多个团队时。

“从我的角度来看,数据产品经理实际上是我最想聘用的角色之一。我喜欢他们实际创造愿景,然后推动工程师实现这一愿景,”她说。“对我来说,这是一个重要的组成部分,因为我倾向于关注能够创造故事、与我们的内部客户甚至我们的产品团队互动的数据产品经理。”

根据 Zosia 的说法,当你根据需要完成的技术工作达到下一步不明确的地步时,最好雇用一名数据产品经理。

“你需要权衡不同的优先决策,不同的客户需求,并在这一点上,你不能再只做客户要求的事情,”Zosia 补充道。“如果您在拥有该功能之前等待了太久,那么您最终会陷入为多个问题创建单点解决方案的境地,而不是考虑贯穿所有这些问题的潜在需求。”

另一方面,Erik 通常采用更传统的方法。(也就是说,他在回答之前指出,鉴于他之前公司的混合组织结构,他从未真正与数据产品经理共事过)。

“我会尽可能地依靠工程师来处理他们的职责,依靠分析师来推动商业价值,”他建议道。“也就是说,我非常喜欢传统的产品经理开发不同的功能。你应该雇佣很多这样的人,让他们和数据团队一起工作。数据产品经理,我觉得,如果他们的工作范围被其他职位所涵盖,我会暂缓招聘。”

如何让你的团队(和公司)在招聘过程中脱颖而出?

鉴于数据人员的招聘竞争如此激烈,Zosia、Erik 和 Wendy 都同意,找到切实可行的方法来区分您的团队与市场上其他团队的机会是至关重要的。

威廉姆斯说:“这个行业现在尤其炙手可热,数据确实是招聘的重点领域。”在雇佣数据科学家和分析师的这些年里,她发现,在决定想去哪里工作时,申请人往往会关注两个领域。

  1. 谁是他们的管理团队成员?候选人关心他们经理的个性、他们对该职位的透明度,以及最重要的公司文化。
  2. 我将从哪些方面发展我的技能、人脉和职业?候选人想知道,如果他们能大规模地生产某种产品,会有什么样的产品机会,以及是否有领导机会,无论是作为技术主管还是人事经理。

Wendy 使用所有这些观点来创建一个故事并进行公开对话,从而向候选人表明他们将能够在她的团队和公司中快速成长。

根据 Zosia 的说法,许多最佳候选人的动机是要解决短期的切实问题以及解决这些问题所需的内部支持。

“如果你加入一家公司,有很多问题,但没有解决它们的途径,你会感到沮丧,就像你加入一家公司,一切都很好,”Zosia 补充道。“你需要能够取得平衡。”

当 Erik 第一次进入一个开始雇佣数据工人的职位时,他低估了雇佣合适的人所需要的时间。

“招聘最重要的是投入时间,这需要很多时间,”他说。“在 Better,我花了超过 50–70%的时间来招聘,老实说,这是作为数据领导者最重要的事情。为了让我们的公司从竞争对手中脱颖而出,寻找合适的人是工作职责的全部内容。”

他的建议?确保对该角色在跨职能层面将拥有什么有明确的期望。

“特别是对于数据团队,我看到的一个具有挑战性的问题是对数据科学和数据分析实际涉及的内容的期望不匹配,”他说。“几年前,我会收到大量申请数据科学职位的人,他们认为自己将直接从事机器学习算法的工作,但情况并非总是如此。”

您的利益相关者对数据的可访问性如何?

数据可访问性和安全性是任何数据领导者的首要考虑,尤其是对于拥有分布式分析团队或使用敏感第三方信息的组织。因此,在确定如何管理对团队的期望时,数据治理和法规遵从性应该是首要考虑的问题。

Zosia 首先承认,建立一种优先治理的文化不是一件容易的事情,特别是在大规模的情况下。

“从文化的角度来看,当一个社区,特别是一家公司快速增长并习惯于拥有一定程度的自主权时,这是很困难的,不仅仅是在数据方面,”Kossowski 补充道。“随着你的公司越来越大,你真的必须实施更多的流程和法规,以确保你把每个人都带在身边,并让他们了解缺乏治理和协调可能带来的痛苦。”

埃里克承认自己从未在上市公司工作过,他建议快速增长的初创公司的每个人都应该有权访问所有数据,以促进发现和创新。

“我从未在上市公司工作过,所以我会根据当时的背景来理解。我认为,当你从零开始建立一家公司时,你可以通过向每个人开放访问权限走得很远,”他说。“我认为这很好,因为人们会在数据中发现很多有趣的东西,这是件好事。不过,在某些时候,你的团队会意识到需要一个过程和治理,这很好。”

Zosia 承认,对于大多数组织来说,数据治理也是一种文化转变。

“如果你是一家数据驱动的公司,当产品发布时,作为验收标准的一部分,你优先考虑的是数据的干净和可用,那么这比数据是副产品或事后想法要容易得多,当你不得不来到工程团队时,你会觉得这是错误的,”她补充道。“我的建议是让工程领导和任何参与数据生产的人尽早参与到数据治理对话中,这样他们也能理解由此带来的痛苦。”

同样,Wendy 坚信数据治理的责任应该由数据所有者自己承担。

“我们制定了正确的政策,我们有业务所有者和数据管理员,他们负责并拥有基于主题类型的数据,”Williams 说。最终,他们要对这些数据、对这些数据的控制以及对这些数据的访问负责,”

在 Salesforce 和 Tableau,Wendy 花了四年时间试图找出正确的公式,在团队扩展和维护自主和所有权文化之间建立完美的平衡,她承认这非常具有挑战性,尤其是在一个以隐私为导向的世界里。最终,她决定将数据的发现民主化,同时将发现与访问分离开来。

“有些数据人们想知道,但这并不意味着他们需要使用它,”威廉姆斯补充道。“您可以从发现的角度和发现的角度进行民主化,然后您可以引入正确类型的访问控制和治理流程,以确保适当规模的治理,并且他们确实有实际使用这些数据的业务需求。”

对于您的数据团队来说,“自助服务”是什么样的?

根据 Zosia 的说法,她的组织的自助服务与大多数组织不同,因为大多数内部客户已经非常精通技术,并且大多数客户都有分析工程师与之合作。“当我想到我们的自助服务时,这就是分析工程师的自助服务,”Kossowski 补充道。“他们可以访问他们需要的数据,也可以将他们需要的数据接收到仓库中,但我们也有合适的护栏来确保我们不会在不同的地方获得相同的信息。”

Erik 认为,在更广泛的数据社区中存在一种普遍的误解,即自助服务是解决数据需求的一种方式。根据 Erik 的说法,自助服务实际上更像是一种文化转变,不是单靠技术就能解决的。

Bernhardsson 补充说:“我从来不希望在一个数据团队中,其他人感觉他们在垄断数据,而一些简单的自助服务形式在这方面做得非常好。”“另一件事是,自助服务永远不应该成为其主导的数据消费形式,因为如果发生这种情况,数据团队实际上没有很好地与其他团队合作。”

在 Wendy 看来,自助服务就是能够对数据从获取到管理做任何你想做的事情。在她看来,自助服务还包括提供合适的基础设施、服务和平台,让人们能够根据自己的特定角色决定需要做什么,同时还拥有这样做的工具。

“对我来说,这实际上是给他们所有的工具,让他们真正获得数据本身的好处和价值,”她说。

您对贵公司未来的数据有何展望?

最后,对于经理来说,传达一个清晰的愿景是很重要的,这个愿景是关于你的公司在未来六个月到一年(或更长时间)内的数据是什么样子的!),以及组织将如何随着时间的推移而增长。能够回答这个问题并传达您的策略将有助于团队在成长的所有阶段保持动力和一致性,即使计划发生变化。

那么,关于数据的未来,最让我们小组兴奋的是什么?

对于 Zosia 来说,自助式、分析师友好的数据平台排在首位。

“将权力交给使用数据的人,而不必依赖一个在数据可用之前必须进行大量清理和转换的团队,这让我感到兴奋,”科索斯基说。“有一些机会将数据科学引入到数据可发现性的清理和转换层中,并且有很多机会使其更加用户友好。”

同样,Erik 迫不及待地想看到未来五到十年的创新会为数据工程栈构建更好的工具。

“在接下来的五到十年里,你将会看到数据堆栈的成熟和公司间更多的整合,”他补充道。“我对基础设施的新水平和更好的工具感到非常兴奋,它们可以使数据团队的工作速度提高 10 倍。”

Wendy 最感兴趣的是自助服务及其对组织的重要性。

她说:“简化数据,并在需要时将数据送到需要者手中,这非常重要。”。“此外,素养同样重要,它涉及多个方面,例如如何教育公司内部的员工使用数据,以及如何理解数据在团队中的使用,从而让您了解如何利用数据并从中获取价值。”

带着这七个问题和令人兴奋的未来几年,您对贵公司数据和分析的未来有何展望?

我们洗耳恭听。

如果你想了解更多,联系 巴尔摩西 或者访问 montecarlodata.com。

本文由 莫莉·沃里克 布兰登·古比托萨 共同撰写。

7 个真实世界数据集,了解机器学习所需的一切

原文:https://towardsdatascience.com/7-real-world-datasets-to-learn-everything-needed-about-machine-learning-d77e0935b4ad?source=collection_archive---------18-----------------------

参考示例用例实现

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

我积极参与指导和训练数据科学领域的人员。我还指导学生为数据科学领域的职业生涯做准备。根据我与他们的互动,我发现他们中的许多人在选择项目时忽略了数据集。仍然有许多人在他们的数据科学组合项目中使用虚拟数据集。作品集项目的目标是更好地学习和帮助数据科学工作。在你的作品集项目中使用虚拟数据对学习和找工作都没有帮助。

在项目中使用真实世界的数据集有以下好处:

  • 真实数据有其自身的挑战,因此这是了解典型数据问题和处理这些问题的好机会
  • 更容易理解和关联数据集
  • 属性特征中的动态可以驱动进一步的学习
  • 有助于区分你的工作,从而也有助于你的个人资料

在本文中,我将向您展示如何使用一些有趣的真实世界数据集来详细了解机器学习算法的关键类,如

  • 回归算法
  • 分类算法
  • 推荐系统
  • 情感分析
  • 图像识别

为了参考和学习的目的,我还分享了一些有趣用例的受欢迎的实现。如果你喜欢视频格式,点击这里—【https://www.youtube.com/watch?v=8agqUFZOsO0

房价数据集

波士顿房价数据集墨尔本房价数据集是两个流行的房价数据集。波士顿房价数据集相对较小,大约有 500 条记录。该数据集为资产的位置提供了更多的权重。关于资产位置的属性包括离高速公路的距离、师生比、犯罪率、污染等。这影响了房地产价格。

墨尔本房价数据集要大得多,并且该数据集的属性侧重于房产而非地点。该数据集的一些属性包括车棚数量、建筑面积、土地面积、建造年份等。这两个数据集为同一问题提供了不同的视角。了解这两个数据集中影响房地产价格的关键属性将是有益的。

用例

  • 预测房价-在分析和预处理后,将数据集分为训练和测试,然后实现一个模型来预测房价。如果你正在寻找一个参考,这里有一个 kaggle 笔记本,它评估了不同回归算法对房价预测的性能。

https://www.kaggle.com/shreayan98c/boston-house-price-prediction

  • 对影响房地产价格的重要因素的分析。这里有一个 Kaggle 笔记本供参考,以了解如何使用墨尔本住房数据执行探索性数据分析。

https://www.kaggle.com/janiobachmann/melbourne-comprehensive-housing-market-analysis

算法和工具

  • 线性回归和 SVM 等回归算法
  • 对于数据分析,像 Pandas 和 NumPy 这样的库是有用的,而像 Seaborn 和 Matplotlib 这样的库对于实现良好的可视化是有用的

商场客户数据集

商场顾客数据集是关于逛商场的人。它包括性别、年龄、收入和支出分数等属性。这个数据集实际上不是真实的,但我发现这个数据集反映了真实世界数据集的动态和特征。我还发现这是一个很好的数据集,可以用来了解客户细分。

该数据集中的属性“支出分数”是反映个人购买力的派生属性,最有可能基于客户的购买历史、访问频率和关于客户的其他类似交易数据而派生。

用例

  • 识别不同的客户群—您可以学习使用此数据集构建聚类或客户群。下面是一个很好的客户细分参考

https://www.kaggle.com/kushal1996/customer-segmentation-k-means-analysis

  • 研究性别和年龄在消费中的作用——以下是使用 SweetViz 进行探索性分析的快速参考

https://www.kaggle.com/nareshbhat/eda-within-snap-of-fingers

算法和工具

  • 聚类算法,如 K-Means 算法和 DBSCAN 聚类
  • 分类算法,如随机森林、KNN 和朴素贝叶斯

信用卡欺诈数据集

信用卡欺诈数据集包含欧洲客户的信用卡交易。该数据集的一个特点是高度不平衡,在 50 万笔交易中,只有 492 笔是欺诈交易,其余的是真实交易。这种数据集的问题是,当您预测所有交易都是真实交易时,模型的准确性超过 99%,这是一种误导,因为重点应该是预测数据集中异常的能力。

此外,由于这些是金融交易,准确识别欺诈交易非常重要,但不建议将真实交易标记为欺诈,因为这可能会引起客户不满。这是一个很好的数据集,有助于更好地理解不平衡数据集的问题,并了解在这种情况下可以使用的方法、技术和算法。

用例

  • 预测欺诈性交易(即异常检测)—下面的参考资料是一个很好的例子,解释了一些处理高度不平衡数据集的最佳技术

https://www.kaggle.com/janiobachmann/credit-fraud-dealing-with-imbalanced-datasets

算法

  • 类似隔离森林的无监督学习算法
  • 像 GBM 和 XG 这样的监督学习算法自夸

假新闻检测数据集

这个数据集包含标题、作者、文章内容等属性,以及捕捉文章是否可靠的标志。在这个数据集中有很多 NLP 技术的应用空间。这个问题可以用两种方法来解决,一种是对文本数据使用词干和停用词去除,然后使用神经网络,另一种是基于文本数据生成特征,然后这些特征可以用于解决作为分类问题的问题。

随着社交媒体上分享的新闻越来越多,假新闻可以快速传播误导信息。大多数时候,它们是无害的,但有时假新闻会导致严重的问题,因此预测并阻止它们传播是很重要的,直到今天,这仍然是一个挑战。

用例

  • 预测新闻是真是假——这个用例可以通过深度学习来有效实现。这里是一个简单的初学者友好的例子,了解如何使用 TensorFlow 和 Keras 来实现假新闻预测

https://www.kaggle.com/barkhaverma/fake-news-detection

  • 对于那些对阅读和实施研究论文中讨论的方法论感兴趣的人,请查看研究论文这里它解释了假新闻预测的实施

算法

  • LSTM
  • XG 自夸、逻辑回归和/或其他分类算法

Yelp 数据集

Yelp 数据集由超过 190 万用户提供的 130 万条提示组成。它还包括超过 140 万个业务属性,如时间、停车、可用性、氛围、评论等。该数据集以 JSON 格式提供,包括 4 个主要文件,它们是

  • 业务 :该文件包含有关业务的详细信息,如地址、位置、评级、时间等。
  • 评论 :包含评论文本,包括撰写评论的用户以及评论所涉及的业务。它还包括细节,如这些评论如何被更广泛的受众所接受
  • 用户 :包含用户的详细信息,用户提供的评分和评论,用户的好友映射,以及其他与用户相关联的元数据
  • 提示 :这些比评论要短,向企业传达建议

这是大量的文本数据,各种 NLP 技术的应用有很大的空间,并且由于它有大量的用户基础,它也是研究用户行为的很好的数据集。

使用案例

  • 预测企业的成功和失败——评论、提示以及位置和其他企业属性可用于预测企业的成功和失败。这是一个帮助找到受欢迎的餐馆的笔记本示例

https://www.kaggle.com/niyamatalmass/finding-the-perfect-restaurants-on-yelp

  • 基于评论和提示的情感分析——这是一个参考笔记本,使用分类树实现了情感分类器

https://www.kaggle.com/suzanaiacob/sentiment-analysis-of-the-yelp-reviews-data

  • 分析用户行为,如具有特定特征或来自特定位置的用户的兴趣等——该笔记本是对评论数据进行探索性分析的一个很好的例子

https://www.kaggle.com/jagangupta/what-s-in-a-review-yelp-ratings-eda

  • 网络分析以了解影响因素-可以使用基于用户数据的网络分析来识别关键影响因素

算法

  • 决策树或随机森林
  • 分类算法,如 KNN、SVM 和/或朴素贝叶斯

亚马逊评论数据集

这个亚马逊数据集包含大约 2.33 亿条关于他们产品的顾客评论,这些评论被分成 30 个类别。该数据集非常灵活,可以根据产品类别下载,并且它还提供了一个选项来下载数据的子集,用于小规模实施或实验目的。

这是实现推荐系统的一个很好的数据集。有几篇研究论文是关于提高推荐系统准确性的实现和技术的。

用例

  • 为用户构建产品推荐——这是一个 Git 存储库,它使用 Amazon review 数据集实现了产品推荐

https://github.com/mandeep147/Amazon-Product-Recommender-System

  • 基于客户评论的情感分析——可以基于评论数据构建情感分析模型。此外,由于这是一个大规模数据集,在此数据集上训练的模型可以在不同的数据集上进行测试

算法

  • 推荐系统中的协同过滤算法

ImageNet 数据集

ImageNet 是一个庞大的图像数据库,包含 1400 万张图像和 2 万个视觉类别。该数据集广泛用于对象检测/识别用例。它通常用于学术界,通过深度学习来学习图像识别。这个数据集是图像识别领域革命的主要原因。

使用案例

  • 目标检测
  • 目标定位
  • 图像字幕

算法

  • 卷积神经网络
  • 基于区域的卷积神经网络
  • 单发探测器

关于我

我是一名拥有超过 10 年经验的数据科学专家,并且已经撰写了 2 本数据科学方面的书籍。我写数据科学相关的内容是为了让它简单易懂。在 跟我上来。我也有一个 YouTube 频道,在那里我教授和谈论各种数据科学概念。如果有兴趣,可以订阅我下面的频道。

https://www.youtube.com/c/DataSciencewithSharan

7 个在创业公司工作的理由,1 个不工作的理由

原文:https://towardsdatascience.com/7-reasons-to-work-at-a-startup-and-1-reason-not-to-808248215597?source=collection_archive---------29-----------------------

数据科学家:选择是否加入创业公司是一个重大决定。这里有一些建议可以帮助你弄清楚创业的生活是否适合你。

照片来自 artifactflashUnsplash

这篇文章(如标题所示)的灵感来自奇普·胡延的“不加入创业公司的 7 个理由和加入创业公司的 1 个理由”的文章。在阅读它的时候,我想起了我在过去一年左右的时间里与初创公司内外的各种 ML 从业者进行的几次对话,内容是为什么我认为人们应该加入初创公司。Chip 文章中的许多话题都出现在这些讨论中,尽管观点经常不同。我还意识到我没有花时间锁定自己对这个话题的想法。换句话说:我受到启发,把我对这个主题的想法整理得更有条理,更像样,这篇文章就是结果。因为我认为原帖子的结构很好,所以我在这里(粗略地)复制了它!让我们开始吧。

我为什么要加入创业公司?

是时候用一个小故事来解释我是如何在一家初创公司结束的了。在我的博士学位快结束的时候,我参加了一个关于自主系统的会议,一个来自某个水果公司的工程师组成的小型代表团也参加了会议。果然名不虚传,这个小组对他们正在进行的工作高度保密。鉴于这种背景,我大胆猜测他们是某个“秘密项目”的一部分,这个项目在过去几年里一直有传言。

一天晚上会议结束后,我开始和他们聊天,并在当地的各种酒吧度过了一个晚上。其中一名工程师是一名经验丰富的员工工程师,在那天晚上,我问这个人,如果他们要重新开始职业生涯,有什么建议。答案很简单。套用一句:

在一家由有趣的人组成的小公司工作几年,他们正试图做一些有雄心的事情。

原因很简单:在小公司里,你需要做更多的事情,而且部分地通过延伸,你会比在大公司里接触到更多的使一个企业“运转”的东西。换句话说,创业有点像商业速成班,正如那句老话所说:就经验而言,在创业公司呆几年可能比在其他地方呆上两倍甚至更多的时间更有价值。事后看来,虽然这种逻辑当时对我来说是有意义的,但我可以说,我并没有完全意识到它对我自己对商业技术世界和未来职业的看法的影响。我想我还是不知道。

也就是说,我应该清楚的是,这件事本身并不是我走上“创业之路”的决定性因素(例如,我已经相对确定长期呆在学术界不适合我,我在大公司的一些经历也让我偏离了这个方向),但在我完成博士学位并计划下一步行动时,这场讨论一直萦绕在我的脑海中。

随着我自己的优先事项(大致)得到解决,以及我脑海中的这次对话,2018 年春天,我加入了总部位于英国曼彻斯特的勇敢的人工智能初创公司 Peak (现为“规模化”)。现在差不多三年过去了,我仍然处于巅峰状态,还没有继续前进的计划,我也很高兴我能加入这样一家年轻的公司。

你为什么应该加入创业公司?

现在是真正的大问题:为什么我认为应该考虑加入一家创业公司?首先,我应该清楚,我不认为创业对每个人都是理想的。首先,如果稳定性是职位的首要考虑因素,那么加入一家初创公司不太可能是你的最佳决定——毕竟,你将进入一个本质上不确定的世界。

显然,每个人的动机和情况都不一样,所以我只能给出我的观点,作为一个刚起步的人,作为一个能够忍受加入一家年轻公司的风险的人。如果你处于类似的境地,那么我认为你应该考虑采取类似的措施,这里有一些更有说服力的理由:

  • 责任— 年轻和/或高增长企业的一个特点是,没有足够的人手来做所有需要做的事情。部分结果是,很有可能你会发现自己很快成为交付重要技术特性/能力的核心。从个人经验来说,这可能是一个令人伤脑筋的(尽管通常是有益的)情况。你可能会发现自己承担了在大公司可能需要几年才能承担的责任。虽然这一开始可能会令人担忧,但也可能是一次令人惊奇的经历。
  • 可见性— 从销售电话、客户支持到技术交付,你会发现自己处于所有事情的第一线。这可能会让你有很多机会与各种各样的人(各种级别的人)见面,无论是在你的企业内部还是外部。这对发展你的沟通技巧很有帮助,也能让你了解其他行业。在一个更大的企业中,在你和客户或其他业务部门之间可能会有几个团队。在一家初创公司,你会从一开始就接触到所有这些东西。
  • 技能— 多面手对创业公司至关重要。这意味着你应该预料到你会发现自己在做一些你可能觉得“不在你工作范围内”的任务。同样值得注意的是,在一个年轻的公司里,工作描述更多的是一种概念上的东西,所以不要太沉迷于其中。从好的方面来说,这意味着你将体验到你以前从未接触过的角色。这可能会拓宽你的职业视野,和/或帮助你比以前更全面地完善你的技能。
  • 视角— 接触多种业务职能,以及创业过程中的起起落落,是一个获得更全面观点的机会,让你了解商业世界中什么重要,什么不重要。对于技术人员来说,这有时可能是一个痛苦的过程。例如,我遇到过这样的情况,精心设计的工具和服务几乎看不到任何用途,而其他工具和服务几乎是作为事后想法放在一起的,却在整个业务中大量使用。这些经历是一个很好的方法,可以让你学会如何不把事情看得太个人化,并且把你的工作看成是更大图景的一部分。对这些事情形成一个更成熟的观点也是一个很好的方法,可以帮助你优先考虑那些从长远来看最有可能有用的工作。这让我想到…
  • 影响— 你会改变事情。年轻/高速成长的企业是一个不断发现的过程。没有人真正知道在任何给定的时间点做任何事情的最佳方式,而且业务可能会逐月发生重大变化。可怕的——也有些违背直觉的——是这一切都很正常,甚至是想要的。这可能同时令人困惑和着迷。结果是好的想法通常是受欢迎的,小的建议最终会改变整个公司的前景。知道你已经改变了一些事情——即使是很小的事情——会令人难以置信的有所收获。与大公司不同,有时将你的行动与具体结果对应起来也更容易,这可能是有益的(只是不要让它过于冲昏你的头脑!).
  • 代理— 对我来说,与“影响”相反,代理意味着培养一种你可以(也应该)改变企业的意识。这是一个重要的区别。被分配一个问题,给出一个解决方案并看到结果是一回事。学会识别和阐述你自己的问题是另一回事,弄清楚你需要谁和什么来解决它们,提出解决方案来感觉这是你应该做的事情,并且你有能力做。随之而来的拥有感和掌控感让人大开眼界。视角的转变可以让许多看似棘手的问题突然变得更容易解决。对我来说,这可能是我在巅峰时期开始发展的唯一最有价值的观点/技能。我也从其他创业公司的其他人那里听到过类似的故事。
  • 股权——对于大多数初创公司来说,你会得到某种形式的股权。这样做的好处是,在未来某个不确定的时刻,这部分股权有很小的可能让你变得非常富有。然而,这不是一个快速致富的计划:你通常需要等待几年才能实现你的股票的任何重大价值,而且很有可能你永远也不会实现任何有意义的价值。从这个角度来看,如果事情进展顺利,股权最好被视为奖金,而不是加入大多数创业公司的主要动力。顺便说一句,它还让你获得了公司内部股权计划在实践中如何运行的第一手经验,这本身是一种微妙但潜在有价值的见解,可能对你此后如何思考和处理个人财务产生重要影响——至少对我来说是这样。

你为什么不应该加入创业公司?

不言而喻,如果你想更全面地回答这个问题, Chip 的帖子是一个很好的起点。对我来说,主要原因很简单:

  • 创始人 —风投自然会花大量时间盘问创始人,在做出投资决策时,一些风投非常看重这些人的个性和品质。这是有充分理由的:创始人代表着公司的 DNA。一切都源于他们的观点,一家公司在创业期的黑暗水域中航行的能力与这些个人紧密相关。出于这些原因,当你考虑投资一家公司时,你应该采取类似的立场。感受一下你是否认为创始人有能力实现他们的抱负,以及他们是否出于正确的原因“参与其中”。如果可能的话,这应该是面对面的。一定要保持头脑清醒:创始首席执行官往往是有魅力的人,这意味着他们经常展现他们自己的现实扭曲领域。在做出任何最终决定之前,一定要仔细反思你们的事后谈话。
  • 有趣的人— 创业公司通常是人、技能和个性的混合体。这可能是一种美德,也可能是一种恶习。无论组成是什么,你都要和已经签约的人一起度过很多时间。重要的是要问问自己,你是否认为已经在公司的人提供了你可以学习的观点、经验或知识。请注意,这并不一定与你认为可以从事“外部工作”的人是一回事(尽管这可能是一个额外的奖励)。在注册之前也试着感受一下——同样,如果可能的话,亲自去。
  • 雄心勃勃的计划— 在我看来,渴望个人快速成长可能是加入创业公司的首要原因。虽然有宏伟计划的创业公司可能是加入风险最大的创业公司之一,但据我所知(以及从与他人的讨论中),它们也是最有可能实现个人成长最大化的创业公司。不过请记住:雄心勃勃并不意味着不可能、幼稚或彻头彻尾的骗局,所以请仔细考虑你是否认为初创公司的雄心属于“现实但具有挑战性”的类别,而不是更有问题的“蓝天思维”或“蛇油”阵营。

我很幸运,在我职业生涯的这个阶段,我可以忍受更高水平的不确定性,并在 Peak 找到了一家好的初创公司(和一群人)。虽然事情很艰难,但我可以自信地说,这个过程对我个人来说是值得的——尽管你认为这对你来说是否值得是一个只有你自己才能回答的问题。

什么是好的创业?

在结束之前,我还想掩盖另一件事:上面的讨论暗示我只考虑'好'创业公司。功能失调的创业公司肯定会浪费你的宝贵时间,应该尽可能避免。这可能是显而易见的。

但是,是什么让一家初创公司'变得优秀呢?加入前怎么分辨?根据我在 Peak 的经历(如果你没猜到的话,我认为这是一类“好”的创业公司),以及与在其他创业公司工作的人的讨论,我认为有几个关键标准。从未来员工的角度来看,这些标准包括:

  • 创始人 —风投自然会花大量时间盘问创始人,在做出投资决策时,一些风投非常看重这些人的个性和品质。这是有充分理由的:创始人代表着公司的 DNA。一切都源于他们的观点,一家公司在创业期的黑暗水域中航行的能力与这些个人紧密相关。出于这些原因,当你考虑投资一家公司时,你应该采取类似的立场。感受一下你是否认为创始人有能力实现他们的抱负,以及他们是否出于正确的原因“参与其中”。如果可能的话,这应该是面对面的。一定要保持头脑清醒:创始 CEO 往往是魅力非凡的人,这意味着他们经常掌控自己的现实扭曲领域。在做出任何最终决定之前,一定要仔细反思你们的事后谈话。
  • 有趣的人— 创业公司通常是人、技能和个性的混合体。这可能是一种美德,也可能是一种恶习。无论组成是什么,你都要和已经签约的人一起度过很多时间。重要的是要问问自己,你是否认为已经在公司的人提供了你可以学习的观点、经验或知识。请注意,这不一定是和你觉得可以从事“外部工作”的人(尽管这可能是一种奖励)一样的事情。在注册之前也试着感受一下——同样,如果可能的话,亲自去。
  • 雄心勃勃的计划— 在我看来,渴望个人快速成长可能是加入创业公司的首要原因。虽然有宏伟计划的创业公司可能是加入风险最大的创业公司之一,但据我所知(以及从与他人的讨论中),它们也是最有可能实现个人成长最大化的创业公司。不过请记住:雄心勃勃并不意味着不可能、幼稚或彻头彻尾的骗局,所以请仔细考虑你是否认为初创公司的雄心属于“现实但具有挑战性”的类别,而不是更有问题的“蓝天思维”或“蛇油”阵营。

最后,我想强调一个事实,好并不意味着完美无缺。初创公司有“锋利的边缘”:根据定义,它们不是“成品”。大多数人对他们的工作是全新的,有些人是第一次管理人。可能会有一些既定的流程,现有的可能是不完美的。然而,一些“错误”的存在可能是另一个个人成长的机会:如果你不认为这些错误可能对企业是致命的,它们实际上是建议(和执行)的好机会!)的改进,并进一步提高您对业务的影响。至少,这是一次很好的学习经历。

结束语

我觉得在过去的几年里我好像成长了很多。我也开始意识到我还有多少需要学习和成长。有些时候,我会质疑自己加入创业公司的理由。这是一场过山车,而巅峰的过山车还远未结束:我相信随着我们继续以极快的速度增长,还会有更多的高潮和低谷。但是,如果让我再选择一次,我会的。我还没有打算离开创业列车。

还有一件事…

创业世界是一个奇怪的地方。“对创业公司的狂热”是真实存在的,如果它达到了强迫症的程度,可能会非常不健康。如果你为自己选择了“创业”职业道路,确保你照顾好自己:清楚自己的优先事项,知道自己的极限。如果你的工作总是让人筋疲力尽,那几乎肯定不值得你花时间。记得休息一下。记住,生活中还有更重要的事情值得你关注。

原载于 2021 年 3 月 24 日https://mark . douthwaite . io

商业智能(BI)至关重要的 7 个原因

原文:https://towardsdatascience.com/7-reasons-why-business-intelligence-bi-is-crucial-55e9d32833eb?source=collection_archive---------6-----------------------

一个实用的窥视,为什么有一个商业智能设置可以积极影响任何业务

活动发起人Unsplash 上的照片

介绍

企业正以惊人的速度前进,他们的竞争也是如此。为了使这些企业在市场上占有优势,他们所做的每一个决定都必须是知情的。不管是哪个行业,每个企业都可以访问大量数据,并利用这些数据获取优势。但不幸的是,很少有人知道。商业智能(BI)通过将原本无用的数据堆呈现为可理解和可解释的形式,帮助这些企业利用其数据。BI 使您能够结合技术和业务专业知识的力量,做出完全明智的决策,并在竞争中保持领先地位。

BI 如何能有所作为?

商业智能实际上是一个总括术语,涵盖了从商业运作中收集、存储和分析数据的不同方法。大多数情况下,所有这些数据都放在那里,基本上没有使用。在 BI 的帮助下,企业可以从大量数据中找到有用的见解。

相比纯文本和数字,人类的大脑更善于理解图片和视觉效果。当我们看一个包含一些文本标签和数字的表格时,我们的大脑不会很快地解读这些信息。我们的大脑甚至需要花费一些努力来理解呈现给它的东西。但当同样的数据以图形的形式呈现时,我们的大脑不仅能快速理解,还能快速观察到数据中的任何模式。这就是数据可视化的力量,也是数据可视化在最近变得如此流行的主要原因。

数据可视化是商业智能不可或缺的一部分,它可以帮助您将数据可视化为地图或图形,并与它们进行交互。这使得人类的大脑更容易消化数据,从而以更好的方式发现模式和趋势。

以下是拥有一个优秀的商业智能系统对任何企业都至关重要的 7 大原因。

1.获得客户洞察力的能力

卡洛斯·穆扎Unsplash 上拍摄的照片

借助有效的商业智能,企业可以通过分析客户的购买模式和创建用户档案来更好地了解他们的客户。这有助于他们为客户创造更好的产品和产品体验。企业可以利用 BI 的力量来了解其客户的一个例子是客户细分。根据顾客购买的产品类型、购买时间和购买频率,可以将顾客分为不同的类别。这些细分市场用于通过定制产品优惠或定制提醒等为客户提供更好的整体体验。这为双方创造了双赢的局面,因为客户和企业都从中受益。

2.提高业务运营可见性

罗曼五世Unsplash 拍摄的照片

利用商业智能的组织将更好地控制他们的业务流程。他们对组织中发生的事情有更好的了解。对流程和标准程序保持高度警惕有助于迅速纠正任何错误。这也有助于企业做好准备,而不是被动反应。例如,对于一家努力应对延迟交付的物流公司来说,了解延迟发生的地点和原因可能非常有价值。这种对业务运营的洞察有助于企业在很大程度上改善服务。

3.获得可行的见解

照片由奥斯丁·迪斯特尔Unsplash 上拍摄

在做出任何商业决策时,最重要的是要有足够的数据来支持决策。使用传统报告,不像使用商业智能那样容易和方便地获得可操作的见解。可操作的见解是那些实际上使您能够采取任何行动的指标,而不仅仅是一个“听起来很好”的数字。可操作指标的一个例子是放弃购物车的客户百分比,而不是交易数量指标。这一指标让我们了解客户在哪里下车,并使企业能够采取必要的措施,努力降低购物车放弃率。

4.提高整个组织的效率

卢卡·布拉沃在 Unsplash 上的照片

拥有一个合适的商业智能系统可以大大提高整个组织的效率。这反过来会对组织的整体收入产生积极影响。通过使有意义的数据可以跨组织中的各个团队访问,减少了报告请求的等待时间,并提高了公司所有团队的生产率。数据应该是每个人都可以访问的,而不是仅限于少数特权团队。这有助于公司中的每个人保持消息灵通,并做出明智的决策。

5.实时数据可用性

卢卡斯·布拉塞克Unsplash 上拍摄

商业智能系统始终提供实时数据。这进而降低了在准备任何关键数据报告时任何可能的人为错误的风险。能够访问实时数据使企业能够随时了解公司的健康状况。这有助于组织在每次需要做出决策时做出数据支持的决策。不用再等待分析团队的报告了!

6.更好的营销努力

照片由Firmbee.comUnsplash 上拍摄

商业智能系统使组织的营销团队能够创建更好的营销活动,通过向他们提供访问关于当前和过去活动的数据的便利方式来提供更好的投资回报(ROI)。它还提供关键指标,如客户获取成本(CAC)、每线索成本(CPL)、营销活动的点击率(CTR)以及成功营销活动所需的许多其他重要指标。

7.为企业带来竞争优势

照片由克里斯·萨博尔Unsplash 上拍摄

除了使用商业智能的所有好处之外,使用 BI 的另一个巨大好处是竞争优势。商业智能使企业能够洞察其竞争对手正在做什么,并使他们能够为计划做出明智的决策。此外,一个时刻关注内部系统的公司会比一个不关注内部系统的公司领先。

最后的想法

如今,拥有一个出色的商业智能系统对每个企业来说都非常重要。对公司的内部流程和外部健康保持积极的警惕对于当今快节奏的业务至关重要。利用数据改善公司应该是企业核心价值不可或缺的一部分。数据被认为是 21 世纪的石油,BI 就像一盏灯,从中提供价值。

原载于 2021 年 5 月 12 日 https://praneethvasarla.comhttps://praneethvasarla.com/7-reasons-why-business-intelligence-bi-is-crucial/

科学软件设计不佳的 7 个原因

原文:https://towardsdatascience.com/7-reasons-why-scientific-software-are-not-well-designed-5b9f38e0027d?source=collection_archive---------14-----------------------

让我们讨论一下学术界和研究中心开发的软件设计如此糟糕的一些主要原因,并找出解决方案

马库斯·斯皮斯克在 Unsplash 上的照片

介绍

我想写这个话题已经有一段时间了,但是我必须承认我一直在拖延。虽然我自己没有正式的计算机科学背景(我有土木工程师学位),但我已经在 IT 行业工作了超过 15 年。在这段时间里,我看到了软件开发中用于提高软件质量的一些主要趋势和最佳实践。

几年前,我从之前在巴西政府机构担任 IT 经理的职位上拿了一份许可证,开始攻读数据科学博士学位,并将其应用于法国的遥感。到达后,我被要求研究一个与从卫星图像探测水有关的具体问题。然后,为了帮助我完成最初的分析,并避免从头开始,他们与我分享了以前一个学生的代码,这些代码收集了一些主要想法,但正如他们所说,需要一些“改进”。这段代码是一个更大的处理链的一部分,该处理链旨在为欧洲航天局制作水质地图。

考虑到我在遥感领域是个彻头彻尾的新手,我首先想到的是,太棒了!我不会从头开始,所以这可能是工作的一半…但我错了。

他们与我分享的代码是用 Python 写的,正如当今学术界所做的大部分编码一样,没有文档,正如“预期”的那样。我花了很多时间才理解输入参数应该是什么。当我最终让它工作时,一个非常小的样本区域的处理时间是… 10 分钟。我心想。哇!那是火箭科学!我想象着为了解决这个问题而“秘密”进行的所有数学运算的数量和复杂性。

期望与现实——左:由 WikiImagesPixabay 上拍摄的照片;右图:摄你好我是 Unsplash 上的 Nik 。

在这第一瞥之后,我开始了我的逆向工程(再次感谢缺乏文档)来理解所有的细节。我拿起一个纸笔记本,开始研究它……一行一行,一个循环一个循环,一个操作一个操作。当谈到主函数时(如果我们能做到过程化,为什么是类?),我以为会揭开我所有问题答案的那个,我大吃一惊!它总共有 2148 行代码。一个巨大的函数。有时,同一个代码块一次又一次地重复,容易出现错误,没有规则,没有指导方针,只是…一个巨大的函数。

我举这个例子(一个非常真实的例子)并不是说学术界写的代码总是垃圾。不,不是的。但它需要得到改善,而且要快,否则在不久的将来,科技公司将在研究方面领先于传统大学。研究需要数据。如今必须分析的数据量既不能在电子表格中手动处理,也不能通过难以产生可靠结果的软件来处理。但是,最重要的是,想象这样的代码安装并运行在欧洲航天局的计算集群上,这是最让我惊讶的事实。

这就把我们带回了这篇文章的主题。为什么科学软件很难设计好、记录好、编码好等等。我做了一些研究,与你分享主要的想法。

1-研究人员不是软件工程师

RF 拍摄的照片。_.工作室在像素上

第一个也是最明显的原因是,研究人员在他们的知识领域非常熟练,但他们不是软件工程师。而学术界开发的大部分软件都不是程序员写的,而是研究人员自己、研究小组或者学生写的。因此,重要的概念,如面向对象、测试、设计模式和其他许多概念都被遗忘了,因为它们没有在科学课程中讲授。

2-金钱

Unsplash 上由 Senad Palic 拍摄的照片

在任何地方,缺钱总是一个重要的制约因素。在这种情况下,研究人员没有为软件开发留出具体的预算。这就是为什么大多数科学软件是由获得奖学金或助学金的学生开发的。即使有专门的 IT 专业人员职位,学术领域的工资通常也低于私营部门,特别是与不断增长的 IT 市场相比,因此很难留住有才华的专业人员。

还是在资金方面,与科技公司签订合同外包工作也将被禁止。原因 6 中还讨论了其他问题。

3-关注论文,而不是代码

安妮·斯普拉特在 Unsplash 上的照片

软件不是最终目标。科学家为他们自己的消费开发软件,并为文章获得结果。项目中甚至没有考虑可用性或设计。在大多数情况下,甚至没有一个“软件”,而只是一个原型,做了一次工作…。当这个原型作为软件发布时,如果没有适当的测试、文档等,问题就出现了。

通常情况下,使用同一原型在另一个领域或使用不同输入再现结果的意图是不可预见的“先验”。即使当软件打算被其他学生或研究小组使用时,这些基本的主题也被留下,原型被“原样”使用

4-有限期限合同

照片由内森·杜姆劳Unsplash 上拍摄

因为软件开发不是他们的最终目标,所以没有固定的 IT 团队来管理软件生命周期。软件通常由特定研究项目的拨款资助,并在合作的基础上维护。但是技术在不断发展。我遇到过不同的科学软件或软件包,它们不再工作了,因为它们没有升级,而且它们所需的环境也不可复制。

5-缺乏适当的项目管理

乔·什切潘斯卡在 Unsplash 上的照片

有时,开发一个新的科学软件的想法是更雄心勃勃的,并不局限于一个单一的研究/调查和一个更大的项目准备。这将解决上述一些问题。但是,问题在于,在这种情况下,团队领导通常是研究人员本身,而不是经验丰富的项目经理,因此他们没有资格管理时间、质量或项目范围。然后,软件的部分内容由不同背景的不同学生编写,没有任何相关的软件开发过程。如果没有指导原则,以后就很难将这些部分整合在一起。

6-无商业利益

NeONBRANDUnsplash 上拍摄

如果对正在开发的软件有一些商业利益,“资金问题”就会得到解决。一个想法可以影响一个行业的非常特殊的情况就是这种情况。然而,作为一个经验法则,科学软件是超特定的某些学术领域,和用户基础是真正有限的。这样一来,科技公司就没有多少商业兴趣来开拓市场,通过竞争来提高产品质量。

7-程序员理解问题的难度

KOBU 机构unplash拍摄

以往的原因大多集中在缺乏计算机科学专家参与科学软件的开发过程。不过,我想提出另一点。科学软件通常是解决特定知识领域的新问题,找到能够理解其背后的科学,同时掌握所有必要的 it 概念的程序员并不那么容易。我已经看到一些科学家对 IT 专业人士感到失望,他们被聘用来搭建科学和编程之间的桥梁,因为他们无法跟上研究方面的步伐。

结论

那么……作为结论,我想说,这确实是一个大话题,我并不想回答所有的哲学问题,对这篇快速的文章。我希望它成为讨论和寻求解决办法的出发点。我们是否会有一个类别能够应付开发好的科学软件的挑战?数据科学家应该填补这个空白吗?

请告诉我你对此的看法,并就此展开一次有益的讨论。

下一篇文章见。

保持联系

如果你喜欢这篇文章,并且想无限制地继续阅读/学习这些和其他故事,考虑成为 中型会员 。如果您使用以下链接,我将收取部分会员费,不收取额外费用。

***https://cordmaur.medium.com/membership ***

您应该考虑数据湖(和事件驱动的 ETL)的 7 个理由

原文:https://towardsdatascience.com/7-reasons-why-you-should-consider-a-data-lake-and-event-driven-etl-7616b74fe484?source=collection_archive---------20-----------------------

主要考虑事项& Python 中事件驱动的 ETL 演示

照片由阿里·兹比伯Unsplash | 品牌内容披露上拍摄

面对当今数据的数量、速度和多样性,我们都开始意识到没有一个适合所有数据需求的数据库。相反,许多公司转向为特定用例或项目选择正确的数据存储。跨不同数据存储的数据分布带来了整合数据进行分析的挑战。从历史上看,唯一可行的解决方案是建立一个数据仓库:从所有这些不同的来源提取数据,清理并汇集到一起,最后,将这些数据加载到精心设计的结构清晰的 DWH 表中。虽然这种方法没有错,但是数据湖和数据仓库的结合可能正是您需要的解决方案。我们来调查一下原因。

目录

1。为您的数据仓库
2 构建一个临时区域。由于有了不可变的暂存区
3,所有数据都可以记录到您的数据生态系统中。增加价值实现时间和洞察时间
4。单一数据平台进行实时和批量分析
5。成本
6。方便
7。未来证明
演示:AWS 上无服务器事件驱动的带数据湖的 ETL
带 Lambda 的无服务器 ETL 如何伸缩?
结论

1.为您的数据仓库构建临时区域

数据湖不一定是数据的最终目的地。数据不断流动、移动、改变其形式和形状。一个现代化的数据平台应该便于接收和发现,同时允许一个完整和严格的结构来满足报告需求。一种常见的新兴模式是,数据湖充当您的数据摄取的不可变层。没有任何东西会被删除(可能只是被新版本覆盖,或者出于合规原因被删除)。您的数据平台中的所有原始数据都可以在数据湖中找到。这意味着您仍然可以使用 ELT/ETL 作业来转换和清理数据,并在稍后将数据接收到您的数据仓库,同时严格遵循 Kimball、Inmon 或 Data Vault 方法,包括缓慢变化的维度历史化和模式对齐。

您不需要在数据湖和数据仓库之间做出选择。您可以两者兼得:作为不可变暂存区的数据湖和用于 BI 和报告的数据仓库。

Databricks 创造了术语data lake house,致力于在一个解决方案中结合这两个领域的优点。类似地,像雪花这样的平台允许你将 S3 这样的云存储桶作为外部平台,有效地利用数据湖作为中转区。

最后,您需要自己决定是单个“数据湖库”,还是数据湖和数据仓库的组合最适合您的用例。蒙特卡洛数据说得好:

“我们越来越多地发现,数据团队不愿意仅仅满足于一个数据仓库、一个数据湖,甚至一个数据湖库,这是有充分理由的。随着更多用例的出现和更多的涉众(具有不同的技能组合!)都涉及其中,单一解决方案几乎不可能满足所有需求。”— 来源

2.由于采用了不可变的暂存区,所有数据都有审计日志记录在您的数据生态系统中

审计跟踪对于满足法规要求通常很重要。数据湖使得收集关于数据何时被哪个用户摄取的元数据变得容易。这不仅有助于合规性原因,也有助于跟踪数据所有权

3.增加价值实现时间和洞察时间

通过提供一个不可变的所有数据层,我们在获得数据后立即向所有消费者提供数据。通过提供原始数据,您可以实现探索性分析,当不同的数据团队可能以非常不同的方式使用相同的数据集时,这将很难完成。通常,不同的数据消费者可能需要基于相同原始数据的不同转换。数据湖允许你在任何地方深入各种类型和风格的数据,并自己决定哪些可能对你产生洞察力有用。

4.用于实时和批量分析的单一数据平台

将实时数据吸收到数据仓库中仍然是一个具有挑战性的问题。尽管市场上有一些工具试图解决这个问题,但是当利用 data lake 作为一个不可变的层来接收所有数据时,这个问题可以更容易地解决。例如,许多解决方案,如 Kinesis 数据流或 Apache Kafka,允许您指定 S3 位置作为数据的接收器。

5.费用

随着来自社交媒体、传感器、日志、网络分析的数据量不断增长,随着时间的推移,将所有数据存储在数据仓库中会变得非常昂贵。许多传统的数据仓库将存储和处理紧密地联系在一起,使得二者难以扩展。

数据湖相互独立地扩展存储和处理(查询和检索数据的 API 请求)。一些云数据仓库也支持这种模式。在我之前的文章中有更多的介绍:

** **

6.便利

通常,数据仓库解决方案要求您管理底层计算集群。云供应商开始意识到这样做的痛苦,并建立了完全托管或完全无服务器的分析数据存储。

例如,当利用 AWS Glue 和 Athena 的 S3 时,您的平台仍然完全没有服务器,您只需为您使用的东西付费。您可以利用这个单一数据平台来:

  • 检索相关非相关数据,
  • 查询历史实时数据,
  • 关卡你的 ML 训练岗位服务 ML 模特
  • 在摄取后直接查询数据在应用任何转换之前,
  • 通过外部表 ( 在几乎任何 DWH 解决方案中都可用:红移光谱、雪花外部表……)将来自数据湖和 DWH 表的数据结合起来****
  • ****将与其他服务和分布式计算框架集成,如 Dask 或 Spark。

关于集成,在 AWS 上,您可以利用:

  • ****湖泊形成用于管理出入、
  • awswrangler ( 可以形容为 AWS 上的熊猫的 Python 库),
  • Quicksight ( AWS BI 工具),
  • delta lake**(data bricks 创建的开源平台,为您的数据湖提供符合 a . o . ACID 的交易& upserts),
  • lakeFS ( 您的数据的版本控制),
  • Upsolver ( a.o .,流和批处理的数据摄取,包括使用 Kappa 架构的 upserts)
  • AWS 数据库迁移服务**,它允许您将数据从 RDS 数据库表(甚至整个模式)中增量导出到 S3 拼花文件中,这些文件可以使用 AWS Glue 进行抓取,并使用 Athena 进行查询。

7.未来证明

我找不到任何可信的统计数据,但我猜测,通常存储在数据仓库中的数据中,至少有三分之一几乎从未使用过。这样的数据源被接收、清理和维护,“以防”以后可能需要它们。这意味着数据工程师正在投入大量的时间和精力来构建和维护一些甚至可能还没有明确的业务需求的东西。

ELT 范例允许您通过仅为真正需要的用例构建数据管道来节省工程时间,同时将所有数据存储在数据湖中以备将来潜在的用例使用。如果将来出现特定的业务问题,您可能会找到答案,因为数据已经存在。但是你不必花时间去清理和维护那些还没有清晰的业务用例的数据管道。

数据湖和云数据平台是未来的证明的另一个原因是,如果您的业务增长超出了您的想象,您的平台将为增长做好准备。您不需要为了适应增长而向更大或更小的数据库进行昂贵的迁移。

无论您做出何种选择,您的云数据平台都应该允许您无限制地增长您的数据资产。

演示:在 AWS 上使用数据湖的无服务器事件驱动 ETL

为了构建一个事件驱动的 ETL 演示,我使用了这个数据集,并遵循了数据块铜-银-金原则。简而言之,这意味着您对原始数据使用“青铜”层,对预处理和干净的数据使用“白银”层,最后“黄金”表表示用于报告的抛光数据的最终阶段。为了实现这一点,我创建了:

  • S3 斗为数据:S3://数据-湖-青铜****
  • 用于清洗和转换数据的 S3 桶:S3://data-lake-silver****
  • AWS Lambda 函数(称为 事件驱动-etl )在新文件到达“青铜”S3 桶时被触发。它转换新对象并将数据加载到 stage:“silver”。

在下面的图片中,你可以找到我在这个简单演示中使用的 Dockerfile 和 Lambda 函数代码。关于如何用 Docker 容器映像构建 Lambda 函数的分步指南,你可以查看我之前在 Dashbird 上发表的博文。

lambda 函数的 Dockerfile 作者图片

AWS Lambda 中一个简单的事件驱动 ETL 作者图片

命令wr.s3.to_parquet()不仅将数据加载到新的数据湖位置,而且还:

  • 使用 snappy 和 parquet 格式压缩数据,
  • 根据 Pandas dataframe 的数据类型和列名对模式进行分类,
  • 将模式存储在 AWS 粘合目录中,
  • 创建新的 Athena 表。

因此,我们可以看到 S3、AWS Glue 和 Athena 如何在管理控制台中协同工作:

S3、胶水和雅典娜中的银色数据集-图片由作者提供

Lambda 的无服务器 ETL 如何扩展?

想象一下,你会对更多的数据集做类似的事情。管理所有这些 lambda 函数可能会变得很有挑战性。尽管 AWS Lambda 的计算能力几乎可以无限扩展,但是管理数据转换的状态很困难,尤其是在实时的事件驱动场景中。如果您使用一个可观察性平台,比如 Dashbird ,您可以很容易地检查哪些事件驱动的 ETL 工作负载成功了,哪些没有成功。

在测试我的函数时,我犯了几个错误。Dashbird 可观察性对于查看我的事件驱动 ETL 的状态非常有帮助,包括所有的错误消息。它允许我更深入地研究日志,并且一眼就能检查所有不成功的执行。想象一下,如果您必须为数百个 ETL 作业做这件事,这可能会有多困难。

使用 Dashbird 修复我的事件驱动 ETL——作者图片

同样,配置故障警报非常简单,只需将您的电子邮件地址或空闲频道添加到警报策略中即可:

Dashbird:为特定功能配置提醒—图片由作者提供

您还可以根据其他选择的条件得到通知,例如冷启动,何时持续时间超过特定阈值(可能是僵尸任务),或者何时在特定时间段内出现异常高数量的函数调用

结论

这可能被认为是一个强有力的声明,但我认为数据湖以及具有数据湖功能的数据仓库解决方案是构建任何经得起未来考验的数据平台的重要组成部分。预先为所有数据构建关系模式是低效的,并且通常与当今的数据需求不兼容。此外,拥有一个不可变的数据接收层来存储曾经接收的所有数据,对于审计、数据发现、可再现性和修复数据管道中的错误非常有益。

感谢您的阅读!以下是一些参考资料&其他资源:

[1]数据仓库— 数据块

[2]数据湖与数据仓库— 蒙特卡洛数据

[3]使用 Docker 容器部署 AWS Lambda—dash bird

[4]全球电厂数据库— 用于演示的数据源

您应该使用 Streamlit AgGrid 组件的 7 个原因

原文:https://towardsdatascience.com/7-reasons-why-you-should-use-the-streamlit-aggrid-component-2d9a2b6e32f0?source=collection_archive---------2-----------------------

用最好的 JavaScript 数据网格改进数据帧的显示

图片集市生产产地像素

我经常使用 Streamlit

这是一个很棒的库,可以快速原型化视觉上吸引人的 web 应用程序,这些应用程序以有趣的方式与数据和机器学习模型进行交互。作为一名数据科学家,我发现 Streamlit 对与其他团队成员分享实验非常有帮助。

除了是一个世界级的产品之外,使 Streamlit 更好的是它的大量扩展(也称为 Streamlit 组件),这些扩展是开源社区发布和维护的。

在这篇简短的文章中,我将回顾其中的一个部分。它被称为 streamlit-aggrid,它构建在 AG Grid 之上,旨在增强 streamlit 显示数据帧的原生能力。

我们将通过 7 个技巧来看看这个组件是如何工作的,以及如何在表格数据上使用它。

事不宜迟,我们来看看🔍

首先,AG Grid 是什么?

顾名思义,Streamlit-aggrid 基于 aggrid。

图片由作者修改

AG Grid(不可知网格的缩写)是一个功能全面且高度可定制的 JavaScript 数据网格,既可以作为独立的库使用,也可以在任何现代 web 框架(如 React、Vue 或 Angular)中使用。

图片由作者修改

Ag-Grid 具有以下基本特性:

  • 列交互(调整大小、重新排序和锁定列)
  • 分页
  • 排序
  • 行选择

以及不太标准的,如:

  • 分组/聚合
  • 就地单元格编辑
  • 记录懒惰加载
  • 服务器端记录操作
  • 直播流更新

它还有一个付费企业版,具有更高级的功能,如分组、聚合、服务器端操作、实时数据等

让我们来看看实际情况

要安装库,请执行以下操作:

***pip install streamlit-aggrid***

为了展示 streamlit-aggrid 的能力,让我们使用这个列出网飞电影和电视节目的数据集

安装完pandasstreamlitstreamlit-aggrid后,创建一个名为app.py的 python 文件,并粘贴以下代码。

这将加载一个 dataframe 并将其传递给负责显示它的 AgGrid 类。

乍一看,这看起来像一个标准的数据帧。

作者截图

一些你可以简单地用 Streamlit 的st.dataframe本地函数显示的东西:

作者截图

然而,如果你仔细看,你可以注意到一些很酷的功能。有些不明显直接看。但是让我们开始探索它们,好吗?

1 —文本未被截断

这样更容易阅读。st.dataframe总是截断文本。这有时会很烦人。

2 —列是可排序、可搜索和可过滤的

就像 Excel 文件一样。

作者 GIF

3 —列是可拖动的

您可以按任意顺序交互移动和交换列。这使得与数据的交互更加容易。

作者 GIF

4 —终于有分页了!

要添加分页,您必须通过定制网格的样式来稍微修改代码。

作者 GIF

5-可以锁定、分组和聚合列

要添加这些特性,只需在网格选项中配置一个侧栏,并将 AgGrid 类中的enable_enterprise_modules参数设置为 True

这将首先允许您锁定列,并使用更多的过滤选项对它们进行过滤。

然后,您会注意到在数据框的右端有一个侧边栏,您可以使用它来过滤列、执行数据透视表或分组和聚合(通过平均值或总和)操作。

作者 GIF

6-单元格的样式取决于其值

假设当值包含“美国”时,您希望通过更改country列的背景色来突出显示美国电视和电影节目。

为此,您必须在网格选项中配置country列,根据它的值改变它的颜色。这可以通过注入一个字符串形式的 JavaScript 代码来实现。

要做到这一点,您还必须在 AgGrid 类内部将allow_unsafe_jscode设置为 True。

作者 GIF

7-网格可以与其他 Streamlit 对象交互

这是 streamlit-aggrid 最有趣的特性之一。

您可以捕获网格上发生的任何事件(例如,对列进行排序、对一行或多行进行复选、手动更改值等),并使其改变 Streamlit 应用程序的全局布局。

实现的方式非常简单。我们用一个例子来理解。

假设我们想要选择多行,并且每次我们选择一个新行时,我们都希望看到按节目类型(电影/电视节目)分组的节目分级的更新直方图。

首先要使行可选,我们必须像往常一样,通过配置选择来更改网格选项。

然后,我们必须在 AgGrid 类中指定update_mode参数。

我们将它设置为 SELECTION_CHANGED: 这意味着每次选择一行或多行时,布局都会改变。您还可以监听其他事件,如数据的手动更改或列过滤。

现在,这对 Streamlit 应用程序有什么影响?很简单。

每次选择一行时,AgGird 类都会返回一个新值,由于该值在每次选择时都会发生变化,Streamlit 知道它必须从上到下重新渲染应用程序。

为了证实这一点,让我们在选择一行后将返回值data写入屏幕。

作者截图

如您所见,data显示所选行是在字典中捕获的。多行选择也是如此:如果选择三行,您将得到三个字典的列表。

现在,如果我们想显示一个 plotly 图表,汇总我们选择的行,我们需要做的就是添加下面的代码,创建一个中间数据帧并将其传递给 plotly。

下面是选择多行时的样子。

作者 GIF

资源:

和往常一样,您可以查看以下链接来了解更多关于 streamlit-aggrid 的信息。

👉你也可以运行官方示例,深入到代码中去理解发生了什么。

👉如果你有兴趣了解更多关于 Streamlit 的信息,你可以查看我之前关于 building Playground 的故事,这是一个直接从浏览器与模型交互的 Streamlit 应用程序。

***

感谢阅读🙏

同样,如果你已经做到了这一步,我想感谢你的时间,并希望 streamlit-aggrid 将帮助你的 streamlit 项目。

这就是我的全部。下次见!***

新到中?你可以订阅每月 5 美元,并解锁无限的文章——点击这里。

照片由 Charles DeluvioUnsplash 上拍摄

R 中高效工作流值得知道的 7 个捷径

原文:https://towardsdatascience.com/7-shortcuts-worth-knowing-for-efficient-workflow-in-r-cc52c351cb73?source=collection_archive---------12-----------------------

RStudio 中常规编码的便捷键盘快捷键

弗洛里安·奥利佛在 Unsplash上的照片

编程需要大量的组织工作,如果是在大的编码项目中工作,有时会很难维持。可能一直用鼠标通过鼠标点击来运行高亮显示的代码太烦人了。或者像注释或使用重复操作这样的常规事情变得太无聊,那么它会让你思考你能找到完成这些任务的捷径吗。所有这些都会影响工作效率。

如果你是一个 RStudio 用户,那么下面讨论的这 7 个快捷方式一定会很方便。这些捷径你事先知道多少?有新的给你吗?让我们读一读,自己找出答案。

  1. 隐藏代码:当您的代码涉及大型函数或代码块时,隐藏代码非常方便,可以隐藏这些函数或代码块以方便编写代码。通过使用 Alt+L 快捷键,用户可以隐藏高亮显示的代码,通过点击带有双向箭头的黄色图标可以将其展开。一旦您关闭并再次打开代码窗口,隐藏的代码将以展开的形式出现。

作者图片

2.显示文档大纲:显示文档大纲类似于超链接的目录。通过使用这个特性,当您有 100 行代码要处理时,沿着代码导航变得非常容易。使用#添加注释,该注释将用于注释,并且该注释可以转换为大纲的标题。标题前面应该有以下任何符号: #,-,或=,连续 4 次 。如果使用这些符号的次数少于三次,它们将不会出现在文档轮廓中,如下图所示。要查看文档轮廓,按 Ctrl+Shift+O 。下图中的橙色方块显示了文档轮廓图标的位置。

作者图片

3.执行代码:我运行代码最常用的两个快捷键是 Ctrl+EnterCtrl+Alt+RCtrl+Enter 用于逐行执行代码时。此外,这个命令还可以执行突出显示的代码块。如果你想运行完整的代码,那么应该使用 Ctrl+Alt+R

4。注释/取消注释:对一段文本或一段多行代码进行注释,这段文本或代码可能现在没有使用,但应该保留以供参考,那么 Ctrl+Shift+C 就是解决方案。通过使用上述快捷键,可以同时对多个选定行进行注释或取消注释。

5。选择工作目录:您是否总是在编写代码的兴奋中忘记选择工作目录,或者太麻烦而无法从 RStudio 面板的文件>更多部分选择工作目录选项。下图中突出显示的橙色框显示了设置工作目录的位置。

作者图片

那么选择工作目录的快捷键, Ctrl+Shift+H ,就能为你创造奇迹。通过使用快捷方式,将打开一个弹出窗口,如下图所示。

作者图片

6。管道工具 (% > %):马格里特包中 R 最有用的操作符之一。管道工具对于执行多个连续任务非常有用。管道工具的快捷方式是 Ctrl+Shift+M

作者图片

7。在 RStudio 中打开快捷面板:如果你很难记住上面提到的所有快捷方式,那么你只需要记住 Alt+Shift+K 。这是通往 RStudio 中可以使用的所有快捷方式的入口,无论您是使用 R 脚本、笔记本还是 Markdown。

作者图片

结论

在本文中,我们讨论了改进 RStudio 工作流程的 7 种快捷方式:

  1. 隐藏代码
  2. 显示文档大纲
  3. 执行代码
  4. 注释/取消注释
  5. 选择工作目录
  6. 修管工具
  7. 在 RStudio 中打开快捷面板

我们看到了 7 个快捷方式以及它们是如何在 r 中实现的。记住它们的最好方法是现在尝试一下,看看它们如何影响你的工作流程。如果你认为其中任何一个可以改善你的工作流程,那么就继续利用它们。如果你很难记住快捷键,那么你只需要记住 Alt+Shift+K 就可以了,这将导致 RStudio 的快捷键面板。

请在评论中分享让你的生活变得更简单的快捷方式。一定要告诉我你最喜欢哪一个。编码快乐!

如果你喜欢这些提示,那么你可能想看看这些关于 ggplot2 包的提示。

您可以在 LinkedInTwitter 上与我联系,跟随我的数据科学和数据可视化之旅。

你绝对应该知道的 7 个 SQL 功能

原文:https://towardsdatascience.com/7-sql-functionalities-that-you-should-definitely-know-2b3fd9174608?source=collection_archive---------16-----------------------

入门

更好地使用 SQL 将会节省您的时间并减少您的挫败感

马库斯·斯皮斯克在 Unsplash 上拍摄的照片

SQL 是许多数据科学家的一项重要技能。SQL(结构化查询语言)是一种非常灵活的语言,读起来很像普通英语。它允许轻松访问数据库中最复杂的表结构。毕竟,如果不能访问数据,数据有什么用?市场上的许多工作都需要 SQL 知识,所以至少学习一些基础知识绝对是一个明智的想法。作为一个曾经管理过不使用 SQL 的数据库的人,我可以自信地说,如果你有一份使用 SQL 的工作,你一定会很感激。

在本文中,我想与您分享 SQL 的一些功能,以帮助您更好地进行搜索,从而成为查询高手。

1.格条款

CASE子句允许您在查询中创建条件情况,并将它们作为列返回。

SELECT employee_name, salary,
CASE
    WHEN salary >= 100000 THEN 'Senior'
    WHEN salary < 100000 AND salary >= 50000 THEN 'Midlevel'
    WHEN salary < 50000 THEN 'Entrylevel' END
FROM employees;

该查询将返回雇员姓名和薪金列,而CASE子句将是一个新列,根据薪金条件语句所满足的条件,包含高级、中级或入门级的值。注意CASE子句的语法。您可以使用WHENTHEN添加任意多的条件语句,并在开始时将它们全部夹在CASE中,当您完成条件语句时,将它们夹在END中。

2.聚合函数

您可以在查询中执行许多非常有用的功能。它们是非常直接的函数,通常只需要意识到它们的存在。所以要知道,像MIN()MAX()SUM()COUNT()AVG()这样的东西会让你的查询更有效率。请注意,您总是需要将它们与 GROUP BY 子句配对。

SELECT region, COUNT(employee_name)
FROM employees
GROUP BY region;

该查询将返回地区列表以及每个地区的雇员人数。如前所述,您必须将 count 函数与一个GROUP BY子句配对,以告诉数据库如何对计数进行分组。

SELECT department, SUM(salary)
FROM employees
GROUP BY department;

该查询将返回部门列表,其中包含该部门所有员工的工资总额。同样,您必须使用一个GROUP BY子句来告诉数据库按部门对合计工资进行分组。

3.WHERE 和 HAVING 子句

WHEREHAVING子句彼此相似,因为它们都是基于标准进行过滤的简单方法。需要记住的两者之间的最大区别是,HAVING将基于聚合数据列进行过滤,而WHERE不会。

SELECT employee_name, department
FROM employees
WHERE salary > 50000;

该查询将只返回符合WHERE语句标准的雇员的所有姓名和部门。也就是说,只有工资高于$50,000 的雇员才会被返回。

SELECT department, SUM(salary)
FROM employees
GROUP BY department
HAVING SUM(salary) > 1000000;

这个查询与上面的查询相同,但是现在返回的部门是那些工资总额大于 1,000,000 美元的部门。注意在这个查询中我们如何使用了一个HAVING语句,因为它是在一个聚合列上过滤的。

4.串联运算符

这是将列合并成一列的一个方便的小技巧。例如,假设您有一个表,其中包含两个不同列中的雇员姓名,即名字和姓氏。也许您希望创建一个查询,返回同一列中的姓名,并显示全名。串联运算符将为您完成这项工作。它被表示为两个相邻的管道,如 so ||

SELECT first_name || ' ' || last_name
FROM employees;

该查询将返回一列,该列的名字和姓氏用空格隔开。你可以按照你希望名字出现的方式写这一行。如果您希望姓氏出现在最前面,您可以将该行写成last_name || ', '|| first_name。这将首先显示姓氏列中的信息,然后是逗号和空格,最后是名字信息。

5.子查询

许多希望从两个表中获取信息的人通常会立即转向连接。但是子查询也是组合来自两个来源的信息的有效方法,您可能会发现在某些情况下它们更容易。子查询可以用在几乎任何子句中(包括SELECTFROMWHERE等)。).

SELECT *
FROM employees
WHERE department IN (SELECT department 
                     FROM departments
                     WHERE division = 'Technology');

这个查询乍一看可能很奇怪,但是让我们一次一部分来看。括号中的子查询返回属于技术部门的部门列表。因此,您可以将括号中的内容视为部门名称列表。主查询选择条目的所有列,这些条目的部门至少与子查询返回的列表中的一个部门名称匹配。

我发现保持子查询的新鲜感有助于我有更多的解决方案来处理棘手的情况。连接很好,但知道如何用多种方法解谜更有用。

6.LIKE 运算符

通常情况下,数据库中的信息必须精确搜索,并且区分大小写。也许您有一些条目的大写有所不同,或者有轻微的拼写差异。在这里,LIKE操作符将是你最好的朋友,因为它是你搜索时不需要精确拼写的方式。

SELECT department
FROM departments
WHERE department LIKE '%omputer%';

这将返回包含字符串“omputer”的所有部门。因此,如果您将一些部门输入为“计算机”、“计算机”或“计算机”,所有这些条目都将被返回。

7.美化你的结果

最后一个是一些相关技巧的集合,可以让你的结果以简洁易读的格式显示。

注意列的排列顺序。如果您希望某列首先出现,那么在查询中首先列出它。像SELECT last_name, first_name, department, salary这样的语句将按这个顺序显示列。

利用别名重命名列。别名在使用聚合函数时特别有用。让我们看看上面的一个查询,看看我们如何使用别名来重命名列。

SELECT region, COUNT(employee_name) AS number_of_employees
FROM employees
GROUP BY region;

计数列现在将返回标题为“number_of_employees ”,这增加了可读性。

使用一个 **ORDER BY** 语句。让我们再次使用相同的查询,看看如何使用ORDER BY来改进结果。

SELECT region, COUNT(employee_name) AS number_of_employees
FROM employees
GROUP BY region
ORDER BY number_of_employees DESC;

默认的排序方法是升序,所以如果你想首先显示最大的结果,你可以像例子中那样添加DESC。这将极大地提高查询结果的可读性,因为我们现在可以在列表的顶部看到雇员人数最多的地区。

使用一个 **LIMIT** 语句。 LIMIT就像它听起来那样限制返回结果的数量。同样,我们可以使用相同的查询来看看这是如何工作的。

SELECT region, COUNT(employee_name) AS number_of_employees
FROM employees
GROUP BY region
ORDER BY number_of_employees DESC
LIMIT 5;

现在将只返回前 5 个结果,这将是拥有最多员工的前 5 个地区。

结论

有了这么多的功能,学习 SQL 会很有趣。我喜欢编写 SQL 查询,因为每个查询都像是一个谜题。我希望这篇文章能帮助您认识到更多可用的功能,并为您的下一个查询找到一些有用的东西!

成功数据科学项目的 7 个步骤

原文:https://towardsdatascience.com/7-steps-to-a-successful-data-science-project-b452a9b57149?source=collection_archive---------5-----------------------

从头开始完成数据科学项目的初学者指南

克拉克·蒂布斯在 Unsplash 上拍摄的照片

D 数据科学项目对于任何进入该领域的人以及建立个人投资组合都是必不可少的。无论你是绝对的初学者还是经验丰富的专业人士,一个合乎逻辑的方法将有助于你的项目取得成功。这篇文章描述了一个简单的七步方法,你可以应用到你的项目中,自信地解决它们。

该方法如下:

  1. 问题陈述
  2. 数据收集
  3. 数据清理
  4. 探索性数据分析(EDA)
  5. 特征工程
  6. 造型
  7. 通信

好吧!这就是方法论。现在,让我们更详细地了解每一个步骤,并用有用的提示和技巧来解决它们。

1.问题陈述

无论是你正在处理的业务问题还是个人项目,一个定义明确的问题都可以为你节省很多时间和麻烦。问题陈述的目的是清楚地陈述你试图解决的问题。如果做得好,可以用几句话来定义。

请记住,你的问题陈述必须巧妙。

  • 具体: 问题陈述要详细具体到你要解决的问题。

  • 行动: 你可以采取哪些具体行动来解决你的问题?

  • 相关: 解决一个问题有多种方法,但要专注于最相关的方法。

  • :你有没有给你的问题应该在什么时候解决加上时间限制?

例如,XYZ 如何通过制造和分析产品性能,在年底前将故障率降至 5%以下?

遵循 SMART 指南的问题陈述会让你走上成功的轨道,达到你的最终目标。更重要的是,在你完成问题陈述后,你会对你的项目的细节有一个更好的想法。

2.数据收集

数据收集是在一个有组织的系统中收集和测量有关感兴趣的目标变量的信息的过程,然后让您回答相关问题并决定未来的结果。

数据收集方法的几个例子包括:

  • 政府机构
  • 卡格尔
  • 公司数据库服务器
  • 自行收集的数据

无论你从哪里获得数据,请记住:****

(图片由作者提供)

确保您的数据是 相关的验证过的 。如果你的数据不适合你正在解决的问题,那么无论你的模型有多好,你的结果都是无用的。s 质量是关键!

数据收集需要时间,所以不要急于完成这一步!

3.数据清理

你 80%左右的时间会花在清理数据上。你不能忽视这一步!

清理数据是确保数据格式正确的过程;一致,错误被识别并得到适当的处理。

以下操作可使数据集更加整洁:

  • 删除重复值 ( 这通常是合并多个数据集时的情况)
  • 去除无关的观察 ( 观察需要针对你正在解决的问题)
  • 处理缺失值(例如插补技术、丢弃特征/观察值)
  • 重新格式化数据类型(例如布尔、数字、日期时间)
  • 过滤不想要的离群值(如果你有正当理由)
  • 重新格式化字符串(例如删除空格、标签错误/拼写错误的类别)
  • 验证 ( 数据有意义吗?数据是否符合定义的业务规则?)

清理您的数据将允许更高质量的信息,并最终导致更结论性和准确的决策。

4.探索性数据分析

顾名思义,在 EDA 期间,你对数据有了更深入的了解。在此步骤中,您需要了解数据的统计特征创建可视化测试假设**

这是你展示创意的地方!

EDA 有四种主要类型:

请记住,EDA 的目标是找到数据中的潜在模式,检测异常值并测试假设,最终目标是找到一个与数据非常吻合的模型。

5.特征工程

特征是数据集的一个属性,对你正在解决的问题很有用。如果某个特性对您正在解决的问题没有影响,那么它就不是问题的一部分。

那么什么是特征工程呢?

特征工程定义为将原始数据转化为更好地代表预测模型潜在问题的特征的过程,从而提高未知数据的模型准确性。

您为预测模型创建和选择的特征越好,结果就越好。特征工程是一门艺术,你分解或聚集原始数据来帮助解决你的问题;然而,有许多方法可以实现这一过程。

  • 特征提取:选择和/或组合变量到特征中,以减少数据集的维数。(例如,主成分分析、非线性降维、无监督聚类方法)**
  • 功能选择:选择对您正在解决的问题贡献最大的功能。(例如方差阈值、皮尔逊相关、套索)**
  • 特征构建:从原始数据中手动构建更高效特征的过程。(例如关系属性的动态聚合)****
  • 特征学习:自动识别和使用特征。(例如受限玻尔兹曼机,K-均值聚类)******

使用特性重要性评分方法,您可以估计特性的有用程度。特性被赋予分数,因此可以基于这些分数对它们进行排序。

方法包括:

  • 特征和目标变量之间的相关系数(你试图预测的特征)**
  • 两个时间序列之间的协整(对于时间序列数据)**
  • 预测模型具有嵌入式特征选择方法(例如随机森林、梯度推进机器**
  • 卡方检验(目标和数值变量之间)**
  • 递归特征消除(解释)

发现自己多次回到这一步是正常的。

特征工程是一个迭代的过程。它可能看起来像这样:

  1. 集思广益。
  2. 基于问题创建特征(例如特征提取/构建)**
  3. 根据要素重要性分数选择要素
  4. 在看不见的数据上使用所选要素计算模型精度。
  5. 重复上述步骤,直到选择了合适的型号。

6.系统模型化

所有机器学习模型都被归类为监督非监督学习问题。****

A S 监督问题 是函数基于输入输出对将输入映射到输出。机器学习模型从输入输出训练数据中学习,对看不见的数据(测试数据)进行预测。U 未被发现的问题 是模型在未标记的数据集中寻找模式。

监督学习问题被标记为回归(输出变量是实值)或分类(输出变量是类别)问题——更多关于它们之间的区别在这里。通过标记您的问题,您可以确定您将使用哪个/哪些指标来比较模型的准确性。****

  • 回归度量:均方误差( MSE )、平均绝对误差( MAE )、均方根误差( RMSE )、平均绝对百分比误差( MAPE )、R 平方、调整后 R 平方
  • 分类指标:准确度、精确度、召回率、F1 值

预处理

通过以合适的格式组织原始数据来构建和训练机器学习模型,数据预处理有助于提高数据质量。

  1. 第一步是将你的数据分成训练和测试数据集。这一点很重要,因为您不希望测试数据污染训练数据。****
  2. 第二步是标准化或规范化你的数据如果模型的算法对未缩放的数据敏感。****
  3. 对于第三步,训练和测试数据需要被分割成目标变量 ( 你试图预测的 ) 和预测变量 ( 你用来预测目标变量的特征)。****

机器学习模型

如前所述,机器学习模型分为有监督的和无监督的。我将概述这些类别中使用的一些模型。

  • 有监督 - 回归: 线性回归、多元线性回归、支持向量回归( SVR )、随机森林、神经网络
  • 有监督--分类:支持向量机【SVM】、随机森林、神经网络、k 近邻(kNN)******
  • 无监督: K 均值聚类、主成分分析( PCA )、奇异值分解( SVD )

在建立了一些机器学习模型之后,模型需要通过调整超参数来训练,以优化模型性能。超参数 是用于控制学习过程和减少预定义损失函数的参数。通过比较每个模型的预定义指标*,可以选择最佳模型。*******

7.沟通

最后,交流你的结果是很重要的。这可以通过演示、正式报告甚至博客文章来完成。关键是全世界都要看到你所做的了不起的工作。需要记住几个要点:****

  • 不要让你的幻灯片过于拥挤(最多 6 项)
  • 使用 相关可视化
  • 了解你的受众
  • 确保它流动

数据科学就是要很好地交流你的结果。带着激情去做,用讲故事的方式,向你的观众展示为什么你的发现如此有趣。

我试图为任何数据科学项目创建一个适应性强的指南。如果你觉得我错过了任何重要的步骤,请留下评论。

数据科学是关于学习和共同成长的。

感谢您的宝贵时间!

取得联系

领英:https://www.linkedin.com/in/amit-bharadwa123/

posted @ 2024-10-17 11:33  绝不原创的飞龙  阅读(141)  评论(0)    收藏  举报