TowardsDataScience 博客中文翻译 2021(五十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在数据科学项目中应该避免的 9 个错误

原文:https://towardsdatascience.com/9-mistakes-you-should-avoid-in-your-data-science-projects-8e258c5e9374?source=collection_archive---------26-----------------------

通过克服这些常见错误获得更好的结果

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

UnsplashNeONBRAND 拍摄的照片

在数据科学中,就像许多其他领域一样,通过实践,比通过阅读书籍或研究该领域的技术方面,你会学到更多。当任何人开始他们的数据科学学习之旅时,您通常会花费大量时间和精力来学习许多方面、技能和术语。你将学习编码、数学和统计学、算法、可视化和商业基础。

尽管所有这些概念和主题都非常重要,但了解某个领域的理论并不意味着你会在该领域取得成功,或者可以毫无瑕疵地实施项目。有时候,作为初学者,我们倾向于做一些简单的事情来避免错误,我们这样做只是因为我们缺乏经验或者我们没有被教导去避免这些错误。

但是,一旦我们开始构建越来越多的项目,就要和不同的团队一起处理不同的主题。然后,在不同的数据集上,我们将发展如何处理任何问题的直觉,计划达到解决方案的具体步骤,并能够解决任何出现在你面前的问题。因此,尽管您会通过构建项目找到自己避免错误的方法,但您也可以通过与职业生涯中更远的数据科学家交谈来获得这些知识。

我曾经和许多数据科学家谈论过他们的学习之旅,以及他们希望在职业生涯中早点知道哪些东西可以帮助他们更快更好地进步。但是,正如我听到的很多,你通过做学得更好;当你经历某件事时,它会比你听到它时更好地留在你的脑海里。也就是说,阅读和获取信息永远不会是一件坏事。

在这篇文章中,我们将走过 9 个新手经常犯的错误,有时专家会有意或无意地导致错误的结果或导致项目花费更长的时间来完成。你可以在许多博客文章中找到这些错误,比如 SamrtBoostJigSawCIO 以及其他在线资源。

№1:没有计划

让我们从最常犯的错误开始,即使作为专业数据科学家,也是在没有“攻击计划”的情况下进行项目通常,当我们遇到一个数据科学问题时,我们需要回答“为什么”数据会以这种方式运行,为了回答这个等式,我们需要清楚该做什么。那就是有一个计划和我们需要采取的步骤的想法。

№2:选择错误的可视化效果

如果有什么是我经常重复的,那就是,明智地选择你的视觉化。可视化在项目的所有阶段都很重要。例如,它在数据探索中至关重要,让你发现或错过模式或趋势。因此,请确保您了解可用的不同可视化工具、可以使用的图形和图表,以及哪种工具最能描述您的数据并帮助您更好地理解数据。

</5-online-data-science-courses-you-can-finish-in-1-day-5b60f353fa8e>

№3:不考虑数据中的偏差

在数据科学领域,有一句名言,“数据决定结果。”但是,不幸的是,我们通常对数据的收集方式和地点没有发言权。这就是为什么当我们使用一组数据来设置解决问题的步骤时,我们需要考虑这些数据可能有偏差或者不能很好地代表整个群体。这样做有助于我们避免做出错误的决策,避免最终得到扭曲的模型。

№4:没有根据现有数据优化模型

为了获得更好的结果,您的模型必须针对您拥有的数据进行优化;您的模型需要跟随数据随时间的变化。在机器学习中,这属于优化超参数的值以达到最佳性能。优化你的模型不只是一次性的步骤;通常,每次数据发生变化或其中发生变化时,您都需要返回并修改参数以适应该变化。

№5:更注重准确性而不是性能

这个错误是我们所有人在职业生涯的某个阶段都会犯的。准确性很重要,但不是好模型的唯一因素。解决方案的准确性取决于您选择的算法、您正在处理的数据以及您设置的参数。改变这些事情中的任何一个都会影响你的结果的准确性。所以,多关注于正确解释你的数据,你会得到很好的准确性。

№6:忽视相关性不等于因果关系

相关性和因果关系是两个非常不同的东西,但有时我们倾向于将它们联系起来,不仅在数据科学项目中,而且在我们的个人生活中。相关性是一种统计技术,用于表示两个变量或两个因素之间的关系。但是,仅仅因为关系存在,并不意味着因果关系也存在。所以,先测试数据再下结论。

</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)

№7:重用实现

这是另一个常见的错误:当我们在一个项目上花费大量时间,开发一种方法,并优化一个模型时,我们可能会认为这个模型可以应用于类似的问题,不需要任何修改。不幸的是,这种情况很少发生。每个问题都有自己的变量,需要量身定制的解决方案。因此,避免重复使用不同问题的含义。

№8:没有选择正确的工具

即使对我们中最专业的人来说,这也很容易出错。今天,似乎有无限多的工具可以在实施数据科学项目的不同阶段帮助您。但是,由于这个数字,我们可能会选择错误的工具,或者最终使用太多的工具。因此,从长远来看,在计划阶段花些时间为项目选择最好的工具将会节省您大量的时间和精力。

№9:忘记问题的商业方面

数据科学是一个跨学科的领域;它涵盖了广泛的应用程序和场景。所有这些应用都有商业的一面;这就是为什么他们永远不应该被忽视。因为业务方面是数据开始的地方,也是结果将被实现的地方,所以总是要花点时间来检查数据是如何和为什么被收集的,以及你将发现的洞察力将如何被用于未来的数据。记住,数据科学中的错误决策会导致数百万人。

</10-newsletters-you-need-to-subscribe-to-as-a-data-scientist-d12c7f33fbab>

最后的想法

当我第一次开始数据科学学习之旅时,我花了几个月的时间来掌握该领域的基础知识,复习我的数学和统计学,学习如何有效地可视化数据,如何以最佳方式交流信息,并学习一些基本的业务知识来支持我的模型选择。

但是,我要说的是,尽管我通过教程、在线课程和书籍学到了很多东西,但我通过第一年实际构建数据科学项目、与其他数据科学家合作以及探索数据科学的不同应用获得了最多的知识。通过这些互动,我学会了避免许多错误,只是为了有一个更有效的工作流程。

当你开始设计和实现项目时,我确信你会同意我们在这篇文章中所经历的 9 个错误。当你想起在数据科学职业生涯的早期犯下的一个错误时,你甚至会微笑。通过阅读这篇文章,我唯一的希望是初学数据的科学家在开始他们的职业生涯时知道应该避免什么,并且能够构建更好、更专业的项目。

</7-types-of-gigs-you-can-do-as-a-freelance-data-scientist-5b81f3c203af>

提高数据分析能力的 9 个技巧

原文:https://towardsdatascience.com/9-pandas-value-counts-tricks-to-improve-your-data-analysis-7980a2b46536?source=collection_archive---------4-----------------------

探索性数据分析和数据预处理的熊猫技巧

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

照片由伊琳娜·蒂萨克Unsplash 上拍摄

数据科学家经常花大部分时间探索和预处理数据。说到数据剖析和理解数据结构,Pandas value_counts()是最受欢迎的。该函数返回包含唯一值计数的序列。结果序列可以按降序或升序排序,通过参数控制包含或排除NA

在本文中,我们将探索熊猫value_counts()的不同使用案例。您将学习如何使用它来处理以下常见任务。

  1. 默认参数
  2. 按升序排列结果
  3. 按字母顺序排列结果
  4. 从结果中包含NA
  5. 以百分比计数显示结果
  6. 将连续数据绑定到离散区间
  7. 分组并呼叫value_counts()
  8. 将结果序列转换成数据帧
  9. 应用于数据帧

请查看笔记本获取源代码。

访问 Github Repo 获取其他教程

1.默认参数

Pandas value_counts()函数返回包含唯一值计数的序列。默认情况下,生成的序列按降序排列,没有任何NA值。例如,让我们从 Titanic 数据集中获取列“**apolloed”**的计数。

>>> df['Embarked'].value_counts()S    644
C    168
Q     77
Name: Embarked, dtype: int64

2.按升序排列结果

value_count()返回的序列默认为降序。我们可以将参数ascending设置为True来得到一个升序的结果。

>>> df['Embarked'].value_counts(**ascending=True**)Q     77
C    168
S    644
Name: Embarked, dtype: int64

3.按字母顺序排列结果

我们已经学习了参数ascending来获得按值计数 ASC 或 DESC 排序的结果。在某些情况下,按字母顺序显示我们的结果会更好。例如,这可以通过在value_counts()之后调用sort_index(ascending=True)来实现

>>> df['Embarked'].value_counts(ascending=True).**sort_index(ascending=True)**C    168
Q     77
S    644
Name: Embarked, dtype: int64

4.从结果中包含 NA

默认情况下,结果中会忽略包含任何NA值的行。有一种说法dropna来配置它。我们可以将值设置为False,以包含带有NA的行的计数。

df['Embarked'].value_counts(**dropna=False**)S      644
C      168
Q       77
**NaN      2**
Name: Embarked, dtype: int64

5.以百分比计数显示结果

进行探索性数据分析时,有时查看唯一值的百分比计数会更有用。这可以通过将参数normalize设置为True来实现,例如:

df['Embarked'].value_counts(**normalize=True**)**S    0.724409
C    0.188976
Q    0.086614**
Name: Embarked, dtype: float64

如果我们希望结果用百分号(%)格式化,我们可以如下设置熊猫显示选项:

>>> pd.set_option('display.float_format', **'{:.2%}'.format**)>>> df['Embarked'].value_counts(**normalize = True**)**S   72.44%
C   18.90%
Q    8.66%**
Name: Embarked, dtype: float64

通过调用pd.set_option('display.float_format', '**{:.2%}'.format**),它更新 Pandas 默认显示设置,并应用于所有浮点值。要重置,可以调用pd.reset_option('display.float_format')

另外,感谢大卫·B·罗森(博士)的建议。代替熊猫显示选项,我们可以简单地将结果转换成数据帧,并如下调用style.format('{:.2%}'):

df['Embarked'].value_counts(normalize = True).**to_frame().style.format('{:.2%}')**

如果你想了解更多关于熊猫的展示选项,你可以查看:

</8-commonly-used-pandas-display-options-you-should-know-a832365efa95>

6.将连续数据绑定到离散区间

Pandas value_counts()可用于通过bin参数将连续数据绑定到离散区间。类似于熊猫[cut()](/all-pandas-cut-you-should-know-for-transforming-numerical-data-into-categorical-data-1370cf7f4c4f)函数,我们可以传递一个整数或者一个列表给bin参数。

当一个整数被传递给bin时,该函数会将连续值离散化到个大小相等的箱中,例如:

>>> df['Fare'].value_counts(**bins=3**)**(-0.513, 170.776]**     871
**(170.776, 341.553]**     17
**(341.553, 512.329]**      3
Name: Fare, dtype: int64

当一个列表被传递到bin时,该函数会将连续值分成自定义组,例如:

>>> df['Fare'].value_counts(**bins=[-1, 20, 100, 550]**)**(-1.001, 20.0]**    515
**(20.0, 100.0]**     323
**(100.0, 550.0]**     53
Name: Fare, dtype: int64

如果你想了解更多关于宁滨的熊猫cut(),你可以看看:

7.分组依据并执行 value_counts()

Pandas [groupby()](/all-pandas-groupby-you-should-know-for-grouping-data-and-performing-operations-2a8ec1327b5)允许我们将数据分成不同的组来执行计算,以便更好地进行分析。一个常见的用例是按某一列进行分组,然后获取另一列的唯一值的计数。例如,让我们通过对“”列和“”列进行分组,得到不同“**性”**值的计数。

>>> df.groupby(**'Embarked'**)**['Sex']**.value_counts()**Embarked  Sex   
C         male       95
          female     73
Q         male       41
          female     36
S         male      441
          female    203**
Name: Sex, dtype: int64

如果你想了解更多关于groupby()的信息,可以查看:

8.将结果序列转换成数据帧

Pandas value_counts()返回一个序列,包括前面的 MultiIndex 示例。如果我们希望我们的结果显示为数据帧,我们可以在value_count()之后调用to_frame()

>>> df.groupby('Embarked')['Sex'].value_counts()**.to_frame()**

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

to_frame()结果(图片由作者提供)

9.应用于数据帧

到目前为止,我们已经将value_counts()应用于熊猫系列,在熊猫数据帧中有一个等效的方法。Pandas DataFrame.value_counts()返回一个包含数据帧中唯一行计数的序列。

让我们看一个例子来更好地理解它:

df = pd.DataFrame({
    'num_legs': [2, 4, 4, 6],
    'num_wings': [2, 0, 0, 0]},
    index=['falcon', 'dog', 'cat', 'ant']
)>>> **df.value_counts()****num_legs  num_wings
4         0            2
6         0            1
2         2            1**
dtype: int64

通过在df上调用value_counts(),它返回一个以 num_legsnum_wings 为索引的 MultiIndex 系列。从结果中,我们可以发现 2 个记录有num_legs=4num_wing=0

类似地,我们可以调用to_frame()将结果转换成数据帧

>>> df.value_counts().**to_frame()**

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

df.value_counts()的结果。 to_frame() (图片由作者提供)

结论

在本文中,我们探索了熊猫value_counts()的不同用例。它非常方便,是探索性数据分析和数据预处理中最受欢迎的方法之一。

我希望这篇文章能帮助你节省学习熊猫的时间。我建议你查看一下value_counts() API 的文档,并了解你可以做的其他事情。

感谢阅读。请查看笔记本获取源代码,如果你对机器学习的实用方面感兴趣,请继续关注。

你可能会对我的其他一些熊猫文章感兴趣:

更多教程可以在 Github 上找到

应该开始使用 Python 数据类的 9 个理由

原文:https://towardsdatascience.com/9-reasons-why-you-should-start-using-python-dataclasses-98271adadc66?source=collection_archive---------0-----------------------

提高效率,减少样板代码

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

作者图片

从 3.7 版本开始,Python 引入了数据类(参见 PEP 557 ),这是一个定义包含和封装数据的类的新特性。

我最近开始在几个数据科学项目中使用这个模块,我真的很喜欢它。我马上想到两个原因:

  1. 较少的样板代码
  2. 可读性更强,代码可维护性更好

这篇文章总结了我的第一印象:我将用它来介绍数据类和它们旨在解决的问题,并介绍它们提供的 9 个不错的特性。
我有时会将使用 dataclasses 编写的类与原生 Python 实现进行比较,找出不同之处。

少说多做。让我们看一看🔍

PS:我不会涵盖关于数据类的所有内容,但是我们将介绍的特性应该可以让您快速了解。然而,如果您想要更深入的了解,可以看看参考资料部分的链接。

新到中?你可以每月订阅 5 美元,解锁我写的不限数量的关于编程、MLOps 和系统设计的文章,以帮助数据科学家(或 ML 工程师)编写更好的代码。

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

0 —数据类:整体情况

顾名思义,数据类是用来保存数据的类。这个模块背后的动机是,我们有时定义只作为数据容器的类,当我们这样做时,我们会花费大量的时间编写带有大量参数的样板代码,一个丑陋的__init__方法和许多被覆盖的函数。

数据类缓解了这个问题,同时提供了额外的有用方法。此外,由于 dataclasses 在 Python 生态系统中相对较新,所以它强制实施了诸如类型注释之类的现代实践。

👉数据类仍然是类。因此,您可以在其中实现任何自定义方法,就像在普通类中一样。

好,现在让我们看看他们的行动。

1 —定义类的代码更少

当我们定义一个类来存储一些属性时,它通常是这样的。

这是标准的 Python 语法。

当您使用 dataclasses 时,您首先必须导入dataclass,然后在您定义的类之前使用它作为装饰器。

下面是前面使用 dataclasses 的代码。

关于这个语法,需要注意一些事情:

  • 样板代码更少:我们定义每个属性一次,我们自己不重复
  • 我们对每个属性使用类型注释。虽然这不会强制类型验证,但是如果您使用类似于 mypy 的类型检查器,它会帮助您的文本编辑器提供更好的林挺。如果你不尊重类型,你的代码仍然可以工作,但是你的代码编辑器会发出不一致的信号。

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

类型注释有助于检测潜在的错误—图片由作者提供

  • dataclasses 不仅仅允许您编写更紧凑的代码。dataclass decorator 实际上是一个自动添加其他方法的代码生成器。如果我们使用inspect模块来检查哪些方法被添加到了Person类中,我们可以看到__init____eq____repr__方法:这些方法负责设置属性值、测试相等性并以良好的字符串格式表示对象。

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

作者截图

如果我们允许Person类支持顺序(参见关于比较的技巧 9),我们也会有这些方法。

  • __ge__:大于或等于
  • __gt__:大于
  • __le__:低于或等于
  • __lt__:低于

2 —支持默认值

您可以在保留注释的同时为每个属性添加默认值。

👉请记住,没有默认值的字段不能出现在有默认值的字段之后。例如,下面的代码不起作用:

3-对象的自定义表示

由于 dataclasses 已经添加了__repr__方法,当实例被打印到屏幕上时,它们有了一个很好的、人类可读的表示。

这使得调试更加容易。

这种表示可以被覆盖以实现您想要的任何定制消息。

4-轻松转换为元组或字典

实例可以很容易地序列化成字典或元组。当您的代码与需要这些格式的其他程序交互时,这非常有用。

5-冻结实例/不可变对象

使用 dataclasses,您可以创建只读对象。您所要做的就是在@dataclass装饰器内将frozen参数设置为True

这样做时,一旦对象被实例化,就可以防止任何人修改属性值。

如果您试图将冻结对象的属性设置为新值,将会出现一个FrozenInstanceError错误。

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

作者截图

6 —不需要编写比较方法

当您使用标准 Python 语法定义一个类并测试具有相同属性值的两个实例之间的相等性时,您会得到以下结果:

这两个对象不相等,这很正常,因为Person类实际上没有实现测试相等的方法。为了增加平等性,你必须自己实现__eq__方法。这可能看起来像这样:

该方法首先检查两个对象是同一个类的实例,然后测试属性元组之间的相等性。

现在,如果您决定向您的类添加新属性,您必须再次更新__eq__方法。如果使用的话,__ge____gt____le____lt__也是如此。

这看起来像是不必要的代码输入,对吗?幸运的是,dataclasses 消除了这种困扰。

7-使用字段函数的自定义属性行为

在某些情况下,您可能需要创建一个仅在内部定义的属性,而不是在类被实例化时定义。当属性的值依赖于先前设置的属性时,可能会出现这种情况。

在这里,您可以使用 dataclasses 中的字段函数。

通过使用这个函数并将其initrepr参数设置为False来创建一个名为full_name的新字段,我们仍然可以实例化Person类,而无需设置full_name属性。

该属性在实例中尚不存在。如果我们试图访问它,就会抛出 AttributeError。

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

我们如何设置full_name的值,并且仍然将它保留在类的构造函数之外?为此,我们必须使用__post_init__方法。

_ _ post _ init _ _ 挂钩

dataclasses 有一个特殊的方法叫做__post_init__

顾名思义,这个方法是在调用了__init__方法之后立即调用的。

回到前面的例子,我们可以看到如何调用这个方法来初始化一个依赖于先前设置的属性的内部属性。

请注意,field函数中的repr参数已被设置为True,以使其在打印对象时可见。在前面的例子中,我们不能将这个参数设置为True,因为属性full_name还没有被创建。

9-比较对象并排序

在处理包含数据的对象时,一个有用的特性是能够对它们进行比较,并按照您想要的任何顺序对它们进行排序。

默认情况下,dataclasses 实现了__eq__。为了允许其他类型的比较(__lt__(小于)、__le__(小于或等于)、__gt__(大于)和__ge__(大于或等于),我们必须在@dataclass装饰器中将order参数设置为True

**@dataclasses(order=True)**

实现这些比较方法的方式是获取每个定义的字段,并按照定义的顺序进行比较,直到出现不相等的值。

让我们回到Person类。假设我们想要基于age属性比较这个类的实例(这是有意义的,对吗?).

为此,我们必须添加一个字段,我们称之为sort_index,并将其值设置为age属性的值。

我们这样做的方法是调用我们在前面的例子中看到的__post_init__方法。

现在来自Person a 类的实例可以根据age属性进行排序。

让我们结束它

Dataclasses 提供了许多特性,允许您轻松地使用充当数据容器的类。

特别是,本模块有助于:

  • 编写更少的样板代码
  • 以可读的格式表示对象
  • 实现自定义排序和比较
  • 快速访问属性并检查它们
  • 使用 post_init 等特殊方法来执行依赖于其他属性的属性初始化
  • 定义内部字段…

资源:

在学习 dataclasses 的过程中,我查阅了许多资源(博客帖子、Youtube 视频、PEP、官方 python 文档)
下面是我发现的最有趣的帖子和视频的精选列表。

感谢阅读🙏

如果你已经做到这一步,我真的很感谢你的时间。

我希望我已经阐明了使数据类变得伟大的不同特性,并且我已经说服您开始使用它。

如果你仍然不相信,请告诉我你使用的替代方案。我真的很想听听他们的故事。

今天就这些了。直到下次👋

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

照片由卡斯滕·怀恩吉尔特Unsplash 上拍摄

新到中?您可以每月订阅 5 美元,并解锁无限的文章— 单击此处。

帮助我在两周内解决所有 HackerRank SQL 挑战的 9 个技巧

原文:https://towardsdatascience.com/9-tips-that-helped-me-clear-all-hackerrank-sql-challenges-in-2-weeks-479eb0084862?source=collection_archive---------2-----------------------

这也将有助于您的 SQL 代码挑战之旅

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

作者照片

目前工作中的项目需要更多的 SQL 技能,所以我花时间使用 HackerRank 编码挑战平台来复习我的 SQL 知识。我花了两周多一点的时间(断断续续地工作、锻炼、带孩子去日间学校等等。)来完成网站上的所有 58 个 SQL 挑战,我从这个过程中获得了一些深刻的见解(并且从中获得了相当多的乐趣!).这篇文章可以被任何想进入数据科学世界或使用像 HackerRankLeetCode 这样的编码网站为你的下一次 SQL 面试做准备的人阅读,即使你之前没有任何 SQL 知识。我确实放了一些代码给你们看一些简单的例子。大多数技巧都是关于充分利用这些 SQL 挑战,以便您可以从中获得最大收益,而不是教您如何解决这些问题。所以,如果你不懂 SQL 或编码,也不用担心。请坐下,放松,我们开始吧。

动机

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

Sylvester Sabo 在 Unsplash 上拍摄的照片

SQL 很无聊,因为它没有巧妙的算法或复杂的数据结构。没什么好吹嘘的。它需要更严格的计划和一步一步的执行来缩小你的表格和最终结果之间的差距。然而,这对每个数据分析/数据科学专业人员来说都是必不可少的。这就是我们获取黄金 mine🪙(数据)的方式。今天,人们使用更强大的语言/模块或工具(如 Python/Pandas 或 Tableau)进行大部分数据探索和操作。然而,我们仍然离不开 SQL,因为我们需要首先从那些“尘封”的关系数据库中获取数据。

当然,当你在像 HackerRankLeetCode 这样的网站上处理具有挑战性的编码问题时,SQL 可以不那么无聊。通过正确的方法,每个具有基本 SQL 知识的人都可以从 SQL 编码挑战中获得乐趣,并在此过程中提升他们的 SQL 技能。这就是我将在接下来的会议中讨论的内容。

技巧 1:首先获得一些基本的 SQL 知识

显然,您需要有一些基本的 SQL 知识来开始这些挑战,尽管在这个过程中您会学到更多。学习基本的 SQL 是相对容易的,因为我们有大量的在线资源来帮助你。我使用了两个好的来源:

模式:数据分析的 SQL 教程 :非常有节奏,从基础到高级主题。它还提供了一个在线 SQL 环境,您可以使用教程中已经使用的数据库进行实时尝试——无需求助于 sqlfiddle 等。

SQLZoo :在我看来,比较新的学习者友好的。从最简单的子句(如 SELECT)到更复杂的连接,它会一直帮助您。如果你从来没有学过 SQL,在这里你会感觉更舒服。脸书招聘人员也推荐它。

一旦您觉得已经掌握了大多数命令的窍门,您就可以应对这些挑战了。没有必要过度学习你的基础知识。做所有这些挑战是一个很好的方式来实践你所学的,并在此过程中学习新的技巧。

技巧 2:仔细观察你的数据

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

照片由米卡·鲍梅斯特Unsplash 上拍摄

查看您的数据并沿途做笔记是解决问题的一半。更好的是,在头脑中想象你的数据,或者使用白板(物理的或数字的)来帮助把查询放在一起。我们人类在视觉上思考时效率更高。所以离开白板,画出你的表格,放入一些样本数据,也许画线来显示关系。有些挑战相当复杂,你必须把所有的部分放在一个大的画面中,无论是在白板上还是在你的脑海中,以找到出路。在白板上做更容易(除非你是尼古拉·特斯拉,那么你就可以简单地用你的大脑解决问题)。🤔

另一个技巧是充分利用许多小而无用的实用查询来熟悉数据。查询不会直接为最终结果构建数据,而是向您展示数据的外观,揭示有价值的见解,并为您的想法提供即时反馈。您可以从:SELECT * FROM table LIMIT 10;开始,看看您的表是什么样子,然后尝试在不同的列上聚合,看看您是否可以获得一些见解。

SELECT *, COUNT(*) FROM table GROUP BY column;

也许可以更好地组织数据,并把它们放在另一个中间表( CTE )中以备后用。

WITH temp_table as ( SELECT xxx…)
SELECT * FROM temp_table

上面的代码片段是我所说的“扔掉的”实用程序查询的简单例子。显然,您可以做得更多,这取决于您正在解决什么问题。这种解决问题的方式也在真实数据科学家的工作中广泛使用,并有一个名字:探索性数据分析。为什么不现在就开始做呢?

提示 3:理解问题是解决问题的一半

我不记得有多少次我被卡住了,想知道为什么我完美的代码行不通,或者为什么问题就是无法解决,然后发现我误读了问题本身😜。这很愚蠢,但是当你急于在短时间内解决所有的挑战时(比如当你在做认证测试或面试时),你会惊讶地发现自己是多么容易上当。

所以看题的时候要慢。不要跳过看似次要的语句。一个设计良好的挑战通常会在明文中隐藏重要的线索,仔细阅读问题就会发现它们。对模式、表关系以及问题的内容有一个明确的理解。你在这里度过的时间将会因为避免可怕的愚蠢的错误而得到巨大的补偿。

有时候慢就是快。

技巧 4:在编写代码之前制定一个计划

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

照片由布雷特·乔丹Unsplash 上拍摄

一旦你掌握了基本的 SQL 技能,清楚地理解了问题,并且知道了你的数据,现在是时候开始你的挑战了,首先制定一个计划。我怎么强调这有多重要都不为过。如果你只记得这篇文章中的一个提示,记住这个,制定一个计划。这是因为 SQL 挑战的本质是复杂的数据操作,通常需要多个聚合/抽象层来解决。通过对事物进行规划,在抽象的特定层面上进行思考,使认知成为可能,并防止我们钻得太深而无法回忆起全局。

我通常使用的思维方式是这样大声思考:问题是要求数据点 A 和 B,我可以通过聚合这 3 列来获得 A,通过使用窗口函数来打印出 c 列的有序列表来获得 B,好的,对于 A,我们需要从头开始创建列,我将使用内部连接来将它们放在一起。对于 B,窗口函数需要按 D 列划分,按 E 列排序,…

你看,我从顶层开始,逐步向下,一直到我选择的具体条款。把它说出来可以让我自己听到,加强我对问题和计划的记忆,从而帮助我思考。另一个好处是:在实际的 SQL 面试中,招聘人员通常希望你大声思考,这样他们会更好地了解你的思维过程。大多数时候,展示解决问题时的思维过程和解决问题一样重要,甚至更重要。如果你在所有的挑战中练习这一点,你会变得非常舒服(甚至有点兴奋)。大声说话会让你感觉更自信,让面试官看起来更自信。

技巧 5:不要为偷看讨论区而感到羞耻

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

照片由迪米特里·拉图什尼Unsplash 拍摄

在学习的时候偷看答案没什么好丢人的。你的目标是练习你的技能,而不是试图通过认证考试。有时候你会发现自己在一个挑战上陷得太久了。不要花费过多的时间去解决它。相反,使用 15 分钟规则:

“用 15 分钟的时间,尽你所能解决问题。但是,如果 15 分钟后没有答案,你必须问别人。”

这里应用 15 分钟规则的一个原因是你还在学习。有时,挑战需要使用一些你还不知道的技巧或条款。就像人们说的:你不知道你不知道的。在这上面花更多的时间也无济于事。另一个原因是,解决问题有时需要你退后一步,再次看到更大的画面,并弄清楚你是否陷入困境,需要走出去并改变路线。

培养你自由切换抽象层次的能力将对你的编码/数据分析职业生涯有很大的帮助。

当你从讨论板上得到提示并完成挑战后,停下来想一想为什么你会错过它?你的知识中有没有缺失的部分?你的思维/方法的盲点?再说一遍,慢慢来。你在学习。沉思时间是你将从这些挑战中学到最多的时候,通过找出你知识中的弱点并相应地改进它。

提示 6:选择有助于你实现目标的挑战

大多数算法/数据结构编码挑战往往有点“棘手”,这是理所当然的。然而,对于 SQL 来说,现实生活中要解决的问题更多的是简化复杂的关系,而不是想出数学问题的巧妙解决方案。总的来说,我发现 HackerRank 的 SQL 挑战大多遵循现实世界的挑战。然而,偶尔你还是会遇到在现实生活中很难发现的问题,比如著名的挑战打印素数。感觉就像有人把 Python 编码挑战放到 SQL 表单中,强迫你去解决。我在这里可能有偏见,但忽略这些挑战。还不如用 Python 来做。除了智能的乐趣之外,将 SQL 用于它没有被设计的用途不会有任何帮助。我们大多数人都不会为此而访问 HackerRank 或 LeetCode 这样的网站,不是吗?

技巧 7:停留一会儿,思考一下

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

照片由罗布·施莱克希斯Unsplash 上拍摄

一旦你破解了挑战,抵制诱惑,点击多汁的“**下一个挑战”**按钮!我强烈建议你反思自己解决问题的过程,问自己一些高质量的问题:

我用了什么子句?它们为什么会起作用?为什么其中一些不起作用?有更好的选择吗?我是如何解决这个问题的?我如何把它分解成更小的子问题?我汇总了哪些中间数据来得到最终结果?

我知道,有时在应对复杂挑战的兴奋中,很难停下来思考这些棘手的问题,这似乎会让我们慢下来,但相信我,这是更快的学习方法。

技巧 8:不要让艰难的挑战阻碍你参加认证考试

我得说一些“硬”挑战可能相当棘手。在这种情况下,您需要想出一些聪明的方法将所需的数据放在一起。我曾经使用 8 个 cte、两个窗口函数和多个连接来获得我想要的结果。但是认证测试更合理,更接近真实世界的问题。我的经验是,与提出新颖的旋转技巧相比,认证测试需要更仔细的问题阅读、模式剖析,甚至白板演示。所以,即使你遇到了一些挑战,也不要让它们让你气馁!当你觉得准备好了,参加认证考试,你仍然可以轻松通过!

技巧 9:分而治之。逐步解决这个问题

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

兰斯·阿斯佩在 Unsplash 上拍摄的照片

现在来看编码部分。我会在下面列出我认为对我有帮助的内容:

  • 理解子查询和 CTE( 通用表表达式)的一个简单方法是将其视为其他编程语言中的一个函数。如果你不止在一个地方使用它,为什么不把它放到一个函数里呢?而子查询就像一个 lambda 函数,您可以在运行时编写它,并在使用后将其丢弃。它们有助于使您的代码可读性更强,概念上更容易理解,这对解决复杂的 SQL 挑战有很大的价值。
  • 聚合是将原始数据提炼为更有意义、更接近问题所问内容的主要方式。 GROUP BY 有助于使用 SUM()、COUNT()、MIN/MAX()或 AVG()压缩数据,而窗口函数在项目级别执行聚合功能(最适合处理“前 N 名”类问题)。有时你需要许多级别/步骤的聚合才能到达你想要的地方。再次,查看您的数据和挑战问题,并仔细设计您的’聚合图
  • JOIN vs. LEFT JOIN:老实说,这两个是你需要的主要连接。当您希望只返回两个表中都有对的行时,请使用 JOIN,当您需要“左”表中的所有行时,请使用 LEFT JOIN,无论它们在“右”表中是否有对。
  • 编写查询的顺序:最自然的方式是编写关于如何执行的查询:FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY > LIMIT。忍住从 SELECT 开始的冲动。像机器一样思考。
  • 从两端工作,你的桌子,问题问什么来解决问题。从数据/表格的角度:问问你自己,它可以用表格构建什么?什么样的聚合可以进一步提取数据?从最终结果方面:需要哪些数据?什么样的桌子有助于解决问题?想象一下,一些中级表可以帮助弥合差距。尽量两边都做,中间点会合。同样,在不同的抽象层次思考很有帮助。

奖金:

如果你破解了所有的挑战,就在 HackerRank 上进行你的 SQL 认证测试(初级和中级**)。你能做到的!**

结论

SQL 挑战与常规的算法/数据结构挑战略有不同。它要求你以一种更有组织的方式思考,构建你的代码,并在不同的抽象层次之间切换。掌握这些“慢”技能,你可能会发现自己比你想象的更快地通过挑战,最重要的是,它会让你为关键的 SQL 面试做好充分准备!

我希望你觉得这篇文章读起来很有趣,并从中学习到一些东西。如果你想更多地了解我对数据科学的思考、实践和写作,可以考虑报名成为 Medium 会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金。

https://lymenlee.medium.com/membership

9 个未知的 Python 库会让你大吃一惊

原文:https://towardsdatascience.com/9-unexplored-python-libraries-that-will-amaze-you-d0803a4516ba?source=collection_archive---------4-----------------------

Python 库让您的生活变得更加轻松

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

约书亚·索蒂诺在 Unsplash 上拍摄的照片

Python 编程充满了机会。它简单明了,有很多很酷的库和函数,可以让任务变得更容易。每个 Python 开发者都必须使用流行的库,比如 NumPy、pandas、date time、matplotlib、Tkinter 等等。然而,有一些鲜为人知的库可以让您的开发人员生活变得更加轻松,并改善您的编码体验。

在本文中,我将讨论九个您可能感兴趣的 Python 库。其中一些库甚至可以用来替代一些标准的 Python 库。所以他们绝对是要小心的!

1。钟摆

Pendulum 是一个很棒的 Python 库,可以处理日期和时间。这个库在涉及时区的情况下非常有用。关于这个库最好的部分是它继承了 Python DateTime 库,所以它也可以使用这个库。

我们可以使用下面一行代码来安装这个库。

pip install pendulum

想见识一下摆库的魔力吗?查看下面一行代码。

import pendulumpast = pendulum.now().subtract(minutes=2)
past.diff_for_humans()

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

使用钟摆模块的好处是用户友好。你可以得到令人兴奋的结果。

2。 神话般的

大多数运行在命令行上的 Python 应用程序看起来乏味无趣。神话般的可以用来给他们一个很好的改造,通过添加图像,彩色文本到控制台。

要安装 fantastic,我们需要运行下面的 python 命令。

pip install fabulous

要在终端上打印彩色文本,我们可以使用

from fabulous.color import bold, magenta, highlight_redprint(bold(magenta('''hello worldthis is some new lineand here is the last line. :)''')))

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

这个库支持 Python 2.6、2.7、3.3、3.4、3.5 和 PyPy。也可以在 Google Colab 上测试一下。

**3。**py webview

Pywebview 是一个 python 库,用于以 GUI 形式显示 HTML、CSS 和 JavaScript 内容。这意味着使用这个库,您可以将您的网站或网页显示为桌面应用程序。

使用以下命令安装 pywebview。

pip install pywebview

要启动一个显示给定网站的窗口,我们需要运行

import webviewwebview.create_window(“Test window”, “target domain name”, width=400, height=200, fullscreen=False, resizable= true)webview.start()

将为 webview 启动一个新窗口。

敬请期待 同更多类似 精彩 文章上 Python &数据科学 —做会员考虑使用我的推荐链接:【https://pranjalai.medium.com/membership

4。 海博

Seaborn 是一个用于数据科学项目数据可视化的库。它建立在标准可视化库 Matplotlib 的基础上,可以使情节更加丰富多彩,更具吸引力

要安装它,我们可以运行以下命令。

pip install seaborn

要使用数据集绘制线图,我们可以使用:

import seaborn as snsdataset=sns.load_dataset(“dataset name”)sns.lineplot(x=”x-axis name”, y=”y-axis name”, data = dataset)

5。 Psutil

Psutil 是一个有用的跨平台 Python 库电话,可以获取与系统相关的信息。人们可以收集系统中正在进行的进程、CPU 利用率、RAM 使用等信息。

使用下面的命令安装 psutil。

pip install psutil

要计算系统在 3 秒间隔内的 CPU 利用率,我们可以运行:

import psutilpsutil.cpu_percent(interval=3)

6。 PyGame

顾名思义就是制作游戏的 Python 库。它包含许多图形和声音库,开发者可以用它们来制作游戏。此外,复杂的游戏逻辑和物理也可以使用 PyGame 的内置模块来实现。

要安装 PyGame,我们需要使用:

pip install pygame

7。 Pyforest

在从事数据科学项目时,我们需要导入许多库,如 NumPy、Pandas、Matplotlib 等。Pyforest 库帮助我们一起导入所有重要的库

我们只需运行以下命令。

pip install pyforest

你可以访问所有的库,比如 NumPy,Pandas,Matplotlib,seaborn 等等。Pyforest 还安装了其他一些重要的库,如 os、tqdm、re 等。

8。 摩丁

Modin 是一个库,它通过利用机器的所有内核而不是单个内核来改进你的熊猫工作流程。这尤其有助于提高处理大型数据集时的性能。

您可以使用这一行代码安装这个库。

pip install modin

现在,您可以像这样安装它——这样您就不需要对代码做进一步的修改。

**import** **modin.pandas** **as** **pd**

这就是你需要做的。不需要对代码做进一步的修改。

9。 熊猫 _ 剖析

这是一个 Python 库,可用于获取数据集、其属性以及属性间相关性的概述。

可以使用下面显示的命令安装它。

pip install pandas-profiling

要获得数据框的分析并将分析结果保存为 web 格式,我们可以使用

from pandas_profiling import ProfileReportreport = ProfileReport(dataframe)report.to_file(output_file=’output.html’)

您可以进一步将此报告保存为 HTML 或 pdf 文件,以供进一步分析。

如果你正在寻找更多 python 的超酷功能,那么——这里有一本关于 python 编程的书,我肯定会向所有初学者推荐

结论

这些是一些鲜为人知的库,可以用来改善您的编码体验,并取代现有的标准 Python 库。您可以在文档页面中获得关于这些库的详细教程,因为大多数库都是开源的。

作为开发人员,这些库肯定会让您的生活更加轻松。

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

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

在你走之前……

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

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

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

你可能没听说过的 9 种有用的熊猫方法

原文:https://towardsdatascience.com/9-useful-pandas-methods-you-probably-have-not-heard-about-28ff6c0bceee?source=collection_archive---------9-----------------------

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

Zoe Nicolaou 在 Unsplash 上拍摄的照片

它们可以让你的日常工作更容易、更快捷。

在本文中,我想快速展示一些有用的pandas方法/函数,它们在您的日常工作中会派上用场。为了管理期望,这不是一篇展示pandas基本功能的文章,也没有特别的方法主题。事不宜迟,我们开始吧!

1.哈斯南斯

检查一个系列/数据帧是否包含缺失值的方法有很多,包括专用库,如missingno。检查数据帧的列是否包含缺失值的简单方法如下:

df["column"].isna().any()

或者,我们可以使用 pd 的hasnans方法。略少打字的系列:

df["column"].hasnans

一个缺点是这种方法不适用于数据帧,尽管我们可以很容易地将它与列表理解结合使用:

[df[col].hasnans *for* col *in* df.columns]

使用这种方法,我们自然会丢失列名。所以我认为hasnans的主要用例是对单个列进行快速检查。

2.改变

transform方法用于对整个数据帧进行转换,或者对选定的列进行不同的转换。然而,使这个方法脱颖而出的是它返回一个与输入形状相同的对象。

这就是为什么在处理聚合时transform可以节省大量时间。通常,如果我们想要在原始数据帧中有一些聚合值(想想每组的总和或平均值),我们可以使用groupby创建一个新的、更小的数据帧,然后将其合并回原始数据帧。这有点耗时,并且会产生不必要的中间对象。

有了transform,我们可以一气呵成!让我们创建一个包含一些商店 id 及其多日销售额的数据框架(为了简单起见,我们跳过日期)。

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

作者图片

使用下面的代码片段,我们可以很容易地将每个商店的销售额相加:

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

作者图片

transform绝对简化了流程。transform的一个更高级的用例可以用于聚合过滤。例如,我们希望提取关于销售超过 75 件商品的商店的行。并且理想情况下不会在输出数据帧中创建新的列。我们可以这样做:

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

作者图片

3.merge_asof

原则上,这个函数类似于一个标准的左连接,但是,我们匹配最近的键而不是相等的键。这将通过一个例子变得更加清楚。

我们还需要知道使用merge_asof有 3 个连接方向(定义改编自文档):

  • backward —对于左侧数据帧中的每一行,我们选择右侧数据帧中最后一行,其on键小于或等于左侧键。这是默认的。
  • forward —对于左侧数据帧中的每一行,我们选择右侧数据帧中的第一行,其on键大于或等于左侧键。
  • nearest —对于左侧数据帧中的每一行,我们搜索选择右侧数据帧中其on键在绝对距离上最接近左侧键的行。

另一件要考虑的事情是两个数据帧都必须按键排序。

我不会尝试重新发明轮子,我将使用文档中提供的例子。这里,我们有两个数据框架,一个包含交易信息,另一个包含报价。两者都包含详细的时间戳(包括毫秒)。

然后,我们在报价时间和交易时间之间的2ms内合并两个数据帧:

以下数据帧的结果是什么:

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

作者图片

通过从输出帧到两个数据帧的几个例子,最容易理解合并的逻辑。

4.插入

这是一个简单而方便的方法。我们可以用它在数据帧中的特定位置插入一列。最常见的用例是当我们想要添加一个包含额外信息的列,以便更容易地分析输出时。为了我们和利益相关者的方便,这些信息作为第一栏将是最有用的。我们可以通过下面的代码片段做到这一点:

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

作者图片

5.激增

当我们想要将一个数据帧中的列表展开成多行时,explode 非常有用。想象一下下面的情况——我们有两个 id,并且在列表中为每个 id 存储了多个值。我们希望每个 ID-值组合都有一行。

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

作者图片

df.explode("values", *ignore_index*=True)

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

作者图片

6.潜艇用热中子反应堆(submarine thermal reactor 的缩写)

当处理包含字符串的列时,我们可以使用str,它允许我们使用各种方便的方法,这些方法可以以矢量化的方式应用于整个列。例如,我们可以很容易地将包含完整地址的列拆分成单独的部分。首先,让我们创建数据框架。

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

作者图片

然后,我们可以使用str.split方法来创建新的列。

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

作者图片

另一种可能性是使用str.replace方法来修改字符串。

7.阅读 _ 剪贴板

当您经常使用 Excel/Google 工作表或接收此类文件中的数据时,这种方法尤其有用。使用 read_clipboard,我们可以使用计算机的剪贴板轻松地将数据从源表加载到pandas。这样,我们可以绕过将文件保存到.csv.xls的需要。自然,这对于一些小的、特别的分析非常有用。

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

作者图片

上面你可以看到 Google sheets 中一个简单表格的例子。我们选择范围,按下cmd+c(或者对于 Windows 按下control+c,然后使用下面的代码片段轻松地将数据加载到 Python 中:

pd.read_clipboard()

什么会返回以下内容:

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

作者图片

8.evaluate 评价

eval方法使用字符串表达式来有效地计算数据帧上的操作。根据文件:

支持以下算术运算:+-*/**%//(仅限 python 引擎)以及以下布尔运算:| (or)、& (and)、和~ (not)。此外,'pandas'解析器允许使用与相应的位操作符具有相同语义的[and](https://docs.python.org/3/reference/expressions.html#and)[or](https://docs.python.org/3/reference/expressions.html#or)[not](https://docs.python.org/3/reference/expressions.html#not)

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

作者图片

9.挤压

还记得当您想从一个数据帧中提取一个标量值,经过一些过滤后,您使用.values[0]来访问最终输出的情况吗?然后你可能会想,一定有更好的方法来做这件事。确实有——squeeze方法。

首先,让我们定义一个数据帧:

然后,我们可以尝试访问数据帧中的特定值,例如:

df.loc[df["a"] == 3, "b"]

输出如下所示:

2    6.0
Name: b, dtype: float64

对于一个简单的print来说,这是可以的,但是当我们想把这个值赋给一个变量或者甚至把它放在另一个数据帧中时,这可能会导致一些问题。

获取标量值的优雅解决方案是在末尾添加squeeze方法:

df.loc[df["a"] == 3, "b"].squeeze()

回报:

6.0

在你走之前

你可以在我的 GitHub 上找到本文使用的代码。此外,欢迎任何建设性的反馈。我将非常高兴听到一些pandas功能,使您的工作更容易!你可以在推特或评论中联系我。

喜欢这篇文章吗?成为一个媒介成员,通过无限制的阅读继续学习。如果你使用这个链接成为会员,你将支持我,不需要你额外付费。提前感谢,再见!

您可能还会对以下内容感兴趣:

[## 使用 datapane 将您的交互式可视化嵌入到中型帖子中

towardsdatascience.com](/embed-your-interactive-visualizations-in-medium-posts-using-datapane-9613314f048d)

从 10000 英尺的高度看人工智能

原文:https://towardsdatascience.com/a-10-000-foot-view-of-ai-b679de6fa526?source=collection_archive---------20-----------------------

播客

扬尼克·基尔彻谈人工智能在不久的将来的趋势、挑战和机遇

苹果 | 谷歌 | SPOTIFY | 其他

编者按:TDS 播客由 Jeremie Harris 主持,他是数据科学导师初创公司 SharpestMinds 的联合创始人。每周,Jeremie 都会与该领域前沿的研究人员和商业领袖聊天,以解开围绕数据科学、机器学习和人工智能的最紧迫问题。

曾经有一段时间,人工智能研究人员可以期望在 arXiv 上阅读该领域发表的每一篇新论文,但今天,情况不再如此。最近人工智能研究活动的爆炸式增长已经把跟上新发展变成了一项全职工作。

幸运的是,像 YouTuber、ML PhD 和太阳镜爱好者 Yannic Kilcher 这样的人把将 ML 新闻和论文提炼为像你我这样的凡人可以消化的形式作为他们的业务。我向任何对 ML 研究感兴趣的 TDS 播客听众强烈推荐他的频道——这是一个非常棒的资源,实际上我最终设法理解注意力的方式就是你需要的全部文件。

Yannic 和我一起谈论他从多年的跟踪、报道和人工智能研究中学到的东西,包括他预计将在未来几年塑造人工智能历史进程的趋势、挑战和机遇。

以下是我在对话中最喜欢的一些观点:

  • Yannic 前阵子放弃了阅读他能找到的每一篇有趣的 arXiv 论文。今天,他引用 arXiv、Reddit 和 Twitter 的组合作为他获取最新消息的主要来源。
  • 众所周知,媒体对人工智能的报道可能会被夸大(例如, 索菲亚,第一个拥有公民身份的机器人,现在想要一个机器人宝宝 ),一维且消极倾斜( Flasehoods 更有可能拥有大型语言模型 )。但扬尼克强调了几个他特别怀疑的具体比喻和主题。特别是,他指出“人工智能可能会产生令人印象深刻的输出,但它们并不真正理解任何东西”(好像人类的大脑和人类的理解与现代人工智能运行的统计推理过程根本不同)。他还夸大了对人工智能偏见的担忧,以及关于人工智能不安全的耸人听闻的头条新闻,因为它们在特定场景下产生了令人讨厌的输出( 使用 OpenAI 的 GPT-3 的医疗聊天机器人告诉一个假病人杀死自己 )。
  • 尽管过度强调人工智能伦理,Yannic 仍然同意人工智能研究中有重要的伦理问题需要解决。这些问题包括对人工智能可能在多大程度上实现技术官僚威权主义的担忧,人类在由算法运行的世界中的角色,以及算法无法“脱离剧本”并适应特殊情况或超出分布的问题。虽然他确实认为人工智能对齐是一个值得担心的问题,但他认为人工智能的恶意和专制应用在下一代或两代人身上更令人担忧。
  • 人工智能领域的许多人不愿意将人工智能的行为拟人化。这可能是一件好事:将模型视为统计推理机而非“思维机器”确实有助于对模型行为进行更冷静的分析。但它也有不利的一面——有时将人工智能视为“理解”概念,或以更像人类的方式处理信息是有用的(此外,如果人类的思维真的只是大脑中神经处理的产物,那么没有理由想象机器最终不会像我们一样“理解”和“思考”,如果它们在某些情况下还没有做到这一点)。扬尼克认为,人工智能研究人员很可能倾向于低估拟人推理的价值,将其作为一种为人工智能系统的行为建立直觉的方式。

你可以点击这里在 Twitter 上关注扬尼克,或者点击这里查看他的 YouTube 频道。

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

章节:

  • 0:00 介绍
  • 1:20 扬尼克的 ML 之路
  • 7:25 选择 ML 新闻
  • 11:45 艾伦理→政治话语
  • 17:30 人工智能校准
  • 24:15 恶意使用
  • 32:10 对角色的影响
  • 39:50 引入人类思维
  • 46:45 数学与大数
  • 51:05 概括的标准
  • 58:05 人工智能的未来
  • 1:02:58 总结

2021 年 NLP 回顾展

原文:https://towardsdatascience.com/a-2021-nlp-retrospective-b6f51e60026a?source=collection_archive---------21-----------------------

是时候回顾一下自然语言处理领域今年的一些亮点了

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

图片由莲蓬头;根据知识共享署名 3.0 获得许可

在过去的一年中,自然语言处理(NLP)领域发生了很多事情,我想花一些时间来反思一下我个人的一些亮点。

TL;速度三角形定位法(dead reckoning)

对于那些赶时间的人:

  • 如果你只读了 2021 年 NLP 上的一篇文章,那就让它成为《纽约客》上的聊天机器人问题(T4)
  • 如果你只读了今年的一篇论文,我强烈推荐关于随机鹦鹉的危险:语言模型会不会太大?
  • 如果你只想花时间在一个课程上,以达到最先进的 NLP 的速度,请查看拥抱脸的课程(免费!)
  • 如果你在 NLP 上只看了一个视频,我发现谷歌的 LaMDA 演示给人印象非常深刻

一月

让我们从一个有趣的问题开始:果蝇能学习单词嵌入吗?本文研究生物学和神经网络之间的关系。虽然从生物学中获得了高层次的灵感,但当前一代的深度学习方法不一定符合生物学现实。这提出了一个问题,即生物系统是否可以进一步为新网络架构和学习算法的发展提供信息,从而导致机器学习任务的竞争性能或提供对智能行为的更多见解。

为了做到这一点,研究人员使用了果蝇的模拟大脑,这是神经科学中研究得最好的网络之一。事实上,他们能够显示,令人惊讶的是,这个网络确实可以学习单词和它们的上下文之间的相关性,并产生高质量的单词嵌入。

二月

跟踪自然语言生成(NLG)的进展是很棘手的,因为就其本质而言,NLG 任务没有固定的正确与错误的定义。为了克服这一挑战并跟踪 NLG 模型的进展,一个涉及来自 44 个机构的 55 名研究人员的全球项目提出了 GEM (生成、评估和度量),这是一个以评估为重点的 NLG 生活基准环境。

GEM 项目的最终目标是实现对数据和模型的深入分析,而不是关注单个排行榜分数。通过测量跨越许多 NLG 任务和语言的 13 个数据集的 NLG 进度,希望 GEM 基准也可以为未来使用自动和人工度量评估生成的文本提供标准。

研究人员已经向 NLG 研究社区开放了该项目,资深成员将帮助新来者做出贡献。GEM 基准位于 gem-benchmark.com 的,更多信息也可以在拥抱脸的数据中心找到。

三月

声明:我为 AWS 工作,对下一个 100%有偏见,但我真的认为它很酷:)

拥抱脸和 AWS 的合作关系已经彻底改变了我的工作。我敢肯定,没有人阅读这个博客需要介绍拥抱脸。今年 3 月宣布的合作伙伴关系引入了新的拥抱脸深度学习容器(DLC),使得在亚马逊 SageMaker 中训练和部署拥抱脸变压器模型比以往任何时候都更容易。

这个惊人的 Github 库Philipp Schmid 开发,让你尝试所有的新特性,从分布式培训到模型部署&自动扩展。

四月

剑桥大学的化学系和物理系在四月份发表了一篇非同寻常的论文,其中描述了他们如何训练一种不同的语言模型。

研究人员使用序列嵌入,一种众所周知的 NLP 技术,将蛋白质序列转换成 200 维嵌入向量。如果你想知道,200 维确实被认为是如此复杂信息的低维表示!这项技术允许团队训练一个语言模型,该模型优于几种现有的机器学习方法,用于使用公开可用的数据集预测蛋白质液-液相分离(LLPS)。

现在,我不会假装我理解什么是 LLPSs,但是从我的理解来看,它们是理解蛋白质的分子语法和发现潜在错误的基础。这可能是癌症和神经退行性疾病(如阿尔茨海默氏症、帕金森氏症和亨廷顿氏症)研究取得突破的第一步。

五月

我很确定你曾经尝试过和你的智能家居助手进行一次适当的对话。我知道我有过,但从来没有持续过那么久。除了一两次交流之外,助理通常无法掌握谈话的内容,这种尝试通常以令人沮丧的*“我不确定我理解这个”*而告终。

在今年 5 月的谷歌 I/O 大会上,公司宣布了其在对话式人工智能领域的最新进展LaMDA (对话应用的语言模型)。这是一种会话式的语言模式,似乎能够进行更长时间的对话。他们与冥王星和纸飞机对话的演示给人留下了深刻的印象。值得称赞的还有他们披露的事实,即现在还为时尚早,并指出该模式的一些局限性。我真的希望谷歌能在某个时候发布一个版本来玩玩。

六月

如果你喜欢弱者挑战强者的故事,这本书可能适合你:

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

作者图片

这是 Connor Leahy 和 Leo Gao 之间的一次交流,启动了 EleutherAI ,这是一个由志愿者研究人员、工程师和开发人员组成的分散式基层集体,专注于人工智能对齐、扩展和开源人工智能研究。成立于 2020 年 7 月,他们的旗舰项目是 GPT-近地天体系列模型,旨在复制 OpenAI 开发的 GPT-3。他们的 Discord 服务器已经开放,欢迎贡献者。

六月,他们发布了最新的模型,GPT-J,它有 60 亿个参数,相比之下 GPT-3 有 1750 亿个参数。尽管规模小得多,但 GPT J 在编写代码等专业任务上胜过它的大兄弟。

我发现这种趋势非常令人鼓舞,并很兴奋地期待着 EleutherAI 的下一步。

七月

七月份《纽约客》发表了一篇关于语言模型偏见的文章。这在 NLP 社区中并不是一个新话题。然而,对于像《纽约客》这样的杂志来说,选择这样的主题凸显了现代 NLP 模型的重要性和关注点。这让我想起了 2020 年《T2 卫报》关于 GPT-3 的文章——这是主流媒体关注小众话题的时刻。

《纽约客》的这篇文章关注的是语言模型如何反映我们的语言,最终反映我们自己。尤其是这句话让我印象深刻:“我们正被迫面对作为技术问题的人类基本奥秘:我们对自己内心的黑暗知之甚少,我们对这种黑暗的控制又是多么微弱。”

八月

接下来的这个故事引起了《纽约客》文章的共鸣,因为在八月玛格丽特·米歇尔加入了拥抱脸。米切尔在 2021 年 2 月被解雇之前一直是谷歌的伦理人工智能研究员。她与人合著了一篇关于大型 NLP 模型相关成本和风险的论文(笔名为 Shmargaret Shmitchel ):

我们已经确定了与越来越大的 LMs 的热潮相关的各种各样的成本和风险,包括:环境成本(通常由那些没有受益于由此产生的技术的人承担);财务费用,这反过来又设置了进入壁垒,限制了谁能对这一研究领域作出贡献,以及哪些语言能从最先进的技术中受益;机会成本,因为研究人员将精力从需要较少资源的方向上转移;以及实质性伤害的风险,包括刻板印象、诋毁、极端主义意识形态的增加和错误逮捕,如果人类遇到看似连贯的 LM 输出,并认为它是对所说的话负责的某些人或组织的话。

我很高兴看到 Mitchell 加入了 Hugging Face,这是一家推动开源机器学习和繁荣社区的公司。如果你想更多地了解她在拥抱脸的工作,可以看看她的视频关于开发机器学习项目时要记住的价值观。

九月

说到开源 NLP,爆炸也经历了很棒的一年。这是最受欢迎的 NLP 图书馆之一 spaCy 背后的公司。9 月份,他们在首轮融资中以 1.2 亿美元的估值筹集了 600 万美元。

不得不承认,2021 年的 spaCy 我还没跟上。我主要专注于在变形金刚库上提升自己的技能。因此,我很惊讶地看到 spaCy 今年早些时候在 spaCy 3.0中发布的所有新功能。2022 年我一定会再次把目光投向 spaCy。

Explosion 不仅提供了一个最流行的 NLP 库,他们还创建了 Prodigy,一个现代注释工具。这很重要,因为创建更好的模型的一个潜在方法是首先创建更好的训练数据——这就是数据注释工具派上用场的地方。

看到一位女性( Ines Montani )成为一家人工智能公司的首席执行官是一个不错的转变:)

十月

十月,NLP 峰会 2021 召开。本次会议展示了 NLP 最佳实践、真实世界的案例研究、在实践中应用深度学习&迁移学习的挑战,以及您今天可以使用的最新开源库、模型&变形金刚。

许多 NLP 圈子里的知名演讲者在这次会议上发言,其中一些亮点是:

  • 为什么&如何关注 NLP 伦理?
  • 科学文献的极端概括
  • 利用人工智能实现经济复苏

你仍然可以在他们的网站上点播所有的讲座。

十一月

拥抱脸有相当一年,我不得不再次提到他们。11 月,该公司发布了他们课程的第二部分,帮助你快速入门最先进的 NLP 模型。本课程将带您踏上一段旅程,首先从高级管道 API 开始,让您通过两行代码利用 NLP 技术。然后,它逐渐深入到变形金刚的堆栈中——在你意识到之前,你已经从头开始创建了自己的因果语言模型。

第二部于 11 月推出,伴随着一系列讲座和会谈,你可以在这里找到。

十二月

非常合适的是,这个列表中的最后一项也提供了 NLP 领域未来的展望。12 月,Louisa Xu 在《福布斯》上发表了她关于自然语言的黄金时代的文章。

这是一篇很棒的文章,介绍了目前最有影响力的三家 NLP 公司。她的总结和展望非常到位,我让她自己来说:

每一家从语言中获取价值的公司都会从 NLP 中受益,NLP 是机器学习中最具变革潜力的分支。语言几乎是我们所有交往中的最小公分母,我们从语言中获取价值的方式在过去三年中发生了巨大的变化。NLP 的最新进展具有极大的潜力来提高业务绩效。它甚至有希望将信任和诚信带回我们的在线互动中。大型现任者是第一批跳上船的,但真正的希望在于下一波 NLP 应用和工具,它们将把围绕人工智能的宣传从意识形态转化为现实。

结论

所以,现在你知道了,这些是我个人在 NLP 的 2021 年的亮点。我希望你喜欢这个总结,如果能听到你在过去 12 个月里在 NLP 的个人亮点,那就太好了。请对这篇博文发表评论或直接联系。

关于如何在商用硬件上加速 NLP 模型推理的 3 分钟阅读。

原文:https://towardsdatascience.com/a-3-minute-read-on-how-to-accelerate-nlp-model-inferences-in-commodity-hardware-575a8075d424?source=collection_archive---------36-----------------------

罗盘导航地景加速推理

序幕

一种在使用串行和/或并行专用硬件的数据中心中加速服务器端模型推断被证明是简单的(理解为简单而不容易)。一段时间以来,数据中心一直在使用专门的硬件,即:图形处理单元(GPU)、现场可编程门阵列(FPGAs)和专用集成电路(例如谷歌 TPU) ,这要感谢云服务提供商,他们使这些硬件变得非常容易访问。现在,像 FPGA 这样的专用硬件甚至出现在智能手机这样的消费设备上(iPhones 上的FPGA),所以,手机上的 ASICs 不是想象中的事情。像东京的 LeapMind 这样的公司正在积极开发专用硬件,用于受约束和边缘设备的训练和加速推理。但使用专门的硬件来加速推理是一个非常狭窄的世界,并留下了巨大的空间。但幸运的是,已经有很多关于在没有任何专门硬件的情况下,即在商品硬件和 中加速推理的研究,这篇文章将作为一个指南针,帮助你浏览可用的选项。

最大的问题

如何在服务器端和客户端(胖客户端和受限/边缘设备)的商用硬件中加速模型推理?

但是为什么呢?

由于“推理预算”通常非常少,因此有几个原因可以加速商用硬件上的模型推理,尤其是在客户端。此外,由于延迟带宽的问题,并不是所有基于 ML 的解决方案都能提供服务器端推理的最佳用户体验。对于一些应用来说,数据 隐私是另一个挑战:消费者不希望数据像智能手机一样离开他们的设备。像 差分 隐私联合 学习 这样的创新确实有助于缓解担忧,但实现起来很复杂。因此,我们最好在更紧的推理预算内寻找一些操作选项。

基于自然语言处理模型的心理模型

在商品硬件中,加速推理是棘手的,因为它不是推理预算等式中的唯一变量。模型尺寸和我们可能权衡的精确度也是至关重要的。因此,这里有一些技术可以帮助 压缩模型(可选)和/或加速推理,而不会在准确性上做出巨大的妥协。

这篇文章的范围是分享关于可用选项的广泛观点,并给出一般性建议。所以在这篇文章中,你不会找到太多关于这些技术如何在内部工作的信息。我会写一篇后续。

可用选项

NLP 中的任何推理请求都有两部分:一是输入 标记化二是实际模型 预测调用。HuggingFace 通过将标记化的最新研究民主化,钉死了标记化部分。这里有一个 概要

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

商用硬件上的 NLP 推理—可用选项(图片由作者提供)

胖客户端/服务器端推断(例如 Outlook 自动响应)

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

商用硬件上胖客户端和服务器端推理的路径(图片由作者提供)

瘦客户端推理(例如基于浏览器)

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

瘦客户端路径,如基于浏览器的推理硬件(图片由作者提供)

受限/边缘设备推断(例如智能手机、物联网设备)

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

边缘或受约束设备推断的路径(图片由作者提供)

想法/评论?

参考文献:

  1. 【https://huggingface.co/blog/accelerated-inference
  2. https://towards data science . com/low-precision-inference-with-tensorrt-6 EB 3c da 0730 b
  3. https://en . Wikipedia . org/wiki/专用集成电路

对 PCA 的 3 分钟回顾:压缩和恢复

原文:https://towardsdatascience.com/a-3-minute-review-of-pca-compression-and-recovery-38bb510a8637?source=collection_archive---------44-----------------------

3 分钟回顾

PCA 最便捷的视觉笔记

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

照片由乔尼·克洛在 Unsplash 上拍摄

如今,数据科学家和 ML 工程师的知识深度通常通过他们对算法的数学和实现细节的反馈来判断。我不同意这种做法。现实是,没有人能记住每一个细节,这没关系。你不需要知道如何实现一个算法来应用它。即使你知道如何实现它,面对实际问题时,你仍然会错误地判断何时以及如何正确地使用它。

提取直觉以便正确应用是关键

我正在创建这个 3 分钟的算法回顾系列,重点放在直觉部分。通过一个简单的算法是什么、如何、为什么和何时的例子,你可以很快很容易地抓住要点。

在今天的文章中,让我们深入研究 PCA——最重要的降维算法。

PCA 做投影降维。

直观上,它只是从数据点到一个更低维的超平面画出正交线,找到着陆点。超平面的轴基于它们捕获的方差的最大化来选择。他们捕捉的差异越多,预测保留的信息就越多。通过这种轴选择方案,PCA 实现了最小的信息损失,并对数据进行了良好的压缩*。*

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

维基百科

最小的例子:从 4D 到 2D 的投影

让我们用sklearn和著名的 Iris 数据集来演示它是如何工作的。

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

作者图片

从代码中,我们看到有 150 个例子和 4 个特性列。很难直接可视化 4D 的数据,让我们使用sklearn.decomposition.PCA将它们投影到 2D。

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

作者图片

pc2是两个最高级的主成分——这里的两个行向量。它们在原始特征空间中,因此是 4 维的。

我们要投影到的 2D 平面由pc2中的这两个向量(主分量)构成。它们是平面的基向量。让我们称他们为uv。这架 2D 飞机生活在 4D 空间。从原始特征空间——4D 空间的角度来看,PCA 所做的是将原始 4D 数据点投影到这个 2D 平面上。

矩阵X_reduce的形状为(150,2),即约化 2D 空间中的 150 个例子。每一行是一个有两个坐标的向量。请记住,第一个数字对应于u上的系数,第二个数字对应于v上的系数。

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

作者图片

这样,原始(150,4)数据被缩减/压缩为(150,2)。

在 2D 可视化结果:

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

作者图片

从 2D 到 4D 的复苏

如果你只关心可视化,工作就完成了。但 PCA 作为一种压缩方案的好处在于,你可以使用主成分投影、原始特征表示来恢复数据,并获得非常接近原始数据的近似值。

X_reduce具有 2D 的所有投影,我们可以通过简单地用pc2做矩阵乘法并加回平均值来获得恢复的数据。矩阵形状:(150,2) * (2,4)––>(150,4)。

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

作者图片

我们可以查看X_reduce中的一行,即一次一个示例,这样可以更清楚地看到矢量变换。Cu是基准u上的坐标,Cvv上。

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

作者图片

这就是我们如何从 2D 恢复 4D 数据——通过使用 2D 投影乘以 4D 主成分。最后,别忘了加回均值。

现在让我们看看恢复的数据与原始数据的接近程度

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

作者图片

仅仅通过目测,我们就可以知道复苏做得相当不错。这就是为什么 PCA 也可以压缩图像的原因,因为图像与这里的矩阵没有太大的不同。

就是这样!通过这个极小的例子,我希望你在高层次上获得 PCA 背后的线性代数的感觉,并且知道将来什么时候使用它。如果你对寻找引擎盖下主要部件的过程感兴趣,网上有大量的资料。关键词是奇异值分解(SVD)。

同样,你不需要知道如何实现一个算法来使用它,这就是为什么很多库从我们这里抽象出细节。只要你理解基本的机制和直觉,作为一个调用库并且从未从头实现算法的 ML 实践者是没问题的。

反胃容易,消化难。

这里是我的一些其他文章,你可能会感兴趣

关注我并订阅我的电子邮件列表以获取新文章的更新。

迭代数据时速度提升 300 倍?是的,请!

原文:https://towardsdatascience.com/a-300x-speed-boost-when-iterating-data-yes-please-b11a29b9b818?source=collection_archive---------30-----------------------

当你必须浏览大量数据时,如何让自己的速度提高 300 倍(使用 Numba!)

回溯测试面临的挑战之一是必须遍历行。与矢量化成为可能并带来显著速度提升的其他操作不同,回溯测试时会受到限制,因为通常需要前一行的值来计算下一行。这迫使你不得不迭代数据,正如我们所知,这是非常缓慢的。

最近,我需要对一个包含大约 15 年期权数据的数据集进行迭代。诚然,这不是我见过的最大的数据集,但它仍然是一个相当大的数据集。因此,我决定探索和比较三种不同的方法来遍历它

TL;博士;医生

数字巴是地球上最伟大的发明。如果您可以使用数组和 numpy 来执行迭代,请使用 numba。

准备数据

这里真的没什么可看的——只是通过移除美元符号并将所有内容转换为浮点数来稍微清理一下数据。

我们要测试的主要内容是迭代数据框架以及平仓和开仓交易,计算 PnL 和账户规模的变化。账户大小将决定下一笔交易的手数,因此矢量化是不可能的,因为每笔后续交易的 PnL 取决于手数,而手数又取决于前一笔交易中账户大小的变化。

方法一:Itertuples

对 StackExchange 的粗略搜索表明,“itertuples”是当人们询问有关遍历数据帧的问题时通常会出现的方法。这比“iterrows”更快,因为在底层,pandas 将每一行转换成一个元组,而不是 pandas 系列,这使得访问数据更快。我还使用了我在某处读到的一个技巧,即设置“name=None ”,以便创建未命名的元组(这已被证明可以提高速度)。

方法 2:循环数组

这里,我们去掉了笨重的熊猫数据帧,代之以使用 numpy 数组。不幸的是,由于我需要回测的方式,矢量化不是一个选项,也没有任何我可以使用的 numpy ufuncs。好的老的循环必须做。

方法三:数字巴

最后,我决定在前面的循环数组中添加 numba。Numba 通过将某些 Python 和 Numpy 代码翻译成机器码(!!)在运行时。这使得它能够实现更高的速度。作为一个额外的奖励,它使用起来非常简单——只需安装@ numba.jit装饰器,就可以开始了!

测试时间

为了使用我的 array 和 Numba 函数,我必须将我的 dataframe 转换成一个数组。

然后,我对每个函数都运行了一次“计时”。注意,我只对非 numba 函数运行了 100 次循环,因为 1000 次循环花费的时间太长了…

鉴于三个测试的单位完全不同,结果非常清楚。这里有一些显示原始速度的图表(我知道这是一个非常糟糕的图表)

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

按作者分类的图表

一个更清晰的图表显示了使用 Numba 获得的速度提升

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

按作者分类的图表

结论

Numba 似乎将竞争对手打得落花流水——因此,当需要在不能向量化的回溯测试环境中迭代数据帧时,使用 numpy 数组,然后加入“ @numba .jit”装饰器,您将会在这些迭代中取得突破。

回答“这需要多长时间?”的 4 步流程

原文:https://towardsdatascience.com/a-4-step-process-to-answer-how-long-will-this-take-d0b44250ab90?source=collection_archive---------33-----------------------

如何解决这个共同的利益相关者问题

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

来自佩克斯斯塔斯·克诺普的照片

作为数据科学家或数据分析师,利益相关者会问你一个常见的问题:“这需要多长时间?”当我第一次成为数据科学家时,我发现这个问题很难回答。如果我说我花了一个月的时间来构建一个模型,但是我不能交付,这会伤害我的涉众对我能力的看法吗?如果我更快地构建模型,我的涉众会认为我倾向于高估吗?如果你发现自己像我一样难以提供更好的时间估计,试试这个我开发的帮助我提供更准确时间表的 4 步过程。

1.确定项目范围

与风险承担者召开会议,确定项目范围和预期的可交付成果。确定项目干系人想要解决的业务目标和问题。

例如,市场营销要求您建立一个模型来预测客户流失。根据模型的使用方式,项目的范围会有很大的不同。如果营销计划向可能流失的客户发送电子邮件,那么这意味着如果没有数据工程师的帮助,您将需要更多时间在建立模型后将模型投入生产。如果营销只是想知道预测客户流失可能性的首要因素,那么这将是一个不需要投入生产的特别模型。

2.确认数据可用性

确定项目范围后,确认完成项目所需的数据可用。此外,检查是否有足够的历史数据来建立一个有意义的模型或进行详细的分析。

如果您需要将新数据引入数据仓库,请安排额外的时间来完成这项工作。如果您需要数据工程师或其他团队的帮助,请确保将此作为项目完成的一个依赖项。

3.列出项目任务

为项目创建一个高级任务列表,并估计完成每个任务所需的时间。例如,要构建客户流失模型,任务示例可以是:

  • 探索性数据分析
  • 数据准备和特征工程
  • 模型开发
  • 模型调整
  • 总结模型结果以供利益相关方签署
  • 生产模型

把所有任务的时间加起来,你就会对完成项目所需的时间有一个初步的估计。

4.应用蒙混因素

当您处理一个项目时,总会有一些您没有预算时间的意外事件—更长的数据准备、模型运行时间或模型调整。你可能需要其他团队的帮助,这会增加项目时间。考虑到这些不可预见的情况,应用一个蒙混因素。蒙混因素还应该考虑到你通常花在会议和回答问题上的时间,这些时间会占用你在项目上的时间。

使用过去项目的估计和实际完成时间来计算出你的蒙混因素。如果你估计 20 天,但实际上花了 30 天,那么你的蒙混因素是 30 除以 20 或 1.5。如果您在步骤 3 中估计当前项目需要 25 天,则用 25 乘以 1.5,给出 38 天(或大约 7.5 周)作为完成项目的估计时间。

最后的想法

无论您是数据科学家还是数据分析师,被问到“这需要多长时间”并不是一个很难回答的问题。

概括来说,使用以下 4 个步骤:

  1. 确定项目范围。
  2. 确认项目所需的数据可用性。
  3. 定义高级任务,并计算每项任务的预计时间。
  4. 对步骤 3 的总数应用一个模糊系数,以考虑意外事件、会议时间和回答问题。

你可能也会喜欢…

https://medium.com/swlh/how-i-used-a-machine-learning-model-to-generate-actionable-insights-3aa1dfe2ddfd

深度学习项目的 5 分钟生产就绪设置

原文:https://towardsdatascience.com/a-5-minutes-production-ready-setup-for-your-deep-learning-project-9ff860fc3c4b?source=collection_archive---------20-----------------------

忘掉所有配置 GPU 的头疼事吧

无论你使用什么深度学习库或框架,都不再重要。您将能够在短短 5 分钟和几行代码内设置好它。

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

https://unsplash.com/photos/7nsqPSnYCoY

为你的深度学习项目建立一个良好的环境并不是一件容易的事情。

您有太多的事情需要处理:库必须匹配特定的版本,整个环境需要可复制到其他机器,所有的东西都需要能够与您拥有的机器中的所有驱动程序通信。这意味着您需要为您的 NVIDIA GPU 安装特定的驱动程序,这是一个 CUDA 库,必须与您的驱动程序和您想要使用的框架兼容。

“好吧,但是来吧,你只需要做一次就行了,对吧?” 没有比这更远离事实的了。库发展如此之快,以至于你可能需要最新的能力。所以你需要更新一切。

你可以用 Anaconda 来管理一切,对吗?嗯,也许吧。

这里你的纸牌屋肯定会倒塌。你可以用 Anaconda 来管理一切,对吗?嗯,也许吧。Anaconda 为您做了很多事情,很难在不影响整个环境的情况下改变*【只是一件小事】*。

但是,如果您的软件包不适用于您的平台、操作系统,或者您只需要一个不存在的版本,该怎么办呢?您将使用快速 pip 命令手动添加它。

嘣!你搞砸了一切,你需要从头开始(或者从你最近的备份)重建一切。

好吧,是时候从这个噩梦中走出来了。

欢迎来到英伟达 NGC。

随着容器彻底改变了软件开发的世界,它们现在可以帮助数据科学家构建更健壮的环境。

有一点是肯定的:数据科学可以从软件开发世界中学到一些东西。

嘣!你搞砸了一切,你需要从头开始(或者从你最近的备份)重建一切。

NGC 是软件中心,提供 GPU 优化框架、预训练模型和工具包,以在生产中训练和部署人工智能。它是一个容器注册表,包含训练模型所需的所有工具:不管您使用的是 Caffe2、Pytorch、Tensorflow、Keras、Julia 还是其他工具。

NGC 目录中有成吨的生产准备好的容器,你只需要选择你的。

英伟达 NGC 不仅是一个容器注册表,它内置了许多功能,可以帮助您的组织将模型投入生产。查看 NVIDIA 的文档页面了解更多信息。

我们应该从什么开始?

先说一台配有 GPU 的 Linux 机器(如果要训练模型,GPU 不是强制性的但是强烈推荐)。我在 Ubuntu 20.04 LTS 版和 18.04 LTS 版上进行了测试,但可以很容易地适应其他 Linux 发行版或 Windows 机器。

注意 : 你没有 GPU 还是你只是不想搞乱你的系统?

只需注册 Oracle Cloud 的免费试用版。您将获得 300 美元的积分,并且可以使用 GPU(只要确保您选择了一个可以使用 GPU 的家庭区域)。

点击此处了解更多关于 GPU 地区的信息。如果您注册,您还可以访问 Oracle 永不过期的免费云资源!你可以用这些资源做很多事情,如果你想要一些想法请查看我写的关于这个的文章

我们需要做什么?

步骤很简单,我们只需要安装 NVIDIA 驱动程序和 Docker。然后我们下载想要的 docker 镜像,开始工作!

步骤 1:在 Ubuntu 20.04 上安装 NVIDIA 驱动程序

注意:如果你使用的是另一个 Ubuntu 版本,请确保相应地修改脚本。此外,如果您启用了安全引导,这种方法将不起作用。

在 Ubuntu 20.04 上安装最新的 NVIDIA 驱动程序

要验证安装,使用命令 nvidia-smi 。您应该会看到类似这样的内容。

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

第二步:在 Ubuntu 20.04 上安装 Docker

注: 没有 sudo 权限 的情况下使用 docker 命令 需要注销并登录。

第三步:是时候让 Docker 与 NVIDIA 驱动程序进行通信了

在 Docker 19.03 或更高版本上启用原生 GPU 支持。

我们现在想测试 Docker 是否能够与 NVIDIA 驱动程序通信。要做到这一点,只需运行下面的命令,您应该会看到与第 1 步类似的内容。

注意:我在不同的云提供商上进行了试验,根据操作系统、虚拟机类型和 GPU,此时可能需要重启。因此,如果你得到一个错误,只需尝试 sudo 重启并再次执行上述命令。现在,您应该可以看到第 1 点的 tipycal nvidia-smi 结果。

第四步:让我们拉图像并运行它!

:标志—shm-size = 1g—ulimit memlock =-1—ulimit stack = 67108864是必要的,以避免操作系统限制资源分配给 Docker 容器。

我们现在进入容器,让我们看看是否一切正常。

python

导入张量流

从图中可以看出,GPU 可用,tensorflow 可以使用。

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

可选:访问环境

当你从机器上断开时,你会注意到你不再在集装箱里了。

要再次连接,您需要使用 docker ps 找到正在运行的容器的容器 _ id ,然后:

docker exec-it/bin/bash

最终考虑

在本教程中,我们发现使用英伟达 NGC 的映像,使用您需要的所有库和工具来创建生产就绪环境是多么容易。

我们看到了配置 Docker 使其与 NVIDIA 驱动程序和您需要的框架通信是多么容易。

我们在 5 分钟内完成了所有这些,没有头痛

你需要一个永远免费的云环境来测试你的想法或者支持你的项目吗? 查看 Oracle 云永不过时层

我是 Roberto Di Bella,甲骨文公司的数据科学家顾问。帮助数据科学家、开发人员和公司在 Oracle 云上取得成功。

随时连接上LinkedIn

为准备使用 Python 学习数据科学的人提供的 5 步指南

原文:https://towardsdatascience.com/a-5-step-guide-for-people-who-are-ready-to-use-python-to-actually-learn-data-science-b674cd1595df?source=collection_archive---------34-----------------------

Python 击败 R、Excel、Tableau 学习数据科学。

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

照片由来自 Pexels克里夫·布斯拍摄

大约一年半以前,当我想做一项普通的数据科学任务,而我最喜欢的语言 R 却不能胜任这项任务时,我学会了如何用 Python 编程。我想浏览一些网站,从我收集的数据中预测结果。(为了充分披露,我想知道在我的 Instagram 猫的标题中提问是否会产生更多评论。确实如此。)

正如我所发现的,你可以非常容易地用 Python 学习数据科学,因为它有全面的库和包。它可以处理机器学习、大数据挖掘、预测、自然语言处理以及任何你可以想象数据科学家试图完成的事情。这就是我写这篇关于用 Python 学习数据科学的帖子的灵感。

这篇文章将假设你是一个读者:第一,你想学习数据科学。这是一个伟大的职业——如果你喜欢满足好奇心和研究模式,这是一个很好的乐趣,有经济回报,并受到许多著名的数据科学公司的追捧。这不仅仅是十年来最热门的工作——这是一个让你问出让你夜不能寐的问题,并给出有趣答案的职业。我认为我们很多人都有天生的好奇心,我们希望看到它得到满足。

我还假设你懂一些 Python。你不需要成为一名专家,但是如果你想学习 Python 的数据科学,从了解一些 Python 开始会很有帮助。你不需要成为一名专业人士——我设法用一点 Python 知识完成了我的任务——但是知道如何操作终端是必须的。幸运的是,Python 社区是健壮的、有用的,并且充满了教程、解释和老手。

最后,我假设你正在寻找一个路线图:通过学习 Python 知识,帮助你在数据科学领域找到工作的东西。Python 是学习数据科学的一种很好的语言,因为它的许多优势,如创建简单的可视化、机器学习和数据挖掘,都被数据科学家用于日常工作中。

如果你符合所有这些假设,这是你的职位。本文将指导您学习如何使用 Python 学习数据科学,最终目标是成为一名数据科学家。

1.你需要了解数据科学到底是什么

这似乎是一个奇怪的起点,但当我第一次开始学习 Python 时,我对数据科学一无所知。如果当时我必须给自己定义数据科学,我会说像制作图表一样。我不会错,但这也不是全部真相。我甚至不知道我正在用 Python 学习数据科学,因为我永远也不会想到做出预测是数据科学的一部分。

数据科学在维基百科中的定义是“统一统计学、数据分析、信息学及其相关方法的概念,以便用数据理解和分析实际现象。”简单来说,就是用统计学的方法去理解趋势。

数据科学并不特定于 Python 或任何其他语言。除了一支铅笔、一些纸和一个像样的计算器(或者上帝禁止 Excel),你可能什么都不用带就能完成所有的数据科学任务。如果你知道什么是数据科学,你就知道 Python 不是必需品,而是一条方便的捷径,可以让你灵活、快速、有效地完成所有工作。

为了更好地了解什么是数据科学,用更实际的术语而不是模糊的定义来思考它会有所帮助。StrataScratch 有一个很好的指南,它将你在数据科学面试中会被问到的问题的类型进行了细分,它提供了数据科学家每天所做的各种专业任务的整体视图。

有了这些知识,维基百科提供的定义就更有意义了。专业意义上的数据科学可以描述为使用统计模型、客户数据、概率和预测等工具来理解数字,从而帮助企业做出决策的方法。数字进来,数据科学发生,决策出来。

2.你需要知道你不知道的

Python 技能和数据科学技能的维恩图绝对不是一个圆。

一旦你知道什么是实用的数据科学,第二步就是用 Python 描绘出你现有的知识。Python 技能和典型的数据科学家工作要求有相当大的重叠,因此您可能会发现,当您学习典型的数据科学家技能时,您可能已经知道如何使用 Python 完成这些工作。然而,你不太可能做到这一切。

比如我知道怎么用 TensorFlow 做神经网络建模吗?肯定不是。但那是包含在“数据科学”类别中的。如果我想用 Python 学习数据科学,我会把它算在我的一堆弱点中,并专注于学习这个和其他数据科学技能。

问问你自己:目前你能用 Python 做什么?你还擅长什么?我推荐的最好方法是查看一些典型的基于 Python 的数据科学家工作面试问题库,比如这些数据科学 Python 问题。从那里,你可以很容易地规划出你的专业领域,并复习数据科学工作中可能出现的内容。

例如,你可能会发现,虽然你已经真正掌握了使用“熊猫”包计算差异并输出数字,但你还需要多练习一下使用 Python 开发预测。​

一旦你对自己的优势和劣势有了更好的了解,你就能更好地准备用 Python 学习数据科学。

3.做有趣的基于 Python 的数据科学项目

所以现在你知道你不知道的了。第三步,打磨那些生疏的技能,学习新的。最好的方法是找到一个有激情的项目。

我用 Python 学习了数据科学,因为我痴迷于理解我的猫的 Instagram 帐户中的趋势。这种天生的好奇心驱使我学习如何收集数据,将数据转换成可解析的格式,分析数据,并输出结果。如果我一直试图为学校做这件事,我会在第一个障碍就放弃,或者只是复制粘贴代码而没有任何真正的理解。

虽然 Python 对于初学者来说是一门很棒的语言,但是如果你带着理解和领悟的热情来学习 Python,而不是仅仅记忆命令和粘贴代码,那么用 Python 学习数据科学会容易得多。

回到你的强项和弱项列表,找到你还在努力的地方。你有什么迫切的问题?你想知道天气如何影响你的跑步时间吗?你想知道为什么你家附近有这么多花栗鼠吗?你想探究鸟类大小和它们灭绝的可能性之间的关系吗?(以上都是个人例子,怕你说不清。)

看看网上的一些项目来获得灵感。例如,如果你想找到一些受机器学习启发的项目, Confetti 充满了有用的例子。如果你可以确定你的动机,那么你和你渴望找到的问题的答案之间的唯一障碍就是你缺乏技能,那么用 Python 学习数据科学将不会造成任何障碍。你会很快受到启发,用 python 学习数据科学,并回答那些恼人的问题。

用 Python 进行这些类型的数据项目会让你很好地掌握各种统计方法、数据即图表,以及你在学习 Python 数据科学的过程中会遇到的问题。

4.寻找入门级数据科学工作中提到的技能

如果你正在学习 Python 数据科学,你可能不会马上投入到一份六位数的数据科学工作中。没关系!随着数据科学技能的高需求,你不需要一个学位就能得到一份数据科学的工作。你只是需要经验。

考虑到这一点,查看这些大数据科学职位的职位描述是没有意义的,因为对你来说,用 Python 学习数据科学到那种程度是不现实的。要开始朝着梦想中的数据科学工作努力,你应该看看业务分析师和数据分析师的职位描述,这与数据科学家有一些重叠。初级数据科学家也是很好的工作角色。

类似于列出你不知道的,写一份你目前不能处理的所有工作要求的清单。这将让您了解开始数据科学职业生涯所需的实用技能。然后,寻找使用 Python 完成这些任务的方法。

例如, Booz Allen Hamilton 要求他们的初级数据科学家拥有 NLP 经验。一次快速的谷歌搜索把我带到了这篇文章,在那里 Eric Kleppen 将三个简单的项目放在一起,用 Python 学习 NLP。你关注的具体工作越多,你对入门级数据科学工作中最常见和最受欢迎的技能的了解就越多。

一旦你设置并完成了其中的几个项目,你就已经 95%地学会了使用 Python 学习数据科学。你会知道什么是数据科学,什么是你需要关注的,什么好玩的项目可以帮助你学到你还不具备的技能,甚至什么是入门级的工作在找。最后一步就是坚持学习。

5.保持好奇

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

通过像素成像

学习数据科学永远不会真正结束,无论是 Python 还是任何其他语言。想想数据科学家的职业道路在十年前几乎不存在,你就会明白事情变化有多快。与任何语言一样,Python 中不断出现新的包、项目和概念。为了保持最新的、可雇佣的、知情的状态,确保你带着激情和好奇心去接近这些发展。

在你的数据科学家职业道路的每一步,你都可以重复步骤 1-4,随着职业道路以及随之而来的技能和要求的发展,你可能会得到略有不同的答案。当你准备好获得下一份工作时,重新审视你知识上的差距。当你考虑去谷歌找一份数据科学家的工作时,确保你知道他们会要求你证明什么技能。最重要的是,保持好奇心。继续提问。带着热情和兴趣接近自己的无知。这就是你如何通过使用 Python 继续学习数据科学的方法。

关于如何用 Python 学习数据科学的最终想法

本文面向那些了解一些 Python,认为自己可能喜欢数据科学方面的工作,并且想知道如何依靠现有的 Python 来学习数据科学的人。Python 是学习数据科学的最佳编码语言,易于初学者掌握,也易于初学者改进。

总的来说,学习 Python 数据科学的最佳方式就是:

  1. 对数据科学到底是什么有一个最新的理解
  2. 找出您现有的 Python 知识和知识差距
  3. 挑选出能让你保持兴趣的 Python 项目
  4. 了解入门级数据科学工作需要的技能
  5. 对数据科学和作为编码语言的 Python 保持好奇。两者都经常变化。

有了它,你将踏上学习 Python 数据科学的道路,并获得你梦想中的数据科学家的工作。

A/B/C 测试:如何分析多组实验的结果

原文:https://towardsdatascience.com/a-b-c-tests-how-to-analyze-results-from-multi-group-experiments-ad5d5cee0b05?source=collection_archive---------18-----------------------

方差分析的解释(ANOVA)

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

图片来自 Pixabay

在科技初创公司中,实验被广泛用于决定是否推出新产品功能、用户界面设计变化、营销活动等,通常目标是提高转化率、收入和/或销量。通常,我们想要测试一个改变(治疗组)对现状(对照组)的影响,但是如果我们正在考虑几个选项,并且想要对两个以上的组进行实验呢?

在本文中,我将介绍单向方差分析背后的直觉,以及如何使用它来分析您在多组实验中的结果。

为什么你不应该做多重 t 检验

你可能想知道在你的实验中是否可以使用 t 检验来比较各组之间的差异。简短的回答是不,你不应该这样做!不仅会变得乏味,而且如果您使用 t-test 来比较许多对,您犯 I 型错误(假阳性)的几率会增加。

为了说明这一点,考虑一个有 5 个不同组的实验。在这种情况下,我们需要运行的 t 测试的数量是5 Choose 2 = 10 个 t 测试!如果我们进行这 10 次 t 检验,即使我们将每个 t 检验的显著性水平设为 0.05,I 型错误的概率也不再是 5%。

相反,类型 I 错误的概率增加到1 — (1 — 0.05) ^ 10 = 0.40,因为我们正在进行十次比较,并且在所有测试中没有获得任何显著结果的概率现在是0.95 ^ 10 = 0.60。这意味着,如果我们做 10 次 t 检验来比较实验中 5 组之间的平均值,我们最终会在 40%的时间里错误地拒绝零假设,而不是在 5%的时间里!

关于 ANOVA

ANOVA 代表方差分析,是对两组或多组平均值之间差异的统计显著性的检验。本质上,它将数据中的总方差划分为不同的类别,允许我们比较组的平均值之间的变化量和每组内的单个观察值之间的变化量。

假设

在进行 ANOVA 检验之前,我们需要确保满足以下三个假设:
1。*我们从中抽取样本的基础人群是正态分布的。*检查的一种方法是绘制观察值的直方图,以直观显示分布是否呈正态分布。

2.*样本所来自的总体的方差相等。*我们可以用箱线图检查这一点,看看观察值的方差是否相等。

3.*每组中的观测值是相互独立的,每组内的观测值是随机抽样的。*我们需要确保实验是精心设计的,以保证组间的独立性和组内的随机抽样。

假设检验

在这一节中,我将介绍计算检验统计量和进行假设检验所需的步骤。在单因素方差分析中,零假设是所有组的平均值相等,而另一个假设是至少有一个平均值不同。

R 和 Python 中有许多计算器在线和统计软件包,您可以使用它们来执行计算,但是以下步骤中的细节旨在帮助您理解方法和概念。如果公式看起来很吓人,不要担心,相反更重要的是理解每一步的直觉!

  1. 计算平方和

在简单的方差分析中,我们可以将总平方和(SS_T)视为组内平方和(SS_w)和组间平方和(SS_B)之和:

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

组内平方和(SS_w)代表组内可变性的数量,但不受组间总体差异的影响。组内平方和等于一个组内所有观察值与其组均值的偏差平方和,即所有组的总和。

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

组间平方和(SS_B)可视为组间差异,但不受组内变异量的影响。它可以计算为总体大平均值的组平均值之间的平方和。

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

2。计算自由度

接下来,我们需要计算自由度。类似于平方和,总自由度等于组内自由度(df_w)和组间自由度(df_B)之和:

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

组内自由度(df_w)是观察数-组数,而组间自由度(df_B)是组数- 1。

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

3。计算均方值

为了能够比较平方和,我们将它们除以相关的自由度(df)以获得均方值。

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

4。计算 F 统计量

检验(F)统计量是组间均方(MS_B)与组内均方(MS_w)的比值

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

5。求 F 的临界值

对于α、组内自由度(N - k)和组间自由度(k - 1)的相应值,从 F 分布表中确定 F 的临界值。

6。方差分析测试的结论

如果从你的实验中得到的 F (F_obt)值大于 F (F_crit)的临界值,我们可以拒绝均值之间没有差异的零假设。这意味着至少一个平均值在统计学上显著不同于一个或多个其他平均值。

比较成对平均值:谢弗法

能够拒绝方差分析检验的零假设告诉我们至少有一个均值是显著不同的,但是我们如何知道哪个均值是不同的呢?

回想一下我们上面进行多重 t 检验的例子,这将导致 I 型错误的增加。然而,如果我们能够使用 ANOVA 拒绝均值无差异的零假设,我们可以使用事后分析的 Scheffé方法来比较任何一对均值,而不用担心增加 I 型误差。

我们可以使用 Scheffé方法计算一个称为 C 的统计量。计算从我们的实验中获得的 C 的公式是:

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

其中,x̄₁和 x̄₂是被比较的两组的平均值,N₁和 N₂是这两组中的观察次数,MS_w 是来自方差分析的组内均方值。

然后,我们可以将从我们的观察中获得的 C 值与 C 的临界值进行比较。C 的临界值可以从以下公式中找到:

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

其中 K 是组的数量,F_crit 是 F 的临界值,您可以从 F 分布表中查找相应的自由度和显著性水平。

如果得到的 C 值大于 C 的临界值,可以拒绝均值对相等的零假设。

关联强度:ω平方

来自 ANOVA 的检验统计可以告诉我们组间均值的差异是否具有统计学意义,但不能告诉我们效果大小。为了确定治疗效果的强度,我们可以使用下面的公式来计算ω平方(ω2):

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

其中,SS_B 为组间平方和,K 为组数,MS_w 为组内均方,SS_T 为平方和。

ω平方(ω2)告诉我们治疗效果可以解释多少总可变性,可以取-1 到+1 之间的任何值,0 表示没有任何影响。

结论

我希望这篇文章能帮助你更好地理解什么是方差分析,以及如何用它来解释多变量实验的结果。以下是一些关键要点:

  • ANOVA 是对两组或多组平均值之间差异的统计显著性的检验。
  • 如果您能够使用 ANOVA 拒绝均值无差异的零假设,您可以使用事后分析的 Scheffé方法来比较任何一对均值,而不用担心增加 I 型误差。
  • 为了确定治疗效果的关联强度,您可以计算ω平方(ω2),这可以告诉您治疗效果可以解释多少总可变性。

实验需要时间和资源来设计、设置和部署到生产中。希望这有助于您将测试工具包扩展到多元实验中!

A/B 测试:统计测试完全指南

原文:https://towardsdatascience.com/a-b-testing-a-complete-guide-to-statistical-testing-e3f1db140499?source=collection_archive---------0-----------------------

入门

对于营销人员和数据科学家来说,建立正确的测试至关重要。

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

约翰·麦克阿瑟在 Unsplash 上的照片

什么是 A/B 测试?

A/B 测试是用来优化网络营销策略的最流行的控制实验之一。它允许决策者通过查看从两个可能的选项 A 和 b 获得的分析结果来选择网站的最佳设计。

在本文中,我们将看到如何使用不同的统计方法来使 A/B 测试成功。我推荐你也看一下 这本笔记本 你可以在那里玩本文讨论的例子。

为了理解 A/B 测试是关于什么的,让我们考虑两个可选择的设计:A 和 B。一个网站的访问者被随机提供两个中的一个。然后,通过网络分析收集关于他们活动的数据。给定这些数据,可以应用统计测试来确定两种设计中的一种是否具有更好的功效。

现在,不同种类的指标可以用来衡量一个网站的功效。对于离散度量,也称为二项式度量,只有两个值 01 是可能的。以下是流行的离散指标的例子。

  • 点击率——如果用户看到广告,他们会点击吗?
  • 转化率——如果给用户看广告,他们会转化为顾客吗?
  • 跳出率 —如果用户正在访问一个网站,那么下面访问的页面是否在同一个网站上?

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

离散指标:点击率(作者图片)

使用连续度量,也称为非二项式度量,度量可以采用连续值,而不限于一组两个离散状态。以下是流行的连续指标的例子。

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

连续指标:平均订单值(作者图片)

我们将详细了解离散和连续指标如何需要不同的统计测试。但首先,让我们快速回顾一下统计学的一些基本概念。

统计显著性

利用我们从网站用户活动中收集的数据,我们可以比较两种设计 A 和 b 的功效。简单地比较平均值没有多大意义,因为我们无法评估我们观察结果的统计显著性。确定两个样本之间观察到的差异源于偶然的可能性确实是至关重要的。

为此,我们将使用双样本假设检验。我们的零假设 H0 是两个设计 A 和 B 具有相同的功效,即它们产生了相等的点击率,或每用户平均收入等。然后通过 p 值测量统计显著性,即观察到样本间差异至少与我们实际观察到的差异一样大的概率。

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

p 值(图片由作者提供)

现在,必须小心谨慎地正确选择替代假设 Ha 。该选择对应于单尾和双尾测试之间的选择。

在我们的情况下,双尾检验更可取,因为我们没有理由先验地知道 A 和 B 的结果之间的差异是有利于 A 还是 B。这意味着我们考虑另一个假设HaA 和 B 具有不同功效的假设。

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

单尾和双尾测试(图片由作者提供)

因此, p 值被计算为所有**x’**s . t .**p(x’)<= p(我们的观察)**上所选检验统计量的概率密度函数 p(x) 的两个尾部下的面积。这种 p 值的计算显然取决于数据分布。因此,我们将首先了解如何针对离散指标计算它,然后针对连续指标计算它。

离散度量

让我们首先考虑一个离散的指标,比如点击率。我们随机向访问者展示两种可能的广告设计中的一种,并记录有多少人点击了它。

假设我们收集了以下信息。

  • nX = 15 访客看到了广告 A,其中 7 人点击了它。
  • nY = 19 访客看到了广告 B,其中 15 人点击了它。

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

点击率:列联表(图片由作者提供)

乍一看,版本 B 似乎更有效,但是这种差异在统计学上有多大意义呢?

费希尔精确试验

使用上面显示的 2x2 列联表,我们可以使用 Fisher 精确检验来计算精确的 p 值并检验我们的假设。为了理解这个测试是如何工作的,让我们首先注意到,如果我们固定表格的边距(即每行和每列的四个和),那么只有少数几种不同的结果是可能的。

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

点击率:可能的结果(作者图片)

现在,关键的观察是,在零假设 H0 下,A 和 B 具有相同的功效,观察到这些可能结果的概率由超几何分布给出。

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

可能结果的超几何分布(作者图片)

使用这个公式,我们得到:

  • 看到我们实际观测的概率是 ~4.5%
  • 如果 B 为 ~1.0% (左尾),则看到更多不太可能的有利观测的概率;
  • 如果 A 为 ~2.0% (右尾),则看到更不可能的观察结果的概率为赞成。

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

点击率:尾部和 p 值(作者图片)

所以费雪精确检验给出 p 值≈ 7.5%

皮尔逊卡方检验

费希尔精确检验具有计算精确 p 值的重要优势。但是,如果我们有一个大的样本量,它可能是计算效率低下。在这种情况下,我们可以使用皮尔逊卡方检验来计算一个近似的 p 值。

让我们将列联表第 i 行和第 j 列的观测值称为 Oij 。在行列独立性的零假设下,即假设 A 和 B 具有相同的功效,我们可以很容易地计算出相应的期望值 Eij 。此外,如果观察值呈正态分布,那么χ2 统计量恰好遵循具有 1 个自由度的卡方分布

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

皮尔逊卡方检验(图片由作者提供)

事实上,由于中心极限定理,如果样本量足够大,该检验也可以用于非正态观测值。

在我们的例子中,使用皮尔逊卡方检验,我们得到 χ2 ≈ 3.825 ,这给出了 p 值≈ 5.1%

连续指标

现在让我们考虑一个连续指标的情况,比如每个用户的平均收入。我们随机向访问者展示我们网站的两种可能布局中的一种,并根据每个用户一个月产生的收入,我们希望确定两种布局中的一种是否更有效。

让我们考虑下面的情况。

  • nX = 17 用户看到了布局 A,然后进行了以下购买:200 美元,150 美元,250 美元,350 美元,150 美元,350 美元,250 美元,150 美元,250 美元,150 美元,150 美元,150 美元,200 美元,0 美元,100 美元,50 美元。
  • nX = 14 用户看到了布局 B,然后进行了以下购买:300 美元,150 美元,150 美元,400 美元,250 美元,250 美元,150 美元,200 美元,250 美元,150 美元,300 美元,200 美元,250 美元,200 美元。

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

每个用户的平均收入:样本分布(作者图片)

同样,乍一看,版本 B 似乎更有效。但是这种差异在统计学上有多大意义呢?

z 检验

Z 测试可在以下假设条件下应用。

  • 观察值呈正态分布(或样本量较大)。
  • 采样分布具有已知的方差 σXσY

在上述假设下,Z 测试利用了以下事实:下面的 Z 统计量具有标准正态分布。

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

z 测试(图片由作者提供)

不幸的是,在大多数实际应用中,标准偏差是未知的,必须进行估计,因此 t 检验是更可取的,我们将在后面看到。无论如何,如果我们知道 σX=100σX=90 的真实值,那么我们将得到 z ≈ -1.697 ,这对应于一个 p 值≈ 9%

“学生”t 检验

在大多数情况下,抽样分布的方差是未知的,所以我们需要估计它们。学生的 t 检验可以在以下假设下应用。

  • 观察值呈正态分布(或样本量较大)。
  • 采样分布具有“相似”的方差 σX ≈ σY

在上述假设下,Student 的 t 检验依赖于以下观察结果:下面的 t 统计量具有 Student 的 t 分布。

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

“学生”t 检验

这里 SP 是从样本方差 SXS Y 中获得的合并标准差,它们是使用应用贝塞尔修正的无偏公式计算的。

在我们的示例中,使用学生的 t-检验,我们得到了 t ≈ -1.789ν = 29 ,这给出了 p 值≈ 8.4%

韦尔奇 t 检验

在大多数情况下,学生的 t 检验可以有效地应用于良好的结果。然而,很少会违反第二个假设(抽样分布的相似方差)。在这种情况下,我们不能计算混合方差,我们应该使用韦尔奇的 t 检验,而不是学生的 t 检验。

该测试在学生 t-测试的相同假设下进行,但取消了对相似方差的要求。然后,我们可以使用一个稍微不同的 t 统计量,它也有一个学生的 t 分布,但是具有不同的自由度数量 ν

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

韦尔奇 t 检验

ν 的复杂公式来自韦尔奇-萨特思韦特方程

在我们的例子中,使用 Welch 的 t 检验,我们得到了 t ≈ -1.848ν ≈ 28.51 ,这给出了 p 值≈ 7.5%

连续非正态度量

在前面关于连续度量的部分中,我们假设我们的观察值来自正态分布。但是在处理每个用户的月收入时,非正态分布是非常普遍的。常态经常在几个方面被破坏:

  • 零膨胀分布 —大多数用户根本不买任何东西,所以有很多零观察值;
  • 多式联运分销 —一个细分市场倾向于购买便宜的产品,而另一个细分市场购买更贵的产品。

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

连续非正态分布(图片由作者提供)

然而,如果我们有足够的样本,在正态假设下导出的检验,如 Z 检验、Student’s t 检验和 Welch’s t 检验,仍然可以应用于显著偏离正态的观察值。事实上,由于中心极限定理,随着样本量的增加,检验统计量的分布趋于正态。在我们正在考虑的零膨胀和多峰的例子中,即使是 40 的样本大小也会产生一个非常接近正态分布的分布。

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

非正态分布的正态收敛(图片由作者提供)

但是,如果样本量仍然太小,无法假设正态性,我们没有其他选择,只能使用非参数方法,如曼-惠特尼 U 检验。

曼恩-惠特尼 U 检验

该检验没有对抽样分布的性质做出假设,因此它是完全非参数的。曼-惠特尼 U 检验的思想是计算下面的 U 统计量

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

曼-惠特尼 U 检验(图片由作者提供)

该检验统计量的值被制成表格,因为分布可以在零假设下计算,即对于来自两个总体的随机样本 XY ,概率 P(X < Y)P(X > Y) 相同。

在我们的例子中,使用曼-惠特尼 U 检验,我们得到 u = 76 ,这给出 p 值≈ 8.0%

结论

在本文中,我们已经看到不同种类的度量、样本大小和抽样分布需要不同种类的统计测试来计算 A/B 测试的显著性。我们可以用决策树的形式总结所有这些可能性。

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

用于 A/B 测试的统计测试摘要(图片由作者提供)

如果你想了解更多,你可以从玩 这个笔记本 开始,在那里你可以看到本文讨论的所有例子!

A/B 测试数据科学面试问题指南

原文:https://towardsdatascience.com/a-b-testing-data-science-interview-questions-guide-53b03bd73548?source=collection_archive---------23-----------------------

如何以一种让你脱颖而出的方式回答 A/B 测试数据科学面试问题

A/B 测试是许多数据科学面试的主要内容,尤其是当角色决定如何最好地设计某种形式的用户体验时,通常是通过某种形式的应用程序或网站。想想亚马逊、优步和 Youtube——所有这些公司的应用程序都有不断变化的功能,每个变化的背后都有一个 A/B 测试,这是许多数据科学家的面包和黄油。

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

作者原创图片

只要在谷歌上快速搜索一下,你就会发现很多关于如何构建经典 A/B 测试答案的指南。这些指南可能相当有用,但它们不会让你的答案脱颖而出。这就是本文的内容:我将与您分享一两件(或三件)关于我如何在自己的数据科学面试经历中接受 A/B 测试问题的事情,以及我如何让我的答案给面试官留下额外的印象。我不会涉及制定假设和进行 t 检验的基础知识,但我会更加关注如何将你的答案与其他答案区分开来。

什么是 A/B 测试?

A/B 测试本质上是一个受控的实验,以做出关于产品发布的关键决策,这些变化可以从按钮的大小和颜色这样的小元素到应用程序上整个新页面这样的大变化。

变体

与只测试两个不同版本的 A/B 测试相反,A/B/N 测试涉及同时测试 N 个版本。A/B/N 测试通常用于大规模变更。

多变量测试发生在版本和相关变量的所有排列同时被测试的时候,并且经常在必须做出组合决策的时候使用,而不是在每个变化上运行 A/B 测试。

机会规模

对于许多受访者来说,他们会直接谈论样本大小、统计意义等。当被问到一个暗示 A/B 测试的问题时,他们不顾一切地卸下他们在准备面试时记忆的框架和答案。然而,这些答案并没有脱颖而出。

相反,不仅仅要考虑 A/B 测试的技术,还要考虑 A/B 测试进行的环境。A/B 测试在现实世界中的现实是,并不是所有提议的变更都值得测试,并且在任何公司中,当决定某个特定的 A/B 测试是否值得追求时,都有一个有限的元素需要时间和资源的明智分配。

当产品经理带着一个想法来到你这个数据科学家面前时,我们希望能够根据历史数据评估这个想法的潜在影响。这种形式的机会评估至关重要,因为它让您作为数据科学家的努力变得有价值。例如,考虑一个新的电子商务网站的变化,它将允许来自多个零售商的结帐。为了确定这个机会的大小,我们需要通过分析用户通常购买的不同商品的数量来获得一个上限。如果只有一小部分用户购买了大量的商品,这种 A/B 测试可能根本就不值得进行。因此,重要的是要估计实际上会改变行为的用户数量,以及这如何转化为大公司的实际数量。

更重要的是,要回答关于机会规模的问题,您需要绝对清楚您打算使用什么指标。概述你在面试中所做的确切假设,并坚定地表明这个机会的评估价值。

韵律学

度量,度量,度量。如果你不能全面而自信地谈论度量标准,那么任何关于 A/B 测试的答案都是不完整的。谈论指标的关键是要很好地了解公司的产品,并研究通常会使用哪种指标。例如,在我面试电子商务公司的经历中,你经常会被要求评估一个行动号召功能,比如一个提醒你某个优惠即将到期的弹出窗口。

如果您正在评估行动号召功能:

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

Stephen Phillips 许可在 Unsplash ( 链接 ) 上使用的图片

因此,关键是要很好地了解应用程序接口,并理解什么指标倾向于与它相关联。不要把所有可能的指标都塞进你的答案里。更重要的是,你绝不能停留在仅仅提及可能相关的度量标准。记住,一定要在上下文中回答!你必须告诉面试官为什么这个指标很重要,它对整体用户体验有什么影响。

你如何量化 Twitter 用户的影响力?

这里有一个关于指标的问题,实际上是在 Twitter 产品访谈中被问到的:

问题链接:https://platform . stratascratch . com/technical/2051-influencer-metrics

一些常见的答案可能是关注者数量、转发数量、喜欢和提及数量。如果你想给出一个更有力的答案,可以提到一些类似推特链接的点击率,或者固定时间跨度内的互动次数。对关注者数量的一个更精确的回答是提到实际上为特定用户打开通知的关注者的数量。根据我的经验,面试官不希望你列出所有你已经知道的可能答案。相反,面试官心中有一个理想的答案,你必须努力思考他或她可能会给你的线索。

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

作者原创图片

有很多方法可以得到一个全面的答案,但是有两个概念我一定要提到:转换漏斗和 ltv。转换漏斗描述了导致用户最终决策点的考虑和体验的各个阶段。术语“漏斗”用于说明沿着漏斗向下发生的自然损耗。始终将度量标准的选择放在一个漏斗的框架中,这将使您的答案听起来更加深思熟虑!如果你真的想了解转换漏斗的细节,看看这篇关于七种不同类型漏斗的文章。更好的是,使用终身价值(LTV)的概念来评估你的度量的长期观点。这告诉面试官,你考虑的不仅仅是一个特定设计决策的直接后果,还包括它如何影响用户的未来,以及它如何影响其他用户(外部性)。事实上,我希望你能更进一步,谈谈外部性是如何违反控制组和治疗组之间的独立性假设的,以及我们可能希望如何对此进行控制。

样本量

  1. 检验的功效(通常约为 0.8–0.9):当替代假设为真时,拒绝零假设的概率。考虑幂的另一种方式是 1 减去β,其中β是第二类错误的概率,对于那些更熟悉统计方法的人来说。
  2. 检验的显著性水平:错误地拒绝零假设的最大可能性,当它实际上为真或类型 1 错误时
  3. 最小期望效应

在 A/B 测试面试中谈论样本大小是没有商量余地的。一般来说,A/B 测试所需的样本量取决于三个因素:

MDE 是您愿意观察的基线上的最小改进。例如,如果我们关注观察到每花 10 美元购买就会增加 1 美元的效果,我们将 MDE 设置为 10%。

事实上,大多数准备充分的受访者不会错过在他们的答案中提到 MDE,但真正精彩的答案会更进一步。在现实世界中,更有效的方法是忘记精确地修复 MDE 相反,我们应该设定限制,以便更好地做出决策。例如,保持 MDE 为 5%不变,我们可以计算不同水平的基线需要多少样本。一般来说,基线越小,检测相同 MDE 所需的样本量越大。想一想,看看为什么直觉上这是对的。

p 值

什么是 p 值?样本大小如何影响 p 值?

这听起来像是一个相对简单的问题,但你会惊讶地发现,当被问到这个问题时,有多少受访者实际上答非所问!

以下是对这个问题的转述解释:https://platform.stratascratch.com/technical/2043-p-value

p 值是在零假设下找到观察结果的概率。如果您有更多的数据,那么观察结果的标准误差(不确定性)会降低(因为 SE=std/sqrt(N)),因此检验统计量会增加,因此我们可以更有信心拒绝零。此外,测试的统计能力(1-(当空值为假时拒绝空值失败的概率)会增加。现在,这些信息可以使你的假设检验更强(效应大小),但它与我们对 p 值的解释无关。

这是另一种思考方式。p 值是从 0 到 1 的数,其提供了所获得的测试结果的统计显著性水平的指示,与仅仅由于随机性而获得的测试结果相反。具体来说,p 值衡量在假设零假设为真的情况下获得测试结果的可能性。通常,高于 0.05 的 p 值是令人信服的证据,表明我们不能拒绝无效的零假设。

当我们进行 A/B/N 测试时,事情变得稍微复杂一些,这就是你在统计课上学到的知识派上用场的地方。例如,如果我们有 4 个治疗组和一个对照组,观察到至少 1 个假阳性的概率是多少?(类型 1 错误)[提示:不是 0.05 * 4]

答案如下:

pr(FP = 0)= 0.95 * 0.95 * 0.95 * 0.95 = 0.8145

因此,

pr(FP > = 1)= 1–0.8145 = 0.1854(18.54%,而不是 20%)

干扰

最后,我们来谈谈干扰,也就是说当治疗组和对照组之间的独立性假设被违反时。在 A/B 测试的世界里,一切都是理想的,因为除了治疗变量之外的一切都是可控的。然而,这种其他条件不变的情况在现实世界中是不真实的。对于像优步这样的公司来说尤其如此,他们为相互依赖的用户提供服务。今天让我们来谈谈其中的一个干扰,以及作为一名受访者,你如何通过分享一些潜在的解决方案来让面试官惊叹。

对于像优步和 Lyft 这样提供双边市场的公司来说,干预将导致通常所说的高估偏差,因为控制组和处理组的成员都在利用资源。例如,如果优步在我们的治疗组中引入了吸引驾驶员的特征,这将意味着我们的对照组中可用的驾驶员更少,并且对治疗效果的最终估计将是不准确的。

这就是实验的设计如此重要的原因!那么我们能做些什么呢?首先,我们可以考虑按位置随机分组,这样我们可以充分隔离治疗组和对照组。通过这样做,当治疗组的机制发生时,我们防止了强加给对照组的外部性。但这里有一个隐藏的权衡:在地理上隔离各组可能会导致我们估计效果的更大标准误差,因为现在每个治疗组和对照组可能有更多我们无法控制的属性。例如,想一想中央商业中心的司机和农村地区的司机。最终,必须做出取舍,作为一名受访者,你会想提到它们。或者,我们可以根据时间随机分组。这克服了我们基于地理随机化的缺点,但只有在治疗效果应该持续很短时间的情况下才有效。相反,如果治疗效果意在捕捉类似于同行转诊方案的效果,那么时间随机化可能不是最理想的。

还有哪些因素会威胁到你的有效性?有很多,所以你面临的挑战是在面试中快速思考,尽可能给出更多可能的答案。更多可能的干扰,请查看下面的文章

最终,A/B 测试的答案可以而且应该有很大的不同,这取决于谁在提问以及问题是关于什么的。在我看来,最重要的是永远要在语境中回答!任何人都可以背诵一个关于假设检验和 A/B 检验步骤的记忆答案,但真正优秀的候选人是知道如何以及何时应用正确技术的人,是能够根据被检验的假设快速适应并思考不同方法的利弊的人。

最初发表于【https://www.stratascratch.com】

对抗健忘症:循环神经网络的简史和介绍

原文:https://towardsdatascience.com/a-battle-against-amnesia-a-brief-history-and-introduction-of-recurrent-neural-networks-50496aae6740?source=collection_archive---------18-----------------------

只有回顾过去,才能理解生活。必须向前看。

——本杰明·巴顿奇事

这是我关于深度学习和强化学习系列的第二篇文章(第一篇关于卷积神经网络)。

在日常生活中有许多顺序建模问题:机器翻译、语音识别、文本分类、DNA 测序分析等。这些问题大多属于监督学习。模型的输入或输出是大小可变的序列。正常的神经网络难以处理不同大小的输入和输出。

在下面的章节中,我将解释为什么递归神经网络或 RNN 适用于序列建模问题。然后,我将谈论具有代表性的架构香草 RNN、长短期记忆(LSTM) ,以及已经在机器翻译和许多其他用例中得到著名应用的编解码器。最后,我将用 Pytorch 中的一个简单实现来演示 LSTM。

1 为什么选择 RNN

1.1 历史

RNN 的概念是在 1986 年提出的。著名的 LSTM 建筑发明于 1997 年。RNN 知名建筑的数量比 CNN 少得多。俗话说“ 一张图片胜过千言万语 ”暗示着,图像有更多的信息和回旋的空间,所以 RNN 的进化史并不丰富多彩也就不足为奇了。我试图将历史分为三个阶段,分别是香草 RNN 的过载单存储器、LSTM 的多门存储器和 RNN 的注意编码器-解码器架构。

当我带你走过的时候,你会意识到 RNN 进化的主题是与健忘症作斗争。换句话说,每一代 RNN 人都试图尽可能多地记住过去的重要信息,以便更准确地预测未来。

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

RNN 的演变

1.2 为什么 RNN 致力于可变输入/输出

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

图片来源:安德烈·卡帕西

普通的神经网络很难处理不同大小的输入和输出。以下是他们无法处理的一些用例。请注意, Many 对于模型的每个输入或输出并不是一个固定的数字。

  • **一对多:**图像字幕,文字生成
  • **多对一:**情感分析,文本分类
  • **多对多:**机器翻译,语音识别

RNN 能够通过一个递归处理单元(单层或多层单元)来处理这些用例,其中隐藏状态源自过去

该架构的递归性质既是一件好事也是一件坏事。好处是它可以处理不同大小的输入/输出。但这是有代价的,除了回忆过去的困难之外,还有消失/爆炸渐变的问题。任何有一些编程经验的人都会生动地回忆起递归程序是多么容易得到堆栈溢出内存不足异常。

RNNs

2.1 香草 RNN

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

基本的 RNN 建筑。来自维基百科

上面是基本的 RNN 体系结构,带有自循环或指向自身的递归指针。 x、oh 为输入、输出和隐藏状态,其中 U、WV 分别为作用于它们的参数。在绿色 RNN 细胞内,可能有一层或多层正常神经元或其他类型的 RNN 细胞。

递归指向结构是 RNN 的中心概念。这意味着几件事:

  • 输入和输出的大小是不同的
  • 有一个隐藏状态来表示过去的知识,它也被用作下一步的输入。来自先前步骤的隐藏状态,连同当前步骤的输入,用于导出当前隐藏状态。然后用它来导出当前步骤的输出。
  • RNN 的每一步共享相同的激活函数和相同的参数集。在上面的例子中,U 、VW 在所有的 RNN 单元之间共享,不管 RNN 网络增长到多大。
  • 隐藏状态成为 RNN 的关键组成部分,因为它不仅是输入和输出的桥梁,更重要的是过去和现在。

现在你应该已经注意到 RNN 的瓶颈是所有 RNN 单元之间的共享参数,特别是当网络变得太大时隐藏状态参数 V。一个只有单一记忆的大脑是很容易超载,并且不能记住一段距离以外的过去。

具有多层的普通 RNN 单元可以在一定程度上提高性能,但是逻辑上没有太大的区别,因为它仍然被认为是一维数据的一个处理单元。但是有许多方面的信息需要处理。

2.2 RNN 工作方式的简单例子

我用一个简化的字符级语言模型预测单词“hello”的下一个字符的例子来说明。

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

简化字符级语言模型。图片来源:安德烈·卡帕西

  • 第一步:字符嵌入。字典是[h,e,l,o]。“h”变成[1,0,0,0],“e”变成[0,1,0,0],“l”变成[0,0,1,0],“o”变成[0,0,0,1]
  • 第二步:计算误差。随机实例化网络,依次向网络输入字符“h”、“e”、“l”、“l”、“o”。在输入“h”的第一时间步,我们得到输出“o”(因为 4.1 是最大的置信度得分,并且在第四个位置),而不是预期的“e”(绿色)。对于其他时间步长,反之亦然。我们希望增加绿色位置的置信度得分,并减少其他值。
  • 第三步:反向传播。汇总误差,进行反向传播,分别更新 W(hh)、W(xh)W(hy) 的参数。
  • 第 4 步:重复第 2 步和第 3 步,直到网络以高置信度预测出正确的字符序列。

2.3 LSTM

LSTM 是最受欢迎的 RNN 建筑,即使它已经诞生了 20 多年。但是为什么是 LSTM 呢?最大的原因是香草 RNN 不能很好地记住过去。香草 RNN 中仅有的几组参数需要处理和记忆太多的信息,很容易超载。

对于像对话和文本这样的连续信息,有几个维度需要处理,比如强调什么,输出什么,忘记什么。LSTM 介绍了三种选择存储器(门),分别是**输入、**输出、遗忘门,以及 Sigmoid 函数来表示要处理的信息的百分比。

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

LSTM 概述。图片来源: ResearchGate

  • 输入门:记什么。即。像“a”、“the”这样没有用的词不会出现在输入中。
  • **输出门:输出什么。**即。一些信息将存储在隐藏状态中,但不会存储在输出中。
  • **忘门:忘什么。**即。背景变了。以前的一些信息会被遗忘
  • **乙状结肠函数:信息百分比。**sigmoid 函数值在 0 到 1 之间,非常适合用来表示信息输入、输出和遗忘的百分比。

拥有三个逻辑记忆单元来处理不同的维度极大地提高了 LSTM 记忆长期和短期信息的能力。在后一节中,我将通过一个具体的编码示例更详细地说明 LSTM。

2.4 注意编码器和解码器

2.4.1 编码器-解码器

严格来说,编码器-解码器是一个不属于 RNN 的通用架构。在序列中广泛应用于对深度学习用例进行排序。变换器是另一种不基于 RNN 的编码器-解码器架构。OpenAI 最先进的预训练 NLP 模型 GPT-2GPT-3 基于变压器架构。

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

编码器-解码器架构。图片来源: Quora

编码器-解码器试图模仿人脑的认知过程。例如,当我们看到一些东西,我们将它作为某种格式(编码向量)编码到我们的“神经网络”(大脑)中。当我们想要描述我们所看到的东西时,我们从大脑中取出编码向量,并通过我们的嘴将其“解码”成我们自己的语言。

编码器末端出来的向量还有一个名字叫做潜在空间。**潜在空间是机器学习中一个非常重要和有用的概念。这意味着对于任何类型的信息(即语音、文本、图像或视频),只要它们可以在相同的潜在空间中被表示,它们就可以相互交流和理解,**例如图像到文本(图像字幕)和语音到文本(语音识别)。

2.4.2 注意事项

香草编码器解码器有什么问题?来自编码器端的定长向量是编码器和解码器之间唯一的交换媒介。解码器仅在编码器的最后一步之后才暴露给编码器结果。编码器矢量已成为信息瓶颈。距离越远,信息就越难以保存在编码器矢量中。

香草 RNN 的问题听起来熟悉吗?是的。具有更多存储器的相同解决方案也适用。不是一个固定长度的编码向量,我们为每个目标词准备了一个向量,叫做注意力向量。注意力向量与隐藏状态和输入一起被用于预测输出。

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

注意编码器-解码器。图片来源: ResearchGate

直观上,每个注意力向量允许每个目标单词只关注输入中的几个单词。下面是一个机器翻译例子的注意力矩阵热图。您可以看到,每个目标单词将更多的注意力集中在几个输入单词上。

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

来自 Google Tensorflow 机器翻译示例的注意力热图

2.5 RNN 调谐技术

大部分神经网络整定技术也可以用来提高 RNN 性能,如**脱落、批量归一化、残差学习、激活函数、**等。您必须根据您的用例尝试各种技术来获得最佳性能。神经网络调谐在很多时候是一门艺术而不是科学。

3 示例:Pytorch 中 LSTM 的实现

3.1 使用案例

我使用了 torchtext 的 AG 新闻数据集进行文本分类。输入是新闻文本,分为 10 个类别的标签。

Pytorch 的嵌入用于编码输入。为了实现高效的批处理,每个输入的长度限制为 50。超出的单词将被截断,而短缺的单词将被“DUMMY”填充。请参照本笔记本

3.2《LSTM 执行计划》

以上 LSTM 部分的建筑形象也请参照执行。

3.2.1 遗忘门

*# Forget Gate Calculation*
forget_gate = torch.sigmoid(torch.matmul(embedded_input, self.f_x) + torch.matmul(h, self.f_h) + self.f_b)

3.2.2 输出门

# Output Gate Calculation
output_gate = torch.sigmoid(torch.matmul(embedded_input, self.o_x) + torch.matmul(h, self.o_h) + self.o_b)

3.2.3 输入门

# Input Gate Calculation
input_gate = torch.sigmoid(torch.matmul(embedded_input, self.i_x) + torch.matmul(h, self.i_h) + self.i_b) 

3.2.4 新状态&输出

# mid state for new state calculation
input2_state = torch.tanh(torch.matmul(embedded_input, self.i2_x) + torch.matmul(h, self.i2_h) + self.i2_b)# New State after the LSTM Cell
state = input2_state * input_gate + state * forget_gate# New Output from the LSTM Cell
h = output_gate * torch.tanh(state)

3.2.5 检测结果

我只对这个模型进行了 10 个时期的训练和测试。准确率从 0.29 提高到 0.78。

Done Training with Epoch 9 - Loss: 0.30023258924484253\. Test Accuracy: 0.7806578947368421

4 .结论

在本文中,我简要地谈到了一些 RNN 建筑,我还用 Pytorch 中的一个简单实现来说明 LSTM。RNN 有独特的能力来处理顺序建模问题,RNN 的演变完全是为了从过去中记住尽可能多的重要信息,以便更准确地预测未来。

人在同一条河里走两次 。许多现实生活中的用例是顺序依赖的。我很有信心,除了 LSTM,更新更好的 RNN 将会出现,RNN 将继续在人工智能行业扮演重要角色。

Rasch 模型的贝叶斯方法(项目反应理论)

原文:https://towardsdatascience.com/a-bayesian-approach-to-rasch-models-item-response-theory-cc08805cbb37?source=collection_archive---------20-----------------------

使用 Rasch 模型和 PYMC3 客观地衡量人的表现

客观测量的挑战

客观地衡量个人在评估或测试中的表现*,*提出了独特的挑战。以一个有 20 个问题的测试为例,其中前 15 个很容易,后 5 个比较难。

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

测试分数示例

我们在上面看到,人 A人 B 多答对了 4 道题,B 比人 C 多答对了 4 道题。基于此,我们可以断言人 A人 B 的知识差异与人 B人 C 的知识差异相同。然而,这忽略了测试的一个关键组成部分,即每个问题之间的难度差异。如果人 A 答对了 5 道难题中的 3 道,但人 B人 C 都没有答对任何一道难题,该怎么办?凭直觉,我们会得出这样的结论:A和 B 人的知识差异大于 B和 c人人的知识差异

拉希模型

以乔治·拉希命名的拉希模型旨在通过分析作为两者函数的测试结果来解决上述挑战,即人 能力 和问题 难度 。因此,个人 i 答对问题 q 的概率是个人潜在能力和问题固有难度的函数。

具体而言,Rasch 表明:

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

其中 =个人潜在能力 𝝳 =潜在困难的问题

这简单来说就是能力和难度之差的逻辑回归,潜在能力在潜在难度之上越高,个人答对问题的概率就越高。

目标是根据我们观察到的反馈来评估能力困难。对于 NxM 矩阵(N =回答者数量,M =问题数量),我们需要估计 N 个潜在的能力和 M 个潜在的困难

最大概似法

假设 i.i.d .数据使用上述模型的可能性为:

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

其中𝝈(⍺-𝝳) = (⍺-𝝳) / (1 + e^((⍺-𝝳))

对数似然

对数可能性是:

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

其中𝝈(-𝝳)=(-𝝳)/(1+e^((-𝝳))

目标是找出能够最好地解释我们使用上面的对数似然方程观察到的数据的 𝝳。

贝叶斯方法— PYMC3

Rasch 模型有可能过度拟合,尤其是在小数据的情况下。如下所示,对潜在变量 和𝝳设置独立的先验有助于防止过度拟合,并解决参数的不确定性。

数据

假设我们进行了一次由 16 名学生和 5 个问题组成的大学考试。我们的数据是一个 16x5 的二分矩阵,如下所示。

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

探测

像许多考试分布一样,我们的结果显示了一个钟形曲线(左图),其中大多数学生得到了 40%(只有 2 个问题正确)。请注意,1 名学生答对了所有 5 道题,1 名学生答错了所有题。第二,问题的难度似乎在增加;13/16 的学生答对了问题 A,但只有 3/16 的学生答对了最后一个问题(问题 E)。

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

分数分布(左)和问题难度百分比(右)

模型拟合

下面是 pymc3 的实现,使用先验的正态分布来估计能力难度参数。

结果

参数不确定性

logit 中测量能力难度变量,以便在线性标度(-∞到∞)上表达测量结果。因为我们的贝叶斯方法,我们可以解释“真实”参数的不确定性。每个人会有一个能力的分配,每个问题会有一个难度的分配,如下所示:

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

Logit 中的能力和难度度量

查看能力图表,看起来人 0 具有最高的能力(即,对于该测试最聪明),而人 12 具有最低的能力;尽管每个人都有相当多的不确定性。同样的故事对于潜在的困难;很多不确定性,但很明显,除了问题 B 和问题 c 之外,每个问题的难度都在增加。它们在难度上似乎有相当大的重叠。

模型预测

有了我们现在估计的潜在参数,我们可以预测一个特定的人答对一个特定问题的概率。因为我们的贝叶斯方法,他们的概率是不确定的。

下图显示了两个不同的人(第 5 个人和第 1 个人)答对同一个问题(问题 D)的概率。尽管两者都有很大的不确定性,但看起来人 1 更有可能以 60%的平均概率答对,而人 5 的平均概率为 37%(如三角形所示)。事实上,因为我们有模拟的概率,我们可以断言有 20%的机会第 5 个人比第 1 个人更有可能答对问题 D。

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

在右图中,我们可以看到与被采样的人-问题对的能力难度相关联的联合密度。随着你向图的右下方移动,你的能力和问题难度之间的差异增加,这反过来增加了你回答正确的概率。相反,当你向左上方移动时,问题变得越来越难,你的能力在下降(当然是独立的),这反过来会降低你正确回答问题的概率。

诊断学

在这一部分,我们将讨论如何深入研究我们的结果,以提出更有意义的问题:

  1. 范围 预测概率在人-问题对之间如何变化?
  2. 我们对哪些人的真实能力最没有信心?(也就是说,考试不能区别他们的能力?)
  3. 有没有人的 结果异常

人-问题对概率分布

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

每个问题对的排序 HPD 和期望概率

上图是总结预测和每个人在特定问题上的相关不确定性的简洁方式。对于每个问题,预测按预期概率排序(例如,人 0 具有答对 5 个问题中任何一个的最高预期概率。

个别检查

我们对哪些人的真实能力最没有信心?

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

左边的图像显示了所有 16 个人潜在能力的标准偏差,从最高到最低排序。

请注意,我们对 0 岁和 12 岁的人的真实能力最没有信心。如果我们检查他们的具体测试结果,我们会看到人员 0 答对了所有 5 个问题,而人员 12 答对了所有 5 个问题。这很直观,因为测试不能有效地衡量他们的能力。如果一个人所有的问题都答对了,我们是否认为他是无限聪明的(即有∞能力)?不太可能,他们的能力是有限的,但我们不确定在给定的具体测试其测量。

不寻常的嫌疑人

是否有任何个人的结果可能有问题(例如作弊?幸运的猜测?).使用 Rasch 模型,我们可以计算装备,这只是每个人在所有问题上的 MSE:

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

每个人的装备得分

我们立即注意到,11 号人物的着装得分明显高于其他所有人。当我们检查他们的测试结果时,我们观察到:

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

学生 11 的测试结果

第 11 个人对第一个问题回答错误,但对最后两个问题回答正确。这是一个常见的(也是不适合的)问题,因为前三个问题比最后两个简单。这个人最近两次运气好吗?为什么他们在较简单的问题上做了 0/3,而在较难的问题上做了 2/2?有作弊吗?这套装备对这些异常值很敏感,可以用来揭示这种不寻常的结果。

结论

Rasch 模型提供了一个框架,用于:

  • 设计和分析社会测试和调查(例如,评估员工评论),更重要的是,
  • 使我们能够将本质上可能是非线性的原始测试/调查结果转换为线性标度,以便于比较
  • 确定具有相似难度的问题,以便排除问题
  • 确定问题难度的差距

使用贝叶斯方法对 Rasch 模型至关重要,尤其是在数据有限且不确定性高的情况下。

模型正则化的贝叶斯方法

原文:https://towardsdatascience.com/a-bayesian-take-on-model-regularization-9356116b6457?source=collection_archive---------19-----------------------

入门

在这篇文章中,我们探索了我们如何通过贝叶斯先验信念来正则化和控制模型的复杂性。

我目前正在读斯塔尼斯拉斯·德阿纳的*《我们是如何学习的》*。首先,我不能向任何对学习、教学或人工智能感兴趣的人推荐这本书。

这本书的一个主题是解释为什么人类如此擅长快速学习事物和高效学习神经学心理学基础,即只给予有限的经验。Dehaene 关于为什么人类能够如此有效地学习的主要论点之一是因为我们能够降低我们对世界的模型的复杂性。根据奥卡姆剃刀的原理,我们找到最简单的可能模型,即解释我们经历的数据,而不是选择更复杂的模型。但是为什么我们要这样做,即使是从出生开始?一个论点是,与儿童心理学中的频繁主义观点(相信婴儿完全通过他们的经验学习)相反,我们在出生时就已经被赋予了关于世界的先前的信念。**

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

甚至在我们开始体验这个世界之前,我们的大脑就已经有了固有的知识和惊人的学习能力。娜塔莎·康奈尔在 Unsplash 上的照片

这种简化模型选择的概念在机器学习领域有一个共同的名字:模型正则化。在这篇文章中,我们将从贝叶斯的角度来谈论正则化。

我们有什么方法可以控制从观察中学习的模型的复杂性?我们可以通过在我们的模型分布上放置一个来做到这一点。在我们展示这一点之前,让我们简要回顾一下正则化,在这种情况下,分析正则化用于监督学习。

正规化的背景

在机器学习中,正则化或模型复杂性控制是一种基本和常见的做法,以确保模型获得高样本外性能,即使样本外数据(测试/验证数据)的分布与样本内数据(训练数据)的分布明显不同。本质上,模型必须平衡具有小的经验损失(它在给出的数据上有多“错误】)和小的正则化损失(模型有多复杂)。

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

在正则化中,模型学习在经验损失**(其预测有多不正确)和正则化损失(模型有多复杂)之间进行平衡。照片由古斯塔沃·托雷斯Unsplash 上拍摄**

在监督学习中,正则化通常通过 L2 (Ridge)⁸,L1 (Lasso)⁷,或 L2/L1(elasticnet)⁹)正则化来完成。对于神经网络,也有辍学早期 Stopping⁴** 等技术。现在,我们将集中于分析正则化技术,因为它们的贝叶斯解释更加明确。这些技术总结如下。**

让我们首先定义我们的数据集参数**😗*

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

接下来,对于给定的监督学习问题,其中我们希望最小化损失函数(例如,均方误差):

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

然后,对于每种类型的分析监督正则化技术,我们有以下目标:

  • L2(山脊):参数的平方值的处罚(L2 常模)。直观上,这限制了模型参数的大小,同时最小化了模型预测的“错误”程度。

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

  • L1(拉索):参数的绝对值(L1 定额)。直观上,这将一些系数约束为零。你可能注意到下面的正则项是不可微的;这种不可微性导致系数取 0 或非 0 value⁵.

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

  • L2/L1 (ElasticNet): 这种正则化技术惩罚了参数向量的 L1L2 范数,导致来自 L1L2 回归的正则化结果的组合。

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

下面是一个对比图,显示了套索弹性网规则化的标准图,每个都绘制在一个单位球体上。生成该图的代码可以在附录中找到。

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

说明规则化不同效果的图。左:套索,中:弹力网,右:脊。

总之,这些正则化技术实现了控制模型复杂性的不同目标。在下一部分中,我们将通过将先验信念(以概率分布的形式)强加到我们的模型参数上来导出这些正则化目标,从而直接在先验信念模型正则化之间建立联系。****

作为模型先验信念的模型正则化

让我们通过对模型参数的先验信念,更深入地探究实现正则化背后的概率和优化理论。具体来说,我们将证明:

  1. L2 正则化(吉洪诺夫 Regularization⁶的特例)通过多元高斯先验实现
  2. L1 正则化(LASSO) 是通过多元拉普拉斯先验实现的****

我们将分析回归问题的这些主张,但它们也扩展到其他监督学习任务,如分类。我们将专注于严格地呈现这些主张背后的数学原理(你也可以在本文这里找到这些推导)。让我们开始吧!

作为多元高斯先验的 L2(岭)正则化

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

直观地说,当使用脊正则化时,我们在模型学习的曲面/超曲面中创建一个脊。杰里米·毕晓普在 Unsplash 上的照片

假设我们再次具有相同的一组观察值 D 和一个参数向量 w ,我们想要优化该参数向量以便对来自 D:

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

使用最大后验概率(MAP)规则,我们可以表明,当我们在 w 上调用高斯先验分布时, w 的后验分布的均值和众数就是岭回归的解。我们首先调用贝叶斯规则:

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

我们现在定义先验和观测模型分布,假设如下:

a .先验模型(参数 w 上的分布):

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

b .观察模型(观察值的条件分布 D 以参数为条件):

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

现在,让我们把这些表达式代入贝叶斯法则:

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

为了导出我们的 L2 正则化的估计量,我们现在使用映射规则负对数似然函数将乘积上的表达式转换成和上的表达式。

该操作是允许的,因为:

(I)目标的对数是似然函数的严格单调变换,因此取对数似然函数的最大自变量将保持似然目标的基数并产生相同的最大化自变量。**

(二)任一目标 J( θ )的最大化自变量与负目标 J( θ )的最小化自变量相同。****

因此,论点 w最大化对数似然将最小化负对数似然:***

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

将我们的后验分布代入负对数似然的表达式:

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

由于对数将乘积转换成和,我们可以将乘积的对数分解成依赖于我们的参数 w 的求和项的和,以及不依赖于 w 的常数。然后,我们可以使用对数规则来简化这个表达式。

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

(请注意,在第一行中,我们省略了常数,以便将该方程放在一行中。)

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

移除不依赖于我们的参数 w 的项,将表达式乘以常数σ,我们得到:

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

λ = σ / τ 的设置使得我们的 MAP 估计量也是通过岭回归得到的估计量(当我们的数据以 0 为中心时)😗***

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

这与我们上面的山脊目标(用于回归)完全一致!在封闭形式中,这产生了正规方程:

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

其中λI 项用于确保待求逆的矩阵(X^T X)是半正定的,因此是可逆的。

因此,在我们的参数上放置一个多元高斯先验相当于用一个 L2 范数惩罚来正则化我们的参数****

作为多元拉普拉斯先验的 L1(拉索)正则化

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

利用套索正则化,我们鼓励稀疏性,即把对减少经验损失没有多大贡献的模型系数设置为零。马库斯·斯皮斯克在 Unsplash 上拍摄的照片

**我们现在将检查一个具有**拉普拉斯先验的类似情况。再次假设我们有一个观察值 D 的数据集和一个参数向量 w ,我们希望对其进行优化,以便对来自 D:

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

再次使用映射规则,当我们在 w 上调用高斯先验分布时,我们可以表明 w 的后验分布的均值和众数是套索回归的解。我们首先调用贝叶斯规则:

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

我们现在定义先验和观测模型分布,假设如下:

a .先验模型(参数 w 上的分布):

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

b .观察模型(分布同上):

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

重复上述步骤(参考下文):

  1. 使用映射规则写出参数的后验分布和最优参数 w*
  2. 地图目标中导出负对数似然函数
  3. 负对数似然中移除不依赖于 w 的项
  4. ****适当设置超参数 p、q、α1、α2。

下面是套索的相应推导:

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

****(注意上一步我们设置 p = 1,q = 1,λ = α_1 / α_2 。)

如前所述,我们已经得到了我们的套索目标(用于回归),如上一节所述!

为什么这很重要?

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

照片由 Unsplash 上的 Dmitry Ratushny 拍摄

虽然看起来我们所做的只是调用一些优化、对数和概率分布的技巧,但上述推导的意义可能在前面提到的小说“我们如何学习”的上下文中得到最好的理解。

如果我,一个人类,正在学习一个世界的模型,为什么我倾向于最简单的模型来解释我的观察?其中一个原因是,我们的大脑甚至在学习之前就对我们学习的模型建立了“先验信念”,这是我们从经验中学习时考虑的因素。然而,我们不是仅仅从经验中学习这些模型,而是用经验来更新我们以前对这些模型的信念。

通过预先相信我们学习的模型必须尽可能简单,我们能够控制我们学习的模型的复杂性,甚至在我们学习它们之前!这正是我们在上面的分析推导中所做的:通过对模型参数分布的先验信念(即“模型参数 w正态分布”),我们能够直接确定这些模型有多复杂。

摘要

在本文中,我们介绍了模型复杂性和正则化 的概念,以及这些概念如何与先验信念的概念相关联。我们声称,我们可以控制模型的复杂性,即正则化它,通过对我们的参数分布设置先验信念。然后,我们简要介绍了一些常见的分析,监督正则化技术(岭,套索,和弹性网回归)。然后,我们展示了如何分别使用多元高斯和拉普拉斯先验分布来推导脊正则化和套索正则化的目标函数。最后,我们讨论了为什么这些结果不仅对机器学习,而且对心理学都很重要。****

感谢阅读:)更多强化学习、计算机视觉、编程、优化方面的文章请关注我!

另外,非常感谢 CODECOGS在线方程式渲染工具!如果你想在你的中等文章中渲染数学,这是非常有用和容易使用的。

参考

[1]德阿纳,斯塔尼斯拉斯。我们如何学习:为什么大脑比任何机器都学得好……目前来说。企鹅,2020。

[2]拉斯姆森,卡尔爱德华,和邹斌 Ghahramani。“奥卡姆剃刀”神经信息处理系统的进展(2001):294–300。

[3] Srivastava,Nitish 等人,“辍学:防止神经网络过度拟合的简单方法。”机器学习研究杂志15.1(2014):1929–1958。

[4]卡鲁阿纳、里奇、斯蒂夫·劳伦斯和李·贾尔斯"神经网络中的过度拟合:反向传播、共轭梯度和早期停止."神经信息处理系统的进展(2001):402–408。

[5]罗伯特·蒂布拉尼。"通过套索的回归收缩和选择."皇家统计学会杂志:B 辑(方法学)58.1(1996):267–288。

[6]卡尔维蒂、丹妮拉和洛萨·赖歇尔。"大型线性问题的吉洪诺夫正则化."位数值数学 43.2(2003):263–283。

[7]罗伯特·蒂布拉尼。“通过套索的回归收缩和选择.”《皇家统计学会杂志:B 辑(方法论)》58.1(1996):267–288。

[8]霍尔、阿瑟·e 和罗伯特·w·肯纳德。"岭回归:非正交问题的有偏估计."技术计量学12.1(1970):55–67。

[9]邹、惠和特雷弗·哈斯蒂。"通过弹性网的正则化和变量选择."皇家统计学会杂志:B 辑(统计方法学)67.2(2005):301–320。

附录

生成图的代码(改编自这个堆栈溢出帖子)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值