Привет, Хабр! На связи участник профессионального сообщества NTA Иван Попов.  В сфере бизнеса зачастую используются модели машинного обучения для прогнозирования различных показателей, однако их предсказательная сила может снижаться с течением времени. В данном посте расскажу, что такое дрейф моделей, почему важно следить за ними, и как это можно сделать с помощью библиотеки Popmon. Почему переобучение не всегда помогает? Что за библиотека Popmon? Как интерпретировать отчет? Есть ли аналоги? Заключение  Предсказательные модели могут быть хорошо обучены на качественных данных и приносить качественные прогнозы. Однако, окружающий мир постоянно меняется. Данные, собранные сегодня, могут значительно отличаться от данных, на которых проводилось обучение модели. Имеет место и обратная ситуация: данные могут оставаться те же, но понимание вывода модели может поменяться. Эти изменения могут негативно повлиять на способность модели давать точный прогноз. Такое явление в областях Data Science и предсказательного анализа называется Model Drift — дрейф модели. Можно привести в пример фрод‑мониторинг. Модель должна предсказать, является ли операция мошеннической, и выставить соответствующий флаг. С течением времени мошенники находят новые схемы, операции по которым текущей моделью уже могут не расцениваться как подозрительные. Изменения в данных операций могут привести к неадекватности прогнозов модели. Этот пример показывает явление, называемое Data Drift — дрейф данных. Другой пример: анализ качества продукта по его характеристикам. Продукт сам по себе остается неизменным, но понятие качества этого продукта может быть трактовано в будущем по‑другому. Это явление называется Concept Drift — дрейф концепта. Если данные или понимание прогнозных значений устаревают, то почему бы просто периодически не переобучать модель? Да, это можно и нужно делать, но не всегда и с осторожностью. Мы можем собрать данные и провести переобучение, но их качество является ключом к качеству самой модели. Имеют ли новые данные такое же качество, как и старые? Что, если сама модель в ее текущем виде может влиять на качество новых данных?  С течением времени для увеличения точности прогноза могут потребоваться новые параметры. Их можно добавить в старый датасет, чтобы по набору колонок он походил на датасет для полного переобучения. И тут может возникнуть такая проблема: данные этих новых параметров могут быть собраны по‑разному в зависимости от времени. В некоторых случаях подогнать эти данные под друг друга невозможно (например, если была произведена замена какого‑нибудь поврежденного сенсора). Необходимости в переобучении вообще может не быть, если понимание желаемого вывода модели не менялось. Это не значит, что модель переобучать не надо. Скорее, для этого нужно подобрать оптимальную частоту. Для решения задачи мониторинга данных в голландском банке ING была разработана библиотека Popmon для Python, название которой является сокращением от population monitoring — «наблюдение за популяцией». Данная библиотека позволяет найти отклонения по входным и выходным данным в датасетах. Также имеется возможность провести сравнительный анализ датасета на основе статистики из другого. В качестве датасета для демонстрации я буду использовать данные ежедневных замеров метеорологических сенсоров с 1961 по 1978 год: показания трех датчиков, минимальная и максимальная температура воздуха, минимальная температура травы, количество осадков и скорость ветра. Целью датасета является предсказание скорости ветра. Источник находится здесь. Popmon умеет работать с датафреймами из библиотек Pandas и PySpark. В целях демонстрации я буду использовать Pandas. Импортирую библиотеки: Далее читаю датасет: Результат: Popmon может проводить сравнительный анализ датасетов. Для дальнейшей демонстрации я разбиваю весь датасет на данные до и после 1 января 1970 года. Данные до 1970 года — это основная выборка, на которой будет обучаться потенциальная модель. Данные с 1970 — выборка Out Of Time, т. е. содержащая данные в позднем периоде от обучающей. Для формирования отчета о наличии значительных статистических выбросов в датасете нужно указать колонку с датами и период для формирования корзин (bins), внутри которых по данным будет строиться статистика.  В pm_stability_report также можно передать список колонок в параметр features. При его отсутствии отчет будет построен по всем колонкам, кроме колонки с датой. Сам отчет представляет собой HTML‑страницу с интерактивными графиками. Его можно сохранить в файл или вывести в ноутбук Python.  Если я хочу построить отчет по новому датасету на основе статистики старого, то в метод создания отчета я добавляю параметр reference: Начало страницы содержит информацию о самом отчете и выглядит вот так: Далее следует раздел Alerts: Графики показывают факт наличия статистических отклонений в колонках относительно основной массы данных.  Дальнейшие графики показывают статистику и отклонения по конкретной выбранной колонке. В самом начале каждого из этих последующих отчетов будет меню выбора колонки. При изменении выбора обновляются все графики. Для примера я покажу вывод по колонке T.MAX — максимальной температуре. Первой секцией с анализом колонок будет Histograms — гистограммы. Здесь показывается вероятность попадания значения колонок в корзины. По умолчанию будет выбран режим отображения overlay (меню выбора справа), при котором столбцы гистограммы будут налагаться друг на друга. Для более наглядного представления стоит переключиться на group. С помощью этой гистограммы можно визуально оценить, насколько данные в колонке датасета разнятся между корзинами. Чем меньше различаются величины — тем лучше. Фиолетовый столбец показывает вероятность попадания значения в текущую корзину (левое меню выбора корзины), красный — вероятность попадания в сравнительную корзину (правое меню выбора корзины), а зеленый — значение для предыдущей корзины относительно текущей. В примере ведется сравнение между 1968 (зеленый), 1969 (фиолетовый) и 1964 (красный) годами. Между 1968 и 1969 годами есть небольшой разброс в распределении, что вполне естественно. 1964 год несколько выделяется, так как у него наблюдается выброс в районе низких температур. Следующая диаграмма — Traffic Lights (светофоры): Здесь для каждой корзины показываются выбросы по различным статистическим коэффициентам по выбранной колонке. Кликнув на названиям статистик, можно перейти к соответствующей гистограмме из разделов Comparisons и Profiles, о которых будет сказано чуть ниже. В следующем разделе показаны агрегированные показатели раздела Traffic Lights: По таблице видно, что в колонке T.MAX у базовой выборки имеется достаточно статистических выбросов в 1963 и 1965 годах. Конкретные статистические метрики, по которым есть выбросы, можно посмотреть в предыдущем разделе. Далее идет раздел — Comparisons (сравнения), содержащий гистограммы с показателями статистических коэффициентов. У каждой гистограммы имеется краткое описание метрики. В нем будут два подраздела: Previous Reference – сравнение показателя по временной корзине с предыдущей. На гистограммах показывается абсолютное значение разности показателя между корзинами. На гистограмме справа (prev1 psi) видно, что произошли огромные скачки индекса популяции стабильности (PSI) в 1963 и 1965 годах. Это говорит о значительном изменении популяции наблюдений в этих корзинах. External Reference – сравнение статистики отчетного датасета с базовым. Если базовый датасет при создании отчета не был указан, то отчетный датасет сам будет считаться базовым. Как видно на правой гистограмме, в 1963 и 1965 годах имеется огромный выброс индекса популяции стабильности (PSI), что наблюдалось по прошлому разделу. Последний раздел — Profiles (профили). В нем собрана базовая статистика колонки по временным корзинам.  Желтые и красные линии на гистограммах показывают пределы значений по светофорам. По умолчанию пределы для желтого и красного светофоров составляют 4 и 7 стандартных отклонений соответственно.  По гистограмме слева (минимальные значения) можно понять, что 1963 и 1965 годы были не такими холодными. Также 1965 год был наименее жарким, что в итоге дает наименьший разброс температур среди всех корзин. Это и привело к тому, что данные в корзине выбиваются из общей статистики. Отчет Alerts по колонке T.MAX у выборки Out Of Time выглядит вот так: Видно, что красных светофоров нет, а желтых совсем немного. Это означает, что по параметру T.MAX к выборке Out Of Time претензий нет. Подобный анализ нужно проводить по каждой колонке. При наличии большого количества отклонений в выборке Out Of Time можно сделать вывод, что произошел сильный дрейф данных. В этом случае должно быть принято решение о переобучении модели. Одним из конкурентов Popmon можно назвать SweetViz. Обе библиотеки могут анализировать и сравнивать датасеты, а также предоставлять отчеты в виде HTML‑страниц. Однако, решаемые задачи у них разные. SweetViz — библиотека для разведывательного анализа данных, с помощью которой можно находить закономерности. Popmon, как было сказано выше, создана для мониторинга дрейфов моделей с помощью отслеживания статистических выбросов. Плюсом Popmon умеет работать с датафреймами PySpark. Плюсы Popmon: позволяет получить информацию о статистических выбросах в датасетах; статистическое сравнение двух датасетов; интерактивные диаграммы; умеет работать с датафреймами Pandas и PySpark. Минусы: страницы выводятся на английском языке; желательно знание смысла статистических коэффициентов для полного понимания отчетов. Итак, здесь я рассказал вам про дрейфы моделей и библиотеку Popmon, с помощью которой их можно находить. На написание этой публикации меня натолкнули мой недавний опыт аудита предсказательных моделей и недостаток русскоязычных материалов на темы дрейфа моделей и Popmon. Wikipedia GitHub Theanalyticslab.nl  Профессиональное сообщество