Введение в поиск по сетке

Подбор гиперпараметров в Python

Alex Scriven

Data Scientist

Автоматизация перебора 2 гиперпараметров

Ваша предыдущая работа:

neighbors_list = [3,5,10,20,50,75]
accuracy_list = []
for test_number in neighbors_list:
    model = KNeighborsClassifier(n_neighbors=test_number)
    predictions = model.fit(X_train, y_train).predict(X_test)
    accuracy = accuracy_score(y_test, predictions)
    accuracy_list.append(accuracy)

Затем результаты собирались в датафрейм для анализа.

Подбор гиперпараметров в Python

Автоматизация перебора 2 гиперпараметров

 

А что если проверять значения 2 гиперпараметров?

Используем алгоритм GBM:

  • learn_rate [0.001, 0.01, 0.05]
  • max_depth [4,6,8,10]

Можно использовать (вложенный) цикл!

Подбор гиперпараметров в Python

Автоматизация перебора 2 гиперпараметров

Сначала создадим функцию построения модели:

def gbm_grid_search(learn_rate, max_depth):
    model = GradientBoostingClassifier(
            learning_rate=learn_rate,
            max_depth=max_depth)

predictions = model.fit(X_train, y_train).predict(X_test)
return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Подбор гиперпараметров в Python

Автоматизация перебора 2 гиперпараметров

 

Теперь перебираем списки гиперпараметров и вызываем нашу функцию:

results_list = []

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        results_list.append(gbm_grid_search(learn_rate,max_depth))

Подбор гиперпараметров в Python

Автоматизация перебора 2 гиперпараметров

 

Результаты можно поместить в DataFrame и вывести на экран:

results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

таблица результатов

Подбор гиперпараметров в Python

Сколько моделей?

 

Добавление гиперпараметров и значений резко увеличивает число моделей.

  • Зависимость не линейная, а экспоненциальная
  • Одно дополнительное значение гиперпараметра — это не одна модель
  • 5 значений для гиперпараметра 1 и 10 для гиперпараметра 2 — уже 50 моделей!

А что с кросс-валидацией?

  • 10-кратная кросс-валидация даёт 50×10 = 500 моделей!
Подбор гиперпараметров в Python

От 2 гиперпараметров до N

 

Что если добавить ещё гиперпараметры?

Можно вложить цикл глубже!

# Adjust the list of values to test
learn_rate_list = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5]
max_depth_list = [4,6,8, 10, 12, 15, 20, 25, 30]
subsample_list = [0.4,0.6, 0.7, 0.8, 0.9]
max_features_list = ['auto', 'sqrt']
Подбор гиперпараметров в Python

От 2 гиперпараметров до N

Обновим функцию:

def gbm_grid_search(learn_rate, max_depth,subsample,max_features):
    model = GradientBoostingClassifier(
        learning_rate=learn_rate, 
        max_depth=max_depth,
        subsample=subsample,
        max_features=max_features)
    predictions = model.fit(X_train, y_train).predict(X_test)
    return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Подбор гиперпараметров в Python

От 2 гиперпараметров до N

Обновим цикл (вложенный):

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        for subsample in subsample_list:
            for max_features in max_features_list:
                results_list.append(gbm_grid_search(learn_rate,max_depth,
                                     subsample,max_features))
results_df = pd.DataFrame(results_list, columns=['learning_rate',
                         'max_depth', 'subsample', 'max_features','accuracy'])
print(results_df)
Подбор гиперпараметров в Python

От 2 гиперпараметров до N

 

Сколько моделей теперь?

  • 7×9×5×2 = 630 (6 300 с кросс-валидацией!)

Вечно углублять вложенность не получится!

Кроме того, что если нужно:

  • Сведения о времени обучения и результатах
  • Сведения о результатах кросс-валидации
Подбор гиперпараметров в Python

Введение в поиск по сетке

Создадим сетку:

  • По вертикали — все значения max_depth
  • По горизонтали — все значения learning_rate

Таблица комбинаций гиперпараметров

Подбор гиперпараметров в Python

Введение в поиск по сетке

Перебираем каждую ячейку сетки:

таблица комбинаций гиперпараметров

(4, 0.001) соответствует созданию оценщика следующим образом:

GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
Подбор гиперпараметров в Python

Плюсы и минусы поиска по сетке

 

Преимущества этого подхода:

Преимущества:

  • Не нужно писать тысячи строк кода
  • Находит лучшую модель в пределах сетки (*важная оговорка!)
  • Легко объяснить
Подбор гиперпараметров в Python

Плюсы и минусы поиска по сетке

 

Недостатки этого подхода:

  • Высокие вычислительные затраты! Вспомните, как быстро набегает 6 000+ моделей.
  • Метод «неинформированный»: результаты одной модели не влияют на построение следующей.

 

«Информированные» методы мы рассмотрим позже!

Подбор гиперпараметров в Python

Давайте потренируемся!

Подбор гиперпараметров в Python

Preparing Video For Download...