Соглашение о добавлении нескольких меток с Коэном Каппой

Скажите, что я хочу иметь аннотации для документов. Каждый документ может быть аннотирован несколькими метками. В этом примере у меня есть 2 аннотатора (a и b), и каждый из них помечает два документа.

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

Annotator_a помечает документ 1 метками a, b и c. Annotator_b помечает документы 1 метками b и c.

Я попытался рассчитать аннотаторное соглашение, используя:

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 ответа

Решение

Каппа Коэна не поддерживает, не поддерживает ввод нескольких меток. Вместо того, чтобы использовать Каппу Коэна, можно использовать Альфу Криппендорфа. Эта мера поддерживает соглашение между участниками, отсутствующие значения и неисключительные темы. Это доступно на pypi.

Конкретная ошибка связана с неподдерживаемым представлением вывода с несколькими метками (см. Документацию type_of_target функция склеарн). Даже при правильном выводе нескольких меток вы все равно получите ошибку, так как cohen_kappa_score не поддерживает ввод нескольких меток (см. ниже). Фактически, каппа Коэна может применяться для задач нескольких классов только для исключительных классов, и вывод нескольких меток по определению не является исключительным.

Что вы могли бы сделать, это иметь двоичный классификатор для каждой метки и вычислить каппу Коэна для каждой метки. Если вам нужен уникальный номер, представляющий соглашение, вы можете рассчитать среднее значение каппа по меткам.

Пример: каппа Коэна для мульти лейбла

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

Хотя исходная статистика Каппа Коэна не поддерживает несколько меток, для этого случая предлагаются расширения. Присваивая веса каждой метке, значения Каппа позволяют анализировать вклад первичных и вторичных (и, возможно, большего количества) категорий в оценки согласия. Подробности см. в документе « Увеличение статистики каппа для определения надежности интераннотатора для точек данных с множественными метками » .

Конечно, можно было бы также использовать коэффициент альфа-надежности Криппендорфа, который применяется к любому количеству аннотаторов и категорий. Упомянутая выше взвешенная каппа по-прежнему ограничена парами маркировщиков.

Другие вопросы по тегам