Как сделать вашу модель классной с Optuna

Легко и эффективно оптимизируйте гиперпараметры модели

Оптимизация гиперпараметров - один из важнейших шагов в обучении моделей машинного обучения. Из-за множества параметров, которые необходимо оптимизировать, длительного времени обучения и множественных сверток для ограничения утечки информации, это может быть обременительным делом. Есть несколько методов решения проблемы: поиск по сетке, случайный поиск и байесовские методы. Optuna - это реализация последнего.

Уилл Кёрсен написал отличную статью об оптимизации гиперпараметров с помощью байесовских суррогатных моделей. Я не могу объяснить это лучше :) Вы можете найти это здесь. Во второй статье Уилл представляет, как реализовать метод с пакетом Hyperopt на Python.

О Optuna

Пакет был и остается разработан японской компанией искусственного интеллекта Preferred Networks. Во многом Optuna похожа на Hyperopt. Так зачем тебе беспокоиться? Причин несколько:

  • Можно указать, как долго должен длиться процесс оптимизации.
  • Интеграция с Pandas DataFrame
  • Алгоритм использует обрезку, чтобы досрочно отбрасывать пробные версии низкого качества.
  • Это относительно новый проект, и разработчики продолжают над ним работать.
  • Использовать было проще, чем Hyperopt (по крайней мере, для меня)

Пример пошагового руководства

Данные

Для подготовки эксперимента я использовал набор данных из 20 групп новостей из Scikit-Learn. Вы можете найти импорт данных ниже:

Модель

Это проблема обработки естественного языка, и конвейер модели содержит этап извлечения признаков и классификатор. Код конвейера выглядит следующим образом:

Исследование оптимизации

Созданное исследование оптимизирует как шаг векторизации, так и гиперпараметры модели. Можно выбрать один из 5 дистрибутивов:

  • uniform - значения с плавающей запятой
  • log-uniform - значения с плавающей запятой
  • дискретная единообразная - значения с плавающей запятой с интервалами
  • integer - целочисленные значения
  • категоричный - категориальные значения из списка

Синтаксис выглядит так:

Затем значения передаются в словарь параметров, а затем устанавливаются в оптимизированную модель. Значения можно было бы предложить внутри словаря, но это сделало бы строки кода очень длинными и трудными для чтения.

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

Учтите, что с 24 февраля 2019 г. можно только минимизировать значение функции. Цель максимизации еще не реализована, поэтому, если вы хотите найти максимальное значение, просто поставьте перед ним минус.

Я также добавил строку, выгружающую исследование в файл рассола. Это позволяет вам сохранить прогресс, даже если процесс каким-то образом прерван (по вашему решению или вашей машине). Вы можете найти код целей ниже:

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

Обратите внимание, что отображаются лучшие гиперпараметры на данный момент.

Вы можете получить доступ к наилучшему значению показателя и словарю наилучших параметров с помощью атрибутов best_value и best_params соответственно. Вы можете получить доступ к испытаниям с атрибутом испытаний, но создатели Optuna подготовили кое-что получше. Используйте метод trials_dataframe (), чтобы создать фрейм данных Pandas с подробностями испытаний.

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

Чтобы визуализировать текущий процесс, вы можете получить доступ к файлу pickle из другого потока Python (например, Jupyter Notebook).

Вы можете найти блокнот с примерами и блокнот визуализации в этом репозитории GitHub.

Техника обрезки

Создатели Optuna заявляют, что пакет превосходит Hyperopt с точки зрения скорости и качества. Вот что они пишут об этом на странице проекта:

Функция обрезки автоматически останавливает бесперспективные испытания на ранних этапах обучения (также известное как автоматическая ранняя остановка). Optuna предоставляет интерфейсы для лаконичной реализации механизма сокращения в алгоритмах итеративного обучения.

[…]

Например, наш тестовый эксперимент демонстрирует преимущество функции сокращения по сравнению с существующей структурой оптимизации.

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

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

Резюме

Для меня Optuna становится оптимизационным фреймворком первого выбора. Он прост в использовании, позволяет установить тайм-аут исследования, продолжить исследование после перерыва и легко получить доступ к данным. Проект все еще находится в разработке, и я с нетерпением жду новых функций. Я думаю, что команда Preferred Networks проделала и продолжает отлично работать! Спасибо!

Ресурсы:

Мы будем рады вашим отзывам об этой статье! Пожалуйста, дайте мне знать, что вы думаете!