Что такое переобучение модели
Переобучение (overfitting) — модель запомнила обучающие примеры вместе со случайными особенностями и ошибками, а общую закономерность не уловила. На обучающих данных она почти не ошибается, на новых — ошибается часто. Как ученик, который вызубрил ответы к задачнику: на тех же задачах — пятёрка, на контрольной с новыми — двойка.
Главный признак: точность на обучающей выборке высокая, на проверочной — заметно ниже.
Пример: зубрила и правило
Две модели решают, спам ли письмо, по числу восклицательных знаков. «Зубрила» запоминает каждый пример, а на незнакомое отвечает «не спам». «Правило» — простой порог: спам, если знаков 4 и больше. В обучающих данных есть одна ошибка-«шум»: поздравление с 7 восклицательными знаками — не спам.
train = [(0, 0), (1, 0), (2, 0), (3, 0), (4, 1), (5, 1), (6, 1), (7, 0)]
test = [(2, 0), (3, 1), (5, 1), (7, 1), (8, 1), (9, 1)]
memory = dict(train)
def memorizer(marks):
return memory.get(marks, 0)
def rule(marks):
return 1 if marks >= 4 else 0
def score(model, data):
correct = sum(1 for marks, label in data if model(marks) == label)
return f"{correct} из {len(data)}"
for name, model in [("Зубрила", memorizer), ("Правило", rule)]:
print(name, "— обучение:", score(model, train), "проверка:", score(model, test))Зубрила — обучение: 8 из 8 проверка: 2 из 6
Правило — обучение: 7 из 8 проверка: 5 из 6На обучающих данных «зубрила» безупречна, но на проверке проваливается: она выучила и шумный пример, и не знает, что делать с письмами, которых не видела. Простое правило ошибается на обучении один раз, зато на новых данных работает лучше. Это и есть переобучение — и причина, по которой модели проверяют на отдельной выборке.
Почему так бывает
- Модель слишком сложная для объёма данных: у неё хватает «памяти», чтобы запомнить каждый пример.
- Данных мало, и случайные особенности выглядят как закономерность.
- Обучение длится слишком долго: сначала модель учит общее, потом — подгоняется под частности.
Что помогает
- Больше данных — самый надёжный способ.
- Модель проще: меньше параметров, меньшая глубина дерева решений.
- Регуляризация — штраф за слишком сложную модель во время обучения.
- Ранняя остановка (early stopping) — обучение прекращают, когда ошибка на проверочных данных перестаёт падать.
- Кросс-валидация — данные делят на несколько частей и по очереди проверяют модель на каждой. Так оценка точности надёжнее, чем по одному делению.
Обратная беда — недообучение
Недообучение (underfitting) — модель слишком простая и не улавливает даже основную закономерность: ошибается и на обучающих данных, и на новых. Помогают модель посложнее и более полезные признаки. Хорошая модель — между этими крайностями.
Подводный камень
Проверочную выборку нельзя использовать для подбора настроек модели много раз подряд: модель постепенно «подгоняется» и под неё. Поэтому данные часто делят на три части: обучающую, валидационную (для подбора настроек) и тестовую — её открывают один раз, в самом конце.
Как делить данные на практике — в уроке Машинное обучение на Python.