使用模型时,最重要的步骤之一是 评估 它们。虽然使用精心挑选的示例可以为我们提供一些关于其性能的直觉,但这可能还不够。这时,指标 就发挥作用了。
如果我们在互联网上查找指标的定义,一个非常简单的定义是:“指标是告诉您关于所研究过程重要信息的数字”。因此,它们可以帮助我们评估模型的性能或深入了解我们的数据集。由于有很多概念需要处理(召回率、精确率、首字母大写...),而且它们本身并不容易理解,因此最好 付诸实践 。
此视频总结了 Rubrix 指标 的使用及其提供的一些功能
Rubrix 和指标:天作之合
借助其数据探索模式和记录的模型预测,使用 Rubrix 可以非常轻松地快速直观地了解您的数据和模型。如果您想更进一步,Rubrix 还提供指标,让您可以衡量对数据集的深入见解,并使您能够以更精细的方式评估 模型的性能 。
它们的主要目标是简化构建稳健的训练数据和模型的过程,超越单一数字指标。Rubrix 指标的灵感来自许多开创性工作,例如 Explainaboard。
我们的实验
我们认为,为了使 指标 更容易被 Rubrix 用户接受,我们可以为他们提供 一个实际示例 ,分析一个带注释的数据集和一个或两个合适的模型。如果您想跟随此实验并重现我们的分析,您可以在 此 GitHub 仓库 中找到所有必要的步骤。
数据集
我们决定使用 2018 n2c2 挑战赛 第二赛道的数据集,该项目旨在探索临床 NLP 数据和任务(更多信息请点击 此处 )。第二赛道侧重于与 药物不良反应和药物 相关的医疗记录或报告,并以命名实体识别 (NER) 任务的形式呈现,实体如下:DOSAGE、DRUG、DURATION、FORM、FREQUENCY、ROUTE、STRENGTH、REASON、ADE。
点击 此处 阅读更多关于数据集和挑战赛的信息。由于它不是一个开源数据集,用户必须在 DBMI 数据门户 上创建一个帐户并请求访问权限才能使用它。
模型
我们选择了 Andrey Kormilitzin 的 Med7 模型,您可以在他的 Hugging Face 页面 上找到它。这个 基于 spaCy 的 模型部分地在上述数据集上进行了训练,旨在“稳健地用于各种下游”任务,“使用自由文本医疗记录”。因此,它仅关注数据集中存在的 9 个实体中的 7 个,忽略了 REASON 和 ADE。Andrey 发布了此模型的两个版本:transformer 版本和 large 版本。除非另有说明,否则我们将使用前者。
对于我们的实验,我们仅使用了 nc2c 数据集的 12 个文档,使用 spaCy 将文本拆分为句子,并将这些句子及其 注释 和 模型预测 记录到 Rubrix 中。这产生了大约 ~1600 条记录。
import rubrix as rb# Check the GitHub repo to see how we created the 'records'rb.log(records, name="med7_trf")
那么,指标呢?
首先,我们将分析直接与数据集相关的指标,然后我们将看到与模型相关的指标。
数据集指标
词符首字母大写
首先,我们将分析 词符首字母大写 。这是数据集中每个词符的首字母大写信息。
from rubrix.metrics.token_classification import token_capitalnesstoken_capitalness(name="med7_trf").visualize()
最常见的结果是 LOWER (词符中的所有字符均为小写),其次是 FIRST (词符中的第一个字符为大写字母)和 UPPER (所有字符均为大写),最后是 MIDDLE (第一个字符为小写,且至少有一个其他字符为大写)。FIRST 和 UPPER 的相对突出在医疗记录中很典型。它们包含大量章节、标题、短语、专业术语和缩写,例如 IV、OP、TID 或 QHS 等。
词符频率
此指标计算每个词符的频率。在这里,结果既令人好奇又合乎逻辑
from rubrix.metrics.token_classification import token_frequencytoken_frequency(name="med7_trf").visualize()
对于此数据集,到目前为止最频繁的词符是 星号符号 ,其次是 换行符 。在更详细地检查数据集后,我们注意到星号部分用于匿名化敏感数据(这是医疗记录中非常常见的做法)。此外,段落之间用许多换行符分隔 - 因此得到这样的结果。
词符长度
此指标根据每个词符的 字符 数来衡量词符长度分布。了解以上结果后,最常见的长度是 1 也就不足为奇了。考虑到医疗记录中使用的缩写数量,我们也预计短词符在分布中会异常突出。
from rubrix.metrics.token_classification import token_lengthtoken_length(name="med7_trf").visualize()
模型指标
现在我们已经看到了严格与数据集相关的指标,让我们看一下指标,但这次我们将考虑模型的 预测 。
实体一致性
此指标用于量化特定提及以特定标签预测的一致性程度。
from rubrix.metrics.token_classification import entity_consistencyentity_consistency(name="med7_trf").visualize()
在我们的例子中,只有提及 Injection 被预测为两个不同的标签:3 次标签为 ROUTE ,3 次标签为 FORM 。这是合理的,因为 Injection 可以指药物的应用方式 (FORM),也可以指其给药途径 (ROUTE)。
实体标签
这是我们数据集中预测实体标签的分布。DRUG 无疑是最常见的预测,而 DURATION 的提及似乎不太频繁。
from rubrix.metrics.token_classification import entity_labelsentity_labels(name="med7_trf").visualize()
实体首字母大写
此指标显示预测实体提及的首字母大写信息,类似于 词符首字母大写 指标。由于我们已经看到 DRUG 是预测最多的标签,并且大多数 DRUG 提及是药物名称(Vancomycin、Oxycodone、Dilatin...),因此 FIRST 是预测实体最常见的首字母大写形式是有道理的。
from rubrix.metrics.token_classification import entity_capitalnessentity_capitalness(name="med7_trf").visualize()
提及长度
虽然 词符长度 计算以字符数衡量的词符长度,但 提及长度 计算以词符数衡量的实体提及长度。同样,由于大多数预测实体是通常用一个词命名的药物,我们预计提及长度 1 将占主导地位。
from rubrix.metrics.token_classification import mention_lengthmention_length(name="med7_trf").visualize()
模型性能
现在,让我们看看如何衡量模型的性能,并以更精细的方式将其与另一个模型进行比较。
平均 F1 值
衡量多类 NER 模型性能的常用方法是使用其 平均 F1 值 。让我们使用此指标来比较我们模型的两个版本(transformer 与 large)。
from rubrix.metrics.token_classification import f1f1(name="med7_trf").visualize()f1(name="med7_lg").visualize()
看起来 transformer 模型在各个方面都优于 large 模型。在微平均和宏平均方面,它都具有更好的召回率和精确率。
每个标签的 F1 值
然而,如果我们仔细查看每个标签的 F1 值,我们会发现 large 模型 在 ROUTE 和 FREQUENCY 实体方面实际上表现略好。因此,如果您主要对检测医疗文档中的途径或频率感兴趣,那么 large 模型将是更好的选择。
此外,值得注意的是,在 DURATION 实体方面,两个模型的性能之间存在近 0.2 个点的巨大差异。
模型 \ 标签 | DRUG | FORM | ROUTE | FREQUENCY | DOSAGE | STRENGTH | DURATION |
---|---|---|---|---|---|---|---|
TRANSFORMERS | 0.95 | 0.94 | 0.93 | 0.75 | 0.91 | 0.96 | 0.86 |
LARGE | 0.92 | 0.93 | 0.96 | 0.77 | 0.85 | 0.94 | 0.67 |
检测数据偏移
Rubrix 指标还可以帮助您找到 数据偏移 。根据 Georgio Sarantitis (2020) 的说法,“当数据分布发生变化时,就会发生数据偏移”。
让我们通过简单地 将约 25% 的医疗记录转换为小写 来模拟数据偏移。对模型性能的影响是最小的,但仍然可以注意到(宏平均和微平均 f1 值中的点数小于 0.01)。但是,查看 实体首字母大写 分布,如果您将其与 上面 的原始分布进行比较,偏移变得非常明显。
这将帮助您及早检测到数据偏移并相应地调整模型,从而在 性能下降 变得显著之前采取措施。
总结
如您所见, Rubrix 指标 是一个很好的工具,可以更深入地了解您的 数据分布 和 模型性能 。我们能够快速可视化数据集的各种可测量量,并快速更详细地比较两个模型的性能。借助 Rubrix 指标,数据偏移也很容易检测到,从而帮助您在监控模型时保持领先地位。
但它不仅仅如此:此工具不仅有助于评估模型和分析数据,还可以提供关于特定数据集的 语言信息 ,或显示其他特征。在这种情况下, 临床 NLP 数据集 可能非常适合,因为它们包含特殊的特征和语言,这些特征和语言始终很有趣,例如 技术词汇 、 缩写 或与其词符相关的特殊性(例如,它们的词符长度)。
如果您是 Rubrix 的新手,请查看我们的 GitHub 仓库 并给它一个 ⭐ 以保持更新。有关 Rubrix 指标的更多信息,请查看我们的 摘要指南 和 指标模块 的 API 参考。