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

时间:2018-09-11 09:32:09

标签: python 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.

关于如何在此集合上计算注释者协议的任何想法?

3 个答案:

答案 0 :(得分:1)

特定错误是由于不支持多标签输出表示(请参见sklearn的type_of_target函数的文档)。 即使正确的多标签输出,您仍然会收到错误消息,因为cohen_kappa_score不支持多标签输入(请参见下文)。实际上,Cohen's kappa 只能用于排他的的多类问题,并且根据定义,多标签输出是非排他的。

您可以做的是为每个标签使用一个二进制分类器,并为每个标签计算Cohen的kappa。如果您需要一个表示协议的唯一数字,则可以计算标签上的平均kappa。

示例:科恩的多标签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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

Cohen的Kappa不支持,不支持多标签输入。除了使用Cohen的Kappa,还可以使用Krippendorff的Alpha。该措施支持评估者之间的共识,缺失的价值观和非排他性主题。它在pypi上可用。