Несбалансированность классов - распространенная проблема при обучении моделей машинного обучения. Вот возможное решение путем создания весов классов и способы их использования в моделях с одним и несколькими выходами.
Несбалансированность классов часто встречается при разработке моделей для реальных приложений. Это происходит, когда с одним классом связано значительно больше экземпляров, чем с другим.
Например, в проекте Моделирование кредитного риска, если смотреть на статус ссуд в исторических данных, большая часть выданных ссуд, вероятно, была выплачена полностью. Если используются модели, подверженные дисбалансу классов, невыплаченные ссуды, вероятно, не будут иметь большого значения в процессе обучения, поскольку общие убытки продолжают уменьшаться, когда модель фокусируется на большинстве классов.
Чтобы модель уделяла больше внимания примерам, в которых ссуда не выплачивалась, можно использовать веса классов, чтобы ошибка прогноза была больше, когда экземпляр недостаточно представленного класса классифицирован неправильно.
Помимо использования весов классов, существуют и другие подходы к устранению дисбаланса классов, такие как передискретизация и недостаточная выборка, двухэтапное обучение или использование более репрезентативных потерь . Однако в этой статье основное внимание будет уделено тому, как рассчитать и использовать веса классов при обучении модели машинного обучения, поскольку это очень простой и эффективный метод устранения дисбаланса.
Во-первых, я расскажу вам, как сгенерировать веса классов из вашего набора данных, а затем как использовать их как в модели с одним, так и с несколькими выходами.
Генерация весов классов
В бинарной классификации веса классов могут быть представлены просто путем вычисления частоты положительного и отрицательного класса, а затем ее инвертирования так, чтобы при умножении на потерю класса, недопредставленный класс имел гораздо более высокую ошибку, чем класс большинства.
В задаче с несколькими классами или метками частота должна быть рассчитана для каждого класса. Для этого библиотека 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, как в случае модели с одним и несколькими выходами.
Если вы хотите найти больше подобных сообщений, вы можете найти меня по адресу: