Собесов

Сценарий ML: критерии early stopping

ML / Data ScienceOverfitting и регуляризацияСредняяMiddle

Условие

Опишите early stopping: критерии, гиперпараметры, как избежать ложных стопов.

Решение

Подход

Early stopping: отслеживаем validation метрику; если она не улучшается patience эпох подряд — стоп, восстанавливаем best checkpoint.

Гиперпараметры:

  • patience — сколько эпох ждать без улучшения (5–30).
  • min_delta — минимальное улучшение чтобы считать «улучшилось» (0.0001).
  • modemin (loss) или max (AUC).
  • restore_best_weights — возврат к лучшим весам после стопа.

Реализация

class EarlyStopping:
    def __init__(self, patience=10, min_delta=0.0, mode='min', restore_best=True):
        self.patience = patience
        self.min_delta = min_delta
        self.mode = mode
        self.restore_best = restore_best
        self.best = None
        self.counter = 0
        self.best_weights = None
        self.stopped = False
 
    def step(self, score, model):
        improved = (self.best is None or
                    (self.mode == 'min' and score < self.best - self.min_delta) or
                    (self.mode == 'max' and score > self.best + self.min_delta))
        if improved:
            self.best = score
            self.counter = 0
            if self.restore_best:
                self.best_weights = {k: v.detach().clone() for k,v in model.state_dict().items()}
        else:
            self.counter += 1
            if self.counter >= self.patience:
                self.stopped = True
                if self.restore_best and self.best_weights:
                    model.load_state_dict(self.best_weights)
                return True
        return False

Альтернативные критерии

  • Generalization Loss: GL(t) = E_val(t)/min_E_val − 1. Стоп при GL > α.
  • Progress: окно с медленным train loss progress → нет смысла продолжать.
  • PQ criterion: GL/Progress > thresh.

В boosting

XGBoost / LightGBM имеют early_stopping_rounds: остановиться через k раундов без улучшения, отдать best_iteration.

import lightgbm as lgb
model = lgb.LGBMClassifier(n_estimators=10000)
model.fit(X_tr, y_tr,
          eval_set=[(X_val, y_val)],
          callbacks=[lgb.early_stopping(50)])

Подводные камни

  1. Patience слишком мал: «шум» в val ведёт к stop в локальном максимуме. На neural nets patience обычно 20-50.
  2. Train shuffle нестабильный seed: val лосс с epoch-to-epoch шумом → ложные стопы. Зафиксируйте seed.
  3. Min_delta слишком большой → стоп слишком рано.
  4. Early stopping считается формой регуляризации. Можно вместо явной L2 на больших сетях.
  5. В CV: на каждом fold отдельный early stop, не сравнивайте напрямую n_iters между folds.
  6. Early stopping на test = leakage. Stop по val, финальная оценка на test.

Эталонный ответ

Stop через patience эпох без улучшения val (mode min/max, min_delta для шума). Восстанавливать best weights. Можно как замену L2 на больших сетях. Не использовать test для early stop — leakage.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти