www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Оценка разногласий аннотатора в Python для создания надежного набора данных для машинного обучения

Дата публикации Sep 29, 2018

Чай против кофе: прекрасный пример решений и разногласий!

Как отметил Мэтью Хоннибал в своем выступлении на PyData Berlin в 2018 году [1], разработка надежной схемы аннотации и наличие внимательных аннотаторов является одним из строительных блоков успешной модели машинного обучения и неотъемлемой частью рабочего процесса. Пирамида ниже - взятая из его слайдов - показывает, что они являются существенными этапами до разработки модели.

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

Я заметил, что объяснения методов оценки разногласий в аннотациях не ограничиваются одним постом в сети, а методы для этого в Python не ограничиваются одной библиотекой. Итак, в этом посте мы рассмотрим ряд важных тем в области соглашений аннотатора:

  1. Определения общеизвестных статистических показателей для оценки качества соглашения. (Математика также может быть найдена на соответствующих страницах Википедии.)
  2. Реализация этих статистических показателей в Python с использованием новой библиотеки, которую я написал, называется disagree.
  3. Как оценить, какие ярлыки заслуживают дальнейшего внимания, используя ту же библиотеку, внедряя концепцию двусмысленности.

Что такое схема аннотации?

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

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

Таким образом, после того, как все данные будут помечены, необходимо расследовать эти случаи разногласий, чтобы мы могли получить знания и понимание о том, откуда возникают разногласия.

  1. Удалить данные со значительными разногласиямиЭто оставляет нам только данные, которые были надежно маркированы и надежны.
  2. Изменить схему аннотации для будущего использованияВозможно, это не было написано четко, и мы можем улучшить будущее соглашение.
  3. Изменить или объединить типы метокВозможно, мы в корне ошиблись в отношении типов этикеток, которые были бы полезны. Иногда нам нужно изменить метки, чтобы они соответствовали возможностям аннотатора.

Чтобы проанализировать ряд наиболее полезных (и не очень полезных) методов количественной оценки разногласий между аннотаторами, я сначала покажу вам, как настроить библиотеку Python «не согласен». Затем я рассмотрю различные статистические данные, объединяющие математическую теорию и реализации Python.

«Не согласен» библиотека

Он стремится сделать несколько вещей:

  1. Предоставить статистические возможности для количественной оценки разногласий аннотатора.

2. Обеспечьте визуализацию между различными аннотаторами.

3. Обеспечьте визуализацию, чтобы увидеть, какие ярлыки вызывают наибольшее несогласие.

После наблюдения каждого из этих трех пунктов, три решения, упомянутые выше, могут быть рассмотрены при необходимости Сначала вам нужно импортировать библиотеку. Ниже представлен каждый модуль, который я продемонстрирую здесь:

from disagree import BiDisagreements
from disagree import Metrics, Krippendorff

Есть два нюанса, фундаментальных дляне согласны.Во-первых, вам нужно, чтобы аннотации были сохранены в DataFrame pandas определенным образом. Строки индексируются экземпляром данных, и каждый столбец является меткой аннотатора для этого экземпляра данных. Заголовки столбцов - это имена аннотаторов в виде строк. Метки должны быть либо None, либо между 0 и максимальной меткой. (Вы должны конвертировать ваши метки в этот формат ) Итак, давайте настроим пример DataFrame, чтобы это было понятно:

example_annotations = {"a": [None, None, None, None, None, 1, 3, 0, 1, 0, 0, 2, 2, None, 2], 
"b": [0, None, 1, 0, 2, 2, 3, 2, None, None, None, None, None, None, None],
"c": [None, None, 1, 0, 2, 3, 3, None, 1, 0, 0, 2, 2, None, 3]}labels = [0, 1, 2, 3]

Таким образом, в нашем примере у нас есть 3 аннотатора с именами «a», «b» и «c», которые вместе пометили 15 экземпляров данных. (Первый экземпляр данных не помечен «a» и «c», а помечен как 0 «b».) Фрейм данных будет выглядеть следующим образом:

Кроме того, для каждого случая у них был выбор меток [0, 1, 2, 3]. (На самом деле, у них мог быть выбор [1, 2, 3, 4] или [«кошка», «собака», «лошадь», «корова»], но метки должны были быть проиндексированы с нуля для использования в библиотеке.)

Теперь мы готовы изучить возможные метрики, используемые для оценки аннотаторных соглашений. Начните с настройкиметрикаэкземпляр изметрикамодуль:

mets = metrics.Metrics(df, labels)

Совместная вероятность

Совместная вероятность - самый простой и самый наивный метод оценки аннотаторных соглашений. Его можно использовать, чтобы посмотреть, насколько один аннотатор согласен с другим.

По сути, он складывает количество раз, когда аннотаторы 1 и 2 соглашаются, и делит его на общее количество точек данных, которые они оба пометили.

Для нашего примера набора данных мы можем вычислить это между двумя аннотаторами по нашему выбору:

joint_prob = mets.joint_probability("a", "b")print("Joint probability between annotator a and b: {:.3f}".format(joint_prob))Out: Joint probability between annotator a and b: 0.333

Каппа коэна

Это более статистически продвинутый метод, чем совместная вероятность, потому что он учитывает вероятность согласияслучайно, Также сравниваются два аннотатора.

Использование библиотеки Python:

cohens = mets.cohens_kappa("a", "b")print("Cohens kappa between annotator a and b: {:.3f}".format(cohens))Out: Cohens kappa between annotator a and b: 0.330

корреляция

Корреляция также является очевидным выбором! Если аннотатор 1 и аннотатор 2 имеют высокую корреляцию, то они могут согласовать метки. И наоборот, низкая корреляция означает, что они вряд ли согласятся.

spearman = mets.correlation("a", "b", measure="spearman")
pearson = mets.correlation("a", "b", measure="pearson")
kendall = mets.correlation("a", "b", measure="kendall")print("Spearman's correlation between a and b: {:.3f}".format(spearman[0]))
print("Pearson's correlation between a and b: {:.3f}".format(pearson[0]))
print("Kendall's correlation between a and b: {:.3f}".format(kendall[0]))Out: Spearman's correlation between a and b: 0.866
Out: Pearson's correlation between a and b: 0.945
Out: Kendall's correlation between a and b: 0.816

Обратите внимание, что с мерами корреляции возвращается корреляция корреляции и p-значение, следовательно, индексация нуля при печати результата. (Это использует библиотеку Scipy.)

В этот момент вы можете подумать следующее: «Но что, если у нас будет более двух аннотаторов? Разве эти методы не бесполезны? »Ответ может быть как« Да », так и« Нет ». Да, они были бы бесполезны для оценки глобальных разногласий аннотатора в отношении того, чтобы сделать ваш набор данных более надежным. Тем не менее, есть ряд случаев, когда вы можете сделать это:

  • Представьте, что у вас есть 10 аннотаторов, 2 из которых сидят в комнате вместе, а остальные 8 сидят отдельно. (Возможно, из-за служебных помещений.) После аннотаций вы можете захотеть увидеть, существует ли большее согласие между двумя, кто сидел в комнате вместе, так как они могли обсуждать ярлыки.
  • Возможно, вы хотите увидеть соглашение между аннотаторами с одинаковым уровнем образования относительно групп с другим уровнем образования.

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

Fleiss ’Kappa

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

В Python:

fleiss = mets.fleiss_kappa()

Альфа Криппендорфа

Последний, самый дорогой в вычислительном отношении и математически запутанный - это альфа Криппендорфа. Это, наряду с каппа Fleiss, считается одним из самых полезных статистических данных (если нетбольшинствополезно). (На странице Википедии есть отличный пример, если вы хотите увидеть ручное вычисление альфа Криппендорфа.)

В Python это так же просто, как и любая другая статистика:

kripp = Krippendorff(df, labels)
alpha = kripp.alpha(data_type="nominal")print("Krippendorff's alpha: {:.3f}".format(alpha))Out: Krippendorff's alpha: 0.647

Причина, по которой я резервирую альфа Криппендорфа для отдельного класса, заключается в том, что в инициализации есть несколько очень дорогих вычислительных процессов. Если существует большое количество аннотаций (скажем, от 50 000 до 100 000), было бы неприятно инициализировать структуры альфа-данных Криппендорфа, когда никто не заинтересован в их использовании. Сказав это, он был реализован таким образом, что в любом случае это не займет много времени.

И вот оно - вычисление массива полезной статистики разногласий аннотаций в одной простой в использовании компактной библиотеке Python.

Bidisagreements

Еще одна полезная вещь, которую стоит рассмотреть, это то, что мне нравится называтьbidisagreements.Это количество раз, которое экземпляр данных помечается по-разному двумя разными аннотаторами. Причина, по которой они полезны, заключается в том, что они позволяют вам проверить, где могут быть недостатки в используемой системе маркировки или схема аннотации, предоставленная аннотаторам.

Например, в данном экземпляре набора данных метки [0, 0, 1], или [1, 1, 1, 2], или [1, 3, 1, 3] будут рассматриваться как одно двунаправленное соглашение. (Строки 8 и 15 являются примерами разногласий в приведенном выше кадре данных.) Это можно распространить на трехсторонние разногласия, 4 разногласия, 5 разногласий и т. Д.

Используяне соглашатьсябиблиотека, мы можем рассмотреть эти случаи сBiDisagreementsмодуль, который был импортирован выше.

Сначала настройте экземпляр:

bidis = BiDisagreements(df, labels)

Полезным атрибутом является следующее:

bidis.agreements_summary()Number of instances with:
=========================
No disagreement: 9
Bidisagreement: 2
Tridisagreement: 1
More disagreements: 0
Out[14]: (9, 2, 1, 0)

Вывод показывает, что из наших примеров аннотаций есть 9 экземпляров данных, по которым нет разногласий; 2 экземпляра данных, для которых существует разногласие; и 1 экземпляр данных, для которых существует трехстороннее согласие. (Обратите внимание, что это возвращает кортеж в качестве выходных данных.) Причина, по которой они добавляют до 12, а не 15, состоит в том, что в нашем примере набора данных есть 3 случая, когда не более 1 аннотатора помечают экземпляр. Они не включены в вычисления, потому что любой экземпляр данных, помеченных 1 аннотатором, должен в любом случае считаться недействительным.

Мы также можем визуализировать, какие ярлыки являются причиной разногласий:

mat = bidis.agreements_matrix(normalise=False)
print(mat)[[0. 0. 1. 0.]
[0. 0. 0. 0.]
[1. 0. 0. 1.]
[0. 0. 1. 0.]]

Из этой матрицы видно, что одно двунаправленное согласие связано с меткой 0 против метки 2, а другое - с метки 2 против метки 3. Используя эту матрицу, вы можете создать визуализацию по вашему выбору, например что-то в форме Матрица путаницы с использованием matplotlib:https://www.kaggle.com/grfiv4/plot-a-confusion-matrix.

Эта последняя возможность особенно полезна, когда у вас очень большие наборы данных. Недавно, используя это в 25 000 аннотаций в 6000 экземплярах данных, я смог очень быстро определить, что почти 650 разногласий исходили только от двух ярлыков. Это позволило мне рассмотреть эти две метки и то, как они должны были использоваться в модели машинного обучения, а также при изменении схемы аннотации для будущего использования аннотаторами.

Будущее рассмотрение

При наличии двусмысленности вы заметите, что библиотека способна показывать только частоту. Это имеет несколько значительный этаж. Представьте себе два следующих набора меток для двух экземпляров данных:

  1. [0, 0, 0, 0, 1]
  2. [2, 1, 1, 2, 2]

Ясно, что первый согласен гораздо лучше, чем второй, но не согласен, считает их одинаково. Будет интересно поработать над методом двунаправленного согласия, который статистически взвешивает второй способ как более существенное несоответствие, чем первый, и затем соответствующим образом нормализует матрицу несоответствий.

Заключительные замечания о «не согласен»

Эта библиотека совсем недавно и является моей первой реализацией. (По этой причине я прошу вас извинить за грязную версию и зафиксировать истории.) Полный репозиторий GitHub можно найти здесь:https://github.com/o-P-o/disagree,

Репозиторий включает весь код, а также блокноты Jupyter с примерами, показанными выше. Также есть полная документация в файле README.

Пожалуйста, не стесняйтесь поднимать вопросы и предлагать дополнительные возможности. Я быстро расскажу о любом из них.

[1]https://www.youtube.com/watch?v=jpWqz85F_4Y&t=442s

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map