在 Colab 中打开  在 GitHub 上查看 Notebook

使用指标评估您的模型#

在我们端到端系列的这一部分中,我们将使用 metrics 模块评估我们数据集的注释结果。要查看之前的步骤,您可以参考诸如创建数据集添加响应和建议训练您的模型等教程。请随意查看实用指南页面以获取更深入的信息。

在您的数据集被注释者注释后,强烈建议评估注释结果。在 metrics 模块中,我们将评估指标分为三类:一致性指标、建议指标和响应指标。一致性指标是您可以用来评估注释者之间一致性的指标。通常在文献中被称为“注释者间一致性”,此指标有不同的研究人员开发的各种实现,其中一些著名的例子是 Krippendorff's Alpha、Cohen's Kappa、Fleiss' Kappa、Scott's Pi 和 Bennet, Albert and Goldstein's S。通过这些指标,您可以了解注释的可靠性以及注释者之间的一致程度。

另一方面,建议指标是您可以用来评估注释者的响应与给他们的建议相比的指标。这将展示每个注释者的响应与黄金标准相比有多好。此外,我们有机会统一单个记录的不同注释者给出的响应。这样,可以评估统一的响应或响应。以类似的方式,响应指标是您可以用来评估给注释者的建议与他们给出的响应相比的指标。这将使我们深入了解建议有多好,它们是否有帮助,以及是否需要改进模型。

workflow

目录#

  1. 拉取数据集

    1. 来自 Argilla

    2. 来自 HuggingFace Hub

  2. 统一响应

  3. 注释指标

    1. 一致性指标

    2. 模型指标

  4. 结论

运行 Argilla#

对于本教程,您将需要运行 Argilla 服务器。部署和运行 Argilla 有两个主要选项

在 Hugging Face Spaces 上部署 Argilla: 如果您想使用外部笔记本(例如,Google Colab)运行教程,并且您在 Hugging Face 上有一个帐户,您只需点击几下即可在 Spaces 上部署 Argilla

deploy on spaces

有关配置部署的详细信息,请查看官方 Hugging Face Hub 指南

使用 Argilla 的快速入门 Docker 镜像启动 Argilla:如果您想在本地机器上运行 Argilla,这是推荐的选项。请注意,此选项仅允许您在本地运行教程,而不能与外部笔记本服务一起运行。

有关部署选项的更多信息,请查看文档的部署部分。

提示

本教程是 Jupyter Notebook。有两种选项可以运行它

  • 使用此页面顶部的“在 Colab 中打开”按钮。此选项允许您直接在 Google Colab 上运行 notebook。不要忘记将运行时类型更改为 GPU 以加快模型训练和推理速度。

  • 通过单击页面顶部的“查看源代码”链接下载 .ipynb 文件。此选项允许您下载 notebook 并在本地机器或您选择的 Jupyter notebook 工具上运行它。

首先,让我们安装我们的依赖项并导入必要的库

[ ]:
!pip install argilla
!pip install datasets transformers
[13]:
import argilla as rg
from argilla._constants import DEFAULT_API_KEY
from argilla.client.feedback.metrics.annotator_metrics import ModelMetric

为了运行此 notebook,我们将需要一些凭据来从 Argilla🤗 Hub 推送和加载数据集,让我们在以下单元格中设置它们

[ ]:
# Argilla credentials
api_url = "https://#:6900"  # "https://<YOUR-HF-SPACE>.hf.space"
api_key = DEFAULT_API_KEY  # admin.apikey
# Huggingface credentials
hf_token = "hf_..."

登录到 Argilla

[ ]:
rg.init(api_url=api_url, api_key=api_key)

启用遥测#

我们从您与我们的教程的互动中获得有价值的见解。为了改进我们自己,为您提供最合适的内容,使用以下代码行将帮助我们了解本教程是否有效地为您服务。虽然这是完全匿名的,但如果您愿意,可以选择跳过此步骤。有关更多信息,请查看遥测页面。

[ ]:
try:
    from argilla.utils.telemetry import tutorial_running
    tutorial_running()
except ImportError:
    print("Telemetry module is introduced in Argilla 1.20.0 and not found in the current installation. Skipping telemetry.")

拉取数据集#

为了使用指标,我们可以拉取一个数据集,该数据集包含每个记录的多个注释。我们可以从 HuggingFace Hub 执行此操作。让我们看看如何拉取它。

来自 HuggingFace Hub#

我们也可以从 HuggingFace Hub 拉取数据集。类似地,我们可以使用 from_huggingface 方法来拉取数据集。

[ ]:
dataset = rg.FeedbackDataset.from_huggingface("argilla/go_emotions_raw", split="train[:1000]")

注意

从 HuggingFace Hub 拉取的数据集是 FeedbackDataset 的实例,而从 Argilla 拉取的数据集是 RemoteFeedbackDataset 的实例。两者之间的区别在于,前者是本地的,对其所做的更改保留在本地。另一方面,后者是远程的,对其所做的更改直接反映在 Argilla 服务器上的数据集上,这可以使您的过程更快。

让我们简要检查一下我们的数据集的外观。它是一个数据集,包含带有字段 text 的数据项。对于每个记录,我们有多个注释,这些注释用至少一种情感标记文本。让我们看一个文本示例和给定的响应。在此示例中,记录已由 3 位注释者注释,其中一位注释者用一种情感标记了文本,而另外两位注释者用两种情感标记了文本。

[140]:
print("text:", dataset[5].fields["text"])
print("responses:", [dataset[5].responses[i].values["label"].value for i in range(len(dataset[5].responses))])
text:  And not all children's hospitals need the same stuff, so call and ask what they need. But I like your tip. You're correct.
responses: [['neutral'], ['approval', 'desire'], ['approval', 'love']]

来自 Argilla#

我们可以使用 from_argilla 方法从 Argilla 拉取数据集。

统一响应#

当您的项目中的每个记录有多个注释时,最佳实践是统一响应,以便每个记录只有一个响应。这是优选的,因为它使数据集更一致且更易于使用。让我们看看如何使用 Argilla 统一响应。首先,我们创建一个策略来统一响应。我们使用 majority 投票策略,这意味着我们将保留大多数注释者建议的响应。

[146]:
strategy = rg.MultiLabelQuestionStrategy("majority")
[ ]:
dataset.compute_unified_responses(
    question=dataset.question_by_name("label"),
    strategy=strategy,
)

我们可以查看一个记录,以了解响应是如何统一的。在我们的例子中,响应已统一为 approval,因为它是响应中的多数票。

[148]:
dataset.records[5].unified_responses
[148]:
{'label': [UnifiedValueSchema(value=['approval'], strategy=<RatingQuestionStrategy.MAJORITY: 'majority'>)]}

注释指标#

Argilla 提供各种注释指标来评估注释者的表现。让我们看看如何使用其中的每一个。

一致性指标#

评估的第一步是将注释者给出的响应相互对比,这通常被称为 注释者间一致性。这是查看注释的可靠性以及注释者之间的一致程度的关键步骤。Argilla 目前仅提供 Krippendorff's alpha 作为一致性指标。让我们看看如何使用 Argilla 评估注释者之间的一致性。

要计算 alpha,我们只需要调用 compute_agreement_metrics 方法,其中 alpha 是参数。我们还需要在数据集中指定问题名称以计算指标。请注意,一致性指标适用于除 TextQuestion 之外的所有问题类型。

[3]:
dataset.compute_agreement_metrics("alpha", question_name="label")
[3]:
AgreementMetricResult(metric_name='alpha', count=3468, result=0.2459926458269277)

我们得到的结果表明,我们拥有的数据集的注释者之间的一致性为 0.2459,这是一个较低的一致性。对于 Kripendorff's alpha,该值在 [0,1] 范围内,通常按以下方式解释:alpha >= 0.8 表示可靠的注释,alpha >= 0.667 允许做出初步结论,而较低的值表明注释不可靠。这表明我们可能需要重新审视我们的注释过程,并改进任务设计或注释者培训。

模型指标#

对于计算模型指标,我们将假设注释者给出的响应是黄金标准,我们与之比较。向我们的数据集添加建议的主要优点是简化和缩短注释任务。通过计算模型指标,我们将能够看到建议是否以我们想要的方式工作,以及我们的模型运行推理是否符合我们的期望。在性能较低的情况下,我们可以考虑通过更新和微调模型以生成更好的建议来改进建议。这样,我们也可以提高注释者的表现。

我们在当前数据集中的问题类型是 MultiLabelQuestion。通过使用 allowed_metrics 方法,我们可以看到下面的指标,这些指标是此问题类型的可用指标。

[ ]:
metric = ModelMetric(dataset=dataset, question_name="label")
metric.allowed_metrics
['accuracy', 'f1-score', 'precision', 'recall', 'confusion-matrix']

使用 Argilla,我们可以使用 compute_responses_metrics 方法轻松计算响应指标。在此示例中,我们将计算 MultiLabelQuestion 问题类型的所有允许指标。

[ ]:
model_metrics = dataset.compute_model_metrics(question_name="label", metric_names=metric.allowed_metrics)
[16]:
model_metrics["00000000-0000-0000-0000-000000000004"]
[16]:
[ModelMetricResult(metric_name='accuracy', count=182, result=0.5714285714285714),
 ModelMetricResult(metric_name='f1-score', count=182, result=0.428750352375672),
 ModelMetricResult(metric_name='precision', count=182, result=0.4427905213343358),
 ModelMetricResult(metric_name='recall', count=182, result=0.5377066798941799),
 ModelMetricResult(metric_name='confusion-matrix', count=182, result={'admiration':                             suggestions_admiration_true  \
 responses_admiration_true                           174
 responses_admiration_false                            0

                             suggestions_admiration_false
 responses_admiration_true                              5
 responses_admiration_false                             3  , 'amusement':                            suggestions_amusement_true  \
 responses_amusement_true                          176
 responses_amusement_false                           1

                            suggestions_amusement_false
 responses_amusement_true                             3
 responses_amusement_false                            2  })]

统一响应的模型指标#

我们已经计算了给定的指标,用于将模型性能与每个注释者单独进行比较,并获得了该指标的各自结果。但是,我们有时可能希望集体计算模型对注释者的性能,其中我们将建议与注释者的统一响应进行比较。如上所述,Argilla 为我们提供了根据不同策略统一注释者响应的机会。我们可以首先统一响应,如所示,然后计算统一响应的指标。

为了实现这一点,我们只需要将 strategy 参数提供给上述方法。当此参数设置为首选策略时,将首先统一响应,然后将这些统一响应与建议进行比较。让我们使用 majority 策略。

[ ]:
model_metrics_unified = dataset.compute_model_metrics(question_name="label", metric_names=["accuracy", "precision", "recall", "f1-score"], strategy="majority")
[20]:
model_metrics_unified
[20]:
[ModelMetricResult(metric_name='accuracy', count=1000, result=0.812),
 ModelMetricResult(metric_name='precision', count=1000, result=0.7693494302078528),
 ModelMetricResult(metric_name='recall', count=1000, result=0.7744636775213872),
 ModelMetricResult(metric_name='f1-score', count=1000, result=0.7578965673231839)]

结论#

在本教程中,我们已经了解了如何使用 metrics 模块评估我们数据集的注释结果。我们首先统一了响应,以便对注释有一个更全面的了解。然后,我们计算了一致性指标,以了解我们的注释者彼此之间的一致程度。之后,我们计算了建议指标,以了解每个注释者的响应与黄金标准(在本例中为建议)相比有多好。类似地,我们计算了响应指标,以了解建议与注释者的响应相比有多好。

对于建议和响应指标,我们都计算了每个注释者和统一响应的指标。如果您觉得注释不令人满意,您可以通过更改项目的结构来迭代注释过程。您可以参考实用指南来改进您的结构,或者查看高级教程以了解有关 Argilla 高级用例的更多信息。