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

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

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

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

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

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

Генерация весов классов

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

В задаче с несколькими классами или метками частота должна быть рассчитана для каждого класса. Для этого библиотека Python scikit-learn предлагает метод compute_class_weight, который принимает на вход полный массив классов и набор уникальных меток классов. Если аргумент вес_класса равен Нет, веса классов будут одинаковыми, с другой стороны, если задано значение сбалансированный, веса выходных классов будут соответствовать формуле:

n_samples / (n_classes * np.bincount (y))

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

Результатом этого метода будет словарь в формате {class_label: class_weight}, который требуется для использования с TensorFlow.

Использование весов классов в модели с одним выходом с TensorFlow Keras

В простой модели, содержащей единственный выход, Tensorflow предлагает параметр с именем class_weight в model.fit (), который позволяет напрямую указывать веса для каждого из целевых классов. Следовательно, это так же просто, как предоставить выходные данные из ранее представленного метода generate_class_weights.

В приведенном ниже фрагменте кода показан пример использования параметра class_weight для обучения модели TensorFlow Keras на наборе рукописных цифр MNIST.

Использование весов классов в модели с несколькими выходами с TensorFlow Keras

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

В приведенном примере функциональный API Keras используется для построения модели с несколькими выходами (просто путем предоставления одной и той же метки дважды в качестве входных данных) и для обоих выходов взвешенная категориальная кросс-энтропия используется как одна из самых распространенных потерь, представленная в Keras Issue Мортеном Грёфтехауге.

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

Выводы

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

Чтобы использовать это решение, сначала представлен подход к генерации весов классов с учетом набора классов в формате нескольких классов или нескольких меток. Далее следуют два подхода к использованию этих весов классов при обучении на несбалансированном наборе данных с использованием TensorFlow, как в случае модели с одним и несколькими выходами.

Если вы хотите найти больше подобных сообщений, вы можете найти меня по адресу: