Ответ
Я использовал комбинацию критериев, чтобы остановить отбор признаков до переобучения. Вот мои практические правила:
Основные критерии остановки:
-
Отсутствие значимого улучшения на валидации. Это главный критерий. Я останавливаюсь, когда добавление/удаление очередного признака не даёт прироста целевой метрики (например,
AUC-ROCилиF1-score) на отдельном валидационном наборе больше, чем на заданный порог (например,threshold = 0.001).# Упрощённая логика внутри цикла отбора current_score = evaluate_model(X_train[:, selected], y_train, X_val[:, selected], y_val) if len(history_scores) > 1: improvement = current_score - max(history_scores) if improvement < IMPROVEMENT_THRESHOLD: print(f"Остановка. Улучшение {improvement:.4f} < порога {IMPROVEMENT_THRESHOLD}") break history_scores.append(current_score) -
Минимизация информационного критерия (AIC/BIC). Для линейных моделей я часто останавливался, когда значение AIC переставало уменьшаться. Это автоматически балансирует качество и сложность модели.
-
Контроль переобучения через кросс-валидацию. Я запускал
StratifiedKFoldна каждом шаге. Если средняя метрика на валидационных фолдах начинала снижаться, а на тренировочных — расти, это явный сигнал к остановке. -
Статистическая значимость (p-value). При использовании
statsmodelsдля линейной/логистической регрессии я добавлял только признаки сp-value < 0.05и удалял те, у которыхp-valueстановился выше0.1.
Практический совет: Я никогда не полагался на один критерий. Например, в задаче предсказания оттока я сочетал контроль AUC на валидации с мониторингом AIC. Как только оба критерия переставали улучшаться два шага подряд — процесс останавливался.