
Введение
Настройка гиперпараметров моделей машинного обучения сочетает искусство и мастерство: приходится балансировать опыт, интуицию и эксперименты. В реальности процесс бывает сложным из-за огромного пространства поиска в продвинутых моделях, запутанных взаимодействий параметров и едва заметных улучшений от их подгонки.
Мы подобрали 7 приемов для Scikit-learn, чтобы поднять умения настройки гиперпараметров на ступень выше.
1. Ограничение пространства поиска знаниями домена
Без сужения большого пространства поиска приходится рыскать в поисках иголки в стоге сена. Опирайтесь на знания предметной области или спросите эксперта, чтобы сразу задать разумные пределы для важных гиперпараметров модели. Так вы упростите задачу, сделаете вычисления реальными и отбросите немыслимые комбинации.
Пример сетки для двух распространенных гиперпараметров случайного леса:
param_grid = {"max_depth": [3, 5, 7], "min_samples_split": [2, 10]}2. Широкий старт со случайным поиском
При ограниченном бюджете стоит взять случайный поиск — он ловко осматривает просторы, семплируя значения гиперпараметров по распределениям. Взять хотя бы пример с параметром C, который отвечает за жесткость границ в моделях SVM:
param_dist = {"C": loguniform(1e-3, 1e2)}
RandomizedSearchCV(SVC(), param_dist, n_iter=20)3. Локальная доводка сеточным поиском
Когда случайный поиск наметил удачные зоны, подключите узконаправленный сеточный поиск, чтобы выжать дополнительные крохи производительности. Сначала разведка, потом детальная проработка.
GridSearchCV(SVC(), {"C": [5, 10], "gamma": [0.01, 0.1]})4. Включение пайплайнов предобработки в настройку гиперпараметров
Пайплайны Scikit-learn здорово упрощают полный цикл машинного обучения и избавляют от утечек данных. Гиперпараметры предобработки и модели настраиваются заодно, если передать пайплайн в инструмент поиска:
param_grid = {
"scaler__with_mean": [True, False], # Scaling hyperparameter
"clf__C": [0.1, 1, 10], # SVM model hyperparameter
"clf__kernel": ["linear", "rbf"] # Another SVM hyperparameter
}
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)5. Обмен скоростью на надежность с кросс-валидацией
Кросс-валидация — обычное дело при настройке гиперпараметров в Scikit-learn, но полезно помнить: без нее берется один разрез train-validation, что ускоряет процесс, но дает разбросанные и порой ненадежные итоги. Больше фолдов — например, cv=5 — дает стабильность оценок для честного сравнения моделей. Подберите подходящее число:
GridSearchCV(model, params, cv=5)6. Оптимизация по нескольким метрикам
При наличии компромиссов в показателях полезно отслеживать сразу несколько метрик — это высветит trade-off'ы, которые ускользают при фокусе на одной. А refit позволит выбрать главную метрику для итоговой "лучшей" модели.
from sklearn.model_selection import GridSearchCV
param_grid = {
"C": [0.1, 1, 10],
"gamma": [0.01, 0.1]
}
scoring = {
"accuracy": "accuracy",
"f1": "f1"
}
gs = GridSearchCV(
SVC(), param_grid, scoring=scoring, refit="f1", # metric used to select the final model
cv=5
)
gs.fit(X_train, y_train)7. Разумный разбор результатов
Когда настройка завершена и найдена модель с лучшим счетом, копните глубже с помощью cv_results_ — разберитесь во взаимодействиях параметров, тенденциях или постройте графики. Вот пример отчета и сортировки результатов для объекта сеточного поиска gs после финиша:
import pandas as pd
results_df = pd.DataFrame(gs.cv_results_)
# Target columns for our report
columns_to_show = [
'param_clf__C',
'mean_test_score',
'std_test_score',
'mean_fit_time',
'rank_test_score'
]
print(results_df[columns_to_show].sort_values('rank_test_score'))Итоги
Настройка гиперпараметров дает максимум, если подходить к ней последовательно и с умом. Соединяя грамотные стратегии поиска, верную проверку и тщательный анализ, удастся выжать стоящие приросты без пустой траты ресурсов и переобучения. Думайте о ней как об итеративном процессе обучения, а не просто о галочке в списке.