Измерение и улучшение качества человеческих меток для задач машинного обучения.

Что такое ярлыки?

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

Почему важно качество ярлыков?

Метки — это хлеб с маслом для задач контролируемого машинного обучения. Когда кто-то смотрит на проблему контролируемого машинного обучения, он смотрит на набор данных и предполагает, что метка является истинной. Но как убедиться, что человеческие ярлыки отражают правду? Эти модели машинного обучения доставляются клиентам или конечным пользователям и, следовательно, имеют критическую ценность. Специалисты по данным должны быть уверены, что метки хорошего качества и отражают проблему, которую они решают. Точная маркировка данных является важным шагом в конвейере машинного обучения, поскольку она напрямую влияет на производительность и способность модели к обобщению. В этой статье мы рассмотрим некоторые часто используемые определения качества этикеток, способы измерения качества и рекомендации по обеспечению качества.

Как мы можем измерить качество ярлыков?

Разногласия между аннотаторами и лейблами

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

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

def has_disagreement(labels):
  previous = labels[0]
  for label in range(1, len(labels)):
    if label ! = previous:
      return True
  return False

б. Каппа Флейсса — это статистическая мера для оценки надежности согласия между фиксированным числом оценщиков при присвоении категориальных оценок ряду элементов или классификации элементов.[1] Это помогает учитывать относительный вес сценариев с частичным согласием и частичным несогласием между авторами ярлыков. Если оценщики полностью согласны, то Каппа равна 1. Если между оценщиками нет согласия (кроме того, что можно было бы ожидать случайно), то Каппа ≤ 0.

import numpy as np

def fleiss_kappa(A: np.ndarray) -> float:
    """
    Computes Fleiss' kappa score for a group of labelers.
    """
    n_items, n_categories = A.shape
    n_annotators = float(np.sum(A[0])) 
    total_annotations = n_items * n_annotators 
    category_sums = np.sum(A, axis=0)

    # compute chance agreement
    p= category_sums / total_annotations
    p_sum = np.sum(p * p)

    # compute observed agreement
    p= (np.sum(A * A, axis=1) - n_annotators) / (n_annotators * (n_annotators - 1))
    p_mean = np.sum(p) / n_items

    # compute Fleiss' kappa score
    kappa = (p_mean- p_sum) / (1 - p_sum)

    return round(kappa, 4)

Золотые данные

Золотые данные — это набор точек данных с метками, которые действуют как окончательная ссылка для решения проблемы/задачи маркировки. В случаях использования задач, основанных на контенте, золотые данные обычно представляют собой набор данных, которые вручную курируются с помощью высокоточных меток. Они нацелены на то, чтобы охватить различные аспекты проблемы и несколько крайних случаев. Цель состоит не в том, чтобы отразить истинное распределение, а в том, чтобы охватить очевидные и пограничные случаи по всем меткам задачи. Размер этих наборов данных обычно составляет несколько сотен и довольно статичен.

Способ измерения качества маркировки заключается в том, чтобы периодически смешивать подмножество золотого набора данных с каждым пакетом задач маркировки. Цель состоит в том, чтобы иметь около 50 таких золотых точек данных в наборе данных. Если метки собираются ежедневно, то золотые данные можно смешивать раз в неделю. Более низкая частота золотых данных важна для обеспечения того, чтобы золотые точки данных не попадали к оценщикам. Вот схема, демонстрирующая процесс смешивания:

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

from sklearn.metrics import recall_score, precision_score, accuracy_score

def labels(H, G):
  """
    H: A dict containing the ids as the key and aggregated human label as the value.
    G: A dict containing the ids as the key and golden label as the value for all of Golden Data.
    returns a tuple of human label array and golden label array for the human labeled Golden Data.
  """
  golden_labels = []
  human_labels. []
  for id, label in H:
    if id in G:
      golden_labels.append(G[id])
      human_labels.append(H[id])
  return golden_labels, human_labels

golden_labels, human_labels  = labels(H, G)
print(precision_score(golden_labels, human_labels))
print(recall_score(golden_labels, human_labels))
print(accuracy_score(golden_labels, human_labels))

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

Как мы можем повысить качество ярлыков?

  1. Отслеживание качества. Важно отслеживать качество этикетки и получать оповещения, когда качество этикетки падает ниже определенного порога. Каждая из мер, упомянутых в предыдущем разделе, имеет свои плюсы и минусы, и было бы целесообразно отслеживать их все.
  2. Подтвердите инструкции по маркировке.Инструкции по маркировке должны вызывать подозрения при обнаружении нарушений качества этикетки. Важно определить, есть ли отверстия в шаблоне. Два ключевых метода, с помощью которых вы можете определить и заполнить эти пробелы, следующие: во-первых, точность меток, собранных с использованием инструкций по золотым данным, должна быть высокой (>95%). Способ обеспечить это — запустить пилотные программы с первоначальными версиями шаблона рейтинга на Golden Data и настроить шаблон рейтинга, пока не будет достигнута желаемая точность маркировки человеком. Во-вторых, для партий с высоким уровнем несогласия этикетировщика просмотрите точки данных с несогласием маркировщика и вручную определите пробелы в инструкциях для точек данных, которые могут привести к путанице у маркировщиков.
  3. Соблюдаете ли вы передовой опыт? Существует несколько рекомендуемых способов сбора ярлыков для ваших данных:

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

import statistics

def aggregated_label_classification(labels):
  return statistics.median(labels)

def aggregated_label_regression(labels):
  return statistics.mean(labels)

б. Ограничьте количество задач для одного маркировщика: важно свести к минимуму влияние человека на собираемые этикетки. Если все задачи выполняются одним и тем же маркировщиком, вероятность того, что данные будут искажены человеческим фактором, выше. Ограничение количества задач на одного этикетировщика действительно важно. Простой способ добиться этого — увеличить количество отдельных маркировщиков. Вы можете использовать Golden Data для определения хороших и плохих маркировщиков и назначать больше задач хорошим маркировщикам и меньше задач плохим маркировщикам.

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

Заключение

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

Ссылки:

  1. https://en.wikipedia.org/wiki/Fleiss%27_kappa
  2. https://labelyourdata.com/articles/data-labeling-quality-and-how-to-measure-it
  3. https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics