TowardsDataScience 博客中文翻译 2022(二百八十一)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

XGBoost 多步时间序列预测

原文:https://towardsdatascience.com/multi-step-time-series-forecasting-with-xgboost-65d6820bec39

本文以 24 小时电价预测为例,展示了如何使用 XGBoost 生成多步时间序列预测。

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

阿格巴洛斯Unsplash 上拍摄的照片

许多博客文章和 Kaggle 笔记本都将 XGBoost 应用于时间序列数据。然而,根据我的经验,现有资料要么将 XGBoost 应用于时间序列分类,要么应用于一步预测。本文展示了如何将 XGBoost 应用于多步提前时间序列预测,即预测跨度大于 1 的时间序列预测。这与一步到位预测有很大不同,因此需要这篇文章。

XGBoost [1]是梯度提升树的快速实现。它在包括时间序列预测在内的许多领域取得了良好的效果。例如,论文“我们真的需要深度学习模型进行时间序列预测吗?”表明 XGBoost 可以在许多时间序列预测任务中胜过神经网络[2]。

请注意,本文的目的不是对所选的预测问题产生高度准确的结果。相反,目的是说明如何使用 XGBoost 生成多输出预测。因此,本文不详细讨论时间序列数据探索和预处理,也不讨论超参数调优。关于这个主题已经有很多写得很好的材料了。

本文的其余部分结构如下:

  1. 首先,我们将仔细看看本教程中使用的原始时间序列数据集。
  2. 然后,我将描述如何获得一个带标签的时间序列数据集,该数据集将用于训练和测试 XGBoost 时间序列预测模型。
  3. 最后,我将展示如何训练 XGBoost 时间序列模型,以及如何使用它生成多步预测。

数据集描述和问题表述

本教程中的数据是丹麦以欧元/兆瓦时为单位的批发电力“现货市场”价格。这些数据可以在 Energidataservice [4]上免费获得(根据“全球范围的、免费的、非排他性的和其他无限制的使用许可”[5])。数据具有每小时的分辨率,这意味着在给定的一天中,有 24 个数据点。我们将使用 2017 年 1 月 1 日至 2021 年 6 月 30 日的数据,这将产生一个包含 39,384 个批发电价每小时观察值的数据集。

本教程的目的是展示如何使用 XGBoost 算法生成一个预测 Y ,包括给定输入的 m 小时的预测电价, *X,*包括 n 小时的过去电价观测值。这类问题可以认为是单变量时间序列预测问题。更具体地说,我们将把预测问题公式化为有监督的机器学习任务。

用 XGBoost 进行时间序列预测的数据准备

与任何其他机器学习任务一样,我们需要将数据分成训练数据集和测试数据集。请注意,数据点不被打乱是很重要的,因为我们需要保持观察的自然顺序。

对于有监督的 ML 任务,我们需要一个带标签的数据集。我们通过所谓的固定长度滑动窗口方法获得由 (X,Y) 对组成的标记数据集。使用这种方法,长度为 n+m 的窗口“滑过”数据集,并且在每个位置,它创建一个 (X,Y) 对。滑动窗口从数据集的第一次观察开始,每次滑动移动 S 步。在本教程中,我们将使用步长为 12。滑动窗口方法摘自论文《我们真的需要深度学习模型进行时间序列预测吗[2]其中作者还使用 XGBoost 进行多步提前预测。

在代码中,通过首先产生元组的列表来获得标记的数据集,其中每个元组包含用于切片数据的索引。第一个元组可能是这样的: *(0,192)。*这意味着创建了一个由数据点 0-192 组成的切片。索引元组列表由函数get_indices_entire_sequence()生成,该函数在 repo 的utils.py模块中实现。为了方便起见,它显示如下。

然后,索引元组列表被用作函数get_xgboost_x_y()的输入,该函数也在 repo 的utils.py模块中实现。同样,它显示在下面。该函数的参数是指数列表、数据集(例如训练数据)、预测范围、 *m、*和输入序列长度、*n。*该函数输出两个 numpy 数组:

  1. 所有的模型输入,即具有形状的 X,(实例数, n )。
  2. 所有目标序列,即形状为【实例数, m ) Y、

然后,这两个函数用于生成由 (X,Y) 对组成的训练和测试数据集,如下所示:

使用 XGBoost 生成多步时间序列预测

一旦我们创建了数据,就必须实例化 XGBoost 模型。

然后我们将它包装在 scikit-learn 的MultiOutputRegressor()功能中,使 XGBoost 模型能够产生长度大于 1 的输出序列。这个包装器适合每个目标的一个回归量,目标序列中的每个数据点都被认为是这个上下文中的一个目标。因此,当我们预测提前 24 小时时,包装器实际上适合每个实例的 24 个模型。这使得该函数相对低效,但是该模型仍然比诸如变压器模型的神经网络训练得更快。对于好奇的读者来说,xgboost 包现在似乎天生支持多输出预测[3]。

包装的对象还具有我们从其他 scikit-learn 和 xgboost 模型中了解到的predict()函数,因此我们使用它来生成测试预测。

XGBoost 时间序列预测模型能够立即生成合理的预测,无需调整超参数。正如本文回购中的笔记本所示,其预测的平均绝对误差为 13.1 欧元/兆瓦时。测试数据集的平均值为 54.61 欧元/兆瓦时。

仔细观察下图中的预测,该图显示了相对于目标值的预测,我们可以看到该模型的预测通常遵循目标值的模式,尽管当然还有改进的空间。

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

XGBoost 预测值与实际值(图片由作者提供)

完整示例可在本报告的笔记本中找到:

https://github.com/KasperGroesLudvigsen/xgboost_time_series

摘要

在本教程中,我们介绍了如何处理时间序列数据,以便将其用作 XGBoost 时间序列模型的输入,我们还了解了如何将 XGBoost 模型包装在多输出函数中,从而允许模型生成长度超过 1 的输出序列。从 MAE 和上面的图可以看出,XGBoost 可以产生合理的结果,而无需任何高级数据预处理和超参数调整。这表明 XGBoost 非常适合时间序列预测——这一概念也在前面提到的学术文章[2]中得到支持。

就是这样!我希望你喜欢这篇文章🤞

请留下评论让我知道你的想法。

关注更多与数据科学的时间序列预测绿色软件工程环境影响相关的帖子🍀

并随时在 LinkedIn 上与我联系。

参考

[1]https://arxiv.org/abs/1603.02754

https://arxiv.org/abs/2101.02118

[3]https://www . LinkedIn . com/posts/tunguz _ data science-machine learning-人工智能-activity-6985577378005614592-HnXU?UTM _ source = share&UTM _ medium = member _ desktop

[4]https://www . energidataservice . dk/tso-electricity/Elspotprices

[5]https://www . energidataservice . dk/Conditions _ for _ use _ of _ Danish _ public _ sector _ data-License _ for _ use _ of _ data _ in _ ed . pdf

基于 Keras 的多任务分类学习

原文:https://towardsdatascience.com/multi-task-learning-for-computer-vision-classification-with-keras-36c52e6243d2

了解如何构建一个能够同时执行多种图像分类和多任务学习的模型

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

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

M 多任务学习(multi-task Learning,MLT)是机器学习的一个子领域,通过一个共享模型同时学习多个任务。这种类型的学习有助于提高数据效率和训练速度,因为共享模型将从同一数据集中学习几个任务,并且由于不同任务的辅助信息,将能够更快地学习。此外,它还减少了过度拟合,因为考虑到训练数据的标签对于每个任务是不同的**【1】**,模型将更难与训练数据完美拟合。

本文将介绍 MTL,并展示如何使用 tensorflow 的 Keras 模块在真实数据上实现和训练它。在我的 GitHub 资源库中可以找到完整的代码,以及一个 Jupyter 笔记本,您可以在其中试验您所学到的内容:

https://github.com/JavierMtz5/ArtificialIntelligence

数据预处理

为了使解释简单易懂,将使用 CIFAR-10**【2】**数据集,该数据集在 MIT 许可 下提供。该数据集由 60000 幅 32×32 像素的 RGB 图像组成,分为 10 个不同的类别。它被分为 50000 个训练样本和 10000 个测试样本,并且是完全平衡的,这意味着数据集每类包含 6000 个图像。可以通过执行以下命令轻松加载数据集:

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

数据加载。作者图片

数据集包含以下类:飞机汽车鹿青蛙卡车。多任务模型要学习的两个任务是这些标签上的分类,参见:

  • 任务 1: 修改后的 CIFAR10 数据集上的多类分类(飞机汽车卡车标签,修改说明如下)。
  • 任务二:二元分类(标签为动物车辆)。

实现上述两个分类任务的一个更有效的选择是训练一个只学习第一个任务的模型,其输出将用于预测二元类动物车辆。这方面的一个例子是将青蛙的图像作为输入传递给模型,为此模型将获得作为输出的 frog 类。因为青蛙是一种动物,那么图像将被分类到动物类(这个解决方案的模式可以在下面看到)。

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

图片作者。乔尔·亨利在 Unsplash 上拍摄的青蛙照片

尽管如此,本文将通过应用多任务学习来解决这个问题,因为,虽然它不是最有效的例子,但它完美地展示了 MTL 在这种类型的问题中的有用性和应用,并且它是发展知识的极好基础。

考虑到这一点,并且为了有一个用于训练的平衡数据集,属于鹿的类的实例将被删除。这样做是因为最初数据集包含 30000 个属于动物的样本(5000 个样本×6 个类别)和仅 20000 个属于车辆的样本(5000 个样本×4 个类别),这将使数据集在二进制分类任务方面不平衡。马和鹿的实例被删除,因为它们与猫和狗具有非常相似的特征,因此可能会增加训练的复杂性,因为区分这些类的实例会更加困难。

请注意,在此清理之后,标签具有以下类别:[0、1、2、3、5、6、8、9](缺少 4 和 7,分别对应于鹿和马)。因此,有必要更新标签,使它们从 0 到 7 进行编号,这一步可以在我的资料库中的 Jupyter 笔记本中找到。但是,为了更好地学习,请尝试自己编写代码!

对于多任务学习来说,训练标签是特定于任务的,这一点至关重要。因此,在 n 任务训练中,将定义不同标签的 n 个数组。在这种情况下,第一个任务要求标签是从 0 到 7 的整数(每个类一个数字),第二个任务要求标签是 0 和 1(因为是二进制分类)。数据先前被预处理,使得标签是从 0 到 7 的数字,并且如所期望的,用于二进制分类的标签将基于初始的 0 到 7 标签来构建,使得如果实例对应于动物,则它将是 0,并且当它对应于车辆时,它将是 1。

创建模型

由于这两个任务都使用图像作为训练数据,卷积网络(CNN)将被用作共享模型,因此它将学习最初从图像中提取最重要的特征。共享模型的输出将被展平,并被引入到对应于每个任务的分支。两个分支都将由密集层组成(因为我们已经展平了它们的输入),每个密集层具有不同数量的神经元,其输出层将由 2 个和 8 个神经元组成,分别用于二进制和多类分类任务。除了输出层使用 softmax 和 sigmoid 分别进行多类和二类分类之外,所有层都使用 ReLu 作为激活函数。下面可以看到所描述模型的低级概要以及定义它的代码。

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

模型建筑。作者图片

在代码中,可以看到当定义神经网络的每一层时,对象接收前一层,即其输出是被定义层的输入的层。通过这种方式,Keras 模型可以针对每个任务进行分离,使得两个分支/子模型都从同一个共享模型开始。

通常模型会更新它们的权重,寻求优化它们的损失函数(参见我以前的文章用单层感知器进行数字分类),但是在 MTL,一般模型的每个分支都在学习不同的任务,所以有必要为每个任务指定一个损失函数。然而,张量流在反向传播过程中仅使用单个损失函数的结果,因此还必须定义联合损失函数,其最简单的形式是不同损失函数值的加权和。在这种情况下,联合损失函数定义如下:

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

关节损失功能。作者图片

注意,当 ɣ 等于 0 时,模型将仅接收从任务 2 获得的损失,而如果 ɣ 等于 1,模型将接收任务 1 的损失。这允许仅针对任务 1(如果 ɣ = 1)、仅针对任务 2(如果 ɣ = 0)或针对两个任务(如果 0 < ɣ < 1)来训练模型,这允许模型用于多个场景,这取决于模型需要什么。

通过在 loss_weights 参数中指定模型每个分支的损失函数的权重,可以在编译时在先前创建的模型中定义联合损失函数。见下面的函数。

训练模型

一旦对数据进行了预处理,并且为这两项任务定义了模型,就该对其进行训练了。。fit() 方法用于训练,与定义正常模型时不同,它接收与模型中的分支/输出一样多的数组,如 y 参数。另一方面,与正常模型一样,必须指定批次大小和时期数。在这种情况下,将使用 128 的批量大小,并且它将被训练 15 个时期。

用 3 个不同的γ值训练模型: 00.51 ,代码测量并打印每次训练的运行时间。

评估模型的性能

最后,我们将通过绘制这两项任务在 15 个时期内的精确度来观察不同伽马值的 MTL 模型的结果。这要归功于上面定义的***fit _ batch _ multask _ models()***函数返回的历史列表。

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

不同伽马值的精度与时期图。作者图片

从不同的伽马值获得的图表清楚地显示了上述内容:伽马的极值意味着模型将学习仅执行任务之一,伽马的中间值意味着模型将设法学习完成两个任务。此外,该模型对两种任务都获得了超过 90%的准确率,能够更好地执行二元分类。应该提到的是,二分类比多分类更简单,所以得到的结果是可以预料的。

此外,在 Jupyter 笔记本中,随机拍摄测试数据集的图像,并从模型中提取预测,以检查它是否有效,随时修改它并尝试新事物!

结论

当伽玛值平衡两个任务的损失函数的权重时,多任务学习已经设法在两个任务中实现非常好的结果,并且当取极端伽玛值时,它也完美地完成单任务模型的任务,因此对于模型需要偶尔完成某些任务的情况,这是非常有趣的选择。必须考虑到,模型中的分叉意味着更多的计算成本,因此需要更长的执行时间。此外,尽管建立了极端的伽马值,但是执行时间将继续很长,因为模型在两个分支中以任一方式执行正向和反向传播过程。如果模型只需要执行一个任务,这是很重要的,因为训练单任务模型(没有分支)在计算成本方面会更有效。

最后,应该提到这种类型的架构的巨大可能性。将第一过滤器(共享模型)应用于输入,然后基于定制分支进行预测的事实使得极大地优化训练模型所需的资源成为可能,这些模型需要执行在某些方面具有相似性的任务。已知的和强大的模型可以用作这种类型的架构的基础或共享模型,实现能够在许多不同的任务中实现非常好的结果的模型,总是具有它们的共同性质的一部分。

参考

迈克尔·克劳肖。基于深度神经网络的多任务学习:综述。 arXiv 预印本 arXiv:2009.09796 ,2020

**【2】**首页:

Tensorflow API:

https://www.tensorflow.org/datasets/catalog/cifar10

用 ROC 曲线和 ROC AUC 进行多类分类评价

原文:https://towardsdatascience.com/multiclass-classification-evaluation-with-roc-curves-and-roc-auc-294fd4617e3a

使用 OvR 和 OvO 策略使最常用的分类评估度量适应多类分类问题

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

作者图片

当评估多类分类模型时,我们有时需要调整二元分类中使用的指标,以便在这种情况下工作。我们可以通过使用 OvR 和 OvO 策略来做到这一点。

在这篇文章中,我将展示如何适应 ROC 曲线和 ROC AUC 指标的多类分类。

ROC 曲线和 ROC AUC 评分是评估二元分类模型的重要工具。总之,它们通过所有可能的阈值向我们显示了类别的可分性,或者换句话说,模型对每个类别的分类有多好。

正如我在另一篇文章中已经解释过的,我们可以比较 ROC 曲线(上图)和它们各自的直方图(下图)。直方图越分离,ROC 曲线也越好。

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

ROC 曲线比较。图片作者。

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

类分离直方图比较。图片作者。

但是这个概念不能立即应用于多类分类器。为了在这个场景中使用 ROC 曲线和 ROC AUC,我们需要另一种方法来比较类别:OvR 和 OvO。

在接下来的部分中,我会更好地解释它,您也可以在我的 github 上查看代码:

https://github.com/vinyluis/Articles/tree/main/ROC Curve and ROC AUC

OvR 还是 OvO?

OvR —一个与其余

OvR 代表“One vs Rest”,顾名思义,它是一种通过同时将每个类与所有其他类进行比较来评估多类模型的方法。在这种情况下,我们选择一个类,并将其视为“积极”类,而所有其他类(其余的)则被视为“消极”类。

通过这样做,我们将多类分类输出减少为二类分类输出,因此可以使用所有已知的二类分类度量来评估这种情况。

我们必须对数据中出现的每个类重复这一过程,因此对于一个 3 类数据集,我们得到 3 个不同的 OvR 分数。最后,我们可以对它们进行平均(简单平均或加权平均)以得到最终的 OvR 模型分数。

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

三级设置的 OvR 组合。图片作者。

卵——一对一

正如你可能想象的那样,OvO 代表“一对一”,与 OvR 非常相似,但我们不是将每个类与其他类进行比较,而是比较数据集所有可能的两类组合。

假设我们有一个 3 类场景,我们选择组合“类 1 对类 2”作为第一个场景。第一步是获得仅包含这两个类的数据集的副本,并丢弃所有其他类。然后,我们将 real class = "Class1 "的观察定义为我们的积极类,将 real class = "Class2 "的观察定义为我们的消极类。既然问题是二进制的,我们也可以使用我们用于二进制分类的相同度量。

请注意,“类别 1 与类别 2”不同于“类别 2 与类别 1”,因此这两种情况都应考虑在内。因此,在 3 类数据集中,我们得到 6 个 OvO 分数,在 4 类数据集中,我们得到 12 个 OvO 分数。

在 OvR 中,我们可以平均所有的 OvO 分数,以获得最终的 OvO 模型分数。

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

三级设置的 OvO 组合。图片作者。

OvR ROC 曲线和 ROC AUC

我将使用我在二元分类 ROC 文章中使用的函数来绘制曲线,只做一些修改,这些修改可在这里获得。如果您愿意,也可以使用 scikit-learn 版本。

在这个例子中,我将使用一个包含三个类的合成数据集:“苹果”、“香蕉”和“橙子”。它们在每个类的组合中都有一些重叠,这使得分类器很难正确地学习所有的实例。数据集只有两个特征:“x”和“y”,如下所示:

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

多类散点图。图片作者。

对于这个模型,我训练了 scikit-learn 的 RandomForestClassifier 的一个默认实例。

在下面的代码中,我们:

  • 迭代所有类
  • 准备一个辅助数据帧,使用一个类为“1”,其他类为“0”
  • 绘制类别分布的直方图
  • 绘制每种情况的 ROC 曲线
  • 计算特定类别的 AUC

上面的代码输出了每个类别相对于其他类别的直方图和 ROC 曲线:

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

ROC 曲线和直方图。图片作者。

正如我们所看到的,“橙色”类的分数比其他两个类低一点,但在所有情况下,分类器在预测每个类方面都做得很好。我们还可以在直方图上注意到,我们在真实数据中看到的重叠也存在于预测中。

为了显示每个 OvR AUC 分数,我们可以简单地打印它们。我们也可以取分类器的平均分数:

# Displays the ROC AUC for each class
avg_roc_auc = 0
i = 0
for k in roc_auc_ovr:
    avg_roc_auc += roc_auc_ovr[k]
    i += 1
    print(f"{k} ROC AUC OvR: {roc_auc_ovr[k]:.4f}")
print(f"average ROC AUC OvR: {avg_roc_auc/i:.4f}")

输出是:

apple ROC AUC OvR: 0.9425
banana ROC AUC OvR: 0.9525
orange ROC AUC OvR: 0.9281
average ROC AUC OvR: 0.9410

在这种情况下,平均 ROC AUC OvR 为 0.9410,这是一个非常好的分数,反映了分类器在预测每一类中的表现。

OvO ROC 曲线和 ROC AUC

使用与上一个实验相同的设置,首先需要做的是建立一个包含所有可能的类对的列表:

classes_combinations = []
class_list = list(classes)
for i in range(len(class_list)):
    for j in range(i+1, len(class_list)):
        classes_combinations.append([class_list[i], class_list[j]])
        classes_combinations.append([class_list[j], class_list[i]])

classes_combinations列表将包含所有组合:

[['apple', 'banana'],
 ['banana', 'apple'],
 ['apple', 'orange'],
 ['orange', 'apple'],
 ['banana', 'orange'],
 ['orange', 'banana']]

然后我们迭代所有的组合,类似于 OvR 的情况,我们

  • 准备一个辅助数据帧,只包含两个类的实例
  • 将类 1 的实例定义为“1”,将类 2 的实例定义为“0”
  • 绘制类别分布的直方图
  • 绘制每种情况的 ROC 曲线
  • 计算特定组合的 AUC

上面的代码绘制了所有直方图和 ROC 曲线:

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

ROC 曲线和直方图。图片作者。

请注意,正如所料,“苹果 vs 香蕉”图与“香蕉 vs 苹果”图不同。和前面的例子一样,我们可以单独评估每个组合,并检查模型的不一致性。

我们还可以显示 AUC 并计算平均 OvO AUC:

# Displays the ROC AUC for each class
avg_roc_auc = 0
i = 0
for k in roc_auc_ovo:
    avg_roc_auc += roc_auc_ovo[k]
    i += 1
    print(f"{k} ROC AUC OvO: {roc_auc_ovo[k]:.4f}")
print(f"average ROC AUC OvO: {avg_roc_auc/i:.4f}")

输出是:

apple vs banana ROC AUC OvO: 0.9561
banana vs apple ROC AUC OvO: 0.9547
apple vs orange ROC AUC OvO: 0.9279
orange vs apple ROC AUC OvO: 0.9231
banana vs orange ROC AUC OvO: 0.9498
orange vs banana ROC AUC OvO: 0.9336
average ROC AUC OvO: 0.9409

在这种情况下,平均 ROC AUC 为 0.9409,接近 OvR 方案获得的分数(0.9410)。

结论

OvR 和 OvO 策略可以(并且应该)用于使任何二元分类度量适应多类分类任务。

评估 OvO 和 OvR 结果还有助于了解模型难以描述的类,以及可以添加或移除哪些功能来改善模型的结果。

如果你喜欢这个帖子…

支持我一杯咖啡!

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

给我买杯咖啡!

看看这个很棒的帖子

使用 Keras 预测情感的多类文本分类:有无单词嵌入的比较

原文:https://towardsdatascience.com/multiclass-text-classification-using-keras-to-predict-emotions-a-comparison-with-and-without-word-5ef0a5eaa1a0

单词嵌入增加了文本分类模型的价值吗?让我们在这个探测情绪的多类预测任务中找出答案

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

腾雅特Unsplash 上拍摄的照片

介绍

自然语言处理中的单词嵌入

在自然语言表达中,相似的词出现在相似的上下文中。例如,在这个句子中——“我不舒服,我生病了。“我可能得了 covid,”。单词— 不舒服生病covid 是表示一个人生病的关键词,这是显而易见的。像头痛疼痛跑步 - 鼻子咳嗽等单词也有类似的上下文。然而,关于政治体育的句子中很少会出现这些单词。在体育的上下文中,最频繁出现的关键词可以是速度耐力比赛等等。

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

格伦·凯莉Unsplash 上拍摄的照片

因此,前一组词更多地出现在人们谈论健康或疾病的上下文中,而第二组关键词更可能出现在体育文章或新闻的上下文中。他们很少会重合,但如果重合,可能是关于一个可能生病的球员或谈论从事体力要求高的运动的后果,两者都有体育和健康的重叠背景。这些案例预计会相对较少。

因此,我们可以说,如果一个单词在其他文档中的类似上下文或单词分布中出现过,则在给定上下文或单词分布中找到该单词的概率更高。

那么什么是单词嵌入呢?

单词嵌入是自然语言文本的密集矢量表示,包含关于给定单词上下文的信息。该概念解决了其他语言建模策略的局限性,如以稀疏矩阵表示文本的 tf-idf 和词袋模型,这些模型包含冗余信息,使该过程在计算上昂贵且耗时,并增加了模型的复杂性。此外,它们也特别大,因为矩阵的大小通常和词汇表的大小一样,这就带来了“维数灾难”的问题。

换句话说,在单词嵌入中,单词以这样一种方式被表示为向量(即数字),即在相似上下文中出现的单词在该词汇表的向量空间中间隔很近。为了进一步解释这一点,如果我们记下我们目前拥有的关键字,假设它们已经出现在 N 个文档中,那么,“生病”和“咳嗽”的向量的距离将小于“咳嗽”和“速度”或“咳嗽”和“胜利”之间的距离,而“胜利”和“匹配”之间的距离将小于“胜利”和“生病”。

这是一种确定文本的数字表示的方法,它试图捕捉在多个文档中出现的单词之间的上下文相似性。

获得单词嵌入有多种方式。word2vec 算法学派用于使用ann导出嵌入。Word2vec 的经典实现是在 Gensim 中,您可以在连续单词包(CBOW)模型或跳过 Gram 模型之间进行选择。CBOW 通过尝试预测给定上下文中最合适的单词来学习表示,而在 skip grams 中,它通过尝试预测给定单词的最合适上下文来学习。

关于多级分类

在机器学习中,一个 监督的多类分类任务 *是一个样本可以被分配给一组类中的一个且仅一个类。*例如,在情感分析任务中,样本可以是正面的,也可以是负面的,其中有两个类别可供选择。很多时候,情绪也可以是积极的、消极的或中性的,有三类可供选择。

第一个例子是特殊类型的多类分类过程。由于有两类可供选择,即正类和负类,所以称之为二元分类任务。另一个典型的例子是在欺诈检测任务中,交易可能是欺诈或真实的。

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

皮卡伍德Unsplash 上拍摄的照片

这里的第二个例子有两个以上的类可供选择。有两个以上类别可供选择的分类任务统称为多类别分类问题,其中在两个以上的目标类别中,一个且仅一个类别可以分配给一个样本。

多类分类的评估比二进制分类稍微复杂一些,因为您将评估一个 NxN 矩阵,其中 N 是任务中类的数量,而不是二进制分类的 2x2 矩阵。**因此,为了简化,使用了平均技术,如算术平均(宏)、加权平均和总体精度。**由于准确度不是最佳指标,通常根据数据集的类别分布在算术平均值和加权平均值之间做出选择。

他的案例研究是一个多类分类任务。在这里,我将预测与给定文本相关的情绪,从六个不同的类别中选择——快乐、悲伤、愤怒、爱、惊讶和恐惧。本文解决了以下问题:

  1. 使用 Word2vec 嵌入启动 Keras 嵌入层权重是否会显著提升模型的性能?
  2. 从编程角度看哪个好?
  3. 通过 word2vec 模型、预测模型训练后更新的 Keras 嵌入层权重以及没有使用 word2vec 嵌入初始化层权重的情况下的相似性的比较。

为了回答这些问题,我将使用两种嵌入策略来训练分类器:

策略 1: Gensim 的嵌入,用于初始化 Keras 嵌入层的权重

策略 2: 使用反向传播进行改进,随机初始化嵌入层,即跳过单词嵌入的使用。

注意:按照教程,Python 库需求在这里 列出

一、关于数据

一、数据来源

我在 Kaggle 这里和拥抱脸数据集这里上使用了一个公开的数据集。数据集包含带有相应情感标签的文档列表。这些数据被分成用于构建机器学习模型的训练、测试&验证集。

二世。基础数据统计

  1. 16k 训练、2k 测试和 2k 验证实例。我将使用训练数据来分割和验证模型,并使用测试数据进行测试。我没有在本文中使用验证数据。
  2. 没有丢失的值
  3. 以下是训练和测试数据的分布:

作者在 Plotly 图表工作室上绘制的图表

作者在 Plotly Chart Studio 上绘制的图形

处理没有缺失值的数据更容易😊显然,数据集是不平衡的。训练和测试数据遵循相同的情绪分布。大多数样本要么被标为“悲伤”,要么被标为“快乐”。为了简单起见,我将保留这个分布用于分类器训练。

二。数据预处理和特征工程

i .标签的 OneHot 编码— 因为我们的标签是分类的,所以它们被转换成大小为 1 x 6 的二进制数组,其中每个位置可以取值为 01 。在这个数组中,除了代表与数据样本相关联的标签的索引之外,所有的值都是 0 。例如,如果在第一个位置我们有’ joy ,并且样本被标记为’ joy ‘,那么该数组将看起来像 [1,0,0,0,0,0] ,其中每隔一个位置引用其他标签。同样,假设第三个位置是’悲伤’,样本标记为’悲伤’,数组变成 [0,0,1,0,0,0]

在这段代码中,我首先加载了具有标准列名的数据集。我使用了 Panda 的类别列类型 ,它自动为列类别分配数字类别代码。接下来,在第 10 行,我已经使用了 TensorFlow 的 one_hot 方法为六种情绪构建了一个 hot 编码矩阵。

二。使用 Gensim 的 Word2Vec 模型训练— 代码非常简单。 Gensim 的 word2vec 所需的输入是样本的标记化形式。为此,我使用了 NLTK 的 word_tokenize 方法。

接下来,我使用下面的代码为这个数据集生成嵌入。**注意,我只使用了训练数据集。**除此之外,我已经设置了通常的默认配置,并使用 sg=1 的 skip-gram 模型进行指示。和…窗口大小为 20,这意味着模型将被训练,同时试图从给定的单词中预测前面的 20 个单词和后面的 20 个单词。

使用 word2vec 的注意事项是 —当您测试模型性能或将模型应用于未知数据样本时,您需要像准备训练样本一样预处理令牌。现在,如果 word2vec 模型看到一个未知单词,那么它将引发一个 KeyError

为什么?

因为每个单词嵌入都是使用唯一标识该嵌入所针对的单词的关键字来存储的。对于新的 vocab,密钥将不可用,因此会出现错误。这使得 Word2Vec 的定制模型的使用不灵活,因为它是在一个小数据集上训练的,这使得它无法捕获完整范围的词汇。但是,如果它是一个在大型数据集上预先训练的英语模型,那么在“正确”英语中出现的大多数单词都有可能在模型中被捕获。

有两种方法可以处理定制模型中的这种不灵活性—

  1. 通过使用用于训练 Word2Vec 模型的词汇,从测试数据中比较并丢弃 Vocab(OOV) 中的个单词。这样,您就不太可能遇到测试数据中缺少 vocab 的错误。
  2. 错误处理 —在这个方法中,对于你遇到的每一个错误,你都应该删除或者处理 OOV 词。

**你应该避免的解决方案:**一起使用训练和测试集 vocab,因为那可能导致数据泄漏。此外,这并不能保证看不见的实例不会失败。

我选择了方法 1,下面是实现。我简单地遍历了列表,删除了测试数据中没有出现在 word2vec 模型的 vocab 中的单词。请注意,如果您使用 Python 的 set 操作来删除令牌,令牌的顺序将被打乱,因此用处不大。

三世。生成嵌入矩阵:

为了在 Keras 嵌入层中使用 word2vec 嵌入,我们需要在一个vocab _ size x Embedding _ size矩阵中组织权重,在本例中为 15210 x 300 。下面是我如何使用 Gensim 获得这个。换句话说,这只是一个查找矩阵,其中第行的单词向量是 word2vec 模型词汇表中第行的单词向量。**

四。准备培训和测试数据

接下来,准备训练和测试数据的时间到了,我已经用 word2vec 词汇表中的单词索引替换了标记。当分类器训练时,通过将标记索引与嵌入矩阵中的行号进行匹配来提取单词向量。

最终,样品的长度被标准化为 20 。如果长度超过 20 ,则样本在末尾被截断,如果长度小于 20,则在末尾再次用零填充,如第 24 行和第 25 行所示。

如何确定序列长度:

现在,为了使用 Keras 的嵌入层训练一个人工神经网络模型,我需要标准化输入文本长度。因此,我通过绘制每个样本中单词数量的直方图来分析样本长度。平均来说,大多数样本包含大约 15 个 T21 式的单词。为了捕捉比平均字数多一点的单词,我选择了 20 ,介于第 50 个和第 75 个百分位数之间。

作者在 Plotly Chart Studio 上绘制的图形

三。训练多类分类器

现在我们已经准备好了数据,是时候深入研究分类器训练了。在本文中,我将只关注 Keras 嵌入层是如何工作的。 关于如何使用 Keras 进行 ML 模型训练的详细概述包括代码在此。

那么,Keras 嵌入层是做什么的呢?

Keras 嵌入层通常用于使用深度学习的文本建模任务。它简单地通过输出维数初始化输入维数矩阵,其中输入维数是词汇表的大小,输出维数是代表向量的大小,以构成整个 vocab 的所有单词嵌入的查找表。对于词汇表中代表单词或标记的每个输入整数,该数字将用于从查找表中找到单词嵌入的索引。

现在,如果我们有一个预训练的权重,我们可以使用权重参数加载它,并且我们已经生成了一个查找表。另一种情况是,您没有预先训练的权重,查找表是随机生成的(权重=无),并使用预测中的误差进行改进。

i .使用 Word2vec 嵌入来训练分类器:

在本节中,我将展示用于训练分类器的代码。请注意,我在结尾使用了一个具有 6 个单元的全连接层(因为我们有 6 种情绪要预测)和一个“softmax”激活层。Softmax 为多类别问题中的每个类别分配概率,这些概率的总和必须为 1.0 。因此,一旦我们获得这些概率,我们就使用概率最高的标签作为与样本相关的最有可能的标签。

此外,我使用了 10 纪元,并耐心地提前停止了 2 纪元。解释和细节可以在本节开头链接的博客中找到。

在训练时,分类器,基于确认损失选择的最佳模型,在第六个时期。下面是模型的训练和验证损失曲线。请注意,在最后一个时期,训练损失是最低的,而验证损失是均匀的,约为 0.6。

作者在 Plotly Chart Studio 上绘制的图形

型号性能:

为了评估模型性能,我从检查点重新加载了它-

然后,我用它来获得对训练集的预测,如下面的代码所示:

并且在测试集上显示如下代码:

最后,我使用 SkLearn 的分类报告生成分类指标,如下所示:

现在,让我们完成剩下的程序,在最后比较和评估这两种方法。

二。无 Word2Vec 嵌入初始化的模型训练

我使用 Keras tokenizer 和使用 Keras 嵌入层进行了相同的分类器训练

完整的代码如下:

在模型训练之后,这是训练和验证损失的样子:

作者在 Plotly Chart Studio 上绘制的图形

四。评估:

唷!所以你在这里成功了,让我们称之为—

模型 1: 模型用 word2vec 嵌入来训练

模型 2: 模型在没有 word2vec 嵌入的情况下训练

一、模型性能对比

产生的分类矩阵中代码和模型性能的基本差异总结如下:

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

模特表演对比总结|作者图片

显然,性能没有显著不同,这些结果表明模型 2 在召回率和 F1 分数方面更好,而模型 1 在精确度方面更好。让我们仔细看看…

微观、宏观、加权—准确度、精密度或召回—哪一个?

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

两种型号的分类报告|作者图片

想象一下,你正在设计一个用于心理健康咨询的聊天机器人,这些预测被用来检测情绪和做出反应,不识别悲伤或愤怒的人的成本会很高,因为咨询可能会出错,这对每个人都很重要。辨识度越高,服务越好。在这种情况下,对于每一个假阴性,客户都会受到影响,这将影响你作为顾问的服务。因此,在这种情况下(通常在医学用例中),回忆是重要的,因为它测量了多少预测实际上是正确预测的。

**此外,由于我们的数据集是不平衡的,最合适的评分技术是 加权 它考虑到了类的不平衡,并根据每个类的真实实例数计算标准化的指标。

因此,似乎模型 2 只是稍微好一点,请查看下面的报告解释和混淆矩阵比较。

解读分类报告和混淆矩阵:

这是两个混淆矩阵,混淆出现在相似的地方——观察这里的模式。两个模型都成功地预测了快乐悲伤,模型 2 中的真阳性略多一些。相反,模型 1 在识别愤怒恐惧真阳性方面表现稍好——这些类别具有较少的训练样本数量。似乎模型 1 错误地将其他样本归类为愤怒,比其他人更高。大约 78%的惊喜样本被模型 1 错误地归类为愤怒,令人惊讶的是,在六十六个惊喜样本中只有一个被正确预测。因此,在分类报告中,愤怒惊讶的准确率都很低。惊喜的精度看似很高,因为没有其他职业被错误地预测为惊喜。所以,回忆 _ 惊喜—1(TP)/1*(TP)+0(FP)= 1***

作者在 Plotly 图表工作室绘制的图表

在模型 2 中,预测正确的预测惊喜样本更多——66 个中的 42 个(TP)(所有阳性= TP + FN )。因此,召回率更高,为 64%。这个模型也较少与愤怒混淆,因此整体性能略有提高,因为在这个案例研究中他们是少数。**

作者在 Plotly Chart Studio 上绘制的图形

二。方法比较

就分类器的编程而言,使用 word2vec 来训练可能在预测时遇到未知词汇的模型稍微复杂一些,而 Keras 本质上处理词汇外的问题。

此外,使用 word2vec 嵌入时 分类器训练时间 更长(也是历元数),此外不要忘记 word2vec 模型训练时间。

三。Keras 嵌入中的相似商

在本案例研究的最后步骤,我还使用 Gensim 将模型 1 和 2 的 Keras 嵌入层权重转换为键控矢量格式。所以,我现在有三种类型的词向量-

1.跳过 gram 嵌入
2。训练分类器
3 时获得的更新的跳格嵌入。在没有任何初始嵌入权重的情况下训练分类器时获得的嵌入

以下是从跳过语法嵌入和两个嵌入层权重获得的各个词汇向量空间中更接近单词“happy”的十个单词的列表:

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

分别从 Word2Vec 模型、模型 1 和模型 2 获得相似性。笔记本中的结果不同,但可以用相同的方式解释|作者图片

需要注意的是,虽然 word2vec 被设计为捕获给定单词的上下文,但 Keras 嵌入层只是一个查找层,它的权重根据它正在解决的任务和传播的错误进行更新。由于它们具有根本不同的工作原理,这里的比较不能集中在所获得的相似性的质量上,因此对于没有初始权重的 Keras 嵌入层来说,与‘happy’最相似的前 10 个单词看起来没有太大的相关性。然而,在 skip-gram 模型中学习的嵌入在表示与“happy”一起出现的单词方面更好。

此外,注意,对于没有 word2vec 权重初始化的 Keras 模型,相似性得分在 most_similar 列表中也很低。由此得出结论,这些嵌入,或者更确切地说是单词向量,并没有借鉴单词嵌入的思想,后者采用了一种分布式语义方法来将文本编码为数字。

注意事项和未来工作:

  1. 我已经使用准确性来编译模型和损耗,以便进行监控。由于对于不平衡的数据集来说,准确性是欺骗性的,所以召回率或精确度会更合适。
  2. 阶级不平衡没有得到解决。
  3. 我重新运行了多次,模型在不同的执行中略微优于对方。然而,不管好不好,在大多数运行中,模型 1 的混淆矩阵更加丰富多彩。我认为,这是因为 word2vec 单词嵌入将更接近的向量分配给上下文中一起出现的单词 ,而不是类 ,这使模型变得混乱。

数据集引用:

[1]萨拉维亚,刘,洪春涛,黄,杨海红,吴,陈永胜(2018)。 Carer:用于情绪识别的情境化情感表征。载于2018 自然语言处理经验方法会议论文集(第 3687-3697 页)**

许可证在拥抱面:未知 | 许可证在 Kaggle: CC BY-SA 4.0

资源和代码:

数据分析笔记本 | 分类器培训笔记本

我最喜欢谈论单词嵌入:

  1. Robert Meyer——用 Doc2Vec 和机器学习分类分析用户评论【这个很搞笑……】
  2. Lev Konstantinovskiy —文本相似性与 Gensim 中的下一代单词嵌入

有兴趣阅读更多关于提高该数据集模型性能的信息吗?

**** ****

感谢光临!

我的链接: |LinkedIn|GitHub

多重共线性:有问题吗?

原文:https://towardsdatascience.com/multicollinearity-problem-or-not-d4bd7a9cfb91

多重共线性及其如何影响多元回归模型的简要指南

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

凯莉·德·阿桂在 Unsplash 上的照片

您可能在大学统计学课程中模糊地记得多重共线性是多重回归模型的一个问题。但是多重共线性到底有多成问题*?嗯,就像统计学中的许多主题一样,答案并不完全简单,这取决于你想用你的模型做什么。*

在这篇文章中,我将逐步介绍多重共线性在多重回归模型中面临的一些挑战,并提供一些直觉来解释为什么它会有问题。

共线性和多重共线性

在继续之前,最好先明确什么是共线性和多重共线性。幸运的是,如果你熟悉回归,这些概念非常简单。

如果两个解释变量之间存在线性关联,则存在共线性。这意味着,对于所有观察值 i ,以下情况成立:

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

说明共线性的方程(图片由作者提供。)

多重共线性是这一思想的延伸,如果两个以上的解释变量之间存在线性关联,则存在多重共线性。例如,在您的设计矩阵中,一个变量可能与另外两个变量线性相关,如下所示:

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

说明多重共线性的方程(图片由作者提供)。

严格地说,多重共线性不是相关性:相反,它意味着几个解释变量之间存在线性相关性。这是一个微妙的点——但也是重要的一点——两个例子都说明了预测者之间的确定性关联。这意味着可以对一个变量进行简单的转换来计算另一个变量的精确值。如果这是可能的,那么我们说我们有完美共线性完美多重共线性

在拟合多元回归模型时,我们需要避免的正是这一点。具体来说,多元回归的一个关键假设是不存在完美的多重共线性。所以,我们现在知道什么是完美多重共线性,但是为什么是个问题?

打破行列

简而言之,问题在于冗余,因为完美的多重共线变量提供了相同的信息。

例如,考虑*虚拟变量陷阱。*假设我们有一个设计矩阵,包括两个虚拟编码的{0,1}列。在第一列中,对应于“是”回答的行被赋予值 1。然而,在第二列中,具有“否”响应的行被赋予值 1。在这个例子中,“否”列是完全多余的,因为它可以从“是”列计算出来(“否”= 1 —“是”)。因此,我们不需要单独的列来编码“否”响应,因为“是”列中的零提供了相同的信息。

让我们通过考虑下面的矩阵来进一步扩展冗余的概念:

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

矩阵示例(图片由作者提供)。

这里,前两列是线性独立的;然而,第三个实际上是第一列和第二列的线性组合(第三列是前两列的总和)。这意味着,如果第一列和第三列,或者第二列和第三列是已知的,那么剩下的一列总是可以计算出来的。这里的结论是,最多只能有两个栏目做出真正独立的贡献——第三个栏目总是多余的。

冗余的下游效应是它使得模型参数的估计不可能。在解释为什么快速定义矩矩阵会有用之前:

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

矩矩阵 (图片由作者提供)。

关键的是,要导出普通最小二乘(OLS)估计器 r 必须是可逆的,这意味着矩阵必须具有满秩。如果矩阵是秩亏的,那么 OLS 估计器不存在,因为矩阵不能求逆。

好吧,这意味着什么?

不涉及太多细节,矩阵的是其列所跨越的向量空间的维数。解析这个定义最简单的方法如下:如果你的设计矩阵包含 k 个独立解释变量,那么*rank(r)*应该等于 k 。完美多重共线性的效果是将 r 的秩降低到小于设计矩阵中最大列数的某个值。那么,上面的矩阵 A 只有秩 2,并且是秩亏的。

直觉上,如果你将 k 条信息放入模型,你会希望每条信息都做出有用的贡献。每个变量都应该有自己的权重。相反,如果你有一个完全依赖于另一个变量的变量,那么它不会贡献任何有用的东西,这将导致退化。

不完美的联想

到目前为止,我们一直在讨论变量完全多重共线的最坏情况。然而,在现实世界中,你很少会遇到这个问题。更现实的情况是,你会遇到两个或更多变量之间存在近似线性关联的情况。在这种情况下,线性关联不是确定性的,而是随机的。这可以通过重写上面的等式并引入误差项来描述:

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

随机多重共线性(图片由作者提供)。

这种情况更易于管理,并且不一定导致 r 的退化。但是,如果误差项很小,变量之间的关联可能几乎完全多重共线。在这种情况下,尽管rank(r)= k,模型拟合可能会变得计算不稳定,并产生表现相当不稳定的系数。例如,数据中相当小的变化都会对系数估计值产生巨大影响,从而降低其统计可靠性。

充气模型

好的,如果你想对你的解释变量进行统计推断,那么随机多重共线性会带来一些障碍。具体来说,它的作用是增大估计系数周围的标准误差,这可能导致在存在真实效应时无法拒绝零假设(第二类误差)。幸运的是,统计学家已经来帮忙了,并且创造了一些非常有用的工具来帮助诊断多重共线性。

其中一个工具是方差膨胀因子* (VIF),它量化了多重回归模型中多重共线性的严重程度。从功能上来说,当存在共线性时,它测量估计系数方差的增加。所以,对于协变量 *j,VIF 定义如下:

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

方差膨胀因子(图片由作者提供)。

这里,决定系数是从协变量 j 对剩余 k — 1 变量的回归中得出的。

对 VIF 的解释也相当简单。如果 VIF 接近 1,这意味着协变量 j 与所有其他变量线性无关。大于 1 的值表示某种程度的多重共线性,而介于 1 和 5 之间的值被认为表现出轻度到中度的多重共线性。这些变量可以留在模型中,尽管在解释它们的系数时需要小心。我很快就会谈到这一点。如果 VIF 大于 5,这表明存在中度到高度的多重共线性,您可能需要考虑不考虑这些变量。然而,如果 VIF 是 10,你可能有合理的理由抛弃这个变量。

VIF 的一个非常好的属性是它的平方根指示了系数标准误差的增加。例如,如果一个变量的 VIF 为 4,那么它的标准误差将是与所有其他预测值零相关时的 2 倍。

好了,现在提醒一下:如果你决定保留 VIF 为 1 的变量,那么估计系数的大小将不再提供完全精确的影响度量。回想一下,变量 j 的回归系数反映了在保持所有其他变量不变的情况下,仅 j的每单位增加量的预期响应变化。如果解释变量 j 和其他几个变量之间存在关联,这种解释就不成立,因为 j 的任何变化都不会独立影响响应变量。当然,这种情况的程度取决于 VIF 有多高,但这肯定是需要注意的。

设计问题

到目前为止,我们已经探讨了多重共线性的两个颇成问题的方面:

*1) *完美多重共线性:定义协变量之间的确定性关系,产生退化矩矩阵,从而无法通过 OLS 进行估计;和

*2) *随机多重共线性:协变量近似线性相关,但矩矩阵的秩不受影响。在解释模型系数和关于它们的统计推断时,这确实会产生一些令人头痛的问题,尤其是当误差项很小时。

不过,你会注意到,这些问题只涉及到对预测者的计算——没有提到模型本身。这是因为多重共线性只影响设计矩阵而不影响模型的整体拟合。

所以……问题,还是没有?嗯,就像我开头说的,看情况。

如果您感兴趣的只是解释变量的集合对响应变量的预测程度,那么即使存在多重共线性,模型仍会产生有效的结果。然而,如果你想对个体预测因子* s 做出具体声明,那么多重共线性就更是个问题;但是,如果你意识到了这一点,你可以采取行动来减轻它的影响,在以后的文章中,我将概述这些行动是什么。*

同时,我希望你在这篇文章中找到一些有用的东西。如果您有任何问题、想法或反馈,请随时给我留言。

如果你喜欢这篇文章,并且想保持更新,那么请考虑在 Medium 上关注我。这将确保你不会错过新的内容。如果你更喜欢的话,你也可以在 LinkedIn 和 Twitter 上关注我😉

用 PyTorch 在 5 分钟内进行多标记分类

原文:https://towardsdatascience.com/multilabel-classification-with-pytorch-in-5-minutes-a4fa8993cbc7

您自己的分类任务蓝图

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

亚历克斯·苏普伦在 Unsplash 上的照片

当处理图像分类时,人们通常从对一个类别中的一个或多个类别进行分类开始。例如,如果您想对汽车进行分类,您可以区分它是否是敞篷车。这是二元分类的一个例子。更复杂的任务可能是区分几个类别。它是奥迪、宝马、奔驰还是福特?汽车品牌中有不止一个类别。如果我们想把两个例子结合起来呢?我们可以一次对显示车辆的每张图像的多个特征进行分类,例如品牌、车型和制造年份。一种方法是训练三个独立的分类器**,但是也有可能将所有东西集成到一个模型**。

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

分类任务(由作者完成)

我们将与出于教育目的免费使用的斯坦福汽车数据集一起完成这项工作。我们开始吧:

首先,我们创建了两个函数来 a)下载和提取图像本身,b)存储相应的元数据(包含关于品牌和型号的信息)。在下一步中,我们创建一个类,该类合并两种信息并提取总共三个相关特征:

数据集中所有超过 1000 张图片的品牌。我们将所有其他品牌归入“其他”类别。

我们区分不同类型的车辆:敞篷车、轿跑、SUV、面包车。所有不涉及车型的车型,我们都归纳为“其他”类别。

我们将拼车分成两个时间相关的队列:2009 年及更早发布的所有汽车和 2010 年及更晚发布的所有汽车。

所以我们有三个不同类别的目标,我们希望同时预测其中的每一个。我们可以从元数据中提取所有需要的信息。

如类的文档字符串中所述,我们可以传递包含类的类别的字典:

正如所料,我们得到了一个列表,其中包含三个类别(品牌、类型、年份)的三个数字特性列表。这些是我们的培训标签。我们可以稍后使用字典重新分配它们:

乍一看,每个类都有足够的案例。我们确实有偏斜的分布,但是我们可以通过加权来减轻。我们让这些类保持原样,并为我们的自定义数据集创建一个字典。我们为每个文件名分配相应的训练标签:

接下来,我们将创建自定义数据集。更深入的介绍,你可以看看我的这篇文章。基本上还没什么特别的。唯一的不同是,我们为每个样本加载三个训练标签,而不是一个,并将所有三个标签传递到我们的训练循环中:

我们可以用数据加载器加载一个样本并查看它:

我们的定制数据集和数据加载器按预期工作。我们每批得到一个字典,包含图像和 3 个目标标签。这样我们就有了多标记分类器的先决条件。

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

自定义多标签分类器(由作者提供)

首先,我们加载一个预训练的 ResNet34 并显示最后 3 个子元素。首先是顺序块,然后是池操作,最后是线性层。这会得到 512 个特征作为输入,并给出 1000 个特征作为输出。我们想要删除这最后一层,并用新的层替换它。我们已经知道,我们各有 512 个内特征,需要 a) 6 个品牌外特征,b) 5 个车型外特征,c) 2 个时代外特征。我们可以通过将所有子元素放入一个列表并删除最后一个元素来删除最后一层:

我们可以在没有分类器头的情况下使用 ResNet 处理输出,并查看各自的张量形状:

结果我们得到一个格式为[16,512,1,1]的张量。我们的批次中有 16 个样本,每个图像有 512 个特征。第三和第四个维度的大小为 1,可以通过 torch.flatten() 进行平滑。现在,我们可以将此输出传递给新的分类器层:

这正是我们想要的。在我们的批次中,每个样品有 6 个对数。我们现在可以像往常一样使用训练循环中的损失函数来处理这些。现在,我们添加另外两个分类器层,并将所有内容放在一个自定义模型中:

我们创建了一个灵活的训练程序,考虑了我们模型的所有输出。因此,我们是否有 2 个、3 个或例如 5 个分级机头并不重要。对于多分类任务,我们简单地使用传统的损失函数。我们计算每个头部的 交叉弯曲 并合计损失。这样,我们可以通过一个优化步骤来优化所有三个头的权重:

我们还编写了验证例程,以便我们可以传递灵活数量的类别进行分类。我们计算每个类别的总绩效和每个类别的绩效:

结论

每一类大约 90%的准确率,我们能够做出很好的预测。我们看到,我们可以用一个模型对多个类进行分类,而不需要多个模型或运行。在我们的例子中,我们使用 PyTorch,并且看到我们可以使用定制数据集和定制模型快速创建定制训练例程。此外,尽管任务很复杂,我们还是利用了迁移学习**来快速获得好的结果。在现实世界中,有很多这样的应用领域。**想象一下,你运行一个二手车平台,想要直接从图像中提取关于单个车辆特征的建议。在我们的例子中,我们离这并不远。还有另一种形式的多标签分类。例如,想想社交网络中的图像标签。这里,我们也给出了某些类,但并不是每个图像都被强制分配给每个类。我们将在下一章讨论这个问题。感谢阅读!

进一步阅读

笔记本:https://jovian . ai/droste-benedikt/02-article-py torch-multi label-classification
关于多类:https://scikit-learn.org/stable/modules/multiclass.html

数据集信用

用于细粒度分类的 3D 对象表示
Jonathan Krause,Michael Stark,Jia Deng,李菲菲
第四届 IEEE 表示和识别研讨会,ICCV 2013**(3 drr-13)**。澳大利亚悉尼。2013 年 12 月 8 日。
【pdf】【BibTex】【幻灯片】

https://ai.stanford.edu/~jkrause/cars/car_dataset.html

如果您喜欢中级数据科学,并且还没有注册,请随时使用我的推荐链接加入社区。

使用 Scikit-learn 和堆叠概括正确完成多标签文本分类

原文:https://towardsdatascience.com/multilabel-text-classification-done-right-using-scikit-learn-and-stacked-generalization-f5df2defc3b5

实践教程

以及如何使用递归正则表达式匹配 LaTeX 语法

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

模型堆叠本身就是一门艺术|照片由肖恩·斯特拉顿Unsplash 上拍摄

**Table of Contents**· [Preprocessing](#dd97)
· [Split Dataset](#7cd9)
· [Modeling](#ad85)
  ∘ [Random Prediction](#2de0)
  ∘ [Rule-based Prediction](#6de1)
  ∘ [Machine Learning](#0ccf)
  ∘ [Stacking Models](#1c60)
· [Wrapping Up](#0515)

在这个故事中,您将作为多标签分类任务为数据集进行基线建模。在整个过程中,您将学习如何:

  1. 使用递归正则表达式预处理包含 LaTeX 的文本。
  2. 适当分割多标记观测值,保持关于第级标记组合的平衡表示。
  3. 使用随机预测、基于规则的预测、机器学习预测和模型堆叠从头开始构建基线模型。

如果你不知道什么是多标签分类任务,让我们倒回去一点。基于目标/标签/类别,机器学习中有几种类型的分类问题:

  1. 二进制:由两个类组成的分类问题,表示为一维数组,其中正标签用 1 表示,负标签通常为 0。
  2. 多类:包含两个以上类别的分类问题。多类目标可以表示为从 0 开始的一维整数数组。
  3. Multiclass-multioutput:一个分类问题,其中每个样本的目标由固定整数n1 的 n 个输出组成,每个输出是一个类/标签。每个输出都有一组固定的可用类,每个样本都标有一个对应于每个输出的类。
  4. 多标签:多类多输出分类问题,其中每个输出都是二进制的。

多类-多输出和多标签分类可以表示为整数的二维数组。具体来说,对于多标签,数组的每一列都是一个单独的二进制目标。

如果你仍然迷茫,这张对比汇总表很好地总结了这一点。

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

机器学习中的分类问题类型比较|图片作者作者

你在这个故事中使用的数据集名为math_problems.json,由我和我来自奥林匹克社区的朋友创建。我们来读一下。

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

它有两个特性:problem包含 LaTeX 格式的数学问题,而tags包含代数、组合学、几何或数论中的一两个类。在建立模型时,problem和/或其提取的特征将是你的预测器,而tags将是你的目标。

您将逐步构建您的模型,从最简单的开始,一步步增加复杂性:

  1. 随机预测:不利用problem中的任何信息进行随机预测
  2. 基于规则的预测:基于problem中存在的关键字
  3. 机器学习:从problem中提取特征,然后输入经典模型

我知道许多术语和术语有点令人困惑,尤其是当你在处理多标签分类任务时。所以从现在开始,我们要就如何称呼事物达成一致:

  1. problem中的每个观察被称为问题
  2. tags中的每个观察值或其来自模型的预测被称为一个标签。换句话说,[‘代数’,‘几何’]是一个标签,它的二值化[1,0,1,0]也是。
  3. 标签中的每个元素称为一个标记。使用与前面相同的示例,“代数”和“几何”是标签,1、0、1 和 0 也是标签。

预处理

让我们对一些问题进行取样,以了解数据集。

Let $k\ge 2$ be an integer and $a_1,a_2,\cdots,a_k$ be $k$ non-zero reals. Prove that there are finitely many pairs of pairwise distinct positive integers $(n_1,n_2,\cdots,n_k)$ such that
$$a_1\cdot n_1!+a_2\cdot n_2!+\cdots+a_k\cdot n_k!=0.$$

In $\triangle ABC$, point $M$ is the middle point of $AC$. $MD//AB$ and meet the tangent of $A$ to $\odot(ABC)$ at point $D$. Point $E$ is in $AD$ and point $A$ is the middle point of $DE$. $\{P\}=\odot(ABE)\cap AC,\{Q\}=\odot(ADP)\cap DM$. Prove that $\angle QCB=\angle BAC$.
https://z3.ax1x.com/2021/09/12/4pZ7Zj.jpg

If $n\ge 4,\ n\in\mathbb{N^*},\ n\mid (2^n-2)$. Prove that $\frac{2^n-2}{n}$ is not a prime number.

Find the minimum value of $c$ such that for any positive integer $n\ge 4$ and any set $A\subseteq \{1,2,\cdots,n\}$, if $|A| >cn$, there exists a function $f:A\to\{1,-1\}$ satisfying
$$\left| \sum_{a\in A}a\cdot f(a)\right| \le 1.$$

In triangle $ABC,$ $AB=BC,$ and let $I$ be the incentre of $\triangle ABC.$ $M$ is the midpoint of segment $BI.$ $P$ lies on segment $AC,$ such that $AP=3PC.$ $H$ lies on line $PI,$ such that $MH\perp PH.$ $Q$ is the midpoint of the arc $AB$ of the circumcircle of $\triangle ABC$. Prove that $BH\perp QH.$

探索性数据分析提出了一些清理策略:

  1. 小写所有文本
  2. 删除 URL
  3. 删除所有 LaTeX 数学表达式和渐近线代码块。它们可能传达有用的信息,所以稍后我们也会提取它们。
  4. 删除错误的 LaTeX 语法和停用词
  5. 处理过滤器和非字母数字字符

上述清洁步骤中的第 3 步是最具挑战性的一步。为此,我们形式化了 4 种类型的数学表达式:

  1. 单或双美元符号,\$...\$\$\$...\$\$
  2. 一对括号(...)
  3. 一对支架[...]
  4. \begin...\end命令

为了使用正则表达式匹配 LaTeX 语法,我们使用递归,因为四种类型中的每一种都可以包含在其他类型中。模式相当复杂,如下所示。

这同样适用于渐近线模式。

现在,该打扫卫生了!

如果仔细观察,preprocess_problem函数返回 3 列:

  1. token,遵循上述清洁策略。
  2. latex,包含所有存在于problem中的 LaTeX 命令。
  3. token_latex,与token相同,但带有 LaTeX 命令。

在处理多标签分类任务时,将tags转换为 4 个二进制列,依次表示代数、组合学、几何和数论,然后将结果连接回原始数据集。

array(['algebra', 'combinatorics', 'geometry', 'number theory'],
      dtype=object)

最后,将预处理后的数据集保存到一个名为math_problems_preprocessed.json的新 JSON 文件中。

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

分割数据集

在分割数据集之前,最好了解标签分布,分别计算单标签和双标签。单标签有 4 种,双标签有 6 种组合,共 10 类。根据下面的图,有一个阶级不平衡的迹象,特别是几何。

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

图片作者作者

您将数据集分为 3 部分:训练(70%用于训练模型)、验证(15%用于超参数调整)和测试(15%用于评估模型性能)。目前,我们不会进行超参数调优,但我们将坚持 3-split 场景。Scikit-learn 提供了一种使用train_test_split将数据集一分为二的快速简单的方法。所以,要把它分成 3,用两次train_test_split,如下。为了确保分割中相似的标签分布,不要忘记使用stratify参数。

train: 15952 (70%)
val: 3419 (15%)
test: 3419 (15%)

让我们看看分割后的标签分布。我们希望在分割中看到类似的分布,因为我们希望在尽可能类似于未知数据(验证数据和测试数据)的训练数据上训练我们的模型,以获得良好的泛化能力。

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

图片作者作者

我们看到标签分布在分割中几乎是相同的,这正是我们想要的。如果不是这种情况,对于其他多标签分类任务,特别是对于不平衡的高阶标签组合,我们需要另一种分裂方法。其中一个叫做迭代分层,由于 scikit-multilearn 中的迭代分层模块,可以很容易地使用。你应该自己试试。

建模

在实际应用中,选择模型时需要考虑许多因素。除了性能,我们还应该考虑模型对推理的响应速度、重新训练的时间、计算成本、内存大小、可解释性等。

在性能方面,我们要做的第一件事是构建一个简单的基线来比较模型。由于这是一个分类问题,我们将考虑性能的简单指标,如精确度、召回率和 f1 分数。

因此,构建一个score()函数,它接受真正的标签和预测,并以熊猫数据帧的形式返回精度、召回率和 f1 值。我们使用来自scikit-learnprecision_recall_fscore_support并设置参数average='weighted'来解决等级不平衡的问题。

随机预测

这是最简单的基线。不应该有比随机预测性能更低的模型。如果您找到了一个,很可能是您在建模步骤中走错了方向,或者您的标签没有正确编码。

scores初始化为一个空的数据帧,稍后通过比较验证分割的真实标签和预测标签,该数据帧将用于列出所有模型的分数。

为了维护验证分割和预测的标签分布,将根据您之前建立的标签分布随机选择每个标签。为此,使用参数p等于标签分布的np.random.choice。不要忘记使用仅来自训练数据的标签分布,否则将会有数据泄漏。

您可以使用与前面相同的方法来确认验证分割和预测之间的标记分布的相似性。

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

图片由作者

我们看到分布是相似的。接下来,计算分数并制表到scores。正如预期的那样,分数非常低(大约 0.28),因为没有使用来自预测者的信息。

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

基于规则的预测

现在,如果我们使用来自token的一些关键字来确定标签会怎么样?我所说的关键字是指针对特定标签的问题经常出现的常用词。当然,这需要数学领域的专业知识。首先,我们将为每个标签使用三个关键字,如下所示。比如一道题包含“角”、“圆”、“四边形”这些词,那么就把它归类为几何。

这些启发式预测的一个问题是,它们不能涵盖所有问题,因为可能会有不包含这 12 个词的问题。这些问题的治疗方法是什么?只需随机选择一个标签。

计算分数并将其列表到scores。基于规则的预测比随机预测好很多,但仍然不够好。我们迫切需要机器学习。

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

较低的召回率是由于大量的假阴性,因为许多观察结果没有被我们选择的关键字标记(默认为 0)。

机器学习

这就是乐趣的开始!

我们将尝试选择最好的模型,因此为了使改变许多模型更容易,将它们包装在一个类中(在我们的例子中称为ClfSwitcher),该类继承了 scikit-learn BaseEstimator中的主要方法,如fit()predict()predict_proba()score()

接下来,构建一个管道,从预测器中提取特征,并使用ClfSwitcher从提取的特征中预测标签。我们选择的特征提取器是TfidfVectorizer。Tf 表示术语频率,而 TF–IDF 表示术语频率乘以逆文档频率。它将计数特征重新加权为适合分类器使用的浮点值,以惩罚非常频繁的术语(例如,英语中的“the”、“a”、“is”)。

我们将分别使用 7 种型号:

  1. 逻辑回归
  2. 随机梯度下降
  3. 线性支持向量机(SVM)
  4. k-最近邻(KNN)
  5. 随机森林
  6. 极端梯度增强(XGBoost)
  7. 光梯度推进机(LightGBM)

其中一些模型支持 scikit-learn 实现中的多标签分类,如 k-最近邻、随机森林和 XGBoost。其他的只支持单输出,我们就传给MultiOutputClassifier。请注意,所有模型都尽可能使用不一致的类别权重来解决类别不平衡问题。

至于TfidfVectorizer,我们试图改变 n 元模型,只使用单元模型(1,1),或者同时使用单元模型和二元模型(1,2)。更多细节参见文档

将参数网格中的每组参数分配给管道,在训练分割上训练管道,在验证分割上进行预测,计算分数,并将分数列表到scores。由于有 7 个模型和 2 种 n-gram,参数组的总数是 14。

100%|███████████████████████████████| 14/14 [01:39<00:00,  7.11s/it]

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

定义接受scoresplot()函数,并根据 f1 分数将几个最高分绘制成柱状图。具体来说,它将按降序绘制 f1 值超过 0.80 的分数。

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

图片作者作者

可以看出,几乎所有的模型都是低精度高召回的。这意味着这些模型预测的假阳性比假阴性多。这是有意义的,因为每个标签的最大标签数量是两个,所以当一个模型预测一个问题有两个以上的标签时,它肯定会有一个假阳性。

你会问,如何平衡精确度和召回率?一种方法是使用自定义阈值进行预测(不是默认的 0.5),另一种方法是堆叠一些模型。

堆叠模型

从上面的图中可以明显看出,对于几乎所有的模型,n-gram (1,2)都比(1,1)好。这是因为当我们同时使用单词和双词时,比只使用单词时提取了更多的特征。

基于 f1 分数的最好的三个模型是 SVM、SGD 和逻辑回归。让我们用StackingClassifier把这 3 个排名前 3 的模型堆起来。不要忘记将结果传递给MultiOutputClassifier并设置参数class_weight='balanced'

像以前一样,使用TfidfVectorizer和堆叠模型构建一个管道。对训练分割进行管道训练,对验证分割进行预测,计算分数,并将分数列表给scores

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

图片由作者

CPU times: total: 1.7 s
Wall time: 17.3 s

尽管svm2提供了最佳性能,我们还是会选择stack_model,因为stack_modelsvm2不同,它具有大致相同的精度、召回率和 f1 分数。将此模型保存为 pickle 对象。

您可以再次加载该模型,并对测试分割进行预测,以获得最终性能。我们看到测试分割的分数与验证分割的分数相似(大约 0.85),这是意料之中的。

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

包扎

在本故事中,您将了解如何用 python 解决多标签分类任务。您已经学会了如何:

  1. 使用递归正则表达式预处理包含 LaTeX 的文本。
  2. 适当分割多标记观测值,保持关于第级标记组合的平衡表示。您还会注意到类的不平衡,并知道如何使用 scikit-learn 中的class_weight参数来处理它。
  3. 使用随机预测、基于规则的预测、机器学习预测和模型堆叠从头开始构建基线模型。您可以看到,堆叠模型平衡了单个模型的精确度和召回率。

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

🔥你好!如果你喜欢这个故事,想支持我这个作家,可以考虑 成为会员 。每月只需 5 美元,你就可以无限制地阅读媒体上的所有报道。如果你注册使用我的链接,我会赚一小笔佣金。

🔖想了解更多关于经典机器学习模型如何工作以及如何优化其参数的信息?或者 MLOps 大型项目的例子?有史以来最优秀的文章呢?继续阅读:

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

艾伯斯·乌兹拉

从零开始的机器学习

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

艾伯斯·乌兹拉

高级优化方法

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

艾伯斯·乌兹拉

MLOps 大型项目

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

艾伯斯·乌兹拉

我最好的故事

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

艾伯斯·乌兹拉

R 中的数据科学

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

多语言 NLP:在 5 分钟或更短时间内开始使用 PAWS-X 数据集

原文:https://towardsdatascience.com/multilingual-nlp-get-started-with-the-paws-x-dataset-in-5-minutes-or-less-45a70921d709

检索、处理和使用数据集的实践教程

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

照片感谢来自 Unsplash汉娜·莱特

介绍

PAWS-X [ 1 ]是一个多语言序列分类数据集,使用单词加扰(PAWS)数据集【2】从原始英语释义对手创建。该数据集由 49401 个句子对组成,每个句子对都有一个相关联的标签,该标签指示该句子对是意译(y=1)还是非意译(y=0)。每个句子对由机器从原始英语数据集翻译成以下语言:德语(de)、西班牙语(es)、法语(fr)、日语(ja)、韩语(ko)和中文(zh)。因此,数据集有 7 种语言,涵盖 4 种文字(拉丁文、表意文字、韩文和中文表意文字)和 4 种语系(印欧语(日耳曼语和罗曼语)、日语、韩语和汉藏语)。下面的表 1 描述了一些数据集统计数据。表 2 显示了来自英语数据集子集的示例实例。

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

表 1: 不同数据分割可用的数据集统计。请注意,括号中的数字表示“已清理”实例的数量。

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

**表 2:**PAWS-x 英文子集的两个例子,这些例子直接取自 HuggingFace 上的数据集。

PAWS-X 通常被用作多语言 NLP 的基准,它是 DeepMind 的 XTREME [ 3 ]数据集的一部分。总的来说,这是一个相对容易的数据集,模型达到了 89%的准确率。然而,与人的表现(97.5%)相比,在表现上有相当大的差距。这使得数据集适合于 a)评估新的 NLP 模型的性能(特别是测量跨语言性能),以及 b)在剽窃检测管道中使用它们来微调 NLP 模型。

本文提供了检索、处理和使用数据集的简短指南。如果你不能在 5 分钟内使用数据集(即因为代码中的错误或因为我的文章写得不好),那么我让你失望了。请标记任何问题,以便我可以让其他人的过程更顺利。

检索数据集

数据集可以很容易地从其 HuggingFace 存储库中检索出来。下面的函数可用于检索数据。

务必先安装好数据集库。

pip install datasets

处理数据集

检索数据集后,我运行了一些简单的验证测试。这些是:

  • 确保每种语言的数据集大小相同
  • 确保没有一个句子对是空的

令我失望的是,后一项测试失败了。翻译中的系统性错误导致 272 个实例为空字符串。这个错误被记录在谷歌的 PAWS-X Github repo 的下一期,然而不管什么原因,它还没有被修复。如果你想重现最先进的(SOTA)结果,那么最好而不是在数据集中过滤这些不完整的实例,因为其他研究人员不太可能这么做。

但是,如果您对保持数据集的并行性感兴趣,那么您可以使用下面的函数删除这些损坏的实例(跨所有语言):

注意,我们是基于德国数据集生成 PAWSX_FILTER_IDS 的。事实上,我们可以使用任何翻译的语言(不是英语),因为这个错误是系统性的(我检查过,这个公式为所有翻译的语言提供了相同的 id!)

如果您不想在每次运行代码时定位被排除的 id(取决于您的设置),那么您可能希望将它们硬编码到一个配置文件中。这些 id 以 Python 可复制的格式提供如下:

['306', '473', '624', '1209', '1698', '1858', '1975', '2325', '2530', '2739', '2912', '2991', '3046', '3135', '3394', '3437', '3664', '3726', '3846', '4135', '4518', '4721', '4826', '5107', '5457', '5857', '5934', '6048', '6147', '6506', '6650', '7200', '7350', '7374', '7508', '7666', '7808', '8656', '8789', '8905', '9114', '9259', '9368', '9471', '9854', '10115', '10285', '10386', '10666', '10757', '10992', '11252', '11305', '11385', '11732', '11772', '11783', '11784', '11804', '11843', '11870', '11944', '12484', '12642', '12679', '12754', '12794', '12830', '13136', '14108', '14442', '14525', '14693', '14812', '14820', '14889', '15170', '15395', '15397', '15594', '15647', '16131', '16346', '16359', '16441', '16478', '16777', '17067', '17123', '17563', '17607', '17615', '17863', '17995', '18213', '18443', '18549', '18606', '19075', '19181', '19289', '19311', '19329', '19476', '19597', '19672', '19762', '19882', '19888', '19988', '20028', '20126', '20219', '20752', '20818', '20902', '20903', '21162', '21248', '21520', '21556', '22294', '22585', '22621', '22733', '22785', '22822', '23414', '23588', '23752', '23907', '24964', '25002', '25075', '25088', '25092', '25369', '25587', '25889', '26172', '26787', '26881', '27137', '27223', '27446', '27829', '27925', '28192', '28242', '28517', '28654', '28836', '28846', '29020', '29060', '29066', '29465', '29632', '30314', '30568', '30649', '30882', '31284', '31458', '31712', '31715', '31963', '32035', '32043', '32067', '32334', '32489', '32534', '32976', '33502', '33538', '33974', '34119', '34619', '34634', '34706', '34793', '34820', '34976', '35221', '35251', '35334', '35406', '35439', '35568', '36246', '36406', '36524', '36589', '36651', '36685', '36719', '36816', '36947', '37331', '37397', '37672', '38068', '38093', '38198', '38378', '39005', '39020', '39195', '39633', '39674', '39683', '39744', '40325', '40337', '40397', '40406', '40457', '40509', '40574', '40750', '40799', '40814', '40870', '40913', '41342', '41498', '41579', '41595', '41782', '42177', '42253', '42490', '42568', '42757', '42862', '43161', '43417', '44037', '44467', '44488', '44861', '45243', '45365', '45498', '45594', '45750', '45975', '45982', '46143', '46593', '46672', '46691', '46743', '46751', '47436', '47632', '47657', '47667', '47677', '48090', '48217', '48243', '48307', '48678', 
'48687', '48973', '48994', '49183', '49219', '49312', '49358']

使用数据集

从这一点开始,如何使用数据集主要取决于您。在这里,我提供了关于标记数据集的重要说明,以及一个 Python 类,它允许您在 PyTorch 训练循环中直接加载和使用数据集。如果你对使用 TensorFlow 或 HuggingFace 的训练器感兴趣,可以跳过后半部分。我还提供了 PAWS-X 数据集的两个常见用例。

将数据集符号化

由于我们的问题是对一对句子进行序列分类,我们需要将这两个句子作为单独的参数提供给记号赋予器函数。此外,我们指定 max_length 为 128。这是直接从 XTREME GitHub 中获取的。它相对较小,这意味着我们可以在 Colab 上运行大多数模型,而没有任何内存限制。我们使用“longest_first”进行截断(即,如果句子对超过最大长度,则我们截断较长的句子),并将短句对填充到最大长度。以下代码可用于标记数据集:

PyTorch 训练循环的数据集类

以下代码准备 PAWS-X 数据集(来自 HuggingFace 源代码),以便在 PyTorch 样式的循环中进行训练。

学术用例:基准 NLP 模型

PAWS-X 对于 NLP 模型的基准测试非常有用。尽管它是一个简单的数据集,但与人类的表现相比,它的表现仍有相当大的差距(88.9%比 97.5% [ 3 ])。这主要是因为在非拉丁脚本语言[ 3 ]上性能较弱。这使得数据集成为检查您的 NLP 模型是否具有拉丁文字中心偏向的良好选择。

此外,数据集的大小使其成为开发合成数据集的良好起点。例如,可以创建对立的例子来评估模型的健壮性。因为 PAWS-X 是一个简单的数据集,所以在模型不再有用之前,可以用对立的例子来推动它们。最后,PAWS-X 结构不会对给定的一对句子混合使用不同的语言(也就是说,我们永远不会有一对由一个英语句子和一个西班牙语句子组成的句子)。然而,因为数据集的大小很大,所以可以使用它的很大一部分来用跨句子对混合语言的例子补充数据集,使得该模型在多语言释义检测方面更好,而不损害其在单语释义检测方面的性能。

实际使用案例:PAWS-X 微调抄袭检测

PAWS-X 数据集用于释义检测,这意味着它可以用于微调简单的抄袭检测模型。但是,由于句子长度相对较小,该模型不太可能适用于非常大的文档。因此,任何使用这种模型的管道都必须先将文本分割成句子,然后再输入模型。

使用 PAWS-X 微调抄袭检测模型背后的核心逻辑是“释义”是句子相似性的一种度量。有了这个逻辑,PAWS-X 微调模型测量句子相似度也是可能的(支持传统的度量,比如计算嵌入的余弦相似度)。PAWS-X 的多语言特性意味着也可以跨语言找到相似性(例如,给定一个英语句子“I love you”和一个法语句子“Je t’adore”(简单地说,法语是 I love you),确定它们的相似性)*。

虽然这是事实,但为了在多语言句子相似性方面获得更好的性能,在具有多语言翻译对的增强 PAWS-X 数据集上进行微调将是一个好主意,如章节*“学术用例:NLP 模型基准测试”**中所述

结束语

  • PAWS-X 是以释义检测形式的多语言序列分类数据集
  • 它有超过 49k 个实例,以及额外的 2k 个验证和测试实例
  • 它涵盖 7 种语言,跨越 4 种文字和 4 个语系
  • 这是一个相对简单的任务和数据集
  • 对于对多语言 NLP 感兴趣的人来说,这是一个很好的介绍

作者说明

我写这篇文章的动机是因为我最近在做一个处理多语言数据集的项目。在这个过程中,我发现虽然网上有许多丰富的数据集,但处理它们是一项非常困难的任务(许多数据集以不同的版本出现在不同的位置,可用数据集的大小与论文中报告的大小之间存在差异,存在翻译错误等等)。我心想,其他人可能也经历过同样的问题,将来还会有更多的人遇到,所以为什么不写一些简明的教程来让人们的生活更轻松呢?

这是我打算写的关于多语言 NLP 的系列文章的一部分。前几个将专注于数据集(接下来将是 TyDiQA [ 4 ]和 xf quad[5])。稍后我将把重点转向任务本身(表示数据、有趣的实验、培训和评估教程)。

如果您对我的工作感兴趣,请考虑通过我的推荐链接获得中等会员资格来支持我:

https://namiyousef96.medium.com/membership

这对我很有帮助,因为你的一部分会员费会归我(别担心,这对你没有额外的费用!)同时让您完全访问 Medium 上的所有文章!

参考

相关资源

数据集位置

https://huggingface.co/datasets/paws-x

数据集论文

https://arxiv.org/abs/1908.11828

引用表

[1]https://arxiv.org/abs/1908.11828

[2]https://aclanthology.org/N19-1131.pdf

[3]https://arxiv.org/abs/2003.11080

https://aclanthology.org/2020.tacl-1.30/

https://arxiv.org/abs/1910.11856

声明

根据许可,PAWS-X 数据集可用于任何用途(参见hugging face上的许可信息)。它是由谷歌公司提供的。

所有图片、表格和代码均由作者提供,除非另有说明

多语言 NLP:在 10 分钟或更短时间内开始使用 TyDiQA-GoldP 数据集

原文:https://towardsdatascience.com/multilingual-nlp-get-started-with-the-tydiqa-goldp-dataset-in-10-minutes-or-less-c56c01ad47d2

检索、处理和使用数据集的实践教程

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

照片感谢来自 Unsplash汉娜·莱特

介绍

TyDiQA-GoldP [ 1 ]是一个困难的抽取式问答数据集,通常用于测试问答模型。数据集的价值在于数据的创建方式。注释者被给予随机维基百科文章的前 100 个字符,并被要求提出他们有兴趣找到其答案的问题。引用这篇论文中的一个例子,给定提示“苹果是一种水果”,人类注释者可能会问“史蒂夫·乔布斯死于什么疾病?”。这种生成数据集的策略模拟了人类的好奇心,这可能是 TyDiQA-GoldP 比其他多语言提取 QA 数据集更难的原因之一,例如 XQuAD [ 2 ]和 MLQA [ 3 ]。一旦创建了问题,通过选择问题提示的 Google 搜索结果中出现的第一篇文章,就可以找到匹配的维基百科文章。然后要求注释者在文章中找到与问题匹配的最佳答案,如果存在这样的答案的话。那些没有答案的问答配对被丢弃,而对于那些有答案的配对,只有包含答案的段落被保留。

每个实例由以下内容组成:一个问题、一个答案(文本)、答案的起始范围和实例 ID。该数据集涵盖以下语言:英语(en)、孟加拉语(bn)、韩语(ko)、泰卢固语(te)、斯瓦希里语(sw)、俄语(ru)、芬兰语(fi)、印度尼西亚语(id)、阿拉伯语(ar)。因此,它涵盖了 5 种文字(拉丁文、梵文、西里尔文、韩文、阿拉伯文)和 7 个语系(印欧语系(印度雅利安语、日耳曼语、斯拉夫语)、亚非语系、乌拉尔语系、南岛语系、朝鲜语系、尼日尔-刚果语系、德拉威语系)。与许多多语言 NLP 数据集不同,原始的 TyDiQA-GoldP 是而不是并行的。这意味着实例不能匹配,因为它们不是通过翻译创建的。然而,DeepMind [ 4 ]通过获取英语子集并将其翻译成其他语言,创建了一个平行版本的 TyDiQA-GoldP。表 1 显示了原始 TyDiQA-GoldP 数据集中每种语言的实例数量,而表 2 显示了 DeepMind 生成的数据集的统计数据。表 3 显示了数据集英文子集的一个实例。

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

表 1: 原始 TyDiQA-GoldP 数据集中每种语言的示例数量

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

表 2: 并行数据集中每种语言的示例数量。注意,数字 3969 对应于数据集的英语子集,该子集被用作翻译成其他语言的基础。括号中的数字显示了所有语言的公共数据点的数量(15%由于翻译错误而丢失)

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

**表 3:**ty diqa-GoldP 英文子集的一个示例

TyDiQA-GoldP 通常用作多语言 NLP 的基准,并行数据集作为 DeepMind 的 XTREME [ 4 ]数据集的一部分出现。总的来说,这是一个非常困难的数据集,模型在 F1 得分上达到 77.6,在精确匹配上达到 68[4]。作为比较,人类的表现是 90.1。最初的 TyDiQA-GoldP 相对较大,适合进行微调,特别是提高非拉丁语系语言的性能。并行 TyDiQA-GoldP 数据集相对较小,适合在公开可用的 GPU(如 Colab)上进行训练。

在这篇文章中,我提供了一个实践教程,用于从多个来源(从平面文件和通过datasets API 从 HuggingFace)检索数据集,处理它(检查数据有效性,找到匹配的实例)并将其用于原始设置和来自 DeepMind 的并行设置(将其标记用于训练)。为了确保流畅的用户体验,我写这篇文章时考虑了以下几点:

  • 不到 10 分钟
  • 用于快速检索数据集的可用脚本
  • 数据差异的解释(如有)

检索数据集

非平行设置

在非并行设置中,开发集和训练集都可以从 TyDiQA 下载。json 文件。开发集可以在这里找到,而训练集可以在这里找到。下载后,文件可以读入datasets.Dataset类,如下所示:

值得注意的是,非平行的 TyDiQA-GoldP 数据集也存在于 HuggingFace 上,并且在两个不同的位置复制!它可以从 TyDiQA HuggingFace 数据集和 XTREME HuggingFace 数据集中下载。将两者都作为datasets.Dataset类加载的代码如下所示(我个人更喜欢 XTREME 类,因为它更快……):

值得注意的是,虽然。json 文件与 HuggingFace 数据中的不匹配,数据集是相同的。原始格式的两个数据集混合了所有语言。我们将在“处理数据集”一节中看到如何为每种语言创建单独的数据集。

平行设置

数据集只能从 XTREME 存储库中下载,具体来说就是这里的不要使用 HuggingFace XTREME 存储库中的版本,因为那只适用于非平行设置(我是通过艰苦的努力才知道的……)。

**验证数据:**注意,虽然与训练数据存在差异,但验证数据并非如此。首先,验证数据没有“平行”设置。来自 TyDiQA 文件的验证子集(称为“dev”)和 XTREME/TyDiQA HuggingFace 存储库都是相同的。因此,最简单的方法是使用非平行设置的函数,并为分割指定“验证”。值得注意的是,来自 XTREME GitHub repo 的 translate-test 不要与验证数据混淆。

处理数据集

检索数据集后,我运行了一些简单的验证检查。这些是:

  • 确保没有空洞的问题、上下文或答案
  • 确保训练子集只有一个答案
  • 检查每个数据集的 id 是否唯一

幸运的是,这些测试通过了非并行设置和并行设置。

非平行设置

此部分是可选的。只有当您希望按语言分割数据集时,它才是有用的,请记住数据集不是并行的

平行设置

对于这个设置,我运行了两个额外的测试来确保数据确实是并行的:

  • 对照文献中报告的数据集大小检查数据集大小(在平行设置的情况下)
  • 确保每种语言的数据集大小相同(在并行设置的情况下)

不幸的是,这两项测试都失败了。对于后者,我得到了每种语言的以下数据集大小:

bn: 3585/3585 ids unique
fi: 3670/3670 ids unique
ru: 3394/3394 ids unique
ko: 3607/3607 ids unique
te: 3658/3658 ids unique
sw: 3622/3622 ids unique
id: 3667/3667 ids unique
ar: 3661/3661 ids unique

对于为什么会有缺失的数据点,我的最佳猜测是翻译过程本身会导致错误。这是因为问答任务并不简单,直接翻译可能提供不再匹配的问答对,因此这些例子被丢弃。在匹配 id 以找到真正并行的示例总数之后,我剩下 3150 个数据点,这意味着丢失了 15%的数据集(从并行数据的角度来看)。

我发现的问题是,TyDiQA-GoldP 验证集的大小似乎与 XTREME 论文中报告的任何数字都不匹配。首先,据称数据集有一个“开发”集和一个“测试”集,但是,在 XTREME GitHub repo 上没有找到。其次,“验证”数据集的大小与“开发”和“测试”数据集的大小不匹配。这是我在他们的 GitHub 页面上提出的一个公开的问题。

也就是说,下面给出了查找公共实例和检查是否有空实例的函数:

(可选—仅当您希望将数据集用作本文提供的 PyTorch 类的一部分时)

我们可以保存处理过的数据集,供 PyTorch 数据类以后使用。

使用数据集

在这一节中,我提供了 TyDiQA 的标记化参数(和代码),以及允许在训练循环中直接使用的 PyTorch 数据集类(仅用于并行情况)。我还为 TyDiQA-GoldP 数据集提供了一个学术和实践用例。

将数据集符号化

因为我们的问题是抽取式问答,所以我们需要在标记之前对每个例子做一些处理。主要是,我们必须注意不要从上下文中截断答案。因此,当提供一个最大长度的时,我们还需要提供一个步幅**。这样,我们可以确保很长的上下文被拆分成多个实例,确保至少在其中一个实例中,我们会有完整的答案。我们还将标记器参数截断设置为“second_only ”,以确保只有上下文被截断。我们指定 max_length384stride128 ,直接取自 XTREME GitHub 。我们还需要确保训练示例的处理方式不同于验证示例。下面提供了执行此操作的函数:**

PyTorch 训练循环的数据集类

以下代码准备了 TyDiQA-GoldP 数据集(来自预处理的源),以便在 PyTorch 样式的循环中进行训练。

学术用例:将你的 QA 模型推向极限

TyDiQA-GoldP 很难,因为它的创建方式,也因为语言的选择(例如,它有低资源语言,如斯瓦希里语和泰卢固语)。这使得它成为评估 QA 模型跨语言性能的绝佳选择。

然而,值得注意的是,由于上面提出的开放问题,复制您在文献中看到的结果可能需要一点反复试验的过程,因为不清楚在得出该结果时使用了哪种状态的数据。

实际用例:TydiQA-GoldP 微调问答

原始的 TyDiQA-GoldP 数据集有利于微调,原因有二:a)数据集相当大,b)很难。更重要的是,它包含了一套非常多样化的语言。除了介绍中提到的 7 个语系和 4 种文字外,该数据集中的语言还涵盖了一系列有趣的语言现象,例如[ 4 ]:

  • **音调符号:**字母上决定发音的符号。TyDiQA-GoldP 示例:阿拉伯语
  • **广泛复合:**多个词的组合,如:Note+book=Notebook。TyDiQA-GoldP 的例子:泰卢固语
  • **绑定词:**句法上独立,但音韵上依赖的词,例如 it’s = it is。TyDiQA-GoldP 的例子:孟加拉语
  • **词形变化:**修饰一个词来表达语法信息,如:桑,唱,唱。TyDiQA-GoldP 示例:俄语
  • **派生:**由动词创造名词,例如 slow→slow。TyDiQA-GoldP 示例:韩语

结束语

  • TyDiQA-GoldP 是一个多语言的抽取式问答数据集
  • 本质上它是不平行的,但是存在一个基于原始英语子集的小型平行版本
  • 非平行数据集有 1636–14805 个数据点,而平行数据集有 3150 个数据点
  • 它涵盖 9 种语言,跨越 4 种文字和 7 个语系
  • 这是一项艰巨的任务和数据集
  • 对于对多语言问答感兴趣的人来说,这是一个很好的介绍,因为它的大小,但不要期望很高的分数!

作者说明

我个人花了很长时间来确定使用哪些 TyDiQA 数据集进行并行训练和评估。由于在网上没有找到类似的文章,我决定写这篇文章,这样至少可以在网上找到一些参考资料来总结 TyDiQA 数据集的不同来源。我真的希望保持更新,好像我找到了我提出的公开问题的答案。

如果您对这一行感兴趣,请考虑通过我的推荐链接获得中级会员资格来支持我:

https://namiyousef96.medium.com/membership

这对我很有帮助,因为你的一部分会员费会归我(别担心,这对你没有额外的费用!)同时让您完全访问 Medium 上的所有文章!

参考

GitHub 仓库

TyDiQA

https://github.com/google-research-datasets/tydiqa

极限

https://github.com/google-research/xtreme

拥抱面孔储存库

泰迪卡

https://huggingface.co/datasets/tydiqa

Xtreme

https://huggingface.co/datasets/xtreme#licensing-information

引用表

[1] Clark J et al. TYDI QA:用类型多样的语言回答信息搜索问题的基准。供货地:【https://aclanthology.org/2020.tacl-1.30.pdf

[2] Artetxe 等论单语表征的跨语言迁移性。来自:https://arxiv.org/pdf/1910.11856.pdf

[3] Lewis 等人 MLQA:评估跨语言抽取问题回答。可从:https://arxiv.org/abs/1910.07475

[4]胡等 XTREME:一个评估跨语言泛化的大规模多语言多任务基准。来自:https://arxiv.org/abs/2003.11080

声明

  • ty diqa-GoldP 可根据 Apache 2.0 许可使用(参见GitHub上的许可信息)
  • 所有图片、表格和代码均由作者提供,除非另有说明

具有多阶段预训练的多语言语音翻译

原文:https://towardsdatascience.com/multilingual-speech-translation-with-multi-phase-pretraining-305d642b8a66

如何将不同模态的预训练模型与单语数据混合成强大的多语言翻译模型

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

Unsplash 上由 Austin Distel 拍摄的照片

注意:这是本系列的第三篇文章。之前的文章解释了如何在双语和多语言环境下将海量预训练用于机器翻译:
第 1 部分:用于双语机器翻译的海量预训练
第 2 部分: mBART50:可扩展的多语言预训练的多语言微调
第 3 部分:具有多阶段预训练的多语言语音翻译

IWSLT

自动语音翻译是从音频形式的语音输入开始,研究从一种人类语言到另一种语言的翻译的领域。它的研究跨越了几十年,多年来提出了许多不同的方法。

国际口语翻译会议(IWSLT)已经到了第 19 届,其目标是跟踪这一领域的进展。他们从两方面着手,一方面接受科学贡献,另一方面组织共同的任务,在不同的场景中,根据共同的基准比较真实的系统。

我在以前的一篇文章中谈到过 IWSLT:

https://medium.com/machine-translation-fbk/machines-can-learn-to-translate-directly-your-voice-fbk-iwslt18-bb284ccae8bc

多语言语音翻译

去年的一个场景是多语言语音翻译,包括从西班牙语(es)、法语(fr)、葡萄牙语(pt)和意大利语(it)到英语(en)和西班牙语(es)的翻译。首先要注意的是,所有涉及到的语言都有些相似,英语是这个群体中唯一的非浪漫语言。这使得多语言翻译更加有效,因为对于模型来说,使用许多类似语言的数据进行改进相对容易。
其次,英语只出现在目标端,而很多研究和很多数据集都集中在源端的英语上。

https://medium.com/machine-translation-fbk/must-c-a-large-corpus-for-speech-translation-8e2350d01ea3

该任务的三个平移方向(It-En、It-Es 和 Pt-Es)被认为是相对于受约束轨迹的零炮,这意味着没有专门针对这些方向的训练数据。在不受约束的赛道上,参与者可以使用他们想要的所有额外的训练数据,因此没有任何控制。

这里描述的论文是去年(2021 年)IWSLT 多语言赛道的获奖作品,由脸书 AI Research (FAIR)开发。他们提交的目标是探索用大量并行和未标记的数据预训练多模态翻译模型的解决方案。通过训练语音翻译、文本机器翻译和语音识别的模型,利用来自不同任务的数据。

数据

共享任务提供的训练集是 TEDx、CoVoST 和 EuroParlST。

TEDx 是一个在 TEDx 上发表的演讲的集合,共有 13 个语言方向的翻译。这里,只考虑了任务的 7 个方向。 CoVoST 是 Mozilla Common Voice 的扩展,提供大型数据集的翻译,包括 11 个翻译成英语的方向。europarlist是一个相对较小的多语言数据集,包含欧洲议会 6 种语言的翻译演讲,共 11 个翻译方向。

此外,作者使用两个已与单语文本对齐的多语转录音频数据集挖掘了并行数据。

转录音频的两个多语种语料库分别是 CommonVoice (29 种语言)和Multilingual LibriSpeech(8 种语言的有声读物),而 CCNet 则作为多种语言的高质量单语文本大集合。

给定这些数据,通过使用激光器从 CCNet 中的源音频文本的抄本中提取句子嵌入以对齐具有相似语义的句子,如嵌入相似度所给出的,来获得另外的语音翻译数据。因为在源语言中音频和文本是对齐的,所以这个过程导致源音频与目标语言中的文本对齐。对于零炮点方向,得到的对准数据相当于几十个对准音频。

文本数据

5 种语言的单语数据用于训练 mBART 。单语数据来自 CC100。然后,mBART 在从 OPUS 下载的 7 种语言的并行数据上进行微调。所得的微调模型将在以后用于初始化语音翻译模型。

方法

模型培训遵循基于 3 个连续步骤的迁移学习方法:

  1. 经过自我监督学习预处理的单模态模块
  2. 多任务联合训练
  3. 特定于任务的微调

他们的目标分别是:

  1. 从大量未标记数据中训练
  2. 从文本到文本再到语音到文本
  3. 对最终任务进行微调以获得更好的结果

单一模态预训练

Wav2vec 2.0 用大量未标记音频数据训练,mBART 用不同语言的大量单语文本训练。 Wav2vec 2.0 然后用于初始化第二训练阶段的语音编码器。mBART 的编码器和解码器用于初始化下一阶段模型的编码器和解码器。

多任务联合训练

在第二阶段,语音到文本模型与文本到文本模型被联合学习。因此,整个模型由两个编码器和一个解码器组成。这两个编码器共享文本编码器的权重,但在处理音频输入时会使用附加层。适配器层用于促进在两个编码器之间共享的纯语音编码器和文本编码器权重之间的连接。一些培训技巧像交叉注意规则(CAR)和在线知识提炼(online KD)已经被用来促进任务间的知识转移。

特定于任务的微调

在最后阶段,文本编码器被丢弃,并且剩余的语音到文本翻译模型使用简单的交叉熵在并行音频翻译上被微调。

结果

本文的主要结果是使用所描述的过程训练的三个系统的集合,但是具有稍微不同的编码器,比强语音翻译基线高出 8.6 个 BLEU 点。基线是使用上述所有数据建立的,但没有第二阶段的联合训练。

此外,该集合仅比翻译正确音频转录本的强 MT 模型弱 3 个 BLEU 点(在语言方向上平均),这代表了语音翻译性能的巨大进步。

结论和意见

这篇论文展示的结果无疑是惊人的,但不幸的是,并不是所有的小组都能够训练这种类型的模型。的确,虽然第 2 期和第 3 期相对便宜(5 + 2 天 8 个 NVidia V100 GPUs),但像 wav2vec 和 mBART 这样从零开始的训练模型确实很昂贵,所需资源甚至没有在论文中提及。尽管如此,尽管共享任务的范围有限,但结果是显著的,并且清楚地表明大型预训练模型在跨模态设置中也是使能器。

这种强大的模型在该领域开辟了新的可能性,现在下一个前沿是在实时设置中也获得良好的结果,而该系统仅在批处理模式下工作。对于进一步的发展,我们只需要等待第 19 版 IWS lt T1 的结果,其中包括 8 个评估语音翻译不同方面的共享任务。

中等会员

你喜欢我的文章吗?你是否正在考虑申请一个中级会员来无限制地阅读我的文章?

如果您通过此链接订阅,您将通过您的订阅支持我,无需为您支付额外费用【https://medium.com/@mattiadigangi/membership

使用嵌入的多语言文本相似性匹配

原文:https://towardsdatascience.com/multilingual-text-similarity-matching-using-embedding-f79037459bf2

使用句子转换器进行对称的语义搜索

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

拉奎尔·马丁内斯在 Unsplash 上拍摄的照片

今天的主题是计算相同或不同语言的两个句子之间的相似度。我们将利用sentence-transformer框架,它自带预先训练好的多语言 transformer 模型。

我们可以利用这些模型来计算 50 多种语言的文本嵌入。然后,输出嵌入可以用于对称语义搜索。

对称和非对称语义搜索的区别

对称语义搜索专注于基于输入查询从语料库中寻找相似问题。例如,鉴于“如何在线学习人工智能?”作为输入查询,预期的输出应该类似于“如何在 web 上学习人工智能?”大多数时候,您可能会翻转查询和语料库中的数据,最终仍然得到与输出相同的配对。对称语义搜索主要用于文本挖掘或意图分类任务。

另一方面,不对称语义搜索围绕基于输入查询从语料库中寻找答案。例如,鉴于“什么是 AI?”作为输入查询,您可能会期望输出类似“AI 是一种模仿人类智能来执行任务的技术。他们可以根据获得的信息学习和提高自己的知识。”输入查询不仅限于问题。可以是关键词,也可以是短语。非对称语义搜索适用于搜索引擎相关的任务。

在撰写本文时,sentence-transformer框架提供了以下用于多语言对称语义搜索的预训练模型:

  • distiluse-base-multilingual-cased-v1—15 种语言通用语句编码器的多语言模型。
  • distiluse-base-multilingual-cased-v2—50 种语言通用语句编码器的多语言模型。
  • paraphrase-multilingual-MiniLM-L12-v2 —paraphrase-multilingual-MiniLM-L12-v2 的多语言模型,扩展到 50+种语言。
  • paraphrase-multilingual-mpnet-base-v2 —paraphrase-mpnet-base-v2 的多语言模型,扩展到 50+种语言。

实际上,我们可以利用这些模型来计算英语句子和西班牙语句子之间的相似度。例如,给定我们语料库中的以下句子:

What are you doing?
I am a boy
Can you help me?
A woman is playing violin.
The quick brown fox jumps over the lazy dog

并输入如下查询:

Qué estás haciendo

相似度最高的句子应该是:

What are you doing?

为简单起见,我们的对称语义搜索的工作流程如下:

  1. 计算查询和语料库文本的嵌入
  2. 计算两个嵌入之间的余弦相似度
  3. 查找具有最高相似性得分的前 5 个索引

设置

在此之前,让我们创建一个新的虚拟环境,并安装所有必需的包。

用 pip 安装

您可以轻松安装sentence-transformer包:

pip install -U sentence-transformers

用康达安装

对于 Anaconda 用户,您可以直接安装该软件包,如下所示:

conda install -c conda-forge sentence-transformers

继续下一节的实施。

履行

在您的工作目录中,创建一个名为main.py的新 Python 文件。

导入

在文件顶部添加以下导入语句:

from sentence_transformers import SentenceTransformer, util
import torch

模型初始化

然后,通过调用SentenceTransformer类初始化模型,并传入所需模型的名称:

model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')

在初始运行期间,模块将下载预训练的模型文件,作为缓存在以下目录中:

# linux
~/.cache/huggingface/transformers# windows (replace username with your username)
C:\Users\<username>\.cache\huggingface\transformers

您可以将缓存文件夹修改为当前工作目录,如下所示:

# save model in current directory
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2', cache_folder='./')# save model in models folder (you need to first create the folder)
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2', cache_folder='./models/')

对于生产,您应该将模型移动到工作目录并在本地加载。例如,假设模型文件位于models文件夹,您可以如下初始化您的模型:

model = SentenceTransformer('models/sentence-transformers_paraphrase-multilingual-MiniLM-L12-v2')

如果您在一台只有 CPU 的机器上进行测试,只需将device参数设置为cpu:

model = SentenceTransformer('models/sentence-transformers_paraphrase-multilingual-MiniLM-L12-v2', device='cpu')

语料库和查询

接下来,初始化语料库和查询的数据。在这种情况下,我有一个 7 个字符串的列表作为corpus数据,而queries包含一个不同语言的 3 个字符串的列表。

corpus = [
'I am a boy',
'What are you doing?',
'Can you help me?',
'A man is riding a horse.',
'A woman is playing violin.',
'A monkey is chasing after a goat',
'The quick brown fox jumps over the lazy dog'
]queries = ['I am in need of assistance', '我是男孩子', 'Qué estás haciendo']

将数据编码到嵌入中

调用encode函数将语料库转换为嵌入。将convert_to_tensor参数设置为True以获取 Python 张量作为输出。同样,初始化一个名为top_k的新变量,并将其赋值为最小值 5 和语料库的总长度。我们稍后将使用这个变量来获得具有最高相似性得分的索引。

corpus_embedding = model.encode(corpus, convert_to_tensor=True)top_k = min(5, len(corpus))

encode函数接受字符串列表或单个字符串作为输入。

计算余弦相似度

最后一步是遍历查询中的所有项目,并执行以下操作:

  • 计算单个查询的嵌入。每个嵌入具有以下形状:torch.Size([384])
  • 调用 util.cos_sim函数来获得输入查询和语料库之间的相似性得分
  • 调用torch.topk函数获得 topk 结果
  • 打印输出作为参考
for query in queries:
    query_embedding = model.encode(query, convert_to_tensor=True)

    cos_scores = util.cos_sim(query_embedding, corpus_embedding)[0]
    top_results = torch.topk(cos_scores, k=top_k) print("Query:", query)
    print("---------------------------")
    for score, idx in zip(top_results[0], top_results[1]):
        print(f'{round(score.item(), 3)} | {corpus[idx]}')

top_results变量是一个元组,包含:

  • 表示输入查询和语料库之间的相似性得分的张量阵列
tensor([ 0.3326,  0.2809,  0.2258, -0.0133, -0.0333])
  • 表示输入查询索引的张量数组
tensor([2, 0, 1, 4, 3])

您可以在以下要点的中找到完整的代码:

输出

运行该脚本时,您应该在终端上得到以下输出:

Query: I am in need of assistance
---------------------------
0.333 | Can you help me?
0.281 | I am a boy
0.226 | What are you doing?
-0.013 | A woman is playing violin.
-0.033 | A man is riding a horse.Query: 我是男孩子
---------------------------
0.919 | I am a boy
0.343 | What are you doing?
0.192 | Can you help me?
0.058 | A monkey is chasing after a goat
-0.001 | The quick brown fox jumps over the lazy dogQuery: Qué estás haciendo
---------------------------
0.952 | What are you doing?
0.396 | I am a boy
0.209 | Can you help me?
0.037 | A woman is playing violin.
0.032 | The quick brown fox jumps over the lazy dog

最佳化

上面的实现对于小型语料库(低于 100 万个条目)非常有用。对于大型语料库,执行会相对较慢。因此,我们需要优化实现,以便它可以无缝地工作。一些最流行的优化技术包括:

  • 归一化嵌入并使用点积作为得分函数
  • 使用近似最近邻将语料库划分成相似嵌入的较小部分

为了保持简单和简短,本教程将只涵盖第一种技术。当您规范化嵌入时,输出向量的长度将为 1。因此,我们可以使用点积而不是余弦相似度来计算相似度得分。点积是一个更快的损失,你会得到相同的相似性分数。

标准化嵌入

有两种方法可以标准化嵌入。第一种方法是在调用encode函数时将normalize_embeddings参数设置为True

corpus_embedding = model.encode(corpus, convert_to_tensor=True, normalize_embeddings=True)

或者,您可以利用util.normalize_embeddings函数来规范化一个现有的嵌入:

corpus_embedding = model.encode(corpus, convert_to_tensor=True)
corpus_embedding = util.normalize_embeddings(corpus_embedding)

计算点积

调用util.semantic_search函数并传入util.dot_score作为score_function的输入参数。它将返回带有关键字corpus_idscore的字典列表。此外,该列表按余弦相似性得分递减排序。

hits = util.semantic_search(query_embedding, corpus_embedding, score_function=util.dot_score)

修改后,新的执行代码应该如下:

当您运行脚本时,您应该得到与第一个实现相同的输出:

Query: I am in need of assistance
---------------------------
0.333 | Can you help me?
0.281 | I am a boy
0.226 | What are you doing?
-0.013 | A woman is playing violin.
-0.033 | A man is riding a horse.Query: 我是男孩子
---------------------------
0.919 | I am a boy
0.343 | What are you doing?
0.192 | Can you help me?
0.058 | A monkey is chasing after a goat
-0.001 | The quick brown fox jumps over the lazy dogQuery: Qué estás haciendo
---------------------------
0.952 | What are you doing?
0.396 | I am a boy
0.209 | Can you help me?
0.037 | A woman is playing violin.
0.032 | The quick brown fox jumps over the lazy dog

结论

让我们回顾一下你今天所学的内容。

本文首先简要介绍了sentence-transformer 模块。然后,比较了对称和非对称语义搜索的区别。

随后,它介绍了设置和安装。sentence-transformer可以安装pipconda

在实现部分,本文重点介绍了将语料库编码到嵌入中的步骤,以及使用余弦相似度计算相似度得分的步骤。

最后一节讨论优化技术。一种优化技术是将嵌入归一化为长度 1,然后使用点积计算相似性得分。

感谢你阅读这篇文章。祝你有美好的一天!

参考

  1. 句子变压器—安装
  2. 句子变压器—预训练模型
  3. SentenceTransformer —语义搜索

MultiMAE:在无监督预训练中利用标记数据的灵感

原文:https://towardsdatascience.com/multimae-an-inspiration-to-leverage-labeled-data-in-unsupervised-pre-training-9739a2dbf97c

通过多模式屏蔽自动编码器提高模型性能

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

巴勃罗·阿里纳斯在 Unsplash 上拍摄的照片

自监督预训练是提高传统监督学习性能的一种主要方法,其中大量的标记数据是必要的和昂贵的。在自我监督学习方法中,对比学习因其简单有效而广受欢迎。然而,大多数对比学习方法使用全局向量,其中像素级信息的细节丢失,这在转移到下游密集任务时留下了改进的空间。我向感兴趣的读者推荐我以前的关于对比学习方法的文章。

https://medium.com/geekculture/understanding-contrastive-learning-and-moco-efe491e4eed9

对于密集下游任务的迁移学习,我们需要一些自我监督的预训练方法,可以恢复整个特征图的细节,而不仅仅是合并的全局向量。只有通过这个才能了解到整个特征地图分布的细节,更重要的是,不需要标注。

在对比学习中,提出了一些方法来训练图像块[4],或局部特征[5],甚至像素[6]。然而,这些方法要么使用消耗内存的动量编码器和队列[4,5],要么使用难以训练的带有伪标签的半监督学习方式[6]。

屏蔽自动编码器

没有对比思维的方法是何在 2021 年提出的[7]。这与自然语言处理中的 BERT [8]的方法类似,在该方法中,使用交叉熵损失对句子中的屏蔽记号进行分类和训练。然而,在计算机视觉中,表征不能被分类,因为图像模式几乎是无限的,而在 NLP 中,表征是有限的,并且在语料库中预定义。因此,在计算机视觉中,被屏蔽的标记只能以回归方式预测,而不能以分类方式预测

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

( MAE 不对称架构)

该架构被称为屏蔽自动编码器(MAE ),其中非屏蔽令牌被编码,屏蔽令牌被重建并以 MSE 损失进行训练。这是一个基于视觉转换器的简单而有效的架构[9]。由于编码器仅编码未屏蔽的标记,因此它可以以较小的计算开销扩展到大的输入图像。此外,由于解码器是浅层的,并且仅针对屏蔽令牌计算损失,所以它也是可扩展的,几乎没有额外的计算开销。作者对标记使用了随机掩蔽,但我认为训练资源可以集中在尚未训练好的标记上,就像焦点丢失[10]中使用的方式。

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

(MAE 的重建结果

我们可以看到,即使当图像被 95%的遮挡时,也可以重建出真实的图像,显示了模型强大的细节学习能力。

多模式多任务屏蔽自动编码器

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

(多模态架构)

当一个模型成功时,它通常会被社区中的研究人员扩展到许多其他形式。多式联运就是这些扩展模式之一。由于多模态模型产生更健壮的特征,如果你有数据,训练多模态模型通常是一个好的选择。

在 MultiMAE 中,作者使用了三种模态:RGB、深度和语义。由于很难在这三种模式下收集大量的相应数据,作者建议使用一些现成模型生成的伪标签。然而,作者还表明,用伪标签训练的模型不如用真实标签训练的模型性能好。

该模型如上所示进行了扩展。简单明了的是,每个模态面片都用模态线性投影仪投影到标记向量。所有三种模态的标记向量用相同的编码器编码,但是用模态解码器分别解码。在预训练之后,编码器可以用相应的线性投影仪和特定任务头以单模态和多模态方式进行微调。

我发现关于 MultiMAE 的一件有趣的事情是标记的数据可以在预训练和微调阶段利用。假设您有一些 RGB 语义对用于训练语义分割模型,,而不是以传统的监督学习方式训练,您可以用 MultiMAE 预训练模型,其中 RGB 和语义都被屏蔽和重建。在此之后,由于模型已经学习了 RGB 的分布和语义细节,因此在接下来的单模态微调阶段,标签效率可以提高很多。如果在耗费数据的预训练阶段缺乏地面真实语义标签,也可以使用一些现成模型产生的伪标签

参考

[1] 理解对比学习和 MoCo,2021

[2] 像素级密集对比学习,2022

[3] 视觉语言模型对比预训练,2022

[4] DetCo:对象检测的无监督对比学习,2021

[5] 用于自监督视觉预训练的密集对比学习,2021

[6] 带区域对比的自举语义分割,2022

[7] 屏蔽自动编码器是可伸缩视觉学习器,2021

[8] BERT:面向语言理解的深度双向变压器预训练,2019

[9] 一幅图像抵得上 16X16 个字:用于大规模图像识别的变形金刚,2021 年

[10] 用于密集物体检测的焦损失,201 8

[11] MultiMAE:多模态多任务屏蔽自动编码器,2022

https://dushuchen.medium.com/membership

多模态:认知人工智能的新前沿

原文:https://towardsdatascience.com/multimodality-a-new-frontier-in-cognitive-ai-8279d00e3baf

通过创新的多模式系统实现更智能、适应性更强的人工智能

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

图片来源:AgsandrewviaAdobe Stock

与英特尔实验室的Vasudev Lal和认知人工智能团队合作编写。

认知人工智能中一个令人兴奋的前沿领域涉及构建能够集成多种模态并综合语言、图像、视频、音频和关系图等结构化知识源的意义的系统。像对话式人工智能这样的自适应应用;使用语言的视频和图像搜索;自主机器人和无人机;人工智能多模态助手将要求系统能够使用所有可用的模态与世界进行交互,并在特定的上下文中做出适当的响应。在这篇博客中,我们将介绍多模态学习的概念及其一些主要用例,并讨论英特尔实验室在创建强大的多模态推理系统方面取得的进展。

在过去的几年里,深度学习(DL)解决方案在许多自然语言处理(NLP)基准测试(例如, SuperGLUEGLUESQuAD )和计算机视觉基准测试(例如, ImageNet )中的表现都优于人类基准。单个模态的进展证明了神经网络学习的高效统计映射所实现的感知或类似识别的能力。

仅仅在十年前,这些单模态任务被认为是极其难以处理的,但目前却是数据中心、客户端和边缘产品中的主要人工智能工作负载。然而,在多模态环境中,许多可以使用自动化方法收集的见解仍然没有被利用。

以人为中心的认知人工智能的多模态性

人类的认知能力通常与多种形式的成功学习相关联。例如,一个苹果的概念应该包括从视觉获得的信息:它通常在颜色、形状、质地等方面看起来像什么。但是,人类和高级人工智能系统形成的苹果概念还应该受到苹果被咬下时发出的声音、人们谈论苹果派时的意思以及维基百科等文本语料库或维基数据等结构化知识库中关于苹果的全面知识的影响。

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

图一。与“苹果”概念相关的各种形态。图片来源:英特尔实验室 2022 英特尔公司。

多模态人工智能系统可以从多个来源和模态获取知识,并利用它来解决涉及任何模态的任务。通过图像和知识库学习的信息应该可用于回答自然语言问题;同样,从文本中学习到的信息应该在视觉任务需要时使用。这一切都通过贯穿所有形态的概念联系在一起,或者正如人们所说的:狗就是狗就是狗。

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

图二。狗是狗是狗。图片来源:英特尔实验室 2022 英特尔公司。

常识知识本来就是多模态的

人类拥有很多关于这个世界的常识,比如意识到鸟儿在天空飞翔,汽车在路上行驶。这种常识性的知识通常是通过视觉、语言和感官线索的结合而不是仅仅通过语言获得的。艾伦人工智能研究所首席执行官柳文欢·埃齐奥尼将常识称为“人工智能的暗物质”。这是因为常识由隐性信息组成——人类自动用来理解世界的一组广泛(且广泛共享)的未写假设和经验法则。

有趣的是,多模态系统可以提供一种途径来解决人工智能系统中常识知识的缺乏。提高基于转换器的语言模型(如伯特 / GPT-3 )的常识知识的一种方法是将跨越其他模态的训练信号合并到模型架构中。实现这一功能的第一步是在不同的模态之间调整内部表示。

当人工智能接收到图像和相关文本并处理这两者时,它需要在模态之间关联相同的对象或概念。例如,考虑这样一个场景,AI 看到一张汽车图片,上面有提到汽车轮子的文字。当人工智能处理涉及车轮的文本部分时,它需要处理图像中车轮的部分。人工智能需要“知道”汽车轮子的图像和提到轮子的文本是指不同形态的同一物体。

当前多模态人工智能任务和架构

截至 2022 年初,多模态人工智能系统正在试验将文本/NLP 和视觉驱动到一个对齐的嵌入空间,以促进多模态决策。存在许多要求模型至少具有一定量的多模式能力的任务。以下是四种常见工作负载和相应 SotA 模型的简要概述

  • 图像描述生成,文本到图像生成

也许,处理图像描述和文本到图像生成任务的最知名的模型是 OpenAI 的剪辑DALL-E ,以及它们的继任者 GLIDE

CLIP 预先训练单独的图像和文本编码器,并学习预测数据集中的哪些图像与各种描述配对。有趣的是,正如人类的“Halle Berry”神经元一样,CLIP 已经被证明具有多模态神经元,当暴露于分类器标签文本以及相应的图像时,这些神经元会激活,这表明了一种融合的多模态表示。DALL-E 是 GPT-3 的 130 亿参数变体,它将文本作为输入,并生成一系列输出图像来匹配文本;然后使用 CLIP 对生成的图像进行排名。GLIDE 是 DALL-E 的发展,它仍然使用 CLIP 对生成的图像进行排序;然而,图像生成是使用扩散模型完成的。

  • 视觉问答

视觉问答,正如在像 VQA 这样的数据集中所呈现的,是一项需要模型根据图像正确回答基于文本的问题的任务。微软研究院的团队已经为这项任务开发了一些领先的方法。 METER 是一个通用框架,用于训练高性能的端到端视觉语言转换器,使用各种可能的子架构用于视觉编码器、文本编码器、多模式融合和解码器模块。统一视觉语言预训练模型( VLMo )使用模块化变压器网络来联合学习双编码器和融合编码器。网络中的每个模块都包含一个特定模式的专家池和一个共享的自我关注层,为微调提供了极大的灵活性。

  • 文本到图像和图像到文本搜索

网络搜索是多模态学习的另一个重要应用。呈现这个任务的数据集的一个例子是 WebQA ,它是一个模拟 web 搜索的多模态和多跳基准测试。WebQA 是由微软和卡内基梅隆大学的团队构建的。

在此任务中,模型需要识别可以帮助回答查询的来源(基于图像或文本)。对于大多数问题,模型需要考虑多个来源才能得到正确答案。然后,系统需要使用这些多个来源进行推理,以自然语言生成查询的答案。

谷歌已经用大规模图像和噪声文本嵌入模型解决了多模态搜索任务。这个模型利用与互联网上的图像相关联的容易获得但有噪声的 alt-text 数据来训练单独的视觉( EfficientNet-L2 )和文本( BERT-Large )编码器,然后使用对比学习来组合它们的输出。生成的模型存储了多模态表示,无需任何进一步的微调即可支持跨模态搜索。

  • 视频语言建模

从历史上看,基于视频的任务对人工智能系统来说一直具有挑战性,因为它们是资源密集型的;但这种情况正在开始改变。视频语言建模和其他视频相关的多模态任务领域的主要工作之一是由微软的佛罗伦萨-VL 项目驱动的。2021 年年中,佛罗伦萨-VL 项目推出了 ClipBERT ,它涉及 CNN 和 transformer 模型的组合,在稀疏采样的帧上运行,并以端到端的方式进行优化,以解决流行的视频语言任务。 VIOLETSwinBERT 是 ClipBERT 的演变,它们引入了掩蔽视觉令牌建模和稀疏注意力,以改善视频问答、视频检索和视频字幕中的 SotA。

区别在于细节,但是上面所有的模型都有一个共同的特点,那就是使用基于 transformer 的架构。这种类型的架构通常与并行学习模块相结合,以从各种模态中提取数据,然后将它们统一到单个多模态表示中。

英特尔实验室和微软创建视觉和语言预培训模型

与上述方法类似,英特尔实验室认知人工智能(CAI)研究团队的工作重点是使用基于 transformer 的模型架构创建多模态表示。然而,与 CLIP(擅长图像和文本的实例级配对)等一些模型不同,认知 AI 团队的方法是实现图像和文本中实体的细粒度对齐。所开发的架构还允许将完整的图像上下文提供给同样处理文本的多模态转换器。

认知人工智能团队与微软研究自然语言计算(NLC) 团队合作,最近推出了 KD-VLP ,这是一个在概念层面视觉语言对齐方面特别有效的模型。架构和预训练任务强调系统中的实体级表示,或对象。KD-VLP 在诸如视觉问题回答( VQA2.0 )、视觉常识推理( VCR )、在 MSCOCOFlickr30K 上的图像和文本检索(IR/TR)、用于视觉推理的自然语言( NLVR2 )和视觉蕴涵( SNLI-VE )等任务上展示了竞争性能。

该模型的自我监督训练导致了也是可解释的紧急注意模式。例如,下面的剪辑显示了当模型思考伴随文本中的每个单词时,其视觉注意力是如何变化的。这些模式为模型的内部工作和推理机制提供了有价值的见解。当探索模型推理能力中需要解决的差距时,这种洞察力是有价值的。

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

图 3:追踪多模态注意力的热图。图片来源:英特尔实验室 2022 英特尔公司。

与微软研究团队的这一研究合作产生了解决多模态挑战的解决方案,例如多模态数据集上的问题回答。一个基于知识的多模态系统目前在 VisualCOMET 任务上领先公共排行榜,其中 AI 系统需要推理静态图像的动态内容。该模型可以从单个图像中唤起一个动态的故事情节,就像人类如何能够想象出以前发生了什么以及接下来会发生什么。

这种单一模型解决方案在视觉常识推理(VCR)挑战赛的公共排行榜上也颇具竞争力。它目前在单一模型解决方案中排名前五,我们的 WebQA 解决方案在neur IPS 2021 竞赛的获奖名单中名列前茅。WebQA 解决方案涉及一种新颖的方法,将多模态源合并到语言生成模型中。该系统可以通过多模式编码器将图像和文本源与问题联系起来,并有效地聚集多个源的信息。解码器使用跨多个多模态源的这种融合的结果来以自然语言回答查询。

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

图 4:带有注意力热图的网络问答问题示例。Trogon Surrucura 图片鸣谢:维基媒体Cláudio Dias Timm

结论

现实生活环境本质上是多模态的。这个应用领域允许人工智能研究社区进一步推动人工智能从单一感知模态(如图像或文本)的统计分析过渡到对象及其交互的多面视图,帮助在从“形式”到“意义”的旅程中取得进展。

参考

  1. Wang,a .,Pruksachatkun,y .,Nangia,n .,Singh,a .,Michael,j .,Hill,f .,… & Bowman,S. R. (2019)。Superglue:通用语言理解系统的一个更具粘性的基准。arXiv 预印本 arXiv:1905.00537。
  2. 王,a .,辛格,a .,迈克尔,j .,希尔,f .,利维,o .,&鲍曼,S. R. (2018)。GLUE:自然语言理解的多任务基准和分析平台。arXiv 预印本 arXiv:1804.07461。
  3. Rajpurkar,p .,贾,r .,,梁,P. (2018)。知道你不知道的:无法回答的问题。arXiv 预印本 arXiv:1806.03822。
  4. Rajpurkar,p .,贾,r .,,梁,P. (2021)。斯坦福问答数据集。https://rajpurkar.github.io/SQuAD-explorer/
  5. 何刚,张,徐,任,孙(2015)。深入研究整流器:在 imagenet 分类上超越人类水平的性能。IEEE 计算机视觉国际会议论文集(第 1026–1034 页)。
  6. 维基数据。(2019).检索于 2022 年 1 月 31 日,来自https://www.wikidata.org/wiki/Wikidata:Main_Page
  7. 骑士,W. (2020,4 月 2 日)。美军想教 AI 一些基本常识。麻省理工科技评论。https://www . technology review . com/2018/10/11/103957/the-us-military-wants-to-teach-ai-some-basic-common-sense/
  8. 帕夫卢斯,J. (2020 年 5 月 4 日)。常识到电脑。广达杂志。https://www . quanta magazine . org/common-sense-comes-to-computers-2020 04 30/
  9. Devlin,j .,Chang,M. W .,Lee,k .,& Toutanova,K. (2018 年)。Bert:用于语言理解的深度双向转换器的预训练。arXiv 预印本 arXiv:1810.04805。
  10. 布朗、T. B .、曼恩、b .、赖德、n .、苏比亚、m .、卡普兰、j .、达里瓦尔、p .……和阿莫代伊,D. (2020)。语言模型是一次性学习者。预印本 arXiv:2005.14165。
  11. 拉德福德、a .、金、J. W .、哈拉奇、c .、拉梅什、a .、高、g .、阿加瓦尔、s .……和苏茨基弗(2021)。从自然语言监督中学习可转移的视觉模型。arXiv 预印本 arXiv:2103.00020。
  12. 拉梅什,a .、巴甫洛夫,m .、戈,g .、格雷,s .、沃斯,c .、拉德福德,…和苏茨基弗,I. (2021 年)。零镜头文本到图像生成。arXiv 预印本 arXiv:2102.12092。
  13. Nichol,a .、Dhariwal,p .、Ramesh,a .、Shyam,p .、Mishkin,p .、McGrew,b .、…、陈,M. (2021)。Glide:使用文本引导扩散模型实现照片级真实感图像生成和编辑。arXiv 预印本 arXiv:2112.10741。
  14. Quiroga,R. Q .、Reddy,l .、Kreiman,g .、Koch,c .、和 Fried,I. (2005)。人脑中单个神经元的不变视觉表征。自然,435(7045),1102–1107。
  15. Goh,g .,Cammarata,n .,Voss,c .,Carter,s .,Petrov,m .,Schubert,l .,… & Olah,C. (2021)。人工神经网络中的多模态神经元。蒸馏,6(3),e30。
  16. 使用非平衡热力学的深度无监督学习。arXiv:1503.03585,2015。
  17. 纽约州戈亚尔、茨韦塔纳州 Khot、萨默斯-斯蒂尔、巴特拉和帕里克(2017 年)。让 vqa 中的 v 变得重要:提升视觉问答中图像理解的作用。IEEE 计算机视觉和模式识别会议论文集(第 6904–6913 页)。
  18. 窦志英,徐玉英,甘,张,王,王,王,李,…曾,米(2021)。训练端到端视觉语言转换器的实证研究。arXiv 预印本 arXiv:2111.02387。
  19. 王文伟,鲍海红,董丽兰,魏凤芳(2021)。VLMo:混合模态专家的统一视觉语言预训练。arXiv 预印本 arXiv:2111.02358。
  20. 常,那朗,米,,h,曹,高,j,,y(2021)。网络问答:多跳和多模态问答。arXiv 预印本 arXiv:2109.00590。
  21. 贾,杨,杨,夏,陈,李玉亭,帕瑞克,郑,范,李,…和杜里格(2021)。在嘈杂文本监督下扩大视觉和视觉语言表征学习。arXiv 预印本 arXiv:2102.05918。
  22. 贾,杨,杨(2021 年 5 月 11 日)。ALIGN:在嘈杂文本监督下扩大视觉和视觉语言表征学习。谷歌人工智能博客。https://ai . Google blog . com/2021/05/align-scaling-up-visual-and-vision . html
  23. 谭,男,乐,qv(2019 . 5 . 29)。EfficientNet:通过 AutoML 和模型缩放提高准确性和效率。谷歌人工智能博客。https://ai . Google blog . com/2019/05/efficient net-improving-accuracy-and . html
  24. Devlin 和 m . Chang(2018 年 11 月 2 日)。开放源码 BERT:自然语言处理的最先进的预备培训。谷歌人工智能博客。https://ai . Google blog . com/2018/11/open-sourcing-Bert-state-of-art-pre . html
  25. 微软。(2021 年 12 月 14 日)。佛罗伦萨-VL 项目。微软研究院。https://www . Microsoft . com/en-us/research/project/project-Florence-VL/
  26. 雷,李,李,周,李,甘,钟,彭大林,班萨尔,米,刘(2021)。通过稀疏采样进行视频和语言学习。IEEE/CVF 计算机视觉和模式识别会议论文集(第 7331-7341 页)。
  27. 傅廷杰,李,李,甘,郑,林,王,王维元,王,刘,郑(2021)。VIOLET:端到端视频语言转换器,带屏蔽视觉令牌建模。arXiv 预印本 arXiv:2111.12681。
  28. 林,李,李,林春春,艾哈迈德,甘,刘,…,王,(2021)。SwinBERT:对视频字幕关注较少的端到端变压器。arXiv 预印本 arXiv:2111.13196。
  29. 刘,杨,吴,曾善友,李,何,段,倪(2021)。Kd-vlp:通过对象知识提炼改进端到端的视觉和语言预训练。arXiv 预印本 arXiv:2109.10504。
  30. Antol,s .、Agrawal,a .、Lu,j .、Mitchell,m .、Batra,d .、Zitnick,C. L .、& Parikh,D. (2015)。Vqa:视觉问答。IEEE 计算机视觉国际会议论文集(第 2425-2433 页)。
  31. 泽勒斯,共和党,比斯克,纽约州,法尔哈迪,和崔,纽约州(2019)。从识别到认知:视觉常识推理。IEEE/CVF 计算机视觉和模式识别会议论文集(第 6720-6731 页)。
  32. 林,T. Y .,梅尔,m .,贝隆吉,s .,海斯,j .,,p .,拉马南,d .,… &兹尼克,C. L. (2014 年 9 月)。微软 coco:上下文中的公共对象。在欧洲计算机视觉会议上(第 740–755 页)。斯普林格,查姆。
  33. Young,p .,Lai,a .,Hodosh,m .,& Hockenmaier,J. (2014 年)。从图像描述到视觉指示:事件描述语义推理的新相似性度量。计算语言学协会汇刊,2,67–78。
  34. 苏尔亚,周,s,张,a,张,I,白,h .,&阿奇,Y. (2018)。基于照片的自然语言推理语料库。arXiv 预印本 arXiv:1811.00491。
  35. 谢,倪,赖,多兰,丁,& Kadav,A. (2018)。视觉基础语言学习的视觉蕴涵任务。arXiv 预印本 arXiv:1811.10582。
  36. 微软。(2022 年 1 月 19 日)。自然语言计算。微软研究院。https://www . Microsoft . com/en-us/research/group/natural-language-computing/
  37. Park,J. S .,Bhagavatula,c .,Mottaghi,r .,法尔哈迪,a .,和 Choi,Y. (2020 年 8 月)。VisualCOMET:对静态图像的动态背景进行推理。在欧洲计算机视觉会议上(第 508–524 页)。斯普林格,查姆。

多重比较:A/B 测试的常见陷阱

原文:https://towardsdatascience.com/multiple-comparison-a-common-pitfall-for-a-b-testing-d773f19a4a95

实验和因果推断

多重比较:A/B 测试的常见陷阱

数据科学家很酷!

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

埃里克·普劳泽特在 Unsplash 上拍摄的照片

简介

科技行业最近的一个趋势是,公司越来越多地诉诸科学方法来指导决策。特别是,他们对产品发布和创新采取严格的测试策略。潜在的想法是:

每当有疑问时,A/B 就测试它。

为了满足大规模测试需求,科技公司建立了需要卓越工程技术的内部实验平台。例如, Google 构建了一个重叠测试基础设施,支持数百甚至数千个并发实验。微软开发了一个自动触发系统,如果有任何事情出错,它会提醒实验所有者。 Airbnb 创建了一个指标存储库,其中包含数以千计的指标,可以轻松提取并进行实时监控。

这些例子表明,我们需要一个强大的工程团队来构建和维护所有这些基础设施,这给人留下了一个错误的印象,即实验可以仅由平台工程师和数据工程师完成,而无需数据科学家的帮助。令我惊讶的是,这是业内相当普遍的误解。

在这篇博文中,我们通过一个典型的实验设置,看看如果团队中没有合格的数据科学家或统计学家,事情会变得多么糟糕。

为什么要进行假设检验?

在我们正式开始之前,让我们试着回答这个问题:

为什么我们需要假设检验?

在线实验的核心思想是从有限的样本中推断总体参数。我们对样本数据进行统计测试,并决定治疗组和对照组之间的差异是实际改善还是仅仅由于随机性。

在任何测试场景下,都不可能完全消除不确定因素。没有 100%的把握,因为随机性带来的意外因素总是存在的。相反,我们可以通过赋值来量化不确定性的水平,这就是为什么统计学家创造了阿尔法水平(又名。假阳性率)。

对于任何实验平台来说,准确评估 FPR 的水平至关重要。太高的 FPR 使平台无用,因为它总是发射错误的信号,我们不知道什么时候是真信号,什么时候是假信号。

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

穆利亚迪Unsplash 上的照片

为什么多重测试是个问题

这是一个典型的 A/B 测试用例:产品经理希望了解一个新功能将如何影响整体评估标准(例如,保留)和用户参与度的多个方面,包括购物车添加率、平均会话持续时间、每日活跃用户数、回头客数量和客户满意度得分。此外,她关注网站性能,选择跳出率、会话崩溃率、网站加载时间、功耗指标和收入作为护栏指标。实验中共有 10 个指标。

实验小组建立了一个实验。3 周后,她收集了足够的数据,并对新产品充满信心,因为结果返回了几个小 P 值。那么,让我们推出新功能。

有问题吗?

是的,膨胀的 FPR 有一个大问题。具体来说,在多重假设检验中观察到至少一个假阳性的概率,家族误差率(FWER)显著增加。

下面是一个粗略的计算:将 alpha 级别设置为 5%。

  1. 单次检测的假阳性率:0.05
  2. 单次测试第一类错误不落的概率:1 — 0.05
  3. 10 次测试中第一类错误的不落概率:(1 — 0.05) ⁰
  4. 10 次测试至少犯一次 1 型错误的概率:1 — (1 — 0.05) ⁰ =0.40,或 40%。

上述过程表明,我们至少会在 40%的时间里观察到一个假阳性,即使没有实际差异。

作为第一个旁注,对 5%的 alpha 水平的正确解释是,如果我们重复重新运行实验,我们会错误地拒绝 5%的无效假设,即使没有差异。

第二点要注意的是,A/A 测试是一项实验,我们对两组患者进行相同的治疗条件。据估计,任何单个 A/A 测试的 FPR 应接近标称 alpha 水平(如 5%),多个 A/A 测试的 p 值的最终分布应遵循均匀分布。如果你想了解更多关于 A/A 测试和它们潜在的重要性,看看这篇文章。

到目前为止,你可能同意没有适当的统计调整的多重假设检验会增加 FWER,这总是发出错误的信号。

在下一节中,我们将深入研究三种流行的统计调整。

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

本·哈里特在 Unsplash 上拍摄的照片

解决方案 1: Bonferroni 校正

让我们从最简单的 Bonferroni 校正(BC)开始。BC 方法将α水平除以比较次数,即 α/n. 如果我们将α/n 乘以比较次数 n,BC 方法将 FWER 保持在α。

在我们的示例中,我们对 10 个指标进行了多次比较。默认情况下,我们选择 0.05 作为单独的 alpha 级别。使用 BC 方法,我们将 0.05 除以比较次数:0.05/10 = 0.005。如果我们想要得到任何有统计学意义的结果,相应的 p 值必须小于 0.005。

正如所见,我们已经将拒绝标准从 0.05 降低到 0.005,使得拒绝零假设变得更加困难。这种方法经常被批评为过于保守和缺乏统计能力。BC 方法以假阴性为代价降低了假阳性。

当然,这种方法有几个优点。例如,它是通用的,适用于所使用的任何检验统计量,与 p 值无关,或 H0 的性质( James 等人 2021,统计学习介绍)。

解决方案 2:霍尔姆-邦费罗尼

由于其保守性,BC 方法在实践中很少使用,统计学家已经提出了一种改进的版本,称为 **Holm-Bonferroni 方法。**它也控制 FWER,但通过对 p 值进行排序并调整每个无效假设的拒绝标准。这两种方法的最大区别在于,与 BC 方法不同,H-B 程序的拒绝阈值取决于所有 p 值。

就能力而言,H-B 比 Bonferroni 方法更加强大:它拒绝的无效假设至少与 BC 一样多。如果你使用 Bonferroni,考虑转换到 Holm 的程序,因为它总是优于。

方案三:本杰明-霍赫伯格

与控制 FWER 的 Bonferroni 家族不同,Yoav Benjamini 和 Yosef Hochberg 提出了一种称为 Benjamini-Hochberg 程序的新方法,该方法控制错误发现率(FDR) ,该错误发现率被定义为所有发现(显著结果)中错误阳性的比例。比如你做了 100 个有意义的结果,其中 5 个是错误发现(或者错误拒绝);罗斯福是 5%。

这里有一个 FDR 和 FWER 的简单比较:

FWER:测试中至少有一个或多个假阳性的概率。

FDR:错误发现占发现总数的百分比。

在生产中,FDR 提供了比 FWER 更直观的解释。错误发现在整个发现中所占的比例,这对业务人员来说有直观的意义。

相比之下,Benjamini-Hochberg 在假阳性率附近提供了较弱的保证,但是比 BC 显著降低了假阴性率。Benjamini-Hochberg 在生产中的 I 型和 II 型误差之间提供了一个更好的折衷。

Medium 最近推出了作家伙伴计划,支持像我这样的普通作家。如果你还不是订户,通过下面的链接注册,我会收到一部分会员费。

https://leihua-ye.medium.com/membership

外卖

  • 由于假设检验的随机性,我们希望考虑抽样方差,并评估出现这种极端数据分布的概率。
  • 一种常见的方法是使用假阳性率。
  • 然而,没有适当调整的多重比较会增加累积的α水平,使 A/B 测试变得无用。
  • 这篇文章认为 Benjamini-Hochberg 方法是平衡假阳性和假阴性的“最佳”方法。
  • 这并不意味着 Benjamini-Hochberg 程序是一个适合所有情况的解决方案。您可能需要选择另一种适合您特定需求的校正方法。
  • 最后,数据科学家超级酷。

喜欢读这本书吗?

请在 LinkedInYouTube 上找到我。

还有,看看我其他关于人工智能和机器学习的帖子。

如何在 Python 中捕捉多个异常

原文:https://towardsdatascience.com/multiple-exceptions-python-545a89c50d46

在 Python 中处理多个异常

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

照片由丘特尔斯纳普Unsplash 上拍摄

介绍

一个开发良好的应用程序必须总是能够以适当的方式处理意外事件——比如异常。这对于在开发期间调试源代码也很重要,对于在应用程序启动并运行(最终进入生产)时检查应用程序日志也很重要。

在今天的简短教程中,我们将展示如何在 Python 中处理多个异常。我们还将探索 Python 中的一些新特性,这些特性可以帮助您以一种更直观、更简洁的方式完成这项工作。我们开始吧!

对于 Python < 3.11

Now let’s suppose that we have the following (fairly dumb) code snippet, that raises 【 , 【 and 【 .

def my_function(x):
    if x == 1:
        raise AttributeError('Example AttributeError')
    elif x == 2:
        raise ValueError('Example ValueError')
    elif x == 3:
        raise TypeError('Example TypeError')
    else:
        print('Hello World')

And let’s also suppose that we want to to call the function 【 but at the same time, we also need to ensure that we handle any unexpected errors appropriately. To do so, we can use the 【 clauses.

But let’s assume that we want to perform a certain action if an 【 is being thrown and a different action when either of 【 or 【 are raised by 【 .

try:
    my_function(x)
except AttributeError:
    # Do something
    ...
except (ValueError, TypeError):
    # Do something else
    ...

A 【 statement may have more than one except clause, to specify handlers for different exceptions. At most one handler will be executed. Handlers only handle exceptions that occur in the corresponding try clause, not in other handlers of the same 【 statement. An except clause may name multiple exceptions as a parenthesized tuple.

Python 文档

如果您不打算对引发的任何错误做任何特殊处理(例如,您只需pass),您甚至可以使用如下所示的suppress上下文管理器:

from contextlib import suppress

with suppress(AttributeError, ValueError, TypeError):
     my_function(x)

注意[suppress()](https://docs.python.org/3/library/contextlib.html#contextlib.suppress)从 Python 3.4 开始可用。此外,只有当您希望程序的特定部分无声地失败并继续执行时,才必须使用这种方法。但是在大多数情况下,您可能希望对某些异常采取某些措施。

用 Python 3.11 处理多个异常

从 Python 3.11 开始,引入了新的标准异常类型,即ExceptionGroup。这个新异常用于一起传播一组不相关的异常

在下面的创建示例中,我们创建了一个包含四种不同类型错误的ExceptionGroup实例,即TypeErrorValueErrorKeyErrorAttributeError。然后,我们使用多个except*子句来处理ExceptionGroup,无论是针对单个异常类型还是多个异常类型。

try:
    raise ExceptionGroup('Example ExceptionGroup', (
        TypeError('Example TypeError'),
        ValueError('Example ValueError'),
        KeyError('Example KeyError'),
        AttributeError('Example AttributeError')
    ))
except* TypeError:
    ...
except* ValueError as e:
    ...
except* (KeyError, AttributeError) as e:
    ...

但是请注意,一个except*子句中提出的异常不适合匹配同一try语句中的其他子句

关于ExceptionGroupexcept*条款背后的基本原理的更多细节,您可以参考 PEP-654

此外,要更全面地阅读 Python 3.11 中的新增内容和更新,包括我们之前讨论的内容,您可以参考我最近在下面分享的一篇文章。

最后的想法

在今天的简短教程中,我们展示了在 Python 中处理多个异常的各种不同方法。我们已经看到了如何使用传统的except子句来捕获多个异常,但是我们也展示了如何使用 Python 3.11 中将要引入的新的except*子句来这样做。

最后,您应该始终记住,在整个源代码中处理意外事件是一个重要的方面,如果执行得当,可以显著提高代码质量。

成为会员 阅读介质上的每一个故事。你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。

https://gmyrianthous.medium.com/membership

相关文章你可能也喜欢

多元线性回归:理论与应用

原文:https://towardsdatascience.com/multiple-linear-regression-theory-and-applications-677ec2cd04ac

详细解释了线性最小二乘法,并用 Python 从头开始实现

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

费迪南·斯托尔在 Unsplash 拍摄的照片

多元线性回归由于其简单性和结果的可解释性而成为最基本的统计模型之一。出于预测目的,线性模型有时会优于更好的非线性模型,尤其是在训练案例数量少、信噪比低或数据稀疏的情况下(Hastie 等人,2009 年)。顾名思义,在这些模型中,预测变量(或响应变量)是由预测变量的线性组合来描述的。倍数一词指的是预测变量。

在整篇文章中,将详细描述普通最小二乘(OLS)回归模型的基本原理,并将从头开始用 Python 实现一个回归器。所有用到的代码都在这个 示例笔记本 里。

线性回归已经在许多 Python 框架中可用。因此,在实践中,不需要从零开始实现它来估计回归系数和进行预测。然而,我们在这里的目标是深入了解这些模型是如何工作的,以及它们的假设在处理未来项目时会更加有效。从通常的框架来看,我建议检查来自 statsmodelsOLS 和来自 sklearn线性回归

让我们开始吧。

线性最小二乘法

在进入方程之前,我想定义一些符号指南。

  • 矩阵:大写斜体粗体。
  • 向量:小写斜体粗体。
  • 标量:常规斜体。

多元线性回归模型或 OLS 可以用下面的等式来描述。

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

线性回归模型元素表示法。(图片由作者提供)。

其中 yᵢ 为观察值 i 的因变量(或响应);β₀为回归截距, βⱼ 为与决策变量 j 相关的系数, xᵢⱼ 为观察值 i 的决策变量 jε 为剩余项。在矩阵符号中,它可以描述为:

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

线性回归模型矩阵符号。(图片由作者提供)。

其中 β 为参数的列向量。

线性模型对结构进行了大量假设,并产生稳定但可能不准确的预测(Hastie 等人,2009)。当采用线性模型时,应该了解这些假设,以便对结果做出正确的推断,并执行必要的更改。

残差项 ε 假设正态独立分布,均值为零,方差为常数 σ 。一些模型属性,比如参数和预测的置信区间,强烈依赖于这些关于 ε 的假设。因此,核实这些数据对于获得有意义的结果至关重要。

线性最小二乘回归模型的目标是找到使残差平方和(或误差平方和)最小的 β 的值,由下面的等式给出。

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

误差平方和(残差):最小二乘回归的损失函数。(图片由作者提供)。

这是一个有解析解的优化问题。该公式基于每个预测相对于参数向量 β 的梯度,参数向量对应于自变量向量本身 x 。考虑一个矩阵 C ,由下面的等式给出。

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

c 矩阵。(图片由作者提供)。

β 的最小二乘估计由下式给出:

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

参数的最小二乘估计。(图片由作者提供)。

在接下来的步骤中,让我们创建一个 Python 类, *LinearRegression,*来执行这些估计。但是在此之前,让我们导入一些有用的库和函数,以便在本文中使用。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import shapiro
from scipy.stats import t as t_fun

如果我们想考虑截距β₀.,第一步是创建一个估计类和一个方法,在估计矩阵中包含一列 1

class LinearRegression:

    def __init__(self, fit_intercept=True):
        self.fit_intercept = fit_intercept

    def _prepare_X(self, X):
        X = np.array(X)
        if len(X.shape) == 1:
            X = np.atleast_2d(X).reshape((-1, 1))
        if self.fit_intercept:
            ones = np.ones((X.shape[0], 1))
            X = np.column_stack((ones, X))
        else:
            pass
        return X

现在,让我们实现一个 fit 方法( sklearn -like)来估计 β。

def fit(self, X, y=None):
    X = self._prepare_X(X)
    n, p = X.shape
    self.n = n
    self.p = p
    C = np.linalg.inv(X.T.dot(X))
    self.C = C
    betas = C.dot(X.T.dot(y))
    self.betas = betas

预测的方法。

def predict(self, X, y=None):
    X = self._prepare_X(X)
    y_pred = X.dot(self.betas)
    return y_pred

以及用于计算 R 度量的方法。

def r2_score(self, X, y):

    y_pred = self.predict(X)
    epsilon = y_pred - y
    sse = np.sum(epsilon * epsilon)

    y_mean = np.mean(y)
    mean_res = y_mean - y
    sst = np.sum(mean_res * mean_res)

    return 1 - sse / sst

参数的统计显著性

测试参数 β 的统计显著性以验证预测值的相关性是有用的。当这样做时,我们能够去除不良预测,避免混淆效应,并提高新预测的模型性能。为此,应该测试与给定预测器相关联的参数 β 为零的零假设。让我们利用矩阵和残差的方差 σ̂ 来计算参数 β 的方差-协方差矩阵 V 及其相应的标准差。

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

残差方差。(图片由作者提供)。

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

参数的方差协方差矩阵。(图片由作者提供)。

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

参数的标准误差。(图片由作者提供)。

在 Python 中,我们只需向 fit 方法添加以下代码行:

*epsilon = y - X.dot(betas)
sse = np.sum(epsilon * epsilon)

sigma_squared = sse / (n - p)
self.sigma_squared = sigma_squared

V = C * sigma_squared
self.V = V

sigma_betas = np.sqrt(np.diag(V))
self.sigma_betas = sigma_betas*

然后,我们可能会得到与零假设相关联的t*-值及其对应的p-值。在 Python 中,可以通过使用来自 scipy.stats (之前在这里作为 t_fun 导入)的 t 生成器实例来完成。*

*pvalues = t_fun.sf(abs(betas) / sigma_betas, (n - p)) * 2.0
self.pvalues = pvalues*

现在,我们已经准备好工具来估计回归系数及其统计意义,并根据新的观察结果进行预测。让我们在下一节应用这个框架。

引线键合示例

这是一个示例,其中的目标是基于导线长度和芯片高度来预测半导体制造过程中导线接合的拉伸强度。它是从 Montgomery & Runger (2003 年)检索的。这是一个小数据集,在这种情况下,线性模型尤其有用。我将它的一个副本保存在与示例笔记本相同的存储库中的一个. txt 文件中。

让我们首先导入数据集。

*dataset = pd.read_csv("../data/montgomery/wire_bond.txt", sep=" ", index_col=0)*

然后定义自变量 X 的矩阵和预测变量 y 的观测值的向量。

*X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values*

我画了一些散点图,看看预测因子和因变量之间的关系。

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

引线键合问题中的目标与预测。(图片由作者提供)。

请注意,预测变量和回归器线长度之间存在很强的线性关系。相反,芯片高度和焊线之间的线性关系在成对可视化中并不明显,尽管这可能归因于其他预测因素的影响。

接下来,让我们创建一个 LinearRegression 类的实例,使其适合数据,并基于 R 度量验证其性能。

*linreg = LinearRegression()
linreg.fit(X, y)
print(linreg.r2_score(X, y))*

它返回值 0.9811。

好像很有希望!现在,为了验证参数的统计意义,让我们运行以下代码:

*for i, val in enumerate(linreg.betas):
    pval = linreg.pvalues[i]
    print(f"Beta {i}: {val:.2f}; p-value: {pval:.2f}")*

它返回:

*Beta 0: 2.26; p-value: 0.04
Beta 1: 2.74; p-value: 0.00
Beta 2: 0.01; p-value: 0.00*

因此,我们有一个具有很好的性能和统计意义的模型,只要数据分布没有显著变化,它就可能在新的观察结果上表现良好。注意,根据它的p*-值,我们可能会考虑放弃截距。最后,让我们验证模型假设。*

  • 残差服从正态独立分布。
  • 残差的平均值为零。
  • 残差具有恒定的方差。

让我们首先验证残差的平均值。

*y_hat = linreg.predict(X)
epsilon = y - y_hat
print(f"Mean epsilon: {np.mean(epsilon):.3f}")
print(f"Sigma epsilon: {np.std(epsilon):.3f}")*

这似乎没问题:

*Mean epsilon: -0.000
Sigma epsilon: 2.146*

现在,让我们使用夏皮罗-维尔克正态性检验。

*shapiro_stat, shapiro_pvalue = shapiro(epsilon)
print(f"Shapiro test p-value: {shapiro_pvalue:.2f}")*

它返回:

*Shapiro test p-value: 0.38*

因此,我们不能拒绝零假设,即我们的残差来自正态分布。

最后,让我们绘制残差与预测变量和回归量的关系图,以验证它们是否独立分布。

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

残差与预测变量。(图片由作者提供)。

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

残差与自变量。(图片由作者提供)。

残差大多分布良好,尤其是在导线长度小于 7 和目标长度小于 25 的区域。然而,在目标和导线长度之间可能存在一些非线性,因为中间值的残差偏向负值,而高值(目标> 50)偏向正值。那些有兴趣更详细地探索该问题的人可以尝试创建多项式要素,看看这种偏差是否会减少。此外,方差似乎不是有条件分布的。因此,我们不可能通过加权残差来提高模型性能。

在下一节中,让我们创建一个与第一个自变量相关的假预测值,并验证统计显著性检验是否能识别它。

添加错误的预测值

假预测值将等于线长度加上随机噪声项,该随机噪声项遵循平均值 0 和σ1 的正态分布。

*# Predefined random seed to reproductibility of results
np.random.seed(42)

# Create feature
x_false = X[:, 0] + np.random.randn(X.shape[0])
X_false = np.column_stack((X, x_false.reshape((-1, 1))))*

请注意,它也与响应变量线性相关。事实上,甚至比芯片高度更相关。

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

目标预测值与错误预测值。(图片由作者提供)。

让我们重复上一节的过程来看看结果。

*linreg_alt = LinearRegression()
linreg_alt.fit(X_false, y)
print(linreg_alt.r2_score(X_false, y))*

看起来得分指标仍然很高(0.9828),但我们的结果不一定像以前一样有意义。让我们来验证置信区间。

*for i, val in enumerate(linreg_alt.betas):
    pval = linreg_alt.pvalues[i]
    print(f"Beta {i}: {val:.2f}; p-value: {pval:.2f}")*

它返回:

*Beta 0: 2.13; p-value: 0.05
Beta 1: 3.43; p-value: 0.00
Beta 2: 0.01; p-value: 0.00
Beta 3: -0.69; p-value: 0.16*

看来我们找到了冒名顶替者…

因此,我们的框架有效地验证了错误的预测器没有向模型提供额外的信息,假设我们仍然具有线长度的原始值,即使错误的预测器与预测变量具有强线性相关性。相反,相关性较弱的芯片高度对模型的贡献具有统计学意义。

在这种情况下,强烈建议从模型中删除不必要的特征,以提高其可解释性和通用性。在示例笔记本中,我还提出了一个基于 p 值的递归特征消除策略。

进一步阅读

作为一个有工程背景的人,在这方面我应该推荐的第一本参考书是 Montgomery Runger(2003)写的《T4 工程师应用统计和概率》。在那里,你可能会发现这里提出的基本原理的更详细的描述和其他相关的回归方面,如多重共线性,平均响应的置信区间,和特征选择。

那些对机器学习更感兴趣的人可以参考 Hastie 等人(2009)的统计学习的要素*。特别是,我发现看到作者如何解释最近邻与线性模型之间的偏差-方差权衡非常有趣。*

当一个人的目标是估计具有描述非线性现象的一些基本意义的参数时,非线性回归也是令人着迷的。贝茨&瓦特(1988)的《T2【非线性回归分析及其应用】T3》一书是一个很好的参考。Myers 等人(2010 年)的《T4 广义线性模型》一书的第 3 章也介绍了这个主题。

科斯马·沙立兹教授的课堂讲稿可以在这个链接上找到。目前,该草案的标题为从初级角度进行高级数据分析*。在那里,人们可以找到有趣的主题,如加权和方差,因果推断,和相关数据。*

我很欣赏 Python 包 statsmodels 。在应用了 OLS (正如我们在本文中所做的)之后,人们可能会有兴趣尝试 WLS 来解决残差方差不均匀的问题,并使用 VIF 来检测要素多重共线性。

结论

在本文中,介绍了多元线性回归的主要原理,然后用 Python 从头开始实现。该框架应用于一个简单的例子,其中除了线性最小二乘问题中关于残差的主要假设之外,还验证了参数的统计显著性。完整的代码和额外的例子可以在这个链接中找到。

参考

贝茨博士和瓦茨博士,1988 年。非线性回归分析及其应用。威利。

茨韦塔纳·哈斯蒂和 J. H .弗里德曼,2009 年。统计学习的要素:数据挖掘、推理和预测。第二版。纽约:斯普林格。

蒙哥马利特区和龙格,2003 年。工程师应用统计和概率。第三版。约翰·威利父子公司。

迈尔斯,R. H .,蒙哥马利特区,维宁,G. G .和罗宾逊,T. J .,2012 年。广义线性模型:在工程和科学中的应用。第二版。霍博肯:约翰·威利&之子。

*c .沙里齐,2021。*从初级观点看高级数据分析。剑桥大学出版社。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值