Принеси баланс силе!

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

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

Почему мы хотим, чтобы наши данные были сбалансированы?

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

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

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

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

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

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

(1) Балансировка веса

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

Мы можем придать вес классам, просто умножив потерю каждого примера на определенный коэффициент в зависимости от их класса. В Keras мы можем сделать что-то вроде этого:

Мы создали словарь, в котором говорится, что наш класс «купить» должен содержать 75% веса для функции потерь, поскольку более важен класс «не покупать», который мы соответственно установили на 25%. Конечно, эти значения можно легко изменить, чтобы найти наиболее оптимальные настройки для вашего приложения. Мы также можем использовать этот метод балансировки, если один из наших классов имеет значительно больше примеров, чем другой. Вместо того, чтобы тратить время и ресурсы на попытки собрать больше для класса меньшинства, мы можем попытаться использовать балансировку веса, чтобы все классы в равной степени способствовали нашей потере.

Еще один метод, который мы можем использовать для балансировки весов в наших обучающих примерах, - это Focal Loss, показанный ниже. Вот основная идея: в нашем наборе данных, естественно, будут некоторые обучающие примеры, которые легче классифицировать, чем другие. Во время обучения эти примеры будут классифицированы с точностью 99%, в то время как другие, более сложные, могут по-прежнему показывать низкую производительность. Проблема в том, что эти легко классифицируемые обучающие примеры продолжают приносить убытки. Почему мы по-прежнему придаем им одинаковый вес, когда есть другие более сложные данные, которые при правильной классификации могут внести гораздо больший вклад в нашу общую точность ?!

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

(2) Избыточная и заниженная выборка

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

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

Недостаточная выборка означает, что мы выберем только некоторые данные из класса большинства, используя только столько примеров, сколько имеет класс меньшинства. Этот выбор должен быть сделан для сохранения вероятностного распределения класса. Это было просто! Мы просто выровняли наш набор данных, просто взяв меньше образцов!

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

Любите учиться?

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