Методы гиперпараметрической оптимизации.

Альтернативные методы оптимизации гиперпараметров, которые вам необходимо знать - Часть 1

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

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

Что такое оптимизация гиперпараметров?

Прежде чем я определю оптимизацию гиперпараметров, вам нужно понять, что такое гиперпараметр. Вкратце, гиперпараметры - это разные значения параметров, которые используются для управления процессом обучения и оказывают значительное влияние на производительность моделей машинного обучения. Примером гиперпараметров в алгоритме случайного леса является количество оценок (n_estimators), максимальная глубина (max_depth) и критерий. Эти параметры настраиваются и могут напрямую влиять на качество обучения модели.

Тогда оптимизация гиперпараметров - это процесс поиска правильной комбинации значений гиперпараметров для достижения максимальной производительности данных за разумный промежуток времени. Он играет жизненно важную роль в точности прогнозирования алгоритма машинного обучения. Поэтому оптимизация гиперпараметров считается самой сложной частью построения моделей машинного обучения.

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

Хороший выбор гиперпараметров действительно может заставить алгоритм сиять.

Есть несколько распространенных стратегий оптимизации гиперпараметров:

(а) Поиск по сетке

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

NB: Вы можете узнать, как реализовать поиск по сетке здесь.

(б) Случайный поиск

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

NB: Вы можете узнать больше о реализации случайного поиска здесь.

Альтернативные методы оптимизации гиперпараметров.

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

  • Hyperopt
  • Scikit Optimize
  • Optuna

В этой статье я остановлюсь на реализации Hyperopt.

Если вы не выполняете оптимизацию гиперпараметров, вам нужно начать прямо сейчас.

Что такое Гиперопт

Hyperopt - мощная библиотека Python для оптимизации гиперпараметров, разработанная James Bergstra. Hyperopt использует форму байесовской оптимизации для настройки параметров, которая позволяет вам получить наилучшие параметры для данной модели. Он может оптимизировать модель с сотнями параметров в большом масштабе.



Особенности Hyperopt

Hyperopt содержит 4 важные функции, которые вам необходимо знать, чтобы запустить первую оптимизацию.

(а) Пространство поиска

Hyperopt имеет разные функции для указания диапазонов для входных параметров, это пространства стохастического поиска. Наиболее распространенные варианты выбора пространства поиска:

  • hp.choice (метка, параметры) - может использоваться для категориальных параметров, он возвращает один из вариантов, который должен быть списком или кортежем. Пример: hp.choice («критерий», [ «Джини», «энтропия»,])
  • hp.randint (label, upper) - можно использовать для целочисленных параметров, он возвращает случайное целое число в диапазоне (0, верхний). Пример: hp.randint («max_features», 50)
  • hp.uniform (label, low, high) - возвращает значение от low до high. Пример: hp.uniform ('max_leaf_nodes', 1,10)

Другой вариант, который вы можете использовать:

  • hp.normal (label, mu, sigma) - возвращает реальное значение, которое нормально распределено со средним mu и сигмой стандартного отклонения.
  • hp.qnormal (label, mu, sigma, q) - возвращает такое значение, как round (normal (mu, sigma) / q) * q
  • hp.lognormal (label, mu, sigma) - возвращает значение, выведенное в соответствии с exp (normal (mu, sigma))
  • hp.qlognormal (label, mu, sigma, q) - возвращает значение вида round (exp (normal (mu, sigma)) / q) * q

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

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

(б) Целевая функция

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

(c) fmin

Функция fmin - это функция оптимизации, которая выполняет итерацию по различным наборам алгоритмов и их гиперпараметрам, а затем минимизирует целевую функцию. fmin принимает 5 входов, которые: -

  • Целевая функция для минимизации
  • Определенное пространство поиска
  • Используемые алгоритмы поиска, такие как случайный поиск, TPE (Tree Parzen Estimators) и Adaptive TPE.
    NB: hyperopt.rand.suggest и hyperopt.tpe.suggest обеспечивают логику для последовательного поиска в пространстве гиперпараметров.
  • Максимальное количество оценок.
  • Объект испытаний (необязательно).

Пример:

(d) Объект исследования

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

После понимания важных функций Hyperopt способ использования Hyperopt описан в следующих шагах.

  • Инициализируйте пространство для поиска.
  • Определите целевую функцию.
  • Выберите алгоритм поиска для использования.
  • Запустите функцию hyperopt.
  • Проанализируйте результаты оценки, хранящиеся в объекте испытаний.

Гиперпот на практике

Теперь, когда вы знаете важные функции Hyperopt, в этом практическом примере мы будем использовать Набор данных о мобильных ценах, и задача состоит в том, чтобы создать модель, которая предсказывает, насколько высока цена на мобильный телефон 0 ( низкая стоимость) или 1 (средняя стоимость), или 2 (высокая стоимость) или 3 (очень высокая стоимость).

Установить Hyperopt

Вы можете установить hyperopt из PyPI.

pip install hyperopt

Затем импортируйте важные пакеты, включая Hyperopt.

Набор данных

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

Проверьте первые пять строк набора данных.

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

Давайте посмотрим на форму набора данных.

(2000, 21)

В этом наборе данных 2000 строк и 21 столбец. Теперь давайте разберемся со списком функций, которые есть в этом наборе данных.

['battery_power', 'blue', 'clock_speed', 'dual_sim', 'fc', 'four_g', 'int_memory', 'm_dep', 'mobile_wt', 'n_cores', 'pc', 'px_height', ' px_width ',' ram ',' sc_h ',' sc_w ',' talk_time ',' three_g ',' touch_screen ',' wifi ',' price_range ']

Вы можете найти значение имени каждого столбца здесь.

Разделение набора данных на целевой объект и независимые объекты

Это проблема классификации, затем мы разделим целевой объект и независимые объекты из набора данных. Наша целевая функция - диапазон_цен.

Предварительная обработка набора данных.

Затем стандартизируйте независимые функции с помощью метода StandardScaler из scikit-learn.

Определите пространство параметров для оптимизации

Мы будем использовать три гиперпараметра алгоритма случайного леса: n_estimators, max_depth и критерий.

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

Определение функции для минимизации (целевая функция)

Наша функция минимизации называется hyperparamter_tuning, а алгоритм классификации для оптимизации ее гиперпараметра - Случайный лес. Я использую перекрестную проверку, чтобы избежать переобучения, а затем функция возвращает значения потерь и их статус.

NB: Помните, что hyperopt минимизирует функцию, поэтому я добавляю отрицательный знак в acc:

Точная настройка модели

Наконец, сначала создайте экземпляр объекта Trial, настройте модель, а затем распечатайте лучшие потери с его значениями гиперпараметров.

100% | █████████████████████████████████████████████ ██████████ | 100/100 [10:30 ‹00:00, 6.30 с / испытание, лучший проигрыш: -0,8915] Лучшее: {‘ критерий ’: 1,‘ max_depth ’: 11.0,‘ n_estimators ’: 2}.

После оптимизации гиперпараметров потеря -0,8915 означает, что производительность модели имеет точность 89,15% при использовании n_estimators = 300, max_depth = 11 и критерия = «Энтропия» в классификаторе случайного леса.

Анализируйте результаты с помощью объекта испытаний

Объект испытаний может помочь нам проверить все возвращаемые значения, которые были вычислены во время эксперимента.

(a) trials.results
Здесь отображается список словарей, возвращенных параметром "objective" во время поиска.

trials.results

[{'loss': -0.8790000000000001, 'status': 'ok'}, {'loss': -0.877, 'status »:' ok '}, {' loss ': -0.768,' status ':' ok ' }, {'loss': -0.8205, 'status': 'ok'}, {'loss': -0.8720000000000001, 'status': 'ok'}, {'loss': -0.883, 'status': 'ok '}, {' loss ': -0.8554999999999999,' status ':' ok '}, {' loss ': -0.8789999999999999,' status ':' ok '}, {' loss ': -0.595,' status ':' Ok'},…….]

(b) trials.losses ()
Здесь отображается список потерь (число с плавающей запятой для каждого "ok" испытания).

trials.losses()

[-0.8790000000000001, -0.877, -0.768, -0.8205, -0.8720000000000001, -0.883, -0.8554999999999999, -0.8789999999999999, -0.595, -0.8765000000000001, -0.877, ………]

(c) trials.statuses ()
Здесь отображается список строк состояния.

trials.statuses()

[‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ……….]

NB: этот пробный объект можно сохранить, передать во встроенные процедуры построения графиков или проанализировать с помощью вашего собственного кода.

Заключение

Поздравляем, вы дочитали до конца эту статью!

Вы можете скачать набор данных и записные книжки, использованные в этой статье, здесь:
https://github.com/Davisy/Hyperparameter-Optimization-Techniques

Что дальше?

Во второй части я расскажу о втором альтернативном методе оптимизации гиперпараметров, который называется Scikit-Optimize.

Обновления: теперь доступна вторая часть серии. Нажмите здесь, чтобы прочитать.

Если вы узнали что-то новое или вам понравилось читать эту статью, поделитесь ею, чтобы ее увидели другие. А пока до встречи во второй части !. Со мной также можно связаться в Twitter @Davis_McDavid

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel