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