Ответ
Байесовский оптимизатор — это последовательный метод глобальной оптимизации, идеально подходящий для настройки гиперпараметров моделей машинного обучения, когда оценка целевой функции (например, валидационная ошибка) требует значительных вычислительных ресурсов. В отличие от случайного или сеточного поиска, он строит вероятностную суррогатную модель (чаще всего Гауссовский процесс) целевой функции и использует её для выбора наиболее перспективной следующей точки (гиперпараметров) для проверки, руководствуясь функцией приобретения (acquisition function).
Практическое использование с scikit-optimize (skopt):
from skopt import gp_minimize
from skopt.space import Real, Integer, Categorical
from skopt.plots import plot_convergence
import numpy as np
# 1. Определим пространство гиперпараметров для, например, градиентного бустинга
space = [
Integer(50, 500, name='n_estimators'), # Количество деревьев
Real(0.01, 0.3, prior='log-uniform', name='learning_rate'), # Темп обучения
Integer(3, 15, name='max_depth'), # Макс. глубина дерева
Real(0.5, 1.0, name='subsample') # Доля данных для каждого дерева
]
# 2. Целевая функция, которую нужно МИНИМИЗИРОВАТЬ (например, 1 - ROC-AUC)
def objective(params):
n_estimators, lr, max_depth, subsample = params
# Здесь происходит создание и обучение модели (например, XGBoost/LightGBM)
# model = XGBClassifier(n_estimators=n_estimators, learning_rate=lr,
# max_depth=max_depth, subsample=subsample)
# model.fit(X_train, y_train)
# score = roc_auc_score(y_val, model.predict_proba(X_val)[:, 1])
# return 1 - score # Минимизируем ошибку
# Для примера — простая тестовая функция (сфера)
return np.sum(np.array(params) ** 2)
# 3. Запуск байесовской оптимизации
result = gp_minimize(
func=objective,
dimensions=space,
n_calls=30, # Сколько раз вызовем целевую функцию
n_random_starts=10, # Сколько случайных точек оценим вначале
random_state=42,
verbose=True
)
print(f"Лучшие гиперпараметры: {result.x}")
print(f"Лучшее значение функции: {result.fun:.4f}")
# 4. Визуализация сходимости
plot_convergence(result)
Ключевые преимущества перед Grid/Random Search:
- Эффективность: Требует значительно меньше итераций для достижения хорошего результата, так как «учится» на истории предыдущих оценок.
- Учёт неопределённости: Модель предоставляет не только предсказание значения функции, но и меру уверенности в этом предсказании.
- Баланс исследования и эксплуатации: Функция приобретения (например, Expected Improvement) автоматически балансирует между исследованием неизученных областей пространства и уточнением найденных хороших решений.
Популярные библиотеки Python: scikit-optimize (skopt), BayesianOptimization, Optuna (использует TPE — другой, но также байесовский метод).