如何使用混淆矩阵计算自定义训练的 spacy ner 模型的整体准确性?

Posted

技术标签:

【中文标题】如何使用混淆矩阵计算自定义训练的 spacy ner 模型的整体准确性?【英文标题】:How to calculate the overall accuracy of custom trained spacy ner model with confusion matrix? 【发布时间】:2019-10-08 15:48:09 【问题描述】:

我正在尝试评估我的自定义训练 Spacy NER 模型。如何通过混淆矩阵找到模型的整体准确度。

我尝试使用 spacy scorer 评估模型,它通过以下参考提供精度、召回率和令牌准确性,

Evaluation in a Spacy NER model

我希望输出是混淆矩阵,而不是单个精度、召回率和标记精度。

【问题讨论】:

我想,因为模型是用由正值组成的 test_data 评估的(所有值都被标记),在这种情况下没有机会计算出真正的负数,因此我们无法计算准确性带有混淆矩阵。如果有任何其他方法可以解决上述问题,请帮助我。 【参考方案1】:

Here 是一本为 Spacy NER 模型创建混淆矩阵的好书。 它基于 Spacy 使用的 BILOU 格式。它适用于小部分文本,但在评估较大的文档时,混淆矩阵很难阅读,因为大部分文本都是 O 标记的。

您可以做的是创建两个列表,一个包含每个单词的预测值,一个包含每个单词的真实值,然后使用 sklearn.metrics.confusion_matrix() 函数进行比较。

from sklearn.metrics import confusion_matrix
y_true = [O,O,O,B-PER,I-PER]
y_pred = [O,O,O,B-PER,O]
confusion_matrix(y_true, y_pred, labels=["O", "B-PER", "I-PER"])

您也可以使用同一库中的 plot_confusion_matrix() 函数来获得视觉输出,但这需要 scikit-learn 0.23.1 或更高版本,并且只能与 scikit-learn 分类器一起使用。

正如this *** 问题中所写,这是一种使用 scikit-learn 中的confusion_matrix() 而不使用它们的情节的方法。

from sklearn.metrics import confusion_matrix

labels = ['business', 'health']
cm = confusion_matrix(y_test, pred, labels)
print(cm)
fig = plt.figure()
ax = fig.add_subplot(111)
cax = ax.matshow(cm)
plt.title('Confusion matrix of the classifier')
fig.colorbar(cax)
ax.set_xticklabels([''] + labels)
ax.set_yticklabels([''] + labels)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

【讨论】:

以上是关于如何使用混淆矩阵计算自定义训练的 spacy ner 模型的整体准确性?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn SVC 计算训练集的混淆矩阵

在 TensorFlow 2.0 的自定义训练循环中应用回调

具有自定义训练循环的 Tensorboard Graph 不包括我的模型

TfLearn 混淆矩阵训练在 std::bad_alloc 上终止

如何在 TF 2.0 / 1.14.0-eager 和自定义训练循环(梯度磁带)中执行梯度累积?

power bi 矩阵中的自定义聚合列