Поиск по сетке против случайного поиска

Когда я получаю результат после запуска модели, я всегда хочу спросить себя. Это лучший результат, который я могу получить?

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

Во-первых, давайте проясним условия. Что такое параметр и что такое гиперпараметр?

Параметр: параметр модели, который можно обучить и настроить с помощью обучающих данных. Например. у = Ах + В. A и B - это параметры, которые можно обучить с помощью обучающих данных.

Гиперпараметр: параметры из моделей, на которые не влияют обучающие данные. Он определяет базовую структуру модели для этого конкретного алгоритма. Например. Количество отпусков для алгоритма дерева решений

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

#Create classification dataset
from sklearn.datasets import make_classification
X, Y = make_classification(n_samples=10000, n_informative=10,n_redundant=0, n_classes=3,
                               n_features=10,
                               random_state=0)
#split into training and testing set
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

Базовая модель (без настройки)

import time
start = time.time()
import lightgbm as lgb
from sklearn.metrics import accuracy_score
clf = lgb.LGBMClassifier()
clf.fit(X=X_train, y=Y_train)
predicted=clf.predict(X_test)
print('Classification of the result is:')
print(accuracy_score(Y_test, predicted))
end = time.time()
print('Execution time is:')
print(end - start)

В качестве алгоритма я использовал Light GBM. Базовая модель имеет точность 88,8%, и для завершения всего процесса требуется всего 0,3 секунды.

Шаги по настройке гиперпараметров

Шаг 1: Чего мы хотим достичь?

Во-первых, нам нужно определить основные цели, которых мы пытаемся достичь в процессе настройки. Обычно есть 3 общие цели.

  1. Повышение точности
  2. Уменьшить переоснащение
  3. Более высокая скорость бега

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

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

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

Шаг 2: Какие параметры настройки для каждой цели?

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

В этом примере я использую Light GBM, и вы можете найти весь список параметров здесь.

Ниже приведены 5 гиперпараметров, которые я выбрал для автонастройки:

  • num_leaves: максимальное количество листьев в одном дереве, основной параметр для настройки модели дерева.
  • min_child_samples: минимальное количество данных за один отпуск
  • max_depth: максимальная глубина дерева.
  • Learning_rate: коэффициент усадки, определяет, насколько быстро модель может обучаться.
  • reg_alpha: регуляризация, устранение переобучения

Num_leaves, min_child_samples, max_depth и reg_alpha могут влиять как на точность, так и на подгонку. Чем выше значение num_leaves и max_depth, тем выше точность, а также увеличивается переоснащение. Чем выше min_child_samples и reg_alpha, тем меньше переоснащение, но снизится точность. Скорость обучения определяет скорость обучения модели, но также влияет на точность.

Шаг 3: Определите диапазон значений настройки

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

Я бы обычно запускал модель 2 раунда. Для первого раунда я обычно устанавливаю интервал, в основном стремясь найти подходящий диапазон значений параметров. Например, в моем случае num_leaves - самый важный параметр для настройки. Значение по умолчанию - 31. Таким образом, во-первых, я установил диапазон как [10,20,30,60,90,120], который имеет большой диапазон.

После первого раунда результатов я получаю лучшее значение параметра для num_leaves, равное 60. Для второго раунда я бы снова установил интервал около 60 с более близким интервалом, например [40,50,60,70,80].

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

Шаг 4. Запустите автонастройку модели.

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

Поиск по сетке против случайного поиска

Поиск по сетке. Исчерпывающий поиск по заранее заданному диапазону значений параметра. Количество попыток определяется количеством настраиваемых параметров, а также диапазоном.

start = time.time()
from sklearn.model_selection import GridSearchCV
import lightgbm as lgb
lgb=lgb.LGBMClassifier()
#Define the parameters
parameters = {'num_leaves':[20,40,60,80,100], 'min_child_samples':[5,10,15],'max_depth':[-1,5,10,20],
             'learning_rate':[0.05,0.1,0.2],'reg_alpha':[0,0.01,0.03]}
#Define the scoring
clf=GridSearchCV(lgb,parameters,scoring='accuracy')
clf.fit(X=X_train, y=Y_train)
print(clf.best_params_)
predicted=clf.predict(X_test)
print('Classification of the result is:')
print(accuracy_score(Y_test, predicted))
end = time.time()
print('Execution time is:')
print(end - start)

По сравнению с базовой моделью Grid Search увеличивает точность примерно на 1,2%. Однако время работы составляет 4 с лишним часа!

Случайный поиск. Возьмите случайную выборку из предварительно определенного диапазона значений параметра. Количество испытаний определяется параметром «n_iter», что обеспечивает большую гибкость. Вдобавок, как показано на рисунке, когда у вас есть непрерывный диапазон значений, он может извлекать более случайным образом распределенные наблюдения, а не наборы параметров из «линии сетки».

start = time.time()
from sklearn.model_selection import RandomizedSearchCV
import lightgbm as lgb
lgb=lgb.LGBMClassifier()
parameters = {'num_leaves':[20,40,60,80,100], 'min_child_samples':[5,10,15],'max_depth':[-1,5,10,20],
             'learning_rate':[0.05,0.1,0.2],'reg_alpha':[0,0.01,0.03]}
clf=RandomizedSearchCV(lgb,parameters,scoring='accuracy',n_iter=100)
clf.fit(X=X_train, y=Y_train)
print(clf.best_params_)
predicted=clf.predict(X_test)
print('Classification of the result is:')
print(accuracy_score(Y_test, predicted))
end = time.time()
print('Execution time is:')
print(end - start)

Я указал количество испытаний равным 100. Точность настроенной модели случайного поиска всего на 0,3% меньше, чем точность поиска по сетке. Однако это занимает всего 3,5 минуты, что намного быстрее, чем поиск по сетке.

Шаг 5: Посмотрите на настроенный результат и произведите ручную настройку.

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

Рекомендация / Заключение

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

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

  1. Случайный поиск обладает большей гибкостью и позволяет контролировать количество запусков.
  2. Время выполнения случайного поиска обычно намного меньше, поэтому у вас появляется больше времени, чтобы опробовать больше раундов настройки.
  3. Для непрерывного гиперпараметра случайный поиск может исследовать более четкий набор значений.

Если у вас есть вопросы, рекомендации или новые темы, о которых вы хотите узнать, пожалуйста, оставьте их в комментариях!

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