【问题标题】:Multi Label Annotator agreement with Cohen Kappa与 Cohen Kappa 达成多标签注释器协议
【发布时间】:2018-09-11 09:32:09
【问题描述】:

假设我想为文档添加注释。每个文档都可以使用多个标签进行注释。在此示例中,我有 2 个注释器(a 和 b),它们分别标记两个文档。

from sklearn.metrics import cohen_kappa_score
annotator_a = [ 
    ["a","b","c"],
    ["d","e"]
]
annotator_b = [
    ["b","c"],
    ["f"]
]

Annotator_a 用标签 a、b 和 c 标记文档 1。 Annotator_b 用标签 b 和 c 标记文档 1。

我尝试使用以下方法计算注释者协议:

cohen_kappa_score(annotator_a, annotator_b)

但这会导致错误:

ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead.

关于如何计算此集合的注释者一致性的任何想法?

【问题讨论】:

    标签: python scikit-learn kappa


    【解决方案1】:

    Cohen 的 Kappa 不支持多标签输入。可以使用 Krippendorff 的 Alpha,而不是使用 Cohen 的 Kappa。该度量支持评分者间一致性、缺失值和非排他性主题。可在pypi 获得。

    【讨论】:

      【解决方案2】:

      具体错误是由于多标签输出的表示不受支持(请参阅type_of_target sklearn 函数的文档)。 由于cohen_kappa_score 不支持多标签输入(见下文),即使正确的多标签输出仍然会出现错误。事实上,Cohen's kappa只能应用于独占的多类问题,而多标签输出根据定义是非独占的。

      您可以为每个标签创建一个二元分类器,并为每个标签计算 Cohen 的 kappa。如果您需要一个代表协议的唯一数字,您可以计算标签上的平均 kappa。

      示例:多标签的 Cohen 卡帕

      to_dict = lambda x: {k: [1 if k in y else 0 for y in x] for k in labels}
      a_dict = to_dict(annotator_a)
      b_dict = to_dict(annotator_b)
      cohen_dict = {k: cohen_kappa_score(a_dict[k], b_dict[k]) for k in labels}
      cohen_avg = np.mean(list(cohen_dict.values()))
      
      print(f'a_dict: {a_dict}')
      print(f'b_dict: {b_dict}')
      print(f'cohen_dict: {cohen_dict}')
      print(f'cohen_avg: {cohen_avg}')
      

      输出:

      a_dict: {'a': [1, 0], 'b': [1, 0], 'c': [1, 0], 'd': [0, 1], 'e': [0, 1], 'f': [0, 0]}
      b_dict: {'a': [0, 0], 'b': [1, 0], 'c': [1, 0], 'd': [0, 0], 'e': [0, 0], 'f': [0, 1]}
      cohen_dict: {'a': 0.0, 'b': 1.0, 'c': 1.0, 'd': 0.0, 'e': 0.0, 'f': 0.0}
      cohen_avg: 0.3333333333333333
      

      如何转换为序列序列以纠正多标签表示

      from sklearn.preprocessing import MultiLabelBinarizer
      m = MultiLabelBinarizer(classes=list('abcdef'))
      a_multi = m.fit_transform(annotator_a)
      b_multi = m.fit_transform(annotator_b)
      print(f'a_multi:\n{a_multi}')
      print(f'b_multi:\n{b_multi}')
      cohen_kappa_score(a_multi, b_multi)
      

      输出:

      a_multi:
      [[1 1 1 0 0 0]
       [0 0 0 1 1 0]]
      b_multi:
      [[0 1 1 0 0 0]
       [0 0 0 0 0 1]]
      ...
      ValueError: multilabel-indicator is not supported
      

      【讨论】:

        【解决方案3】:

        虽然原始的 Cohen 的 Kappa 统计不支持多个标签,但有建议的扩展来解决这种情况。通过为每个标签分配权重,Kappa 值允许人们分析主要和次要(可能更多)类别对协议分数的贡献。有关详细信息,请参阅Augmenting the kappa statistic to determine interannotator reliability for multiply labeled data points 论文。

        当然,也可以使用Krippendorff's alpha reliability coefficient,它适用于任意数量的注释器和类别。上面提到的加权 Kappa 仍然仅限于贴标机对。

        【讨论】:

          猜你喜欢
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 2021-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-16
          • 1970-01-01
          相关资源
          最近更新 更多