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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

评估偏差

原文:https://towardsdatascience.com/evaluation-bias-are-you-inadvertently-training-on-your-entire-dataset-b3961aea8283?source=collection_archive---------21-----------------------

入门

您是否无意中对整个数据集进行了训练?

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

图片来源:http://bit.ly/pexels_artichokes 安民()

通过使用从模型对测试数据的性能中获得的洞察力,我们有效地使用了我们的整个数据集来调整模型,而无需直接在测试样本上训练模型。

现状。

70:30 的比例,我们随处可见。其中 70%的样本用于训练模型,30%留出来测试该模型:

features_train, features_test, labels_train, labels_test = sklearn.preprocessing.train_test_split(
    features, labels,
    test_size=0.30
)

默认情况下,这种双向分割被硬编码到大多数机器学习工具中。然而,通过思维实验,我们将探究它是如何将偏见引入我们的模型的。

对学术最佳实践的怀疑。

作为机器学习的新手,我担心让太多象牙塔中的最佳实践只是为了表面而悄悄进入我的工作流程。

百分之三十?!为什么会丢弃近三分之一的数据!这怎么被认为是数据“科学”呢?

因此,我花了一段时间来适应留出更多数据的想法,希望训练一个更具普遍性的模型。

在我想出如何在我自己的数据集上产生高精度模型之后,我对更先进技术的怀疑只是加强了——特别是当它引入第三个 **验证分割时。**拒绝更多来自我的训练分割训练的数据怎么可能产生更好的结果?

另外,我喜欢我的垃圾模特!他们成功了!“这里有人动过测试数据吗?”我问自己。“没有,没有人在碰测试数据。”我推理道。拆分发生在工作流的早期。模特是不可能看到的。那么所有的验证大惊小怪的是什么呢?

有缺陷的培训流程示例。

让我们角色扮演一个假设的和过度简化的 2 分裂训练过程的一些迭代,看看我们是否能发现关于我们的测试数据的信息在哪里泄漏。

Run 1
+-------+-----------+------+
| Train | (acc)     | 0.88 |
+-------+-----------+------+
| Test  | (val_acc) | 0.74 |
+-------+-----------+------+

看起来我们的模型在学习。很好。鉴于这是我们的第一次运行,我们可能会从这些数据中获得更多的准确性,所以让我们更改批量参数,看看会发生什么。

Run 2
+-------+-----------+------+
| Train | (acc)     | 0.94 |
+-------+-----------+------+
| Test  | (val_acc) | 0.87 |   # increased batch size.
+-------+-----------+------+

是的,当然模型那样表现更好。好的,好的,快到了。现在添加另一层,真正提取最后一层细节。

Run 3
+-------+-----------+------+
| Train | (acc)     | 0.98 |
+-------+-----------+------+
| Test  | (val_acc) | 0.63 |  # extra layer of depth.
+-------+-----------+------+

邦克!嗯,很明显,额外的一层覆盖了训练数据。因此,让我们回滚这一变化,并与我们现有的层,而不是玩神经元的数量。

Run 4
+-------+-----------+------+
| Train | (acc)     | 0.95 |
+-------+-----------+------+
| Test  | (val_acc) | 0.94 |  # increased neurons.
+-------+-----------+------+

尤里卡—数据世界的真正主人!宇宙中没有任何数据能逃过我们的推断!

反思。

踩刹车。这里刚刚发生了什么?我们模型的改进实际上来自哪里?

好吧,纵观所有的运行,有什么共同点?我给你一个提示——在这个工作流程中实际上有第二个神经网络在执行一个隐藏的回归分析。不,它没有深埋在反向传播的源代码中。它一直就在我们眼皮底下。是你的大脑!

作为数据科学家,在评估模型时,我们正在根据我们的性能指标执行我们自己的内部超参数扫描。我们是整个培训过程的共同点。

事实上,由于神经网络仅使用损失作为其改进的指导指标,其他指标如准确性R 的存在只是为了帮助我们了解我们的模型表现如何。

T 因此,当我们根据我们所了解到的以前的拓扑结构和超参数如何影响测试数据的准确性来改变我们的模型时,我们就在我们的模型中引入了巨大的偏差。通过使用从模型对测试数据的性能中获得的洞察力,我们有效地使用了我们的整个数据集来调整模型,而无需直接在测试样本上训练模型。

怎么修。

那么,我们如何才能防止自己将这种偏见引入我们的工作流程呢?

良好的第一步是开始使用第三个 验证分割 来评估您的训练跑步。这允许你真正地将你的测试数据作为保持分割。只有当您认为您已经有了一个模型,并且该模型能够根据它在验证数据上的表现很好地进行概括时,您才可以使用这种维持分离来进行评估。

请记住,我们使用第三次验证分割的根本原因是不要对算法隐藏样本。相反,我们这样做是为了在多次运行中重新设计算法时,对作为性能指标评估者的我们自己隐藏这一点。

跨拆分的数据分布如下所示:

splits = {
    "train": 0.67,
    "validation": 0.13,
    "test": 0.20
}

你会问,如何确定尺寸分割?这完全取决于你有多少数据。如果您有很多数据,那么您可以让您的验证和测试分割侵蚀您的训练集。然而,样本的数量(100、500、1000)实际上并不重要。这一切都是为了能够确保每一次分割都能代表更广泛的样本群体。这意味着每个分割包含相同程度的可变性。15 个学生的教室代表一个学校吗?来自日内瓦的 10,000 人的样本集准确地反映了整个欧盟吗?也许是/也许不是。

分层。

这种更广泛的代表性是通过将数据分层实现的;确保每个分割均匀分布。数据在每次分割中是否具有相同的“形状”?

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

图片鸣谢:Mike Yi,直方图完全指南 (2019) ChartIO

然而,即使我们根据我们的标签和我们所有的特征进行分层,也有可能在每次分割中存在一些看不见的可变性。我说的不仅仅是离群值。请记住,实际收集的特征只是可用于描述样本的无数特征中的一小部分。我们的模型试图在训练中梳理出一些潜在的、看不见的特征。

侧边栏 :如果我们使用 sklearn 的 StratifiedKFold() 方法进行留一法交叉验证,实际上是免费得到验证折叠和分层。

然而,这意味着在将它们输入到深度学习库中时,你必须跟踪每个折叠分组的样本索引。此外,您可能没有足够的数据来确保每个文件夹中都有来自每个类的样本,这导致在计算度量时非常痛苦。它也不处理连续变量的分层。您也许可以通过一个简单的验证分割来逃脱。

解决方案。

我们已经看到,引入验证分割或折叠给我们的工作流增加了更多的移动部分,特别是如果我们执行交叉验证的话。

幸运的是,开源的 AIQC 框架,用于可重复的深度学习数据准备和批量模型调整,可以为您处理这些!

github.com/aiqc/aiqc

在这里,我们可以看到高级 API 如何使分层数据的拆分和折叠变得轻而易举:

splitset = aiqc.Dataset.Tabular.make( dataFrame_or_filePath = df
    , dtype = None  *# option to force a specific data type.* , label_column = 'object'
    , features_excluded = None **, size_test = 0.22
    , size_validation = 0.12
    , fold_count = 5** *# number of folds for cross-validation.* **, bin_count = 3** *# number of bins for stratification.* *, label_encoder = None
    , feature_encoders = None  #see next blog!*
)

如果您需要手动访问拆分/折叠,可以通过以下方法获取:

Foldset.to_numpy(
    id:int
    , fold_index:int
    , fold_names:list #['folds_train_combined', 'fold_validation']
    , include_label:bool
    , include_featureset:bool
    , feature_columns:list
 )

之后,您甚至可以设置hide_test=True来防止关于您的维持集的自动化性能指标和图表被泄露。

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

AIQC:批量中每个模型的每个分割/折叠的自动化度量。按性能阈值过滤。在这里,测试分割是隐藏的。

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

AIQC:一个用于分类分析的自动化图表的例子。

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

AIQC:分类分析的自动化度量。

外卖。

  • 当基于旧模型在测试/维持数据上的性能调整新模型时,实践者将偏差引入他们的模型。
  • 添加验证分割/折叠作为缓冲,保护测试/维持数据免受审查。
  • 对数据集进行切片需要分层,以确保它能够代表总体。更复杂的是,这也导致需要计算更多的指标和图表。
  • 与大多数机器学习工具不同,AIQC API 可以轻松使用验证拆分/折叠,动态跟踪每个拆分/折叠,并自动计算它们的指标。

期待。

现在,你可能想知道,既然我们已经对数据进行了大量的分割,我们如何对每个分割/折叠进行编码呢?这是我们下一篇博客的主题!

评估指标

原文:https://towardsdatascience.com/evaluation-metrics-18db24a91223?source=collection_archive---------22-----------------------

探索不同的方法来评估分类问题的机器学习模型。

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

图片由卢克·切瑟Unsplash 上拍摄

这是 2 篇文章系列的第 1 部分,其中我们讨论了机器学习(ML)问题的不同评估指标。评估算法的输出与对算法本身建模一样重要。评估一个项目有助于确定该项目的影响力如何,以及如何对其进行改进。在本文中,我们将回顾 分类 的评估指标。那么,我们开始吧。

混淆矩阵

混淆矩阵 是一个 N x N 矩阵,其中 N 表示目标变量中类别的数量(例如 10幸存列中的两个类/类别

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

图一。混乱矩阵布局(图片由作者提供)

我们先写出预测是 ( P )还是 ( N ),然后根据实际值决定是 ( T )还是 ( F )。

╔═══════════╦════╦════╦════╦════╦════╦════╦════╦════╗
║ Actual    ║ 1  ║ 1  ║ 1  ║ 0  ║ 1  ║ 1  ║ 0  ║ 0  ║
╠═══════════╬════╬════╬════╬════╬════╬════╬════╬════╣
║ Predicted ║ 0  ║ 1  ║ 0  ║ 0  ║ 1  ║ 1  ║ 1  ║ 0  ║
╠═══════════╬════╬════╬════╬════╬════╬════╬════╬════╣
║           ║ FN ║ TP ║ FN ║ TN ║ TP ║ TP ║ FP ║ TN ║
╚═══════════╩════╩════╩════╩════╩════╩════╩════╩════╝
               *Table 1\. Sample Data*

考虑上表。对于第一种情况,预测值为 0,因此我们将写成负,由于实际值与预测值矛盾,我们将写成假,使其成为假负 ( FN )。同样,评估每一个案例,计算它们,并填写混淆矩阵布局。

# Confusion matrix of sample data (Table 1)
from sklearn.metrics import confusion_matrix
confusion_matrix(Actual, Predicted)╔═══╦═══╗
║ 3 ║ 2 ║
╠═══╬═══╣
║ 1 ║ 2 ║
╚═══╩═══╝

分类成本

分类成本 (CoC)是对分类模型计算成本的一种度量。我们计算成本的方法是将权重分配给混淆矩阵。简单来说,如果分类正确,我们奖励奖励,如果分类错误,我们处罚*。*

╔════════╦═══════════════════╗
║        ║ PREDICTED CLASS   ║
╠════════╬════════╦════╦═════╣
║        ║ C(*i*|*j*) ║ +  ║ -   ║
║ ACTUAL ╠════════╬════╬═════╣ 
║        ║    +   ║ -1 ║ 100 ║
║ CLASS  ╠════════╬════╬═════╣
║        ║    -   ║ 1  ║ 0   ║ C(*i*|*j*): Cost of misclassifying class
╚════════╩════════╩════╩═════╝         *j* example as class *i
           Table 2*

这里, -1 是奖励, 100 是惩罚。因此,对于上述混淆矩阵,CoC 为:

# Cost of sample data (Table 1)
(3 x (-1)) + (2 x 100) + (1 x 1) + (2 x 0) = **198**

成本越低,型号越好。

准确(性)

最常用的评估方法是*。它是正确预测值与总预测值之比。*

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

*# Accuracy of sample data (Table 1)
from sklearn.metrics import accuracy_score
accuracy_score(Actual, Predicted)0.625*

准确性与 CoC

选择一个精度或 C ost 取决于我们为其建模 ML 解决方案的领域。考虑两个模型, M₁M₂ ,以及它们与以下成本和精度的权衡。

*╔════════╦══════════════════╗       ╔════════╦══════════════════╗
║ M₁     ║ PREDICTED CLASS  ║       ║ M₂     ║ PREDICTED CLASS  ║
╠════════╬══════╦═════╦═════╣       ╠════════╬══════╦═════╦═════╣
║        ║      ║  +  ║  -  ║       ║        ║      ║  +  ║  -  ║
║ ACTUAL ╠══════╬═════╬═════╣       ║ ACTUAL ╠══════╬═════╬═════╣
║        ║   +  ║ 150 ║ 40  ║       ║        ║   +  ║ 250 ║ 45  ║
║ CLASS  ╠══════╬═════╬═════╣       ║ CLASS  ╠══════╬═════╬═════╣
║        ║   -  ║ 60  ║ 250 ║       ║        ║   -  ║ 5   ║ 200 ║
╚════════╩══════╩═════╩═════╝       ╚════════╩══════╩═════╩═════╝
            *Table 3*                              *Table 4*     

          Accuracy = 80%                       Accuracy = 90%              
          Cost     = 3910                      Cost     = 4255*

选择哪种模式取决于一家公司在精确度和成本方面的灵活程度。让我们考虑这样一个场景,您正在开发一个模型来对患有https://github.com/codebankss/liver-disease-detection肝病的患者进行分类。在这里,我们可以通过几个假阳性*(1 型错误)来使它工作,但是我们不能承受假阴性**(2 型错误)*。因此,我们希望选择一个精确度更高的模型。或者,在制造公司,我们可以承受一些错误,但成本是至关重要的,成本较低的模型将是我们的选择。**

在以下情况下,成本与精度成正比:

C(+|-)=C(-|+)= q,C(+|+)= C(-|-)= p

**╔════════╦═════════════════╗
║        ║ PREDICTED CLASS ║      N = a + b + c + d
╠════════╬═══════╦════╦════╣      
║        ║       ║ +  ║ -  ║
║ ACTUAL ╠═══════╬════╬════╣      Accuracy = (a + d)/N
║        ║    +  ║ a  ║ b  ║
║ CLASS  ╠═══════╬════╬════╣
║        ║    -  ║ c  ║ d  ║
╚════════╩═══════╩════╩════╝
       *Confusion Matrix*╔════════╦═════════════════╗
║        ║ PREDICTED CLASS ║      Cost = p(a+d) + q(b+c)
╠════════╬═════════╦═══╦═══╣           = p(a+d) + q(N-a-d)
║        ║ C(*i*|*j*)  ║ + ║ - ║           = qN - (q - p)(a + d)
║ ACTUAL ╠═════════╬═══╬═══╣           = N[q-(q-p)x Accuracy]
║        ║    +    ║ p ║ q ║
║ CLASS  ╠═════════╬═══╬═══╣
║        ║    -    ║ q ║ p ║
╚════════╩═════════╩═══╩═══╝
         *Cost Matrix***

比率比较

我们不能完全依赖准确性进行评估。考虑以下数据不平衡的情况。

**╔════════╦═════════════════╗
║        ║ PREDICTED CLASS ║
╠════════╬═══════╦═══╦═════╣
║        ║       ║ + ║  -  ║
║ ACTUAL ╠═══════╬═══╬═════╣
║        ║   +   ║ 4 ║  2  ║
║ CLASS  ╠═══════╬═══╬═════╣
║        ║   -   ║ 8 ║ 486 ║
╚════════╩═══════╩═══╩═════╝
            *Table 5***

上述模型的预测能力绝对,然而我们有(486+4)/(4+2+8+486)=98%。对于这种类型的分类,精确度是不够的。它只是不够健壮。为了克服不平衡数据的问题,可以使用以下指标。

真实阳性率

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

它的值介于 0 到 1 之间。的 TPR 值越高,的型号越好。它代表了预测因子中真正的阳性率。

假阴性率

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

就像 TPR 一样,它的范围是 0 到 1。它代表预测值中的假阴性率。降低,使更好*。*

同样,我们有 TNR 和 FPR。

真实负利率

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

假阳性率

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

精确

精度 是一个评估指标,它告诉我们在所有正面预测中,有多少实际上是正面的。当我们不能承受假阳性(FP)时,就使用它。

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

回忆

回忆 告诉我们,在所有实际阳性中,有多少是预测阳性。当我们不能承受假阴性时,就使用它(FN)。较低的回忆值告诉我们,我们在数据中缺少好的例子。

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

精确度与召回曲线

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

图二。精度与召回曲线(图片由作者提供)

f1-分数

有时候,精确和回忆孰轻孰重并不明确。因此,两者可以结合起来,以获得一个良好的模型评估方法。它叫做F1——分数* 。F1 是的谐音的意思是的精确和召回。*

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

当精度变为等于时,达到最大值,以便调用。

*# Classification report of sample data (Table 1)
from sklearn.metrics import classification_report
classification_report(actual, predicted)╔══════════════════╦═══════════╦════════╦══════════╦═════════╗
║                  ║ precision ║ recall ║ f1-score ║ support ║
╠══════════════════╬═══════════╬════════╬══════════╬═════════╣
║ 0                ║   0.50    ║  0.67  ║   0.57   ║    3    ║
╠══════════════════╬═══════════╬════════╬══════════╬═════════╣
║ 1                ║   0.75    ║  0.60  ║   0.67   ║    5    ║
╠══════════════════╬═══════════╬════════╬══════════╬═════════╣
║                  ║           ║        ║          ║         ║
╠══════════════════╬═══════════╬════════╬══════════╬═════════╣
║ accuracy         ║           ║        ║   0.62   ║    8    ║
╠══════════════════╬═══════════╬════════╬══════════╬═════════╣
║ macro average    ║   0.62    ║  0.63  ║   0.62   ║    8    ║
╠══════════════════╬═══════════╬════════╬══════════╬═════════╣
║ weighted average ║   0.66    ║  0.62  ║   0.63   ║    8    ║
╚══════════════════╩═══════════╩════════╩══════════╩═════════╝
                       *Classification Report**

  1. 精度召回F1-得分成本敏感 。你不必同时考虑准确性和成本。
  2. **精度偏向 C(+|+)C(+|-)
  3. **回忆偏向 C(+|+)C(-|+)
  4. **F1-评分偏向除 C(-|-) 以外的所有。
  5. 精心策划的算法的性能还取决于目标变量的***【错误分类成本】*以及训练集和测试集的 大小。
  6. F1 分数缺乏可解释性,因此应在中与其他评估指标结合使用。根据用例,两个指标的组合就足够了。

阈值处理

当我们有一个模型来预测类的概率(预测是 0/1),而不是类本身。因此,可以设置 阈值 值来根据概率将预测分类为 0 或 1。让我们更加了解。

AUC-ROC

AUC-ROC曲线下面积—受试者工作特性的缩写。这个名字来源于信号检测理论,最初用于区分 噪声非噪声 。它是一个二元分类的评估度量,给出了 假阳性率真阳性率 之间的权衡。

ROC 曲线上的每个点都是模型分类的性能表示。改变算法、样本分布或成本矩阵的阈值会改变点的位置。考虑包含两个类的 1D 数据集— 01

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

图三。ROC 曲线 1(图片由作者提供)

任何值大于 t 的点被归类为 类-1ROC 曲线 2 的曲线下面积为 AUC-ROC 值。AUC-ROC 越高,模型越好。

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

图 4。ROC 曲线 2(图片由作者提供)

图 4 中∏ABC的面积为 0.5(边长为 1 的正方形面积的一半)。因此,AUC-ROC 值总是 大于(或等于)0.5。

如何绘制 ROC 曲线

**╔══════════╦════════╦════════════╗
║ Instance ║ P(+|A) ║ True Class ║  Steps:
╠══════════╬════════╬════════════╣  1\. Calculate P(*+*|*A*) for each
║    1     ║  0.95  ║     +      ║     instance and sort them in 
╠══════════╬════════╬════════════╣     descending order.
║    2     ║  0.93  ║     +      ║
╠══════════╬════════╬════════════╣  2\. Take first probability as 
║    3     ║  0.87  ║     -      ║     threshold and calculate ***TPR***
╠══════════╬════════╬════════════╣     and ***FPR***.
║    4     ║  0.85  ║     -      ║
╠══════════╬════════╬════════════╣  3\. Repeat calculation of TPR and 
║    5     ║  0.85  ║     -      ║     FPR with every value of 
╠══════════╬════════╬════════════╣     P(*+*|*A*) as threshold.
║    6     ║  0.85  ║     +      ║
╠══════════╬════════╬════════════╣  4\. Plot FPR vs TPR.
║    7     ║  0.76  ║     -      ║
╠══════════╬════════╬════════════╣
║    8     ║  0.53  ║     +      ║
╠══════════╬════════╬════════════╣
║    9     ║  0.43  ║     -      ║
╠══════════╬════════╬════════════╣
║   10     ║  0.25  ║     +      ║
╚══════════╩════════╩════════════╝**

现在,我们可以用这个方法比较两个型号吗?AUC-ROC 的问题是只考虑了概率的顺序。因此,它不能用于比较两个模型。如果我们使用 ROC 比较两个模型,它将考虑来自单个预测的阈值。因此,两个模型的 TPRFPR 值将是相同的,它们的曲线也是如此,而两个模型的表现并不相同。它的意思是,考虑模型 1 预测类 1 的概率为 96% ,而模型 2 ,对于相同的值,预测类 1 的概率为 89% 。因此,概率的顺序很重要。

原木损失

Log Loss 是每个实例的校正预测概率的对数的负平均值。对于实际分类值为 0,它们的预测值从 1 中减去。(注意,对于 Actual =1,我们不计算校正预测概率)

**╔════════╦═════════════╦════════════╦═════════╗
║ Actual ║ Predicted   ║ Corrected  ║   log   ║
║        ║ Probability ║ Predicted  ║         ║
╠════════╬═════════════╬════════════╬═════════╣
║   1    ║    0.94     ║    0.94    ║ -0.0268 ║
╠════════╬═════════════╬════════════╬═════════╣
║   0    ║    0.56     ║ 1 - 0.56 = ║ -0.3565 ║
║        ║             ║    0.44    ║         ║
╠════════╬═════════════╬════════════╬═════════╣
║   0    ║    0.1      ║ 1 - 0.1 =  ║ -0.0457 ║
║        ║             ║    0.9     ║         ║
╚════════╩═════════════╩════════════╩═════════╝
                   *Table 6***

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

这里,实际类, p(yᵢ) 是实际类的概率,修正-预测概率。它是一个用于比较两个模型的 健壮 度量。****

接下来,我们将讨论关于 回归 问题的评价指标。

评价指标:评估 NLG 产出的质量

原文:https://towardsdatascience.com/evaluation-metrics-assessing-the-quality-of-nlg-outputs-39749a115ff3?source=collection_archive---------13-----------------------

使用评估指标自动化 NLG 输出的评估流程,以节省时间并增加评分实例的容量。

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

詹妮弗·伯克在 Unsplash 上的照片

在我们开始之前;对于那些想直接跳到计算中并在他们的语料库上看到结果的人;最近,我们开源了一个用于评估 NLG 系统的 Python 包“Jury”。要为您的 NLG 模型计算指标,并对它们进行比较,您可以看看这个项目,并且您可以用几行代码轻松地进行设置:)。也可以阅读评审团的官方博文。

评委:https://github.com/obss/jury

在机器学习领域,就像在最不相关的领域一样,我们需要某种评估。你可以想到一个学生参加考试,一辆汽车进行碰撞测试,一个 web 服务器进行负载测试,以及在 AI 中对一个模型进行性能评估。这些领域中的评估方法不同,进化标准设计也不尽相同。此程序主要用于评估模型输出的质量,以及在不同模型或不同设置之间进行比较等。

自然语言生成(NLG)是自然语言处理(NLP)的一个领域,是人工智能的一个应用子领域,其目标是产生文本输出。它有大量的子任务,如机器翻译(MT)、问题回答(QA)、摘要、问题生成(QG)等。这里,讨论是围绕输出为文本的模型的性能。NLG 主要是文本到文本,但一些 NLG 度量也可以应用并已经被采用,例如,评估语音到文本模型(如音素级别的编辑距离)。

虽然像[3]、[4]和[6]这样的早期作品是自动化评估度量发展的先驱,但它们是原始和简单的度量,还不能捕捉语言特征的一些复杂方面。他们开创的时代很快带来了改进的度量标准,其中一些被许多 NLG 任务广泛采用,但仍有关于它们是否足够的讨论。

有两种常见的方法来评估生成文本的质量(实际上有三种根据这篇维基百科的文章):

人工评估:由人工评定者对生成的文本的质量进行评定的过程。通常,生成的输出被分发给一组人类评定者以增加多样性。

**ii)度量:**通过自动度量对生成的文本进行评级的过程,这可能需要在创建之前进行人工干预(我稍后会谈到这一点)。虽然它们中的许多都是针对特定的任务(如机器翻译),但它们普遍适用于其他 NLG 任务。

这两种方法的主要区别在于保真度和努力/时间之间的权衡。人工评估是衡量生成文本质量的一种更好的方法,但它的成本很高。另一方面,度量具有成本效益,可以应用于大量生成的语料库,尽管它们可能不如人工评估好,并且还需要正确的参考语料库来比较生成的文本。

由[13]提出的 NLG 评估指标的一个很好的分类法(如果你想深入研究一篇调查论文,我强烈推荐你看一下这篇论文),其中任务不可知的或任务相关的指标也被区分如下:

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

自动评估指标的分类[13]。

但是,在这里,我将评估指标分为 4 组,以进行总结并保持易读性:

  • 字符串度量
  • 基于 n 元语法的度量
  • 基于嵌入的度量
  • 学习功能

1。字符串度量

这些是人工智能领域中用于文本输出的最早的度量标准。他们在字符或音素水平上工作。通常,这些指标属于编辑距离系列。这一组中的大多数指标利用了编辑距离的三个主要组成部分:插入(I)、删除(D)和替换(S)。

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

编辑将“裁缝”转换为“帆船”,ED = 4。

上面的例子被广泛称为 Levenshtein 距离[6]。如果指标不使用替换,那么替换将计为 2 次操作,替换为序列删除和插入(反之亦然),参见最长公共子序列(LCS)距离。

该组指标的早期版本基本上不考虑流畅性、句法和语义完整性,仅考虑词汇一致性。然而,改进的版本试图通过考虑短语转换、释义、同义词等来填补这一空白。

有许多利用编辑操作的推导,Wagner-Fischer 算法[11],Levenshtein 距离[6],Hamming 距离[3]等。除了在文本到文本的任务中使用之外,这些指标也被语音识别应用程序所采用。您可以看到一个字符串指标列表

2.基于 n 元语法的度量

这些度量使用 n-grams 在生成的文本和参考语料库之间进行计算。这一组中广泛使用和众所周知的例子是 BLEU,它在参考语料库中寻找 n 元语法的对应,但是不考虑句法完整性和语法正确性。例如,BLEU 使用 n 元语法的顺序参数来计算 n 元语法的精度。作者提出简短惩罚来近似人类对短句的判断。

作为这个集合中的一个示例成员,您可以看到候选项 2 的二元模型精度的计算,这是计算 n 元文法顺序≥ 2 的 bleu 分数所需要的。

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

来源:https://present 5 . com/cs-388-自然语言-处理-机器翻译-raymond/

早期的实验表明,BLEU 是许多 NLG 任务的良好指标,因为它与人类的判断密切相关。然而,目前人们认为 BLEU 可能会带来误导性的结果。这里是一篇详细的文章,聚焦于 BLEU 引起的潜在副作用,并提到了 Rachael Tatman 提出的替代方法。

这个群体的一些成员有 BLEU [10],METEOR [1],ROUGE [7],NIST [2],单词错误率(WER)[19],翻译编辑率(TER) [16],TER-Plus (TERP) [17]等。虽然像 WER 和 TER 这样的度量标准是从编辑距离中派生出来的,但它们是在单词级别上工作的,而不是在字符或音素级别上。

3.基于嵌入的度量

这组指标利用语言模型(LM)表示来计算相似性或不相似性的得分。通过 LM 获得生成的文本和参考语料库的嵌入,然后使用余弦相似性或相似性度量来计算相似性或不相似性。使用合适的 LM 可以在字符、单词、句子、段落或语料库级别上获得嵌入。人们可以简单地创建带有嵌入和某种相似或相异度量的定制计算。

由于嵌入和 LMs 的众多级别,该组中的指标相当多样化。通过不同级别嵌入和不同 LMs 的组合,可以设计通用的度量或用于特定的任务。

这组中的几个度量是嵌入平均[5],贪婪匹配[12],BERTscore [20],YiSi [8]。这一组中常用的成员是 BERTScore,它使用 BERT 单词嵌入来计算候选单词和参考单词相对于候选单词和参考单词彼此的相似性(余弦相似性)。以这种方式可以看出,它类似于 F1 分数。我不打算在这里深入讨论细节,但简单地说,它还可以选择使用逆文档频率(IDF)对每个单词嵌入的余弦相似性得分进行加权。这意味着对稀有单词的匹配奖励更多,对常用单词的匹配奖励更少。BERTScore 计算阶段如下所示。

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

来源:https://github.com/Tiiiger/bert_score

一艘宇宙飞船是一艘被设计用来在外层空间飞行的运载工具或机器。一种类型的人造卫星,宇宙飞船被用于多种用途,包括通讯、地球观测、气象、导航、太空殖民、行星探索以及运输人类和货物。

来源:https://en.wikipedia.org/wiki/Spacecraft

例如,单词*“a”由于经常出现而具有低权重,而单词“exploration”*由于很少出现在语料库中而具有较高权重。

4.学习功能

这组指标的目的是找到一个映射 f: (P,R)>人类评级,其中 P 是预测(或生成的文本),R 是引用*。*这些通过预训练回归模型提供预测和参考的端到端评估。

这些模型的输入可以有很大的不同,有些使用单词或文本嵌入,有些使用提取的统计数据和/或简单的指标(准确性、F1 等。)来自预测和参考等等。

这个群体的一些成员有格勒乌[9],比尔[18],鲁斯[15],布莱特[14]等。例如,啤酒使用其他单词级别的指标,如召回率、精确度和 F1 分数,将生成的文本映射到人类评级。另一方面,RUSE 使用预测和参考的句子级嵌入来计算分数。BLEURT 是一个预训练的 BERT 模型,顶部有一个线性层。

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

来源:https://ai . Google blog . com/2020/05/evaluating-natural-language-generation . html

正如你所看到的,BLEURT 有两个预训练阶段,然后在公共人类评级上进行微调。可选地,它可以针对应用特定的人工评级进行微调,以用于手边的特定任务。下面,你可以看到 BLEURT 评价的几个候选句子。

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

来源:https://ai . Google blog . com/2020/05/evaluating-natural-language-generation . html

最后的话

我试图总结用于 NLG 系统的评估指标。到目前为止,我们涵盖了 4 个主要类别,它们(在某种意义上)是按时间顺序排列的。尽管这些度量标准简化了评估过程并减少了工作量,但是您应该使用相对更适合您的任务的度量标准。[13]举例说明了一些任务中几个指标的用法,如下所示。

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

任务间自动评估度量的使用。[13]

承认

特别感谢 Cemil Cengiz 的宝贵反馈,以及所有 obss ml 团队的讨论和支持。

参考文献

班纳吉,s .,&拉维,A. (2005 年 6 月)。METEOR:一种与人类判断有改进相关性的机器翻译评估的自动度量。在关于机器翻译和/或摘要的内在和外在评估措施的 acl 研讨会会议录(第 65–72 页)。

多丁顿,G. (2002 年 3 月)。基于 n 元语法共现统计的机器翻译质量自动评估。第二届人类语言技术研究国际会议论文集*(第 138-145 页)。*

**【3】**海明,R. W. (1950)。错误检测和纠错码。贝尔系统技术期刊29 (2),147–160。

**【4】**亨特,M. J. (1990)。评估连接词识别器的品质因数。言语交际9 (4),329–336。

**【5】**兰道尔,t . k .&杜迈斯,S. T. (1997)。柏拉图问题的解决方案:知识的获取、归纳和表征的潜在语义分析理论。心理复习104 (2),211。

**【6】**Levenshtein,V. I. (1966 年 2 月)。能够纠正删除、插入和反转的二进制代码。在苏联物理学多克拉迪(第 10 卷第 8 期第 707–710 页)。

林春燕(2004 年 7 月)。Rouge:一个自动评估摘要的包。在中,文本摘要分支出(第 74-81 页)。

**【8】**Lo,C. K. (2019,8 月)。YiSi --一个统一的语义机器翻译质量评估和估计标准,适用于具有不同级别可用资源的语言。在第四届机器翻译会议论文集(第二卷:共享任务论文,第一天)(第 507–513 页)。

【9】羊肉,a,德拉斯,m,万,s,&戴尔,R. (2007,6 月)。GLEU:句子级流利度自动评测。在计算语言学协会第 45 届年会的会议录(第 344-351 页)。

**【10】**帕皮尼,k,鲁科斯,s,沃德,t,&朱,W. J. (2002 年 7 月)。Bleu:一种自动评估机器翻译的方法。计算语言学协会第 40 届年会论文集(第 311-318 页)。

罗伯特·a·瓦格纳和迈克尔·j·费舍尔。1974.串对串校正问题。《美国计算机学会杂志》第 21 卷,第 1 期(1974 年 1 月),第 168-173 页。DOI:https://DOI . org/10.1145/321796.321811

**【12】**俄罗斯,v .&林泰恩,M. (2012 年 6 月)。使用单词到单词的相似性度量对自然语言学生输入的最佳评估。在智能教学系统国际会议上(第 675–676 页)。斯普林格,柏林,海德堡。

**【13】**赛,A. B .,莫汉库马尔,A. K .,&哈普拉,M. M. (2020)。用于 NLG 系统的评价标准综述。arXiv 预印本 arXiv:2008.12009

**【14】**t . Sellam,d . Das,& Parikh,A. P. (2020)。BLEURT:学习文本生成的健壮度量。arXiv 预印本 arXiv:2004.04696

**【15】**岛中香,h .,Kajiwara,t .,&小牧,M. (2018,10 月)。Ruse:使用句子嵌入进行自动机器翻译评估的回归器。在第三届机器翻译会议论文集:共享任务论文(第 751–758 页)。

斯诺弗,m .,多尔,b .,施瓦茨,r .,米丘拉,l .,&马霍尔,J. (2006 年)。有针对性人工标注的翻译编辑率研究。在美洲机器翻译协会第七届会议论文集:技术论文(第 223–231 页)。**

斯诺弗,马修&马德纳尼,尼廷&多尔,邦妮&施瓦茨,理查德。(2009).TER-Plus:翻译编辑率的释义、语义和对齐增强。机器翻译。23.117–127.10.1007/s 10590–009–9062–9。

斯塔诺耶维奇,m .&西玛安,K. (2014 年 6 月)。啤酒:作为排名更好的评价。第九届统计机器翻译研讨会论文集(第 414-419 页)。

****,[19],苏桂英,吴明伟,&常建生(1992)。机器翻译系统的一种新的定量质量度量。载于【1992 年第 2 卷:第 14 届计算语言学国际会议。

****【20】张,t,基肖尔,v,吴,f,温伯格,k . q .&阿奇,Y. (2019)。bertscore:用 Bert 评估文本生成。 arXiv 预印本 arXiv:1904.09675

聚类模型的评估指标

原文:https://towardsdatascience.com/evaluation-metrics-for-clustering-models-5dde821dd6cd?source=collection_archive---------5-----------------------

解释了 3 种不同的聚类指标

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

照片由 Howard BouchevereauUnsplash 上拍摄

聚类是机器学习中的一项基本任务。聚类算法以将相似数据点分组在一起的方式将数据点分组在聚类中。

聚类算法的最终目标是实现高的类内相似性和低的类间相似性。换句话说,我们希望同一个集群中的数据点尽可能相互靠近。不同集群之间的距离需要尽可能大。

有不同的度量用于评估聚类模型的性能或聚类质量。在本文中,我们将介绍以下指标:

  • 纯洁
  • 标准化互信息
  • 兰德指数

纯洁

纯度很容易计算。我们根据最常见的类别为每个聚类分配一个标签。那么纯度就变成正确匹配的类和聚类标签的数量除以总数据点的数量。

考虑这样一种情况,我们的聚类模型将数据点分成 3 个聚类,如下所示:

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

(图片由作者提供)

每个聚类被分配有最频繁的类别标签。我们将每个聚类中正确类别标签的数量相加,然后除以数据点的总数。

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

(图片由作者提供)

一般来说,纯度随着簇数的增加而增加。例如,如果我们有一个模型,将每个观察值分组到一个单独的簇中,那么纯度就是一。

正是因为这个原因,纯度不能作为聚类数量和聚类质量之间的折衷。

标准化互信息

NMI 与信息论有关。我们需要理解熵是什么,所以我先简单解释一下。

熵是一种量化不确定性的度量。

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

熵公式(图片作者提供)

Pi 是标签 i (P(i))的概率。让我们计算前面例子中的类标签的熵。

我们可以通过将属于该类别的数据点的数量除以数据点的总数来计算类别标签的概率。例如,A 类的概率是 6 / 18。

在我们的例子中,熵的计算如下。如果你运行计算,你会看到结果是 1.089。

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

(图片由作者提供)

标签在类之间近似平均分布,因此我们有相对高的熵。

熵随着不确定性的降低而降低。考虑这样一种情况,我们有两个类别(类别 A 中有 9 个数据点,类别 B 中有 1 个数据点)。在这种情况下,如果我们要预测随机选择的数据点的类别,我们比前一种情况更有把握。这种情况下的熵计算如下,结果为 0.325。

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

(图片由作者提供)

我们现在对熵有了基本的了解。当给定聚类标签时,归一化互信息(NMI)给出了类别标签的熵的减少。

在某种意义上,NMI 告诉我们当我们知道聚类标签时,关于类标签的不确定性减少了多少。

它类似于决策树中的信息增益。在构建决策树的过程中,每一次拆分都会给模型增加信息增益。事实上,选择了导致最高信息增益的分割。

回想一下有三个集群的案例。由于每个类别中的数据点数量大致相等,因此我们无法确定随机选取的数据点的类别。

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

(图片由作者提供)

然而,如果我们知道一个数据点属于聚类 A,则该点很可能属于 A 类。因此,我们的不确定性降低了。NMI 测量这种不确定性的减少。因此,它是聚类质量的度量。

NMI 的一个优点是,我们可以用它来比较具有不同聚类数的不同聚类模型,因为 NMI 是归一化的。

scikit-learn 的normalized _ mutual _ info _ score函数可用于计算 NMI。

兰德指数

Rand 指数是两个聚类之间相似性的度量。我们可以用它来比较实际的类标签和预测的聚类标签,以评估聚类算法的性能。

第一步是创建一组无序的数据点对。例如,如果我们有 6 个数据点,该集合包含 15 个无序对,也称为二项式系数。使用 Python 的 scipy 包可以很容易地计算出二项式系数的数量。

import scipy.specia
scipy.special.binom(6,2)
15

考虑我们有以下数据点。

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

(图片由作者提供)

数据点的无序对是{a,b}、{a,c}、{a,d}、{a,e}、{a,f}、{b,c}、{b,d}、{b,e}、{b,f}、{c,d}、{c,e}、{c,f}、{d,e}、{d,f}、{ d,f}、{e,f }。

为了计算 rand 指数,我们对两个值感兴趣:

  • 对于实际聚类和预测聚类,一对元素在同一个聚类中的次数
  • 对于实际聚类和预测聚类,一对元素不在同一个聚类中的次数

对于实际和预测,对{a,b}中的元素在同一个群集中。另一对符合这个描述的是{e,f}(共 2 对)。

对于实际聚类和预测聚类,对{a,d}中的元素位于不同的聚类中。符合该描述的其他对是{a,e}、{a,f}、{b,d}、{b,e}、{b,f}、{c,e}、{c,f}(总共 8 对)

我们现在可以介绍兰德指数的公式:

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

兰德指数(作者图片)

  • a 是一对元素在实际和预测聚类的同一个聚类中的次数,我们计算为 2。
  • b 是一对元素不在实际和预测聚类的同一个聚类中的次数,我们计算为 8。
  • 分母中的表达式是二项式系数的总数,即 15。

因此,这种情况下的 rand 指数是 10 / 15 = 0.67

scikit-learn 的 rand_score 函数可用于计算 rand 指数。

结论

我们已经讨论了聚类模型的 3 个常用评估指标。评估模型和创建模型一样重要。如果没有可靠和全面的评估,我们可能会在模型部署后得到意想不到的结果。

对评估指标的全面理解对于有效和恰当地使用它们至关重要。

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

机器学习的评价标准

原文:https://towardsdatascience.com/evaluation-metrics-for-machine-learning-2167fca1a291?source=collection_archive---------22-----------------------

某些度量比其他度量更好地度量模型性能。

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

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

有太多的指标来确定机器学习模型的性能。了解哪种评估指标将正确地度量您的模型性能是有益的。某些度量比其他度量更好地度量模型性能,这取决于用例。我们将回顾回归和分类模型的一些通用评估指标。

回归

回归用于预测连续输出并使误差最小化。例如,您可以使用回归模型来预测销售额或收入。回归模型的两个基本评估度量是平均绝对误差和均方误差。

注意:计算回归度量的一个技巧是逆向工作。让我们以平均绝对误差(MAE)为例。首先计算误差,然后是绝对值,最后是平均值。我们基本上是把 MAE 倒过来算成了“EAM”。

平均绝对误差

平均绝对误差计算实际值和模型预测值之间的绝对差值。MAE 很适合用作基线,因为它考虑了绝对误差。使用 MAE 的问题在于,度量是相对于值和残差的。例如,什么被认为是好的或坏的 MAE?显然,您希望 MAE 接近 0,但是当您的误差值较大时,使用 MAE 评估您的模型会变得更加困难。

注意:使用绝对误差也用作套索回归的 L-1 归一化

计算 MAE 的公式:

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

梅公式

均方误差

均方误差计算误差,然后计算差值的平方,然后计算平均值。MSE 是另一个用作基线的好指标,因为它是一个像 MAE 一样的基本评估指标。然而,由于每个值都是平方的,所以 MSE 会增加误差。再次导致评估你的模型变得困难。

注意:使用 sqaured 值也用作岭回归的 L-2 归一化

计算 MSE 的公式:

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

MSE 公式

RMSE(均方根误差)

均方根误差就像 MSE 一样,但是取输出的平方根。RMSE 是另一种基于残差平方的基本评估指标,但对较大误差的惩罚更大。

计算 RMSE 的公式:

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

RMSE 公式

MAPE(平均绝对百分比误差)

平均绝对百分比误差尝试用 MAE 解决问题。其中 MAE 是相对的,基于残差的大小。MAPE 会将误差转换为百分比,其中您希望您的 MAPE 尽可能接近 0。还有其他使用绝对值和百分比的指标。(如猿、加权 MAPE、对称 MAPE 等。)

计算 MAPE 的公式:

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

MAPE 公式

平均绝对标度误差

平均绝对比例误差是一个允许您比较两个模型的指标。使用每个模型的 MAE,您可以将新模型的 MAE 放在分子中,将原始模型的 MAE 放在分母中。如果 MASE 值小于 1,则新模型的性能会更好。如果 MASE 值等于 1,则模型执行相同的操作。如果 MASE 值大于 1,则原始模型的性能优于新模型。

计算 MASE 的公式:

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

梅斯公式

分类

分类用于预测离散输出。一个流行的例子是“热狗/不是热狗”的概念。分类器旨在最大化可能性,以确定样本应如何分类。

准确(性)

准确性是最基本的指标之一,但经常会产生误导。原因是由于不平衡的阶级。如果你有一个达到 98%准确率的分类器,但是 98%的数据被归类为同一个标签,那么你的模型不一定很好。这是因为您的模型只是将所有东西都标记为同一个类。

举例:你有 98 个“热狗”,2 个“不是热狗”。你的模型会把所有东西都标上“热狗”的标签,不管它是什么,但仍然有 98%的准确率。即使这个模型完全忽略了其他的一切。

因此,您应该添加平衡数据的方法。(例如,上/下采样、合成数据等。)

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

精确度公式

精确

精度评估您的模型在进行预测时的精度。如果您希望您的模型在标记数据时保持保守,这是一个值得注意的好指标。明智地使用精度的一个例子是,当你的模型产生的每个“正面”标签都有很高的成本时。

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

精确公式

回忆

召回评估模型的敏感度。基本上,它检查您的模型在标记相关样本方面有多成功。

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

回忆公式

f 分数

F 值,也称为 F 值,是精确度和召回率的调和平均值。如果您想在模型的精确度和召回率之间找到平衡,F 值是一个很好的衡量标准,应该用来找到一个总体上较好的模型。

注:在下文中,下标“p”表示被归类为“肯定”的预测。

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

f 分数公式

我可以使用哪些工具来帮助生成评估指标?

一般来说,Scikit Learn 有很棒的评估度量函数。对于分类度量标准,分类报告功能为您处理了很多事情,并快速显示了模型性能。特别列出了精确度、召回率和 F 值。

摘要

根据您的用例选择评估指标。不同的指标更适合不同的目的。选择适当的指标还可以让您在向他人展示您的数据和发现时,对您的模型更有信心。

另一方面,使用错误的评估指标可能对机器学习用例有害。一个常见的例子是关注准确性,使用不平衡的数据集。

需要一个起点并希望获得更多 Python 经验?查看 Scikit Learn 的评估指标函数

链接

评估指标,续

原文:https://towardsdatascience.com/evaluation-metrics-ii-e6f09ded4981?source=collection_archive---------28-----------------------

探索评估机器学习模型的不同方法系列的第 2 部分。

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

图像由https://unsplash.com/@chrisliverani

在文章的第二部分,评估度量,我们将讨论不同的度量来评估 回归 算法。(第一部分可以在这里找到。)**

在回归中,我们通过比较预测值实际值来计算误差。误差决定了预测值与实际值的差距。误差的符号( +- )让我们知道误差从最佳拟合回归线变化的方向。****

 ***+--------------+-----------------+----------------------+
     | Actual Value | Predicted Value | Error                |
     |              |                 | (Predicted - Actual) |
     +--------------+-----------------+----------------------+
     | 19           | 28              |  9                   |
     +--------------+-----------------+----------------------+
     | 37           | 33              | -4                   |
     +--------------+-----------------+----------------------+
     | 25           | 20              | -5                   |
     +--------------+-----------------+----------------------+
     | 9            | 16              |  7                   |
     +--------------+-----------------+----------------------+
     | 22           | 15              | -7                   |
     +--------------+-----------------+----------------------+
                 *Table 1\. Sample Values and Error****

对于一个 分类 模型,如果它的评价度量得分是 0.8,那么它比一个随机基线模型的得分 0.5 要好得多(假设两个类的概率相等)。同样,在回归中,基线可以被认为是用于评估目的的’平均值’’中位数’

均方误差

MSE 因为简单,所以是回归的基本评价指标之一。它是目标值与预测值的平方 差值平均值。******

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

图一。MSE 公式

MSE 去除了误差的负号,甚至惩罚了一个小误差,但是因为我们取误差的平方,它改变了误差的单位(变成平方)。**

为使 MSE 准确工作,数据应遵循正态分布无异常值 ,误差应无偏。MSE 越低,模型越好。********

目标均值 值最小化 MSE。考虑一个例子。给我们成对的数据:特征 𝑥ᵢ 和对应的目标值 𝑦ᵢ ∈ 。让我们将目标向量表示为𝑦ᵢ∈ℝ𝑁t15】,这样 𝑦ᵢ 就是对象 𝑥ᵢ 的目标。同样,**𝑦̂∈t23】表示对物体的预测: 𝑦̂ᵢ 表示物体 𝑥ᵢ.**********

现在,如果所有 𝑥ᵢ 的预测值都等于 𝛼: 𝑦̂ᵢ=𝛼 ,那么 𝛼 的值会使 MSE 误差最小化?

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

图二。最小化 MSE

我们需要最小化函数 𝑓(𝛼) 。相对于 𝛼 来说是平滑的。因此, 𝛼 成为局部最优的必要条件是*****

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

让我们找到满足条件的点:

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

由于二阶导数 ( d f/d𝛼 )在点 𝛼 处为正,那么我们发现的就是局部极小值。因此,我们可以得出结论,MSE 度量的最优常数是 目标均值 值。***

平均绝对误差

MAE绝对值平均值误差。MAE 的基线模型为 中位数 。如果 MAE 是,这意味着模型预测的是中值。****

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

图三。梅公式

MAE 是最基本的,非负误差计算方法。在计算误差时,必须使数值为非负值,否则,在大多数情况下,负值会抵消正值。MAE 的输出是线性。因此,大误差不会盖过小误差,并给出模型的无偏视图。或者,由于 MAE 是线性的,它不能(通过平方)给大或小的误差加权。

目标中值 最小化 MAE。就像我们为 MSE 做的一样,我们能找到 MAE。这里,我们需要回答什么样的 𝛼 值会最小化 MAE 误差?

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

图 4。最小化 MAE

回想一下(∂|𝑥|/𝑑𝑥) = 𝑠𝑖𝑔𝑛(𝑥),其中𝑠𝑖𝑔𝑛代表符号功能。因此,

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

所以我们需要找到这样的𝛼*

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

注意 𝑔(𝛼) 是一个分段常数非减函数。𝑔(𝛼)=-1为小于最小值的 𝛼 的所有值 𝑦ᵢ𝑔(𝛼) = 1𝛼 >最大值 ᵢ 𝑦ᵢ 。功能通过 2/𝑁 在每一点 𝑦ᵢ 跳转*。这里有一个例子,这个函数对于𝑦=[-0.5,0,1,3,3.4 😗***

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

图五。 𝑔(𝛼) vs 𝛼 剧情

基本上同样大小的 𝑁 跳跃,从1开始,到 1 结束。很明显,你需要做的是关于𝑁/2t40】跳跃来撞击零点。这恰好发生在目标向量 𝑔(𝑚𝑒𝑑𝑖𝑎𝑛(𝑦))=0中值 处。我们要小心区分两种情况:当有 偶数 点数和奇数时,但直觉不变。****

均方根误差(RMSE)

RMSE 是评估回归模型最常见的度量。就是均方误差平方根。RMSE 用平方根将数值换算回原来的单位。如果 RMSE 高,那么中的 中的 实际值与预测值有较大偏差。

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

图六。RMSE 公式

RMSE 对大的错误很敏感。因此,每当您想要检测预测值和实际值之间的巨大差异时,它就非常有用。

尽管 RMSE 是一个很好的指标,但它在某些情况下不能一概而论。就像 MSE 一样,RMSE 对 离群值 很敏感。RMSE 也要求数据遵循正态分布。考虑下表。**

 *+--------+--------+-----------+
                 |        | Actual | Predicted |
                 +--------+--------+-----------+
                 | Case 1 | 1      | 401       |
                 +--------+--------+-----------+
                 | Case 2 | 10001  | 10401     |
                 +--------+--------+-----------+
                             Table 2.*

在案例 1 中,我们可以得出结论,模型一定有问题,因为实际值预测值的比例有很大差异,因此预测不正确。**

在案例 2 中,相对于比例,差异不是太大,因此它是一个相当精确的模型。

在这两种情况下,RMSE 是相同的,因为它只考虑预测值和实际值之间的差异。

均方根对数误差

【RMSLE】是 RMSE 的一个稍微修改但完全不同的版本,其中我们在平方之前取实际预测值的日志*。***

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

图 7。RMSLE 公式

Log 按比例缩小输出值。如果数据中有异常值,RMSE 的大小会急剧增加,而 RMSLE 则保持在附近的范围内。所以比 RMSE健壮*** 多了。***

相对平方误差

RSE训练模型的均方差与基线模型的均方差之比。****

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

图 8。基本 RSE 公式

为了计算基线模型的 MSE,我们将考虑实际值实际值的总平均值之间的。****

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

图九。扩展 RSE 公式

当 MSE(模型)变得等于MSE(基线)时,那么 RSE = 1 ,这意味着我们的模型与预测所有值的平均值一样好。**

如果 RSE > 1 ,则该模型比基准模型差。因此,MSE(模型)越低,模型越好。这与数字越高,模型越好的观点相矛盾。

r 平方

R 又称 决定系数 。r 告诉我们独立变量中的变化有多少是由从属变量解释的。这些信息让我们了解与基线模型相比,我们的模型的*符合度**。*****

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

图 10。r 公式

因为它是一个比率,所以没有标度,R 的值在[0,1]之间,R 越高,模型越好。

每当你添加更多的 特征 到数据中,R 要么增加要么根本不改变而不考虑特征。有时,它可能会将结果导向相反的方向。它不会受到惩罚,因此 R 对于样本或特征数量的变化不是很鲁棒。

调整后的 R 平方

为了克服 R 的缺点, 调整后的 R 考虑了’ k ‘,其中’ k '是特征数 ( 变量),’ N '是样本数。****

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

图 11。调整后的 R 公式

N-k-1自由度,其有助于提供关于估计回归模型所需的最小样本数信息。理想情况下,当有大量特征时,需要有一个大的样本来进行良好的拟合。****

现在,如果添加特征和样本,分母( N-k-1 )增加。如果 R 显著增加,这种变化可以得到补偿。但是,如果 R 不变,我们从调整后的 R 的等式中的 1 减去一个更大的值。因此,调整后的 R 减小。**

调整后的 R 值越高,模型越好。

结论

评估统计模型对于识别 未见数据 上模型的 功效 非常关键。确定评估模型的正确指标甚至更为关键。此外,为了获得全面的理解,在不同的评估约束下测试模型变得非常重要。

选择正确的指标是关于理解 业务需求预期 期望的结果。基于各种目标,可以制定不同的新的评估度量,以获得 最优 结果。否则,可能会导致结果不明确。

[1]:张若池。(2019 年 7 月 14 日)。度量https://zhangruochi.com/Metrics/2019/07/14/

强化学习策略的评估

原文:https://towardsdatascience.com/evaluation-of-rl-policies-14a9443d3554?source=collection_archive---------28-----------------------

在强化学习中,主体通常处理顺序的、评估的和抽样的反馈。

在这篇文章中,我们将关注能够同时处理顺序反馈和评估反馈的代理。甚至大多数人在同时平衡当前和长期目标以及收集和利用信息方面都存在问题。

  • 顺序意味着您的代理可以接收延迟的信息。延迟的反馈使得解释反馈的来源变得棘手。顺序反馈引起了时间信用分配问题,这是确定哪个状态、行为或状态-行为对奖励负责的挑战。
  • 评价性意味着反馈只是相对的,因为环境是不确定的。我们不知道环境的实际动态;我们无法访问转换函数和奖励信号。因此,作为不确定性的一个持续副产品,出现了勘探-开采权衡。
  • Sampled 表示代理需要使用收集到的反馈进行归纳,并基于该归纳做出明智的决策。

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

来源:维基百科(https://it.wikipedia.org/wiki/Robot)

我们的目标是估计一份保单的价值,也就是说,了解从一份保单中期望得到多少总回报。更确切地说,目标是估计策略π的状态值函数 vπ(s)。换句话说,这就是预测问题。

一般来说,所有学习价值函数的方法都是逐步将估计误差的一部分移向目标。大多数学习方法遵循的一般等式是估计=估计+步长*误差。误差就是采样目标和当前估计值之间的差值:(target-estimate)。计算这些目标的两种主要且相反的方法是蒙特卡罗和时差学习。这两种方法是可以用 n 步 TD 法概括的两个极端。仅仅通过改变步长,你就可以得到介于两者之间的任何代理。通过 TD(λ),单个代理可以以一种非常创新的方式将这两个极端以及两者之间的任何事物结合起来。

蒙特卡洛

MC 很直观。如果你想知道从一项政策中期望得到多少总回报,你只需用这项政策运行几集,收集数百条轨迹,然后计算每个州的平均值。

一点背景:状态、奖励、动作、下一个状态是一个体验元组。一系列的经历被称为轨迹。

  1. 使用策略π与环境进行交互,直到代理达到终止状态。
  2. 你计算遇到的每个状态的回报。你从状态 1 开始,增加和减少沿途收到的奖励,然后重复状态 2,直到最后一个状态。
  3. 现在,您可以通过对从每个状态获得的回报进行平均来估计每集结束时的状态值函数。换句话说,您可以用平均值来估计期望值。

有趣的是,实现 MC 有不同的方式。单个轨迹可能包含对同一状态的多次访问。如果你独立计算每次访问后的回报,那么你使用的是每次访问 EVMC;另一方面,如果您只对每个州使用首次访问,则使用首次访问 MC (FVMC)。

时差

一方面,MC 具有可靠的收敛性质,因为它向实际回报更新价值函数估计,这是真实状态-价值函数 vπ(s)的无偏估计。另一方面,对于 MC,代理必须等到一集结束时才能获得实际回报,然后才能更新状态值函数估计。此外,实际回报是准确的,但方差高,因此样本效率低——因为它们在同一轨迹上累积了许多随机事件。

对于 TD,你使用单步回报,一旦你观察到下一个状态,你可以使用状态值函数估计作为下一步的回报估计。换句话说,TD 方法使用 vπ(s)的估计值来估计 vπ(s)。它启动并根据猜测进行猜测;它使用估计回报而不是实际回报。

TD 背后的大直觉是,从回报中,我们可以通过将一些项分组来重写等式。由此可知:

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

这种递归形式:

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

因此,这允许我们这样写状态值函数:

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

然后,我们可以估计每个时间步上的状态值函数。事实上:

  1. 我们使用我们的策略推出单个交互步骤。
  2. 我们在一步期望的样本上估计状态值函数。

TD 目标是真实状态值函数 vπ(s)的有偏估计,因为我们使用状态值函数的估计来计算状态值函数的估计。这也称为引导。值得注意的是,这一估计值的方差要低得多,因为 TD 目标只取决于一次经验。

N 步 TD 学习

MC 和 TD 将实际回报分散到所有状态。但是,我们可以把这两种方法推广成一种 n 步法,用 n 步来计算值函数。但是什么是好的 n 值呢?高于
1 的 n 值通常更好,但是我们也不应该去追求实际回报。自举有所帮助,但它的偏见是一个挑战。

  • 前视 TD(λ) 使用所有 n 步返回,直到最后一步 T,然后用指数衰减值加权。在这个特定的版本中,代理必须等到一集结束后才能更新状态值函数估计。但至少我们有所收获:如果我们愿意接受偏差,我们可以得到更低方差的目标。
  • 后视 TD(λ) 除了能够在每个时间步长应用更新之外,还可以调整偏差/方差权衡,就像 TD 一样。该方法跟踪一个状态是否合格以及合格多少,以便相应的值函数更新被正确地应用于合格的状态。它使用资格跟踪来实现,资格跟踪是一个内存向量,用于跟踪最近访问过的状态。在更新之后,合格跟踪向量被λ(权重混合因子)和γ(折扣因子)衰减,使得未来的加强事件对早期状态的影响较小。通过这样做,假设λ没有被设置为 1,则最近的状态在最近的过渡中遇到的奖励比在该集早期访问的那些状态获得更多的积分;否则,这类似于 MC 更新,其给在该集期间访问的所有州相同的信用(假设没有折扣)。

结论

在本文中,我们只处理预测问题,它包括估计代理的行为值。我们谈到了 MC 预测和 TD 学习。这两种方法是可以用 n 步 TD 法概括的两个极端。有了 TD(λ),单个智能体就可以结合这两个极端和两者之间的一切。

随时给我留言或:

  1. 通过LinkedInTwitter 联系我
  2. 媒体上跟随我

参考

曼宁——DRL

事件驱动架构和语义耦合

原文:https://towardsdatascience.com/event-driven-architecture-and-semantic-coupling-7cd5c2f2fc99?source=collection_archive---------18-----------------------

解决事件驱动架构中的语义耦合对于真正实现松散耦合至关重要

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

图片来自 Pixabay 许可下的 Pixabay

事件驱动架构(EDA)是构建松耦合应用程序(微服务与否)的关键。这是一种架构风格(参见这里的和这里的和),其中组件通过发出和响应事件来异步通信。

净化 1:一个事件是过去发生的事情。事件通知(或称事件消息)包含事件的描述。但是在大多数情况下,以及在本文中,事件指的是事件消息。

净化 2:一个生产者是一个应用程序或应用程序组件,它发布指示其中一些状态变化的事件。

净化 3:一个消费者是一个应用程序或应用程序组件,它监听事件并对它们做出反应。

应用程序是松散耦合的,

  • 可以在不知道源或目标的情况下开发和运行单个组件。正是信息层上的交互需求为集成奠定了基础。
  • 单个组件较少受限于平台、编程语言以及构建和运行环境。因此,每个应用程序组件都可以用最合适的技术来构建。有些甚至可能是商业现货(COTS)产品。
  • 单个组件可以独立地进行扩展、配置、审计和合规性检查。

正如 Martin Fowler 在这里所解释的,组件需要了解外部系统才能完成内部事务,这就产生了依赖性,导致了紧密耦合。这种知识例如可以是不同组件(例如,另一个应用)中的 API 端点是否存在并且正在运行和响应。当应用程序被设计为以被动-主动的方式工作时,这是可以避免的,在这种方式下,它们只对事件消息/通知做出反应。

松耦合?还没有!

然而,在逻辑/语义层面上仍然存在微妙的耦合。如果我们不小心,这可能会导致更复杂的问题。

  • 使用者要求事件消息具有特定的模式。如果生产者删除了一些字段,它会影响消费者,因为他们可能会围绕这些字段构建一些逻辑。同样,如果字段的数据类型发生变化,也可能会影响消费者。因此,生产者需要一个预先商定的模式。
  • 由于生产者或消息代理/队列中的错误,事件可能会被重播或发布多次。这并不意味着事件发生了两次。消费者需要意识到这些小故障,并能够绕过它们。
  • 消费者还需要确定发布这些事件的是真实的生产者,并且这些事件在发布过程中没有被操纵。
  • 生产者和消费者都可能维护一个事件日志,其中存储了所有发布或消费的事件。如果组件利用事件源,这样的事件日志甚至可能是应用程序逻辑的基础。 Event sourcing 扩展了事件驱动架构,其中应用程序状态完全作为事件存储在事件日志中。该日志是事实的来源,任何进一步的更新也作为事件存储。日志本身是仅附加的,重放是恢复状态的一种方法。然后,重放事件的组件需要在表示同一数据实体中的状态变化的事件中适应历史模式变化。

通过移除同步 API 调用,我们实现了某种程度的解耦。但是对参与应用程序产生负面影响的依赖性并没有消失。

处理语义耦合

因为语义耦合是由信息交换产生的,因此需要在信息层面上解决。

让我们考虑下面的事件。

{
  "header":{
    "application-id":"CRM-application-id",
    "schema-url":"json-schema-url",
    "timestamp":1625507375542,
    "message-id":"9aeb0fdf-c01e-0131-0922-9eb54906e209",
    "event-descriptor":"customer.added"
  },
  "customerid":"cust-id",
  "firstname":"some firstname",
  "lastname":"some lastname"
}

此事件提供以下信息。

  1. 发布它的应用程序
  2. 消息的模式(指向相应 JSON-schema 的 URL 链接)
  3. 发布的时间戳以及全局唯一的消息 id。
  4. 事件描述符,说明事件是什么。在本例中,添加了一个新客户。事件描述符和应用程序 id 的组合必须是全局唯一的。
  5. 添加的客户数据的详细信息。

这个事件组合可以如下图所示。

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

事件消息撰写

那么这如何减少语义耦合导致的依赖性呢?

每个事件都包含一个提供几个关键信息的标题。

  • 模式 URI 指向该消息所遵循的特定模式(例如 JSON 模式)。任何消费者都有可能按照模式动态解析消息。这可能需要每条消息处理两次,首先读取头,根据模式选择正确的解析器,然后读取整个消息。但是好处是消费者可以按照模式解析消息。
  • 该架构有助于在重播事件日志中的旧事件时解决历史架构更改,该事件日志可能与当前事件日志具有不同的架构。
  • 全局唯一的消息 id 有助于识别无意的重放。重放的消息将具有与先前处理的消息相同的消息 id。因此,消费者可以是等幂的。
  • 事件描述符是事件的特定于域的名称,在该域中是唯一的。上面的例子使用点符号来分隔主语和动词(总是用过去时态)。

事件的其余部分是数据。一般来说,它应该是胖的,这样每条消息本身就尽可能完整。fat 事件携带的数据足以保证不会回调其原始应用程序。但是胖事件并不意味着将所有数据放在一个事件中。这可以通过让 id/URIs 指向其他相关的数据对象来实现。主要的想法是使它在上下文中完整。

一种特定的技术或一种序列化的选择能对它有所帮助吗?当然,例如,Avro 有助于检测模式变化。Confluent 提供的模式注册表完全支持它。但是依赖于特定的技术会将解决方案与该特定的技术联系起来。这样做可能会有一些好处,但我更倾向于尽可能保持技术独立。

云事件

云事件是一个符合上述事件组合模式的具体标准例子。

上述相同的事件可以按照下面的云事件规范来表达。

{
  "specversion": "1.0",
  "type": "customer.added", 
  "source": "CRM-application-id",
  "id": "9aeb0fdf-c01e-0131–0922–9eb54906e209",
  "time": "2021–07–05T20:13:39.4589254Z",
  "dataschema": "json-schema-url",
  "data": {
    "customerid":"cust-id",
    "firstname":"some firstname",
    "lastname":"some lastname"
  }
}

这个事件的变体携带相同的信息,但是在组成上有一些不同。例如,没有显式标头。我通常将大部分字段归类为标题字段,作为消息的一部分。数据或核心状态变化在“数据元素内。“ dataschema ”指的是这个“ data ”元素的 JSON 模式,而不是整个事件。相反,整个事件的规范由“ specversion ”提供,只是作为一个版本号,在本例中为 1.0。

云事件中的事件组成可以如下图所示。

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

“云事件”中的事件消息组成

事件的真实性

通过给每条消息附加一个签名的散列,将有可能验证每个事件的真实性。

{
 "header":{
 …
  "message-hash":{
   "alg": "some algorithm",
   "salt": "some salt",
   "signed-hash": "0xa3f20717a25…fcfc994cee1b"
  }
 },
 …
}

这样做的代价显然是每次处理消息时都需要对消息进行哈希和签名验证。因此,只有在消息真实性非常重要的情况下,才应该使用这种方法。

版本控制

就像 REST API 版本一样,事件也可以有版本。我认为事件也是 API,因为它们在消费者中引发反应。

在上面的例子中,事件的版本是隐式的。事件的模式包含版本变更。我的例子中的“ schema-url ”或者云事件中的“ dataschema ”和“ specversion ”的组合处理它。

但是在某些情况下,显式事件版本是必要的。一个简单的方法是将版本附加到事件描述符上。

"event-descriptor":"customer.added.v1"

或者在云事件中:

"type":"customer.added.v1"

需要注意的是,事件的新版本必须与旧版本具有相同的语义和含义。它应该指示完全相同的数据实体/主题的状态变化。如果不是,那就不是事件的新版本,而是新事件。

结论

任何技术或架构风格都可以被使用和误用。可以理解也可以误解或者只是部分理解。对于事件驱动的架构也是如此。要创建真正松耦合的应用程序和系统,关注事件、事件的组合、模式并接受它们将会改变的事实是至关重要的。

图式进化既是事实,也是必然的恶。一个独立于技术的解决方案将使一个持久的解决方案能够经受住组织中应用程序环境的变化和底层技术体系的变化。

为什么是自然的照片?我认为自然也是由事件驱动的。行动和反应无处不在,无时不刻不在发生。实际上,自然是事件驱动的生态系统的完美例子。

每个数据科学家都应该使用 PyCaret

原文:https://towardsdatascience.com/every-data-scientist-should-use-pycaret-45a1e8e984be?source=collection_archive---------14-----------------------

意见

这就是为什么…机器学习的一站式商店

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

帕布鲁·阿罗约在Unsplash【1】上拍摄的照片。

目录

  1. 介绍
  2. 导入库和读取数据
  3. 设置模型参数
  4. 比较机器学习算法
  5. 创建、解释和预测最终模型
  6. 摘要
  7. 参考

介绍

尽管过去的数据科学家不得不使用相当多的代码来测试、比较和评估机器学习算法,但最近出现了 Python 中的库,大大减少了这项工作。其中一个库是由 Moez Ali 开发的py caret【2】,这是一个只需要少量代码的开源库,最终允许您快速准备数据,在几分钟内部署您的最终模型。PyCaret 函数有几个固有的好处。这些好处包括易用性、效率和学习新的机器学习算法。除了这些更多的好处之外,所有 PyCaret 模型都遵循四个主要步骤,这些步骤是执行一个进程的简单方法,否则,如果没有这个库,可能会花费更多的时间。也就是说,我将在下面讨论这四个步骤及其各自的好处和优势。

导入库和读取数据

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

照片由 NASAUnsplash【3】上拍摄。

与大多数数据科学项目一样,您将导入各自的库并读入数据。当然,我们将使用 PyCaret 的主库,以及另一个流行的库。

# import librariesfrom pycaret.regression import *
import pandas as pd

在这段代码中,您只需导入 PyCaret 库和回归模块,以及用于读取数据的熊猫。就 Python 代码而言,这几行代码是掌握大部分数据科学过程的开始。

# read in your datadata = pd.read_csv(‘file location of your data on your computer.csv’)

您可以导入的其他模块包括分类、聚类、异常检测、自然语言处理和关联规则挖掘。正如你所看到的,这个库包含了大多数类型的数据科学主题和特定的机器学习算法。

在这个回归模块中,您可以比较以下算法:

Linear RegressionLasso RegressionRidge RegressionElastic NetOrthogonal Matching PursuitBayesian RidgeGradient Boosting RegressorExtreme Gradient BoostingRandom Forest RegressorDecision Tree RegressorCatBoost RegressorLight Gradient Boosting MachineExtra Trees RegressorAdaBoost RegressorK Neighbors RegressorLasso Least Angle RegressionHuber RegressorPassive Aggressive RegressorLeast Angle Regression

利益

导入这个模块的好处是有大量的选项,而不必担心一个接一个地单独导入每个算法,最终节省时间并删除不必要的代码。

设置模型参数

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

约书亚·阿拉贡在Unsplash【4】拍摄的照片。

现在我们知道了我们正在使用的算法类型,我们可以启动 PyCaret 的 setup 函数。该功能包括数据类型推断、清理和预处理数据、数据采样、训练-测试分割以及为再现性分配会话 ID 等任务。

  • 数据类型推断

设置功能可以允许您包括您的数据和目标,这是数据科学和机器学习算法的最基本的方面。数据类型的例子包括categoricalnumericlabel。运行设置后,只需按 enter 键即可检查和确认列/要素的数据类型。

  • 数据清洗和数据预处理

在此步骤中,将自动应用缺失值插补,以及分类编码。对于数值特征,平均值填充缺失值,而对于分类特征,缺失值填充该特征的模式。

—更多预处理包括序数编码、基数编码、修复不平衡、标准化、变换函数

—对于特征工程,有目标变换、特征交互组特征、宁滨数值特征和组合稀有水平函数

  • 数据采样

这个特性与致力于改进数据科学过程的库相比是非常独特的。如果样本大小超过 25,000,将构建一个线性模型来显示大小如何影响模型的性能。

  • 训练和测试分割

一个常见的函数,PyCaret 包括在其设置步骤。默认的拆分比例是 70:30。

  • 会话 ID

这个特性的另一个词或短语是随机种子,或者有时是随机状态。它被包括在内,以便如果正在使用不同的环境,或者您将来正在从事这个项目,您可以重现您的发现。

# setup your regression parameters regression = setup(data = data, 
 target = 'what you are trying to predict’,
 session_id = 200, 
 )

如您所见,上面的代码很简单,您已经完成了几乎一半的数据科学建模工作,实际上只有两部分代码。

利益

  • 主要好处是您可以看到数据采样大小对常见指标(如准确性、AUC、召回率、精确度和 F1)的影响
  • 无需转换即可自动推断数据类型(有时)
  • 数字和分类特征的缺失值插补

比较机器学习算法

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

比较模型。作者截图[5]。

这个特性是 PyCaret 真正闪光的地方,它允许你比较几种机器学习算法,包括一些你可能还没有听说过的算法。有些算法在第一部分中已经提到,您可以对这些算法进行比较——并排比较准确度和误差指标,突出显示哪些算法是最好的。以下是其中的一些指标:

分类比较

  • 准确性、AUC、召回率、精确度、F1 以及 Kappa 和 MCC

回归比较

  • MAE,MSE,RMSE,R2,RMSLE,MAPE

compare_models()功能的一些重要特征是n_selectsortincludeexlucde

  • n_select :允许您根据精确度之类的指标返回最佳型号
  • 排序:允许你根据你的度量进行排序,比如 MAE
  • include :在您的比较中仅使用某些算法—如果您知道某些算法耗时较长且不太有用,您可以使用以下参数
  • 排除:从您的分析中移除不必要的或更长的训练模型
# compare modelscompare_models(n_select = 3, sort = 'MAE')

以上是如何将这些参数应用于比较模型特性的示例代码块。

利益

  • 减少分离或删除你所知道的某些算法的时间(从以前的经验中或从对你的数据的采样中)——比如说,比较 20 个算法可能需要几个小时,这取决于包括哪些算法
  • 便于比较的排序( PyCaret 应自动突出显示哪个型号最好)

创建、解释和预测最终模型

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

举例 SHAP 解释情节。作者截图[6]。

在 PyCaret 过程的最后一部分,你可以在看到几个模型的比较后创建一个最好的模型(准确性,训练时间——这最终取决于你 ***best***)。

创建模型功能的一些关键参数如下:

  • 折叠
  • 交叉验证
  • 学习率
  • 最大深度
  • 等等。

模型或机器学习名称被简化,例如,决策树是‘dt’,所以在这种情况下,让我们假设我们选择它来创建、预测和解释我们的最终模型。

在解释您的模型时,您可以查看无数的函数,包括:

  • 汇总图
  • 相关图
  • 观察级别的原因图

这些情节是从广受欢迎的 SHAP 图书馆(,在我看来,这是最好的功能重要解释库

# create a model
dectrees = create_model('dt')# interpreting model
interpret_model(dectrees)# predict on test set
predictions = predict_model(dectrees)

利益

  • 您可以轻松选择想要创建的模型
  • 您可以轻松访问 SHAP 函数和相应的图

只需几行代码,您就可以选择想要使用的模型,解释特性和结果,最后根据一些测试数据进行预测。您甚至可以使用 PyCaret 和 AWS 部署模型。与 AutoML 和 MLFlow 的集成也很有用。

摘要

如您所见,PyCaret 的每个主要步骤都有各自的好处。虽然这篇文章出于解释的目的很长。我使用的代码非常简单,用于比较几个模型和预测测试数据。

总而言之,我们看了几个步骤,包括:

  • 导入库和读取数据
  • 设置模型参数
  • 比较机器学习算法
  • 创建、解释和预测最终模型

这些相同的步骤通过下面的代码表达出来:

# import libraries
from pycaret.regression import *
import pandas as pd# read in your data
spotify = pd.read_csv(‘file location of your data on your computer.csv’)# setup your regression parameters
regression = setup(data = data, 
 target = 'what you are trying to predict’,
 session_id = 200, 
 )# compare models
compare_models()# create a model
dectrees = create_model('dt')# predict on test set
predictions = predict_model(dectrees)# interpreting model
interpret_model(dectrees)

其他一些有用的特性(,因为我还没有涵盖 PyCaret 的所有方面),包括但不限于消除多重共线性、主要胜任分析、忽略低方差和消除异常值

我希望您喜欢这篇关于每个人都应该知道的库的文章,PyCaret。现在,我将问你一些问题。你以前用过这个图书馆吗——为什么或为什么不用?你听说过吗?您是否喜欢更加人工化的数据科学过程,或者更具体地说,没有更像一站式商店的图书馆?使用这个强大的数据科学和机器学习库,你还体验到了哪些好处?谢谢你的阅读,我很感激!

请随时查看我的个人资料和其他文章, Matt Przybyla也可以在 LinkedIn 上联系我。

我不隶属于上述任何公司。

参考

[1]巴勃罗·阿罗约在 Unsplash 拍摄的照片,(2021)

[2] Moez AliPyCaret 主页,(2021)

[3]照片由 NASAUnsplash(2015)拍摄

[4]Joshua Aragon 在 Unsplash 上拍摄的照片,(2019)

[5] M.Przybyla,比较模型截图,(2021 年)

[6] M.Przybyla,示例 SHAP 解读情节截图,(2021)

你可以(应该)使用的每一个熊猫函数来操纵时间序列

原文:https://towardsdatascience.com/every-pandas-function-you-can-should-use-to-manipulate-time-series-711cb0c5c749?source=collection_archive---------2-----------------------

从基本的时间序列度量到窗口函数

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

照片由 乔丹本顿 像素

时间序列预测项目简介

最近,在 Kaggle 上发起了 Optiver Realized 波动率预测竞赛。顾名思义,这是一个时间序列预测的挑战。

我想参加,但事实证明我在时间序列方面的知识甚至不足以参加如此大规模的比赛。所以,我接受了这一点,认为这是我需要开始认真关注 ML 这个大领域的‘刺激’。

作为第一步,我想学习和教授你可以用来操作时间序列数据的每一个熊猫函数。这些函数是处理您在野外遇到的任何时间序列数据的基本要求。

我已经为这个话题准备了相当酷和有趣的文章,今天,你将会读到即将到来的第一个味道。尽情享受吧!

https://ibexorigin.medium.com/membership

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

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

目录

这篇文章的笔记本可以在 Kaggle 上这里阅读。

  1. 基本数据和时间函数
  2. 时间序列中缺失数据的插补/插值
  3. 基本时间序列计算和指标
  4. 重采样—上采样和下采样
  5. 比较多个时间序列的增长
  6. 窗口功能
  7. 摘要

1.熊猫的基本日期和时间功能

1.1 导入时间序列数据

当使用pd.read_csv函数导入时间序列时,有两个参数你应该一直使用- parse_datesindex_col:

由于出版政策,数据集已被匿名化。如果你感兴趣,数据集的真实版本保存在笔记本中。请注意,这种匿名不会妨碍您的体验。

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

parse_dates将类似日期的字符串转换为 DateTime 对象,index_col将传递的列设置为索引。该操作是对熊猫进行所有时间序列操作的基础。

当您在导入时不知道哪一列包含日期时,您可以在之后使用pd.to_datetime功能进行日期转换:

现在,检查日期时间格式字符串:

>>> data2.head()

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

它的格式是" %Y-%m-%d "(日期时间格式字符串的完整列表可以在这里找到)。把这个传给pd.to_datetime:

pd.to_datetime传递一个格式字符串可以显著加快大型数据集的转换速度。将errors设置为“强制”,将无效日期标记为NaT(不是日期,即-缺失)。

转换后,将 DateTime 列设置为索引(这是最佳时间序列分析的严格要求):

>>> data2.set_index("date", inplace=True)

1.2 熊猫时间戳

Pandas 中的基本日期数据结构是时间戳:

您可以使用正确的格式制作更精细的时间戳,或者更好的是,使用datetime模块:

完整时间戳具有如下有用的属性:

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

1.3 日期序列(时间戳)

pandas 中的一个DateTime列/索引被表示为一系列TimeStamp对象。

pd.date_range返回一个特殊的DateTimeIndex对象,它是TimeStamps的集合,具有给定范围内的自定义频率:

在指定日期范围(从 2010 年 10 月 10 日到 2020 年的同一天)后,我们告诉熊猫每月生成TimeStampsfreq='M':

>>> index[0]Timestamp('2010-10-31 00:00:00', freq='M')

创建日期范围的另一种方法是传递开始日期,告诉您需要多少个周期,并指定频率:

因为我们将频率设置为年,所以带有 5 个周期的date_range返回 5 年/时间戳对象。可以传递给freq频率别名列表很大,所以我在这里只提到最重要的几个:

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

也可以通过自定义频率,如“1 小时 30 分”、“5D”、“2W”等。再次,检查这个链接的完整信息。

1.4 切片

如果索引是一个DateTimeIndex,切片时间序列数据会非常直观。你可以使用部分切片:

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

如果日期时间足够精确,甚至可以达到小时、分钟或秒的级别。

请注意,熊猫切片日期在封闭的时间间隔。例如,使用“2010”:“2013”返回所有 4 年的行—它不像整数切片那样排除期末。

这个日期切片逻辑适用于其他操作,如在切片后选择特定的列:

2.缺失数据插补或插值

无论数据集的类型如何,缺失数据都是普遍存在的。这一部分是关于在时间序列的背景下对其进行估算。

你也可能在时间序列行话中听到它被称为缺失数据的插值

除了基本的均值、中值和众数插补之外,一些最常用的技术包括:

  1. 正向填充
  2. 反向填充
  3. 使用pd.interpolate进行中间插补

我们还将讨论基于模型的插补,如 KNN 插补。此外,我们将探索比较技术效率的可视化方法,并选择最适合底层分布的方法。

2.1 均值、中值和众数插补

让我们从基础开始。我们将在第一个匿名数据集中随机选择数据点,并将其转换为 NaN:

我们还将创建一个函数,绘制插补执行前后的原始分布:

我们将从 Sklearn 的SimpleImputer开始尝试技巧:

让我们针对我们刚刚创建的 3 个估算特征绘制原始feature_2分布图:

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

很难说哪条线最像黑线,但我会选绿色。

2.2 向前和向后填充

考虑这个小分布:

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

我们将使用向前和向后填充,并将它们作为单独的列分配回数据帧:

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

一旦检查了上面的输出,这些方法是如何工作的就应该很明显了。

现在,让我们对印度的空气质量数据集执行这些方法:

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

尽管非常基本,向前和向后填充实际上对气候和股票数据非常有效,因为附近数据点之间的差异很小。

2.3 使用pd.interpolate

Pandas 在pd.interpolate功能中提供了一整套其他统计插补技术。它的method参数接受技术名称作为字符串。

最流行的是“线性”和“最近”,但是你可以从函数的文档中看到完整的列表。在这里,我们将只讨论这两个。

考虑这个小分布:

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

我们再次应用这些方法,并将它们的结果赋回来:

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

很整洁,是吧?线性方法将任意两个非缺失点之间的距离视为线性间隔,并找到连接它们的直线(如np.linspace)。“Nearest”方法应该可以从它的名字和上面的输出中理解。

2.4 基于模型的 KNN 插补

我们将看到的最后一种方法是 K-最近邻算法。我不会详细说明算法是如何工作的,而只是展示如何在 Sklearn 中使用它。如果你想知道细节,我有一个单独的文章在这里

KNN 最重要的参数是k——邻居的数量。我们将把该技术应用于具有几个值k的第一个数据集,并像我们在前面章节中所做的那样找到最佳的一个:

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

3.基本时间序列计算

Pandas 提供了计算最常见的时间序列计算的基本函数。这些被称为转移,滞后,以及所谓的百分比变化。

3.1 换档和滞后

时间序列中的一个常见操作是将所有数据点向后或向前移动一个或多个周期,以比较过去和未来的值。你可以使用熊猫的shift功能来完成这些操作。让我们看看如何将数据点 1 和 2 移至未来:

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

向前移动使您能够将当前数据点与一个或多个期间之前记录的数据点进行比较。

你也可以向后移动。这种操作也称为“滞后”:

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

向后移动使我们能够看到当前数据点和一个或多个周期后的数据点之间的差异。

换档或滞后后的常见操作是找出差异并绘制出来:

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

由于这种操作非常常见,Pandas 提供了diff函数来计算基于周期的差异:

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

3.2 百分比变化

可以从时间序列数据中得出的另一个常见指标是每日百分比变化:

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

要计算每天的百分比变化,向前移动一个周期,将原始分布除以移动后的分布,然后减去 1。结果值以前一天的比例给出。

因为这是一个常见的操作,Pandas 用pct_change函数来实现它:

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

4.重采样

通常,您可能希望增加或减少时间序列的粒度,以生成新的见解。这些操作被称为重采样或改变时间序列的频率,我们将在本节中讨论与它们相关的 Pandas 函数。

4.1 用asfreq改变频率

第二个数据集没有固定的日期频率,即每个日期之间的周期差异不相同:

data2.head()

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

让我们通过给它一个日历日频率(每日)来解决这个问题:

data2.asfreq("D").head(7)

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

我们只是把约会的频率变得更细了。结果,添加了新的日期,导致更多的值丢失。现在,您可以使用我们之前讨论过的任何技术对它们进行插值。

你可以在这里看到的内置频率别名列表。更有趣的场景是使用自定义频率:

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

# 10 month frequency
data2.asfreq("10M", method="bfill").head(7)

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

还有一个reindex函数,操作类似,支持额外的缺失值填充逻辑。我们不会在这里讨论它,因为我们会考虑更好的选择。

4.2 使用resample进行下采样并聚合

在时间序列行话中,降低DateTime的频率被称为下采样。例如,将频率从每小时更改为每天,从每天更改为每周,等等。

我们看到了如何使用asfreq进行下采样。一个更强大的选择是resample,它的行为类似于pd.groupby。就像groupby根据分类值对数据分组一样,resample根据日期频率对数据分组。

让我们按月末频率对第一个数据集进行缩减采样:

asfreq不同,使用重采样只返回重采样状态的数据。要查看每个组,我们需要使用某种类型的函数,类似于我们使用groupby的方式。

由于下采样减少了数据点的数量,我们需要一个聚合函数,如 mean、median 或 mode:

data1.resample("M").mean().tail()

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

还有一些函数返回一个组的第一条或最后一条记录:

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

也可以使用agg使用多个聚合功能:

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

4.3 使用resample进行上采样和插值

缩减采样的反面是使DateTime更加精细。这称为上采样,包括将频率从每天一次改为每小时一次、每小时一次改为每秒一次等操作。

向上采样时,您会引入新的日期,导致更多的值丢失。这意味着你需要使用某种类型的插补:

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

4.4 绘制重采样数据

如果不绘制结果,重采样不会产生太多效果。

在大多数情况下,进行缩减采样时,您会看到新的趋势和模式。这是因为下采样降低了粒度,从而消除了噪声:

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

绘制上采样分布只会引入更多噪声,所以我们在这里不做。

5.比较多个时间序列的增长

比较两个或多个随时间变化的数值是很常见的。例如,我们可能希望看到第一个数据集中要素 1 和 2 的增长率。但问题是:

第二分布具有高得多的值。将它们绘制在一起可能会将 feature_1 挤压成一条直线。换句话说,这两种分布具有不同的规模。

为了解决这个问题,统计学家使用标准化。最常见的变化是选择第一个记录的值,然后将其余的样本除以该值。这显示了每个记录与第一个记录相比是如何变化的。

这里有一个例子:

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

现在,上面输出中的每一行都显示了与第一行相比的百分比增长。

现在,让我们绘制它们来比较增长率:

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

从 2011 年到 2017 年,这两项功能都实现了超过 300%的增长。您甚至可以从其他数据集绘制时间序列:

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

如您所见,数据集 1 中的要素比第二个数据集中的另一个要素具有更高的增长率。

6.窗口功能

还有另一种类型的函数可以帮助您以新颖的方式分析时间序列数据。这些被称为窗口函数,它们帮助您聚合自定义数量的行,称为“窗口”

例如,我可以在我的中型订户数据上创建一个 30 天的窗口,以查看过去 30 天中任何一天的订户总数。或者,餐馆老板可以创建一个每周窗口来查看上周的平均销售额。例子不胜枚举,因为您可以在数据上创建任意大小的窗口。

让我们更详细地探讨这些。

6.1 滚动窗口功能

滚动窗口功能将具有相同的长度。当它们滑过数据时,它们的覆盖范围(行数不变)。以下是一个包含 5 个时间段的数据滑动窗口示例:

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

下面是我们如何在 pandas 中创建滚动窗口:

>>> data1.rolling(window=5)Rolling [window=5,center=False,axis=0]

就像resample一样,它处于只读状态——为了使用每个窗口,我们应该链接某种类型的函数。例如,让我们为过去 5 个周期创建一个累计和:

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

显然,前 4 排是 NaNs。任何其他行将包含前 4 行和当前行的总和。

请注意窗口参数。如果传递一个整数,窗口大小将由该行数决定。如果您传递一个频率别名,如月、年、5 小时或 7 周,则窗口大小将是包含传递频率的单个单位的任意行数。换句话说,5 周期窗口可能与 5 天频率窗口大小不同。

例如,让我们绘制特性 2 的 90 和 360 天移动平均线,并绘制它们:

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

就像groupbyresample一样,您可以使用agg函数为每个窗口计算多个指标。

6.2 扩展窗口功能

另一种类型的窗口函数处理扩展窗口。每个新窗口将包含截至当前日期的所有记录:

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

扩展窗口对于计算“运行”指标非常有用,例如,运行总和、平均值、最小值和最大值、运行回报率等。

下面,您将看到如何计算累积和。累积和实际上是一个窗口大小为 1:

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

expanding函数有一个min_periods参数,决定初始窗口大小。

现在,让我们看看如何绘制跑步最小值和最大值:

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

摘要

我想祝贺是应该的!

现在,您知道了可以用来操作时间序列数据的每一个 Pandas 函数。这是一篇非常长的帖子,但绝对值得,因为现在你可以处理任何扔给你的时间序列数据。

这篇文章主要关注数据操作。该系列的下一篇文章将是关于更深入的时间序列分析,你可以在时间序列上创建的每个单独的图的类似文章,以及关于预测的专门文章。敬请期待!

您可能也会感兴趣…

每个人都可以很容易地学习编程——如果他们懂英语的话

原文:https://towardsdatascience.com/everyone-can-learn-programming-easily-if-they-know-english-c46f96247dde?source=collection_archive---------24-----------------------

说外语的人在学习编程时有一些障碍,我们能做些什么来帮助他们

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

安妮·斯普拉特在 Unsplash 上的照片

随着技术颠覆一个又一个行业,世界各地的人们都在学习计算机编程。第一个万维网的愿景是在互联网上分享知识和建立全球信任。在谷歌和其他应用程序的帮助下,我们都可以通过互联网学习如何编写程序。

虽然互联网有助于创建一个协议和平台,以方便共享知识,但大多数编程语言、文档资料和在线教学都是英语。

这使得非英语母语者学习计算机编程和在世界范围内分享他们的知识成为一个障碍。

Imagine if the most popular programming language you are using right now to create your website, HTML, is not English but Chinese. When you are about to inspect a beautiful website by inspecting its source code online — it is all in Kanji. Instead of having a <title> tag, it will have <稱號> tag. Instead of having <article>, it will have <文章>. You still feel motivated and want to tinker with the web. Therefore, you look up material online. However, you realized that the answer to the most popular programming community’s questions is also in Chinese. You feel frustrated and drop learning HTML and learn Kanji first.

理论上,计算机不关心我们用什么语言编码,只要那些语言能编译成机器能理解的 0 和 1 的字节码。if语句、while语句和for语句帮助人类轻松地设计计算机指令,以便编译器可以将这些指令翻译成字节码。

但是我们中只有一些人知道所有这些命令——那些说英语的人。95%的世界人口的母语不是英语。世界上的开源学习课程材料都是英文的。大多数流行的编程语言都使用英语中的例子。甚至搜索流行的编程社区 Stack Overflow 也需要英文。虽然你可以使用谷歌翻译来翻译每个句子,但翻译质量可能会误导或混淆。这给非英语母语者获取编程知识和向技术社区表达他们的意图造成了巨大的障碍。

这篇文章想分享的是非英语母语的人学习计算机编程有两个障碍。之后,我将提到三个解决方案,作为一名软件工程师,我们可以创建一个更好的社区,邀请非英语母语者轻松导航并拓宽世界各地人们的数字素养和工作机会。

文档大部分是英文的

不管是好是坏,我们必须承认英语是科技领域的主导语言。大多数流行的编程语言及其文档都是英文的。尽管在一些广泛传播的文档中有几种翻译,但翻译深奥的技术术语通常会让学习者更加困惑。

一项研究表明,与一般阅读综合的交流显著影响一个人掌握新知识的能力——他们必须用一半的脑力来解释一个英语句子,另一半的脑力来学习编程语言的新术语[4]。

非英语母语者希望将他们的编程思想作为文档来表达,也很难描述它们。例如,Redis 的创始人 Salvatore Sanfilippo 谈到了他在用英语表达思想方面的挣扎。他们将要进行一次 TCP/IP 攻击,但是他们不能用英语写一篇关于它的帖子,因为他已经投入了 50%的精力来理解他写的句子[2]。

记得追到了儿时的好友,台湾本地一所大学的计算机专业。他说,每个需要学习编程的人都需要有一个中级英语,因为跟上不是用母语教授的课程可能是一个挑战。

他们很难读写代码

我们鼓励开发人员编写可读和可维护的代码。

然而,这段可读代码要求用英语创建代码标识符、变量、函数和类名。大多数编程语言的关键词,比如ifelsewhile都是基于英文的。你可以说,说技术英语的人在学习大多数编程语言时并不比说英语的人更困难,因为大多数语法都来自数学。你可以说大多数关键词- ifelsewhiletype def、【阶级】或“类型”并不完全是它们在英语中的意思。这些“变量”在编程中都有特定的含义。然而,其他非英语母语的人很难理解while、class 或instances的意思,因为这些关键词在他们的母语中可能有更重要的意义。例如,while在葡萄牙语中的含义比《法典》中使用的含义更多[4]。

除了标准的编程语言关键字,非英语母语的人很难读懂缩写的函数名——像 C 语言中的getCh()strstr()这样的东西很难理解。

有些语言不遵守主谓关系。日语的语法是主语-宾语-动词。因此,他们很难写出 getter 和 setter,因为语法成分与日语不同。此外,许多行为驱动的测试场景模仿完整的英语句子来测试应用程序中的特定行为。例如,如果你想用 Scala 编写一个单元测试,一个Matcher类可以让你构建测试用例,就像用英语写一个句子一样。

在编写代码方面,我发现大多数说外语的人在用英语命名事物方面做得很好,但是他们很难调用其函数的行为。一些函数可能有一个没有意义的名字——在英语中没有意义的东西。一些函数名甚至可能是误导性的——这是很危险的——因为用母语命名不同于用英语命名。

既然第一个万维网和所有的协议都是用字母和英文单词写的,那是不是意味着每个想学编码的人都需要先学英语?

可能吧。学习英语会帮助你更容易理解专业术语。然而,也有一些方法可以帮助其他人更轻松地理解您的库或源代码。

使用完整的变量名,避免任何来自你的文化的俚语

我们需要编写尽可能文化不可知论的文档。

命名函数不应缩写。使用像numListgetCh这样的缩写词会让非英语母语的人感到困惑。因为这种语言不通过其语法表达任何其他行为,所以开发人员需要理解函数的名称来了解过程的意图。在不知道函数名的情况下,你只能猜测函数输出会是什么。因此,最好用一个完整的句子来描述你的函数名,比如getCharacter或者listOfNumber

一些编程语言,如 Clojure 或 Haskell,有选择退出的命名变量,并将它们命名为fg,因为它的函数定义已经描述了它的作用。

Clojure API 中的一些变量命名约定有特定的函数式编程技术术语和数学术语函数名,如reifytransducer,以避免给客户带来任何误解。

函数式编程语言的一个强大工具是它们的语法就像一个数学公式。不用看过程的名字就可以知道函数在做什么。例如,如果我们想在一个元素的列表上做一些组合。我们可以这样写:def f[A:Monoid](list:List[A]): A,它告诉我们“如果我把 A 的一个列表作为输入,函数会返回 A”当然,不得不说f是很笼统的,不适合对一个列表求和的用例。然而,函数定义本身和一个简单的注释可以帮助非英语母语的人了解对f的期望以及他们如何实现它们。

例子多,文字少

文档应该展示比文本更多的例子。在节目文档中加入任何美国名人的笑话或电视节目,以使阅读文档变得更容易管理,这对观众没有帮助。

大多数观众不知道美国名人,也不知道《T4》中的任何笑话。因此,它将有助于解释如何处理客户使用该库时出现的问题——解释错误消息的含义以及它们最初出现的原因——此外,通过示例代码为客户解决遇到的问题提供指导。

例如,大多数图书馆都有一本“入门”指南,上面有一个使用图书馆的简单例子。一开始解释设计库和所有其他特定功能背后的哲学会让客户更加困惑。

如果你解释一些难以理解的关键词,一本解释这些词的意思的词典可以帮助你的读者在阅读上下文时理解那些不熟悉的术语。例如,具体化应该有一个内联字典说明它在数学上下文中的含义。在这种情况下,reify 是一个计算机编程术语,表示运行时类型的抽象概念。

你也可以给出这个概念的外部链接,这样你的读者就可以通过点击外部链接来搜索这些术语。

在技术指导材料中使用更多的插图和可视化

一项研究表明,确保学习者将他们的信息储存在长期记忆中的最简单的方法是将课程材料与某种形式的可视化结合起来[1]。单词只保留在我们的短时记忆中,我们只能保留 7 比特的信息。一幅图像帮助我们将信息立即转移到长期记忆中。

可视化可以很快超越语言。例如,如果没有任何可视化和一步一步的演示,理解 Java 中的递归是如何工作的会很有挑战性。通过适当的绘图,我们可以说明函数的每个堆栈在每次递归调用时的行为,以及当过程返回时每个堆栈帧的行为,这可以帮助学习者可视化和跟踪递归函数。

插图和可视化图像有助于图书馆作者阐明他们的设计理念。例如,解释 React DOM 的定义和用途在图像中比在文本中更容易可视化。

结论

对于我们这些精通英语的人来说,编程很难。对于那些完全不懂英语的人来说,编程更具挑战性。

对于非英语母语的人来说,编程更难的一个原因是,学习编程的所有相关材料都不是他们的母语。

当编写或阅读源代码时,他们很难构建一个可读的代码,因为他们不能像英语母语的编码人员那样有表现力地命名函数。

然而,我们可以通过在我们的代码、文档和社区中创建一种更具包容性的语言,为非英语母语者学习编程创造更顺畅的体验。此外,有更多的图像和视频来说明一个编码概念可以快速帮助其他人了解这个想法。

了解这些问题有助于我们编写更多包含语言的文档,并在与非英语母语者分享知识时更有耐心和同情心。

假设我们想让编程成为表达想法和思想的通用工具。在这种情况下,我们必须关心我们在常规博客帖子中提到的内容,以及我们的文档、函数和代码,以便让每个人都能普遍使用。换句话说,我们的计算机必须学习通用语言:移情。

参考

[1]管理员,管理员。研究证实了视觉在电子学习中吸引观众的力量,2014 年 7 月 9 日,www . shiftlearning . com/blog/bid/350326/studies-Confirm-the Power of visual-ELearning。

[2]基斯蒂亚科夫,阿尔特姆。编程语言,2017 年 6 月 28 日,temochka . com/blog/posts/2017/06/28/the-Language-of-Programming . html。

[3]麦卡洛克,格雷琴。"编码是为每个人准备的——只要你会说英语."Wired,Conde Nast,2019 年 8 月 4 日上午 10 点,[www . wired . com/story/coding-is-for-every one as-long-as-you-speak-English/#:~:text = In % 20 addition % 20 to % 20 these % 20 four,System%20(孟加拉语%2C%20Gujarati%2C%20and。](http://www.wired.com/story/coding-is-for-everyoneas-long-as-you-speak-english/#:~:text=In%20addition%20to%20these%20four,System%20(Bengali%2C%20Gujarati%2C%20and.)

[4]郭敬明。非英语母语者学习计算机编程:障碍、愿望和设计机会。检索自https://pg . ucsd . edu/publications/non-native-English-speakers-learning-programming _ CHI-2018 . pdf

感谢阅读!如果你喜欢这篇文章,你可以关注我在媒体上的更多文章。我期待着与你通信。万事如意。

【https://edward-huang.com】最初发表于https://edward-huang.com/ideas/life-lesson/2021/02/23/everyone-can-learn-programming-easily-if-they-know-english/

关于 Python 字典数据结构的一切:初学者指南

原文:https://towardsdatascience.com/everything-about-python-dictionary-data-structure-beginners-guide-fca53357ac81?source=collection_archive---------12-----------------------

在本文中,我们将重点介绍 Python 字典数据结构的完整演示。

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

UnsplashAltumCode 拍摄的照片

目录

  • 什么是 Python 字典?
  • 如何创建 Python 字典
  • 如何从 Python 字典中访问值
  • 如何向 Python 字典添加元素
  • 如何从 Python 字典中移除元素
  • 如何更改 Python 字典中的元素
  • 如何迭代 Python 字典
  • Python 中的嵌套字典

什么是 Python 字典?

Python 字典是用于存储对象组的数据结构。它由键-值对的映射组成,其中每个键都与一个值相关联。它可以包含相同或不同数据类型的数据,是无序的,并且是可变的。

如何创建 Python 字典

空字典

要在 Python 中初始化一个空字典,我们可以简单地运行下面的代码并打印其内容:

您应该得到:

{}

带值的字典

当我们想要创建一个包含一些想要填充的值的字典时,我们将这些值作为一系列逗号分隔的键-值对来添加。例如,假设我们想要创建一个以国家为键、以人口为值的字典:

您应该得到:

{'China': 1439323776, 'India': 1380004385, 'USA': 331002651, 'Indonesia': 273523615, 'Pakistan': 220892340, 'Brazil': 212559417}

如何从 Python 字典中访问值

为了访问存储在 Python 字典中的值,我们应该使用与值相关联的键。例如,假设我们想从上面的国家字典中得到美国的人口。我们知道人口值的关键字是“USA ”,我们用它来访问人口值:

您应该得到:

331002651

注意:与 Python list 不同,您不能使用索引从字典中访问值。访问这些值的唯一方法是搜索字典中存在的关键字。

如何向 Python 字典添加元素

在本节中,我们将继续使用 countries 字典,并讨论向 Python 字典添加元素的方法。

添加单个元素

假设我们想要将另一个国家及其人口添加到我们的国家字典中。例如,我们要添加日本的人口 126,476,461。通过将它作为一个额外的键值对添加到字典中,我们可以很容易地做到这一点:

您应该得到:

{'China': 1439323776, 'India': 1380004385, 'USA': 331002651, 'Indonesia': 273523615, 'Pakistan': 220892340, 'Brazil': 212559417, 'Japan': 126476461}

您可以看到,我们已经成功地向字典中添加了一个新元素。

添加多个元素

现在,如果我们想要添加多个国家呢?假设我们现在想在字典中再添加两个国家及其人口。例如,俄罗斯和墨西哥的人口分别为 145,934,462 和 128,932,753。

相同的语法会起作用吗?不完全是。所以我们需要这个**。update()**Python 字典数据结构的方法。它允许向字典中添加多个逗号分隔的键值对。

逻辑是从新的键-值对创建一个新字典( new_countries ),然后将其合并到 countries 字典中:

您应该得到:

{'China': 1439323776, 'India': 1380004385, 'USA': 331002651, 'Indonesia': 273523615, 'Pakistan': 220892340, 'Brazil': 212559417, 'Japan': 126476461, 'Russia': 145934462, 'Mexico': 128932753}

您可以看到,我们已经成功地向词典中添加了新元素。

如何从 Python 字典中移除元素

在本节中,我们继续使用 countries 字典,并讨论从 Python 字典中移除元素的方法。

移除单个元素

假设我们需要做一些修改,从字典中删除一个针对中国及其人口的键-值对。我们可以使用轻松移除它。pop() 方法:

您应该得到:

{'India': 1380004385, 'USA': 331002651, 'Indonesia': 273523615, 'Pakistan': 220892340, 'Brazil': 212559417, 'Japan': 126476461, 'Russia': 145934462, 'Mexico': 128932753}

您可以看到,我们已经成功地从字典中删除了一个元素。

移除多个元素

下一步是探索如何从 Python 字典中移除多个元素。假设我们想从国家字典中删除日本和墨西哥及其各自的人口。

我们知道**。pop()** 方法允许在每个函数调用中移除单个元素,这给了我们一个想法,如果我们迭代一个包含我们想要移除的键的列表,我们就可以成功地调用**。pop()** 对于每个条目:

您应该得到:

{'India': 1380004385, 'USA': 331002651, 'Indonesia': 273523615, 'Pakistan': 220892340, 'Brazil': 212559417, 'Russia': 145934462}

您可以看到,我们已经成功地从字典中删除了元素。

如何更改 Python 字典中的元素

另一个功能是改变 Python 字典中的元素。您将在以下章节中看到,更改元素的功能与添加元素的功能相同。

这是为什么呢?这是因为当我们试图向字典中添加新元素时,Python 会查找我们试图添加的特定键,如果字典中存在该键,它会覆盖数据;但是如果键不存在,它会向字典中添加一个新的键-值对。

更改单个元素

假设我们想在国家字典中将巴西的人口值更新为 212560000:

您应该得到:

{'India': 1380004385, 'USA': 331002651, 'Indonesia': 273523615, 'Pakistan': 220892340, 'Brazil': 212560000, 'Russia': 145934462}

更改多个元素

现在,假设我们想在 countries 字典中将印度尼西亚和巴基斯坦人口的值分别更新为 273530000 和 220900000。

逻辑是从新的键值对创建一个新的字典( update_countries ),然后更新 countries 字典中现有的键值对:

您应该得到:

{'India': 1380004385, 'USA': 331002651, 'Indonesia': 273530000, 'Pakistan': 220900000, 'Brazil': 212560000, 'Russia': 145934462}

如何迭代 Python 字典

在这一节中,我们将关注 Python 字典的不同迭代方式。

迭代字典键

假设我们想要迭代 countries 字典中的键,并在单独的行上打印每个键(在我们的例子中是每个国家)。

我们将简单地使用一个一起作为**循环。**keys()【字典法:

您应该得到:

India
USA
Indonesia
Pakistan
Brazil
Russia

迭代字典值

另一个用例可能是我们想要找到存储在 countries 字典中的所有国家的人口总数。

正如你所想象的,我们将需要再次使用作为循环,现在我们也将使用**。**字典法取值():

您应该得到:

2563931498

迭代字典条目

Python 字典的一项是它的键值对。这允许我们一起对键和值进行迭代。

我们如何使用它?假设您想从 countries 字典中找到人口最多的国家。迭代字典的每一项允许我们同时跟踪键和值:

您应该得到:

India 1380004385

Python 中的嵌套字典

嵌套字典是由其他字典组成的字典。

你可以用类似于创建字典的方式来创建嵌套字典。

例如,假设我们想要创建一个包含每个国家首都及其人口信息的字典:

您应该得到:

{'China': {'capital': 'Beijing', 'population': 1439323776}, 'India': {'capital': 'New Delhi', 'population': 1380004385}, 'USA': {'capital': 'Washington, D.C.', 'population': 331002651}, 'Indonesia': {'capital': 'Jakarta', 'population': 273523615}, 'Pakistan': {'capital': 'Islamabad', 'population': 220892340}, 'Brazil': {'capital': 'Brasilia', 'population': 212559417}}

结论

这篇文章是关于 Python 字典及其方法的介绍性演练,学习这些方法很重要,因为它们被用于编程机器学习的许多领域。

如果你有任何问题或者对编辑有任何建议,请在下面留下你的评论。

原载于 2021 年 11 月 21 日【https://pyshark.com】

关于 Python 集合数据结构的一切:初学者指南

原文:https://towardsdatascience.com/everything-about-python-set-data-structure-beginners-guide-python-programming-45ea91e0ca72?source=collection_archive---------40-----------------------

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

杰斯·贝利在 Unsplash 上的照片

在本文中,我们将重点介绍一个完整的 Python 集合数据结构。

目录

  • 什么是 Python 集合
  • 如何创建 Python 集
  • 如何向 Python 集添加元素
  • 如何从 Python 集合中移除元素
  • 如何迭代 Python 集
  • 结论

什么是 Python 集合

Python 集合是一种数据结构,用于存储唯一元素的无序集合。集合本身是可变的,但由不可变数据类型的元素组成(如整数、浮点、布尔、字符串、元组等)。集合不能由可变数据类型的元素组成(比如 listdictionary 等等)。

如何创建 Python 集

空集

要在 Python 中初始化一个空集,我们可以简单地运行下面的代码并打印其内容:

您应该得到:

set()

用整数元素设置

当我们想要创建一个包含元素的集合时,我们可以用花括号创建一个逗号分隔的元素序列:

您应该得到:

{1, 2, 3, 4, 5}

用字符串元素设置

另一个例子是一组字符串数据类型的元素:

您应该得到:

{'Car', 'Apple', 'Hello'}

用布尔元素设置

当处理布尔数据类型的元素时,集合中唯一元素的属性非常重要。假设我们有一些想要存储的元素,这是 5 个真/假元素。注意,在元素中,只有两个唯一的:True 和 False。如果我们将这些元素存储在一个集合中,它将自动进行重复数据删除:

您应该得到:

{False, True}

请注意重复元素是如何从集合中删除的。

具有混合类型元素的集合

另一种选择是让集合包含不可变数据类型的不同元素。例如,它可以是字符串、整数、布尔值和浮点数:

您应该得到:

{True, 2, 3.01, 'Hello'}

请注意,该集合基于元素值是无序的。然而,我发现有趣的是,它是根据数据类型名称的第一个字符排序的。看这个顺序:{ b oolean, i nteger, f loat, s tring},有一个字母的模式。

如何向 Python 集添加元素

在这一节中,我们将讨论向 Python 集合中添加元素的方法。

在本节中,让我们使用下面创建的 Python 集合:

添加单个元素

假设我们想在上面的集合中添加另一个整数(8)。我们将需要使用**。Python 集合的 add()** 方法,并将新元素传递给它:

您应该得到:

{8, 1, 5, 6}

注意:您只能添加集合中不存在的元素。如果您尝试添加一个已经存在的元素,比如 integer 5,您将简单地得到相同的集合,因为该元素已经存在于其中。

添加多个元素

现在让我们来考虑一个例子,当我们想在上面的集合中添加多个新元素时,比如整数 3 和 9。

相同的语法会起作用吗?不完全是。我们将需要使用**。update()** 方法,并将新元素作为集合或列表传递给它。

方法一:

方法二:

这两种方法将产生相同的输出:

{1, 3, 5, 6, 8, 9}

如何从 Python 集合中移除元素

在这一节中,我们将讨论从 Python 集合中移除元素的方法。

首先,让我们创建一个将要使用的集合:

移除单个元素

假设我们想要删除这个集合中的一个元素,例如整数 8。我们可以很容易地做到这一点使用任何一个**。丢弃()。Python 集合的 remove()** 方法。

现在这两者的区别是什么?

。remove() 方法从集合中删除一个元素,如果该元素存在于集合中,如果不存在,那么它将引发一个错误(KeyError)。

另一方面,。discard() 方法做完全相同的事情,但是不会引发错误,并且保持集合不变。

方法一:

方法二:

在我们的例子中,这两种方法将产生相同的输出:

{1, 3, 5, 6, 9}

移除多个元素

如果我们想删除多个元素,比如整数 3 和 5,我们可以使用类似的语法。唯一的问题是**。移除()。Python 集合的 discard()** 方法每次调用只接受一个参数。

如果我们创建一个要删除的元素列表,并遍历它,从一个集合中一个接一个地删除它们,这两种方法都可以工作。

方法一:

方法二:

在我们的例子中,这两种方法将产生相同的输出:

{1, 6, 9}

移除所有元素

如果我们想从任何 Python 集合中移除所有元素并得到一个空集,我们可以简单地调用**。clear()** 将删除所有元素的方法:

你应该得到一个空集:

set()

如何迭代 Python 集

在这一节中,我们将讨论如何迭代一个 Python 集合。

首先,让我们创建一个我们将使用的样品组:

列表字典不同,在迭代一个 Python 集合时没有太多选项。最主要的是简单地使用 for 循环:

您应该得到:

1 3 5 6 8 9

结论

这篇文章是关于 Python set 及其方法的介绍性演练,学习它们是很重要的,因为它们在编程机器学习的许多领域中被使用。

如果你有任何问题或者对编辑有任何建议,请在下面留下你的评论。

原载于 2021 年 12 月 6 日 https://pyshark.comhttps://pyshark.com/everything-about-python-set-data-structure/

产品人员需要知道的关于变形金刚的一切(第三部分:伯特)

原文:https://towardsdatascience.com/everything-product-people-need-to-know-about-transformers-part-3-bert-a1227cead488?source=collection_archive---------13-----------------------

确定变压器供电产品范围所需的一切

这是面向产品人员的变形金刚系列的第 3 部分。点击此处查看第一部分。本文依赖于前几篇文章中介绍的概念和信息。如果你对变形金刚和 GPT 不熟悉,建议从第 1 部分开始。

如果你正在读这篇文章,你正在设计、管理或投资技术产品。你也可能只是一个聪明的工程师或数据科学家,他们发现这些文章对于理解新的研究非常有用。那么,你真的需要了解变压器模型吗?我们的变形金刚模型有什么好的吗?

号码

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

这家伙明白了

要打造尖端产品,了解变压器模型。谷歌的产品人员非常了解变形金刚,带领他们改进他们核心业务的产品线:搜索。哼唱查找歌曲—由 BERT 提供支持。特色片段——由 BERT 提供。视频中的关键时刻——由 BERT 提供。这些功能您可能已经很熟悉了:

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

熟悉的基于变形金刚模型的谷歌特性

要理解变压器模型,就要理解伯特和 GPT。每个都有一个独特的架构,为特定的训练任务进行了优化。虽然我现在可以告诉您每个型号最适合哪些应用,但解释设计选择和型号之间的差异将使您能够识别尚未尝试的新应用。

以下部分将介绍 BERT,这需要了解生成性预培训(GPT)。在第 2 部分中,我深入解释了 GPT 模型架构,我建议在从这里继续之前先阅读那篇文章。警告:如果你还没有阅读第 2 部分,下面的部分会让你困惑,这是你的错。在解释了 BERT 架构之后,我将把这个模型放在我的关于 transformer 模型的更大系列中,以便能够完全识别和评估潜在的应用。

伯特解释道

在 OpenAI 推出 GPT 四个月后,谷歌发布了《变形金刚:双向编码器表示》。BERT 利用了预先训练的变压器的能力,同时解决了 GPT 架构带来的一些限制。通过这样做,BERT 极大地扩展了变形金刚可以有效处理的任务集。

我们将从总结开始,只总结伯特创新的 GPT 的那些组成部分:

1.GPT 的设计方法是从变压器(T-ED)中去掉编码器组件,只保留解码器(T-D)。

2.解码器有时被称为生成器,其功能相当于语言模型,这意味着它被优化来预测句子中的下一个单词。

3.在这个模型中,注意力的作用是单向的,这意味着该模型在预测下一个单词时只能查看前面的单词,而不能查看将跟随神秘标记的单词。

GPT 是第一个建立在 transformer 架构上的基于微调的语言模型,这意味着它创建了一个使用下一个单词预测训练的可预训练的 transformer。基于下一个单词预测语言建模产生了一个主要的限制:只有先前的上下文可以用来理解意思。伯特的作者指出:

[单向注意力的局限性]对于句子级任务来说是次优的,并且在将基于微调的方法应用于标记级任务(如问答)时可能是非常有害的,在标记级任务中,从两个方向结合上下文是至关重要的。

本质上,如果需要理解一个句子中的*,那么仅仅依靠句子的第一部分将会太受限制。这里有一个例子可以说明这个问题:“今天,我去超市买了一些面包和花生酱。”自动更正有两个潜在的候选者:*, 。两者在拼写上同样接近于“strome ”,当只考虑到这一点的句子时,两者都是可信的。建立在 GPT 上的自动更正工具将依赖于文档上下文,直到“strome”作出决定。如果批判性语境直接跟着,我们就不能做得更好吗?**

Transformer 模型需要双向关注,以便将来自两个方向的上下文合并到模型决策中。变压器-解码器(T-D)适合语言建模,因此预先训练,只有单向注意。双向注意力的预训练需要利用转换器-编码器(T-E),这是双向注意力在 T-ED 中发生的组件。

因此,BERT 架构基于仅保留 T-ED 的编码器组件。与 GPT 的 T-D 相比,伯特是一个 T-E。训练一个 T-E 不如训练一个 T-D 简单,我们会看到。尽管如此,现在是回顾我们在过去三篇文章中看到的不同变压器架构的好时机。简而言之,三个占主导地位的 NLP 模型是:

  1. 变形金刚:T 型
  2. GPT: T-D
  3. 伯特:T-E

而其他型号的名称有 RoBERTa、DistilBert、T5、DialoGPT 等。所有这些模型都具有上述三种架构之一。这就是你需要了解的最高层次的变压器架构。

训练伯特

请特别注意这里描述的语言建模任务,因为它们直接决定了这些模型的潜在应用。

T-E 花了最长的时间才被发表(几乎比 T-ED 晚了一年),因为它最不容易被训练。这个问题源于给 T-E 提供单语任务的全文。如果 T-E 被输入了完整的输入句子,你能用什么训练任务来挑战它?如果一开始就给它输入了正确的句子,你怎么能让它决定“流”和“存储”中的哪一个构成正确的句子呢?为了解决这个问题,BERT 发布了两个不同的训练任务。

伯特首先被训练成一个蒙面语言模型(MLM)。MLM 需要递给伯特一句话,比如“我坐在椅子上[戴着面具]”,并要求伯特预测这个带面具的单词。下一个单词预测语言建模可以被认为是 MLM 的一个特例,其中句子中的最后一个单词总是被屏蔽的单词。因此,MLM 可以被认为是一种比训练 GPT 的任务更一般化的语言模型。

在 MLM 之后,伯特接受了一项名为“下一句话预测”的任务训练。在这个任务中,向 BERT 传递由指示符分隔的句子对。伯特被训练来预测第二句话是否应该跟在第一句话后面,或者实际上是不相关的。一个例子是这样的:

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

训练前的下一句预测任务

伯特和你一样,应该预测“低概率”。

这两项任务构成了使 BERT 容易适应新任务的预训练。

BERT 的应用

理解 BERT 训练任务对于确定其应用是至关重要的。它是这样工作的:如果你能表明你希望你的产品为客户执行的任务可以被框定为这些培训任务中的一个,那么你的任务就是一个可行的应用。让我们看看谷歌的特色片段,并以谷歌产品经理(PM)鲁本为例。

鲁本是一名在谷歌搜索工作的项目经理,他对伯特很熟悉。鲁本注意到,许多用户在谷歌搜索栏中输入完整的问题,然后浏览建议的结果来找到他们的答案。他已经确定了一个客户需求:用户有他们需要回答的问题,但他们希望保持他们现有的查询 Google 搜索栏的行为。

Reuben 密切跟踪一个用户的会话,并观察到以下行为:他的用户在谷歌搜索中键入以下问题:“美国有多少数据科学家。”用户然后点击第一个网站,看到下面的句子:“根据 Glassdoor 的数据,2019 年至 2020 年,美国数据科学家职位的增长持平,约为 6500 个。”用户复制这句话,并粘贴到他的谷歌文档。

考虑到他目前的产品,Reuben 注意到 Google 的解决方案检索了可能包含用户问题答案的文档集。然后,用户需要筛选这些文档来找到答案。用户以这样一句话开始:“美国有多少数据科学家。”然后选择句子:“根据 Glassdoor 的数据,2019 年至 2020 年,美国数据科学家职位的增长持平,约为 6500 个。”鲁本意识到这项任务可以转化为下一句预测的伯特训练任务。他可以使用 BERT 基于句子将“跟随”查询句子的概率来对检索到的语料库中的句子进行排序。

实际上,他希望他的 BERT 输出看起来像这样:

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

用于微调的 BERT 问答任务

将一个领域特定的任务转化为一个 transformer 培训任务本质上是对您的模型进行微调的过程。为了开发有特色的片段,Reuben 希望对 BERT 进行微调,将它的行为从查找最有可能跟随查询的句子转变为查找最有可能回答用户问题的句子。鲁本可以通过在一组更直接符合这种模式的句子对上进一步训练伯特来做到这一点。

现在都在一起

同样的过程可以用来理解变压器模型的一般应用。让我们快速回顾一下我们所涉及的三种模型架构的培训任务及其关注机制:

  1. T-ED。任务:翻译。
  2. 任务:下一个单词的预测。
  3. 任务:1。MLM。2.下一句预测。

在句子中间进行拼写检查:用掩码替换拼错的单词:MLM。将非正式英语转换成正式英语:翻译。建议如何回复短信:下一个单词预测。等等。等等。

确定应用与型号选择相关,但并不相同。正如谷歌研究人员在 T5 型号(T-ED)的发布中指出的:

我们建议将所有 NLP 任务重新构建为统一的文本到文本格式,其中输入和输出始终是文本字符串…我们甚至可以将 T5 应用于回归任务,通过训练它来预测数字的字符串表示而不是数字本身。

正如作者指出的,在某种程度上,所有的任务都可以用文本到文本的格式来组织。也许 T-ED 可以用于所有的任务,而且任何任务都应该适合 T-ED 模型。虽然这在数学上有意义,但在商业上却常常没有意义。你可以把写博士论文框定为一项下一个单词的预测任务,进入 GPT:“这是我关于人工智能的博士论文”,然后等着 GPT 完成剩下的工作。不幸的是,他们最终可能会上交垃圾,让他们的项目失败,然后质疑他们的未来。

那么,如何才能知道一个应用程序对于一个 transformer 模型是否真的可行呢?根据经验,应用程序任务越直接转化为训练任务,模型的性能就越好。如上所述,每个下一句预测任务都可以被公式化为一个翻译任务,但是 T-E 会以更低的成本产生更好的结果。

总之,请记住,这些模型通过利用在来自训练的大量文本语料库中检测到的模式来确定新的基于文本的任务中最有可能的输出。模型性能受限于训练语料库中包含的内容。变形金刚模型不会有所发现或者搞清楚事情。它们自动执行基于文本的任务,这些任务通过包含在数百万现有文档中的模式变得可预测。尽管如此,他们承诺彻底改革我们所知的人工智能。

参考

[1]纳亚克,潘杜。“比以往任何时候都更好地理解搜索。”谷歌,谷歌,2019 年 10 月 25 日,blog . Google/products/search/search-language-understanding-Bert/。

[2] Jacob Devlin、张明蔚、Kenton Lee 和 Kristina Toutanova。Bert:用于语言理解的深度双向转换器的预训练。arXiv 预印本 arXiv:1810.04805,2018。

[3]“用 T5 探索迁移学习:文本到文本的迁移转换器。”谷歌人工智能博客,2020 年 2 月 24 日,AI . Google Blog . com/2020/02/exploring-transfer-learning-with-t5 . html

作者创作的所有图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值