4

假设我想为文档添加注释。每个文档都可以使用多个标签进行注释。在此示例中,我有 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.

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

4

3 回答 3

7

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

于 2018-09-19T11:15:28.963 回答
4

具体错误是由于多标签输出的表示不受支持(请参阅type_of_targetsklearn 函数的文档)。即使是正确的多标签输出,您仍然会收到错误,因为cohen_kappa_score不支持多标签输入(见下文)。事实上,Cohen 的 kappa 仅适用于排他的多类别问题,并且多标签输出根据定义是非排他的。

您可以做的是为每个标签设置一个二元分类器,并为每个标签计算 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
于 2018-09-12T12:38:56.707 回答
1

尽管最初的 Cohen 的 Kappa 统计不支持多个标签,但提出了扩展来解决这种情况。通过为每个标签分配权重,Kappa 值允许人们分析主要和次要(可能更多)类别对协议分数的贡献。有关详细信息,请参阅增强 kappa 统计量以确定多重标记数据点的注释器间可靠性论文。

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

于 2021-07-15T19:34:46.127 回答