具体错误是由于多标签输出的表示不受支持(请参阅type_of_target
sklearn 函数的文档)。即使是正确的多标签输出,您仍然会收到错误,因为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