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

Фон

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

Как показано на Рисунке 1, f обучается с маркированными обучающими изображениями кошек и собак. Здесь собака - это категория, а кошка - это другая категория. Эти категории также называются классами в задачах классификации. Доброта f во многом зависит от качества данных, на которых он обучается - если мы скармливаем изображения обезьяны с пометкой кошка, это то, чему она научится!

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

Классовый дисбаланс - это одна из первых вещей, на которую следует обратить внимание при генерации обучающих данных для задач классификации. Если наши данные обучения содержат 98 примеров собак и 2 примера кошек, f будет сложно понять, как кошка на самом деле выглядит, поскольку она недостаточно представлена ​​. Можете ли вы угадать еще одну вещь, на которую стоит остерегаться? Вот подсказка, какова точность f ниже для указанного выше набора данных,

def f(image):
  return "dog"

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

ML - это демон, который пытается решить проблему наихудшим способом, который вы не запретили.

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

Сценарий 1: сегменты процентилей

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

f( item details ) = price class

Чтобы предотвратить дисбаланс классов, мы можем разделить цены на корзины одинакового размера, чтобы в каждой корзине было примерно одинаковое количество товаров. Однако здесь есть 2 проблемы:

  1. Определения низкого, среднего и высокого могут быть такими, что большинство предметов относятся к среднему классу, что снова приводит к дисбалансу классов!
  2. Кроме того, эти определения могут часто меняться, вынуждая нас каждый раз переучивать f с новыми границами классов.

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

Решение. Что, если мы разделим столбец цен на сегменты с точным процентилем, тогда мы сможем сообщить об объединенных сегментах на основе текущих определений низкого, среднего и высокого ценового класса.

Как показано на рисунке 3, столбец цен разделен на 10 сегментов одинакового размера, хотя нам нужно только 3 - низкий, средний и высокий. Теперь, если нам дано,

  • ‹₹ 233 ниже,
  • От 234 до 685 вон как средний, и
  • ›685 выше

затем мы можем объединить их в сегменты [0–3], [4–6] и [7–9] соответственно. Во время обучения модели и мониторинга мы можем сообщить о точности этих комбинированных сегментов, поскольку это то, что нас волнует,

Код на рис. 4 представляет собой необязательную расширенную настройку, которая помогает при мониторинге. Но это также может дать представление о том, как метрики производительности пользовательской модели могут быть определены в тензорных потоках керасов и как то же самое можно использовать для измерения точности процентильных сегментов. Функция three_class_acc оценивает прогнозы, сделанные моделью, как если бы классов было всего 3. Эта настраиваемая метрика может быть визуализирована на Tensorboard вместе с метрикой точности 10 классов по умолчанию. Таким образом, мы обучаем и поддерживаем одну модель и используем ее для нескольких сценариев использования.

Сценарий 2: Иерархические классы

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

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

f( bug report ) = employee id

Такая формулировка может иметь две проблемы:

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

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

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

Отрисованная записная книжка на рис. 7 показывает проблему взрыва класса, когда в качестве целевых классов используются наиболее подходящие сотрудники, которые могут исправить ошибку. С другой стороны, использование ПО в качестве целевых классов может привести к сильному дисбалансу. Он также показывает, как стандартное отклонение (std) размеров классов является подходящей метрикой для количественной оценки дисбаланса классов. Функция split разделяет самые большие классы вице-президентов на его / ее непосредственных подчиненных, что приводит к более сбалансированному набору. Точно так же функция merge объединяет самые маленькие классы старших директоров, количество которых меньше заданного порогового значения, в вице-президентов, которым они подчиняются. Это повторяется несколько раз, чтобы получить значение std, которое в 5,82 раза меньше исходного значения.

Сценарий 3: Сбалансированная кластеризация

Эта идея полезна, когда необходимое количество целевых классов известно, но фактические классы четко не определены.

Кластеризация - еще одно подполе в ML, помимо классификации, которое пытается идентифицировать структуру и шаблоны в немаркированном наборе данных. Поэтому, в отличие от классификации, для алгоритмов кластеризации нет правильного ответа. В зависимости от проблемы мы выбираем подходящий алгоритм кластеризации и используем кластеры, которые он определяет. Например, в этой статье авторы группируют точки высадки такси, чтобы объединить близлежащие точки (пары широты и долготы) как виртуальный регион и использовать его в качестве целевого класса. Затем алгоритм классификации использует 🚖 точек посадки в качестве входных данных и учится предсказывать виртуальный регион высадки. Таким образом они уменьшают количество целевых классов для алгоритма классификации.

Здесь мы увидим, как кластеризация может помочь генерировать сбалансированные классы в наборах данных графы / сети. Эта идея применима в целом к ​​любому набору данных без метки, в котором проблема определяется нечетко. Скажем, у нас есть набор данных социальной сети (например, LinkedIn или Facebook), где узлы - это пользователи, а ребра - это связи (например, друзья или разделяют общие интересы) между ними. Теперь, когда новый пользователь, Алиса, регистрируется, трудно дать ей какие-либо релевантные рекомендации, поскольку у нас нет никакой исторической информации о ней. Это называется проблема холодного пуска. Один из способов решить эту проблему - найти группу пользователей, похожих на Алису, использующих ее регистрационную информацию, и использовать их рекомендации для нее, пока мы не узнаем ее лучше.

Как показано на рисунке 9, проблема пользователя с холодным запуском может быть двоякой:

  1. Группируйте похожих пользователей вместе - Кластеризация
  2. Используя атрибуты нового пользователя (из процесса регистрации), найдите его ближайшую группу - Классификация

Поскольку кластеризация определяет целевые классы для алгоритма классификации, мы сосредотачиваемся здесь на том, как сгенерировать сбалансированные кластеры, чтобы предотвратить проблему дисбаланса классов.

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

Резюме

Классификация - это алгоритм машинного обучения, который хорошо работает во многих сценариях, когда либо доступны помеченные данные, либо их можно сгенерировать с использованием самой постановки задачи, как показано в сценарии 3. Мы увидели 3 метода проектирования целевых классов для алгоритмов классификации, которые заботятся о общие проблемы, такие как несбалансированность классов на ограниченных данных и недоступность помеченных данных. Есть ли у вас другие интересные способы разработки y в алгоритмах классификации? Делитесь ими в комментариях.

Особая благодарность Atasi Panda за просмотр моего контента и за то, что он сделал его более интересным.