← Назад к вопросам
Как подбирать оптимальные значения для гиперпараметров?
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: современный выбор, быстро работает с большими пространствами
Ключевые советы:
- Начни с дефолтных значений и проверь качество
- Используй кроссвалидацию (cv≥5) для избежания переобучения
- Логируй результаты: сохраняй историю поиска
- Ограничь время поиска если вычисления дорогие
- Проверяй feature importance после подбора
- Не переусложняй: 80% результата дают первые 2-3 параметра