与 Cohen Kappa 的多标签注释器协议

Multi Label Annotator agreement with Cohen Kappa

说我想要文档的注释。每个文档都可以用多个标签进行注释。在此示例中,我有 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.

关于如何计算注释者对该集合的一致性有什么想法吗?

特定错误是由于不支持的多标签输出表示(请参阅 sklearn 的 type_of_target 函数的文档)。 即使是正确的多标签输出,你仍然会得到一个错误,因为 cohen_kappa_score 不支持多标签输入(见下文)。事实上,Cohen's kappa 只能应用于 exclusive classes 的 multi-class 问题,并且多标签输出根据定义是非排他性的。

您可以做的是为每个标签设置一个二进制 classifier 并为每个标签计算 Cohen 的 kappa。如果您需要一个代表协议的唯一数字,您可以计算标签的平均 kappa。

示例:Cohen 的多标签 kappa

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

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

上可用

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

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