计算序列标记任务的分类指标

Posted

技术标签:

【中文标题】计算序列标记任务的分类指标【英文标题】:Computing classification metrics for sequence labelling task 【发布时间】:2020-07-26 16:49:29 【问题描述】:

我打算为句子分类任务计算准确率/精度/召回/F1 度量。我之前已经为整个文本分类计算了它,这很容易,但是当我们在句子级别而不是文本/句子级别执行句子分类时,我感到很困惑。请注意,一个文本可能包含多个句子...这是一个示例:

假设我们有以下文本,在 [] 中带有预测标签:

Seq2seq 网络是学习序列的好方法。 [0] 它们在生成长序列方面表现相当不错。 [1] 这些网络用于下游任务,例如 NMT 和文本摘要 [0]。呜呜呜[2]

所以预测是 [0, 1, 0, 2],假设上面句子的黄金标签是:[1, 1, 0, 0]。

那么这个精度等于correct / total = (1 + 1) / 4 = 0.5吗?其他指标,例如 Precision、Recall 和 F1 呢?有任何想法吗?

【问题讨论】:

【参考方案1】:

在多类分类的情况下,您可以使用metrics.classification_report()获得Precision、Recall和F1分数。您还可以获得每个班级的指标以及他们的'macro', 'micro', 'weighted' and 'samples' average

from sklearn import metrics

# True values
y_true = [1,1,0,0]
# Predicted values
y_pred = [0,1,0,2]

# Print the confusion matrix
print(metrics.confusion_matrix(y_true, y_pred))

# Print the precision and recall, among other metrics
print(metrics.classification_report(y_true, y_pred))

【讨论】:

【参考方案2】:

提问者正在寻求有关衡量模型性能的方法的建议,而不是使用特定语言/库的编程解决方案。因此,以下是一些需要思考的问题和建议的方法。

在尝试回答这个问题之前,让我们问自己以下问题。它们将帮助我们了解前进的最佳方法。

    分类模型是否是词袋类型的模型,其中序列无关紧要,而仅是给定句子中的词。如果是这样,则只能根据构建的目的来衡量模型。这意味着,正确分类的句子总数除以句子总数是准确度的一个很好的衡量标准。 如果分类模型是基于图的模型,例如隐马尔可夫模型或条件随机场,那么我们必须问自己的问题是,在对当前句子进行分类之前是否考虑多个句子作为输入。如果答案是肯定的,那么最好查看整个文档来衡量模型性能。正确分类的文档数除以文档总数。

最后一点,准确率、召回率或准确率是最佳衡量标准的问题取决于人们希望做出的权衡,作者不会对此发表评论。

【讨论】:

【参考方案3】:

当我急切地为此寻找解决方案时,我从相关任务(即 NER)以及 PrecisionRecall 的定义中获得了一些灵感,之后其中的计算,F1 分数可以很容易地计算出来。

根据定义:

我注意到我只需要计算 TP、FP 和 FN。例如,对于预测案例[0, 0, 1, 1],其真实标签为:[0, 0, 1, 0],TP 为 1,FP 为 0,FN 为 1。因此:

在这里,由于正类上的模型性能对我来说更重要,所以我只是在正类上尝试这些指标。我也意识到这是 F1 度量的基本用法,但是每个任务的粒度级别不同。希望这可以帮助任何对此问题感到困惑的人。

【讨论】:

以上是关于计算序列标记任务的分类指标的主要内容,如果未能解决你的问题,请参考以下文章

多分类任务中精确率(Precision)召回率(Recall)以及准确率(Accuracy)评估指标的计算

多分类任务中精确率(Precision)召回率(Recall)以及准确率(Accuracy)评估指标的计算

多分类任务中精确率(Precision)召回率(Recall)以及准确率(Accuracy)评估指标的计算

多分类任务中精确率(Precision)召回率(Recall)以及准确率(Accuracy)评估指标的计算

深度学习分类任务常用评估指标

深度学习分类任务常用评估指标