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

时间:2019-05-22 08:03:41

标签: python machine-learning spacy ner

我正在尝试评估经过定制培训的Spacy NER模型。如何使用混淆矩阵找到模型的整体精度。

我尝试使用spacy评分器评估模型,该评分器通过以下参考提供准确性,召回率和令牌准确性,

Evaluation in a Spacy NER model

我希望输出在混淆矩阵中,而不是单个精度,召回率和令牌精度。

1 个答案:

答案 0 :(得分: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 stackoverflow问题中所写,这是一种使用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()