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

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

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

Есть несколько методов, которые можно использовать для HPO. Мы обсудим некоторые из них, а именно:

  • Случайный поиск
  • Поиск по сетке
  • Байесовская оптимизация
  • Генетические алгоритмы

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

  • критерий: функция для измерения качества разделения. «джини» для примеси Джини и «энтропия» для прироста информации
  • max_depth: максимальная глубина дерева
  • min_samples_split: минимальное количество сэмплов, необходимое в узле, чтобы вызвать разделение узла.
  • n_estimators: количество деревьев в ансамбле
  • max_features: максимальное количество функций, учитываемых при разделении узла.
  • и т. д.

Мы можем прочитать полную документацию по гиперпараметрам Random Forest Classifier на странице Scikit-learn. Мы предполагаем, что мы уже разделили набор данных на 'X_train, X_test, y_train, y_test' с помощью train_test_split, а также уже импортировали'Random Forest Классификатор».

Итак, без лишних слов давайте перейдем к каждой технике!

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

Случайный поиск является одним из методов оптимизации черного ящика без использования моделей. Этот метод работает путем произвольной выборки конфигураций случайного поиска до тех пор, пока не будет исчерпан определенный бюджет на поиск. По сравнению с поиском по сетке этот метод работает лучше, когда одни гиперпараметры гораздо важнее других. При выполнении оценок функции B с фиксированным бюджетом количество различных значений, которые поиск по сетке может позволить оценить для каждого из Nгиперпараметров, составляет только B^(1 /N),тогда как случайный поиск будет исследовать Bразличных значений для каждого.

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

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

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

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

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

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

Поскольку было бы слишком сложно, если бы мы попытались использовать поиск по сетке с первого раза, мы продолжим с результатов случайного поиска выше, которые сужают пространство. Мы будем использовать "rf_randomcv.best_params_", чтобы получить возможное наилучшее значение, полученное в результате случайного поиска.

После определения пространства поиска мы продолжим подгонку модели.

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

Байесовская оптимизация

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

Мы можем реализовать функцию fmin с тремя основными параметрами:

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

Определив целевую функцию и пространство предметной области, мы вызовем ее в функцию fmin.

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

Генетический алгоритм

Генетический алгоритм — один из распространенных биологических алгоритмов, основанный на эволюционной теории, согласно которой люди с лучшими способностями к выживанию и адаптации к окружающей среде с большей вероятностью выживут и передадут свои способности будущим поколениям. Следующее поколение унаследует характеристики своих родителей и может включать в себя лучших и худших людей. У лучших особей будет больше шансов выжить и родить больше потомства, а худшие постепенно исчезнут. Через несколько поколений особи с наилучшей приспособляемостью будут определены как глобальные оптимумы.

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

Заключение

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

Спасибо, что прочитали! 😁

Использованная литература: