Что такое grid search

Обновлено: 06.07.2024

В этом руководстве мы обсудим поиск по сетке с целью настройки гиперпараметров. Мы также узнаем о работе Grid Search и его реализации для оптимизации производительности метода машинного обучения (ML).

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

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

Что обозначает поиск по сетке в Python?

Будем считать, что модель принимает следующие три параметра в виде входных данных:

  1. Количество скрытых слоев [2, 4]
  2. Количество нейронов в каждом слое [5, 10]
  3. Количество эпох [10, 50]

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

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

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

Установка необходимых библиотек

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

  1. Python 3;
  2. NumPy;
  3. Pandas;
  4. Keras;
  5. Scikit-Learn.

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

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

Теперь давайте приступим к реализации поиска по сетке в Python.

Часто наборы данных, с которыми приходится работать, содержат большое количество признаков, число которых может достигать нескольких сотен и даже тысяч. При построении модели машинного обучения не всегда понятно, какие из признаков действительно для неё важны (т.е. имеют связь с целевой переменной), а какие являются избыточными (или шумовыми). Удаление избыточных признаков позволяет лучше понять данные, а также сократить время настройки модели, улучшить её точность и облегчить интерпретируемость. Иногда эта задача и вовсе может быть самой значимой, например, нахождение оптимального набора признаков может помочь расшифровать механизмы, лежащие в основе исследуемой проблемы. Это может быть полезным для разработки различных методик, например, банковского скоринга, поиска фрода или медицинских диагностических тестов. Методы отбора признаков обычно делят на 3 категории: фильтры (filter methods), встроенные методы (embedded methods) и обёртки (wrapper methods). Выбор подходящего метода не всегда очевиден и зависит от задачи и имеющихся данных. Цель настоящего цикла статей - провести краткий обзор некоторых популярных методов отбора признаков с обсуждением их достоинств, недостатков и особенностей реализации. Первая часть посвещена фильтрам и встроенным методам.

1. Методы фильтрации

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

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

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

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

Вариативность (удаляются признаки, состоящие из одного значения).

Оценка важности признаков с помощью lightgbm (удаляются признаки, имеющие низкую важность в модели lightgbm. Следует применять только если lightgbm имеет хорошую точность.)

Туториал по этой библиотеке находится здесь.

Более сложные методы автоматического отбора признаков реализованы в sklearn. VarianceThreshold отбирает признаки, у которых дисперсия меньше заданного значения. SelectKBest и SelectPercentile оценивают взаимосвязь предикторов с целевой переменной используя статистические тесты, позволяя отобрать соответственно заданное количество и долю наилучших по заданному критерию признаков. В качестве статистических тестов используются F-тест,

и взаимная информация.

F-тест

F-тест оценивает степень линейной зависимости между предикторами и целевой переменной, поэтому он лучше всего подойдёт для линейных моделей. Реализован в sklearn как f_regression и f_classif соответственно для регрессии и классификации.

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

Взаимная информация

Взаимная информация показывает насколько чётко определена целевая переменная если известны значения предиктора (подробнее здесь и здесь). Этот тип тестов считается самым удобным в использовании - он хорошо работает "из коробки" и позволяет находить нелинейные зависимости. Реализован в sklearn как mutual_info_regression и mutual_info_classif соответственно для регрессии и классификации.

2. Встроенные методы

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

Пример

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

fnlwgt (final weight) – примерная оценка количества людей, которое представляет каждая строка данных

Обучение модели без поиска по сетке

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

В приведенном выше фрагменте кода мы объявили значения параметра, то есть dropoutRate, epochs, batchSize и learnRate, соответственно. Затем мы создали объект модели, вызвав функцию create_my_model(). Затем мы приспособили модель к обучающим данным.

В результате мы получили точность 0.0000e + 00.

GridSearchCV – помощник в выборе гиперпараметров модели

Аналитик, получив конкретную задачу, залив (сформировав датасет) и очистив данные, приступает к более глубокому анализу:

  1. любой датасет из чистых данных должен быть подвергнут долгой и качественной обработке с вычленением кейфич. При этом не работает правило «чем больше, тем лучше». Данные должны быть репрезентативны, фичам необходимо отражать необходимые качества датасета
  2. для каждой конкретной задачи, с учетом доступных ресурсов и особенностей датасета, необходимо подбирать правильную модель машинного обучения;
  3. выбрав правильную модель для обучения, важно указать верные параметры модели, при которых мы получим лучшую её оценку и эффективность. Для реализации данного этапа есть варианты:
  • перебрать параметры вручную, с последующим обучением модели для каждого нового набора;
  • доверить данный процесс компоненту GridSearchCV, значительно сэкономив время.

Рассмотрим детально вариант использования компонента GridSearchCV.

Для начала импортируем необходимый модуль:

Перед тем как приступать к подбору, будет полезным познакомиться с методом чуть поближе.

CV – перекрёстная проверка (кросс-валидация, Cross-validation), метод, который показывает, что модель не переобучилась.

Принцип работы:

2. делится на кусочки:

3. делается указанное нами (4) количество прогонов этой модели:

Где |****| – одна из частей датасета, “DDDD”- часть датасета, на которой прогоняется модель.

Таким образом модель прогоняется на 4х кусках, т.е. 4 разные модели обучаются на 4х разных выборках. Если все 4 результата хороши, значит модель не переобучена.

Параметры GridSearchCV:

Познакомившись с методом, начинаем с ним работать:

ИТОГ: количество моделей которых мы обучим с помощью данного метода: 3*2*3 = 18 штук.

Обучим сетку на датасетах модели:

Смотрим результат и видим самый лучший обученный MLP-регрессор:

Исходя из полученный информации, лучший регрессор (использованная Вами модель) имеет указанные выше параметры.

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

Реализация поиска по сетке в Python

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

Мы будем использовать набор данных о диете, содержащий данные о росте и весе разных людей на основе различных атрибутов, таких как пол, возраст и тип диеты. Мы можем напрямую импортировать данные из онлайн-ресурса с помощью функции Pandas read_csv().

Но перед этим нам нужно импортировать необходимые пакеты:

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

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

В этом фрагменте кода мы импортировали набор данных с помощью read_csv() библиотеки pandas и сохранили его в переменной mydf. Затем мы распечатали первые пять строк, используя функцию head() вместе с переменной mydf.

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

Фрагмент кода для этого показан ниже:

В приведенном выше фрагменте кода мы преобразовали фрейм данных pandas в массив NumPy. Также мы импортировали модуль StandardScaler из библиотеки sklearn и использовали эту функцию для нормализации данных. Затем преобразовали и отобразили данные обучения с помощью функции transform().

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

В следующем фрагменте кода определена функция create_my_model(), принимающая два параметра, то есть learnRate и dropoutRate соответственно. Затем мы создали модель mymodel с помощью функции Sequential(), использовали add() вместе с функциями Dense() и Dropout(). Затем скомпилировали модель с помощью функции compile().

В результате, когда мы выполняем код, это приводит к загрузке набора данных, его предварительной обработке и созданию модели машинного обучения. Поскольку нас интересует только понимание работы Grid Search, мы не выполняли разделение на train/test split и подогнали модель к полному набору данных.

В следующем разделе выясним, как Grid Search облегчает жизнь программисту, оптимизируя параметры .

GridSearchCV. Поиск лучших параметров модели

Подбор параметров – одна из важных задач для построения модели машинного обучения. Изменение параметров модели может принципиально повлиять на ее качество. Например, модель может переобучиться. Перебор этих параметров вручную может занять колоссальное количество времени. Однако, существует модуль GridSearchCV.

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

Перейдем к примеру.

Для начала импортируем необходимые библиотеки:

В качестве датасэта будем использовать данные о съедобности грибов.

Фрагмент нашего датафрейма:


Для создания модели нам необходимо вытащить целевой признак “Class” в переменную y_train, а оставшиеся признаки в переменную X_train:

Затем объявляем классификатор RandomForest, не внося в него никаких параметров:

n_estimators – число деревьев в лесу. Оно будет изменяться от 10 до 50 с шагом 10

max_depth – глубина дерева. Она будет изменяться от 1 до 12 с шагом в 2

min_samples_leaf – минимальное число образцов в листах. Оно будет изменяться от 1 до 7

min_samples_leaf – минимальное число образцов для сплита. Оно будет изменяться от 2 до 9.

Что обозначает поиск по сетке в Python?

Будем считать, что модель принимает следующие три параметра в виде входных данных:

  1. Количество скрытых слоев [2, 4]
  2. Количество нейронов в каждом слое [5, 10]
  3. Количество эпох [10, 50]

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

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

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

Оптимизация гиперпараметров с помощью поиска по сетке

Если мы не используем метод поиска по сетке, мы можем напрямую вызвать функцию fit() для модели, которую мы создали выше. Но чтобы использовать метод поиска по сетке, мы должны передать несколько аргументов функции create_my_model(). Более того, мы должны объявить сетку с различными вариантами, чтобы попробовать для каждого параметра. Проделаем это в разных частях.

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

В приведенном выше фрагменте кода мы внесли некоторые изменения в предыдущую функцию create_my_model и использовали KerasClassifier для создания объекта модели.

Теперь давайте реализуем алгоритм поиска по сетке и поместим в него набор данных:

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

Наконец, можно сделать вывод, что Grid Search довольно легко реализовать на языке программирования Python и он экономит наше время и труд. Мы можем перечислить все аргументы, которые хотели настроить, объявить значения, которые необходимо протестировать, выполнить код и забыть о нем. Этот процесс настолько прост и удобен, что требует меньшего участия программиста. Как только лучшая комбинация аргументов будет найдена, мы можем использовать ее для окончательной модели.

Читайте также: