Настройка гиперпараметров
Гиперпараметры
Гиперпараметры — параметры, которые не настраиваются во время обучения модели. Пример гиперпараметра — шаг градиентного спуска, он задается перед обучением. Пример параметров — веса градиентного спуска, они изменяются и настраиваются во время обучения.
Для подбора гиперпараметров необходимо разделить датасет на три части:
- training set (тренировочный набор данных, для обучении модели)
 - validation set (валидационный набор данных, для расчета ошибки и выбора наилучшей модели)
 - test set (тестовый набор данных, для тестирования лучшей модели)
 
Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
Рассмотрим модель KNeighborsClassifier из библиотеки sklearn. Все “параметры” данной модели, с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.
Grid search
Общая информация
Grid search принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
Sklearn Grid search: использование
Пример использования GridSearch из библиотеки scikit-learn:
-  Создание экземпляра класса  
SGDClassifier(из sklearn) - Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
 - Создание экземпляра класса кросс-валидации
 -  Создание экземпляра 
GridSearch(из sklearn). Первый параметр — модель, второй — сетка гиперпараметров, третий — функционал ошибки (используемый для контроля качества моделей по технике кросс-валидации), четвертый — кросс-валидация (можно задать количество фолдов, а можно передать экземпляр класса кросс - валидации) - Запуск поиска по сетке.
 
classifier = linear_model.SGDClassifier(random_state = 0, tol=1e-3)
   parameters_grid = {
       'alpha' : np.linspace(0.00001, 0.0001, 15),
       'learning_rate': ['optimal', 'constant', 'invscaling'],
       'eta0' : np.linspace(0.00001, 0.0001, 15),
       'max_iter' : np.arange(5,10),
   }
cv = model_selection.StratifiedShuffleSplit(n_splits=10, test_size = 0.2) grid_cv = model_selection.GridSearchCV(classifier, parameters_grid, scoring = 'accuracy', cv = cv) grid_cv.fit(train_data, test_data)
   Out:
   GridSearchCV(cv=StratifiedShuffleSplit(n_splits=10, random_state=0, test_size=0.2, train_size=None), 
                error_score=nan,
                estimator=SGDClassifier(alpha=0.0001, average=False,
                                    class_weight=None, early_stopping=False,
                                    epsilon=0.1, eta0=0.0, fit_intercept=True,
                                    l1_ratio=0.15, learning_rate='optimal',
                                    loss='hinge', max_iter=1000,
                                    n_iter_no_change=5, n_jobs=None,
                                    penalty='l2...
                        'eta0': array([1.00000000e-05, 1.64285714e-05, 2.28571429e-05, 2.92857143e-05,
      3.57142857e-05, 4.21428571e-05, 4.85714286e-05, 5.50000000e-05,
      6.14285714e-05, 6.78571429e-05, 7.42857143e-05, 8.07142857e-05,
      8.71428571e-05, 9.35714286e-05, 1.00000000e-04]),
                        'learning_rate': ['optimal', 'constant', 'invscaling'],
                        'max_iter': array([5, 6, 7, 8, 9])},
            pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
            scoring='accuracy', verbose=0)
Sklearn Grid search: важные атрибуты
-  
best_estimator_— лучшая модель -  
best_score_— ошибка, полученная на лучшей модели. -  
best_params_— гиперпараметры лучшей модели 
-  
cv_results_— результаты всех моделей. 
-  доступ к массиву определенного параметра: 
 
Реализация Grid search в библеотеках
- Katib
 - scikit-learn
 - Tune
 - Talos
 
Random grid search
Основная информация
Вместо полного перебора, Random grid search работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.
Когда random grid search будет гораздо полезнее, чем grid search? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма — мало.
Реализация Random grid
- hyperopt
 - Katib
 - scikit-learn
 - Tune
 - Talos
 
SMBO
Основная информация
SMBO (Sequential Model-Based Optimization) — методы, основанные на байесовской оптимизации
Когда используют SMBO? Когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO — замена целевой функции "суррогатной" функцией.
На каждом шаге работы SMBO:
- Строится вероятностная модель (суррогатная функция) целевой функции.
 - Подбираются гиперпараметры, которые лучше всего подходят для вероятностной модели.
 - Подобранные гиперпараметры применяются к целевой функции.
 - Вероятностная модель перестраивается (обновляется).
 - Шаги 2-4 повторяются столько раз, сколько задал пользователь.
 
Существует четыре ключевые аспекта SMBO:
- Сетка значений гиперпараметров (область поиска).
 - Целевая функция (выводит оценку, которую мы хотим минимизировать или максимизировать).
 - Вероятностная модель целевой функции (суррогатная функция).
 - Критерий, называемый функцией выбора (для выбора следующих гиперпараметры по текущей вероятностной модели).
 
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: 
Популярные вероятностные модели (суррогатные функции):
- Gaussian Processes
 - Tree Parzen Estimators (TPE)
 - Random Forest Regressions
 
Реализация
- Random Forest Regressions: SMAC
 - Tree Parzen Estimators: Hyperopt
 - Gaussian Processes: Spearmint, Scikit-optimize
 
TPE
Основная информация
TPE — Tree-structured Parzen Estimator (Древовидная структура Парзена)
Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель . В случае TPE, используется следующая функция:
— распределение гиперпараметров.
Реализация
- Hyperopt
 
SMAC
Основная информация
SMAC использует Random Forest regression и расширяет подходы SMBO:
- Использует дискретные и условные пространства параметров.
 - Обрабатывает негауссовский шум.
 - Выделяет бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций.
 
Реализация
- AutoML