Как определить критерии остановки для forward/backward selection?

«Как определить критерии остановки для forward/backward selection?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я использовал комбинацию критериев, чтобы остановить отбор признаков до переобучения. Вот мои практические правила:

Основные критерии остановки:

  1. Отсутствие значимого улучшения на валидации. Это главный критерий. Я останавливаюсь, когда добавление/удаление очередного признака не даёт прироста целевой метрики (например, 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)
  2. Минимизация информационного критерия (AIC/BIC). Для линейных моделей я часто останавливался, когда значение AIC переставало уменьшаться. Это автоматически балансирует качество и сложность модели.

  3. Контроль переобучения через кросс-валидацию. Я запускал StratifiedKFold на каждом шаге. Если средняя метрика на валидационных фолдах начинала снижаться, а на тренировочных — расти, это явный сигнал к остановке.

  4. Статистическая значимость (p-value). При использовании statsmodels для линейной/логистической регрессии я добавлял только признаки с p-value < 0.05 и удалял те, у которых p-value становился выше 0.1.

Практический совет: Я никогда не полагался на один критерий. Например, в задаче предсказания оттока я сочетал контроль AUC на валидации с мониторингом AIC. Как только оба критерия переставали улучшаться два шага подряд — процесс останавливался.