Spacy在多标签分类中的文本分类得分

4
在spacy的文本分类train_textcat示例中,指定了两个标签PositiveNegative。因此,cats得分表示为

cats = [{"POSITIVE": bool(y), "NEGATIVE": not bool(y)} for y in labels]

我正在处理多标签分类,这意味着我需要在一个文本中标记多个标签。我已添加了我的标签。

textcat.add_label("CONSTRUCTION")

我使用以下代码来指定猫的分数: cats = [{"POSITIVE": bool(y), "NEGATIVE": not bool(y)} for y in labels] 我相信这不是正确的。有没有什么建议可以指定多标签分类中的猫的得分以及如何训练多标签分类?Spacy的示例是否也适用于多标签分类?
2个回答

3
如果我理解正确,您有一个类别列表,并且您的数据可能同时包含多个类别。在这种情况下,您不能使用 "POSITIVE": bool(y), "NEGATIVE": not bool(y) 来标记您的类别。相反,尝试编写一个函数,该函数将根据类别返回一个字典。例如,考虑以下类别列表:categories = ['POLITICS', 'ECONOMY', 'SPORT']。现在,您可以遍历您的训练数据,为每个训练示例调用一个函数。
这个函数可以像这样:
def func(categories):
    cats = {'POLITICS': 0, 'ECONOMY': 0, 'SPORT': 0}
    for category in categories:
        cats[category] = 1
    return {'cats': cats}

如果有一个包含两个类别(比如 POLITICSECONOMY)的训练样例,你可以使用一个类别列表调用这个函数(labels = func(['POLITICS', 'ECONOMY']),然后你将获得该示例完整的分类词典。


1
示例脚本主要是针对单个用例的快速演示,您是正确的,这不是多标签情况下的正确评估方式。
底层的spacy Scorerspacy evaluate CLI(https://spacy.io/api/cli#evaluate)报告多标签分类的宏平均AUC ROC分数。
您可以使用nlp.evaluate()https://spacy.io/api/language#evaluate)或通过spacy evaluate/spacy train使用Scorer
如果您的数据采用示例脚本中的简单TRAIN_DATA格式,则nlp.evaluate()可能是运行Scorer最简单的方法,因为spacy evaluate需要您将数据转换为spacy的内部JSON训练格式。

在初始化管道组件时指定的模型设置用于选择适当的评估指标(显然这些不是唯一可能的指标,只是每个配置下适合的指标):

  • 对于二进制排除,使用正标签的f-score
  • 对于3+个类别的排除,使用宏平均f-score
  • 对于多标签,使用宏平均AUC ROC分数

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接