Оптимизация гиперпараметров: случайный поиск против сеточного поиска

Beginner

This tutorial is from open-source community. Access the source code

Введение

В машинном обучении гиперпараметры - это параметры, которые не обучаются на основе данных, а задаются перед обучением. Выбор подходящих гиперпараметров является至关重要 для достижения высокой точности в моделях машинного обучения. Два распространенных метода оптимизации гиперпараметров - это случайный поиск и сеточный поиск. В этом лабораторном занятии мы сравним эти два метода оптимизации гиперпараметров линейной Support Vector Machine (SVM) с использованием Stochastic Gradient Descent (SGD) для обучения.

Советы по работе с ВМ

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

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

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем необходимые библиотеки и загружаем данные

Начнем с импорта необходимых библиотек и загрузки набора данных digits из scikit-learn.

import numpy as np
from time import time
import scipy.stats as stats
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.datasets import load_digits
from sklearn.linear_model import SGDClassifier

## load digits dataset
X, y = load_digits(return_X_y=True, n_class=3)

Создаем модель SVM

Мы создадим линейную модель SVM с использованием обучения SGD.

## create SVM model with SGD training
clf = SGDClassifier(loss="hinge", penalty="elasticnet", fit_intercept=True)

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

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

## specify parameters and distributions to sample from
param_dist = {
    "average": [True, False],
    "l1_ratio": stats.uniform(0, 1),
    "alpha": stats.loguniform(1e-2, 1e0),
}

## run randomized search
n_iter_search = 15
random_search = RandomizedSearchCV(
    clf, param_distributions=param_dist, n_iter=n_iter_search
)

start = time()
random_search.fit(X, y)
print(
    "RandomizedSearchCV took %.2f seconds for %d candidates parameter settings."
    % ((time() - start), n_iter_search)
)

## print results
report(random_search.cv_results_)

Сеточный поиск для оптимизации гиперпараметров

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

## specify parameters to search over
param_grid = {
    "average": [True, False],
    "l1_ratio": np.linspace(0, 1, num=10),
    "alpha": np.power(10, np.arange(-2, 1, dtype=float)),
}

## run grid search
grid_search = GridSearchCV(clf, param_grid=param_grid)

start = time()
grid_search.fit(X, y)

print(
    "GridSearchCV took %.2f seconds for %d candidate parameter settings."
    % (time() - start, len(grid_search.cv_results_["params"]))
)

## print results
report(grid_search.cv_results_)

Обзор

В этом практическом занятии мы сравнили случайный поиск и сеточный поиск для оптимизации гиперпараметров линейной модели SVM с использованием обучения SGD. Мы обнаружили, что оба метода исследуют одно и то же пространство гиперпараметров, но случайный поиск был значительно быстрее. Лучшие гиперпараметры, найденные каждым методом, показывали схожие результаты по производительности, но случайный поиск может иметь несколько хужее качество из-за шума. На практике мы бы не искали сразу这么多 гиперпараметров одновременно, а только самые важные.