Добавляйте новые инструменты в свой набор инструментов при настройке моделей.

Эта статья защищена платным доступом. Чтобы обойти это, откройте эту закрепленную статью со ссылками на добавление в друзья внутри.

У вас несбалансированный набор данных; вы хотите уменьшить количество ложноотрицательных результатов (FN) или даже ложных срабатываний (FP). Может быть, вам нравятся нестандартные вещи и вы хотите попрактиковаться, добавляя изменения в стандартные модели. Если да, то эта статья для вас.

Один из способов — настроить функцию потерь вашей модели с определенным коэффициентом. Цель этой статьи — показать подходы к настройке в TensorFlow, LightGBM и Catboost. Если вы хотите понять всю идею с соответствующей математикой и увидеть ту же концепцию для XGBoost, посмотрите мою статью на Medium.

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

Я использую набор данных Titanic для демонстрации, потому что он доступен и несбалансирован. Базовые модели, а также индивидуальные модели находятся в моем репозитории GitHub.

LightGBM

Это один из самых эффективных алгоритмов повышения градиента, разработанный Microsoft. Он превосходит XGBoost по скорости и сопоставим по точности. Для получения дополнительной информации см. эту статью от BexBoost. LightGBM — младший брат XGBoost, поэтому у него есть все его достижения.

Я использовал встроенные пользовательские функции, чтобы представить beta в качестве основной части функции logloss (это больше не внешний гиперпараметр).

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

beta должно быть ‹ 1,0, чтобы оштрафовать FN. Чтобы наказать FP, он должен быть больше 1,0. Подробнее читайте в моей статье на Medium.

Есть некоторые отличия от пользовательской функции потерь XGBoost. Во-первых, LightGBM помещает y_pred в формат logit_raw, и требуется преобразование logit. Во-вторых, пользовательская метрика LightGBM выводит три результата (имя пользовательской метрики (например, «logreg_error»), значение метрики и логический параметр, который должен быть установлен False, поскольку наша цель — уменьшить значение пользовательской метрики).

В логит-преобразовании predt есть еще одна интересная деталь; Я использовал функцию np.where, чтобы обеспечить стабильность и избежать переполнения при работе с отрицательными значениями logit_raw. Это упоминается как лучшая практика в различных примерах документации Stackoverflow и моделей.

Давайте построим матрицы путаницы результатов стандартной модели LightGBM и модели с пользовательскими потерями:

Пользовательский лосс с beta‹ 1 привел к росту FP и TP; истощению FN и TN.

CatBoost

Полное название — Категориальный буст, разработанный Яндекс. Он имеет огромное преимущество перед другими алгоритмами, поскольку вам не нужно кодировать категориальные признаки вашего набора данных; вы перечисляете их в модели, и она обрабатывает их самостоятельно. Дмитро Якубовский широко использует его при анализе различных наборов данных (IMDB, вино, пиво и многие другие таблицы со статистикой). CatBoost наследует большинство преимуществ XGBoost и LightGBM.

Вы можете увидеть разницу между реализациями Catboost (с использованием объектно-ориентированного программирования) и LightGBM (стандартная определяемая пользователем функция). Код класса CatBoost я беру из официальной документации. Я добавляю только beta к инициализации класса. Вы можете написать код этих функций в любой удобной для вас форме (ООП или UDF). Выбор ваш!

График результатов:

Логика результатов такая же, как и для модели LightGBM.

ТензорФлоу

Это известное и сверхмощное семейство алгоритмов от Google. Настройка пользовательского лосса здесь — это отдельная история. Вам не нужно явно записывать производные и пользовательскую метрику; "беты" больше нет (betaумер, да здравствует pos_weight!). У TF есть подходящая функция, tf.nn.weighted_cross_entropy_with_logitsкоторая значительно упрощает управление.

pos_weight должно быть > 1,0 для наказания FN и ‹ 1,0 для наказания FP. Ситуация обратная по сравнению с beta. pos_weight — это коэффициент, который умножает FN-часть logloss, а beta — коэффициент FP-части.

График результатов:

Моя пользовательская модель показала довольно плохую производительность, в то время как стандартная модель TF показала отличные результаты; Надеюсь, вы извините меня за плохие результаты, потому что основная цель здесь — демонстрация.

Заключение

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

Преимущества

  • Легко и быстро применять (используйте четыре пользовательские функции и бета-версию, и все).
  • Нет необходимости выполнять манипуляции с базовыми данными перед моделированием (если набор данных не сильно несбалансирован).
  • Его можно применять как часть исследования данных или как часть наложения моделей.
  • Мы можем добавить его в самые популярные пакеты машинного обучения.
  • Со встроенными beta или pos_weight мы могли настраивать их как обычные гиперпараметры.

Ярлыки

  • Мы должны настроить beta, чтобы получить оптимальное соотношение FN и FP.
  • Это может не дать значимых результатов, если набор данных сильно несбалансирован (набор данных, в котором второстепенный класс составляет менее 10% всех выборок). Исследовательский анализ данных жизненно важен для того, чтобы модель работала.
  • Если мы штрафуем FN, это часто приводит к значительному росту FP, и наоборот. Вам могут понадобиться дополнительные ресурсы, чтобы компенсировать этот рост.

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

Оставайтесь в безопасности и будьте здоровы. Не допустить войны.

Ссылки

  1. Обсуждение того, как реализовать LightGBM на Stackoverflow — › https://stackoverflow.com/questions/58572495/how-to-implement-custom-logloss-with-identical-behavior-to-binary-objective-in-l/58573112 №58573112
  2. Официальная документация CatBoost пользовательского лосса -› https://catboost.ai/en/docs/concepts/python-usages-examples#user-defined-loss-function
  3. Официальная документация CatBoost пользовательской метрики -› https://catboost.ai/en/docs/concepts/python-usages-examples#custom-loss-function-eval-metric
  4. Официальная документация TensorFlow по взвешенной кросс-энтропии с логитами — › https://www.tensorflow.org/api_docs/python/tf/nn/weighted_cross_entropy_with_logits
  5. Отличная статья о том, как собрать пользовательские функции потерь в TensorFlow — › https://medium.com/swlh/custom-loss-and-custom-metrics-using-keras-sequential-model-api-d5bcd3a4ff28
  6. Мой репозиторий GitHub со всеми упомянутыми пользовательскими потерями -› https://github.com/kpluzhnikov/binary_classification_custom_loss

Если вам понравился пост, не стесняйтесь ставить лайки, комментировать и делиться им. Или даже: