сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Классический ML

Переобучение и регуляризация

Зачем это спрашивают

«Как поймёшь, что модель переобучилась» и «как ты строишь валидацию» - любимая пара вопросов на скрининге. По ответам мгновенно видно, выкатывал ли ты модели в прод или только в ноутбук. Провалишься здесь - остальные ответы уже слушать не будут.

Отдельный фаворит - утечки. Почти в каждой второй истории «на валидации было прекрасно, в проде развалилось» виновата именно утечка, и интервьюеры это знают по своему опыту.

// Типовые формулировки: «модель отлично на валидации и плохо в проде, что проверишь?», «как разрежешь данные, если они временные?», «зачем нужен отдельный тест, если есть кросс-валидация?».

Сначала диагноз, потом лечение

Переобучение - это когда модель выучила не закономерность, а конкретные примеры вместе с их случайным шумом. На обучающих данных она блистает, на новых сдувается. Диагностируется по разрыву: метрика на трейне отличная, на валидации заметно хуже.

Недообучение - противоположная беда: плохо и там, и там. Модель просто слишком проста для той зависимости, которая есть в данных.

Это два конца одной оси. С одной стороны стоит смещение - систематическая ошибка от того, что модель примитивнее реальности. С другой дисперсия - чувствительность к тому, какая именно выборка попалась. Усложняешь модель - смещение падает, дисперсия растёт. Упрощаешь - наоборот.

// И вот почему диагноз идёт первым: лечение у них противоположное. От переобучения помогают больше данных, модель попроще, регуляризация, ранняя остановка, ансамбли. От недообучения - модель посложнее и признаки посильнее. Добавить регуляризацию недообученной модели значит сделать ей хуже.

смещение и дисперсия
систематическая ошибка от простоты модели против её чувствительности к конкретной выборке

Валидация, которая не врёт

Один случайный отложенный кусок - слабая опора: повезло с разбиением, и метрика выглядит лучше правды. Поэтому режут на k частей и прогоняют k раз, каждый раз оставляя валидацией новую часть. Это k-fold. Он даёт среднюю метрику и вдобавок её разброс, а разброс говорит, насколько вообще можно доверять этому среднему. Стратификация при этом следит, чтобы доли классов в каждой части остались как в целом, иначе редкий класс может целиком уехать в одну часть.

Главное правило звучит так: схема разбиения обязана повторять то, что будет в проде. Если данные временные - режь только по времени: учись на прошлом, проверяйся на будущем. Случайное разбиение подсунет модели завтрашний день, и метрика окажется фантастикой. Если объекты связаны - несколько сессий одного пользователя, несколько снимков одного пациента - режь по группам, иначе один и тот же человек окажется и в обучении, и в проверке.

// Про тест отдельно. Это выборка, к которой прикасаются ровно один раз, в самом конце. Погонял по ней гиперпараметры - всё, она превратилась в валидацию, и честной оценки у тебя больше нет.

k-fold
разрезать данные на k частей и k раз обучиться, каждый раз проверяясь на новой
стратификация
сохранить доли классов в каждой части, чтобы редкий класс не выпал целиком

Утечки: почему валидация иногда врёт красиво

Утечка - это когда в признаки просочилась информация, которой в момент предсказания у тебя не будет. Самая наглая её форма - утечка целевой переменной: агрегат, посчитанный за весь период вместе с исходом; поле, которое в жизни заполняют уже после события; идентификатор, случайно связанный с меткой.

Есть форма потише и оттого более частая - утечка через подготовку данных. Обучил скейлер или энкодер на всём датасете до разбиения, и статистики проверочной части протекли в обучающую. Правило одно и простое: всё, что хоть чему-то учится, учится только на обучающей части.

// Лучший детектор - здоровая паранойя. Метрика, слишком хорошая для этой задачи, - не повод радоваться, а повод искать утечку. Радоваться будешь после того, как не найдёшь.

утечка (data leakage)
в признаки попало то, чего в момент предсказания знать нельзя

Как отвечать: «На валидации отлично, в проде провал - что проверишь первым?»

Первым делом утечку: нет ли признака, которого в момент предсказания ещё не существует - агрегатов за весь период, полей, заполняемых после исхода. Дальше проверю честность самой валидации: временные данные должны быть разрезаны по времени, связанные объекты не должны сидеть одновременно в обучении и в проверке, а препроцессинг должен быть обучен только на трейне. И лишь убедившись, что схема честная, буду думать про дрифт: распределение в проде могло уехать от того, на котором училась модель.

Порядок проверок от самой частой причины к самой редкой. Дрифт называют первым те, кто утечек ещё не ловил.

На чём валят

  • Подбирать гиперпараметры по тесту: он молча превращается в валидацию, и финальная оценка оказывается завышенной.
  • Обучать скейлер или энкодер до разбиения: статистики проверочной части утекают в обучающую.
  • Дубликаты и связанные объекты по обе стороны разбиения: метрика красивая, обобщения нет; нужен сплит по группам.
  • Лечить недообучение регуляризацией: станет только хуже. Сначала диагноз по разрыву трейн-валидация, потом лечение.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 14, остальные разбираются в тренажёре.

  1. #overfitting_regularization1 / 5
    Что такое bias-variance trade-off?
    A)Компромисс между скоростью обучения и качеством модели
    B)Компромисс между риском переобучения на трейне и риском утечки данных при валидации модели
    C)Баланс классов в обучающей выборке
    D)Разложение ошибки на смещение, дисперсию и шум: уменьшая одно, обычно растишь другое
    показать ответ и разбор
    +D)Разложение ошибки на смещение, дисперсию и шум: уменьшая одно, обычно растишь другое

    // разбор: Простые модели — высокое смещение, низкая дисперсия (стабильно, но грубо); сложные — наоборот. Сумма с шумом даёт ожидаемую ошибку, минимум — где-то посередине. Ансамбли ломают наивную картину: бэггинг режет дисперсию почти без роста смещения, бустинг — смещение с контролем дисперсии.

  2. #overfitting_regularization2 / 5
    Что такое переобучение, своими словами?
    A)Модель обучалась слишком долго и деградировала численно
    B)Модель выучила шум и частности трейна вместо закономерности — на новых данных работает хуже
    C)Модель слишком простая: не ловит закономерность даже в обучающей выборке, сколько её ни учи — ошибка высокая везде
    D)В данных слишком много признаков, и модель не может выбрать нужные
    показать ответ и разбор
    +B)Модель выучила шум и частности трейна вместо закономерности — на новых данных работает хуже

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

  3. #overfitting_regularization3 / 5
    Ошибка на трейне продолжает падать, на валидации — прошла минимум и растёт. Что происходит и где остановить обучение?
    A)Недообучение; учить дальше, пока валидация не догонит трейн
    B)Утечка данных; валидационная кривая не должна расти
    C)Началось переобучение; остановиться в минимуме валидационной ошибки
    D)Шум оптимизации; сгладить кривые и учить до конца
    показать ответ и разбор
    +C)Началось переобучение; остановиться в минимуме валидационной ошибки

    // разбор: Расходящиеся кривые — модель начала выучивать шум трейна: тренировочная ошибка падает, обобщение ухудшается. Точка минимума валидационной кривой — и есть ранняя остановка. На практике ждут patience итераций без улучшения и откатываются к лучшей точке, чтобы не среагировать на случайный зубец.

  4. #overfitting_regularization4 / 5
    Как работает early stopping в градиентном бустинге и по какой выборке его настраивать?
    A)После каждой итерации меряем качество на отложенной валидации; N раундов без улучшения — стоп и откат к лучшей
    B)Останавливаемся, когда лосс на трейне перестал падать
    C)Останавливаемся на фиксированной итерации, заранее подобранной по тестовой выборке — так тест приносит пользу дважды
    D)Бустинг останавливается сам, когда остатки станут нулевыми
    показать ответ и разбор
    +A)После каждой итерации меряем качество на отложенной валидации; N раундов без улучшения — стоп и откат к лучшей

    // разбор: Early stopping следит за метрикой на выборке, которой нет в обучении: плато или рост в течение early_stopping_rounds — сигнал, что новые деревья подгоняют шум. Трейн-лосс падает почти всегда и сигналом не является; тест использовать нельзя — это скрытый тюнинг по тесту.

  5. #overfitting_regularization5 / 5
    Почему добавление данных лечит переобучение, но почти не помогает при недообучении?
    A)Больше данных ускоряет сходимость оптимизатора в обоих случаях одинаково
    B)Новые данные уменьшают смещение модели, а дисперсию не трогают
    C)Помогает одинаково и там и там: чем больше обучающих данных, тем лучше обобщает модель — это универсальный закон ML
    D)Данные снижают дисперсию (шум труднее запомнить), а смещение задано самой моделью — простая останется простой
    показать ответ и разбор
    +D)Данные снижают дисперсию (шум труднее запомнить), а смещение задано самой моделью — простая останется простой

    // разбор: Переобучение — проблема дисперсии: на большем датасете шум усредняется, запомнить его труднее, разрыв train/test сужается. Недообучение — проблема смещения: линейная модель на нелинейной задаче не станет лучше от миллиона точек; там нужны признаки или более выразительная модель.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.