【问题标题】:Spacy TextCat Score in MultiLabel Classfication多标签分类中的 Spacy TextCat 分数
【发布时间】:2020-10-02 00:30:32
【问题描述】:

在 spacy 的文本分类 train_textcat 示例中,有两个标签分别指定了 PositiveNegative。因此,猫的分数表示为

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 中的示例是否也适用于多标签分类?

【问题讨论】:

    标签: spacy text-classification multilabel-classification


    【解决方案1】:

    如果我理解正确,您有一个类别列表,您的数据可以同时包含多个类别。在这种情况下,您不能使用"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'])调用此函数,您将获得包含此示例类的完整字典

    【讨论】:

      【解决方案2】:

      示例脚本主要是针对单个用例的快速演示,您说得对,这不是对多标签案例的正确评估。

      底层空间 Scorerspacy evaluate CLI (https://spacy.io/api/cli#evaluate) 报告多标签分类的宏观平均 AUC ROC 分数。

      您可以将Scorernlp.evaluate() (https://spacy.io/api/language#evaluate) 或通过spacy evaluate / spacy train 一起使用。

      如果您的数据是示例脚本中的简单TRAIN_DATA 格式,nlp.evaluate() 可能是运行Scorer 的最简单方法,因为spacy evaluate 需要您将数据转换为 spacy 的内部 JSON 训练格式。

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

      • 正标签上的 f-score 用于二进制排他,
      • 3+ 独占的宏观平均 f 分数,
      • 多标签的宏观平均 AUC ROC 分数

      【讨论】:

        猜你喜欢
        • 2019-04-01
        • 2018-08-04
        • 1970-01-01
        • 2020-03-27
        • 2019-03-22
        • 2019-02-26
        • 2013-07-23
        • 1970-01-01
        相关资源
        最近更新 更多