Название | Нейросети: создание и оптимизация будущего |
---|---|
Автор произведения | Джеймс Девис |
Жанр | |
Серия | |
Издательство | |
Год выпуска | 2025 |
isbn |
Случайный поиск (Random Search) предлагает альтернативу: вместо систематического перебора он случайным образом выбирает комбинации гиперпараметров для тестирования. Исследования показывают, что случайный поиск часто быстрее находит подходящие значения, особенно если не все гиперпараметры одинаково важны для качества модели. В отличие от сеточного поиска, где каждое значение проверяется независимо от его эффективности, случайный подход позволяет сосредоточиться на более широкой области гиперпараметров, экономя ресурсы и сокращая время вычислений.
Байесовская оптимизация является более сложным и продвинутым методом. Она основывается на адаптивном подходе, который использует предыдущие результаты для прогнозирования наиболее перспективных комбинаций гиперпараметров. Этот метод строит априорные вероятности и обновляет их на каждом шаге, выбирая следующие комбинации на основе максимизации ожидаемого улучшения. Байесовская оптимизация особенно эффективна для задач, где тестирование гиперпараметров является дорогостоящим процессом, так как она позволяет минимизировать количество необходимых итераций. Такой подход часто используется в автоматическом машинном обучении (AutoML) и сложных моделях глубокого обучения.
Рассмотрим задачу поиска гиперпараметров для логистической регрессии при работе с датасетом `Breast Cancer` из библиотеки `sklearn`. Мы будем искать оптимальные значения для двух гиперпараметров:
1. `C` – обратная величина коэффициента регуляризации.
2. Тип регуляризации: `L1` или `L2`.
Применим три метода: сеточный поиск, случайный поиск и Байесовскую оптимизацию, сравнив их результаты.
Код с решением
```python
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, GridSearchCV, RandomizedSearchCV
from sklearn.metrics import accuracy_score
from skopt import BayesSearchCV
# Загрузка данных
data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Логистическая регрессия
model = LogisticRegression(solver='liblinear', max_iter=1000)
1. Сеточный поиск
grid_params = {
'C': [0.01, 0.1, 1, 10, 100],
'penalty': ['l1', 'l2']
}
grid_search = GridSearchCV(estimator=model, param_grid=grid_params, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
grid_best_params = grid_search.best_params_
grid_best_score = grid_search.best_score_
2. Случайный поиск
random_params = {
'C': np.logspace(-2, 2, 20),
'penalty': ['l1', 'l2']
}
random_search = RandomizedSearchCV(estimator=model, param_distributions=random_params, n_iter=10, cv=5, scoring='accuracy', random_state=42)
random_search.fit(X_train, y_train)
random_best_params = random_search.best_params_
random_best_score = random_search.best_score_
3. Байесовская оптимизация
bayes_search = BayesSearchCV(
estimator=model,
search_spaces={
'C': (1e-2, 1e2, 'log-uniform'),
'penalty': ['l1', 'l2']
},
n_iter=20,
cv=5,
scoring='accuracy',
random_state=42
)
bayes_search.fit(X_train, y_train)
bayes_best_params = bayes_search.best_params_
bayes_best_score = bayes_search.best_score_
# Оценка на тестовой выборке
grid_test_accuracy = accuracy_score(y_test, grid_search.best_estimator_.predict(X_test))
random_test_accuracy = accuracy_score(y_test, random_search.best_estimator_.predict(X_test))
bayes_test_accuracy