Переобучение и регуляризация
«Как поймёшь, что модель переобучилась» и «как ты строишь валидацию» - любимая пара вопросов на скрининге. По ответам мгновенно видно, выкатывал ли ты модели в прод или только в ноутбук. Провалишься здесь - остальные ответы уже слушать не будут.
Отдельный фаворит - утечки. Почти в каждой второй истории «на валидации было прекрасно, в проде развалилось» виновата именно утечка, и интервьюеры это знают по своему опыту.
// Типовые формулировки: «модель отлично на валидации и плохо в проде, что проверишь?», «как разрежешь данные, если они временные?», «зачем нужен отдельный тест, если есть кросс-валидация?».
Сначала диагноз, потом лечение
Переобучение - это когда модель выучила не закономерность, а конкретные примеры вместе с их случайным шумом. На обучающих данных она блистает, на новых сдувается. Диагностируется по разрыву: метрика на трейне отличная, на валидации заметно хуже.
Недообучение - противоположная беда: плохо и там, и там. Модель просто слишком проста для той зависимости, которая есть в данных.
Это два конца одной оси. С одной стороны стоит смещение - систематическая ошибка от того, что модель примитивнее реальности. С другой дисперсия - чувствительность к тому, какая именно выборка попалась. Усложняешь модель - смещение падает, дисперсия растёт. Упрощаешь - наоборот.
// И вот почему диагноз идёт первым: лечение у них противоположное. От переобучения помогают больше данных, модель попроще, регуляризация, ранняя остановка, ансамбли. От недообучения - модель посложнее и признаки посильнее. Добавить регуляризацию недообученной модели значит сделать ей хуже.
- смещение и дисперсия
- систематическая ошибка от простоты модели против её чувствительности к конкретной выборке
Валидация, которая не врёт
Один случайный отложенный кусок - слабая опора: повезло с разбиением, и метрика выглядит лучше правды. Поэтому режут на k частей и прогоняют k раз, каждый раз оставляя валидацией новую часть. Это k-fold. Он даёт среднюю метрику и вдобавок её разброс, а разброс говорит, насколько вообще можно доверять этому среднему. Стратификация при этом следит, чтобы доли классов в каждой части остались как в целом, иначе редкий класс может целиком уехать в одну часть.
Главное правило звучит так: схема разбиения обязана повторять то, что будет в проде. Если данные временные - режь только по времени: учись на прошлом, проверяйся на будущем. Случайное разбиение подсунет модели завтрашний день, и метрика окажется фантастикой. Если объекты связаны - несколько сессий одного пользователя, несколько снимков одного пациента - режь по группам, иначе один и тот же человек окажется и в обучении, и в проверке.
// Про тест отдельно. Это выборка, к которой прикасаются ровно один раз, в самом конце. Погонял по ней гиперпараметры - всё, она превратилась в валидацию, и честной оценки у тебя больше нет.
- k-fold
- разрезать данные на k частей и k раз обучиться, каждый раз проверяясь на новой
- стратификация
- сохранить доли классов в каждой части, чтобы редкий класс не выпал целиком
Утечки: почему валидация иногда врёт красиво
Утечка - это когда в признаки просочилась информация, которой в момент предсказания у тебя не будет. Самая наглая её форма - утечка целевой переменной: агрегат, посчитанный за весь период вместе с исходом; поле, которое в жизни заполняют уже после события; идентификатор, случайно связанный с меткой.
Есть форма потише и оттого более частая - утечка через подготовку данных. Обучил скейлер или энкодер на всём датасете до разбиения, и статистики проверочной части протекли в обучающую. Правило одно и простое: всё, что хоть чему-то учится, учится только на обучающей части.
// Лучший детектор - здоровая паранойя. Метрика, слишком хорошая для этой задачи, - не повод радоваться, а повод искать утечку. Радоваться будешь после того, как не найдёшь.
- утечка (data leakage)
- в признаки попало то, чего в момент предсказания знать нельзя
Как отвечать: «На валидации отлично, в проде провал - что проверишь первым?»
Первым делом утечку: нет ли признака, которого в момент предсказания ещё не существует - агрегатов за весь период, полей, заполняемых после исхода. Дальше проверю честность самой валидации: временные данные должны быть разрезаны по времени, связанные объекты не должны сидеть одновременно в обучении и в проверке, а препроцессинг должен быть обучен только на трейне. И лишь убедившись, что схема честная, буду думать про дрифт: распределение в проде могло уехать от того, на котором училась модель.
Порядок проверок от самой частой причины к самой редкой. Дрифт называют первым те, кто утечек ещё не ловил.
На чём валят
- −Подбирать гиперпараметры по тесту: он молча превращается в валидацию, и финальная оценка оказывается завышенной.
- −Обучать скейлер или энкодер до разбиения: статистики проверочной части утекают в обучающую.
- −Дубликаты и связанные объекты по обе стороны разбиения: метрика красивая, обобщения нет; нужен сплит по группам.
- −Лечить недообучение регуляризацией: станет только хуже. Сначала диагноз по разрыву трейн-валидация, потом лечение.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 14, остальные разбираются в тренажёре.
- Что такое bias-variance trade-off?A)Компромисс между скоростью обучения и качеством моделиB)Компромисс между риском переобучения на трейне и риском утечки данных при валидации моделиC)Баланс классов в обучающей выборкеD)Разложение ошибки на смещение, дисперсию и шум: уменьшая одно, обычно растишь другое
показать ответ и разбор
+D)Разложение ошибки на смещение, дисперсию и шум: уменьшая одно, обычно растишь другое// разбор: Простые модели — высокое смещение, низкая дисперсия (стабильно, но грубо); сложные — наоборот. Сумма с шумом даёт ожидаемую ошибку, минимум — где-то посередине. Ансамбли ломают наивную картину: бэггинг режет дисперсию почти без роста смещения, бустинг — смещение с контролем дисперсии.
- Что такое переобучение, своими словами?A)Модель обучалась слишком долго и деградировала численноB)Модель выучила шум и частности трейна вместо закономерности — на новых данных работает хужеC)Модель слишком простая: не ловит закономерность даже в обучающей выборке, сколько её ни учи — ошибка высокая вездеD)В данных слишком много признаков, и модель не может выбрать нужные
показать ответ и разбор
+B)Модель выучила шум и частности трейна вместо закономерности — на новых данных работает хуже// разбор: Переобучение — модель подогналась под конкретную выборку: шум, выбросы, случайные совпадения. Симптом — разрыв между качеством на трейне и на новых данных. Противоядия: больше данных, регуляризация, модель попроще, ранняя остановка и честная валидация, которая разрыв вовремя покажет.
- Ошибка на трейне продолжает падать, на валидации — прошла минимум и растёт. Что происходит и где остановить обучение?A)Недообучение; учить дальше, пока валидация не догонит трейнB)Утечка данных; валидационная кривая не должна растиC)Началось переобучение; остановиться в минимуме валидационной ошибкиD)Шум оптимизации; сгладить кривые и учить до конца
показать ответ и разбор
+C)Началось переобучение; остановиться в минимуме валидационной ошибки// разбор: Расходящиеся кривые — модель начала выучивать шум трейна: тренировочная ошибка падает, обобщение ухудшается. Точка минимума валидационной кривой — и есть ранняя остановка. На практике ждут patience итераций без улучшения и откатываются к лучшей точке, чтобы не среагировать на случайный зубец.
- Как работает early stopping в градиентном бустинге и по какой выборке его настраивать?A)После каждой итерации меряем качество на отложенной валидации; N раундов без улучшения — стоп и откат к лучшейB)Останавливаемся, когда лосс на трейне перестал падатьC)Останавливаемся на фиксированной итерации, заранее подобранной по тестовой выборке — так тест приносит пользу дваждыD)Бустинг останавливается сам, когда остатки станут нулевыми
показать ответ и разбор
+A)После каждой итерации меряем качество на отложенной валидации; N раундов без улучшения — стоп и откат к лучшей// разбор: Early stopping следит за метрикой на выборке, которой нет в обучении: плато или рост в течение early_stopping_rounds — сигнал, что новые деревья подгоняют шум. Трейн-лосс падает почти всегда и сигналом не является; тест использовать нельзя — это скрытый тюнинг по тесту.
- Почему добавление данных лечит переобучение, но почти не помогает при недообучении?A)Больше данных ускоряет сходимость оптимизатора в обоих случаях одинаковоB)Новые данные уменьшают смещение модели, а дисперсию не трогаютC)Помогает одинаково и там и там: чем больше обучающих данных, тем лучше обобщает модель — это универсальный закон MLD)Данные снижают дисперсию (шум труднее запомнить), а смещение задано самой моделью — простая останется простой
показать ответ и разбор
+D)Данные снижают дисперсию (шум труднее запомнить), а смещение задано самой моделью — простая останется простой// разбор: Переобучение — проблема дисперсии: на большем датасете шум усредняется, запомнить его труднее, разрыв train/test сужается. Недообучение — проблема смещения: линейная модель на нелинейной задаче не станет лучше от миллиона точек; там нужны признаки или более выразительная модель.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.