В идеале мы ожидаем, что наши обучающие и тестовые данные будут поступать из аналогичных дистрибутивов. Однако в некоторых реальных задачах (особенно с концепциями аномалий) может произойти обратное. Эта разница между поездом и тестовым набором известна как Сдвиг ковариации или Дрейф ковариации.

К чему может привести ковариативный сдвиг?

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

Пример из жизни: лица

Предположим, вы тренируете модель распознавания лиц с фотографиями людей в возрасте от 20 до 30 лет. Модель может работать довольно точно на тестовом наборе, состоящем из людей одного и того же возрастного интервала. А что делать человеку 45 лет? Некоторые важные черты лица сильно меняются, когда люди становятся старше, поэтому распределение исходных данных также должно измениться. Производительность модели будет ниже на новом наборе данных, состоящем из людей в возрасте от 40 до 60 лет.

Пример из жизни: распознавание речи

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

Обнаружение ковариантного сдвига

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

Что такое состязательная проверка?

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

  • Определите фиктивные метки для поезда и тестовых наборов (например, поезд:1, тест:0)
  • Обучите модель запоминать эти фиктивные метки
  • Соблюдайте метрику ROC-AUC

Показатель ROC-AUC модели должен быть около 0,5. Это показывает нам, что модель на самом деле не может различать данные обучения и тестирования. Если мы получим значительно более высокий балл, будут явные различия между тренировочными и тестовыми функциями.

Если вы используете модель машинного обучения на основе дерева, важность функций также будет хорошим индикатором в случае высокого показателя AUC. Модель, возможно, придаст большое значение вашей функции дрифта. Эти функции, скорее всего, будут удалены.

Как можно использовать состязательную проверку?

Реальный сценарий

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

Проблемы с фиксированными наборами данных (и соревнованиями)

Вы также можете использовать этот метод для повышения производительности с фиксированным набором тестов (например, соревнования Kaggle). Если вы уверены, что страдаете от ковариантного сдвига в тестовых данных, вы можете запустить состязательную проверку, но при этом сохранить ту модель, которую вы обучили! Ты можешь:

  • Выполняйте прогнозы на тренировочном наборе с помощью вашей состязательной модели проверки.
  • Отбросьте строки, которые ваша модель определила как train.

Таким образом, вы оставили только строки, которые кажутся исходящими из тестового набора в ваших обучающих данных. И теперь вы будете обучать свою модель только тем данным, которые аналогичны вашим тестовым данным. Этот метод не гарантирует, что вы получите лучшие результаты, но его определенно стоит попробовать, если вы считаете, что существует огромная ситуация со сдвигом ковариации.

Пример кода

Вы также можете увидеть мою записную книжку Kaggle для примера использования: Записная книжка