Методы настройки гиперпараметров - сеточный, случайный или байесовский поиск?

Практическое руководство по оптимизации гиперпараметров с использованием трех методов: сеточного, случайного и байесовского поиска (со skopt)

Когда я работал над своим последним проектом, у меня появился новый блок данных после, когда я обучил первую версию модели. В тот день я почувствовал себя немного ленивым и попытался переобучить мою модель с новыми данными, используя тот же тип модели и гиперпараметры. К сожалению, это не оправдало моих ожиданий. Вместо улучшения из-за увеличения объема данных он работал немного хуже. Добавленные данные были распределены иначе, чем данные, которые у меня были раньше, и их количество не было незначительным по сравнению с исходным, вопреки моим ожиданиям.

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

Чего вам следует ожидать от этого поста?

  1. Введение в настройку гиперпараметров.
  2. Пояснения к методам поиска гиперпараметров.
  3. Примеры кода для каждого метода.
  4. Сравнение и выводы.

Для всех примеров в посте я использовал набор данных прогнозирования-анализа-сердечного приступа Кагглса.

Я подготовил простой конвейер, который используется во всех примерах.

Что такое настройка гиперпараметров и почему она важна?

Гиперпараметры - это переменные алгоритма, которые контролируют его поведение в целом. Это влияет на его скорость, разрешение, структуру и, в конечном итоге, на производительность. Иногда это имеет лишь небольшой эффект, но в других случаях он имеет решающее значение. Хорошим примером является скорость обучения. Когда он слишком велик, обучение оказывается недостаточно чувствительным, и результаты модели нестабильны. Но когда она слишком мала, модель плохо обучается и может застрять.

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

Типы гиперпараметрического поиска

Существует три основных метода поиска гиперпараметров:

  1. Поиск по сетке
  2. Рандомизированный поиск
  3. Байесовский поиск

Поиск по сетке

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

В следующем примере я попытался найти лучшие значения для learning_rate (5 значений), max_depth (5 значений) и n_estimators (5 значений). values) - всего 125 итераций.

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

В отличие от поиска по сетке, при случайном поиске проверяется только часть значений параметров. Значения параметров берутся из заданного списка или указанного распределения. Количество выбираемых настроек параметров задается параметром n_iter. Выборка без замены выполняется, когда параметры представлены в виде списка (как поиск по сетке). Но если параметр задан как распределение, используется выборка с заменой (рекомендуется).

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

В следующем примере я использовал распределения параметров для выборки с заменой.

Байесовский поиск

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

То же, что и в примере случайного поиска, я использовал в этом примере распределения параметров для выборки:

Визуализация поиска параметров - скорость обучения

Лучший параметр скорости обучения в этом сравнении - 0,008 (найдено байесовским поиском).

Визуализация среднего балла для каждой итерации

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

Обсуждение и выводы

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

Для дальнейшего чтения по этой теме я рекомендую прочитать следующий отличный пост: https://towardsdatascience.com/a-conceptual-explanation-of-bayesian-model-based-hyperparameter-optimization-for-machine-learning-b8172278050f .

Удачи!