Добавляйте новые инструменты в свой набор инструментов при настройке моделей.
Эта статья защищена платным доступом. Чтобы обойти это, откройте эту закрепленную статью со ссылками на добавление в друзья внутри.
У вас несбалансированный набор данных; вы хотите уменьшить количество ложноотрицательных результатов (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. Кроме того, вы можете использовать эти примеры в качестве отправной точки для разработки вашей функции.
Оставайтесь в безопасности и будьте здоровы. Не допустить войны.
Ссылки
- Обсуждение того, как реализовать LightGBM на Stackoverflow — › https://stackoverflow.com/questions/58572495/how-to-implement-custom-logloss-with-identical-behavior-to-binary-objective-in-l/58573112 №58573112
- Официальная документация CatBoost пользовательского лосса -› https://catboost.ai/en/docs/concepts/python-usages-examples#user-defined-loss-function
- Официальная документация CatBoost пользовательской метрики -› https://catboost.ai/en/docs/concepts/python-usages-examples#custom-loss-function-eval-metric
- Официальная документация TensorFlow по взвешенной кросс-энтропии с логитами — › https://www.tensorflow.org/api_docs/python/tf/nn/weighted_cross_entropy_with_logits
- Отличная статья о том, как собрать пользовательские функции потерь в TensorFlow — › https://medium.com/swlh/custom-loss-and-custom-metrics-using-keras-sequential-model-api-d5bcd3a4ff28
- Мой репозиторий GitHub со всеми упомянутыми пользовательскими потерями -› https://github.com/kpluzhnikov/binary_classification_custom_loss
Если вам понравился пост, не стесняйтесь ставить лайки, комментировать и делиться им. Или даже: