← Назад к вопросам

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

2.0 Middle🔥 111 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подбор оптимальных значений гиперпараметров

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

1. Основные методы поиска

Grid Search (Перебор по сетке)

Наиболее простой метод — проверить все возможные комбинации:

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

param_grid = {
    "n_estimators": [100, 200, 500],
    "max_depth": [5, 10, 20, None],
    "min_samples_split": [2, 5, 10],
    "min_samples_leaf": [1, 2, 4]
}

rf = RandomForestClassifier(random_state=42)
grid_search = GridSearchCV(
    rf, 
    param_grid, 
    cv=5,
    scoring="f1",
    n_jobs=-1
)

grid_search.fit(X_train, y_train)
print(f"Best params: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_}")

Random Search (Случайный поиск)

Более эффективен для больших пространств параметров:

from sklearn.model_selection import RandomizedSearchCV
import scipy.stats as stats

param_dist = {
    "n_estimators": stats.randint(50, 500),
    "max_depth": [5, 10, 20, None],
    "min_samples_split": stats.randint(2, 20),
    "learning_rate": stats.uniform(0.01, 0.1)
}

random_search = RandomizedSearchCV(
    rf,
    param_distributions=param_dist,
    n_iter=20,
    cv=5,
    random_state=42,
    n_jobs=-1
)

random_search.fit(X_train, y_train)

2. Продвинутые методы

Bayesian Optimization (Байесовская оптимизация)

Умнее учитывает историю поисков:

from skopt import gp_minimize
from skopt.space import Real, Integer

def objective(params):
    """Функция для минимизации"""
    max_depth, min_samples = params
    
    model = RandomForestClassifier(
        max_depth=int(max_depth),
        min_samples_split=int(min_samples),
        random_state=42
    )
    
    score = cross_val_score(model, X_train, y_train, cv=5, scoring="f1").mean()
    return -score

space = [
    Integer(5, 50, name="max_depth"),
    Integer(2, 20, name="min_samples")
]

result = gp_minimize(objective, space, n_calls=30, random_state=42)
print(f"Best params: {result.x}")

Optuna (Фреймворк для оптимизации)

Современный и гибкий инструмент:

import optuna
from optuna.samplers import TPESampler

def objective(trial):
    max_depth = trial.suggest_int("max_depth", 5, 50)
    n_estimators = trial.suggest_int("n_estimators", 100, 500)
    learning_rate = trial.suggest_float("learning_rate", 1e-3, 1e-1, log=True)
    
    model = RandomForestClassifier(
        max_depth=max_depth,
        n_estimators=n_estimators,
        random_state=42
    )
    
    score = cross_val_score(model, X_train, y_train, cv=5, scoring="roc_auc").mean()
    return score

study = optuna.create_study(
    direction="maximize",
    sampler=TPESampler(seed=42)
)

study.optimize(objective, n_trials=100)
print(f"Best params: {study.best_params}")

3. Стратегии отбора

Coarse-to-Fine подход

# Шаг 1: Грубый поиск
param_grid_coarse = {
    "max_depth": [5, 15, 30],
    "n_estimators": [100, 300, 500]
}
grid1 = GridSearchCV(rf, param_grid_coarse, cv=3)
grid1.fit(X_train, y_train)

# Шаг 2: Уточняющий поиск
best_depth = grid1.best_params_["max_depth"]
param_grid_fine = {
    "max_depth": range(max(1, best_depth-2), best_depth+3),
    "n_estimators": range(max(50, int(grid1.best_params_["n_estimators"]*0.7)), 
                         int(grid1.best_params_["n_estimators"]*1.3), 50)
}
grid2 = GridSearchCV(rf, param_grid_fine, cv=5)
grid2.fit(X_train, y_train)

4. Практические рекомендации

  • Grid Search: медленно, но хорошее качество для 3-5 параметров
  • Random Search: быстро, подходит для 5-10 параметров
  • Bayesian Optimization: отличное качество, экономит вычисления
  • Optuna: современный выбор, быстро работает с большими пространствами

Ключевые советы:

  1. Начни с дефолтных значений и проверь качество
  2. Используй кроссвалидацию (cv≥5) для избежания переобучения
  3. Логируй результаты: сохраняй историю поиска
  4. Ограничь время поиска если вычисления дорогие
  5. Проверяй feature importance после подбора
  6. Не переусложняй: 80% результата дают первые 2-3 параметра
Как подбирать оптимальные значения для гиперпараметров? | PrepBro