Узнайте, как EliminationSearchCV ускоряет перебор гиперпараметров до 152 раз, отсеивая плохие значения на ранних этапах. Попробуйте прямо сейчас!
Если вы когда-нибудь настраивали гиперпараметры на большой сетке, вы знаете эту боль. Вы запускаете GridSearchCV, идёте за кофе, возвращаетесь — а оно всё ещё работает. Может, идёте обедать. Может, оно всё ещё работает. Я разозлился настолько, что построил нечто другое. Называется EliminationSearchCV.
GridSearchCV — это грубая сила по дизайну. Для сетки с k параметрами и n значениями каждый, она оценивает nᵏ × cv_folds конфигураций — каждую, независимо от того, насколько плохо значение проявляет себя в начале.
Вот что это означает на практике:
Последний пункт — убийца. Ваша сетка не должна быть огромной, чтобы это было больно — она просто должна расти.
Что, если вместо оценки всего сразу мы будем тестировать значения параметров раундами — и отбрасывать плохие до того, как они размножатся?
Вот как работает EliminationSearchCV:
Плохие значения отсекаются рано. Они никогда не успевают размножиться в тысячи бесполезных комбинаций.
Настроим LogisticRegression с 4 параметрами:
param_grid = {
'C': [0.001, 0.01, 0.1, 1, 10, 100], # 6 значений
'penalty': ['l1', 'l2'], # 2 значения
'solver': ['liblinear', 'saga'], # 2 значения
'max_iter': [1000, 2000] # 2 значения
}
# GridSearchCV: 6 × 2 × 2 × 2 = 48 комбинаций × 5 фолдов = 240 обученийС EliminationSearchCV и elimination_rate=0.8 (оставляем лучшие 20%):
Итого: 23 обучения против 240 у GridSearchCV. Те же лучшие параметры. Доля работы.
API намеренно идентичен GridSearchCV:
from EliminationSearchCV import EliminationSearchCV
# Было:
# search = GridSearchCV(model, param_grid, cv=5)
# Стало — просто меняем имя класса
search = EliminationSearchCV(
estimator=model,
param_grid=param_grid,
scoring='accuracy',
cv=5,
elimination_rate=0.8 # исключаем худшие 80% в каждом раунде
)
search.fit(X_train, y_train)
# Тот же интерфейс, что и у GridSearchCV
print(search.best_params_)
# → {'C': 1, 'penalty': 'l1', 'solver': 'liblinear', 'max_iter': 1000}
print(search.best_score_)
# → 0.9248
# Уже переобучен на всей обучающей выборке — готов к предсказанию
search.best_estimator_.predict(X_test)Sklearn может выдавать ошибки для несовместимых комбинаций — например, penalty='l1' с solver='lbfgs'. GridSearchCV на них падает. Приходится вручную фильтровать. EliminationSearchCV перехватывает любое исключение во время fit(), оценивает такую комбинацию в 0.0 и позволяет логике исключения обработать её естественно. Недопустимые комбинации просто умирают в раунде 1. Никакой специальной обработки от вас не требуется.
Протестировано на 5 моделях и 3 датасетах (cv=2, elimination_rate=0.8, 10000 сэмплов):
Полные сетки — вот где это сияет. Потеря точности минимальна — менее 0.02 на всех моделях, часто ноль.
Честное предостережение: Лёгкие сетки (маленькие пространства поиска) с этим подходом медленнее. Накладные расходы на исключение не окупаются, если комбинаций мало. Если ваша сетка маленькая, оставайтесь с GridSearchCV.
Библиотека состоит из двух файлов:
src/EliminationSearchCV/
├── EliminationSearchCV.py # Основной класс: fit(), логика исключения, оценка
└── Utils.py # Вспомогательные функции: создание фолдов, генерация комбинаций, метрикиПоток внутри fit():
EliminationSearchCV.fit(X, y)
│
├─▶ Utils.create_cv_data_sets() — StratifiedKFold/KFold разбиения
│
└─▶ [Для каждого раунда i = 1 … n_params]
│
├─▶ generate_param_combinations_with_limit(grid, limit=i)
│
├─▶ _score_candidates(candidates)
│ — оценка метрики по фолдам
│
└─▶ _eliminate_low_scoring_values(candidates, scores)
├─▶ _eliminate_single_param_values() — Раунд 1
└─▶ _eliminate_multi_param_values() — Раунды 2+Ключевое дизайнерское решение: в раунде 1 значения каждого параметра оцениваются и сравниваются изолированно — так значения C конкурируют только с другими значениями C, а не с penalty. Это предотвращает взаимное влияние параметров, находящихся на совершенно разных шкалах. В последующих раундах все комбинации ранжируются глобально, и выживает доля (1 - elimination_rate).
Поддерживается:
В планах:
pip install elimination-search-cvТребования: Python ≥ 3.8. scikit-learn и numpy устанавливаются автоматически.
GitHub: https://github.com/thisal-d/elimination-search-cv
Это экспериментальный подход. Качество результатов сильно зависит от датасета и модели. Я активно тестирую его, и результаты пока многообещающие — но я бы не назвал его production-ready. Мне искренне нужна обратная связь о граничных случаях, где он даёт сбои. Если вы попробуете его на сетке, где он даёт явно неверные результаты или ведёт себя неожиданно, пожалуйста, откройте issue. Это будет полезнее похвалы.
Если вам было интересно, ⭐ на репозитории очень помогает — это поддерживает мотивацию продолжать разработку.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →