计算序列标记任务的分类指标
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)以及 Precision 和 Recall 的定义中获得了一些灵感,之后其中的计算,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)评估指标的计算