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

Две главные беды моделей — и как поймать каждую по разнице ошибок на 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Сделать модель ещё более гибкой и сложной