HyperOpt: настройка гиперпараметров на основе байесовской оптимизации

Опубликовано: 24/01/2021 Время на прочтение: 8 минут

Рисунок 1. Типичная архитектура HyperOpt | Изображение автора | Иконки взяты у Виталия Горбачева, Freepick

Поиск оптимальной конфигурации гиперпараметров для данной функции не должен полностью основываться на интуиции или опыте некоторых. Напротив, поиск такой оптимальной конфигурации должен поддерживаться подходами, гарантирующими такую оптимальность. Среди стольких подходов мы можем найти некоторые, основанные на исчерпывающем поиске (например, поиск по сетке и случайный поиск [1]), или в рамках парадигмы оптимизации, такой как генетические алгоритмы (например, TPOT [2]) и байесовская оптимизация [3].

Давайте поговорим о HyperOpt , инструменте, который был разработан для автоматизации поиска оптимальной конфигурации гиперпараметров на основе байесовской оптимизации и поддерживается методологией SMBO (последовательная глобальная оптимизация на основе моделей). Итак, этот блог будет разделен следующим образом:

  • Что такое HyperOpt?
  • Что такое HyperOpt-Sklearn?
  • HyperOpt на практике
  • HyperOpt-Sklearn на практике

Что такое HyperOpt?

HyperOpt — это библиотека Python с открытым исходным кодом, созданная Джеймсом Бергстра в 2011 году [4]. HyperOpt — это инструмент, позволяющий автоматизировать поиск оптимальных гиперпараметров модели машинного обучения. HyperOpt основан на байесовской оптимизации, поддерживаемой методологией SMBO, адаптированной для работы с различными алгоритмами, такими как: дерево оценок парзена ( TPE ), адаптивное дерево оценок парзена ( ATPE ) и гауссовские процессы ( GP ) [5].

Подход байесовской оптимизации фокусируется на вероятностной модели P (оценка | конфигурация), которая обновляется посредством итеративного процесса запроса истории «H» (оценка, конфигурация), целью которой является максимизация оценки при заданной конфигурации «c». ». HyperOpt берет за основу байесовскую оптимизацию , внося некоторые изменения в процесс выборки, определение и сужение области поиска и алгоритмов для максимизации вероятностной модели [4].

HyperOpt требует 4 основных компонента для оптимизации гиперпараметров: пространство поиска, функция потерь, алгоритм оптимизации и база данных для хранения истории (оценка, конфигурация). Пространство поиска будет определяться непрерывной и выпуклой функцией. Функция потерь — это функция, которую необходимо оптимизировать, которая получается путем оценки модели с конфигурацией «c». Алгоритм оптимизации основан на методологии SMBO с вариантами, заданными алгоритмами GP , TPE и ATPE . База данных «H» хранит набор кортежей (оценка, конфигурация), полученных в результате итераций алгоритма оптимизации. На рисунке 2 мы видим графическое описание того, как работает HyperOpt .

Рисунок 2. Типичное поведение HyperOpt | Изображение автора

Учитывая удобство использования и масштабируемость HyperOpt , было создано расширение, которое включает в себя различные компоненты scikit-learn для оптимизации конвейеров машинного обучения с большим количеством параметров, это расширение называется HyperOpt-Sklearn, о котором мы поговорим в следующем разделе, давайте Действуй!

Что такое HyperOpt-Sklearn?

HyperOpt-Sklearn был представлен в 2014 году [6]. HyperOpt-Sklearn построен на основе HyperOpt и предназначен для работы с различными компонентами пакета scikit-learn . HyperOpt-Sklearn был создан с целью оптимизации конвейеров машинного обучения, уделяя особое внимание этапам преобразования данных, выбора модели и оптимизации гиперпараметров. HyperOpt-Sklearn объединяет преимущества HyperOpt с удобством использования и гибкостью фреймворка scikit-learn , в этом смысле HyperOpt-Sklearn предназначен для решения задач классификации и регрессии. На рисунке 3 мы видим компоненты конвейера машинного обучения, оптимизированного HyperOpt-Sklearn .

Рисунок 3. Компоненты конвейера машинного обучения, оптимизированные HyperOpt-Sklearn | Изображение автора

Короче говоря, HyperOpt был разработан для оптимизации гиперпараметров одной или нескольких заданных функций в рамках парадигмы байесовской оптимизации . С другой стороны, HyperOpt-Sklearn был разработан для оптимизации различных компонентов конвейера машинного обучения с использованием HyperOpt в качестве ядра и использования различных компонентов из набора scikit-learn . Теперь посмотрим, как мы их используем на практике.

HyperOpt на практике

Теперь, когда мы понимаем, как работает HyperOpt и каковы его компоненты, давайте рассмотрим базовую реализацию. В этом примере мы собираемся использовать функцию, показанную на рисунке 4. Как мы видим, минимум функции дается, когда значение x = -0,5. Посмотрим, как найти это значение в HyperOpt .

Рисунок 4. Пример функции для оптимизации с HyperOpt | Изображение автора

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

Фрагмент кода 1. Реализация HyperOpt

Как мы видим, мы определяем каждый компонент, который требуется HyperOpt для оптимизации фиктивной функции. В строке 7 выполняется определение оптимизируемой функции. В строке 11 выполняется определение пространства поиска, в этом случае только одно пространство поиска было определено для значения «x», однако для функций с более чем одной переменной потребуется определить пространство поиска для каждая переменная, равно как и такое пространство поиска, будет зависеть от типа оптимизируемой функции. В этом случае для дидактических целей пространство поиска было определено от -2 до 2. Наконец, в строке 18 инициализируется класс, в котором выполняется процесс оптимизации. Такая функция получает в качестве параметров оптимизируемую функцию, пространство поиска, алгоритм оптимизации (в данном случае это древовидная структура оценщиков Парзена) и количество итераций. При выполнении предыдущего фрагмента кода мы получаем значение «x», которое оптимизирует функцию:

Оптимальное значение x: {'x': -0.5000806428004325}

Предыдущая реализация — это базовый пример того, как работает HyperOpt и каковы его основные компоненты. Оптимизация более сложных функций потребует адекватного определения пространства поиска, а также оптимизатора. HyperOpt предоставляет набор инициализаторов пространства поиска, которые вы можете найти здесь.

Отлично, мы уже видели, как HyperOpt работает в базовой реализации, теперь давайте посмотрим, как HyperOpt-Sklearn работает для оптимизации конвейера машинного обучения.

HyperOpt-Sklearn на практике

Способ реализации HyperOpt-Sklearn очень похож на HyperOpt. Поскольку HyperOpt-Sklearn ориентирован на оптимизацию конвейеров машинного обучения, требуются 3 основных параметра: тип препроцессора, модель машинного обучения (то есть классификатор или регрессор) и оптимизатор. Важно отметить, что каждый из этих трех основных элементов настраивается в соответствии с потребностями каждой проблемы.

В HyperOpt Sklearn адаптированы препроцессоры : PCA, TfidfVectorizer, StandardScalar, MinMaxScalar, Normalizer, OneHotEncoder. Классификаторы приспособленных в HyperOpt Sklearn являются: В, LinearSVC KNeightborsClassifier. RandomForestClassifier, ExtraTreesClassifier SGDClassifier, MultinomialNB, BernoulliRBM, ColumnKMeans.

Для целей этого блога давайте рассмотрим две основные реализации HyperOpt-Sklearn в задаче классификации. В этом примере мы будем работать с хорошо известным набором данных о раке груди.

Фрагмент кода 2. HyperOpt-Sklearn для классификации

Как мы видим, в строке 22 мы определяем классификатор, который будет реализован, в этом случае инструкция заключается в поиске по всем классификаторам, определенным HyperOpt-Sklearn (на практике это не рекомендуется из-за времени вычисления, необходимого для оптимизация, поскольку это практический пример, выполнение полного поиска не является определяющим фактором). В строке 23 определяется тип преобразования, которое будут получать данные, в данном случае инструкция по использованию полного набора преобразователей, реализованных HyperOpt-Sklearn (как вы можете догадаться, тестируются только те, которые соответствуют набору данных, например текстовые преобразователи не применяются к числовому набору данных). В строке 24 определен оптимизатор, в данном случае TPE . Остальные строки определяют количество итераций и ограничение по времени для каждой оценки.

При выполнении фрагмента кода 2 получаем

Счет поезда: 0.9723618090452262
Результат теста: 0.9824561403508771

Оптимальная конфигурация:

{'учащийся': ExtraTreesClassifier ( max_features = None, min_samples_leaf = 9, n_estimators = 19, n_jobs = 1, random_state = 3, verbose = False), ' preprocs ': ( MinMaxScaler ( feature_range = (- 1.0, 1.0)),) , ' ex_preprocs ': ()}

Итак, мы получили оптимальную конфигурацию, выполнив поиск по всему спектру, который HyperOpt-Sklearn покрывает для проблемы классификации. Теперь посмотрим, как сузить область поиска с помощью определенного классификатора.

В этом примере мы также будем использовать набор данных рака груди. Однако на этот раз мы будем использовать один классификатор, каждый из параметров которого мы попытаемся оптимизировать, определяя пространство поиска для каждого из них.

Фрагмент кода 3. HyperOpt для классификации и настройки классификатора SGD

В этом примере мы используем SGD в качестве классификатора, для которого мы хотим оптимизировать параметр потерь, а также значение альфа. Как мы видим, в строке 23 мы определяем пространство поиска для потерь, такое пространство поиска определяется тремя разными значениями (шарнир, журнал, huber) со значением вероятности, которое учитывается при выборе одного из этих трех значений. С другой стороны, в строке 29 мы определяем пространство поиска для альфа-значения, в этом случае реализована функция журнала, которая ограничена нижним и верхним пределом. Наконец, в строке 33 определяется класс, в котором будет выполняться процесс оптимизации. Параметры, которые он получает, — это классификатор (с соответствующими параметрами и пространствами поиска), оптимизатор, количество итераций и назначенное время для каждой оценки.

При выполнении фрагмента кода 3 получаем

Счет поезда: 0,9522613065326633
Результат теста: 0.9473684210526315

Найдена оптимальная конфигурация:

{'учащийся': SGDClassifier ( альфа = 0,08612797536101766, class_weight = 'сбалансированный', eta0 = 6,478871110431366e-05, l1_ratio = 0,20803307323675568, Learning_rate = 'invscaling', loss = 'log', max_iter = 18547873.0, n_jot = 18547873.0 , n_joy 0,1770890191026292, random_state = 0, tol = 0,000332542442869532, verbose = False),
'preprocs': ( PCA ( n_components = 8),), ' ex_preprocs ': ()}

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

Заключение

В этом блоге мы увидели, что такое HyperOpt , его назначение, как он работает и каковы его основные компоненты. Точно так же мы увидели одно из основных расширений HyperOpt, а именно HyperOpt-Sklearn , его компоненты и принципы работы.

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

Рекомендации

[1] Настройка гиперпараметров оценщика

[2] TPOT: Оптимизация конвейеров с помощью генетических алгоритмов

[3] Учебное пособие по байесовской оптимизации

[4] Создание науки о поиске моделей: оптимизация гиперпараметров в сотнях измерений для архитектур Vision

[5] Алгоритмы оптимизации гиперпараметров

[6] Hyperopt-Sklearn: автоматическая настройка гиперпараметров для Scikit-Learn



прокрутка вверх