Как сделать вашу модель классной с 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 проделала и продолжает отлично работать! Спасибо!
Ресурсы:
- Сайт проекта: https://optuna.org/
- Репозиторий проекта на GitHub: https://github.com/pfnet/optuna
- Примеры блокнотов: https://github.com/PiotrekGa/optuna_article
- Концептуальное объяснение байесовской оптимизации гиперпараметров для машинного обучения: https://towardsdatascience.com/a-conceptual-explanation-of-bayesian-model-based-hyperparameter-optimization-for-machine-learning -b8172278050f
- Автоматическая настройка гиперпараметров машинного обучения в Python: https://towardsdatascience.com/automated-machine-learning-hyperparameter-tuning-in-python-dfda59b72f8a
Мы будем рады вашим отзывам об этой статье! Пожалуйста, дайте мне знать, что вы думаете!