Как подбирать оптимальные значения для гиперпараметров модели машинного обучения?

«Как подбирать оптимальные значения для гиперпараметров модели машинного обучения?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Подбор гиперпараметров — это итеративный процесс поиска комбинации, которая максимизирует производительность модели на валидационных данных. Основные методы:

1. Grid Search (Поиск по сетке) Полный перебор всех комбинаций из предопределённого набора. Прост, но вычислительно затратен.

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [3, 5, 7, None],
    'min_samples_split': [2, 5, 10]
}
model = RandomForestClassifier()
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
print(f"Лучшие параметры: {grid_search.best_params_}")

2. Random Search (Случайный поиск) Случайная выборка комбинаций из заданных распределений. Часто находит хорошее решение быстрее Grid Search при том же бюджете вычислений.

3. Байесовская оптимизация Строит вероятностную модель функции цели (например, валидационная ошибка) и выбирает следующие параметры для оценки, чтобы максимизировать ожидаемое улучшение. Идеально для дорогих моделей (нейросети, градиентный бустинг). Популярные библиотеки: Optuna, scikit-optimize.

import optuna

def objective(trial):
    n_estimators = trial.suggest_int('n_estimators', 50, 300)
    max_depth = trial.suggest_int('max_depth', 3, 15)
    model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth)
    score = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy').mean()
    return score

study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

Ключевые практики:

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