TowardsDataScience 博客中文翻译 2019(四十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

一切都是手段

原文:https://towardsdatascience.com/all-about-means-c8b800d0b874?source=collection_archive---------34-----------------------

“意味着”是什么意思?!

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

Photo by Antoine Dautry on Unsplash

正如我在其他文章中提到的,我喜欢数学。我喜欢它,因为它不是数字运算。我提到数学依赖于它的公理和定义系统。我也喜欢思考定义和开发新的定义,从不同的角度来看待一个概念。

在数学中,大多数被讨论的对象都有很好的定义,即使这些定义很复杂。圆是与给定中心等距的点的轨迹。距离是满足某些性质的函数。从集合 X 到集合 Y 的函数 f 是有序对(X,Y)的集合,其中 x ∈ X,y ∈ Y,并且其中集合中没有两个元素具有相同的 X 值:(1,2)和(1,3)是不允许的。使用各种公理化方法,偶数集被很好地定义。

但是当涉及到手段时,定义变得更加模糊。平均值是中心的量度。好吧。什么中心?通过以这种方式定义平均值,我们已经引入了几何,这可能会掩盖我们正在做的事情。

此外,实际上有许多种手段。有算术平均值,这是最常用的。这就是你把所有的数字加在一起,然后除以你相加的数字。还有几何平均数,你把所有的数字相乘,取 n 次方根。

理解哪种方法在哪种情况下起作用实际上非常重要。当我们应该使用几何平均数时,使用算术平均数会给我们带来非常不同的结果,这是行不通的。几何平均数通常用于计算平均利率、增长率,以及在其他情况下,我们会重复地将乘法应用于我们的结果。

这就引出了我对手段的看法。作为一个兼职项目,我一直在研究这个术语的一些概括和定义。

定义

我们对手段了解多少?对于算术平均,几何平均,甚至一些其他的平均,我们有一些有序的对象集合,我们对这个集合进行操作得到一些结果。当我们用平均值替换集合中的每一项时,它会给出相同的最终结果。

例如,使用算术平均值,我们将集合相加,然后除以集合中的项目数。{1,2,3}得出算术平均值为 2。所以让我们用 2 代替集合中的每个数字。{2,2,2}是我们的新系列。如果我们将这些数字相加,我们得到 6,这正是我们将原始集合相加得到的结果。所以在求和下,2 是{1,2,3}的均值。

现在我们对均值的基本工作原理有了一个坚实的理解。我们获取一个有序的集合并对其进行操作。如果用另一个值替换集合中的所有元素得到相同的结果,那么该值就是平均值。但是在这种情况下,我们需要知道我们对集合应用了什么样的操作。

存在性和唯一性

因为这个定义非常宽泛,甚至不一定是对数字的运算,而是可以是任何类型的集合,所以我们并不总是保证某个给定集合的平均值。因此,均值的存在成为一个重要的研究课题。

同样,平均值不必是唯一的。可能有两个值,甚至无限个值,会给出相同的结果。所以独特性也是一个重要的研究课题。

与组和 n 次根的关系

组是数字的抽象。它们的功能与我们通常的数字系统非常相似。它们由元素集合和乘积运算组成,乘积运算将组中每对元素的乘积分配给组中的另一个元素(运算是封闭的)。

这样的对象还必须满足一些其他条件才能被认为是一个组。必须有一个单位元,使得这个单位元和群中一个单位元的乘积就是这个单位元,就像我们通常的数系中一是乘法下的单位元一样。每个元素也必须有一个逆,这样元素和它的逆的乘积就等于恒等式。并且产品操作必须是关联的。

总的来说,通过研究群体,我们可以学到很多关于数字和其他类型的类似系统的知识。与方法讨论相关的一个有趣领域是 n 次方根。x 的 n 次方根是这样一个值,如果我们将它自身乘以 n 次,我们得到 x。对于实数,这是我们最常用的数字类型,n 次方根总是存在的,并且是唯一的。只有一个值能满足要求。

但是对于群体,可能有许多合适的价值,或者根本没有价值。由于 n 次根符合均值的定义,在重复乘积的运算下,n 次根的存在唯一性对于一般的均值理论是有见地的。

这一切意味着什么

本质上,虽然大多数数学都有明确的定义,但由于某种原因,均值的概念在很大程度上没有严格的定义。但是如果我们对过程进行足够的抽象,我们真的可以感觉到发生了什么: 我们想要一个值,我们可以用它来替换我们正在操作的所有值,同时仍然得到相同的结果 。那是一个意思。谁知道呢?这种对数学结构的抽象思考方式往往会带来新的发现。那很好,对吧?

<大师指数 | 哲学 |

关于丢失数据处理的所有内容

原文:https://towardsdatascience.com/all-about-missing-data-handling-b94b8b5d2184?source=collection_archive---------1-----------------------

深入分析

缺失数据插补技术

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

Image by Gerd Altmann from Pixabay

缺失数据是数据专业人员需要处理的日常问题。虽然已经有很多文章、博客、视频,但我发现很难在一个地方找到一条简明的综合信息。这就是为什么我把我的努力放在这里,希望它将对任何数据从业者或爱好者有用。

什么是缺失数据?缺失数据被定义为不可用的值,如果被观察到,这将是有意义的。丢失的数据可能是序列丢失、特征不完整、文件丢失、信息不完整、数据输入错误等。现实世界中的大多数数据集都包含缺失数据。在使用带有缺失数据字段的数据之前,您需要转换这些字段以用于分析和建模。像数据科学的许多其他方面一样,这实际上也可能是艺术多于科学。理解数据及其来源领域非常重要。

数据中缺少值不一定是一种挫折。尽管如此,这仍然是一个执行正确的特征工程来指导模型以正确的方式解释缺失信息的机会。有机器学习算法和软件包可以自动检测和处理缺失数据。但是,仍然建议通过分析和编码策略手动转换缺失的数据。首先,我们需要了解缺失数据的类型。失踪大致分为三类:

完全随机失踪(MCAR)

当我们说数据是完全随机缺失时,我们的意思是缺失与被研究的观测值(完全观测变量(X)和部分缺失变量(Y))无关。例如,电池没电的体重秤、邮寄过程中可能丢失的问卷,或者实验室中可能损坏的血液样本。MCAR 是一个理想但不合理的假设。一般来说,当数据因设计、设备故障或样品在运输途中丢失或技术上不令人满意而丢失时,数据被视为 MCAR。MCAR 数据的统计优势是分析保持无偏。下面是 MCAR 的示意图,其中缺失与数据集变量 X 或 Y 无关。思念与 X 或 Y 无关,而是与其他原因 z 有关。

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

Image by Author

让我们来看一个移动数据的例子。这里,一个样本有一个缺失值,不是因为数据集变量,而是因为另一个原因。

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

Image by Author

随机失踪(MAR)

当我们说数据随机缺失时,我们的意思是部分缺失变量(Y)上的缺失数据与分析模型中的一些其他完全观察到的变量(X)有关,而与 Y 本身的值无关。

MAR 的图示如下,其中缺失与数据集变量 X 有关,但与 y 无关。它可以有其他关系(Z)。它与丢失的信息没有特别的关系。例如,如果一个孩子因为生病而没有参加检查,这可能可以从关于孩子健康的其他数据中预测出来,但这与我们在孩子没有生病的情况下检查的内容无关。有些人可能认为标记不存在问题。但是,MAR 并不意味着可以忽略缺失的数据。

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

Image by Author

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

Image by Author

非随机缺失(MNAR)

如果数据字符不符合 MCAR 或 MAR,则属于非随机丢失(MNAR)类别。当数据缺失而非随机缺失时,缺失与缺失的内容特别相关,例如,一个人没有参加药物测试是因为他前一天晚上服用了药物。一个人没有参加英语水平测试,因为他的英语语言能力很差。MNAR 数据的情况是有问题的。在这种情况下,获得参数无偏估计的唯一方法是对缺失数据进行建模,但这需要对缺失变量有正确的理解和领域知识。然后,该模型可以合并到一个更复杂的模型中,用于估计缺失值。MNAR 的图示如下,其中缺失直接将与变量 Y 联系起来。它可以有其他关系(X & Z)。

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

Image by Author

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

可以应用几种策略来处理缺失数据,以建立机器学习/统计模型。

试图获得缺失的数据。

在类似调查的情况下,这在数据收集阶段是可能的,在这种情况下,在回答者离开房间之前,可以检查是否完整地捕获了调查数据。有时,可以从数据源获取数据,比如再次询问遗漏的问题以获得回答。在真实的场景中,这是解决丢失数据问题的一种不太可能的方式。

有教养的猜测

这听起来很武断,并不是一个可取的做法,但人们有时可以根据其他响应推断出一个丢失的值。例如,对于相关的问题,如那些经常出现在矩阵中的问题,如果参与者的回答全是“2”,则假设缺失的值是 2。

丢弃数据

1)列表式(全病例分析 CCA)删除

处理缺失数据的最常见方法是忽略缺失数据的案例,并分析剩余数据。这种方法被称为完整案例(或可用案例)分析或列表式删除。

如果有足够大的样本,其中权力不是一个问题,并满足 MCAR 的假设,列表式删除可能是一个合理的策略。然而,当没有大样本或者 MCAR 假设不满足时,列表删除就不是最优策略。如果不能满足 MCAR 的要求,它还会引入偏见。

删除后参考下面的样本观察

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

Image by Author

2)成对(可用案例分析 ACA)删除

在这种情况下,仅忽略缺失的观察值,并对存在的变量进行分析。如果数据集中的其他地方缺少数据,则使用现有的值。由于成对删除使用所有观察到的信息,它比列表删除保留更多的信息。

已知成对删除对 MCAR 或 MAR 数据的偏倚较小。然而,如果有许多遗漏的观察值,分析将是有缺陷的。成对删除的问题是,即使它采用了可用的案例,人们也不能比较分析,因为它们每次都是不同的。

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

Image by Author

3)删除变量

如果某个变量缺少太多数据,可以选择从数据集中删除该变量或列。这方面没有经验法则,但要视情况而定,在完全放弃变量之前,需要对数据进行适当的分析。这应该是最后一个选项,我们需要检查删除变量后模型性能是否提高。

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

Image by Author

保留所有数据

任何插补技术都旨在产生一个完整的数据集,然后可以用于机器学习。我们有几种方法可以进行插补,以保留所有数据用于分析和构建模型。

1)平均值、中值和众数

在这种插补技术中,目标是用缺失值的统计估计值替换缺失数据。平均值、中间值或众数可用作插补值。

在均值替换中,使用变量的均值来代替同一变量的缺失数据值。这样做的好处是不会改变该变量的样本均值。均值替换的理论背景是均值是从正态分布中随机选择的观察值的合理估计。然而,对于非严格随机的缺失值,尤其是在不同变量的缺失值数量存在巨大差异的情况下,均值替换法可能会导致不一致的偏差。原始方差的失真和与数据集中剩余变量的协方差的失真是这种方法的两个主要缺点。

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

Image by Author

当变量具有偏态分布时,可以使用中位数。

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

Image by Author

Mode 的基本原理是用最频繁出现的值替换缺失值的总体,因为这是最有可能发生的情况。

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

Image by Author

2)上次意见结转(LOCF)

如果数据是时间序列数据,最广泛使用的插补方法之一是结转最后一次观察值(LOCF)。每当缺少某个值时,就会用最后观察到的值替换它。这种方法是有利的,因为它易于理解和交流。尽管这种方法很简单,但它强烈假设结果的值不会因缺失数据而改变,这在许多情况下似乎不太可能。

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

Image by Author

3)下一次观察向后进行(NOCB)

类似的方法如 LOCF,工作原理相反,在丢失值后进行第一次观察,然后 c 将其向后排列(“向后进行下一次观察”,或 NOCB)。

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

Image by Author

4)线性插值

插值是一种数学方法,它根据数据调整函数,并使用该函数来外推缺失的数据。最简单的插值类型是线性插值,即在缺失数据之前的值和值之间进行插值。当然,我们可能有一个非常复杂的数据模式,线性插值是不够的。有几种不同类型的插值。只是在熊猫中,我们有如下选项:“线性”、“时间”、“索引”、“值”、“最近”、“零”、“线性”、“二次”、“三次”、“多项式”、“样条”、“分段多项式”等等。

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

Image by Author

5)公共点插补

对于评定等级,使用中间点或最常选择的值。例如,在五分制中,用 3(中点)或 4(最常见的值)代替(在许多情况下)。它类似于平均值,但更适用于序数值。

6)添加类别以捕获 NA

对于分类变量,这可能是最广泛使用的缺失数据插补方法。这种方法包括将缺失数据视为变量的附加标签或类别。所有缺失的观察值都被分组到新创建的标签“缺失”中。它没有对价值缺失做任何假设。当丢失数据的数量很大时,它非常适合。

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

Image by Author

7)频繁的类别插补

用最常见的类别替换缺失值相当于均值/中值插补。它包括用变量中出现频率最高的标签或类别替换变量中所有缺失的值。

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

Image by Author

8)任意值插补

任意值插补包括用任意值替换变量中所有缺失值。理想情况下,任意值应不同于中值/平均值/众数,并且不在变量的正常值范围内。通常使用的任意值是 0,999,-999(或其他 9 的组合)或-1(如果分布为正)。有时,数据已经包含来自发起者的缺失值的任意值。这对于数值主要为正值的数字特征和一般的基于树的模型相当有效。当开箱即用的机器学习库和算法不太擅长处理缺失数据时,这曾经是一种更常见的方法。

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

Image by Author

9)添加变量以捕获 NA

当数据不是完全随机缺失时,我们可以通过创建一个额外的变量来表示该观察数据是否缺失(1)来捕捉缺失的重要性(0)。附加变量是二进制的:它只取值 0 和 1,0 表示该观察值存在,1 表示该值缺失。通常,进行均值/中值插补是为了添加一个变量,以捕捉那些数据缺失的观察结果。

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

Image by Author

10)随机抽样插补

随机抽样插补法原则上类似于均值/中值插补法,因为它的目的是保留原始变量的统计参数,因为数据是缺失的。随机抽样包括从可用观测值池中随机抽取一个观测值,并使用随机抽取的值填充 NA。在随机抽样中,变量中存在的缺失值越多,随机观察的次数就越多。随机样本插补假设数据完全随机缺失(MCAR)。如果是这种情况,用从原始变量分布中提取的值替换丢失的值是有意义的。

多重插补

多重插补(MI)是一种处理缺失数据的统计技术。MI 的关键概念是使用观察数据的分布来估计缺失数据的一组似是而非的值。随机成分被纳入这些估计值,以显示其不确定性。创建多个数据集,然后单独但相同地进行分析,以获得一组参数估计值。估计被组合以获得一组参数估计。多重插补的好处在于,恢复缺失值的自然可变性包含了缺失数据导致的不确定性,从而产生有效的统计推断。作为处理一个以上缺失变量的灵活方法,应用链式方程多重插补(MICE)方法。有关 MI 和 MICE 的更多信息,请参考参考部分。下面是老鼠的示意图。

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

Image by Author

估算缺失数据的预测/统计模型

这应该结合一些交叉验证方案来完成,以避免泄漏。这可能非常有效,并有助于最终的模型。这种预测模型有许多选择,包括神经网络。这里我列举了几个非常受欢迎的。

线性回归

在回归插补中,使用现有变量进行预测,然后代入预测值,就像实际获得的值一样。这种方法有几个优点,因为与列表或成对删除相比,插补保留了大量数据,避免了显著改变标准偏差或分布形状。然而,正如在均值替换中一样,虽然回归插补替换了从其他变量预测的值,但没有增加新的信息,同时样本量增加了,标准误差减少了。

随机森林

随机森林是一种适用于各种变量类型的非参数插补方法,适用于随机缺失和非随机缺失的数据。随机森林使用多个决策树来估计缺失值,并输出 OOB(随机)插补误差估计值。一个警告是,随机森林最适合大型数据集,在小型数据集上使用随机森林有过度拟合的风险。

k-NN (k 近邻)

k-NN 基于最近的 K 近邻估算缺失的属性值。基于距离度量来确定邻居。一旦确定了 K 个邻域,就通过采用缺失属性的已知属性值的平均值/中值或模式来估算缺失值。

最大概似法

观测数据是从多元正态分布中抽取的样本这一假设相对容易理解。在使用可用数据估计参数之后,基于刚刚估计的参数来估计缺失数据。几种策略是使用最大似然法来处理缺失数据。

期望最大化

期望最大化(EM)是用于创建新数据集的最大似然方法。所有缺失值都用最大似然法估计的值进行估算。这种方法从期望步骤开始,在此期间估计参数(例如方差、协方差和均值),可能使用列表删除。这些估计值随后用于创建回归方程来预测缺失的数据。最大化步骤使用这些等式来填充缺失的数据。然后用新的参数重复期望步骤,确定新的回归方程来“填充”缺失的数据。重复期望和最大化步骤,直到系统稳定。

灵敏度分析

敏感性分析被定义为研究如何将模型输出中的不确定性分配给其输入中的不同不确定性来源。当分析缺失数据时,对缺失数据进行额外的假设,这些假设通常适用于主要分析。然而,这些假设的正确性无法得到明确的验证。因此,国家研究委员会建议进行敏感性分析,以评估结果对 MAR 假设偏差的稳健性。

支持缺失值的算法

并不是所有的算法在数据缺失时都会失败。某些算法可以对缺失数据保持稳健,例如 k-最近邻,当值缺失时,这些算法可以忽略距离度量中的列。某些算法可以在构建预测模型时将缺失值用作唯一的不同值,例如分类树和回归树。像 XGBoost 这样的算法会考虑任何丢失的数据。如果你的插补效果不好,尝试一个对缺失数据稳健的模型。

推荐

缺失数据会降低模型的能力。一些缺失数据是意料之中的,目标样本量会增加以考虑到这一点。然而,这并不能消除潜在的偏见。在研究的设计和执行以及对结果数据的分析中,应更多地关注缺失数据。机器学习模型技术应仅在尽最大努力减少设计和预防技术中的缺失数据后执行。

强烈建议对缺失数据进行具有适当机制和假设的有效统计分析。大多数插补技术都会造成偏差。很难知道多重插补还是完全最大似然估计是最好的,但两者都优于传统方法。这两种技术最适用于大样本。一般来说,在分析有缺失数据的数据集时,多重插补是一种很好的方法。

只需每月 5 美元,就可以无限制地获取最鼓舞人心的内容……点击下面的链接,成为媒体会员,支持我的写作。谢谢大家!
【https://baijayanta.medium.com/membership】

参考:

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3668100/

https://leportella . com/English/2019/01/14/interpolation . html

https://www . research gate . net/publication/220579612 _ Missing _ Data _ attraction _ Techniques

http://www.stat.columbia.edu/~gelman/arm/missing.pdf

感谢阅读。可以联系我@ LinkedIn

我想要的圣诞礼物就是人工智能:用 LSTMs 写出下一部圣诞大片

原文:https://towardsdatascience.com/all-i-want-for-christmas-is-ai-write-the-next-christmas-hit-using-lstms-2e95ea3da25e?source=collection_archive---------35-----------------------

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

如何用一些奇怪的人工智能生成的圣诞歌词来给你的假期增添趣味

厌倦了失去威猛的一击?你是否暗自希望克里斯蒂娜·阿奎莱拉从未出生?你害怕麦可·布雷每年的回归胜过一切吗?
嗯,事实证明在不久的将来我们可能会有几十亿多

可怕吧。

用 AI 生成文本是数据科学家能够完成的最完整和令人满意的任务之一:我们处理网页抓取非结构化数据预处理数据探索模型设计超参数调优、数小时的培训以及——最重要的是——我们能够获得最终的、可触知的结果

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

The most common words in the lyrics of the 20 most popular Christmas songs (from Vivid Seats)

鉴于一年中的时间和圣诞颂歌主题的可预测性(这里是圣诞老人,那里是耶稣,红色,白色,四周是雪,圣诞树,快乐,幸福,我们完成了),这里我们将尝试生成圣诞主题的歌词。

语言模型

自动生成歌词是一项琐碎的任务。生成文本序列的一般方法是训练一个模型,在给定所有先前单词/字符的情况下预测下一个单词/字符。为文本生成脚本提供动力的引擎被称为统计语言模型,或者简称为语言模型。

统计语言模型

语言模型是一种概率模型,它可以预测序列中的下一个单词,给定之前单词本身的序列试图捕捉它所训练的文本的统计结构(即潜在空间)。从技术上来说,它只是一系列单词 P ( w1,w2,…,wₘ )的概率分布,从中我们迭代得出最有可能的下一个单词评估 P ( wₙₑₓₜ | w1,w2,…,wₘ )。这也是当谷歌自动完成我们奇怪的查询(提供更奇怪的建议)和我们无聊的圣诞祝福邮件时幕后发生的一部分。

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

Apparently, Google Search doesn’t have a good opinion on Christmas songs either

基于字符的神经语言模型

语言模型也可以在字符级别开发。基于字符的语言模型的主要好处是它们的小词汇量和处理任何单词、标点符号和特定文本结构的灵活性。这是以拥有更大的模型和更长的训练 为代价的。
如今用于构建语言模型的最常见的 ML 技术家族是递归神经网络 (RNNs),这是一种功能强大的神经网络,能够记住并通过其隐藏状态神经元处理过去的信息。

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

A simple example of RNN (with a single 3-units hidden layer) forward pass using the training sequence “hello”. For each (one-hot encoded) character in the sequence, the RNN predicts the next character assigning a confidence score to every character in the vocabulary ([“h”, “e”, “l”, “o”]). The objective of the network is to learn the set of weights that maximizes the green numbers in the output layer and minimize the red ones.

当足够的数据可用时,具有 长短期记忆 (LSTM)味道的 rnn 更受欢迎,因为它们可以捕捉更复杂的文本依赖,并更好地处理爆炸/消失梯度问题

圣诞歌词生成器

为了生成我们的圣诞歌词,我们需要一个合适的数据源。对我们来说幸运的是,互联网上有大量的歌词网站,可以很容易地搜索到。

数据准备

一旦我们获得了数据源,我们就需要构建语料库,导入原始文本并应用一些普通的文本预处理,如(不需要的)标点删除和小写。
由于我们正在研究基于字符的语言模型,文本必须映射到字符级。因此,必须建立一个独特的字符词汇表
我们神经网络的输入将是字符序列。因此,我们将语料库分成 maxlen 大小的序列,对每个步骤字符进行采样。

模型设计和培训

在本文中,我们将尝试构建最简单的基于字符的神经语言模型:一个 128 大小的单层 LSTM,带有 softmax 激活
记住输入序列和输出必须是一键编码

该网络被训练 1000 个时期,尽管在 500-600 个时期后损失似乎停止显著下降。

(根据您的硬件,这可能需要几个小时到几天的时间。为了在合理的时间框架内训练您的模型,您可以随意减少历元的数量)

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

The loss stops decreasing significantly after 500 epochs approximately

文本生成

一旦模型训练完毕,我们就可以开始预测了。给定一个字符序列,该模型使用它的权重来输出一个字符分布,从这里我们可以对下一个字符进行采样,只要我们愿意,就可以重复这个过程。我们从输出分布中抽取下一个字符的方式至关重要

如果我们总是选择最有可能的单词,语言模型训练目标会导致我们陷入循环中,如圣诞快乐。圣诞快乐。圣诞快乐”。公平地说,这可以被认为是一首合法的圣诞颂歌,但可能不是我们想要在这里实现的。

即使我们从分布中取样,我们仍然需要小心,因为最不可能的记号可能代表大部分的概率质量。例如,让我们考虑一下,字符记号的底部 50%具有 25%的总概率。这意味着我们有 1/4 的机会去越野,导致不可阻挡的误差传播贯穿整个生成过程。

受统计热力学启发,温度 采样是文本生成最常用的采样方法之一。这里的高温意味着更可能遇到低能态。因此,温度越低,模型对其首选越有信心,而温度高于 1 会降低信心。

结果

让我们看看使用 0.2 的温度和种子会得到什么:

“感谢上帝今天是圣诞节
一天。感谢上帝,今天是圣诞节

第一个纪元之后,我们实现了这样的东西:

“感谢上帝,今天是圣诞节。感谢上帝,今天是圣诞节

e

一个男孩爱上了这个女孩,但是他却爱上了这个女孩

他把所有的人都带到了 tt

以色列人在那里居住,所以他们在 etr 居住

awrmsesur ru uete errea […]" "

显然,该模型没有时间学习任何关于它所训练的语料库的语言。以下是《T21》10 个时代之后的歌词:

“感谢上帝,今天是圣诞节。感谢上帝,今天是圣诞节,我不想要你这个小槲寄生和星星中的星星

孩子们和星星们。我想要星星中的星星,星星和圣诞老人我想看圣诞树。[…]"

看起来 10 个时代足以理解如何将字符粘在一起以获得单词和句子,但仍然不足以学习语言本身的更高结构。请注意,生成的模型让陷入了“星星”这个词的循环,通常无法生成有意义的东西
经过 100 个时期,我们得到:

“感谢上帝,今天是圣诞节
一天。感谢上帝,今天是圣诞节,新年快乐,我会喜欢这个世界

在槲寄生上的每一个角落,我都希望我能知道,我希望你能感受到你的血液,但我不能在圣诞节把我带回家

当圣诞夜来临的时候,我想唱圣诞节早晨天空的歌,因为雪正在飘落……”

这已经是一个不识字的克里斯蒂娜·阿奎莱拉人能唱的了。圣诞颂歌的结构和反复出现的主题开始出现,同时还有令人毛骨悚然的废话,比如“我希望你的窗户变成你的血”这听起来更像黑色金属而不是圣诞节。
快进到 1000 个纪元:

“感谢上帝,今天是圣诞节。感谢上帝,今天是圣诞节,你会成为你想要的人,祝你快乐。

真是个又亮又丑的
和妈妈早知道了
我不要你的道听途说
我已经容不下你一个小屁孩了,命运

我希望你身边有个男人。
她为雪搬运一件东西。圣诞节到了,圣诞节到了,圣诞节没有给我一首圣诞歌,圣诞钟声响起。[…]"

现在我们肯定有收获了!废话仍然存在,但歌词的整体质量是体面的,整个事情可能听起来有意义。
最后,我们可能会考虑用我们模型的超参数稍微调整一下**。例如,我们可以尝试对更长和/或更远的输入序列进行采样,在数据预处理阶段增加 maxlenstep 参数。直观地说,增加输入序列的最大长度意味着给模型提供更多的上下文来学习,所以我们期待更好的结果。
这是当 maxlen 从 70 增加到 120 时我们可以得到的结果:**

“[……]打开我们天堂般的家
让通往天堂的路变得安全
关闭通往痛苦的道路。

哦,来吧,摇一摇
一首圣诞歌的花
我整晚都有点醉
在一个正确的酒吧局,哈利路亚?

我相信有圣诞老人,我相信我会在街上看到他把所有的玩具都搬出来

格洛丽亚。透过天空的雪花看故事圣诞树,哦,圣诞节。
上帝之子出生之子而降
上帝之子出生之子而降

我要送星星和雪
,我想要一只河马。[…]"

不确定它是否能被认为在质量上比前一个更好,但明年圣诞节我也会要一只河马。

结论

未来的发展

单层 LSTMs 只是神经语言建模的起点,因为可以设计出更多的复杂网络 来更好地解决文本生成的问题。
我们已经看到了超参数如何在开发一个像样的文本生成器中发挥重要作用。因此,我们可能会考虑在我们的网络中堆叠更多(更大)的层,以调整批量大小,并对不同的序列长度和温度进行更多实验。

进一步阅读

为了让每个人都能阅读,本文有意避免深入研究神经网络和 NLP 的数学和概率基础。这里有一个资源列表,您可以在其中探索我们留下的一些主题:

请在评论区留下你的想法和建议,如果你觉得这有帮助,请分享!

[## Tommaso Buonocore -软件工程师- AMC 医学研究 BV | LinkedIn

查看世界上最大的职业社区 LinkedIn 上 Tommaso Buonocore 的个人资料。托马索列出了 5 项工作…

www.linkedin.com](https://www.linkedin.com/in/tbuonocore/)

一体化图像去雾(AOD) —论文说明和 Tensorflow 实施

原文:https://towardsdatascience.com/all-in-one-image-dehazing-aod-paper-explanation-tensorflow-implementation-bb97f6a6f1ef?source=collection_archive---------14-----------------------

李博一等对《网:一体化去雾网》论文的解读。艾尔。(ICCV 2017)以及在 Tensorflow 中实现相同功能的教程

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

介绍

雾霾会降低图像质量并限制可见度,尤其是在室外环境中。这因此影响了其他高级任务的性能,例如物体检测和识别。

李博一等人提出的 AOD 网络。艾尔。是一个端到端的 CNN 来消除图像的模糊。AOD 将模糊图像作为输入,并生成去模糊图像。

在这篇文章中,我解释了 AOD 网络论文的主要组成部分,并提供了在 Tensorflow 中实现 AOD 网络的分步指南。

你可以在这里找到完整的代码。

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

Left: Naturally hazy image of a forest scene. Right: De-hazed image generated by AOD-net.

论文解释

AOD 假定朦胧图像是根据下述大气散射模型产生的。

大气散射模型

根据 ASM:

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

Equation (1)

其中,
I(x):观测到的雾天图像
J(x):原始图像
A:全球大气光照
t(x):传输矩阵

A 指整个场景中大气的自然光。
t(x) 代表物体到达相机的光量。
计算如下:

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

Equation (2)

其中,
β:散射系数(非负)
d(x):物体与观察者之间的距离(非负)

让我们试着理解这一点。

这个想法是大气在光线到达相机之前会散射来自物体的光线。散射的光量取决于大气属性(由β捕捉)以及物体与相机的距离(由 d(x)捕捉)。其余的光被传输(到达)相机。

由于β和 d(x)都是非负的,所以 t(x)的值在范围(0,1)内。0 表示没有来自对象的光到达相机(所有光都被散射),1 表示来自对象的所有光到达相机(没有散射)。

β值越高,表示大气越倾向于散射光。此外,随着物体远离相机,更多的光被散射。

现在,给定透射值(对于每个像素)和全局大气光线,可以计算相机接收的光线。

如果 t(x)为 1,那么相机可以完美地看到来自物体的光(无散射)。
如果 t(x)为 0,那么相机只看到大气光(完全散射)。
否则,相机会看到物体发出的光和大气之间的线性插值。

问题表述

现有的去雾工作是基于单独估计 t(x)A 。这样做的关键问题是估计误差可能会累积。
AOD 的目的是用公式(1)的以下重新表述,以统一的方式估计这两个参数。

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

Equation (3)

在哪里,

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

Equation (4)

t(x)A 被集成到一个变量 K(x) 中,该变量依赖于输入 I(x) 。一旦估计了 K(x) ,就可以使用等式(3)来计算去模糊图像。

因此,现在的目标是估计 K(x) 使得它最小化去模糊和原始图像之间的均方误差(MSE)。这是通过训练 CNN 来实现的。

网络设计

该网络有两个模块。

第一个模块估计 K(x) 。注意,对于尺寸为 W x H x 3 的图像, K(x) 也具有尺寸 W x H x 3。
第二模块涉及使用等式(3)生成去模糊图像的元素式操作。

K 估计模块是关键的,因为它间接估计大气光和传输矩阵(隐含地计算图像中每个像素的深度)。

它由 5 个卷积层组成(带有 ReLU 激活)。
每层有 3 个过滤器,但内核大小不同(以生成多尺度特征)。此外,在进行卷积之前,先前层的激活与中间层连接,因为这补偿了卷积期间的信息丢失。

网络架构如下所示。

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

AOD-net Architecture

因此,整个管道看起来像这样:

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

AOD-net Prediction Pipeline. (Reference: https://sites.google.com/site/boyilics/website-builder/project-page)

数据生成&培训

为了训练 AOD 网络,作者生成了人工模糊的图像。基于等式(1),来自 NYU2 深度数据库(包括每个像素的深度信息)的图像被人工模糊化,具有不同的值 βA (从均匀随机分布中选择)。因此,对于大约 1500 幅地面真实图像,获得了大约 27K 的模糊图像。

该模型被训练了 10 个时期。权重用标准高斯分布初始化,权重衰减设置为 0.0001。梯度规范被剪切为 0.1。

**注:**该论文没有提到所使用的确切学习速率,也没有提到确切的优化算法。(我在实现中使用了 0.0001 的学习率和 Adam Optimizer)。

作者基于 PSNRSSIM 指标,将 AOD 网络的性能与之前的去雾算法进行了比较。

现在让我们深入研究一下实现。

TENSORFLOW 实现

数据准备

  1. 在此下载训练 AOD 网的数据集。有大约 1500 个清晰图像和大约 27K 的人工模糊图像。
  2. 将包含干净图像的文件夹重命名为“原始图像”,将包含模糊图像的文件夹重命名为“模糊图像”。
  3. “原始图像”中的每个图像都有一个格式为“NYU2_x.jpg”的文件名,其中 x 是一个整数。
    “hazy _ images”中的每个图像都有一个格式为“NYU2_x_y_z”的文件名,其中 x、y 和 z 是整数。
    对于给定的原始图像“NYU2_x.jpg”,人工生成的朦胧图像对于某些 y 和 z 命名为“NYU2_x_y_z”,每个原始图像对应的朦胧图像可以有多个。

数据加载

我们将使用 Tensorflow 数据集 API。

  1. 从“orig_images”文件夹中读取原始图像路径并随机播放。将此列表分为两部分(90%-10%分割),以生成分别用于训练和验证的图像路径列表。
orig_image_paths = glob.glob(orig_images_path + “/*.jpg”)
n = len(orig_image_paths) 
random.shuffle(orig_image_paths)

train_keys = orig_image_paths[:int(0.90*n)]
val_keys = orig_image_paths[int(0.90*n):]

2.创建一个字典,将每个原始图像路径映射到图像是用于“train”还是“val”。
请注意,训练集中使用的原始图像集不应与验证集重叠(即使对应的模糊图像不同),以避免任何信息泄漏。

split_dict = {}
  **for** key **in** train_keys:
    split_dict[key] = 'train'
  **for** key **in** val_keys:
    split_dict[key] = 'val'

3.现在,迭代“hazy_images”文件夹中的所有图像路径,提取对应的原始图像的路径(用基本的字符串操作)。
如果原始图像路径对应于“列车”图像,则将 <原始图像路径、模糊图像路径> 添加到列车数据列表中。
否则,将其添加到 val_data 列表中。

train_data = []
  val_data = []

  hazy_image_paths = glob.glob(hazy_images_path + "/*.jpg")
  **for** path **in** hazy_image_paths:
    label = path.split('/')[-1]
    orig_path = orig_images_path + "/" + label.split('_')[0] + '_' + label.split('_')[1] + ".jpg"
    **if**(split_dict[orig_path] == 'train'):
      train_data.append([path,orig_path])
    **else**: val_data.append([path,orig_path])

4.使用 Tensorflow 数据集 API,创建训练和验证数据集。首先,通过对训练集的模糊图像路径应用 from_tensor_slices() 函数来创建 train_ds_hazy 数据集,随后是加载图像的映射函数(稍后解释)。
接下来,使用训练集的原始图像路径创建一个 train_ds_orig 数据集(以与之前相同的方式)。最后,压缩两个数据集以创建 train_ds

按照类似的过程创建 val_ds

train_ds_hazy = tf.data.Dataset.from_tensor_slices([data[0] **for** data **in** train_data]).map(**lambda** x: load_image(x))
  train_ds_orig = tf.data.Dataset.from_tensor_slices([data[1] **for** data **in** train_data]).map(**lambda** x: load_image(x))
  train_ds = tf.data.Dataset.zip((train_ds_hazy,train_ds_orig)).shuffle(100).repeat().batch(batch_size)

  val_ds_hazy = tf.data.Dataset.from_tensor_slices([data[0] **for** data **in** val_data]).map(**lambda** x: load_image(x))
  val_ds_orig = tf.data.Dataset.from_tensor_slices([data[1] **for** data **in** val_data]).map(**lambda** x: load_image(x))
  val_ds = tf.data.Dataset.zip((val_ds_hazy,val_ds_orig)).shuffle(100).repeat().batch(batch_size)

请注意,我们也说过数据集应该被混洗,数据应该以 batch_size 的批次提取。

5.现在,我们定义一个迭代器来迭代数据集元素。我们使用 from_structure() API,这样相同的迭代器可以用于训练和验证数据集。

iterator = tf.data.Iterator.from_structure(train_ds.output_types,train_ds.output_shapes)

然后我们定义 train_init_opval_init_op 操作。运行这些操作告诉迭代器是分别从训练数据集还是验证数据集中选取数据。

train_init_op = iterator.make_initializer(train_ds)
val_init_op = iterator.make_initializer(val_ds)

6.最后,我们定义了 next_element 操作,可以调用它从迭代器中读取下一批数据。

next_element = iterator.get_next()

数据预处理

我们定义了 load_image() 函数,该函数将图像路径映射到预处理后的图像——准备好输入网络。
我们将图像的高度调整为 480 像素,宽度调整为 640 像素,并将像素值标准化为[0,1]。

**def** load_image(X):
  X = tf.io.read_file(X)
  X = tf.image.decode_jpeg(X,channels=3)
  X = tf.image.resize(X,(480,640))
  X = X / 255.0
  **return** X

网络、损耗和优化

  1. 定义一个函数,该函数获取输入图像,并在将图像通过 AOD 网络架构后返回输出。
**def** haze_net(X):

  conv1 = Conv2D(3,1,1,padding="SAME",activation="relu",use_bias=**True**,kernel_initializer=tf.initializers.random_normal(),
                kernel_regularizer=tf.keras.regularizers.l2(weight_decay))(X)
  conv2 = Conv2D(3,3,1,padding="SAME",activation="relu",use_bias=**True**,kernel_initializer=tf.initializers.random_normal(),
                kernel_regularizer=tf.keras.regularizers.l2(weight_decay))(conv1)
  concat1 = tf.concat([conv1,conv2],axis=-1)

  conv3 = Conv2D(3,5,1,padding="SAME",activation="relu",use_bias=**True**,kernel_initializer=tf.initializers.random_normal(),
                kernel_regularizer=tf.keras.regularizers.l2(weight_decay))(concat1)
  concat2 = tf.concat([conv2,conv3],axis=-1)

  conv4 = Conv2D(3,7,1,padding="SAME",activation="relu",use_bias=**True**,kernel_initializer=tf.initializers.random_normal(),
                kernel_regularizer=tf.keras.regularizers.l2(weight_decay))(concat2)
  concat3 = tf.concat([conv1,conv2,conv3,conv4],axis=-1)

  conv5 = Conv2D(3,3,1,padding="SAME",activation="relu",use_bias=**True**,kernel_initializer=tf.initializers.random_normal(),
                kernel_regularizer=tf.keras.regularizers.l2(weight_decay))(concat3)
  K = conv5

  output = ReLU(max_value=1.0)(tf.math.multiply(K,X) - K + 1.0)
  *#output = output / 255.0*

  **return** output

注意:
-权重初始化(kernel_initializer)是用高斯分布(均值 0.0,标准差 0.02)完成的。
-使用参数为 0.0001 的 L2 正则化。
-每次卷积后应用 ReLU 激活。
-最大值为 1.0 的 ReLU 激活应用于元素倍增层之后。

2.分别为输入(模糊)图像和原始图像定义占位符 XY
定义去雾 _X 为网络通过 X 时的输出。

X = tf.placeholder(shape=(**None**,480,640,3),dtype=tf.float32)
Y = tf.placeholder(shape=(**None**,480,640,3),dtype=tf.float32)
dehazed_X = haze_net(X)

3.定义原始图像和去模糊图像之间的网络损耗 MSE。

loss = tf.reduce_mean(tf.square(dehazed_X-Y))

4.定义优化器操作。
a)定义 Adam 优化器,将****设置为 0.001 。b)传递可训练变量列表,并计算每个变量的梯度。
c)裁剪范数 0.1 上的梯度
d)通过应用裁剪的梯度更新可训练变量。

# Step (a)
optimizer = tf.train.AdamOptimizer(learning_rate)# Step (b)
trainable_variables = tf.trainable_variables()
gradients_and_vars = 
optimizer.compute_gradients(loss,trainable_variables)# Step (c)
clipped_gradients = [(tf.clip_by_norm(gradient,0.1),var) **for** gradient,var **in** gradients_and_vars]# Step (d)
optimizer = optimizer.apply_gradients(gradients_and_vars)

培养

  1. 定义 tf。训练时,避免存储模型权重。
saver = tf.train.Saver()

2.初始化所有全局变量。

3.在每个时期,运行 train_init_op ,以便迭代器从训练数据集中读取数据。

4.定义需要处理的批次数量,这相当于训练样本数量除以批次大小。

5.对于每个批次,运行优化器操作并存储相应的损失(MSE)。每 1000 次迭代打印一次批次损失,以检查损失是否在减少。

**with** tf.device('/gpu:0'):
  **with** tf.Session() **as** sess:

    sess.run(tf.global_variables_initializer())
    **for** epoch **in** range(n_epochs):

      sess.run(train_init_op)
      batches = len(train_data) // batch_size
      epoch_loss = 0.0
      **for** batch **in** range(batches):

        batch_data = sess.run(next_element)
        *#print(batch_data[0].shape,batch_data[1].shape)*
        *#print(np.max(batch_data[0]),np.max(batch_data[1]))*
        batch_loss, _ = sess.run([loss,optimizer],feed_dict={X:batch_data[0],
                                                            Y:batch_data[1]})
        epoch_loss += batch_loss / float(batches)
        **if** batch % 1000 == 0:
          print("Training loss at batch **%d**: **%f\n**"%(batch,batch_loss))

      train_loss = epoch_loss

6.要评估验证数据集的性能,重复相同的过程,只是不运行优化器操作。
此外,每 100 批后,显示模糊、原始和去模糊图像(由网络生成),以供目视检查。

sess.run(val_init_op)
      batches= len(val_data) // batch_size
      epoch_loss = 0.0
      **for** batch **in** range(batches):
        batch_data = sess.run(next_element)
        batch_loss = sess.run(loss,feed_dict={X:batch_data[0],
                                             Y:batch_data[1]})
        epoch_loss += batch_loss / float(batches)
        **if** batch % 100 == 0:
          print("Validation loss at batch **%d**: **%f\n**"%(batch,batch_loss))
          **for** j **in** range(batch_size//2):
            x = batch_data[0][j].reshape((1,)+batch_data[0][j].shape)
            y = batch_data[1][j].reshape((1,)+batch_data[1][j].shape)
            dehazed_x = sess.run(dehazed_X,feed_dict={X:x,Y:y})
            print("Image Number: **%d\n**"%(j))
            showImage(x[0])
            showImage(y[0])
            showImage(dehazed_x[0])
      val_loss = epoch_loss

6.在每个时期之后,保存模型权重。

saver.save(sess,'./models/model_checkpoint_' + str(epoch) + '.ckpt')

结果

我对网络进行了 10 个时期的训练,并在验证集上实现了大约 0.018 的 MSE。然而,在 3-4 个周期后,我没有观察到明显的改善。

下面是一些自然朦胧图像的定性结果(不是人工生成的朦胧)。

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

Left: Naturally hazy image. Right: De-hazed image generated by AOD-net.

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

Left: Naturally hazy image. Right: De-hazed image generated by AOD-net.

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

Left: Naturally hazy image. Right: De-hazed image generated by AOD-net.

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

Left: Naturally hazy image. Right: De-hazed image generated by AOD-net.

可以在这里找到整个代码以及经过训练的模型。是可以在 GoogleCollab 上运行的 Python 笔记本。

干杯!😄

参考

  1. https://sites . Google . com/site/boy ilics/website-builder/project-page
  2. 【https://github.com/TheFairBear/PyTorch-Image-Dehazing (py torch 实现)

所有张量都暗暗希望做自己

原文:https://towardsdatascience.com/all-tensors-secretly-wish-to-be-themselves-1ccc836df41c?source=collection_archive---------16-----------------------

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

Photo by Olav Ahrens Røtneon Unsplash

16 绝不是个大数字。计算一个卷积神经网络(CNN)需要多少 MAC 单元才能在 64 个时钟周期内从 16 深度 3×3 张量卷积中产生 16 个 16×16 区块的输出通道?

如果不使用快速算法,将需要至少 9216 个 MAC 单元。9,216 个 MAC 单元通常用于构建 96×96 脉动阵列,但是计算 96×96 矩阵乘法(MM)至少需要 96 个时钟的等待时间。将需要一长串 96×96×96 的矩阵乘法来保持脉动阵列被占用。

欢迎来到人工智能中的张量世界。现在是时候习惯维度的诅咒了。

张量与矩阵

这篇文章的标题是受 Charles F. Van Loan 教授在他 2010 年关于张量展开的演讲中的一句话的启发和回应。

所有张量都暗暗希望自己是矩阵!

这一陈述表明了张量研究团体通过首先将张量展开成矩阵,然后利用成熟的矩阵理论框架来研究张量的愿望。即使张量被认为是所有主要人工智能框架中最基本的数据类型,将张量展平到矩阵以利用高度优化的矩阵乘法(MM)或 MM 加速器(MMA)库也是一种行业标准做法。矩阵一般被 AI 界认为是张量的特例。

传统智慧可能会说:

  1. MM 中有非常好的并行性和数据共享模式可以利用。
  2. 矩阵比张量更适合可编程硬件。
  3. 有一个本机硬件加速解决方案,脉动阵列,用于 MM。

然而,

  1. CNN 在结构上相当于 MMs。没有必要展平张量来利用 MM 等价的并行性和数据共享模式。
  2. 当沿着存储器层级向上攀升时,矩阵针对时间局部性被递归地分块,并且针对空间局部性被打包。它们最终成为微面板,即小块行或列,由软件微内核或 GPU 着色器内核使用。
  3. 在我对谷歌的 256x256 脉动阵列的 TPU v1 的评论中,解决了脉动阵列的方形诅咒的可扩展性问题。此后,使用多个相对较小的脉动阵列似乎成为主流。由于这个原因,矩阵在成为可以被脉动阵列消耗的正方形矩阵形状之前,必须被类似地分块和打包。

因此,来自展平张量的矩阵实际上被分块并打包成适当的结构,以实现高性能执行,如下图所示。前者可以称为平面展开,后者称为块展开。由于几十年来对高性能 MM 实现的研究、构建和利用块矩阵框架的努力,矩阵通常成为 CNN 和 AI 的默认数据类型。

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

Block-unfolding of a MM

按照传统观点,CNN 中的特征映射被强制为某个矩阵的列,卷积滤波器被展平为列中的一些连续矩阵元素。由于平面展开,失去了在空间和时间上重复使用特征图中相邻像素的可能性。

阻止张量救援

MM 中递归矩阵块展开的一个关键特征是当矩阵靠近硬件的裸机时,高级时间和空间局部性被保留。看看 CNN 中的数据位置是否也能以张量的形式保存下来,这应该是很有趣的。

合理的设计选择是将特征地图划分为分块,并保持分块结构以重复使用过滤器,利用小分块的快速算法,并实现细粒度的 SIMD 式并行。在接近裸机时,张量应保持为张量,以保持要素地图中的切片结构和数据位置不变。

此外,必须解决输入特征地图和输出特征地图之间的位置模式。前者允许共享来自多个输入要素地图的数据,以便计算多个输出要素地图。后者使更多的受众能够共享输入要素地图。问题是你不能共享所有的特征图,因为产生一个输出像素并不需要所有的输入特征图,并且将所有的特征图保存在芯片上是不切实际的。总结一下,所有维度都需要进行一定程度的划分或分块,这样的考虑导致张量被划分成更小的,成为块张量

块张量是指其项是张量的张量。它是块矩阵的对等物。块张量的概念可用于解决维数灾难并保持 CNN 中的数据局部性,类似于高性能计算(HPC)行业如何采用 MM 的块矩阵概念。张量包,相当于 MM 中的微面板或子方阵,被定义为基本张量单元,必须对其进行原子处理以利用所有维度的空间局部性。由张量包组成的张量块被定义为必须在计算单元和外部存储器之间整体传输的张量单元,以促进张量包之间的时间局部性。

原子张量包操作被定义为从最小足够数量的输入通道产生最小足够数量的最小足够大小的瓦片的输出通道。由于张量中的维数灾难,即使每个张量包在每个维度上都很小,处理这样的张量包也会变得很费力。它可以在张量块内迭代或同时应用,以解决更大的问题。这些想法在文章的其余部分得到了半正式的阐述。

块张量形式的 CNN

CNN 的输入 A 和输出 C 分别由多个输入特征图(IFM)和输出特征图(ofm)组成。它们可以被认为是三维张量,特征图的维度为 xy ,索引 IFM 的输入深度为 w ,索引 ofm 的输出深度为 z 。为了实现细粒度的 SIMD 并行性并利用具有空间局部性的快速算法,每个特征图可以沿着 xy 维度进一步划分成瓦片。复合索引( txty )分别用于识别输入图块和输出图块。对于每一对唯一的 IFM w 和 OFM z ,都有一个滤波器 B ( wz ),通常由 3×3 的滤波器参数组成。输入和输出张量成为图块的块张量,如下图所示

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

CNN in terms of block tensors of tiles

平铺的 CNN 可以用张量理论符号更紧凑和精确地表示如下:

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

冒号表示从该维度获取所有数据。 A (:,:, w ) 代表 IFM w ,因为它从 IFM 中取出所有的图块。

CNN 在结构上等同于 MMs

传统观点认为,我们必须将张量展开成矩阵,以利用 MMs 中的并行性和数据共享模式。然而,实际上是反过来的。就并行性和数据共享模式而言,CNN 在结构上等同于 MMs,如下所示,这就是 MMs 在 CNN 中如此普遍使用的原因。

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

CNNs are structurally equivalent to MMs

由于 C 中的行的计算是独立的,所以 A 的行可以被阻塞。等效地,特征图可以被平铺,因为像素可以被独立计算。

MM 等效并行度和数据共享模式相对于切片保持不变。

同一要素地图中的输出切片共享相同的过滤器,但不共享相同的输入切片。沿着输出维度的输出切片共享相同的输入切片,但不共享相同的过滤器。MMs 和 CNN 之间的等价性可以在下表中用张量理论符号更简洁地描述:

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

深度也需要平铺(阻塞)

现在,片上存储器的成像尺寸受到限制,我们希望在片上数据块中的 IFM、ofm 和滤波器之间充分利用 CNN 中的 MM 等效数据共享模式。数据块的几何结构应该是什么样的?它必须有足够的( xy ) 来重用过滤器,足够的 w 来共享足够的输入数据,以及足够的 z 来有效地共享输入数据,如下图所示:

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

On-chip buffers must have sufficient coverages along all dimensions

这个观察导致除了阻塞 xy 维度之外,阻塞 wz 维度,这个我们已经做过了。这是为了确保输入和输出数据块分别覆盖足够数量的 IFM 和 ofm。引入新的索引 twtz 分别标识一组 IFM 和一组 ofm。我们将输入张量包 A ( txtytw )定义为来自 IFM 组 tw 的一组( txty )对齐的图块。 同样,我们将 C ( txtytz ) 定义为一组来自 OFM 组 tz 的( txty )对齐瓷砖。 B ( twtz ) 代表一组滤波器,每组用于一对来自组 tw 的 IFM 和来自组 tz 的 OFM。它被称为滤子张量包。输入、输出和过滤张量现在是张量包的块张量,如下所示

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

CNN in terms of block tensors of tensor packets

MM 等价并行性和数据共享模式相对于张量包保持不变。

软件中的张量微内核或硬件中的张量包引擎可以被设计成处理将输入张量包 A ( txtytw ) 与过滤张量包 B ( twtz ) 进行卷积的原子操作

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

Atomic tensor packet operation

假设输入和输出图块分别为 6x6 和 4x4,并使用 8 作为 IFM 组和 OFM 组的大小。在不使用 3×3 卷积的快速算法的情况下,在 4 个时钟内完成该运算需要 2304 个 MAC 单元。2304 路并行度在所有尺寸中相当平均地投入,包括沿特征图的 xy,输入深度 w ,输出深度 z 。使用诸如 4x4 之类的小块尺寸的分块使得能够使用诸如 Winograd 之类的快速算法,从而仅使用 576 个 MAC 单元就可以实现 2,304 路并行。

张量的递归分块

张量包是计算单元整体消费的基本单位。为了保持切片之间的数据局部性和平铺结构,我们在全张量和张量包之间引入了一个中间块级别,张量块,,以包括我们希望整体带到芯片上的张量包。当有足够的计算单元、片上存储器和提供带宽时,它是片间时间局部性和空间局部性的基本单元。一个张量块沿 x z维度用( bxbyBZ****

下面是一个张量递归分块的例子。整体张量是 4x4 瓦片的 4x 4 块张量的 4x2 块张量,4x 4 瓦片的 1x1x8 块张量,其中( dxdy )是在瓦片内寻找像素的偏移, dz 是标识组内特定特征图的索引。

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

Recursive blocking of tensors to preserve locality in a feature map

张量块线性存储在内存中。我们不需要担心它们是如何准确排序的。对于张量块,将有两种不同的块展开顺序,一种优化为将张量块存储到 DRAM,另一种优化为将其呈现给计算单元。如下所示,将需要软件和/或硬件中的转置机制来动态地从一种格式转置到另一种格式。

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

Transposition of a tensor block

执行转置的等待时间可以由双缓冲来覆盖。当张量块被呈现给计算单元时,它被展开成( txty )主顺序的张量包,因此张量包可以在( xy )域中并行处理,计算单元相应地排列。

所有张量都暗暗希望做自己

Van Loan 教授在关于块张量的块展开的演讲中也说过:

块展开保留了数据的结构和局部性。…在我看来,分块最终会在张量计算中产生与矩阵计算相同的影响。

张量被分块展开成用于多维中的时间局部性的张量块,使得当被带到芯片上时,数据可以在多维中共享。张量块被进一步分块展开成张量包,这些张量包在所有维度上具有最低限度的足够覆盖。在本例中,处理这样的张量包需要 2304 路并行处理。MM 等价并行和数据共享模式应用于张量块中的张量包。

据我们所知,这篇文章中所讨论的可能是计算史上第一次尝试在裸机上采用块张量的概念。对于处理高分辨率视频/图像的应用,可以实现跨越 xy 维度的可扩展和更大的并行性。CNN 凭借其革命性的力量和在张量中的根深蒂固,可能会成为 block tensors 的第一个杀手级应用。

所有张量都暗暗希望自己是 block 张量,期待自己的潜力得到释放,实现 AI 硬件的突破。

所有恼人的假设

原文:https://towardsdatascience.com/all-the-annoying-assumptions-31b55df246c3?source=collection_archive---------8-----------------------

在这篇文章中,我试图收集和映射常见数据科学算法的假设。

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

假设是恼人的小事,如果你要成功地实现任何模型,就需要坚持这些假设。大多数模型,无论多么基本,都有一套假设,在本文中,我试图将它们映射成一种模式,以便于理解。

让我从一张我尝试构建的假设图开始。从这里开始,我们可以轻松地浏览与每个部分相关的假设。

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

Assumption Map

我们开始吧…

回归

线性回归和多项式回归都有一组共同的假设,如果它们的实现是有益的,就需要满足这些假设。

  1. 线性关系:线性回归需要自变量和因变量之间的关系是线性的。这种线性假设最好用散点图来检验。然而,显然线性假设对多项式回归无效。
  2. 多元正态:回归分析要求所有变量都是多元正态。这种假设最好用直方图或 Q-Q 图来检验。 正态性可通过拟合优度检验进行检查,如 Kolmogorov-Smirnov 检验。当数据不是正态分布时,非线性变换(例如,对数变换)可以解决这个问题。
  3. **多重共线性:**回归假设数据中很少或没有多重共线性。**当自变量之间的相关性过高时,会出现多重共线性。**您可以使用相关矩阵来检查变量之间是否相关。您可以删除一组相关的列,同时保留另一组。
  4. 自相关:R 回归分析要求数据中很少或没有自相关。当残差不是相互独立的时候,就会出现自相关。虽然散点图可以让你检查自相关,你可以用德宾-沃森测试来测试自相关的线性回归模型。
  5. **同方差:同方差描述了一种情况,其中误差项在独立变量的所有值上都是相同的。**散点图是检查数据是否同方差的好方法(意味着回归线上的残差相等)。如果存在同方差,非线性校正可能会解决问题。
  6. 误差项必须是正态分布

像套索、脊、弹性网等分离方法不过是试图平衡偏差与方差的正则化技术。因此,这些技术没有任何独立的假设。

SVR 对输入数据也相当宽容,并且没有任何独立的假设。

使聚集

广泛使用的聚类算法有四种:k-means 聚类分析、潜在类分析、自组织映射。

  1. K 均值聚类方法考虑了关于聚类*的两个假设——首先,聚类是球形的,其次,聚类具有相似的大小。*当算法处理数据并形成聚类时,球形假设有助于分离聚类。如果违背了这一假设,所形成的簇可能不是人们所期望的。另一方面,对群集大小的假设有助于决定群集的边界。
  2. 某些相似性度量(例如欧几里德距离)假设变量在聚类内是不相关的。
  3. 谱聚类中,数据点被视为图形的节点。因此,聚类被视为一个图划分问题。然后,节点被映射到一个低维空间,该空间可以很容易地被分离以形成集群。需要注意的重要一点是,没有对集群的形状/形式进行假设。
  4. 层次聚类没有自己独立的假设。
  5. 与其他聚类算法类似, GMM 对数据的格式和形状有一些假设。如果不满足这些标准,绩效可能会显著下降。
  6. LCA 以*“条件独立性”为标准定义潜在类别这意味着,在每个潜在类别中,每个变量在统计上独立于其他变量。例如,在对应于不同医学综合征的潜在类别中,一种症状的存在/不存在被视为与所有其他症状的存在/不存在无关。对于某些应用程序,条件独立性可能是一个不合适的假设。例如,一个人可能有两个非常相似的项目,因此对它们的响应可能总是相关联的。对于这种情况和某些相关情况,潜在类模型的扩展是存在的。***
  7. *与多变量技术相比,非参数 SOM 程序有许多优点。**首先,它们不假设变量的分布,也不要求变量之间的独立性。*其次,它们更容易实现,能够解决非常复杂的非线性问题。最后,它们可以更有效地处理噪音和缺失数据、非常小的维度和无限大小的样本。

分类

常见的分类器类型有: 逻辑回归、朴素贝叶斯分类器、KNN、随机森林

  1. 逻辑回归用于预测从属变量,这些变量属于有限数量的类别之一(将二项式情况下的从属变量视为伯努利试验的结果),而非连续结果。鉴于这种差异,违反了线性回归的假设。特别是残差不能正态分布。
  2. 结果的 logit 和每个预测变量之间存在线性关系。回想一下,logit 函数是logit(p) = log(p/(1-p)),其中 p 是结果的概率。这可以通过目视检查每个预测值和 logit 值之间的散点图来检查。
  3. 预测值之间没有高度相关性(即多重共线性)。这可以通过可视化厨师的距离值来检查。
  4. 朴素贝叶斯分类器的情况下,假设预测器/特征是独立的。这里做的另一个假设是所有的预测因素对结果有相同的影响。
  5. KNN 是一种非参数懒惰学习算法。那是一个非常简洁的陈述。当你说一项技术是非参数化的,这意味着它没有对底层数据分布做任何假设。**
  6. 决策树中,由于我们没有概率模型,只有二分分裂,我们根本不需要做任何假设。那是关于决策树的,但它也适用于随机森林。不同之处在于,对于随机森林,我们使用引导聚合。它下面没有模型,唯一依赖的假设是采样具有代表性。但这通常是一个常见的假设。

集成方法是一种元算法,它将几种机器学习技术结合到一个预测模型中,以便减少 方差(bagging)偏差 (boosting),或者提高预测 (stacking)。因此,这些也没有任何单独的假设。

时间序列分析

ARIMA 模型基于平稳性的假设工作(即它们必须具有恒定的方差和均值)。如果你的模型是不稳定的,你需要在使用 ARIMA 之前对它进行变换。

随着我对数据科学的了解越来越多,我会继续更新这篇文章,直到那时,干杯。

参考资料:

  1. https://www . research gate . net/publication/263084866 _ An _ Introduction _ to _ Self-Organizing _ Maps

2.https://cdn1 . SPH . Harvard . edu/WP-content/uploads/sites/59/2016/10/Harvard-lecture-series-session-5 _ LCA . pdf

3.https://www . analyticsvidhya . com/blog/2015/12/complete-tutorial-time-series-modeling/

4.维基百科(一个基于 wiki 技术的多语言的百科全书协作计划ˌ也是一部用不同语言写成的网络百科全书ˌ 其目标及宗旨是为全人类提供自由的百科全书)ˌ开放性的百科全书

5.https://www . statistics solutions . com/assumptions-of-linear-regression/

6.大量堆栈溢出问题

7.https://cdn1 . SPH . Harvard . edu/WP-content/uploads/sites/59/2016/10/Harvard-lecture-series-session-5 _ LCA . pdf

8.https://towards data science . com/spectral-clustering-ABA 2640 CD 5b

9.https://towards data science . com/naive-Bayes-classifier-81d 512 f 50 a7c

10.https://saravananthirumuruganathan . WordPress . com/2010/05/17/a-detailed-introduction-to-k-nearest-neighbor-KNN-algorithm/

11.https://www . statistics solutions . com/assumptions-of-logistic-regression/

构建第一个图像分类器的所有步骤(带代码)

原文:https://towardsdatascience.com/all-the-steps-to-build-your-first-image-classifier-with-code-cf244b015799?source=collection_archive---------1-----------------------

从创建数据集到测试您的程序准确性

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

Photo by Temple Cerulean on Unsplash

如果你想创建一个图像分类器,但不知道从哪里开始,按照这个快速指南来理解概念,并能够训练一个卷积神经网络来识别任何你想要的图像!

为了实现这一点,提供的代码是用 Python (3.x)编写的,我们将主要使用 Keras 库。

首先,如果你对什么是神经网络毫无概念,我只能用快速指南鼓励你去发现这个概念。例如,这是我写的最后一篇:

[## 第一个为初学者讲解的神经网络(带代码)

理解并创造一个感知机

towardsdatascience.com](/first-neural-network-for-beginners-explained-with-code-4cfd37e06eaf)

现在,我们将重点关注卷积神经网络,它保持了关于列和神经元、输入和输出的相同想法,同时简单地添加了一种提取图像中信息的方法。

什么是卷积神经网络?

这种类型的神经网络由一些操作之前的深度神经网络组成。

O 总之,请记住,图像只是一个数字矩阵,如果图像只有灰度级,则为 2 维,如果图像包含颜色,则为 3 维(第三维适用于所有 RGB 级别)。

首先,当一个图像被提供给算法时,它首先在初始图像上应用一个小的过滤器,并在图像上的任何地方使用它。这一步称为卷积。

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

Figure 1 — Convolution of a 5x5 image by a 3x3 filter

在图 1 中,初始图像是绿色的,滤镜是黄色的,并将初始图像的每个数字乘以相应滤镜的数字。

在这个操作之后,一个新的矩阵(红色)被获得。通过将红色矩阵的像素与模型进行比较,程序可以确定在第一图像上是否存在对应于模型的物体。

例如,仅在一行像素上获得大数字意味着初始图像在那里包含一行。

下一步叫做汇集。它是关于取每个区域的最高值,并仅使用那些值形成新的矩阵。它降低了矩阵的空间维数,从而有助于神经网络更快地运行。

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

Figure 2 — Example of Pooling operation

在图 2 中,您可以看到图像的维度被分为 4 个部分,每个部分都有其最高值。新形成的图像更小。

此外,在该过程中使用激活函数来归一化所有获得的值。在下面的例子中,我们将使用 ReLU。

最后,可以使用最后一个步骤来提高精度,该步骤被称为下降。它迫使神经网络在学习阶段随机禁用一些神经元。我们也将在我们的例子中实现这个函数。

现在你已经知道了卷积的基础,我们可以开始构建一个了!

准备数据

只有当你想使用你自己的数据,或者在网上找不到的数据,来建立一个可能更适合你需要的卷积神经网络时,这一部分才是有用的。否则,下面是直接使用来自 Keras 的数据集的代码:

**from** keras.datasets **import** mnist #replace mnist with any dataset(x_train, y_train), (x_test, y_test) = mnist.load_data()

这里,我们简单地调用函数 load_data 来为训练和测试阶段设置数据集。您可以用任何想要使用的数据集替换“mnist”(在两行中都进行更改)。

如果您想创建自己的数据集,以下是步骤:

首先,你需要收集大量的图像。越多越好。请记住为每个班级保留大约相同数量的图像。例如,对于我的 2D 象棋分类器,每个可能的棋子(和空棋子)有 160 张图像,所以总共大约有2000 张图像(这并不多),但是数据集的大小取决于项目(我的 2D 棋子总是有相同的方面,而猫有许多品种、不同的大小、不同的姿势……)。

还有一个强大的工具可以帮助你创建更多的数据,叫做数据增强。它只是简单地修改一张图片,然后通过翻转、旋转或裁剪,返回大量新的独特的图片,所有这些都基于第一张图片。

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

Figure 3 — Example of a folder tree

最后,确保你所有的数据都被分类到一个专门的文件夹中,每个类都有自己的子文件夹。

现在,在主文件夹中,我们将创建一个 python 程序来设置所有数据。

Preparing the data

在第 14 行,您可以将列表更改为您需要的任何类,但是保持您之前用于子文件夹的相同名称。

最后,在运行程序后,数据被设置在文件中,并准备使用。

构建卷积神经网络

The convolutional neural network

如果您决定使用导入的数据集,将第 9 & 10 行替换为我们之前看到的内容,将第 44 行替换为:

model.fit(x_train, y_train, batch_size=32, epochs=40, verbose=1, validation_data=(x_test, y_test))

在第 37 行,将 Dense() 的参数修改为你所拥有的班级数。这是神经网络可能输出的数量。

对于每个卷积层,你可以看到我们总是首先加上它的神经元数量和滤波器大小。然后,我们涉及到激活函数,最后使用池化方法。我们还在第 30 行添加了一个 Dropout 来看看如何做。

此外,在第一个“正常”隐藏层之前,我们添加了函数 Flatten() ,该函数将之前卷积的所有信息转换为神经元的输入。在这一点上,剩下的只是包含来自基本神经网络的层和神经元。

在这里,你建立了自己的分类器!

预测图像类别

现在,你可以使用你的神经网络来预测任何你想要的图像。简单地写一个包含这几行的小脚本:

**import** cv2
**import** tensorflow **as** tfCATEGORIES = ["bishopB", "bishopW", "empty", "kingB", "kingW",
			"knightB", "knightW", "pawnB", "pawnW",
			"queenB", "queenW", "rookB", "rookW"]**def** prepare(file):
    IMG_SIZE = 50
    img_array = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
    return new_array.reshape(-1, IMG_SIZE, IMG_SIZE, 1)model = tf.keras.models.load_model("CNN.model")
image = "test.jpg" #your image path
prediction = model.predict([image])
prediction = list(prediction[0])
print(CATEGORIES[prediction.index(max(prediction))])

函数 prepare(file)允许我们使用任何大小的图像,因为它会自动将图像调整到我们在第一个程序中定义的大小。

如果您在数据程序中修改了图像尺寸,也请在此处修改。

就是这样!您只是构建了适合您自己图像的图像分类器。当然,不要犹豫修改你看到的任何一行代码,因为你的神经网络的准确性可能会根据这些参数而有很大的不同。以下是其中的一部分:

  • 模型:你可以很容易地在你的神经网络中添加或删除一些层,改变神经元的数量,甚至是激活函数。你有你想要添加的任何东西的模型。
  • 数据:获得的精度不是你所期望的?也许你可以添加更多的数据,主要是验证你所有的图像都存储在他们的好文件夹。
  • IMG 大小:在程序中为数据集定义,它表征了网络将要处理的图像的大小。不要尝试太大的数字,因为高质量的图像会导致更长的训练阶段。此外,即使是著名的数据库,如 MNIST,包含的图像也非常少(MNIST 为 28x28)。不要忘记在最后一个程序中修改整形函数的 IMG 大小。
  • Keras 使用的新参数,如回调。一个叫做“早期停止”的方法可以帮助你提高训练阶段的长度,主要是避免过度适应。

有了这个指南,我们刚刚够你创建和理解你的第一个卷积神经网络。如果你愿意,还有许多其他参数或方面可以发现,所以不要犹豫,继续前进。

感谢阅读!

我希望这个小指南有用,如果你有任何问题和/或建议,请在评论中告诉我。

在 Seaborn 中,您可以自定义图表和图形的所有方式

原文:https://towardsdatascience.com/all-the-ways-you-can-customize-your-charts-and-graphs-in-seaborn-9be90fa6f5b5?source=collection_archive---------26-----------------------

一个关于如何使图形美观易懂的代码演示

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

Photo by Amaury Salas on Unsplash

介绍

在数据科学领域,Jupyter 笔记本是一种非常流行的数据探索和实验工具。由于笔记本的性质,它们也允许数据很容易地图形化和可视化。可视化数据可能是一个很好的探索工具,但当您想要与他人共享您的工作时,它也变得很重要。为了与他人分享你的工作,特别是与管理人员,你最好知道如何制作一些好看的、能被理解的图表。

Seaborn 图书馆

谈到可视化,我个人的选择是 seaborn 。Seaborn 是一个建立在 Matplotlib 基础上的库,使它更容易使用,也更吸引人。如果你不太熟悉 Matplotlib,在 seaborn 中定制你的绘图会很困难,因为它使用 Matplotlib 的语法来改变图形的部分。下面,我有你需要的所有代码,让你的图表容易理解。您可以使用 Matplotlib 和 seaborn 做很多事情,这肯定不是包罗万象的,但它应该会给您一个很好的起点。

数据

对于这些例子,我从 Kaggle 获取了一些容易获得的数据。我从哥斯达黎加贫困挑战房价回归挑战中抓取数据。

形象化

基本图形

首先,我们将导入我们将使用的库,并制作一个简单的图表。我们将查看我们正在处理的第一个数据集的目标变量贫困水平的计数。

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

从一行代码中,我们得到了一个漂亮的图形。这里没有太多的信息,但至少看起来不错。虽然可能有点小。让我们添加另一行代码来更改图形的大小,使其稍微大一点。

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

现在更容易看到了。在 figsize 参数中,你可以放入任何你想要的尺寸来改变你的图形的大小。它只需要一个类似于(height,width)的参数。

标记图表

现在我们已经有了一个很容易看到的大小合适的图表,我们需要让图表的目的更清楚一点。我们只需要几行代码就可以添加标题和轴标签。

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

现在我们到了这样一个点,有些人并不真正知道发生了什么,但看了这个图表,就对我们正在做的事情有了一些了解。尽管如此,阅读那些微小的字体还是有点困难。让我们解决这个问题。

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

对我来说,这看起来是一个非常易读的图表。我们所有的东西都有清晰的标签,而且足够大,所以看起来很像样。

设计

现在,图表已经清楚了正在发生的事情,我们可以做一些调整,使它更有吸引力,并添加更多的细节。我们可以做到这一点的第一个方法是改变我们的图表使用的调色板。

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

我们的图表现在有点不同了。Seaborn 支持许多不同的配色方案。你可以在这里查看它们。一旦设置了配色方案,它就为笔记本的其余部分设置好了。因此,您可以在顶部设置一次,或者为每个图形更改它。

我们还可以添加一些细节,使我们的图表更加清晰。你可能想知道哪个贫困水平是好的,哪个是坏的。因为我们只是把它们标为数字,所以稍微澄清一下可能会有好处。

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

现在我们已经明确了每个目标标签的含义。让我们回到我们的小图表,画出同样的东西。

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

这是一个非常不专业的图表。我们所有的标签相互重叠,很难阅读。幸运的是,有一个简单的方法可以让它看起来更好。我们要给我们的标签一个小小的转变。

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

就这样,我们的图形又可读了。这可以很好地服务于长标签,或者只是让图形看起来更好一点。

接下来,我们将深入研究其他数据。我们将使用我们已经看过的工具绘制三个不同质量水平的房价分布图。

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

我们这里有一个非常漂亮的图表。唯一的问题是,我们无法知道哪个分布是哪个。与上一张图不同,我们不能在 x 轴上标记我们的组。相反,我们需要在图表中添加一个图例。

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

有了图例,我们可以知道哪个分布与哪个质量组相关,我们的图表又有意义了。

最后,我们将看看如何操作图的维度。如果我们不太关心高质量组的长尾,并且希望放大主要分布,我们可以设置不同于默认的轴限制。这里,我们将 y 轴设置为略高于默认值,并将 x 轴设置为 600,000。

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

我们的图表向我们展示了现在分布的主要部分。如果有一两个异常值使你很难读懂其余的图表,这可能是有用的。

结论

这些只是一些提示和技巧,帮助你定制你的海伯恩情节。你还可以用它做更多的事情。如果您想了解更多自定义图形的方法,请通读 Matplotlib 文档。我希望这是有帮助的,你的图表现在可以与世界分享了。

面试前你需要知道的关于线性回归的所有代数知识

原文:https://towardsdatascience.com/all-you-need-to-know-about-linear-regression-to-be-interview-ready-fc58a00a0b8c?source=collection_archive---------7-----------------------

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

Photo by John Moeses Bauan on Unsplash

线性回归是数据科学中最简单也是最重要的算法之一。无论你面试的是数据科学、数据分析、机器学习还是量子研究领域的工作,你最终都可能不得不回答关于 LR 的特定代数问题。以下是你需要知道的,让你对自己的 LR 知识充满信心。

注:本文全是理论,无编码。它还假设您已经至少对代数有一点熟悉。

知道自己的假设

虽然本文假设您已经对 LR 有所了解,但是让我们提醒一下公式和假设。给定 N 个观察值,一个输出向量 Y(维数为 Nx1)和 p 个输入 x1,X2,…,Xp(每个输入向量的维数为 Nx1), LR 假设回归函数 E(Y|X)在输入中是线性的。y 因此统计:

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

其中ε是误差项。线性假设实际上是 LR唯一严格必要的假设在本文后面,我们将看到我们可以添加更多的假设来推断更多的结果。

虽然上面的公式看起来很简单,但找到系数(β)并不总是很容易——继续向前,我们将把β称为系数的估计值。

了解关键指标的定义

以下是你绝对需要知道(牢记)的 3 个指标:

  • RSS 是残差平方和

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

其中 y_i 为观测值 i 的输出, ŷ_i 为观测值 i : 的估计输出

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

  • TSS 是平方和的总和

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

在哪里

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

  • R 平方,它是 X 和 Y 之间线性关系的量度

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

只要你知道这些公式,你就应该能够通过逻辑推理推断出所有其他的结果。

知道答案:如何(何时)计算它

正如我们之前所说,LR 的关键是找到系数的估计值。我们通过最小化 RSS 找到这些。为此,让我们定义 X 和 Y 为

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

注意,为了考虑截距β_ 0,我们必须在输入矩阵中添加一列 1。我们的最小化问题等价于求解:

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

因此,我们可以计算右边项的梯度:

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

对于我们的估计 hat 应该等于 0。

假设 X ⊤ **X 是非奇异的,**这给了我们一个显式解 :

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

这是一个你需要知道的公式,但是你也应该能够证明它,就像上面做的那样。非奇点的假设是这里的关键。我们还推断出 y 估计的公式:

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

知道维 Nx1 (1 个输入变量)中的显式解也是有用的:

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

其中 x 在这里是一个向量(不是矩阵)——当你已经有了更一般的解决方案时,很容易记住:X⊤X 成为输入的方差(在一维中,求一个项的倒数等于除以那个项),X⊤y 成为协方差项。你也可以通过在一维空间做类似的计算来计算这个解。

熟悉假设检验(假设正态误差)

在采访中,对 LR 有一些统计概念也很重要。

本节假设你已经掌握了统计测试的基础知识(包括 t 统计f 统计假设检验)。

假设正常误差,即

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

(别忘了ε在这里是矢量!)那么我们的估计解满足:

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

因此

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

这就把我们带到了

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

这一发现有助于评估系数β_ j 为零的零假设:我们可以计算 t-score

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

在零假设下,t_j 遵循具有 N-p-1 个自由度的 t 分布,而对于足够大的 N遵循正态分布。

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

计算这个分数可以帮助你评估零假设。例如,找到高于 1.96 的|t_j|分数将确保系数β_ j 不为空的 5%显著性。

您还可以计算给定系数的置信区间:近似的**(1–2 * alpha)-置信区间**由下式给出

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

我们使用标准正态曲线下的面积来计算:

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

我们还可以通过计算 F-stat 来检验假设**,即每个系数都为零**

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

在无效假设下,遵循 F(p,N-p-1)分布。因此,F 的大值构成了反对零假设的证据。

红利 1:我们为什么要做最小二乘法?

当我们寻找β的最优估计时,我们本能地跳到了最小二乘优化,但是为什么呢?首先,我们可以证明(我们不会在这里,查看这篇文章了解更多细节)最小二乘估计量是无偏的,即

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

接下来,实际上有一个定理证明最小二乘估计量具有最小方差。这就是高斯-马尔可夫定理:它表明最佳无偏估计量是最小二乘

加成 2:当 X⊤X 排名不全怎么办?

首先,我们来看看这是什么时候发生的。让我们提醒自己,X 的维数是(N,p+1)。那么 X⊤X 就是(p+1,p+1)。我们可以证明 X⊤X 是全排名的当且仅当 x 是排名 p+1, 这迫使 N > p 。这里可以看到证明。这意味着这些特征是线性独立的(但不一定不相关)。

当情况并非如此时(当我们的特征多于观察值时),我们可以使用收缩方法如岭回归。的确,当我们在 X⊤X 的对角线上增加一项时,问题就变得可行了。对于岭回归的例子:

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

有一个解决方案:

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

的确,因为 X⊤X,是正半定的,它的特征值都是正的,在对角线上加一个正项就使它全秩了。所以这使得问题非奇异。这就是我们必须对 p > > N 的情况应用正则化技术的原因之一

面向应用型自然语言处理工程师的心智模型:一张图中语言模型的 Tf-IDF

原文:https://towardsdatascience.com/all-you-need-to-know-about-nlp-based-predictive-modeling-in-one-diagram-7be3b547454a?source=collection_archive---------20-----------------------

理清 NLP 预测建模场景

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

Image credit: https://www.um.edu.mt

秘诀:5 分钟后你将成为职业选手,

  1. At 从自然语言数据集设计特征以构建经典的 ML 模型
  2. 在构建嵌入时,从复杂的自然语言数据集中学习酷的表示,以构建 DNN 模型。

NLP 作为一个领域正在以曲速前进。神经模型对 NLP 的干预的好处是,它在许多任务中推动了极限,但坏处是,它使试图进入该领域的新人的学习场景变得复杂。我觉得有义务通过分享我用来推理基于 NLP 的预测任务的心智模型来带来一些清晰。正如标题中所承诺的,我已经试图在一个单一的图表中传达我想要传达的一切,请将这个心智模型视为指南针,而不是地图。话虽如此,请注意这篇文章并不适合绝对的初学者。

在进入这篇文章的实质之前,请允许我设置一下背景,澄清一些术语的细微差别和覆盖范围。

术语

心智模型中将使用的术语的快速注释。

为了更容易理解,我特意使用了而不是文本或者“字符”或者“短语”作为下面心智模型中的战术单位,因为 a .语言是组合的,单词是最低的战术单位,可以有各种组合(与字符或其他任何东西相比); B:大多数 NLP 文献在讨论 NLP 问题和解决方案时都使用“单词”作为默认选择。单词 N-grams 可以表示一个单词(当 N=1 时为 1-gram 或 unigram)、一个单词对(当 N=2 时为 bigram)等等。这同样适用于 char N-grams。

嵌入:

虽然我们知道在机器学习中“嵌入”是一种奇特的说法,即一种获取原始文本数据并将其“嵌入”到向量空间中的技术。因为当在向量空间中呈现训练数据时,机器学习算法是“最快乐的”。原因并不奇怪:我们可以做向量数学或者计算向量之间的距离等等。 (承蒙:来自 Quora.com 的斯里达尔·马哈德万教授)

但是从另一个层面来说,学习嵌入只不过是学习底层文本语料库的表示。单词嵌入是一种上下文无关的嵌入或表示**(这里的上下文是指语用上下文,而不是语义上下文),像 ELMo、BERT 这样的语言模型学习一种上下文相关的嵌入或表示。查看这个 G oogle BERT 帖子获得更多更深入的见解。**

语义语境

“一个词由它的朋友来描述”——J . r .弗斯

语义上下文是一个记录良好的概念,但这里有一个快速回顾。语言是象征性的:单词汉堡包奶昔在语义上“食物”相关,但我们需要一种技术将这些知识输入机器。分布假说粗略地指出,出现在相似语境中的词往往具有相似的含义。因此,可以认为汉堡包和奶昔通常出现在文本语料库中的食物上下文中。这被称为语义上下文,算法需要找出语义相关性的概念。

语用语境(或用法语境)

语义语境忽略了所有的语用语境。我这么说是什么意思?让我们来考虑这个例子:他去监狱 牢房 用他的 牢房 手机去 牢房 提取犯人的血样 (礼貌用语:Ajit Rajasekharan考虑语义和语用上下文的嵌入将为单元的三个向量生成不同的向量。例如,第一个牢房(监狱牢房案件)更接近监禁、犯罪等词。而第二个“手机”(手机壳)更接近于 iPhone、android、galaxy 等词…**

覆盖范围

这个心智模型涵盖了所有基于 NLP 的预测任务,这些任务可以被构造为 N:1 监督学习任务,即输入是任意长度(N)的文本序列,输出是标签或分数。

这个心智模型不包括基于** NLP 的任务,这些任务采取 N: N 或 N: M 监督学习任务的形式,其中输入和输出分别是任意长度(N)的文本序列或任意长度 N 和 M 的输入和输出文本序列。例如,N: N 的最佳示例是序列标记(NER,词性),自动语音识别,N: M 的典型示例是机器翻译和文本摘要。**

故意遗漏

如果你仔细观察,我故意省略了数据清理和准备,因为它们是非常领域和任务特定的。因此,当您应用这个心智模型时,请确保您在正确的时间注入了适当的数据清理和准备技术。

心理模型

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

Image by the author

一些经验数据

您可以看到,对于较小的数据集,经典 ML 工作得很好,但对于较大的数据集,它们就逐渐消失了。

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

Image by the author (Screenshot from the research paper)

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

Image by the author (Screenshot from the research paper)

一些代码来玩

  1. TFiDF +逻辑回归,中等规模数据集
  2. 定制单词嵌入+ BiLSTM,小型数据集
  3. 定制单词嵌入+ CNN + BiLSTM,大型数据集

进一步阅读

  1. 更多关于语义、语用和句法的语境。
  2. 什么是语言模型?

关于 RNNs 你需要知道的

原文:https://towardsdatascience.com/all-you-need-to-know-about-rnns-e514f0b00c7c?source=collection_archive---------2-----------------------

TensorFlow 中 RNN 内部的实现和数据操作初学者指南

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

Photo by Laurent Naville on Unsplash

介绍

研究人员提出用神经网络来模拟人脑的行为。但是,如果你仔细想想,正常的神经网络并没有真正实现它的初衷。这种说法的原因是前馈香草神经网络不能记住它学习的东西。每次你训练网络的时候,它都是全新开始的,当你处理当前数据集的时候,它不会记得上一次迭代看到了什么。在识别相关性和数据模式时,这是一个很大的缺点。这就是递归神经网络(RNN)出现的原因。rnn 有一个非常独特的架构,可以帮助它们对存储单元(隐藏状态)进行建模,使它们能够保存数据,从而能够对短期依赖关系进行建模。由于这个原因,rnn 被广泛用于时间序列预测,以确定数据相关性和模式。

尽管 rnn 已经存在了一段时间,但每个人似乎都有自己令人困惑的方式来解释它的架构,没有人真正解释幕后发生了什么。所以让我们缩小差距,好吗?这篇文章旨在通过介绍 RNN 架构的功能,在更精细的层次上解释它。

这是给你的吗?

如果你以前曾盲目地使用 TensorFlow 制作简单的 RNN 模型,如果你发现很难理解 RNN 的内部工作原理,那么这篇文章就是为你准备的。

最终目标?

我们将基本上解释当这两行负责声明 RNN 和启动执行的张量流代码运行时,幕后发生了什么。

cell = tf.contrib.rnn.BasicRNNCell(rnn_size,activation=tf.nn.tanh)

val1, state = tf.nn.dynamic_rnn(cell, inputs, dtype=tf.float32)

RNN 建筑

如果您曾经搜索过关于 RNNs 的架构信息,如果您作为初学者开始研究它们,您可能会得到相当混乱的架构图。我将用一个例子来解释 RNN 架构。

在我们进入正题之前,需要注意的一件重要事情是,RNN 输入需要有 3 个维度。通常是批量大小、步骤数量和特征数量。步骤数描述了将输入到 RNN 的一批数据的一行输入中的时间步骤/时间段的数量。

张量流中的 RNN 单位被称为“RNN 单元”。这个名字本身就在人们中间造成了很多混乱。Stackoverflow 上有很多问题询问“RNN 细胞”是指一个单细胞还是整个层。嗯,更像是整层。其原因是 rnn 中的连接是循环的,因此遵循“自馈”方法。基本上,RNN 图层由单个卷起的 RNN 像元组成,该像元根据您提供的“步数”值(时间步长/时间段数)展开。

正如我们前面提到的,RNNs 的主要特点是建模短期依赖的能力。这是由于 RNN 的隐藏状态。它通过展开的 RNN 单位保留了从一个时间步到另一个时间步的信息。每个展开的 RNN 单元都有一个隐藏状态。当前时间步长的隐藏状态是使用先前时间步长的隐藏状态和当前输入的信息来计算的。在处理当前时间步长信息时,此过程有助于保留模型在先前时间步长中看到的信息。此外,需要注意的是,RNN 的所有关系都有权重和偏差。在某些架构中,偏置可以是可选的。这个过程将在本文的后面部分进一步解释。

既然你现在有了一个基本的想法,那就让我们用一个例子来分解一下执行过程。假设批量大小为 6,RNN 大小为 7,一条输入线中包含的时间步长/时间段数为 5,一个时间步长中的要素数为 3。如果是这种情况,一个批次的输入张量(矩阵)形状将如下所示:

一批的张量形状= (6,5,3)

批处理中的数据如下所示:

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

Fig 01 : Data representation inside a batch of data

注意:这里使用的数据分段方法称为滑动窗口方法,主要用于时间序列分析。这里不用担心数据预处理过程。

当第一次把数据输入 RNN 时。它将具有如下所示的滚动架构:

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

Fig 02: Rolled version of RNN

但是当 RNN 开始处理数据时,它将展开并产生如下所示的输出:

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

Fig 03: Unrolled version of RNN

处理一批:

当您将一批数据输入 RNN 单元格时,它会从输入的第一行开始处理。同样,RNN 单元将顺序处理被馈送的一批数据中的所有输入行,并在最后给出一个输出,该输出包括所有输入行的所有输出。

处理单行输入:

为了处理一行输入,RNN 单元展开“步数”次。你可以在上图中看到这一点(图 03)。由于我们将“步数”定义为 5,RNN 单元已经展开了 5 次。

执行过程如下:

  • 首先,将初始隐藏状态(S)乘以隐藏状态权重(h ),然后将隐藏状态偏差添加到结果中,初始隐藏状态(S)通常是零向量。同时,将时间步长 t ([1,2,3])处的输入和输入权重(I)相乘,并将输入偏差添加到该结果中。我们可以通过激活函数(通常为 tanh (f ))发送上述两个结果的相加来获得时间步长 t 的隐藏状态。

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

Fig 04: Hidden state calculation of time step t

  • 然后,为了获得时间步长 t 处的输出,将时间步长 t 处的隐藏状态(S)乘以时间步长 t 处的输出权重(O ),然后将输出偏差添加到结果中。

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

Fig 05: Output calculation of time step t

  • 当计算时间步长 t+1 处的隐藏状态时,时间步长 t 处的隐藏状态(S)乘以隐藏状态权重(h ),并且隐藏状态偏差被添加到结果中。然后,如前所述,时间步长 t+1 ([4,5,6])的输入将乘以输入权重(I),输入偏差将被添加到结果中。这两个结果将通过一个激活函数发送,通常是 tanh (f)。

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

Fig 06: Hidden state calculation of time step t+1

  • 然后,为了获得时间步长 t+1 处的输出,将时间步长 t+1 处的隐藏状态(S)乘以时间步长 t+1 处的输出权重(O ),然后将输出偏差添加到结果中。如你所见,当产生时间步长 t+1 的输出时,它不仅使用时间步长 t+1 的输入数据,还通过时间步长 t+1 的隐藏状态使用时间步长 t 的数据信息。

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

Fig 07: Output calculation of time step t+1

  • 这个过程将对所有时间步长重复

在处理完批处理中一行输入中的所有时间步骤后,我们将得到 shape (1,7)的 5 个输出。所以当所有这些输出连接在一起时。形状变成(1,5,7)。当批处理的所有输入行都处理完后,我们得到 6 个大小为(1,5,7)的输出。因此,整批的最终输出将是(6,5,7)。

**注意:**在 RNN 的所有连接中,所有隐藏状态权重、输出权重和输入权重具有相同的值。

回到我们之前提到的两行代码:

cell = tf.contrib.rnn.BasicRNNCell(rnn_size,activation=tf.nn.tanh)

val1, state = tf.nn.dynamic_rnn(cell, inputs, dtype=tf.float32)

第一行基本上定义了我们想要创建的 RNN 单元的激活函数和 RNN 大小。第二行通过将输入数据送入 RNN 来执行输入数据的处理程序。处理将根据我们之前讨论的内容进行。最后,该批的输出(shape (6,5,7)的值)将被赋给“val1”变量。隐藏状态的最终值将被赋给“state”变量。

我们现在已经到了文章的结尾。在本文中,我们讨论了 TensorFlow 中 RNN 内部的数据操作和表示过程。有了所有提供的信息,我希望现在你已经很好地理解了 rnn 在 TensorFlow 中是如何工作的。

有用的材料:

  • 关于 RNN 建筑的一般信息,你可以参考这篇文章
  • 要深入了解 RNN 的建筑,请参考这篇文章
  • RNN 的 Coursera 课程

关于自然语言处理和机器学习的文本预处理

原文:https://towardsdatascience.com/all-you-need-to-know-about-text-preprocessing-for-nlp-and-machine-learning-bc1c5765ff67?source=collection_archive---------4-----------------------

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

根据最近的一些对话,我意识到文本预处理是一个被严重忽视的话题。与我交谈过的一些人提到了他们的 NLP 应用程序的不一致的结果,但他们意识到他们没有对他们的文本进行预处理,或者对他们的项目使用了错误的文本预处理。

考虑到这一点,我想解释一下什么是文本预处理,文本预处理的不同方法,以及估计您可能需要多少预处理的方法。对于那些感兴趣的人,我也做了一些文本预处理代码片段供你尝试。现在,让我们开始吧!

什么是文本预处理?

对你的文本进行预处理简单地说就是把你的文本变成一种对你的任务来说 可预测可分析 的形式。这里的任务是方法和领域的结合。例如,用 tfidf (approach)从 Tweets (domain)中提取热门关键词就是一个任务的例子。

任务=方法+领域

一个任务的理想预处理可能成为另一个任务的噩梦。所以请注意:文本预处理不能直接从一个任务转移到另一个任务。

让我们举一个非常简单的例子,假设你正试图在一个新闻数据集中发现常用词。如果您的预处理步骤涉及删除停用词,因为其他任务使用了它,那么您可能会错过一些常用词,因为您已经删除了它们。所以真的,这不是一个放之四海而皆准的方法。

文本预处理技术的类型

有不同的方法来预处理你的文本。这里有一些你应该知道的方法,我会试着强调每种方法的重要性。

用小写字体书写

尽管经常被忽视,但是将文本数据全部小写是最简单也是最有效的文本预处理方式之一。它适用于大多数文本挖掘和 NLP 问题,在数据集不是很大的情况下会有所帮助,并对预期输出的一致性有很大帮助。

最近,我的一个博客读者训练了一个用于相似性查找的单词嵌入模型。他发现输入大写的不同变化(例如“canada”与“Canada”)给了他不同类型的输出或根本没有输出。这可能是因为数据集混合了单词“Canada”的大小写,并且没有足够的证据让神经网络有效地学习不太常见的版本的权重。当你的数据集很小时,这种类型的问题一定会发生,小写是处理稀疏性问题的一个很好的方法。

[## 如何开始使用 word 2 vec——然后如何让它工作

towardsdatascience.com](/how-to-get-started-with-word2vec-and-then-how-to-make-it-work-d0a2fca9dad3)

以下是小写如何解决稀疏性问题的示例,其中大小写不同的相同单词映射到相同的小写形式:

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

Word with different cases all map to the same lowercase form

小写非常有用的另一个例子是搜索。想象一下,你正在寻找包含“美国”的文档。但是,没有显示任何结果,因为“usa”被索引为**“USA”。现在,我们该怪谁呢?设置界面的 U.I .设计师还是设置搜索索引的工程师?**

虽然小写应该是标准做法,但我也遇到过保留大写很重要的情况。例如,预测源代码文件的编程语言。Java 中的单词System和 python 中的system有很大不同。两者的小写使得它们相同,导致分类器丢失重要的预测特征。虽然小写通常有帮助,但它可能不适用于所有任务。

堵塞物

词干化是将单词(如 troubled,trouble)中的词形变化减少到其词根形式(如 trouble)的过程。这种情况下的“根”可能不是真正的根词,而只是原词的规范形式。

词干提取使用一种粗略的启发式过程,即砍掉单词的词尾,希望能正确地将单词转换成其词根形式。所以单词“麻烦”、“困扰”和“麻烦”实际上可能被转换成troubl而不是trouble,因为末端被切掉了(啊,多么粗糙!).

词干提取有不同的算法。最常见的算法是 Porters 算法,这也是已知的对英语有效的经验算法。这里有一个波特·斯特梅尔的词干实例:

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

Effects of stemming inflected words

词干对于处理稀疏性问题以及标准化词汇表非常有用。特别是在搜索应用中,我在词干提取方面取得了成功。其想法是,如果说你搜索“深度学习班”,你也想表面文档提到“深度学习 ”以及“深度 班”,尽管后者听起来不太对。但是你知道我们要做什么。您希望匹配一个单词的所有变体,以显示最相关的文档。

然而,在我以前的大部分文本分类工作中,词干处理只能在一定程度上帮助提高分类精度,而不是使用更好的工程特征和文本丰富方法,如使用单词嵌入。

词汇化

表面上的词汇化与词干化非常相似,目标是去除词形变化并将单词映射到其词根形式。唯一的区别是,术语化试图以正确的方式来实现它。它不只是砍掉一些东西,它实际上是将单词转化为实际的词根。例如,单词“better”可以映射为“good”。它可以使用字典,比如用于映射的 WordNet,或者一些特殊的基于规则的方法。下面是一个使用基于 WordNet 的方法进行词汇化的例子:

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

Effects of Lemmatization with WordNet

根据我的经验,对于搜索和文本分类来说,词汇化并没有比词干化带来更大的好处。事实上,根据您选择的算法,与使用非常基本的词干分析器相比,它可能会慢得多,并且您可能必须知道所讨论的单词的词性才能获得正确的词条。本文发现,对于具有神经结构的文本分类,词条化对准确率没有显著影响。

我个人会谨慎地使用词汇化。额外的开销可能值得,也可能不值得。但是您可以尝试一下,看看它对您的性能指标有什么影响。

停用词删除

停用词是一种语言中的一组常用词。英语中停用词的例子有“a”、“the”、“is”、“are”等。使用停用词背后的直觉是,通过从文本中移除低信息量的词,我们可以专注于重要的词。

例如,在搜索系统的上下文中,如果您的搜索查询是*“什么是文本预处理?”*,你想让搜索系统关注那些谈论text preprocessing的文档,而不是谈论what is的文档。这可以通过阻止分析停用词表中的所有单词来实现。停用词通常应用于搜索系统、文本分类应用、主题建模、主题提取等。

根据我的经验,停用词去除虽然在搜索和主题提取系统中有效,但在分类系统中并不重要。然而,它确实有助于减少所考虑的特征的数量,这有助于保持您的模型大小合适。

下面是一个停用词删除的例子。所有的停用词都被替换为一个虚拟字符, W :

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

Sentence before and after stop word removal

停用词表可以来自预先建立的集合,或者您可以为您的域创建一个自定义列表。一些库(例如 sklearn)允许你删除出现在 X%的文档中的单词,这也可以给你一个停用词删除效果。

正常化

一个被高度忽视的预处理步骤是文本规范化。文本规范化是将文本转换成规范(标准)形式的过程。例如,单词“gooood”和“gud”可以转换为“good”,这是它的规范形式。另一个例子是将几乎相同的单词,如“停用词”、“停用词”和“停用词”映射到“停用词”。

文本规范化对于嘈杂的文本很重要,例如社交媒体评论、文本消息和博客帖子的评论,其中缩写、拼写错误和使用词汇外单词(oov)很普遍。这篇论文表明,通过对推文使用文本规范化策略,他们能够将情感分类准确率提高约 4%。

以下是标准化前后的单词示例:

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

Effects of Text Normalization

注意这些变化是如何映射到同一个标准形式的。

根据我的经验,文本规范化对于分析高度非结构化的临床文本非常有效,在这些文本中,医生以非标准的方式记笔记。我还发现它对于常见同义词和拼写差异的主题提取非常有用(例如,主题建模、主题建模、主题建模、主题建模)。

不幸的是,与词干化和词汇化不同,没有标准化文本的标准方法。这通常取决于任务。例如,规范化临床文本的方式可能与规范化 sms 文本消息的方式不同。

一些常见的文本规范化方法包括字典映射(最简单)、统计机器翻译(SMT)和基于拼写校正的方法。这篇有趣的文章比较了使用基于字典的方法和 SMT 方法来规范化文本消息。

噪声消除

去噪就是去除那些会干扰你文本分析的characters digitspieces of text。去噪是最基本的文本预处理步骤之一。它还高度依赖于领域。

例如,在推文中,噪音可以是除了标签以外的所有特殊字符,因为它表示可以表征推文的概念。噪音的问题在于,它会在您的下游任务中产生不一致的结果。让我们以下面的例子为例:

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

Stemming without Noise Removal

请注意,上面所有的原始单词都包含一些环境噪声。如果你对这些单词进行词干分析,你会发现词干分析的结果看起来不太好。它们都没有正确的词干。然而,通过在这款笔记本中应用一些清理,现在结果看起来好多了:

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

Stemming with Noise Removal

当涉及到文本挖掘和 NLP 时,去噪是你应该首先考虑的事情之一。有各种方法可以消除噪音。这包括标点符号删除特殊字符删除数字删除、html 格式删除、特定领域关键词删除 (例如,retweet 的“RT”)、源代码删除、标题删除等等。这完全取决于你在哪个领域工作,以及你的任务需要什么样的噪声。我的笔记本中的代码片段展示了如何做一些基本的噪声去除。

文本丰富/扩充

文本丰富包括用以前没有的信息来扩充原始文本数据。文本丰富为原始文本提供了更多的语义,从而提高了其预测能力和对数据进行分析的深度。

在信息检索示例中,扩展用户的查询以改善关键词的匹配是一种增强形式。类似于text mining的查询可能会变成text document mining analysis。虽然这对人类来说没有意义,但它可以帮助获取更相关的文档。

你可以在如何丰富你的文本方面变得很有创造力。您可以使用 词性标注 来获取文本中单词的更详细信息。

例如,在文档分类问题中,单词 book 作为名词出现可能导致与作为动词book 不同的分类,因为一个用于阅读的上下文,另一个用于预订某物的上下文。这篇文章讲述了如何利用名词和动词的组合作为输入特征来改进中文文本分类。

然而,随着大量文本的可用性,人们已经开始使用嵌入来丰富单词、短语和句子的含义,用于分类、搜索、摘要和一般的文本生成。在基于深度学习的 NLP 方法中尤其如此,其中单词级嵌入层非常常见。您可以从预先建立的嵌入开始,也可以创建自己的嵌入并在下游任务中使用。

丰富文本数据的其他方法包括短语提取,将复合词识别为一个单词(也称为分块)同义词扩展依存解析

那么…你需要全部做完吗?

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

不完全是,但是如果你想要好的、一致的结果,你确实必须做一些事情。为了给你一个最低限度应该是什么的概念,我已经把它分解为 必须做应该做任务依赖 。在决定你是否真的需要它之前,任何属于任务相关的东西都可以进行定量或定性的测试。

记住,少即是多,你要保持你的方法尽可能优雅。你增加的开销越多,当你遇到问题的时候,你需要剥离的层就越多。

必须做:

  • 噪声消除
  • 小写(在某些情况下可能取决于任务)

应该做:

  • 简单标准化—(例如,标准化相近的相同单词)

依赖于任务:

  1. 高级规范化(例如,处理词汇表之外的单词)
  2. 停用词删除
  3. 词干化/词汇化
  4. 文本丰富/扩充

因此,对于任何任务,你应该做的最起码的事情就是尝试小写你的文本并去除噪声。产生噪声的原因取决于您所在的领域(参见噪声消除部分)。你也可以做一些基本的标准化步骤以获得更多的一致性,然后系统地添加你认为合适的其他层。

一般经验法则

并非所有任务都需要相同级别的预处理。对于一些任务,你可以用最少的。然而,对于其他人来说,数据集是如此嘈杂,如果你没有足够的预处理,它将是垃圾进垃圾出。

这是一个通用的经验法则。这并不总是正确的,但在大多数情况下是可行的。如果您在一个相当一般的领域中有许多写得很好的文本要处理,那么预处理就不是非常关键了;你可以只做最少的事情(例如,使用所有维基百科文本或路透社新闻文章训练一个单词嵌入模型)。

然而,如果您在一个非常狭窄的领域中工作(例如,关于保健食品的 Tweets ),并且数据稀疏且嘈杂,那么您可以从更多的预处理图层中受益,尽管您添加的每个图层(例如,停用词移除、词干化、规范化)都需要作为有意义的图层进行定量或定性验证。下表总结了应该对文本数据执行多少预处理:

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

我希望这里的想法能够引导您走向项目的正确预处理步骤。记住,少即是多。我的一个朋友曾经向我提到,他是如何让一个大型的电子商务搜索系统变得更有效率,更少错误,仅仅是通过抛弃多层不需要的预处理。

[## 如何用 TF-IDF 和 Python 的 Scikit-Learn 从文本中提取关键词

早在 2006 年,当我不得不在 Java 中使用 TF-IDF 进行关键字提取时,我不得不从头开始编写所有的代码…

medium.com](https://medium.com/free-code-camp/how-to-extract-keywords-from-text-with-tf-idf-and-pythons-scikit-learn-b2a0f3d7e667) [## 工业实力自然语言处理

我职业生涯的大部分时间是作为一名研究生研究员,现在是该行业的一名数据科学家。一件事…

towardsdatascience.com](/industrial-strength-natural-language-processing-de2588b6b1ed)

资源

参考

卡维塔·加内桑是《人工智能的商业案例:人工智能战略领导者指南,最佳实践&现实世界应用 的作者。要了解更多关于卡维塔的信息,请访问www.kavita-ganesan.com

开始使用 GitHub 之前您需要知道的所有事情!

原文:https://towardsdatascience.com/all-you-need-to-know-before-starting-with-github-ada7cf62dae2?source=collection_archive---------31-----------------------

GitHub 无处不在。开发人员、数据科学家、数据工程师、统计学家、数据分析师都会在某个时候遇到 GitHub。

在本文中,我将为那些希望快速入门的人提供一个进入 GitHub 的快速入门。

什么是 GitHub?

GitHub 是一个平台,开发人员可以用它来同时开发同一个程序。底层程序称为 Git,它跟踪不同的版本,并支持不同人合并冲突的修改。

Git 是一个允许开发人员跟踪代码变化的程序。

举个例子,假设三个朋友有一个很棒的软件想法。他们都是程序员,他们希望能够同时做出贡献。代码没有“谷歌文档”,所以他们需要别的东西:这是他们需要 Git 允许同时处理相同代码的时候。

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

Git is the program that actually does the work

那么为什么需要 GitHub 呢?

GitHub 是一个通过 Git 共享代码的在线托管平台。Git 是一个命令行工具,GitHub 增加了一个优秀的 web 平台,可以在开发者之间共享,它还可以为你的代码提供外部备份。

GitHub 为 Git 添加了在线功能,并允许开发人员轻松共享项目。

例如,为了对开源软件做出贡献,开发人员经常使用 GitHub。通过使用 GitHub,你可以很容易地在网上找到开源项目的代码,并提出一个贡献。这里只有 Git 是不够的,因为您需要能够在线找到那些项目。GitHub 也使得提议捐款的方式变得更加顺畅。

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

GitHub is an online platform based on Git.

GitHub 入门需要什么?

装置

  1. 在你的电脑上安装 Git。这取决于你工作的平台,但是你可以很容易地在互联网上找到 Git for Windows,Mac 或 Linux。
  2. 你需要一个 GitHub 账户,可以在 GitHub.com 免费创建。
  3. 我建议安装 GitHub 桌面。这是一个图形用户界面,使得使用 Git 更加容易。如果使用 GitHub Desktop,不需要做任何命令行操作。

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

GitHub Desktop is a graphical user interface to Git

基本操作

我将列出 Git 最基本的命令/操作,并通过通俗的描述让您可以轻松入门:

  • 克隆:将 GitHub 上现有的代码文件夹(称为资源库)下载到你的本地计算机上,这样你就可以在上面工作了
  • 提交:当你在你的代码库中做了更改,你必须在上传到 GitHub 之前提交它
  • 推送:当你提交了你的修改,你就可以推送它们,这样它们就可以在 GitHub 上注册,这样潜在的合作者就可以看到它们了
  • **拉:**当其他人正在处理相同的代码,并且他们已经提交了他们的变更,那么你的代码就不再是最新的版本了。要获得最新版本,您应该进行拉取

开始

在开始使用 GitHub 之前,我已经给出了您需要知道的所有信息。

我个人的建议是:首先使用本文中介绍的基本命令习惯使用 Git 和 GitHub。然后,当你觉得准备好了,开始寻找更高级的功能,例如,处理多人同时处理同一代码时发生的冲突变更。

最重要的是将所有这些付诸实践,并真正开始!

我绝对推荐从 这个非常基础的 GitHub 入门教程或者网上有的其他教程开始。

关于预处理,您想知道的是:数据准备

原文:https://towardsdatascience.com/all-you-want-to-know-about-preprocessing-data-preparation-b6c2866071d4?source=collection_archive---------8-----------------------

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

这是一个介绍部分,我们将讨论如何检查和准备您的数据进行进一步的预处理。

如今,几乎所有的 ML/数据挖掘项目工作流都在标准的CRISP-DM(数据挖掘的跨行业标准流程)或其 IBM enhance ASUM-DM(数据挖掘/预测分析的分析解决方案统一方法)上运行。该工作流程中最长也是最重要的步骤是数据准备/预处理,大约占时间的 70%。这一步很重要,因为在大多数情况下,客户提供的数据质量很差,或者不能直接提供给某种 ML 模型。关于数据预处理,我最喜欢的格言是:Garbage in, garbage out (GIGO)。换句话说,如果你给你的模型提供糟糕的数据,就不要指望它会有好的表现。在本帖中,我们将讨论:

  1. Data types
  2. Data validation
  3. Handling dates
  4. Handling nominal and ordinal categorical values

在接下来的文章中,我们将讨论更高级的预处理技术:

  1. 数据清洗和标准化:Normalization and standartizationHandling missing dataHandling outliers
  2. 特征选择和数据集平衡:Dataset balancingFeature extractionFeature selection

这一系列文章代表了通常的预处理流程顺序,但事实上,所有这些部分都是以独立的方式划分的,不需要了解前面部分的知识。

这是一个介绍部分,我们将讨论如何检查和准备您的数据进行进一步的预处理。

数据类型

首先,让我们定义存在哪些数据类型以及它们有哪些度量标准:

Numeric

  1. Discrete -整数值。示例:number of products bought in the shop
  2. Continuos -某个允许范围内的任何值(浮点型、双精度型)。示例:average length of words in text

Categorical

从预定数量的类别中选择的变量值

  1. Ordinal -类别可以有意义地排序。示例:grade (A, B, C, D, E, F)
  2. Nominal -类别没有任何顺序。示例:religion (Christian, Muslim, Hindu, etc.)
  3. Dichotomous/Binary -名词性的特例,只有 2 种可能的类别。示例:gender (male, female)

Date

字符串、python 日期时间、时间戳。示例:12.12.2012

Text

多维数据,更多关于文本预处理的内容见我之前的帖子

Images

多维数据,更多关于图像预处理的内容请见我的下一篇文章

Time series

按时间顺序索引的数据点,关于时间序列预处理的更多信息请见我的下一篇文章。

数据有效性

第一步是最简单也是最明显的:你必须调查和验证你的数据。为了能够验证数据,您必须对您的数据有深入的了解。简单规则:Don't dismiss the description of the dataset。验证步骤包括:

Data type and data representation consistency check

同样的东西必须以同样的方式和同样的格式来表现。示例:

  1. 日期具有相同的格式。在我的实践中,有几次我得到了一部分日期是美国格式,另一部分是欧洲格式的数据。
  2. 整数是真正的整数,不是字符串或浮点数
  3. 分类数据没有重复,因为有空格、小写/大写字母
  4. 其他数据表示不包含错误

Data domain check

数据在允许值范围内。示例:数值变量在允许的(最小,最大)范围内。

Data integrity check

检查允许的关系和约束的履行情况。示例:

  1. 核对姓名头衔和性别,出生年龄和年龄
  2. 历史资料有正确的年表。购买后交货、首次付款前银行开户等。
  3. 这些动作是由被允许的实体做出的。抵押贷款只能批准给 18 岁以上的人,等等。

好的,我们发现了一些错误,我们能做什么?

  1. Correct如果您确定问题出在哪里,请咨询专家或数据提供商。
  2. Discard有误差的样品,在很多情况下这是一个很好的选择,因为你无法满足 1。
  3. Do nothing,这当然会对以后的步骤造成不良影响。

处理日期

不同的系统以不同的格式存储日期:11.12.20192016-02-12Sep 24, 2003等。但是为了在日期数据上建立模型,我们需要以某种方式将其转换成数字格式。

首先,我将向您展示一个如何将日期字符串转换成 python datetime type的示例,这对于后续步骤来说要方便得多。该示例在 pandas 数据框架上演示。让我们假设date_string列包含字符串形式的日期:

# Converts date string column to python datetime type
# `infer_datetime_format=True` says method to guess date format from stringdf['datetime'] = pd.to_datetime(df['date_string'], infer_datetime_format=True)# Converts date string column to python datetime type
# `format` argument specifies the format of date to parse, fails on errorsdf['datetime'] = pd.to_datetime(df['date_string'], format='%Y.%m.%d')

通常,仅仅年份(YYYY)就足够了。但是如果我们想要存储月、日甚至更详细的数据,我们的数字格式必须满足 1 个充分的约束,它必须保存间隔,这意味着,例如,一周中的星期一-星期五必须具有与 1 相同的差值。— 5.任何一个月。所以YYYYMMDD格式将不是一个选项,因为一个月的最后一天和下个月的第一天比一个月的第一天和第二天有更大的距离。实际上,将日期转换为数字格式有 4 种最常见的方法:

Unix timestamp

自 1970 年以来的秒数

优点:

  1. 完美保留音程
  2. 如果小时、分钟和秒很重要,那就好

缺点:

  1. 价值不明显
  2. 不要帮助直觉和知识发现
  3. 越难验证,越容易出错

在 pandas 中将datetime列转换为时间戳:

# Coverts column in python datetime type to timestamp
df['timestamp'] = df['datetime'].values.astype(np.int64) // 10 ** 9

KSP date format

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

优点:

  1. 年份和季度很明显
  2. 简单的直觉和知识发现
  3. 可以扩展到包括时间

缺点:

  1. 保留间隔(几乎)

在 pandas 中将python datetime列转换为 KSP 格式:

import datetime as dt
import calendardef to_ksp_format(datetime):
    year = datetime.year
    day_from_jan_1 = (datetime - dt.datetime(year, 1, 1)).days
    is_leap_year = int(calendar.isleap(year))
    return year + (day_from_jan_1 - 0.5) / (365 + is_leap_year)df['ksp_date'] = df['datetime'].apply(to_ksp_format)

Divide into several features

年、月、日等。

缺点:

  1. 完美保留音程
  2. 简单的直觉和知识发现

优点:

  1. 你增加的维度越多,你的模型就越复杂,但这并不总是坏事。

Construct new feature

基于日期要素构建新要素。例如:

date of birth->-age

date order createddate order delivered->-。

缺点:

  1. 简单的直觉和知识发现

优点:

  1. 手动构建特征可能会导致重要信息丢失

处理分类值

闪回:Categorical -从预定义数量的类别中选择的变量值。与任何其他非数字类型一样,分类值也必须转换为数字值。怎么做才是对的?

Ordinal

类别可以有意义地排序。可以转换成数值,保留其自然顺序。等级:A+ - 4.0A- - 3.7B+ - 3.3B - 3.0等。

熊猫示范:

grades = {
    'A+': 4.0,
    'A-': 3.7,
    'B+': 3.3,
    'B' : 3.0
}
df['grade_numeric'] = df['grade'].apply(lambda x: grades[x])

Dichotomous/Binary

只有两种可能。在这种情况下,您可以将值转换成指标值1/0。比如:Male - 1或者Female - 0,也可以反过来做。

熊猫示范:

df['gender_indicator'] = df['gender'].apply(lambda x: int(x.lower() == 'Male'))

Nominal

所有可能类别中的一个或多个。在这种情况下,必须使用One hot encoding。该方法假设为每个类别创建一个指标值(1 -样本在类别中,0 -如果不在)。该方法也适用于Dichotomous/Binary分类值。永远不要对名义值使用序数表示法,这会导致可怕的副作用,你的模型将无法以正确的方式处理分类特征。

熊猫示范:

# Pandas `.get_dummies()` method
df = pd.concat([df, pd.get_dummies(df['category'], prefix='category')],axis=1)# now drop the original 'category' column (you don't need it anymore)
df.drop(['category'],axis=1, inplace=True)

sklearn 和熊猫中的演示:

from sklearn.preprocessing import LabelEncoder, OneHotEncoderprefix = 'category'ohe = OneHotEncoder(sparse=False)
ohe = ohe.fit(df[['category']])
onehot_encoded = ohe.transform(df[['category']])features_names_prefixed = [ f"{prefix}_{category}" for category in onehot_encoder.categories_[0]]df = pd.concat([df, pd.DataFrame(onehot_encoded, columns=features_names_prefixed)], axis=1)# now drop the original 'category' column (you don't need it anymore)
df.drop(['category'],axis=1, inplace=True)

我希望你会喜欢我的帖子。欢迎在评论中提问。

P.S .这些都是非常非常基础简单的东西,但是在实践中非常重要。更多有趣的东西将会在接下来的帖子中出现!

用 AllenNLP 开始你的 NLP 项目的温和指南

原文:https://towardsdatascience.com/allennlp-startup-guide-24ffd773cd5b?source=collection_archive---------11-----------------------

跟你乱七八糟的代码说再见吧!

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

Photo by Jamie Templeton on Unsplash

你知道图书馆吗?如果你从事自然语言处理(NLP),你可能会听说过这个名字。不过,我估计有几个人真的在用。或者其他人以前尝试过,但不知道从哪里开始,因为有很多功能。对于那些不熟悉 AllenNLP 的人,我将简要介绍一下这个库,并让您了解将它集成到您的项目中的优势。

AllenNLP 是 NLP 的深度学习库。艾伦人工智能研究所,人工智能的领先研究组织之一,开发了这个基于 PyTorch 的库。使用 AllenNLP 开发一个模型比 PyTorch 从头开始构建一个模型要容易得多。它不仅提供了更容易的开发,而且支持实验的管理和开发后的评估。 AllenNLP 的特点是专注于研发。更具体地说,有可能快速原型化模型,并使更容易管理具有许多不同参数的实验。此外,它还考虑使用可读的变量名。

我们可能有过从零开始编码而得到混乱的代码或丢失重要实验结果的经历。

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

When I’ve got to know AllenNLP

在 AllenNLP 中,我们应该遵循下面的开发和实验流程。

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

Comparison between the typical process and the process with AllenNLP

根据你自己的研究项目,你只需要实现 DatasetReader 和 Model,然后用配置文件运行你的各种实验。基本上,我们需要了解以下三个特性,以便开始我们的 AllenNLP 项目

  1. 定义 DatasetReader
  2. 定义您的模型
  3. 设置您的配置文件

换句话说,一旦你理解了它,你就能够进行可伸缩的开发。在这篇文章中,我将通过处理情感分析任务来解释上述三个关键特征。此外,您可以在 post 中使用如下方式检查代码:

[## yasufumy/allennlp_imdb

最简单的 AllenNLP 食谱。在 GitHub 上创建一个帐户,为 yasufumy/allennlp_imdb 的开发做出贡献。

github.com](https://github.com/yasufumy/allennlp_imdb)

我们开始吧!

0.快速回顾:情绪分析

在这里,我将为那些不熟悉的人解释情感分析任务的基础。所以如果你已经很了解它,请继续下一部分:1。定义 DatasetReader。

情感分析是一项尝试对给定文档的极性(积极或消极)进行分类的任务。在本帖中,我们使用 IMDB 中的电影评论作为给定文档。例如,我们将在复仇者联盟 4:终局之战的用户评论中找到正面和负面评论。这一次,我们将使用下面链接中提供的数据集。

[## 情感分析

这是一个用于二元情感分类的数据集,包含的数据比以前的基准测试多得多…

ai.stanford.edu](https://ai.stanford.edu/~amaas/data/sentiment/)

我们将构建模型,将文档(评论)作为输入,预测标签(极性)作为输出。我们应该准备文档和标签对作为数据集。

1.定义 DatasetReader

下图显示了 AllenNLP 中的 DatasetReader 类。这个类主要处理任务中使用的数据。

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

DatasetReader 将原始数据集作为输入,并应用预处理,如小写、标记化等。最后,它输出实例对象的列表,该列表将预处理后的每个数据作为属性保存。在本文中,实例对象将文档和标签信息作为属性。

首先,我们应该继承 DatasetReader 类来创建自己的类。然后我们需要实现三个方法:__init___readtext_to_instance。所以让我们看看如何实现我们自己的 DatasetReader。我将跳过read方法的实现,因为它与 AllenNLP 的用法没有太大关系。但是如果你对它感兴趣,你可以参考这个链接。

实现__init__将如下所示。我们可以通过配置文件控制这个方法的参数。

@DatasetReader.register('imdb')
ImdbDatasetReader(DatasetReaer):
  def __init__(self, token_indexers, tokenizer):
    self._tokenizer = tokenizer
    self._token_indexers = token_indexers

在这篇文章中,我将token_indexerstokenizer设置为参数,因为我假设我们在实验中改变了索引或标记化的方式。token_indexers执行索引,tokenizer执行标记化。我实现的类有装饰器 ( DatasetReader.register('imdb')),这使我们能够通过配置文件来控制它。

实现text_to_instance将如下。这个方法是 DatasetReader 的主进程。text_to_instance将每个原始数据作为输入,应用一些预处理,并将每个原始数据作为一个Instance输出。在 IMDB 中,它将检查字符串和极性标签作为输入。

@DatasetReader.register('imdb')
ImdbDatasetReader(DatasetReaer):
    ...
  def text_to_instance(self, string: str, label: int) -> Instance:
    fields = {}
    tokens = self._tokenizer.tokenize(string)
    fields['tokens'] = TextField(tokens, self._token_indexers)
    fields['label'] = LabelField(label, skip_indexing=True)
    return Instance(fields)

在 AllenNLP 中,实例的属性对应于字段。我们可以从字段字典中创建实例。实例的属性代表每个数据,就像文档或标签一样。在 IMDB 中,实例散列两个属性:review 和 label。评论和标签分别对应于 TextField 和 LabelField。

上面提到的是定义我们的 DatasetReader 的方法。你可以从这个链接查阅整个代码。

2.定义您的模型

下图显示了 AllenNLP 中的模型类。这个类主要是建立模型来解决任务。

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

该模型将数据作为输入,并将正向计算的结果和评估指标作为字典输出。

首先,我们应该继承模型类来创建我们自己的模型类。然后我们需要实现三个方法:__init__forwardget_metrics。这里,我们使用递归神经网络(RNN)实现 IMDB 评论的极性分类模型。

实施__init__将如下。我们可以通过与 DatasetReader 相同的配置文件来控制该方法的参数。

@Model.register('rnn_classifier')
class RnnClassifier(Model):    
def __init__(self, vocab, text_field_embedder,
             seq2vec_encoder, label_namespace):
  super().__init__(vocab)self._text_field_embedder = text_field_embedder
  self._seq2vec_encoder = seq2vec_encoder
  self._classifier_input_dim = self._seq2vec_encoder.get_output_dim()
  self._num_labels = vocab.get_vocab_size(namespace=label_namespace)self._classification_layer = nn.Linear(self._classifier_input_dim, self._num_labels)
  self._accuracy = CategoricalAccuracy()
  self._loss = nn.CrossEntropyLoss()

在这篇文章中,我将text_field_embedderseq2vec_encoder设为自变量,因为我假设我们在实验中改变了嵌入或 RNN 类型的方式。text_field_embedder将令牌作为向量嵌入,seq2vec_encoder用 RNN 对令牌序列进行编码(从技术上讲,除了 RNN,您可以使用其他类型)。我实现的类有装饰器(Model.register('rnn_classifier')),这使我们能够通过配置文件来控制它。

forward的实现如下。这种方法是建模的主要过程。forward将数据作为输入,通过正向计算进行计算,并将预测标签和评估指标的结果作为字典输出。大多数实现与 PyTorch 的方式相同。但是,请注意,我们应该将结果作为字典返回。

def forward(self, tokens, label=None):
  embedded_text = self._text_field_embedder(tokens)
  mask = get_text_field_mask(tokens).float()encoded_text = self._dropout(self._seq2vec_encoder(embedded_text, mask=mask))logits = self._classification_layer(encoded_text)
  probs = F.softmax(logits, dim=1)output_dict = {'logits': logits, 'probs': probs}if label is not None:
    loss = self._loss(logits, label.long().view(-1))
    output_dict['loss'] = loss
    self._accuracy(logits, label)return output_dict

上面的实现计算极性、交叉熵损失和准确度的分类概率。我们通过 softmax 从 RNN 的输出计算分类概率。此外,如果标签给定,我们计算模型的分类精度。最后,它输出每个计算结果作为字典(output_dict)。

实现get_metrics将如下所示。

def get_metrics(self, reset=False):
  return {'accuracy': self._accuracy.get_metric(reset)}

它将精度值作为字典返回。这是因为这次我们使用模型的准确性作为衡量标准。我们可以在get_metrics方法中使用多个值。

上面提到的是我们定义模型的方式。你可以从这个链接查阅整个代码。

3.设置您的配置文件

下图显示了如何在 AllenNLP 中运行我们的实验。我们可以通过将配置文件传递给allennlp train命令来运行我们的实验。

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

我将解释如何制作配置文件来控制我们的实验。我们可以通过下面的命令用 GUI 界面制作配置文件。但是为了更好的理解,我将从头开始解释。

allennlp configure --include-package allennlp_imdb

配置文件主要由dataset_reader字段、model字段和trainer字段组成。

{
  "dataset_reader": {...},
  "model": {...},
  "trainer": {...}
}

dataset_reader字段和model字段分别指定 DatasetReader 的设置和我们到目前为止实现的模型。另外,trainer字段指定了优化器、时期数和设备(CPU/GPU)的设置。你可以从这个链接查阅整个配置文件。接下来,我将分别解释这三个字段的重要部分。

DatasetReader 的设置如下。

"dataset_reader": {
  "type": "imdb",
  "token_indexers": {
    "tokens": {
      "type": "single_id"
    }
  },
  "tokenizer": {
    "type": "word"
  }
}

首先,我们指定在type中使用哪个 DatasetReader。我们可以使用 ImdbDatasetReader 将type设置为imdb,因为它已经准备好供@DatasetReader.register('imdb')使用。AllenNLP 已经提供了许多流行的数据集。你可以从文档中查看这些。

然后,我们为ImdbDatasetReader.__init__方法指定参数。我们使用[SingleIdTokenIndexer](https://github.com/allenai/allennlp/blob/master/allennlp/data/token_indexers/single_id_token_indexer.py#L12)表示token_indexers,因为我们希望令牌对应于单个 id。此外,我们使用[WordTokenizer](https://github.com/allenai/allennlp/blob/master/allennlp/data/tokenizers/word_tokenizer.py#L12)来表示tokenizer,因为我们希望令牌是一个单词。

模型的设置如下。

"model": {
  "type": "rnn_classifier",
  "text_field_embedder": {
    "token_embedders": {
      "type": "embedding",
      ...
    }
  },
  "seq2vec_encoder": {
    "type": "gru",
    ...
  }
}

首先,我们指定在type中使用哪个模型,与 DatasetReader 相同。我们可以使用 RnnClassifier 将type设置为rnn_classifier,因为它已经准备好供@Model.register('rnn_classifier')使用。

然后,我们为RnnClassifier.__init__方法指定参数。我们使用[Embedding](https://allenai.github.io/allennlp-docs/api/allennlp.modules.token_embedders.html#embedding)来表示text_field_embedder,因为我们希望将单词作为向量嵌入。此外,我们用[GRU](https://allenai.github.io/allennlp-docs/api/allennlp.modules.seq2vec_encoders.html)代替seq2vec_encoder,因为我们想通过 GRU 对嵌入的单词序列进行编码。

训练器的设置如下。

"trainer": {
  "num_epochs": 10,
  "optimizer": {
    "type": "adam"
  }
}

num_epochs指定要训练的时期数。optimizer指定优化器更新参数,在这种情况下,我们选择使用adam

上面提到的是建立你的配置文件的方法。

我们可以通过执行以下命令来运行实验:

allennlp train \
    --include-package allennlp_imdb \
    -s /path/to/storage \
    -o '{"trainer": {"cuda_device": 0}} \
    training_config/base_cpu.jsonnet

当我们想改变实验设置时,我们需要创建新的配置文件。但是如果变化很小,我们可以通过下面的命令来改变设置。下面的命令将 GRU 更新为 LSTM。

allennlp train \
    --include-package allennlp_imdb \
    -s /path/to/storage \
    -o '{"trainer": {"cuda_device": 0}} \
    -o '{"model": {"seq2vec_encoder": {"type": "lstm"}}}' \
    training_config/base_cpu.jsonnet

解释到此为止。谢谢你看我的帖子。我希望您了解如何在 AllenNLP 中构建您的数据加载器、建模和管理您的实验。

使用数据科学和定量分析的 Alpha 生成— ABS / TALF

原文:https://towardsdatascience.com/alpha-generation-using-data-science-quantitative-analysis-abs-talf-part-1-eade08b075c?source=collection_archive---------13-----------------------

我喜欢一次性的“异国情调”交易。他们一般人是看不到的,看到一个,机会就没了。或者有人在教科书或类似的文章中了解到。幸运的是,我发现了一次性交易的存在;但对我来说不幸的是,很多时候我不能将我的资本完全投入到这些机会中。

在这篇文章中,我将解释我如何使用数据科学和金融量化分析来评估一个独特的机会,这个机会在 2008 年金融危机后实现了,我在 2009 年离开巴克莱后试图为此筹集资金。这个机会为拥有技术诀窍并能承诺至少 1000 万美元的投资者带来了惊人的回报。

在第二部分中,我将通过以下方式,以简单的方式展示我是如何评估这笔交易的:

  1. 对几种资产支持证券的信用利差建模,考虑它们的历史相关性,并使用自动回归模型
  2. 模拟在一段固定时间内购买固定收益工具,并持有至到期,其回报与伦敦银行同业拆放利率加信用利差挂钩。
  3. 计算在“无损失”的情况下,使用美联储的“无追索权”贷款投资此类工具的杠杆回报。
  4. 模拟买入或卖出的固定收入工具的信贷质量的改善和/或恶化(信贷迁移)。使用单周期马尔可夫模型。
  5. 通过衡量从初始评级“AAA”到“D”评级的转变,并考虑到向“AA”、“A”、“BBB”、“BB”或“B”的变化,模拟投资组合中的损失;将马尔可夫模型扩展到多周期。
  6. 计算投资组合的预期年回报率的分布。
  7. 计算在任何阈值下产生收益的概率。

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

After all the background information, in part II of this post, you’ll be able to analyze one of the best financial opportunities that was generated as a consequence of the financial crisis of 2008.

作为一名数据科学家/定量分析师,我有 1)实际的量化金融背景和 2)金融危机的第一手见证人,很多人问我:a)是什么造成了金融危机?贪婪?错误的算法?b)为什么雷曼兄弟和银行家信托会被允许破产?c)在金融和保险领域,数据科学和定量分析在哪里共存?

由于我的实际专业知识仅限于金融和保险的一个子集,在本文和后续文章中,我将尝试说明我实际参与的交易,以及我使用数据科学结合金融定量分析和一些精算模型进行评估的情况。

还有许多类似的相关问题,有人通过电子邮件,甚至是我在 PyCon 做主题演讲时,亲自问过我。但没有人问我危机带来的机遇,对我来说,这是一个和其他人一样好的问题,其答案取决于你的专业知识和对模型结果采取行动的能力。

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

What are Tensors? What role Gaussian Copulas played in the financial crisis and in the bankruptcy of Lehman? Definitely, not the typical questions you get asked at PyCon. (Picture: PyCon HK PyCon Asia & the Pacific 2017).

领域专长比机器学习技能更重要吗?两个都怎么样?

我坚信,没有领域专业知识的数据科学、机器学习和人工智能的应用,对于开始使用这些工具(至少在金融、保险或相关领域)的公司和组织来说是一个严重的障碍,并且直接从学术界雇用人才,而不接触现实生活中的问题。领域专家不一定与技术方面相关,但对特定行业、行业发展状况、趋势以及影响行业的因素有深入的了解。

不要误解我,我喜欢现在用 TensorFlow 2.0 和 Keras 建立模型是多么容易(是的,现在 TF 完全是 Keras,阅读 Cassie Kozyrkov 的帖子这里,迫不及待地开始玩 Alpha 版本),而不是像我在 1993 年第一次为对冲基金工作时那样从头开始开发神经网络。但是如果你知道工具,拥有领域专业知识仍然会给你一个超越普通数据科学家的巨大优势。

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

Not all data scientists / quants are equal: the different types of data scientists

在我有机会参加的 2012 年加州圣克拉拉的 Strata 会议上,行业专家之间进行了一场“数据科学辩论”,当时的共识是,在数据科学中,领域专业知识比机器学习技能更重要。然而,快速迭代可能会减少拥有领域专业知识的一些优势,但是领域专业知识和快速迭代是无与伦比的,尤其是在需要快速行动的金融环境中。

我见过一些顶尖的硅谷数据科学家在金融和保险问题上失败了,而在这些问题上,一个中等水平的华尔街定量分析师会做得很好。在我目前的咨询实践中,我见过一些目标非常明确的公司将错误类型的数据科学家与该角色的期望相匹配。

Cassie Kozyrkov: “Hope is not a strategy. Just hoping that you hire a researcher and they transcends into the applied stuff…ah…that’s a very risky proposition there”

在金融领域,基本上有四种量化分析师:算法交易量化分析师、前台办公量化分析师、研究员量化分析师和开发者量化分析师。在数据科学中也有 4 种基本类型:商业数据科学家、创造性数据科学家、开发人员数据科学家和研究人员数据科学家。常见的误解是,“研究型数据科学家”(通常像“研究型数据科学家”(researcher quant)一样,拥有令人印象深刻的学术证书但几乎没有实际专业知识的博士)可以在商业环境中完成所有工作,而实际上,与其他类型的数据科学家进行团队合作是必要的。最近看了一个很优秀的视频,卡西·科济尔科夫谈到了这个问题。

事实上,一个博士“研究员量化”(同样相当于对冲基金和金融巨头在招聘时青睐的“研究员数据科学家”)可能在不知不觉中成为了金融危机的最大单一贡献者,通过他开发的算法,因为它促进了业务,所以迅速蔓延到整个行业。

什么是阿尔法?

由于本文的标题陈述了 alpha 生成,为了对金融领域没有专业知识的读者的利益,让我们定义 alpha 和其他术语。

Alpha 是对一项投资的积极回报的衡量,即该投资与基准(市场)相比的表现。1%的 alpha 值意味着在一段选定的时间内,投资的投资回报率比同期的市场回报率高 1%;负阿尔法值意味着投资表现低于市场。Alpha 和 beta 是现代投资组合理论中使用的资本资产定价模型的两个关键系数之一,与标准差、R 平方和夏普比率等其他重要指标密切相关。从历史上看,绝大多数传统基金都有负阿尔法值,这导致了资本向指数基金和非传统对冲基金的外逃。(你为什么要向一个连市场/行业指数都达不到的人付费呢?)

解释完之后,让我们深入了解一些背景信息。

交易之一:定期资产贷款机制(TALF)

《韦氏词典》将“一次性”定义为“仅限于单一时间、场合或实例**😗*一次性”。TALF 就是这种一次性交易之一,由美国美联储创建,旨在缓解金融危机带来的问题。

TALF 计划创建于 2008 年 11 月,旨在刺激消费者支出,以帮助启动经济。这是通过发行资产支持证券实现的。这些证券的抵押品包括汽车(轿车、卡车)贷款、学生贷款、信用卡贷款、设备贷款、保险费融资贷款、小企业管理局担保的贷款、住房抵押贷款或商业抵押贷款。这些贷款的支持来自纽约美联储银行提供的资金。

根据《TALF 协议》,美联储宣布将在 无追索权 基础上向由新老证券支持的合格 AAA 级资产支持证券持有者提供高达 1 万亿美元的贷款。美联储发放的贷款金额等于资产支持型证券的市场价值,减去一个 削发 ,这些贷款在任何时候都由资产支持型证券本身担保。简而言之,你可以用从美联储借来的高达 95%的钱以极低的利率购买某些证券,如果证券表现不如预期,或者没有产生足够的现金来支付美联储贷款的利息,你就不欠他们任何东西。

TALF 的机会是独一无二的,因为美国的金融和监管限制最初不允许投资银行(如高盛等)积极参与这一机会。

对于不受政府约束的高净值个人和少数机构投资者来说,这种机会等于零,但是,很少有人能够足够快地抓住这种机会,因为大多数金融界人士对这些类型的工具并不十分了解。

在一个人为创造的低风险环境中,TALF 让那些拥有专门知识和资金的人能够获得高于平均水平的回报,投资于某些类型的证券。

要理解 TALF,我们首先需要了解什么是资产支持证券,以及我们在 2007 年至 2009 年期间的定位,当时金融危机之前的宏观事件导致了危机本身(当时,我正积极试图筹集资金以利用上述机会)。)

什么是资产支持证券?

资产支持型证券是一种被广泛接受的结构性债务形式,完全由一个独立资产池的现金流来偿还。

虽然证券化市场传统上包括消费者和商业资产,如汽车贷款、信用卡应收账款、抵押贷款和设备租赁,但该市场也容纳了深奥的风险,如项目融资资产、自然灾害、人为灾难(恐怖袭击)、人寿理赔以及版税和知识产权资产。

在基本证券化中,资产由一个实体(“发起人”)出售给一个远离破产的特殊目的载体(“SPV”),通常在离岸管辖区设立。然后,特殊目的机构向资本市场发行债券,债券的还本付息与资产的表现挂钩。通过债券发行获得的收益通过 SPV 传递给发起人(参见图 1 中一个假设的 10 亿美元证券化的例子)。

由于资产是由发起人出售给特殊目的机构的,资产支持证券并不代表发起人资产负债表上的负债,交易被记录为“真实出售”。

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

Figure 1: A template for a $1bn UDS securitization

一旦债券被收回,剩余的资产将归还给发起人。

公司债券和资产支持证券有什么区别?

公司债券是由公司发行的债券。公司在债券市场借钱以扩大业务或资助新的商业风险,它们可以大致分为两类:投资级和投机级(也称为高收益或“垃圾”)债券。投机级债券是由被认为比评级更高的投资级公司信用质量更低、违约风险更高的公司发行的。债券的质量由 评级机构 评级,评级范围一般从“AAA”(优质),到“D”(违约)。

公司债券的信用评级是发行债券的公司特征的函数,它被转化为公司偿还债务的概率。

在证券化中,结构性债务仅由来自孤立资产池的现金流偿还。债务评级以及与债务相关的利率是基于资产质量和结构设计的特征。

资产支持证券(ABS) 是一种证券,其收入支付和价值来自特定的基础资产池或由特定的基础资产池支持。资产池通常是一组不能单独出售的小额非流动资产。将资产汇集成金融工具使它们能够出售给一般投资者,这一过程称为证券化,并使投资基础资产的风险分散化,因为每种证券将代表基础资产多样化池总价值的一小部分。

基础资产池可以包括信用卡的普通付款、汽车和商业车队贷款、抵押贷款、来自飞机租赁的神秘现金流、版税付款和电影收入等。与公司和政府债券一样,摊销型资产支持证券通常根据其平均寿命而不是其规定的到期日进行出售和交易。平均寿命是一个资金池中的每一美元本金预期未偿还的平均时间长度。

资产支持型证券的信用评级是支持债券的资金池特征的函数,它被转化为金融机构支付其债务的概率。

有几十年的统计数据反映了债券在其生命周期内被提升至更高评级的概率,以及被降级的概率。这种统计称为信用迁移概率(见图 2)。然而,并非所有类型的证券都具有相同的信用迁移模式。

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

Figure 2: Observed 1 year credit migration for Asset “X”

对于公司债券和 ABS 债券,如果发行人或资金池的信用质量恶化,评级可能会被下调;如果基本面改善,评级可能会被上调。投资级债券(AAA、AA、A、BBB)迁移到非投资级(低于 BBB 的任何级别)被称为“堕落天使”。

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

Figure 3: In September 2015, the US Environmental Protection Agency issued a notice of violation that Volkswagen (VW) had installed diesel engine software to circumvent the emission standards of the Clean Air Act. ABS showed a high degree of resiliency in this specific case of risk for the VW.

尽管 AAA 级公司债券与 AAA 级资产支持型证券(资产来源于同一家公司)的风险/回报之间存在一定的相关性,但这种关系有时会被打破,因为 AAA 级公司的风险高于 AAA 级资产支持型证券,反之亦然,如图 3 所示。

早在 2000 年代中期,像我这样的销售方前端办公室定量分析师不必开发定制模型来为客户的资产池定价。然而,我们需要遵守“房间里最聪明的人”设定的模型和准则,这些博士定量分析师开发了软件和分析,每个人都在盲目地使用这些软件和分析来为这些工具定价,这基本上是在传播隐藏的风险。

其中一个最聪明的人是中国量化分析师“摇滚明星”大卫 x 李。突然间,他被卷入了高级金融领域,实际上是直接从学术界出来的,几乎没有什么领域的专业知识。David 拥有经济学硕士、精算学硕士、工商管理硕士(MBA)和统计学博士学位,此外他还是一名熟练的程序员。

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

David X. Li, PhD. Had David been involved in the practical side of finance as opposed to the research side, he would have seen that his paper in the wrong hands had serious implications. His model represented an over simplification of the world, and did not handle tail risk at all.

摩根大通几乎痴迷于从顶尖大学聘请顶尖的定量分析师,它聘请了 David Li 到其风险分析部门工作。在那里,他在《固定收益杂志》上发表了一篇题为“违约相关性:Copula 函数方法”的论文

利用一些相对简单的数学方法,我敢说是天真的,李提出了一种简化的方法来模拟违约相关性,甚至没有查看历史违约数据。他的模型和附带的分析因其实施简单而被广泛使用。危机发生多年后,大卫的博士导师说:“这是一个几乎任何人都可以使用的非常简单的数学答案,当你有一把锤子时,一切突然看起来像钉子”。华尔街抓住了这个机会。

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

This equation killed many 401Ks

然而,像我这样的一些前端办公室的定量分析师对这种“罐装”模型不满意,这种模型没有处理尾部风险,我们开发了自己的模型,汇编了可追溯到 1926 年的公司债券和可追溯到 1985 年的资产支持证券的统计数据,这至少在我的案例中,提供了定制的马尔可夫链蒙特卡罗模拟,并提供了超出标准模型的答案。这些定制模型考虑了特定资产池中资产之间的真实相关性,以及资产池中每笔贷款的风险状况和行为,描绘了一幅不同的债券风险图。事实证明,与李的模型所暗示的相比,某些 AAA 级 ABS 的风险要高得多。

少数量化分析师明白这一点,能够向对冲基金的决策者解释机会(做空证券),并让他们做空其中一些证券,从而赚了很多钱。(大多数人都知道,有几部好莱坞电影是关于这个的)。其他人试图筹集资金,但没有成功,因为通常定量分析师没有交易记录,也没有简单的方法做空有可能获得最高回报的证券。

雷曼兄弟(Lehman Brothers)的倒闭,以及数十亿证券引发的降级和违约浪潮,让李的模型变得毫无用处。该模型没有预测到的违约累积起来,抹去了数万亿美元的投资。市值计价会计只会让事情变得更糟。

正如李多年后谈到他自己的模型时说的那样:“最危险的部分是当人们相信从模型中得出的一切。”。

顺便说一句,对我来说,谷歌的 TensorFlow 开始看起来像一把锤子,与此同时,摩根大通、贝莱德和其他公司似乎又在大肆招聘,这次招聘的几乎都是学术界的博士,他们的职能是数据科学家。

如果以史为鉴的话,我认为我们应该谨记李的故事,以资警醒。

为了保持这篇文章的可管理性,在编码会议之前,我将在**“使用数据科学&量化分析预测固定收益的利率、利差和回报”**中继续这篇文章,其中我将涉及:

  • 导致危机的证券化市场有多大?
  • 谁在发行哪里的领导人?
  • 资产支持型证券对美国和全球经济有什么影响?
  • 美联储是如何通过 TALF 计划启动经济的?
  • 让我们回到 2009 年,在违约潮之后,投资 ABS 证券的预期回报是多少?

不用说,我很乐意听到你关于这一点的任何问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值