Переобучение и недообучение

Две главные беды моделей — и как поймать каждую по разнице ошибок на train и test.

Переобучение (overfitting) — модель отлично работает на обучающих данных, но плохо на новых: она «зазубрила» примеры вместо того, чтобы уловить закономерность.

Недообучение (underfitting) — модель слишком проста и не уловила закономерность даже на обучающих данных.

Аналогия со студентом

Это самая важная тема всего курса, поэтому начнём с образа.

  • Недообучение — студент почти не готовился: плохо решает и знакомые, и новые задачи.
  • Хороший баланс — студент понял принцип: решает и знакомые, и новые задачи.
  • Переобучение — студент вызубрил ответы к конкретным задачам наизусть: на знакомых блистает, на новых теряется.

Как распознать по ошибкам

Главный диагностический приём — сравнить ошибку на train и на test:

Ошибка на trainОшибка на testДиагноз
БольшаяБольшаяНедообучение
МаленькаяМаленькаяХороший баланс
Очень маленькаяБольшаяПереобучение

Сигнал переобучения — большой разрыв: на train почти идеально, на test заметно хуже. Сигнал недообучения — плохо везде, даже на train.

# Имитация: как разрыв train/test выдаёт переобучение
models = [
    # (название, ошибка на train, ошибка на test)
    ("слишком простая", 0.40, 0.42),
    ("в самый раз",      0.12, 0.15),
    ("слишком сложная",  0.01, 0.35),
]

for name, train_err, test_err in models:
    gap = test_err - train_err
    if train_err > 0.3:
        diag = "НЕДООБУЧЕНИЕ"
    elif gap > 0.15:
        diag = "ПЕРЕОБУЧЕНИЕ"
    else:
        diag = "баланс ок"
    print(f"{name:18} train={train_err} test={test_err} -> {diag}")

Вывод:

слишком простая    train=0.4 test=0.42 -> НЕДООБУЧЕНИЕ
в самый раз        train=0.12 test=0.15 -> баланс ок
слишком сложная    train=0.01 test=0.35 -> ПЕРЕОБУЧЕНИЕ

Почему так происходит

Всё упирается в сложность модели относительно данных. Слишком простая модель (например, прямая там, где зависимость изогнута) не способна описать закономерность — недообучение. Слишком гибкая модель (очень глубокое дерево, чересчур извилистая граница) описывает не только закономерность, но и случайный шум обучающей выборки — переобучение. Между ними есть золотая середина.

Как бороться с переобучением

  • Больше данных. Чем больше примеров, тем труднее «зазубрить» их все и тем заметнее настоящая закономерность.
  • Упростить модель. Ограничить глубину дерева, уменьшить число признаков.
  • Регуляризация. Штраф за чрезмерную сложность, который удерживает модель от слишком извилистых решений.
  • Проверять на отложенных данных и кросс-валидации. Чтобы вовремя заметить разрыв.

Как бороться с недообучением

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

Итог

  • Недообучение — плохо и на train, и на test (модель слишком проста).
  • Переобучение — отлично на train, плохо на test (модель зазубрила шум).
  • Диагноз ставят по разрыву ошибок train и test.
  • Против переобучения: больше данных, проще модель, регуляризация, честная проверка.
Проверьте себя
1. Что такое переобучение (overfitting)?
AМодель плохо работает и на обучающих, и на новых данных
BМодель отлично работает на обучающих данных, но плохо на новых — она зазубрила шум
CМодель обучается слишком быстро
DМодель использует слишком мало признаков
2. Какая картина ошибок указывает на переобучение?
AБольшая ошибка и на train, и на test
BОчень маленькая ошибка на train, но большая на test (большой разрыв)
CОдинаково маленькая ошибка на train и test
DОшибка на test меньше, чем на train
3. Какой способ НЕ помогает против переобучения?
AСобрать больше данных
BУпростить модель или применить регуляризацию
CСделать модель ещё более гибкой и сложной
DПроверять качество на отложенных данных
Поддержать проект