Все модели машинного обучения имеют набор гиперпараметров или аргументов, которые должны быть заданы специалистом. Например, модель логистической регрессии имеет различные решатели, использующиеся для поиска коэффициентов, которые могут дать нам наилучший из возможных результатов. Каждый решатель использует свой алгоритм для поиска оптимального результата, и ни один из них не является однозначно лучше, чем другой. Трудно сказать, какой решатель будет работать качественнее всего на вашем наборе данных (датасете), пока вы не попробуете их все. Лучший гиперпараметр субъективен и отличается для каждого датасета. Библиотека Scikit-Learn в Python имеет набор гиперпараметров по умолчанию, которые достаточно хорошо работают для всех моделей, но они не обязательно являются наилучшими для каждой из проблем. Единственный способ найти наиболее подходящие гиперпараметры для вашего датасета — это метод проб и ошибок, что и является основной концепцией оптимизации гиперпараметров. Проще говоря, оптимизация гиперпараметров - это техника, которая предполагает поиск в диапазоне значений для нахождения подмножества результатов, обеспечивающих наилучшую производительность на заданном наборе данных. Существуют две популярные техники, используемые для оптимизации гиперпараметров, — сеточный и случайный поиск. При выполнении оптимизации гиперпараметров сначала необходимо определить область или сетку параметров, в которую мы включаем набор возможных значений гиперпараметров, которые могут быть использованы для построения модели. Затем используется метод поиска по сетке для размещения этих гиперпараметров в матрице, и модель обучается на каждой комбинации значений гиперпараметров. После этого выбирается модель с наилучшими показателями. В то время как поиск по сетке рассматривает все возможные комбинации гиперпараметров, чтобы найти лучшую модель, случайный поиск выбирает и тестирует только случайную комбинацию гиперпараметров. Эта техника вместо исчерпывающего поиска делает случайную выборку из сетки гиперпараметров. Мы можем указать общее количество попыток случайного поиска, прежде чем будет получена наилучшая модель. Теперь, когда у вас есть базовое понимание того, как работают случайный поиск и поиск по сетке, я покажу, как реализовать эти методы с помощью библиотеки Scikit-Learn. Шаг 1: Загрузка набора данных Загрузите датасет Wine Quality на сайте Kaggle и введите следующие строки кода, чтобы считать его с помощью библиотеки Pandas: Верхняя часть датафрейма выглядит следующим образом: Шаг 2: Предварительная обработка данных Целевая переменная "quality" (качество) содержит значения в диапазоне от 1 до 10. Мы превратим ее в задачу бинарной классификации, присвоив всем пунктам данных со значением качества меньше или равным 5 значение 0, а остальным результатам — значение 1: Давайте разделим зависимые и независимые переменные в этом датафрейме: Шаг 3: Построение модели Теперь давайте создадим классификатор случайного леса. Мы будем выполнять настройку гиперпараметров этой модели, для создания наилучшего алгоритма под наш датасет: Шаг 4: Реализация поиска по сетке с помощью Scikit-Learn Определение пространственного диапазона гиперпараметров Сейчас мы попробуем настроить следующий набор гиперпараметров этой модели: "Max_depth": Этот гиперпараметр представляет максимальный уровень (глубину) каждого дерева в модели случайного леса. Более глубокое дерево показывает хорошие результаты и собирает много информации об обучающих данных, но плохо поддается обобщению для тестовых данных. По умолчанию в библиотеке Scikit-Learn это значение установлено в "None", что значит, такие деревья оставлены для полного расширения. "Max_features": Максимальное количество признаков, которое модели случайного леса разрешается опробовать при каждом разбиении. По умолчанию в Scikit-Learn это значение устанавливается равным квадратному корню из общего числа переменных в наборе данных. "N_estimators": Количество деревьев решений в лесу. По умолчанию в Scikit-Learn число оценщиков (estimators) равно 10. "Min_samples_leaf": Минимальное количество образцов, необходимое для нахождения в листовом узле каждого дерева. В Scikit-Learn значение по умолчанию равно 1. "Min_samples_split": Минимальное количество образцов, необходимое для разбиения внутреннего узла каждого дерева. В Scikit-Learn значение по умолчанию равно 2. Теперь мы создадим словарь из множества возможных значений для всех вышеперечисленных гиперпараметров. Это также называется пространством гиперпараметров, и мы будем перебирать их, чтобы найти наилучшую комбинацию аргументов: Теперь нам нужно выполнить поиск, чтобы найти наилучшую комбинацию гиперпараметров для модели: Наконец, давайте выведем самую высокую степень точности модели, а также набор гиперпараметров, которые обеспечили такой результат: Лучшая модель дала оценку точности приблизительно 0,74, а ее гиперпараметры следующие: Теперь давайте применим случайный поиск на том же датасете и посмотрим, сможем ли мы получить подобные результаты. Шаг 5: Реализация случайного поиска с помощью Scikit-Learn Определение области значений гиперпараметров Теперь давайте определим диапазон значений гиперпараметров для реализации случайного поиска. Эта область параметров может иметь больший диапазон значений, чем та, которую мы построили для поиска по сетке, поскольку случайный поиск не пытается полностью опробовать все комбинации гиперпараметров. Он случайным образом выбирает гиперпараметры, чтобы найти лучшие из них, и это означает, что в отличие от сеточного поиска, случайный поиск может быстро перебрать большое количество значений. Выполните следующие строки кода для запуска случайного поиска модели: (Обратите внимание, что мы указали n_iter=500, значит, случайный поиск будет выполняться 500 раз, прежде чем будет выбрана лучшая модель. Вы можете поэкспериментировать с другим числом итераций, чтобы увидеть, сколько из них дает оптимальные результаты. Имейте в виду, что большое количество итераций приведет к улучшению качества производительности, но при этом будет достаточно трудоемким). Теперь выполните следующие строки кода, чтобы вывести лучшие гиперпараметры, найденные методом случайного поиска, а также самую высокую точность самой удачной модели: Лучшие гиперпараметры, найденные методом случайного поиска, следующие: Самая высокая точность из всех построенных моделей также составляет примерно 0,74. Обратите внимание, что поиск по сетке, и случайный поиск достаточно хорошо справились с этим датасетом. Имейте в виду, что если вы запустите случайный поиск на том же коде, ваши результаты могут сильно отличаться от того, что я показал выше. Это связано с тем, что поиск выполняется по очень большой сетке параметров с использованием случайной инициализации, что может привести к результатам, которые будут значительно отличаться при каждом использовании этой техники. Полный код Вот весь код, использованный в этом руководстве: Если вы когда-нибудь окажетесь перед выбором между поиском по сетке и случайным поиском, вот несколько советов, которые помогут вам решить, какой из них использовать: Используйте поиск по сетке, если у вас уже есть примерный диапазон известных значений гиперпараметров, которые будут работать хорошо. Убедитесь, что область значений параметров невелика, так как поиск по сетке может занять очень много времени.  Применяйте случайный поиск в широком диапазоне значений, если у вас еще нет представления о параметрах, которые будут хорошо работать в вашей модели. Случайный поиск быстрее, чем поиск по сетке, и его всегда следует использовать, когда у вас большая область значений параметров. Для получения наилучших результатов целесообразно использовать как случайный поиск, так и поиск по сетке. При больших размерах области значений параметров можно сначала использовать случайный поиск, так как он быстрее. Затем, используя лучшие гиперпараметры, найденные при случайном поиске, сузить сетку параметров и ввести в сеточный поиск меньший диапазон значений. В феврале в рамках специализации Machine Learning в Otus пройдут два бесплатных открытых урока, на которые могут записаться все заинтересованные. Темы вебинаров и ссылки на регистрацию ниже: На первом уроке мы разберем основы Machine Learning и поговорим о такой востребованной области, как Data Science. На втором уроке освоим популярный ML-алгоритм – «дерево решений». Поговорим о том, для каких задач его используют в машинном обучении и как правильно его применять на практике. Будем рады всем участникам. Редактор